diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCIDriver.cpp b/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCIDriver.cpp index f1c704583a..d166424efa 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCIDriver.cpp +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCIDriver.cpp @@ -223,14 +223,9 @@ void CordioHCIDriver::handle_reset_sequence(uint8_t *pMsg) } break; case HCI_OPCODE_LE_WRITE_DEF_DATA_LEN: - /* send next command in sequence */ - HciReadLocalVerInfoCmd(); - break; - - case HCI_OPCODE_READ_LOCAL_VER_INFO: if (hciCoreCb.extResetSeq) { /* send first extended command */ - (*hciCoreCb.extResetSeq)(pMsg, opcode); + HciReadLocalVerInfoCmd(); } else { /* initialize extended parameters */ hciCoreCb.maxAdvDataLen = 0; @@ -242,6 +237,7 @@ void CordioHCIDriver::handle_reset_sequence(uint8_t *pMsg) } break; + case HCI_OPCODE_READ_LOCAL_VER_INFO: case HCI_OPCODE_LE_READ_MAX_ADV_DATA_LEN: case HCI_OPCODE_LE_READ_NUM_SUP_ADV_SETS: case HCI_OPCODE_LE_READ_PER_ADV_LIST_SIZE: diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCITransportDriver.h b/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCITransportDriver.h index cd980767f1..f2c9c788f1 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCITransportDriver.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO/driver/CordioHCITransportDriver.h @@ -55,7 +55,8 @@ public: * packet, ACL packet or EVT packet. Depending on the type of transport * it can prefix the packet itself. * @param len Number of bytes to transmit. - * @param pData pointer to the data to transmit. + * @param pData Pointer to the data to transmit. This is an WSF buffer + * and if CORDIO_ZERO_COPY_HCI is enabled we receive ownership. * * @return The number of bytes which have been transmited. */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO/stack_adaptation/hci_tr.c b/features/FEATURE_BLE/targets/TARGET_CORDIO/stack_adaptation/hci_tr.c index 9bdce2df1a..3e97527799 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO/stack_adaptation/hci_tr.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO/stack_adaptation/hci_tr.c @@ -68,8 +68,12 @@ void hciTrSendAclData(void *pContext, uint8_t *pData) /* transmit ACL header and data */ if (hciDrvWrite(HCI_ACL_TYPE, len, pData) == len) { - /* free buffer */ - hciCoreTxAclComplete(pContext, pData); +#if CORDIO_ZERO_COPY_HCI + /* pData is not freed as the hciDrvWrite took ownership of the WSF buffer */ +#else + /* free buffer */ + WsfMsgFree(pData); +#endif // CORDIO_ZERO_COPY_HCI } } @@ -80,7 +84,7 @@ void hciTrSendAclData(void *pContext, uint8_t *pData) * * \brief Send a complete HCI command to the transport. * - * \param pData WSF msg buffer containing an HCI command. + * \param pData WSF msg buffer containing an HCI command. WSF buffer ownership is released by this function. * * \return None. */ @@ -98,8 +102,12 @@ void hciTrSendCmd(uint8_t *pData) /* transmit ACL header and data */ if (hciDrvWrite(HCI_CMD_TYPE, len, pData) == len) { - /* free buffer */ - WsfMsgFree(pData); +#if CORDIO_ZERO_COPY_HCI + /* pData is not freed as the hciDrvWrite took ownership of the WSF buffer */ +#else + /* free buffer */ + WsfMsgFree(pData); +#endif // CORDIO_ZERO_COPY_HCI } } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/mbed_lib.json b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/mbed_lib.json new file mode 100644 index 0000000000..170246d299 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/mbed_lib.json @@ -0,0 +1,55 @@ +{ + "name": "cordio-ll", + "config": { + "max-advertising-sets": { + "help": "Maximum number of advertising sets.", + "value": 4 + }, + "max-advertising-reports": { + "help": "Maximum number of pending legacy or extended advertising reports.", + "value": 8 + }, + "default-extended-advertising-fragmentation-size": { + "help": "Default extended advertising data fragmentation size.", + "value": 64 + }, + "max-scan-request-events": { + "help": "Maximum scan request received events.", + "value": 4 + }, + "phy-2m-support": { + "help": "2M PHY supported.", + "value": 1 + }, + "rx-buffers": { + "help": "Default number of receive buffers.", + "value": 8 + }, + "phy-coded-support": { + "help": "Coded PHY supported.", + "value": 0 + }, + "extended-advertising-size": { + "help": "Maximum extended advertising data (and scan data response) size", + "value": 128 + }, + "max-acl-size": { + "help": "Maximum ACL buffer size", + "value": 256 + }, + "tx-buffers": { + "help": "Default number of send buffers", + "value": 8 + }, + "handle-vendor-specific-hci-commands": { + "help": "Handle VS HCI commands. Valid values are 0 (ignore) and 1 (handle).", + "value": 0, + "macro_name": "LHCI_ENABLE_VS" + }, + "uart-hci": { + "help": "Does the board have a UART HCI. Valid values are 0 and 1 (must provide UART through PAL).", + "value": 0, + "macro_name": "CHCI_TR_UART" + } + } +} \ No newline at end of file diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/cordio_link_readme.md b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/cordio_link_readme.md new file mode 100644 index 0000000000..bec6dfc4f7 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/cordio_link_readme.md @@ -0,0 +1,543 @@ +Cordio Link Release Notes +========================= + +Legal +----- + +Copyright (c) 2013-2019 Arm Ltd. All Rights Reserved. +Arm Ltd. confidential and proprietary. + +Compliance +---------- + +This release complies with the Bluetooth Core.TCRL.2018-2 definitions using the following test +specification versions: + + * LL.TS.5.1.0, Link Layer (LL) Bluetooth Test Specification + * HCI.TS.5.1.0, Host Controller Interface (HCI) Bluetooth Test Specification + +Compliance is verified with the Ellisys EBQ compliance tester using the following version: + + * EBQ 2017-2.6969 + Note : The following test cases will fail because of tester issue : Sync packet offset calculation is wrong in LL_PERIODIC_SYNC_IND PDU when offset_adjust field is 1. + LL/CON/MAS/BV-99-C, LL/CON/MAS/BV-100-C, LL/CON/MAS/BV-101-C, LL/CON/SLA/BV-103-C, LL/CON/SLA/BV-104-C, LL/CON/SLA/BV-105-C + +Compliance is verified with the Harmony compliance tester using the following version: + + * 19.1.16916.18388 + + +Changes +------- + +The following changes were made in r19.02 + +Enhancements in this release: + + WBUSW-2402 MEP16 Allow ADI field to be optional in the AUX_SCAN_RSP + WBUSW-2938 Enable ADI field by default in the AUX_SCAN_RSP after Madrid spec is adopted + WBUSW-3108 Update HCI definition and LL definition to conform Madrid spec + WBUSW-3139 CIS master needs to send additional ack if there is still subevent + WBUSW-3144 PAST implementation update for Madrid version r15 + WBUSW-3193 Add support of adjusting CIS offset in the LL_CIS_RSP on the CIS slave + WBUSW-3195 Add support of multiple CIS streams phase I + WBUSW-3203 Add op flag for CIS master to skip sending additional NULL PDU + WBUSW-3208 LE Extended Advertising Enable returns incorrect status when no scan response data provided + WBUSW-3227 MEP9 HCI support for debug keys in LE Secure Connections + WBUSW-3228 Add Opflag to optionally include/exclude advertising address in AUX_ADV_IND PDU + WBUSW-3229 Add opflag to include/exclude the ADI field in AUX_SCAN_RSP + WBUSW-3242 Add test command LE Modify Sleep Clock Accuracy command + WBUSW-3256 Add support of multiple CIS stream phases II + WBUSW-3258 Add test command to change the advertising address in AUX_CONNECT_RSP + WBUSW-3261 Update window widening calculation algorithm + WBUSW-3268 Add support of verifying connection parameter update on the slave when the instance is the current connection event + WBUSW-3279 Add check for HCI_LE_Periodic_Adv_Enable + WBUSW-3281 Add check for HCI_LE_Extended_Create_Connection + WBUSW-3292 Add support of multiple CIS streams phase III + WBUSW-3324 Update LL_CIS_EST_EVT to spec version 18a + WBUSW-3327 Update HCI_SET_CIG_PARAMETER to spec version 18a + WBUSW-3331 Update LL_CIS_REQ PDU to spec version 18a + WBUSW-3333 Add support of checking if random address is initialized for some HCI command + WBUSW-3348 Add interleaved packing scheme for multiple CISs + +Resolved defects in this release: + + WBUSW-2981 Connection fails to be established with coded phy when connection interval is smaller than 30ms + WBUSW-3080 HCI_LE_Periodic_Advertising_Sync_Established event has wrong info in it + WBUSW-3103 LL_PERIODIC_SYNC_IND PDU has wrong info in it + WBUSW-3119 One variable size definition is incorrect + WBUSW-3120 CIS slave sometime transmits at the incorrect timing + WBUSW-3141 ACL sometimes gets lost when CIS is present + WBUSW-3142 CIS crashes sometimes when doing uni-directional data transfer + WBUSW-3154 Flush scheme sometimes doesn't work correctly on the slave when RX timeout happens + WBUSW-3167 Advertiser cannot handle connection indication with connection interval of 0 + WBUSW-3177 Return incorrect error code when creating connection with invalid interval + WBUSW-3199 Sometime CIS bod is incorrectly terminated twice on master or slave + WBUSW-3206 Sometimes there is memory leak for the CIS master Rx operation + WBUSW-3213 HCI_LE_Periodic_Advertising_Sync_Transfer_Received event is sent too early + WBUSW-3216 CIS link drops when CIS bod can't be executed in time + WBUSW-3218 Wrong address type in the LL_PERIODIC_SYNC_IND PDU when address is RPA + WBUSW-3219 Local RPA sometimes is incorrect for the enhanced connection complete event + WBUSW-3222 ADV_SCAN_IND is not using RPA for advertising address when local IRK is provided + WBUSW-3235 Failed to create sync with RPA address + WBUSW-3260 Not enough memory for PCA10040 with large periodic advertising data size + WBUSW-3262 High duty cycle connectable directed advertising shall use fixed sequential channels for primary advertising operation + WBUSW-3280 Wrong address type in LE_PER_ADV_SYNC_TRANS_REC_EVT when RPA address is used + WBUSW-3291 Seeing unexpected periodic advertising sync lost event + WBUSW-3295 HCI_Reset is not completed when periodic sync transfer is pending + WBUSW-3304 Incomplete Periodic Advertising Report event is received + WBUSW-3306 Assertion error when dynamically update extended advertising data + WBUSW-3307 Tx PDU sometimes is not cleaned up correctly after it is being flushed on CIS slave + WBUSW-3314 Failed to disable advertising for multiple advertising sets + WBUSW-3338 Flush scheme doesn't work for the second CIS in sequential packing scheme with multiple CIS. + WBUSW-3363 Buffer is not freed correctly sometimes when restarting advertising + WBUSW-3369 Command complete event for scan disable is received too late in some cases + WBUSW-3376 IUT receives incorrect status for LE_Periodic_Advertising_Sync_Transfer_Received event + WBUSW-3418 Connection update with invalid handle returns incorrect status + WBUSW-3420 HCI_LE_Set_PHY with invalid handle returns invalid status + WBUSW-3423 HCI LE Set Data Length with invalid handle returns incorrect status + WBUSW-3451 CIS slave sometimes fails to receive + WBUSW-3479 There is unused value in the code + WBUSW-3505 Intermittent periodic sync lost when PAST transfer happens back to back + WBUSW-3511 Scheduling conflict between AUX ADV and periodic ADV is not handled correctly + +Known limitations in this release: + + WBUSW-3183 Scanner fails to receive scan request intermittently when scan interval and scan window are same + WBUSW-3367 Primary scan fails to receive ADV packets intermittently when 6 periodic scan is ongoing with maximum periodic data size + +Incomplete features in this release: + + None + + +Change History +-------------- + +Changes in r18.11 + + WBUSW-2025 Madrid - Periodic Advertising Sync Transfer + WBUSW-2026 Madrid - Control Length Extension + WBUSW-2401 [MFE] MEP12 Add sleep clock accuracy update machanism + WBUSW-2816 Add functionality to pack ACAD field for TX + WBUSW-2817 Add functionality to parse ACAD field for rx + WBUSW-2818 Add ACAD structure for channel map + WBUSW-2835 Reservation manager enhancement to support common interval + WBUSW-2907 Optimize ACAD skip + WBUSW-2925 Add new test command to set trigger tx mode and invalid CRC init at the same time + WBUSW-2927 [MFE] MEP21 Host channel classification for secondary advertising + WBUSW-2983 Modify BbTesterSetInvalidAccessAddress() to support changes in TSE 10530 + WBUSW-3044 Need to add timeout event for CIS LLCP procedure + WBUSW-3054 Update HCI_SET_CIG_PARAM command + WBUSW-3081 Add support of encryption for CIS + WBUSW-3082 Add support of MIC failure in the CIS state machine + WBUSW-3095 PAST commands are updated to swap connection handle and sync handle + WBUSW-3108 Update HCI def and LL def to Madrid spec + WBUSW-2339 [ESR11] Avoid adding duplicate address to the white list + WBUSW-2429 Active extended scanning sometimes delivers incorrect advertising report + WBUSW-2756 Failed to establish connection with the second device in multi-connection role + WBUSW-2796 IUT supporting symmetric PHY responds with incorret error code when UT sends HCI LE SET PHY with asymmetric parameters + WBUSW-2806 Incorrect error code for LE set extended advertising enable command when scannable adv pdu is set + WBUSW-2821 Controller sometimes crashes when enabling periodic advertising + WBUSW-2838 AUX_CHAIN_IND incorrectly includes ADI field if corresponding field in PDU pointed to this PDU is not present + WBUSW-2839 Advertising DID is not updated correctly whenever host provides new scan response data + WBUSW-2863 AUX_ADV_IND doesn't get updated when there is a change for the advertising data + WBUSW-2866 TesterSetTxAuxReqPdu() command is not implemented in the LL + WBUSW-2882 Controller fails to execute connection BOD when connection BOD collides with advertising BOD + WBUSW-2887 No data observed in ae directed or undirected connectable advertisements + WBUSW-2918 Extended advertiser sometimes doesn't include advertising data in the connectable advertising packet + WBUSW-2921 Aborting slave latency doesn't work when ACL data arrives at channel map update instance + WBUSW-2922 Periodic scanner incorrectly updates the anchor point when receiving a packet with CRC error + WBUSW-2926 Reservation manager returns wrong offset when BB_CLK_RATE_HZ is not 1M + WBUSW-3056 LE Set Periodic Adv Sync Transfer Param command returns incorrect status when wrong connection handle is provided + WBUSW-3060 HCI_Periodic_Adv_Terminate_Sync command does not return error when sync handle is invalid + WBUSW-3065 LE_PER_ADV_SYNC_TRANS_REC_EVT sometimes is not received in time + WBUSW-3079 Periodic interval is not correct in periodic advertising sync transfer received event + WBUSW-3085 Incorrect bits received in the channel selection algorithm event + WBUSW-3094 Sometimes the TX power for the extended advertising is too low + WBUSW-3105 Compiler warning when feature bit are more than 32 bits + WBUSW-3106 Tx power on the secondary channel for the 2018 nordic board is too low + WBUSW-3116 Corrupted Advertising reports are received when payload > 251 + WBUSW-3147 With 2M, AUX_SCAN_RSP has wrong auxPtr value + WBUSW-3149 ADI field is sometimes 0 after setting periodic advertising data + WBUSW-3155 Failed to create connection with some connection interval when ACL connection is on coded PHY + WBUSW-3171 Incorrect assertion in scheduler when there is no hardware timer + WBUSW-3175 Slave sometimes fails to remove the advertising BOD + WBUSW-3180 Sometimes there is assertion error after cancelling the ACL connection establishment procedure + +Changes in r2p4-00rel0. + + WBUSW-2340 [ESR11] LL needs to return with error code of unsupported features if the txPhys or rxPhys in the set default PHY and set PHY + WBUSW-2341 [ESR11] LL needs to return unsupported features error code if the phys in the set extended adv parameter are not supported + WBUSW-2343 [ESR11] Scan response data length range + WBUSW-2344 [ESR11] Shall not allow removing adv set or clear adv sets when periodic advertising is enabled + WBUSW-2345 [ESR11] Filter_Duplicates when Duration is zero + WBUSW-2346 [ESR11] Return error code when there is no more resource to create periodic sync + WBUSW-2347 [ESR11] Some extended PDU shall not include Tx power level + WBUSW-2348 [ESR11] LL shall reject the control PDU with incorrect length with LL_UNKNOWN_RSP + WBUSW-2394 [ESR11] LL is recommended to change advertising DID when periodic advertising is enabled on a advertising set + WBUSW-2395 [ESR11] Periodic scanner shall terminate create sync procedure if the periodic event is not received within the first 6 periodic interval + WBUSW-2396 [ESR11] Add LL_FEAT_MIN_NUM_USED_CHAN to LCTR_FEAT_PEER_MASK + WBUSW-2476 [ESR11] LE Set Random Address, not allowed when advertising or scanning is enabled + WBUSW-2494 Advertising scheduling enhancement + WBUSW-2507 Scan BOD scheduling enhancement + WBUSW-2634 Add OpFlag to disable slave latency wakeup upon data pending. + WBUSW-2696 Core paring update - Validate the public key in LL + WBUSW-2732 Added runtime config to ignore timestamp with CRC-error packet + WBUSW-2223 HCI resets doesn't complete sometimes + WBUSW-2376 Connection complete event is missing when reservation manager is full + WBUSW-2383 Adjusted min duration for the scan operation to support simultaneous scanning for multiple phy + WBUSW-2413 Connection Interval is not a multiple of preferred periodicity + WBUSW-2414 [UPF59] Channel selection bit is not set to reserved in the aux_conn_req + WBUSW-2415 [UPF59] The scanA in the aux_scan_req is not the same as the targetA in the extended advertising packet + WBUSW-2418 [UPF59] Slave is not handling the extended reject indication after connection parameter response is sent. + WBUSW-2419 Slave abort slave latency incorrectly between the last CE with old connection parameter and the first instant with the connection parameter + WBUSW-2431 Disconnection happens when advertising event conflicts with connection event. + WBUSW-2435 Connection drops when ADV BOD runs over connection bod + WBUSW-2448 Channel selection method is not correct in the LL_CONNECT_IND when extended API is used + WBUSW-2449 Rx window opens too late for coded packets + WBUSW-2454 Delay in receiving HCI_ADV_REPORT_EVENT for multiple adv sets. + WBUSW-2460 Each extended advertising command is not returning "Command Disallowed" with no scan response data. + WBUSW-2461 Initiating LL_CONN_PARAM_REQ - Unsupported Without Feature exchange + WBUSW-2462 Initiate LL_CONN_PARAM_REQ when the feature is not supported + WBUSW-2480 Periodic scanner uses incorrect filter policy + WBUSW-2481 Incorrect values in HCI_LE_Data_Length_Change event + WBUSW-2496 Sync established event with status ERR_OP_CANCELLED_BY_HOST is not received when sync is cancelled + WBUSW-2512 HCI_LE_Set_PHY return status depends on connection established state + WBUSW-2517 Sending LL_AUX_CHAIN_IND earlier than the time indicated by the aux pointer offset + WBUSW-2522 order of receiving adv report event (with bit 1 and 2) and adv report event (with bit 3) is incorrect + WBUSW-2533 Scan on multiple PHYs sometimes is not working + WBUSW-2537 Cannot start three advertising sets with interval of 20ms. + WBUSW-2546 Periodic Interval calculation is not correct. + WBUSW-2547 [qual] Incorrect error code for invalid set phy command. + WBUSW-2556 Periodic advertising interval is calculated incorrectly when min_int equals max_int. + WBUSW-2629 Periodic scan minimum duration is too long. + WBUSW-2636 Missing ADV_EXT_IND packets when advertising interval is small (Ex. 20 ms) + WBUSW-2643 No data transmit when slave latency is applied during channel map update procedure + WBUSW-2700 Extended advertising state is incorrect when restarts + WBUSW-2705 Connectable extended adv is sending the truncated data. + WBUSW-2707 Assertion failures when simultaneous connection and scanning state + WBUSW-2711 Missing sync established event for the third periodic advertising set. + WBUSW-2718 Slave sometimes allows connection from the device with un-resolvable RPA. + WBUSW-2721 Coverity issues + WBUSW-2741 Sometimes extended scan on multiple PHY does not work + WBUSW-2756 Failed to establish connection with the second device in multi-connection role + WBUSW-2779 Sometimes miss advertising report events for multi-set and mixed role + +Changes in r2p3-03rel0. + + WBUSW-1820 LL frees the connect context incorrectly + WBUSW-2113 [EBQ] ADV Data ID should be different from the previous round + WBUSW-2126 Adjust scheduling priority for Periodic Advertising and Scanning + WBUSW-2128 Aux scan operation uses incorrect minimum and maximum scan duration + WBUSW-2185 [EBQ] Symmetric phys are not set correctly OTA + WBUSW-2199 Extended ADV report sometimes contains more than 1650 + WBUSW-2216 [feat] Address is not refreshed when advertising with non-connectable events using RPA + WBUSW-2232 LLCP with instance should honor slave latency + WBUSW-2262 Wrong LE extended advertising report when RX error happens with AUX_CHAIN_IND + WBUSW-2283 llValidatePhyPreferences parameter size incorrect + WBUSW-2284 [EBQ] IUT should respond with Command Disallowed to an LE Set Random Address command when advertising or scanning is enabled + WBUSW-2287 Return incorrect status for the extended adv set termination event when extended API is used for the legacy high duty cycle connectable adv + WBUSW-2298 Multi-slave connection case, BOD due time is wrong when rescheduled because of conflict + WBUSW-2299 Slave doesn't wake up to Rx when slave latency is used and event counter wraps around + WBUSW-2311 AccessAddress should be unique in each connection for different device. + WBUSW-2316 [Qual] AdvA in AUX_ADV_IND on coded phy should be reserved with event type 0x0000 + WBUSW-2318 [Qual] "Unused" parameter is incorrect from LE Periodic Advertising Report Event + WBUSW-2333 doxigen fixes for LL + WBUSW-2362 Check extended adv data length shall be done when extended adv is enabled + WBUSW-2367 Add support of extended scan on mulitple PHYs at the same time. + WBUSW-2370 Change the ceJitterDelay from 32us to 0us + WBUSW-2374 [FEAT] Connection dropped while connection update with multiple testers + WBUSW-2377 Add maximum connection event deviation to the calculation of CE window widening + WBUSW-2383 Adjust min duration for the scan operation to improve schedule for simultaneous operation at the same time. + WBUSW-2389 Change LL_MAX_PER_SCAN from 4 to 6 to pass qualification test + +Changes in r2p3-02eac0. + + WBUSW-1626 Reading Tx power levels should return actual power used + WBUSW-1709 AUX Offset field in AuxPtr sometimes violates MAFS (300-us) + WBUSW-1932 LE_EXT_ADV_REPORT_EVT event sometimes contains extra AdvData + WBUSW-1933 Establish connection may fail with status CONN_FAILED_TO_ESTABLISH (0x3e) + WBUSW-2019 LE_[Read|Write]_RF_Path_Compensation commands should use transceiver as reference + WBUSW-2035 Missing LE Advertising Set Terminated Event when AdvSet duration expires + WBUSW-2046 Fail to establish connection when PHY Options are different between two devices + WBUSW-2050 [EBQ] No LL_FEATURE_RSP when established connection as master with slave latency 5 + WBUSW-2098 [EBQ] Disconnection Complete Event is received before supervision timeout + WBUSW-2127 Large gaps while scanning reduces opportunities to receive advertising packets + WBUSW-2140 Data Length Exchange should limit MaxRxTime and MaxTxTime with unsupported LE Coded PHY peers + WBUSW-2143 UPF58 vendor compatibility fixes + WBUSW-2147 Incorrect padding when aligning uint64_t on 8-byte boundary + WBUSW-2172 Fix the inaccuracy of the fast divisions + WBUSW-2173 Fixed unit test errors + WBUSW-2174 Use the fast division function when calculating the aux pointer offset + WBUSW-2175 Coded operation cannot sustain + WBUSW-2179 Fix ADV_BV_30 and ADV_BV_31 + WBUSW-2181 Prevent multiplication overflow issue. + WBUSW-2186 Window Widening too small when there is unsync'ed time before a connection update + WBUSW-2197 Double TX done IRQ from PPL + WBUSW-2198 IUT as initiator should connect to devices using RPA when the address is resolvable + WBUSW-2202 Collision resolution sometimes fails with simultaneous PHY updates + WBUSW-2248 [nRF52] maxAdvReports adjusted based on RAM availability + +Changes in r2p3-01eac0. + + WBUSW-1289 Pended host connection or PHY update receives no update completion if parameters unchanged + WBUSW-1421 Slave may not complete HCI_LE_Connection_Update + WBUSW-1534 AdvData length limited to 31 bytes for Extended Connectable Advertising + WBUSW-1751 HCI_LE_Extended_Create_Connection with Coded PHY fails to establish with small CI + WBUSW-1937 Scanner sometimes sends incorrect LE_Extended_Advertising_Report + WBUSW-1953 Extended create connection sometimes connect to the incorrect peer device + WBUSW-1955 Scanner ignores SCAN_RSP/AUX_SCAN_RSP when the AdvA does not match SCAN_REQ/AUX_SCAN_REQ + WBUSW-1967 Extended scanner fails to filter anonymous advertising + WBUSW-1970 PDU filtering enables local address resolution when local address is public + WBUSW-1972 Scanner ignores SCAN_RSP and AUX_SCAN_RSP when the AdvA does not match SCAN_REQ/AUX_SCAN_REQ + WBUSW-1996 Incorrect Peer_Address when High Duty Cycle Directed Advertising times out + WBUSW-2041 TesterSendConnUpdInd command does not set ConnInterval + WBUSW-2053 MediaTek interoperability with Connection Parameter Update Procedure + WBUSW-2089 Incorrect timing for AUX_CHAIN_IND packet with Coded PHY + WBUSW-2096 Extended advertiser sends incorrect AuxPtrOffset in AUX_SCAN_RSP + WBUSW-2112 [EBQ] Should not send Command Disallowed when disabling an advertising set which is already disabled + WBUSW-2125 Incorrect initialization of Channel Selection 1 with master role only + +Changes in r2p3-00eac0. + + WBUSW-456 Slave with latency should transmit queued data in next CE + WBUSW-1717 LE_Extended_Advertising_Report may not send complete periodic reports + WBUSW-1762 Disconnect_Complete with reason connection timeout while updating PHY + WBUSW-1835 LE_Enhanced_Connection_Complete may incorrectly report Peer_Address as 0 + WBUSW-1841 Periodic advertising report should send in task context + WBUSW-1850 Periodic advertising sometimes starts long time later + WBUSW-1854 Extended Advertising Set sometimes not terminated with Coded PHY + WBUSW-1856 Scanner cannot receive anonymous non-connectable non-scannable adv packet with auxiliary packet + +Changes in r2p2-00bet0. + + WBUSW-1283 Extended advertising and scanning resolves private addresses + WBUSW-1489 BLE5 - Synchronized scanning + WBUSW-1591 Improve device interoperability with LENGTH_REQ startup collisions + WBUSW-1602 Do not send extended advertising reports in ISR + WBUSW-1641 Coordinate Periodic Advertising operations with Reservation Manager + WBUSW-1662 LE_Extended_Advertising_Report reassembles data fragments + WBUSW-1663 SCH_CHECK_LIST_INTEGRITY option for all scheduler insertions + WBUSW-1677 Reduce execution time of LctrRxAcl() + WBUSW-1678 Cannot update the DID when advertising + WBUSW-1682 Architecture-based folder organization + WBUSW-1685 LE_Set_PHY while length procedure in progress may not complete + WBUSW-1695 Add support of simultaneous scan and initiate using the extended API + WBUSW-1724 UPF57 vendor compatibility fixes + WBUSW-1750 Optimize calculation of advertising operation duration + WBUSW-1754 Allow handling the chain packet if scan is not disabled + WBUSW-1773 Cross-Protocol project interface for all platform components + WBUSW-1792 Controller projects uses maximum AdvData size of 1650 + WBUSW-1844 Dedicated extended and periodic advertising data + WBUSW-1329 LE_Read_Tx_Power handled in AE slave command handler + WBUSW-1407 LLCP procedure does not reject already pended or active procedures + WBUSW-1511 HCI_Reset timeouts in extended scanning state + WBUSW-1532 Extended ADVB PDUs use incorrect RxAdd + WBUSW-1537 HCI_Reset sometimes does not respond with command completion after disconnect + WBUSW-1545 Extended advertising should allow legacy high duty cycle connectable direct advertising + WBUSW-1567 LE_Extended_Advertising_Report sometimes sends duplicate events when filter is enabled + WBUSW-1577 WSF_MIN() / WSF_MAX() multiple evaluation + WBUSW-1599 HCI_Reset timeouts in extended initiating state + WBUSW-1600 An unknown private device should not be filtered + WBUSW-1601 LL should not modify Suggested Default Data Length value + WBUSW-1623 BB should not specify an invalid BbBleDrvTxBufDesc_t::pBuf + WBUSW-1629 bbGetTxData() use in example code may corrupt memory + WBUSW-1630 LE_Extended_Advertising_Report truncate AdvData with 2M_PHY + WBUSW-1631 AuxPtr::offset contains invalid value in first EXT_ADV_IND packet + WBUSW-1634 Invalid BB state when BB driver calls callback with failure + WBUSW-1638 HCI_LE_Extended_Create_Connection should allow initiating with 2M PHY + WBUSW-1640 LE_Extended_Advertising_Report sometimes corrupted when receiving AUX_CHAIN_IND + WBUSW-1645 HCI_LE_Extended_Create_Connection cannot establish connection with large Auxiliary Frame Spacing + WBUSW-1649 Failed HCI_LE_Set_Random_Address should not modify state + WBUSW-1650 HCI_LE_Extended_Create_Connection should be rejected if already in progress + WBUSW-1657 Extended advertiser sometimes allows connections with non-matching AdvA + WBUSW-1659 Address resolution sometimes fails to resolve + WBUSW-1660 Extended connection sometimes established with wrong PHY + WBUSW-1661 Master uses incorrect fast termination timeout with Extended Create Connection + WBUSW-1664 Paring fails with legacy advertisers using directed advertising + WBUSW-1665 Initialization sequence should initialize handlers before using them + WBUSW-1666 Extended scanner does not update parameters when already in progress + WBUSW-1668 HCI_LE_Set_Extended_Advertising_Parameters returns incorrect error code when memory is exceeded + WBUSW-1672 LE_Extended_Advertising_Report may use incorrect Data_Length + WBUSW-1687 HCI_LE_Set_Extended_Scan_Enable sometimes does not complete + WBUSW-1688 Some LLCP collision cases fail to complete + WBUSW-1689 LE_Set_Extended_Advertising_Enable does not adhere to duration limits for high duty cycle directed advertising + WBUSW-1711 LE_Extended_Advertising_Report may use incorrect values in truncated report + WBUSW-1716 Maximum data PDU length doesn't support 251 bytes in Coded PHY + WBUSW-1729 HCI_Reset fails after LE_Extended_Create_Connection command is canceled + WBUSW-1740 Periodic scanner sometimes loses sync with the periodic advertiser + WBUSW-1745 Improve diversity with auxiliary channel selection + WBUSW-1747 HCI_LE_Set_Extended_Advertising_Parameters uses incorrect error code with invalid Primary_Advertising_Interval + WBUSW-1753 Coded PHY connections may disconnect + WBUSW-1766 Failed to enable extended advertising on multiple sets + WBUSW-1774 Connection may not establish due to PDU filtering + WBUSW-1802 Extended advertiser sometimes incorrectly filters AUX_SCAN_REQ + WBUSW-1803 LT does not modify AUX_CONN_REQ + WBUSW-1805 Extended initiator cannot establish with Coded PHY + WBUSW-1810 Periodic scanner may lose sync with the periodic advertiser + +Changes in r2p1-00eac0. + + WBUSW-840 Simultaneous initiate and scan state + WBUSW-1077 Validate static random address from host + WBUSW-1135 Extended scanning on multiple PHYs + WBUSW-1391 Improve compatibility when peer incorrectly responds to unknown packets during encryption procedure + WBUSW-1408 Separate auto-start feature exchange Op Mode flag + WBUSW-1422 Improve interoperability with masters that send initial LLCP + WBUSW-1432 [nRF52] Driver supports BB_PHY_BLE_CODED PHY type + WBUSW-1433 [nRF5x] Update platform to nRF5 SDK revision 13.0.0 alpha + WBUSW-1447 Add extended advertising statistics + WBUSW-1488 BLE5 - Periodic Advertising + WBUSW-1490 BLE5 - Stable modulation index + WBUSW-1519 Compute packet duration for all extended BOD operations + WBUSW-1541 Allow ADV_DIRECT_IND high duty cycle with extended advertising API + WBUSW-1558 UPF56 vendor compatibility fixes + WBUSW-1561 Use runtime configuration to configure PHY features + WBUSW-1562 Improve interoperability by defaulting length extension to minimum + WBUSW-733 Enabling scan while scan enabled does not change filter duplicates + WBUSW-1180 Feature exchange only valid controller to controller bits + WBUSW-1366 [nRF52] RF Compensation does not dynamically adjust + WBUSW-1387 [nRF5x] BbBleRfGetSupTxPower() should report power referenced at the antenna + WBUSW-1405 Minimum advertising interval is BT version dependent + WBUSW-1409 Connection sometimes fails with 32KHz BB clock + WBUSW-1416 LT cannot start auxiliary channel exactly at MAFS + WBUSW-1445 Reset may not complete after HCI_Clear_Advertising_Sets + WBUSW-1485 Failed to receive the CONNECT_IND with the random address and extended advertising + WBUSW-1495 IUT in extended legacy advertising mode does not respond to SCAN_REQ + WBUSW-1502 LE_Enhanced_Connection_Complete event may contain incorrect peer address + WBUSW-1508 [nRF52] Long range operation is sometimes unstable + WBUSW-1509 Extended advertiser does not report legacy SCAN_REQ with Scan_Request_Notification_Enable + WBUSW-1517 Remove lhciPackEvtHdr() redundant definition + WBUSW-1518 Path compensation API organized with device management + WBUSW-1538 Master may fail to establish connection with short connInterval + WBUSW-1543 Fail to locate the correct resolving list entry when local IRK is the same for the entries + WBUSW-1560 Example LL initialization does not set extended feature bits + WBUSW-1563 Incorrect Adv filtering when AdvA is not resolved and white list filtering is enabled + WBUSW-1564 Connection sometimes fails if CONNECT_IND does not match ADV_DIRECT_IND's InitA + WBUSW-1582 RF Path Compensation example code incorrectly stores values + WBUSW-1585 AUX Offset is incorrect between AUX_SCAN_RSP and AUX_CHAIN_IND in 2M and Coded PHY + WBUSW-1587 Incorrect TxWindowDelay with 2M or Coded PHY + WBUSW-1628 Extended advertiser sometimes does not respond to SCAN_REQ + +Changes in r2p0-10eac0. + + WBUSW-438 BLE5 - LE Coded PHY + WBUSW-841 Simultaneous initiate and connectable advertising + WBUSW-1057 BLE5 - Minimum Used Channels + WBUSW-1058 BLE5 - LE Privacy 1.2.1 + WBUSW-1103 BLE5 - White list anonymous advertisers + WBUSW-1128 BLE5 - Extended Scanning + WBUSW-1130 BLE5 - RF Path Compensation + WBUSW-1147 Extended Advertising should limit maximum interval + WBUSW-1148 Centralized reset logic + WBUSW-1150 BLE5 - Read Transmit Power + WBUSW-1187 Core IOP fixes - San Diego + WBUSW-1196 Add BSP_DIR command line override option for Nordic platform builds + WBUSW-1197 Allow Makefile command line override BAUD value for Nordic platform + WBUSW-1199 Consistent logic for validating connection parameters + WBUSW-1238 Extended advertising LT VS commands + WBUSW-1273 Add maximum request length to pool statistics + WBUSW-1292 Set local default maxTx to be the largest (251) + WBUSW-1312 BLE5 - LE Extended Create Connection + WBUSW-1323 BLE5 - Shanghai r10 HCI commands and events + WBUSW-1324 Return error if random address required but not initialized + WBUSW-1351 Nordic PCA10040 LEDs displays Tx PHY state + WBUSW-1385 LL_OP_MODE_FLAG_ENA_LLCP_STARTUP includes slave initiated feature request + WBUSW-1392 Do not allow mixed use of legacy and extended advertising, scan or initiate commands + WBUSW-790 Distinguish pseudo random from crytographic random generation + WBUSW-867 [ll-tester] does not adjust TIFS down to +/-0.5us + WBUSW-962 Initiator with white list connects to other RPAs + WBUSW-975 Scheduler should not allow overlapped BODs + WBUSW-998 Indicate completed packets only for active connections + WBUSW-1040 Validate parameters in the LL_CHANNEL_MAP_IND + WBUSW-1044 Valid parameter for the connection update indication + WBUSW-1117 Improve collision resolution between different LLCP + WBUSW-1185 Disconnect when receiving unknown or invalid PDU during encryption start procedure + WBUSW-1194 Resolve peer addresses without specifying own identity address + WBUSW-1250 Disallow supervision timeout exactly twice connection interval + WBUSW-1261 Version exchange procedure collision with procedure with instant + WBUSW-1276 Initiator's RPA does not change after expected time. + WBUSW-1286 UPF55 vendor compatibility fixes + WBUSW-1290 Advertising data corrupted with undirected advertisement and peer IRK + WBUSW-1303 LL will connect to peer identity address even with peer IRK + WBUSW-1305 LL requires peer match even for undirected advertising + WBUSW-1335 Resolve peer addresses even if peer is not in resolving list + WBUSW-1336 Initiator will not respond to the previous local RPA associated with a peer + WBUSW-1340 Resolve local address without transmitting local RPAs + WBUSW-1342 Nordic BB receives with Access Address bit errors + WBUSW-1394 [nRF52] VS_GET_SYS_STATS does not report CS watermark + +Changes in r2p0-00bet0. + + WBUSW-431 BLE5 - 2Mbps LE PHY + WBUSW-432 BLE5 - Extended Advertising (see note in Limitations) + WBUSW-507 Remove lctrMaxConsCrc variable (use constant LCTR_MAX_CONS_CRC) + WBUSW-754 BLE5 - LE Channel Selection #2 + WBUSW-822 Broadcaster build should not require connection sources + WBUSW-915 LL should reject PDUs with invalid length + WBUSW-1005 Improve the diversity of Access Address + WBUSW-1009 Missing and incorrect documentation parameters + WBUSW-1011 Obsolete ISR scheduler execution + WBUSW-1013 Remove duplicate symbols between hci_defs.h and lhci_int.h + WBUSW-1021 HCI reset should not reset scheduler + WBUSW-1037 LL shall mask out the feature bits that should not be sent over the air + WBUSW-1038 Align tester advertising PDU buffers + WBUSW-1055 Avoid double decoding of PDUs + WBUSW-1056 BLE5 - High Duty Cycle Non-Connectable Advertising + WBUSW-1073 Move LL PDU defines to ll_defs.h + WBUSW-1081 [ESR10] #6672 rename some PDUs + WBUSW-1106 Suppress length exchange at startup with operation mode + WBUSW-1125 Unaligned scan response buffer + WBUSW-1127 Clear LL Tester transmit packet trigger on HCI reset + WBUSW-1134 Advertising not terminated immediately with CONNECT_IND + WBUSW-1149 Legacy and extended advertising commands are mutually exclusive + WBUSW-1159 Legacy advertising does not allow dynamic data updates + WBUSW-1188 Length excluded from advertising packet length calculation + WBUSW-736 LHCI transport for multi-protocol operation + WBUSW-959 Multi-protocol BB initialization + WBUSW-965 Relocate BLE-specific scheduler functionality + WBUSW-1006 Controller sources reorganization + WBUSW-1060 Remove the redundant local feature flag and fix the script issue + WBUSW-1061 [Coverity] Fix Coverity issue under mac-ble/sw + WBUSW-1072 Corrections to source reorganization + WBUSW-1115 Update documentation to ARM format + WBUSW-1039 System and diagnostic WSF_ASSERT interface + +Changes in LL_16.06. + + [#681] LL ACL test statistics + [#762] Enter termination state after ACK is transmitted following LL_TERMINATE_IND + [#830] Master sometimes starts CE outside Tx Window + [#854] Reset should clear state variables + [#859] Receive PDU buffer should limit to buffer allocation size + [#880] Slave receiving LL_TERMINATE_IND with pending data does not terminate + [#881] Connection that receives any packet, even with CRC failure, is established + [#892] Scan BOD may be scheduled very far in the future + [#893] Master connection may corrupt advertising report filter + [#905] Calculate scan due time after TIFS cancel + [#908] LL connection parameter events do not match "thin HCI" fields + [#943] Return peer device address in LE_Connection_Complete event with privacy + [#946] Improve LL test mode + [#951] Connection initiation requires additional scheduler setup + [#956] LL_CONNECTION_PARAM_REQ is not reject with invalid parameters + [#961] Cannot create high density connections + [#963] Reservation manager should avoid overlapping connection events + +Changes in LL_16.03. + + [#568] Master selects connection parameters with least conflicts + [#610] Inform BBP about TIFS setup requirement + [#727] Handler performance metrics + [#728] UPF53 vendor compatibility fixes + [#730] Reject connection parameter request with REJECT_IND_EXT + [#732] PRBS9 test packets calculated wrong + [#734] InitA not refreshed in directed advertisements + [#748] LL API to get connection context size + [#755] VS command to set private key for LE SC + [#759] Incorrect us-to-BB ticks conversion for 32k BB clock + [#780] LE Secure Connections parameters should be little-endian + [#787] VS event mask to disable trace events + [#788] Maximum entries cannot be added to resolving list + [#791] upperLimit in scan backoff algorithm changes after pairs of failures or successes + [#831] Allow LlSetOpFlags() to set Connection Parameter operation flags diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api.h index 22b2c98211..81b273d9c8 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief BLE baseband interface file. + * \file + * \brief BLE baseband interface file. */ /*************************************************************************************************/ @@ -312,33 +313,6 @@ uint16_t BbBleInitResolvingList(uint8_t numEntries, uint8_t *pFreeMem, uint32_t /*************************************************************************************************/ uint16_t BbBleInitPeriodicList(uint8_t numEntries, uint8_t *pFreeMem, uint32_t freeMemSize); -/*************************************************************************************************/ -/*! - * \brief Get transmit RF path compensation. - * - * \return Transmit RF path compensation (in 1-dBm units). - */ -/*************************************************************************************************/ -int8_t BbBleRfGetTxRfPathComp(void); - -/*************************************************************************************************/ -/*! - * \brief Get receive RF path compensation. - * - * \return Transmit RF path compensation (in 1-dBm units). - */ -/*************************************************************************************************/ -int8_t BbBleRfGetRxRfPathComp(void); - -/*************************************************************************************************/ -/*! - * \brief Initialize RF path compensation. - * - * \return None. - */ -/*************************************************************************************************/ -void BbBleInitRfPathComp(void); - /*************************************************************************************************/ /*! * \brief Get advertising packet statistics. @@ -429,54 +403,36 @@ void BbBleGetPduFiltStats(BbBlePduFiltStats_t *pStats); /*************************************************************************************************/ /*! - * \brief Get supported transmit power. + * \brief Initialize for connected isochronous stream master operations. * - * \param pMinTxPwr Return buffer for minimum transmit power (expressed in 1dBm units). - * \param pMaxTxPwr Return buffer for maximum transmit power (expressed in 1dBm units). + * \return None. + * + * Update the operation table with CIS master operations routines. + */ +/*************************************************************************************************/ +void BbBleCisMasterInit(void); + +/*************************************************************************************************/ +/*! + * \brief Initialize for connected isochronous stream slave operations. + * + * \return None. + * + * Update the operation table with CIS slave operations routines. + */ +/*************************************************************************************************/ +void BbBleCisSlaveInit(void); + +/*************************************************************************************************/ +/*! + * \brief Get CIS packet statistics. + * + * \param pStats CIS data statistics. * * \return None. */ /*************************************************************************************************/ -void BbBleRfGetSupTxPower(int8_t *pMinTxPwr, int8_t *pMaxTxPwr); - -/*************************************************************************************************/ -/*! - * \brief Read RF path compensation. - * - * \param pTxPathComp Return buffer for RF transmit path compensation value (expressed in 0.1dBm units). - * \param pRxPathComp Return buffer for RF receive path compensation value (expressed in 0.1dBm units). - * - * \return None. - */ -/*************************************************************************************************/ -void BbBleRfReadRfPathComp(int16_t *pTxPathComp, int16_t *pRxPathComp); - -/*************************************************************************************************/ -/*! - * \brief Set RF path compensation. - * - * \param txPathComp RF transmit path compensation value (expressed in 0.1dBm units). - * \param rxPathComp RF receive path compensation value (expressed in 0.1dBm units). - * - * \return TRUE if successful, FALSE otherwise. - */ -/*************************************************************************************************/ -bool_t BbBleRfWriteRfPathComp(int16_t txPathComp, int16_t rxPathComp); - -/*************************************************************************************************/ -/*! - * \brief Get the actual Tx power at the antenna (expressed in 1dBm units). - * - * \param txPwr Tx power provided by the host (expressed in 1dBm units). - * \param compFlag Flag to apply Tx path compensation or not. - * - * \return Actual Tx power at the antenna (expressed in 1dBm units). - * - * Tx path compensation is only used for extended ADV header. - * Compensation is not considered when filling in HCI events. - */ -/*************************************************************************************************/ -int8_t BbBleRfGetActualTxPower(int8_t txPwr, bool_t compFlag); +void BbBleGetCisStats(BbBleDataPktStats_t *pStats); /*! \} */ /* BB_API_BLE */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_op.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_op.h index 12dff6a81c..874a1eb05f 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_op.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_op.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief BLE baseband interface file. + * \file + * \brief BLE baseband interface file. */ /*************************************************************************************************/ @@ -24,7 +25,7 @@ #define BB_BLE_API_OP_H #include "bb_api.h" -#include "bb_ble_drv.h" +#include "pal_bb_ble.h" #include "bb_ble_api_pdufilt.h" #include "ll_defs.h" @@ -62,12 +63,20 @@ enum BB_BLE_OP_SLV_AUX_ADV_EVENT, /*!< Slave auxiliary advertising event. */ BB_BLE_OP_SLV_PER_ADV_EVENT, /*!< Slave periodic advertising event. */ BB_BLE_OP_MST_PER_SCAN_EVENT, /*!< Master periodic scanning event. */ + BB_BLE_OP_MST_CIS_EVENT, /*!< Master CIS event. */ + BB_BLE_OP_SLV_CIS_EVENT, /*!< Slave CIS event. */ BB_BLE_OP_NUM /*!< Total number of operations. */ }; /*! \brief Maximum request PDU length (MAX(LL_SCAN_REQ_PDU_LEN, LL_CONN_IND_PDU_LEN)). */ #define BB_REQ_PDU_MAX_LEN (LL_ADV_HDR_LEN + LL_CONN_IND_PDU_LEN) +/*! \brief Guard time at the end of a scan window to the next BOD. Backoff one advertise data exchange. */ +#define BB_SCAN_GUARD_US (LL_ADV_PKT_MAX_USEC + LL_BLE_TIFS_US + \ + LL_SCAN_REQ_MAX_USEC + LL_BLE_TIFS_US + \ + LL_SCAN_RSP_MAX_USEC + \ + BbGetSchSetupDelayUs()) + /************************************************************************************************** Data Types **************************************************************************************************/ @@ -105,6 +114,15 @@ typedef void (*BbBleTxDataComp_t)(BbOpDesc_t *pBod, uint8_t status); /*! \brief Data receive completion callback signature. */ typedef void (*BbBleRxDataComp_t)(BbOpDesc_t *pBod, uint8_t *pBuf, uint8_t status); +/*! \brief CIS check whether to continue current operation call signature. */ +typedef uint32_t (*BbBleCisCheckContOp_t)(BbOpDesc_t *pBod, bool_t *pNewCisCtx); + +/*! \brief CIS post execute callback signature. */ +typedef void (*BbBleCisPostExec_t)(BbOpDesc_t *pBod, uint8_t status); + +/*! \brief CIS data receive completion callback signature. */ +typedef void (*BbBleCisRxDataComp_t)(BbOpDesc_t *pBod, uint8_t *pBuf, uint8_t status); + /*! \brief Test completion callback signature. */ typedef bool_t (*BbBleTestComp_t)(BbOpDesc_t *pBod, uint8_t status); @@ -164,6 +182,8 @@ typedef struct uint8_t txAdvLen; /*!< Advertising buffer length. */ uint8_t txRspLen; /*!< Scan response buffer length. */ + uint8_t firstAdvChIdx; /*!< first advertising channel index. */ + uint8_t advChMap; /*!< Advertising channel map. */ /* Return parameters. */ @@ -219,10 +239,10 @@ typedef struct typedef struct { /* TODO BbBleSlvAuxAdvEvent_t hide buffer descriptors in BB layer. */ - BbBleDrvTxBufDesc_t txAuxAdvPdu[2]; /*!< Advertising PDU descriptor. */ + PalBbBleTxBufDesc_t txAuxAdvPdu[2]; /*!< Advertising PDU descriptor. */ uint8_t *pRxAuxReqBuf; /*!< Auxiliary request buffer (must be size of BB_REQ_PDU_MAX_LEN). */ - BbBleDrvTxBufDesc_t txAuxRspPdu[2]; /*!< Response PDU descriptor. */ - BbBleDrvTxBufDesc_t txAuxChainPdu[2]; /*!< Auxiliary chain PDU descriptor. */ + PalBbBleTxBufDesc_t txAuxRspPdu[2]; /*!< Response PDU descriptor. */ + PalBbBleTxBufDesc_t txAuxChainPdu[2]; /*!< Auxiliary chain PDU descriptor. */ BbBleAdvComp_t rxAuxReqCback; /*!< Auxiliary request receive completion callback. */ BbBleAdvPost_t rxAuxReqPostCback; /*!< Auxiliary scan/connect request receive post processing callback. */ @@ -266,6 +286,39 @@ typedef struct uint8_t rxPhyOptions; /*!< Rx PHY options. */ } BbBleSlvConnEvent_t; +/*! \brief CIS master event operation data (\ref BB_BLE_OP_MST_CIS_EVENT). */ +typedef struct +{ + BbBleCisCheckContOp_t checkContOpCback; /*!< Check whether to continue current operation callback. */ + BbBleExec_t execCback; /*!< Execute callback. */ + BbBleExec_t contExecCback; /*!< Continue execute callback. */ + BbBleCisPostExec_t postSubEvtCback; /*!< Post subevent callback. */ + BbBleCancel_t cancelCback; /*!< Cancel callback. */ + BbBleTxDataComp_t txDataCback; /*!< Transmit completion callback. */ + BbBleCisRxDataComp_t rxDataCback; /*!< Receive completion callback. */ + /* Return parameters. */ + int8_t rssi; /*!< RSSI of the last received packet. */ + uint8_t rxPhyOptions; /*!< Rx PHY options. */ +} BbBleMstCisEvent_t; + +/*! \brief CIS slave event operation data (\ref BB_BLE_OP_SLV_CIS_EVENT). */ +typedef struct +{ + BbBleCisCheckContOp_t checkContOpCback; /*!< Check whether to continue current operation callback. */ + BbBleExec_t execCback; /*!< Execute callback. */ + BbBleExec_t contExecCback; /*!< Continue execute callback. */ + BbBleCisPostExec_t postSubEvtCback; /*!< Post subevent callback. */ + BbBleCancel_t cancelCback; /*!< Cancel callback. */ + BbBleTxDataComp_t txDataCback; /*!< Transmit completion callback. */ + BbBleRxDataComp_t rxDataCback; /*!< Receive completion callback. */ + + /* Return parameters. */ + uint32_t startTs; /*!< Start timestamp of the first received packet. */ + int8_t rssi; /*!< RSSI of the last received packet. */ + uint8_t rxPhyOptions; /*!< Rx PHY options. */ + uint32_t rxSyncDelayUsec; /*!< Receive timeout in microseconds. */ +} BbBleSlvCisEvent_t; + /*! \brief Continuous transmit operation data (\ref BB_BLE_OP_TEST_TX). */ typedef struct { @@ -289,7 +342,7 @@ typedef struct /*! \brief Bluetooth Low Energy protocol specific operation parameters. */ typedef struct BbBleData_tag { - BbBleDrvChan_t chan; /*!< Channelization parameters. */ + PalBbBleChan_t chan; /*!< Channelization parameters. */ bbBlePduFiltParams_t pduFilt; /*!< PDU filter parameters. */ union @@ -300,8 +353,10 @@ typedef struct BbBleData_tag BbBleSlvAuxAdvEvent_t slvAuxAdv; /*!< Slave auxiliary advertising event data. */ BbBleSlvAuxAdvEvent_t slvPerAdv; /*!< Slave periodic advertising event data. */ BbBleMstConnEvent_t mstConn; /*!< Master connection event data. */ - BbBleMstPerScanEvent_t mstPerScan; /*!< Master periodic scanning event data. */ BbBleSlvConnEvent_t slvConn; /*!< Slave connection event data. */ + BbBleMstPerScanEvent_t mstPerScan; /*!< Master periodic scanning event data. */ + BbBleMstCisEvent_t mstCis; /*!< Master CIS event data. */ + BbBleSlvCisEvent_t slvCis; /*!< Slave CIS event data. */ BbBleTestTx_t testTx; /*!< Transmit test data. */ BbBleTestRx_t testRx; /*!< Receive test data. */ } op; /*!< Operation specific data. */ @@ -324,7 +379,7 @@ typedef struct BbBleData_tag * \ref BbBleSlvConnEvent_t::rxDataCback callback routine. */ /*************************************************************************************************/ -void BbBleTxData(BbBleDrvTxBufDesc_t descs[], uint8_t cnt); +void BbBleTxData(PalBbBleTxBufDesc_t descs[], uint8_t cnt); /*************************************************************************************************/ /*! @@ -344,6 +399,39 @@ void BbBleTxData(BbBleDrvTxBufDesc_t descs[], uint8_t cnt); /*************************************************************************************************/ void BbBleRxData(uint8_t *pBuf, uint16_t len); +/*************************************************************************************************/ +/*! + * \brief Transmit CIS PDU at next transmit slot. + * + * \param descs Array of transmit buffer descriptor. + * \param cnt Number of descriptors. + * + * \return None. + * + * \note This function is expected to be called during the call context of + * \ref BbBleMstCisEvent_t::rxDataCback or \ref BbBleSlvCisEvent_t::rxDataCback + * callback routine. + */ +/*************************************************************************************************/ +void BbBleCisTxData(PalBbBleTxBufDesc_t descs[], uint8_t cnt); + +/*************************************************************************************************/ +/*! + * \brief Set receive data buffer for next receive slot. + * + * \param pBuf Receive data buffer. + * \param len Maximum length of data buffer. + * + * \return None. + * + * \note This function is expected to be called during the call context of + * \ref BbBleSlvCisEvent_t::rxDataCback callback routine. + * + * \note BB must always call the BbBleSlvCisEvent_t::rxDataCback callback routine of the + * currently executing BOD with the given buffer. + */ +/*************************************************************************************************/ +void BbBleCisRxData(uint8_t *pBuf, uint16_t len); /*! \} */ /* BB_API_BLE */ #ifdef __cplusplus diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_pdufilt.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_pdufilt.h index db2f577de7..6654bc2e46 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_pdufilt.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_pdufilt.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief BLE baseband PDU filtering interface file. + * \file + * \brief BLE baseband PDU filtering interface file. */ /*************************************************************************************************/ @@ -39,7 +40,7 @@ extern "C" { /*! \brief Check whether a flag is set. */ #define BB_BLE_PDU_FILT_FLAG_IS_SET(pFilt, flag) (((pFilt)->flags & BB_BLE_PDU_FILT_FLAG_##flag) != 0) -/*! \brief Check whether a flag is clear. */ +/*! \brief Set a flag. */ #define BB_BLE_PDU_FILT_SET_FLAG(pFilt, flag) (pFilt)->flags |= BB_BLE_PDU_FILT_FLAG_##flag; /*! \brief PDU filtering flags. */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_periodiclist.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_periodiclist.h index 2bf1fb20b3..2b4283873b 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_periodiclist.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_periodiclist.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief BLE baseband periodiclist interface file. + * \file + * \brief BLE baseband periodiclist interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_reslist.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_reslist.h index 58b9ea3124..6ddf9e66dd 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_reslist.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_reslist.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief BLE baseband resolving list interface file. + * \file + * \brief BLE baseband resolving list interface file. */ /*************************************************************************************************/ @@ -337,6 +338,32 @@ uint8_t BbBleResListLocalStatus(bool_t peerAddrRand, uint64_t peerIdentityAddr); /*************************************************************************************************/ void BbBleResListHandleTimeout(void); +/*************************************************************************************************/ +/*! + * \brief Check if either local RPA or peer RPA is updated. + * + * \param peerAddrType Peer identity address type. + * \param peerIdentityAddr Peer identity address. + * + * \return TRUE if either local RPA or peer RPA is updated. + * + */ +/*************************************************************************************************/ +bool_t BbBleResListIsRpaUpd(uint8_t peerAddrType, uint64_t peerIdentityAddr); + +/*************************************************************************************************/ +/*! + * \brief Check if peer identity is in the resolving list. + * + * \param peerAddrType Peer identity address type. + * \param peerIdentityAddr Peer identity address. + * + * \return TRUE if peer addr is in the resolving list. + * + */ +/*************************************************************************************************/ +bool_t bbBleIsPeerInResList(uint8_t peerAddrType, uint64_t peerIdentityAddr); + /*! \} */ /* BB_API_BLE_RL */ #ifdef __cplusplus diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_whitelist.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_whitelist.h index 11e8ab4083..70aed1437f 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_whitelist.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/bb_ble_api_whitelist.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief BLE baseband whitelist interface file. + * \file + * \brief BLE baseband whitelist interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/lhci_api.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/lhci_api.h index d52967e6d6..26b00eb431 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/lhci_api.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/lhci_api.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer HCI subsystem API. + * \file + * \brief Link layer HCI subsystem API. */ /*************************************************************************************************/ @@ -63,10 +64,17 @@ void LhciConnMasterInit(void); void LhciExtConnMasterInit(void); void LhciScInit(void); void LhciPhyInit(void); +void LhciPastInit(void); void LhciChannelSelection2Init(void); +void LhciCisMasterInit(void); +void LhciCisSlaveInit(void); +void LhciIsoInit(void); void LhciVsExtInit(lhciCmdHandler_t decodeCmd); void LhciHandlerInit(wsfHandlerId_t handlerId); void LhciHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg); +void LhciIsoHandlerInit(wsfHandlerId_t handlerId); +void LhciIsoHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg); +void LhciSetDefaultHciSupCmd(uint8_t *pBuf); #if (LL_ENABLE_TESTER) void LhciTesterInit(void); #endif @@ -81,7 +89,7 @@ bool_t LhciIsEventPending(void); uint8_t LhciPackEvtHdr(uint8_t *pBuf, uint8_t evtCode, uint8_t paramLen); /* Event processing */ -void LhciVsEncodeTraceMsgEvtPkt(uint8_t *pBuf, uint8_t len); +bool_t LhciVsEncodeTraceMsgEvtPkt(const uint8_t *pBuf, uint32_t len); #ifdef __cplusplus }; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_api.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_api.h index b603950066..e0c255a0c8 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_api.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_api.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,18 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer interface file. - * - * Initialization conditional compilation are used to control LL initialization options. - * Define one or more of the following to enable roles and features. - * - * - INIT_BROADCASTER (default) - * - INIT_OBSERVER - * - INIT_PERIPHERAL - * - INIT_CENTRAL - * - INIT_ENCRYPTED - * - * \note Each feature may require additional \ref LlRtCfg_t requirements. + * \file + * \brief Link layer interface file. */ /*************************************************************************************************/ @@ -44,6 +34,9 @@ extern "C" { #endif +/*! \brief Version number. */ +#define LL_VER_NUM 0x1302 /* Default value. Auto-generated by builder. */ + /************************************************************************************************** Data Types **************************************************************************************************/ @@ -119,7 +112,8 @@ enum LL_ERROR_CODE_TYPE0_SUBMAP_NOT_DEF = 0x41, LL_ERROR_CODE_UNKNOWN_ADV_ID = 0x42, LL_ERROR_CODE_LIMIT_REACHED = 0x43, - LL_ERROR_CODE_OP_CANCELLED_BY_HOST = 0x44 + LL_ERROR_CODE_OP_CANCELLED_BY_HOST = 0x44, + LL_ERROR_CODE_PKT_TOO_LONG = 0x45 }; /*! \addtogroup LL_API_INIT @@ -138,7 +132,8 @@ typedef struct uint8_t maxAdvReports; /*!< Maximum number of pending legacy or extended advertising reports. */ uint16_t maxExtAdvDataLen; /*!< Maximum extended advertising data size. */ uint8_t defExtAdvDataFrag; /*!< Default extended advertising data fragmentation size. */ - uint32_t auxDelayUsec; /*!< Auxiliary Offset delay above T_MAFS in microseconds. */ + uint16_t auxDelayUsec; /*!< Auxiliary Offset delay above T_MAFS in microseconds. */ + uint16_t auxPtrOffsetUsec; /*!< Delay of auxiliary packet in microseconds from the time specified by auxPtr. */ /* Scanner */ uint8_t maxScanReqRcvdEvt; /*!< Maximum scan request received events. */ uint16_t maxExtScanDataLen; /*!< Maximum extended scan data size. */ @@ -149,6 +144,16 @@ typedef struct uint16_t maxAclLen; /*!< Maximum ACL buffer size. */ int8_t defTxPwrLvl; /*!< Default Tx power level for connections. */ uint8_t ceJitterUsec; /*!< Allowable CE jitter on a slave (account for master's sleep clock resolution). */ + /* ISO */ + uint8_t numIsoTxBuf; /*!< Default number of ISO transmit buffers. */ + uint8_t numIsoRxBuf; /*!< Default number of ISO receive buffers. */ + uint16_t maxIsoBufLen; /*!< Maximum ISO buffer size between host and controller. */ + uint16_t maxIsoPduLen; /*!< Maximum ISO PDU buffer size. */ + + /* CIS */ + uint8_t maxCig; /*!< Maximum number of CIG. */ + uint8_t maxCis; /*!< Maximum number of CIS. */ + uint16_t subEvtSpaceDelay; /*!< Subevent spacing above T_MSS. */ /* DTM */ uint16_t dtmRxSyncMs; /*!< DTM Rx synchronization window in milliseconds. */ /* PHY */ @@ -207,32 +212,47 @@ typedef struct #define LL_SUP_STATE_LO_DUTY_DIR_ADV_SLV (UINT64_C(1) << 40) /*!< Low Duty Cycle Directed Advertising and Slave Role combination supported. */ #define LL_SUP_STATE_INIT_SLV (UINT64_C(1) << 41) /*!< Initiating State and Slave Role combination. */ -/*! \brief The features bitmask indicates the LE features supported by the LL. */ -enum -{ - /* --- Core Spec 4.0 --- */ - LL_FEAT_ENCRYPTION = (1 << 0), /*!< Encryption supported. */ - /* --- Core Spec 4.2 --- */ - LL_FEAT_CONN_PARAM_REQ_PROC = (1 << 1), /*!< Connection Parameters Request Procedure supported. */ - LL_FEAT_EXT_REJECT_IND = (1 << 2), /*!< Extended Reject Indication supported. */ - LL_FEAT_SLV_INIT_FEAT_EXCH = (1 << 3), /*!< Slave-Initiated Features Exchange supported. */ - LL_FEAT_LE_PING = (1 << 4), /*!< LE Ping supported. */ - LL_FEAT_DATA_LEN_EXT = (1 << 5), /*!< Data Length Extension supported. */ - LL_FEAT_PRIVACY = (1 << 6), /*!< LL Privacy supported. */ - LL_FEAT_EXT_SCAN_FILT_POLICY = (1 << 7), /*!< Extended Scan Filter Policy supported. */ - /* --- Core Spec 5.0 --- */ - LL_FEAT_LE_2M_PHY = (1 << 8), /*!< LE 2M PHY supported. */ - LL_FEAT_STABLE_MOD_IDX_TRANSMITTER = (1 << 9), /*!< Stable Modulation Index - Transmitter supported. */ - LL_FEAT_STABLE_MOD_IDX_RECEIVER = (1 << 10), /*!< Stable Modulation Index - Receiver supported. */ - LL_FEAT_LE_CODED_PHY = (1 << 11), /*!< LE Coded PHY supported. */ - LL_FEAT_LE_EXT_ADV = (1 << 12), /*!< LE Extended Advertising supported. */ - LL_FEAT_LE_PER_ADV = (1 << 13), /*!< LE Periodic Advertising supported. */ - LL_FEAT_CH_SEL_2 = (1 << 14), /*!< Channel Selection Algorithm #2 supported. */ - LL_FEAT_LE_POWER_CLASS_1 = (1 << 15), /*!< LE Power Class 1 supported. */ - LL_FEAT_MIN_NUM_USED_CHAN = (1 << 16), /*!< Minimum Number of Used Channels supported. */ - /* --- */ - LL_FEAT_ALL_MASK = 0x1FFFF /*!< All feature mask, need to be updated when new features are added. */ -}; +/*! The features bitmask indicates the LE features supported by the LL. */ + +/* --- Core Spec 4.0 --- */ +#define LL_FEAT_ENCRYPTION (UINT64_C(1) << 0) /*!< Encryption supported. */ +/* --- Core Spec 4.2 --- */ +#define LL_FEAT_CONN_PARAM_REQ_PROC (UINT64_C(1) << 1) /*!< Connection Parameters Request Procedure supported. */ +#define LL_FEAT_EXT_REJECT_IND (UINT64_C(1) << 2) /*!< Extended Reject Indication supported. */ +#define LL_FEAT_SLV_INIT_FEAT_EXCH (UINT64_C(1) << 3) /*!< Slave-Initiated Features Exchange supported. */ +#define LL_FEAT_LE_PING (UINT64_C(1) << 4) /*!< LE Ping supported. */ +#define LL_FEAT_DATA_LEN_EXT (UINT64_C(1) << 5) /*!< Data Length Extension supported. */ +#define LL_FEAT_PRIVACY (UINT64_C(1) << 6) /*!< LL Privacy supported. */ +#define LL_FEAT_EXT_SCAN_FILT_POLICY (UINT64_C(1) << 7) /*!< Extended Scan Filter Policy supported. */ +/* --- Core Spec 5.0 --- */ +#define LL_FEAT_LE_2M_PHY (UINT64_C(1) << 8) /*!< LE 2M PHY supported. */ +#define LL_FEAT_STABLE_MOD_IDX_TRANSMITTER (UINT64_C(1) << 9) /*!< Stable Modulation Index - Transmitter supported. */ +#define LL_FEAT_STABLE_MOD_IDX_RECEIVER (UINT64_C(1) << 10) /*!< Stable Modulation Index - Receiver supported. */ +#define LL_FEAT_LE_CODED_PHY (UINT64_C(1) << 11) /*!< LE Coded PHY supported. */ +#define LL_FEAT_LE_EXT_ADV (UINT64_C(1) << 12) /*!< LE Extended Advertising supported. */ +#define LL_FEAT_LE_PER_ADV (UINT64_C(1) << 13) /*!< LE Periodic Advertising supported. */ +#define LL_FEAT_CH_SEL_2 (UINT64_C(1) << 14) /*!< Channel Selection Algorithm #2 supported. */ +#define LL_FEAT_LE_POWER_CLASS_1 (UINT64_C(1) << 15) /*!< LE Power Class 1 supported. */ +#define LL_FEAT_MIN_NUM_USED_CHAN (UINT64_C(1) << 16) /*!< Minimum Number of Used Channels supported. */ +/* --- Core Spec 5.1 --- */ +#define LL_FEAT_CONN_CTE_REQ (UINT64_C(1) << 17) /*!< Connection CTE Request supported */ +#define LL_FEAT_CONN_CTE_RSP (UINT64_C(1) << 18) /*!< Connection CTE Response supported */ +#define LL_FEAT_CONNLESS_CTE_TRANS (UINT64_C(1) << 19) /*!< Connectionless CTE Transmitter supported */ +#define LL_FEAT_CONNLESS_CTE_RECV (UINT64_C(1) << 20) /*!< Connectionless CTE Receiver supported */ +#define LL_FEAT_ANTENNA_SWITCH_AOD (UINT64_C(1) << 21) /*!< Anetenna Switching during CTE Transmission (AoD) supported */ +#define LL_FEAT_ANTENNA_SWITCH_AOA (UINT64_C(1) << 22) /*!< Anetenna Switching during CTE Reception (AoA) supported */ +#define LL_FEAT_RECV_CTE (UINT64_C(1) << 23) /*!< Receive Constant Tone Extension supported */ +#define LL_FEAT_PAST_SENDER (UINT64_C(1) << 24) /*!< Periodic Advertising Sync Transfer – Sender supported. */ +#define LL_FEAT_PAST_RECIPIENT (UINT64_C(1) << 25) /*!< Periodic Advertising Sync Transfer – Recipient supported. */ +#define LL_FEAT_SCA_UPDATE (UINT64_C(1) << 26) /*!< Sleep Clock Accuracy Updates supported. */ +#define LL_FEAT_REMOTE_PUB_KEY_VALIDATION (UINT64_C(1) << 27) /*!< Remote Public Key Validation supported. */ +/* --- Core Spec Milan --- */ +#define LL_FEAT_CIS_MASTER_ROLE (UINT64_C(1) << 28) /*!< Connected Isochronous Stream Master Role supported. */ +#define LL_FEAT_CIS_SLAVE_ROLE (UINT64_C(1) << 29) /*!< Connected Isochronous Stream Slave Role supported. */ +#define LL_FEAT_ISO_BROADCASTER (UINT64_C(1) << 30) /*!< Isochronous Broadcaster Role supported. */ +#define LL_FEAT_ISO_SYNC (UINT64_C(1) << 31) /*!< Isochronous Synchronizer Role supported. */ + +#define LL_FEAT_ALL_MASK (UINT64_C(0xFF01FFFF))/*!< All feature mask, need to be updated when new features are added. */ /*! \brief This parameter identifies the device role. */ enum @@ -244,23 +264,29 @@ enum /*! \brief Operational mode flags. */ enum { - LL_OP_MODE_FLAG_ENA_VER_LLCP_STARTUP = (1 << 0), /*!< Perform version exchange LLCP at connection establishment. */ - LL_OP_MODE_FLAG_SLV_REQ_IMMED_ACK = (1 << 1), /*!< MD bit set if data transmitted. */ - LL_OP_MODE_FLAG_BYPASS_CE_GUARD = (1 << 2), /*!< Bypass end of CE guard. */ - LL_OP_MODE_FLAG_MST_RETX_AFTER_RX_NACK = (1 << 3), /*!< Master retransmits after receiving NACK. */ - LL_OP_MODE_FLAG_MST_IGNORE_CP_RSP = (1 << 4), /*!< Master ignores LL_CONNECTION_PARAM_RSP. */ - LL_OP_MODE_FLAG_MST_UNCOND_CP_RSP = (1 << 5), /*!< Master unconditionally accepts LL_CONNECTION_PARAM_RSP. */ - /*!< (LL_OP_MODE_FLAG_MST_IGNORE_CP_RSP must be cleared). */ - LL_OP_MODE_FLAG_ENA_LEN_LLCP_STARTUP = (1 << 6), /*!< Perform data length update LLCP at connection establishment. */ - LL_OP_MODE_FLAG_REQ_SYM_PHY = (1 << 7), /*!< Require symmetric PHYs for connection. */ - LL_OP_MODE_FLAG_ENA_FEAT_LLCP_STARTUP = (1 << 8), /*!< Perform feature exchange LLCP at connection establishment. */ - LL_OP_MODE_FLAG_SLV_DELAY_LLCP_STARTUP = (1 << 9), /*!< Slave delays LLCP startup procedures. */ + LL_OP_MODE_FLAG_ENA_VER_LLCP_STARTUP = (1 << 0), /*!< Perform version exchange LLCP at connection establishment. */ + LL_OP_MODE_FLAG_SLV_REQ_IMMED_ACK = (1 << 1), /*!< MD bit set if data transmitted. */ + LL_OP_MODE_FLAG_BYPASS_CE_GUARD = (1 << 2), /*!< Bypass end of CE guard. */ + LL_OP_MODE_FLAG_MST_RETX_AFTER_RX_NACK = (1 << 3), /*!< Master retransmits after receiving NACK. */ + LL_OP_MODE_FLAG_MST_IGNORE_CP_RSP = (1 << 4), /*!< Master ignores LL_CONNECTION_PARAM_RSP. */ + LL_OP_MODE_FLAG_MST_UNCOND_CP_RSP = (1 << 5), /*!< Master unconditionally accepts LL_CONNECTION_PARAM_RSP. */ + /*!< (LL_OP_MODE_FLAG_MST_IGNORE_CP_RSP must be cleared). */ + LL_OP_MODE_FLAG_ENA_LEN_LLCP_STARTUP = (1 << 6), /*!< Perform data length update LLCP at connection establishment. */ + LL_OP_MODE_FLAG_REQ_SYM_PHY = (1 << 7), /*!< Require symmetric PHYs for connection. */ + LL_OP_MODE_FLAG_ENA_FEAT_LLCP_STARTUP = (1 << 8), /*!< Perform feature exchange LLCP at connection establishment. */ + LL_OP_MODE_FLAG_SLV_DELAY_LLCP_STARTUP = (1 << 9), /*!< Slave delays LLCP startup procedures. */ + LL_OP_MODE_FLAG_ENA_SLV_LATENCY_WAKEUP = (1 << 10), /*!< Enable slave latency wake up upon data pending. */ + LL_OP_MODE_FLAG_ENA_SLV_AUX_SCAN_RSP_ADI = (1 << 11), /*!< Enable ADI field for aux scan. */ + LL_OP_MODE_FLAG_ENA_MST_CIS_NULL_PDU = (1 << 12), /*!< Enable CIS master sends additional NULL PDU for acknowledge scheme. */ + LL_OP_MODE_FLAG_ENA_SLV_AUX_IND_ADVA = (1 << 13), /*!< AdvA will be included in AUX_ADV_IND instead of ADV_EXT_IND. */ + LL_OP_MODE_FLAG_ENA_ADV_CHAN_RAND = (1 << 14), /*!< Enable advertising channel randomization. */ /* diagnostics only */ - LL_OP_MODE_FLAG_ENA_ADV_DLY = (1 << 16), /*!< Enable advertising delay. */ - LL_OP_MODE_FLAG_ENA_SCAN_BACKOFF = (1 << 17), /*!< Enable scan backoff. */ - LL_OP_MODE_FLAG_ENA_WW = (1 << 18), /*!< Enable window widening. */ - LL_OP_MODE_FLAG_ENA_SLV_LATENCY = (1 << 19), /*!< Enable slave latency. */ - LL_OP_MODE_FLAG_ENA_LLCP_TIMER = (1 << 20) /*!< Enable LLCP timer. */ + LL_OP_MODE_FLAG_ENA_ADV_DLY = (1 << 16), /*!< Enable advertising delay. */ + LL_OP_MODE_FLAG_ENA_SCAN_BACKOFF = (1 << 17), /*!< Enable scan backoff. */ + LL_OP_MODE_FLAG_ENA_WW = (1 << 18), /*!< Enable window widening. */ + LL_OP_MODE_FLAG_ENA_SLV_LATENCY = (1 << 19), /*!< Enable slave latency. */ + LL_OP_MODE_FLAG_ENA_LLCP_TIMER = (1 << 20), /*!< Enable LLCP timer. */ + LL_OP_MODE_FLAG_IGNORE_CRC_ERR_TS = (1 << 21) /*!< Ignore timestamp of RX packet with CRC error. */ }; /*! \} */ /* LL_API_DEVICE */ @@ -388,6 +414,14 @@ enum LL_SCAN_ACTIVE = 1 /*!< Active scanning. */ }; +/*! \brief Init filter policy. */ +enum +{ + LL_INIT_FILTER_PEER = 0, /*!< Filter to only Peer addr and addr type. */ + LL_INIT_FILTER_WL = 1, /*!< Filter to only whitelist. */ + LL_INIT_FILTER_TOTAL /*!< Total number of filter policies. */ +}; + /*! \brief Scan filter policy. */ enum { @@ -440,10 +474,13 @@ enum LL_RPT_TYPE_SCAN_RSP = 0x04 /*!< Scan Response (SCAN_RSP). */ }; +/*! \brief Periodic advertising create sync options valid bits. */ +#define LL_PER_ADV_CREATE_SYNC_OPTIONS_BITS 0x03 + /*! \brief Periodic advertising create sync command. */ typedef struct { - uint8_t filterPolicy; /*!< Filter Policy. */ + uint8_t options; /*!< Options. */ uint8_t advSID; /*!< Advertising SID. */ uint8_t advAddrType; /*!< Advertiser Address Type. */ uint8_t *pAdvAddr; /*!< Advertiser Address. */ @@ -573,6 +610,98 @@ enum /*! \} */ /* LL_API_CONN */ + +/*! \addtogroup LL_API_ISO + * \{ */ + +/*! \brief Packing scheme. */ +enum +{ + LL_PACKING_SEQUENTIAL = 0, /*!< Sequential. */ + LL_PACKING_INTERLEAVED = 1 /*!< Interleaved. */ +}; + +/*! \brief Framing. */ +enum +{ + LL_FRAMING_UNFRAMED = 0, /*!< Unframed. */ + LL_FRAMING_FRAMED = 1, /*!< Framed. */ +}; + +/*! \brief CIS parameters. */ +typedef struct +{ + uint8_t cisId; /*!< Used to identify a connected isochronous stream. */ + uint16_t sduSizeMToS; /*!< Maximum size of a data SDU from the master to the slave. */ + uint16_t sduSizeSToM; /*!< Maximum size of a data SDU from the slave to the master. */ + uint8_t phyMToS; /*!< PHY to be used for transmission from master to slave. */ + uint8_t phySToM; /*!< PHY to be used for transmission from master to slave. */ + uint16_t transLatMToS; /*!< Maximum time in microseconds between the transmissions of a Data PDU from the Link Layer of the master to the reception of the same Data PDU in the Link Layer of the slave. */ + uint16_t transLatSToM; /*!< Maximum time in microseconds between the transmissions of a Data PDU from the Link Layer of the slave to the reception of the same Data PDU in the Link Layer of the master. */ + uint8_t rteMToS; /*!< Maximum number of times every PDU should be retransmitted from the master to slave. */ + uint8_t rteSToM; /*!< Maximum number of times every PDU should be retransmitted from the slave to master. */ +} LlCisCisParams_t; + +/*! \brief CIG parameters. */ +typedef struct +{ + uint8_t cigId; /*!< Used to identify the connected isochronous group. */ + uint32_t sduIntervalMToS; /*!< The time interval between the start of consecutive SDUs from the master Host */ + uint32_t sduIntervalSToM; /*!< The time interval between the start of consecutive SDUs from the slave Host */ + uint8_t sca; /*!< Sleep clock accuracy. */ + uint8_t packing; /*!< Packing scheme. */ + uint8_t framing; /*!< Indicates the format of CIS Data PDUs. */ + uint8_t numCis; /*!< Number of CIS to set. */ + LlCisCisParams_t *pCisParam; /*!< CIS parameters. */ +} LlCisCigParams_t; + +/*! \brief CIG test CIS parameters. */ +typedef struct +{ + uint8_t cisId; /*!< CIS identifier. */ + uint8_t nse; /*!< Maximum number of subevent in each interval on CIS. */ + uint8_t plSizeMToS; /*!< Maximum size of payload from master to slave. */ + uint8_t plSizeSToM; /*!< Maximum size of payload from slave to master. */ + uint8_t phyMToS; /*!< Master to slave PHY. */ + uint8_t phySToM; /*!< Slave to master PHY. */ + uint8_t ftMToS; /*!< Master to slave flush time. */ + uint8_t ftSToM; /*!< Slave to master flush time. */ + uint8_t bnMToS; /*!< Master to slave burst number. */ + uint8_t bnSToM; /*!< Slave to master burst number. */ +} LlCisCigCisParamsTest_t; + +/*! \brief CIG test CIG parameters. */ +typedef struct +{ + uint8_t cigId; /*!< CIG identifier. */ + uint16_t isoInterval; /*!< The time duration of the isochronous PDU interval. */ + uint8_t numCis; /*!< Number of CIS. */ + uint8_t sca; /*!< Sleep clock accuracy. */ + uint8_t packing; /*!< Packing scheme. */ + LlCisCigCisParamsTest_t *pCisParam; /*!< CIS parameters. */ +} LlCisCigParamsTest_t; + +/*! \brief CIS create CIS parameters. */ +typedef struct +{ + uint16_t *pCisHandle; /*!< Pointer to the connected isochronous stream handle array. */ + uint16_t *pAclHandle; /*!< Pointer to the asynchronous connection link handle array. */ +} LlCisCreateCisParams_t; + +/*! \brief CIS create CIS parameters. */ +typedef struct +{ + uint16_t isoHandle; /*!< Handle of CIS or BIS. */ + uint32_t inputBw; /*!< Input bandwidth. */ + uint32_t outputBw; /*!< Output bandwidth. */ + uint8_t inputDataPath; /*!< Input data path. */ + uint8_t outputDataPath; /*!< Output data path. */ + uint8_t inputMaxPayloadSize; /*!< Input maximum payload size. */ + uint8_t outputMaxPayloadSize; /*!< Output maximum payload size. */ +} LlIsoSetupDataPathParams_t; + +/*! \} */ /* LL_API_ISO */ + /*! \addtogroup LL_API_ENCRYPT * \{ */ @@ -678,7 +807,16 @@ enum LL_PER_ADV_SYNC_ESTD_IND, /*!< Periodic scanning synchronization established. */ LL_PER_ADV_SYNC_LOST_IND, /*!< Periodic scanning synchronization lost. */ LL_PER_ADV_REPORT_IND, /*!< Periodic scanning report. */ - LL_CH_SEL_ALGO_IND /*!< Channel selection algorithm. */ + LL_CH_SEL_ALGO_IND, /*!< Channel selection algorithm. */ + /* --- Core Spec 5.1 --- */ + LL_CONNLESS_IQ_REPORT_IND, /*!< LE connectionless IQ report received. */ + LL_CONN_IQ_REPORT_IND, /*!< LE connection IQ report received. */ + LL_CTE_REQ_FAILED_IND, /*!< LE CTE request failed received. */ + LL_PER_SYNC_TRSF_RCVD_IND, /*!< LE periodic advertising sync transfer received. */ + /* --- Core Spec Milan --- */ + LL_CIS_EST_IND, /*!< CIS established event. */ + LL_CIS_REQ_IND, /*!< CIS request event. */ + LL_REQ_PEER_SCA_IND, /*!< Request peer SCA complete. */ }; /*! \brief Advertising report indication */ @@ -893,6 +1031,29 @@ typedef struct uint8_t handle; /*!< Advertising handle. */ } LlPerAdvEnableCnf_t; +/********************** CIS ******************************/ +/*! \brief CIS established event */ +typedef struct +{ + wsfMsgHdr_t hdr; /*!< Event header. */ + uint8_t status; /*!< Status. */ + uint16_t cisHandle; /*!< CIS handle. */ + uint32_t cigSyncDelayUsec; /*!< CIG synchronization delay in usec. */ + uint32_t cisSyncDelayUsec; /*!< CIS synchronization delay in usec. */ + uint8_t phyMToS; /*!< Master to slave PHY. */ + uint8_t phySToM; /*!< Slave to master PHY. */ +} LlCisEstInd_t; + +/*! \brief CIS request event */ +typedef struct +{ + wsfMsgHdr_t hdr; /*!< Event header. */ + uint16_t aclHandle; /*!< ACL handle. */ + uint16_t cisHandle; /*!< ACL handle. */ + uint8_t cigId; /*!< CIG identifier. */ + uint8_t cisId; /*!< CIS identifier. */ +} LlCisReqInd_t; + /*! \brief Extended advertising report event types. */ enum { @@ -1004,6 +1165,31 @@ typedef struct uint16_t syncHandle; /*!< Sync handle. */ } LlPerAdvSyncLostInd_t; +/*! \brief LE periodic advertising sync transfer received */ +typedef struct +{ + wsfMsgHdr_t hdr; /*!< Event header. */ + uint8_t status; /*!< Status. */ + uint16_t connHandle; /*!< Connection handle. */ + uint16_t serviceData; /*!< Service data. */ + uint16_t syncHandle; /*!< Sync handle. */ + uint8_t advSID; /*!< Advertising SID. */ + uint8_t addrType; /*!< Advertiser address type. */ + bdAddr_t addr; /*!< Advertiser address. */ + uint8_t advPhy; /*!< Advertiser PHY. */ + uint16_t perAdvInterval; /*!< Periodic advertising interval. */ + uint8_t advClkAccuracy; /*!< Advertiser clock accuracy. */ +} LlPerSyncTrsfRcvdInd_t; + +/*! \brief LE request peer SCA complete */ +typedef struct +{ + wsfMsgHdr_t hdr; /*!< Event header. */ + uint8_t status; /*!< Status. */ + uint16_t connHandle; /*!< Connection handle. */ + uint8_t peerSca; /*!< Peer SCA. */ +} LlPeerScaCnf_t; + /*! \brief Union of all event types */ typedef union { @@ -1026,8 +1212,8 @@ typedef union LlRemConnParamInd_t remConnParamInd; /*!< LE remote connection parameter request. */ LlAuthPayloadTimeoutInd_t authPayloadTimeoutInd; /*!< Authentication payload timeout. */ LlDataLenChangeInd_t dataLenChangeInd; /*!< Data length changed. */ - LlReadLocalP256PubKeyInd_t readLocalP256PubKeyInd; /*!< Read local P-256 public key complete. */ - LlGenerateDhKeyInd_t generateDhKeyInd; /*!< Generate Diffie-Hellman key complete. */ + LlReadLocalP256PubKeyInd_t readLocalP256PubKeyInd; /*!< Read local P-256 public key complete. */ + LlGenerateDhKeyInd_t generateDhKeyInd; /*!< Generate Diffie-Hellman key complete. */ LlScanReportInd_t scanReportInd; /*!< Scan report. */ /* --- Core Spec 5.0 --- */ LlPhyUpdateInd_t phyUpdateInd; /*!< PHY update complete. */ @@ -1041,7 +1227,12 @@ typedef union LlPerAdvSyncEstdCnf_t perAdvSyncEstdCnf; /*!< LE periodic advertising sync established. */ LlPerAdvReportInd_t perAdvReportInd; /*!< LE periodic advertising report. */ LlPerAdvSyncLostInd_t perAdvSyncLostInd; /*!< LE periodic advertising sync lost. */ - + /* --- Core Spec 5.1 --- */ + LlPerSyncTrsfRcvdInd_t perASyncTrsfRcvdInd; /*!< LE periodic advertising sync transfer received. */ + /* --- Core Spec Milan --- */ + LlCisEstInd_t cisEst; /*!< LE CIS established. */ + LlCisReqInd_t cisReq; /*!< LE CIS request. */ + LlPeerScaCnf_t peerScaCnf; /*!< LE request peer SCA complete. */ } LlEvt_t; /*! \brief Event callback */ @@ -1050,6 +1241,9 @@ typedef bool_t (*llEvtCback_t)(LlEvt_t *pEvent); /*! \brief ACL callback */ typedef void (*llAclCback_t)(uint16_t handle, uint8_t numBufs); +/*! \brief ISO callback */ +typedef void (*llIsoCback_t)(uint16_t handle, uint8_t numBufs); + /*! \} */ /* LL_API_EVENT */ /************************************************************************************************** @@ -1381,6 +1575,20 @@ void LlEvtRegister(llEvtCback_t evtCback); /*************************************************************************************************/ void LlAclRegister(llAclCback_t sendCompCback, llAclCback_t recvPendCback); +/*************************************************************************************************/ +/*! + * \brief Register ISO handler. + * + * \param sendCompCback Client ISO send complete callback function. + * \param recvPendCback Client ISO receive pending callback function. + * + * \return None. + * + * This function is called by a client to register for ISO data. + */ +/*************************************************************************************************/ +void LlIsoRegister(llIsoCback_t sendCompCback, llIsoCback_t recvPendCback); + /*! \} */ /* LL_API_INIT */ /*! \addtogroup LL_API_DEVICE @@ -1722,6 +1930,23 @@ uint8_t LlGenerateP256KeyPair(void); /*************************************************************************************************/ uint8_t LlGenerateDhKey(const uint8_t pubKey_x[LL_ECC_KEY_LEN], const uint8_t pubKey_y[LL_ECC_KEY_LEN]); +/*************************************************************************************************/ +/*! + * \brief Generate a Diffie-Hellman key. + * + * \param pubKey_x Remote public key x-coordinate. + * \param pubKey_y Remote public key y-coordinate. + * \param keyType debug enable + * + * \return Status error code. + * + * Generate a Diffie-Hellman key from a remote public key and the local private key. If another + * ECC operation (P-256 key pair or Diffie-Hellman key generation) is ongoing, an error will be + * returned. If keyType == 1, debug keys will be used in place for the keys. + */ +/*************************************************************************************************/ +uint8_t LlGenerateDhKeyV2(uint8_t pubKey_x[LL_ECC_KEY_LEN], uint8_t pubKey_y[LL_ECC_KEY_LEN], uint8_t keyType); + /*************************************************************************************************/ /*! * \brief Set P-256 private key for debug purposes. @@ -1736,6 +1961,18 @@ uint8_t LlGenerateDhKey(const uint8_t pubKey_x[LL_ECC_KEY_LEN], const uint8_t pu /*************************************************************************************************/ uint8_t LlSetP256PrivateKey(const uint8_t privKey[LL_ECC_KEY_LEN]); +/*************************************************************************************************/ +/*! + * \brief Set validate public key mode. + * + * \param validateMode ALT1 or ALT2. + * + * \return Status error code. + * + */ +/*************************************************************************************************/ +uint8_t LlSetValidatePublicKeyMode(uint8_t validateMode); + /*************************************************************************************************/ /*! * \brief Set channel class. @@ -1749,6 +1986,22 @@ uint8_t LlSetP256PrivateKey(const uint8_t privKey[LL_ECC_KEY_LEN]); /*************************************************************************************************/ uint8_t LlSetChannelClass(const uint8_t *pChanMap); +/*************************************************************************************************/ +/*! + * \brief Set HCI supported command + * + * \param byte Byte location of command + * \param bit Bit location of command + * \param enable Enable or disable command + * + * \return Status error code + * + * This will not set a command to supported if it is not actually supported by the device. + * It will only "emulate" non-support of supported commands. + */ +/*************************************************************************************************/ +uint8_t LlSetHciSupCmd(uint8_t byte, uint8_t bit, bool_t enable); + /*************************************************************************************************/ /*! * \brief Set operational mode flags. @@ -1886,6 +2139,20 @@ void LlAdvEnable(uint8_t enable); /*************************************************************************************************/ uint8_t LlSetAdvSetRandAddr(uint8_t handle, const uint8_t *pAddr); +/*************************************************************************************************/ +/*! + * \brief Get periodic channel map. + * + * \param handle Periodic advertiser/scanner handle. + * \param isAdv TRUE for periodic advertiser, FALSE for periodic scanner. + * + * \return 64-bit formatted channel mask. + * + * Get the 64-bit channel mask of the channel map + */ +/*************************************************************************************************/ +uint64_t LlGetPeriodicChanMap(uint16_t handle, bool_t isAdv); + /*************************************************************************************************/ /*! * \brief Get advertising set random device address. @@ -2343,6 +2610,94 @@ uint8_t LlClearPeriodicAdvList(void); /*************************************************************************************************/ uint8_t LlReadPeriodicAdvListSize(uint8_t *pListSize); +/*************************************************************************************************/ +/*! + * \brief Enable or disable reports for the periodic advertising sync. + * + * \param syncHandle Periodic sync handle. + * \param enable 1 to enable reports, 0 to disable reports. + * + * \return Status error code. + * + * Enable or disable reports for the periodic advertising sync. + */ +/*************************************************************************************************/ +uint8_t LlSetPeriodicAdvRcvEnable(uint16_t syncHandle, uint8_t enable); + +/*************************************************************************************************/ +/*! + * \brief Initialize LL subsystem for PAST(Periodic advertising sync transfer). + * + * \return None. + * + * This function initializes the LL subsystem for PAST(Periodic advertising sync transfer). + */ +/*************************************************************************************************/ +void LlPastInit(void); + +/*************************************************************************************************/ +/*! + * \brief Send sync info about periodic advertising to a connected device. + * + * \param connHandle Connection handle. + * \param serviceData Service data provided by the host. + * \param syncHandle Periodic sync handle. + * + * \return Status error code. + * + * Send sync info about periodic advertising to a connected device. + */ +/*************************************************************************************************/ +uint8_t LlPeriodicAdvSyncTransfer(uint16_t connHandle, uint16_t serviceData, uint16_t syncHandle); + +/*************************************************************************************************/ +/*! + * \brief Send sync info about periodic adv in an advertising set to a connected device. + * + * \param connHandle Connection handle. + * \param serviceData Service data provided by the host. + * \param advHandle Handle to identify an advertising set. + * + * \return Status error code. + * + * Send sync info about periodic adv in an advertising set to a connected device. + */ +/*************************************************************************************************/ +uint8_t LlPeriodicAdvSetInfoTransfer(uint16_t connHandle, uint16_t serviceData, uint8_t advHandle); + +/*************************************************************************************************/ +/*! + * \brief Set periodic advertising sync transfer parameters. + * + * \param connHandle Connection handle. + * \param mode Periodic sync advertising sync transfer mode. + * \param skip The number of periodic advertising packets that can be skipped after a successful receive. + * \param syncTimeout Synchronization timeout for the periodic advertising. + * \param cteType Constant tone extension type(Used in AoD/AoA). + * + * \return Status error code. + * + * Set periodic advertising sync transfer parameters. + */ +/*************************************************************************************************/ +uint8_t LlSetPeriodicAdvSyncTransParams(uint16_t connHandle, uint8_t mode, uint16_t skip, uint16_t syncTimeout, uint8_t cteType); + +/*************************************************************************************************/ +/*! + * \brief Set default periodic advertising sync transfer parameters. + * + * \param mode Periodic sync advertising sync transfer mode. + * \param skip The number of periodic advertising packets that can be skipped after a successful receive. + * \param syncTimeout Synchronization timeout for the periodic advertising. + * \param cteType Constant tone extension type(Used in AoD/AoA). + * + * \return Status error code. + * + * Set default periodic advertising sync transfer parameters. + */ +/*************************************************************************************************/ +uint8_t LlSetDefaultPeriodicAdvSyncTransParams(uint8_t mode, uint16_t skip, uint16_t syncTimeout, uint8_t cteType); + /*! \} */ /* LL_API_OBSERVER */ /*! \addtogroup LL_API_CONN @@ -2658,6 +3013,17 @@ uint8_t LlSetLocalMinUsedChan(uint8_t phys, int8_t pwrThres, uint8_t minUsedCh); /*************************************************************************************************/ uint8_t LlGetPeerMinUsedChan(uint16_t handle, uint8_t *pPeerMinUsedChan); +/*************************************************************************************************/ +/*! + * \brief Used to read the sleep clock accuracy of the peer device. + * + * \param aclHandle Handle of the ACL. + * + * \return Status error code. + */ +/*************************************************************************************************/ +uint8_t LlRequestPeerSca(uint16_t aclHandle); + /*! \} */ /* LL_API_CONN */ /*! \addtogroup LL_API_CENTRAL @@ -2860,6 +3226,33 @@ uint8_t LlGetAclTxBufs(void); /*************************************************************************************************/ uint8_t LlGetAclRxBufs(void); +/*************************************************************************************************/ +/*! + * \brief Get the maximum ISO buffers size between host and controller. + * + * \return Maximum buffers size in bytes. + */ +/*************************************************************************************************/ +uint16_t LlGetIsoMaxBufSize(void); + +/*************************************************************************************************/ +/*! + * \brief Get the number of buffers in the LL ISO transmit queue. + * + * \return Number of buffers. + */ +/*************************************************************************************************/ +uint8_t LlGetIsoTxBufs(void); + +/*************************************************************************************************/ +/*! + * \brief Get the number of buffers in the LL ISO receive queue. + * + * \return Number of buffers. + */ +/*************************************************************************************************/ +uint8_t LlGetIsoRxBufs(void); + /*************************************************************************************************/ /*! * \brief Send an ACL data packet. @@ -2999,6 +3392,17 @@ uint8_t LlEndTest(LlTestReport_t *pRpt); /*************************************************************************************************/ uint8_t LlSetTxTestErrorPattern(uint32_t pattern); +/*************************************************************************************************/ +/*! + * \brief Modify the sleep clock accuracy. + * + * \param action Increase or decrease the sleep clock accuracy. + * + * \return Status error code. + */ +/*************************************************************************************************/ +uint8_t LlModifySleepClockAccuracy(uint8_t action); + /*! \} */ /* LL_API_TEST */ /*! \addtogroup LL_API_DIAG @@ -3028,6 +3432,66 @@ void LlGetAdvSetContextSize(uint8_t *pMaxAdvSets, uint16_t *pAdvSetCtxSize); /*************************************************************************************************/ void LlGetConnContextSize(uint8_t *pMaxConn, uint16_t *pConnCtxSize); +/*************************************************************************************************/ +/*! + * \brief Get extended scan context size. + * + * \param pMaxExtScan Buffer to return the maximum number of extended scanners. + * \param pExtScanCtxSize Buffer to return the size in bytes of the extended scanner context. + * + * Return the advertising set context sizes. + */ +/*************************************************************************************************/ +void LlGetExtScanContextSize(uint8_t *pMaxExtScan, uint16_t *pExtScanCtxSize); + +/*************************************************************************************************/ +/*! + * \brief Get extended initiator context size. + * + * \param pMaxExtInit Buffer to return the maximum number of extended initiators. + * \param pExtInitCtxSize Buffer to return the size in bytes of the extended initiator context. + * + * Return the advertising set context sizes. + */ +/*************************************************************************************************/ +void LlGetExtInitContextSize(uint8_t *pMaxExtInit, uint16_t *pExtInitCtxSize); + +/*************************************************************************************************/ +/*! + * \brief Get periodic scan context size. + * + * \param pMaxPerScan Buffer to return the maximum number of periodic scanners. + * \param pPerScanCtxSize Buffer to return the size in bytes of the periodic scanner context. + * + * Return the advertising set context sizes. + */ +/*************************************************************************************************/ +void LlGetPerScanContextSize(uint8_t *pMaxPerScan, uint16_t *pPerScanCtxSize); + +/*************************************************************************************************/ +/*! + * \brief Get CIG context size. + * + * \param pMaxCig Buffer to return the maximum number of CIG. + * \param pCigCtxSize Buffer to return the size in bytes of the CIG context. + * + * Return the connection context sizes. + */ +/*************************************************************************************************/ +void LlGetCigContextSize(uint8_t *pMaxCig, uint16_t *pCigCtxSize); + +/*************************************************************************************************/ +/*! + * \brief Get CIS context size. + * + * \param pMaxCis Buffer to return the maximum number of CIS. + * \param pCisCtxSize Buffer to return the size in bytes of the CIS context. + * + * Return the connection context sizes. + */ +/*************************************************************************************************/ +void LlGetCisContextSize(uint8_t *pMaxCis, uint16_t *pCisCtxSize); + /*************************************************************************************************/ /*! * \brief Get the LL handler watermark level. @@ -3040,6 +3504,250 @@ uint16_t LlStatsGetHandlerWatermarkUsec(void); /*! \} */ /* LL_API_DIAG */ +/*! \addtogroup LL_API_CIS + * \{ */ + +/*************************************************************************************************/ +/*! + * \brief Used by a master host to set the parameters of all connected isochronous streams + * associated with a connected isochronous group in the controller. + * + * \param pSetCigParam CIG parameters. + * \param pCisHandles Return buffer for the connected isochronous stream handles. + * + * \return Status error code. + */ +/*************************************************************************************************/ +uint8_t LlSetCigParams(LlCisCigParams_t *pSetCigParam, uint16_t *pCisHandles); + +/*************************************************************************************************/ +/*! + * \brief Used by a master Host to set the parameters of all connected isochronous streams + * associated with a connected isochronous group in the controller for testing purpose. + * + * \param pSetCigParamTest CIG test parameters. + * \param pCisHandles Return buffer for the connected isochronous stream handles. + * + * \return Status error code. + */ +/*************************************************************************************************/ +uint8_t LlSetCigParamsTest(LlCisCigParamsTest_t *pSetCigParamTest, uint16_t *pCisHandles); + +/*************************************************************************************************/ +/*! + * \brief Used by the master host to establish one or more connected isochronous streams. + * + * \param numCis Number of connected isochronous streams. + * \param pCreateCisParam Parameters for create connected isochronous stream. + * + * \return Status error code. + */ +/*************************************************************************************************/ +uint8_t LlCreateCis(uint8_t numCis, LlCisCreateCisParams_t *pCreateCisParam); + +/*************************************************************************************************/ +/*! + * \brief Removes all the connected isochronous streams which have previously been set up. + * + * \param cigId Identifier of the connected isochronous group. + * + * \return Status error code. + */ +/*************************************************************************************************/ +uint8_t LlRemoveCig(uint8_t cigId); + +/*************************************************************************************************/ +/*! + * \brief Used by the slave host to inform the controller to accept the request for the + * connected isochronous stream. + * + * \param cisHandle Handle of the connected isochronous stream. + * + * \return Status error code. + */ +/*************************************************************************************************/ +uint8_t LlAcceptCisReq(uint16_t cisHandle); + +/*************************************************************************************************/ +/*! + * \brief Used by the slave host to inform the controller to reject the request for the + * connected isochronous stream. + * + * \param cisHandle Handle of the connected isochronous stream. + * \param reason Indicate the reason for rejecting the request. + * + * \return Status error code. + */ +/*************************************************************************************************/ +uint8_t LlRejectCisReq(uint16_t cisHandle, uint8_t reason); + +/*************************************************************************************************/ +/*! + * \brief Used to identify and enable the isochronous data path between the host and the + * controller for each connected isochronous stream or broadcast isochronous stream. + * + * \param pSetupDataPathParam Parameters for setup ISO data path. + * + * \return Status error code. + */ +/*************************************************************************************************/ +uint8_t LlSetupIsoDataPath(LlIsoSetupDataPathParams_t *pSetupDataPathParam); + +/*************************************************************************************************/ +/*! + * \brief Used to remove the isochronous data path associated with the + * connected isochronous stream or broadcast isochronous stream. + * + * \param isoHandle Handle for CIS or BIS. + * + * \return Status error code. + */ +/*************************************************************************************************/ +uint8_t LlRemoveIsoDataPath(uint16_t isoHandle); + +/*************************************************************************************************/ +/*! + * \brief Initialize LL subsystem for operation for slave connected isochronous stream. + * + * \return None. + * + * This function initializes the LL subsystem for use as a slave connected isochronous stream. + */ +/*************************************************************************************************/ +void LlCisSlaveInit(void); + +/*************************************************************************************************/ +/*! + * \brief Initialize LL subsystem for operation for master connected isochronous stream. + * + * \return None. + * + * This function initializes the LL subsystem for use as a master connected isochronous stream. + */ +/*************************************************************************************************/ +void LlCisMasterInit(void); + +/*************************************************************************************************/ +/*! + * \brief Initialize memory for CIS. + * + * \param pFreeMem Pointer to free memory. + * \param freeMemSize Size of pFreeMem. + * + * \return Amount of free memory consumed. + * + * This function allocates memory for CIS. + * + * \note This routine must be called after LlInitRunTimeCfg() but only once before any + * other initialization routines. + */ +/*************************************************************************************************/ +uint16_t LlInitCisMem(uint8_t *pFreeMem, uint32_t freeMemSize); + +/*************************************************************************************************/ +/*! + * \brief Initialize memory for ISO. + * + * \param pFreeMem Pointer to free memory. + * \param freeMemSize Size of pFreeMem. + * + * \return Amount of free memory consumed. + * + * This function allocates memory for CIS. + * + * \note This routine must be called after LlInitRunTimeCfg() but only once before any + * other initialization routines. + */ +/*************************************************************************************************/ +uint16_t LlInitIsoMem(uint8_t *pFreeMem, uint32_t freeMemSize); + +/*************************************************************************************************/ +/*! + * \brief Send an ISO data packet. + * + * \param pData Data buffer + * + * \return None. + * + * Send an ISO data packet. pData points to an ISO buffer formatted according to [1]; the host + * must set the connection handle, flags, and length fields in the buffer. + */ +/*************************************************************************************************/ +void LlSendIsoData(uint8_t *pData); + +/*************************************************************************************************/ +/*! + * \brief Receive an ISO data packet + * + * \return Data buffer. + * + * Receive an ISO data packet. This function returns a pointer to an ISO buffer formatted + * according to [1]. The host must parse the header to determine the connection handle, flags, + * and length fields. If no ISO buffers are available this function returns NULL. + * + * The host must deallocate the buffer by calling WsfMsgFree() and call LlRecvBufCmpl() to + * update LL accounting. + */ +/*************************************************************************************************/ +uint8_t *LlRecvIsoData(void); + +/*************************************************************************************************/ +/*! + * \brief Indicate that received ISO data buffer has been deallocated + * + * \param numBufs Number of completed packets. + * + * \return None. + * + * Indicate that received ISO data buffer has been deallocated. + */ +/*************************************************************************************************/ +void LlRecvIsoDataComplete(uint8_t numBufs); + +/*************************************************************************************************/ +/*! + * \brief Enable ISO Tx test. + * + * \param isoHandle CIS or BIS handle. + * \param plLen Payload length type. + * + * \return Status error code. + * + */ +/*************************************************************************************************/ +uint8_t LlIsoTxTest(uint16_t isoHandle, uint8_t plLen); + +/*************************************************************************************************/ +/*! + * \brief Enable ISO Rx test. + * + * \param isoHandle CIS or BIS handle. + * \param plLen Payload length type. + * + * \return Status error code. + * + */ +/*************************************************************************************************/ +uint8_t LlIsoRxTest(uint16_t isoHandle, uint8_t plLen); + +/*************************************************************************************************/ +/*! + * \brief ISO read test counter. + * + * \param isoHandle CIS or BIS handle. + * \param pRcvedPlCounter Pointer to the received payload counter as return parameter. + * \param pMissedPlCounter Pointer to the missed payload counter as return parameter. + * \param pFailedPlCounter Pointer to the failed payload counter as return parameter. + * \param termTest TRUE if terminate the test, FALSE otherwise. + * + * \return Status error code. + * + */ +/*************************************************************************************************/ +uint8_t LlIsoReadTestCounter(uint16_t isoHandle, uint32_t *pRcvedPlCounter, uint32_t *pMissedPlCounter, uint32_t *pFailedPlCounter, bool_t termTest); + +/*! \} */ /* LL_API_CIS */ + #ifdef __cplusplus }; #endif diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/ll_defs.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_defs.h similarity index 70% rename from features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/ll_defs.h rename to features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_defs.h index 12eb4dd7e4..3e50ac5172 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/ll_defs.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_defs.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer constant definitions. + * \file + * \brief Link layer constant definitions. */ /*************************************************************************************************/ @@ -39,6 +40,9 @@ extern "C" { #define LL_VER_BT_CORE_SPEC_4_1 0x07 /*!< Bluetooth core specification 4.1 */ #define LL_VER_BT_CORE_SPEC_4_2 0x08 /*!< Bluetooth core specification 4.2 */ #define LL_VER_BT_CORE_SPEC_5_0 0x09 /*!< Bluetooth core specification 5.0 */ +#define LL_VER_BT_CORE_SPEC_5_1 0x0A /*!< Bluetooth core specification 5.1 */ +#define LL_VER_BT_CORE_SPEC_MILAN 0x0B /*!< Bluetooth core specification Milan */ +#define LL_VER_BT_CORE_SPEC_SYDNEY 0x0C /*!< Bluetooth core specification Sydney */ #define LL_COMP_ID_ARM 0x005F /*!< ARM Ltd. company ID. */ @@ -131,7 +135,7 @@ enum { LL_EXT_HDR_ADV_ADDR_BIT = (1 << 0), /*!< Extended header AdvA bit. */ LL_EXT_HDR_TGT_ADDR_BIT = (1 << 1), /*!< Extended header TargetA bit. */ - LL_EXT_HDR_SUPP_INFO_BIT = (1 << 2), /*!< Extended header SuppInfo bit. */ + LL_EXT_HDR_CTE_INFO_BIT = (1 << 2), /*!< Extended header CTEInfo bit. */ LL_EXT_HDR_ADI_BIT = (1 << 3), /*!< Extended header AdvDataInfo bit. */ LL_EXT_HDR_AUX_PTR_BIT = (1 << 4), /*!< Extended header AuxPtr bit. */ LL_EXT_HDR_SYNC_INFO_BIT = (1 << 5), /*!< Extended header SyncInfo bit. */ @@ -141,10 +145,14 @@ enum #define LL_MAX_ADV_HANDLE 0xEF /*!< Maximum advertising handle. */ #define LL_MAX_ADV_SID 0x0F /*!< Maximum advertising SID */ -#define LL_EXT_ADV_HDR_MIN_LEN 1 /*!< Minimum extended advertising header length (ExtHdrLen and AdvMode fields). */ -#define LL_EXT_ADV_HDR_MAX_LEN 64 /*!< Maximum extended advertising header length (ExtHdrLen, AdvMode fields and Extended header). */ -#define LL_EXT_ADVBU_MAX_LEN 251 /*!< Maximum extended advertising channel PDU host data length. */ -#define LL_EXT_ADVB_MAX_LEN 257 /*!< Maximum extended advertising channel PDU length. */ +#define LL_EXT_ADV_HDR_MIN_LEN 1 /*!< Minimum extended advertising header length (ExtHdrLen and AdvMode fields). */ +#define LL_EXT_ADV_HDR_MAX_LEN 64 /*!< Maximum extended advertising header length (ExtHdrLen, AdvMode fields and Extended header). */ +#define LL_EXT_HDR_FLAG_LEN 1 /*!< Length of extended header flag field */ +#define LL_EXT_ADVBU_MAX_LEN 251 /*!< Maximum extended advertising channel PDU host data length. */ +#define LL_EXT_ADVB_MAX_LEN 257 /*!< Maximum extended advertising channel PDU length. */ +#define LL_EXT_ADVB_NORMAL_LEN 50 /*!< Normal extended advertising channel PDU length. */ + +#define LL_EXT_HDR_ACAD_MAX_LEN LL_EXT_ADV_HDR_MAX_LEN - LL_EXT_ADV_HDR_MIN_LEN - LL_EXT_HDR_FLAG_LEN /*!< Maximum possible ACAD length (Max extended header minus ExtHdrLen, AdvMode, and extended header flag field. */ #define LL_EXT_ADVB_MAX_TIME_1M ((LL_BLE_US_PER_BYTE_1M * (LL_EXT_ADVB_MAX_LEN - LL_ADV_HDR_LEN)) + LL_MIN_PKT_TIME_US_1M) /*!< Maximum time for a 1M advertising channel PDU. */ @@ -154,6 +162,8 @@ enum /*!< Maximum time for a Coded S2 advertising channel PDU. */ #define LL_EXT_ADVB_MAX_TIME_S8 ((LL_BLE_US_PER_BYTE_CODED_S8 * (LL_EXT_ADVB_MAX_LEN - LL_ADV_HDR_LEN)) + LL_MIN_PKT_TIME_US_CODED_S8) /*!< Maximum time for a Coded S8 advertising channel PDU. */ +#define LL_EXT_ADVB_NORMAL_TIME_S8 ((LL_BLE_US_PER_BYTE_CODED_S8 * (LL_EXT_ADVB_NORMAL_LEN - LL_ADV_HDR_LEN)) + LL_MIN_PKT_TIME_US_CODED_S8) + /*!< Time for a Coded S8 advertising channel PDU with normal length. */ #define LL_AUX_PTR_MAX_USEC 2457600 /*!< Maximum AuxPtr offset value in microseconds. */ @@ -164,6 +174,17 @@ enum #define LL_PER_ADV_INT_MIN 0x0006 /*!< Minimum periodic advertising interval. */ +#define LL_SYNC_OFFS_ADJUST_USEC LL_AUX_PTR_MAX_USEC /*!< Sync offset adjust of 2.4576 seconds. */ +#define LL_SYNC_INFO_LEN 18 /*!< Size of SyncInfo field. */ + +/*! \brief Periodic sync transfer receive mode. */ +enum +{ + LL_SYNC_TRSF_MODE_OFF = 0, /*!< Periodic sync transfer receive is disabled. */ + LL_SYNC_TRSF_MODE_REP_DISABLED = 1, /*!< Periodic sync transfer receive is enabled, report event is disabled. */ + LL_SYNC_TRSF_MODE_REP_ENABLED = 2, /*!< Periodic sync transfer receive is enabled, report event is enabled. */ + LL_SYNC_TRSF_MAX_MODE = LL_SYNC_TRSF_MODE_REP_ENABLED +}; /*** Data PDU ***/ @@ -199,6 +220,17 @@ enum LL_PDU_PHY_RSP = 0x17, /*!< PHY response PDU. */ LL_PDU_PHY_UPDATE_IND = 0x18, /*!< PHY update indication PDU. */ LL_PDU_MIN_USED_CHAN_IND = 0x19, /*!< Minimum used channels indication PDU. */ + /* --- Core Spec 5.1 --- */ + // 0x1A 0x1B for AOA AOD, 0x1C for PAST 0x20 RFU + LL_PDU_PERIODIC_SYNC_IND = 0x1C, /*!< Periodic sync indication PDU. */ + /* --- Core Spec Milan --- */ + LL_PDU_PEER_SCA_REQ = 0x1D, /*!< Peer SCA request PDU. */ + LL_PDU_PEER_SCA_RSP = 0x1E, /*!< Peer SCA response PDU. */ + LL_PDU_CIS_REQ = 0x1F, /*!< CIS request PDU. */ + LL_PDU_CIS_RSP = 0x21, /*!< CIS response PDU. */ + LL_PDU_CIS_IND = 0x22, /*!< CIS indication PDU. */ + LL_PDU_CIS_TERM_IND = 0x23, /*!< CIS terminate indication PDU. */ + LL_PDU_UNSPECIFIED = 0xFF /*!< Unspecified PDU. */ }; @@ -224,6 +256,17 @@ enum #define LL_PHY_PDU_LEN 3 /*!< PHY request/response PDU length. */ #define LL_PHY_UPD_IND_PDU_LEN 5 /*!< PHY update indication PDU length. */ #define LL_MIN_USED_CHAN_PDU_LEN 3 /*!< Minimum used channels indication PDU length. */ +/* --- Core Spec 5.1 --- */ +#define LL_PERIODIC_SYNC_PDU_LEN 35 /*!< Periodic sync indication PDU length. */ +/* --- Core Spec Milan --- */ +#define LL_PEER_SCA_REQ_LEN 2 /*!< Peer SCA request PDU length. */ +#define LL_PEER_SCA_RSP_LEN 2 /*!< Peer SCA response PDU length. */ +#define LL_CIS_REQ_LEN 34 /*!< CIS request PDU length. */ +#define LL_CIS_RSP_LEN 9 /*!< CIS response PDU length. */ +#define LL_CIS_IND_LEN 16 /*!< CIS indication PDU length. */ +#define LL_CIS_TERM_LEN 4 /*!< CIS termination PDU length. */ +#define LL_CIS_SDU_CONFIG_REQ_LEN 13 /*!< CIS SDU config request PDU length. */ +#define LL_CIS_SDU_CONFIG_RSP_LEN 4 /*!< CIS SDU config response PDU length. */ #define LL_EMPTY_PDU_LEN 2 /*!< Length of an empty data PDU. */ @@ -236,6 +279,12 @@ enum #define LL_MAX_NUM_CHAN_DATA 37 /*!< Maximum number of used data channels. */ #define LL_MIN_NUM_CHAN_DATA 2 /*!< Minimum number of used data channels. */ +#define LL_ISO_DATA_HDR_LEN 2 /*!< ISO data PDU header length. */ +#define LL_ISO_DATA_MIC_LEN 4 /*!< ISO data PDU MIC length. */ + +#define LL_ISO_DATA_HDR_LLID_MSK 0x03 /*!< ISO data PDU LLID mask. */ +#define LL_ISO_DATA_HDR_LEN_MSK 0xFF /*!< ISO Data header length mask. */ + /*! \brief Data PDU LLID types. */ enum { @@ -281,6 +330,7 @@ enum #define LL_MAX_DATA_TIME_MIN 328 /*!< Minimum value for maximum Data PDU time */ #define LL_MAX_DATA_TIME_ABS_MAX 17040 /*!< Absolute maximum limit for maximum Data PDU time */ #define LL_MAX_DATA_TIME_ABS_MAX_1M 2120 /*!< Absolute maximum limit for maximum Data PDU time (LE 1M PHY) */ +#define LL_MAX_DATA_TIME_ABS_MIN_CODED 2704 /*!< Absolute minimum limit for maximum Data PDU time (CODED PHY) */ #define LL_T_PRT_SEC 40 /*!< LLCP procedure response timeout in seconds. */ @@ -303,6 +353,67 @@ enum #define LL_MAX_PHYS 3 /*!< Number of LE PHYs. */ #define LL_ALL_PHYS_MSK 0x7 /*!< All supported LE PHYs mask. */ +/*** ISO ***/ +#define LL_MAX_ISO_DATA_LEN_ABS_MAX 251 /*!< Absolute maximum limit for maximum ISO Data PDU length */ + +#define LL_MAX_CIS_COUNT 0x10 /*!< Maximum count for CIS. */ + +#define LL_MIN_CIG_ID 0x00 /*!< Minimum value for CIG ID. */ +#define LL_MAX_CIG_ID 0xEF /*!< Maximum value for CIG ID. */ + +#define LL_MIN_CIS_ID 0x00 /*!< Minimum value for CIS ID. */ +#define LL_MAX_CIS_ID 0xEF /*!< Maximum value for CIS ID. */ + +#define LL_MIN_ISO_INTERV 0x0004 /*!< Minimum value for ISO interval. */ +#define LL_MAX_ISO_INTERV 0x0C80 /*!< Maximum value for ISO interval. */ + +#define LL_MIN_ISOAL_PDU_TYPE 0x00 /*!< Minimum value for ISOAL PDU type. */ +#define LL_MAX_ISOAL_PDU_TYPE 0x01 /*!< Maximum value for ISOAL PDU type. */ + +#define LL_MIN_SDU_SIZE 0x000 /*!< Minimum value for SDU size. */ +#define LL_MAX_SDU_SIZE 0xFFF /*!< Maximum value for SDU size. */ + +#define LL_MIN_SDU_INTERV 0x000FF /*!< Minimum value for SDU interval. */ +#define LL_MAX_SDU_INTERV 0xFFFFF /*!< Maximum value for SDU interval. */ + +#define LL_MIN_CIS_NSE 0x00 /*!< Minimum value for CIS number of subevent. */ +#define LL_MAX_CIS_NSE 0x1F /*!< Maximum value for CIS number of subevent. */ + +#define LL_MIN_CIS_PL 0x00 /*!< Minimum value for CIS payload. */ +#define LL_MAX_CIS_PL 0xFB /*!< Maximum value for CIS payload. */ + +#define LL_MIN_CIS_PHY_BIT 0x00 /*!< Minimum value for CIS PHY bit. */ +#define LL_MAX_CIS_PHY_BIT 0x02 /*!< Maximum value for CIS PHY bit. */ + +#define LL_MIN_CIS_FT 0x01 /*!< Minimum value for CIS flush time. */ +#define LL_MAX_CIS_FT 0x1F /*!< Maximum value for CIS flush time. */ + +#define LL_MIN_CIS_BN 0x00 /*!< Minimum value for CIS burst number. */ +#define LL_MAX_CIS_BN 0x10 /*!< Maximum value for CIS burst number. */ + +/*! \brief ISO PDU LLID types. */ +enum +{ + LL_ISO_LLID_CIS_DATA_PDU = 0x00, /*!< CIS data PDU. */ + LL_ISO_LLID_BIS_DATA_PDU = 0x00, /*!< BIS data PDU. */ + LL_ISO_LLID_BIS_CTRL_PDU = 0x03, /*!< BIS control PDU. */ +}; + +/*! \brief ISO PDU types. */ +enum +{ + LL_ISO_PDU_TYPE_UNFRAMED = 0x00, /*!< Unframed PDU type. */ + LL_ISO_PDU_TYPE_FRAMED = 0x01, /*!< framed PDU type. */ +}; + +/*! \brief ISO PDU types. */ +enum +{ + LL_ISO_TEST_PL_LEN_MAX = 0x00, /*!< \brief Maximum length test payload */ + LL_ISO_TEST_PL_LEN_VAR = 0x01, /*!< \brief Maximum length test payload */ + LL_ISO_TEST_PL_LEN_ZERO = 0x02, /*!< \brief Maximum length test payload */ +}; + /*** DTM ***/ #define LL_DTM_HDR_LEN 2 /*!< Direct Test Mode PDU header length. */ @@ -328,6 +439,7 @@ enum #define LL_BLE_TIFS_US 150 /*!< BLE inter-frame space. */ #define LL_BLE_MAFS_US 300 /*!< BLE minimum AUX frame space. */ #define LL_BLE_US_PER_TICK 625 /*!< Microseconds per BLE tick. */ +#define LL_BLE_TMSS_US 150 /*!< BLE minimum subevent space. */ #define LL_MIN_PKT_TIME_US_1M 80 /*!< Minimum packet time (i.e. empty PDU) on LE 1M PHY. */ #define LL_MIN_PKT_TIME_US_2M 44 /*!< Minimum packet time (i.e. empty PDU) on LE 2M PHY. */ @@ -342,7 +454,36 @@ enum #define LL_MAX_TIFS_DEVIATION 2 /*!< Maximum TIFS deviation in microseconds. */ -#define LL_MAX_CE_DEVIATION_USEC 16 /*!< Maximum connection event deviation in microseconds. */ +#define LL_WW_RX_DEVIATION_USEC 16 /*!< RX deviation in microseconds for window widening. */ + +#define LL_30_USEC_OFFS_MAX_USEC 245730 /*!< Maximum value for 30 microseconds offset unit in microseconds. */ + +/*** ACAD ***/ + +/*! \brief ACAD opcodes. */ +enum +{ + LL_ACAD_OPCODE_CHANNEL_MAP_UPDATE = 0x28 /*!< Opcode for acad update periodic channel map ind. */ +}; +#define LL_ACAD_OPCODE_LEN 1 /*!< Length of a single Acad opcode. */ +#define LL_INSTANT_LEN 2 /*!< Length of instant field (event counter). */ +#define LL_ACAD_LEN_FIELD_LEN 1 /*!< Length of Acad length field */ +#define LL_ACAD_CHAN_MAP_LEN 5 /*!< Length of channel map rounded to nearest byte */ + +#define LL_ACAD_DATA_FIELD_MAX_LEN LL_EXT_HDR_ACAD_MAX_LEN - LL_ACAD_OPCODE_LEN - LL_ACAD_LEN_FIELD_LEN /*!< Length of max ACAD field length without opcode and length field */ + +#define LL_ACAD_UPDATE_CHANNEL_MAP_LEN LL_ACAD_OPCODE_LEN + LL_ACAD_CHAN_MAP_LEN + LL_INSTANT_LEN /*!< Length of acad update periodic channel map data field. */ + +/*** Modify Sleep Clock Accuracy ***/ +/*! \brief Action parameter. */ +enum +{ + LL_MODIFY_SCA_MORE_ACCURATE = 0x00, /*!< Modify to more accurate clock accuracy. */ + LL_MODIFY_SCA_LESS_ACCURATE = 0x01, /*!< Modify to less accurate clock accuracy. */ + LL_MODIFY_SCA_NO_ACTION /*!< No action (Used for request sca tester command). */ +}; +#define LL_SCA_MIN_INDEX 0 /*!< Index for lowest accuracy clock. */ +#define LL_SCA_MAX_INDEX 7 /*!< Index for highest accuracy clock. */ #ifdef __cplusplus }; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_init_api.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_init_api.h index abf04fb06b..918df1f0e1 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_init_api.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_init_api.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,20 @@ /*************************************************************************************************/ /*! - * \brief LL initialization implementation file. + * \file + * \brief LL initialization implementation file. + * + * Initialization conditional compilation are used to control LL initialization options. + * Define one or more of the following to enable roles and features. + * + * - INIT_BROADCASTER (default) + * - INIT_OBSERVER + * - INIT_PERIPHERAL + * - INIT_CENTRAL + * - INIT_ENCRYPTED + * - BT_VER + * + * \note Each feature may require additional \ref LlRtCfg_t requirements. */ /*************************************************************************************************/ @@ -45,6 +58,11 @@ extern "C" { #define INIT_BROADCASTER #endif +#ifndef BT_VER +/*! \brief Initialize default BT version. */ +#define BT_VER LL_VER_BT_CORE_SPEC_5_1 +#endif + /************************************************************************************************** Data Types **************************************************************************************************/ @@ -66,22 +84,20 @@ typedef struct **************************************************************************************************/ /* System initializers. */ -uint32_t LlInitStdInit(LlInitRtCfg_t *pCfg); -uint32_t LlInitExtInit(LlInitRtCfg_t *pCfg); +uint32_t LlInit(LlInitRtCfg_t *pCfg); uint32_t LlInitControllerInit(LlInitRtCfg_t *pCfg); -uint32_t LlInitControllerExtInit(LlInitRtCfg_t *pCfg); /* Intermediate initializers. */ uint32_t LlInitSetBbRtCfg(const BbRtCfg_t *pBbRtCfg, const uint8_t wlSizeCfg, const uint8_t rlSizeCfg, const uint8_t plSizeCfg, uint8_t *pFreeMem, uint32_t freeMemAvail); uint32_t LlInitSetLlRtCfg(const LlRtCfg_t *pLlRtCfg, uint8_t *pFreeMem, uint32_t freeMemAvail); void LlInitBbInit(void); -void LlInitBbAuxInit(void); void LlInitSchInit(void); -void LlInitLlInit(bool_t initHandler); +void LlInitLlInit(void); void LlInitChciTrInit(void); void LlInitLhciInit(void); void LlMathSetSeed(const uint32_t *pSeed); +void LlInitLhciHandler(void); /*! \} */ /* LL_INIT_API */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/ll_math.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_math.h similarity index 54% rename from features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/ll_math.h rename to features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_math.h index f6b43e8e42..7566689e34 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/ll_math.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_math.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link Layer math utilities. + * \file + * \brief Link Layer math utilities. */ /*************************************************************************************************/ #ifndef LL_MATH_H @@ -89,103 +90,6 @@ enum /*************************************************************************************************/ uint32_t LlMathRandNum(void); -/*************************************************************************************************/ -/*! - * \brief Calculate AES ECB. - * - * \param pKey Encryption key. - * \param pOut Output data. - * \param pIn Input data. - * - * \return None. - */ -/*************************************************************************************************/ -void LlMathAesEcb(const uint8_t *pKey, uint8_t *pOut, const uint8_t *pIn); - -/*************************************************************************************************/ -/*! - * \brief Set service callback for ECC generation. - * - * \param cback Callback to invoke when driver needs servicing. - * - * \return None. - */ -/*************************************************************************************************/ -void LlMathEccSetServiceCback(LlMathEccServiceCback_t cback); - -/*************************************************************************************************/ -/*! - * \brief Start generating P-256 key pair. - * - * \return None. - */ -/*************************************************************************************************/ -void LlMathEccGenerateP256KeyPairStart(void); - -/*************************************************************************************************/ -/*! - * \brief Start generating P-256 public key with a specified private key. - * - * \param pPrivKey Private key. - * - * \return None. - */ -/*************************************************************************************************/ -void LlMathEccGenerateP256PublicKeyStart(const uint8_t *pPrivKey); - -/*************************************************************************************************/ -/*! - * \brief Continue generating P-256 key pair. - * - * \return TRUE if key generation complete. - */ -/*************************************************************************************************/ -bool_t LlMathEccGenerateP256KeyPairContinue(void); - -/*************************************************************************************************/ -/*! - * \brief Get results from generating P-256 key pair. - * - * \param pPubKey Storage for public key. - * \param pPrivKey Storage for private key. - * - * \return None. - */ -/*************************************************************************************************/ -void LlMathEccGenerateP256KeyPairComplete(uint8_t *pPubKey, uint8_t *pPrivKey); - -/*************************************************************************************************/ -/*! - * \brief Start generating Diffie-Hellman key. - * - * \param pPubKey Public key. - * \param pPrivKey Private key. - * - * \return None. - */ -/*************************************************************************************************/ -void LlMathEccGenerateDhKeyStart(const uint8_t *pPubKey, const uint8_t *pPrivKey); - -/*************************************************************************************************/ -/*! - * \brief Continue generating Diffie-Hellman key. - * - * \return TRUE if Diffie-Hellman key generation complete. - */ -/*************************************************************************************************/ -bool_t LlMathEccGenerateDhKeyContinue(void); - -/*************************************************************************************************/ -/*! - * \brief Get results from generating Diffie-Hellman key. - * - * \param pDhKey Storage for Diffie-Hellman key. - * - * \return None. - */ -/*************************************************************************************************/ -void LlMathEccGenerateDhKeyComplete(uint8_t *pDhKey); - /*************************************************************************************************/ /*! * \brief Return the number of bits which are set. diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_tester_api.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_tester_api.h deleted file mode 100644 index 3532bd44ec..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/ll_tester_api.h +++ /dev/null @@ -1,320 +0,0 @@ -/* Copyright (c) 2009-2019 Arm Limited - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************************************/ -/*! - * \brief Link layer tester interface file. - */ -/*************************************************************************************************/ - -#ifndef LL_TESTER_API_H -#define LL_TESTER_API_H - -#include "wsf_types.h" -#include "ll_api.h" -#include "lctr_api.h" - -/* Access internal definitions. */ -#include "../../sources/ble/lctr/lctr_pdu_conn.h" - -/* Require compile time directive. */ -#if (LL_ENABLE_TESTER != TRUE) -#error "LL_ENABLE_TESTER compilation directive must be set to 1." -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/************************************************************************************************** - Constants -**************************************************************************************************/ - -/*! \brief Tester acknowledgement mode. */ -enum -{ - LL_TESTER_ACK_MODE_NORMAL = 0, /*!< Ack packets according to normal acknowledgement/flow control scheme. */ - LL_TESTER_ACK_MODE_NO_RX_ACK = 1, /*!< Do not acknowledge Rx packets. */ - LL_TESTER_ACK_MODE_IGNORE_TX_ACK = 2 /*!< Ignore acknowledgements of Tx packets. */ -}; - -#define LL_TESTER_TRIGGER_NONEMPTY 0xFE /*!< Trigger only on non-empty packets. */ -#define LL_TESTER_TRIGGER_ALWAYS 0xFF /*!< Always trigger. */ - -#define LL_TESTER_ADVB_MAX_LEN LL_ADVB_MAX_LEN + 4 /*!< Maximum allowed ADVB length. */ - -/************************************************************************************************** - Data Types -**************************************************************************************************/ - -/*! \brief Link layer tester control block */ -typedef struct -{ - /* Advertising channel override values. */ - /* Place here to 32-bit align. */ - uint8_t txAdvPdu[LL_TESTER_ADVB_MAX_LEN]; /*!< Advertising PDU override buffer. */ - uint32_t advAccessAddrRx; /*!< Advertising access address override (Rx). */ - uint32_t advAccessAddrTx; /*!< Advertising access address override (Tx). */ - /* Place here to 32-bit align. */ - uint8_t txScanReqPdu[LL_TESTER_ADVB_MAX_LEN]; /*!< Scan request PDU override buffer. */ - uint32_t advCrcInitRx; /*!< Advertising CRC value override (Rx). */ - uint32_t advCrcInitTx; /*!< Advertising CRC value override (Tx). */ - /* Place here to 32-bit align. */ - uint8_t txScanRspPdu[LL_TESTER_ADVB_MAX_LEN]; /*!< Scan response PDU override buffer. */ - bool_t txAdvPduLen; /*!< Advertising PDU override buffer length, 0 to disable. */ - bool_t txScanReqPduLen; /*!< Scan request PDU override buffer length, 0 to disable. */ - bool_t txScanRspPduLen; /*!< Scan response PDU override buffer length, 0 to disable. */ - - /* Extended advertising channel override values. */ - uint32_t auxAccessAddrRx; /*!< Auxiliary advertising access address override (Rx). */ - uint32_t auxAccessAddrTx; /*!< Auxiliary advertising access address override (Tx). */ - uint32_t auxCrcInitRx; /*!< Advertising CRC value override (Rx). */ - uint32_t auxCrcInitTx; /*!< Advertising CRC value override (Tx). */ - struct - { - uint8_t pduMatch; /*!< PDU type to override. */ - uint8_t len; /*!< Length of override buffer. */ - uint8_t buf[LL_CONN_IND_PDU_LEN]; - /*!< Override request buffer. */ - } auxReq; /*!< Auxiliary request buffer override parameters. */ - struct - { - uint16_t pduMatchMask; /*!< Enable override bitmask of PDU types. */ - uint8_t modifyMask; /*!< Enable extended header field override bitmask. */ - uint64_t AdvA; /*!< AdvA override value. */ - uint64_t TargetA; /*!< TargetA override value. */ - uint8_t SuppInfo; /*!< SuppInfo override value. */ - uint16_t ADI; /*!< ADI override value. */ - int8_t TxPower; /*!< TxPower override value. */ - } extHdr; /*!< Extended header override values. */ - - /* Data channel override values. */ - uint32_t dataAccessAddrRx; /*!< Data channel access address override (Rx). */ - uint32_t dataAccessAddrTx; /*!< Data channel access address override (Tx). */ - uint32_t dataCrcInitRx; /*!< Data channel CRC value override (Rx). */ - uint32_t dataCrcInitTx; /*!< Data channel CRC value override (Tx). */ - - /* Connection parameter override values. */ - bool_t connIndEnabled; /*!< Connection indication override packet enabled. */ - lctrConnInd_t connInd; /*!< Connection indication override packet. */ - bool_t connUpdIndEnabled; /*!< Connection update indication override packet enabled. */ - lctrConnUpdInd_t connUpdInd; /*!< Connection update indication override packet. */ - bool_t connParamReqEnabled;/*!< Connection parameter request override packet enabled. */ - lctrConnParam_t connParamReq; /*!< Connection parameter request override packet. */ - - /* Data length override values. */ - bool_t dataLenReqEnabled; /*!< Local Data PDU parameters enabled. */ - lctrDataLen_t dataLenReq; /*!< Local Data PDU parameters. */ - - uint32_t connIntervalUs; /*!< Connection interval override. */ - uint16_t eventCounterOffset; /*!< Event counter offset value. */ - - uint32_t txLlcpFilter; /*!< Filter for LLCP Tx. */ - uint32_t rxLlcpFilter; /*!< Filter for LLCP Rx. */ - bool_t dataTriggerEnabled; /*!< Trigger is enabled. */ - uint8_t dataTriggerPdu; /*!< PDU on which to trigger data. */ - bool_t dataTriggerAfter; /*!< Data sent after PDU. */ - - /* Packet override values. */ - uint32_t pktMic; /*!< Packet MIC override XOR value. */ - uint8_t pktLlId; /*!< Packet LLID override XOR value. */ - - /* LLCP handling. */ - bool_t llcpForwardEnabled; /*!< LLCP packet to host enable. */ - bool_t llcpLlcpIntercept; /*!< LLCP intercept enable. */ - - /* Acknowledgement/flow control. */ - uint8_t ackMode; /*!< Acknowledgement mode. */ - uint8_t ackTrigger; /*!< Rx datum or condition on which to trigger special ack handling. */ -} llTesterCtrlBlock_t; - -/************************************************************************************************** - Global Variables -**************************************************************************************************/ - -extern llTesterCtrlBlock_t llTesterCb; - -/************************************************************************************************** - Function Declarations -**************************************************************************************************/ - -/*! \addtogroup LL_TESTER_API_INIT - * \{ */ - -void LlTesterInit(void); - -/* \} */ - -/*! \addtogroup LL_TESTER_API_ADV_CHAN - * \{ */ - -/* Advertising channel override */ -void LlTesterSetAdvAccessAddr(uint32_t accessAddr, bool_t forRx); -void LlTesterSetAdvCrcInit(uint32_t crcInit, bool_t forRx); - -/* Advertising data exchange */ -uint8_t LlTesterSetTxAdvPdu(uint8_t *pBuf, uint8_t len); -uint8_t LlTesterSetTxScanReqPdu(uint8_t *pBuf, uint8_t len); -uint8_t LlTesterSetTxScanRspPdu(uint8_t *pBuf, uint8_t len); - -/* Extended advertising override */ -void LlTesterSetAuxAccessAddr(uint32_t accessAddr, bool_t forRx); -void LlTesterSetAuxCrcInit(uint32_t crcInit, bool_t forRx); -void LlTesterSetTxAuxReqPdu(uint8_t pduMatch, uint8_t *pBuf, uint8_t len); -void LlTesterSetExtAdvHdrFields(uint16_t pduMatchMask, uint8_t modifyMask, - uint8_t *pAdvA, uint8_t *pTargetA, uint8_t SuppInfo, uint16_t ADI, int8_t TxPower); - -/* \} */ - -/*! \addtogroup LL_TESTER_API_DATA_CHAN - * \{ */ - -/* Data channel override */ -void LlTesterSetDataAccessAddr(uint32_t accessAddr, bool_t forRx); -uint8_t LlTesterGetDataAccessAddr(uint16_t handle, uint32_t *pAccessAddr); -void LlTesterSetDataCrcInit(uint32_t crcInit, bool_t forRx); -uint8_t LlTesterGetDataCrcInit(uint16_t handle, uint32_t *pCrcInit); - -/* Data control override */ -void LlTesterSetConnInd(uint32_t accessAddr, uint32_t crcInit, uint8_t txWinSize, uint16_t txWinOffset, - uint16_t interval, uint16_t latency, uint16_t timeout, uint64_t chanMask, - uint8_t hopInc, uint8_t masterSca); -void LlTesterAdjConnInterval(uint32_t intervalUs); - -/* Data packet override */ -void LlTesterSetPktLlId(uint8_t id); -void LlTesterSetPktMic(uint32_t mic); - -/* Acknowledgement/flow control override */ -void LlTesterSetAckMode(uint8_t ackMode, uint8_t ackTrigger); - -/* Data exchange */ -uint8_t LlTesterTxDataPdu(uint16_t handle, uint8_t *pBuf, uint8_t len); - -/* \} */ - -/*! \addtogroup LL_TESTER_API_LLCP - * \{ */ - -void LlTesterForwardLlcpToHost(bool_t enable, bool_t intercept); -void LlTesterSetEventCounterOffset(uint16_t offset); -uint8_t LlTesterSendConnUpdInd(uint16_t handle, - uint8_t txWinSize, uint16_t txWinOffset, - uint16_t interval, uint16_t latency, uint16_t timeout); -uint8_t LlTesterSendConnParamReq(uint16_t handle, - uint16_t connIntervalMin, uint16_t connIntervalMax, - uint16_t connLatency, uint16_t supTimeout, uint8_t prefPeriod, - uint16_t refConnEvtCnt, uint16_t *pOffset); -uint8_t LlTesterSendDataLen(uint16_t handle, - uint16_t rxLen, uint16_t rxTime, - uint16_t txLen, uint16_t txTime); -uint8_t LlTesterSendPhyReq(uint16_t handle, uint8_t txPhys, uint8_t rxPhys); -uint8_t LlTesterSendPhyUpdateInd(uint16_t handle, uint8_t mToSPhy, uint8_t sToMPhy); -void LlTesterEnableRxFlowControl(bool_t enable); -void LlTesterSetTxLlcpFilter(uint32_t filter); -void LlTesterSetRxLlcpFilter(uint32_t filter); -void LlTesterSetDataTrigger(uint8_t pdu, bool_t enable, bool_t after); - -/* \} */ - -/*! \addtogroup LL_TESTER_API_BB - * \{ */ - -/*************************************************************************************************/ -/*! - * \brief Adjust Tx TIFS timing value. - * - * \param adjNs Adjustment value in nanoseconds. - * - * \return None. - * - * Adjust the TIFS timing of transmit by the given signed value of timer ticks. - * If adjustment value is out of range, maximum allowed value is used. - */ -/*************************************************************************************************/ -void BbTesterAdjTxTifsNs(int16_t adjNs); - -/*************************************************************************************************/ -/*! - * \brief Trigger channel modifications on matching Tx packet header. - * - * \param hdrMask Header mask. - * \param hdrValue Match value. - * - * \return None. - * - * Modify the transmit channel parameters of a packet only when the Tx packet header matches - * the given parameters. This applies to the modification parameter provided by the following - * routines: - * - * - \ref BbTesterSetInvalidCrcInit() - * - \ref BbTesterSetInvalidAccessAddress() - */ -/*************************************************************************************************/ -void BbTesterSetModifyTxPktTrigger(uint16_t hdrMask, uint16_t hdrValue); - -/*************************************************************************************************/ -/*! - * \brief Invalidate CRC initialization value. - * - * \param chanMask Invalidate channel mask. - * \param adjMask Number of adjustments (0 to disable). - * \param forRx TRUE for Rx, FALSE for Tx. - * - * \return None. - * - * Force the receiver to receive a packet with CRC error if the receive channel is in - * \b chanMask while stepping through the invalid pattern in \b invalidMask. - */ -/*************************************************************************************************/ -void BbTesterSetInvalidCrcInit(uint64_t chanMask, uint32_t adjMask, bool_t forRx); - -/*************************************************************************************************/ -/*! - * \brief Invalidate access address value. - * - * \param chanMask Invalidate channel mask. - * \param invalidMask Enable mask for invalidating access address (0 to disable). - * \param forRx TRUE for Rx, FALSE for Tx. - * - * \return None. - * - * Force the receiver to receive a miss a packet if the receive channel is in - * \b chanMask while stepping through the invalid pattern in \b invalidMask. - */ -/*************************************************************************************************/ -void BbTesterSetInvalidAccessAddress(uint64_t chanMask, uint32_t invalidMask, bool_t forRx); - -/*************************************************************************************************/ -/*! - * \brief Enable bypassing PDU filtering. - * - * \param enable If TRUE enable bypass PDU filtering, FALSE otherwise. - * - * \return None. - * - * Enable bypassing PDU filtering. - */ -/*************************************************************************************************/ -void BbTesterEnablePduFilterBypass(bool_t enable); - -/* \} */ - -#ifdef __cplusplus -}; -#endif - -#endif /* LL_TESTER_API_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/sch_api_ble.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/sch_api_ble.h index 9cd11b901c..c61ba8bd1f 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/sch_api_ble.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/ble/sch_api_ble.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer scheduler interface file. + * \file + * \brief Link layer scheduler interface file. */ /*************************************************************************************************/ @@ -30,6 +31,37 @@ extern "C" { #endif +/************************************************************************************************** + Macros +**************************************************************************************************/ + +/*! \brief Preferred periodicity. */ +#define SCH_RM_PREF_PER_USEC 10000 + +/*! \brief Preferred periodicity for connections. */ +#define SCH_RM_PREF_PER_CONN_USEC (SCH_RM_PREF_PER_USEC) + +/*! \brief Preferred periodicity for periodic sync. */ +#define SCH_RM_PREF_PER_SYNC_USEC (SCH_RM_PREF_PER_USEC * 4) + +/************************************************************************************************** + Constants +**************************************************************************************************/ + +/*! \brief Resource manager preference for setting interval. */ +enum +{ + SCH_RM_PREF_PERFORMANCE, /*!< Performance is preferred, search from minimum interval. */ + SCH_RM_PREF_CAPACITY /*!< Capacity is preferred, search from maximum interval. */ +}; + +/************************************************************************************************** + Data Types +**************************************************************************************************/ + +/*! \brief Get reference time callback signature. */ +typedef uint32_t (*GetRefTimeCb_t)(uint8_t handle, uint32_t *pDurUsec); + /************************************************************************************************** Function Declarations **************************************************************************************************/ @@ -37,19 +69,22 @@ extern "C" { /* Resource manager */ void SchRmInit(void); uint32_t SchRmPreferredPeriodUsec(void); -bool_t SchRmAdd(uint8_t handle, uint32_t minUsec, uint32_t maxUsec, uint32_t durUsec, uint32_t *pInterUsec); -bool_t SchRmStartUpdate(uint8_t handle, uint32_t minUsec, uint32_t maxUsec, uint32_t durUsec, uint32_t *pInterUsec); +uint32_t SchRmCalcCommonPeriodicityUsec(uint32_t peerPerUsec); +bool_t SchRmAdd(uint8_t handle, uint8_t pref, uint32_t minUsec, uint32_t maxUsec, uint32_t durUsec, uint32_t *pInterUsec, GetRefTimeCb_t refTimeCb); +bool_t SchRmStartUpdate(uint8_t handle, uint32_t minUsec, uint32_t maxUsec, uint32_t perfPerUsec, uint32_t durUsec, uint32_t *pInterUsec); void SchRmCommitUpdate(uint8_t handle); void SchRmRemove(uint8_t handle); void SchRmSetReference(uint8_t handle); -uint32_t SchRmGetOffsetUsec(uint32_t rsvnOffs[], uint32_t maxOffsUsec, uint8_t handle); +uint32_t SchRmGetOffsetUsec(uint32_t maxOffsUsec, uint8_t handle, uint32_t refTime); /* BLE time utilities */ uint32_t SchBleCalcDataPktDurationUsec(uint8_t phy, uint16_t len); uint32_t SchBleCalcAdvPktDurationUsec(uint8_t phy, uint8_t phyOptions, uint16_t len); +uint32_t SchBleCalcPerAdvDurationUsec(uint8_t txPhy, uint8_t fragLen, uint16_t addMafDelay, uint16_t len, bool_t worstCase, uint8_t phyOptions); uint32_t SchBleCalcAuxPktDurationUsec(uint8_t phy, uint8_t phyOptions, uint16_t len); -void SchBleCalcAdvOpDuration(BbOpDesc_t *pBod); +void SchBleCalcAdvOpDuration(BbOpDesc_t *pBod, uint8_t fragLen); bool_t SchBleGetNextMstConnDueTime(uint32_t *pDueTime); +uint32_t SchBleGetAlignedAuxOffsUsec(uint32_t auxOffsUsec); #ifdef __cplusplus }; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/bb_api.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/bb_api.h index 2522dd7225..5d98e45a52 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/bb_api.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/bb_api.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,10 +16,17 @@ /*************************************************************************************************/ /*! - * \brief Baseband interface file. + * \file + * \brief Baseband interface file. * * \addtogroup BB_API Baseband (BB) API * \{ + * + * The baseband porting layer is a protocol independent BB + radio abstraction layer. It allows + * the simultaneous operation of protocol specific schedulers to transport packets across each + * medium via a single multi-protocol baseband. This interface describes operations for the + * following protocols: + * * - Bluetooth low energy: advertising and connections * - ZigBee/802.15.4 (TBD) * - BAN/802.15.6 (TBD) @@ -73,86 +80,8 @@ extern "C" { /*! \addtogroup BB_API_BOD * \{ */ -/*! \brief Protocol types */ -enum -{ - BB_PROT_NONE, /*!< Non-protocol specific operation. */ - BB_PROT_BLE, /*!< Bluetooth Low Energy normal mode. */ - BB_PROT_BLE_DTM, /*!< Bluetooth Low Energy direct test mode. */ - BB_PROT_PRBS15, /*!< Enable the continuous PRBS15 transmit sequence. */ - BB_PROT_15P4, /*!< 802.15.4. */ - BB_PROT_NUM /*!< Number of protocols. */ -}; - -/*! \brief Status codes */ -enum -{ - BB_STATUS_SUCCESS, /*!< Operation successful. */ - BB_STATUS_FAILED, /*!< General failure. */ - BB_STATUS_CANCELED, /*!< Receive canceled. */ - BB_STATUS_RX_TIMEOUT, /*!< Receive packet timeout. */ - BB_STATUS_CRC_FAILED, /*!< Receive packet with CRC verification failed. */ - BB_STATUS_FRAME_FAILED, /*!< Receive packet with frame verification failed. */ - BB_STATUS_ACK_FAILED, /*!< ACK packet failure. */ - BB_STATUS_ACK_TIMEOUT, /*!< ACK packet timeout. */ - BB_STATUS_TX_CCA_FAILED, /*!< Transmit CCA failure. */ - BB_STATUS_TX_FAILED /*!< Transmit failure. */ -}; - -/*! \brief PHY types. */ -enum -{ - BB_PHY_BLE_1M = 1, /*!< Bluetooth Low Energy 1Mbps PHY. */ - BB_PHY_BLE_2M = 2, /*!< Bluetooth Low Energy 2Mbps PHY. */ - BB_PHY_BLE_CODED = 3, /*!< Bluetooth Low Energy Coded PHY (data coding unspecified). */ - BB_PHY_15P4 = 4, /*!< 802.15.4 PHY. */ -}; - -/*! \brief PHY options. */ -enum -{ - BB_PHY_OPTIONS_DEFAULT = 0, /*!< BB defined PHY Options behavior. */ - BB_PHY_OPTIONS_BLE_S2 = 1, /*!< Always use S=2 coding when transmitting on LE Coded PHY. */ - BB_PHY_OPTIONS_BLE_S8 = 2 /*!< Always use S=8 coding when transmitting on LE Coded PHY. */ -}; - /*! \} */ /* BB_API_BOD */ -/************************************************************************************************** - Macros -**************************************************************************************************/ - -/*! \brief Binary divide with 1,000,000 divisor (n[max]=0xFFFFFFFF). */ -#define BB_MATH_DIV_10E6(n) ((uint32_t)(((uint64_t)(n) * UINT64_C(4295)) >> 32)) - -#if (BB_CLK_RATE_HZ == 1000000) -/*! \brief Return microseconds (no conversion required). */ -#define BB_US_TO_BB_TICKS(us) (us) -#elif (BB_CLK_RATE_HZ == 8000000) -/*! \brief Compute BB ticks from given time in microseconds (max time is interval=1,996s). */ -#define BB_US_TO_BB_TICKS(us) ((uint32_t)((us) << 3)) -#elif (BB_CLK_RATE_HZ == 32768) -/*! \brief Compute BB ticks from given time in microseconds (max time is interval=1,996s). */ -#define BB_US_TO_BB_TICKS(us) ((uint32_t)(((uint64_t)(us) * UINT64_C(549755)) >> 24)) /* calculated value may be one tick low */ -#else -/*! \brief Compute BB ticks from given time in microseconds (max time is interval=1,996s). */ -#define BB_US_TO_BB_TICKS(us) BB_MATH_DIV_10E6((uint64_t)(us) * (uint64_t)(BB_CLK_RATE_HZ)) -#endif - -#if (BB_CLK_RATE_HZ == 1000000) -/*! \brief BB ticks to microseconds (no conversion required). */ -#define BB_TICKS_TO_US(n) (n) -#elif (BB_CLK_RATE_HZ == 8000000) -/*! \brief BB ticks to microseconds (8MHz). */ -#define BB_TICKS_TO_US(n) ((n) >> 3) -#elif (BB_CLK_RATE_HZ == 32768) -/*! \brief BB ticks to microseconds (32768 Hz). */ -#define BB_TICKS_TO_US(n) (uint32_t)(((uint64_t)(n) * 15625) >> 9) -#else -/*! \brief BB ticks to microseconds. */ -#define BB_TICKS_TO_US(n) (uint32_t)((uint64_t)(n) * 1000000 / BB_CLK_RATE_HZ) -#endif - /************************************************************************************************** Data Types **************************************************************************************************/ @@ -160,16 +89,6 @@ enum /*! \addtogroup BB_API_INIT * \{ */ -/*! \brief Typical maximum duration to scan in a scan interval (BbRtCfg_t::maxScanPeriodMs). */ -#define BB_MAX_SCAN_PERIOD_MS 1000 - -/*! \brief Typical RF setup delay (BbRtCfg_t::rfSetupDelayUs). */ -#define BB_RF_SETUP_DELAY_US 150 - -/*! \brief Typical operation setup delay in microseconds (BbRtCfg_t::schSetupDelayUs). */ -#define BB_SCH_SETUP_DELAY_US 500 - - /*! \brief BB runtime configuration parameters. */ typedef struct { @@ -240,6 +159,7 @@ typedef struct BbOpDesc_tag BbBodCback_t abortCback; /*!< Abort BOD callback (when BOD is removed before beginning). */ void *pCtx; /*!< Client defined context. */ + uint16_t *pDataLen; /*!< Pointer to client data length. */ union { @@ -379,12 +299,13 @@ BbOpDesc_t *BbGetCurrentBod(void); /*************************************************************************************************/ /*! - * \brief Cancel current executing BOD. + * \brief Set termination flag of current executing BOD. * * \return None. * * \note This function is expected to be called during the execution context of the - * current executing BOD, typically in the related ISRs. + * current executing BOD, typically in the related ISRs. In the end, termination + * flag will help to decide if BbTerminateBod() should be called. */ /*************************************************************************************************/ void BbSetBodTerminateFlag(void); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/cfg_mac.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/cfg_mac.h index 11c8608dca..3b048b84db 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/cfg_mac.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/cfg_mac.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief MAC system configuration. + * \file + * \brief MAC system configuration. */ /*************************************************************************************************/ @@ -43,6 +44,11 @@ extern "C" { #define CHCI_BUF_TAILROOM 4 /*!< Extra byte allocation required for buffer (e.g., for MIC). */ #endif +/*** Scheduler ***/ +#ifndef SCH_TIMER_REQUIRED +#define SCH_TIMER_REQUIRED TRUE /*!< If hardware timer is required for radio access scheduler.*/ +#endif + #ifdef __cplusplus }; #endif diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/cfg_mac_ble.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/cfg_mac_ble.h index 646c8cea38..8704d9e386 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/cfg_mac_ble.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/cfg_mac_ble.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief BLE MAC system configuration. + * \file + * \brief BLE MAC system configuration. */ /*************************************************************************************************/ @@ -49,6 +50,10 @@ extern "C" { #define LL_MAX_ADV_SETS 6 /*!< Absolute maximum number of advertising sets. */ #endif +#ifndef LL_MAX_PHYS +#define LL_MAX_PHYS 3 /*!< Absolute maximum number of PHYs supported. */ +#endif + #ifndef LL_MAX_PER_SCAN #define LL_MAX_PER_SCAN 6 /*!< Absolute maximum number of periodic scanners (maximum is 32). */ #endif @@ -57,6 +62,18 @@ extern "C" { #define LL_ENABLE_TESTER 0 /*!< Enable LL tester extensions. */ #endif +#ifndef LL_ENABLE_CALIBRATION +#define LL_ENABLE_CALIBRATION 0 /*!< Enable LL calibration extensions. */ +#endif + +#ifndef LL_MAX_CIG +#define LL_MAX_CIG 2 /*!< Absolute maximum number of connected isochronous groups. */ +#endif + +#ifndef LL_MAX_CIS +#define LL_MAX_CIS 2 /*!< Absolute maximum number of connected isochronous streams per CIG. */ +#endif + #ifndef LHCI_ENABLE_VS #define LHCI_ENABLE_VS 1 /*!< Enable vendor specific command processing. */ #endif @@ -64,7 +81,7 @@ extern "C" { /*** Scheduler ***/ #ifndef SCH_RM_MAX_RSVN -#define SCH_RM_MAX_RSVN (LL_MAX_CONN + LL_MAX_ADV_SETS) /*!< Maximum number of reservations (maximum is 32). */ +#define SCH_RM_MAX_RSVN (LL_MAX_CONN + LL_MAX_ADV_SETS + LL_MAX_CIG) /*!< Maximum number of reservations (maximum is 32). */ #endif /*** Baseband ***/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/chci_api.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/chci_api.h similarity index 87% rename from features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/chci_api.h rename to features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/chci_api.h index 0715c7b05e..cb1f61f641 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/chci_api.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/chci_api.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Controller HCI transport API. + * \file + * \brief Controller HCI transport API. */ /*************************************************************************************************/ @@ -37,6 +38,7 @@ enum CHCI_TR_PROT_BLE = 0, /*!< BLE protocol. */ CHCI_TR_PROT_BOOT = 1, /*!< Boot protocol. */ CHCI_TR_PROT_15P4 = 2, /*!< 802.15.4 protocol */ + CHCI_TR_PROT_CAL = 3, /*!< Radio Calibration protocol */ CHCI_TR_PROT_NUM /*!< Number of protocols. */ }; @@ -44,8 +46,9 @@ enum enum { CHCI_TR_TYPE_CMD = 0, /*!< Command message (receive only). */ - CHCI_TR_TYPE_DATA, /*!< Data message (send or receive). */ + CHCI_TR_TYPE_DATA, /*!< ACL data message (send or receive). */ CHCI_TR_TYPE_EVT, /*!< Event message (send only). */ + CHCI_TR_TYPE_ISO, /*!< ISO data message (send or receive). */ CHCI_TR_TYPE_NUM /*!< Number of types. */ }; @@ -62,9 +65,21 @@ enum /*! \brief 802.15.4 protocol data type. */ #define CHCI_15P4_DATA_TYPE 0x81 +/*! \brief Radio calibration command type. */ +#define CHCI_CAL_CMD_TYPE 0xF1 + +/*! \brief Radio calibration signal type. */ +#define CHCI_CAL_SIG_TYPE 0xF2 + +/*! \brief Radio calibration event type. */ +#define CHCI_CAL_EVT_TYPE 0xF4 + /*! \brief 802.15.4 protocol header length. */ #define CHCI_15P4_HDR_LEN 3 +/*! \brief Radio calibration header length. */ +#define CHCI_CAL_HDR_LEN 3 + /*! \brief Message received callback. */ typedef void (*ChciTrRecvCback_t)(uint8_t type, uint8_t *pBuf); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/chci_tr.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/chci_tr.h similarity index 75% rename from features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/chci_tr.h rename to features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/chci_tr.h index c496064fac..15bffb71fe 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/chci_tr.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/chci_tr.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Controller HCI transport interface file. + * \file + * \brief Controller HCI transport interface file. */ /*************************************************************************************************/ @@ -31,20 +32,22 @@ extern "C" { #endif /************************************************************************************************** - Function Declarations + Macros **************************************************************************************************/ -/*************************************************************************************************/ -/*! - * \brief Signal the completion of a message write. - * - * \return None. - * - * This routine is used for asynchronous write operations. When the driver has completed the - * use of the write buffer, this routine is called to free the buffer and release flow control. - */ -/*************************************************************************************************/ -void chciTrSendComplete(void); +#ifndef UART_BAUD +/*! \brief Default UART baud rate. */ +#define UART_BAUD 1000000 +#endif + +#ifndef UART_DEFAULT_CONFIG_HWFC +/*! \brief Default Hardware Flow Control. */ +#define UART_DEFAULT_CONFIG_HWFC 1 +#endif + +/************************************************************************************************** + Function Declarations +**************************************************************************************************/ /*************************************************************************************************/ /*! @@ -61,14 +64,12 @@ void chciTrRecv(uint8_t prot, uint8_t type, uint8_t *pBuf); /*************************************************************************************************/ /*! - * \brief Signal a hardware error. + * \brief Service the transport device. * - * \param code Error code. - * - * \return None. + * \return TRUE if work pending, FALSE if no work is pending. */ /*************************************************************************************************/ -void chciTrHwError(uint8_t code); +bool_t ChciTrService(void); #ifdef __cplusplus }; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/sch_api.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/sch_api.h index 3c51357948..4c6d7081fa 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/sch_api.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/include/common/sch_api.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Multi-protocol scheduler interface file. + * \file + * \brief Multi-protocol scheduler interface file. */ /*************************************************************************************************/ @@ -50,6 +51,7 @@ uint16_t SchStatsGetHandlerWatermarkUsec(void); /* Control */ void SchHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg); +void SchLoadHandler(void); /* List maintenance */ void SchInsertNextAvailable(BbOpDesc_t *pBod); @@ -58,9 +60,7 @@ bool_t SchInsertEarlyAsPossible(BbOpDesc_t *pBod, uint32_t min, uint32_t max); bool_t SchInsertLateAsPossible(BbOpDesc_t *pBod, uint32_t min, uint32_t max); bool_t SchRemove(BbOpDesc_t *pBod); void SchReload(BbOpDesc_t *pBod); -void SchRemoveBackground(void); -void SchInsertBackground(BbOpDesc_t *pBod); -void SchTerminateBackground(void); +bool_t SchIsBodCancellable(BbOpDesc_t *pBod); #ifdef __cplusplus }; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_master.c index 109f15ad33..578bdf152c 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,12 +16,13 @@ /*************************************************************************************************/ /*! - * \brief Scanning master BLE baseband porting implementation file. + * \file + * \brief Scanning master BLE baseband porting implementation file. */ /*************************************************************************************************/ #include "bb_api.h" -#include "bb_drv.h" +#include "pal_bb.h" #include "bb_ble_int.h" #include "sch_api.h" #include "wsf_math.h" @@ -31,12 +32,6 @@ Macros **************************************************************************************************/ -/*! \brief Guard time at the end of a scan window to the next BOD. Backoff one advertise data exchange. */ -#define BB_SCAN_GUARD_US (LL_ADV_PKT_MAX_USEC + LL_BLE_TIFS_US + \ - LL_SCAN_REQ_MAX_USEC + LL_BLE_TIFS_US + \ - LL_SCAN_RSP_MAX_USEC + \ - BbGetSchSetupDelayUs()) - /*! \brief Event states for scan operations. */ enum { @@ -128,7 +123,7 @@ static bool_t bbContScanOp(BbOpDesc_t *pBod, BbBleMstAdvEvent_t *pScan) return TRUE; } - uint32_t curTime = BbDrvGetCurrentTime(); + uint32_t curTime = PalBbGetCurrentTime(USE_RTC_BB_CLK); pScan->elapsedUsec += BB_TICKS_TO_US(curTime - bbBleCb.lastScanStart); bbBleCb.lastScanStart = curTime; @@ -142,7 +137,7 @@ static bool_t bbContScanOp(BbOpDesc_t *pBod, BbBleMstAdvEvent_t *pScan) bbBleCb.bbParam.due = bbBleCb.lastScanStart + BB_US_TO_BB_TICKS(BbGetSchSetupDelayUs()); bbBleCb.bbParam.dueOffsetUsec = 0; bbBleCb.bbParam.rxTimeoutUsec = scanDurUsec; - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetDataParams(&bbBleCb.bbParam); bbBleCb.evtState = BB_EVT_STATE_RX_ADV_IND; @@ -154,7 +149,7 @@ static bool_t bbContScanOp(BbOpDesc_t *pBod, BbBleMstAdvEvent_t *pScan) { bbBleClrIfs(); /* passive scan */ } - BbBleDrvRxData(pScan->pRxAdvBuf, BB_ADVB_MAX_LEN); + PalBbBleRxData(pScan->pRxAdvBuf, BB_ADVB_MAX_LEN); return FALSE; } @@ -200,7 +195,7 @@ static void bbMstScanTxCompCback(uint8_t status) BB_ISR_MARK(bbScanStats.rxSetupUsec); bbBleClrIfs(); /* last operation in event */ - BbBleDrvRxTifsData(pScan->pRxRspBuf, BB_ADVB_MAX_LEN); + PalBbBleRxTifsData(pScan->pRxRspBuf, BB_ADVB_MAX_LEN); /* Rx may fail; no more important statements in the !bodComplete code path */ } @@ -240,10 +235,11 @@ static void bbMstScanTxCompCback(uint8_t status) if (bodCont) { /* Cancel TIFS timer if active. */ + /* coverity[dead_error_condition] */ switch (status) { case BB_STATUS_SUCCESS: - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); break; default: /* coverity[dead_error_begin] */ @@ -313,10 +309,10 @@ static void bbMstScanRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, uint BB_ISR_MARK(bbScanStats.txSetupUsec); - BbBleDrvTxBufDesc_t desc = {.pBuf = pScan->pTxReqBuf, .len = pScan->txReqLen}; + PalBbBleTxBufDesc_t desc = {.pBuf = pScan->pTxReqBuf, .len = pScan->txReqLen}; bbBleSetIfs(); - BbBleDrvTxTifsData(&desc, 1); + PalBbBleTxTifsData(&desc, 1); /* Tx may fail; no more important statements in the !bodComplete code path */ } @@ -425,7 +421,7 @@ static void bbMstScanRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, uint { case BB_STATUS_SUCCESS: case BB_STATUS_CRC_FAILED: - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); break; default: break; @@ -471,14 +467,14 @@ static void bbMstExecuteScanOp(BbOpDesc_t *pBod, BbBleData_t *pBle) bbBleCb.lastScanStart = pBod->due; - BbBleDrvSetChannelParam(&pBle->chan); + PalBbBleSetChannelParam(&pBle->chan); bbBleCb.bbParam.txCback = bbMstScanTxCompCback; bbBleCb.bbParam.rxCback = bbMstScanRxCompCback; bbBleCb.bbParam.rxTimeoutUsec = scanDurUsec; bbBleCb.bbParam.due = pBod->due; bbBleCb.bbParam.dueOffsetUsec = pBod->dueOffsetUsec; - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetDataParams(&bbBleCb.bbParam); bbBleCb.evtState = 0; @@ -490,7 +486,7 @@ static void bbMstExecuteScanOp(BbOpDesc_t *pBod, BbBleData_t *pBle) { bbBleClrIfs(); /* passive scan */ } - BbBleDrvRxData(pScan->pRxAdvBuf, BB_ADVB_MAX_LEN); + PalBbBleRxData(pScan->pRxAdvBuf, BB_ADVB_MAX_LEN); /* Rx may fail; no more important statements in the !bodComplete code path */ } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_master_ae.c index 7b9f12cbbf..e9c677c10b 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Extended scanning master BLE baseband porting implementation file. + * \file + * \brief Extended scanning master BLE baseband porting implementation file. */ /*************************************************************************************************/ @@ -83,7 +84,7 @@ static void bbMstAuxScanTxCompCback(uint8_t status) BB_ISR_MARK(bbAuxScanStats.rxSetupUsec); bbBleClrIfs(); /* Prepare for SCAN_OR_CONN_RSP */ - BbBleDrvRxTifsData(bbAuxAdvBuf, sizeof(bbAuxAdvBuf)); + PalBbBleRxTifsData(bbAuxAdvBuf, sizeof(bbAuxAdvBuf)); break; } @@ -175,10 +176,10 @@ static void bbMstAuxScanRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, u BB_ISR_MARK(bbAuxScanStats.txSetupUsec); - BbBleDrvTxBufDesc_t desc = {.pBuf = pAuxScan->pTxAuxReqBuf, .len = pAuxScan->txAuxReqLen}; + PalBbBleTxBufDesc_t desc = {.pBuf = pAuxScan->pTxAuxReqBuf, .len = pAuxScan->txAuxReqLen}; bbBleSetIfs(); - BbBleDrvTxTifsData(&desc, 1); + PalBbBleTxTifsData(&desc, 1); } } else if ((pAuxScan->rxAuxChainCback) && @@ -189,16 +190,16 @@ static void bbMstAuxScanRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, u bbBleCb.evtState = BB_EVT_STATE_RX_CHAIN_IND; /* Cancel Tifs operation is needed for passive scan and non connectable/scannable adv with chain. */ - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); - BbBleDrvSetChannelParam(&pBle->chan); + PalBbBleSetChannelParam(&pBle->chan); bbBleCb.bbParam.due = timestamp + BB_US_TO_BB_TICKS(auxOffsetUsec); - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetDataParams(&bbBleCb.bbParam); BB_ISR_MARK(bbAuxScanStats.rxSetupUsec); bbBleClrIfs(); /* CHAIN_IND does not use TIFS. */ - BbBleDrvRxData(bbAuxAdvBuf, sizeof(bbAuxAdvBuf)); + PalBbBleRxData(bbAuxAdvBuf, sizeof(bbAuxAdvBuf)); WSF_ASSERT(pAuxScan->rxAuxChainPostCback); if (pAuxScan->rxAuxChainPostCback(pCur, bbAuxAdvBuf) == FALSE) @@ -269,14 +270,14 @@ static void bbMstAuxScanRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, u if ((pAuxScan->rxAuxChainCback) && ((auxOffsetUsec = pAuxScan->rxAuxChainCback(pCur, bbAuxAdvBuf)) > 0)) { - BbBleDrvSetChannelParam(&pBle->chan); + PalBbBleSetChannelParam(&pBle->chan); bbBleCb.bbParam.due = timestamp + BB_US_TO_BB_TICKS(auxOffsetUsec); - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetDataParams(&bbBleCb.bbParam); BB_ISR_MARK(bbAuxScanStats.rxSetupUsec); bbBleClrIfs(); /* CHAIN_IND does not use TIFS. */ - BbBleDrvRxData(bbAuxAdvBuf, sizeof(bbAuxAdvBuf)); + PalBbBleRxData(bbAuxAdvBuf, sizeof(bbAuxAdvBuf)); WSF_ASSERT(pAuxScan->rxAuxChainPostCback); if (pAuxScan->rxAuxChainPostCback(pCur, bbAuxAdvBuf) == FALSE) @@ -342,14 +343,14 @@ static void bbMstAuxScanRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, u uint32_t auxOffsetUsec; if ((auxOffsetUsec = pAuxScan->rxAuxChainCback(pCur, bbAuxAdvBuf)) > 0) { - BbBleDrvSetChannelParam(&pBle->chan); + PalBbBleSetChannelParam(&pBle->chan); bbBleCb.bbParam.due = timestamp + BB_US_TO_BB_TICKS(auxOffsetUsec); - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetDataParams(&bbBleCb.bbParam); BB_ISR_MARK(bbAuxScanStats.rxSetupUsec); bbBleClrIfs(); /* CHAIN_IND does not use TIFS. */ - BbBleDrvRxData(bbAuxAdvBuf, sizeof(bbAuxAdvBuf)); + PalBbBleRxData(bbAuxAdvBuf, sizeof(bbAuxAdvBuf)); WSF_ASSERT(pAuxScan->rxAuxChainPostCback); if (pAuxScan->rxAuxChainPostCback(pCur, bbAuxAdvBuf) == FALSE) @@ -421,7 +422,7 @@ static void bbMstAuxScanRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, u { case BB_STATUS_SUCCESS: case BB_STATUS_CRC_FAILED: - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); break; default: break; @@ -452,14 +453,14 @@ static void bbMstExecuteAuxScanOp(BbOpDesc_t *pBod, BbBleData_t *pBle) { BbBleMstAuxAdvEvent_t * const pAuxScan = &pBod->prot.pBle->op.mstAuxAdv; - BbBleDrvSetChannelParam(&pBle->chan); + PalBbBleSetChannelParam(&pBle->chan); bbBleCb.bbParam.txCback = bbMstAuxScanTxCompCback; bbBleCb.bbParam.rxCback = bbMstAuxScanRxCompCback; bbBleCb.bbParam.rxTimeoutUsec = pAuxScan->rxSyncDelayUsec; bbBleCb.bbParam.due = pBod->due; bbBleCb.bbParam.dueOffsetUsec = pBod->dueOffsetUsec; - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetDataParams(&bbBleCb.bbParam); bbBleCb.evtState = 0; @@ -471,7 +472,7 @@ static void bbMstExecuteAuxScanOp(BbOpDesc_t *pBod, BbBleData_t *pBle) { bbBleClrIfs(); /* passive scan */ } - BbBleDrvRxData(bbAuxAdvBuf, sizeof(bbAuxAdvBuf)); + PalBbBleRxData(bbAuxAdvBuf, sizeof(bbAuxAdvBuf)); } /*************************************************************************************************/ @@ -524,13 +525,13 @@ static void bbMstPerScanRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, u if ((auxOffsetUsec = pPerScan->rxPerAdvCback(pCur, bbPerScanBuf, status)) > 0) { - BbBleDrvSetChannelParam(&pBle->chan); + PalBbBleSetChannelParam(&pBle->chan); bbBleCb.bbParam.due = timestamp + BB_US_TO_BB_TICKS(auxOffsetUsec); - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetDataParams(&bbBleCb.bbParam); BB_ISR_MARK(bbPerScanStats.rxSetupUsec); bbBleClrIfs(); /* SYNC_IND does not use TIFS. */ - BbBleDrvRxData(bbPerScanBuf, sizeof(bbPerScanBuf)); + PalBbBleRxData(bbPerScanBuf, sizeof(bbPerScanBuf)); if (pPerScan->rxPerAdvPostCback(pCur, bbAuxAdvBuf) == FALSE) { @@ -594,14 +595,14 @@ static void bbMstPerScanRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, u if ((auxOffsetUsec = pPerScan->rxPerAdvCback(pCur, bbPerScanBuf, status)) > 0) { /* Continue BOD with the CHAIN_IND and adjust the channel parameters. */ - BbBleDrvSetChannelParam(&pBle->chan); + PalBbBleSetChannelParam(&pBle->chan); bbBleCb.bbParam.due = timestamp + BB_US_TO_BB_TICKS(auxOffsetUsec); - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetDataParams(&bbBleCb.bbParam); BB_ISR_MARK(bbPerScanStats.rxSetupUsec); bbBleClrIfs(); /* SYNC_IND does not use TIFS. */ - BbBleDrvRxData(bbPerScanBuf, sizeof(bbPerScanBuf)); + PalBbBleRxData(bbPerScanBuf, sizeof(bbPerScanBuf)); if (pPerScan->rxPerAdvPostCback(pCur, bbAuxAdvBuf) == FALSE) { @@ -665,7 +666,7 @@ static void bbMstPerScanRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, u { case BB_STATUS_SUCCESS: case BB_STATUS_CRC_FAILED: - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); break; default: break; @@ -696,19 +697,19 @@ static void bbMstExecutePerScanOp(BbOpDesc_t *pBod, BbBleData_t *pBle) { BbBleMstPerScanEvent_t * const pPerScan = &pBod->prot.pBle->op.mstPerScan; - BbBleDrvSetChannelParam(&pBle->chan); + PalBbBleSetChannelParam(&pBle->chan); bbBleCb.bbParam.rxCback = bbMstPerScanRxCompCback; bbBleCb.bbParam.rxTimeoutUsec = pPerScan->rxSyncDelayUsec; bbBleCb.bbParam.due = pBod->due; bbBleCb.bbParam.dueOffsetUsec = pBod->dueOffsetUsec; - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetDataParams(&bbBleCb.bbParam); bbBleCb.evtState = 0; bbBleClrIfs(); /* passive scan */ - BbBleDrvRxData(bbPerScanBuf, sizeof(bbPerScanBuf)); + PalBbBleRxData(bbPerScanBuf, sizeof(bbPerScanBuf)); } /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_slave.c index 1bbcb9281e..0913760b68 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,20 +16,23 @@ /*************************************************************************************************/ /*! - * \brief Advertising slave BLE baseband porting implementation file. + * \file + * \brief Advertising slave BLE baseband porting implementation file. */ /*************************************************************************************************/ -#include "bb_drv.h" +#include "pal_bb.h" #include "bb_ble_int.h" #include "sch_api.h" #include "sch_api_ble.h" +#include "ll_math.h" +#include "ll_api.h" +#include "lmgr_api_adv_slave.h" #include /************************************************************************************************** Macros **************************************************************************************************/ - /*! \brief Event states for advertising operations. */ enum { @@ -73,13 +76,15 @@ static bool_t bbSetupAdvOp(BbOpDesc_t *pBod, BbBleSlvAdvEvent_t *pAdv, uint8_t s /* Compute next channel. */ do { - if (bbBleCb.advChIdx >= LL_NUM_CHAN_ADV) + if (bbBleCb.numChUsed == LL_NUM_CHAN_ADV) { /* BOD completed. */ return TRUE; } + bbBleCb.advChIdx = bbBleCb.advChIdx % LL_NUM_CHAN_ADV; pBle->chan.chanIdx = LL_CHAN_ADV_MIN_IDX + bbBleCb.advChIdx; + bbBleCb.numChUsed++; /* Selected channel in channel map; use this channel. */ } while (!((1 << bbBleCb.advChIdx++) & pAdv->advChMap)); @@ -91,14 +96,14 @@ static bool_t bbSetupAdvOp(BbOpDesc_t *pBod, BbBleSlvAdvEvent_t *pAdv, uint8_t s { case BB_STATUS_SUCCESS: case BB_STATUS_CRC_FAILED: - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); break; default: break; } } - BbBleDrvSetChannelParam(&pBle->chan); + PalBbBleSetChannelParam(&pBle->chan); if (firstOpInSet) { @@ -108,14 +113,16 @@ static bool_t bbSetupAdvOp(BbOpDesc_t *pBod, BbBleSlvAdvEvent_t *pAdv, uint8_t s { if (pAdv->pRxReqBuf) { - /* Schedule with relative framge gap. */ - bbBleCb.bbParam.due = BbDrvGetCurrentTime() + BB_US_TO_BB_TICKS(BbGetSchSetupDelayUs()); + /* Schedule with relative frame gap. */ + bbBleCb.bbParam.due = PalBbGetCurrentTime(USE_RTC_BB_CLK) + BB_US_TO_BB_TICKS(BbGetSchSetupDelayUs()); } else { /* Schedule with absolute frame gap. */ - bbBleCb.bbParam.due += (BB_US_TO_BB_TICKS(SchBleCalcAdvPktDurationUsec(pBle->chan.txPhy, pBle->chan.initTxPhyOptions, pAdv->txAdvLen)) + - BB_US_TO_BB_TICKS(BbGetSchSetupDelayUs())); + uint32_t advGap = (BB_US_TO_BB_TICKS(SchBleCalcAdvPktDurationUsec(pBle->chan.txPhy, pBle->chan.initTxPhyOptions, pAdv->txAdvLen)) + + BB_US_TO_BB_TICKS(BbGetSchSetupDelayUs())); + + bbBleCb.bbParam.due += SchBleGetAlignedAuxOffsUsec(advGap); } } @@ -126,7 +133,7 @@ static bool_t bbSetupAdvOp(BbOpDesc_t *pBod, BbBleSlvAdvEvent_t *pAdv, uint8_t s pAdv->txAdvSetupCback(pBod, bbBleCb.bbParam.due); } - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetDataParams(&bbBleCb.bbParam); if (pAdv->pRxReqBuf) { @@ -136,8 +143,8 @@ static bool_t bbSetupAdvOp(BbOpDesc_t *pBod, BbBleSlvAdvEvent_t *pAdv, uint8_t s { bbBleClrIfs(); /* non-connectable advertising */ } - BbBleDrvTxBufDesc_t desc = {.pBuf = pAdv->pTxAdvBuf, .len = pAdv->txAdvLen}; - BbBleDrvTxData(&desc, 1); + PalBbBleTxBufDesc_t desc = {.pBuf = pAdv->pTxAdvBuf, .len = pAdv->txAdvLen}; + PalBbBleTxData(&desc, 1); /* Tx may fail; no more important statements in the FALSE code path */ @@ -181,7 +188,7 @@ static void bbSlvAdvTxCompCback(uint8_t status) BB_ISR_MARK(bbAdvStats.rxSetupUsec); bbBleSetIfs(); /* set up for Tx SCAN_RSP */ - BbBleDrvRxTifsData(pAdv->pRxReqBuf, BB_REQ_PDU_MAX_LEN); /* reduce max length requirement */ + PalBbBleRxTifsData(pAdv->pRxReqBuf, BB_REQ_PDU_MAX_LEN); /* reduce max length requirement */ } else { @@ -213,7 +220,7 @@ Cleanup: switch (status) { case BB_STATUS_SUCCESS: - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); break; default: break; @@ -270,8 +277,8 @@ static void bbSlvAdvRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, uint3 BB_ISR_MARK(bbAdvStats.txSetupUsec); bbBleClrIfs(); /* last operation in event */ - BbBleDrvTxBufDesc_t desc = {.pBuf = pAdv->pTxRspBuf, .len = pAdv->txRspLen}; - BbBleDrvTxTifsData(&desc, 1); + PalBbBleTxBufDesc_t desc = {.pBuf = pAdv->pTxRspBuf, .len = pAdv->txRspLen}; + PalBbBleTxTifsData(&desc, 1); } else { @@ -330,7 +337,7 @@ static void bbSlvAdvRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, uint3 { case BB_STATUS_SUCCESS: case BB_STATUS_CRC_FAILED: - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); break; default: break; @@ -360,9 +367,9 @@ static void bbSlvExecuteAdvOp(BbOpDesc_t *pBod, BbBleData_t *pBle) bbBleCb.bbParam.rxCback = bbSlvAdvRxCompCback; bbBleCb.bbParam.rxTimeoutUsec = 2 * LL_MAX_TIFS_DEVIATION; bbBleCb.bbParam.dueOffsetUsec = 0; - - bbBleCb.advChIdx = 0; bbBleCb.evtState = 0; + bbBleCb.numChUsed = 0; + bbBleCb.advChIdx = pAdv->firstAdvChIdx; if (bbSetupAdvOp(pBod, pAdv, BB_STATUS_SUCCESS, TRUE)) { @@ -382,7 +389,7 @@ static void bbSlvExecuteAdvOp(BbOpDesc_t *pBod, BbBleData_t *pBle) /*************************************************************************************************/ static void bbSlvCancelAdvOp(BbOpDesc_t *pBod, BbBleData_t *pBle) { - BbBleDrvCancelData(); + PalBbBleCancelData(); } /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_slave_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_slave_ae.c index d6ee6c745b..b2ebd15004 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_slave_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_adv_slave_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Extended advertising slave BLE baseband porting implementation file. + * \file + * \brief Extended advertising slave BLE baseband porting implementation file. */ /*************************************************************************************************/ @@ -71,15 +72,15 @@ static bool_t bbSlvAdvSetupTxAuxChainInd(BbOpDesc_t *pCur, BbBleSlvAuxAdvEvent_t } /* Set updated auxiliary channel. */ - BbBleDrvSetChannelParam(&pCur->prot.pBle->chan); + PalBbBleSetChannelParam(&pCur->prot.pBle->chan); /* Offset may be up to 1 unit earlier than actual transmission. */ bbBleCb.bbParam.due += BB_US_TO_BB_TICKS(auxOffsUsec); - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetDataParams(&bbBleCb.bbParam); BB_ISR_MARK(bbAuxAdvStats.rxSetupUsec); bbBleClrIfs(); /* CHAIN_IND does not use TIFS. */ - BbBleDrvTxData(pAuxAdv->txAuxChainPdu, 2); + PalBbBleTxData(pAuxAdv->txAuxChainPdu, 2); /* Operation continues. */ return FALSE; @@ -130,7 +131,7 @@ static void bbSlvAuxAdvTxCompCback(uint8_t status) bbBleCb.evtState = BB_EVT_STATE_RX_SCAN_OR_CONN_REQ; BB_ISR_MARK(bbAuxAdvStats.rxSetupUsec); bbBleSetIfs(); /* set up for Tx SCAN_RSP */ - BbBleDrvRxTifsData(pAuxAdv->pRxAuxReqBuf, BB_REQ_PDU_MAX_LEN); /* reduce max length requirement */ + PalBbBleRxTifsData(pAuxAdv->pRxAuxReqBuf, BB_REQ_PDU_MAX_LEN); /* reduce max length requirement */ } BB_INC_STAT(bbAuxAdvStats.txAdv); break; @@ -138,7 +139,7 @@ static void bbSlvAuxAdvTxCompCback(uint8_t status) case BB_EVT_STATE_TX_SCAN_RSP: bbBleCb.evtState = BB_EVT_STATE_TX_CHAIN_IND; bbBleCb.bbParam.due = pAuxAdv->auxReqStartTs + - BB_US_TO_BB_TICKS(SchBleCalcAdvPktDurationUsec(pBle->chan.rxPhy, pAuxAdv->auxRxPhyOptions, LL_ADV_HDR_LEN + LL_SCAN_REQ_PDU_LEN )) + + BB_US_TO_BB_TICKS(SchBleCalcAdvPktDurationUsec(pBle->chan.rxPhy, pAuxAdv->auxRxPhyOptions, LL_ADV_HDR_LEN + LL_SCAN_REQ_PDU_LEN)) + BB_US_TO_BB_TICKS(LL_BLE_TIFS_US); bodComplete = bbSlvAdvSetupTxAuxChainInd(pCur, pAuxAdv); BB_INC_STAT(bbAuxAdvStats.txRsp); @@ -165,7 +166,7 @@ Cleanup: switch (status) { case BB_STATUS_SUCCESS: - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); break; default: break; @@ -220,7 +221,7 @@ static void bbSlvAuxAdvRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, ui BB_ISR_MARK(bbAuxAdvStats.txSetupUsec); bbBleClrIfs(); /* last operation in event */ - BbBleDrvTxTifsData(pAuxAdv->txAuxRspPdu, 2); + PalBbBleTxTifsData(pAuxAdv->txAuxRspPdu, 2); if (pAuxAdv->rxAuxReqPostCback) { @@ -276,7 +277,7 @@ static void bbSlvAuxAdvRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, ui { case BB_STATUS_SUCCESS: case BB_STATUS_CRC_FAILED: - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); break; default: break; @@ -322,11 +323,11 @@ static void bbSlvExecuteAuxAdvOp(BbOpDesc_t *pBod, BbBleData_t *pBle) pAuxAdv->txAuxSetupCback(pBod, FALSE); } - BbBleDrvSetChannelParam(&pBle->chan); + PalBbBleSetChannelParam(&pBle->chan); bbBleCb.bbParam.due = pBod->due; bbBleCb.evtState = BB_EVT_STATE_TX_ADV_IND; - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetDataParams(&bbBleCb.bbParam); if (pAuxAdv->pRxAuxReqBuf) { @@ -339,7 +340,7 @@ static void bbSlvExecuteAuxAdvOp(BbOpDesc_t *pBod, BbBleData_t *pBle) bbBleClrIfs(); } - BbBleDrvTxData(pAuxAdv->txAuxAdvPdu, 2); + PalBbBleTxData(pAuxAdv->txAuxAdvPdu, 2); } /*************************************************************************************************/ @@ -376,11 +377,11 @@ static void bbSlvExecutePerAdvOp(BbOpDesc_t *pBod, BbBleData_t *pBle) pAuxAdv->txAuxSetupCback(pBod, FALSE); } - BbBleDrvSetChannelParam(&pBle->chan); + PalBbBleSetChannelParam(&pBle->chan); bbBleCb.bbParam.due = pBod->due; bbBleCb.evtState = BB_EVT_STATE_TX_ADV_IND; - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetDataParams(&bbBleCb.bbParam); if (pAuxAdv->pRxAuxReqBuf) { @@ -393,7 +394,7 @@ static void bbSlvExecutePerAdvOp(BbOpDesc_t *pBod, BbBleData_t *pBle) bbBleClrIfs(); } - BbBleDrvTxData(pAuxAdv->txAuxAdvPdu, 2); + PalBbBleTxData(pAuxAdv->txAuxAdvPdu, 2); } /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_conn.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_conn.c index 8c48b11a99..8b5f509be3 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_conn.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_conn.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,12 +16,13 @@ /*************************************************************************************************/ /*! - * \brief Connectable BLE baseband porting implementation file. + * \file + * \brief Connectable BLE baseband porting implementation file. */ /*************************************************************************************************/ #include "bb_api.h" -#include "bb_drv.h" +#include "pal_bb.h" #include "bb_ble_int.h" #if BB_DATA_PLD_MAX_LEN < LL_MAX_DATA_LEN_MIN @@ -52,13 +53,13 @@ BbBleDataPktStats_t bbConnStats; /*!< Connection packet statistics. */ * callback routine. */ /*************************************************************************************************/ -void BbBleTxData(BbBleDrvTxBufDesc_t descs[], uint8_t cnt) +void BbBleTxData(PalBbBleTxBufDesc_t descs[], uint8_t cnt) { if ((BbGetCurrentBod()->prot.pBle->chan.opType == BB_BLE_OP_MST_CONN_EVENT) && (bbBleCb.evtState == 0)) { bbBleSetIfs(); /* master always Rx's after Tx */ - BbBleDrvTxData(descs, cnt); + PalBbBleTxData(descs, cnt); } else { @@ -66,7 +67,7 @@ void BbBleTxData(BbBleDrvTxBufDesc_t descs[], uint8_t cnt) /* TODO set only if master or if slave and Rx may follow in CE. */ bbBleSetIfs(); - BbBleDrvTxTifsData(descs, cnt); + PalBbBleTxTifsData(descs, cnt); } } @@ -99,7 +100,7 @@ void BbBleRxData(uint8_t *pBuf, uint16_t len) (bbBleCb.evtState == 0)) { bbBleSetIfs(); /* slave always Tx's after Rx */ - BbBleDrvRxData(pBuf, len); + PalBbBleRxData(pBuf, len); } } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_conn_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_conn_master.c index 76f2c9212f..4a9b220280 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_conn_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_conn_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,12 +16,13 @@ /*************************************************************************************************/ /*! - * \brief Connectable master BLE baseband porting implementation file. + * \file + * \brief Connectable master BLE baseband porting implementation file. */ /*************************************************************************************************/ #include "bb_api.h" -#include "bb_drv.h" +#include "pal_bb.h" #include "bb_ble_int.h" #include @@ -51,6 +52,8 @@ static void bbMstConnTxCompCback(uint8_t status) BbOpDesc_t * const pCur = BbGetCurrentBod(); BbBleMstConnEvent_t * const pConn = &pCur->prot.pBle->op.mstConn; + WSF_ASSERT(pCur); + pConn->txDataCback(pCur, status); if (bbBleCb.pRxDataBuf && @@ -59,7 +62,7 @@ static void bbMstConnTxCompCback(uint8_t status) BB_ISR_MARK(bbConnStats.rxSetupUsec); bbBleSetIfs(); /* TODO set only if Tx may follow in CE */ - BbBleDrvRxTifsData(bbBleCb.pRxDataBuf, bbBleCb.rxDataLen); + PalBbBleRxTifsData(bbBleCb.pRxDataBuf, bbBleCb.rxDataLen); } else { @@ -67,7 +70,7 @@ static void bbMstConnTxCompCback(uint8_t status) switch (status) { case BB_STATUS_SUCCESS: - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); break; case BB_STATUS_FAILED: default: @@ -147,7 +150,7 @@ static void bbMstConnRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, uint { case BB_STATUS_SUCCESS: case BB_STATUS_CRC_FAILED: - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); break; default: break; @@ -189,7 +192,7 @@ static void bbMstConnRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, uint /*************************************************************************************************/ static void bbMstExecuteConnOp(BbOpDesc_t *pBod, BbBleData_t *pBle) { - BbBleDrvSetChannelParam(&pBle->chan); + PalBbBleSetChannelParam(&pBle->chan); WSF_ASSERT(pBle->op.mstConn.txDataCback); WSF_ASSERT(pBle->op.mstConn.rxDataCback); @@ -200,7 +203,7 @@ static void bbMstExecuteConnOp(BbOpDesc_t *pBod, BbBleData_t *pBle) bbBleCb.bbParam.dueOffsetUsec = pBod->dueOffsetUsec; bbBleCb.bbParam.rxTimeoutUsec = 2 * LL_MAX_TIFS_DEVIATION; - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetDataParams(&bbBleCb.bbParam); bbBleCb.evtState = 0; @@ -219,10 +222,11 @@ static void bbMstExecuteConnOp(BbOpDesc_t *pBod, BbBleData_t *pBle) /*************************************************************************************************/ static void bbMstCancelConnOp(BbOpDesc_t *pBod, BbBleData_t *pBle) { - WSF_ASSERT(pBod && pBle); + WSF_ASSERT(pBod); + WSF_ASSERT(pBle); WSF_ASSERT(pBle->op.mstConn.rxDataCback); - BbBleDrvCancelData(); + PalBbBleCancelData(); if (bbBleCb.pRxDataBuf) { diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_conn_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_conn_slave.c index bd624f43eb..19a6497e9c 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_conn_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_conn_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,12 +16,13 @@ /*************************************************************************************************/ /*! - * \brief Connectable slave BLE baseband porting implementation file. + * \file + * \brief Connectable slave BLE baseband porting implementation file. */ /*************************************************************************************************/ #include "bb_api.h" -#include "bb_drv.h" +#include "pal_bb.h" #include "bb_ble_int.h" #include @@ -60,12 +61,12 @@ static void bbSlvConnTxCompCback(uint8_t status) BB_ISR_MARK(bbConnStats.rxSetupUsec); bbBleSetIfs(); /* slave always Tx's after Rx */ - BbBleDrvRxTifsData(bbBleCb.pRxDataBuf, bbBleCb.rxDataLen); + PalBbBleRxTifsData(bbBleCb.pRxDataBuf, bbBleCb.rxDataLen); } else { /* Cancel TIFS timer if active. */ - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); /* Tx completion is end of BOD. */ BbTerminateBod(); @@ -131,8 +132,6 @@ static void bbSlvConnRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, uint bbBleCb.evtState = 1; pConn->startTs = timestamp; - - bbBleCb.bbParam.rxTimeoutUsec = 2 * LL_MAX_TIFS_DEVIATION; } WSF_ASSERT(bbBleCb.pRxDataBuf); @@ -152,7 +151,7 @@ static void bbSlvConnRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, uint { case BB_STATUS_SUCCESS: case BB_STATUS_CRC_FAILED: - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); break; default: break; @@ -199,7 +198,7 @@ static void bbSlvExecuteConnOp(BbOpDesc_t *pBod, BbBleData_t *pBle) WSF_ASSERT(pConn->txDataCback); WSF_ASSERT(pConn->rxDataCback); - BbBleDrvSetChannelParam(&pBle->chan); + PalBbBleSetChannelParam(&pBle->chan); bbBleCb.bbParam.txCback = bbSlvConnTxCompCback; bbBleCb.bbParam.rxCback = bbSlvConnRxCompCback; @@ -207,7 +206,7 @@ static void bbSlvExecuteConnOp(BbOpDesc_t *pBod, BbBleData_t *pBle) bbBleCb.bbParam.dueOffsetUsec = pBod->dueOffsetUsec; bbBleCb.bbParam.rxTimeoutUsec = pConn->rxSyncDelayUsec; - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetDataParams(&bbBleCb.bbParam); bbBleCb.evtState = 0; @@ -226,10 +225,11 @@ static void bbSlvExecuteConnOp(BbOpDesc_t *pBod, BbBleData_t *pBle) /*************************************************************************************************/ static void bbSlvCancelConnOp(BbOpDesc_t *pBod, BbBleData_t *pBle) { - WSF_ASSERT(pBod && pBle); + WSF_ASSERT(pBod); + WSF_ASSERT(pBle); WSF_ASSERT(pBle->op.slvConn.rxDataCback); - BbBleDrvCancelData(); + PalBbBleCancelData(); if (bbBleCb.pRxDataBuf) { diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_int.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_int.h index 41e6028567..d37c770c6a 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_int.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_int.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal BLE baseband interface file. + * \file + * \brief Internal BLE baseband interface file. */ /*************************************************************************************************/ @@ -25,8 +26,8 @@ #include "bb_ble_api.h" #include "bb_ble_api_op.h" -#include "bb_ble_drv.h" -#include "bb_drv.h" +#include "pal_bb_ble.h" +#include "pal_bb.h" #include "ll_defs.h" #include "wsf_assert.h" #include "wsf_math.h" @@ -44,10 +45,10 @@ extern "C" { #define BB_ADVB_MAX_LEN WSF_MAX(BB_FIXED_ADVB_PKT_LEN, LL_ADVB_MAX_LEN) /*! \brief Mark the start of an ISR. */ -#define BB_ISR_START() bbIsrStartTime = BbDrvGetCurrentTime() +#define BB_ISR_START() bbIsrStartTime = PalBbGetCurrentTime(USE_RTC_BB_CLK) /*! \brief Mark the ISR duration, recording the high watermark. */ -#define BB_ISR_MARK(x) x = WSF_MAX(x, BB_TICKS_TO_US(BbDrvGetCurrentTime() - bbIsrStartTime)) +#define BB_ISR_MARK(x) x = WSF_MAX(x, BB_TICKS_TO_US(PalBbGetCurrentTime(USE_RTC_BB_CLK) - bbIsrStartTime)) /************************************************************************************************** Data Types @@ -67,18 +68,23 @@ typedef struct uint8_t evtState; /*!< Action state of the currently operating BOD. */ uint8_t advChIdx; /*!< Current advertising channel index. */ + uint8_t numChUsed; /*!< Total number of channels visited. */ uint32_t lastScanStart; /*!< Last scan start time. */ - BbBleDrvDataParam_t bbParam; /*!< Baseband data parameters. */ + PalBbBleDataParam_t bbParam; /*!< Baseband data parameters. */ uint16_t rxDataLen; /*!< Receive data buffer length. */ uint8_t *pRxDataBuf; /*!< Current Rx data buffer. */ + + uint16_t rxCisDataLen; /*!< Receive CIS data buffer length. */ + uint8_t *pRxCisDataBuf; /*!< Current Rx CIS data buffer. */ } bbBleCtrlBlk_t; /************************************************************************************************** Global Variables **************************************************************************************************/ +/* BB BLE Control Block. */ extern bbBleCtrlBlk_t bbBleCb; /* ISR start time. */ @@ -112,8 +118,8 @@ void bbBleRegisterOp(uint8_t opType, bbBleExecOpFn_t execOpCback, bbBleExecOpFn_ /*************************************************************************************************/ static inline void bbBleClrIfs(void) { - BbBleDrvOpParam_t opParams = { .ifsSetup = FALSE, .ifsUsec = 0 }; - BbBleDrvSetOpParams(&opParams); + PalBbBleOpParam_t opParams = { .ifsSetup = FALSE, .ifsUsec = 0 }; + PalBbBleSetOpParams(&opParams); } /*************************************************************************************************/ @@ -127,8 +133,8 @@ static inline void bbBleClrIfs(void) /*************************************************************************************************/ static inline void bbBleSetIfs(void) { - BbBleDrvOpParam_t opParams = { .ifsSetup = TRUE, .ifsUsec = LL_BLE_TIFS_US }; - BbBleDrvSetOpParams(&opParams); + PalBbBleOpParam_t opParams = { .ifsSetup = TRUE, .ifsUsec = LL_BLE_TIFS_US }; + PalBbBleSetOpParams(&opParams); } #endif /* BB_BLE_INT_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_main.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_main.c index 4c17f011ed..8802961676 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_main.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_main.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,13 +16,14 @@ /*************************************************************************************************/ /*! - * \brief Generic BLE baseband driver implementation file. + * \file + * \brief Generic BLE baseband driver implementation file. */ /*************************************************************************************************/ #include "bb_api.h" #include "bb_ble_int.h" -#include "bb_ble_drv.h" +#include "pal_bb_ble.h" #include /************************************************************************************************** @@ -44,8 +45,8 @@ bbBleCtrlBlk_t bbBleCb; /*!< BB BLE control block. */ /*************************************************************************************************/ static void bbBleStartBle(void) { - BbBleDrvEnable(); - BbBleDrvEnableDataWhitening(TRUE); + PalBbBleEnable(); + PalBbBleEnableDataWhitening(TRUE); } /*************************************************************************************************/ @@ -57,7 +58,7 @@ static void bbBleStartBle(void) /*************************************************************************************************/ static void bbBleStopBle(void) { - BbBleDrvDisable(); + PalBbBleDisable(); } /*************************************************************************************************/ @@ -69,8 +70,8 @@ static void bbBleStopBle(void) /*************************************************************************************************/ static void bbBleStartBleDtm(void) { - BbBleDrvEnable(); - BbBleDrvEnableDataWhitening(FALSE); + PalBbBleEnable(); + PalBbBleEnableDataWhitening(FALSE); } /*************************************************************************************************/ @@ -82,9 +83,9 @@ static void bbBleStartBleDtm(void) /*************************************************************************************************/ static void bbBleStartPrbs15(void) { - BbBleDrvEnable(); - BbBleDrvEnableDataWhitening(FALSE); - BbBleDrvEnablePrbs15(TRUE); + PalBbBleEnable(); + PalBbBleEnableDataWhitening(FALSE); + PalBbBleEnablePrbs15(TRUE); } /*************************************************************************************************/ @@ -96,8 +97,8 @@ static void bbBleStartPrbs15(void) /*************************************************************************************************/ static void bbBleStopPrbs15(void) { - BbBleDrvDisable(); - BbBleDrvEnablePrbs15(FALSE); + PalBbBleDisable(); + PalBbBleEnablePrbs15(FALSE); } /*************************************************************************************************/ @@ -152,7 +153,7 @@ static void bbBleCancelOp(BbOpDesc_t *pBod) /*************************************************************************************************/ void BbBleInit(void) { - BbBleDrvInit(); + PalBbBleInit(); BbRegisterProt(BB_PROT_BLE, bbBleExecOp, bbBleCancelOp, bbBleStartBle, bbBleStopBle); BbRegisterProt(BB_PROT_BLE_DTM, bbBleExecOp, bbBleCancelOp, bbBleStartBleDtm, bbBleStopBle); BbRegisterProt(BB_PROT_PRBS15, NULL, bbBleCancelOp, bbBleStartPrbs15, bbBleStopPrbs15); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/bb/ble/bb_ble_pdufilt.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_pdufilt.c similarity index 99% rename from features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/bb/ble/bb_ble_pdufilt.c rename to features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_pdufilt.c index 083eed477d..1638e68a7f 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/bb/ble/bb_ble_pdufilt.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_pdufilt.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Generic BLE device filtering implementation file. + * \file + * \brief Generic BLE device filtering implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/bb/ble/bb_ble_periodiclist.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_periodiclist.c similarity index 98% rename from features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/bb/ble/bb_ble_periodiclist.c rename to features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_periodiclist.c index 4317556f56..e1684340d1 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/bb/ble/bb_ble_periodiclist.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_periodiclist.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Generic BLE whitelist implementation file. + * \file + * \brief Generic BLE whitelist implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/bb/ble/bb_ble_reslist.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_reslist.c similarity index 93% rename from features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/bb/ble/bb_ble_reslist.c rename to features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_reslist.c index b77440a840..2a4933bd01 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/bb/ble/bb_ble_reslist.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_reslist.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Generic BLE resolving list implementation file. + * \file + * \brief Generic BLE resolving list implementation file. */ /*************************************************************************************************/ @@ -24,7 +25,8 @@ #include "bb_ble_api.h" #include "bb_ble_api_reslist.h" #include "bb_ble_api_pdufilt.h" -#include "bb_ble_drv.h" +#include "pal_bb_ble.h" +#include "pal_crypto.h" #include "wsf_assert.h" #include "ll_math.h" #include "util/bda.h" @@ -59,6 +61,7 @@ typedef struct bool_t localIrkZero; /*!< Indicates that local IRK is zero. */ bool_t peerRpaGenerated; /*!< Indicates that peer RPA was locally generated. */ uint8_t privMode; /*!< Privacy mode. */ + bool_t isRpaUpd; /*!< TRUE if either lcaol RPA or peer RPA is updated. */ } bbBleResListEntry_t; /************************************************************************************************** @@ -184,7 +187,7 @@ static uint32_t bbGenerateHash(const uint8_t *pIrk, uint32_t r) rprime[2] = ((r >> 16) & 0xFF); /* r' = e(k, r') */ - LlMathAesEcb(pIrk, rprime, rprime); + PalCryptoAesEcb(pIrk, rprime, rprime); /* ah(k, r) = e(k, r') mod 2^24 */ hash = (rprime[0] << 0) | @@ -210,7 +213,7 @@ static uint64_t bbGenerateRpa(const uint8_t *pIrk) uint32_t hash; uint64_t rpa; - BbBleDrvRand((uint8_t *)&prand, (sizeof(uint32_t) / sizeof(uint8_t))); + PalCryptoGenerateRandomNumber((uint8_t *)&prand, (sizeof(uint32_t) / sizeof(uint8_t))); prand = (prand & 0x003FFFFF) | 0x00400000; hash = bbGenerateHash(pIrk, prand); @@ -870,5 +873,50 @@ void BbBleResListHandleTimeout(void) { pEntry->peerRpa = bbGenerateRpa(pEntry->peerIrk); } + + pEntry->isRpaUpd = TRUE; } } + +/*************************************************************************************************/ +/*! + * \brief Check if either local RPA or peer RPA is updated. + * + * \param peerAddrType Peer identity address type. + * \param peerIdentityAddr Peer identity address. + * + * \return TRUE if either local RPA or peer RPA is updated. + * + */ +/*************************************************************************************************/ +bool_t BbBleResListIsRpaUpd(uint8_t peerAddrType, uint64_t peerIdentityAddr) +{ + bbBleResListEntry_t *pEntry; + bool_t result; + + pEntry = bbBleFindResolvingListEntry(peerAddrType, peerIdentityAddr); + if (pEntry != NULL) + { + result = pEntry->isRpaUpd; + pEntry->isRpaUpd = FALSE; + return result; + } + + return FALSE; +} + +/*************************************************************************************************/ +/*! + * \brief Check if peer identity is in the resolving list. + * + * \param peerAddrType Peer identity address type. + * \param peerIdentityAddr Peer identity address. + * + * \return TRUE if peer addr is in the resolving list. + * + */ +/*************************************************************************************************/ +bool_t bbBleIsPeerInResList(uint8_t peerAddrType, uint64_t peerIdentityAddr) +{ + return (bbBleFindResolvingListEntry(peerAddrType, peerIdentityAddr) != NULL) ? TRUE : FALSE; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_test.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_test.c index 3eaeb787c4..bf2f8f2a2b 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_test.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_test.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Generic BLE baseband driver implementation file. + * \file + * \brief Generic BLE baseband driver implementation file. */ /*************************************************************************************************/ @@ -76,16 +77,16 @@ static void bbTestTxCompCback(uint8_t status) const uint32_t pktInter = BB_US_TO_BB_TICKS(pktInterUsec); int16_t dueOffsetUsec = pktInterUsec - BB_TICKS_TO_US(pktInter); - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); bbBleCb.bbParam.due = bbBleCb.bbParam.due + pktInter; bbBleCb.bbParam.dueOffsetUsec = WSF_MAX(dueOffsetUsec, 0); - BbBleDrvSetChannelParam(&pBle->chan); - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetChannelParam(&pBle->chan); + PalBbBleSetDataParams(&bbBleCb.bbParam); bbBleClrIfs(); /* never setup for TIFS */ - BbBleDrvTxBufDesc_t desc = {.pBuf = pTx->pTxBuf, .len = pTx->txLen}; - BbBleDrvTxData(&desc, 1); + PalBbBleTxBufDesc_t desc = {.pBuf = pTx->pTxBuf, .len = pTx->txLen}; + PalBbBleTxData(&desc, 1); } switch (status) @@ -146,20 +147,20 @@ static void bbTestRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, uint32_ } else { - BbBleDrvCancelTifs(); + PalBbBleCancelTifs(); const uint32_t pktInterUsec = pBbRtCfg->rfSetupDelayUs; const uint32_t pktInter = BB_US_TO_BB_TICKS(pktInterUsec); int16_t dueOffsetUsec = pktInterUsec - BB_TICKS_TO_US(pktInter); - bbBleCb.bbParam.due = BbDrvGetCurrentTime() + pktInter; + bbBleCb.bbParam.due = PalBbGetCurrentTime(USE_RTC_BB_CLK) + pktInter; bbBleCb.bbParam.dueOffsetUsec = WSF_MAX(dueOffsetUsec, 0); bbBleCb.bbParam.rxTimeoutUsec = pRx->rxSyncDelayUsec; - BbBleDrvSetChannelParam(&pBle->chan); - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetChannelParam(&pBle->chan); + PalBbBleSetDataParams(&bbBleCb.bbParam); bbBleClrIfs(); /* never setup for TIFS */ - BbBleDrvRxData(pRx->pRxBuf, pRx->rxLen); + PalBbBleRxData(pRx->pRxBuf, pRx->rxLen); } switch (status) @@ -192,7 +193,7 @@ static void bbTestRxCompCback(uint8_t status, int8_t rssi, uint32_t crc, uint32_ /*************************************************************************************************/ static void bbTestCleanupOp(BbOpDesc_t *pBod, BbBleData_t *pBle) { - BbBleDrvCancelData(); + PalBbBleCancelData(); BbTerminateBod(); } @@ -215,12 +216,12 @@ static void bbSlvExecuteTestTxOp(BbOpDesc_t *pBod, BbBleData_t *pBle) bbBleCb.bbParam.due = pBod->due; bbBleCb.bbParam.dueOffsetUsec = pBod->dueOffsetUsec; - BbBleDrvSetChannelParam(&pBle->chan); - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetChannelParam(&pBle->chan); + PalBbBleSetDataParams(&bbBleCb.bbParam); bbBleClrIfs(); /* never setup for TIFS */ - BbBleDrvTxBufDesc_t desc = {.pBuf = pTx->pTxBuf, .len = pTx->txLen}; - BbBleDrvTxData(&desc, 1); + PalBbBleTxBufDesc_t desc = {.pBuf = pTx->pTxBuf, .len = pTx->txLen}; + PalBbBleTxData(&desc, 1); } /*************************************************************************************************/ @@ -243,11 +244,11 @@ static void bbSlvExecuteTestRxOp(BbOpDesc_t *pBod, BbBleData_t *pBle) bbBleCb.bbParam.dueOffsetUsec = pBod->dueOffsetUsec; bbBleCb.bbParam.rxTimeoutUsec = pRx->rxSyncDelayUsec; - BbBleDrvSetChannelParam(&pBle->chan); - BbBleDrvSetDataParams(&bbBleCb.bbParam); + PalBbBleSetChannelParam(&pBle->chan); + PalBbBleSetDataParams(&bbBleCb.bbParam); bbBleClrIfs(); /* never setup for TIFS */ - BbBleDrvRxData(pRx->pRxBuf, pRx->rxLen); + PalBbBleRxData(pRx->pRxBuf, pRx->rxLen); } /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/bb/ble/bb_ble_whitelist.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_whitelist.c similarity index 97% rename from features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/bb/ble/bb_ble_whitelist.c rename to features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_whitelist.c index 944c969d22..dd55b28fbd 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/bb/ble/bb_ble_whitelist.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/bb/bb_ble_whitelist.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Generic BLE whitelist implementation file. + * \file + * \brief Generic BLE whitelist implementation file. */ /*************************************************************************************************/ @@ -165,6 +166,12 @@ void BbBleWhiteListClear(void) /*************************************************************************************************/ bool_t BbBleWhiteListAdd(bool_t randAddr, uint64_t addr) { + if (BbBleWhiteListCheckAddr(randAddr, addr)) + { + /* Return TRUE if the address is already in the list. */ + return TRUE; + } + if (bbBleWhiteListNumEntries < bbBleWhiteListNumEntriesMax) { addr |= (uint64_t)randAddr << 48; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api.h index 2460ee19b2..b34d9f7cf0 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller common interface file. + * \file + * \brief Link layer controller common interface file. */ /*************************************************************************************************/ @@ -55,7 +56,10 @@ enum LCTR_DISP_EXT_INIT, /*!< Extended Initiate message dispatch handler type. */ LCTR_DISP_PER_ADV, /*!< Periodic Advertising message dispatch handler type. */ LCTR_DISP_PER_CREATE_SYNC, /*!< Periodic Create Sync message dispatch handler type. */ + LCTR_DISP_TRANFER_SYNC, /*!< Periodic Sync Transfer message dispatch handler type. */ LCTR_DISP_PER_SCAN, /*!< Periodic Scanning message dispatch handler type. */ + LCTR_DISP_ACAD, /*!< ACAD message dispatch handler type (currently only used by slave). */ + LCTR_DISP_CIS, /*!< Connected isochronous stream dispatch handler type. */ LCTR_DISP_TOTAL, /*!< Total number of dispatch handlers. */ /* Special IDs */ LCTR_DISP_FIRST_SM = LCTR_DISP_CONN_IND+1, /*!< First state machine. */ @@ -75,6 +79,9 @@ enum LCTR_EVENT_RX_PENDING, /*!< Receive data PDU pending. */ LCTR_EVENT_TX_PENDING, /*!< Transmit data PDU pending. */ LCTR_EVENT_TX_COMPLETE, /*!< Transmit data PDU completed. */ + LCTR_EVENT_CIS_TX_PENDING, /*!< Transmit data PDU pending. */ + LCTR_EVENT_CIS_RX_PENDING, /*!< Receive data PDU pending. */ + LCTR_EVENT_CIS_TX_COMPLETE, /*!< Transmit data PDU completed. */ LCTR_EVENT_RX_ADVB, /*!< Receive AdvB PDU completed. */ LCTR_EVENT_RX_DIRECT_ADVB, /*!< Receive direct AdvB PDU completed. */ LCTR_EVENT_RX_SCAN_REQ, /*!< Receive scan request PDU completed. */ @@ -88,6 +95,7 @@ enum { LCTR_HOST_REPLY_CONN_PARAM_REQ = (1 << 0), /*!< Waiting for host to submit a connection parameter request reply. */ LCTR_HOST_REPLY_LTK_REQ = (1 << 1), /*!< Waiting for host to submit a LTK request reply. */ + LCTR_HOST_REPLY_CIS_REQ = (1 << 2), /*!< Waiting for host to submit a CIS request reply. */ }; /************************************************************************************************** @@ -102,6 +110,13 @@ typedef struct uint8_t event; /*!< PDU ID. */ } lctrMsgHdr_t; +/*! \brief Channel map update message. */ +typedef struct +{ + lctrMsgHdr_t hdr; /*!< Message header. */ + uint64_t chanMap; /*!< Channel map. */ +} lctrChanMapUpdate_t; + /*! \brief Connect request PDU. */ typedef struct { @@ -141,6 +156,21 @@ typedef struct Global Variables **************************************************************************************************/ +/* \brief Call signature for periodic enabled check function */ +typedef bool_t (*LctrIsPerAdvEnabledFn_t)(uint8_t handle); + +/* Function pointer for periodic advertising enable check */ +extern LctrIsPerAdvEnabledFn_t LctrPerAdvEnabled; + +/* \brief Call signature for extended scan enabled check function. */ +typedef bool_t (*LctrExtCheckFn_t)(uint8_t scanPhy); + +/* Function pointer for extended scan enable check. */ +extern LctrExtCheckFn_t LctrMstExtScanEnabled; + +/* Function pointer for extended advertising init enable check. */ +extern LctrExtCheckFn_t LctrMstExtInitEnabled; + /* Runtime configuration. */ extern const LlRtCfg_t *pLctrRtCfg; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_master.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_master.h index fa1c35290c..fb4cc22802 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_master.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_master.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller scanning master interface file. + * \file + * \brief Link layer controller scanning master interface file. */ /*************************************************************************************************/ @@ -100,6 +101,10 @@ void LctrMstScanDefaults(void); void lctrAdvReportsInc(void); void lctrAdvReportsDec(void); +/* Utility */ +bool_t LctrMstScanIsEnabled(void); +bool_t LctrMstScanIsPrivAddr(void); + /*! \} */ /* LL_LCTR_API_ADV_MST */ #ifdef __cplusplus diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_master_ae.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_master_ae.h index 7e0acba80d..40f666dcea 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_master_ae.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_master_ae.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller extended scanning master interface file. + * \file + * \brief Link layer controller extended scanning master interface file. */ /*************************************************************************************************/ @@ -52,13 +53,25 @@ enum { /* Broadcast events */ LCTR_CREATE_SYNC_MSG_RESET = LCTR_MSG_RESET, /*!< Reset API message. */ - /* Advertising events */ LCTR_CREATE_SYNC_MSG_CREATE, /*!< Create sync create API event. */ LCTR_CREATE_SYNC_MSG_CANCEL, /*!< Create sync cancel sync API event. */ + LCTR_CREATE_SYNC_MSG_FAILED, /*!< Create sync failed event. */ LCTR_CREATE_SYNC_MSG_DONE, /*!< Create sync done event. */ LCTR_CREATE_SYNC_MSG_TERMINATE, /*!< Create sync scanning BOD terminate event. */ LCTR_CREATE_SYNC_MSG_TOTAL /*!< Total number of Create sync events. */ +}; +/*! \brief Scanner transfer sync task messages for \a LCTR_DISP_TRANFER_SYNC dispatcher. */ +enum +{ + /* Broadcast events */ + LCTR_TRANSFER_SYNC_MSG_RESET = LCTR_MSG_RESET, /*!< Reset API message. */ + LCTR_TRANSFER_SYNC_MSG_START = LCTR_CREATE_SYNC_MSG_CREATE, /*!< Transfer sync start event. */ + LCTR_TRANSFER_SYNC_MSG_CANCEL = LCTR_CREATE_SYNC_MSG_CANCEL, /*!< Transfer sync cancel sync API event. */ + LCTR_TRANSFER_SYNC_MSG_FAILED = LCTR_CREATE_SYNC_MSG_FAILED, /*!< Transfer sync failed event. */ + LCTR_TRANSFER_SYNC_MSG_DONE = LCTR_CREATE_SYNC_MSG_DONE, /*!< Transfer sync done event. */ + LCTR_TRANSFER_SYNC_MSG_TERMINATE = LCTR_CREATE_SYNC_MSG_TERMINATE, /*!< Transfer sync scanning BOD terminate event. */ + LCTR_TRANSFER_SYNC_MSG_TOTAL = LCTR_CREATE_SYNC_MSG_TOTAL /*!< Total number of Transfer sync events. */ }; /*! \brief Scanner periodic synchronous task messages for \a LCTR_DISP_PER_SCAN dispatcher. */ @@ -122,6 +135,7 @@ typedef struct { lctrMsgHdr_t hdr; /*!< Message header. */ uint8_t filterPolicy; /*!< Filter Policy. */ + uint8_t repDisabled; /*!< Reporting disabled. */ uint8_t advSID; /*!< Advertising SID. */ uint8_t advAddrType; /*!< Advertiser Address Type. */ uint64_t advAddr; /*!< Advertiser Address. */ @@ -129,11 +143,30 @@ typedef struct uint16_t syncTimeOut; /*!< Synchronization Timeout. */ } lctrPerCreateSyncMsg_t; +/*! \brief Periodic transfer sync message. */ +typedef struct +{ + lctrMsgHdr_t hdr; /*!< Message header. */ + uint16_t id; /*!< ID. */ + uint8_t bSyncInfo[LL_SYNC_INFO_LEN]; /*!< SyncInfo bytes. */ + uint16_t connHandle; /*!< Connection handle. */ + uint16_t ceRef; /*!< Reference connection event counter. */ + uint16_t ceRcvd; /*!< Connection event counter when LL_PERIODIC_SYNC_IND was received. */ + uint16_t lastPECounter; /*!< Last PA event counter. */ + uint8_t advSID; /*!< Advertising SID. */ + uint8_t advAddrType; /*!< Advertiser Address Type. */ + uint8_t scaB; /*!< Sleep clock accuracy of the device sending LL_PERIODIC_SYNC_IND. */ + uint8_t rxPhy; /*!< PHY used for periodic advertising scan. */ + uint64_t advAddr; /*!< Advertiser Address. */ + uint16_t syncConnEvtCounter; /*!< Connection event counter when the contents of the PDU is determined. */ +} lctrPerTransferSyncMsg_t; + /*! \brief Periodic Advertising message data. */ typedef union { lctrMsgHdr_t hdr; /*!< Message header. */ lctrPerCreateSyncMsg_t createSync; /*!< Periodic create sync message data. */ + lctrPerTransferSyncMsg_t transferSync; /*!< Periodic transfer sync message data. */ } LctrPerScanMsg_t; /************************************************************************************************** @@ -151,6 +184,7 @@ extern LctrPerScanMsg_t *pLctrMstPerScanMsg; void LctrMstExtScanInit(void); void LctrMstExtScanDefaults(void); void LctrMstPerCreateSyncInit(void); +void LctrMstPerTransferSyncInit(void); void LctrMstPerScanInit(void); /* Status */ @@ -160,9 +194,17 @@ bool_t LctrMstExtScanValidateParam(void); void LctrMstExtScanSetScanPhy(uint8_t scanPhy); void LctrMstExtScanClearScanPhy(uint8_t scanPhy); void LctrMstExtScanSetParam(uint8_t scanPhy, uint8_t ownAddrType, uint8_t scanFiltPolicy, const LlExtScanParam_t *pParam); +bool_t LctrMstExtScanIsEnabled(uint8_t scanPhy); +bool_t LctrMstExtScanIsPrivAddr(uint8_t scanPhy); bool_t LctrMstPerIsSyncPending(void); bool_t LctrMstPerIsSyncDisabled(void); bool_t LctrMstPerIsSync(uint8_t advSID, uint8_t advAddrType, uint64_t advAddr); +uint8_t lctrMstPerGetNumPerScanCtx(void); +uint64_t LctrGetPerScanChanMap(uint16_t handle); +bool_t lctrMstPerIsSyncHandleValid(uint16_t syncHandle); +void LctrPastInit(void); +uint8_t LctrPeriodicAdvSyncTransfer(uint16_t connHandle, uint16_t serviceData, uint16_t syncHandle); +void LctrMstPerSetRcvEnable(uint16_t syncHandle, bool_t enable); #ifdef __cplusplus }; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_slave.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_slave.h index 1c52b8367c..a84a647aef 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_slave.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_slave.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller advertising slave interface file. + * \file + * \brief Link layer controller advertising slave interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_slave_ae.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_slave_ae.h index 18005b2789..03f09ce6b5 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_slave_ae.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_adv_slave_ae.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller extended advertising slave interface file. + * \file + * \brief Link layer controller extended advertising slave interface file. */ /*************************************************************************************************/ @@ -61,6 +62,14 @@ enum LCTR_PER_ADV_MSG_TOTAL /*!< Total number of periodic advertising events. */ }; +/*! \brief Acad dispatcher messages */ +enum +{ + LCTR_ACAD_MSG_CHAN_UPDATE, /* Start a channel map update */ + LCTR_ACAD_MSG_CHAN_UPDATE_FINISH, /* Finish a channel map update */ + LCTR_ACAD_MSG_TOTAL +}; + /************************************************************************************************** Data Types **************************************************************************************************/ @@ -91,6 +100,7 @@ typedef union { lctrMsgHdr_t hdr; /*!< Message header. */ LctrPerAdvEnableMsg_t perEnable; /*!< Periodic enable message data. */ + lctrChanMapUpdate_t chanUpdate; /*!< Channel map update data. */ } LctrPerAdvMsg_t; /************************************************************************************************** @@ -107,6 +117,7 @@ uint8_t LctrIsExtAdvEnableParamValid(uint8_t enable, LlExtAdvEnableParam_t *pEna uint8_t LctrIsExtAdvEnableReady(uint8_t handle); bool_t LctrIsAdvHandleValid(uint8_t handle); uint8_t LctrGetExtAdvTxPowerLevel(uint16_t handle, int8_t *pLevel); +bool_t LctrIsPerAdvEnabled(uint8_t handle); /* Control */ uint8_t LctrGetAdvHandles(uint8_t pHandles[LL_MAX_ADV_SETS]); @@ -114,6 +125,7 @@ uint8_t LctrSetExtAdvSetRandAddr(uint8_t handle, const uint8_t *pAddr); uint8_t LctrGetExtAdvSetRandAddr(uint8_t handle, uint8_t *pAddr); uint8_t LctrSetExtAdvParam(uint8_t handle, LlExtAdvParam_t *pExtAdvParam); uint8_t LctrSetExtAdvData(uint8_t handle, uint8_t op, uint8_t fragPref, uint8_t len, const uint8_t *pData); +uint64_t LctrGetPerAdvChanMap(uint8_t handle); uint8_t LctrSetExtScanRespData(uint8_t handle, uint8_t op, uint8_t fragPref, uint8_t len, const uint8_t *pData); uint8_t LctrRemoveAdvSet(uint8_t handle); uint8_t LctrClearAdvSets(void); @@ -121,6 +133,8 @@ uint8_t LctrSetAuxOffsetDelay(uint8_t handle, uint32_t delayUsec); uint8_t LctrSetExtAdvDataFragLen(uint8_t handle, uint8_t fragLen); uint8_t LctrSetExtAdvTxPhyOptions(uint8_t handle, uint8_t priPhyOpts, uint8_t secPhyOpts); uint8_t LctrSetPeriodicAdvParam(uint8_t handle, LlPerAdvParam_t *pPerAdvParam); +uint8_t LctrPeriodicAdvSetInfoTransfer(uint16_t connHandle, uint16_t serviceData, uint8_t advHandle); +uint8_t LctrSetPeriodicAdvSyncTransParams(uint16_t connHandle, uint8_t mode, uint16_t skip, uint16_t syncTimeout, uint8_t cteType); void LctrSetPeriodicAdvEnable(uint8_t handle, bool_t enable); uint8_t LctrSetPeriodicAdvData(uint8_t handle, uint8_t op, uint8_t len, const uint8_t *pData); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_conn.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_conn.h index 2805ccc1bb..3c1d6ceb3a 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_conn.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_conn.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller connection interface file. + * \file + * \brief Link layer controller connection interface file. */ /*************************************************************************************************/ @@ -77,6 +78,12 @@ enum LCTR_CONN_MSG_API_DATA_LEN_CHANGE, /*!< Data length change API event. */ LCTR_CONN_MSG_API_PHY_UPDATE, /*!< PHY update API event. */ LCTR_CONN_MSG_API_SET_MIN_USED_CHAN, /*!< Set minimum number of used channels API event. */ + LCTR_CONN_MSG_API_PER_ADV_SYNC_TRSF, /*!< Periodic advertising sync transfer API event. */ + LCTR_CONN_MSG_API_REQ_PEER_SCA, /*!< Request peer SCA. */ + LCTR_CONN_MSG_API_CIS_REQ, /*!< CIS request API event. */ + LCTR_CONN_MSG_API_CIS_REQ_ACCEPT, /*!< Peer CIS request accept API event. */ + LCTR_CONN_MSG_API_CIS_REQ_REJECT, /*!< Peer CIS request accept API event. */ + /* Internal events */ _LCTR_CONN_INT_EVENTS = 40, LCTR_CONN_DATA_PENDING, /*!< New data pending. */ @@ -93,13 +100,15 @@ enum LCTR_CONN_LLCP_START_PENDING, /*!< Start pending LLCP procedure. */ LCTR_CONN_LLCP_SKIP_CONN_PARAM, /*!< Skip connection parameter exchange. */ LCTR_CONN_LLCP_REJECT_CONN_UPD, /*!< Reject a connection update. */ - _LCTR_CONN_TERM_EVENTS = 60, + _LCTR_CONN_TERM_EVENTS = 70, LCTR_CONN_TERM_SUP_TIMEOUT, /*!< Terminate connection due to supervision timeout. */ LCTR_CONN_TERM_MIC_FAILED, /*!< Terminate connection due to MIC failure. */ LCTR_CONN_TERM_INST_PASSED, /*!< Terminate connection due to instant passed. */ + LCTR_CONN_TERM_CIS_LOCAL_RESOURCE, /*!< Terminate CIS connection due to local resource limitation. */ LCTR_CONN_TERMINATED, /*!< Connection event terminated. */ - _LCTR_CONN_TMR_EVENTS = 70, + _LCTR_CONN_TMR_EVENTS = 80, LCTR_CONN_TMR_LLCP_RSP_EXP, /*!< LLCP response timer expired. */ + LCTR_CONN_TMR_CIS_LLCP_RSP_EXP, /*!< CIS LLCP response timer expired. */ LCTR_CONN_TMR_PING_PERIOD_EXP, /*!< LE Ping period timer expired. */ LCTR_CONN_TMR_AUTH_PAYLOAD_EXP /*!< Authentication payload timer expired. */ }; @@ -115,13 +124,6 @@ typedef struct LlConnSpec_t connSpec; /*!< Updated connection specification. */ } lctrConnUpdate_t; -/*! \brief Channel map update message. */ -typedef struct -{ - lctrMsgHdr_t hdr; /*!< Message header. */ - uint64_t chanMap; /*!< Channel map. */ -} lctrChanMapUpdate_t; - /*! \brief Disconnect message. */ typedef struct { @@ -185,6 +187,45 @@ typedef struct uint8_t minUsedChan; /*!< Minimum number of used channels. */ } lctrSetMinUsedChan_t; +/*! \brief Periodic advertising sync transfer message. */ +typedef struct +{ + lctrMsgHdr_t hdr; /*!< Message header. */ + uint16_t syncSource; /*!< Periodic sync source. */ + uint16_t syncHandle; /*!< Periodic sync handle. */ + uint16_t serviceData; /*!< Service data provided by the host. */ +} lctrPerAdvSyncTrsf_t; + +/*! \brief Set minimum number of used channels message. */ +typedef struct +{ + lctrMsgHdr_t hdr; /*!< Message header. */ + uint8_t action; /*!< Action. */ +} lctrScaReq_t; + +/*! \brief CIS set CIG test CIS parameters. */ +typedef struct +{ + lctrMsgHdr_t hdr; /*!< Message header. */ + uint16_t cisHandle; /*!< CIS handle. */ +} lctrCreateCis_t; + +/*! \brief Internal reject CIS request message. */ +typedef struct +{ + lctrMsgHdr_t hdr; /*!< Message header. */ +// uint16_t cisHandle; /*!< CIS handle. */ + uint8_t reason; /*!< Reject reason. */ +} lctrRejCisReq_t; + +/*! \brief Disconnect message. */ +typedef struct +{ + lctrMsgHdr_t hdr; /*!< Message header. */ + uint8_t reason; /*!< Disconnect reason. */ + uint16_t cisHandle; /*!< CIS handle. */ +} lctrCisDisc_t; + /*! \brief Link layer controller message data. */ typedef union { @@ -200,6 +241,13 @@ typedef union lctrDataLengthChange_t dataLenChange; /*!< Data length change message data. */ lctrPhyUpdate_t phyUpd; /*!< PHY update message data. */ lctrSetMinUsedChan_t setMinUsedChan; /*!< Set minimum number of used channels message data. */ + lctrPerAdvSyncTrsf_t perAdvSyncTrsf; /*!< Periodic advertising sync transfer data. */ + lctrScaReq_t scaReq; /*!< Sleep clock accuracy request. */ + + /* CIS */ + lctrCreateCis_t createCis; /*!< Create CIS message data. */ + lctrRejCisReq_t rejCisReq; /*!< Reject CIS request message data. */ + lctrCisDisc_t cisDisc; /*!< CIS disconnect message data. */ } lctrConnMsg_t; /*! \brief Initialize connection context. */ @@ -249,19 +297,22 @@ void LctrVsConnInit(const LctrVsHandlers_t *pHdlrs); /* Helpers */ uint8_t LctrValidateConnSpec(const LlConnSpec_t *pConnSpec); +uint8_t LctrValidateModifyScaParam(uint8_t action); bool_t LctrIsProcActPended(uint16_t handle, uint8_t event); /* Status */ bool_t LctrIsConnHandleEnabled(uint16_t handle); +bool_t LctrIsCisConnHandleEnabled(uint16_t handle); uint8_t LctrGetRole(uint16_t handle); int8_t LctrGetRssi(uint16_t handle); int8_t LctrGetTxPowerLevel(uint16_t handle); uint64_t LctrGetChannelMap(uint16_t handle); -uint8_t LctrGetUsedFeatures(uint16_t handle); +uint64_t LctrGetUsedFeatures(uint16_t handle); uint8_t LctrGetTxPhy(uint16_t handle); uint8_t LctrGetRxPhy(uint16_t handle); void LctrGetPeerMinUsedChan(uint16_t handle, uint8_t *pPeerMinUsedChan); bool_t LctrIsWaitingForReply(uint16_t handle, uint8_t reply); +bool_t LctrIsCisEnabled(uint16_t handle); /* Control */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_conn_cs2.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_conn_cs2.h index 86d965e066..e58eca5ae3 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_conn_cs2.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_conn_cs2.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller channel selection interface file. + * \file + * \brief Link layer controller channel selection interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_init_master.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_init_master.h index 8450e1d176..ecabac3faf 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_init_master.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_init_master.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller initiating master interface file. + * \file + * \brief Link layer controller initiating master interface file. */ /*************************************************************************************************/ @@ -63,6 +64,10 @@ enum void LctrMstInitInit(void); void LctrMstInitDefaults(void); +/* Utility */ +bool_t LctrMstInitIsEnabled(void); +bool_t LctrMstInitIsPrivAddr(void); + /*! \} */ /* LL_LCTR_API_INIT_MST */ #ifdef __cplusplus diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_init_master_ae.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_init_master_ae.h index 530893a2c5..2c31f7fab8 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_init_master_ae.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_init_master_ae.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller extended initiating master interface file. + * \file + * \brief Link layer controller extended initiating master interface file. */ /*************************************************************************************************/ @@ -39,6 +40,11 @@ extern "C" { /************************************************************************************************** Constants **************************************************************************************************/ +/*! \brief Change supervision timeout value to us. */ +#define LL_SUP_TIMEOUT_VAL_TO_US(x) x * 10000 + +/*! \brief Change connection interval value to us. */ +#define LL_CONN_INTERVAL_VAL_TO_US(x) x * 1250 /*! \brief Master extended initiate task messages for \a LCTR_DISP_EXT_INIT dispatcher. */ enum @@ -72,6 +78,10 @@ void LctrMstExtInitParam(uint8_t initPhy, const LlExtInitScanParam_t *pScanParam void LctrMstExtInitSetScanPhy(uint8_t scanPhy); void LctrMstExtInitClearScanPhy(uint8_t scanPhy); +/* Utility */ +bool_t LctrMstExtInitIsEnabled(uint8_t scanPhy); +bool_t LctrMstExtInitIsPrivAddr(uint8_t scanPhy); + /*! \} */ /* LL_LCTR_API_INIT_MST_AE */ #ifdef __cplusplus diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_phy.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_phy.h index 6cb7f954cd..aca0792686 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_phy.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_phy.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller PHY features interface file. + * \file + * \brief Link layer controller PHY features interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_priv.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_priv.h index d726efebc1..5cf1b16808 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_priv.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_priv.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller privacy interface file. + * \file + * \brief Link layer controller privacy interface file. */ /*************************************************************************************************/ @@ -39,10 +40,11 @@ extern "C" { Constants **************************************************************************************************/ -/*! \brief Slave advertising task messages for \a LCTR_DISP_ADV dispatcher. */ +/*! \brief Slave advertising task messages for \a LCTR_DISP_PRIV dispatcher. */ enum { /* Privacy events */ + LCTR_PRIV_MSG_RESET, /*!< HCI reset event. */ LCTR_PRIV_MSG_RES_PRIV_ADDR_TIMEOUT, /*!< Resolvable private address timeout event. */ LCTR_PRIV_MSG_ADDR_RES_NEEDED /*!< Address resolution needed. */ }; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_sc.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_sc.h index 6885eea771..a2ce015a28 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_sc.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lctr_api_sc.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller secure connections interface file. + * \file + * \brief Link layer controller secure connections interface file. */ /*************************************************************************************************/ @@ -42,6 +43,8 @@ void LctrScInit(void); /* Execution. */ uint8_t LctrGenerateP256KeyPair(void); uint8_t LctrGenerateDhKey(const uint8_t *pPubKey, const uint8_t *pPrivKey); +uint8_t LctrGenerateDebugDhKey(void); +uint8_t LctrSetValidatePublicKeyMode(uint8_t validateMode); /*! \} */ /* LL_LCTR_API_SC */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api.h index f37b37fe59..06a17e6e9c 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer manager common interface file. + * \file + * \brief Link layer manager common interface file. */ /*************************************************************************************************/ @@ -25,6 +26,7 @@ #include "ll_api.h" #include "ll_defs.h" +#include "hci_defs.h" #ifdef __cplusplus extern "C" { @@ -67,9 +69,16 @@ typedef struct wsfHandlerId_t handlerId; /*!< System event handler ID. */ uint16_t connCtxSize; /*!< Size of the connection context. */ uint16_t advSetCtxSize; /*!< Size of the advertising set context. */ + uint16_t extScanCtxSize; /*!< Size of the extended scanner context. */ + uint16_t extInitCtxSize; /*!< Size of the extended initiator context. */ uint16_t perScanCtxSize; /*!< Size of the periodic scanning context. */ + uint16_t cisCtxSize; /*!< Size of the CIS context. */ + uint16_t cigCtxSize; /*!< Size of the CIG context. */ uint64_t featuresDefault; /*!< Default supported features. */ + llIsoCback_t sendIsoCompCback; /*!< ISO data send complete callback. */ + llIsoCback_t recvIsoPendCback; /*!< ISO data receive pending callback. */ + /* Device parameters */ uint64_t bdAddr; /*!< Public device address. */ uint64_t supStates; /*!< Supported states. */ @@ -108,12 +117,35 @@ typedef struct bool_t addrResEna; /*!< Address resolution enabled. */ bool_t useLegacyCmds; /*!< Use only legacy advertising, scan or initiate commands. */ bool_t useExtCmds; /*!< Use only extended advertising, scan or initiate commands. */ + uint64_t chanClass; /*!< Channel class. */ + + /* Sleep clock accuracy override value. */ + int8_t scaMod; /*!< SCA override value. */ /* Power Class 1. */ int8_t powerThreshold[LL_MAX_PHYS]; /*!< Power threshold for each PHY. */ uint8_t localMinUsedChan[LL_MAX_PHYS]; /*!< Local minimum number of used channels for each PHY. */ + + uint8_t hciSupCommands[HCI_SUP_CMD_LEN]; /*!< Supported HCI commands bit mask. */ } lmgrCtrlBlk_t; +/*! \brief Channel parameters. */ +typedef struct +{ + /* Channel parameters */ + uint8_t lastChanIdx; /*!< Current channel index. */ + uint8_t numUsedChan; /*!< Number of used channels. */ + uint64_t chanMask; /*!< Channel mask. */ + uint8_t chanRemapTbl[LL_CHAN_DATA_MAX_IDX + 1]; /*!< Channel remapping table. */ + + uint8_t usedChSel; /*!< Used channel selection. */ + uint16_t chIdentifier; /*!< Channel identifier. */ + + /* For subevent calculation only */ + uint16_t prnLast; /*!< Last used permutation. */ + uint8_t subEvtIdx; /*!< Subevent index. */ +} lmgrChanParam_t; + /************************************************************************************************** Global Variables **************************************************************************************************/ @@ -143,12 +175,35 @@ bool_t LmgrIsAddressTypeAvailable(uint8_t ownAddrType); bool_t LmgrIsLegacyCommandAllowed(void); bool_t LmgrIsExtCommandAllowed(void); +/* Utility */ +void LmgrBuildRemapTable(lmgrChanParam_t *pChanParam); +uint8_t LmgrSelectNextChannel(lmgrChanParam_t *pChanParam, uint16_t eventCounter, uint16_t numSkip, bool_t calSubEvt); +uint32_t LmgrCalcWindowWideningUsec(uint32_t unsyncTimeUsec, uint32_t caPpm); +uint8_t LmgrSelectNextSubEvtChannel(lmgrChanParam_t *pChanParam); +uint8_t * LmgrReadHciSupCmd(void); + /* Event Messages */ void LmgrSendAdvEnableCnf(uint8_t status); void LmgrSendScanEnableCnf(uint8_t status); void LmgrSendAdvSetTermInd(uint8_t handle, uint8_t status, uint16_t connHandle, uint8_t numEvents); bool_t LmgrSendEvent(LlEvt_t *pEvt); +/*************************************************************************************************/ +/*! + * \brief Get operational mode flag. + * + * \param flag Flag to check. + * + * \return TRUE if flag is set. + * + * Get mode flag governing LL operations. + */ +/*************************************************************************************************/ +static inline bool_t lmgrGetOpFlag(uint32_t flag) +{ + return (lmgrCb.opModeFlags & flag) ? TRUE : FALSE; +} + /*! \} */ /* LL_LMGR_API */ #ifdef __cplusplus diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_master.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_master.h index 0dcd110451..f3504c0947 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_master.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_master.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer manager advertising master interface file. + * \file + * \brief Link layer manager advertising master interface file. */ /*************************************************************************************************/ @@ -52,7 +53,6 @@ typedef struct typedef struct { lmgrScanParam_t scanParam; /*!< Scan parameters. */ - uint64_t chanClass; /*!< Channel class. */ uint8_t scanChanMap; /*!< Scan channel map. */ uint8_t numAdvReport; /*!< Number of pending advertising reports. */ } lmgrMstScanCtrlBlk_t; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_master_ae.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_master_ae.h index ac507f3a7f..c39d8c01a6 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_master_ae.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_master_ae.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer manager advertising extension interface file. + * \file + * \brief Link layer manager advertising extension interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_slave.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_slave.h index c38765cfa7..6c323adb8b 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_slave.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_slave.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer manager advertising slave interface file. + * \file + * \brief Link layer manager advertising slave interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_slave_ae.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_slave_ae.h index 537906bda4..e59e0fc8bf 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_slave_ae.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_adv_slave_ae.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer manager advertising extension interface file. + * \file + * \brief Link layer manager advertising extension interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_conn.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_conn.h index a013a03e7f..d723560c43 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_conn.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_conn.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer manager connection interface file. + * \file + * \brief Link layer manager connection interface file. */ /*************************************************************************************************/ @@ -55,6 +56,10 @@ typedef struct uint8_t txPhys; /*!< Default transmitter PHYs. */ uint8_t rxPhys; /*!< Default receiver PHYs. */ + uint8_t syncMode; /*!< Default sync transfer mode. */ + uint16_t syncSkip; /*!< Default sync skip for periodic adv sync transfer. */ + uint16_t syncTimeout; /*!< Default sync timeout for periodic adv sync transfer. */ + } lmgrConnCtrlBlk_t; /************************************************************************************************** diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_priv.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_priv.h index d356b3e30a..b7979ac24c 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_priv.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_priv.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer manager privacy interface file. + * \file + * \brief Link layer manager privacy interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_sc.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_sc.h index 9990e04356..acf7401ef0 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_sc.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/include/lmgr_api_sc.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer manager secure connections interface file. + * \file + * \brief Link layer manager secure connections interface file. */ /*************************************************************************************************/ @@ -41,11 +42,21 @@ extern "C" { /*! \brief Secure connections parameter definition. */ typedef struct { - uint8_t privKey[LL_ECC_KEY_LEN]; /*!< P-256 private key. */ + uint8_t privKey[LL_ECC_KEY_LEN]; /*!< P-256 private key. */ bool_t eccOpActive; /*!< An ECC generation operation is active. */ bool_t privKeySet; /*!< P-256 private key set; do not generate new one. */ + bool_t pubKeyValid; /*!< DHKey won't start to generate unless public key is valid. */ + uint8_t validatePubKeyMode; /*!< Validate public key mode between ALT1 and ALT2. */ } lmgrScCtrlBlk_t; +/*! \brief Key validation mode between ALT1 and ALT2. */ +enum +{ + KEY_VALIDATE_MODE_ALT2 = 0, /*!< Return error code 0x12 in command complete event. (Default mode) */ + KEY_VALIDATE_MODE_ALT1 = 1, /*!< Return error code 0x12 in command status event. */ + KEY_VALIDATE_MODE_MAX = 1 /*!< Key validate mode maximum value. */ +}; + /************************************************************************************************** Global Variables **************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/init/init.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/init/init.c index b3ecd75f3c..45df5eda24 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/init/init.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/init/init.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,12 +16,15 @@ /*************************************************************************************************/ /*! - * \brief LL initialization for SoC configuration. + * \file + * \brief LL initialization for SoC configuration. */ /*************************************************************************************************/ #include "ll_init_api.h" #include "bb_ble_api.h" +#include "pal_bb_ble.h" +#include "pal_radio.h" #include "sch_api.h" /************************************************************************************************** @@ -59,6 +62,36 @@ void LlInitBbInit(void) #endif #endif + #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) + #ifdef INIT_OBSERVER + BbBleAuxScanMasterInit(); + BbBlePerScanMasterInit(); + #endif + + #ifdef INIT_BROADCASTER + BbBleAuxAdvSlaveInit(); + PalRadioInitPathComp(); + #endif + #endif + + #if (BT_VER >= LL_VER_BT_CORE_SPEC_MILAN) + #ifdef INIT_CENTRAL + BbBleCisMasterInit(); + #else + #ifdef INIT_OBSERVER + /* TODO BIS observer */ + #endif + #endif + + #ifdef INIT_PERIPHERAL + BbBleCisSlaveInit(); + #else + #ifdef INIT_BROADCASTER + /* TODO BIS broadcaster */ + #endif + #endif + #endif + BbBleTestInit(); } @@ -79,20 +112,11 @@ void LlInitSchInit(void) /*! * \brief Initialize LL. * - * \param initHandler Initialize WSF handler. - * * \return None. */ /*************************************************************************************************/ -void LlInitLlInit(bool_t initHandler) +void LlInitLlInit(void) { - if (initHandler) - { - wsfHandlerId_t handlerId = WsfOsSetNextHandler(LlHandler); - LlHandlerInit(handlerId); - } - /* else LlHandlerInit() is called by client */ - #ifdef INIT_CENTRAL LlScanMasterInit(); LlInitMasterInit(); @@ -124,6 +148,44 @@ void LlInitLlInit(bool_t initHandler) LlPrivInit(); LlScInit(); #endif + + #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) + #ifdef INIT_CENTRAL + LlExtScanMasterInit(); + LlExtInitMasterInit(); + LlPhyMasterInit(); + #if (BT_VER >= LL_VER_BT_CORE_SPEC_MILAN) + LlCisMasterInit(); + #endif + #else + #ifdef INIT_OBSERVER + LlExtScanMasterInit(); + #endif + #endif + + #ifdef INIT_PERIPHERAL + LlExtAdvSlaveInit(); + LlPhySlaveInit(); + #if (BT_VER >= LL_VER_BT_CORE_SPEC_MILAN) + LlCisSlaveInit(); + #endif + #else + #ifdef INIT_BROADCASTER + LlExtAdvSlaveInit(); + #endif + #endif + + #if defined(INIT_PERIPHERAL) || defined(INIT_CENTRAL) + LlChannelSelection2Init(); + #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_1) + LlPastInit(); + #endif + #endif + #endif + + /* Initialize handler after feature bits are set. */ + wsfHandlerId_t handlerId = WsfOsSetNextHandler(LlHandler); + LlHandlerInit(handlerId); } /*************************************************************************************************/ @@ -153,10 +215,12 @@ uint32_t LlInitSetBbRtCfg(const BbRtCfg_t *pBbRtCfg, const uint8_t wlSizeCfg, co freeMemAvail -= memUsed; totalMemUsed += memUsed; - memUsed = BbBleInitPeriodicList(plSizeCfg, pFreeMem, freeMemAvail); - pFreeMem += memUsed; - freeMemAvail -= memUsed; - totalMemUsed += memUsed; + #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) + memUsed = BbBleInitPeriodicList(plSizeCfg, pFreeMem, freeMemAvail); + pFreeMem += memUsed; + freeMemAvail -= memUsed; + totalMemUsed += memUsed; + #endif #ifdef INIT_ENCRYPTED memUsed = BbBleInitResolvingList(rlSizeCfg, pFreeMem, freeMemAvail); @@ -185,13 +249,40 @@ uint32_t LlInitSetLlRtCfg(const LlRtCfg_t *pLlRtCfg, uint8_t *pFreeMem, uint32_t { uint32_t totalMemUsed = 0; + #if defined (INIT_PERIPHERAL) || defined (INIT_CENTRAL) || (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) + uint32_t memUsed; + #endif + LlInitRunTimeCfg(pLlRtCfg); #if defined (INIT_PERIPHERAL) || defined (INIT_CENTRAL) - uint32_t memUsed; memUsed = LlInitConnMem(pFreeMem, freeMemAvail); - /* pFreeMem += memUsed; */ - /* freeMemAvail -= memUsed; */ + pFreeMem += memUsed; + freeMemAvail -= memUsed; + totalMemUsed += memUsed; + #endif + + #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) + memUsed = LlInitExtScanMem(pFreeMem, freeMemAvail); + pFreeMem += memUsed; + freeMemAvail -= memUsed; + totalMemUsed += memUsed; + + memUsed = LlInitExtAdvMem(pFreeMem, freeMemAvail); + pFreeMem += memUsed; + freeMemAvail -= memUsed; + totalMemUsed += memUsed; + #endif + + #if (BT_VER >= LL_VER_BT_CORE_SPEC_MILAN) + memUsed = LlInitCisMem(pFreeMem, freeMemAvail); + pFreeMem += memUsed; + freeMemAvail -= memUsed; + totalMemUsed += memUsed; + + memUsed = LlInitIsoMem(pFreeMem, freeMemAvail); + /* pFreeMem += memUsed; + freeMemAvail -= memUsed; */ totalMemUsed += memUsed; #endif @@ -200,20 +291,20 @@ uint32_t LlInitSetLlRtCfg(const LlRtCfg_t *pLlRtCfg, uint8_t *pFreeMem, uint32_t /*************************************************************************************************/ /*! - * \brief Initialize standard configuration. + * \brief Initialize configuration. * * \param pCfg Runtime configuration. * * \return Memory used. */ /*************************************************************************************************/ -uint32_t LlInitStdInit(LlInitRtCfg_t *pCfg) +uint32_t LlInit(LlInitRtCfg_t *pCfg) { uint32_t memUsed; uint32_t totalMemUsed = 0; memUsed = LlInitSetBbRtCfg(pCfg->pBbRtCfg, pCfg->wlSizeCfg, pCfg->rlSizeCfg, pCfg->plSizeCfg, - pCfg->pFreeMem, pCfg->freeMemAvail); + pCfg->pFreeMem, pCfg->freeMemAvail); pCfg->pFreeMem += memUsed; pCfg->freeMemAvail -= memUsed; totalMemUsed += memUsed; @@ -225,7 +316,7 @@ uint32_t LlInitStdInit(LlInitRtCfg_t *pCfg) LlInitBbInit(); LlInitSchInit(); - LlInitLlInit(TRUE); + LlInitLlInit(); return totalMemUsed; } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/init/init_ctr.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/init/init_ctr.c index 04fd9a42b8..98a8fa4300 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/init/init_ctr.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/init/init_ctr.c @@ -2,16 +2,20 @@ /*! * \brief LL initialization for controller configuration. * - * Copyright (c) 2013-2017 ARM Ltd. All Rights Reserved. - * ARM Ltd. confidential and proprietary. + * Copyright (c) 2013-2018 Arm Ltd. All Rights Reserved. + * Arm Ltd. confidential and proprietary. * - * IMPORTANT. Your use of this file is governed by a Software License Agreement - * ("Agreement") that must be accepted in order to download or otherwise receive a - * copy of this file. You may not use or copy this file for any purpose other than - * as described in the Agreement. If you do not agree to all of the terms of the - * Agreement do not use this file and delete all copies in your possession or control; - * if you do not have a copy of the Agreement, you must contact ARM Ltd. prior - * to any use, copying or further distribution of this software. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ /*************************************************************************************************/ @@ -26,6 +30,26 @@ /*! \brief Extended VS command decoder. */ extern bool_t lhciVsExtDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); +/*************************************************************************************************/ +/*! + * \brief Initialize controller LHCI handler. + * + * \return None. + */ +/*************************************************************************************************/ +void LlInitLhciHandler(void) +{ + wsfHandlerId_t handlerId; + +#if (BT_VER >= LL_VER_BT_CORE_SPEC_MILAN) + handlerId = WsfOsSetNextHandler(LhciIsoHandler); + LhciIsoHandlerInit(handlerId); +#else + handlerId = WsfOsSetNextHandler(LhciHandler); + LhciHandlerInit(handlerId); +#endif +} + /*************************************************************************************************/ /*! * \brief Initialize controller HCI transport. @@ -78,13 +102,50 @@ void LlInitLhciInit(void) LhciScInit(); #endif - wsfHandlerId_t handlerId = WsfOsSetNextHandler(LhciHandler); - LhciHandlerInit(handlerId); + LhciVsExtInit(lhciVsExtDecodeCmdPkt); + + #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) + #ifdef INIT_CENTRAL + LhciExtScanMasterInit(); + LhciExtConnMasterInit(); + #if (BT_VER >= LL_VER_BT_CORE_SPEC_MILAN) + LhciCisMasterInit(); + #endif + #else + #ifdef INIT_OBSERVER + LhciExtScanMasterInit(); + #endif + #endif + + #ifdef INIT_BROADCASTER + LhciExtAdvSlaveInit(); + #endif + + #ifdef INIT_PERIPHERAL + #if (BT_VER >= LL_VER_BT_CORE_SPEC_MILAN) + LhciCisSlaveInit(); + #endif + #endif + + #if defined(INIT_PERIPHERAL) || defined(INIT_CENTRAL) + LhciChannelSelection2Init(); + LhciPhyInit(); + #if defined(INIT_OBSERVER) || defined(INIT_BROADCASTER) + #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_1) + LhciPastInit(); + #endif + #endif + #endif + #endif + + #if (BT_VER >= LL_VER_BT_CORE_SPEC_MILAN) + LhciIsoInit(); + #endif } /*************************************************************************************************/ /*! - * \brief Initialize standard controller configuration. + * \brief Initialize controller configuration. * * \param pCfg Runtime configuration. * @@ -95,12 +156,11 @@ uint32_t LlInitControllerInit(LlInitRtCfg_t *pCfg) { uint32_t totalMemUsed; - totalMemUsed = LlInitStdInit(pCfg); + totalMemUsed = LlInit(pCfg); LlInitChciTrInit(); LlInitLhciInit(); - - LhciVsExtInit(lhciVsExtDecodeCmdPkt); + LlInitLhciHandler(); return totalMemUsed; } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/init/init_ctr_ext.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/init/init_ctr_ext.c deleted file mode 100644 index a0b5bc1733..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/init/init_ctr_ext.c +++ /dev/null @@ -1,79 +0,0 @@ -/*************************************************************************************************/ -/*! - * \brief LL initialization for extended controller configuration. - * - * Copyright (c) 2013-2017 ARM Ltd. All Rights Reserved. - * ARM Ltd. confidential and proprietary. - * - * IMPORTANT. Your use of this file is governed by a Software License Agreement - * ("Agreement") that must be accepted in order to download or otherwise receive a - * copy of this file. You may not use or copy this file for any purpose other than - * as described in the Agreement. If you do not agree to all of the terms of the - * Agreement do not use this file and delete all copies in your possession or control; - * if you do not have a copy of the Agreement, you must contact ARM Ltd. prior - * to any use, copying or further distribution of this software. - */ -/*************************************************************************************************/ - -#include "ll_init_api.h" -#include "lhci_api.h" -#include "chci_api.h" - -/************************************************************************************************** - Functions -**************************************************************************************************/ - -/*! \brief Extended VS command decoder. */ -extern bool_t lhciVsExtDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); - -/*************************************************************************************************/ -/*! - * \brief Initialize LL HCI extended features. - * - * \return None. - */ -/*************************************************************************************************/ -void LlInitLhciExtInit(void) -{ - LhciVsExtInit(lhciVsExtDecodeCmdPkt); - - #ifdef INIT_CENTRAL - LhciExtScanMasterInit(); - LhciExtConnMasterInit(); - #else - #ifdef INIT_OBSERVER - LhciExtScanMasterInit(); - #endif - #endif - - #ifdef INIT_BROADCASTER - LhciExtAdvSlaveInit(); - #endif - - #if defined(INIT_PERIPHERAL) || defined(INIT_CENTRAL) - LhciChannelSelection2Init(); - LhciPhyInit(); - #endif -} - -/*************************************************************************************************/ -/*! - * \brief Initialize extended controller configuration. - * - * \param pCfg Runtime configuration. - * - * \return Memory used. - */ -/*************************************************************************************************/ -uint32_t LlInitControllerExtInit(LlInitRtCfg_t *pCfg) -{ - uint32_t totalMemUsed; - - totalMemUsed = LlInitExtInit(pCfg); - - LlInitChciTrInit(); - LlInitLhciInit(); - LlInitLhciExtInit(); - - return totalMemUsed; -} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/init/init_ext.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/init/init_ext.c deleted file mode 100644 index 4b6db54f4b..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/init/init_ext.c +++ /dev/null @@ -1,152 +0,0 @@ -/* Copyright (c) 2009-2019 Arm Limited - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************************************/ -/*! - * \brief LL initialization for extended SoC configuration. - */ -/*************************************************************************************************/ - -#include "ll_init_api.h" -#include "bb_ble_api.h" - -/************************************************************************************************** - Functions -**************************************************************************************************/ - -/*************************************************************************************************/ -/*! - * \brief Initialize auxiliary BB operations. - * - * \return None. - */ -/*************************************************************************************************/ -void LlInitBbAuxInit(void) -{ - #ifdef INIT_OBSERVER - BbBleAuxScanMasterInit(); - BbBlePerScanMasterInit(); - #endif - - #ifdef INIT_BROADCASTER - BbBleAuxAdvSlaveInit(); - BbBleInitRfPathComp(); - #endif -} - -/*************************************************************************************************/ -/*! - * \brief Initialize LL extended features. - * - * \return None. - */ -/*************************************************************************************************/ -void LlInitLlExtInit(void) -{ - #ifdef INIT_CENTRAL - LlExtScanMasterInit(); - LlExtInitMasterInit(); - LlPhyMasterInit(); - #else - #ifdef INIT_OBSERVER - LlExtScanMasterInit(); - #endif - #endif - - #ifdef INIT_PERIPHERAL - LlExtAdvSlaveInit(); - LlPhySlaveInit(); - #else - #ifdef INIT_BROADCASTER - LlExtAdvSlaveInit(); - #endif - #endif - - #if defined(INIT_PERIPHERAL) || defined(INIT_CENTRAL) - LlChannelSelection2Init(); - #endif - /* Initialize handler after feature bits are set. */ - wsfHandlerId_t handlerId = WsfOsSetNextHandler(LlHandler); - LlHandlerInit(handlerId); -} - -/*************************************************************************************************/ -/*! - * \brief Set extended LL runtime configuration. - * - * \param pLlRtCfg LL runtime configuration (must be static). - * \param pFreeMem Free memory. - * \param freeMemAvail Amount of free memory in bytes. - * - * \return Amount of free memory consumed. - */ -/*************************************************************************************************/ -uint32_t LlInitSetExtLlRtCfg(const LlRtCfg_t *pLlRtCfg, uint8_t *pFreeMem, uint32_t freeMemAvail) -{ - uint32_t memUsed; - uint32_t totalMemUsed = 0; - - memUsed = LlInitSetLlRtCfg(pLlRtCfg, pFreeMem, freeMemAvail); - pFreeMem += memUsed; - freeMemAvail -= memUsed; - totalMemUsed += memUsed; - - memUsed = LlInitExtScanMem(pFreeMem, freeMemAvail); - pFreeMem += memUsed; - freeMemAvail -= memUsed; - totalMemUsed += memUsed; - - memUsed = LlInitExtAdvMem(pFreeMem, freeMemAvail); - /* pFreeMem += memUsed; */ - /* freeMemAvail -= memUsed; */ - totalMemUsed += memUsed; - - return totalMemUsed; -} - -/*************************************************************************************************/ -/*! - * \brief Initialize extended configuration. - * - * \param pCfg Runtime configuration. - * - * \return Memory used. - */ -/*************************************************************************************************/ -uint32_t LlInitExtInit(LlInitRtCfg_t *pCfg) -{ - uint32_t memUsed; - uint32_t totalMemUsed = 0; - - memUsed = LlInitSetBbRtCfg(pCfg->pBbRtCfg, pCfg->wlSizeCfg, pCfg->rlSizeCfg, pCfg->plSizeCfg, - pCfg->pFreeMem, pCfg->freeMemAvail); - pCfg->pFreeMem += memUsed; - pCfg->freeMemAvail -= memUsed; - totalMemUsed += memUsed; - - memUsed = LlInitSetExtLlRtCfg(pCfg->pLlRtCfg, pCfg->pFreeMem, pCfg->freeMemAvail); - pCfg->pFreeMem += memUsed; - pCfg->freeMemAvail -= memUsed; - totalMemUsed += memUsed; - - LlInitBbInit(); - LlInitBbAuxInit(); - LlInitSchInit(); - LlInitLlInit(FALSE); - LlInitLlExtInit(); - - return totalMemUsed; -} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_master.c index 3f9bd90084..2019a46260 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master scan action routines. + * \file + * \brief Link layer controller master scan action routines. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_master_ae.c index f970e4b058..0b0c40ba97 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master scan action routines. + * \file + * \brief Link layer controller master scan action routines. */ /*************************************************************************************************/ @@ -28,7 +29,7 @@ #include "wsf_assert.h" #include "wsf_msg.h" #include "wsf_trace.h" - +#include "bb_ble_api_reslist.h" #include "util/bstream.h" #include @@ -42,7 +43,7 @@ * \return TRUE if successful, FALSE otherwise. */ /*************************************************************************************************/ -static uint8_t lctrPerScanSetup(lctrPerCreateSyncCtrlBlk_t *pPerCreateSync, lctrPerCreateSyncMsg_t *pMsg) +static uint8_t lctrPerScanSetup(lctrPerCreateSyncCtrlBlk_t *pPerCreateSync, lctrPerCreateSyncMsg_t *pMsg, uint8_t createDispId) { lctrPerScanCtx_t *pPerScanCtx; @@ -58,6 +59,8 @@ static uint8_t lctrPerScanSetup(lctrPerCreateSyncCtrlBlk_t *pPerCreateSync, lctr pPerScanCtx->filtParam.advAddr = pMsg->advAddr; pPerScanCtx->skip = pMsg->skip; pPerScanCtx->syncTimeOutMs = LCTR_PER_SYNC_TIMEOUT_TO_MS(pMsg->syncTimeOut); + pPerScanCtx->createDispId = createDispId; + pPerScanCtx->repDisabled = pMsg->repDisabled; return LL_SUCCESS; } @@ -324,8 +327,8 @@ void lctrCreateSyncActCreate(void) lctrPerCreateSync.filtParam.advAddrType = pMsg->advAddrType; lctrPerCreateSync.filtParam.advSID = pMsg->advSID; - lctrPerScanSetup(&lctrPerCreateSync, pMsg); - lctrMstPerScanBuildOp(lctrPerCreateSync.pPerScanCtx, pMsg); + lctrPerScanSetup(&lctrPerCreateSync, pMsg, LCTR_DISP_PER_CREATE_SYNC); + lctrMstPerScanBuildOp(lctrPerCreateSync.pPerScanCtx); LmgrIncResetRefCount(); } @@ -360,12 +363,37 @@ void lctrCreateSyncActCancel(void) SchRemove(&lctrPerCreateSync.pPerScanCtx->bod); } - lctrSendCreateSyncMsg(LCTR_CREATE_SYNC_MSG_TERMINATE); + lctrPerCreateSync.pPerScanCtx->cancelByHost = TRUE; + lctrSendCreateSyncMsg(lctrPerCreateSync.pPerScanCtx, LCTR_CREATE_SYNC_MSG_TERMINATE); } /*************************************************************************************************/ /*! - * \brief Create sync cancel action function. + * \brief Create sync failed action function. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrCreateSyncActFailed(void) +{ + if (lctrPerCreateSync.createSyncPending == TRUE) + { + lctrPerCreateSync.pPerScanCtx->cancelCreateSync = TRUE; + lctrPerCreateSync.pPerScanCtx->cancelByHost = FALSE; + SchRemove(&lctrPerCreateSync.pPerScanCtx->bod); + + lctrPerCreateSync.createSyncPending = FALSE; + } + + /* Pack and notify the host about sync established event with failed status. */ + lmgrPerAdvSyncEstdInd_t rpt; + lctrPerAdvSyncEstRptPack(lctrPerCreateSync.pPerScanCtx, &rpt); + LmgrSendSyncEstInd(LL_ERROR_CODE_CONN_FAILED_TO_ESTABLISH, LCTR_GET_PER_SCAN_HANDLE(lctrPerCreateSync.pPerScanCtx), &rpt); +} + +/*************************************************************************************************/ +/*! + * \brief Create sync terminate action function. * * \return None. */ @@ -379,9 +407,143 @@ void lctrCreateSyncActTerminate(void) lctrMstPerScanCleanupOp(lctrPerCreateSync.pPerScanCtx); - lmgrPerAdvSyncEstdInd_t rpt; - memset(&rpt, 0, sizeof(lmgrPerAdvSyncEstdInd_t)); - LmgrSendSyncEstInd(LL_ERROR_CODE_OP_CANCELLED_BY_HOST, LCTR_GET_PER_SCAN_HANDLE(lctrPerCreateSync.pPerScanCtx), &rpt); + if (lctrPerCreateSync.pPerScanCtx->cancelByHost) + { + lmgrPerAdvSyncEstdInd_t rpt; + memset(&rpt, 0, sizeof(lmgrPerAdvSyncEstdInd_t)); + LmgrSendSyncEstInd(LL_ERROR_CODE_OP_CANCELLED_BY_HOST, LCTR_GET_PER_SCAN_HANDLE(lctrPerCreateSync.pPerScanCtx), &rpt); + } +} + +/*************************************************************************************************/ +/*! + * \brief Transfer sync start action function. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrTransferSyncActStart(void) +{ + lctrPerScanCtx_t *pPerScanCtx; + + lctrPerTransferSyncMsg_t *pMsg = (lctrPerTransferSyncMsg_t *)pLctrMstPerScanMsg; + + if ((pPerScanCtx = lctrAllocPerScanCtx()) == NULL) + { + return; + } + + BbStart(BB_PROT_BLE); + + lctrPerTransferSync.pPerScanCtx = pPerScanCtx; + + pPerScanCtx->filtParam.filterPolicy = LL_PER_SCAN_FILTER_NONE; //TODO: to be handled later. + pPerScanCtx->filtParam.advSID = pMsg->advSID; + pPerScanCtx->filtParam.advAddrType = pMsg->advAddrType; + pPerScanCtx->filtParam.advAddr = pMsg->advAddr; + pPerScanCtx->rxPhys = pMsg->rxPhy; + + pPerScanCtx->syncTimeOutMs = LCTR_PER_SYNC_TIMEOUT_TO_MS(100); //TODO: to be handled later. + pPerScanCtx->skip = 0; //TODO: to be handled later. + pPerScanCtx->createDispId = LCTR_DISP_TRANFER_SYNC; + + /* Decode syncInfo */ + lctrUnpackSyncInfo(&trsfSyncInfo, pMsg->bSyncInfo); + pPerScanCtx->perInter = BB_US_TO_BB_TICKS(LCTR_PER_INTER_TO_US(trsfSyncInfo.syncInter)); + pPerScanCtx->advSID = pMsg->advSID; + pPerScanCtx->advAddrType = pMsg->advAddrType; + pPerScanCtx->advAddr = pMsg->advAddr; + + /* Check if received address is resolvable. */ + if ((pMsg->advAddrType & LL_ADDR_RANDOM_BIT) && BDA64_ADDR_IS_RPA(pMsg->advAddr)) + { + uint64_t peerIdAddr = 0; + uint8_t peerIdAddrType = 0; + + if (BbBleResListResolvePeer(pMsg->advAddr, &peerIdAddrType, &peerIdAddr)) + { + pPerScanCtx->advAddrType = peerIdAddrType | LL_ADDR_IDENTITY_BIT; + pPerScanCtx->advAddr = peerIdAddr; + } + } + + LL_TRACE_INFO1("Periodic sync transfer -- syncInfo --, syncOffset=%u", trsfSyncInfo.syncOffset); + LL_TRACE_INFO1(" offsetUnits=%u", trsfSyncInfo.offsetUnits); + LL_TRACE_INFO1(" syncInter=%u", trsfSyncInfo.syncInter); + LL_TRACE_INFO1(" eventCounter=%u", trsfSyncInfo.eventCounter); + + lctrMstPerScanBuildOp(lctrPerTransferSync.pPerScanCtx); + + LmgrIncResetRefCount(); + + /* All information is transfered, we can start scanning periodic sync immediately. */ + lctrPerTransferSync.connHandle = pMsg->connHandle; + lctrPerTransferSync.serviceData = pMsg->id; + lctrPerTransferSync.ceRef = pMsg->ceRef; + lctrPerTransferSync.ceRcvd = pMsg->ceRcvd; + lctrPerTransferSync.syncCe = pMsg->syncConnEvtCounter; + lctrPerTransferSync.scaB = pMsg->scaB; + lctrPerTransferSync.lastPECounter = pMsg->lastPECounter; + lctrMstPerScanTransferOpCommit(pMsg->connHandle); + + lctrMstPerScanIsrInit(); +} + +/*************************************************************************************************/ +/*! + * \brief Transfer sync done action function. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrTransferSyncActDone(void) +{ +} + +/*************************************************************************************************/ +/*! + * \brief Transfer sync failed action function. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrTransferSyncActFailed(void) +{ + lctrPerTransferSync.pPerScanCtx->cancelCreateSync = TRUE; + SchRemove(&lctrPerTransferSync.pPerScanCtx->bod); + + /* Notify the host that controller failed to receive AUX_SYNC_IND within 6 periodic ADV events. */ + LctrSendPerSyncTrsfRcvdEvt(LL_ERROR_CODE_CONN_FAILED_TO_ESTABLISH, lctrPerTransferSync.pPerScanCtx); +} + +/*************************************************************************************************/ +/*! + * \brief Transfer sync cancel action function. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrTransferSyncActCancel(void) +{ + lctrPerTransferSync.pPerScanCtx->cancelCreateSync = TRUE; + SchRemove(&lctrPerTransferSync.pPerScanCtx->bod); +} + +/*************************************************************************************************/ +/*! + * \brief Transfer sync terminate action function. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrTransferSyncActTerminate(void) +{ + if (lctrPerTransferSync.pPerScanCtx->cancelCreateSync == TRUE) + { + lctrPerTransferSync.pPerScanCtx->cancelCreateSync = FALSE; + } + + lctrMstPerScanCleanupOp(lctrPerTransferSync.pPerScanCtx); } /*************************************************************************************************/ @@ -395,11 +557,19 @@ void lctrCreateSyncActTerminate(void) /*************************************************************************************************/ void lctrPerScanActSyncEstd(lctrPerScanCtx_t *pPerScanCtx) { - /* Pack and notify the host about sync established event. */ - lmgrPerAdvSyncEstdInd_t rpt; + if (pPerScanCtx->createDispId == LCTR_DISP_PER_CREATE_SYNC) + { + /* Pack and notify the host about sync established event. */ + lmgrPerAdvSyncEstdInd_t rpt; - lctrPerAdvSyncEstRptPack(pPerScanCtx, &rpt); - LmgrSendSyncEstInd(LL_SUCCESS, LCTR_GET_PER_SCAN_HANDLE(pPerScanCtx), &rpt); + lctrPerAdvSyncEstRptPack(pPerScanCtx, &rpt); + LmgrSendSyncEstInd(LL_SUCCESS, LCTR_GET_PER_SCAN_HANDLE(pPerScanCtx), &rpt); + } + else if (pPerScanCtx->createDispId == LCTR_DISP_TRANFER_SYNC) + { + /* Notify the host about periodic sync transfer received event. */ + LctrSendPerSyncTrsfRcvdEvt(LL_SUCCESS, pPerScanCtx); + } } /*************************************************************************************************/ @@ -455,3 +625,35 @@ void lctrPerScanActSyncTimeout(lctrPerScanCtx_t *pPerScanCtx) /* Shutdown completes with events generated in BOD end callback. */ } + +/*************************************************************************************************/ +/*! + * \brief Process acad that need to be serviced. + * + * \param pMsg Acad message. + * + * \return None + */ +/*************************************************************************************************/ +void lctrPerScanActProcessAcad(lctrAcadMsg_t *pMsg) +{ + lctrPerScanCtx_t *pPerScanCtx = LCTR_GET_PER_SCAN_CTX(pMsg->hdr.handle); + switch(pMsg->hdr.acadId) + { + case LCTR_ACAD_ID_CHAN_MAP_UPDATE: + { + lctrAcadChanMapUpd_t *pData = &pPerScanCtx->acadParams[pMsg->hdr.acadId].chanMapUpdate; + + if ((pData->instant - pMsg->hdr.eventCtr) <= pMsg->hdr.skip) + { + pPerScanCtx->chanParam.chanMask = pData->chanMask; + LmgrBuildRemapTable(&pPerScanCtx->chanParam); + pData->hdr.state = LCTR_ACAD_STATE_DISABLED; + } + break; + } + + default: + break; + } +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_slave.c index 19dcb0a33b..a70282b20b 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,13 +16,15 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave advertising action routines. + * \file + * \brief Link layer controller slave advertising action routines. */ /*************************************************************************************************/ #include "lctr_int_adv_slave.h" #include "sch_api.h" #include "bb_ble_api_reslist.h" +#include "lctr_pdu_adv.h" #include "wsf_assert.h" #include "wsf_msg.h" #include "wsf_trace.h" @@ -199,27 +201,40 @@ void lctrAdvActSelfTerm(void) restartAdv = TRUE; } + lctrConnEstablish_t *pMsg; + if ((pMsg = (lctrConnEstablish_t *)WsfMsgAlloc(sizeof(*pMsg))) != NULL) + { + lctrUnpackConnIndPdu(&pMsg->connInd, pBuf + LL_ADV_HDR_LEN); + + if (!lctrValidateConnIndPdu(&pMsg->connInd)) + { + restartAdv = TRUE; + } + } + if (restartAdv) { + if (pMsg != NULL) + { + WsfMsgFree(pMsg); + } + /* Reuse message. */ - lctrMsgHdr_t *pMsg = (lctrMsgHdr_t *)pBuf - 1; - pMsg->dispId = LCTR_DISP_ADV; - pMsg->event = LCTR_ADV_MSG_INT_START; - WsfMsgSend(lmgrPersistCb.handlerId, pMsg); + lctrMsgHdr_t *pResMsg = (lctrMsgHdr_t *)pBuf - 1; + pResMsg->dispId = LCTR_DISP_ADV; + pResMsg->event = LCTR_ADV_MSG_INT_START; + WsfMsgSend(lmgrPersistCb.handlerId, pResMsg); BbStop(BB_PROT_BLE); } else { - lctrConnEstablish_t *pMsg; - - if ((pMsg = (lctrConnEstablish_t *)WsfMsgAlloc(sizeof(*pMsg))) != NULL) + if (pMsg != NULL) { /* pMsg->hdr.handle = 0; */ pMsg->hdr.dispId = LCTR_DISP_CONN_IND; /* pMsg->hdr.event = 0; */ - lctrUnpackConnIndPdu(&pMsg->connInd, pBuf + LL_ADV_HDR_LEN); pMsg->connIndEndTs = lctrSlvAdv.reqEndTs; BbBlePduFiltResultsGetPeerIdAddr(&pAdv->filtResults, &pMsg->peerIdAddr, &pMsg->peerIdAddrType); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_slave_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_slave_ae.c index e40f2a81a9..13351e7970 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_slave_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_adv_slave_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave extended advertising action routines. + * \file + * \brief Link layer controller slave extended advertising action routines. */ /*************************************************************************************************/ @@ -34,6 +35,21 @@ #include +/*************************************************************************************************/ +/*! + * \brief Disable and clean a generic acad parameter + * + * \param pAcadParam Generic acad parameter type + * + * \return None. + */ +/*************************************************************************************************/ +static void lctrSlvAcadDisable(lctrAcadParam_t *pAcadParam) +{ + memset(pAcadParam, 0, sizeof(*pAcadParam)); + pAcadParam->hdr.state = LCTR_ACAD_STATE_DISABLED; +} + /*************************************************************************************************/ /*! * \brief Common advertise resource cleanup. @@ -64,7 +80,7 @@ static void lctrExtAdvCleanup(lctrAdvSet_t *pAdvSet) pAdv->pRxReqBuf = NULL; } - if (pAdvSet->param.advFiltPolicy & LL_ADV_FILTER_SCAN_WL_BIT) + if (pAdvSet->param.advFiltPolicy) { LmgrDecWhitelistRefCount(); } @@ -73,6 +89,23 @@ static void lctrExtAdvCleanup(lctrAdvSet_t *pAdvSet) lmgrCb.numExtAdvEnabled--; } +/*************************************************************************************************/ +/*! + * \brief Common periodic advertising cleanup. + * + * \param pAdvSet Advertising set. + * + * \return None. + */ +/*************************************************************************************************/ +static void lctrPeriodicAdvACleanup(lctrAdvSet_t *pAdvSet) +{ + BbStop(BB_PROT_BLE); + + SchRmRemove(LCTR_GET_PER_RM_HANDLE(pAdvSet)); + LmgrDecResetRefCount(); +} + /*************************************************************************************************/ /*! * \brief Start extended advertising. @@ -119,6 +152,43 @@ void lctrExtAdvActStart(lctrAdvSet_t *pAdvSet) LmgrSendExtAdvEnableCnf(pAdvSet->handle, LL_SUCCESS); } +/*************************************************************************************************/ +/*! + * \brief Start extended advertising internally. + * + * \param pAdvSet Advertising set. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrExtAdvActSelfStart(lctrAdvSet_t *pAdvSet) +{ + BbStart(BB_PROT_BLE); + + /* Reset state. */ + pAdvSet->maxEvents = pLctrSlvExtAdvMsg->enable.maxEvents; + pAdvSet->numEvents = 0; + pAdvSet->termReason = LL_SUCCESS; + pAdvSet->pExtAdvAuxPtr = NULL; + pAdvSet->connIndRcvd = FALSE; + pAdvSet->shutdown = FALSE; + pAdvSet->bodTermCnt = 0; + + uint8_t status; + if ((status = lctrSlvExtAdvBuildOp(pAdvSet, pLctrSlvExtAdvMsg->enable.durMs)) != LL_SUCCESS) + { + // TODO suppress terminate event on failed start + LmgrSendExtAdvEnableCnf(pAdvSet->handle, status); + lctrSendAdvSetMsg(pAdvSet, LCTR_EXT_ADV_MSG_TERMINATE); + return; + } + + if (pLctrSlvExtAdvMsg->enable.durMs) + { + WsfTimerStartMs(&pAdvSet->tmrAdvDur, pLctrSlvExtAdvMsg->enable.durMs); + } +} + /*************************************************************************************************/ /*! * \brief Restart extended advertising. @@ -164,6 +234,29 @@ void lctrExtAdvActShutdown(lctrAdvSet_t *pAdvSet) /* Shutdown completes with events generated in BOD end callback. */ } +/*************************************************************************************************/ +/*! + * \brief Shutdown active advertising operation due to host reset. + * + * \param pAdvSet Advertising set. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrExtAdvActResetShutdown(lctrAdvSet_t *pAdvSet) +{ + /* LCTR_MSG_RESET is broadcasted by hciReset and the processing order between ext ADV SM and periodic ADV SM is not guaranteed. */ + /* If ext ADV SM runs first, it will purge all info and periodic ADV SM may not run as intended. */ + /* So, reset cleanup of periodic advertising has to be done from extended ADV SM. */ + if (pAdvSet->perParam.perState == LCTR_PER_ADV_STATE_ENABLED) + { + lctrPeriodicAdvActShutdown(pAdvSet); + lctrPeriodicAdvACleanup(pAdvSet); + } + + lctrExtAdvActShutdown(pAdvSet); +} + /*************************************************************************************************/ /*! * \brief Send advertising operation confirm. @@ -232,7 +325,7 @@ void lctrExtAdvActSelfTerm(lctrAdvSet_t *pAdvSet) BbBleSlvAuxAdvEvent_t * const pAuxAdv = &pAdvSet->auxBleData.op.slvAuxAdv; uint8_t *pBuf; - bool_t startConn = TRUE; + bool_t restartAdv = FALSE; if ((pBuf = pAdv->pRxReqBuf) != NULL) { @@ -241,7 +334,7 @@ void lctrExtAdvActSelfTerm(lctrAdvSet_t *pAdvSet) /* If peer address was not resolved, attempt to resolve it now. */ if (!BbBlePduFiltCheck(pBuf, &pBle->pduFilt, TRUE, &pAdv->filtResults)) { - startConn = FALSE; + restartAdv = TRUE; } } else if ((pBuf = pAuxAdv->pRxAuxReqBuf) != NULL) @@ -267,11 +360,13 @@ void lctrExtAdvActSelfTerm(lctrAdvSet_t *pAdvSet) if (!BbBleExtPduFiltCheck(¶ms, &pBle->pduFilt, TRUE, &pAuxAdv->filtResults)) { - startConn = FALSE; + restartAdv = TRUE; } } - if (startConn && pBuf) + WSF_ASSERT(pBuf); /* pBuf must not be NULL since conn_ind/aux_conn_req is received. */ + + if (restartAdv == FALSE) { lctrConnEstablish_t *pMsg; @@ -283,6 +378,7 @@ void lctrExtAdvActSelfTerm(lctrAdvSet_t *pAdvSet) pMsg->hdr.dispId = LCTR_DISP_CONN_IND; /* pMsg->hdr.event = 0; */ + /* coverity[var_deref_model] */ pBuf += lctrUnpackAdvbPduHdr(&hdr, pBuf); lctrUnpackConnIndPdu(&pMsg->connInd, pBuf); @@ -316,14 +412,25 @@ void lctrExtAdvActSelfTerm(lctrAdvSet_t *pAdvSet) } else { - /* Restart advertising. */ - lctrSendAdvSetMsg(pAdvSet, LCTR_EXT_ADV_MSG_INT_START); - /* Do not cleanup. Restarting will reuse resources. */ - /* lctrExtAdvCleanup(pAdvSet); */ - /* BbStop(BB_PROT_BLE); */ + restartAdv = TRUE; } } + + if (restartAdv == TRUE) + { + /* Restart advertising. */ + /* Reuse message. */ + /* coverity[alias_transfer] */ + lctrMsgHdr_t *pMsg = (lctrMsgHdr_t *)pBuf - 1; + + pMsg->handle = pAdvSet->handle; + pMsg->dispId = LCTR_DISP_EXT_ADV; + pMsg->event = LCTR_EXT_ADV_MSG_INT_START; + WsfMsgSend(lmgrPersistCb.handlerId, pMsg); + + BbStop(BB_PROT_BLE); + } } } @@ -355,6 +462,15 @@ void lctrExtAdvActAdvTerm(lctrAdvSet_t *pAdvSet) /*************************************************************************************************/ void lctrExtAdvActReset(lctrAdvSet_t *pAdvSet) { + /* LCTR_MSG_RESET is broadcasted by hciReset and the processing order between ext ADV SM and periodic ADV SM is not guaranteed. */ + /* If ext ADV SM runs first, it will purge all info and periodic ADV SM may not run as intended. */ + /* So, reset cleanup of periodic advertising has to be done from extended ADV SM. */ + if (pAdvSet->perParam.perState == LCTR_PER_ADV_STATE_ENABLED) + { + lctrPeriodicAdvActShutdown(pAdvSet); + lctrPeriodicAdvACleanup(pAdvSet); + } + /* Although the AdvSet is freed here, some benign modifications to the context may occurs * to complete the SM call path. */ lctrFreeAdvSet(pAdvSet); @@ -405,7 +521,7 @@ void lctrExtAdvActDurationExpired(lctrAdvSet_t *pAdvSet) * \return None. */ /*************************************************************************************************/ -void lctrPeriodicBuildRemapTable(lctrChanParam_t *pChanParam) +void lctrPeriodicBuildRemapTable(lmgrChanParam_t *pChanParam) { unsigned int chanIdx; unsigned int numUsedChan = 0; @@ -441,8 +557,8 @@ void lctrPeriodicAdvActStart(lctrAdvSet_t *pAdvSet) pAdvSet->perParam.shutdown = FALSE; pAdvSet->perParam.perAccessAddr = lctrComputeAccessAddr(); pAdvSet->perParam.perEventCounter = 0; - pAdvSet->perParam.perChanParam.chanMask = LL_CHAN_DATA_ALL; - lctrPeriodicBuildRemapTable(&pAdvSet->perParam.perChanParam); + pAdvSet->perParam.perChanParam.chanMask = lmgrCb.chanClass; + LmgrBuildRemapTable(&pAdvSet->perParam.perChanParam); pAdvSet->perParam.perChanParam.usedChSel = LL_CH_SEL_2; pAdvSet->perParam.perChanParam.chIdentifier = (pAdvSet->perParam.perAccessAddr >> 16) ^ (pAdvSet->perParam.perAccessAddr >> 0); @@ -464,7 +580,15 @@ void lctrPeriodicAdvActStart(lctrAdvSet_t *pAdvSet) pAdvSet->perParam.perAuxStart = TRUE; } + if (pAdvSet->state == LCTR_EXT_ADV_STATE_ENABLED) + { + /* The Advertising DID is required to change when a SyncInfo field is added to or removed. */ + pAdvSet->advData.alt.ext.did = lctrCalcDID(pAdvSet->advData.pBuf, pAdvSet->advData.len); + pAdvSet->didPerUpdate = TRUE; + } + LmgrSendPeriodicAdvEnableCnf(pAdvSet->handle, LL_SUCCESS); + LmgrIncResetRefCount(); } /*************************************************************************************************/ @@ -521,10 +645,20 @@ void lctrPeriodicAdvActDisallowAdvCnf(lctrAdvSet_t *pAdvSet) /*************************************************************************************************/ void lctrPeriodicAdvActShutdown(lctrAdvSet_t *pAdvSet) { + if ((pAdvSet->state == LCTR_EXT_ADV_STATE_ENABLED) && (pAdvSet->perParam.perAdvEnabled == TRUE)) + { + /* The Advertising DID is required to change when a SyncInfo field is added to or removed. */ + pAdvSet->advData.alt.ext.did = lctrCalcDID(pAdvSet->advData.pBuf, pAdvSet->advData.len); + pAdvSet->didPerUpdate = TRUE; + } + pAdvSet->perParam.shutdown = TRUE; pAdvSet->perParam.perAdvEnabled = FALSE; pAdvSet->perParam.perAuxStart = FALSE; - /* Shutdown completes with events generated in BOD end callback. */ + + /* By removing BOD from scheduler, BOD end callback will be called. */ + /* Shutdown completes with events generated in BOD end callback. */ + SchRemove(&pAdvSet->perParam.perAdvBod); } /*************************************************************************************************/ @@ -538,9 +672,7 @@ void lctrPeriodicAdvActShutdown(lctrAdvSet_t *pAdvSet) /*************************************************************************************************/ void lctrPeriodicAdvActAdvTerm(lctrAdvSet_t *pAdvSet) { - BbStop(BB_PROT_BLE); - - SchRmRemove(LL_MAX_CONN + LCTR_GET_EXT_ADV_INDEX(pAdvSet)); + lctrPeriodicAdvACleanup(pAdvSet); LmgrSendPeriodicAdvEnableCnf(pAdvSet->handle, LL_SUCCESS); } @@ -556,7 +688,44 @@ void lctrPeriodicAdvActAdvTerm(lctrAdvSet_t *pAdvSet) /*************************************************************************************************/ void lctrPeriodicAdvActResetTerm(lctrAdvSet_t *pAdvSet) { - BbStop(BB_PROT_BLE); - - SchRmRemove(LL_MAX_CONN + LCTR_GET_EXT_ADV_INDEX(pAdvSet)); + lctrPeriodicAdvACleanup(pAdvSet); +} + +/*************************************************************************************************/ +/*! + * \brief Acad channel map start handler + * + * \param pAdvSet Advertising set. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrSlvAcadActChanMapUpdateStart(lctrAdvSet_t *pAdvSet) +{ + lctrAcadChanMapUpd_t *pAcadParam = &pAdvSet->acadParams[LCTR_ACAD_ID_CHAN_MAP_UPDATE].chanMapUpdate; + + /* A new channel map update cannot replace a currently running one. */ + if (pAcadParam->hdr.state == LCTR_ACAD_STATE_ENABLED) + { + return; + } + + pAcadParam->chanMask = pAdvSet->perParam.updChanMask; + pAcadParam->instant = pAdvSet->perParam.perEventCounter + LL_MIN_INSTANT; + pAcadParam->hdr.len = LL_ACAD_UPDATE_CHANNEL_MAP_LEN; + pAcadParam->hdr.state = LCTR_ACAD_STATE_ENABLED; +} + +/*************************************************************************************************/ +/*! + * \brief Acad channel map finish handler + * + * \param pAdvSet Advertising set. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrSlvAcadActChanMapUpdateFinish(lctrAdvSet_t *pAdvSet) +{ + lctrSlvAcadDisable(&pAdvSet->acadParams[LCTR_ACAD_ID_CHAN_MAP_UPDATE]); } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_conn.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_conn.c index 6a78c6483a..4e42d52172 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_conn.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_conn.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,12 +16,14 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller connection state machine action routines. + * \file + * \brief Link layer controller connection state machine action routines. */ /*************************************************************************************************/ #include "lctr_int_conn.h" #include "lctr_int_adv_slave.h" +#include "lctr_int_adv_master_ae.h" #include "sch_api.h" #include "sch_api_ble.h" #include "lmgr_api_conn.h" @@ -51,11 +53,28 @@ LL_FEAT_STABLE_MOD_IDX_RECEIVER | \ LL_FEAT_LE_CODED_PHY | \ LL_FEAT_CH_SEL_2 | \ - LL_FEAT_LE_POWER_CLASS_1) + LL_FEAT_LE_POWER_CLASS_1 | \ + LL_FEAT_MIN_NUM_USED_CHAN | \ + LL_FEAT_CONN_CTE_REQ | \ + LL_FEAT_CONN_CTE_RSP | \ + LL_FEAT_RECV_CTE | \ + LL_FEAT_PAST_SENDER | \ + LL_FEAT_PAST_RECIPIENT | \ + LL_FEAT_SCA_UPDATE | \ + LL_FEAT_CIS_MASTER_ROLE | \ + LL_FEAT_CIS_SLAVE_ROLE | \ + LL_FEAT_ISO_BROADCASTER | \ + LL_FEAT_ISO_SYNC) /*! \brief Used feature bitmask, i.e. FeatureSet[0]. */ #define LCTR_USED_FEAT_SET_MASK 0xFF +/*! \brief Used feature bitmask, i.e. FeatureSet[0]. */ +#define LCTR_USED_FEAT_SET_MASK 0xFF + +/*! \brief Features bits mask over the air */ +#define LCTR_OTA_FEAT_MASK (~LL_FEAT_REMOTE_PUB_KEY_VALIDATION & LL_FEAT_ALL_MASK) + /*************************************************************************************************/ /*! * \brief Validate connection parameter range. @@ -79,6 +98,33 @@ static bool_t lctrValidateConnParam(const lctrConnParam_t *pConnParam) return TRUE; } + +/*************************************************************************************************/ +/*! + * \brief Compute the sleep clock accuracy index in connection context. + * + * \param pCtx Connection context. + * + * \return SCA index. + */ +/*************************************************************************************************/ +static uint8_t lctrComputeConnSca(lctrConnCtx_t *pCtx) +{ + const uint16_t clkPpm = BbGetClockAccuracy(); + int8_t sca; + + if (clkPpm <= 20) sca = 7; + else if (clkPpm <= 30) sca = 6; + else if (clkPpm <= 50) sca = 5; + else if (clkPpm <= 75) sca = 4; + else if (clkPpm <= 100) sca = 3; + else if (clkPpm <= 150) sca = 2; + else if (clkPpm <= 250) sca = 1; + else sca = 0; + + return (uint8_t) (sca + pCtx->scaMod); +} + /*************************************************************************************************/ /*! * \brief Notify host of connect indication. @@ -262,7 +308,7 @@ void lctrSendChanMapUpdateInd(lctrConnCtx_t *pCtx) uint8_t *pBuf = pPdu; #if (LL_ENABLE_TESTER) - if (llTesterCb.eventCounterOffset) + if (llTesterCb.eventCounterOverride == TRUE) { pCtx->chanMapUpd.instant = pCtx->eventCounter + llTesterCb.eventCounterOffset + 1; /* +1 for next CE */ @@ -330,7 +376,7 @@ void lctrSendFeatureReq(lctrConnCtx_t *pCtx) /*** Assemble control PDU. ***/ UINT8_TO_BSTREAM(pBuf, opcode); - UINT64_TO_BSTREAM(pBuf, (lmgrCb.features & LCTR_FEAT_PEER_MASK)); + UINT64_TO_BSTREAM(pBuf, (lmgrCb.features & LCTR_OTA_FEAT_MASK)); /*** Queue for transmit. ***/ @@ -361,7 +407,7 @@ void lctrSendFeatureRsp(lctrConnCtx_t *pCtx) uint64_t featSet = (pCtx->usedFeatSet & LCTR_USED_FEAT_SET_MASK) | /* FeatureSet[0] used by master and slave */ (lmgrCb.features & ~LCTR_USED_FEAT_SET_MASK); /* FeatureSet[1..7] used by sender */ - UINT64_TO_BSTREAM(pBuf, (featSet & LCTR_FEAT_PEER_MASK)); /* Only send valid features bits between controllers. */ + UINT64_TO_BSTREAM(pBuf, (featSet & LCTR_OTA_FEAT_MASK)); /* Only send valid features bits between controllers. */ /*** Queue for transmit. ***/ @@ -380,7 +426,7 @@ void lctrSendFeatureRsp(lctrConnCtx_t *pCtx) /*************************************************************************************************/ void lctrStoreUsedFeatures(lctrConnCtx_t *pCtx) { - pCtx->usedFeatSet = lmgrCb.features & lctrDataPdu.pld.featReqRsp.featSet; + pCtx->usedFeatSet = lmgrCb.features & lctrDataPdu.pld.featReqRsp.featSet & LCTR_FEAT_PEER_MASK; pCtx->featExchFlag = TRUE; /* Update stable modulation index. */ @@ -806,7 +852,12 @@ void lctrSendConnParamReq(lctrConnCtx_t *pCtx) pCtx->connUpdSpec.supTimeout = llTesterCb.connParamReq.supTimeout; pCtx->connUpdSpec.minCeLen = 0; pCtx->connUpdSpec.maxCeLen = 0; + llTesterCb.connParamReqEnabled = FALSE; + + lctrSendConnParamPdu(pCtx, LL_PDU_CONN_PARAM_REQ, &pCtx->connUpdSpec, llTesterCb.connParamReq.prefPeriod); + + return; } #endif @@ -828,7 +879,6 @@ void lctrSendConnParamRsp(lctrConnCtx_t *pCtx) (lmgrCb.numConnEnabled > 1)) { /* TODO resolve scheduling with multiple connections */ - WSF_ASSERT(0); } lctrSendConnParamPdu(pCtx, LL_PDU_CONN_PARAM_RSP, &pLctrConnMsg->connParamReply.connSpec, 1); @@ -959,6 +1009,17 @@ static void lctrSendDataLengthPdu(lctrConnCtx_t *pCtx, uint8_t opcode) maxRxTime = WSF_MIN(pCtx->localDataPdu.maxRxTime, LL_MAX_DATA_TIME_ABS_MAX_1M); maxTxTime = WSF_MIN(pCtx->localDataPdu.maxTxTime, LL_MAX_DATA_TIME_ABS_MAX_1M); } + else + { + if (pCtx->bleData.chan.rxPhy == BB_PHY_BLE_CODED) + { + maxRxTime = WSF_MAX(pCtx->localDataPdu.maxRxTime, LL_MAX_DATA_TIME_ABS_MIN_CODED); + } + if (pCtx->bleData.chan.txPhy == BB_PHY_BLE_CODED) + { + maxTxTime = WSF_MAX(pCtx->localDataPdu.maxTxTime, LL_MAX_DATA_TIME_ABS_MIN_CODED); + } + } UINT16_TO_BSTREAM(pBuf, pCtx->localDataPdu.maxRxLen); UINT16_TO_BSTREAM(pBuf, maxRxTime); @@ -1019,13 +1080,36 @@ void lctrStoreRemoteDataLength(lctrConnCtx_t *pCtx) LL_TRACE_WARN0("Received invalid parameters in LENGTH_PDU"); return; } + lctrDataLen_t oldEffDataPdu = pCtx->effDataPdu; + uint16_t maxRxTime = pCtx->localDataPdu.maxRxTime; + uint16_t maxTxTime = pCtx->localDataPdu.maxTxTime; + + /* If LL_FEAT_LE_CODED_PHY is not supported, maxRxTime and maxTxTime can not be more than 2120. */ + if (!(pCtx->usedFeatSet & LL_FEAT_LE_CODED_PHY)) + { + maxRxTime = WSF_MIN(pCtx->localDataPdu.maxRxTime, LL_MAX_DATA_TIME_ABS_MAX_1M); + maxTxTime = WSF_MIN(pCtx->localDataPdu.maxTxTime, LL_MAX_DATA_TIME_ABS_MAX_1M); + } + /* Compute effective values */ pCtx->effDataPdu.maxTxLen = WSF_MIN(pCtx->localDataPdu.maxTxLen, lctrDataPdu.pld.lenReq.maxRxLen); pCtx->effDataPdu.maxRxLen = WSF_MIN(pCtx->localDataPdu.maxRxLen, lctrDataPdu.pld.lenReq.maxTxLen); - pCtx->effDataPdu.maxTxTime = WSF_MIN(pCtx->localDataPdu.maxTxTime, lctrDataPdu.pld.lenReq.maxRxTime); - pCtx->effDataPdu.maxRxTime = WSF_MIN(pCtx->localDataPdu.maxRxTime, lctrDataPdu.pld.lenReq.maxTxTime); + pCtx->effDataPdu.maxTxTime = WSF_MIN(maxTxTime, lctrDataPdu.pld.lenReq.maxRxTime); + pCtx->effDataPdu.maxRxTime = WSF_MIN(maxRxTime, lctrDataPdu.pld.lenReq.maxTxTime); + + /* connEffectiveMaxRxTimeCoded - the greater of 2704 and connEffectiveMaxRxTimeUncoded. */ + if (pCtx->bleData.chan.rxPhy == BB_PHY_BLE_CODED) + { + pCtx->effDataPdu.maxRxTime = WSF_MAX(pCtx->effDataPdu.maxRxTime, LL_MAX_DATA_TIME_ABS_MIN_CODED); + } + + if (pCtx->bleData.chan.txPhy == BB_PHY_BLE_CODED) + { + pCtx->effDataPdu.maxTxTime = WSF_MAX(pCtx->effDataPdu.maxTxTime, LL_MAX_DATA_TIME_ABS_MIN_CODED); + } + if ((oldEffDataPdu.maxTxLen != pCtx->effDataPdu.maxTxLen) || (oldEffDataPdu.maxRxLen != pCtx->effDataPdu.maxRxLen) || (oldEffDataPdu.maxTxTime != pCtx->effDataPdu.maxTxTime) || @@ -1035,11 +1119,46 @@ void lctrStoreRemoteDataLength(lctrConnCtx_t *pCtx) } pCtx->effConnDurUsec = lctrCalcConnDurationUsec(pCtx, &pCtx->effDataPdu); - LL_TRACE_INFO2("Effective data lengths maxTxLen=%u, maxRxLen=%u", pCtx->effDataPdu.maxTxLen, pCtx->effDataPdu.maxRxLen); LL_TRACE_INFO2("Effective data times maxTxTime=%u, maxRxTime=%u", pCtx->effDataPdu.maxTxTime, pCtx->effDataPdu.maxRxTime); } +/*************************************************************************************************/ +/*! + * \brief Notify host of data length change indication. + * + * \param pCtx Connection context. + * \param status Status. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrNotifyHostDataLengthInd(lctrConnCtx_t *pCtx, uint8_t status) +{ + const uint16_t handle = LCTR_GET_CONN_HANDLE(pCtx); + + LlDataLenChangeInd_t evt = + { + .hdr = + { + .param = handle, + .event = LL_DATA_LEN_CHANGE_IND, + .status = status + }, + + .handle = handle, + }; + + evt.maxTxLen = pCtx->effDataPdu.maxTxLen; + evt.maxTxTime = pCtx->effDataPdu.maxTxTime; + evt.maxRxLen = pCtx->effDataPdu.maxRxLen; + evt.maxRxTime = pCtx->effDataPdu.maxRxTime; + + LL_TRACE_INFO2("### LlEvent ### LL_DATA_LEN_CHANGE_IND, handle=%u, status=%u", handle, status); + + LmgrSendEvent((LlEvt_t *)&evt); +} + /*************************************************************************************************/ /*! * \brief Send set minimum number of used channels indication PDU to peer. @@ -1113,36 +1232,170 @@ void lctrStoreSetMinUsedChan(lctrConnCtx_t *pCtx) /*************************************************************************************************/ /*! - * \brief Notify host of data length change indication. + * \brief Send peer SCA request PDU. * * \param pCtx Connection context. - * \param status Status. + * \param opcode PDU opcode. * * \return None. */ /*************************************************************************************************/ -void lctrNotifyHostDataLengthInd(lctrConnCtx_t *pCtx, uint8_t status) +static void lctrSendPeerScaReqPdu(lctrConnCtx_t *pCtx, uint8_t opcode) +{ + uint8_t *pPdu; + + if ((pPdu = lctrTxCtrlPduAlloc(LL_PEER_SCA_REQ_LEN)) != NULL) + { + uint8_t *pBuf = pPdu; + + /*** Assemble control PDU. ***/ + UINT8_TO_BSTREAM (pBuf, opcode); + UINT8_TO_BSTREAM (pBuf, lctrComputeConnSca(pCtx)); + + /*** Queue for transmit. ***/ + lctrTxCtrlPduQueue(pCtx, pPdu); + } +} + +/*************************************************************************************************/ +/*! + * \brief Update action for sca processing. + * + * \param pCtx Connection Context. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrStoreScaAction(lctrConnCtx_t *pCtx) +{ + pCtx->scaUpdAction = pLctrConnMsg->scaReq.action; +} + +/*************************************************************************************************/ +/*! + * \brief Send peer SCA request. + * + * \param pCtx Connection context. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrSendPeerScaReq(lctrConnCtx_t *pCtx) +{ + switch (pCtx->scaUpdAction) + { + /* Update by syncing instead of increment/decrement to prevent desync of the SCA value. */ + case LL_MODIFY_SCA_MORE_ACCURATE: + if (pCtx->scaMod < lmgrCb.scaMod) + { + pCtx->scaMod = lmgrCb.scaMod; + } + break; + case LL_MODIFY_SCA_LESS_ACCURATE: + if (pCtx->scaMod > lmgrCb.scaMod) + { + pCtx->scaMod = lmgrCb.scaMod; + } + break; + + default: /* LL_MODIFY_SCA_NO_ACTION */ + /* This happens when we are sending a tester REQ. */ + break; + } + + lctrSendPeerScaReqPdu(pCtx, LL_PDU_PEER_SCA_REQ); +} + +/*************************************************************************************************/ +/*! + * \brief Send peer SCA response PDU. + * + * \param pCtx Connection context. + * \param opcode PDU opcode. + * + * \return None. + */ +/*************************************************************************************************/ +static void lctrSendPeerScaRspPdu(lctrConnCtx_t *pCtx, uint8_t opcode) +{ + uint8_t *pPdu; + + if ((pPdu = lctrTxCtrlPduAlloc(LL_PEER_SCA_RSP_LEN)) != NULL) + { + uint8_t *pBuf = pPdu; + + /*** Assemble control PDU. ***/ + UINT8_TO_BSTREAM (pBuf, opcode); + UINT8_TO_BSTREAM (pBuf, lctrComputeConnSca(pCtx)); + + /*** Queue for transmit. ***/ + lctrTxCtrlPduQueue(pCtx, pPdu); + } +} + +/*************************************************************************************************/ +/*! + * \brief Send peer SCA response. + * + * \param pCtx Connection context. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrSendPeerScaRsp(lctrConnCtx_t *pCtx) +{ + lctrSendPeerScaRspPdu(pCtx, LL_PDU_PEER_SCA_RSP); +} + +/*************************************************************************************************/ +/*! + * \brief Store peer SCA. + * + * \param pCtx Connection context. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrStorePeerSca(lctrConnCtx_t *pCtx) +{ + pCtx->peerSca = lctrDataPdu.pld.peerSca.sca; + + if (pCtx->role == LL_ROLE_SLAVE) + { + pCtx->data.slv.totalAcc = lctrCalcTotalAccuracy(pCtx->peerSca); + + LL_TRACE_INFO1("lctrStorePeerSca pCtx->data.slv.totalAcc=%d", pCtx->data.slv.totalAcc); + } +} + +/*************************************************************************************************/ +/*! + * \brief Notify host of peer SCA request confirmation. + * + * \param pCtx Connection context. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrNotifyHostPeerScaCnf(lctrConnCtx_t *pCtx) { const uint16_t handle = LCTR_GET_CONN_HANDLE(pCtx); - LlDataLenChangeInd_t evt = + LlPeerScaCnf_t evt = { .hdr = { - .param = handle, - .event = LL_DATA_LEN_CHANGE_IND, - .status = status + .param = handle, + .event = LL_REQ_PEER_SCA_IND, + .status = LL_SUCCESS }, - .handle = handle, + .status = LL_SUCCESS, + .connHandle = handle, + .peerSca = pCtx->peerSca, }; - evt.maxTxLen = pCtx->effDataPdu.maxTxLen; - evt.maxTxTime = pCtx->effDataPdu.maxTxTime; - evt.maxRxLen = pCtx->effDataPdu.maxRxLen; - evt.maxRxTime = pCtx->effDataPdu.maxRxTime; - - LL_TRACE_INFO2("### LlEvent ### LL_DATA_LEN_CHANGE_IND, handle=%u, status=%u", handle, status); + LL_TRACE_INFO1("### LlEvent ### LL_REQ_PEER_SCA_CNF, handle=%u, status=LL_SUCCESS", handle); LmgrSendEvent((LlEvt_t *)&evt); } @@ -1382,3 +1635,54 @@ void lctrUnpauseRxData(lctrConnCtx_t *pCtx) pCtx->pauseRxData = FALSE; LL_TRACE_INFO1(" >>> Data Path Rx Unpaused/Resumed, handle=%u <<<", LCTR_GET_CONN_HANDLE(pCtx)); } + +/*************************************************************************************************/ +/*! + * \brief Store periodic advertising sync transfer parameters. + * + * \param pCtx Connection context. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrActStorePeriodicSyncTrsf(lctrConnCtx_t *pCtx) +{ + if (lctrStorePeriodicSyncTrsfFn) + { + lctrStorePeriodicSyncTrsfFn(pCtx); + } +} + +/*************************************************************************************************/ +/*! + * \brief Send periodic sync indication PDU to peer. + * + * \param pCtx Connection context. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrActSendPeriodicSyncInd(lctrConnCtx_t *pCtx) +{ + if (lctrSendPeriodicSyncIndFn) + { + lctrSendPeriodicSyncIndFn(pCtx); + } +} + +/*************************************************************************************************/ +/*! + * \brief Handle received periodic sync indication PDU. + * + * \param pCtx Connection context. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrActReceivePeriodicSyncInd(lctrConnCtx_t *pCtx) +{ + if (lctrReceivePeriodicSyncIndFn) + { + lctrReceivePeriodicSyncIndFn(pCtx); + } +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_conn_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_conn_master.c index 6731b3eb26..877b5d79f5 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_conn_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_conn_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master connection state machine action routines. + * \file + * \brief Link layer controller master connection state machine action routines. */ /*************************************************************************************************/ @@ -61,8 +62,10 @@ void lctrSendConnUpdateInd(lctrConnCtx_t *pCtx) uint32_t durUsec = pCtx->localConnDurUsec; uint32_t connIntervalUsec; - /* TODO: accommodate pCtx->connParam.prefPeriod. */ - if (!SchRmStartUpdate(LCTR_GET_CONN_HANDLE(pCtx), interMinUsec, interMaxUsec, durUsec, &connIntervalUsec)) + /* Accommodate peer PreferredPeriodicity. */ + uint32_t commonPrefPerUsec = SchRmCalcCommonPeriodicityUsec(LCTR_CONN_IND_US(pCtx->connParam.prefPeriod)); + + if (!SchRmStartUpdate(LCTR_GET_CONN_HANDLE(pCtx), interMinUsec, interMaxUsec, commonPrefPerUsec, durUsec, &connIntervalUsec)) { LL_TRACE_WARN1("Could not update connection, handle=%u", LCTR_GET_CONN_HANDLE(pCtx)); lctrSendConnMsg(pCtx, LCTR_CONN_LLCP_REJECT_CONN_UPD); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_conn_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_conn_master_ae.c index 6ff3ce0e0f..6244a302ad 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_conn_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_conn_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master connection state machine action routines. + * \file + * \brief Link layer controller master connection state machine action routines. */ /*************************************************************************************************/ @@ -52,10 +53,10 @@ static uint8_t lctrExtInitSetupConn(lctrExtScanCtx_t *pExtInitCtx, LlConnSpec_t uint32_t interMaxUsec = LCTR_CONN_IND_US(pConnSpec->connIntervalMax); uint32_t durUsec = pCtx->localConnDurUsec; - if (!SchRmAdd(LCTR_GET_CONN_HANDLE(pCtx), interMinUsec, interMaxUsec, durUsec, &connInterUsec)) + if (!SchRmAdd(LCTR_GET_CONN_HANDLE(pCtx), SCH_RM_PREF_PERFORMANCE, interMinUsec, interMaxUsec, durUsec, &connInterUsec, lctrGetConnRefTime)) { lctrFreeConnCtx(pCtx); - return LL_ERROR_CODE_UNACCEPTABLE_CONN_INTERVAL; + return LL_ERROR_CODE_CONN_REJ_LIMITED_RESOURCES; } pExtInitCtx->data.init.connHandle = LCTR_GET_CONN_HANDLE(pCtx); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_conn_past.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_conn_past.c new file mode 100644 index 0000000000..f400f3a303 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_conn_past.c @@ -0,0 +1,386 @@ +/* Copyright (c) 2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*************************************************************************************************/ +/*! + * \file + * \brief Link layer controller connection state machine action routines for PAST feature. + */ +/*************************************************************************************************/ + +#include "lctr_int_conn.h" +#include "lctr_int_adv_slave.h" +#include "lctr_int_adv_master_ae.h" +#include "sch_api.h" +#include "sch_api_ble.h" +#include "lmgr_api_conn.h" +#include "wsf_assert.h" +#include "wsf_math.h" +#include "wsf_msg.h" +#include "wsf_timer.h" +#include "wsf_trace.h" +#include "util/bstream.h" +#include + +/*************************************************************************************************/ +/*! + * \brief Send periodic sync indication from scanner to peer. + * + * \param pCtx Connection context. + * + * \return None. + * + * This function is called from BOD end callback of master/slave connection. + */ +/*************************************************************************************************/ +void lctrSendPerSyncFromScan(lctrConnCtx_t *pCtx) +{ + uint8_t *pPdu; + lctrPerScanCtx_t *pPerScanCtx = LCTR_GET_PER_SCAN_CTX(pCtx->perSyncHandle); + + WSF_ASSERT((pPerScanCtx->enabled == TRUE) && (pPerScanCtx->state == LCTR_PER_SCAN_STATE_SYNC_ESTD)); + + if ((pPdu = lctrTxCtrlPduAlloc(LL_PERIODIC_SYNC_PDU_LEN)) != NULL) + { + uint8_t *pBuf = pPdu; + uint8_t field8 = 0; + /* Use the same logic as connection update to set connEventCounter. */ + uint16_t ceOffset = LL_MIN_INSTANT + 1 + /* +1 for next CE */ + pCtx->maxLatency; /* ensure slave will listen this packet */ + +#if (LL_ENABLE_TESTER == TRUE) + if (llTesterCb.eventCounterOverride == TRUE) + { + /* ceOffset can be in the range of -0x3FFF ~ +0x3FFF. */ + ceOffset = llTesterCb.eventCounterOffset + 1; /* +1 for next CE */ + } +#endif + + /* Find PEa, event counter of PE whose starting time is after CEref. */ + uint16_t paEventCounter = pPerScanCtx->lastActiveEvent; + uint32_t paAnchor = pPerScanCtx->lastAnchorPoint; + uint32_t ceRefStart, ceRefEnd; + + /* Calculate the end time of CEref. */ + ceRefStart = lctrConnGetAnchorPoint(pCtx, (pCtx->eventCounter + ceOffset)); + ceRefEnd = ceRefStart + BB_US_TO_BB_TICKS(pCtx->localConnDurUsec + BbGetSchSetupDelayUs()); + + /* paAnchor is for the first PE in the future from ceRefEnd. */ + if ((ceRefEnd - paAnchor) < LCTR_SCH_MAX_SPAN) + { + uint16_t numPE = (ceRefEnd - paAnchor) / pPerScanCtx->perInter + 1; + + paAnchor += numPE * pPerScanCtx->perInter; + paEventCounter += numPE; + } + else + { + uint16_t numPE = (paAnchor - ceRefEnd) / pPerScanCtx->perInter; + + paAnchor -= numPE * pPerScanCtx->perInter; + paEventCounter -= numPE; + } + + uint8_t offsUnits; + uint8_t offsAdjust = 0; + uint16_t offs; + uint32_t offsUsec = BB_TICKS_TO_US(paAnchor - ceRefStart); + + if (offsUsec < LL_30_USEC_OFFS_MAX_USEC) + { + offsUnits = LCTR_OFFS_UNITS_30_USEC; + offs = LL_MATH_DIV_30(offsUsec); + } + else + { + if (offsUsec >= LL_SYNC_OFFS_ADJUST_USEC) + { + offsAdjust = 1; + offsUsec -= LL_SYNC_OFFS_ADJUST_USEC; + } + + offsUnits = LCTR_OFFS_UNITS_300_USEC; + offs = LL_MATH_DIV_300(offsUsec); + } + + LL_TRACE_INFO1("LL_PERIODIC_SYNC_IND from SCAN ceRef anchor point = %u", ceRefStart); + LL_TRACE_INFO1(" PA lastAnchorPoint = %u", pPerScanCtx->lastAnchorPoint); + LL_TRACE_INFO1(" PA REF paAnchor = %u", paAnchor); + LL_TRACE_INFO1(" offsUsec = %u", offsUsec); + + /*** Assemble control PDU. ***/ + UINT8_TO_BSTREAM (pBuf, LL_PDU_PERIODIC_SYNC_IND); + UINT16_TO_BSTREAM(pBuf, pCtx->perServiceData); /* ID */ + + /* Fill in syncInfo (18 octets) */ + UINT16_TO_BSTREAM(pBuf, offs | + (offsUnits << 13) | /* Offset units. */ + (offsAdjust << 14)); /* Offset adjust. */ + + UINT16_TO_BSTREAM(pBuf, LCTR_PER_INTER_TO_MS(BB_TICKS_TO_US(pPerScanCtx->perInter))); /* Interval */ + + uint64_t temp = pPerScanCtx->chanParam.chanMask | /* SyncInfo - ChMap */ + ((uint64_t)pPerScanCtx->sca << 37); /* SyncInfo - SCA of the device sending AUX_SYNC_IND. */ + UINT40_TO_BSTREAM(pBuf, temp); + UINT32_TO_BSTREAM(pBuf, pPerScanCtx->bleData.chan.accAddr); + UINT24_TO_BSTREAM(pBuf, pPerScanCtx->bleData.chan.crcInit); + UINT16_TO_BSTREAM(pBuf, paEventCounter); /* SyncInfo - Event Counter */ + + UINT16_TO_BSTREAM(pBuf, (pCtx->eventCounter + ceOffset)); /* ref connEventCounter */ + UINT16_TO_BSTREAM(pBuf, pPerScanCtx->lastActiveEvent); /* lastPaEventCounter */ + + field8 = (pPerScanCtx->advSID << 0) | + (pPerScanCtx->trsfAddrType << 4) | + (lctrComputeSca() << 5); /* SCA of the device sending this PDU. */ + UINT8_TO_BSTREAM(pBuf, field8); + UINT8_TO_BSTREAM(pBuf, lctrPhyToPhysBit(pPerScanCtx->rxPhys)); + BDA64_TO_BSTREAM(pBuf, pPerScanCtx->trsfAdvAddr); + UINT16_TO_BSTREAM(pBuf, pCtx->eventCounter); /* syncConnEventCounter */ + + /*** Queue for transmit. ***/ + lctrTxCtrlPduQueue(pCtx, pPdu); + } +} + +/*************************************************************************************************/ +/*! + * \brief Send periodic sync indication from broadcaster to peer. + * + * \param pCtx Connection context. + * + * \return None. + * + * This function is called from BOD end callback of master/slave connection. + */ +/*************************************************************************************************/ +void lctrSendPerSyncFromBcst(lctrConnCtx_t *pCtx) +{ + uint8_t *pPdu; + lctrAdvSet_t *pAdvSet = lctrFindAdvSet((uint8_t)pCtx->perSyncHandle); + + WSF_ASSERT(pAdvSet); + WSF_ASSERT(pAdvSet->perParam.perAdvEnabled == TRUE); + + if ((pPdu = lctrTxCtrlPduAlloc(LL_PERIODIC_SYNC_PDU_LEN)) != NULL) + { + BbOpDesc_t * const pPerOp = &pAdvSet->perParam.perAdvBod; + BbBleData_t *pBle = &pAdvSet->perParam.perBleData; + uint8_t *pBuf = pPdu; + uint8_t field8 = 0; + /* Use the same logic as connection update to set connEventCounter. */ + uint16_t ceOffset = LL_MIN_INSTANT + 1 + /* +1 for next CE */ + pCtx->maxLatency; /* ensure slave will listen this packet */ + +#if (LL_ENABLE_TESTER == TRUE) + if (llTesterCb.eventCounterOverride == TRUE) + { + /* ceOffset can be in the range of -0x3FFF ~ +0x3FFF. */ + ceOffset = llTesterCb.eventCounterOffset + 1; /* +1 for next CE */ + } +#endif + + /* Find PEa, event counter of PE whose starting time is after CEref. */ + uint16_t paEventCounter = pAdvSet->perParam.perEventCounter; + uint32_t paAnchor = pPerOp->due; + uint32_t ceRefStart, ceRefEnd; + + /* Calculate the end time of CEref. */ + ceRefStart = lctrConnGetAnchorPoint(pCtx, (pCtx->eventCounter + ceOffset)); + ceRefEnd = ceRefStart + BB_US_TO_BB_TICKS(pCtx->localConnDurUsec + BbGetSchSetupDelayUs()); + + /* paAnchor is for the first PE in the future from ceRefEnd. */ + if ((ceRefEnd - paAnchor) < LCTR_SCH_MAX_SPAN) + { + uint16_t numPE = (ceRefEnd - paAnchor) / pAdvSet->perParam.perAdvInter + 1; + + paAnchor += numPE * pAdvSet->perParam.perAdvInter; + paEventCounter += numPE; + } + else + { + uint16_t numPE = (paAnchor - ceRefEnd) / pAdvSet->perParam.perAdvInter; + + paAnchor -= numPE * pAdvSet->perParam.perAdvInter; + paEventCounter -= numPE; + } + + uint8_t offsUnits; + uint8_t offsAdjust = 0; + uint16_t offs; + uint32_t offsUsec = BB_TICKS_TO_US(paAnchor - ceRefStart); + + if (offsUsec < LL_30_USEC_OFFS_MAX_USEC) + { + offsUnits = LCTR_OFFS_UNITS_30_USEC; + offs = LL_MATH_DIV_30(offsUsec); + } + else + { + if (offsUsec >= LL_SYNC_OFFS_ADJUST_USEC) + { + offsAdjust = 1; + offsUsec -= LL_SYNC_OFFS_ADJUST_USEC; + } + + offsUnits = LCTR_OFFS_UNITS_300_USEC; + offs = LL_MATH_DIV_300(offsUsec); + } + + LL_TRACE_INFO1("LL_PERIODIC_SYNC_IND from BCST ceRef anchor point = %u", ceRefStart); + LL_TRACE_INFO1(" PA lastAnchorPoint = %u", pPerOp->due); + LL_TRACE_INFO1(" PA REF paAnchor = %u", paAnchor); + LL_TRACE_INFO1(" offsUsec = %u", offsUsec); + + /*** Assemble control PDU. ***/ + UINT8_TO_BSTREAM (pBuf, LL_PDU_PERIODIC_SYNC_IND); + UINT16_TO_BSTREAM(pBuf, pCtx->perServiceData); /* ID */ + + /* Fill in syncInfo (18 octets) */ + UINT16_TO_BSTREAM(pBuf, offs | + (offsUnits << 13) | /* Offset units. */ + (offsAdjust << 14)); /* Offset adjust. */ + + UINT16_TO_BSTREAM(pBuf, LCTR_PER_INTER_TO_MS(BB_TICKS_TO_US(pAdvSet->perParam.perAdvInter))); /* Interval */ + + uint64_t temp = pAdvSet->perParam.perChanParam.chanMask | /* SyncInfo - ChMap */ + ((uint64_t)lctrComputeSca() << 37); /* SyncInfo - SCA of the device sending AUX_SYNC_IND. */ + UINT40_TO_BSTREAM(pBuf, temp); + UINT32_TO_BSTREAM(pBuf, pBle->chan.accAddr); + UINT24_TO_BSTREAM(pBuf, pBle->chan.crcInit); + UINT16_TO_BSTREAM(pBuf, paEventCounter); /* SyncInfo - Event Counter */ + + UINT16_TO_BSTREAM(pBuf, (pCtx->eventCounter + ceOffset)); + /* If the Periodic Advertiser is sending the PDU, */ + /* lastPaEventCount shall be set to the same value as the EventCounter field of SyncInfo. */ + UINT16_TO_BSTREAM(pBuf, pAdvSet->perParam.perEventCounter); /* lastPaEventCounter */ + + uint8_t aType = 0; /* 0 for public address, 1 for random address */ + if ((pAdvSet->param.ownAddrType & LL_ADDR_RANDOM_BIT) && (pAdvSet->bdAddrRndValid == TRUE)) + { + aType = 1; + } + else if ((pAdvSet->param.ownAddrType == LL_ADDR_PUBLIC_IDENTITY) && (BDA64_ADDR_IS_RPA(pAdvSet->advA))) + { + aType = 1; + } + + field8 = (pAdvSet->param.advSID << 0) | + (aType << 4) | + (lctrComputeSca() << 5); /* SCA of the device sending this PDU. */ + UINT8_TO_BSTREAM(pBuf, field8); + UINT8_TO_BSTREAM(pBuf, lctrPhyToPhysBit(pBle->chan.txPhy)); + BDA64_TO_BSTREAM(pBuf, pAdvSet->advA); + UINT16_TO_BSTREAM(pBuf, pCtx->eventCounter); /* syncConnEventCounter */ + + /*** Queue for transmit. ***/ + lctrTxCtrlPduQueue(pCtx, pPdu); + } +} + +/*************************************************************************************************/ +/*! + * \brief Store periodic advertising sync transfer parameters. + * + * \param pCtx Connection context. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrStorePeriodicSyncTrsf(lctrConnCtx_t *pCtx) +{ + pCtx->perSyncSrc = pLctrConnMsg->perAdvSyncTrsf.syncSource; + pCtx->perServiceData = pLctrConnMsg->perAdvSyncTrsf.serviceData; + pCtx->perSyncHandle = pLctrConnMsg->perAdvSyncTrsf.syncHandle; +} + +/*************************************************************************************************/ +/*! + * \brief Send periodic sync indication PDU to peer. + * + * \param pCtx Connection context. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrSendPeriodicSyncInd(lctrConnCtx_t *pCtx) +{ + if (!pCtx->sendPerSync) + { + /* The PDU will be queued at the next BOD end callback. */ + pCtx->sendPerSync = TRUE; + + /* The procedure completes after sending out the indication. */ + pCtx->llcpNotifyMask &= ~(1 << LCTR_PROC_CMN_PER_ADV_SYNC_TRSF); + lctrSendConnMsg(pCtx, LCTR_CONN_LLCP_PROC_CMPL); + } +} + +/*************************************************************************************************/ +/*! + * \brief Handle received periodic sync indication PDU. + * + * \param pCtx Connection context. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrReceivePeriodicSyncInd(lctrConnCtx_t *pCtx) +{ + lctrPerTransferSyncMsg_t *pMsg; + + /* Check if the controller is already sync with the same periodic advertiser. */ + if (LctrMstPerIsSync(lctrDataPdu.pld.perSyncInd.sid, lctrDataPdu.pld.perSyncInd.aType, lctrDataPdu.pld.perSyncInd.advA)) + { + LL_TRACE_WARN0(" ---- Ignore LL_PERIODIC_SYNC_IND, already in sync"); + return; + } + + LL_TRACE_INFO1("### LlEvent ### Periodic sync transfer received, handle=%u", LCTR_GET_CONN_HANDLE(pCtx)); + LL_TRACE_INFO1(" ceRef=%u", lctrDataPdu.pld.perSyncInd.ceCounter); + LL_TRACE_INFO1(" ceRcvd=%u", pCtx->eventCounter); + LL_TRACE_INFO1(" lastPECounter=%u", lctrDataPdu.pld.perSyncInd.lastPECounter); + LL_TRACE_INFO1(" ID=%u", lctrDataPdu.pld.perSyncInd.id); + + if (pCtx->syncMode != LL_SYNC_TRSF_MODE_OFF) + { + if ((pMsg = WsfMsgAlloc(sizeof(*pMsg))) != NULL) + { + pMsg->hdr.dispId = LCTR_DISP_TRANFER_SYNC; + pMsg->hdr.event = LCTR_TRANSFER_SYNC_MSG_START; + pMsg->id = lctrDataPdu.pld.perSyncInd.id; + memcpy(pMsg->bSyncInfo, lctrDataPdu.pld.perSyncInd.syncInfo, LL_SYNC_INFO_LEN); + pMsg->connHandle = LCTR_GET_CONN_HANDLE(pCtx); + pMsg->ceRef = lctrDataPdu.pld.perSyncInd.ceCounter; + pMsg->ceRcvd = pCtx->eventCounter; + pMsg->lastPECounter = lctrDataPdu.pld.perSyncInd.lastPECounter; + pMsg->advSID = lctrDataPdu.pld.perSyncInd.sid; + pMsg->advAddrType = lctrDataPdu.pld.perSyncInd.aType; + pMsg->scaB = lctrDataPdu.pld.perSyncInd.sca; + pMsg->rxPhy = lctrPhysBitToPhy(lctrDataPdu.pld.perSyncInd.phy); + pMsg->advAddr = lctrDataPdu.pld.perSyncInd.advA; + pMsg->syncConnEvtCounter = lctrDataPdu.pld.perSyncInd.syncConnEvtCounter; + + WsfMsgSend(lmgrPersistCb.handlerId, pMsg); + } + } + else + { + LL_TRACE_INFO1(" ---- Ignore LL_PERIODIC_SYNC_IND, syncMode = %u", pCtx->syncMode); + } + + /* The procedure completes without further action. */ + lctrSendConnMsg(pCtx, LCTR_CONN_LLCP_PROC_CMPL); +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_enc.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_enc.c index b62b459b07..dd06f1b4ea 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_enc.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_enc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave encryption action routines. + * \file + * \brief Link layer controller slave encryption action routines. */ /*************************************************************************************************/ @@ -26,6 +27,7 @@ #include "wsf_msg.h" #include "wsf_trace.h" #include "util/bstream.h" +#include "pal_crypto.h" #include /*************************************************************************************************/ @@ -144,10 +146,10 @@ void lctrGenerateSlvVectors(lctrConnCtx_t *pCtx) memcpy(pCtx->iv, lctrDataPdu.pld.encReq.iv_m + LCTR_IV_M_OFFS, LL_IV_LEN / 2); /* Generate slave part of IV. */ - BbBleDrvRand(pCtx->iv + LCTR_IV_S_OFFS, LL_IV_LEN / 2); + PalCryptoGenerateRandomNumber(pCtx->iv + LCTR_IV_S_OFFS, LL_IV_LEN / 2); /* Generate slave part of SKD. */ - BbBleDrvRand(pCtx->skd + LCTR_SKD_S_OFFS, LL_SKD_LEN / 2); + PalCryptoGenerateRandomNumber(pCtx->skd + LCTR_SKD_S_OFFS, LL_SKD_LEN / 2); } /*************************************************************************************************/ @@ -189,14 +191,15 @@ void lctrStoreLtkNegRepTerminateReason(lctrConnCtx_t *pCtx) /*************************************************************************************************/ void lctrCalcSessionKey(lctrConnCtx_t *pCtx) { - BbBleEnc_t * const pEnc = &pCtx->bleData.chan.enc; + PalCryptoEnc_t * const pEnc = &pCtx->bleData.chan.enc; /* Use AES to transform LTK to session key using session key diversifier as seed. */ - LlMathAesEcb(pCtx->ltk, pEnc->sk, pCtx->skd); + PalCryptoAesEcb(pCtx->ltk, pEnc->sk, pCtx->skd); WSF_ASSERT(lctrInitCipherBlkHdlr); memcpy(pEnc->iv, pCtx->iv, sizeof(pEnc->iv)); uint8_t dir = (pCtx->role == LL_ROLE_MASTER) ? 1 : 0; /* master = 1; slave = 0 */ + pEnc->type = PAL_BB_TYPE_ACL; lctrInitCipherBlkHdlr(pEnc, LCTR_GET_CONN_HANDLE(pCtx), dir); } @@ -455,7 +458,7 @@ void lctrEncNotifyHostLtkReqInd(lctrConnCtx_t *pCtx) void lctrNotifyEncChangeInd(lctrConnCtx_t *pCtx, uint8_t status) { const uint16_t handle = LCTR_GET_CONN_HANDLE(pCtx); - BbBleEnc_t * const pEnc = &pCtx->bleData.chan.enc; + PalCryptoEnc_t * const pEnc = &pCtx->bleData.chan.enc; LlEncChangeInd_t evt = { diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_enc_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_enc_master.c index c8c7578a41..ad41679dd7 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_enc_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_enc_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master encryption action routines. + * \file + * \brief Link layer controller master encryption action routines. */ /*************************************************************************************************/ @@ -46,10 +47,10 @@ void lctrGenerateMstVectors(lctrConnCtx_t *pCtx) pCtx->ediv = pLctrConnMsg->startEnc.diversifier; /* Generate master part of IV. */ - BbBleDrvRand(pCtx->iv + LCTR_IV_M_OFFS, LL_IV_LEN / 2); + PalCryptoGenerateRandomNumber(pCtx->iv + LCTR_IV_M_OFFS, LL_IV_LEN / 2); /* Generate master part of SKD. */ - BbBleDrvRand(pCtx->skd + LCTR_SKD_M_OFFS, LL_SKD_LEN / 2); + PalCryptoGenerateRandomNumber(pCtx->skd + LCTR_SKD_M_OFFS, LL_SKD_LEN / 2); } /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_init_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_init_master.c index 51d4378491..af4f09235d 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_init_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_init_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master connection state machine action routines. + * \file + * \brief Link layer controller master connection state machine action routines. */ /*************************************************************************************************/ @@ -55,11 +56,11 @@ void lctrInitActInitiate(void) uint32_t interMaxUsec = LCTR_CONN_IND_US(pInitMsg->connSpec.connIntervalMax); uint32_t durUsec = pCtx->localConnDurUsec; - if (!SchRmAdd(LCTR_GET_CONN_HANDLE(pCtx), interMinUsec, interMaxUsec, durUsec, &connInterUsec)) + if (!SchRmAdd(LCTR_GET_CONN_HANDLE(pCtx), SCH_RM_PREF_PERFORMANCE, interMinUsec, interMaxUsec, durUsec, &connInterUsec, lctrGetConnRefTime)) { lctrFreeConnCtx(pCtx); result = FALSE; - lctrScanNotifyHostInitiateError(LL_ERROR_CODE_UNACCEPTABLE_CONN_INTERVAL, pInitMsg->peerAddrType, pInitMsg->peerAddr); + lctrScanNotifyHostInitiateError(LL_ERROR_CODE_CONN_REJ_LIMITED_RESOURCES, pInitMsg->peerAddrType, pInitMsg->peerAddr); break; } } while (FALSE); @@ -176,8 +177,6 @@ void lctrInitActShutdown(void) { if (lmgrCb.numInitEnabled) { - SchRmRemove(lctrMstInit.data.init.connHandle); - lctrFreeConnCtx(LCTR_GET_CONN_CTX(lctrMstInit.data.init.connHandle)); lctrMstInit.shutdown = TRUE; SchRemove(&lctrMstInit.scanBod); @@ -202,6 +201,9 @@ void lctrInitActScanTerm(void) lctrScanCleanup(&lctrMstInit); + SchRmRemove(lctrMstInit.data.init.connHandle); + lctrFreeConnCtx(LCTR_GET_CONN_CTX(lctrMstInit.data.init.connHandle)); + LlCreateConnCancelCnf_t evt = { .hdr = diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_init_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_init_master_ae.c index 87e63f1f64..35c0cccb71 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_init_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_init_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master connection state machine action routines. + * \file + * \brief Link layer controller master connection state machine action routines. */ /*************************************************************************************************/ #include "lctr_int_init_master_ae.h" @@ -61,6 +62,24 @@ void lctrExtInitActShutdown(lctrExtScanCtx_t *pExtInitCtx) /*************************************************************************************************/ void lctrExtInitActScanTerm(lctrExtScanCtx_t *pExtInitCtx) { + for (unsigned i = 0; i < LCTR_SCAN_PHY_TOTAL; i++) + { + if (lctrMstExtInit.enaPhys & (1 << i)) + { + if ((lctrMstExtInit.estConnPhys & (1 << i)) == 0) + { + lctrConnCtx_t *pCtx = LCTR_GET_CONN_CTX(lctrMstExtInitTbl[i].data.init.connHandle); + + if (pCtx->enabled == TRUE) + { + /* Cleanup unused initiate PHY connection context. */ + SchRmRemove(lctrMstExtInitTbl[i].data.init.connHandle); + lctrFreeConnCtx(pCtx); + } + } + } + } + lctrMstExtInitCleanupOp(pExtInitCtx); if (pExtInitCtx->state != LCTR_EXT_INIT_STATE_RESET) diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_phy.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_phy.c index 71986d2042..6a5f91e22a 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_phy.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_act_phy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller PHY features action routines. + * \file + * \brief Link layer controller PHY features action routines. */ /*************************************************************************************************/ @@ -191,7 +192,7 @@ void lctrSendPhyUpdateIndPdu(lctrConnCtx_t *pCtx, uint8_t txPhys, uint8_t rxPhys uint16_t ceOffset; #if (LL_ENABLE_TESTER == TRUE) - if (llTesterCb.eventCounterOffset) + if (llTesterCb.eventCounterOverride == TRUE) { ceOffset = llTesterCb.eventCounterOffset + 1; /* +1 for next CE */ } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int.h index c5fe545298..d93a55f00a 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal link layer controller interface file. + * \file + * \brief Internal link layer controller interface file. */ /*************************************************************************************************/ @@ -27,6 +28,7 @@ #include "ll_defs.h" #include "lmgr_api.h" #include "ll_math.h" +#include "util/crc32.h" #if (LL_ENABLE_TESTER) #include "ll_tester_api.h" @@ -68,7 +70,7 @@ extern "C" { /*! \brief Convert BLE protocol ticks to microseconds. */ #define LCTR_BLE_TO_US(x) ((x) * LL_BLE_US_PER_TICK) -/*! \brief Convert periodic interval milliseconds to microseconds. */ +/*! \brief Convert periodic interval units to microseconds. */ #define LCTR_PER_INTER_TO_US(x) ((x) * 1250) /*! \brief Convert periodic interval microseconds to milliseconds. */ @@ -77,6 +79,9 @@ extern "C" { /*! \brief Convert periodic sync timeout unit to milliseconds. */ #define LCTR_PER_SYNC_TIMEOUT_TO_MS(x) ((x) * 10) +/*! \brief Convert isochronous interval to microseconds. */ +#define LCTR_ISO_INT_TO_US(x) ((x) * 1250) + /*! \brief Fast termination supervision multiplier. */ #define LCTR_FAST_TERM_CNT 6 @@ -102,25 +107,15 @@ extern "C" { #define LCTR_ADVB_BUF_OFFSET_CRC ((LCTR_ADVB_BUF_SIZE - LCTR_ADVB_BUF_EXTRA_SIZE) + 2) /*! \brief LCTR Maximum span of scheduler elements. */ -#define LCTR_SCH_MAX_SPAN 0x80000000 +#define LCTR_SCH_MAX_SPAN 0x80000000 + +/*! \brief LCTR Maximum value for sleep clock accuracy. */ +#define LCTR_MAX_SCA 7 /************************************************************************************************** Data Types **************************************************************************************************/ -/*! \brief Channel parameters. */ -typedef struct -{ - /* Channel parameters */ - uint8_t lastChanIdx; /*!< Current channel index. */ - uint8_t numUsedChan; /*!< Number of used channels. */ - uint64_t chanMask; /*!< Channel mask. */ - uint8_t chanRemapTbl[LL_CHAN_DATA_MAX_IDX + 1]; /*!< Channel remapping table. */ - - uint8_t usedChSel; /*!< Used channel selection. */ - uint16_t chIdentifier; /*!< Channel identifier. */ -} lctrChanParam_t; - /*! \brief Call signature of a reset handler. */ typedef void (*LctrResetHdlr_t)(void); @@ -141,8 +136,7 @@ extern LctrResetHdlr_t lctrResetHdlrTbl[LCTR_DISP_TOTAL]; extern LctrMsgDisp_t lctrMsgDispTbl[LCTR_DISP_TOTAL]; extern LctrEvtHdlr_t lctrEventHdlrTbl[LCTR_EVENT_TOTAL]; extern lctrMsgHdr_t *pLctrMsg; -extern LctrRmCback_t lctrGetConnOffsetsCback; -extern LctrRmCback_t lctrGetPerOffsetsCback; +extern const uint16_t scaPpmTbl[]; /************************************************************************************************** Functions @@ -151,10 +145,11 @@ extern LctrRmCback_t lctrGetPerOffsetsCback; /* Helper routines. */ uint32_t lctrComputeAccessAddr(void); uint8_t lctrComputeHopInc(void); -uint8_t lctrPeriodicSelectNextChannel(lctrChanParam_t *pChanParam, uint16_t eventCounter); -void lctrPeriodicBuildRemapTable(lctrChanParam_t *pChanParam); +uint8_t lctrPeriodicSelectNextChannel(lmgrChanParam_t *pChanParam, uint16_t eventCounter); +void lctrPeriodicBuildRemapTable(lmgrChanParam_t *pChanParam); uint16_t lctrCalcTotalAccuracy(uint8_t mstScaIdx); uint32_t lctrComputeCrcInit(void); +uint32_t lctrCalcWindowWideningUsec(uint32_t unsyncTimeUsec, uint32_t caPpm); /* Host events */ void lctrNotifyHostHwErrInd(uint8_t code); @@ -169,18 +164,17 @@ void lctrSlvAdvExecuteSm(uint8_t event); /*************************************************************************************************/ /*! - * \brief Get operational mode flag. + * \brief Calculate DID. * - * \param flag Flag to check. + * \param pBuf Data buffer. + * \param len Length of data buffer. * - * \return TRUE if flag is set. - * - * Get mode flag governing LL operations. + * \return DID value. */ /*************************************************************************************************/ -static inline bool_t lctrGetOpFlag(uint32_t flag) +static inline uint16_t lctrCalcDID(const uint8_t *pBuf, uint16_t len) { - return (lmgrCb.opModeFlags & flag) ? TRUE : FALSE; + return CalcCrc32(LlMathRandNum(), len, pBuf); } #ifdef __cplusplus diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_ae.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_ae.h new file mode 100644 index 0000000000..05708f3eb1 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_ae.h @@ -0,0 +1,94 @@ + +/* Copyright (c) 2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*************************************************************************************************/ +/*! + * \file + * \brief Extended advertising common header file */ +/*************************************************************************************************/ + +#ifndef LCTR_INT_ADV_AE_H +#define LCTR_INT_ADV_AE_H + +#include "ll_defs.h" +#include "lctr_api.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/*! \brief Acad parameter indicies */ +enum +{ + LCTR_ACAD_ID_CHAN_MAP_UPDATE, + + /* Total number of Acad IDs. */ + LCTR_ACAD_NUM_ID, + + /* Invalid ID type. */ + LCTR_ACAD_INVALID_ID = 0xFF +}; + +/*! \brief Acad states */ +enum +{ + LCTR_ACAD_STATE_DISABLED = 0, + LCTR_ACAD_STATE_ENABLED, + + LCTR_ACAD_STATE_TOTAL +}; + +/*! \brief Acad Common events */ +enum +{ + LCTR_ACAD_COMM_MSG_START, + LCTR_ACAD_COMM_MSG_FINISH, + + LCTR_ACAD_COMM_MSG_TOTAL, + + LCTR_ACAD_COMM_MSG_INVALID = 0xFF +}; + +/*! \brief Acad header */ +typedef struct +{ + uint8_t state; /* State of Acad. */ + uint8_t opcode; /* Opcode of Acad. */ + uint8_t len; /* Length of Acad data field. */ +} lctrAcadHdr_t; + +/*! \brief Acad data field for channel map update */ +typedef struct +{ + lctrAcadHdr_t hdr; /* Acad header. */ + uint64_t chanMask; /* Channel mask for the update. */ + uint16_t instant; /* Instant for the update. */ +} lctrAcadChanMapUpd_t; + +/*! \brief Generic Acad packet. */ +typedef union +{ + lctrAcadHdr_t hdr; /* Acad header. */ + lctrAcadChanMapUpd_t chanMapUpdate; /* Channel map update. */ +} lctrAcadParam_t; + +#ifdef __cplusplus +}; +#endif + +#endif /* LCTR_INT_ADV_AE_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_master.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_master.h index d5f8353985..93782d1e60 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_master.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_master.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal link layer controller scanning master interface file. + * \file + * \brief Internal link layer controller scanning master interface file. */ /*************************************************************************************************/ @@ -37,8 +38,8 @@ extern "C" { Macros **************************************************************************************************/ -/*! \brief Minimum amount of time required for scanning, (minimum scanWindow size is 2.5ms). */ -#define LCTR_MIN_SCAN_USEC 0 +/*! \brief Minimum amount of time required for scanning, to be same as minimum time in BB(1528us). */ +#define LCTR_MIN_SCAN_USEC BB_SCAN_GUARD_US /************************************************************************************************** Constants diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_master_ae.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_master_ae.h index fc914fa5a2..51257b7255 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_master_ae.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_master_ae.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,18 +16,21 @@ /*************************************************************************************************/ /*! - * \brief Internal link layer controller extended scanning master interface file. + * \file + * \brief Internal link layer controller extended scanning master interface file. */ /*************************************************************************************************/ #ifndef LCTR_INT_ADV_MASTER_AE_H #define LCTR_INT_ADV_MASTER_AE_H +#include "lctr_int_adv_ae.h" #include "lctr_int.h" #include "lctr_api_adv_master_ae.h" #include "lctr_int_adv_master.h" #include "lctr_pdu_adv_ae.h" #include "bb_ble_api.h" +#include "ll_defs.h" #include "wsf_timer.h" #ifdef __cplusplus @@ -71,6 +74,16 @@ enum LCTR_CREATE_SYNC_STATE_TOTAL /*!< Total number of Create sync states. */ }; +/*! \brief Transfer sync states. */ +enum +{ + LCTR_TRANSFER_SYNC_STATE_DISABLED = LCTR_CREATE_SYNC_STATE_DISABLED, /*!< Transfer sync disabled state. */ + LCTR_TRANSFER_SYNC_STATE_DISCOVER = LCTR_CREATE_SYNC_STATE_DISCOVER, /*!< Transfer sync enabled state. */ + LCTR_TRANSFER_SYNC_STATE_SHUTDOWN = LCTR_CREATE_SYNC_STATE_SHUTDOWN, /*!< Transfer sync shutdown in process state. */ + LCTR_TRANSFER_SYNC_STATE_RESET = LCTR_CREATE_SYNC_STATE_RESET, /*!< Transfer sync reset in progress. */ + LCTR_TRANSFER_SYNC_STATE_TOTAL = LCTR_CREATE_SYNC_STATE_TOTAL /*!< Total number of Transfer sync states. */ +}; + /*! \brief Periodic scanning states. */ enum { @@ -117,7 +130,9 @@ typedef struct { /* Report handling. */ LlExtAdvReportInd_t advRpt; /*!< Advertising report. */ - lctrRptState_t advRptState:8; /*!< Advertising report state. */ + lctrRptState_t advRptState; /*!< Advertising report state. */ + LlExtAdvReportInd_t auxAdvRpt; /*!< Auxiliary Advertising report (only used with scannable advertising). */ + lctrRptState_t auxAdvRptState; /*!< Auxiliary Advertising report state. */ /* Backoff. */ uint16_t upperLimit; /*!< Scan backoff upper limit. */ @@ -188,16 +203,6 @@ typedef struct wsfTimer_t tmrScanPer; /*!< Scan period timer. */ } lctrExtScanCtrlBlk_t; - -/*! \brief Periodic advertising create sync parameters. */ -typedef struct -{ - uint8_t filterPolicy; /*!< Filter Policy. */ - uint8_t advSID; /*!< Advertising SID. */ - uint8_t advAddrType; /*!< Advertiser Address Type. */ - uint64_t advAddr; /*!< Advertiser Address. */ -} lctrPerParam_t; - /*! \brief Periodic scanning context. */ typedef struct { @@ -205,7 +210,11 @@ typedef struct uint8_t state; /*!< Current state. */ bool_t shutdown; /*!< Client initiated shutdown flag. */ bool_t cancelCreateSync; /*!< Shut down due to create sync cancel. */ + bool_t cancelByHost; /*!< Cancel command was issued from host. */ bool_t firstPerAdvRcv; /*!< True if first periodic advertising packet is received. */ + bool_t repDisabled; /*!< Reporting disabled. */ + bool_t bodAborted; /*!< Tue if periodic scan BOD was aborted. */ + uint8_t createDispId; /*!< Dispatcher id to tell if periodic sync was created or transferred. */ /* Report handling. */ LlPerAdvReportInd_t advRpt; /*!< Periodic advertising report. */ @@ -225,6 +234,11 @@ typedef struct uint32_t rxSyncDelayUsec; /*!< Receive timeout in microseconds. */ uint32_t lastAnchorPoint; /*!< Last anchor point in BB tick. */ uint16_t lastActiveEvent; /*!< Last active event counter. */ + uint16_t initEventCounter; /*!< Initial event counter received from sync_info. */ + + /* Acad control block */ + /* Note: for now, the acad type only applies to the periodic context. */ + lctrAcadParam_t acadParams[LCTR_ACAD_NUM_ID]; /*!< Acad control block array. */ /* Local periodic scanning parameters */ uint16_t skip; /*!< Skip. */ @@ -236,7 +250,7 @@ typedef struct /* RF parameters */ int8_t rssi; /*!< RSSI. */ - lctrChanParam_t chanParam; /*!< Channel parameters. */ + lmgrChanParam_t chanParam; /*!< Channel parameters. */ /* Supervision */ wsfTimer_t tmrSupTimeout; /*!< Supervision timer. */ @@ -244,7 +258,9 @@ typedef struct /* Peer device info */ uint8_t advSID; /*!< Advertising SID. */ uint8_t advAddrType; /*!< Advertiser Address Type. */ + uint8_t trsfAddrType; /*!< Advertiser Address Type to be used for sync transfer. */ uint64_t advAddr; /*!< Advertiser Address. */ + uint64_t trsfAdvAddr; /*!< Advertiser Address to be used for sync transfer. */ /* Packet state. */ lctrExtAdvHdr_t extAdvHdr; /*!< Coalesced extended advertising header. */ @@ -263,6 +279,35 @@ typedef struct lctrPerScanCtx_t *pPerScanCtx; /*!< Current synchronous context. */ } lctrPerCreateSyncCtrlBlk_t; +/*! \brief Acad message header. */ +typedef struct +{ + uint16_t eventCtr; /*!< Current event counter. */ + uint16_t skip; /*!< Skip amount. */ + uint8_t acadId; /*!< Acad ID being processed. */ + uint16_t handle; /*!< Active Handle. */ +} lctrAcadMsgHdr_t; + +/*! \brief Acad message generic type. */ +typedef union +{ + lctrAcadMsgHdr_t hdr; /*!< Header of an Acad Msg. */ +} lctrAcadMsg_t; + +/*! \brief Periodic sync transfer state context. */ +typedef struct +{ + uint8_t state; /*!< Periodic sync transfer state. */ + uint16_t connHandle; /*!< Connection handle. */ + uint16_t serviceData; /*!< Service Data. */ + uint16_t ceRef; /*!< Reference connection event counter. */ + uint16_t ceRcvd; /*!< Connection event counter when LL_PERIODIC_SYNC_IND was received. */ + uint16_t syncCe; /*!< Connection event counter when the contents of the PDU is determined. */ + uint8_t scaB; /*!< Sleep clock accuracy of the device sending LL_PERIODIC_SYNC_IND. */ + uint16_t lastPECounter; /*!< Last PA event counter. */ + lctrPerScanCtx_t *pPerScanCtx; /*!< Current synchronous context. */ +} lctrPerTransferSyncCtrlBlk_t; + /************************************************************************************************** Globals **************************************************************************************************/ @@ -270,7 +315,9 @@ typedef struct extern lctrExtScanCtx_t lctrMstExtScanTbl[LCTR_SCAN_PHY_TOTAL]; extern lctrExtScanCtrlBlk_t lctrMstExtScan; extern lctrPerCreateSyncCtrlBlk_t lctrPerCreateSync; +extern lctrPerTransferSyncCtrlBlk_t lctrPerTransferSync; extern lctrPerScanCtx_t lctrMstPerScanTbl[LL_MAX_PER_SCAN]; +extern lctrSyncInfo_t trsfSyncInfo; /************************************************************************************************** Function Declarations @@ -280,8 +327,9 @@ extern lctrPerScanCtx_t lctrMstPerScanTbl[LL_MAX_PER_SCAN]; uint8_t lctrMstExtDiscoverBuildOp(lctrExtScanCtx_t *pExtScanCtx); uint8_t lctrMstAuxDiscoverBuildOp(lctrExtScanCtx_t *pExtScanCtx); void lctrMstAuxDiscoverOpCommit(lctrExtScanCtx_t *pExtScanCtx, lctrAuxPtr_t *pAuxPtr, uint32_t startTs, uint32_t endTs); -uint8_t lctrMstPerScanBuildOp(lctrPerScanCtx_t *pPerScanCtx, lctrPerCreateSyncMsg_t *pMsg); +uint8_t lctrMstPerScanBuildOp(lctrPerScanCtx_t *pPerScanCtx); void lctrMstPerScanOpCommit(lctrExtScanCtx_t *pExtScanCtx, lctrAuxPtr_t *pAuxPtr, lctrSyncInfo_t *pSyncInfo, uint32_t startTs, uint32_t endTs); +void lctrMstPerScanTransferOpCommit(uint16_t connHandle); /* ISR: Discovery packet handlers */ bool_t lctrMstDiscoverRxExtAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf); @@ -297,6 +345,7 @@ bool_t lctrMstDiscoverRxLegacyScanRspHandler(BbOpDesc_t *pOp, const uint8_t *pRs void lctrMstExtDiscoverEndOp(BbOpDesc_t *pOp); void lctrMstAuxDiscoverEndOp(BbOpDesc_t *pOp); void lctrMstPerScanEndOp(BbOpDesc_t *pOp); +void lctrMstPerScanAbortOp(BbOpDesc_t *pOp); uint32_t lctrMstPerScanRxPerAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf, uint8_t status); bool_t lctrMstPerScanRxPerAdvPktPostHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf); @@ -310,25 +359,37 @@ void lctrExtScanActSelfTerm(lctrExtScanCtx_t *pExtScanCtx); void lctrExtScanActUpdateDiscover(lctrExtScanCtx_t *pExtScanCtx); void lctrCreateSyncActCreate(void); void lctrCreateSyncActCancel(void); +void lctrCreateSyncActFailed(void); void lctrCreateSyncActTerminate(void); void lctrCreateSyncActDone(void); +void lctrTransferSyncActStart(void); +void lctrTransferSyncActDone(void); +void lctrTransferSyncActFailed(void); +void lctrTransferSyncActCancel(void); +void lctrTransferSyncActTerminate(void); + void lctrPerScanActSyncEstd(lctrPerScanCtx_t *pPerScanCtx); void lctrPerScanActSyncTerminate(lctrPerScanCtx_t *pPerScanCtx); void lctrPerScanActSyncTerminateDone(lctrPerScanCtx_t *pPerScanCtx); void lctrPerScanActSyncTimeout(lctrPerScanCtx_t *pPerScanCtx); +void lctrPerScanActProcessAcad(lctrAcadMsg_t *pMsg); /* State machine */ void lctrMstExtScanExecuteSm(lctrExtScanCtx_t *pExtScanCtx, uint8_t event); void lctrMstCreateSyncExecuteSm(uint8_t event); +void lctrMstTransferSyncExecuteSm(uint8_t event); void lctrMstPerScanExecuteSm(lctrPerScanCtx_t *pPerScanCtx, uint8_t event); /* Helpers */ lctrPerScanCtx_t *lctrAllocPerScanCtx(void); +BbOpDesc_t *lctrPerScanResolveConflict(BbOpDesc_t *pNewOp, BbOpDesc_t *pExistOp); +void lctrMstPerScanIsrInit(void); /* Messaging */ void lctrSendExtScanMsg(lctrExtScanCtx_t *pExtScanCtx, uint8_t event); -void lctrSendCreateSyncMsg(uint8_t event); +void lctrSendCreateSyncMsg(lctrPerScanCtx_t *pCtx, uint8_t event); void lctrSendPerScanMsg(lctrPerScanCtx_t *pCtx, uint8_t event); +void LctrSendPerSyncTrsfRcvdEvt(uint8_t status, lctrPerScanCtx_t *pPerScanCtx); /*************************************************************************************************/ /*! @@ -376,35 +437,6 @@ static inline uint8_t lctrConvertAuxPtrPhyToBbPhy(uint8_t auxPtrPhy) } } -/*************************************************************************************************/ -/*! - * \brief Compute the connection interval window widening delay in microseconds. - * - * \param unsyncTimeUsec Unsynchronized time in microseconds. - * \param caPpm Total clock accuracy. - * - * \return Window widening delay in microseconds. - */ -/*************************************************************************************************/ -static inline uint32_t lctrCalcAuxAdvWindowWideningUsec(uint32_t unsyncTimeUsec, uint32_t caPpm) -{ - if (lctrGetOpFlag(LL_OP_MODE_FLAG_ENA_WW)) - { - /* Largest unsynchronized time is 1,996 seconds (interval=4s and latency=499) and - * largest total accuracy is 1000 ppm. */ - /* coverity[overflow_before_widen] */ - uint64_t wwDlyUsec = LL_MATH_DIV_10E6(((uint64_t)unsyncTimeUsec * caPpm) + - 999999); /* round up */ - - /* Reduce to 32-bits and always round up to a sleep clock tick. */ - return wwDlyUsec + pLctrRtCfg->ceJitterUsec; - } - else - { - return 0; - } -} - /*************************************************************************************************/ /*! * \brief Compute auxiliary offset. @@ -420,7 +452,7 @@ static inline void lctrMstComputeAuxOffset(lctrAuxPtr_t *pAuxPtr, uint32_t *pOff { uint32_t offsetUsec = pAuxPtr->auxOffset * ((pAuxPtr->offsetUnits == LCTR_OFFS_UNITS_30_USEC) ? 30 : 300); uint32_t caPpm = BbGetClockAccuracy() + ((pAuxPtr->ca == LCTR_CLK_ACC_0_50_PPM) ? 50 : 500); - uint32_t wwUsec = lctrCalcAuxAdvWindowWideningUsec(offsetUsec, caPpm); + uint32_t wwUsec = lctrCalcWindowWideningUsec((offsetUsec + (pAuxPtr->offsetUnits == LCTR_OFFS_UNITS_30_USEC) ? 30 : 300), caPpm); *pOffsetUsec = offsetUsec - wwUsec; *pSyncDelayUsec = (wwUsec << 1) + ((pAuxPtr->offsetUnits == LCTR_OFFS_UNITS_30_USEC) ? 30 : 300); /* rounding compensation */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_slave.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_slave.h index 591b70d8ac..179af533f4 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_slave.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_slave.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal link layer controller advertising slave interface file. + * \file + * \brief Internal link layer controller advertising slave interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_slave_ae.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_slave_ae.h index 4a4b59ac39..82124a47ea 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_slave_ae.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_adv_slave_ae.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,13 +16,15 @@ /*************************************************************************************************/ /*! - * \brief Internal link layer controller slave extended advertising interface file. + * \file + * \brief Internal link layer controller slave extended advertising interface file. */ /*************************************************************************************************/ #ifndef LCTR_INT_ADV_SLAVE_AE_H #define LCTR_INT_ADV_SLAVE_AE_H +#include "lctr_int_adv_ae.h" #include "lctr_int.h" #include "lctr_api_adv_slave_ae.h" #include "lmgr_api_adv_slave_ae.h" @@ -58,7 +60,10 @@ extern "C" { #define LCTR_COMP_EXT_ADV_DATA_MAX_LEN 251 /* TODO: cfg_mac_ble.h configuration */ /*! \brief Resolve the extended advertising index from the context pointer. */ -#define LCTR_GET_EXT_ADV_INDEX(pAdvSet) (pAdvSet - &pLctrAdvSetTbl[0]) +#define LCTR_GET_EXT_ADV_INDEX(pAdvSet) (pAdvSet - &pLctrAdvSetTbl[0]) + +/*! \brief Get reservation manager handle for periodic ADV from the context pointer. */ +#define LCTR_GET_PER_RM_HANDLE(pAdvSet) (LL_MAX_CONN + LCTR_GET_EXT_ADV_INDEX(pAdvSet)) /************************************************************************************************** Constants @@ -104,6 +109,7 @@ typedef struct uint8_t priAdvPhy; /*!< Primary Advertising PHY. */ uint8_t secAdvMaxSkip; /*!< Secondary Advertising Maximum Skip. */ uint8_t secAdvPhy; /*!< Secondary Advertising PHY. */ + uint16_t advDID; /*!< Advertising Data ID. */ uint8_t advSID; /*!< Advertising SID. */ uint8_t scanReqNotifEna; /*!< Scan Request Notification Enable. */ } lctrExtAdvParam_t; @@ -131,13 +137,13 @@ typedef struct bool_t advParamReady; /*!< Periodic Advertising Parameter is ready or not. */ /* Channel parameters */ - lctrChanParam_t perChanParam; /*!< Periodic Advertising Channel parameter. */ + lmgrChanParam_t perChanParam; /*!< Periodic Advertising Channel parameter. */ + uint64_t updChanMask; /*!< Last updated channel mask */ } lctrPerAdvParam_t; /*! \brief Advertising data buffer descriptor. */ typedef struct { - uint16_t did; /*!< Advertising Data ID. */ uint16_t len; /*!< Advertising data length. */ uint8_t *pBuf; /*!< Advertising data buffer. */ bool_t ready; /*!< Advertising data buffer complete. */ @@ -184,6 +190,9 @@ typedef struct uint32_t auxDelayUsec; /*!< Auxiliary advertising event delay. */ uint8_t advDataFragLen; /*!< Advertising data fragmentation length. */ + /* Acad control block */ + lctrAcadParam_t acadParams[LCTR_ACAD_NUM_ID]; /*!< Acad parameters. */ + /* Periodic advertising parameters */ lctrPerAdvParam_t perParam; /*!< Periodic advertising parameters. */ @@ -230,6 +239,8 @@ typedef struct uint32_t auxOffsUsec; /*!< Offset in microseconds to the next auxiliary PDU. */ uint8_t auxChIdx; /*!< AUX LL Channel. */ bool_t auxBodUsed; /*!< Auxiliary BOD in use flag. */ + bool_t didPerUpdate; /*!< Data ID update due to periodic enable or disable. */ + bool_t advBodAbort; /*!< TRUE if extended advertising BOD is aborted. */ lctrAdvbPduHdr_t rspPduHdr; /*!< Response PDU header. */ } lctrAdvSet_t; @@ -254,6 +265,7 @@ extern LctrPerAdvMsg_t *pLctrSlvPerAdvMsg; /* Context */ void lctrFreeAdvSet(lctrAdvSet_t *pAdvSet); +lctrAdvSet_t *lctrFindAdvSet(uint8_t handle); /* Address selection */ void lctrChooseSetAdvA(lctrAdvbPduHdr_t *pPduHdr, BbBleData_t * const pBle, lctrAdvSet_t *pAdvSet); @@ -282,16 +294,21 @@ bool_t lctrSlvRxAuxConnReqHandler(BbOpDesc_t *pOp, const uint8_t *pReqBuf); bool_t lctrSlvRxLegacyReqHandler(BbOpDesc_t *pOp, const uint8_t *pReqBuf); void lctrSlvRxLegacyReqPostProcessHandler(BbOpDesc_t *pOp, const uint8_t *pReqBuf); uint32_t lctrSlvTxSetupPeriodicAdvDataHandler(BbOpDesc_t *pOp, bool_t isChainInd); +void lctrSlvAcadHandler(lctrAdvSet_t *pAdvSet); /* ISR: BOD handlers */ void lctrSlvExtAdvEndOp(BbOpDesc_t *pOp); +void lctrSlvExtAdvAbortOp(BbOpDesc_t *pOp); void lctrSlvAuxAdvEndOp(BbOpDesc_t *pOp); void lctrSlvPeriodicAdvEndOp(BbOpDesc_t *pOp); +void lctrSlvPeriodicAdvAbortOp(BbOpDesc_t *pOp); /* Action routines */ void lctrExtAdvActStart(lctrAdvSet_t *pAdvSet); +void lctrExtAdvActSelfStart(lctrAdvSet_t *pAdvSet); void lctrExtAdvActRestart(lctrAdvSet_t *pAdvSet); void lctrExtAdvActShutdown(lctrAdvSet_t *pAdvSet); +void lctrExtAdvActResetShutdown(lctrAdvSet_t *pAdvSet); void lctrExtAdvActAdvCnf(lctrAdvSet_t *pAdvSet); void lctrExtAdvActDisallowAdvCnf(lctrAdvSet_t *pAdvSet); void lctrExtAdvActSelfTerm(lctrAdvSet_t *pAdvSet); @@ -305,13 +322,16 @@ void lctrPeriodicAdvActDisallowAdvCnf(lctrAdvSet_t *pAdvSet); void lctrPeriodicAdvActShutdown(lctrAdvSet_t *pAdvSet); void lctrPeriodicAdvActResetTerm(lctrAdvSet_t *pAdvSet); void lctrPeriodicAdvActAdvTerm(lctrAdvSet_t *pAdvSet); +void lctrSlvAcadActChanMapUpdateStart(lctrAdvSet_t *pAdvSet); +void lctrSlvAcadActChanMapUpdateFinish(lctrAdvSet_t *pAdvSet); /* Reservation */ -void lctrGetPerAdvOffsets(uint32_t rsvnOffs[], uint32_t refTime); +uint32_t lctrGetPerRefTime(uint8_t perHandle, uint32_t *pDurUsec); /* State machine */ void lctrSlvExtAdvExecuteSm(lctrAdvSet_t *pAdvSet, uint8_t event); void lctrSlvPeriodicAdvExecuteSm(lctrAdvSet_t *pAdvSet, uint8_t event); +void lctrSlvAcadExecuteSm(lctrAdvSet_t *pAdvSet, uint8_t event); /* Messaging */ void lctrSendAdvSetMsg(lctrAdvSet_t *pAdvSet, uint8_t event); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_conn.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_conn.h index 9d3789b423..12b61aee47 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_conn.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_conn.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal link layer controller connection interface file. + * \file + * \brief Internal link layer controller connection interface file. */ /*************************************************************************************************/ @@ -96,6 +97,23 @@ enum LCTR_CMN_STATE_TOTAL /*!< Total number of LLCP states. */ }; +/*! \brief SVT states. */ +enum +{ + LCTR_SVT_STATE_IDLE, /*!< SVT idle state. */ + LCTR_SVT_STATE_URGENT, /*!< SVT urgent state. */ + LCTR_SVT_STATE_FATAL, /*!< SVT fatal state. */ + LCTR_SVT_STATE_TOTAL /*!< Total number of SVT state. */ +}; + +/*! \brief Periodic sync source. */ +enum +{ + LCTR_SYNC_SRC_SCAN, /*!< Periodic sync info from scanner. */ + LCTR_SYNC_SRC_BCST, /*!< Periodic sync info from broadcaster. */ + LCTR_SYNC_SRC_TOTAL /*!< Total number of periodic sync source. */ +}; + /*! \brief Common LLCP procedure IDs. */ enum { @@ -106,6 +124,8 @@ enum LCTR_PROC_CMN_VER_EXCH, /*!< Version exchange procedure. */ LCTR_PROC_CMN_DATA_LEN_UPD, /*!< Data length update procedure. */ LCTR_PROC_CMN_SET_MIN_USED_CHAN, /*!< Set minimum number of used channels procedure. */ + LCTR_PROC_CMN_PER_ADV_SYNC_TRSF, /*!< Periodic advertising sync transfer procedure. */ + LCTR_PROC_CMN_REQ_PEER_SCA, /*!< Request peer SCA procedure. */ LCTR_PROC_CMN_TOTAL, /*!< Total number of common procedures. */ /* Custom SM LLCP procedures. */ @@ -115,12 +135,23 @@ enum LCTR_PROC_LE_PING, /*!< LE Ping procedure. */ LCTR_PROC_PHY_UPD, /*!< PHY update procedure. */ LCTR_PROC_PHY_UPD_PEER, /*!< Peer-initiated PHY update procedure. */ + LCTR_PROC_CIS_EST, /*!< CIS establishment procedure. */ + LCTR_PROC_CIS_EST_PEER, /*!< Peer-initiated CIS establishment procedure. */ + LCTR_PROC_CIS_TERM, /*!< CIS termination procedure. */ + LCTR_PROC_CIS_TERM_PEER, /*!< Peer-initiated CIS termination procedure. */ LCTR_PROC_INVALID = 0xFF /*!< Invalid ID. */ /* Note: additional procedures without instants can be overridden. */ }; +/*! \brief Check if CIS is enabled by the CIS handle signature. */ +typedef bool_t (*lctrCheckCisEstCisFn_t)(uint16_t cisHandle); +/*! \brief Check for CIS termination signature. */ +typedef bool_t (*lctrCheckTermFn_t)(uint16_t aclHandle); +/*! \brief Check if there is a CIS established by the ACL handle signature. */ +typedef bool_t (*lctrCheckCisEstAclFn_t)(uint16_t aclHandle); + /*! \brief Connection context. */ typedef struct { @@ -148,6 +179,12 @@ typedef struct uint32_t unsyncedTime; /*!< Unsynced time in BB tick before connection update. */ bool_t initAckRcvd; /*!< Ack received from master. */ bool_t abortSlvLatency; /*!< If TRUE abort slave latency. */ + + uint8_t consCrcFailed; /*!< Number of consecutive CRC failures. */ + bool_t syncWithMaster; /*!< Flag indicating synchronize packet received from master. */ + bool_t rxFromMaster; /*!< At least one successful packet received from master. */ + uint32_t firstRxStartTs; /*!< Timestamp of the first received frame regardless of CRC error. */ + } slv; /*!< Slave connection specific data. */ struct @@ -173,6 +210,8 @@ typedef struct /*!< Channel remapping table. */ uint8_t usedChSel; /*!< Used channel selection. */ uint16_t chIdentifier; /*!< Channel identifier. */ + uint32_t crcInit; /*!< CRC initialization value. */ + uint32_t accessAddr; /*!< Connection access address. */ /* Flow control */ lctrDataPduHdr_t txHdr; /*!< Transmit data PDU header. */ @@ -184,11 +223,13 @@ typedef struct uint8_t numRxPend; /*!< Number of Rx pending buffers. */ bool_t emptyPduPend; /*!< Empty PDU ACK pending. */ bool_t emptyPduFirstAtt; /*!< Empty PDU first attempt. */ + bool_t forceStartPdu; /*!< Next data will be forced to be a start PDU */ /* Supervision */ uint16_t supTimeoutMs; /*!< Supervision timeout in milliseconds. */ wsfTimer_t tmrSupTimeout; /*!< Supervision timer. */ bool_t connEst; /*!< Connection established. */ + uint8_t svtState; /*!< SVT urgency state. */ /* Encryption */ bool_t pauseRxData; /*!< Pause Rx data PDUs. */ @@ -219,6 +260,7 @@ typedef struct lctrVerInd_t remoteVer; /*!< Peer version data. */ bool_t featExchFlag; /*!< Flag for completed feature exchange. */ uint64_t usedFeatSet; /*!< Used feature set. */ + uint8_t peerSca; /*!< Peer SCA. */ /* Data length */ lctrDataLen_t localDataPdu; /*!< Local Data PDU parameters. */ @@ -236,6 +278,17 @@ typedef struct uint8_t peerMinUsedChan[LL_MAX_PHYS]; /*!< Peer minimum number of used channels for PHYs. */ + /* Periodic sync indication */ + bool_t sendPerSync; /*!< Send LL_PERIODIC_SYNC_IND flag. */ + uint8_t perSyncSrc; /*!< Periodic sync source. */ + uint16_t perServiceData; /*!< ID for periodic sync indication. */ + uint16_t perSyncHandle; /*!< Periodic sync handle. */ + + /* PAST(Periodic advertising sync transfer) parameters. */ + uint8_t syncMode; /*!< Sync transfer mode. */ + uint16_t syncSkip; /*!< Sync skip for periodic adv sync transfer. */ + uint16_t syncTimeout; /*!< Sync timeout for periodic adv sync transfer. */ + /* LLCP */ uint8_t llcpState; /*!< Current LLCP state. */ uint8_t encState; /*!< Current encryption state. */ @@ -252,9 +305,9 @@ typedef struct bool_t isFirstNonCtrlPdu; /*!< True if first non-control PDU from master and slave. */ bool_t isSlvPhyUpdInstant; /*!< True if slave is in PHY update instant state. */ uint8_t llcpActiveProc; /*!< Current procedure. */ - uint16_t llcpNotifyMask; /*!< Host notification mask. */ - uint16_t llcpPendMask; /*!< Pending LLCP procedures. */ - uint16_t llcpIncompMask; /*!< Incomplete LLCP procedures. */ + uint32_t llcpNotifyMask; /*!< Host notification mask. */ + uint32_t llcpPendMask; /*!< Pending LLCP procedures. */ + uint32_t llcpIncompMask; /*!< Incomplete LLCP procedures. */ LlConnSpec_t connUpdSpec; /*!< Host connection update specification. */ lctrConnUpdInd_t connUpd; /*!< Connection update parameters. */ lctrConnParam_t connParam; /*!< Stored peer connection parameter request or response. */ @@ -262,19 +315,26 @@ typedef struct lctrPhy_t phyReq; /*!< Stored peer PHY request. */ lctrPhyUpdInd_t phyUpd; /*!< PHY update parameters. */ wsfTimer_t tmrProcRsp; /*!< Procedure response timer. */ + uint8_t scaUpdAction; /*!< Sca update action variable. */ + int8_t scaMod; /*!< Local sca override modifier. */ + + /* CIS */ + uint16_t llcpCisHandle; /*!< CIS handle for the LLCP procedure. */ + lctrCheckTermFn_t checkCisTerm; /*!< Pointer to the check CIS termination function. */ + lctrCheckCisEstAclFn_t checkCisEstAcl;/*!< Pointer to the check if CIS is established function. */ } lctrConnCtx_t; /*! \brief Call signature of a cipher block handler. */ -typedef void (*lctrCipherBlkHdlr_t)(BbBleEnc_t *pEnc, uint8_t id, uint8_t dir); +typedef void (*lctrCipherBlkHdlr_t)(PalCryptoEnc_t *pEnc, uint8_t id, uint8_t dir); /*! \brief Call signature of a packet encryption handler. */ -typedef bool_t (*lctrPktEncHdlr_t)(BbBleEnc_t *pEnc, uint8_t *pHdr, uint8_t *pBuf, uint8_t *pMic); +typedef bool_t (*lctrPktEncHdlr_t)(PalCryptoEnc_t *pEnc, uint8_t *pHdr, uint8_t *pBuf, uint8_t *pMic); /*! \brief Call signature of a packet decryption handler. */ -typedef bool_t (*lctrPktDecHdlr_t)(BbBleEnc_t *pEnc, uint8_t *pBuf); +typedef bool_t (*lctrPktDecHdlr_t)(PalCryptoEnc_t *pEnc, uint8_t *pBuf); /*! \brief Call signature of a set packet count handler. */ -typedef void (*lctrPktCntHdlr_t)(BbBleEnc_t *pEnc, uint64_t pktCnt); +typedef void (*lctrPktCntHdlr_t)(PalCryptoEnc_t *pEnc, uint64_t pktCnt); /*! \brief Call signature of a LLCP state machine handler. */ typedef bool_t (*LctrLlcpHdlr_t)(lctrConnCtx_t *pCtx, uint8_t event); @@ -285,6 +345,9 @@ typedef void (*lctrCtrlPduHdlr_t)(lctrConnCtx_t *pCtx, uint8_t *pBuf); /*! \brief Call signature of a Channel state machine handler. */ typedef uint8_t (*LctrChSelHdlr_t)(lctrConnCtx_t *pCtx, uint16_t numSkip); +/*! \brief Call signature of an action handler. */ +typedef void (*lctrLlcpEh_t)(lctrConnCtx_t *pCtx); + /*! \brief LLCP state machine handlers. */ enum { @@ -292,6 +355,8 @@ enum LCTR_LLCP_SM_PING, /*!< Ping state machine. */ LCTR_LLCP_SM_CONN_UPD, /*!< Connection update state machine. */ LCTR_LLCP_SM_PHY_UPD, /*!< PHY update state machine. */ + LCTR_LLCP_SM_CIS_EST, /*!< CIS establishment state machine. */ + LCTR_LLCP_SM_CIS_TERM, /*!< CIS termination state machine. */ LCTR_LLCP_SM_CMN, /*!< Common LLCP state machine. */ LCTR_LLCP_SM_TOTAL /*!< Total number of LLCP state machine. */ }; @@ -311,6 +376,12 @@ extern lctrConnMsg_t *pLctrConnMsg; extern const LctrVsHandlers_t *pLctrVsHdlrs; extern lctrCtrlPduHdlr_t lctrCtrlPduHdlr; extern LctrChSelHdlr_t lctrChSelHdlr[LCTR_CH_SEL_MAX]; +extern lctrCheckCisEstCisFn_t lctrCheckCisEstCisFn; +extern lctrLlcpEh_t lctrSendPerSyncFromScanFn; +extern lctrLlcpEh_t lctrSendPerSyncFromBcstFn; +extern lctrLlcpEh_t lctrStorePeriodicSyncTrsfFn; +extern lctrLlcpEh_t lctrSendPeriodicSyncIndFn; +extern lctrLlcpEh_t lctrReceivePeriodicSyncIndFn; /************************************************************************************************** Function Declarations @@ -384,6 +455,23 @@ void lctrNotifyHostDataLengthInd(lctrConnCtx_t *pCtx, uint8_t status); void lctrSendSetMinUsedChanInd(lctrConnCtx_t *pCtx); void lctrStoreSetMinUsedChan(lctrConnCtx_t *pCtx); +/* Send periodic sync indication actions */ +void lctrActStorePeriodicSyncTrsf(lctrConnCtx_t *pCtx); +void lctrActSendPeriodicSyncInd(lctrConnCtx_t *pCtx); +void lctrActReceivePeriodicSyncInd(lctrConnCtx_t *pCtx); +void lctrStorePeriodicSyncTrsf(lctrConnCtx_t *pCtx); +void lctrSendPeriodicSyncInd(lctrConnCtx_t *pCtx); +void lctrReceivePeriodicSyncInd(lctrConnCtx_t *pCtx); +void lctrSendPerSyncFromScan(lctrConnCtx_t *pCtx); +void lctrSendPerSyncFromBcst(lctrConnCtx_t *pCtx); + +/* Request peer SCA actions */ +void lctrStoreScaAction(lctrConnCtx_t *pCtx); +void lctrSendPeerScaReq(lctrConnCtx_t *pCtx); +void lctrSendPeerScaRsp(lctrConnCtx_t *pCtx); +void lctrStorePeerSca(lctrConnCtx_t *pCtx); +void lctrNotifyHostPeerScaCnf(lctrConnCtx_t *pCtx); + /* Unknown/Unsupported */ void lctrSendUnknownRsp(lctrConnCtx_t *pCtx); void lctrSendRejectInd(lctrConnCtx_t *pCtx, uint8_t reason, bool_t forceRejectExtInd); @@ -394,7 +482,7 @@ uint16_t lctrTxInitMem(uint8_t *pFreeMem, uint32_t freeMemSize); uint8_t *lctrTxCtrlPduAlloc(uint8_t pduLen); void lctrTxDataPduQueue(lctrConnCtx_t *pCtx, uint16_t fragLen, lctrAclHdr_t *pAclHdr, uint8_t *pAclBuf); void lctrTxCtrlPduQueue(lctrConnCtx_t *pCtx, uint8_t *pBuf); -uint8_t lctrTxQueuePeek(lctrConnCtx_t *pCtx, BbBleDrvTxBufDesc_t *bbDescs, bool_t *pMd); +uint8_t lctrTxQueuePeek(lctrConnCtx_t *pCtx, PalBbBleTxBufDesc_t *bbDescs, bool_t *pMd); bool_t lctrTxQueuePop(lctrConnCtx_t *pCtx); void lctrTxQueuePopCleanup(lctrConnCtx_t *pCtx); uint8_t lctrTxQueueClear(lctrConnCtx_t *pCtx); @@ -441,26 +529,10 @@ void lctrSendConnMsg(lctrConnCtx_t *pCtx, uint8_t event); bool_t lctrExceededMaxDur(lctrConnCtx_t *pCtx, uint32_t ceStart, uint32_t pendDurUsec); uint32_t lctrCalcPingPeriodMs(lctrConnCtx_t *pCtx, uint32_t authTimeoutMs); uint8_t lctrComputeSca(void); +uint32_t lctrConnGetAnchorPoint(lctrConnCtx_t *pCtx, uint16_t ceCounter); /* Reservation */ -void lctrGetConnOffsets(uint32_t rsvnOffs[], uint32_t refTime); - -/*************************************************************************************************/ -/*! - * \brief Check for a queue depth of 1 element. - * - * \param pArqQ Queue. - * - * \return TRUE if ARQ only has 1 element, FALSE otherwise. - * - * \note Checks without resource protection. This routine is only intended to be used in task - * context. - */ -/*************************************************************************************************/ -static inline bool_t lctrIsQueueDepthOne(wsfQueue_t *pArqQ) -{ - return pArqQ->pHead == pArqQ->pTail; -} +uint32_t lctrGetConnRefTime(uint8_t connHandle, uint32_t *pDurUsec); /*************************************************************************************************/ /*! @@ -563,10 +635,10 @@ static inline void lctrIncPacketCounterTx(lctrConnCtx_t *pCtx) { if (lctrSetEncryptPktCountHdlr) { - BbBleEnc_t * const pEnc = &pCtx->bleData.chan.enc; + PalCryptoEnc_t * const pEnc = &pCtx->bleData.chan.enc; if ((pEnc->enaEncrypt) && - (pEnc->nonceMode == BB_NONCE_MODE_PKT_CNTR)) + (pEnc->nonceMode == PAL_BB_NONCE_MODE_PKT_CNTR)) { pCtx->txPktCounter++; } @@ -586,10 +658,10 @@ static inline void lctrIncPacketCounterRx(lctrConnCtx_t *pCtx) { if (lctrSetEncryptPktCountHdlr) { - BbBleEnc_t * const pEnc = &pCtx->bleData.chan.enc; + PalCryptoEnc_t * const pEnc = &pCtx->bleData.chan.enc; if ((pEnc->enaEncrypt) && - (pEnc->nonceMode == BB_NONCE_MODE_PKT_CNTR)) + (pEnc->nonceMode == PAL_BB_NONCE_MODE_PKT_CNTR)) { pCtx->rxPktCounter++; } @@ -609,7 +681,7 @@ static inline void lctrSetBbPacketCounterTx(lctrConnCtx_t *pCtx) { if (lctrSetEncryptPktCountHdlr) { - BbBleEnc_t * const pEnc = &pCtx->bleData.chan.enc; + PalCryptoEnc_t * const pEnc = &pCtx->bleData.chan.enc; if (!pEnc->enaEncrypt) { @@ -618,10 +690,10 @@ static inline void lctrSetBbPacketCounterTx(lctrConnCtx_t *pCtx) switch (pEnc->nonceMode) { - case BB_NONCE_MODE_PKT_CNTR: + case PAL_BB_NONCE_MODE_PKT_CNTR: lctrSetEncryptPktCountHdlr(pEnc, pCtx->txPktCounter); break; - case BB_NONCE_MODE_EVT_CNTR: + case PAL_BB_NONCE_MODE_EVT_CNTR: lctrSetEncryptPktCountHdlr(pEnc, pCtx->eventCounter); break; default: @@ -643,7 +715,7 @@ static inline void lctrSetBbPacketCounterRx(lctrConnCtx_t *pCtx) { if (lctrSetDecryptPktCountHdlr) { - BbBleEnc_t * const pEnc = &pCtx->bleData.chan.enc; + PalCryptoEnc_t * const pEnc = &pCtx->bleData.chan.enc; if (!pEnc->enaDecrypt) { @@ -652,10 +724,10 @@ static inline void lctrSetBbPacketCounterRx(lctrConnCtx_t *pCtx) switch (pEnc->nonceMode) { - case BB_NONCE_MODE_PKT_CNTR: + case PAL_BB_NONCE_MODE_PKT_CNTR: lctrSetDecryptPktCountHdlr(pEnc, pCtx->rxPktCounter); break; - case BB_NONCE_MODE_EVT_CNTR: + case PAL_BB_NONCE_MODE_EVT_CNTR: lctrSetDecryptPktCountHdlr(pEnc, pCtx->eventCounter); break; default: @@ -848,6 +920,12 @@ static inline uint8_t lctrGetProcId(uint8_t event) case LCTR_CONN_MSG_API_DATA_LEN_CHANGE: return LCTR_PROC_CMN_DATA_LEN_UPD; + case LCTR_CONN_MSG_API_PER_ADV_SYNC_TRSF: + return LCTR_PROC_CMN_PER_ADV_SYNC_TRSF; + + case LCTR_CONN_MSG_API_REQ_PEER_SCA: + return LCTR_PROC_CMN_REQ_PEER_SCA; + case LCTR_CONN_MSG_API_CONN_UPDATE: return LCTR_PROC_CONN_UPD; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_conn_master.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_conn_master.h index 7c63574441..9351604021 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_conn_master.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_conn_master.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal link layer controller master connection interface file. + * \file + * \brief Internal link layer controller master connection interface file. */ /*************************************************************************************************/ @@ -74,7 +75,7 @@ void lctrMstSetEstablishConn(lctrConnCtx_t *pCtx); void lctrMstReloadDataPdu(lctrConnCtx_t *pCtx); /* Helper */ -uint32_t lctrMstConnAdjustOpStart(lctrConnCtx_t *pCtx, uint32_t scanRefTime, lctrConnInd_t *pConnInd); +uint32_t lctrMstConnAdjustOpStart(lctrConnCtx_t *pCtx, uint32_t scanRefTime, uint32_t scanMinDurUsec, lctrConnInd_t *pConnInd); #ifdef __cplusplus }; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_conn_slave.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_conn_slave.h index 90a19f9a4d..b130cc7d04 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_conn_slave.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_conn_slave.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal link layer controller slave connection interface file. + * \file + * \brief Internal link layer controller slave connection interface file. */ /*************************************************************************************************/ @@ -58,7 +59,6 @@ bool_t lctrSlvCheckEncOverrideCommonParam(lctrConnCtx_t *pCtx); bool_t lctrSlvCheckConnUpdInstant(lctrConnCtx_t *pCtx); /* Builder */ -uint32_t lctrCalcIntervalWindowWideningUsec(lctrConnCtx_t *pCtx, uint32_t unsyncTimeUsec); void lctrSlvConnBuildOp(lctrConnCtx_t *pCtx); /* ISR */ @@ -67,6 +67,7 @@ void lctrSlvConnCleanupOp(BbOpDesc_t *pOp); void lctrSlvConnEndOp(BbOpDesc_t *pOp); void lctrSlvConnTxCompletion(BbOpDesc_t *pOp, uint8_t status); void lctrSlvConnRxCompletion(BbOpDesc_t *pOp, uint8_t *pRxBuf, uint8_t status); +void lctrSlvConnAbortOp(BbOpDesc_t *pOp); #ifdef __cplusplus }; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_enc_master.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_enc_master.h index f605dd0220..b79b9e5c4e 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_enc_master.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_enc_master.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal link layer controller master connection interface file. + * \file + * \brief Internal link layer controller master connection interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_enc_slave.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_enc_slave.h index 901acd45eb..95f66d273f 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_enc_slave.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_enc_slave.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal link layer controller slave connection interface file. + * \file + * \brief Internal link layer controller slave connection interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_init_master.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_init_master.h index 9382d3fa10..c2756bbdee 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_init_master.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_init_master.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal link layer controller scanning master interface file. + * \file + * \brief Internal link layer controller scanning master interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_init_master_ae.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_init_master_ae.h index 3f2a5a370f..dc429b89be 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_init_master_ae.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_init_master_ae.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal link layer controller scanning master interface file. + * \file + * \brief Internal link layer controller scanning master interface file. */ /*************************************************************************************************/ @@ -66,7 +67,6 @@ typedef struct /* State. */ uint8_t enaPhys; /*!< Enabled PHYs. */ - bool_t initTermByHost; /*!< Host initiated initiate disable. */ } lctrExtInitCtrlBlk_t; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_master_phy.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_master_phy.h index 13e906948c..7436d860cb 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_master_phy.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_master_phy.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal link layer controller PHY features (master) interface file. + * \file + * \brief Internal link layer controller PHY features (master) interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_priv.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_priv.h index 0d77382bd6..488a72fde1 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_priv.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_priv.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal link layer controller privacy interface file. + * \file + * \brief Internal link layer controller privacy interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_slave_phy.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_slave_phy.h index af7b0c524f..12762e9fe6 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_slave_phy.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_slave_phy.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal link layer controller PHY features (slave) interface file. + * \file + * \brief Internal link layer controller PHY features (slave) interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_tester.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_tester.h deleted file mode 100644 index bd37c1409e..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_int_tester.h +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright (c) 2009-2019 Arm Limited - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************************************/ -/*! - * \brief Internal link layer controller connection interface file. - */ -/*************************************************************************************************/ - -#ifndef LCTR_INT_TESTER_H -#define LCTR_INT_TESTER_H - -#include "ll_tester_api.h" -#include "wsf_msg.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/************************************************************************************************** - Function Declarations -**************************************************************************************************/ - -void LctrForceTxAcl(uint8_t *pAclBuf); - -/*************************************************************************************************/ -/*! - * \brief Force transmission of a data PDU. - * - * \param connHandle Connection handle. - * - * \return None. - */ -/*************************************************************************************************/ -static inline void lctrForceTxData(uint16_t connHandle) -{ - uint8_t *pAclBuf; - - if ((pAclBuf = WsfMsgAlloc(4 + 4 + 1)) != NULL) - { - pAclBuf[0] = connHandle & 0xFF; - pAclBuf[1] = connHandle >> 8; - pAclBuf[2] = 0x05; - pAclBuf[3] = 0x00; - pAclBuf[4] = 0x01; - pAclBuf[5] = 0x00; - pAclBuf[6] = 0x40; - pAclBuf[7] = 0x00; - pAclBuf[8] = 0xFF; - LctrForceTxAcl(pAclBuf); - } -} - -#ifdef __cplusplus -}; -#endif - -#endif /* LCTR_INT_TESTER_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_master.c index 911b47cdaa..21f48e7dfe 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master advertising event ISR callbacks. + * \file + * \brief Link layer controller master advertising event ISR callbacks. */ /*************************************************************************************************/ @@ -34,6 +35,9 @@ #include "bb_ble_api_reslist.h" #include "util/bstream.h" #include +#if (LL_ENABLE_TESTER == TRUE) +extern bool_t bbTxAccAddrShiftMask; +#endif /*************************************************************************************************/ /*! @@ -100,7 +104,8 @@ void lctrMstDiscoverEndOp(BbOpDesc_t *pOp) /* Reset due time to start of scan window. */ pOp->due = pCtx->scanWinStart; - if ((pScan->elapsedUsec + pOp->minDurUsec) < LCTR_BLE_TO_US(pCtx->scanParam.scanWindow)) + if ((pCtx->scanParam.scanInterval != pCtx->scanParam.scanWindow) && + ((pScan->elapsedUsec + pOp->minDurUsec) < LCTR_BLE_TO_US(pCtx->scanParam.scanWindow))) { const uint32_t min = BB_US_TO_BB_TICKS(pScan->elapsedUsec); const uint32_t max = BB_BLE_TO_BB_TICKS(pCtx->scanParam.scanWindow); @@ -217,7 +222,11 @@ bool_t lctrMstDiscoverAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf) lctrPackAdvbPduHdr(lctrMstScan.reqBuf, &lctrMstScan.reqPduHdr); /* Scan backoff. */ - if (lctrGetOpFlag(LL_OP_MODE_FLAG_ENA_SCAN_BACKOFF)) + if (lmgrGetOpFlag(LL_OP_MODE_FLAG_ENA_SCAN_BACKOFF) +#if (LL_ENABLE_TESTER == TRUE) + && !bbTxAccAddrShiftMask +#endif + ) { if (lctrMstScan.backoffCount) { diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_master_ae.c index a0a142a8cd..2869ae5904 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master advertising event ISR callbacks. + * \file + * \brief Link layer controller master advertising event ISR callbacks. */ /*************************************************************************************************/ @@ -141,6 +142,55 @@ static inline void lctrGetLocalIdAddr(lctrExtScanCtx_t *pExtScanCtx, uint64_t ta } } +/*************************************************************************************************/ +/*! + * \brief Master Acad handler. + * + * \param pPerScanCtx Periodic scan context. + * + * \return None + */ +/*************************************************************************************************/ +void lctrMstAcadHandler(lctrPerScanCtx_t * const pPerScanCtx) +{ + if (pPerScanCtx->extAdvHdr.acadLen == 0) + { + return; + } + + /* Enable any new Acad if necessary */ + uint8_t len = pPerScanCtx->extAdvHdr.acadLen; + uint8_t *pBuf = (uint8_t *) pPerScanCtx->extAdvHdr.pAcad; + while(len > 0) + { + uint8_t acadLen = 0; + BSTREAM_TO_UINT8(acadLen, pBuf); + + uint8_t opcode = 0; + BSTREAM_TO_UINT8(opcode, pBuf); + + switch (opcode) { + case LL_ACAD_OPCODE_CHANNEL_MAP_UPDATE: + { + lctrAcadParam_t *pAcadParam = &pPerScanCtx->acadParams[LCTR_ACAD_ID_CHAN_MAP_UPDATE]; + + if (pAcadParam->hdr.state == LCTR_ACAD_STATE_DISABLED) + { + pAcadParam->hdr.state = LCTR_ACAD_STATE_ENABLED; + + BSTREAM_TO_UINT40(pAcadParam->chanMapUpdate.chanMask, pBuf); + BSTREAM_TO_UINT16(pAcadParam->chanMapUpdate.instant, pBuf); + } + break; + } + + default: + break; + } + len -= (acadLen + 1); /* Minus the Acad plus the acadLen field. */ + } +} + /************************************************************************************************** Functions: Extended advertising reports **************************************************************************************************/ @@ -150,22 +200,22 @@ static inline void lctrGetLocalIdAddr(lctrExtScanCtx_t *pExtScanCtx, uint64_t ta * \brief Pend extended advertising report notification. * * \param pExtScanCtx Extended scan context. + * \param pRpt Report data. + * \param pState Report state. * * \return TRUE if report pended, FALSE otherwise. */ /*************************************************************************************************/ -static bool_t lctrExtAdvRptPend(lctrExtScanCtx_t *pExtScanCtx) +static bool_t lctrExtAdvRptPend(lctrExtScanCtx_t *pExtScanCtx, LlExtAdvReportInd_t *pRpt, lctrRptState_t *pState) { /* Only called with the first report in the sequence. */ - WSF_ASSERT(pExtScanCtx->data.scan.advRptState == LCTR_RPT_STATE_IDLE); + WSF_ASSERT(*pState == LCTR_RPT_STATE_IDLE); if (pExtScanCtx->state != LCTR_EXT_SCAN_STATE_DISCOVER) { return FALSE; } - LlExtAdvReportInd_t * const pRpt = &pExtScanCtx->data.scan.advRpt; - /* Check for duplicate report. */ uint64_t hash; lctrAdvRptGenerateExtHash(&hash, pRpt->addrType, BstreamToBda64(pRpt->addr), @@ -176,7 +226,7 @@ static bool_t lctrExtAdvRptPend(lctrExtScanCtx_t *pExtScanCtx) return FALSE; } - pExtScanCtx->data.scan.advRptState = LCTR_RPT_STATE_IN_PROGRESS; + *pState = LCTR_RPT_STATE_IN_PROGRESS; /* Event handling offloaded to task context, cf. lctrMstExtDiscoverEndOp(), lctrMstAuxDiscoverEndOp(). */ return TRUE; @@ -187,16 +237,16 @@ static bool_t lctrExtAdvRptPend(lctrExtScanCtx_t *pExtScanCtx) * \brief Pend extended advertising report notification. * * \param pExtScanCtx Extended scan context. + * \param pRpt Report data. + * \param pState Report state. * * \return TRUE if report pended, FALSE otherwise. */ /*************************************************************************************************/ -static void lctrExtAdvRptSubmit(lctrExtScanCtx_t *pExtScanCtx) +static void lctrExtAdvRptSubmit(lctrExtScanCtx_t *pExtScanCtx, LlExtAdvReportInd_t *pRpt, lctrRptState_t *pState) { - if (pExtScanCtx->data.scan.advRptState == LCTR_RPT_STATE_IN_PROGRESS) + if (*pState == LCTR_RPT_STATE_IN_PROGRESS) { - LlExtAdvReportInd_t * const pRpt = &pExtScanCtx->data.scan.advRpt; - if (((pRpt->eventType >> 5) & LL_RPT_DATA_INC_TRUNC) == 0) { /* Only save the hash to the table when complete data is received. */ @@ -206,7 +256,7 @@ static void lctrExtAdvRptSubmit(lctrExtScanCtx_t *pExtScanCtx) lctrAdvRptAddEntry(&lctrMstExtScan.advFilt, hash); } - pExtScanCtx->data.scan.advRptState = LCTR_RPT_STATE_COMP; + *pState = LCTR_RPT_STATE_COMP; WsfSetEvent(lmgrPersistCb.handlerId, (1 << LCTR_EVENT_RX_ADVB)); } } @@ -623,7 +673,7 @@ static void lctrScanBackoffRspFailed(lctrExtScanCtx_t *pExtScanCtx) /*************************************************************************************************/ static bool_t lctrScanBackoffCheckReqAllowed(lctrExtScanCtx_t *pExtScanCtx) { - if (!lctrGetOpFlag(LL_OP_MODE_FLAG_ENA_SCAN_BACKOFF)) + if (!lmgrGetOpFlag(LL_OP_MODE_FLAG_ENA_SCAN_BACKOFF)) { /* Backoff is disabled, always send request. */ return TRUE; @@ -783,16 +833,32 @@ void lctrMstDiscoverRxExtAdvPktPostProcessHandler(BbOpDesc_t *pOp, const uint8_t /* else case, delay connectable and scannable PDU filtering in the AUX_ADV_IND. */ /*** Periodic advertising event filtering. ***/ - bool_t advAMatch = FALSE; lctrMstPerScanIsr.filtResult = TRUE; if ((lctrPerCreateSync.state == LCTR_CREATE_SYNC_STATE_DISCOVER) && (extAdvHdrFlags & LL_EXT_HDR_ADI_BIT) && (extAdvHdrFlags & LL_EXT_HDR_ADV_ADDR_BIT)) { + bool_t advAMatch = FALSE; + bbBlePduExtFiltParams_t params; + uint64_t peerIdAddr = 0; + uint8_t peerIdAddrType = 0; + + params.pduType = advHdr.pduType; + params.extHdrFlags = pExtScanCtx->extAdvHdr.extHdrFlags; + params.peerAddr = pExtScanCtx->extAdvHdr.advAddr; + params.peerAddrRand = advHdr.txAddrRnd; + params.localAddr = pExtScanCtx->extAdvHdr.tgtAddr; + params.localAddrRand = advHdr.rxAddrRnd; + + /* This function is only used here for address conversion, not for filtering. */ + (void)BbBleExtPduFiltCheck(¶ms, &pOp->prot.pBle->pduFilt, FALSE, &pScan->filtResults); + + BbBlePduFiltResultsGetPeerIdAddr(&pScan->filtResults, &peerIdAddr, &peerIdAddrType); + if (lctrPerCreateSync.filtParam.filterPolicy == LL_PER_SCAN_FILTER_PL_BIT) { - if ((BbBlePeriodicListCheckAddr(advHdr.txAddrRnd, pExtScanCtx->extAdvHdr.advAddr, + if ((BbBlePeriodicListCheckAddr((peerIdAddrType & LL_ADDR_RANDOM_BIT), peerIdAddr, pExtScanCtx->extAdvHdr.sid)) == FALSE) { /* Not in the periodic list. */ @@ -807,8 +873,8 @@ void lctrMstDiscoverRxExtAdvPktPostProcessHandler(BbOpDesc_t *pOp, const uint8_t else { if ((lctrPerCreateSync.filtParam.advSID != pExtScanCtx->extAdvHdr.sid) || - (lctrPerCreateSync.filtParam.advAddrType != advHdr.txAddrRnd) || - (lctrPerCreateSync.filtParam.advAddr != pExtScanCtx->extAdvHdr.advAddr)) + (lctrPerCreateSync.filtParam.advAddrType != (peerIdAddrType & LL_ADDR_RANDOM_BIT)) || + (lctrPerCreateSync.filtParam.advAddr != peerIdAddr)) { /* Address type, address or SID does not match. */ break; @@ -819,14 +885,18 @@ void lctrMstDiscoverRxExtAdvPktPostProcessHandler(BbOpDesc_t *pOp, const uint8_t advAMatch = TRUE; } } - } - if (advAMatch == TRUE) - { - /* AdvA is received in the adv_ext_ind and pass the filtering, save info in the context. */ - lctrPerCreateSync.pPerScanCtx->advAddr = pExtScanCtx->extAdvHdr.advAddr; - lctrPerCreateSync.pPerScanCtx->advAddrType = advHdr.txAddrRnd; - lctrPerCreateSync.pPerScanCtx->advSID = pExtScanCtx->extAdvHdr.sid; + if (advAMatch == TRUE) + { + /* AdvA is received in the adv_ext_ind and pass the filtering, save info in the context. */ + lctrPerCreateSync.pPerScanCtx->advAddr = peerIdAddr; + lctrPerCreateSync.pPerScanCtx->advAddrType = peerIdAddrType; + lctrPerCreateSync.pPerScanCtx->advSID = pExtScanCtx->extAdvHdr.sid; + + /* Address to be used for sync transfer. */ + lctrPerCreateSync.pPerScanCtx->trsfAdvAddr = pExtScanCtx->extAdvHdr.advAddr; + lctrPerCreateSync.pPerScanCtx->trsfAddrType = advHdr.txAddrRnd; + } } if (extAdvHdrFlags & LL_EXT_HDR_AUX_PTR_BIT) @@ -838,6 +908,15 @@ void lctrMstDiscoverRxExtAdvPktPostProcessHandler(BbOpDesc_t *pOp, const uint8_t BB_US_TO_BB_TICKS(SchBleCalcAdvPktDurationUsec(pBle->chan.rxPhy, pScan->advRxPhyOptions, LL_ADV_HDR_LEN + pScan->filtResults.pduLen)); lctrMstAuxDiscoverOpCommit(pExtScanCtx, &pExtScanCtx->priChAuxPtr, pScan->advStartTs, endTs); + if ((pExtScanCtx->auxOpPending == FALSE) && + (lctrPerCreateSync.state == LCTR_CREATE_SYNC_STATE_DISCOVER) && + (lctrMstPerScanIsr.filtResult == FALSE)) + { + /* Reset the flag if cannot schedule the auxiliary operation. */ + LL_TRACE_WARN0("Reset filter flag due to auxiliary operation scheduling conflict."); + lctrMstPerScanIsr.filtResult = TRUE; + } + if (pExtScanCtx->auxOpPending) { /* Extended advertising event continues with auxiliary BOD */ @@ -856,13 +935,12 @@ void lctrMstDiscoverRxExtAdvPktPostProcessHandler(BbOpDesc_t *pOp, const uint8_t LlExtAdvReportInd_t * const pRpt = &pExtScanCtx->data.scan.advRpt; if (lctrExtAdvRptPack(pExtScanCtx, 0, &advHdr, - peerIdAddr, peerIdAddrType, pScan->advRssi, pAdvBuf, - pRpt)) + peerIdAddr, peerIdAddrType, pScan->advRssi, pAdvBuf, pRpt)) { pRpt->secPhy = LL_PHY_NONE; - if (lctrExtAdvRptPend(pExtScanCtx)) + if (lctrExtAdvRptPend(pExtScanCtx, pRpt, &pExtScanCtx->data.scan.advRptState)) { - lctrExtAdvRptSubmit(pExtScanCtx); + lctrExtAdvRptSubmit(pExtScanCtx, pRpt, &pExtScanCtx->data.scan.advRptState); } } } @@ -879,13 +957,12 @@ void lctrMstDiscoverRxExtAdvPktPostProcessHandler(BbOpDesc_t *pOp, const uint8_t LlExtAdvReportInd_t * const pRpt = &pExtScanCtx->data.scan.advRpt; if (lctrExtAdvRptPack(pExtScanCtx, 0, &advHdr, - peerIdAddr,peerIdAddrType, pScan->advRssi, pAdvBuf, - pRpt)) + peerIdAddr,peerIdAddrType, pScan->advRssi, pAdvBuf, pRpt)) { pRpt->secPhy = LL_PHY_NONE; - if (lctrExtAdvRptPend(pExtScanCtx)) + if (lctrExtAdvRptPend(pExtScanCtx, pRpt, &pExtScanCtx->data.scan.advRptState)) { - lctrExtAdvRptSubmit(pExtScanCtx); + lctrExtAdvRptSubmit(pExtScanCtx, pRpt, &pExtScanCtx->data.scan.advRptState); } } break; @@ -980,11 +1057,27 @@ bool_t lctrMstDiscoverRxAuxAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf { LL_TRACE_INFO1("Ignoring LL_PDU_AUX_ADV_IND due to PDU filtering, SID=%u", pExtScanCtx->extAdvHdr.sid); lctrMstExtScanIsr.filtResult = TRUE; - return FALSE; + /* Continue processing for sync establishment filter even when scan filtering failed. */ } /*** Periodic advertising event filtering. ***/ bool_t advAMatch = FALSE; + uint64_t peerIdAddr = 0; + uint8_t peerIdAddrType = 0; + + BbBlePduFiltResultsGetPeerIdAddr(&pAuxScan->filtResults, &peerIdAddr, &peerIdAddrType); + + if ((lctrPerCreateSync.state == LCTR_CREATE_SYNC_STATE_DISCOVER) && + (lctrMstPerScanIsr.filtResult == FALSE)) + { + if ((lctrPerCreateSync.filtParam.advSID != pExtScanCtx->extAdvHdr.sid) || + (lctrPerCreateSync.filtParam.advAddrType != (peerIdAddrType & LL_ADDR_RANDOM_BIT)) || + (lctrPerCreateSync.filtParam.advAddr != peerIdAddr)) + { + /* Address type, address or SID does not match. */ + lctrMstPerScanIsr.filtResult = TRUE; + } + } if ((lctrPerCreateSync.state == LCTR_CREATE_SYNC_STATE_DISCOVER) && (lctrMstPerScanIsr.filtResult == TRUE) && @@ -993,7 +1086,7 @@ bool_t lctrMstDiscoverRxAuxAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf { if (lctrPerCreateSync.filtParam.filterPolicy == LL_PER_SCAN_FILTER_PL_BIT) { - if ((BbBlePeriodicListCheckAddr(lctrMstExtScanIsr.advHdr.txAddrRnd, pExtScanCtx->extAdvHdr.advAddr, + if ((BbBlePeriodicListCheckAddr((peerIdAddrType & LL_ADDR_RANDOM_BIT), peerIdAddr, pExtScanCtx->extAdvHdr.sid)) == FALSE) { /* Not in the periodic list. */ @@ -1008,8 +1101,8 @@ bool_t lctrMstDiscoverRxAuxAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf else { if ((lctrPerCreateSync.filtParam.advSID != pExtScanCtx->extAdvHdr.sid) || - (lctrPerCreateSync.filtParam.advAddrType != lctrMstExtScanIsr.advHdr.txAddrRnd) || - (lctrPerCreateSync.filtParam.advAddr != pExtScanCtx->extAdvHdr.advAddr)) + (lctrPerCreateSync.filtParam.advAddrType != (peerIdAddrType & LL_ADDR_RANDOM_BIT)) || + (lctrPerCreateSync.filtParam.advAddr != peerIdAddr)) { /* Address type, address or SID does not match. */ break; @@ -1035,6 +1128,7 @@ bool_t lctrMstDiscoverRxAuxAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf lctrPerScanCtx_t *pPerScanCtx = lctrPerCreateSync.pPerScanCtx; /*** Save peer periodic advertising parameters. ***/ pPerScanCtx->eventCounter = pExtScanCtx->secSyncInfo.eventCounter; + pPerScanCtx->initEventCounter = pExtScanCtx->secSyncInfo.eventCounter; pPerScanCtx->perInter = BB_US_TO_BB_TICKS(LCTR_PER_INTER_TO_US(pExtScanCtx->secSyncInfo.syncInter)); pPerScanCtx->sca = pExtScanCtx->secSyncInfo.sca; pPerScanCtx->rxPhys = lctrConvertAuxPtrPhyToBbPhy(pExtScanCtx->priChAuxPtr.auxPhy); @@ -1043,13 +1137,17 @@ bool_t lctrMstDiscoverRxAuxAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf if (advAMatch == TRUE) { /* AdvA is received in the aux_adv_ind and pass the filtering, save info in the context. */ - pPerScanCtx->advAddr = pExtScanCtx->extAdvHdr.advAddr; - pPerScanCtx->advAddrType = lctrMstExtScanIsr.advHdr.txAddrRnd; + pPerScanCtx->advAddr = peerIdAddr; + pPerScanCtx->advAddrType = peerIdAddrType; pPerScanCtx->advSID = pExtScanCtx->extAdvHdr.sid; + + /* Address to be used for sync transfer. */ + pPerScanCtx->trsfAdvAddr = pExtScanCtx->extAdvHdr.advAddr; + pPerScanCtx->trsfAddrType = lctrMstExtScanIsr.advHdr.txAddrRnd; } uint32_t endTs = pAuxScan->auxStartTs + - BB_US_TO_BB_TICKS(SchBleCalcAdvPktDurationUsec(pBle->chan.rxPhy, pAuxScan->auxRxPhyOptions, LL_ADV_HDR_LEN + pAuxScan->txAuxReqLen)); + BB_US_TO_BB_TICKS(SchBleCalcAdvPktDurationUsec(pBle->chan.rxPhy, pAuxScan->auxRxPhyOptions, pAuxScan->txAuxReqLen)); lctrMstPerScanOpCommit(pExtScanCtx, &pExtScanCtx->priChAuxPtr, &pExtScanCtx->secSyncInfo, pAuxScan->auxStartTs, endTs); lctrMstPerScanIsr.syncWithSlave = FALSE; } @@ -1059,7 +1157,12 @@ bool_t lctrMstDiscoverRxAuxAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf default: LL_TRACE_WARN1("Received advertising PDU with invalid PDU type=%u", lctrMstExtScanIsr.advHdr.pduType); lctrMstExtScanIsr.filtResult = TRUE; - return FALSE; + } + + if (lctrMstExtScanIsr.filtResult == TRUE) + { + /* No more processing needed. */ + return FALSE; } /*** ACAD processing. ***/ @@ -1096,22 +1199,39 @@ bool_t lctrMstDiscoverRxAuxAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf Bda64ToBstream(pScanReqAdvA, pAuxScan->filtResults.peerAddr); pExtScanCtx->reqPduHdr.rxAddrRnd = pAuxScan->filtResults.peerAddrRand; - /* Save adv address here and compare it with the one from aux_scan_rsp later. */ + /* Save adv address here and compare it with the one from AUX_SCAN_RSP later. */ pExtScanCtx->data.scan.scanReqAdvAddr = pAuxScan->filtResults.peerAddr; - /* TODO need to check if targetA is present, check whether we need to generate a new RPA. */ - /* Update scan request header with scanner's address. */ if (pExtScanCtx->scanParam.ownAddrType & LL_ADDR_IDENTITY_BIT) { - bool_t localAddrRand = BB_BLE_PDU_FILT_FLAG_IS_SET(&pBle->pduFilt, LOCAL_ADDR_MATCH_RAND); - uint64_t localAddr = pBle->pduFilt.localAddrMatch; - if (BbBleResListReadLocal(pAuxScan->filtResults.peerIdAddrRand, pAuxScan->filtResults.peerIdAddr, &localAddr)) + bool_t localAddrRand; + uint64_t localAddr; + + if (pExtScanCtx->extAdvHdr.extHdrFlags & LL_EXT_HDR_TGT_ADDR_BIT) { - localAddrRand = TRUE; + /* If peer is using directed advertising then use tgtA from the */ + /* AUX_ADV_IND as our scanA in the auxiliary scan request. */ + localAddrRand = lctrMstExtScanIsr.advHdr.rxAddrRnd; + localAddr = pExtScanCtx->extAdvHdr.tgtAddr; + /* Update the local RPA if the received one is RPA. */ + if (BDA64_ADDR_IS_RPA(localAddr)) + { + BbBleResListUpdateLocal(pAuxScan->filtResults.peerIdAddrRand, pAuxScan->filtResults.peerIdAddr, &localAddr); + } } - uint8_t *pScanReqScanA = pExtScanCtx->reqBuf + LL_ADV_HDR_LEN; - Bda64ToBstream(pScanReqScanA, localAddr); + else + { + /* Otherwise, use local address, could be public, static random or RPA. */ + localAddrRand = BB_BLE_PDU_FILT_FLAG_IS_SET(&pBle->pduFilt, LOCAL_ADDR_MATCH_RAND); + localAddr = pBle->pduFilt.localAddrMatch; + if (BbBleResListReadLocal(pAuxScan->filtResults.peerIdAddrRand, pAuxScan->filtResults.peerIdAddr, &localAddr)) + { + localAddrRand = TRUE; + } + } + uint8_t *pAuxScanReqScanA = pExtScanCtx->reqBuf + LL_ADV_HDR_LEN; + Bda64ToBstream(pAuxScanReqScanA, localAddr); pExtScanCtx->reqPduHdr.txAddrRnd = localAddrRand; } @@ -1126,6 +1246,13 @@ bool_t lctrMstDiscoverRxAuxAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf lctrMstExtScanIsr.chainAdvMode = pExtScanCtx->extAdvHdr.advMode; lctrMstExtScanIsr.chainExtraEventType = 0; + /*** Advertising report processing. ***/ + + /* Store relevant AUX_ADV_IND report data; submitted in the lctrMstDiscoverRxAuxChainPostProcessHandler(). */ + pExtScanCtx->data.scan.auxAdvRpt.eventType = (pExtScanCtx->extAdvHdr.extHdrFlags & LL_EXT_HDR_TGT_ADDR_BIT) ? + LL_RPT_EVT_DIRECT_ADV_BIT : 0; + pExtScanCtx->data.scan.auxAdvRpt.rssi = pAuxScan->auxAdvRssi; + return txScanReq; } @@ -1187,7 +1314,7 @@ bool_t lctrMstDiscoverRxAuxScanRspHandler(BbOpDesc_t *pOp, const uint8_t *pRspBu /* scanReqAdvAddr is assigned when LL_PDU_ADV_SCAN_IND is received. */ if (pExtScanCtx->data.scan.scanReqAdvAddr != pAuxScan->filtResults.peerAddr) { - LL_TRACE_WARN0("Ignore aux_scan_rsp since advAddr doesn't match the one sent in the aux_scan_req."); + LL_TRACE_WARN0("Ignore AUX_SCAN_RSP since advAddr doesn't match the one sent in the AUX_SCAN_REQ."); lctrMstExtScanIsr.filtResult = TRUE; return FALSE; } @@ -1228,7 +1355,7 @@ uint32_t lctrMstDiscoverRxAuxChainHandler(BbOpDesc_t *pOp, const uint8_t *pChain if (pChainBuf == NULL) { - /* The report will be submitted in the lctrMstDiscoverRxAuxChainPostProcessHandler */ + /* The report will be submitted in the lctrMstDiscoverRxAuxChainPostProcessHandler(). */ return 0; } @@ -1314,7 +1441,7 @@ bool_t lctrMstDiscoverRxAuxChainPostProcessHandler(BbOpDesc_t *pOp, const uint8_ { WSF_ASSERT(pExtScanCtx->data.scan.advRptState == LCTR_RPT_STATE_IN_PROGRESS); pExtScanCtx->data.scan.advRpt.eventType |= LL_RPT_DATA_INC_TRUNC << LCTR_DATA_STATUS_SHIFT; - lctrExtAdvRptSubmit(pExtScanCtx); + lctrExtAdvRptSubmit(pExtScanCtx, &pExtScanCtx->data.scan.advRpt, &pExtScanCtx->data.scan.advRptState); return FALSE; } @@ -1339,10 +1466,35 @@ bool_t lctrMstDiscoverRxAuxChainPostProcessHandler(BbOpDesc_t *pOp, const uint8_ BbBlePduFiltResultsGetPeerIdAddr(&pAuxScan->filtResults, &peerIdAddr, &peerIdAddrType); - LlExtAdvReportInd_t * const pRpt = &pExtScanCtx->data.scan.advRpt; + if (pExtScanCtx->extAdvHdr.advMode & LCTR_ADV_MODE_SCAN_BIT) + { + /* Complete the AUX_ADV_IND report for Auxiliary Advertising Event. */ + + LlExtAdvReportInd_t * const pAuxAdvRpt = &pExtScanCtx->data.scan.auxAdvRpt; + if (!lctrExtAdvRptPack(pExtScanCtx, pExtScanCtx->data.scan.auxAdvRpt.eventType, &lctrMstExtScanIsr.advHdr, + peerIdAddr, peerIdAddrType , pAuxAdvRpt->rssi, NULL, pAuxAdvRpt)) + { + LL_TRACE_WARN1("Invalid report parameters; do not receive CHAIN_IND, SID=%u", pExtScanCtx->extAdvHdr.sid); + pExtScanCtx->data.scan.auxAdvRptState = LCTR_RPT_STATE_IDLE; + result = FALSE; + break; + } + + /* Update report properties for AUX_ADV_IND report. */ + pAuxAdvRpt->eventType &= ~LL_RPT_EVT_SCAN_RSP_BIT; + pAuxAdvRpt->len = 0; + pAuxAdvRpt->pData = NULL; + + /* Auxiliary Advertising report is ready; check filter and submit now. */ + if (lctrExtAdvRptPend(pExtScanCtx, pAuxAdvRpt, &pExtScanCtx->data.scan.auxAdvRptState)) + { + lctrExtAdvRptSubmit(pExtScanCtx, pAuxAdvRpt, &pExtScanCtx->data.scan.auxAdvRptState); + } + } + + LlExtAdvReportInd_t * const pAdvRpt = &pExtScanCtx->data.scan.advRpt; if (!lctrExtAdvRptPack(pExtScanCtx, lctrMstExtScanIsr.chainExtraEventType, &lctrMstExtScanIsr.advHdr, - peerIdAddr, peerIdAddrType , pAuxScan->auxAdvRssi, NULL, - pRpt)) + peerIdAddr, peerIdAddrType, pAuxScan->auxAdvRssi, NULL, pAdvRpt)) { /* Do not start receiving chain. */ LL_TRACE_WARN1("Invalid report parameters; do not receive CHAIN_IND, SID=%u", pExtScanCtx->extAdvHdr.sid); @@ -1350,10 +1502,9 @@ bool_t lctrMstDiscoverRxAuxChainPostProcessHandler(BbOpDesc_t *pOp, const uint8_ break; } - if (!lctrExtAdvRptPend(pExtScanCtx)) + if (!lctrExtAdvRptPend(pExtScanCtx, pAdvRpt, &pExtScanCtx->data.scan.advRptState)) { /* Do not start receiving chain. */ - LL_TRACE_WARN1("Filter report; do not receive CHAIN_IND, SID=%u", pExtScanCtx->extAdvHdr.sid); result = FALSE; break; } @@ -1370,11 +1521,11 @@ bool_t lctrMstDiscoverRxAuxChainPostProcessHandler(BbOpDesc_t *pOp, const uint8_ } while (FALSE); - if ((result == FALSE) || /* Invalid packet, duplicate found or insufficient buffer. */ + if ((result == FALSE) || /* Invalid packet, duplicate found or insufficient buffer. */ ((lctrMstExtScanIsr.extAdvHdrFlags & LL_EXT_HDR_AUX_PTR_BIT) == 0)) /* No more auxiliary packet. */ { /* End of auxiliary sequence. */ - lctrExtAdvRptSubmit(pExtScanCtx); + lctrExtAdvRptSubmit(pExtScanCtx, &pExtScanCtx->data.scan.advRpt, &pExtScanCtx->data.scan.advRptState); } return result; @@ -1514,13 +1665,12 @@ bool_t lctrMstDiscoverRxLegacyScanRspHandler(BbOpDesc_t *pOp, const uint8_t *pRs LlExtAdvReportInd_t * const pRpt = &pExtScanCtx->data.scan.advRpt; if (lctrExtAdvRptPack(pExtScanCtx, 0, &advHdr, - peerIdAddr, peerIdAddrType, pScan->advRssi, pRspBuf, - pRpt)) + peerIdAddr, peerIdAddrType, pScan->advRssi, pRspBuf, pRpt)) { pRpt->secPhy = LL_PHY_NONE; - if (lctrExtAdvRptPend(pExtScanCtx)) + if (lctrExtAdvRptPend(pExtScanCtx, pRpt, &pExtScanCtx->data.scan.advRptState)) { - lctrExtAdvRptSubmit(pExtScanCtx); + lctrExtAdvRptSubmit(pExtScanCtx, pRpt, &pExtScanCtx->data.scan.advRptState); } } break; @@ -1562,10 +1712,14 @@ static void lctrMstExtDiscoverReschedule(lctrExtScanCtx_t *pExtScanCtx) /*** Reschedule primary operation ***/ + /* Recover primary scan BOD min duration so that its run will be guaranteed in BB. */ + pOp->minDurUsec = LCTR_MIN_SCAN_USEC; + /* Reset due time to start of scan window. */ pOp->due = pExtScanCtx->scanWinStart; - if ((pScan->elapsedUsec + pOp->minDurUsec) < LCTR_BLE_TO_US(pExtScanCtx->scanParam.scanWindow)) + if ((pExtScanCtx->scanParam.scanInterval != pExtScanCtx->scanParam.scanWindow) && + ((pScan->elapsedUsec + pOp->minDurUsec) < LCTR_BLE_TO_US(pExtScanCtx->scanParam.scanWindow))) { const uint32_t min = BB_US_TO_BB_TICKS(pScan->elapsedUsec); const uint32_t max = BB_BLE_TO_BB_TICKS(pExtScanCtx->scanParam.scanWindow); @@ -1705,7 +1859,7 @@ void lctrMstPerScanEndOp(BbOpDesc_t *pOp) if (pPerScanCtx->cancelCreateSync) { - lctrSendCreateSyncMsg(LCTR_CREATE_SYNC_MSG_TERMINATE); + lctrSendCreateSyncMsg(pPerScanCtx, LCTR_CREATE_SYNC_MSG_TERMINATE); return; } @@ -1718,6 +1872,22 @@ void lctrMstPerScanEndOp(BbOpDesc_t *pOp) return; } + /* Failed to receive AUX_SYNC_IND within the first 6 periodic intervals. */ + if (pPerScanCtx->firstPerAdvRcv == FALSE) + { + /* Make sure create sync failed event is sent out after 6th RX is over. */ + uint16_t fastTermCnt = pPerScanCtx->bodAborted ? (LCTR_FAST_TERM_CNT + 1) : LCTR_FAST_TERM_CNT; + + if ((pPerScanCtx->eventCounter - pPerScanCtx->initEventCounter) == (fastTermCnt - 1)) + { + LL_TRACE_ERR0("!!! lctrMstPerScanEndOp: Failed to receive AUX_SYNC_IND within first 6 intervals."); + /* Notify create sync state machine with sync failed. */ + lctrSendCreateSyncMsg(pPerScanCtx, LCTR_CREATE_SYNC_MSG_FAILED); + } + } + + pPerScanCtx->bodAborted = FALSE; + /*** Reschedule operation ***/ uint16_t skip; if (lctrMstPerScanIsr.syncWithSlave) @@ -1726,6 +1896,8 @@ void lctrMstPerScanEndOp(BbOpDesc_t *pOp) pPerScanCtx->lastAnchorPoint = lctrMstPerScanIsr.firstRxStartTs; lctrMstPerScanIsr.syncWithSlave = FALSE; pPerScanCtx->lastActiveEvent = pPerScanCtx->eventCounter; + /* Reset supervision timer. */ + WsfTimerStartMs(&pPerScanCtx->tmrSupTimeout, pPerScanCtx->syncTimeOutMs); if (pPerScanCtx->skipInter && pPerScanCtx->skipInter < BB_US_TO_BB_TICKS(pPerScanCtx->syncTimeOutMs * 1000)) @@ -1748,12 +1920,27 @@ void lctrMstPerScanEndOp(BbOpDesc_t *pOp) while (TRUE) { + /* Handle Acad if any pending actions are waiting. */ + lctrAcadMsg_t acadMsg; + acadMsg.hdr.eventCtr = pPerScanCtx->eventCounter; + acadMsg.hdr.skip = skip; + acadMsg.hdr.handle = LCTR_GET_PER_SCAN_HANDLE(pPerScanCtx); + + for (uint8_t acadId = 0; acadId < LCTR_ACAD_NUM_ID; acadId++) + { + if (pPerScanCtx->acadParams[acadId].hdr.state != LCTR_ACAD_STATE_DISABLED) + { + acadMsg.hdr.acadId = acadId; + lctrPerScanActProcessAcad(&acadMsg); + } + } + pPerScanCtx->eventCounter += skip; numUnsyncIntervals += skip; uint32_t unsyncTimeUsec = BB_TICKS_TO_US(pPerScanCtx->perInter * numUnsyncIntervals); uint32_t caPpm = lctrCalcTotalAccuracy(pPerScanCtx->sca); - uint32_t wwTotalUsec = lctrCalcAuxAdvWindowWideningUsec(unsyncTimeUsec, caPpm); + uint32_t wwTotalUsec = lctrCalcWindowWideningUsec(unsyncTimeUsec, caPpm); uint32_t wwTotal = BB_US_TO_BB_TICKS(wwTotalUsec); uint32_t connInterUsec = BB_TICKS_TO_US(numUnsyncIntervals * pPerScanCtx->perInter); uint32_t connInter = BB_US_TO_BB_TICKS(connInterUsec); @@ -1767,7 +1954,7 @@ void lctrMstPerScanEndOp(BbOpDesc_t *pOp) pBle->chan.chanIdx = lctrPeriodicSelectNextChannel(&pPerScanCtx->chanParam, pPerScanCtx->eventCounter); - if (SchInsertAtDueTime(pOp, NULL)) + if (SchInsertAtDueTime(pOp, lctrPerScanResolveConflict)) { break; } @@ -1775,6 +1962,23 @@ void lctrMstPerScanEndOp(BbOpDesc_t *pOp) } } +/*************************************************************************************************/ +/*! + * \brief Abort an periodic scan operation in the master role. + * + * \param pOp Completed operation. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrMstPerScanAbortOp(BbOpDesc_t *pOp) +{ + lctrPerScanCtx_t * const pPerScanCtx = pOp->pCtx; + + pPerScanCtx->bodAborted = TRUE; + lctrMstPerScanEndOp(pOp); +} + /*************************************************************************************************/ /*! * \brief Master periodic scan Rx periodic adv handler. @@ -1794,7 +1998,7 @@ uint32_t lctrMstPerScanRxPerAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBu BbBleData_t * const pBle = pOp->prot.pBle; lctrPerScanCtx_t * const pPerScanCtx = pOp->pCtx; - /* RX_TIMEOUT with pAdvBuf NULL. */ + /* BB_STATUS_RX_TIMEOUT or BB_STATUS_CRC_FAILED with pAdvBuf NULL. */ if (pAdvBuf == NULL) { /* The report will be submitted in the lctrMstPerScanRxPerAdvPktPostHandler */ @@ -1810,25 +2014,29 @@ uint32_t lctrMstPerScanRxPerAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBu if (pPerScanCtx->firstPerAdvRcv == FALSE) { pPerScanCtx->firstPerAdvRcv = TRUE; + lctrMstPerScanIsr.filtResult = TRUE; /* Notify create sync state machine with sync done. */ - lctrSendCreateSyncMsg(LCTR_CREATE_SYNC_MSG_DONE); + lctrSendCreateSyncMsg(pPerScanCtx, LCTR_CREATE_SYNC_MSG_DONE); /* Notify periodic scan state machine with sync established. */ lctrSendPerScanMsg(pPerScanCtx, LCTR_PER_SCAN_MSG_SYNC_ESTD); + + if (lctrPerTransferSync.state == LCTR_TRANSFER_SYNC_STATE_DISCOVER) + { + pPerScanCtx->skipInter = pPerScanCtx->perInter * pPerScanCtx->skip; + } } /* Store anchor point. */ if ((!lctrMstPerScanIsr.syncWithSlave) && (pMstPerScan->perIsFirstTs == TRUE) && - ((status == BB_STATUS_SUCCESS) || (status == BB_STATUS_CRC_FAILED))) + (status == BB_STATUS_SUCCESS)) { lctrMstPerScanIsr.firstRxStartTs = pMstPerScan->perStartTs; lctrMstPerScanIsr.syncWithSlave = TRUE; } /*** ACAD processing. ***/ - - /* TODO route ACAD */ - (void)pPerScanCtx->extAdvHdr.pAcad; + lctrMstAcadHandler(pPerScanCtx); /*** Periodic Advertising Data processing. ***/ uint32_t auxOffsetUsec = 0; @@ -1867,18 +2075,15 @@ bool_t lctrMstPerScanRxPerAdvPktPostHandler(BbOpDesc_t *pOp, const uint8_t *pAdv WsfTimerStartMs(&pPerScanCtx->tmrSupTimeout, pPerScanCtx->syncTimeOutMs); } - /* RX_TIMEOUT with pAdvBuf NULL. */ + /* BB_STATUS_RX_TIMEOUT or BB_STATUS_CRC_FAILED with pAdvBuf NULL. */ if (pAdvBuf == NULL) { /* Send truncated event. */ - if (pPerScanCtx->advRptState == LCTR_RPT_STATE_IDLE) + if (pPerScanCtx->advRptState == LCTR_RPT_STATE_IN_PROGRESS && pPerScanCtx->state == LCTR_PER_SCAN_STATE_SYNC_ESTD) { if (lctrPerAdvRptPackTruncate(pOp, pAdvBuf, &pPerScanCtx->advRpt)) { - if (lctrPerAdvRptPend(pPerScanCtx)) - { - lctrPerAdvRptSubmit(pPerScanCtx); - } + lctrPerAdvRptSubmit(pPerScanCtx); } } return FALSE; @@ -1934,3 +2139,15 @@ bool_t lctrMstPerScanRxPerAdvPktPostHandler(BbOpDesc_t *pOp, const uint8_t *pAdv } return result; } + +/*************************************************************************************************/ +/*! + * \brief Initialize periodic scan ISR context. + * + * \return None + */ +/*************************************************************************************************/ +void lctrMstPerScanIsrInit(void) +{ + lctrMstPerScanIsr.syncWithSlave = FALSE; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_slave.c index f2bb6144bf..185e31b9da 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave advertising ISR callbacks. + * \file + * \brief Link layer controller slave advertising ISR callbacks. */ /*************************************************************************************************/ @@ -310,7 +311,7 @@ void lctrSlvAdvEndOp(BbOpDesc_t *pOp) } #endif } - SchBleCalcAdvOpDuration(pOp); + SchBleCalcAdvOpDuration(pOp, 0); /*** Reschedule operation ***/ @@ -325,7 +326,7 @@ void lctrSlvAdvEndOp(BbOpDesc_t *pOp) do { - if (lctrGetOpFlag(LL_OP_MODE_FLAG_ENA_ADV_DLY)) + if (lmgrGetOpFlag(LL_OP_MODE_FLAG_ENA_ADV_DLY)) { /* maxDelay is 16, it times 625 still fits in uint32_t. */ /* coverity[overflow_before_widen] */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_slave_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_slave_ae.c index 5d5a36be27..5dd5ab9eb0 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_slave_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_adv_slave_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave extended advertising ISR callbacks. + * \file + * \brief Link layer controller slave extended advertising ISR callbacks. */ /*************************************************************************************************/ @@ -32,6 +33,7 @@ #include "wsf_assert.h" #include "wsf_cs.h" #include "wsf_msg.h" +#include "wsf_math.h" #include "wsf_trace.h" #include "util/bstream.h" #include @@ -80,6 +82,7 @@ void lctrSlvTxSetupExtAdvHandler(BbOpDesc_t *pOp, uint32_t advTxTime) LL_TRACE_WARN1("AUX Offset does not meet T_MAFS, afsUsec=%u", (auxOffsetUsec - txAdvUsec)); } + /* The time pointed by auxPtr is earlier than aux bod due time by auxPtrOffsetUsec. */ lctrPackAuxPtr(pAdvSet, auxOffsetUsec, pAdvSet->auxChIdx, pAdvSet->pExtAdvAuxPtr); } } @@ -100,8 +103,15 @@ uint32_t lctrSlvTxSetupAuxAdvDataHandler(BbOpDesc_t *pOp, bool_t isChainInd) BbBleData_t * const pBle = &pAdvSet->auxBleData; BbBleSlvAuxAdvEvent_t * const pAuxAdv = &pBle->op.slvAuxAdv; + if ((isChainInd == TRUE) && (pAdvSet->auxOffsUsec == 0)) + { + /* Tell the caller(BB) there is no more chained packet. */ + return 0; + } + /* Store/use current AuxPtr values. */ - uint32_t auxOffsUsec = pAdvSet->auxOffsUsec; + /* Due time of the aux packet is delayed by auxPtrOffsetUsec from the time specified by auxPtr. */ + uint32_t auxOffsUsec = pAdvSet->auxOffsUsec + pLctrRtCfg->auxPtrOffsetUsec; pBle->chan.chanIdx = pAdvSet->auxChIdx; if (!isChainInd) @@ -110,7 +120,6 @@ uint32_t lctrSlvTxSetupAuxAdvDataHandler(BbOpDesc_t *pOp, bool_t isChainInd) pAdvSet->advData.txOffs = 0; /* Compute new AuxPtr values. */ - pAdvSet->auxChHopInc = lctrComputeHopInc(); lctrSelectNextAuxChannel(pAdvSet); pAuxAdv->txAuxAdvPdu[0].len = lctrPackAuxAdvIndPdu(pAdvSet, pAdvSet->auxAdvHdrBuf, &pAdvSet->advData, FALSE); @@ -210,8 +219,15 @@ uint32_t lctrSlvTxSetupAuxScanRspDataHandler(BbOpDesc_t *pOp, bool_t isChainInd) BbBleData_t * const pBle = &pAdvSet->auxBleData; BbBleSlvAuxAdvEvent_t * const pAuxAdv = &pBle->op.slvAuxAdv; + if ((isChainInd == TRUE) && (pAdvSet->auxOffsUsec == 0)) + { + /* Tell the caller(BB) there is no more chained packet. */ + return 0; + } + /* Store/use current AuxPtr values. */ - uint32_t auxOffsUsec = pAdvSet->auxOffsUsec; + /* Due time of the aux packet is delayed by auxPtrOffsetUsec from the time specified by auxPtr. */ + uint32_t auxOffsUsec = pAdvSet->auxOffsUsec + pLctrRtCfg->auxPtrOffsetUsec; pBle->chan.chanIdx = pAdvSet->auxChIdx; if (!isChainInd) @@ -379,7 +395,8 @@ bool_t lctrSlvRxAuxConnReqHandler(BbOpDesc_t *pOp, const uint8_t *pReqBuf) if ((lctrAdvIsrAdvHdr.pduType == LL_PDU_AUX_CONNECT_REQ) && (lctrMsgDispTbl[LCTR_DISP_CONN]) && - (lctrAdvIsrAdvHdr.len == LL_CONN_IND_PDU_LEN)) + (lctrAdvIsrAdvHdr.len == LL_CONN_IND_PDU_LEN) && + (lctrValidateConnIndPdu(&connInd))) { /*** Extended advertising event filtering. ***/ @@ -428,6 +445,22 @@ bool_t lctrSlvRxAuxConnReqHandler(BbOpDesc_t *pOp, const uint8_t *pReqBuf) Bda64ToBstream(pAuxConnRspAdvA, localAddr); pAdvSet->rspPduHdr.txAddrRnd = localAddrRand; +#if (LL_ENABLE_TESTER) + if (llTesterCb.auxRsp.len) + { + /* Overriding AUX_CONNECT_RSP from test script. */ + memcpy(pAuxConnRspAdvA, llTesterCb.auxRsp.buf + LL_ADV_HDR_LEN, llTesterCb.auxRsp.len - LL_ADV_HDR_LEN); /* Exclude LL_ADV_HDR_LEN */ + + uint16_t hdr; + uint8_t *ptr = llTesterCb.auxRsp.buf; + BSTREAM_TO_UINT16(hdr, ptr); + + pAdvSet->rspPduHdr.txAddrRnd = (hdr >> LCTR_ADV_HDR_TX_ADD_SHIFT) & 0x0001; + pAdvSet->rspPduHdr.rxAddrRnd = (hdr >> LCTR_ADV_HDR_RX_ADD_SHIFT) & 0x0001; + + } +#endif + lctrPackAdvbPduHdr(pAdvSet->auxRspHdrBuf, &pAdvSet->rspPduHdr); /* Stop advertising. */ @@ -444,7 +477,7 @@ bool_t lctrSlvRxAuxConnReqHandler(BbOpDesc_t *pOp, const uint8_t *pReqBuf) pAdvSet->connIndEndTs = pAuxAdv->auxReqStartTs + /* N.B.: May round to an earlier time. */ BB_US_TO_BB_TICKS(SchBleCalcAdvPktDurationUsec(pBle->chan.rxPhy, pAuxAdv->auxRxPhyOptions, - LL_CONN_IND_PDU_LEN)); + LL_ADV_HDR_LEN + LL_CONN_IND_PDU_LEN)); sendRsp = TRUE; } @@ -546,6 +579,55 @@ void lctrSlvRxLegacyReqPostProcessHandler(BbOpDesc_t *pOp, const uint8_t *pReqBu } } +/*************************************************************************************************/ +/*! + * \brief Acad handler for post op. + * + * \param pAdvSet Advertising Set. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrSlvAcadHandler(lctrAdvSet_t *pAdvSet) +{ + for (uint8_t acadId = 0; acadId < LCTR_ACAD_NUM_ID; acadId++) + { + lctrAcadParam_t *pData = &pAdvSet->acadParams[acadId]; + + if (pData->hdr.state != LCTR_ACAD_STATE_ENABLED) + { + continue; + } + + /* coverity[dead_error_condition] */ + switch(acadId) + { + case LCTR_ACAD_ID_CHAN_MAP_UPDATE: + { + if (pData->chanMapUpdate.instant == pAdvSet->perParam.perEventCounter) + { + /* Update the channel map. */ + pAdvSet->perParam.perChanParam.chanMask = pData->chanMapUpdate.chanMask; + LmgrBuildRemapTable(&pAdvSet->perParam.perChanParam); + + /* Disable the ACAD. */ + lctrSlvAcadExecuteSm(pAdvSet, LCTR_ACAD_MSG_CHAN_UPDATE_FINISH); + + /* If the most updated channel map does not match the current mask, start a new update. */ + if (pAdvSet->perParam.perChanParam.chanMask != pAdvSet->perParam.updChanMask) + { + lctrSlvAcadExecuteSm(pAdvSet, LCTR_ACAD_MSG_CHAN_UPDATE); + } + } + break; + } + + default: + break; + } + } +} + /************************************************************************************************** Functions: BOD handlers **************************************************************************************************/ @@ -592,7 +674,7 @@ void lctrSlvExtAdvEndOp(BbOpDesc_t *pOp) { /* Ensure all BODs are de-scheduled. */ bool_t result = SchRemove(&pAdvSet->auxAdvBod); - WSF_ASSERT(result); /* Non-head elements are always removeable. */ + (void)result; } else @@ -627,7 +709,7 @@ void lctrSlvExtAdvEndOp(BbOpDesc_t *pOp) pAdvSet->advData.alt.ext.modified = FALSE; memcpy(pAdvSet->advData.pBuf, pAdvSet->advData.alt.ext.buf, pAdvSet->advData.alt.ext.len); pAdvSet->advData.len = pAdvSet->advData.alt.ext.len; - pAdvSet->advData.did = pAdvSet->advData.alt.ext.did; + pAdvSet->param.advDID = pAdvSet->advData.alt.ext.did; pAdvSet->advData.fragPref = pAdvSet->advData.alt.ext.fragPref; /* Advertising offloading to auxiliary channel. */ @@ -649,6 +731,13 @@ void lctrSlvExtAdvEndOp(BbOpDesc_t *pOp) lctrSlvAuxNonConnNonScanBuildOp(pAdvSet); pAdvSet->auxBodUsed = TRUE; } + + /* Update Data ID when periodic advertising is enabled or disabled. */ + if ((pAdvSet->didPerUpdate == TRUE) && (pAdvSet->auxBodUsed == FALSE)) + { + pAdvSet->param.advDID = pAdvSet->advData.alt.ext.did; + pAdvSet->didPerUpdate = FALSE; + } } else /* (pAdvSet->param.advEventProp & LL_ADV_EVT_PROP_LEGACY_ADV_BIT) */ { @@ -749,7 +838,7 @@ void lctrSlvExtAdvEndOp(BbOpDesc_t *pOp) } } - SchBleCalcAdvOpDuration(pOp); + SchBleCalcAdvOpDuration(pOp, 0); /*** Reschedule operation ***/ const uint8_t LEGACY_HIGH_DUTY = (LL_ADV_EVT_PROP_LEGACY_ADV_BIT | LL_ADV_EVT_PROP_HIGH_DUTY_ADV_BIT | @@ -792,41 +881,51 @@ void lctrSlvExtAdvEndOp(BbOpDesc_t *pOp) } else { - bool_t result; + uint32_t totalDuration = pOp->minDurUsec; + uint32_t prefInterval; - do + if (lmgrGetOpFlag(LL_OP_MODE_FLAG_ENA_ADV_DLY)) { - if (lctrGetOpFlag(LL_OP_MODE_FLAG_ENA_ADV_DLY)) - { - pOp->due += BB_BLE_TO_BB_TICKS(lctrCalcAdvDelay()); - } + pOp->due += BB_BLE_TO_BB_TICKS(lctrCalcAdvDelay()); + } - if (pAdvSet->param.priAdvInterMin == pAdvSet->param.priAdvInterMax) - { - pOp->due += pAdvSet->param.priAdvInterMin; - result = SchInsertAtDueTime(pOp, NULL); - } - else - { - result = SchInsertEarlyAsPossible(pOp, - pAdvSet->param.priAdvInterMin, - pAdvSet->param.priAdvInterMax); - if (!result) - { - pOp->due += pAdvSet->param.priAdvInterMax; - } - } + if (pAdvSet->auxBodUsed) + { + totalDuration += pAdvSet->auxAdvBod.minDurUsec; + } - if (!result) - { - LL_TRACE_WARN1("!!! ExtAdv schedule conflict at due=%u", pOp->due); - LL_TRACE_WARN1("!!! handle=%u", pAdvSet->handle); - } + /* Pick an interval so that advertising(primary + aux) BOD would take less than half of total bandwidth. */ + prefInterval = WSF_MAX(BB_US_TO_BB_TICKS(totalDuration * 2), pAdvSet->param.priAdvInterMin); - } while (!result); + if (pAdvSet->advBodAbort) + { + pAdvSet->advBodAbort = FALSE; + (void)SchInsertEarlyAsPossible(pOp, 0, LCTR_SCH_MAX_SPAN); + } + else + { + (void)SchInsertEarlyAsPossible(pOp, prefInterval, LCTR_SCH_MAX_SPAN); + } } } +/*************************************************************************************************/ +/*! + * \brief Abort an extended advertising primary channel operation. + * + * \param pOp Completed operation. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrSlvExtAdvAbortOp(BbOpDesc_t *pOp) +{ + lctrAdvSet_t * const pAdvSet = pOp->pCtx; + pAdvSet->advBodAbort = TRUE; + + lctrSlvExtAdvEndOp(pOp); +} + /*************************************************************************************************/ /*! * \brief End an extended advertising secondary channel operation. @@ -867,8 +966,8 @@ void lctrSlvAuxAdvEndOp(BbOpDesc_t *pOp) { /* Ensure all BODs are de-scheduled. */ bool_t result = SchRemove(&pAdvSet->advBod); - WSF_ASSERT(result); /* Non-head elements are always removeable. */ - (void)result; + + (void)result; /* It is possible to fail to remove BOD when BOD is not in the list(scheduling conflict) or there is not enough time to remove the BOD. */ } else { @@ -897,7 +996,7 @@ void lctrSlvAuxAdvEndOp(BbOpDesc_t *pOp) pAdvSet->advData.alt.ext.modified = FALSE; memcpy(pAdvSet->advData.pBuf, pAdvSet->advData.alt.ext.buf, pAdvSet->advData.alt.ext.len); pAdvSet->advData.len = pAdvSet->advData.alt.ext.len; - pAdvSet->advData.did = pAdvSet->advData.alt.ext.did; + pAdvSet->param.advDID = pAdvSet->advData.alt.ext.did; pAdvSet->advData.fragPref = pAdvSet->advData.alt.ext.fragPref; /* Update superior PDU. */ @@ -917,14 +1016,28 @@ void lctrSlvAuxAdvEndOp(BbOpDesc_t *pOp) pAdvSet->scanRspData.alt.ext.modified = FALSE; memcpy(pAdvSet->scanRspData.pBuf, pAdvSet->scanRspData.alt.ext.buf, pAdvSet->scanRspData.alt.ext.len); pAdvSet->scanRspData.len = pAdvSet->scanRspData.alt.ext.len; - pAdvSet->scanRspData.did = pAdvSet->scanRspData.alt.ext.did; + pAdvSet->param.advDID = pAdvSet->scanRspData.alt.ext.did; pAdvSet->scanRspData.fragPref = pAdvSet->scanRspData.alt.ext.fragPref; } + /* Update Data ID when periodic advertising is enabled or disabled. */ + if (pAdvSet->didPerUpdate == TRUE) + { + pAdvSet->param.advDID = pAdvSet->advData.alt.ext.did; + pAdvSet->didPerUpdate = FALSE; + } + /*** Update operation ***/ + if (BbBleResListIsRpaUpd(pAdvSet->param.peerAddrType, pAdvSet->param.peerAddr)) + { + /* Update AUX_ADV_IND in case advA or/and tgtA are changed, AUX_ADV_IND for non-conn and non-scan will be updated again if necessary in the lctrSlvTxSetupAuxAdvDataHandler. */ + BbBleSlvAuxAdvEvent_t * const pAuxAdv = &pBle->op.slvAuxAdv; - /* Updated in lctrSlvTxSetupAuxAdvDataHandler(). */ - + pAdvSet->advData.txOffs = 0; + pAuxAdv->txAuxAdvPdu[0].len = lctrPackAuxAdvIndPdu(pAdvSet, pAdvSet->auxAdvHdrBuf, &pAdvSet->advData, FALSE); + pAuxAdv->txAuxAdvPdu[1].pBuf = pAdvSet->advData.pBuf; + pAuxAdv->txAuxAdvPdu[1].len = pAdvSet->advData.len; + } /*** Reschedule operation ***/ lctrSlvAuxRescheduleOp(pAdvSet, pOp); @@ -985,6 +1098,10 @@ void lctrSlvPeriodicAdvEndOp(BbOpDesc_t *pOp) pOp->due += pAdvSet->perParam.perAdvInter; pAdvSet->perParam.perEventCounter++; + + /*** Process ACAD fields if necessary ***/ + lctrSlvAcadHandler(pAdvSet); + pAdvSet->perParam.perChIdx = lctrPeriodicSelectNextChannel(&pAdvSet->perParam.perChanParam, pAdvSet->perParam.perEventCounter); @@ -995,3 +1112,22 @@ void lctrSlvPeriodicAdvEndOp(BbOpDesc_t *pOp) LL_TRACE_WARN1("!!! Periodic advertising schedule conflict eventCounter=%u", pAdvSet->perParam.perEventCounter); } } + +/*************************************************************************************************/ +/*! + * \brief Abort an periodic advertising channel operation. + * + * \param pOp Aborted operation. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrSlvPeriodicAdvAbortOp(BbOpDesc_t *pOp) +{ + WSF_ASSERT(pOp->protId == BB_PROT_BLE); + WSF_ASSERT(pOp->prot.pBle->chan.opType == BB_BLE_OP_SLV_PER_ADV_EVENT); + + LL_TRACE_WARN1("!!! Periodic advertising BOD aborted, eventCounter=%u", ((lctrAdvSet_t *)pOp->pCtx)->perParam.perEventCounter); + + lctrSlvPeriodicAdvEndOp(pOp); +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_conn.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_conn.c index 8f57108247..3868d3d9bc 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_conn.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_conn.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,14 +16,15 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave connection ISR callbacks. + * \file + * \brief Link layer controller slave connection ISR callbacks. */ /*************************************************************************************************/ #include "lctr_int_conn.h" #include "lmgr_api_conn.h" #include "bb_ble_api.h" -#include "bb_drv.h" +#include "pal_bb.h" #include "wsf_assert.h" #include "wsf_math.h" #include "wsf_msg.h" @@ -270,7 +271,7 @@ uint16_t lctrSetupForTx(lctrConnCtx_t *pCtx, uint8_t rxStatus, bool_t reqTx) pCtx->txHdr.md || /* peer is informed more data is pending */ reqTx) { - BbBleDrvTxBufDesc_t bbDesc[3]; + PalBbBleTxBufDesc_t bbDesc[3]; uint8_t bbDescCnt; bool_t md; @@ -329,7 +330,7 @@ uint16_t lctrSetupForTx(lctrConnCtx_t *pCtx, uint8_t rxStatus, bool_t reqTx) /* Transmit empty PDU. */ lctrBuildEmptyPdu(pCtx); - BbBleDrvTxBufDesc_t desc = {.pBuf = lctrConnIsr.emptyPdu, .len = sizeof(lctrConnIsr.emptyPdu)}; + PalBbBleTxBufDesc_t desc = {.pBuf = lctrConnIsr.emptyPdu, .len = sizeof(lctrConnIsr.emptyPdu)}; BbBleTxData(&desc, 1); numTxBytes = desc.len; @@ -397,7 +398,7 @@ bool_t lctrExceededMaxDur(lctrConnCtx_t *pCtx, uint32_t ceStart, uint32_t pendDu return FALSE; } - const uint32_t curTime = BbDrvGetCurrentTime(); + const uint32_t curTime = PalBbGetCurrentTime(USE_RTC_BB_CLK); const uint32_t setupDelayUsec = BbGetSchSetupDelayUs(); uint32_t availCeUsec = LCTR_CONN_IND_US(pCtx->connInterval); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_conn_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_conn_master.c index 88e6cb2c6b..91d127316a 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_conn_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_conn_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master connection ISR callbacks. + * \file + * \brief Link layer controller master connection ISR callbacks. */ /*************************************************************************************************/ @@ -56,7 +57,7 @@ WSF_CT_ASSERT((BB_FIXED_DATA_PKT_LEN == 0) || **************************************************************************************************/ #if (LL_ENABLE_TESTER) -void LctrProcessRxTxAck(lctrConnCtx_t *pCtx, uint8_t *pRxBuf, uint8_t **pNextRxBuf, bool_t *pTxPduIsAcked); +extern void LctrProcessRxTxAck(lctrConnCtx_t *pCtx, uint8_t *pRxBuf, uint8_t **pNextRxBuf, bool_t *pTxPduIsAcked); #endif /*************************************************************************************************/ @@ -294,6 +295,11 @@ void lctrMstConnEndOp(BbOpDesc_t *pOp) SchRmSetReference(LCTR_GET_CONN_HANDLE(pCtx)); + if (pCtx->checkCisTerm) + { + (pCtx->checkCisTerm)(LCTR_GET_CONN_HANDLE(pCtx)); + } + /* Terminate connection */ if (lctrCheckForLinkTerm(pCtx)) { @@ -312,10 +318,9 @@ void lctrMstConnEndOp(BbOpDesc_t *pOp) uint16_t ceOffset; #if (LL_ENABLE_TESTER) - if (llTesterCb.eventCounterOffset) + if (llTesterCb.eventCounterOverride == TRUE) { - ceOffset = pCtx->eventCounter + - llTesterCb.eventCounterOffset + 1; /* +1 for next CE */ + ceOffset = llTesterCb.eventCounterOffset + 1; /* +1 for next CE */ } else #endif @@ -327,18 +332,8 @@ void lctrMstConnEndOp(BbOpDesc_t *pOp) } pCtx->connUpd.instant = pCtx->eventCounter + ceOffset; - uint32_t rsvnOffs[SCH_RM_MAX_RSVN]; - memset(&rsvnOffs[0], 0, sizeof(rsvnOffs)); - if (lctrGetConnOffsetsCback) - { - lctrGetConnOffsetsCback(rsvnOffs, pOp->due); - } - if (lctrGetPerOffsetsCback) - { - lctrGetPerOffsetsCback(&rsvnOffs[LL_MAX_CONN], pOp->due); - } /* Use smallest txWindowOffset (i.e. 0) to minimize data loss. */ - uint32_t txWinOffsetUsec = SchRmGetOffsetUsec(rsvnOffs, 0, LCTR_GET_CONN_HANDLE(pCtx)); + uint32_t txWinOffsetUsec = SchRmGetOffsetUsec(0, LCTR_GET_CONN_HANDLE(pCtx), pOp->due); pCtx->connUpd.txWinOffset = LCTR_US_TO_CONN_IND(txWinOffsetUsec); lctrPackConnUpdInd(pPdu, &pCtx->connUpd); @@ -347,6 +342,25 @@ void lctrMstConnEndOp(BbOpDesc_t *pOp) /* else retry at next lctrMstConnEndOp() event. */ } + if (pCtx->sendPerSync) + { + pCtx->sendPerSync = FALSE; + if (pCtx->perSyncSrc == LCTR_SYNC_SRC_SCAN) + { + if (lctrSendPerSyncFromScanFn) + { + lctrSendPerSyncFromScanFn(pCtx); + } + } + else /* (pCtx->perSyncSrc == LCTR_SYNC_SRC_BCST) */ + { + if (lctrSendPerSyncFromBcstFn) + { + lctrSendPerSyncFromBcstFn(pCtx); + } + } + } + /*** Update for next operation ***/ uint32_t anchorPoint = pOp->due; @@ -375,21 +389,15 @@ void lctrMstConnEndOp(BbOpDesc_t *pOp) #if (LL_ENABLE_TESTER) if (llTesterCb.connIntervalUs) { - connInter = BB_US_TO_BB_TICKS(llTesterCb.connIntervalUs); - dueOffsetUsec = llTesterCb.connIntervalUs - BB_TICKS_TO_US(connInter); + connInterUsec = (numIntervals * llTesterCb.connIntervalUs) + anchorPointOffsetUsec; + connInter = BB_US_TO_BB_TICKS(connInterUsec); + dueOffsetUsec = 0; } #endif /* Advance to next interval. */ pOp->due = anchorPoint + connInter; pOp->dueOffsetUsec = WSF_MAX(dueOffsetUsec, 0); -#if (LL_ENABLE_TESTER) - if (llTesterCb.connIntervalUs) - { - pOp->due = anchorPoint + BB_US_TO_BB_TICKS(llTesterCb.connIntervalUs); - pOp->dueOffsetUsec = 0; - } -#endif if ((pCtx->llcpActiveProc == LCTR_PROC_CONN_UPD) && (pCtx->eventCounter == pCtx->connUpd.instant)) diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_conn_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_conn_slave.c index 550ac8c448..31b2551d42 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_conn_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_conn_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave connection ISR callbacks. + * \file + * \brief Link layer controller slave connection ISR callbacks. */ /*************************************************************************************************/ @@ -33,23 +34,13 @@ #include "wsf_os.h" #include "wsf_trace.h" #include "util/bstream.h" -#include "bb_drv.h" +#include "pal_bb.h" #include /************************************************************************************************** Global Variables **************************************************************************************************/ -/*! \brief Slave connection ISR control block (used only by active operation). */ -static struct -{ - uint8_t consCrcFailed; /*!< Number of consecutive CRC failures. */ - bool_t syncWithMaster; /*!< Flag indicating synchronize packet received from master. */ - uint8_t syncConnHandle; /*!< Connection handle where synchronized packet was received. */ - bool_t rxFromMaster; /*!< At least one successful packet received from master. */ - uint32_t firstRxStartTs; /*!< Timestamp of the first received frame regardless of CRC error. */ -} lctrSlvConnIsr; - /*! \brief Assert BB meets data PDU requirements. */ WSF_CT_ASSERT((BB_FIXED_DATA_PKT_LEN == 0) || (BB_FIXED_DATA_PKT_LEN >= LCTR_DATA_PDU_MAX_LEN)); @@ -59,7 +50,7 @@ WSF_CT_ASSERT((BB_FIXED_DATA_PKT_LEN == 0) || **************************************************************************************************/ #if (LL_ENABLE_TESTER) -void LctrProcessRxTxAck(lctrConnCtx_t *pCtx, uint8_t *pRxBuf, uint8_t **pNextRxBuf, bool_t *pTxPduIsAcked); +extern void LctrProcessRxTxAck(lctrConnCtx_t *pCtx, uint8_t *pRxBuf, uint8_t **pNextRxBuf, bool_t *pTxPduIsAcked); #endif /*************************************************************************************************/ @@ -74,7 +65,7 @@ void LctrProcessRxTxAck(lctrConnCtx_t *pCtx, uint8_t *pRxBuf, uint8_t **pNextRxB static void lctrSlvAbortSlvLatency(BbOpDesc_t *pOp) { lctrConnCtx_t * const pCtx = pOp->pCtx; - const uint32_t curTime = BbDrvGetCurrentTime(); + const uint32_t curTime = PalBbGetCurrentTime(USE_RTC_BB_CLK); uint32_t connInterval = BB_US_TO_BB_TICKS(LCTR_CONN_IND_US(pCtx->connInterval)); uint32_t count = 0; @@ -118,12 +109,13 @@ static void lctrSlvAbortSlvLatency(BbOpDesc_t *pOp) /*! * \brief Update a connection operation. * - * \param pCtx Connection context. + * \param pCtx Connection context. + * \param ignoreOffset txWinOffset will be ignored if TRUE. * * \return None. */ /*************************************************************************************************/ -static void lctrSlvConnUpdateOp(lctrConnCtx_t *pCtx) +static void lctrSlvConnUpdateOp(lctrConnCtx_t *pCtx, bool_t ignoreOffset) { /* Pre-resolve common structures for efficient access. */ BbOpDesc_t * const pOp = &pCtx->connBod; @@ -156,28 +148,29 @@ static void lctrSlvConnUpdateOp(lctrConnCtx_t *pCtx) pCtx->supTimeoutMs = LCTR_CONN_IND_TO_MS(pConnUpdInd->timeout); /*** General setup ***/ + if (ignoreOffset == FALSE) + { + const uint32_t txWinOffsetUsec = LCTR_CONN_IND_US(pConnUpdInd->txWinOffset); + const uint32_t txWinOffset = BB_US_TO_BB_TICKS(txWinOffsetUsec); + const uint32_t txWinSizeUsec = LCTR_CONN_IND_US(pConnUpdInd->txWinSize); + const uint32_t wwTxWinOffsetUsec = lctrCalcWindowWideningUsec((txWinOffsetUsec + txWinSizeUsec), pCtx->data.slv.totalAcc); + const uint32_t wwTxWinOffset = BB_US_TO_BB_TICKS(wwTxWinOffsetUsec); - const uint32_t txWinOffsetUsec = LCTR_CONN_IND_US(pConnUpdInd->txWinOffset); - const uint32_t txWinOffset = BB_US_TO_BB_TICKS(txWinOffsetUsec); - const uint32_t txWinSizeUsec = LCTR_CONN_IND_US(pConnUpdInd->txWinSize); - const uint32_t wwTxWinOffsetUsec = lctrCalcIntervalWindowWideningUsec(pCtx, txWinOffsetUsec); - const uint32_t wwTxWinOffset = BB_US_TO_BB_TICKS(wwTxWinOffsetUsec); + /* txWinOffset is relative to anchorPoint. */ + pCtx->data.slv.anchorPoint += txWinOffset; - /* txWinOffset is relative to anchorPoint. */ - pCtx->data.slv.anchorPoint += txWinOffset; + /* Add additional time due to Tx window offset and subtract WW due to Tx window offset. */ + pOp->due += txWinOffset - wwTxWinOffset; - /* Add additional time due to Tx window offset and subtract WW due to Tx window offset. */ - pOp->due += txWinOffset - wwTxWinOffset; + pCtx->data.slv.txWinSizeUsec = txWinSizeUsec; - pCtx->data.slv.txWinSizeUsec = txWinSizeUsec; + /* Add additional time due to Tx window size and WW due to Tx window offset. */ + pOp->minDurUsec += txWinSizeUsec + wwTxWinOffsetUsec; - /* Add additional time due to Tx window size and WW due to Tx window offset. */ - pOp->minDurUsec += txWinSizeUsec + wwTxWinOffsetUsec; - - /*** BLE general setup ***/ - - pConn->rxSyncDelayUsec += txWinSizeUsec + (wwTxWinOffsetUsec << 1); + /*** BLE general setup ***/ + pConn->rxSyncDelayUsec += txWinSizeUsec + (wwTxWinOffsetUsec << 1); + } /* Unconditionally reset supervision timer with transitional value. * connIntervalOld + supervisionTimeoutNew */ WsfTimerStartMs(&pCtx->tmrSupTimeout, LCTR_CONN_IND_MS(connIntervalOld) + pCtx->supTimeoutMs); @@ -260,6 +253,23 @@ static void lctrSlvPhyUpdateOp(lctrConnCtx_t *pCtx) LL_TRACE_INFO2(" >>> PHY updated, handle=%u, eventCounter=%u <<<", LCTR_GET_CONN_HANDLE(pCtx), pCtx->eventCounter); } +/*************************************************************************************************/ +/*! + * \brief Initialize connection event resources. + * + * \param pCtx Connection context. + * + * \return None. + */ +/*************************************************************************************************/ +static void lctrSlvInitConnIsr(lctrConnCtx_t *pCtx) +{ + pCtx->data.slv.consCrcFailed = 0; + pCtx->data.slv.syncWithMaster = FALSE; + pCtx->data.slv.rxFromMaster = FALSE; + pCtx->data.slv.firstRxStartTs = 0; +} + /*************************************************************************************************/ /*! * \brief Begin a connection operation. @@ -280,6 +290,7 @@ void lctrSlvConnBeginOp(BbOpDesc_t *pOp) if (lctrCheckForLinkTerm(pCtx)) { BbSetBodTerminateFlag(); + return; } if (pLctrVsHdlrs && pLctrVsHdlrs->ceSetup) @@ -288,11 +299,7 @@ void lctrSlvConnBeginOp(BbOpDesc_t *pOp) } /*** Initialize connection event resources. ***/ - - lctrSlvConnIsr.consCrcFailed = 0; - lctrSlvConnIsr.syncWithMaster = FALSE; - lctrSlvConnIsr.syncConnHandle = 0xFF; - lctrSlvConnIsr.rxFromMaster = FALSE; + lctrSlvInitConnIsr(pCtx); /*** Setup receiver ***/ @@ -344,15 +351,17 @@ void lctrSlvConnEndOp(BbOpDesc_t *pOp) if (pCtx->data.slv.abortSlvLatency) { lctrSlvAbortSlvLatency(pOp); + pCtx->data.slv.abortSlvLatency = FALSE; } pCtx->rssi = pConn->rssi; - if ((lctrSlvConnIsr.syncWithMaster) && (lctrSlvConnIsr.syncConnHandle == LCTR_GET_CONN_HANDLE(pCtx))) + if (pCtx->data.slv.syncWithMaster) { /* Re-sync to master's clock. */ - pCtx->data.slv.anchorPoint = lctrSlvConnIsr.firstRxStartTs; + pCtx->data.slv.anchorPoint = pCtx->data.slv.firstRxStartTs; pCtx->data.slv.lastActiveEvent = pCtx->eventCounter + 1; + pCtx->svtState = LCTR_SVT_STATE_IDLE; /* Tx window no longer needed. */ pCtx->data.slv.txWinSizeUsec = 0; @@ -361,19 +370,24 @@ void lctrSlvConnEndOp(BbOpDesc_t *pOp) pCtx->data.slv.unsyncedTime = 0; } - if (!pCtx->connEst && (lctrSlvConnIsr.rxFromMaster || (lctrSlvConnIsr.consCrcFailed > 0))) + if (!pCtx->connEst && (pCtx->data.slv.rxFromMaster || (pCtx->data.slv.consCrcFailed > 0))) { lctrStoreConnTimeoutTerminateReason(pCtx); WsfTimerStartMs(&pCtx->tmrSupTimeout, pCtx->supTimeoutMs); pCtx->connEst = TRUE; } - else if (lctrSlvConnIsr.rxFromMaster) + else if (pCtx->data.slv.rxFromMaster) { /* Reset supervision timer. */ WsfTimerStartMs(&pCtx->tmrSupTimeout, pCtx->supTimeoutMs); } + if (pCtx->checkCisTerm) + { + (pCtx->checkCisTerm)(LCTR_GET_CONN_HANDLE(pCtx)); + } + /* Terminate connection */ if (lctrCheckForLinkTerm(pCtx)) { @@ -396,6 +410,34 @@ void lctrSlvConnEndOp(BbOpDesc_t *pOp) lctrSendConnMsg(pCtx, LCTR_CONN_SLV_INIT_STARTUP_LLCP); } + if (pCtx->sendPerSync) + { + pCtx->sendPerSync = FALSE; + if (pCtx->perSyncSrc == LCTR_SYNC_SRC_SCAN) + { + if (lctrSendPerSyncFromScanFn) + { + lctrSendPerSyncFromScanFn(pCtx); + } + } + else /* (pCtx->perSyncSrc == LCTR_SYNC_SRC_BCST) */ + { + if (lctrSendPerSyncFromBcstFn) + { + lctrSendPerSyncFromBcstFn(pCtx); + } + } + } + + /* Slave received connection update on the instant. */ + /* Immediately use that packet as the new anchor point and do not apply txWinOffset and txWinSize. */ + if ((pCtx->llcpActiveProc == LCTR_PROC_CONN_UPD) && lctrSlvCheckConnUpdInstant(pCtx) && + (pCtx->eventCounter == pCtx->connUpd.instant)) + { + lctrSlvConnUpdateOp(pCtx, TRUE); + LL_TRACE_WARN1("Received connection update at instant, applying immediately at CE=%d", pCtx->eventCounter); + } + /*** Update for next operation ***/ uint16_t numUnsyncIntervals = pCtx->eventCounter - pCtx->data.slv.lastActiveEvent + 1; @@ -406,7 +448,8 @@ void lctrSlvConnEndOp(BbOpDesc_t *pOp) lctrGetConnOpFlag(pCtx, LL_OP_MODE_FLAG_ENA_SLV_LATENCY) && (pCtx->maxLatency && pCtx->data.slv.initAckRcvd && - lctrSlvConnIsr.rxFromMaster && + pCtx->data.slv.rxFromMaster && + (WsfQueueEmpty(&pCtx->txArqQ)) && (pCtx->state != LCTR_CONN_STATE_TERMINATING))) { if ((pCtx->llcpActiveProc == LCTR_PROC_INVALID)) @@ -418,36 +461,39 @@ void lctrSlvConnEndOp(BbOpDesc_t *pOp) /* Still apply the slave latency if the instant is not reached for the following LLCPs. */ if ((pCtx->llcpActiveProc == LCTR_PROC_CONN_UPD) && lctrSlvCheckConnUpdInstant(pCtx)) { - if ((uint16_t)(pCtx->connUpd.instant - pCtx->eventCounter) >= (pCtx->maxLatency + 1)) + if ((uint16_t)(pCtx->connUpd.instant - pCtx->eventCounter) > (pCtx->maxLatency + 1)) { numSkipCe = pCtx->maxLatency; } - else + else if ((pCtx->connUpd.instant - pCtx->eventCounter) > 1) { - numSkipCe = pCtx->connUpd.instant - pCtx->eventCounter - 1; + /* Serve CE of (instant - 1) so that connection update is applied in the end callback of CE(instant - 1). */ + numSkipCe = pCtx->connUpd.instant - pCtx->eventCounter - 2; } } else if ((pCtx->llcpActiveProc == LCTR_PROC_CMN_CH_MAP_UPD) && (pCtx->cmnState == LCTR_CMN_STATE_BUSY)) { - if ((uint16_t)(pCtx->chanMapUpd.instant - pCtx->eventCounter) >= (pCtx->maxLatency + 1)) + if ((uint16_t)(pCtx->chanMapUpd.instant - pCtx->eventCounter) > (pCtx->maxLatency + 1)) { numSkipCe = pCtx->maxLatency; } - else + else if ((pCtx->chanMapUpd.instant - pCtx->eventCounter) > 1) { - numSkipCe = pCtx->chanMapUpd.instant - pCtx->eventCounter - 1; + /* Serve CE of (instant - 1) so that new channe map is applied in the end callback of CE(instant - 1). */ + numSkipCe = pCtx->chanMapUpd.instant - pCtx->eventCounter - 2; } } else if ((pCtx->llcpActiveProc == LCTR_PROC_PHY_UPD) && (pCtx->isSlvPhyUpdInstant == TRUE)) { - if ((uint16_t)(pCtx->phyUpd.instant - pCtx->eventCounter) >= (pCtx->maxLatency + 1)) + if ((uint16_t)(pCtx->phyUpd.instant - pCtx->eventCounter) > (pCtx->maxLatency + 1)) { numSkipCe = pCtx->maxLatency; } - else + else if ((pCtx->phyUpd.instant - pCtx->eventCounter) > 1) { - numSkipCe = pCtx->phyUpd.instant - pCtx->eventCounter - 1; + /* Serve CE of (instant - 1) so that phy update is applied in the end callback of CE(instant - 1). */ + numSkipCe = pCtx->phyUpd.instant - pCtx->eventCounter - 2; } } } @@ -463,11 +509,6 @@ void lctrSlvConnEndOp(BbOpDesc_t *pOp) LL_TRACE_INFO2("Applying slave latency, waking up at eventCounter=%u, numSkipCE=%u", pCtx->eventCounter + 1, numSkipCe); } - if (pCtx->data.slv.abortSlvLatency) - { - pCtx->data.slv.abortSlvLatency = FALSE; - } - while (TRUE) { pCtx->eventCounter += 1; @@ -478,7 +519,7 @@ void lctrSlvConnEndOp(BbOpDesc_t *pOp) /* Need to add the unsynced time before connection update. */ unsyncTimeUsec += pCtx->data.slv.unsyncedTime; - uint32_t wwTotalUsec = lctrCalcIntervalWindowWideningUsec(pCtx, unsyncTimeUsec); + uint32_t wwTotalUsec = lctrCalcWindowWideningUsec(unsyncTimeUsec, pCtx->data.slv.totalAcc); uint32_t wwTotal = BB_US_TO_BB_TICKS(wwTotalUsec); uint32_t connInterUsec = LCTR_CONN_IND_US(numUnsyncIntervals * pCtx->connInterval); uint32_t connInter = BB_US_TO_BB_TICKS(connInterUsec); @@ -498,10 +539,18 @@ void lctrSlvConnEndOp(BbOpDesc_t *pOp) pOp->minDurUsec = pCtx->data.slv.txWinSizeUsec + pCtx->localConnDurUsec + wwTotalUsec; pConn->rxSyncDelayUsec = pCtx->data.slv.txWinSizeUsec + (wwTotalUsec << 1); + if ((pCtx->llcpActiveProc == LCTR_PROC_CONN_UPD) && + ((pCtx->eventCounter + 1) == pCtx->connUpd.instant)) + { + /* Last CE with the old connection parameter must be scheduled, */ + /* especially when connection interval and SVT changes into smaller ones. */ + pCtx->svtState = LCTR_SVT_STATE_FATAL; + } + if ((pCtx->llcpActiveProc == LCTR_PROC_CONN_UPD) && (pCtx->eventCounter == pCtx->connUpd.instant)) { - lctrSlvConnUpdateOp(pCtx); + lctrSlvConnUpdateOp(pCtx, FALSE); } else if ((pCtx->llcpActiveProc == LCTR_PROC_CMN_CH_MAP_UPD) && (pCtx->eventCounter == pCtx->chanMapUpd.instant)) @@ -516,6 +565,24 @@ void lctrSlvConnEndOp(BbOpDesc_t *pOp) pBle->chan.chanIdx = lctrChSelHdlr[pCtx->usedChSel](pCtx, 0); + /* Checking if SVT is imminent. */ + if (pCtx->svtState != LCTR_SVT_STATE_FATAL) + { + uint8_t nthCE = (pCtx->eventCounter + 1) - pCtx->data.slv.lastActiveEvent; /* Nth CE since last active CE. */ + uint8_t numCEforSVT = ((uint32_t)pCtx->supTimeoutMs * 1000) / (uint32_t)LCTR_CONN_IND_US(pCtx->connInterval); + + if ((nthCE + 1) == numCEforSVT) + { + /* 2nd to the last CE before SVT. */ + pCtx->svtState = LCTR_SVT_STATE_URGENT; + } + else if (nthCE >= numCEforSVT) + { + /* Last CE before SVT. */ + pCtx->svtState = LCTR_SVT_STATE_FATAL; + } + } + if (SchInsertAtDueTime(pOp, lctrConnResolveConflict)) { break; @@ -527,6 +594,23 @@ void lctrSlvConnEndOp(BbOpDesc_t *pOp) } } +/*************************************************************************************************/ +/*! + * \brief Abort a connection operation. + * + * \param pOp Aborted operation. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrSlvConnAbortOp(BbOpDesc_t *pOp) +{ + lctrConnCtx_t * const pCtx = pOp->pCtx; + + lctrSlvInitConnIsr(pCtx); + lctrSlvConnEndOp(pOp); +} + /*************************************************************************************************/ /*! * \brief Complete a transmitted data buffer. @@ -599,12 +683,12 @@ void lctrSlvConnRxCompletion(BbOpDesc_t *pOp, uint8_t *pRxBuf, uint8_t status) { if (status == BB_STATUS_RX_TIMEOUT) { - LL_TRACE_WARN3("lctrSlvConnRxCompletion: BB failed with status=RX_TIMEOUT, eventCounter=%u, bleChan=%u, handle=%u", pCtx->eventCounter, pBle->chan.chanIdx, LCTR_GET_CONN_HANDLE(pCtx)); + LL_TRACE_WARN3("lctrSlvConnRxCompletion: BB failed with status=RX_TIMEOUT, handle=%u, bleChan=%u, eventCounter=%u", LCTR_GET_CONN_HANDLE(pCtx), pBle->chan.chanIdx, pCtx->eventCounter); } if (status == BB_STATUS_FAILED) { - LL_TRACE_ERR3("lctrSlvConnRxCompletion: BB failed with status=FAILED, eventCounter=%u, bleChan=%u, handle=%u", pCtx->eventCounter, pBle->chan.chanIdx, LCTR_GET_CONN_HANDLE(pCtx)); + LL_TRACE_ERR3("lctrSlvConnRxCompletion: BB failed with status=FAILED, handle=%u, bleChan=%u, eventCounter=%u", LCTR_GET_CONN_HANDLE(pCtx), pBle->chan.chanIdx, pCtx->eventCounter); } BbSetBodTerminateFlag(); @@ -613,28 +697,28 @@ void lctrSlvConnRxCompletion(BbOpDesc_t *pOp, uint8_t *pRxBuf, uint8_t status) } /* Store anchor point. */ - if ((!lctrSlvConnIsr.syncWithMaster) && - ((status == BB_STATUS_SUCCESS) || (status == BB_STATUS_CRC_FAILED))) + if ((!pCtx->data.slv.syncWithMaster) && + ((status == BB_STATUS_SUCCESS) || + (!lctrGetConnOpFlag(pCtx, LL_OP_MODE_FLAG_IGNORE_CRC_ERR_TS) && (status == BB_STATUS_CRC_FAILED)))) { - lctrSlvConnIsr.firstRxStartTs = pConn->startTs; - lctrSlvConnIsr.syncWithMaster = TRUE; - lctrSlvConnIsr.syncConnHandle = LCTR_GET_CONN_HANDLE(pCtx); + pCtx->data.slv.firstRxStartTs = pConn->startTs; + pCtx->data.slv.syncWithMaster = TRUE; } /*** Receive packet pre-processing ***/ if (status == BB_STATUS_SUCCESS) { - lctrSlvConnIsr.rxFromMaster = TRUE; + pCtx->data.slv.rxFromMaster = TRUE; /* Reset consecutive CRC failure counter. */ - lctrSlvConnIsr.consCrcFailed = 0; + pCtx->data.slv.consCrcFailed = 0; } else if (status == BB_STATUS_CRC_FAILED) { - lctrSlvConnIsr.consCrcFailed++; + pCtx->data.slv.consCrcFailed++; - if (lctrSlvConnIsr.consCrcFailed >= LCTR_MAX_CONS_CRC) + if (pCtx->data.slv.consCrcFailed >= LCTR_MAX_CONS_CRC) { /* Close connection event. */ BbSetBodTerminateFlag(); @@ -665,12 +749,12 @@ void lctrSlvConnRxCompletion(BbOpDesc_t *pOp, uint8_t *pRxBuf, uint8_t status) { pNextRxBuf = lctrProcessRxAck(pCtx); txPduIsAcked = lctrProcessTxAck(pCtx); + } - if (!pCtx->data.slv.initAckRcvd && - txPduIsAcked) - { - pCtx->data.slv.initAckRcvd = TRUE; - } + if (!pCtx->data.slv.initAckRcvd && + txPduIsAcked) + { + pCtx->data.slv.initAckRcvd = TRUE; } /*** Setup for transmit ***/ @@ -683,7 +767,7 @@ SetupTx: goto PostProcessing; } - /* Tx llid is obtained from lctrSetupForTx(). */ + /* Tx LLID is obtained from lctrSetupForTx(). */ if ((pCtx->isSlvReadySent == FALSE) && (pCtx->isFirstNonCtrlPdu == TRUE) && (lctrGetConnOpFlag(pCtx, LL_OP_MODE_FLAG_SLV_DELAY_LLCP_STARTUP))) diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_init_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_init_master.c index 4f02124df3..cb8faef4f8 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_init_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_init_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master advertising event ISR callbacks. + * \file + * \brief Link layer controller master advertising event ISR callbacks. */ /*************************************************************************************************/ @@ -128,6 +129,10 @@ bool_t lctrMstInitiateAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf) lctrMstInit.data.init.localRpa = localAddr; BbBleResListUpdateLocal(pScan->filtResults.peerIdAddrRand, pScan->filtResults.peerIdAddr, &localAddr); } + else + { + lctrMstInit.data.init.localRpa = 0; + } } else { @@ -152,6 +157,15 @@ bool_t lctrMstInitiateAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf) lctrMstInit.data.init.localRpa = 0; } +#if (LL_ENABLE_TESTER) + if (llTesterCb.auxReq.len) + { + /* Overriding CONNECT_IND from test script. */ + memcpy(pScan->pTxReqBuf, llTesterCb.auxReq.buf, llTesterCb.auxReq.len); + pScan->txReqLen = llTesterCb.auxReq.len; + } +#endif + lctrPackAdvbPduHdr(pScan->pTxReqBuf, &lctrMstInit.reqPduHdr); /* Update txWinOffset field in CONN_IND PDU. */ @@ -160,6 +174,24 @@ bool_t lctrMstInitiateAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf) UINT16_TO_BUF(pScan->pTxReqBuf + LCTR_CONN_IND_TX_WIN_OFFSET, txWinOffset); lctrMstInit.data.init.connInd.txWinOffset = txWinOffset; +#if (LL_ENABLE_TESTER) + switch (llTesterCb.connFirstCePos) + { + case LL_TESTER_FIRST_CE_POS_BEGIN: + /* BOD is not scheduled; force time adjustment here. */ + pCtx->connBod.due = advEndTs + BB_US_TO_BB_TICKS(txWinOffsetUsec + LL_BLE_TIFS_US + LCTR_CONN_IND_PKT_1M_US); + break; + case LL_TESTER_FIRST_CE_POS_END: + /* BOD is not scheduled; force time adjustment here. */ + pCtx->connBod.due = advEndTs + BB_US_TO_BB_TICKS(txWinOffsetUsec + LCTR_CONN_IND_US(lctrMstInit.data.init.connInd.txWinSize - 1) + LL_BLE_TIFS_US + LCTR_CONN_IND_PKT_1M_US); + break; + case LL_TESTER_FIRST_CE_POS_NORMAL: + default: + break; + } + llTesterCb.connFirstCePos = LL_TESTER_FIRST_CE_POS_NORMAL; +#endif + if (txWinOffsetUsec < LCTR_CONN_IND_US(LCTR_DATA_CHAN_DLY)) { LL_TRACE_WARN1("AE too close to initial CE deltaUsec=%u, suppressed LL_CONN_IND delivery", BB_TICKS_TO_US(lctrMstInit.data.init.firstCeDue - advEndTs)); @@ -207,6 +239,14 @@ bool_t lctrMstInitiateAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf) /*************************************************************************************************/ bool_t lctrMstConnIndTxCompHandler(BbOpDesc_t *pOp, const uint8_t *pIndBuf) { +#if (LL_ENABLE_TESTER == TRUE) + if (llTesterCb.auxReq.len) + { + /* Do not establish connection when CONNECT_IND is overridden. */ + return FALSE; + } +#endif + WSF_ASSERT(pOp->protId == BB_PROT_BLE); WSF_ASSERT(pOp->prot.pBle->chan.opType == BB_BLE_OP_MST_ADV_EVENT); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_init_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_init_master_ae.c index ae88d38058..3cd53b11af 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_init_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_isr_init_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master advertising event ISR callbacks. + * \file + * \brief Link layer controller master advertising event ISR callbacks. */ /*************************************************************************************************/ @@ -55,10 +56,14 @@ static void lctrMstExtInitiateScanReschedule(lctrExtScanCtx_t *pExtInitCtx) /*** Reschedule primary operation ***/ + /* Recover primary scan BOD min duration so that its run will be guaranteed in BB. */ + pOp->minDurUsec = LCTR_MIN_SCAN_USEC; + /* Reset due time to start of scan window. */ pOp->due = pExtInitCtx->data.init.scanWinStart; - if ((pScan->elapsedUsec + pOp->minDurUsec) < LCTR_BLE_TO_US(pExtInitCtx->data.init.param.scanWindow)) + if ((pExtInitCtx->data.init.param.scanInterval != pExtInitCtx->data.init.param.scanWindow) && + ((pScan->elapsedUsec + pOp->minDurUsec) < LCTR_BLE_TO_US(pExtInitCtx->data.init.param.scanWindow))) { const uint32_t min = BB_US_TO_BB_TICKS(pScan->elapsedUsec); const uint32_t max = BB_BLE_TO_BB_TICKS(pExtInitCtx->data.init.param.scanWindow); @@ -133,6 +138,7 @@ void lctrMstExtPreInitiateExecHandler(BbOpDesc_t *pOp) * before initiate's scan operation sets up its executing duration (i.e. "pre-execute"). */ pExtInitCtx->data.init.firstCeDue = lctrMstConnAdjustOpStart(LCTR_GET_CONN_CTX(pExtInitCtx->data.init.connHandle), pOp->due, + pOp->minDurUsec, &pExtInitCtx->data.init.connInd); pExtInitCtx->data.init.connBodLoaded = TRUE; } @@ -247,6 +253,7 @@ void lctrMstExtInitiateEndOp(BbOpDesc_t *pOp) pExtInitCtx->data.init.firstCeDue = lctrMstConnAdjustOpStart(LCTR_GET_CONN_CTX(pExtInitCtx->data.init.connHandle), pExtInitCtx->auxScanBod.due, + pExtInitCtx->auxScanBod.minDurUsec, &pExtInitCtx->data.init.connInd); pExtInitCtx->data.init.connBodLoaded = TRUE; } @@ -301,6 +308,14 @@ void lctrMstAuxInitiateEndOp(BbOpDesc_t *pOp) /*************************************************************************************************/ bool_t lctrMstExtConnIndTxCompHandler(BbOpDesc_t *pOp, const uint8_t *pIndBuf) { +#if (LL_ENABLE_TESTER == TRUE) + if (llTesterCb.auxReq.len) + { + /* Do not establish connection when AUX_CONNECT_REQ is overridden. */ + return FALSE; + } +#endif + WSF_ASSERT(pOp->protId == BB_PROT_BLE); WSF_ASSERT(pOp->prot.pBle->chan.opType == BB_BLE_OP_MST_ADV_EVENT); @@ -337,7 +352,7 @@ bool_t lctrMstInitiateExtAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf) uint32_t advEndTs = pScan->advStartTs + BB_US_TO_BB_TICKS(SchBleCalcAdvPktDurationUsec(pBle->chan.rxPhy, pScan->advRxPhyOptions, - pScan->filtResults.pduLen)); + LL_ADV_HDR_LEN + pScan->filtResults.pduLen)); /*** Transmit response PDU processing. ***/ @@ -400,11 +415,20 @@ bool_t lctrMstInitiateExtAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf) pCtx->data.init.localRpa = 0; } + if (lmgrCb.features & LL_FEAT_CH_SEL_2) + { + pCtx->reqPduHdr.chSel = LL_CH_SEL_2; + } + else + { + pCtx->reqPduHdr.chSel = LL_CH_SEL_1; + } + lctrPackAdvbPduHdr(pScan->pTxReqBuf, &pCtx->reqPduHdr); /* Update txWinOffset field in CONN_IND PDU. */ uint32_t txWinOffsetUsec = BB_TICKS_TO_US(pCtx->data.init.firstCeDue - advEndTs) - LL_BLE_TIFS_US - - SchBleCalcAdvPktDurationUsec(pBle->chan.txPhy, pScan->advRxPhyOptions, LL_CONN_IND_PDU_LEN); /* Assume conn_ind uses the same PHY as adv_ind. */ + SchBleCalcAdvPktDurationUsec(pBle->chan.txPhy, pScan->advRxPhyOptions, LL_ADV_HDR_LEN + LL_CONN_IND_PDU_LEN); /* Assume conn_ind uses the same PHY as adv_ind. */ uint16_t txWinOffset = LCTR_US_TO_CONN_IND(txWinOffsetUsec) - LCTR_DATA_CHAN_DLY; UINT16_TO_BUF(pScan->pTxReqBuf + LCTR_CONN_IND_TX_WIN_OFFSET, txWinOffset); pCtx->data.init.connInd.txWinOffset = txWinOffset; @@ -541,6 +565,17 @@ void lctrMstInitiateRxExtAdvPktPostProcessHandler(BbOpDesc_t *pOp, const uint8_t pOp->minDurUsec = 0; /* Update primary scan BOD min duration so that secondary scan can be scheduled. */ + /* TODO */ + /* Because of scheduling conflict between preallocated connection bod and aux scan bod, */ + /* connection cannot be established with small connection interval(< 30ms) when coded phy is used. */ + lctrInitiateMsg_t *pInitMsg = (lctrInitiateMsg_t *)pLctrMsg; + if ((auxPhy == BB_PHY_BLE_CODED) && (LCTR_CONN_IND_US(pExtInitCtx->data.init.connInterval) < 30000)) + { + lctrScanNotifyHostInitiateError(LL_ERROR_CODE_CONN_FAILED_TO_ESTABLISH, pInitMsg->peerAddrType, pInitMsg->peerAddr); + lctrSendExtInitMsg(pExtInitCtx, LCTR_EXT_INIT_MSG_RESET); + break; + } + uint32_t endTs = pScan->advStartTs + BB_US_TO_BB_TICKS(SchBleCalcAdvPktDurationUsec(pBle->chan.rxPhy, pScan->advRxPhyOptions, LL_ADV_HDR_LEN + pScan->filtResults.pduLen)); lctrMstAuxDiscoverOpCommit(pExtInitCtx, &auxPtr, pScan->advStartTs, endTs); @@ -636,9 +671,9 @@ bool_t lctrMstInitiateRxAuxAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf lctrConnCtx_t *pCtx = LCTR_GET_CONN_CTX(pExtInitCtx->data.init.connHandle); uint32_t connReqEndTs = pAuxScan->auxStartTs + - BB_US_TO_BB_TICKS(SchBleCalcAdvPktDurationUsec(pBle->chan.rxPhy, pAuxScan->auxRxPhyOptions, advHdr.len) + + BB_US_TO_BB_TICKS(SchBleCalcAdvPktDurationUsec(pBle->chan.rxPhy, pAuxScan->auxRxPhyOptions, LL_ADV_HDR_LEN + advHdr.len) + LL_BLE_TIFS_US + - SchBleCalcAdvPktDurationUsec(pBle->chan.txPhy, (pBle->chan.tifsTxPhyOptions != BB_PHY_OPTIONS_DEFAULT) ? pBle->chan.tifsTxPhyOptions : pAuxScan->auxRxPhyOptions, LL_CONN_IND_PDU_LEN)); + SchBleCalcAdvPktDurationUsec(pBle->chan.txPhy, (pBle->chan.tifsTxPhyOptions != BB_PHY_OPTIONS_DEFAULT) ? pBle->chan.tifsTxPhyOptions : pAuxScan->auxRxPhyOptions, LL_ADV_HDR_LEN + LL_CONN_IND_PDU_LEN)); /* Update auxiliary connection request header's advertiser address. */ uint8_t *pAuxConnReqAdvA = pAuxScan->pTxAuxReqBuf + LL_ADV_HDR_LEN + BDA_ADDR_LEN; @@ -691,6 +726,7 @@ bool_t lctrMstInitiateRxAuxAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf #if (LL_ENABLE_TESTER) if (llTesterCb.auxReq.len) { + /* Overriding AUX_CONNECT_REQ from test script. */ memcpy(pAuxScan->pTxAuxReqBuf, llTesterCb.auxReq.buf, llTesterCb.auxReq.len); pAuxScan->txAuxReqLen = llTesterCb.auxReq.len; @@ -709,7 +745,7 @@ bool_t lctrMstInitiateRxAuxAdvPktHandler(BbOpDesc_t *pOp, const uint8_t *pAdvBuf /* Update txWinOffset field in AUX_CONN_REQ PDU. */ uint32_t txWinOffsetUsec = BB_TICKS_TO_US(pExtInitCtx->data.init.firstCeDue - connReqEndTs); uint16_t txWinOffset = LCTR_US_TO_CONN_IND(txWinOffsetUsec); - unsigned int chanDelay; + uint16_t chanDelay; switch (pBle->chan.rxPhy) { case BB_PHY_BLE_1M: @@ -798,7 +834,7 @@ bool_t lctrMstInitiateRxAuxConnRspHandler(BbOpDesc_t *pOp, const uint8_t *pRspBu params.localAddr = pExtInitCtx->extAdvHdr.tgtAddr; params.localAddrRand = advHdr.rxAddrRnd; - if (BbBleExtPduFiltCheck(¶ms, &pOp->prot.pBle->pduFilt, FALSE, &pAuxScan->filtResults) == FALSE) + if (BbBleExtPduFiltCheck(¶ms, &pOp->prot.pBle->pduFilt, TRUE, &pAuxScan->filtResults) == FALSE) { LL_TRACE_WARN0("LL_PDU_AUX_CONNECT_RSP failed PDU filtering."); } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main.c index f7f8958f31..25de41a96c 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Main link layer controller implementation file. + * \file + * \brief Main link layer controller implementation file. */ /*************************************************************************************************/ @@ -290,3 +291,32 @@ void lctrNotifyHostHwErrInd(uint8_t code) LmgrSendEvent((LlEvt_t *)&evt); } + +/*************************************************************************************************/ +/*! + * \brief Compute the window widening delay in microseconds. + * + * \param unsyncTimeUsec Unsynchronized time in microseconds. + * \param caPpm Total clock accuracy. + * + * \return Window widening delay in microseconds. + */ +/*************************************************************************************************/ +uint32_t lctrCalcWindowWideningUsec(uint32_t unsyncTimeUsec, uint32_t caPpm) +{ + if (lmgrGetOpFlag(LL_OP_MODE_FLAG_ENA_WW)) + { + /* Largest unsynchronized time is 1,996 seconds (interval=4s and latency=499) and + * largest total accuracy is 1000 ppm. */ + /* coverity[overflow_before_widen] */ + uint64_t wwDlyUsec = LL_MATH_DIV_10E6(((uint64_t)unsyncTimeUsec * caPpm) + + 999999); /* round up */ + + /* Reduce to 32-bits and always round up to a sleep clock tick. */ + return wwDlyUsec + pLctrRtCfg->ceJitterUsec + LL_WW_RX_DEVIATION_USEC; + } + else + { + return 0; + } +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_master.c index e8b10e33bf..a3b6092836 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master scanning operation builder implementation file. + * \file + * \brief Link layer controller master scanning operation builder implementation file. */ /*************************************************************************************************/ @@ -417,7 +418,8 @@ void lctrMstDiscoverBuildOp(void) /*** Commit operation ***/ - pOp->minDurUsec = pOp->maxDurUsec = LCTR_BLE_TO_US(lctrMstScan.scanParam.scanWindow); + pOp->minDurUsec = LCTR_MIN_SCAN_USEC; + pOp->maxDurUsec = LCTR_BLE_TO_US(lctrMstScan.scanParam.scanWindow); lctrMstScan.selfTerm = FALSE; lctrMstScan.shutdown = FALSE; @@ -602,17 +604,16 @@ void lctrAdvRptGenerateLegacyHash(uint64_t *pHash, uint8_t addrType, uint64_t ad void lctrAdvRptGenerateExtHash(uint64_t *pHash, uint8_t addrType, uint64_t addr, uint8_t eventType, uint8_t sid, uint16_t did) { - addrType &= 0x3; /* 2 valid bits. */ - eventType &= 0x1F; /* 5 valid bits; ignore Data Status. */ - sid &= 0xF; /* 4 valid bits. */ + addrType &= 0x3; /* 2 valid bits. */ + eventType &= 0x1F; /* 5 valid bits; ignore Data Status. */ + sid &= 0xF; /* 4 valid bits. */ + did &= 0xFFF; /* 12 valid bits. */ - /* Fit packet identifier into 8 bits. */ - uint8_t pktId = did ^ (did >> 4) ^ sid ^ (sid << 4); - - *pHash = addr; /* 48 bits. */ - *pHash |= ((uint64_t)addrType << 48); /* 2 bits. */ - *pHash |= ((uint64_t)eventType << 50); /* 5 bits. */ - *pHash |= ((uint64_t)pktId << 55); /* 8 bits. */ + *pHash = addr & 0x1FFFFFFFFFF; /* 41 LSB bits. */ + *pHash |= ((uint64_t)addrType << 41); /* 2 bits. */ + *pHash |= ((uint64_t)eventType << 43); /* 5 bits. */ + *pHash |= ((uint64_t)sid << 48); /* 4 bits. */ + *pHash |= ((uint64_t)did << 52); /* 12 bits. */ } /*************************************************************************************************/ @@ -790,3 +791,28 @@ void lctrAdvReportsDec(void) lmgrMstScanCb.numAdvReport--; WSF_CS_EXIT(); } + +/*************************************************************************************************/ +/*! + * \brief Check whether scan is enabled or not. + * + * \return True if scanner enabled. False if not. + */ +/*************************************************************************************************/ +bool_t LctrMstScanIsEnabled(void) +{ + return (lctrMstScan.state != LCTR_SCAN_STATE_DISABLED); +} + +/*************************************************************************************************/ +/*! + * \brief Check whether private address is used for scanner + * + * \return Returns True if scanner is using private addresses. False if not. + */ +/*************************************************************************************************/ +bool_t LctrMstScanIsPrivAddr(void) +{ + /* Check for private Addr bit. */ + return (lctrMstScan.scanParam.ownAddrType & LL_ADDR_RANDOM_BIT); +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_master_ae.c index 5215b6a68e..47fe2f4d26 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master scanning operation builder implementation file. + * \file + * \brief Link layer controller master scanning operation builder implementation file. */ /*************************************************************************************************/ @@ -48,24 +49,27 @@ lctrExtScanCtx_t lctrMstExtScanTbl[LCTR_SCAN_PHY_TOTAL]; // TODO: share memor /*! \brief Extended scan control block. */ lctrExtScanCtrlBlk_t lctrMstExtScan; -/*! \brief Periodic scan control block. */ +/*! \brief Periodic sync create control block. */ lctrPerCreateSyncCtrlBlk_t lctrPerCreateSync; +/*! \brief Periodic sync transfer control block. */ +lctrPerTransferSyncCtrlBlk_t lctrPerTransferSync; + /*! \brief Periodic Advertising message data. */ LctrPerScanMsg_t *pLctrMstPerScanMsg; /*! \brief Periodic scan context table. */ lctrPerScanCtx_t lctrMstPerScanTbl[LL_MAX_PER_SCAN]; -/*! \brief Pointer to periodic scan context table. */ -lctrPerScanCtx_t *pLctrPerScanTbl; - /*! \brief Extended scan data buffer table. */ static uint8_t *lctrMstExtScanDataBufTbl[LCTR_SCAN_PHY_TOTAL]; /*! \brief Periodic scan data buffer table. */ static uint8_t *lctrMstPerScanDataBufTbl[LL_MAX_PER_SCAN]; +/*! \brief SyncInfo for periodic sync transfer. */ +lctrSyncInfo_t trsfSyncInfo; + /*************************************************************************************************/ /*! * \brief Master create sync message dispatcher. @@ -82,6 +86,22 @@ static void lctrMstCreateSyncDisp(LctrPerScanMsg_t *pMsg) lctrMstCreateSyncExecuteSm(pMsg->hdr.event); } +/*************************************************************************************************/ +/*! + * \brief Periodic sync transfer recipient message dispatcher. + * + * \param pMsg Pointer to message buffer. + * + * \return None. + */ +/*************************************************************************************************/ +static void lctrMstTransferSyncDisp(LctrPerScanMsg_t *pMsg) +{ + pLctrMstPerScanMsg = pMsg; + + lctrMstTransferSyncExecuteSm(pMsg->hdr.event); +} + /*************************************************************************************************/ /*! * \brief Periodic scanning message dispatcher. @@ -325,6 +345,12 @@ static void lctrMstSendPendingAdvRptHandler(void) { lctrExtScanCtx_t *pExtScanCtx = &lctrMstExtScanTbl[i]; + if (pExtScanCtx->data.scan.auxAdvRptState == LCTR_RPT_STATE_COMP) + { + LmgrSendExtAdvRptInd(&pExtScanCtx->data.scan.auxAdvRpt); + pExtScanCtx->data.scan.auxAdvRptState = LCTR_RPT_STATE_IDLE; + } + if (pExtScanCtx->data.scan.advRptState == LCTR_RPT_STATE_COMP) { LmgrSendExtAdvRptInd(&pExtScanCtx->data.scan.advRpt); @@ -339,7 +365,11 @@ static void lctrMstSendPendingAdvRptHandler(void) if (pPerScanCtx->advRptState == LCTR_RPT_STATE_COMP) { - LmgrSendPerAdvRptInd(&pPerScanCtx->advRpt); + if (!pPerScanCtx->repDisabled) + { + LmgrSendPerAdvRptInd(&pPerScanCtx->advRpt); + } + pPerScanCtx->advRptState = LCTR_RPT_STATE_IDLE; } } @@ -494,8 +524,6 @@ uint8_t lctrMstExtDiscoverBuildOp(lctrExtScanCtx_t *pExtScanCtx) break; } - pExtScanCtx->reqPduHdr.chSel = LL_CH_SEL_1; - /*** BLE Scan Setup: Rx scan response packet ***/ pScan->rxRspCback = lctrMstDiscoverRxLegacyScanRspHandler; @@ -523,8 +551,15 @@ uint8_t lctrMstExtDiscoverBuildOp(lctrExtScanCtx_t *pExtScanCtx) } /*** Commit operation ***/ - - pOp->minDurUsec = pOp->maxDurUsec = LCTR_BLE_TO_US(pExtScanCtx->scanParam.scanWindow); + pOp->maxDurUsec = LCTR_BLE_TO_US(pExtScanCtx->scanParam.scanWindow); + if (lmgrCb.numExtScanPhys == 1) + { + pOp->minDurUsec = LCTR_MIN_SCAN_USEC; + } + else + { + pOp->minDurUsec = pOp->maxDurUsec - BB_SCH_SETUP_DELAY_US; + } pExtScanCtx->selfTerm = FALSE; pExtScanCtx->shutdown = FALSE; @@ -707,7 +742,7 @@ void lctrMstAuxDiscoverOpCommit(lctrExtScanCtx_t *pExtScanCtx, lctrAuxPtr_t *pAu } pOp->due = startTs + BB_US_TO_BB_TICKS(auxOffsetUsec); - SchBleCalcAdvOpDuration(pOp); + SchBleCalcAdvOpDuration(pOp, 0); if (SchInsertAtDueTime(pOp, NULL)) { @@ -738,7 +773,13 @@ void LctrMstExtScanInit(void) /* Add extended scan event dispatchers. */ lctrEventHdlrTbl[LCTR_EVENT_RX_ADVB] = lctrMstSendPendingAdvRptHandler; + /* Add utility function pointers. */ + LctrMstExtScanEnabled = LctrMstExtScanIsEnabled; + LctrMstExtScanDefaults(); + + lmgrPersistCb.extScanCtxSize = sizeof(lctrExtScanCtx_t); + } /*************************************************************************************************/ @@ -922,6 +963,35 @@ void LctrMstExtScanSetParam(uint8_t scanPhy, uint8_t ownAddrType, uint8_t scanFi lctrMstExtScanTbl[scanPhy].scanParam.scanFiltPolicy = scanFiltPolicy; } +/*************************************************************************************************/ +/*! + * \brief Check whether ext scan is enabled or not. + * + * \param scanPhy Extended scanning PHY. + * + * \return True if scan is not disabled, false if not. + */ +/*************************************************************************************************/ +bool_t LctrMstExtScanIsEnabled(uint8_t scanPhy) +{ + return (lctrMstExtScanTbl[scanPhy].state != LCTR_EXT_SCAN_STATE_DISABLED); +} + +/*************************************************************************************************/ +/*! + * \brief Check if ext scan is using private addresses. + * + * \param scanPhy Extended scanning PHY. + * + * \return True if scan is not disabled, false if not. + */ +/*************************************************************************************************/ +bool_t LctrMstExtScanIsPrivAddr(uint8_t scanPhy) +{ + /* Check the private address bit. */ + return (lctrMstExtScanTbl[scanPhy].scanParam.ownAddrType & LL_ADDR_RANDOM_BIT); +} + /*************************************************************************************************/ /*! * \brief Send internal extended scan subsystem message. @@ -950,18 +1020,19 @@ void lctrSendExtScanMsg(lctrExtScanCtx_t *pExtScanCtx, uint8_t event) /*! * \brief Send internal periodic create sync subsystem message. * + * \param pCtx Periodic scanning context. * \param event Periodic scan event. * * \return None. */ /*************************************************************************************************/ -void lctrSendCreateSyncMsg(uint8_t event) +void lctrSendCreateSyncMsg(lctrPerScanCtx_t *pCtx, uint8_t event) { lctrMsgHdr_t *pMsg; if ((pMsg = WsfMsgAlloc(sizeof(lctrMsgHdr_t))) != NULL) { - pMsg->dispId = LCTR_DISP_PER_CREATE_SYNC; + pMsg->dispId = pCtx->createDispId; pMsg->event = event; WsfMsgSend(lmgrPersistCb.handlerId, pMsg); @@ -1070,6 +1141,28 @@ void LctrMstPerCreateSyncInit(void) } } +/*************************************************************************************************/ +/*! + * \brief Initialize link layer controller resources for periodic sync transfer recipient. + * + * \return None. + */ +/*************************************************************************************************/ +void LctrMstPerTransferSyncInit(void) +{ + /* Add transfer sync reset handler. */ + lctrResetHdlrTbl[LCTR_DISP_TRANFER_SYNC] = NULL; /* Not needed. */ + + /* Add transfer sync task message dispatchers. */ + lctrMsgDispTbl[LCTR_DISP_TRANFER_SYNC] = (LctrMsgDisp_t)lctrMstTransferSyncDisp; + + /* Set supported features. */ + if (pLctrRtCfg->btVer >= LL_VER_BT_CORE_SPEC_5_1) + { + lmgrPersistCb.featuresDefault |= LL_FEAT_PAST_RECIPIENT; + } +} + /*************************************************************************************************/ /*! * \brief Initialize link layer controller resources for master periodic scanning. @@ -1099,12 +1192,11 @@ void LctrMstPerScanInit(void) * \brief Build periodic scan operation. * * \param pPerScanCtx Periodic scan context. - * \param pMsg Periodic create sync message. * * \return Status error code. */ /*************************************************************************************************/ -uint8_t lctrMstPerScanBuildOp(lctrPerScanCtx_t *pPerScanCtx, lctrPerCreateSyncMsg_t *pMsg) +uint8_t lctrMstPerScanBuildOp(lctrPerScanCtx_t *pPerScanCtx) { BbOpDesc_t * const pOp = &pPerScanCtx->bod; BbBleData_t * const pBle = &pPerScanCtx->bleData; @@ -1119,7 +1211,7 @@ uint8_t lctrMstPerScanBuildOp(lctrPerScanCtx_t *pPerScanCtx, lctrPerCreateSyncMs pOp->protId = BB_PROT_BLE; pOp->prot.pBle = pBle; pOp->endCback = lctrMstPerScanEndOp; - pOp->abortCback = lctrMstPerScanEndOp; + pOp->abortCback = lctrMstPerScanAbortOp; pOp->pCtx = pPerScanCtx; /*** BLE General Setup ***/ @@ -1163,7 +1255,7 @@ void lctrMstPerScanOpCommit(lctrExtScanCtx_t *pExtScanCtx, lctrAuxPtr_t *pAuxPtr pPerScanCtx->chanParam.chanMask = pSyncInfo->chanMap; pPerScanCtx->chanParam.usedChSel = LL_CH_SEL_2; - lctrPeriodicBuildRemapTable(&pPerScanCtx->chanParam); + LmgrBuildRemapTable(&pPerScanCtx->chanParam); pPerScanCtx->chanParam.chIdentifier = (pSyncInfo->accAddr >> 16) ^ (pSyncInfo->accAddr >> 0); @@ -1189,10 +1281,11 @@ void lctrMstPerScanOpCommit(lctrExtScanCtx_t *pExtScanCtx, lctrAuxPtr_t *pAuxPtr /*** Commit operation ***/ uint32_t syncOffsetUsec; uint32_t offsetUsec = pSyncInfo->syncOffset * ((pSyncInfo->offsetUnits == LCTR_OFFS_UNITS_30_USEC) ? 30 : 300); + offsetUsec += (LL_SYNC_OFFS_ADJUST_USEC * pSyncInfo->offsetAdjust); pPerScanCtx->lastAnchorPoint = startTs + BB_US_TO_BB_TICKS(offsetUsec); pPerScanCtx->lastActiveEvent = pPerScanCtx->eventCounter; uint32_t caPpm = lctrCalcTotalAccuracy(pSyncInfo->sca); - uint32_t wwUsec = lctrCalcAuxAdvWindowWideningUsec(offsetUsec, caPpm); + uint32_t wwUsec = lctrCalcWindowWideningUsec((offsetUsec + (pSyncInfo->offsetUnits == LCTR_OFFS_UNITS_30_USEC) ? 30 : 300), caPpm); syncOffsetUsec = offsetUsec - wwUsec; pPerScanCtx->rxSyncDelayUsec = pBle->op.mstPerScan.rxSyncDelayUsec = (wwUsec << 1) + ((pSyncInfo->offsetUnits == LCTR_OFFS_UNITS_30_USEC) ? 30 : 300); /* rounding compensation */ int16_t dueOffsetUsec = (offsetUsec - wwUsec) - BB_TICKS_TO_US(BB_US_TO_BB_TICKS(offsetUsec) - BB_US_TO_BB_TICKS(wwUsec)); @@ -1205,13 +1298,13 @@ void lctrMstPerScanOpCommit(lctrExtScanCtx_t *pExtScanCtx, lctrAuxPtr_t *pAuxPtr pOp->due = startTs + BB_US_TO_BB_TICKS(syncOffsetUsec); pOp->dueOffsetUsec = WSF_MAX(dueOffsetUsec, 0); - SchBleCalcAdvOpDuration(pOp); + SchBleCalcAdvOpDuration(pOp, 0); pPerScanCtx->minDurUsec = pOp->minDurUsec; uint16_t numUnsyncIntervals = 0; while (TRUE) { - if (SchInsertAtDueTime(pOp, NULL)) + if (SchInsertAtDueTime(pOp, lctrPerScanResolveConflict)) { LL_TRACE_INFO1(" >>> Periodic scan started, handle=%u <<<", LCTR_GET_PER_SCAN_HANDLE(pPerScanCtx)); LL_TRACE_INFO1(" pOp=%08x", pOp); @@ -1230,7 +1323,7 @@ void lctrMstPerScanOpCommit(lctrExtScanCtx_t *pExtScanCtx, lctrAuxPtr_t *pAuxPtr uint32_t unsyncTimeUsec = BB_TICKS_TO_US(pPerScanCtx->perInter * numUnsyncIntervals); uint32_t unsyncTime = BB_US_TO_BB_TICKS(unsyncTimeUsec); - uint32_t wwTotalUsec = lctrCalcAuxAdvWindowWideningUsec(unsyncTimeUsec, caPpm); + uint32_t wwTotalUsec = lctrCalcWindowWideningUsec(unsyncTimeUsec, caPpm); uint32_t wwTotal = BB_US_TO_BB_TICKS(wwTotalUsec); dueOffsetUsec = (unsyncTimeUsec - wwTotalUsec) - BB_TICKS_TO_US(unsyncTime - wwTotal); @@ -1244,6 +1337,193 @@ void lctrMstPerScanOpCommit(lctrExtScanCtx_t *pExtScanCtx, lctrAuxPtr_t *pAuxPtr lctrPerCreateSync.createSyncPending = TRUE; } +/*************************************************************************************************/ +/*! + * \brief Commit periodic sync transferred scan operation. + * + * \param connHandle Connection handle. + * \param ceCounter Reference connection event counter. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrMstPerScanTransferOpCommit(uint16_t connHandle) +{ + lctrConnCtx_t *pConnCtx = LCTR_GET_CONN_CTX(connHandle); + BbOpDesc_t * const pConnOp = &pConnCtx->connBod; + uint32_t refTime; + uint16_t peC; /* paEventCounter for the AUX_SYNC_IND PDU that we are attempting to receive. */ + uint32_t startTs; /* Anchor point of the connection event. */ + uint16_t numInterval; + + /* Pre-resolve common structures for efficient access. */ + lctrPerScanCtx_t *pPerScanCtx = lctrPerTransferSync.pPerScanCtx; + BbOpDesc_t * const pOp = &pPerScanCtx->bod; + BbBleData_t * const pBle = &pPerScanCtx->bleData; + + /* reporting can be initially disabled. */ + if (pConnCtx->syncMode == LL_SYNC_TRSF_MODE_REP_DISABLED) + { + pPerScanCtx->repDisabled = TRUE; + } + + pPerScanCtx->syncTimeOutMs = LCTR_PER_SYNC_TIMEOUT_TO_MS(pConnCtx->syncTimeout); + pPerScanCtx->skip = pConnCtx->syncSkip; + pPerScanCtx->sca = trsfSyncInfo.sca; + + /*** BLE General Setup for Channel ***/ + + pPerScanCtx->chanParam.chanMask = trsfSyncInfo.chanMap; + pPerScanCtx->chanParam.usedChSel = LL_CH_SEL_2; + + lctrPeriodicBuildRemapTable(&pPerScanCtx->chanParam); + pPerScanCtx->chanParam.chIdentifier = (trsfSyncInfo.accAddr >> 16) ^ + (trsfSyncInfo.accAddr >> 0); + + pBle->chan.accAddr = trsfSyncInfo.accAddr; + pBle->chan.crcInit = trsfSyncInfo.crcInit; + pBle->chan.txPhy = pBle->chan.rxPhy = pPerScanCtx->rxPhys; + +#if (LL_ENABLE_TESTER == TRUE) + pBle->chan.accAddrRx = llTesterCb.advAccessAddrRx ^ pBle->chan.accAddr; + pBle->chan.accAddrTx = llTesterCb.advAccessAddrTx ^ pBle->chan.accAddr; + pBle->chan.crcInitRx = llTesterCb.advCrcInitRx ^ pBle->chan.crcInit; + pBle->chan.crcInitTx = llTesterCb.advCrcInitTx ^ pBle->chan.crcInit; +#endif + + /* Offset from ceRef to PEa(paEventCounter). */ + uint32_t offsetUsec = trsfSyncInfo.syncOffset * ((trsfSyncInfo.offsetUnits == LCTR_OFFS_UNITS_30_USEC) ? 30 : 300); + offsetUsec += (LL_SYNC_OFFS_ADJUST_USEC * trsfSyncInfo.offsetAdjust); + + /* Calculate reference time: ceRef + offset. */ + refTime = lctrConnGetAnchorPoint(pConnCtx, lctrPerTransferSync.ceRef); + refTime += BB_US_TO_BB_TICKS(offsetUsec); + + /* refTime needs to be future from the next connection event. */ + startTs = lctrConnGetAnchorPoint(pConnCtx, pConnCtx->eventCounter); + peC = trsfSyncInfo.eventCounter; + + if ((refTime - (startTs + BB_US_TO_BB_TICKS(pConnOp->minDurUsec))) < LCTR_SCH_MAX_SPAN) + { + numInterval = (refTime - (startTs + BB_US_TO_BB_TICKS(pConnOp->minDurUsec))) / pPerScanCtx->perInter; + refTime -= numInterval * pPerScanCtx->perInter; + peC -= numInterval; + offsetUsec = BB_TICKS_TO_US(refTime - startTs); + } + else /* refTime is in the past. */ + { + numInterval = 1 + ((startTs + BB_US_TO_BB_TICKS(pConnOp->minDurUsec)) - refTime) / pPerScanCtx->perInter; + refTime += numInterval * pPerScanCtx->perInter; + peC += numInterval; + offsetUsec = BB_TICKS_TO_US(refTime - startTs); + } + + pPerScanCtx->eventCounter = peC; + pBle->chan.chanIdx = lctrPeriodicSelectNextChannel(&pPerScanCtx->chanParam, pPerScanCtx->eventCounter); + + /* Total drift D = (Da + Db) x (1 + CAa + CAb + CAc) */ + /* Da : Drift of the periodic advertising */ + /* Db : Drift of B's clock between CEs and PEb */ + uint16_t scaPpmA = (trsfSyncInfo.sca < LCTR_MAX_SCA) ? scaPpmTbl[trsfSyncInfo.sca] : scaPpmTbl[LCTR_MAX_SCA]; + uint16_t scaPpmB = (lctrPerTransferSync.scaB < LCTR_MAX_SCA) ? scaPpmTbl[lctrPerTransferSync.scaB] : scaPpmTbl[LCTR_MAX_SCA]; + uint16_t scaPpmC = BbGetClockAccuracy(); + + /* Da = |PEc – PEb| × PAI × (CAa + CAc) */ + uint32_t deltaPA = ((uint16_t)(peC - lctrPerTransferSync.lastPECounter) < LCTR_MAX_INSTANT) ? (uint16_t)(peC - lctrPerTransferSync.lastPECounter) : 0; + deltaPA *= BB_TICKS_TO_US(pPerScanCtx->perInter); + uint32_t dA = lctrCalcWindowWideningUsec(deltaPA, (scaPpmA + scaPpmC)); + + /* Db = |CEt – CEs| × CI × (CAb + CAc) */ + uint32_t deltaCE = ((uint16_t)(lctrPerTransferSync.ceRcvd - lctrPerTransferSync.syncCe) < LCTR_MAX_INSTANT) ? (uint16_t)(lctrPerTransferSync.ceRcvd - lctrPerTransferSync.syncCe) : 0; + deltaCE *= LCTR_CONN_IND_US(pConnCtx->connInterval); + uint32_t dB = lctrCalcWindowWideningUsec(deltaCE, (scaPpmB + scaPpmC)); + + uint32_t wwUsec = 16 + lctrCalcWindowWideningUsec((dA + dB), (1 + scaPpmA + scaPpmB + scaPpmC)); + pPerScanCtx->rxSyncDelayUsec = pBle->op.mstPerScan.rxSyncDelayUsec = (wwUsec << 1) + ((trsfSyncInfo.offsetUnits == LCTR_OFFS_UNITS_30_USEC) ? 30 : 300); /* rounding compensation */ + + LL_TRACE_WARN3("Periodic scan transfer WW=%u: Da=%u, Db=%u", wwUsec, dA, dB); + + pPerScanCtx->lastAnchorPoint = startTs + BB_US_TO_BB_TICKS(offsetUsec); + pPerScanCtx->lastActiveEvent = pPerScanCtx->eventCounter; + pPerScanCtx->initEventCounter = pPerScanCtx->eventCounter; + + pOp->due = startTs + BB_US_TO_BB_TICKS(offsetUsec - wwUsec); + pOp->dueOffsetUsec = 0; + SchBleCalcAdvOpDuration(pOp, 0); + pPerScanCtx->minDurUsec = pOp->minDurUsec; + uint16_t numUnsyncIntervals = 0; + + while (TRUE) + { + if (SchInsertAtDueTime(pOp, lctrPerScanResolveConflict)) + { + LL_TRACE_INFO1(" >>> Periodic scan from transfer started, handle=%u <<<", LCTR_GET_PER_SCAN_HANDLE(pPerScanCtx)); + LL_TRACE_INFO1(" pOp=%08x", pOp); + LL_TRACE_INFO1(" due=%u", pOp->due); + LL_TRACE_INFO1(" eventCounter=%u", pPerScanCtx->eventCounter); + LL_TRACE_INFO1(" pBle->chan.chanIdx=%u", pBle->chan.chanIdx); + break; + } + + LL_TRACE_WARN0("!!! Start periodic scanning from transfer schedule conflict"); + + pPerScanCtx->eventCounter++; + pBle->chan.chanIdx = lctrPeriodicSelectNextChannel(&pPerScanCtx->chanParam, pPerScanCtx->eventCounter); + numUnsyncIntervals++; + + uint32_t unsyncTimeUsec = BB_TICKS_TO_US(pPerScanCtx->perInter * numUnsyncIntervals); + + dA = lctrCalcWindowWideningUsec((deltaPA + unsyncTimeUsec), (scaPpmA + scaPpmC)); + wwUsec = 16 + lctrCalcWindowWideningUsec((dA + dB), (1 + scaPpmA + scaPpmB + scaPpmC)); + + /* Advance to next interval. */ + pOp->due = pPerScanCtx->lastAnchorPoint + BB_US_TO_BB_TICKS(unsyncTimeUsec - wwUsec); + pOp->minDurUsec = pPerScanCtx->minDurUsec + wwUsec; + pBle->op.mstPerScan.rxSyncDelayUsec = pPerScanCtx->rxSyncDelayUsec + (wwUsec << 1); + } +} + +/*************************************************************************************************/ +/*! + * \brief Get number of allocated periodic scan contexts. + * + * \return Number of allocated periodic scan contexts. + */ +/*************************************************************************************************/ +uint8_t lctrMstPerGetNumPerScanCtx(void) +{ + uint8_t numPerScan = 0; + + for (unsigned int index = 0; index < LL_MAX_PER_SCAN; index++) + { + if (lctrMstPerScanTbl[index].enabled) + { + numPerScan++; + } + } + + return numPerScan; +} + +/*************************************************************************************************/ +/*! + * \brief Check if the sync handle is valid or not. + * + * \param syncHandle Periodic sync handle. + * + * \return True is sync handle is valid, False otherwise. + */ +/*************************************************************************************************/ +bool_t lctrMstPerIsSyncHandleValid(uint16_t syncHandle) +{ + if (syncHandle >= LL_MAX_PER_SCAN) + { + return FALSE; + } + + return lctrMstPerScanTbl[syncHandle].enabled; +} + /*************************************************************************************************/ /*! * \brief Allocate a periodic scan context. @@ -1273,7 +1553,7 @@ lctrPerScanCtx_t *lctrAllocPerScanCtx(void) pMsg->dispId = LCTR_DISP_PER_SCAN; pMsg->event = LCTR_PER_SCAN_SUP_TIMEOUT; - /* Update once PHY is known). */ + /* Update once PHY is known. */ pCtx->bleData.chan.txPhy = pCtx->bleData.chan.rxPhy = BB_PHY_BLE_1M; /* Default PHY. */ @@ -1285,3 +1565,137 @@ lctrPerScanCtx_t *lctrAllocPerScanCtx(void) return NULL; } + +/*************************************************************************************************/ +/*! + * \brief Periodic scan conflict resolution handler. + * + * \param pNewOp New BOD. + * \param pExistOp Existing BOD. + * + * \return Prioritized BOD. + * + * Prioritize BLE periodic scan at most risk for termination. + */ +/*************************************************************************************************/ +BbOpDesc_t *lctrPerScanResolveConflict(BbOpDesc_t *pNewOp, BbOpDesc_t *pExistOp) +{ + lctrPerScanCtx_t *pNewCtx = pNewOp->pCtx; + lctrPerScanCtx_t *pExistCtx = pExistOp->pCtx; + + /* Only BLE uses periodic scan. */ + WSF_ASSERT((pNewOp->protId == BB_PROT_BLE) && (pExistOp->protId == BB_PROT_BLE)); + WSF_ASSERT((pNewOp->prot.pBle->chan.opType == BB_BLE_OP_MST_PER_SCAN_EVENT) && + (pExistOp->prot.pBle->chan.opType == BB_BLE_OP_MST_PER_SCAN_EVENT)); + + /* Supervision timeout is imminent (2 PI). */ + LL_TRACE_WARN2("Exit timeout=%u, interval=%u", pExistCtx->tmrSupTimeout.ticks * WSF_MS_PER_TICK * 1000, (uint32_t)(BB_TICKS_TO_US(pExistCtx->perInter) << 1)); + LL_TRACE_WARN2("New timeout=%u, interval=%u", pNewCtx->tmrSupTimeout.ticks * WSF_MS_PER_TICK * 1000, (uint32_t)(BB_TICKS_TO_US(pExistCtx->perInter) << 1)); + if ((pExistCtx->tmrSupTimeout.ticks * WSF_MS_PER_TICK * 1000) < (uint32_t)(BB_TICKS_TO_US(pExistCtx->perInter) << 1)) + { + LL_TRACE_WARN2("!!! Scheduling conflict, imminent SVT: existing handle=%u prioritized over incoming handle=%u", LCTR_GET_PER_SCAN_HANDLE(pExistCtx), LCTR_GET_PER_SCAN_HANDLE(pNewCtx)); + return pExistOp; + } + + if ((pNewCtx->tmrSupTimeout.ticks * WSF_MS_PER_TICK * 1000) < (uint32_t)(BB_TICKS_TO_US(pNewCtx->perInter) << 1)) + { + LL_TRACE_WARN2("!!! Scheduling conflict, imminent SVT: incoming handle=%u prioritized over existing handle=%u", LCTR_GET_PER_SCAN_HANDLE(pNewCtx), LCTR_GET_PER_SCAN_HANDLE(pExistCtx)); + return pNewOp; + } + + /* Less frequent perInterval (4x). */ + + if ((LCTR_PER_INTER_TO_MS(BB_TICKS_TO_US(pExistCtx->perInter)) >> 2) > LCTR_PER_INTER_TO_MS(BB_TICKS_TO_US(pNewCtx->perInter))) + { + LL_TRACE_WARN2("!!! Scheduling conflict, PI frequency: existing handle=%u prioritized over incoming handle=%u", LCTR_GET_PER_SCAN_HANDLE(pExistCtx), LCTR_GET_PER_SCAN_HANDLE(pNewCtx)); + return pExistOp; + } + if ((LCTR_PER_INTER_TO_MS(BB_TICKS_TO_US(pNewCtx->perInter)) >> 2) > LCTR_PER_INTER_TO_MS(BB_TICKS_TO_US(pExistCtx->perInter))) + { + LL_TRACE_WARN2("!!! Scheduling conflict, PI frequency: incoming handle=%u prioritized over existing handle=%u", LCTR_GET_PER_SCAN_HANDLE(pNewCtx), LCTR_GET_PER_SCAN_HANDLE(pExistCtx)); + return pNewOp; + } + + /* Default. */ + LL_TRACE_WARN2("!!! Scheduling conflict, default: existing handle=%u prioritized over incoming handle=%u", LCTR_GET_PER_SCAN_HANDLE(pExistCtx), LCTR_GET_PER_SCAN_HANDLE(pNewCtx)); + return pExistOp; +} + +/*************************************************************************************************/ +/*! + * \brief Get channel map of periodic scanner. + * + * \param handle Handle of scanner channel map. + * + * \return 64-bit formatted channel map mask + */ +/*************************************************************************************************/ +uint64_t LctrGetPerScanChanMap(uint16_t handle) +{ + lctrPerScanCtx_t *pCtx; + if (handle >= LL_MAX_PER_SCAN) + { + return 0; + } + + pCtx = LCTR_GET_PER_SCAN_CTX(handle); + + return pCtx->chanParam.chanMask; +} + +/*************************************************************************************************/ +/*! + * \brief Send periodic advertising sync transfer received event. + * + * \param status Status. + * \param pPerScanCtx Periodic scan context. + * + * \return None. + */ +/*************************************************************************************************/ +void LctrSendPerSyncTrsfRcvdEvt(uint8_t status, lctrPerScanCtx_t *pPerScanCtx) +{ + WSF_ASSERT(pPerScanCtx != NULL); + + LlPerSyncTrsfRcvdInd_t evt = + { + .hdr = + { + .event = LL_PER_SYNC_TRSF_RCVD_IND, + }, + .status = status, + .connHandle = lctrPerTransferSync.connHandle, + .serviceData = lctrPerTransferSync.serviceData, + .syncHandle = LCTR_GET_PER_SCAN_HANDLE(pPerScanCtx), + .advSID = pPerScanCtx->advSID, + .addrType = pPerScanCtx->advAddrType, + .advPhy = pPerScanCtx->rxPhys, + .perAdvInterval = LCTR_PER_INTER_TO_MS(BB_TICKS_TO_US(pPerScanCtx->perInter)), + .advClkAccuracy = pPerScanCtx->sca + }; + + Bda64ToBstream(evt.addr, pPerScanCtx->advAddr); + + LL_TRACE_INFO2("### LlEvent ### LL_PER_ADV_SYNC_TRSF_RCVD_EVT, connHandle=%u status=%u", evt.connHandle, evt.status); + LL_TRACE_INFO2("### LlEvent ### syncHandle=%u advSID=%u", evt.syncHandle, evt.advSID); + + LmgrSendEvent((LlEvt_t *)&evt); +} + +/*************************************************************************************************/ +/*! + * \brief Enable or disable reports for the periodic advertising sync. + * + * \param syncHandle Periodic sync handle. + * \param enable Enable or disable reporting. + * + * \return None. + */ +/*************************************************************************************************/ +void LctrMstPerSetRcvEnable(uint16_t syncHandle, bool_t enable) +{ + WSF_ASSERT(syncHandle < LL_MAX_PER_SCAN); + lctrPerScanCtx_t *pPerScanCtx = LCTR_GET_PER_SCAN_CTX(syncHandle); + + pPerScanCtx->repDisabled = !enable; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_slave.c index 5f0a9446fc..502a0cd391 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave advertising operation builder implementation file. + * \file + * \brief Link layer controller slave advertising operation builder implementation file. */ /*************************************************************************************************/ @@ -44,6 +45,10 @@ lctrSlvAdvCtx_t lctrSlvAdv; WSF_CT_ASSERT((BB_FIXED_ADVB_PKT_LEN == 0) || (BB_FIXED_ADVB_PKT_LEN >= LL_ADVB_MAX_LEN)); +/************************************************************************************************** + Internal functions +**************************************************************************************************/ + /*************************************************************************************************/ /*! * \brief Slave advertising reset handler. @@ -189,7 +194,7 @@ void lctrChooseAdvA(BbBleData_t * const pBle, lctrAdvbPduHdr_t *pPduHdr, } /* Generate local RPA for advertisement. */ - if (lmgrCb.addrResEna && (ownAddrType & LL_ADDR_IDENTITY_BIT)) + if (ownAddrType & LL_ADDR_IDENTITY_BIT) { uint64_t localRpa; @@ -323,6 +328,15 @@ void lctrSlvAdvBuildOp(void) pAdv->advChMap = lmgrSlvAdvCb.advParam.advChanMap; + if (lmgrGetOpFlag(LL_OP_MODE_FLAG_ENA_ADV_CHAN_RAND)) + { + pAdv->firstAdvChIdx = LlMathRandNum() % LL_NUM_CHAN_ADV; + } + else + { + pAdv->firstAdvChIdx = 0; + } + switch (lmgrSlvAdvCb.advParam.advType) { case LL_ADV_CONN_UNDIRECT: @@ -334,7 +348,8 @@ void lctrSlvAdvBuildOp(void) lmgrSlvAdvCb.advParam.advInterMin = 0; lmgrSlvAdvCb.advParam.advInterMax = BB_BLE_TO_BB_TICKS(LL_DIR_ADV_INTER_TICKS); lmgrSlvAdvCb.advTermCntDown = BB_BLE_TO_BB_TICKS(LL_DIR_ADV_DUR_TICKS); - /* no break */ + pAdv->firstAdvChIdx = 0; /* High duty cycle always start from channel 37. */ + /* Fallthrough */ case LL_ADV_CONN_DIRECT_LOW_DUTY: pduHdr.pduType = LL_PDU_ADV_DIRECT_IND; pBle->pduFilt.pduTypeFilt = (1 << LL_PDU_CONNECT_IND); @@ -479,7 +494,7 @@ void lctrSlvAdvBuildOp(void) lctrSlvAdv.shutdown = FALSE; lctrSlvAdv.connIndRcvd = FALSE; - SchBleCalcAdvOpDuration(pOp); + SchBleCalcAdvOpDuration(pOp, 0); SchInsertNextAvailable(pOp); LL_TRACE_INFO1("### AdvEvent ### Advertising enabled, due=%u", pOp->due); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_slave_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_slave_ae.c index 9b4cceb508..386811a718 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_slave_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_adv_slave_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,19 +16,24 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave extended advertising operation builder implementation file. + * \file + * \brief Link layer controller slave extended advertising operation builder implementation file. */ /*************************************************************************************************/ +#include "lctr_api_adv_slave_ae.h" #include "lctr_int_adv_slave_ae.h" #include "lctr_int_adv_slave.h" #include "lctr_pdu_adv_ae.h" #include "lctr_pdu_adv.h" #include "lctr_int.h" +#include "lctr_api.h" #include "sch_api.h" #include "sch_api_ble.h" #include "bb_api.h" -#include "bb_drv.h" +#include "pal_bb.h" +#include "pal_bb_ble.h" +#include "pal_radio.h" #include "bb_ble_api_reslist.h" #include "wsf_assert.h" #include "wsf_buf.h" @@ -37,8 +42,8 @@ #include "wsf_msg.h" #include "wsf_trace.h" #include "util/bstream.h" -#include "util/crc32.h" #include +#include "lctr_int_conn.h" /************************************************************************************************** Globals @@ -61,6 +66,61 @@ static uint8_t *lctrExtAdvDataBufTbl[LL_MAX_ADV_SETS]; /*! \brief Periodic advertising data buffer table. */ static uint8_t *lctrPerAdvDataBufTbl[LL_MAX_ADV_SETS]; +/************************************************************************************************** + Internal functions +**************************************************************************************************/ + +/*************************************************************************************************/ +/*! + * \brief Reset acad params + * + * \return None. + */ +/*************************************************************************************************/ +static void lctrSlvAcadResetHandler(void) +{ + lctrAdvSet_t *pAdvSet; + + for (uint8_t handle = 0; handle < pLctrRtCfg->maxAdvSets; handle++) + { + if ((pAdvSet = lctrFindAdvSet(handle)) != NULL) + { + memset(pAdvSet->acadParams, 0, sizeof(pAdvSet->acadParams)); + } + } +} + +/*************************************************************************************************/ +/*! + * \brief Acad dispatch handler + * + * \param pMsg Message to be handled. + * + * \return None. + */ +/*************************************************************************************************/ +static void lctrSlvAcadDisp(lctrChanMapUpdate_t *pMsg) +{ + lctrAdvSet_t *pAdvSet; + + LL_TRACE_INFO2("lctrSlvAcadDisp: handle=%u, evt=%u", pMsg->hdr.handle, pMsg->hdr.event); + + if (pMsg->hdr.dispId != LCTR_DISP_BCST) + { + if ((pAdvSet = lctrFindAdvSet(pMsg->hdr.handle)) != NULL) + { + pAdvSet->perParam.updChanMask = pMsg->chanMap; + lctrSlvAcadExecuteSm(pAdvSet, pMsg->hdr.event); + } + } + + /* Currently, the only broadcast message is reset. */ + else + { + lctrSlvAcadResetHandler(); + } +} + /*************************************************************************************************/ /*! * \brief Calculate permutation. @@ -106,21 +166,6 @@ static inline uint16_t lctrCalcMAM(uint16_t a, uint16_t b) return ((17 * a) + b) & 0xFFFFF; } -/*************************************************************************************************/ -/*! - * \brief Calculate DID. - * - * \param pBuf Data buffer. - * \param len Length of data buffer. - * - * \return DID value. - */ -/*************************************************************************************************/ -static inline uint16_t lctrCalcDID(const uint8_t *pBuf, uint16_t len) -{ - return CalcCrc32(LlMathRandNum(), len, pBuf); -} - /*************************************************************************************************/ /*! * \brief Allocate an advertising set. @@ -132,8 +177,7 @@ static inline uint16_t lctrCalcDID(const uint8_t *pBuf, uint16_t len) /*************************************************************************************************/ static lctrAdvSet_t *lctrAllocAdvSet(uint8_t handle) { - unsigned int i; - for (i = 0; i < pLctrRtCfg->maxAdvSets; i++) + for (uint8_t i = 0; i < pLctrRtCfg->maxAdvSets; i++) { lctrAdvSet_t *pAdvSet = &pLctrAdvSetTbl[i]; @@ -196,7 +240,7 @@ void lctrFreeAdvSet(lctrAdvSet_t *pAdvSet) * \return Advertising set or NULL if not found. */ /*************************************************************************************************/ -static lctrAdvSet_t *lctrFindAdvSet(uint8_t handle) +lctrAdvSet_t *lctrFindAdvSet(uint8_t handle) { unsigned int i; for (i = 0; i < pLctrRtCfg->maxAdvSets; i++) @@ -224,7 +268,13 @@ static lctrAdvSet_t *lctrFindAdvSet(uint8_t handle) /*************************************************************************************************/ void lctrSelectNextAuxChannel(lctrAdvSet_t *pAdvSet) { - pAdvSet->auxChIdx = LL_MATH_MOD_37(pAdvSet->auxChIdx + pAdvSet->auxChHopInc); + do + { + + pAdvSet->auxChHopInc = lctrComputeHopInc(); + pAdvSet->auxChIdx = LL_MATH_MOD_37(pAdvSet->auxChIdx + pAdvSet->auxChHopInc); + } + while (!(lmgrCb.chanClass & ((uint64_t) 1 << pAdvSet->auxChIdx))); } /*************************************************************************************************/ @@ -238,7 +288,12 @@ void lctrSelectNextAuxChannel(lctrAdvSet_t *pAdvSet) /*************************************************************************************************/ void lctrSelectNextPerChannel(lctrAdvSet_t *pAdvSet) { - pAdvSet->perParam.perChIdx = LL_MATH_MOD_37(pAdvSet->perParam.perChIdx + pAdvSet->perParam.perChHopInc); + do + { + pAdvSet->perParam.perChHopInc = lctrComputeHopInc(); + pAdvSet->perParam.perChIdx = LL_MATH_MOD_37(pAdvSet->perParam.perChIdx + pAdvSet->perParam.perChHopInc); + } + while (!(lmgrCb.chanClass & ((uint64_t) 1 << pAdvSet->perParam.perChIdx))); } /*************************************************************************************************/ @@ -251,7 +306,7 @@ void lctrSelectNextPerChannel(lctrAdvSet_t *pAdvSet) * \return Next data channel index. */ /*************************************************************************************************/ -uint8_t lctrPeriodicSelectNextChannel(lctrChanParam_t *pChanParam, uint16_t eventCounter) +uint8_t lctrPeriodicSelectNextChannel(lmgrChanParam_t *pChanParam, uint16_t eventCounter) { unsigned int prn; @@ -392,7 +447,7 @@ static uint8_t lctrSetExtAdvDataSm(lctrAdvSet_t *pAdvSet, lctrAdvDataBuf_t *pDat LL_TRACE_WARN2("Fragments exceeded maximum buffer length -- discarding buffer, maxExtAdvDataLen=%u, handle=%u", pLctrRtCfg->maxExtAdvDataLen, pAdvSet->handle); return LL_ERROR_CODE_MEM_CAP_EXCEEDED; } - /* no break */ + /* Fallthrough */ case LL_ADV_DATA_OP_FRAG_FIRST: if (pAdvSet->state != LCTR_EXT_ADV_STATE_DISABLED) /* e.g. advertising enabled */ { @@ -409,11 +464,58 @@ static uint8_t lctrSetExtAdvDataSm(lctrAdvSet_t *pAdvSet, lctrAdvDataBuf_t *pDat /*** Complete single fragment buffer (no reassembly required) while advertising is enabled. ***/ if (pAdvSet->state == LCTR_EXT_ADV_STATE_ENABLED) { - pDataBuf->alt.ext.len = fragLen; - memcpy(pDataBuf->alt.ext.buf, pFragBuf, fragLen); - pDataBuf->alt.ext.did = lctrCalcDID(pFragBuf, fragLen); - pDataBuf->alt.ext.fragPref = fragPref; - pDataBuf->alt.ext.modified = TRUE; + bool_t isCancelled = FALSE; + + WSF_CS_ENTER(); + /* Renew BOD's to make the data updated immediately if possible. */ + if (SchIsBodCancellable(&pAdvSet->advBod) && + ((pAdvSet->auxBodUsed == FALSE) || SchIsBodCancellable(&pAdvSet->auxAdvBod))) + { + /* Temporarily disable abort callbacks. */ + pAdvSet->advBod.abortCback = NULL; + pAdvSet->auxAdvBod.abortCback = NULL; + + /* Remove BOD's */ + SchRemove(&pAdvSet->advBod); + if (pAdvSet->auxBodUsed) + { + SchRemove(&pAdvSet->auxAdvBod); + } + + isCancelled = TRUE; + } + WSF_CS_EXIT(); + + if (isCancelled) + { + pAdvSet->advData.len = fragLen; + memcpy(pAdvSet->advData.pBuf, pFragBuf, fragLen); + pAdvSet->param.advDID = lctrCalcDID(pFragBuf, fragLen); + pAdvSet->advData.fragPref = fragPref; + + /* Update superior PDU. */ + BbBleSlvAdvEvent_t * const pAdv = &pAdvSet->bleData.op.slvAdv; + pAdv->txAdvLen = lctrPackAdvExtIndPdu(pAdvSet, pAdvSet->advHdrBuf, FALSE); + + /* Re-insert BOD's */ + pAdvSet->advBod.abortCback = lctrSlvExtAdvAbortOp; + (void)SchInsertAtDueTime(&pAdvSet->advBod, NULL); + + if (pAdvSet->auxBodUsed) + { + pAdvSet->auxAdvBod.abortCback = lctrSlvAuxAdvEndOp; + (void)SchInsertAtDueTime(&pAdvSet->auxAdvBod, NULL); + } + } + else + { + /* BOD's are already running. Data will be updated in the end callback of the BOD's. */ + pDataBuf->alt.ext.len = fragLen; + memcpy(pDataBuf->alt.ext.buf, pFragBuf, fragLen); + pDataBuf->alt.ext.did = lctrCalcDID(pFragBuf, fragLen); + pDataBuf->alt.ext.fragPref = fragPref; + pDataBuf->alt.ext.modified = TRUE; + } return LL_SUCCESS; } @@ -460,7 +562,7 @@ static uint8_t lctrSetExtAdvDataSm(lctrAdvSet_t *pAdvSet, lctrAdvDataBuf_t *pDat /* Append buffer. */ memcpy(pDataBuf->pBuf + pDataBuf->len, pFragBuf, fragLen); pDataBuf->len += fragLen; - pDataBuf->did = lctrCalcDID(pFragBuf, fragLen); + pAdvSet->param.advDID = lctrCalcDID(pFragBuf, fragLen); pDataBuf->fragPref = fragPref; pDataBuf->ready = TRUE; break; @@ -468,13 +570,13 @@ static uint8_t lctrSetExtAdvDataSm(lctrAdvSet_t *pAdvSet, lctrAdvDataBuf_t *pDat /* New buffer (discard old buffer). */ memcpy(pDataBuf->pBuf, pFragBuf, fragLen); pDataBuf->len = fragLen; - pDataBuf->did = lctrCalcDID(pFragBuf, fragLen); + pAdvSet->param.advDID = lctrCalcDID(pFragBuf, fragLen); pDataBuf->fragPref = fragPref; pDataBuf->ready = TRUE; break; case LL_ADV_DATA_OP_UNCHANGED: /* Same buffer. */ - pDataBuf->did = lctrCalcDID(pFragBuf, fragLen); + pAdvSet->param.advDID = lctrCalcDID(pFragBuf, fragLen); pDataBuf->fragPref = fragPref; pDataBuf->ready = TRUE; break; @@ -521,7 +623,7 @@ static uint8_t lctrSetPerAdvDataSm(lctrAdvSet_t *pAdvSet, lctrAdvDataBuf_t *pDat LL_TRACE_WARN2("Fragments exceeded maximum buffer length -- discarding buffer, maxExtAdvDataLen=%u, handle=%u", pLctrRtCfg->maxExtAdvDataLen, pAdvSet->handle); return LL_ERROR_CODE_MEM_CAP_EXCEEDED; } - /* no break */ + /* Fallthrough */ case LL_ADV_DATA_OP_FRAG_FIRST: if (pAdvSet->perParam.perState != LCTR_PER_ADV_STATE_DISABLED) /* e.g. advertising enabled */ { @@ -540,7 +642,6 @@ static uint8_t lctrSetPerAdvDataSm(lctrAdvSet_t *pAdvSet, lctrAdvDataBuf_t *pDat { pDataBuf->alt.ext.len = fragLen; memcpy(pDataBuf->alt.ext.buf, pFragBuf, fragLen); - pDataBuf->did = lctrCalcDID(pFragBuf, fragLen); pDataBuf->alt.ext.modified = TRUE; return LL_SUCCESS; @@ -569,7 +670,7 @@ static uint8_t lctrSetPerAdvDataSm(lctrAdvSet_t *pAdvSet, lctrAdvDataBuf_t *pDat } /*** Reassemble data buffer ***/ - + /* coverity[dead_error_condition] */ switch (fragOp) { case LL_ADV_DATA_OP_FRAG_INTER: @@ -588,19 +689,16 @@ static uint8_t lctrSetPerAdvDataSm(lctrAdvSet_t *pAdvSet, lctrAdvDataBuf_t *pDat /* Append buffer. */ memcpy(pDataBuf->pBuf + pDataBuf->len, pFragBuf, fragLen); pDataBuf->len += fragLen; - pDataBuf->did = lctrCalcDID(pFragBuf, fragLen); pDataBuf->ready = TRUE; break; case LL_ADV_DATA_OP_COMP: /* New buffer (discard old buffer). */ memcpy(pDataBuf->pBuf, pFragBuf, fragLen); pDataBuf->len = fragLen; - pDataBuf->did = lctrCalcDID(pFragBuf, fragLen); pDataBuf->ready = TRUE; break; case LL_ADV_DATA_OP_UNCHANGED: /* Same buffer. */ - pDataBuf->did = lctrCalcDID(pFragBuf, fragLen); pDataBuf->ready = TRUE; break; default: @@ -681,7 +779,7 @@ uint8_t lctrSlvExtAdvBuildOp(lctrAdvSet_t *pAdvSet, uint32_t maxStartMs) pOp->protId = BB_PROT_BLE; pOp->prot.pBle = pBle; pOp->endCback = lctrSlvExtAdvEndOp; - pOp->abortCback = lctrSlvExtAdvEndOp; + pOp->abortCback = lctrSlvExtAdvAbortOp; pOp->pCtx = pAdvSet; /*** BLE General Setup ***/ @@ -689,7 +787,14 @@ uint8_t lctrSlvExtAdvBuildOp(lctrAdvSet_t *pAdvSet, uint32_t maxStartMs) pBle->chan.opType = BB_BLE_OP_SLV_ADV_EVENT; /* pBle->chan.chanIdx = 0; */ /* overridden by BB */ - pBle->chan.txPower = pAdvSet->param.advTxPwr; + if (pAdvSet->param.advTxPwr == HCI_TX_PWR_NO_PREFERENCE) + { + pBle->chan.txPower = lmgrCb.advTxPwr; + } + else + { + pBle->chan.txPower = pAdvSet->param.advTxPwr; + } pBle->chan.accAddr = LL_ADV_ACCESS_ADDR; pBle->chan.crcInit = LL_ADV_CRC_INIT; pBle->chan.txPhy = pAdvSet->param.priAdvPhy; @@ -728,6 +833,11 @@ uint8_t lctrSlvExtAdvBuildOp(lctrAdvSet_t *pAdvSet, uint32_t maxStartMs) } } } + else + { + /* Always match peer address in PDU for directed advertising. */ + BB_BLE_PDU_FILT_SET_FLAG(&pBle->pduFilt, PEER_ADDR_MATCH_ENA); + } /*** BLE Advertising Setup: Tx advertising packet ***/ @@ -735,6 +845,15 @@ uint8_t lctrSlvExtAdvBuildOp(lctrAdvSet_t *pAdvSet, uint32_t maxStartMs) pAdv->txAdvSetupCback = lctrSlvTxSetupExtAdvHandler; + if (lmgrGetOpFlag(LL_OP_MODE_FLAG_ENA_ADV_CHAN_RAND)) + { + pAdv->firstAdvChIdx = LlMathRandNum() % LL_NUM_CHAN_ADV; + } + else + { + pAdv->firstAdvChIdx = 0; + } + if (pAdvSet->param.advEventProp & LL_ADV_EVT_PROP_LEGACY_ADV_BIT) { const uint8_t LEGACY_HIGH_DUTY = (LL_ADV_EVT_PROP_LEGACY_ADV_BIT | LL_ADV_EVT_PROP_HIGH_DUTY_ADV_BIT | @@ -742,6 +861,7 @@ uint8_t lctrSlvExtAdvBuildOp(lctrAdvSet_t *pAdvSet, uint32_t maxStartMs) /* Advertising interval is determined by LL for high duty cycle directed adv. */ if ((pAdvSet->param.advEventProp & LEGACY_HIGH_DUTY) == LEGACY_HIGH_DUTY ) { + pAdv->firstAdvChIdx = 0; /* High duty cycle always start from channel 37. */ pAdvSet->param.priAdvInterMin = 0; pAdvSet->param.priAdvInterMax = BB_BLE_TO_BB_TICKS(LL_DIR_ADV_INTER_TICKS); pAdvSet->param.priAdvTermCntDown = BB_US_TO_BB_TICKS(pLctrSlvExtAdvMsg->enable.durMs * 1000); @@ -804,14 +924,13 @@ uint8_t lctrSlvExtAdvBuildOp(lctrAdvSet_t *pAdvSet, uint32_t maxStartMs) /*** Commit operation ***/ /* Setup auxiliary channel before primary channel operation calls lctrSlvTxSetupExtAdvHandler(). */ - pAdvSet->auxChHopInc = lctrComputeHopInc(); lctrSelectNextAuxChannel(pAdvSet); - SchBleCalcAdvOpDuration(pOp); + SchBleCalcAdvOpDuration(pOp, 0); if (pLctrSlvExtAdvMsg->enable.durMs) { - pOp->due = BbDrvGetCurrentTime() + BB_US_TO_BB_TICKS(BbGetSchSetupDelayUs()); + pOp->due = PalBbGetCurrentTime(USE_RTC_BB_CLK) + BB_US_TO_BB_TICKS(BbGetSchSetupDelayUs()); uint32_t maxTime = BB_US_TO_BB_TICKS(maxStartMs * 1000); if (!SchInsertEarlyAsPossible(pOp, 0, maxTime)) @@ -880,12 +999,19 @@ uint8_t lctrSlvExtAdvBuildOp(lctrAdvSet_t *pAdvSet, uint32_t maxStartMs) /*************************************************************************************************/ void lctrSlvAuxRescheduleOp(lctrAdvSet_t *pAdvSet, BbOpDesc_t * const pOp) { - uint32_t auxOffs = BB_US_TO_BB_TICKS(pAdvSet->advBod.minDurUsec + + uint32_t auxOffsUsec = BB_US_TO_BB_TICKS(pAdvSet->advBod.minDurUsec + WSF_MAX(BbGetSchSetupDelayUs(), LL_BLE_MAFS_US) + WSF_MAX(pAdvSet->auxDelayUsec, pLctrRtCfg->auxDelayUsec)); - auxOffs = WSF_MIN(auxOffs, BB_US_TO_BB_TICKS(LL_AUX_PTR_MAX_USEC)); - pOp->due = pAdvSet->advBod.due + auxOffs; + auxOffsUsec = WSF_MIN(auxOffsUsec, BB_US_TO_BB_TICKS(LL_AUX_PTR_MAX_USEC)); + + /* Round up auxOffsetUsec if necessary. */ + auxOffsUsec = SchBleGetAlignedAuxOffsUsec(auxOffsUsec); + + /* Update BOD duration because extended header length might have been updated. */ + SchBleCalcAdvOpDuration(pOp, (pAdvSet->advData.fragPref == LL_ADV_DATA_FRAG_ALLOW) ? pAdvSet->advDataFragLen : 0); + + pOp->due = pAdvSet->advBod.due + auxOffsUsec + pLctrRtCfg->auxPtrOffsetUsec; if (pAdvSet->auxSkipInter == 0) { @@ -938,7 +1064,7 @@ void lctrSlvAuxRescheduleOp(lctrAdvSet_t *pAdvSet, BbOpDesc_t * const pOp) /*************************************************************************************************/ static void lctrSlvAuxCommitOp(lctrAdvSet_t *pAdvSet, BbOpDesc_t * const pOp) { - SchBleCalcAdvOpDuration(pOp); + SchBleCalcAdvOpDuration(pOp, (pAdvSet->advData.fragPref == LL_ADV_DATA_FRAG_ALLOW) ? pAdvSet->advDataFragLen : 0); if (pAdvSet->param.secAdvMaxSkip) { @@ -986,13 +1112,21 @@ void lctrSlvAuxNonConnNonScanBuildOp(lctrAdvSet_t *pAdvSet) pOp->endCback = lctrSlvAuxAdvEndOp; pOp->abortCback = lctrSlvAuxAdvEndOp; pOp->pCtx = pAdvSet; + pOp->pDataLen = &(pAdvSet->advData.len); /*** BLE General Setup ***/ pBle->chan.opType = BB_BLE_OP_SLV_AUX_ADV_EVENT; pBle->chan.chanIdx = pAdvSet->auxChIdx; - pBle->chan.txPower = pAdvSet->param.advTxPwr; + if (pAdvSet->param.advTxPwr == HCI_TX_PWR_NO_PREFERENCE) + { + pBle->chan.txPower = lmgrCb.advTxPwr; + } + else + { + pBle->chan.txPower = pAdvSet->param.advTxPwr; + } pBle->chan.accAddr = LL_ADV_ACCESS_ADDR; pBle->chan.crcInit = LL_ADV_CRC_INIT; pBle->chan.txPhy = pAdvSet->param.secAdvPhy; @@ -1070,13 +1204,21 @@ void lctrSlvAuxScanBuildOp(lctrAdvSet_t *pAdvSet) pOp->endCback = lctrSlvAuxAdvEndOp; pOp->abortCback = lctrSlvAuxAdvEndOp; pOp->pCtx = pAdvSet; + pOp->pDataLen = &(pAdvSet->scanRspData.len); /*** BLE General Setup ***/ pBle->chan.opType = BB_BLE_OP_SLV_AUX_ADV_EVENT; pBle->chan.chanIdx = pAdvSet->auxChIdx; - pBle->chan.txPower = pAdvSet->param.advTxPwr; + if (pAdvSet->param.advTxPwr == HCI_TX_PWR_NO_PREFERENCE) + { + pBle->chan.txPower = lmgrCb.advTxPwr; + } + else + { + pBle->chan.txPower = pAdvSet->param.advTxPwr; + } pBle->chan.accAddr = LL_ADV_ACCESS_ADDR; pBle->chan.crcInit = LL_ADV_CRC_INIT; pBle->chan.txPhy = pAdvSet->param.secAdvPhy; @@ -1183,13 +1325,21 @@ void lctrSlvAuxConnBuildOp(lctrAdvSet_t *pAdvSet) pOp->endCback = lctrSlvAuxAdvEndOp; pOp->abortCback = lctrSlvAuxAdvEndOp; pOp->pCtx = pAdvSet; + pOp->pDataLen = &(pAdvSet->advData.len); /*** BLE General Setup ***/ pBle->chan.opType = BB_BLE_OP_SLV_AUX_ADV_EVENT; pBle->chan.chanIdx = pAdvSet->auxChIdx; - pBle->chan.txPower = pAdvSet->param.advTxPwr; + if (pAdvSet->param.advTxPwr == HCI_TX_PWR_NO_PREFERENCE) + { + pBle->chan.txPower = lmgrCb.advTxPwr; + } + else + { + pBle->chan.txPower = pAdvSet->param.advTxPwr; + } pBle->chan.accAddr = LL_ADV_ACCESS_ADDR; pBle->chan.crcInit = LL_ADV_CRC_INIT; pBle->chan.txPhy = pAdvSet->param.secAdvPhy; @@ -1284,6 +1434,9 @@ void LctrSlvExtAdvInit(void) /* Add advertising task event handlers. */ lctrEventHdlrTbl[LCTR_EVENT_RX_SCAN_REQ] = lctrSlvRxExtScanReq; + /* Add acad message dispatchers. */ + lctrMsgDispTbl[LCTR_DISP_ACAD] = (LctrMsgDisp_t) lctrSlvAcadDisp; + /* Set supported features. */ if (pLctrRtCfg->btVer >= LL_VER_BT_CORE_SPEC_5_0) { @@ -1434,6 +1587,14 @@ uint8_t LctrIsExtAdvEnableReady(uint8_t handle) return LL_ERROR_CODE_CMD_DISALLOWED; } + if (((pAdvSet->param.advEventProp & LL_ADV_EVT_PROP_LEGACY_ADV_BIT) == 0) && + (pAdvSet->param.advEventProp & LL_ADV_EVT_PROP_SCAN_ADV_BIT) && + (pAdvSet->scanRspData.len == 0)) + { + LL_TRACE_WARN1("No scan response data for scannable ext advertising, handle=%u", handle); + return LL_ERROR_CODE_CMD_DISALLOWED; + } + switch (pAdvSet->param.ownAddrType) { case LL_ADDR_RANDOM: @@ -1497,7 +1658,7 @@ uint8_t LctrGetExtAdvTxPowerLevel(uint16_t handle, int8_t *pLevel) { return LL_ERROR_CODE_UNKNOWN_ADV_ID; } - *pLevel = BbBleRfGetActualTxPower(pAdvSet->param.advTxPwr, FALSE); + *pLevel = PalRadioGetActualTxPower(pAdvSet->param.advTxPwr, FALSE); return LL_SUCCESS; } @@ -1617,7 +1778,7 @@ void lctrChooseSetAdvA(lctrAdvbPduHdr_t *pPduHdr, BbBleData_t * const pBle, lctr } /* Generate local RPA for advertisement. */ - if (lmgrCb.addrResEna && (pAdvSet->param.ownAddrType & LL_ADDR_IDENTITY_BIT)) + if (pAdvSet->param.ownAddrType & LL_ADDR_IDENTITY_BIT) { uint64_t localRpa; @@ -1887,6 +2048,27 @@ uint8_t LctrSetExtAdvData(uint8_t handle, uint8_t op, uint8_t fragPref, uint8_t return result; } +/*************************************************************************************************/ +/*! + * \brief Get channel map of periodic sdvertiser. + * + * \param handle Advertising handle. + * + * \return Channel map in 64bit int format. + * + */ +/*************************************************************************************************/ +uint64_t LctrGetPerAdvChanMap(uint8_t handle) +{ + lctrAdvSet_t *pAdvSet; + if ((pAdvSet = lctrFindAdvSet(handle)) == NULL) + { + return 0; + } + + return pAdvSet->perParam.perChanParam.chanMask; +} + /*************************************************************************************************/ /*! * \brief Set periodic advertising parameters. @@ -1914,14 +2096,29 @@ uint8_t LctrSetPeriodicAdvParam(uint8_t handle, LlPerAdvParam_t *pPerAdvParam) return LL_ERROR_CODE_CMD_DISALLOWED; } +#if 0 + uint16_t mafOffset = WSF_MAX(pAdvSet->auxDelayUsec, pLctrRtCfg->auxDelayUsec); + uint32_t worstCaseUsec = SchBleCalcPerAdvDurationUsec(pAdvSet->param.secAdvPhy, + 0, + mafOffset, + pAdvSet->perAdvData.len, + TRUE, + BB_PHY_OPTIONS_BLE_S8); + + if (worstCaseUsec > LCTR_PER_INTER_TO_US(pPerAdvParam->perAdvInterMax)) + { + return LL_ERROR_CODE_PKT_TOO_LONG; + } +#endif + /* Anonymous advertising is not allowed for periodic advertising. */ if (pAdvSet->param.advEventProp & LL_ADV_EVT_PROP_OMIT_AA_BIT) { return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; } - pAdvSet->perParam.advInterMin = BB_US_TO_BB_TICKS(LCTR_PER_INTER_TO_US(pPerAdvParam->perAdvInterMin)); /* Convert ms to bb ticks */ - pAdvSet->perParam.advInterMax = BB_US_TO_BB_TICKS(LCTR_PER_INTER_TO_US(pPerAdvParam->perAdvInterMax)); /* Convert ms to bb ticks */ + pAdvSet->perParam.advInterMin = BB_US_TO_BB_TICKS(LCTR_PER_INTER_TO_US(pPerAdvParam->perAdvInterMin)); /* Convert parameter to bb ticks */ + pAdvSet->perParam.advInterMax = BB_US_TO_BB_TICKS(LCTR_PER_INTER_TO_US(pPerAdvParam->perAdvInterMax)); /* Convert parameter to bb ticks */ pAdvSet->perParam.advEventProp = pPerAdvParam->perAdvProp; pAdvSet->perParam.advParamReady = TRUE; @@ -1952,13 +2149,43 @@ uint8_t LctrSetPeriodicAdvData(uint8_t handle, uint8_t op, uint8_t len, const ui return LL_ERROR_CODE_UNKNOWN_ADV_ID; } - if ((pAdvSet->perParam.advParamReady == FALSE) || /* Adv set is not configured for periodic adv. */ + if ((pAdvSet->perParam.advParamReady == FALSE) || /* Adv set is not configured for periodic adv. */ (pAdvSet->perParam.perAdvEnabled == TRUE && op != LL_ADV_DATA_OP_COMP) || /* When periodic adv is enabled, complete data shall be provided. Never gonna happen. */ (len == 0 && op != LL_ADV_DATA_OP_COMP)) /* Existing data shall be deleted and no new data provided. */ { return LL_ERROR_CODE_CMD_DISALLOWED; } +#if 0 + uint32_t worstCaseUsec; + uint16_t mafOffset = WSF_MAX(pAdvSet->auxDelayUsec, pLctrRtCfg->auxDelayUsec); + uint32_t maxInterval = (pAdvSet->perParam.perAdvEnabled) ? BB_TICKS_TO_US(pAdvSet->perParam.perAdvInter) : BB_TICKS_TO_US(pAdvSet->perParam.advInterMax); + + if (op == LL_ADV_DATA_OP_FRAG_INTER || op == LL_ADV_DATA_OP_FRAG_LAST) /* Intermediate chained data. */ + { + worstCaseUsec = SchBleCalcPerAdvDurationUsec(pAdvSet->param.secAdvPhy, + 0, + mafOffset, + len + pAdvSet->perAdvData.len, + TRUE, + BB_PHY_OPTIONS_BLE_S8); + } + else /* Len is complete data. */ + { + worstCaseUsec = SchBleCalcPerAdvDurationUsec(pAdvSet->param.secAdvPhy, + 0, + mafOffset, + len, + TRUE, + BB_PHY_OPTIONS_BLE_S8); + } + + if (worstCaseUsec > maxInterval) + { + return LL_ERROR_CODE_PKT_TOO_LONG; + } +#endif + if ((result = lctrSetPerAdvDataSm(pAdvSet, &pAdvSet->perAdvData, op, len, pData)) == LL_SUCCESS) { pAdvSet->perAdvData.fragPref = LL_ADV_DATA_FRAG_DISALLOW; @@ -1974,7 +2201,7 @@ uint8_t LctrSetPeriodicAdvData(uint8_t handle, uint8_t op, uint8_t len, const ui * \param handle Advertising handle. * \param enable Set periodic advertising enabled/disabled. * - * \return Status error code. + * \return None. * * Enable/disable periodic advertising. */ @@ -1989,8 +2216,8 @@ void LctrSetPeriodicAdvEnable(uint8_t handle, bool_t enable) return; } - if (pAdvSet->perParam.advParamReady == FALSE || /* Periodic advertising parameters shall be set. */ - pAdvSet->perAdvData.ready == FALSE || /* Periodic advertising data shall be complete. */ + if ((pAdvSet->perParam.advParamReady == FALSE) || /* Periodic advertising parameters shall be set. */ + ((enable == TRUE) && (pAdvSet->perAdvData.ready == FALSE)) || /* Periodic advertising data shall be complete. */ (pAdvSet->param.advEventProp & (LL_ADV_EVT_PROP_CONN_ADV_BIT | LL_ADV_EVT_PROP_SCAN_ADV_BIT | /* Only non-connectable and non-scannable is allowed. */ LL_ADV_EVT_PROP_HIGH_DUTY_ADV_BIT | LL_ADV_EVT_PROP_OMIT_AA_BIT)))/* No high duty cycle, No anonymous advertising. */ { @@ -2049,6 +2276,14 @@ uint8_t LctrSetExtScanRespData(uint8_t handle, uint8_t op, uint8_t fragPref, uin LL_TRACE_WARN1("Cannot add scan response data buffer with non-scannable advertising, handle=%u", pAdvSet->handle); return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; } + else + { + if ((len == 0) && (op != LL_ADV_DATA_OP_COMP)) + { + LL_TRACE_WARN1("Zero-length scan response data is not valid with scannable advertising, handle=%u", pAdvSet->handle); + return LL_ERROR_CODE_CMD_DISALLOWED; + } + } if ((len > 0) && (pAdvSet->advData.len > 0)) { @@ -2090,7 +2325,8 @@ uint8_t LctrRemoveAdvSet(uint8_t handle) return LL_ERROR_CODE_UNKNOWN_ADV_ID; } - if (pAdvSet->state != LCTR_EXT_ADV_STATE_DISABLED) + if ((pAdvSet->state != LCTR_EXT_ADV_STATE_DISABLED) || + (pAdvSet->perParam.perAdvEnabled == TRUE)) { return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -2115,7 +2351,8 @@ uint8_t LctrClearAdvSets(void) for (i = 0; i < pLctrRtCfg->maxAdvSets; i++) { - if (pLctrAdvSetTbl[i].state != LCTR_EXT_ADV_STATE_DISABLED) + if ((pLctrAdvSetTbl[i].state != LCTR_EXT_ADV_STATE_DISABLED) || + (pLctrAdvSetTbl[i].perParam.perAdvEnabled == TRUE)) { return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -2313,6 +2550,26 @@ void lctrSendPeriodicAdvSetMsg(lctrAdvSet_t *pAdvSet, uint8_t event) } } +/*************************************************************************************************/ +/*! + * \brief Get status of periodic adv handle. + * + * \return returns True if periodic advertising is running on that handle, False if not + */ +/*************************************************************************************************/ +bool_t LctrIsPerAdvEnabled(uint8_t handle) +{ + lctrAdvSet_t *pAdvSet; + + if ((pAdvSet = lctrFindAdvSet(handle)) == NULL) + { + return FALSE; + } + + return ((pAdvSet->perParam.perAdvEnabled == TRUE) && + (pAdvSet->perParam.perState == LCTR_PER_ADV_STATE_ENABLED)); +} + /*************************************************************************************************/ /*! * \brief Initialize link layer controller resources for periodic advertising slave. @@ -2328,16 +2585,14 @@ void LctrSlvPeriodicAdvInit(void) /* Add extended advertising task message dispatchers. */ lctrMsgDispTbl[LCTR_DISP_PER_ADV] = (LctrMsgDisp_t)lctrSlvPeriodicAdvDisp; + /* Add periodic advertising check to function pointer */ + LctrPerAdvEnabled = LctrIsPerAdvEnabled; + /* Set supported features. */ if (pLctrRtCfg->btVer >= LL_VER_BT_CORE_SPEC_5_0) { lmgrPersistCb.featuresDefault |= LL_FEAT_LE_PER_ADV; } - - if (pLctrRtCfg->btVer >= LL_VER_BT_CORE_SPEC_5_0) - { - lctrGetPerOffsetsCback= lctrGetPerAdvOffsets; - } } /*************************************************************************************************/ @@ -2352,20 +2607,9 @@ void LctrSlvPeriodicAdvInit(void) /*************************************************************************************************/ static void lctrSlvPeriodicCommitOp(lctrAdvSet_t *pAdvSet, BbOpDesc_t * const pOp) { - const uint32_t curTime = BbDrvGetCurrentTime(); - - uint32_t rsvnOffs[SCH_RM_MAX_RSVN]; - memset(&rsvnOffs[0], 0, sizeof(rsvnOffs)); - if (lctrGetConnOffsetsCback) - { - lctrGetConnOffsetsCback(rsvnOffs, curTime); - } - if (lctrGetPerOffsetsCback) - { - lctrGetPerOffsetsCback(&rsvnOffs[LL_MAX_CONN], curTime); - } - uint32_t offsetUsec = SchRmGetOffsetUsec(rsvnOffs, BB_TICKS_TO_US(pAdvSet->perParam.perAdvInter), - LL_MAX_CONN + LCTR_GET_EXT_ADV_INDEX(pAdvSet)); /* RM is shared by connections and periodic advertising. */ + const uint32_t curTime = PalBbGetCurrentTime(USE_RTC_BB_CLK); + uint32_t offsetUsec = SchRmGetOffsetUsec(BB_TICKS_TO_US(pAdvSet->perParam.perAdvInter), + LL_MAX_CONN + LCTR_GET_EXT_ADV_INDEX(pAdvSet), curTime); /* RM is shared by connections and periodic advertising. */ pOp->due = curTime + BB_US_TO_BB_TICKS(offsetUsec); @@ -2403,7 +2647,7 @@ static void lctrSlvPeriodicCommitOp(lctrAdvSet_t *pAdvSet, BbOpDesc_t * const pO * * \param pAdvSet Advertising set. * - * \return None. + * \return Error status code. */ /*************************************************************************************************/ uint8_t lctrSlvPeriodicAdvBuildOp(lctrAdvSet_t *pAdvSet) @@ -2421,8 +2665,9 @@ uint8_t lctrSlvPeriodicAdvBuildOp(lctrAdvSet_t *pAdvSet) pOp->protId = BB_PROT_BLE; pOp->prot.pBle = pBle; pOp->endCback = lctrSlvPeriodicAdvEndOp; - pOp->abortCback = lctrSlvPeriodicAdvEndOp; + pOp->abortCback = lctrSlvPeriodicAdvAbortOp; pOp->pCtx = pAdvSet; + pOp->pDataLen = &(pAdvSet->perAdvData.len); /*** BLE General Setup ***/ pAdvSet->perParam.perChHopInc = lctrComputeHopInc(); @@ -2430,7 +2675,14 @@ uint8_t lctrSlvPeriodicAdvBuildOp(lctrAdvSet_t *pAdvSet) pBle->chan.opType = BB_BLE_OP_SLV_PER_ADV_EVENT; pBle->chan.chanIdx = pAdvSet->perParam.perChIdx; - pBle->chan.txPower = pAdvSet->param.advTxPwr; + if (pAdvSet->param.advTxPwr == HCI_TX_PWR_NO_PREFERENCE) + { + pBle->chan.txPower = lmgrCb.advTxPwr; + } + else + { + pBle->chan.txPower = pAdvSet->param.advTxPwr; + } pBle->chan.accAddr = pAdvSet->perParam.perAccessAddr; pBle->chan.crcInit = lctrComputeCrcInit(); pBle->chan.txPhy = pAdvSet->param.secAdvPhy; @@ -2468,13 +2720,36 @@ uint8_t lctrSlvPeriodicAdvBuildOp(lctrAdvSet_t *pAdvSet) /* Chain buffer setup dynamically in lctrSlvTxSetupAuxAdvDataHandler(). */ /*** Commit operation ***/ - SchBleCalcAdvOpDuration(pOp); + SchBleCalcAdvOpDuration(pOp, 0); uint32_t interMinUsec = BB_TICKS_TO_US(pAdvSet->perParam.advInterMin); uint32_t interMaxUsec = BB_TICKS_TO_US(pAdvSet->perParam.advInterMax); uint32_t durUsec = pOp->minDurUsec; uint32_t perInterUsec; - if (!SchRmAdd(LL_MAX_CONN + LCTR_GET_EXT_ADV_INDEX(pAdvSet), interMinUsec, interMaxUsec, durUsec, &perInterUsec)) +#if 0 + /* Make sure the worst case advertising duration can make the intervals. */ + uint16_t mafOffset = WSF_MAX(pAdvSet->auxDelayUsec, pLctrRtCfg->auxDelayUsec); + uint32_t worstCaseUsec = SchBleCalcPerAdvDurationUsec(pAdvSet->param.secAdvPhy, + 0, + mafOffset, + pAdvSet->perAdvData.len, + TRUE, + BB_PHY_OPTIONS_BLE_S8); + + if (worstCaseUsec > interMaxUsec) + { + return LL_ERROR_CODE_PKT_TOO_LONG; + } + + /* If the minimum interval is too fast, set minimum to be the worst case. */ + if (worstCaseUsec > interMinUsec) + { + interMinUsec = worstCaseUsec; + } +#endif + + /* Max interval is preferred in resource manager. */ + if (!SchRmAdd(LCTR_GET_PER_RM_HANDLE(pAdvSet), SCH_RM_PREF_CAPACITY, interMinUsec, interMaxUsec, durUsec, &perInterUsec, lctrGetPerRefTime)) { return LL_ERROR_CODE_LIMIT_REACHED; } @@ -2487,30 +2762,30 @@ uint8_t lctrSlvPeriodicAdvBuildOp(lctrAdvSet_t *pAdvSet) /*************************************************************************************************/ /*! - * \brief Get offsets of periodic advertising. + * \brief Get reference time(due time) of the periodic advertising. * - * \param rsvnOffs Storage for list of reservation offsets indexed by handle. - * \param refTime Starting reference time. + * \param perHandle Periodic advertising handle. + * \param pDurUsec Pointer to duration of the BOD. * - * \return None. + * \return Due time in BB ticks of the periodic advertising handle. */ /*************************************************************************************************/ -void lctrGetPerAdvOffsets(uint32_t rsvnOffs[], uint32_t refTime) +uint32_t lctrGetPerRefTime(uint8_t perHandle, uint32_t *pDurUsec) { - for (unsigned int perIndex = 0; perIndex < pLctrRtCfg->maxAdvSets; perIndex++) - { - lctrAdvSet_t *pAdvSet = &pLctrAdvSetTbl[perIndex]; + uint32_t refTime = 0; + lctrAdvSet_t *pAdvSet; - if (pAdvSet->perParam.perState == LCTR_PER_ADV_STATE_ENABLED) + WSF_ASSERT(perHandle >= LL_MAX_CONN); + + pAdvSet = &pLctrAdvSetTbl[perHandle - LL_MAX_CONN]; + if (pAdvSet->perParam.perState == LCTR_PER_ADV_STATE_ENABLED) + { + refTime = pAdvSet->perParam.perAdvBod.due; + if (pDurUsec) { - if (pAdvSet->perParam.perAdvBod.due - refTime < LCTR_SCH_MAX_SPAN) /* due time has not passed */ - { - rsvnOffs[perIndex] = BB_TICKS_TO_US(pAdvSet->perParam.perAdvBod.due - refTime); - } - else - { - rsvnOffs[perIndex] = BB_TICKS_TO_US(pAdvSet->perParam.perAdvBod.due + pAdvSet->perParam.perAdvInter - refTime); - } + *pDurUsec = pAdvSet->perParam.perAdvBod.minDurUsec; } } + + return refTime; } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn.c index 4510efa29c..b3e7e61e2b 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller data path implementation file. + * \file + * \brief Link layer controller data path implementation file. */ /*************************************************************************************************/ @@ -69,6 +70,24 @@ lctrCtrlPduHdlr_t lctrCtrlPduHdlr = NULL; /*! \brief Build remap table handlers. */ LctrChSelHdlr_t lctrChSelHdlr[LCTR_CH_SEL_MAX] = { 0 }; +/*! \brief Check if CIS is enabled function. */ +lctrCheckCisEstCisFn_t lctrCheckCisEstCisFn = NULL; + +/*! \brief Pointer to lctrSendPerSyncFromScan function. */ +lctrLlcpEh_t lctrSendPerSyncFromScanFn = NULL; + +/*! \brief Pointer to lctrSendPerSyncFromBcst function. */ +lctrLlcpEh_t lctrSendPerSyncFromBcstFn = NULL; + +/*! \brief Pointer to lctrSendPeriodicSyncInd function. */ +lctrLlcpEh_t lctrSendPeriodicSyncIndFn = NULL; + +/*! \brief Pointer to lctrStorePeriodicSyncTrsf function. */ +lctrLlcpEh_t lctrStorePeriodicSyncTrsfFn = NULL; + +/*! \brief Pointer to lctrReceivePeriodicSyncInd function. */ +lctrLlcpEh_t lctrReceivePeriodicSyncIndFn = NULL; + /*************************************************************************************************/ /*! * \brief Initialize the connection memory resources. @@ -163,6 +182,28 @@ uint8_t LctrValidateConnSpec(const LlConnSpec_t *pConnSpec) return LL_SUCCESS; } +/*************************************************************************************************/ +/*! + * \brief Validate modify sca parameters. + * + * \param action Action to take. + * + * \return Status error code. + */ +/*************************************************************************************************/ +uint8_t LctrValidateModifyScaParam(uint8_t action) +{ + int8_t curSca = (int8_t) lctrComputeSca(); + + if (((curSca == LL_SCA_MIN_INDEX) && (action == LL_MODIFY_SCA_LESS_ACCURATE)) || + ((curSca == LL_SCA_MAX_INDEX) && (action == LL_MODIFY_SCA_MORE_ACCURATE))) + { + return LL_ERROR_CODE_LIMIT_REACHED; + } + + return LL_SUCCESS; +} + /*************************************************************************************************/ /*! * \brief Check whether a procedure is already active or pended. @@ -346,6 +387,14 @@ lctrConnCtx_t *lctrAllocConnCtx(void) pCtx->txPhys = lmgrConnCb.txPhys; pCtx->rxPhys = lmgrConnCb.rxPhys; + /* SCA initialization. */ + pCtx->scaMod = lmgrCb.scaMod; + + /* Default settings for PAST(periodic advertising sync transfer). */ + pCtx->syncMode = lmgrConnCb.syncMode; + pCtx->syncSkip = lmgrConnCb.syncSkip; + pCtx->syncTimeout = lmgrConnCb.syncTimeout; + /* Set default minimum number of used channels. */ for (unsigned i = 0; i < LL_MAX_PHYS; i++) { @@ -763,6 +812,11 @@ void LctrTxAcl(uint8_t *pAclBuf) (aclHdr.len > pLctrRtCfg->maxAclLen)) { LL_TRACE_ERR2("Invalid ACL header: invalid packet length, actLen=%u, maxLen=%u", aclHdr.len, pCtx->effDataPdu.maxTxLen); + if ((aclHdr.pktBound == LCTR_PB_START_NON_AUTO_FLUSH) && (aclHdr.len == 0)) + { + pCtx->forceStartPdu = TRUE; /* If this was supposed to be the start fragment, make the next packet a start fragment. */ + LL_TRACE_INFO0("Next ACL header will be forced to a start fragment."); + } WsfMsgFree(pAclBuf); lmgrPersistCb.sendCompCback(aclHdr.connHandle, 1); return; @@ -843,6 +897,25 @@ bool_t LctrIsConnHandleEnabled(uint16_t handle) return pLctrConnTbl[handle].enabled; } +/*************************************************************************************************/ +/*! + * \brief Get enable state of a handle. + * + * \param handle Connection handle. + * + * \return TRUE if enabled, FALSE otherwise. + */ +/*************************************************************************************************/ +bool_t LctrIsCisConnHandleEnabled(uint16_t handle) +{ + if (lctrCheckCisEstCisFn) + { + return lctrCheckCisEstCisFn(handle); + } + + return FALSE; +} + /*************************************************************************************************/ /*! * \brief Get role of a connection. @@ -923,8 +996,11 @@ uint64_t LctrGetChannelMap(uint16_t handle) * \return Used feature set bitmask. */ /*************************************************************************************************/ -uint8_t LctrGetUsedFeatures(uint16_t handle) +uint64_t LctrGetUsedFeatures(uint16_t handle) { +// LL_TRACE_INFO1("LctrGetUsedFeatures, lmgrCb.features=%x", lmgrCb.features); +// LL_TRACE_INFO1("LctrGetUsedFeatures, pLctrConnTbl[handle].usedFeatSet=%x", pLctrConnTbl[handle].usedFeatSet); + return pLctrConnTbl[handle].usedFeatSet; } @@ -1090,12 +1166,15 @@ BbOpDesc_t *lctrConnResolveConflict(BbOpDesc_t *pNewOp, BbOpDesc_t *pExistOp) } /* Supervision timeout is imminent (2 CE). */ - if ((pExistCtx->tmrSupTimeout.ticks * WSF_MS_PER_TICK * 1000) < (uint32_t)(LCTR_CONN_IND_US(pExistCtx->connInterval) << 1)) + if ((pExistCtx->svtState > pNewCtx->svtState) || + ((pExistCtx->tmrSupTimeout.ticks * WSF_MS_PER_TICK * 1000) < (uint32_t)(LCTR_CONN_IND_US(pExistCtx->connInterval) << 1))) { LL_TRACE_WARN2("!!! Scheduling conflict, imminent SVT: existing handle=%u prioritized over incoming handle=%u", LCTR_GET_CONN_HANDLE(pExistCtx), LCTR_GET_CONN_HANDLE(pNewCtx)); return pExistOp; } - if ((pNewCtx->tmrSupTimeout.ticks * WSF_MS_PER_TICK * 1000) < (uint32_t)(LCTR_CONN_IND_US(pNewCtx->connInterval) << 1)) + + if ((pNewCtx->svtState != LCTR_SVT_STATE_IDLE) || + ((pNewCtx->tmrSupTimeout.ticks * WSF_MS_PER_TICK * 1000) < (uint32_t)(LCTR_CONN_IND_US(pNewCtx->connInterval) << 1))) { LL_TRACE_WARN2("!!! Scheduling conflict, imminent SVT: incoming handle=%u prioritized over existing handle=%u", LCTR_GET_CONN_HANDLE(pNewCtx), LCTR_GET_CONN_HANDLE(pExistCtx)); return pNewOp; @@ -1144,7 +1223,7 @@ BbOpDesc_t *lctrConnResolveConflict(BbOpDesc_t *pNewOp, BbOpDesc_t *pExistOp) /*************************************************************************************************/ /*! - * \brief Compute the master clock accuracy index. + * \brief Compute the master sleep clock accuracy index. * * \return SCA index. */ @@ -1152,44 +1231,104 @@ BbOpDesc_t *lctrConnResolveConflict(BbOpDesc_t *pNewOp, BbOpDesc_t *pExistOp) uint8_t lctrComputeSca(void) { const uint16_t clkPpm = BbGetClockAccuracy(); + int8_t sca; - if (clkPpm <= 20) return 7; - else if (clkPpm <= 30) return 6; - else if (clkPpm <= 50) return 5; - else if (clkPpm <= 75) return 4; - else if (clkPpm <= 100) return 3; - else if (clkPpm <= 150) return 2; - else if (clkPpm <= 250) return 1; - else return 0; + if (clkPpm <= 20) sca = 7; + else if (clkPpm <= 30) sca = 6; + else if (clkPpm <= 50) sca = 5; + else if (clkPpm <= 75) sca = 4; + else if (clkPpm <= 100) sca = 3; + else if (clkPpm <= 150) sca = 2; + else if (clkPpm <= 250) sca = 1; + else sca = 0; + + return (uint8_t) (sca + lmgrCb.scaMod); } /*************************************************************************************************/ /*! - * \brief Get offsets of connections and periodic advertising. + * \brief Get reference time(due time) of the connection handle. * - * \param rsvnOffs Storage for list of reservation offsets indexed by handle. - * \param refTime Starting reference time. + * \param connHandle Connection handle. + * \param pDurUsec Pointer to duration of the connection BOD. * - * \return None. + * \return Due time in BB ticks of the connection handle. */ /*************************************************************************************************/ -void lctrGetConnOffsets(uint32_t rsvnOffs[], uint32_t refTime) +uint32_t lctrGetConnRefTime(uint8_t connHandle, uint32_t *pDurUsec) { - for (unsigned int connIndex = 0; connIndex < pLctrRtCfg->maxConn; connIndex++) - { - lctrConnCtx_t *pCtx = &pLctrConnTbl[connIndex]; + uint32_t refTime = 0; + lctrConnCtx_t *pCtx = LCTR_GET_CONN_CTX(connHandle); - if (pCtx->enabled && - (pCtx->bleData.chan.opType == BB_BLE_OP_MST_CONN_EVENT)) + if (pCtx->enabled && (pCtx->bleData.chan.opType == BB_BLE_OP_MST_CONN_EVENT)) + { + refTime = pCtx->connBod.due; + if (pDurUsec) { - if (pCtx->connBod.due - refTime < LCTR_SCH_MAX_SPAN) /* due time has not passed */ - { - rsvnOffs[connIndex] = BB_TICKS_TO_US(pCtx->connBod.due - refTime); - } - else - { - rsvnOffs[connIndex] = BB_TICKS_TO_US(pCtx->connBod.due + BB_US_TO_BB_TICKS(LCTR_CONN_IND_US(pCtx->connInterval)) - refTime); - } + *pDurUsec = pCtx->connBod.minDurUsec; + } + } + + return refTime; +} + +/*************************************************************************************************/ +/*! + * \brief Get the time of anchor point of the specified connection event counter. + * + * \param pCtx Connection context. + * \param ceCounter Connection event counter. + * + * \return The time of anchor point of the given connection event counter. + */ +/*************************************************************************************************/ +uint32_t lctrConnGetAnchorPoint(lctrConnCtx_t *pCtx, uint16_t ceCounter) +{ + uint16_t numCe; + + if (pCtx->role == LL_ROLE_MASTER) + { + if ((uint16_t)(ceCounter - pCtx->eventCounter) < (uint16_t)LCTR_MAX_INSTANT) /* ceCounter is in the future. */ + { + numCe = ceCounter - pCtx->eventCounter; + return (pCtx->connBod.due + BB_US_TO_BB_TICKS(LCTR_CONN_IND_US(pCtx->connInterval * numCe))); + } + else + { + numCe = pCtx->eventCounter - ceCounter; + return (pCtx->connBod.due - BB_US_TO_BB_TICKS(LCTR_CONN_IND_US(pCtx->connInterval * numCe))); + } + } + else + { + if ((uint16_t)(ceCounter - (pCtx->data.slv.lastActiveEvent - 1)) < (uint16_t)LCTR_MAX_INSTANT) /* ceCounter is in the future. */ + { + numCe = ceCounter - (pCtx->data.slv.lastActiveEvent - 1); + return (pCtx->data.slv.anchorPoint + BB_US_TO_BB_TICKS(LCTR_CONN_IND_US(pCtx->connInterval * numCe))); + } + else + { + numCe = (pCtx->data.slv.lastActiveEvent - 1) - ceCounter; + return (pCtx->data.slv.anchorPoint - BB_US_TO_BB_TICKS(LCTR_CONN_IND_US(pCtx->connInterval * numCe))); } } } + +/*************************************************************************************************/ +/*! + * \brief Check if there is a CIS established for the ACL indicated by the handle. + * + * \param handle Connection handle. + * + * \return TRUE if there is one established, FALSE otherwise. + */ +/*************************************************************************************************/ +bool_t LctrIsCisEnabled(uint16_t handle) +{ + if (pLctrConnTbl[handle].checkCisEstAcl) + { + return pLctrConnTbl[handle].checkCisEstAcl(handle); + } + + return FALSE; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_cs2.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_cs2.c index c1c9d879cb..643d72e755 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_cs2.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_cs2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller data path implementation file. + * \file + * \brief Link layer controller data path implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_data.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_data.c index 241dfb281a..eeb4b6af8d 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_data.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_data.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller data path implementation file. + * \file + * \brief Link layer controller data path implementation file. */ /*************************************************************************************************/ @@ -32,7 +33,7 @@ #include "wsf_trace.h" #include "util/bstream.h" #include "hci_defs.h" -#include "bb_drv.h" +#include "pal_bb.h" #include /************************************************************************************************** @@ -99,33 +100,21 @@ static wsfHandlerId_t lctrTxCompBufHandlerId; * \return None. */ /*************************************************************************************************/ -static void lctrCheckAbortSlvLatency(lctrConnCtx_t *pCtx) +static void lctrCheckAbortSlvLatency(lctrConnCtx_t *pCtx) { - if (pCtx->role == LL_ROLE_MASTER) + if ((pCtx->role == LL_ROLE_MASTER) || + !lctrGetConnOpFlag(pCtx, LL_OP_MODE_FLAG_ENA_SLV_LATENCY_WAKEUP)) { return; } - if (((pCtx->llcpActiveProc == LCTR_PROC_CONN_UPD) && (lctrSlvCheckConnUpdInstant(pCtx)) && (pCtx->llcpInstantComp == TRUE)) || - ((pCtx->llcpActiveProc == LCTR_PROC_PHY_UPD) && (pCtx->isSlvPhyUpdInstant == TRUE) && (pCtx->llcpInstantComp == TRUE)) || - ((pCtx->llcpActiveProc == LCTR_PROC_CMN_CH_MAP_UPD) && (pCtx->cmnState == LCTR_CMN_STATE_BUSY) && (pCtx->llcpInstantComp == TRUE))) - { - /* Don't abort slave latency between the last CE with old parameter and the first CE with new parameter. */ - return; - } - if (pCtx->maxLatency) { - const uint32_t curTime = BbDrvGetCurrentTime(); + const uint32_t curTime = PalBbGetCurrentTime(USE_RTC_BB_CLK); uint32_t connInterval = BB_US_TO_BB_TICKS(LCTR_CONN_IND_US(pCtx->connInterval)); BbOpDesc_t *pOp = &pCtx->connBod; - if ((pOp->due - curTime) >= LCTR_SCH_MAX_SPAN) - { - /* Slave tries to exit latency while the current BoD is executing. */ - pCtx->data.slv.abortSlvLatency = TRUE; - } - else if (pOp->due - curTime > connInterval) /* Imply (pOp->due - curTime) < LCTR_SCH_MAX_SPAN */ + if (((pOp->due - curTime) > connInterval) && ((pOp->due - curTime) < LCTR_SCH_MAX_SPAN)) { /* If the connection BOD is due in the future and after the next immediate anchor point, * set the flag to adjust the connection BOD later. */ @@ -136,6 +125,7 @@ static void lctrCheckAbortSlvLatency(lctrConnCtx_t *pCtx) } } } + /*************************************************************************************************/ /*! * \brief Initialize the transmit memory resources. @@ -265,6 +255,7 @@ void lctrSetPacketTimeRestriction(lctrConnCtx_t *pCtx, uint8_t txPhys) { pCtx->txPhysPending = txPhys; } + /*************************************************************************************************/ /*! * \brief Remove packet time restriction. @@ -356,13 +347,13 @@ uint16_t lctrTxFragLen(lctrConnCtx_t *pCtx) { txPhy = BB_PHY_BLE_1M; } - /* no break */ + /* Fallthrough */ case BB_PHY_BLE_1M: if (pCtx->txPhysPending & LL_PHYS_LE_CODED_BIT) { txPhy = BB_PHY_BLE_CODED; } - /* no break */ + /* Fallthrough */ case BB_PHY_BLE_CODED: /* no slower PHYs */ break; @@ -429,13 +420,14 @@ static void lctrFreeTxBufDesc(lctrTxBufDesc_t *pDesc) /*! * \brief Assemble data PDU. * + * \param pCtx Connection context. * \param pAclHdr ACL header. * \param pBuf Buffer to pack the Data PDU header. * * \return None. */ /*************************************************************************************************/ -static void lctrAssembleDataPdu(lctrAclHdr_t *pAclHdr, uint8_t *pBuf) +static void lctrAssembleDataPdu(lctrConnCtx_t *pCtx, lctrAclHdr_t *pAclHdr, uint8_t *pBuf) { /* All additional fields must be zero'ed since flow control bits will be or'ed in at transmit. */ lctrDataPduHdr_t dataHdr = { 0 }; @@ -445,10 +437,19 @@ static void lctrAssembleDataPdu(lctrAclHdr_t *pAclHdr, uint8_t *pBuf) { case LCTR_PB_START_NON_AUTO_FLUSH: dataHdr.llid = LL_LLID_START_PDU; + pCtx->forceStartPdu = FALSE; break; + case LCTR_PB_CONT_FRAG: dataHdr.llid = LL_LLID_CONT_PDU; + /* If the next data Pdu is forced to a start pdu, change pdu type to start. */ + if (pCtx->forceStartPdu == TRUE) + { + dataHdr.llid = LL_LLID_START_PDU; + pCtx->forceStartPdu = FALSE; + } break; + case LCTR_PB_VS_DATA: default: dataHdr.llid = LL_LLID_VS_PDU; @@ -528,7 +529,7 @@ void lctrTxDataPduQueue(lctrConnCtx_t *pCtx, uint16_t fragLen, lctrAclHdr_t *pAc memcpy(pData, pAclBuf, fragSize); pAclHdr->len = fragSize; - lctrAssembleDataPdu(pAclHdr, pHdr); + lctrAssembleDataPdu(pCtx, pAclHdr, pHdr); if (lctrPktEncryptHdlr && lctrPktEncryptHdlr(&pCtx->bleData.chan.enc, pHdr, pData, pMic)) { @@ -570,7 +571,7 @@ void lctrTxDataPduQueue(lctrConnCtx_t *pCtx, uint16_t fragLen, lctrAclHdr_t *pAc const uint16_t fragSize = WSF_MIN(dataRem, fragLen); pAclHdr->len = fragSize; - lctrAssembleDataPdu(pAclHdr, pDesc->frag[fragCnt].hdr); + lctrAssembleDataPdu(pCtx, pAclHdr, pDesc->frag[fragCnt].hdr); pDesc->frag[fragCnt].hdrLen = LL_DATA_HDR_LEN; if (lctrPktEncryptHdlr && lctrPktEncryptHdlr(&pCtx->bleData.chan.enc, pDesc->frag[fragCnt].hdr, pAclBuf, pDesc->frag[fragCnt].trl)) @@ -715,7 +716,7 @@ uint8_t *lctrTxCtrlPduAlloc(uint8_t pduLen) * \return Number of BB descriptors. */ /*************************************************************************************************/ -uint8_t lctrTxQueuePeek(lctrConnCtx_t *pCtx, BbBleDrvTxBufDesc_t *descs, bool_t *pMd) +uint8_t lctrTxQueuePeek(lctrConnCtx_t *pCtx, PalBbBleTxBufDesc_t *descs, bool_t *pMd) { wsfHandlerId_t handlerId; uint8_t *pTxBuf; @@ -726,7 +727,7 @@ uint8_t lctrTxQueuePeek(lctrConnCtx_t *pCtx, BbBleDrvTxBufDesc_t *descs, bool_t pTxBuf = WsfMsgPeek(&pCtx->txArqQ, &handlerId); if (pTxBuf != NULL) { - md = !lctrIsQueueDepthOne(&pCtx->txArqQ); + md = !WsfIsQueueDepthOne(&pCtx->txArqQ); /*** Send Data PDU ***/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_master.c index 2d4bbc4195..1f97b53793 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master connection operation builder implementation file. + * \file + * \brief Link layer controller master connection operation builder implementation file. */ /*************************************************************************************************/ @@ -36,11 +37,6 @@ /************************************************************************************************** Globals **************************************************************************************************/ -/*! \brief Get connection offsets callback. */ -LctrRmCback_t lctrGetConnOffsetsCback = NULL; - -/*! \brief Get periodic advertising offsets callback. */ -LctrRmCback_t lctrGetPerOffsetsCback = NULL; /*************************************************************************************************/ /*! @@ -188,7 +184,7 @@ static void lctrMstConnDisp(lctrConnMsg_t *pMsg) { if (pMsg->hdr.dispId != LCTR_DISP_BCST) { - WSF_ASSERT(pMsg->hdr.handle < pLctrRtCfg->maxConn); + WSF_ASSERT(pMsg->hdr.handle < (pLctrRtCfg->maxConn + (pLctrRtCfg->maxCis * pLctrRtCfg->maxCig))); lctrMstConnExecute(pMsg); } else @@ -236,6 +232,8 @@ void lctrMstConnBuildOp(lctrConnCtx_t *pCtx, lctrConnInd_t *pConnInd) pCtx->pingPeriodMs = lctrCalcPingPeriodMs(pCtx, LL_DEF_AUTH_TO_MS); /* pCtx->llcpState = LCTR_LLCP_STATE_IDLE; */ pCtx->llcpActiveProc = LCTR_PROC_INVALID; + pCtx->crcInit = pConnInd->crcInit; + pCtx->accessAddr = pConnInd->accessAddr; lctrBuildRemapTable(pCtx); pCtx->chIdentifier = (pConnInd->accessAddr >> 16) ^ @@ -265,7 +263,7 @@ void lctrMstConnBuildOp(lctrConnCtx_t *pCtx, lctrConnInd_t *pConnInd) /* pBle->chan.enc.enaEncrypt = FALSE; */ /* cleared in alloc */ /* pBle->chan.enc.enaDecrypt = FALSE; */ pBle->chan.enc.enaAuth = TRUE; - /* pBle->chan.enc.nonceMode = BB_NONCE_MODE_PKT_CNTR; */ /* cleared in alloc */ + /* pBle->chan.enc.nonceMode = PAL_BB_NONCE_MODE_PKT_CNTR; */ /* cleared in alloc */ pCtx->txHdr.llid = ~LL_LLID_VS_PDU; /* reset last PDU LLID */ @@ -380,8 +378,11 @@ void LctrMstConnInit(void) lmgrPersistCb.featuresDefault |= LL_FEAT_MIN_NUM_USED_CHAN; } - - lctrGetConnOffsetsCback = lctrGetConnOffsets; + if (pLctrRtCfg->btVer >= LL_VER_BT_CORE_SPEC_5_1) + { + lmgrPersistCb.featuresDefault |= + (LL_FEAT_PAST_SENDER | LL_FEAT_SCA_UPDATE); + } } /*************************************************************************************************/ @@ -415,14 +416,15 @@ uint8_t lctrComputeHopInc(void) /*! * \brief Adjust the start time of a pre-established connection BOD. * - * \param pCtx Connection context. - * \param scanRefTime Scan BOD reference time. - * \param pConnInd Connection indication. + * \param pCtx Connection context. + * \param scanRefTime Scan BOD reference time. + * \param scanMinDurUsec Scan BOD minimum duration. + * \param pConnInd Connection indication. * * \return First CE due time. */ /*************************************************************************************************/ -uint32_t lctrMstConnAdjustOpStart(lctrConnCtx_t *pCtx, uint32_t scanRefTime, lctrConnInd_t *pConnInd) +uint32_t lctrMstConnAdjustOpStart(lctrConnCtx_t *pCtx, uint32_t scanRefTime, uint32_t scanMinDurUsec, lctrConnInd_t *pConnInd) { /* Pre-resolve common structures for efficient access. */ BbOpDesc_t * const pOp = &pCtx->connBod; @@ -434,18 +436,14 @@ uint32_t lctrMstConnAdjustOpStart(lctrConnCtx_t *pCtx, uint32_t scanRefTime, lct /*** General setup ***/ - uint32_t rsvnOffs[SCH_RM_MAX_RSVN]; - memset(&rsvnOffs[0], 0, sizeof(rsvnOffs)); - if (lctrGetConnOffsetsCback) - { - lctrGetConnOffsetsCback(rsvnOffs, scanRefTime); - } - if (lctrGetPerOffsetsCback) - { - lctrGetPerOffsetsCback(&rsvnOffs[LL_MAX_CONN], scanRefTime); - } /* Use maximum txWindowOffset (i.e. connInterval) to maximize scan opportunity. */ - uint32_t maxOffsetUsec = SchRmGetOffsetUsec(rsvnOffs, LCTR_CONN_IND_US(pConnInd->interval), LCTR_GET_CONN_HANDLE(pCtx)); + uint32_t maxOffsetUsec = SchRmGetOffsetUsec(LCTR_CONN_IND_US(pConnInd->interval), LCTR_GET_CONN_HANDLE(pCtx), scanRefTime); + + if (maxOffsetUsec <= scanMinDurUsec) + { + /* To avoid the case that the connection BOD might kill the scan BOD which does the scan for the connection. */ + maxOffsetUsec += LCTR_CONN_IND_US(pConnInd->interval); + } pOp->due = scanRefTime + BB_US_TO_BB_TICKS(maxOffsetUsec); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_slave.c index c7c7cd93d9..10dda5c75c 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_conn_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,16 +16,17 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave connection operation builder implementation file. + * \file + * \brief Link layer controller slave connection operation builder implementation file. */ /*************************************************************************************************/ -#include "ll_defs.h" #include "lctr_int_conn.h" #include "lctr_int_conn_slave.h" #include "lctr_int_adv_slave.h" #include "lmgr_api_conn.h" #include "sch_api.h" +#include "sch_api_ble.h" #include "bb_ble_api.h" #include "wsf_assert.h" #include "wsf_math.h" @@ -35,6 +36,21 @@ #include "util/bstream.h" #include +/************************************************************************************************** + Global Variables +**************************************************************************************************/ +const uint16_t scaPpmTbl[] = +{ + 500, /* LL_MCA_500_PPM */ + 250, /* LL_MCA_250_PPM */ + 150, /* LL_MCA_150_PPM */ + 100, /* LL_MCA_100_PPM */ + 75, /* LL_MCA_75_PPM */ + 50, /* LL_MCA_50_PPM */ + 30, /* LL_MCA_30_PPM */ + 20 /* LL_MCA_20_PPM */ +}; + /*************************************************************************************************/ /*! * \brief Process a received connection indication PDU in slave role. @@ -119,6 +135,7 @@ static void lctrSlvProcessDataPdu(lctrConnCtx_t *pCtx, uint8_t *pBuf) static void lctrSlvConnResetHandler(void) { BbBleConnSlaveInit(); + SchRmInit(); lctrConnDefaults(); LmgrConnInit(); } @@ -181,56 +198,15 @@ static void lctrSlvConnDisp(lctrConnMsg_t *pMsg) /*************************************************************************************************/ uint16_t lctrCalcTotalAccuracy(uint8_t mstScaIdx) { - const uint16_t mstScaTbl[] = - { - 500, /* LL_MCA_500_PPM */ - 250, /* LL_MCA_250_PPM */ - 150, /* LL_MCA_150_PPM */ - 100, /* LL_MCA_100_PPM */ - 75, /* LL_MCA_75_PPM */ - 50, /* LL_MCA_50_PPM */ - 30, /* LL_MCA_30_PPM */ - 20 /* LL_MCA_20_PPM */ - }; - const uint16_t clkPpm = BbGetClockAccuracy(); - if (mstScaIdx >= (sizeof(mstScaTbl) / sizeof(mstScaTbl[0]))) + if (mstScaIdx >= (sizeof(scaPpmTbl) / sizeof(scaPpmTbl[0]))) { /* Cap to highest index. */ mstScaIdx = LL_MCA_20_PPM; } - return mstScaTbl[mstScaIdx] + clkPpm; -} - -/*************************************************************************************************/ -/*! - * \brief Compute the connection interval window widening delay in microseconds. - * - * \param pCtx Connection context. - * \param unsyncTimeUsec Unsynchronized time in microseconds. - * - * \return Window widening delay in microseconds. - */ -/*************************************************************************************************/ -uint32_t lctrCalcIntervalWindowWideningUsec(lctrConnCtx_t *pCtx, uint32_t unsyncTimeUsec) -{ - if (lctrGetConnOpFlag(pCtx, LL_OP_MODE_FLAG_ENA_WW)) - { - /* Largest unsynchronized time is 1,996 seconds (interval=4s and latency=499) and - * largest total accuracy is 1000 ppm. */ - /* coverity[overflow_before_widen] */ - uint32_t wwDlyUsec = LL_MATH_DIV_10E6(((uint64_t)unsyncTimeUsec * pCtx->data.slv.totalAcc) + - 999999); /* round up */ - - /* Reduce to 32-bits and always round up to a sleep clock tick. */ - return wwDlyUsec + pLctrRtCfg->ceJitterUsec + LL_MAX_CE_DEVIATION_USEC; - } - else - { - return 0; - } + return scaPpmTbl[mstScaIdx] + clkPpm; } /*************************************************************************************************/ @@ -298,6 +274,7 @@ void lctrSlvConnBuildOp(lctrConnCtx_t *pCtx) pCtx->pingPeriodMs = lctrCalcPingPeriodMs(pCtx, LL_DEF_AUTH_TO_MS); /* pCtx->llcpState = LCTR_LLCP_STATE_IDLE; */ pCtx->llcpActiveProc = LCTR_PROC_INVALID; + pCtx->crcInit = pConnInd->crcInit; /* Initially use fast termination. */ uint32_t fastTermCnt = txWinOffsetCnt + pConnInd->txWinSize + @@ -328,7 +305,7 @@ void lctrSlvConnBuildOp(lctrConnCtx_t *pCtx) /* pBle->chan.enc.enaEncrypt = FALSE; */ /* cleared in alloc */ /* pBle->chan.enc.enaDecrypt = FALSE; */ pBle->chan.enc.enaAuth = TRUE; - /* pBle->chan.enc.nonceMode = BB_NONCE_MODE_PKT_CNTR; */ /* cleared in alloc */ + /* pBle->chan.enc.nonceMode = PAL_BB_NONCE_MODE_PKT_CNTR; */ /* cleared in alloc */ pCtx->txHdr.llid = ~LL_LLID_VS_PDU; /* reset last PDU LLID */ @@ -340,7 +317,7 @@ void lctrSlvConnBuildOp(lctrConnCtx_t *pCtx) const uint32_t txWinOffsetUsec = LCTR_CONN_IND_US(txWinOffsetCnt); const uint32_t txWinOffset = BB_US_TO_BB_TICKS(txWinOffsetUsec); const uint32_t txWinSizeUsec = LCTR_CONN_IND_US(pConnInd->txWinSize); - const uint32_t wwOffsetUsec = lctrCalcIntervalWindowWideningUsec(pCtx, txWinOffsetUsec); + const uint32_t wwOffsetUsec = lctrCalcWindowWideningUsec((txWinOffsetUsec + txWinSizeUsec), pCtx->data.slv.totalAcc); const uint32_t wwOffset = BB_US_TO_BB_TICKS(wwOffsetUsec); int16_t dueOffsetUsec = (txWinOffsetUsec - wwOffsetUsec) - BB_TICKS_TO_US(txWinOffset - wwOffset); @@ -356,7 +333,7 @@ void lctrSlvConnBuildOp(lctrConnCtx_t *pCtx) pOp->protId = BB_PROT_BLE; pOp->prot.pBle = pBle; pOp->endCback = lctrSlvConnEndOp; - pOp->abortCback = lctrSlvConnEndOp; + pOp->abortCback = lctrSlvConnAbortOp; pOp->pCtx = pCtx; /*** BLE connection setup ***/ @@ -394,7 +371,7 @@ void lctrSlvConnBuildOp(lctrConnCtx_t *pCtx) /* Initial eventCounter starts at 0; equivalent to unsynchronized intervals. */ uint32_t unsyncTimeUsec = LCTR_CONN_IND_US(pCtx->connInterval * pCtx->eventCounter); uint32_t unsyncTime = BB_US_TO_BB_TICKS(unsyncTimeUsec); - uint32_t wwTotalUsec = lctrCalcIntervalWindowWideningUsec(pCtx, unsyncTimeUsec); + uint32_t wwTotalUsec = lctrCalcWindowWideningUsec(unsyncTimeUsec, pCtx->data.slv.totalAcc); uint32_t wwTotal = BB_US_TO_BB_TICKS(wwTotalUsec); dueOffsetUsec = (unsyncTimeUsec - wwTotalUsec) - BB_TICKS_TO_US(unsyncTime - wwTotal); @@ -463,6 +440,11 @@ void LctrSlvConnInit(void) lmgrPersistCb.featuresDefault |= LL_FEAT_MIN_NUM_USED_CHAN; } + if (pLctrRtCfg->btVer >= LL_VER_BT_CORE_SPEC_5_1) + { + lmgrPersistCb.featuresDefault |= + (LL_FEAT_PAST_SENDER | LL_FEAT_SCA_UPDATE); + } } /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_enc_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_enc_master.c index 6a2355870e..d58c4ab9a2 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_enc_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_enc_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master encryption implementation file. + * \file + * \brief Link layer controller master encryption implementation file. */ /*************************************************************************************************/ @@ -107,16 +108,16 @@ void LctrMstConnEncInit(void) lctrCtrlPduHdlr = lctrMstEncProcessDataPdu; /* Add packet encryption handlers. */ - lctrInitCipherBlkHdlr = BbBleDrvAesInitCipherBlock; + lctrInitCipherBlkHdlr = PalCryptoAesSetupCipherBlock; #if (!BB_ENABLE_INLINE_ENC_TX) - lctrPktEncryptHdlr = BbBleDrvAesCcmEncrypt; + lctrPktEncryptHdlr = PalCryptoAesCcmEncrypt; #else - lctrSetEncryptPktCountHdlr = BbBleDrvSetEncryptPacketCount; + lctrSetEncryptPktCountHdlr = PalCryptoSetEncryptPacketCount; #endif #if (!BB_ENABLE_INLINE_DEC_RX) - lctrPktDecryptHdlr = BbBleDrvAesCcmDecrypt; + lctrPktDecryptHdlr = PalCryptoAesCcmDecrypt; #else - lctrSetDecryptPktCountHdlr = BbBleDrvSetDecryptPacketCount; + lctrSetDecryptPktCountHdlr = PalCryptoSetDecryptPacketCount; #endif /* Set supported features. */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_enc_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_enc_slave.c index 245dc2d667..a296d96fc3 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_enc_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_enc_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave encryption implementation file. + * \file + * \brief Link layer controller slave encryption implementation file. */ /*************************************************************************************************/ @@ -86,16 +87,16 @@ void LctrSlvConnEncInit(void) } /* Add packet encryption handlers. */ - lctrInitCipherBlkHdlr = BbBleDrvAesInitCipherBlock; + lctrInitCipherBlkHdlr = PalCryptoAesSetupCipherBlock; #if (!BB_ENABLE_INLINE_ENC_TX) - lctrPktEncryptHdlr = BbBleDrvAesCcmEncrypt; + lctrPktEncryptHdlr = PalCryptoAesCcmEncrypt; #else - lctrSetEncryptPktCountHdlr = BbBleDrvSetEncryptPacketCount; + lctrSetEncryptPktCountHdlr = PalCryptoSetEncryptPacketCount; #endif #if (!BB_ENABLE_INLINE_DEC_RX) - lctrPktDecryptHdlr = BbBleDrvAesCcmDecrypt; + lctrPktDecryptHdlr = PalCryptoAesCcmDecrypt; #else - lctrSetDecryptPktCountHdlr = BbBleDrvSetDecryptPacketCount; + lctrSetDecryptPktCountHdlr = PalCryptoSetDecryptPacketCount; #endif /* Set supported features. */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_init_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_init_master.c index aa870143cf..b03fe50bc8 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_init_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_init_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master scanning operation builder implementation file. + * \file + * \brief Link layer controller master scanning operation builder implementation file. */ /*************************************************************************************************/ @@ -80,6 +81,7 @@ static void lctrMstPreInitiateExecHandler(BbOpDesc_t *pOp) * before initiate's scan operation sets up its executing duration (i.e. "pre-execute"). */ lctrMstInit.data.init.firstCeDue = lctrMstConnAdjustOpStart(LCTR_GET_CONN_CTX(lctrMstInit.data.init.connHandle), pOp->due, + pOp->minDurUsec, &lctrMstInit.data.init.connInd); lctrMstInit.data.init.connBodLoaded = TRUE; } @@ -168,7 +170,7 @@ void lctrMstInitiateBuildOp(LlConnSpec_t *pConnSpec, uint8_t peerAddrType, uint6 pConnInd->interval = lctrMstInit.data.init.connInterval; pConnInd->latency = pConnSpec->connLatency; pConnInd->timeout = pConnSpec->supTimeout; - pConnInd->chanMask = lmgrMstScanCb.chanClass; + pConnInd->chanMask = lmgrCb.chanClass; pConnInd->hopInc = lctrComputeHopInc(); pConnInd->masterSca = lctrComputeSca(); @@ -299,3 +301,29 @@ void LctrMstInitDefaults(void) { memset(&lctrMstInit, 0, sizeof(lctrMstScan)); } + + +/*************************************************************************************************/ +/*! + * \brief Check whether init is enabled or not. + * + * \return True if scanner enabled. False if not. + */ +/*************************************************************************************************/ +bool_t LctrMstInitIsEnabled(void) +{ + return (lctrMstInit.state != LCTR_SCAN_STATE_DISABLED); +} + +/*************************************************************************************************/ +/*! + * \brief Check if private address is being used for scanner + * + * \return Returns True if scanner is using private addresses. False if not. + */ +/*************************************************************************************************/ +bool_t LctrMstInitIsPrivAddr(void) +{ + /* Check if private address bit is set. */ + return (lctrMstInit.scanParam.ownAddrType & LL_ADDR_RANDOM_BIT); +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_init_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_init_master_ae.c index 63b9d4248d..a3c48c35e2 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_init_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_init_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master scanning operation builder implementation file. + * \file + * \brief Link layer controller master scanning operation builder implementation file. */ /*************************************************************************************************/ @@ -40,7 +41,7 @@ /*! \brief Extended scan operational context. */ lctrExtScanCtx_t lctrMstExtInitTbl[LCTR_SCAN_PHY_TOTAL]; -/*! \brief Extended scan control block. */ +/*! \brief Extended initiator control block. */ lctrExtInitCtrlBlk_t lctrMstExtInit; /*************************************************************************************************/ @@ -69,29 +70,6 @@ static void lctrMstExtInitExecuteCommonSm(LctrExtScanMsg_t *pMsg) /* Subsystem event handling. */ switch (pMsg->hdr.event) { - case LCTR_EXT_INIT_MSG_TERMINATE: - for (unsigned i = 0; i < LCTR_SCAN_PHY_TOTAL; i++) - { - if (lctrMstExtInit.enaPhys & (1 << i)) - { - if ((lctrMstExtInit.estConnPhys & (1 << i)) == 0) - { - if (lctrMstExtInit.initTermByHost) - { - lctrConnCtx_t *pCtx = LCTR_GET_CONN_CTX(lctrMstExtInitTbl[i].data.init.connHandle); - - if (pCtx->enabled == TRUE) - { - /* Cleanup unused initiate PHY connection context. */ - SchRmRemove(lctrMstExtInitTbl[i].data.init.connHandle); - lctrFreeConnCtx(pCtx); - } - } - } - } - } - break; - case LCTR_EXT_INIT_MSG_INITIATE: { LL_TRACE_INFO1("lctrMstExtInitExecuteCommonSm: scanMode=%u, event=INITIATE", lmgrCb.scanMode); @@ -124,8 +102,6 @@ static void lctrMstExtInitExecuteCommonSm(LctrExtScanMsg_t *pMsg) if (status != LL_SUCCESS) { - lctrScanNotifyHostInitiateError(status, pExtInitMsg->peerAddrType, pExtInitMsg->peerAddr); - lctrSendExtInitMsg(NULL, LCTR_EXT_INIT_MSG_INITIATE_CANCEL); break; } @@ -153,6 +129,10 @@ static void lctrMstExtInitExecuteCommonSm(LctrExtScanMsg_t *pMsg) LL_TRACE_INFO1("lctrMstExtInitExecuteCommonSm: scanMode=%u, event=RESET", lmgrCb.scanMode); break; + case LCTR_EXT_INIT_MSG_TERMINATE: + LL_TRACE_INFO1("lctrMstExtInitExecuteCommonSm: scanMode=%u, event=TERMINATE", lmgrCb.scanMode); + break; + default: LL_TRACE_ERR2("lctrMstExtInitExecuteCommonSm: scanMode=%u, event=%u -- unknown event", lmgrCb.scanMode, pMsg->hdr.event); /* No action required. */ @@ -182,16 +162,6 @@ static void lctrMstExtInitDisp(LctrExtScanMsg_t *pMsg) isBcstMsg = TRUE; } - /* Set message property. */ - switch (event) - { - case LCTR_EXT_INIT_MSG_INITIATE_CANCEL: - lctrMstExtInit.initTermByHost = TRUE; - break; - default: - break; - } - /* Broadcast message. */ switch (event) { @@ -324,7 +294,7 @@ uint8_t lctrMstExtInitiateBuildOp(lctrExtScanCtx_t *pExtInitCtx, LlConnSpec_t *p pConnInd->interval = pExtInitCtx->data.init.connInterval; pConnInd->latency = pConnSpec->connLatency; pConnInd->timeout = pConnSpec->supTimeout; - pConnInd->chanMask = lmgrMstScanCb.chanClass; + pConnInd->chanMask = lmgrCb.chanClass; pConnInd->hopInc = lctrComputeHopInc(); pConnInd->masterSca = lctrComputeSca(); @@ -342,15 +312,6 @@ uint8_t lctrMstExtInitiateBuildOp(lctrExtScanCtx_t *pExtInitCtx, LlConnSpec_t *p pExtInitCtx->reqPduHdr.pduType = LL_PDU_CONNECT_IND; pExtInitCtx->reqPduHdr.len = LL_CONN_IND_PDU_LEN; - if (lmgrCb.features & LL_FEAT_CH_SEL_2) - { - pExtInitCtx->reqPduHdr.chSel = LL_CH_SEL_2; - } - else - { - pExtInitCtx->reqPduHdr.chSel = LL_CH_SEL_1; - } - /* Always match local address in PDU to initiator's address (in directed advertisements). */ if (pExtInitCtx->data.init.ownAddrType & LL_ADDR_RANDOM_BIT) { @@ -575,7 +536,13 @@ void LctrMstExtInitInit(void) /* Add initiate message dispatchers. */ lctrMsgDispTbl[LCTR_DISP_EXT_INIT] = (LctrMsgDisp_t)lctrMstExtInitDisp; + + /* Add utility function pointers. */ + LctrMstExtInitEnabled = LctrMstExtInitIsEnabled; + LctrMstExtInitDefaults(); + + lmgrPersistCb.extInitCtxSize = sizeof(lctrExtScanCtx_t); } /*************************************************************************************************/ @@ -671,3 +638,32 @@ void lctrSendExtInitMsg(lctrExtScanCtx_t *pExtInitCtx, uint8_t event) WsfMsgSend(lmgrPersistCb.handlerId, pMsg); } } + +/*************************************************************************************************/ +/*! + * \brief Check if scanner is enabled or not. + * + * \param scanPhy scanner Phy. + * + * \return True if scanner enabled. False if not. + */ +/*************************************************************************************************/ +bool_t LctrMstExtInitIsEnabled(uint8_t scanPhy) +{ + return (lctrMstExtInitTbl[scanPhy].state != LCTR_EXT_SCAN_STATE_DISABLED); +} + +/*************************************************************************************************/ +/*! + * \brief Check if private addresses are being used. + * + * \param scanPhy scanner Phy. + * + * \return Returns True if scanner is using private addresses. False if not. + */ +/*************************************************************************************************/ +bool_t LctrMstExtInitIsPrivAddr(uint8_t scanPhy) +{ + /* Check if private address bit is enabled. */ + return (lctrMstExtInitTbl[scanPhy].scanParam.ownAddrType & LL_ADDR_RANDOM_BIT); +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_master_phy.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_master_phy.c index 03ee724c73..6df99ca042 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_master_phy.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_master_phy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller PHY features (master) implementation file. + * \file + * \brief Link layer controller PHY features (master) implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_past.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_past.c new file mode 100644 index 0000000000..47eb399186 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_past.c @@ -0,0 +1,218 @@ +/* Copyright (c) 2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*************************************************************************************************/ +/*! + * \file + * \brief Link layer controller periodic sync transfer implementation file. + */ +/*************************************************************************************************/ + +#include "lctr_int_adv_master_ae.h" +#include "lctr_int_adv_master.h" +#include "lctr_api_adv_master_ae.h" +#include "lctr_int_conn.h" +#include "sch_api.h" +#include "sch_api_ble.h" +#include "bb_ble_api_reslist.h" +#include "wsf_assert.h" +#include "wsf_msg.h" +#include "wsf_trace.h" +#include "wsf_math.h" +#include "util/bstream.h" + +/************************************************************************************************** + Globals +**************************************************************************************************/ + +/*************************************************************************************************/ +/*! + * \brief Send sync info about periodic advertising to a connected device. + * + * \param connHandle Connection handle. + * \param serviceData Service data provided by the host. + * \param syncHandle Periodic sync handle. + * + * \return Status error code. + * + * Send sync info about about periodic advertising to a connected device. + */ +/*************************************************************************************************/ +uint8_t LctrPeriodicAdvSyncTransfer(uint16_t connHandle, uint16_t serviceData, uint16_t syncHandle) +{ + lctrPerAdvSyncTrsf_t *pMsg; + + if (syncHandle > LL_SYNC_MAX_HANDLE) + { + return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; + } + + if (syncHandle >= LL_MAX_PER_SCAN) + { + return LL_ERROR_CODE_UNKNOWN_ADV_ID; + } + + if ((lctrMstPerScanTbl[syncHandle].enabled == FALSE) || + (lctrMstPerScanTbl[syncHandle].state != LCTR_PER_SCAN_STATE_SYNC_ESTD)) + { + return LL_ERROR_CODE_UNKNOWN_ADV_ID; + } + + if (connHandle >= pLctrRtCfg->maxConn) + { + return LL_ERROR_CODE_UNKNOWN_CONN_ID; + } + + lctrConnCtx_t *pCtx = LCTR_GET_CONN_CTX(connHandle); + if (!pCtx->enabled) + { + return LL_ERROR_CODE_UNKNOWN_CONN_ID; + } + + /* Do not allow long control PDU if we do not know the remote feature explicitly. */ + if (((pCtx->usedFeatSet & LL_FEAT_PAST_RECIPIENT) == 0) || !pCtx->featExchFlag) + { + return LL_ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE; + } + + if ((pMsg = (lctrPerAdvSyncTrsf_t *)WsfMsgAlloc(sizeof(*pMsg))) != NULL) + { + pMsg->hdr.handle = connHandle; + pMsg->hdr.dispId = LCTR_DISP_CONN; + pMsg->hdr.event = LCTR_CONN_MSG_API_PER_ADV_SYNC_TRSF; + pMsg->syncSource = LCTR_SYNC_SRC_SCAN; + pMsg->syncHandle = syncHandle; + pMsg->serviceData = serviceData; + + WsfMsgSend(lmgrPersistCb.handlerId, pMsg); + } + + return LL_SUCCESS; +} + +/*************************************************************************************************/ +/*! + * \brief Send sync info about periodic adv in an advertising set to a connected device. + * + * \param connHandle Connection handle. + * \param serviceData Service data provided by the host. + * \param advHandle Handle to identify an advertising set. + * + * + * \return Status error code. + * + * Send sync info about periodic adv in an advertising set to a connected device. + */ +/*************************************************************************************************/ +uint8_t LctrPeriodicAdvSetInfoTransfer(uint16_t connHandle, uint16_t serviceData, uint8_t advHandle) +{ + lctrPerAdvSyncTrsf_t *pMsg; + lctrAdvSet_t *pAdvSet; + + if (connHandle >= pLctrRtCfg->maxConn) + { + return LL_ERROR_CODE_UNKNOWN_CONN_ID; + } + + if ((pAdvSet = lctrFindAdvSet(advHandle)) == NULL) + { + return LL_ERROR_CODE_UNKNOWN_ADV_ID; + } + + if (pAdvSet->perParam.perAdvEnabled != TRUE) + { + return LL_ERROR_CODE_CMD_DISALLOWED; + } + + lctrConnCtx_t *pCtx = LCTR_GET_CONN_CTX(connHandle); + if (!pCtx->enabled) + { + return LL_ERROR_CODE_UNKNOWN_CONN_ID; + } + + /* Do not allow long control PDU if we do not know the remote feature explicitly. */ + if (((pCtx->usedFeatSet & LL_FEAT_PAST_RECIPIENT) == 0) || !pCtx->featExchFlag) + { + return LL_ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE; + } + + if ((pMsg = (lctrPerAdvSyncTrsf_t *)WsfMsgAlloc(sizeof(*pMsg))) != NULL) + { + pMsg->hdr.handle = connHandle; + pMsg->hdr.dispId = LCTR_DISP_CONN; + pMsg->hdr.event = LCTR_CONN_MSG_API_PER_ADV_SYNC_TRSF; + pMsg->syncSource = LCTR_SYNC_SRC_BCST; + pMsg->syncHandle = advHandle; + pMsg->serviceData = serviceData; + + WsfMsgSend(lmgrPersistCb.handlerId, pMsg); + } + + return LL_SUCCESS; +} + +/*************************************************************************************************/ +/*! + * \brief Set periodic advertising sync transfer parameters. + * + * \param connHandle Connection handle. + * \param mode Periodic sync advertising sync transfer mode. + * \param skip The number of periodic advertising packets that can be skipped after a successful receive. + * \param syncTimeout Synchronization timeout for the periodic advertising. + * \param cteType Constant tone extension type(Used in AoD/AoA). + * + * \return Status error code. + * + * Set periodic advertising sync transfer parameters. + */ +/*************************************************************************************************/ +uint8_t LctrSetPeriodicAdvSyncTransParams(uint16_t connHandle, uint8_t mode, uint16_t skip, uint16_t syncTimeout, uint8_t cteType) +{ + if (connHandle >= pLctrRtCfg->maxConn) + { + return LL_ERROR_CODE_UNKNOWN_CONN_ID; + } + + lctrConnCtx_t *pCtx = LCTR_GET_CONN_CTX(connHandle); + if (!pCtx->enabled) + { + return LL_ERROR_CODE_UNKNOWN_CONN_ID; + } + + pCtx->syncMode = mode; + pCtx->syncSkip = skip; + pCtx->syncTimeout = syncTimeout; + + return LL_SUCCESS; +} + +/*************************************************************************************************/ +/*! + * \brief Initialize lctr subsystem for PAST(Periodic advertising sync transfer). + * + * \return None. + * + * This function initializes the lctr subsystem for PAST(Periodic advertising sync transfer). + */ +/*************************************************************************************************/ +void LctrPastInit(void) +{ + lctrSendPerSyncFromScanFn = lctrSendPerSyncFromScan; + lctrSendPerSyncFromBcstFn = lctrSendPerSyncFromBcst; + lctrStorePeriodicSyncTrsfFn = lctrStorePeriodicSyncTrsf; + lctrSendPeriodicSyncIndFn = lctrSendPeriodicSyncInd; + lctrReceivePeriodicSyncIndFn = lctrReceivePeriodicSyncInd; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_priv.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_priv.c index 5ef0d0cccc..281f7319ad 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_priv.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_priv.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller privacy implementation file. + * \file + * \brief Link layer controller privacy implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_sc.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_sc.c index 0a60891690..7138c7a4e8 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_sc.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_sc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller secure connections implementation file. + * \file + * \brief Link layer controller secure connections implementation file. */ /*************************************************************************************************/ @@ -28,8 +29,274 @@ #include "wsf_assert.h" #include "ll_math.h" #include "wsf_trace.h" +#include "uECC_ll.h" +#include "pal_bb_ble.h" #include +/*************************************************************************************************/ +/*! + * \brief Baseband driver ECC service function. + * + * \param op Operation to service. + * + * \return None. + */ +/*************************************************************************************************/ +static void lctrScBbDrvEcc(uint8_t op) +{ + switch (op) + { + case LL_MATH_ECC_OP_GENERATE_P256_KEY_PAIR: + WsfSetEvent(lmgrPersistCb.handlerId, (1 << LCTR_EVENT_SC_GENERATE_P256_KEY_PAIR)); + break; + + case LL_MATH_ECC_OP_GENERATE_DH_KEY: + WsfSetEvent(lmgrPersistCb.handlerId, (1 << LCTR_EVENT_SC_GENERATE_DHKEY)); + break; + + default: + WSF_ASSERT(FALSE); + break; + } +} + +/*************************************************************************************************/ +/*! + * \brief Random number generator used by uECC. + * + * \param pDest Buffer to hold random number + * \param size Size of pDest in bytes . + * + * \return TRUE if successful. + */ +/*************************************************************************************************/ +static int lctrRng(uint8_t *pDest, unsigned size) +{ + PalCryptoGenerateRandomNumber(pDest, size); + + return TRUE; +} + +/*************************************************************************************************/ +/*! + * \brief Copy octets to another buffer, reversing order. + * + * \param pDest Destination buffer. + * \param pSrc Source buffer. + * \param len Length of data, in octets. + * + * \return None. + */ +/*************************************************************************************************/ +static void lctrReverseCopy(uint8_t *pDest, const uint8_t *pSrc, uint16_t len) +{ + pSrc += len - 1; + while (len-- > 0) + { + *pDest++ = *pSrc--; + } +} + +/*************************************************************************************************/ +/*! + * \brief Reverse order of octets in buffer. + * + * \param p Buffer. + * \param len Length of data, in octets. + * + * \return None. + */ +/*************************************************************************************************/ +static void lctrReverse(uint8_t *p, uint16_t len) +{ + uint8_t *pStart = p; + uint8_t *pEnd = p + len - 1; + uint8_t temp; + + len /= 2; + while (len-- > 0) + { + temp = *pStart; + *pStart++ = *pEnd; + *pEnd-- = temp; + } +} + +/*************************************************************************************************/ +/*! + * \brief Start generating P-256 key pair. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrGenerateP256KeyPairStart(void) +{ + uint8_t privKey[LL_ECC_KEY_LEN]; + + /* Generate private key. */ + lctrRng(privKey, sizeof(privKey)); + + /* Start public key generation. */ + uECC_set_rng_ll(lctrRng); + uECC_make_key_start(privKey); + + lctrScBbDrvEcc(LL_MATH_ECC_OP_GENERATE_P256_KEY_PAIR); +} + +/*************************************************************************************************/ +/*! + * \brief Start generating P-256 public key with a specified private key. + * + * \param pPrivKey Private key. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrGenerateP256PublicKeyStart(const uint8_t *pPrivKey) +{ + uint8_t privKey[LL_ECC_KEY_LEN]; + + /* Reverse private key (to big endian). */ + lctrReverseCopy(privKey, pPrivKey, LL_ECC_KEY_LEN); + + /* Start public key generation. */ + uECC_set_rng_ll(lctrRng); + uECC_make_key_start(privKey); + + lctrScBbDrvEcc(LL_MATH_ECC_OP_GENERATE_P256_KEY_PAIR); +} + +/*************************************************************************************************/ +/*! + * \brief Continue generating P-256 key pair. + * + * \return TRUE if key generation complete. + */ +/*************************************************************************************************/ +bool_t lctrGenerateP256KeyPairContinue(void) +{ + if (uECC_make_key_continue()) + { + return TRUE; + } + + lctrScBbDrvEcc(LL_MATH_ECC_OP_GENERATE_P256_KEY_PAIR); + return FALSE; +} + +/*************************************************************************************************/ +/*! + * \brief Get results from generating P-256 key pair. + * + * \param pPubKey Storage for public key. + * \param pPrivKey Storage for private key. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrGenerateP256KeyPairComplete(uint8_t *pPubKey, uint8_t *pPrivKey) +{ + /* Complete key generation. */ + uECC_make_key_complete(pPubKey, pPrivKey); + + /* Reverse keys (to little endian). */ + lctrReverse(pPubKey, LL_ECC_KEY_LEN); + lctrReverse(pPubKey + LL_ECC_KEY_LEN, LL_ECC_KEY_LEN); + lctrReverse(pPrivKey, LL_ECC_KEY_LEN); +} + +/*************************************************************************************************/ +/*! + * \brief Start generating Diffie-Hellman key. + * + * \param pPubKey Public key. + * \param pPrivKey Private key. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrGenerateDhKeyStart(const uint8_t *pPubKey, const uint8_t *pPrivKey) +{ + uint8_t pubKey[LL_ECC_KEY_LEN * 2]; + uint8_t privKey[LL_ECC_KEY_LEN]; + + /* Reverse keys (to big endian). */ + lctrReverseCopy(pubKey, pPubKey, LL_ECC_KEY_LEN); + lctrReverseCopy(pubKey + LL_ECC_KEY_LEN, pPubKey + LL_ECC_KEY_LEN, LL_ECC_KEY_LEN); + lctrReverseCopy(privKey, pPrivKey, LL_ECC_KEY_LEN); + + /* Start shared secret generation. */ + uECC_set_rng_ll(lctrRng); + uECC_shared_secret_start(pubKey, privKey); + + lctrScBbDrvEcc(LL_MATH_ECC_OP_GENERATE_DH_KEY); +} + +/*************************************************************************************************/ +/*! + * \brief Continue generating Diffie-Hellman key. + * + * \return TRUE if Diffie-Hellman key generation complete. + */ +/*************************************************************************************************/ +bool_t lctrGenerateDhKeyContinue(void) +{ + if (uECC_shared_secret_continue()) + { + return TRUE; + } + + lctrScBbDrvEcc(LL_MATH_ECC_OP_GENERATE_DH_KEY); + return FALSE; +} + +/*************************************************************************************************/ +/*! + * \brief Get results from generating Diffie-Hellman key. + * + * \param pDhKey Storage for Diffie-Hellman key. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrGenerateDhKeyComplete(uint8_t *pDhKey) +{ + /* Complete shared secret generation. */ + uECC_shared_secret_complete(pDhKey); + + /* Reverse shared secret (to little endian). */ + lctrReverse(pDhKey, LL_ECC_KEY_LEN); +} + +/*************************************************************************************************/ +/*! + * \brief Validate public key. + * + * \param pPubKey Public key. + * \param generateKey Generate DHKey event if true. + * + * \return TRUE if public key is valid. + */ +/*************************************************************************************************/ +bool_t lctrValidatePublicKey(const uint8_t *pPubKey, bool_t generateKey) +{ + bool_t pubKeyValid; + + uint8_t pubKey[LL_ECC_KEY_LEN * 2]; + /* Reverse keys (to big endian). */ + lctrReverseCopy(pubKey, pPubKey, LL_ECC_KEY_LEN); + lctrReverseCopy(pubKey + LL_ECC_KEY_LEN, pPubKey + LL_ECC_KEY_LEN, LL_ECC_KEY_LEN); + + pubKeyValid = (bool_t)uECC_valid_public_key_ll(pubKey); + + if (!pubKeyValid && generateKey) + { + lctrScBbDrvEcc(LL_MATH_ECC_OP_GENERATE_DH_KEY); + } + + return pubKeyValid; +} + /*************************************************************************************************/ /*! * \brief Notify host of key generation. @@ -81,7 +348,7 @@ static void lctrNotifyGenerateDhKeyInd(const uint8_t *pDhKey) } }; - evt.status = LL_SUCCESS; + evt.status = lmgrScCb.pubKeyValid ? LL_SUCCESS : LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; memcpy(evt.dhKey, pDhKey, sizeof(evt.dhKey)); LL_TRACE_INFO0("### LlEvent ### LL_GENERATE_DHKEY_CMPL_IND, status=LL_SUCCESS"); @@ -98,12 +365,12 @@ static void lctrNotifyGenerateDhKeyInd(const uint8_t *pDhKey) /*************************************************************************************************/ static void lctrScGenerateP256KeyPairContinue(void) { - if (LlMathEccGenerateP256KeyPairContinue()) + if (lctrGenerateP256KeyPairContinue()) { uint8_t pubKey[LL_ECC_KEY_LEN * 2]; /* Set the newly-generated private key as the local key. */ - LlMathEccGenerateP256KeyPairComplete(pubKey, lmgrScCb.privKey); + lctrGenerateP256KeyPairComplete(pubKey, lmgrScCb.privKey); /* Notify host that the key was generated. */ lctrNotifyReadLocalP256PubKeyInd(pubKey); @@ -121,11 +388,22 @@ static void lctrScGenerateP256KeyPairContinue(void) /*************************************************************************************************/ static void lctrScGenerateDhKeyContinue(void) { - if (LlMathEccGenerateDhKeyContinue()) + if (!lmgrScCb.pubKeyValid) + { + uint8_t dhKeyInvalid[LL_ECC_KEY_LEN]; + + memset(dhKeyInvalid, 0xFF, LL_ECC_KEY_LEN); + + lctrNotifyGenerateDhKeyInd(dhKeyInvalid); + + return; + } + + if (lctrGenerateDhKeyContinue()) { uint8_t dhKey[LL_ECC_KEY_LEN]; - LlMathEccGenerateDhKeyComplete(dhKey); + lctrGenerateDhKeyComplete(dhKey); /* Notify host that the key was generated. */ lctrNotifyGenerateDhKeyInd(dhKey); @@ -134,33 +412,6 @@ static void lctrScGenerateDhKeyContinue(void) } } -/*************************************************************************************************/ -/*! - * \brief Baseband driver ECC service callback. - * - * \param op Operation to service. - * - * \return None. - */ -/*************************************************************************************************/ -static void lctrScBbDrvEccServiceCback(uint8_t op) -{ - switch (op) - { - case LL_MATH_ECC_OP_GENERATE_P256_KEY_PAIR: - WsfSetEvent(lmgrPersistCb.handlerId, (1 << LCTR_EVENT_SC_GENERATE_P256_KEY_PAIR)); - break; - - case LL_MATH_ECC_OP_GENERATE_DH_KEY: - WsfSetEvent(lmgrPersistCb.handlerId, (1 << LCTR_EVENT_SC_GENERATE_DHKEY)); - break; - - default: - WSF_ASSERT(FALSE); - break; - } -} - /*************************************************************************************************/ /*! * \brief Generate a P-256 public/private key pair. @@ -183,11 +434,11 @@ uint8_t LctrGenerateP256KeyPair(void) lmgrScCb.eccOpActive = TRUE; if (lmgrScCb.privKeySet) { - LlMathEccGenerateP256PublicKeyStart(lmgrScCb.privKey); + lctrGenerateP256PublicKeyStart(lmgrScCb.privKey); } else { - LlMathEccGenerateP256KeyPairStart(); + lctrGenerateP256KeyPairStart(); } return LL_SUCCESS; @@ -215,13 +466,85 @@ uint8_t LctrGenerateDhKey(const uint8_t *pPubKey, const uint8_t *pPrivKey) return LL_ERROR_CODE_CMD_DISALLOWED; } + bool_t generateKey = ((lmgrScCb.validatePubKeyMode == KEY_VALIDATE_MODE_ALT2) ? TRUE: FALSE); + + /* Check if public key is valid first. */ + lmgrScCb.pubKeyValid = lctrValidatePublicKey(pPubKey, generateKey); + + if (!lmgrScCb.pubKeyValid) + { + return (generateKey ? LL_SUCCESS: LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS); + } + /* Start operation. */ lmgrScCb.eccOpActive = TRUE; - LlMathEccGenerateDhKeyStart(pPubKey, pPrivKey); + lctrGenerateDhKeyStart(pPubKey, pPrivKey); return LL_SUCCESS; } +/*************************************************************************************************/ +/*! + * \brief Generate a debug Diffie-Hellman key using the spec-defined debug keys. + * + * \return Status error code. + * + */ +/*************************************************************************************************/ +uint8_t LctrGenerateDebugDhKey() +{ + const uint8_t privKey[LL_ECC_KEY_LEN] = { + 0xbd, 0x1a, 0x3c, 0xcd, 0xa6, 0xb8, 0x99, 0x58, + 0x99, 0xb7, 0x40, 0xeb, 0x7b, 0x60, 0xff, 0x4a, + 0x50, 0x3f, 0x10, 0xd2, 0xe3, 0xb3, 0xc9, 0x74, + 0x38, 0x5f, 0xc5, 0xa3, 0xd4, 0xf6, 0x49, 0x3f + }; + + const uint8_t pubKey[LL_ECC_KEY_LEN * 2] = { + /* pubDebugKey_x */ + 0xe6, 0x9d, 0x35, 0x0e, 0x48, 0x01, 0x03, 0xcc, + 0xdb, 0xfd, 0xf4, 0xac, 0x11, 0x91, 0xf4, 0xef, + 0xb9, 0xa5, 0xf9, 0xe9, 0xa7, 0x83, 0x2c, 0x5e, + 0x2c, 0xbe, 0x97, 0xf2, 0xd2, 0x03, 0xb0, 0x20, + /* pubDebuKey_y */ + 0x8b, 0xd2, 0x89, 0x15, 0xd0, 0x8e, 0x1c, 0x74, + 0x24, 0x30, 0xed, 0x8f, 0xc2, 0x45, 0x63, 0x76, + 0x5c, 0x15, 0x52, 0x5a, 0xbf, 0x9a, 0x32, 0x63, + 0x6d, 0xeb, 0x2a, 0x65, 0x49, 0x9c, 0x80, 0xdc + }; + + /* Allow only one key pair generation at a time. */ + if (lmgrScCb.eccOpActive) + { + return LL_ERROR_CODE_CMD_DISALLOWED; + } + + /* Debug key is always valid. */ + lmgrScCb.pubKeyValid = TRUE; + + /* Start operation. */ + lmgrScCb.eccOpActive = TRUE; + lctrGenerateDhKeyStart(pubKey, privKey); + + return LL_SUCCESS; +} + +/*************************************************************************************************/ +/*! + * \brief Set validate public key mode. + * + * \param validateMode ALT1 or ALT2. + * + * \return Status error code. + * + */ +/*************************************************************************************************/ +uint8_t LctrSetValidatePublicKeyMode(uint8_t validateMode) +{ + lmgrScCb.validatePubKeyMode = validateMode; + return LL_SUCCESS; +} + /*************************************************************************************************/ /*! * \brief Initialize link layer controller resources for secure connections. @@ -234,5 +557,6 @@ void LctrScInit(void) lctrEventHdlrTbl[LCTR_EVENT_SC_GENERATE_P256_KEY_PAIR] = lctrScGenerateP256KeyPairContinue; lctrEventHdlrTbl[LCTR_EVENT_SC_GENERATE_DHKEY] = lctrScGenerateDhKeyContinue; - LlMathEccSetServiceCback(lctrScBbDrvEccServiceCback); + lmgrPersistCb.featuresDefault |= LL_FEAT_REMOTE_PUB_KEY_VALIDATION; + lmgrScCb.validatePubKeyMode = KEY_VALIDATE_MODE_ALT2; } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_slave_phy.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_slave_phy.c index 74566c1ce0..3edbe1a454 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_slave_phy.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_main_slave_phy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller PHY features (slave) implementation file. + * \file + * \brief Link layer controller PHY features (slave) implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv.h index bcf0dfb09d..4bbdf99bf7 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller advertising channel packet interface file. + * \file + * \brief Link layer controller advertising channel packet interface file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_ae.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_ae.h index a4941ddb70..bc7e23d05c 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_ae.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_ae.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller extended advertising channel packet interface file. + * \file + * \brief Link layer controller extended advertising channel packet interface file. */ /*************************************************************************************************/ @@ -57,7 +58,6 @@ enum #define LCTR_AUX_PTR_LEN 3 /*!< Size of AuxPtr field. */ #define LCTR_TX_POWER_LEN 1 /*!< Size of TxPower field. */ -#define LCTR_SYNC_INFO_LEN 18 /*!< Size of SyncInfo field. */ /************************************************************************************************** Data Types @@ -95,6 +95,7 @@ typedef struct { uint16_t syncOffset; /*!< Sync packet offset. */ uint8_t offsetUnits; /*!< Offset units. */ + uint8_t offsetAdjust; /*!< Offset adjust. */ uint16_t syncInter; /*!< Sync interval. */ uint64_t chanMap; /*!< Secondary channel map. */ uint8_t sca; /*!< Sleep clock accuracy. */ @@ -117,6 +118,7 @@ void lctrPackAuxPtr(lctrAdvSet_t const *pAdvSet, uint32_t offsUsec, uint8_t chId uint8_t lctrPackLegacyAdvPdu(lctrAdvSet_t *pAdvSet, uint8_t *pPduBuf); uint8_t lctrPackLegacyScanRspPdu(lctrAdvSet_t *pAdvSet, uint8_t *pPduBuf); uint8_t lctrPackSyncIndPdu(lctrAdvSet_t *pAdvSet, uint8_t *pPduBuf, lctrAdvDataBuf_t *pAdvData, bool_t isPeriodic); +uint8_t* lctrPackAcad(lctrAdvSet_t *pAdvSet, uint8_t commExtAdvPdu, uint8_t *pBuf, uint16_t *pRemLen, uint8_t acadId); /* Unpack */ uint8_t lctrUnpackExtAdvHeader(lctrExtAdvHdr_t *pPdu, uint8_t *pNewFlags, const uint8_t *pBuf); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_master_ae.c index 6211a026d6..9b87a223b4 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave extended advertising operation builder implementation file. + * \file + * \brief Link layer controller slave extended advertising operation builder implementation file. */ /*************************************************************************************************/ @@ -68,9 +69,9 @@ uint8_t lctrUnpackExtAdvHeader(lctrExtAdvHdr_t *pPdu, uint8_t *pNewFlags, const BSTREAM_TO_BDA64(pPdu->tgtAddr, pBuf); } - if (extHdrFlags & LL_EXT_HDR_SUPP_INFO_BIT) + if (extHdrFlags & LL_EXT_HDR_CTE_INFO_BIT) { - /* Skip unsupported byte. */ + /* Skip CTEInfo byte. */ pBuf++; } @@ -153,6 +154,7 @@ void lctrUnpackSyncInfo(lctrSyncInfo_t *pSyncInfo, const uint8_t *pBuf) BYTES_TO_UINT16(field16, pBuf); pSyncInfo->syncOffset = (field16 >> 0) & 0x1FFF; pSyncInfo->offsetUnits = (field16 >> 13) & 0x1; + pSyncInfo->offsetAdjust = (field16 >> 14) & 0x1; pBuf += 2; BSTREAM_TO_UINT16(pSyncInfo->syncInter, pBuf); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_slave.c index d25d60a825..45d532aacf 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave advertising channel packet implementation file. + * \file + * \brief Link layer controller slave advertising channel packet implementation file. */ /*************************************************************************************************/ @@ -170,12 +171,20 @@ uint8_t lctrPackConnIndPdu(uint8_t *pBuf, const lctrConnInd_t *pPdu) pBuf += lctrPackConnIndPduAddr(pBuf, pPdu); + uint16_t interval = pPdu->interval; +#if (LL_ENABLE_TESTER == TRUE) + if (llTesterCb.connIntervalZero == TRUE) + { + interval = 0; + } +#endif + /* LLData */ UINT32_TO_BSTREAM(pBuf, pPdu->accessAddr); UINT24_TO_BSTREAM(pBuf, pPdu->crcInit); UINT8_TO_BSTREAM (pBuf, pPdu->txWinSize); UINT16_TO_BSTREAM(pBuf, pPdu->txWinOffset); - UINT16_TO_BSTREAM(pBuf, pPdu->interval); + UINT16_TO_BSTREAM(pBuf, interval); UINT16_TO_BSTREAM(pBuf, pPdu->latency); UINT16_TO_BSTREAM(pBuf, pPdu->timeout); UINT40_TO_BSTREAM(pBuf, pPdu->chanMask); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_slave_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_slave_ae.c index dd885aee95..d0bef7b1cd 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_slave_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_adv_slave_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave extended advertising operation builder implementation file. + * \file + * \brief Link layer controller slave extended advertising operation builder implementation file. */ /*************************************************************************************************/ @@ -27,6 +28,7 @@ #include "sch_api_ble.h" #include "wsf_assert.h" #include "wsf_math.h" +#include "pal_radio.h" #include "util/bstream.h" #include @@ -34,9 +36,6 @@ Constants **************************************************************************************************/ -/*! \brief Maximum value for 30usec offset unit. */ -#define LCTR_30_USEC_OFFS_MAX_USEC 245730 - /*! \brief Assert minimum advertising payload length can contain a legacy length payload. */ WSF_CT_ASSERT(BB_ADV_PLD_MAX_LEN > (LL_EXT_ADV_HDR_MAX_LEN + LL_ADVBU_MAX_LEN)); @@ -53,6 +52,7 @@ WSF_CT_ASSERT(BB_ADV_PLD_MAX_LEN > (LL_EXT_ADV_HDR_MAX_LEN + LL_ADVBU_MAX_LEN)); static void lctrPackSyncInfo(lctrAdvSet_t *pAdvSet, uint8_t *pSyncInfo) { uint8_t offsUnits; + uint8_t offsAdjust = 0; uint16_t offs; uint32_t offsUsec, tempDue; BbOpDesc_t *pAuxOp = &pAdvSet->auxAdvBod; @@ -73,23 +73,31 @@ static void lctrPackSyncInfo(lctrAdvSet_t *pAdvSet, uint8_t *pSyncInfo) tempDue += pAdvSet->perParam.perAdvInter; } - if (offsUsec <= LCTR_30_USEC_OFFS_MAX_USEC) + if (offsUsec < LL_30_USEC_OFFS_MAX_USEC) { offsUnits = LCTR_OFFS_UNITS_30_USEC; offs = LL_MATH_DIV_30(offsUsec); } else { + if (offsUsec >= LL_SYNC_OFFS_ADJUST_USEC) + { + offsAdjust = 1; + offsUsec -= LL_SYNC_OFFS_ADJUST_USEC; + } + offsUnits = LCTR_OFFS_UNITS_300_USEC; offs = LL_MATH_DIV_300(offsUsec); } UINT16_TO_BUF(pSyncInfo, offs | /* Sync packet offset. */ - (offsUnits << 13)); /* Offset units. */ + (offsUnits << 13) | /* Offset units. */ + (offsAdjust << 14)); /* Offset adjust. */ UINT16_TO_BUF(&pSyncInfo[2], /* Interval. */ LCTR_PER_INTER_TO_MS(BB_TICKS_TO_US(pAdvSet->perParam.perAdvInter))); - uint64_t temp = (LL_CHAN_DATA_ALL | /* All secondary channels are used. */ - ((uint64_t)lctrComputeSca() << 37)); /* SCA. */ + uint64_t temp = + ((pAdvSet->perParam.perChanParam.chanMask & LL_CHAN_DATA_ALL) |/* Channel Map. */ + ((uint64_t)lctrComputeSca() << 37)); /* SCA. */ UINT40_TO_BUF(&pSyncInfo[4], temp); UINT32_TO_BUF(&pSyncInfo[9], pBle->chan.accAddr); /* Access address. */ UINT24_TO_BUF(&pSyncInfo[13], pBle->chan.crcInit); /* CRCInit. */ @@ -123,6 +131,15 @@ static uint8_t lctrPackExtAdvHeader(lctrAdvSet_t *pAdvSet, uint8_t manExtHdrFlag uint8_t *pBuf = pPduBuf + LL_ADV_HDR_LEN + LCTR_EXT_HDR_CMN_LEN + LCTR_EXT_HDR_FLAG_LEN; + /* Check if we need to look for Acads to pack later. */ + /* Future Acad may include PDUS: + * AUX_ADV_IND, AUX_SYNC_IND, AUX_SCAN_RSP */ + bool_t acadNeeded = FALSE; + if (commExtAdvPdu == LCTR_PDU_AUX_SYNC_IND) + { + acadNeeded = TRUE; + } + /* Determine the superior PDU. */ if (commExtAdvPdu == LCTR_PDU_AUX_CHAIN_IND) { @@ -175,7 +192,7 @@ static uint8_t lctrPackExtAdvHeader(lctrAdvSet_t *pAdvSet, uint8_t manExtHdrFlag { /* Pack AdvDataInfo */ extHdrFlags |= LL_EXT_HDR_ADI_BIT; - UINT16_TO_BSTREAM(pBuf, (pAdvSet->param.advSID << 12) | ((pAdvSet->advData.did & 0x0FFF) << 0)); + UINT16_TO_BSTREAM(pBuf, (pAdvSet->param.advSID << 12) | ((pAdvSet->param.advDID & 0x0FFF) << 0)); #if (LL_ENABLE_TESTER == TRUE) if ((llTesterCb.extHdr.pduMatchMask & (1 << pPduHdr->pduType)) && @@ -193,7 +210,7 @@ static uint8_t lctrPackExtAdvHeader(lctrAdvSet_t *pAdvSet, uint8_t manExtHdrFlag { syncInfoNeeded = TRUE; /* Reserve packet space now, pack later. */ - availDataLen -= LCTR_SYNC_INFO_LEN; + availDataLen -= LL_SYNC_INFO_LEN; } bool_t txPwrNeeded = FALSE; @@ -207,11 +224,12 @@ static uint8_t lctrPackExtAdvHeader(lctrAdvSet_t *pAdvSet, uint8_t manExtHdrFlag availDataLen -= LCTR_TX_POWER_LEN; } - unsigned int remDataLen = 0; + uint16_t remDataLen = 0; if (pDataBuf) { remDataLen = pDataBuf->len - pDataBuf->txOffs; - if (pDataBuf->fragPref == LL_ADV_DATA_FRAG_ALLOW) + if ((optExtHdrFlags & LL_EXT_HDR_AUX_PTR_BIT) && /* Allow fragmentation only if AUX_CHAIN_IND is allowed. */ + (pDataBuf->fragPref == LL_ADV_DATA_FRAG_ALLOW)) { /* Adjust to fragment size. */ availDataLen = WSF_MIN(pAdvSet->advDataFragLen, availDataLen); @@ -235,14 +253,14 @@ static uint8_t lctrPackExtAdvHeader(lctrAdvSet_t *pAdvSet, uint8_t manExtHdrFlag extHdrFlags |= LL_EXT_HDR_SYNC_INFO_BIT; uint8_t *pSyncInfo = pBuf; lctrPackSyncInfo(pAdvSet, pSyncInfo); - pBuf += LCTR_SYNC_INFO_LEN; + pBuf += LL_SYNC_INFO_LEN; } if (txPwrNeeded) { /* Pack TxPower */ extHdrFlags |= LL_EXT_HDR_TX_PWR_BIT; - int8_t actTxPwr = BbBleRfGetActualTxPower(pAdvSet->bleData.chan.txPower, TRUE); + int8_t actTxPwr = PalRadioGetActualTxPower(pAdvSet->bleData.chan.txPower, TRUE); #if (LL_ENABLE_TESTER == TRUE) if ((llTesterCb.extHdr.pduMatchMask & (1 << pPduHdr->pduType)) && (llTesterCb.extHdr.modifyMask & LL_EXT_HDR_TX_PWR_BIT)) @@ -253,6 +271,18 @@ static uint8_t lctrPackExtAdvHeader(lctrAdvSet_t *pAdvSet, uint8_t manExtHdrFlag UINT8_TO_BSTREAM(pBuf, (uint8_t)actTxPwr); } + /* Pack Acad. */ + if (acadNeeded) + { + for (uint8_t acadId = 0; acadId < LCTR_ACAD_NUM_ID; acadId++) + { + if (pAdvSet->acadParams[acadId].hdr.state != LCTR_ACAD_STATE_DISABLED) + { + pBuf = lctrPackAcad(pAdvSet, commExtAdvPdu, pBuf, &remDataLen, acadId); + } + } + } + uint8_t advDataLen = 0; if (remDataLen) { @@ -299,6 +329,9 @@ static uint8_t lctrPackExtAdvHeader(lctrAdvSet_t *pAdvSet, uint8_t manExtHdrFlag WSF_MAX(pAdvSet->auxDelayUsec, pLctrRtCfg->auxDelayUsec); pAdvSet->auxOffsUsec = WSF_MIN(pAdvSet->auxOffsUsec, LL_AUX_PTR_MAX_USEC); + /* Round up auxOffsetUsec if necessary. */ + pAdvSet->auxOffsUsec = SchBleGetAlignedAuxOffsUsec(pAdvSet->auxOffsUsec); + lctrPackAuxPtr(pAdvSet, pAdvSet->auxOffsUsec, pAdvSet->auxChIdx, pAuxPtr); } break; @@ -316,6 +349,9 @@ static uint8_t lctrPackExtAdvHeader(lctrAdvSet_t *pAdvSet, uint8_t manExtHdrFlag WSF_MAX(pAdvSet->auxDelayUsec, pLctrRtCfg->auxDelayUsec); pAdvSet->auxOffsUsec = WSF_MIN(pAdvSet->auxOffsUsec, LL_AUX_PTR_MAX_USEC); + /* Round up auxOffsetUsec if necessary. */ + pAdvSet->auxOffsUsec = SchBleGetAlignedAuxOffsUsec(pAdvSet->auxOffsUsec); + lctrPackAuxPtr(pAdvSet, pAdvSet->auxOffsUsec, pAdvSet->auxChIdx, pAuxPtr); } break; @@ -377,7 +413,7 @@ uint8_t lctrPackAdvExtIndPdu(lctrAdvSet_t *pAdvSet, uint8_t *pPduBuf, bool_t isP ((pAdvSet->advData.len == 0) ? LL_EXT_HDR_TX_PWR_BIT : 0); /* Pack aux pointer and ADI if periodic advertising is enabled. */ - if (pAdvSet->perParam.perAdvEnabled == TRUE) + if ((pAdvSet->perParam.perAdvEnabled == TRUE) && (pAdvSet->didPerUpdate == FALSE)) { manExtHdrFlags |= LL_EXT_HDR_ADI_BIT; manExtHdrFlags |= LL_EXT_HDR_AUX_PTR_BIT; @@ -388,6 +424,14 @@ uint8_t lctrPackAdvExtIndPdu(lctrAdvSet_t *pAdvSet, uint8_t *pPduBuf, bool_t isP /* Advertising address is mandatory if auxiliary pointer is NULL. */ manExtHdrFlags |= LL_EXT_HDR_ADV_ADDR_BIT; } + else + { + /* Make AdvA included in AUX_ADV_IND instead of ADV_EXT_IND. */ + if (lmgrGetOpFlag(LL_OP_MODE_FLAG_ENA_SLV_AUX_IND_ADVA) == TRUE) + { + optExtHdrFlags &= ~LL_EXT_HDR_ADV_ADDR_BIT; + } + } break; case ( /* ------------------- */ 0 | /* ------------------- */ 0 | LL_ADV_EVT_PROP_DIRECT_ADV_BIT ): @@ -398,7 +442,7 @@ uint8_t lctrPackAdvExtIndPdu(lctrAdvSet_t *pAdvSet, uint8_t *pPduBuf, bool_t isP ((pAdvSet->param.priAdvPhy == LL_PHY_LE_1M) ? LL_EXT_HDR_TX_PWR_BIT : 0) | ((pAdvSet->advData.len == 0) ? LL_EXT_HDR_TX_PWR_BIT : 0); /* Pack aux pointer and ADI if periodic advertising is enabled. */ - if (pAdvSet->perParam.perAdvEnabled == TRUE) + if ((pAdvSet->perParam.perAdvEnabled == TRUE) && (pAdvSet->didPerUpdate == FALSE)) { manExtHdrFlags |= LL_EXT_HDR_ADI_BIT; manExtHdrFlags |= LL_EXT_HDR_AUX_PTR_BIT; @@ -410,6 +454,14 @@ uint8_t lctrPackAdvExtIndPdu(lctrAdvSet_t *pAdvSet, uint8_t *pPduBuf, bool_t isP manExtHdrFlags |= LL_EXT_HDR_ADV_ADDR_BIT; manExtHdrFlags |= LL_EXT_HDR_TGT_ADDR_BIT; } + else + { + /* Make AdvA included in AUX_ADV_IND instead of ADV_EXT_IND. */ + if (lmgrGetOpFlag(LL_OP_MODE_FLAG_ENA_SLV_AUX_IND_ADVA) == TRUE) + { + optExtHdrFlags &= ~LL_EXT_HDR_ADV_ADDR_BIT; + } + } break; /* Connectable */ @@ -433,6 +485,12 @@ uint8_t lctrPackAdvExtIndPdu(lctrAdvSet_t *pAdvSet, uint8_t *pPduBuf, bool_t isP break; } + if (manExtHdrFlags & LL_EXT_HDR_AUX_PTR_BIT) + { + /* No need to include TxPower when auxiliary packet has this field. */ + optExtHdrFlags &= ~LL_EXT_HDR_TX_PWR_BIT; + } + /*** Host allowed options ***/ lctrChooseSetAdvA(&pduHdr, pBle, pAdvSet); lctrChooseSetPeerA(&pduHdr, pBle, pAdvSet); @@ -482,8 +540,9 @@ uint8_t lctrPackAuxAdvIndPdu(lctrAdvSet_t *pAdvSet, uint8_t *pPduBuf, lctrAdvDat LL_EXT_HDR_AUX_PTR_BIT | LL_EXT_HDR_TX_PWR_BIT; /* Pack aux pointer if periodic adv is enabled. */ - if (pAdvSet->perParam.perAdvEnabled == TRUE) + if ((pAdvSet->perParam.perAdvEnabled == TRUE) && (pAdvSet->didPerUpdate == FALSE)) { + /* For synchronization, sync info is applied only after Data ID is updated in ext adv and aux adv is updated. */ optExtHdrFlags |= LL_EXT_HDR_SYNC_INFO_BIT; } break; @@ -494,7 +553,7 @@ uint8_t lctrPackAuxAdvIndPdu(lctrAdvSet_t *pAdvSet, uint8_t *pPduBuf, lctrAdvDat LL_EXT_HDR_AUX_PTR_BIT | LL_EXT_HDR_TX_PWR_BIT; /* Pack aux pointer if periodic adv is enabled. */ - if (pAdvSet->perParam.perAdvEnabled == TRUE) + if ((pAdvSet->perParam.perAdvEnabled == TRUE) && (pAdvSet->didPerUpdate == FALSE)) { optExtHdrFlags |= LL_EXT_HDR_SYNC_INFO_BIT; } @@ -563,7 +622,8 @@ uint8_t lctrPackAuxScanRspPdu(lctrAdvSet_t *pAdvSet, uint8_t *pPduBuf, bool_t is /*** Specification defined behavior ***/ - uint8_t manExtHdrFlags = LL_EXT_HDR_ADV_ADDR_BIT; + uint8_t manExtHdrFlags = LL_EXT_HDR_ADV_ADDR_BIT | + (lmgrGetOpFlag(LL_OP_MODE_FLAG_ENA_SLV_AUX_SCAN_RSP_ADI) ? LL_EXT_HDR_ADI_BIT : 0); uint8_t optExtHdrFlags = LL_EXT_HDR_AUX_PTR_BIT | LL_EXT_HDR_TX_PWR_BIT; @@ -596,8 +656,13 @@ uint8_t lctrPackAuxChainIndPdu(lctrAdvSet_t *pAdvSet, uint8_t *pPduBuf, lctrAdvD /*** Specification defined behavior ***/ uint8_t manExtHdrFlags = LL_EXT_HDR_ADI_BIT; - uint8_t optExtHdrFlags = LL_EXT_HDR_AUX_PTR_BIT | - LL_ADV_EVT_PROP_TX_PWR_BIT; + uint8_t optExtHdrFlags = LL_EXT_HDR_AUX_PTR_BIT; + + /* AUX_CHAIN_IND following AUX_SYNC_IND or AUX_SCAN_RSP should not have ADI field. */ + if (isPeriodic || (pAdvSet->param.advEventProp & LL_ADV_EVT_PROP_SCAN_ADV_BIT)) + { + manExtHdrFlags &= ~LL_EXT_HDR_ADI_BIT; + } return lctrPackExtAdvHeader(pAdvSet, manExtHdrFlags, optExtHdrFlags, 0, &pduHdr, pAdvData, @@ -652,7 +717,7 @@ void lctrPackAuxPtr(lctrAdvSet_t const *pAdvSet, uint32_t offsUsec, uint8_t chId uint8_t offsUnits; uint16_t auxOffset; - if (offsUsec <= LCTR_30_USEC_OFFS_MAX_USEC) + if (offsUsec < LL_30_USEC_OFFS_MAX_USEC) { offsUnits = LCTR_OFFS_UNITS_30_USEC; auxOffset = LL_MATH_DIV_30(offsUsec); @@ -857,3 +922,47 @@ uint8_t lctrPackSyncIndPdu(lctrAdvSet_t *pAdvSet, uint8_t *pPduBuf, lctrAdvDataB 0, &pduHdr, pAdvData, pPduBuf, LCTR_PDU_AUX_SYNC_IND, isPeriodic); } + +/*************************************************************************************************/ +/*! + * \brief Pack acad field + * + * \param pAdvSet Advertising set. + * \param commExtAdvPdu Common ext adv pdu. + * \param pBuf Packed data buffer. + * \param pRemLen Remaining length of ext adv header. + * \param acadId Acad Id. + * + * \return Modified pBuf. + */ +/*************************************************************************************************/ +uint8_t* lctrPackAcad(lctrAdvSet_t *pAdvSet, uint8_t commExtAdvPdu, uint8_t *pBuf, uint16_t *pRemLen, uint8_t acadId) +{ + switch(acadId) + { + case LCTR_ACAD_ID_CHAN_MAP_UPDATE: + { + uint8_t len = LL_ACAD_LEN_FIELD_LEN + LL_ACAD_UPDATE_CHANNEL_MAP_LEN; + + if ((commExtAdvPdu != LCTR_PDU_AUX_SYNC_IND) || + (len > *pRemLen)) + { + return pBuf; + } + + lctrAcadChanMapUpd_t *pData = &pAdvSet->acadParams[acadId].chanMapUpdate; + + /* Pack Acad */ + *pRemLen -= len; + UINT8_TO_BSTREAM(pBuf, LL_ACAD_UPDATE_CHANNEL_MAP_LEN); + UINT8_TO_BSTREAM(pBuf, LL_ACAD_OPCODE_CHANNEL_MAP_UPDATE); + + UINT40_TO_BSTREAM(pBuf, pData->chanMask); + UINT16_TO_BSTREAM(pBuf, pData->instant); + return pBuf; + } + + default: + return pBuf; + } +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_conn.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_conn.c index 926662efff..701d0963e8 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_conn.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_conn.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave data channel packet implementation file. + * \file + * \brief Link layer controller slave data channel packet implementation file. */ /*************************************************************************************************/ @@ -556,6 +557,182 @@ uint8_t lctrUnpackMinUsedChanIndPdu(lctrMinUsedChanInd_t *pPdu, const uint8_t *p return len; } +/*************************************************************************************************/ +/*! + * \brief Unpack a periodic sync indication PDU. + * + * \param pPdu Unpacked periodic sync indication PDU. + * \param pBuf Packed packet buffer. + * + * \return PDU length. + */ +/*************************************************************************************************/ +uint8_t lctrUnpackPerSyncIndPdu(lctrPerSyncInd_t *pPdu, const uint8_t *pBuf) +{ + const uint8_t len = LL_PERIODIC_SYNC_PDU_LEN; + uint8_t i; + + pBuf += 1; /* skip opcode */ + BSTREAM_TO_UINT16 (pPdu->id, pBuf); + + for (i = 0; i < LL_SYNC_INFO_LEN; i++) + { + BSTREAM_TO_UINT8(pPdu->syncInfo[i], pBuf); + } + + BSTREAM_TO_UINT16 (pPdu->ceCounter, pBuf); + BSTREAM_TO_UINT16 (pPdu->lastPECounter, pBuf); + + uint8_t field8; + BSTREAM_TO_UINT8 (field8, pBuf); + pPdu->sid = (field8 >> 0) & 0x0F; + pPdu->aType = (field8 >> 4) & 0x01; + pPdu->sca = (field8 >> 5) & 0x07; + + BSTREAM_TO_UINT8(pPdu->phy, pBuf); + BSTREAM_TO_BDA64(pPdu->advA, pBuf); + BSTREAM_TO_UINT16(pPdu->syncConnEvtCounter, pBuf); + + return len; +} + +/*************************************************************************************************/ +/*! + * \brief Unpack a peer SCA response PDU. + * + * \param pPdu SCA PDU. + * \param pBuf Packed packet buffer. + * + * \return PDU length. + */ +/*************************************************************************************************/ +uint8_t lctrUnpackPeerScaPdu(lctrPeerSca_t *pPdu, const uint8_t *pBuf) +{ + const uint8_t len = LL_PEER_SCA_REQ_LEN; /* LL_PEER_SCA_REQ_LEN = LL_PEER_SCA_RSP_LEN*/ + + pBuf += 1; /* skip opcode */ + BSTREAM_TO_UINT8 (pPdu->sca, pBuf); + + return len; +} + +/*************************************************************************************************/ +/*! + * \brief Unpack a CIS request PDU. + * + * \param pPdu CIS request PDU. + * \param pBuf Packed packet buffer. + * + * \return PDU length. + */ +/*************************************************************************************************/ +uint8_t lctrUnpackCisReqPdu(lctrCisReq_t *pPdu, const uint8_t *pBuf) +{ + const uint8_t len = LL_CIS_REQ_LEN; + uint8_t bn; + uint16_t sduSizeMToS; + + pBuf += 1; /* skip opcode */ + BSTREAM_TO_UINT8 (pPdu->cigId, pBuf); + BSTREAM_TO_UINT8 (pPdu->cisId, pBuf); + BSTREAM_TO_UINT8 (pPdu->phyMToS, pBuf); + BSTREAM_TO_UINT8 (pPdu->phySToM, pBuf); + + BSTREAM_TO_UINT16 (sduSizeMToS, pBuf); + pPdu->isoalPduType = (sduSizeMToS >> 15) & 0x01; + pPdu->sduSizeMToS = sduSizeMToS & 0x0FFF; + BSTREAM_TO_UINT16 (pPdu->sduSizeSToM, pBuf); + pPdu->sduSizeSToM &= 0x0FFF; + BSTREAM_TO_UINT24 (pPdu->sduIntervalMToS, pBuf); + pPdu->sduIntervalMToS &= 0xFFFFF; + BSTREAM_TO_UINT24 (pPdu->sduIntervalSToM, pBuf); + pPdu->sduIntervalSToM &= 0xFFFFF; + + BSTREAM_TO_UINT8 (pPdu->plMToS, pBuf); + BSTREAM_TO_UINT8 (pPdu->plSToM, pBuf); + BSTREAM_TO_UINT8 (pPdu->nse, pBuf); + BSTREAM_TO_UINT24 (pPdu->subIntervUsec, pBuf); + BSTREAM_TO_UINT8 (bn, pBuf); + pPdu->bnSToM = (bn & 0xF0) >> 4; + pPdu->bnMToS = bn & 0x0F; + BSTREAM_TO_UINT8 (pPdu->ftMToS, pBuf); + BSTREAM_TO_UINT8 (pPdu->ftSToM, pBuf); + BSTREAM_TO_UINT16 (pPdu->isoInterval, pBuf); + BSTREAM_TO_UINT24 (pPdu->cisOffMinUsec, pBuf); + BSTREAM_TO_UINT24 (pPdu->cisOffMaxUsec, pBuf); + BSTREAM_TO_UINT16 (pPdu->ceRef, pBuf); + + return len; +} + +/*************************************************************************************************/ +/*! + * \brief Unpack a CIS response PDU. + * + * \param pPdu CIS response PDU. + * \param pBuf Packed packet buffer. + * + * \return PDU length. + */ +/*************************************************************************************************/ +uint8_t lctrUnpackCisRspPdu(lctrCisRsp_t *pPdu, const uint8_t *pBuf) +{ + const uint8_t len = LL_CIS_RSP_LEN; + + pBuf += 1; /* skip opcode */ + BSTREAM_TO_UINT24 (pPdu->cisOffMinUsec, pBuf); + BSTREAM_TO_UINT24 (pPdu->cisOffMaxUsec, pBuf); + BSTREAM_TO_UINT16 (pPdu->ceRef, pBuf); + + return len; +} + +/*************************************************************************************************/ +/*! + * \brief Unpack a CIS indication PDU. + * + * \param pPdu CIS indication PDU. + * \param pBuf Packed packet buffer. + * + * \return PDU length. + */ +/*************************************************************************************************/ +uint8_t lctrUnpackCisIndPdu(lctrCisInd_t *pPdu, const uint8_t *pBuf) +{ + const uint8_t len = LL_CIS_IND_LEN; + + pBuf += 1; /* skip opcode */ + BSTREAM_TO_UINT32 (pPdu->accessAddr, pBuf); + BSTREAM_TO_UINT24 (pPdu->cisOffUsec, pBuf); + BSTREAM_TO_UINT24 (pPdu->cigSyncDelayUsec, pBuf); + BSTREAM_TO_UINT24 (pPdu->cisSyncDelayUsec, pBuf); + BSTREAM_TO_UINT16 (pPdu->ceRef, pBuf); + + return len; +} + +/*************************************************************************************************/ +/*! + * \brief Unpack a CIS terminate PDU. + * + * \param pPdu CIS terminate PDU. + * \param pBuf Packed packet buffer. + * + * \return PDU length. + */ +/*************************************************************************************************/ +uint8_t lctrUnpackCisTermPdu(lctrCisTermInd_t *pPdu, const uint8_t *pBuf) +{ + const uint8_t len = LL_CIS_TERM_LEN; + + pBuf += 1; /* skip opcode */ + BSTREAM_TO_UINT8 (pPdu->cigId, pBuf); + BSTREAM_TO_UINT8 (pPdu->cisId, pBuf); + BSTREAM_TO_UINT8 (pPdu->reason, pBuf); + + return len; +} + /*************************************************************************************************/ /*! * \brief Decode an LE-C channel buffer. @@ -581,8 +758,11 @@ uint8_t lctrDecodeCtrlPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role { return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } - if ((lctrUnpackConnUpdateIndPdu(&pPdu->pld.connUpdInd, pBuf) != pPdu->hdr.len) || - (lctrIsConnUpdateParamValid(&pPdu->pld.connUpdInd) == FALSE)) + if (lctrUnpackConnUpdateIndPdu(&pPdu->pld.connUpdInd, pBuf) != pPdu->hdr.len) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + if (lctrIsConnUpdateParamValid(&pPdu->pld.connUpdInd) == FALSE) { return LL_ERROR_CODE_INVALID_LMP_PARAMS; } @@ -592,7 +772,7 @@ uint8_t lctrDecodeCtrlPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role { return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } - /* no break */ + /* Fallthrough */ case LL_PDU_CONN_PARAM_REQ: if ((lmgrCb.features & LL_FEAT_CONN_PARAM_REQ_PROC) == 0) { @@ -600,7 +780,7 @@ uint8_t lctrDecodeCtrlPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role } if (lctrUnpackConnParamPdu(&pPdu->pld.connParamReqRsp, pBuf) != pPdu->hdr.len) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_CHANNEL_MAP_IND: @@ -608,8 +788,11 @@ uint8_t lctrDecodeCtrlPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role { return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } - if ((lctrUnpackChanMapIndPdu(&pPdu->pld.chanMapInd, pBuf) != pPdu->hdr.len) || - (lctrIsChanMaskValid(pPdu->pld.chanMapInd.chanMask) == FALSE)) + if (lctrUnpackChanMapIndPdu(&pPdu->pld.chanMapInd, pBuf) != pPdu->hdr.len) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + if (lctrIsChanMaskValid(pPdu->pld.chanMapInd.chanMask) == FALSE) { return LL_ERROR_CODE_INVALID_LMP_PARAMS; } @@ -618,19 +801,19 @@ uint8_t lctrDecodeCtrlPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role case LL_PDU_LENGTH_RSP: if (lctrUnpackDataLengthPdu(&pPdu->pld.lenRsp, pBuf) != pPdu->hdr.len) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_TERMINATE_IND: if (lctrUnpackTerminateIndPdu(&pPdu->pld.termInd, pBuf) != pPdu->hdr.len) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_UNKNOWN_RSP: if (lctrUnpackUnknownRspPdu(&pPdu->pld.unknownRsp, pBuf) != pPdu->hdr.len) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_FEATURE_REQ: @@ -638,11 +821,11 @@ uint8_t lctrDecodeCtrlPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role { return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } - /* no break */ + /* Fallthrough */ case LL_PDU_FEATURE_RSP: if (lctrUnpackFeaturePdu(&pPdu->pld.featReqRsp, pBuf) != pPdu->hdr.len) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_SLV_FEATURE_REQ: @@ -656,20 +839,20 @@ uint8_t lctrDecodeCtrlPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role } if (lctrUnpackFeaturePdu(&pPdu->pld.featReqRsp, pBuf) != pPdu->hdr.len) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_VERSION_IND: if (lctrUnpackVersionIndPdu(&pPdu->pld.verInd, pBuf) != pPdu->hdr.len) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_REJECT_IND: pPdu->pld.rejInd.opcode = LL_PDU_UNSPECIFIED; if (lctrUnpackRejectIndPdu(&pPdu->pld.rejInd.reason, pBuf) != pPdu->hdr.len) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_REJECT_EXT_IND: @@ -679,7 +862,7 @@ uint8_t lctrDecodeCtrlPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role } if (lctrUnpackRejectExtIndPdu(&pPdu->pld.rejInd, pBuf) != pPdu->hdr.len) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_PHY_RSP: @@ -687,7 +870,7 @@ uint8_t lctrDecodeCtrlPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role { return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } - /* no break */ + /* Fallthrough */ case LL_PDU_PHY_REQ: if ((lmgrCb.features & (LL_FEAT_LE_2M_PHY | LL_FEAT_LE_CODED_PHY)) == 0) { @@ -695,7 +878,7 @@ uint8_t lctrDecodeCtrlPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role } if (lctrUnpackPhyPdu(&pPdu->pld.phyReq, pBuf) != pPdu->hdr.len) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_PHY_UPDATE_IND: @@ -709,7 +892,7 @@ uint8_t lctrDecodeCtrlPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role } if (lctrUnpackPhyUpdateIndPdu(&pPdu->pld.phyUpdInd, pBuf) != pPdu->hdr.len) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_MIN_USED_CHAN_IND: @@ -721,12 +904,86 @@ uint8_t lctrDecodeCtrlPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role { return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } - if ((lctrUnpackMinUsedChanIndPdu(&pPdu->pld.minUsedChanInd, pBuf) != pPdu->hdr.len) || - (lctrIsSetMinUsedChanParamValid(&pPdu->pld.minUsedChanInd) == FALSE)) + if (lctrUnpackMinUsedChanIndPdu(&pPdu->pld.minUsedChanInd, pBuf) != pPdu->hdr.len) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + if (lctrIsSetMinUsedChanParamValid(&pPdu->pld.minUsedChanInd) == FALSE) { return LL_ERROR_CODE_INVALID_LMP_PARAMS; } break; + case LL_PDU_PERIODIC_SYNC_IND: + if ((lmgrCb.features & LL_FEAT_PAST_RECIPIENT) == 0) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + if (lctrUnpackPerSyncIndPdu(&pPdu->pld.perSyncInd, pBuf) != pPdu->hdr.len) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + break; + case LL_PDU_PEER_SCA_REQ: + if ((lmgrCb.features & (LL_FEAT_SCA_UPDATE)) == 0) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + if (lctrUnpackPeerScaPdu(&pPdu->pld.peerSca, pBuf) != pPdu->hdr.len) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + break; + case LL_PDU_PEER_SCA_RSP: + if ((lmgrCb.features & (LL_FEAT_SCA_UPDATE)) == 0) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + if (lctrUnpackPeerScaPdu(&pPdu->pld.peerSca, pBuf) != pPdu->hdr.len) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + break; + case LL_PDU_CIS_REQ: + if ((lmgrCb.features & (LL_FEAT_CIS_SLAVE_ROLE)) == 0) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + if (lctrUnpackCisReqPdu(&pPdu->pld.cisReq, pBuf) != pPdu->hdr.len) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + break; + case LL_PDU_CIS_RSP: + if ((lmgrCb.features & (LL_FEAT_CIS_MASTER_ROLE)) == 0) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + if (lctrUnpackCisRspPdu(&pPdu->pld.cisRsp, pBuf) != pPdu->hdr.len) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + break; + case LL_PDU_CIS_IND: + if ((lmgrCb.features & (LL_FEAT_CIS_SLAVE_ROLE)) == 0) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + if (lctrUnpackCisIndPdu(&pPdu->pld.cisInd, pBuf) != pPdu->hdr.len) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + break; + case LL_PDU_CIS_TERM_IND: + if (((lmgrCb.features & (LL_FEAT_CIS_SLAVE_ROLE)) == 0) && + ((lmgrCb.features & (LL_FEAT_CIS_MASTER_ROLE)) == 0)) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + if (lctrUnpackCisTermPdu(&pPdu->pld.cisTerm, pBuf) != pPdu->hdr.len) + { + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; + } + break; default: result = LL_ERROR_CODE_UNKNOWN_LMP_PDU; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_conn.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_conn.h index c71595cc18..904fd6a1c8 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_conn.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_conn.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller data channel packet interface file. + * \file + * \brief Link layer controller data channel packet interface file. */ /*************************************************************************************************/ @@ -180,6 +181,79 @@ typedef struct uint8_t minUsedChan; /*!< Minimum number of used channels. */ } lctrMinUsedChanInd_t; +/*! \brief Periodic sync indication PDU. */ +typedef struct +{ + uint16_t id; /*!< identifier provided by the host. */ + uint8_t syncInfo[LL_SYNC_INFO_LEN]; /*!< Syncinfo field. */ + uint16_t ceCounter; /*!< Reference connection event counter. */ + uint16_t lastPECounter; /*!< paEventCounter applying to AUX_SYNC_IND PDU. */ + uint8_t sid; /*!< Advertising SID subfield. */ + uint8_t aType; /*!< Address type of periodic advertising. */ + uint8_t sca; /*!< Sleep clock accuracy of the device sending this PDU. */ + uint8_t phy; /*!< PHY used by the periodic advertising. */ + uint64_t advA; /*!< Advertiser's address in the periodic advertising. */ + uint16_t syncConnEvtCounter; /*!< Connection event counter when the contents of the PDU is determined. */ +} lctrPerSyncInd_t; + +/*! \brief Peer SCA response PDU. */ +typedef struct +{ + uint8_t sca; /*!< Peer SCA. */ +} lctrPeerSca_t; + +/*! \brief CIS request PDU. */ +typedef struct +{ + uint8_t cigId; /*!< CIG identifier. */ + uint8_t cisId; /*!< CIS identifier. */ + uint8_t phyMToS; /*!< Master to slave PHY. */ + uint8_t phySToM; /*!< Slave to Master PHY. */ + uint8_t isoalPduType; /*!< ISOAL PDU type. */ + uint16_t sduSizeMToS; /*!< Maximum SDU size from the master Host. */ + uint16_t sduSizeSToM; /*!< Maximum SDU size from the slave Host. */ + uint32_t sduIntervalMToS; /*!< Time interval between the start of consecutive SDUs from the master Host */ + uint32_t sduIntervalSToM; /*!< Time interval between the start of consecutive SDUs from the master Host */ + uint8_t plMToS; /*!< Master to slave payload. */ + uint8_t plSToM; /*!< Slave to master payload. */ + uint8_t nse; /*!< Number of subevent. */ + uint32_t subIntervUsec; /*!< Contain the time between the start of a subevent and the start of the next subevent, 24 significant bits. */ + uint8_t bnMToS; /*!< Master to slave burst number, 4 significant bits. */ + uint8_t bnSToM; /*!< Slave to master burst number, 4 significant bits. */ + uint8_t ftMToS; /*!< Master to slave flush time. */ + uint8_t ftSToM; /*!< Slave to master flush time. */ + uint16_t isoInterval; /*!< Contain the time between two CIS anchor points in 1.25msec unit. */ + uint32_t cisOffMinUsec; /*!< Contain the minimum time between the CE and the first CIS anchor point. */ + uint32_t cisOffMaxUsec; /*!< Contain the maximum time between the CE and the first CIS anchor point. */ + uint16_t ceRef; /*!< Contain the reference CE where offsets are applied. */ +} lctrCisReq_t; + +/*! \brief CIS response PDU. */ +typedef struct +{ + uint32_t cisOffMinUsec; /*!< Contain the minimum time between the CE and the first CIS anchor point. */ + uint32_t cisOffMaxUsec; /*!< Contain the maximum time between the CE and the first CIS anchor point. */ + uint16_t ceRef; /*!< Contain the reference CE where offsets are applied. */ +} lctrCisRsp_t; + +/*! \brief CIS indication PDU. */ +typedef struct +{ + uint32_t accessAddr; /*!< Contain the access address of the CIS. */ + uint32_t cisOffUsec; /*!< Contain the time from the start of the referenced CE to the first CIS anchor point. */ + uint32_t cigSyncDelayUsec; /*!< CIG synchronization delay in usec. */ + uint32_t cisSyncDelayUsec; /*!< CIG synchronization delay in usec. */ + uint16_t ceRef; /*!< Contain the reference CE where offsets are applied. */ +} lctrCisInd_t; + +/*! \brief CIS terminate PDU. */ +typedef struct +{ + uint8_t cigId; /*!< CIG identifier. */ + uint8_t cisId; /*!< CIS identifier. */ + uint8_t reason; /*!< Reason for termination. */ +} lctrCisTermInd_t; + /*! \brief Data channel control PDU. */ typedef struct { @@ -204,6 +278,12 @@ typedef struct lctrPhy_t phyRsp; /*!< PHY response. */ lctrPhyUpdInd_t phyUpdInd; /*!< PHY update indication. */ lctrMinUsedChanInd_t minUsedChanInd;/*!< Minimum number of used channels indication. */ + lctrPerSyncInd_t perSyncInd; /*!< Periodic sync indication. */ + lctrPeerSca_t peerSca; /*!< Peer SCA request/response. */ + lctrCisReq_t cisReq; /*!< CIS request. */ + lctrCisRsp_t cisRsp; /*!< CIS response. */ + lctrCisInd_t cisInd; /*!< CIS indication. */ + lctrCisTermInd_t cisTerm; /*!< CIS terminate indication. */ } pld; /*!< Unpacked PDU payload. */ } lctrDataPdu_t; @@ -232,6 +312,7 @@ uint8_t lctrUnpackDataLengthPdu(lctrDataLen_t *pPdu, const uint8_t *pBuf); uint8_t lctrUnpackPhyPdu(lctrPhy_t *pPdu, const uint8_t *pBuf); uint8_t lctrUnpackPhyUpdateIndPdu(lctrPhyUpdInd_t *pPdu, const uint8_t *pBuf); uint8_t lctrUnpackMinUsedChanIndPdu(lctrMinUsedChanInd_t *pPdu, const uint8_t *pBuf); +uint8_t lctrUnpackPerSyncIndPdu(lctrPerSyncInd_t *pPdu, const uint8_t *pBuf); /* Decode */ uint8_t lctrDecodeCtrlPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_enc.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_enc.c index cf62df32ed..a783156c09 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_enc.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_pdu_enc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master encryption packet implementation file. + * \file + * \brief Link layer controller master encryption packet implementation file. */ /*************************************************************************************************/ @@ -101,7 +102,7 @@ uint8_t lctrDecodeEncPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role) } if (lctrUnpackEncReqPdu(&pPdu->pld.encReq, pBuf) != pPdu->hdr.len) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_ENC_RSP: @@ -111,7 +112,7 @@ uint8_t lctrDecodeEncPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role) } if (lctrUnpackEncRspPdu(&pPdu->pld.encRsp, pBuf) != pPdu->hdr.len) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_START_ENC_REQ: @@ -121,7 +122,7 @@ uint8_t lctrDecodeEncPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role) } if ( pPdu->hdr.len != LL_START_ENC_LEN) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_PAUSE_ENC_REQ: @@ -131,19 +132,19 @@ uint8_t lctrDecodeEncPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role) } if ( pPdu->hdr.len != LL_PAUSE_ENC_LEN) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_START_ENC_RSP: if ( pPdu->hdr.len != LL_START_ENC_LEN) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_PAUSE_ENC_RSP: if ( pPdu->hdr.len != LL_PAUSE_ENC_LEN) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; case LL_PDU_PING_REQ: @@ -154,7 +155,7 @@ uint8_t lctrDecodeEncPdu(lctrDataPdu_t *pPdu, const uint8_t *pBuf, uint8_t role) } if ( pPdu->hdr.len != LL_PING_PDU_LEN) { - return LL_ERROR_CODE_INVALID_LMP_PARAMS; + return LL_ERROR_CODE_UNKNOWN_LMP_PDU; } break; default: diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_master.c index 35075ebee8..266120a1b8 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master scan state machine implementation file. + * \file + * \brief Link layer controller master scan state machine implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_master_ae.c index c548547801..c7cd31185b 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master scan state machine implementation file. + * \file + * \brief Link layer controller master scan state machine implementation file. */ /*************************************************************************************************/ @@ -108,6 +109,7 @@ static const lctrCreateSyncActFn_t lctrCreateSyncActionTbl[LCTR_CREATE_SYNC_STAT NULL, /* LCTR_CREATE_SYNC_MSG_RESET */ lctrCreateSyncActCreate, /* LCTR_CREATE_SYNC_MSG_CREATE */ NULL, /* LCTR_CREATE_SYNC_MSG_CANCEL */ + NULL, /* LCTR_CREATE_SYNC_MSG_FAILED */ NULL, /* LCTR_CREATE_SYNC_MSG_DONE */ NULL /* LCTR_CREATE_SYNC_MSG_TERMINATE */ }, @@ -115,6 +117,7 @@ static const lctrCreateSyncActFn_t lctrCreateSyncActionTbl[LCTR_CREATE_SYNC_STAT lctrCreateSyncActCancel, /* LCTR_CREATE_SYNC_MSG_RESET */ NULL, /* LCTR_CREATE_SYNC_MSG_CREATE */ /* Handled by API. */ lctrCreateSyncActCancel, /* LCTR_CREATE_SYNC_MSG_CANCEL */ + lctrCreateSyncActFailed, /* LCTR_CREATE_SYNC_MSG_FAILED */ lctrCreateSyncActDone, /* LCTR_CREATE_SYNC_MSG_DONE */ NULL /* LCTR_CREATE_SYNC_MSG_TERMINATE */ }, @@ -122,6 +125,7 @@ static const lctrCreateSyncActFn_t lctrCreateSyncActionTbl[LCTR_CREATE_SYNC_STAT NULL, /* LCTR_CREATE_SYNC_MSG_RESET */ NULL, /* LCTR_CREATE_SYNC_MSG_CREATE */ /* Handled by API. */ NULL, /* LCTR_CREATE_SYNC_MSG_CANCEL */ + NULL, /* LCTR_CREATE_SYNC_MSG_FAILED */ NULL, /* LCTR_CREATE_SYNC_MSG_DONE */ lctrCreateSyncActTerminate /* LCTR_CREATE_SYNC_MSG_TERMINATE */ }, @@ -129,6 +133,7 @@ static const lctrCreateSyncActFn_t lctrCreateSyncActionTbl[LCTR_CREATE_SYNC_STAT NULL, /* LCTR_CREATE_SYNC_MSG_RESET */ NULL, /* LCTR_CREATE_SYNC_MSG_CREATE */ /* Handled by API. */ NULL, /* LCTR_CREATE_SYNC_MSG_CANCEL */ + NULL, /* LCTR_CREATE_SYNC_MSG_FAILED */ NULL, /* LCTR_CREATE_SYNC_MSG_DONE */ lctrCreateSyncActTerminate /* LCTR_CREATE_SYNC_MSG_TERMINATE */ } @@ -141,6 +146,7 @@ static const uint8_t lctrCreateSyncNextStateTbl[LCTR_CREATE_SYNC_STATE_TOTAL][LC LCTR_CREATE_SYNC_STATE_DISABLED, /* LCTR_CREATE_SYNC_MSG_RESET */ LCTR_CREATE_SYNC_STATE_DISCOVER, /* LCTR_CREATE_SYNC_MSG_CREATE */ LCTR_CREATE_SYNC_STATE_DISABLED, /* LCTR_CREATE_SYNC_MSG_CANCEL */ + LCTR_CREATE_SYNC_STATE_DISABLED, /* LCTR_CREATE_SYNC_MSG_FAILED */ LCTR_CREATE_SYNC_STATE_DISABLED, /* LCTR_CREATE_SYNC_MSG_DONE */ LCTR_CREATE_SYNC_STATE_DISABLED, /* LCTR_CREATE_SYNC_MSG_TERMINATE */ }, @@ -148,6 +154,7 @@ static const uint8_t lctrCreateSyncNextStateTbl[LCTR_CREATE_SYNC_STATE_TOTAL][LC LCTR_CREATE_SYNC_STATE_RESET, /* LCTR_CREATE_SYNC_MSG_RESET */ LCTR_CREATE_SYNC_STATE_DISCOVER, /* LCTR_CREATE_SYNC_MSG_CREATE */ LCTR_CREATE_SYNC_STATE_SHUTDOWN, /* LCTR_CREATE_SYNC_MSG_CANCEL */ + LCTR_CREATE_SYNC_STATE_SHUTDOWN, /* LCTR_CREATE_SYNC_MSG_FAILED */ LCTR_CREATE_SYNC_STATE_DISABLED, /* LCTR_CREATE_SYNC_MSG_DONE */ LCTR_CREATE_SYNC_STATE_DISCOVER /* LCTR_CREATE_SYNC_MSG_TERMINATE */ }, @@ -155,6 +162,7 @@ static const uint8_t lctrCreateSyncNextStateTbl[LCTR_CREATE_SYNC_STATE_TOTAL][LC LCTR_CREATE_SYNC_STATE_SHUTDOWN, /* LCTR_CREATE_SYNC_MSG_RESET */ LCTR_CREATE_SYNC_STATE_SHUTDOWN, /* LCTR_CREATE_SYNC_MSG_CREATE */ LCTR_CREATE_SYNC_STATE_SHUTDOWN, /* LCTR_CREATE_SYNC_MSG_CANCEL */ + LCTR_CREATE_SYNC_STATE_SHUTDOWN, /* LCTR_CREATE_SYNC_MSG_FAILED */ LCTR_CREATE_SYNC_STATE_SHUTDOWN, /* LCTR_CREATE_SYNC_MSG_DONE */ LCTR_CREATE_SYNC_STATE_DISABLED, /* LCTR_CREATE_SYNC_MSG_TERMINATE */ }, @@ -163,11 +171,87 @@ static const uint8_t lctrCreateSyncNextStateTbl[LCTR_CREATE_SYNC_STATE_TOTAL][LC LCTR_CREATE_SYNC_STATE_RESET, /* LCTR_CREATE_SYNC_MSG_RESET */ LCTR_CREATE_SYNC_STATE_RESET, /* LCTR_CREATE_SYNC_MSG_CREATE */ LCTR_CREATE_SYNC_STATE_RESET, /* LCTR_CREATE_SYNC_MSG_CANCEL */ + LCTR_CREATE_SYNC_STATE_RESET, /* LCTR_CREATE_SYNC_MSG_FAILED */ LCTR_CREATE_SYNC_STATE_DISABLED, /* LCTR_CREATE_SYNC_MSG_DONE */ LCTR_CREATE_SYNC_STATE_DISABLED /* LCTR_CREATE_SYNC_MSG_TERMINATE */ } }; +/*! \brief Transfer sync state machine action table. */ +static const lctrCreateSyncActFn_t lctrTransferSyncActionTbl[LCTR_TRANSFER_SYNC_STATE_TOTAL][LCTR_TRANSFER_SYNC_MSG_TOTAL] = +{ + { /* LCTR_TRANSFER_SYNC_STATE_DISABLED */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_RESET */ + lctrTransferSyncActStart, /* LCTR_TRANSFER_SYNC_MSG_START */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_CANCEL */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_FAILED */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_DONE */ + NULL /* LCTR_TRANSFER_SYNC_MSG_TERMINATE */ + }, + { /* LCTR_TRANSFER_SYNC_STATE_DISCOVER */ + lctrTransferSyncActCancel, /* LCTR_TRANSFER_SYNC_MSG_RESET */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_START */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_CANCEL */ + lctrTransferSyncActFailed, /* LCTR_TRANSFER_SYNC_MSG_FAILED */ + lctrTransferSyncActDone, /* LCTR_TRANSFER_SYNC_MSG_DONE */ + NULL /* LCTR_TRANSFER_SYNC_MSG_TERMINATE */ + }, + { /* LCTR_TRANSFER_SYNC_STATE_SHUTDOWN */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_RESET */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_START */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_CANCEL */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_FAILED */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_DONE */ + lctrTransferSyncActTerminate /* LCTR_TRANSFER_SYNC_MSG_TERMINATE */ + }, + { /* LCTR_TRANSFER_SYNC_STATE_RESET */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_RESET */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_START */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_CANCEL */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_FAILED */ + NULL, /* LCTR_TRANSFER_SYNC_MSG_DONE */ + lctrTransferSyncActTerminate /* LCTR_TRANSFER_SYNC_MSG_TERMINATE */ + } +}; + +/*! \brief Transfer sync state machine next state table. */ +static const uint8_t lctrTransferSyncNextStateTbl[LCTR_TRANSFER_SYNC_STATE_TOTAL][LCTR_TRANSFER_SYNC_MSG_TOTAL] = +{ + { /* LCTR_TRANSFER_SYNC_STATE_DISABLED */ + LCTR_TRANSFER_SYNC_STATE_DISABLED, /* LCTR_TRANSFER_SYNC_MSG_RESET */ + LCTR_TRANSFER_SYNC_STATE_DISCOVER, /* LCTR_TRANSFER_SYNC_MSG_START */ + LCTR_TRANSFER_SYNC_STATE_DISABLED, /* LCTR_TRANSFER_SYNC_MSG_CANCEL */ + LCTR_TRANSFER_SYNC_STATE_DISABLED, /* LCTR_TRANSFER_SYNC_MSG_FAILED */ + LCTR_TRANSFER_SYNC_STATE_DISABLED, /* LCTR_TRANSFER_SYNC_MSG_DONE */ + LCTR_TRANSFER_SYNC_STATE_DISABLED, /* LCTR_TRANSFER_SYNC_MSG_TERMINATE */ + }, + { /* LCTR_TRANSFER_SYNC_STATE_DISCOVER */ + LCTR_TRANSFER_SYNC_STATE_RESET, /* LCTR_TRANSFER_SYNC_MSG_RESET */ + LCTR_TRANSFER_SYNC_STATE_DISCOVER, /* LCTR_TRANSFER_SYNC_MSG_START */ + LCTR_TRANSFER_SYNC_STATE_SHUTDOWN, /* LCTR_TRANSFER_SYNC_MSG_CANCEL */ + LCTR_TRANSFER_SYNC_STATE_SHUTDOWN, /* LCTR_TRANSFER_SYNC_MSG_FAILED */ + LCTR_TRANSFER_SYNC_STATE_DISABLED, /* LCTR_TRANSFER_SYNC_MSG_DONE */ + LCTR_TRANSFER_SYNC_STATE_DISCOVER /* LCTR_TRANSFER_SYNC_MSG_TERMINATE */ + }, + { /* LCTR_TRANSFER_SYNC_STATE_SHUTDOWN */ + LCTR_TRANSFER_SYNC_STATE_SHUTDOWN, /* LCTR_TRANSFER_SYNC_MSG_RESET */ + LCTR_TRANSFER_SYNC_STATE_SHUTDOWN, /* LCTR_TRANSFER_SYNC_MSG_START */ + LCTR_TRANSFER_SYNC_STATE_SHUTDOWN, /* LCTR_TRANSFER_SYNC_MSG_CANCEL */ + LCTR_TRANSFER_SYNC_STATE_SHUTDOWN, /* LCTR_TRANSFER_SYNC_MSG_FAILED */ + LCTR_TRANSFER_SYNC_STATE_SHUTDOWN, /* LCTR_TRANSFER_SYNC_MSG_DONE */ + LCTR_TRANSFER_SYNC_STATE_DISABLED, /* LCTR_TRANSFER_SYNC_MSG_TERMINATE */ + }, + + { /* LCTR_TRANSFER_SYNC_STATE_RESET */ + LCTR_TRANSFER_SYNC_STATE_RESET, /* LCTR_TRANSFER_SYNC_MSG_RESET */ + LCTR_TRANSFER_SYNC_STATE_RESET, /* LCTR_TRANSFER_SYNC_MSG_START */ + LCTR_TRANSFER_SYNC_STATE_RESET, /* LCTR_TRANSFER_SYNC_MSG_CANCEL */ + LCTR_TRANSFER_SYNC_STATE_RESET, /* LCTR_TRANSFER_SYNC_MSG_FAILED */ + LCTR_TRANSFER_SYNC_STATE_DISABLED, /* LCTR_TRANSFER_SYNC_MSG_DONE */ + LCTR_TRANSFER_SYNC_STATE_DISABLED /* LCTR_TRANSFER_SYNC_MSG_TERMINATE */ + } +}; + /*! \brief Periodic advertising state machine action table. */ static const lctrPerScanActFn_t lctrPerScanActionTbl[LCTR_PER_SCAN_STATE_TOTAL][LCTR_PER_SCAN_MSG_TOTAL] = { @@ -278,6 +362,27 @@ void lctrMstCreateSyncExecuteSm(uint8_t event) lctrPerCreateSync.state = lctrCreateSyncNextStateTbl[lctrPerCreateSync.state][event]; } +/*************************************************************************************************/ +/*! + * \brief Execute master transfer sync state machine. + * + * \param event State machine event. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrMstTransferSyncExecuteSm(uint8_t event) +{ + LL_TRACE_INFO2("lctrMstTransferSyncExecuteSm: state=%u, event=%u", lctrPerTransferSync.state, event); + + if (lctrTransferSyncActionTbl[lctrPerTransferSync.state][event]) + { + lctrTransferSyncActionTbl[lctrPerTransferSync.state][event](); + } + + lctrPerTransferSync.state = lctrTransferSyncNextStateTbl[lctrPerTransferSync.state][event]; +} + /*************************************************************************************************/ /*! * \brief Execute master periodic scanning state machine. diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_slave.c index ac62b23c71..b46d0b21c9 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave advertising state machine implementation file. + * \file + * \brief Link layer controller slave advertising state machine implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_slave_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_slave_ae.c index 81da5ce038..7f92d70650 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_slave_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_adv_slave_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,11 +16,14 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave advertising state machine implementation file. + * \file + * \brief Link layer controller slave advertising state machine implementation file. */ /*************************************************************************************************/ #include "lctr_int_adv_slave_ae.h" +#include "lctr_api_adv_slave_ae.h" +#include "lctr_int_adv_ae.h" #include "wsf_trace.h" /************************************************************************************************** @@ -33,6 +36,9 @@ typedef void (*lctrExtActFn_t)(lctrAdvSet_t *pAdvSet); /*! \brief Periodic action function call signature. */ typedef void (*lctrPerActFn_t)(lctrAdvSet_t *pAdvSet); +/*! \brief Periodic adv acad function call signature. */ +typedef void (*lctrAcadActFn_t)(lctrAdvSet_t *pAdvSet); + /************************************************************************************************** Global Variables **************************************************************************************************/ @@ -44,12 +50,12 @@ static const lctrExtActFn_t lctrExtAdvActionTbl[LCTR_EXT_ADV_STATE_TOTAL][LCTR_E lctrExtAdvActReset, /* LCTR_EXT_ADV_MSG_RESET */ lctrExtAdvActStart, /* LCTR_EXT_ADV_MSG_START */ lctrExtAdvActAdvCnf, /* LCTR_EXT_ADV_MSG_STOP */ - NULL, /* LCTR_EXT_ADV_MSG_INT_START */ + lctrExtAdvActSelfStart, /* LCTR_EXT_ADV_MSG_INT_START */ NULL, /* LCTR_EXT_ADV_MSG_TERMINATE */ NULL, /* LCTR_EXT_ADV_MSG_TMR_DUR_EXP */ }, { /* LCTR_EXT_ADV_STATE_ENABLED */ - lctrExtAdvActShutdown, /* LCTR_EXT_ADV_MSG_RESET */ + lctrExtAdvActResetShutdown, /* LCTR_EXT_ADV_MSG_RESET */ lctrExtAdvActRestart, /* LCTR_EXT_ADV_MSG_START */ lctrExtAdvActShutdown, /* LCTR_EXT_ADV_MSG_STOP */ NULL, /* LCTR_EXT_ADV_MSG_INT_START */ @@ -115,28 +121,28 @@ static const uint8_t lctrExtAdvNextStateTbl[LCTR_EXT_ADV_STATE_TOTAL][LCTR_EXT_A static const lctrPerActFn_t lctrPerAdvActionTbl[LCTR_PER_ADV_STATE_TOTAL][LCTR_PER_ADV_MSG_TOTAL] = { { /* LCTR_PER_ADV_STATE_DISABLED */ - NULL, /* LCTR_PER_ADV_MSG_RESET */ - lctrPeriodicAdvActStart, /* LCTR_PER_ADV_MSG_START */ - NULL, /* LCTR_PER_ADV_MSG_STOP */ - NULL /* LCTR_PER_ADV_MSG_TERMINATE */ + NULL, /* LCTR_PER_ADV_MSG_RESET */ + lctrPeriodicAdvActStart, /* LCTR_PER_ADV_MSG_START */ + NULL, /* LCTR_PER_ADV_MSG_STOP */ + NULL /* LCTR_PER_ADV_MSG_TERMINATE */ }, { /* LCTR_PER_ADV_STATE_ENABLED */ - lctrPeriodicAdvActShutdown, /* LCTR_PER_ADV_MSG_RESET */ - lctrPeriodicAdvActUpdate, /* LCTR_PER_ADV_MSG_START */ - lctrPeriodicAdvActShutdown, /* LCTR_PER_ADV_MSG_STOP */ - NULL, /* LCTR_PER_ADV_MSG_TERMINATE */ + NULL, /* LCTR_PER_ADV_MSG_RESET */ + lctrPeriodicAdvActUpdate, /* LCTR_PER_ADV_MSG_START */ + lctrPeriodicAdvActShutdown, /* LCTR_PER_ADV_MSG_STOP */ + NULL, /* LCTR_PER_ADV_MSG_TERMINATE */ }, { /* LCTR_PER_ADV_STATE_SHUTDOWN */ - NULL, /* LCTR_PER_ADV_MSG_RESET */ - lctrPeriodicAdvActDisallowAdvCnf,/* LCTR_PER_ADV_MSG_START */ - lctrPeriodicAdvActDisallowAdvCnf,/* LCTR_PER_ADV_MSG_STOP */ - lctrPeriodicAdvActAdvTerm /* LCTR_PER_ADV_MSG_TERMINATE */ + NULL, /* LCTR_PER_ADV_MSG_RESET */ + lctrPeriodicAdvActDisallowAdvCnf, /* LCTR_PER_ADV_MSG_START */ + lctrPeriodicAdvActDisallowAdvCnf, /* LCTR_PER_ADV_MSG_STOP */ + lctrPeriodicAdvActAdvTerm /* LCTR_PER_ADV_MSG_TERMINATE */ }, { /* LCTR_PER_ADV_STATE_RESET */ - NULL, /* LCTR_PER_ADV_MSG_RESET */ - lctrPeriodicAdvActDisallowAdvCnf,/* LCTR_PER_ADV_MSG_START */ - lctrPeriodicAdvActDisallowAdvCnf,/* LCTR_PER_ADV_MSG_STOP */ - lctrPeriodicAdvActResetTerm /* LCTR_PER_ADV_MSG_TERMINATE */ + NULL, /* LCTR_PER_ADV_MSG_RESET */ + lctrPeriodicAdvActDisallowAdvCnf, /* LCTR_PER_ADV_MSG_START */ + lctrPeriodicAdvActDisallowAdvCnf, /* LCTR_PER_ADV_MSG_STOP */ + NULL, /* LCTR_PER_ADV_MSG_TERMINATE */ } }; @@ -169,6 +175,29 @@ static const uint8_t lctrPerAdvNextStateTbl[LCTR_PER_ADV_STATE_TOTAL][LCTR_PER_A } }; +/*! \brief Acad state machine action table */ +static const lctrAcadActFn_t lctrAcadActionTbl[LCTR_ACAD_NUM_ID][LCTR_ACAD_COMM_MSG_TOTAL] = +{ + { /* LCTR_ACAD_ID_CHAN_MAP_UPDATE */ + lctrSlvAcadActChanMapUpdateStart, /* LCTR_ACAD_COMM_MSG_START */ + lctrSlvAcadActChanMapUpdateFinish /* LCTR_ACAD_COMM_MSG_FINISH */ + } +}; + +/*! \brief Acad state machine next state table. */ +static const uint8_t lctrAcadNextStateTbl[LCTR_ACAD_STATE_TOTAL][LCTR_ACAD_COMM_MSG_TOTAL] = +{ + { /* LCTR_ACAD_STATE_DISABLED */ + LCTR_ACAD_STATE_ENABLED, /* LCTR_ACAD_COMM_MSG_START */ + LCTR_ACAD_STATE_DISABLED, /* LCTR_ACAD_COMM_MSG_FINISH */ + }, + { /* LCTR_ACAD_STATE_ENABLED */ + LCTR_ACAD_STATE_ENABLED, /* LCTR_ACAD_COMM_MSG_START */ + LCTR_ACAD_STATE_DISABLED, /* LCTR_ACAD_COMM_MSG_FINISH */ + } +}; + + /*************************************************************************************************/ /*! * \brief Execute slave extended advertising state machine. @@ -212,3 +241,83 @@ void lctrSlvPeriodicAdvExecuteSm(lctrAdvSet_t *pAdvSet, uint8_t event) pAdvSet->perParam.perState = lctrPerAdvNextStateTbl[pAdvSet->perParam.perState][event]; } + +/*************************************************************************************************/ +/*! + * \brief Get common acad event from dispatcher message. + * + * \param event State machine event. + * + * \return None. + */ +/*************************************************************************************************/ +static uint8_t lctrSlvGetAcadCommEvt(uint8_t event) +{ + switch (event) + { + case LCTR_ACAD_MSG_CHAN_UPDATE: + return LCTR_ACAD_COMM_MSG_START; + + case LCTR_ACAD_MSG_CHAN_UPDATE_FINISH: + return LCTR_ACAD_COMM_MSG_FINISH; + + default: + return LCTR_ACAD_COMM_MSG_INVALID; + } +} + +/*************************************************************************************************/ +/*! + * \brief Get Acad id from dispatcher message. + * + * \param event State machine event. + * + * \return None. + */ +/*************************************************************************************************/ +static uint8_t lctrSlvGetAcadId(uint8_t event) +{ + switch (event) + { + case LCTR_ACAD_MSG_CHAN_UPDATE: + case LCTR_ACAD_MSG_CHAN_UPDATE_FINISH: + return LCTR_ACAD_ID_CHAN_MAP_UPDATE; + + default: + return LCTR_ACAD_INVALID_ID; + } +} + +/*************************************************************************************************/ +/*! + * \brief Execute slave periodic advertising state machine. + * + * \param pAdvSet Advertising set. + * \param event State machine event. + * + * \return Amount of bytes packed + */ +/*************************************************************************************************/ +void lctrSlvAcadExecuteSm(lctrAdvSet_t *pAdvSet, uint8_t event) +{ + uint8_t acadId; + + if ((event = lctrSlvGetAcadCommEvt(event)) == LCTR_ACAD_COMM_MSG_INVALID) + { + return; + } + if ((acadId = lctrSlvGetAcadId(event)) == LCTR_ACAD_INVALID_ID) + { + return; + } + + lctrAcadParam_t *pAcadData = &pAdvSet->acadParams[acadId]; + LL_TRACE_INFO3("lctrSlvAcadExecuteSm: acadId=%u, event=%u, state=%u", acadId, event, pAcadData->hdr.state); + + if (lctrAcadActionTbl[acadId][event]) + { + lctrAcadActionTbl[acadId][event](pAdvSet); + } + + pAcadData->hdr.state = lctrAcadNextStateTbl[pAcadData->hdr.state][event]; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_conn_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_conn_master.c index 232030bd04..9c48eff692 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_conn_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_conn_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master connection state machine implementation file. + * \file + * \brief Link layer controller master connection state machine implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_conn_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_conn_slave.c index 55cb910926..683626b66c 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_conn_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_conn_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller connection state machine implementation file. + * \file + * \brief Link layer controller connection state machine implementation file. */ /*************************************************************************************************/ @@ -164,6 +165,10 @@ void lctrSlvConnExecuteSm(lctrConnCtx_t *pCtx, uint8_t event) pCtx->llcpPendMask |= 1 << LCTR_PROC_CMN_DATA_LEN_UPD; pCtx->llcpNotifyMask |= 1 << LCTR_PROC_CMN_DATA_LEN_UPD; break; + case LCTR_CONN_MSG_API_REQ_PEER_SCA: + pCtx->llcpPendMask |= 1 << LCTR_PROC_CMN_REQ_PEER_SCA; + pCtx->llcpNotifyMask |= 1 << LCTR_PROC_CMN_REQ_PEER_SCA; + break; case LCTR_CONN_MSG_API_PHY_UPDATE: pCtx->llcpPendMask |= 1 << LCTR_PROC_PHY_UPD; pCtx->llcpNotifyMask |= 1 << LCTR_PROC_PHY_UPD; @@ -172,6 +177,10 @@ void lctrSlvConnExecuteSm(lctrConnCtx_t *pCtx, uint8_t event) pCtx->llcpPendMask |= 1 << LCTR_PROC_CMN_SET_MIN_USED_CHAN; pCtx->llcpNotifyMask |= 1 << LCTR_PROC_CMN_SET_MIN_USED_CHAN; break; + case LCTR_CONN_MSG_API_PER_ADV_SYNC_TRSF: + pCtx->llcpPendMask |= 1 << LCTR_PROC_CMN_PER_ADV_SYNC_TRSF; + pCtx->llcpNotifyMask |= 1 << LCTR_PROC_CMN_PER_ADV_SYNC_TRSF; + break; default: /* Invoke LLCP child state machine */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_init_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_init_master.c index b7177f2970..2f962e4439 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_init_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_init_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master initiate state machine implementation file. + * \file + * \brief Link layer controller master initiate state machine implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_init_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_init_master_ae.c index fac7af0cac..14cc356251 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_init_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_init_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master initiate state machine implementation file. + * \file + * \brief Link layer controller master initiate state machine implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_conn.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_conn.c index cc5e85ff36..f697a267fe 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_conn.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_conn.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief LLCP state machine implementation file. + * \file + * \brief LLCP state machine implementation file. */ /*************************************************************************************************/ @@ -70,9 +71,6 @@ enum LCTR_PROC_CMN_ACT_TOTAL /*!< Total common procedure actions. */ }; -/*! \brief Call signature of an action handler. */ -typedef void (*lctrLlcpEh_t)(lctrConnCtx_t *pCtx); - /************************************************************************************************** Global Variables **************************************************************************************************/ @@ -127,6 +125,22 @@ const lctrLlcpEh_t lctrCmnProcTbl[LCTR_PROC_CMN_TOTAL][LCTR_PROC_CMN_ACT_TOTAL] lctrStoreSetMinUsedChan, /* LCTR_PROC_CMN_ACT_RECV_REQ */ NULL, /* LCTR_PROC_CMN_ACT_SEND_RSP */ NULL /* LCTR_PROC_CMN_ACT_RECV_RSP */ + }, + /* LCTR_PROC_CMN_PER_ADV_SYNC_TRSF */ + { + lctrActStorePeriodicSyncTrsf, /* LCTR_PROC_CMN_ACT_API_PARAM */ + lctrActSendPeriodicSyncInd, /* LCTR_PROC_CMN_ACT_SEND_REQ */ + lctrActReceivePeriodicSyncInd,/* LCTR_PROC_CMN_ACT_RECV_REQ */ + NULL, /* LCTR_PROC_CMN_ACT_SEND_RSP */ + NULL /* LCTR_PROC_CMN_ACT_RECV_RSP */ + }, + /* LCTR_PROC_CMN_REQ_PEER_SCA */ + { + lctrStoreScaAction, /* LCTR_PROC_CMN_ACT_API_PARAM */ + lctrSendPeerScaReq, /* LCTR_PROC_CMN_ACT_SEND_REQ */ + lctrStorePeerSca, /* LCTR_PROC_CMN_ACT_RECV_REQ */ + lctrSendPeerScaRsp, /* LCTR_PROC_CMN_ACT_SEND_RSP */ + lctrStorePeerSca, /* LCTR_PROC_CMN_ACT_RECV_RSP */ } }; @@ -239,10 +253,16 @@ static uint8_t lctrGetCmnProcId(lctrConnCtx_t *pCtx, uint8_t event) case LCTR_CONN_MSG_API_SET_MIN_USED_CHAN: return LCTR_PROC_CMN_SET_MIN_USED_CHAN; + case LCTR_CONN_MSG_API_PER_ADV_SYNC_TRSF: + return LCTR_PROC_CMN_PER_ADV_SYNC_TRSF; + case LCTR_CONN_MSG_API_REMOTE_VERSION: case LCTR_CONN_LLCP_VERSION_EXCH: return LCTR_PROC_CMN_VER_EXCH; + case LCTR_CONN_MSG_API_REQ_PEER_SCA: + return LCTR_PROC_CMN_REQ_PEER_SCA; + case LCTR_CONN_LLCP_TERM: case LCTR_CONN_MSG_API_DISCONNECT: return LCTR_PROC_CMN_TERM; @@ -278,6 +298,13 @@ static uint8_t lctrGetCmnProcId(lctrConnCtx_t *pCtx, uint8_t event) case LL_PDU_MIN_USED_CHAN_IND: return LCTR_PROC_CMN_SET_MIN_USED_CHAN; + case LL_PDU_PERIODIC_SYNC_IND: + return LCTR_PROC_CMN_PER_ADV_SYNC_TRSF; + + case LL_PDU_PEER_SCA_REQ: + case LL_PDU_PEER_SCA_RSP: + return LCTR_PROC_CMN_REQ_PEER_SCA; + case LL_PDU_UNKNOWN_RSP: switch (lctrDataPdu.pld.unknownRsp.unknownType) { @@ -347,6 +374,8 @@ static uint8_t lctrRemapCmnProcEvent(lctrConnCtx_t *pCtx, uint8_t event) case LCTR_CONN_MSG_API_DISCONNECT: case LCTR_CONN_MSG_API_DATA_LEN_CHANGE: case LCTR_CONN_MSG_API_SET_MIN_USED_CHAN: + case LCTR_CONN_MSG_API_PER_ADV_SYNC_TRSF: + case LCTR_CONN_MSG_API_REQ_PEER_SCA: return LCTR_PROC_CMN_EVT_HOST_START; case LCTR_CONN_LLCP_FEATURE_EXCH: @@ -368,17 +397,18 @@ static uint8_t lctrRemapCmnProcEvent(lctrConnCtx_t *pCtx, uint8_t event) case LL_PDU_FEATURE_REQ: case LL_PDU_SLV_FEATURE_REQ: case LL_PDU_LENGTH_REQ: + case LL_PDU_PEER_SCA_REQ: return LCTR_PROC_CMN_EVT_RECV_REQ; - case LL_PDU_MIN_USED_CHAN_IND: - return LCTR_PROC_CMN_EVT_RECV_IND; - case LL_PDU_TERMINATE_IND: case LL_PDU_VERSION_IND: + case LL_PDU_MIN_USED_CHAN_IND: + case LL_PDU_PERIODIC_SYNC_IND: return LCTR_PROC_CMN_EVT_RECV_IND; case LL_PDU_FEATURE_RSP: case LL_PDU_LENGTH_RSP: + case LL_PDU_PEER_SCA_RSP: return LCTR_PROC_CMN_EVT_RECV_RSP; case LL_PDU_UNKNOWN_RSP: @@ -492,6 +522,26 @@ static bool_t lctrFeatureAvail(lctrConnCtx_t *pCtx, uint8_t proc, uint8_t event) } } break; + case LCTR_PROC_CMN_PER_ADV_SYNC_TRSF: + if ((event == LCTR_PROC_CMN_EVT_HOST_START) && + ((lmgrCb.features & LL_FEAT_PAST_SENDER) == 0)) + { + LL_TRACE_WARN1("Requested LCTR_PROC_CMN_PER_ADV_SYNC_TRSF not available, FeatSet=0x%08x", lmgrCb.features); + result = FALSE; + } + else if (event == LCTR_PROC_CMN_EVT_RECV_REQ) + { + LL_TRACE_WARN1("Slave cannot receive this LLCP proc=%u", proc); + result = FALSE; + } + break; + case LCTR_PROC_CMN_REQ_PEER_SCA: + if ((pCtx->usedFeatSet & LL_FEAT_SCA_UPDATE) == 0) + { + LL_TRACE_WARN1("Requested LCTR_PROC_CMN_REQ_PEER_SCA not available, usedFeatSet=0x%08x", pCtx->usedFeatSet); + result = FALSE; + } + break; case LCTR_PROC_CMN_TERM: default: break; @@ -565,6 +615,9 @@ static void lctrNotifyHostSuccess(lctrConnCtx_t *pCtx, uint8_t proc) case LCTR_PROC_CMN_DATA_LEN_UPD: /* We have already notified the host if the effective lengths changed. */ break; + case LCTR_PROC_CMN_REQ_PEER_SCA: + lctrNotifyHostPeerScaCnf(pCtx); + break; default: break; } @@ -656,7 +709,7 @@ bool_t lctrLlcpExecuteCommonSm(lctrConnCtx_t *pCtx, uint8_t event) case LCTR_PROC_CMN_EVT_HOST_START: pCtx->llcpNotifyMask |= 1 << proc; lctrExecAction(pCtx, proc, LCTR_PROC_CMN_ACT_API_PARAM); - /* no break */ + /* Fallthrough */ case LCTR_PROC_CMN_EVT_INT_START: if (lctrFeatureAvail(pCtx, proc, event)) { @@ -758,7 +811,7 @@ bool_t lctrLlcpExecuteCommonSm(lctrConnCtx_t *pCtx, uint8_t event) } break; } - /* no break */ + /* Fallthrough */ case LCTR_PROC_CMN_EVT_RECV_RSP: if (proc == pCtx->llcpActiveProc) { @@ -782,7 +835,7 @@ bool_t lctrLlcpExecuteCommonSm(lctrConnCtx_t *pCtx, uint8_t event) LL_TRACE_ERR1("Unexpected response packet, expected llcpActiveProc=%u", pCtx->llcpActiveProc); break; } - /* no break */ + /* Fallthrough */ case LCTR_PROC_CMN_EVT_PROC_COMP: /* Completion from CE */ case LCTR_PROC_CMN_EVT_REJECT: /* Failed completion */ if (event == LCTR_PROC_CMN_EVT_REJECT) diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_conn_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_conn_master.c index 2b3f3fbe82..99f7716481 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_conn_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_conn_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master connection state machine implementation file. + * \file + * \brief Link layer controller master connection state machine implementation file. */ /*************************************************************************************************/ @@ -422,6 +423,8 @@ static uint8_t lctrMstConnUpdRemapEvent(lctrConnCtx_t *pCtx, uint8_t event) case LL_PDU_UNKNOWN_RSP: if (lctrDataPdu.pld.unknownRsp.unknownType == LL_PDU_CONN_PARAM_REQ) { + /* Remember this remote device does not support Connection Parameters Request procedure. */ + pCtx->usedFeatSet &= ~LL_FEAT_CONN_PARAM_REQ_PROC; return LCTR_CU_EVENT_INT_SKIP_CONN_PARAM; } /* Not for this SM. */ @@ -552,6 +555,7 @@ static void lctrMstCheckProcOverride(lctrConnCtx_t *pCtx, uint8_t event) case LCTR_PROC_CMN_VER_EXCH: case LCTR_PROC_CMN_FEAT_EXCH: case LCTR_PROC_CMN_DATA_LEN_UPD: + case LCTR_PROC_CMN_REQ_PEER_SCA: pCtx->llcpPendMask |= 1 << pCtx->llcpActiveProc; pCtx->llcpActiveProc = LCTR_PROC_CONN_UPD; pCtx->llcpIsOverridden = TRUE; @@ -644,6 +648,7 @@ bool_t lctrMstLlcpExecuteConnUpdSm(lctrConnCtx_t *pCtx, uint8_t event) /*************************************************************************************************/ void lctrMstLlcpExecuteSm(lctrConnCtx_t *pCtx, uint8_t event) { + /* Override state machine */ switch (event) { @@ -663,6 +668,8 @@ void lctrMstLlcpExecuteSm(lctrConnCtx_t *pCtx, uint8_t event) !(lctrMstLlcpSmTbl[LCTR_LLCP_SM_PING] && lctrMstLlcpSmTbl[LCTR_LLCP_SM_PING](pCtx, event)) && !(lctrMstLlcpSmTbl[LCTR_LLCP_SM_CONN_UPD] && lctrMstLlcpSmTbl[LCTR_LLCP_SM_CONN_UPD](pCtx, event)) && !(lctrMstLlcpSmTbl[LCTR_LLCP_SM_PHY_UPD] && lctrMstLlcpSmTbl[LCTR_LLCP_SM_PHY_UPD](pCtx, event)) && + !(lctrMstLlcpSmTbl[LCTR_LLCP_SM_CIS_EST] && lctrMstLlcpSmTbl[LCTR_LLCP_SM_CIS_EST](pCtx, event)) && + !(lctrMstLlcpSmTbl[LCTR_LLCP_SM_CIS_TERM] && lctrMstLlcpSmTbl[LCTR_LLCP_SM_CIS_TERM](pCtx, event)) && !(lctrMstLlcpSmTbl[LCTR_LLCP_SM_CMN] && lctrMstLlcpSmTbl[LCTR_LLCP_SM_CMN](pCtx, event))) { lctrLlcpStatelessEventHandler(pCtx, event); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_conn_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_conn_slave.c index 38bf0e8ed9..328dae2065 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_conn_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_conn_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave connection state machine implementation file. + * \file + * \brief Link layer controller slave connection state machine implementation file. */ /*************************************************************************************************/ @@ -416,6 +417,8 @@ static uint8_t lctrSlvConnUpdRemapEvent(lctrConnCtx_t *pCtx, uint8_t event) case LL_PDU_UNKNOWN_RSP: if (lctrDataPdu.pld.unknownRsp.unknownType == LL_PDU_CONN_PARAM_REQ) { + /* Remember this remote device does not support Connection Parameters Request procedure. */ + pCtx->usedFeatSet &= ~LL_FEAT_CONN_PARAM_REQ_PROC; return LCTR_CU_EVENT_PEER_REJECT; } /* Not for this SM. */ @@ -432,6 +435,10 @@ static uint8_t lctrSlvConnUpdRemapEvent(lctrConnCtx_t *pCtx, uint8_t event) { return LCTR_CU_EVENT_PEER_REJECT; } + if (lctrDataPdu.pld.rejInd.opcode == LL_PDU_CONN_PARAM_RSP) + { + return LCTR_CU_EVENT_PEER_REJECT; + } /* Not for this SM. */ break; @@ -542,6 +549,7 @@ static void lctrSlvCheckProcOverride(lctrConnCtx_t *pCtx, uint8_t event) case LCTR_PROC_CMN_VER_EXCH: case LCTR_PROC_CMN_FEAT_EXCH: case LCTR_PROC_CMN_DATA_LEN_UPD: + case LCTR_PROC_CMN_REQ_PEER_SCA: pCtx->llcpPendMask |= 1 << pCtx->llcpActiveProc; pCtx->llcpActiveProc = LCTR_PROC_CONN_UPD; pCtx->llcpIsOverridden = TRUE; @@ -698,6 +706,8 @@ void lctrSlvLlcpExecuteSm(lctrConnCtx_t *pCtx, uint8_t event) !(lctrSlvLlcpSmTbl[LCTR_LLCP_SM_PING] && lctrSlvLlcpSmTbl[LCTR_LLCP_SM_PING](pCtx, event)) && !(lctrSlvLlcpSmTbl[LCTR_LLCP_SM_CONN_UPD] && lctrSlvLlcpSmTbl[LCTR_LLCP_SM_CONN_UPD](pCtx, event)) && !(lctrSlvLlcpSmTbl[LCTR_LLCP_SM_PHY_UPD] && lctrSlvLlcpSmTbl[LCTR_LLCP_SM_PHY_UPD](pCtx, event)) && + !(lctrSlvLlcpSmTbl[LCTR_LLCP_SM_CIS_EST] && lctrSlvLlcpSmTbl[LCTR_LLCP_SM_CIS_EST](pCtx, event)) && + !(lctrSlvLlcpSmTbl[LCTR_LLCP_SM_CIS_TERM] && lctrSlvLlcpSmTbl[LCTR_LLCP_SM_CIS_TERM](pCtx, event)) && !(lctrSlvLlcpSmTbl[LCTR_LLCP_SM_CMN] && lctrSlvLlcpSmTbl[LCTR_LLCP_SM_CMN](pCtx, event))) { lctrLlcpStatelessEventHandler(pCtx, event); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_enc_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_enc_master.c index 4def124d25..0c2f6e370b 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_enc_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_enc_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master encryption connection state machine implementation file. + * \file + * \brief Link layer controller master encryption connection state machine implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_enc_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_enc_slave.c index 0c34a0c92d..c9d3df3ff2 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_enc_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_enc_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave encryption connection state machine implementation file. + * \file + * \brief Link layer controller slave encryption connection state machine implementation file. */ /*************************************************************************************************/ @@ -484,7 +485,8 @@ static uint8_t lctrRemapPingEvent(lctrConnCtx_t *pCtx, uint8_t event) { break; } - /* no break: treat UNKNOWN_RSP like LE_PING_RSP */ + /* treat UNKNOWN_RSP like LE_PING_RSP */ + /* Fallthrough */ case LL_PDU_PING_RSP: return LCTR_PING_EVENT_RECV_RSP; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_master_phy.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_master_phy.c index 0d27567e38..376caedc3b 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_master_phy.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_master_phy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller master PHY update state machine implementation file. + * \file + * \brief Link layer controller master PHY update state machine implementation file. */ /*************************************************************************************************/ @@ -550,6 +551,7 @@ static void lctrMstCheckProcOverride(lctrConnCtx_t *pCtx, uint8_t event) case LCTR_PROC_CMN_VER_EXCH: case LCTR_PROC_CMN_FEAT_EXCH: case LCTR_PROC_CMN_DATA_LEN_UPD: + case LCTR_PROC_CMN_REQ_PEER_SCA: pCtx->llcpPendMask |= 1 << pCtx->llcpActiveProc; pCtx->llcpActiveProc = LCTR_PROC_PHY_UPD; pCtx->llcpIsOverridden = TRUE; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_slave_phy.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_slave_phy.c index e2ccd28857..0febf04960 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_slave_phy.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lctr/lctr_sm_llcp_slave_phy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer controller slave PHY update state machine implementation file. + * \file + * \brief Link layer controller slave PHY update state machine implementation file. */ /*************************************************************************************************/ @@ -26,6 +27,7 @@ #include "lctr_int_conn_master.h" #include "lctr_int_conn_slave.h" #include "lmgr_api.h" +#include "wsf_math.h" #include "wsf_assert.h" #include "wsf_trace.h" @@ -73,6 +75,85 @@ uint8_t lctrSuppPhys(void); void lctrActStartPhyUpdate(lctrConnCtx_t *pCtx); void lctrActFlushArq(lctrConnCtx_t *pCtx); +/************************************************************************************************** + Local Functions +**************************************************************************************************/ +/*************************************************************************************************/ +/*! + * \brief Update effective data packet time after PHY update procedure completes and notify host. + * + * \param pCtx Connection context. + * + * \return None. + */ +/*************************************************************************************************/ +static void lctrUpdateDataTime(lctrConnCtx_t *pCtx) +{ + uint16_t maxTxTime = 0; + uint16_t maxRxTime = 0; + + lctrDataLen_t oldEffDataPdu = pCtx->effDataPdu; + + switch (pCtx->bleData.chan.txPhy) + { + case BB_PHY_BLE_1M: + maxTxTime = WSF_MIN(LL_DATA_LEN_TO_TIME_1M(pCtx->effDataPdu.maxTxLen), pCtx->effDataPdu.maxTxTime); + break; + case BB_PHY_BLE_2M: + maxTxTime = WSF_MIN(LL_DATA_LEN_TO_TIME_2M(pCtx->effDataPdu.maxTxLen), pCtx->effDataPdu.maxTxTime); + break; + case BB_PHY_BLE_CODED: + maxTxTime = WSF_MIN(LL_DATA_LEN_TO_TIME_CODED_S8(pCtx->effDataPdu.maxTxLen), pCtx->effDataPdu.maxTxTime); + break; + } + + switch (pCtx->bleData.chan.rxPhy) + { + case BB_PHY_BLE_1M: + maxRxTime = WSF_MIN(LL_DATA_LEN_TO_TIME_1M(pCtx->effDataPdu.maxRxLen), pCtx->effDataPdu.maxRxTime); + break; + case BB_PHY_BLE_2M: + maxRxTime = WSF_MIN(LL_DATA_LEN_TO_TIME_2M(pCtx->effDataPdu.maxRxLen), pCtx->effDataPdu.maxRxTime); + break; + case BB_PHY_BLE_CODED: + maxRxTime = WSF_MIN(LL_DATA_LEN_TO_TIME_CODED_S8(pCtx->effDataPdu.maxRxLen), pCtx->effDataPdu.maxRxTime); + break; + } + + pCtx->effDataPdu.maxRxTime = maxRxTime; + pCtx->effDataPdu.maxTxTime = maxTxTime; + + /* connEffectiveMaxRxTimeCoded - the greater of 2704 and connEffectiveMaxRxTimeUncoded. */ + if (pCtx->bleData.chan.rxPhy == BB_PHY_BLE_CODED) + { + pCtx->effDataPdu.maxRxTime = WSF_MAX(pCtx->effDataPdu.maxRxTime, LL_MAX_DATA_TIME_ABS_MIN_CODED); + } + else + { + pCtx->effDataPdu.maxRxTime = WSF_MAX(pCtx->effDataPdu.maxRxTime, LL_MAX_DATA_TIME_MIN); + } + + if (pCtx->bleData.chan.txPhy == BB_PHY_BLE_CODED) + { + pCtx->effDataPdu.maxTxTime = WSF_MAX(pCtx->effDataPdu.maxTxTime, LL_MAX_DATA_TIME_ABS_MIN_CODED); + } + else + { + pCtx->effDataPdu.maxTxTime = WSF_MAX(pCtx->effDataPdu.maxTxTime, LL_MAX_DATA_TIME_MIN); + } + + if (lmgrCb.features & LL_FEAT_DATA_LEN_EXT) + { + if ((oldEffDataPdu.maxTxLen != pCtx->effDataPdu.maxTxLen) || + (oldEffDataPdu.maxRxLen != pCtx->effDataPdu.maxRxLen) || + (oldEffDataPdu.maxTxTime != pCtx->effDataPdu.maxTxTime) || + (oldEffDataPdu.maxRxTime != pCtx->effDataPdu.maxRxTime)) + { + lctrNotifyHostDataLengthInd(pCtx, LL_SUCCESS); + } + } +} + /************************************************************************************************** Global Functions **************************************************************************************************/ @@ -111,6 +192,32 @@ void lctrActPeerRejectPhyReq(lctrConnCtx_t *pCtx) } } +/*************************************************************************************************/ +/*! + * \brief Notify host of connection update with no change. + * + * \param pCtx Connection context. + * + * \return None. + */ +/*************************************************************************************************/ +void lctrActNotifyHostPhyUpdateNoChange(lctrConnCtx_t *pCtx) +{ + /* Remove packet time restrictions. */ + lctrRemovePacketTimeRestriction(pCtx); + + if ((pCtx->llcpNotifyMask & (1 << LCTR_PROC_PHY_UPD))) + { + pCtx->llcpNotifyMask &= ~(1 << LCTR_PROC_PHY_UPD); + + if (pCtx->connEst && (pCtx->state != LCTR_CONN_STATE_TERMINATING)) + { + /* Only send PHY Update event if still connected. */ + lctrNotifyHostPhyUpdateInd(pCtx, LL_SUCCESS); + } + } +} + /*************************************************************************************************/ /*! * \brief Notify host of connection update with success status. @@ -128,7 +235,10 @@ void lctrActNotifyHostPhyUpdateSuccess(lctrConnCtx_t *pCtx) if (pCtx->llcpNotifyMask & (1 << LCTR_PROC_PHY_UPD)) { pCtx->llcpNotifyMask &= ~(1 << LCTR_PROC_PHY_UPD); + lctrNotifyHostPhyUpdateInd(pCtx, LL_SUCCESS); + + lctrUpdateDataTime(pCtx); } } @@ -444,7 +554,7 @@ static const lctrActFn_t lctrSlvPhyUpdateActionTbl[LCTR_PU_STATE_TOTAL][LCTR_PU_ lctrActPeerPhyUpdateReq, /* LCTR_PU_EVENT_PEER_PHY_UPDATE_IND */ lctrActPeerPhyReqWithCollision, /* LCTR_PU_EVENT_PEER_PHY_REQ */ lctrActPeerRejectPhyReq, /* LCTR_PU_EVENT_PEER_REJECT */ - lctrActNotifyHostPhyUpdateSuccess, /* LCTR_PU_EVENT_INT_PROC_COMP */ /* if no change */ + lctrActNotifyHostPhyUpdateNoChange, /* LCTR_PU_EVENT_INT_PROC_COMP */ /* if no change */ NULL, /* LCTR_PU_EVENT_INT_START_PHY_UPD */ /* should never occur */ NULL /* LCTR_PU_EVENT_ARQ_FLUSHED */ /* should never occur (not for this SM) */ }, @@ -708,6 +818,7 @@ static void lctrSlvCheckProcOverride(lctrConnCtx_t *pCtx, uint8_t event) case LCTR_PROC_CMN_VER_EXCH: case LCTR_PROC_CMN_FEAT_EXCH: case LCTR_PROC_CMN_DATA_LEN_UPD: + case LCTR_PROC_CMN_REQ_PEER_SCA: pCtx->llcpPendMask |= 1 << pCtx->llcpActiveProc; pCtx->llcpActiveProc = LCTR_PROC_PHY_UPD; pCtx->llcpIsOverridden = TRUE; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd.c index 9981ce6cf8..950b64cafc 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,18 +16,20 @@ /*************************************************************************************************/ /*! - * \brief HCI command module implementation file. + * \file + * \brief HCI command module implementation file. */ /*************************************************************************************************/ #include "lhci_int.h" #include "hci_defs.h" -#include "bb_ble_drv.h" +#include "pal_bb_ble.h" #include "ll_api.h" #include "ll_defs.h" #include "ll_math.h" #include "wsf_msg.h" #include "util/bstream.h" +#include "lmgr_api.h" #include /*************************************************************************************************/ @@ -119,155 +121,7 @@ static uint8_t lhciPackLocalSupCmds(uint8_t *pBuf, uint8_t status) memset(pBuf, 0, len); UINT8_TO_BSTREAM (pBuf, status); - - pBuf[5] = HCI_SUP_SET_EVENT_MASK | /* mandatory */ - HCI_SUP_RESET; /* mandatory */ - pBuf[14] = HCI_SUP_READ_LOCAL_VER_INFO | /* mandatory */ - HCI_SUP_READ_LOCAL_SUP_FEAT; /* mandatory */ - pBuf[15] = HCI_SUP_READ_BD_ADDR; /* mandatory */ - pBuf[22] = HCI_SUP_SET_EVENT_MASK_PAGE2; /* optional or LE ping */ - pBuf[25] = HCI_SUP_LE_SET_EVENT_MASK | /* mandatory */ - HCI_SUP_LE_READ_BUF_SIZE | /* mandatory */ - HCI_SUP_LE_READ_LOCAL_SUP_FEAT | /* mandatory */ - HCI_SUP_LE_SET_RAND_ADDR; /* Tx device */ - pBuf[26] = HCI_SUP_LE_READ_WHITE_LIST_SIZE | /* mandatory */ - HCI_SUP_LE_CLEAR_WHITE_LIST; /* mandatory */ - pBuf[27] = HCI_SUP_LE_ADD_DEV_WHITE_LIST | /* mandatory */ - HCI_SUP_LE_REMOVE_DEV_WHITE_LIST | /* mandatory */ - HCI_SUP_LE_RAND; /* LL encryption or optional */ - pBuf[28] = HCI_SUP_LE_READ_SUP_STATES | /* mandatory (4.1+) */ - HCI_SUP_LE_RECEIVER_TEST | /* Rx device */ - HCI_SUP_LE_TRANSMITTER_TEST | /* Tx device */ - HCI_SUP_LE_TEST_END; /* mandatory */ - pBuf[38] = HCI_SUP_LE_READ_TX_POWER; /* mandatory (5.0) */ - - if (lhciCmdTbl[LHCI_MSG_CONN]) - { - pBuf[0] |= HCI_SUP_DISCONNECT; /* Master or slave */ - pBuf[2] |= HCI_SUP_READ_REMOTE_VER_INFO; /* Master or slave */ - pBuf[10] |= HCI_SUP_READ_TX_PWR_LVL; /* Master or slave */ - pBuf[15] |= HCI_SUP_READ_RSSI; /* Master or slave */ - - pBuf[27] |= HCI_SUP_LE_CONN_UPDATE | /* Master role or initiating conn param req */ - HCI_SUP_LE_READ_CHAN_MAP | /* Master or slave */ - HCI_SUP_LE_READ_REMOTE_FEAT; /* Master or optional */ - - pBuf[33] |= HCI_SUP_LE_SET_DATA_LEN | /* Data length extensions */ - HCI_SUP_LE_READ_DEF_DATA_LEN | /* Data length extensions */ - HCI_SUP_LE_REM_CONN_PARAM_REQ_REPL | /* Accepting conn param req */ - HCI_SUP_LE_REM_CONN_PARAM_REQ_NEG_REPL; /* Accepting conn param req */ - pBuf[34] |= HCI_SUP_LE_WRITE_DEF_DATA_LEN; /* Data length extensions */ - pBuf[35] |= HCI_SUP_LE_READ_MAX_DATA_LEN; /* Data length extensions */ - } - - if (lhciCmdTbl[LHCI_MSG_SCAN]) /* i.e. master */ - { - pBuf[26] |= HCI_SUP_LE_SET_SCAN_PARAM | /* Rx device */ - HCI_SUP_LE_SET_SCAN_ENABLE; /* Rx device */ - - if (lhciCmdTbl[LHCI_MSG_CONN]) - { - pBuf[26] |= HCI_SUP_LE_CREATE_CONN | /* Master role */ - HCI_SUP_LE_CREATE_CONN_CANCEL; /* Master role */ - pBuf[27] |= HCI_SUP_LE_SET_HOST_CHAN_CLASS; /* Master role */ - } - } - - if (lhciCmdTbl[LHCI_MSG_ADV]) /* i.e. slave */ - { - pBuf[25] |= HCI_SUP_LE_SET_ADV_PARAM | /* Tx device */ - HCI_SUP_LE_READ_ADV_TX_POWER | /* Tx device */ - HCI_SUP_LE_SET_ADV_DATA; /* Tx device */ - pBuf[26] |= HCI_SUP_LE_SET_SCAN_RESP_DATA | /* Tx + Rx device */ - HCI_SUP_LE_SET_ADV_ENABLE; /* Tx device */ - } - - if (lhciCmdTbl[LHCI_MSG_ENC] && - lhciCmdTbl[LHCI_MSG_CONN]) - { - pBuf[27] |= HCI_SUP_LE_ENCRYPT; /* LL encryption */ - pBuf[28] |= HCI_SUP_LE_LTK_REQ_REPL | /* LL encryption + slave */ - HCI_SUP_LE_LTK_REQ_NEG_REPL | /* LL encryption + slave */ - HCI_SUP_LE_START_ENCRYPTION; /* LL encryption + master */ - pBuf[32] |= HCI_SUP_READ_AUTH_PAYLOAD_TO | /* LE ping */ - HCI_SUP_WRITE_AUTH_PAYLOAD_TO; /* LE ping */ - } - - if (lhciCmdTbl[LHCI_MSG_PRIV]) - { - pBuf[34] |= HCI_SUP_LE_ADD_DEV_RES_LIST_EVT | /* LE privacy */ - HCI_SUP_LE_REMOVE_DEV_RES_LIST | /* LE privacy */ - HCI_SUP_LE_CLEAR_RES_LIST | /* LE privacy */ - HCI_SUP_LE_READ_RES_LIST_SIZE; /* LE privacy */ - pBuf[35] |= HCI_SUP_LE_SET_ADDR_RES_ENABLE | /* LE privacy */ - HCI_SUP_LE_SET_RES_PRIV_ADDR_TO; /* LE privacy */ - pBuf[39] |= HCI_SUP_LE_SET_PRIVACY_MODE; /* LE privacy */ - - if (lhciCmdTbl[LHCI_MSG_CONN]) - { - pBuf[34] |= HCI_SUP_LE_READ_PEER_RES_ADDR; /* LE privacy + master or slave */ - pBuf[35] |= HCI_SUP_LE_READ_LOCAL_RES_ADDR; /* LE privacy + master or slave */ - } - } - - if (lhciCmdTbl[LHCI_MSG_SC]) - { - pBuf[34] |= HCI_SUP_LE_READ_LOCAL_P256_PUB_KEY | /* Secure connections */ - HCI_SUP_LE_GENERATE_DHKEY; /* Secure connections */ - } - - if (lhciCmdTbl[LHCI_MSG_PHY]) - { - pBuf[35] |= HCI_SUP_LE_READ_PHY | /* LE PHY features */ - HCI_SUP_LE_SET_DEF_PHY | /* LE PHY features */ - HCI_SUP_LE_SET_PHY | /* LE PHY features */ - HCI_SUP_LE_ENHANCED_RECEIVER_TEST; /* LE PHY features */ - pBuf[36] |= HCI_SUP_LE_ENHANCED_TRANSMITTER_TEST; /* LE PHY features */ - } - - if (lhciCmdTbl[LHCI_MSG_EXT_ADV]) - { - pBuf[36] |= HCI_SUP_LE_SET_ADV_SET_RAND_ADDR | /* Extended advertising */ - HCI_SUP_LE_SET_EXT_ADV_PARAM | /* Extended advertising */ - HCI_SUP_LE_SET_EXT_ADV_DATA | /* Extended advertising */ - HCI_SUP_LE_SET_EXT_SCAN_RESP_DATA | /* Extended advertising */ - HCI_SUP_LE_SET_EXT_ADV_ENABLE | /* Extended advertising */ - HCI_SUP_LE_READ_MAX_ADV_DATA_LEN | /* Extended advertising */ - HCI_SUP_LE_READ_NUM_OF_SUP_ADV_SETS; /* Extended advertising */ - pBuf[37] |= HCI_SUP_LE_REMOVE_ADV_SET | /* Extended advertising */ - HCI_SUP_LE_CLEAR_ADV_SETS; /* Extended advertising */ - pBuf[39] |= HCI_SUP_LE_READ_RF_PATH_COMP | /* Extended advertising */ - HCI_SUP_LE_WRITE_RF_PATH_COMP; /* Extended advertising */ - } - - if (lhciCmdTbl[LHCI_MSG_EXT_SCAN]) - { - pBuf[37] |= HCI_SUP_LE_SET_EXT_SCAN_PARAM | /* Extended scanning */ - HCI_SUP_LE_SET_EXT_SCAN_ENABLE; /* Extended scanning */ - - if (lhciCmdTbl[LHCI_MSG_CONN]) - { - pBuf[37] |= HCI_SUP_LE_EXT_CREATE_CONN; /* Extended initiate. */ - } - } - - if (lhciCmdTbl[LHCI_MSG_PER_ADV]) - { - pBuf[37] |= HCI_SUP_LE_SET_PER_ADV_PARAM | /* Periodic advertising */ - HCI_SUP_LE_SET_PER_ADV_DATA | /* Periodic advertising */ - HCI_SUP_LE_SET_PER_ADV_ENABLE; - } - - if (lhciCmdTbl[LHCI_MSG_PER_SCAN]) - { - pBuf[38] |= HCI_SUP_LE_PER_ADV_CREATE_SYNC | /* Periodic scanning */ - HCI_SUP_LE_PER_ADV_CREATE_SYNC_CANCEL | /* Periodic scanning */ - HCI_SUP_LE_PER_ADV_TERMINATE_SYNC | /* Periodic scanning */ - HCI_SUP_LE_ADD_DEV_PER_ADV_LIST | /* Periodic scanning */ - HCI_SUP_LE_REMOVE_DEV_PER_ADV_LIST | /* Periodic scanning */ - HCI_SUP_LE_CLEAR_PER_ADV_LIST | /* Periodic scanning */ - HCI_SUP_LE_READ_PER_ADV_LIST_SIZE; /* Periodic scanning */ - } + memcpy(pBuf, LmgrReadHciSupCmd(), HCI_SUP_CMD_LEN); return len; } @@ -350,6 +204,7 @@ static void lhciCommonSendCmdCmplEvt(LhciHdr_t *pCmdHdr, uint8_t status, uint8_t case HCI_OPCODE_LE_REMOVE_DEV_WHITE_LIST: case HCI_OPCODE_LE_WRITE_RF_PATH_COMP: case HCI_OPCODE_NOP: + case HCI_OPCODE_LE_MODIFY_SLEEP_CLK_ACC: lhciPackCmdCompleteEvtStatus(pBuf, status); break; @@ -360,7 +215,7 @@ static void lhciCommonSendCmdCmplEvt(LhciHdr_t *pCmdHdr, uint8_t status, uint8_t const uint8_t size = sizeof(uint64_t) / sizeof(uint8_t); pBuf += lhciPackCmdCompleteEvtStatus(pBuf, status); - BbBleDrvRand(pBuf, size); + PalCryptoGenerateRandomNumber(pBuf, size); /* pBuf += size; */ break; } @@ -570,6 +425,10 @@ bool_t lhciCommonDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) case HCI_OPCODE_LE_TEST_END: paramLen = LHCI_LEN_LE_TEST_END_EVT; break; + case HCI_OPCODE_LE_MODIFY_SLEEP_CLK_ACC: + paramLen = LHCI_LEN_LE_MODIFY_SCA_EVT; + status = LlModifySleepClockAccuracy(pBuf[0]); + break; /* --- default --- */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_master.c index 3c5146c7ff..f97fa3cd5a 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief HCI command module implementation file. + * \file + * \brief HCI command module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_master_ae.c index 852889792f..6bf8d73919 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief HCI command module implementation file. + * \file + * \brief HCI command module implementation file. */ /*************************************************************************************************/ @@ -182,14 +183,14 @@ bool_t lhciMstExtScanDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) case HCI_OPCODE_LE_PER_ADV_CREATE_SYNC: { LlPerAdvCreateSyncCmd_t cmd; - BSTREAM_TO_UINT8(cmd.filterPolicy, pBuf); + BSTREAM_TO_UINT8(cmd.options, pBuf); BSTREAM_TO_UINT8(cmd.advSID, pBuf); BSTREAM_TO_UINT8(cmd.advAddrType, pBuf); cmd.pAdvAddr = pBuf; pBuf += BDA_ADDR_LEN; BSTREAM_TO_UINT16(cmd.skip, pBuf); BSTREAM_TO_UINT16(cmd.syncTimeOut, pBuf); - pBuf++; + pBuf++; /* Sync_CTE_Type (Unused) */ status = LlPeriodicAdvCreateSync(&cmd); paramLen = LHCI_LEN_CMD_STATUS_EVT; break; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_priv.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_priv.c index 645cf20134..7712a95c42 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_priv.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_priv.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief HCI command module implementation file. + * \file + * \brief HCI command module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_slave.c index e7fcea2893..8506dae9a9 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief HCI command module implementation file. + * \file + * \brief HCI command module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_slave_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_slave_ae.c index e1eef02eba..c3a0ff8693 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_slave_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_adv_slave_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief HCI command module implementation file. + * \file + * \brief HCI command module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn.c index f0930718d5..21334737fd 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief HCI command module implementation file. + * \file + * \brief HCI command module implementation file. */ /*************************************************************************************************/ @@ -25,6 +26,7 @@ #include "ll_api.h" #include "ll_defs.h" #include "wsf_msg.h" +#include "wsf_trace.h" #include "util/bstream.h" #include @@ -88,7 +90,7 @@ static uint8_t lhciPackReadPwrLevel(uint8_t *pBuf, uint8_t status, uint16_t hand * \return None. */ /*************************************************************************************************/ -static void lhciConnSendCmdCmplEvt(LhciHdr_t *pCmdHdr, uint8_t status, uint8_t paramLen, uint8_t *pParam, uint16_t handle) +void lhciConnSendCmdCmplEvt(LhciHdr_t *pCmdHdr, uint8_t status, uint8_t paramLen, uint8_t *pParam, uint16_t handle) { uint8_t *pBuf; uint8_t *pEvtBuf; @@ -104,6 +106,9 @@ static void lhciConnSendCmdCmplEvt(LhciHdr_t *pCmdHdr, uint8_t status, uint8_t p /* --- command completion with status only parameter --- */ case HCI_OPCODE_LE_WRITE_DEF_DATA_LEN: + case HCI_OPCODE_LE_SET_PER_ADV_RCV_ENABLE: + case HCI_OPCODE_LE_SET_PAST_PARAM: + case HCI_OPCODE_LE_SET_DEFAULT_PAST_PARAM: lhciPackCmdCompleteEvtStatus(pBuf, status); break; @@ -112,6 +117,8 @@ static void lhciConnSendCmdCmplEvt(LhciHdr_t *pCmdHdr, uint8_t status, uint8_t p case HCI_OPCODE_LE_REM_CONN_PARAM_REP: case HCI_OPCODE_LE_REM_CONN_PARAM_NEG_REP: case HCI_OPCODE_LE_SET_DATA_LEN: + case HCI_OPCODE_LE_PER_ADV_SYNC_TRANSFER: + case HCI_OPCODE_LE_PER_ADV_SET_INFO_TRANSFER: pBuf += lhciPackCmdCompleteEvtStatus(pBuf, status); UINT16_TO_BSTREAM(pBuf, handle); break; @@ -314,6 +321,14 @@ bool_t lhciConnDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) status = LlReadRemoteVerInfo(handle); paramLen = LHCI_LEN_CMD_STATUS_EVT; break; + case HCI_OPCODE_LE_REQUEST_PEER_SCA: + { + BSTREAM_TO_UINT16(handle, pBuf); + status = LlRequestPeerSca(handle); + paramLen = LHCI_LEN_CMD_STATUS_EVT; + + break; + } /* --- default --- */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn_master.c index 2879c0cd48..8073b4b518 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,12 +16,14 @@ /*************************************************************************************************/ /*! - * \brief HCI command module implementation file. + * \file + * \brief HCI command module implementation file. */ /*************************************************************************************************/ #include "lhci_int.h" #include "hci_defs.h" +#include "lctr_api.h" #include "ll_api.h" #include "ll_defs.h" #include "wsf_msg.h" diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn_master_ae.c index 67263f64ab..76fd5ea96b 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief HCI command module implementation file. + * \file + * \brief HCI command module implementation file. */ /*************************************************************************************************/ @@ -108,7 +109,7 @@ bool_t lhciMstExtConnDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) { LlExtInitParam_t initParam; LlExtInitScanParam_t initScanParam[LHCI_MAX_INIT_PHY]; - LlConnSpec_t connSpec[LHCI_MAX_INIT_PHY] = { 0 }; + LlConnSpec_t connSpec[LHCI_MAX_INIT_PHY] = { {0} }; lhciUnpackExtInitParam(&initParam, initScanParam, connSpec, pBuf); status = LlExtCreateConn(&initParam, initScanParam, connSpec); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn_priv.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn_priv.c index 9f5ec979e1..45484d76e2 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn_priv.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_conn_priv.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief HCI command module implementation file. + * \file + * \brief HCI command module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_enc_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_enc_master.c index aa0856068a..40974ae476 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_enc_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_enc_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief HCI command module implementation file. + * \file + * \brief HCI command module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_enc_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_enc_slave.c index bd162e8c09..6f2a1722cb 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_enc_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_enc_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief HCI command module implementation file. + * \file + * \brief HCI command module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_past.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_past.c new file mode 100644 index 0000000000..853533ff42 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_past.c @@ -0,0 +1,125 @@ +/* Copyright (c) 2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*************************************************************************************************/ +/*! + * \file + * \brief HCI command module implementation file. + */ +/*************************************************************************************************/ + +#include "lhci_int.h" +#include "hci_defs.h" +#include "ll_api.h" +#include "ll_defs.h" +#include "wsf_msg.h" +#include "wsf_math.h" +#include "util/bstream.h" +#include + +/*************************************************************************************************/ +/*! + * \brief Decode an HCI command packet. + * + * \param pHdr Decoded packet header. + * \param pBuf Packed HCI packet buffer. + * + * \return TRUE if opcode handled, FALSE otherwise. + */ +/*************************************************************************************************/ +bool_t lhciPastDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) +{ + uint8_t status = HCI_SUCCESS; + uint16_t connHandle = 0; + uint8_t paramLen = 0; + + switch (pHdr->opCode) + { + case HCI_OPCODE_LE_SET_PER_ADV_RCV_ENABLE: + { + uint16_t syncHandle; + uint8_t enable; + + BSTREAM_TO_UINT16(syncHandle, pBuf); + BSTREAM_TO_UINT8 (enable, pBuf); + status = LlSetPeriodicAdvRcvEnable(syncHandle, enable); + paramLen = LHCI_LEN_LE_SET_PER_ADV_RCV_ENABLE; + break; + } + case HCI_OPCODE_LE_PER_ADV_SYNC_TRANSFER: + { + uint16_t syncHandle; + uint16_t serviceData; + + BSTREAM_TO_UINT16(connHandle, pBuf); + BSTREAM_TO_UINT16(serviceData, pBuf); + BSTREAM_TO_UINT16(syncHandle, pBuf); + status = LlPeriodicAdvSyncTransfer(connHandle, serviceData, syncHandle); + paramLen = LHCI_LEN_LE_PER_ADV_SYNC_TRANSFER; + break; + } + case HCI_OPCODE_LE_PER_ADV_SET_INFO_TRANSFER: + { + uint16_t advHandle; + uint16_t serviceData; + + BSTREAM_TO_UINT16(connHandle, pBuf); + BSTREAM_TO_UINT16(serviceData, pBuf); + BSTREAM_TO_UINT8(advHandle, pBuf); + status = LlPeriodicAdvSetInfoTransfer(connHandle, serviceData, advHandle); + paramLen = LHCI_LEN_LE_PER_ADV_SET_INFO_TRANSFER; + break; + } + case HCI_OPCODE_LE_SET_PAST_PARAM: + { + uint8_t mode; + uint16_t skip; + uint16_t syncTimeout; + uint8_t cteType; + + BSTREAM_TO_UINT16(connHandle, pBuf); + BSTREAM_TO_UINT8(mode, pBuf); + BSTREAM_TO_UINT16(skip, pBuf); + BSTREAM_TO_UINT16(syncTimeout, pBuf); + BSTREAM_TO_UINT8(cteType, pBuf); + status = LlSetPeriodicAdvSyncTransParams(connHandle, mode, skip, syncTimeout, cteType); + paramLen = LHCI_LEN_LE_SET_PAST_PARAM; + break; + } + case HCI_OPCODE_LE_SET_DEFAULT_PAST_PARAM: + { + uint8_t mode; + uint16_t skip; + uint16_t syncTimeout; + uint8_t cteType; + + BSTREAM_TO_UINT8(mode, pBuf); + BSTREAM_TO_UINT16(skip, pBuf); + BSTREAM_TO_UINT16(syncTimeout, pBuf); + BSTREAM_TO_UINT8(cteType, pBuf); + status = LlSetDefaultPeriodicAdvSyncTransParams(mode, skip, syncTimeout, cteType); + paramLen = LHCI_LEN_LE_SET_DEFAULT_PAST_PARAM; + break; + } + + default: + return FALSE; /* exit dispatcher routine */ + } + + lhciConnSendCmdCmplEvt(pHdr, status, paramLen, NULL, connHandle); + + return TRUE; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_phy.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_phy.c index dc390045a6..50715e7220 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_phy.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_phy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief HCI command module implementation file. + * \file + * \brief HCI command module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_sc.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_sc.c index 84b1cd7643..449176283a 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_sc.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_sc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief HCI command module implementation file. + * \file + * \brief HCI command module implementation file. */ /*************************************************************************************************/ @@ -73,6 +74,17 @@ bool_t lhciScDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) break; } + case HCI_OPCODE_LE_GENERATE_DHKEY_V2: + { + uint8_t keyType; + uint8_t * pKeyType = pBuf + (2 * LL_ECC_KEY_LEN); + BSTREAM_TO_UINT8(keyType, pKeyType); + + status = LlGenerateDhKeyV2(pBuf, pBuf + LL_ECC_KEY_LEN, keyType); + paramLen = LHCI_LEN_CMD_STATUS_EVT; + break; + } + /* --- default --- */ default: diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs.c new file mode 100644 index 0000000000..afe91ec9fe --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs.c @@ -0,0 +1,302 @@ +/* Copyright (c) 2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*************************************************************************************************/ +/*! + * \file + * \brief Arm Ltd. vendor specific HCI command module implementation file. + */ +/*************************************************************************************************/ + +#include "lhci_int.h" +#include "hci_defs.h" +#include "bb_ble_api.h" +#include "ll_api.h" +#include "pal_sys.h" +#include "sch_api.h" +#include "wsf_assert.h" +#include "wsf_buf.h" +#include "wsf_cs.h" +#include "wsf_heap.h" +#include "wsf_math.h" +#include "wsf_msg.h" +#include "wsf_trace.h" +#include "util/bstream.h" +#include + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +/*! \brief Maximum number of pool items. */ +#define LHCI_MAX_POOL 5 + +/*! \brief Get Pool Statistics command complete event length. */ +#define LHCI_LEN_GET_POOL_STATS_EVT(n) (3 + (sizeof(WsfBufPoolStat_t) * (n))) + +/*! \brief Get System Statistics command complete event length. */ +/* stackWatermark(uint16_t) + palSysAssertCount(uint16_t) + + * freeMem (uint32_t) + usedMem(uint32_t) + + * connMax(uint16_t) + connCtxSize(uint16_t) + csWatermarkUsec(uint16_t) + llHandlerWatermarkUsec(uint16_t) + schHandlerWatermarkUsec(uint16_t) + lhciHandlerWatermarkUsec(uint16_t) + + * advSetMax(uint16_t) + advSetCtxSize(uint16_t) + + * extScanMax(uint16_t) + extScanCtxSize(uint16_t) + extInitMax(uint16_t) + extInitCtxSize(uint16_t) + perScanMax(uint16_t) + perScanCtxSize(uint16_t) + cigMax(uint16_t) + cigCtxSize(uint16_t) + cisMax(uint16_t) + cisCtxSize(uint16_t) */ + +#define LHCI_LEN_GET_SYS_STATS_EVT (2 * sizeof(uint16_t) + 2 * sizeof(uint32_t) + 6 * sizeof(uint16_t) + 2 * sizeof(uint16_t) + 10 * sizeof(uint16_t)) + +/************************************************************************************************** + Functions +**************************************************************************************************/ + +/*************************************************************************************************/ +/*! + * \brief Decode Cordio common vendor specific HCI command packet. + * + * \param pHdr Unpacked command header. + * \param pBuf Packed HCI packet buffer. + * + * Command processing for vendor specific commands. + * + * \return TRUE if opcode handled, FALSE otherwise. + */ +/*************************************************************************************************/ +bool_t lhciCommonVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) +{ + uint8_t status = HCI_SUCCESS; + uint8_t evtParamLen = 1; /* default is status field only */ + + /* Decode and consume command packet. */ + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_SET_OP_FLAGS: + { + uint32_t flags; + bool_t enable; + BSTREAM_TO_UINT32(flags, pBuf); + BSTREAM_TO_UINT8 (enable, pBuf); + + status = LlSetOpFlags(flags, enable); + break; + } + case LHCI_OPCODE_VS_SET_EVENT_MASK: + { + bool_t enable; + uint64_t mask; + BSTREAM_TO_UINT64(mask, pBuf); + + enable = !!(mask & ((uint64_t)LHCI_VS_EVT_MASK_SCAN_REPORT_EVT) << LHCI_BYTE_TO_BITS(0)); + LlScanReportEnable(enable); + + enable = !!(mask & ((uint64_t)LHCI_VS_EVT_MASK_DIAG_TRACE_EVT) << LHCI_BYTE_TO_BITS(0)); + LL_TRACE_ENABLE(enable); + break; + } + case LHCI_OPCODE_VS_SET_TX_TEST_ERR_PATT: + { + uint32_t pattern; + + BSTREAM_TO_UINT32(pattern, pBuf); + status = LlSetTxTestErrorPattern(pattern); + break; + } + case LHCI_OPCODE_VS_SET_HCI_SUP_CMD: + { + uint8_t byte, bit; + bool_t enable; + BSTREAM_TO_UINT8(byte, pBuf); + BSTREAM_TO_UINT8(bit, pBuf); + BSTREAM_TO_UINT8(enable, pBuf); + status = LlSetHciSupCmd(byte, bit, enable); + break; + } + + case LHCI_OPCODE_VS_SET_BD_ADDR: + LlSetBdAddr(pBuf); + break; + case LHCI_OPCODE_VS_GET_RAND_ADDR: + status = LlGetRandAddr(pBuf); + evtParamLen += sizeof(bdAddr_t); + break; + case LHCI_OPCODE_VS_SET_LOCAL_FEAT: + status = LlSetFeatures(pBuf); + break; + case LHCI_OPCODE_VS_SET_DIAG_MODE: + PalSysSetTrap(pBuf[0]); + break; + case LHCI_OPCODE_VS_GET_SYS_STATS: + evtParamLen += LHCI_LEN_GET_SYS_STATS_EVT; + break; + case LHCI_OPCODE_VS_GET_TEST_STATS: + evtParamLen += sizeof(BbBleDataPktStats_t); + break; + case LHCI_OPCODE_VS_GET_POOL_STATS: +#if WSF_BUF_STATS == TRUE + evtParamLen += LHCI_LEN_GET_POOL_STATS_EVT(WSF_MIN(WsfBufGetNumPool(), LHCI_MAX_POOL)); +#else + status = HCI_ERR_CMD_DISALLOWED; +#endif + break; + case LHCI_OPCODE_VS_GET_PDU_FILT_STATS: + evtParamLen += sizeof(BbBlePduFiltStats_t); + break; + + /* --- default --- */ + default: + return FALSE; /* exit dispatcher routine */ + } + + uint8_t *pEvtBuf; + + /* Encode and send command complete event packet. */ + if ((pEvtBuf = lhciAllocCmdCmplEvt(evtParamLen, pHdr->opCode)) != NULL) + { + pBuf = pEvtBuf; + pBuf += lhciPackCmdCompleteEvtStatus(pBuf, status); + + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_SET_OP_FLAGS: + case LHCI_OPCODE_VS_SET_EVENT_MASK: + case LHCI_OPCODE_VS_SET_BD_ADDR: + case LHCI_OPCODE_VS_GET_RAND_ADDR: + case LHCI_OPCODE_VS_SET_TX_TEST_ERR_PATT: + case LHCI_OPCODE_VS_SET_HCI_SUP_CMD: + /* no action */ + break; + + case LHCI_OPCODE_VS_SET_LOCAL_FEAT: + case LHCI_OPCODE_VS_SET_DIAG_MODE: + /* no action */ + break; + + case LHCI_OPCODE_VS_GET_SYS_STATS: + { + uint16_t stackWatermark = PalSysGetStackUsage(); + UINT16_TO_BSTREAM(pBuf, stackWatermark); + UINT16_TO_BSTREAM(pBuf, PalSysGetAssertCount()); + + uint32_t freeMem = WsfHeapCountAvailable(); + UINT32_TO_BSTREAM(pBuf, freeMem); + uint32_t usedMem = WsfHeapCountUsed(); + UINT32_TO_BSTREAM(pBuf, usedMem); + + uint16_t connMax = 0; + uint16_t connCtxSize; + LlGetConnContextSize((uint8_t *)&connMax, &connCtxSize); + UINT16_TO_BSTREAM(pBuf, connMax); + UINT16_TO_BSTREAM(pBuf, connCtxSize); + + #if (WSF_CS_STATS == TRUE) + uint16_t csWatermarkUsec = WsfCsStatsGetCsWaterMark(); + #else + uint16_t csWatermarkUsec = 0; + #endif + UINT16_TO_BSTREAM(pBuf, csWatermarkUsec); + + uint16_t llHandlerWatermarkUsec = LlStatsGetHandlerWatermarkUsec(); + UINT16_TO_BSTREAM(pBuf, llHandlerWatermarkUsec); + uint16_t schHandlerWatermarkUsec = SchStatsGetHandlerWatermarkUsec(); + UINT16_TO_BSTREAM(pBuf, schHandlerWatermarkUsec); + UINT16_TO_BSTREAM(pBuf, lhciHandlerWatermarkUsec); + + uint16_t advSetMax = 0; + uint16_t advSetCtxSize; + LlGetAdvSetContextSize((uint8_t *)&advSetMax, &advSetCtxSize); + UINT16_TO_BSTREAM(pBuf, advSetMax); + UINT16_TO_BSTREAM(pBuf, advSetCtxSize); + + uint16_t extScanMax = 0; + uint16_t extScanCtxSize; + LlGetExtScanContextSize((uint8_t *)&extScanMax, &extScanCtxSize); + UINT16_TO_BSTREAM(pBuf, extScanMax); + UINT16_TO_BSTREAM(pBuf, extScanCtxSize); + + uint16_t extInitMax = 0; + uint16_t extInitCtxSize; + LlGetExtInitContextSize((uint8_t *)&extInitMax, &extInitCtxSize); + UINT16_TO_BSTREAM(pBuf, extInitMax); + UINT16_TO_BSTREAM(pBuf, extInitCtxSize); + + uint16_t perScanMax = 0; + uint16_t perScanCtxSize; + LlGetPerScanContextSize((uint8_t *)&perScanMax, &perScanCtxSize); + UINT16_TO_BSTREAM(pBuf, perScanMax); + UINT16_TO_BSTREAM(pBuf, perScanCtxSize); + + uint16_t cigMax = 0; + uint16_t cigCtxSize; + LlGetCigContextSize((uint8_t *)&cigMax, &cigCtxSize); + UINT16_TO_BSTREAM(pBuf, cigMax); + UINT16_TO_BSTREAM(pBuf, cigCtxSize); + + uint16_t cisMax = 0; + uint16_t cisCtxSize; + LlGetCisContextSize((uint8_t *)&cisMax, &cisCtxSize); + UINT16_TO_BSTREAM(pBuf, cisMax); + UINT16_TO_BSTREAM(pBuf, cisCtxSize); + + break; + } + case LHCI_OPCODE_VS_GET_TEST_STATS: + { + BbBleDataPktStats_t stats; + BbBleGetTestStats(&stats); + memcpy(pBuf, (uint8_t *)&stats, sizeof(stats)); + break; + } +#if WSF_BUF_STATS == TRUE + case LHCI_OPCODE_VS_GET_POOL_STATS: + { + unsigned int i; + WsfBufPoolStat_t stats; + const uint8_t numPool = WSF_MIN(WsfBufGetNumPool(), LHCI_MAX_POOL); + + UINT8_TO_BSTREAM(pBuf, numPool); + + for (i = 0; i < numPool; i++) + { + WsfBufGetPoolStats(&stats, i); + UINT16_TO_BSTREAM(pBuf, stats.bufSize); + UINT8_TO_BSTREAM (pBuf, stats.numBuf); + UINT8_TO_BSTREAM (pBuf, stats.numAlloc); + UINT8_TO_BSTREAM (pBuf, stats.maxAlloc); + UINT16_TO_BSTREAM (pBuf, stats.maxReqLen); + } + break; + } +#endif + case LHCI_OPCODE_VS_GET_PDU_FILT_STATS: + { + BbBlePduFiltStats_t stats; + BbBleGetPduFiltStats(&stats); + memcpy(pBuf, (uint8_t *)&stats, sizeof(stats)); + break; + } + + /* --- default --- */ + + default: + break; + } + + lhciSendCmdCmplEvt(pEvtBuf); + } + + return TRUE; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_adv_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_adv_master.c new file mode 100644 index 0000000000..68e4b760ad --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_adv_master.c @@ -0,0 +1,104 @@ +/* Copyright (c) 2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*************************************************************************************************/ +/*! + * \file + * \brief Arm Ltd. vendor specific HCI command module implementation file. + */ +/*************************************************************************************************/ + +#include "lhci_int.h" +#include "hci_defs.h" +#include "bb_ble_api.h" +#include "ll_api.h" +#include "wsf_msg.h" +#include "util/bstream.h" +#include + +/*************************************************************************************************/ +/*! + * \brief Decode Arm Ltd. master advertising vendor specific HCI command packet. + * + * \param pHdr Unpacked command header. + * \param pBuf Packed HCI packet buffer. + * + * Command processing for vendor specific commands. + * + * \return TRUE if opcode handled, FALSE otherwise. + */ +/*************************************************************************************************/ +bool_t lhciMstScanVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) +{ + uint8_t status = HCI_SUCCESS; + uint8_t evtParamLen = 1; /* default is status field only */ + + /* Decode and consume command packet. */ + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_SET_SCAN_CH_MAP: + { + status = LlSetSetScanChanMap(pBuf[0]); + break; + } + + case LHCI_OPCODE_VS_GET_SCAN_STATS: + evtParamLen += sizeof(BbBleScanPktStats_t); + break; + + /* --- default --- */ + + default: + return FALSE; /* exit dispatcher routine */ + } + + uint8_t *pEvtBuf; + + /* Encode and send command complete event packet. */ + if ((pEvtBuf = lhciAllocCmdCmplEvt(evtParamLen, pHdr->opCode)) != NULL) + { + pBuf = pEvtBuf; + pBuf += lhciPackCmdCompleteEvtStatus(pBuf, status); + + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_SET_SCAN_CH_MAP: + /* no action */ + break; + + case LHCI_OPCODE_VS_GET_SCAN_STATS: + { + BbBleScanPktStats_t stats = {0}; + BbBleGetScanStats(&stats); + memcpy(pBuf, (uint8_t *)&stats, sizeof(stats)); + break; + } + + /* --- default --- */ + + default: + break; + } + + lhciSendCmdCmplEvt(pEvtBuf); + } + + return TRUE; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_adv_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_adv_master_ae.c new file mode 100644 index 0000000000..7dfb006c2f --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_adv_master_ae.c @@ -0,0 +1,105 @@ +/* Copyright (c) 2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*************************************************************************************************/ +/*! + * \file + * \brief Arm Ltd. vendor specific HCI command module implementation file. + */ +/*************************************************************************************************/ + +#include "lhci_int.h" +#include "hci_defs.h" +#include "bb_ble_api.h" +#include "ll_api.h" +#include "wsf_buf.h" +#include "wsf_math.h" +#include "wsf_msg.h" +#include "wsf_trace.h" +#include "util/bstream.h" +#include + +/*************************************************************************************************/ +/*! + * \brief Decode master extended advertising vendor specific HCI command packet. + * + * \param pHdr Unpacked command header. + * \param pBuf Packed HCI packet buffer. + * + * Command processing for vendor specific commands. + * + * \return TRUE if opcode handled, FALSE otherwise. + */ +/*************************************************************************************************/ +bool_t lhciMstExtScanVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) +{ + uint8_t status = HCI_SUCCESS; + uint8_t evtParamLen = 1; /* default is status field only */ + + /* Decode and consume command packet. */ + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_GET_AUX_SCAN_STATS: + evtParamLen += sizeof(BbBleAuxScanPktStats_t); + break; + + /* --- default --- */ + + default: + return FALSE; /* exit dispatcher routine */ + } + + uint8_t *pEvtBuf; + + /* Encode and send command complete event packet. */ + if ((pEvtBuf = lhciAllocCmdCmplEvt(evtParamLen, pHdr->opCode)) != NULL) + { + pBuf = pEvtBuf; + pBuf += lhciPackCmdCompleteEvtStatus(pBuf, status); + + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_GET_AUX_SCAN_STATS: + { + BbBleAuxScanPktStats_t stats; + BbBleGetAuxScanStats(&stats); + memcpy(pBuf, (uint8_t *)&stats, sizeof(stats)); + break; + } + + case LHCI_OPCODE_VS_GET_PER_SCAN_STATS: + { + BbBlePerScanPktStats_t stats; + BbBleGetPerScanStats(&stats); + memcpy(pBuf, (uint8_t *)&stats, sizeof(stats)); + break; + } + + /* --- default --- */ + + default: + break; + } + + lhciSendCmdCmplEvt(pEvtBuf); + } + + return TRUE; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_adv_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_adv_slave.c new file mode 100644 index 0000000000..eb35126598 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_adv_slave.c @@ -0,0 +1,102 @@ +/* Copyright (c) 2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*************************************************************************************************/ +/*! + * \file + * \brief Arm Ltd. vendor specific HCI command module implementation file. + */ +/*************************************************************************************************/ + +#include "lhci_int.h" +#include "hci_defs.h" +#include "bb_ble_api.h" +#include "ll_api.h" +#include "wsf_msg.h" +#include "util/bstream.h" +#include + +/*************************************************************************************************/ +/*! + * \brief Decode Arm Ltd. slave advertising vendor specific HCI command packet. + * + * \param pHdr Unpacked command header. + * \param pBuf Packed HCI packet buffer. + * + * Command processing for vendor specific commands. + * + * \return TRUE if opcode handled, FALSE otherwise. + */ +/*************************************************************************************************/ +bool_t lhciSlvAdvVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) +{ + uint8_t status = HCI_SUCCESS; + uint8_t evtParamLen = 1; /* default is status field only */ + + /* Decode and consume command packet. */ + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_SET_ADV_TX_PWR: + LlSetAdvTxPower(pBuf[0]); + break; + + case LHCI_OPCODE_VS_GET_ADV_STATS: + evtParamLen += sizeof(BbBleAdvPktStats_t); + break; + + /* --- default --- */ + + default: + return FALSE; /* exit dispatcher routine */ + } + + uint8_t *pEvtBuf; + + /* Encode and send command complete event packet. */ + if ((pEvtBuf = lhciAllocCmdCmplEvt(evtParamLen, pHdr->opCode)) != NULL) + { + pBuf = pEvtBuf; + pBuf += lhciPackCmdCompleteEvtStatus(pBuf, status); + + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_SET_ADV_TX_PWR: + /* no action */ + break; + + case LHCI_OPCODE_VS_GET_ADV_STATS: + { + BbBleAdvPktStats_t stats; + BbBleGetAdvStats(&stats); + memcpy(pBuf, (uint8_t *)&stats, sizeof(stats)); + break; + } + + /* --- default --- */ + + default: + break; + } + + lhciSendCmdCmplEvt(pEvtBuf); + } + + return TRUE; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_adv_slave_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_adv_slave_ae.c new file mode 100644 index 0000000000..ee08da829d --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_adv_slave_ae.c @@ -0,0 +1,139 @@ +/* Copyright (c) 2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*************************************************************************************************/ +/*! + * \file + * \brief Arm Ltd. vendor specific HCI command module implementation file. + */ +/*************************************************************************************************/ + +#include "lhci_int.h" +#include "hci_defs.h" +#include "bb_ble_api.h" +#include "ll_api.h" +#include "wsf_buf.h" +#include "wsf_math.h" +#include "wsf_msg.h" +#include "wsf_trace.h" +#include "util/bstream.h" +#include + +/*************************************************************************************************/ +/*! + * \brief Decode slave extended advertising vendor specific HCI command packet. + * + * \param pHdr Unpacked command header. + * \param pBuf Packed HCI packet buffer. + * + * Command processing for vendor specific commands. + * + * \return TRUE if opcode handled, FALSE otherwise. + */ +/*************************************************************************************************/ +bool_t lhciSlvExtAdvVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) +{ + uint8_t status = HCI_SUCCESS; + uint8_t evtParamLen = 1; /* default is status field only */ + + /* Variables used for VS_GET_PER_CHAN_MAP. */ + uint16_t advHandle = 0; + bool_t isAdv = FALSE; + + /* Decode and consume command packet. */ + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_SET_AUX_DELAY: + { + uint8_t handle; + uint32_t delayUsec; + handle = *pBuf++; + BSTREAM_TO_UINT32(delayUsec, pBuf); + status = LlSetAuxOffsetDelay(handle, delayUsec); + break; + } + case LHCI_OPCODE_VS_SET_EXT_ADV_FRAG_LEN: + status = LlSetExtAdvDataFragLen(pBuf[0], pBuf[1]); + break; + case LHCI_OPCODE_VS_SET_EXT_ADV_PHY_OPTS: + status = LlSetExtAdvTxPhyOptions(pBuf[0], pBuf[1], pBuf[2]); + break; + case LHCI_OPCODE_VS_GET_AUX_ADV_STATS: + evtParamLen += sizeof(BbBleAuxAdvPktStats_t); + break; + case LHCI_OPCODE_VS_SET_EXT_ADV_DEF_PHY_OPTS: + { + uint8_t phyOptions; + BSTREAM_TO_UINT8(phyOptions, pBuf); + LlSetDefaultExtAdvTxPhyOptions(phyOptions); + break; + } + case LHCI_OPCODE_VS_GET_PER_CHAN_MAP: + { + BSTREAM_TO_UINT16(advHandle, pBuf); + BSTREAM_TO_UINT8(isAdv, pBuf); + evtParamLen += HCI_CHAN_MAP_LEN; + break; + } + + /* --- default --- */ + + default: + return FALSE; /* exit dispatcher routine */ + } + + uint8_t *pEvtBuf; + + /* Encode and send command complete event packet. */ + if ((pEvtBuf = lhciAllocCmdCmplEvt(evtParamLen, pHdr->opCode)) != NULL) + { + pBuf = pEvtBuf; + pBuf += lhciPackCmdCompleteEvtStatus(pBuf, status); + + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_GET_AUX_ADV_STATS: + { + BbBleAuxAdvPktStats_t stats; + BbBleGetAuxAdvStats(&stats); + memcpy(pBuf, (uint8_t *)&stats, sizeof(stats)); + break; + } + + case LHCI_OPCODE_VS_GET_PER_CHAN_MAP: + { + /* Note: this function is also used by master. */ + uint64_t chM; + chM = LlGetPeriodicChanMap(advHandle, isAdv); + UINT40_TO_BSTREAM(pBuf, chM); + break; + } + + /* --- default --- */ + + default: + break; + } + + lhciSendCmdCmplEvt(pEvtBuf); + } + + return TRUE; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_conn.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_conn.c new file mode 100644 index 0000000000..598c87396a --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_conn.c @@ -0,0 +1,188 @@ +/* Copyright (c) 2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*************************************************************************************************/ +/*! + * \file + * \brief Arm Ltd. vendor specific HCI command module implementation file. + */ +/*************************************************************************************************/ + +#include "lhci_int.h" +#include "hci_defs.h" +#include "bb_ble_api.h" +#include "ll_api.h" +#include "wsf_msg.h" +#include "wsf_trace.h" +#include "util/bstream.h" +#include + +/*************************************************************************************************/ +/*! + * \brief Decode Arm Ltd. connection vendor specific HCI command packet. + * + * \param pHdr Unpacked command header. + * \param pBuf Packed HCI packet buffer. + * + * Command processing for vendor specific commands. + * + * \return TRUE if opcode handled, FALSE otherwise. + */ +/*************************************************************************************************/ +bool_t lhciConnVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) +{ + uint8_t status = HCI_SUCCESS; + uint8_t evtParamLen = 1; /* default is status field only */ + uint8_t peerMinUsedChan[LL_MAX_PHYS] = {2}; + + /* Decode and consume command packet. */ + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_GET_ACL_TEST_REPORT: + evtParamLen += sizeof(uint32_t) * 4; + break; + case LHCI_OPCODE_VS_ENA_ACL_SINK: + lhciCb.recvAclSink = pBuf[0]; + break; + case LHCI_OPCODE_VS_GENERATE_ACL: + { + uint16_t handle; + uint16_t pktLen; + uint8_t numPkts; + + BSTREAM_TO_UINT16(handle, pBuf); + BSTREAM_TO_UINT16(pktLen, pBuf); + numPkts = *pBuf++; + + lhciGenerateAcl(handle, pktLen, numPkts); + break; + } + case LHCI_OPCODE_VS_ENA_AUTO_GEN_ACL: + BSTREAM_TO_UINT16(lhciCb.genPktLen, pBuf); + break; + case LHCI_OPCODE_VS_SET_CONN_OP_FLAGS: + { + uint16_t handle; + uint32_t flags; + bool_t enable; + BSTREAM_TO_UINT16(handle, pBuf); + BSTREAM_TO_UINT32(flags, pBuf); + BSTREAM_TO_UINT8 (enable, pBuf); + + status = LlSetConnOpFlags(handle, flags, enable); + break; + } + case LHCI_OPCODE_VS_SET_CONN_TX_PWR: + { + uint16_t handle; + int8_t level; + BSTREAM_TO_UINT16(handle, pBuf); + BSTREAM_TO_UINT8 (level, pBuf); + status = LlSetTxPowerLevel(handle, level); + break; + } + + case LHCI_OPCODE_VS_GET_CONN_STATS: + evtParamLen += sizeof(BbBleDataPktStats_t); + break; + + case LHCI_OPCODE_VS_SET_LOCAL_MIN_USED_CHAN: + { + uint8_t phys; + int8_t powerThreshold; + uint8_t minUsedChan; + + BSTREAM_TO_UINT8(phys, pBuf); + BSTREAM_TO_INT8(powerThreshold, pBuf); + BSTREAM_TO_UINT8(minUsedChan, pBuf); + + status = LlSetLocalMinUsedChan(phys, powerThreshold, minUsedChan); + break; + } + + case LHCI_OPCODE_VS_GET_PEER_MIN_USED_CHAN: + { + uint16_t handle; + + BSTREAM_TO_UINT16(handle, pBuf); + + status = LlGetPeerMinUsedChan(handle, peerMinUsedChan); + evtParamLen += sizeof(peerMinUsedChan); + break; + } + + /* --- default --- */ + + default: + return FALSE; /* exit dispatcher routine */ + } + + uint8_t *pEvtBuf; + + /* Encode and send command complete event packet. */ + if ((pEvtBuf = lhciAllocCmdCmplEvt(evtParamLen, pHdr->opCode)) != NULL) + { + pBuf = pEvtBuf; + pBuf += lhciPackCmdCompleteEvtStatus(pBuf, status); + + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_GET_ACL_TEST_REPORT: + UINT32_TO_BSTREAM(pBuf, lhciCb.recvAclPktCnt); + UINT32_TO_BSTREAM(pBuf, lhciCb.recvAclOctetCnt); + UINT32_TO_BSTREAM(pBuf, lhciCb.genPktCnt); + UINT32_TO_BSTREAM(pBuf, lhciCb.genOctetCnt); + break; + + case LHCI_OPCODE_VS_SET_CONN_OP_FLAGS: + break; + + case LHCI_OPCODE_VS_SET_CONN_TX_PWR: + /* no action */ + break; + + case LHCI_OPCODE_VS_GET_CONN_STATS: + { + BbBleDataPktStats_t stats; + BbBleGetConnStats(&stats); + memcpy(pBuf, (uint8_t *)&stats, sizeof(stats)); + break; + } + + case LHCI_OPCODE_VS_SET_LOCAL_MIN_USED_CHAN: + /* no action */ + break; + + case LHCI_OPCODE_VS_GET_PEER_MIN_USED_CHAN: + memcpy(pBuf, peerMinUsedChan, sizeof(peerMinUsedChan)); + break; + + /* --- default --- */ + + default: + break; + } + + lhciSendCmdCmplEvt(pEvtBuf); + } + + return TRUE; + +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_conn_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_conn_master.c new file mode 100644 index 0000000000..c3dc808561 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_conn_master.c @@ -0,0 +1,88 @@ +/* Copyright (c) 2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*************************************************************************************************/ +/*! + * \file + * \brief Arm Ltd. vendor specific HCI command module implementation file. + */ +/*************************************************************************************************/ + +#include "lhci_int.h" +#include "hci_defs.h" +#include "ll_api.h" +#include "ll_defs.h" +#include "wsf_msg.h" +#include "util/bstream.h" +#include + +/*************************************************************************************************/ +/*! + * \brief Decode Arm Ltd. master connection vendor specific HCI command packet. + * + * \param pHdr Unpacked command header. + * \param pBuf Packed HCI packet buffer. + * + * Command processing for vendor specific commands. + * + * \return TRUE if opcode handled, FALSE otherwise. + */ +/*************************************************************************************************/ +bool_t lhciMstConnVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) +{ + uint8_t status = HCI_SUCCESS; + uint8_t evtParamLen = 1; /* default is status field only */ + + /* Decode and consume command packet. */ + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_SET_CHAN_MAP: + { + uint16_t handle; + BSTREAM_TO_UINT16(handle, pBuf); + status = LlSetChannelMap(handle, pBuf); + break; + } + + /* --- default --- */ + + default: + return FALSE; /* exit dispatcher routine */ + } + + uint8_t *pEvtBuf; + + /* Encode and send command complete event packet. */ + if ((pEvtBuf = lhciAllocCmdCmplEvt(evtParamLen, pHdr->opCode)) != NULL) + { + pBuf = pEvtBuf; + /* pBuf += */ lhciPackCmdCompleteEvtStatus(pBuf, status); + + switch (pHdr->opCode) + { + /* --- default --- */ + + default: + break; + } + + lhciSendCmdCmplEvt(pEvtBuf); + } + + return TRUE; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_enc_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_enc_slave.c new file mode 100644 index 0000000000..9c53df2916 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_enc_slave.c @@ -0,0 +1,95 @@ +/* Copyright (c) 2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*************************************************************************************************/ +/*! + * \file + * \brief Arm Ltd. vendor specific HCI command module implementation file. + */ +/*************************************************************************************************/ + +#include "lhci_int.h" +#include "hci_defs.h" +#include "ll_api.h" +#include "wsf_msg.h" +#include "util/bstream.h" +#include + +/*************************************************************************************************/ +/*! + * \brief Decode Arm Ltd. slave encryption vendor specific HCI command packet. + * + * \param pHdr Unpacked command header. + * \param pBuf Packed HCI packet buffer. + * + * Command processing for vendor specific commands. + * + * \return TRUE if opcode handled, FALSE otherwise. + */ +/*************************************************************************************************/ +bool_t lhciSlvEncVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) +{ + uint8_t status = HCI_SUCCESS; + uint8_t evtParamLen = 1; /* default is status field only */ + + /* Decode and consume command packet. */ + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_SET_ENC_MODE: + { + LlEncMode_t mode; + uint16_t handle; + BSTREAM_TO_UINT16(handle, pBuf); + + /* Force valid values. */ + mode.enaAuth = (pBuf[0]) ? TRUE : FALSE; + mode.nonceMode = (pBuf[1] == LL_NONCE_MODE_EVT_CNTR) ? + LL_NONCE_MODE_EVT_CNTR : LL_NONCE_MODE_PKT_CNTR; + + status = LlSetEncMode(handle, &mode); + break; + } + + /* --- default --- */ + + default: + return FALSE; /* exit dispatcher routine */ + } + + uint8_t *pEvtBuf; + + /* Encode and send command complete event packet. */ + if ((pEvtBuf = lhciAllocCmdCmplEvt(evtParamLen, pHdr->opCode)) != NULL) + { + pBuf = pEvtBuf; + /* pBuf += */ lhciPackCmdCompleteEvtStatus(pBuf, status); + + switch (pHdr->opCode) + { + + /* --- default --- */ + + default: + break; + } + + lhciSendCmdCmplEvt(pEvtBuf); + } + + return TRUE; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/ll/lhci_cmd_vs_ext.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_ext.c similarity index 92% rename from features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/ll/lhci_cmd_vs_ext.c rename to features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_ext.c index 1e4f494489..c9ced2ed7a 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/ll/lhci_cmd_vs_ext.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_ext.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Extended vendor specific HCI command module implementation file. + * \file + * \brief Extended vendor specific HCI command module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_sc.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_sc.c new file mode 100644 index 0000000000..27f831592f --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_cmd_vs_sc.c @@ -0,0 +1,97 @@ +/* Copyright (c) 2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*************************************************************************************************/ +/*! + * \file + * \brief Arm Ltd. vendor specific HCI command module implementation file. + */ +/*************************************************************************************************/ + +#include "lhci_int.h" +#include "hci_defs.h" +#include "ll_api.h" +#include "wsf_msg.h" +#include "util/bstream.h" +#include + +/*************************************************************************************************/ +/*! + * \brief Decode Arm Ltd. master secure connections vendor specific HCI command packet. + * + * \param pHdr Unpacked command header. + * \param pBuf Packed HCI packet buffer. + * + * Command processing for vendor specific commands. + * + * \return TRUE if opcode handled, FALSE otherwise. + */ +/*************************************************************************************************/ +bool_t lhciScVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) +{ + uint8_t status = HCI_SUCCESS; + uint8_t evtParamLen = 1; /* default is status field only */ + + /* Decode and consume command packet. */ + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_SET_P256_PRIV_KEY: + { + status = LlSetP256PrivateKey(pBuf); + break; + } + + case LHCI_OPCODE_VS_VALIDATE_PUB_KEY_MODE: + { + status = LlSetValidatePublicKeyMode(pBuf[0]); + break; + } + + /* --- default --- */ + + default: + return FALSE; /* exit dispatcher routine */ + } + + uint8_t *pEvtBuf; + + /* Encode and send command complete event packet. */ + if ((pEvtBuf = lhciAllocCmdCmplEvt(evtParamLen, pHdr->opCode)) != NULL) + { + pBuf = pEvtBuf; + /* pBuf += */ lhciPackCmdCompleteEvtStatus(pBuf, status); + + switch (pHdr->opCode) + { + /* --- extended device commands --- */ + + case LHCI_OPCODE_VS_SET_P256_PRIV_KEY: + /* no action */ + break; + + /* --- default --- */ + + default: + break; + } + + lhciSendCmdCmplEvt(pEvtBuf); + } + + return TRUE; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt.c index 659ad3007d..41358ad291 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief LL HCI event module implementation file. + * \file + * \brief LL HCI event module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_master.c index ec3e559e25..1dcd483302 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief LL HCI event module implementation file. + * \file + * \brief LL HCI event module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_master_ae.c index c953fdbba3..e5304111ba 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief LL HCI event module implementation file. + * \file + * \brief LL HCI event module implementation file. */ /*************************************************************************************************/ @@ -27,6 +28,7 @@ #include "wsf_msg.h" #include "wsf_math.h" #include "wsf_trace.h" +#include "wsf_assert.h" #include /************************************************************************************************** @@ -59,6 +61,8 @@ static uint8_t *lhciAllocExtAdvRptEvt(uint8_t evtCode, uint8_t paramLen) pEvtBuf += lhciPackEvtHdr(pEvtBuf, evtCode, paramLen); } + WSF_ASSERT(pEvtBuf); /* lhciCb.numAdvReport guarantee allocation always succeeds. */ + return pEvtBuf; } @@ -82,6 +86,8 @@ static uint8_t *lhciAllocPerAdvRptEvt(uint8_t evtCode, uint8_t paramLen) pEvtBuf += lhciPackEvtHdr(pEvtBuf, evtCode, paramLen); } + WSF_ASSERT(pEvtBuf); /* lhciCb.numAdvReport guarantee allocation always succeeds. */ + return pEvtBuf; } @@ -214,6 +220,31 @@ static void lhciPackPerAdvSyncLostEvt(uint8_t *pBuf, const LlPerAdvSyncLostInd_t UINT16_TO_BSTREAM(pBuf, pEvt->syncHandle); } +/*************************************************************************************************/ +/*! + * \brief Pack a periodic advertising sync transfer received event packet. + * + * \param pBuf Packed packet buffer. + * \param pEvt Periodic advertising sync transfer received event indication. + * + * \return None. + */ +/*************************************************************************************************/ +static void lhciPackPerSyncTrsfRcvdEvt(uint8_t *pBuf, const LlPerSyncTrsfRcvdInd_t *pEvt) +{ + UINT8_TO_BSTREAM (pBuf, HCI_LE_PER_SYNC_TRSF_RCVD_EVT); + UINT8_TO_BSTREAM (pBuf, pEvt->status); + UINT16_TO_BSTREAM(pBuf, pEvt->connHandle); + UINT16_TO_BSTREAM(pBuf, pEvt->serviceData); + UINT16_TO_BSTREAM(pBuf, pEvt->syncHandle); + UINT8_TO_BSTREAM (pBuf, pEvt->advSID); + UINT8_TO_BSTREAM (pBuf, pEvt->addrType); + BDA_TO_BSTREAM (pBuf, pEvt->addr); + UINT8_TO_BSTREAM (pBuf, pEvt->advPhy); + UINT16_TO_BSTREAM(pBuf, pEvt->perAdvInterval); + UINT8_TO_BSTREAM (pBuf, pEvt->advClkAccuracy); +} + /*************************************************************************************************/ /*! * \brief LL master advertising extension event handler. @@ -390,6 +421,20 @@ bool_t lhciMstExtScanEncodeEvtPkt(LlEvt_t *pEvt) } break; } + case LL_PER_SYNC_TRSF_RCVD_IND: + { + if ((lhciCb.leEvtMsk & ((uint64_t)(HCI_EVT_MASK_LE_PER_SYNC_TRSF_RCVT_EVT) << LHCI_BYTE_TO_BITS(2))) && + (lhciCb.evtMsk & ((uint64_t)(HCI_EVT_MASK_LE_META) << LHCI_BYTE_TO_BITS(7)))) + { + if ((pEvtBuf = lhciAllocEvt(HCI_LE_META_EVT, HCI_LEN_LE_PER_SYNC_TRSF_RCVT)) != NULL) + { + lhciPackPerSyncTrsfRcvdEvt(pEvtBuf, &pEvt->perASyncTrsfRcvdInd); + lhciSendEvt(pEvtBuf); + result = TRUE; + } + } + break; + } default: break; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_slave.c index 39a03cbeb6..e9c422f9c6 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief LL HCI event module implementation file. + * \file + * \brief LL HCI event module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_slave_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_slave_ae.c index a7395b6cdf..cb639890eb 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_slave_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_adv_slave_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief LL HCI event module implementation file. + * \file + * \brief LL HCI event module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn.c index c3cbbfbfa9..94d7167223 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief LL HCI event module implementation file. + * \file + * \brief LL HCI event module implementation file. */ /*************************************************************************************************/ @@ -228,6 +229,28 @@ static uint8_t lhciPackDataLenChangeEvt(uint8_t *pBuf, const LlDataLenChangeInd_ return len; } +/*************************************************************************************************/ +/*! + * \brief Request peer SCA complete event packet. + * + * \param pBuf Packed packet buffer. + * \param pEvt Peer SCA complete indication data. + * + * \return Packet length. + */ +/*************************************************************************************************/ +static uint8_t lhciPackReqPeerScaCompleteEvt(uint8_t *pBuf, const LlPeerScaCnf_t *pEvt) +{ + const uint8_t len = HCI_LEN_LE_PEER_SCA_CMPL; + + UINT8_TO_BSTREAM (pBuf, HCI_LE_REQ_PEER_SCA_CMPLT_EVT); + UINT8_TO_BSTREAM(pBuf, pEvt->status) + UINT16_TO_BSTREAM(pBuf, pEvt->connHandle); + UINT8_TO_BSTREAM(pBuf, pEvt->peerSca); + + return len; +} + /*************************************************************************************************/ /*! * \brief LL ACL send complete event handler. @@ -418,6 +441,16 @@ bool_t lhciConnEncodeEvtPkt(LlEvt_t *pEvt) } } break; + case LL_REQ_PEER_SCA_IND: + if ((lhciCb.leEvtMsk & ((uint64_t)(HCI_EVT_MASK_LE_PEER_SCA_CMPL_EVT) << LHCI_BYTE_TO_BITS(3))) && + (lhciCb.evtMsk & ((uint64_t)(HCI_EVT_MASK_LE_META) << LHCI_BYTE_TO_BITS(7)))) + { + if ((pEvtBuf = lhciAllocEvt(HCI_LE_META_EVT, HCI_LEN_LE_PEER_SCA_CMPL)) != NULL) + { + lhciPackReqPeerScaCompleteEvt(pEvtBuf, &pEvt->peerScaCnf); + } + } + break; default: break; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn_cs2.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn_cs2.c index 87e2f90cd0..632db665ee 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn_cs2.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn_cs2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief LL HCI event module implementation file. + * \file + * \brief LL HCI event module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn_master.c index 38e74fb78a..2f920b0145 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief LL HCI event module implementation file. + * \file + * \brief LL HCI event module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn_priv.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn_priv.c index 004ec06d41..3c76ec5fb7 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn_priv.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_conn_priv.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief LL HCI event module implementation file. + * \file + * \brief LL HCI event module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_enc_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_enc_master.c index 2c624446b2..e568b36724 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_enc_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_enc_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief LL HCI event module implementation file. + * \file + * \brief LL HCI event module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_enc_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_enc_slave.c index e82827d1c3..5cfdd10705 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_enc_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_enc_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief LL HCI event module implementation file. + * \file + * \brief LL HCI event module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_phy.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_phy.c index 012ceda800..fff4ba59a5 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_phy.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_phy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief LL HCI event module implementation file. + * \file + * \brief LL HCI event module implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_sc.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_sc.c index 12f2b930e2..b6901db08d 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_sc.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_sc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief LL HCI event module implementation file. + * \file + * \brief LL HCI event module implementation file. */ /*************************************************************************************************/ @@ -65,7 +66,7 @@ static uint8_t lhciPackGenerateDhKeyCmplEvt(uint8_t *pBuf, const LlGenerateDhKey const uint8_t len = HCI_LEN_LE_GEN_DHKEY_CMPL; UINT8_TO_BSTREAM (pBuf, HCI_LE_GENERATE_DHKEY_CMPL_EVT); - UINT8_TO_BSTREAM (pBuf, LL_SUCCESS); + UINT8_TO_BSTREAM (pBuf, pEvt->status); memcpy(pBuf, pEvt->dhKey, sizeof(pEvt->dhKey)); return len; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_vs.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_vs.c index ebe532acbf..733542406c 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_vs.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_evt_vs.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Vendor specific HCI event module implementation file. + * \file + * \brief Vendor specific HCI event module implementation file. */ /*************************************************************************************************/ @@ -30,7 +31,7 @@ Macros **************************************************************************************************/ -/* Note: ARM Ltd. vendor specific subevent code is 0xFFF0-0xFFFF. */ +/* Note: Arm Ltd. vendor specific subevent code is 0xFFF0-0xFFFF. */ #define LHCI_OPCODE_VS_SUBEVT_TRACE_MSG 0xFFF0 /*!< Trace message event. */ #define LHCI_OPCODE_VS_SUBEVT_SCAN_REPORT 0xFFF1 /*!< Scan report event. */ @@ -63,22 +64,26 @@ uint8_t LhciPackVsEvt(uint8_t *pBuf, uint16_t vsEvtCode) * \param pBuf Message. * \param len Message length. * - * \return None. + * \return TRUE if successful, FALSE otherwise. */ /*************************************************************************************************/ -void LhciVsEncodeTraceMsgEvtPkt(uint8_t *pBuf, uint8_t len) +bool_t LhciVsEncodeTraceMsgEvtPkt(const uint8_t *pBuf, uint32_t len) { - uint8_t *pPkt; uint8_t *pEvtBuf; + uint8_t *pPkt = lhciAllocEvt(HCI_VENDOR_SPEC_EVT, LHCI_LEN_VS_EVT + len); - if ((pPkt = lhciAllocEvt(HCI_VENDOR_SPEC_EVT, LHCI_LEN_VS_EVT + len)) != NULL) + if (pPkt == NULL) { - pEvtBuf = pPkt; - pEvtBuf += lhciPackVsEvt(pEvtBuf, LHCI_OPCODE_VS_SUBEVT_TRACE_MSG); - memcpy(pEvtBuf, pBuf, len); - - lhciSendEvt(pPkt); + return FALSE; } + + pEvtBuf = pPkt; + pEvtBuf += lhciPackVsEvt(pEvtBuf, LHCI_OPCODE_VS_SUBEVT_TRACE_MSG); + memcpy(pEvtBuf, pBuf, len); + + lhciSendEvt(pPkt); + + return TRUE; } /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init.c index a2d6c3f59f..78e8087f3c 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_master.c index 140fd2bf70..d9ff608a09 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_master_ae.c index cc21863951..41b544f4db 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_priv.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_priv.c index be20e49542..118f4c8a0b 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_priv.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_priv.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_slave.c index 9e203988b6..014e57cd9d 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_slave_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_slave_ae.c index e229048ef6..78e9952a03 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_slave_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_adv_slave_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn.c index 969d3b597d..1213ada0d2 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_cs2.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_cs2.c index f233ab8cd2..4e9f26adfc 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_cs2.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_cs2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_master.c index 7af9e81eb7..9647e002d7 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_master_ae.c index a5e9e6ddc8..bdbdd46eb3 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_priv.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_priv.c index 39bd91e249..7aed705f28 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_priv.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_conn_priv.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_enc_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_enc_master.c index eea821b3c8..fa02e5a296 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_enc_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_enc_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_enc_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_enc_slave.c index a251cd3d82..16fe852ab4 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_enc_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_enc_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/platform_154_api.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_past.c similarity index 50% rename from features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/platform_154_api.h rename to features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_past.c index af86f51d01..760b729943 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/platform_154_api.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_past.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,36 +16,29 @@ /*************************************************************************************************/ /*! - * \brief Platform interface file: mac154-specific. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ -#ifndef PLATFORM_154_API_H -#define PLATFORM_154_API_H - -#include "wsf_types.h" - -/************************************************************************************************** - Type Definitions -**************************************************************************************************/ - -/************************************************************************************************** - Global Variables -**************************************************************************************************/ - -/************************************************************************************************** - Function Declarations -**************************************************************************************************/ +#include "lhci_int.h" +#include "lctr_api.h" /*************************************************************************************************/ /*! - * \brief Load extended 802.15.4 MAC device address. - * - * \param pDevAddr Return buffer for address. + * \brief Initialize LL HCI subsystem for PAST(Periodic advertising sync transfer) features. * * \return None. + * + * This function initializes the LL HCI subsystem for PAST features commands. It is + * typically called once upon system initialization. */ /*************************************************************************************************/ -void PlatformLoadExtMac154Address(uint8_t *pDevAddr); - -#endif /* PLATFORM_154_API_H */ +void LhciPastInit(void) +{ + if (pLctrRtCfg->btVer >= LL_VER_BT_CORE_SPEC_5_1) + { + lhciCmdTbl[LHCI_MSG_PAST] = lhciPastDecodeCmdPkt; + lhciEvtTbl[LHCI_MSG_PAST] = NULL; + } +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_phy.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_phy.c index 7dd995a0f4..fbf9677710 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_phy.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_phy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_sc.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_sc.c index 305a5cfe54..5defba4d40 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_sc.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_init_sc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_int.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_int.h index c38126053c..7efadec410 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_int.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_int.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief LL HCI main module interface file. + * \file + * \brief LL HCI main module interface file. */ /*************************************************************************************************/ @@ -132,6 +133,22 @@ extern "C" { #define LHCI_LEN_LE_SET_DEF_PHY_EVT 1 /*!< LE set default PHY command complete event length. */ #define LHCI_LEN_LE_ENHANCED_RECEIVER_TEST_EVT 1 /*!< LE enhanced receiver test command complete event length. */ #define LHCI_LEN_LE_ENHANCED_TRANSMITTER_TEST_EVT 1 /*!< LE enhanced transmitter test command complete event length. */ +/* New in version 5.1 */ +#define LHCI_LEN_LE_SET_PER_ADV_RCV_ENABLE 1 /*!< LE set periodic advertising receive enable command complete event length. */ +#define LHCI_LEN_LE_PER_ADV_SYNC_TRANSFER 3 /*!< LE periodic advertising sync transfer command complete event length. */ +#define LHCI_LEN_LE_PER_ADV_SET_INFO_TRANSFER 3 /*!< LE periodic advertising set info transfer command complete event length. */ +#define LHCI_LEN_LE_SET_PAST_PARAM 1 /*!< LE set periodic advertising sync transfer parameters command complete event length. */ +#define LHCI_LEN_LE_SET_DEFAULT_PAST_PARAM 1 /*!< LE set default periodic advertising sync transfer parameters command complete event length. */ +#define LHCI_LEN_LE_MODIFY_SCA_EVT 1 /*!< LE Modify sleep clock accuracy event length. */ +/* New in version Milan */ +#define LHCI_LEN_LE_READ_ISO_BUF_SIZE 4 /*!< LE read ISO buffer size command complete event length. */ +#define LHCI_LEN_LE_REMOVE_CIG 1 /*!< LE remove CIG. */ +#define LHCI_LEN_LE_REJECT_CIS_REQ 1 /*!< LE reject CIS request. */ +#define LHCI_LEN_LE_SETUP_ISO_DATA_PATH 1 /*!< LE setup ISO data path. */ +#define LHCI_LEN_LE_REMOVE_ISO_DATA_PATH 1 /*!< LE remove ISO data path. */ +#define LHCI_LEN_LE_ISO_TX_TEST 1 /*!< LE ISO Tx Test. */ +#define LHCI_LEN_LE_ISO_RX_TEST 1 /*!< LE ISO Rx Test. */ +#define LHCI_LEN_LE_ISO_READ_TEST_COUNTER 13 /*!< LE ISO read test counter. */ /*! \brief Mandatory event mask. */ #define LHCI_DEF_EVT_MASK UINT64_C(0x00001FFFFFFFFFFF); @@ -156,7 +173,7 @@ extern "C" { /*! \brief Indicate command status event shall be returned. */ #define LHCI_LEN_CMD_STATUS_EVT 0xFF -/* Cordio vendor specific OCF range is 0x3E0-0x3FF. */ +/* Cordio vendor specific OCF range is 0x3C0-0x3FF */ #define LHCI_OPCODE_VS_SET_SCAN_CH_MAP HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3E0) /*!< Set Scan Channel Map opcode. */ #define LHCI_OPCODE_VS_SET_EVENT_MASK HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3E1) /*!< Set Vendor Specific Event Mask opcode. */ #define LHCI_OPCODE_VS_SET_RSRC_MGR_MODE HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3E2) /*!< DEPRECATED. */ @@ -166,9 +183,13 @@ extern "C" { #define LHCI_OPCODE_VS_SET_TX_TEST_ERR_PATT HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3E6) /*!< Set Tx Test Error Pattern opcode. */ #define LHCI_OPCODE_VS_SET_CONN_OP_FLAGS HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3E7) /*!< Set Connection Operational Flags opcode. */ #define LHCI_OPCODE_VS_SET_P256_PRIV_KEY HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3E8) /*!< Set P-256 Private Key opcode. */ +#define LHCI_OPCODE_VS_GET_PER_CHAN_MAP HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3DE) /*!< Get channel map of periodic scan/adv. */ +#define LHCI_OPCODE_VS_SET_HCI_SUP_CMD HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3DF) /*!< Set Hci supported commands. */ #define LHCI_OPCODE_VS_GET_ACL_TEST_REPORT HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3E9) /*!< Get ACL Test Report opcode. */ #define LHCI_OPCODE_VS_SET_LOCAL_MIN_USED_CHAN HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3EA) /*!< Set local minimum number of used channels. */ #define LHCI_OPCODE_VS_GET_PEER_MIN_USED_CHAN HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3EB) /*!< Get peer minimum number of used channels. */ +#define LHCI_OPCODE_VS_VALIDATE_PUB_KEY_MODE HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3EC) /*!< Set validate public key mode between ALT1 and ALT2. */ + #define LHCI_OPCODE_VS_SET_BD_ADDR HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3F0) /*!< Set BD address opcode. */ #define LHCI_OPCODE_VS_GET_RAND_ADDR HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3F1) /*!< Get Random Address opcode. */ #define LHCI_OPCODE_VS_SET_LOCAL_FEAT HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3F2) /*!< Set Local Feature opcode. */ @@ -192,11 +213,19 @@ extern "C" { #define LHCI_OPCODE_VS_SET_EXT_ADV_FRAG_LEN HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3D1) /*!< Set extended advertising data fragmentation length. */ #define LHCI_OPCODE_VS_SET_EXT_ADV_PHY_OPTS HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3D2) /*!< Set extended advertising PHY options. */ #define LHCI_OPCODE_VS_SET_EXT_ADV_DEF_PHY_OPTS HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3D3) /*!< Set extended advertising default PHY options. */ +#define LHCI_OPCODE_VS_SET_EXT_SCAN_PHY_OPTS HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3D4) /*!< Set extended scanning default PHY options. */ +#define LHCI_OPCODE_VS_GENERATE_ISO HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3D5) /*!< Generate ISO Packets opcode. */ +#define LHCI_OPCODE_VS_GET_ISO_TEST_REPORT HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3D6) /*!< Get ISO Test Report opcode. */ +#define LHCI_OPCODE_VS_ENA_ISO_SINK HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3D7) /*!< Enable ISO Packet Sink opcode. */ +#define LHCI_OPCODE_VS_ENA_AUTO_GEN_ISO HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3D8) /*!< Enable Auto Generate ISO Packets opcode. */ +#define LHCI_OPCODE_VS_GET_CIS_STATS HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3D9) /*!< Get ISO Connection Statistics opcode. */ #define LHCI_OPCODE_VS_GET_AUX_ADV_STATS HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3DA) /*!< Get Auxiliary Advertising Statistics opcode. */ #define LHCI_OPCODE_VS_GET_AUX_SCAN_STATS HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3DB) /*!< Get Auxiliary Scanning Statistics opcode. */ #define LHCI_OPCODE_VS_GET_PER_SCAN_STATS HCI_OPCODE(HCI_OGF_VENDOR_SPEC, 0x3DC) /*!< Get Periodic Scanning Statistics opcode. */ + + /* Vendor specific event masks. */ #define LHCI_VS_EVT_MASK_SCAN_REPORT_EVT 0x01 /*!< (Byte 0) VS event bit, scan report. */ #define LHCI_VS_EVT_MASK_DIAG_TRACE_EVT 0x02 /*!< (Byte 0) VS event bit, diagnostic tracing. */ @@ -220,6 +249,10 @@ enum LHCI_MSG_PER_ADV, /*!< Periodic advertising command handler type. */ LHCI_MSG_SC, /*!< Secure connections command handler type. */ LHCI_MSG_PHY, /*!< PHY features command handler type. */ + LHCI_MSG_PAST, /*!< Periodic advertising sync transfer command handler type. */ + LHCI_MSG_CIS_MST, /*!< Connected isochronous stream master features command handler type. */ + LHCI_MSG_CIS_SLV, /*!< Connected isochronous stream slave features command handler type. */ + LHCI_MSG_ISO, /*!< Isochronous features command handler type. */ LHCI_MSG_VS_EXT, /*!< Extended vendor specific command handler type. */ LHCI_MSG_TESTER, /*!< Tester vendor specific command handler type. */ LHCI_MSG_TOTAL /*!< Total number of command handlers. */ @@ -232,6 +265,7 @@ enum LHCI_EVT_CMD_RCVD = (1 << 1), /*!< HCI command packet received. */ LHCI_EVT_SEND_CMPL = (1 << 2), /*!< HCI event packet send completion. */ LHCI_EVT_HW_ERR = (1 << 3), /*!< HCI hardware error. */ + LHCI_EVT_ISO_RCVD = (1 << 4), /*!< HCI ISO packet received. */ }; /*! \brief Event handler call signature. */ @@ -240,6 +274,9 @@ typedef bool_t (*lhciEvtHandler_t)(LlEvt_t *pEvt); /*! \brief Service ACL call signature. */ typedef uint8_t *(*lhciServiceAcl_t)(void); +/*! \brief Service SCO call signature. */ +typedef uint8_t *(*lhciServiceIso_t)(void); + /*! \brief Control block of the LL HCI subsystem (persists with resets). */ typedef struct { @@ -248,6 +285,7 @@ typedef struct wsfQueue_t aclQ; /*!< ACL queue. */ wsfQueue_t cmdQ; /*!< Command queue. */ wsfQueue_t evtQ; /*!< Event queue. */ + wsfQueue_t isoQ; /*!< ISO queue. */ bool_t evtTrPending; /*!< Event transport in progress. */ } lhciPersistCb_t; @@ -270,6 +308,20 @@ typedef struct uint32_t genPktCnt; /*!< Generate ACL packet count. */ uint32_t genOctetCnt; /*!< Generate ACL octet count. */ + bool_t recvIsoSink; /*!< Receive ISO sink. */ + uint32_t recvIsoPktCnt; /*!< Receive ISO packet count. */ + uint32_t recvIsoOctetCnt; /*!< Receive Iso octet count. */ + bool_t isoGenEnaFlag; /*!< Generate ISO enable flag. */ + uint8_t isoGenPldCnt; /*!< Generate ISO packet fill value. */ + uint16_t isoGenPktLen; /*!< Generate ISO packet length (0 to disable). */ + uint32_t isoGenPktCnt; /*!< Generate ISO packet count. */ + uint32_t isoGenOctetCnt; /*!< Generate ISO octet count. */ + + bool_t isoTxTest; /*!< TRUE if ISO Tx test is enabled. */ + bool_t isoRxTest; /*!< TRUE if ISO Rx test is enabled. */ + uint8_t isoTxTestPlLen; /*!< ISO Tx test payload length. */ + uint8_t isoRxTestPlLen; /*!< ISO Rx test payload length. */ + uint8_t numAdvReport; /*!< Number of pending advertising reports. */ } lhciCb_t; @@ -286,6 +338,9 @@ extern lhciEvtHandler_t lhciEvtTbl[LHCI_MSG_TOTAL]; /*! \brief Receive pending handler. */ extern lhciServiceAcl_t lhciServiceAcl; +/*! \brief Receive pending handler. */ +extern lhciServiceIso_t lhciServiceIso; + /* Persistent control block */ extern lhciPersistCb_t lhciPersistCb; @@ -306,6 +361,7 @@ void lhciReset(void); void lhciRecv(uint8_t type, uint8_t *pBuf); void lhciSendComplete(uint8_t type, uint8_t *pBuf); bool_t lhciService(uint8_t *pType, uint16_t *pLen, uint8_t **pBuf); +void lhciSendIsoComplete(uint8_t type, uint8_t *pBuf); void lhciSendHwError(uint8_t code); /* Handlers */ @@ -315,6 +371,11 @@ uint8_t *lhciRecvAcl(void); void lhciAclRecvPending(uint16_t handle, uint8_t numBufs); void lhciGenerateAcl(uint16_t handle, uint16_t pktLen, uint8_t numPkts); +void lhciIsoSendComplete(uint16_t handle, uint8_t numBufs); +uint8_t *lhciRecvIso(void); +void lhciIsoRecvPending(uint16_t handle, uint8_t numBufs); +void lhciGenerateIso(uint16_t handle, uint16_t pktLen, uint8_t numPkts); + /* Command parser */ bool_t lhciCommonDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); bool_t lhciConnDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); @@ -330,6 +391,11 @@ bool_t lhciPrivAdvDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); bool_t lhciPrivConnDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); bool_t lhciScDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); bool_t lhciPhyDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); +bool_t lhciPastDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); +bool_t lhciMstCisDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); +bool_t lhciSlvCisDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); +bool_t lhciIsoDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); + bool_t lhciCommonVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); bool_t lhciConnVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); bool_t lhciMstConnVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); @@ -340,6 +406,7 @@ bool_t lhciScVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); bool_t lhciMstExtScanVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); bool_t lhciSlvExtAdvVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); bool_t lhciVsExtDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); +bool_t lhciIsoVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf); /* Event builders */ void lhciSendCmdStatusEvt(LhciHdr_t *pCmdHdr, uint8_t status); @@ -355,11 +422,17 @@ bool_t lhciSlvEncEncodeEvtPkt(LlEvt_t *pEvt); bool_t lhciPrivConnEncodeEvtPkt(LlEvt_t *pEvt); bool_t lhciScEncodeEvtPkt(LlEvt_t *pEvt); bool_t lhciPhyEncodeEvtPkt(LlEvt_t *pEvt); +bool_t lhciMstCisEncodeEvtPkt(LlEvt_t *pEvt); +bool_t lhciSlvCisEncodeEvtPkt(LlEvt_t *pEvt); +bool_t lhciIsoEncodeEvtPkt(LlEvt_t *pEvt); + + bool_t lhciSlvVsStdEncodeEvtPkt(LlEvt_t *pEvt); /* Events */ uint8_t *lhciAllocEvt(uint8_t evtCode, uint8_t paramLen); uint8_t *lhciAllocCmdCmplEvt(uint8_t paramLen, uint16_t opCode); +void lhciConnSendCmdCmplEvt(LhciHdr_t *pCmdHdr, uint8_t status, uint8_t paramLen, uint8_t *pParam, uint16_t handle); /* Command packet. */ uint8_t lhciUnpackConnSpec(LlConnSpec_t *pConnSpec, const uint8_t *pBuf); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_main.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_main.c index 2aeccccd65..5a1bf4f762 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_main.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lhci/lhci_main.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. + * \file + * \brief Link layer (LL) Host Controller Interface (HCI) initialization implementation file. */ /*************************************************************************************************/ @@ -25,7 +26,7 @@ #include "hci_defs.h" #include "ll_api.h" #include "bb_api.h" -#include "bb_drv.h" +#include "pal_bb.h" #include "wsf_assert.h" #include "wsf_msg.h" #include "util/bstream.h" @@ -44,6 +45,9 @@ lhciEvtHandler_t lhciEvtTbl[LHCI_MSG_TOTAL]; /*! \brief Receive pending handler. */ lhciServiceAcl_t lhciServiceAcl; +/*! \brief Receive pending handler. */ +lhciServiceIso_t lhciServiceIso; + /*! \brief Persistent control block */ lhciPersistCb_t lhciPersistCb; @@ -89,7 +93,7 @@ void LhciHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg) uint32_t startTime; uint32_t endTime; - startTimeValid = BbDrvGetTimestamp(&startTime); + startTimeValid = PalBbGetTimestamp(&startTime); if (event & LHCI_EVT_ACL_RCVD) { @@ -161,7 +165,7 @@ void LhciHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg) } if (startTimeValid && - BbDrvGetTimestamp(&endTime)) + PalBbGetTimestamp(&endTime)) { uint32_t durUsec = BB_TICKS_TO_US(endTime - startTime); if (lhciHandlerWatermarkUsec < durUsec) @@ -195,6 +199,11 @@ void lhciRecv(uint8_t type, uint8_t *pBuf) WsfSetEvent(lhciPersistCb.handlerId, LHCI_EVT_CMD_RCVD); break; + case CHCI_TR_TYPE_ISO: + WsfMsgEnq(&lhciPersistCb.isoQ, 0, pBuf); + WsfSetEvent(lhciPersistCb.handlerId, LHCI_EVT_ISO_RCVD); + break; + default: WsfMsgFree(pBuf); break; @@ -242,7 +251,6 @@ void lhciSendComplete(uint8_t type, uint8_t *pBuf) break; default: - WSF_ASSERT(FALSE); break; } @@ -281,6 +289,23 @@ bool_t lhciService(uint8_t *pType, uint16_t *pLen, uint8_t **pBuf) } else { + if (lhciServiceIso != NULL) + { + /* Additionally check if ISO data needs servicing. */ + if ((pBufTemp = lhciServiceIso()) != NULL) + { + + len = pBufTemp[2] + HCI_ISO_HDR_LEN; + lhciPersistCb.evtTrPending = TRUE; + + *pType = CHCI_TR_TYPE_ISO; + *pLen = len; + *pBuf = pBufTemp; + + return TRUE; + } + } + if (lhciServiceAcl != NULL) { /* Additionally check if ACL data needs servicing. */ @@ -334,3 +359,196 @@ void lhciReset(void) lhciCb.evtMskPg2 = LHCI_DEF_EVT_PG2_MASK; lhciCb.leEvtMsk = LHCI_DEF_LE_EVT_MASK; } + +/*************************************************************************************************/ +/*! + * \brief Set default Hci supported cmds. + * + * \return None. + * + * This function is called at reset by lmgr. + */ +/*************************************************************************************************/ +void LhciSetDefaultHciSupCmd(uint8_t *pBuf) +{ + pBuf[5] = HCI_SUP_SET_EVENT_MASK | /* mandatory */ + HCI_SUP_RESET; /* mandatory */ + pBuf[14] = HCI_SUP_READ_LOCAL_VER_INFO | /* mandatory */ + HCI_SUP_READ_LOCAL_SUP_FEAT; /* mandatory */ + pBuf[15] = HCI_SUP_READ_BD_ADDR; /* mandatory */ + pBuf[22] = HCI_SUP_SET_EVENT_MASK_PAGE2; /* optional or LE ping */ + pBuf[25] = HCI_SUP_LE_SET_EVENT_MASK | /* mandatory */ + HCI_SUP_LE_READ_BUF_SIZE | /* mandatory */ + HCI_SUP_LE_READ_LOCAL_SUP_FEAT | /* mandatory */ + HCI_SUP_LE_SET_RAND_ADDR; /* Tx device */ + pBuf[26] = HCI_SUP_LE_READ_WHITE_LIST_SIZE | /* mandatory */ + HCI_SUP_LE_CLEAR_WHITE_LIST; /* mandatory */ + pBuf[27] = HCI_SUP_LE_ADD_DEV_WHITE_LIST | /* mandatory */ + HCI_SUP_LE_REMOVE_DEV_WHITE_LIST | /* mandatory */ + HCI_SUP_LE_RAND; /* LL encryption or optional */ + pBuf[28] = HCI_SUP_LE_READ_SUP_STATES | /* mandatory (4.1+) */ + HCI_SUP_LE_RECEIVER_TEST | /* Rx device */ + HCI_SUP_LE_TRANSMITTER_TEST | /* Tx device */ + HCI_SUP_LE_TEST_END; /* mandatory */ + pBuf[38] = HCI_SUP_LE_READ_TX_POWER; /* mandatory (5.0) */ + + if (lhciCmdTbl[LHCI_MSG_CONN]) + { + pBuf[0] |= HCI_SUP_DISCONNECT; /* Master or slave */ + pBuf[2] |= HCI_SUP_READ_REMOTE_VER_INFO; /* Master or slave */ + pBuf[10] |= HCI_SUP_READ_TX_PWR_LVL; /* Master or slave */ + pBuf[15] |= HCI_SUP_READ_RSSI; /* Master or slave */ + + pBuf[27] |= HCI_SUP_LE_CONN_UPDATE | /* Master role or initiating conn param req */ + HCI_SUP_LE_READ_CHAN_MAP | /* Master or slave */ + HCI_SUP_LE_READ_REMOTE_FEAT; /* Master or optional */ + + pBuf[33] |= HCI_SUP_LE_SET_DATA_LEN | /* Data length extensions */ + HCI_SUP_LE_READ_DEF_DATA_LEN | /* Data length extensions */ + HCI_SUP_LE_REM_CONN_PARAM_REQ_REPL | /* Accepting conn param req */ + HCI_SUP_LE_REM_CONN_PARAM_REQ_NEG_REPL; /* Accepting conn param req */ + pBuf[34] |= HCI_SUP_LE_WRITE_DEF_DATA_LEN; /* Data length extensions */ + pBuf[35] |= HCI_SUP_LE_READ_MAX_DATA_LEN; /* Data length extensions */ + } + + if (lhciCmdTbl[LHCI_MSG_SCAN]) /* i.e. master */ + { + pBuf[26] |= HCI_SUP_LE_SET_SCAN_PARAM | /* Rx device */ + HCI_SUP_LE_SET_SCAN_ENABLE; /* Rx device */ + + if (lhciCmdTbl[LHCI_MSG_CONN]) + { + pBuf[26] |= HCI_SUP_LE_CREATE_CONN | /* Master role */ + HCI_SUP_LE_CREATE_CONN_CANCEL; /* Master role */ + pBuf[27] |= HCI_SUP_LE_SET_HOST_CHAN_CLASS; /* Master role */ + } + } + + if (lhciCmdTbl[LHCI_MSG_ADV]) /* i.e. slave */ + { + pBuf[25] |= HCI_SUP_LE_SET_ADV_PARAM | /* Tx device */ + HCI_SUP_LE_READ_ADV_TX_POWER | /* Tx device */ + HCI_SUP_LE_SET_ADV_DATA; /* Tx device */ + pBuf[26] |= HCI_SUP_LE_SET_SCAN_RESP_DATA | /* Tx + Rx device */ + HCI_SUP_LE_SET_ADV_ENABLE; /* Tx device */ + } + + if (lhciCmdTbl[LHCI_MSG_ENC] && + lhciCmdTbl[LHCI_MSG_CONN]) + { + pBuf[27] |= HCI_SUP_LE_ENCRYPT; /* LL encryption */ + pBuf[28] |= HCI_SUP_LE_LTK_REQ_REPL | /* LL encryption + slave */ + HCI_SUP_LE_LTK_REQ_NEG_REPL | /* LL encryption + slave */ + HCI_SUP_LE_START_ENCRYPTION; /* LL encryption + master */ + pBuf[32] |= HCI_SUP_READ_AUTH_PAYLOAD_TO | /* LE ping */ + HCI_SUP_WRITE_AUTH_PAYLOAD_TO; /* LE ping */ + } + + if (lhciCmdTbl[LHCI_MSG_PRIV]) + { + pBuf[34] |= HCI_SUP_LE_ADD_DEV_RES_LIST_EVT | /* LE privacy */ + HCI_SUP_LE_REMOVE_DEV_RES_LIST | /* LE privacy */ + HCI_SUP_LE_CLEAR_RES_LIST | /* LE privacy */ + HCI_SUP_LE_READ_RES_LIST_SIZE; /* LE privacy */ + pBuf[35] |= HCI_SUP_LE_SET_ADDR_RES_ENABLE | /* LE privacy */ + HCI_SUP_LE_SET_RES_PRIV_ADDR_TO; /* LE privacy */ + pBuf[39] |= HCI_SUP_LE_SET_PRIVACY_MODE; /* LE privacy */ + + if (lhciCmdTbl[LHCI_MSG_CONN]) + { + pBuf[34] |= HCI_SUP_LE_READ_PEER_RES_ADDR; /* LE privacy + master or slave */ + pBuf[35] |= HCI_SUP_LE_READ_LOCAL_RES_ADDR; /* LE privacy + master or slave */ + } + } + + if (lhciCmdTbl[LHCI_MSG_SC]) + { + pBuf[34] |= HCI_SUP_LE_READ_LOCAL_P256_PUB_KEY | /* Secure connections */ + HCI_SUP_LE_GENERATE_DHKEY; /* Secure connections */ + } + + if (lhciCmdTbl[LHCI_MSG_PHY]) + { + pBuf[35] |= HCI_SUP_LE_READ_PHY | /* LE PHY features */ + HCI_SUP_LE_SET_DEF_PHY | /* LE PHY features */ + HCI_SUP_LE_SET_PHY | /* LE PHY features */ + HCI_SUP_LE_ENHANCED_RECEIVER_TEST; /* LE PHY features */ + pBuf[36] |= HCI_SUP_LE_ENHANCED_TRANSMITTER_TEST; /* LE PHY features */ + } + + if (lhciCmdTbl[LHCI_MSG_EXT_ADV]) + { + pBuf[36] |= HCI_SUP_LE_SET_ADV_SET_RAND_ADDR | /* Extended advertising */ + HCI_SUP_LE_SET_EXT_ADV_PARAM | /* Extended advertising */ + HCI_SUP_LE_SET_EXT_ADV_DATA | /* Extended advertising */ + HCI_SUP_LE_SET_EXT_SCAN_RESP_DATA | /* Extended advertising */ + HCI_SUP_LE_SET_EXT_ADV_ENABLE | /* Extended advertising */ + HCI_SUP_LE_READ_MAX_ADV_DATA_LEN | /* Extended advertising */ + HCI_SUP_LE_READ_NUM_OF_SUP_ADV_SETS; /* Extended advertising */ + pBuf[37] |= HCI_SUP_LE_REMOVE_ADV_SET | /* Extended advertising */ + HCI_SUP_LE_CLEAR_ADV_SETS; /* Extended advertising */ + pBuf[39] |= HCI_SUP_LE_READ_RF_PATH_COMP | /* Extended advertising */ + HCI_SUP_LE_WRITE_RF_PATH_COMP; /* Extended advertising */ + } + + if (lhciCmdTbl[LHCI_MSG_EXT_SCAN]) + { + pBuf[37] |= HCI_SUP_LE_SET_EXT_SCAN_PARAM | /* Extended scanning */ + HCI_SUP_LE_SET_EXT_SCAN_ENABLE; /* Extended scanning */ + + if (lhciCmdTbl[LHCI_MSG_CONN]) + { + pBuf[37] |= HCI_SUP_LE_EXT_CREATE_CONN; /* Extended initiate. */ + } + } + + if (lhciCmdTbl[LHCI_MSG_PER_ADV]) + { + pBuf[37] |= HCI_SUP_LE_SET_PER_ADV_PARAM | /* Periodic advertising */ + HCI_SUP_LE_SET_PER_ADV_DATA | /* Periodic advertising */ + HCI_SUP_LE_SET_PER_ADV_ENABLE; + } + + if (lhciCmdTbl[LHCI_MSG_PER_SCAN]) + { + pBuf[38] |= HCI_SUP_LE_PER_ADV_CREATE_SYNC | /* Periodic scanning */ + HCI_SUP_LE_PER_ADV_CREATE_SYNC_CANCEL | /* Periodic scanning */ + HCI_SUP_LE_PER_ADV_TERMINATE_SYNC | /* Periodic scanning */ + HCI_SUP_LE_ADD_DEV_PER_ADV_LIST | /* Periodic scanning */ + HCI_SUP_LE_REMOVE_DEV_PER_ADV_LIST | /* Periodic scanning */ + HCI_SUP_LE_CLEAR_PER_ADV_LIST | /* Periodic scanning */ + HCI_SUP_LE_READ_PER_ADV_LIST_SIZE; /* Periodic scanning */ + } + + if (lhciCmdTbl[LHCI_MSG_PAST]) + { + pBuf[40] |= HCI_SUP_LE_SET_PER_ADV_RCV_ENABLE | /* Periodic advertising sync transfer */ + HCI_SUP_LE_PER_ADV_SYNC_TRANSFER | /* Periodic advertising sync transfer */ + HCI_SUP_LE_PER_ADV_SET_INFO_TRANSFER; /* Periodic advertising sync transfer */ + pBuf[41] |= HCI_SUP_LE_SET_PAST_PARAM | /* Periodic advertising sync transfer */ + HCI_SUP_LE_SET_DEFAULT_PAST_PARAM; /* Periodic advertising sync transfer */ + } + + if (lhciCmdTbl[LHCI_MSG_CIS_MST]) + { + pBuf[42] |= HCI_SUP_LE_READ_BUF_SIZE_V2 | /* Isochronous stream master */ + HCI_SUP_LE_SET_CIG_PARAM | /* Isochronous stream master */ + HCI_SUP_LE_CREATE_CIS | /* Isochronous stream master */ + HCI_SUP_LE_REMOVE_CIG; /* Isochronous stream master */ + + pBuf[44] |= HCI_SUP_LE_SETUP_ISO_DATA_PATH | /* Isochronous stream master */ + HCI_SUP_LE_REMOVE_ISO_DATA_PATH | /* Isochronous stream master */ + HCI_SUP_LE_REQ_PEER_SCA; /* Isochronous stream master */ + } + + if (lhciCmdTbl[LHCI_MSG_CIS_SLV]) + { + pBuf[42] |= HCI_SUP_LE_READ_BUF_SIZE_V2 | /* Isochronous stream master */ + HCI_SUP_LE_ACCEPT_CIS_REQ | /* Isochronous stream master */ + HCI_SUP_LE_REJECT_CIS_REQ; /* Isochronous stream master */ + + pBuf[44] |= HCI_SUP_LE_SETUP_ISO_DATA_PATH | /* Isochronous stream master */ + HCI_SUP_LE_REMOVE_ISO_DATA_PATH | /* Isochronous stream master */ + HCI_SUP_LE_REQ_PEER_SCA; /* Isochronous stream master */ + } +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init.c index 0ec90d261e..88d0504ff6 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,26 +16,20 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) slave initialization implementation file. + * \file + * \brief Link layer (LL) slave initialization implementation file. */ /*************************************************************************************************/ #include "ll_api.h" #include "lctr_api.h" #include "lmgr_api.h" -#include "bb_drv.h" +#include "pal_bb.h" #include "wsf_assert.h" #include "wsf_math.h" #include "wsf_msg.h" #include "wsf_trace.h" -/************************************************************************************************** - Macros -**************************************************************************************************/ - -/*! \brief Typical implementation revision number (LlRtCfg_t::implRev). */ -#define LL_IMPL_REV 0x2303 - /************************************************************************************************** Global Variables **************************************************************************************************/ @@ -64,13 +58,15 @@ void LlGetDefaultRunTimeCfg(LlRtCfg_t *pCfg) { /* Device */ .compId = LL_COMP_ID_ARM, - .implRev = LL_IMPL_REV, + .implRev = LL_VER_NUM >> 16, .btVer = LL_VER_BT_CORE_SPEC_4_2, /* Advertiser */ .maxAdvSets = 0, /* Disable extended advertising. */ .maxAdvReports = 4, .maxExtAdvDataLen = LL_EXT_ADVBU_MAX_LEN, .defExtAdvDataFrag = 64, + .auxDelayUsec = 0, + .auxPtrOffsetUsec = 2, /* Scanner */ .maxScanReqRcvdEvt = 4, .maxExtScanDataLen = LL_EXT_ADVBU_MAX_LEN, @@ -81,6 +77,13 @@ void LlGetDefaultRunTimeCfg(LlRtCfg_t *pCfg) .maxAclLen = 27, .defTxPwrLvl = 0, .ceJitterUsec = 0, + /* ISO */ + .numIsoTxBuf = 0, + .numIsoRxBuf = 0, + .maxIsoBufLen = 0, + .maxIsoPduLen = 0, + .maxCis = 0, /* Disable CIS. */ + .subEvtSpaceDelay = 0, /* DTM */ .dtmRxSyncMs = 10000, /* PHY */ @@ -156,6 +159,7 @@ void LlHandlerInit(wsfHandlerId_t handlerId) lmgrCb.numInitEnabled = 0; lmgrCb.numWlFilterEnabled = 0; lmgrCb.testEnabled = FALSE; + lmgrCb.scaMod = 0; lmgrPersistCb.featuresDefault |= (pLctrRtCfg->phy2mSup) ? LL_FEAT_LE_2M_PHY : 0; lmgrPersistCb.featuresDefault |= (pLctrRtCfg->phyCodedSup) ? LL_FEAT_LE_CODED_PHY : 0; @@ -184,7 +188,7 @@ void LlHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg) uint32_t startTime; uint32_t endTime; - startTimeValid = BbDrvGetTimestamp(&startTime); + startTimeValid = PalBbGetTimestamp(&startTime); if (event != 0) { @@ -204,7 +208,7 @@ void LlHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg) } if (startTimeValid && - BbDrvGetTimestamp(&endTime)) + PalBbGetTimestamp(&endTime)) { uint32_t durUsec = BB_TICKS_TO_US(endTime - startTime); if (llHandlerWatermarkUsec < durUsec) @@ -306,6 +310,105 @@ void LlGetConnContextSize(uint8_t *pMaxConn, uint16_t *pConnCtxSize) *pConnCtxSize = lmgrPersistCb.connCtxSize; } +/*************************************************************************************************/ +/*! + * \brief Get extended scanner context size. + * + * \param pMaxPerScan Buffer to return the maximum number of extended scanners. + * \param pPerScanCtxSize Buffer to return the size in bytes of the extended scanner context. + * + * Return the advertising set context sizes. + */ +/*************************************************************************************************/ +void LlGetExtScanContextSize(uint8_t *pMaxExtScan, uint16_t *pExtScanCtxSize) +{ + *pMaxExtScan = LL_MAX_PHYS; + + *pExtScanCtxSize = lmgrPersistCb.extScanCtxSize; +} + +/*************************************************************************************************/ +/*! + * \brief Get extended initiator context size. + * + * \param pMaxPerScan Buffer to return the maximum number of extended initiators. + * \param pPerScanCtxSize Buffer to return the size in bytes of the extended initiator context. + * + * Return the advertising set context sizes. + */ +/*************************************************************************************************/ +void LlGetExtInitContextSize(uint8_t *pMaxExtInit, uint16_t *pExtInitCtxSize) +{ + *pMaxExtInit = LL_MAX_PHYS; + + *pExtInitCtxSize = lmgrPersistCb.extInitCtxSize; +} + +/*************************************************************************************************/ +/*! + * \brief Get periodic scan context size. + * + * \param pMaxPerScan Buffer to return the maximum number of periodic scanners. + * \param pPerScanCtxSize Buffer to return the size in bytes of the periodic scanner context. + * + * Return the advertising set context sizes. + */ +/*************************************************************************************************/ +void LlGetPerScanContextSize(uint8_t *pMaxPerScan, uint16_t *pPerScanCtxSize) +{ + *pMaxPerScan = LL_MAX_PER_SCAN; + + *pPerScanCtxSize = lmgrPersistCb.perScanCtxSize; +} + +/*************************************************************************************************/ +/*! + * \brief Get CIG context size. + * + * \param pMaxCig Buffer to return the maximum number of CIG. + * \param pCigCtxSize Buffer to return the size in bytes of the CIG context. + * + * Return the connection context sizes. + */ +/*************************************************************************************************/ +void LlGetCigContextSize(uint8_t *pMaxCig, uint16_t *pCigCtxSize) +{ + if (pLctrRtCfg) + { + *pMaxCig = pLctrRtCfg->maxCig; + } + else + { + *pMaxCig = 0; + } + + *pCigCtxSize = lmgrPersistCb.cigCtxSize; +} + +/*************************************************************************************************/ +/*! + * \brief Get CIS context size. + * + * \param pMaxCis Buffer to return the maximum number of CIS. + * \param pCisCtxSize Buffer to return the size in bytes of the CIS context. + * + * Return the connection context sizes. + */ +/*************************************************************************************************/ +void LlGetCisContextSize(uint8_t *pMaxCis, uint16_t *pCisCtxSize) +{ + if (pLctrRtCfg) + { + *pMaxCis = pLctrRtCfg->maxCis; + } + else + { + *pMaxCis = 0; + } + + *pCisCtxSize = lmgrPersistCb.cisCtxSize; +} + /*************************************************************************************************/ /*! * \brief Get the LL handler watermark level. diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_master.c index f3c122649f..f2d3d26d75 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) master initialization implementation file. + * \file + * \brief Link layer (LL) master initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_master_ae.c index 120b19a9d5..977eceb219 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) master initialization implementation file. + * \file + * \brief Link layer (LL) master initialization implementation file. */ /*************************************************************************************************/ @@ -64,5 +65,6 @@ void LlExtScanMasterInit(void) LmgrMstInit(); LctrMstExtScanInit(); LctrMstPerCreateSyncInit(); + LctrMstPerTransferSyncInit(); LctrMstPerScanInit(); } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_slave.c index f9c866f1f5..36ad002331 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) slave initialization implementation file. + * \file + * \brief Link layer (LL) slave initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_slave_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_slave_ae.c index 3527c46b47..bb575a63ca 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_slave_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_adv_slave_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) slave initialization implementation file. + * \file + * \brief Link layer (LL) slave initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_conn_cs2.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_conn_cs2.c index 6c572b9c37..4c67082597 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_conn_cs2.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_conn_cs2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) channel selection 2 initialization implementation file. + * \file + * \brief Link layer (LL) channel selection 2 initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_conn_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_conn_master.c index 5012c414c9..2cc3faf85d 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_conn_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_conn_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) master initialization implementation file. + * \file + * \brief Link layer (LL) master initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_conn_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_conn_slave.c index 35cda5f16a..a6da257b91 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_conn_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_conn_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) slave initialization implementation file. + * \file + * \brief Link layer (LL) slave initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_enc_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_enc_master.c index 6ad14eb1aa..6e6498a292 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_enc_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_enc_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) encryptable master initialization implementation file. + * \file + * \brief Link layer (LL) encryptable master initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_enc_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_enc_slave.c index ade0bf6f1e..e02dc1b628 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_enc_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_enc_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) encryptable slave initialization implementation file. + * \file + * \brief Link layer (LL) encryptable slave initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_init_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_init_master.c index cb307c1640..f5f0e7db1d 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_init_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_init_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) master initialization implementation file. + * \file + * \brief Link layer (LL) master initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_init_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_init_master_ae.c index a5a361a88b..e30a98883d 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_init_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_init_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) master initialization implementation file. + * \file + * \brief Link layer (LL) master initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_master_phy.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_master_phy.c index cf71a0ddab..76d08b2727 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_master_phy.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_master_phy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) PHY features initialization implementation file. + * \file + * \brief Link layer (LL) PHY features initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/chci_tr_serial.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_past.c similarity index 65% rename from features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/chci_tr_serial.h rename to features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_past.c index e63ac29623..94a75312cb 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/chci_tr_serial.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_past.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,33 +16,25 @@ /*************************************************************************************************/ /*! - * \brief Controller HCI serial transport interface file. + * \file + * \brief Link layer (LL) master initialization implementation file. */ /*************************************************************************************************/ -#ifndef CHCI_TR_SERIAL_H -#define CHCI_TR_SERIAL_H - -#include "wsf_types.h" - -#ifdef __cplusplus -extern "C" { -#endif +#include "ll_api.h" +#include "lctr_api_adv_master_ae.h" +#include "wsf_assert.h" /*************************************************************************************************/ /*! - * \brief Receive function. Gets called by external code when bytes are received. + * \brief Initialize LL subsystem for PAST(Periodic advertising sync transfer). * - * \param pBuf Pointer to buffer of incoming bytes. - * \param len Number of bytes in incoming buffer. + * \return None. * - * \return None. + * This function initializes the LL subsystem for PAST(Periodic advertising sync transfer). */ /*************************************************************************************************/ -void chciTrSerialRxIncoming(uint8_t *pBuf, uint8_t len); - -#ifdef __cplusplus -}; -#endif - -#endif /* CHCI_TR_SERIAL_H */ +void LlPastInit(void) +{ + LctrPastInit(); +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_priv.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_priv.c index 9934a69f1e..5e61d3b6e2 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_priv.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_priv.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) privacy initialization implementation file. + * \file + * \brief Link layer (LL) privacy initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_sc.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_sc.c index 0403d30827..115551f3c9 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_sc.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_sc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) secure connections initialization implementation file. + * \file + * \brief Link layer (LL) secure connections initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_slave_phy.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_slave_phy.c index 37e4bc02b0..0532e929be 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_slave_phy.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_init_slave_phy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) PHY features initialization implementation file. + * \file + * \brief Link layer (LL) PHY features initialization implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main.c index 90a6de9de4..9e1e2feb82 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,23 +16,49 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) slave parameter interface implementation file. + * \file + * \brief Link layer (LL) slave parameter interface implementation file. */ /*************************************************************************************************/ #include "ll_api.h" #include "ll_math.h" #include "lctr_api.h" +#include "lctr_api_conn.h" +#include "lctr_api_adv_slave_ae.h" +#include "lctr_api_adv_master_ae.h" +#include "lctr_api_adv_master.h" +#include "lctr_api_init_master.h" +#include "lctr_api_init_master_ae.h" +#include "lmgr_api_adv_slave.h" #include "lmgr_api.h" #include "bb_ble_api.h" #include "bb_ble_api_whitelist.h" -#include "bb_ble_drv.h" +#include "pal_bb_ble.h" +#include "pal_radio.h" #include "wsf_assert.h" #include "wsf_cs.h" #include "wsf_trace.h" +#include "wsf_msg.h" #include "util/bstream.h" #include +/************************************************************************************************* + Globals +*************************************************************************************************/ + +/*! \brief Check if periodic adv is enabled (ae functionality). */ +LctrIsPerAdvEnabledFn_t LctrPerAdvEnabled; /*!< Lctr Per Adv Enabled check function (defined if AE supported). */ + +/*! \brief Check if periodic adv is enabled (ae functionality). */ +LctrIsPerAdvEnabledFn_t LctrPerAdvEnabled; /*!< Lctr Per Adv Enabled check function (defined if AE supported). */ + +/*! \brief Check is Ext Scan is enabled (ae functionality). */ +LctrExtCheckFn_t LctrMstExtScanEnabled; + +/*! \brief Check is Ext Init is enabled (ae functionality). */ +LctrExtCheckFn_t LctrMstExtInitEnabled; + /*************************************************************************************************/ /*! * \brief Set Bluetooth device address @@ -96,11 +122,57 @@ uint8_t LlSetRandAddr(const uint8_t *pAddr) WSF_ASSERT(pAddr); - if (lmgrCb.advEnabled || lmgrCb.numScanEnabled || lmgrCb.numInitEnabled) + /* Legacy Advertising */ + if ((lmgrCb.advEnabled && + ((lmgrSlvAdvCb.advParam.ownAddrType & 0x01)))) { return LL_ERROR_CODE_CMD_DISALLOWED; } + /* Scanning. */ + if (lmgrCb.numScanEnabled) + { + /* Legacy Scanning. */ + if (LctrMstScanIsEnabled()) + { + return LL_ERROR_CODE_CMD_DISALLOWED; + } + + /* Extended Scanning. */ + if (LctrMstExtScanEnabled) + { + for (int scanPhy = 0; scanPhy < LCTR_SCAN_PHY_TOTAL; scanPhy++) + { + if (LctrMstExtScanEnabled(scanPhy)) + { + return LL_ERROR_CODE_CMD_DISALLOWED; + } + } + } + } + + /* Initiating */ + if (lmgrCb.numInitEnabled) + { + /* Legacy init. */ + if (LctrMstInitIsEnabled()) + { + return LL_ERROR_CODE_CMD_DISALLOWED; + } + + /* Extended Initiating */ + if (LctrMstExtInitEnabled) + { + for (int scanPhy = 0; scanPhy < LCTR_SCAN_PHY_TOTAL; scanPhy++) + { + if (LctrMstExtInitEnabled(scanPhy)) + { + return LL_ERROR_CODE_CMD_DISALLOWED; + } + } + } + } + uint64_t bdAddr; BSTREAM_TO_BDA64(bdAddr, pAddr); @@ -271,11 +343,17 @@ uint8_t LlSetOpFlags(uint32_t flags, bool_t enable) LL_OP_MODE_FLAG_ENA_LEN_LLCP_STARTUP | LL_OP_MODE_FLAG_ENA_FEAT_LLCP_STARTUP | LL_OP_MODE_FLAG_SLV_DELAY_LLCP_STARTUP | + LL_OP_MODE_FLAG_ENA_MST_CIS_NULL_PDU | LL_OP_MODE_FLAG_ENA_ADV_DLY | LL_OP_MODE_FLAG_ENA_SCAN_BACKOFF | LL_OP_MODE_FLAG_ENA_WW | LL_OP_MODE_FLAG_ENA_SLV_LATENCY | - LL_OP_MODE_FLAG_ENA_LLCP_TIMER; + LL_OP_MODE_FLAG_ENA_SLV_LATENCY_WAKEUP | + LL_OP_MODE_FLAG_ENA_SLV_AUX_SCAN_RSP_ADI | + LL_OP_MODE_FLAG_ENA_SLV_AUX_IND_ADVA | + LL_OP_MODE_FLAG_ENA_ADV_CHAN_RAND | + LL_OP_MODE_FLAG_ENA_LLCP_TIMER | + LL_OP_MODE_FLAG_IGNORE_CRC_ERR_TS; LL_TRACE_INFO2("### LlApi ### LlSetOpFlags flag=%x enable=%d", flags, enable); @@ -457,7 +535,7 @@ uint8_t LlGetRandNum(uint8_t *pRandNum) LL_TRACE_INFO0("### LlApi ### LlGetRandNum"); /* Return 8 bytes of random data. */ - BbBleDrvRand(pRandNum, sizeof(uint64_t) / sizeof(uint8_t)); + PalCryptoGenerateRandomNumber(pRandNum, sizeof(uint64_t) / sizeof(uint8_t)); return LL_SUCCESS; } @@ -478,7 +556,7 @@ void LlReadSupTxPower(int8_t *pMinTxPwr, int8_t *pMaxTxPwr) { WSF_ASSERT(pMinTxPwr && pMaxTxPwr); - BbBleRfGetSupTxPower(pMinTxPwr, pMaxTxPwr); + PalRadioGetSupTxPower(pMinTxPwr, pMaxTxPwr); } /*************************************************************************************************/ @@ -498,7 +576,7 @@ void LlReadRfPathComp(int16_t *pTxPathComp, int16_t *pRxPathComp) LL_TRACE_INFO0("### LlApi ### LlReadRfPathComp"); WSF_ASSERT(pTxPathComp && pRxPathComp); - BbBleRfReadRfPathComp(pTxPathComp, pRxPathComp); + PalRadioReadRfPathComp(pTxPathComp, pRxPathComp); } /*************************************************************************************************/ @@ -518,10 +596,106 @@ uint8_t LlWriteRfPathComp(int16_t txPathComp, int16_t rxPathComp) { LL_TRACE_INFO0("### LlApi ### LlWriteRfPathComp"); - if (!BbBleRfWriteRfPathComp(txPathComp, rxPathComp)) + if (!PalRadioWriteRfPathComp(txPathComp, rxPathComp)) { return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; } return LL_SUCCESS; } + +/*************************************************************************************************/ +/*! + * \brief Set channel class. + * + * \param pChanMap Channel map (0=bad, 1=usable). + * + * \return Status error code. + * + * Set the channel class. At least 2 bits must be set. + */ +/*************************************************************************************************/ +uint8_t LlSetChannelClass(const uint8_t *pChanMap) +{ + lctrChanMapUpdate_t *pMsg; + uint64_t chanMap; + uint16_t handle; + + LL_TRACE_INFO0("### LlApi ### LlSetChannelClass"); + + BSTREAM_TO_UINT40(chanMap, pChanMap); + + if ((LL_API_PARAM_CHECK == 1) && + ((LlMathGetNumBitsSet(chanMap) < 2) || + ((chanMap & ~LL_CHAN_DATA_ALL) != 0))) + { + return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; + } + + lmgrCb.chanClass = chanMap; + + /* Update for connections */ + for (handle = 0; handle < pLctrRtCfg->maxConn; handle++) + { + if ((LctrIsConnHandleEnabled(handle)) && + (LctrGetRole(handle) == LL_ROLE_MASTER)) + { + if (LctrIsProcActPended(handle, LCTR_CONN_MSG_API_CHAN_MAP_UPDATE) == TRUE) + { + return LL_ERROR_CODE_CMD_DISALLOWED; + } + + if ((pMsg = (lctrChanMapUpdate_t *)WsfMsgAlloc(sizeof(*pMsg))) != NULL) + { + pMsg->hdr.handle = handle; + pMsg->hdr.dispId = LCTR_DISP_CONN; + pMsg->hdr.event = LCTR_CONN_MSG_API_CHAN_MAP_UPDATE; + + pMsg->chanMap = chanMap; + + WsfMsgSend(lmgrPersistCb.handlerId, pMsg); + } + } + } + + /* If periodic advertising is not included, return here. */ + if (LctrPerAdvEnabled) + { + /* Update for periodic adv sets */ + for(uint8_t perAdvHandle = 0; perAdvHandle < pLctrRtCfg->maxAdvSets; perAdvHandle++) + { + if (LctrPerAdvEnabled(perAdvHandle) == TRUE) + { + if ((pMsg = (lctrChanMapUpdate_t *)WsfMsgAlloc(sizeof(*pMsg))) != NULL) + { + pMsg->hdr.handle = (uint16_t) perAdvHandle; + pMsg->hdr.dispId = LCTR_DISP_ACAD; + pMsg->hdr.event = LCTR_ACAD_MSG_CHAN_UPDATE; + pMsg->chanMap = chanMap; + + WsfMsgSend(lmgrPersistCb.handlerId, pMsg); + } + } + } + } + + return LL_SUCCESS; +} + +/*************************************************************************************************/ +/*! + * \brief Set Hci supported command + * + * \param byte Byte location of command + * \param bit Bit location of command + * \param enable Enable or disable command + * + * \return Status error code + * + */ +/*************************************************************************************************/ +uint8_t LlSetHciSupCmd(uint8_t byte, uint8_t bit, bool_t enable) +{ + lmgrCb.hciSupCommands[byte] = ((lmgrCb.hciSupCommands[byte] & ~(1 << bit)) | ((uint8_t) enable << bit)); + return LL_SUCCESS; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_master.c index aacfd24a8b..fa64d7114b 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) master parameter interface implementation file. + * \file + * \brief Link layer (LL) master parameter interface implementation file. */ /*************************************************************************************************/ @@ -85,6 +86,7 @@ uint8_t LlSetScanParam(const LlScanParam_t *pParam) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsLegacyCommandAllowed()) { + LL_TRACE_WARN0("Extended Advertising/Scanning operation enabled; legacy commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -142,11 +144,13 @@ void LlScanEnable(uint8_t enable, uint8_t filterDup) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsLegacyCommandAllowed()) { + LL_TRACE_WARN0("Extended Advertising/Scanning operation enabled; legacy commands not available"); LmgrSendScanEnableCnf(LL_ERROR_CODE_CMD_DISALLOWED); return; } if ((LL_API_PARAM_CHECK == 1) && + (enable == TRUE) && !LmgrIsAddressTypeAvailable(lmgrMstScanCb.scanParam.ownAddrType)) { LL_TRACE_WARN1("Address type invalid or not available, ownAddrType=%u", lmgrMstScanCb.scanParam.ownAddrType); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_master_ae.c index 9b5d24590f..d600883cce 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) master control interface implementation file. + * \file + * \brief Link layer (LL) master control interface implementation file. */ /*************************************************************************************************/ @@ -25,6 +26,7 @@ #include "lmgr_api.h" #include "lmgr_api_adv_master_ae.h" #include "bb_ble_api_periodiclist.h" +#include "hci_defs.h" #include "util/bstream.h" #include "wsf_assert.h" #include "wsf_msg.h" @@ -80,6 +82,7 @@ uint8_t LlSetExtScanParam(uint8_t ownAddrType, uint8_t scanFiltPolicy, uint8_t s if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -180,6 +183,7 @@ void LlExtScanEnable(uint8_t enable, uint8_t filterDup, uint16_t duration, uint1 if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); lmgrCb.extScanEnaDelayCnt = 1; LmgrSendExtScanEnableCnf(LL_ERROR_CODE_CMD_DISALLOWED); return; @@ -196,6 +200,15 @@ void LlExtScanEnable(uint8_t enable, uint8_t filterDup, uint16_t duration, uint1 return; } + if ((LL_API_PARAM_CHECK == 1) && + ((enable != 0) && + ((filterDup == LL_SCAN_FILTER_DUP_ENABLE_PERIODIC) && ((duration == 0) || (period == 0))))) + { + lmgrCb.extScanEnaDelayCnt = 1; + LmgrSendExtScanEnableCnf(LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS); + return; + } + if ((LL_API_PARAM_CHECK == 1) && (!LctrMstExtScanValidateParam())) { @@ -234,14 +247,15 @@ uint8_t LlPeriodicAdvCreateSync(const LlPerAdvCreateSyncCmd_t *pParam) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } if ((LL_API_PARAM_CHECK == 1) && - ((pParam->filterPolicy > LL_PER_SCAN_FILTER_PL_BIT) || - (pParam->advAddrType > LL_ADDR_RANDOM) || + ((pParam->advAddrType > LL_ADDR_RANDOM) || (pParam->advSID > LL_MAX_ADV_SID) || (pParam->skip > LL_SYNC_MAX_SKIP) || + (pParam->options & ~LL_PER_ADV_CREATE_SYNC_OPTIONS_BITS) || (pParam->syncTimeOut > LL_SYNC_MAX_TIMEOUT) || (pParam->syncTimeOut < LL_SYNC_MIN_TIMEOUT))) { @@ -258,6 +272,17 @@ uint8_t LlPeriodicAdvCreateSync(const LlPerAdvCreateSyncCmd_t *pParam) return LL_ERROR_CODE_ACL_CONN_ALREADY_EXISTS; } + if (lctrMstPerGetNumPerScanCtx() >= LL_MAX_PER_SCAN) + { + return LL_ERROR_CODE_MEM_CAP_EXCEEDED; + } + + /* If reporting is initially disabled and controller does not support LE_Set_Per_Adv_Rcv_En cmd, return error. */ + if (((pParam->options >> 1) & 0x01) && !(lmgrCb.hciSupCommands[40] & HCI_SUP_LE_SET_PER_ADV_RCV_ENABLE)) + { + return LL_ERROR_CODE_CONN_FAILED_TO_ESTABLISH; + } + lctrPerCreateSyncMsg_t *pMsg; if ((pMsg = WsfMsgAlloc(sizeof(*pMsg))) != NULL) @@ -268,7 +293,8 @@ uint8_t LlPeriodicAdvCreateSync(const LlPerAdvCreateSyncCmd_t *pParam) pMsg->advAddr = BstreamToBda64(pParam->pAdvAddr); pMsg->advAddrType = pParam->advAddrType; pMsg->advSID = pParam->advSID; - pMsg->filterPolicy = pParam->filterPolicy; + pMsg->filterPolicy = pParam->options & 0x01; + pMsg->repDisabled = (pParam->options >> 1) & 0x01; pMsg->skip = pParam->skip; pMsg->syncTimeOut = pParam->syncTimeOut; @@ -292,6 +318,7 @@ uint8_t LlPeriodicAdvCreateSyncCancel(void) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -329,6 +356,7 @@ uint8_t LlPeriodicAdvTerminateSync(uint16_t syncHandle) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } if ((LL_API_PARAM_CHECK == 1) && @@ -337,6 +365,12 @@ uint8_t LlPeriodicAdvTerminateSync(uint16_t syncHandle) return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; } + if ((LL_API_PARAM_CHECK == 1) && + !lctrMstPerIsSyncHandleValid(syncHandle)) + { + return LL_ERROR_CODE_UNKNOWN_ADV_ID; + } + if (LctrMstPerIsSyncPending()) { return LL_ERROR_CODE_CMD_DISALLOWED; @@ -370,6 +404,7 @@ uint8_t LlAddDeviceToPeriodicAdvList(const LlDevicePerAdvList_t *pParam) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -415,6 +450,7 @@ uint8_t LlRemoveDeviceFromPeriodicAdvList(const LlDevicePerAdvList_t *pParam) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -457,7 +493,8 @@ uint8_t LlClearPeriodicAdvList(void) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { - return LL_ERROR_CODE_CMD_DISALLOWED; + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); + return LL_ERROR_CODE_CMD_DISALLOWED; } if (lmgrCb.numPlFilterEnabled) @@ -491,7 +528,8 @@ uint8_t LlReadPeriodicAdvListSize(uint8_t *pListSize) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { - return LL_ERROR_CODE_CMD_DISALLOWED; + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); + return LL_ERROR_CODE_CMD_DISALLOWED; } *pListSize = BbBlePeriodicListGetSize(); diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_slave.c index 2cb6b0f3d9..b9e0dbe25c 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) slave parameter interface implementation file. + * \file + * \brief Link layer (LL) slave parameter interface implementation file. */ /*************************************************************************************************/ @@ -24,12 +25,15 @@ #include "lmgr_api_adv_slave.h" #include "lctr_api_adv_slave.h" #include "bb_ble_api.h" +#include "pal_bb_ble.h" +#include "pal_radio.h" #include "bb_ble_api_op.h" #include "util/bstream.h" #include "wsf_assert.h" #include "wsf_cs.h" #include "wsf_msg.h" #include "wsf_trace.h" +#include "bb_ble_api_reslist.h" #include /*************************************************************************************************/ @@ -66,11 +70,12 @@ uint8_t LlGetAdvTxPower(int8_t *pAdvTxPwr) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsLegacyCommandAllowed()) { + LL_TRACE_WARN0("Extended Advertising/Scanning operation enabled; legacy commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } WSF_ASSERT(pAdvTxPwr); - *pAdvTxPwr = BbBleRfGetActualTxPower(lmgrCb.advTxPwr, FALSE); + *pAdvTxPwr = PalRadioGetActualTxPower(lmgrCb.advTxPwr, FALSE); LL_TRACE_INFO1("### LlApi ### LlGetAdvTxPower, advTxPwr=%d", *pAdvTxPwr); @@ -113,6 +118,7 @@ uint8_t LlSetAdvParam(uint16_t advIntervalMin, uint16_t advIntervalMax, uint8_t if ((LL_API_PARAM_CHECK == 1) && !LmgrIsLegacyCommandAllowed()) { + LL_TRACE_WARN0("Extended Advertising/Scanning operation enabled; legacy commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -181,6 +187,7 @@ uint8_t LlSetAdvData(uint8_t len, const uint8_t *pData) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsLegacyCommandAllowed()) { + LL_TRACE_WARN0("Extended Advertising/Scanning operation enabled; legacy commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -219,11 +226,13 @@ uint8_t LlSetScanRespData(uint8_t len, const uint8_t *pData) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsLegacyCommandAllowed()) { + LL_TRACE_WARN0("Extended Advertising/Scanning operation enabled; legacy commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } if (len > sizeof(lmgrSlvAdvCb.scanRspData.buf)) { + LL_TRACE_WARN2("Invalid scan response buffer size, len=%u, maxLen=%u", len, sizeof(lmgrSlvAdvCb.scanRspData.buf)); return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; } @@ -256,6 +265,7 @@ void LlAdvEnable(uint8_t enable) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsLegacyCommandAllowed()) { + LL_TRACE_WARN0("Extended Advertising/Scanning operation enabled; legacy commands not available"); LmgrSendAdvEnableCnf(LL_ERROR_CODE_CMD_DISALLOWED); return; } @@ -276,8 +286,23 @@ void LlAdvEnable(uint8_t enable) break; } if ((LL_API_PARAM_CHECK == 1) && + (enable == TRUE) && !LmgrIsAddressTypeAvailable(lmgrSlvAdvCb.advParam.ownAddrType)) { + if (lmgrSlvAdvCb.advParam.advType == LL_ADDR_RANDOM_IDENTITY) + { + if (bbBleIsPeerInResList(lmgrSlvAdvCb.advParam.peerAddrType, lmgrSlvAdvCb.advParam.peerAddr)) + { + if ((pMsg = WsfMsgAlloc(sizeof(*pMsg))) != NULL) + { + pMsg->dispId = LCTR_DISP_ADV; + pMsg->event = LCTR_ADV_MSG_START; + + WsfMsgSend(lmgrPersistCb.handlerId, pMsg); + return; + } + } + } LL_TRACE_WARN1("Address type invalid or not available, ownAddrType=%u", lmgrSlvAdvCb.advParam.ownAddrType); LmgrSendAdvEnableCnf(LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS); return; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_slave_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_slave_ae.c index 966d6d9994..4b238a4d6f 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_slave_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_adv_slave_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,13 +16,15 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) master control interface implementation file. + * \file + * \brief Link layer (LL) master control interface implementation file. */ /*************************************************************************************************/ #include "ll_api.h" #include "ll_math.h" #include "lctr_api_adv_slave_ae.h" +#include "lctr_api_adv_master_ae.h" #include "lmgr_api_adv_slave.h" #include "lmgr_api_adv_slave_ae.h" #include "bb_ble_api.h" @@ -59,6 +61,25 @@ uint8_t LlSetAdvSetRandAddr(uint8_t handle, const uint8_t *pAddr) return LctrSetExtAdvSetRandAddr(handle, pAddr); } + +/*************************************************************************************************/ +/*! + * \brief Read periodic channel map for slave or master + * + * \param pBuf Packed packet buffer. + * + * \return Channel map, packed into a 64bit int + * + * Note: Consider moving to ll_main_ae.c (as of now, no file for this exists). + */ +/*************************************************************************************************/ +uint64_t LlGetPeriodicChanMap(uint16_t handle, bool_t isAdv) +{ + LL_TRACE_INFO2("### LlApi ### LlGetPeriodicChanMap, handle=%u | isAdv=%u", handle, isAdv); + + return isAdv ? LctrGetPerAdvChanMap((uint8_t) handle) : LctrGetPerScanChanMap(handle); +} + /*************************************************************************************************/ /*! * \brief Get advertising set random device address. @@ -112,6 +133,7 @@ uint8_t LlSetExtAdvParam(uint8_t handle, LlExtAdvParam_t *pExtAdvParam) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } if ((LL_API_PARAM_CHECK == 1) && @@ -126,6 +148,7 @@ uint8_t LlSetExtAdvParam(uint8_t handle, LlExtAdvParam_t *pExtAdvParam) ((pExtAdvParam->priAdvInterMin < validAdvInterMin) || (pExtAdvParam->priAdvInterMax < validAdvInterMin))))) { + LL_TRACE_WARN1("Invalid Advertising Interval values, handle=%u", handle); return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; } if ((LL_API_PARAM_CHECK == 1) && @@ -134,6 +157,7 @@ uint8_t LlSetExtAdvParam(uint8_t handle, LlExtAdvParam_t *pExtAdvParam) ((pExtAdvParam->priAdvInterMin > validAdvInterMax) || (pExtAdvParam->priAdvInterMax > validAdvInterMax)))) { + LL_TRACE_WARN1("Unsupported Advertising Interval values, handle=%u", handle); return LL_ERROR_CODE_UNSUPPORTED_FEATURE_PARAM_VALUE; } if ((LL_API_PARAM_CHECK == 1) && @@ -143,13 +167,14 @@ uint8_t LlSetExtAdvParam(uint8_t handle, LlExtAdvParam_t *pExtAdvParam) ((pExtAdvParam->advEventProp & LL_ADV_EVT_PROP_LEGACY_ADV_BIT) && (pExtAdvParam->advEventProp & (LL_ADV_EVT_PROP_OMIT_AA_BIT | LL_ADV_EVT_PROP_TX_PWR_BIT))))) { + LL_TRACE_WARN1("Invalid Advertising Event Properties, handle=%u", handle); return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; } if ((LL_API_PARAM_CHECK == 1) && ((pExtAdvParam->advEventProp & LL_ADV_EVT_PROP_OMIT_AA_BIT) && (pExtAdvParam->advEventProp & (LL_ADV_EVT_PROP_CONN_ADV_BIT | LL_ADV_EVT_PROP_SCAN_ADV_BIT)))) { - /* Only non-connectable and non-scannable advertising can do anonymous advertising. */ + LL_TRACE_WARN1("Only non-connectable and non-scannable advertising can do anonymous advertising, handle=%u", handle); return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; } if ((LL_API_PARAM_CHECK == 1) && @@ -160,13 +185,15 @@ uint8_t LlSetExtAdvParam(uint8_t handle, LlExtAdvParam_t *pExtAdvParam) (((pExtAdvParam->advEventProp & LL_ADV_EVT_PROP_LEGACY_ADV_BIT) == 0) && (pExtAdvParam->secAdvPhy != LL_PHY_LE_1M) && (pExtAdvParam->secAdvPhy != LL_PHY_LE_2M) && (pExtAdvParam->secAdvPhy != LL_PHY_LE_CODED)))) { + LL_TRACE_WARN1("Invalid PHY for legacy advertising, handle=%u", handle); return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; } if ((LL_API_PARAM_CHECK == 1) && (((pExtAdvParam->secAdvPhy == LL_PHY_LE_2M) && ((lmgrCb.features & LL_FEAT_LE_2M_PHY) == 0)) || (((pExtAdvParam->priAdvPhy == LL_PHY_LE_CODED) || (pExtAdvParam->secAdvPhy == LL_PHY_LE_CODED)) && ((lmgrCb.features & LL_FEAT_LE_CODED_PHY) == 0)))) { - return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; + LL_TRACE_WARN1("Unsupported PHY, handle=%u", handle); + return LL_ERROR_CODE_UNSUPPORTED_FEATURE_PARAM_VALUE; } pExtAdvParam->priAdvInterMin = BB_BLE_TO_BB_TICKS(pExtAdvParam->priAdvInterMin); pExtAdvParam->priAdvInterMax = BB_BLE_TO_BB_TICKS(pExtAdvParam->priAdvInterMax); @@ -216,6 +243,7 @@ uint8_t LlSetExtAdvData(uint8_t handle, uint8_t op, uint8_t fragPref, uint8_t le if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -246,6 +274,7 @@ uint8_t LlSetExtScanRespData(uint8_t handle, uint8_t op, uint8_t fragPref, uint8 if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -277,6 +306,7 @@ void LlExtAdvEnable(uint8_t enable, uint8_t numAdvSets, LlExtAdvEnableParam_t en if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); lmgrCb.extAdvEnaDelayCnt = 1; LmgrSendExtAdvEnableCnf(0, LL_ERROR_CODE_CMD_DISALLOWED); return; @@ -372,6 +402,7 @@ uint8_t LlReadMaxAdvDataLen(uint16_t *pLen) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -399,6 +430,7 @@ uint8_t LlReadNumSupAdvSets(uint8_t *pNumSets) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -426,6 +458,7 @@ uint8_t LlRemoveAdvSet(uint8_t handle) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -448,6 +481,7 @@ uint8_t LlClearAdvSets(void) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -475,6 +509,7 @@ uint8_t LlSetPeriodicAdvParam(uint8_t handle, LlPerAdvParam_t *pPerAdvParam) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -516,6 +551,7 @@ uint8_t LlSetPeriodicAdvData(uint8_t handle, uint8_t op, uint8_t len, const uint if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -541,7 +577,7 @@ uint8_t LlSetPeriodicAdvData(uint8_t handle, uint8_t op, uint8_t len, const uint * \param enable Set to TRUE to enable advertising, FALSE to disable advertising. * \param handle Advertising handle. * - * \return Status error code. + * \return None. * * Enable or disable periodic advertising. */ @@ -553,6 +589,7 @@ void LlSetPeriodicAdvEnable(uint8_t handle, uint8_t enable) if ((LL_API_PARAM_CHECK == 1) && !LmgrIsExtCommandAllowed()) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); LmgrSendPeriodicAdvEnableCnf(handle, LL_ERROR_CODE_CMD_DISALLOWED); return; } @@ -574,7 +611,7 @@ void LlSetPeriodicAdvEnable(uint8_t handle, uint8_t enable) * \param handle Advertising handle. * \param delayUsec Additional time in microseconds. "0" to disable. * - * \return None. + * \return Status error code. * * Additional delay given to auxiliary packets specified by AuxPtr. Offset values are * limited by the advertising interval. diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn.c index 9d15afbbaa..2bef004cd4 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) slave parameter interface implementation file. + * \file + * \brief Link layer (LL) slave parameter interface implementation file. */ /*************************************************************************************************/ @@ -222,9 +223,11 @@ uint8_t LlSetConnOpFlags(uint16_t handle, uint32_t flags, bool_t enable) LL_OP_MODE_FLAG_MST_IGNORE_CP_RSP | LL_OP_MODE_FLAG_MST_UNCOND_CP_RSP | LL_OP_MODE_FLAG_REQ_SYM_PHY | + LL_OP_MODE_FLAG_ENA_SLV_LATENCY_WAKEUP | LL_OP_MODE_FLAG_ENA_WW | LL_OP_MODE_FLAG_ENA_SLV_LATENCY | - LL_OP_MODE_FLAG_ENA_LLCP_TIMER; + LL_OP_MODE_FLAG_ENA_LLCP_TIMER | + LL_OP_MODE_FLAG_IGNORE_CRC_ERR_TS; LL_TRACE_INFO2("### LlApi ### LlSetConnFlags flag=%x enable=%d", flags, enable); @@ -265,20 +268,53 @@ uint8_t LlDisconnect(uint16_t handle, uint8_t reason) LL_TRACE_INFO2("### LlApi ### LlDisconnect, handle=%u, reason=%u", handle, reason); if ((LL_API_PARAM_CHECK == 1) && - ((handle >= pLctrRtCfg->maxConn) || - !LctrIsConnHandleEnabled(handle))) + (handle >= (pLctrRtCfg->maxConn + pLctrRtCfg->maxCis * pLctrRtCfg->maxCig))) { return LL_ERROR_CODE_UNKNOWN_CONN_ID; } - if ((pMsg = (lctrDisconnect_t *)WsfMsgAlloc(sizeof(*pMsg))) != NULL) + if ((LL_API_PARAM_CHECK == 1) && + (handle < pLctrRtCfg->maxConn)) { - pMsg->hdr.handle = handle; - pMsg->hdr.dispId = LCTR_DISP_CONN; - pMsg->hdr.event = LCTR_CONN_MSG_API_DISCONNECT; - pMsg->reason = reason; + /* Handle for ACL is not enabled. */ + if (!LctrIsConnHandleEnabled(handle)) + { + return LL_ERROR_CODE_UNKNOWN_CONN_ID; + } + } - WsfMsgSend(lmgrPersistCb.handlerId, pMsg); + if (handle < pLctrRtCfg->maxConn) + { + /* ACL handle */ + if ((pMsg = (lctrDisconnect_t *)WsfMsgAlloc(sizeof(*pMsg))) != NULL) + { + pMsg->hdr.handle = handle; + pMsg->hdr.dispId = LCTR_DISP_CONN; + pMsg->hdr.event = LCTR_CONN_MSG_API_DISCONNECT; + pMsg->reason = reason; + + WsfMsgSend(lmgrPersistCb.handlerId, pMsg); + } + } + else + { + /* CIS handle */ + + /* Return error if CIS is not established. */ + if (LctrIsCisConnHandleEnabled(handle) == FALSE) + { + return LL_ERROR_CODE_CMD_DISALLOWED; + } + + if ((pMsg = (lctrDisconnect_t *)WsfMsgAlloc(sizeof(*pMsg))) != NULL) + { + pMsg->hdr.handle = handle; + pMsg->hdr.dispId = LCTR_DISP_CIS; + pMsg->hdr.event = LCTR_CONN_MSG_API_DISCONNECT; + pMsg->reason = reason; + + WsfMsgSend(lmgrPersistCb.handlerId, pMsg); + } } return LL_SUCCESS; @@ -305,11 +341,6 @@ uint8_t LlConnUpdate(uint16_t handle, const LlConnSpec_t *pConnSpec) LL_TRACE_INFO1("### LlApi ### LlConnUpdate, handle=%u", handle); - if (LctrIsProcActPended(handle, LCTR_CONN_MSG_API_CONN_UPDATE) == TRUE) - { - return LL_ERROR_CODE_CMD_DISALLOWED; - } - if ((LL_API_PARAM_CHECK == 1) && ((handle >= pLctrRtCfg->maxConn) || !LctrIsConnHandleEnabled(handle))) @@ -317,9 +348,14 @@ uint8_t LlConnUpdate(uint16_t handle, const LlConnSpec_t *pConnSpec) return LL_ERROR_CODE_UNKNOWN_CONN_ID; } + if (LctrIsProcActPended(handle, LCTR_CONN_MSG_API_CONN_UPDATE) == TRUE) + { + return LL_ERROR_CODE_CMD_DISALLOWED; + } + if ((LL_API_PARAM_CHECK == 1) && ((LctrGetRole(handle) == LL_ROLE_SLAVE) && - ((LctrGetUsedFeatures(handle) & LL_FEAT_CONN_PARAM_REQ_PROC) == 0))) + ((lmgrCb.features & LL_FEAT_CONN_PARAM_REQ_PROC) == 0))) { return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -460,10 +496,6 @@ uint8_t LlReadRemoteVerInfo(uint16_t handle) LL_TRACE_INFO1("### LlApi ### LlReadRemoteVerInfo, handle=%u", handle); - if (LctrIsProcActPended(handle, LCTR_CONN_MSG_API_REMOTE_VERSION) == TRUE) - { - return LL_ERROR_CODE_CMD_DISALLOWED; - } if ((LL_API_PARAM_CHECK == 1) && ((handle >= pLctrRtCfg->maxConn) || @@ -472,6 +504,11 @@ uint8_t LlReadRemoteVerInfo(uint16_t handle) return LL_ERROR_CODE_UNKNOWN_CONN_ID; } + if (LctrIsProcActPended(handle, LCTR_CONN_MSG_API_REMOTE_VERSION) == TRUE) + { + return LL_ERROR_CODE_CMD_DISALLOWED; + } + if ((pMsg = (lctrMsgHdr_t *)WsfMsgAlloc(sizeof(*pMsg))) != NULL) { pMsg->handle = handle; @@ -502,11 +539,6 @@ uint8_t LlSetDataLen(uint16_t handle, uint16_t txLen, uint16_t txTime) { LL_TRACE_INFO1("### LlApi ### LlSetDataLen: handle=%u", handle); - if (LctrIsProcActPended(handle, LCTR_CONN_MSG_API_DATA_LEN_CHANGE) == TRUE) - { - return LL_ERROR_CODE_CMD_DISALLOWED; - } - if ((LL_API_PARAM_CHECK == 1) && ((handle >= pLctrRtCfg->maxConn) || !LctrIsConnHandleEnabled(handle))) @@ -514,6 +546,11 @@ uint8_t LlSetDataLen(uint16_t handle, uint16_t txLen, uint16_t txTime) return LL_ERROR_CODE_UNKNOWN_CONN_ID; } + if (LctrIsProcActPended(handle, LCTR_CONN_MSG_API_DATA_LEN_CHANGE) == TRUE) + { + return LL_ERROR_CODE_CMD_DISALLOWED; + } + if ((LL_API_PARAM_CHECK == 1) && ((txLen < LL_MAX_DATA_LEN_MIN) || (txLen > LL_MAX_DATA_LEN_ABS_MAX) || @@ -558,7 +595,8 @@ void LlReadDefaultDataLen(uint16_t *pMaxTxLen, uint16_t *pMaxTxTime) { LL_TRACE_INFO0("### LlApi ### LlReadDefaultDataLen"); - WSF_ASSERT(pMaxTxLen && pMaxTxTime); + WSF_ASSERT(pMaxTxLen); + WSF_ASSERT(pMaxTxTime); *pMaxTxLen = lmgrConnCb.maxTxLen; *pMaxTxTime = lmgrConnCb.maxTxTime; @@ -622,7 +660,8 @@ void LlReadMaximumDataLen(uint16_t *pMaxTxLen, uint16_t *pMaxTxTime, uint16_t *p { LL_TRACE_INFO0("### LlApi ### LlReadMaximumDataLen"); - WSF_ASSERT(pMaxTxLen && pMaxTxTime); + WSF_ASSERT(pMaxTxLen); + WSF_ASSERT(pMaxTxTime); *pMaxTxLen = WSF_MIN(pLctrRtCfg->maxAclLen, LCTR_MAX_DATA_LEN_MAX); *pMaxTxTime = LL_DATA_LEN_TO_TIME_1M(*pMaxTxLen); @@ -650,7 +689,7 @@ uint8_t LlSetLocalMinUsedChan(uint8_t phys, int8_t pwrThres, uint8_t minUsedCh) LL_TRACE_INFO0("### LlApi ### LlSetLocalMinUsedChan"); if ((LL_API_PARAM_CHECK == 1) && - (pLctrRtCfg->btVer <= LL_VER_BT_CORE_SPEC_4_2)) + ((lmgrCb.features & LL_FEAT_MIN_NUM_USED_CHAN) == 0)) { return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -729,7 +768,7 @@ uint8_t LlGetPeerMinUsedChan(uint16_t handle, uint8_t *pPeerMinUsedChan) result = LL_ERROR_CODE_UNKNOWN_CONN_ID; } else if ((LL_API_PARAM_CHECK == 1) && - ((pLctrRtCfg->btVer <= LL_VER_BT_CORE_SPEC_4_2) || + (((lmgrCb.features & LL_FEAT_MIN_NUM_USED_CHAN) == 0) || (LctrGetRole(handle) != LL_ROLE_MASTER))) { result = LL_ERROR_CODE_CMD_DISALLOWED; @@ -846,3 +885,113 @@ void LlRecvAclDataComplete(uint8_t numBufs) { LctrRxAclComplete(numBufs); } + +/*************************************************************************************************/ +/*! + * \brief Used to read the sleep clock accuracy of the peer device. + * + * \param handle Connection handle. + * + * \return Status error code. + */ +/*************************************************************************************************/ +uint8_t LlRequestPeerSca(uint16_t handle) +{ + lctrScaReq_t *pMsg; + + LL_TRACE_INFO1("### LlApi ### LlRequestPeerSca, handle=%u", handle); + + if ((LL_API_PARAM_CHECK == 1) && + ((handle >= pLctrRtCfg->maxConn) || + !LctrIsConnHandleEnabled(handle))) + { + return LL_ERROR_CODE_UNKNOWN_CONN_ID; + } + else if ((LL_API_PARAM_CHECK == 1) && + ((LctrGetUsedFeatures(handle) & LL_FEAT_SCA_UPDATE) == 0)) + { + return LL_ERROR_CODE_UNSUPPORTED_FEATURE_PARAM_VALUE; + } + + if ((pMsg = (lctrScaReq_t *)WsfMsgAlloc(sizeof(*pMsg))) != NULL) + { + pMsg->hdr.handle = handle; + pMsg->hdr.dispId = LCTR_DISP_CONN; + pMsg->hdr.event = LCTR_CONN_MSG_API_REQ_PEER_SCA; + pMsg->action = LL_MODIFY_SCA_NO_ACTION; + + WsfMsgSend(lmgrPersistCb.handlerId, pMsg); + } + + return LL_SUCCESS; +} + +/*************************************************************************************************/ +/*! + * \brief Modify the sleep clock accuracy + * + * \param action Increase or decrease the sleep clock accuracy + * + * \return Status error code. + */ +/*************************************************************************************************/ +uint8_t LlModifySleepClockAccuracy(uint8_t action) +{ + LL_TRACE_INFO1("### LlApi ### LlRequestPeerSca, Action=%u", action); + + uint8_t status = LL_SUCCESS; + lctrScaReq_t *pMsg; + + if ((LL_API_PARAM_CHECK == 1) && + (action > LL_MODIFY_SCA_LESS_ACCURATE)) + { + return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; + } + + if ((status = LctrValidateModifyScaParam(action)) != LL_SUCCESS) + { + LL_TRACE_WARN1("Modify SCA failed. Status=%u", status); + } + else /* status = LL_SUCCESS */ + { + /* Update lmgrCb sca for future connections. */ + switch(action) + { + case LL_MODIFY_SCA_MORE_ACCURATE: + lmgrCb.scaMod++; + break; + case LL_MODIFY_SCA_LESS_ACCURATE: + lmgrCb.scaMod--; + break; + + default: + break; + } + } + + /* We will send out the request even if we reach the limit, + * In case we need to update the connection's sca with the lmgr's sca. + */ + uint16_t handle; + for (handle = 0; handle < pLctrRtCfg->maxConn; handle++) + { + if (LctrIsConnHandleEnabled(handle)) + { + if ((LctrGetUsedFeatures(handle) & LL_FEAT_SCA_UPDATE) == 0) + { + continue; + } + + if ((pMsg = (lctrScaReq_t *)WsfMsgAlloc(sizeof(*pMsg))) != NULL) + { + pMsg->hdr.handle = handle; + pMsg->hdr.dispId = LCTR_DISP_CONN; + pMsg->hdr.event = LCTR_CONN_MSG_API_REQ_PEER_SCA; + pMsg->action = action; + WsfMsgSend(lmgrPersistCb.handlerId, pMsg); + } + } + } + + return status; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn_master.c index ffb4949c2f..359a031758 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) slave parameter interface implementation file. + * \file + * \brief Link layer (LL) slave parameter interface implementation file. */ /*************************************************************************************************/ @@ -33,62 +34,6 @@ #include "util/bstream.h" #include -/*************************************************************************************************/ -/*! - * \brief Set channel class. - * - * \param pChanMap Channel map (0=bad, 1=usable). - * - * \return Status error code. - * - * Set the channel class. At least 2 bits must be set. - */ -/*************************************************************************************************/ -uint8_t LlSetChannelClass(const uint8_t *pChanMap) -{ - lctrChanMapUpdate_t *pMsg; - uint64_t chanMap; - uint16_t handle; - - LL_TRACE_INFO0("### LlApi ### LlSetChannelClass"); - - BSTREAM_TO_UINT40(chanMap, pChanMap); - - if ((LL_API_PARAM_CHECK == 1) && - ((LlMathGetNumBitsSet(chanMap) < 2) || - ((chanMap & ~LL_CHAN_DATA_ALL) != 0))) - { - return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; - } - - lmgrMstScanCb.chanClass = chanMap; - - for (handle = 0; handle < pLctrRtCfg->maxConn; handle++) - { - if ((LctrIsConnHandleEnabled(handle)) && - (LctrGetRole(handle) == LL_ROLE_MASTER)) - { - if (LctrIsProcActPended(handle, LCTR_CONN_MSG_API_CHAN_MAP_UPDATE) == TRUE) - { - return LL_ERROR_CODE_CMD_DISALLOWED; - } - - if ((pMsg = (lctrChanMapUpdate_t *)WsfMsgAlloc(sizeof(*pMsg))) != NULL) - { - pMsg->hdr.handle = handle; - pMsg->hdr.dispId = LCTR_DISP_CONN; - pMsg->hdr.event = LCTR_CONN_MSG_API_CHAN_MAP_UPDATE; - - pMsg->chanMap = chanMap; - - WsfMsgSend(lmgrPersistCb.handlerId, pMsg); - } - } - } - - return LL_SUCCESS; -} - /*************************************************************************************************/ /*! * \brief Set connection's channel map. @@ -127,7 +72,7 @@ uint8_t LlSetChannelMap(uint16_t handle, const uint8_t *pChanMap) } BSTREAM_TO_UINT64(chanMap, pChanMap); - chanMap &= lmgrMstScanCb.chanClass; + chanMap &= lmgrCb.chanClass; if ((LL_API_PARAM_CHECK == 1) && (LlMathGetNumBitsSet(chanMap) < 2)) @@ -180,6 +125,7 @@ uint8_t LlCreateConn(const LlInitParam_t *pInitParam, const LlConnSpec_t *pConnS if ((LL_API_PARAM_CHECK == 1) && !LmgrIsLegacyCommandAllowed()) { + LL_TRACE_WARN0("Extended Advertising/Scanning operation enabled; legacy commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn_master_ae.c index 5764ed3c01..ddecd4a5cf 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) master extended control interface implementation file. + * \file + * \brief Link layer (LL) master extended control interface implementation file. */ /*************************************************************************************************/ @@ -29,6 +30,50 @@ #include "wsf_trace.h" #include "util/bstream.h" +/*************************************************************************************************/ +/*! + * \brief Validate Connection spec parameters + * + * \param pConnSpec + * + * \return TRUE if valid, FALSE otherwise. + */ +/*************************************************************************************************/ +static bool_t llValidateConnSpecParams(const LlConnSpec_t *pParam) +{ + /* Connection interval. */ + if ((LL_API_PARAM_CHECK == 1) && + ((pParam->connIntervalMin > pParam->connIntervalMax) || + (pParam->connIntervalMax < pParam->connIntervalMin) || + (pParam->connIntervalMax < HCI_CONN_INTERVAL_MIN) || + (pParam->connIntervalMin < HCI_CONN_INTERVAL_MIN) || + (pParam->connIntervalMax > HCI_CONN_INTERVAL_MAX) || + (pParam->connIntervalMin > HCI_CONN_INTERVAL_MAX) )) + { + return FALSE; + } + + /* Connection latency. */ + if ((LL_API_PARAM_CHECK == 1) && + ((pParam->connLatency > HCI_CONN_LATENCY_MAX))) + { + return FALSE; + } + + /* Supervision timeout. */ + uint32_t supTimeoutMin = ((uint32_t) pParam->connLatency + 1) * LL_CONN_INTERVAL_VAL_TO_US((uint32_t) pParam->connIntervalMax) * 2; + uint32_t supTimeoutUs = LL_SUP_TIMEOUT_VAL_TO_US((uint32_t) pParam->supTimeout); + if ((LL_API_PARAM_CHECK == 1) && + ((supTimeoutUs <= supTimeoutMin) || + (pParam->supTimeout < HCI_SUP_TIMEOUT_MIN) || + (pParam->supTimeout > HCI_SUP_TIMEOUT_MAX))) + { + return FALSE; + } + + return TRUE; +} + /*************************************************************************************************/ /*! * \brief Validate extended initiate parameters. @@ -40,7 +85,7 @@ /*************************************************************************************************/ static bool_t llValidateInitiateParams(const LlExtInitParam_t *pParam) { - const uint8_t filtPolicyMax = ((lmgrCb.features & LL_FEAT_EXT_SCAN_FILT_POLICY) != 0) ? LL_SCAN_FILTER_WL_OR_RES_INIT : LL_SCAN_FILTER_WL_BIT; + const uint8_t filtPolicyMax = LL_INIT_FILTER_TOTAL - 1; const uint8_t addrTypeMax = ((lmgrCb.features & LL_FEAT_PRIVACY) != 0) ? LL_ADDR_RANDOM_IDENTITY : LL_ADDR_RANDOM; if ((LL_API_PARAM_CHECK == 1) && @@ -97,6 +142,10 @@ uint8_t LlExtCreateConn(const LlExtInitParam_t *pInitParam, const LlExtInitScanP const uint8_t validInitPhys = LL_PHYS_LE_1M_BIT | LL_PHYS_LE_2M_BIT | LL_PHYS_LE_CODED_BIT; const uint8_t numInitPhyBits = LlMathGetNumBitsSet(pInitParam->initPhys); + uint8_t supportedPhys = LL_PHYS_LE_1M_BIT; + supportedPhys |= (lmgrCb.features & LL_FEAT_LE_2M_PHY) ? LL_PHYS_LE_2M_BIT : 0; + supportedPhys |= (lmgrCb.features & LL_FEAT_LE_CODED_PHY) ? LL_PHYS_LE_CODED_BIT : 0; + LL_TRACE_INFO1("### LlApi ### LlExtCreateConn: initPhys=0x%02x", pInitParam->initPhys); WSF_ASSERT(pInitParam); /* not NULL */ @@ -105,6 +154,7 @@ uint8_t LlExtCreateConn(const LlExtInitParam_t *pInitParam, const LlExtInitScanP (!LmgrIsExtCommandAllowed() || lmgrCb.numInitEnabled)) { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); return LL_ERROR_CODE_CMD_DISALLOWED; } @@ -114,6 +164,13 @@ uint8_t LlExtCreateConn(const LlExtInitParam_t *pInitParam, const LlExtInitScanP return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; } + if ((LL_API_PARAM_CHECK == 1) && + ((pInitParam->initPhys & supportedPhys) != pInitParam->initPhys)) + { + LL_TRACE_WARN0("Unsupported PHY bit was set."); + return LL_ERROR_CODE_UNSUPPORTED_FEATURE_PARAM_VALUE; + } + if ((LL_API_PARAM_CHECK == 1) && (!llValidateInitiateParams(pInitParam))) { @@ -124,7 +181,7 @@ uint8_t LlExtCreateConn(const LlExtInitParam_t *pInitParam, const LlExtInitScanP { for (unsigned int i = 0; i < numInitPhyBits; i++) { - if (!llValidateInitiateScanParams(&scanParam[i])) + if ((!llValidateConnSpecParams(&connSpec[i])) || (!llValidateInitiateScanParams(&scanParam[i]))) { return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn_slave.c index 4606d8bae1..606295b568 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_conn_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) slave control interface implementation file. + * \file + * \brief Link layer (LL) slave control interface implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_diag.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_diag.c index f30515a9b8..fc715e18f2 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_diag.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_diag.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,14 +16,15 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) test interface implementation file. + * \file + * \brief Link layer (LL) test interface implementation file. */ /*************************************************************************************************/ #include "ll_api.h" #include "lmgr_api.h" #include "bb_api.h" -#include "bb_drv.h" +#include "pal_bb.h" /*************************************************************************************************/ /*! @@ -50,7 +51,7 @@ uint8_t LlGetTime(uint32_t *pTime) return LL_ERROR_CODE_CMD_DISALLOWED; } - *pTime = BbDrvGetCurrentTime(); + *pTime = PalBbGetCurrentTime(USE_RTC_BB_CLK); return LL_SUCCESS; } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_dtm.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_dtm.c index 338964f82f..236e2edb94 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_dtm.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_dtm.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) DTM interface implementation file. + * \file + * \brief Link layer (LL) DTM interface implementation file. */ /*************************************************************************************************/ @@ -28,7 +29,7 @@ #include "bb_api.h" #include "bb_ble_api.h" #include "bb_ble_api_op.h" -#include "bb_ble_drv.h" +#include "pal_bb_ble.h" #include "wsf_buf.h" #include "wsf_cs.h" #include "wsf_math.h" @@ -272,7 +273,7 @@ static void llTestTxOpEndCback(BbOpDesc_t *pOp) llTestCb.rpt.numTx++; - if ((llTestCb.numPkt > 0) && (llTestCb.numPkt == llTestCb.rpt.numTx)) + if ((llTestCb.numPkt > 0) && (llTestCb.numPkt <= llTestCb.rpt.numTx)) { /* Auto terminate. */ LlEndTest(NULL); @@ -353,7 +354,7 @@ static bool_t llTestTxCb(BbOpDesc_t *pOp, uint8_t status) llTestCb.rpt.numTx++; /* All of the requested packets have been sent. */ - if ((llTestCb.numPkt > 0) && (llTestCb.numPkt == llTestCb.rpt.numTx)) + if ((llTestCb.numPkt > 0) && (llTestCb.numPkt <= llTestCb.rpt.numTx)) { return FALSE; } @@ -898,11 +899,16 @@ uint8_t LlEndTest(LlTestReport_t *pRpt) return LL_SUCCESS; } - if ((llTestCb.state == LL_TEST_STATE_TX) || (llTestCb.state == LL_TEST_STATE_RX)) + if (llTestCb.state == LL_TEST_STATE_TX) { /* Signal termination. */ llTestCb.state = LL_TEST_STATE_TERM; + } + else if (llTestCb.state == LL_TEST_STATE_RX) + { + /* Signal termination. */ BbCancelBod(); + llTestCb.state = LL_TEST_STATE_TERM; } else { diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_enc_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_enc_master.c index ce68e5316b..d21ca0fb9d 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_enc_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_enc_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) slave control interface implementation file. + * \file + * \brief Link layer (LL) slave control interface implementation file. */ /*************************************************************************************************/ @@ -53,6 +54,11 @@ uint8_t LlStartEncryption(uint16_t handle, const uint8_t *pRand, uint16_t divers return LL_ERROR_CODE_CMD_DISALLOWED; } + if (LctrIsCisEnabled(handle) == TRUE) + { + return LL_ERROR_CODE_CMD_DISALLOWED; + } + if ((LL_API_PARAM_CHECK == 1) && ((handle >= pLctrRtCfg->maxConn) || !LctrIsConnHandleEnabled(handle))) diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_enc_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_enc_slave.c index 964f7e9bed..d47e843fb9 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_enc_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_enc_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) slave control interface implementation file. + * \file + * \brief Link layer (LL) slave control interface implementation file. */ /*************************************************************************************************/ @@ -25,6 +26,7 @@ #include "ll_math.h" #include "wsf_msg.h" #include "wsf_trace.h" +#include "pal_crypto.h" #include /*************************************************************************************************/ @@ -43,7 +45,7 @@ uint8_t LlEncrypt(uint8_t *pKey, uint8_t *pData) { LL_TRACE_INFO0("### LlApi ### LlEncrypt"); - LlMathAesEcb(pKey, pData, pData); + PalCryptoAesEcb(pKey, pData, pData); return LL_SUCCESS; } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_past.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_past.c new file mode 100644 index 0000000000..556beec205 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_past.c @@ -0,0 +1,203 @@ +/* Copyright (c) 2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*************************************************************************************************/ +/*! + * \file + * \brief Link layer (LL) Periodic advertising sync transfer interface implementation file. + */ +/*************************************************************************************************/ + +#include "lmgr_api.h" +#include "lctr_api_adv_slave_ae.h" +#include "lmgr_api_conn.h" +#include "lctr_api_conn.h" +#include "lctr_api_adv_master_ae.h" +#include "wsf_msg.h" +#include "wsf_trace.h" + +/*************************************************************************************************/ +/*! + * \brief Enable or disable reports for the periodic advertising sync. + * + * \param syncHandle Periodic sync handle. + * \param enable 1 to enable reports, 0 to disable reports. + * + * \return Status error code. + * + * Enable or disable reports for the periodic advertising sync. + */ +/*************************************************************************************************/ +uint8_t LlSetPeriodicAdvRcvEnable(uint16_t syncHandle, uint8_t enable) +{ + LL_TRACE_INFO2("### LlApi ### LlSetPeriodicAdvRcvEnable: syncHandle=%u, enable=%u", syncHandle, enable); + + if ((LL_API_PARAM_CHECK == 1) && + !LmgrIsExtCommandAllowed()) + { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); + return LL_ERROR_CODE_CMD_DISALLOWED; + } + + if ((LL_API_PARAM_CHECK == 1) && + syncHandle > LL_SYNC_MAX_HANDLE) + { + return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; + } + + if ((LL_API_PARAM_CHECK == 1) && + !lctrMstPerIsSyncHandleValid(syncHandle)) + { + return LL_ERROR_CODE_UNKNOWN_ADV_ID; + } + + LctrMstPerSetRcvEnable (syncHandle, (bool_t)enable); + + return LL_SUCCESS; +} + +/*************************************************************************************************/ +/*! + * \brief Send sync info about periodic advertising to a connected device. + * + * \param connHandle Connection handle. + * \param serviceData Service data provided by the host. + * \param syncHandle Periodic sync handle. + * + * \return Status error code. + * + * Send sync info about about periodic advertising to a connected device. + */ +/*************************************************************************************************/ +uint8_t LlPeriodicAdvSyncTransfer(uint16_t connHandle, uint16_t serviceData, uint16_t syncHandle) +{ + LL_TRACE_INFO2("### LlApi ### LlPeriodicAdvSyncTransfer: connHandle=%u, syncHandle=%u", connHandle, syncHandle); + + if ((LL_API_PARAM_CHECK == 1) && + !LmgrIsExtCommandAllowed()) + { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); + return LL_ERROR_CODE_CMD_DISALLOWED; + } + + return LctrPeriodicAdvSyncTransfer (connHandle, serviceData, syncHandle); +} + +/*************************************************************************************************/ +/*! + * \brief Send sync info about periodic adv in an advertising set to a connected device. + * + * \param connHandle Connection handle. + * \param serviceData Service data provided by the host. + * \param advHandle Handle to identify an advertising set. + * + * \return Status error code. + * + * Send sync info about periodic adv in an advertising set to a connected device. + */ +/*************************************************************************************************/ +uint8_t LlPeriodicAdvSetInfoTransfer(uint16_t connHandle, uint16_t serviceData, uint8_t advHandle) +{ + LL_TRACE_INFO2("### LlApi ### LlPeriodicAdvSetInfoTransfer: connHandle=%u, advHandle=%u", connHandle, advHandle); + + if ((LL_API_PARAM_CHECK == 1) && + !LmgrIsExtCommandAllowed()) + { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); + return LL_ERROR_CODE_CMD_DISALLOWED; + } + + return LctrPeriodicAdvSetInfoTransfer(connHandle, serviceData, advHandle); +} + +/*************************************************************************************************/ +/*! + * \brief Set periodic advertising sync transfer parameters. + * + * \param connHandle Connection handle. + * \param mode Periodic sync advertising sync transfer mode. + * \param skip The number of periodic advertising packets that can be skipped after a successful receive. + * \param syncTimeout Synchronization timeout for the periodic advertising. + * \param cteType Constant tone extension type(Used in AoD/AoA). + * + * \return Status error code. + * + * Set periodic advertising sync transfer parameters. + */ +/*************************************************************************************************/ +uint8_t LlSetPeriodicAdvSyncTransParams(uint16_t connHandle, uint8_t mode, uint16_t skip, uint16_t syncTimeout, uint8_t cteType) +{ + LL_TRACE_INFO3("### LlApi ### LlSetPeriodicAdvSyncTransParams: connHandle=%u, mode=%u, skip=%u", connHandle, mode, skip); + + if ((LL_API_PARAM_CHECK == 1) && + !LmgrIsExtCommandAllowed()) + { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); + return LL_ERROR_CODE_CMD_DISALLOWED; + } + + if ((LL_API_PARAM_CHECK == 1) && + ((mode > LL_SYNC_TRSF_MAX_MODE) || + (skip > LL_SYNC_MAX_SKIP) || + (syncTimeout > LL_SYNC_MAX_TIMEOUT) || + (syncTimeout < LL_SYNC_MIN_TIMEOUT))) + { + return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; + } + + return LctrSetPeriodicAdvSyncTransParams(connHandle, mode, skip, syncTimeout, cteType); +} + +/*************************************************************************************************/ +/*! + * \brief Set default periodic advertising sync transfer parameters. + * + * \param mode Periodic sync advertising sync transfer mode. + * \param skip The number of periodic advertising packets that can be skipped after a successful receive. + * \param syncTimeout Synchronization timeout for the periodic advertising. + * \param cteType Constant tone extension type(Used in AoD/AoA). + * + * \return Status error code. + * + * Set default periodic advertising sync transfer parameters. + */ +/*************************************************************************************************/ +uint8_t LlSetDefaultPeriodicAdvSyncTransParams(uint8_t mode, uint16_t skip, uint16_t syncTimeout, uint8_t cteType) +{ + LL_TRACE_INFO3("### LlApi ### LlSetDefaultPeriodicAdvSyncTransParams: mode=%u, skip=%u, syncTimeout=%u", mode, skip, syncTimeout); + + if ((LL_API_PARAM_CHECK == 1) && + !LmgrIsExtCommandAllowed()) + { + LL_TRACE_WARN0("Legacy Advertising/Scanning operation enabled; extended commands not available"); + return LL_ERROR_CODE_CMD_DISALLOWED; + } + + if ((LL_API_PARAM_CHECK == 1) && + ((mode > LL_SYNC_TRSF_MAX_MODE) || + (skip > LL_SYNC_MAX_SKIP) || + (syncTimeout > LL_SYNC_MAX_TIMEOUT) || + (syncTimeout < LL_SYNC_MIN_TIMEOUT))) + { + return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; + } + + lmgrConnCb.syncMode = mode; + lmgrConnCb.syncSkip = skip; + lmgrConnCb.syncTimeout = syncTimeout; + + return LL_SUCCESS; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_phy.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_phy.c index 227230aa15..ef70602aee 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_phy.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_phy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) PHY features control interface implementation file. + * \file + * \brief Link layer (LL) PHY features control interface implementation file. */ /*************************************************************************************************/ @@ -65,20 +66,56 @@ uint8_t LlReadPhy(uint16_t handle, uint8_t *pTxPhy, uint8_t *pRxPhy) * \param rxPhys Preferred receiver PHYs. * \param phyOptions PHY options. * - * \return TRUE if PHY preferences are valid. + * \return LL_SUCCESS if PHY preferences are valid, error code otherwise. */ /*************************************************************************************************/ -static bool_t llValidatePhyPreferences(uint8_t allPhys, uint8_t txPhys, uint8_t rxPhys, uint16_t phyOptions) +static uint8_t llValidatePhyPreferences(uint8_t allPhys, uint8_t txPhys, uint8_t rxPhys, uint16_t phyOptions) { const uint8_t allPhysMask = LL_ALL_PHY_TX_PREFERENCE_BIT | LL_ALL_PHY_RX_PREFERENCE_BIT; const uint8_t phyMask = LL_PHYS_LE_1M_BIT | LL_PHYS_LE_2M_BIT | LL_PHYS_LE_CODED_BIT; - if (((allPhys & ~allPhysMask) != 0) || /* no unknown all PHYs preferences */ - ((txPhys & ~phyMask) != 0) || /* no unknown Tx PHYs */ - ((rxPhys & ~phyMask) != 0) || /* no unknown Rx PHYs */ - (((allPhys & LL_ALL_PHY_TX_PREFERENCE_BIT) == 0) && (txPhys == 0)) || /* at least one Tx PHY if preference */ - (((allPhys & LL_ALL_PHY_RX_PREFERENCE_BIT) == 0) && (rxPhys == 0)) || /* at least one Rx PHY if preference */ - (phyOptions > LL_PHY_OPTIONS_S8_PREFERRED)) /* no unknown PHY options */ + if (((allPhys & ~allPhysMask) != 0) || /* no unknown all PHYs preferences */ + ((txPhys & ~phyMask) != 0) || /* no unknown Tx PHYs */ + ((rxPhys & ~phyMask) != 0) || /* no unknown Rx PHYs */ + (phyOptions > LL_PHY_OPTIONS_S8_PREFERRED)) /* no unknown PHY options */ + { + /* Error code is unsupported feature because RFU bits of the parameters are considered as valid. */ + return LL_ERROR_CODE_UNSUPPORTED_FEATURE_PARAM_VALUE; + } + else if ((BB_SYM_PHY_REQ || lmgrGetOpFlag(LL_OP_MODE_FLAG_REQ_SYM_PHY)) && + (allPhys == LL_ALL_PHY_ALL_PREFERENCES) && (txPhys != rxPhys)) + { + return LL_ERROR_CODE_UNSUPPORTED_FEATURE_PARAM_VALUE; + } + else if ((((allPhys & LL_ALL_PHY_TX_PREFERENCE_BIT) == 0) && (txPhys == 0)) || /* at least one Tx PHY if preference */ + (((allPhys & LL_ALL_PHY_RX_PREFERENCE_BIT) == 0) && (rxPhys == 0))) /* at least one Rx PHY if preference */ + { + return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; + } + + return LL_SUCCESS; +} + +/*************************************************************************************************/ +/*! + * \brief Validate if specified PHYs are supported by LL. + * + * \param txPhys Preferred transmitter PHYs. + * \param rxPhys Preferred receiver PHYs. + * + * \return TRUE if all specified PHYs are supported. + */ +/*************************************************************************************************/ +static bool_t llValidatePhySupport(uint8_t txPhys, uint8_t rxPhys) +{ + if (((lmgrCb.features & LL_FEAT_LE_2M_PHY) == 0) && + ((txPhys & LL_PHYS_LE_2M_BIT) || (rxPhys & LL_PHYS_LE_2M_BIT))) + { + return FALSE; + } + + if (((lmgrCb.features & LL_FEAT_LE_CODED_PHY) == 0) && + ((txPhys & LL_PHYS_LE_CODED_BIT) || (rxPhys & LL_PHYS_LE_CODED_BIT))) { return FALSE; } @@ -86,27 +123,6 @@ static bool_t llValidatePhyPreferences(uint8_t allPhys, uint8_t txPhys, uint8_t return TRUE; } -/*************************************************************************************************/ -/*! - * \brief Determine supported PHYs. - * - * \return Supported PHYs. - */ -/*************************************************************************************************/ -static uint8_t lctrSuppPhys(void) -{ - uint8_t phys = LL_PHYS_LE_1M_BIT; - if ((lmgrCb.features & LL_FEAT_LE_2M_PHY) != 0) - { - phys |= LL_PHYS_LE_2M_BIT; - } - if ((lmgrCb.features & LL_FEAT_LE_CODED_PHY) != 0) - { - phys |= LL_PHYS_LE_CODED_BIT; - } - return phys; -} - /*************************************************************************************************/ /*! * \brief Set default PHYs. @@ -123,16 +139,19 @@ static uint8_t lctrSuppPhys(void) /*************************************************************************************************/ uint8_t LlSetDefaultPhy(uint8_t allPhys, uint8_t txPhys, uint8_t rxPhys) { + uint8_t status; + LL_TRACE_INFO0("### LlApi ### LlSetDefaultPhy"); - /* Ignore unsupported PHYs. */ - txPhys &= lctrSuppPhys(); - rxPhys &= lctrSuppPhys(); + if (!llValidatePhySupport(txPhys, rxPhys)) + { + return LL_ERROR_CODE_UNSUPPORTED_FEATURE_PARAM_VALUE; + } if ((LL_API_PARAM_CHECK == 1) && - !llValidatePhyPreferences(allPhys, txPhys, rxPhys, LL_PHY_OPTIONS_NONE)) + ((status = llValidatePhyPreferences(allPhys, txPhys, rxPhys, LL_PHY_OPTIONS_NONE)) != LL_SUCCESS)) { - return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; + return status; } /* Discard Tx or Rx PHYs value without preference. */ @@ -172,29 +191,31 @@ uint8_t LlSetDefaultPhy(uint8_t allPhys, uint8_t txPhys, uint8_t rxPhys) uint8_t LlSetPhy(uint16_t handle, uint8_t allPhys, uint8_t txPhys, uint8_t rxPhys, uint16_t phyOptions) { lctrPhyUpdate_t *pMsg; + uint8_t status; LL_TRACE_INFO1("### LlApi ### LlSetPhy, handle=%u", handle); + if ((LL_API_PARAM_CHECK == 1) && + ((handle >= pLctrRtCfg->maxConn) || + !LctrIsConnHandleEnabled(handle))) + { + return LL_ERROR_CODE_UNKNOWN_CONN_ID; + } + if (LctrIsProcActPended(handle, LCTR_CONN_MSG_API_PHY_UPDATE) == TRUE) { return LL_ERROR_CODE_CMD_DISALLOWED; } - /* Ignore unsupported PHYs. */ - txPhys &= lctrSuppPhys(); - rxPhys &= lctrSuppPhys(); - - if ((LL_API_PARAM_CHECK == 1) && - !llValidatePhyPreferences(allPhys, txPhys, rxPhys, phyOptions)) + if (!llValidatePhySupport(txPhys, rxPhys)) { - return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; + return LL_ERROR_CODE_UNSUPPORTED_FEATURE_PARAM_VALUE; } if ((LL_API_PARAM_CHECK == 1) && - ((handle >= pLctrRtCfg->maxConn) || - !LctrIsConnHandleEnabled(handle))) + ((status = llValidatePhyPreferences(allPhys, txPhys, rxPhys, phyOptions)) != LL_SUCCESS)) { - return LL_ERROR_CODE_UNKNOWN_CONN_ID; + return status; } /* Discard Tx or Rx PHYs value without preference. */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_priv.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_priv.c index 24ea19126a..9fe0938fa9 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_priv.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_priv.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) privacy control interface implementation file. + * \file + * \brief Link layer (LL) privacy control interface implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_sc.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_sc.c index 7faab76af2..b5c8a52358 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_sc.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_main_sc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link layer (LL) secure connections control interface file. + * \file + * \brief Link layer (LL) secure connections control interface file. */ /*************************************************************************************************/ @@ -24,6 +25,7 @@ #include "lmgr_api_sc.h" #include "lctr_api.h" #include "ll_api.h" +#include "hci_defs.h" #include "lctr_api_sc.h" #include "wsf_assert.h" #include "wsf_msg.h" @@ -74,6 +76,42 @@ uint8_t LlGenerateDhKey(const uint8_t pubKey_x[LL_ECC_KEY_LEN], const uint8_t pu return LctrGenerateDhKey(pubKey, privKey); } +/*************************************************************************************************/ +/*! + * \brief Generate a Diffie-Hellman key. + * + * \param pubKey_x Remote public key x-coordinate. + * \param pubKey_y Remote public key y-coordinate. + * \param keyType Debug enable + * + * \return Status error code. + * + * Generate a Diffie-Hellman key from a remote public key and the local private key. If another + * ECC operation (P-256 key pair generation or Diffie-Hellman key generation) is ongoing, an error + * will be returned. If keyType == HCI_PRIVATE_KEY_DEBUG, debug keys will be used. + */ +/*************************************************************************************************/ +uint8_t LlGenerateDhKeyV2(uint8_t pubKey_x[LL_ECC_KEY_LEN], uint8_t pubKey_y[LL_ECC_KEY_LEN], uint8_t keyType) +{ + + if (keyType == HCI_PRIVATE_KEY_DEBUG) + { + LL_TRACE_INFO0("Using Debug keys for DHKey generation"); + return LctrGenerateDebugDhKey(); + } + else + { + uint8_t pubKey[LL_ECC_KEY_LEN * 2]; + uint8_t privKey[LL_ECC_KEY_LEN]; + + memcpy(pubKey, pubKey_x, LL_ECC_KEY_LEN); + memcpy(pubKey + LL_ECC_KEY_LEN, pubKey_y, LL_ECC_KEY_LEN); + memcpy(privKey, lmgrScCb.privKey, LL_ECC_KEY_LEN); + + return LctrGenerateDhKey(pubKey, privKey); + } +} + /*************************************************************************************************/ /*! * \brief Set P-256 private key for debug purposes. @@ -112,3 +150,23 @@ uint8_t LlSetP256PrivateKey(const uint8_t privKey[LL_ECC_KEY_LEN]) return LL_SUCCESS; } + +/*************************************************************************************************/ +/*! + * \brief Set validate public key mode. + * + * \param validateMode ALT1 or ALT2. + * + * \return Status error code. + * + */ +/*************************************************************************************************/ +uint8_t LlSetValidatePublicKeyMode(uint8_t validateMode) +{ + if (validateMode > KEY_VALIDATE_MODE_MAX) + { + return LL_ERROR_CODE_INVALID_HCI_CMD_PARAMS; + } + + return LctrSetValidatePublicKeyMode(validateMode); +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_math.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_math.c index 36002d1981..d06c1162c7 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_math.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/ll/ll_math.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Common math utilities generic implementation file. + * \file + * \brief Common math utilities generic implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_events.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_events.c index f1f8a3525f..0f31a09a88 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_events.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_events.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link controller manager event implementation file. + * \file + * \brief Link controller manager event implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main.c index eb88464d32..05c1f8293f 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,12 +16,15 @@ /*************************************************************************************************/ /*! - * \brief Link manager common implementation file. + * \file + * \brief Link manager common implementation file. */ /*************************************************************************************************/ - +#include "ll_math.h" #include "lmgr_api.h" +#include "lhci_api.h" #include "wsf_assert.h" +#include "wsf_math.h" #include /************************************************************************************************** @@ -70,12 +73,21 @@ void LmgrSetDefaults(void) /* LL_OP_MODE_FLAG_REQ_SYM_PHY | */ /* disabled */ /* LL_OP_MODE_FLAG_ENA_FEAT_LLCP_STARTUP | */ /* disabled */ /* LL_OP_MODE_FLAG_SLV_DELAY_LLCP_STARTUP | */ /* disabled */ + LL_OP_MODE_FLAG_ENA_SLV_LATENCY_WAKEUP | LL_OP_MODE_FLAG_ENA_LEN_LLCP_STARTUP | LL_OP_MODE_FLAG_ENA_ADV_DLY | LL_OP_MODE_FLAG_ENA_SCAN_BACKOFF | LL_OP_MODE_FLAG_ENA_WW | LL_OP_MODE_FLAG_ENA_SLV_LATENCY | + LL_OP_MODE_FLAG_ENA_SLV_AUX_SCAN_RSP_ADI | + LL_OP_MODE_FLAG_ENA_MST_CIS_NULL_PDU | + /* LL_OP_MODE_FLAG_ENA_SLV_AUX_IND_ADVA | */ /* disabled */ + LL_OP_MODE_FLAG_ENA_ADV_CHAN_RAND | LL_OP_MODE_FLAG_ENA_LLCP_TIMER; + + LhciSetDefaultHciSupCmd(lmgrCb.hciSupCommands); + + lmgrCb.chanClass = LL_CHAN_DATA_ALL; } /*************************************************************************************************/ @@ -224,3 +236,192 @@ bool_t LmgrIsExtCommandAllowed(void) lmgrCb.useExtCmds = TRUE; return TRUE; } + +/*************************************************************************************************/ +/*! + * \brief Build channel remapping table. + * + * \param pChanParam Channel parameters. + * + * \return None. + */ +/*************************************************************************************************/ +void LmgrBuildRemapTable(lmgrChanParam_t *pChanParam) +{ + unsigned int chanIdx; + unsigned int numUsedChan = 0; + + for (chanIdx = 0; chanIdx < sizeof(pChanParam->chanRemapTbl); chanIdx++) + { + if (pChanParam->chanMask & (UINT64_C(1) << chanIdx)) + { + pChanParam->chanRemapTbl[numUsedChan++] = chanIdx; + } + } + + WSF_ASSERT(numUsedChan); /* must have at least one channel */ + + pChanParam->numUsedChan = numUsedChan; +} + +/*************************************************************************************************/ +/*! + * \brief Calculate permutation. + * + * \param v Input value. + * + * \return Result of permutation calculation. + */ +/*************************************************************************************************/ +static inline uint32_t lmgrCalcPerm(uint32_t v) +{ + uint32_t mask; + + /* abcd efgh ijkl mnop */ + mask = 0x0F0F0F0F; + v = ((v << 8) & mask) | (v & ~mask); + + /* efgh abcd mnop ijkl xxxx */ + mask = mask ^ (mask << 2); + v = ((v << 4) & mask) | (v & ~mask); + + /* gh efcd abop mnkl ijxx xxxx */ + mask = mask ^ (mask << 1); + v = ((v << 2) & mask) | (v & ~mask); + + /* hgf edcb apon mlkj ixxx xxxx */ + return v >> 7; +} + +/*************************************************************************************************/ +/*! + * \brief Calculate MAM (Multiply, Add, Modulo). + * + * \param a Input value a. + * \param b Input value b. + * + * \return Result of MAM. + */ +/*************************************************************************************************/ +static inline uint16_t lmgrCalcMAM(uint16_t a, uint16_t b) +{ + /* (17 x a + b) mod 2^16 */ + return ((17 * a) + b) & 0xFFFFF; +} + +/*************************************************************************************************/ +/*! + * \brief Compute next channel index, algorithm #2. + * + * \param pChanParam Channel parameters. + * \param eventCounter Event Counter. + * \param numSkip Number of skip. + * \param calSubEvt TRUE if calculation of subevent is needed. + * + * \return Next data channel index. + */ +/*************************************************************************************************/ +uint8_t LmgrSelectNextChannel(lmgrChanParam_t *pChanParam, uint16_t eventCounter, uint16_t numSkip, bool_t calSubEvt) +{ + unsigned int prn; + + /* Ignore parameter since eventCounter is adjusted by client. */ + (void)numSkip; + + /* Pseudo random number */ + + prn = eventCounter ^ pChanParam->chIdentifier; + prn = lmgrCalcPerm(prn); + prn = lmgrCalcMAM(prn, pChanParam->chIdentifier); + prn = lmgrCalcPerm(prn); + prn = lmgrCalcMAM(prn, pChanParam->chIdentifier); + prn = lmgrCalcPerm(prn); + prn = lmgrCalcMAM(prn, pChanParam->chIdentifier); + + pChanParam->prnLast = prn; /* Used by subevent only. */ + + unsigned int prn_e = prn ^ pChanParam->chIdentifier; + + /* unmappedChannel */ + + uint16_t unmapChan = LL_MATH_MOD_37(prn_e & 0xFFFF); + + pChanParam->lastChanIdx = unmapChan; + + /* remappingIndex */ + + if (!((UINT64_C(1) << unmapChan) & pChanParam->chanMask)) + { + /* remappingIndex = (N * prn_e) / 2^16 */ + uint8_t remapIdx = (pChanParam->numUsedChan * prn_e) >> 16; + if (calSubEvt) + { + pChanParam->subEvtIdx = remapIdx; + } + return pChanParam->chanRemapTbl[remapIdx]; + } + else + { + if (calSubEvt) + { + for (unsigned int chanIdx = 0; chanIdx < sizeof(pChanParam->chanRemapTbl); chanIdx++) + { + if (pChanParam->chanRemapTbl[chanIdx] == unmapChan) + { + pChanParam->subEvtIdx = chanIdx; + break; + } + } + } + } + + return unmapChan; +} + +/*************************************************************************************************/ +/*! + * \brief Compute next subevent channel index, algorithm #2. + * + * \param pChanParam Channel parameters. + * + * \return Next data channel index. + */ +/*************************************************************************************************/ +uint8_t LmgrSelectNextSubEvtChannel(lmgrChanParam_t *pChanParam) +{ + uint16_t prn = pChanParam->prnLast; + uint8_t subEvtIdx = pChanParam->subEvtIdx; + uint8_t d; + + /* Subevent pseudo random number generator. */ + prn = lmgrCalcPerm(prn); + prn = lmgrCalcMAM(prn, pChanParam->chIdentifier); /* prn is prnSubEvent_lu*/ + + pChanParam->prnLast = prn; + + prn = prn ^ pChanParam->chIdentifier; /* prn is prnSubEvent_se */ + + /* Subevent mapped to used channel index. */ + /* d = max(1, max(min(3, N-5), min(11, (N-10)/2))) */ + d = WSF_MAX(1, WSF_MAX(WSF_MIN(3, (pChanParam->numUsedChan - 5)), WSF_MIN(11, ((pChanParam->numUsedChan - 10) >> 1)))); + + /* subEventIndex = (indexofLAstUsedChannel + d + (prnSubEvent_se * (N - 2 * d +1)/ 2 ^16)) mod N */ + uint16_t temp = subEvtIdx + d + ((prn * (pChanParam->numUsedChan - (d << 1) + 1)) >> 16); + subEvtIdx = temp - (temp / pChanParam->numUsedChan) * pChanParam->numUsedChan; + + pChanParam->subEvtIdx = subEvtIdx; /* Update subEvtIdx */ + + return pChanParam->chanRemapTbl[subEvtIdx]; +} + +/*************************************************************************************************/ +/*! + * \brief Lmgr Read HCI Supported cmd + * + * \return Supported command bitmask table. + */ +/*************************************************************************************************/ +uint8_t * LmgrReadHciSupCmd(void) +{ + return lmgrCb.hciSupCommands; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_adv_master_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_adv_master_ae.c index c8aa78447e..fdc2855634 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_adv_master_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_adv_master_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link manager extended scan implementation file. + * \file + * \brief Link manager extended scan implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_adv_slave_ae.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_adv_slave_ae.c index f2cf1fab59..f30900ea39 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_adv_slave_ae.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_adv_slave_ae.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link manager extended advertising implementation file. + * \file + * \brief Link manager extended advertising implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_conn.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_conn.c index 3fcfcd9168..2bc8c3c946 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_conn.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_conn.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link manager connection implementation file. + * \file + * \brief Link manager connection implementation file. */ /*************************************************************************************************/ @@ -52,4 +53,8 @@ void LmgrConnInit(void) lmgrConnCb.allPhys = LL_ALL_PHY_TX_PREFERENCE_BIT | LL_ALL_PHY_RX_PREFERENCE_BIT; lmgrConnCb.rxPhys = LL_PHYS_NONE; lmgrConnCb.txPhys = LL_PHYS_NONE; + + lmgrConnCb.syncMode = LL_SYNC_TRSF_MODE_OFF; + lmgrConnCb.syncSkip = 0; + lmgrConnCb.syncTimeout = LL_SYNC_MIN_TIMEOUT; } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_master.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_master.c index dcb5cba847..0397559ef5 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_master.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_master.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link manager master role implementation file. + * \file + * \brief Link manager master role implementation file. */ /*************************************************************************************************/ @@ -51,6 +52,5 @@ void LmgrMstInit(void) memset(&lmgrMstScanCb, 0, sizeof(lmgrMstScanCb)); lmgrMstScanCb.scanParam = defScanParam; - lmgrMstScanCb.chanClass = LL_CHAN_DATA_ALL; lmgrMstScanCb.scanChanMap = LL_ADV_CHAN_ALL; } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_priv.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_priv.c index 0093c675ad..b31db6420b 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_priv.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_priv.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link manager privacy implementation file. + * \file + * \brief Link manager privacy implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_sc.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_sc.c index 363da37ac2..921564fa7c 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_sc.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_sc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link manager secure connections implementation file. + * \file + * \brief Link manager secure connections implementation file. */ /*************************************************************************************************/ @@ -42,4 +43,5 @@ void LmgrScInit(void) { lmgrScCb.eccOpActive = FALSE; lmgrScCb.privKeySet = FALSE; + lmgrScCb.pubKeyValid = FALSE; } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_slave.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_slave.c index 82638ba053..56eca1ba05 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_slave.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/lmgr/lmgr_main_slave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Link manager slave role implementation file. + * \file + * \brief Link manager slave role implementation file. */ /*************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/sch/sch_ble.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/sch/sch_ble.c index 2af284ea5f..5f1677378e 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/sch/sch_ble.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/sch/sch_ble.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief BLE protocol scheduler implementation file. + * \file + * \brief BLE protocol scheduler implementation file. */ /*************************************************************************************************/ @@ -26,7 +27,26 @@ #include "bb_ble_api.h" #include "bb_ble_api_op.h" #include "ll_defs.h" +#include "ll_math.h" +#include "sch_api_ble.h" #include "wsf_assert.h" +#include "wsf_math.h" + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +/*! \brief Estimated header length for AUX_ADV_IND with no chained packets. */ +#define SCH_AUX_ADV_NO_CHAIN_HDR_LEN (LL_ADV_HDR_LEN + 11) /* Includes extended header len, Flags, AdvA, Txpower, ADI. */ + +/*! \brief Estimated header length for AUX_ADV_IND with chained packets. */ +#define SCH_AUX_ADV_W_CHAIN_HDR_LEN (LL_ADV_HDR_LEN + 14) /* Includes extended header len, Flags, AdvA, Txpower, ADI, AuxPtr. */ + +/*! \brief Estimated header length for periodic advertisement with no chained packets. */ +#define SCH_PER_ADV_NO_CHAIN_HDR_LEN (LL_ADV_HDR_LEN + 3) /* Includes extended header len, Flags, Txpower. */ + +/*! \brief Estimated header length for periodic advertisement with chained packets. */ +#define SCH_PER_ADV_W_CHAIN_HDR_LEN (LL_ADV_HDR_LEN + 8) /* Includes extended header len, Flags, Txpower, AuxPtr, ADI. */ /*************************************************************************************************/ /*! @@ -88,12 +108,67 @@ uint32_t SchBleCalcAdvPktDurationUsec(uint8_t phy, uint8_t phyOptions, uint16_t case BB_PHY_BLE_CODED: usec = (LL_PREAMBLE_LEN_CODED_BITS + (LL_AA_LEN * 8) + LL_CI_LEN_BITS + LL_TERM1_LEN_BITS ) * LL_BLE_US_PER_BIT_CODED_S8; usec += ((phyOptions == BB_PHY_OPTIONS_BLE_S2) ? LL_BLE_US_PER_BIT_CODED_S2 : LL_BLE_US_PER_BIT_CODED_S8) * - ((len * 8) + (LL_CRC_LEN * 8) + LL_TERM2_LEN_BITS); + (((LL_CRC_LEN + len) * 8) + LL_TERM2_LEN_BITS); break; } return usec; } +/*************************************************************************************************/ +/*! + * \brief Compute the duration of a periodic advertising event. + * + * \param txPhy Advertising PHY being used. + * \param fragLen Fragmentation length. + * \param addMafDelay MAF offset to add on top of MAF. + * \param len Data length to calculate. + * \param worseCase True if we want to calculate the worst case, false for predicted case. + * \param phyOptions Phy option to use when calculating coded timing. + */ +/*************************************************************************************************/ +uint32_t SchBleCalcPerAdvDurationUsec(uint8_t txPhy, uint8_t fragLen, uint16_t addMafDelay, uint16_t len, bool_t worstCase, uint8_t phyOptions) +{ + static uint16_t perAdvHdrMaxLen = LL_ADV_HDR_LEN + LL_EXT_ADV_HDR_MAX_LEN; + + uint16_t headerLenNoChain = (worstCase == TRUE) ? perAdvHdrMaxLen : SCH_PER_ADV_NO_CHAIN_HDR_LEN; + uint16_t headerLenChain = (worstCase == TRUE) ? perAdvHdrMaxLen : SCH_PER_ADV_W_CHAIN_HDR_LEN; + + uint16_t maxDataBytesNoChain; + uint16_t maxDataBytesWithChain; + if (fragLen == 0) + { + maxDataBytesNoChain = LL_EXT_ADVB_MAX_LEN - headerLenNoChain; + maxDataBytesWithChain = LL_EXT_ADVB_MAX_LEN - headerLenChain; + } + else + { + maxDataBytesNoChain = fragLen; + maxDataBytesWithChain = fragLen; + } + + uint32_t usec = 0; + + if (len <= maxDataBytesNoChain) + { + usec = SchBleCalcAdvPktDurationUsec(txPhy, phyOptions, headerLenNoChain + len); + } + else + { + uint16_t remDataLen = len % maxDataBytesWithChain; + uint16_t numFragWithAuxPtr = (len / maxDataBytesWithChain) - ((remDataLen) ? 0 : 1); + + usec = numFragWithAuxPtr * SchBleCalcAdvPktDurationUsec(txPhy, phyOptions, headerLenChain + maxDataBytesWithChain); + usec += numFragWithAuxPtr * (LL_BLE_MAFS_US + addMafDelay); + + if (remDataLen) + { + usec += SchBleCalcAdvPktDurationUsec(txPhy, phyOptions, headerLenNoChain + remDataLen); + } + } + + return usec; +} + /*************************************************************************************************/ /*! * \brief Compute the duration in microseconds of an auxiliary BLE packet. @@ -117,15 +192,16 @@ uint32_t SchBleCalcAuxPktDurationUsec(uint8_t phy, uint8_t phyOptions, uint16_t * \brief Compute the duration of the given BOD. * * \param pBod Operation to compute duration. + * \param fragLen Fragmentation length. * * \return None. * * Compute all the actions time and assign the duration of the given BOD. */ /*************************************************************************************************/ -void SchBleCalcAdvOpDuration(BbOpDesc_t *pBod) +void SchBleCalcAdvOpDuration(BbOpDesc_t *pBod, uint8_t fragLen) { - uint32_t usec; + uint32_t usec = 0; WSF_ASSERT(pBod->protId == BB_PROT_BLE); @@ -177,6 +253,8 @@ void SchBleCalcAdvOpDuration(BbOpDesc_t *pBod) } case BB_BLE_OP_SLV_ADV_EVENT: { + uint32_t pktDuration = SchBleCalcAdvPktDurationUsec(pBle->chan.txPhy, pBle->chan.initTxPhyOptions, pBle->op.slvAdv.txAdvLen); + WSF_ASSERT(pBle->chan.txPhy != BB_PHY_BLE_2M); WSF_ASSERT(pBle->chan.rxPhy != BB_PHY_BLE_2M); @@ -189,28 +267,28 @@ void SchBleCalcAdvOpDuration(BbOpDesc_t *pBod) WSF_ASSERT(numChan > 0); - usec = numChan * SchBleCalcAdvPktDurationUsec(pBle->chan.txPhy, pBle->chan.initTxPhyOptions, pBle->op.slvAdv.txAdvLen); - usec += (numChan - 1) * BbGetSchSetupDelayUs(); + usec = (numChan - 1) * SchBleGetAlignedAuxOffsUsec(pktDuration + BbGetSchSetupDelayUs()); + usec += pktDuration; /* For the last channel. */ if (pAdv->pRxReqBuf) { - usec += LL_BLE_TIFS_US; + usec += (LL_BLE_TIFS_US * numChan); switch (pBle->chan.rxPhy) { case BB_PHY_BLE_1M: default: - usec += LL_ADVB_MAX_TIME_1M; + usec += (LL_ADVB_MAX_TIME_1M * numChan); break; case BB_PHY_BLE_CODED: /* Assume longest time, coded S8. */ - usec += LL_ADVB_MAX_TIME_S8; + usec += (LL_ADVB_MAX_TIME_S8 * numChan); break; } if (pAdv->pTxRspBuf) { - usec += LL_BLE_TIFS_US; + usec += (LL_BLE_TIFS_US * numChan); /* Coded PHY doesn't have pTxRspBuf on primary channel. BB_PHY_OPTIONS_DEFAULT is OK. */ - usec += SchBleCalcAdvPktDurationUsec(pBle->chan.txPhy, BB_PHY_OPTIONS_DEFAULT, pBle->op.mstAdv.txReqLen); + usec += (SchBleCalcAdvPktDurationUsec(pBle->chan.txPhy, BB_PHY_OPTIONS_DEFAULT, pBle->op.mstAdv.txReqLen) * numChan); } } break; @@ -232,8 +310,13 @@ void SchBleCalcAdvOpDuration(BbOpDesc_t *pBod) usec = LL_EXT_ADVB_MAX_TIME_2M; break; case BB_PHY_BLE_CODED: - /* Assume longest time, coded S8. */ - usec = LL_EXT_ADVB_MAX_TIME_S8; + /* Setting min & max duration differently to avoid conflict with other BOD's. */ + /* Min = 3.8ms for normal size(up to 50 bytes) */ + /* Max = 17.4ms for maximum size(up to 255 bytes) */ + /* When RX data size is larger than 50 bytes, it may stomp on the next high priority BOD's. */ + // TODO: We need HW support(Radio interrupt when packet header is received) to properly fix the problem. + usec = LL_EXT_ADVB_NORMAL_TIME_S8; + pBod->maxDurUsec = LL_EXT_ADVB_MAX_TIME_S8; break; } @@ -291,59 +374,76 @@ void SchBleCalcAdvOpDuration(BbOpDesc_t *pBod) } case BB_BLE_OP_SLV_AUX_ADV_EVENT: { - BbBleSlvAuxAdvEvent_t * const pAdv = &pBle->op.slvAuxAdv; + /* The calculation is estimate here because we do not have information how optional header bytes are going to be filled later. */ + uint16_t dataLen = 0; + uint16_t extHeadLen = 0; + uint16_t maxDataBytesNoChain = (fragLen == 0) ? (LL_EXT_ADVB_MAX_LEN - SCH_AUX_ADV_NO_CHAIN_HDR_LEN) : fragLen; + uint16_t maxDataBytesWithChain = (fragLen == 0) ? (LL_EXT_ADVB_MAX_LEN - SCH_AUX_ADV_W_CHAIN_HDR_LEN) : fragLen; + BbBleSlvAuxAdvEvent_t * const pAuxAdv = &pBle->op.slvAuxAdv; - usec = SchBleCalcAdvPktDurationUsec(pBle->chan.txPhy, pBle->chan.initTxPhyOptions, pAdv->txAuxAdvPdu[0].len + pAdv->txAuxAdvPdu[1].len); - - if (pAdv->pRxAuxReqBuf) + if (pAuxAdv->pRxAuxReqBuf) /* Scannable advertising */ { + usec += SchBleCalcAdvPktDurationUsec(pBle->chan.txPhy, pBle->chan.initTxPhyOptions, SCH_AUX_ADV_NO_CHAIN_HDR_LEN); usec += LL_BLE_TIFS_US; + switch (pBle->chan.rxPhy) { case BB_PHY_BLE_1M: default: - usec += LL_ADVB_MAX_TIME_1M; + usec += LL_EXT_ADVB_MAX_TIME_1M; break; case BB_PHY_BLE_2M: - usec += LL_ADVB_MAX_TIME_2M; + usec += LL_EXT_ADVB_MAX_TIME_2M; break; case BB_PHY_BLE_CODED: /* Assume longest time, coded S8. */ - usec += LL_ADVB_MAX_TIME_S8; + usec += LL_EXT_ADVB_MAX_TIME_S8; break; } usec += LL_BLE_TIFS_US; - /* If TIFS has preference, it should use this value. Otherwise, it will assume longest time, coded S8. */ - usec += SchBleCalcAuxPktDurationUsec(pBle->chan.txPhy, (pBle->chan.tifsTxPhyOptions != BB_PHY_OPTIONS_DEFAULT) ? pBle->chan.tifsTxPhyOptions : BB_PHY_OPTIONS_BLE_S8, pAdv->txAuxRspPdu[0].len + pAdv->txAuxRspPdu[1].len); + } + + extHeadLen = WSF_MAX(pAuxAdv->txAuxAdvPdu[0].len, SCH_AUX_ADV_NO_CHAIN_HDR_LEN); + + if (pBod->pDataLen) + { + /* scan response data length if scannable advertising, ext advertising data length otherwise. */ + dataLen = *pBod->pDataLen; + } + + if (dataLen <= maxDataBytesNoChain) + { + usec += SchBleCalcAdvPktDurationUsec(pBle->chan.txPhy, pBle->chan.initTxPhyOptions, extHeadLen + dataLen); } else { - /* Use MAFS spacing instead of TIFS. */ - usec += LL_BLE_MAFS_US; + uint16_t remDataLen; + uint16_t numFragWithAuxPtr = dataLen / maxDataBytesWithChain; + + usec += numFragWithAuxPtr * SchBleCalcAdvPktDurationUsec(pBle->chan.txPhy, pBle->chan.initTxPhyOptions, SCH_AUX_ADV_W_CHAIN_HDR_LEN + maxDataBytesWithChain); + usec += numFragWithAuxPtr * LL_BLE_MAFS_US; + + remDataLen = dataLen - (numFragWithAuxPtr * maxDataBytesWithChain); + if (remDataLen) + { + usec += SchBleCalcAdvPktDurationUsec(pBle->chan.txPhy, pBle->chan.initTxPhyOptions, SCH_AUX_ADV_NO_CHAIN_HDR_LEN + remDataLen); + } } - /* Do not reserve AUX_CHAIN_IND, transmission only if scheduler has opportunity. */ + break; } case BB_BLE_OP_SLV_PER_ADV_EVENT: { - switch (pBle->chan.txPhy) + /* The calculation for the periodic event is estimate here because we do not have information how optional header bytes are going to be filled later. */ + uint16_t dataLen = 0; + if (pBod->pDataLen) { - case BB_PHY_BLE_1M: - default: - usec = LL_EXT_ADVB_MAX_TIME_1M; - break; - case BB_PHY_BLE_2M: - usec = LL_EXT_ADVB_MAX_TIME_2M; - break; - case BB_PHY_BLE_CODED: - /* Assume longest time, coded S8. */ - usec = LL_EXT_ADVB_MAX_TIME_S8; - break; + dataLen = *pBod->pDataLen; } - /* Do not reserve AUX_CHAIN_IND, transmission allowed only if scheduler has opportunity. */ + usec = SchBleCalcPerAdvDurationUsec(pBle->chan.txPhy, 0, 0, dataLen, FALSE, pBle->chan.initTxPhyOptions); break; } case BB_BLE_OP_MST_PER_SCAN_EVENT: @@ -358,8 +458,13 @@ void SchBleCalcAdvOpDuration(BbOpDesc_t *pBod) usec = LL_EXT_ADVB_MAX_TIME_2M; break; case BB_PHY_BLE_CODED: - /* Assume longest time, coded S8. */ - usec = LL_EXT_ADVB_MAX_TIME_S8; + /* Setting min & max duration differently so that other BOD's can run after minDuration. */ + /* Min = 3.8ms for normal size(up to 50 bytes) */ + /* Max = 17.4ms for maximum size(up to 255 bytes) */ + /* When RX data size is larger than 50 bytes, it may stomp on the next high priority BOD's. */ + // TODO: We need HW support(Radio interrupt when packet header is received) to properly fix the problem. + usec = LL_EXT_ADVB_NORMAL_TIME_S8; + pBod->maxDurUsec = LL_EXT_ADVB_MAX_TIME_S8; break; } break; @@ -403,3 +508,41 @@ bool_t SchBleGetNextMstConnDueTime(uint32_t *pDueTime) return FALSE; } + +/*************************************************************************************************/ +/*! + * \brief Get next aligned auxiliary offset in usec from the given aux offset. + * + * \param auxOffsUsec Auxiliary offset in usec. + * + * \return Aligned auxiliary offset in usec. + */ +/*************************************************************************************************/ +uint32_t SchBleGetAlignedAuxOffsUsec(uint32_t auxOffsUsec) +{ + uint16_t auxOffset; + uint32_t newAuxOffsetUsec; + + if (auxOffsUsec < LL_30_USEC_OFFS_MAX_USEC) + { + auxOffset = LL_MATH_DIV_30(auxOffsUsec); + newAuxOffsetUsec = auxOffset * 30; + + if (newAuxOffsetUsec < auxOffsUsec) + { + newAuxOffsetUsec = newAuxOffsetUsec + 30; + } + } + else + { + auxOffset = LL_MATH_DIV_300(auxOffsUsec); + newAuxOffsetUsec = auxOffset * 300; + + if (newAuxOffsetUsec < auxOffsUsec) + { + newAuxOffsetUsec = newAuxOffsetUsec + 300; + } + } + + return newAuxOffsetUsec; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/sch/sch_int_rm.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/sch/sch_int_rm.h index e2911f73a1..42924e4448 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/sch/sch_int_rm.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/sch/sch_int_rm.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal scheduler resource manager interface file. + * \file + * \brief Internal scheduler resource manager interface file. */ /*************************************************************************************************/ @@ -24,8 +25,10 @@ #define SCH_INT_RM_H #include "sch_api.h" +#include "sch_api_ble.h" #include "ll_math.h" #include "cfg_mac_ble.h" +#include "pal_bb.h" #ifdef __cplusplus extern "C" { @@ -38,14 +41,21 @@ extern "C" { /*! \brief Maximum number of reservations per unit of preferred periodicity. */ #define SCH_RM_MAX_RSVN_PREF_PER 2 /* TODO allow run-time configuration */ -/*! \brief Preferred periodicity. */ -#define SCH_RM_PREF_PER_USEC 40000 /* TODO allow run-time configuration (e.g. multiples of 10-ms) */ - /* Use 10000 for 1M and 2M only PHY support. */ - /* Use 40000 for Coded S8 PHY support. */ - -/*! \brief Binary divide by preferred periodicity (10,000us) (n[max]=75,776). */ +/*! \brief Binary divide by preferred periodicity (10,000us) (n[max]=2^32). */ #define SCH_RM_DIV_PREF_PER(n) ((uint32_t)(((uint64_t)(n) * UINT64_C(1717987)) >> 34)) +/*! \brief Minimum offset unit of reservation manager in microseconds. (Half of minimum isochronous interval) */ +#define SCH_RM_MIN_OFFSET_UNIT 2500 + +/*! \brief Distance between common reservation and uncommon reservation. */ +#define SCH_RM_OFFSET_UNCOMMON 3750 + +/*! \brief Maximum depth to be searched between intervals. (4 means 16 times(2^4) */ +#define SCH_RM_MAX_SEARCH_DEPTH 4 + +/*! \brief Maximum span of scheduler elements. */ +#define SCH_RM_MAX_SPAN 0x80000000 + /************************************************************************************************** Data Types **************************************************************************************************/ @@ -54,15 +64,23 @@ extern "C" { typedef struct { uint8_t handle; /*!< Reservation handle. */ - uint32_t offsUsec; /*!< Offset in microseconds. */ + bool_t commIntUsed; /*!< Reservation is controlled by common interval. */ + uint8_t offsetBit; /*! < Offset bit location. */ uint32_t interUsec; /*!< Interval in microseconds. */ + GetRefTimeCb_t refTimeCb; /*!< Callback function to get reference time of the handle. */ } schRmRsvn_t; /*! \brief Scheduler resource manager control block. */ typedef struct { uint8_t numRsvn; /*!< Number of reservations. */ + uint8_t refHandle; /*!< Handle to be used to get reference time. */ + uint8_t offsetDepth; /*!< Offset depth from common interval. */ + uint8_t indexUncommon; /*!< Index of uncommon reservations. */ + uint32_t rmStatus; /*!< Reservation status. */ + uint32_t commonInt; /*!< Common interval. */ uint32_t rsvnInterUsec[SCH_RM_MAX_RSVN]; /*!< Reserved intervals indexed by handle. */ + schRmRsvn_t rsvn[SCH_RM_MAX_RSVN]; /*!< Reservation info for each handle. */ } SchRmCb_t; /************************************************************************************************** @@ -75,9 +93,7 @@ extern SchRmCb_t schRmCb; Function Declarations **************************************************************************************************/ -uint8_t schRmBuildReservationTable(schRmRsvn_t rsvn[], uint32_t rsvnOffs[], uint8_t exclude); void schRmSortListDescending(uint32_t item[], uint8_t numItems); -void schRmSortRsvnList(schRmRsvn_t rsvn[], uint8_t numRsvn); #ifdef __cplusplus }; diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/sch/sch_rm.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/sch/sch_rm.c index 6e6901a829..3a0df954ce 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/sch/sch_rm.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/ble/sch/sch_rm.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Operation list maintenance implementation file. + * \file + * \brief Operation list maintenance implementation file. */ /*************************************************************************************************/ @@ -66,7 +67,10 @@ WSF_CT_ASSERT((SCH_RM_MAX_RSVN <= 32)); **************************************************************************************************/ /*! \brief Total number of reservation bins. */ -#define SCH_RM_MAX_RSVN_BINS ((SCH_RM_MAX_RSVN + (SCH_RM_MAX_RSVN_PREF_PER - 1)) / SCH_RM_MAX_RSVN_PREF_PER) +#define SCH_RM_MAX_RSVN_BINS ((sizeof(schRmRsvnRatio)/sizeof(schRmRsvnRatio[0])) - 1) + +/*! \brief Nominal window widening in microseconds in slave scheduler. */ +#define SCH_RM_SLAVE_WW_USECS 100 /************************************************************************************************** Global Variables @@ -75,28 +79,48 @@ WSF_CT_ASSERT((SCH_RM_MAX_RSVN <= 32)); /*! \brief Scheduler resource manager control block. */ SchRmCb_t schRmCb; +/*! \brief Reservation ratio for each reservation bin. One reservation with 10ms takes 50%, one with 20ms takes 25% and so on. */ +const uint16_t schRmRsvnRatio[] = {50, 25, 17, 13, 10, 5}; + /*************************************************************************************************/ /*! * \brief Select the preferred interval. * * \param minUsec Minimum interval in microseconds. * \param maxUsec Maximum interval in microseconds. + * \param prefPerUsec Preferred periodicity in microseconds. + * \param pref Preference for selecting the interval. * \param exclude Handle to exclude. * * \return Preferred interval in microseconds. */ /*************************************************************************************************/ -static uint32_t schRmSelectPreferredIntervalUsec(uint32_t minUsec, uint32_t maxUsec, uint8_t exclude) +static uint32_t schRmSelectPreferredIntervalUsec(uint32_t minUsec, uint32_t maxUsec, uint32_t prefPerUsec, uint8_t pref, uint8_t exclude) { - /*** Select lower bound rounded to preferred interval ***/ + uint32_t prefInterUsec; + uint32_t numInter; - uint32_t numMinInter = SCH_RM_DIV_PREF_PER(minUsec); - uint32_t prefMinInterUsec = numMinInter * SCH_RM_PREF_PER_USEC; - - if (prefMinInterUsec < minUsec) + if (pref == SCH_RM_PREF_CAPACITY) /* Search from upper bound */ { - /* Round up to next periodic interval. */ - prefMinInterUsec = (numMinInter + 1) * SCH_RM_PREF_PER_USEC; + numInter = (prefPerUsec > SCH_RM_PREF_PER_USEC) ? SCH_RM_DIV_PREF_PER(maxUsec) / SCH_RM_DIV_PREF_PER(prefPerUsec) : SCH_RM_DIV_PREF_PER(maxUsec); + prefInterUsec = numInter * prefPerUsec; + + /* Use maxUsec if we can not find any interval between min and max with our preferred periodicity. */ + if (prefInterUsec < minUsec) + { + prefInterUsec = maxUsec; + } + } + else /* Search from lower bound */ + { + numInter = (prefPerUsec > SCH_RM_PREF_PER_USEC) ? SCH_RM_DIV_PREF_PER(minUsec) / SCH_RM_DIV_PREF_PER(prefPerUsec) : SCH_RM_DIV_PREF_PER(minUsec); + prefInterUsec = numInter * prefPerUsec; + + if (prefInterUsec < minUsec) + { + /* Round up to next periodic interval. */ + prefInterUsec = (numInter + 1) * prefPerUsec; + } } /*** Prefer existing intervals ***/ @@ -118,7 +142,7 @@ static uint32_t schRmSelectPreferredIntervalUsec(uint32_t minUsec, uint32_t maxU for (unsigned int i = 0; i < numIntervUsec; i++) { - if ((intervUsec[i] >= prefMinInterUsec) && + if ((intervUsec[i] >= prefInterUsec) && (intervUsec[i] <= maxUsec)) { return intervUsec[i]; @@ -127,13 +151,13 @@ static uint32_t schRmSelectPreferredIntervalUsec(uint32_t minUsec, uint32_t maxU /*** Limit upper bound ***/ - if (prefMinInterUsec > maxUsec) + if (prefInterUsec > maxUsec) { /* Limit to max value. */ - prefMinInterUsec = maxUsec; + prefInterUsec = maxUsec; } - return prefMinInterUsec; + return prefInterUsec; } /*************************************************************************************************/ @@ -151,7 +175,7 @@ static bool_t schRmCheckRsvnCapacity(uint8_t handle, uint32_t interUsec) unsigned int maxBinIdx = 0; /* Number of reservations by interval size; zero index is SCH_RM_PREF_PER_USEC. */ - uint8_t numRsvnPerInter[SCH_RM_MAX_RSVN_BINS] = { 0 }; + uint8_t numRsvnPerInter[SCH_RM_MAX_RSVN_BINS + 1] = { 0 }; for (unsigned int i = 0; i < SCH_RM_MAX_RSVN; i++) { unsigned int rsvnIntervUsec; @@ -172,39 +196,35 @@ static bool_t schRmCheckRsvnCapacity(uint8_t handle, uint32_t interUsec) /* Bin interval value inclusive of max value. */ unsigned int binIdx = SCH_RM_DIV_PREF_PER(rsvnIntervUsec - 1); - if (binIdx < SCH_RM_MAX_RSVN_BINS) - { - numRsvnPerInter[binIdx]++; - maxBinIdx = WSF_MAX(binIdx, maxBinIdx); - } - /* Else interval is too large to be significant. */ + + binIdx = (binIdx > SCH_RM_MAX_RSVN_BINS) ? SCH_RM_MAX_RSVN_BINS : binIdx; + numRsvnPerInter[binIdx]++; + maxBinIdx = WSF_MAX(binIdx, maxBinIdx); } /* Check capacity. */ - unsigned int numRsvnLimit = 0; - unsigned int numRsvnSum = 0; + + uint16_t rsvnPerc = 0; /* Reservation percentage */ + uint16_t numRsvn; bool_t isMaxCap = FALSE; + for (unsigned int i = 0; i < (maxBinIdx + 1); i++) { - if (!isMaxCap) + numRsvn = numRsvnPerInter[i]; + while (numRsvn) { - numRsvnLimit += SCH_RM_MAX_RSVN_PREF_PER; - numRsvnSum += numRsvnPerInter[i]; - - if (numRsvnSum > numRsvnLimit) + if (!isMaxCap) { - /* Capacity exceeded. */ - return FALSE; + rsvnPerc += schRmRsvnRatio[i]; + numRsvn--; + + if (rsvnPerc >= 100) + { + isMaxCap = TRUE; + } } - if (numRsvnSum == numRsvnLimit) - { - isMaxCap = TRUE; - } - } - else - { - if (numRsvnPerInter[i]) + if (isMaxCap && (numRsvn > 0)) { /* Capacity exceeded. */ return FALSE; @@ -217,227 +237,372 @@ static bool_t schRmCheckRsvnCapacity(uint8_t handle, uint32_t interUsec) /*************************************************************************************************/ /*! - * \brief Find reservations with equal intervals. + * \brief Calculate depth between interval. * - * \param rsvn Sorted reservation sequence table. - * \param numRsvn Number of reservations in sequence table. - * \param handle Target reservation handle. - * \param pSelectMask Bitmask of selected reservations. - * \param pNumSelected Number of selected reservations. + * \param intLarge Larger interval to be compared. + * \param intSmall Smaller interval to be compared. + * + * \return Depth between intervals. + */ +/*************************************************************************************************/ +static uint8_t schRmIntCalculateDepth(uint32_t intLarge, uint32_t intSmall) +{ + uint8_t x; + uint8_t depth = 0; + uint32_t tmpInt = intLarge; + + WSF_ASSERT(intLarge > intSmall); + + for (x = 0; (x < SCH_RM_MAX_SEARCH_DEPTH) && (tmpInt > SCH_RM_MIN_OFFSET_UNIT); x++) + { + tmpInt >>= 1; + if (tmpInt == intSmall) + { + depth = x + 1; + break; + } + } + + return depth; +} + +/*************************************************************************************************/ +/*! + * \brief Add resource manager offset for the specified handle. + * + * \param handle Client defined reservation handle. + * \param depth Offset depth of the interval of the handle compared to maxConInt. + * + * \return TRUE if update was successful, FALSE otherwise.. + */ +/*************************************************************************************************/ +static bool_t schRmIntAddRmOffset(uint8_t handle, uint8_t depth) +{ + bool_t updated = FALSE; + uint8_t x, y, numBitsOn; + + WSF_ASSERT(schRmCb.offsetDepth >= depth); + + for (x = 0; x < (1 << (schRmCb.offsetDepth - depth)); x++) + { + /* Depth 0 means that the interval of the handle is same as common interval. Depth 1 means that it is half of common interval. */ + /* When offsetDepth is 3(8 bits) and depth is 1, we will cut rmStatus in half and check if the bits in same location are all zero. */ + numBitsOn = 0; + for (y = 0; y < (1 << depth); y++) + { + if ((schRmCb.rmStatus >> ((1 << (schRmCb.offsetDepth - depth)) * y + x)) & 0x01) + { + numBitsOn++; + } + } + + /* Found available offset bit(s). */ + if (numBitsOn == 0) + { + /* Set all the bits */ + for (y = 0; y < (1 << depth); y++) + { + schRmCb.rmStatus |= (0x01 << ((1 << (schRmCb.offsetDepth - depth)) * y + x)); + } + + schRmCb.rsvn[handle].offsetBit = x; + schRmCb.rsvn[handle].commIntUsed = TRUE; + updated = TRUE; + + LL_TRACE_WARN2("schRmIntAddRmOffset, handle = %u, offsetDepth = %u", handle, schRmCb.offsetDepth); + LL_TRACE_WARN1(" rmStatus = 0x%x", schRmCb.rmStatus); + LL_TRACE_WARN1(" commonInt = %u", schRmCb.commonInt); + break; + } + } + + return updated; +} + +/*************************************************************************************************/ +/*! + * \brief Increase reservation manager offset depth. + * + * \param depth Offset depth to be increased. * * \return None. */ /*************************************************************************************************/ -static void schRmFindEqualIntervals(schRmRsvn_t rsvn[], uint8_t numRsvn, uint8_t handle, - uint32_t *pSelectMask, uint8_t *pNumSelected) +static void schRmIntIncOffsetDepth(uint8_t depth) { - WSF_ASSERT(numRsvn > 0); + uint32_t tmpStatus = schRmCb.rmStatus; + uint8_t x, handle; - const uint32_t inter = schRmCb.rsvnInterUsec[handle]; - - uint32_t selectMask = 0; - uint8_t numSelected = 0; - - for (unsigned int i = 0; i < numRsvn; i++) + /* b'11 becomes b'00010001, when depth is 2. */ + schRmCb.rmStatus = 0; + for (x = 0; x < (1 << schRmCb.offsetDepth); x++) { - if (rsvn[i].interUsec == inter) + if ((tmpStatus >> x) & 0x01) { - selectMask |= 1 << i; - numSelected++; + schRmCb.rmStatus |= (0x01 << (x * (1 << depth))); } } - /* Return values. */ - *pSelectMask = selectMask; - *pNumSelected = numSelected; + schRmCb.offsetDepth += depth; + + /* Update database according to the new offsetDepth. */ + for (handle = 0; handle < SCH_RM_MAX_RSVN; handle++) + { + if (schRmCb.rsvn[handle].commIntUsed) + { + /* For example, with depth 2, bit1 will move into bit4. */ + schRmCb.rsvn[handle].offsetBit *= (1 << depth); + } + } } /*************************************************************************************************/ /*! - * \brief Find reservations with the largest intervals. - * - * \param rsvn Sorted reservation sequence table. - * \param numRsvn Number of reservations in sequence table. - * \param pSelectMask Bitmask of selected reservations. + * \brief Decrease reservation manager offset depth by one if necessary. * * \return None. */ /*************************************************************************************************/ -static void schRmFindLargestIntervals(schRmRsvn_t rsvn[], uint8_t numRsvn, uint32_t *pSelectMask) +static void schRmIntCheckDecOffsetDepth(void) { - WSF_ASSERT(numRsvn > 0); + uint32_t tmpStatus = schRmCb.rmStatus; + uint8_t x, evenOdd, other, handle, numBitsOn; + uint8_t depth = schRmCb.offsetDepth - 1; - /* Initially the largest interval is first reservation. */ - uint32_t selectMask = 1 << 0; - uint32_t lgInterUsec = rsvn[0].interUsec; - - /* Start comparison with the second reservation. */ - for (unsigned int i = 1; i < numRsvn; i++) + if (schRmCb.offsetDepth < 2) { - if (rsvn[i].interUsec < lgInterUsec) - { - /* Skip this reservation. */ - continue; - } - - if (rsvn[i].interUsec > lgInterUsec) - { - /* New largest interval found. */ - selectMask = 0; - lgInterUsec = rsvn[i].interUsec; - } - - selectMask |= 1 << i; + /* nothing to do. */ + return; } - /* Return values. */ - *pSelectMask = selectMask; + /* b'1010 with depth 2 is same as b'11 with depth 1. */ + /* Check if all even or odd bits are zero. */ + for (evenOdd = 0; evenOdd < 2; evenOdd++) + { + numBitsOn = 0; + other = (evenOdd == 0) ? 1 : 0; /* When checking even bits, other is 1. */ + + for (x = 0; x < (1 << depth); x++) + { + if ((tmpStatus >> (x * 2 + evenOdd)) & 0x01) + { + numBitsOn++; + } + } + + if (numBitsOn == 0) + { + schRmCb.offsetDepth--; + schRmCb.rmStatus = 0; + + for (x = 0; x < (1 << depth); x++) + { + if ((tmpStatus >> (x * 2 + other)) & 0x01) + { + schRmCb.rmStatus |= (0x01 << (x)); + } + } + + /* Update database according to the new offsetDepth. */ + for (handle = 0; handle < SCH_RM_MAX_RSVN; handle++) + { + if (schRmCb.rsvn[handle].commIntUsed) + { + schRmCb.rsvn[handle].offsetBit >>= 1; + + /* The handle for Bit0 is updated to reference handle. */ + if (schRmCb.rsvn[handle].offsetBit == 0) + { + schRmCb.refHandle = handle; + } + } + } + + return; + } + } } /*************************************************************************************************/ /*! - * \brief Find largest gap between start times of reservation with equal intervals. + * \brief Remove resource manager offset for the specified handle. * - * \param rsvn Sorted reservation sequence table. - * \param numRsvn Number of reservations in sequence table. - * \param selectMask Bitmask of equal interval reservations. + * \param handle Client defined reservation handle. * - * \return Offset in microseconds of the center of the largest gap. + * \return TRUE if update was successful, FALSE otherwise.. */ /*************************************************************************************************/ -static uint32_t schRmFindLargestGapOffsetUsec(schRmRsvn_t rsvn[], uint8_t numRsvn, uint32_t selectMask) +static void schRmIntRemoveRmOffset(uint8_t handle) { - WSF_ASSERT(numRsvn > 0); - WSF_ASSERT(selectMask != 0); + uint8_t x, depth; - schRmRsvn_t *pFirstRsvn = NULL; - schRmRsvn_t *pLastRsvn = NULL; - schRmRsvn_t *pLgGapEnd = NULL; - uint32_t lgGap = 0; - uint32_t gapStartOffsUsec = 0; - - for (unsigned int i = 0; i < numRsvn; i++) + if (schRmCb.rsvn[handle].commIntUsed) { - if ((selectMask & (1 << i)) == 0) + /* The interval of this handle must be equal to or smaller than the common interval. */ + if (schRmCb.commonInt == schRmCb.rsvn[handle].interUsec) { - continue; + schRmCb.rmStatus &= ~(1 << schRmCb.rsvn[handle].offsetBit); } - - if (!pFirstRsvn) + else { - pFirstRsvn = &rsvn[i]; - } + depth = schRmIntCalculateDepth(schRmCb.commonInt, schRmCb.rsvn[handle].interUsec); - uint32_t gap = pLastRsvn ? (rsvn[i].offsUsec - pLastRsvn->offsUsec) : rsvn[i].offsUsec; - - /* Favor latest offset. */ - if (lgGap <= gap) - { - lgGap = gap; - if (pLgGapEnd) + if (depth) { - gapStartOffsUsec = pLgGapEnd->offsUsec; + for (x = 0; x < (1 << depth); x++) + { + schRmCb.rmStatus &= ~(1 << ((1 << (schRmCb.offsetDepth - depth)) * x + schRmCb.rsvn[handle].offsetBit)); + } } - pLgGapEnd = &rsvn[i]; } - pLastRsvn = &rsvn[i]; - } + schRmCb.rsvn[handle].commIntUsed = FALSE; - /* Check end of sequence gap. */ - if (pFirstRsvn) /* pLastRsvn valid if pFirstRsvn valid */ - { - uint32_t firstNextOffsUsec = pFirstRsvn->offsUsec + pFirstRsvn->interUsec; - WSF_ASSERT(firstNextOffsUsec > pLastRsvn->offsUsec); + /* Adjust offsetDepth if necessary. */ + schRmIntCheckDecOffsetDepth(); - if (firstNextOffsUsec > pLastRsvn->offsUsec) + /* All the reservations are removed. */ + if (schRmCb.rmStatus == 0) { - uint32_t gap = firstNextOffsUsec - pLastRsvn->offsUsec; + schRmCb.commonInt = 0; + schRmCb.offsetDepth = 0; + } - /* Favor earliest offset. */ - if (lgGap < gap) + LL_TRACE_WARN2("schRmIntRemoveRmOffset, handle = %u, offsetDepth = %u", handle, schRmCb.offsetDepth); + LL_TRACE_WARN1(" rmStatus = 0x%x", schRmCb.rmStatus); + LL_TRACE_WARN1(" commonInt = %u", schRmCb.commonInt); + } + else + { + if (schRmCb.indexUncommon > 0) + { + /* Uncommon handle by reservation manager. */ + schRmCb.indexUncommon--; + LL_TRACE_WARN2("schRmIntRemoveRmOffset, deleted uncommon index %u, Handle = %u", schRmCb.indexUncommon, handle); + } + } +} + +/*************************************************************************************************/ +/*! + * \brief Increase common interval of reservation manager. + * + * \param depth Depth between current interval and new interval. + * + * \return None. + */ +/*************************************************************************************************/ +static void schRmIntIncCommInterval(uint8_t depth) +{ + uint8_t x, y; + uint32_t tmpStatus = schRmCb.rmStatus; + + WSF_ASSERT(depth > 0); + + schRmCb.commonInt = schRmCb.commonInt << depth; + + /* Reconstruct rmStatus as to the new common interval. */ + schRmCb.rmStatus = 0; + for (x = 0; x < (1 << schRmCb.offsetDepth); x++) + { + if ((tmpStatus >> x) & 0x01) + { + for (y = 0; y < (1 << depth); y++) { - lgGap = gap; - gapStartOffsUsec = pLastRsvn->offsUsec; + schRmCb.rmStatus |= (0x01 << (y * (1 << schRmCb.offsetDepth) + x)); } } } - return gapStartOffsUsec + (lgGap >> 1); + schRmCb.offsetDepth += depth; + + /* Offset bit location(offsetBit) stays same for existing handles. */ } /*************************************************************************************************/ /*! - * \brief Select initial offset considering existing reservations. + * \brief Handle Adding resource manager offset for the specified handle. * - * \param rsvn Sorted reservation sequence table. - * \param numRsvn Number of reservations in sequence table. - * \param selectMask Bitmask of selected reservations in rsvn[]. - * \param numSelected Number of selected reservations in rsvn[]. + * \param handle Client defined reservation handle. * - * \return Suggested offset in microseconds. + * \return TRUE if update was successful, FALSE otherwise.. */ /*************************************************************************************************/ -static uint32_t schRmSelectInitOffset(schRmRsvn_t rsvn[], uint8_t numRsvn, uint32_t selectMask, uint8_t numSelected) +static void schRmIntHandleAddRmOffset(uint8_t handle, uint32_t newInterUsec) { - uint32_t interUsec = 0; + schRmCb.rsvn[handle].handle = handle; + schRmCb.rsvn[handle].interUsec = newInterUsec; - for (unsigned int i = 0; i < numRsvn; i++) + /* Let's assume all connections are with common multiples. */ + /* Will add function later to determine if 2 intervals are with common intervals. */ + if (schRmCb.commonInt == 0) { - if ((selectMask & (1 << i)) == 0) - { - /* Reservation not selected. */ - continue; - } + schRmCb.commonInt = newInterUsec; + schRmCb.indexUncommon = 0; + schRmCb.offsetDepth = 0; /* Offset unit is same as commonInt. */ + schRmCb.rmStatus = 0x01; /* 100 percent reserved. */ - interUsec = rsvn[i].interUsec; - break; + schRmCb.rsvn[handle].offsetBit = 0; + schRmCb.rsvn[handle].commIntUsed = TRUE; + schRmCb.refHandle = handle; } - - WSF_ASSERT(interUsec != 0); - - uint32_t offsetUsec = schRmFindLargestGapOffsetUsec(rsvn, numRsvn, selectMask); - - if (offsetUsec > interUsec) + else if (schRmCb.commonInt == newInterUsec) { - /* Ensure offset is within bounds. */ - offsetUsec -= interUsec; - } - - return offsetUsec; -} - -/*************************************************************************************************/ -/*! - * \brief Build reservation table. - * - * \param rsvn Target reservation sequence table. - * \param rsvnOffs List of reservation offsets indexed by handle. - * \param exclude Handle of reservation to exclude. - * - * \return Number of valid reservation entries. - */ -/*************************************************************************************************/ -uint8_t schRmBuildReservationTable(schRmRsvn_t rsvn[], uint32_t rsvnOffs[], uint8_t exclude) -{ - uint8_t numRsvn = 0; - - for (unsigned int i = 0; i < SCH_RM_MAX_RSVN; i++) - { - if ((schRmCb.rsvnInterUsec[i]) && - (i != exclude)) + if (!schRmIntAddRmOffset(handle, 0)) { - rsvn[numRsvn].handle = i; - rsvn[numRsvn].offsUsec = rsvnOffs[i]; - rsvn[numRsvn].interUsec = schRmCb.rsvnInterUsec[i]; - - numRsvn++; + /* Offset depth needs to be increased if RM status is full with the current depth. */ + schRmIntIncOffsetDepth(1); + (void)schRmIntAddRmOffset(handle, 0); } } + else if (schRmCb.commonInt < newInterUsec) /* new interval is multiple of commonInt. */ + { + uint8_t depth = schRmIntCalculateDepth(newInterUsec, schRmCb.commonInt); - schRmSortRsvnList(rsvn, numRsvn); + if (depth) + { + schRmIntIncCommInterval(depth); - return numRsvn; + if (!schRmIntAddRmOffset(handle, 0)) + { + /* Offset depth needs to be increased if RM status is full with the current depth. */ + schRmIntIncOffsetDepth(1); + (void)schRmIntAddRmOffset(handle, 0); + } + } + else + { + /* Uncommon handle by reservation manager. */ + schRmCb.indexUncommon++; + LL_TRACE_WARN2("Adding uncommon index %u, Handle = %u", schRmCb.indexUncommon, handle); + } + } + else if (schRmCb.commonInt > newInterUsec) + { + uint8_t depth = schRmIntCalculateDepth(schRmCb.commonInt, newInterUsec); + + if (depth) + { + /* First update offset depth so that offset unit would be same as new interval. */ + if (schRmCb.offsetDepth < depth) + { + schRmIntIncOffsetDepth(depth - schRmCb.offsetDepth); + } + + if (!schRmIntAddRmOffset(handle, depth)) + { + /* Offset depth needs to be increased if RM status is full with the current depth. */ + schRmIntIncOffsetDepth(1); + (void)schRmIntAddRmOffset(handle, depth); + } + } + else + { + /* Uncommon handle by reservation manager. */ + schRmCb.indexUncommon++; + LL_TRACE_WARN2("Adding uncommon index %u, Handle = %u", schRmCb.indexUncommon, handle); + } + } } /*************************************************************************************************/ @@ -482,47 +647,6 @@ void schRmSortListDescending(uint32_t item[], uint8_t numItems) } while (numUnsorted > 1); } -/*************************************************************************************************/ -/*! - * \brief In-place sorting of a reservation description list. - * - * \param rsvn Reservation descriptor table. - * \param numRsvn Number of reservation descriptors in rsvn[]. - * - * \return None. - */ -/*************************************************************************************************/ -void schRmSortRsvnList(schRmRsvn_t rsvn[], uint8_t numRsvn) -{ - if (numRsvn <= 1) - { - return; - } - - unsigned int numUnsorted = numRsvn; - - do - { - unsigned int swapIdx = 0; - - for (unsigned int i = 1; i < numUnsorted; i++) - { - if (rsvn[i-1].offsUsec > rsvn[i].offsUsec) - { - schRmRsvn_t tmp; - memcpy(&tmp, &rsvn[i-1], sizeof(schRmRsvn_t)); - memcpy(&rsvn[i-1], &rsvn[i], sizeof(schRmRsvn_t)); - memcpy(&rsvn[i], &tmp, sizeof(schRmRsvn_t)); - swapIdx = i; - } - } - - /* Reservations after swapIdx are sorted. */ - numUnsorted = swapIdx; - - } while (numUnsorted > 1); -} - /*************************************************************************************************/ /*! * \brief Initialize the resource manager. @@ -547,11 +671,34 @@ uint32_t SchRmPreferredPeriodUsec(void) return SCH_RM_PREF_PER_USEC; } +/*************************************************************************************************/ +/*! + * \brief Calculate the common periodicity. + * + * \param peerPerUsec Peer's periodicity in microseconds. + * + * \return Common periodicity in microseconds. + */ +/*************************************************************************************************/ +uint32_t SchRmCalcCommonPeriodicityUsec(uint32_t peerPerUsec) +{ + /* Is peer periodicity a multiple of local periodicity? */ + if ((SCH_RM_DIV_PREF_PER(peerPerUsec) * SCH_RM_PREF_PER_USEC) == peerPerUsec) + { + /* Accommodate the peer's periodicity. */ + return WSF_MAX(SCH_RM_PREF_PER_USEC, peerPerUsec); + } + + /* Default to local preference. */ + return SCH_RM_PREF_PER_USEC; +} + /*************************************************************************************************/ /*! * \brief Validate and commit a new reservation against collision. * * \param handle Client defined reservation handle. + * \param pref Preference for selecting the interval. * \param minUsec Minimum interval in microseconds. * \param maxUsec Maximum interval in microseconds. * \param durUsec Duration of the connection in microseconds. @@ -560,15 +707,21 @@ uint32_t SchRmPreferredPeriodUsec(void) * \return TRUE if reservation available, FALSE otherwise. */ /*************************************************************************************************/ -bool_t SchRmAdd(uint8_t handle, uint32_t minUsec, uint32_t maxUsec, uint32_t durUsec, uint32_t *pInterUsec) +bool_t SchRmAdd(uint8_t handle, uint8_t pref, uint32_t minUsec, uint32_t maxUsec, uint32_t durUsec, uint32_t *pInterUsec, GetRefTimeCb_t refTimeCb) { + uint32_t perfPerUsec = SCH_RM_PREF_PER_CONN_USEC; + WSF_ASSERT(handle < SCH_RM_MAX_RSVN); WSF_ASSERT(maxUsec >= minUsec); - WSF_ASSERT(durUsec <= (SCH_RM_PREF_PER_USEC / SCH_RM_MAX_RSVN_PREF_PER)); + + if (pref == SCH_RM_PREF_CAPACITY) + { + perfPerUsec = SCH_RM_PREF_PER_SYNC_USEC; + } /*** Select reservation's preferred interval. ***/ - uint32_t prefInterUsec = schRmSelectPreferredIntervalUsec(minUsec, maxUsec, handle); + uint32_t prefInterUsec = schRmSelectPreferredIntervalUsec(minUsec, maxUsec, perfPerUsec, pref, handle); /*** Check reservation capacity. ***/ @@ -581,7 +734,13 @@ bool_t SchRmAdd(uint8_t handle, uint32_t minUsec, uint32_t maxUsec, uint32_t dur schRmCb.rsvnInterUsec[handle] = prefInterUsec; schRmCb.numRsvn++; - *pInterUsec = prefInterUsec; + if (pInterUsec) + { + *pInterUsec = prefInterUsec; + } + + schRmIntHandleAddRmOffset(handle, prefInterUsec); + schRmCb.rsvn[handle].refTimeCb = refTimeCb; return TRUE; } @@ -593,6 +752,7 @@ bool_t SchRmAdd(uint8_t handle, uint32_t minUsec, uint32_t maxUsec, uint32_t dur * \param handle Client defined reservation handle. * \param minUsec Minimum interval in microseconds. * \param maxUsec Maximum interval in microseconds. + * \param perfPerUsec Preferred periodicity in microseconds. * \param durUsec Duration of the connection in microseconds. * \param pInterUsec Actual interval return value in microseconds. * @@ -601,15 +761,14 @@ bool_t SchRmAdd(uint8_t handle, uint32_t minUsec, uint32_t maxUsec, uint32_t dur * \note For BLE, connection belonging to handle must be a master only. */ /*************************************************************************************************/ -bool_t SchRmStartUpdate(uint8_t handle, uint32_t minUsec, uint32_t maxUsec, uint32_t durUsec, uint32_t *pInterUsec) +bool_t SchRmStartUpdate(uint8_t handle, uint32_t minUsec, uint32_t maxUsec, uint32_t perfPerUsec, uint32_t durUsec, uint32_t *pInterUsec) { WSF_ASSERT(handle < SCH_RM_MAX_RSVN); WSF_ASSERT(maxUsec >= minUsec); - WSF_ASSERT(durUsec <= (SCH_RM_PREF_PER_USEC / SCH_RM_MAX_RSVN_PREF_PER)); /*** Select reservation's preferred interval. ***/ - uint32_t prefInterUsec = schRmSelectPreferredIntervalUsec(minUsec, maxUsec, handle); + uint32_t prefInterUsec = schRmSelectPreferredIntervalUsec(minUsec, maxUsec, perfPerUsec, SCH_RM_PREF_PERFORMANCE, handle); /*** Check reservation capacity. ***/ @@ -623,6 +782,9 @@ bool_t SchRmStartUpdate(uint8_t handle, uint32_t minUsec, uint32_t maxUsec, uint schRmCb.rsvnInterUsec[handle] = prefInterUsec; *pInterUsec = prefInterUsec; + schRmIntRemoveRmOffset(handle); + schRmIntHandleAddRmOffset(handle, prefInterUsec); + return TRUE; } @@ -656,6 +818,8 @@ void SchRmRemove(uint8_t handle) schRmCb.rsvnInterUsec[handle] = 0; schRmCb.numRsvn--; + + schRmIntRemoveRmOffset(handle); } /*************************************************************************************************/ @@ -679,15 +843,19 @@ void SchRmSetReference(uint8_t handle) /*! * \brief Get the next available offset in microseconds. * - * \param rsvnOffs List of reservation offsets indexed by handle. * \param defOffsUsec Default offset in microseconds. * \param handle Reservation handle. + * \param refTime Reference time in BB ticks. * * \return Offset in microseconds. */ /*************************************************************************************************/ -uint32_t SchRmGetOffsetUsec(uint32_t rsvnOffs[], uint32_t defOffsUsec, uint8_t handle) +uint32_t SchRmGetOffsetUsec(uint32_t defOffsUsec, uint8_t handle, uint32_t refTime) { + uint32_t rmRefTime = refTime; + uint32_t offsUsec, targetTime; + uint32_t offsetUnitUs = schRmCb.commonInt >> schRmCb.offsetDepth; + WSF_ASSERT(schRmCb.numRsvn); if (schRmCb.numRsvn <= 1) @@ -696,28 +864,74 @@ uint32_t SchRmGetOffsetUsec(uint32_t rsvnOffs[], uint32_t defOffsUsec, uint8_t h return defOffsUsec; } - schRmRsvn_t rsvn[SCH_RM_MAX_RSVN]; - uint8_t numRsvn; - uint8_t numSelected; - uint32_t selectMask; - numRsvn = schRmBuildReservationTable(rsvn, rsvnOffs, handle); - - /* Attempt alignment with existing reservations at equal intervals. */ - schRmFindEqualIntervals(rsvn, numRsvn, handle, &selectMask, &numSelected); - if (numSelected) + /* rmRefTime is the time for offset bit 0. */ + if (schRmCb.rsvn[schRmCb.refHandle].refTimeCb != NULL) { - return schRmSelectInitOffset(rsvn, numRsvn, selectMask, numSelected); + rmRefTime = schRmCb.rsvn[schRmCb.refHandle].refTimeCb(schRmCb.refHandle, NULL); } - /* Else align with largest interval reservations. */ - schRmFindLargestIntervals(rsvn, numRsvn, &selectMask); - uint32_t lgGapOffsUsec = schRmFindLargestGapOffsetUsec(rsvn, numRsvn, selectMask); - - /* Ensure offset is within bounds. */ - while (lgGapOffsUsec > schRmCb.rsvnInterUsec[handle]) + if ((schRmCb.commonInt != 0) && (schRmCb.rsvn[handle].commIntUsed == TRUE)) { - lgGapOffsUsec = lgGapOffsUsec >> 1; + /* Time of Offset bit n = rmRefTime + offsetUnit * n. */ + offsUsec = offsetUnitUs * schRmCb.rsvn[handle].offsetBit; + if (offsUsec == 0) + { + offsUsec += schRmCb.rsvn[handle].interUsec; + } + + targetTime = rmRefTime + BB_US_TO_BB_TICKS(offsUsec); + + LL_TRACE_WARN2("SchRmGetOffsetUsec, handle = %u, refHandle = %u", handle, schRmCb.refHandle); + LL_TRACE_WARN1(" refTime = %u", refTime); + LL_TRACE_WARN1(" targetTime = %u", targetTime); + } + else + { + uint8_t offsetBit = 0; + uint8_t numUncommon = schRmCb.indexUncommon; + uint32_t uncommonOffsetUs = SCH_RM_OFFSET_UNCOMMON; /* Offset in microseconds for uncommon handle */ + + numUncommon--; + while (numUncommon) + { + offsetBit++; + numUncommon--; + offsetBit = (offsetBit >= (1 << schRmCb.offsetDepth)) ? 0 : offsetBit; + } + + /* Find the duration of BOD of the handle which occupies the offset bit. */ + for (uint8_t i = 0; i < SCH_RM_MAX_RSVN; i++) + { + if ((schRmCb.rsvn[i].offsetBit == offsetBit) && (schRmCb.rsvn[i].commIntUsed == TRUE)) + { + if (schRmCb.rsvn[i].refTimeCb != NULL) + { + (void)schRmCb.rsvn[i].refTimeCb(i, &uncommonOffsetUs); + uncommonOffsetUs += BbGetSchSetupDelayUs(); + } + } + } + + /* Place the uncommon handle away from each common ones to avoid conflicts. */ + targetTime = rmRefTime + BB_US_TO_BB_TICKS(offsetBit * offsetUnitUs) + BB_US_TO_BB_TICKS(uncommonOffsetUs); + + LL_TRACE_WARN2("SchRmGetOffsetUsec, uncommon handle = %u, refHandle = %u", handle, schRmCb.refHandle); + LL_TRACE_WARN1(" refTime = %u", refTime); + LL_TRACE_WARN1(" targetTime = %u", targetTime); } - return lgGapOffsUsec; + /* Time to return has to be future from refTime. */ + while (targetTime - refTime >= SCH_RM_MAX_SPAN) + { + targetTime += BB_US_TO_BB_TICKS(schRmCb.rsvn[handle].interUsec); + } + + /* 0 < targetTime <= interval */ + while (targetTime - refTime > BB_US_TO_BB_TICKS(schRmCb.rsvn[handle].interUsec)) + { + targetTime -= BB_US_TO_BB_TICKS(schRmCb.rsvn[handle].interUsec); + } + + LL_TRACE_WARN1(" offsUsec = %u", (targetTime - refTime)); + return BB_TICKS_TO_US(targetTime - refTime); } diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/bb/bb_int.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/bb/bb_int.h index 153d2b7834..6f9b65d96e 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/bb/bb_int.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/bb/bb_int.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal baseband interface file. + * \file + * \brief Internal baseband interface file. */ /*************************************************************************************************/ @@ -24,6 +25,7 @@ #define BB_INT_H #include "bb_api.h" +#include "pal_bb.h" #include "wsf_assert.h" #ifdef __cplusplus diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/bb/bb_main.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/bb/bb_main.c index 011e3e1f90..c7f1d7f786 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/bb/bb_main.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/bb/bb_main.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,14 +16,15 @@ /*************************************************************************************************/ /*! - * \brief Generic baseband driver implementation file. + * \file + * \brief Generic baseband driver implementation file. */ /*************************************************************************************************/ #include #include "bb_api.h" #include "bb_int.h" -#include "bb_drv.h" +#include "pal_bb.h" /************************************************************************************************** Globals @@ -75,7 +76,7 @@ void BbInit(void) { WSF_ASSERT(pBbRtCfg); - BbDrvInit(); + PalBbInit(); memset(&bbCb, 0, sizeof(bbCb)); } @@ -115,6 +116,7 @@ static void bbProtStart(uint8_t protId) /* Protocol now started. */ bbCb.protStarted = TRUE; bbCb.protIdStarted = protId; + PalBbSetProtId(protId); } /*************************************************************************************************/ @@ -137,7 +139,7 @@ void BbStart(uint8_t protId) if (!bbCb.protStarted) { /* Enable generic BB. */ - BbDrvEnable(); + PalBbEnable(); /* Enable protocol-specific BB. */ bbProtStart(protId); @@ -191,7 +193,7 @@ void BbStop(uint8_t protId) bbProtStop(protId); /* Disable generic BB. */ - BbDrvDisable(); + PalBbDisable(); } } @@ -219,7 +221,7 @@ void BbExecuteBod(BbOpDesc_t *pBod) /* Enable generic BB. */ if (!bbCb.protStarted) { - BbDrvEnable(); + PalBbEnable(); } /* Switch protocols if necessary. */ @@ -230,9 +232,6 @@ void BbExecuteBod(BbOpDesc_t *pBod) } if (!bbCb.protStarted) { - /* TODO: Removed this assert as it prevents background BOD. Seems unnecessary? */ - /* WSF_ASSERT(bbCb.prot[pBod->protId].startCnt > 0); */ - /* Enable protocol-specific BB. */ bbProtStart(pBod->protId); } @@ -285,12 +284,13 @@ BbOpDesc_t *BbGetCurrentBod(void) /*************************************************************************************************/ /*! - * \brief Cancel current executing BOD. + * \brief Set termination flag of current executing BOD. * * \return None. * * \note This function is expected to be called during the execution context of the - * current executing BOD, typically in the related ISRs. + * current executing BOD, typically in the related ISRs. In the end, termination + * flag will help to decide if BbTerminateBod() should be called. */ /*************************************************************************************************/ void BbSetBodTerminateFlag(void) diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/chci/chci_tr.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/chci/chci_tr.c new file mode 100644 index 0000000000..c77fb5aac2 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/chci/chci_tr.c @@ -0,0 +1,634 @@ +/* Copyright (c) 2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*************************************************************************************************/ +/*! + * \file + * \brief Controller HCI transport module implementation file. + */ +/*************************************************************************************************/ + +#include "chci_tr.h" +#include "chci_api.h" +#include "hci_defs.h" +#include "wsf_assert.h" +#include "wsf_msg.h" +#include "wsf_math.h" +#include "wsf_os.h" +#include "util/bstream.h" +#include + +#if (CHCI_TR_UART == 1) +#include "pal_uart.h" +#include "pal_sys.h" +#else +#include "fake_lhci_drv.h" +#endif + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +/*! \brief Maximum read buffer length allowed by UART DMA. */ +#define LHCI_MAX_RD_BUF_LEN 255 + +/*! \brief Maximum write buffer length allowed by UART DMA. */ +#define LHCI_MAX_WR_BUF_LEN 255 + +/*! \brief Maximum read header length. */ +#define LHCI_MAX_RD_HDR_LEN (1 + 4) /* type + max header length */ + +/************************************************************************************************** + Data Types +**************************************************************************************************/ + +/*! \brief Transport control block. */ +typedef struct +{ + wsfHandlerId_t handlerId; /*!< Handler ID. */ + uint8_t *pDataPending; /*!< Data packet in progress. */ + uint8_t typePending; /*!< Data type in progress. */ + uint8_t protPending; /*!< Protocol in progress. */ + uint8_t nextAvailMask; /*!< Next available mask. */ + + uint32_t cmdCount; /*!< Counter of commands */ + uint32_t evtCount; /*!< Counter of events */ + + ChciTrSendHwErrorCback_t sendHwErrorCback; /*!< Send HW error callback. */ + + struct + { + ChciTrRecvCback_t recvCback; /*!< Message received callback. */ + ChciTrSendCompleteCback_t sendCompleteCback; /*!< Message send complete callback. */ + ChciTrServiceCback_t serviceCback; /*!< Service callback. */ + } protCbacks[CHCI_TR_PROT_NUM]; /*!< Callback array indexed by protocol ID. */ + + /* Read buffer state. */ + uint8_t rxPktState; /*!< Receive state. */ + uint8_t rdHdr[LHCI_MAX_RD_HDR_LEN]; /*!< Read header buffer. */ + uint16_t rdBufOffs; /*!< Write data buffer offset. */ + uint16_t rdBufLen; /*!< Write data buffer length. */ + uint8_t *pRdBuf; /*!< Read data buffer. */ + + /* Write buffer state. */ + uint16_t wrBufOffs; /*!< Write data buffer offset. */ + uint16_t wrBufLen; /*!< Write data buffer length. */ + uint8_t *pWrBuf; /*!< Write data buffer. */ + bool_t wrBufComp; /*!< Write buffer completed. */ +} chciTrCtrlBlk_t; + +/*! \brief Send handler. */ +typedef void (*chciTrSendHandler_t)(uint8_t *pBuf); + +/*! \brief Transport events. */ +enum +{ + CHCI_TR_EVT_SEND_CMPL = (1 << 0) /*!< Send complete. */ +}; + +/*! \brief Receive state. */ +enum +{ + CHCI_RX_STATE_IDLE, /*!< Idle state. */ + CHCI_RX_STATE_TYPE, /*!< Type parse state. */ + CHCI_RX_STATE_HEADER, /*!< Header parse state. */ + CHCI_RX_STATE_PAYLOAD, /*!< Payload parse state. */ + CHCI_RX_STATE_COMPLETE /*!< Complete state. */ +}; + +/************************************************************************************************** + Global Variables +**************************************************************************************************/ + +/*! \brief Current event data in progress. */ +chciTrCtrlBlk_t chciTrCb; + +/*************************************************************************************************/ +/*! + * \brief Signal a hardware error. + * + * \param code Error code. + * + * \return None. + */ +/*************************************************************************************************/ +static void chciTrHwError(uint8_t code) +{ + if (chciTrCb.sendHwErrorCback != NULL) + { + chciTrCb.sendHwErrorCback(code); + } +} + +/*************************************************************************************************/ +/*! + * \brief Increment the command and event counters. + * + * \param type Type of message. + * + * \return None. + */ +/*************************************************************************************************/ +static void chciTrIncrementCounters(uint8_t type) +{ + if (type == CHCI_TR_TYPE_CMD) + { + chciTrCb.cmdCount++; + } + else if (type == CHCI_TR_TYPE_EVT) + { + chciTrCb.evtCount++; + } +} + +/*************************************************************************************************/ +/*! + * \brief Setup a read data buffer. + * + * \param len Number of bytes to write. + * \param pData Byte array to write. + * + * \return None. + */ +/*************************************************************************************************/ +static void chciTrRead(uint16_t len, uint8_t *pData) +{ + WSF_ASSERT(len <= LHCI_MAX_RD_BUF_LEN); +#if (CHCI_TR_UART == 1) + PalUartReadData(PAL_UART_ID_CHCI, pData, len); +#endif +} + +/*************************************************************************************************/ +/*! + * \brief Receive packet state machine. + * + * \return None. + */ +/*************************************************************************************************/ +static void chciRxPacketSM(void) +{ + /* --- Type State --- */ + if (chciTrCb.rxPktState == CHCI_RX_STATE_TYPE) + { + chciTrCb.rxPktState = CHCI_RX_STATE_HEADER; + /* Determine header length based on packet type. */ + switch(chciTrCb.rdHdr[0]) + { + case HCI_CMD_TYPE: + chciTrRead(HCI_CMD_HDR_LEN, &chciTrCb.rdHdr[1]); + break; + case HCI_ACL_TYPE: + chciTrRead(HCI_ACL_HDR_LEN, &chciTrCb.rdHdr[1]); + break; + case HCI_ISO_TYPE: + chciTrRead(HCI_ISO_HDR_LEN, &chciTrCb.rdHdr[1]); + break; + case CHCI_15P4_CMD_TYPE: + case CHCI_15P4_DATA_TYPE: + chciTrRead(CHCI_15P4_HDR_LEN, &chciTrCb.rdHdr[1]); + break; + default: + /* Invalid byte received. */ + chciTrHwError(CHCI_TR_CODE_INVALID_DATA); + chciTrCb.rxPktState = CHCI_RX_STATE_IDLE; + } + } + + /* --- Header State --- */ + else if (chciTrCb.rxPktState == CHCI_RX_STATE_HEADER) + { + uint8_t hdrLen = 0; + uint16_t dataLen = 0; + + /* Extract data length from header. */ + switch (chciTrCb.rdHdr[0]) + { + case HCI_CMD_TYPE: + hdrLen = HCI_CMD_HDR_LEN; + dataLen = (uint16_t)chciTrCb.rdHdr[3]; + break; + case HCI_ACL_TYPE: + hdrLen = HCI_ACL_HDR_LEN; + BYTES_TO_UINT16(dataLen, &chciTrCb.rdHdr[3]); + break; + case HCI_ISO_TYPE: + hdrLen = HCI_ISO_HDR_LEN; + BYTES_TO_UINT16(dataLen, &chciTrCb.rdHdr[3]); + break; + case CHCI_15P4_CMD_TYPE: + case CHCI_15P4_DATA_TYPE: + hdrLen = CHCI_15P4_HDR_LEN; + BYTES_TO_UINT16(dataLen, &chciTrCb.rdHdr[2]); + break; + default: + /* already validated in CHCI_RX_STATE_TYPE */ + break; + } + + if ((chciTrCb.pRdBuf = (uint8_t *)WsfMsgAlloc(hdrLen + dataLen + CHCI_BUF_TAILROOM)) != NULL) + { + if (dataLen > 0) + { + /* Bound read size to UART DMA maximum length. */ + uint16_t blkLen = WSF_MIN(dataLen, LHCI_MAX_RD_BUF_LEN); + + /* Read additional payload data. */ + chciTrRead(blkLen, chciTrCb.pRdBuf + hdrLen); + chciTrCb.rdBufLen = hdrLen + dataLen; + chciTrCb.rdBufOffs = hdrLen + blkLen; + chciTrCb.rxPktState = CHCI_RX_STATE_PAYLOAD; + } + else + { + /* No more data. */ + chciTrCb.rxPktState = CHCI_RX_STATE_COMPLETE; + } + /* Remove packet type encapsulation. */ + memcpy(chciTrCb.pRdBuf, &chciTrCb.rdHdr[1], hdrLen); + } + else + { + chciTrHwError(CHCI_TR_CODE_OUT_OF_MEMORY); + chciTrCb.rxPktState = CHCI_RX_STATE_IDLE; + } + } + + /* --- Data State --- */ + else if (chciTrCb.rxPktState == CHCI_RX_STATE_PAYLOAD) + { + uint16_t blkLen = WSF_MIN((chciTrCb.rdBufLen - chciTrCb.rdBufOffs), LHCI_MAX_RD_BUF_LEN); + if (blkLen > 0) + { + /* Bound read size to UART DMA maximum length. */ + blkLen = WSF_MIN(blkLen, LHCI_MAX_RD_BUF_LEN); + + /* Read next block. */ + chciTrRead(blkLen, chciTrCb.pRdBuf + chciTrCb.rdBufOffs); + chciTrCb.rdBufOffs += blkLen; + } + else + { + chciTrCb.rxPktState = CHCI_RX_STATE_COMPLETE; + } + } + + /* --- Complete State --- */ + /* N.B. There is no else-if construct by design. */ + if (chciTrCb.rxPktState == CHCI_RX_STATE_COMPLETE) + { + WSF_ASSERT(chciTrCb.pRdBuf); + + switch (chciTrCb.rdHdr[0]) + { + case HCI_CMD_TYPE: + chciTrRecv(CHCI_TR_PROT_BLE, CHCI_TR_TYPE_CMD, chciTrCb.pRdBuf); + break; + case HCI_ACL_TYPE: + chciTrRecv(CHCI_TR_PROT_BLE, CHCI_TR_TYPE_DATA, chciTrCb.pRdBuf); + break; + case HCI_ISO_TYPE: + chciTrRecv(CHCI_TR_PROT_BLE, CHCI_TR_TYPE_ISO, chciTrCb.pRdBuf); + break; + case CHCI_15P4_CMD_TYPE: + chciTrRecv(CHCI_TR_PROT_15P4, CHCI_TR_TYPE_CMD, chciTrCb.pRdBuf); + break; + case CHCI_15P4_DATA_TYPE: + chciTrRecv(CHCI_TR_PROT_15P4, CHCI_TR_TYPE_DATA, chciTrCb.pRdBuf); + break; + default: + break; + } + + chciTrCb.pRdBuf = NULL; + + chciTrCb.rxPktState = CHCI_RX_STATE_IDLE; + } + + /* --- Idle State --- */ + /* N.B. There is no else-if construct by design. */ + if (chciTrCb.rxPktState == CHCI_RX_STATE_IDLE) + { + /* Read packet type. */ + chciTrRead(1, &chciTrCb.rdHdr[0]); + chciTrCb.rxPktState = CHCI_RX_STATE_TYPE; + } +} + +/*************************************************************************************************/ +/*! + * \brief Tx complete callback. + * + * \return None. + */ +/*************************************************************************************************/ +static void chciTxComplete(void) +{ + uint16_t blkLen = WSF_MIN((chciTrCb.wrBufLen - chciTrCb.wrBufOffs), LHCI_MAX_WR_BUF_LEN); + + if (blkLen) + { + #if (CHCI_TR_UART == 1) + PalUartWriteData(PAL_UART_ID_CHCI, chciTrCb.pWrBuf + chciTrCb.wrBufOffs, blkLen); + #endif + chciTrCb.wrBufOffs += blkLen; + } + else + { + /* Completion handled in task context, i.e. ChciTrService(). */ + chciTrCb.wrBufComp = TRUE; + } +} + +/*************************************************************************************************/ +/*! + * \brief Write data the driver. + * + * \param prot Protocol. + * \param type Packet type. + * \param len Number of bytes to write. + * \param pData Byte array to write. + * + * \return None. + * + * \note The type parameter allows the driver layer to prepend the data with a header on the + * same write transaction. + */ +/*************************************************************************************************/ +static void chciTrWrite(uint8_t prot, uint8_t type, uint16_t len, uint8_t *pData) +{ +#if (CHCI_TR_UART == 1) + /* Initialize write buffer state. */ + chciTrCb.wrBufLen = len + 1; /* use wsfMsg_t headroom */ + if (prot == CHCI_TR_PROT_15P4) + { + *(pData - 1) = (type == CHCI_TR_TYPE_EVT) ? CHCI_15P4_CMD_TYPE : CHCI_15P4_DATA_TYPE; + } + else + { + if (type == CHCI_TR_TYPE_EVT) + { + *(pData - 1) = HCI_EVT_TYPE; + } + else if (type == CHCI_TR_TYPE_DATA) + { + *(pData - 1) = HCI_ACL_TYPE; + } + else + { + /* CHCI_TR_TYPE_ISO */ + *(pData - 1) = HCI_ISO_TYPE; + } + } + chciTrCb.pWrBuf = pData - 1; + chciTrCb.wrBufOffs = WSF_MIN(chciTrCb.wrBufLen, LHCI_MAX_WR_BUF_LEN); + + /* Initiate Tx operation. */ + PalUartWriteData(PAL_UART_ID_CHCI, chciTrCb.pWrBuf, chciTrCb.wrBufOffs); + PalSysSetBusy(); +#else + FakeChciTrWrite(prot, type, len, pData); + chciTrCb.wrBufComp = TRUE; + ChciTrService(); +#endif +} + +/*************************************************************************************************/ +/*! + * \brief Signal the completion of a message write. + * + * \return None. + * + * This routine is used for asynchronous write operations. When the driver has completed the + * use of the write buffer, this routine is called to free the buffer and release flow control. + */ +/*************************************************************************************************/ +static void chciTrSendComplete(void) +{ + uint8_t *pBuf = chciTrCb.pDataPending; + uint8_t type = chciTrCb.typePending; + uint8_t prot = chciTrCb.protPending; + + WSF_ASSERT(chciTrCb.protCbacks[prot].sendCompleteCback != NULL); + + /* Protocol will free buffer. */ + chciTrCb.pDataPending = NULL; + chciTrCb.protCbacks[prot].sendCompleteCback(type, pBuf); + WsfSetEvent(chciTrCb.handlerId, CHCI_TR_EVT_SEND_CMPL); +} + +/*************************************************************************************************/ +/*! + * \brief Get the HCI command and event counts. + * + * \param pCmdCount Pointer to uint32_t to hold command count. + * \param pEvtCount Pointer to uint32_t to hold event count. + * + * \return None. + */ +/*************************************************************************************************/ +void ChciTrGetCmdEvtCounts(uint32_t *pCmdCount, uint32_t *pEvtCount) +{ + *pCmdCount = chciTrCb.cmdCount; + *pEvtCount = chciTrCb.evtCount; +} + +/*************************************************************************************************/ +/*! + * \brief Reset the HCI command and event counts to zero. + * + * \return None. + */ +/*************************************************************************************************/ +void ChciTrResetCmdEvtCounts(void) +{ + chciTrCb.cmdCount = 0; + chciTrCb.evtCount = 0; +} + +/*************************************************************************************************/ +/*! + * \brief Initialize the transport handler. + * + * \param handlerId Handler ID. + * + * \return None. + */ +/*************************************************************************************************/ +void ChciTrHandlerInit(wsfHandlerId_t handlerId) +{ + memset(&chciTrCb, 0, sizeof(chciTrCb)); + chciTrCb.handlerId = handlerId; + +#if (CHCI_TR_UART == 1) + PalUartConfig_t cfg; + cfg.baud = UART_BAUD; + cfg.hwFlow = UART_DEFAULT_CONFIG_HWFC; + cfg.rdCback = chciRxPacketSM; + cfg.wrCback = chciTxComplete; + PalUartInit(PAL_UART_ID_CHCI, &cfg); +#else + (void)chciRxPacketSM; + (void)chciTxComplete; +#endif + /* Start receiver. */ + chciRxPacketSM(); +} + +/*************************************************************************************************/ +/*! + * \brief Controller HCI transport message dispatch handler. + * + * \param event WSF event. + * \param pMsg WSF message. + * + * \return None. + */ +/*************************************************************************************************/ +void ChciTrHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg) +{ + if (chciTrCb.pDataPending == NULL) + { + uint8_t protCount = 0; + uint8_t prot = chciTrCb.protPending; /* last protocol serviced */ + + do + { + uint8_t type = 0; + uint8_t *pData = NULL; + uint16_t len = 0; + + prot = (prot + 1 >= CHCI_TR_PROT_NUM) ? 0 : (prot + 1); + + if ((chciTrCb.protCbacks[prot].serviceCback != NULL) && + chciTrCb.protCbacks[prot].serviceCback(&type, &len, &pData)) + { + chciTrCb.pDataPending = pData; + chciTrCb.typePending = type; + chciTrCb.protPending = prot; + + chciTrIncrementCounters(type); + chciTrWrite(prot, type, len, pData); + break; + } + } while (++protCount < CHCI_TR_PROT_NUM); + } +} + +/*************************************************************************************************/ +/*! + * \brief Set callbacks for a protocol. + * + * \param prot Protocol. + * \param recvCback Message received callback. + * \param sendCompleteCback Message send complete callback. + * \param serviceCback Service callback. + * + * \return None. + */ +/*************************************************************************************************/ +void ChciTrSetCbacks(uint8_t prot, ChciTrRecvCback_t recvCback, ChciTrSendCompleteCback_t sendCompleteCback, + ChciTrServiceCback_t serviceCback) +{ + if (prot < CHCI_TR_PROT_NUM) + { + chciTrCb.protCbacks[prot].recvCback = recvCback; + chciTrCb.protCbacks[prot].sendCompleteCback = sendCompleteCback; + chciTrCb.protCbacks[prot].serviceCback = serviceCback; + } +} + +/*************************************************************************************************/ +/*! + * \brief Set send hardware error callback. + * + * \param sendHwErrorCback Send hardware error callback. + * + * \return None. + */ +/*************************************************************************************************/ +void ChciTrSetSendHwErrorCback(ChciTrSendHwErrorCback_t sendHwErrorCback) +{ + chciTrCb.sendHwErrorCback = sendHwErrorCback; +} + +/*************************************************************************************************/ +/*! + * \brief Flag protocol for needing service. + * + * \param prot Protocol. + * + * \return None. + */ +/*************************************************************************************************/ +void ChciTrNeedsService(uint8_t prot) +{ + if (chciTrCb.pDataPending == NULL) + { + ChciTrHandler(CHCI_TR_EVT_SEND_CMPL, NULL); + } +} + +/*************************************************************************************************/ +/*! + * \brief Signal the completion of a message receive. + * + * \param prot Protocol. + * \param type Message type. + * \param pBuf Message. + * + * \return None. + */ +/*************************************************************************************************/ +void chciTrRecv(uint8_t prot, uint8_t type, uint8_t *pBuf) +{ + chciTrIncrementCounters(type); + + if (prot < CHCI_TR_PROT_NUM) + { + if (chciTrCb.protCbacks[prot].recvCback != NULL) + { + /* Protocol will free buffer. */ + chciTrCb.protCbacks[prot].recvCback(type, pBuf); + return; + } + } + + /* Free buffer that cannot be handled. */ + WsfMsgFree(pBuf); +} + +/*************************************************************************************************/ +/*! + * \brief Service the transport device. + * + * \return TRUE if work pending, FALSE if no work is pending. + */ +/*************************************************************************************************/ +bool_t ChciTrService(void) +{ + if (chciTrCb.wrBufComp) + { + chciTrCb.wrBufComp = FALSE; + chciTrSendComplete(); + #if (CHCI_TR_UART == 1) + PalSysSetIdle(); + #endif + return TRUE; + } + + return FALSE; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/sch/sch_int.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/sch/sch_int.h index 9d9bb7bb9c..20d1ca969b 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/sch/sch_int.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/sch/sch_int.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,8 @@ /*************************************************************************************************/ /*! - * \brief Internal multi-protocol scheduler interface file. + * \file + * \brief Internal multi-protocol scheduler interface file. */ /*************************************************************************************************/ @@ -24,7 +25,7 @@ #define SCH_INT_H #include "sch_api.h" -#include "bb_drv.h" +#include "pal_bb.h" #include "wsf_assert.h" #ifdef __cplusplus @@ -38,6 +39,9 @@ extern "C" { /*! \brief Maximum span of scheduler elements. */ #define SCH_MAX_SPAN 0x80000000 +/*! \brief Typical time needed for loading BOD. */ +#define SCH_LOAD_DELAY_US 300 + /************************************************************************************************** Constants **************************************************************************************************/ @@ -46,7 +50,6 @@ extern "C" { enum { SCH_STATE_IDLE, /*!< Scheduler idle. */ - SCH_STATE_LOAD, /*!< Scheduler loading next BOD. */ SCH_STATE_EXEC /*!< Scheduler executing BOD. */ }; @@ -54,22 +57,15 @@ enum Data Types **************************************************************************************************/ -typedef struct -{ - bool_t active; /*!< Whether background task is active. */ - BbOpDesc_t *pBod; /*!< Head element of scheduled list of BOD. */ -} SchBackground_t; - /*! \brief Scheduler control block. */ typedef struct { bool_t state; /*!< Current scheduler state. */ - bool_t eventSetFlag; /*!< Scheduler event set (BB terminated BOD). */ + uint8_t eventSetFlagCount; /*!< Scheduler event set count. */ wsfHandlerId_t handlerId; /*!< System event handler ID. */ BbOpDesc_t *pHead; /*!< Head element of scheduled list of BOD. */ BbOpDesc_t *pTail; /*!< Tail element of scheduled list of BOD. */ - SchBackground_t background; /*!< Background BOD. */ } SchCtrlBlk_t; /************************************************************************************************** @@ -83,7 +79,7 @@ extern SchCtrlBlk_t schCb; **************************************************************************************************/ /* Load */ -void schLoadNext(void); +bool_t schTryCurTailLoadNext(void); bool_t schTryLoadHead(void); /* List management */ @@ -102,7 +98,7 @@ static inline bool_t schDueTimeInFuture(BbOpDesc_t *pBod) { bool_t result = FALSE; - const uint32_t curTime = BbDrvGetCurrentTime(); + const uint32_t curTime = PalBbGetCurrentTime(USE_RTC_BB_CLK); const uint32_t delta = pBod->due - curTime; if (delta < SCH_MAX_SPAN) /* due time has not passed */ @@ -113,6 +109,36 @@ static inline bool_t schDueTimeInFuture(BbOpDesc_t *pBod) return result; } + +/*************************************************************************************************/ +/*! + * \brief Return the time between now and the BOD to be executed. + * + * \param pBod Target BOD. + * + * \return usec. + */ +/*************************************************************************************************/ +static inline uint32_t schGetTimeToExecBod(BbOpDesc_t *pBod) +{ + uint32_t result = 0; + + const uint32_t curTime = PalBbGetCurrentTime(USE_RTC_BB_CLK); + const uint32_t delta = pBod->due - curTime; + + if ((delta >= BB_US_TO_BB_TICKS(SCH_LOAD_DELAY_US)) && /* sufficient time to cancel */ + (delta < SCH_MAX_SPAN)) /* due time has not passed */ + { + result = BB_TICKS_TO_US(delta - BB_US_TO_BB_TICKS(SCH_LOAD_DELAY_US)); + } + else + { + result = 0; + } + + return result; +} + #ifdef __cplusplus }; #endif diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/sch/sch_list.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/sch/sch_list.c index 0d72839a1b..1acb01a1bb 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/sch/sch_list.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/sch/sch_list.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,11 +16,13 @@ /*************************************************************************************************/ /*! - * \brief Operation list maintenance implementation file. + * \file + * \brief Operation list maintenance implementation file. */ /*************************************************************************************************/ #include "sch_int.h" +#include "pal_timer.h" #include "wsf_assert.h" #include "wsf_cs.h" #include "wsf_math.h" @@ -45,6 +47,12 @@ /*! \brief Is BOD[a] due time after BOD[b] completion time. */ #define SCH_IS_DUE_AFTER(a, b, rt) SCH_IS_DONE_BEFORE(b, a, rt) +/*! \brief Minimum time in microseconds to start scheduler timer. */ +#define SCH_MIN_TIMER_USEC 5 + +/*! \brief Margin in microseconds to cancel a BOD. */ +#define SCH_CANCEL_MARGIN_USEC 15 + #ifndef SCH_TRACE_ENABLE /*! \brief Enable scheduler trace. */ #define SCH_TRACE_ENABLE FALSE @@ -65,7 +73,8 @@ /*! \brief Warning trace with 1 parameters. */ #define SCH_TRACE_WARN1(msg, var1) #endif - +/*! \brief Maximum allowed number of deleted BOD due to conflicts. */ +#define SCH_MAX_DELETE_BOD 8 #ifndef SCH_CHECK_LIST_INTEGRITY /*! \brief Check list requirements upon insertions and removals. */ #define SCH_CHECK_LIST_INTEGRITY FALSE @@ -91,17 +100,18 @@ static inline void SchCheckIsNotInserted(BbOpDesc_t *pBod) pCur = pCur->pNext; } } +#endif /*************************************************************************************************/ /*! - * \brief Ensure BOD is already inserted in the list. + * \brief Check whether BOD is inserted in the list. * * \param pBod Target BOD. * - * \return None. + * \return True if BOD is inserted. */ /*************************************************************************************************/ -static inline void SchCheckIsInserted(BbOpDesc_t *pBod) +static inline bool_t SchCheckIsInserted(BbOpDesc_t *pBod) { BbOpDesc_t *pCur = schCb.pHead; @@ -110,13 +120,13 @@ static inline void SchCheckIsInserted(BbOpDesc_t *pBod) if (pCur == pBod) { /* pBod found in the list. */ - return; + return TRUE; } pCur = pCur->pNext; } - WSF_ASSERT(pCur != NULL); + + return FALSE; } -#endif /*************************************************************************************************/ /*! @@ -131,7 +141,7 @@ static inline bool_t SchEnoughTimeToCancel(BbOpDesc_t *pBod) { bool_t result = FALSE; - const uint32_t curTime = BbDrvGetCurrentTime(); + const uint32_t curTime = PalBbGetCurrentTime(USE_RTC_BB_CLK); const uint32_t delta = pBod->due - curTime; if ((delta >= BB_US_TO_BB_TICKS(BbGetSchSetupDelayUs())) && /* sufficient time to cancel */ @@ -160,36 +170,38 @@ static inline uint32_t SchGetStartRefTime(void) } else { - return BbDrvGetCurrentTime(); + return PalBbGetCurrentTime(USE_RTC_BB_CLK); } } /*************************************************************************************************/ /*! - * \brief Cancel current head operation. + * \brief Check and return the status of whether it is ok to cancel the head BOD. * * \return TRUE if successful, FALSE otherwise. */ /*************************************************************************************************/ -static inline bool_t schCancelHead(void) +static inline bool_t schCheckCancelHead(void) { bool_t result = FALSE; - - if (schCb.state == SCH_STATE_EXEC) +#if SCH_TIMER_REQUIRED == TRUE + if (schCb.state == SCH_STATE_IDLE) { - if ((result = SchEnoughTimeToCancel(schCb.pHead)) == TRUE) - { - BbCancelBod(); - - schCb.state = SCH_STATE_IDLE; - } + result = SchEnoughTimeToCancel(schCb.pHead); } else { - /* If not the current BOD then cancel is unconditional. */ - result = TRUE; + /* If head BOD is executing, it can't be canceled. */ + result = FALSE; } - +#else + /* For platforms without sch timer, cancel the head. */ + if ((result = SchEnoughTimeToCancel(schCb.pHead)) == TRUE) + { + BbCancelBod(); + schCb.state = SCH_STATE_IDLE; + } +#endif return result; } @@ -232,7 +244,8 @@ static inline void schInsertToEmptyList(BbOpDesc_t *pItem) /*************************************************************************************************/ static inline void schInsertBefore(BbOpDesc_t *pItem, BbOpDesc_t *pTgt) { - WSF_ASSERT(pTgt && pItem); + WSF_ASSERT(pTgt); + WSF_ASSERT(pItem); pItem->pNext = pTgt; pItem->pPrev = pTgt->pPrev; @@ -265,7 +278,8 @@ static inline void schInsertBefore(BbOpDesc_t *pItem, BbOpDesc_t *pTgt) /*************************************************************************************************/ static inline void schInsertAfter(BbOpDesc_t *pItem, BbOpDesc_t *pTgt) { - WSF_ASSERT(pTgt && pItem); + WSF_ASSERT(pTgt); + WSF_ASSERT(pItem); pItem->pPrev = pTgt; pItem->pNext = pTgt->pNext; @@ -339,7 +353,8 @@ static void schRemoveMiddle(BbOpDesc_t *pBod) else { /* Linkage is intact. */ - WSF_ASSERT(pBod->pPrev && pBod->pNext); + WSF_ASSERT(pBod->pPrev); + WSF_ASSERT(pBod->pNext); /* Middle element */ pBod->pPrev->pNext = pBod->pNext; @@ -368,23 +383,58 @@ static bool_t schRemoveForConflict(BbOpDesc_t *pBod) bool_t result = FALSE; +#if SCH_TIMER_REQUIRED == FALSE if (schCb.pHead == pBod) { - if (schCb.state == SCH_STATE_EXEC) - { - if ((result = SchEnoughTimeToCancel(pBod)) == TRUE) - { - BbCancelBod(); - schRemoveHead(); - result = TRUE; - } - } - else + if ((result = SchEnoughTimeToCancel(pBod)) == TRUE) { + /* Stop timer for canceled BOD. */ + PalTimerStop(); + schRemoveHead(); + + if (schCb.pHead) + { + PalTimerStart(schGetTimeToExecBod(schCb.pHead)); + } + schCb.state = SCH_STATE_IDLE; result = TRUE; } } +#else + if (schCb.pHead == pBod) + { + if (schCb.state == SCH_STATE_IDLE && (result = SchEnoughTimeToCancel(pBod)) == TRUE) + { + /* Stop timer for canceled BOD. */ + PalTimerStop(); + + schRemoveHead(); + + if (schCb.pHead) + { + PalTimerStart(schGetTimeToExecBod(schCb.pHead)); + } + result = TRUE; + } + } + else if (schCb.pHead->pNext == pBod && schCb.state == SCH_STATE_EXEC) + { + if ((result = SchEnoughTimeToCancel(pBod)) == TRUE) + { + /* Stop timer for next BOD. */ + PalTimerStop(); + + schRemoveMiddle(pBod); + + if (schCb.pHead->pNext) + { + PalTimerStart(schGetTimeToExecBod(schCb.pHead->pNext)); + } + result = TRUE; + } + } +#endif else { schRemoveMiddle(pBod); @@ -447,19 +497,54 @@ static bool_t SchIsBodResolvable(BbOpDesc_t *pItem, BbOpDesc_t *pTgt, BbConflict static bool_t SchResolveConflict(BbOpDesc_t *pItem, BbOpDesc_t *pTgt) { bool_t result = FALSE; + BbOpDesc_t *pCur = pTgt; + int numDeletedBod = 0; + BbOpDesc_t *pDeleted[SCH_MAX_DELETE_BOD]; - BbOpDesc_t *pNext = pTgt->pNext; - BbOpDesc_t *pPrev = pTgt->pPrev; + const uint32_t startRef = SchGetStartRefTime(); - if ((result = schRemoveForConflict(pTgt)) == TRUE) + WSF_ASSERT(pTgt); + WSF_ASSERT(pItem); + + while (TRUE) { - if (pNext) + if (numDeletedBod == SCH_MAX_DELETE_BOD) { - schInsertBefore(pItem, pNext); + result = FALSE; + break; } - else if (pPrev) + + pDeleted[numDeletedBod++] = pCur; + + if ((pCur->pNext == NULL) || /* pCur is the tail. */ + (SCH_IS_DONE_BEFORE(pItem, pCur->pNext, startRef))) /* Only conflict with pCur. */ { - schInsertAfter(pItem, pPrev); + /* Remove only 1 conflicting BOD. */ + result = schRemoveForConflict(pCur); + break; + } + else + { + /* Remove all conflicting BODs until it fails. */ + if ((result = schRemoveForConflict(pCur)) == FALSE) + { + break; + } + } + + /* Traverse to the next BOD. */ + pCur = pCur->pNext; + } + + if (result == TRUE) + { + if (pCur->pNext) + { + schInsertBefore(pItem, pCur->pNext); + } + else if (pTgt->pPrev) + { + schInsertAfter(pItem, pTgt->pPrev); } else { @@ -467,9 +552,13 @@ static bool_t SchResolveConflict(BbOpDesc_t *pItem, BbOpDesc_t *pTgt) schInsertToEmptyList(pItem); } - if (pTgt->abortCback) + /* Call abort callback for all removed BODs. */ + for (int i = 0; i < numDeletedBod; i++) { - pTgt->abortCback(pTgt); + if (pDeleted[i]->abortCback) + { + pDeleted[i]->abortCback(pDeleted[i]); + } } } else @@ -480,56 +569,6 @@ static bool_t SchResolveConflict(BbOpDesc_t *pItem, BbOpDesc_t *pTgt) return result; } -/*************************************************************************************************/ -/*! - * \brief Remove background BOD. - * - * \return None. - * - * \note Removes the background BOD, usually unconditionally. It will call the BOD's cancel - * callback. - */ -/*************************************************************************************************/ -void SchRemoveBackground(void) -{ - if ((schCb.background.pBod != NULL) && - schCb.background.active) - { - BbCancelBod(); - schCb.background.active = FALSE; - } -} - -/*************************************************************************************************/ -/*! - * \brief Insert BOD into background slot. - * - * \param pBod Element to insert. - * - * \return None. - * - * Insert this BOD in the background slot. - */ -/*************************************************************************************************/ -void SchInsertBackground(BbOpDesc_t *pBod) -{ - /* Only set if there is no current background or activity in the list */ - if ((schCb.background.pBod == NULL) && - !schCb.background.active) - { - /* Mark the BOD as background */ - schCb.background.pBod = pBod; - if (schCb.pHead == NULL) - { - /* Only start it if there is no other active BOD */ - BbExecuteBod(pBod); - schCb.background.active = TRUE; - } - } - SCH_TRACE_INFO1("++| schInsertBackground |++ pBod=0x%08x", (uint32_t)pBod); - SCH_TRACE_INFO1("++| |++ .active=%u", (uint32_t)schCb.background.active); -} - /*************************************************************************************************/ /*! * \brief Check whether the conflicts between pItem and BODs starting at pTgt are @@ -548,7 +587,8 @@ static bool_t SchIsConflictResolvable(BbOpDesc_t *pItem, BbOpDesc_t *pTgt, BbCon const uint32_t startRef = SchGetStartRefTime(); BbOpDesc_t *pCur = pTgt; - WSF_ASSERT(pTgt && pItem); + WSF_ASSERT(pTgt) + WSF_ASSERT(pItem); while (TRUE) { @@ -574,6 +614,67 @@ static bool_t SchIsConflictResolvable(BbOpDesc_t *pItem, BbOpDesc_t *pTgt, BbCon return result; } +/*************************************************************************************************/ +/*! + * \brief Try to load or add scheduler timer for inserted item if possible. + * + * \param pBod Inserted BOD. + * + * \return None. + */ +/*************************************************************************************************/ +static inline void SchInsertTryLoadBod(BbOpDesc_t *pBod) +{ + uint32_t execTimeUsec = schGetTimeToExecBod(pBod); + + WSF_ASSERT(pBod); + WSF_ASSERT(schCb.pHead); + + /* If inserted BOD is head. */ + if (pBod == schCb.pHead) + { + /* At this moment, head BOD should not be loaded. */ + WSF_ASSERT(schCb.state == SCH_STATE_IDLE); + if (execTimeUsec >= SCH_MIN_TIMER_USEC) + { + /* If HEAD BOD due time is not close, add scheduler timer to load it in the future. + * Always stop existing timer first for simplicity. + */ + PalTimerStop(); + PalTimerStart(execTimeUsec); + } + else + { + /* Send scheduler load event. */ + SchLoadHandler(); + } + } +#if SCH_TIMER_REQUIRED == TRUE + /* If head is executing and inserted BOD is the second one in the list, + * we might need to add scheduler timer or do curtail load. + */ + else if (pBod == schCb.pHead->pNext && schCb.state == SCH_STATE_EXEC) + { + /* At this moment, head BOD should be in the past. */ + WSF_ASSERT(schGetTimeToExecBod(schCb.pHead) == 0); + + if (execTimeUsec >= SCH_MIN_TIMER_USEC) + { + /* If BOD due time is not close, add scheduler timer to load it in the future. + * Always stop existing timer first for simplicity. + */ + PalTimerStop(); + PalTimerStart(execTimeUsec); + } + else + { + /* Send scheduler load event. */ + SchLoadHandler(); + } + } +#endif +} + /*************************************************************************************************/ /*! * \brief Insert item into BOD list at the next available opportunity. @@ -591,18 +692,16 @@ void SchInsertNextAvailable(BbOpDesc_t *pBod) SchCheckIsNotInserted(pBod); #endif - SchRemoveBackground(); - const uint32_t startRef = SchGetStartRefTime(); - pBod->due = BbDrvGetCurrentTime() + BB_US_TO_BB_TICKS(BbGetSchSetupDelayUs()); + pBod->due = PalBbGetCurrentTime(USE_RTC_BB_CLK) + BB_US_TO_BB_TICKS(BbGetSchSetupDelayUs()); if (schCb.pHead == NULL) { schInsertToEmptyList(pBod); } else if (SCH_IS_DONE_BEFORE(pBod, schCb.pHead, startRef) && - schCancelHead()) + schCheckCancelHead()) { /* Insert at head */ WSF_ASSERT(pBod != schCb.pHead); @@ -633,7 +732,7 @@ void SchInsertNextAvailable(BbOpDesc_t *pBod) } } - schLoadNext(); + SchInsertTryLoadBod(pBod); } /*************************************************************************************************/ @@ -656,8 +755,6 @@ bool_t SchInsertAtDueTime(BbOpDesc_t *pBod, BbConflictAct_t conflictCback) SchCheckIsNotInserted(pBod); #endif - SchRemoveBackground(); - const uint32_t startRef = SchGetStartRefTime(); if (!schDueTimeInFuture(pBod)) @@ -681,17 +778,18 @@ bool_t SchInsertAtDueTime(BbOpDesc_t *pBod, BbConflictAct_t conflictCback) { WSF_ASSERT(pBod != pCur); - if (SCH_IS_DUE_BEFORE(pBod, pCur, startRef)) /* BOD is due before pCur. */ + if (SCH_IS_DONE_BEFORE(pBod, pCur, startRef)) /* BOD is due and done before pCur(no overlap), try to insert before. */ { - if ((SCH_IS_DONE_BEFORE(pBod, pCur, startRef)) || /* BOD is due and done before pCur, insert before. */ - ((result = SchIsConflictResolvable(pBod, pCur, conflictCback)) == TRUE)) /* Check priority if due before but done after pCur. */ + if (pCur == schCb.pHead) { - schInsertBefore(pBod, pCur); - result = TRUE; + (void) schCheckCancelHead(); } + /* Insert before head case. */ + schInsertBefore(pBod, pCur); + result = TRUE; break; } - else if (!SCH_IS_DONE_BEFORE(pCur, pBod, startRef)) /* BOD is due during pCur, check priority and resolve BOD. */ + else if (!SCH_IS_DONE_BEFORE(pCur, pBod, startRef)) /* pCur has overlap with pBod, check priority and resolve BOD. */ { if ((result = SchIsConflictResolvable(pBod, pCur, conflictCback)) == TRUE) { @@ -700,7 +798,7 @@ bool_t SchInsertAtDueTime(BbOpDesc_t *pBod, BbConflictAct_t conflictCback) } break; } - else if (pCur->pNext == NULL) /* BOD is due after pCur and pCur is tail, insert after. */ + else if (pCur->pNext == NULL) /* BOD is due after pCur and pCur is tail, insert after. */ { schInsertAfter(pBod, pCur); result = TRUE; @@ -712,9 +810,9 @@ bool_t SchInsertAtDueTime(BbOpDesc_t *pBod, BbConflictAct_t conflictCback) } } - if (result && (pBod == schCb.pHead)) + if (result) { - result = schTryLoadHead(); + SchInsertTryLoadBod(pBod); } return result; @@ -742,8 +840,6 @@ bool_t SchInsertEarlyAsPossible(BbOpDesc_t *pBod, uint32_t min, uint32_t max) SchCheckIsNotInserted(pBod); #endif - SchRemoveBackground(); - bool_t result = FALSE; const uint32_t startRef = SchGetStartRefTime(); @@ -752,6 +848,12 @@ bool_t SchInsertEarlyAsPossible(BbOpDesc_t *pBod, uint32_t min, uint32_t max) /* Try inserting at minimum interval. */ pBod->due += min; + if ((max == SCH_MAX_SPAN) && !schDueTimeInFuture(pBod)) + { + /* With SCH_MAX_SPAN, this function will insert the BOD regardless of the current due. */ + pBod->due = PalBbGetCurrentTime(USE_RTC_BB_CLK) + BB_US_TO_BB_TICKS(BbGetSchSetupDelayUs()); + } + if (schDueTimeInFuture(pBod)) { if (schCb.pHead == NULL) @@ -761,7 +863,7 @@ bool_t SchInsertEarlyAsPossible(BbOpDesc_t *pBod, uint32_t min, uint32_t max) } else if (SCH_IS_DUE_BEFORE (pBod, schCb.pHead, startRef) && SCH_IS_DONE_BEFORE(pBod, schCb.pHead, startRef) && - schCancelHead()) + schCheckCancelHead()) { /* Insert at head */ WSF_ASSERT(pBod != schCb.pHead); @@ -814,9 +916,9 @@ bool_t SchInsertEarlyAsPossible(BbOpDesc_t *pBod, uint32_t min, uint32_t max) } } - if (result && (pBod == schCb.pHead)) + if (result) { - result = schTryLoadHead(); + SchInsertTryLoadBod(pBod); } if (!result) @@ -852,8 +954,6 @@ bool_t SchInsertLateAsPossible(BbOpDesc_t *pBod, uint32_t min, uint32_t max) SchCheckIsNotInserted(pBod); #endif - SchRemoveBackground(); - const uint32_t startRef = SchGetStartRefTime(); const uint32_t dueOrigin = pBod->due; @@ -899,7 +999,7 @@ bool_t SchInsertLateAsPossible(BbOpDesc_t *pBod, uint32_t min, uint32_t max) if ((nextAvailInter >= min) && (nextAvailInter <= max) && - schCancelHead()) + schCheckCancelHead()) { /* Insert at head. */ schInsertBefore(pBod, pCur); @@ -933,9 +1033,9 @@ bool_t SchInsertLateAsPossible(BbOpDesc_t *pBod, uint32_t min, uint32_t max) } } - if (result && (pBod == schCb.pHead)) + if (result) { - result = schTryLoadHead(); + SchInsertTryLoadBod(pBod); } if (!result) @@ -962,72 +1062,90 @@ bool_t SchRemove(BbOpDesc_t *pBod) { WSF_ASSERT(pBod); - if (schCb.pHead == NULL) + if (!SchCheckIsInserted(pBod)) { + LL_TRACE_WARN0("No such BOD to remove."); return FALSE; } bool_t result = FALSE; +#if SCH_TIMER_REQUIRED == FALSE if (schCb.pHead == pBod) { - if (schCb.state == SCH_STATE_EXEC) + if ((result = SchEnoughTimeToCancel(pBod)) == TRUE) { - if ((result = SchEnoughTimeToCancel(pBod)) == TRUE) - { - BbCancelBod(); + /* Stop timer for canceled BOD. */ + PalTimerStop(); - /* Call callback after removing from list. */ - schRemoveHead(); - schCb.state = SCH_STATE_LOAD; - if (pBod->abortCback) - { - pBod->abortCback(pBod); - } - schCb.state = SCH_STATE_IDLE; + /* Call callback after removing from list. */ + schRemoveHead(); - result = TRUE; - } - else + if (schCb.pHead) { - BbSetBodTerminateFlag(); + PalTimerStart(schGetTimeToExecBod(schCb.pHead)); } + + schCb.state = SCH_STATE_IDLE; + result = TRUE; } else { - /* Call callback after removing from list. */ - schRemoveHead(); - if (pBod->abortCback) - { - pBod->abortCback(pBod); - } - - result = TRUE; - } - - if (result) - { - schLoadNext(); /* TODO prevent recursion */ + BbSetBodTerminateFlag(); } } +#else + if (schCb.pHead == pBod) + { + if (schCb.state == SCH_STATE_IDLE && (result = SchEnoughTimeToCancel(pBod)) == TRUE) + { + /* Stop timer for canceled BOD. */ + PalTimerStop(); + + /* Call callback after removing from list. */ + schRemoveHead(); + + if (schCb.pHead) + { + PalTimerStart(schGetTimeToExecBod(schCb.pHead)); + } + result = TRUE; + } + else + { + BbSetBodTerminateFlag(); + } + } + else if (schCb.pHead->pNext == pBod && schCb.state == SCH_STATE_EXEC) + { + if ((result = SchEnoughTimeToCancel(pBod)) == TRUE) + { + /* Stop timer for next BOD. */ + PalTimerStop(); + + schRemoveMiddle(pBod); + + if (schCb.pHead->pNext) + { + PalTimerStart(schGetTimeToExecBod(schCb.pHead->pNext)); + } + result = TRUE; + } + } +#endif else { -#if (SCH_CHECK_LIST_INTEGRITY) - SchCheckIsInserted(pBod); -#endif - /* Call callback after removing from list. */ schRemoveMiddle(pBod); - if (pBod->abortCback) - { - pBod->abortCback(pBod); - } - result = TRUE; } if (result) { + if (pBod->abortCback) + { + pBod->abortCback(pBod); + } SCH_TRACE_INFO1("--| SchRemove |-- pBod=0x%08x", (uint32_t)pBod); SCH_TRACE_INFO1("--| |-- .due=%u", pBod->due); } @@ -1049,8 +1167,38 @@ bool_t SchRemove(BbOpDesc_t *pBod) void SchReload(BbOpDesc_t *pBod) { if ((schCb.pHead == pBod) && - schCancelHead()) + schCheckCancelHead()) { - schLoadNext(); + + SchInsertTryLoadBod(pBod); } } + +/*************************************************************************************************/ +/*! + * \brief Check if BOD can be cancelled. + * + * \param pBod Element to be cancelled + * + * \return TRUE if BOD can be cancelled, FALSE otherwise. + * + * Check if BOD can be cancelled. + */ +/*************************************************************************************************/ +bool_t SchIsBodCancellable(BbOpDesc_t *pBod) +{ + WSF_ASSERT(pBod); + + bool_t result = FALSE; + const uint32_t curTime = PalBbGetCurrentTime(USE_RTC_BB_CLK); + const uint32_t delta = pBod->due - curTime; + + /* Checking if bod can be cancelled by the client. */ + if ((delta >= (uint32_t)(BB_US_TO_BB_TICKS(BbGetSchSetupDelayUs() + SCH_CANCEL_MARGIN_USEC))) && /* sufficient time to cancel */ + (delta < SCH_MAX_SPAN)) /* due time has not passed */ + { + result = TRUE; + } + + return result; +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/sch/sch_main.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/sch/sch_main.c index a27ff7bba5..343c0bb5c2 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/sch/sch_main.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/controller/sources/common/sch/sch_main.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2019 Arm Limited +/* Copyright (c) 2019 Arm Limited * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,11 +16,13 @@ /*************************************************************************************************/ /*! - * \brief Operation list maintenance implementation file. + * \file + * \brief Operation list maintenance implementation file. */ /*************************************************************************************************/ #include "sch_int.h" +#include "pal_timer.h" #include "bb_api.h" #include "wsf_trace.h" #include @@ -32,7 +34,10 @@ /*! \brief Scheduler task events. */ enum { - SCH_EVENT_BOD_COMPLETE = (1 << 1) /*!< BOD completion event. */ + SCH_EVENT_BOD_COMPLETE = (1 << 0), /*!< BOD completion event. */ + SCH_EVENT_BOD_ABORT = (1 << 1), /*!< BOD abort event. */ + SCH_EVENT_BOD_CURTAIL = (1 << 2), /*!< BOD curtail event. */ + SCH_EVENT_BOD_LOAD = (1 << 3), /*!< BOD load event. */ }; /************************************************************************************************** @@ -55,7 +60,125 @@ static uint16_t schHandlerWatermarkUsec = 0; static void schBodCompHandler(void) { WsfSetEvent(schCb.handlerId, SCH_EVENT_BOD_COMPLETE); - schCb.eventSetFlag = TRUE; + schCb.eventSetFlagCount++; +} + +/*************************************************************************************************/ +/*! + * \brief BOD abortion handler. + * + * \return None. + */ +/*************************************************************************************************/ +static void schBodAbortHandler(void) +{ + WsfSetEvent(schCb.handlerId, SCH_EVENT_BOD_ABORT); + schCb.eventSetFlagCount++; +} + +/*************************************************************************************************/ +/*! + * \brief BOD curtail handler. + * + * \return None. + */ +/*************************************************************************************************/ +static void schBodCurtailHandler(void) +{ + WsfSetEvent(schCb.handlerId, SCH_EVENT_BOD_CURTAIL); + schCb.eventSetFlagCount++; +} + +/*************************************************************************************************/ +/*! + * \brief BOD load handler. + * + * \return None. + */ +/*************************************************************************************************/ +static void schBodLoadHandler(void) +{ + BbOpDesc_t* pNextBod = schCb.pHead; + + if (schCb.eventSetFlagCount) + { + WSF_ASSERT(pNextBod); + /* Delay loading after event flag is cleared. */ + WsfSetEvent(schCb.handlerId, SCH_EVENT_BOD_LOAD); + return; + } + else + { + /* Try load head if scheduler is idle. */ + if (schCb.state == SCH_STATE_IDLE) + { + if (!schTryLoadHead()) + { + /* Head load failed. */ + schBodAbortHandler(); + } + /* Move to next BOD. */ + pNextBod = pNextBod->pNext; + } +#if SCH_TIMER_REQUIRED == TRUE + /* If head is executed, check cur tail operation is needed or not. */ + else + { + /* Head BOD and next BOD must exist. */ + WSF_ASSERT(schCb.pHead); + WSF_ASSERT(schCb.pHead->pNext); + pNextBod = pNextBod->pNext; + + /* Skip curtail load if next BOD has same or lower priority than current BOD. */ + if ((pNextBod->reschPolicy) >= (schCb.pHead->reschPolicy)) + { + /* Delay loading until idle state. */ + WsfSetEvent(schCb.handlerId, SCH_EVENT_BOD_LOAD); + return; + } + + if (!schTryCurTailLoadNext()) + { + /* Curtail load failed. */ + schBodAbortHandler(); + } + /* Move to the next next BOD. */ + pNextBod = pNextBod->pNext; + } + } + + /* If pNextBod exists, it should start scheduler timer. */ + if (pNextBod) + { + uint32_t execTimeUsec = schGetTimeToExecBod(pNextBod); + + if (execTimeUsec) + { + /* Always stop existing timer first for simplicity. */ + PalTimerStop(); + PalTimerStart(execTimeUsec); + } + else + { + /* If this happens, it means there's something wrong with the scheduler list. */ + LL_TRACE_WARN0(" Next BOD overlaps with current BOD. "); + /* Send scheduler load event. */ + SchLoadHandler(); + } +#endif + } +} + +/*************************************************************************************************/ +/*! + * \brief Scheduler load handler. + * + * \return None. + */ +/*************************************************************************************************/ +void SchLoadHandler(void) +{ + WsfSetEvent(schCb.handlerId, SCH_EVENT_BOD_LOAD); } /*************************************************************************************************/ @@ -69,6 +192,7 @@ void SchInit(void) { memset(&schCb, 0, sizeof(schCb)); SchReset(); + PalTimerInit(schBodLoadHandler); } /*************************************************************************************************/ @@ -119,10 +243,11 @@ void SchReset(void) /*************************************************************************************************/ void SchHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg) { - /* Assume BB clock started. */ - uint32_t startTime = BbDrvGetCurrentTime(); + /* Unused parameters */ + (void)pMsg; - WSF_ASSERT(schCb.state == SCH_STATE_EXEC); + /* Assume scheduler clock started. */ + uint32_t startTime = PalTimerGetCurrentTime(); BbOpDesc_t *pBod = schCb.pHead; @@ -132,21 +257,68 @@ void SchHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg) return; } - /*** Complete current BOD ***/ - - schRemoveHead(); - - schCb.state = SCH_STATE_LOAD; - - if (pBod->endCback) + if (event & SCH_EVENT_BOD_COMPLETE) { - pBod->endCback(pBod); + WSF_ASSERT(schCb.state == SCH_STATE_EXEC); + WSF_ASSERT(schCb.eventSetFlagCount); + + /*** Complete current BOD ***/ + + schCb.state = SCH_STATE_IDLE; + schRemoveHead(); + if (pBod->endCback) + { + pBod->endCback(pBod); + } + schCb.eventSetFlagCount--; + +#if SCH_TIMER_REQUIRED == FALSE + schBodLoadHandler(); +#endif } - schCb.state = SCH_STATE_IDLE; - schLoadNext(); + if (event & SCH_EVENT_BOD_ABORT) + { + WSF_ASSERT(schCb.state == SCH_STATE_IDLE); + WSF_ASSERT(schCb.eventSetFlagCount); - uint16_t durUsec = BB_TICKS_TO_US(BbDrvGetCurrentTime() - startTime); + /*** Abort current BOD ***/ + + schRemoveHead(); + if (pBod->abortCback) + { + pBod->abortCback(pBod); + } + schCb.eventSetFlagCount--; + +#if SCH_TIMER_REQUIRED == FALSE + schBodLoadHandler(); +#endif + } + + if (event & SCH_EVENT_BOD_CURTAIL) + { + WSF_ASSERT(schCb.state == SCH_STATE_EXEC); + WSF_ASSERT(schCb.eventSetFlagCount); + + /*** Complete previous BOD ***/ + schRemoveHead(); + if (pBod->endCback) + { + pBod->endCback(pBod); + } + schCb.eventSetFlagCount--; + } + + if (event & SCH_EVENT_BOD_LOAD) + { + schBodLoadHandler(); + } + + uint32_t curTick = PalTimerGetCurrentTime(); + /* Consider both count-up or counter-down timer type. */ + uint32_t durTick = (curTick- startTime < 0x80000000) ? (curTick - startTime) : (startTime - curTick); + uint16_t durUsec = PAL_TIMER_TICKS_TO_US(durTick); if (schHandlerWatermarkUsec < durUsec) { schHandlerWatermarkUsec = durUsec; @@ -155,20 +327,17 @@ void SchHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg) /*************************************************************************************************/ /*! - * \brief Load head BOD if not already started. + * \brief Load BOD if not already started. * * \return TRUE if loaded, FALSE otherwise. */ /*************************************************************************************************/ -static bool_t schLoadHead(void) +static bool_t schLoadBod(BbOpDesc_t *pBod) { bool_t loaded = FALSE; - BbOpDesc_t *pBod = schCb.pHead; if (schDueTimeInFuture(pBod)) { - schCb.eventSetFlag = FALSE; - /* Setup BB services. */ BbExecuteBod(pBod); @@ -180,7 +349,7 @@ static bool_t schLoadHead(void) { LL_TRACE_WARN1("!!! BOD terminated on startup, pBod=0x%08x", pBod); - if (schCb.eventSetFlag) + if (schCb.eventSetFlagCount) { /* Termination or failure is scheduled to complete at next task event. */ loaded = TRUE; @@ -200,70 +369,67 @@ static bool_t schLoadHead(void) /*************************************************************************************************/ /*! - * \brief Load next BOD if not already started. + * \brief Load next BOD by curtailing the executed head BOD first. * - * \return None. + * \return TRUE if curtail loading succeeded. */ /*************************************************************************************************/ -void schLoadNext(void) +bool_t schTryCurTailLoadNext(void) { - /* Only load if scheduler is idle. */ - if (schCb.state == SCH_STATE_IDLE) + bool_t loaded = TRUE; + + /* It should only be called when scheduler is in execute state. */ + WSF_ASSERT(schCb.state == SCH_STATE_EXEC); + /* Head BOD and next BOD must exist. */ + WSF_ASSERT(schCb.pHead); + WSF_ASSERT(schCb.pHead->pNext); + + if (schCb.pHead->pNext) { - while (TRUE) + /* Hard stop head BOD and load next BOD. */ + BbCancelBod(); + schBodCurtailHandler(); + + schCb.state = SCH_STATE_EXEC; + + /* Try load next BOD. */ + if (!(schLoadBod(schCb.pHead->pNext))) { - if (!schCb.pHead) - { - schCb.state = SCH_STATE_IDLE; - if ((schCb.background.pBod != NULL) && - !schCb.background.active) - { - /* Reactivate background BOD */ - BbExecuteBod(schCb.background.pBod); - schCb.background.active = TRUE; - } - break; - } - - schCb.state = SCH_STATE_EXEC; - - if (schLoadHead()) - { - break; - } - - schCb.state = SCH_STATE_LOAD; - - SchRemove(schCb.pHead); + schCb.state = SCH_STATE_IDLE; + loaded = FALSE; } } + + return loaded; } /*************************************************************************************************/ /*! * \brief Try to load head BOD if not already started. * - * \return TRUE if load succeeded (or head BOD already started). + * \return TRUE if load succeeded. */ /*************************************************************************************************/ bool_t schTryLoadHead(void) { bool_t loaded = TRUE; - /* Only load if scheduler is idle. */ - if (schCb.state == SCH_STATE_IDLE) + /* It should only be called when scheduler is in idle state. */ + WSF_ASSERT(schCb.state == SCH_STATE_IDLE); + +#if SCH_TIMER_REQUIRED == TRUE + /* Head BOD must exist. */ + WSF_ASSERT(schCb.pHead); +#endif + + if (schCb.pHead) { - if (schCb.pHead) + schCb.state = SCH_STATE_EXEC; + + if (!schLoadBod(schCb.pHead)) { - schCb.state = SCH_STATE_EXEC; - - if (!schLoadHead()) - { - schRemoveHead(); - - schCb.state = SCH_STATE_IDLE; - loaded = FALSE; - } + schCb.state = SCH_STATE_IDLE; + loaded = FALSE; } } @@ -281,25 +447,3 @@ uint16_t SchStatsGetHandlerWatermarkUsec(void) { return schHandlerWatermarkUsec; } - -/*************************************************************************************************/ -/*! - * \brief Terminate background. - * - * Completely terminates the background BDO and removes it from record. The end callback should - * free the BOD if necessary. It will subsequently need to be fully restarted. - * - * \return None. - * - */ -/*************************************************************************************************/ -void SchTerminateBackground(void) -{ - if ((schCb.background.pBod != NULL) && - (schCb.background.pBod->endCback != NULL)) - { - schCb.background.pBod->endCback(schCb.background.pBod); - schCb.background.pBod = NULL; - schCb.background.active = FALSE; - } -} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/bb_154_drv.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/bb_154_drv.h deleted file mode 100644 index 3059b8c633..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/bb_154_drv.h +++ /dev/null @@ -1,328 +0,0 @@ -/* Copyright (c) 2009-2019 Arm Limited - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************************************/ -/*! - * \brief Baseband driver interface file. - */ -/*************************************************************************************************/ - -#ifndef BB_154_DRV_H -#define BB_154_DRV_H - -#include "wsf_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/************************************************************************************************** - Macros -**************************************************************************************************/ - -/* Define structures as packed if necessary. */ -#if defined (__GNUC__) -# define BB_154_PACKED __attribute__ ((packed)) -#elif defined (__CC_ARM) -# define BB_154_PACKED __attribute__ ((packed)) -#else -# error "Not supported compiler type." -#endif - -/*! \brief Minimum number of receive buffers. */ -#define BB_154_DRV_MIN_RX_BUF_CNT 2 /*!< BB_154_DRV_MIN_RX_BUF_CNT. */ -#define BB_154_RX_BUF_CNT 2 /*!< BB_154_RX_BUF_CNT. */ - -/*! \brief Driver status flags. */ -enum -{ - BB_154_DRV_FLAG_RX_ACK_CMPL = (1 << 0), /*!< Rx ack. completed. */ - BB_154_DRV_FLAG_TX_ACK_CMPL = (1 << 1), /*!< Tx ack. completed. */ - BB_154_DRV_FLAG_RX_ACK_START = (1 << 2), /*!< Rx ack. started. */ - BB_154_DRV_FLAG_TX_ACK_START = (1 << 3), /*!< Tx ack. started. */ -}; - -/*! \brief Operation flags. */ -enum -{ - BB_154_DRV_FLAG_TX_AUTO_RX_ACK = (1 << 0), /*!< Automatically wait for ACK after transmit completes. */ - BB_154_DRV_FLAG_RX_AUTO_TX_ACK = (1 << 1), /*!< Automatically send ACK after receive completes. */ - BB_154_DRV_FLAG_RX_WHILE_ED = (1 << 2), /*!< Receive any packet detected while performing ED. */ - BB_154_DRV_FLAG_DIS_CCA = (1 << 3) /*!< Disable CCA before transmit. */ -}; - -/*! \brief Receive flags. */ -enum -{ - BB_154_DRV_RX_FLAG_GO_IDLE = (1 << 0), /*!< Can go idle. */ - BB_154_DRV_RX_FLAG_SET_ACK_FP = (1 << 1) /*!< Set frame pending in ack. */ -}; - -/*! \brief BB_154_DRV_FLAG_TX_RX_AUTO_ACK. */ -#define BB_154_DRV_FLAG_TX_RX_AUTO_ACK (BB_154_DRV_FLAG_TX_AUTO_RX_ACK | BB_154_DRV_FLAG_RX_AUTO_TX_ACK) - -/* Symbols to microseconds for 802.15.4-2006 2.4GHz PHY */ -#define BB_154_SYMB_TO_US(x) ((x) * 16) /*!< BB_154_SYMB_TO_US. */ -#define BB_154_SYMB_TO_MS(x) (((x) * 16) / 1000) /*!< BB_154_SYMB_TO_MS. */ -#define BB_154_US_TO_SYMB(x) ((x) / 16) /*!< BB_154_US_TO_SYMB. */ -/* Transaction persistence time factor */ -#define BB_154_TPT_TO_MS(x) (((x) * 15723) >> 10) /*!< 15723/1024 approximates to 15.36 */ - -/************************************************************************************************** - Data Types -**************************************************************************************************/ - -/*! \brief 802.15.4 channelization parameters. */ -typedef struct -{ - uint8_t channel; /*!< Channel. */ - int8_t txPower; /*!< Transmit power, units dBm. */ -} Bb154DrvChan_t; - -/*! \brief Transmit complete ISR callback signature. */ -typedef void (*Bb154DrvTxIsr_t)(uint8_t flags); - -/*! \brief Frame pending check callback. */ -typedef bool_t (*Bb154DrvFPIsr_t)(uint8_t srcAddrMode, uint64_t srcAddr); - -/*! \brief Receive complete ISR callback signature. */ -typedef uint8_t (*Bb154DrvRxIsr_t)(uint8_t *pBuf, uint16_t len, uint8_t linkQuality, uint32_t timestamp, uint8_t flags); - -/*! \brief CCA or energy detect complete ISR callback signature. */ -typedef void (*Bb154DrvEdIsr_t)(uint8_t energyLevel); - -/*! \brief Driver error callback signature. */ -typedef void (*Bb154DrvErr_t)(uint8_t status); - -/*! \brief Operation parameters. */ -typedef struct -{ - uint8_t flags; /*!< Baseband driver operation flags. */ - uint8_t psduMaxLength; /*!< Maximum length of PSDU. */ - Bb154DrvTxIsr_t txCback; /*!< Transmit complete ISR callback. */ - Bb154DrvFPIsr_t fpCback; /*!< Frame pending check callback. */ - Bb154DrvRxIsr_t rxCback; /*!< Receive complete ISR callback. */ - Bb154DrvEdIsr_t edCback; /*!< ED complete ISR callback. */ - Bb154DrvErr_t errCback; /*!< Error callback. */ -} Bb154DrvOpParam_t; - -/*! \brief Transmit buffer descriptor. */ /* Note - must be packed so buffer immediately follows length */ -typedef struct BB_154_PACKED Bb154DrvTxBufDesc -{ - uint8_t pad[2]; /*!< Padding to make structure uint32 aligned */ - uint8_t handle; /*!< Handle used for data frames only */ - uint8_t len; /*!< Length of frame, which is concatenated to this header */ -} Bb154DrvTxBufDesc_t; - -/*! \brief BB_154_DRV_TX_FRAME_PTR */ -#define BB_154_DRV_TX_FRAME_PTR(x) ((uint8_t *)(((Bb154DrvTxBufDesc_t *)(x))+1)) - -/************************************************************************************************** - Function Declarations -**************************************************************************************************/ - -/*************************************************************************************************/ -/*! - * \brief Initialize the 802.15.4 baseband driver. - * - * \return None. - * - * One-time initialization of baseband resources. This routine can be used to setup software - * driver resources, load RF trim parameters and execute RF calibrations. - * - * This routine should block until the BB hardware is completely initialized. - */ -/*************************************************************************************************/ -void Bb154DrvInit(void); - -/*************************************************************************************************/ -/*! - * \brief Enable the BB hardware. - * - * \return None. - * - * This routine brings the BB hardware out of low power (enable power and clocks). This routine is - * called just before a 802.15.4 BOD is executed. - */ -/*************************************************************************************************/ -void Bb154DrvEnable(void); - -/*************************************************************************************************/ -/*! - * \brief Disable the BB hardware. - * - * \return None. - * - * This routine signals the BB hardware to go into low power (disable power and clocks). This - * routine is called after all 802.15.4 operations are disabled. - */ -/*************************************************************************************************/ -void Bb154DrvDisable(void); - -/*************************************************************************************************/ -/*! - * \brief Set channelization parameters. - * - * \param pParam Channelization parameters. - * - * \return None. - * - * Calling this routine will set parameters for all future transmit, receive, and energy detect - * operations until this routine is called again providing new parameters. - * - * \note \a pParam is not guaranteed to be static and is only valid in the context of the - * call to this routine. Therefore parameters requiring persistence should be copied. - */ -/*************************************************************************************************/ -void Bb154DrvSetChannelParam(const Bb154DrvChan_t *pParam); - -/*************************************************************************************************/ -/*! - * \brief Reset channelization parameters. - * - * \return None. - * - * Calling this routine will reset (clear) the channelization parameters. - */ -/*************************************************************************************************/ -void Bb154DrvResetChannelParam(void); - -/*************************************************************************************************/ -/*! - * \brief Set the operation parameters. - * - * \param pOpParam Operations parameters. - * - * \return None. - * - * Calling this routine will set parameters for all future transmit, receive, ED, and CCA - * operations until this routine is called again providing new parameters. - * - * \note \a pOpParam is not guaranteed to be static and is only valid in the context of the - * call to this routine. Therefore parameters requiring persistence should be copied. - */ -/*************************************************************************************************/ -void Bb154DrvSetOpParams(const Bb154DrvOpParam_t *pOpParam); - -/*************************************************************************************************/ -/*! - * \brief Flushes PIB attributes to hardware. - * - * \return None. - * - * Calling this routine will flush all PIB attributes that have a hardware counterpart to the - * respective registers in hardware. - */ -/*************************************************************************************************/ -void Bb154DrvFlushPIB(void); - -/*************************************************************************************************/ -/*! - * \brief Clear all received buffers (active and queued). - * - * \return None. - * - * Calling this routine will clear and free the active receive buffer (if any) and all queued - * receive buffers. This should only be called when the operation is terminating. - */ -/*************************************************************************************************/ -void Bb154DrvClearRxBufs(void); - -/*************************************************************************************************/ -/*! - * \brief Reclaim the buffer associated with the received frame. - * - * \param pRxFrame Pointer to the received frame. - * - * \return Total number of receive buffers queued. - * - * Calling this routine will put the buffer associated with the received frame back onto the - * receive queue. Note the actual buffer pointer may not be the same as the frame pointer - * dependent on driver implementation. If the queue is empty when the driver expects to - * transition to the receive state, the driver will instead move into the off state. - */ -/*************************************************************************************************/ -uint8_t Bb154DrvReclaimRxFrame(uint8_t *pRxFrame); - -/*************************************************************************************************/ -/*! - * \brief Build receive buffer queue - * - * \param len Length of each receive buffer. - * \param num Number of buffers to load into the queue. - * - * \return None. - */ -/*************************************************************************************************/ -void Bb154DrvBuildRxBufQueue(uint16_t len, uint8_t num); - -/*************************************************************************************************/ -/*! - * \brief Transmit a packet. - * - * \param pDesc Chain of transmit buffer descriptors. - * \param cnt Number of descriptors. - * \param due Due time for transmit (if \a now is FALSE). - * \param now TRUE if packet should be transmitted with minimal delay. - * - * \return None. - */ -/*************************************************************************************************/ -void Bb154DrvTx(Bb154DrvTxBufDesc_t *pDesc, uint8_t cnt, uint32_t due, bool_t now); - -/*************************************************************************************************/ -/*! - * \brief Receive a packet. - * - * \param due Due time for receive (if \a now is FALSE). - * \param now TRUE if packet should be received with minimal delay. - * \param timeout Timeout. - * - * \return None. - */ -/*************************************************************************************************/ -void Bb154DrvRx(uint32_t due, bool_t now, uint32_t timeout); - -/*************************************************************************************************/ -/*! - * \brief Perform energy detect. - * - * \param due Due time for energy detect (if \a now is FALSE). - * \param now TRUE if energy detect should occur minimal delay. - * - * \return None. - * - * Perform energy detect and return energy level to assess channel status. - */ -/*************************************************************************************************/ -void Bb154DrvEd(uint32_t due, bool_t now); - -/*************************************************************************************************/ -/*! - * \brief Cancel any pending operation. - * - * \return TRUE if pending operation could be cancelled. - * - * Cancel any pending operation. - */ -/*************************************************************************************************/ -bool_t Bb154DrvOff(void); - -#ifdef __cplusplus -}; -#endif - -#endif /* BB_154_DRV_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/bb_ble_drv.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/bb_ble_drv.h deleted file mode 100644 index 4db66a4d3b..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/bb_ble_drv.h +++ /dev/null @@ -1,443 +0,0 @@ -/* Copyright (c) 2009-2019 Arm Limited - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************************************/ -/*! - * \brief Baseband driver interface file. - */ -/*************************************************************************************************/ - -#ifndef BB_BLE_DRV_H -#define BB_BLE_DRV_H - -#include "wsf_types.h" -#include "ll_defs.h" -#include "cfg_mac_ble.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/************************************************************************************************** - Data Types -**************************************************************************************************/ - -/*! \addtogroup BB_BLE_DRV_ENC - * \{ - */ - -/*! \brief Nonce modes. */ -enum -{ - BB_NONCE_MODE_PKT_CNTR, /*!< Packet counter mode (default). */ - BB_NONCE_MODE_EVT_CNTR /*!< Event counter mode, BbBleEnc_t::pEventCounter must be non-NULL. */ -}; - -/*! \brief Bluetooth Low Energy encryption data. */ -typedef struct -{ - /* SK placed here for 32-bit alignment. */ - uint8_t sk[LL_KEY_LEN]; /*!< Session/Encryption key. */ - uint8_t iv[LL_IV_LEN]; /*!< Initialization vector. */ - bool_t enaEncrypt; /*!< Tx/Encryption enabled flag. */ - bool_t enaDecrypt; /*!< Rx/Decryption enabled flag. */ - bool_t enaAuth; /*!< Enable authentication. */ - uint8_t nonceMode; /*!< Nonce mode. */ - uint16_t *pEventCounter; /*!< Connection event counter. */ - uint8_t dir; /*!< Direction value. */ - void *pEncryptCtx; /*!< Tx/Encryption context. */ - void *pDecryptCtx; /*!< Rx/Decryption context. */ -} BbBleEnc_t; - -/*! \} */ /* BB_BLE_DRV_ENC */ - -/*! \addtogroup BB_BLE_DRV_CHAN - * \{ */ - -/*! \brief BLE channelization parameters. */ -typedef struct -{ - uint8_t opType; /*!< Operation type. */ - uint8_t chanIdx; /*!< Channel index. */ - int8_t txPower; /*!< Transmit power, units dBm. */ - uint32_t accAddr; /*!< Access address. */ - uint32_t crcInit; /*!< CRC initialization value. */ - uint8_t txPhy; /*!< Transmitter PHY. */ - uint8_t rxPhy; /*!< Receiver PHY. */ - uint8_t initTxPhyOptions; /*!< Initial Tx PHY options. */ - uint8_t tifsTxPhyOptions; /*!< TIFS Tx PHY options. */ - bool_t peerTxStableModIdx; /*!< Peer uses stable modulation index on transmitter. */ - bool_t peerRxStableModIdx; /*!< Peer uses stable modulation index on receiver. */ - BbBleEnc_t enc; /*!< Encryption parameters (NULL if disabled). */ - -#if (LL_ENABLE_TESTER) - uint32_t accAddrRx; /*!< Access address override for receptions. */ - uint32_t accAddrTx; /*!< Access address override for transmissions. */ - uint32_t crcInitRx; /*!< CRC initialization override for receptions. */ - uint32_t crcInitTx; /*!< CRC initialization override for transmissions. */ -#endif -} BbBleDrvChan_t; - -/*! \} */ /* BB_BLE_DRV_CHAN */ - -/*! \addtogroup BB_BLE_DRV_DATA - * \{ - * This section contains driver routines used for packet transmission. - */ - -/*! \brief Transmit complete ISR callback signature. */ -typedef void (*BbBleDrvTxIsr_t)(uint8_t status); - -/*! \brief Receive complete ISR callback signature. */ -typedef void (*BbBleDrvRxIsr_t)(uint8_t status, int8_t rssi, uint32_t crc, uint32_t timestamp, uint8_t rxPhyOptions); - -/*! \brief BLE data transfer parameters. */ -typedef struct -{ - BbBleDrvTxIsr_t txCback; /*!< Transmit completion callback. */ - BbBleDrvRxIsr_t rxCback; /*!< Receive completion callback. */ - - uint32_t due; /*!< Due time of the first packet. */ - uint32_t rxTimeoutUsec; /*!< Receive timeout in microseconds. */ - uint16_t dueOffsetUsec; /*!< Due time offset in microseconds. */ -} BbBleDrvDataParam_t; - -/*! \brief Operation parameters. */ -typedef struct -{ - bool_t ifsSetup; /*!< TRUE if IFS timer should be set up for next operation. */ - uint16_t ifsUsec; /*!< IFS time in microseconds. */ -} BbBleDrvOpParam_t; - -/*! \brief Transmit buffer descriptor. */ -typedef struct -{ - uint16_t len; /*!< Length of buffer. */ - uint8_t *pBuf; /*!< Pointer to buffer. */ -} BbBleDrvTxBufDesc_t; - -/*! \} */ /* BB_BLE_DRV_DATA */ - -/************************************************************************************************** - Function Declarations -**************************************************************************************************/ - -/*! \addtogroup BB_BLE_DRV_INIT - * \{ - * This section contains driver routines which initialize as well as enable the BLE mode of the - * BB hardware. - */ - -/*************************************************************************************************/ -/*! - * \brief Initialize the BLE baseband driver. - * - * \return None. - * - * One-time initialization of BLE baseband driver. - */ -/*************************************************************************************************/ -void BbBleDrvInit(void); - -/*************************************************************************************************/ -/*! - * \brief Enable the BB hardware. - * - * \return None. - * - * Wake the BB hardware out of sleep and enable for operation. All BB functionality is - * available when this routine completes. BB clock is set to zero and started. - */ -/*************************************************************************************************/ -void BbBleDrvEnable(void); - -/*************************************************************************************************/ -/*! - * \brief Disable the BB hardware. - * - * \return None. - * - * Disable the baseband and put radio hardware to sleep. Must be called from an idle state. - * A radio operation cannot be in progress. - */ -/*************************************************************************************************/ -void BbBleDrvDisable(void); - -/*! \} */ /* BB_BLE_DRV_INIT */ - -/*! \addtogroup BB_BLE_DRV_CHAN - * \{ - * This section contains the driver routine used to set the chanelization parameters. - */ - -/*************************************************************************************************/ -/*! - * \brief Set channelization parameters. - * - * \param pChan Channelization parameters. - * - * \return None. - * - * Calling this routine will set parameters for all future transmit and receive operations - * until this routine is called again providing new parameters. - * - * The setting of channelization parameters influence the operations of the following listed - * routines. Therefore, this routine is called to set the channel characteristics before - * the use of data routines described in \a BB_BLE_DRV_DATA. - * - * \note The \a pParam contents are not guaranteed to be static and is only valid in the - * context of the call to this routine. Therefore parameters requiring persistence - * should be copied. - */ -/*************************************************************************************************/ -void BbBleDrvSetChannelParam(BbBleDrvChan_t *pChan); - -/*! \} */ /* BB_BLE_DRV_CHAN */ - -/*! \addtogroup BB_BLE_DRV_DATA - * \{ - * This section contains driver routines used for packet transmission. - */ - -/*************************************************************************************************/ -/*! - * \brief Set the data packet exchange parameters. - * - * \param pParam Data exchange parameters. - * - * \return None. - * - * Calling this routine will set parameters for all future transmit and receive operations - * until this routine is called again providing new parameters. - */ -/*************************************************************************************************/ -void BbBleDrvSetDataParams(const BbBleDrvDataParam_t *pParam); - -/*************************************************************************************************/ -/*! - * \brief Set the operation parameters. - * - * \param pOpParam Operations parameters. - * - * \return None. - * - * Calling this routine will set parameters for the next transmit or receive operations. - */ -/*************************************************************************************************/ -void BbBleDrvSetOpParams(const BbBleDrvOpParam_t *pOpParam); - -/*************************************************************************************************/ -/*! - * \brief Transmit a packet. - * - * \param descs Array of transmit buffer descriptors. - * \param cnt Number of descriptors. - * - * \return None. - * - * Set the first data buffer for the first packet of an alternating Tx-Rx data exchange cycle. - */ -/*************************************************************************************************/ -void BbBleDrvTxData(BbBleDrvTxBufDesc_t descs[], uint8_t cnt); - -/*************************************************************************************************/ -/*! - * \brief Transmit packet at TIFS after the last packet received. - * - * \param descs Array of transmit buffer descriptor. - * \param cnt Number of descriptors. - * - * \return None. - * - * If possible, the transmit will occur at the TIFS timing. If not possible, the callback status - * will indicate this. - */ -/*************************************************************************************************/ -void BbBleDrvTxTifsData(BbBleDrvTxBufDesc_t descs[], uint8_t cnt); - -/*************************************************************************************************/ -/*! - * \brief Receive packet. - * - * \param pBuf Receive data buffer. - * \param len Length of data buffer. - * - * \return None. - * - * Set the first data buffer for the first packet of an alternating Rx-Tx data exchange cycle. - */ -/*************************************************************************************************/ -void BbBleDrvRxData(uint8_t *pBuf, uint16_t len); - -/*************************************************************************************************/ -/*! - * \brief Receive packet at TIFS after the last packet transmitted. - * - * \param pBuf Receive data buffer. - * \param len Length of data buffer. - * - * \return None. - * - * If possible, the receive will occur on the TIFS timing. If not possible, the callback status - * will indicate this. - */ -/*************************************************************************************************/ -void BbBleDrvRxTifsData(uint8_t *pBuf, uint16_t len); - -/*************************************************************************************************/ -/*! - * \brief Cancel TIFS timer. - * - * \return None. - * - * This stops any active TIFS timer operation. This routine is always called in the callback - * (i.e. ISR) context. - */ -/*************************************************************************************************/ -void BbBleDrvCancelTifs(void); - -/*************************************************************************************************/ -/*! - * \brief Cancel a pending transmit or receive. - * - * \return None. - * - * This stops any active radio operation. This routine is never called in the callback - * (i.e. ISR) context. - */ -/*************************************************************************************************/ -void BbBleDrvCancelData(void); - -/*! \} */ /* BB_BLE_DRV_DATA */ - -/*! \addtogroup BB_BLE_DRV_ENC - * \{ - * This section contains driver routines used for encryption. - */ - -/*************************************************************************************************/ -/*! - * \brief Generate cryptographic grade random number. - * - * \param pBuf Buffer to store random number. - * \param len Number of bytes. - * - * \return None. - */ -/*************************************************************************************************/ -void BbBleDrvRand(uint8_t *pBuf, uint8_t len); - -/*************************************************************************************************/ -/*! - * \brief Execute AES CBC transformation on payload and add 4 byte MIC. - * - * \param pEnc Encryption parameters. - * \param id Context ID. - * \param localDir Direction bit of local device (0=slave, 1=master). - * - * \return None. - * - * This routine completes the transformation in a blocking manner. - * - * \note Leave this implementation empty if inline hardware encryption is available. - */ -/*************************************************************************************************/ -void BbBleDrvAesInitCipherBlock(BbBleEnc_t *pEnc, uint8_t id, uint8_t localDir); - -/*************************************************************************************************/ -/*! - * \brief Execute AES CBC transformation on payload and add 4 byte MIC. - * - * \param pEnc Encryption parameters. - * \param pHdr Packet header. - * \param pBuf Packet data. - * \param pMic Storage for MIC. - * - * \return TRUE if the MIC was set. - * - * This routine completes the transformation in a blocking manner. This routine modifies the - * length field of the PDU to account for the MIC. - * - * \note Leave this implementation empty if inline hardware encryption is available. - */ -/*************************************************************************************************/ -bool_t BbBleDrvAesCcmEncrypt(BbBleEnc_t *pEnc, uint8_t *pHdr, uint8_t *pBuf, uint8_t *pMic); - -/*************************************************************************************************/ -/*! - * \brief Execute AES CBC transformation on payload and return MIC evaluation status. - * - * \param pEnc Encryption parameters. - * \param pBuf Packet data. - * - * \return TRUE if authentication successful, FALSE otherwise. - * - * This routine completes the transformation in a blocking manner. This routine modifies the - * length field of the PDU to account for the MIC. - * - * \note Leave this implementation empty if inline hardware encryption is available. - */ -/*************************************************************************************************/ -bool_t BbBleDrvAesCcmDecrypt(BbBleEnc_t *pEnc, uint8_t *pBuf); - -#if (BB_ENABLE_INLINE_ENC_TX) -void BbBleDrvSetEncryptPacketCount(BbBleEnc_t *pEnc, uint64_t pktCnt); -void BbBleDrvSetDecryptPacketCount(BbBleEnc_t *pEnc, uint64_t pktCnt); -#endif - -/*! \} */ /* BB_BLE_DRV_ENC */ - -/*! \addtogroup BB_BLE_DRV_TEST - * \{ - * This section contains driver routines used for test modes. - */ - -/*************************************************************************************************/ -/*! - * \brief Enable or disable data whitening. - * - * \param enable Flag to indicate data whitening. - * - * \return None. - * - * Sets an internal variable that indicates if data whitening is enabled or not. - */ -/*************************************************************************************************/ -void BbBleDrvEnableDataWhitening(bool_t enable); - -/*************************************************************************************************/ -/*! - * \brief Enable or disable PRBS15. - * - * \param enable Flag to indicate PRBS15. - * - * \return None. - * - * Immediately enable or disable continuous PRBS15 bitstream. Setting the channelization - * parameters with \a BbBleDrvSetChannelParam() must precede enabling PRBS15. - * - * Use of \a BB_BLE_DRV_DATA routines is not allowed while PRBS15 is enabled. - */ -/*************************************************************************************************/ -void BbBleDrvEnablePrbs15(bool_t enable); - -/*! \} */ /* BB_BLE_DRV_TEST */ - -#ifdef __cplusplus -}; -#endif - -#endif /* BB_BLE_DRV_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/bb_drv.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/bb_drv.h deleted file mode 100644 index 9a41784ddd..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/bb_drv.h +++ /dev/null @@ -1,136 +0,0 @@ -/* Copyright (c) 2009-2019 Arm Limited - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************************************/ -/*! - * \brief Baseband driver interface file. - */ -/*************************************************************************************************/ - -#ifndef BB_DRV_H -#define BB_DRV_H - -#include "wsf_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/************************************************************************************************** - Function Declarations -**************************************************************************************************/ - -/*! \addtogroup BB_DRV_INIT - * \{ - * This section contains driver routines which initialize as well as enable the sleep mode - * of the BB hardware. - */ - -/*************************************************************************************************/ -/*! - * \brief Initialize the baseband driver. - * - * \return None. - * - * One-time initialization of baseband resources. This routine can be used to setup baseband - * resources, load RF trim parameters and execute RF calibrations and seed the random number - * generator. - * - * This routine should block until the BB hardware is completely initialized. - */ -/*************************************************************************************************/ -void BbDrvInit(void); - -/*************************************************************************************************/ -/*! - * \brief Enable the BB hardware. - * - * \return None. - * - * This routine brings the BB hardware out of low power (enable power and clocks) just before a - * first BB operation is executed. - */ -/*************************************************************************************************/ -void BbDrvEnable(void); - -/*************************************************************************************************/ -/*! - * \brief Disable the BB hardware. - * - * \return None. - * - * This routine signals the BB hardware to go into low power (disable power and clocks) after all - * BB operations have been disabled. - */ -/*************************************************************************************************/ -void BbDrvDisable(void); - -/*************************************************************************************************/ -/*! - * \brief Get version codes. - * - * \param pBbVer If non-NULL, return BB hardware version. - * \param pPhyVer If non-NULL, return PHY hardware version. - * - * \return None. - * - * Interrogate the HW for version codes. - */ -/*************************************************************************************************/ -void BbDrvGetVersions(uint32_t *pBbVer, uint32_t *pPhyVer); - -/*! \} */ /* BB_DRV_INIT */ - -/*! \addtogroup BB_DRV_CLOCK - * \{ - * This section contains driver routines related to the BB clock. - */ - -/*************************************************************************************************/ -/*! - * \brief Get the current BB clock value. - * - * \return Current BB clock value. - * - * This routine reads the current value from the BB clock and returns its value. The clock should - * increment at the rate BB_CLK_RATE_HZ (wrapping as appropriate) whenever the BB is enabled. - */ -/*************************************************************************************************/ -uint32_t BbDrvGetCurrentTime(void); - -/*************************************************************************************************/ -/*! - * \brief Get the current FRC time. - * - * \param pTime Pointer to return the current time. - * - * \return TRUE if time is valid, FALSE otherwise. - * - * Get the current FRC time. - * - * \note FRC is limited to the same bit-width as the BB clock. Return value is available - * only when the BB is active. - */ -/*************************************************************************************************/ -bool_t BbDrvGetTimestamp(uint32_t *pTime); - -/*! \} */ /* BB_DRV_CLOCK */ - -#ifdef __cplusplus -}; -#endif - -#endif /* BB_DRV_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/chci_drv.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/chci_drv.h deleted file mode 100644 index 29230946d2..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/chci_drv.h +++ /dev/null @@ -1,75 +0,0 @@ -/* Copyright (c) 2009-2019 Arm Limited - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************************************/ -/*! - * \brief Controller HCI driver interface. - */ -/*************************************************************************************************/ - -#ifndef CHCI_DRV_H -#define CHCI_DRV_H - -#include "wsf_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/************************************************************************************************** - Function Declarations -**************************************************************************************************/ - -/*************************************************************************************************/ -/*! - * \brief Initialize the driver. - * - * \return None. - */ -/*************************************************************************************************/ -void chciDrvInit(void); - -/*************************************************************************************************/ -/*! - * \brief Write data the driver. - * - * \param prot Protocol. - * \param type Packet type. - * \param len Number of bytes to write. - * \param pData Byte array to write. - * - * \return Return actual number of data bytes written. - * - * \note The type parameter allows the driver layer to prepend the data with a header on the - * same write transaction. - */ -/*************************************************************************************************/ -uint16_t chciDrvWrite(uint8_t prot, uint8_t type, uint16_t len, uint8_t *pData); - -/*************************************************************************************************/ -/*! - * \brief Service the transport device. - * - * \return TRUE if work pending, FALSE if no work is pending. - */ -/*************************************************************************************************/ -bool_t chciDrvService(void); - -#ifdef __cplusplus -}; -#endif - -#endif /* CHCI_DRV_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/hci_defs.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/hci_defs.h deleted file mode 100644 index b941fdde54..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/hci_defs.h +++ /dev/null @@ -1,1094 +0,0 @@ -/* Copyright (c) 2009-2019 Arm Limited - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************************************/ -/*! - * \brief HCI constants and definitions from the Bluetooth specification. - */ -/*************************************************************************************************/ -#ifndef HCI_DEFS_H -#define HCI_DEFS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/*! \addtogroup STACK_HCI_API - * \{ */ - -/** \name Packet definitions - * - */ -/**@{*/ -#define HCI_CMD_HDR_LEN 3 /*!< \brief Command packet header length */ -#define HCI_ACL_HDR_LEN 4 /*!< \brief ACL packet header length */ -#define HCI_EVT_HDR_LEN 2 /*!< \brief Event packet header length */ -#define HCI_EVT_PARAM_MAX_LEN 255 /*!< \brief Maximum length of event packet parameters */ -#define HCI_ACL_DEFAULT_LEN 27 /*!< \brief Default maximum ACL packet length */ -#define HCI_PB_FLAG_MASK 0x3000 /*!< \brief ACL packet boundary flag mask */ -#define HCI_PB_START_H2C 0x0000 /*!< \brief Packet boundary flag, start, host-to-controller */ -#define HCI_PB_CONTINUE 0x1000 /*!< \brief Packet boundary flag, continue */ -#define HCI_PB_START_C2H 0x2000 /*!< \brief Packet boundary flag, start, controller-to-host */ -#define HCI_HANDLE_MASK 0x0FFF /*!< \brief Mask for handle bits in ACL packet */ -#define HCI_HANDLE_NONE 0xFFFF /*!< \brief Value for invalid handle */ -/**@}*/ - -/** \name Packet types - * - */ -#define HCI_CMD_TYPE 1 /*!< \brief HCI command packet */ -#define HCI_ACL_TYPE 2 /*!< \brief HCI ACL data packet */ -#define HCI_EVT_TYPE 4 /*!< \brief HCI event packet */ -/**@}*/ - -/** \name Error codes - * - */ -/**@{*/ -#define HCI_SUCCESS 0x00 /*!< \brief Success */ -#define HCI_ERR_UNKNOWN_CMD 0x01 /*!< \brief Unknown HCI command */ -#define HCI_ERR_UNKNOWN_HANDLE 0x02 /*!< \brief Unknown connection identifier */ -#define HCI_ERR_HARDWARE_FAILURE 0x03 /*!< \brief Hardware failure */ -#define HCI_ERR_PAGE_TIMEOUT 0x04 /*!< \brief Page timeout */ -#define HCI_ERR_AUTH_FAILURE 0x05 /*!< \brief Authentication failure */ -#define HCI_ERR_KEY_MISSING 0x06 /*!< \brief PIN or key missing */ -#define HCI_ERR_MEMORY_EXCEEDED 0x07 /*!< \brief Memory capacity exceeded */ -#define HCI_ERR_CONN_TIMEOUT 0x08 /*!< \brief Connection timeout */ -#define HCI_ERR_CONN_LIMIT 0x09 /*!< \brief Connection limit exceeded */ -#define HCI_ERR_SYNCH_CONN_LIMIT 0x0A /*!< \brief Synchronous connection limit exceeded */ -#define HCI_ERR_ACL_CONN_EXISTS 0x0B /*!< \brief ACL connection already exists */ -#define HCI_ERR_CMD_DISALLOWED 0x0C /*!< \brief Command disallowed */ -#define HCI_ERR_REJ_RESOURCES 0x0D /*!< \brief Connection rejected limited resources */ -#define HCI_ERR_REJ_SECURITY 0x0E /*!< \brief Connection rejected security reasons */ -#define HCI_ERR_REJ_BD_ADDR 0x0F /*!< \brief Connection rejected unacceptable BD_ADDR */ -#define HCI_ERR_ACCEPT_TIMEOUT 0x10 /*!< \brief Connection accept timeout exceeded */ -#define HCI_ERR_UNSUP_FEAT 0x11 /*!< \brief Unsupported feature or parameter value */ -#define HCI_ERR_INVALID_PARAM 0x12 /*!< \brief Invalid HCI command parameters */ -#define HCI_ERR_REMOTE_TERMINATED 0x13 /*!< \brief Remote user terminated connection */ -#define HCI_ERR_REMOTE_RESOURCES 0x14 /*!< \brief Remote device low resources */ -#define HCI_ERR_REMOTE_POWER_OFF 0x15 /*!< \brief Remote device power off */ -#define HCI_ERR_LOCAL_TERMINATED 0x16 /*!< \brief Connection terminated by local host */ -#define HCI_ERR_REPEATED_ATTEMPTS 0x17 /*!< \brief Repeated attempts */ -#define HCI_ERR_PAIRING_NOT_ALLOWED 0x18 /*!< \brief Pairing not allowed */ -#define HCI_ERR_UNKNOWN_LMP_PDU 0x19 /*!< \brief Unknown LMP PDU */ -#define HCI_ERR_UNSUP_REMOTE_FEAT 0x1A /*!< \brief Unsupported remote feature */ -#define HCI_ERR_SCO_OFFSET 0x1B /*!< \brief SCO offset rejected */ -#define HCI_ERR_SCO_INTERVAL 0x1C /*!< \brief SCO interval rejected */ -#define HCI_ERR_SCO_MODE 0x1D /*!< \brief SCO air mode rejected */ -#define HCI_ERR_LMP_PARAM 0x1E /*!< \brief Invalid LMP parameters */ -#define HCI_ERR_UNSPECIFIED 0x1F /*!< \brief Unspecified error */ -#define HCI_ERR_UNSUP_LMP_PARAM 0x20 /*!< \brief Unsupported LMP parameter value */ -#define HCI_ERR_ROLE_CHANGE 0x21 /*!< \brief Role change not allowed */ -#define HCI_ERR_LL_RESP_TIMEOUT 0x22 /*!< \brief LL response timeout */ -#define HCI_ERR_LMP_COLLISION 0x23 /*!< \brief LMP error transaction collision */ -#define HCI_ERR_LMP_PDU 0x24 /*!< \brief LMP pdu not allowed */ -#define HCI_ERR_ENCRYPT_MODE 0x25 /*!< \brief Encryption mode not acceptable */ -#define HCI_ERR_LINK_KEY 0x26 /*!< \brief Link key can not be changed */ -#define HCI_ERR_UNSUP_QOS 0x27 /*!< \brief Requested qos not supported */ -#define HCI_ERR_INSTANT_PASSED 0x28 /*!< \brief Instant passed */ -#define HCI_ERR_UNSUP_UNIT_KEY 0x29 /*!< \brief Pairing with unit key not supported */ -#define HCI_ERR_TRANSACT_COLLISION 0x2A /*!< \brief Different transaction collision */ -#define HCI_ERR_CHANNEL_CLASS 0x2E /*!< \brief Channel classification not supported */ -#define HCI_ERR_MEMORY 0x2F /*!< \brief Insufficient security */ -#define HCI_ERR_PARAMETER_RANGE 0x30 /*!< \brief Parameter out of mandatory range */ -#define HCI_ERR_ROLE_SWITCH_PEND 0x32 /*!< \brief Role switch pending */ -#define HCI_ERR_RESERVED_SLOT 0x34 /*!< \brief Reserved slot violation */ -#define HCI_ERR_ROLE_SWITCH 0x35 /*!< \brief Role switch failed */ -#define HCI_ERR_INQ_TOO_LARGE 0x36 /*!< \brief Extended inquiry response too large */ -#define HCI_ERR_UNSUP_SSP 0x37 /*!< \brief Secure simple pairing not supported by host */ -#define HCI_ERR_HOST_BUSY_PAIRING 0x38 /*!< \brief Host busy - pairing */ -#define HCI_ERR_NO_CHANNEL 0x39 /*!< \brief Connection rejected no suitable channel */ -#define HCI_ERR_CONTROLLER_BUSY 0x3A /*!< \brief Controller busy */ -#define HCI_ERR_CONN_INTERVAL 0x3B /*!< \brief Unacceptable connection interval */ -#define HCI_ERR_ADV_TIMEOUT 0x3C /*!< \brief Advertising timeout */ -#define HCI_ERR_MIC_FAILURE 0x3D /*!< \brief Connection terminated due to MIC failure */ -#define HCI_ERR_CONN_FAIL 0x3E /*!< \brief Connection failed to be established */ -#define HCI_ERR_MAC_CONN_FAIL 0x3F /*!< \brief MAC connection failed */ -#define HCI_ERR_COARSE_CLK_ADJ_REJ 0x40 /*!< \brief Coarse clock adjustment rejected */ -#define HCI_ERR_TYPE0_SUBMAP_NOT_DEF 0x41 /*!< \brief Type0 submap not defined */ -#define HCI_ERR_UNKNOWN_ADV_ID 0x42 /*!< \brief Unknown advertising identifier */ -#define HCI_ERR_LIMIT_REACHED 0x43 /*!< \brief Limit reached */ -#define HCI_ERR_OP_CANCELLED_BY_HOST 0x44 /*!< \brief Operation cancelled by host */ -/**@}*/ - -/** \name Command groups - * - */ -/**@{*/ -#define HCI_OGF_NOP 0x00 /*!< \brief No operation */ -#define HCI_OGF_LINK_CONTROL 0x01 /*!< \brief Link control */ -#define HCI_OGF_LINK_POLICY 0x02 /*!< \brief Link policy */ -#define HCI_OGF_CONTROLLER 0x03 /*!< \brief Controller and baseband */ -#define HCI_OGF_INFORMATIONAL 0x04 /*!< \brief Informational parameters */ -#define HCI_OGF_STATUS 0x05 /*!< \brief Status parameters */ -#define HCI_OGF_TESTING 0x06 /*!< \brief Testing */ -#define HCI_OGF_LE_CONTROLLER 0x08 /*!< \brief LE controller */ -#define HCI_OGF_VENDOR_SPEC 0x3F /*!< \brief Vendor specific */ -/**@}*/ - -/** \name NOP command - * - */ -/**@{*/ -#define HCI_OCF_NOP 0x00 -/**@}*/ - -/** \name Link control commands - * - */ -/**@{*/ -#define HCI_OCF_DISCONNECT 0x06 -#define HCI_OCF_READ_REMOTE_VER_INFO 0x1D -/**@}*/ - -/*! \brief Link policy commands (none used for LE) */ - -/** \name Controller and baseband commands - * - */ -/**@{*/ -#define HCI_OCF_SET_EVENT_MASK 0x01 -#define HCI_OCF_RESET 0x03 -#define HCI_OCF_READ_TX_PWR_LVL 0x2D -#define HCI_OCF_SET_CONTROLLER_TO_HOST_FC 0x31 -#define HCI_OCF_HOST_BUFFER_SIZE 0x33 -#define HCI_OCF_HOST_NUM_CMPL_PKTS 0x35 -#define HCI_OCF_SET_EVENT_MASK_PAGE2 0x63 -#define HCI_OCF_READ_AUTH_PAYLOAD_TO 0x7B -#define HCI_OCF_WRITE_AUTH_PAYLOAD_TO 0x7C -/**@}*/ - -/** \name Informational commands - * - */ -/**@{*/ -#define HCI_OCF_READ_LOCAL_VER_INFO 0x01 -#define HCI_OCF_READ_LOCAL_SUP_CMDS 0x02 -#define HCI_OCF_READ_LOCAL_SUP_FEAT 0x03 -#define HCI_OCF_READ_BUF_SIZE 0x05 -#define HCI_OCF_READ_BD_ADDR 0x09 -/**@}*/ - -/** \name Status commands - * - */ -/**@{*/ -#define HCI_OCF_READ_RSSI 0x05 -/**@}*/ - -/** \name LE controller commands - * - */ -/**@{*/ -#define HCI_OCF_LE_SET_EVENT_MASK 0x01 -#define HCI_OCF_LE_READ_BUF_SIZE 0x02 -#define HCI_OCF_LE_READ_LOCAL_SUP_FEAT 0x03 -#define HCI_OCF_LE_SET_RAND_ADDR 0x05 -#define HCI_OCF_LE_SET_ADV_PARAM 0x06 -#define HCI_OCF_LE_READ_ADV_TX_POWER 0x07 -#define HCI_OCF_LE_SET_ADV_DATA 0x08 -#define HCI_OCF_LE_SET_SCAN_RESP_DATA 0x09 -#define HCI_OCF_LE_SET_ADV_ENABLE 0x0A -#define HCI_OCF_LE_SET_SCAN_PARAM 0x0B -#define HCI_OCF_LE_SET_SCAN_ENABLE 0x0C -#define HCI_OCF_LE_CREATE_CONN 0x0D -#define HCI_OCF_LE_CREATE_CONN_CANCEL 0x0E -#define HCI_OCF_LE_READ_WHITE_LIST_SIZE 0x0F -#define HCI_OCF_LE_CLEAR_WHITE_LIST 0x10 -#define HCI_OCF_LE_ADD_DEV_WHITE_LIST 0x11 -#define HCI_OCF_LE_REMOVE_DEV_WHITE_LIST 0x12 -#define HCI_OCF_LE_CONN_UPDATE 0x13 -#define HCI_OCF_LE_SET_HOST_CHAN_CLASS 0x14 -#define HCI_OCF_LE_READ_CHAN_MAP 0x15 -#define HCI_OCF_LE_READ_REMOTE_FEAT 0x16 -#define HCI_OCF_LE_ENCRYPT 0x17 -#define HCI_OCF_LE_RAND 0x18 -#define HCI_OCF_LE_START_ENCRYPTION 0x19 -#define HCI_OCF_LE_LTK_REQ_REPL 0x1A -#define HCI_OCF_LE_LTK_REQ_NEG_REPL 0x1B -#define HCI_OCF_LE_READ_SUP_STATES 0x1C -#define HCI_OCF_LE_RECEIVER_TEST 0x1D -#define HCI_OCF_LE_TRANSMITTER_TEST 0x1E -#define HCI_OCF_LE_TEST_END 0x1F -/*! \brief New in version 4.1 */ -#define HCI_OCF_LE_REM_CONN_PARAM_REP 0x20 -#define HCI_OCF_LE_REM_CONN_PARAM_NEG_REP 0x21 -/*! \brief New in version 4.2 */ -#define HCI_OCF_LE_SET_DATA_LEN 0x22 -#define HCI_OCF_LE_READ_DEF_DATA_LEN 0x23 -#define HCI_OCF_LE_WRITE_DEF_DATA_LEN 0x24 -#define HCI_OCF_LE_READ_LOCAL_P256_PUB_KEY 0x25 -#define HCI_OCF_LE_GENERATE_DHKEY 0x26 -#define HCI_OCF_LE_ADD_DEV_RES_LIST 0x27 -#define HCI_OCF_LE_REMOVE_DEV_RES_LIST 0x28 -#define HCI_OCF_LE_CLEAR_RES_LIST 0x29 -#define HCI_OCF_LE_READ_RES_LIST_SIZE 0x2A -#define HCI_OCF_LE_READ_PEER_RES_ADDR 0x2B -#define HCI_OCF_LE_READ_LOCAL_RES_ADDR 0x2C -#define HCI_OCF_LE_SET_ADDR_RES_ENABLE 0x2D -#define HCI_OCF_LE_SET_RES_PRIV_ADDR_TO 0x2E -#define HCI_OCF_LE_READ_MAX_DATA_LEN 0x2F -/*! \brief New in version 5.0 */ -#define HCI_OCF_LE_READ_PHY 0x30 -#define HCI_OCF_LE_SET_DEF_PHY 0x31 -#define HCI_OCF_LE_SET_PHY 0x32 -#define HCI_OCF_LE_ENHANCED_RECEIVER_TEST 0x33 -#define HCI_OCF_LE_ENHANCED_TRANSMITTER_TEST 0x34 -#define HCI_OCF_LE_SET_ADV_SET_RAND_ADDR 0x35 -#define HCI_OCF_LE_SET_EXT_ADV_PARAM 0x36 -#define HCI_OCF_LE_SET_EXT_ADV_DATA 0x37 -#define HCI_OCF_LE_SET_EXT_SCAN_RESP_DATA 0x38 -#define HCI_OCF_LE_SET_EXT_ADV_ENABLE 0x39 -#define HCI_OCF_LE_READ_MAX_ADV_DATA_LEN 0x3A -#define HCI_OCF_LE_READ_NUM_SUP_ADV_SETS 0x3B -#define HCI_OCF_LE_REMOVE_ADV_SET 0x3C -#define HCI_OCF_LE_CLEAR_ADV_SETS 0x3D -#define HCI_OCF_LE_SET_PER_ADV_PARAM 0x3E -#define HCI_OCF_LE_SET_PER_ADV_DATA 0x3F -#define HCI_OCF_LE_SET_PER_ADV_ENABLE 0x40 -#define HCI_OCF_LE_SET_EXT_SCAN_PARAM 0x41 -#define HCI_OCF_LE_SET_EXT_SCAN_ENABLE 0x42 -#define HCI_OCF_LE_EXT_CREATE_CONN 0x43 -#define HCI_OCF_LE_PER_ADV_CREATE_SYNC 0x44 -#define HCI_OCF_LE_PER_ADV_CREATE_SYNC_CANCEL 0x45 -#define HCI_OCF_LE_PER_ADV_TERM_SYNC 0x46 -#define HCI_OCF_LE_ADD_DEV_PER_ADV_LIST 0x47 -#define HCI_OCF_LE_REMOVE_DEV_PER_ADV_LIST 0x48 -#define HCI_OCF_LE_CLEAR_PER_ADV_LIST 0x49 -#define HCI_OCF_LE_READ_PER_ADV_LIST_SIZE 0x4A -#define HCI_OCF_LE_READ_TX_POWER 0x4B -#define HCI_OCF_LE_READ_RF_PATH_COMP 0x4C -#define HCI_OCF_LE_WRITE_RF_PATH_COMP 0x4D -#define HCI_OCF_LE_SET_PRIVACY_MODE 0x4E -/**@}*/ - -/** \name Opcode manipulation macros - * - */ -/**@{*/ -#define HCI_OPCODE(ogf, ocf) (((ogf) << 10) + (ocf)) -#define HCI_OGF(opcode) ((opcode) >> 10) -#define HCI_OCF(opcode) ((opcode) & 0x03FF) -/**@}*/ - -/** \name Command opcodes - * - */ -/**@{*/ -#define HCI_OPCODE_NOP HCI_OPCODE(HCI_OGF_NOP, HCI_OCF_NOP) - -#define HCI_OPCODE_DISCONNECT HCI_OPCODE(HCI_OGF_LINK_CONTROL, HCI_OCF_DISCONNECT) -#define HCI_OPCODE_READ_REMOTE_VER_INFO HCI_OPCODE(HCI_OGF_LINK_CONTROL, HCI_OCF_READ_REMOTE_VER_INFO) - -#define HCI_OPCODE_SET_EVENT_MASK HCI_OPCODE(HCI_OGF_CONTROLLER, HCI_OCF_SET_EVENT_MASK) -#define HCI_OPCODE_RESET HCI_OPCODE(HCI_OGF_CONTROLLER, HCI_OCF_RESET) -#define HCI_OPCODE_READ_TX_PWR_LVL HCI_OPCODE(HCI_OGF_CONTROLLER, HCI_OCF_READ_TX_PWR_LVL) -#define HCI_OPCODE_SET_EVENT_MASK_PAGE2 HCI_OPCODE(HCI_OGF_CONTROLLER, HCI_OCF_SET_EVENT_MASK_PAGE2) -#define HCI_OPCODE_READ_AUTH_PAYLOAD_TO HCI_OPCODE(HCI_OGF_CONTROLLER, HCI_OCF_READ_AUTH_PAYLOAD_TO) -#define HCI_OPCODE_WRITE_AUTH_PAYLOAD_TO HCI_OPCODE(HCI_OGF_CONTROLLER, HCI_OCF_WRITE_AUTH_PAYLOAD_TO) - -#define HCI_OPCODE_READ_LOCAL_VER_INFO HCI_OPCODE(HCI_OGF_INFORMATIONAL, HCI_OCF_READ_LOCAL_VER_INFO) -#define HCI_OPCODE_READ_LOCAL_SUP_CMDS HCI_OPCODE(HCI_OGF_INFORMATIONAL, HCI_OCF_READ_LOCAL_SUP_CMDS) -#define HCI_OPCODE_READ_LOCAL_SUP_FEAT HCI_OPCODE(HCI_OGF_INFORMATIONAL, HCI_OCF_READ_LOCAL_SUP_FEAT) -#define HCI_OPCODE_READ_BUF_SIZE HCI_OPCODE(HCI_OGF_INFORMATIONAL, HCI_OCF_READ_BUF_SIZE) -#define HCI_OPCODE_READ_BD_ADDR HCI_OPCODE(HCI_OGF_INFORMATIONAL, HCI_OCF_READ_BD_ADDR) - -#define HCI_OPCODE_READ_RSSI HCI_OPCODE(HCI_OGF_STATUS, HCI_OCF_READ_RSSI) - -#define HCI_OPCODE_LE_SET_EVENT_MASK HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_EVENT_MASK) -#define HCI_OPCODE_LE_READ_BUF_SIZE HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_BUF_SIZE) -#define HCI_OPCODE_LE_READ_LOCAL_SUP_FEAT HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_LOCAL_SUP_FEAT) -#define HCI_OPCODE_LE_SET_RAND_ADDR HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_RAND_ADDR) -#define HCI_OPCODE_LE_SET_ADV_PARAM HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_ADV_PARAM) -#define HCI_OPCODE_LE_READ_ADV_TX_POWER HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_ADV_TX_POWER) -#define HCI_OPCODE_LE_SET_ADV_DATA HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_ADV_DATA) -#define HCI_OPCODE_LE_SET_SCAN_RESP_DATA HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_SCAN_RESP_DATA) -#define HCI_OPCODE_LE_SET_ADV_ENABLE HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_ADV_ENABLE) -#define HCI_OPCODE_LE_SET_SCAN_PARAM HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_SCAN_PARAM) -#define HCI_OPCODE_LE_SET_SCAN_ENABLE HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_SCAN_ENABLE) -#define HCI_OPCODE_LE_CREATE_CONN HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_CREATE_CONN) -#define HCI_OPCODE_LE_CREATE_CONN_CANCEL HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_CREATE_CONN_CANCEL) -#define HCI_OPCODE_LE_READ_WHITE_LIST_SIZE HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_WHITE_LIST_SIZE) -#define HCI_OPCODE_LE_CLEAR_WHITE_LIST HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_CLEAR_WHITE_LIST) -#define HCI_OPCODE_LE_ADD_DEV_WHITE_LIST HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_ADD_DEV_WHITE_LIST) -#define HCI_OPCODE_LE_REMOVE_DEV_WHITE_LIST HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_REMOVE_DEV_WHITE_LIST) -#define HCI_OPCODE_LE_CONN_UPDATE HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_CONN_UPDATE) -#define HCI_OPCODE_LE_SET_HOST_CHAN_CLASS HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_HOST_CHAN_CLASS) -#define HCI_OPCODE_LE_READ_CHAN_MAP HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_CHAN_MAP) -#define HCI_OPCODE_LE_READ_REMOTE_FEAT HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_REMOTE_FEAT) -#define HCI_OPCODE_LE_ENCRYPT HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_ENCRYPT) -#define HCI_OPCODE_LE_RAND HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_RAND) -#define HCI_OPCODE_LE_START_ENCRYPTION HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_START_ENCRYPTION) -#define HCI_OPCODE_LE_LTK_REQ_REPL HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_LTK_REQ_REPL) -#define HCI_OPCODE_LE_LTK_REQ_NEG_REPL HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_LTK_REQ_NEG_REPL) -#define HCI_OPCODE_LE_READ_SUP_STATES HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_SUP_STATES) -#define HCI_OPCODE_LE_RECEIVER_TEST HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_RECEIVER_TEST) -#define HCI_OPCODE_LE_TRANSMITTER_TEST HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_TRANSMITTER_TEST) -#define HCI_OPCODE_LE_TEST_END HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_TEST_END) -/*! \brief New in version 4.1 */ -#define HCI_OPCODE_LE_REM_CONN_PARAM_REP HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_REM_CONN_PARAM_REP) -#define HCI_OPCODE_LE_REM_CONN_PARAM_NEG_REP HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_REM_CONN_PARAM_NEG_REP) -/*! \brief New in version 4.2 */ -#define HCI_OPCODE_LE_SET_DATA_LEN HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_DATA_LEN) -#define HCI_OPCODE_LE_READ_DEF_DATA_LEN HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_DEF_DATA_LEN) -#define HCI_OPCODE_LE_WRITE_DEF_DATA_LEN HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_WRITE_DEF_DATA_LEN) -#define HCI_OPCODE_LE_READ_LOCAL_P256_PUB_KEY HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_LOCAL_P256_PUB_KEY) -#define HCI_OPCODE_LE_GENERATE_DHKEY HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_GENERATE_DHKEY) -#define HCI_OPCODE_LE_ADD_DEV_RES_LIST HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_ADD_DEV_RES_LIST) -#define HCI_OPCODE_LE_REMOVE_DEV_RES_LIST HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_REMOVE_DEV_RES_LIST) -#define HCI_OPCODE_LE_CLEAR_RES_LIST HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_CLEAR_RES_LIST) -#define HCI_OPCODE_LE_READ_RES_LIST_SIZE HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_RES_LIST_SIZE) -#define HCI_OPCODE_LE_READ_PEER_RES_ADDR HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_PEER_RES_ADDR) -#define HCI_OPCODE_LE_READ_LOCAL_RES_ADDR HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_LOCAL_RES_ADDR) -#define HCI_OPCODE_LE_SET_ADDR_RES_ENABLE HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_ADDR_RES_ENABLE) -#define HCI_OPCODE_LE_SET_RES_PRIV_ADDR_TO HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_RES_PRIV_ADDR_TO) -#define HCI_OPCODE_LE_READ_MAX_DATA_LEN HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_MAX_DATA_LEN) -/*! \brief New in version 5.0 */ -#define HCI_OPCODE_LE_READ_PHY HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_PHY) -#define HCI_OPCODE_LE_SET_DEF_PHY HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_DEF_PHY) -#define HCI_OPCODE_LE_SET_PHY HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_PHY) -#define HCI_OPCODE_LE_ENHANCED_RECEIVER_TEST HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_ENHANCED_RECEIVER_TEST) -#define HCI_OPCODE_LE_ENHANCED_TRANSMITTER_TEST HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_ENHANCED_TRANSMITTER_TEST) -#define HCI_OPCODE_LE_SET_ADV_SET_RAND_ADDR HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_ADV_SET_RAND_ADDR) -#define HCI_OPCODE_LE_SET_EXT_ADV_PARAM HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_EXT_ADV_PARAM) -#define HCI_OPCODE_LE_SET_EXT_ADV_DATA HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_EXT_ADV_DATA) -#define HCI_OPCODE_LE_SET_EXT_SCAN_RESP_DATA HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_EXT_SCAN_RESP_DATA) -#define HCI_OPCODE_LE_SET_EXT_ADV_ENABLE HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_EXT_ADV_ENABLE) -#define HCI_OPCODE_LE_READ_MAX_ADV_DATA_LEN HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_MAX_ADV_DATA_LEN) -#define HCI_OPCODE_LE_READ_NUM_SUP_ADV_SETS HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_NUM_SUP_ADV_SETS) -#define HCI_OPCODE_LE_REMOVE_ADV_SET HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_REMOVE_ADV_SET) -#define HCI_OPCODE_LE_CLEAR_ADV_SETS HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_CLEAR_ADV_SETS) -#define HCI_OPCODE_LE_SET_PER_ADV_PARAM HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_PER_ADV_PARAM) -#define HCI_OPCODE_LE_SET_PER_ADV_DATA HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_PER_ADV_DATA) -#define HCI_OPCODE_LE_SET_PER_ADV_ENABLE HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_PER_ADV_ENABLE) -#define HCI_OPCODE_LE_SET_EXT_SCAN_PARAM HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_EXT_SCAN_PARAM) -#define HCI_OPCODE_LE_SET_EXT_SCAN_ENABLE HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_EXT_SCAN_ENABLE) -#define HCI_OPCODE_LE_EXT_CREATE_CONN HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_EXT_CREATE_CONN) -#define HCI_OPCODE_LE_PER_ADV_CREATE_SYNC HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_PER_ADV_CREATE_SYNC) -#define HCI_OPCODE_LE_PER_ADV_CREATE_SYNC_CANCEL HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_PER_ADV_CREATE_SYNC_CANCEL) -#define HCI_OPCODE_LE_PER_ADV_TERMINATE_SYNC HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_PER_ADV_TERM_SYNC) -#define HCI_OPCODE_LE_ADD_DEV_PER_ADV_LIST HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_ADD_DEV_PER_ADV_LIST) -#define HCI_OPCODE_LE_REMOVE_DEV_PER_ADV_LIST HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_REMOVE_DEV_PER_ADV_LIST) -#define HCI_OPCODE_LE_CLEAR_PER_ADV_LIST HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_CLEAR_PER_ADV_LIST) -#define HCI_OPCODE_LE_READ_PER_ADV_LIST_SIZE HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_PER_ADV_LIST_SIZE) -#define HCI_OPCODE_LE_READ_TX_POWER HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_TX_POWER) -#define HCI_OPCODE_LE_WRITE_RF_PATH_COMP HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_WRITE_RF_PATH_COMP) -#define HCI_OPCODE_LE_READ_RF_PATH_COMP HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_READ_RF_PATH_COMP) -#define HCI_OPCODE_LE_SET_PRIVACY_MODE HCI_OPCODE(HCI_OGF_LE_CONTROLLER, HCI_OCF_LE_SET_PRIVACY_MODE) -/**@}*/ - -/** \name ARM Vendor Specific - * - */ -/**@{*/ -#define HCI_OPCODE_LE_VS_ENABLE_READ_FEAT_ON_CONN ((uint16_t)(0xfff3)) -/**@}*/ - -/** \name Command parameter lengths - * - */ -/**@{*/ -#define HCI_LEN_NOP 0 - -#define HCI_LEN_DISCONNECT 3 -#define HCI_LEN_READ_REMOTE_VER_INFO 2 - -#define HCI_LEN_SET_EVENT_MASK 8 -#define HCI_LEN_SET_EVENT_MASK_PAGE2 8 -#define HCI_LEN_RESET 0 -#define HCI_LEN_READ_TX_PWR_LVL 3 -#define HCI_LEN_SET_CONTROLLER_TO_HOST_FC 1 -#define HCI_LEN_HOST_BUFFER_SIZE 8 -#define HCI_LEN_HOST_NUM_CMPL_PKTS 1 - -#define HCI_LEN_READ_LOCAL_VER_INFO 0 -#define HCI_LEN_READ_LOCAL_SUP_CMDS 0 -#define HCI_LEN_READ_LOCAL_SUP_FEAT 0 -#define HCI_LEN_READ_BUF_SIZE 0 -#define HCI_LEN_READ_BD_ADDR 0 - -#define HCI_LEN_READ_RSSI 2 -#define HCI_LEN_READ_AUTH_PAYLOAD_TO 2 -#define HCI_LEN_WRITE_AUTH_PAYLOAD_TO 4 - -#define HCI_LEN_LE_SET_EVENT_MASK 8 -#define HCI_LEN_LE_READ_BUF_SIZE 0 -#define HCI_LEN_LE_READ_LOCAL_SUP_FEAT 0 -#define HCI_LEN_LE_SET_RAND_ADDR 6 -#define HCI_LEN_LE_SET_ADV_PARAM 15 -#define HCI_LEN_LE_READ_ADV_TX_POWER 0 -#define HCI_LEN_LE_SET_ADV_DATA 32 -#define HCI_LEN_LE_SET_SCAN_RESP_DATA 32 -#define HCI_LEN_LE_SET_ADV_ENABLE 1 -#define HCI_LEN_LE_SET_SCAN_PARAM 7 -#define HCI_LEN_LE_SET_SCAN_ENABLE 2 -#define HCI_LEN_LE_CREATE_CONN 25 -#define HCI_LEN_LE_CREATE_CONN_CANCEL 0 -#define HCI_LEN_LE_READ_WHITE_LIST_SIZE 0 -#define HCI_LEN_LE_CLEAR_WHITE_LIST 0 -#define HCI_LEN_LE_ADD_DEV_WHITE_LIST 7 -#define HCI_LEN_LE_REMOVE_DEV_WHITE_LIST 7 -#define HCI_LEN_LE_CONN_UPDATE 14 -#define HCI_LEN_LE_SET_HOST_CHAN_CLASS 5 -#define HCI_LEN_LE_READ_CHAN_MAP 2 -#define HCI_LEN_LE_READ_REMOTE_FEAT 2 -#define HCI_LEN_LE_ENCRYPT 32 -#define HCI_LEN_LE_RAND 0 -#define HCI_LEN_LE_START_ENCRYPTION 28 -#define HCI_LEN_LE_LTK_REQ_REPL 18 -#define HCI_LEN_LE_LTK_REQ_NEG_REPL 2 -#define HCI_LEN_LE_READ_SUP_STATES 0 -#define HCI_LEN_LE_RECEIVER_TEST 1 -#define HCI_LEN_LE_TRANSMITTER_TEST 3 -#define HCI_LEN_LE_TEST_END 0 -/*! \brief New in version 4.1 */ -#define HCI_LEN_LE_REM_CONN_PARAM_REP 14 -#define HCI_LEN_LE_REM_CONN_PARAM_NEG_REP 3 -/*! \brief New in version 4.2 */ -#define HCI_LEN_LE_SET_DATA_LEN 6 -#define HCI_LEN_LE_READ_DEF_DATA_LEN 0 -#define HCI_LEN_LE_WRITE_DEF_DATA_LEN 4 -#define HCI_LEN_LE_READ_LOCAL_P256_PUB_KEY 0 -#define HCI_LEN_LE_GENERATE_DHKEY 64 -#define HCI_LEN_LE_ADD_DEV_RES_LIST 39 -#define HCI_LEN_LE_REMOVE_DEV_RES_LIST 7 -#define HCI_LEN_LE_CLEAR_RES_LIST 0 -#define HCI_LEN_LE_READ_RES_LIST_SIZE 0 -#define HCI_LEN_LE_READ_PEER_RES_ADDR 7 -#define HCI_LEN_LE_READ_LOCAL_RES_ADDR 7 -#define HCI_LEN_LE_SET_ADDR_RES_ENABLE 1 -#define HCI_LEN_LE_SET_RES_PRIV_ADDR_TO 2 -#define HCI_LEN_LE_READ_MAX_DATA_LEN 0 -/*! \brief New in version 5.0 */ -#define HCI_LEN_LE_READ_PHY 2 -#define HCI_LEN_LE_SET_DEF_PHY 3 -#define HCI_LEN_LE_SET_PHY 7 -#define HCI_LEN_LE_ENHANCED_RECEIVER_TEST 3 -#define HCI_LEN_LE_ENHANCED_TRANSMITTER_TEST 4 -#define HCI_LEN_LE_SET_ADV_SET_RAND_ADDR 7 -#define HCI_LEN_LE_SET_EXT_ADV_PARAM 25 -#define HCI_LEN_LE_SET_EXT_ADV_DATA(len) (4 + (len)) -#define HCI_LEN_LE_SET_EXT_SCAN_RESP_DATA(len) (4 + (len)) -#define HCI_LEN_LE_EXT_ADV_ENABLE(numSets) (2 + (4 * (numSets))) -#define HCI_LEN_LE_READ_MAX_ADV_DATA_LEN 0 -#define HCI_LEN_LE_READ_NUM_OF_SUP_ADV_SETS 0 -#define HCI_LEN_LE_REMOVE_ADV_SET 1 -#define HCI_LEN_LE_CLEAR_ADV_SETS 0 -#define HCI_LEN_LE_SET_PER_ADV_PARAM 7 -#define HCI_LEN_LE_SET_PER_ADV_DATA(len) (3 + (len)) -#define HCI_LEN_LE_SET_PER_ADV_ENABLE 2 -#define HCI_LEN_LE_SET_EXT_SCAN_PARAM(numPhys) (3 + (5 * (numPhys))) -#define HCI_LEN_LE_SET_EXT_SCAN_ENABLE 6 -#define HCI_LEN_LE_EXT_CREATE_CONN(numPhys) (10 + (16 * (numPhys))) -#define HCI_LEN_LE_PER_ADV_CREATE_SYNC 14 -#define HCI_LEN_LE_PER_ADV_CREATE_SYNC_CANCEL 0 -#define HCI_LEN_LE_PER_ADV_TERMINATE_SYNC 2 -#define HCI_LEN_LE_ADD_DEV_PER_ADV_LIST 8 -#define HCI_LEN_LE_REMOVE_DEV_PER_ADV_LIST 8 -#define HCI_LEN_LE_CLEAR_PER_ADV_LIST 0 -#define HCI_LEN_LE_READ_PER_ADV_LIST_SIZE 0 -#define HCI_LEN_LE_READ_TX_POWER 0 -#define HCI_LEN_LE_READ_RF_PATH_COMP 0 -#define HCI_LEN_LE_WRITE_RF_PATH_COMP 4 -#define HCI_LEN_LE_SET_PRIVACY_MODE 8 -/**@}*/ - -/** \name Events - * - */ -/**@{*/ -#define HCI_DISCONNECT_CMPL_EVT 0x05 -#define HCI_ENC_CHANGE_EVT 0x08 -#define HCI_READ_REMOTE_VER_INFO_CMPL_EVT 0x0C -#define HCI_CMD_CMPL_EVT 0x0E -#define HCI_CMD_STATUS_EVT 0x0F -#define HCI_HW_ERROR_EVT 0x10 -#define HCI_NUM_CMPL_PKTS_EVT 0x13 -#define HCI_DATA_BUF_OVERFLOW_EVT 0x1A -#define HCI_ENC_KEY_REFRESH_CMPL_EVT 0x30 -#define HCI_LE_META_EVT 0x3E -#define HCI_AUTH_PAYLOAD_TIMEOUT_EVT 0x57 -#define HCI_VENDOR_SPEC_EVT 0xFF -/**@}*/ - -/** \name LE Subevents - * - */ -/**@{*/ -#define HCI_LE_CONN_CMPL_EVT 0x01 -#define HCI_LE_ADV_REPORT_EVT 0x02 -#define HCI_LE_CONN_UPDATE_CMPL_EVT 0x03 -#define HCI_LE_READ_REMOTE_FEAT_CMPL_EVT 0x04 -#define HCI_LE_LTK_REQ_EVT 0x05 -/*! \brief New in version 4.1 */ -#define HCI_LE_REM_CONN_PARAM_REQ_EVT 0x06 -/*! \brief New in version 4.2 */ -#define HCI_LE_DATA_LEN_CHANGE_EVT 0x07 -#define HCI_LE_READ_LOCAL_P256_PUB_KEY_CMPL_EVT 0x08 -#define HCI_LE_GENERATE_DHKEY_CMPL_EVT 0x09 -#define HCI_LE_ENHANCED_CONN_CMPL_EVT 0x0A -#define HCI_LE_DIRECT_ADV_REPORT_EVT 0x0B -/*! \brief New in version 5.0 */ -#define HCI_LE_PHY_UPDATE_CMPL_EVT 0x0C -#define HCI_LE_EXT_ADV_REPORT_EVT 0x0D -#define HCI_LE_PER_ADV_SYNC_EST_EVT 0x0E -#define HCI_LE_PER_ADV_REPORT_EVT 0x0F -#define HCI_LE_PER_ADV_SYNC_LOST_EVT 0x10 -#define HCI_LE_SCAN_TIMEOUT_EVT 0x11 -#define HCI_LE_ADV_SET_TERM_EVT 0x12 -#define HCI_LE_SCAN_REQ_RCVD_EVT 0x13 -#define HCI_LE_CH_SEL_ALGO_EVT 0x14 -/**@}*/ - -/** \name Event parameter lengths - * - */ -/**@{*/ -#define HCI_LEN_DISCONNECT_CMPL 4 /*!< \brief Disconnect event length. */ -#define HCI_LEN_READ_REMOTE_VER_INFO_CMPL 8 /*!< \brief Read remove version info complete event length. */ -#define HCI_LEN_CMD_CMPL 3 /*!< \brief Command complete event length. */ -#define HCI_LEN_CMD_STATUS 4 /*!< \brief Command status event length. */ -#define HCI_LEN_HW_ERR 1 /*!< \brief Hardware error event length. */ -#define HCI_LEN_NUM_CMPL_PKTS 5 /*!< \brief Number of completed packets event length. */ -#define HCI_LEN_ENC_CHANGE 4 /*!< \brief Encryption change event length. */ -#define HCI_LEN_ENC_KEY_REFRESH_CMPL 3 /*!< \brief Encryption key refresh complete event length. */ -#define HCI_LEN_LE_CONN_CMPL 19 /*!< \brief Connection complete event length. */ -#define HCI_LEN_LE_ADV_RPT_MIN 12 /*!< \brief Advertising report event minimum length. */ -#define HCI_LEN_LE_CONN_UPDATE_CMPL 10 /*!< \brief Connection update complete event length. */ -#define HCI_LEN_LE_READ_REMOTE_FEAT_CMPL 12 /*!< \brief Read remote feature event length. */ -#define HCI_LEN_LE_LTK_REQ 13 /*!< \brief LTK request event length. */ -/*! \brief New in version 4.1 */ -#define HCI_LEN_LE_REM_CONN_PARAM_REQ 11 /*!< \brief Remote connection parameter event length. */ -#define HCI_LEN_LE_DATA_LEN_CHANGE 11 /*!< \brief Data length change event length. */ -#define HCI_LEN_LE_READ_PUB_KEY_CMPL 66 /*!< \brief Read local P256 public key compete event length. */ -#define HCI_LEN_LE_GEN_DHKEY_CMPL 34 /*!< \brief Generate DH key complete event length. */ -#define HCI_LEN_LE_ENHANCED_CONN_CMPL 31 /*!< \brief Enhanced connection complete event length. */ -#define HCI_LEN_LE_DIRECT_ADV_REPORT 18 /*!< \brief Direct advertising report event length. */ -#define HCI_LEN_AUTH_PAYLOAD_TIMEOUT 2 /*!< \brief Authenticated payload timeout event length. */ -/*! \brief New in version 5.0 */ -#define HCI_LEN_LE_PHY_UPDATE_CMPL 6 /*!< \brief PHY update complete event length. */ -#define HCI_LEN_LE_CH_SEL_ALGO 4 /*!< \brief Channel selection algorithm event length. */ -#define HCI_LEN_LE_PHY_UPDATE_CMPL 6 /*!< \brief PHY update complete event length. */ -#define HCI_LEN_LE_EXT_ADV_REPORT_MIN 26 /*!< \brief Extended advertising report minimum length. */ -#define HCI_LEN_LE_PER_ADV_SYNC_EST 16 /*!< \brief Periodic advertising sync established event length. */ -#define HCI_LEN_LE_PER_ADV_REPORT 8 /*!< \brief Periodic advertising report event length. */ -#define HCI_LEN_LE_PER_ADV_SYNC_LOST 3 /*!< \brief Periodic advertising sync lost event length. */ -#define HCI_LEN_LE_SCAN_TIMEOUT 1 /*!< \brief Scan timeout event length. */ -#define HCI_LEN_LE_ADV_SET_TERM 6 /*!< \brief Advertising set terminated event length. */ -#define HCI_LEN_LE_SCAN_REQ_RCVD 9 /*!< \brief Scan request received event length. */ -/**@}*/ - -/** \name Supported commands - * - */ -/**@{*/ -#define HCI_SUP_DISCONNECT 0x20 /*!< \brief Byte 0 */ -#define HCI_SUP_READ_REMOTE_VER_INFO 0x80 /*!< \brief Byte 2 */ -#define HCI_SUP_SET_EVENT_MASK 0x40 /*!< \brief Byte 5 */ -#define HCI_SUP_RESET 0x80 /*!< \brief Byte 5 */ -#define HCI_SUP_READ_TX_PWR_LVL 0x04 /*!< \brief Byte 10 */ -#define HCI_SUP_READ_LOCAL_VER_INFO 0x08 /*!< \brief Byte 14 */ -#define HCI_SUP_READ_LOCAL_SUP_FEAT 0x20 /*!< \brief Byte 14 */ -#define HCI_SUP_READ_BD_ADDR 0x02 /*!< \brief Byte 15 */ -#define HCI_SUP_READ_RSSI 0x20 /*!< \brief Byte 15 */ -#define HCI_SUP_SET_EVENT_MASK_PAGE2 0x04 /*!< \brief Byte 22 */ -#define HCI_SUP_LE_SET_EVENT_MASK 0x01 /*!< \brief Byte 25 */ -#define HCI_SUP_LE_READ_BUF_SIZE 0x02 /*!< \brief Byte 25 */ -#define HCI_SUP_LE_READ_LOCAL_SUP_FEAT 0x04 /*!< \brief Byte 25 */ -#define HCI_SUP_LE_SET_RAND_ADDR 0x10 /*!< \brief Byte 25 */ -#define HCI_SUP_LE_SET_ADV_PARAM 0x20 /*!< \brief Byte 25 */ -#define HCI_SUP_LE_READ_ADV_TX_POWER 0x40 /*!< \brief Byte 25 */ -#define HCI_SUP_LE_SET_ADV_DATA 0x80 /*!< \brief Byte 25 */ -#define HCI_SUP_LE_SET_SCAN_RESP_DATA 0x01 /*!< \brief Byte 26 */ -#define HCI_SUP_LE_SET_ADV_ENABLE 0x02 /*!< \brief Byte 26 */ -#define HCI_SUP_LE_SET_SCAN_PARAM 0x04 /*!< \brief Byte 26 */ -#define HCI_SUP_LE_SET_SCAN_ENABLE 0x08 /*!< \brief Byte 26 */ -#define HCI_SUP_LE_CREATE_CONN 0x10 /*!< \brief Byte 26 */ -#define HCI_SUP_LE_CREATE_CONN_CANCEL 0x20 /*!< \brief Byte 26 */ -#define HCI_SUP_LE_READ_WHITE_LIST_SIZE 0x40 /*!< \brief Byte 26 */ -#define HCI_SUP_LE_CLEAR_WHITE_LIST 0x80 /*!< \brief Byte 26 */ -#define HCI_SUP_LE_ADD_DEV_WHITE_LIST 0x01 /*!< \brief Byte 27 */ -#define HCI_SUP_LE_REMOVE_DEV_WHITE_LIST 0x02 /*!< \brief Byte 27 */ -#define HCI_SUP_LE_CONN_UPDATE 0x04 /*!< \brief Byte 27 */ -#define HCI_SUP_LE_SET_HOST_CHAN_CLASS 0x08 /*!< \brief Byte 27 */ -#define HCI_SUP_LE_READ_CHAN_MAP 0x10 /*!< \brief Byte 27 */ -#define HCI_SUP_LE_READ_REMOTE_FEAT 0x20 /*!< \brief Byte 27 */ -#define HCI_SUP_LE_ENCRYPT 0x40 /*!< \brief Byte 27 */ -#define HCI_SUP_LE_RAND 0x80 /*!< \brief Byte 27 */ -#define HCI_SUP_LE_START_ENCRYPTION 0x01 /*!< \brief Byte 28 */ -#define HCI_SUP_LE_LTK_REQ_REPL 0x02 /*!< \brief Byte 28 */ -#define HCI_SUP_LE_LTK_REQ_NEG_REPL 0x04 /*!< \brief Byte 28 */ -#define HCI_SUP_LE_READ_SUP_STATES 0x08 /*!< \brief Byte 28 */ -#define HCI_SUP_LE_RECEIVER_TEST 0x10 /*!< \brief Byte 28 */ -#define HCI_SUP_LE_TRANSMITTER_TEST 0x20 /*!< \brief Byte 28 */ -#define HCI_SUP_LE_TEST_END 0x40 /*!< \brief Byte 28 */ -#define HCI_SUP_READ_AUTH_PAYLOAD_TO 0x10 /*!< \brief Byte 32 */ -#define HCI_SUP_WRITE_AUTH_PAYLOAD_TO 0x20 /*!< \brief Byte 32 */ -/*! \brief New in version 4.1 */ -#define HCI_SUP_LE_REM_CONN_PARAM_REQ_REPL 0x10 /*!< \brief Byte 33 */ -#define HCI_SUP_LE_REM_CONN_PARAM_REQ_NEG_REPL 0x20 /*!< \brief Byte 33 */ -/*! \brief New in version 4.2 */ -#define HCI_SUP_LE_SET_DATA_LEN 0x40 /*!< \brief Byte 33 */ -#define HCI_SUP_LE_READ_DEF_DATA_LEN 0x80 /*!< \brief Byte 33 */ -#define HCI_SUP_LE_WRITE_DEF_DATA_LEN 0x01 /*!< \brief Byte 34 */ -#define HCI_SUP_LE_READ_LOCAL_P256_PUB_KEY 0x02 /*!< \brief Byte 34 */ -#define HCI_SUP_LE_GENERATE_DHKEY 0x04 /*!< \brief Byte 34 */ -#define HCI_SUP_LE_ADD_DEV_RES_LIST_EVT 0x08 /*!< \brief Byte 34 */ -#define HCI_SUP_LE_REMOVE_DEV_RES_LIST 0x10 /*!< \brief Byte 34 */ -#define HCI_SUP_LE_CLEAR_RES_LIST 0x20 /*!< \brief Byte 34 */ -#define HCI_SUP_LE_READ_RES_LIST_SIZE 0x40 /*!< \brief Byte 34 */ -#define HCI_SUP_LE_READ_PEER_RES_ADDR 0x80 /*!< \brief Byte 34 */ -#define HCI_SUP_LE_READ_LOCAL_RES_ADDR 0x01 /*!< \brief Byte 35 */ -#define HCI_SUP_LE_SET_ADDR_RES_ENABLE 0x02 /*!< \brief Byte 35 */ -#define HCI_SUP_LE_SET_RES_PRIV_ADDR_TO 0x04 /*!< \brief Byte 35 */ -#define HCI_SUP_LE_READ_MAX_DATA_LEN 0x08 /*!< \brief Byte 35 */ -/*! \brief New in version 5.0 */ -#define HCI_SUP_LE_READ_PHY 0x10 /*!< \brief Byte 35 */ -#define HCI_SUP_LE_SET_DEF_PHY 0x20 /*!< \brief Byte 35 */ -#define HCI_SUP_LE_SET_PHY 0x40 /*!< \brief Byte 35 */ -#define HCI_SUP_LE_ENHANCED_RECEIVER_TEST 0x80 /*!< \brief Byte 35 */ -#define HCI_SUP_LE_ENHANCED_TRANSMITTER_TEST 0x01 /*!< \brief Byte 36 */ -#define HCI_SUP_LE_SET_ADV_SET_RAND_ADDR 0x02 /*!< \brief Byte 36 */ -#define HCI_SUP_LE_SET_EXT_ADV_PARAM 0x04 /*!< \brief Byte 36 */ -#define HCI_SUP_LE_SET_EXT_ADV_DATA 0x08 /*!< \brief Byte 36 */ -#define HCI_SUP_LE_SET_EXT_SCAN_RESP_DATA 0x10 /*!< \brief Byte 36 */ -#define HCI_SUP_LE_SET_EXT_ADV_ENABLE 0x20 /*!< \brief Byte 36 */ -#define HCI_SUP_LE_READ_MAX_ADV_DATA_LEN 0x40 /*!< \brief Byte 36 */ -#define HCI_SUP_LE_READ_NUM_OF_SUP_ADV_SETS 0x80 /*!< \brief Byte 36 */ -#define HCI_SUP_LE_REMOVE_ADV_SET 0x01 /*!< \brief Byte 37 */ -#define HCI_SUP_LE_CLEAR_ADV_SETS 0x02 /*!< \brief Byte 37 */ -#define HCI_SUP_LE_SET_PER_ADV_PARAM 0x04 /*!< \brief Byte 37 */ -#define HCI_SUP_LE_SET_PER_ADV_DATA 0x08 /*!< \brief Byte 37 */ -#define HCI_SUP_LE_SET_PER_ADV_ENABLE 0x10 /*!< \brief Byte 37 */ -#define HCI_SUP_LE_SET_EXT_SCAN_PARAM 0x20 /*!< \brief Byte 37 */ -#define HCI_SUP_LE_SET_EXT_SCAN_ENABLE 0x40 /*!< \brief Byte 37 */ -#define HCI_SUP_LE_EXT_CREATE_CONN 0x80 /*!< \brief Byte 37 */ -#define HCI_SUP_LE_PER_ADV_CREATE_SYNC 0x01 /*!< \brief Byte 38 */ -#define HCI_SUP_LE_PER_ADV_CREATE_SYNC_CANCEL 0x02 /*!< \brief Byte 38 */ -#define HCI_SUP_LE_PER_ADV_TERMINATE_SYNC 0x04 /*!< \brief Byte 38 */ -#define HCI_SUP_LE_ADD_DEV_PER_ADV_LIST 0x08 /*!< \brief Byte 38 */ -#define HCI_SUP_LE_REMOVE_DEV_PER_ADV_LIST 0x10 /*!< \brief Byte 38 */ -#define HCI_SUP_LE_CLEAR_PER_ADV_LIST 0x20 /*!< \brief Byte 38 */ -#define HCI_SUP_LE_READ_PER_ADV_LIST_SIZE 0x40 /*!< \brief Byte 38 */ -#define HCI_SUP_LE_READ_TX_POWER 0x80 /*!< \brief Byte 38 */ -#define HCI_SUP_LE_READ_RF_PATH_COMP 0x01 /*!< \brief Byte 39 */ -#define HCI_SUP_LE_WRITE_RF_PATH_COMP 0x02 /*!< \brief Byte 39 */ -#define HCI_SUP_LE_SET_PRIVACY_MODE 0x04 /*!< \brief Byte 39 */ -#define HCI_SUP_LE_SET_MIN_NUM_OF_USED_CH 0x08 /*!< \brief Byte 39 */ -/**@}*/ - -/** \name Event mask - * - */ -/**@{*/ -#define HCI_EVT_MASK_DISCONNECT_CMPL 0x10 /*!< \brief Byte 0 */ -#define HCI_EVT_MASK_ENC_CHANGE 0x80 /*!< \brief Byte 0 */ -#define HCI_EVT_MASK_READ_REMOTE_VER_INFO_CMPL 0x08 /*!< \brief Byte 1 */ -#define HCI_EVT_MASK_HW_ERROR 0x80 /*!< \brief Byte 1 */ -#define HCI_EVT_MASK_DATA_BUF_OVERFLOW 0x02 /*!< \brief Byte 3 */ -#define HCI_EVT_MASK_ENC_KEY_REFRESH_CMPL 0x80 /*!< \brief Byte 5 */ -#define HCI_EVT_MASK_LE_META 0x20 /*!< \brief Byte 7 */ -/**@}*/ - -/** \name Event mask page 2 - * - */ -/**@{*/ -#define HCI_EVT_MASK_AUTH_PAYLOAD_TIMEOUT 0x80 /*!< \brief Byte 2 */ -/**@}*/ - -/** \name LE event mask - * - */ -/**@{*/ -#define HCI_EVT_MASK_LE_CONN_CMPL_EVT 0x01 /*!< \brief Byte 0 */ -#define HCI_EVT_MASK_LE_ADV_REPORT_EVT 0x02 /*!< \brief Byte 0 */ -#define HCI_EVT_MASK_LE_CONN_UPDATE_CMPL_EVT 0x04 /*!< \brief Byte 0 */ -#define HCI_EVT_MASK_LE_READ_REMOTE_FEAT_CMPL_EVT 0x08 /*!< \brief Byte 0 */ -#define HCI_EVT_MASK_LE_LTK_REQ_EVT 0x10 /*!< \brief Byte 0 */ -/*! \brief New in version 4.1 */ -#define HCI_EVT_MASK_LE_REMOTE_CONN_PARAM_REQ_EVT 0x20 /*!< \brief Byte 0 */ -/*! \brief New in version 4.2 */ -#define HCI_EVT_MASK_LE_DATA_LEN_CHANGE_EVT 0x40 /*!< \brief Byte 0 */ -#define HCI_EVT_MASK_LE_READ_LOCAL_P256_PUB_KEY_CMPL 0x80 /*!< \brief Byte 0 */ -#define HCI_EVT_MASK_LE_GENERATE_DHKEY_CMPL 0x01 /*!< \brief Byte 1 */ -#define HCI_EVT_MASK_LE_ENHANCED_CONN_CMPL_EVT 0x02 /*!< \brief Byte 1 */ -#define HCI_EVT_MASK_LE_DIRECT_ADV_REPORT_EVT 0x04 /*!< \brief Byte 1 */ -/*! \brief New in version 5.0 */ -#define HCI_EVT_MASK_LE_PHY_UPDATE_CMPL_EVT 0x08 /*!< \brief Byte 1 */ -#define HCI_EVT_MASK_LE_EXT_ADV_REPORT_EVT 0x10 /*!< \brief Byte 1 */ -#define HCI_EVT_MASK_LE_PER_ADV_SYNC_EST_EVT 0x20 /*!< \brief Byte 1 */ -#define HCI_EVT_MASK_LE_PER_ADV_REPORT_EVT 0x40 /*!< \brief Byte 1 */ -#define HCI_EVT_MASK_LE_PER_ADV_SYNC_LOST_EVT 0x80 /*!< \brief Byte 1 */ -#define HCI_EVT_MASK_LE_SCAN_TIMEOUT_EVT 0x01 /*!< \brief Byte 2 */ -#define HCI_EVT_MASK_LE_ADV_SET_TERM_EVT 0x02 /*!< \brief Byte 2 */ -#define HCI_EVT_MASK_LE_SCAN_REQ_RCVD_EVT 0x04 /*!< \brief Byte 2 */ -#define HCI_EVT_MASK_LE_CH_SEL_ALGO_EVT 0x08 /*!< \brief Byte 2 */ -/**@}*/ - -/** \name LE supported features - * - */ -/**@{*/ -/*! \brief New in version 4.0 */ -#define HCI_LE_SUP_FEAT_ENCRYPTION 0x0001 /*!< \brief Encryption supported */ -/*! \brief New in version 4.1 */ -#define HCI_LE_SUP_FEAT_CONN_PARAM_REQ_PROC 0x0002 /*!< \brief Connection Parameters Request Procedure supported */ -#define HCI_LE_SUP_FEAT_EXT_REJECT_IND 0x0004 /*!< \brief Extended Reject Indication supported */ -#define HCI_LE_SUP_FEAT_SLV_INIT_FEAT_EXCH 0x0008 /*!< \brief Slave-Initiated Features Exchange supported */ -#define HCI_LE_SUP_FEAT_LE_PING 0x0010 /*!< \brief LE Ping supported */ -/*! \brief New in version 4.2 */ -#define HCI_LE_SUP_FEAT_DATA_LEN_EXT 0x0020 /*!< \brief Data Length Extension supported */ -#define HCI_LE_SUP_FEAT_PRIVACY 0x0040 /*!< \brief LL Privacy supported */ -#define HCI_LE_SUP_FEAT_EXT_SCAN_FILT_POLICY 0x0080 /*!< \brief Extended Scan Filter Policy supported */ -/*! \brief New in version 5.0 */ -#define HCI_LE_SUP_FEAT_LE_2M_PHY 0x0100 /*!< \brief LE 2M PHY supported */ -#define HCI_LE_SUP_FEAT_STABLE_MOD_IDX_TRANSMITTER 0x0200 /*!< \brief Stable Modulation Index - Transmitter supported */ -#define HCI_LE_SUP_FEAT_STABLE_MOD_IDX_RECEIVER 0x0400 /*!< \brief Stable Modulation Index - Receiver supported */ -#define HCI_LE_SUP_FEAT_LE_CODED_PHY 0x0800 /*!< \brief LE Coded PHY supported */ -#define HCI_LE_SUP_FEAT_LE_EXT_ADV 0x1000 /*!< \brief LE Extended Advertising supported */ -#define HCI_LE_SUP_FEAT_LE_PER_ADV 0x2000 /*!< \brief LE Periodic Advertising supported */ -#define HCI_LE_SUP_FEAT_CH_SEL_2 0x4000 /*!< \brief Channel Selection Algorithm #2 supported */ -#define HCI_LE_SUP_FEAT_LE_POWER_CLASS_1 0x8000 /*!< \brief LE Power Class 1 supported */ -/**@}*/ - -/** \name Advertising command parameters - * - */ -/**@{*/ -#define HCI_ADV_MIN_INTERVAL 0x0020 /*!< \brief Minimum advertising interval */ -#define HCI_ADV_MAX_INTERVAL 0x4000 /*!< \brief Maximum advertising interval */ -#define HCI_ADV_DIRECTED_MAX_DURATION 0x0500 /*!< \brief Maximum high duty cycle connectable directed advertising duration */ -#define HCI_ADV_TYPE_CONN_UNDIRECT 0x00 /*!< \brief Connectable undirected advertising */ -#define HCI_ADV_TYPE_CONN_DIRECT 0x01 /*!< \brief Connectable directed high duty cycle advertising */ -#define HCI_ADV_TYPE_DISC_UNDIRECT 0x02 /*!< \brief Discoverable undirected advertising */ -#define HCI_ADV_TYPE_NONCONN_UNDIRECT 0x03 /*!< \brief Nonconnectable undirected advertising */ -#define HCI_ADV_TYPE_CONN_DIRECT_LO_DUTY 0x04 /*!< \brief Connectable directed low duty cycle advertising */ -#define HCI_ADV_CHAN_37 0x01 /*!< \brief Advertising channel 37 */ -#define HCI_ADV_CHAN_38 0x02 /*!< \brief Advertising channel 38 */ -#define HCI_ADV_CHAN_39 0x04 /*!< \brief Advertising channel 39 */ -#define HCI_ADV_FILT_NONE 0x00 /*!< \brief No scan request or connection filtering */ -#define HCI_ADV_FILT_SCAN 0x01 /*!< \brief White list filters scan requests */ -#define HCI_ADV_FILT_CONN 0x02 /*!< \brief White list filters connections */ -#define HCI_ADV_FILT_ALL 0x03 /*!< \brief White list filters scan req. and conn. */ -/**@}*/ - -/** \name Scan command parameters - * - */ -/**@{*/ -#define HCI_SCAN_TYPE_PASSIVE 0 /*!< \brief Passive scan */ -#define HCI_SCAN_TYPE_ACTIVE 1 /*!< \brief Active scan */ -#define HCI_SCAN_INTERVAL_MIN 0x0004 /*!< \brief Minimum scan interval */ -#define HCI_SCAN_INTERVAL_MAX 0x4000 /*!< \brief Maximum scan interval */ -#define HCI_SCAN_INTERVAL_DEFAULT 0x0010 /*!< \brief Default scan interval */ -#define HCI_SCAN_WINDOW_MIN 0x0004 /*!< \brief Minimum scan window */ -#define HCI_SCAN_WINDOW_MAX 0x4000 /*!< \brief Maximum scan window */ -#define HCI_SCAN_WINDOW_DEFAULT 0x0010 /*!< \brief Default scan window */ -/**@}*/ - -/** \name Connection command parameters - * - */ -/**@{*/ -#define HCI_CONN_INTERVAL_MIN 0x0006 /*!< \brief Minimum connection interval */ -#define HCI_CONN_INTERVAL_MAX 0x0C80 /*!< \brief Maximum connection interval */ -#define HCI_CONN_LATENCY_MAX 0x01F3 /*!< \brief Maximum connection latency */ -#define HCI_SUP_TIMEOUT_MIN 0x000A /*!< \brief Minimum supervision timeout */ -#define HCI_SUP_TIMEOUT_MAX 0x0C80 /*!< \brief Maximum supervision timeout */ -/**@}*/ - -/** \name Connection event parameters - * - */ -/**@{*/ -#define HCI_ROLE_MASTER 0 /*!< \brief Role is master */ -#define HCI_ROLE_SLAVE 1 /*!< \brief Role is slave */ -#define HCI_CLOCK_500PPM 0x00 /*!< \brief 500 ppm clock accuracy */ -#define HCI_CLOCK_250PPM 0x01 /*!< \brief 250 ppm clock accuracy */ -#define HCI_CLOCK_150PPM 0x02 /*!< \brief 150 ppm clock accuracy */ -#define HCI_CLOCK_100PPM 0x03 /*!< \brief 100 ppm clock accuracy */ -#define HCI_CLOCK_75PPM 0x04 /*!< \brief 75 ppm clock accuracy */ -#define HCI_CLOCK_50PPM 0x05 /*!< \brief 50 ppm clock accuracy */ -#define HCI_CLOCK_30PPM 0x06 /*!< \brief 30 ppm clock accuracy */ -#define HCI_CLOCK_20PPM 0x07 /*!< \brief 20 ppm clock accuracy */ -/**@}*/ - -/** \name Advertising report event parameters - * - */ -/**@{*/ -#define HCI_ADV_CONN_UNDIRECT 0x00 /*!< \brief Connectable undirected advertising */ -#define HCI_ADV_CONN_DIRECT 0x01 /*!< \brief Connectable directed advertising */ -#define HCI_ADV_DISC_UNDIRECT 0x02 /*!< \brief Discoverable undirected advertising */ -#define HCI_ADV_NONCONN_UNDIRECT 0x03 /*!< \brief Non-connectable undirected advertising */ -#define HCI_ADV_SCAN_RESPONSE 0x04 /*!< \brief Scan response */ -/**@}*/ - -/** \name Extended advertising data operations - * - */ -/**@{*/ -#define HCI_ADV_DATA_OP_FRAG_INTER 0x00 /*!< \brief Intermediate fragment */ -#define HCI_ADV_DATA_OP_FRAG_FIRST 0x01 /*!< \brief First fragment */ -#define HCI_ADV_DATA_OP_FRAG_LAST 0x02 /*!< \brief Last fragment */ -#define HCI_ADV_DATA_OP_COMP_FRAG 0x03 /*!< \brief Complete extended advertising data */ -#define HCI_ADV_DATA_OP_UNCHANGED_DATA 0x04 /*!< \brief Unchanged data (just update Advertising DID) */ -/**@}*/ - -/** \name Advertising data fragment preference - * - */ -/**@{*/ -#define HCI_ADV_DATA_FRAG_PREF_FRAG 0x00 /*!< \brief Controller may fragment all Host advertising data */ -#define HCI_ADV_DATA_FRAG_PREF_NO_FRAG 0x01 /*!< \brief Controller should not fragment nor minimize fragmentation of Host advertising data */ -/**@}*/ - -/** \name Number of advertising sets - * - */ -/**@{*/ -#define HCI_ADV_NUM_SETS_ALL_DISABLE 0x00 /*!< \brief Disable all advertising sets */ -/**@}*/ - -/** \name Maximum number of scanning or initiating PHYs - * - */ -/**@{*/ -#define HCI_MAX_NUM_PHYS 3 /*!< \brief Maximum number of scanning or initiating PHYs */ -/**@}*/ - -/** \name Advertising PHY values - * - */ -/**@{*/ -#define HCI_ADV_PHY_LE_1M 0x01 /*!< \brief LE 1M PHY */ -#define HCI_ADV_PHY_LE_2M 0x02 /*!< \brief LE 2M PHY */ -#define HCI_ADV_PHY_LE_CODED 0x03 /*!< \brief LE Coded PHY */ -/**@}*/ - -/** \name Scanner PHY value bits - * - */ -/**@{*/ -#define HCI_SCAN_PHY_LE_1M_BIT (1<<0) /*!< \brief LE 1M PHY */ -#define HCI_SCAN_PHY_LE_2M_BIT (1<<1) /*!< \brief LE 2M PHY */ -#define HCI_SCAN_PHY_LE_CODED_BIT (1<<2) /*!< \brief LE Coded PHY */ -/**@}*/ - -/** \name Initiator PHY value bits - * - */ -/**@{*/ -#define HCI_INIT_PHY_LE_1M_BIT (1<<0) /*!< \brief LE 1M PHY */ -#define HCI_INIT_PHY_LE_2M_BIT (1<<1) /*!< \brief LE 2M PHY */ -#define HCI_INIT_PHY_LE_CODED_BIT (1<<2) /*!< \brief LE Coded PHY */ -/**@}*/ - -/** \name Advertising event properties type bits - * - */ -/**@{*/ -#define HCI_ADV_PROP_CONN_ADV_BIT (1<<0) /*!< \brief Connectable advertising bit */ -#define HCI_ADV_PROP_SCAN_ADV_BIT (1<<1) /*!< \brief Scannable advertising bit */ -#define HCI_ADV_PROP_DIRECT_ADV_BIT (1<<2) /*!< \brief Directed advertising bit */ -#define HCI_ADV_PROP_CONN_DIRECT_ADV_BIT (1<<3) /*!< \brief High duty cycle connectable directed advertising bit */ -#define HCI_ADV_PROP_USE_LEG_PDU_BIT (1<<4) /*!< \brief Use legacy advertising PDUs bit */ -#define HCI_ADV_PROP_OMIT_ADV_ADDR_BIT (1<<5) /*!< \brief Omit advertiser's address from all PDUs (anonymous advertising) bit */ -#define HCI_ADV_PROP_INC_TX_PWR_BIT (1<<6) /*!< \brief Include TxPower in extended header of advertising PDU bit */ -/**@}*/ - -/** \name Advertising event properties for legacy PDUs - * - */ -/**@{*/ -#define HCI_ADV_PROP_LEG_CONN_UNDIRECT 0x13 /*!< \brief Connectable and scannable undirected advertising (00010011b) */ -#define HCI_ADV_PROP_LEG_CONN_DIRECT 0x1D /*!< \brief Connectable directed high duty cycle advertising (00011101b) */ -#define HCI_ADV_PROP_LEG_SCAN_UNDIRECT 0x12 /*!< \brief Scannable undirected advertising (00010010b) */ -#define HCI_ADV_PROP_LEG_NONCONN_UNDIRECT 0x10 /*!< \brief Non-connectable and non-scannable undirected advertising (00010000b) */ -#define HCI_ADV_PROP_LEG_CONN_DIRECT_LO_DUTY 0x15 /*!< \brief Connectable directed low duty cycle advertising (00010101b) */ -/**@}*/ - -/** \name Extended advertising report event type bits - * - */ -/**@{*/ -#define HCI_ADV_RPT_CONN_ADV_BIT (1<<0) /*!< \brief Connectable advertising event bit */ -#define HCI_ADV_RPT_SCAN_ADV_BIT (1<<1) /*!< \brief Scannable advertising event bit */ -#define HCI_ADV_RPT_DIRECT_ADV_BIT (1<<2) /*!< \brief Directed advertising event bit */ -#define HCI_ADV_RPT_SCAN_RSP_BIT (1<<3) /*!< \brief Scan response event bit */ -#define HCI_ADV_RPT_LEG_ADV_BIT (1<<4) /*!< \brief Legacy advertising PDU event bit */ -#define HCI_ADV_RPT_DATA_STATUS_BITS (3<<5) /*!< \brief Data status bits */ -/**@}*/ - -/** \name Advertising report event types for legacy PDUs - * - */ -/**@{*/ -#define HCI_ADV_RPT_LEG_CONN_UNDIRECT 0x13 /*!< \brief Connectable and scannable undirected advertising (0010011b) */ -#define HCI_ADV_RPT_LEG_CONN_DIRECT 0x15 /*!< \brief Connectable directed advertising (0010101b) */ -#define HCI_ADV_RPT_LEG_SCAN_UNDIRECT 0x12 /*!< \brief Scannable undirected advertising (0010010b) */ -#define HCI_ADV_RPT_LEG_NONCONN_UNDIRECT 0x10 /*!< \brief Non-connectable and non-scannable undirected advertising (0010000b) */ -#define HCI_ADV_RPT_LEG_CONN_UNDIRECT_SCAN_RSP 0x1B /*!< \brief Scan response to connectable and scannable undirected advertising (0011011b) */ -#define HCI_ADV_RPT_LEG_SCAN_UNDIRECT_SCAN_RSP 0x1A /*!< \brief Scan response to scannable undirected advertising (0011010b) */ -/**@}*/ - -/** \name Advertising report data status - * - */ -/**@{*/ -#define HCI_ADV_RPT_DATA_CMPL 0x00 /*!< \brief Data complete */ -#define HCI_ADV_RPT_DATA_INCMPL_MORE 0x01 /*!< \brief Data incomplete, more date to come */ -#define HCI_ADV_RPT_DATA_INCMPL_TRUNC 0x02 /*!< \brief Data incomplete, data truncated, no more date to come */ -/**@}*/ - -/** \name Extended advertising report event primary PHY values - * - */ -/**@{*/ -#define HCI_ADV_RPT_PHY_PRIM_LE_1M 0x01 /*!< \brief Advertiser PHY is LE 1M */ -#define HCI_ADV_RPT_PHY_PRIM_LE_CODED 0x03 /*!< \brief Advertiser PHY is LE Coded */ -/**@}*/ - -/** \name Extended advertising report event seconday PHY values - * - */ -/**@{*/ -#define HCI_ADV_RPT_PHY_SEC_NONE 0x00 /*!< \brief No packets on seconday advertising channel */ -#define HCI_ADV_RPT_PHY_SEC_LE_1M 0x01 /*!< \brief Advertiser PHY is LE 1M */ -#define HCI_ADV_RPT_PHY_SEC_LE_2M 0x02 /*!< \brief Advertiser PHY is LE 2M */ -#define HCI_ADV_RPT_PHY_SEC_LE_CODED 0x03 /*!< \brief Advertiser PHY is LE Coded */ -/**@}*/ - -/** \name Channel selection algorithm used - * - */ -/**@{*/ -#define HCI_CH_SEL_ALGO_1 0x00 /*!< \brief LE channel selection algorithm #1 used */ -#define HCI_CH_SEL_ALGO_2 0x01 /*!< \brief LE channel selection algorithm #2 used */ -/**@}*/ - -/** \name Minimum number of used channels - * - */ -/**@{*/ -#define HCI_MIN_NUM_OF_USED_CHAN 8 /*!< \brief Minimum number of used channels */ -/**@}*/ - -/** \name Misc command parameters - * - */ -/**@{*/ -#define HCI_READ_TX_PWR_CURRENT 0 /*!< \brief Read current tx power */ -#define HCI_READ_TX_PWR_MAX 1 /*!< \brief Read maximum tx power */ -#define HCI_TX_PWR_MIN -30 /*!< \brief Minimum tx power dBm */ -#define HCI_TX_PWR_MAX 20 /*!< \brief Maximum tx power dBm */ -#define HCI_TX_PWR_NO_PREFERENCE 127 /*!< \brief Tx power no preference */ -#define HCI_VERSION 6 /*!< \brief HCI specification version */ -#define HCI_RSSI_MIN -127 /*!< \brief Minimum RSSI dBm */ -#define HCI_RSSI_MAX 20 /*!< \brief Maximum RSSI dBm */ -#define HCI_ADDR_TYPE_PUBLIC 0 /*!< \brief Public device address */ -#define HCI_ADDR_TYPE_RANDOM 1 /*!< \brief Random device address */ -#define HCI_ADDR_TYPE_PUBLIC_IDENTITY 2 /*!< \brief Public identity address */ -#define HCI_ADDR_TYPE_RANDOM_IDENTITY 3 /*!< \brief Random identity address */ -#define HCI_ADDR_TYPE_ANONYMOUS 0xFF /*!< \brief Anonymous device address */ -#define HCI_FILT_NONE 0 /*!< \brief Accept all advertising packets */ -#define HCI_FILT_WHITE_LIST 1 /*!< \brief Accept from While List only */ -#define HCI_FILT_RES_INIT 2 /*!< \brief Accept directed advertisements with RPAs */ -#define HCI_FILT_WHITE_LIST_RES_INIT 3 /*!< \brief Accept from White List or directed advertisements with RPAs */ -#define HCI_FILT_PER_ADV_PARAM 0 /*!< \brief Listen to advertiser specified by create sync command parameters */ -#define HCI_FILT_PER_ADV_LIST 1 /*!< \brief Listen to advertiser from Periodic Advertiser List only */ -#define HCI_ROLE_MASTER 0 /*!< \brief Role is master */ -#define HCI_ROLE_SLAVE 1 /*!< \brief Role is slave */ -#define HCI_PRIV_MODE_NETWORK 0x00 /*!< \brief Network privacy mode (default) */ -#define HCI_PRIV_MODE_DEVICE 0x01 /*!< \brief Device privacy mode */ -/**@}*/ - -/** \name PHY types - * - */ -/**@{*/ -#define HCI_PHY_NONE 0x00 /*!< \brief No selected PHY */ -#define HCI_PHY_LE_1M_BIT (1<<0) /*!< \brief LE 1M PHY */ -#define HCI_PHY_LE_2M_BIT (1<<1) /*!< \brief LE 2M PHY */ -#define HCI_PHY_LE_CODED_BIT (1<<2) /*!< \brief LE Coded PHY */ -/**@}*/ - -/** \name All PHYs preference - * - */ -/**@{*/ -#define HCI_ALL_PHY_ALL_PREFERENCES 0x00 /*!< \brief All PHY preferences */ -#define HCI_ALL_PHY_TX_PREFERENCE_BIT (1<<0) /*!< \brief Tx PHY preference */ -#define HCI_ALL_PHY_RX_PREFERENCE_BIT (1<<1) /*!< \brief Rx PHY preference */ -/**@}*/ - -/** \name PHY options - * - */ -/**@{*/ -#define HCI_PHY_OPTIONS_NONE 0x00 /*!< \brief No preferences */ -#define HCI_PHY_OPTIONS_S2_PREFERRED 0x01 /*!< \brief S=2 coding preferred when transmitting on LE Coded PHY */ -#define HCI_PHY_OPTIONS_S8_PREFERRED 0x02 /*!< \brief S=8 coding preferred when transmitting on LE Coded PHY */ -/**@}*/ - -/** \name Parameter lengths - * - */ -/**@{*/ -#define HCI_EVT_MASK_LEN 8 /*!< \brief Length of event mask byte array */ -#define HCI_EVT_MASK_PAGE_2_LEN 8 /*!< \brief Length of event mask page 2 byte array */ -#define HCI_LE_EVT_MASK_LEN 8 /*!< \brief Length of LE event mask byte array */ -#define HCI_FEAT_LEN 8 /*!< \brief Length of features byte array */ -#define HCI_ADV_DATA_LEN 31 /*!< \brief Length of advertising data */ -#define HCI_SCAN_DATA_LEN 31 /*!< \brief Length of scan response data */ -#define HCI_EXT_ADV_DATA_LEN 251 /*!< \brief Length of extended advertising data */ -#define HCI_PER_ADV_DATA_LEN 252 /*!< \brief Length of periodic advertising data */ -#define HCI_EXT_ADV_RPT_DATA_LEN 229 /*!< \brief Length of extended advertising report data */ -#define HCI_PER_ADV_RPT_DATA_LEN 248 /*!< \brief Length of periodic advertising report data */ -#define HCI_CHAN_MAP_LEN 5 /*!< \brief Length of channel map byte array */ -#define HCI_KEY_LEN 16 /*!< \brief Length of encryption key */ -#define HCI_ENCRYPT_DATA_LEN 16 /*!< \brief Length of data used in encryption */ -#define HCI_RAND_LEN 8 /*!< \brief Length of random number */ -#define HCI_LE_STATES_LEN 8 /*!< \brief Length of LE states byte array */ -#define HCI_P256_KEY_LEN 64 /*!< \brief Length of P256 key */ -#define HCI_DH_KEY_LEN 32 /*!< \brief Length of DH Key */ - -#define HCI_EXT_ADV_RPT_DATA_LEN_OFFSET 23 /*!< \brief Length field offset of extended advertising report data */ -#define HCI_PER_ADV_RPT_DATA_LEN_OFFSET 6 /*!< \brief Length field offset of periodic advertising report data */ -/**@}*/ - -/** \name Company ID - * - */ -/**@{*/ -#define HCI_ID_ARM 0x005F /*!< \brief ARM Ltd. company ID */ -/**@}*/ - -/** \name Manufacturer location in Local version - * - */ -/**@{*/ -#define HCI_LOCAL_VER_MANUFACTURER_POS 4 -/**@}*/ - -/* \} */ /* STACK_HCI_API */ - -#ifdef __cplusplus -}; -#endif - -#endif /* HCI_DEFS_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/platform_api.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/platform_api.h deleted file mode 100644 index 8539fdf225..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/platform_api.h +++ /dev/null @@ -1,283 +0,0 @@ -/* Copyright (c) 2009-2019 Arm Limited - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************************************/ -/*! - * \brief Baseband interface file. - */ -/*************************************************************************************************/ - -#ifndef PLATFORM_API_H -#define PLATFORM_API_H - -#include "wsf_types.h" - -/************************************************************************************************** - Type Definitions -**************************************************************************************************/ - -/*! \brief Status callback. */ -typedef bool_t (*PlatformStatus_t)(uint32_t *); - -/*! \brief Sleep enter callback. */ -typedef void (*PlatformSleepEnter_t)(void); - -/*! \brief Sleep exit callback. */ -typedef void (*PlatformSleepExit_t)(void); - -/*! \brief BB configuration. */ -typedef struct -{ - uint16_t clkPpm; /*!< Clock accuracy in PPM. */ - uint8_t rfSetupDelayUsec; /*!< RF setup delay in microseconds. */ - uint16_t maxScanPeriodMsec; /*!< Maximum scan period in milliseconds. */ - uint16_t schSetupDelayUsec; /*!< Schedule setup delay in microseconds. */ -} PlatformBbCfg_t; - -/*! \brief Version component IDs. */ -typedef enum -{ - PLATFORM_VER_ID_RADIO = 0, /*!< Radio version. */ - PLATFORM_VER_ID_HW_BLE = 1, /*!< BLE HW version. */ - PLATFORM_VER_ID_PHY = 2, /*!< PHY HW version. */ - PLATFORM_VER_ID_HW_SYS = 3, /*!< System HW version. */ - PLATFORM_VER_ID_SW_DRV = 4, /*!< Software version. */ - PLATFORM_VER_ID_15P4_MAC = 5, /*!< 802.15.4 HW version. */ - PLATFORM_VER_INFO_NUM = 6 /*!< Total number of version IDs. */ -} PlatformVersionId_t; - -/************************************************************************************************** - Global Variables -**************************************************************************************************/ - -/*! \brief Number of assertions. */ -extern uint32_t PlatformAssertCount; - -/*! \brief Trap enabled flag. */ -extern volatile bool_t PlatformAssertTrapEnable; - -/************************************************************************************************** - Function Declarations -**************************************************************************************************/ - -/* Initialization */ -/*************************************************************************************************/ -/*! - * \brief Common platform initialization. - * - * \return None. - */ -/*************************************************************************************************/ -void PlatformInit(void); - -/*************************************************************************************************/ -/*! - * \brief Hardware initialization for controller operation. - * - * \return None. - */ -/*************************************************************************************************/ -void PlatformInitControllerHardware(void); - -/*************************************************************************************************/ -/*! - * \brief Hardware initialization for host operation. - * - * \return None. - */ -/*************************************************************************************************/ -void PlatformInitHostHardware(void); - -/*************************************************************************************************/ -/*! - * \brief Hardware initialization for controller operation. - * - * \return None. - */ -/*************************************************************************************************/ -void PlatformInitBootloaderHardware(void); - -/*************************************************************************************************/ -/*! - * \brief Initialize Dual Chip LL - * - * \return None - * - * \note Initilization that takes place after WsfBufInit is performed here - */ -/*************************************************************************************************/ -void PlatformInitDualChip(void); - -/* Bootloader */ -/*************************************************************************************************/ -/*! - * \brief Execute application from RAM. - * - * \return None. - * - * \note This routine does not return. - */ -/*************************************************************************************************/ -void PlatformExecApplication(void); - -/* Memory */ -/*************************************************************************************************/ -/*! - * \brief Get memory regions. - * - * \param pCodeMemAddr If non-NULL, return starting address of code memory. - * \param pCodeMemSize If non-NULL, return size of code memory. - * \param pDataMemAddr If non-NULL, return starting address of data memory. - * \param pDataMemSize If non-NULL, return size of data memory. - * - * \return None. - */ -/*************************************************************************************************/ -void PlatformGetMemoryRegions(uint32_t *pCodeMemAddr, uint32_t *pCodeMemSize, - uint32_t *pDataMemAddr, uint32_t *pDataMemSize); - -/*************************************************************************************************/ -/*! - * \brief Get code memory region used by ROM bootloader. - * - * \param pCodeMemAddr If non-NULL, return starting address of code memory. - * \param pCodeMemSize If non-NULL, return size of code memory. - * - * \return None. - */ -/*************************************************************************************************/ -void PlatformGetBootRegions(uint32_t *pCodeMemAddr, uint32_t *pCodeMemSize); - -/*************************************************************************************************/ -/*! - * \brief Count stack usage. - * - * \return Stack high watermark in bytes. - */ -/*************************************************************************************************/ -uint32_t PlatformCountStackUsage(void); - -/*************************************************************************************************/ -/*! - * \brief Get heap available. - * - * \return Number of bytes of heap memory available. - */ -/*************************************************************************************************/ -uint32_t PlatformGetHeapAvailable(void); - -/*************************************************************************************************/ -/*! - * \brief Get heap used. - * - * \return Number of bytes of heap memory used. - */ -/*************************************************************************************************/ -uint32_t PlatformGetHeapUsed(void); - -/*************************************************************************************************/ -/*! - * \brief Reserve heap memory. - * - * \param size Number of bytes of heap memory used. - * - * \return None - */ -/*************************************************************************************************/ -void PlatformReserveHeap(uint32_t size); - -/*************************************************************************************************/ -/*! - * \brief Get next available heap memory. - * - * \return Address of the start of heap memory. - */ -/*************************************************************************************************/ -void *PlatformGetHeapStart(void); - -/* Configuration */ -/*************************************************************************************************/ -/*! - * \brief Load BB timing configuration. - * - * \param pCfg Return configuration values. - * - * \return None. - */ -/*************************************************************************************************/ -void PlatformLoadBbConfig(PlatformBbCfg_t *pCfg); - -/* Power Management */ -/*************************************************************************************************/ -/*! - * \brief Register sleep callback functions. - * - * \param protId Protocol ID. - * \param statusCback Callback function for checking status - * \param enterCback Callback function before entering sleep. - * \param exitCback Callback function after exiting sleep. - * - * \return None. - */ -/*************************************************************************************************/ -void PlatformRegisterSleep(uint8_t protId, PlatformStatus_t statusCback, PlatformSleepEnter_t enterCback, PlatformSleepExit_t exitCback); - -/*************************************************************************************************/ -/*! - * \brief Set Sleep mode. - * - * \param sleepMode Deep sleep or shallow sleep. - * - * \return None. - */ -/*************************************************************************************************/ -void PlatformSetSleepMode(uint8_t sleepMode); - -/*************************************************************************************************/ -/*! - * \brief Function for checking if there is an active timer and if there is enough time to - * go to sleep and going to sleep. - * - * \return None. - */ -/*************************************************************************************************/ -void PlatformTimeSleep(void); - -/*************************************************************************************************/ -/*! - * \brief Function for updating WSF timer based on elapsed RTC ticks. - * - * \return None. - */ -/*************************************************************************************************/ -void PlatformTimeUpdate(void); - -/* Version */ -/*************************************************************************************************/ -/*! - * \brief Get the hardware version code. - * - * \param id Version ID. - * \param pCode Hardware version code. - * - * \return TRUE if version code valid, FALSE otherwise. - * - * Interrogate the hardware for its version code. - */ -/*************************************************************************************************/ -bool_t PlatformGetVersionCode(PlatformVersionId_t id, uint32_t *pCode); - -#endif /* PLATFORM_API_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/platform_ble_api.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/platform_ble_api.h deleted file mode 100644 index ca7b532fda..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/platform_ble_api.h +++ /dev/null @@ -1,101 +0,0 @@ -/* Copyright (c) 2009-2019 Arm Limited - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************************************/ -/*! - * \brief Platform interface file: ble-specific. - */ -/*************************************************************************************************/ - -#ifndef PLATFORM_BLE_API_H -#define PLATFORM_BLE_API_H - -#include "wsf_types.h" - -/************************************************************************************************** - Type Definitions -**************************************************************************************************/ - -/*! \brief LL configuration. */ -typedef struct -{ - /* Advertiser */ - uint8_t maxAdvSets; /*!< Maximum number of advertising sets. */ - uint8_t maxAdvReports; /*!< Maximum number of pending legacy or extended advertising reports. */ - uint16_t maxExtAdvDataLen; /*!< Maximum extended advertising data size. */ - uint8_t defExtAdvDataFragLen; /*!< Default extended advertising data fragmentation size. */ - uint32_t auxDelayUsec; /*!< Additional Auxiliary Offset delay above T_MAFS in microseconds. */ - /* Scanner */ - uint8_t maxScanReqRcvdEvt; /*!< Maximum scan request received events. */ - uint16_t maxExtScanDataLen; /*!< Maximum extended scan data size. */ - /* Connection */ - uint8_t maxConn; /*!< Maximum number of connections. */ - uint8_t numTxBufs; /*!< Default number of transmit buffers. */ - uint8_t numRxBufs; /*!< Default number of receive buffers. */ - uint16_t maxAclLen; /*!< Maximum ACL buffer size. */ - int8_t defTxPwrLvl; /*!< Default Tx power level for connections. */ - uint8_t ceJitterUsec; /*!< Allowable CE jitter on a slave (account for master's sleep clock resolution). */ - /* DTM */ - uint16_t dtmRxSyncMs; /*!< DTM Rx synchronization window in milliseconds. */ -} PlatformLlCfg_t; - -/************************************************************************************************** - Global Variables -**************************************************************************************************/ - -/************************************************************************************************** - Function Declarations -**************************************************************************************************/ - -/* Configuration */ -/*************************************************************************************************/ -/*! - * \brief Get PHY feature configuration. - * - * \param pPhy2mSup 2M PHY supported. - * \param pPhyCodedSup Coded PHY supported. - * \param pStableModIdxTxSup Tx stable modulation index supported. - * \param pStableModIdxRxSup Rx stable modulation index supported. - * - * \return None. - */ -/*************************************************************************************************/ -void PlatformGetBlePhyFeatures(bool_t *pPhy2mSup, bool_t *pPhyCodedSup, - bool_t *pStableModIdxTxSup, bool_t *pStableModIdxRxSup); - -/*************************************************************************************************/ -/*! - * \brief Load LL advertising configuration. - * - * \param pCfg Return configuration values. - * - * \return None. - */ -/*************************************************************************************************/ -void PlatformLoadLlConfig(PlatformLlCfg_t *pCfg); - -/*************************************************************************************************/ -/*! - * \brief Load device Bluetooth device address. - * - * \param pDevAddr Bluetooth device address. - * - * \return None. - */ -/*************************************************************************************************/ -void PlatformLoadBdAddress(uint8_t *pDevAddr); - -#endif /* PLATFORM_BLE_API_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/radio_drv.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/radio_drv.h deleted file mode 100644 index d14268a7f1..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/include/radio_drv.h +++ /dev/null @@ -1,320 +0,0 @@ -/* Copyright (c) 2009-2019 Arm Limited - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************************************/ -/*! - * \brief Radio driver interface file. - */ -/*************************************************************************************************/ - -#ifndef RADIO_DRV_H -#define RADIO_DRV_H - -#include "wsf_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/************************************************************************************************** - Data Types -**************************************************************************************************/ - -/*! \brief Operation types. */ -enum -{ - RADIO_DRV_BLE_OP_TEST_TX, /*!< Continuous Tx test mode. */ - RADIO_DRV_BLE_OP_TEST_RX, /*!< Continuous Rx test mode. */ - RADIO_DRV_BLE_OP_MST_ADV_EVENT, /*!< Master advertising event. */ - RADIO_DRV_BLE_OP_SLV_ADV_EVENT, /*!< Slave advertising event. */ - RADIO_DRV_BLE_OP_MST_CONN_EVENT, /*!< Master connection event. */ - RADIO_DRV_BLE_OP_SLV_CONN_EVENT, /*!< Slave connection event. */ - RADIO_DRV_15P4_EVENT /*!< 15P4 event. */ -}; - -/*! \brief Radio timing. */ -typedef struct -{ - uint32_t txOnLatency; /*!< Latency between radio on signal and transmit. */ - uint32_t rxOnLatency; /*!< Latency between radio on signal and receive. */ - uint32_t txDataPathLatency; /*!< Transmit data path latency. */ - uint32_t rxDataPathLatency; /*!< Receive data path latency. */ -} RadioDrvTiming_t; - -/*! \brief Abort callback. */ -typedef void (*RadioDrvAbortCback_t)(void); - -/************************************************************************************************** - Function Declarations -**************************************************************************************************/ - -/*************************************************************************************************/ -/*! - * \brief Handle radio configuration. - * - * \param len Length of configuration data, in octets. - * \param pCfg Configuration data. - * - * \return TRUE if radio configuration was handled. - * - * The data block pCfg is only valid during the execution of this function, so configuration - * data must be stored or copied. - */ -/*************************************************************************************************/ -bool_t RadioDrvCfgHandler(uint16_t len, const uint8_t *pCfg); - -/*************************************************************************************************/ -/*! - * \brief Set radio configuration values. - * - * \param len Length of configuration data, in octets. - * \param pCfg Configuration data. - * - * \return TRUE if radio configuration was handled. - * - * The data block pCfg is only valid during the execution of this function, so configuration - * data must be stored or copied. - */ -/*************************************************************************************************/ -bool_t RadioDrvSetConfiguration(uint16_t len, const uint8_t *pCfg); - -/*************************************************************************************************/ -/*! - * \brief Initialize the BB radio. - * - * \return None. - * - * Initialization occurs once upon startup of MAC-layer software to load trim, calibrate clocks, - * or perform any other one-time operations. - */ -/*************************************************************************************************/ -void RadioDrvInit(void); - -/*************************************************************************************************/ -/*! - * \brief Get timing parameters for radio. - * - * \param pTiming Storage for timing parameters. - * - * \return None. - */ -/*************************************************************************************************/ -void RadioDrvGetTiming(RadioDrvTiming_t *pTiming); - -/*************************************************************************************************/ -/*! - * \brief Get supported transmit power levels. - * - * \param pMinTxPwr Storage for minimum transmit power (expressed in 1dBm units). - * \param pMaxTxPwr Storage for maximum transmit power (expressed in 1dBm units). - * - * \return None. - */ -/*************************************************************************************************/ -void RadioDrvGetSupTxPower(int8_t *pMinTxPwr, int8_t *pMaxTxPwr); - -/*************************************************************************************************/ -/*! - * \brief Get the actual Tx power at the antenna (expressed in 1dBm units). - * - * \param txPwr Tx power provided by the host (expressed in 1dBm units). - * - * \return Actual Tx power at the antenna (expressed in 1dBm units). - */ -/*************************************************************************************************/ -int8_t RadioDrvGetActualTxPower(int8_t txPwr); - -/*************************************************************************************************/ -/*! - * \brief Get the radio version. - * - * \param pVerCode Version code return value. - * - * \return None. - */ -/*************************************************************************************************/ -void RadioDrvGetVersion(uint32_t *pVerCode); - -/*************************************************************************************************/ -/*! - * \brief Set abort callback. - * - * \param cback Abort callback. - * - * \return None. - * - * If the abort callback is called after RadioDrvStartTx() or RadioDrvStartRx() but before - * RadioDrvStop(), the BB will abort the current operation. Otherwise, the function is ignored. - * - * The BB will set the callback to NULL to clear the callback. - */ -/*************************************************************************************************/ -void RadioDrvSetAbortCback(RadioDrvAbortCback_t cback); - -/*************************************************************************************************/ -/*! - * \brief Enable the BB radio. - * - * \return None. - * - * The radio should be enabled, possibly after leaving sleep. The XTAL warmup must be started, but - * no radio operation will be attempted for xtalWarmup time, when the XTAL must be ready. - */ -/*************************************************************************************************/ -void RadioDrvEnable(void); - -/*************************************************************************************************/ -/*! - * \brief Disable the BB radio. - * - * \return None. - * - * The radio should be disabled, possibly before entering sleep. Any ongoing transmit or receive - * should be stopped. The XTAL may be disabled. - */ -/*************************************************************************************************/ -void RadioDrvDisable(void); - -/*************************************************************************************************/ -/*! - * \brief Set RF Debug Mode. - * - * \param ddmSetting DDM mode for different modules. - * \param ddmDir DDM mode direction. - * \param peripheralSetting RF setting for debug mode. - * \param peripheralDir RX or TX. - * - * \return bool_t TRUE if handled here. - */ -/*************************************************************************************************/ -bool_t RadioDrvSetDdm(uint32_t ddmSetting, uint32_t ddmDir, uint32_t peripheralSetting, uint32_t peripheralDir); - -/*************************************************************************************************/ -/*! - * \brief Wait until radio is in idle state. - * - * \return None. - */ -/*************************************************************************************************/ -void RadioDrvWaitForIdle(void); - -/*************************************************************************************************/ -/*! - * \brief Set radio channel parameters. - * - * \param opType Operation type. - * \param rfFreq RF frequency in MHz. - * \param txPhy Transmitter PHY. - * \param rxPhy Receiver PHY. - * \param phyOptions PHY options. - * \param txPower Transmit power in dBm. - * - * \return None. - * - * The channel parameters remain active until new parameters are set, the radio is disabled, or a - * radio operation is stopped. - */ -/*************************************************************************************************/ -void RadioDrvSetChannelParam(uint8_t opType, uint16_t rfFreq, uint8_t txPhy, uint8_t rxPhy, uint8_t phyOptions, int8_t txPower); - -/*************************************************************************************************/ -/*! - * \brief Start transmitter. - * - * \return None. - * - * Prepare the transmitter, so that the warmup will begin at the radio request, with the - * modulator producing the first bit after txOnLatency. The transmitter should automatically stop - * when the transmit ends so that another transmit or a receive can be started. - */ -/*************************************************************************************************/ -void RadioDrvStartTx(void); - -/*************************************************************************************************/ -/*! - * \brief Start receiver. - * - * \return None. - * - * Prepare the receiver, so that warmup will begin at the radio request, with the demodulator - * expecting the first bit after rxOnLatency. The receiver should automatically stop when the - * receive ends so that another recieve or a transmit can be started. - */ -/*************************************************************************************************/ -void RadioDrvStartRx(void); - -/*************************************************************************************************/ -/*! - * \brief Start transmitter in continuous mode. - * - * \return None. - * - * Start the transmitter immediately and stay on indefinitely. - */ -/*************************************************************************************************/ -void RadioDrvStartContinuousTx(void); - -/*************************************************************************************************/ -/*! - * \brief Start receiver in continuous mode. - * - * \return None. - * - * Start the receiver immediately and stay on indefinitely. - */ -/*************************************************************************************************/ -void RadioDrvStartContinuousRx(void); - -/*************************************************************************************************/ -/*! - * \brief Stop transmitter or receiver. - * - * \return None. - */ -/*************************************************************************************************/ -void RadioDrvStop(void); - -/*************************************************************************************************/ -/*! - * \brief Radio driver set PMU and clk. - * - * \return None. - */ -/*************************************************************************************************/ -void RadioDrvSetPMUClk(void); - -/*************************************************************************************************/ -/*! - * \brief Fill the buffer with random bytes - * - * \param pBufferRandom Pointer to buffer - * \param numRandomBytes Number of bytes to write - * - * \return None. - * - * \note Because this function takes manual control of the radio it cannot be used when - * the radio is, or might become active. Typically this function will only be used - * during boot time to provide random numbers that are used for initialising other - * parts of the system. - */ -/*************************************************************************************************/ -void RadioDrvGetRandomBytes(uint8_t *pBufferRandom, uint8_t numRandomBytes); - -#ifdef __cplusplus -}; -#endif - -#endif /* RADIO_DRV_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/chci/chci_tr.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/chci/chci_tr.c deleted file mode 100644 index f0b153b19a..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/chci/chci_tr.c +++ /dev/null @@ -1,252 +0,0 @@ -/* Copyright (c) 2009-2019 Arm Limited - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************************************/ -/*! - * \brief Controller HCI transport module implementation file. - */ -/*************************************************************************************************/ - -#include "chci_tr.h" -#include "chci_drv.h" -#include "chci_api.h" -#include "hci_defs.h" -#include "wsf_assert.h" -#include "wsf_msg.h" -#include "wsf_os.h" -#include "util/bstream.h" -#include - -/************************************************************************************************** - Data Types -**************************************************************************************************/ - -/*! \brief Transport control block. */ -typedef struct -{ - wsfHandlerId_t handlerId; /*!< Handler ID. */ - uint8_t *pDataPending; /*!< Data packet in progress. */ - uint8_t typePending; /*!< Data type in progress. */ - uint8_t protPending; /*!< Protocol in progress. */ - uint8_t nextAvailMask; /*!< Next available mask. */ - - ChciTrSendHwErrorCback_t sendHwErrorCback; /*!< Send HW error callback. */ - - struct - { - ChciTrRecvCback_t recvCback; /*!< Message received callback. */ - ChciTrSendCompleteCback_t sendCompleteCback; /*!< Message send complete callback. */ - ChciTrServiceCback_t serviceCback; /*!< Service callback. */ - } protCbacks[CHCI_TR_PROT_NUM]; /*!< Callback array indexed by protocol ID. */ -} chciTrCtrlBlk_t; - -/*! \brief Send handler. */ -typedef void (*chciTrSendHandler_t)(uint8_t *pBuf); - -/*! \brief Transport events. */ -enum -{ - CHCI_TR_EVT_SEND_CMPL = (1 << 0) /*!< Send complete. */ -}; - - -/************************************************************************************************** - Global Variables -**************************************************************************************************/ - -/*! \brief Current event data in progress. */ -chciTrCtrlBlk_t chciTrCb; - -/*************************************************************************************************/ -/*! - * \brief Initialize the transport handler. - * - * \param handlerId Handler ID. - * - * \return None. - */ -/*************************************************************************************************/ -void ChciTrHandlerInit(wsfHandlerId_t handlerId) -{ - memset(&chciTrCb, 0, sizeof(chciTrCb)); - chciTrCb.handlerId = handlerId; - - chciDrvInit(); -} - -/*************************************************************************************************/ -/*! - * \brief Controller HCI transport message dispatch handler. - * - * \param event WSF event. - * \param pMsg WSF message. - * - * \return None. - */ -/*************************************************************************************************/ -void ChciTrHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg) -{ - if (chciTrCb.pDataPending == NULL) - { - uint8_t protCount = 0; - uint8_t prot = chciTrCb.protPending; /* last protocol serviced */ - - do - { - uint8_t type = 0; - uint8_t *pData = NULL; - uint16_t len = 0; - - prot = (prot + 1 >= CHCI_TR_PROT_NUM) ? 0 : (prot + 1); - - if ((chciTrCb.protCbacks[prot].serviceCback != NULL) && - chciTrCb.protCbacks[prot].serviceCback(&type, &len, &pData)) - { - chciTrCb.pDataPending = pData; - chciTrCb.typePending = type; - chciTrCb.protPending = prot; - - if (chciDrvWrite(prot, type, len, pData) >= len) - { - chciTrSendComplete(); - } - break; - } - } while (++protCount < CHCI_TR_PROT_NUM); - } -} - -/*************************************************************************************************/ -/*! - * \brief Set callbacks for a protocol. - * - * \param prot Protocol. - * \param recvCback Message received callback. - * \param sendCompleteCback Message send complete callback. - * \param serviceCback Service callback. - * - * \return None. - */ -/*************************************************************************************************/ -void ChciTrSetCbacks(uint8_t prot, ChciTrRecvCback_t recvCback, ChciTrSendCompleteCback_t sendCompleteCback, - ChciTrServiceCback_t serviceCback) -{ - if (prot < CHCI_TR_PROT_NUM) - { - chciTrCb.protCbacks[prot].recvCback = recvCback; - chciTrCb.protCbacks[prot].sendCompleteCback = sendCompleteCback; - chciTrCb.protCbacks[prot].serviceCback = serviceCback; - } -} - -/*************************************************************************************************/ -/*! - * \brief Set send hardware error callback. - * - * \param sendHwErrorCback Send hardware error callback. - * - * \return None. - */ -/*************************************************************************************************/ -void ChciTrSetSendHwErrorCback(ChciTrSendHwErrorCback_t sendHwErrorCback) -{ - chciTrCb.sendHwErrorCback = sendHwErrorCback; -} - -/*************************************************************************************************/ -/*! - * \brief Flag protocol for needing service. - * - * \param prot Protocol. - * - * \return None. - */ -/*************************************************************************************************/ -void ChciTrNeedsService(uint8_t prot) -{ - if (chciTrCb.pDataPending == NULL) - { - ChciTrHandler(CHCI_TR_EVT_SEND_CMPL, NULL); - } -} - -/*************************************************************************************************/ -/*! - * \brief Signal the completion of a message write. - * - * \return None. - * - * This routine is used for asynchronous write operations. When the driver has completed the - * use of the write buffer, this routine is called to free the buffer and release flow control. - */ -/*************************************************************************************************/ -void chciTrSendComplete(void) -{ - uint8_t *pBuf = chciTrCb.pDataPending; - uint8_t type = chciTrCb.typePending; - uint8_t prot = chciTrCb.protPending; - - WSF_ASSERT(chciTrCb.protCbacks[prot].sendCompleteCback != NULL); - - /* Protocol will free buffer. */ - chciTrCb.pDataPending = NULL; - chciTrCb.protCbacks[prot].sendCompleteCback(type, pBuf); - WsfSetEvent(chciTrCb.handlerId, CHCI_TR_EVT_SEND_CMPL); -} - -/*************************************************************************************************/ -/*! - * \brief Signal the completion of a message receive. - * - * \param prot Protocol. - * \param type Message type. - * \param pBuf Message. - * - * \return None. - */ -/*************************************************************************************************/ -void chciTrRecv(uint8_t prot, uint8_t type, uint8_t *pBuf) -{ - if (prot < CHCI_TR_PROT_NUM) - { - if (chciTrCb.protCbacks[prot].recvCback != NULL) - { - /* Protocol will free buffer. */ - chciTrCb.protCbacks[prot].recvCback(type, pBuf); - return; - } - } - - /* Free buffer that cannot be handled. */ - WsfMsgFree(pBuf); -} - -/*************************************************************************************************/ -/*! - * \brief Signal a hardware error. - * - * \param code Error code. - * - * \return None. - */ -/*************************************************************************************************/ -void chciTrHwError(uint8_t code) -{ - if (chciTrCb.sendHwErrorCback != NULL) - { - chciTrCb.sendHwErrorCback(code); - } -} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/chci/chci_tr_serial.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/chci/chci_tr_serial.c deleted file mode 100644 index f3707730cb..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/chci/chci_tr_serial.c +++ /dev/null @@ -1,205 +0,0 @@ -/* Copyright (c) 2009-2019 Arm Limited - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************************************/ -/*! - * \brief Controller HCI serial transport module implementation file. - */ -/*************************************************************************************************/ - -#include "chci_api.h" -#include "chci_tr.h" -#include "chci_tr_serial.h" -#include "hci_defs.h" -#include "wsf_assert.h" -#include "wsf_msg.h" -#include "util/bstream.h" -#include - -/************************************************************************************************** - Macros -**************************************************************************************************/ - -/*! \brief Maximum HCI header size. */ -#define LHCI_HDR_LEN_MAX HCI_ACL_HDR_LEN - -/************************************************************************************************** - Data Types -**************************************************************************************************/ - -/*! \brief Receive state. */ -typedef enum -{ - CHCI_RX_STATE_IDLE, /*!< Idle state. */ - CHCI_RX_STATE_HEADER, /*!< Header parse state. */ - CHCI_RX_STATE_DATA, /*!< Data parse state. */ - CHCI_RX_STATE_COMPLETE /*!< Complete state. */ -} chciRxState_t; - -/*************************************************************************************************/ -/*! - * \brief Receive function. Gets called by external code when bytes are received. - * - * \param pBuf Pointer to buffer of incoming bytes. - * \param len Number of bytes in incoming buffer. - * - * \return None. - */ -/*************************************************************************************************/ -void chciTrSerialRxIncoming(uint8_t *pBuf, uint8_t len) -{ - static uint8_t stateRx = CHCI_RX_STATE_IDLE; - static uint8_t pktRx; - static uint16_t iRx; - static uint8_t hdrRx[LHCI_HDR_LEN_MAX]; - static uint8_t *pPktRx; - static uint8_t *pDataRx; - - uint8_t dataByte; - - /* loop until all bytes of incoming buffer are handled */ - while (len--) - { - /* read single byte from incoming buffer and advance to next byte */ - dataByte = *pBuf++; - - /* --- Idle State --- */ - if (stateRx == CHCI_RX_STATE_IDLE) - { - switch (dataByte) - { - case HCI_CMD_TYPE: - case HCI_ACL_TYPE: - /* save the packet type */ - pktRx = dataByte; - iRx = 0; - stateRx = CHCI_RX_STATE_HEADER; - break; - - default: - /* invalid byte received */ - chciTrHwError(CHCI_TR_CODE_INVALID_DATA); - break; - } - } - - /* --- Header State --- */ - else if (stateRx == CHCI_RX_STATE_HEADER) - { - uint8_t hdrLen = 0; - uint16_t dataLen = 0; - - /* copy current byte into the temp header buffer */ - hdrRx[iRx++] = dataByte; - - /* determine header length based on packet type */ - switch (pktRx) - { - case HCI_CMD_TYPE: - hdrLen = HCI_CMD_HDR_LEN; - break; - case HCI_ACL_TYPE: - hdrLen = HCI_ACL_HDR_LEN; - break; - default: - break; - } - - /* see if entire header has been read */ - if (iRx == hdrLen) - { - /* extract data length from header */ - switch (pktRx) - { - case HCI_CMD_TYPE: - dataLen = hdrRx[2]; - break; - case HCI_ACL_TYPE: - BYTES_TO_UINT16(dataLen, &hdrRx[2]); - break; - default: - break; - } - - /* allocate data buffer to hold entire packet */ - if ((pPktRx = (uint8_t *)WsfMsgAlloc(hdrLen + dataLen + CHCI_BUF_TAILROOM)) != NULL) - { - memcpy(pPktRx, hdrRx, hdrLen); - - pDataRx = pPktRx + hdrLen; - - /* save number of bytes left to read */ - iRx = dataLen; - if (iRx == 0) - { - stateRx = CHCI_RX_STATE_COMPLETE; - } - else - { - stateRx = CHCI_RX_STATE_DATA; - } - } - else - { - /* allocate failed */ - chciTrHwError(CHCI_TR_CODE_OUT_OF_MEMORY); - - /* reset state machine */ - stateRx = CHCI_RX_STATE_IDLE; - continue; - } - } - } - - /* --- Data State --- */ - else if (stateRx == CHCI_RX_STATE_DATA) - { - /* write incoming byte to allocated buffer */ - *pDataRx++ = dataByte; - - /* determine if entire packet has been read */ - iRx--; - if (iRx == 0) - { - stateRx = CHCI_RX_STATE_COMPLETE; - } - } - - /* --- Complete State --- */ - /* ( Note Well! There is no else-if construct by design. ) */ - if (stateRx == CHCI_RX_STATE_COMPLETE) - { - /* deliver data */ - if (pPktRx != NULL) - { - switch (pktRx) - { - case HCI_CMD_TYPE: - chciTrRecv(CHCI_TR_PROT_BLE, CHCI_TR_TYPE_CMD, pPktRx); - break; - case HCI_ACL_TYPE: - chciTrRecv(CHCI_TR_PROT_BLE, CHCI_TR_TYPE_DATA, pPktRx); - break; - default: - break; - } - } - - /* reset state machine */ - stateRx = CHCI_RX_STATE_IDLE; - } - } -} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/ll/ll_math_ecc.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/ll/ll_math_ecc.c deleted file mode 100644 index 7d8c8c228b..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/platform/common/sources/ll/ll_math_ecc.c +++ /dev/null @@ -1,269 +0,0 @@ -/* Copyright (c) 2009-2019 Arm Limited - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*************************************************************************************************/ -/*! - * \brief ECC math utilities implementation file. - */ -/*************************************************************************************************/ - -#include - -#include "bb_ble_drv.h" -#include "ll_math.h" -#include "ll_defs.h" -#include "wsf_assert.h" - -#include "uECC_ll.h" - -/************************************************************************************************** - Variables -**************************************************************************************************/ - -/*! \brief ECC service callback. */ -static LlMathEccServiceCback_t llMathEccServiceCback = NULL; - -/*************************************************************************************************/ -/*! - * \brief Random number generator used by uECC. - * - * \param pDest Buffer to hold random number - * \param size Size of pDest in bytes . - * - * \return TRUE if successful. - */ -/*************************************************************************************************/ -static int llMathEccRng(uint8_t *pDest, unsigned size) -{ - BbBleDrvRand(pDest, size); - - return TRUE; -} - -/*************************************************************************************************/ -/*! - * \brief Copy octets to another buffer, reversing order. - * - * \param pDest Destination buffer. - * \param pSrc Source buffer. - * \param len Length of data, in octets. - * - * \return None. - */ -/*************************************************************************************************/ -static void llMathEccReverseCopy(uint8_t *pDest, const uint8_t *pSrc, uint16_t len) -{ - pSrc += len - 1; - while (len-- > 0) - { - *pDest++ = *pSrc--; - } -} - -/*************************************************************************************************/ -/*! - * \brief Reverse order of octets in buffer. - * - * \param p Buffer. - * \param len Length of data, in octets. - * - * \return None. - */ -/*************************************************************************************************/ -static void llMathEccReverse(uint8_t *p, uint16_t len) -{ - uint8_t *pStart = p; - uint8_t *pEnd = p + len - 1; - uint8_t temp; - - len /= 2; - while (len-- > 0) - { - temp = *pStart; - *pStart++ = *pEnd; - *pEnd-- = temp; - } -} - -/*************************************************************************************************/ -/*! - * \brief Set service callback for ECC generation. - * - * \param cback Callback to invoke when driver needs servicing. - * - * \return None. - */ -/*************************************************************************************************/ -void LlMathEccSetServiceCback(LlMathEccServiceCback_t cback) -{ - llMathEccServiceCback = cback; -} - -/*************************************************************************************************/ -/*! - * \brief Start generating P-256 key pair. - * - * \return None. - */ -/*************************************************************************************************/ -void LlMathEccGenerateP256KeyPairStart(void) -{ - uint8_t privKey[LL_ECC_KEY_LEN]; - - WSF_ASSERT(llMathEccServiceCback != NULL); - - /* Generate private key. */ - llMathEccRng(privKey, sizeof(privKey)); - - /* Start public key generation. */ - uECC_set_rng(llMathEccRng); - uECC_make_key_start(privKey); - - llMathEccServiceCback(LL_MATH_ECC_OP_GENERATE_P256_KEY_PAIR); -} - -/*************************************************************************************************/ -/*! - * \brief Start generating P-256 public key with a specified private key. - * - * \param pPrivKey Private key. - * - * \return None. - */ -/*************************************************************************************************/ -void LlMathEccGenerateP256PublicKeyStart(const uint8_t *pPrivKey) -{ - uint8_t privKey[LL_ECC_KEY_LEN]; - - WSF_ASSERT(llMathEccServiceCback != NULL); - - /* Reverse private key (to big endian). */ - llMathEccReverseCopy(privKey, pPrivKey, LL_ECC_KEY_LEN); - - /* Start public key generation. */ - uECC_set_rng(llMathEccRng); - uECC_make_key_start(privKey); - - llMathEccServiceCback(LL_MATH_ECC_OP_GENERATE_P256_KEY_PAIR); -} - -/*************************************************************************************************/ -/*! - * \brief Continue generating P-256 key pair. - * - * \return TRUE if key generation complete. - */ -/*************************************************************************************************/ -bool_t LlMathEccGenerateP256KeyPairContinue(void) -{ - WSF_ASSERT(llMathEccServiceCback != NULL); - - if (uECC_make_key_continue()) - { - return TRUE; - } - - llMathEccServiceCback(LL_MATH_ECC_OP_GENERATE_P256_KEY_PAIR); - return FALSE; -} - -/*************************************************************************************************/ -/*! - * \brief Get results from generating P-256 key pair. - * - * \param pPubKey Storage for public key. - * \param pPrivKey Storage for private key. - * - * \return None. - */ -/*************************************************************************************************/ -void LlMathEccGenerateP256KeyPairComplete(uint8_t *pPubKey, uint8_t *pPrivKey) -{ - /* Complete key generation. */ - uECC_make_key_complete(pPubKey, pPrivKey); - - /* Reverse keys (to little endian). */ - llMathEccReverse(pPubKey, LL_ECC_KEY_LEN); - llMathEccReverse(pPubKey + LL_ECC_KEY_LEN, LL_ECC_KEY_LEN); - llMathEccReverse(pPrivKey, LL_ECC_KEY_LEN); -} - -/*************************************************************************************************/ -/*! - * \brief Start generating Diffie-Hellman key. - * - * \param pPubKey Public key. - * \param pPrivKey Private key. - * - * \return None. - */ -/*************************************************************************************************/ -void LlMathEccGenerateDhKeyStart(const uint8_t *pPubKey, const uint8_t *pPrivKey) -{ - uint8_t pubKey[LL_ECC_KEY_LEN * 2]; - uint8_t privKey[LL_ECC_KEY_LEN]; - - WSF_ASSERT(llMathEccServiceCback != NULL); - - /* Reverse keys (to big endian). */ - llMathEccReverseCopy(pubKey, pPubKey, LL_ECC_KEY_LEN); - llMathEccReverseCopy(pubKey + LL_ECC_KEY_LEN, pPubKey + LL_ECC_KEY_LEN, LL_ECC_KEY_LEN); - llMathEccReverseCopy(privKey, pPrivKey, LL_ECC_KEY_LEN); - - /* Start shared secret generation. */ - uECC_set_rng(llMathEccRng); - uECC_shared_secret_start(pubKey, privKey); - - llMathEccServiceCback(LL_MATH_ECC_OP_GENERATE_DH_KEY); -} - -/*************************************************************************************************/ -/*! - * \brief Continue generating Diffie-Hellman key. - * - * \return TRUE if Diffie-Hellman key generation complete. - */ -/*************************************************************************************************/ -bool_t LlMathEccGenerateDhKeyContinue(void) -{ - WSF_ASSERT(llMathEccServiceCback != NULL); - - if (uECC_shared_secret_continue()) - { - return TRUE; - } - - llMathEccServiceCback(LL_MATH_ECC_OP_GENERATE_DH_KEY); - return FALSE; -} - -/*************************************************************************************************/ -/*! - * \brief Get results from generating Diffie-Hellman key. - * - * \param pDhKey Storage for Diffie-Hellman key. - * - * \return None. - */ -/*************************************************************************************************/ -void LlMathEccGenerateDhKeyComplete(uint8_t *pDhKey) -{ - /* Complete shared secret generation. */ - uECC_shared_secret_complete(pDhKey); - - /* Reverse shared secret (to little endian). */ - llMathEccReverse(pDhKey, LL_ECC_KEY_LEN); -} diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/boards/arduino_primo.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/nordic-bsp/components/boards/arduino_primo.h similarity index 89% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/boards/arduino_primo.h rename to features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/nordic-bsp/components/boards/arduino_primo.h index 00c0390977..07fe47950c 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/boards/arduino_primo.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/nordic-bsp/components/boards/arduino_primo.h @@ -1,30 +1,30 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA - * + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA + * * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. - * + * * 2. Redistributions in binary form, except as embedded into a Nordic * Semiconductor ASA integrated circuit in a product or a software update for * such product, must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - * + * * 3. Neither the name of Nordic Semiconductor ASA nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. - * + * * 4. This software, with or without modification, must only be used with a * Nordic Semiconductor ASA integrated circuit. - * + * * 5. Any software provided in binary form under this license must not be reverse * engineered, decompiled, modified and/or disassembled. - * + * * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -35,7 +35,7 @@ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * */ #ifndef ARDUINO_PRIMO_H #define ARDUINO_PRIMO_H @@ -105,12 +105,6 @@ extern "C" { #define ARDUINO_A4_PIN 30 // Analog channel 4 #define ARDUINO_A5_PIN 31 // Analog channel 5 -// Low frequency clock source to be used by the SoftDevice -#define NRF_CLOCK_LFCLKSRC {.source = NRF_CLOCK_LF_SRC_XTAL, \ - .rc_ctiv = 0, \ - .rc_temp_ctiv = 0, \ - .xtal_accuracy = NRF_CLOCK_LF_XTAL_ACCURACY_20_PPM} - #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/boards/boards.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/nordic-bsp/components/boards/boards.c similarity index 68% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/boards/boards.c rename to features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/nordic-bsp/components/boards/boards.c index 511a14e84c..b438f82387 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/boards/boards.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/nordic-bsp/components/boards/boards.c @@ -1,30 +1,30 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA - * + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA + * * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. - * + * * 2. Redistributions in binary form, except as embedded into a Nordic * Semiconductor ASA integrated circuit in a product or a software update for * such product, must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - * + * * 3. Neither the name of Nordic Semiconductor ASA nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. - * + * * 4. This software, with or without modification, must only be used with a * Nordic Semiconductor ASA integrated circuit. - * + * * 5. Any software provided in binary form under this license must not be reverse * engineered, decompiled, modified and/or disassembled. - * + * * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -35,11 +35,15 @@ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * */ #include "boards.h" +#if defined(BOARDS_WITH_USB_DFU_TRIGGER) && defined(BOARD_PCA10059) +#include "nrf_dfu_trigger_usb.h" +#endif #include #include +#include "nrf_assert.h" #if LEDS_NUMBER > 0 static const uint8_t m_board_led_list[LEDS_NUMBER] = LEDS_LIST; @@ -93,8 +97,46 @@ void bsp_board_led_invert(uint32_t led_idx) nrf_gpio_pin_toggle(m_board_led_list[led_idx]); } -void bsp_board_leds_init(void) +#if defined(BOARD_PCA10059) +/** + * Function for configuring UICR_REGOUT0 register + * to set GPIO output voltage to 3.0V. + */ +static void gpio_output_voltage_setup(void) { + // Configure UICR_REGOUT0 register only if it is set to default value. + if ((NRF_UICR->REGOUT0 & UICR_REGOUT0_VOUT_Msk) == + (UICR_REGOUT0_VOUT_DEFAULT << UICR_REGOUT0_VOUT_Pos)) + { + NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen; + while (NRF_NVMC->READY == NVMC_READY_READY_Busy){} + + NRF_UICR->REGOUT0 = (NRF_UICR->REGOUT0 & ~((uint32_t)UICR_REGOUT0_VOUT_Msk)) | + (UICR_REGOUT0_VOUT_3V0 << UICR_REGOUT0_VOUT_Pos); + + NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren; + while (NRF_NVMC->READY == NVMC_READY_READY_Busy){} + + // System reset is needed to update UICR registers. + NVIC_SystemReset(); + } +} +#endif + +static void bsp_board_leds_init(void) +{ + #if defined(BOARD_PCA10059) + // If nRF52 USB Dongle is powered from USB (high voltage mode), + // GPIO output voltage is set to 1.8 V by default, which is not + // enough to turn on green and blue LEDs. Therefore, GPIO voltage + // needs to be increased to 3.0 V by configuring the UICR register. + if (NRF_POWER->MAINREGSTATUS & + (POWER_MAINREGSTATUS_MAINREGSTATUS_High << POWER_MAINREGSTATUS_MAINREGSTATUS_Pos)) + { + gpio_output_voltage_setup(); + } + #endif + uint32_t i; for (i = 0; i < LEDS_NUMBER; ++i) { @@ -133,7 +175,7 @@ bool bsp_board_button_state_get(uint32_t button_idx) return (pin_set == (BUTTONS_ACTIVE_STATE ? true : false)); } -void bsp_board_buttons_init(void) +static void bsp_board_buttons_init(void) { uint32_t i; for (i = 0; i < BUTTONS_NUMBER; ++i) @@ -163,3 +205,25 @@ uint32_t bsp_board_button_idx_to_pin(uint32_t button_idx) return m_board_btn_list[button_idx]; } #endif //BUTTONS_NUMBER > 0 + + +void bsp_board_init(uint32_t init_flags) +{ + #if defined(BOARDS_WITH_USB_DFU_TRIGGER) && defined(BOARD_PCA10059) + (void) nrf_dfu_trigger_usb_init(); + #endif + + #if LEDS_NUMBER > 0 + if (init_flags & BSP_INIT_LEDS) + { + bsp_board_leds_init(); + } + #endif //LEDS_NUMBER > 0 + + #if BUTTONS_NUMBER > 0 + if (init_flags & BSP_INIT_BUTTONS) + { + bsp_board_buttons_init(); + } + #endif //BUTTONS_NUMBER > 0 +} diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/boards/boards.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/nordic-bsp/components/boards/boards.h similarity index 79% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/boards/boards.h rename to features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/nordic-bsp/components/boards/boards.h index 87fca8023b..1ab0629c04 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/boards/boards.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/nordic-bsp/components/boards/boards.h @@ -1,30 +1,30 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA - * + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA + * * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. - * + * * 2. Redistributions in binary form, except as embedded into a Nordic * Semiconductor ASA integrated circuit in a product or a software update for * such product, must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. - * + * * 3. Neither the name of Nordic Semiconductor ASA nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. - * + * * 4. This software, with or without modification, must only be used with a * Nordic Semiconductor ASA integrated circuit. - * + * * 5. Any software provided in binary form under this license must not be reverse * engineered, decompiled, modified and/or disassembled. - * + * * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -35,12 +35,13 @@ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * */ #ifndef BOARDS_H #define BOARDS_H #include "nrf_gpio.h" +#include "nordic_common.h" #if defined(BOARD_NRF6310) #include "nrf6310.h" @@ -64,6 +65,10 @@ #include "pca10040.h" #elif defined(BOARD_PCA10056) #include "pca10056.h" +#elif defined(BOARD_PCA20020) + #include "pca20020.h" +#elif defined(BOARD_PCA10059) + #include "pca10059.h" #elif defined(BOARD_WT51822) #include "wt51822.h" #elif defined(BOARD_N5DK1) @@ -72,6 +77,8 @@ #include "d52_starterkit.h" #elif defined (BOARD_ARDUINO_PRIMO) #include "arduino_primo.h" +#elif defined (CUSTOM_BOARD_INC) + #include STRINGIFY(CUSTOM_BOARD_INC.h) #elif defined(BOARD_CUSTOM) #include "custom_board.h" #else @@ -83,6 +90,13 @@ extern "C" { #endif +/**@defgroup BSP_BOARD_INIT_FLAGS Board initialization flags. + * @{ */ +#define BSP_INIT_NONE 0 /**< No initialization of LEDs or buttons (@ref bsp_board_init).*/ +#define BSP_INIT_LEDS (1 << 0) /**< Enable LEDs during initialization (@ref bsp_board_init).*/ +#define BSP_INIT_BUTTONS (1 << 1) /**< Enable buttons during initialization (@ref bsp_board_init).*/ +/**@} */ + /** * Function for returning the state of an LED. * @@ -123,9 +137,14 @@ void bsp_board_leds_off(void); void bsp_board_leds_on(void); /** - * Function for initializing LEDs. + * Function for initializing the BSP handling for the board. + * + * @note This also initializes the USB DFU trigger library if @ref BOARDS_WITH_USB_DFU_TRIGGER is 1. + * + * @param[in] init_flags Flags specifying what to initialize (LEDs/buttons). + * See @ref BSP_BOARD_INIT_FLAGS. */ -void bsp_board_leds_init(void); +void bsp_board_init(uint32_t init_flags); /** * Function for converting pin number to LED index. @@ -154,11 +173,6 @@ uint32_t bsp_board_led_idx_to_pin(uint32_t led_idx); */ bool bsp_board_button_state_get(uint32_t button_idx); -/** - * Function for initializing buttons. - */ -void bsp_board_buttons_init(void); - /** * Function for converting pin number to button index. * @@ -187,45 +201,67 @@ uint32_t bsp_board_button_idx_to_pin(uint32_t button_idx); #define BSP_BOARD_LED_6 6 #define BSP_BOARD_LED_7 7 +#define PIN_MASK(_pin) /*lint -save -e504 */ \ + (1u << (uint32_t)((_pin) & (~P0_PIN_NUM))) \ + /*lint -restore */ + +#define PIN_PORT(_pin) (((_pin) >= P0_PIN_NUM) ? NRF_P1 : NRF_GPIO) + #ifdef BSP_LED_0 -#define BSP_LED_0_MASK (1<= 199901L + #define RESTRICT restrict +#else + #define RESTRICT +#endif + +#if defined(__clang_major__) && defined(__clang_minor__) && (defined(__SIZEOF_INT128__) || ((__clang_major__ * 100 + __clang_minor__) >= 302)) + #define SUPPORTS_INT128 1 +#else + #define SUPPORTS_INT128 0 +#endif + +#define MAX_TRIES 64 + +#if (uECC_WORD_SIZE == 1) + +typedef uint8_t uECC_word_t; +typedef uint16_t uECC_dword_t; +typedef uint8_t wordcount_t; +typedef int8_t swordcount_t; +typedef int16_t bitcount_t; +typedef int8_t cmpresult_t; + +#define HIGH_BIT_SET 0x80 +#define uECC_WORD_BITS 8 +#define uECC_WORD_BITS_SHIFT 3 +#define uECC_WORD_BITS_MASK 0x07 + +#define uECC_WORDS_1 20 +#define uECC_WORDS_2 24 +#define uECC_WORDS_3 32 +#define uECC_WORDS_4 32 +#define uECC_WORDS_5 28 + +#define uECC_N_WORDS_1 21 +#define uECC_N_WORDS_2 24 +#define uECC_N_WORDS_3 32 +#define uECC_N_WORDS_4 32 +#define uECC_N_WORDS_5 28 + +#define Curve_P_1 {0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0xFF, 0xFF} +#define Curve_P_2 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} +#define Curve_P_3 {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF} +#define Curve_P_4 {0x2F, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} +#define Curve_P_5 {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0xFF, 0xFF} + +#define Curve_B_1 {0x45, 0xFA, 0x65, 0xC5, 0xAD, 0xD4, 0xD4, 0x81, \ + 0x9F, 0xF8, 0xAC, 0x65, 0x8B, 0x7A, 0xBD, 0x54, \ + 0xFC, 0xBE, 0x97, 0x1C} +#define Curve_B_2 {0xB1, 0xB9, 0x46, 0xC1, 0xEC, 0xDE, 0xB8, 0xFE, \ + 0x49, 0x30, 0x24, 0x72, 0xAB, 0xE9, 0xA7, 0x0F, \ + 0xE7, 0x80, 0x9C, 0xE5, 0x19, 0x05, 0x21, 0x64} +#define Curve_B_3 {0x4B, 0x60, 0xD2, 0x27, 0x3E, 0x3C, 0xCE, 0x3B, \ + 0xF6, 0xB0, 0x53, 0xCC, 0xB0, 0x06, 0x1D, 0x65, \ + 0xBC, 0x86, 0x98, 0x76, 0x55, 0xBD, 0xEB, 0xB3, \ + 0xE7, 0x93, 0x3A, 0xAA, 0xD8, 0x35, 0xC6, 0x5A} +#define Curve_B_4 {0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} +#define Curve_B_5 {0xB4, 0xFF, 0x55, 0x23, 0x43, 0x39, 0x0B, 0x27, \ + 0xBA, 0xD8, 0xBF, 0xD7, 0xB7, 0xB0, 0x44, 0x50, \ + 0x56, 0x32, 0x41, 0xF5, 0xAB, 0xB3, 0x04, 0x0C, \ + 0x85, 0x0A, 0x05, 0xB4} + +#define Curve_G_1 { \ + {0x82, 0xFC, 0xCB, 0x13, 0xB9, 0x8B, 0xC3, 0x68, \ + 0x89, 0x69, 0x64, 0x46, 0x28, 0x73, 0xF5, 0x8E, \ + 0x68, 0xB5, 0x96, 0x4A}, \ + {0x32, 0xFB, 0xC5, 0x7A, 0x37, 0x51, 0x23, 0x04, \ + 0x12, 0xC9, 0xDC, 0x59, 0x7D, 0x94, 0x68, 0x31, \ + 0x55, 0x28, 0xA6, 0x23}} + +#define Curve_G_2 { \ + {0x12, 0x10, 0xFF, 0x82, 0xFD, 0x0A, 0xFF, 0xF4, \ + 0x00, 0x88, 0xA1, 0x43, 0xEB, 0x20, 0xBF, 0x7C, \ + 0xF6, 0x90, 0x30, 0xB0, 0x0E, 0xA8, 0x8D, 0x18}, \ + {0x11, 0x48, 0x79, 0x1E, 0xA1, 0x77, 0xF9, 0x73, \ + 0xD5, 0xCD, 0x24, 0x6B, 0xED, 0x11, 0x10, 0x63, \ + 0x78, 0xDA, 0xC8, 0xFF, 0x95, 0x2B, 0x19, 0x07}} + +#define Curve_G_3 { \ + {0x96, 0xC2, 0x98, 0xD8, 0x45, 0x39, 0xA1, 0xF4, \ + 0xA0, 0x33, 0xEB, 0x2D, 0x81, 0x7D, 0x03, 0x77, \ + 0xF2, 0x40, 0xA4, 0x63, 0xE5, 0xE6, 0xBC, 0xF8, \ + 0x47, 0x42, 0x2C, 0xE1, 0xF2, 0xD1, 0x17, 0x6B}, \ + {0xF5, 0x51, 0xBF, 0x37, 0x68, 0x40, 0xB6, 0xCB, \ + 0xCE, 0x5E, 0x31, 0x6B, 0x57, 0x33, 0xCE, 0x2B, \ + 0x16, 0x9E, 0x0F, 0x7C, 0x4A, 0xEB, 0xE7, 0x8E, \ + 0x9B, 0x7F, 0x1A, 0xFE, 0xE2, 0x42, 0xE3, 0x4F}} + +#define Curve_G_4 { \ + {0x98, 0x17, 0xF8, 0x16, 0x5B, 0x81, 0xF2, 0x59, \ + 0xD9, 0x28, 0xCE, 0x2D, 0xDB, 0xFC, 0x9B, 0x02, \ + 0x07, 0x0B, 0x87, 0xCE, 0x95, 0x62, 0xA0, 0x55, \ + 0xAC, 0xBB, 0xDC, 0xF9, 0x7E, 0x66, 0xBE, 0x79}, \ + {0xB8, 0xD4, 0x10, 0xFB, 0x8F, 0xD0, 0x47, 0x9C, \ + 0x19, 0x54, 0x85, 0xA6, 0x48, 0xB4, 0x17, 0xFD, \ + 0xA8, 0x08, 0x11, 0x0E, 0xFC, 0xFB, 0xA4, 0x5D, \ + 0x65, 0xC4, 0xA3, 0x26, 0x77, 0xDA, 0x3A, 0x48}} + +#define Curve_G_5 { \ + {0x21, 0x1D, 0x5C, 0x11, 0xD6, 0x80, 0x32, 0x34, \ + 0x22, 0x11, 0xC2, 0x56, 0xD3, 0xC1, 0x03, 0x4A, \ + 0xB9, 0x90, 0x13, 0x32, 0x7F, 0xBF, 0xB4, 0x6B, \ + 0xBD, 0x0C, 0x0E, 0xB7}, \ + {0x34, 0x7E, 0x00, 0x85, 0x99, 0x81, 0xD5, 0x44, \ + 0x64, 0x47, 0x07, 0x5A, 0xA0, 0x75, 0x43, 0xCD, \ + 0xE6, 0xDF, 0x22, 0x4C, 0xFB, 0x23, 0xF7, 0xB5, \ + 0x88, 0x63, 0x37, 0xBD}} + +#define Curve_N_1 {0x57, 0x22, 0x75, 0xCA, 0xD3, 0xAE, 0x27, 0xF9, \ + 0xC8, 0xF4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x01} +#define Curve_N_2 {0x31, 0x28, 0xD2, 0xB4, 0xB1, 0xC9, 0x6B, 0x14, \ + 0x36, 0xF8, 0xDE, 0x99, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} +#define Curve_N_3 {0x51, 0x25, 0x63, 0xFC, 0xC2, 0xCA, 0xB9, 0xF3, \ + 0x84, 0x9E, 0x17, 0xA7, 0xAD, 0xFA, 0xE6, 0xBC, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF} +#define Curve_N_4 {0x41, 0x41, 0x36, 0xD0, 0x8C, 0x5E, 0xD2, 0xBF, \ + 0x3B, 0xA0, 0x48, 0xAF, 0xE6, 0xDC, 0xAE, 0xBA, \ + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} +#define Curve_N_5 {0x3D, 0x2A, 0x5C, 0x5C, 0x45, 0x29, 0xDD, 0x13, \ + 0x3E, 0xF0, 0xB8, 0xE0, 0xA2, 0x16, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, \ + 0xFF, 0xFF, 0xFF, 0xFF} + +#elif (uECC_WORD_SIZE == 4) + +typedef uint32_t uECC_word_t; +typedef uint64_t uECC_dword_t; +typedef unsigned wordcount_t; +typedef int swordcount_t; +typedef int bitcount_t; +typedef int cmpresult_t; + +#define HIGH_BIT_SET 0x80000000 +#define uECC_WORD_BITS 32 +#define uECC_WORD_BITS_SHIFT 5 +#define uECC_WORD_BITS_MASK 0x01F + +#define uECC_WORDS_1 5 +#define uECC_WORDS_2 6 +#define uECC_WORDS_3 8 +#define uECC_WORDS_4 8 +#define uECC_WORDS_5 7 + +#define uECC_N_WORDS_1 6 +#define uECC_N_WORDS_2 6 +#define uECC_N_WORDS_3 8 +#define uECC_N_WORDS_4 8 +#define uECC_N_WORDS_5 7 + +#define Curve_P_1 {0x7FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF} +#define Curve_P_2 {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF} +#define Curve_P_3 {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, \ + 0x00000000, 0x00000000, 0x00000001, 0xFFFFFFFF} +#define Curve_P_4 {0xFFFFFC2F, 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, \ + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF} +#define Curve_P_5 {0x00000001, 0x00000000, 0x00000000, 0xFFFFFFFF, \ + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF} + +#define Curve_B_1 {0xC565FA45, 0x81D4D4AD, 0x65ACF89F, 0x54BD7A8B, 0x1C97BEFC} +#define Curve_B_2 {0xC146B9B1, 0xFEB8DEEC, 0x72243049, 0x0FA7E9AB, 0xE59C80E7, 0x64210519} +#define Curve_B_3 {0x27D2604B, 0x3BCE3C3E, 0xCC53B0F6, 0x651D06B0, \ + 0x769886BC, 0xB3EBBD55, 0xAA3A93E7, 0x5AC635D8} +#define Curve_B_4 {0x00000007, 0x00000000, 0x00000000, 0x00000000, \ + 0x00000000, 0x00000000, 0x00000000, 0x00000000} +#define Curve_B_5 {0x2355FFB4, 0x270B3943, 0xD7BFD8BA, 0x5044B0B7, \ + 0xF5413256, 0x0C04B3AB, 0xB4050A85} + +#define Curve_G_1 { \ + {0x13CBFC82, 0x68C38BB9, 0x46646989, 0x8EF57328, 0x4A96B568}, \ + {0x7AC5FB32, 0x04235137, 0x59DCC912, 0x3168947D, 0x23A62855}} + +#define Curve_G_2 { \ + {0x82FF1012, 0xF4FF0AFD, 0x43A18800, 0x7CBF20EB, 0xB03090F6, 0x188DA80E}, \ + {0x1E794811, 0x73F977A1, 0x6B24CDD5, 0x631011ED, 0xFFC8DA78, 0x07192B95}} + +#define Curve_G_3 { \ + {0xD898C296, 0xF4A13945, 0x2DEB33A0, 0x77037D81, \ + 0x63A440F2, 0xF8BCE6E5, 0xE12C4247, 0x6B17D1F2}, \ + {0x37BF51F5, 0xCBB64068, 0x6B315ECE, 0x2BCE3357, \ + 0x7C0F9E16, 0x8EE7EB4A, 0xFE1A7F9B, 0x4FE342E2}} + +#define Curve_G_4 { \ + {0x16F81798, 0x59F2815B, 0x2DCE28D9, 0x029BFCDB, \ + 0xCE870B07, 0x55A06295, 0xF9DCBBAC, 0x79BE667E}, \ + {0xFB10D4B8, 0x9C47D08F, 0xA6855419, 0xFD17B448, \ + 0x0E1108A8, 0x5DA4FBFC, 0x26A3C465, 0x483ADA77}} + +#define Curve_G_5 { \ + {0x115C1D21, 0x343280D6, 0x56C21122, 0x4A03C1D3, \ + 0x321390B9, 0x6BB4BF7F, 0xB70E0CBD}, \ + {0x85007E34, 0x44D58199, 0x5A074764, 0xCD4375A0, \ + 0x4C22DFE6, 0xB5F723FB, 0xBD376388}} + +#define Curve_N_1 {0xCA752257, 0xF927AED3, 0x0001F4C8, 0x00000000, 0x00000000, 0x00000001} +#define Curve_N_2 {0xB4D22831, 0x146BC9B1, 0x99DEF836, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF} +#define Curve_N_3 {0xFC632551, 0xF3B9CAC2, 0xA7179E84, 0xBCE6FAAD, \ + 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF} +#define Curve_N_4 {0xD0364141, 0xBFD25E8C, 0xAF48A03B, 0xBAAEDCE6, \ + 0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF} +#define Curve_N_5 {0x5C5C2A3D, 0x13DD2945, 0xE0B8F03E, 0xFFFF16A2, \ + 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF} + +#elif (uECC_WORD_SIZE == 8) + +typedef uint64_t uECC_word_t; +#if SUPPORTS_INT128 +typedef unsigned __int128 uECC_dword_t; +#endif +typedef unsigned wordcount_t; +typedef int swordcount_t; +typedef int bitcount_t; +typedef int cmpresult_t; + +#define HIGH_BIT_SET 0x8000000000000000ull +#define uECC_WORD_BITS 64 +#define uECC_WORD_BITS_SHIFT 6 +#define uECC_WORD_BITS_MASK 0x03F + +#define uECC_WORDS_1 3 +#define uECC_WORDS_2 3 +#define uECC_WORDS_3 4 +#define uECC_WORDS_4 4 +#define uECC_WORDS_5 4 + +#define uECC_N_WORDS_1 3 +#define uECC_N_WORDS_2 3 +#define uECC_N_WORDS_3 4 +#define uECC_N_WORDS_4 4 +#define uECC_N_WORDS_5 4 + +#define Curve_P_1 {0xFFFFFFFF7FFFFFFFull, 0xFFFFFFFFFFFFFFFFull, 0x00000000FFFFFFFFull} +#define Curve_P_2 {0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFFFFFFFFFEull, 0xFFFFFFFFFFFFFFFFull} +#define Curve_P_3 {0xFFFFFFFFFFFFFFFFull, 0x00000000FFFFFFFFull, \ + 0x0000000000000000ull, 0xFFFFFFFF00000001ull} +#define Curve_P_4 {0xFFFFFFFEFFFFFC2Full, 0xFFFFFFFFFFFFFFFFull, \ + 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFFFFFFFFFFull} +#define Curve_P_5 {0x0000000000000001ull, 0xFFFFFFFF00000000ull, \ + 0xFFFFFFFFFFFFFFFFull, 0x00000000FFFFFFFFull} + +#define Curve_B_1 {0x81D4D4ADC565FA45ull, 0x54BD7A8B65ACF89Full, 0x000000001C97BEFCull} +#define Curve_B_2 {0xFEB8DEECC146B9B1ull, 0x0FA7E9AB72243049ull, 0x64210519E59C80E7ull} +#define Curve_B_3 {0x3BCE3C3E27D2604Bull, 0x651D06B0CC53B0F6ull, \ + 0xB3EBBD55769886BCull, 0x5AC635D8AA3A93E7ull} +#define Curve_B_4 {0x0000000000000007ull, 0x0000000000000000ull, \ + 0x0000000000000000ull, 0x0000000000000000ull} +#define Curve_B_5 {0x270B39432355FFB4ull, 0x5044B0B7D7BFD8BAull, \ + 0x0C04B3ABF5413256ull, 0x00000000B4050A85ull} + +#define Curve_G_1 { \ + {0x68C38BB913CBFC82ull, 0x8EF5732846646989ull, 0x000000004A96B568ull}, \ + {0x042351377AC5FB32ull, 0x3168947D59DCC912ull, 0x0000000023A62855ull}} + +#define Curve_G_2 { \ + {0xF4FF0AFD82FF1012ull, 0x7CBF20EB43A18800ull, 0x188DA80EB03090F6ull}, \ + {0x73F977A11E794811ull, 0x631011ED6B24CDD5ull, 0x07192B95FFC8DA78ull}} + +#define Curve_G_3 { \ + {0xF4A13945D898C296ull, 0x77037D812DEB33A0ull, 0xF8BCE6E563A440F2ull, 0x6B17D1F2E12C4247ull}, \ + {0xCBB6406837BF51F5ull, 0x2BCE33576B315ECEull, 0x8EE7EB4A7C0F9E16ull, 0x4FE342E2FE1A7F9Bull}} + +#define Curve_G_4 { \ + {0x59F2815B16F81798ull, 0x029BFCDB2DCE28D9ull, 0x55A06295CE870B07ull, 0x79BE667EF9DCBBACull}, \ + {0x9C47D08FFB10D4B8ull, 0xFD17B448A6855419ull, 0x5DA4FBFC0E1108A8ull, 0x483ADA7726A3C465ull}} + +#define Curve_G_5 { \ + {0x343280D6115C1D21ull, 0x4A03C1D356C21122ull, 0x6BB4BF7F321390B9ull, 0x00000000B70E0CBDull}, \ + {0x44D5819985007E34ull, 0xCD4375A05A074764ull, 0xB5F723FB4C22DFE6ull, 0x00000000BD376388ull}} + +#define Curve_N_1 {0xF927AED3CA752257ull, 0x000000000001F4C8ull, 0x0000000100000000ull} +#define Curve_N_2 {0x146BC9B1B4D22831ull, 0xFFFFFFFF99DEF836ull, 0xFFFFFFFFFFFFFFFFull} +#define Curve_N_3 {0xF3B9CAC2FC632551ull, 0xBCE6FAADA7179E84ull, \ + 0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFF00000000ull} +#define Curve_N_4 {0xBFD25E8CD0364141ull, 0xBAAEDCE6AF48A03Bull, \ + 0xFFFFFFFFFFFFFFFEull, 0xFFFFFFFFFFFFFFFFull} +#define Curve_N_5 {0x13DD29455C5C2A3Dull, 0xFFFF16A2E0B8F03Eull, \ + 0xFFFFFFFFFFFFFFFFull, 0x00000000FFFFFFFFull} + +#endif /* (uECC_WORD_SIZE == 8) */ + +#define uECC_WORDS uECC_CONCAT(uECC_WORDS_, uECC_CURVE) +#define uECC_N_WORDS uECC_CONCAT(uECC_N_WORDS_, uECC_CURVE) + +typedef struct EccPoint { + uECC_word_t x[uECC_WORDS]; + uECC_word_t y[uECC_WORDS]; +} EccPoint; + +static const uECC_word_t curve_p[uECC_WORDS] = uECC_CONCAT(Curve_P_, uECC_CURVE); +static const uECC_word_t curve_b[uECC_WORDS] = uECC_CONCAT(Curve_B_, uECC_CURVE); +static const EccPoint curve_G = uECC_CONCAT(Curve_G_, uECC_CURVE); +static const uECC_word_t curve_n[uECC_N_WORDS] = uECC_CONCAT(Curve_N_, uECC_CURVE); + +static void vli_clear(uECC_word_t *vli); +static uECC_word_t vli_isZero(const uECC_word_t *vli); +static uECC_word_t vli_testBit(const uECC_word_t *vli, bitcount_t bit); +static bitcount_t vli_numBits(const uECC_word_t *vli, wordcount_t max_words); +static void vli_set(uECC_word_t *dest, const uECC_word_t *src); +static cmpresult_t vli_cmp(const uECC_word_t *left, const uECC_word_t *right); +static cmpresult_t vli_equal(const uECC_word_t *left, const uECC_word_t *right); +static void vli_rshift1(uECC_word_t *vli); +static uECC_word_t vli_add(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right); +static uECC_word_t vli_sub(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right); +static void vli_mult(uECC_word_t *result, const uECC_word_t *left, const uECC_word_t *right); +static void vli_modAdd(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right, + const uECC_word_t *mod); +static void vli_modSub(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right, + const uECC_word_t *mod); +static void vli_mmod_fast(uECC_word_t *RESTRICT result, uECC_word_t *RESTRICT product); +static void vli_modMult_fast(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right); +static void vli_modInv(uECC_word_t *result, const uECC_word_t *input, const uECC_word_t *mod); +#if uECC_SQUARE_FUNC +static void vli_square(uECC_word_t *result, const uECC_word_t *left); +static void vli_modSquare_fast(uECC_word_t *result, const uECC_word_t *left); +#endif + +#if (defined(_WIN32) || defined(_WIN64)) +/* Windows */ + +#define WIN32_LEAN_AND_MEAN +#include +#include + +static int default_RNG(uint8_t *dest, unsigned size) { + HCRYPTPROV prov; + if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + return 0; + } + + CryptGenRandom(prov, size, (BYTE *)dest); + CryptReleaseContext(prov, 0); + return 1; +} + +#elif defined(unix) || defined(__linux__) || defined(__unix__) || defined(__unix) || \ + (defined(__APPLE__) && defined(__MACH__)) || defined(uECC_POSIX) + +/* Some POSIX-like system with /dev/urandom or /dev/random. */ +#include +#include +#include + +#ifndef O_CLOEXEC + #define O_CLOEXEC 0 +#endif + +static int default_RNG(uint8_t *dest, unsigned size) { + int fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC); + if (fd == -1) { + fd = open("/dev/random", O_RDONLY | O_CLOEXEC); + if (fd == -1) { + return 0; + } + } + + char *ptr = (char *)dest; + size_t left = size; + while (left > 0) { + ssize_t bytes_read = read(fd, ptr, left); + if (bytes_read <= 0) { // read failed + close(fd); + return 0; + } + left -= bytes_read; + ptr += bytes_read; + } + + close(fd); + return 1; +} + +#else /* Some other platform */ + +static int default_RNG(uint8_t *dest, unsigned size) { + return 0; +} + +#endif + +static uECC_RNG_Function g_rng_function = &default_RNG; + +void uECC_set_rng(uECC_RNG_Function rng_function) { + g_rng_function = rng_function; +} + +#if defined __GNUC__ && !defined(__ARMCC_VERSION) /* Only support GCC inline asm for now */ + #if (uECC_ASM && (uECC_PLATFORM == uECC_avr)) + #include "asm_avr.inc" + #endif + + #if (uECC_ASM && (uECC_PLATFORM == uECC_arm || uECC_PLATFORM == uECC_arm_thumb || \ + uECC_PLATFORM == uECC_arm_thumb2)) + #include "asm_arm.inc" + #endif +#endif + +#if !defined(asm_clear) || !asm_clear +static void vli_clear(uECC_word_t *vli) { + wordcount_t i; + for (i = 0; i < uECC_WORDS; ++i) { + vli[i] = 0; + } +} +#endif + +/* Returns 1 if vli == 0, 0 otherwise. */ +#if !defined(asm_isZero) || !asm_isZero +static uECC_word_t vli_isZero(const uECC_word_t *vli) { + wordcount_t i; + for (i = 0; i < uECC_WORDS; ++i) { + if (vli[i]) { + return 0; + } + } + return 1; +} +#endif + +/* Returns nonzero if bit 'bit' of vli is set. */ +#if !defined(asm_testBit) || !asm_testBit +static uECC_word_t vli_testBit(const uECC_word_t *vli, bitcount_t bit) { + return (vli[bit >> uECC_WORD_BITS_SHIFT] & ((uECC_word_t)1 << (bit & uECC_WORD_BITS_MASK))); +} +#endif + +/* Counts the number of words in vli. */ +#if !defined(asm_numBits) || !asm_numBits +static wordcount_t vli_numDigits(const uECC_word_t *vli, wordcount_t max_words) { + swordcount_t i; + /* Search from the end until we find a non-zero digit. + We do it in reverse because we expect that most digits will be nonzero. */ + for (i = max_words - 1; i >= 0 && vli[i] == 0; --i) { + } + + return (i + 1); +} + +/* Counts the number of bits required to represent vli. */ +static bitcount_t vli_numBits(const uECC_word_t *vli, wordcount_t max_words) { + uECC_word_t i; + uECC_word_t digit; + + wordcount_t num_digits = vli_numDigits(vli, max_words); + if (num_digits == 0) { + return 0; + } + + digit = vli[num_digits - 1]; + for (i = 0; digit; ++i) { + digit >>= 1; + } + + return (((bitcount_t)(num_digits - 1) << uECC_WORD_BITS_SHIFT) + i); +} +#endif /* !asm_numBits */ + +/* Sets dest = src. */ +#if !defined(asm_set) || !asm_set +static void vli_set(uECC_word_t *dest, const uECC_word_t *src) { + wordcount_t i; + for (i = 0; i < uECC_WORDS; ++i) { + dest[i] = src[i]; + } +} +#endif + +/* Returns sign of left - right. */ +#if !defined(asm_cmp) || !asm_cmp +static cmpresult_t vli_cmp(const uECC_word_t *left, const uECC_word_t *right) { + swordcount_t i; + for (i = uECC_WORDS - 1; i >= 0; --i) { + if (left[i] > right[i]) { + return 1; + } else if (left[i] < right[i]) { + return -1; + } + } + return 0; +} +#endif + +static cmpresult_t vli_equal(const uECC_word_t *left, const uECC_word_t *right) { + uECC_word_t result = 0; + swordcount_t i; + for (i = uECC_WORDS - 1; i >= 0; --i) { + result |= (left[i] ^ right[i]); + } + return (result == 0); +} + +/* Computes vli = vli >> 1. */ +#if !defined(asm_rshift1) || !asm_rshift1 +static void vli_rshift1(uECC_word_t *vli) { + uECC_word_t *end = vli; + uECC_word_t carry = 0; + + vli += uECC_WORDS; + while (vli-- > end) { + uECC_word_t temp = *vli; + *vli = (temp >> 1) | carry; + carry = temp << (uECC_WORD_BITS - 1); + } +} +#endif + +/* Computes result = left + right, returning carry. Can modify in place. */ +#if !defined(asm_add) || !asm_add +static uECC_word_t vli_add(uECC_word_t *result, const uECC_word_t *left, const uECC_word_t *right) { + uECC_word_t carry = 0; + wordcount_t i; + for (i = 0; i < uECC_WORDS; ++i) { + uECC_word_t sum = left[i] + right[i] + carry; + if (sum != left[i]) { + carry = (sum < left[i]); + } + result[i] = sum; + } + return carry; +} +#endif + +/* Computes result = left - right, returning borrow. Can modify in place. */ +#if !defined(asm_sub) || !asm_sub +static uECC_word_t vli_sub(uECC_word_t *result, const uECC_word_t *left, const uECC_word_t *right) { + uECC_word_t borrow = 0; + wordcount_t i; + for (i = 0; i < uECC_WORDS; ++i) { + uECC_word_t diff = left[i] - right[i] - borrow; + if (diff != left[i]) { + borrow = (diff > left[i]); + } + result[i] = diff; + } + return borrow; +} +#endif + +#if (!asm_mult || (uECC_SQUARE_FUNC && !asm_square) || uECC_CURVE == uECC_secp256k1) +static void muladd(uECC_word_t a, + uECC_word_t b, + uECC_word_t *r0, + uECC_word_t *r1, + uECC_word_t *r2) { +#if uECC_WORD_SIZE == 8 && !SUPPORTS_INT128 + uint64_t a0 = a & 0xffffffffull; + uint64_t a1 = a >> 32; + uint64_t b0 = b & 0xffffffffull; + uint64_t b1 = b >> 32; + + uint64_t i0 = a0 * b0; + uint64_t i1 = a0 * b1; + uint64_t i2 = a1 * b0; + uint64_t i3 = a1 * b1; + + uint64_t p0, p1; + + i2 += (i0 >> 32); + i2 += i1; + if (i2 < i1) { // overflow + i3 += 0x100000000ull; + } + + p0 = (i0 & 0xffffffffull) | (i2 << 32); + p1 = i3 + (i2 >> 32); + + *r0 += p0; + *r1 += (p1 + (*r0 < p0)); + *r2 += ((*r1 < p1) || (*r1 == p1 && *r0 < p0)); +#else + uECC_dword_t p = (uECC_dword_t)a * b; + uECC_dword_t r01 = ((uECC_dword_t)(*r1) << uECC_WORD_BITS) | *r0; + r01 += p; + *r2 += (r01 < p); + *r1 = r01 >> uECC_WORD_BITS; + *r0 = (uECC_word_t)r01; +#endif +} +#define muladd_exists 1 +#endif + +#if !asm_mult +static void vli_mult(uECC_word_t *result, const uECC_word_t *left, const uECC_word_t *right) { + uECC_word_t r0 = 0; + uECC_word_t r1 = 0; + uECC_word_t r2 = 0; + wordcount_t i, k; + + /* Compute each digit of result in sequence, maintaining the carries. */ + for (k = 0; k < uECC_WORDS; ++k) { + for (i = 0; i <= k; ++i) { + muladd(left[i], right[k - i], &r0, &r1, &r2); + } + result[k] = r0; + r0 = r1; + r1 = r2; + r2 = 0; + } + for (k = uECC_WORDS; k < uECC_WORDS * 2 - 1; ++k) { + for (i = (k + 1) - uECC_WORDS; i < uECC_WORDS; ++i) { + muladd(left[i], right[k - i], &r0, &r1, &r2); + } + result[k] = r0; + r0 = r1; + r1 = r2; + r2 = 0; + } + result[uECC_WORDS * 2 - 1] = r0; +} +#endif + +#if uECC_SQUARE_FUNC + +#if !asm_square +static void mul2add(uECC_word_t a, + uECC_word_t b, + uECC_word_t *r0, + uECC_word_t *r1, + uECC_word_t *r2) { +#if uECC_WORD_SIZE == 8 && !SUPPORTS_INT128 + uint64_t a0 = a & 0xffffffffull; + uint64_t a1 = a >> 32; + uint64_t b0 = b & 0xffffffffull; + uint64_t b1 = b >> 32; + + uint64_t i0 = a0 * b0; + uint64_t i1 = a0 * b1; + uint64_t i2 = a1 * b0; + uint64_t i3 = a1 * b1; + + uint64_t p0, p1; + + i2 += (i0 >> 32); + i2 += i1; + if (i2 < i1) + { // overflow + i3 += 0x100000000ull; + } + + p0 = (i0 & 0xffffffffull) | (i2 << 32); + p1 = i3 + (i2 >> 32); + + *r2 += (p1 >> 63); + p1 = (p1 << 1) | (p0 >> 63); + p0 <<= 1; + + *r0 += p0; + *r1 += (p1 + (*r0 < p0)); + *r2 += ((*r1 < p1) || (*r1 == p1 && *r0 < p0)); +#else + uECC_dword_t p = (uECC_dword_t)a * b; + uECC_dword_t r01 = ((uECC_dword_t)(*r1) << uECC_WORD_BITS) | *r0; + *r2 += (p >> (uECC_WORD_BITS * 2 - 1)); + p *= 2; + r01 += p; + *r2 += (r01 < p); + *r1 = r01 >> uECC_WORD_BITS; + *r0 = (uECC_word_t)r01; +#endif +} + +static void vli_square(uECC_word_t *result, const uECC_word_t *left) { + uECC_word_t r0 = 0; + uECC_word_t r1 = 0; + uECC_word_t r2 = 0; + + wordcount_t i, k; + + for (k = 0; k < uECC_WORDS * 2 - 1; ++k) { + uECC_word_t min = (k < uECC_WORDS ? 0 : (k + 1) - uECC_WORDS); + for (i = min; i <= k && i <= k - i; ++i) { + if (i < k-i) { + mul2add(left[i], left[k - i], &r0, &r1, &r2); + } else { + muladd(left[i], left[k - i], &r0, &r1, &r2); + } + } + result[k] = r0; + r0 = r1; + r1 = r2; + r2 = 0; + } + + result[uECC_WORDS * 2 - 1] = r0; +} +#endif + +#else /* uECC_SQUARE_FUNC */ + +#define vli_square(result, left, size) vli_mult((result), (left), (left), (size)) + +#endif /* uECC_SQUARE_FUNC */ + + +/* Computes result = (left + right) % mod. + Assumes that left < mod and right < mod, and that result does not overlap mod. */ +#if !defined(asm_modAdd) || !asm_modAdd +static void vli_modAdd(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right, + const uECC_word_t *mod) { + uECC_word_t carry = vli_add(result, left, right); + if (carry || vli_cmp(result, mod) >= 0) { + /* result > mod (result = mod + remainder), so subtract mod to get remainder. */ + vli_sub(result, result, mod); + } +} +#endif + +/* Computes result = (left - right) % mod. + Assumes that left < mod and right < mod, and that result does not overlap mod. */ +#if !defined(asm_modSub) || !asm_modSub +static void vli_modSub(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right, + const uECC_word_t *mod) { + uECC_word_t l_borrow = vli_sub(result, left, right); + if (l_borrow) { + /* In this case, result == -diff == (max int) - diff. Since -x % d == d - x, + we can get the correct result from result + mod (with overflow). */ + vli_add(result, result, mod); + } +} +#endif + +#if !defined(asm_modSub_fast) || !asm_modSub_fast + #define vli_modSub_fast(result, left, right) vli_modSub((result), (left), (right), curve_p) +#endif + +#if !defined(asm_mmod_fast) || !asm_mmod_fast + +#if (uECC_CURVE == uECC_secp160r1 || uECC_CURVE == uECC_secp256k1) +/* omega_mult() is defined farther below for the different curves / word sizes */ +static void omega_mult(uECC_word_t * RESTRICT result, const uECC_word_t * RESTRICT right); + +/* Computes result = product % curve_p + see http://www.isys.uni-klu.ac.at/PDF/2001-0126-MT.pdf page 354 + + Note that this only works if log2(omega) < log2(p) / 2 */ +static void vli_mmod_fast(uECC_word_t *RESTRICT result, uECC_word_t *RESTRICT product) { + uECC_word_t tmp[2 * uECC_WORDS]; + uECC_word_t carry; + + vli_clear(tmp); + vli_clear(tmp + uECC_WORDS); + + omega_mult(tmp, product + uECC_WORDS); /* (Rq, q) = q * c */ + + carry = vli_add(result, product, tmp); /* (C, r) = r + q */ + vli_clear(product); + omega_mult(product, tmp + uECC_WORDS); /* Rq*c */ + carry += vli_add(result, result, product); /* (C1, r) = r + Rq*c */ + + while (carry > 0) { + --carry; + vli_sub(result, result, curve_p); + } + if (vli_cmp(result, curve_p) > 0) { + vli_sub(result, result, curve_p); + } +} + +#endif + +#if uECC_CURVE == uECC_secp160r1 + +#if uECC_WORD_SIZE == 1 +static void omega_mult(uint8_t * RESTRICT result, const uint8_t * RESTRICT right) { + uint8_t carry; + uint8_t i; + + /* Multiply by (2^31 + 1). */ + vli_set(result + 4, right); /* 2^32 */ + vli_rshift1(result + 4); /* 2^31 */ + result[3] = right[0] << 7; /* get last bit from shift */ + + carry = vli_add(result, result, right); /* 2^31 + 1 */ + for (i = uECC_WORDS; carry; ++i) { + uint16_t sum = (uint16_t)result[i] + carry; + result[i] = (uint8_t)sum; + carry = sum >> 8; + } +} +#elif uECC_WORD_SIZE == 4 +static void omega_mult(uint32_t * RESTRICT result, const uint32_t * RESTRICT right) { + uint32_t carry; + unsigned i; + + /* Multiply by (2^31 + 1). */ + vli_set(result + 1, right); /* 2^32 */ + vli_rshift1(result + 1); /* 2^31 */ + result[0] = right[0] << 31; /* get last bit from shift */ + + carry = vli_add(result, result, right); /* 2^31 + 1 */ + for (i = uECC_WORDS; carry; ++i) { + uint64_t sum = (uint64_t)result[i] + carry; + result[i] = (uint32_t)sum; + carry = sum >> 32; + } +} +#endif /* uECC_WORD_SIZE */ + +#elif uECC_CURVE == uECC_secp192r1 + +/* Computes result = product % curve_p. + See algorithm 5 and 6 from http://www.isys.uni-klu.ac.at/PDF/2001-0126-MT.pdf */ +#if uECC_WORD_SIZE == 1 +static void vli_mmod_fast(uint8_t *RESTRICT result, uint8_t *RESTRICT product) { + uint8_t tmp[uECC_WORDS]; + uint8_t carry; + + vli_set(result, product); + + vli_set(tmp, &product[24]); + carry = vli_add(result, result, tmp); + + tmp[0] = tmp[1] = tmp[2] = tmp[3] = tmp[4] = tmp[5] = tmp[6] = tmp[7] = 0; + tmp[8] = product[24]; tmp[9] = product[25]; tmp[10] = product[26]; tmp[11] = product[27]; + tmp[12] = product[28]; tmp[13] = product[29]; tmp[14] = product[30]; tmp[15] = product[31]; + tmp[16] = product[32]; tmp[17] = product[33]; tmp[18] = product[34]; tmp[19] = product[35]; + tmp[20] = product[36]; tmp[21] = product[37]; tmp[22] = product[38]; tmp[23] = product[39]; + carry += vli_add(result, result, tmp); + + tmp[0] = tmp[8] = product[40]; + tmp[1] = tmp[9] = product[41]; + tmp[2] = tmp[10] = product[42]; + tmp[3] = tmp[11] = product[43]; + tmp[4] = tmp[12] = product[44]; + tmp[5] = tmp[13] = product[45]; + tmp[6] = tmp[14] = product[46]; + tmp[7] = tmp[15] = product[47]; + tmp[16] = tmp[17] = tmp[18] = tmp[19] = tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0; + carry += vli_add(result, result, tmp); + + while (carry || vli_cmp(curve_p, result) != 1) { + carry -= vli_sub(result, result, curve_p); + } +} +#elif uECC_WORD_SIZE == 4 +static void vli_mmod_fast(uint32_t *RESTRICT result, uint32_t *RESTRICT product) { + uint32_t tmp[uECC_WORDS]; + int carry; + + vli_set(result, product); + + vli_set(tmp, &product[6]); + carry = vli_add(result, result, tmp); + + tmp[0] = tmp[1] = 0; + tmp[2] = product[6]; + tmp[3] = product[7]; + tmp[4] = product[8]; + tmp[5] = product[9]; + carry += vli_add(result, result, tmp); + + tmp[0] = tmp[2] = product[10]; + tmp[1] = tmp[3] = product[11]; + tmp[4] = tmp[5] = 0; + carry += vli_add(result, result, tmp); + + while (carry || vli_cmp(curve_p, result) != 1) { + carry -= vli_sub(result, result, curve_p); + } +} +#else +static void vli_mmod_fast(uint64_t *RESTRICT result, uint64_t *RESTRICT product) { + uint64_t tmp[uECC_WORDS]; + int carry; + + vli_set(result, product); + + vli_set(tmp, &product[3]); + carry = vli_add(result, result, tmp); + + tmp[0] = 0; + tmp[1] = product[3]; + tmp[2] = product[4]; + carry += vli_add(result, result, tmp); + + tmp[0] = tmp[1] = product[5]; + tmp[2] = 0; + carry += vli_add(result, result, tmp); + + while (carry || vli_cmp(curve_p, result) != 1) { + carry -= vli_sub(result, result, curve_p); + } +} +#endif /* uECC_WORD_SIZE */ + +#elif uECC_CURVE == uECC_secp256r1 + +/* Computes result = product % curve_p + from http://www.nsa.gov/ia/_files/nist-routines.pdf */ +#if uECC_WORD_SIZE == 1 +static void vli_mmod_fast(uint8_t *RESTRICT result, uint8_t *RESTRICT product) { + uint8_t tmp[uECC_BYTES]; + int8_t carry; + + /* t */ + vli_set(result, product); + + /* s1 */ + tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0; + tmp[4] = tmp[5] = tmp[6] = tmp[7] = 0; + tmp[8] = tmp[9] = tmp[10] = tmp[11] = 0; + tmp[12] = product[44]; tmp[13] = product[45]; tmp[14] = product[46]; tmp[15] = product[47]; + tmp[16] = product[48]; tmp[17] = product[49]; tmp[18] = product[50]; tmp[19] = product[51]; + tmp[20] = product[52]; tmp[21] = product[53]; tmp[22] = product[54]; tmp[23] = product[55]; + tmp[24] = product[56]; tmp[25] = product[57]; tmp[26] = product[58]; tmp[27] = product[59]; + tmp[28] = product[60]; tmp[29] = product[61]; tmp[30] = product[62]; tmp[31] = product[63]; + carry = vli_add(tmp, tmp, tmp); + carry += vli_add(result, result, tmp); + + /* s2 */ + tmp[12] = product[48]; tmp[13] = product[49]; tmp[14] = product[50]; tmp[15] = product[51]; + tmp[16] = product[52]; tmp[17] = product[53]; tmp[18] = product[54]; tmp[19] = product[55]; + tmp[20] = product[56]; tmp[21] = product[57]; tmp[22] = product[58]; tmp[23] = product[59]; + tmp[24] = product[60]; tmp[25] = product[61]; tmp[26] = product[62]; tmp[27] = product[63]; + tmp[28] = tmp[29] = tmp[30] = tmp[31] = 0; + carry += vli_add(tmp, tmp, tmp); + carry += vli_add(result, result, tmp); + + /* s3 */ + tmp[0] = product[32]; tmp[1] = product[33]; tmp[2] = product[34]; tmp[3] = product[35]; + tmp[4] = product[36]; tmp[5] = product[37]; tmp[6] = product[38]; tmp[7] = product[39]; + tmp[8] = product[40]; tmp[9] = product[41]; tmp[10] = product[42]; tmp[11] = product[43]; + tmp[12] = tmp[13] = tmp[14] = tmp[15] = 0; + tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0; + tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0; + tmp[24] = product[56]; tmp[25] = product[57]; tmp[26] = product[58]; tmp[27] = product[59]; + tmp[28] = product[60]; tmp[29] = product[61]; tmp[30] = product[62]; tmp[31] = product[63]; + carry += vli_add(result, result, tmp); + + /* s4 */ + tmp[0] = product[36]; tmp[1] = product[37]; tmp[2] = product[38]; tmp[3] = product[39]; + tmp[4] = product[40]; tmp[5] = product[41]; tmp[6] = product[42]; tmp[7] = product[43]; + tmp[8] = product[44]; tmp[9] = product[45]; tmp[10] = product[46]; tmp[11] = product[47]; + tmp[12] = product[52]; tmp[13] = product[53]; tmp[14] = product[54]; tmp[15] = product[55]; + tmp[16] = product[56]; tmp[17] = product[57]; tmp[18] = product[58]; tmp[19] = product[59]; + tmp[20] = product[60]; tmp[21] = product[61]; tmp[22] = product[62]; tmp[23] = product[63]; + tmp[24] = product[52]; tmp[25] = product[53]; tmp[26] = product[54]; tmp[27] = product[55]; + tmp[28] = product[32]; tmp[29] = product[33]; tmp[30] = product[34]; tmp[31] = product[35]; + carry += vli_add(result, result, tmp); + + /* d1 */ + tmp[0] = product[44]; tmp[1] = product[45]; tmp[2] = product[46]; tmp[3] = product[47]; + tmp[4] = product[48]; tmp[5] = product[49]; tmp[6] = product[50]; tmp[7] = product[51]; + tmp[8] = product[52]; tmp[9] = product[53]; tmp[10] = product[54]; tmp[11] = product[55]; + tmp[12] = tmp[13] = tmp[14] = tmp[15] = 0; + tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0; + tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0; + tmp[24] = product[32]; tmp[25] = product[33]; tmp[26] = product[34]; tmp[27] = product[35]; + tmp[28] = product[40]; tmp[29] = product[41]; tmp[30] = product[42]; tmp[31] = product[43]; + carry -= vli_sub(result, result, tmp); + + /* d2 */ + tmp[0] = product[48]; tmp[1] = product[49]; tmp[2] = product[50]; tmp[3] = product[51]; + tmp[4] = product[52]; tmp[5] = product[53]; tmp[6] = product[54]; tmp[7] = product[55]; + tmp[8] = product[56]; tmp[9] = product[57]; tmp[10] = product[58]; tmp[11] = product[59]; + tmp[12] = product[60]; tmp[13] = product[61]; tmp[14] = product[62]; tmp[15] = product[63]; + tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0; + tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0; + tmp[24] = product[36]; tmp[25] = product[37]; tmp[26] = product[38]; tmp[27] = product[39]; + tmp[28] = product[44]; tmp[29] = product[45]; tmp[30] = product[46]; tmp[31] = product[47]; + carry -= vli_sub(result, result, tmp); + + /* d3 */ + tmp[0] = product[52]; tmp[1] = product[53]; tmp[2] = product[54]; tmp[3] = product[55]; + tmp[4] = product[56]; tmp[5] = product[57]; tmp[6] = product[58]; tmp[7] = product[59]; + tmp[8] = product[60]; tmp[9] = product[61]; tmp[10] = product[62]; tmp[11] = product[63]; + tmp[12] = product[32]; tmp[13] = product[33]; tmp[14] = product[34]; tmp[15] = product[35]; + tmp[16] = product[36]; tmp[17] = product[37]; tmp[18] = product[38]; tmp[19] = product[39]; + tmp[20] = product[40]; tmp[21] = product[41]; tmp[22] = product[42]; tmp[23] = product[43]; + tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0; + tmp[28] = product[48]; tmp[29] = product[49]; tmp[30] = product[50]; tmp[31] = product[51]; + carry -= vli_sub(result, result, tmp); + + /* d4 */ + tmp[0] = product[56]; tmp[1] = product[57]; tmp[2] = product[58]; tmp[3] = product[59]; + tmp[4] = product[60]; tmp[5] = product[61]; tmp[6] = product[62]; tmp[7] = product[63]; + tmp[8] = tmp[9] = tmp[10] = tmp[11] = 0; + tmp[12] = product[36]; tmp[13] = product[37]; tmp[14] = product[38]; tmp[15] = product[39]; + tmp[16] = product[40]; tmp[17] = product[41]; tmp[18] = product[42]; tmp[19] = product[43]; + tmp[20] = product[44]; tmp[21] = product[45]; tmp[22] = product[46]; tmp[23] = product[47]; + tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0; + tmp[28] = product[52]; tmp[29] = product[53]; tmp[30] = product[54]; tmp[31] = product[55]; + carry -= vli_sub(result, result, tmp); + + if (carry < 0) { + do { + carry += vli_add(result, result, curve_p); + } while (carry < 0); + } else { + while (carry || vli_cmp(curve_p, result) != 1) { + carry -= vli_sub(result, result, curve_p); + } + } +} +#elif uECC_WORD_SIZE == 4 +static void vli_mmod_fast(uint32_t *RESTRICT result, uint32_t *RESTRICT product) { + uint32_t tmp[uECC_WORDS]; + int carry; + + /* t */ + vli_set(result, product); + + /* s1 */ + tmp[0] = tmp[1] = tmp[2] = 0; + tmp[3] = product[11]; + tmp[4] = product[12]; + tmp[5] = product[13]; + tmp[6] = product[14]; + tmp[7] = product[15]; + carry = vli_add(tmp, tmp, tmp); + carry += vli_add(result, result, tmp); + + /* s2 */ + tmp[3] = product[12]; + tmp[4] = product[13]; + tmp[5] = product[14]; + tmp[6] = product[15]; + tmp[7] = 0; + carry += vli_add(tmp, tmp, tmp); + carry += vli_add(result, result, tmp); + + /* s3 */ + tmp[0] = product[8]; + tmp[1] = product[9]; + tmp[2] = product[10]; + tmp[3] = tmp[4] = tmp[5] = 0; + tmp[6] = product[14]; + tmp[7] = product[15]; + carry += vli_add(result, result, tmp); + + /* s4 */ + tmp[0] = product[9]; + tmp[1] = product[10]; + tmp[2] = product[11]; + tmp[3] = product[13]; + tmp[4] = product[14]; + tmp[5] = product[15]; + tmp[6] = product[13]; + tmp[7] = product[8]; + carry += vli_add(result, result, tmp); + + /* d1 */ + tmp[0] = product[11]; + tmp[1] = product[12]; + tmp[2] = product[13]; + tmp[3] = tmp[4] = tmp[5] = 0; + tmp[6] = product[8]; + tmp[7] = product[10]; + carry -= vli_sub(result, result, tmp); + + /* d2 */ + tmp[0] = product[12]; + tmp[1] = product[13]; + tmp[2] = product[14]; + tmp[3] = product[15]; + tmp[4] = tmp[5] = 0; + tmp[6] = product[9]; + tmp[7] = product[11]; + carry -= vli_sub(result, result, tmp); + + /* d3 */ + tmp[0] = product[13]; + tmp[1] = product[14]; + tmp[2] = product[15]; + tmp[3] = product[8]; + tmp[4] = product[9]; + tmp[5] = product[10]; + tmp[6] = 0; + tmp[7] = product[12]; + carry -= vli_sub(result, result, tmp); + + /* d4 */ + tmp[0] = product[14]; + tmp[1] = product[15]; + tmp[2] = 0; + tmp[3] = product[9]; + tmp[4] = product[10]; + tmp[5] = product[11]; + tmp[6] = 0; + tmp[7] = product[13]; + carry -= vli_sub(result, result, tmp); + + if (carry < 0) { + do { + carry += vli_add(result, result, curve_p); + } while (carry < 0); + } else { + while (carry || vli_cmp(curve_p, result) != 1) { + carry -= vli_sub(result, result, curve_p); + } + } +} +#else +static void vli_mmod_fast(uint64_t *RESTRICT result, uint64_t *RESTRICT product) { + uint64_t tmp[uECC_WORDS]; + int carry; + + /* t */ + vli_set(result, product); + + /* s1 */ + tmp[0] = 0; + tmp[1] = product[5] & 0xffffffff00000000ull; + tmp[2] = product[6]; + tmp[3] = product[7]; + carry = vli_add(tmp, tmp, tmp); + carry += vli_add(result, result, tmp); + + /* s2 */ + tmp[1] = product[6] << 32; + tmp[2] = (product[6] >> 32) | (product[7] << 32); + tmp[3] = product[7] >> 32; + carry += vli_add(tmp, tmp, tmp); + carry += vli_add(result, result, tmp); + + /* s3 */ + tmp[0] = product[4]; + tmp[1] = product[5] & 0xffffffff; + tmp[2] = 0; + tmp[3] = product[7]; + carry += vli_add(result, result, tmp); + + /* s4 */ + tmp[0] = (product[4] >> 32) | (product[5] << 32); + tmp[1] = (product[5] >> 32) | (product[6] & 0xffffffff00000000ull); + tmp[2] = product[7]; + tmp[3] = (product[6] >> 32) | (product[4] << 32); + carry += vli_add(result, result, tmp); + + /* d1 */ + tmp[0] = (product[5] >> 32) | (product[6] << 32); + tmp[1] = (product[6] >> 32); + tmp[2] = 0; + tmp[3] = (product[4] & 0xffffffff) | (product[5] << 32); + carry -= vli_sub(result, result, tmp); + + /* d2 */ + tmp[0] = product[6]; + tmp[1] = product[7]; + tmp[2] = 0; + tmp[3] = (product[4] >> 32) | (product[5] & 0xffffffff00000000ull); + carry -= vli_sub(result, result, tmp); + + /* d3 */ + tmp[0] = (product[6] >> 32) | (product[7] << 32); + tmp[1] = (product[7] >> 32) | (product[4] << 32); + tmp[2] = (product[4] >> 32) | (product[5] << 32); + tmp[3] = (product[6] << 32); + carry -= vli_sub(result, result, tmp); + + /* d4 */ + tmp[0] = product[7]; + tmp[1] = product[4] & 0xffffffff00000000ull; + tmp[2] = product[5]; + tmp[3] = product[6] & 0xffffffff00000000ull; + carry -= vli_sub(result, result, tmp); + + if (carry < 0) { + do { + carry += vli_add(result, result, curve_p); + } while (carry < 0); + } else { + while (carry || vli_cmp(curve_p, result) != 1) { + carry -= vli_sub(result, result, curve_p); + } + } +} +#endif /* uECC_WORD_SIZE */ + +#elif uECC_CURVE == uECC_secp256k1 + +#if uECC_WORD_SIZE == 1 +static void omega_mult(uint8_t * RESTRICT result, const uint8_t * RESTRICT right) { + /* Multiply by (2^32 + 2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */ + uECC_word_t r0 = 0; + uECC_word_t r1 = 0; + uECC_word_t r2 = 0; + wordcount_t k; + + /* Multiply by (2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */ + muladd(0xD1, right[0], &r0, &r1, &r2); + result[0] = r0; + r0 = r1; + r1 = r2; + /* r2 is still 0 */ + + for (k = 1; k < uECC_WORDS; ++k) { + muladd(0x03, right[k - 1], &r0, &r1, &r2); + muladd(0xD1, right[k], &r0, &r1, &r2); + result[k] = r0; + r0 = r1; + r1 = r2; + r2 = 0; + } + muladd(0x03, right[uECC_WORDS - 1], &r0, &r1, &r2); + result[uECC_WORDS] = r0; + result[uECC_WORDS + 1] = r1; + + result[4 + uECC_WORDS] = vli_add(result + 4, result + 4, right); /* add the 2^32 multiple */ +} +#elif uECC_WORD_SIZE == 4 +static void omega_mult(uint32_t * RESTRICT result, const uint32_t * RESTRICT right) { + /* Multiply by (2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */ + uint32_t carry = 0; + wordcount_t k; + + for (k = 0; k < uECC_WORDS; ++k) { + uint64_t p = (uint64_t)0x3D1 * right[k] + carry; + result[k] = (p & 0xffffffff); + carry = p >> 32; + } + result[uECC_WORDS] = carry; + + result[1 + uECC_WORDS] = vli_add(result + 1, result + 1, right); /* add the 2^32 multiple */ +} +#else +static void omega_mult(uint64_t * RESTRICT result, const uint64_t * RESTRICT right) { + uECC_word_t r0 = 0; + uECC_word_t r1 = 0; + uECC_word_t r2 = 0; + wordcount_t k; + + /* Multiply by (2^32 + 2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */ + for (k = 0; k < uECC_WORDS; ++k) { + muladd(0x1000003D1ull, right[k], &r0, &r1, &r2); + result[k] = r0; + r0 = r1; + r1 = r2; + r2 = 0; + } + result[uECC_WORDS] = r0; +} +#endif /* uECC_WORD_SIZE */ + +#elif uECC_CURVE == uECC_secp224r1 + +/* Computes result = product % curve_p + from http://www.nsa.gov/ia/_files/nist-routines.pdf */ +#if uECC_WORD_SIZE == 1 +// TODO it may be faster to use the omega_mult method when fully asm optimized. +void vli_mmod_fast(uint8_t *RESTRICT result, uint8_t *RESTRICT product) { + uint8_t tmp[uECC_WORDS]; + int8_t carry; + + /* t */ + vli_set(result, product); + + /* s1 */ + tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0; + tmp[4] = tmp[5] = tmp[6] = tmp[7] = 0; + tmp[8] = tmp[9] = tmp[10] = tmp[11] = 0; + tmp[12] = product[28]; tmp[13] = product[29]; tmp[14] = product[30]; tmp[15] = product[31]; + tmp[16] = product[32]; tmp[17] = product[33]; tmp[18] = product[34]; tmp[19] = product[35]; + tmp[20] = product[36]; tmp[21] = product[37]; tmp[22] = product[38]; tmp[23] = product[39]; + tmp[24] = product[40]; tmp[25] = product[41]; tmp[26] = product[42]; tmp[27] = product[43]; + carry = vli_add(result, result, tmp); + + /* s2 */ + tmp[12] = product[44]; tmp[13] = product[45]; tmp[14] = product[46]; tmp[15] = product[47]; + tmp[16] = product[48]; tmp[17] = product[49]; tmp[18] = product[50]; tmp[19] = product[51]; + tmp[20] = product[52]; tmp[21] = product[53]; tmp[22] = product[54]; tmp[23] = product[55]; + tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0; + carry += vli_add(result, result, tmp); + + /* d1 */ + tmp[0] = product[28]; tmp[1] = product[29]; tmp[2] = product[30]; tmp[3] = product[31]; + tmp[4] = product[32]; tmp[5] = product[33]; tmp[6] = product[34]; tmp[7] = product[35]; + tmp[8] = product[36]; tmp[9] = product[37]; tmp[10] = product[38]; tmp[11] = product[39]; + tmp[12] = product[40]; tmp[13] = product[41]; tmp[14] = product[42]; tmp[15] = product[43]; + tmp[16] = product[44]; tmp[17] = product[45]; tmp[18] = product[46]; tmp[19] = product[47]; + tmp[20] = product[48]; tmp[21] = product[49]; tmp[22] = product[50]; tmp[23] = product[51]; + tmp[24] = product[52]; tmp[25] = product[53]; tmp[26] = product[54]; tmp[27] = product[55]; + carry -= vli_sub(result, result, tmp); + + /* d2 */ + tmp[0] = product[44]; tmp[1] = product[45]; tmp[2] = product[46]; tmp[3] = product[47]; + tmp[4] = product[48]; tmp[5] = product[49]; tmp[6] = product[50]; tmp[7] = product[51]; + tmp[8] = product[52]; tmp[9] = product[53]; tmp[10] = product[54]; tmp[11] = product[55]; + tmp[12] = tmp[13] = tmp[14] = tmp[15] = 0; + tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0; + tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0; + tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0; + carry -= vli_sub(result, result, tmp); + + if (carry < 0) { + do { + carry += vli_add(result, result, curve_p); + } while (carry < 0); + } else { + while (carry || vli_cmp(curve_p, result) != 1) { + carry -= vli_sub(result, result, curve_p); + } + } +} +#elif uECC_WORD_SIZE == 4 +void vli_mmod_fast(uint32_t *RESTRICT result, uint32_t *RESTRICT product) +{ + uint32_t tmp[uECC_WORDS]; + int carry; + + /* t */ + vli_set(result, product); + + /* s1 */ + tmp[0] = tmp[1] = tmp[2] = 0; + tmp[3] = product[7]; + tmp[4] = product[8]; + tmp[5] = product[9]; + tmp[6] = product[10]; + carry = vli_add(result, result, tmp); + + /* s2 */ + tmp[3] = product[11]; + tmp[4] = product[12]; + tmp[5] = product[13]; + tmp[6] = 0; + carry += vli_add(result, result, tmp); + + /* d1 */ + tmp[0] = product[7]; + tmp[1] = product[8]; + tmp[2] = product[9]; + tmp[3] = product[10]; + tmp[4] = product[11]; + tmp[5] = product[12]; + tmp[6] = product[13]; + carry -= vli_sub(result, result, tmp); + + /* d2 */ + tmp[0] = product[11]; + tmp[1] = product[12]; + tmp[2] = product[13]; + tmp[3] = tmp[4] = tmp[5] = tmp[6] = 0; + carry -= vli_sub(result, result, tmp); + + if (carry < 0) { + do { + carry += vli_add(result, result, curve_p); + } while (carry < 0); + } else { + while (carry || vli_cmp(curve_p, result) != 1) { + carry -= vli_sub(result, result, curve_p); + } + } +} +#endif /* uECC_WORD_SIZE */ + +#endif /* uECC_CURVE */ +#endif /* !asm_mmod_fast */ + +/* Computes result = (left * right) % curve_p. */ +static void vli_modMult_fast(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right) { + uECC_word_t product[2 * uECC_WORDS]; + vli_mult(product, left, right); + vli_mmod_fast(result, product); +} + +#if uECC_SQUARE_FUNC + +/* Computes result = left^2 % curve_p. */ +static void vli_modSquare_fast(uECC_word_t *result, const uECC_word_t *left) { + uECC_word_t product[2 * uECC_WORDS]; + vli_square(product, left); + vli_mmod_fast(result, product); +} + +#else /* uECC_SQUARE_FUNC */ + +#define vli_modSquare_fast(result, left) vli_modMult_fast((result), (left), (left)) + +#endif /* uECC_SQUARE_FUNC */ + + +#define EVEN(vli) (!(vli[0] & 1)) +/* Computes result = (1 / input) % mod. All VLIs are the same size. + See "From Euclid's GCD to Montgomery Multiplication to the Great Divide" + https://labs.oracle.com/techrep/2001/smli_tr-2001-95.pdf */ +#if !defined(asm_modInv) || !asm_modInv +static void vli_modInv(uECC_word_t *result, const uECC_word_t *input, const uECC_word_t *mod) { + uECC_word_t a[uECC_WORDS], b[uECC_WORDS], u[uECC_WORDS], v[uECC_WORDS]; + uECC_word_t carry; + cmpresult_t cmpResult; + + if (vli_isZero(input)) { + vli_clear(result); + return; + } + + vli_set(a, input); + vli_set(b, mod); + vli_clear(u); + u[0] = 1; + vli_clear(v); + while ((cmpResult = vli_cmp(a, b)) != 0) { + carry = 0; + if (EVEN(a)) { + vli_rshift1(a); + if (!EVEN(u)) { + carry = vli_add(u, u, mod); + } + vli_rshift1(u); + if (carry) { + u[uECC_WORDS - 1] |= HIGH_BIT_SET; + } + } else if (EVEN(b)) { + vli_rshift1(b); + if (!EVEN(v)) { + carry = vli_add(v, v, mod); + } + vli_rshift1(v); + if (carry) { + v[uECC_WORDS - 1] |= HIGH_BIT_SET; + } + } else if (cmpResult > 0) { + vli_sub(a, a, b); + vli_rshift1(a); + if (vli_cmp(u, v) < 0) { + vli_add(u, u, mod); + } + vli_sub(u, u, v); + if (!EVEN(u)) { + carry = vli_add(u, u, mod); + } + vli_rshift1(u); + if (carry) { + u[uECC_WORDS - 1] |= HIGH_BIT_SET; + } + } else { + vli_sub(b, b, a); + vli_rshift1(b); + if (vli_cmp(v, u) < 0) { + vli_add(v, v, mod); + } + vli_sub(v, v, u); + if (!EVEN(v)) { + carry = vli_add(v, v, mod); + } + vli_rshift1(v); + if (carry) { + v[uECC_WORDS - 1] |= HIGH_BIT_SET; + } + } + } + vli_set(result, u); +} +#endif /* !asm_modInv */ + +/* ------ Point operations ------ */ + +/* Returns 1 if 'point' is the point at infinity, 0 otherwise. */ +static cmpresult_t EccPoint_isZero(const EccPoint *point) { + return (vli_isZero(point->x) && vli_isZero(point->y)); +} + +/* Point multiplication algorithm using Montgomery's ladder with co-Z coordinates. +From http://eprint.iacr.org/2011/338.pdf +*/ + +/* Double in place */ +#if (uECC_CURVE == uECC_secp256k1) +static void EccPoint_double_jacobian(uECC_word_t * RESTRICT X1, + uECC_word_t * RESTRICT Y1, + uECC_word_t * RESTRICT Z1) { + /* t1 = X, t2 = Y, t3 = Z */ + uECC_word_t t4[uECC_WORDS]; + uECC_word_t t5[uECC_WORDS]; + + if (vli_isZero(Z1)) { + return; + } + + vli_modSquare_fast(t5, Y1); /* t5 = y1^2 */ + vli_modMult_fast(t4, X1, t5); /* t4 = x1*y1^2 = A */ + vli_modSquare_fast(X1, X1); /* t1 = x1^2 */ + vli_modSquare_fast(t5, t5); /* t5 = y1^4 */ + vli_modMult_fast(Z1, Y1, Z1); /* t3 = y1*z1 = z3 */ + + vli_modAdd(Y1, X1, X1, curve_p); /* t2 = 2*x1^2 */ + vli_modAdd(Y1, Y1, X1, curve_p); /* t2 = 3*x1^2 */ + if (vli_testBit(Y1, 0)) { + uECC_word_t carry = vli_add(Y1, Y1, curve_p); + vli_rshift1(Y1); + Y1[uECC_WORDS - 1] |= carry << (uECC_WORD_BITS - 1); + } else { + vli_rshift1(Y1); + } + /* t2 = 3/2*(x1^2) = B */ + + vli_modSquare_fast(X1, Y1); /* t1 = B^2 */ + vli_modSub(X1, X1, t4, curve_p); /* t1 = B^2 - A */ + vli_modSub(X1, X1, t4, curve_p); /* t1 = B^2 - 2A = x3 */ + + vli_modSub(t4, t4, X1, curve_p); /* t4 = A - x3 */ + vli_modMult_fast(Y1, Y1, t4); /* t2 = B * (A - x3) */ + vli_modSub(Y1, Y1, t5, curve_p); /* t2 = B * (A - x3) - y1^4 = y3 */ +} +#else +static void EccPoint_double_jacobian(uECC_word_t * RESTRICT X1, + uECC_word_t * RESTRICT Y1, + uECC_word_t * RESTRICT Z1) { + /* t1 = X, t2 = Y, t3 = Z */ + uECC_word_t t4[uECC_WORDS]; + uECC_word_t t5[uECC_WORDS]; + + if (vli_isZero(Z1)) { + return; + } + + vli_modSquare_fast(t4, Y1); /* t4 = y1^2 */ + vli_modMult_fast(t5, X1, t4); /* t5 = x1*y1^2 = A */ + vli_modSquare_fast(t4, t4); /* t4 = y1^4 */ + vli_modMult_fast(Y1, Y1, Z1); /* t2 = y1*z1 = z3 */ + vli_modSquare_fast(Z1, Z1); /* t3 = z1^2 */ + + vli_modAdd(X1, X1, Z1, curve_p); /* t1 = x1 + z1^2 */ + vli_modAdd(Z1, Z1, Z1, curve_p); /* t3 = 2*z1^2 */ + vli_modSub_fast(Z1, X1, Z1); /* t3 = x1 - z1^2 */ + vli_modMult_fast(X1, X1, Z1); /* t1 = x1^2 - z1^4 */ + + vli_modAdd(Z1, X1, X1, curve_p); /* t3 = 2*(x1^2 - z1^4) */ + vli_modAdd(X1, X1, Z1, curve_p); /* t1 = 3*(x1^2 - z1^4) */ + if (vli_testBit(X1, 0)) { + uECC_word_t l_carry = vli_add(X1, X1, curve_p); + vli_rshift1(X1); + X1[uECC_WORDS - 1] |= l_carry << (uECC_WORD_BITS - 1); + } else { + vli_rshift1(X1); + } + /* t1 = 3/2*(x1^2 - z1^4) = B */ + + vli_modSquare_fast(Z1, X1); /* t3 = B^2 */ + vli_modSub_fast(Z1, Z1, t5); /* t3 = B^2 - A */ + vli_modSub_fast(Z1, Z1, t5); /* t3 = B^2 - 2A = x3 */ + vli_modSub_fast(t5, t5, Z1); /* t5 = A - x3 */ + vli_modMult_fast(X1, X1, t5); /* t1 = B * (A - x3) */ + vli_modSub_fast(t4, X1, t4); /* t4 = B * (A - x3) - y1^4 = y3 */ + + vli_set(X1, Z1); + vli_set(Z1, Y1); + vli_set(Y1, t4); +} +#endif + +/* Modify (x1, y1) => (x1 * z^2, y1 * z^3) */ +static void apply_z(uECC_word_t * RESTRICT X1, + uECC_word_t * RESTRICT Y1, + const uECC_word_t * RESTRICT Z) { + uECC_word_t t1[uECC_WORDS]; + + vli_modSquare_fast(t1, Z); /* z^2 */ + vli_modMult_fast(X1, X1, t1); /* x1 * z^2 */ + vli_modMult_fast(t1, t1, Z); /* z^3 */ + vli_modMult_fast(Y1, Y1, t1); /* y1 * z^3 */ +} + +/* P = (x1, y1) => 2P, (x2, y2) => P' */ +static void XYcZ_initial_double(uECC_word_t * RESTRICT X1, + uECC_word_t * RESTRICT Y1, + uECC_word_t * RESTRICT X2, + uECC_word_t * RESTRICT Y2, + const uECC_word_t * RESTRICT initial_Z) { + uECC_word_t z[uECC_WORDS]; + if (initial_Z) { + vli_set(z, initial_Z); + } else { + vli_clear(z); + z[0] = 1; + } + + vli_set(X2, X1); + vli_set(Y2, Y1); + + apply_z(X1, Y1, z); + EccPoint_double_jacobian(X1, Y1, z); + apply_z(X2, Y2, z); +} + +/* Input P = (x1, y1, Z), Q = (x2, y2, Z) + Output P' = (x1', y1', Z3), P + Q = (x3, y3, Z3) + or P => P', Q => P + Q +*/ +static void XYcZ_add(uECC_word_t * RESTRICT X1, + uECC_word_t * RESTRICT Y1, + uECC_word_t * RESTRICT X2, + uECC_word_t * RESTRICT Y2) { + /* t1 = X1, t2 = Y1, t3 = X2, t4 = Y2 */ + uECC_word_t t5[uECC_WORDS]; + + vli_modSub_fast(t5, X2, X1); /* t5 = x2 - x1 */ + vli_modSquare_fast(t5, t5); /* t5 = (x2 - x1)^2 = A */ + vli_modMult_fast(X1, X1, t5); /* t1 = x1*A = B */ + vli_modMult_fast(X2, X2, t5); /* t3 = x2*A = C */ + vli_modSub_fast(Y2, Y2, Y1); /* t4 = y2 - y1 */ + vli_modSquare_fast(t5, Y2); /* t5 = (y2 - y1)^2 = D */ + + vli_modSub_fast(t5, t5, X1); /* t5 = D - B */ + vli_modSub_fast(t5, t5, X2); /* t5 = D - B - C = x3 */ + vli_modSub_fast(X2, X2, X1); /* t3 = C - B */ + vli_modMult_fast(Y1, Y1, X2); /* t2 = y1*(C - B) */ + vli_modSub_fast(X2, X1, t5); /* t3 = B - x3 */ + vli_modMult_fast(Y2, Y2, X2); /* t4 = (y2 - y1)*(B - x3) */ + vli_modSub_fast(Y2, Y2, Y1); /* t4 = y3 */ + + vli_set(X2, t5); +} + +/* Input P = (x1, y1, Z), Q = (x2, y2, Z) + Output P + Q = (x3, y3, Z3), P - Q = (x3', y3', Z3) + or P => P - Q, Q => P + Q +*/ +static void XYcZ_addC(uECC_word_t * RESTRICT X1, + uECC_word_t * RESTRICT Y1, + uECC_word_t * RESTRICT X2, + uECC_word_t * RESTRICT Y2) { + /* t1 = X1, t2 = Y1, t3 = X2, t4 = Y2 */ + uECC_word_t t5[uECC_WORDS]; + uECC_word_t t6[uECC_WORDS]; + uECC_word_t t7[uECC_WORDS]; + + vli_modSub_fast(t5, X2, X1); /* t5 = x2 - x1 */ + vli_modSquare_fast(t5, t5); /* t5 = (x2 - x1)^2 = A */ + vli_modMult_fast(X1, X1, t5); /* t1 = x1*A = B */ + vli_modMult_fast(X2, X2, t5); /* t3 = x2*A = C */ + vli_modAdd(t5, Y2, Y1, curve_p); /* t5 = y2 + y1 */ + vli_modSub_fast(Y2, Y2, Y1); /* t4 = y2 - y1 */ + + vli_modSub_fast(t6, X2, X1); /* t6 = C - B */ + vli_modMult_fast(Y1, Y1, t6); /* t2 = y1 * (C - B) = E */ + vli_modAdd(t6, X1, X2, curve_p); /* t6 = B + C */ + vli_modSquare_fast(X2, Y2); /* t3 = (y2 - y1)^2 = D */ + vli_modSub_fast(X2, X2, t6); /* t3 = D - (B + C) = x3 */ + + vli_modSub_fast(t7, X1, X2); /* t7 = B - x3 */ + vli_modMult_fast(Y2, Y2, t7); /* t4 = (y2 - y1)*(B - x3) */ + vli_modSub_fast(Y2, Y2, Y1); /* t4 = (y2 - y1)*(B - x3) - E = y3 */ + + vli_modSquare_fast(t7, t5); /* t7 = (y2 + y1)^2 = F */ + vli_modSub_fast(t7, t7, t6); /* t7 = F - (B + C) = x3' */ + vli_modSub_fast(t6, t7, X1); /* t6 = x3' - B */ + vli_modMult_fast(t6, t6, t5); /* t6 = (y2 + y1)*(x3' - B) */ + vli_modSub_fast(Y1, t6, Y1); /* t2 = (y2 + y1)*(x3' - B) - E = y3' */ + + vli_set(X1, t7); +} + +static void EccPoint_mult(EccPoint * RESTRICT result, + const EccPoint * RESTRICT point, + const uECC_word_t * RESTRICT scalar, + const uECC_word_t * RESTRICT initialZ, + bitcount_t numBits) { + /* R0 and R1 */ + uECC_word_t Rx[2][uECC_WORDS]; + uECC_word_t Ry[2][uECC_WORDS]; + uECC_word_t z[uECC_WORDS]; + bitcount_t i; + uECC_word_t nb; + + vli_set(Rx[1], point->x); + vli_set(Ry[1], point->y); + + XYcZ_initial_double(Rx[1], Ry[1], Rx[0], Ry[0], initialZ); + + for (i = numBits - 2; i > 0; --i) { + nb = !vli_testBit(scalar, i); + XYcZ_addC(Rx[1 - nb], Ry[1 - nb], Rx[nb], Ry[nb]); + XYcZ_add(Rx[nb], Ry[nb], Rx[1 - nb], Ry[1 - nb]); + } + + nb = !vli_testBit(scalar, 0); + XYcZ_addC(Rx[1 - nb], Ry[1 - nb], Rx[nb], Ry[nb]); + + /* Find final 1/Z value. */ + vli_modSub_fast(z, Rx[1], Rx[0]); /* X1 - X0 */ + vli_modMult_fast(z, z, Ry[1 - nb]); /* Yb * (X1 - X0) */ + vli_modMult_fast(z, z, point->x); /* xP * Yb * (X1 - X0) */ + vli_modInv(z, z, curve_p); /* 1 / (xP * Yb * (X1 - X0)) */ + vli_modMult_fast(z, z, point->y); /* yP / (xP * Yb * (X1 - X0)) */ + vli_modMult_fast(z, z, Rx[1 - nb]); /* Xb * yP / (xP * Yb * (X1 - X0)) */ + /* End 1/Z calculation */ + + XYcZ_add(Rx[nb], Ry[nb], Rx[1 - nb], Ry[1 - nb]); + apply_z(Rx[0], Ry[0], z); + + vli_set(result->x, Rx[0]); + vli_set(result->y, Ry[0]); +} + +static int EccPoint_compute_public_key(EccPoint *result, uECC_word_t *private) { +#if (uECC_CURVE != uECC_secp160r1) + uECC_word_t tmp1[uECC_WORDS]; + uECC_word_t tmp2[uECC_WORDS]; + uECC_word_t *p2[2] = {tmp1, tmp2}; + uECC_word_t carry; +#endif + + /* Make sure the private key is in the range [1, n-1]. */ + if (vli_isZero(private)) { + return 0; + } + +#if (uECC_CURVE == uECC_secp160r1) + // Don't regularize the bitcount for secp160r1, since it would have a larger performance + // impact (about 2% slower on average) and requires the vli_xxx_n functions, leading to + // a significant increase in code size. + + EccPoint_mult(result, &curve_G, private, 0, vli_numBits(private, uECC_WORDS)); +#else + if (vli_cmp(curve_n, private) != 1) { + return 0; + } + + // Regularize the bitcount for the private key so that attackers cannot use a side channel + // attack to learn the number of leading zeros. + carry = vli_add(tmp1, private, curve_n); + vli_add(tmp2, tmp1, curve_n); + EccPoint_mult(result, &curve_G, p2[!carry], 0, (uECC_BYTES * 8) + 1); +#endif + + if (EccPoint_isZero(result)) { + return 0; + } + return 1; +} + +#if uECC_CURVE == uECC_secp224r1 + +/* Routine 3.2.4 RS; from http://www.nsa.gov/ia/_files/nist-routines.pdf */ +static void mod_sqrt_secp224r1_rs(uECC_word_t *d1, + uECC_word_t *e1, + uECC_word_t *f1, + const uECC_word_t *d0, + const uECC_word_t *e0, + const uECC_word_t *f0) { + uECC_word_t t[uECC_WORDS]; + + vli_modSquare_fast(t, d0); /* t <-- d0 ^ 2 */ + vli_modMult_fast(e1, d0, e0); /* e1 <-- d0 * e0 */ + vli_modAdd(d1, t, f0, curve_p); /* d1 <-- t + f0 */ + vli_modAdd(e1, e1, e1, curve_p); /* e1 <-- e1 + e1 */ + vli_modMult_fast(f1, t, f0); /* f1 <-- t * f0 */ + vli_modAdd(f1, f1, f1, curve_p); /* f1 <-- f1 + f1 */ + vli_modAdd(f1, f1, f1, curve_p); /* f1 <-- f1 + f1 */ +} + +/* Routine 3.2.5 RSS; from http://www.nsa.gov/ia/_files/nist-routines.pdf */ +static void mod_sqrt_secp224r1_rss(uECC_word_t *d1, + uECC_word_t *e1, + uECC_word_t *f1, + const uECC_word_t *d0, + const uECC_word_t *e0, + const uECC_word_t *f0, + const bitcount_t j) { + bitcount_t i; + + vli_set(d1, d0); /* d1 <-- d0 */ + vli_set(e1, e0); /* e1 <-- e0 */ + vli_set(f1, f0); /* f1 <-- f0 */ + for (i = 1; i <= j; i++) { + mod_sqrt_secp224r1_rs(d1, e1, f1, d1, e1, f1); /* RS (d1,e1,f1,d1,e1,f1) */ + } +} + +/* Routine 3.2.6 RM; from http://www.nsa.gov/ia/_files/nist-routines.pdf */ +static void mod_sqrt_secp224r1_rm(uECC_word_t *d2, + uECC_word_t *e2, + uECC_word_t *f2, + const uECC_word_t *c, + const uECC_word_t *d0, + const uECC_word_t *e0, + const uECC_word_t *d1, + const uECC_word_t *e1) { + uECC_word_t t1[uECC_WORDS]; + uECC_word_t t2[uECC_WORDS]; + + vli_modMult_fast(t1, e0, e1); /* t1 <-- e0 * e1 */ + vli_modMult_fast(t1, t1, c); /* t1 <-- t1 * c */ + vli_modSub_fast(t1, curve_p, t1); /* t1 <-- p - t1 */ + vli_modMult_fast(t2, d0, d1); /* t2 <-- d0 * d1 */ + vli_modAdd(t2, t2, t1, curve_p); /* t2 <-- t2 + t1 */ + vli_modMult_fast(t1, d0, e1); /* t1 <-- d0 * e1 */ + vli_modMult_fast(e2, d1, e0); /* e2 <-- d1 * e0 */ + vli_modAdd(e2, e2, t1, curve_p); /* e2 <-- e2 + t1 */ + vli_modSquare_fast(f2, e2); /* f2 <-- e2^2 */ + vli_modMult_fast(f2, f2, c); /* f2 <-- f2 * c */ + vli_modSub_fast(f2, curve_p, f2); /* f2 <-- p - f2 */ + vli_set(d2, t2); /* d2 <-- t2 */ +} + +/* Routine 3.2.7 RP; from http://www.nsa.gov/ia/_files/nist-routines.pdf */ +static void mod_sqrt_secp224r1_rp(uECC_word_t *d1, + uECC_word_t *e1, + uECC_word_t *f1, + const uECC_word_t *c, + const uECC_word_t *r) { + wordcount_t i; + wordcount_t pow2i = 1; + uECC_word_t d0[uECC_WORDS]; + uECC_word_t e0[uECC_WORDS] = {1}; /* e0 <-- 1 */ + uECC_word_t f0[uECC_WORDS]; + + vli_set(d0, r); /* d0 <-- r */ + vli_modSub_fast(f0, curve_p, c); /* f0 <-- p - c */ + for (i = 0; i <= 6; i++) { + mod_sqrt_secp224r1_rss(d1, e1, f1, d0, e0, f0, pow2i); /* RSS (d1,e1,f1,d0,e0,f0,2^i) */ + mod_sqrt_secp224r1_rm(d1, e1, f1, c, d1, e1, d0, e0); /* RM (d1,e1,f1,c,d1,e1,d0,e0) */ + vli_set(d0, d1); /* d0 <-- d1 */ + vli_set(e0, e1); /* e0 <-- e1 */ + vli_set(f0, f1); /* f0 <-- f1 */ + pow2i *= 2; + } +} + +/* Compute a = sqrt(a) (mod curve_p). */ +/* Routine 3.2.8 mp_mod_sqrt_224; from http://www.nsa.gov/ia/_files/nist-routines.pdf */ +static void mod_sqrt(uECC_word_t *a) { + bitcount_t i; + uECC_word_t e1[uECC_WORDS]; + uECC_word_t f1[uECC_WORDS]; + uECC_word_t d0[uECC_WORDS]; + uECC_word_t e0[uECC_WORDS]; + uECC_word_t f0[uECC_WORDS]; + uECC_word_t d1[uECC_WORDS]; + + // s = a; using constant instead of random value + mod_sqrt_secp224r1_rp(d0, e0, f0, a, a); /* RP (d0, e0, f0, c, s) */ + mod_sqrt_secp224r1_rs(d1, e1, f1, d0, e0, f0); /* RS (d1, e1, f1, d0, e0, f0) */ + for (i = 1; i <= 95; i++) { + vli_set(d0, d1); /* d0 <-- d1 */ + vli_set(e0, e1); /* e0 <-- e1 */ + vli_set(f0, f1); /* f0 <-- f1 */ + mod_sqrt_secp224r1_rs(d1, e1, f1, d0, e0, f0); /* RS (d1, e1, f1, d0, e0, f0) */ + if (vli_isZero(d1)) { /* if d1 == 0 */ + break; + } + } + vli_modInv(f1, e0, curve_p); /* f1 <-- 1 / e0 */ + vli_modMult_fast(a, d0, f1); /* a <-- d0 / e0 */ +} + +#else /* uECC_CURVE */ + +/* Compute a = sqrt(a) (mod curve_p). */ +static void mod_sqrt(uECC_word_t *a) { + bitcount_t i; + uECC_word_t p1[uECC_WORDS] = {1}; + uECC_word_t l_result[uECC_WORDS] = {1}; + + /* Since curve_p == 3 (mod 4) for all supported curves, we can + compute sqrt(a) = a^((curve_p + 1) / 4) (mod curve_p). */ + vli_add(p1, curve_p, p1); /* p1 = curve_p + 1 */ + for (i = vli_numBits(p1, uECC_WORDS) - 1; i > 1; --i) { + vli_modSquare_fast(l_result, l_result); + if (vli_testBit(p1, i)) { + vli_modMult_fast(l_result, l_result, a); + } + } + vli_set(a, l_result); +} +#endif /* uECC_CURVE */ + +#if uECC_WORD_SIZE == 1 + +static void vli_nativeToBytes(uint8_t * RESTRICT dest, const uint8_t * RESTRICT src) { + uint8_t i; + for (i = 0; i < uECC_BYTES; ++i) { + dest[i] = src[(uECC_BYTES - 1) - i]; + } +} + +#define vli_bytesToNative(dest, src) vli_nativeToBytes((dest), (src)) + +#elif uECC_WORD_SIZE == 4 + +static void vli_nativeToBytes(uint8_t *bytes, const uint32_t *native) { + unsigned i; + for (i = 0; i < uECC_WORDS; ++i) { + uint8_t *digit = bytes + 4 * (uECC_WORDS - 1 - i); + digit[0] = (uint8_t)(native[i] >> 24); + digit[1] = (uint8_t)(native[i] >> 16); + digit[2] = (uint8_t)(native[i] >> 8); + digit[3] = (uint8_t)(native[i]); + } +} + +static void vli_bytesToNative(uint32_t *native, const uint8_t *bytes) { + unsigned i; + for (i = 0; i < uECC_WORDS; ++i) { + const uint8_t *digit = bytes + 4 * (uECC_WORDS - 1 - i); + native[i] = ((uint32_t)digit[0] << 24) | ((uint32_t)digit[1] << 16) | + ((uint32_t)digit[2] << 8) | (uint32_t)digit[3]; + } +} + +#else + +static void vli_nativeToBytes(uint8_t *bytes, const uint64_t *native) { + unsigned i; + for (i = 0; i < uECC_WORDS; ++i) { + uint8_t *digit = bytes + 8 * (uECC_WORDS - 1 - i); + digit[0] = native[i] >> 56; + digit[1] = native[i] >> 48; + digit[2] = native[i] >> 40; + digit[3] = native[i] >> 32; + digit[4] = native[i] >> 24; + digit[5] = native[i] >> 16; + digit[6] = native[i] >> 8; + digit[7] = native[i]; + } +} + +static void vli_bytesToNative(uint64_t *native, const uint8_t *bytes) { + unsigned i; + for (i = 0; i < uECC_WORDS; ++i) { + const uint8_t *digit = bytes + 8 * (uECC_WORDS - 1 - i); + native[i] = ((uint64_t)digit[0] << 56) | ((uint64_t)digit[1] << 48) | + ((uint64_t)digit[2] << 40) | ((uint64_t)digit[3] << 32) | + ((uint64_t)digit[4] << 24) | ((uint64_t)digit[5] << 16) | + ((uint64_t)digit[6] << 8) | (uint64_t)digit[7]; + } +} + +#endif /* uECC_WORD_SIZE */ + +int uECC_make_key(uint8_t public_key[uECC_BYTES*2], uint8_t private_key[uECC_BYTES]) { + uECC_word_t private[uECC_WORDS]; + EccPoint public; + uECC_word_t tries; + for (tries = 0; tries < MAX_TRIES; ++tries) { + if (g_rng_function((uint8_t *)private, sizeof(private)) && + EccPoint_compute_public_key(&public, private)) { + vli_nativeToBytes(private_key, private); + vli_nativeToBytes(public_key, public.x); + vli_nativeToBytes(public_key + uECC_BYTES, public.y); + return 1; + } + } + return 0; +} + +int uECC_shared_secret(const uint8_t public_key[uECC_BYTES*2], + const uint8_t private_key[uECC_BYTES], + uint8_t secret[uECC_BYTES]) { + EccPoint public; + EccPoint product; + uECC_word_t private[uECC_WORDS]; + uECC_word_t random[uECC_WORDS]; + uECC_word_t *initial_Z = 0; + uECC_word_t tries; +#if (uECC_CURVE != uECC_secp160r1) + uECC_word_t tmp[uECC_WORDS]; + uECC_word_t *p2[2] = {private, tmp}; + uECC_word_t carry; +#endif + + // Try to get a random initial Z value to improve protection against side-channel + // attacks. If the RNG fails every time (eg it was not defined), we continue so that + // uECC_shared_secret() can still work without an RNG defined. + for (tries = 0; tries < MAX_TRIES; ++tries) { + if (g_rng_function((uint8_t *)random, sizeof(random)) && !vli_isZero(random)) { + initial_Z = random; + break; + } + } + + vli_bytesToNative(private, private_key); + vli_bytesToNative(public.x, public_key); + vli_bytesToNative(public.y, public_key + uECC_BYTES); + +#if (uECC_CURVE == uECC_secp160r1) + // Don't regularize the bitcount for secp160r1. + EccPoint_mult(&product, &public, private, initial_Z, vli_numBits(private, uECC_WORDS)); +#else + // Regularize the bitcount for the private key so that attackers cannot use a side channel + // attack to learn the number of leading zeros. + carry = vli_add(private, private, curve_n); + vli_add(tmp, private, curve_n); + EccPoint_mult(&product, &public, p2[!carry], initial_Z, (uECC_BYTES * 8) + 1); +#endif + + vli_nativeToBytes(secret, product.x); + return !EccPoint_isZero(&product); +} + +void uECC_compress(const uint8_t public_key[uECC_BYTES*2], uint8_t compressed[uECC_BYTES+1]) { + wordcount_t i; + for (i = 0; i < uECC_BYTES; ++i) { + compressed[i+1] = public_key[i]; + } + compressed[0] = 2 + (public_key[uECC_BYTES * 2 - 1] & 0x01); +} + +/* Computes result = x^3 + ax + b. result must not overlap x. */ +static void curve_x_side(uECC_word_t * RESTRICT result, const uECC_word_t * RESTRICT x) { +#if (uECC_CURVE == uECC_secp256k1) + vli_modSquare_fast(result, x); /* r = x^2 */ + vli_modMult_fast(result, result, x); /* r = x^3 */ + vli_modAdd(result, result, curve_b, curve_p); /* r = x^3 + b */ +#else + uECC_word_t _3[uECC_WORDS] = {3}; /* -a = 3 */ + + vli_modSquare_fast(result, x); /* r = x^2 */ + vli_modSub_fast(result, result, _3); /* r = x^2 - 3 */ + vli_modMult_fast(result, result, x); /* r = x^3 - 3x */ + vli_modAdd(result, result, curve_b, curve_p); /* r = x^3 - 3x + b */ +#endif +} + +void uECC_decompress(const uint8_t compressed[uECC_BYTES+1], uint8_t public_key[uECC_BYTES*2]) { + EccPoint point; + vli_bytesToNative(point.x, compressed + 1); + curve_x_side(point.y, point.x); + mod_sqrt(point.y); + + if ((point.y[0] & 0x01) != (compressed[0] & 0x01)) { + vli_sub(point.y, curve_p, point.y); + } + + vli_nativeToBytes(public_key, point.x); + vli_nativeToBytes(public_key + uECC_BYTES, point.y); +} + +int uECC_valid_public_key(const uint8_t public_key[uECC_BYTES*2]) { + uECC_word_t tmp1[uECC_WORDS]; + uECC_word_t tmp2[uECC_WORDS]; + EccPoint public; + + vli_bytesToNative(public.x, public_key); + vli_bytesToNative(public.y, public_key + uECC_BYTES); + + // The point at infinity is invalid. + if (EccPoint_isZero(&public)) { + return 0; + } + + // x and y must be smaller than p. + if (vli_cmp(curve_p, public.x) != 1 || vli_cmp(curve_p, public.y) != 1) { + return 0; + } + + vli_modSquare_fast(tmp1, public.y); /* tmp1 = y^2 */ + curve_x_side(tmp2, public.x); /* tmp2 = x^3 + ax + b */ + + /* Make sure that y^2 == x^3 + ax + b */ + return (vli_cmp(tmp1, tmp2) == 0); +} + +int uECC_compute_public_key(const uint8_t private_key[uECC_BYTES], + uint8_t public_key[uECC_BYTES * 2]) { + uECC_word_t private[uECC_WORDS]; + EccPoint public; + + vli_bytesToNative(private, private_key); + + if (!EccPoint_compute_public_key(&public, private)) { + return 0; + } + + vli_nativeToBytes(public_key, public.x); + vli_nativeToBytes(public_key + uECC_BYTES, public.y); + return 1; +} + +int uECC_bytes(void) { + return uECC_BYTES; +} + +int uECC_curve(void) { + return uECC_CURVE; +} + +/* -------- ECDSA code -------- */ + +#if (uECC_CURVE == uECC_secp160r1) +static void vli_clear_n(uECC_word_t *vli) { + vli_clear(vli); + vli[uECC_N_WORDS - 1] = 0; +} + +static uECC_word_t vli_isZero_n(const uECC_word_t *vli) { + if (vli[uECC_N_WORDS - 1]) { + return 0; + } + return vli_isZero(vli); +} + +static void vli_set_n(uECC_word_t *dest, const uECC_word_t *src) { + vli_set(dest, src); + dest[uECC_N_WORDS - 1] = src[uECC_N_WORDS - 1]; +} + +static cmpresult_t vli_cmp_n(const uECC_word_t *left, const uECC_word_t *right) { + if (left[uECC_N_WORDS - 1] > right[uECC_N_WORDS - 1]) { + return 1; + } else if (left[uECC_N_WORDS - 1] < right[uECC_N_WORDS - 1]) { + return -1; + } + return vli_cmp(left, right); +} + +static void vli_rshift1_n(uECC_word_t *vli) { + vli_rshift1(vli); + vli[uECC_N_WORDS - 2] |= vli[uECC_N_WORDS - 1] << (uECC_WORD_BITS - 1); + vli[uECC_N_WORDS - 1] = vli[uECC_N_WORDS - 1] >> 1; +} + +static uECC_word_t vli_add_n(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right) { + uECC_word_t carry = vli_add(result, left, right); + uECC_word_t sum = left[uECC_N_WORDS - 1] + right[uECC_N_WORDS - 1] + carry; + if (sum != left[uECC_N_WORDS - 1]) { + carry = (sum < left[uECC_N_WORDS - 1]); + } + result[uECC_N_WORDS - 1] = sum; + return carry; +} + +static uECC_word_t vli_sub_n(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right) { + uECC_word_t borrow = vli_sub(result, left, right); + uECC_word_t diff = left[uECC_N_WORDS - 1] - right[uECC_N_WORDS - 1] - borrow; + if (diff != left[uECC_N_WORDS - 1]) { + borrow = (diff > left[uECC_N_WORDS - 1]); + } + result[uECC_N_WORDS - 1] = diff; + return borrow; +} + +#if !muladd_exists +static void muladd(uECC_word_t a, + uECC_word_t b, + uECC_word_t *r0, + uECC_word_t *r1, + uECC_word_t *r2) { + uECC_dword_t p = (uECC_dword_t)a * b; + uECC_dword_t r01 = ((uECC_dword_t)(*r1) << uECC_WORD_BITS) | *r0; + r01 += p; + *r2 += (r01 < p); + *r1 = r01 >> uECC_WORD_BITS; + *r0 = (uECC_word_t)r01; +} +#define muladd_exists 1 +#endif + +static void vli_mult_n(uECC_word_t *result, const uECC_word_t *left, const uECC_word_t *right) { + uECC_word_t r0 = 0; + uECC_word_t r1 = 0; + uECC_word_t r2 = 0; + wordcount_t i, k; + + for (k = 0; k < uECC_N_WORDS * 2 - 1; ++k) { + wordcount_t min = (k < uECC_N_WORDS ? 0 : (k + 1) - uECC_N_WORDS); + wordcount_t max = (k < uECC_N_WORDS ? k : uECC_N_WORDS - 1); + for (i = min; i <= max; ++i) { + muladd(left[i], right[k - i], &r0, &r1, &r2); + } + result[k] = r0; + r0 = r1; + r1 = r2; + r2 = 0; + } + result[uECC_N_WORDS * 2 - 1] = r0; +} + +static void vli_modAdd_n(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right, + const uECC_word_t *mod) { + uECC_word_t carry = vli_add_n(result, left, right); + if (carry || vli_cmp_n(result, mod) >= 0) { + vli_sub_n(result, result, mod); + } +} + +static void vli_modInv_n(uECC_word_t *result, const uECC_word_t *input, const uECC_word_t *mod) { + uECC_word_t a[uECC_N_WORDS], b[uECC_N_WORDS], u[uECC_N_WORDS], v[uECC_N_WORDS]; + uECC_word_t carry; + cmpresult_t cmpResult; + + if (vli_isZero_n(input)) { + vli_clear_n(result); + return; + } + + vli_set_n(a, input); + vli_set_n(b, mod); + vli_clear_n(u); + u[0] = 1; + vli_clear_n(v); + while ((cmpResult = vli_cmp_n(a, b)) != 0) { + carry = 0; + if (EVEN(a)) { + vli_rshift1_n(a); + if (!EVEN(u)) { + carry = vli_add_n(u, u, mod); + } + vli_rshift1_n(u); + if (carry) { + u[uECC_N_WORDS - 1] |= HIGH_BIT_SET; + } + } else if (EVEN(b)) { + vli_rshift1_n(b); + if (!EVEN(v)) { + carry = vli_add_n(v, v, mod); + } + vli_rshift1_n(v); + if (carry) { + v[uECC_N_WORDS - 1] |= HIGH_BIT_SET; + } + } else if (cmpResult > 0) { + vli_sub_n(a, a, b); + vli_rshift1_n(a); + if (vli_cmp_n(u, v) < 0) { + vli_add_n(u, u, mod); + } + vli_sub_n(u, u, v); + if (!EVEN(u)) { + carry = vli_add_n(u, u, mod); + } + vli_rshift1_n(u); + if (carry) { + u[uECC_N_WORDS - 1] |= HIGH_BIT_SET; + } + } else { + vli_sub_n(b, b, a); + vli_rshift1_n(b); + if (vli_cmp_n(v, u) < 0) { + vli_add_n(v, v, mod); + } + vli_sub_n(v, v, u); + if (!EVEN(v)) { + carry = vli_add_n(v, v, mod); + } + vli_rshift1_n(v); + if (carry) { + v[uECC_N_WORDS - 1] |= HIGH_BIT_SET; + } + } + } + vli_set_n(result, u); +} + +static void vli2_rshift1_n(uECC_word_t *vli) { + vli_rshift1_n(vli); + vli[uECC_N_WORDS - 1] |= vli[uECC_N_WORDS] << (uECC_WORD_BITS - 1); + vli_rshift1_n(vli + uECC_N_WORDS); +} + +static uECC_word_t vli2_sub_n(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right) { + uECC_word_t borrow = 0; + wordcount_t i; + for (i = 0; i < uECC_N_WORDS * 2; ++i) { + uECC_word_t diff = left[i] - right[i] - borrow; + if (diff != left[i]) { + borrow = (diff > left[i]); + } + result[i] = diff; + } + return borrow; +} + +/* Computes result = (left * right) % curve_n. */ +static void vli_modMult_n(uECC_word_t *result, const uECC_word_t *left, const uECC_word_t *right) { + bitcount_t i; + uECC_word_t product[2 * uECC_N_WORDS]; + uECC_word_t modMultiple[2 * uECC_N_WORDS]; + uECC_word_t tmp[2 * uECC_N_WORDS]; + uECC_word_t *v[2] = {tmp, product}; + uECC_word_t index = 1; + + vli_mult_n(product, left, right); + vli_clear_n(modMultiple); + vli_set(modMultiple + uECC_N_WORDS + 1, curve_n); + vli_rshift1(modMultiple + uECC_N_WORDS + 1); + modMultiple[2 * uECC_N_WORDS - 1] |= HIGH_BIT_SET; + modMultiple[uECC_N_WORDS] = HIGH_BIT_SET; + + for (i = 0; + i <= ((((bitcount_t)uECC_N_WORDS) << uECC_WORD_BITS_SHIFT) + (uECC_WORD_BITS - 1)); + ++i) { + uECC_word_t borrow = vli2_sub_n(v[1 - index], v[index], modMultiple); + index = !(index ^ borrow); /* Swap the index if there was no borrow */ + vli2_rshift1_n(modMultiple); + } + vli_set_n(result, v[index]); +} + +#else + +#define vli_cmp_n vli_cmp +#define vli_modInv_n vli_modInv +#define vli_modAdd_n vli_modAdd + +static void vli2_rshift1(uECC_word_t *vli) { + vli_rshift1(vli); + vli[uECC_WORDS - 1] |= vli[uECC_WORDS] << (uECC_WORD_BITS - 1); + vli_rshift1(vli + uECC_WORDS); +} + +static uECC_word_t vli2_sub(uECC_word_t *result, + const uECC_word_t *left, + const uECC_word_t *right) { + uECC_word_t borrow = 0; + wordcount_t i; + for (i = 0; i < uECC_WORDS * 2; ++i) { + uECC_word_t diff = left[i] - right[i] - borrow; + if (diff != left[i]) { + borrow = (diff > left[i]); + } + result[i] = diff; + } + return borrow; +} + +/* Computes result = (left * right) % curve_n. */ +static void vli_modMult_n(uECC_word_t *result, const uECC_word_t *left, const uECC_word_t *right) { + uECC_word_t product[2 * uECC_WORDS]; + uECC_word_t modMultiple[2 * uECC_WORDS]; + uECC_word_t tmp[2 * uECC_WORDS]; + uECC_word_t *v[2] = {tmp, product}; + bitcount_t i; + uECC_word_t index = 1; + + vli_mult(product, left, right); + vli_set(modMultiple + uECC_WORDS, curve_n); /* works if curve_n has its highest bit set */ + vli_clear(modMultiple); + + for (i = 0; i <= uECC_BYTES * 8; ++i) { + uECC_word_t borrow = vli2_sub(v[1 - index], v[index], modMultiple); + index = !(index ^ borrow); /* Swap the index if there was no borrow */ + vli2_rshift1(modMultiple); + } + vli_set(result, v[index]); +} +#endif /* (uECC_CURVE != uECC_secp160r1) */ + +static int uECC_sign_with_k(const uint8_t private_key[uECC_BYTES], + const uint8_t message_hash[uECC_BYTES], + uECC_word_t k[uECC_N_WORDS], + uint8_t signature[uECC_BYTES*2]) { + uECC_word_t tmp[uECC_N_WORDS]; + uECC_word_t s[uECC_N_WORDS]; + uECC_word_t *k2[2] = {tmp, s}; + EccPoint p; + uECC_word_t carry; + uECC_word_t tries; + + /* Make sure 0 < k < curve_n */ + if (vli_isZero(k) || vli_cmp_n(curve_n, k) != 1) { + return 0; + } + +#if (uECC_CURVE == uECC_secp160r1) + /* Make sure that we don't leak timing information about k. + See http://eprint.iacr.org/2011/232.pdf */ + vli_add_n(tmp, k, curve_n); + carry = (tmp[uECC_WORDS] & 0x02); + vli_add_n(s, tmp, curve_n); + + /* p = k * G */ + EccPoint_mult(&p, &curve_G, k2[!carry], 0, (uECC_BYTES * 8) + 2); +#else + /* Make sure that we don't leak timing information about k. + See http://eprint.iacr.org/2011/232.pdf */ + carry = vli_add(tmp, k, curve_n); + vli_add(s, tmp, curve_n); + + /* p = k * G */ + EccPoint_mult(&p, &curve_G, k2[!carry], 0, (uECC_BYTES * 8) + 1); + + /* r = x1 (mod n) */ + if (vli_cmp(curve_n, p.x) != 1) { + vli_sub(p.x, p.x, curve_n); + } +#endif + if (vli_isZero(p.x)) { + return 0; + } + + // Attempt to get a random number to prevent side channel analysis of k. + // If the RNG fails every time (eg it was not defined), we continue so that + // deterministic signing can still work (with reduced security) without + // an RNG defined. + carry = 0; // use to signal that the RNG succeeded at least once. + for (tries = 0; tries < MAX_TRIES; ++tries) { + if (!g_rng_function((uint8_t *)tmp, sizeof(tmp))) { + continue; + } + carry = 1; + if (!vli_isZero(tmp)) { + break; + } + } + if (!carry) { + vli_clear(tmp); + tmp[0] = 1; + } + + /* Prevent side channel analysis of vli_modInv() to determine + bits of k / the private key by premultiplying by a random number */ + vli_modMult_n(k, k, tmp); /* k' = rand * k */ + vli_modInv_n(k, k, curve_n); /* k = 1 / k' */ + vli_modMult_n(k, k, tmp); /* k = 1 / k */ + + vli_nativeToBytes(signature, p.x); /* store r */ + + tmp[uECC_N_WORDS - 1] = 0; + vli_bytesToNative(tmp, private_key); /* tmp = d */ + s[uECC_N_WORDS - 1] = 0; + vli_set(s, p.x); + vli_modMult_n(s, tmp, s); /* s = r*d */ + + vli_bytesToNative(tmp, message_hash); + vli_modAdd_n(s, tmp, s, curve_n); /* s = e + r*d */ + vli_modMult_n(s, s, k); /* s = (e + r*d) / k */ +#if (uECC_CURVE == uECC_secp160r1) + if (s[uECC_N_WORDS - 1]) { + return 0; + } +#endif + vli_nativeToBytes(signature + uECC_BYTES, s); + return 1; +} + +int uECC_sign(const uint8_t private_key[uECC_BYTES], + const uint8_t message_hash[uECC_BYTES], + uint8_t signature[uECC_BYTES*2]) { + uECC_word_t k[uECC_N_WORDS]; +/* uECC_word_t tmp[uECC_N_WORDS]; */ /* -Wunused-variable */ +/* uECC_word_t s[uECC_N_WORDS]; */ /* -Wunused-variable */ +/* uECC_word_t *k2[2] = {tmp, s}; */ /* -Wunused-variable */ +/* EccPoint p; */ /* -Wunused-variable */ + uECC_word_t tries; + + for (tries = 0; tries < MAX_TRIES; ++tries) { + if(g_rng_function((uint8_t *)k, sizeof(k))) { + #if (uECC_CURVE == uECC_secp160r1) + k[uECC_WORDS] &= 0x01; + #endif + if (uECC_sign_with_k(private_key, message_hash, k, signature)) { + return 1; + } + } + } + return 0; +} + +/* Compute an HMAC using K as a key (as in RFC 6979). Note that K is always + the same size as the hash result size. */ +static void HMAC_init(uECC_HashContext *hash_context, const uint8_t *K) { + uint8_t *pad = hash_context->tmp + 2 * hash_context->result_size; + unsigned i; + for (i = 0; i < hash_context->result_size; ++i) + pad[i] = K[i] ^ 0x36; + for (; i < hash_context->block_size; ++i) + pad[i] = 0x36; + + hash_context->init_hash(hash_context); + hash_context->update_hash(hash_context, pad, hash_context->block_size); +} + +static void HMAC_update(uECC_HashContext *hash_context, + const uint8_t *message, + unsigned message_size) { + hash_context->update_hash(hash_context, message, message_size); +} + +static void HMAC_finish(uECC_HashContext *hash_context, const uint8_t *K, uint8_t *result) { + uint8_t *pad = hash_context->tmp + 2 * hash_context->result_size; + unsigned i; + for (i = 0; i < hash_context->result_size; ++i) + pad[i] = K[i] ^ 0x5c; + for (; i < hash_context->block_size; ++i) + pad[i] = 0x5c; + + hash_context->finish_hash(hash_context, result); + + hash_context->init_hash(hash_context); + hash_context->update_hash(hash_context, pad, hash_context->block_size); + hash_context->update_hash(hash_context, result, hash_context->result_size); + hash_context->finish_hash(hash_context, result); +} + +/* V = HMAC_K(V) */ +static void update_V(uECC_HashContext *hash_context, uint8_t *K, uint8_t *V) { + HMAC_init(hash_context, K); + HMAC_update(hash_context, V, hash_context->result_size); + HMAC_finish(hash_context, K, V); +} + +/* Deterministic signing, similar to RFC 6979. Differences are: + * We just use (truncated) H(m) directly rather than bits2octets(H(m)) + (it is not reduced modulo curve_n). + * We generate a value for k (aka T) directly rather than converting endianness. + + Layout of hash_context->tmp: | | (1 byte overlapped 0x00 or 0x01) / */ +int uECC_sign_deterministic(const uint8_t private_key[uECC_BYTES], + const uint8_t message_hash[uECC_BYTES], + uECC_HashContext *hash_context, + uint8_t signature[uECC_BYTES*2]) { + uint8_t *K = hash_context->tmp; + uint8_t *V = K + hash_context->result_size; + uECC_word_t tries; + unsigned i; + for (i = 0; i < hash_context->result_size; ++i) { + V[i] = 0x01; + K[i] = 0; + } + + // K = HMAC_K(V || 0x00 || int2octets(x) || h(m)) + HMAC_init(hash_context, K); + V[hash_context->result_size] = 0x00; + HMAC_update(hash_context, V, hash_context->result_size + 1); + HMAC_update(hash_context, private_key, uECC_BYTES); + HMAC_update(hash_context, message_hash, uECC_BYTES); + HMAC_finish(hash_context, K, K); + + update_V(hash_context, K, V); + + // K = HMAC_K(V || 0x01 || int2octets(x) || h(m)) + HMAC_init(hash_context, K); + V[hash_context->result_size] = 0x01; + HMAC_update(hash_context, V, hash_context->result_size + 1); + HMAC_update(hash_context, private_key, uECC_BYTES); + HMAC_update(hash_context, message_hash, uECC_BYTES); + HMAC_finish(hash_context, K, K); + + update_V(hash_context, K, V); + + for (tries = 0; tries < MAX_TRIES; ++tries) { + uECC_word_t T[uECC_N_WORDS]; + uint8_t *T_ptr = (uint8_t *)T; + unsigned T_bytes = 0; + while (T_bytes < sizeof(T)) { + update_V(hash_context, K, V); + for (i = 0; i < hash_context->result_size && T_bytes < sizeof(T); ++i, ++T_bytes) { + T_ptr[T_bytes] = V[i]; + } + } + #if (uECC_CURVE == uECC_secp160r1) + T[uECC_WORDS] &= 0x01; + #endif + + if (uECC_sign_with_k(private_key, message_hash, T, signature)) { + return 1; + } + + // K = HMAC_K(V || 0x00) + HMAC_init(hash_context, K); + V[hash_context->result_size] = 0x00; + HMAC_update(hash_context, V, hash_context->result_size + 1); + HMAC_finish(hash_context, K, K); + + update_V(hash_context, K, V); + } + return 0; +} + +static bitcount_t smax(bitcount_t a, bitcount_t b) { + return (a > b ? a : b); +} + +int uECC_verify(const uint8_t public_key[uECC_BYTES*2], + const uint8_t hash[uECC_BYTES], + const uint8_t signature[uECC_BYTES*2]) { + uECC_word_t u1[uECC_N_WORDS], u2[uECC_N_WORDS]; + uECC_word_t z[uECC_N_WORDS]; + EccPoint public, sum; + uECC_word_t rx[uECC_WORDS]; + uECC_word_t ry[uECC_WORDS]; + uECC_word_t tx[uECC_WORDS]; + uECC_word_t ty[uECC_WORDS]; + uECC_word_t tz[uECC_WORDS]; + const EccPoint *points[4]; + const EccPoint *point; + bitcount_t numBits; + bitcount_t i; + uECC_word_t r[uECC_N_WORDS], s[uECC_N_WORDS]; + r[uECC_N_WORDS - 1] = 0; + s[uECC_N_WORDS - 1] = 0; + + vli_bytesToNative(public.x, public_key); + vli_bytesToNative(public.y, public_key + uECC_BYTES); + vli_bytesToNative(r, signature); + vli_bytesToNative(s, signature + uECC_BYTES); + + if (vli_isZero(r) || vli_isZero(s)) { /* r, s must not be 0. */ + return 0; + } + +#if (uECC_CURVE != uECC_secp160r1) + if (vli_cmp(curve_n, r) != 1 || vli_cmp(curve_n, s) != 1) { /* r, s must be < n. */ + return 0; + } +#endif + + /* Calculate u1 and u2. */ + vli_modInv_n(z, s, curve_n); /* Z = s^-1 */ + u1[uECC_N_WORDS - 1] = 0; + vli_bytesToNative(u1, hash); + vli_modMult_n(u1, u1, z); /* u1 = e/s */ + vli_modMult_n(u2, r, z); /* u2 = r/s */ + + /* Calculate sum = G + Q. */ + vli_set(sum.x, public.x); + vli_set(sum.y, public.y); + vli_set(tx, curve_G.x); + vli_set(ty, curve_G.y); + vli_modSub_fast(z, sum.x, tx); /* Z = x2 - x1 */ + XYcZ_add(tx, ty, sum.x, sum.y); + vli_modInv(z, z, curve_p); /* Z = 1/Z */ + apply_z(sum.x, sum.y, z); + + /* Use Shamir's trick to calculate u1*G + u2*Q */ + points[0] = 0; + points[1] = &curve_G; + points[2] = &public; + points[3] = ∑ + numBits = smax(vli_numBits(u1, uECC_N_WORDS), vli_numBits(u2, uECC_N_WORDS)); + + point = points[(!!vli_testBit(u1, numBits - 1)) | ((!!vli_testBit(u2, numBits - 1)) << 1)]; + vli_set(rx, point->x); + vli_set(ry, point->y); + vli_clear(z); + z[0] = 1; + + for (i = numBits - 2; i >= 0; --i) { + uECC_word_t index; + EccPoint_double_jacobian(rx, ry, z); + + index = (!!vli_testBit(u1, i)) | ((!!vli_testBit(u2, i)) << 1); + point = points[index]; + if (point) { + vli_set(tx, point->x); + vli_set(ty, point->y); + apply_z(tx, ty, z); + vli_modSub_fast(tz, rx, tx); /* Z = x2 - x1 */ + XYcZ_add(tx, ty, rx, ry); + vli_modMult_fast(z, z, tz); + } + } + + vli_modInv(z, z, curve_p); /* Z = 1/Z */ + apply_z(rx, ry, z); + + /* v = x1 (mod n) */ +#if (uECC_CURVE != uECC_secp160r1) + if (vli_cmp(curve_n, rx) != 1) { + vli_sub(rx, rx, curve_n); + } +#endif + + /* Accept only if v == r. */ + return vli_equal(rx, r); +} diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/uecc/uECC.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/uecc/uECC.h new file mode 100644 index 0000000000..267c7cb394 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/uecc/uECC.h @@ -0,0 +1,301 @@ +/* Copyright 2014, Kenneth MacKay. Licensed under the BSD 2-clause license. */ + +#ifndef _MICRO_ECC_H_ +#define _MICRO_ECC_H_ + +#include "wsf_types.h" + +/* Platform selection options. +If uECC_PLATFORM is not defined, the code will try to guess it based on compiler macros. +Possible values for uECC_PLATFORM are defined below: */ +#define uECC_arch_other 0 +#define uECC_x86 1 +#define uECC_x86_64 2 +#define uECC_arm 3 +#define uECC_arm_thumb 4 +#define uECC_avr 5 +#define uECC_arm_thumb2 6 + +/* If desired, you can define uECC_WORD_SIZE as appropriate for your platform (1, 4, or 8 bytes). +If uECC_WORD_SIZE is not explicitly defined then it will be automatically set based on your +platform. */ + +/* Inline assembly options. +uECC_asm_none - Use standard C99 only. +uECC_asm_small - Use GCC inline assembly for the target platform (if available), optimized for + minimum size. +uECC_asm_fast - Use GCC inline assembly optimized for maximum speed. */ +#define uECC_asm_none 0 +#define uECC_asm_small 1 +#define uECC_asm_fast 2 +#ifndef uECC_ASM + #define uECC_ASM uECC_asm_fast +#endif + +/* Curve selection options. */ +#define uECC_secp160r1 1 +#define uECC_secp192r1 2 +#define uECC_secp256r1 3 +#define uECC_secp256k1 4 +#define uECC_secp224r1 5 +#ifndef uECC_CURVE + #define uECC_CURVE uECC_secp256r1 +#endif + +/* uECC_SQUARE_FUNC - If enabled (defined as nonzero), this will cause a specific function to be +used for (scalar) squaring instead of the generic multiplication function. This will make things +faster by about 8% but increases the code size. */ +#ifndef uECC_SQUARE_FUNC + #define uECC_SQUARE_FUNC 1 +#endif + +#define uECC_CONCAT1(a, b) a##b +#define uECC_CONCAT(a, b) uECC_CONCAT1(a, b) + +#define uECC_size_1 20 /* secp160r1 */ +#define uECC_size_2 24 /* secp192r1 */ +#define uECC_size_3 32 /* secp256r1 */ +#define uECC_size_4 32 /* secp256k1 */ +#define uECC_size_5 28 /* secp224r1 */ + +#define uECC_BYTES uECC_CONCAT(uECC_size_, uECC_CURVE) + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* uECC_RNG_Function type +The RNG function should fill 'size' random bytes into 'dest'. It should return 1 if +'dest' was filled with random data, or 0 if the random data could not be generated. +The filled-in values should be either truly random, or from a cryptographically-secure PRNG. + +A correctly functioning RNG function must be set (using uECC_set_rng()) before calling +uECC_make_key() or uECC_sign(). + +Setting a correctly functioning RNG function improves the resistance to side-channel attacks +for uECC_shared_secret() and uECC_sign_deterministic(). + +A correct RNG function is set by default when building for Windows, Linux, or OS X. +If you are building on another POSIX-compliant system that supports /dev/random or /dev/urandom, +you can define uECC_POSIX to use the predefined RNG. For embedded platforms there is no predefined +RNG function; you must provide your own. +*/ +typedef int (*uECC_RNG_Function)(uint8_t *dest, unsigned size); + +/* uECC_set_rng() function. +Set the function that will be used to generate random bytes. The RNG function should +return 1 if the random data was generated, or 0 if the random data could not be generated. + +On platforms where there is no predefined RNG function (eg embedded platforms), this must +be called before uECC_make_key() or uECC_sign() are used. + +Inputs: + rng_function - The function that will be used to generate random bytes. +*/ +void uECC_set_rng(uECC_RNG_Function rng_function); + +/* uECC_make_key() function. +Create a public/private key pair. + +Outputs: + public_key - Will be filled in with the public key. + private_key - Will be filled in with the private key. + +Returns 1 if the key pair was generated successfully, 0 if an error occurred. +*/ +int uECC_make_key(uint8_t public_key[uECC_BYTES*2], uint8_t private_key[uECC_BYTES]); + +/* uECC_shared_secret() function. +Compute a shared secret given your secret key and someone else's public key. +Note: It is recommended that you hash the result of uECC_shared_secret() before using it for +symmetric encryption or HMAC. + +Inputs: + public_key - The public key of the remote party. + private_key - Your private key. + +Outputs: + secret - Will be filled in with the shared secret value. + +Returns 1 if the shared secret was generated successfully, 0 if an error occurred. +*/ +int uECC_shared_secret(const uint8_t public_key[uECC_BYTES*2], + const uint8_t private_key[uECC_BYTES], + uint8_t secret[uECC_BYTES]); + +/* uECC_sign() function. +Generate an ECDSA signature for a given hash value. + +Usage: Compute a hash of the data you wish to sign (SHA-2 is recommended) and pass it in to +this function along with your private key. + +Inputs: + private_key - Your private key. + message_hash - The hash of the message to sign. + +Outputs: + signature - Will be filled in with the signature value. + +Returns 1 if the signature generated successfully, 0 if an error occurred. +*/ +int uECC_sign(const uint8_t private_key[uECC_BYTES], + const uint8_t message_hash[uECC_BYTES], + uint8_t signature[uECC_BYTES*2]); + +/* uECC_HashContext structure. +This is used to pass in an arbitrary hash function to uECC_sign_deterministic(). +The structure will be used for multiple hash computations; each time a new hash +is computed, init_hash() will be called, followed by one or more calls to +update_hash(), and finally a call to finish_hash() to prudoce the resulting hash. + +The intention is that you will create a structure that includes uECC_HashContext +followed by any hash-specific data. For example: + +typedef struct SHA256_HashContext { + uECC_HashContext uECC; + SHA256_CTX ctx; +} SHA256_HashContext; + +void init_SHA256(uECC_HashContext *base) { + SHA256_HashContext *context = (SHA256_HashContext *)base; + SHA256_Init(&context->ctx); +} + +void update_SHA256(uECC_HashContext *base, + const uint8_t *message, + unsigned message_size) { + SHA256_HashContext *context = (SHA256_HashContext *)base; + SHA256_Update(&context->ctx, message, message_size); +} + +void finish_SHA256(uECC_HashContext *base, uint8_t *hash_result) { + SHA256_HashContext *context = (SHA256_HashContext *)base; + SHA256_Final(hash_result, &context->ctx); +} + +... when signing ... +{ + uint8_t tmp[32 + 32 + 64]; + SHA256_HashContext ctx = {{&init_SHA256, &update_SHA256, &finish_SHA256, 64, 32, tmp}}; + uECC_sign_deterministic(key, message_hash, &ctx.uECC, signature); +} +*/ +typedef struct uECC_HashContext { + void (*init_hash)(struct uECC_HashContext *context); + void (*update_hash)(struct uECC_HashContext *context, + const uint8_t *message, + unsigned message_size); + void (*finish_hash)(struct uECC_HashContext *context, uint8_t *hash_result); + unsigned block_size; /* Hash function block size in bytes, eg 64 for SHA-256. */ + unsigned result_size; /* Hash function result size in bytes, eg 32 for SHA-256. */ + uint8_t *tmp; /* Must point to a buffer of at least (2 * result_size + block_size) bytes. */ +} uECC_HashContext; + +/* uECC_sign_deterministic() function. +Generate an ECDSA signature for a given hash value, using a deterministic algorithm +(see RFC 6979). You do not need to set the RNG using uECC_set_rng() before calling +this function; however, if the RNG is defined it will improve resistance to side-channel +attacks. + +Usage: Compute a hash of the data you wish to sign (SHA-2 is recommended) and pass it in to +this function along with your private key and a hash context. + +Inputs: + private_key - Your private key. + message_hash - The hash of the message to sign. + hash_context - A hash context to use. + +Outputs: + signature - Will be filled in with the signature value. + +Returns 1 if the signature generated successfully, 0 if an error occurred. +*/ +int uECC_sign_deterministic(const uint8_t private_key[uECC_BYTES], + const uint8_t message_hash[uECC_BYTES], + uECC_HashContext *hash_context, + uint8_t signature[uECC_BYTES*2]); + +/* uECC_verify() function. +Verify an ECDSA signature. + +Usage: Compute the hash of the signed data using the same hash as the signer and +pass it to this function along with the signer's public key and the signature values (r and s). + +Inputs: + public_key - The signer's public key + hash - The hash of the signed data. + signature - The signature value. + +Returns 1 if the signature is valid, 0 if it is invalid. +*/ +int uECC_verify(const uint8_t private_key[uECC_BYTES*2], + const uint8_t hash[uECC_BYTES], + const uint8_t signature[uECC_BYTES*2]); + +/* uECC_compress() function. +Compress a public key. + +Inputs: + public_key - The public key to compress. + +Outputs: + compressed - Will be filled in with the compressed public key. +*/ +void uECC_compress(const uint8_t public_key[uECC_BYTES*2], uint8_t compressed[uECC_BYTES+1]); + +/* uECC_decompress() function. +Decompress a compressed public key. + +Inputs: + compressed - The compressed public key. + +Outputs: + public_key - Will be filled in with the decompressed public key. +*/ +void uECC_decompress(const uint8_t compressed[uECC_BYTES+1], uint8_t public_key[uECC_BYTES*2]); + +/* uECC_valid_public_key() function. +Check to see if a public key is valid. + +Note that you are not required to check for a valid public key before using any other uECC +functions. However, you may wish to avoid spending CPU time computing a shared secret or +verifying a signature using an invalid public key. + +Inputs: + public_key - The public key to check. + +Returns 1 if the public key is valid, 0 if it is invalid. +*/ +int uECC_valid_public_key(const uint8_t public_key[uECC_BYTES*2]); + +/* uECC_compute_public_key() function. +Compute the corresponding public key for a private key. + +Inputs: + private_key - The private key to compute the public key for + +Outputs: + public_key - Will be filled in with the corresponding public key + +Returns 1 if the key was computed successfully, 0 if an error occurred. +*/ +int uECC_compute_public_key(const uint8_t private_key[uECC_BYTES], + uint8_t public_key[uECC_BYTES * 2]); + + +/* uECC_bytes() function. +Returns the value of uECC_BYTES. Helpful for foreign-interfaces to higher-level languages. +*/ +int uECC_bytes(void); + +/* uECC_curve() function. +Returns the value of uECC_CURVE. Helpful for foreign-interfaces to higher-level languages. +*/ +int uECC_curve(void); + +#ifdef __cplusplus +} /* end of extern "C" */ +#endif + +#endif /* _MICRO_ECC_H_ */ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/uecc/uECC_ll.c b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/uecc/uECC_ll.c index 7ab6f88276..2d7a207e6b 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/uecc/uECC_ll.c +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/uecc/uECC_ll.c @@ -122,6 +122,7 @@ typedef struct EccPoint { } EccPoint; static const uECC_word_t curve_p[uECC_WORDS] = uECC_CONCAT(Curve_P_, uECC_CURVE); +static const uECC_word_t curve_b[uECC_WORDS] = uECC_CONCAT(Curve_B_, uECC_CURVE); static const EccPoint curve_G = uECC_CONCAT(Curve_G_, uECC_CURVE); static const uECC_word_t curve_n[uECC_N_WORDS] = uECC_CONCAT(Curve_N_, uECC_CURVE); @@ -163,7 +164,7 @@ static int default_RNG(uint8_t *dest, unsigned size) { static uECC_RNG_Function g_rng_function = &default_RNG; -void uECC_set_rng(uECC_RNG_Function rng_function) { +void uECC_set_rng_ll(uECC_RNG_Function rng_function) { g_rng_function = rng_function; } @@ -773,6 +774,22 @@ static void XYcZ_addC(uECC_word_t * RESTRICT X1, vli_set(X1, t7); } +/* Computes result = x^3 + ax + b. result must not overlap x. */ +static void curve_x_side(uECC_word_t * RESTRICT result, const uECC_word_t * RESTRICT x) { +#if (uECC_CURVE == uECC_secp256k1) + vli_modSquare_fast(result, x); /* r = x^2 */ + vli_modMult_fast(result, result, x); /* r = x^3 */ + vli_modAdd(result, result, curve_b, curve_p); /* r = x^3 + b */ +#else + uECC_word_t _3[uECC_WORDS] = {3}; /* -a = 3 */ + + vli_modSquare_fast(result, x); /* r = x^2 */ + vli_modSub_fast(result, result, _3); /* r = x^2 - 3 */ + vli_modMult_fast(result, result, x); /* r = x^3 - 3x */ + vli_modAdd(result, result, curve_b, curve_p); /* r = x^3 - 3x + b */ +#endif +} + enum { ECC_POINT_MULT_STATE_INIT, @@ -989,6 +1006,35 @@ void uECC_make_key_complete(uint8_t public_key[uECC_BYTES*2], uint8_t private_ke vli_nativeToBytes(public_key + uECC_BYTES, uECC_ctx.makeKey.public.y); } +/************************************************************************************************** + Validate Key +**************************************************************************************************/ + +int uECC_valid_public_key_ll(const uint8_t public_key[uECC_BYTES*2]) { + uECC_word_t tmp1[uECC_WORDS]; + uECC_word_t tmp2[uECC_WORDS]; + EccPoint public; + + vli_bytesToNative(public.x, public_key); + vli_bytesToNative(public.y, public_key + uECC_BYTES); + + // The point at infinity is invalid. + if (EccPoint_isZero(&public)) { + return 0; + } + + // x and y must be smaller than p. + if (vli_cmp(curve_p, public.x) != 1 || vli_cmp(curve_p, public.y) != 1) { + return 0; + } + + vli_modSquare_fast(tmp1, public.y); /* tmp1 = y^2 */ + curve_x_side(tmp2, public.x); /* tmp2 = x^3 + ax + b */ + + /* Make sure that y^2 == x^3 + ax + b */ + return (vli_cmp(tmp1, tmp2) == 0); +} + /************************************************************************************************** Shared Secret **************************************************************************************************/ diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/uecc/uECC_ll.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/uecc/uECC_ll.h index 69351bee2c..3b0133b14f 100644 --- a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/uecc/uECC_ll.h +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack/thirdparty/uecc/uECC_ll.h @@ -29,7 +29,7 @@ uECC_asm_fast - Use GCC inline assembly optimized for maximum speed. */ #define uECC_asm_small 1 #define uECC_asm_fast 2 #ifndef uECC_ASM - #ifndef __CC_ARM + #if !defined(__CC_ARM) && !defined(__ARMCC_VERSION) && !defined(__ICCARM__) && defined(__GNUC__) /* Only support GCC inline asm for now */ #define uECC_ASM uECC_asm_fast #else // DG: ARMCC 5, unlike GCC, IAR and CLANG, doesn't support GNU-style inline assembly #define uECC_ASM uECC_asm_none @@ -97,7 +97,7 @@ be called before uECC_make_key() or uECC_sign() are used. Inputs: rng_function - The function that will be used to generate random bytes. */ -void uECC_set_rng(uECC_RNG_Function rng_function); +void uECC_set_rng_ll(uECC_RNG_Function rng_function); /* uECC_make_key() function. Create a public/private key pair. @@ -112,6 +112,20 @@ void uECC_make_key_start(const uint8_t private_key[uECC_BYTES]); int uECC_make_key_continue(void); void uECC_make_key_complete(uint8_t public_key[uECC_BYTES*2], uint8_t private_key[uECC_BYTES]); +/* uECC_valid_public_key() function. +Check to see if a public key is valid. + +Note that you are not required to check for a valid public key before using any other uECC +functions. However, you may wish to avoid spending CPU time computing a shared secret or +verifying a signature using an invalid public key. + +Inputs: + public_key - The public key to check. + +Returns 1 if the public key is valid, 0 if it is invalid. +*/ +int uECC_valid_public_key_ll(const uint8_t public_key[uECC_BYTES*2]); + /* uECC_shared_secret() function. Compute a shared secret given your secret key and someone else's public key. Note: It is recommended that you hash the result of uECC_shared_secret() before using it for diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack_adaptation/fake_lhci_drv.cpp b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack_adaptation/fake_lhci_drv.cpp new file mode 100644 index 0000000000..1db93a7e34 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack_adaptation/fake_lhci_drv.cpp @@ -0,0 +1,77 @@ +/* Copyright (c) 2009-2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "mbed.h" +#include "fake_lhci_drv.h" +#include "chci_tr.h" +#include "chci_api.h" +#include "hci_defs.h" +#include "wsf_assert.h" + +#ifdef __cplusplus +extern "C" { +#endif + +uint16_t FakeChciTrRead(uint8_t prot, uint8_t hci_type, uint16_t len, uint8_t *pData) +{ + uint8_t controller_type; + switch (hci_type) { + case HCI_CMD_TYPE: + controller_type = CHCI_TR_TYPE_CMD; + break; + case HCI_ACL_TYPE: + controller_type = CHCI_TR_TYPE_DATA; + break; + case HCI_ISO_TYPE: + controller_type = CHCI_TR_TYPE_ISO; + break; + default: + /* should never happen */ + WSF_ASSERT(false); + return 0; + break; + } + + chciTrRecv(prot, controller_type, pData); + return len; +} + +uint16_t FakeChciTrWrite(uint8_t prot, uint8_t controller_type, uint16_t len, uint8_t *pData) +{ + uint8_t hci_type; + switch (controller_type) { + case CHCI_TR_TYPE_EVT: + hci_type = HCI_EVT_TYPE; + break; + case CHCI_TR_TYPE_DATA: + hci_type = HCI_ACL_TYPE; + break; + case CHCI_TR_TYPE_ISO: + hci_type = HCI_ISO_TYPE; + break; + default: + /* should never happen */ + WSF_ASSERT(false); + return 0; + break; + } + + return ControllerToHostWrite(prot, hci_type, len, pData); +} + +#ifdef __cplusplus +}; +#endif diff --git a/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack_adaptation/fake_lhci_drv.h b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack_adaptation/fake_lhci_drv.h new file mode 100644 index 0000000000..3d572f4e03 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_CORDIO_LL/stack_adaptation/fake_lhci_drv.h @@ -0,0 +1,61 @@ +/* Copyright (c) 2009-2019 Arm Limited + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FAKE_LHCI_DRV_H_ +#define FAKE_LHCI_DRV_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Provide this callback in your HCI driver. + * + * @param prot Must be CHCI_TR_PROT_BLE. + * @param hci_type HCI type, HCI_ACL_TYPE or HCI_CMD_TYPE. + * @param len Buffer length. + * @param pData Data to be sent. + * @return Number of bytes processed. + */ +uint16_t ControllerToHostWrite(uint8_t prot, uint8_t hci_type, uint16_t len, uint8_t *pData); + +/** + * Send bytes from host to controller. + * + * @param prot Protocol, must be CHCI_TR_PROT_BLE. + * @param hci_type HCI type, HCI_ACL_TYPE or HCI_CMD_TYPE. + * @param len Buffer length. + * @param pData Data to be sent. + * @return Number of bytes processed. + */ +uint16_t FakeChciTrRead(uint8_t prot, uint8_t hci_type, uint16_t len, uint8_t *pData); + +/** + * Send bytes from controller to host. + * + * @param prot Protocol, must be CHCI_TR_PROT_BLE. + * @param controller_type Controller type, CHCI_TR_TYPE_DATA or CHCI_TR_TYPE_EVT. + * @param len Buffer length. + * @param pData Data to be sent. + * @return Number of bytes processed. + */ +uint16_t FakeChciTrWrite(uint8_t prot, uint8_t controller_type, uint16_t len, uint8_t *pData); + +#ifdef __cplusplus +}; +#endif + +#endif /* FAKE_LHCI_DRV_H_ */ diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_MCU_NRF52840/mbed_lib.json b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_MCU_NRF52840/mbed_lib.json new file mode 100644 index 0000000000..df8fdfe839 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_MCU_NRF52840/mbed_lib.json @@ -0,0 +1,25 @@ +{ + "name": "cordio-ll-nrf52840", + "config": { + "phy-coded-support": { + "help": "Coded PHY supported.", + "value": 1 + }, + "extended-advertising-size": { + "help": "Maximum extended advertising data (and scan data response) size", + "value": 1650 + }, + "max-acl-size": { + "help": "Maximum ACL buffer size", + "value": 512 + }, + "tx-buffers": { + "help": "Default number of send buffers", + "value": 16 + }, + "cryptocell310-acceleration": { + "help": "Should the link layer use the Crypto Cell 310 to offload encryption.", + "value": 1 + } + } +} \ No newline at end of file diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/NRFCordioHCIDriver.cpp b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/NRFCordioHCIDriver.cpp index 4a00372add..9468d8e000 100644 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/NRFCordioHCIDriver.cpp +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/NRFCordioHCIDriver.cpp @@ -28,10 +28,10 @@ // Cordio Includes #include "ll_init_api.h" #include "ll_defs.h" -#include "chci_drv.h" +#include "fake_lhci_drv.h" +#include "pal_bb.h" +#include "pal_cfg.h" #include "lhci_api.h" -#include "platform_api.h" -#include "platform_ble_api.h" #include "wsf_assert.h" #include "wsf_buf.h" #include "wsf_timer.h" @@ -57,9 +57,22 @@ using namespace ble::vendor::cordio; /*! \brief Memory that should be reserved for the stack. */ #if defined(NRF52840_XXAA) + +#undef MBED_CONF_CORDIO_LL_EXTENDED_ADVERTISING_SIZE +#undef MBED_CONF_CORDIO_LL_MAX_ACL_SIZE +#undef MBED_CONF_CORDIO_LL_TX_BUFFERS +#undef MBED_CONF_CORDIO_LL_PHY_CODED_SUPPORT +#define MBED_CONF_CORDIO_LL_EXTENDED_ADVERTISING_SIZE MBED_CONF_CORDIO_LL_NRF52840_EXTENDED_ADVERTISING_SIZE +#define MBED_CONF_CORDIO_LL_MAX_ACL_SIZE MBED_CONF_CORDIO_LL_NRF52840_MAX_ACL_SIZE +#define MBED_CONF_CORDIO_LL_TX_BUFFERS MBED_CONF_CORDIO_LL_NRF52840_TX_BUFFERS +#define MBED_CONF_CORDIO_LL_PHY_CODED_SUPPORT MBED_CONF_CORDIO_LL_NRF52840_PHY_CODED_SUPPORT + #define CORDIO_LL_MEMORY_FOOTPRINT 41906UL + #else + #define CORDIO_LL_MEMORY_FOOTPRINT 12768UL + #endif /*! \brief Typical implementation revision number (LlRtCfg_t::implRev). */ @@ -76,62 +89,87 @@ const BbRtCfg_t NRFCordioHCIDriver::_bb_cfg = { /*schSetupDelayUsec*/ BB_SCH_SETUP_DELAY_US }; -static const uint16_t maxAdvReports = 16; -static const uint16_t numRxBufs = 8; -#if !defined(NRF52840_XXAA) -static const uint16_t advDataLen = 128; -static const uint16_t connDataLen = 256; -static const uint16_t numTxBufs = 8; -#else -static const uint16_t advDataLen = LL_MAX_ADV_DATA_LEN; -static const uint16_t connDataLen = 512; -static const uint16_t numTxBufs = 16; -#endif - - /* +12 for message headroom, + 2 event header, +255 maximum parameter length. */ static const uint16_t maxRptBufSize = 12 + 2 + 255; /* +12 for message headroom, +4 for header. */ -static const uint16_t aclBufSize = 12 + connDataLen + 4 + BB_DATA_PDU_TAILROOM; +static const uint16_t aclBufSize = 12 + MBED_CONF_CORDIO_LL_MAX_ACL_SIZE + 4 + BB_DATA_PDU_TAILROOM; const LlRtCfg_t NRFCordioHCIDriver::_ll_cfg = { - /* Device */ - /*compId*/ LL_COMP_ID_ARM, - /*implRev*/ LL_IMPL_REV, - /*btVer*/ LL_VER_BT_CORE_SPEC_5_0, - 0, // padding - /* Advertiser */ - /*maxAdvSets*/ 4, // 4 Extended Advertising Sets - /*maxAdvReports*/ 8, - /*maxExtAdvDataLen*/ advDataLen, - /*defExtAdvDataFrag*/ 64, - 0, // Aux delay - /* Scanner */ - /*maxScanReqRcvdEvt*/ 4, - /*maxExtScanDataLen*/ advDataLen, - /* Connection */ - #if defined(NRF52840_XXAA) - /*maxConn*/ 4, - #else - /*maxConn*/ 2, - #endif - /*numTxBufs*/ numTxBufs, - /*numRxBufs*/ numRxBufs, - /*maxAclLen*/ connDataLen, - /*defTxPwrLvl*/ 0, - /*ceJitterUsec*/ 0, - /* DTM */ - /*dtmRxSyncMs*/ 10000, - /* PHY */ - /*phy2mSup*/ TRUE, - #if defined(NRF52840_XXAA) - /*phyCodedSup*/ TRUE, - #else - /*phyCodedSup*/ FALSE, - #endif - /*stableModIdxTxSup*/ TRUE, - /*stableModIdxRxSup*/ TRUE +/* Device */ +/** Company ID (default to ARM Ltd. ID). */ +/*uint16_t*/ .compId = LL_COMP_ID_ARM, +/** Implementation revision number. */ +/*uint16_t*/ .implRev = LL_IMPL_REV, +/** Core specification implementation level (LL_VER_BT_CORE_SPEC_4_2). */ +/*uint8_t*/ .btVer = LL_VER_BT_CORE_SPEC_5_0, +/** Unused. Align next field to word boundary. */ +/*uint32_t*/ ._align32 = 0, + +/* Advertiser */ +/** Maximum number of advertising sets. */ +/*uint8_t*/ .maxAdvSets = MBED_CONF_CORDIO_LL_MAX_ADVERTISING_SETS, +/** Maximum number of pending legacy or extended advertising reports. */ +/*uint8_t*/ .maxAdvReports = MBED_CONF_CORDIO_LL_MAX_ADVERTISING_REPORTS, +/** Maximum extended advertising data size. */ +/*uint16_t*/ .maxExtAdvDataLen = MBED_CONF_CORDIO_LL_EXTENDED_ADVERTISING_SIZE, +/** Default extended advertising data fragmentation size. */ +/*uint8_t*/ .defExtAdvDataFrag = MBED_CONF_CORDIO_LL_DEFAULT_EXTENDED_ADVERTISING_FRAGMENTATION_SIZE, +/** Auxiliary Offset delay above T_MAFS in microseconds. */ +/*uint16_t*/ .auxDelayUsec = 0, +/** Delay of auxiliary packet in microseconds from the time specified by auxPtr. */ +/*uint16_t*/ .auxPtrOffsetUsec = 0, + +/* Scanner */ +/** Maximum scan request received events. */ +/*uint8_t*/ .maxScanReqRcvdEvt = MBED_CONF_CORDIO_LL_MAX_SCAN_REQUEST_EVENTS, +/** Maximum extended scan data size. */ +/*uint16_t*/ .maxExtScanDataLen = MBED_CONF_CORDIO_LL_EXTENDED_ADVERTISING_SIZE, + +/* Connection */ +/** Maximum number of connections. */ +/*uint8_t*/ .maxConn = DM_CONN_MAX, +/** Default number of transmit buffers. */ +/*uint8_t*/ .numTxBufs = MBED_CONF_CORDIO_LL_TX_BUFFERS, +/** Default number of receive buffers. */ +/*uint8_t*/ .numRxBufs = MBED_CONF_CORDIO_LL_RX_BUFFERS, +/** Maximum ACL buffer size. */ +/*uint16_t*/ .maxAclLen = MBED_CONF_CORDIO_LL_MAX_ACL_SIZE, +/** Default Tx power level for connections. */ +/*int8_t*/ .defTxPwrLvl = 0, +/** Allowable CE jitter on a slave (account for master's sleep clock resolution). */ +/*uint8_t*/ .ceJitterUsec = 0, + +/* ISO */ +/** Default number of ISO transmit buffers. */ +/*uint8_t*/ .numIsoTxBuf = 0, +/** Default number of ISO receive buffers. */ +/*uint8_t*/ .numIsoRxBuf = 0, +/** Maximum ISO buffer size between host and controller. */ +/*uint16_t*/ .maxIsoBufLen = 0, +/** Maximum ISO PDU buffer size. */ +/*uint16_t*/ .maxIsoPduLen = 0, + +/* CIS */ +/** Maximum number of CIG. */ +/*uint8_t*/ .maxCig = 0, +/** Maximum number of CIS. */ +/*uint8_t*/ .maxCis = 0, +/** Subevent spacing above T_MSS. */ +/*uint16_t*/ .subEvtSpaceDelay = 0, +/* DTM */ +/** DTM Rx synchronization window in milliseconds. */ +/*uint16_t*/ .dtmRxSyncMs = 10000, + +/* PHY */ +/** 2M PHY supported. */ +/*bool_t*/ .phy2mSup = MBED_CONF_CORDIO_LL_PHY_2M_SUPPORT, +/** Coded PHY supported. */ +/*bool_t*/ .phyCodedSup = MBED_CONF_CORDIO_LL_PHY_CODED_SUPPORT, +/** Tx stable modulation index supported. */ +/*bool_t*/ .stableModIdxTxSup = TRUE, +/** Rx stable modulation index supported. */ +/*bool_t*/ .stableModIdxRxSup = TRUE, }; extern "C" void TIMER0_IRQHandler(void); @@ -207,8 +245,8 @@ ble::vendor::cordio::buf_pool_desc_t NRFCordioHCIDriver::get_buffer_pool_descrip { 16, 16 + 8}, { 32, 16 + 4 }, { 64, 8 }, - { 128, 4 + maxAdvReports }, - { aclBufSize, numTxBufs + numRxBufs }, + { 128, 4 + MBED_CONF_CORDIO_LL_MAX_ADVERTISING_REPORTS }, + { aclBufSize, MBED_CONF_CORDIO_LL_TX_BUFFERS + MBED_CONF_CORDIO_LL_RX_BUFFERS }, { 272, 1 } }; @@ -280,7 +318,7 @@ void NRFCordioHCIDriver::do_initialize() // If a submodule does not have enough space to allocate its memory from buffer, it will still allocate its memory (and do a buffer overflow) and return 0 (as in 0 byte used) // however that method will still continue which will lead to undefined behaviour // So whenever a change of configuration is done, it's a good idea to set CORDIO_LL_MEMORY_FOOTPRINT to a high value and then reduce accordingly - uint32_t mem_used = LlInitControllerExtInit(&ll_init_cfg); + uint32_t mem_used = LlInitControllerInit(&ll_init_cfg); if( mem_used < CORDIO_LL_MEMORY_FOOTPRINT ) { // Sub-optimal, give warning @@ -289,7 +327,7 @@ void NRFCordioHCIDriver::do_initialize() // BD Addr bdAddr_t bd_addr; - PlatformLoadBdAddress(bd_addr); + PalCfgLoadData(PAL_CFG_ID_BD_ADDR, bd_addr, sizeof(bdAddr_t)); LlSetBdAddr((uint8_t *)&bd_addr); LlMathSetSeed((uint32_t *)&bd_addr); @@ -315,19 +353,13 @@ void NRFCordioHCIDriver::start_reset_sequence() bool NRFCordioHCIDriver::get_random_static_address(ble::address_t& address) { - /* Load address from nRF configuration. */ - uint64_t devAddr = (((uint64_t)NRF_FICR->DEVICEADDR[0]) << 0) | - (((uint64_t)NRF_FICR->DEVICEADDR[1]) << 32); + PalCfgLoadData(PAL_CFG_ID_BD_ADDR, address.data(), sizeof(bdAddr_t)); - for (size_t i = 0; i < address.size(); ++i) { - address[i] = devAddr >> (i * 8); - } + MBED_ASSERT((address[5] & 0xC0) == 0xC0); - address[5] |= 0xC0; /* cf. "Static Address" (Vol C, Part 3, section 10.8.1) */ return true; } - ble::vendor::cordio::CordioHCIDriver& ble_cordio_get_hci_driver() { static NRFCordioHCITransportDriver transport_driver; @@ -337,26 +369,3 @@ ble::vendor::cordio::CordioHCIDriver& ble_cordio_get_hci_driver() { return hci_driver; } - -// Do not handle any vendor specific command -extern "C" bool_t lhciCommonVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) -{ - return false; -} - -// Nordic implementation -void PlatformLoadBdAddress(uint8_t *pDevAddr) -{ - unsigned int devAddrLen = 6; - - /* Load address from nRF configuration. */ - uint64_t devAddr = (((uint64_t)NRF_FICR->DEVICEID[0]) << 0) | - (((uint64_t)NRF_FICR->DEVICEID[1]) << 32); - - unsigned int i = 0; - while (i < devAddrLen) - { - pDevAddr[i] = devAddr >> (i * 8); - i++; - } -} diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/NRFCordioHCITransportDriver.cpp b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/NRFCordioHCITransportDriver.cpp index bb5b8bb087..ff52bfe460 100644 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/NRFCordioHCITransportDriver.cpp +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/NRFCordioHCITransportDriver.cpp @@ -23,8 +23,7 @@ #include "wsf_math.h" #include "chci_api.h" #include "chci_tr.h" -#include "chci_tr_serial.h" -#include "chci_drv.h" +#include "fake_lhci_drv.h" #include "hci_defs.h" #include @@ -45,11 +44,10 @@ void NRFCordioHCITransportDriver::terminate() } -uint16_t NRFCordioHCITransportDriver::write(uint8_t type, uint16_t len, uint8_t *pData) +uint16_t NRFCordioHCITransportDriver::write(uint8_t hci_type, uint16_t len, uint8_t *pData) { - chciTrSerialRxIncoming(&type, 1); - chciTrSerialRxIncoming(pData, len); - return len; + /* ownership of the WSF buffer is transferred to the controller (zero copy HCI) */ + return FakeChciTrRead(CHCI_TR_PROT_BLE, hci_type, len, pData); } extern "C" void chciDrvInit(void) @@ -58,10 +56,12 @@ extern "C" void chciDrvInit(void) } // Callback from Cordio stack -extern "C" uint16_t chciDrvWrite(uint8_t prot, uint8_t type, uint16_t len, uint8_t *pData) +extern "C" uint16_t ControllerToHostWrite(uint8_t prot, uint8_t hci_type, uint16_t len, uint8_t *pData) { - uint8_t ctype = (type == CHCI_TR_TYPE_EVT) ? HCI_EVT_TYPE : HCI_ACL_TYPE; - CordioHCITransportDriver::on_data_received(&ctype, 1); + WSF_ASSERT(prot == CHCI_TR_PROT_BLE); + + CordioHCITransportDriver::on_data_received(&hci_type, 1); CordioHCITransportDriver::on_data_received(pData, len); + return len; } diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/NRFCordioHCITransportDriver.h b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/NRFCordioHCITransportDriver.h index 382188527e..9352da0c47 100644 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/NRFCordioHCITransportDriver.h +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/NRFCordioHCITransportDriver.h @@ -51,7 +51,8 @@ public: * packet, ACL packet or EVT packet. Depending on the type of transport * it can prefix the packet itself. * @param len Number of bytes to transmit. - * @param pData pointer to the data to transmit. + * @param pData Pointer to the data to transmit. This is an WSF buffer + * and if CORDIO_ZERO_COPY_HCI is enabled we receive ownership. * * @return The number of bytes which have been transmited. */ diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/LICENSE b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/LICENSE deleted file mode 100644 index d648fd563a..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/LICENSE +++ /dev/null @@ -1,49 +0,0 @@ -Permissive Binary License - -Version 1.0, September 2015 - -Redistribution. Redistribution and use in binary form, without -modification, are permitted provided that the following conditions are -met: - -1) Redistributions must reproduce the above copyright notice and the - following disclaimer in the documentation and/or other materials - provided with the distribution. - -2) Unless to the extent explicitly permitted by law, no reverse - engineering, decompilation, or disassembly of this software is - permitted. - -3) Redistribution as part of a software development kit must include the - accompanying file named “DEPENDENCIES†and any dependencies listed in - that file. - -4) Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -Limited patent license. The copyright holders (and contributors) grant a -worldwide, non-exclusive, no-charge, royalty-free patent license to -make, have made, use, offer to sell, sell, import, and otherwise -transfer this software, where such license applies only to those patent -claims licensable by the copyright holders (and contributors) that are -necessarily infringed by this software. This patent license shall not -apply to any combinations that include this software. No hardware is -licensed hereunder. - -If you institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the software -itself infringes your patent(s), then your rights granted under this -license shall terminate as of the date such litigation is filed. - -DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -CONTRIBUTORS "AS IS." ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT -NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/README.md b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/README.md deleted file mode 100644 index d1869a2e2c..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# BLE Cordio Link Layer nordic port - -This folder contains a binary distribution and public headers that allow nordic -platforms to interface with the cordio link layer platform API. - -The binary is contained in `libcordio_stack_nordic.a` and the public headers are -contained in the `platform` directory. - -## Library information - -Compiled with: GNU Arm Embedded Toolchain 6-2017-q2-update diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/TOOLCHAIN_ARM_STD/libcordio_stack_nordic.ar b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/TOOLCHAIN_ARM_STD/libcordio_stack_nordic.ar deleted file mode 100644 index c93315299d..0000000000 Binary files a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/TOOLCHAIN_ARM_STD/libcordio_stack_nordic.ar and /dev/null differ diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/TOOLCHAIN_GCC_ARM/libcordio_stack_nordic.a b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/TOOLCHAIN_GCC_ARM/libcordio_stack_nordic.a deleted file mode 100644 index cc419830f5..0000000000 Binary files a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/TOOLCHAIN_GCC_ARM/libcordio_stack_nordic.a and /dev/null differ diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/TOOLCHAIN_IAR/libcordio_stack_nordic.a b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/TOOLCHAIN_IAR/libcordio_stack_nordic.a deleted file mode 100644 index 09d78b770c..0000000000 Binary files a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/TOOLCHAIN_IAR/libcordio_stack_nordic.a and /dev/null differ diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/platform/nordic/include/bb_drv_nordic.h b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/platform/nordic/include/bb_drv_nordic.h deleted file mode 100644 index 4a53dea592..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/platform/nordic/include/bb_drv_nordic.h +++ /dev/null @@ -1,54 +0,0 @@ -/*************************************************************************************************/ -/*! - * \brief Nordic baseband driver header. - * - * Copyright (c) 2009-2018 ARM Ltd., all rights reserved. - * SPDX-License-Identifier: LicenseRef-PBL - * - * This file and the related binary are licensed under the - * Permissive Binary License, Version 1.0 (the "License"); - * you may not use these files except in compliance with the License. - * - * You may obtain a copy of the License here: - * LICENSE-permissive-binary-license-1.0.txt and at - * https://www.mbed.com/licenses/PBL-1.0 - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/*************************************************************************************************/ - -#ifndef BB_DRV_NORDIC_H -#define BB_DRV_NORDIC_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "bb_api.h" - -/************************************************************************************************** - Data Types -**************************************************************************************************/ - -/*! \brief IRQ callback datatypes. */ -typedef void (*bbDrvIrqCback_t)(void); - -/*************************************************************************************************/ -/*! - * \brief Called to register a protocol's Radio and Timer IRQ callback functions. - * - * \param protId Protocol ID. - * \param timerCback Timer IRQ callback. - * \param radioCback Timer IRQ callback. - * - * \return None. - */ -/*************************************************************************************************/ -void BbDrvRegisterProtIrq(uint8_t protId, bbDrvIrqCback_t timerCback, bbDrvIrqCback_t radioCback); - -#ifdef __cplusplus -}; -#endif - -#endif /* BB_DRV_NORDIC_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/platform/nordic/include/platform_btn.h b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/platform/nordic/include/platform_btn.h deleted file mode 100644 index 652f303f69..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/platform/nordic/include/platform_btn.h +++ /dev/null @@ -1,74 +0,0 @@ -/*************************************************************************************************/ -/*! - * \file - * - * \brief Private platform definitions. - * - * Copyright (c) 2009-2018 ARM Ltd., all rights reserved. - * SPDX-License-Identifier: LicenseRef-PBL - * - * This file and the related binary are licensed under the - * Permissive Binary License, Version 1.0 (the "License"); - * you may not use these files except in compliance with the License. - * - * You may obtain a copy of the License here: - * LICENSE-permissive-binary-license-1.0.txt and at - * https://www.mbed.com/licenses/PBL-1.0 - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/*************************************************************************************************/ - -#ifndef PLATFORM_BTN_H -#define PLATFORM_BTN_H - -#include "platform_nordic.h" -#include "wsf_msg.h" - -/************************************************************************************************** - Macros -**************************************************************************************************/ - -#if (BUTTONS_NUMBER >= 1) -#define BUTTON_0_BITMASK (1 << BSP_BUTTON_0) -#endif -#if (BUTTONS_NUMBER >= 2) -#define BUTTON_1_BITMASK (1 << BSP_BUTTON_1) -#endif -#if (BUTTONS_NUMBER >= 3) -#define BUTTON_2_BITMASK (1 << BSP_BUTTON_2) -#endif -#if (BUTTONS_NUMBER >= 4) -#define BUTTON_3_BITMASK (1 << BSP_BUTTON_3) -#endif - -#define BUTTON_ACTIVE_STATE 0 - -/************************************************************************************************** - Types -**************************************************************************************************/ - -/*! \brief Button configuration structure. */ -typedef struct -{ - uint8_t pinNo; /*!< Pin to be used as a button. */ - uint8_t activeState; /*!< APP_BUTTON_ACTIVE_HIGH or APP_BUTTON_ACTIVE_LOW. */ - nrf_gpio_pin_pull_t pullCfg; /*!< Pull-up or -down configuration. */ -} platformButtonCfg_t; - -/************************************************************************************************** - Global Variables -**************************************************************************************************/ - -extern platformButtonCfg_t platformButtons[]; - -/************************************************************************************************** - Function Declarations -**************************************************************************************************/ - -void PlatformInitBtns(platformButtonCfg_t *pButtons, uint8_t buttonCount); -uint32_t PlatformReadBtns(void); -void PlatformRegisterBtnsHandler(wsfHandlerId_t handlerId, wsfEventMask_t eventMask); - -#endif /* PLATFORM_BTN_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/platform/nordic/include/platform_nordic.h b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/platform/nordic/include/platform_nordic.h deleted file mode 100644 index 31f3a492bf..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/platform/nordic/include/platform_nordic.h +++ /dev/null @@ -1,89 +0,0 @@ -/*************************************************************************************************/ -/*! - * \file - * - * \brief Private platform definitions. - * - * Copyright (c) 2009-2018 ARM Ltd., all rights reserved. - * SPDX-License-Identifier: LicenseRef-PBL - * - * This file and the related binary are licensed under the - * Permissive Binary License, Version 1.0 (the "License"); - * you may not use these files except in compliance with the License. - * - * You may obtain a copy of the License here: - * LICENSE-permissive-binary-license-1.0.txt and at - * https://www.mbed.com/licenses/PBL-1.0 - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/*************************************************************************************************/ - -#ifndef PLATFORM_INT_H -#define PLATFORM_INT_H - -#include "platform_api.h" - -/* Nordic specific definitions. */ -#include -#include "boards.h" -#include "nrf.h" - -/************************************************************************************************** - Macros -**************************************************************************************************/ - -#if defined(BOARD_PCA10000) || defined(BOARD_PCA10031) - -#define LED_CPU_ACTIVE() nrf_gpio_pin_set (LED_RGB_RED); \ - nrf_gpio_pin_clear(LED_RGB_GREEN); \ - nrf_gpio_pin_set (LED_RGB_BLUE) -#define LED_CPU_SLEEP() nrf_gpio_pin_set (LED_RGB_RED); \ - nrf_gpio_pin_set (LED_RGB_GREEN); \ - nrf_gpio_pin_set (LED_RGB_BLUE) -#define LED_ERROR() nrf_gpio_pin_clear(LED_RGB_RED); \ - nrf_gpio_pin_set (LED_RGB_GREEN); \ - nrf_gpio_pin_set (LED_RGB_BLUE) -#define LED_CLEAR_ERROR() - -#elif defined(BOARD_PCA10001) - -#define LED_CPU_ACTIVE() nrf_gpio_pin_set (BSP_LED_0) -#define LED_CPU_SLEEP() nrf_gpio_pin_clear(BSP_LED_0) -#define LED_ERROR() nrf_gpio_pin_set (BSP_LED_1) -#define LED_CLEAR_ERROR() nrf_gpio_pin_clear(BSP_LED_1) - -#elif defined(BOARD_PCA10028) || defined(BOARD_PCA10040) || defined(BOARD_PCA10056) - -/* Inverted LED "on" logic */ -#define LED_CPU_ACTIVE() nrf_gpio_pin_clear(BSP_LED_1) /* edge of board */ -#define LED_CPU_SLEEP() nrf_gpio_pin_set (BSP_LED_1) /* edge of board */ -#define LED_ERROR() nrf_gpio_pin_clear(BSP_LED_3) /* edge of board */ -#define LED_CLEAR_ERROR() nrf_gpio_pin_set (BSP_LED_3) /* edge of board */ - -#else - -#warning "Board not specified" - -#define LED_CPU_ACTIVE() -#define LED_CPU_SLEEP() -#define LED_ERROR() -#define LED_CLEAR_ERROR() - -#endif - -/************************************************************************************************** - Global Variables -**************************************************************************************************/ - -extern uint8_t *SystemHeapStart; -extern uint32_t SystemHeapSize; - -/************************************************************************************************** - Function Declarations -**************************************************************************************************/ - -void platformTimeInit(void); - -#endif /* PLATFORM_INT_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/platform/nordic/sources/bb/ble/bb_ble_int.h b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/platform/nordic/sources/bb/ble/bb_ble_int.h deleted file mode 100644 index e82c5011c0..0000000000 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/cordio_stack/platform/nordic/sources/bb/ble/bb_ble_int.h +++ /dev/null @@ -1,48 +0,0 @@ -/*************************************************************************************************/ -/*! - * \file - * - * \brief Baseband driver internal interface file. - * - * Copyright (c) 2009-2018 ARM Ltd., all rights reserved. - * SPDX-License-Identifier: LicenseRef-PBL - * - * This file and the related binary are licensed under the - * Permissive Binary License, Version 1.0 (the "License"); - * you may not use these files except in compliance with the License. - * - * You may obtain a copy of the License here: - * LICENSE-permissive-binary-license-1.0.txt and at - * https://www.mbed.com/licenses/PBL-1.0 - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/*************************************************************************************************/ - -#ifndef BB_BLE_DRV_INT_H -#define BB_BLE_DRV_INT_H - -#include "wsf_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/************************************************************************************************** - Function Declarations -**************************************************************************************************/ - -/* Inline encryption */ -void BbBleDrvInlineEncryptTxEnable(bool_t enable); -void BbBleDrvInlineEncryptSetPacketCount(uint64_t count); -void BbBleDrvInlineEncryptDecryptSuppressMic(bool_t enable); -void BbBleDrvInlineEncryptDecryptSetKey(uint8_t * key); -void BbBleDrvInlineEncryptDecryptSetIv(uint8_t * iv); -void BbBleDrvInlineEncryptDecryptSetDirection(uint8_t dir); - -#ifdef __cplusplus -}; -#endif - -#endif /* BB_BLE_DRV_INT_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/mbed_lib.json b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/mbed_lib.json index 0b8ebca698..fc65af77d9 100644 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/mbed_lib.json +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/mbed_lib.json @@ -1,6 +1,19 @@ { "name": "cordio-nordic-ll", + "config": { + "zero-copy-hci": { + "help": "messages sent between Host and Controller are passed directly without copying if enabled. WSF messages ownership is trasfered to the callee.", + "value": 1, + "macro_name": "CORDIO_ZERO_COPY_HCI" + } + }, "macros": [ - "INIT_BROADCASTER", "INIT_OBSERVER", "INIT_CENTRAL", "INIT_PERIPHERAL", "INIT_ENCRYPTED", "LHCI_ENABLE_VS=0", "BB_CLK_RATE_HZ=1000000" + "INIT_BROADCASTER", + "INIT_OBSERVER", + "INIT_CENTRAL", + "INIT_PERIPHERAL", + "INIT_ENCRYPTED", + "LHCI_ENABLE_VS=0", + "BB_CLK_RATE_HZ=1000000" ] } diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/include/audio_board.h b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/include/audio_board.h new file mode 100644 index 0000000000..0deee771dd --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/include/audio_board.h @@ -0,0 +1,49 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief Audio board definition. + * + * Copyright (c) 2018-2019 Arm Ltd. All Rights Reserved. + * Arm Ltd. confidential and proprietary. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*************************************************************************************************/ + +#ifndef AUDIOBOARD_H +#define AUDIOBOARD_H + +#include "pal_types.h" +#include "nrf_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +#define AUDIO_LED_1 NRF_GPIO_PIN_MAP(1,1) +#define AUDIO_LED_2 NRF_GPIO_PIN_MAP(1,2) +#define AUDIO_LED_3 NRF_GPIO_PIN_MAP(1,3) +#define AUDIO_LED_4 NRF_GPIO_PIN_MAP(1,4) +#define AUDIO_LED_5 NRF_GPIO_PIN_MAP(1,5) +#define AUDIO_LED_6 NRF_GPIO_PIN_MAP(1,6) + +#ifdef __cplusplus +}; +#endif + +#endif /* AUDIOBOARD_H */ diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_bb.c b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_bb.c new file mode 100644 index 0000000000..8e84ba45a7 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_bb.c @@ -0,0 +1,239 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief Baseband driver port file. + * + * Copyright (c) 2016-2018 Arm Ltd. All Rights Reserved. + * ARM confidential and proprietary. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*************************************************************************************************/ + +#include "pal_types.h" +#include "pal_bb.h" +#include "pal_bb.h" +#include "nrf.h" +#include "nrf_timer.h" +#include + +/************************************************************************************************** + Local Variables +**************************************************************************************************/ + +/*! \brief Driver enable count. */ +static uint8_t palBbEnableCnt; + +/*! \brief Protocol ID. */ +static uint8_t palBbProtId = BB_PROT_BLE; + +/*! \brief Table of timer IRQ callbacks. */ +static bbDrvIrqCback_t palBbTimerIrqCbackTbl[BB_PROT_NUM]; + +/*! \brief Table of radio IRQ callbacks. */ +static bbDrvIrqCback_t palBbRadioIrqCbackTbl[BB_PROT_NUM]; + +/************************************************************************************************** + Functions +**************************************************************************************************/ + +/*************************************************************************************************/ +/*! + * \brief Initialize the baseband driver. + * + * \return None. + * + * One-time initialization of baseband resources. This routine can be used to setup baseband + * resources, load RF trim parameters and execute RF calibrations. + * + * This routine should block until the BB hardware is completely initialized. + */ +/*************************************************************************************************/ +void PalBbInit(void) +{ + palBbEnableCnt = 0; + + memset(palBbTimerIrqCbackTbl, 0, sizeof(palBbTimerIrqCbackTbl)); + memset(palBbRadioIrqCbackTbl, 0, sizeof(palBbRadioIrqCbackTbl)); +} + +/*************************************************************************************************/ +/*! + * \brief Enable the BB hardware. + * + * \return None. + * + * This routine brings the BB hardware out of low power (enable power and clocks) just before a + * first BB operation is executed. + */ +/*************************************************************************************************/ +void PalBbEnable(void) +{ + palBbEnableCnt++; +} + +/*************************************************************************************************/ +/*! + * \brief Disable the BB hardware. + * + * \return None. + * + * This routine signals the BB hardware to go into low power (disable power and clocks) after all + * BB operations have been disabled. + */ +/*************************************************************************************************/ +void PalBbDisable(void) +{ + if(palBbEnableCnt) + { + palBbEnableCnt--; + } +} + +/*************************************************************************************************/ +/*! + * \brief Load BB timing configuration. + * + * \param pCfg Return configuration values. + * + * \return None. + */ +/*************************************************************************************************/ +void PalBbLoadCfg(PalBbCfg_t *pCfg) +{ + pCfg->clkPpm = 20; + pCfg->rfSetupDelayUsec = BB_RF_SETUP_DELAY_US; + pCfg->maxScanPeriodMsec = BB_MAX_SCAN_PERIOD_MS; + pCfg->schSetupDelayUsec = BB_SCH_SETUP_DELAY_US; +} + +/*************************************************************************************************/ +/*! + * \brief Get the current BB clock value. + * + * \param useRtcBBClk Use RTC BB clock. + * + * \return Current BB clock value, units are microseconds. + * + * This routine reads the current value from the BB clock and returns its value. + */ +/*************************************************************************************************/ +uint32_t PalBbGetCurrentTime(bool_t useRtcBBClk) +{ + if (palBbEnableCnt > 0) + { + if (useRtcBBClk) + { + /* return the RTC counter value */ + return NRF_RTC0->COUNTER; + } + else + { + /* Capture current TIMER0 count to capture register 3 */ + nrf_timer_task_trigger(NRF_TIMER0, NRF_TIMER_TASK_CAPTURE3); + + /* Read and return the captured count value from capture register 3 */ + return nrf_timer_cc_read(NRF_TIMER0, NRF_TIMER_CC_CHANNEL3); + } + } + return 0; +} + +/*************************************************************************************************/ +/*! + * \brief Get the current FRC time. + * + * \param pTime Pointer to return the current time. + * + * \return Status error code. + * + * Get the current FRC time. + * + * \note FRC is limited to the same bit-width as the BB clock. Return value is available + * only when the BB is active. + */ +/*************************************************************************************************/ +bool_t PalBbGetTimestamp(uint32_t *pTime) +{ + if (palBbEnableCnt == 0) + { + *pTime = 0; + return FALSE; + } + + *pTime = PalBbGetCurrentTime(USE_RTC_BB_CLK); + + return TRUE; +} + +/*************************************************************************************************/ +/*! + * \brief Called to register a protocol's Radio and Timer IRQ callback functions. + * + * \param protId Protocol ID. + * \param timerCback Timer IRQ callback. + * \param radioCback Timer IRQ callback. + * + * \return None. + */ +/*************************************************************************************************/ +void PalBbRegisterProtIrq(uint8_t protId, bbDrvIrqCback_t timerCback, bbDrvIrqCback_t radioCback) +{ + palBbRadioIrqCbackTbl[protId] = radioCback; + palBbTimerIrqCbackTbl[protId] = timerCback; +} + +/*************************************************************************************************/ +/*! + * \brief Set protocol ID. + * + * \param protId Protocol ID. + * + * \return None. + */ +/*************************************************************************************************/ +void PalBbSetProtId(uint8_t protId) +{ + palBbProtId = protId; +} + +/*************************************************************************************************/ +/*! + * \brief Combined BLE and 154 radio interrupt handler. + * + * \return None. + */ +/*************************************************************************************************/ +void RADIO_IRQHandler(void) +{ + if (palBbRadioIrqCbackTbl[palBbProtId]) + { + palBbRadioIrqCbackTbl[palBbProtId](); + } +} + +/*************************************************************************************************/ +/*! + * \brief Combined BLE and 154 timer interrupt handler. + * + * \return None. + */ +/*************************************************************************************************/ +void TIMER0_IRQHandler(void) +{ + if (palBbTimerIrqCbackTbl[palBbProtId]) + { + palBbTimerIrqCbackTbl[palBbProtId](); + } +} diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_bb_ble.c b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_bb_ble.c new file mode 100644 index 0000000000..e5f2419619 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_bb_ble.c @@ -0,0 +1,3126 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief Baseband driver interface file. + * + * Copyright (c) 2013-2019 Arm Ltd. All Rights Reserved. + * Arm Ltd. confidential and proprietary. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*************************************************************************************************/ + +/* + * + * NOTES: + * + * While BB is enabled certain resources are consumed and are off limits during that time. + * Timer0 should not be touched while BB is enabled. It's available apart from that. + * PPI Channels 14 & 15 are used while BB is enabled. They are available apart from that. + * + * Timer0's compare/capture registers are assigned specific uses: + * CC[0] - triggers radio TXEN or RXEN task, PPI triggered + * CC[1] - RX timeout + * CC[2] - captures *every* radio PAYLOAD event time, PPI triggered + * CC[3] - manual capture of current time + * + * PPI Channel 14: + * Used to trigger TXEN or RXEN task on timer event COMPARE[0]. + * + * PPI Channel 15: + * Used to trigger timer capture to CC[2] on every radio PAYLOAD event. + * + */ + +#include "pal_types.h" +#include "pal_bb.h" +#include "pal_rtc.h" +#include "pal_bb.h" +#include "pal_led.h" +#include "pal_bb_ble.h" +#include "pal_radio.h" +#include "ll_defs.h" +#include "boards.h" +#include "nrf.h" +#include "nrf_gpio.h" +#include "nrf_gpiote.h" +#include + +/************************************************************************************************** + Macros +**************************************************************************************************/ +#define PDU_HEADER_LEN 2 +#define MAX_PAYLOAD_LEN 255 +#define BB_DATA_PDU_LEN_OFFSET 1 +#define BB_TRL_MAX_LEN LL_DATA_MIC_LEN +#define BB_DATA_HDR_LEN PDU_HEADER_LEN + +#define MAX_TIFS_DEVIATION_USECS (2 + 1) /* from spec, section 4.2.1 Active Clock Accuracy, 50ppm = 2usec */ + /* +1 usec as a margin of uncertainty */ + +#if defined(NRF52840_XXAA) || defined(NRF52832_XXAA) +#define NRF5x_tTXEN_BLE_USECS 39 /* usec, Time between TXEN task and READY event, fast ramp mode (datasheet value of 40 is wrong). */ +#define NRF5x_tRXEN_BLE_USECS 42 /* usec, Time between RXEN task and READY event, fast ramp mode (datasheet value of 40 is wrong). */ +#else +/* from Nordic's Product Specification, section "Radio timing parameters" */ +#define NRF5x_tTXEN_BLE_USECS 140 /* usec, Time between TXEN task and READY event */ +#define NRF5x_tRXEN_BLE_USECS 140 /* usec, Time between RXEN task and READY event */ +#endif + +#if defined(NRF52840_XXAA) || defined(NRF52832_XXAA) +#define NRF5x_PROP_DELAY_TX_USECS 1 /* usec, (precise value is 0.6 usec) transmit propagation delay, START to first bit at antenna */ +#define NRF5x_PROP_DELAY_RX_USECS 9 /* usec, (precise value is 9.4 usec), receive propagation delay, last bit at antenna to END */ +#else +/* internal propagation delays obtained from Nordic support */ +#define NRF5x_PROP_DELAY_TX_USECS 3 /* usec, transmit propagation delay, START to first bit at antenna */ +#define NRF5x_PROP_DELAY_RX_USECS 3 /* usec, (precise value is 3.2 usec), receive propagation delay, last bit at antenna to END */ +#endif + +/* Nordic chip uses a one-byte prefix plus a three-byte base address to form the address */ +#define NORDIC_PREFIX_LEN 1 /* prefix is a Nordic concept */ +#define NORDIC_BASE_ADDR_LEN 3 /* base address is a Nordic concept */ + +/* scratch area for Nordic encryption engine */ +#define ENC_CCM_DATA_STRUCT_LEN 33 /* length of CCM data structure used for encryption/decryption */ +#define ENC_SCRATCH_BUF_LEN 43 /* size of scratch area */ +#define ENC_MAX_PAYLOAD_LEN 27 /* maximum size of payload that can be encrypted/decrytped */ +#define ENC_H_FIELD_LEN 1 /* length of "H" field */ +#define ENC_LPLUS4_LEN 1 /* length of the "L+4" field */ +#define ENC_RFU_LEN 1 /* length of the "RFU" field */ +#define ENC_MIC_LEN 4 /* length of the MIC field */ +#define ENC_TX_BUF_LEN ( ENC_H_FIELD_LEN + ENC_LPLUS4_LEN + ENC_RFU_LEN + ENC_MAX_PAYLOAD_LEN ) +#define ENC_OUTPUT_BUF_LEN ( ENC_TX_BUF_LEN + ENC_MIC_LEN ) + +/* +/- range for TIFS adjustment */ +#define TIFS_ADJ_RANGE_USECS 8 /* the +/- maximums for TIFS adjustment */ + +/* adjust prescaler for the clock rate */ +#if (BB_CLK_RATE_HZ == 1000000) + #define TIMER_PRESCALER 4 + #define TICKS_PER_USEC 1 +#elif (BB_CLK_RATE_HZ == 2000000) + #define TIMER_PRESCALER 3 + #define TICKS_PER_USEC 2 +#elif (BB_CLK_RATE_HZ == 4000000) + #define TIMER_PRESCALER 2 + #define TICKS_PER_USEC 4 +#elif (BB_CLK_RATE_HZ == 8000000) + #define TIMER_PRESCALER 1 + #define TICKS_PER_USEC 8 +#elif (USE_RTC_BB_CLK) + #define TIMER_PRESCALER 4 /* Use 1MHz for HFCLK */ + #define TICKS_PER_USEC 1 +#else + #error "Unsupported clock rate." +#endif + +#if (USE_RTC_BB_CLK) +uint32_t USEC_TO_TICKS(uint32_t usec) +{ + uint64_t ticks; /* use long integer so no loss of precision */ + ticks = (uint64_t)usec << UINT64_C(9); /* multiply by 512 */ + ticks /= 15625; + return ticks; +} +#else + #define USEC_TO_TICKS(usec) ((usec) * TICKS_PER_USEC) +#endif + +#if defined(NRF52840_XXAA) || defined(NRF52832_XXAA) +/* for nRF52, stall until write buffer empties */ +#define WAIT_FOR_WR_BUF_EMPTY(r) ((void)r) +#else +/* for nRF51, no action required */ +#define WAIT_FOR_WR_BUF_EMPTY(r) +#endif + +#ifndef BB_ENABLE_INLINE_ENC_TX +#define BB_ENABLE_INLINE_ENC_TX FALSE +#endif + +#ifndef BB_ENABLE_INLINE_DEC_RX +#define BB_ENABLE_INLINE_DEC_RX FALSE +#endif + +/*! \brief convert little endian byte buffer to uint16_t. */ +#define BYTES_TO_UINT16(n, p) {n = ((uint16_t)(p)[0] + ((uint16_t)(p)[1] << 8));} + +/************************************************************************************************** + Typedefs +**************************************************************************************************/ + +/* driver states */ +typedef enum +{ + NULL_STATE, + SLEEP_STATE, + IDLE_STATE, + TX_STATE, + RX_STATE, + PRBS15_STATE +} bbDriverState_t; + +/* TIFS states */ +typedef enum +{ + TIFS_NULL, + TIFS_TX_RAMPUP, + TIFS_RX_RAMPUP +} bbTifsState_t; + + +/************************************************************************************************** + Local Functions +**************************************************************************************************/ +static void palBbTxHwRadioConfig(uint8_t * pTxBuf); +static void palBbRxHwRadioConfig(uint8_t * pRxBuf, uint16_t len); +static void palBbRadioHardStop(void); +static void palBbRestoreTrl(void); +static uint8_t *palBbGetTxData(PalBbBleTxBufDesc_t descs[], uint8_t cnt); + +/* IRQ callback declarations. */ +static void BbBleDrvTimerIRQHandler(void); +static void BbBleDrvRadioIRQHandler(void); + +/************************************************************************************************** + Local Variables +**************************************************************************************************/ +volatile bbDriverState_t driverState = NULL_STATE; +volatile bbTifsState_t tifsState; +uint8_t bbRadioPcnf1WhiteEn; +PalBbBleTxIsr_t bbTxCallback = NULL; +PalBbBleRxIsr_t bbRxCallback = NULL; +uint32_t bbRxTimeoutUsec; +uint8_t * bbpRxBuf; +uint32_t bbAntennaDueTime; +uint32_t bbEventStartTime; +uint16_t bbDueOffsetUsec; +int8_t bbTxTifsAdj; +uint8_t bbChanIndex; +uint8_t bbTxPhy; +uint8_t bbRxPhy; +uint8_t bbTxPhyOptions; +uint8_t bbRxPhyOptions; +uint8_t tifsTxPhyOptions; +uint16_t bbTxLen; +bool_t bbEncryptTxFlag; +bool_t bbEncryptTxSuppressMic; +uint8_t bbEncryptTxBuf[ENC_TX_BUF_LEN+2]; /* add two for overrun protection */ +uint8_t bbEncryptScratchBuf[ENC_SCRATCH_BUF_LEN+2]; /* add two for overrun protection */ +uint8_t bbEncryptOutBuf[ENC_OUTPUT_BUF_LEN+2]; /* add two for overrun protection */ +uint8_t bbEncryptCcmData[ENC_CCM_DATA_STRUCT_LEN]; +uint8_t bbTrlSave[BB_TRL_MAX_LEN]; +uint8_t *bbTrlSavedPtr = NULL; +uint8_t bbTrlSavedLen; + +#ifndef BB_ASSERT_ENABLED +#define BB_ASSERT_ENABLED FALSE +#endif +#if BB_ASSERT_ENABLED == TRUE +bool_t keySetFlag = 0; +bool_t ivSetFlag = 0; +bool_t packetCountSetFlag = 0; +#endif + +#if (LL_ENABLE_TESTER == TRUE) +uint32_t bbRxAccAddr; +uint32_t bbTxAccAddr; +uint32_t bbRxCrcInit; +uint32_t bbTxCrcInit; +uint16_t bbModifyTxHdrMask = 0; +uint16_t bbModifyTxHdrValue = 0; +uint8_t bbTxCrcInitInvalidStep = 0; +uint8_t bbTxAccAddrInvalidStep = 0; +uint8_t bbRxCrcInitInvalidStep = 0; +uint8_t bbRxAccAddrInvalidStep = 0; +uint32_t bbTxCrcInitInvalidAdjMask = 0; +uint32_t bbTxAccAddrInvalidAdjMask = 0; +uint32_t bbRxCrcInitInvalidAdjMask = 0; +uint32_t bbRxAccAddrInvalidAdjMask = 0; +uint64_t bbTxCrcInitInvalidChanMask = 0; +uint64_t bbTxAccAddrInvalidChanMask = 0; +uint64_t bbRxCrcInitInvalidChanMask = 0; +uint64_t bbRxAccAddrInvalidChanMask = 0; +bool_t bbTxAccAddrShiftMask = FALSE; +bool_t bbRxAccAddrShiftMask = FALSE; +bool_t bbTxAccAddrShiftInc = FALSE; +#endif + +/* enable BB assertions */ +#ifdef BB_ENABLE_ASSERT +#define BB_ASSERT(x) { if (!(X)) { return; } } +#else +#define BB_ASSERT(x) +#endif + +#ifdef BB_REQ_ALIGN +#define BB_ALIGN_ASSERT(pBuf) { if (!((((uint32_t)(pBuf)) & 0x3) == 0)) { return; } } +#else +#define BB_ALIGN_ASSERT(pBuf) +#endif + +/* enable trace here or with conditional compilation */ +#define xBB_TRACE + +///////////////////////////////////////////////////////////////////////////////// +/* enable diagnostic here or via project level define */ +#define xDIAGNOSTICS + +///////////////////////////////////////////////////////////////////////////////// +#ifdef DIAGNOSTICS +typedef enum +{ + DIAG_NULL, + DIAG_TX, + DIAG_RX, + DIAG_TX_TIFS, + DIAG_RX_TIFS +} diag_op_t; + +static void DiagFauxTxCallback(uint8_t status); +static void DiagFauxRxCallback(uint8_t status, int8_t rssi, uint32_t crc, uint32_t timestamp); + +PalBbBleTxIsr_t diagTxCallback; +PalBbBleRxIsr_t diagRxCallback; + +diag_op_t diagOp = DIAG_NULL; +diag_op_t diagOpLast = DIAG_NULL; +uint8_t diagLastStatus = 0xFF; + +/* transmit diagnostics */ +uint16_t diagTxTotalCalls = 0; +uint16_t diagTxCalls = 0; +uint16_t diagTxTifsCalls = 0; + +uint16_t diagTxSuccess = 0; +uint16_t diagTxFail = 0; + +uint16_t diagTxTifsSuccess = 0; +uint16_t diagTxTifsFail = 0; + +uint16_t diagTxFailBadDueTime = 0; +uint16_t diagTxFailMissedDueTime = 0; +uint16_t diagTxBlueMoonWin = 0; + +uint16_t diagTxTifsFailMissed = 0; +uint16_t diagTxTifsFailNotPossible = 0; +uint16_t diagTxTifsBlueMoonWin = 0; + +/* receive diagnostics */ +uint16_t diagRxTotalCalls = 0; +uint16_t diagRxCalls = 0; +uint16_t diagRxTifsCalls = 0; + +uint16_t diagRxSuccess = 0; +uint16_t diagRxFail = 0; +uint16_t diagRxTimeout = 0; +uint16_t diagRxCrcFail = 0; + +uint16_t diagRxTifsSuccess = 0; +uint16_t diagRxTifsFail = 0; +uint16_t diagRxTifsTimeout = 0; +uint16_t diagRxTifsCrcFail = 0; + +uint16_t diagRxFailBadDueTime = 0; +uint16_t diagRxFailMissedDueTime = 0; +uint16_t diagRxBlueMoonWin = 0; + +uint16_t diagRxTifsFailMissed = 0; +uint16_t diagRxTifsFailNotPossible = 0; +uint16_t diagRxTifsBlueMoonWin = 0; + +/* misc */ +uint16_t diagCancels = 0; +#endif +///////////////////////////////////////////////////////////////////////////////// + +#define DIAG_USER_DEBUG_PINS_ENA 0 + +#define DIAG_PINS_ENA 0 + +#if DIAG_PINS_ENA +#if defined(BOARD_PCA10028) + +#define TX_PIN 12 /* P0.12 */ +#define RX_PIN 13 /* P0.13 */ +#define RADIO_READY_TOGGLE_PIN 15 /* P0.15 */ +#define RADIO_END_TOGGLE_PIN 16 /* P0.16 */ +#define RADIO_INT_PIN 17 /* P0.17 */ +#define TIMER0_INT_PIN 18 /* P0.18 */ + +#define DIAG_PIN_SET(x) { nrf_gpio_pin_set(x); } +#define DIAG_PIN_CLEAR(x) { nrf_gpio_pin_clear(x); } + +#elif defined(BOARD_PCA10040) + +#define TX_PIN 11 /* P0.11 */ +#define RX_PIN 12 /* P0.12 */ +#define RADIO_READY_TOGGLE_PIN 13 /* P0.13 */ +#define RADIO_END_TOGGLE_PIN 14 /* P0.14 */ +#define RADIO_INT_PIN 0 /* P0.00 */ +#define TIMER0_INT_PIN 1 /* P0.01 */ + +#define DIAG_PIN_SET(x) { nrf_gpio_pin_set(x); } +#define DIAG_PIN_CLEAR(x) { nrf_gpio_pin_clear(x); } +#elif defined(BOARD_PCA10056) + +#define TX_PIN 3 /* P0.03 */ +#define RX_PIN 4 /* P0.04 */ +#define RADIO_READY_TOGGLE_PIN 30 /* P0.30 */ +#define RADIO_END_TOGGLE_PIN 31 /* P0.31 */ +#define RADIO_INT_PIN 29 /* P0.29 */ +#define TIMER0_INT_PIN 28 /* P0.28 */ + +#define DIAG_USER_DEBUG_PINS_ENA 1 +#define USER_DEBUG_0_PIN 35 /* P1.03 */ +#define USER_DEBUG_1_PIN 36 /* P1.04 */ +#define USER_DEBUG_2_PIN 37 /* P1.05 */ +#define USER_DEBUG_3_PIN 38 /* P1.06 */ + +#define DIAG_PIN_SET(x) { nrf_gpio_pin_set(x); } +#define DIAG_PIN_CLEAR(x) { nrf_gpio_pin_clear(x); } +#else +#error "Diagnostic pins not supported on board" +#endif + +#else // DIAG_PINS_ENA + +#define DIAG_PIN_SET(x) +#define DIAG_PIN_CLEAR(x) +#endif // DIAG_PINS_ENA + +///////////////////////////////////////////////////////////////////////////////// + +/*************************************************************************************************/ +/*! + * \brief Set radio mode. + * + * \param phy PHY. + * \param option PHY option. + * + * \return None. + */ +/*************************************************************************************************/ +static inline void palBbSetRadioMode(uint8_t phy, uint8_t option) +{ + switch(phy) + { + case BB_PHY_BLE_1M: + NRF_RADIO->MODE = RADIO_MODE_MODE_Ble_1Mbit; + break; + +#if defined(NRF52832_XXAA) + case BB_PHY_BLE_2M: + NRF_RADIO->MODE = RADIO_MODE_MODE_Nrf_2Mbit; + break; +#elif defined(NRF52840_XXAA) + case BB_PHY_BLE_2M: + NRF_RADIO->MODE = RADIO_MODE_MODE_Ble_2Mbit; + break; +#endif + +#if defined(NRF52840_XXAA) + case BB_PHY_BLE_CODED: + if (option == BB_PHY_OPTIONS_BLE_S2) + { + NRF_RADIO->MODE = RADIO_MODE_MODE_Ble_LR500Kbit; + } + else + { + NRF_RADIO->MODE = RADIO_MODE_MODE_Ble_LR125Kbit; + } + break; +#endif + + default: + NRF_RADIO->MODE = RADIO_MODE_MODE_Ble_1Mbit; + break; + } + +#if defined(NRF52832_XXAA) + *(volatile uint32_t*)0x40001777 = 0UL; /* Disable fault tolerant AA correlator. */ +#endif +} + +#if (USE_RTC_BB_CLK) +/*************************************************************************************************/ +/*! + * \brief Set the time for the HFCLK to start. + * + * \param startTime HFCLK start time. + * + * \return None. + * + * Setup the RTC clock to start the HFCLK. + */ +/*************************************************************************************************/ +static void palBbSetHfClkStart(uint32_t startTime) +{ + bbEventStartTime = NRF_RTC0->CC[1] = startTime; + NRF_RTC0->EVENTS_COMPARE[1] = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_RTC0->EVENTS_COMPARE[1]); + + uint32_t rtcNow = NRF_RTC0->COUNTER; + if (((startTime - rtcNow) & PAL_MAX_RTC_COUNTER_VAL) <= HFCLK_OSC_SETTLE_TICKS) + { + /* not enough time for oscillator to settle; leave HFCLK running */ + return; + } + + NRF_CLOCK->TASKS_HFCLKSTOP = 1; + NRF_CLOCK->EVENTS_HFCLKSTARTED = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_CLOCK->EVENTS_HFCLKSTARTED); + + NRF_RTC0->CC[2] = (startTime - HFCLK_OSC_SETTLE_TICKS) & PAL_MAX_RTC_COUNTER_VAL; + NRF_RTC0->EVENTS_COMPARE[2] = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_RTC0->EVENTS_COMPARE[2]); +} +#endif + +#if (BB_ENABLE_INLINE_ENC_TX || BB_ENABLE_INLINE_DEC_RX) +/*************************************************************************************************/ +/*! + * \brief Enable or disable inline encryption on transmit. + * + * \param enable Boolean flag to enable or disable TX encryption + * + * \return None. + * + */ +/*************************************************************************************************/ +static void palBbBleInlineEncryptTxEnable(bool_t enable) +{ + BB_ASSERT(driverState == IDLE_STATE); /* driver must be idle */ + + /* copy encryption enable to global variable */ + bbEncryptTxFlag = enable; + + /* set or clear enable of encryption on transmit */ + if (enable) + { + NRF_CCM->ENABLE = CCM_ENABLE_ENABLE_Enabled; + } + else + { + NRF_CCM->ENABLE = CCM_ENABLE_ENABLE_Disabled; + } +} + +/*************************************************************************************************/ +/*! + * \brief Set inline encryption/decryption MIC suppression. + * + * \param enable Boolean flag to indicate if MIC is suppressed + * + * \return None. + * + */ +/*************************************************************************************************/ +static void palBbBleInlineEncryptDecryptSuppressMic(bool_t enable) +{ + BB_ASSERT(driverState == IDLE_STATE); /* driver must be idle */ + + /* copy to global variable */ + bbEncryptTxSuppressMic = enable; +} + +/*************************************************************************************************/ +/*! + * \brief Set inline encryption/decryption key. + * + * \param key Pointer to 16-byte key value + * + * \return None. + * + */ +/*************************************************************************************************/ +static void palBbBleInlineEncryptDecryptSetKey(uint8_t * key) +{ + uint8_t i; + + BB_ASSERT(driverState == IDLE_STATE); /* driver must be idle */ + + #if BB_ASSERT_ENABLED == TRUE + keySetFlag = 1; + #endif + + /* populate encryption structure with reversed stored key */ + for (i=0; i<16; i++) + { + bbEncryptCcmData[i] = key[15-i]; + } +} + +/*************************************************************************************************/ +/*! + * \brief Set inline encryption/decryption IV (initialization vector). + * + * \param key Pointer to 8-byte value for IV + * + * \return None. + * + */ +/*************************************************************************************************/ +static void palBbBleDrvInlineEncryptDecryptSetIv(uint8_t * iv) +{ + BB_ASSERT(driverState == IDLE_STATE); /* driver must be idle */ + + #if BB_ASSERT_ENABLED == TRUE + ivSetFlag = 1; + #endif + + /* copy the 8-byte initialization vector */ + memcpy(&bbEncryptCcmData[25], iv, 8); +} +#endif + +/*************************************************************************************************/ +/*! + * \brief Set inline encryption/decryption direction bit. + * + * \param dir 0=slave, non-zero=master + * + * \return None. + * + */ +/*************************************************************************************************/ +void PalBbBleInlineEncryptDecryptSetDirection(uint8_t dir) +{ + if (dir) + { + /* master */ + bbEncryptCcmData[24] = 1; + } + else + { + bbEncryptCcmData[24] = 0; + } +} + +/*************************************************************************************************/ +/*! + * \brief Set the inline encryption packet count for transmit. + * + * \param count Packet counter value, a 39-bit value + * + * \return None. + * + */ +/*************************************************************************************************/ +void PalBbBleInlineEncryptSetPacketCount(uint64_t count) +{ + BB_ASSERT(driverState == IDLE_STATE); /* driver must be idle */ + + #if BB_ASSERT_ENABLED == TRUE + packetCountSetFlag = 1; + #endif + + /* populate packet counter */ + bbEncryptCcmData[16] = (count >> 0) & 0xFF; + bbEncryptCcmData[17] = (count >> 8) & 0xFF; + bbEncryptCcmData[18] = (count >> 16) & 0xFF; + bbEncryptCcmData[19] = (count >> 24) & 0xFF; + bbEncryptCcmData[20] = (count >> 32) & 0x7F; /* only 7-bits of MSB are used (packet count is 39 bits) */ +} + +/*************************************************************************************************/ +/*! + * \brief Initialize the BLE baseband driver. + * + * \return None. + * + * One-time initialization of BLE baseband driver. + */ +/*************************************************************************************************/ +void PalBbBleInit(void) +{ + BB_ASSERT( LL_AA_LEN == (NORDIC_PREFIX_LEN + NORDIC_BASE_ADDR_LEN) ); /* internal integrity check */ + BB_ASSERT(driverState == NULL_STATE); /* driver should only be initialized once */ + + /* initialize callback routines to NULL */ + bbTxCallback = NULL; + bbRxCallback = NULL; + + /* give timeout an initial value, used by assert */ + bbRxTimeoutUsec = 0; + +#if defined(NRF52840_XXAA) || defined(NRF52832_XXAA) + NRF_RADIO->MODECNF0 = RADIO_MODECNF0_RU_Fast << RADIO_MODECNF0_RU_Pos; +#endif + +#if defined(NRF51) + /* if available, copy in the factory radio calibration values */ + if ((NRF_FICR->OVERRIDEEN & FICR_OVERRIDEEN_BLE_1MBIT_Msk) == 0) + { + NRF_RADIO->OVERRIDE0 = NRF_FICR->BLE_1MBIT[0]; + NRF_RADIO->OVERRIDE1 = NRF_FICR->BLE_1MBIT[1]; + NRF_RADIO->OVERRIDE2 = NRF_FICR->BLE_1MBIT[2]; + NRF_RADIO->OVERRIDE3 = NRF_FICR->BLE_1MBIT[3]; + NRF_RADIO->OVERRIDE4 = NRF_FICR->BLE_1MBIT[4] | RADIO_OVERRIDE4_ENABLE_Msk; + } +#endif + + /* CRC configuration */ + NRF_RADIO->CRCCNF = LL_CRC_LEN | RADIO_CRCCNF_SKIP_ADDR_Msk; /* set length, skip address as part of CRC */ + NRF_RADIO->CRCPOLY = 0x0000065B; /* crc polynomial, value from bluetooth spec */ + + /* set logical address 0 for transmit (uses PREFIX0.AP0/BASE0 pair) */ + NRF_RADIO->TXADDRESS = 0; + + /* enable receive address on logical address 0 (uses PREFIX0.AP0/BASE0 pair) */ + NRF_RADIO->RXADDRESSES = 1; /* NOTE: this is a bitmask, a '1' enables logical address 0 */ + + /* configure CCM hardware */ + NRF_CCM->INPTR = (uint32_t)bbEncryptTxBuf; + NRF_CCM->MODE = CCM_MODE_MODE_Encryption; + NRF_CCM->OUTPTR = (uint32_t)bbEncryptOutBuf; + NRF_CCM->SCRATCHPTR = (uint32_t)bbEncryptScratchBuf; + NRF_CCM->CNFPTR = (uint32_t)bbEncryptCcmData; + + /* set default direction in CCM structure */ + bbEncryptCcmData[24] = 0; /* 0=slave, 1=master */ + + /* set default value for data whitening */ + bbRadioPcnf1WhiteEn = RADIO_PCNF1_WHITEEN_Enabled; + + /* set initial value for TIFS adjustment */ + bbTxTifsAdj = 0; + + /* set default of no encryption */ + bbEncryptTxFlag = 0; + +#if (USE_RTC_BB_CLK) + NRF_RTC0->EVTENCLR = RTC_EVTENCLR_COMPARE1_Msk; + NRF_RTC0->EVTENCLR = RTC_EVTENCLR_COMPARE2_Msk; +#endif + + /* update driver state */ + driverState = SLEEP_STATE; + + ///////////////////////////////////////////////////////////////////////////////// + #if BB_ASSERT_ENABLED + /* initialize buffers with 0xAA's, last two bytes used by assert to detect buffer overrun */ + memset(bbEncryptTxBuf, 0xAA, sizeof(bbEncryptTxBuf)); + memset(bbEncryptOutBuf, 0xAA, sizeof(bbEncryptOutBuf)); + memset(bbEncryptScratchBuf, 0xAA, sizeof(bbEncryptScratchBuf)); + #endif + ///////////////////////////////////////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////////////////////////// + #if DIAG_PINS_ENA + /* initialize diagnostics pins */ + nrf_gpio_cfg_output(TX_PIN); + nrf_gpio_cfg_output(RX_PIN); + nrf_gpio_cfg_output(RADIO_READY_TOGGLE_PIN); + nrf_gpio_cfg_output(RADIO_END_TOGGLE_PIN); + nrf_gpio_cfg_output(RADIO_INT_PIN); + nrf_gpio_cfg_output(TIMER0_INT_PIN); + + /* initialize PPI/GPIOTE to toggle pin on every radio READY event */ + #define READY_GPIOTE_CHAN 0 + NRF_PPI->CH[11].EEP = (uint32_t)&NRF_RADIO->EVENTS_READY; + NRF_PPI->CH[11].TEP = (uint32_t)&NRF_GPIOTE->TASKS_OUT[READY_GPIOTE_CHAN]; + NRF_PPI->CHENSET = PPI_CHENSET_CH11_Msk; + + nrf_gpiote_task_configure( READY_GPIOTE_CHAN, + RADIO_READY_TOGGLE_PIN, + NRF_GPIOTE_POLARITY_TOGGLE, + NRF_GPIOTE_INITIAL_VALUE_LOW ); + nrf_gpiote_task_enable( READY_GPIOTE_CHAN ); + + /* initialize PPI/GPIOTE to toggle pin on every radio END event */ + #define END_GPIOTE_CHAN 1 + NRF_PPI->CH[12].EEP = (uint32_t)&NRF_RADIO->EVENTS_END; + NRF_PPI->CH[12].TEP = (uint32_t)&NRF_GPIOTE->TASKS_OUT[END_GPIOTE_CHAN]; + NRF_PPI->CHENSET = PPI_CHENSET_CH12_Msk; + + nrf_gpiote_task_configure( END_GPIOTE_CHAN, + RADIO_END_TOGGLE_PIN, + NRF_GPIOTE_POLARITY_TOGGLE, + NRF_GPIOTE_INITIAL_VALUE_LOW ); + nrf_gpiote_task_enable( END_GPIOTE_CHAN ); + #endif + ///////////////////////////////////////////////////////////////////////////////// + + #if DIAG_USER_DEBUG_PINS_ENA + /* initialize diagnostics pins for user-debug. */ + nrf_gpio_cfg_output(USER_DEBUG_0_PIN); + nrf_gpio_cfg_output(USER_DEBUG_1_PIN); + nrf_gpio_cfg_output(USER_DEBUG_2_PIN); + nrf_gpio_cfg_output(USER_DEBUG_3_PIN); + #endif + + bbTxPhyOptions = BB_PHY_OPTIONS_DEFAULT; + bbRxPhyOptions = BB_PHY_OPTIONS_DEFAULT; + tifsTxPhyOptions = BB_PHY_OPTIONS_DEFAULT; + + PalBbRegisterProtIrq(BB_PROT_BLE, BbBleDrvTimerIRQHandler, BbBleDrvRadioIRQHandler); + PalBbRegisterProtIrq(BB_PROT_BLE_DTM, BbBleDrvTimerIRQHandler, BbBleDrvRadioIRQHandler); +} + +/*************************************************************************************************/ +/*! + * \brief Enable the BB hardware. + * + * \return None. + * + * Wake the BB hardware out of sleep and enable for operation. All BB functionality is + * available when this routine completes. BB clock is set to zero and started. + */ +/*************************************************************************************************/ +void PalBbBleEnable(void) +{ + /* Give the BB the highest priority. */ + NVIC_SetPriority(RADIO_IRQn, 0); + NVIC_SetPriority(TIMER0_IRQn, 0); + + BB_ASSERT(NVIC_GetPriority(RADIO_IRQn) == NVIC_GetPriority(TIMER0_IRQn)); /* BB driver related interrupts must have same priority */ + BB_ASSERT(driverState == SLEEP_STATE); /* the BB driver should never be re-enabled */ + BB_ASSERT(NRF_CLOCK->HFCLKSTAT & CLOCK_HFCLKSTAT_STATE_Msk); /* HF clock must be running */ +#if (!USE_RTC_BB_CLK) + BB_ASSERT(NRF_CLOCK->HFCLKSTAT & CLOCK_HFCLKSTAT_SRC_Msk); /* HF clock source must be the crystal */ +#endif + + /* stop timer if it was somehow running (timer must be stopped for configuration) */ + NRF_TIMER0->TASKS_STOP = 1; + + /* clear timer to zero count */ + NRF_TIMER0->TASKS_CLEAR = 1; + + /* configure timer */ + NRF_TIMER0->MODE = TIMER_MODE_MODE_Timer; + NRF_TIMER0->BITMODE = TIMER_BITMODE_BITMODE_32Bit; + NRF_TIMER0->PRESCALER = TIMER_PRESCALER; /* f = 16MHz / (2 ^ TIMER_PRESCALER), for TIMER_PRESCALER of 4, clock has 1us resolution + TIMER_PRESCALER of 3, clock is 0.5us resolution + TIMER_PRESCALER of 2, clock is 0.25us resolution + TIMER_PRESCALER of 1, clock is 0.125us resolution */ + + /* + * Configure the PPI Channel 13 - "Chan 13: RTC.COMPARE[0] -> TIMER[0].START" + * + * This channel is used to trigger starting TIMER[0] for radio operations. + */ +#if (USE_RTC_BB_CLK) + /* timer0 starts when RTC0.COMPARE[1] event is triggered */ + NRF_PPI->CH[13].EEP = (uint32_t) &NRF_RTC0->EVENTS_COMPARE[1]; + NRF_PPI->CH[13].TEP = (uint32_t) &NRF_TIMER0->TASKS_START; + NRF_PPI->CHENSET = PPI_CHENSET_CH13_Msk; /* enable channel */ + + /* HFCLK starts when RTC0.COMPARE[2] event is triggered */ + NRF_PPI->CH[10].EEP = (uint32_t) &NRF_RTC0->EVENTS_COMPARE[2]; + NRF_PPI->CH[10].TEP = (uint32_t) &NRF_CLOCK->TASKS_HFCLKSTART; + NRF_PPI->CHENSET = PPI_CHENSET_CH10_Msk; /* enable channel */ +#else + /* timer0 is a free running clock */ + NRF_TIMER0->TASKS_START = 1; +#endif + + /* + * Configure the PPI Channel 14 - "Chan 14: TIMER[0].COMPARE[0] -> TXEN/RXEN" + * + * This channel is used to trigger radio task TXEN, or RXEN, on timer event COMPARE[0]. + * It is only enabled when needed. The PPI task parameter is meant to be configured just + * before the channel is enabled. This task will be either TXEN or RXEN depending on radio + * operation. The event is static and never changes. It is configured below. + */ + NRF_PPI->CH[14].EEP = (uint32_t) &NRF_TIMER0->EVENTS_COMPARE[0]; /* configure event */ + + /* + * Configure and enable PPI Channel 15 - "Chan 15: PAYLOAD -> CAPTURE[2]" + * + * This channel is used to capture the timer value on every radio PAYLOAD event. + * It is configured to trigger timer task CAPTURE[2] which copies the timer to CC[2]. + * + * Once this channel is set up and enabled, it requires no further action. + * It will stay active until the BB driver is disabled. + */ + NRF_PPI->CH[15].EEP = (uint32_t) &NRF_RADIO->EVENTS_PAYLOAD; /* configure event */ + NRF_PPI->CH[15].TEP = (uint32_t) &NRF_TIMER0->TASKS_CAPTURE[2]; /* configure task */ + NRF_PPI->CHENSET = PPI_CHENSET_CH15_Msk; /* enable channel */ + + /* + * NOTE: Per Nordic support team response, PPI channels do not require a reset. + * The PPI configured event will trigger the configured task every time it happens, + * regardless if the EVENT register is cleared or not. (This is not clear from the + * reference manual.) + */ + + /* clear out and enable TIMER0 interrupts at system level */ + NRF_TIMER0->INTENCLR = 0xFFFFFFFF; + NVIC_ClearPendingIRQ(TIMER0_IRQn); + NVIC_EnableIRQ(TIMER0_IRQn); + + /* clear out and enable RADIO interrupts at system level */ + NRF_RADIO->INTENCLR = 0xFFFFFFFF; + NVIC_ClearPendingIRQ(RADIO_IRQn); + NVIC_EnableIRQ(RADIO_IRQn); + + /* clear out and enable CCM/AAR interrupts at system level */ + NRF_CCM->INTENCLR = 0xFFFFFFFF; + NVIC_ClearPendingIRQ(CCM_AAR_IRQn); + NVIC_EnableIRQ(CCM_AAR_IRQn); + + /* + * Enable all the radio interrupts that are used. Per design, these are to + * be left on as long as the BB driver is enabled. + */ + +#if (USE_RTC_BB_CLK) + NRF_RTC0->EVTENSET = RTC_EVTENSET_COMPARE1_Msk; + NRF_RTC0->EVTENSET = RTC_EVTENSET_COMPARE2_Msk; +#endif + + /* enable the radio "TIFS Expired" interrupt (triggers on radio PAYLOAD event) */ + NRF_RADIO->EVENTS_READY = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_RADIO->EVENTS_READY); + NRF_RADIO->INTENSET = RADIO_INTENSET_READY_Msk; + + /* enable the radio "Timestamp/TIFS Setup" interrupt (triggers on radio PAYLOAD event) */ + NRF_RADIO->EVENTS_PAYLOAD = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_RADIO->EVENTS_PAYLOAD); + NRF_RADIO->INTENSET = RADIO_INTENSET_PAYLOAD_Msk; + + /* enable the radio "TX-RX Complete" interrupt (triggers on radio END event) */ + NRF_RADIO->EVENTS_DISABLED = 0; + NRF_RADIO->EVENTS_END = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_RADIO->EVENTS_END); + NRF_RADIO->INTENSET = RADIO_INTENSET_END_Msk; + + /* put the radio is a definite know state */ + palBbRadioHardStop(); +} + +/*************************************************************************************************/ +/*! + * \brief Disable the BB hardware. + * + * \return None. + * + * Disable the baseband and put radio hardware to sleep. Must be called from an idle state. + * A radio operation cannot be in progress. + */ +/*************************************************************************************************/ +void PalBbBleDisable(void) +{ + BB_ASSERT(driverState == IDLE_STATE); /* can only disable if radio is idle */ + + /* slight chance that a TIFS operation is ramping up, this will stop it */ + palBbRadioHardStop(); + + /* stop timer */ + NRF_TIMER0->TASKS_STOP = 1; + + /* disable PPI channels */ + NRF_PPI->CHENCLR = PPI_CHENCLR_CH14_Msk; /* Chan 14: COMPARE[0] -> TXEN/RXEN */ + NRF_PPI->CHENCLR = PPI_CHENCLR_CH15_Msk; /* Chan 15: PAYLOAD -> CAPTURE[2] */ + +#if (USE_RTC_BB_CLK) + NRF_RTC0->EVTENCLR = RTC_EVTENCLR_COMPARE1_Msk; + NRF_RTC0->EVTENCLR = RTC_EVTENCLR_COMPARE2_Msk; +#endif + + /* disable and clean up TIMER0 interrupts */ + NVIC_DisableIRQ(TIMER0_IRQn); + NRF_TIMER0->INTENCLR = 0xFFFFFFFF; + NVIC_ClearPendingIRQ(TIMER0_IRQn); + + /* disable and clean up RADIO interrupts */ + NVIC_DisableIRQ(RADIO_IRQn); + NRF_RADIO->INTENCLR = 0xFFFFFFFF; + NVIC_ClearPendingIRQ(RADIO_IRQn); + + /* disable and clean up CCM/AAR interrupts */ + NVIC_DisableIRQ(CCM_AAR_IRQn); + NRF_CCM->INTENCLR = 0xFFFFFFFF; + NVIC_ClearPendingIRQ(CCM_AAR_IRQn); + + /* update driver state */ + driverState = SLEEP_STATE; +} + +/*************************************************************************************************/ +/*! + * \brief Set the packet transmit completion handler. + * + * \param pParam Callback called upon the completion of a transmit operation. + * + * \return None. + * + * The given \a txCback routine is called once and only once in response to \a BbDrvTx(). It + * should be called in the ISR context due to the transmit completion interrupt from the BB. + * If \a BbDrvTxCancel() is called with a return value of TRUE, \a txCback must not be executed. + * + */ +/*************************************************************************************************/ +void PalBbBleSetDataParams(const PalBbBleDataParam_t *pParam) +{ + BB_ASSERT(driverState == IDLE_STATE); /* driver must be idle */ + BB_ASSERT(pParam->txCback != NULL); /* must be set to something */ + BB_ASSERT(pParam->rxCback != NULL); /* must be set to something */ + + /* store the callback function addresses to local memory */ + bbTxCallback = pParam->txCback; + bbRxCallback = pParam->rxCback; + + /* store due time for future use */ + bbAntennaDueTime = pParam->due; + bbDueOffsetUsec = pParam->dueOffsetUsec; + +#if (USE_RTC_BB_CLK) + if (bbDueOffsetUsec > 31) + { + bbDueOffsetUsec = 31; + } +#endif + + /* store timeout value for future use */ + bbRxTimeoutUsec = pParam->rxTimeoutUsec; + + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + bbTxCallback = DiagFauxTxCallback; + diagTxCallback = pParam->txCback; + bbRxCallback = DiagFauxRxCallback; + diagRxCallback = pParam->rxCback; + #endif + // for diagnostic purposes, an override scheme where all callbacks pass through an internal path + ///////////////////////////////////////////////////////////////////////////////// +} + +/*************************************************************************************************/ +/*! + * \brief Set the operation parameters. + * + * \param pOpParam Operations parameters. + * + * \return None. + * + * Calling this routine will set parameters for the next transmit or receive operations. + */ +/*************************************************************************************************/ +void PalBbBleSetOpParams(const PalBbBleOpParam_t *pOpParam) +{ + +} + +/*************************************************************************************************/ +/*! + * \brief Set channelization parameters. + * + * \param pChan Channelization parameters. + * + * \return None. + * + * Calling this routine will set these parameters for all future transmit and receive operations + * until this routine is called again providing new parameters. + * + * The setting of channelization parameters influence the operations of the following listed + * routines. Therefore, this routine is called to set the channel characteristics before + * the use of these listed packet routines. + * + * - \a BbDrvTx() + * - \a BbDrvRx() + * - \a BbDrvTxTifs() + * - \a BbDrvRxTifs() + * + * \note The \a pParam contents are not guaranteed to be static and is only valid in the + * context of the call to this routine. Therefore parameters requiring persistence + * should be copied. + */ +/*************************************************************************************************/ +void PalBbBleSetChannelParam(PalBbBleChan_t *pChan) +{ + uint8_t rfChan; + int8_t txPower; + + BB_ASSERT(driverState == IDLE_STATE); /* driver must be idle */ + + /* stop any TIFS operation that might be ramping up */ + palBbRadioHardStop(); + + /* get the channel index into a local variable, for efficiency */ + bbChanIndex = pChan->chanIdx; + + /* save the PHYs */ + bbTxPhy = pChan->txPhy; + bbRxPhy = pChan->rxPhy; + bbTxPhyOptions = pChan->initTxPhyOptions; + tifsTxPhyOptions = pChan->tifsTxPhyOptions; + + BB_ASSERT((pChan->txPhy == BB_PHY_BLE_1M) || + (pChan->txPhy == BB_PHY_BLE_2M) || + (pChan->txPhy == BB_PHY_BLE_CODED)); + BB_ASSERT((pChan->rxPhy == BB_PHY_BLE_1M) || + (pChan->rxPhy == BB_PHY_BLE_2M) || + (pChan->rxPhy == BB_PHY_BLE_CODED)); + + /* convert channel index to RF channel, per bluetooth specification */ + rfChan = 0; /* initialize to zero to suppress compiler 'uninitialized' warning */ + if (bbChanIndex <= 10) { rfChan = bbChanIndex + 1; } + else if (bbChanIndex <= 36) { rfChan = bbChanIndex + 2; } + else if (bbChanIndex == 37) { rfChan = 0; } + else if (bbChanIndex == 38) { rfChan = 12; } + else if (bbChanIndex == 39) { rfChan = 39; } + else + { + BB_ASSERT(0); /* illegal channel index */ + } + + /* set the radio frequency */ + NRF_RADIO->FREQUENCY = 2 + (rfChan * 2); /* over-the-air freq = 2400Hz + value in FREQUENCY */ + + /* set the data whitening initial value, based on channel index per bluetooth spec */ + NRF_RADIO->DATAWHITEIV = bbChanIndex | 0x40; /* position zero is always '1', it gets "or'ed" in here with 0x40 */ + + /* set access addresses for logical address 0, which uses the PREFIX0.AP0/BASE0 pair */ + NRF_RADIO->PREFIX0 = (pChan->accAddr & 0xFF000000) >> 24; + NRF_RADIO->BASE0 = (pChan->accAddr & 0x00FFFFFF) << 8; + +#if (LL_ENABLE_TESTER == TRUE) + /* store access address overrides */ + bbRxAccAddr = pChan->accAddrRx; + bbTxAccAddr = pChan->accAddrTx; +#endif + + /* set initial CRC */ + NRF_RADIO->CRCINIT = pChan->crcInit; + +#if (LL_ENABLE_TESTER == TRUE) + /* store CRC init overrides */ + bbRxCrcInit = pChan->crcInitRx; + bbTxCrcInit = pChan->crcInitTx; +#endif + + /* get the transmit power into a local variable, for efficiency */ + txPower = pChan->txPower; + +#if defined(NRF52840_XXAA) + if (txPower >= 8) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Pos8dBm; txPower = 8; } + else if (txPower >= 7) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Pos7dBm; txPower = 7; } + else if (txPower >= 6) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Pos6dBm; txPower = 6; } + else if (txPower >= 5) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Pos5dBm; txPower = 5; } + else if (txPower >= 4) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Pos4dBm; txPower = 4; } + else if (txPower >= 3) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Pos3dBm; txPower = 3; } + else if (txPower >= 2) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Pos2dBm; txPower = 2; } + else if (txPower >= 0) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_0dBm; txPower = 0; } + else if (txPower >= -4) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg4dBm; txPower = -4; } + else if (txPower >= -8) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg8dBm; txPower = -8; } + else if (txPower >= -12) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg12dBm; txPower = -12; } + else if (txPower >= -16) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg16dBm; txPower = -16; } + else if (txPower >= -20) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg20dBm; txPower = -20; } + else { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg40dBm; txPower = -40; } +#elif defined(NRF52832_XXAA) + if (txPower >= 4) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Pos4dBm; txPower = 4; } + else if (txPower >= 3) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Pos3dBm; txPower = 3; } + else if (txPower >= 0) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_0dBm; txPower = 0; } + else if (txPower >= -4) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg4dBm; txPower = -4; } + else if (txPower >= -8) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg8dBm; txPower = -8; } + else if (txPower >= -12) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg12dBm; txPower = -12; } + else if (txPower >= -16) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg16dBm; txPower = -16; } + else if (txPower >= -20) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg20dBm; txPower = -20; } + else { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg40dBm; txPower = -40; } +#else + if (txPower >= 4) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Pos4dBm; txPower = 4; } + else if (txPower >= 0) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_0dBm; txPower = 0; } + else if (txPower >= -4) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg4dBm; txPower = -4; } + else if (txPower >= -8) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg8dBm; txPower = -8; } + else if (txPower >= -12) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg12dBm; txPower = -12; } + else if (txPower >= -16) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg16dBm; txPower = -16; } + else if (txPower >= -20) { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg20dBm; txPower = -20; } + else { NRF_RADIO->TXPOWER = RADIO_TXPOWER_TXPOWER_Neg30dBm; txPower = -30; } +#endif + + /* set the power parameter to the value that was actually set in hardware */ + pChan->txPower = txPower; + +#if (BB_ENABLE_INLINE_ENC_TX || BB_ENABLE_INLINE_DEC_RX) + /* enable inline encryption */ + palBbBleInlineEncryptTxEnable(pChan->enc.enaEncrypt); + + /* set encryption parameters */ + if (pChan->enc.enaEncrypt || pChan->enc.enaDecrypt) + { + palBbBleInlineEncryptDecryptSuppressMic(pChan->enc.nonceMode); + palBbBleInlineEncryptDecryptSetKey(pChan->enc.sk); + palBbBleDrvInlineEncryptDecryptSetIv(pChan->enc.iv); + } +#endif +} + +/*************************************************************************************************/ +/*! + * \brief Enable or disable data whitening. + * + * \param enable flag to indicate data whitening + * + * \return None. + * + * Sets an internal variable that indicates if data whitening is enabled or not. + * The value is used later when setting PCNF1 at beginning of TX or RX. + * + */ +/*************************************************************************************************/ +void PalBbBleEnableDataWhitening(bool_t enable) +{ + BB_ASSERT(driverState == IDLE_STATE); /* driver must be idle */ + + /* assume disabled */ + bbRadioPcnf1WhiteEn = RADIO_PCNF1_WHITEEN_Disabled; + + /* if enabled set accordingly */ + if (enable) + { + bbRadioPcnf1WhiteEn = RADIO_PCNF1_WHITEEN_Enabled; + } +} + +/*************************************************************************************************/ +/*! + * \brief Enable or disable PRBS15. + * + * \param enable flag to indicate PRBS15 + * + * \return None. + * + * Immediately enable or disable continuous PRBS15 bitstream. + */ +/*************************************************************************************************/ +void PalBbBleEnablePrbs15(bool_t enable) +{ + if (enable) + { + BB_ASSERT(driverState == IDLE_STATE); /* driver must be idle to enter this mode */ + + /* stop the radio in case a TIFS is ramping up */ + palBbRadioHardStop(); + + /* set test mode */ +#if defined(NRF52840_XXAA) || defined(NRF52832_XXAA) + palBbSetRadioMode(BB_PHY_BLE_1M, BB_PHY_OPTIONS_DEFAULT); + NRF_RADIO->MODECNF0 = RADIO_MODECNF0_DTX_Center << RADIO_MODECNF0_DTX_Pos; +#else + palBbSetRadioMode(BB_PHY_BLE_1M, BB_PHY_OPTIONS_DEFAULT); + NRF_RADIO->TEST = (RADIO_TEST_CONST_CARRIER_Enabled << RADIO_TEST_CONST_CARRIER_Pos) | + (RADIO_TEST_PLL_LOCK_Enabled << RADIO_TEST_PLL_LOCK_Pos); +#endif + + /* start transmitting constant carrier */ + NRF_RADIO->TASKS_TXEN = 1; + + /* update the driver state */ + driverState = PRBS15_STATE; + } + else + { + BB_ASSERT(driverState == PRBS15_STATE); /* not in test mode, cannot disable */ + +#if defined(NRF52840_XXAA) || defined(NRF52832_XXAA) + NRF_RADIO->MODECNF0 = 0; +#else + /* disable test mode */ + NRF_RADIO->TEST = 0; + + /* stop the radio */ + palBbRadioHardStop(); +#endif + + /* update the driver state */ + driverState = IDLE_STATE; + } +} + +/*************************************************************************************************/ +/*! + * \brief Transmit a packet. + * + * \param descs Array of transmit buffer descriptor. + * \param cnt Number of descriptors. + * + * \return None. + * + */ +/*************************************************************************************************/ +void PalBbBleTxData(PalBbBleTxBufDesc_t descs[], uint8_t cnt) +{ + uint8_t *pBuf = palBbGetTxData(descs, cnt); + +#if defined(BOARD_PCA10056) + /* + * Observed frequent failures with consecutive coded phy TX's. + * In the case, radio stays in TXDISABLE(temporary transition state) for too long. + * Calling palBbRadioHardStop multiple times seems to settle radio state into idle(Disabled) state. + */ + if (NRF_RADIO->STATE != RADIO_STATE_STATE_Disabled) + { + uint8_t num_cleanup = 0; + uint8_t busycount; + + while (num_cleanup < 3) + { + palBbRadioHardStop(); + + busycount = 0; + while ((NRF_RADIO->STATE != RADIO_STATE_STATE_Disabled) && (busycount < 20)) + { + busycount++; + } + + if (busycount < 20) + { + /* Radio state is cleared now, continue TxData operation. */ + break; + } + + if (++num_cleanup == 3) + { + palBbRestoreTrl(); + bbTxCallback(BB_STATUS_FAILED); + return; + } + } + } +#else + palBbRadioHardStop(); +#endif + + BB_ASSERT(driverState == IDLE_STATE); /* driver must be idle */ + BB_ASSERT(bbTxCallback != NULL); /* callback must be configured */ + BB_ALIGN_ASSERT(pBuf); + + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + BB_ASSERT(diagOp == DIAG_NULL); /* apparently previous operation did not complete */ + diagOp = DIAG_TX; + diagTxTotalCalls++; + diagTxCalls++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + +#if (LL_ENABLE_TESTER == TRUE) + uint16_t hdr; + BYTES_TO_UINT16(hdr, pBuf); + if ((hdr & bbModifyTxHdrMask) == bbModifyTxHdrValue) + { + /* set Tx access addresses */ + NRF_RADIO->PREFIX0 = (bbTxAccAddr & 0xFF000000) >> 24; + NRF_RADIO->BASE0 = (bbTxAccAddr & 0x00FFFFFF) << 8; + + if (bbTxAccAddrInvalidChanMask & (UINT64_C(1) << bbChanIndex)) + { + if ((bbTxAccAddrInvalidAdjMask & (1 << bbTxAccAddrInvalidStep)) || bbTxAccAddrShiftMask) + { + if (bbTxAccAddrShiftMask) + { + uint32_t invalidAA = (1 << bbTxAccAddrInvalidStep) ^ bbTxAccAddr; + + NRF_RADIO->PREFIX0 = (invalidAA & 0xFF000000) >> 24; + NRF_RADIO->BASE0 = (invalidAA & 0x00FFFFFF) << 8; + } + else + { + /* invalidate */ + NRF_RADIO->PREFIX0 = ((bbTxAccAddr ^ 0xFFFFFFFF) & 0xFF000000) >> 24; + NRF_RADIO->BASE0 = ((bbTxAccAddr ^ 0xFFFFFFFF) & 0x00FFFFFF) << 8; + } + } + + if (!bbTxAccAddrShiftMask) + { + if (++bbTxAccAddrInvalidStep > 31) + { + bbTxAccAddrInvalidStep = 0; + } + } + else + { + if (bbTxAccAddrShiftInc) + { + ++bbTxAccAddrInvalidStep; + } + else + { + --bbTxAccAddrInvalidStep; + } + + if (bbTxAccAddrInvalidStep > 20 && bbTxAccAddrShiftInc) + { + bbTxAccAddrInvalidStep = 31; + bbTxAccAddrShiftInc = FALSE; + } + else if (bbTxAccAddrInvalidStep < 12 && !bbTxAccAddrShiftInc) + { + bbTxAccAddrInvalidStep = 1; + bbTxAccAddrShiftInc = TRUE; + } + } + } + + /* set Tx CRC init */ + NRF_RADIO->CRCINIT = bbTxCrcInit; + if (bbTxCrcInitInvalidChanMask & (UINT64_C(1) << bbChanIndex)) + { + if (bbTxCrcInitInvalidAdjMask & (1 << bbTxCrcInitInvalidStep)) + { + /* invalidate */ + NRF_RADIO->CRCINIT = bbTxCrcInit ^ 0xFFFFFF; + } + + if (++bbTxCrcInitInvalidStep > 31) + { + bbTxCrcInitInvalidStep = 0; + } + } + } +#endif + + /* calculate start time */ + uint32_t txStart = bbAntennaDueTime - USEC_TO_TICKS(NRF5x_tTXEN_BLE_USECS + NRF5x_PROP_DELAY_TX_USECS); + + /* set timer compare CC[0] for time to trigger a transmit */ +#if (USE_RTC_BB_CLK) + if (bbDueOffsetUsec == 0) + { + bbDueOffsetUsec = 1; /* CC[0] can't trigger on 0 */ + } + + NRF_TIMER0->CC[0] = bbDueOffsetUsec; + NRF_TIMER0->EVENTS_COMPARE[0] = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_TIMER0->EVENTS_COMPARE[0]); + palBbSetHfClkStart(txStart); +#else + BB_ASSERT(bbDueOffsetUsec == 0); /* Always 0 with HFCLK. */ + NRF_TIMER0->CC[0] = txStart; + NRF_TIMER0->EVENTS_COMPARE[0] = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_TIMER0->EVENTS_COMPARE[0]); +#endif + + /* configure radio hardware registers for transmit */ + palBbTxHwRadioConfig(pBuf); + + /* set shortcuts to transmit as soon as radio warms up */ + NRF_RADIO->SHORTS = RADIO_SHORTS_READY_START_Msk | + RADIO_SHORTS_END_DISABLE_Msk; + + /* see if the due time is in the past (or a very long way, away) */ + if ((txStart - PalBbGetCurrentTime(USE_RTC_BB_CLK)) & 0x80000000) + { + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + diagTxFailBadDueTime++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + + /* run the callback function */ + palBbRestoreTrl(); + bbTxCallback(BB_STATUS_FAILED); + return; + } + + /* configure and enable PPI Chan 14, COMPARE[0] -> TXEN */ + NRF_PPI->CH[14].TEP = (uint32_t) &NRF_RADIO->TASKS_TXEN; /* configure task */ + NRF_PPI->CHENSET = PPI_CHENSET_CH14_Msk; /* enable channel */ + + /* see if the compare point was already reached */ + if (NRF_TIMER0->EVENTS_COMPARE[0]) + { + /* it's 99.99999% certain did not make it, but... maybe, just maybe... */ + if (NRF_RADIO->STATE == RADIO_STATE_STATE_Disabled) + { + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + diagTxFailMissedDueTime++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + + /* run the callback function */ + palBbRestoreTrl(); + bbTxCallback(BB_STATUS_FAILED); + return; + } + + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + diagTxBlueMoonWin++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + } + + /* update the driver state */ + driverState = TX_STATE; +} + +/*************************************************************************************************/ +/*! + * \brief Transmit packet on TIFS timing. + * + * \param descs Transmit data buffer descriptor. + * \param cnt Transmit data count. + * + * \return None. + * + * If possible, the transmit will occur at the TIFS timing. If not possible, the callback status + * will indicate this. + */ +/*************************************************************************************************/ +void PalBbBleTxTifsData(PalBbBleTxBufDesc_t descs[], uint8_t cnt) +{ + uint8_t *pBuf = palBbGetTxData(descs, cnt); + + BB_ASSERT(driverState == IDLE_STATE); /* driver must be idle */ + BB_ASSERT(bbTxCallback != NULL); /* callback must be configured */ + BB_ALIGN_ASSERT(pBuf); + + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + BB_ASSERT(diagOp == DIAG_NULL); + diagOp = DIAG_TX_TIFS; + diagTxTotalCalls++; + diagTxTifsCalls++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + +#if (LL_ENABLE_TESTER == TRUE) + uint16_t hdr; + BYTES_TO_UINT16(hdr, pBuf); + if ((hdr & bbModifyTxHdrMask) == bbModifyTxHdrValue) + { + /* set Tx access addresses */ + NRF_RADIO->PREFIX0 = (bbTxAccAddr & 0xFF000000) >> 24; + NRF_RADIO->BASE0 = (bbTxAccAddr & 0x00FFFFFF) << 8; + if (bbTxAccAddrInvalidChanMask & (UINT64_C(1) << bbChanIndex)) + { + if ((bbTxAccAddrInvalidAdjMask & (1 << bbTxAccAddrInvalidStep)) || bbTxAccAddrShiftMask) + { + if (bbTxAccAddrShiftMask) + { + uint32_t invalidAA = (1 << bbTxAccAddrInvalidStep) ^ bbTxAccAddr; + + NRF_RADIO->PREFIX0 = (invalidAA & 0xFF000000) >> 24; + NRF_RADIO->BASE0 = (invalidAA & 0x00FFFFFF) << 8; + } + else + { + /* invalidate */ + NRF_RADIO->PREFIX0 = ((bbTxAccAddr ^ 0xFFFFFFFF) & 0xFF000000) >> 24; + NRF_RADIO->BASE0 = ((bbTxAccAddr ^ 0xFFFFFFFF) & 0x00FFFFFF) << 8; + } + } + + if (!bbTxAccAddrShiftMask) + { + if (++bbTxAccAddrInvalidStep > 31) + { + bbTxAccAddrInvalidStep = 0; + } + } + else + { + if (bbTxAccAddrShiftInc) + { + ++bbTxAccAddrInvalidStep; + } + else + { + --bbTxAccAddrInvalidStep; + } + + if (bbTxAccAddrInvalidStep > 20 && bbTxAccAddrShiftInc) + { + bbTxAccAddrInvalidStep = 31; + bbTxAccAddrShiftInc = FALSE; + } + else if (bbTxAccAddrInvalidStep < 12 && !bbTxAccAddrShiftInc) + { + bbTxAccAddrInvalidStep = 1; + bbTxAccAddrShiftInc = TRUE; + } + } + } + + /* set Tx CRC init */ + NRF_RADIO->CRCINIT = bbTxCrcInit; + if (bbTxCrcInitInvalidChanMask & (UINT64_C(1) << bbChanIndex)) + { + if (bbTxCrcInitInvalidAdjMask & (1 << bbTxCrcInitInvalidStep)) + { + /* invalidate */ + NRF_RADIO->CRCINIT = bbTxCrcInit ^ 0xFFFFFF; + } + + if (++bbTxCrcInitInvalidStep > 31) + { + bbTxCrcInitInvalidStep = 0; + } + } + } +#endif + + /* configure radio hardware registers for transmit */ + palBbTxHwRadioConfig(pBuf); + + /* -----------------------------------------------------------------------------* + * TIFS "Ramping Up" + * -----------------------------------------------------------------------------*/ + if (tifsState == TIFS_TX_RAMPUP) + { + /* assert that the READY-to-START shortcut is not set */ + BB_ASSERT((NRF_RADIO->SHORTS & RADIO_SHORTS_READY_START_Msk) == 0); + + /* radio should be ramping up, set shortcuts (previously READY-to-START shortcut was not set) */ + NRF_RADIO->SHORTS = RADIO_SHORTS_READY_START_Msk | + RADIO_SHORTS_END_DISABLE_Msk; + + /* if the READY event has already happened... TIFS almost certainly did not go out */ + if (NRF_RADIO->EVENTS_READY) + { + /* but maybe, just maybe, TIFS did go out... */ + if (NRF_RADIO->STATE != RADIO_STATE_STATE_Tx) + { + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + diagTxTifsFailMissed++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + + /* no, TIFS was missed, indicate via callback */ + palBbRestoreTrl(); + bbTxCallback(BB_STATUS_FAILED); + return; /* exit from here... on purpose, alternative coding is ugly */ + } + + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + diagTxTifsBlueMoonWin++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + } + + /* update the driver state */ + driverState = TX_STATE; + } + + /* -----------------------------------------------------------------------------* + * TIFS "Not Possible" + * -----------------------------------------------------------------------------*/ + else + { + /* + * The TIFS operation is not possible. Some reasons this could happen: + * - the TIFS "window of opportunity" has expired, it ramped up and then shut down + * - the previous operation timed out, or was cancelled + * - this is the wrong type of TIFS for the window (e.g. TX when ramping up for RX) + * - attempting this TIFS as the first operation + * + * NOTE: The radio is not stopped. If an opposite type of TIFS is ramping up, + * the radio "TIFS Expired" interrupt will handle it. + */ + + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + diagTxTifsFailNotPossible++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + + /* indicate that this TIFS operation is not possible */ + palBbRestoreTrl(); + bbTxCallback(BB_STATUS_FAILED); + } +} + +/*===============================================================================================*/ +/*! + * \brief Configure radio for transmit. + * + * \param pTxBuf - pointer to buffer to transmit + * + * \return None. + * + * Configuration common to TIFS and non-TIFS transmit. + * + */ +/*===============================================================================================*/ +static void palBbTxHwRadioConfig(uint8_t * pTxBuf) +{ + if (!bbEncryptTxFlag) + { + /*------------------------------------------------------------------------------ + * No encryption. + * + * When encryption is not needed, the Nordic hardware can be configured to + * enable extended packets. This configuration bypasses Nordic's specific + * format. This also allows for zero copy as well. + * + */ +#if defined(NRF52840_XXAA) + if (bbTxPhy == BB_PHY_BLE_CODED) + { + /* Improve Coded sensitivity for nRF52840 chip. */ + *(volatile uint32_t *)0x4000173C |= 0x80000000; + *(volatile uint32_t *)0x4000173C = ((*(volatile uint32_t *)0x4000173C & 0xFFFFFF00) | 0x5C); + } + + uint32_t plen = ((bbTxPhy != BB_PHY_BLE_1M) ? ((bbTxPhy != BB_PHY_BLE_2M) ? RADIO_PCNF0_PLEN_LongRange : RADIO_PCNF0_PLEN_16bit) \ + : RADIO_PCNF0_PLEN_8bit) << RADIO_PCNF0_PLEN_Pos; +#elif defined(NRF52832_XXAA) + uint32_t plen = ((bbTxPhy == BB_PHY_BLE_2M) ? RADIO_PCNF0_PLEN_16bit : RADIO_PCNF0_PLEN_8bit) << RADIO_PCNF0_PLEN_Pos; +#else + uint32_t plen = 0; +#endif + + /* configure PCNF0 */ + NRF_RADIO->PCNF0 = (((uint32_t)( 1 /* S0 field in bytes */ )) << RADIO_PCNF0_S0LEN_Pos) | + (((uint32_t)( 8 /* length field in bits */ )) << RADIO_PCNF0_LFLEN_Pos) | + (((uint32_t)( 0 /* S1 field in bits */ )) << RADIO_PCNF0_S1LEN_Pos) | +#if defined(NRF52840_XXAA) + (((uint32_t)((bbTxPhy == BB_PHY_BLE_CODED) ? 3 : 0 /* TERM field in bits*/ )) << RADIO_PCNF0_TERMLEN_Pos) | + (((uint32_t)((bbTxPhy == BB_PHY_BLE_CODED) ? 2 : 0 /* CI field in bits */ )) << RADIO_PCNF0_CILEN_Pos) | + (((uint32_t)( 0 /* CRCINC field */ )) << RADIO_PCNF0_CRCINC_Pos) | + (((uint32_t)( 0 /* S1INCL filed */ )) << RADIO_PCNF0_S1INCL_Pos) | +#endif + ((uint32_t)( plen /* preamble field in bits */ )); + + /* configure PCNF1 */ + NRF_RADIO->PCNF1 = (((uint32_t)( 0 /* maximum packet length */ )) << RADIO_PCNF1_MAXLEN_Pos ) | + (((uint32_t)( 0 /* static packet length */ )) << RADIO_PCNF1_STATLEN_Pos ) | + (((uint32_t)( NORDIC_BASE_ADDR_LEN )) << RADIO_PCNF1_BALEN_Pos ) | + (((uint32_t)( RADIO_PCNF1_ENDIAN_Little )) << RADIO_PCNF1_ENDIAN_Pos ) | + (((uint32_t)( bbRadioPcnf1WhiteEn )) << RADIO_PCNF1_WHITEEN_Pos ); + + /* set packet pointer to supplied buffer */ + NRF_RADIO->PACKETPTR = (uint32_t)pTxBuf; + + /* set the mode */ + palBbSetRadioMode(bbTxPhy, bbTxPhyOptions); + } + else + { + /*------------------------------------------------------------------------------ + * Encryption. + * + * Nordic's encryption engine requires a precise format to function. The header + * is held in three bytes, instead of two. Each byte represents a field in the + * actual Bluetooth header. The Nordic hardware converts these three bytes into + * the two byte BLE header before transmitting. + * + * To accommodate this hardware quirk, the buffer must be copied to adjust for + * the Nordic "extra byte." Zero copy is not possible. Also, extended packets + * are not possible. + * + * NOTE: Most of the CCM hardware is configured just once, in a different + * function, when encryption is first enabled. + */ + + BB_ASSERT( keySetFlag ); /* encryption key has not been set */ + BB_ASSERT( ivSetFlag ); /* iv was not set */ + BB_ASSERT( packetCountSetFlag ); /* packet count was not set */ + + /* configure PCNF0 */ + NRF_RADIO->PCNF0 = (((uint32_t)( 1 /* S0 field in bytes */ )) << RADIO_PCNF0_S0LEN_Pos) | + (((uint32_t)( 5 /* length field in bits */ )) << RADIO_PCNF0_LFLEN_Pos) | +#if defined(NRF52840_XXAA) + (((uint32_t)((bbTxPhy == BB_PHY_BLE_CODED) ? 3 : 0 /* TERM field in bits*/ )) << RADIO_PCNF0_TERMLEN_Pos) | + (((uint32_t)((bbTxPhy == BB_PHY_BLE_CODED) ? 2 : 0 /* CI field in bits */ )) << RADIO_PCNF0_CILEN_Pos) | + (((uint32_t)( 0 /* CRCINC field */ )) << RADIO_PCNF0_CRCINC_Pos) | + (((uint32_t)( 0 /* S1INCL filed */ )) << RADIO_PCNF0_S1INCL_Pos) | +#endif + (((uint32_t)( 3 /* S1 field in bits */ )) << RADIO_PCNF0_S1LEN_Pos); + + /* configure PCNF1 */ + NRF_RADIO->PCNF1 = (((uint32_t)( 0 /* maximum packet length */ )) << RADIO_PCNF1_MAXLEN_Pos ) | + (((uint32_t)( 0 /* static packet length */ )) << RADIO_PCNF1_STATLEN_Pos ) | + (((uint32_t)( NORDIC_BASE_ADDR_LEN )) << RADIO_PCNF1_BALEN_Pos ) | + (((uint32_t)( RADIO_PCNF1_ENDIAN_Little )) << RADIO_PCNF1_ENDIAN_Pos ) | + (((uint32_t)( bbRadioPcnf1WhiteEn )) << RADIO_PCNF1_WHITEEN_Pos ); + + /* set packet pointer to the soon-to-be encrypted buffer */ + NRF_RADIO->PACKETPTR = (uint32_t)&bbEncryptOutBuf[0]; + + /* get length from packet to transmit */ + bbTxLen = pTxBuf[1]; + BB_ASSERT(bbTxLen <= ENC_MAX_PAYLOAD_LEN); /* payload exceeds Nordic's maximum possible for encryption */ + + /* construct header in Nordic format */ + bbEncryptTxBuf[0] = pTxBuf[0]; /* field "H" */ + bbEncryptTxBuf[1] = bbTxLen; /* field "L" */ + bbEncryptTxBuf[2] = 0; /* field "RFU" */ + + /* copy the payload into Nordic format transmit buffer */ + memcpy(&bbEncryptTxBuf[3], &pTxBuf[2], bbTxLen); + BB_ASSERT(bbEncryptTxBuf[sizeof(bbEncryptTxBuf)-1] == 0xAA); /* buffer overrun from memcpy */ + BB_ASSERT(bbEncryptTxBuf[sizeof(bbEncryptTxBuf)-2] == 0xAA); /* buffer overrun from memcpy */ + + /* ---------- handle MIC suppression ---------- */ + if (bbEncryptTxSuppressMic) + { + /* set the length field in output buffer to 0xFF, used to detect when it has been populated via DMA */ + bbEncryptOutBuf[1] = 0xFF; + + /* clear the ENDKSGEN event, aka "key-stream generation complete" event */ + NRF_CCM->EVENTS_ENDKSGEN = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_CCM->EVENTS_ENDKSGEN); + + /* enable the ENDKSGEN interrupt, this interrupt will revert length to original "MIC-less" length */ + NRF_CCM->INTENSET = CCM_INTENSET_ENDKSGEN_Msk; + } + /* -------------------------------------------- */ + + /* set shortcut to start encryption immediately after key generation */ + NRF_CCM->SHORTS = CCM_SHORTS_ENDKSGEN_CRYPT_Msk; // TODO - probably just need to set once at initialization ***** + + /* start encryption */ + NRF_CCM->TASKS_KSGEN = 1; + } +} + +/*************************************************************************************************/ +/*! + * \brief CCM interrupt handler "Key-stream Generation Complete" + * + * \param None. + * + * \return None. + * + * This interrupt undoes Nordic's automatic +4 to the length field. This allows transmitting + * without the MIC. + * + */ +/*************************************************************************************************/ +void CCM_AAR_IRQHandler(void) +{ + BB_ASSERT(NRF_CCM->INTENSET == CCM_INTENSET_ENDKSGEN_Msk); /* only keygen complete should be enabled */ + + /* -----------------------------------------------------------------------------* + * ENDKSGEN - Key Generation Complete + * -----------------------------------------------------------------------------*/ + BB_ASSERT(NRF_CCM->EVENTS_ENDKSGEN); /* this event should have been set */ + + /* disable this interrupt */ + NRF_CCM->INTENCLR = CCM_INTENCLR_ENDKSGEN_Msk; + + /* + * The key-stream generation has just completed. A shortcut should immediately + * start encryption which populates the output buffer. The second byte of the + * output buffer will be the length. Nordic automatically adds four to account for + * the addition of the MIC. To avoid transmitting the MIC in the "MIC-less" mode, + * this interrupt readjusts the length before it gets transmitted. + */ + + /* wait for the length field to be populated by the Nordic hardware */ + while(bbEncryptOutBuf[1] == 0xFF) + { + /////////////////////////////////////////////////////////////////////////////// + #ifdef BB_ASSERT_ENABLED + uint8_t busycount = 0; + BB_ASSERT(busycount < 10); /* got stuck */ + busycount++; + #endif + /////////////////////////////////////////////////////////////////////////////// + } + + /* overwrite with the length field with the original length, that does not include the MIC */ + BB_ASSERT(bbTxLen == (bbEncryptOutBuf[1] - 4)); /* the populated length should be exactly +4 */ + bbEncryptOutBuf[1] = bbTxLen; +} + +/*************************************************************************************************/ +/*! + * \brief Receive packet at the given due time. + * + * \param pBuf Transmit data buffer. + * \param len Length of data buffer. + * + * \return None. + * + * The receiver is kept on for the amount of time previously configured by function call. + */ +/*************************************************************************************************/ +void PalBbBleRxData(uint8_t *pBuf, uint16_t len) +{ + BB_ASSERT(driverState == IDLE_STATE); /* driver must be idle */ + BB_ASSERT(bbRxCallback != NULL); /* callback must be configured */ + BB_ASSERT(len >= PDU_HEADER_LEN); /* buffer must include room for a two byte header */ + BB_ASSERT(len <= (PDU_HEADER_LEN + MAX_PAYLOAD_LEN)); /* buffer should not exceed header + max payload size */ + BB_ALIGN_ASSERT(pBuf); + + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + BB_ASSERT(diagOp == DIAG_NULL); + diagOp = DIAG_RX; + diagRxTotalCalls++; + diagRxCalls++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + +#if (LL_ENABLE_TESTER == TRUE) + /* set Rx access addresses */ + NRF_RADIO->PREFIX0 = (bbRxAccAddr & 0xFF000000) >> 24; + NRF_RADIO->BASE0 = (bbRxAccAddr & 0x00FFFFFF) << 8; + if (bbRxAccAddrInvalidChanMask & (UINT64_C(1) << bbChanIndex)) + { + if (bbRxAccAddrInvalidAdjMask & (1 << bbRxAccAddrInvalidStep)) + { + /* invalidate */ + NRF_RADIO->PREFIX0 = ((bbRxAccAddr ^ 0xFFFFFFFF) & 0xFF000000) >> 24; + NRF_RADIO->BASE0 = ((bbRxAccAddr ^ 0xFFFFFFFF) & 0x00FFFFFF) << 8; + } + + if (++bbRxAccAddrInvalidStep > 31) + { + bbRxAccAddrInvalidStep = 0; + } + } + + /* set Rx CRC init */ + NRF_RADIO->CRCINIT = bbRxCrcInit; + if (bbRxCrcInitInvalidChanMask & (UINT64_C(1) << bbChanIndex)) + { + if (bbRxCrcInitInvalidAdjMask & (1 << bbRxCrcInitInvalidStep)) + { + /* invalidate */ + bbRxCrcInitInvalidStep--; + NRF_RADIO->CRCINIT = bbRxCrcInit ^ 0xFFFFFF; + } + + if (++bbRxCrcInitInvalidStep > 31) + { + bbRxCrcInitInvalidStep = 0; + } + } +#endif + + /* + * In case there is a TIFS operation ramping up, kill it. + * This non-TIFS operation is coming through. + */ + palBbRadioHardStop(); + + /* calculate start time */ + uint32_t rxStart = bbAntennaDueTime - USEC_TO_TICKS(NRF5x_tRXEN_BLE_USECS + NRF5x_PROP_DELAY_RX_USECS); + + /* set timer compare CC[0] for time to trigger a transmit */ +#if (USE_RTC_BB_CLK) + if (bbDueOffsetUsec == 0) + { + bbDueOffsetUsec = 1; /* CC[0] can't trigger on 0 */ + } + + NRF_TIMER0->CC[0] = bbDueOffsetUsec; + NRF_TIMER0->EVENTS_COMPARE[0] = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_TIMER0->EVENTS_COMPARE[0]); + palBbSetHfClkStart(rxStart - 1); /* Subtract 1 for receive uncertainty due to rounding. */ +#else + BB_ASSERT(bbDueOffsetUsec == 0); /* Always 0 with HFCLK. */ + NRF_TIMER0->CC[0] = rxStart; + NRF_TIMER0->EVENTS_COMPARE[0] = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_TIMER0->EVENTS_COMPARE[0]); +#endif + +#if (USE_RTC_BB_CLK) + /* Since receive timestamp rounds down to RTC clock, extend timeout up to 31us + * to makeup for rounding error. */ + bbRxTimeoutUsec += 31; +#endif + + uint32_t preambleTime; + uint32_t accessAddrTime; + int32_t correction; + + switch (bbRxPhy) + { + case BB_PHY_BLE_1M: + preambleTime = LL_BLE_US_PER_BYTE_1M * LL_PREAMBLE_LEN_1M; + accessAddrTime = LL_BLE_US_PER_BYTE_1M * LL_AA_LEN; + correction = 0; + break; + case BB_PHY_BLE_2M: + preambleTime = LL_BLE_US_PER_BYTE_2M * LL_PREAMBLE_LEN_2M; + accessAddrTime = LL_BLE_US_PER_BYTE_2M * LL_AA_LEN; + correction = 0; + break; +#if defined(NRF52840_XXAA) + case BB_PHY_BLE_CODED: + preambleTime = LL_BLE_US_PER_BIT_CODED_S8 * LL_PREAMBLE_LEN_CODED_BITS; + accessAddrTime = LL_BLE_US_PER_BYTE_CODED_S8 * LL_AA_LEN; + correction = 100; + break; +#endif + default: + preambleTime = LL_BLE_US_PER_BYTE_1M * LL_PREAMBLE_LEN_1M; + accessAddrTime = LL_BLE_US_PER_BYTE_1M * LL_AA_LEN; + correction = 0; + } + /* set timer compare CC[1] for RX timeout (allow time to recognize address, and account for propagation delay) */ + NRF_TIMER0->CC[1] = NRF_TIMER0->CC[0] + + TICKS_PER_USEC * (bbRxTimeoutUsec + + preambleTime + + accessAddrTime + + NRF5x_PROP_DELAY_RX_USECS + + NRF5x_tRXEN_BLE_USECS + + correction); + + /* clear RX timeout compare event, but do not enable interrupt, that happens in radio isr */ + NRF_TIMER0->EVENTS_COMPARE[1] = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_TIMER0->EVENTS_COMPARE[1]); + + /* configure radio hardware registers for receive */ + palBbRxHwRadioConfig(pBuf, len); + + /* configure shortcuts */ + NRF_RADIO->SHORTS = RADIO_SHORTS_READY_START_Msk | + RADIO_SHORTS_END_DISABLE_Msk | + RADIO_SHORTS_ADDRESS_RSSISTART_Msk | + RADIO_SHORTS_DISABLED_RSSISTOP_Msk; + + /* see if the requested due is in the past (or a very long way, away) */ + if ((rxStart - PalBbGetCurrentTime(USE_RTC_BB_CLK)) & 0x80000000) + { + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + diagRxFailBadDueTime++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + + /* run the callback function */ + bbRxCallback(BB_STATUS_FAILED, 0 ,0, 0, 0); + return; + } + + /* configure and enable PPI Chan 14, COMPARE[0] -> RXEN */ + NRF_PPI->CH[14].TEP = (uint32_t) &NRF_RADIO->TASKS_RXEN; /* configure task */ + NRF_PPI->CHENSET = PPI_CHENSET_CH14_Msk; /* enable channel */ + + /* see if the compare point was already reached */ + if (NRF_TIMER0->EVENTS_COMPARE[0]) + { + /* it's 99.99999% certain did not make it, but... maybe, just maybe... */ + if (NRF_RADIO->STATE == RADIO_STATE_STATE_Disabled) + { + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + diagRxFailMissedDueTime++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + + /* run the callback function */ + bbRxCallback(BB_STATUS_FAILED, 0, 0, 0, 0); + return; + } + + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + diagRxBlueMoonWin++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + } + + /* update the driver state */ + driverState = RX_STATE; +} + +/*************************************************************************************************/ +/*! + * \brief Receive packet on TIFS timing. + * + * \param pBuf Receive data buffer. + * \param len Length of data buffer. + * + * \return None. + * + * The receiver is left on for the minimum amount of time to recognize a receive. + * + * If possible, the receive will occur on the TIFS timing. If not possible, the callback status + * will indicate this. + */ +/*************************************************************************************************/ +void PalBbBleRxTifsData(uint8_t *pBuf, uint16_t len) +{ + BB_ASSERT(driverState == IDLE_STATE); /* driver must be idle */ + BB_ASSERT(bbRxCallback != NULL); /* callback must be configured */ + BB_ASSERT(len >= PDU_HEADER_LEN); /* buffer must include room for a two byte header */ + BB_ASSERT(len <= (PDU_HEADER_LEN + MAX_PAYLOAD_LEN)); /* buffer should not exceed header + max payload size */ + BB_ALIGN_ASSERT(pBuf); + + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + BB_ASSERT(diagOp == DIAG_NULL); + diagOp = DIAG_RX_TIFS; + diagRxTotalCalls++; + diagRxTifsCalls++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + +#if (LL_ENABLE_TESTER == TRUE) + /* set Rx access addresses */ + NRF_RADIO->PREFIX0 = (bbRxAccAddr & 0xFF000000) >> 24; + NRF_RADIO->BASE0 = (bbRxAccAddr & 0x00FFFFFF) << 8; + if (bbRxAccAddrInvalidChanMask & (UINT64_C(1) << bbChanIndex)) + { + if (bbRxAccAddrInvalidAdjMask & (1 << bbRxAccAddrInvalidStep)) + { + /* invalidate */ + NRF_RADIO->PREFIX0 = ((bbRxAccAddr ^ 0xFFFFFFFF) & 0xFF000000) >> 24; + NRF_RADIO->BASE0 = ((bbRxAccAddr ^ 0xFFFFFFFF) & 0x00FFFFFF) << 8; + } + + if (++bbRxAccAddrInvalidStep > 31) + { + bbRxAccAddrInvalidStep = 0; + } + } + + /* set Rx CRC init */ + NRF_RADIO->CRCINIT = bbRxCrcInit; + if (bbRxCrcInitInvalidChanMask & (UINT64_C(1) << bbChanIndex)) + { + if (bbRxCrcInitInvalidAdjMask & (1 << bbRxCrcInitInvalidStep)) + { + /* invalidate */ + bbRxCrcInitInvalidStep--; + NRF_RADIO->CRCINIT = bbRxCrcInit ^ 0xFFFFFF; + } + + if (++bbRxCrcInitInvalidStep > 31) + { + bbRxCrcInitInvalidStep = 0; + } + } +#endif + + /* + * NOTE: To make the TIFS timing requirements, timer CC[0] and PPI Chan 14 were previously + * configured at the end of the last transmit. The RXEN task will trigger on the next + * timer COMPARE0 event. + */ + + /* configure radio hardware registers for receive */ + palBbRxHwRadioConfig(pBuf, len); + + /* -----------------------------------------------------------------------------* + * TIFS "Ramping Up" + * -----------------------------------------------------------------------------*/ + if (tifsState == TIFS_RX_RAMPUP) + { + /* assert that the READY-to-START shortcut is not set */ + BB_ASSERT((NRF_RADIO->SHORTS & RADIO_SHORTS_READY_START_Msk) == 0); + + /* radio should be ramping up, set shortcuts (previously READY-to-START shortcut was not set) */ + NRF_RADIO->SHORTS = RADIO_SHORTS_READY_START_Msk | + RADIO_SHORTS_END_DISABLE_Msk | + RADIO_SHORTS_ADDRESS_RSSISTART_Msk | + RADIO_SHORTS_DISABLED_RSSISTOP_Msk; + + /* if the READY event has already happened... TIFS almost certainly did not go out */ + if (NRF_RADIO->EVENTS_READY) + { + /* but maybe, just maybe, TIFS did go out... */ + if (NRF_RADIO->STATE != RADIO_STATE_STATE_Rx) + { + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + diagRxTifsFailMissed++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + + /* no, TIFS was missed, indicate via callback */ + bbRxCallback(BB_STATUS_FAILED, 0, 0, 0, 0); + return; /* exit from here... on purpose, alternative coding is ugly */ + } + + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + diagRxTifsBlueMoonWin++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + } + + /* update the driver state */ + driverState = RX_STATE; + } + + /* -----------------------------------------------------------------------------* + * TIFS "Not Possible" + * -----------------------------------------------------------------------------*/ + else + { + ///////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + diagRxTifsFailNotPossible++; + #endif + ///////////////////////////////////////////////////////////////////////////////// + + /* indicate that this TIFS operation is not possible */ + bbRxCallback(BB_STATUS_FAILED, 0, 0, 0, 0); + } +} + +/*===============================================================================================*/ +/* + * \brief Configure radio for receive. + * + * \param pRxBuf - pointer where receive bytes get written + * \param len - maximum length for receive, i.e. size of the allocated receive buffer + * + * \return None. + * + * Configuration common to TIFS and non-TIFS transmit. + * + */ +/*===============================================================================================*/ +static void palBbRxHwRadioConfig(uint8_t * pRxBuf, uint16_t len) +{ + BB_ASSERT(len >= PDU_HEADER_LEN); /* buffer must at least accommodate the header */ + +#if defined(NRF52840_XXAA) + if (bbTxPhy == BB_PHY_BLE_CODED) + { + /* Improve Coded sensitivity for nRF52840 chip. */ + *(volatile uint32_t *)0x4000173C |= 0x80000000; + *(volatile uint32_t *)0x4000173C = ((*(volatile uint32_t *)0x4000173C & 0xFFFFFF00) | 0x5C); + } + + uint32_t plen = ((bbRxPhy != BB_PHY_BLE_1M) ? ((bbRxPhy != BB_PHY_BLE_2M) ? RADIO_PCNF0_PLEN_LongRange : RADIO_PCNF0_PLEN_16bit) \ + : RADIO_PCNF0_PLEN_8bit) << RADIO_PCNF0_PLEN_Pos; +#elif defined(NRF52832_XXAA) + uint32_t plen = ((bbRxPhy == BB_PHY_BLE_2M) ? RADIO_PCNF0_PLEN_16bit : RADIO_PCNF0_PLEN_8bit) << RADIO_PCNF0_PLEN_Pos; +#else + uint32_t plen = 0; +#endif + /* configure PCNF0 */ + NRF_RADIO->PCNF0 = (((uint32_t)( 1 /* S0 field in bytes */ )) << RADIO_PCNF0_S0LEN_Pos) | + (((uint32_t)( 8 /* length field in bits */ )) << RADIO_PCNF0_LFLEN_Pos) | + (((uint32_t)( 0 /* S1 field in bits */ )) << RADIO_PCNF0_S1LEN_Pos) | +#if defined(NRF52840_XXAA) + (((uint32_t)((bbRxPhy == BB_PHY_BLE_CODED) ? 3 : 0 /* TERM field in bits*/ )) << RADIO_PCNF0_TERMLEN_Pos) | + (((uint32_t)((bbRxPhy == BB_PHY_BLE_CODED) ? 2 : 0 /* CI field in bits */ )) << RADIO_PCNF0_CILEN_Pos) | + (((uint32_t)( 0 /* CRCINC field */ )) << RADIO_PCNF0_CRCINC_Pos) | + (((uint32_t)( 0 /* S1INCL filed */ )) << RADIO_PCNF0_S1INCL_Pos) | +#endif + ((uint32_t)( plen /* preamble field in bits */ )); + + /* configure PCNF1 */ + NRF_RADIO->PCNF1 = (((uint32_t)( len - PDU_HEADER_LEN /* max len */ )) << RADIO_PCNF1_MAXLEN_Pos ) | + (((uint32_t)( 0 /* static len */ )) << RADIO_PCNF1_STATLEN_Pos ) | + (((uint32_t)( NORDIC_BASE_ADDR_LEN )) << RADIO_PCNF1_BALEN_Pos ) | + (((uint32_t)( RADIO_PCNF1_ENDIAN_Little )) << RADIO_PCNF1_ENDIAN_Pos ) | + (((uint32_t)( bbRadioPcnf1WhiteEn )) << RADIO_PCNF1_WHITEEN_Pos ); + + /* set up memory location where received packet gets stored */ + NRF_RADIO->PACKETPTR = (uint32_t)pRxBuf; + + /* set the mode */ + palBbSetRadioMode(bbRxPhy, bbTxPhyOptions); + + /* remember where the receive buffer is located, used later when processing the completed receive */ + bbpRxBuf = pRxBuf; +} + +/*************************************************************************************************/ +/*! + * \brief TIMER0 interrupt handler "RX Timeout" + * + * \param None. + * + * \return None. + * + * This is the "RX Timeout" interrupt. No other functionality is shared on the TIMER0 interrupt. + * If the receive operation has not gotten started, it is cancelled. + * + */ +/*************************************************************************************************/ +void BbBleDrvTimerIRQHandler(void) +{ + DIAG_PIN_SET( TIMER0_INT_PIN ); + + BB_ASSERT(NRF_TIMER0->INTENSET == TIMER_INTENSET_COMPARE1_Msk); /* only RX timeout should be enabled */ + + /* -----------------------------------------------------------------------------* + * COMPARE1 - "RX Timeout" + * -----------------------------------------------------------------------------*/ + BB_ASSERT(NRF_TIMER0->EVENTS_COMPARE[1]); + BB_ASSERT(driverState == RX_STATE); /* an RX timeout should only occur for an RX */ + BB_ASSERT(NRF_RADIO->STATE == RADIO_STATE_STATE_Rx); /* should only be timeout if receiver is actually on */ + + /* disable this interrupt */ + NRF_TIMER0->INTENCLR = TIMER_INTENCLR_COMPARE1_Msk; + + /* Once the ADDRESS event has happened, the receive will not be timed out. This event happens + * just after the incoming preamble/address has been recognized. + */ + if (NRF_RADIO->EVENTS_ADDRESS == 0) + { + /* stop the radio */ + palBbRadioHardStop(); + + /* send notification of timeout */ + bbRxCallback(BB_STATUS_RX_TIMEOUT, 0, 0, 0, 0); + } + + DIAG_PIN_CLEAR( TIMER0_INT_PIN ); +} + +/*************************************************************************************************/ +/*! + * \brief Radio interrupt handler. + * + * \param None. + * + * \return None. + * + * This the radio interrupt service routine. It is at the heart of the baseband driver + * design. It handles the following interrupts: + * + * 1) READY or "TIFS Expired" Interrupt - This interrupt fires as soon as the radio + * ramps up and is 'ready'. It is used as timeout for any TIFS operation that may + * be coming up. Also, it enables the RX Timeout interrupt if a receive operation. + * + * 2) PAYLOAD or "Timestamp/TIFS Setup" Interrupt - This interrupt fires once the payload + * has completed, for either transmit or receive. During this interrupt, the timestamp + * is collected and computed. The next potential TIFS operation is also set up. + * + * 3) DISABLED or "TX-RX Complete" Interrupt - This interrupt occurs at the completion of + * a receive or transmit. It runs the appropriate callback with the appropriate status. + * (NOTE: This interrupt is intentionally *not* the END interrupt, for bulletproof timing.) + * + */ +/*************************************************************************************************/ +void BbBleDrvRadioIRQHandler(void) +{ + DIAG_PIN_SET( RADIO_INT_PIN ); + + /* -----------------------------------------------------------------------------* + * READY - "TIFS Expired" + * -----------------------------------------------------------------------------*/ + if ((NRF_RADIO->INTENSET & RADIO_INTENSET_READY_Msk) && NRF_RADIO->EVENTS_READY) + { + /* clear the event, leave the interrupt active */ + NRF_RADIO->EVENTS_READY = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_RADIO->EVENTS_READY); + + /* disable the PPI channel of TX/RX operations */ + NRF_PPI->CHENCLR = PPI_CHENCLR_CH14_Msk; /* COMPARE[0] -> TXEN/RXEN */ + + /* see if a TIFS operation is ramping up, and if so, see if it failed */ + if ( ((tifsState == TIFS_TX_RAMPUP) && (NRF_RADIO->STATE == RADIO_STATE_STATE_TxIdle)) || + ((tifsState == TIFS_RX_RAMPUP) && (NRF_RADIO->STATE == RADIO_STATE_STATE_RxIdle))) + { + palBbRadioHardStop(); /* note: tifs state is reset in this function */ + return; + } + + if ((driverState == TX_STATE) || (tifsState == TIFS_TX_RAMPUP)) + { + DIAG_PIN_SET( TX_PIN ); + BB_ASSERT(NRF_RADIO->STATE == RADIO_STATE_STATE_Tx); + } + + /* if this is a receive, activate the pre-configured RX timeout */ + if ((driverState == RX_STATE) || (tifsState == TIFS_RX_RAMPUP)) + { + BB_ASSERT(NRF_RADIO->STATE == RADIO_STATE_STATE_Rx); + DIAG_PIN_SET( RX_PIN ); + + /* clear the ADDRESS event, it will indicate if an RX timeout is possible */ + NRF_RADIO->EVENTS_ADDRESS = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_RADIO->EVENTS_ADDRESS); + + /* enable the RX interrupt */ + NRF_TIMER0->INTENSET = TIMER_INTENSET_COMPARE1_Msk; + + /* if the compare event is set, the RX timeout already occurred */ + if (NRF_TIMER0->EVENTS_COMPARE[1]) + { + /* force a compare event, which will trigger the interrupt (it was disabled when the actual event happened) */ + NRF_TIMER0->EVENTS_COMPARE[1] = 1; + } + } + + /* update tifs state */ + tifsState = TIFS_NULL; + } + + /* -----------------------------------------------------------------------------* + * PAYLOAD - "Timestamp/TIFS Setup" + * -----------------------------------------------------------------------------*/ + else if ((NRF_RADIO->INTENSET & RADIO_INTENSET_PAYLOAD_Msk) && NRF_RADIO->EVENTS_PAYLOAD) + { + /* clear the event, leave the interrupt active */ + NRF_RADIO->EVENTS_PAYLOAD = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_RADIO->EVENTS_PAYLOAD); + + /* disable the "RX Timeout" interrupt (timer COMPARE1 event) */ + NRF_TIMER0->INTENCLR = TIMER_INTENCLR_COMPARE1_Msk; + NVIC_ClearPendingIRQ(TIMER0_IRQn); /* necessary, if interrupt already "fired" this is the only way to clear it */ + + /* + * Setup for potential TIFS operation. + * + * Every transmit and every receive has a potential follow-up TIFS operation. + * To accommodate this, the radio must start ramping up before it knows + * if the operation is going to happen or not. + * + */ + BB_ASSERT((NRF_PPI->CHENSET & PPI_CHENSET_CH14_Msk) == 0); /* channel should be disabled by now */ + + /* clear radio shortcuts except for END->DISABLE (must not have ENABLE->START shortcut active) */ + NRF_RADIO->SHORTS = RADIO_SHORTS_END_DISABLE_Msk; + + /* - - - - - - - - - - - - - - - - - - - - - - - - - * + * TX, set up for TIFS-RX + * - - - - - - - - - - - - - - - - - - - - - - - - - */ + if (driverState == TX_STATE) + { + uint32_t antennaTimeTxPktEnd; + uint32_t crcTime; + uint32_t term2Time; + uint32_t preambleTime; + uint32_t accessAddrTime; + int32_t correction; + + /* calculate time to transmit CRC and TERM2 (Long Range Only) */ + switch (bbTxPhy) + { + case BB_PHY_BLE_1M: + crcTime = LL_BLE_US_PER_BYTE_1M * LL_CRC_LEN; + term2Time = 0; + break; + case BB_PHY_BLE_2M: + crcTime = LL_BLE_US_PER_BYTE_2M * LL_CRC_LEN; + term2Time = 0; + break; +#if defined(NRF52840_XXAA) + case BB_PHY_BLE_CODED: + crcTime = ((bbTxPhyOptions == BB_PHY_OPTIONS_BLE_S2) ? LL_BLE_US_PER_BYTE_CODED_S2 : LL_BLE_US_PER_BYTE_CODED_S8) * LL_CRC_LEN; + term2Time = ((bbTxPhyOptions == BB_PHY_OPTIONS_BLE_S2) ? LL_BLE_US_PER_BIT_CODED_S2 : LL_BLE_US_PER_BIT_CODED_S8) * LL_TERM2_LEN_BITS; + break; +#endif + default: + crcTime = LL_BLE_US_PER_BYTE_1M * LL_CRC_LEN; + term2Time = 0; + } + + /* calculate time to receive preamble and access address */ + switch(bbRxPhy) + { + case BB_PHY_BLE_1M: + preambleTime = LL_BLE_US_PER_BYTE_1M * LL_PREAMBLE_LEN_1M; + accessAddrTime = LL_BLE_US_PER_BYTE_1M * LL_AA_LEN; + correction = 4; + break; + case BB_PHY_BLE_2M: + preambleTime = LL_BLE_US_PER_BYTE_2M * LL_PREAMBLE_LEN_2M; + accessAddrTime = LL_BLE_US_PER_BYTE_2M * LL_AA_LEN; + correction = 20; + break; +#if defined(NRF52840_XXAA) + case BB_PHY_BLE_CODED: + preambleTime = LL_BLE_US_PER_BIT_CODED_S8 * LL_PREAMBLE_LEN_CODED_BITS; + accessAddrTime = LL_BLE_US_PER_BYTE_CODED_S8 * LL_AA_LEN; + correction = 110; + break; +#endif + default: + preambleTime = LL_BLE_US_PER_BYTE_1M * LL_PREAMBLE_LEN_1M; + accessAddrTime = LL_BLE_US_PER_BYTE_1M * LL_AA_LEN; + correction = 4; + } + + /* + * Calculate "antenna time" when the packet ended. + * + * The timer was captured into CC[2] triggered by the PAYLOAD event. + * The time for the CRC is added to get to the end of the packet. + * The transmit propagation delay from event to antenna is added to get the actual "antenna time" when the + * last transmitted bit finishes at the antenna. + */ + antennaTimeTxPktEnd = NRF_TIMER0->CC[2] /* start with timer value when payload just finished */ + + TICKS_PER_USEC * crcTime /* add CRC time to arrive at end of packet */ + + TICKS_PER_USEC * term2Time /* add TERM2 time to arrive at end of packet */ + + TICKS_PER_USEC * NRF5x_PROP_DELAY_TX_USECS; /* add propagation delay to get "antenna time" */ + + /* set timer trigger for upcoming TIFS receive operation */ + NRF_TIMER0->CC[0] = antennaTimeTxPktEnd /* start with "antenna time" at end of packet just transmitted */ + + TICKS_PER_USEC * LL_BLE_TIFS_US /* add the TIFS period */ + - TICKS_PER_USEC * NRF5x_tRXEN_BLE_USECS /* subtract time it takes to ramp-up for receive */ + - TICKS_PER_USEC * MAX_TIFS_DEVIATION_USECS; /* subtract allowed deviation */ + + + + /* configure and enable PPI trigger for RXEN, happens on next timer COMPARE[0] just configured above */ + NRF_PPI->CH[14].TEP = (uint32_t) &NRF_RADIO->TASKS_RXEN; /* configure task */ + NRF_PPI->CHENSET = PPI_CHENSET_CH14_Msk; /* enable channel */ + + /* calculate and set RX timeout */ + NRF_TIMER0->CC[1] = antennaTimeTxPktEnd /* start with "antenna time" at end of packet just transmitted */ + + TICKS_PER_USEC * LL_BLE_TIFS_US /* add the TIFS period */ + + TICKS_PER_USEC * preambleTime /* allow time preamble to be received */ + + TICKS_PER_USEC * accessAddrTime /* allow time access address to be received */ + + TICKS_PER_USEC * (2 * MAX_TIFS_DEVIATION_USECS) /* add allowed tolerance +2/-2 usecs */ + + TICKS_PER_USEC * correction; /* empirically derived trim factor (NOTE!! units are ticks, scaler change affects this) */ + /* + * NOTE: In the case of an RX timeout, the above compare will trigger an interrupt. + * This interrupt requires time to execute. This delay extends the time the radio + * is active. The effective timeout period is longer than computed above. + * + * This effective timeout period can be reduced using the trim value. + * This would be useful for power savings. But be warned!! Great care + * is required as this involves timing the speed of code execution. + * Any adjustment must be made with debug code disabled. + */ + + /* clear RX timeout compare event, but do not enable interrupt, that happens in radio isr */ + NRF_TIMER0->EVENTS_COMPARE[1] = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_TIMER0->EVENTS_COMPARE[1]); + + /* a TX is completing, the radio will soon be ramping up for possible TIFS RX */ + tifsState = TIFS_RX_RAMPUP; + } + + /* - - - - - - - - - - - - - - - - - - - - - - - - - * + * RX, set up for TIFS-TX + * - - - - - - - - - - - - - - - - - - - - - - - - - */ + else + { + uint32_t antennaTimeRxPktEnd; + uint32_t crcTime; + int32_t rxCorrection; + int32_t txCorrection; + uint32_t term2Time; + + BB_ASSERT(driverState == RX_STATE); /* illegal driver state */ +#if defined(NRF52840_XXAA) + if (NRF_RADIO->EVENTS_RATEBOOST == 1) + { + /* If rate boost events is detected, then will use Coded S2, otherwise will use Coded S8 by default */ + bbRxPhyOptions = BB_PHY_OPTIONS_BLE_S2; + NRF_RADIO->EVENTS_RATEBOOST = 0; + } + else + { + bbRxPhyOptions = BB_PHY_OPTIONS_BLE_S8; + } +#endif + /* calculate time to transmit CRC and TERM2(Long Range Only) */ + switch (bbRxPhy) + { + case BB_PHY_BLE_1M: + crcTime = LL_BLE_US_PER_BYTE_1M * LL_CRC_LEN; + term2Time = 0; + rxCorrection = -2; + break; + case BB_PHY_BLE_2M: + crcTime = LL_BLE_US_PER_BYTE_2M * LL_CRC_LEN; + term2Time = 0; + rxCorrection = 2; + break; +#if defined(NRF52840_XXAA) + case BB_PHY_BLE_CODED: + crcTime = ((bbRxPhyOptions == BB_PHY_OPTIONS_BLE_S2) ? LL_BLE_US_PER_BYTE_CODED_S2 : LL_BLE_US_PER_BYTE_CODED_S8) * LL_CRC_LEN; + term2Time = ((bbRxPhyOptions == BB_PHY_OPTIONS_BLE_S2) ? LL_BLE_US_PER_BIT_CODED_S2 : LL_BLE_US_PER_BIT_CODED_S8) * LL_TERM2_LEN_BITS; + rxCorrection = (bbRxPhyOptions == BB_PHY_OPTIONS_BLE_S2) ? -49 : -180; + break; +#endif + default: + crcTime = LL_BLE_US_PER_BYTE_1M * LL_CRC_LEN; + term2Time = 0; + rxCorrection = -2; + } + + switch (bbTxPhy) + { + case BB_PHY_BLE_1M: + txCorrection = 0; + break; + case BB_PHY_BLE_2M: + txCorrection = +1; + break; +#if defined(NRF52840_XXAA) + case BB_PHY_BLE_CODED: + txCorrection = -1; + break; +#endif + default: + txCorrection = 0; + } + + /* calculate "antenna time" when the packet ended (see comments in above transmit code for more explanation) */ + antennaTimeRxPktEnd = NRF_TIMER0->CC[2] /* start with timer value when payload just finished */ + + TICKS_PER_USEC * crcTime /* add CRC time to arrive at end of packet */ + + TICKS_PER_USEC * term2Time /* add TERM2 time to arrive at end of packet */ + - TICKS_PER_USEC * NRF5x_PROP_DELAY_RX_USECS; /* subtract propagation delay to get "antenna time" */ + + /* set timer trigger for upcoming TIFS transmit operation */ + NRF_TIMER0->CC[0] = antennaTimeRxPktEnd /* start with antenna time */ + + TICKS_PER_USEC * LL_BLE_TIFS_US /* add the TIFS period */ + - TICKS_PER_USEC * NRF5x_tTXEN_BLE_USECS /* subtract ramp-up time */ + - TICKS_PER_USEC * NRF5x_PROP_DELAY_TX_USECS /* subtract internal propagation delay */ + + TICKS_PER_USEC * rxCorrection /* empirically derived trim factor (NOTE!! units are ticks, scaler change affects this) */ + + TICKS_PER_USEC * txCorrection /* empirically derived trim factor (NOTE!! units are ticks, scaler change affects this) */ + + bbTxTifsAdj; /* adjustment specified via API function call */ + + /* configure and enable PPI trigger for TXEN, happens on next timer COMPARE[0] */ + NRF_PPI->CH[14].TEP = (uint32_t) &NRF_RADIO->TASKS_TXEN; /* configure task */ + NRF_PPI->CHENSET = PPI_CHENSET_CH14_Msk; /* enable channel */ + + /* an RX is completing, the radio will soon be ramping up for possible TIFS TX */ + tifsState = TIFS_TX_RAMPUP; + } + + /* ------------------------------------------------------------------------------ + * Check to see if TIFS window already missed. This would happen if + * interrupts were suppressed for a long time. + * + * NOTE! If the timing for the CC[0] compare is *too early*, it may actually + * fire while the radio is still active. If this happens, the operation + * that was supposed to trigger is ignored. This will cause big problems + * as it cannot be detected. The software assumes the operation is going + * forward when it is not. However, this is guarded against when the compare + * is set, hence, any problem with this is an internal error. + */ + + /* capture current time */ + NRF_TIMER0->TASKS_CAPTURE[3] = 1; + + /* see if current time is already past the TX/RX trigger point */ + if ((NRF_TIMER0->CC[0] - NRF_TIMER0->CC[3]) & 0x80000000) + { + /* disable the PPI channel... which was just enabled */ + NRF_PPI->CHENCLR = PPI_CHENCLR_CH14_Msk; /* COMPARE[0] -> TXEN/RXEN */ + + /* override the TIFS state... which was just set */ + tifsState = TIFS_NULL; + + /* + * NOTE: If the trigger point were *just* reached, and the RX/TX were actually triggered... + * this is OK, the interrupt that fires will be redundant but do no harm. + */ + } + } + + /* -----------------------------------------------------------------------------* + * DISABLED - "TX-RX Complete" + * -----------------------------------------------------------------------------*/ + else if ((NRF_RADIO->INTENSET & RADIO_INTENSET_END_Msk) && NRF_RADIO->EVENTS_END) + { + /* clear the event, leave the interrupt active */ + NRF_RADIO->EVENTS_END = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_RADIO->EVENTS_END); + + /* clear diagnostics pins */ + DIAG_PIN_CLEAR( TX_PIN ); + DIAG_PIN_CLEAR( RX_PIN ); + + /* - - - - - - - - - - - - - - - - - - - - - - - - - * + * TX Complete + * - - - - - - - - - - - - - - - - - - - - - - - - - */ + if (driverState == TX_STATE) + { + /* update driver state, *before* callback */ + driverState = IDLE_STATE; + + /* run callback function */ + palBbRestoreTrl(); + bbTxCallback(BB_STATUS_SUCCESS); + } + + /* - - - - - - - - - - - - - - - - - - - - - - - - - * + * RX Complete + * - - - - - - - - - - - - - - - - - - - - - - - - - */ + else if (driverState == RX_STATE) + { + uint32_t timestamp; + int8_t rssi; + uint8_t pduLen; + +#if defined(NRF52840_XXAA) + uint8_t byteRate; + int32_t correction; +#endif + + /* get the PDU payload length from received packet, used later to compute start timestamp */ + pduLen = bbpRxBuf[1]; + + /* + * Calculate the 'start' timestamp. It is "antenna time" of the first packet bit. + * + * The timestamp is derived from the a previous timer capture (held in CC[2]) that occurred at PAYLOAD event. + * It calculated by subtracting back from payload complete to the packet start. + * + * The PDU payload length was retrieved from the incoming buffer of the last receive packet. + */ + timestamp = NRF_TIMER0->CC[2] - (TICKS_PER_USEC * NRF5x_PROP_DELAY_RX_USECS); + switch(bbRxPhy) + { + case BB_PHY_BLE_1M: + timestamp -= (TICKS_PER_USEC * LL_BLE_US_PER_BYTE_1M * ( LL_PREAMBLE_LEN_1M + /* preamble */ + LL_AA_LEN + /* address */ + PDU_HEADER_LEN + /* PDU header */ + pduLen )); /* PDU payload */ + +#if defined(NRF52840_XXAA) + timestamp -= (2 * TICKS_PER_USEC); /* Adjustment based on the sniffer trace observation. */ +#endif + break; + case BB_PHY_BLE_2M: + timestamp -= (TICKS_PER_USEC * LL_BLE_US_PER_BYTE_2M * ( LL_PREAMBLE_LEN_2M + /* preamble */ + LL_AA_LEN + /* address */ + PDU_HEADER_LEN + /* PDU header */ + pduLen )); /* PDU payload */ + +#if defined(NRF52840_XXAA) + timestamp += (3 * TICKS_PER_USEC); /* Adjustment based on the sniffer trace observation. */ +#endif + break; +#if defined(NRF52840_XXAA) + case BB_PHY_BLE_CODED: + byteRate = (bbRxPhyOptions == BB_PHY_OPTIONS_BLE_S2) ? LL_BLE_US_PER_BYTE_CODED_S2 : LL_BLE_US_PER_BYTE_CODED_S8; + correction = (bbRxPhyOptions == BB_PHY_OPTIONS_BLE_S2) ? 20 : 160; + timestamp -= (TICKS_PER_USEC * LL_BLE_US_PER_BIT_CODED_S8 * ( LL_PREAMBLE_LEN_CODED_BITS + /* preamble */ + LL_AA_LEN * 8 + /* address */ + LL_CI_LEN_BITS + /* CI */ + LL_TERM1_LEN_BITS) + /* TERM1 */ + TICKS_PER_USEC * byteRate * ( PDU_HEADER_LEN + /* PDU header */ + pduLen )); /* PDU payload */ + timestamp -= TICKS_PER_USEC * correction; /* Empirical value */ + + /* Adjustment based on the sniffer trace observation. */ + timestamp += ((bbRxPhyOptions == BB_PHY_OPTIONS_BLE_S2) ? -29 : -20) * TICKS_PER_USEC; + break; +#endif + default: + timestamp -= (TICKS_PER_USEC * LL_BLE_US_PER_BYTE_1M * ( LL_PREAMBLE_LEN_1M + /* preamble */ + LL_AA_LEN + /* address */ + PDU_HEADER_LEN + /* PDU header */ + pduLen )); /* PDU payload */ + } + +#if (USE_RTC_BB_CLK) + /* reduce timestamp to BB clock units add RTC clock offset */ + timestamp = USEC_TO_TICKS(timestamp) + bbEventStartTime; +#endif + + /* compute RSSI value at antenna end */ + rssi = (int8_t)(-(NRF_RADIO->RSSISAMPLE & 0x7F)) - PalRadioGetRxRfPathComp(); + /* update driver state, *before* callback */ + driverState = IDLE_STATE; + + /* Follow Rx PHY options */ + bbTxPhyOptions = bbRxPhyOptions; + + /* Overwrite with TIFS preference */ + if(tifsTxPhyOptions) + { + bbTxPhyOptions = tifsTxPhyOptions; + } + + /* see if the CRC failed */ + if ((NRF_RADIO->CRCSTATUS & RADIO_CRCSTATUS_CRCSTATUS_Msk) == RADIO_CRCSTATUS_CRCSTATUS_CRCError) + { + /* CRC error - run the callback function */ + bbRxCallback(BB_STATUS_CRC_FAILED, rssi, NRF_RADIO->RXCRC, timestamp, bbRxPhyOptions); + } + else + { + /* Success! - run the callback function */ + bbRxCallback(BB_STATUS_SUCCESS, rssi, NRF_RADIO->RXCRC, timestamp, bbRxPhyOptions); + } + } + + /* - - - - - - - - - - - - - - - - - - - - - - - - - * + * Illegal State + * - - - - - - - - - - - - - - - - - - - - - - - - - */ + else + { + BB_ASSERT(0); /* most likely IDLE state, if not it is completely unknown */ + + /* + * Ah ah. You tried this, NRF_RADIO->TASKS_DISABLE = 1, didn't you? + * Not allowed! Only palBbRadioHardStop() is permitted to do that. + */ + } + } + + /* -----------------------------------------------------------------------------* + * Unexpected Interrupt + * -----------------------------------------------------------------------------*/ + else + { + BB_ASSERT(0); + } + + DIAG_PIN_CLEAR( RADIO_INT_PIN ); +} + +/*************************************************************************************************/ +/*! + * \brief Cancel TIFS timer. + * + * \return None. + * + * This stops any active TIFS timer operation. This routine is always called in the callback + * (i.e. ISR) context. + */ +/*************************************************************************************************/ +void PalBbBleCancelTifs(void) +{ + BB_ASSERT(driverState == IDLE_STATE); /* driver must be idle */ + + /* hard stop will kill any TIFS ramping up */ + palBbRadioHardStop(); + palBbRestoreTrl(); +} + +/*************************************************************************************************/ +/*! + * \brief Cancel a pending transmit or receive. + * + * \return None. + * + * This stops any active radio operation. This routine is never called in the callback + * (i.e. ISR) context. + */ +/*************************************************************************************************/ +void PalBbBleCancelData(void) +{ + BB_ASSERT(driverState != NULL_STATE); /* driver must be initialized */ + BB_ASSERT(driverState != SLEEP_STATE); /* driver cannot be asleep */ + + /* cancel RX timeout if active */ + NRF_TIMER0->INTENCLR = TIMER_INTENCLR_COMPARE1_Msk; /* disable interrupt */ + NVIC_ClearPendingIRQ(TIMER0_IRQn); /* just in case we are running in interrupt context above TIMER0 */ + + /* stop radio */ + palBbRadioHardStop(); + palBbRestoreTrl(); + + /////////////////////////////////////////////////////////////////////////////// + #ifdef DIAGNOSTICS + diagCancels++; + + /* update diagnostics */ + if (diagOp != DIAG_NULL) + { + if ((diagOp == DIAG_TX) || (diagOp == DIAG_TX_TIFS)) + { + diagTxTotalCalls--; + if (diagOp == DIAG_TX) { diagTxCalls--; } + else { diagTxTifsCalls--; } + } + else if ((diagOp == DIAG_RX) || (diagOp == DIAG_RX_TIFS)) + { + diagRxTotalCalls--; + if (diagOp == DIAG_RX) { diagRxCalls--; } + else { diagRxTifsCalls--; } + } + else + { + BB_ASSERT(0); /* unknown value for diagOp */ + } + + /* finally, set to NULL */ + diagOp = DIAG_NULL; + } + #endif + /////////////////////////////////////////////////////////////////////////////// +} + +/*===============================================================================================*/ +/*! + * \brief Hard stop of the radio. + * + * \param None. + * + * \return None. + * + * Immediately stops the radio. All radio interrupts are cancelled. The radio is put into + * the disabled state. This function does not return until the disabled state is verified. + * + */ +/*===============================================================================================*/ +static void palBbRadioHardStop(void) +{ + /* hard stop of all radio interrupts */ + NVIC_DisableIRQ(RADIO_IRQn); + + /* Workaround for TX idle failure in Coded PHY */ + NRF_RADIO->TASKS_RXEN = 1; + + /* disable the radio, start early at the top here */ + NRF_RADIO->TASKS_DISABLE = 1; + + /* disable the PPI channel of TX/RX operations */ + NRF_PPI->CHENCLR = PPI_CHENCLR_CH14_Msk; /* COMPARE[0] -> TXEN/RXEN */ + + /* disable HFCLK */ +#if (USE_RTC_BB_CLK) + NRF_TIMER0->TASKS_STOP = 1; + NRF_TIMER0->TASKS_CLEAR = 1; +#endif + + /* update TIFS state */ + tifsState = TIFS_NULL; + + /* update driver state */ + driverState = IDLE_STATE; + + /* clear diagnostics pins */ + DIAG_PIN_CLEAR( TX_PIN ); + DIAG_PIN_CLEAR( RX_PIN ); + + /* wait for radio to complete shutdown */ + /////////////////////////////////////////////////////////////////////////////// + #if BB_ASSERT_ENABLED == TRUE + uint8_t busycount = 0; + BB_ASSERT(busycount < 10); /* radio got stuck */ + busycount++; + #endif + /////////////////////////////////////////////////////////////////////////////// + +#if defined(NRF52840_XXAA) + /* Restore normal operation for non-Coded PHY. */ + *(volatile uint32_t *)0x4000173C &= ~0x80000000; +#endif + + /* clear all events */ + NRF_RADIO->EVENTS_READY = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_RADIO->EVENTS_READY); + NRF_RADIO->EVENTS_PAYLOAD = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_RADIO->EVENTS_PAYLOAD); + NRF_RADIO->EVENTS_END = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_RADIO->EVENTS_END); + NRF_RADIO->EVENTS_DISABLED = 0; + WAIT_FOR_WR_BUF_EMPTY(NRF_RADIO->EVENTS_DISABLED); + /* NOTE: The event ADDRESS is not cleared. There is no associated interrupt. + It is cleared and set as part of the RX timeout logic. */ + + /* stop any encryption that is under way, disable its interrupt */ + NRF_CCM->TASKS_STOP = 1 ; + NRF_CCM->INTENCLR = CCM_INTENCLR_ENDKSGEN_Msk; + + /* clear any pending radio interrupts */ + NVIC_ClearPendingIRQ(RADIO_IRQn); + + /* re-enable radio interrupts */ + NVIC_EnableIRQ(RADIO_IRQn); +} + +/*************************************************************************************************/ +/*! + * \brief Get transmit data from transmit descriptor. + * + * \param descs Array of transmit buffer descriptor. + * \param cnt Number of descriptors. + * + * \return Pointer to transmit data. + * + */ +/*************************************************************************************************/ +static uint8_t *palBbGetTxData(PalBbBleTxBufDesc_t descs[], uint8_t cnt) +{ + uint8_t *pTxBuf; + + if (cnt == 1) + { + /* The entire packet is in the 0th buffer. */ + pTxBuf = descs[0].pBuf; + } + else + { + if (descs[0].len == LL_DATA_HDR_LEN) + { + /* Assume Data PDU */ + + /* The packet must be gathered into the 1st buffer. */ + pTxBuf = descs[1].pBuf - descs[0].len; + + /* Restore header. This overwrites data previously transmitted, so it does not need to be preserved. */ + memcpy(pTxBuf, descs[0].pBuf, descs[0].len); + + if (cnt > 2) + { + /* The packet has a trailer (i.e., MIC). */ + uint8_t *pTrl = descs[1].pBuf + descs[1].len; + uint8_t trlLen = descs[2].len; + + /* Preserve overwritten data. This could be skipped for the last fragment. */ + memcpy(bbTrlSave, pTrl, trlLen); + bbTrlSavedLen = trlLen; + bbTrlSavedPtr = pTrl; + + /* Restore trailer. */ + memcpy(pTrl, descs[2].pBuf, trlLen); + } + } + else + { + static uint8_t contTxBuf[LL_EXT_ADVB_MAX_LEN]; + + /* Assume Extended advertising PDU */ + BB_ASSERT(descs[0].len >= (LL_ADV_HDR_LEN + LL_EXT_ADV_HDR_MIN_LEN)); + BB_ASSERT((descs[0].len + descs[1].len) <= sizeof(contTxBuf)); + + pTxBuf = contTxBuf; + memcpy(contTxBuf, descs[0].pBuf, descs[0].len); + memcpy(contTxBuf + descs[0].len, descs[1].pBuf, descs[1].len); + } + } + + return pTxBuf; +} + +/*************************************************************************************************/ +/*! + * \brief Restore trailer data. + * + * \return None. + * + */ +/*************************************************************************************************/ +static void palBbRestoreTrl(void) +{ + if (bbTrlSavedPtr != NULL) + { + memcpy(bbTrlSavedPtr, bbTrlSave, bbTrlSavedLen); + bbTrlSavedPtr = NULL; + } +} + +/////////////////////////////////////////////////////////////////////////////// +#ifdef DIAGNOSTICS +/*===============================================================================================*/ +/*! + * \brief Diagnostic function to record callback status. + * + * \param status status as reported via callback + * + * \return None. + * + * For diagnostics, this function is used to intercept passing control to the configured + * callback function. It is used to record diagnostic information. + * + */ +/*===============================================================================================*/ +static void DiagFauxTxCallback(uint8_t status) +{ + BB_ASSERT(diagOp != DIAG_NULL); /* more than one callback for the operation? */ + BB_ASSERT((diagOp == DIAG_TX) || (diagOp == DIAG_TX_TIFS)); /* apparent criss-cross of tx/rx, typo somewhere? */ + + /* keep account of each operation-result */ + if (diagOp == DIAG_TX) + { + if (status == BB_STATUS_SUCCESS) { diagTxSuccess++; } + else if (status == BB_STATUS_FAILED) { diagTxFail++; } + else { BB_ASSERT(0); } /* unexpected status for the operation */ + } + else if (diagOp == DIAG_TX_TIFS) + { + if (status == BB_STATUS_SUCCESS) { diagTxTifsSuccess++; } + else if (status == BB_STATUS_FAILED) { diagTxTifsFail++; } + else { BB_ASSERT(0); } /* unexpected status for the operation */ + } + else + { + BB_ASSERT(0); /* unexpected operation */ + } + + /* extra integrity checks, make sure the accounting adds up */ + BB_ASSERT(diagTxTotalCalls == (uint16_t)(diagTxSuccess + diagTxFail + diagTxTifsSuccess + diagTxTifsFail)); + BB_ASSERT(diagTxCalls == (uint16_t)(diagTxSuccess + diagTxFail)); + BB_ASSERT(diagTxTifsCalls == (uint16_t)(diagTxTifsSuccess + diagTxTifsFail)); + + BB_ASSERT(diagTxFail == (uint16_t)(diagTxFailBadDueTime + diagTxFailMissedDueTime)); + BB_ASSERT(diagTxTifsFail == (uint16_t)(diagTxTifsFailMissed + diagTxTifsFailNotPossible)); + + /* keep track of last operation */ + diagOpLast = diagOp; + diagOp = DIAG_NULL; + diagLastStatus = status; + + /* finally, run the user specified callback, everything else is just diagnostics */ + diagTxCallback(status); +} + +/*===============================================================================================*/ +/*! + * \brief Diagnostic function to record callback status. + * + * \param status status as reported via callback + * + * \return None. + * + * For diagnostics, this function is used to intercept passing control to the configured + * callback function. It is used to record diagnostic information. + * + */ +/*===============================================================================================*/ +static void DiagFauxRxCallback(uint8_t status, int8_t rssi, uint32_t crc, uint32_t timestamp) +{ + BB_ASSERT(diagOp != DIAG_NULL); /* more than one callback for the operation? */ + BB_ASSERT((diagOp == DIAG_RX) || (diagOp == DIAG_RX_TIFS)); /* apparent criss-cross of tx/rx, typo somewhere? */ + + /* keep account of each operation-result */ + if (diagOp == DIAG_RX) + { + if (status == BB_STATUS_SUCCESS) { diagRxSuccess++; } + else if (status == BB_STATUS_FAILED) { diagRxFail++; } + else if (status == BB_STATUS_RX_TIMEOUT) { diagRxTimeout++; } + else if (status == BB_STATUS_CRC_FAILED) { diagRxCrcFail++; } + else { BB_ASSERT(0); } /* unexpected status for the operation */ + } + else if (diagOp == DIAG_RX_TIFS) + { + if (status == BB_STATUS_SUCCESS) { diagRxTifsSuccess++; } + else if (status == BB_STATUS_FAILED) { diagRxTifsFail++; } + else if (status == BB_STATUS_RX_TIMEOUT) { diagRxTifsTimeout++; } + else if (status == BB_STATUS_CRC_FAILED) { diagRxTifsCrcFail++; } + else { BB_ASSERT(0); } /* unexpected status for the operation */ + } + else + { + BB_ASSERT(0); /* unexpected operation */ + } + + /* extra integrity check, make sure the accounting adds up */ + BB_ASSERT(diagRxTotalCalls == (uint16_t)( diagRxSuccess + + diagRxFail + + diagRxTimeout + + diagRxCrcFail + + diagRxTifsSuccess + + diagRxTifsFail + + diagRxTifsTimeout + + diagRxTifsCrcFail )); + + BB_ASSERT(diagRxCalls == (uint16_t)( diagRxSuccess + + diagRxFail + + diagRxTimeout + + diagRxCrcFail )); + + BB_ASSERT(diagRxTifsCalls == (uint16_t)( diagRxTifsSuccess + + diagRxTifsFail + + diagRxTifsTimeout + + diagRxTifsCrcFail )); + + BB_ASSERT(diagRxFail == (uint16_t)(diagRxFailBadDueTime + diagRxFailMissedDueTime)); + BB_ASSERT(diagRxTifsFail == (uint16_t)(diagRxTifsFailMissed + diagRxTifsFailNotPossible)); + + /* keep track of last operation */ + diagOpLast = diagOp; + diagOp = DIAG_NULL; + diagLastStatus = status; + + /* finally, run the user specified callback, everything else is just diagnostics */ + diagRxCallback(status, rssi, crc, timestamp); +} +#endif + +///////////////////////////////////////////////////////////////////////////////// diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_bb_ble_rf.c b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_bb_ble_rf.c new file mode 100644 index 0000000000..a12adce13f --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_bb_ble_rf.c @@ -0,0 +1,221 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief BLE RF path compensation implementation file. + * + * Copyright (c) 2016-2019 Arm Ltd. All Rights Reserved. + * Arm Ltd. confidential and proprietary. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*************************************************************************************************/ + +#include "pal_types.h" + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +/*! \brief Minimum RF path compensation (in 0.1dBm units). */ +#define BB_BLE_MIN_PATH_COMP -1280 + +/*! \brief Minimum RF path compensation (in 1dBm units). */ +#define BB_BLE_MIN_PATH_COMP_DBM -128 + +/*! \brief Maximum RF path compensation (in 0.1dBm units). */ +#define BB_BLE_MAX_PATH_COMP 1280 + +/*! \brief Binary divide with 10 divisor (n[max]=0xFFFFFFFF). */ +#define BB_BLE_MATH_DIV_10(n) ((uint32_t)(((uint64_t)(n) * UINT64_C(419431)) >> 22)) + +/************************************************************************************************** + Constants +**************************************************************************************************/ + +#if defined(NRF52840_XXAA) || defined(NRF52832_XXAA) +/* \brief Minimum Tx power level (expressed in 1dBm units). */ +static const int16_t bbBleMinTxPwr = -40; /* -40dBm */ +#else +/* \brief Minimum Tx power level (expressed in 1dBm units). */ +static const int16_t bbBleMinTxPwr = -30; /* -30dBm */ +#endif + +#if defined(NRF52840_XXAA) +/* \brief Maximum Tx power level (expressed in 1dBm units). */ +static const int16_t bbBleMaxTxPwr = 9; /* +9dBm */ +#else +/* \brief Maximum Tx power level (expressed in 1dBm units). */ +static const int16_t bbBleMaxTxPwr = 4; /* +4dBm */ +#endif + +/************************************************************************************************** + Global Variables +**************************************************************************************************/ + +/*! \brief Current Tx path compensation value. */ +int16_t bbBleTxPathComp = -1280; + +/*! \brief Current Rx path compensation value. */ +int16_t bbBleRxPathComp = -1280; + +/*************************************************************************************************/ +/*! + * \brief Get transmit RF path compensation. + * + * \return Transmit RF path compensation (in 1-dBm units). + */ +/*************************************************************************************************/ +int8_t palBbBleRfGetTxRfPathComp(void) +{ + uint16_t pathCompUnsigned = (uint16_t)(bbBleTxPathComp - BB_BLE_MIN_PATH_COMP); + + return (int16_t)BB_BLE_MATH_DIV_10(pathCompUnsigned) + BB_BLE_MIN_PATH_COMP_DBM; +} + +/*************************************************************************************************/ +/*! + * \brief Get receive RF path compensation. + * + * \return Transmit RF path compensation (in 1-dBm units). + */ +/*************************************************************************************************/ +int8_t PalRadioGetRxRfPathComp(void) +{ + uint16_t pathCompUnsigned = (uint16_t)(bbBleRxPathComp - BB_BLE_MIN_PATH_COMP); + + return (int16_t)BB_BLE_MATH_DIV_10(pathCompUnsigned) + BB_BLE_MIN_PATH_COMP_DBM; +} + +/*************************************************************************************************/ +/*! + * \brief Initialize RF path compensation. + * + * \return None. + */ +/*************************************************************************************************/ +void PalRadioInitPathComp(void) +{ + bbBleTxPathComp = 0; + bbBleRxPathComp = 0; +} + +/*************************************************************************************************/ +/*! + * \brief Get supported transmit power. + * + * \param pMinTxPwr Return buffer for minimum transmit power (expressed in 1dBm units). + * \param pMaxTxPwr Return buffer for maximum transmit power (expressed in 1dBm units). + * + * \return None. + */ +/*************************************************************************************************/ +void PalRadioGetSupTxPower(int8_t *pMinTxPwr, int8_t *pMaxTxPwr) +{ + *pMinTxPwr = bbBleMinTxPwr; + *pMaxTxPwr = bbBleMaxTxPwr; +} + +/*************************************************************************************************/ +/*! + * \brief Get RF path compensation. + * + * \param pTxPathComp Return buffer for RF transmit path compensation value (expressed in 0.1dBm units). + * \param pRxPathComp Return buffer for RF receive path compensation value (expressed in 0.1dBm units). + * + * \return None. + */ +/*************************************************************************************************/ +void PalRadioReadRfPathComp(int16_t *pTxPathComp, int16_t *pRxPathComp) +{ + *pTxPathComp = bbBleTxPathComp; + *pRxPathComp = bbBleRxPathComp; +} + +/*************************************************************************************************/ +/*! + * \brief Set RF path compensation. + * + * \param txPathComp RF transmit path compensation value (expressed in 0.1dBm units). + * \param rxPathComp RF receive path compensation value (expressed in 0.1dBm units). + * + * \return TRUE if successful, FALSE otherwise. + */ +/*************************************************************************************************/ +bool_t PalRadioWriteRfPathComp(int16_t txPathComp, int16_t rxPathComp) +{ + bbBleTxPathComp = txPathComp; + bbBleRxPathComp = rxPathComp; + + return TRUE; +} + +/*************************************************************************************************/ +/*! + * \brief Get the actual Tx power at the antenna (expressed in 1dBm units). + * + * \param txPwr Tx power provided by the host (expressed in 1dBm units). + * \param compFlag Flag to apply Tx path compensation or not. + * + * \return Actual Tx power at the antenna (expressed in 1dBm units). + * + * Tx path compensation is only used for extended ADV header. + * Compensation is not considered when filling in HCI events. + */ +/*************************************************************************************************/ +int8_t PalRadioGetActualTxPower(int8_t txPwr, bool_t compFlag) +{ +#if defined(NRF52840_XXAA) + if (txPwr >= 9) { txPwr = 9; } + else if (txPwr >= 8) { txPwr = 8; } + else if (txPwr >= 7) { txPwr = 7; } + else if (txPwr >= 6) { txPwr = 6; } + else if (txPwr >= 5) { txPwr = 5; } + else if (txPwr >= 4) { txPwr = 4; } + else if (txPwr >= 3) { txPwr = 3; } + else if (txPwr >= 2) { txPwr = 2; } + else if (txPwr >= 0) { txPwr = 0; } + else if (txPwr >= -4) { txPwr = -4; } + else if (txPwr >= -8) { txPwr = -8; } + else if (txPwr >= -12) { txPwr = -12; } + else if (txPwr >= -16) { txPwr = -16; } + else if (txPwr >= -20) { txPwr = -20; } + else { txPwr = -40; } +#elif defined(NRF52832_XXAA) + if (txPwr >= 4) { txPwr = 4; } + else if (txPwr >= 3) { txPwr = 3; } + else if (txPwr >= 0) { txPwr = 0; } + else if (txPwr >= -4) { txPwr = -4; } + else if (txPwr >= -8) { txPwr = -8; } + else if (txPwr >= -12) { txPwr = -12; } + else if (txPwr >= -16) { txPwr = -16; } + else if (txPwr >= -20) { txPwr = -20; } + else { txPwr = -40; } +#else + if (txPwr >= 4) { txPwr = 4; } + else if (txPwr >= 0) { txPwr = 0; } + else if (txPwr >= -4) { txPwr = -4; } + else if (txPwr >= -8) { txPwr = -8; } + else if (txPwr >= -12) { txPwr = -12; } + else if (txPwr >= -16) { txPwr = -16; } + else if (txPwr >= -20) { txPwr = -20; } + else { txPwr = -30; } +#endif + + if (compFlag) + { + txPwr += palBbBleRfGetTxRfPathComp(); + } + + return txPwr; +} diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_cfg.c b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_cfg.c new file mode 100644 index 0000000000..749fc5a78b --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_cfg.c @@ -0,0 +1,297 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief System configuration definition. + * + * Copyright (c) 2013-2019 Arm Ltd. All Rights Reserved. + * Arm Ltd. confidential and proprietary. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*************************************************************************************************/ + +#include "pal_cfg.h" +#include "nrf.h" + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +#ifndef LL_MAX_CIG +#define LL_MAX_CIG 2 /*!< Absolute maximum number of connected isochronous groups. */ +#endif + +#ifndef LL_MAX_CIS +#define LL_MAX_CIS 2 /*!< Absolute maximum number of connected isochronous streams per CIG. */ +#endif + +#ifndef LL_MAX_ADV_DATA_LEN +#define LL_MAX_ADV_DATA_LEN 1650 /*!< Maximum advertising data length. */ +#endif + +#ifndef LL_MAX_ADV_SETS +#define LL_MAX_ADV_SETS 6 /*!< Absolute maximum number of advertising sets. */ +#endif + +/************************************************************************************************** + Type Definitions +**************************************************************************************************/ + +/*! \brief LL configuration. */ +typedef struct +{ + /* Advertiser */ + uint8_t maxAdvSets; /*!< Maximum number of advertising sets. */ + uint8_t maxAdvReports; /*!< Maximum number of pending legacy or extended advertising reports. */ + uint16_t maxExtAdvDataLen; /*!< Maximum extended advertising data size. */ + uint8_t defExtAdvDataFragLen; /*!< Default extended advertising data fragmentation size. */ + uint16_t auxDelayUsec; /*!< Additional Auxiliary Offset delay above T_MAFS in microseconds. */ + uint16_t auxPtrOffsetUsec; /*!< Delay of auxiliary packet in microseconds from the time specified by auxPtr. */ + /* Scanner */ + uint8_t maxScanReqRcvdEvt; /*!< Maximum scan request received events. */ + uint16_t maxExtScanDataLen; /*!< Maximum extended scan data size. */ + /* Connection */ + uint8_t maxConn; /*!< Maximum number of connections. */ + uint8_t numTxBufs; /*!< Default number of transmit buffers. */ + uint8_t numRxBufs; /*!< Default number of receive buffers. */ + uint16_t maxAclLen; /*!< Maximum ACL buffer size. */ + int8_t defTxPwrLvl; /*!< Default Tx power level for connections. */ + uint8_t ceJitterUsec; /*!< Allowable CE jitter on a slave (account for master's sleep clock resolution). */ + /* ISO */ + uint8_t numIsoTxBuf; /*!< Default number of ISO transmit buffers. */ + uint8_t numIsoRxBuf; /*!< Default number of ISO receive buffers. */ + uint16_t maxIsoBufLen; /*!< Maximum ISO buffer size between host and controller. */ + uint16_t maxIsoPduLen; /*!< Maximum ISO PDU size between controllers. */ + + /* CIS */ + uint8_t maxCig; /*!< Maximum number of CIG. */ + uint8_t maxCis; /*!< Maximum number of CIS. */ + uint16_t subEvtSpaceDelay; /*!< Subevent spacing above T_MSS. */ + /* DTM */ + uint16_t dtmRxSyncMs; /*!< DTM Rx synchronization window in milliseconds. */ +} PalCfgLl_t; + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +/*! \brief convert uint32_t to little endian byte stream, incrementing four bytes. */ +#define PAL_UINT32_TO_BSTREAM(p, n) {*(p)++ = (uint8_t)(n); *(p)++ = (uint8_t)((n) >> 8); \ + *(p)++ = (uint8_t)((n) >> 16); *(p)++ = (uint8_t)((n) >> 24);} + +/************************************************************************************************** + Functions +**************************************************************************************************/ + +/*************************************************************************************************/ +/*! + * \brief Get BLE PHY feature configuration. + * + * \param phy2mSup 2M PHY supported. + * \param phyCodedSup Coded PHY supported. + * \param stableModIdxTxSup Tx stable modulation index supported. + * \param stableModIdxRxSup Rx stable modulation index supported. + * + * \return None. + */ +/*************************************************************************************************/ +void palCfgGetBlePhyFeatures(uint8_t *pPhy2mSup, uint8_t *pPhyCodedSup, + uint8_t *pStableModIdxTxSup, uint8_t *pStableModIdxRxSup) +{ +#if defined(NRF52840_XXAA) + *pPhy2mSup = TRUE; + *pPhyCodedSup = TRUE; +#else + *pPhy2mSup = FALSE; + *pPhyCodedSup = FALSE; +#endif + *pStableModIdxTxSup = TRUE; + *pStableModIdxRxSup = TRUE; +} + +/*************************************************************************************************/ +/*! + * \brief Load LL advertising configuration. + * + * \param pConfig Return configuration values. + * + * \return None. + */ +/*************************************************************************************************/ +void palCfgLoadLlParams(uint8_t *pConfig) +{ + PalCfgLl_t *pCfg = (PalCfgLl_t *)pConfig; + + #if !defined(NRF52840_XXAA) + const uint16_t advDataLen = 512; + const uint16_t connDataLen = 256; + const uint16_t numTxBufs = 8; + #else + const uint16_t advDataLen = LL_MAX_ADV_DATA_LEN; + const uint16_t connDataLen = 512; + const uint16_t numTxBufs = 16; + #endif + + pCfg->maxAdvSets = LL_MAX_ADV_SETS; + pCfg->maxAdvReports = 16; + pCfg->maxExtAdvDataLen = advDataLen; + /* pCfg->defExtAdvDataFragLen */ /* Use default. */ + pCfg->auxDelayUsec = 0; + pCfg->maxScanReqRcvdEvt = 4; + pCfg->maxExtScanDataLen = advDataLen; + pCfg->maxConn = 4; + pCfg->maxAclLen = connDataLen; + pCfg->numTxBufs = numTxBufs; + pCfg->numRxBufs = 8; + pCfg->numIsoTxBuf = 6; + pCfg->numIsoRxBuf = 6; + pCfg->maxIsoBufLen = 251; + pCfg->maxIsoPduLen = 64; + pCfg->maxCig = LL_MAX_CIG; + pCfg->maxCis = LL_MAX_CIS; + pCfg->subEvtSpaceDelay = 0; +} + +/*************************************************************************************************/ +/*! + * \brief Load device address. + * + * \param pDevAddr device address. + * + * \return None. + */ +/*************************************************************************************************/ +void palCfgLoadBdAddress(uint8_t *pDevAddr) +{ + unsigned int devAddrLen = 6; + + /* Load address from nRF configuration. */ + uint64_t devAddr = (((uint64_t)NRF_FICR->DEVICEID[0]) << 0) | + (((uint64_t)NRF_FICR->DEVICEID[1]) << 32); + + unsigned int i = 0; + while (i < devAddrLen) + { + pDevAddr[i] = devAddr >> (i * 8); + i++; + } + + pDevAddr[5] |= 0xC0; /* cf. "Static Address" (Vol C, Part 3, section 10.8.1) */ +} + +/*************************************************************************************************/ +/*! + * \brief Load 15.4 address. + * + * \param pDevAddr device address. + * + * \return None. + */ +/*************************************************************************************************/ +void palCfgLoadExtMac154Address(uint8_t *pDevAddr) +{ + unsigned int devAddrLen = 8; + + /* Load address from nRF configuration. */ + uint64_t devAddr = (((uint64_t)NRF_FICR->DEVICEID[0]) << 0) | + (((uint64_t)NRF_FICR->DEVICEID[1]) << 32); + + unsigned int i = 0; + while (i < devAddrLen) + { + pDevAddr[i] = devAddr >> (i * 8); + i++; + } +} + +/*************************************************************************************************/ +/*! + * \brief Set device UUID. + * + * \param pBuf Return device UUID. + * + * \return None. + */ +/*************************************************************************************************/ +void PalCfgSetDeviceUuid(uint8_t *pBuf) +{ + /* Not used on this platform. */ +} + +/*************************************************************************************************/ +/*! + * \brief Load device UUID. + * + * \param pDevUuid Return device UUID. + * + * \return None. + */ +/*************************************************************************************************/ +void palCfgLoadDeviceUuid(uint8_t *pDevUuid) +{ + uint8_t *pPtr = pDevUuid; + + /* Load Device UUID. */ + PAL_UINT32_TO_BSTREAM(pPtr, NRF_FICR->DEVICEID[0]); + PAL_UINT32_TO_BSTREAM(pPtr, NRF_FICR->DEVICEID[1]); +#if defined(NRF52840_XXAA) || defined(NRF52832_XXAA) + PAL_UINT32_TO_BSTREAM(pPtr, NRF_FICR->INFO.PART); + PAL_UINT32_TO_BSTREAM(pPtr, NRF_FICR->INFO.VARIANT); +#endif + + /* Set the version number as defined in RFC4122 */ + pDevUuid[7] = ((pDevUuid[7] & 0x0F) | 0x40); + /* Set the algorithm bits as defined in RFC4122 */ + pDevUuid[8] = ((pDevUuid[8] & 0x3F) | 0x80); +} + +/*************************************************************************************************/ +/*! + * \brief Load device UUID. + * + * \param cfgId Configuration ID. + * \param pBuf Buffer. + * \param len Buffer length. + * + * \return None. + */ +/*************************************************************************************************/ +void PalCfgLoadData(uint8_t cfgId, uint8_t *pBuf, uint32_t len) +{ + switch (cfgId) + { + case PAL_CFG_ID_BD_ADDR: + palCfgLoadBdAddress(pBuf); + break; + + case PAL_CFG_ID_BLE_PHY: + palCfgGetBlePhyFeatures(pBuf, pBuf + 1, pBuf + 2, pBuf + 3); + break; + + case PAL_CFG_ID_LL_PARAM: + palCfgLoadLlParams(pBuf); + break; + + case PAL_CFG_ID_MAC_ADDR: + palCfgLoadExtMac154Address(pBuf); + break; + + case PAL_CFG_ID_UUID: + palCfgLoadDeviceUuid(pBuf); + break; + + default: + break; + } +} diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_crypto.c b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_crypto.c new file mode 100644 index 0000000000..fb87796ae7 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_crypto.c @@ -0,0 +1,834 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief Crypto driver implementation. + * + * Copyright (c) 2018-2019 Arm Ltd. All Rights Reserved. + * Arm Ltd. confidential and proprietary. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*************************************************************************************************/ + +#include "pal_types.h" +#include "pal_bb_ble.h" +#if defined(NRF52840_XXAA) && MBED_CONF_CORDIO_LL_NRF52840_CRYPTOCELL310_ACCELERATION +#include "crys_rsa_kg.h" +#include "crys_dh.h" +#include "ssi_pal_types.h" +#include "ssi_aes.h" +#include "crys_aesccm.h" +#endif + +/* Nordic specific definitions. */ +#include "nrf_ecb.h" +#include "nrf.h" +#if defined(NRF52840_XXAA) && MBED_CONF_CORDIO_LL_NRF52840_CRYPTOCELL310_ACCELERATION +#include "nrf52840.h" +#endif +#include + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +/*! \brief convert little endian byte buffer to uint16_t. */ +#define BYTES_TO_UINT16(n, p) {n = ((uint16_t)(p)[0] + ((uint16_t)(p)[1] << 8));} + +/*! \brief Data PDU header length. */ +#define BB_DATA_PDU_HDR_LEN 2 + +/*! \brief Block size. */ +#define BB_AES_BLOCK_SIZE 16 + +/*! \brief Length field data PDU offset. */ +#define BB_DATA_PDU_LEN_OFFSET 1 + +/*! \brief Encryption modes. */ +enum +{ + PAL_CRYPTO_MODE_ENC, /*!< Encryption mode. */ + PAL_CRYPTO_MODE_DEC, /*!< Decryption mode. */ + PAL_CRYPTO_MODE_TOTAL /*!< Total modes. */ +}; + +#ifdef DEBUG + +/*! \brief Parameter check. */ +#define PAL_CRYPTO_PARAM_CHECK(expr) { if (!(expr)) { return; } } + +/*! \brief Parameter check, with return value. */ +#define PAL_CRYPTO_PARAM_CHECK_RET(expr, rv) { if (!(expr)) { return (rv); } } + +#else + +/*! \brief Parameter check (disabled). */ +#define PAL_CRYPTO_PARAM_CHECK(expr) + +/*! \brief Parameter check, with return value (disabled). */ +#define PAL_CRYPTO_PARAM_CHECK_RET(expr, rv) + +#endif + +#ifndef LL_MAX_CONN +#define LL_MAX_CONN 4 /*!< Absolute maximum number of connections (maximum is 32). */ +#endif + +#ifndef LL_MAX_CIG +#define LL_MAX_CIG 2 /*!< Absolute maximum number of connected isochronous groups. */ +#endif + +#ifndef LL_MAX_CIS +#define LL_MAX_CIS 2 /*!< Absolute maximum number of connected isochronous streams per CIG. */ +#endif + +#ifndef BB_ENABLE_INLINE_ENC_TX +#define BB_ENABLE_INLINE_ENC_TX FALSE +#endif + +#ifndef BB_ENABLE_INLINE_DEC_RX +#define BB_ENABLE_INLINE_DEC_RX FALSE +#endif + +/************************************************************************************************** + Data Types +**************************************************************************************************/ + +/*! \brief Encryption cipher block table. */ +typedef union +{ + uint8_t b[BB_AES_BLOCK_SIZE]; /*!< Byte access block. */ + uint32_t w[BB_AES_BLOCK_SIZE / sizeof(uint32_t)]; /*!< Word acess block. */ + + struct + { + uint8_t flags[1]; /*!< Flags. */ + uint8_t pctr[5]; /*!< Control. */ + uint8_t iv[8]; /*!< iv. */ + uint8_t iMSO[1]; /*!< iMSO. */ + uint8_t iLSO[1]; /*!< iLSO. */ + } f; /*!< Field access. */ +} palCryptoCipherBlk_t; + +/*! \brief Nordic ECB data. */ +typedef union +{ + struct + { + uint8_t key[BB_AES_BLOCK_SIZE]; /*!< Key. */ + uint8_t clear[BB_AES_BLOCK_SIZE]; /*!< Clear. */ + uint8_t cipher[BB_AES_BLOCK_SIZE]; /*!< Cipher. */ + } b; /*!< Byte access block. */ + struct + { + uint32_t key[BB_AES_BLOCK_SIZE / sizeof(uint32_t)]; /*!< Key. */ + uint32_t clear[BB_AES_BLOCK_SIZE / sizeof(uint32_t)]; /*!< Clear. */ + uint32_t cipher[BB_AES_BLOCK_SIZE / sizeof(uint32_t)]; /*!< Cipher. */ + } w; /*!< Word acess block. */ +} palCryptoEcbData_t; + +/************************************************************************************************** + Local Variables +**************************************************************************************************/ + +/*! \brief Cipher block context. */ +static palCryptoCipherBlk_t palCryptoCipherBlkTbl[LL_MAX_CONN+LL_MAX_CIS*LL_MAX_CIG][PAL_CRYPTO_MODE_TOTAL]; + +/*! \brief Nordic ECB encryption data block. */ +static palCryptoEcbData_t palCryptoEcb; + +/************************************************************************************************** + Functions +**************************************************************************************************/ + +/*************************************************************************************************/ +/*! + * \brief Execute Nordic AES ECB. + * + * \return None. + */ +/*************************************************************************************************/ +static inline void palCryptoExecuteAesEcb(void) +{ + NRF_ECB->EVENTS_ENDECB = 0; + NRF_ECB->EVENTS_ERRORECB = 0; + NRF_ECB->TASKS_STARTECB = 1; + + while (NRF_ECB->EVENTS_ENDECB == 0) + { + if (NRF_ECB->EVENTS_ERRORECB) + { + /* Clear ECB events, start ECB task. */ + PAL_CRYPTO_PARAM_CHECK(NRF_ECB->EVENTS_ENDECB == 0); + + NRF_ECB->EVENTS_ERRORECB = 0; + NRF_ECB->TASKS_STARTECB = 1; + } + } +} + +/*************************************************************************************************/ +/*! + * \brief Load Nordic AES ECB data. + * + * \param pEnc Encryption parameters. + * + * \return None. + */ +/*************************************************************************************************/ +static inline void palCryptoLoadEcbData(PalCryptoEnc_t *pEnc) +{ + uint32_t *pSkW = (uint32_t *)pEnc->sk; + palCryptoEcb.w.key[0] = __REV(pSkW[3]); + palCryptoEcb.w.key[1] = __REV(pSkW[2]); + palCryptoEcb.w.key[2] = __REV(pSkW[1]); + palCryptoEcb.w.key[3] = __REV(pSkW[0]); + + NRF_ECB->ECBDATAPTR = (uint32_t)palCryptoEcb.w.key; +} + +/*************************************************************************************************/ +/*! + * \brief Encrypt/decrypt PDU. + * + * \param pAx Ax cipher block template. + * \param pMic Inplace MIC buffer. + * \param pBuf Inplace cleartext/ciphertext buffer. + * \param pldLen Length of buffer payload. + * + * \return None. + */ +/*************************************************************************************************/ +static void PalCryptPdu(palCryptoCipherBlk_t *pAx, uint8_t *pMic, uint8_t *pBuf, uint16_t pldLen) +{ + /* X_1 := ECB(K, A_0) */ + palCryptoEcb.w.clear[0] = pAx->w[0]; + palCryptoEcb.w.clear[1] = pAx->w[1]; + palCryptoEcb.w.clear[2] = pAx->w[2]; + palCryptoEcb.w.clear[3] = pAx->w[3]; + palCryptoExecuteAesEcb(); + pMic[0] ^= palCryptoEcb.b.cipher[0]; /* MIC */ + pMic[1] ^= palCryptoEcb.b.cipher[1]; + pMic[2] ^= palCryptoEcb.b.cipher[2]; + pMic[3] ^= palCryptoEcb.b.cipher[3]; + + uint16_t actLen = 0; + + /* Preload static Ax values. */ + palCryptoEcb.w.clear[0] = pAx->w[0]; + palCryptoEcb.w.clear[1] = pAx->w[1]; + palCryptoEcb.w.clear[2] = pAx->w[2]; + palCryptoEcb.w.clear[3] = pAx->w[3]; + + for (unsigned int offs = 0; offs < pldLen; offs += 16) + { + /* X_i := ECB(K, X_i XOR A_i, for i=1..n */ + palCryptoEcb.b.clear[15]++; + palCryptoExecuteAesEcb(); + + for (unsigned int i = 0; i < sizeof(palCryptoEcb.b.cipher); i++) + { + pBuf[actLen++] ^= palCryptoEcb.b.cipher[i]; + + if (actLen == pldLen) + { + break; + } + } + } +} + +/*************************************************************************************************/ +/*! + * \brief Authenticate PDU. + * + * \param type Encryption type. + * \param pBx Bx cipher block template. + * \param pMic Storage for computed MIC. + * \param pHdr Header buffer. + * \param pBuf Inplace cleartext/ciphertext buffer. + * \param pldLen Length of payload. + * + * \return None. + */ +/*************************************************************************************************/ +static void palCryptoAuthPdu(uint8_t type, palCryptoCipherBlk_t *pBx, uint8_t *pMic, uint8_t *pHdr, uint8_t *pBuf, uint16_t pldLen) +{ + const uint8_t IGNORE_BITS_ACL = 0x1C; /* NESN, SN and MD */ + const uint8_t IGNORE_BITS_CIS = 0x5C; /* NESN, SN, NPI and CIE */ + const uint8_t IGNORE_BITS_BIS = 0x3C; /* CSSN and CSTF */ + + uint8_t ignoreBits; + + switch (type) + { + case PAL_BB_TYPE_ACL: + ignoreBits = IGNORE_BITS_ACL; + break; + case PAL_BB_TYPE_CIS: + ignoreBits = IGNORE_BITS_CIS; + break; + default: /* PAL_BB_TYPE_BIS */ + ignoreBits = IGNORE_BITS_BIS; + break; + } + + /* X_1 := ECB(K, B_0) */ + palCryptoEcb.w.clear[0] = pBx->w[0]; + palCryptoEcb.w.clear[1] = pBx->w[1]; + palCryptoEcb.w.clear[2] = pBx->w[2]; + palCryptoEcb.w.clear[3] = pBx->w[3]; + palCryptoEcb.b.clear[0] = 0x49; /* Flags */ + palCryptoEcb.b.clear[15] = pldLen; /* Length[LSO] */ + palCryptoExecuteAesEcb(); + + /* X_2 := ECB(K, X_1 XOR B_1) */ + palCryptoEcb.b.clear[0] = 0x00; /* AAD_Length[MSO] */ + palCryptoEcb.b.clear[1] = 0x01; /* AAD_Length[LSO] */ + palCryptoEcb.b.clear[2] = pHdr[0] & ~ignoreBits; /* AAD */ + palCryptoEcb.b.clear[3] = 0x00; + palCryptoEcb.w.clear[0] ^= palCryptoEcb.w.cipher[0]; + palCryptoEcb.w.clear[1] = palCryptoEcb.w.cipher[1]; + palCryptoEcb.w.clear[2] = palCryptoEcb.w.cipher[2]; + palCryptoEcb.w.clear[3] = palCryptoEcb.w.cipher[3]; + palCryptoExecuteAesEcb(); + + for (unsigned int offset = 0; offset < pldLen; offset += 16) + { + size_t len = (pldLen < (offset + 16)) ? (pldLen - offset) : 16; + + /* X_i := ECB(K, X_(i-1) XOR B_(i-1) for i=3..n */ + palCryptoEcb.w.clear[0] = 0; + palCryptoEcb.w.clear[1] = 0; + palCryptoEcb.w.clear[2] = 0; + palCryptoEcb.w.clear[3] = 0; + memcpy(palCryptoEcb.b.clear, pBuf + offset, len); + palCryptoEcb.w.clear[0] ^= palCryptoEcb.w.cipher[0]; + palCryptoEcb.w.clear[1] ^= palCryptoEcb.w.cipher[1]; + palCryptoEcb.w.clear[2] ^= palCryptoEcb.w.cipher[2]; + palCryptoEcb.w.clear[3] ^= palCryptoEcb.w.cipher[3]; + palCryptoExecuteAesEcb(); + } + + /* Store MIC. */ + pMic[0] = palCryptoEcb.b.cipher[0]; + pMic[1] = palCryptoEcb.b.cipher[1]; + pMic[2] = palCryptoEcb.b.cipher[2]; + pMic[3] = palCryptoEcb.b.cipher[3]; +} + +/*************************************************************************************************/ +/*! + * \brief Increment cipher block packet counter. + * + * \param pCb Cipher block. + * + * \return None. + */ +/*************************************************************************************************/ +static inline void palCryptoIncPktCnt(palCryptoCipherBlk_t *pCb) +{ + /* Unpack packetCounter. */ + uint64_t pktCnt = + ((uint64_t)pCb->f.pctr[0] << 0) + + ((uint64_t)pCb->f.pctr[1] << 8) + + ((uint64_t)pCb->f.pctr[2] << 16) + + ((uint64_t)pCb->f.pctr[3] << 24) + + ((uint64_t)(pCb->f.pctr[4] & 0x7F) << 32); + + /* Increment packetCounter. */ + pktCnt++; + + /* Pack packetCounter. */ + pCb->f.pctr[0] = pktCnt >> 0; + pCb->f.pctr[1] = pktCnt >> 8; + pCb->f.pctr[2] = pktCnt >> 16; + pCb->f.pctr[3] = pktCnt >> 24; + + /* Preserve directionBit. */ + pCb->f.pctr[4] = (pCb->f.pctr[4] & 0x80) | ((pktCnt >> 32) & 0x7F); +} + +/*************************************************************************************************/ +/*! + * \brief Load event counter. + * + * \param pCb Cipher block. + * \param evtCnt Connection event counter. + * + * \return None. + */ +/*************************************************************************************************/ +static inline void palCryptoLoadPktCnt(palCryptoCipherBlk_t *pCb, uint16_t evtCnt) +{ + /* Pack connEventCounter. */ + pCb->f.pctr[0] = evtCnt >> 0; + pCb->f.pctr[1] = evtCnt >> 8; + pCb->f.pctr[2] = 0; + pCb->f.pctr[3] = 0; + + /* Preserve directionBit. */ + pCb->f.pctr[4] &= 0x80; +} + +/*************************************************************************************************/ +/*! + * \brief Load event counter. + * + * \param pCb Cipher block. + * \param evtCnt Connection event counter. + * + * \return None. + */ +/*************************************************************************************************/ +static inline void palCryptoLoadCisPktCnt(palCryptoCipherBlk_t *pCb, uint64_t pktCnt) +{ + /* Pack connEventCounter. */ + pCb->f.pctr[0] = pktCnt >> 0; + pCb->f.pctr[1] = pktCnt >> 8; + pCb->f.pctr[2] = pktCnt >> 16; + pCb->f.pctr[3] = pktCnt >> 32; + /* Preserve directionBit. */ + pCb->f.pctr[4] = (pCb->f.pctr[4] & 0x80) | ((pktCnt >> 32) & 0x7F); +} + +/*************************************************************************************************/ +/*! + * \fn PalCryptoAesEcb + * + * \brief Calculate AES CBC. + * + * \param pKey Encryption key. + * \param pOut Output data. + * \param pIn Input data. + * + * \return None. + * + * \note Packet length is 16 bytes. + */ +/*************************************************************************************************/ +void PalCryptoAesEcb(const uint8_t *pKey, uint8_t *pOut, const uint8_t *pIn) +{ + nrf_ecb_init(); + + uint32_t alignKey[4]; + memcpy(alignKey, pKey, sizeof(alignKey)); + + uint32_t revKey[4]; + revKey[0] = __REV(alignKey[3]); + revKey[1] = __REV(alignKey[2]); + revKey[2] = __REV(alignKey[1]); + revKey[3] = __REV(alignKey[0]); + + nrf_ecb_set_key((uint8_t *)revKey); + + uint32_t alignIn[4]; + memcpy(alignIn, pIn, sizeof(alignIn)); + + uint32_t revIn[4]; + revIn[0] = __REV(alignIn[3]); + revIn[1] = __REV(alignIn[2]); + revIn[2] = __REV(alignIn[1]); + revIn[3] = __REV(alignIn[0]); + + uint32_t alignOut[4]; + while (nrf_ecb_crypt((uint8_t *)alignOut, (uint8_t *)revIn) != TRUE); + + uint32_t revOut[4]; + revOut[0] = __REV(alignOut[3]); + revOut[1] = __REV(alignOut[2]); + revOut[2] = __REV(alignOut[1]); + revOut[3] = __REV(alignOut[0]); + + memcpy(pOut, revOut, sizeof(revOut)); +} + +/*************************************************************************************************/ +/*! + * \brief Generate cryptographic grade random number. + * + * \param pBuf Buffer to store random number. + * \param len Number of bytes. + * + * \return None. + */ +/*************************************************************************************************/ +void PalCryptoGenerateRandomNumber(uint8_t *pBuf, uint8_t len) +{ + NRF_RNG->TASKS_START = 1; + + while (len--) + { + NRF_RNG->EVENTS_VALRDY = 0; + while (NRF_RNG->EVENTS_VALRDY == 0); + + *pBuf++ = NRF_RNG->VALUE; + } + + NRF_RNG->TASKS_STOP = 1; +} + +/*************************************************************************************************/ +/*! + * \brief Execute AES CBC transformation on payload and add 4 byte MIC. + * + * \param pEnc Encryption parameters. + * \param id Context ID. + * \param localDir Direction bit of local device (0=slave, 1=master). + * + * \return None. + * + * This routine completes the transformation in a blocking manner. + * + * \note Leave this implementation empty if inline hardware encryption is available. + */ +/*************************************************************************************************/ +void PalCryptoAesSetupCipherBlock(PalCryptoEnc_t *pEnc, uint8_t id, uint8_t localDir) +{ + unsigned int mode; + + /* Clear */ + memset(&palCryptoCipherBlkTbl[id], 0, sizeof(palCryptoCipherBlkTbl[id])); + + /* Loop through Tx/encrypt and Rx/decrypt cipher blocks. */ + for (mode = 0; mode < PAL_CRYPTO_MODE_TOTAL; mode++) + { + /* Compute A0 and B0 */ + uint8_t *pBlk = palCryptoCipherBlkTbl[id][mode].b; + pBlk[0] = 0x01; /* Flags: initialize Ax */ + /* pBlk[1..5] = { 0 }; */ /* Nonce::packetCounter clear to 0 */ + + if (pEnc->type == PAL_BB_TYPE_ACL || pEnc->type == PAL_BB_TYPE_CIS) + { + pBlk[5] = (mode == PAL_CRYPTO_MODE_ENC) ? (localDir << 7) : (!localDir << 7); /* Nonce::directionBit */ + } + else /* PAL_BB_TYPE_BIS */ + { + pBlk[5] = (localDir << 7); /* Nonce::directionBit */ + } + + memcpy(&pBlk[6], pEnc->iv, PAL_CRYPTO_LL_IV_LEN); /* Nonce::IV */ + /* pBlk[14] = 0x00; */ /* Length[MSO]: always 0 */ + /* pBlk[15] = 0x00; */ /* Length[LSO]: set on use */ + } + + /* Store context. */ + pEnc->pEncryptCtx = &palCryptoCipherBlkTbl[id][PAL_CRYPTO_MODE_ENC]; + pEnc->pDecryptCtx = &palCryptoCipherBlkTbl[id][PAL_CRYPTO_MODE_DEC]; + +#if (BB_ENABLE_INLINE_ENC_TX || BB_ENABLE_INLINE_DEC_RX) + PalBbBleInlineEncryptDecryptSetDirection(localDir); +#endif +} + +/*************************************************************************************************/ +/*! + * \brief Execute AES CBC transformation on payload and add 4 byte MIC. + * + * \param pEnc Encryption parameters. + * \param pHdr Packet header. + * \param pBuf Packet data. + * \param pMic Storage for MIC. + * + * \return TRUE if the MIC was set. + * + * This routine completes the transformation in a blocking manner. This routine modifies the + * length field of the PDU to account for the MIC. + * + * \note Leave this implementation empty if inline hardware encryption is available. + */ +/*************************************************************************************************/ +bool_t PalCryptoAesCcmEncrypt(PalCryptoEnc_t *pEnc, uint8_t *pHdr, uint8_t *pBuf, uint8_t *pMic) +{ + PAL_CRYPTO_PARAM_CHECK_RET(pEnc && pBuf, FALSE); + + if (!pEnc->enaEncrypt) + { + return FALSE; + } + + PAL_CRYPTO_PARAM_CHECK_RET(pEnc->pEncryptCtx, FALSE); /* Cipher blocks must be initialized */ + palCryptoCipherBlk_t *pCb = pEnc->pEncryptCtx; + + PAL_CRYPTO_PARAM_CHECK_RET(pHdr[BB_DATA_PDU_LEN_OFFSET] != 0, FALSE); /* Zero length LE-C or LE-U is not possible */ + + const uint16_t pldLen = pHdr[BB_DATA_PDU_LEN_OFFSET]; + + if (pEnc->enaAuth) + { + pHdr[BB_DATA_PDU_LEN_OFFSET] += PAL_CRYPTO_LL_DATA_MIC_LEN; /* Add length of MIC to payload. */ + } + + if ((pEnc->nonceMode == PAL_BB_NONCE_MODE_EVT_CNTR) && + (pEnc->pEventCounter)) + { + palCryptoLoadPktCnt(pCb, *pEnc->pEventCounter + 1); + } + + if ((pEnc->nonceMode == PAL_BB_NONCE_MODE_CIS_CNTR) && + (pEnc->pCisTxPktCounter)) + { + palCryptoLoadCisPktCnt(pCb, *pEnc->pCisTxPktCounter); + } + + palCryptoLoadEcbData(pEnc); + + if (pEnc->enaAuth) + { + palCryptoAuthPdu(pEnc->type, pCb, pMic, pHdr, pBuf, pldLen); + } + + PalCryptPdu(pCb, pMic, pBuf, pldLen); + + if (pEnc->nonceMode == PAL_BB_NONCE_MODE_PKT_CNTR) + { + palCryptoIncPktCnt(pCb); + } + + return pEnc->enaAuth; +} + +/*************************************************************************************************/ +/*! + * \brief Execute AES CBC transformation on payload and return MIC evaluation status. + * + * \param pEnc Encryption parameters. + * \param pBuf Packet data. + * + * \return TRUE if authentication successful, FALSE otherwise. + * + * This routine completes the transformation in a blocking manner. This routine modifies the + * length field of the PDU to account for the MIC. + * + * \note Leave this implementation empty if inline hardware encryption is available. + */ +/*************************************************************************************************/ +bool_t PalCryptoAesCcmDecrypt(PalCryptoEnc_t *pEnc, uint8_t *pBuf) +{ + PAL_CRYPTO_PARAM_CHECK_RET(pEnc && pBuf, FALSE); + + if (!pEnc->enaDecrypt) + { + /* Always successful if not enabled. */ + return TRUE; + } + + PAL_CRYPTO_PARAM_CHECK_RET(pEnc->pDecryptCtx, FALSE); /* Cipher blocks must be initialized */ + palCryptoCipherBlk_t *pCb = pEnc->pDecryptCtx; + + uint8_t actMic[PAL_CRYPTO_LL_DATA_MIC_LEN] = { 0 }; + uint8_t *pHdr = pBuf; + uint16_t pldLen = pHdr[BB_DATA_PDU_LEN_OFFSET]; + pBuf += BB_DATA_PDU_HDR_LEN; + + if (pEnc->enaAuth) + { + if (pldLen <= PAL_CRYPTO_LL_DATA_MIC_LEN) + { + /* No decryption required with no payload. */ + return TRUE; + } + + pldLen -= PAL_CRYPTO_LL_DATA_MIC_LEN; + pHdr[BB_DATA_PDU_LEN_OFFSET] = pldLen; /* Remove length of MIC from payload. */ + } + + uint8_t *pMic = pBuf + pldLen; + if ((pEnc->nonceMode == PAL_BB_NONCE_MODE_EVT_CNTR) && + (pEnc->pEventCounter)) + { + /* Synchronized event counter stored in packet headroom. */ + uint16_t eventCounter; + uint8_t *pEvtCntr = pHdr - sizeof(eventCounter); + BYTES_TO_UINT16(eventCounter, pEvtCntr); + + palCryptoLoadPktCnt(pCb, eventCounter); + } + + if ((pEnc->nonceMode == PAL_BB_NONCE_MODE_CIS_CNTR) && + (pEnc->pCisRxPktCounter)) + { + palCryptoLoadCisPktCnt(pCb, *pEnc->pCisRxPktCounter - 1); /* Rx counter is already incremented when packet is received in the LCTR layer. Need to decrement one here. */ + } + + palCryptoLoadEcbData(pEnc); + PalCryptPdu(pCb, pMic, pBuf, pldLen); + + if (pEnc->enaAuth) + { + palCryptoAuthPdu(pEnc->type, pCb, actMic, pHdr, pBuf, pldLen); + } + + if (pEnc->nonceMode == PAL_BB_NONCE_MODE_PKT_CNTR) + { + palCryptoIncPktCnt(pCb); + } + + /* Verify MIC. */ + if (pEnc->enaAuth) + { + if ((actMic[0] != pMic[0]) || + (actMic[1] != pMic[1]) || + (actMic[2] != pMic[2]) || + (actMic[3] != pMic[3])) + { + return FALSE; + } + } + + return TRUE; +} + +#if defined(NRF52840_XXAA) && MBED_CONF_CORDIO_LL_NRF52840_CRYPTOCELL310_ACCELERATION +/*************************************************************************************************/ +/*! + * \brief Execute the CCM-Mode encryption algorithm. + * + * \param pKey Pointer to encryption key (SEC_CCM_KEY_LEN bytes). + * \param pNonce Pointer to nonce (SEC_CCM_NONCE_LEN bytes). + * \param pPlainText Pointer to text to encrypt. + * \param textLen Length of pPlainText in bytes. + * \param pClear Pointer to additional, unencrypted authentication text. + * \param clearLen Length of pClear in bytes. + * \param micLen Size of MIC in bytes (4, 8 or 16). + * \param pResult Buffer to hold result (returned in complete event). + * \param handlerId Task handler ID to receive complete event. + * \param param Optional parameter passed in complete event. + * \param event Event ID of complete event. + + * \return None. + */ +/*************************************************************************************************/ +void PalCryptoCcmEnc(const uint8_t *pKey, uint8_t *pNonce, uint8_t *pPlainText, uint16_t textLen, + uint8_t *pClear, uint16_t clearLen, uint8_t micLen, uint8_t *pResult, + uint8_t handlerId, uint16_t param, uint8_t event) +{ + PAL_CRYPTO_PARAM_CHECK(clearLen < SEC_CCM_MAX_ADDITIONAL_LEN); + + CRYS_AESCCM_Key_t key; + + /* Copy key */ + memcpy(key, pKey, SEC_CCM_KEY_LEN); + + /* Perform encryption with cryptocell */ + CRYS_AESCCM(SASI_AES_ENCRYPT, key, CRYS_AES_Key128BitSize, pNonce, SEC_CCM_NONCE_LEN, + pClear, clearLen, pPlainText, textLen, pResult + clearLen, micLen, + pResult + clearLen + textLen); +} + +/*************************************************************************************************/ +/*! + * \brief Execute the CCM-Mode verify and decrypt algorithm. + * + * \param pKey Pointer to encryption key (SEC_CCM_KEY_LEN bytes). + * \param pNonce Pointer to nonce (SEC_CCM_NONCE_LEN bytes). + * \param pCypherText Pointer to text to decrypt. + * \param textLen Length of pCypherText in bytes. + * \param pClear Pointer to additional, unencrypted authentication text. + * \param clearLen Length of pClear in bytes. + * \param pMic Pointer to authentication digest. + * \param micLen Size of MIC in bytes (4, 8 or 16). + * \param pResult Buffer to hold result (returned in complete event). + * \param handlerId Task handler ID to receive complete event. + * \param param Optional parameter passed in complete event. + * \param event Event ID of complete event. + * + * \return Error code. + */ +/*************************************************************************************************/ +uint32_t PalCryptoCcmDec(const uint8_t *pKey, uint8_t *pNonce, uint8_t *pCypherText, uint16_t textLen, + uint8_t *pClear, uint16_t clearLen, uint8_t *pMic, uint8_t micLen, + uint8_t *pResult, uint8_t handlerId, uint16_t param, uint8_t event) +{ + PAL_CRYPTO_PARAM_CHECK_RET(clearLen < SEC_CCM_MAX_ADDITIONAL_LEN, 1); + + CRYS_AESCCM_Key_t key; + + /* Copy key */ + memcpy(key, pKey, SEC_CCM_KEY_LEN); + + /* Perform decryption with cryptocell */ + uint32_t err = CRYS_AESCCM(SASI_AES_DECRYPT, key, CRYS_AES_Key128BitSize, + pNonce, SEC_CCM_NONCE_LEN, + pClear, clearLen, + pCypherText, textLen, + pResult, + micLen, pMic); + + return err; +} + +/*************************************************************************************************/ +/*! + * \brief Called to initialize CCM-Mode security. + * + * \return None. + */ +/*************************************************************************************************/ +void PalCryptoInit(void) +{ + NVIC_EnableIRQ(CRYPTOCELL_IRQn); + NRF_CRYPTOCELL->ENABLE = 1; + SaSi_LibInit(); +} + +/*************************************************************************************************/ +/*! + * \brief Called to De-initialize CCM-Mode security. + * + * \return None. + */ +/*************************************************************************************************/ +void PalCryptoDeInit(void) +{ + NRF_CRYPTOCELL->ENABLE = 1; + SaSi_LibFini(); + NRF_CRYPTOCELL->ENABLE = 0; +} + +#endif + +/*************************************************************************************************/ +/*! + * \brief Set the encrypt nonce packet counter field. + * + * \param pEnc Encryption parameters. + * \param pktCnt Counter value. + * + * \return None. + */ +/*************************************************************************************************/ +#if (BB_ENABLE_INLINE_ENC_TX) +void PalCryptoSetEncryptPacketCount(PalCryptoEnc_t *pEnc, uint64_t pktCnt) +{ + PalBbBleInlineEncryptSetPacketCount(pktCnt); +} +#endif + +/*************************************************************************************************/ +/*! + * \brief Set the decrypt nonce packet counter field. + * + * \param pEnc Encryption parameters. + * \param pktCnt Counter value. + * + * \return None. + */ +/*************************************************************************************************/ +#if (BB_ENABLE_INLINE_DEC_RX) +void PalCryptoSetDecryptPacketCount(PalCryptoEnc_t *pEnc, uint64_t pktCnt) +{ + /* TODO */ +} +#endif diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_led.c b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_led.c new file mode 100644 index 0000000000..450c342913 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_led.c @@ -0,0 +1,279 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief LED driver implementation. + * + * Copyright (c) 2018-2019 Arm Ltd. All Rights Reserved. + * Arm Ltd. confidential and proprietary. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*************************************************************************************************/ + +#include "pal_led.h" +#include "boards.h" +#include "pal_types.h" + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +#define PAL_LED0_MASK 0x00002000 +#define PAL_LED1_MASK 0x00004000 +#define PAL_LED2_MASK 0x00008000 +#define PAL_LED3_MASK 0x00010000 + +/*! \brief LED masks. */ +#if (AUDIO_CAPE == 1) + +#define PAL_LED_AUDIO_LED1_MASK 0x00000002 +#define PAL_LED_AUDIO_LED2_MASK 0x00000004 +#define PAL_LED_AUDIO_LED3_MASK 0x00000008 +#define PAL_LED_AUDIO_LED4_MASK 0x00000010 +#define PAL_LED_AUDIO_LED5_MASK 0x00000020 +#define PAL_LED_AUDIO_LED6_MASK 0x00000040 + +#define PAL_LED_P0_MASK 0x01E000 +#define PAL_LED_P1_MASK 0x00007E + +#else +#define PAL_LED_P0_MASK 0x01E000 +#define PAL_LED_P1_MASK 0x000000 + +#endif + +/*! \brief Invalid LED mask. */ +#define PAL_LED_INVALID_MASK 0xFF + +/*! \brief LED count using GPIO P0. */ +#define PAL_LED_COUNT_P0 0x04 + +/*! \brief I/O Expander definitions */ +enum +{ + PAL_LED_IO_EXP_SUB_ADDR = 0x06 /*!< Lower 3 bit of I/O expander address connected with LEDs. */ +}; + +/*! \brief I/O Expander accessories */ +enum +{ + PAL_LED_IO_EXP_CONFIG = 0x00 /*!< LED3 to LED10 are defined as outputs.*/ +}; + +#ifdef DEBUG + +/*! \brief Parameter check. */ +#define PAL_LED_PARAM_CHECK(expr) { if (!(expr)) { return; } } + +/*! \brief Parameter check, with return value. */ +#define PAL_LED_PARAM_CHECK_RET(expr, rv) { if (!(expr)) { return (rv); } } + +#else + +/*! \brief Parameter check (disabled). */ +#define PAL_LED_PARAM_CHECK(expr) + +/*! \brief Parameter check, with return value (disabled). */ +#define PAL_LED_PARAM_CHECK_RET(expr, rv) + +#endif + +/************************************************************************************************** + Functions: Initialization +**************************************************************************************************/ + +/*************************************************************************************************/ +/*! + * \brief Get LED pin number from LED ID. + * + * \param ledId LED ID. + * + * \return LED pin mask. + */ +/*************************************************************************************************/ +static uint32_t palLedGetPinMask(uint8_t ledId) +{ + uint32_t ledMask = PAL_LED_INVALID_MASK; + + switch (ledId) + { + case PAL_LED_ID_CPU_ACTIVE: + ledMask = PAL_LED1_MASK; + break; + + case PAL_LED_ID_ERROR: + ledMask = PAL_LED3_MASK; + break; + + case 0: + ledMask = PAL_LED0_MASK; + break; + case 1: + ledMask = PAL_LED1_MASK; + break; + case 2: + ledMask = PAL_LED2_MASK; + break; + case 3: + ledMask = PAL_LED3_MASK; + break; + +#if (AUDIO_CAPE == 1) + case 4: + ledMask = PAL_LED_AUDIO_LED1_MASK; + break; + case 5: + ledMask = PAL_LED_AUDIO_LED2_MASK; + break; + case 6: + ledMask = PAL_LED_AUDIO_LED3_MASK; + break; + case 7: + ledMask = PAL_LED_AUDIO_LED4_MASK; + break; + case 8: + ledMask = PAL_LED_AUDIO_LED5_MASK; + break; + case 9: + ledMask = PAL_LED_AUDIO_LED6_MASK; + break; +#endif + + default: + ledMask = PAL_LED_INVALID_MASK; + break; + } + + return ledMask; +} + +/*************************************************************************************************/ +/*! + * \brief Initialize LEDs. + * + * \return None. + */ +/*************************************************************************************************/ +void PalLedInit(void) +{ + nrf_gpio_port_dir_output_set(NRF_P0, PAL_LED_P0_MASK); + nrf_gpio_port_out_set(NRF_P0, PAL_LED_P0_MASK); +#if (GPIO_COUNT > 1) + nrf_gpio_port_dir_output_set(NRF_P1, PAL_LED_P1_MASK); + nrf_gpio_port_out_set(NRF_P1, PAL_LED_P1_MASK); +#endif +} + +/*************************************************************************************************/ +/*! + * \brief De-initialize LEDs. + * + * \return None. + */ +/*************************************************************************************************/ +void PalLedDeInit(void) +{ + nrf_gpio_port_dir_input_set(NRF_P0, PAL_LED_P0_MASK); +#if (GPIO_COUNT > 1) + nrf_gpio_port_dir_input_set(NRF_P1, PAL_LED_P1_MASK); +#endif +} + +/*************************************************************************************************/ +/*! + * \brief Set multiple LEDs on. + * + * \param mask LED mask. + * + * \return None. + * + */ +/*************************************************************************************************/ +void PalLedOnGroup(uint32_t mask) +{ + PAL_LED_PARAM_CHECK(mask); + + nrf_gpio_port_out_clear(NRF_P0, mask); +} + +/*************************************************************************************************/ +/*! + * \brief Set multiple LEDs off. + * + * \param mask LED mask. + * + * \return None. + * + */ +/*************************************************************************************************/ +void PalLedOffGroup(uint32_t mask) +{ + PAL_LED_PARAM_CHECK(mask); + + nrf_gpio_port_out_set(NRF_P0, mask); +} + +/*************************************************************************************************/ +/*! + * \brief Set LED on. + * + * \param ledId LED ID. + * + * \return None. + * + */ +/*************************************************************************************************/ +void PalLedOn(uint8_t ledId) +{ + uint32_t ledMask = palLedGetPinMask(ledId); + PAL_LED_PARAM_CHECK(ledMask != PAL_LED_INVALID_MASK); + + if ((ledId < PAL_LED_COUNT_P0) || (ledId >= PAL_LED_ID_CPU_ACTIVE)) + { + nrf_gpio_port_out_clear(NRF_P0, ledMask); + } +#if (GPIO_COUNT > 1) + else + { + nrf_gpio_port_out_clear(NRF_P1, ledMask); + } +#endif +} + +/*************************************************************************************************/ +/*! + * \brief Set LED off. + * + * \param ledId LED ID. + * + * \return None. + * + */ +/*************************************************************************************************/ +void PalLedOff(uint8_t ledId) +{ + uint32_t ledMask = palLedGetPinMask(ledId); + PAL_LED_PARAM_CHECK(ledMask != PAL_LED_INVALID_MASK); + + if ((ledId < PAL_LED_COUNT_P0) || (ledId >= PAL_LED_ID_CPU_ACTIVE)) + { + nrf_gpio_port_out_set(NRF_P0, ledMask); + } +#if (GPIO_COUNT > 1) + else + { + nrf_gpio_port_out_set(NRF_P1, ledMask); + } +#endif +} diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_nvm.c b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_nvm.c new file mode 100644 index 0000000000..1bbc8ad9e1 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_nvm.c @@ -0,0 +1,357 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief PAL NVM driver. + * + * Copyright (c) 2018-2019 Arm Ltd. All Rights Reserved. + * Arm Ltd. confidential and proprietary. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*************************************************************************************************/ + +#include +#include "pal_nvm.h" +#include "sdk_config.h" +#if defined(NRF52840_XXAA) +#include "nrfx_qspi.h" +#include "boards.h" +#endif + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +/*! NVM block size. */ +#define PAL_NVM_SECTOR64K_SIZE 0x10000 + +/*! NVM internal cache buffer size. Note: should be at least 2. */ +#define PAL_NVM_CACHE_BUF_SIZE 11 + +/*! Aligns a value to word size. */ +#define PAL_NVM_WORD_ALIGN(value) (((value) + (PAL_NVM_WORD_SIZE - 1)) & \ + ~(PAL_NVM_WORD_SIZE - 1)) +/*! Validates if a value is aligned to word. */ +#define PAL_NVM_IS_WORD_ALIGNED(value) (((uint32_t)(value) & \ + (PAL_NVM_WORD_SIZE - 1)) == 0) + +/*! QSPI flash commands. */ +#define QSPI_STD_CMD_WRSR 0x01 +#define QSPI_STD_CMD_RSTEN 0x66 +#define QSPI_STD_CMD_RST 0x99 + +#ifdef DEBUG + +/*! \brief Parameter check. */ +#define PAL_NVM_PARAM_CHECK(expr) { \ + if (!(expr)) \ + { \ + palNvmCb.state = PAL_NVM_STATE_ERROR; \ + return; \ + } \ + } + +#else + +/*! \brief Parameter check (disabled). */ +#define PAL_NVM_PARAM_CHECK(expr) + +#endif + +/************************************************************************************************** + Local Variables +**************************************************************************************************/ + +/*! NVM cache buffer. */ +static uint32_t palNvmCacheBuf[PAL_NVM_CACHE_BUF_SIZE]; + +/*! \brief Control block. */ +struct +{ + PalNvmState_t state; /*!< State. */ + uint32_t writeAddr; /*!< Write address. */ +} palNvmCb; + +/************************************************************************************************** + Global Functions +**************************************************************************************************/ + +/*************************************************************************************************/ +/*! + * \brief Initialize the platform NVM. + * + * \param[in] actCback Callback function. + * + * \return None. + */ +/*************************************************************************************************/ +void PalNvmInit(PalNvmCback_t actCback) +{ +#if defined(NRF52840_XXAA) + + uint32_t status; + uint8_t temp = 0x40; + + nrfx_qspi_config_t config = + { \ + .xip_offset = NRFX_QSPI_CONFIG_XIP_OFFSET, \ + .pins = { \ + .sck_pin = BSP_QSPI_SCK_PIN, \ + .csn_pin = BSP_QSPI_CSN_PIN, \ + .io0_pin = BSP_QSPI_IO0_PIN, \ + .io1_pin = BSP_QSPI_IO1_PIN, \ + .io2_pin = BSP_QSPI_IO2_PIN, \ + .io3_pin = BSP_QSPI_IO3_PIN, \ + }, \ + .irq_priority = (uint8_t)NRFX_QSPI_CONFIG_IRQ_PRIORITY, \ + .prot_if = { \ + .readoc = (nrf_qspi_readoc_t)NRFX_QSPI_CONFIG_READOC, \ + .writeoc = (nrf_qspi_writeoc_t)NRFX_QSPI_CONFIG_WRITEOC, \ + .addrmode = (nrf_qspi_addrmode_t)NRFX_QSPI_CONFIG_ADDRMODE, \ + .dpmconfig = false, \ + }, \ + .phy_if = { \ + .sck_freq = (nrf_qspi_frequency_t)NRFX_QSPI_CONFIG_FREQUENCY, \ + .sck_delay = (uint8_t)NRFX_QSPI_CONFIG_SCK_DELAY, \ + .spi_mode = (nrf_qspi_spi_mode_t)NRFX_QSPI_CONFIG_MODE, \ + .dpmen = false \ + }, \ + } + ; + + /* Verify palNvmCacheBuf size is at least 2. */ + PAL_NVM_PARAM_CHECK(PAL_NVM_CACHE_BUF_SIZE >= 2); + + status = nrfx_qspi_init(&config, NULL, NULL); + + PAL_NVM_PARAM_CHECK(status == NRFX_SUCCESS); + + nrf_qspi_cinstr_conf_t cinstr_cfg = { + .opcode = QSPI_STD_CMD_RSTEN, + .length = NRF_QSPI_CINSTR_LEN_1B, + .io2_level = 1, + .io3_level = 1, + .wipwait = 1, + .wren = 1 + }; + + /* Send reset enable. */ + status = nrfx_qspi_cinstr_xfer(&cinstr_cfg, NULL, NULL); + + /* Send reset command */ + cinstr_cfg.opcode = QSPI_STD_CMD_RST; + + status = nrfx_qspi_cinstr_xfer(&cinstr_cfg, NULL, NULL); + + PAL_NVM_PARAM_CHECK(status == NRFX_SUCCESS); + + /* Switch to qspi mode */ + cinstr_cfg.opcode = QSPI_STD_CMD_WRSR; + cinstr_cfg.length = NRF_QSPI_CINSTR_LEN_2B; + + status = nrfx_qspi_cinstr_xfer(&cinstr_cfg, &temp, NULL); + + PAL_NVM_PARAM_CHECK(status == NRFX_SUCCESS); + + memset(&palNvmCb, 0, sizeof(palNvmCb)); + + palNvmCb.state = PAL_NVM_STATE_READY; + + (void)status; +#else + (void)palNvmCacheBuf; +#endif +} + +/*************************************************************************************************/ +/*! + * \brief De-initialize the platform NVM. + * + * \return None. + */ +/*************************************************************************************************/ +void PalNvmDeInit(void) +{ +#if defined(NRF52840_XXAA) + nrfx_qspi_uninit(); +#else +#endif +} + +/*************************************************************************************************/ +/*! + * \brief Reads data from NVM storage. + * + * \param[in] pBuf Pointer to memory buffer where data will be stored. + * \param[in] size Data size in bytes to be read. + * \param[in] srcAddr Word aligned address from where data is read. + * + * \return None. + */ +/*************************************************************************************************/ +void PalNvmRead(void *pBuf, uint32_t size, uint32_t srcAddr) +{ +#if defined(NRF52840_XXAA) + uint32_t readSize = PAL_NVM_WORD_ALIGN(size); + uint32_t actualSize = size; + uint32_t status; + uint16_t addrOffset = 0; + + PAL_NVM_PARAM_CHECK(palNvmCb.state == PAL_NVM_STATE_READY); + PAL_NVM_PARAM_CHECK(pBuf != NULL); + PAL_NVM_PARAM_CHECK(size != 0); + + do + { + if (readSize <= sizeof(palNvmCacheBuf)) + { + /* Read data. */ + status = nrfx_qspi_read(palNvmCacheBuf, readSize, srcAddr + addrOffset); + + PAL_NVM_PARAM_CHECK(status == NRFX_SUCCESS); + + memcpy((uint8_t*)pBuf + addrOffset, palNvmCacheBuf, actualSize); + + readSize = 0; + } + else + { + /* Read data. */ + status = nrfx_qspi_read(palNvmCacheBuf, sizeof(palNvmCacheBuf), srcAddr + addrOffset); + + PAL_NVM_PARAM_CHECK (status == NRFX_SUCCESS); + + memcpy((uint8_t*)pBuf + addrOffset, palNvmCacheBuf, sizeof(palNvmCacheBuf)); + + addrOffset += sizeof(palNvmCacheBuf); + readSize -= sizeof(palNvmCacheBuf); + actualSize -= sizeof(palNvmCacheBuf); + } + } while (readSize != 0); + (void)status; +#else + memset(pBuf, 0xFF, size); +#endif +} + +/*************************************************************************************************/ +/*! + * \brief Writes data to NVM storage. + * + * \param[in] pBuf Pointer to memory buffer from where data will be written. + * \param[in] size Data size in bytes to be written. + * \param[in] dstAddr Word aligned address to write data. + * + * \return None. + */ +/*************************************************************************************************/ +void PalNvmWrite(void *pBuf, uint32_t size, uint32_t dstAddr) +{ +#if defined(NRF52840_XXAA) + uint32_t writeSize = PAL_NVM_WORD_ALIGN(size); + uint32_t actualSize = size; + uint32_t status; + uint16_t addrOffset = 0; + + PAL_NVM_PARAM_CHECK(palNvmCb.state == PAL_NVM_STATE_READY); + PAL_NVM_PARAM_CHECK(pBuf != NULL); + PAL_NVM_PARAM_CHECK(size != 0); + + do + { + if (writeSize <= sizeof(palNvmCacheBuf)) + { + memcpy(palNvmCacheBuf, (uint8_t*)pBuf + addrOffset, actualSize); + memset((uint8_t*)palNvmCacheBuf + actualSize, 0xFF, sizeof(palNvmCacheBuf) - actualSize); + + /* Write data. */ + status = nrfx_qspi_write(palNvmCacheBuf, writeSize, dstAddr + addrOffset); + + PAL_NVM_PARAM_CHECK(status == NRFX_SUCCESS); + + writeSize = 0; + } + else + { + memcpy(palNvmCacheBuf, (uint8_t*)pBuf + addrOffset, sizeof(palNvmCacheBuf)); + + /* Write data. */ + status = nrfx_qspi_write(palNvmCacheBuf, sizeof(palNvmCacheBuf), dstAddr + addrOffset); + + PAL_NVM_PARAM_CHECK(status == NRFX_SUCCESS); + + addrOffset += sizeof(palNvmCacheBuf); + writeSize -= sizeof(palNvmCacheBuf); + actualSize -= sizeof(palNvmCacheBuf); + } + } while (writeSize != 0); + (void)status; +#else +#endif +} + +/*************************************************************************************************/ +/*! + * \brief Erase sector. + * + * \param[in] size Data size in bytes to be erased. + * \param[in] startAddr Word aligned address. + * + * \return None. + */ +/*************************************************************************************************/ +void PalNvmEraseSector(uint32_t size, uint32_t startAddr) +{ +#if defined(NRF52840_XXAA) + nrf_qspi_erase_len_t eSize = QSPI_ERASE_LEN_LEN_4KB; + + if (size > PAL_NVM_SECTOR_SIZE) + { + eSize = QSPI_ERASE_LEN_LEN_64KB; + } + + if (size > PAL_NVM_SECTOR64K_SIZE) + { + eSize = QSPI_ERASE_LEN_LEN_All; + } + + nrfx_qspi_erase(eSize, startAddr); +#endif +} + +/*************************************************************************************************/ +/*! + * \brief Erase chip. It is not recommended to use since it takes up to 240s. + * + * \return None. + */ +/*************************************************************************************************/ +void PalNvmEraseChip(void) +{ +#if defined(NRF52840_XXAA) + nrfx_qspi_chip_erase(); +#endif +} + +/*************************************************************************************************/ +/*! + * \brief Get NVM state. + * + * \return NVM state. + */ +/*************************************************************************************************/ +PalNvmState_t PalNvmGetState(void) +{ + return palNvmCb.state; +} diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_rtc.c b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_rtc.c new file mode 100644 index 0000000000..30427e9b2a --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_rtc.c @@ -0,0 +1,143 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief Tickless timer implementation. + * + * Copyright (c) 2013-2018 Arm Ltd. All Rights Reserved. + * Arm Ltd. confidential and proprietary. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*************************************************************************************************/ + +#include "nrf.h" +#include "pal_rtc.h" + +/*************************************************************************************************/ +/*! + * \brief Function for starting the RTC timer. + * + * \return None. + */ +/*************************************************************************************************/ +void PalRtcEnableCompareIrq(void) +{ + NRF_RTC0->EVENTS_COMPARE[0] = 0; + NRF_RTC0->INTENSET = RTC_INTENSET_COMPARE0_Msk; + NRF_RTC0->EVTENSET = RTC_EVTENSET_COMPARE0_Msk; +} + +/*************************************************************************************************/ +/*! + * \brief Function for stopping the RTC timer. + * + * \return None. + */ +/*************************************************************************************************/ +void PalRtcDisableCompareIrq(void) +{ + NRF_RTC0->INTENCLR = RTC_INTENCLR_COMPARE0_Msk; + NRF_RTC0->EVTENCLR = RTC_EVTENCLR_COMPARE0_Msk; +} + +/*************************************************************************************************/ +/*! + * \brief Get the current value of the RTC counter. + * + * \return Current value of the RTC counter. + */ +/*************************************************************************************************/ +uint32_t PalRtcCounterGet(void) +{ + NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; + NRF_CLOCK->TASKS_LFCLKSTART = 1; + while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) {} + NRF_RTC0->TASKS_STOP = 0; + + return NRF_RTC0->COUNTER; +} + +/*************************************************************************************************/ +/*! + * \brief Set the RTC capture compare value. + * + * \param value Set new value for compare value. + * + * \return None + */ +/*************************************************************************************************/ +void PalRtcCompareSet(uint32_t value) +{ + NRF_RTC0->CC[0] = value; +} + +/*************************************************************************************************/ +/*! + * \brief Get the current value of the RTC capture compare. + * + * \return Current value of the capture compare. + */ +/*************************************************************************************************/ +uint32_t PalRtcCompareGet(void) +{ + return NRF_RTC0->CC[0]; +} + +/*************************************************************************************************/ +/*! + * \brief RTC interrupt handler. + * + * \return None. + * + * This handler stores the RTC start time which is used as a reference to compute the receive + * packet timestamp using the HFCLK. + * + */ +/*************************************************************************************************/ +void RTC0_IRQHandler(void) +{ + if (NRF_RTC0->EVENTS_COMPARE[0]) + { + /* clear the interrupt */ + NRF_RTC0->EVENTS_COMPARE[0] = 0; + (void)NRF_RTC0->EVENTS_COMPARE[0]; /* wait for write buffer to empty */ + } +} + +/*************************************************************************************************/ +/*! + * \brief Tickless timer initialization routine. + * + * \return None. + */ +/*************************************************************************************************/ +void PalRtcInit(void) +{ + /* Stop RTC to prevent any running timers from expiring. */ + PalRtcDisableCompareIrq(); + + NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; + NRF_CLOCK->TASKS_LFCLKSTART = 1; + while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) {} + NRF_RTC0->TASKS_STOP = 0; + + NRF_RTC0->TASKS_STOP = 1; + NRF_RTC0->TASKS_CLEAR = 1; + NRF_RTC0->PRESCALER = 0; /* clear prescaler */ + NRF_RTC0->TASKS_START = 1; + + NVIC_SetPriority(RTC0_IRQn, 0x80); /* medium priority */ + NVIC_ClearPendingIRQ(RTC0_IRQn); + NVIC_EnableIRQ(RTC0_IRQn); +} diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_sys.c b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_sys.c new file mode 100644 index 0000000000..1f53dd3bb4 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_sys.c @@ -0,0 +1,276 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief System hooks. + * + * Copyright (c) 2013-2019 Arm Ltd. All Rights Reserved. + * Arm Ltd. confidential and proprietary. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*************************************************************************************************/ + +#include "nrf.h" +#include "pal_bb.h" +#include "pal_rtc.h" +#include "pal_sys.h" +#include "pal_led.h" +#include "platform/mbed_power_mgmt.h" + +#include + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +extern uint8_t *SystemHeapStart; +extern uint32_t SystemHeapSize; + +#if defined(__GNUC__) && !defined(__ARMCC_VERSION) + +/*! \brief Stack initial values. */ +#define INIT_STACK_VAL 0xAFAFAFAF + +extern unsigned long __stack_top__; +extern unsigned long __stack_limit__; + +#endif + +/************************************************************************************************** + Global Variables +**************************************************************************************************/ + +/*! \brief Number of assertions. */ +static uint32_t palSysAssertCount; + +/*! \brief Trap enabled flag. */ +static volatile bool_t PalSysAssertTrapEnable; + +static uint32_t palSysBusyCount; + +/************************************************************************************************** + Functions +**************************************************************************************************/ + +/*************************************************************************************************/ +/*! + * \brief Enter a critical section. + * + * \return None. + */ +/*************************************************************************************************/ +static inline void palEnterCs(void) +{ + #ifdef __IAR_SYSTEMS_ICC__ + __disable_interrupt(); + #endif + #if defined(__GNUC__) && !defined(__ARMCC_VERSION) + __asm volatile ("cpsid i"); + #endif + #if defined(__ARMCC_VERSION) + __disable_irq(); + #endif +} + +/*************************************************************************************************/ +/*! + * \brief Exit a critical section. + * + * \return None. + */ +/*************************************************************************************************/ +static inline void palExitCs(void) +{ + #ifdef __IAR_SYSTEMS_ICC__ + __enable_interrupt(); + #endif + #if defined(__GNUC__) && !defined(__ARMCC_VERSION) + __asm volatile ("cpsie i"); + #endif + #if defined(__ARMCC_VERSION) + __enable_irq(); + #endif +} + +/*************************************************************************************************/ +/*! + * \brief Common platform initialization. + * + * \return None. + */ +/*************************************************************************************************/ +void PalSysInit(void) +{ + /* enable Flash cache */ + NRF_NVMC->ICACHECNF |= (NVMC_ICACHECNF_CACHEEN_Enabled << NVMC_ICACHECNF_CACHEEN_Pos); + + /* switch to more accurate 16 MHz crystal oscillator (system starts up using 16MHz RC oscillator) */ + NRF_CLOCK->EVENTS_HFCLKSTARTED = 0; + NRF_CLOCK->TASKS_HFCLKSTART = 1; + while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) + { + } + + /* configure low-frequency clock */ + NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos); + NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; + NRF_CLOCK->TASKS_LFCLKSTART = 1; + while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) + { + } + NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; + + /* cycle radio peripheral power to guarantee known radio state */ + NRF_RADIO->POWER = 0; + NRF_RADIO->POWER = 1; + + palSysAssertCount = 0; + PalSysAssertTrapEnable = TRUE; + palSysBusyCount = 0; + + PalRtcInit(); + +#ifdef DEBUG + /* Reset free memory. */ + memset(SystemHeapStart, 0, SystemHeapSize); +#endif +} + +/*************************************************************************************************/ +/*! + * \brief System fault trap. + * + * \return None. + */ +/*************************************************************************************************/ +void PalSysAssertTrap(void) +{ + palSysAssertCount++; + + while (PalSysAssertTrapEnable); +} + +/*************************************************************************************************/ +/*! + * \brief Set system trap. + * + * \param enable Enable assert trap or not. + * + * \return None. + */ +/*************************************************************************************************/ +void PalSysSetTrap(bool_t enable) +{ + PalSysAssertTrapEnable = enable; +} + +/*************************************************************************************************/ +/*! + * \brief Get assert count. + * + * \return None. + */ +/*************************************************************************************************/ +uint32_t PalSysGetAssertCount(void) +{ + return palSysAssertCount; +} + +/*************************************************************************************************/ +/*! + * \brief Count stack usage. + * + * \return Number of bytes used by the stack. + */ +/*************************************************************************************************/ +uint32_t PalSysGetStackUsage(void) +{ +#if defined(__GNUC__) && !defined(__ARMCC_VERSION) + unsigned long *pUnused = &__stack_limit__; + + while (pUnused < &__stack_top__) + { + if (*pUnused != INIT_STACK_VAL) + { + break; + } + + pUnused++; + } + + return (uint32_t)(&__stack_top__ - pUnused) * sizeof(*pUnused); +#else + /* Not available; stub routine. */ + return 0; +#endif +} + +/*************************************************************************************************/ +/*! + * \brief System sleep. + * + * \return none. + */ +/*************************************************************************************************/ +void PalSysSleep(void) +{ + sleep(); +} + +/*************************************************************************************************/ +/*! + * \brief Check if system is busy. + * + * \return True if system is busy. + */ +/*************************************************************************************************/ +bool_t PalSysIsBusy(void) +{ + bool_t sysIsBusy = FALSE; + palEnterCs(); + sysIsBusy = ((palSysBusyCount == 0) ? FALSE : TRUE); + palExitCs(); + return sysIsBusy; +} + +/*************************************************************************************************/ +/*! + * \brief Set system busy. + * + * \return none. + */ +/*************************************************************************************************/ +void PalSysSetBusy(void) +{ + palEnterCs(); + palSysBusyCount++; + palExitCs(); +} + +/*************************************************************************************************/ +/*! + * \brief Set system idle. + * + * \return none. + */ +/*************************************************************************************************/ +void PalSysSetIdle(void) +{ + palEnterCs(); + if (palSysBusyCount) + { + palSysBusyCount--; + } + palExitCs(); +} diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_timer.c b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_timer.c new file mode 100644 index 0000000000..c00ae9c106 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_timer.c @@ -0,0 +1,250 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief Timer driver + * + * Copyright (c) 2013-2019 Arm Ltd. All Rights Reserved. + * Arm Ltd. confidential and proprietary. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*************************************************************************************************/ + +/* + * Notes: + * + * This is timer driver dedicated to scheduler, an interrupt will be triggered to do scheduler task + * when timer hits compare value. TIMER2 is used here. + * + * TIMER2's compare/capture registers are assigned specific uses: + * CC[0] - Compare value for timer expiry interrupt + * CC[1] - manual capture of current time + * + */ + +#include "nrf.h" +#include "pal_timer.h" +#include "nrf_gpio.h" + +/************************************************************************************************** + Macros +**************************************************************************************************/ +#ifdef DEBUG + +/*! \brief Parameter and state check. */ +#define PAL_TIMER_CHECK(expr) { if (!(expr)) { palTimerCb.state = PAL_TIMER_STATE_ERROR; while(1); } } + +#else + +/*! \brief Parameter and state check (disabled). */ +#define PAL_TIMER_CHECK(expr) + +#endif + +/* Scheduler timer resolution is fixed at 1us per tick. */ +#define PAL_TIMER_1MHZ_PRESCALER 4 + +#ifdef DEBUG +#define PAL_TIMER_DEBUG_0_PIN 35 /* P1.03 */ +#endif + +/************************************************************************************************** + Global Variables +**************************************************************************************************/ + +/*! \brief Scheduler timer driver control block. */ +static struct +{ + PalTimerState_t state; /*!< State. */ + uint32_t compareVal; /*!< Absolute compare value for timer expiry interrupt. */ + PalTimerCompCback_t expCback; /*!< Timer expiry call back function. */ +} palTimerCb; + +/*************************************************************************************************/ +/*! + * \brief Get the current tick of the scheduler timer. + * + * \return Current tick of the scheduler timer. + */ +/*************************************************************************************************/ +uint32_t PalTimerGetCurrentTime(void) +{ + /* Only valid for initialized scheduler timer. */ + + if (palTimerCb.state) + { + /* Capture current TIMER2 count to capture register 1 */ + NRF_TIMER2->TASKS_CAPTURE[1] = 1; + /* Read and return the captured count value from capture register 1 */ + return NRF_TIMER2->CC[1]; + } + + return 0; +} + +/*************************************************************************************************/ +/*! + * \brief Initialize the scheduler timer. + * + * \param expCback Timer expire call back function. + * + * \return None. + */ +/*************************************************************************************************/ +void PalTimerInit(PalTimerCompCback_t expCback) +{ +#ifdef DEBUG + nrf_gpio_cfg_output(PAL_TIMER_DEBUG_0_PIN); +#endif + PAL_TIMER_CHECK(palTimerCb.state == PAL_TIMER_STATE_UNINIT); + PAL_TIMER_CHECK(expCback != NULL); + + /* Give scheduler timer the highest priority. */ + NVIC_SetPriority(TIMER2_IRQn, 0); + + /* stop timer if it was somehow running (timer must be stopped for configuration) */ + NRF_TIMER2->TASKS_STOP = 1; + + /* clear timer to zero count */ + NRF_TIMER2->TASKS_CLEAR = 1; + + /* configure timer */ + NRF_TIMER2->MODE = TIMER_MODE_MODE_Timer; + NRF_TIMER2->BITMODE = TIMER_BITMODE_BITMODE_32Bit; + NRF_TIMER2->PRESCALER = PAL_TIMER_1MHZ_PRESCALER; /* f = 16MHz / (2 ^ TIMER_PRESCALER) */ + + /* TIMER2 is a free running clock. */ + NRF_TIMER2->TASKS_START = 1; + + /* Clear out and enable TIMER2 interrupt at system level. */ + NRF_TIMER2->INTENCLR = 0xFFFFFFFF; + NRF_TIMER2->EVENTS_COMPARE[0] = 0; + NVIC_ClearPendingIRQ(TIMER2_IRQn); + NVIC_EnableIRQ(TIMER2_IRQn); + + palTimerCb.compareVal = 0; + palTimerCb.expCback = expCback; + palTimerCb.state = PAL_TIMER_STATE_READY; +} + +/*************************************************************************************************/ +/*! + * \brief De-initialize the scheduler timer. + * + * \return None. + */ +/*************************************************************************************************/ +void PalTimerDeInit(void) +{ + + NVIC_DisableIRQ(TIMER2_IRQn); + + /* stop timer */ + NRF_TIMER2->TASKS_STOP = 1; + + palTimerCb.state = PAL_TIMER_STATE_UNINIT; +} + +/*************************************************************************************************/ +/*! + * \brief Return scheduler timer state. + * + * \return state. + */ +/*************************************************************************************************/ +PalTimerState_t PalTimerGetState(void) +{ + return palTimerCb.state; +} + +/*************************************************************************************************/ +/*! + * \brief Start the scheduler timer. + * + * \param expTimeUsec Set timer expiry in microseconds. + * + * \return None + */ +/*************************************************************************************************/ + +void PalTimerStart(uint32_t expTimeUsec) +{ + PAL_TIMER_CHECK(palTimerCb.state == PAL_TIMER_STATE_READY); + PAL_TIMER_CHECK(expTimeUsec != 0); + + uint32_t startTimeTick = PalTimerGetCurrentTime() + PAL_TIMER_US_TO_TICKS(expTimeUsec); + + /* Clear pending events. */ + NRF_TIMER2->EVENTS_COMPARE[0] = 0; + + /* Set compare value. */ + NRF_TIMER2->CC[0] = startTimeTick; + + /* Enable TIMER2 interrupt source for CC[0]. */ + NRF_TIMER2->INTENSET = TIMER_INTENSET_COMPARE0_Msk; + + palTimerCb.compareVal = startTimeTick; + palTimerCb.state = PAL_TIMER_STATE_BUSY; +} + +/*************************************************************************************************/ +/*! + * \brief Stop the scheduler timer. + * + * \return None + */ +/*************************************************************************************************/ +void PalTimerStop() +{ + /* Disable this interrupt */ + NRF_TIMER2->INTENCLR = TIMER_INTENCLR_COMPARE0_Msk; + + palTimerCb.state = PAL_TIMER_STATE_READY; +} + +/*************************************************************************************************/ +/*! + * \brief TIMER2 interrupt handler dedicated to scheduler timer. + * + * \return None. + */ +/*************************************************************************************************/ +void TIMER2_IRQHandler_v(void) +{ +#ifdef DEBUG + nrf_gpio_pin_set(PAL_TIMER_DEBUG_0_PIN); +#endif + + PAL_TIMER_CHECK(palTimerCb.state == PAL_TIMER_STATE_BUSY); + /* Check hardware status */ + PAL_TIMER_CHECK(NRF_TIMER2->EVENTS_COMPARE[0]); + PAL_TIMER_CHECK(NRF_TIMER2->CC[0] == palTimerCb.compareVal); + PAL_TIMER_CHECK(NRF_TIMER2->INTENSET == TIMER_INTENSET_COMPARE0_Msk); + + /* Callback function could restart TIMER2. However, we blindly stop TIMER2 first. */ + NRF_TIMER2->INTENCLR = TIMER_INTENCLR_COMPARE0_Msk; + /* Clear event again just in case. */ + NRF_TIMER2->EVENTS_COMPARE[0] = 0; + + palTimerCb.state = PAL_TIMER_STATE_READY; + + if (palTimerCb.expCback) + { + palTimerCb.expCback(); + } + +#ifdef DEBUG + nrf_gpio_pin_clear(PAL_TIMER_DEBUG_0_PIN); +#endif +} diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_twi.c b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_twi.c new file mode 100644 index 0000000000..b11ef1071b --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_twi.c @@ -0,0 +1,423 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief TWI driver implementation. + * + * Copyright (c) 2018-2019 Arm Ltd. All Rights Reserved. + * Arm Ltd. confidential and proprietary. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*************************************************************************************************/ + +#include +#include "pal_twi.h" +#include "nrfx_twim.h" +#include "nrf_twim.h" +#include "app_util_platform.h" + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +/* Allow compiler directive override. */ +#ifndef PAL_TWI_MAX_DEVICE + +/*! \brief Maximum device count (must be an even multiple of 2^N). */ +#define PAL_TWI_MAX_DEVICE 4 +#endif + +/*! \brief Get next handle value, includes wrap around. */ +#define PAL_TWI_GET_NEXT_HANDLE(h) (((h) + 1) & (PAL_TWI_MAX_DEVICE - 1)) + +#ifdef DEBUG + +/*! \brief Parameter check. */ +#define PAL_TWI_PARAM_CHECK(expr) { if (!(expr)) { twiDevCb.drvState = PAL_TWI_STATE_ERROR; return; } } + +/*! \brief Parameter check, with return value. */ +#define PAL_TWI_PARAM_CHECK_RET(expr, rv) { if (!(expr)) { twiDevCb.drvState = PAL_TWI_STATE_ERROR; return (rv); } } + +#else + +/*! \brief Parameter check (disabled). */ +#define PAL_TWI_PARAM_CHECK(expr) + +/*! \brief Parameter check, with return value (disabled). */ +#define PAL_TWI_PARAM_CHECK_RET(expr, rv) + +#endif + +/*! \brief TWI instance ID. */ +#define PAL_TWI_INSTANCE_ID 0 + +/*! \brief Pin number for SCL. */ +#define PAL_TWI_CLOCK_PIN_NUMBER (27U) + +/*! \brief Pin number for SDA. */ +#define PAL_TWI_DATA_PIN_NUMBER (26U) + + +/************************************************************************************************** + Type Definitions +**************************************************************************************************/ + +/*! \brief Commands state. */ +typedef enum +{ + PAL_TWI_CMD_IDLE, /*!< Idle state. */ + PAL_TWI_CMD_TX_DATA, /*!< Write data state. */ + PAL_TWI_CMD_RX_DATA /*!< Read data state. */ +} PalTwiCmdState_t; + +/*! \brief Device configuration. */ +typedef struct +{ + bool_t opPending; /*!< Operation pending flag. */ + PalTwiDevConfig_t devCfg; /*!< Device configuration. */ +} PalTwiDevCtx_t; + +#if NRFX_CHECK(NRFX_TWIM0_ENABLED) + +/************************************************************************************************** + Global Variables +**************************************************************************************************/ + +/*! \brief Driver control block. */ +static struct +{ + uint8_t curHandle; /*!< Current device handle. */ + PalTwiCmdState_t cmdState; /*!< Command transaction state, Tx or Rx. */ + PalTwiState_t drvState; /*!< Current state. */ + bool_t firstCmd; /*!< First command after operation start flag. */ +} twiDevCb; + +/*! \brief Device context table. */ +static PalTwiDevCtx_t twiDevCtx[PAL_TWI_MAX_DEVICE]; + +/*! \brief TWI instance. */ +static const nrfx_twim_t twiId = NRFX_TWIM_INSTANCE(PAL_TWI_INSTANCE_ID); + +/*! \brief TWI config. */ +const nrfx_twim_config_t twiConfig = +{ + .frequency = NRF_TWIM_FREQ_400K, + .scl = PAL_TWI_CLOCK_PIN_NUMBER, + .sda = PAL_TWI_DATA_PIN_NUMBER, + .interrupt_priority = APP_IRQ_PRIORITY_LOWEST, + .hold_bus_uninit = false +}; + +/************************************************************************************************** + Functions: Initialization +**************************************************************************************************/ + +/*************************************************************************************************/ +/*! + * \brief Control callback. + * + * \param event Event parameters. + * + * \return None. + */ +/*************************************************************************************************/ +static void palTwiCallback(nrfx_twim_evt_t *event, void *pContext) +{ + /* Pre-resolve device configuration. */ + PalTwiDevConfig_t *pCfg = &twiDevCtx[twiDevCb.curHandle].devCfg; + bool_t success = FALSE; + + twiDevCb.firstCmd = FALSE; + + if ((event->type) == NRFX_TWIM_EVT_DONE) + { + success = TRUE; + } + + if (twiDevCb.cmdState == PAL_TWI_CMD_TX_DATA) + { + twiDevCb.cmdState = PAL_TWI_CMD_IDLE; + if (pCfg->wrCback) + { + pCfg->wrCback(twiDevCb.curHandle, success); + } + } + else if (twiDevCb.cmdState == PAL_TWI_CMD_RX_DATA) + { + twiDevCb.cmdState = PAL_TWI_CMD_IDLE; + if (pCfg->rdCback) + { + pCfg->rdCback(twiDevCb.curHandle, success); + } + } +} + +/*************************************************************************************************/ +/*! + * \brief Initialize TWI resources. + * + * \return None. + */ +/*************************************************************************************************/ +void PalTwiInit(void) +{ + if (twiDevCb.drvState != PAL_TWI_STATE_UNINIT) + { + return; + } + + memset(&twiDevCb, 0, sizeof(twiDevCb)); + + for (unsigned int handle = 0; handle < PAL_TWI_MAX_DEVICE; handle++) + { + twiDevCtx[handle].devCfg.devAddr = PAL_TWI_INVALID_ID; + twiDevCtx[handle].devCfg.opReadyCback = NULL; + twiDevCtx[handle].devCfg.rdCback = NULL; + twiDevCtx[handle].devCfg.wrCback = NULL; + } + + twiDevCb.drvState = PAL_TWI_STATE_READY; + + nrfx_twim_init(&twiId, &twiConfig, (nrfx_twim_evt_handler_t)palTwiCallback, NULL); + nrfx_twim_enable(&twiId); + NVIC_ClearPendingIRQ(SPI0_TWI0_IRQn); + NVIC_EnableIRQ(SPI0_TWI0_IRQn); +} + +/*************************************************************************************************/ +/*! + * \brief De-Initialize the TWI resources. + * + * \return None. + */ +/*************************************************************************************************/ +void PalTwiDeInit(void) +{ + PAL_TWI_PARAM_CHECK(twiDevCb.drvState != PAL_TWI_STATE_BUSY); + + for (unsigned int handle = 0; handle < PAL_TWI_MAX_DEVICE; handle++) + { + twiDevCtx[handle].devCfg.devAddr = PAL_TWI_INVALID_ID; + twiDevCtx[handle].devCfg.opReadyCback = NULL; + twiDevCtx[handle].devCfg.rdCback = NULL; + twiDevCtx[handle].devCfg.wrCback = NULL; + } + + nrfx_twim_uninit(&twiId); + nrfx_twim_disable(&twiId); + + twiDevCb.drvState = PAL_TWI_STATE_UNINIT; +} + +/*************************************************************************************************/ +/*! + * \brief Register a device on the TWI bus. + * + * \param pDevCfg Device configuration. + * + * \return Device handle. + */ +/*************************************************************************************************/ +uint8_t PalTwiRegisterDevice(PalTwiDevConfig_t *pDevCfg) +{ + PAL_TWI_PARAM_CHECK_RET(pDevCfg != NULL, PAL_TWI_INVALID_ID); + PAL_TWI_PARAM_CHECK_RET(pDevCfg->opReadyCback, PAL_TWI_INVALID_ID); + + uint8_t retValue = PAL_TWI_INVALID_ID; + + for (unsigned int handle = 0; handle < PAL_TWI_MAX_DEVICE; handle++) + { + if ((twiDevCtx[handle].devCfg.devAddr == PAL_TWI_INVALID_ID) && (pDevCfg->devAddr != PAL_TWI_INVALID_ID)) + { + twiDevCtx[handle].devCfg = *pDevCfg; + return (uint8_t)handle; + } + } + + return retValue; +} + +/************************************************************************************************** + Functions: Control and Status +**************************************************************************************************/ + +/*************************************************************************************************/ +/*! + * \brief Get the current state. + * + * \return Current state. + * + * Return the current state of the TWI. + */ +/*************************************************************************************************/ +PalTwiState_t PalTwiGetState(void) +{ + return twiDevCb.drvState; +} + +/************************************************************************************************** + Functions: Data Transfer +**************************************************************************************************/ + +/*************************************************************************************************/ +/*! + * \brief Always start an operation before reading or writing on TWI interface. + * + * \param handle Device handle. + * + * \return None. + */ +/*************************************************************************************************/ +void PalTwiStartOperation(uint8_t handle) +{ + PAL_TWI_PARAM_CHECK(handle < PAL_TWI_MAX_DEVICE); + + if (twiDevCb.drvState != PAL_TWI_STATE_READY) + { + PAL_TWI_PARAM_CHECK(handle != twiDevCb.curHandle); /* Client operation already in progress. */ + PAL_TWI_PARAM_CHECK(twiDevCtx[handle].opPending == FALSE); /* Client already pended an operation. */ + } + + __disable_irq(); + + if (twiDevCb.drvState == PAL_TWI_STATE_READY) + { + __enable_irq(); + twiDevCb.drvState = PAL_TWI_STATE_BUSY; + twiDevCb.firstCmd = TRUE; + twiDevCb.curHandle = handle; + if (twiDevCtx[handle].devCfg.opReadyCback) + { + twiDevCtx[handle].devCfg.opReadyCback(handle); + } + } + else + { + /* Pend the operation until current operation completes. */ + twiDevCtx[handle].opPending = TRUE; + __enable_irq(); + } +} + +/*************************************************************************************************/ +/*! + * \brief Always stop an operation after reading or writing on TWI interface. + * + * \param handle Device handle. + * + * \return None. + */ +/*************************************************************************************************/ +void PalTwiStopOperation(uint8_t handle) +{ + PAL_TWI_PARAM_CHECK(handle < PAL_TWI_MAX_DEVICE); + PAL_TWI_PARAM_CHECK(handle == twiDevCb.curHandle); + PAL_TWI_PARAM_CHECK(twiDevCb.cmdState == PAL_TWI_CMD_IDLE); + PAL_TWI_PARAM_CHECK(twiDevCb.drvState == PAL_TWI_STATE_BUSY); + + unsigned int nextHandle = PAL_TWI_GET_NEXT_HANDLE(handle); + + twiDevCb.curHandle = PAL_TWI_INVALID_ID; + + /* Only when address or command is sent, then issue stop. */ + if (!twiDevCb.firstCmd) + { + nrf_twim_event_clear(twiId.p_twim, NRF_TWIM_EVENT_STOPPED); + nrf_twim_task_trigger(twiId.p_twim, NRF_TWIM_TASK_RESUME); + nrf_twim_task_trigger(twiId.p_twim, NRF_TWIM_TASK_STOP); + nrf_twim_int_disable(twiId.p_twim, 0xFFFFFFFF); + } + + while (nextHandle != handle) + { + if (twiDevCtx[nextHandle].opPending) + { + /* Set the operation pending to FALSE first in case of race condition. */ + twiDevCtx[nextHandle].opPending = FALSE; + + twiDevCb.firstCmd = TRUE; + twiDevCb.curHandle = nextHandle; + if (twiDevCtx[nextHandle].devCfg.opReadyCback) + { + twiDevCtx[nextHandle].devCfg.opReadyCback(nextHandle); + } + + return; + } + + nextHandle = PAL_TWI_GET_NEXT_HANDLE(nextHandle); + } + + /* No pending operations. */ + twiDevCb.drvState = PAL_TWI_STATE_READY; +} + +/*************************************************************************************************/ +/*! + * \brief Write data to TWI interface. + * + * \param handle Device handle. + * \param pData Write buffer. + * \param len Number of bytes to write. + * + * \return None. + * + * Transfer \a len bytes from \a pData to the TWI device. + */ +/*************************************************************************************************/ +void PalTwiWriteData(uint8_t handle, const uint8_t *pData, uint8_t len) +{ + PAL_TWI_PARAM_CHECK(len != 0); + PAL_TWI_PARAM_CHECK(pData != NULL); + PAL_TWI_PARAM_CHECK(handle < PAL_TWI_MAX_DEVICE); + PAL_TWI_PARAM_CHECK(handle == twiDevCb.curHandle); + PAL_TWI_PARAM_CHECK(twiDevCb.drvState == PAL_TWI_STATE_BUSY); + PAL_TWI_PARAM_CHECK(twiDevCb.cmdState == PAL_TWI_CMD_IDLE); + + twiDevCb.curHandle = handle; + twiDevCb.cmdState = PAL_TWI_CMD_TX_DATA; + + nrfx_twim_tx(&twiId, twiDevCtx[handle].devCfg.devAddr, pData, len, NRFX_TWIM_FLAG_TX_NO_STOP); +} + +/*************************************************************************************************/ +/*! + * \brief Read data from TWI interface. + * + * \param handle Device handle. + * \param pData Write buffer. + * \param len Number of bytes to write. + * + * \return None. + * + * Read \a len bytes from \a pData to the TWI device. + */ +/*************************************************************************************************/ +void PalTwiReadData(uint8_t handle, uint8_t *pData, uint8_t len) +{ + PAL_TWI_PARAM_CHECK(len != 0); + PAL_TWI_PARAM_CHECK(pData != NULL); + PAL_TWI_PARAM_CHECK(handle < PAL_TWI_MAX_DEVICE); + PAL_TWI_PARAM_CHECK(handle == twiDevCb.curHandle); + PAL_TWI_PARAM_CHECK(twiDevCb.drvState == PAL_TWI_STATE_BUSY); + PAL_TWI_PARAM_CHECK(twiDevCb.cmdState == PAL_TWI_CMD_IDLE); + + twiDevCb.curHandle =handle; + twiDevCb.cmdState = PAL_TWI_CMD_RX_DATA; + + nrfx_twim_rx(&twiId, twiDevCtx[handle].devCfg.devAddr, pData, len); +} + +#endif // NRFX_CHECK(NRFX_TWIM0_ENABLED) + diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_uart.c b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_uart.c new file mode 100644 index 0000000000..034cbc7fc9 --- /dev/null +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_CORDIO/TARGET_NRF5x/stack/sources/pal_uart.c @@ -0,0 +1,340 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief UART driver definition. + * + * Copyright (c) 2018-2019 ARM Ltd. All Rights Reserved. + * ARM Ltd. confidential and proprietary. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*************************************************************************************************/ + +#include "pal_uart.h" +#include "sdk_config.h" +#include "nrfx_uarte.h" +#include "boards.h" + +#if NRFX_CHECK(NRFX_UARTE0_ENABLED) + +/************************************************************************************************** + Local Variables +**************************************************************************************************/ +#define PAL_UART_INVALID_INSTANCE_NUM 0xFF + +#ifdef DEBUG + +/*! \brief Parameter check. */ +#define PAL_UART_PARAM_CHECK(num, expr) { if (!(expr)) { palUartCb[num].state = PAL_UART_STATE_ERROR; while(1){}; } } + +#else + +/*! \brief Parameter check (disabled). */ +#define PAL_UART_PARAM_CHECK(num, expr) + +#endif + +/*! \brief Control block. */ +static struct +{ + PalUartId_t id; /*!< PAL UART id. */ + PalUartConfig_t config; /*!< PAL UART configuration. */ + PalUartState_t state; /*!< PAL UART state. */ + nrfx_uarte_t uart; /*!< NRF UART driver instance */ +} palUartCb[UART0_ENABLED + UART1_ENABLED] = {{0, {0}, 0, {NRF_UARTE0, NRFX_UARTE0_INST_IDX}}}; + +/************************************************************************************************** + Local Functions +**************************************************************************************************/ +/*************************************************************************************************/ +/*! + * \brief Get UART instance number from UART ID. + * + * \param uartId UART ID. + * + * \return UART instance number. + */ +/*************************************************************************************************/ +static uint8_t palUartGetNum(PalUartId_t uartId) +{ + uint8_t uartNum; + /* Nordic platform has total two UART instances. + * By default, only UART0 is enabled. + */ + switch (uartId) + { + case PAL_UART_ID_CHCI: + uartNum = 0; + break; + case PAL_UART_ID_TERMINAL: + uartNum = 0; + break; + case PAL_UART_ID_USER: + uartNum = 0; + break; + + default: + uartNum = PAL_UART_INVALID_INSTANCE_NUM; + break; + } + + return uartNum; +} + +/*************************************************************************************************/ +/*! + * \brief Set UART baud rate. + * + * \param baud Baud rate. + * + * \return nrf baud rate. + */ +/*************************************************************************************************/ +static nrf_uarte_baudrate_t palUartSetBaud(uint32_t baud) +{ + nrf_uarte_baudrate_t baudRate; + + switch (baud) + { + default: + case 115200: + baudRate = NRF_UARTE_BAUDRATE_115200; + break; + case 230400: + baudRate = NRF_UARTE_BAUDRATE_230400; + break; + case 460800: + baudRate = NRF_UARTE_BAUDRATE_460800; + break; + case 921600: + baudRate = NRF_UARTE_BAUDRATE_921600; + break; + case 1000000: + baudRate = NRF_UARTE_BAUDRATE_1000000; + break; + } + + return baudRate; +} + +/*************************************************************************************************/ +/*! + * \brief UART NRF event handler. + * + * \param pEvent Pointer to event. + * \param pContext Pointer to event context. + * + * \return None. + */ +/*************************************************************************************************/ +static void palUartEventHandler(nrfx_uarte_event_t *pEvent, void *pContext) +{ + uint8_t uartNum = palUartGetNum(*(PalUartId_t *)pContext); + + switch (pEvent->type) + { + case NRFX_UARTE_EVT_RX_DONE: + if (palUartCb[uartNum].config.rdCback != NULL) + { + palUartCb[uartNum].config.rdCback(); + } + break; + case NRFX_UARTE_EVT_TX_DONE: + palUartCb[uartNum].state = PAL_UART_STATE_READY; + if (palUartCb[uartNum].config.wrCback != NULL) + { + palUartCb[uartNum].config.wrCback(); + } + break; + case NRFX_UARTE_EVT_ERROR: + palUartCb[uartNum].state = PAL_UART_STATE_ERROR; + break; + default: + break; + } +} + +/************************************************************************************************** + Global Functions +**************************************************************************************************/ +/*************************************************************************************************/ +/*! + * \brief Initialize UART. + * + * \param id UART Id. + * \param pCfg Peripheral configuration. + * + * \return None. + * + * Initialize UART peripheral with \a pCfg values. + */ +/*************************************************************************************************/ + +void PalUartInit(PalUartId_t id, const PalUartConfig_t *pCfg) +{ + uint8_t uartNum = palUartGetNum(id); + + if (uartNum == PAL_UART_INVALID_INSTANCE_NUM) + { + return; + } + + palUartCb[uartNum].id = id; + + PAL_UART_PARAM_CHECK(uartNum, pCfg != NULL); + + palUartCb[uartNum].config = *pCfg; + + /* Configure UART. */ + nrfx_uarte_config_t nrfConfig = NRFX_UARTE_DEFAULT_CONFIG; + nrfConfig.pselrxd = RX_PIN_NUMBER; + nrfConfig.pseltxd = TX_PIN_NUMBER; + nrfConfig.pselcts = CTS_PIN_NUMBER; + nrfConfig.pselrts = RTS_PIN_NUMBER; + nrfConfig.p_context = &(palUartCb[uartNum].id); + nrfConfig.parity = NRF_UARTE_PARITY_EXCLUDED; + nrfConfig.interrupt_priority = 0xFF; /* Lowest priority. */ + + nrfConfig.baudrate = palUartSetBaud(pCfg->baud); + nrfConfig.hwfc = pCfg->hwFlow ? NRF_UARTE_HWFC_ENABLED : NRF_UARTE_HWFC_DISABLED; + + /* Make sure UART is uninitialized. */ + nrfx_uarte_uninit(&(palUartCb[uartNum].uart)); + + /* Initialize UART. */ + nrfx_err_t err_code = nrfx_uarte_init(&(palUartCb[uartNum].uart), &nrfConfig, (nrfx_uarte_event_handler_t)palUartEventHandler); + + //this is for uart only not for uarte + //nrfx_uart_rx_enable(&palUartCb[uartNum].uart); + + if (err_code != NRFX_SUCCESS) + { + palUartCb[uartNum].state = PAL_UART_STATE_ERROR; + return; + } + + palUartCb[uartNum].state = PAL_UART_STATE_READY; + + NVIC_EnableIRQ(UART0_IRQn); +} + +/*************************************************************************************************/ +/*! + * \brief De-Initialize UART. + * + * \param id UART id. + * + * \return None. + * + * De-Initialize UART. + */ +/*************************************************************************************************/ +void PalUartDeInit(PalUartId_t id) +{ + uint8_t uartNum = palUartGetNum(id); + + if (uartNum == PAL_UART_INVALID_INSTANCE_NUM) + { + return; + } + + nrfx_uarte_uninit(&(palUartCb[uartNum].uart)); + + palUartCb[uartNum].state = PAL_UART_STATE_UNINIT; +} + +/*************************************************************************************************/ +/*! + * \brief Get the current state. + * + * \param id UART id. + * +* \return Current state. + * + * Return the current state. + */ +/*************************************************************************************************/ +PalUartState_t PalUartGetState(PalUartId_t id) +{ + uint8_t uartNum = palUartGetNum(id); + + if (uartNum == PAL_UART_INVALID_INSTANCE_NUM) + { + return PAL_UART_STATE_ERROR; + } + + return palUartCb[uartNum].state; +} + +/*************************************************************************************************/ +/*! + * \brief Read data from Rx FIFO. + * + * \param id UART id. + * \param pData Read buffer. + * \param len Number of bytes to read. + * + * \return None. + * + * Store \a len received bytes in \a pData. After \a len is transferred, call + * \a UartInitInfo_t::rdCback to signal read completion. Alway call this function to setup buffer + * when boot up or after a reading is done + */ +/*************************************************************************************************/ +void PalUartReadData(PalUartId_t id, uint8_t *pData, uint16_t len) +{ + uint8_t uartNum = palUartGetNum(id); + + PAL_UART_PARAM_CHECK(uartNum, pData != NULL); + PAL_UART_PARAM_CHECK(uartNum, len > 0); + PAL_UART_PARAM_CHECK(uartNum, palUartCb[uartNum].state != PAL_UART_STATE_UNINIT); + + if (uartNum == PAL_UART_INVALID_INSTANCE_NUM) + { + return; + } + nrfx_uarte_rx(&(palUartCb[uartNum].uart), pData, (uint16_t)len); +} + +/*************************************************************************************************/ +/*! + * \brief Write data to Tx FIFO. + * + * \param id UART id. + * \param pData Write buffer. + * \param len Number of bytes to write. + * + * \return None. + * + * Assign buffer and length and transmit data. + */ +/*************************************************************************************************/ +void PalUartWriteData(PalUartId_t id, const uint8_t *pData, uint16_t len) +{ + uint8_t uartNum = palUartGetNum(id); + + PAL_UART_PARAM_CHECK(uartNum, pData != NULL); + PAL_UART_PARAM_CHECK(uartNum, len > 0); + PAL_UART_PARAM_CHECK(uartNum, palUartCb[uartNum].state == PAL_UART_STATE_READY); + + if (uartNum == PAL_UART_INVALID_INSTANCE_NUM) + { + return; + } + + nrfx_uarte_tx(&(palUartCb[uartNum].uart), pData, (uint16_t)len); + palUartCb[uartNum].state = PAL_UART_STATE_BUSY; +} + +#endif // NRFX_CHECK(NRFX_UARTE0_ENABLED) diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/btle/btle.cpp b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/btle/btle.cpp index eb52252635..5f75546417 100644 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/btle/btle.cpp +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/btle/btle.cpp @@ -334,7 +334,6 @@ void btle_handler(const ble_evt_t *p_ble_evt) #if (NRF_SD_BLE_API_VERSION >= 5) -#ifndef S140 // Handle PHY upgrade request case BLE_GAP_EVT_PHY_UPDATE_REQUEST: { gap.on_phy_update_request( @@ -428,7 +427,7 @@ void btle_handler(const ble_evt_t *p_ble_evt) } break; } -#endif + case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST: { Gap::Handle_t connection = p_ble_evt->evt.gap_evt.conn_handle; const ble_gap_evt_conn_param_update_request_t *update_request = diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xGap.cpp b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xGap.cpp index 0e0d604ac1..f42827b161 100644 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xGap.cpp +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xGap.cpp @@ -171,6 +171,9 @@ nRF5xGap::nRF5xGap() : _connections_role() { m_connectionHandle = BLE_CONN_HANDLE_INVALID; + #if (NRF_SD_BLE_API_VERSION >= 6) + m_advHandle = BLE_GAP_ADV_SET_HANDLE_NOT_SET; + #endif } /**************************************************************************/ /*! @@ -236,6 +239,29 @@ ble_error_t nRF5xGap::setAdvertisingData_(const GapAdvertisingData &advData, con // } //} + #if (NRF_SD_BLE_API_VERSION >= 6) + /* sd_ble_gap_adv_data_set has been decprecated */ + if (m_advHandle != BLE_GAP_ADV_SET_HANDLE_NOT_SET) { + /* This is for updating advdata*/ + ble_gap_adv_data_t adv_data = {0}; + adv_data.adv_data.p_data = const_cast(advData.getPayload()); + adv_data.adv_data.len = advData.getPayloadLen(); + adv_data.scan_rsp_data.p_data = const_cast(scanResponse.getPayload()); + adv_data.scan_rsp_data.len = scanResponse.getPayloadLen(); + + ASSERT_TRUE(ERROR_NONE == + sd_ble_gap_adv_stop(m_advHandle), + BLE_ERROR_PARAM_OUT_OF_RANGE); + + ASSERT_TRUE(ERROR_NONE == + sd_ble_gap_adv_set_configure(&m_advHandle, &adv_data, NULL), + BLE_ERROR_PARAM_OUT_OF_RANGE); + + ASSERT_TRUE(ERROR_NONE == + sd_ble_gap_adv_start(m_advHandle, NRF_CONNECTION_TAG), + BLE_ERROR_PARAM_OUT_OF_RANGE); + } + #else /* Send advertising data! */ ASSERT_TRUE(ERROR_NONE == sd_ble_gap_adv_data_set(advData.getPayload(), @@ -243,6 +269,7 @@ ble_error_t nRF5xGap::setAdvertisingData_(const GapAdvertisingData &advData, con scanResponse.getPayload(), scanResponse.getPayloadLen()), BLE_ERROR_PARAM_OUT_OF_RANGE); + #endif /* Make sure the GAP Service appearance value is aligned with the *appearance from GapAdvertisingData */ @@ -373,14 +400,56 @@ ble_error_t nRF5xGap::startAdvertising_(const GapAdvertisingParams ¶ms) /* Start Advertising */ +#if (NRF_SD_BLE_API_VERSION >= 6) + /* FIXME: Must be chanaged if extended paramters added into GapAdvertisingParams */ + switch (params.getAdvertisingType()) { + case GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED: + adv_para.properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED; + break; + + case GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED: + adv_para.properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED; + break; + + case GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED: + adv_para.properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED; + break; + + case GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED: + adv_para.properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED; + break; + + default: + return BLE_ERROR_PARAM_OUT_OF_RANGE; + break; + } + + adv_para.interval = params.getIntervalInADVUnits(); // advertising interval (in units of 0.625 ms) + adv_para.duration = params.getTimeout() * 100; // units have been changed from seconds to 10ms units. + memset(adv_para.channel_mask, 0, sizeof(adv_para.channel_mask)); + adv_para.filter_policy = advertisingPolicyMode; // BLE_GAP_ADV_FP_ANY + adv_para.primary_phy = BLE_GAP_PHY_1MBPS; /* Use _preferred_tx_phys if validated */ + adv_para.p_peer_addr = NULL; + + m_adv_data.adv_data.p_data = const_cast(_advPayload.getPayload()); + m_adv_data.adv_data.len = _advPayload.getPayloadLen(); + m_adv_data.scan_rsp_data.p_data = const_cast(_scanResponse.getPayload()); + m_adv_data.scan_rsp_data.len = _scanResponse.getPayloadLen(); +#else adv_para.type = params.getAdvertisingType(); adv_para.p_peer_addr = NULL; // Undirected advertisement adv_para.fp = advertisingPolicyMode; adv_para.interval = params.getIntervalInADVUnits(); // advertising interval (in units of 0.625 ms) adv_para.timeout = params.getTimeout(); +#endif -#if (NRF_SD_BLE_API_VERSION >= 5) + +#if (NRF_SD_BLE_API_VERSION >= 6) + if ((err = sd_ble_gap_adv_set_configure(&m_advHandle, &m_adv_data, &adv_para) == ERROR_NONE)) { + err = sd_ble_gap_adv_start(m_advHandle, NRF_CONNECTION_TAG); + } +#elif (NRF_SD_BLE_API_VERSION == 5) err = sd_ble_gap_adv_start(&adv_para, NRF_CONNECTION_TAG); #else err = sd_ble_gap_adv_start(&adv_para); @@ -427,15 +496,29 @@ ble_error_t nRF5xGap::startRadioScan_(const GapScanningParams &scanningParams) #else /* For NRF_SD_BLE_API_VERSION >= 3 nRF5xGap::setWhitelist setups the whitelist. */ + #if (NRF_SD_BLE_API_VERSION >= 6) + scanParams.filter_policy = scanningPolicyMode; + #else scanParams.use_whitelist = scanningPolicyMode; scanParams.adv_dir_report = 0; + #endif #endif +#if (NRF_SD_BLE_API_VERSION >= 6) + scanParams.extended = 0; + memset(scanParams.channel_mask, 0, sizeof(scanParams.channel_mask)); + scanParams.scan_phys = BLE_GAP_PHY_1MBPS; /* Use _preferred_rx_phys if validated */ + + scanParams.interval = scanningParams.getInterval(); /**< Scan interval between 0x0004 and 0x4000 in 0.625ms units (2.5ms to 10.24s). */ + scanParams.window = scanningParams.getWindow(); /**< Scan window between 0x0004 and 0x4000 in 0.625ms units (2.5ms to 10.24s). */ + scanParams.timeout = scanningParams.getTimeout()*100; /**< Scan timeout between 0x0001 and 0xFFFF in 10 ms units, 0x0000 disables timeout. */ +#else scanParams.active = scanningParams.getActiveScanning(); /**< If 1, perform active scanning (scan requests). */ scanParams.interval = scanningParams.getInterval(); /**< Scan interval between 0x0004 and 0x4000 in 0.625ms units (2.5ms to 10.24s). */ scanParams.window = scanningParams.getWindow(); /**< Scan window between 0x0004 and 0x4000 in 0.625ms units (2.5ms to 10.24s). */ scanParams.timeout = scanningParams.getTimeout(); /**< Scan timeout between 0x0001 and 0xFFFF in seconds, 0x0000 disables timeout. */ +#endif if (_privacy_enabled) { bool enable_resolution = @@ -450,9 +533,20 @@ ble_error_t nRF5xGap::startRadioScan_(const GapScanningParams &scanningParams) } } +#if (NRF_SD_BLE_API_VERSION >= 6) + m_scan_buffer.p_data = m_raw_scan_buffer; + m_scan_buffer.len = sizeof(m_raw_scan_buffer); + m_resume_scanning = true; + //if (sd_ble_gap_scan_start(&scanParams, &m_scan_buffer) != NRF_SUCCESS) { + uint32_t res = sd_ble_gap_scan_start(&scanParams, &m_scan_buffer); + if (res != NRF_SUCCESS) { + return BLE_ERROR_PARAM_OUT_OF_RANGE; + } +#else if (sd_ble_gap_scan_start(&scanParams) != NRF_SUCCESS) { return BLE_ERROR_PARAM_OUT_OF_RANGE; } +#endif return BLE_ERROR_NONE; } @@ -485,7 +579,11 @@ ble_error_t nRF5xGap::stopScan_(void) { ble_error_t nRF5xGap::stopAdvertising_(void) { /* Stop Advertising */ + #if (NRF_SD_BLE_API_VERSION >= 6) + ASSERT_TRUE(ERROR_NONE == sd_ble_gap_adv_stop(m_advHandle), BLE_ERROR_PARAM_OUT_OF_RANGE); + #else ASSERT_TRUE(ERROR_NONE == sd_ble_gap_adv_stop(), BLE_ERROR_PARAM_OUT_OF_RANGE); + #endif state.advertising = 0; @@ -631,8 +729,11 @@ ble_error_t nRF5xGap::connect( } #else /* For NRF_SD_BLE_API_VERSION >= 3 nRF5xGap::setWhitelist setups the whitelist. */ - + #if (NRF_SD_BLE_API_VERSION >= 6) + scanParams.filter_policy |= (whitelistAddressesSize) ? 1 : 0; + #else scanParams.use_whitelist = (whitelistAddressesSize) ? 1 : 0; + #endif if (_privacy_enabled) { bool enable_resolution = @@ -661,6 +762,10 @@ ble_error_t nRF5xGap::connect( scanParams.timeout = _scanningParams.getTimeout(); /**< Scan timeout between 0x0001 and 0xFFFF in seconds, 0x0000 disables timeout. */ } +#if NRF_SD_BLE_API_VERSION >= 6 + m_resume_scanning = false; +#endif + #if NRF_SD_BLE_API_VERSION >= 5 uint32_t rc = sd_ble_gap_connect(addr_ptr, &scanParams, &connParams, NRF_CONNECTION_TAG); #else @@ -706,6 +811,9 @@ ble_error_t nRF5xGap::setPreferredPhys_( uint8_t preferred_rx_phys = rxPhys? rxPhys->value() : 0; #ifdef S140 + #if (NRF_SD_BLE_API_VERSION) >= 6 + /* Set _preferred_tx_phys and _preferred_rx_phys here, used when start advertising or scanning */ + #else ble_opt_t opt = { 0 }; opt.gap_opt.preferred_phys.tx_phys = preferred_tx_phys; opt.gap_opt.preferred_phys.rx_phys = preferred_rx_phys; @@ -726,7 +834,7 @@ ble_error_t nRF5xGap::setPreferredPhys_( default: return BLE_ERROR_UNSPECIFIED; } - + #endif #endif _preferred_tx_phys = preferred_tx_phys; @@ -741,7 +849,7 @@ ble_error_t nRF5xGap::setPhy_( const ble::phy_set_t* rxPhys, CodedSymbolPerBit_t codedSymbol ) { -#ifdef S140 +#if defined(S140) && ((NRF_SD_BLE_API_VERSION) < 6) return BLE_ERROR_NOT_IMPLEMENTED; #else // TODO handle coded symbol once supported by the softdevice. @@ -851,6 +959,9 @@ ble_error_t nRF5xGap::reset_(void) /* Clear derived class members */ m_connectionHandle = BLE_CONN_HANDLE_INVALID; + #if (NRF_SD_BLE_API_VERSION >= 6) + m_advHandle = BLE_GAP_ADV_SET_HANDLE_NOT_SET; + #endif /* Set the whitelist policy filter modes to IGNORE_WHITELIST */ advertisingPolicyMode = ADV_POLICY_IGNORE_WHITELIST; @@ -1019,7 +1130,25 @@ ble_error_t nRF5xGap::getAppearance_(GapAdvertisingData::Appearance *appearanceP ble_error_t nRF5xGap::setTxPower_(int8_t txPower) { unsigned rc; + #if (NRF_SD_BLE_API_VERSION >= 6) + /* FIXME: This has to change API for specified paramter */ + uint16_t handle = 0; + rc = NRF_SUCCESS; + if ((handle = getConnectionHandle()) != BLE_CONN_HANDLE_INVALID) { + rc = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_CONN, handle, txPower); + } + if ((rc == NRF_SUCCESS) && (m_advHandle != BLE_GAP_ADV_SET_HANDLE_NOT_SET)) { + handle = (uint16_t)m_advHandle; + rc = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, handle, txPower); + } + if (rc == NRF_SUCCESS) { + rc = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_SCAN_INIT, 0 /* This is ingored for ROLE_SCAN_INIT*/, txPower); + } + + if (rc != NRF_SUCCESS) { + #else if ((rc = sd_ble_gap_tx_power_set(txPower)) != NRF_SUCCESS) { + #endif switch (rc) { case NRF_ERROR_BUSY: return BLE_STACK_BUSY; @@ -1564,6 +1693,34 @@ void nRF5xGap::on_advertising_packet(const ble_gap_evt_adv_report_t &evt) { ); const uint8_t* peer_address = evt.peer_addr.addr; + #if (NRF_SD_BLE_API_VERSION >= 6) + GapAdvertisingParams::AdvertisingType_t type; + if (evt.type.connectable && !evt.type.directed) { + type = GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED; + } else if (evt.type.connectable && evt.type.directed) { + type = GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED; + } else if (evt.type.scannable && !evt.type.directed) { + type = GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED; + } else if (!evt.type.connectable && !evt.type.directed) { + type = GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED; + } else { + // wrong condition + } + processAdvertisementReport( + peer_address, + evt.rssi, + (evt.type.scan_response? 1 : 0), + type, + evt.data.len, + evt.data.p_data, + peer_addr_type + ); + + /* If no action for connecting, must call sd_ble_gap_scan_start() aging for resuming scanning */ + if (m_resume_scanning) { + sd_ble_gap_scan_start(NULL, &m_scan_buffer); + } + #else processAdvertisementReport( peer_address, evt.rssi, @@ -1573,6 +1730,7 @@ void nRF5xGap::on_advertising_packet(const ble_gap_evt_adv_report_t &evt) { evt.data, peer_addr_type ); + #endif } ble_error_t nRF5xGap::get_role(ble::connection_handle_t connection, Role_t& role) { @@ -1656,7 +1814,6 @@ void nRF5xGap::on_phy_update( ); } -#ifndef S140 void nRF5xGap::on_phy_update_request( Handle_t connection, const ble_gap_evt_phy_update_request_t& evt @@ -1676,7 +1833,6 @@ void nRF5xGap::on_phy_update_request( sd_ble_gap_phy_update(connection, &phys); } -#endif diff --git a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xGap.h b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xGap.h index 963c0282c6..108a1a9cab 100644 --- a/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xGap.h +++ b/features/FEATURE_BLE/targets/TARGET_NORDIC/TARGET_NORDIC_SOFTDEVICE/TARGET_NRF52/source/nRF5xGap.h @@ -313,9 +313,18 @@ private: void release_all_connections_role(); void on_phy_update(Handle_t connection, const ble_gap_evt_phy_update_t& evt); - // FIXME: remove guard when S140 updated - #ifndef S140 void on_phy_update_request(Handle_t connection, const ble_gap_evt_phy_update_request_t& evt); + + #if (NRF_SD_BLE_API_VERSION) >= 6 + uint8_t m_advHandle; + /* + Note: The advertising data must be kept alive in memory until advertising is terminated. Not doing so will lead to undefined behavior. + Note: Updating advertising data while advertising can only be done by providing new advertising data buffers. + */ + ble_gap_adv_data_t m_adv_data; + uint8_t m_raw_scan_buffer[BLE_GAP_SCAN_BUFFER_MIN]; + ble_data_t m_scan_buffer; + bool m_resume_scanning; /* When the application receives a ble_gap_adv_report_t, it must now resume scanning by calling sd_ble_gap_scan_start() */ #endif uint16_t m_connectionHandle; diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/README.md b/targets/TARGET_NORDIC/TARGET_NRF5x/README.md index 7e093ea90e..254878f2fa 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/README.md +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/README.md @@ -180,41 +180,54 @@ SoftDevices are treated as bootloaders and automatically combined by the tools. NRF52832 uses the S132 SoftDevice and NRF52840 uses the S140 SoftDevice. -The X_OTA and X_MBR binaries are obtained from the original X_FULL SoftDevice by splitting it in an MBR part and a SoftDevice part. The MBR is needed for the bootloader and the SoftDevice for firmware updates. +The OTA and MBR binaries are obtained from the original FULL SoftDevice by splitting it in an MBR part and a SoftDevice part. The MBR is needed for the bootloader and the SoftDevice for firmware updates. ### Changing SoftDevice -By default, all applications are built with the FULL SoftDevice. This can be changed by modifying the application's `mbed_app.json` configuration file. +By default, all applications are built with the FULL SoftDevice. This can be changed by modifying the application's `mbed_app.json` configuration file. Examples for the NRF52_DK and NRF52840_DK boards are shown below. -Build application without SoftDevice: +Build application with no MBR or SoftDevice: ``` "target_overrides": { - "*": { - "target.extra_labels_remove": ["SOFTDEVICE_COMMON", "SOFTDEVICE_X_FULL"], + "NRF52_DK": { + "target.extra_labels_remove": ["SOFTDEVICE_COMMON", "SOFTDEVICE_S132_FULL"], "target.extra_labels_add": ["SOFTDEVICE_NONE"] - } + }, + "NRF52840_DK": { + "target.extra_labels_remove": ["SOFTDEVICE_COMMON", "SOFTDEVICE_S140_FULL"], + "target.extra_labels_add": ["SOFTDEVICE_NONE"] + } } ``` -Build application for firmware update using SoftDevice X: + +Build application with MBR only: ``` "target_overrides": { - "*": { - "target.extra_labels_remove": ["SOFTDEVICE_X_FULL"], - "target.extra_labels_add": ["SOFTDEVICE_X_OTA"] - } + "NRF52_DK": { + "target.extra_labels_remove": ["SOFTDEVICE_COMMON", "SOFTDEVICE_S132_FULL"], + "target.extra_labels_add": ["SOFTDEVICE_S132_MBR"] + }, + "NRF52840_DK": { + "target.extra_labels_remove": ["SOFTDEVICE_S140_FULL"], + "target.extra_labels_add": ["SOFTDEVICE_S140_MBR"] + } } ``` -Build bootloader without SoftDevice X: +## NRF52840 CryptoCell310 Support +By default, all NRF52840 applications will use the CryptoCell310 subsystem which is built into the NRF52840. This provides hardware support for random number generation and encryption which are utilized by Mbed TLS. If using the CryptoCell310 subsystem is not desired, it can be replaced with a software implementation. This can be done by modifying the application's `mbed_app.json` configuration file as shown below. + ``` "target_overrides": { - "*": { - "target.extra_labels_remove": ["SOFTDEVICE_COMMON", "SOFTDEVICE_X_FULL"], - "target.extra_labels_add": ["SOFTDEVICE_X_MBR"] + "NRF52840_DK": { + "target.features_remove": ["CRYPTOCELL310"], + "target.macros_remove": ["MBEDTLS_CONFIG_HW_SUPPORT"], + "target.macros_add": ["NRFX_RNG_ENABLED=1", "RNG_ENABLED=1", "NRF_QUEUE_ENABLED=1"] } } ``` + diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_DELTA_DFCM_NNN50/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_DELTA_DFCM_NNN50/PinNames.h index 443256790b..5039228759 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_DELTA_DFCM_NNN50/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_DELTA_DFCM_NNN50/PinNames.h @@ -27,8 +27,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - typedef enum { p0 = 0, p1 = 1, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_MTB_LAIRD_BL600/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_MTB_LAIRD_BL600/PinNames.h index 84e8afa6bd..9faa513371 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_MTB_LAIRD_BL600/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_MTB_LAIRD_BL600/PinNames.h @@ -27,8 +27,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - typedef enum { p0 = 0, p1 = 1, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_NRF51_DK/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_NRF51_DK/PinNames.h index a7cfe580ab..aca5d880f5 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_NRF51_DK/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_NRF51_DK/PinNames.h @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2013 Nordic Semiconductor ASA * All rights reserved. * @@ -50,8 +50,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - typedef enum { p0 = 0, p1 = 1, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_NRF51_DONGLE/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_NRF51_DONGLE/PinNames.h index b8187eba8c..a4e71d75f0 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_NRF51_DONGLE/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_NRF51_DONGLE/PinNames.h @@ -27,8 +27,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - typedef enum { p0 = 0, p1 = 1, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_OSHCHIP/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_OSHCHIP/PinNames.h index 05a451e04e..7d67c76c52 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_OSHCHIP/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_OSHCHIP/PinNames.h @@ -50,8 +50,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - typedef enum { p0 = 0, p1 = 1, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_SDT51822B/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_SDT51822B/PinNames.h index 46005eaf52..1b8c3140dc 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_SDT51822B/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_SDT51822B/PinNames.h @@ -51,7 +51,6 @@ typedef enum { } PinDirection; #define NOT_CONNECTED (int)0xFFFFFFFF -#define PORT_SHIFT 3 typedef enum { p0 = 0, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_TY51822R3/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_TY51822R3/PinNames.h index 76e1958aee..0a0e547938 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_TY51822R3/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_TY51822R3/PinNames.h @@ -27,8 +27,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - typedef enum { p0 = 0, p1 = 1, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_VBLUNO51/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_VBLUNO51/PinNames.h index f9d9630080..92f2a8a9ff 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_VBLUNO51/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/TARGET_MCU_NRF51822_UNIFIED/TARGET_VBLUNO51/PinNames.h @@ -31,8 +31,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - typedef enum { p0 = 0, p1 = 1, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/common_rtc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/common_rtc.c similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/common_rtc.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/common_rtc.c diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/common_rtc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/common_rtc.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/common_rtc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/common_rtc.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/gpio_api.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/gpio_api.c similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/gpio_api.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/gpio_api.c diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/us_ticker.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/us_ticker.c similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/us_ticker.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF51/us_ticker.c diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/PeripheralPinsDefault.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/PeripheralPinsDefault.c index fcd4797797..13413ff815 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/PeripheralPinsDefault.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/PeripheralPinsDefault.c @@ -1,5 +1,6 @@ /* mbed Microcontroller Library - * Copyright (c) 2018 ARM Limited + * Copyright (c) 2018 ARM Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_DELTA_DFBM_NQ620/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_DELTA_DFBM_NQ620/PinNames.h index 807e2d532f..510ebfbbd9 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_DELTA_DFBM_NQ620/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_DELTA_DFBM_NQ620/PinNames.h @@ -50,8 +50,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - typedef enum { p0 = 0, p1 = 1, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_MTB_LAIRD_BL652/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_MTB_LAIRD_BL652/PinNames.h index 8ce74b2356..42495b6928 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_MTB_LAIRD_BL652/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_MTB_LAIRD_BL652/PinNames.h @@ -27,8 +27,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - typedef enum { p0 = 0, p1 = 1, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_MTB_UBLOX_NINA_B1/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_MTB_UBLOX_NINA_B1/PinNames.h index eeaba6ee7c..ee77cb57c5 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_MTB_UBLOX_NINA_B1/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_MTB_UBLOX_NINA_B1/PinNames.h @@ -28,8 +28,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - typedef enum { // nRF52 pin names p0 = 0, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_NRF52_DK/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_NRF52_DK/PinNames.h index 72ec717547..0cd18ba7b9 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_NRF52_DK/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_NRF52_DK/PinNames.h @@ -50,8 +50,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - typedef enum { p0 = 0, p1 = 1, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_RBLAB_BLENANO2/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_RBLAB_BLENANO2/PinNames.h index 16bdafaabc..7efa2311c4 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_RBLAB_BLENANO2/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_RBLAB_BLENANO2/PinNames.h @@ -50,8 +50,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - typedef enum { p0 = 0, p1 = 1, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_SDT52832B/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_SDT52832B/PinNames.h index 3d0c4461c9..b6d1d3e20c 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_SDT52832B/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_SDT52832B/PinNames.h @@ -51,7 +51,6 @@ typedef enum { } PinDirection; #define NOT_CONNECTED (int)0xFFFFFFFF -#define PORT_SHIFT 3 typedef enum { p0 = 0, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_UBLOX_EVA_NINA/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_UBLOX_EVA_NINA/PinNames.h index 26cf4384c7..2674aa51d6 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_UBLOX_EVA_NINA/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_UBLOX_EVA_NINA/PinNames.h @@ -12,8 +12,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - typedef enum { // nRF52 pin names p0 = 0, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_UBLOX_EVK_NINA_B1/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_UBLOX_EVK_NINA_B1/PinNames.h index 8d83928e45..5291a343d5 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_UBLOX_EVK_NINA_B1/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_UBLOX_EVK_NINA_B1/PinNames.h @@ -12,8 +12,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - typedef enum { // nRF52 pin names p0 = 0, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_VBLUNO52/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_VBLUNO52/PinNames.h index bd6fae90bf..55817dfa49 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_VBLUNO52/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/TARGET_VBLUNO52/PinNames.h @@ -53,8 +53,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - typedef enum { p0 = 0, p1 = 1, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/config/sdk_config.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/config/sdk_config.h index 2d3127b9f7..b4ff429d4c 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/config/sdk_config.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/config/sdk_config.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -21,10 +21,10 @@ * * 4. This software, with or without modification, must only be used with a * Nordic Semiconductor ASA integrated circuit. - * + * * 5. Any software provided in binary form under this license must not be reverse * engineered, decompiled, modified and/or disassembled. - * + * * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -35,1393 +35,417 @@ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * */ - - #ifndef SDK_CONFIG_H #define SDK_CONFIG_H // <<< Use Configuration Wizard in Context Menu >>>\n #ifdef USE_APP_CONFIG #include "app_config.h" #endif -// Board Support -// Enable NRF Asserts when Mbed NDEBUG is not set -#if !defined(NDEBUG) && !defined(DEBUG_NRF_USER) -#define DEBUG_NRF_USER -#endif - -//========================================================== -// BSP_BTN_BLE_ENABLED - bsp_btn_ble - Button Control for BLE - - -#ifndef BSP_BTN_BLE_ENABLED -#define BSP_BTN_BLE_ENABLED 0 -#endif - -// -//========================================================== - -// nRF_ANT - -//========================================================== -// ANTFS_ENABLED - ant_fs - ANT File Share module. -//========================================================== -#ifndef ANTFS_ENABLED -#define ANTFS_ENABLED 0 -#endif -// ANTFS_CONFIG_NETWORK_NUMBER - ANT-FS network number. -#ifndef ANTFS_CONFIG_NETWORK_NUMBER -#define ANTFS_CONFIG_NETWORK_NUMBER 0 -#endif - -// ANTFS_CONFIG_CHANNEL_NUMBER - ANT-FS channel number. -#ifndef ANTFS_CONFIG_CHANNEL_NUMBER -#define ANTFS_CONFIG_CHANNEL_NUMBER 0 -#endif - -// ANTFS_CONFIG_PAIRING_TIMEOUT - Pairing timeout - how long the UI will wait for a response to a pairing request before switching to the link layer, in seconds. -#ifndef ANTFS_CONFIG_PAIRING_TIMEOUT -#define ANTFS_CONFIG_PAIRING_TIMEOUT 120 -#endif - -// ANTFS_CONFIG_LINK_COMMAND_TIMEOUT - Command timeout - how long the client will wait without receiving any commands before switching to the link layer, in seconds. -#ifndef ANTFS_CONFIG_LINK_COMMAND_TIMEOUT -#define ANTFS_CONFIG_LINK_COMMAND_TIMEOUT 10 -#endif - -// ANTFS_CONFIG_TRANS_TYPE - ANT-FS Transmission Type. -#ifndef ANTFS_CONFIG_TRANS_TYPE -#define ANTFS_CONFIG_TRANS_TYPE 10 -#endif - -// ANTFS_CONFIG_DEVICE_TYPE - ANT device type for channel configuration. -#ifndef ANTFS_CONFIG_DEVICE_TYPE -#define ANTFS_CONFIG_DEVICE_TYPE 1 -#endif - -// ANTFS_CONFIG_BEACON_STATUS_PERIOD - ANT-FS Beacon Message Period. - -// <0=> 0.5 Hz -// <1=> 1 Hz -// <2=> 2 Hz -// <3=> 4 Hz -// <4=> 8 Hz - -#ifndef ANTFS_CONFIG_BEACON_STATUS_PERIOD -#define ANTFS_CONFIG_BEACON_STATUS_PERIOD 3 -#endif - -// ANTFS_CONFIG_TRANSMIT_POWER - ANT Transmit Power. - -// <0=> Lowest ANT Tx power level setting. (-20dBm) -// <1=> ANT Tx power > Lvl 0. (-12dBm) -// <2=> ANT Tx power > Lvl 1. (-4dBm) -// <3=> ANT Tx power > Lvl 2. Default tx power level. (0dBm) -// <4=> ANT Tx power > Lvl 3. (+4dBm) -// <128=> Custom tx power selection - -#ifndef ANTFS_CONFIG_TRANSMIT_POWER -#define ANTFS_CONFIG_TRANSMIT_POWER 3 -#endif - -// ANTFS_CONFIG_CUSTOM_TRANSMIT_POWER - ANT Custom Transmit Power. -#ifndef ANTFS_CONFIG_CUSTOM_TRANSMIT_POWER -#define ANTFS_CONFIG_CUSTOM_TRANSMIT_POWER 0 -#endif - -// ANTFS_CONFIG_AUTH_TYPE_PAIRING_ENABLED - Use pairing and key exchange authentication. - - -#ifndef ANTFS_CONFIG_AUTH_TYPE_PAIRING_ENABLED -#define ANTFS_CONFIG_AUTH_TYPE_PAIRING_ENABLED 0 -#endif - -// ANTFS_CONFIG_AUTH_TYPE_PASSKEY_ENABLED - Use passkey authentication. - - -#ifndef ANTFS_CONFIG_AUTH_TYPE_PASSKEY_ENABLED -#define ANTFS_CONFIG_AUTH_TYPE_PASSKEY_ENABLED 0 -#endif - -// ANTFS_CONFIG_AUTH_TYPE_PASSTHROUGH_ENABLED - Allow host to bypass authentication. - - -#ifndef ANTFS_CONFIG_AUTH_TYPE_PASSTHROUGH_ENABLED -#define ANTFS_CONFIG_AUTH_TYPE_PASSTHROUGH_ENABLED 0 -#endif - -// ANTFS_CONFIG_UPLOAD_ENABLED - Support upload operation. - - -#ifndef ANTFS_CONFIG_UPLOAD_ENABLED -#define ANTFS_CONFIG_UPLOAD_ENABLED 0 -#endif - -// ANTFS_CONFIG_DEBUG_LED_ENABLED - Enables LED debug in the module. - - -#ifndef ANTFS_CONFIG_DEBUG_LED_ENABLED -#define ANTFS_CONFIG_DEBUG_LED_ENABLED 0 -#endif - -// - -// ANT_BPWR_ENABLED - ant_bpwr - Bicycle Power Profile -//========================================================== -#ifndef ANT_BPWR_ENABLED -#define ANT_BPWR_ENABLED 0 -#endif -// ANT_BPWR_LOG_ENABLED - Enables general logging in the module. -//========================================================== -#ifndef ANT_BPWR_LOG_ENABLED -#define ANT_BPWR_LOG_ENABLED 0 -#endif -// ANT_BPWR_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BPWR_LOG_LEVEL -#define ANT_BPWR_LOG_LEVEL 3 -#endif - -// ANT_BPWR_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BPWR_INFO_COLOR -#define ANT_BPWR_INFO_COLOR 0 -#endif - -// - -// ANT_BPWR_COMMON_LOG_ENABLED - Enables logging of BPWR tracing common data. -//========================================================== -#ifndef ANT_BPWR_COMMON_LOG_ENABLED -#define ANT_BPWR_COMMON_LOG_ENABLED 0 -#endif -// ANT_BPWR_COMMON_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BPWR_COMMON_LOG_LEVEL -#define ANT_BPWR_COMMON_LOG_LEVEL 3 -#endif - -// ANT_BPWR_COMMON_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BPWR_COMMON_INFO_COLOR -#define ANT_BPWR_COMMON_INFO_COLOR 0 -#endif - -// - -// ANT_BPWR_PAGE_TORQUE_LOG_ENABLED - Enables logging of BPWR torque page in the module. -//========================================================== -#ifndef ANT_BPWR_PAGE_TORQUE_LOG_ENABLED -#define ANT_BPWR_PAGE_TORQUE_LOG_ENABLED 0 -#endif -// ANT_BPWR_PAGE_TORQUE_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BPWR_PAGE_TORQUE_LOG_LEVEL -#define ANT_BPWR_PAGE_TORQUE_LOG_LEVEL 3 -#endif - -// ANT_BPWR_PAGE_TORQUE_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BPWR_PAGE_TORQUE_INFO_COLOR -#define ANT_BPWR_PAGE_TORQUE_INFO_COLOR 0 -#endif - -// - -// ANT_BPWR_PAGE_1_LOG_ENABLED - Enables logging of BPWR page 1 in the module. -//========================================================== -#ifndef ANT_BPWR_PAGE_1_LOG_ENABLED -#define ANT_BPWR_PAGE_1_LOG_ENABLED 0 -#endif -// ANT_BPWR_PAGE_1_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BPWR_PAGE_1_LOG_LEVEL -#define ANT_BPWR_PAGE_1_LOG_LEVEL 3 -#endif - -// ANT_BPWR_PAGE_1_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BPWR_PAGE_1_INFO_COLOR -#define ANT_BPWR_PAGE_1_INFO_COLOR 0 -#endif - -// - -// ANT_BPWR_PAGE_16_LOG_ENABLED - Enables logging of BPWR page 16 in the module. -//========================================================== -#ifndef ANT_BPWR_PAGE_16_LOG_ENABLED -#define ANT_BPWR_PAGE_16_LOG_ENABLED 0 -#endif -// ANT_BPWR_PAGE_16_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BPWR_PAGE_16_LOG_LEVEL -#define ANT_BPWR_PAGE_16_LOG_LEVEL 3 -#endif - -// ANT_BPWR_PAGE_16_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BPWR_PAGE_16_INFO_COLOR -#define ANT_BPWR_PAGE_16_INFO_COLOR 0 -#endif - -// - -// ANT_BPWR_PAGE_17_LOG_ENABLED - Enables logging of BPWR page 17 in the module. -//========================================================== -#ifndef ANT_BPWR_PAGE_17_LOG_ENABLED -#define ANT_BPWR_PAGE_17_LOG_ENABLED 0 -#endif -// ANT_BPWR_PAGE_17_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BPWR_PAGE_17_LOG_LEVEL -#define ANT_BPWR_PAGE_17_LOG_LEVEL 3 -#endif - -// ANT_BPWR_PAGE_17_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BPWR_PAGE_17_INFO_COLOR -#define ANT_BPWR_PAGE_17_INFO_COLOR 0 -#endif - -// - -// ANT_BPWR_PAGE_18_LOG_ENABLED - Enables logging of BPWR page 18 in the module. -//========================================================== -#ifndef ANT_BPWR_PAGE_18_LOG_ENABLED -#define ANT_BPWR_PAGE_18_LOG_ENABLED 0 -#endif -// ANT_BPWR_PAGE_18_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BPWR_PAGE_18_LOG_LEVEL -#define ANT_BPWR_PAGE_18_LOG_LEVEL 3 -#endif - -// ANT_BPWR_PAGE_18_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BPWR_PAGE_18_INFO_COLOR -#define ANT_BPWR_PAGE_18_INFO_COLOR 0 -#endif - -// - -// - -// ANT_BSC_ENABLED - ant_bsc - Bicycle Speed and Cadence Profile -//========================================================== -#ifndef ANT_BSC_ENABLED -#define ANT_BSC_ENABLED 0 -#endif -// ANT_BSC_LOG_ENABLED - Enables general logging in the module. -//========================================================== -#ifndef ANT_BSC_LOG_ENABLED -#define ANT_BSC_LOG_ENABLED 0 -#endif -// ANT_BSC_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_LOG_LEVEL -#define ANT_BSC_LOG_LEVEL 3 -#endif - -// ANT_BSC_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_INFO_COLOR -#define ANT_BSC_INFO_COLOR 0 -#endif - -// - -// ANT_BSC_COMBINED_PAGE_0_LOG_ENABLED - Enables logging of BSC Combined page 0 in the module. -//========================================================== -#ifndef ANT_BSC_COMBINED_PAGE_0_LOG_ENABLED -#define ANT_BSC_COMBINED_PAGE_0_LOG_ENABLED 0 -#endif -// ANT_BSC_COMBINED_PAGE_0_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_COMBINED_PAGE_0_LOG_LEVEL -#define ANT_BSC_COMBINED_PAGE_0_LOG_LEVEL 3 -#endif - -// ANT_BSC_COMBINED_PAGE_0_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_COMBINED_PAGE_0_INFO_COLOR -#define ANT_BSC_COMBINED_PAGE_0_INFO_COLOR 0 -#endif - -// - -// ANT_BSC_PAGE_0_LOG_ENABLED - Enables logging of BSC page 0 in the module. -//========================================================== -#ifndef ANT_BSC_PAGE_0_LOG_ENABLED -#define ANT_BSC_PAGE_0_LOG_ENABLED 0 -#endif -// ANT_BSC_PAGE_0_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_PAGE_0_LOG_LEVEL -#define ANT_BSC_PAGE_0_LOG_LEVEL 3 -#endif - -// ANT_BSC_PAGE_0_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_PAGE_0_INFO_COLOR -#define ANT_BSC_PAGE_0_INFO_COLOR 0 -#endif - -// - -// ANT_BSC_PAGE_1_LOG_ENABLED - Enables logging of BSC page 1 in the module. -//========================================================== -#ifndef ANT_BSC_PAGE_1_LOG_ENABLED -#define ANT_BSC_PAGE_1_LOG_ENABLED 0 -#endif -// ANT_BSC_PAGE_1_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_PAGE_1_LOG_LEVEL -#define ANT_BSC_PAGE_1_LOG_LEVEL 3 -#endif - -// ANT_BSC_PAGE_1_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_PAGE_1_INFO_COLOR -#define ANT_BSC_PAGE_1_INFO_COLOR 0 -#endif - -// - -// ANT_BSC_PAGE_2_LOG_ENABLED - Enables logging of BSC page 2 in the module. -//========================================================== -#ifndef ANT_BSC_PAGE_2_LOG_ENABLED -#define ANT_BSC_PAGE_2_LOG_ENABLED 0 -#endif -// ANT_BSC_PAGE_2_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_PAGE_2_LOG_LEVEL -#define ANT_BSC_PAGE_2_LOG_LEVEL 3 -#endif - -// ANT_BSC_PAGE_2_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_PAGE_2_INFO_COLOR -#define ANT_BSC_PAGE_2_INFO_COLOR 0 -#endif - -// - -// ANT_BSC_PAGE_3_LOG_ENABLED - Enables logging of BSC page 3 in the module. -//========================================================== -#ifndef ANT_BSC_PAGE_3_LOG_ENABLED -#define ANT_BSC_PAGE_3_LOG_ENABLED 0 -#endif -// ANT_BSC_PAGE_3_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_PAGE_3_LOG_LEVEL -#define ANT_BSC_PAGE_3_LOG_LEVEL 3 -#endif - -// ANT_BSC_PAGE_3_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_PAGE_3_INFO_COLOR -#define ANT_BSC_PAGE_3_INFO_COLOR 0 -#endif - -// - -// ANT_BSC_PAGE_4_LOG_ENABLED - Enables logging of BSC page 4 in the module. -//========================================================== -#ifndef ANT_BSC_PAGE_4_LOG_ENABLED -#define ANT_BSC_PAGE_4_LOG_ENABLED 0 -#endif -// ANT_BSC_PAGE_4_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_PAGE_4_LOG_LEVEL -#define ANT_BSC_PAGE_4_LOG_LEVEL 3 -#endif - -// ANT_BSC_PAGE_4_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_PAGE_4_INFO_COLOR -#define ANT_BSC_PAGE_4_INFO_COLOR 0 -#endif - -// - -// ANT_BSC_PAGE_5_LOG_ENABLED - Enables logging of BSC page 5 in the module. -//========================================================== -#ifndef ANT_BSC_PAGE_5_LOG_ENABLED -#define ANT_BSC_PAGE_5_LOG_ENABLED 0 -#endif -// ANT_BSC_PAGE_5_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_PAGE_5_LOG_LEVEL -#define ANT_BSC_PAGE_5_LOG_LEVEL 3 -#endif - -// ANT_BSC_PAGE_5_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_PAGE_5_INFO_COLOR -#define ANT_BSC_PAGE_5_INFO_COLOR 0 -#endif - -// - -// - -// ANT_CHANNEL_CONFIG_ENABLED - ant_channel_config - ANT common channel configuration - - -#ifndef ANT_CHANNEL_CONFIG_ENABLED -#define ANT_CHANNEL_CONFIG_ENABLED 0 -#endif - -// ANT_COMMON_PAGE_70_ENABLED - ant_common_page_70 - ANT+ common page 70 -//========================================================== -#ifndef ANT_COMMON_PAGE_70_ENABLED -#define ANT_COMMON_PAGE_70_ENABLED 0 -#endif -// ANT_COMMON_PAGE_70_LOG_ENABLED - Enables logging of common page 70 in the module. -//========================================================== -#ifndef ANT_COMMON_PAGE_70_LOG_ENABLED -#define ANT_COMMON_PAGE_70_LOG_ENABLED 0 -#endif -// ANT_COMMON_PAGE_70_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_COMMON_PAGE_70_LOG_LEVEL -#define ANT_COMMON_PAGE_70_LOG_LEVEL 3 -#endif - -// ANT_COMMON_PAGE_70_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_COMMON_PAGE_70_INFO_COLOR -#define ANT_COMMON_PAGE_70_INFO_COLOR 0 -#endif - -// - -// - -// ANT_COMMON_PAGE_80_ENABLED - ant_common_page_80 - ANT+ common page 80 -//========================================================== -#ifndef ANT_COMMON_PAGE_80_ENABLED -#define ANT_COMMON_PAGE_80_ENABLED 0 -#endif -// ANT_COMMON_PAGE_80_LOG_ENABLED - Enables logging of common page 80 in the module. -//========================================================== -#ifndef ANT_COMMON_PAGE_80_LOG_ENABLED -#define ANT_COMMON_PAGE_80_LOG_ENABLED 0 -#endif -// ANT_COMMON_PAGE_80_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_COMMON_PAGE_80_LOG_LEVEL -#define ANT_COMMON_PAGE_80_LOG_LEVEL 3 -#endif - -// ANT_COMMON_PAGE_80_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_COMMON_PAGE_80_INFO_COLOR -#define ANT_COMMON_PAGE_80_INFO_COLOR 0 -#endif - -// - -// - -// ANT_COMMON_PAGE_81_ENABLED - ant_common_page_81 - ANT+ common page 81 -//========================================================== -#ifndef ANT_COMMON_PAGE_81_ENABLED -#define ANT_COMMON_PAGE_81_ENABLED 0 -#endif -// ANT_COMMON_PAGE_81_LOG_ENABLED - Enables logging of common page 81 in the module. -//========================================================== -#ifndef ANT_COMMON_PAGE_81_LOG_ENABLED -#define ANT_COMMON_PAGE_81_LOG_ENABLED 0 -#endif -// ANT_COMMON_PAGE_81_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_COMMON_PAGE_81_LOG_LEVEL -#define ANT_COMMON_PAGE_81_LOG_LEVEL 3 -#endif - -// ANT_COMMON_PAGE_81_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_COMMON_PAGE_81_INFO_COLOR -#define ANT_COMMON_PAGE_81_INFO_COLOR 0 -#endif - -// - -// - -// ANT_ENCRYPT_CONFIG_ENABLED - ant_encrypt_config - Cryptographic ANT stack configuration - - -#ifndef ANT_ENCRYPT_CONFIG_ENABLED -#define ANT_ENCRYPT_CONFIG_ENABLED 0 -#endif - -// ANT_HRM_ENABLED - ant_hrm - Heart Rate Monitor Profile -//========================================================== -#ifndef ANT_HRM_ENABLED -#define ANT_HRM_ENABLED 0 -#endif -// ANT_HRM_LOG_ENABLED - Enables general logging in the module. -//========================================================== -#ifndef ANT_HRM_LOG_ENABLED -#define ANT_HRM_LOG_ENABLED 0 -#endif -// ANT_HRM_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_HRM_LOG_LEVEL -#define ANT_HRM_LOG_LEVEL 3 -#endif - -// ANT_HRM_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_HRM_INFO_COLOR -#define ANT_HRM_INFO_COLOR 0 -#endif - -// - -// ANT_HRM_PAGE_0_LOG_ENABLED - Enables logging of HRM page 0 in the module. -//========================================================== -#ifndef ANT_HRM_PAGE_0_LOG_ENABLED -#define ANT_HRM_PAGE_0_LOG_ENABLED 0 -#endif -// ANT_HRM_PAGE_0_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_HRM_PAGE_0_LOG_LEVEL -#define ANT_HRM_PAGE_0_LOG_LEVEL 3 -#endif - -// ANT_HRM_PAGE_0_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_HRM_PAGE_0_INFO_COLOR -#define ANT_HRM_PAGE_0_INFO_COLOR 0 -#endif - -// - -// ANT_HRM_PAGE_1_LOG_ENABLED - Enables logging of HRM page 1 in the module. -//========================================================== -#ifndef ANT_HRM_PAGE_1_LOG_ENABLED -#define ANT_HRM_PAGE_1_LOG_ENABLED 0 -#endif -// ANT_HRM_PAGE_1_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_HRM_PAGE_1_LOG_LEVEL -#define ANT_HRM_PAGE_1_LOG_LEVEL 3 -#endif - -// ANT_HRM_PAGE_1_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_HRM_PAGE_1_INFO_COLOR -#define ANT_HRM_PAGE_1_INFO_COLOR 0 -#endif - -// - -// ANT_HRM_PAGE_2_LOG_ENABLED - Enables logging of HRM page 2 in the module. -//========================================================== -#ifndef ANT_HRM_PAGE_2_LOG_ENABLED -#define ANT_HRM_PAGE_2_LOG_ENABLED 0 -#endif -// ANT_HRM_PAGE_2_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_HRM_PAGE_2_LOG_LEVEL -#define ANT_HRM_PAGE_2_LOG_LEVEL 3 -#endif - -// ANT_HRM_PAGE_2_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_HRM_PAGE_2_INFO_COLOR -#define ANT_HRM_PAGE_2_INFO_COLOR 0 -#endif - -// - -// ANT_HRM_PAGE_3_LOG_ENABLED - Enables logging of HRM page 3 in the module. -//========================================================== -#ifndef ANT_HRM_PAGE_3_LOG_ENABLED -#define ANT_HRM_PAGE_3_LOG_ENABLED 0 -#endif -// ANT_HRM_PAGE_3_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_HRM_PAGE_3_LOG_LEVEL -#define ANT_HRM_PAGE_3_LOG_LEVEL 3 -#endif - -// ANT_HRM_PAGE_3_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_HRM_PAGE_3_INFO_COLOR -#define ANT_HRM_PAGE_3_INFO_COLOR 0 -#endif - -// - -// ANT_HRM_PAGE_4_LOG_ENABLED - Enables logging of HRM page 4 in the module. -//========================================================== -#ifndef ANT_HRM_PAGE_4_LOG_ENABLED -#define ANT_HRM_PAGE_4_LOG_ENABLED 0 -#endif -// ANT_HRM_PAGE_4_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_HRM_PAGE_4_LOG_LEVEL -#define ANT_HRM_PAGE_4_LOG_LEVEL 3 -#endif - -// ANT_HRM_PAGE_4_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_HRM_PAGE_4_INFO_COLOR -#define ANT_HRM_PAGE_4_INFO_COLOR 0 -#endif - -// - -// - -// ANT_KEY_MANAGER_ENABLED - ant_key_manager - Software Component - - -#ifndef ANT_KEY_MANAGER_ENABLED -#define ANT_KEY_MANAGER_ENABLED 0 -#endif - -// ANT_REQUEST_CONTROLLER_ENABLED - ant_request_controller - ANT+ request controller - - -#ifndef ANT_REQUEST_CONTROLLER_ENABLED -#define ANT_REQUEST_CONTROLLER_ENABLED 0 -#endif - -// ANT_SDM_ENABLED - ant_sdm - Stride Based Speed and Distance Monitor Profile -//========================================================== -#ifndef ANT_SDM_ENABLED -#define ANT_SDM_ENABLED 0 -#endif -// ANT_SDM_LOG_ENABLED - Enables general logging in the module. -//========================================================== -#ifndef ANT_SDM_LOG_ENABLED -#define ANT_SDM_LOG_ENABLED 0 -#endif -// ANT_SDM_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_SDM_LOG_LEVEL -#define ANT_SDM_LOG_LEVEL 3 -#endif - -// ANT_SDM_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_SDM_INFO_COLOR -#define ANT_SDM_INFO_COLOR 0 -#endif - -// - -// - -// ANT_SEARCH_CONFIG_ENABLED - ant_search_config - ANT common search configuration -//========================================================== -#ifndef ANT_SEARCH_CONFIG_ENABLED -#define ANT_SEARCH_CONFIG_ENABLED 0 -#endif -// ANT_DEFAULT_LOW_PRIORITY_TIMEOUT - Default low priority search time-out. <0-255> - - -#ifndef ANT_DEFAULT_LOW_PRIORITY_TIMEOUT -#define ANT_DEFAULT_LOW_PRIORITY_TIMEOUT 2 -#endif - -// ANT_DEFAULT_HIGH_PRIORITY_TIMEOUT - Default high priority search time-out. <0-255> - - -#ifndef ANT_DEFAULT_HIGH_PRIORITY_TIMEOUT -#define ANT_DEFAULT_HIGH_PRIORITY_TIMEOUT 10 -#endif - -// - -// ANT_STACK_CONFIG_ENABLED - ant_stack_config - Common ANT stack configuration -//========================================================== -#ifndef ANT_STACK_CONFIG_ENABLED -#define ANT_STACK_CONFIG_ENABLED 0 -#endif -// ANT_CONFIG_TOTAL_CHANNELS_ALLOCATED - Allocated ANT channels -#ifndef ANT_CONFIG_TOTAL_CHANNELS_ALLOCATED -#define ANT_CONFIG_TOTAL_CHANNELS_ALLOCATED 0 -#endif - -// ANT_CONFIG_ENCRYPTED_CHANNELS - Encrypted ANT channels -#ifndef ANT_CONFIG_ENCRYPTED_CHANNELS -#define ANT_CONFIG_ENCRYPTED_CHANNELS 0 -#endif - -// ANT_CONFIG_EVENT_QUEUE_SIZE - Event queue size -#ifndef ANT_CONFIG_EVENT_QUEUE_SIZE -#define ANT_CONFIG_EVENT_QUEUE_SIZE 32 -#endif - -// ANT_CONFIG_BURST_QUEUE_SIZE - ANT burst queue size -#ifndef ANT_CONFIG_BURST_QUEUE_SIZE -#define ANT_CONFIG_BURST_QUEUE_SIZE 128 -#endif - -// - -// ANT_STATE_INDICATOR_ENABLED - ant_state_indicator - ANT state indicator using BSP -//========================================================== -#ifndef ANT_STATE_INDICATOR_ENABLED -#define ANT_STATE_INDICATOR_ENABLED 0 -#endif -// ANT_STATE_INDICATOR_CONFIG_SHUTDOWN_HANDLER_PRIORITY - Shutdown observer priority. -#ifndef ANT_STATE_INDICATOR_CONFIG_SHUTDOWN_HANDLER_PRIORITY -#define ANT_STATE_INDICATOR_CONFIG_SHUTDOWN_HANDLER_PRIORITY 1 -#endif - -// - -// -//========================================================== // nRF_BLE //========================================================== // BLE_ADVERTISING_ENABLED - ble_advertising - Advertising module - + #ifndef BLE_ADVERTISING_ENABLED #define BLE_ADVERTISING_ENABLED 0 #endif // BLE_DTM_ENABLED - ble_dtm - Module for testing RF/PHY using DTM commands - + #ifndef BLE_DTM_ENABLED #define BLE_DTM_ENABLED 0 #endif // BLE_RACP_ENABLED - ble_racp - Record Access Control Point library - + #ifndef BLE_RACP_ENABLED #define BLE_RACP_ENABLED 0 #endif -// NRF_BLE_CONN_PARAMS_ENABLED - ble_conn_params - Initiating and executing a connection parameters negotiation procedure +// NRF_BLE_QWR_ENABLED - nrf_ble_qwr - Queued writes support module (prepare/execute write) //========================================================== -#ifndef NRF_BLE_CONN_PARAMS_ENABLED -#define NRF_BLE_CONN_PARAMS_ENABLED 0 -#endif -// NRF_BLE_CONN_PARAMS_MAX_SLAVE_LATENCY_DEVIATION - The largest acceptable deviation in slave latency. -// The largest deviation (+ or -) from the requested slave latency that will not be renegotiated. - -#ifndef NRF_BLE_CONN_PARAMS_MAX_SLAVE_LATENCY_DEVIATION -#define NRF_BLE_CONN_PARAMS_MAX_SLAVE_LATENCY_DEVIATION 499 -#endif - -// NRF_BLE_CONN_PARAMS_MAX_SUPERVISION_TIMEOUT_DEVIATION - The largest acceptable deviation (in 10 ms units) in supervision timeout. -// The largest deviation (+ or -, in 10 ms units) from the requested supervision timeout that will not be renegotiated. - -#ifndef NRF_BLE_CONN_PARAMS_MAX_SUPERVISION_TIMEOUT_DEVIATION -#define NRF_BLE_CONN_PARAMS_MAX_SUPERVISION_TIMEOUT_DEVIATION 65535 -#endif - -// - -// NRF_BLE_QWR_ENABLED - nrf_ble_qwr - Queued writes support module (prepare/execute write) - - #ifndef NRF_BLE_QWR_ENABLED #define NRF_BLE_QWR_ENABLED 0 #endif +// NRF_BLE_QWR_MAX_ATTR - Maximum number of attribute handles that can be registered. This number must be adjusted according to the number of attributes for which Queued Writes will be enabled. If it is zero, the module will reject all Queued Write requests. +#ifndef NRF_BLE_QWR_MAX_ATTR +#define NRF_BLE_QWR_MAX_ATTR 0 +#endif + +// // PEER_MANAGER_ENABLED - peer_manager - Peer Manager //========================================================== #ifndef PEER_MANAGER_ENABLED #define PEER_MANAGER_ENABLED 0 #endif -// PM_MAX_REGISTRANTS -// Number of event handlers that can be registered. - +// PM_MAX_REGISTRANTS - Number of event handlers that can be registered. #ifndef PM_MAX_REGISTRANTS #define PM_MAX_REGISTRANTS 3 #endif -// PM_FLASH_BUFFERS -// Number of internal buffers for flash operations. +// PM_FLASH_BUFFERS - Number of internal buffers for flash operations. // Decrease this value to lower RAM usage. #ifndef PM_FLASH_BUFFERS -#define PM_FLASH_BUFFERS 8 +#define PM_FLASH_BUFFERS 2 +#endif + +// PM_CENTRAL_ENABLED - Enable/disable central-specific Peer Manager functionality. + + +// Enable/disable central-specific Peer Manager functionality. + +#ifndef PM_CENTRAL_ENABLED +#define PM_CENTRAL_ENABLED 1 +#endif + +// PM_SERVICE_CHANGED_ENABLED - Enable/disable the service changed management for GATT server in Peer Manager. + + +// If not using a GATT server, or using a server wihout a service changed characteristic, +// disable this to save code space. + +#ifndef PM_SERVICE_CHANGED_ENABLED +#define PM_SERVICE_CHANGED_ENABLED 1 +#endif + +// PM_PEER_RANKS_ENABLED - Enable/disable the peer rank management in Peer Manager. + + +// Set this to false to save code space if not using the peer rank API. + +#ifndef PM_PEER_RANKS_ENABLED +#define PM_PEER_RANKS_ENABLED 1 #endif // -// +// //========================================================== -// nRF_BLE_Services +// nRF_BLE_Services //========================================================== // BLE_ANCS_C_ENABLED - ble_ancs_c - Apple Notification Service Client - + #ifndef BLE_ANCS_C_ENABLED #define BLE_ANCS_C_ENABLED 0 #endif // BLE_ANS_C_ENABLED - ble_ans_c - Alert Notification Service Client - + #ifndef BLE_ANS_C_ENABLED #define BLE_ANS_C_ENABLED 0 #endif // BLE_BAS_C_ENABLED - ble_bas_c - Battery Service Client - + #ifndef BLE_BAS_C_ENABLED #define BLE_BAS_C_ENABLED 0 #endif -// BLE_BAS_ENABLED - ble_bas - Battery Service - - +// BLE_BAS_ENABLED - ble_bas - Battery Service +//========================================================== #ifndef BLE_BAS_ENABLED #define BLE_BAS_ENABLED 0 #endif +// BLE_BAS_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef BLE_BAS_CONFIG_LOG_ENABLED +#define BLE_BAS_CONFIG_LOG_ENABLED 0 +#endif +// BLE_BAS_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef BLE_BAS_CONFIG_LOG_LEVEL +#define BLE_BAS_CONFIG_LOG_LEVEL 3 +#endif + +// BLE_BAS_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef BLE_BAS_CONFIG_INFO_COLOR +#define BLE_BAS_CONFIG_INFO_COLOR 0 +#endif + +// BLE_BAS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef BLE_BAS_CONFIG_DEBUG_COLOR +#define BLE_BAS_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// // BLE_CSCS_ENABLED - ble_cscs - Cycling Speed and Cadence Service - + #ifndef BLE_CSCS_ENABLED #define BLE_CSCS_ENABLED 0 #endif // BLE_CTS_C_ENABLED - ble_cts_c - Current Time Service Client - + #ifndef BLE_CTS_C_ENABLED #define BLE_CTS_C_ENABLED 0 #endif // BLE_DIS_ENABLED - ble_dis - Device Information Service - + #ifndef BLE_DIS_ENABLED #define BLE_DIS_ENABLED 0 #endif // BLE_GLS_ENABLED - ble_gls - Glucose Service - + #ifndef BLE_GLS_ENABLED #define BLE_GLS_ENABLED 0 #endif // BLE_HIDS_ENABLED - ble_hids - Human Interface Device Service - + #ifndef BLE_HIDS_ENABLED #define BLE_HIDS_ENABLED 0 #endif // BLE_HRS_C_ENABLED - ble_hrs_c - Heart Rate Service Client - + #ifndef BLE_HRS_C_ENABLED #define BLE_HRS_C_ENABLED 0 #endif // BLE_HRS_ENABLED - ble_hrs - Heart Rate Service - + #ifndef BLE_HRS_ENABLED #define BLE_HRS_ENABLED 0 #endif // BLE_HTS_ENABLED - ble_hts - Health Thermometer Service - + #ifndef BLE_HTS_ENABLED #define BLE_HTS_ENABLED 0 #endif // BLE_IAS_C_ENABLED - ble_ias_c - Immediate Alert Service Client - + #ifndef BLE_IAS_C_ENABLED #define BLE_IAS_C_ENABLED 0 #endif -// BLE_IAS_ENABLED - ble_ias - Immediate Alert Service - - +// BLE_IAS_ENABLED - ble_ias - Immediate Alert Service +//========================================================== #ifndef BLE_IAS_ENABLED #define BLE_IAS_ENABLED 0 #endif +// BLE_IAS_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef BLE_IAS_CONFIG_LOG_ENABLED +#define BLE_IAS_CONFIG_LOG_ENABLED 0 +#endif +// BLE_IAS_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef BLE_IAS_CONFIG_LOG_LEVEL +#define BLE_IAS_CONFIG_LOG_LEVEL 3 +#endif + +// BLE_IAS_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef BLE_IAS_CONFIG_INFO_COLOR +#define BLE_IAS_CONFIG_INFO_COLOR 0 +#endif + +// BLE_IAS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef BLE_IAS_CONFIG_DEBUG_COLOR +#define BLE_IAS_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// // BLE_LBS_C_ENABLED - ble_lbs_c - Nordic LED Button Service Client - + #ifndef BLE_LBS_C_ENABLED #define BLE_LBS_C_ENABLED 0 #endif // BLE_LBS_ENABLED - ble_lbs - LED Button Service - + #ifndef BLE_LBS_ENABLED #define BLE_LBS_ENABLED 0 #endif // BLE_LLS_ENABLED - ble_lls - Link Loss Service - + #ifndef BLE_LLS_ENABLED #define BLE_LLS_ENABLED 0 #endif // BLE_NUS_C_ENABLED - ble_nus_c - Nordic UART Central Service - + #ifndef BLE_NUS_C_ENABLED #define BLE_NUS_C_ENABLED 0 #endif -// BLE_NUS_ENABLED - ble_nus - Nordic UART Service - - +// BLE_NUS_ENABLED - ble_nus - Nordic UART Service +//========================================================== #ifndef BLE_NUS_ENABLED #define BLE_NUS_ENABLED 0 #endif +// BLE_NUS_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef BLE_NUS_CONFIG_LOG_ENABLED +#define BLE_NUS_CONFIG_LOG_ENABLED 0 +#endif +// BLE_NUS_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef BLE_NUS_CONFIG_LOG_LEVEL +#define BLE_NUS_CONFIG_LOG_LEVEL 3 +#endif + +// BLE_NUS_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef BLE_NUS_CONFIG_INFO_COLOR +#define BLE_NUS_CONFIG_INFO_COLOR 0 +#endif + +// BLE_NUS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef BLE_NUS_CONFIG_DEBUG_COLOR +#define BLE_NUS_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// // BLE_RSCS_C_ENABLED - ble_rscs_c - Running Speed and Cadence Client - + #ifndef BLE_RSCS_C_ENABLED #define BLE_RSCS_C_ENABLED 0 #endif // BLE_RSCS_ENABLED - ble_rscs - Running Speed and Cadence Service - + #ifndef BLE_RSCS_ENABLED #define BLE_RSCS_ENABLED 0 #endif // BLE_TPS_ENABLED - ble_tps - TX Power Service - + #ifndef BLE_TPS_ENABLED #define BLE_TPS_ENABLED 0 #endif -// +// //========================================================== -// nRF_Core +// nRF_Core //========================================================== // NRF_MPU_ENABLED - nrf_mpu - Module for MPU @@ -1430,10 +454,10 @@ #define NRF_MPU_ENABLED 0 #endif // NRF_MPU_CLI_CMDS - Enable CLI commands specific to the module - + #ifndef NRF_MPU_CLI_CMDS -#define NRF_MPU_CLI_CMDS 1 +#define NRF_MPU_CLI_CMDS 0 #endif // @@ -1444,15 +468,15 @@ #define NRF_STACK_GUARD_ENABLED 0 #endif // NRF_STACK_GUARD_CONFIG_SIZE - Size of stack guard - -// <5=> 32 bytes -// <6=> 64 bytes -// <7=> 128 bytes -// <8=> 256 bytes -// <9=> 512 bytes -// <10=> 1024 bytes -// <11=> 2048 bytes -// <12=> 4096 bytes + +// <5=> 32 bytes +// <6=> 64 bytes +// <7=> 128 bytes +// <8=> 256 bytes +// <9=> 512 bytes +// <10=> 1024 bytes +// <11=> 2048 bytes +// <12=> 4096 bytes #ifndef NRF_STACK_GUARD_CONFIG_SIZE #define NRF_STACK_GUARD_CONFIG_SIZE 7 @@ -1460,240 +484,749 @@ // -// +// //========================================================== -// nRF_Crypto +// nRF_Crypto //========================================================== // NRF_CRYPTO_ENABLED - nrf_crypto - Cryptography library //========================================================== #ifndef NRF_CRYPTO_ENABLED -#define NRF_CRYPTO_ENABLED 0 +#define NRF_CRYPTO_ENABLED 1 #endif -// NRF_CRYPTO_BACKEND_CC310_LIB - Enable the ARM Cryptocell CC310 backend +// NRF_CRYPTO_ALLOCATOR - Memory allocator + +// Choose memory allocator used by nrf_crypto. Default is alloca if possible or nrf_malloc otherwise. If 'User macros' are selected then user have to create 'nrf_crypto_allocator.h' file containing NRF_CRYPTO_ALLOC, NRF_CRYPTO_FREE and NRF_CRYPTO_ALLOC_ON_STACK +// <0=> Default +// <1=> User macros +// <2=> On stack (alloca) +// <3=> C dynamic memory (malloc) +// <4=> SDK Memory Manager (nrf_malloc) -// The hardware-accelerated cryptography backend is available only on nRF52840. - -#ifndef NRF_CRYPTO_BACKEND_CC310_LIB -#define NRF_CRYPTO_BACKEND_CC310_LIB 1 +#ifndef NRF_CRYPTO_ALLOCATOR +#define NRF_CRYPTO_ALLOCATOR 0 #endif -// NRF_CRYPTO_BACKEND_MICRO_ECC - Enable the micro-ecc software backend +// NRF_CRYPTO_BACKEND_CC310_BL_ENABLED - Enable the ARM Cryptocell CC310 reduced backend. -// The micro-ecc library provides a software implementation of ECC cryptography for nRF5 Series devices. +// The CC310 hardware-accelerated cryptography backend with reduced functionality and footprint (only available on nRF52840). //========================================================== -#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC -#define NRF_CRYPTO_BACKEND_MICRO_ECC 0 +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_BL_ENABLED 0 #endif -// NRF_CRYPTO_BACKEND_MICRO_ECC_SHA256 - Enable SHA256 +// NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP224R1_ENABLED - Enable the secp224r1 elliptic curve support using CC310_BL. + - -// Enable SHA256 cryptographic hash functionality. -// Enable this setting if you need SHA256 support, for example to verify signatures. - -#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_SHA256 -#define NRF_CRYPTO_BACKEND_MICRO_ECC_SHA256 1 +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP224R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP224R1_ENABLED 0 #endif -// NRF_CRYPTO_BACKEND_MICRO_ECC_RNG - Enable random number generator +// NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP256R1_ENABLED - Enable the secp256r1 elliptic curve support using CC310_BL. + +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP256R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP256R1_ENABLED 1 +#endif -// Enable random number generation. -// Enable this setting if you need to generate cryptographic keys. -// This setting requires the RNG peripheral driver to be present. +// NRF_CRYPTO_BACKEND_CC310_BL_HASH_SHA256_ENABLED - CC310_BL SHA-256 hash functionality. + -#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_RNG -#define NRF_CRYPTO_BACKEND_MICRO_ECC_RNG 0 +// CC310_BL backend implementation for hardware-accelerated SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_HASH_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_BL_HASH_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_BL_HASH_LITTLE_ENDIAN_DIGEST_ENABLED - nrf_cc310_bl hash outputs digests in little endian + + +// Makes the nRF SH hash functions output digests in little endian format. Only for use in nRF SDK DFU! + +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_HASH_LITTLE_ENDIAN_DIGEST_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_BL_HASH_LITTLE_ENDIAN_DIGEST_ENABLED 0 +#endif + +// NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_ENABLED - nrf_cc310_bl buffers to RAM before running hash operation + + +// Enabling this makes hashing of addresses in FLASH range possible. Size of buffer allocated for hashing is set by NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_SIZE + +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_ENABLED 0 +#endif + +// NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_SIZE - nrf_cc310_bl hash outputs digests in little endian +// Makes the nrf_cc310_bl hash functions output digests in little endian format. Only for use in nRF SDK DFU! + +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_SIZE +#define NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_SIZE 4096 +#endif + +// NRF_CRYPTO_BACKEND_CC310_BL_ECC_LITTLE_ENDIAN_ENABLED - Enable non-standard little endian byte order in nrf_cc310_bl ECC functions. + + +// This affects parameters for all nrf_cc310_bl ECC APIs (raw keys, signature, digest). Only for use in nRF SDK DFU! + +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_ECC_LITTLE_ENDIAN_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_BL_ECC_LITTLE_ENDIAN_ENABLED 0 +#endif + +// + +// NRF_CRYPTO_BACKEND_CC310_ENABLED - Enable the ARM Cryptocell CC310 backend. + +// The CC310 hardware-accelerated cryptography backend (only available on nRF52840). +//========================================================== +#ifndef NRF_CRYPTO_BACKEND_CC310_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ENABLED 0 +#endif +// NRF_CRYPTO_BACKEND_CC310_AES_CBC_ENABLED - Enable the AES CBC mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_AES_CBC_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_AES_CBC_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_AES_CTR_ENABLED - Enable the AES CTR mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_AES_CTR_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_AES_CTR_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_AES_ECB_ENABLED - Enable the AES ECB mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_AES_ECB_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_AES_ECB_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_AES_CBC_MAC_ENABLED - Enable the AES CBC_MAC mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_AES_CBC_MAC_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_AES_CBC_MAC_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_AES_CMAC_ENABLED - Enable the AES CMAC mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_AES_CMAC_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_AES_CMAC_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_AES_CCM_ENABLED - Enable the AES CCM mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_AES_CCM_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_AES_CCM_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_AES_CCM_STAR_ENABLED - Enable the AES CCM* mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_AES_CCM_STAR_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_AES_CCM_STAR_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_CHACHA_POLY_ENABLED - Enable the CHACHA-POLY mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_CHACHA_POLY_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_CHACHA_POLY_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R1_ENABLED - Enable the secp160r1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R2_ENABLED - Enable the secp160r2 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R2_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R2_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP192R1_ENABLED - Enable the secp192r1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP192R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP192R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP224R1_ENABLED - Enable the secp224r1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP224R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP224R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP256R1_ENABLED - Enable the secp256r1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP256R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP256R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP384R1_ENABLED - Enable the secp384r1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP384R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP384R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP521R1_ENABLED - Enable the secp521r1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP521R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP521R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP160K1_ENABLED - Enable the secp160k1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP160K1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP160K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP192K1_ENABLED - Enable the secp192k1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP192K1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP192K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP224K1_ENABLED - Enable the secp224k1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP224K1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP224K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP256K1_ENABLED - Enable the secp256k1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP256K1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP256K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_HASH_SHA256_ENABLED - CC310 SHA-256 hash functionality. + + +// CC310 backend implementation for hardware-accelerated SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_CC310_HASH_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_HASH_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_HASH_SHA512_ENABLED - CC310 SHA-512 hash functionality + + +// CC310 backend implementation for SHA-512 (in software). + +#ifndef NRF_CRYPTO_BACKEND_CC310_HASH_SHA512_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_HASH_SHA512_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_HMAC_SHA256_ENABLED - CC310 HMAC using SHA-256 + + +// CC310 backend implementation for HMAC using hardware-accelerated SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_CC310_HMAC_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_HMAC_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_HMAC_SHA512_ENABLED - CC310 HMAC using SHA-512 + + +// CC310 backend implementation for HMAC using SHA-512 (in software). + +#ifndef NRF_CRYPTO_BACKEND_CC310_HMAC_SHA512_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_HMAC_SHA512_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_RNG_ENABLED - Enable RNG support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_RNG_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_RNG_ENABLED 1 +#endif + +// + +// NRF_CRYPTO_BACKEND_CIFRA_ENABLED - Enable the Cifra backend. +//========================================================== +#ifndef NRF_CRYPTO_BACKEND_CIFRA_ENABLED +#define NRF_CRYPTO_BACKEND_CIFRA_ENABLED 0 +#endif +// NRF_CRYPTO_BACKEND_CIFRA_AES_EAX_ENABLED - Enable the AES EAX mode using Cifra. + + +#ifndef NRF_CRYPTO_BACKEND_CIFRA_AES_EAX_ENABLED +#define NRF_CRYPTO_BACKEND_CIFRA_AES_EAX_ENABLED 1 +#endif + +// + +// NRF_CRYPTO_BACKEND_MBEDTLS_ENABLED - Enable the mbed TLS backend. +//========================================================== +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ENABLED 0 +#endif +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_ENABLED - Enable the AES CBC mode mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_CTR_ENABLED - Enable the AES CTR mode using mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CTR_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CTR_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_CFB_ENABLED - Enable the AES CFB mode using mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CFB_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CFB_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_ECB_ENABLED - Enable the AES ECB mode using mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_ECB_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_ECB_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_MAC_ENABLED - Enable the AES CBC MAC mode using mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_MAC_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_MAC_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_CMAC_ENABLED - Enable the AES CMAC mode using mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CMAC_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CMAC_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_CCM_ENABLED - Enable the AES CCM mode using mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CCM_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CCM_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_GCM_ENABLED - Enable the AES GCM mode using mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_GCM_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_GCM_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192R1_ENABLED - Enable secp192r1 (NIST 192-bit) curve + + +// Enable this setting if you need secp192r1 (NIST 192-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224R1_ENABLED - Enable secp224r1 (NIST 224-bit) curve + + +// Enable this setting if you need secp224r1 (NIST 224-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256R1_ENABLED - Enable secp256r1 (NIST 256-bit) curve + + +// Enable this setting if you need secp256r1 (NIST 256-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP384R1_ENABLED - Enable secp384r1 (NIST 384-bit) curve + + +// Enable this setting if you need secp384r1 (NIST 384-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP384R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP384R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP521R1_ENABLED - Enable secp521r1 (NIST 521-bit) curve + + +// Enable this setting if you need secp521r1 (NIST 521-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP521R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP521R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192K1_ENABLED - Enable secp192k1 (Koblitz 192-bit) curve + + +// Enable this setting if you need secp192k1 (Koblitz 192-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192K1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224K1_ENABLED - Enable secp224k1 (Koblitz 224-bit) curve + + +// Enable this setting if you need secp224k1 (Koblitz 224-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224K1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256K1_ENABLED - Enable secp256k1 (Koblitz 256-bit) curve + + +// Enable this setting if you need secp256k1 (Koblitz 256-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256K1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP256R1_ENABLED - Enable bp256r1 (Brainpool 256-bit) curve + + +// Enable this setting if you need bp256r1 (Brainpool 256-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP256R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP256R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP384R1_ENABLED - Enable bp384r1 (Brainpool 384-bit) curve + + +// Enable this setting if you need bp384r1 (Brainpool 384-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP384R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP384R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP512R1_ENABLED - Enable bp512r1 (Brainpool 512-bit) curve + + +// Enable this setting if you need bp512r1 (Brainpool 512-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP512R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP512R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_CURVE25519_ENABLED - Enable Curve25519 curve + + +// Enable this setting if you need Curve25519 support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_CURVE25519_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_CURVE25519_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA256_ENABLED - Enable mbed TLS SHA-256 hash functionality. + + +// mbed TLS backend implementation for SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA512_ENABLED - Enable mbed TLS SHA-512 hash functionality. + + +// mbed TLS backend implementation for SHA-512. + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA512_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA512_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA256_ENABLED - Enable mbed TLS HMAC using SHA-256. + + +// mbed TLS backend implementation for HMAC using SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA512_ENABLED - Enable mbed TLS HMAC using SHA-512. + + +// mbed TLS backend implementation for HMAC using SHA-512. + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA512_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA512_ENABLED 1 +#endif + +// + +// NRF_CRYPTO_BACKEND_MICRO_ECC_ENABLED - Enable the micro-ecc backend. +//========================================================== +#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_ENABLED +#define NRF_CRYPTO_BACKEND_MICRO_ECC_ENABLED 0 +#endif +// NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP192R1_ENABLED - Enable secp192r1 (NIST 192-bit) curve + + +// Enable this setting if you need secp192r1 (NIST 192-bit) support using micro-ecc + +#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP192R1_ENABLED +#define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP192R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP224R1_ENABLED - Enable secp224r1 (NIST 224-bit) curve + + +// Enable this setting if you need secp224r1 (NIST 224-bit) support using micro-ecc + +#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP224R1_ENABLED +#define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP224R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256R1_ENABLED - Enable secp256r1 (NIST 256-bit) curve + + +// Enable this setting if you need secp256r1 (NIST 256-bit) support using micro-ecc + +#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256R1_ENABLED +#define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256K1_ENABLED - Enable secp256k1 (Koblitz 256-bit) curve + + +// Enable this setting if you need secp256k1 (Koblitz 256-bit) support using micro-ecc + +#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256K1_ENABLED +#define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MICRO_ECC_PUBLIC_KEY_TRUSTED_ENABLED - Always trust raw public key (it will cause a security issue if the public key comes from an untrusted source) + + +// Enable this setting if you want to reduce flash usage. Only for use in nRF SDK DFU! Never enable it if the raw public key comes from an untrusted source. + +#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_PUBLIC_KEY_TRUSTED_ENABLED +#define NRF_CRYPTO_BACKEND_MICRO_ECC_PUBLIC_KEY_TRUSTED_ENABLED 0 +#endif + +// NRF_CRYPTO_BACKEND_MICRO_ECC_LITTLE_ENDIAN_ENABLED - Enable non-standard little endian byte order. + + +// This affects parameters for all ECC API (raw keys, signature, digest, shared secret). Only for use in nRF SDK DFU! + +#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_LITTLE_ENDIAN_ENABLED +#define NRF_CRYPTO_BACKEND_MICRO_ECC_LITTLE_ENDIAN_ENABLED 0 +#endif + +// + +// NRF_CRYPTO_BACKEND_NRF_HW_RNG_ENABLED - Enable the nRF HW RNG backend. + +// The nRF HW backend provide access to RNG peripheral in nRF5x devices. +//========================================================== +#ifndef NRF_CRYPTO_BACKEND_NRF_HW_RNG_ENABLED +#define NRF_CRYPTO_BACKEND_NRF_HW_RNG_ENABLED 0 +#endif +// NRF_CRYPTO_BACKEND_NRF_HW_RNG_MBEDTLS_CTR_DRBG_ENABLED - Enable mbed TLS CTR-DRBG algorithm. + + +// Enable mbed TLS CTR-DRBG standardized by NIST (NIST SP 800-90A Rev. 1). The nRF HW RNG is used as an entropy source for seeding. + +#ifndef NRF_CRYPTO_BACKEND_NRF_HW_RNG_MBEDTLS_CTR_DRBG_ENABLED +#define NRF_CRYPTO_BACKEND_NRF_HW_RNG_MBEDTLS_CTR_DRBG_ENABLED 1 +#endif + +// + +// NRF_CRYPTO_BACKEND_NRF_SW_ENABLED - Enable the legacy nRFx sw for crypto. + +// The nRF SW cryptography backend (only used in bootloader context). +//========================================================== +#ifndef NRF_CRYPTO_BACKEND_NRF_SW_ENABLED +#define NRF_CRYPTO_BACKEND_NRF_SW_ENABLED 0 +#endif +// NRF_CRYPTO_BACKEND_NRF_SW_HASH_SHA256_ENABLED - nRF SW hash backend support for SHA-256 + + +// The nRF SW backend provide access to nRF SDK legacy hash implementation of SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_NRF_SW_HASH_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_NRF_SW_HASH_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_NRF_SW_HASH_LITTLE_ENDIAN_DIGEST_ENABLED - nRF SW hash outputs digests in little endian + + +// Makes the nRF SH hash functions output digests in little endian format. Only for use in nRF SDK DFU! + +#ifndef NRF_CRYPTO_BACKEND_NRF_SW_HASH_LITTLE_ENDIAN_DIGEST_ENABLED +#define NRF_CRYPTO_BACKEND_NRF_SW_HASH_LITTLE_ENDIAN_DIGEST_ENABLED 1 +#endif + +// + +// NRF_CRYPTO_BACKEND_OBERON_ENABLED - Enable the Oberon backend + +// The Oberon backend +//========================================================== +#ifndef NRF_CRYPTO_BACKEND_OBERON_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_ENABLED 0 +#endif +// NRF_CRYPTO_BACKEND_OBERON_CHACHA_POLY_ENABLED - Enable the CHACHA-POLY mode using Oberon. + + +#ifndef NRF_CRYPTO_BACKEND_OBERON_CHACHA_POLY_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_CHACHA_POLY_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_OBERON_ECC_SECP256R1_ENABLED - Enable secp256r1 curve + + +// Enable this setting if you need secp256r1 curve support using Oberon library + +#ifndef NRF_CRYPTO_BACKEND_OBERON_ECC_SECP256R1_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_ECC_SECP256R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_OBERON_ECC_CURVE25519_ENABLED - Enable Curve25519 ECDH + + +// Enable this setting if you need Curve25519 ECDH support using Oberon library + +#ifndef NRF_CRYPTO_BACKEND_OBERON_ECC_CURVE25519_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_ECC_CURVE25519_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_OBERON_ECC_ED25519_ENABLED - Enable Ed25519 signature scheme + + +// Enable this setting if you need Ed25519 support using Oberon library + +#ifndef NRF_CRYPTO_BACKEND_OBERON_ECC_ED25519_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_ECC_ED25519_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_OBERON_HASH_SHA256_ENABLED - Oberon SHA-256 hash functionality + + +// Oberon backend implementation for SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_OBERON_HASH_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_HASH_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_OBERON_HASH_SHA512_ENABLED - Oberon SHA-512 hash functionality + + +// Oberon backend implementation for SHA-512. + +#ifndef NRF_CRYPTO_BACKEND_OBERON_HASH_SHA512_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_HASH_SHA512_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA256_ENABLED - Oberon HMAC using SHA-256 + + +// Oberon backend implementation for HMAC using SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA512_ENABLED - Oberon HMAC using SHA-512 + + +// Oberon backend implementation for HMAC using SHA-512. + +#ifndef NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA512_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA512_ENABLED 1 #endif // // -// +// //========================================================== -// nRF_DFU +// nRF_DFU //========================================================== // ble_dfu - Device Firmware Update //========================================================== // BLE_DFU_ENABLED - Enable DFU Service. - + #ifndef BLE_DFU_ENABLED #define BLE_DFU_ENABLED 0 #endif // NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS - Buttonless DFU supports bonds. - + #ifndef NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS #define NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS 0 #endif -// +// //========================================================== -// +// //========================================================== -// nRF_Drivers +// nRF_Drivers //========================================================== -// APP_USBD_ENABLED - app_usbd - USB Device library -//========================================================== -#ifndef APP_USBD_ENABLED -#define APP_USBD_ENABLED 0 -#endif -// APP_USBD_VID - Vendor ID <0x0000-0xFFFF> - - -// Vendor ID ordered from USB IF: http://www.usb.org/developers/vendor/ - -#ifndef APP_USBD_VID -#define APP_USBD_VID 0 -#endif - -// APP_USBD_PID - Product ID <0x0000-0xFFFF> - - -// Selected Product ID - -#ifndef APP_USBD_PID -#define APP_USBD_PID 0 -#endif - -// APP_USBD_DEVICE_VER_MAJOR - Device version, major part <0-99> - - -// Device version, will be converted automatically to BCD notation. Use just decimal values. - -#ifndef APP_USBD_DEVICE_VER_MAJOR -#define APP_USBD_DEVICE_VER_MAJOR 1 -#endif - -// APP_USBD_DEVICE_VER_MINOR - Device version, minor part <0-99> - - -// Device version, will be converted automatically to BCD notation. Use just decimal values. - -#ifndef APP_USBD_DEVICE_VER_MINOR -#define APP_USBD_DEVICE_VER_MINOR 0 -#endif - -// APP_USBD_EVENT_QUEUE_ENABLE - Enable event queue - -// This is the default configuration when all the events are placed into internal queue. -// Disable it when external queue is used like app_scheduler or if you wish to process all events inside interrupts. -// Processing all events from the interrupt level adds requirement not to call any functions that modifies the USBD library state from the context higher than USB interrupt context. -// Functions that modify USBD state are functions for sleep, wakeup, start, stop, enable and disable. -//========================================================== -#ifndef APP_USBD_EVENT_QUEUE_ENABLE -#define APP_USBD_EVENT_QUEUE_ENABLE 1 -#endif -// APP_USBD_EVENT_QUEUE_SIZE - The size of event queue <16-64> - - -// The size of the queue for the events that would be processed in the main loop. - -#ifndef APP_USBD_EVENT_QUEUE_SIZE -#define APP_USBD_EVENT_QUEUE_SIZE 32 -#endif - -// - -// APP_USBD_CONFIG_LOG_ENABLED - Enable logging in the module -//========================================================== -#ifndef APP_USBD_CONFIG_LOG_ENABLED -#define APP_USBD_CONFIG_LOG_ENABLED 0 -#endif -// APP_USBD_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef APP_USBD_CONFIG_LOG_LEVEL -#define APP_USBD_CONFIG_LOG_LEVEL 3 -#endif - -// APP_USBD_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef APP_USBD_CONFIG_INFO_COLOR -#define APP_USBD_CONFIG_INFO_COLOR 0 -#endif - -// APP_USBD_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef APP_USBD_CONFIG_DEBUG_COLOR -#define APP_USBD_CONFIG_DEBUG_COLOR 0 -#endif - -// - -// - -// CLOCK_ENABLED - nrf_drv_clock - CLOCK peripheral driver +// CLOCK_ENABLED - nrf_drv_clock - CLOCK peripheral driver - legacy layer //========================================================== #ifndef CLOCK_ENABLED #define CLOCK_ENABLED 0 #endif -// CLOCK_CONFIG_XTAL_FREQ - HF XTAL Frequency - -// <0=> Default (64 MHz) - -#ifndef CLOCK_CONFIG_XTAL_FREQ -#define CLOCK_CONFIG_XTAL_FREQ 0 -#endif - // CLOCK_CONFIG_LF_SRC - LF Clock Source - -// <0=> RC -// <1=> XTAL -// <2=> Synth + +// <0=> RC +// <1=> XTAL +// <2=> Synth #ifndef CLOCK_CONFIG_LF_SRC #define CLOCK_CONFIG_LF_SRC 1 #endif // CLOCK_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef CLOCK_CONFIG_IRQ_PRIORITY #define CLOCK_CONFIG_IRQ_PRIORITY 7 @@ -1701,89 +1234,89 @@ // -// COMP_ENABLED - nrf_drv_comp - COMP peripheral driver +// COMP_ENABLED - nrf_drv_comp - COMP peripheral driver - legacy layer //========================================================== #ifndef COMP_ENABLED #define COMP_ENABLED 0 #endif // COMP_CONFIG_REF - Reference voltage - -// <0=> Internal 1.2V -// <1=> Internal 1.8V -// <2=> Internal 2.4V -// <4=> VDD -// <7=> ARef + +// <0=> Internal 1.2V +// <1=> Internal 1.8V +// <2=> Internal 2.4V +// <4=> VDD +// <7=> ARef #ifndef COMP_CONFIG_REF #define COMP_CONFIG_REF 1 #endif // COMP_CONFIG_MAIN_MODE - Main mode - -// <0=> Single ended -// <1=> Differential + +// <0=> Single ended +// <1=> Differential #ifndef COMP_CONFIG_MAIN_MODE #define COMP_CONFIG_MAIN_MODE 0 #endif // COMP_CONFIG_SPEED_MODE - Speed mode - -// <0=> Low power -// <1=> Normal -// <2=> High speed + +// <0=> Low power +// <1=> Normal +// <2=> High speed #ifndef COMP_CONFIG_SPEED_MODE #define COMP_CONFIG_SPEED_MODE 2 #endif // COMP_CONFIG_HYST - Hystheresis - -// <0=> No -// <1=> 50mV + +// <0=> No +// <1=> 50mV #ifndef COMP_CONFIG_HYST #define COMP_CONFIG_HYST 0 #endif // COMP_CONFIG_ISOURCE - Current Source - -// <0=> Off -// <1=> 2.5 uA -// <2=> 5 uA -// <3=> 10 uA + +// <0=> Off +// <1=> 2.5 uA +// <2=> 5 uA +// <3=> 10 uA #ifndef COMP_CONFIG_ISOURCE #define COMP_CONFIG_ISOURCE 0 #endif // COMP_CONFIG_INPUT - Analog input - -// <0=> 0 -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 + +// <0=> 0 +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef COMP_CONFIG_INPUT #define COMP_CONFIG_INPUT 0 #endif // COMP_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef COMP_CONFIG_IRQ_PRIORITY #define COMP_CONFIG_IRQ_PRIORITY 7 @@ -1791,35 +1324,35 @@ // -// EGU_ENABLED - nrf_drv_swi - SWI(EGU) peripheral driver - +// EGU_ENABLED - nrf_drv_swi - SWI(EGU) peripheral driver - legacy layer + #ifndef EGU_ENABLED -#define EGU_ENABLED 1 +#define EGU_ENABLED 0 #endif -// GPIOTE_ENABLED - nrf_drv_gpiote - GPIOTE peripheral driver +// GPIOTE_ENABLED - nrf_drv_gpiote - GPIOTE peripheral driver - legacy layer //========================================================== #ifndef GPIOTE_ENABLED #define GPIOTE_ENABLED 1 #endif -// GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS - Number of lower power input pins +// GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS - Number of lower power input pins #ifndef GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS -#define GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 4 +#define GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 1 #endif // GPIOTE_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef GPIOTE_CONFIG_IRQ_PRIORITY #define GPIOTE_CONFIG_IRQ_PRIORITY 7 @@ -1827,38 +1360,38 @@ // -// I2S_ENABLED - nrf_drv_i2s - I2S peripheral driver +// I2S_ENABLED - nrf_drv_i2s - I2S peripheral driver - legacy layer //========================================================== #ifndef I2S_ENABLED #define I2S_ENABLED 0 #endif -// I2S_CONFIG_SCK_PIN - SCK pin <0-31> +// I2S_CONFIG_SCK_PIN - SCK pin <0-31> #ifndef I2S_CONFIG_SCK_PIN #define I2S_CONFIG_SCK_PIN 31 #endif -// I2S_CONFIG_LRCK_PIN - LRCK pin <1-31> +// I2S_CONFIG_LRCK_PIN - LRCK pin <1-31> #ifndef I2S_CONFIG_LRCK_PIN #define I2S_CONFIG_LRCK_PIN 30 #endif -// I2S_CONFIG_MCK_PIN - MCK pin +// I2S_CONFIG_MCK_PIN - MCK pin #ifndef I2S_CONFIG_MCK_PIN #define I2S_CONFIG_MCK_PIN 255 #endif -// I2S_CONFIG_SDOUT_PIN - SDOUT pin <0-31> +// I2S_CONFIG_SDOUT_PIN - SDOUT pin <0-31> #ifndef I2S_CONFIG_SDOUT_PIN #define I2S_CONFIG_SDOUT_PIN 29 #endif -// I2S_CONFIG_SDIN_PIN - SDIN pin <0-31> +// I2S_CONFIG_SDIN_PIN - SDIN pin <0-31> #ifndef I2S_CONFIG_SDIN_PIN @@ -1866,186 +1399,237 @@ #endif // I2S_CONFIG_MASTER - Mode - -// <0=> Master -// <1=> Slave + +// <0=> Master +// <1=> Slave #ifndef I2S_CONFIG_MASTER #define I2S_CONFIG_MASTER 0 #endif // I2S_CONFIG_FORMAT - Format - -// <0=> I2S -// <1=> Aligned + +// <0=> I2S +// <1=> Aligned #ifndef I2S_CONFIG_FORMAT #define I2S_CONFIG_FORMAT 0 #endif // I2S_CONFIG_ALIGN - Alignment - -// <0=> Left -// <1=> Right + +// <0=> Left +// <1=> Right #ifndef I2S_CONFIG_ALIGN #define I2S_CONFIG_ALIGN 0 #endif // I2S_CONFIG_SWIDTH - Sample width (bits) - -// <0=> 8 -// <1=> 16 -// <2=> 24 + +// <0=> 8 +// <1=> 16 +// <2=> 24 #ifndef I2S_CONFIG_SWIDTH #define I2S_CONFIG_SWIDTH 1 #endif // I2S_CONFIG_CHANNELS - Channels - -// <0=> Stereo -// <1=> Left -// <2=> Right + +// <0=> Stereo +// <1=> Left +// <2=> Right #ifndef I2S_CONFIG_CHANNELS #define I2S_CONFIG_CHANNELS 1 #endif // I2S_CONFIG_MCK_SETUP - MCK behavior - -// <0=> Disabled -// <2147483648=> 32MHz/2 -// <1342177280=> 32MHz/3 -// <1073741824=> 32MHz/4 -// <805306368=> 32MHz/5 -// <671088640=> 32MHz/6 -// <536870912=> 32MHz/8 -// <402653184=> 32MHz/10 -// <369098752=> 32MHz/11 -// <285212672=> 32MHz/15 -// <268435456=> 32MHz/16 -// <201326592=> 32MHz/21 -// <184549376=> 32MHz/23 -// <142606336=> 32MHz/30 -// <138412032=> 32MHz/31 -// <134217728=> 32MHz/32 -// <100663296=> 32MHz/42 -// <68157440=> 32MHz/63 -// <34340864=> 32MHz/125 + +// <0=> Disabled +// <2147483648=> 32MHz/2 +// <1342177280=> 32MHz/3 +// <1073741824=> 32MHz/4 +// <805306368=> 32MHz/5 +// <671088640=> 32MHz/6 +// <536870912=> 32MHz/8 +// <402653184=> 32MHz/10 +// <369098752=> 32MHz/11 +// <285212672=> 32MHz/15 +// <268435456=> 32MHz/16 +// <201326592=> 32MHz/21 +// <184549376=> 32MHz/23 +// <142606336=> 32MHz/30 +// <138412032=> 32MHz/31 +// <134217728=> 32MHz/32 +// <100663296=> 32MHz/42 +// <68157440=> 32MHz/63 +// <34340864=> 32MHz/125 #ifndef I2S_CONFIG_MCK_SETUP #define I2S_CONFIG_MCK_SETUP 536870912 #endif // I2S_CONFIG_RATIO - MCK/LRCK ratio - -// <0=> 32x -// <1=> 48x -// <2=> 64x -// <3=> 96x -// <4=> 128x -// <5=> 192x -// <6=> 256x -// <7=> 384x -// <8=> 512x + +// <0=> 32x +// <1=> 48x +// <2=> 64x +// <3=> 96x +// <4=> 128x +// <5=> 192x +// <6=> 256x +// <7=> 384x +// <8=> 512x #ifndef I2S_CONFIG_RATIO #define I2S_CONFIG_RATIO 2000 #endif // I2S_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef I2S_CONFIG_IRQ_PRIORITY #define I2S_CONFIG_IRQ_PRIORITY 7 #endif +// I2S_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef I2S_CONFIG_LOG_ENABLED +#define I2S_CONFIG_LOG_ENABLED 0 +#endif +// I2S_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef I2S_CONFIG_LOG_LEVEL +#define I2S_CONFIG_LOG_LEVEL 3 +#endif + +// I2S_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef I2S_CONFIG_INFO_COLOR +#define I2S_CONFIG_INFO_COLOR 0 +#endif + +// I2S_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef I2S_CONFIG_DEBUG_COLOR +#define I2S_CONFIG_DEBUG_COLOR 0 +#endif + // -// LPCOMP_ENABLED - nrf_drv_lpcomp - LPCOMP peripheral driver +// + +// LPCOMP_ENABLED - nrf_drv_lpcomp - LPCOMP peripheral driver - legacy layer //========================================================== #ifndef LPCOMP_ENABLED #define LPCOMP_ENABLED 0 #endif // LPCOMP_CONFIG_REFERENCE - Reference voltage - -// <0=> Supply 1/8 -// <1=> Supply 2/8 -// <2=> Supply 3/8 -// <3=> Supply 4/8 -// <4=> Supply 5/8 -// <5=> Supply 6/8 -// <6=> Supply 7/8 -// <8=> Supply 1/16 (nRF52) -// <9=> Supply 3/16 (nRF52) -// <10=> Supply 5/16 (nRF52) -// <11=> Supply 7/16 (nRF52) -// <12=> Supply 9/16 (nRF52) -// <13=> Supply 11/16 (nRF52) -// <14=> Supply 13/16 (nRF52) -// <15=> Supply 15/16 (nRF52) -// <7=> External Ref 0 -// <65543=> External Ref 1 + +// <0=> Supply 1/8 +// <1=> Supply 2/8 +// <2=> Supply 3/8 +// <3=> Supply 4/8 +// <4=> Supply 5/8 +// <5=> Supply 6/8 +// <6=> Supply 7/8 +// <8=> Supply 1/16 (nRF52) +// <9=> Supply 3/16 (nRF52) +// <10=> Supply 5/16 (nRF52) +// <11=> Supply 7/16 (nRF52) +// <12=> Supply 9/16 (nRF52) +// <13=> Supply 11/16 (nRF52) +// <14=> Supply 13/16 (nRF52) +// <15=> Supply 15/16 (nRF52) +// <7=> External Ref 0 +// <65543=> External Ref 1 #ifndef LPCOMP_CONFIG_REFERENCE #define LPCOMP_CONFIG_REFERENCE 3 #endif // LPCOMP_CONFIG_DETECTION - Detection - -// <0=> Crossing -// <1=> Up -// <2=> Down + +// <0=> Crossing +// <1=> Up +// <2=> Down #ifndef LPCOMP_CONFIG_DETECTION #define LPCOMP_CONFIG_DETECTION 2 #endif // LPCOMP_CONFIG_INPUT - Analog input - -// <0=> 0 -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 + +// <0=> 0 +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef LPCOMP_CONFIG_INPUT #define LPCOMP_CONFIG_INPUT 0 #endif // LPCOMP_CONFIG_HYST - Hysteresis - + #ifndef LPCOMP_CONFIG_HYST #define LPCOMP_CONFIG_HYST 0 #endif // LPCOMP_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef LPCOMP_CONFIG_IRQ_PRIORITY #define LPCOMP_CONFIG_IRQ_PRIORITY 7 @@ -2053,43 +1637,2208 @@ // -// PDM_ENABLED - nrf_drv_pdm - PDM peripheral driver +// NRFX_CLOCK_ENABLED - nrfx_clock - CLOCK peripheral driver //========================================================== -#ifndef PDM_ENABLED -#define PDM_ENABLED 0 +#ifndef NRFX_CLOCK_ENABLED +#define NRFX_CLOCK_ENABLED 0 #endif -// PDM_CONFIG_MODE - Mode +// NRFX_CLOCK_CONFIG_LF_SRC - LF Clock Source + +// <0=> RC +// <1=> XTAL +// <2=> Synth -// <0=> Stereo -// <1=> Mono - -#ifndef PDM_CONFIG_MODE -#define PDM_CONFIG_MODE 1 +#ifndef NRFX_CLOCK_CONFIG_LF_SRC +#define NRFX_CLOCK_CONFIG_LF_SRC 1 #endif -// PDM_CONFIG_EDGE - Edge +// NRFX_CLOCK_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 -// <0=> Left falling -// <1=> Left rising - -#ifndef PDM_CONFIG_EDGE -#define PDM_CONFIG_EDGE 0 +#ifndef NRFX_CLOCK_CONFIG_IRQ_PRIORITY +#define NRFX_CLOCK_CONFIG_IRQ_PRIORITY 7 #endif -// PDM_CONFIG_CLOCK_FREQ - Clock frequency +// NRFX_CLOCK_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_CLOCK_CONFIG_LOG_ENABLED +#define NRFX_CLOCK_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_CLOCK_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug -// <134217728=> 1000k -// <138412032=> 1032k (default) -// <142606336=> 1067k - -#ifndef PDM_CONFIG_CLOCK_FREQ -#define PDM_CONFIG_CLOCK_FREQ 138412032 +#ifndef NRFX_CLOCK_CONFIG_LOG_LEVEL +#define NRFX_CLOCK_CONFIG_LOG_LEVEL 3 #endif -// PDM_CONFIG_IRQ_PRIORITY - Interrupt priority +// NRFX_CLOCK_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_CLOCK_CONFIG_INFO_COLOR +#define NRFX_CLOCK_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_CLOCK_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_CLOCK_CONFIG_DEBUG_COLOR +#define NRFX_CLOCK_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_COMP_ENABLED - nrfx_comp - COMP peripheral driver +//========================================================== +#ifndef NRFX_COMP_ENABLED +#define NRFX_COMP_ENABLED 0 +#endif +// NRFX_COMP_CONFIG_REF - Reference voltage + +// <0=> Internal 1.2V +// <1=> Internal 1.8V +// <2=> Internal 2.4V +// <4=> VDD +// <7=> ARef + +#ifndef NRFX_COMP_CONFIG_REF +#define NRFX_COMP_CONFIG_REF 1 +#endif + +// NRFX_COMP_CONFIG_MAIN_MODE - Main mode + +// <0=> Single ended +// <1=> Differential + +#ifndef NRFX_COMP_CONFIG_MAIN_MODE +#define NRFX_COMP_CONFIG_MAIN_MODE 0 +#endif + +// NRFX_COMP_CONFIG_SPEED_MODE - Speed mode + +// <0=> Low power +// <1=> Normal +// <2=> High speed + +#ifndef NRFX_COMP_CONFIG_SPEED_MODE +#define NRFX_COMP_CONFIG_SPEED_MODE 2 +#endif + +// NRFX_COMP_CONFIG_HYST - Hystheresis + +// <0=> No +// <1=> 50mV + +#ifndef NRFX_COMP_CONFIG_HYST +#define NRFX_COMP_CONFIG_HYST 0 +#endif + +// NRFX_COMP_CONFIG_ISOURCE - Current Source + +// <0=> Off +// <1=> 2.5 uA +// <2=> 5 uA +// <3=> 10 uA + +#ifndef NRFX_COMP_CONFIG_ISOURCE +#define NRFX_COMP_CONFIG_ISOURCE 0 +#endif + +// NRFX_COMP_CONFIG_INPUT - Analog input + +// <0=> 0 +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_COMP_CONFIG_INPUT +#define NRFX_COMP_CONFIG_INPUT 0 +#endif + +// NRFX_COMP_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_COMP_CONFIG_IRQ_PRIORITY +#define NRFX_COMP_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_COMP_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_COMP_CONFIG_LOG_ENABLED +#define NRFX_COMP_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_COMP_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_COMP_CONFIG_LOG_LEVEL +#define NRFX_COMP_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_COMP_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_COMP_CONFIG_INFO_COLOR +#define NRFX_COMP_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_COMP_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_COMP_CONFIG_DEBUG_COLOR +#define NRFX_COMP_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_GPIOTE_ENABLED - nrfx_gpiote - GPIOTE peripheral driver +//========================================================== +#ifndef NRFX_GPIOTE_ENABLED +#define NRFX_GPIOTE_ENABLED 1 +#endif +// NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS - Number of lower power input pins +#ifndef NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS +#define NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 1 +#endif + +// NRFX_GPIOTE_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_GPIOTE_CONFIG_IRQ_PRIORITY +#define NRFX_GPIOTE_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_GPIOTE_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_GPIOTE_CONFIG_LOG_ENABLED +#define NRFX_GPIOTE_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_GPIOTE_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_GPIOTE_CONFIG_LOG_LEVEL +#define NRFX_GPIOTE_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_GPIOTE_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_GPIOTE_CONFIG_INFO_COLOR +#define NRFX_GPIOTE_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_GPIOTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_GPIOTE_CONFIG_DEBUG_COLOR +#define NRFX_GPIOTE_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_I2S_ENABLED - nrfx_i2s - I2S peripheral driver +//========================================================== +#ifndef NRFX_I2S_ENABLED +#define NRFX_I2S_ENABLED 0 +#endif +// NRFX_I2S_CONFIG_SCK_PIN - SCK pin <0-31> -// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice +#ifndef NRFX_I2S_CONFIG_SCK_PIN +#define NRFX_I2S_CONFIG_SCK_PIN 31 +#endif + +// NRFX_I2S_CONFIG_LRCK_PIN - LRCK pin <1-31> + + +#ifndef NRFX_I2S_CONFIG_LRCK_PIN +#define NRFX_I2S_CONFIG_LRCK_PIN 30 +#endif + +// NRFX_I2S_CONFIG_MCK_PIN - MCK pin +#ifndef NRFX_I2S_CONFIG_MCK_PIN +#define NRFX_I2S_CONFIG_MCK_PIN 255 +#endif + +// NRFX_I2S_CONFIG_SDOUT_PIN - SDOUT pin <0-31> + + +#ifndef NRFX_I2S_CONFIG_SDOUT_PIN +#define NRFX_I2S_CONFIG_SDOUT_PIN 29 +#endif + +// NRFX_I2S_CONFIG_SDIN_PIN - SDIN pin <0-31> + + +#ifndef NRFX_I2S_CONFIG_SDIN_PIN +#define NRFX_I2S_CONFIG_SDIN_PIN 28 +#endif + +// NRFX_I2S_CONFIG_MASTER - Mode + +// <0=> Master +// <1=> Slave + +#ifndef NRFX_I2S_CONFIG_MASTER +#define NRFX_I2S_CONFIG_MASTER 0 +#endif + +// NRFX_I2S_CONFIG_FORMAT - Format + +// <0=> I2S +// <1=> Aligned + +#ifndef NRFX_I2S_CONFIG_FORMAT +#define NRFX_I2S_CONFIG_FORMAT 0 +#endif + +// NRFX_I2S_CONFIG_ALIGN - Alignment + +// <0=> Left +// <1=> Right + +#ifndef NRFX_I2S_CONFIG_ALIGN +#define NRFX_I2S_CONFIG_ALIGN 0 +#endif + +// NRFX_I2S_CONFIG_SWIDTH - Sample width (bits) + +// <0=> 8 +// <1=> 16 +// <2=> 24 + +#ifndef NRFX_I2S_CONFIG_SWIDTH +#define NRFX_I2S_CONFIG_SWIDTH 1 +#endif + +// NRFX_I2S_CONFIG_CHANNELS - Channels + +// <0=> Stereo +// <1=> Left +// <2=> Right + +#ifndef NRFX_I2S_CONFIG_CHANNELS +#define NRFX_I2S_CONFIG_CHANNELS 1 +#endif + +// NRFX_I2S_CONFIG_MCK_SETUP - MCK behavior + +// <0=> Disabled +// <2147483648=> 32MHz/2 +// <1342177280=> 32MHz/3 +// <1073741824=> 32MHz/4 +// <805306368=> 32MHz/5 +// <671088640=> 32MHz/6 +// <536870912=> 32MHz/8 +// <402653184=> 32MHz/10 +// <369098752=> 32MHz/11 +// <285212672=> 32MHz/15 +// <268435456=> 32MHz/16 +// <201326592=> 32MHz/21 +// <184549376=> 32MHz/23 +// <142606336=> 32MHz/30 +// <138412032=> 32MHz/31 +// <134217728=> 32MHz/32 +// <100663296=> 32MHz/42 +// <68157440=> 32MHz/63 +// <34340864=> 32MHz/125 + +#ifndef NRFX_I2S_CONFIG_MCK_SETUP +#define NRFX_I2S_CONFIG_MCK_SETUP 536870912 +#endif + +// NRFX_I2S_CONFIG_RATIO - MCK/LRCK ratio + +// <0=> 32x +// <1=> 48x +// <2=> 64x +// <3=> 96x +// <4=> 128x +// <5=> 192x +// <6=> 256x +// <7=> 384x +// <8=> 512x + +#ifndef NRFX_I2S_CONFIG_RATIO +#define NRFX_I2S_CONFIG_RATIO 2000 +#endif + +// NRFX_I2S_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_I2S_CONFIG_IRQ_PRIORITY +#define NRFX_I2S_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_I2S_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_I2S_CONFIG_LOG_ENABLED +#define NRFX_I2S_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_I2S_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_I2S_CONFIG_LOG_LEVEL +#define NRFX_I2S_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_I2S_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_I2S_CONFIG_INFO_COLOR +#define NRFX_I2S_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_I2S_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_I2S_CONFIG_DEBUG_COLOR +#define NRFX_I2S_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_LPCOMP_ENABLED - nrfx_lpcomp - LPCOMP peripheral driver +//========================================================== +#ifndef NRFX_LPCOMP_ENABLED +#define NRFX_LPCOMP_ENABLED 0 +#endif +// NRFX_LPCOMP_CONFIG_REFERENCE - Reference voltage + +// <0=> Supply 1/8 +// <1=> Supply 2/8 +// <2=> Supply 3/8 +// <3=> Supply 4/8 +// <4=> Supply 5/8 +// <5=> Supply 6/8 +// <6=> Supply 7/8 +// <8=> Supply 1/16 (nRF52) +// <9=> Supply 3/16 (nRF52) +// <10=> Supply 5/16 (nRF52) +// <11=> Supply 7/16 (nRF52) +// <12=> Supply 9/16 (nRF52) +// <13=> Supply 11/16 (nRF52) +// <14=> Supply 13/16 (nRF52) +// <15=> Supply 15/16 (nRF52) +// <7=> External Ref 0 +// <65543=> External Ref 1 + +#ifndef NRFX_LPCOMP_CONFIG_REFERENCE +#define NRFX_LPCOMP_CONFIG_REFERENCE 3 +#endif + +// NRFX_LPCOMP_CONFIG_DETECTION - Detection + +// <0=> Crossing +// <1=> Up +// <2=> Down + +#ifndef NRFX_LPCOMP_CONFIG_DETECTION +#define NRFX_LPCOMP_CONFIG_DETECTION 2 +#endif + +// NRFX_LPCOMP_CONFIG_INPUT - Analog input + +// <0=> 0 +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_LPCOMP_CONFIG_INPUT +#define NRFX_LPCOMP_CONFIG_INPUT 0 +#endif + +// NRFX_LPCOMP_CONFIG_HYST - Hysteresis + + +#ifndef NRFX_LPCOMP_CONFIG_HYST +#define NRFX_LPCOMP_CONFIG_HYST 0 +#endif + +// NRFX_LPCOMP_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_LPCOMP_CONFIG_IRQ_PRIORITY +#define NRFX_LPCOMP_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_LPCOMP_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_LPCOMP_CONFIG_LOG_ENABLED +#define NRFX_LPCOMP_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_LPCOMP_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_LPCOMP_CONFIG_LOG_LEVEL +#define NRFX_LPCOMP_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_LPCOMP_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_LPCOMP_CONFIG_INFO_COLOR +#define NRFX_LPCOMP_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_LPCOMP_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_LPCOMP_CONFIG_DEBUG_COLOR +#define NRFX_LPCOMP_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_PDM_ENABLED - nrfx_pdm - PDM peripheral driver +//========================================================== +#ifndef NRFX_PDM_ENABLED +#define NRFX_PDM_ENABLED 0 +#endif +// NRFX_PDM_CONFIG_MODE - Mode + +// <0=> Stereo +// <1=> Mono + +#ifndef NRFX_PDM_CONFIG_MODE +#define NRFX_PDM_CONFIG_MODE 1 +#endif + +// NRFX_PDM_CONFIG_EDGE - Edge + +// <0=> Left falling +// <1=> Left rising + +#ifndef NRFX_PDM_CONFIG_EDGE +#define NRFX_PDM_CONFIG_EDGE 0 +#endif + +// NRFX_PDM_CONFIG_CLOCK_FREQ - Clock frequency + +// <134217728=> 1000k +// <138412032=> 1032k (default) +// <142606336=> 1067k + +#ifndef NRFX_PDM_CONFIG_CLOCK_FREQ +#define NRFX_PDM_CONFIG_CLOCK_FREQ 138412032 +#endif + +// NRFX_PDM_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_PDM_CONFIG_IRQ_PRIORITY +#define NRFX_PDM_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_PDM_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_PDM_CONFIG_LOG_ENABLED +#define NRFX_PDM_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_PDM_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_PDM_CONFIG_LOG_LEVEL +#define NRFX_PDM_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_PDM_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_PDM_CONFIG_INFO_COLOR +#define NRFX_PDM_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_PDM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_PDM_CONFIG_DEBUG_COLOR +#define NRFX_PDM_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_POWER_ENABLED - nrfx_power - POWER peripheral driver +//========================================================== +#ifndef NRFX_POWER_ENABLED +#define NRFX_POWER_ENABLED 0 +#endif +// NRFX_POWER_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_POWER_CONFIG_IRQ_PRIORITY +#define NRFX_POWER_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_POWER_CONFIG_DEFAULT_DCDCEN - The default configuration of main DCDC regulator + + +// This settings means only that components for DCDC regulator are installed and it can be enabled. + +#ifndef NRFX_POWER_CONFIG_DEFAULT_DCDCEN +#define NRFX_POWER_CONFIG_DEFAULT_DCDCEN 0 +#endif + +// NRFX_POWER_CONFIG_DEFAULT_DCDCENHV - The default configuration of High Voltage DCDC regulator + + +// This settings means only that components for DCDC regulator are installed and it can be enabled. + +#ifndef NRFX_POWER_CONFIG_DEFAULT_DCDCENHV +#define NRFX_POWER_CONFIG_DEFAULT_DCDCENHV 0 +#endif + +// + +// NRFX_PPI_ENABLED - nrfx_ppi - PPI peripheral allocator +//========================================================== +#ifndef NRFX_PPI_ENABLED +#define NRFX_PPI_ENABLED 1 +#endif +// NRFX_PPI_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_PPI_CONFIG_LOG_ENABLED +#define NRFX_PPI_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_PPI_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_PPI_CONFIG_LOG_LEVEL +#define NRFX_PPI_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_PPI_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_PPI_CONFIG_INFO_COLOR +#define NRFX_PPI_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_PPI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_PPI_CONFIG_DEBUG_COLOR +#define NRFX_PPI_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_PWM_ENABLED - nrfx_pwm - PWM peripheral driver +//========================================================== +#ifndef NRFX_PWM_ENABLED +#define NRFX_PWM_ENABLED 1 +#endif +// NRFX_PWM0_ENABLED - Enable PWM0 instance + + +#ifndef NRFX_PWM0_ENABLED +#define NRFX_PWM0_ENABLED 1 +#endif + +// NRFX_PWM1_ENABLED - Enable PWM1 instance + + +#ifndef NRFX_PWM1_ENABLED +#define NRFX_PWM1_ENABLED 1 +#endif + +// NRFX_PWM2_ENABLED - Enable PWM2 instance + + +#ifndef NRFX_PWM2_ENABLED +#define NRFX_PWM2_ENABLED 1 +#endif + +// NRFX_PWM3_ENABLED - Enable PWM3 instance + + +#ifndef NRFX_PWM3_ENABLED +#define NRFX_PWM3_ENABLED 0 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_OUT0_PIN - Out0 pin <0-31> + + +#ifndef NRFX_PWM_DEFAULT_CONFIG_OUT0_PIN +#define NRFX_PWM_DEFAULT_CONFIG_OUT0_PIN 31 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_OUT1_PIN - Out1 pin <0-31> + + +#ifndef NRFX_PWM_DEFAULT_CONFIG_OUT1_PIN +#define NRFX_PWM_DEFAULT_CONFIG_OUT1_PIN 31 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_OUT2_PIN - Out2 pin <0-31> + + +#ifndef NRFX_PWM_DEFAULT_CONFIG_OUT2_PIN +#define NRFX_PWM_DEFAULT_CONFIG_OUT2_PIN 31 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_OUT3_PIN - Out3 pin <0-31> + + +#ifndef NRFX_PWM_DEFAULT_CONFIG_OUT3_PIN +#define NRFX_PWM_DEFAULT_CONFIG_OUT3_PIN 31 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_BASE_CLOCK - Base clock + +// <0=> 16 MHz +// <1=> 8 MHz +// <2=> 4 MHz +// <3=> 2 MHz +// <4=> 1 MHz +// <5=> 500 kHz +// <6=> 250 kHz +// <7=> 125 kHz + +#ifndef NRFX_PWM_DEFAULT_CONFIG_BASE_CLOCK +#define NRFX_PWM_DEFAULT_CONFIG_BASE_CLOCK 4 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_COUNT_MODE - Count mode + +// <0=> Up +// <1=> Up and Down + +#ifndef NRFX_PWM_DEFAULT_CONFIG_COUNT_MODE +#define NRFX_PWM_DEFAULT_CONFIG_COUNT_MODE 0 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_TOP_VALUE - Top value +#ifndef NRFX_PWM_DEFAULT_CONFIG_TOP_VALUE +#define NRFX_PWM_DEFAULT_CONFIG_TOP_VALUE 1000 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_LOAD_MODE - Load mode + +// <0=> Common +// <1=> Grouped +// <2=> Individual +// <3=> Waveform + +#ifndef NRFX_PWM_DEFAULT_CONFIG_LOAD_MODE +#define NRFX_PWM_DEFAULT_CONFIG_LOAD_MODE 0 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_STEP_MODE - Step mode + +// <0=> Auto +// <1=> Triggered + +#ifndef NRFX_PWM_DEFAULT_CONFIG_STEP_MODE +#define NRFX_PWM_DEFAULT_CONFIG_STEP_MODE 0 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_PWM_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_PWM_CONFIG_LOG_ENABLED +#define NRFX_PWM_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_PWM_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_PWM_CONFIG_LOG_LEVEL +#define NRFX_PWM_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_PWM_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_PWM_CONFIG_INFO_COLOR +#define NRFX_PWM_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_PWM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_PWM_CONFIG_DEBUG_COLOR +#define NRFX_PWM_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_QDEC_ENABLED - nrfx_qdec - QDEC peripheral driver +//========================================================== +#ifndef NRFX_QDEC_ENABLED +#define NRFX_QDEC_ENABLED 0 +#endif +// NRFX_QDEC_CONFIG_REPORTPER - Report period + +// <0=> 10 Samples +// <1=> 40 Samples +// <2=> 80 Samples +// <3=> 120 Samples +// <4=> 160 Samples +// <5=> 200 Samples +// <6=> 240 Samples +// <7=> 280 Samples + +#ifndef NRFX_QDEC_CONFIG_REPORTPER +#define NRFX_QDEC_CONFIG_REPORTPER 0 +#endif + +// NRFX_QDEC_CONFIG_SAMPLEPER - Sample period + +// <0=> 128 us +// <1=> 256 us +// <2=> 512 us +// <3=> 1024 us +// <4=> 2048 us +// <5=> 4096 us +// <6=> 8192 us +// <7=> 16384 us + +#ifndef NRFX_QDEC_CONFIG_SAMPLEPER +#define NRFX_QDEC_CONFIG_SAMPLEPER 7 +#endif + +// NRFX_QDEC_CONFIG_PIO_A - A pin <0-31> + + +#ifndef NRFX_QDEC_CONFIG_PIO_A +#define NRFX_QDEC_CONFIG_PIO_A 31 +#endif + +// NRFX_QDEC_CONFIG_PIO_B - B pin <0-31> + + +#ifndef NRFX_QDEC_CONFIG_PIO_B +#define NRFX_QDEC_CONFIG_PIO_B 31 +#endif + +// NRFX_QDEC_CONFIG_PIO_LED - LED pin <0-31> + + +#ifndef NRFX_QDEC_CONFIG_PIO_LED +#define NRFX_QDEC_CONFIG_PIO_LED 31 +#endif + +// NRFX_QDEC_CONFIG_LEDPRE - LED pre +#ifndef NRFX_QDEC_CONFIG_LEDPRE +#define NRFX_QDEC_CONFIG_LEDPRE 511 +#endif + +// NRFX_QDEC_CONFIG_LEDPOL - LED polarity + +// <0=> Active low +// <1=> Active high + +#ifndef NRFX_QDEC_CONFIG_LEDPOL +#define NRFX_QDEC_CONFIG_LEDPOL 1 +#endif + +// NRFX_QDEC_CONFIG_DBFEN - Debouncing enable + + +#ifndef NRFX_QDEC_CONFIG_DBFEN +#define NRFX_QDEC_CONFIG_DBFEN 0 +#endif + +// NRFX_QDEC_CONFIG_SAMPLE_INTEN - Sample ready interrupt enable + + +#ifndef NRFX_QDEC_CONFIG_SAMPLE_INTEN +#define NRFX_QDEC_CONFIG_SAMPLE_INTEN 0 +#endif + +// NRFX_QDEC_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_QDEC_CONFIG_IRQ_PRIORITY +#define NRFX_QDEC_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_QDEC_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_QDEC_CONFIG_LOG_ENABLED +#define NRFX_QDEC_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_QDEC_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_QDEC_CONFIG_LOG_LEVEL +#define NRFX_QDEC_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_QDEC_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_QDEC_CONFIG_INFO_COLOR +#define NRFX_QDEC_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_QDEC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_QDEC_CONFIG_DEBUG_COLOR +#define NRFX_QDEC_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_QSPI_ENABLED - nrfx_qspi - QSPI peripheral driver +//========================================================== +#ifndef NRFX_QSPI_ENABLED +#define NRFX_QSPI_ENABLED 0 +#endif +// NRFX_QSPI_CONFIG_SCK_DELAY - tSHSL, tWHSL and tSHWL in number of 16 MHz periods (62.5 ns). <0-255> + + +#ifndef NRFX_QSPI_CONFIG_SCK_DELAY +#define NRFX_QSPI_CONFIG_SCK_DELAY 1 +#endif + +// NRFX_QSPI_CONFIG_XIP_OFFSET - Address offset in the external memory for Execute in Place operation. +#ifndef NRFX_QSPI_CONFIG_XIP_OFFSET +#define NRFX_QSPI_CONFIG_XIP_OFFSET 0 +#endif + +// NRFX_QSPI_CONFIG_READOC - Number of data lines and opcode used for reading. + +// <0=> FastRead +// <1=> Read2O +// <2=> Read2IO +// <3=> Read4O +// <4=> Read4IO + +#ifndef NRFX_QSPI_CONFIG_READOC +#define NRFX_QSPI_CONFIG_READOC 0 +#endif + +// NRFX_QSPI_CONFIG_WRITEOC - Number of data lines and opcode used for writing. + +// <0=> PP +// <1=> PP2O +// <2=> PP4O +// <3=> PP4IO + +#ifndef NRFX_QSPI_CONFIG_WRITEOC +#define NRFX_QSPI_CONFIG_WRITEOC 0 +#endif + +// NRFX_QSPI_CONFIG_ADDRMODE - Addressing mode. + +// <0=> 24bit +// <1=> 32bit + +#ifndef NRFX_QSPI_CONFIG_ADDRMODE +#define NRFX_QSPI_CONFIG_ADDRMODE 0 +#endif + +// NRFX_QSPI_CONFIG_MODE - SPI mode. + +// <0=> Mode 0 +// <1=> Mode 1 + +#ifndef NRFX_QSPI_CONFIG_MODE +#define NRFX_QSPI_CONFIG_MODE 0 +#endif + +// NRFX_QSPI_CONFIG_FREQUENCY - Frequency divider. + +// <0=> 32MHz/1 +// <1=> 32MHz/2 +// <2=> 32MHz/3 +// <3=> 32MHz/4 +// <4=> 32MHz/5 +// <5=> 32MHz/6 +// <6=> 32MHz/7 +// <7=> 32MHz/8 +// <8=> 32MHz/9 +// <9=> 32MHz/10 +// <10=> 32MHz/11 +// <11=> 32MHz/12 +// <12=> 32MHz/13 +// <13=> 32MHz/14 +// <14=> 32MHz/15 +// <15=> 32MHz/16 + +#ifndef NRFX_QSPI_CONFIG_FREQUENCY +#define NRFX_QSPI_CONFIG_FREQUENCY 15 +#endif + +// NRFX_QSPI_PIN_SCK - SCK pin value. +#ifndef NRFX_QSPI_PIN_SCK +#define NRFX_QSPI_PIN_SCK NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// NRFX_QSPI_PIN_CSN - CSN pin value. +#ifndef NRFX_QSPI_PIN_CSN +#define NRFX_QSPI_PIN_CSN NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// NRFX_QSPI_PIN_IO0 - IO0 pin value. +#ifndef NRFX_QSPI_PIN_IO0 +#define NRFX_QSPI_PIN_IO0 NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// NRFX_QSPI_PIN_IO1 - IO1 pin value. +#ifndef NRFX_QSPI_PIN_IO1 +#define NRFX_QSPI_PIN_IO1 NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// NRFX_QSPI_PIN_IO2 - IO2 pin value. +#ifndef NRFX_QSPI_PIN_IO2 +#define NRFX_QSPI_PIN_IO2 NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// NRFX_QSPI_PIN_IO3 - IO3 pin value. +#ifndef NRFX_QSPI_PIN_IO3 +#define NRFX_QSPI_PIN_IO3 NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// NRFX_QSPI_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_QSPI_CONFIG_IRQ_PRIORITY +#define NRFX_QSPI_CONFIG_IRQ_PRIORITY 7 +#endif + +// + +// NRFX_RNG_ENABLED - nrfx_rng - RNG peripheral driver +//========================================================== +#ifndef NRFX_RNG_ENABLED +#define NRFX_RNG_ENABLED 1 +#endif +// NRFX_RNG_CONFIG_ERROR_CORRECTION - Error correction + + +#ifndef NRFX_RNG_CONFIG_ERROR_CORRECTION +#define NRFX_RNG_CONFIG_ERROR_CORRECTION 1 +#endif + +// NRFX_RNG_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_RNG_CONFIG_IRQ_PRIORITY +#define NRFX_RNG_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_RNG_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_RNG_CONFIG_LOG_ENABLED +#define NRFX_RNG_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_RNG_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_RNG_CONFIG_LOG_LEVEL +#define NRFX_RNG_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_RNG_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_RNG_CONFIG_INFO_COLOR +#define NRFX_RNG_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_RNG_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_RNG_CONFIG_DEBUG_COLOR +#define NRFX_RNG_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_RTC_ENABLED - nrfx_rtc - RTC peripheral driver +//========================================================== +#ifndef NRFX_RTC_ENABLED +#define NRFX_RTC_ENABLED 0 +#endif +// NRFX_RTC0_ENABLED - Enable RTC0 instance + + +#ifndef NRFX_RTC0_ENABLED +#define NRFX_RTC0_ENABLED 0 +#endif + +// NRFX_RTC1_ENABLED - Enable RTC1 instance + + +#ifndef NRFX_RTC1_ENABLED +#define NRFX_RTC1_ENABLED 0 +#endif + +// NRFX_RTC2_ENABLED - Enable RTC2 instance + + +#ifndef NRFX_RTC2_ENABLED +#define NRFX_RTC2_ENABLED 0 +#endif + +// NRFX_RTC_MAXIMUM_LATENCY_US - Maximum possible time[us] in highest priority interrupt +#ifndef NRFX_RTC_MAXIMUM_LATENCY_US +#define NRFX_RTC_MAXIMUM_LATENCY_US 2000 +#endif + +// NRFX_RTC_DEFAULT_CONFIG_FREQUENCY - Frequency <16-32768> + + +#ifndef NRFX_RTC_DEFAULT_CONFIG_FREQUENCY +#define NRFX_RTC_DEFAULT_CONFIG_FREQUENCY 32768 +#endif + +// NRFX_RTC_DEFAULT_CONFIG_RELIABLE - Ensures safe compare event triggering + + +#ifndef NRFX_RTC_DEFAULT_CONFIG_RELIABLE +#define NRFX_RTC_DEFAULT_CONFIG_RELIABLE 0 +#endif + +// NRFX_RTC_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_RTC_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_RTC_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_RTC_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_RTC_CONFIG_LOG_ENABLED +#define NRFX_RTC_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_RTC_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_RTC_CONFIG_LOG_LEVEL +#define NRFX_RTC_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_RTC_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_RTC_CONFIG_INFO_COLOR +#define NRFX_RTC_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_RTC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_RTC_CONFIG_DEBUG_COLOR +#define NRFX_RTC_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_SAADC_ENABLED - nrfx_saadc - SAADC peripheral driver +//========================================================== +#ifndef NRFX_SAADC_ENABLED +#define NRFX_SAADC_ENABLED 1 +#endif +// NRFX_SAADC_CONFIG_RESOLUTION - Resolution + +// <0=> 8 bit +// <1=> 10 bit +// <2=> 12 bit +// <3=> 14 bit + +#ifndef NRFX_SAADC_CONFIG_RESOLUTION +#define NRFX_SAADC_CONFIG_RESOLUTION 1 +#endif + +// NRFX_SAADC_CONFIG_OVERSAMPLE - Sample period + +// <0=> Disabled +// <1=> 2x +// <2=> 4x +// <3=> 8x +// <4=> 16x +// <5=> 32x +// <6=> 64x +// <7=> 128x +// <8=> 256x + +#ifndef NRFX_SAADC_CONFIG_OVERSAMPLE +#define NRFX_SAADC_CONFIG_OVERSAMPLE 0 +#endif + +// NRFX_SAADC_CONFIG_LP_MODE - Enabling low power mode + + +#ifndef NRFX_SAADC_CONFIG_LP_MODE +#define NRFX_SAADC_CONFIG_LP_MODE 0 +#endif + +// NRFX_SAADC_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_SAADC_CONFIG_IRQ_PRIORITY +#define NRFX_SAADC_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_SAADC_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_SAADC_CONFIG_LOG_ENABLED +#define NRFX_SAADC_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_SAADC_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_SAADC_CONFIG_LOG_LEVEL +#define NRFX_SAADC_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_SAADC_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SAADC_CONFIG_INFO_COLOR +#define NRFX_SAADC_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_SAADC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SAADC_CONFIG_DEBUG_COLOR +#define NRFX_SAADC_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_SPIM_ENABLED - nrfx_spim - SPIM peripheral driver +//========================================================== +#ifndef NRFX_SPIM_ENABLED +#define NRFX_SPIM_ENABLED 0 +#endif +// NRFX_SPIM0_ENABLED - Enable SPIM0 instance + + +#ifndef NRFX_SPIM0_ENABLED +#define NRFX_SPIM0_ENABLED 0 +#endif + +// NRFX_SPIM1_ENABLED - Enable SPIM1 instance + + +#ifndef NRFX_SPIM1_ENABLED +#define NRFX_SPIM1_ENABLED 0 +#endif + +// NRFX_SPIM2_ENABLED - Enable SPIM2 instance + + +#ifndef NRFX_SPIM2_ENABLED +#define NRFX_SPIM2_ENABLED 0 +#endif + +// NRFX_SPIM3_ENABLED - Enable SPIM3 instance + + +#ifndef NRFX_SPIM3_ENABLED +#define NRFX_SPIM3_ENABLED 0 +#endif + +// NRFX_SPIM_EXTENDED_ENABLED - Enable extended SPIM features + + +#ifndef NRFX_SPIM_EXTENDED_ENABLED +#define NRFX_SPIM_EXTENDED_ENABLED 0 +#endif + +// NRFX_SPIM_MISO_PULL_CFG - MISO pin pull configuration. + +// <0=> NRF_GPIO_PIN_NOPULL +// <1=> NRF_GPIO_PIN_PULLDOWN +// <3=> NRF_GPIO_PIN_PULLUP + +#ifndef NRFX_SPIM_MISO_PULL_CFG +#define NRFX_SPIM_MISO_PULL_CFG 1 +#endif + +// NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_SPIM_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_SPIM_CONFIG_LOG_ENABLED +#define NRFX_SPIM_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_SPIM_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_SPIM_CONFIG_LOG_LEVEL +#define NRFX_SPIM_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_SPIM_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SPIM_CONFIG_INFO_COLOR +#define NRFX_SPIM_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_SPIM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SPIM_CONFIG_DEBUG_COLOR +#define NRFX_SPIM_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_SPIS_ENABLED - nrfx_spis - SPIS peripheral driver +//========================================================== +#ifndef NRFX_SPIS_ENABLED +#define NRFX_SPIS_ENABLED 0 +#endif +// NRFX_SPIS0_ENABLED - Enable SPIS0 instance + + +#ifndef NRFX_SPIS0_ENABLED +#define NRFX_SPIS0_ENABLED 0 +#endif + +// NRFX_SPIS1_ENABLED - Enable SPIS1 instance + + +#ifndef NRFX_SPIS1_ENABLED +#define NRFX_SPIS1_ENABLED 0 +#endif + +// NRFX_SPIS2_ENABLED - Enable SPIS2 instance + + +#ifndef NRFX_SPIS2_ENABLED +#define NRFX_SPIS2_ENABLED 0 +#endif + +// NRFX_SPIS_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_SPIS_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_SPIS_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_SPIS_DEFAULT_DEF - SPIS default DEF character <0-255> + + +#ifndef NRFX_SPIS_DEFAULT_DEF +#define NRFX_SPIS_DEFAULT_DEF 255 +#endif + +// NRFX_SPIS_DEFAULT_ORC - SPIS default ORC character <0-255> + + +#ifndef NRFX_SPIS_DEFAULT_ORC +#define NRFX_SPIS_DEFAULT_ORC 255 +#endif + +// NRFX_SPIS_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_SPIS_CONFIG_LOG_ENABLED +#define NRFX_SPIS_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_SPIS_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_SPIS_CONFIG_LOG_LEVEL +#define NRFX_SPIS_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_SPIS_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SPIS_CONFIG_INFO_COLOR +#define NRFX_SPIS_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_SPIS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SPIS_CONFIG_DEBUG_COLOR +#define NRFX_SPIS_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_SPI_ENABLED - nrfx_spi - SPI peripheral driver +//========================================================== + +#ifndef NRFX_SPI_ENABLED +#define NRFX_SPI_ENABLED 1 +#endif +// NRFX_SPI0_ENABLED - Enable SPI0 instance + + +#ifndef NRFX_SPI0_ENABLED +#define NRFX_SPI0_ENABLED 1 +#endif + +// NRFX_SPI1_ENABLED - Enable SPI1 instance + + +#ifndef NRFX_SPI1_ENABLED +#define NRFX_SPI1_ENABLED 1 +#endif + +// NRFX_SPI2_ENABLED - Enable SPI2 instance + + +#ifndef NRFX_SPI2_ENABLED +#define NRFX_SPI2_ENABLED 1 +#endif + +// NRFX_SPI_MISO_PULL_CFG - MISO pin pull configuration. + +// <0=> NRF_GPIO_PIN_NOPULL +// <1=> NRF_GPIO_PIN_PULLDOWN +// <3=> NRF_GPIO_PIN_PULLUP + +#ifndef NRFX_SPI_MISO_PULL_CFG +#define NRFX_SPI_MISO_PULL_CFG 1 +#endif + +// NRFX_SPI_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_SPI_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_SPI_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_SPI_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_SPI_CONFIG_LOG_ENABLED +#define NRFX_SPI_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_SPI_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_SPI_CONFIG_LOG_LEVEL +#define NRFX_SPI_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_SPI_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SPI_CONFIG_INFO_COLOR +#define NRFX_SPI_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_SPI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SPI_CONFIG_DEBUG_COLOR +#define NRFX_SPI_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_SWI_ENABLED - nrfx_swi - SWI/EGU peripheral allocator +//========================================================== +#ifndef NRFX_SWI_ENABLED +#define NRFX_SWI_ENABLED 0 +#endif +// NRFX_EGU_ENABLED - Enable EGU support + + +#ifndef NRFX_EGU_ENABLED +#define NRFX_EGU_ENABLED 1 +#endif + +// NRFX_SWI0_DISABLED - Exclude SWI0 from being utilized by the driver + + +#ifndef NRFX_SWI0_DISABLED +#define NRFX_SWI0_DISABLED 0 +#endif + +// NRFX_SWI1_DISABLED - Exclude SWI1 from being utilized by the driver + + +#ifndef NRFX_SWI1_DISABLED +#define NRFX_SWI1_DISABLED 0 +#endif + +// NRFX_SWI2_DISABLED - Exclude SWI2 from being utilized by the driver + + +#ifndef NRFX_SWI2_DISABLED +#define NRFX_SWI2_DISABLED 0 +#endif + +// NRFX_SWI3_DISABLED - Exclude SWI3 from being utilized by the driver + + +#ifndef NRFX_SWI3_DISABLED +#define NRFX_SWI3_DISABLED 0 +#endif + +// NRFX_SWI4_DISABLED - Exclude SWI4 from being utilized by the driver + + +#ifndef NRFX_SWI4_DISABLED +#define NRFX_SWI4_DISABLED 0 +#endif + +// NRFX_SWI5_DISABLED - Exclude SWI5 from being utilized by the driver + + +#ifndef NRFX_SWI5_DISABLED +#define NRFX_SWI5_DISABLED 0 +#endif + +// NRFX_SWI_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_SWI_CONFIG_LOG_ENABLED +#define NRFX_SWI_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_SWI_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_SWI_CONFIG_LOG_LEVEL +#define NRFX_SWI_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_SWI_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SWI_CONFIG_INFO_COLOR +#define NRFX_SWI_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_SWI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SWI_CONFIG_DEBUG_COLOR +#define NRFX_SWI_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_TIMER_ENABLED - nrfx_timer - TIMER periperal driver +//========================================================== +#ifndef NRFX_TIMER_ENABLED +#define NRFX_TIMER_ENABLED 0 +#endif +// NRFX_TIMER0_ENABLED - Enable TIMER0 instance + + +#ifndef NRFX_TIMER0_ENABLED +#define NRFX_TIMER0_ENABLED 0 +#endif + +// NRFX_TIMER1_ENABLED - Enable TIMER1 instance + + +#ifndef NRFX_TIMER1_ENABLED +#define NRFX_TIMER1_ENABLED 0 +#endif + +// NRFX_TIMER2_ENABLED - Enable TIMER2 instance + + +#ifndef NRFX_TIMER2_ENABLED +#define NRFX_TIMER2_ENABLED 0 +#endif + +// NRFX_TIMER3_ENABLED - Enable TIMER3 instance + + +#ifndef NRFX_TIMER3_ENABLED +#define NRFX_TIMER3_ENABLED 0 +#endif + +// NRFX_TIMER4_ENABLED - Enable TIMER4 instance + + +#ifndef NRFX_TIMER4_ENABLED +#define NRFX_TIMER4_ENABLED 0 +#endif + +// NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY - Timer frequency if in Timer mode + +// <0=> 16 MHz +// <1=> 8 MHz +// <2=> 4 MHz +// <3=> 2 MHz +// <4=> 1 MHz +// <5=> 500 kHz +// <6=> 250 kHz +// <7=> 125 kHz +// <8=> 62.5 kHz +// <9=> 31.25 kHz + +#ifndef NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY +#define NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY 0 +#endif + +// NRFX_TIMER_DEFAULT_CONFIG_MODE - Timer mode or operation + +// <0=> Timer +// <1=> Counter + +#ifndef NRFX_TIMER_DEFAULT_CONFIG_MODE +#define NRFX_TIMER_DEFAULT_CONFIG_MODE 0 +#endif + +// NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH - Timer counter bit width + +// <0=> 16 bit +// <1=> 8 bit +// <2=> 24 bit +// <3=> 32 bit + +#ifndef NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH +#define NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH 0 +#endif + +// NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_TIMER_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_TIMER_CONFIG_LOG_ENABLED +#define NRFX_TIMER_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_TIMER_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_TIMER_CONFIG_LOG_LEVEL +#define NRFX_TIMER_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_TIMER_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TIMER_CONFIG_INFO_COLOR +#define NRFX_TIMER_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_TIMER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TIMER_CONFIG_DEBUG_COLOR +#define NRFX_TIMER_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_TWIM_ENABLED - nrfx_twim - TWIM peripheral driver +//========================================================== +#ifndef NRFX_TWIM_ENABLED +#define NRFX_TWIM_ENABLED 1 +#endif +// NRFX_TWIM0_ENABLED - Enable TWIM0 instance + + +#ifndef NRFX_TWIM0_ENABLED +#define NRFX_TWIM0_ENABLED 1 +#endif + +// NRFX_TWIM1_ENABLED - Enable TWIM1 instance + + +#ifndef NRFX_TWIM1_ENABLED +#define NRFX_TWIM1_ENABLED 1 +#endif + +// NRFX_TWIM_DEFAULT_CONFIG_FREQUENCY - Frequency + +// <26738688=> 100k +// <67108864=> 250k +// <104857600=> 400k + +#ifndef NRFX_TWIM_DEFAULT_CONFIG_FREQUENCY +#define NRFX_TWIM_DEFAULT_CONFIG_FREQUENCY 26738688 +#endif + +// NRFX_TWIM_DEFAULT_CONFIG_HOLD_BUS_UNINIT - Enables bus holding after uninit + + +#ifndef NRFX_TWIM_DEFAULT_CONFIG_HOLD_BUS_UNINIT +#define NRFX_TWIM_DEFAULT_CONFIG_HOLD_BUS_UNINIT 0 +#endif + +// NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + // <0=> 0 (highest) // <1=> 1 // <2=> 2 @@ -2099,43 +3848,721 @@ // <6=> 6 // <7=> 7 +#ifndef NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_TWIM_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_TWIM_CONFIG_LOG_ENABLED +#define NRFX_TWIM_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_TWIM_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_TWIM_CONFIG_LOG_LEVEL +#define NRFX_TWIM_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_TWIM_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TWIM_CONFIG_INFO_COLOR +#define NRFX_TWIM_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_TWIM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TWIM_CONFIG_DEBUG_COLOR +#define NRFX_TWIM_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_TWIS_ENABLED - nrfx_twis - TWIS peripheral driver +//========================================================== +#ifndef NRFX_TWIS_ENABLED +#define NRFX_TWIS_ENABLED 0 +#endif +// NRFX_TWIS0_ENABLED - Enable TWIS0 instance + + +#ifndef NRFX_TWIS0_ENABLED +#define NRFX_TWIS0_ENABLED 0 +#endif + +// NRFX_TWIS1_ENABLED - Enable TWIS1 instance + + +#ifndef NRFX_TWIS1_ENABLED +#define NRFX_TWIS1_ENABLED 0 +#endif + +// NRFX_TWIS_ASSUME_INIT_AFTER_RESET_ONLY - Assume that any instance would be initialized only once + + +// Optimization flag. Registers used by TWIS are shared by other peripherals. Normally, during initialization driver tries to clear all registers to known state before doing the initialization itself. This gives initialization safe procedure, no matter when it would be called. If you activate TWIS only once and do never uninitialize it - set this flag to 1 what gives more optimal code. + +#ifndef NRFX_TWIS_ASSUME_INIT_AFTER_RESET_ONLY +#define NRFX_TWIS_ASSUME_INIT_AFTER_RESET_ONLY 0 +#endif + +// NRFX_TWIS_NO_SYNC_MODE - Remove support for synchronous mode + + +// Synchronous mode would be used in specific situations. And it uses some additional code and data memory to safely process state machine by polling it in status functions. If this functionality is not required it may be disabled to free some resources. + +#ifndef NRFX_TWIS_NO_SYNC_MODE +#define NRFX_TWIS_NO_SYNC_MODE 0 +#endif + +// NRFX_TWIS_DEFAULT_CONFIG_ADDR0 - Address0 +#ifndef NRFX_TWIS_DEFAULT_CONFIG_ADDR0 +#define NRFX_TWIS_DEFAULT_CONFIG_ADDR0 0 +#endif + +// NRFX_TWIS_DEFAULT_CONFIG_ADDR1 - Address1 +#ifndef NRFX_TWIS_DEFAULT_CONFIG_ADDR1 +#define NRFX_TWIS_DEFAULT_CONFIG_ADDR1 0 +#endif + +// NRFX_TWIS_DEFAULT_CONFIG_SCL_PULL - SCL pin pull configuration + +// <0=> Disabled +// <1=> Pull down +// <3=> Pull up + +#ifndef NRFX_TWIS_DEFAULT_CONFIG_SCL_PULL +#define NRFX_TWIS_DEFAULT_CONFIG_SCL_PULL 0 +#endif + +// NRFX_TWIS_DEFAULT_CONFIG_SDA_PULL - SDA pin pull configuration + +// <0=> Disabled +// <1=> Pull down +// <3=> Pull up + +#ifndef NRFX_TWIS_DEFAULT_CONFIG_SDA_PULL +#define NRFX_TWIS_DEFAULT_CONFIG_SDA_PULL 0 +#endif + +// NRFX_TWIS_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_TWIS_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_TWIS_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_TWIS_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_TWIS_CONFIG_LOG_ENABLED +#define NRFX_TWIS_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_TWIS_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_TWIS_CONFIG_LOG_LEVEL +#define NRFX_TWIS_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_TWIS_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TWIS_CONFIG_INFO_COLOR +#define NRFX_TWIS_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_TWIS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TWIS_CONFIG_DEBUG_COLOR +#define NRFX_TWIS_CONFIG_DEBUG_COLOR 0 +#endif + +// + +#ifndef NRFX_PRS_ENABLED +#define NRFX_PRS_ENABLED 1 +#endif + +// + +// NRFX_TWI_ENABLED - nrfx_twi - TWI peripheral driver +//========================================================== + +#ifndef NRFX_TWI_ENABLED +#define NRFX_TWI_ENABLED 1 +#endif +// NRFX_TWI0_ENABLED - Enable TWI0 instance + + +#ifndef NRFX_TWI0_ENABLED +#define NRFX_TWI0_ENABLED 1 +#endif + +// NRFX_TWI1_ENABLED - Enable TWI1 instance + + +#ifndef NRFX_TWI1_ENABLED +#define NRFX_TWI1_ENABLED 1 +#endif + +// NRFX_TWI_DEFAULT_CONFIG_FREQUENCY - Frequency + +// <26738688=> 100k +// <67108864=> 250k +// <104857600=> 400k + +#ifndef NRFX_TWI_DEFAULT_CONFIG_FREQUENCY +#define NRFX_TWI_DEFAULT_CONFIG_FREQUENCY 26738688 +#endif + +// NRFX_TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT - Enables bus holding after uninit + + +#ifndef NRFX_TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT +#define NRFX_TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT 0 +#endif + +// NRFX_TWI_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_TWI_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_TWI_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_TWI_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_TWI_CONFIG_LOG_ENABLED +#define NRFX_TWI_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_TWI_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_TWI_CONFIG_LOG_LEVEL +#define NRFX_TWI_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_TWI_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TWI_CONFIG_INFO_COLOR +#define NRFX_TWI_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_TWI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TWI_CONFIG_DEBUG_COLOR +#define NRFX_TWI_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_UARTE_ENABLED - nrfx_uarte - UARTE peripheral driver +//========================================================== +#ifndef NRFX_UARTE_ENABLED +#define NRFX_UARTE_ENABLED 0 +#endif +// NRFX_UARTE0_ENABLED - Enable UARTE0 instance +#ifndef NRFX_UARTE0_ENABLED +#define NRFX_UARTE0_ENABLED 0 +#endif + +// NRFX_UARTE1_ENABLED - Enable UARTE1 instance +#ifndef NRFX_UARTE1_ENABLED +#define NRFX_UARTE1_ENABLED 0 +#endif + +// NRFX_UARTE_DEFAULT_CONFIG_HWFC - Hardware Flow Control + +// <0=> Disabled +// <1=> Enabled + +#ifndef NRFX_UARTE_DEFAULT_CONFIG_HWFC +#define NRFX_UARTE_DEFAULT_CONFIG_HWFC 0 +#endif + +// NRFX_UARTE_DEFAULT_CONFIG_PARITY - Parity + +// <0=> Excluded +// <14=> Included + +#ifndef NRFX_UARTE_DEFAULT_CONFIG_PARITY +#define NRFX_UARTE_DEFAULT_CONFIG_PARITY 0 +#endif + +// NRFX_UARTE_DEFAULT_CONFIG_BAUDRATE - Default Baudrate + +// <323584=> 1200 baud +// <643072=> 2400 baud +// <1290240=> 4800 baud +// <2576384=> 9600 baud +// <3862528=> 14400 baud +// <5152768=> 19200 baud +// <7716864=> 28800 baud +// <8388608=> 31250 baud +// <10289152=> 38400 baud +// <15007744=> 56000 baud +// <15400960=> 57600 baud +// <20615168=> 76800 baud +// <30801920=> 115200 baud +// <61865984=> 230400 baud +// <67108864=> 250000 baud +// <121634816=> 460800 baud +// <251658240=> 921600 baud +// <268435456=> 1000000 baud + +#ifndef NRFX_UARTE_DEFAULT_CONFIG_BAUDRATE +#define NRFX_UARTE_DEFAULT_CONFIG_BAUDRATE 30801920 +#endif + +// NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_UARTE_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_UARTE_CONFIG_LOG_ENABLED +#define NRFX_UARTE_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_UARTE_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_UARTE_CONFIG_LOG_LEVEL +#define NRFX_UARTE_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_UARTE_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_UARTE_CONFIG_INFO_COLOR +#define NRFX_UARTE_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_UARTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_UARTE_CONFIG_DEBUG_COLOR +#define NRFX_UARTE_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_UART_ENABLED - nrfx_uart - UART peripheral driver +//========================================================== +#ifndef NRFX_UART_ENABLED +#define NRFX_UART_ENABLED 1 +#endif +// NRFX_UART0_ENABLED - Enable UART0 instance +#ifndef NRFX_UART0_ENABLED +#define NRFX_UART0_ENABLED 1 +#endif + +// NRFX_UART_DEFAULT_CONFIG_HWFC - Hardware Flow Control + +// <0=> Disabled +// <1=> Enabled + +#ifndef NRFX_UART_DEFAULT_CONFIG_HWFC +#define NRFX_UART_DEFAULT_CONFIG_HWFC 0 +#endif + +// NRFX_UART_DEFAULT_CONFIG_PARITY - Parity + +// <0=> Excluded +// <14=> Included + +#ifndef NRFX_UART_DEFAULT_CONFIG_PARITY +#define NRFX_UART_DEFAULT_CONFIG_PARITY 0 +#endif + +// NRFX_UART_DEFAULT_CONFIG_BAUDRATE - Default Baudrate + +// <323584=> 1200 baud +// <643072=> 2400 baud +// <1290240=> 4800 baud +// <2576384=> 9600 baud +// <3866624=> 14400 baud +// <5152768=> 19200 baud +// <7729152=> 28800 baud +// <8388608=> 31250 baud +// <10309632=> 38400 baud +// <15007744=> 56000 baud +// <15462400=> 57600 baud +// <20615168=> 76800 baud +// <30924800=> 115200 baud +// <61845504=> 230400 baud +// <67108864=> 250000 baud +// <123695104=> 460800 baud +// <247386112=> 921600 baud +// <268435456=> 1000000 baud + +#ifndef NRFX_UART_DEFAULT_CONFIG_BAUDRATE +#define NRFX_UART_DEFAULT_CONFIG_BAUDRATE 30924800 +#endif + +// NRFX_UART_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_UART_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_UART_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_UART_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_UART_CONFIG_LOG_ENABLED +#define NRFX_UART_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_UART_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_UART_CONFIG_LOG_LEVEL +#define NRFX_UART_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_UART_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_UART_CONFIG_INFO_COLOR +#define NRFX_UART_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_UART_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_UART_CONFIG_DEBUG_COLOR +#define NRFX_UART_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_WDT_ENABLED - nrfx_wdt - WDT peripheral driver +//========================================================== +#ifndef NRFX_WDT_ENABLED +#define NRFX_WDT_ENABLED 0 +#endif +// NRFX_WDT_CONFIG_BEHAVIOUR - WDT behavior in CPU SLEEP or HALT mode + +// <1=> Run in SLEEP, Pause in HALT +// <8=> Pause in SLEEP, Run in HALT +// <9=> Run in SLEEP and HALT +// <0=> Pause in SLEEP and HALT + +#ifndef NRFX_WDT_CONFIG_BEHAVIOUR +#define NRFX_WDT_CONFIG_BEHAVIOUR 1 +#endif + +// NRFX_WDT_CONFIG_RELOAD_VALUE - Reload value <15-4294967295> + + +#ifndef NRFX_WDT_CONFIG_RELOAD_VALUE +#define NRFX_WDT_CONFIG_RELOAD_VALUE 2000 +#endif + +// NRFX_WDT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_WDT_CONFIG_IRQ_PRIORITY +#define NRFX_WDT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_WDT_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_WDT_CONFIG_LOG_ENABLED +#define NRFX_WDT_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_WDT_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_WDT_CONFIG_LOG_LEVEL +#define NRFX_WDT_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_WDT_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_WDT_CONFIG_INFO_COLOR +#define NRFX_WDT_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_WDT_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_WDT_CONFIG_DEBUG_COLOR +#define NRFX_WDT_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// PDM_ENABLED - nrf_drv_pdm - PDM peripheral driver - legacy layer +//========================================================== +#ifndef PDM_ENABLED +#define PDM_ENABLED 0 +#endif +// PDM_CONFIG_MODE - Mode + +// <0=> Stereo +// <1=> Mono + +#ifndef PDM_CONFIG_MODE +#define PDM_CONFIG_MODE 1 +#endif + +// PDM_CONFIG_EDGE - Edge + +// <0=> Left falling +// <1=> Left rising + +#ifndef PDM_CONFIG_EDGE +#define PDM_CONFIG_EDGE 0 +#endif + +// PDM_CONFIG_CLOCK_FREQ - Clock frequency + +// <134217728=> 1000k +// <138412032=> 1032k (default) +// <142606336=> 1067k + +#ifndef PDM_CONFIG_CLOCK_FREQ +#define PDM_CONFIG_CLOCK_FREQ 138412032 +#endif + +// PDM_CONFIG_IRQ_PRIORITY - Interrupt priority + + +// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + #ifndef PDM_CONFIG_IRQ_PRIORITY #define PDM_CONFIG_IRQ_PRIORITY 7 #endif // -// PERIPHERAL_RESOURCE_SHARING_ENABLED - nrf_drv_common - Peripheral drivers common module - - -#ifndef PERIPHERAL_RESOURCE_SHARING_ENABLED -#define PERIPHERAL_RESOURCE_SHARING_ENABLED 1 -#endif - -// POWER_ENABLED - nrf_drv_power - POWER peripheral driver +// POWER_ENABLED - nrf_drv_power - POWER peripheral driver - legacy layer //========================================================== #ifndef POWER_ENABLED #define POWER_ENABLED 0 #endif // POWER_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef POWER_CONFIG_IRQ_PRIORITY #define POWER_CONFIG_IRQ_PRIORITY 7 #endif // POWER_CONFIG_DEFAULT_DCDCEN - The default configuration of main DCDC regulator - + // This settings means only that components for DCDC regulator are installed and it can be enabled. @@ -2144,7 +4571,7 @@ #endif // POWER_CONFIG_DEFAULT_DCDCENHV - The default configuration of High Voltage DCDC regulator - + // This settings means only that components for DCDC regulator are installed and it can be enabled. @@ -2154,40 +4581,40 @@ // -// PPI_ENABLED - nrf_drv_ppi - PPI peripheral driver - +// PPI_ENABLED - nrf_drv_ppi - PPI peripheral driver - legacy layer + #ifndef PPI_ENABLED -#define PPI_ENABLED 1 +#define PPI_ENABLED 0 #endif -// PWM_ENABLED - nrf_drv_pwm - PWM peripheral driver +// PWM_ENABLED - nrf_drv_pwm - PWM peripheral driver - legacy layer //========================================================== #ifndef PWM_ENABLED -#define PWM_ENABLED 1 +#define PWM_ENABLED 0 #endif -// PWM_DEFAULT_CONFIG_OUT0_PIN - Out0 pin <0-31> +// PWM_DEFAULT_CONFIG_OUT0_PIN - Out0 pin <0-31> #ifndef PWM_DEFAULT_CONFIG_OUT0_PIN #define PWM_DEFAULT_CONFIG_OUT0_PIN 31 #endif -// PWM_DEFAULT_CONFIG_OUT1_PIN - Out1 pin <0-31> +// PWM_DEFAULT_CONFIG_OUT1_PIN - Out1 pin <0-31> #ifndef PWM_DEFAULT_CONFIG_OUT1_PIN #define PWM_DEFAULT_CONFIG_OUT1_PIN 31 #endif -// PWM_DEFAULT_CONFIG_OUT2_PIN - Out2 pin <0-31> +// PWM_DEFAULT_CONFIG_OUT2_PIN - Out2 pin <0-31> #ifndef PWM_DEFAULT_CONFIG_OUT2_PIN #define PWM_DEFAULT_CONFIG_OUT2_PIN 31 #endif -// PWM_DEFAULT_CONFIG_OUT3_PIN - Out3 pin <0-31> +// PWM_DEFAULT_CONFIG_OUT3_PIN - Out3 pin <0-31> #ifndef PWM_DEFAULT_CONFIG_OUT3_PIN @@ -2195,94 +4622,94 @@ #endif // PWM_DEFAULT_CONFIG_BASE_CLOCK - Base clock - -// <0=> 16 MHz -// <1=> 8 MHz -// <2=> 4 MHz -// <3=> 2 MHz -// <4=> 1 MHz -// <5=> 500 kHz -// <6=> 250 kHz -// <7=> 125 kHz + +// <0=> 16 MHz +// <1=> 8 MHz +// <2=> 4 MHz +// <3=> 2 MHz +// <4=> 1 MHz +// <5=> 500 kHz +// <6=> 250 kHz +// <7=> 125 kHz #ifndef PWM_DEFAULT_CONFIG_BASE_CLOCK #define PWM_DEFAULT_CONFIG_BASE_CLOCK 4 #endif // PWM_DEFAULT_CONFIG_COUNT_MODE - Count mode - -// <0=> Up -// <1=> Up and Down + +// <0=> Up +// <1=> Up and Down #ifndef PWM_DEFAULT_CONFIG_COUNT_MODE #define PWM_DEFAULT_CONFIG_COUNT_MODE 0 #endif -// PWM_DEFAULT_CONFIG_TOP_VALUE - Top value +// PWM_DEFAULT_CONFIG_TOP_VALUE - Top value #ifndef PWM_DEFAULT_CONFIG_TOP_VALUE #define PWM_DEFAULT_CONFIG_TOP_VALUE 1000 #endif // PWM_DEFAULT_CONFIG_LOAD_MODE - Load mode - -// <0=> Common -// <1=> Grouped -// <2=> Individual -// <3=> Waveform + +// <0=> Common +// <1=> Grouped +// <2=> Individual +// <3=> Waveform #ifndef PWM_DEFAULT_CONFIG_LOAD_MODE #define PWM_DEFAULT_CONFIG_LOAD_MODE 0 #endif // PWM_DEFAULT_CONFIG_STEP_MODE - Step mode - -// <0=> Auto -// <1=> Triggered + +// <0=> Auto +// <1=> Triggered #ifndef PWM_DEFAULT_CONFIG_STEP_MODE #define PWM_DEFAULT_CONFIG_STEP_MODE 0 #endif // PWM_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + - -// Priorities 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef PWM_DEFAULT_CONFIG_IRQ_PRIORITY #define PWM_DEFAULT_CONFIG_IRQ_PRIORITY 7 #endif // PWM0_ENABLED - Enable PWM0 instance - + #ifndef PWM0_ENABLED -#define PWM0_ENABLED 1 +#define PWM0_ENABLED 0 #endif // PWM1_ENABLED - Enable PWM1 instance - + #ifndef PWM1_ENABLED -#define PWM1_ENABLED 1 +#define PWM1_ENABLED 0 #endif // PWM2_ENABLED - Enable PWM2 instance - + #ifndef PWM2_ENABLED -#define PWM2_ENABLED 1 +#define PWM2_ENABLED 0 #endif // PWM3_ENABLED - Enable PWM3 instance - + #ifndef PWM3_ENABLED #define PWM3_ENABLED 0 @@ -2290,102 +4717,102 @@ // -// QDEC_ENABLED - nrf_drv_qdec - QDEC peripheral driver +// QDEC_ENABLED - nrf_drv_qdec - QDEC peripheral driver - legacy layer //========================================================== #ifndef QDEC_ENABLED #define QDEC_ENABLED 0 #endif // QDEC_CONFIG_REPORTPER - Report period - -// <0=> 10 Samples -// <1=> 40 Samples -// <2=> 80 Samples -// <3=> 120 Samples -// <4=> 160 Samples -// <5=> 200 Samples -// <6=> 240 Samples -// <7=> 280 Samples + +// <0=> 10 Samples +// <1=> 40 Samples +// <2=> 80 Samples +// <3=> 120 Samples +// <4=> 160 Samples +// <5=> 200 Samples +// <6=> 240 Samples +// <7=> 280 Samples #ifndef QDEC_CONFIG_REPORTPER #define QDEC_CONFIG_REPORTPER 0 #endif // QDEC_CONFIG_SAMPLEPER - Sample period - -// <0=> 128 us -// <1=> 256 us -// <2=> 512 us -// <3=> 1024 us -// <4=> 2048 us -// <5=> 4096 us -// <6=> 8192 us -// <7=> 16384 us + +// <0=> 128 us +// <1=> 256 us +// <2=> 512 us +// <3=> 1024 us +// <4=> 2048 us +// <5=> 4096 us +// <6=> 8192 us +// <7=> 16384 us #ifndef QDEC_CONFIG_SAMPLEPER #define QDEC_CONFIG_SAMPLEPER 7 #endif -// QDEC_CONFIG_PIO_A - A pin <0-31> +// QDEC_CONFIG_PIO_A - A pin <0-31> #ifndef QDEC_CONFIG_PIO_A #define QDEC_CONFIG_PIO_A 31 #endif -// QDEC_CONFIG_PIO_B - B pin <0-31> +// QDEC_CONFIG_PIO_B - B pin <0-31> #ifndef QDEC_CONFIG_PIO_B #define QDEC_CONFIG_PIO_B 31 #endif -// QDEC_CONFIG_PIO_LED - LED pin <0-31> +// QDEC_CONFIG_PIO_LED - LED pin <0-31> #ifndef QDEC_CONFIG_PIO_LED #define QDEC_CONFIG_PIO_LED 31 #endif -// QDEC_CONFIG_LEDPRE - LED pre +// QDEC_CONFIG_LEDPRE - LED pre #ifndef QDEC_CONFIG_LEDPRE #define QDEC_CONFIG_LEDPRE 511 #endif // QDEC_CONFIG_LEDPOL - LED polarity - -// <0=> Active low -// <1=> Active high + +// <0=> Active low +// <1=> Active high #ifndef QDEC_CONFIG_LEDPOL #define QDEC_CONFIG_LEDPOL 1 #endif // QDEC_CONFIG_DBFEN - Debouncing enable - + #ifndef QDEC_CONFIG_DBFEN #define QDEC_CONFIG_DBFEN 0 #endif // QDEC_CONFIG_SAMPLE_INTEN - Sample ready interrupt enable - + #ifndef QDEC_CONFIG_SAMPLE_INTEN #define QDEC_CONFIG_SAMPLE_INTEN 0 #endif // QDEC_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef QDEC_CONFIG_IRQ_PRIORITY #define QDEC_CONFIG_IRQ_PRIORITY 7 @@ -2393,35 +4820,165 @@ // -// RNG_ENABLED - nrf_drv_rng - RNG peripheral driver +// QSPI_ENABLED - nrf_drv_qspi - QSPI peripheral driver - legacy layer +//========================================================== +#ifndef QSPI_ENABLED +#define QSPI_ENABLED 0 +#endif +// QSPI_CONFIG_SCK_DELAY - tSHSL, tWHSL and tSHWL in number of 16 MHz periods (62.5 ns). <0-255> + + +#ifndef QSPI_CONFIG_SCK_DELAY +#define QSPI_CONFIG_SCK_DELAY 1 +#endif + +// QSPI_CONFIG_XIP_OFFSET - Address offset in the external memory for Execute in Place operation. +#ifndef QSPI_CONFIG_XIP_OFFSET +#define QSPI_CONFIG_XIP_OFFSET 0 +#endif + +// QSPI_CONFIG_READOC - Number of data lines and opcode used for reading. + +// <0=> FastRead +// <1=> Read2O +// <2=> Read2IO +// <3=> Read4O +// <4=> Read4IO + +#ifndef QSPI_CONFIG_READOC +#define QSPI_CONFIG_READOC 0 +#endif + +// QSPI_CONFIG_WRITEOC - Number of data lines and opcode used for writing. + +// <0=> PP +// <1=> PP2O +// <2=> PP4O +// <3=> PP4IO + +#ifndef QSPI_CONFIG_WRITEOC +#define QSPI_CONFIG_WRITEOC 0 +#endif + +// QSPI_CONFIG_ADDRMODE - Addressing mode. + +// <0=> 24bit +// <1=> 32bit + +#ifndef QSPI_CONFIG_ADDRMODE +#define QSPI_CONFIG_ADDRMODE 0 +#endif + +// QSPI_CONFIG_MODE - SPI mode. + +// <0=> Mode 0 +// <1=> Mode 1 + +#ifndef QSPI_CONFIG_MODE +#define QSPI_CONFIG_MODE 0 +#endif + +// QSPI_CONFIG_FREQUENCY - Frequency divider. + +// <0=> 32MHz/1 +// <1=> 32MHz/2 +// <2=> 32MHz/3 +// <3=> 32MHz/4 +// <4=> 32MHz/5 +// <5=> 32MHz/6 +// <6=> 32MHz/7 +// <7=> 32MHz/8 +// <8=> 32MHz/9 +// <9=> 32MHz/10 +// <10=> 32MHz/11 +// <11=> 32MHz/12 +// <12=> 32MHz/13 +// <13=> 32MHz/14 +// <14=> 32MHz/15 +// <15=> 32MHz/16 + +#ifndef QSPI_CONFIG_FREQUENCY +#define QSPI_CONFIG_FREQUENCY 15 +#endif + +// QSPI_PIN_SCK - SCK pin value. +#ifndef QSPI_PIN_SCK +#define QSPI_PIN_SCK NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// QSPI_PIN_CSN - CSN pin value. +#ifndef QSPI_PIN_CSN +#define QSPI_PIN_CSN NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// QSPI_PIN_IO0 - IO0 pin value. +#ifndef QSPI_PIN_IO0 +#define QSPI_PIN_IO0 NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// QSPI_PIN_IO1 - IO1 pin value. +#ifndef QSPI_PIN_IO1 +#define QSPI_PIN_IO1 NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// QSPI_PIN_IO2 - IO2 pin value. +#ifndef QSPI_PIN_IO2 +#define QSPI_PIN_IO2 NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// QSPI_PIN_IO3 - IO3 pin value. +#ifndef QSPI_PIN_IO3 +#define QSPI_PIN_IO3 NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// QSPI_CONFIG_IRQ_PRIORITY - Interrupt priority + + +// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef QSPI_CONFIG_IRQ_PRIORITY +#define QSPI_CONFIG_IRQ_PRIORITY 7 +#endif + +// + +// RNG_ENABLED - nrf_drv_rng - RNG peripheral driver - legacy layer //========================================================== #ifndef RNG_ENABLED #define RNG_ENABLED 1 #endif // RNG_CONFIG_ERROR_CORRECTION - Error correction - + #ifndef RNG_CONFIG_ERROR_CORRECTION #define RNG_CONFIG_ERROR_CORRECTION 1 #endif -// RNG_CONFIG_POOL_SIZE - Pool size +// RNG_CONFIG_POOL_SIZE - Pool size #ifndef RNG_CONFIG_POOL_SIZE #define RNG_CONFIG_POOL_SIZE 64 #endif // RNG_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef RNG_CONFIG_IRQ_PRIORITY #define RNG_CONFIG_IRQ_PRIORITY 7 @@ -2429,12 +4986,12 @@ // -// RTC_ENABLED - nrf_drv_rtc - RTC peripheral driver +// RTC_ENABLED - nrf_drv_rtc - RTC peripheral driver - legacy layer //========================================================== #ifndef RTC_ENABLED #define RTC_ENABLED 0 #endif -// RTC_DEFAULT_CONFIG_FREQUENCY - Frequency <16-32768> +// RTC_DEFAULT_CONFIG_FREQUENCY - Frequency <16-32768> #ifndef RTC_DEFAULT_CONFIG_FREQUENCY @@ -2442,31 +4999,31 @@ #endif // RTC_DEFAULT_CONFIG_RELIABLE - Ensures safe compare event triggering - + #ifndef RTC_DEFAULT_CONFIG_RELIABLE #define RTC_DEFAULT_CONFIG_RELIABLE 0 #endif // RTC_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef RTC_DEFAULT_CONFIG_IRQ_PRIORITY #define RTC_DEFAULT_CONFIG_IRQ_PRIORITY 7 #endif // RTC0_ENABLED - Enable RTC0 instance - + #ifndef RTC0_ENABLED #define RTC0_ENABLED 0 @@ -2480,70 +5037,70 @@ #endif // RTC2_ENABLED - Enable RTC2 instance - + #ifndef RTC2_ENABLED #define RTC2_ENABLED 0 #endif -// NRF_MAXIMUM_LATENCY_US - Maximum possible time[us] in highest priority interrupt +// NRF_MAXIMUM_LATENCY_US - Maximum possible time[us] in highest priority interrupt #ifndef NRF_MAXIMUM_LATENCY_US #define NRF_MAXIMUM_LATENCY_US 2000 #endif // -// SAADC_ENABLED - nrf_drv_saadc - SAADC peripheral driver +// SAADC_ENABLED - nrf_drv_saadc - SAADC peripheral driver - legacy layer //========================================================== #ifndef SAADC_ENABLED #define SAADC_ENABLED 1 #endif // SAADC_CONFIG_RESOLUTION - Resolution - -// <0=> 8 bit -// <1=> 10 bit -// <2=> 12 bit -// <3=> 14 bit + +// <0=> 8 bit +// <1=> 10 bit +// <2=> 12 bit +// <3=> 14 bit #ifndef SAADC_CONFIG_RESOLUTION -#define SAADC_CONFIG_RESOLUTION 2 +#define SAADC_CONFIG_RESOLUTION 1 #endif // SAADC_CONFIG_OVERSAMPLE - Sample period - -// <0=> Disabled -// <1=> 2x -// <2=> 4x -// <3=> 8x + +// <0=> Disabled +// <1=> 2x +// <2=> 4x +// <3=> 8x // <4=> 16x -// <5=> 32x -// <6=> 64x -// <7=> 128x -// <8=> 256x +// <5=> 32x +// <6=> 64x +// <7=> 128x +// <8=> 256x #ifndef SAADC_CONFIG_OVERSAMPLE #define SAADC_CONFIG_OVERSAMPLE 0 #endif // SAADC_CONFIG_LP_MODE - Enabling low power mode - + #ifndef SAADC_CONFIG_LP_MODE #define SAADC_CONFIG_LP_MODE 0 #endif // SAADC_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef SAADC_CONFIG_IRQ_PRIORITY #define SAADC_CONFIG_IRQ_PRIORITY 7 @@ -2551,56 +5108,56 @@ // -// SPIS_ENABLED - nrf_drv_spis - SPI Slave driver +// SPIS_ENABLED - nrf_drv_spis - SPIS peripheral driver - legacy layer //========================================================== #ifndef SPIS_ENABLED -#define SPIS_ENABLED 1 +#define SPIS_ENABLED 0 #endif // SPIS_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef SPIS_DEFAULT_CONFIG_IRQ_PRIORITY #define SPIS_DEFAULT_CONFIG_IRQ_PRIORITY 7 #endif // SPIS_DEFAULT_MODE - Mode - -// <0=> MODE_0 -// <1=> MODE_1 -// <2=> MODE_2 -// <3=> MODE_3 + +// <0=> MODE_0 +// <1=> MODE_1 +// <2=> MODE_2 +// <3=> MODE_3 #ifndef SPIS_DEFAULT_MODE #define SPIS_DEFAULT_MODE 0 #endif // SPIS_DEFAULT_BIT_ORDER - SPIS default bit order - -// <0=> MSB first -// <1=> LSB first + +// <0=> MSB first +// <1=> LSB first #ifndef SPIS_DEFAULT_BIT_ORDER #define SPIS_DEFAULT_BIT_ORDER 0 #endif -// SPIS_DEFAULT_DEF - SPIS default DEF character <0-255> +// SPIS_DEFAULT_DEF - SPIS default DEF character <0-255> #ifndef SPIS_DEFAULT_DEF #define SPIS_DEFAULT_DEF 255 #endif -// SPIS_DEFAULT_ORC - SPIS default ORC character <0-255> +// SPIS_DEFAULT_ORC - SPIS default ORC character <0-255> #ifndef SPIS_DEFAULT_ORC @@ -2608,21 +5165,21 @@ #endif // SPIS0_ENABLED - Enable SPIS0 instance - + #ifndef SPIS0_ENABLED -#define SPIS0_ENABLED 1 +#define SPIS0_ENABLED 0 #endif // SPIS1_ENABLED - Enable SPIS1 instance - + #ifndef SPIS1_ENABLED #define SPIS1_ENABLED 0 #endif // SPIS2_ENABLED - Enable SPIS2 instance - + #ifndef SPIS2_ENABLED #define SPIS2_ENABLED 0 @@ -2630,33 +5187,33 @@ // -// SPI_ENABLED - nrf_drv_spi - SPI/SPIM peripheral driver +// SPI_ENABLED - nrf_drv_spi - SPI/SPIM peripheral driver - legacy layer //========================================================== #ifndef SPI_ENABLED -#define SPI_ENABLED 1 +#define SPI_ENABLED 0 #endif // SPI_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef SPI_DEFAULT_CONFIG_IRQ_PRIORITY #define SPI_DEFAULT_CONFIG_IRQ_PRIORITY 7 #endif // NRF_SPI_DRV_MISO_PULLUP_CFG - MISO PIN pull-up configuration. - -// <0=> NRF_GPIO_PIN_NOPULL -// <1=> NRF_GPIO_PIN_PULLDOWN -// <3=> NRF_GPIO_PIN_PULLUP + +// <0=> NRF_GPIO_PIN_NOPULL +// <1=> NRF_GPIO_PIN_PULLDOWN +// <3=> NRF_GPIO_PIN_PULLUP #ifndef NRF_SPI_DRV_MISO_PULLUP_CFG #define NRF_SPI_DRV_MISO_PULLUP_CFG 1 @@ -2671,21 +5228,7 @@ #ifndef SPI0_USE_EASY_DMA -#define SPI0_USE_EASY_DMA 0 -#endif - -// SPI0_DEFAULT_FREQUENCY - SPI frequency - -// <33554432=> 125 kHz -// <67108864=> 250 kHz -// <134217728=> 500 kHz -// <268435456=> 1 MHz -// <536870912=> 2 MHz -// <1073741824=> 4 MHz -// <2147483648=> 8 MHz - -#ifndef SPI0_DEFAULT_FREQUENCY -#define SPI0_DEFAULT_FREQUENCY 1073741824 +#define SPI0_USE_EASY_DMA 1 #endif // @@ -2699,21 +5242,7 @@ #ifndef SPI1_USE_EASY_DMA -#define SPI1_USE_EASY_DMA 0 -#endif - -// SPI1_DEFAULT_FREQUENCY - SPI frequency - -// <33554432=> 125 kHz -// <67108864=> 250 kHz -// <134217728=> 500 kHz -// <268435456=> 1 MHz -// <536870912=> 2 MHz -// <1073741824=> 4 MHz -// <2147483648=> 8 MHz - -#ifndef SPI1_DEFAULT_FREQUENCY -#define SPI1_DEFAULT_FREQUENCY 1073741824 +#define SPI1_USE_EASY_DMA 1 #endif // @@ -2727,116 +5256,102 @@ #ifndef SPI2_USE_EASY_DMA -#define SPI2_USE_EASY_DMA 0 -#endif - -// SPI2_DEFAULT_FREQUENCY - SPI frequency - -// <33554432=> 125 kHz -// <67108864=> 250 kHz -// <134217728=> 500 kHz -// <268435456=> 1 MHz -// <536870912=> 2 MHz -// <1073741824=> 4 MHz -// <2147483648=> 8 MHz - -#ifndef SPI2_DEFAULT_FREQUENCY -#define SPI2_DEFAULT_FREQUENCY 1073741824 +#define SPI2_USE_EASY_DMA 1 #endif // // -// TIMER_ENABLED - nrf_drv_timer - TIMER periperal driver +// TIMER_ENABLED - nrf_drv_timer - TIMER periperal driver - legacy layer //========================================================== #ifndef TIMER_ENABLED #define TIMER_ENABLED 0 #endif // TIMER_DEFAULT_CONFIG_FREQUENCY - Timer frequency if in Timer mode - -// <0=> 16 MHz -// <1=> 8 MHz -// <2=> 4 MHz -// <3=> 2 MHz -// <4=> 1 MHz -// <5=> 500 kHz -// <6=> 250 kHz -// <7=> 125 kHz -// <8=> 62.5 kHz -// <9=> 31.25 kHz + +// <0=> 16 MHz +// <1=> 8 MHz +// <2=> 4 MHz +// <3=> 2 MHz +// <4=> 1 MHz +// <5=> 500 kHz +// <6=> 250 kHz +// <7=> 125 kHz +// <8=> 62.5 kHz +// <9=> 31.25 kHz #ifndef TIMER_DEFAULT_CONFIG_FREQUENCY #define TIMER_DEFAULT_CONFIG_FREQUENCY 0 #endif // TIMER_DEFAULT_CONFIG_MODE - Timer mode or operation - -// <0=> Timer -// <1=> Counter + +// <0=> Timer +// <1=> Counter #ifndef TIMER_DEFAULT_CONFIG_MODE #define TIMER_DEFAULT_CONFIG_MODE 0 #endif // TIMER_DEFAULT_CONFIG_BIT_WIDTH - Timer counter bit width - -// <0=> 16 bit -// <1=> 8 bit -// <2=> 24 bit -// <3=> 32 bit + +// <0=> 16 bit +// <1=> 8 bit +// <2=> 24 bit +// <3=> 32 bit #ifndef TIMER_DEFAULT_CONFIG_BIT_WIDTH #define TIMER_DEFAULT_CONFIG_BIT_WIDTH 0 #endif // TIMER_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef TIMER_DEFAULT_CONFIG_IRQ_PRIORITY #define TIMER_DEFAULT_CONFIG_IRQ_PRIORITY 7 #endif // TIMER0_ENABLED - Enable TIMER0 instance - + #ifndef TIMER0_ENABLED #define TIMER0_ENABLED 0 #endif // TIMER1_ENABLED - Enable TIMER1 instance - + #ifndef TIMER1_ENABLED #define TIMER1_ENABLED 0 #endif // TIMER2_ENABLED - Enable TIMER2 instance - + #ifndef TIMER2_ENABLED #define TIMER2_ENABLED 0 #endif // TIMER3_ENABLED - Enable TIMER3 instance - + #ifndef TIMER3_ENABLED #define TIMER3_ENABLED 0 #endif // TIMER4_ENABLED - Enable TIMER4 instance - + #ifndef TIMER4_ENABLED #define TIMER4_ENABLED 0 @@ -2844,74 +5359,27 @@ // -// TWIS_ENABLED - nrf_drv_twis - TWIS peripheral driver +// TWIS_ENABLED - nrf_drv_twis - TWIS peripheral driver - legacy layer //========================================================== #ifndef TWIS_ENABLED #define TWIS_ENABLED 0 #endif -// TWIS_DEFAULT_CONFIG_ADDR0 - Address0 -#ifndef TWIS_DEFAULT_CONFIG_ADDR0 -#define TWIS_DEFAULT_CONFIG_ADDR0 0 -#endif - -// TWIS_DEFAULT_CONFIG_ADDR1 - Address1 -#ifndef TWIS_DEFAULT_CONFIG_ADDR1 -#define TWIS_DEFAULT_CONFIG_ADDR1 0 -#endif - -// TWIS_DEFAULT_CONFIG_SCL_PULL - SCL pin pull configuration - -// <0=> Disabled -// <1=> Pull down -// <3=> Pull up - -#ifndef TWIS_DEFAULT_CONFIG_SCL_PULL -#define TWIS_DEFAULT_CONFIG_SCL_PULL 0 -#endif - -// TWIS_DEFAULT_CONFIG_SDA_PULL - SDA pin pull configuration - -// <0=> Disabled -// <1=> Pull down -// <3=> Pull up - -#ifndef TWIS_DEFAULT_CONFIG_SDA_PULL -#define TWIS_DEFAULT_CONFIG_SDA_PULL 0 -#endif - -// TWIS_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - - -// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 - -#ifndef TWIS_DEFAULT_CONFIG_IRQ_PRIORITY -#define TWIS_DEFAULT_CONFIG_IRQ_PRIORITY 7 -#endif - // TWIS0_ENABLED - Enable TWIS0 instance - + #ifndef TWIS0_ENABLED #define TWIS0_ENABLED 0 #endif // TWIS1_ENABLED - Enable TWIS1 instance - + #ifndef TWIS1_ENABLED #define TWIS1_ENABLED 0 #endif // TWIS_ASSUME_INIT_AFTER_RESET_ONLY - Assume that any instance would be initialized only once - + // Optimization flag. Registers used by TWIS are shared by other peripherals. Normally, during initialization driver tries to clear all registers to known state before doing the initialization itself. This gives initialization safe procedure, no matter when it would be called. If you activate TWIS only once and do never uninitialize it - set this flag to 1 what gives more optimal code. @@ -2920,7 +5388,7 @@ #endif // TWIS_NO_SYNC_MODE - Remove support for synchronous mode - + // Synchronous mode would be used in specific situations. And it uses some additional code and data memory to safely process state machine by polling it in status functions. If this functionality is not required it may be disabled to free some resources. @@ -2928,49 +5396,96 @@ #define TWIS_NO_SYNC_MODE 0 #endif +// TWIS_DEFAULT_CONFIG_ADDR0 - Address0 +#ifndef TWIS_DEFAULT_CONFIG_ADDR0 +#define TWIS_DEFAULT_CONFIG_ADDR0 0 +#endif + +// TWIS_DEFAULT_CONFIG_ADDR1 - Address1 +#ifndef TWIS_DEFAULT_CONFIG_ADDR1 +#define TWIS_DEFAULT_CONFIG_ADDR1 0 +#endif + +// TWIS_DEFAULT_CONFIG_SCL_PULL - SCL pin pull configuration + +// <0=> Disabled +// <1=> Pull down +// <3=> Pull up + +#ifndef TWIS_DEFAULT_CONFIG_SCL_PULL +#define TWIS_DEFAULT_CONFIG_SCL_PULL 0 +#endif + +// TWIS_DEFAULT_CONFIG_SDA_PULL - SDA pin pull configuration + +// <0=> Disabled +// <1=> Pull down +// <3=> Pull up + +#ifndef TWIS_DEFAULT_CONFIG_SDA_PULL +#define TWIS_DEFAULT_CONFIG_SDA_PULL 0 +#endif + +// TWIS_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + + +// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef TWIS_DEFAULT_CONFIG_IRQ_PRIORITY +#define TWIS_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + // -// TWI_ENABLED - nrf_drv_twi - TWI/TWIM peripheral driver +// TWI_ENABLED - nrf_drv_twi - TWI/TWIM peripheral driver - legacy layer //========================================================== #ifndef TWI_ENABLED #define TWI_ENABLED 1 #endif // TWI_DEFAULT_CONFIG_FREQUENCY - Frequency - -// <26738688=> 100k -// <67108864=> 250k -// <104857600=> 400k + +// <26738688=> 100k +// <67108864=> 250k +// <104857600=> 400k #ifndef TWI_DEFAULT_CONFIG_FREQUENCY #define TWI_DEFAULT_CONFIG_FREQUENCY 26738688 #endif // TWI_DEFAULT_CONFIG_CLR_BUS_INIT - Enables bus clearing procedure during init - + #ifndef TWI_DEFAULT_CONFIG_CLR_BUS_INIT #define TWI_DEFAULT_CONFIG_CLR_BUS_INIT 0 #endif // TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT - Enables bus holding after uninit - + #ifndef TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT #define TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT 0 #endif // TWI_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef TWI_DEFAULT_CONFIG_IRQ_PRIORITY #define TWI_DEFAULT_CONFIG_IRQ_PRIORITY 7 @@ -2982,7 +5497,7 @@ #define TWI0_ENABLED 1 #endif // TWI0_USE_EASY_DMA - Use EasyDMA (if present) - + #ifndef TWI0_USE_EASY_DMA #define TWI0_USE_EASY_DMA 0 @@ -2996,7 +5511,7 @@ #define TWI1_ENABLED 1 #endif // TWI1_USE_EASY_DMA - Use EasyDMA (if present) - + #ifndef TWI1_USE_EASY_DMA #define TWI1_USE_EASY_DMA 0 @@ -3006,78 +5521,78 @@ // -// UART_ENABLED - nrf_drv_uart - UART/UARTE peripheral driver +// UART_ENABLED - nrf_drv_uart - UART/UARTE peripheral driver - legacy layer //========================================================== #ifndef UART_ENABLED -#define UART_ENABLED 1 +#define UART_ENABLED 0 #endif // UART_DEFAULT_CONFIG_HWFC - Hardware Flow Control - -// <0=> Disabled -// <1=> Enabled + +// <0=> Disabled +// <1=> Enabled #ifndef UART_DEFAULT_CONFIG_HWFC -#define UART_DEFAULT_CONFIG_HWFC 1 +#define UART_DEFAULT_CONFIG_HWFC 0 #endif // UART_DEFAULT_CONFIG_PARITY - Parity - -// <0=> Excluded -// <14=> Included + +// <0=> Excluded +// <14=> Included #ifndef UART_DEFAULT_CONFIG_PARITY #define UART_DEFAULT_CONFIG_PARITY 0 #endif // UART_DEFAULT_CONFIG_BAUDRATE - Default Baudrate - -// <323584=> 1200 baud -// <643072=> 2400 baud -// <1290240=> 4800 baud -// <2576384=> 9600 baud -// <3862528=> 14400 baud -// <5152768=> 19200 baud -// <7716864=> 28800 baud -// <10289152=> 38400 baud -// <15400960=> 57600 baud -// <20615168=> 76800 baud -// <30801920=> 115200 baud -// <61865984=> 230400 baud -// <67108864=> 250000 baud -// <121634816=> 460800 baud -// <251658240=> 921600 baud -// <268435456=> 1000000 baud + +// <323584=> 1200 baud +// <643072=> 2400 baud +// <1290240=> 4800 baud +// <2576384=> 9600 baud +// <3862528=> 14400 baud +// <5152768=> 19200 baud +// <7716864=> 28800 baud +// <10289152=> 38400 baud +// <15400960=> 57600 baud +// <20615168=> 76800 baud +// <30801920=> 115200 baud +// <61865984=> 230400 baud +// <67108864=> 250000 baud +// <121634816=> 460800 baud +// <251658240=> 921600 baud +// <268435456=> 1000000 baud #ifndef UART_DEFAULT_CONFIG_BAUDRATE -#define UART_DEFAULT_CONFIG_BAUDRATE 2576384 +#define UART_DEFAULT_CONFIG_BAUDRATE 30801920 #endif // UART_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef UART_DEFAULT_CONFIG_IRQ_PRIORITY #define UART_DEFAULT_CONFIG_IRQ_PRIORITY 7 #endif // UART_EASY_DMA_SUPPORT - Driver supporting EasyDMA - + #ifndef UART_EASY_DMA_SUPPORT #define UART_EASY_DMA_SUPPORT 1 #endif // UART_LEGACY_SUPPORT - Driver supporting Legacy mode - + #ifndef UART_LEGACY_SUPPORT #define UART_LEGACY_SUPPORT 1 @@ -3089,7 +5604,7 @@ #define UART0_ENABLED 1 #endif // UART0_CONFIG_USE_EASY_DMA - Default setting for using EasyDMA - + #ifndef UART0_CONFIG_USE_EASY_DMA #define UART0_CONFIG_USE_EASY_DMA 1 @@ -3102,13 +5617,6 @@ #ifndef UART1_ENABLED #define UART1_ENABLED 0 #endif -// UART1_CONFIG_USE_EASY_DMA - Default setting for using EasyDMA - - -#ifndef UART1_CONFIG_USE_EASY_DMA -#define UART1_CONFIG_USE_EASY_DMA 1 -#endif - // // @@ -3119,50 +5627,50 @@ #define USBD_ENABLED 0 #endif // USBD_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef USBD_CONFIG_IRQ_PRIORITY #define USBD_CONFIG_IRQ_PRIORITY 7 #endif -// NRF_DRV_USBD_DMASCHEDULER_MODE - USBD SMA scheduler working scheme +// USBD_CONFIG_DMASCHEDULER_MODE - USBD SMA scheduler working scheme + +// <0=> Prioritized access +// <1=> Round Robin -// <0=> Prioritized access -// <1=> Round Robin - -#ifndef NRF_DRV_USBD_DMASCHEDULER_MODE -#define NRF_DRV_USBD_DMASCHEDULER_MODE 0 +#ifndef USBD_CONFIG_DMASCHEDULER_MODE +#define USBD_CONFIG_DMASCHEDULER_MODE 0 #endif // -// WDT_ENABLED - nrf_drv_wdt - WDT peripheral driver +// WDT_ENABLED - nrf_drv_wdt - WDT peripheral driver - legacy layer //========================================================== #ifndef WDT_ENABLED #define WDT_ENABLED 0 #endif // WDT_CONFIG_BEHAVIOUR - WDT behavior in CPU SLEEP or HALT mode - -// <1=> Run in SLEEP, Pause in HALT -// <8=> Pause in SLEEP, Run in HALT -// <9=> Run in SLEEP and HALT -// <0=> Pause in SLEEP and HALT + +// <1=> Run in SLEEP, Pause in HALT +// <8=> Pause in SLEEP, Run in HALT +// <9=> Run in SLEEP and HALT +// <0=> Pause in SLEEP and HALT #ifndef WDT_CONFIG_BEHAVIOUR #define WDT_CONFIG_BEHAVIOUR 1 #endif -// WDT_CONFIG_RELOAD_VALUE - Reload value <15-4294967295> +// WDT_CONFIG_RELOAD_VALUE - Reload value <15-4294967295> #ifndef WDT_CONFIG_RELOAD_VALUE @@ -3170,17 +5678,17 @@ #endif // WDT_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef WDT_CONFIG_IRQ_PRIORITY #define WDT_CONFIG_IRQ_PRIORITY 7 @@ -3188,21 +5696,34 @@ // -// +// //========================================================== -// nRF_Libraries +// nRF_Drivers_External + +//========================================================== +// NRF_TWI_SENSOR_ENABLED - nrf_twi_sensor - nRF TWI Sensor module + + +#ifndef NRF_TWI_SENSOR_ENABLED +#define NRF_TWI_SENSOR_ENABLED 0 +#endif + +// +//========================================================== + +// nRF_Libraries //========================================================== // APP_GPIOTE_ENABLED - app_gpiote - GPIOTE events dispatcher - + #ifndef APP_GPIOTE_ENABLED #define APP_GPIOTE_ENABLED 0 #endif // APP_PWM_ENABLED - app_pwm - PWM functionality - + #ifndef APP_PWM_ENABLED #define APP_PWM_ENABLED 0 @@ -3214,14 +5735,14 @@ #define APP_SCHEDULER_ENABLED 0 #endif // APP_SCHEDULER_WITH_PAUSE - Enabling pause feature - + #ifndef APP_SCHEDULER_WITH_PAUSE #define APP_SCHEDULER_WITH_PAUSE 0 #endif // APP_SCHEDULER_WITH_PROFILER - Enabling scheduler profiling - + #ifndef APP_SCHEDULER_WITH_PROFILER #define APP_SCHEDULER_WITH_PROFILER 0 @@ -3229,42 +5750,87 @@ // +// APP_SDCARD_ENABLED - app_sdcard - SD/MMC card support using SPI +//========================================================== +#ifndef APP_SDCARD_ENABLED +#define APP_SDCARD_ENABLED 0 +#endif +// APP_SDCARD_SPI_INSTANCE - SPI instance used + +// <0=> 0 +// <1=> 1 +// <2=> 2 + +#ifndef APP_SDCARD_SPI_INSTANCE +#define APP_SDCARD_SPI_INSTANCE 0 +#endif + +// APP_SDCARD_FREQ_INIT - SPI frequency + +// <33554432=> 125 kHz +// <67108864=> 250 kHz +// <134217728=> 500 kHz +// <268435456=> 1 MHz +// <536870912=> 2 MHz +// <1073741824=> 4 MHz +// <2147483648=> 8 MHz + +#ifndef APP_SDCARD_FREQ_INIT +#define APP_SDCARD_FREQ_INIT 67108864 +#endif + +// APP_SDCARD_FREQ_DATA - SPI frequency + +// <33554432=> 125 kHz +// <67108864=> 250 kHz +// <134217728=> 500 kHz +// <268435456=> 1 MHz +// <536870912=> 2 MHz +// <1073741824=> 4 MHz +// <2147483648=> 8 MHz + +#ifndef APP_SDCARD_FREQ_DATA +#define APP_SDCARD_FREQ_DATA 1073741824 +#endif + +// + // APP_TIMER_ENABLED - app_timer - Application timer functionality //========================================================== #ifndef APP_TIMER_ENABLED #define APP_TIMER_ENABLED 0 #endif // APP_TIMER_CONFIG_RTC_FREQUENCY - Configure RTC prescaler. - -// <0=> 32768 Hz -// <1=> 16384 Hz -// <3=> 8192 Hz -// <7=> 4096 Hz -// <15=> 2048 Hz -// <31=> 1024 Hz + +// <0=> 32768 Hz +// <1=> 16384 Hz +// <3=> 8192 Hz +// <7=> 4096 Hz +// <15=> 2048 Hz +// <31=> 1024 Hz #ifndef APP_TIMER_CONFIG_RTC_FREQUENCY #define APP_TIMER_CONFIG_RTC_FREQUENCY 0 #endif // APP_TIMER_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef APP_TIMER_CONFIG_IRQ_PRIORITY #define APP_TIMER_CONFIG_IRQ_PRIORITY 7 #endif -// APP_TIMER_CONFIG_OP_QUEUE_SIZE - Capacity of timer requests queue. +// APP_TIMER_CONFIG_OP_QUEUE_SIZE - Capacity of timer requests queue. // Size of the queue depends on how many timers are used // in the system, how often timers are started and overall // system latency. If queue size is too small app_timer calls @@ -3275,21 +5841,14 @@ #endif // APP_TIMER_CONFIG_USE_SCHEDULER - Enable scheduling app_timer events to app_scheduler - + #ifndef APP_TIMER_CONFIG_USE_SCHEDULER #define APP_TIMER_CONFIG_USE_SCHEDULER 0 #endif -// APP_TIMER_WITH_PROFILER - Enable app_timer profiling - - -#ifndef APP_TIMER_WITH_PROFILER -#define APP_TIMER_WITH_PROFILER 0 -#endif - // APP_TIMER_KEEPS_RTC_ACTIVE - Enable RTC always on - + // If option is enabled RTC is kept running even if there is no active timers. // This option can be used when app_timer is used for timestamping. @@ -3298,111 +5857,259 @@ #define APP_TIMER_KEEPS_RTC_ACTIVE 0 #endif -// APP_TIMER_CONFIG_SWI_NUMBER - Configure SWI instance used. +// App Timer Legacy configuration - Legacy configuration. -// <0=> 0 -// <1=> 1 +//========================================================== +// APP_TIMER_WITH_PROFILER - Enable app_timer profiling + + +#ifndef APP_TIMER_WITH_PROFILER +#define APP_TIMER_WITH_PROFILER 0 +#endif + +// APP_TIMER_CONFIG_SWI_NUMBER - Configure SWI instance used. + #ifndef APP_TIMER_CONFIG_SWI_NUMBER #define APP_TIMER_CONFIG_SWI_NUMBER 0 #endif -// - -// NRF_TWI_MNGR_ENABLED - nrf_twi_mngr - TWI transaction manager - - -#ifndef NRF_TWI_MNGR_ENABLED -#define NRF_TWI_MNGR_ENABLED 0 -#endif - -// APP_UART_ENABLED - app_uart - UART driver +// //========================================================== -#ifndef APP_UART_ENABLED -#define APP_UART_ENABLED 0 + +// + +// APP_USBD_AUDIO_ENABLED - app_usbd_audio - USB AUDIO class + + +#ifndef APP_USBD_AUDIO_ENABLED +#define APP_USBD_AUDIO_ENABLED 0 #endif -// APP_UART_DRIVER_INSTANCE - UART instance used -// <0=> 0 +// APP_USBD_CDC_ACM_ENABLED - app_usbd_cdc_acm - USB CDC ACM class + -#ifndef APP_UART_DRIVER_INSTANCE -#define APP_UART_DRIVER_INSTANCE 0 +#ifndef APP_USBD_CDC_ACM_ENABLED +#define APP_USBD_CDC_ACM_ENABLED 0 +#endif + +// APP_USBD_ENABLED - app_usbd - USB Device library +//========================================================== +#ifndef APP_USBD_ENABLED +#define APP_USBD_ENABLED 0 +#endif +// APP_USBD_VID - Vendor ID <0x0000-0xFFFF> + + +// Vendor ID ordered from USB IF: http://www.usb.org/developers/vendor/ + +#ifndef APP_USBD_VID +#define APP_USBD_VID 0 +#endif + +// APP_USBD_PID - Product ID <0x0000-0xFFFF> + + +// Selected Product ID + +#ifndef APP_USBD_PID +#define APP_USBD_PID 0 +#endif + +// APP_USBD_DEVICE_VER_MAJOR - Device version, major part <0-99> + + +// Device version, will be converted automatically to BCD notation. Use just decimal values. + +#ifndef APP_USBD_DEVICE_VER_MAJOR +#define APP_USBD_DEVICE_VER_MAJOR 1 +#endif + +// APP_USBD_DEVICE_VER_MINOR - Device version, minor part <0-99> + + +// Device version, will be converted automatically to BCD notation. Use just decimal values. + +#ifndef APP_USBD_DEVICE_VER_MINOR +#define APP_USBD_DEVICE_VER_MINOR 0 +#endif + +// APP_USBD_CONFIG_SELF_POWERED - Self powered + + +#ifndef APP_USBD_CONFIG_SELF_POWERED +#define APP_USBD_CONFIG_SELF_POWERED 1 +#endif + +// APP_USBD_CONFIG_MAX_POWER - MaxPower field in configuration descriptor in milliamps <0-500> + + +#ifndef APP_USBD_CONFIG_MAX_POWER +#define APP_USBD_CONFIG_MAX_POWER 500 +#endif + +// APP_USBD_CONFIG_POWER_EVENTS_PROCESS - Process power events + + +// Enable processing power events in USB event handler. + +#ifndef APP_USBD_CONFIG_POWER_EVENTS_PROCESS +#define APP_USBD_CONFIG_POWER_EVENTS_PROCESS 1 +#endif + +// APP_USBD_CONFIG_EVENT_QUEUE_ENABLE - Enable event queue + +// This is the default configuration when all the events are placed into internal queue. +// Disable it when external queue is used like app_scheduler or if you wish to process all events inside interrupts. +// Processing all events from the interrupt level adds requirement not to call any functions that modifies the USBD library state from the context higher than USB interrupt context. +// Functions that modify USBD state are functions for sleep, wakeup, start, stop, enable and disable. +//========================================================== +#ifndef APP_USBD_CONFIG_EVENT_QUEUE_ENABLE +#define APP_USBD_CONFIG_EVENT_QUEUE_ENABLE 1 +#endif +// APP_USBD_CONFIG_EVENT_QUEUE_SIZE - The size of event queue <16-64> + + +// The size of the queue for the events that would be processed in the main loop. + +#ifndef APP_USBD_CONFIG_EVENT_QUEUE_SIZE +#define APP_USBD_CONFIG_EVENT_QUEUE_SIZE 32 +#endif + +// APP_USBD_CONFIG_SOF_HANDLING_MODE - Change SOF events handling mode. + + +// Normal queue - SOF events are pushed normally into event queue. +// Compress queue - SOF events are counted and binded with other events or executed when queue is empty. +// This prevents queue from filling with SOF events. +// Interrupt - SOF events are processed in interrupt. +// <0=> Normal queue +// <1=> Compress queue +// <2=> Interrupt + +#ifndef APP_USBD_CONFIG_SOF_HANDLING_MODE +#define APP_USBD_CONFIG_SOF_HANDLING_MODE 1 #endif // -// APP_USBD_CLASS_AUDIO_ENABLED - app_usbd_audio - USB AUDIO class +// APP_USBD_CONFIG_SOF_TIMESTAMP_PROVIDE - Provide a function that generates timestamps for logs based on the current SOF + +// The function app_usbd_sof_timestamp_get will be implemented if the logger is enabled. +// Use it when initializing the logger. +// SOF processing will be always enabled when this configuration parameter is active. +// Notice that this option is configured outside of APP_USBD_CONFIG_LOG_ENABLED. +// This means that it will work even if the logging in this very module is disabled. -#ifndef APP_USBD_CLASS_AUDIO_ENABLED -#define APP_USBD_CLASS_AUDIO_ENABLED 0 +#ifndef APP_USBD_CONFIG_SOF_TIMESTAMP_PROVIDE +#define APP_USBD_CONFIG_SOF_TIMESTAMP_PROVIDE 0 #endif -// APP_USBD_CLASS_CDC_ACM_ENABLED - app_usbd_cdc_acm - USB CDC ACM class +// APP_USBD_CONFIG_LOG_ENABLED - Enable logging in the module +//========================================================== +#ifndef APP_USBD_CONFIG_LOG_ENABLED +#define APP_USBD_CONFIG_LOG_ENABLED 0 +#endif +// APP_USBD_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug - -#ifndef APP_USBD_CLASS_CDC_ACM_ENABLED -#define APP_USBD_CLASS_CDC_ACM_ENABLED 0 +#ifndef APP_USBD_CONFIG_LOG_LEVEL +#define APP_USBD_CONFIG_LOG_LEVEL 3 #endif -// APP_USBD_CLASS_HID_ENABLED - app_usbd_hid - USB HID class +// APP_USBD_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White +#ifndef APP_USBD_CONFIG_INFO_COLOR +#define APP_USBD_CONFIG_INFO_COLOR 0 +#endif -#ifndef APP_USBD_CLASS_HID_ENABLED -#define APP_USBD_CLASS_HID_ENABLED 0 +// APP_USBD_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef APP_USBD_CONFIG_DEBUG_COLOR +#define APP_USBD_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// APP_USBD_HID_ENABLED - app_usbd_hid - USB HID class + + +#ifndef APP_USBD_HID_ENABLED +#define APP_USBD_HID_ENABLED 0 #endif // APP_USBD_HID_GENERIC_ENABLED - app_usbd_hid_generic - USB HID generic - + #ifndef APP_USBD_HID_GENERIC_ENABLED #define APP_USBD_HID_GENERIC_ENABLED 0 #endif // APP_USBD_HID_KBD_ENABLED - app_usbd_hid_kbd - USB HID keyboard - + #ifndef APP_USBD_HID_KBD_ENABLED #define APP_USBD_HID_KBD_ENABLED 0 #endif // APP_USBD_HID_MOUSE_ENABLED - app_usbd_hid_mouse - USB HID mouse - + #ifndef APP_USBD_HID_MOUSE_ENABLED #define APP_USBD_HID_MOUSE_ENABLED 0 #endif // APP_USBD_MSC_ENABLED - app_usbd_msc - USB MSC class - + #ifndef APP_USBD_MSC_ENABLED #define APP_USBD_MSC_ENABLED 0 #endif -// BUTTON_ENABLED - app_button - buttons handling module - - -#ifndef BUTTON_ENABLED -#define BUTTON_ENABLED 0 -#endif - // CRC16_ENABLED - crc16 - CRC16 calculation routines - + #ifndef CRC16_ENABLED #define CRC16_ENABLED 0 #endif // CRC32_ENABLED - crc32 - CRC32 calculation routines - + #ifndef CRC32_ENABLED #define CRC32_ENABLED 0 #endif // ECC_ENABLED - ecc - Elliptic Curve Cryptography Library - + #ifndef ECC_ENABLED #define ECC_ENABLED 0 @@ -3417,7 +6124,7 @@ // Configure the number of virtual pages to use and their size. //========================================================== -// FDS_VIRTUAL_PAGES - Number of virtual flash pages to use. +// FDS_VIRTUAL_PAGES - Number of virtual flash pages to use. // One of the virtual pages is reserved by the system for garbage collection. // Therefore, the minimum is two virtual pages: one page to store data and one page to be used by the system for garbage collection. // The total amount of flash memory that is used by FDS amounts to @ref FDS_VIRTUAL_PAGES * @ref FDS_VIRTUAL_PAGE_SIZE * 4 bytes. @@ -3427,19 +6134,19 @@ #endif // FDS_VIRTUAL_PAGE_SIZE - The size of a virtual flash page. - + // Expressed in number of 4-byte words. // By default, a virtual page is the same size as a physical page. // The size of a virtual page must be a multiple of the size of a physical page. -// <1024=> 1024 -// <2048=> 2048 +// <1024=> 1024 +// <2048=> 2048 #ifndef FDS_VIRTUAL_PAGE_SIZE #define FDS_VIRTUAL_PAGE_SIZE 1024 #endif -// +// //========================================================== // Backend - Backend configuration @@ -3447,31 +6154,31 @@ // Configure which nrf_fstorage backend is used by FDS to write to flash. //========================================================== // FDS_BACKEND - FDS flash backend. - + // NRF_FSTORAGE_SD uses the nrf_fstorage_sd backend implementation using the SoftDevice API. Use this if you have a SoftDevice present. // NRF_FSTORAGE_NVMC uses the nrf_fstorage_nvmc implementation. Use this setting if you don't use the SoftDevice. -// <1=> NRF_FSTORAGE_NVMC -// <2=> NRF_FSTORAGE_SD +// <1=> NRF_FSTORAGE_NVMC +// <2=> NRF_FSTORAGE_SD #ifndef FDS_BACKEND #define FDS_BACKEND 1 #endif -// +// //========================================================== // Queue - Queue settings //========================================================== -// FDS_OP_QUEUE_SIZE - Size of the internal queue. +// FDS_OP_QUEUE_SIZE - Size of the internal queue. // Increase this value if you frequently get synchronous FDS_ERR_NO_SPACE_IN_QUEUES errors. #ifndef FDS_OP_QUEUE_SIZE #define FDS_OP_QUEUE_SIZE 4 #endif -// +// //========================================================== // CRC - CRC functionality @@ -3487,12 +6194,12 @@ #define FDS_CRC_CHECK_ON_READ 0 #endif // FDS_CRC_CHECK_ON_WRITE - Perform a CRC check on newly written records. - + // Perform a CRC check on newly written records. // This setting can be used to make sure that the record data was not altered while being written to flash. -// <1=> Enabled -// <0=> Disabled +// <1=> Enabled +// <0=> Disabled #ifndef FDS_CRC_CHECK_ON_WRITE #define FDS_CRC_CHECK_ON_WRITE 0 @@ -3500,18 +6207,18 @@ // -// +// //========================================================== // Users - Number of users //========================================================== -// FDS_MAX_USERS - Maximum number of callbacks that can be registered. +// FDS_MAX_USERS - Maximum number of callbacks that can be registered. #ifndef FDS_MAX_USERS #define FDS_MAX_USERS 4 #endif -// +// //========================================================== // @@ -3522,7 +6229,7 @@ #define HARDFAULT_HANDLER_ENABLED 0 #endif // HARDFAULT_HANDLER_GDB_PSP_BACKTRACE - Bypass the GDB problem with multiple stack pointers backtrace - + // There is a known bug in GDB which causes it to incorrectly backtrace the code // when multiple stack pointers are used (main and process stack pointers). @@ -3543,17 +6250,17 @@ #ifndef HCI_MEM_POOL_ENABLED #define HCI_MEM_POOL_ENABLED 0 #endif -// HCI_TX_BUF_SIZE - TX buffer size in bytes. +// HCI_TX_BUF_SIZE - TX buffer size in bytes. #ifndef HCI_TX_BUF_SIZE #define HCI_TX_BUF_SIZE 600 #endif -// HCI_RX_BUF_SIZE - RX buffer size in bytes. +// HCI_RX_BUF_SIZE - RX buffer size in bytes. #ifndef HCI_RX_BUF_SIZE #define HCI_RX_BUF_SIZE 600 #endif -// HCI_RX_BUF_QUEUE_SIZE - RX buffer queue size. +// HCI_RX_BUF_QUEUE_SIZE - RX buffer queue size. #ifndef HCI_RX_BUF_QUEUE_SIZE #define HCI_RX_BUF_QUEUE_SIZE 4 #endif @@ -3566,55 +6273,55 @@ #define HCI_SLIP_ENABLED 0 #endif // HCI_UART_BAUDRATE - Default Baudrate - -// <323584=> 1200 baud -// <643072=> 2400 baud -// <1290240=> 4800 baud -// <2576384=> 9600 baud -// <3862528=> 14400 baud -// <5152768=> 19200 baud -// <7716864=> 28800 baud -// <10289152=> 38400 baud -// <15400960=> 57600 baud -// <20615168=> 76800 baud -// <30801920=> 115200 baud -// <61865984=> 230400 baud -// <67108864=> 250000 baud -// <121634816=> 460800 baud -// <251658240=> 921600 baud -// <268435456=> 1000000 baud + +// <323584=> 1200 baud +// <643072=> 2400 baud +// <1290240=> 4800 baud +// <2576384=> 9600 baud +// <3862528=> 14400 baud +// <5152768=> 19200 baud +// <7716864=> 28800 baud +// <10289152=> 38400 baud +// <15400960=> 57600 baud +// <20615168=> 76800 baud +// <30801920=> 115200 baud +// <61865984=> 230400 baud +// <67108864=> 250000 baud +// <121634816=> 460800 baud +// <251658240=> 921600 baud +// <268435456=> 1000000 baud #ifndef HCI_UART_BAUDRATE #define HCI_UART_BAUDRATE 30801920 #endif // HCI_UART_FLOW_CONTROL - Hardware Flow Control - -// <0=> Disabled -// <1=> Enabled + +// <0=> Disabled +// <1=> Enabled #ifndef HCI_UART_FLOW_CONTROL #define HCI_UART_FLOW_CONTROL 0 #endif -// HCI_UART_RX_PIN - UART RX pin +// HCI_UART_RX_PIN - UART RX pin #ifndef HCI_UART_RX_PIN -#define HCI_UART_RX_PIN 8 +#define HCI_UART_RX_PIN 31 #endif -// HCI_UART_TX_PIN - UART TX pin +// HCI_UART_TX_PIN - UART TX pin #ifndef HCI_UART_TX_PIN -#define HCI_UART_TX_PIN 6 +#define HCI_UART_TX_PIN 31 #endif -// HCI_UART_RTS_PIN - UART RTS pin +// HCI_UART_RTS_PIN - UART RTS pin #ifndef HCI_UART_RTS_PIN -#define HCI_UART_RTS_PIN 5 +#define HCI_UART_RTS_PIN 31 #endif -// HCI_UART_CTS_PIN - UART CTS pin +// HCI_UART_CTS_PIN - UART CTS pin #ifndef HCI_UART_CTS_PIN -#define HCI_UART_CTS_PIN 7 +#define HCI_UART_CTS_PIN 31 #endif // @@ -3624,7 +6331,7 @@ #ifndef HCI_TRANSPORT_ENABLED #define HCI_TRANSPORT_ENABLED 0 #endif -// HCI_MAX_PACKET_SIZE_IN_BITS - Maximum size of a single application packet in bits. +// HCI_MAX_PACKET_SIZE_IN_BITS - Maximum size of a single application packet in bits. #ifndef HCI_MAX_PACKET_SIZE_IN_BITS #define HCI_MAX_PACKET_SIZE_IN_BITS 8000 #endif @@ -3632,14 +6339,14 @@ // // LED_SOFTBLINK_ENABLED - led_softblink - led_softblink module - + #ifndef LED_SOFTBLINK_ENABLED #define LED_SOFTBLINK_ENABLED 0 #endif // LOW_POWER_PWM_ENABLED - low_power_pwm - low_power_pwm module - + #ifndef LOW_POWER_PWM_ENABLED #define LOW_POWER_PWM_ENABLED 0 @@ -3650,113 +6357,163 @@ #ifndef MEM_MANAGER_ENABLED #define MEM_MANAGER_ENABLED 0 #endif -// MEMORY_MANAGER_SMALL_BLOCK_COUNT - Size of each memory blocks identified as 'small' block. <0-255> +// MEMORY_MANAGER_SMALL_BLOCK_COUNT - Size of each memory blocks identified as 'small' block. <0-255> #ifndef MEMORY_MANAGER_SMALL_BLOCK_COUNT #define MEMORY_MANAGER_SMALL_BLOCK_COUNT 1 #endif -// MEMORY_MANAGER_SMALL_BLOCK_SIZE - Size of each memory blocks identified as 'small' block. +// MEMORY_MANAGER_SMALL_BLOCK_SIZE - Size of each memory blocks identified as 'small' block. // Size of each memory blocks identified as 'small' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_SMALL_BLOCK_SIZE #define MEMORY_MANAGER_SMALL_BLOCK_SIZE 32 #endif -// MEMORY_MANAGER_MEDIUM_BLOCK_COUNT - Size of each memory blocks identified as 'medium' block. <0-255> +// MEMORY_MANAGER_MEDIUM_BLOCK_COUNT - Size of each memory blocks identified as 'medium' block. <0-255> #ifndef MEMORY_MANAGER_MEDIUM_BLOCK_COUNT #define MEMORY_MANAGER_MEDIUM_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_MEDIUM_BLOCK_SIZE - Size of each memory blocks identified as 'medium' block. +// MEMORY_MANAGER_MEDIUM_BLOCK_SIZE - Size of each memory blocks identified as 'medium' block. // Size of each memory blocks identified as 'medium' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_MEDIUM_BLOCK_SIZE #define MEMORY_MANAGER_MEDIUM_BLOCK_SIZE 256 #endif -// MEMORY_MANAGER_LARGE_BLOCK_COUNT - Size of each memory blocks identified as 'large' block. <0-255> +// MEMORY_MANAGER_LARGE_BLOCK_COUNT - Size of each memory blocks identified as 'large' block. <0-255> #ifndef MEMORY_MANAGER_LARGE_BLOCK_COUNT #define MEMORY_MANAGER_LARGE_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_LARGE_BLOCK_SIZE - Size of each memory blocks identified as 'large' block. +// MEMORY_MANAGER_LARGE_BLOCK_SIZE - Size of each memory blocks identified as 'large' block. // Size of each memory blocks identified as 'large' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_LARGE_BLOCK_SIZE #define MEMORY_MANAGER_LARGE_BLOCK_SIZE 256 #endif -// MEMORY_MANAGER_XLARGE_BLOCK_COUNT - Size of each memory blocks identified as 'extra large' block. <0-255> +// MEMORY_MANAGER_XLARGE_BLOCK_COUNT - Size of each memory blocks identified as 'extra large' block. <0-255> #ifndef MEMORY_MANAGER_XLARGE_BLOCK_COUNT #define MEMORY_MANAGER_XLARGE_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_XLARGE_BLOCK_SIZE - Size of each memory blocks identified as 'extra large' block. +// MEMORY_MANAGER_XLARGE_BLOCK_SIZE - Size of each memory blocks identified as 'extra large' block. // Size of each memory blocks identified as 'extra large' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_XLARGE_BLOCK_SIZE #define MEMORY_MANAGER_XLARGE_BLOCK_SIZE 1320 #endif -// MEMORY_MANAGER_XXLARGE_BLOCK_COUNT - Size of each memory blocks identified as 'extra extra large' block. <0-255> +// MEMORY_MANAGER_XXLARGE_BLOCK_COUNT - Size of each memory blocks identified as 'extra extra large' block. <0-255> #ifndef MEMORY_MANAGER_XXLARGE_BLOCK_COUNT #define MEMORY_MANAGER_XXLARGE_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_XXLARGE_BLOCK_SIZE - Size of each memory blocks identified as 'extra extra large' block. +// MEMORY_MANAGER_XXLARGE_BLOCK_SIZE - Size of each memory blocks identified as 'extra extra large' block. // Size of each memory blocks identified as 'extra extra large' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_XXLARGE_BLOCK_SIZE #define MEMORY_MANAGER_XXLARGE_BLOCK_SIZE 3444 #endif -// MEMORY_MANAGER_XSMALL_BLOCK_COUNT - Size of each memory blocks identified as 'extra small' block. <0-255> +// MEMORY_MANAGER_XSMALL_BLOCK_COUNT - Size of each memory blocks identified as 'extra small' block. <0-255> #ifndef MEMORY_MANAGER_XSMALL_BLOCK_COUNT #define MEMORY_MANAGER_XSMALL_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_XSMALL_BLOCK_SIZE - Size of each memory blocks identified as 'extra small' block. +// MEMORY_MANAGER_XSMALL_BLOCK_SIZE - Size of each memory blocks identified as 'extra small' block. // Size of each memory blocks identified as 'extra large' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_XSMALL_BLOCK_SIZE #define MEMORY_MANAGER_XSMALL_BLOCK_SIZE 64 #endif -// MEMORY_MANAGER_XXSMALL_BLOCK_COUNT - Size of each memory blocks identified as 'extra extra small' block. <0-255> +// MEMORY_MANAGER_XXSMALL_BLOCK_COUNT - Size of each memory blocks identified as 'extra extra small' block. <0-255> #ifndef MEMORY_MANAGER_XXSMALL_BLOCK_COUNT #define MEMORY_MANAGER_XXSMALL_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_XXSMALL_BLOCK_SIZE - Size of each memory blocks identified as 'extra extra small' block. +// MEMORY_MANAGER_XXSMALL_BLOCK_SIZE - Size of each memory blocks identified as 'extra extra small' block. // Size of each memory blocks identified as 'extra extra small' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_XXSMALL_BLOCK_SIZE #define MEMORY_MANAGER_XXSMALL_BLOCK_SIZE 32 #endif -// MEM_MANAGER_DISABLE_API_PARAM_CHECK - Disable API parameter checks in the module. +// MEM_MANAGER_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef MEM_MANAGER_CONFIG_LOG_ENABLED +#define MEM_MANAGER_CONFIG_LOG_ENABLED 0 +#endif +// MEM_MANAGER_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug +#ifndef MEM_MANAGER_CONFIG_LOG_LEVEL +#define MEM_MANAGER_CONFIG_LOG_LEVEL 3 +#endif + +// MEM_MANAGER_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef MEM_MANAGER_CONFIG_INFO_COLOR +#define MEM_MANAGER_CONFIG_INFO_COLOR 0 +#endif + +// MEM_MANAGER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef MEM_MANAGER_CONFIG_DEBUG_COLOR +#define MEM_MANAGER_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// MEM_MANAGER_DISABLE_API_PARAM_CHECK - Disable API parameter checks in the module. + #ifndef MEM_MANAGER_DISABLE_API_PARAM_CHECK #define MEM_MANAGER_DISABLE_API_PARAM_CHECK 0 #endif // - // NRF_BALLOC_ENABLED - nrf_balloc - Block allocator module //========================================================== #ifndef NRF_BALLOC_ENABLED @@ -3767,14 +6524,14 @@ #ifndef NRF_BALLOC_CONFIG_DEBUG_ENABLED #define NRF_BALLOC_CONFIG_DEBUG_ENABLED 0 #endif -// NRF_BALLOC_CONFIG_HEAD_GUARD_WORDS - Number of words used as head guard. <0-255> +// NRF_BALLOC_CONFIG_HEAD_GUARD_WORDS - Number of words used as head guard. <0-255> #ifndef NRF_BALLOC_CONFIG_HEAD_GUARD_WORDS #define NRF_BALLOC_CONFIG_HEAD_GUARD_WORDS 1 #endif -// NRF_BALLOC_CONFIG_TAIL_GUARD_WORDS - Number of words used as tail guard. <0-255> +// NRF_BALLOC_CONFIG_TAIL_GUARD_WORDS - Number of words used as tail guard. <0-255> #ifndef NRF_BALLOC_CONFIG_TAIL_GUARD_WORDS @@ -3782,26 +6539,33 @@ #endif // NRF_BALLOC_CONFIG_BASIC_CHECKS_ENABLED - Enables basic checks in this module. - + #ifndef NRF_BALLOC_CONFIG_BASIC_CHECKS_ENABLED #define NRF_BALLOC_CONFIG_BASIC_CHECKS_ENABLED 0 #endif // NRF_BALLOC_CONFIG_DOUBLE_FREE_CHECK_ENABLED - Enables double memory free check in this module. - + #ifndef NRF_BALLOC_CONFIG_DOUBLE_FREE_CHECK_ENABLED #define NRF_BALLOC_CONFIG_DOUBLE_FREE_CHECK_ENABLED 0 #endif // NRF_BALLOC_CONFIG_DATA_TRASHING_CHECK_ENABLED - Enables free memory corruption check in this module. - + #ifndef NRF_BALLOC_CONFIG_DATA_TRASHING_CHECK_ENABLED #define NRF_BALLOC_CONFIG_DATA_TRASHING_CHECK_ENABLED 0 #endif +// NRF_BALLOC_CLI_CMDS - Enable CLI commands specific to the module + + +#ifndef NRF_BALLOC_CLI_CMDS +#define NRF_BALLOC_CLI_CMDS 0 +#endif + // // @@ -3811,32 +6575,32 @@ #ifndef NRF_CSENSE_ENABLED #define NRF_CSENSE_ENABLED 0 #endif -// NRF_CSENSE_PAD_HYSTERESIS - Minimum value of change required to determine that a pad was touched. +// NRF_CSENSE_PAD_HYSTERESIS - Minimum value of change required to determine that a pad was touched. #ifndef NRF_CSENSE_PAD_HYSTERESIS #define NRF_CSENSE_PAD_HYSTERESIS 15 #endif -// NRF_CSENSE_PAD_DEVIATION - Minimum value measured on a pad required to take it into account while calculating the step. +// NRF_CSENSE_PAD_DEVIATION - Minimum value measured on a pad required to take it into account while calculating the step. #ifndef NRF_CSENSE_PAD_DEVIATION #define NRF_CSENSE_PAD_DEVIATION 70 #endif -// NRF_CSENSE_MIN_PAD_VALUE - Minimum normalized value on a pad required to take its value into account. +// NRF_CSENSE_MIN_PAD_VALUE - Minimum normalized value on a pad required to take its value into account. #ifndef NRF_CSENSE_MIN_PAD_VALUE #define NRF_CSENSE_MIN_PAD_VALUE 20 #endif -// NRF_CSENSE_MAX_PADS_NUMBER - Maximum number of pads used for one instance. +// NRF_CSENSE_MAX_PADS_NUMBER - Maximum number of pads used for one instance. #ifndef NRF_CSENSE_MAX_PADS_NUMBER #define NRF_CSENSE_MAX_PADS_NUMBER 20 #endif -// NRF_CSENSE_MAX_VALUE - Maximum normalized value obtained from measurement. +// NRF_CSENSE_MAX_VALUE - Maximum normalized value obtained from measurement. #ifndef NRF_CSENSE_MAX_VALUE #define NRF_CSENSE_MAX_VALUE 1000 #endif -// NRF_CSENSE_OUTPUT_PIN - Output pin used by the low-level module. +// NRF_CSENSE_OUTPUT_PIN - Output pin used by the low-level module. // This is used when capacitive sensor does not use COMP. #ifndef NRF_CSENSE_OUTPUT_PIN @@ -3857,17 +6621,17 @@ #ifndef USE_COMP #define USE_COMP 0 #endif -// TIMER0_FOR_CSENSE - First TIMER instance used by the driver (not used on nRF51). +// TIMER0_FOR_CSENSE - First TIMER instance used by the driver (not used on nRF51). #ifndef TIMER0_FOR_CSENSE #define TIMER0_FOR_CSENSE 1 #endif -// TIMER1_FOR_CSENSE - Second TIMER instance used by the driver (not used on nRF51). +// TIMER1_FOR_CSENSE - Second TIMER instance used by the driver (not used on nRF51). #ifndef TIMER1_FOR_CSENSE #define TIMER1_FOR_CSENSE 2 #endif -// MEASUREMENT_PERIOD - Single measurement period. +// MEASUREMENT_PERIOD - Single measurement period. // Time of a single measurement can be calculated as // T = (1/2)*MEASUREMENT_PERIOD*(1/f_OSC) where f_OSC = I_SOURCE / (2C*(VUP-VDOWN) ). // I_SOURCE, VUP, and VDOWN are values used to initialize COMP and C is the capacitance of the used pad. @@ -3881,10 +6645,10 @@ // // NRF_FPRINTF_ENABLED - nrf_fprintf - fprintf function. - + #ifndef NRF_FPRINTF_ENABLED -#define NRF_FPRINTF_ENABLED 0 +#define NRF_FPRINTF_ENABLED 1 #endif // NRF_FSTORAGE_ENABLED - nrf_fstorage - Flash abstraction library @@ -3892,18 +6656,36 @@ #ifndef NRF_FSTORAGE_ENABLED #define NRF_FSTORAGE_ENABLED 1 #endif -// nrf_fstorage_sd - Implementation using the SoftDevice. +// nrf_fstorage - Common settings -// Configuration options for the fstorage implementation using the SoftDevice. +// Common settings to all fstorage implementations //========================================================== -// NRF_FSTORAGE_SD_QUEUE_SIZE - Size of the internal queue of operations. +// NRF_FSTORAGE_PARAM_CHECK_DISABLED - Disable user input validation + + +// If selected, use ASSERT to validate user input. +// This effectively removes user input validation in production code. +// Recommended setting: OFF, only enable this setting if size is a major concern. + +#ifndef NRF_FSTORAGE_PARAM_CHECK_DISABLED +#define NRF_FSTORAGE_PARAM_CHECK_DISABLED 0 +#endif + +// +//========================================================== + +// nrf_fstorage_sd - Implementation using the SoftDevice + +// Configuration options for the fstorage implementation using the SoftDevice +//========================================================== +// NRF_FSTORAGE_SD_QUEUE_SIZE - Size of the internal queue of operations // Increase this value if API calls frequently return the error @ref NRF_ERROR_NO_MEM. #ifndef NRF_FSTORAGE_SD_QUEUE_SIZE #define NRF_FSTORAGE_SD_QUEUE_SIZE 4 #endif -// NRF_FSTORAGE_SD_MAX_RETRIES - Maximum number of attempts at executing an operation when the SoftDevice is busy. +// NRF_FSTORAGE_SD_MAX_RETRIES - Maximum number of attempts at executing an operation when the SoftDevice is busy // Increase this value if events frequently return the @ref NRF_ERROR_TIMEOUT error. // The SoftDevice might fail to schedule flash access due to high BLE activity. @@ -3911,7 +6693,7 @@ #define NRF_FSTORAGE_SD_MAX_RETRIES 8 #endif -// NRF_FSTORAGE_SD_MAX_WRITE_SIZE - Maximum number of bytes to be written to flash in a single operation. +// NRF_FSTORAGE_SD_MAX_WRITE_SIZE - Maximum number of bytes to be written to flash in a single operation // This value must be a multiple of four. // Lowering this value can increase the chances of the SoftDevice being able to execute flash operations in between radio activity. // This value is bound by the maximum number of bytes that can be written to flash in a single call to @ref sd_flash_write. @@ -3921,16 +6703,23 @@ #define NRF_FSTORAGE_SD_MAX_WRITE_SIZE 4096 #endif -// +// //========================================================== // -// NRF_MEMOBJ_ENABLED - nrf_memobj - Linked memory allocator module +// NRF_GFX_ENABLED - nrf_gfx - GFX module + +#ifndef NRF_GFX_ENABLED +#define NRF_GFX_ENABLED 0 +#endif + +// NRF_MEMOBJ_ENABLED - nrf_memobj - Linked memory allocator module + #ifndef NRF_MEMOBJ_ENABLED -#define NRF_MEMOBJ_ENABLED 0 +#define NRF_MEMOBJ_ENABLED 1 #endif // NRF_PWR_MGMT_ENABLED - nrf_pwr_mgmt - Power management module @@ -3946,56 +6735,56 @@ #define NRF_PWR_MGMT_CONFIG_DEBUG_PIN_ENABLED 0 #endif // NRF_PWR_MGMT_SLEEP_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef NRF_PWR_MGMT_SLEEP_DEBUG_PIN #define NRF_PWR_MGMT_SLEEP_DEBUG_PIN 31 @@ -4004,7 +6793,7 @@ // // NRF_PWR_MGMT_CONFIG_CPU_USAGE_MONITOR_ENABLED - Enables CPU usage monitor. - + // Module will trace percentage of CPU usage in one second intervals. @@ -4017,7 +6806,7 @@ #ifndef NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_ENABLED #define NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_ENABLED 0 #endif -// NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_S - Standby timeout (in seconds). +// NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_S - Standby timeout (in seconds). // Shutdown procedure will begin no earlier than after this number of seconds. #ifndef NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_S @@ -4027,27 +6816,27 @@ // // NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED - Enables FPU event cleaning. - + #ifndef NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED -#define NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED 1 +#define NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED 0 #endif // NRF_PWR_MGMT_CONFIG_AUTO_SHUTDOWN_RETRY - Blocked shutdown procedure will be retried every second. - + #ifndef NRF_PWR_MGMT_CONFIG_AUTO_SHUTDOWN_RETRY #define NRF_PWR_MGMT_CONFIG_AUTO_SHUTDOWN_RETRY 0 #endif // NRF_PWR_MGMT_CONFIG_USE_SCHEDULER - Module will use @ref app_scheduler. - + #ifndef NRF_PWR_MGMT_CONFIG_USE_SCHEDULER #define NRF_PWR_MGMT_CONFIG_USE_SCHEDULER 0 #endif -// NRF_PWR_MGMT_CONFIG_HANDLER_PRIORITY_COUNT - The number of priorities for module handlers. +// NRF_PWR_MGMT_CONFIG_HANDLER_PRIORITY_COUNT - The number of priorities for module handlers. // The number of stages of the shutdown process. #ifndef NRF_PWR_MGMT_CONFIG_HANDLER_PRIORITY_COUNT @@ -4056,29 +6845,57 @@ // -// NRF_QUEUE_ENABLED - nrf_queue - Queue module - - +// NRF_QUEUE_ENABLED - nrf_queue - Queue module +//========================================================== #ifndef NRF_QUEUE_ENABLED #define NRF_QUEUE_ENABLED 1 #endif +// NRF_QUEUE_CLI_CMDS - Enable CLI commands specific to the module + + +#ifndef NRF_QUEUE_CLI_CMDS +#define NRF_QUEUE_CLI_CMDS 0 +#endif + +// // NRF_SECTION_ITER_ENABLED - nrf_section_iter - Section iterator - + #ifndef NRF_SECTION_ITER_ENABLED #define NRF_SECTION_ITER_ENABLED 1 #endif -// NRF_STRERROR_ENABLED - nrf_strerror - Library for converting error code to string. +// NRF_SORTLIST_ENABLED - nrf_sortlist - Sorted list + +#ifndef NRF_SORTLIST_ENABLED +#define NRF_SORTLIST_ENABLED 0 +#endif + +// NRF_SPI_MNGR_ENABLED - nrf_spi_mngr - SPI transaction manager + + +#ifndef NRF_SPI_MNGR_ENABLED +#define NRF_SPI_MNGR_ENABLED 0 +#endif + +// NRF_STRERROR_ENABLED - nrf_strerror - Library for converting error code to string. + #ifndef NRF_STRERROR_ENABLED -#define NRF_STRERROR_ENABLED 0 +#define NRF_STRERROR_ENABLED 1 +#endif + +// NRF_TWI_MNGR_ENABLED - nrf_twi_mngr - TWI transaction manager + + +#ifndef NRF_TWI_MNGR_ENABLED +#define NRF_TWI_MNGR_ENABLED 0 #endif // SLIP_ENABLED - slip - SLIP encoding and decoding - + #ifndef SLIP_ENABLED #define SLIP_ENABLED 0 @@ -4090,37 +6907,37 @@ #define TASK_MANAGER_ENABLED 0 #endif // TASK_MANAGER_CLI_CMDS - Enable CLI commands specific to the module - + #ifndef TASK_MANAGER_CLI_CMDS -#define TASK_MANAGER_CLI_CMDS 1 +#define TASK_MANAGER_CLI_CMDS 0 #endif -// TASK_MANAGER_CONFIG_MAX_TASKS - Maximum number of tasks which can be created +// TASK_MANAGER_CONFIG_MAX_TASKS - Maximum number of tasks which can be created #ifndef TASK_MANAGER_CONFIG_MAX_TASKS #define TASK_MANAGER_CONFIG_MAX_TASKS 2 #endif -// TASK_MANAGER_CONFIG_STACK_SIZE - Stack size for every task (power of 2) +// TASK_MANAGER_CONFIG_STACK_SIZE - Stack size for every task (power of 2) #ifndef TASK_MANAGER_CONFIG_STACK_SIZE #define TASK_MANAGER_CONFIG_STACK_SIZE 1024 #endif // TASK_MANAGER_CONFIG_STACK_PROFILER_ENABLED - Enable stack profiling. - + #ifndef TASK_MANAGER_CONFIG_STACK_PROFILER_ENABLED #define TASK_MANAGER_CONFIG_STACK_PROFILER_ENABLED 1 #endif // TASK_MANAGER_CONFIG_STACK_GUARD - Configures stack guard. - -// <0=> Disabled -// <4=> 32 bytes -// <5=> 64 bytes -// <6=> 128 bytes -// <7=> 256 bytes -// <8=> 512 bytes + +// <0=> Disabled +// <4=> 32 bytes +// <5=> 64 bytes +// <6=> 128 bytes +// <7=> 256 bytes +// <8=> 512 bytes #ifndef TASK_MANAGER_CONFIG_STACK_GUARD #define TASK_MANAGER_CONFIG_STACK_GUARD 7 @@ -4128,34 +6945,68 @@ // -// nrf_cli - Command line interface. +// app_button - buttons handling module //========================================================== -// NRF_CLI_ENABLED - Enable/disable CLI module. +// BUTTON_ENABLED - Enables Button module + +#ifndef BUTTON_ENABLED +#define BUTTON_ENABLED 0 +#endif + +// BUTTON_HIGH_ACCURACY_ENABLED - Enables GPIOTE high accuracy for buttons + + +#ifndef BUTTON_HIGH_ACCURACY_ENABLED +#define BUTTON_HIGH_ACCURACY_ENABLED 0 +#endif + +// +//========================================================== + +// nrf_cli - Command line interface + +//========================================================== +// NRF_CLI_ENABLED - Enable/disable the CLI module. + #ifndef NRF_CLI_ENABLED #define NRF_CLI_ENABLED 0 #endif -// NRF_CLI_ARGC_MAX - Maximum number of parameters passed to command handler. +// NRF_CLI_ARGC_MAX - Maximum number of parameters passed to the command handler. #ifndef NRF_CLI_ARGC_MAX #define NRF_CLI_ARGC_MAX 12 #endif -// NRF_CLI_BUILD_IN_CMDS_ENABLED - CLI build in commands. - +// NRF_CLI_BUILD_IN_CMDS_ENABLED - CLI built-in commands. + #ifndef NRF_CLI_BUILD_IN_CMDS_ENABLED #define NRF_CLI_BUILD_IN_CMDS_ENABLED 1 #endif -// NRF_CLI_CMD_BUFF_SIZE - Maximum buffer size for single command. +// NRF_CLI_CMD_BUFF_SIZE - Maximum buffer size for a single command. #ifndef NRF_CLI_CMD_BUFF_SIZE #define NRF_CLI_CMD_BUFF_SIZE 128 #endif -// NRF_CLI_PRINTF_BUFF_SIZE - Maximum print buffer size. +// NRF_CLI_ECHO_STATUS - CLI echo status. If set, echo is ON. + + +#ifndef NRF_CLI_ECHO_STATUS +#define NRF_CLI_ECHO_STATUS 1 +#endif + +// NRF_CLI_WILDCARD_ENABLED - Enable wildcard functionality for CLI commands. + + +#ifndef NRF_CLI_WILDCARD_ENABLED +#define NRF_CLI_WILDCARD_ENABLED 0 +#endif + +// NRF_CLI_PRINTF_BUFF_SIZE - Maximum print buffer size. #ifndef NRF_CLI_PRINTF_BUFF_SIZE #define NRF_CLI_PRINTF_BUFF_SIZE 23 #endif @@ -4165,12 +7016,12 @@ #ifndef NRF_CLI_HISTORY_ENABLED #define NRF_CLI_HISTORY_ENABLED 1 #endif -// NRF_CLI_HISTORY_ELEMENT_SIZE - Size of one memory object reserved for CLI history +// NRF_CLI_HISTORY_ELEMENT_SIZE - Size of one memory object reserved for CLI history. #ifndef NRF_CLI_HISTORY_ELEMENT_SIZE #define NRF_CLI_HISTORY_ELEMENT_SIZE 32 #endif -// NRF_CLI_HISTORY_ELEMENT_COUNT - Number of history memory objects +// NRF_CLI_HISTORY_ELEMENT_COUNT - Number of history memory objects. #ifndef NRF_CLI_HISTORY_ELEMENT_COUNT #define NRF_CLI_HISTORY_ELEMENT_COUNT 8 #endif @@ -4178,121 +7029,54 @@ // // NRF_CLI_VT100_COLORS_ENABLED - CLI VT100 colors. - + #ifndef NRF_CLI_VT100_COLORS_ENABLED #define NRF_CLI_VT100_COLORS_ENABLED 1 #endif -// NRF_CLI_LOG_BACKEND - Enable logger backend interface. +// NRF_CLI_STATISTICS_ENABLED - Enable CLI statistics. + +#ifndef NRF_CLI_STATISTICS_ENABLED +#define NRF_CLI_STATISTICS_ENABLED 1 +#endif + +// NRF_CLI_LOG_BACKEND - Enable logger backend interface. + #ifndef NRF_CLI_LOG_BACKEND #define NRF_CLI_LOG_BACKEND 1 #endif // NRF_CLI_USES_TASK_MANAGER_ENABLED - Enable CLI to use task_manager - + #ifndef NRF_CLI_USES_TASK_MANAGER_ENABLED #define NRF_CLI_USES_TASK_MANAGER_ENABLED 0 #endif -// +// //========================================================== -// nrf_cli_rtt - RTT command line interface transport. - -//========================================================== -// NRF_CLI_RTT_ENABLED - Enable/disable CLI RTT module. - - -#ifndef NRF_CLI_RTT_ENABLED -#define NRF_CLI_RTT_ENABLED 0 -#endif - -// NRF_CLI_RTT_TERMINAL_ID - RTT terminal ID for CLI. -#ifndef NRF_CLI_RTT_TERMINAL_ID -#define NRF_CLI_RTT_TERMINAL_ID 0 -#endif - -// +// //========================================================== -// -//========================================================== - -// nRF_Log +// nRF_Log //========================================================== -// NRF_LOG_BACKEND_RTT_ENABLED - nrf_log_backend_rtt - Log RTT backend -//========================================================== -#ifndef NRF_LOG_BACKEND_RTT_ENABLED -#define NRF_LOG_BACKEND_RTT_ENABLED 0 -#endif -// NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE - Size of buffer for partially processed strings. -// Size of the buffer is a trade-off between RAM usage and processing. -// if buffer is smaller then strings will often be fragmented. -// It is recommended to use size which will fit typical log and only the -// longer one will be fragmented. +// NRF_LOG_STR_FORMATTER_TIMESTAMP_FORMAT_ENABLED - nrf_log_str_formatter - Log string formatter + -#ifndef NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE -#define NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE 64 +#ifndef NRF_LOG_STR_FORMATTER_TIMESTAMP_FORMAT_ENABLED +#define NRF_LOG_STR_FORMATTER_TIMESTAMP_FORMAT_ENABLED 1 #endif -// - -// NRF_LOG_BACKEND_UART_ENABLED - nrf_log_backend_uart - Log UART backend -//========================================================== -#ifndef NRF_LOG_BACKEND_UART_ENABLED -#define NRF_LOG_BACKEND_UART_ENABLED 0 -#endif -// NRF_LOG_BACKEND_UART_TX_PIN - UART TX pin -#ifndef NRF_LOG_BACKEND_UART_TX_PIN -#define NRF_LOG_BACKEND_UART_TX_PIN 6 -#endif - -// NRF_LOG_BACKEND_UART_BAUDRATE - Default Baudrate - -// <323584=> 1200 baud -// <643072=> 2400 baud -// <1290240=> 4800 baud -// <2576384=> 9600 baud -// <3862528=> 14400 baud -// <5152768=> 19200 baud -// <7716864=> 28800 baud -// <10289152=> 38400 baud -// <15400960=> 57600 baud -// <20615168=> 76800 baud -// <30801920=> 115200 baud -// <61865984=> 230400 baud -// <67108864=> 250000 baud -// <121634816=> 460800 baud -// <251658240=> 921600 baud -// <268435456=> 1000000 baud - -#ifndef NRF_LOG_BACKEND_UART_BAUDRATE -#define NRF_LOG_BACKEND_UART_BAUDRATE 30801920 -#endif - -// NRF_LOG_BACKEND_UART_TEMP_BUFFER_SIZE - Size of buffer for partially processed strings. -// Size of the buffer is a trade-off between RAM usage and processing. -// if buffer is smaller then strings will often be fragmented. -// It is recommended to use size which will fit typical log and only the -// longer one will be fragmented. - -#ifndef NRF_LOG_BACKEND_UART_TEMP_BUFFER_SIZE -#define NRF_LOG_BACKEND_UART_TEMP_BUFFER_SIZE 64 -#endif - -// - -// nrf_log - Logging +// nrf_log - Logger //========================================================== // NRF_LOG_ENABLED - Logging module for nRF5 SDK //========================================================== - #ifndef NRF_LOG_ENABLED #define NRF_LOG_ENABLED 0 #endif @@ -4302,69 +7086,69 @@ #define NRF_LOG_USES_COLORS 0 #endif // NRF_LOG_COLOR_DEFAULT - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_LOG_COLOR_DEFAULT #define NRF_LOG_COLOR_DEFAULT 0 #endif // NRF_LOG_ERROR_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_LOG_ERROR_COLOR -#define NRF_LOG_ERROR_COLOR 0 +#define NRF_LOG_ERROR_COLOR 2 #endif // NRF_LOG_WARNING_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_LOG_WARNING_COLOR -#define NRF_LOG_WARNING_COLOR 0 +#define NRF_LOG_WARNING_COLOR 4 #endif // // NRF_LOG_DEFAULT_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_LOG_DEFAULT_LEVEL #define NRF_LOG_DEFAULT_LEVEL 3 #endif // NRF_LOG_DEFERRED - Enable deffered logger. - + // Log data is buffered and can be processed in idle. @@ -4373,60 +7157,65 @@ #endif // NRF_LOG_BUFSIZE - Size of the buffer for storing logs (in bytes). - + // Must be power of 2 and multiple of 4. // If NRF_LOG_DEFERRED = 0 then buffer size can be reduced to minimum. -// <128=> 128 -// <256=> 256 -// <512=> 512 -// <1024=> 1024 -// <2048=> 2048 -// <4096=> 4096 -// <8192=> 8192 -// <16384=> 16384 +// <128=> 128 +// <256=> 256 +// <512=> 512 +// <1024=> 1024 +// <2048=> 2048 +// <4096=> 4096 +// <8192=> 8192 +// <16384=> 16384 #ifndef NRF_LOG_BUFSIZE #define NRF_LOG_BUFSIZE 1024 #endif // NRF_LOG_ALLOW_OVERFLOW - Configures behavior when circular buffer is full. + - -// If set then oldest logs are overwritten. Otherwise a +// If set then oldest logs are overwritten. Otherwise a // marker is injected informing about overflow. #ifndef NRF_LOG_ALLOW_OVERFLOW #define NRF_LOG_ALLOW_OVERFLOW 1 #endif -// NRF_LOG_USES_TIMESTAMP - Enable timestamping - +// NRF_LOG_USES_TIMESTAMP - Enable timestamping // Function for getting the timestamp is provided by the user - +//========================================================== #ifndef NRF_LOG_USES_TIMESTAMP #define NRF_LOG_USES_TIMESTAMP 0 #endif +// NRF_LOG_TIMESTAMP_DEFAULT_FREQUENCY - Default frequency of the timestamp (in Hz) +#ifndef NRF_LOG_TIMESTAMP_DEFAULT_FREQUENCY +#define NRF_LOG_TIMESTAMP_DEFAULT_FREQUENCY 32768 +#endif + +// // NRF_LOG_FILTERS_ENABLED - Enable dynamic filtering of logs. - + #ifndef NRF_LOG_FILTERS_ENABLED -#define NRF_LOG_FILTERS_ENABLED 1 +#define NRF_LOG_FILTERS_ENABLED 0 #endif // NRF_LOG_CLI_CMDS - Enable CLI commands for the module. - + #ifndef NRF_LOG_CLI_CMDS -#define NRF_LOG_CLI_CMDS 1 +#define NRF_LOG_CLI_CMDS 0 #endif // Log message pool - Configuration of log message pool //========================================================== -// NRF_LOG_MSGPOOL_ELEMENT_SIZE - Size of a single element in the pool of memory objects. +// NRF_LOG_MSGPOOL_ELEMENT_SIZE - Size of a single element in the pool of memory objects. // If a small value is set, then performance of logs processing // is degraded because data is fragmented. Bigger value impacts // RAM memory utilization. The size is set to fit a message with @@ -4436,7 +7225,7 @@ #define NRF_LOG_MSGPOOL_ELEMENT_SIZE 20 #endif -// NRF_LOG_MSGPOOL_ELEMENT_COUNT - Number of elements in the pool of memory objects +// NRF_LOG_MSGPOOL_ELEMENT_COUNT - Number of elements in the pool of memory objects // If a small value is set, then it may lead to a deadlock // in certain cases if backend has high latency and holds // multiple messages for long time. Bigger value impacts @@ -4446,15 +7235,15 @@ #define NRF_LOG_MSGPOOL_ELEMENT_COUNT 8 #endif -// +// //========================================================== // -// nrf_log module configuration +// nrf_log module configuration //========================================================== -// nrf_log in nRF_Core +// nrf_log in nRF_Core //========================================================== // NRF_MPU_CONFIG_LOG_ENABLED - Enables logging in the module. @@ -4463,44 +7252,44 @@ #define NRF_MPU_CONFIG_LOG_ENABLED 0 #endif // NRF_MPU_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_MPU_CONFIG_LOG_LEVEL #define NRF_MPU_CONFIG_LOG_LEVEL 3 #endif // NRF_MPU_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_MPU_CONFIG_INFO_COLOR #define NRF_MPU_CONFIG_INFO_COLOR 0 #endif // NRF_MPU_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_MPU_CONFIG_DEBUG_COLOR #define NRF_MPU_CONFIG_DEBUG_COLOR 0 @@ -4514,44 +7303,44 @@ #define NRF_STACK_GUARD_CONFIG_LOG_ENABLED 0 #endif // NRF_STACK_GUARD_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_STACK_GUARD_CONFIG_LOG_LEVEL #define NRF_STACK_GUARD_CONFIG_LOG_LEVEL 3 #endif // NRF_STACK_GUARD_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_STACK_GUARD_CONFIG_INFO_COLOR #define NRF_STACK_GUARD_CONFIG_INFO_COLOR 0 #endif // NRF_STACK_GUARD_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_STACK_GUARD_CONFIG_DEBUG_COLOR #define NRF_STACK_GUARD_CONFIG_DEBUG_COLOR 0 @@ -4565,44 +7354,44 @@ #define TASK_MANAGER_CONFIG_LOG_ENABLED 0 #endif // TASK_MANAGER_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef TASK_MANAGER_CONFIG_LOG_LEVEL #define TASK_MANAGER_CONFIG_LOG_LEVEL 3 #endif // TASK_MANAGER_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TASK_MANAGER_CONFIG_INFO_COLOR #define TASK_MANAGER_CONFIG_INFO_COLOR 0 #endif // TASK_MANAGER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TASK_MANAGER_CONFIG_DEBUG_COLOR #define TASK_MANAGER_CONFIG_DEBUG_COLOR 0 @@ -4610,10 +7399,10 @@ // -// +// //========================================================== -// nrf_log in nRF_Drivers +// nrf_log in nRF_Drivers //========================================================== // CLOCK_CONFIG_LOG_ENABLED - Enables logging in the module. @@ -4622,44 +7411,44 @@ #define CLOCK_CONFIG_LOG_ENABLED 0 #endif // CLOCK_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef CLOCK_CONFIG_LOG_LEVEL #define CLOCK_CONFIG_LOG_LEVEL 3 #endif // CLOCK_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef CLOCK_CONFIG_INFO_COLOR #define CLOCK_CONFIG_INFO_COLOR 0 #endif // CLOCK_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef CLOCK_CONFIG_DEBUG_COLOR #define CLOCK_CONFIG_DEBUG_COLOR 0 @@ -4667,101 +7456,50 @@ // -// COMMON_CONFIG_LOG_ENABLED - Enables logging in the module. -//========================================================== -#ifndef COMMON_CONFIG_LOG_ENABLED -#define COMMON_CONFIG_LOG_ENABLED 0 -#endif -// COMMON_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef COMMON_CONFIG_LOG_LEVEL -#define COMMON_CONFIG_LOG_LEVEL 3 -#endif - -// COMMON_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef COMMON_CONFIG_INFO_COLOR -#define COMMON_CONFIG_INFO_COLOR 0 -#endif - -// COMMON_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef COMMON_CONFIG_DEBUG_COLOR -#define COMMON_CONFIG_DEBUG_COLOR 0 -#endif - -// - // COMP_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef COMP_CONFIG_LOG_ENABLED #define COMP_CONFIG_LOG_ENABLED 0 #endif // COMP_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef COMP_CONFIG_LOG_LEVEL #define COMP_CONFIG_LOG_LEVEL 3 #endif // COMP_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef COMP_CONFIG_INFO_COLOR #define COMP_CONFIG_INFO_COLOR 0 #endif // COMP_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef COMP_CONFIG_DEBUG_COLOR #define COMP_CONFIG_DEBUG_COLOR 0 @@ -4775,44 +7513,44 @@ #define GPIOTE_CONFIG_LOG_ENABLED 0 #endif // GPIOTE_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef GPIOTE_CONFIG_LOG_LEVEL #define GPIOTE_CONFIG_LOG_LEVEL 3 #endif // GPIOTE_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef GPIOTE_CONFIG_INFO_COLOR #define GPIOTE_CONFIG_INFO_COLOR 0 #endif // GPIOTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef GPIOTE_CONFIG_DEBUG_COLOR #define GPIOTE_CONFIG_DEBUG_COLOR 0 @@ -4820,101 +7558,50 @@ // -// I2S_CONFIG_LOG_ENABLED - Enables logging in the module. -//========================================================== -#ifndef I2S_CONFIG_LOG_ENABLED -#define I2S_CONFIG_LOG_ENABLED 0 -#endif -// I2S_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef I2S_CONFIG_LOG_LEVEL -#define I2S_CONFIG_LOG_LEVEL 3 -#endif - -// I2S_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef I2S_CONFIG_INFO_COLOR -#define I2S_CONFIG_INFO_COLOR 0 -#endif - -// I2S_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef I2S_CONFIG_DEBUG_COLOR -#define I2S_CONFIG_DEBUG_COLOR 0 -#endif - -// - // LPCOMP_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef LPCOMP_CONFIG_LOG_ENABLED #define LPCOMP_CONFIG_LOG_ENABLED 0 #endif // LPCOMP_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef LPCOMP_CONFIG_LOG_LEVEL #define LPCOMP_CONFIG_LOG_LEVEL 3 #endif // LPCOMP_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef LPCOMP_CONFIG_INFO_COLOR #define LPCOMP_CONFIG_INFO_COLOR 0 #endif // LPCOMP_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef LPCOMP_CONFIG_DEBUG_COLOR #define LPCOMP_CONFIG_DEBUG_COLOR 0 @@ -4928,44 +7615,44 @@ #define PDM_CONFIG_LOG_ENABLED 0 #endif // PDM_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef PDM_CONFIG_LOG_LEVEL #define PDM_CONFIG_LOG_LEVEL 3 #endif // PDM_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PDM_CONFIG_INFO_COLOR #define PDM_CONFIG_INFO_COLOR 0 #endif // PDM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PDM_CONFIG_DEBUG_COLOR #define PDM_CONFIG_DEBUG_COLOR 0 @@ -4979,44 +7666,44 @@ #define PPI_CONFIG_LOG_ENABLED 0 #endif // PPI_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef PPI_CONFIG_LOG_LEVEL #define PPI_CONFIG_LOG_LEVEL 3 #endif // PPI_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PPI_CONFIG_INFO_COLOR #define PPI_CONFIG_INFO_COLOR 0 #endif // PPI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PPI_CONFIG_DEBUG_COLOR #define PPI_CONFIG_DEBUG_COLOR 0 @@ -5030,44 +7717,44 @@ #define PWM_CONFIG_LOG_ENABLED 0 #endif // PWM_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef PWM_CONFIG_LOG_LEVEL #define PWM_CONFIG_LOG_LEVEL 3 #endif // PWM_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PWM_CONFIG_INFO_COLOR #define PWM_CONFIG_INFO_COLOR 0 #endif // PWM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PWM_CONFIG_DEBUG_COLOR #define PWM_CONFIG_DEBUG_COLOR 0 @@ -5081,44 +7768,44 @@ #define QDEC_CONFIG_LOG_ENABLED 0 #endif // QDEC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef QDEC_CONFIG_LOG_LEVEL #define QDEC_CONFIG_LOG_LEVEL 3 #endif // QDEC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef QDEC_CONFIG_INFO_COLOR #define QDEC_CONFIG_INFO_COLOR 0 #endif // QDEC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef QDEC_CONFIG_DEBUG_COLOR #define QDEC_CONFIG_DEBUG_COLOR 0 @@ -5132,51 +7819,51 @@ #define RNG_CONFIG_LOG_ENABLED 0 #endif // RNG_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef RNG_CONFIG_LOG_LEVEL #define RNG_CONFIG_LOG_LEVEL 3 #endif // RNG_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef RNG_CONFIG_INFO_COLOR #define RNG_CONFIG_INFO_COLOR 0 #endif // RNG_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef RNG_CONFIG_DEBUG_COLOR #define RNG_CONFIG_DEBUG_COLOR 0 #endif // RNG_CONFIG_RANDOM_NUMBER_LOG_ENABLED - Enables logging of random numbers. - + #ifndef RNG_CONFIG_RANDOM_NUMBER_LOG_ENABLED #define RNG_CONFIG_RANDOM_NUMBER_LOG_ENABLED 0 @@ -5190,44 +7877,44 @@ #define RTC_CONFIG_LOG_ENABLED 0 #endif // RTC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef RTC_CONFIG_LOG_LEVEL #define RTC_CONFIG_LOG_LEVEL 3 #endif // RTC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef RTC_CONFIG_INFO_COLOR #define RTC_CONFIG_INFO_COLOR 0 #endif // RTC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef RTC_CONFIG_DEBUG_COLOR #define RTC_CONFIG_DEBUG_COLOR 0 @@ -5241,44 +7928,44 @@ #define SAADC_CONFIG_LOG_ENABLED 0 #endif // SAADC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef SAADC_CONFIG_LOG_LEVEL #define SAADC_CONFIG_LOG_LEVEL 3 #endif // SAADC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SAADC_CONFIG_INFO_COLOR #define SAADC_CONFIG_INFO_COLOR 0 #endif // SAADC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SAADC_CONFIG_DEBUG_COLOR #define SAADC_CONFIG_DEBUG_COLOR 0 @@ -5292,44 +7979,44 @@ #define SPIS_CONFIG_LOG_ENABLED 0 #endif // SPIS_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef SPIS_CONFIG_LOG_LEVEL #define SPIS_CONFIG_LOG_LEVEL 3 #endif // SPIS_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SPIS_CONFIG_INFO_COLOR #define SPIS_CONFIG_INFO_COLOR 0 #endif // SPIS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SPIS_CONFIG_DEBUG_COLOR #define SPIS_CONFIG_DEBUG_COLOR 0 @@ -5343,44 +8030,44 @@ #define SPI_CONFIG_LOG_ENABLED 0 #endif // SPI_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef SPI_CONFIG_LOG_LEVEL #define SPI_CONFIG_LOG_LEVEL 3 #endif // SPI_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SPI_CONFIG_INFO_COLOR #define SPI_CONFIG_INFO_COLOR 0 #endif // SPI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SPI_CONFIG_DEBUG_COLOR #define SPI_CONFIG_DEBUG_COLOR 0 @@ -5388,101 +8075,50 @@ // -// SWI_CONFIG_LOG_ENABLED - Enables logging in the module. -//========================================================== -#ifndef SWI_CONFIG_LOG_ENABLED -#define SWI_CONFIG_LOG_ENABLED 0 -#endif -// SWI_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef SWI_CONFIG_LOG_LEVEL -#define SWI_CONFIG_LOG_LEVEL 3 -#endif - -// SWI_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef SWI_CONFIG_INFO_COLOR -#define SWI_CONFIG_INFO_COLOR 0 -#endif - -// SWI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef SWI_CONFIG_DEBUG_COLOR -#define SWI_CONFIG_DEBUG_COLOR 0 -#endif - -// - // TIMER_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef TIMER_CONFIG_LOG_ENABLED #define TIMER_CONFIG_LOG_ENABLED 0 #endif // TIMER_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef TIMER_CONFIG_LOG_LEVEL #define TIMER_CONFIG_LOG_LEVEL 3 #endif // TIMER_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TIMER_CONFIG_INFO_COLOR #define TIMER_CONFIG_INFO_COLOR 0 #endif // TIMER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TIMER_CONFIG_DEBUG_COLOR #define TIMER_CONFIG_DEBUG_COLOR 0 @@ -5496,44 +8132,44 @@ #define TWIS_CONFIG_LOG_ENABLED 0 #endif // TWIS_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef TWIS_CONFIG_LOG_LEVEL #define TWIS_CONFIG_LOG_LEVEL 3 #endif // TWIS_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TWIS_CONFIG_INFO_COLOR #define TWIS_CONFIG_INFO_COLOR 0 #endif // TWIS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TWIS_CONFIG_DEBUG_COLOR #define TWIS_CONFIG_DEBUG_COLOR 0 @@ -5547,44 +8183,44 @@ #define TWI_CONFIG_LOG_ENABLED 0 #endif // TWI_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef TWI_CONFIG_LOG_LEVEL #define TWI_CONFIG_LOG_LEVEL 3 #endif // TWI_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TWI_CONFIG_INFO_COLOR #define TWI_CONFIG_INFO_COLOR 0 #endif // TWI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TWI_CONFIG_DEBUG_COLOR #define TWI_CONFIG_DEBUG_COLOR 0 @@ -5598,44 +8234,44 @@ #define UART_CONFIG_LOG_ENABLED 0 #endif // UART_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef UART_CONFIG_LOG_LEVEL #define UART_CONFIG_LOG_LEVEL 3 #endif // UART_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef UART_CONFIG_INFO_COLOR #define UART_CONFIG_INFO_COLOR 0 #endif // UART_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef UART_CONFIG_DEBUG_COLOR #define UART_CONFIG_DEBUG_COLOR 0 @@ -5649,44 +8285,44 @@ #define USBD_CONFIG_LOG_ENABLED 0 #endif // USBD_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef USBD_CONFIG_LOG_LEVEL #define USBD_CONFIG_LOG_LEVEL 3 #endif // USBD_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef USBD_CONFIG_INFO_COLOR #define USBD_CONFIG_INFO_COLOR 0 #endif // USBD_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef USBD_CONFIG_DEBUG_COLOR #define USBD_CONFIG_DEBUG_COLOR 0 @@ -5700,44 +8336,44 @@ #define WDT_CONFIG_LOG_ENABLED 0 #endif // WDT_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef WDT_CONFIG_LOG_LEVEL #define WDT_CONFIG_LOG_LEVEL 3 #endif // WDT_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef WDT_CONFIG_INFO_COLOR #define WDT_CONFIG_INFO_COLOR 0 #endif // WDT_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef WDT_CONFIG_DEBUG_COLOR #define WDT_CONFIG_DEBUG_COLOR 0 @@ -5745,56 +8381,123 @@ // -// +// //========================================================== -// nrf_log in nRF_Libraries +// nrf_log in nRF_Libraries //========================================================== +// APP_TIMER_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef APP_TIMER_CONFIG_LOG_ENABLED +#define APP_TIMER_CONFIG_LOG_ENABLED 0 +#endif +// APP_TIMER_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef APP_TIMER_CONFIG_LOG_LEVEL +#define APP_TIMER_CONFIG_LOG_LEVEL 3 +#endif + +// APP_TIMER_CONFIG_INITIAL_LOG_LEVEL - Initial severity level if dynamic filtering is enabled. + + +// If module generates a lot of logs, initial log level can +// be decreased to prevent flooding. Severity level can be +// increased on instance basis. +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef APP_TIMER_CONFIG_INITIAL_LOG_LEVEL +#define APP_TIMER_CONFIG_INITIAL_LOG_LEVEL 3 +#endif + +// APP_TIMER_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef APP_TIMER_CONFIG_INFO_COLOR +#define APP_TIMER_CONFIG_INFO_COLOR 0 +#endif + +// APP_TIMER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef APP_TIMER_CONFIG_DEBUG_COLOR +#define APP_TIMER_CONFIG_DEBUG_COLOR 0 +#endif + +// + // APP_USBD_CDC_ACM_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef APP_USBD_CDC_ACM_CONFIG_LOG_ENABLED #define APP_USBD_CDC_ACM_CONFIG_LOG_ENABLED 0 #endif // APP_USBD_CDC_ACM_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef APP_USBD_CDC_ACM_CONFIG_LOG_LEVEL #define APP_USBD_CDC_ACM_CONFIG_LOG_LEVEL 3 #endif // APP_USBD_CDC_ACM_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_CDC_ACM_CONFIG_INFO_COLOR #define APP_USBD_CDC_ACM_CONFIG_INFO_COLOR 0 #endif // APP_USBD_CDC_ACM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_CDC_ACM_CONFIG_DEBUG_COLOR #define APP_USBD_CDC_ACM_CONFIG_DEBUG_COLOR 0 @@ -5802,50 +8505,101 @@ // +// APP_USBD_DUMMY_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef APP_USBD_DUMMY_CONFIG_LOG_ENABLED +#define APP_USBD_DUMMY_CONFIG_LOG_ENABLED 0 +#endif +// APP_USBD_DUMMY_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef APP_USBD_DUMMY_CONFIG_LOG_LEVEL +#define APP_USBD_DUMMY_CONFIG_LOG_LEVEL 3 +#endif + +// APP_USBD_DUMMY_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef APP_USBD_DUMMY_CONFIG_INFO_COLOR +#define APP_USBD_DUMMY_CONFIG_INFO_COLOR 0 +#endif + +// APP_USBD_DUMMY_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef APP_USBD_DUMMY_CONFIG_DEBUG_COLOR +#define APP_USBD_DUMMY_CONFIG_DEBUG_COLOR 0 +#endif + +// + // APP_USBD_MSC_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef APP_USBD_MSC_CONFIG_LOG_ENABLED #define APP_USBD_MSC_CONFIG_LOG_ENABLED 0 #endif // APP_USBD_MSC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef APP_USBD_MSC_CONFIG_LOG_LEVEL #define APP_USBD_MSC_CONFIG_LOG_LEVEL 3 #endif // APP_USBD_MSC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_MSC_CONFIG_INFO_COLOR #define APP_USBD_MSC_CONFIG_INFO_COLOR 0 #endif // APP_USBD_MSC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_MSC_CONFIG_DEBUG_COLOR #define APP_USBD_MSC_CONFIG_DEBUG_COLOR 0 @@ -5853,12 +8607,119 @@ // -// MEM_MANAGER_ENABLE_LOGS - Enable debug trace in the module. - - -#ifndef MEM_MANAGER_ENABLE_LOGS -#define MEM_MANAGER_ENABLE_LOGS 0 +// APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_ENABLED +#define APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_ENABLED 0 #endif +// APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_LEVEL +#define APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_LEVEL 3 +#endif + +// APP_USBD_NRF_DFU_TRIGGER_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef APP_USBD_NRF_DFU_TRIGGER_CONFIG_INFO_COLOR +#define APP_USBD_NRF_DFU_TRIGGER_CONFIG_INFO_COLOR 0 +#endif + +// APP_USBD_NRF_DFU_TRIGGER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef APP_USBD_NRF_DFU_TRIGGER_CONFIG_DEBUG_COLOR +#define APP_USBD_NRF_DFU_TRIGGER_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// NRF_ATFIFO_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRF_ATFIFO_CONFIG_LOG_ENABLED +#define NRF_ATFIFO_CONFIG_LOG_ENABLED 0 +#endif +// NRF_ATFIFO_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_ATFIFO_CONFIG_LOG_LEVEL +#define NRF_ATFIFO_CONFIG_LOG_LEVEL 3 +#endif + +// NRF_ATFIFO_CONFIG_LOG_INIT_FILTER_LEVEL - Initial severity level if dynamic filtering is enabled + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_ATFIFO_CONFIG_LOG_INIT_FILTER_LEVEL +#define NRF_ATFIFO_CONFIG_LOG_INIT_FILTER_LEVEL 3 +#endif + +// NRF_ATFIFO_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_ATFIFO_CONFIG_INFO_COLOR +#define NRF_ATFIFO_CONFIG_INFO_COLOR 0 +#endif + +// NRF_ATFIFO_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_ATFIFO_CONFIG_DEBUG_COLOR +#define NRF_ATFIFO_CONFIG_DEBUG_COLOR 0 +#endif + +// // NRF_BALLOC_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== @@ -5866,44 +8727,60 @@ #define NRF_BALLOC_CONFIG_LOG_ENABLED 0 #endif // NRF_BALLOC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_BALLOC_CONFIG_LOG_LEVEL #define NRF_BALLOC_CONFIG_LOG_LEVEL 3 #endif -// NRF_BALLOC_CONFIG_INFO_COLOR - ANSI escape code prefix. +// NRF_BALLOC_CONFIG_INITIAL_LOG_LEVEL - Initial severity level if dynamic filtering is enabled. + -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// If module generates a lot of logs, initial log level can +// be decreased to prevent flooding. Severity level can be +// increased on instance basis. +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_BALLOC_CONFIG_INITIAL_LOG_LEVEL +#define NRF_BALLOC_CONFIG_INITIAL_LOG_LEVEL 3 +#endif + +// NRF_BALLOC_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_BALLOC_CONFIG_INFO_COLOR #define NRF_BALLOC_CONFIG_INFO_COLOR 0 #endif // NRF_BALLOC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_BALLOC_CONFIG_DEBUG_COLOR #define NRF_BALLOC_CONFIG_DEBUG_COLOR 0 @@ -5917,44 +8794,44 @@ #define NRF_CLI_BLE_UART_CONFIG_LOG_ENABLED 0 #endif // NRF_CLI_BLE_UART_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_CLI_BLE_UART_CONFIG_LOG_LEVEL #define NRF_CLI_BLE_UART_CONFIG_LOG_LEVEL 3 #endif // NRF_CLI_BLE_UART_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_CLI_BLE_UART_CONFIG_INFO_COLOR #define NRF_CLI_BLE_UART_CONFIG_INFO_COLOR 0 #endif // NRF_CLI_BLE_UART_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_CLI_BLE_UART_CONFIG_DEBUG_COLOR #define NRF_CLI_BLE_UART_CONFIG_DEBUG_COLOR 0 @@ -5962,50 +8839,101 @@ // +// NRF_CLI_LIBUARTE_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRF_CLI_LIBUARTE_CONFIG_LOG_ENABLED +#define NRF_CLI_LIBUARTE_CONFIG_LOG_ENABLED 0 +#endif +// NRF_CLI_LIBUARTE_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_CLI_LIBUARTE_CONFIG_LOG_LEVEL +#define NRF_CLI_LIBUARTE_CONFIG_LOG_LEVEL 3 +#endif + +// NRF_CLI_LIBUARTE_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_CLI_LIBUARTE_CONFIG_INFO_COLOR +#define NRF_CLI_LIBUARTE_CONFIG_INFO_COLOR 0 +#endif + +// NRF_CLI_LIBUARTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_CLI_LIBUARTE_CONFIG_DEBUG_COLOR +#define NRF_CLI_LIBUARTE_CONFIG_DEBUG_COLOR 0 +#endif + +// + // NRF_CLI_UART_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_CLI_UART_CONFIG_LOG_ENABLED #define NRF_CLI_UART_CONFIG_LOG_ENABLED 0 #endif // NRF_CLI_UART_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_CLI_UART_CONFIG_LOG_LEVEL #define NRF_CLI_UART_CONFIG_LOG_LEVEL 3 #endif // NRF_CLI_UART_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_CLI_UART_CONFIG_INFO_COLOR #define NRF_CLI_UART_CONFIG_INFO_COLOR 0 #endif // NRF_CLI_UART_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_CLI_UART_CONFIG_DEBUG_COLOR #define NRF_CLI_UART_CONFIG_DEBUG_COLOR 0 @@ -6013,50 +8941,101 @@ // +// NRF_LIBUARTE_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRF_LIBUARTE_CONFIG_LOG_ENABLED +#define NRF_LIBUARTE_CONFIG_LOG_ENABLED 0 +#endif +// NRF_LIBUARTE_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_LIBUARTE_CONFIG_LOG_LEVEL +#define NRF_LIBUARTE_CONFIG_LOG_LEVEL 3 +#endif + +// NRF_LIBUARTE_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_LIBUARTE_CONFIG_INFO_COLOR +#define NRF_LIBUARTE_CONFIG_INFO_COLOR 0 +#endif + +// NRF_LIBUARTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_LIBUARTE_CONFIG_DEBUG_COLOR +#define NRF_LIBUARTE_CONFIG_DEBUG_COLOR 0 +#endif + +// + // NRF_MEMOBJ_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_MEMOBJ_CONFIG_LOG_ENABLED #define NRF_MEMOBJ_CONFIG_LOG_ENABLED 0 #endif // NRF_MEMOBJ_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_MEMOBJ_CONFIG_LOG_LEVEL #define NRF_MEMOBJ_CONFIG_LOG_LEVEL 3 #endif // NRF_MEMOBJ_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_MEMOBJ_CONFIG_INFO_COLOR #define NRF_MEMOBJ_CONFIG_INFO_COLOR 0 #endif // NRF_MEMOBJ_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_MEMOBJ_CONFIG_DEBUG_COLOR #define NRF_MEMOBJ_CONFIG_DEBUG_COLOR 0 @@ -6070,44 +9049,44 @@ #define NRF_PWR_MGMT_CONFIG_LOG_ENABLED 0 #endif // NRF_PWR_MGMT_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_PWR_MGMT_CONFIG_LOG_LEVEL #define NRF_PWR_MGMT_CONFIG_LOG_LEVEL 3 #endif // NRF_PWR_MGMT_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_PWR_MGMT_CONFIG_INFO_COLOR #define NRF_PWR_MGMT_CONFIG_INFO_COLOR 0 #endif // NRF_PWR_MGMT_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_PWR_MGMT_CONFIG_DEBUG_COLOR #define NRF_PWR_MGMT_CONFIG_DEBUG_COLOR 0 @@ -6115,50 +9094,113 @@ // +// NRF_QUEUE_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRF_QUEUE_CONFIG_LOG_ENABLED +#define NRF_QUEUE_CONFIG_LOG_ENABLED 0 +#endif +// NRF_QUEUE_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_QUEUE_CONFIG_LOG_LEVEL +#define NRF_QUEUE_CONFIG_LOG_LEVEL 3 +#endif + +// NRF_QUEUE_CONFIG_LOG_INIT_FILTER_LEVEL - Initial severity level if dynamic filtering is enabled + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_QUEUE_CONFIG_LOG_INIT_FILTER_LEVEL +#define NRF_QUEUE_CONFIG_LOG_INIT_FILTER_LEVEL 3 +#endif + +// NRF_QUEUE_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_QUEUE_CONFIG_INFO_COLOR +#define NRF_QUEUE_CONFIG_INFO_COLOR 0 +#endif + +// NRF_QUEUE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_QUEUE_CONFIG_DEBUG_COLOR +#define NRF_QUEUE_CONFIG_DEBUG_COLOR 0 +#endif + +// + // NRF_SDH_ANT_LOG_ENABLED - Enable logging in SoftDevice handler (ANT) module. //========================================================== #ifndef NRF_SDH_ANT_LOG_ENABLED -#define NRF_SDH_ANT_LOG_ENABLED 1 +#define NRF_SDH_ANT_LOG_ENABLED 0 #endif // NRF_SDH_ANT_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_SDH_ANT_LOG_LEVEL #define NRF_SDH_ANT_LOG_LEVEL 3 #endif // NRF_SDH_ANT_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_ANT_INFO_COLOR #define NRF_SDH_ANT_INFO_COLOR 0 #endif // NRF_SDH_ANT_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_ANT_DEBUG_COLOR #define NRF_SDH_ANT_DEBUG_COLOR 0 @@ -6172,44 +9214,44 @@ #define NRF_SDH_BLE_LOG_ENABLED 1 #endif // NRF_SDH_BLE_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_SDH_BLE_LOG_LEVEL #define NRF_SDH_BLE_LOG_LEVEL 3 #endif // NRF_SDH_BLE_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_BLE_INFO_COLOR #define NRF_SDH_BLE_INFO_COLOR 0 #endif // NRF_SDH_BLE_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_BLE_DEBUG_COLOR #define NRF_SDH_BLE_DEBUG_COLOR 0 @@ -6223,44 +9265,44 @@ #define NRF_SDH_LOG_ENABLED 1 #endif // NRF_SDH_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_SDH_LOG_LEVEL #define NRF_SDH_LOG_LEVEL 3 #endif // NRF_SDH_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_INFO_COLOR #define NRF_SDH_INFO_COLOR 0 #endif // NRF_SDH_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_DEBUG_COLOR #define NRF_SDH_DEBUG_COLOR 0 @@ -6274,44 +9316,44 @@ #define NRF_SDH_SOC_LOG_ENABLED 1 #endif // NRF_SDH_SOC_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_SDH_SOC_LOG_LEVEL #define NRF_SDH_SOC_LOG_LEVEL 3 #endif // NRF_SDH_SOC_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_SOC_INFO_COLOR #define NRF_SDH_SOC_INFO_COLOR 0 #endif // NRF_SDH_SOC_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_SOC_DEBUG_COLOR #define NRF_SDH_SOC_DEBUG_COLOR 0 @@ -6319,30 +9361,203 @@ // -// +// NRF_SORTLIST_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRF_SORTLIST_CONFIG_LOG_ENABLED +#define NRF_SORTLIST_CONFIG_LOG_ENABLED 0 +#endif +// NRF_SORTLIST_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_SORTLIST_CONFIG_LOG_LEVEL +#define NRF_SORTLIST_CONFIG_LOG_LEVEL 3 +#endif + +// NRF_SORTLIST_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_SORTLIST_CONFIG_INFO_COLOR +#define NRF_SORTLIST_CONFIG_INFO_COLOR 0 +#endif + +// NRF_SORTLIST_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_SORTLIST_CONFIG_DEBUG_COLOR +#define NRF_SORTLIST_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// NRF_TWI_SENSOR_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRF_TWI_SENSOR_CONFIG_LOG_ENABLED +#define NRF_TWI_SENSOR_CONFIG_LOG_ENABLED 0 +#endif +// NRF_TWI_SENSOR_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_TWI_SENSOR_CONFIG_LOG_LEVEL +#define NRF_TWI_SENSOR_CONFIG_LOG_LEVEL 3 +#endif + +// NRF_TWI_SENSOR_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_TWI_SENSOR_CONFIG_INFO_COLOR +#define NRF_TWI_SENSOR_CONFIG_INFO_COLOR 0 +#endif + +// NRF_TWI_SENSOR_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_TWI_SENSOR_CONFIG_DEBUG_COLOR +#define NRF_TWI_SENSOR_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// //========================================================== -// -//========================================================== - -// -//========================================================== - -// -//========================================================== - -// nRF_NFC +// nrf_log in nRF_Serialization //========================================================== -// NFC_BLE_OOB_ADVDATA_ENABLED - nfc_ble_oob_advdata - Encoding the advertising data and/or scan response data which is specific for OOB pairing +// SER_HAL_TRANSPORT_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef SER_HAL_TRANSPORT_CONFIG_LOG_ENABLED +#define SER_HAL_TRANSPORT_CONFIG_LOG_ENABLED 0 +#endif +// SER_HAL_TRANSPORT_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef SER_HAL_TRANSPORT_CONFIG_LOG_LEVEL +#define SER_HAL_TRANSPORT_CONFIG_LOG_LEVEL 3 +#endif + +// SER_HAL_TRANSPORT_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef SER_HAL_TRANSPORT_CONFIG_INFO_COLOR +#define SER_HAL_TRANSPORT_CONFIG_INFO_COLOR 0 +#endif + +// SER_HAL_TRANSPORT_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef SER_HAL_TRANSPORT_CONFIG_DEBUG_COLOR +#define SER_HAL_TRANSPORT_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// +//========================================================== + +// +//========================================================== + +// +//========================================================== + +// +//========================================================== + +// nRF_NFC + +//========================================================== +// NFC_AC_REC_ENABLED - nfc_ac_rec - NFC NDEF Alternative Carrier record encoder + + +#ifndef NFC_AC_REC_ENABLED +#define NFC_AC_REC_ENABLED 0 +#endif + +// NFC_AC_REC_PARSER_ENABLED - nfc_ac_rec_parser - Alternative Carrier record parser + + +#ifndef NFC_AC_REC_PARSER_ENABLED +#define NFC_AC_REC_PARSER_ENABLED 0 +#endif + +// NFC_BLE_OOB_ADVDATA_ENABLED - nfc_ble_oob_advdata - AD data for OOB pairing encoder //========================================================== #ifndef NFC_BLE_OOB_ADVDATA_ENABLED #define NFC_BLE_OOB_ADVDATA_ENABLED 0 #endif // ADVANCED_ADVDATA_SUPPORT - Non-mandatory AD types for BLE OOB pairing are encoded inside the NDEF message (e.g. service UUIDs) - -// <1=> Enabled -// <0=> Disabled + +// <1=> Enabled +// <0=> Disabled #ifndef ADVANCED_ADVDATA_SUPPORT #define ADVANCED_ADVDATA_SUPPORT 0 @@ -6350,6 +9565,13 @@ // +// NFC_BLE_OOB_ADVDATA_PARSER_ENABLED - nfc_ble_oob_advdata_parser - BLE OOB pairing AD data parser + + +#ifndef NFC_BLE_OOB_ADVDATA_PARSER_ENABLED +#define NFC_BLE_OOB_ADVDATA_PARSER_ENABLED 0 +#endif + // NFC_BLE_PAIR_LIB_ENABLED - nfc_ble_pair_lib - Library parameters //========================================================== #ifndef NFC_BLE_PAIR_LIB_ENABLED @@ -6361,44 +9583,44 @@ #define NFC_BLE_PAIR_LIB_LOG_ENABLED 0 #endif // NFC_BLE_PAIR_LIB_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NFC_BLE_PAIR_LIB_LOG_LEVEL #define NFC_BLE_PAIR_LIB_LOG_LEVEL 3 #endif // NFC_BLE_PAIR_LIB_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_BLE_PAIR_LIB_INFO_COLOR #define NFC_BLE_PAIR_LIB_INFO_COLOR 0 #endif // NFC_BLE_PAIR_LIB_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_BLE_PAIR_LIB_DEBUG_COLOR #define NFC_BLE_PAIR_LIB_DEBUG_COLOR 0 @@ -6417,84 +9639,28 @@ #define BLE_NFC_SEC_PARAM_BOND 1 #endif // BLE_NFC_SEC_PARAM_KDIST_OWN_ENC - Enables Long Term Key and Master Identification distribution by device. - + #ifndef BLE_NFC_SEC_PARAM_KDIST_OWN_ENC #define BLE_NFC_SEC_PARAM_KDIST_OWN_ENC 1 #endif // BLE_NFC_SEC_PARAM_KDIST_OWN_ID - Enables Identity Resolving Key and Identity Address Information distribution by device. - + #ifndef BLE_NFC_SEC_PARAM_KDIST_OWN_ID #define BLE_NFC_SEC_PARAM_KDIST_OWN_ID 1 #endif // BLE_NFC_SEC_PARAM_KDIST_PEER_ENC - Enables Long Term Key and Master Identification distribution by peer. - + #ifndef BLE_NFC_SEC_PARAM_KDIST_PEER_ENC #define BLE_NFC_SEC_PARAM_KDIST_PEER_ENC 1 #endif // BLE_NFC_SEC_PARAM_KDIST_PEER_ID - Enables Identity Resolving Key and Identity Address Information distribution by peer. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_PEER_ID -#define BLE_NFC_SEC_PARAM_KDIST_PEER_ID 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_OWN_ENC - Enables Long Term Key and Master Identification distribution by device. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_OWN_ENC -#define BLE_NFC_SEC_PARAM_KDIST_OWN_ENC 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_OWN_ID - Enables Identity Resolving Key and Identity Address Information distribution by device. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_OWN_ID -#define BLE_NFC_SEC_PARAM_KDIST_OWN_ID 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_PEER_ENC - Enables Long Term Key and Master Identification distribution by peer. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_PEER_ENC -#define BLE_NFC_SEC_PARAM_KDIST_PEER_ENC 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_PEER_ID - Enables Identity Resolving Key and Identity Address Information distribution by peer. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_PEER_ID -#define BLE_NFC_SEC_PARAM_KDIST_PEER_ID 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_OWN_ENC - Enables Long Term Key and Master Identification distribution by device. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_OWN_ENC -#define BLE_NFC_SEC_PARAM_KDIST_OWN_ENC 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_OWN_ID - Enables Identity Resolving Key and Identity Address Information distribution by device. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_OWN_ID -#define BLE_NFC_SEC_PARAM_KDIST_OWN_ID 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_PEER_ENC - Enables Long Term Key and Master Identification distribution by peer. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_PEER_ENC -#define BLE_NFC_SEC_PARAM_KDIST_PEER_ENC 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_PEER_ID - Enables Identity Resolving Key and Identity Address Information distribution by peer. - + #ifndef BLE_NFC_SEC_PARAM_KDIST_PEER_ID #define BLE_NFC_SEC_PARAM_KDIST_PEER_ID 1 @@ -6503,53 +9669,109 @@ // // BLE_NFC_SEC_PARAM_MIN_KEY_SIZE - Minimal size of a security key. - -// <7=> 7 -// <8=> 8 -// <9=> 9 -// <10=> 10 -// <11=> 11 -// <12=> 12 -// <13=> 13 -// <14=> 14 -// <15=> 15 -// <16=> 16 + +// <7=> 7 +// <8=> 8 +// <9=> 9 +// <10=> 10 +// <11=> 11 +// <12=> 12 +// <13=> 13 +// <14=> 14 +// <15=> 15 +// <16=> 16 #ifndef BLE_NFC_SEC_PARAM_MIN_KEY_SIZE #define BLE_NFC_SEC_PARAM_MIN_KEY_SIZE 7 #endif // BLE_NFC_SEC_PARAM_MAX_KEY_SIZE - Maximal size of a security key. - -// <7=> 7 -// <8=> 8 -// <9=> 9 -// <10=> 10 -// <11=> 11 -// <12=> 12 -// <13=> 13 -// <14=> 14 -// <15=> 15 -// <16=> 16 + +// <7=> 7 +// <8=> 8 +// <9=> 9 +// <10=> 10 +// <11=> 11 +// <12=> 12 +// <13=> 13 +// <14=> 14 +// <15=> 15 +// <16=> 16 #ifndef BLE_NFC_SEC_PARAM_MAX_KEY_SIZE #define BLE_NFC_SEC_PARAM_MAX_KEY_SIZE 16 #endif -// +// //========================================================== // +// NFC_BLE_PAIR_MSG_ENABLED - nfc_ble_pair_msg - NDEF message for OOB pairing encoder + + +#ifndef NFC_BLE_PAIR_MSG_ENABLED +#define NFC_BLE_PAIR_MSG_ENABLED 0 +#endif + +// NFC_CH_COMMON_ENABLED - nfc_ble_pair_common - OOB pairing common data + + +#ifndef NFC_CH_COMMON_ENABLED +#define NFC_CH_COMMON_ENABLED 0 +#endif + +// NFC_EP_OOB_REC_ENABLED - nfc_ep_oob_rec - EP record for BLE pairing encoder + + +#ifndef NFC_EP_OOB_REC_ENABLED +#define NFC_EP_OOB_REC_ENABLED 0 +#endif + +// NFC_HS_REC_ENABLED - nfc_hs_rec - Handover Select NDEF record encoder + + +#ifndef NFC_HS_REC_ENABLED +#define NFC_HS_REC_ENABLED 0 +#endif + +// NFC_LE_OOB_REC_ENABLED - nfc_le_oob_rec - LE record for BLE pairing encoder + + +#ifndef NFC_LE_OOB_REC_ENABLED +#define NFC_LE_OOB_REC_ENABLED 0 +#endif + +// NFC_LE_OOB_REC_PARSER_ENABLED - nfc_le_oob_rec_parser - LE record parser + + +#ifndef NFC_LE_OOB_REC_PARSER_ENABLED +#define NFC_LE_OOB_REC_PARSER_ENABLED 0 +#endif + +// NFC_NDEF_LAUNCHAPP_MSG_ENABLED - nfc_launchapp_msg - Encoding data for NDEF Application Launching message for NFC Tag + + +#ifndef NFC_NDEF_LAUNCHAPP_MSG_ENABLED +#define NFC_NDEF_LAUNCHAPP_MSG_ENABLED 0 +#endif + +// NFC_NDEF_LAUNCHAPP_REC_ENABLED - nfc_launchapp_rec - Encoding data for NDEF Application Launching record for NFC Tag + + +#ifndef NFC_NDEF_LAUNCHAPP_REC_ENABLED +#define NFC_NDEF_LAUNCHAPP_REC_ENABLED 0 +#endif + // NFC_NDEF_MSG_ENABLED - nfc_ndef_msg - NFC NDEF Message generator module //========================================================== #ifndef NFC_NDEF_MSG_ENABLED #define NFC_NDEF_MSG_ENABLED 0 #endif // NFC_NDEF_MSG_TAG_TYPE - NFC Tag Type - -// <2=> Type 2 Tag -// <4=> Type 4 Tag + +// <2=> Type 2 Tag +// <4=> Type 4 Tag #ifndef NFC_NDEF_MSG_TAG_TYPE #define NFC_NDEF_MSG_TAG_TYPE 2 @@ -6568,28 +9790,28 @@ #define NFC_NDEF_MSG_PARSER_LOG_ENABLED 0 #endif // NFC_NDEF_MSG_PARSER_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NFC_NDEF_MSG_PARSER_LOG_LEVEL #define NFC_NDEF_MSG_PARSER_LOG_LEVEL 3 #endif // NFC_NDEF_MSG_PARSER_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_NDEF_MSG_PARSER_INFO_COLOR #define NFC_NDEF_MSG_PARSER_INFO_COLOR 0 @@ -6599,6 +9821,13 @@ // +// NFC_NDEF_RECORD_ENABLED - nfc_ndef_record - NFC NDEF Record generator module + + +#ifndef NFC_NDEF_RECORD_ENABLED +#define NFC_NDEF_RECORD_ENABLED 0 +#endif + // NFC_NDEF_RECORD_PARSER_ENABLED - nfc_ndef_record_parser - NFC NDEF Record parser module //========================================================== #ifndef NFC_NDEF_RECORD_PARSER_ENABLED @@ -6610,28 +9839,28 @@ #define NFC_NDEF_RECORD_PARSER_LOG_ENABLED 0 #endif // NFC_NDEF_RECORD_PARSER_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NFC_NDEF_RECORD_PARSER_LOG_LEVEL #define NFC_NDEF_RECORD_PARSER_LOG_LEVEL 3 #endif // NFC_NDEF_RECORD_PARSER_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_NDEF_RECORD_PARSER_INFO_COLOR #define NFC_NDEF_RECORD_PARSER_INFO_COLOR 0 @@ -6641,23 +9870,44 @@ // +// NFC_NDEF_TEXT_RECORD_ENABLED - nfc_text_rec - Encoding data for a text record for NFC Tag + + +#ifndef NFC_NDEF_TEXT_RECORD_ENABLED +#define NFC_NDEF_TEXT_RECORD_ENABLED 0 +#endif + +// NFC_NDEF_URI_MSG_ENABLED - nfc_uri_msg - Encoding data for NDEF message with URI record for NFC Tag + + +#ifndef NFC_NDEF_URI_MSG_ENABLED +#define NFC_NDEF_URI_MSG_ENABLED 0 +#endif + +// NFC_NDEF_URI_REC_ENABLED - nfc_uri_rec - Encoding data for a URI record for NFC Tag + + +#ifndef NFC_NDEF_URI_REC_ENABLED +#define NFC_NDEF_URI_REC_ENABLED 0 +#endif + // NFC_T2T_HAL_ENABLED - nfc_t2t_hal - Hardware Abstraction Layer for NFC library. //========================================================== #ifndef NFC_T2T_HAL_ENABLED #define NFC_T2T_HAL_ENABLED 0 #endif // NFCT_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NFCT_CONFIG_IRQ_PRIORITY #define NFCT_CONFIG_IRQ_PRIORITY 7 @@ -6669,88 +9919,88 @@ #define HAL_NFC_CONFIG_LOG_ENABLED 0 #endif // HAL_NFC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef HAL_NFC_CONFIG_LOG_LEVEL #define HAL_NFC_CONFIG_LOG_LEVEL 3 #endif // HAL_NFC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_INFO_COLOR #define HAL_NFC_CONFIG_INFO_COLOR 0 #endif // HAL_NFC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_DEBUG_COLOR #define HAL_NFC_CONFIG_DEBUG_COLOR 0 #endif // HAL_NFC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef HAL_NFC_CONFIG_LOG_LEVEL #define HAL_NFC_CONFIG_LOG_LEVEL 3 #endif // HAL_NFC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_INFO_COLOR #define HAL_NFC_CONFIG_INFO_COLOR 0 #endif // HAL_NFC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_DEBUG_COLOR #define HAL_NFC_CONFIG_DEBUG_COLOR 0 @@ -6764,560 +10014,560 @@ #define HAL_NFC_CONFIG_DEBUG_PIN_ENABLED 0 #endif // HAL_NFC_HCLOCK_ON_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_ON_DEBUG_PIN #define HAL_NFC_HCLOCK_ON_DEBUG_PIN 11 #endif // HAL_NFC_HCLOCK_OFF_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_OFF_DEBUG_PIN #define HAL_NFC_HCLOCK_OFF_DEBUG_PIN 12 #endif // HAL_NFC_NFC_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_NFC_EVENT_DEBUG_PIN #define HAL_NFC_NFC_EVENT_DEBUG_PIN 24 #endif // HAL_NFC_DETECT_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_DETECT_EVENT_DEBUG_PIN #define HAL_NFC_DETECT_EVENT_DEBUG_PIN 25 #endif // HAL_NFC_TIMER4_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_TIMER4_EVENT_DEBUG_PIN #define HAL_NFC_TIMER4_EVENT_DEBUG_PIN 28 #endif // HAL_NFC_HCLOCK_ON_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_ON_DEBUG_PIN #define HAL_NFC_HCLOCK_ON_DEBUG_PIN 31 #endif // HAL_NFC_HCLOCK_OFF_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_OFF_DEBUG_PIN #define HAL_NFC_HCLOCK_OFF_DEBUG_PIN 31 #endif // HAL_NFC_NFC_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_NFC_EVENT_DEBUG_PIN #define HAL_NFC_NFC_EVENT_DEBUG_PIN 31 #endif // HAL_NFC_DETECT_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_DETECT_EVENT_DEBUG_PIN #define HAL_NFC_DETECT_EVENT_DEBUG_PIN 31 #endif // HAL_NFC_TIMER4_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_TIMER4_EVENT_DEBUG_PIN #define HAL_NFC_TIMER4_EVENT_DEBUG_PIN 31 @@ -7327,23 +10577,149 @@ // +// NFC_T2T_PARSER_ENABLED - nfc_type_2_tag_parser - Parser for decoding Type 2 Tag data +//========================================================== +#ifndef NFC_T2T_PARSER_ENABLED +#define NFC_T2T_PARSER_ENABLED 0 +#endif +// NFC_T2T_PARSER_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NFC_T2T_PARSER_LOG_ENABLED +#define NFC_T2T_PARSER_LOG_ENABLED 0 +#endif +// NFC_T2T_PARSER_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NFC_T2T_PARSER_LOG_LEVEL +#define NFC_T2T_PARSER_LOG_LEVEL 3 +#endif + +// NFC_T2T_PARSER_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NFC_T2T_PARSER_INFO_COLOR +#define NFC_T2T_PARSER_INFO_COLOR 0 +#endif + +// + +// + +// NFC_T4T_APDU_ENABLED - nfc_t4t_apdu - APDU encoder/decoder for Type 4 Tag +//========================================================== +#ifndef NFC_T4T_APDU_ENABLED +#define NFC_T4T_APDU_ENABLED 0 +#endif +// NFC_T4T_APDU_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NFC_T4T_APDU_LOG_ENABLED +#define NFC_T4T_APDU_LOG_ENABLED 0 +#endif +// NFC_T4T_APDU_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NFC_T4T_APDU_LOG_LEVEL +#define NFC_T4T_APDU_LOG_LEVEL 3 +#endif + +// NFC_T4T_APDU_LOG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NFC_T4T_APDU_LOG_COLOR +#define NFC_T4T_APDU_LOG_COLOR 0 +#endif + +// + +// + +// NFC_T4T_CC_FILE_PARSER_ENABLED - nfc_t4t_cc_file - Capability Container file for Type 4 Tag +//========================================================== +#ifndef NFC_T4T_CC_FILE_PARSER_ENABLED +#define NFC_T4T_CC_FILE_PARSER_ENABLED 0 +#endif +// NFC_T4T_CC_FILE_PARSER_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NFC_T4T_CC_FILE_PARSER_LOG_ENABLED +#define NFC_T4T_CC_FILE_PARSER_LOG_ENABLED 0 +#endif +// NFC_T4T_CC_FILE_PARSER_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NFC_T4T_CC_FILE_PARSER_LOG_LEVEL +#define NFC_T4T_CC_FILE_PARSER_LOG_LEVEL 3 +#endif + +// NFC_T4T_CC_FILE_PARSER_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NFC_T4T_CC_FILE_PARSER_INFO_COLOR +#define NFC_T4T_CC_FILE_PARSER_INFO_COLOR 0 +#endif + +// + +// + // NFC_T4T_HAL_ENABLED - nfc_t4t_hal - Hardware Abstraction Layer for NFC library. //========================================================== #ifndef NFC_T4T_HAL_ENABLED #define NFC_T4T_HAL_ENABLED 0 #endif // NFCT_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NFCT_CONFIG_IRQ_PRIORITY #define NFCT_CONFIG_IRQ_PRIORITY 7 @@ -7355,88 +10731,88 @@ #define HAL_NFC_CONFIG_LOG_ENABLED 0 #endif // HAL_NFC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef HAL_NFC_CONFIG_LOG_LEVEL #define HAL_NFC_CONFIG_LOG_LEVEL 3 #endif // HAL_NFC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_INFO_COLOR #define HAL_NFC_CONFIG_INFO_COLOR 0 #endif // HAL_NFC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_DEBUG_COLOR #define HAL_NFC_CONFIG_DEBUG_COLOR 0 #endif // HAL_NFC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef HAL_NFC_CONFIG_LOG_LEVEL #define HAL_NFC_CONFIG_LOG_LEVEL 3 #endif // HAL_NFC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_INFO_COLOR #define HAL_NFC_CONFIG_INFO_COLOR 0 #endif // HAL_NFC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_DEBUG_COLOR #define HAL_NFC_CONFIG_DEBUG_COLOR 0 @@ -7450,560 +10826,560 @@ #define HAL_NFC_CONFIG_DEBUG_PIN_ENABLED 0 #endif // HAL_NFC_HCLOCK_ON_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_ON_DEBUG_PIN #define HAL_NFC_HCLOCK_ON_DEBUG_PIN 31 #endif // HAL_NFC_HCLOCK_OFF_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_OFF_DEBUG_PIN #define HAL_NFC_HCLOCK_OFF_DEBUG_PIN 31 #endif // HAL_NFC_NFC_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_NFC_EVENT_DEBUG_PIN #define HAL_NFC_NFC_EVENT_DEBUG_PIN 31 #endif // HAL_NFC_DETECT_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_DETECT_EVENT_DEBUG_PIN #define HAL_NFC_DETECT_EVENT_DEBUG_PIN 31 #endif // HAL_NFC_TIMER4_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_TIMER4_EVENT_DEBUG_PIN #define HAL_NFC_TIMER4_EVENT_DEBUG_PIN 31 #endif // HAL_NFC_HCLOCK_ON_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_ON_DEBUG_PIN #define HAL_NFC_HCLOCK_ON_DEBUG_PIN 31 #endif // HAL_NFC_HCLOCK_OFF_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_OFF_DEBUG_PIN #define HAL_NFC_HCLOCK_OFF_DEBUG_PIN 31 #endif // HAL_NFC_NFC_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_NFC_EVENT_DEBUG_PIN #define HAL_NFC_NFC_EVENT_DEBUG_PIN 31 #endif // HAL_NFC_DETECT_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_DETECT_EVENT_DEBUG_PIN #define HAL_NFC_DETECT_EVENT_DEBUG_PIN 31 #endif // HAL_NFC_TIMER4_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_TIMER4_EVENT_DEBUG_PIN #define HAL_NFC_TIMER4_EVENT_DEBUG_PIN 31 @@ -8013,510 +11389,491 @@ // -// +// NFC_T4T_HL_DETECTION_PROCEDURES_ENABLED - nfc_t4t_hl_detection_procedures - NDEF Detection Procedure for Type 4 Tag //========================================================== - -// nRF_Segger_RTT - +#ifndef NFC_T4T_HL_DETECTION_PROCEDURES_ENABLED +#define NFC_T4T_HL_DETECTION_PROCEDURES_ENABLED 0 +#endif +// NFC_T4T_HL_DETECTION_PROCEDURES_LOG_ENABLED - Enables logging in the module. //========================================================== -// segger_rtt - SEGGER RTT +#ifndef NFC_T4T_HL_DETECTION_PROCEDURES_LOG_ENABLED +#define NFC_T4T_HL_DETECTION_PROCEDURES_LOG_ENABLED 0 +#endif +// NFC_T4T_HL_DETECTION_PROCEDURES_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug -//========================================================== -// SEGGER_RTT_CONFIG_BUFFER_SIZE_UP - Size of upstream buffer. -// Note that either @ref NRF_LOG_BACKEND_RTT_OUTPUT_BUFFER_SIZE -// or this value is actually used. It depends on which one is bigger. - -#ifndef SEGGER_RTT_CONFIG_BUFFER_SIZE_UP -#define SEGGER_RTT_CONFIG_BUFFER_SIZE_UP 512 +#ifndef NFC_T4T_HL_DETECTION_PROCEDURES_LOG_LEVEL +#define NFC_T4T_HL_DETECTION_PROCEDURES_LOG_LEVEL 3 #endif -// SEGGER_RTT_CONFIG_MAX_NUM_UP_BUFFERS - Size of upstream buffer. -#ifndef SEGGER_RTT_CONFIG_MAX_NUM_UP_BUFFERS -#define SEGGER_RTT_CONFIG_MAX_NUM_UP_BUFFERS 2 +// NFC_T4T_HL_DETECTION_PROCEDURES_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NFC_T4T_HL_DETECTION_PROCEDURES_INFO_COLOR +#define NFC_T4T_HL_DETECTION_PROCEDURES_INFO_COLOR 0 #endif -// SEGGER_RTT_CONFIG_BUFFER_SIZE_DOWN - Size of upstream buffer. -#ifndef SEGGER_RTT_CONFIG_BUFFER_SIZE_DOWN -#define SEGGER_RTT_CONFIG_BUFFER_SIZE_DOWN 16 -#endif - -// SEGGER_RTT_CONFIG_MAX_NUM_DOWN_BUFFERS - Size of upstream buffer. -#ifndef SEGGER_RTT_CONFIG_MAX_NUM_DOWN_BUFFERS -#define SEGGER_RTT_CONFIG_MAX_NUM_DOWN_BUFFERS 2 -#endif - -// SEGGER_RTT_CONFIG_DEFAULT_MODE - RTT behavior if the buffer is full. - - -// The following modes are supported: -// - SKIP - Do not block, output nothing. -// - TRIM - Do not block, output as much as fits. -// - BLOCK - Wait until there is space in the buffer. -// <0=> SKIP -// <1=> TRIM -// <2=> BLOCK_IF_FIFO_FULL - -#ifndef SEGGER_RTT_CONFIG_DEFAULT_MODE -#define SEGGER_RTT_CONFIG_DEFAULT_MODE 0 -#endif - -// -//========================================================== - -// -//========================================================== - -// nRF_SoftDevice - -//========================================================== -// NRF_SDH_ANT_ENABLED - nrf_sdh_ant - SoftDevice ANT event handler -//========================================================== -#ifndef NRF_SDH_ANT_ENABLED -#define NRF_SDH_ANT_ENABLED 0 -#endif -// ANT Channels - -//========================================================== -// NRF_SDH_ANT_TOTAL_CHANNELS_ALLOCATED - Allocated ANT channels. -#ifndef NRF_SDH_ANT_TOTAL_CHANNELS_ALLOCATED -#define NRF_SDH_ANT_TOTAL_CHANNELS_ALLOCATED 0 -#endif - -// NRF_SDH_ANT_ENCRYPTED_CHANNELS - Encrypted ANT channels. -#ifndef NRF_SDH_ANT_ENCRYPTED_CHANNELS -#define NRF_SDH_ANT_ENCRYPTED_CHANNELS 0 -#endif - -// -//========================================================== - -// ANT Queues - -//========================================================== -// NRF_SDH_ANT_EVENT_QUEUE_SIZE - Event queue size. -#ifndef NRF_SDH_ANT_EVENT_QUEUE_SIZE -#define NRF_SDH_ANT_EVENT_QUEUE_SIZE 32 -#endif - -// NRF_SDH_ANT_BURST_QUEUE_SIZE - ANT burst queue size. -#ifndef NRF_SDH_ANT_BURST_QUEUE_SIZE -#define NRF_SDH_ANT_BURST_QUEUE_SIZE 128 -#endif - -// -//========================================================== - -// ANT Observers - Observers and priority levels - -//========================================================== -// NRF_SDH_ANT_OBSERVER_PRIO_LEVELS - Total number of priority levels for ANT observers. -// This setting configures the number of priority levels available for the ANT event handlers. -// The priority level of a handler determines the order in which it receives events, with respect to other handlers. - -#ifndef NRF_SDH_ANT_OBSERVER_PRIO_LEVELS -#define NRF_SDH_ANT_OBSERVER_PRIO_LEVELS 2 -#endif - -// ANT Observers priorities - Invididual priorities - -//========================================================== -// ANT_BPWR_ANT_OBSERVER_PRIO -// Priority with which ANT events are dispatched to the Bicycle Power Profile. - -#ifndef ANT_BPWR_ANT_OBSERVER_PRIO -#define ANT_BPWR_ANT_OBSERVER_PRIO 1 -#endif - -// ANT_BSC_ANT_OBSERVER_PRIO -// Priority with which ANT events are dispatched to the Bicycle Speed and Cadence Profile. - -#ifndef ANT_BSC_ANT_OBSERVER_PRIO -#define ANT_BSC_ANT_OBSERVER_PRIO 1 -#endif - -// ANT_ENCRYPT_ANT_OBSERVER_PRIO -// Priority with which ANT events are dispatched to the Cryptographic ANT stack configuration module. - -#ifndef ANT_ENCRYPT_ANT_OBSERVER_PRIO -#define ANT_ENCRYPT_ANT_OBSERVER_PRIO 1 -#endif - -// ANT_HRM_ANT_OBSERVER_PRIO -// Priority with which ANT events are dispatched to the Heart Rate Monitor. - -#ifndef ANT_HRM_ANT_OBSERVER_PRIO -#define ANT_HRM_ANT_OBSERVER_PRIO 1 -#endif - -// ANT_SDM_ANT_OBSERVER_PRIO -// Priority with which ANT events are dispatched to the Stride Based Speed and Distance Monitor Profile. - -#ifndef ANT_SDM_ANT_OBSERVER_PRIO -#define ANT_SDM_ANT_OBSERVER_PRIO 1 -#endif - -// ANT_STATE_INDICATOR_ANT_OBSERVER_PRIO -// Priority with which ANT events are dispatched to the ANT state indicator module. - -#ifndef ANT_STATE_INDICATOR_ANT_OBSERVER_PRIO -#define ANT_STATE_INDICATOR_ANT_OBSERVER_PRIO 1 -#endif - -// BSP_BTN_ANT_OBSERVER_PRIO -// Priority with which ANT events are dispatched to the Button Control module. - -#ifndef BSP_BTN_ANT_OBSERVER_PRIO -#define BSP_BTN_ANT_OBSERVER_PRIO 1 -#endif - -// -//========================================================== - -// -//========================================================== - - // +// APDU_BUFF_SIZE - Size (in bytes) of the buffer for APDU storage +#ifndef APDU_BUFF_SIZE +#define APDU_BUFF_SIZE 250 +#endif + +// CC_STORAGE_BUFF_SIZE - Size (in bytes) of the buffer for CC file storage +#ifndef CC_STORAGE_BUFF_SIZE +#define CC_STORAGE_BUFF_SIZE 64 +#endif + +// + +// NFC_T4T_TLV_BLOCK_PARSER_ENABLED - nfc_t4t_tlv_block - TLV block for Type 4 Tag +//========================================================== +#ifndef NFC_T4T_TLV_BLOCK_PARSER_ENABLED +#define NFC_T4T_TLV_BLOCK_PARSER_ENABLED 0 +#endif +// NFC_T4T_TLV_BLOCK_PARSER_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NFC_T4T_TLV_BLOCK_PARSER_LOG_ENABLED +#define NFC_T4T_TLV_BLOCK_PARSER_LOG_ENABLED 0 +#endif +// NFC_T4T_TLV_BLOCK_PARSER_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NFC_T4T_TLV_BLOCK_PARSER_LOG_LEVEL +#define NFC_T4T_TLV_BLOCK_PARSER_LOG_LEVEL 3 +#endif + +// NFC_T4T_TLV_BLOCK_PARSER_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NFC_T4T_TLV_BLOCK_PARSER_INFO_COLOR +#define NFC_T4T_TLV_BLOCK_PARSER_INFO_COLOR 0 +#endif + +// + +// + +// +//========================================================== + +// nRF_SoftDevice + +//========================================================== // NRF_SDH_BLE_ENABLED - nrf_sdh_ble - SoftDevice BLE event handler //========================================================== #ifndef NRF_SDH_BLE_ENABLED -#define NRF_SDH_BLE_ENABLED 1 +#define NRF_SDH_BLE_ENABLED 0 #endif // BLE Stack configuration - Stack configuration parameters -// These values are not used directly by the SoftDevice handler but the application or other libraries might depend on them. -// Keep them up-to-date with the desired configuration. +// The SoftDevice handler will configure the stack with these parameters when calling @ref nrf_sdh_ble_default_cfg_set. +// Other libraries might depend on these values; keep them up-to-date even if you are not explicitely calling @ref nrf_sdh_ble_default_cfg_set. //========================================================== -// NRF_SDH_BLE_PERIPHERAL_LINK_COUNT - Maximum number of peripheral links. +// NRF_SDH_BLE_GAP_DATA_LENGTH <27-251> + + +// Requested BLE GAP data length to be negotiated. + +#ifndef NRF_SDH_BLE_GAP_DATA_LENGTH +#define NRF_SDH_BLE_GAP_DATA_LENGTH 27 +#endif + +// NRF_SDH_BLE_PERIPHERAL_LINK_COUNT - Maximum number of peripheral links. #ifndef NRF_SDH_BLE_PERIPHERAL_LINK_COUNT #define NRF_SDH_BLE_PERIPHERAL_LINK_COUNT 0 #endif -// NRF_SDH_BLE_CENTRAL_LINK_COUNT - Maximum number of central links. +// NRF_SDH_BLE_CENTRAL_LINK_COUNT - Maximum number of central links. #ifndef NRF_SDH_BLE_CENTRAL_LINK_COUNT #define NRF_SDH_BLE_CENTRAL_LINK_COUNT 0 #endif -// NRF_SDH_BLE_TOTAL_LINK_COUNT - Maximum number of total concurrent connections using the default configuration. +// NRF_SDH_BLE_TOTAL_LINK_COUNT - Total link count. +// Maximum number of total concurrent connections using the default configuration. + #ifndef NRF_SDH_BLE_TOTAL_LINK_COUNT #define NRF_SDH_BLE_TOTAL_LINK_COUNT 1 #endif -// NRF_SDH_BLE_GAP_EVENT_LENGTH - The time set aside for this connection on every connection interval in 1.25 ms units. +// NRF_SDH_BLE_GAP_EVENT_LENGTH - GAP event length. +// The time set aside for this connection on every connection interval in 1.25 ms units. + #ifndef NRF_SDH_BLE_GAP_EVENT_LENGTH -#define NRF_SDH_BLE_GAP_EVENT_LENGTH 3 +#define NRF_SDH_BLE_GAP_EVENT_LENGTH 6 #endif -// NRF_SDH_BLE_GATT_MAX_MTU_SIZE - Static maximum MTU size. +// NRF_SDH_BLE_GATT_MAX_MTU_SIZE - Static maximum MTU size. #ifndef NRF_SDH_BLE_GATT_MAX_MTU_SIZE #define NRF_SDH_BLE_GATT_MAX_MTU_SIZE 23 #endif -// NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE - Attribute Table size in bytes. The size must be a multiple of 4. +// NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE - Attribute Table size in bytes. The size must be a multiple of 4. #ifndef NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE #define NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE 1408 #endif -// NRF_SDH_BLE_VS_UUID_COUNT - The number of vendor-specific UUIDs. +// NRF_SDH_BLE_VS_UUID_COUNT - The number of vendor-specific UUIDs. #ifndef NRF_SDH_BLE_VS_UUID_COUNT #define NRF_SDH_BLE_VS_UUID_COUNT 0 #endif // NRF_SDH_BLE_SERVICE_CHANGED - Include the Service Changed characteristic in the Attribute Table. - + #ifndef NRF_SDH_BLE_SERVICE_CHANGED #define NRF_SDH_BLE_SERVICE_CHANGED 0 #endif -// +// //========================================================== // BLE Observers - Observers and priority levels //========================================================== -// NRF_SDH_BLE_OBSERVER_PRIO_LEVELS - Total number of priority levels for BLE observers. +// NRF_SDH_BLE_OBSERVER_PRIO_LEVELS - Total number of priority levels for BLE observers. // This setting configures the number of priority levels available for BLE event handlers. // The priority level of a handler determines the order in which it receives events, with respect to other handlers. #ifndef NRF_SDH_BLE_OBSERVER_PRIO_LEVELS -#define NRF_SDH_BLE_OBSERVER_PRIO_LEVELS 3 +#define NRF_SDH_BLE_OBSERVER_PRIO_LEVELS 4 #endif // BLE Observers priorities - Invididual priorities //========================================================== -// BLE_ADV_BLE_OBSERVER_PRIO +// BLE_ADV_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Advertising module. #ifndef BLE_ADV_BLE_OBSERVER_PRIO -#define BLE_ADV_BLE_OBSERVER_PRIO 2 +#define BLE_ADV_BLE_OBSERVER_PRIO 1 #endif -// BLE_ANCS_C_BLE_OBSERVER_PRIO +// BLE_ANCS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Apple Notification Service Client. #ifndef BLE_ANCS_C_BLE_OBSERVER_PRIO #define BLE_ANCS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_ANS_C_BLE_OBSERVER_PRIO +// BLE_ANS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Alert Notification Service Client. #ifndef BLE_ANS_C_BLE_OBSERVER_PRIO #define BLE_ANS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_BAS_BLE_OBSERVER_PRIO +// BLE_BAS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Battery Service. #ifndef BLE_BAS_BLE_OBSERVER_PRIO #define BLE_BAS_BLE_OBSERVER_PRIO 2 #endif -// BLE_BAS_C_BLE_OBSERVER_PRIO +// BLE_BAS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Battery Service Client. #ifndef BLE_BAS_C_BLE_OBSERVER_PRIO #define BLE_BAS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_BPS_BLE_OBSERVER_PRIO +// BLE_BPS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Blood Pressure Service. #ifndef BLE_BPS_BLE_OBSERVER_PRIO #define BLE_BPS_BLE_OBSERVER_PRIO 2 #endif -// BLE_CONN_PARAMS_BLE_OBSERVER_PRIO +// BLE_CONN_PARAMS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Connection parameters module. #ifndef BLE_CONN_PARAMS_BLE_OBSERVER_PRIO -#define BLE_CONN_PARAMS_BLE_OBSERVER_PRIO 2 +#define BLE_CONN_PARAMS_BLE_OBSERVER_PRIO 1 #endif -// BLE_CONN_STATE_BLE_OBSERVER_PRIO +// BLE_CONN_STATE_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Connection State module. #ifndef BLE_CONN_STATE_BLE_OBSERVER_PRIO #define BLE_CONN_STATE_BLE_OBSERVER_PRIO 0 #endif -// BLE_CSCS_BLE_OBSERVER_PRIO +// BLE_CSCS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Cycling Speed and Cadence Service. #ifndef BLE_CSCS_BLE_OBSERVER_PRIO #define BLE_CSCS_BLE_OBSERVER_PRIO 2 #endif -// BLE_CTS_C_BLE_OBSERVER_PRIO +// BLE_CTS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Current Time Service Client. #ifndef BLE_CTS_C_BLE_OBSERVER_PRIO #define BLE_CTS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_DB_DISC_BLE_OBSERVER_PRIO +// BLE_DB_DISC_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Database Discovery module. #ifndef BLE_DB_DISC_BLE_OBSERVER_PRIO #define BLE_DB_DISC_BLE_OBSERVER_PRIO 1 #endif -// BLE_DFU_BLE_OBSERVER_PRIO +// BLE_DFU_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the DFU Service. #ifndef BLE_DFU_BLE_OBSERVER_PRIO #define BLE_DFU_BLE_OBSERVER_PRIO 2 #endif -// BLE_GLS_BLE_OBSERVER_PRIO +// BLE_DIS_C_BLE_OBSERVER_PRIO +// Priority with which BLE events are dispatched to the Device Information Client. + +#ifndef BLE_DIS_C_BLE_OBSERVER_PRIO +#define BLE_DIS_C_BLE_OBSERVER_PRIO 2 +#endif + +// BLE_GLS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Glucose Service. #ifndef BLE_GLS_BLE_OBSERVER_PRIO #define BLE_GLS_BLE_OBSERVER_PRIO 2 #endif -// BLE_HIDS_BLE_OBSERVER_PRIO +// BLE_HIDS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Human Interface Device Service. #ifndef BLE_HIDS_BLE_OBSERVER_PRIO #define BLE_HIDS_BLE_OBSERVER_PRIO 2 #endif -// BLE_HRS_BLE_OBSERVER_PRIO +// BLE_HRS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Heart Rate Service. #ifndef BLE_HRS_BLE_OBSERVER_PRIO #define BLE_HRS_BLE_OBSERVER_PRIO 2 #endif -// BLE_HRS_C_BLE_OBSERVER_PRIO +// BLE_HRS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Heart Rate Service Client. #ifndef BLE_HRS_C_BLE_OBSERVER_PRIO #define BLE_HRS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_HTS_BLE_OBSERVER_PRIO +// BLE_HTS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Health Thermometer Service. #ifndef BLE_HTS_BLE_OBSERVER_PRIO #define BLE_HTS_BLE_OBSERVER_PRIO 2 #endif -// BLE_IAS_BLE_OBSERVER_PRIO +// BLE_IAS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Immediate Alert Service. #ifndef BLE_IAS_BLE_OBSERVER_PRIO #define BLE_IAS_BLE_OBSERVER_PRIO 2 #endif -// BLE_IAS_C_BLE_OBSERVER_PRIO +// BLE_IAS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Immediate Alert Service Client. #ifndef BLE_IAS_C_BLE_OBSERVER_PRIO #define BLE_IAS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_LBS_BLE_OBSERVER_PRIO +// BLE_LBS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the LED Button Service. #ifndef BLE_LBS_BLE_OBSERVER_PRIO #define BLE_LBS_BLE_OBSERVER_PRIO 2 #endif -// BLE_LBS_C_BLE_OBSERVER_PRIO +// BLE_LBS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the LED Button Service Client. #ifndef BLE_LBS_C_BLE_OBSERVER_PRIO #define BLE_LBS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_LLS_BLE_OBSERVER_PRIO +// BLE_LESC_OBSERVER_PRIO +// Priority with which BLE events are dispatched to the BLE LESC module. + +#ifndef BLE_LESC_OBSERVER_PRIO +#define BLE_LESC_OBSERVER_PRIO 2 +#endif + +// BLE_LLS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Link Loss Service. #ifndef BLE_LLS_BLE_OBSERVER_PRIO #define BLE_LLS_BLE_OBSERVER_PRIO 2 #endif -// BLE_LNS_BLE_OBSERVER_PRIO +// BLE_LNS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Location Navigation Service. #ifndef BLE_LNS_BLE_OBSERVER_PRIO #define BLE_LNS_BLE_OBSERVER_PRIO 2 #endif -// BLE_NUS_BLE_OBSERVER_PRIO +// BLE_NUS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the UART Service. #ifndef BLE_NUS_BLE_OBSERVER_PRIO #define BLE_NUS_BLE_OBSERVER_PRIO 2 #endif -// BLE_NUS_C_BLE_OBSERVER_PRIO +// BLE_NUS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the UART Central Service. #ifndef BLE_NUS_C_BLE_OBSERVER_PRIO #define BLE_NUS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_OTS_BLE_OBSERVER_PRIO +// BLE_OTS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Object transfer service. #ifndef BLE_OTS_BLE_OBSERVER_PRIO #define BLE_OTS_BLE_OBSERVER_PRIO 2 #endif -// BLE_OTS_C_BLE_OBSERVER_PRIO +// BLE_OTS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Object transfer service client. #ifndef BLE_OTS_C_BLE_OBSERVER_PRIO #define BLE_OTS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_RSCS_BLE_OBSERVER_PRIO +// BLE_RSCS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Running Speed and Cadence Service. #ifndef BLE_RSCS_BLE_OBSERVER_PRIO #define BLE_RSCS_BLE_OBSERVER_PRIO 2 #endif -// BLE_RSCS_C_BLE_OBSERVER_PRIO +// BLE_RSCS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Running Speed and Cadence Client. #ifndef BLE_RSCS_C_BLE_OBSERVER_PRIO #define BLE_RSCS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_TPS_BLE_OBSERVER_PRIO +// BLE_TPS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the TX Power Service. #ifndef BLE_TPS_BLE_OBSERVER_PRIO #define BLE_TPS_BLE_OBSERVER_PRIO 2 #endif -// BSP_BTN_BLE_OBSERVER_PRIO +// BSP_BTN_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Button Control module. #ifndef BSP_BTN_BLE_OBSERVER_PRIO #define BSP_BTN_BLE_OBSERVER_PRIO 1 #endif -// NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO +// NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif -// NRF_BLE_BMS_BLE_OBSERVER_PRIO +// NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO +// Priority with which BLE events are dispatched to the NFC pairing library. + +#ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO +#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 +#endif + +// NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO +// Priority with which BLE events are dispatched to the NFC pairing library. + +#ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO +#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 +#endif + +// NRF_BLE_BMS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Bond Management Service. #ifndef NRF_BLE_BMS_BLE_OBSERVER_PRIO #define NRF_BLE_BMS_BLE_OBSERVER_PRIO 2 #endif -// NRF_BLE_CGMS_BLE_OBSERVER_PRIO +// NRF_BLE_CGMS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Contiuon Glucose Monitoring Service. #ifndef NRF_BLE_CGMS_BLE_OBSERVER_PRIO #define NRF_BLE_CGMS_BLE_OBSERVER_PRIO 2 #endif -// NRF_BLE_GATTS_C_BLE_OBSERVER_PRIO +// NRF_BLE_ES_BLE_OBSERVER_PRIO +// Priority with which BLE events are dispatched to the Eddystone module. + +#ifndef NRF_BLE_ES_BLE_OBSERVER_PRIO +#define NRF_BLE_ES_BLE_OBSERVER_PRIO 2 +#endif + +// NRF_BLE_GATTS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the GATT Service Client. #ifndef NRF_BLE_GATTS_C_BLE_OBSERVER_PRIO #define NRF_BLE_GATTS_C_BLE_OBSERVER_PRIO 2 #endif -// NRF_BLE_GATT_BLE_OBSERVER_PRIO +// NRF_BLE_GATT_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the GATT module. #ifndef NRF_BLE_GATT_BLE_OBSERVER_PRIO -#define NRF_BLE_GATT_BLE_OBSERVER_PRIO 2 +#define NRF_BLE_GATT_BLE_OBSERVER_PRIO 1 #endif -// NRF_BLE_QWR_BLE_OBSERVER_PRIO +// NRF_BLE_QWR_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Queued writes module. #ifndef NRF_BLE_QWR_BLE_OBSERVER_PRIO #define NRF_BLE_QWR_BLE_OBSERVER_PRIO 2 #endif -// PM_BLE_OBSERVER_PRIO -// Priority with which BLE events are dispatched to the Peer Manager module. - +// PM_BLE_OBSERVER_PRIO - Priority with which BLE events are dispatched to the Peer Manager module. #ifndef PM_BLE_OBSERVER_PRIO -#define PM_BLE_OBSERVER_PRIO 2 +#define PM_BLE_OBSERVER_PRIO 1 #endif -// +// //========================================================== -// +// //========================================================== @@ -8525,46 +11882,46 @@ // NRF_SDH_ENABLED - nrf_sdh - SoftDevice handler //========================================================== #ifndef NRF_SDH_ENABLED -#define NRF_SDH_ENABLED 1 +#define NRF_SDH_ENABLED 0 #endif -// Dispatch model +// Dispatch model // This setting configures how Stack events are dispatched to the application. //========================================================== // NRF_SDH_DISPATCH_MODEL - + // NRF_SDH_DISPATCH_MODEL_INTERRUPT: SoftDevice events are passed to the application from the interrupt context. // NRF_SDH_DISPATCH_MODEL_APPSH: SoftDevice events are scheduled using @ref app_scheduler. // NRF_SDH_DISPATCH_MODEL_POLLING: SoftDevice events are to be fetched manually. -// <0=> NRF_SDH_DISPATCH_MODEL_INTERRUPT -// <1=> NRF_SDH_DISPATCH_MODEL_APPSH -// <2=> NRF_SDH_DISPATCH_MODEL_POLLING +// <0=> NRF_SDH_DISPATCH_MODEL_INTERRUPT +// <1=> NRF_SDH_DISPATCH_MODEL_APPSH +// <2=> NRF_SDH_DISPATCH_MODEL_POLLING #ifndef NRF_SDH_DISPATCH_MODEL #define NRF_SDH_DISPATCH_MODEL 0 #endif -// +// //========================================================== // Clock - SoftDevice clock configuration //========================================================== // NRF_SDH_CLOCK_LF_SRC - SoftDevice clock source. - -// <0=> NRF_CLOCK_LF_SRC_RC -// <1=> NRF_CLOCK_LF_SRC_XTAL -// <2=> NRF_CLOCK_LF_SRC_SYNTH + +// <0=> NRF_CLOCK_LF_SRC_RC +// <1=> NRF_CLOCK_LF_SRC_XTAL +// <2=> NRF_CLOCK_LF_SRC_SYNTH #include "nrf5x_lf_clk_helper.h" -// NRF_SDH_CLOCK_LF_RC_CTIV - SoftDevice calibration timer interval. +// NRF_SDH_CLOCK_LF_RC_CTIV - SoftDevice calibration timer interval. #ifndef NRF_SDH_CLOCK_LF_RC_CTIV #define NRF_SDH_CLOCK_LF_RC_CTIV 0 #endif -// NRF_SDH_CLOCK_LF_RC_TEMP_CTIV - SoftDevice calibration timer interval under constant temperature. +// NRF_SDH_CLOCK_LF_RC_TEMP_CTIV - SoftDevice calibration timer interval under constant temperature. // How often (in number of calibration intervals) the RC oscillator shall be calibrated // if the temperature has not changed. @@ -8572,28 +11929,32 @@ #define NRF_SDH_CLOCK_LF_RC_TEMP_CTIV 0 #endif -// NRF_SDH_CLOCK_LF_XTAL_ACCURACY - External crystal clock accuracy used in the LL to compute timing windows. +// NRF_SDH_CLOCK_LF_ACCURACY - External clock accuracy used in the LL to compute timing. + +// <0=> NRF_CLOCK_LF_ACCURACY_250_PPM +// <1=> NRF_CLOCK_LF_ACCURACY_500_PPM +// <2=> NRF_CLOCK_LF_ACCURACY_150_PPM +// <3=> NRF_CLOCK_LF_ACCURACY_100_PPM +// <4=> NRF_CLOCK_LF_ACCURACY_75_PPM +// <5=> NRF_CLOCK_LF_ACCURACY_50_PPM +// <6=> NRF_CLOCK_LF_ACCURACY_30_PPM +// <7=> NRF_CLOCK_LF_ACCURACY_20_PPM +// <8=> NRF_CLOCK_LF_ACCURACY_10_PPM +// <9=> NRF_CLOCK_LF_ACCURACY_5_PPM +// <10=> NRF_CLOCK_LF_ACCURACY_2_PPM +// <11=> NRF_CLOCK_LF_ACCURACY_1_PPM -// <0=> NRF_CLOCK_LF_XTAL_ACCURACY_250_PPM -// <1=> NRF_CLOCK_LF_XTAL_ACCURACY_500_PPM -// <2=> NRF_CLOCK_LF_XTAL_ACCURACY_150_PPM -// <3=> NRF_CLOCK_LF_XTAL_ACCURACY_100_PPM -// <4=> NRF_CLOCK_LF_XTAL_ACCURACY_75_PPM -// <5=> NRF_CLOCK_LF_XTAL_ACCURACY_50_PPM -// <6=> NRF_CLOCK_LF_XTAL_ACCURACY_30_PPM -// <7=> NRF_CLOCK_LF_XTAL_ACCURACY_20_PPM - -#ifndef NRF_SDH_CLOCK_LF_XTAL_ACCURACY -#define NRF_SDH_CLOCK_LF_XTAL_ACCURACY 7 +#ifndef NRF_SDH_CLOCK_LF_ACCURACY +#define NRF_SDH_CLOCK_LF_ACCURACY 7 #endif -// +// //========================================================== // SDH Observers - Observers and priority levels //========================================================== -// NRF_SDH_REQ_OBSERVER_PRIO_LEVELS - Total number of priority levels for request observers. +// NRF_SDH_REQ_OBSERVER_PRIO_LEVELS - Total number of priority levels for request observers. // This setting configures the number of priority levels available for the SoftDevice request event handlers. // The priority level of a handler determines the order in which it receives events, with respect to other handlers. @@ -8601,7 +11962,7 @@ #define NRF_SDH_REQ_OBSERVER_PRIO_LEVELS 2 #endif -// NRF_SDH_STATE_OBSERVER_PRIO_LEVELS - Total number of priority levels for state observers. +// NRF_SDH_STATE_OBSERVER_PRIO_LEVELS - Total number of priority levels for state observers. // This setting configures the number of priority levels available for the SoftDevice state event handlers. // The priority level of a handler determines the order in which it receives events, with respect to other handlers. @@ -8609,7 +11970,7 @@ #define NRF_SDH_STATE_OBSERVER_PRIO_LEVELS 2 #endif -// NRF_SDH_STACK_OBSERVER_PRIO_LEVELS - Total number of priority levels for stack event observers. +// NRF_SDH_STACK_OBSERVER_PRIO_LEVELS - Total number of priority levels for stack event observers. // This setting configures the number of priority levels available for the SoftDevice stack event handlers (ANT, BLE, SoC). // The priority level of a handler determines the order in which it receives events, with respect to other handlers. @@ -8621,34 +11982,34 @@ // State Observers priorities - Invididual priorities //========================================================== -// CLOCK_CONFIG_STATE_OBSERVER_PRIO +// CLOCK_CONFIG_STATE_OBSERVER_PRIO // Priority with which state events are dispatched to the Clock driver. #ifndef CLOCK_CONFIG_STATE_OBSERVER_PRIO #define CLOCK_CONFIG_STATE_OBSERVER_PRIO 0 #endif -// POWER_CONFIG_STATE_OBSERVER_PRIO +// POWER_CONFIG_STATE_OBSERVER_PRIO // Priority with which state events are dispatched to the Power driver. #ifndef POWER_CONFIG_STATE_OBSERVER_PRIO #define POWER_CONFIG_STATE_OBSERVER_PRIO 0 #endif -// RNG_CONFIG_STATE_OBSERVER_PRIO +// RNG_CONFIG_STATE_OBSERVER_PRIO // Priority with which state events are dispatched to this module. #ifndef RNG_CONFIG_STATE_OBSERVER_PRIO #define RNG_CONFIG_STATE_OBSERVER_PRIO 0 #endif -// +// //========================================================== // Stack Event Observers priorities - Invididual priorities //========================================================== -// NRF_SDH_ANT_STACK_OBSERVER_PRIO +// NRF_SDH_ANT_STACK_OBSERVER_PRIO // This setting configures the priority with which ANT events are processed with respect to other events coming from the stack. // Modify this setting if you need to have ANT events dispatched before or after other stack events, such as BLE or SoC. // Zero is the highest priority. @@ -8657,7 +12018,7 @@ #define NRF_SDH_ANT_STACK_OBSERVER_PRIO 0 #endif -// NRF_SDH_BLE_STACK_OBSERVER_PRIO +// NRF_SDH_BLE_STACK_OBSERVER_PRIO // This setting configures the priority with which BLE events are processed with respect to other events coming from the stack. // Modify this setting if you need to have BLE events dispatched before or after other stack events, such as ANT or SoC. // Zero is the highest priority. @@ -8666,7 +12027,7 @@ #define NRF_SDH_BLE_STACK_OBSERVER_PRIO 0 #endif -// NRF_SDH_SOC_STACK_OBSERVER_PRIO +// NRF_SDH_SOC_STACK_OBSERVER_PRIO // This setting configures the priority with which SoC events are processed with respect to other events coming from the stack. // Modify this setting if you need to have SoC events dispatched before or after other stack events, such as ANT or BLE. // Zero is the highest priority. @@ -8675,10 +12036,10 @@ #define NRF_SDH_SOC_STACK_OBSERVER_PRIO 0 #endif -// +// //========================================================== -// +// //========================================================== @@ -8692,7 +12053,7 @@ // SoC Observers - Observers and priority levels //========================================================== -// NRF_SDH_SOC_OBSERVER_PRIO_LEVELS - Total number of priority levels for SoC observers. +// NRF_SDH_SOC_OBSERVER_PRIO_LEVELS - Total number of priority levels for SoC observers. // This setting configures the number of priority levels available for the SoC event handlers. // The priority level of a handler determines the order in which it receives events, with respect to other handlers. @@ -8703,44 +12064,44 @@ // SoC Observers priorities - Invididual priorities //========================================================== -// BLE_ADV_SOC_OBSERVER_PRIO +// BLE_ADV_SOC_OBSERVER_PRIO // Priority with which SoC events are dispatched to the Advertising module. #ifndef BLE_ADV_SOC_OBSERVER_PRIO #define BLE_ADV_SOC_OBSERVER_PRIO 1 #endif -// BLE_DFU_SOC_OBSERVER_PRIO +// BLE_DFU_SOC_OBSERVER_PRIO // Priority with which BLE events are dispatched to the DFU Service. #ifndef BLE_DFU_SOC_OBSERVER_PRIO #define BLE_DFU_SOC_OBSERVER_PRIO 1 #endif -// CLOCK_CONFIG_SOC_OBSERVER_PRIO +// CLOCK_CONFIG_SOC_OBSERVER_PRIO // Priority with which SoC events are dispatched to the Clock driver. #ifndef CLOCK_CONFIG_SOC_OBSERVER_PRIO #define CLOCK_CONFIG_SOC_OBSERVER_PRIO 0 #endif -// POWER_CONFIG_SOC_OBSERVER_PRIO +// POWER_CONFIG_SOC_OBSERVER_PRIO // Priority with which SoC events are dispatched to the Power driver. #ifndef POWER_CONFIG_SOC_OBSERVER_PRIO #define POWER_CONFIG_SOC_OBSERVER_PRIO 0 #endif -// +// //========================================================== -// +// //========================================================== // -// +// //========================================================== // <<< end of configuration section >>> diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/device/TOOLCHAIN_ARM_STD/nRF52832.sct b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/device/TOOLCHAIN_ARM_STD/nRF52832.sct index 06d9dbddc2..575206351c 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/device/TOOLCHAIN_ARM_STD/nRF52832.sct +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/device/TOOLCHAIN_ARM_STD/nRF52832.sct @@ -9,19 +9,13 @@ #define MBED_APP_SIZE 0x80000 #endif -#define Stack_Size MBED_BOOT_STACK_SIZE - -/* If softdevice is present, set aside space for it */ #if !defined(MBED_RAM_START) - #if defined(SOFTDEVICE_PRESENT) - #define MBED_RAM_START 0x200031D0 - #define MBED_RAM_SIZE 0xCE30 - #else - #define MBED_RAM_START 0x20000000 - #define MBED_RAM_SIZE 0x10000 - #endif + #define MBED_RAM_START 0x20000000 + #define MBED_RAM_SIZE 0x10000 #endif +#define Stack_Size MBED_BOOT_STACK_SIZE + #define MBED_RAM0_START MBED_RAM_START #define MBED_RAM0_SIZE 0xE0 #define MBED_RAM1_START (MBED_RAM_START + MBED_RAM0_SIZE) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/device/TOOLCHAIN_GCC_ARM/NRF52832.ld b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/device/TOOLCHAIN_GCC_ARM/NRF52832.ld index fba4b46f7d..926ea76ac7 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/device/TOOLCHAIN_GCC_ARM/NRF52832.ld +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/device/TOOLCHAIN_GCC_ARM/NRF52832.ld @@ -25,15 +25,9 @@ #define MBED_APP_SIZE 0x80000 #endif -/* If softdevice is present, set aside space for it */ #if !defined(MBED_RAM_START) - #if defined(SOFTDEVICE_PRESENT) - #define MBED_RAM_START 0x200031D0 - #define MBED_RAM_SIZE 0xCE30 - #else - #define MBED_RAM_START 0x20000000 - #define MBED_RAM_SIZE 0x10000 - #endif + #define MBED_RAM_START 0x20000000 + #define MBED_RAM_SIZE 0x10000 #endif #if !defined(MBED_BOOT_STACK_SIZE) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/device/TOOLCHAIN_IAR/nRF52832.icf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/device/TOOLCHAIN_IAR/nRF52832.icf index f116c49455..0278339693 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/device/TOOLCHAIN_IAR/nRF52832.icf +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52832/device/TOOLCHAIN_IAR/nRF52832.icf @@ -11,15 +11,9 @@ if (!isdefinedsymbol(MBED_APP_SIZE)) { define symbol MBED_APP_SIZE = 0x80000; } -/* If softdevice is present, set aside space for it */ if (!isdefinedsymbol(MBED_RAM_START)) { - if (isdefinedsymbol(SOFTDEVICE_PRESENT)) { - define symbol MBED_RAM_START = 0x200031D0; - define symbol MBED_RAM_SIZE = 0xCE30; - } else { define symbol MBED_RAM_START = 0x20000000; - define symbol MBED_RAM_SIZE = 0x10000; - } + define symbol MBED_RAM_SIZE = 0x10000; } if (!isdefinedsymbol(MBED_BOOT_STACK_SIZE)) { diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/TARGET_NRF52840_DK/PinNames.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/TARGET_NRF52840_DK/PinNames.h index 5730e040c1..94eed0112b 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/TARGET_NRF52840_DK/PinNames.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/TARGET_NRF52840_DK/PinNames.h @@ -51,8 +51,6 @@ typedef enum { PIN_OUTPUT } PinDirection; -#define PORT_SHIFT 3 - ///> define macro producing for example Px_y = NRF_GPIO_PIN_MAP(x, y) #define PinDef(port_num, pin_num) P##port_num##_##pin_num = NRF_GPIO_PIN_MAP(port_num, pin_num) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/config/sdk_config.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/config/sdk_config.h index d193187f9e..57ec3c5ca0 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/config/sdk_config.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/config/sdk_config.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -21,10 +21,10 @@ * * 4. This software, with or without modification, must only be used with a * Nordic Semiconductor ASA integrated circuit. - * + * * 5. Any software provided in binary form under this license must not be reverse * engineered, decompiled, modified and/or disassembled. - * + * * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -35,1393 +35,417 @@ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * */ - - #ifndef SDK_CONFIG_H #define SDK_CONFIG_H // <<< Use Configuration Wizard in Context Menu >>>\n #ifdef USE_APP_CONFIG #include "app_config.h" #endif -// Board Support -// Enable NRF Asserts when Mbed NDEBUG is not set -#if !defined(NDEBUG) && !defined(DEBUG_NRF_USER) -#define DEBUG_NRF_USER -#endif - -//========================================================== -// BSP_BTN_BLE_ENABLED - bsp_btn_ble - Button Control for BLE - - -#ifndef BSP_BTN_BLE_ENABLED -#define BSP_BTN_BLE_ENABLED 0 -#endif - -// -//========================================================== - -// nRF_ANT - -//========================================================== -// ANTFS_ENABLED - ant_fs - ANT File Share module. -//========================================================== -#ifndef ANTFS_ENABLED -#define ANTFS_ENABLED 0 -#endif -// ANTFS_CONFIG_NETWORK_NUMBER - ANT-FS network number. -#ifndef ANTFS_CONFIG_NETWORK_NUMBER -#define ANTFS_CONFIG_NETWORK_NUMBER 0 -#endif - -// ANTFS_CONFIG_CHANNEL_NUMBER - ANT-FS channel number. -#ifndef ANTFS_CONFIG_CHANNEL_NUMBER -#define ANTFS_CONFIG_CHANNEL_NUMBER 0 -#endif - -// ANTFS_CONFIG_PAIRING_TIMEOUT - Pairing timeout - how long the UI will wait for a response to a pairing request before switching to the link layer, in seconds. -#ifndef ANTFS_CONFIG_PAIRING_TIMEOUT -#define ANTFS_CONFIG_PAIRING_TIMEOUT 120 -#endif - -// ANTFS_CONFIG_LINK_COMMAND_TIMEOUT - Command timeout - how long the client will wait without receiving any commands before switching to the link layer, in seconds. -#ifndef ANTFS_CONFIG_LINK_COMMAND_TIMEOUT -#define ANTFS_CONFIG_LINK_COMMAND_TIMEOUT 10 -#endif - -// ANTFS_CONFIG_TRANS_TYPE - ANT-FS Transmission Type. -#ifndef ANTFS_CONFIG_TRANS_TYPE -#define ANTFS_CONFIG_TRANS_TYPE 10 -#endif - -// ANTFS_CONFIG_DEVICE_TYPE - ANT device type for channel configuration. -#ifndef ANTFS_CONFIG_DEVICE_TYPE -#define ANTFS_CONFIG_DEVICE_TYPE 1 -#endif - -// ANTFS_CONFIG_BEACON_STATUS_PERIOD - ANT-FS Beacon Message Period. - -// <0=> 0.5 Hz -// <1=> 1 Hz -// <2=> 2 Hz -// <3=> 4 Hz -// <4=> 8 Hz - -#ifndef ANTFS_CONFIG_BEACON_STATUS_PERIOD -#define ANTFS_CONFIG_BEACON_STATUS_PERIOD 3 -#endif - -// ANTFS_CONFIG_TRANSMIT_POWER - ANT Transmit Power. - -// <0=> Lowest ANT Tx power level setting. (-20dBm) -// <1=> ANT Tx power > Lvl 0. (-12dBm) -// <2=> ANT Tx power > Lvl 1. (-4dBm) -// <3=> ANT Tx power > Lvl 2. Default tx power level. (0dBm) -// <4=> ANT Tx power > Lvl 3. (+4dBm) -// <128=> Custom tx power selection - -#ifndef ANTFS_CONFIG_TRANSMIT_POWER -#define ANTFS_CONFIG_TRANSMIT_POWER 3 -#endif - -// ANTFS_CONFIG_CUSTOM_TRANSMIT_POWER - ANT Custom Transmit Power. -#ifndef ANTFS_CONFIG_CUSTOM_TRANSMIT_POWER -#define ANTFS_CONFIG_CUSTOM_TRANSMIT_POWER 0 -#endif - -// ANTFS_CONFIG_AUTH_TYPE_PAIRING_ENABLED - Use pairing and key exchange authentication. - - -#ifndef ANTFS_CONFIG_AUTH_TYPE_PAIRING_ENABLED -#define ANTFS_CONFIG_AUTH_TYPE_PAIRING_ENABLED 0 -#endif - -// ANTFS_CONFIG_AUTH_TYPE_PASSKEY_ENABLED - Use passkey authentication. - - -#ifndef ANTFS_CONFIG_AUTH_TYPE_PASSKEY_ENABLED -#define ANTFS_CONFIG_AUTH_TYPE_PASSKEY_ENABLED 0 -#endif - -// ANTFS_CONFIG_AUTH_TYPE_PASSTHROUGH_ENABLED - Allow host to bypass authentication. - - -#ifndef ANTFS_CONFIG_AUTH_TYPE_PASSTHROUGH_ENABLED -#define ANTFS_CONFIG_AUTH_TYPE_PASSTHROUGH_ENABLED 0 -#endif - -// ANTFS_CONFIG_UPLOAD_ENABLED - Support upload operation. - - -#ifndef ANTFS_CONFIG_UPLOAD_ENABLED -#define ANTFS_CONFIG_UPLOAD_ENABLED 0 -#endif - -// ANTFS_CONFIG_DEBUG_LED_ENABLED - Enables LED debug in the module. - - -#ifndef ANTFS_CONFIG_DEBUG_LED_ENABLED -#define ANTFS_CONFIG_DEBUG_LED_ENABLED 0 -#endif - -// - -// ANT_BPWR_ENABLED - ant_bpwr - Bicycle Power Profile -//========================================================== -#ifndef ANT_BPWR_ENABLED -#define ANT_BPWR_ENABLED 0 -#endif -// ANT_BPWR_LOG_ENABLED - Enables general logging in the module. -//========================================================== -#ifndef ANT_BPWR_LOG_ENABLED -#define ANT_BPWR_LOG_ENABLED 0 -#endif -// ANT_BPWR_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BPWR_LOG_LEVEL -#define ANT_BPWR_LOG_LEVEL 3 -#endif - -// ANT_BPWR_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BPWR_INFO_COLOR -#define ANT_BPWR_INFO_COLOR 0 -#endif - -// - -// ANT_BPWR_COMMON_LOG_ENABLED - Enables logging of BPWR tracing common data. -//========================================================== -#ifndef ANT_BPWR_COMMON_LOG_ENABLED -#define ANT_BPWR_COMMON_LOG_ENABLED 0 -#endif -// ANT_BPWR_COMMON_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BPWR_COMMON_LOG_LEVEL -#define ANT_BPWR_COMMON_LOG_LEVEL 3 -#endif - -// ANT_BPWR_COMMON_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BPWR_COMMON_INFO_COLOR -#define ANT_BPWR_COMMON_INFO_COLOR 0 -#endif - -// - -// ANT_BPWR_PAGE_TORQUE_LOG_ENABLED - Enables logging of BPWR torque page in the module. -//========================================================== -#ifndef ANT_BPWR_PAGE_TORQUE_LOG_ENABLED -#define ANT_BPWR_PAGE_TORQUE_LOG_ENABLED 0 -#endif -// ANT_BPWR_PAGE_TORQUE_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BPWR_PAGE_TORQUE_LOG_LEVEL -#define ANT_BPWR_PAGE_TORQUE_LOG_LEVEL 3 -#endif - -// ANT_BPWR_PAGE_TORQUE_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BPWR_PAGE_TORQUE_INFO_COLOR -#define ANT_BPWR_PAGE_TORQUE_INFO_COLOR 0 -#endif - -// - -// ANT_BPWR_PAGE_1_LOG_ENABLED - Enables logging of BPWR page 1 in the module. -//========================================================== -#ifndef ANT_BPWR_PAGE_1_LOG_ENABLED -#define ANT_BPWR_PAGE_1_LOG_ENABLED 0 -#endif -// ANT_BPWR_PAGE_1_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BPWR_PAGE_1_LOG_LEVEL -#define ANT_BPWR_PAGE_1_LOG_LEVEL 3 -#endif - -// ANT_BPWR_PAGE_1_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BPWR_PAGE_1_INFO_COLOR -#define ANT_BPWR_PAGE_1_INFO_COLOR 0 -#endif - -// - -// ANT_BPWR_PAGE_16_LOG_ENABLED - Enables logging of BPWR page 16 in the module. -//========================================================== -#ifndef ANT_BPWR_PAGE_16_LOG_ENABLED -#define ANT_BPWR_PAGE_16_LOG_ENABLED 0 -#endif -// ANT_BPWR_PAGE_16_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BPWR_PAGE_16_LOG_LEVEL -#define ANT_BPWR_PAGE_16_LOG_LEVEL 3 -#endif - -// ANT_BPWR_PAGE_16_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BPWR_PAGE_16_INFO_COLOR -#define ANT_BPWR_PAGE_16_INFO_COLOR 0 -#endif - -// - -// ANT_BPWR_PAGE_17_LOG_ENABLED - Enables logging of BPWR page 17 in the module. -//========================================================== -#ifndef ANT_BPWR_PAGE_17_LOG_ENABLED -#define ANT_BPWR_PAGE_17_LOG_ENABLED 0 -#endif -// ANT_BPWR_PAGE_17_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BPWR_PAGE_17_LOG_LEVEL -#define ANT_BPWR_PAGE_17_LOG_LEVEL 3 -#endif - -// ANT_BPWR_PAGE_17_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BPWR_PAGE_17_INFO_COLOR -#define ANT_BPWR_PAGE_17_INFO_COLOR 0 -#endif - -// - -// ANT_BPWR_PAGE_18_LOG_ENABLED - Enables logging of BPWR page 18 in the module. -//========================================================== -#ifndef ANT_BPWR_PAGE_18_LOG_ENABLED -#define ANT_BPWR_PAGE_18_LOG_ENABLED 0 -#endif -// ANT_BPWR_PAGE_18_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BPWR_PAGE_18_LOG_LEVEL -#define ANT_BPWR_PAGE_18_LOG_LEVEL 3 -#endif - -// ANT_BPWR_PAGE_18_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BPWR_PAGE_18_INFO_COLOR -#define ANT_BPWR_PAGE_18_INFO_COLOR 0 -#endif - -// - -// - -// ANT_BSC_ENABLED - ant_bsc - Bicycle Speed and Cadence Profile -//========================================================== -#ifndef ANT_BSC_ENABLED -#define ANT_BSC_ENABLED 0 -#endif -// ANT_BSC_LOG_ENABLED - Enables general logging in the module. -//========================================================== -#ifndef ANT_BSC_LOG_ENABLED -#define ANT_BSC_LOG_ENABLED 0 -#endif -// ANT_BSC_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_LOG_LEVEL -#define ANT_BSC_LOG_LEVEL 3 -#endif - -// ANT_BSC_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_INFO_COLOR -#define ANT_BSC_INFO_COLOR 0 -#endif - -// - -// ANT_BSC_COMBINED_PAGE_0_LOG_ENABLED - Enables logging of BSC Combined page 0 in the module. -//========================================================== -#ifndef ANT_BSC_COMBINED_PAGE_0_LOG_ENABLED -#define ANT_BSC_COMBINED_PAGE_0_LOG_ENABLED 0 -#endif -// ANT_BSC_COMBINED_PAGE_0_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_COMBINED_PAGE_0_LOG_LEVEL -#define ANT_BSC_COMBINED_PAGE_0_LOG_LEVEL 3 -#endif - -// ANT_BSC_COMBINED_PAGE_0_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_COMBINED_PAGE_0_INFO_COLOR -#define ANT_BSC_COMBINED_PAGE_0_INFO_COLOR 0 -#endif - -// - -// ANT_BSC_PAGE_0_LOG_ENABLED - Enables logging of BSC page 0 in the module. -//========================================================== -#ifndef ANT_BSC_PAGE_0_LOG_ENABLED -#define ANT_BSC_PAGE_0_LOG_ENABLED 0 -#endif -// ANT_BSC_PAGE_0_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_PAGE_0_LOG_LEVEL -#define ANT_BSC_PAGE_0_LOG_LEVEL 3 -#endif - -// ANT_BSC_PAGE_0_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_PAGE_0_INFO_COLOR -#define ANT_BSC_PAGE_0_INFO_COLOR 0 -#endif - -// - -// ANT_BSC_PAGE_1_LOG_ENABLED - Enables logging of BSC page 1 in the module. -//========================================================== -#ifndef ANT_BSC_PAGE_1_LOG_ENABLED -#define ANT_BSC_PAGE_1_LOG_ENABLED 0 -#endif -// ANT_BSC_PAGE_1_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_PAGE_1_LOG_LEVEL -#define ANT_BSC_PAGE_1_LOG_LEVEL 3 -#endif - -// ANT_BSC_PAGE_1_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_PAGE_1_INFO_COLOR -#define ANT_BSC_PAGE_1_INFO_COLOR 0 -#endif - -// - -// ANT_BSC_PAGE_2_LOG_ENABLED - Enables logging of BSC page 2 in the module. -//========================================================== -#ifndef ANT_BSC_PAGE_2_LOG_ENABLED -#define ANT_BSC_PAGE_2_LOG_ENABLED 0 -#endif -// ANT_BSC_PAGE_2_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_PAGE_2_LOG_LEVEL -#define ANT_BSC_PAGE_2_LOG_LEVEL 3 -#endif - -// ANT_BSC_PAGE_2_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_PAGE_2_INFO_COLOR -#define ANT_BSC_PAGE_2_INFO_COLOR 0 -#endif - -// - -// ANT_BSC_PAGE_3_LOG_ENABLED - Enables logging of BSC page 3 in the module. -//========================================================== -#ifndef ANT_BSC_PAGE_3_LOG_ENABLED -#define ANT_BSC_PAGE_3_LOG_ENABLED 0 -#endif -// ANT_BSC_PAGE_3_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_PAGE_3_LOG_LEVEL -#define ANT_BSC_PAGE_3_LOG_LEVEL 3 -#endif - -// ANT_BSC_PAGE_3_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_PAGE_3_INFO_COLOR -#define ANT_BSC_PAGE_3_INFO_COLOR 0 -#endif - -// - -// ANT_BSC_PAGE_4_LOG_ENABLED - Enables logging of BSC page 4 in the module. -//========================================================== -#ifndef ANT_BSC_PAGE_4_LOG_ENABLED -#define ANT_BSC_PAGE_4_LOG_ENABLED 0 -#endif -// ANT_BSC_PAGE_4_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_PAGE_4_LOG_LEVEL -#define ANT_BSC_PAGE_4_LOG_LEVEL 3 -#endif - -// ANT_BSC_PAGE_4_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_PAGE_4_INFO_COLOR -#define ANT_BSC_PAGE_4_INFO_COLOR 0 -#endif - -// - -// ANT_BSC_PAGE_5_LOG_ENABLED - Enables logging of BSC page 5 in the module. -//========================================================== -#ifndef ANT_BSC_PAGE_5_LOG_ENABLED -#define ANT_BSC_PAGE_5_LOG_ENABLED 0 -#endif -// ANT_BSC_PAGE_5_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_BSC_PAGE_5_LOG_LEVEL -#define ANT_BSC_PAGE_5_LOG_LEVEL 3 -#endif - -// ANT_BSC_PAGE_5_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_BSC_PAGE_5_INFO_COLOR -#define ANT_BSC_PAGE_5_INFO_COLOR 0 -#endif - -// - -// - -// ANT_CHANNEL_CONFIG_ENABLED - ant_channel_config - ANT common channel configuration - - -#ifndef ANT_CHANNEL_CONFIG_ENABLED -#define ANT_CHANNEL_CONFIG_ENABLED 0 -#endif - -// ANT_COMMON_PAGE_70_ENABLED - ant_common_page_70 - ANT+ common page 70 -//========================================================== -#ifndef ANT_COMMON_PAGE_70_ENABLED -#define ANT_COMMON_PAGE_70_ENABLED 0 -#endif -// ANT_COMMON_PAGE_70_LOG_ENABLED - Enables logging of common page 70 in the module. -//========================================================== -#ifndef ANT_COMMON_PAGE_70_LOG_ENABLED -#define ANT_COMMON_PAGE_70_LOG_ENABLED 0 -#endif -// ANT_COMMON_PAGE_70_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_COMMON_PAGE_70_LOG_LEVEL -#define ANT_COMMON_PAGE_70_LOG_LEVEL 3 -#endif - -// ANT_COMMON_PAGE_70_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_COMMON_PAGE_70_INFO_COLOR -#define ANT_COMMON_PAGE_70_INFO_COLOR 0 -#endif - -// - -// - -// ANT_COMMON_PAGE_80_ENABLED - ant_common_page_80 - ANT+ common page 80 -//========================================================== -#ifndef ANT_COMMON_PAGE_80_ENABLED -#define ANT_COMMON_PAGE_80_ENABLED 0 -#endif -// ANT_COMMON_PAGE_80_LOG_ENABLED - Enables logging of common page 80 in the module. -//========================================================== -#ifndef ANT_COMMON_PAGE_80_LOG_ENABLED -#define ANT_COMMON_PAGE_80_LOG_ENABLED 0 -#endif -// ANT_COMMON_PAGE_80_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_COMMON_PAGE_80_LOG_LEVEL -#define ANT_COMMON_PAGE_80_LOG_LEVEL 3 -#endif - -// ANT_COMMON_PAGE_80_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_COMMON_PAGE_80_INFO_COLOR -#define ANT_COMMON_PAGE_80_INFO_COLOR 0 -#endif - -// - -// - -// ANT_COMMON_PAGE_81_ENABLED - ant_common_page_81 - ANT+ common page 81 -//========================================================== -#ifndef ANT_COMMON_PAGE_81_ENABLED -#define ANT_COMMON_PAGE_81_ENABLED 0 -#endif -// ANT_COMMON_PAGE_81_LOG_ENABLED - Enables logging of common page 81 in the module. -//========================================================== -#ifndef ANT_COMMON_PAGE_81_LOG_ENABLED -#define ANT_COMMON_PAGE_81_LOG_ENABLED 0 -#endif -// ANT_COMMON_PAGE_81_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_COMMON_PAGE_81_LOG_LEVEL -#define ANT_COMMON_PAGE_81_LOG_LEVEL 3 -#endif - -// ANT_COMMON_PAGE_81_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_COMMON_PAGE_81_INFO_COLOR -#define ANT_COMMON_PAGE_81_INFO_COLOR 0 -#endif - -// - -// - -// ANT_ENCRYPT_CONFIG_ENABLED - ant_encrypt_config - Cryptographic ANT stack configuration - - -#ifndef ANT_ENCRYPT_CONFIG_ENABLED -#define ANT_ENCRYPT_CONFIG_ENABLED 0 -#endif - -// ANT_HRM_ENABLED - ant_hrm - Heart Rate Monitor Profile -//========================================================== -#ifndef ANT_HRM_ENABLED -#define ANT_HRM_ENABLED 0 -#endif -// ANT_HRM_LOG_ENABLED - Enables general logging in the module. -//========================================================== -#ifndef ANT_HRM_LOG_ENABLED -#define ANT_HRM_LOG_ENABLED 0 -#endif -// ANT_HRM_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_HRM_LOG_LEVEL -#define ANT_HRM_LOG_LEVEL 3 -#endif - -// ANT_HRM_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_HRM_INFO_COLOR -#define ANT_HRM_INFO_COLOR 0 -#endif - -// - -// ANT_HRM_PAGE_0_LOG_ENABLED - Enables logging of HRM page 0 in the module. -//========================================================== -#ifndef ANT_HRM_PAGE_0_LOG_ENABLED -#define ANT_HRM_PAGE_0_LOG_ENABLED 0 -#endif -// ANT_HRM_PAGE_0_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_HRM_PAGE_0_LOG_LEVEL -#define ANT_HRM_PAGE_0_LOG_LEVEL 3 -#endif - -// ANT_HRM_PAGE_0_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_HRM_PAGE_0_INFO_COLOR -#define ANT_HRM_PAGE_0_INFO_COLOR 0 -#endif - -// - -// ANT_HRM_PAGE_1_LOG_ENABLED - Enables logging of HRM page 1 in the module. -//========================================================== -#ifndef ANT_HRM_PAGE_1_LOG_ENABLED -#define ANT_HRM_PAGE_1_LOG_ENABLED 0 -#endif -// ANT_HRM_PAGE_1_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_HRM_PAGE_1_LOG_LEVEL -#define ANT_HRM_PAGE_1_LOG_LEVEL 3 -#endif - -// ANT_HRM_PAGE_1_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_HRM_PAGE_1_INFO_COLOR -#define ANT_HRM_PAGE_1_INFO_COLOR 0 -#endif - -// - -// ANT_HRM_PAGE_2_LOG_ENABLED - Enables logging of HRM page 2 in the module. -//========================================================== -#ifndef ANT_HRM_PAGE_2_LOG_ENABLED -#define ANT_HRM_PAGE_2_LOG_ENABLED 0 -#endif -// ANT_HRM_PAGE_2_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_HRM_PAGE_2_LOG_LEVEL -#define ANT_HRM_PAGE_2_LOG_LEVEL 3 -#endif - -// ANT_HRM_PAGE_2_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_HRM_PAGE_2_INFO_COLOR -#define ANT_HRM_PAGE_2_INFO_COLOR 0 -#endif - -// - -// ANT_HRM_PAGE_3_LOG_ENABLED - Enables logging of HRM page 3 in the module. -//========================================================== -#ifndef ANT_HRM_PAGE_3_LOG_ENABLED -#define ANT_HRM_PAGE_3_LOG_ENABLED 0 -#endif -// ANT_HRM_PAGE_3_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_HRM_PAGE_3_LOG_LEVEL -#define ANT_HRM_PAGE_3_LOG_LEVEL 3 -#endif - -// ANT_HRM_PAGE_3_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_HRM_PAGE_3_INFO_COLOR -#define ANT_HRM_PAGE_3_INFO_COLOR 0 -#endif - -// - -// ANT_HRM_PAGE_4_LOG_ENABLED - Enables logging of HRM page 4 in the module. -//========================================================== -#ifndef ANT_HRM_PAGE_4_LOG_ENABLED -#define ANT_HRM_PAGE_4_LOG_ENABLED 0 -#endif -// ANT_HRM_PAGE_4_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_HRM_PAGE_4_LOG_LEVEL -#define ANT_HRM_PAGE_4_LOG_LEVEL 3 -#endif - -// ANT_HRM_PAGE_4_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_HRM_PAGE_4_INFO_COLOR -#define ANT_HRM_PAGE_4_INFO_COLOR 0 -#endif - -// - -// - -// ANT_KEY_MANAGER_ENABLED - ant_key_manager - Software Component - - -#ifndef ANT_KEY_MANAGER_ENABLED -#define ANT_KEY_MANAGER_ENABLED 0 -#endif - -// ANT_REQUEST_CONTROLLER_ENABLED - ant_request_controller - ANT+ request controller - - -#ifndef ANT_REQUEST_CONTROLLER_ENABLED -#define ANT_REQUEST_CONTROLLER_ENABLED 0 -#endif - -// ANT_SDM_ENABLED - ant_sdm - Stride Based Speed and Distance Monitor Profile -//========================================================== -#ifndef ANT_SDM_ENABLED -#define ANT_SDM_ENABLED 0 -#endif -// ANT_SDM_LOG_ENABLED - Enables general logging in the module. -//========================================================== -#ifndef ANT_SDM_LOG_ENABLED -#define ANT_SDM_LOG_ENABLED 0 -#endif -// ANT_SDM_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef ANT_SDM_LOG_LEVEL -#define ANT_SDM_LOG_LEVEL 3 -#endif - -// ANT_SDM_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef ANT_SDM_INFO_COLOR -#define ANT_SDM_INFO_COLOR 0 -#endif - -// - -// - -// ANT_SEARCH_CONFIG_ENABLED - ant_search_config - ANT common search configuration -//========================================================== -#ifndef ANT_SEARCH_CONFIG_ENABLED -#define ANT_SEARCH_CONFIG_ENABLED 0 -#endif -// ANT_DEFAULT_LOW_PRIORITY_TIMEOUT - Default low priority search time-out. <0-255> - - -#ifndef ANT_DEFAULT_LOW_PRIORITY_TIMEOUT -#define ANT_DEFAULT_LOW_PRIORITY_TIMEOUT 2 -#endif - -// ANT_DEFAULT_HIGH_PRIORITY_TIMEOUT - Default high priority search time-out. <0-255> - - -#ifndef ANT_DEFAULT_HIGH_PRIORITY_TIMEOUT -#define ANT_DEFAULT_HIGH_PRIORITY_TIMEOUT 10 -#endif - -// - -// ANT_STACK_CONFIG_ENABLED - ant_stack_config - Common ANT stack configuration -//========================================================== -#ifndef ANT_STACK_CONFIG_ENABLED -#define ANT_STACK_CONFIG_ENABLED 0 -#endif -// ANT_CONFIG_TOTAL_CHANNELS_ALLOCATED - Allocated ANT channels -#ifndef ANT_CONFIG_TOTAL_CHANNELS_ALLOCATED -#define ANT_CONFIG_TOTAL_CHANNELS_ALLOCATED 0 -#endif - -// ANT_CONFIG_ENCRYPTED_CHANNELS - Encrypted ANT channels -#ifndef ANT_CONFIG_ENCRYPTED_CHANNELS -#define ANT_CONFIG_ENCRYPTED_CHANNELS 0 -#endif - -// ANT_CONFIG_EVENT_QUEUE_SIZE - Event queue size -#ifndef ANT_CONFIG_EVENT_QUEUE_SIZE -#define ANT_CONFIG_EVENT_QUEUE_SIZE 32 -#endif - -// ANT_CONFIG_BURST_QUEUE_SIZE - ANT burst queue size -#ifndef ANT_CONFIG_BURST_QUEUE_SIZE -#define ANT_CONFIG_BURST_QUEUE_SIZE 128 -#endif - -// - -// ANT_STATE_INDICATOR_ENABLED - ant_state_indicator - ANT state indicator using BSP -//========================================================== -#ifndef ANT_STATE_INDICATOR_ENABLED -#define ANT_STATE_INDICATOR_ENABLED 0 -#endif -// ANT_STATE_INDICATOR_CONFIG_SHUTDOWN_HANDLER_PRIORITY - Shutdown observer priority. -#ifndef ANT_STATE_INDICATOR_CONFIG_SHUTDOWN_HANDLER_PRIORITY -#define ANT_STATE_INDICATOR_CONFIG_SHUTDOWN_HANDLER_PRIORITY 1 -#endif - -// - -// -//========================================================== // nRF_BLE //========================================================== // BLE_ADVERTISING_ENABLED - ble_advertising - Advertising module - + #ifndef BLE_ADVERTISING_ENABLED #define BLE_ADVERTISING_ENABLED 0 #endif // BLE_DTM_ENABLED - ble_dtm - Module for testing RF/PHY using DTM commands - + #ifndef BLE_DTM_ENABLED #define BLE_DTM_ENABLED 0 #endif // BLE_RACP_ENABLED - ble_racp - Record Access Control Point library - + #ifndef BLE_RACP_ENABLED #define BLE_RACP_ENABLED 0 #endif -// NRF_BLE_CONN_PARAMS_ENABLED - ble_conn_params - Initiating and executing a connection parameters negotiation procedure +// NRF_BLE_QWR_ENABLED - nrf_ble_qwr - Queued writes support module (prepare/execute write) //========================================================== -#ifndef NRF_BLE_CONN_PARAMS_ENABLED -#define NRF_BLE_CONN_PARAMS_ENABLED 0 -#endif -// NRF_BLE_CONN_PARAMS_MAX_SLAVE_LATENCY_DEVIATION - The largest acceptable deviation in slave latency. -// The largest deviation (+ or -) from the requested slave latency that will not be renegotiated. - -#ifndef NRF_BLE_CONN_PARAMS_MAX_SLAVE_LATENCY_DEVIATION -#define NRF_BLE_CONN_PARAMS_MAX_SLAVE_LATENCY_DEVIATION 499 -#endif - -// NRF_BLE_CONN_PARAMS_MAX_SUPERVISION_TIMEOUT_DEVIATION - The largest acceptable deviation (in 10 ms units) in supervision timeout. -// The largest deviation (+ or -, in 10 ms units) from the requested supervision timeout that will not be renegotiated. - -#ifndef NRF_BLE_CONN_PARAMS_MAX_SUPERVISION_TIMEOUT_DEVIATION -#define NRF_BLE_CONN_PARAMS_MAX_SUPERVISION_TIMEOUT_DEVIATION 65535 -#endif - -// - -// NRF_BLE_QWR_ENABLED - nrf_ble_qwr - Queued writes support module (prepare/execute write) - - #ifndef NRF_BLE_QWR_ENABLED #define NRF_BLE_QWR_ENABLED 0 #endif +// NRF_BLE_QWR_MAX_ATTR - Maximum number of attribute handles that can be registered. This number must be adjusted according to the number of attributes for which Queued Writes will be enabled. If it is zero, the module will reject all Queued Write requests. +#ifndef NRF_BLE_QWR_MAX_ATTR +#define NRF_BLE_QWR_MAX_ATTR 0 +#endif + +// // PEER_MANAGER_ENABLED - peer_manager - Peer Manager //========================================================== #ifndef PEER_MANAGER_ENABLED #define PEER_MANAGER_ENABLED 0 #endif -// PM_MAX_REGISTRANTS -// Number of event handlers that can be registered. - +// PM_MAX_REGISTRANTS - Number of event handlers that can be registered. #ifndef PM_MAX_REGISTRANTS #define PM_MAX_REGISTRANTS 3 #endif -// PM_FLASH_BUFFERS -// Number of internal buffers for flash operations. +// PM_FLASH_BUFFERS - Number of internal buffers for flash operations. // Decrease this value to lower RAM usage. #ifndef PM_FLASH_BUFFERS -#define PM_FLASH_BUFFERS 8 +#define PM_FLASH_BUFFERS 2 +#endif + +// PM_CENTRAL_ENABLED - Enable/disable central-specific Peer Manager functionality. + + +// Enable/disable central-specific Peer Manager functionality. + +#ifndef PM_CENTRAL_ENABLED +#define PM_CENTRAL_ENABLED 1 +#endif + +// PM_SERVICE_CHANGED_ENABLED - Enable/disable the service changed management for GATT server in Peer Manager. + + +// If not using a GATT server, or using a server wihout a service changed characteristic, +// disable this to save code space. + +#ifndef PM_SERVICE_CHANGED_ENABLED +#define PM_SERVICE_CHANGED_ENABLED 1 +#endif + +// PM_PEER_RANKS_ENABLED - Enable/disable the peer rank management in Peer Manager. + + +// Set this to false to save code space if not using the peer rank API. + +#ifndef PM_PEER_RANKS_ENABLED +#define PM_PEER_RANKS_ENABLED 1 #endif // -// +// //========================================================== -// nRF_BLE_Services +// nRF_BLE_Services //========================================================== // BLE_ANCS_C_ENABLED - ble_ancs_c - Apple Notification Service Client - + #ifndef BLE_ANCS_C_ENABLED #define BLE_ANCS_C_ENABLED 0 #endif // BLE_ANS_C_ENABLED - ble_ans_c - Alert Notification Service Client - + #ifndef BLE_ANS_C_ENABLED #define BLE_ANS_C_ENABLED 0 #endif // BLE_BAS_C_ENABLED - ble_bas_c - Battery Service Client - + #ifndef BLE_BAS_C_ENABLED #define BLE_BAS_C_ENABLED 0 #endif -// BLE_BAS_ENABLED - ble_bas - Battery Service - - +// BLE_BAS_ENABLED - ble_bas - Battery Service +//========================================================== #ifndef BLE_BAS_ENABLED #define BLE_BAS_ENABLED 0 #endif +// BLE_BAS_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef BLE_BAS_CONFIG_LOG_ENABLED +#define BLE_BAS_CONFIG_LOG_ENABLED 0 +#endif +// BLE_BAS_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef BLE_BAS_CONFIG_LOG_LEVEL +#define BLE_BAS_CONFIG_LOG_LEVEL 3 +#endif + +// BLE_BAS_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef BLE_BAS_CONFIG_INFO_COLOR +#define BLE_BAS_CONFIG_INFO_COLOR 0 +#endif + +// BLE_BAS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef BLE_BAS_CONFIG_DEBUG_COLOR +#define BLE_BAS_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// // BLE_CSCS_ENABLED - ble_cscs - Cycling Speed and Cadence Service - + #ifndef BLE_CSCS_ENABLED #define BLE_CSCS_ENABLED 0 #endif // BLE_CTS_C_ENABLED - ble_cts_c - Current Time Service Client - + #ifndef BLE_CTS_C_ENABLED #define BLE_CTS_C_ENABLED 0 #endif // BLE_DIS_ENABLED - ble_dis - Device Information Service - + #ifndef BLE_DIS_ENABLED #define BLE_DIS_ENABLED 0 #endif // BLE_GLS_ENABLED - ble_gls - Glucose Service - + #ifndef BLE_GLS_ENABLED #define BLE_GLS_ENABLED 0 #endif // BLE_HIDS_ENABLED - ble_hids - Human Interface Device Service - + #ifndef BLE_HIDS_ENABLED #define BLE_HIDS_ENABLED 0 #endif // BLE_HRS_C_ENABLED - ble_hrs_c - Heart Rate Service Client - + #ifndef BLE_HRS_C_ENABLED #define BLE_HRS_C_ENABLED 0 #endif // BLE_HRS_ENABLED - ble_hrs - Heart Rate Service - + #ifndef BLE_HRS_ENABLED #define BLE_HRS_ENABLED 0 #endif // BLE_HTS_ENABLED - ble_hts - Health Thermometer Service - + #ifndef BLE_HTS_ENABLED #define BLE_HTS_ENABLED 0 #endif // BLE_IAS_C_ENABLED - ble_ias_c - Immediate Alert Service Client - + #ifndef BLE_IAS_C_ENABLED #define BLE_IAS_C_ENABLED 0 #endif -// BLE_IAS_ENABLED - ble_ias - Immediate Alert Service - - +// BLE_IAS_ENABLED - ble_ias - Immediate Alert Service +//========================================================== #ifndef BLE_IAS_ENABLED #define BLE_IAS_ENABLED 0 #endif +// BLE_IAS_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef BLE_IAS_CONFIG_LOG_ENABLED +#define BLE_IAS_CONFIG_LOG_ENABLED 0 +#endif +// BLE_IAS_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef BLE_IAS_CONFIG_LOG_LEVEL +#define BLE_IAS_CONFIG_LOG_LEVEL 3 +#endif + +// BLE_IAS_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef BLE_IAS_CONFIG_INFO_COLOR +#define BLE_IAS_CONFIG_INFO_COLOR 0 +#endif + +// BLE_IAS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef BLE_IAS_CONFIG_DEBUG_COLOR +#define BLE_IAS_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// // BLE_LBS_C_ENABLED - ble_lbs_c - Nordic LED Button Service Client - + #ifndef BLE_LBS_C_ENABLED #define BLE_LBS_C_ENABLED 0 #endif // BLE_LBS_ENABLED - ble_lbs - LED Button Service - + #ifndef BLE_LBS_ENABLED #define BLE_LBS_ENABLED 0 #endif // BLE_LLS_ENABLED - ble_lls - Link Loss Service - + #ifndef BLE_LLS_ENABLED #define BLE_LLS_ENABLED 0 #endif // BLE_NUS_C_ENABLED - ble_nus_c - Nordic UART Central Service - + #ifndef BLE_NUS_C_ENABLED #define BLE_NUS_C_ENABLED 0 #endif -// BLE_NUS_ENABLED - ble_nus - Nordic UART Service - - +// BLE_NUS_ENABLED - ble_nus - Nordic UART Service +//========================================================== #ifndef BLE_NUS_ENABLED #define BLE_NUS_ENABLED 0 #endif +// BLE_NUS_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef BLE_NUS_CONFIG_LOG_ENABLED +#define BLE_NUS_CONFIG_LOG_ENABLED 0 +#endif +// BLE_NUS_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef BLE_NUS_CONFIG_LOG_LEVEL +#define BLE_NUS_CONFIG_LOG_LEVEL 3 +#endif + +// BLE_NUS_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef BLE_NUS_CONFIG_INFO_COLOR +#define BLE_NUS_CONFIG_INFO_COLOR 0 +#endif + +// BLE_NUS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef BLE_NUS_CONFIG_DEBUG_COLOR +#define BLE_NUS_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// // BLE_RSCS_C_ENABLED - ble_rscs_c - Running Speed and Cadence Client - + #ifndef BLE_RSCS_C_ENABLED #define BLE_RSCS_C_ENABLED 0 #endif // BLE_RSCS_ENABLED - ble_rscs - Running Speed and Cadence Service - + #ifndef BLE_RSCS_ENABLED #define BLE_RSCS_ENABLED 0 #endif // BLE_TPS_ENABLED - ble_tps - TX Power Service - + #ifndef BLE_TPS_ENABLED #define BLE_TPS_ENABLED 0 #endif -// +// //========================================================== -// nRF_Core +// nRF_Core //========================================================== // NRF_MPU_ENABLED - nrf_mpu - Module for MPU @@ -1430,10 +454,10 @@ #define NRF_MPU_ENABLED 0 #endif // NRF_MPU_CLI_CMDS - Enable CLI commands specific to the module - + #ifndef NRF_MPU_CLI_CMDS -#define NRF_MPU_CLI_CMDS 1 +#define NRF_MPU_CLI_CMDS 0 #endif // @@ -1444,15 +468,15 @@ #define NRF_STACK_GUARD_ENABLED 0 #endif // NRF_STACK_GUARD_CONFIG_SIZE - Size of stack guard - -// <5=> 32 bytes -// <6=> 64 bytes -// <7=> 128 bytes -// <8=> 256 bytes -// <9=> 512 bytes -// <10=> 1024 bytes -// <11=> 2048 bytes -// <12=> 4096 bytes + +// <5=> 32 bytes +// <6=> 64 bytes +// <7=> 128 bytes +// <8=> 256 bytes +// <9=> 512 bytes +// <10=> 1024 bytes +// <11=> 2048 bytes +// <12=> 4096 bytes #ifndef NRF_STACK_GUARD_CONFIG_SIZE #define NRF_STACK_GUARD_CONFIG_SIZE 7 @@ -1460,240 +484,749 @@ // -// +// //========================================================== -// nRF_Crypto +// nRF_Crypto //========================================================== // NRF_CRYPTO_ENABLED - nrf_crypto - Cryptography library //========================================================== #ifndef NRF_CRYPTO_ENABLED -#define NRF_CRYPTO_ENABLED 0 +#define NRF_CRYPTO_ENABLED 1 #endif -// NRF_CRYPTO_BACKEND_CC310_LIB - Enable the ARM Cryptocell CC310 backend +// NRF_CRYPTO_ALLOCATOR - Memory allocator + +// Choose memory allocator used by nrf_crypto. Default is alloca if possible or nrf_malloc otherwise. If 'User macros' are selected then user have to create 'nrf_crypto_allocator.h' file containing NRF_CRYPTO_ALLOC, NRF_CRYPTO_FREE and NRF_CRYPTO_ALLOC_ON_STACK +// <0=> Default +// <1=> User macros +// <2=> On stack (alloca) +// <3=> C dynamic memory (malloc) +// <4=> SDK Memory Manager (nrf_malloc) -// The hardware-accelerated cryptography backend is available only on nRF52840. - -#ifndef NRF_CRYPTO_BACKEND_CC310_LIB -#define NRF_CRYPTO_BACKEND_CC310_LIB 1 +#ifndef NRF_CRYPTO_ALLOCATOR +#define NRF_CRYPTO_ALLOCATOR 0 #endif -// NRF_CRYPTO_BACKEND_MICRO_ECC - Enable the micro-ecc software backend +// NRF_CRYPTO_BACKEND_CC310_BL_ENABLED - Enable the ARM Cryptocell CC310 reduced backend. -// The micro-ecc library provides a software implementation of ECC cryptography for nRF5 Series devices. +// The CC310 hardware-accelerated cryptography backend with reduced functionality and footprint (only available on nRF52840). //========================================================== -#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC -#define NRF_CRYPTO_BACKEND_MICRO_ECC 0 +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_BL_ENABLED 0 #endif -// NRF_CRYPTO_BACKEND_MICRO_ECC_SHA256 - Enable SHA256 +// NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP224R1_ENABLED - Enable the secp224r1 elliptic curve support using CC310_BL. + - -// Enable SHA256 cryptographic hash functionality. -// Enable this setting if you need SHA256 support, for example to verify signatures. - -#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_SHA256 -#define NRF_CRYPTO_BACKEND_MICRO_ECC_SHA256 1 +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP224R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP224R1_ENABLED 0 #endif -// NRF_CRYPTO_BACKEND_MICRO_ECC_RNG - Enable random number generator +// NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP256R1_ENABLED - Enable the secp256r1 elliptic curve support using CC310_BL. + +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP256R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP256R1_ENABLED 1 +#endif -// Enable random number generation. -// Enable this setting if you need to generate cryptographic keys. -// This setting requires the RNG peripheral driver to be present. +// NRF_CRYPTO_BACKEND_CC310_BL_HASH_SHA256_ENABLED - CC310_BL SHA-256 hash functionality. + -#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_RNG -#define NRF_CRYPTO_BACKEND_MICRO_ECC_RNG 0 +// CC310_BL backend implementation for hardware-accelerated SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_HASH_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_BL_HASH_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_BL_HASH_LITTLE_ENDIAN_DIGEST_ENABLED - nrf_cc310_bl hash outputs digests in little endian + + +// Makes the nRF SH hash functions output digests in little endian format. Only for use in nRF SDK DFU! + +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_HASH_LITTLE_ENDIAN_DIGEST_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_BL_HASH_LITTLE_ENDIAN_DIGEST_ENABLED 0 +#endif + +// NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_ENABLED - nrf_cc310_bl buffers to RAM before running hash operation + + +// Enabling this makes hashing of addresses in FLASH range possible. Size of buffer allocated for hashing is set by NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_SIZE + +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_ENABLED 0 +#endif + +// NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_SIZE - nrf_cc310_bl hash outputs digests in little endian +// Makes the nrf_cc310_bl hash functions output digests in little endian format. Only for use in nRF SDK DFU! + +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_SIZE +#define NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_SIZE 4096 +#endif + +// NRF_CRYPTO_BACKEND_CC310_BL_ECC_LITTLE_ENDIAN_ENABLED - Enable non-standard little endian byte order in nrf_cc310_bl ECC functions. + + +// This affects parameters for all nrf_cc310_bl ECC APIs (raw keys, signature, digest). Only for use in nRF SDK DFU! + +#ifndef NRF_CRYPTO_BACKEND_CC310_BL_ECC_LITTLE_ENDIAN_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_BL_ECC_LITTLE_ENDIAN_ENABLED 0 +#endif + +// + +// NRF_CRYPTO_BACKEND_CC310_ENABLED - Enable the ARM Cryptocell CC310 backend. + +// The CC310 hardware-accelerated cryptography backend (only available on nRF52840). +//========================================================== +#ifndef NRF_CRYPTO_BACKEND_CC310_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ENABLED 0 +#endif +// NRF_CRYPTO_BACKEND_CC310_AES_CBC_ENABLED - Enable the AES CBC mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_AES_CBC_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_AES_CBC_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_AES_CTR_ENABLED - Enable the AES CTR mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_AES_CTR_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_AES_CTR_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_AES_ECB_ENABLED - Enable the AES ECB mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_AES_ECB_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_AES_ECB_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_AES_CBC_MAC_ENABLED - Enable the AES CBC_MAC mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_AES_CBC_MAC_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_AES_CBC_MAC_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_AES_CMAC_ENABLED - Enable the AES CMAC mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_AES_CMAC_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_AES_CMAC_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_AES_CCM_ENABLED - Enable the AES CCM mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_AES_CCM_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_AES_CCM_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_AES_CCM_STAR_ENABLED - Enable the AES CCM* mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_AES_CCM_STAR_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_AES_CCM_STAR_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_CHACHA_POLY_ENABLED - Enable the CHACHA-POLY mode using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_CHACHA_POLY_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_CHACHA_POLY_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R1_ENABLED - Enable the secp160r1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R2_ENABLED - Enable the secp160r2 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R2_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R2_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP192R1_ENABLED - Enable the secp192r1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP192R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP192R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP224R1_ENABLED - Enable the secp224r1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP224R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP224R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP256R1_ENABLED - Enable the secp256r1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP256R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP256R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP384R1_ENABLED - Enable the secp384r1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP384R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP384R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP521R1_ENABLED - Enable the secp521r1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP521R1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP521R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP160K1_ENABLED - Enable the secp160k1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP160K1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP160K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP192K1_ENABLED - Enable the secp192k1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP192K1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP192K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP224K1_ENABLED - Enable the secp224k1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP224K1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP224K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_ECC_SECP256K1_ENABLED - Enable the secp256k1 elliptic curve support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP256K1_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP256K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_HASH_SHA256_ENABLED - CC310 SHA-256 hash functionality. + + +// CC310 backend implementation for hardware-accelerated SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_CC310_HASH_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_HASH_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_HASH_SHA512_ENABLED - CC310 SHA-512 hash functionality + + +// CC310 backend implementation for SHA-512 (in software). + +#ifndef NRF_CRYPTO_BACKEND_CC310_HASH_SHA512_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_HASH_SHA512_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_HMAC_SHA256_ENABLED - CC310 HMAC using SHA-256 + + +// CC310 backend implementation for HMAC using hardware-accelerated SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_CC310_HMAC_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_HMAC_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_HMAC_SHA512_ENABLED - CC310 HMAC using SHA-512 + + +// CC310 backend implementation for HMAC using SHA-512 (in software). + +#ifndef NRF_CRYPTO_BACKEND_CC310_HMAC_SHA512_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_HMAC_SHA512_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_CC310_RNG_ENABLED - Enable RNG support using CC310. + + +#ifndef NRF_CRYPTO_BACKEND_CC310_RNG_ENABLED +#define NRF_CRYPTO_BACKEND_CC310_RNG_ENABLED 1 +#endif + +// + +// NRF_CRYPTO_BACKEND_CIFRA_ENABLED - Enable the Cifra backend. +//========================================================== +#ifndef NRF_CRYPTO_BACKEND_CIFRA_ENABLED +#define NRF_CRYPTO_BACKEND_CIFRA_ENABLED 0 +#endif +// NRF_CRYPTO_BACKEND_CIFRA_AES_EAX_ENABLED - Enable the AES EAX mode using Cifra. + + +#ifndef NRF_CRYPTO_BACKEND_CIFRA_AES_EAX_ENABLED +#define NRF_CRYPTO_BACKEND_CIFRA_AES_EAX_ENABLED 1 +#endif + +// + +// NRF_CRYPTO_BACKEND_MBEDTLS_ENABLED - Enable the mbed TLS backend. +//========================================================== +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ENABLED 0 +#endif +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_ENABLED - Enable the AES CBC mode mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_CTR_ENABLED - Enable the AES CTR mode using mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CTR_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CTR_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_CFB_ENABLED - Enable the AES CFB mode using mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CFB_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CFB_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_ECB_ENABLED - Enable the AES ECB mode using mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_ECB_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_ECB_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_MAC_ENABLED - Enable the AES CBC MAC mode using mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_MAC_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_MAC_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_CMAC_ENABLED - Enable the AES CMAC mode using mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CMAC_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CMAC_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_CCM_ENABLED - Enable the AES CCM mode using mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CCM_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CCM_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_AES_GCM_ENABLED - Enable the AES GCM mode using mbed TLS. + + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_GCM_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_GCM_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192R1_ENABLED - Enable secp192r1 (NIST 192-bit) curve + + +// Enable this setting if you need secp192r1 (NIST 192-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224R1_ENABLED - Enable secp224r1 (NIST 224-bit) curve + + +// Enable this setting if you need secp224r1 (NIST 224-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256R1_ENABLED - Enable secp256r1 (NIST 256-bit) curve + + +// Enable this setting if you need secp256r1 (NIST 256-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP384R1_ENABLED - Enable secp384r1 (NIST 384-bit) curve + + +// Enable this setting if you need secp384r1 (NIST 384-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP384R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP384R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP521R1_ENABLED - Enable secp521r1 (NIST 521-bit) curve + + +// Enable this setting if you need secp521r1 (NIST 521-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP521R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP521R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192K1_ENABLED - Enable secp192k1 (Koblitz 192-bit) curve + + +// Enable this setting if you need secp192k1 (Koblitz 192-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192K1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224K1_ENABLED - Enable secp224k1 (Koblitz 224-bit) curve + + +// Enable this setting if you need secp224k1 (Koblitz 224-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224K1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256K1_ENABLED - Enable secp256k1 (Koblitz 256-bit) curve + + +// Enable this setting if you need secp256k1 (Koblitz 256-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256K1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP256R1_ENABLED - Enable bp256r1 (Brainpool 256-bit) curve + + +// Enable this setting if you need bp256r1 (Brainpool 256-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP256R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP256R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP384R1_ENABLED - Enable bp384r1 (Brainpool 384-bit) curve + + +// Enable this setting if you need bp384r1 (Brainpool 384-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP384R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP384R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP512R1_ENABLED - Enable bp512r1 (Brainpool 512-bit) curve + + +// Enable this setting if you need bp512r1 (Brainpool 512-bit) support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP512R1_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP512R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_ECC_CURVE25519_ENABLED - Enable Curve25519 curve + + +// Enable this setting if you need Curve25519 support using MBEDTLS + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_CURVE25519_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_CURVE25519_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA256_ENABLED - Enable mbed TLS SHA-256 hash functionality. + + +// mbed TLS backend implementation for SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA512_ENABLED - Enable mbed TLS SHA-512 hash functionality. + + +// mbed TLS backend implementation for SHA-512. + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA512_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA512_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA256_ENABLED - Enable mbed TLS HMAC using SHA-256. + + +// mbed TLS backend implementation for HMAC using SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA512_ENABLED - Enable mbed TLS HMAC using SHA-512. + + +// mbed TLS backend implementation for HMAC using SHA-512. + +#ifndef NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA512_ENABLED +#define NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA512_ENABLED 1 +#endif + +// + +// NRF_CRYPTO_BACKEND_MICRO_ECC_ENABLED - Enable the micro-ecc backend. +//========================================================== +#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_ENABLED +#define NRF_CRYPTO_BACKEND_MICRO_ECC_ENABLED 0 +#endif +// NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP192R1_ENABLED - Enable secp192r1 (NIST 192-bit) curve + + +// Enable this setting if you need secp192r1 (NIST 192-bit) support using micro-ecc + +#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP192R1_ENABLED +#define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP192R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP224R1_ENABLED - Enable secp224r1 (NIST 224-bit) curve + + +// Enable this setting if you need secp224r1 (NIST 224-bit) support using micro-ecc + +#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP224R1_ENABLED +#define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP224R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256R1_ENABLED - Enable secp256r1 (NIST 256-bit) curve + + +// Enable this setting if you need secp256r1 (NIST 256-bit) support using micro-ecc + +#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256R1_ENABLED +#define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256K1_ENABLED - Enable secp256k1 (Koblitz 256-bit) curve + + +// Enable this setting if you need secp256k1 (Koblitz 256-bit) support using micro-ecc + +#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256K1_ENABLED +#define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256K1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_MICRO_ECC_PUBLIC_KEY_TRUSTED_ENABLED - Always trust raw public key (it will cause a security issue if the public key comes from an untrusted source) + + +// Enable this setting if you want to reduce flash usage. Only for use in nRF SDK DFU! Never enable it if the raw public key comes from an untrusted source. + +#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_PUBLIC_KEY_TRUSTED_ENABLED +#define NRF_CRYPTO_BACKEND_MICRO_ECC_PUBLIC_KEY_TRUSTED_ENABLED 0 +#endif + +// NRF_CRYPTO_BACKEND_MICRO_ECC_LITTLE_ENDIAN_ENABLED - Enable non-standard little endian byte order. + + +// This affects parameters for all ECC API (raw keys, signature, digest, shared secret). Only for use in nRF SDK DFU! + +#ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_LITTLE_ENDIAN_ENABLED +#define NRF_CRYPTO_BACKEND_MICRO_ECC_LITTLE_ENDIAN_ENABLED 0 +#endif + +// + +// NRF_CRYPTO_BACKEND_NRF_HW_RNG_ENABLED - Enable the nRF HW RNG backend. + +// The nRF HW backend provide access to RNG peripheral in nRF5x devices. +//========================================================== +#ifndef NRF_CRYPTO_BACKEND_NRF_HW_RNG_ENABLED +#define NRF_CRYPTO_BACKEND_NRF_HW_RNG_ENABLED 0 +#endif +// NRF_CRYPTO_BACKEND_NRF_HW_RNG_MBEDTLS_CTR_DRBG_ENABLED - Enable mbed TLS CTR-DRBG algorithm. + + +// Enable mbed TLS CTR-DRBG standardized by NIST (NIST SP 800-90A Rev. 1). The nRF HW RNG is used as an entropy source for seeding. + +#ifndef NRF_CRYPTO_BACKEND_NRF_HW_RNG_MBEDTLS_CTR_DRBG_ENABLED +#define NRF_CRYPTO_BACKEND_NRF_HW_RNG_MBEDTLS_CTR_DRBG_ENABLED 1 +#endif + +// + +// NRF_CRYPTO_BACKEND_NRF_SW_ENABLED - Enable the legacy nRFx sw for crypto. + +// The nRF SW cryptography backend (only used in bootloader context). +//========================================================== +#ifndef NRF_CRYPTO_BACKEND_NRF_SW_ENABLED +#define NRF_CRYPTO_BACKEND_NRF_SW_ENABLED 0 +#endif +// NRF_CRYPTO_BACKEND_NRF_SW_HASH_SHA256_ENABLED - nRF SW hash backend support for SHA-256 + + +// The nRF SW backend provide access to nRF SDK legacy hash implementation of SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_NRF_SW_HASH_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_NRF_SW_HASH_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_NRF_SW_HASH_LITTLE_ENDIAN_DIGEST_ENABLED - nRF SW hash outputs digests in little endian + + +// Makes the nRF SH hash functions output digests in little endian format. Only for use in nRF SDK DFU! + +#ifndef NRF_CRYPTO_BACKEND_NRF_SW_HASH_LITTLE_ENDIAN_DIGEST_ENABLED +#define NRF_CRYPTO_BACKEND_NRF_SW_HASH_LITTLE_ENDIAN_DIGEST_ENABLED 1 +#endif + +// + +// NRF_CRYPTO_BACKEND_OBERON_ENABLED - Enable the Oberon backend + +// The Oberon backend +//========================================================== +#ifndef NRF_CRYPTO_BACKEND_OBERON_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_ENABLED 0 +#endif +// NRF_CRYPTO_BACKEND_OBERON_CHACHA_POLY_ENABLED - Enable the CHACHA-POLY mode using Oberon. + + +#ifndef NRF_CRYPTO_BACKEND_OBERON_CHACHA_POLY_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_CHACHA_POLY_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_OBERON_ECC_SECP256R1_ENABLED - Enable secp256r1 curve + + +// Enable this setting if you need secp256r1 curve support using Oberon library + +#ifndef NRF_CRYPTO_BACKEND_OBERON_ECC_SECP256R1_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_ECC_SECP256R1_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_OBERON_ECC_CURVE25519_ENABLED - Enable Curve25519 ECDH + + +// Enable this setting if you need Curve25519 ECDH support using Oberon library + +#ifndef NRF_CRYPTO_BACKEND_OBERON_ECC_CURVE25519_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_ECC_CURVE25519_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_OBERON_ECC_ED25519_ENABLED - Enable Ed25519 signature scheme + + +// Enable this setting if you need Ed25519 support using Oberon library + +#ifndef NRF_CRYPTO_BACKEND_OBERON_ECC_ED25519_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_ECC_ED25519_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_OBERON_HASH_SHA256_ENABLED - Oberon SHA-256 hash functionality + + +// Oberon backend implementation for SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_OBERON_HASH_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_HASH_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_OBERON_HASH_SHA512_ENABLED - Oberon SHA-512 hash functionality + + +// Oberon backend implementation for SHA-512. + +#ifndef NRF_CRYPTO_BACKEND_OBERON_HASH_SHA512_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_HASH_SHA512_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA256_ENABLED - Oberon HMAC using SHA-256 + + +// Oberon backend implementation for HMAC using SHA-256. + +#ifndef NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA256_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA256_ENABLED 1 +#endif + +// NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA512_ENABLED - Oberon HMAC using SHA-512 + + +// Oberon backend implementation for HMAC using SHA-512. + +#ifndef NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA512_ENABLED +#define NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA512_ENABLED 1 #endif // // -// +// //========================================================== -// nRF_DFU +// nRF_DFU //========================================================== // ble_dfu - Device Firmware Update //========================================================== // BLE_DFU_ENABLED - Enable DFU Service. - + #ifndef BLE_DFU_ENABLED #define BLE_DFU_ENABLED 0 #endif // NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS - Buttonless DFU supports bonds. - + #ifndef NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS #define NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS 0 #endif -// +// //========================================================== -// +// //========================================================== -// nRF_Drivers +// nRF_Drivers //========================================================== -// APP_USBD_ENABLED - app_usbd - USB Device library -//========================================================== -#ifndef APP_USBD_ENABLED -#define APP_USBD_ENABLED 0 -#endif -// APP_USBD_VID - Vendor ID <0x0000-0xFFFF> - - -// Vendor ID ordered from USB IF: http://www.usb.org/developers/vendor/ - -#ifndef APP_USBD_VID -#define APP_USBD_VID 0 -#endif - -// APP_USBD_PID - Product ID <0x0000-0xFFFF> - - -// Selected Product ID - -#ifndef APP_USBD_PID -#define APP_USBD_PID 0 -#endif - -// APP_USBD_DEVICE_VER_MAJOR - Device version, major part <0-99> - - -// Device version, will be converted automatically to BCD notation. Use just decimal values. - -#ifndef APP_USBD_DEVICE_VER_MAJOR -#define APP_USBD_DEVICE_VER_MAJOR 1 -#endif - -// APP_USBD_DEVICE_VER_MINOR - Device version, minor part <0-99> - - -// Device version, will be converted automatically to BCD notation. Use just decimal values. - -#ifndef APP_USBD_DEVICE_VER_MINOR -#define APP_USBD_DEVICE_VER_MINOR 0 -#endif - -// APP_USBD_EVENT_QUEUE_ENABLE - Enable event queue - -// This is the default configuration when all the events are placed into internal queue. -// Disable it when external queue is used like app_scheduler or if you wish to process all events inside interrupts. -// Processing all events from the interrupt level adds requirement not to call any functions that modifies the USBD library state from the context higher than USB interrupt context. -// Functions that modify USBD state are functions for sleep, wakeup, start, stop, enable and disable. -//========================================================== -#ifndef APP_USBD_EVENT_QUEUE_ENABLE -#define APP_USBD_EVENT_QUEUE_ENABLE 1 -#endif -// APP_USBD_EVENT_QUEUE_SIZE - The size of event queue <16-64> - - -// The size of the queue for the events that would be processed in the main loop. - -#ifndef APP_USBD_EVENT_QUEUE_SIZE -#define APP_USBD_EVENT_QUEUE_SIZE 32 -#endif - -// - -// APP_USBD_CONFIG_LOG_ENABLED - Enable logging in the module -//========================================================== -#ifndef APP_USBD_CONFIG_LOG_ENABLED -#define APP_USBD_CONFIG_LOG_ENABLED 0 -#endif -// APP_USBD_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef APP_USBD_CONFIG_LOG_LEVEL -#define APP_USBD_CONFIG_LOG_LEVEL 3 -#endif - -// APP_USBD_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef APP_USBD_CONFIG_INFO_COLOR -#define APP_USBD_CONFIG_INFO_COLOR 0 -#endif - -// APP_USBD_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef APP_USBD_CONFIG_DEBUG_COLOR -#define APP_USBD_CONFIG_DEBUG_COLOR 0 -#endif - -// - -// - -// CLOCK_ENABLED - nrf_drv_clock - CLOCK peripheral driver +// CLOCK_ENABLED - nrf_drv_clock - CLOCK peripheral driver - legacy layer //========================================================== #ifndef CLOCK_ENABLED #define CLOCK_ENABLED 0 #endif -// CLOCK_CONFIG_XTAL_FREQ - HF XTAL Frequency - -// <0=> Default (64 MHz) - -#ifndef CLOCK_CONFIG_XTAL_FREQ -#define CLOCK_CONFIG_XTAL_FREQ 0 -#endif - // CLOCK_CONFIG_LF_SRC - LF Clock Source - -// <0=> RC -// <1=> XTAL -// <2=> Synth + +// <0=> RC +// <1=> XTAL +// <2=> Synth #ifndef CLOCK_CONFIG_LF_SRC #define CLOCK_CONFIG_LF_SRC 1 #endif // CLOCK_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef CLOCK_CONFIG_IRQ_PRIORITY #define CLOCK_CONFIG_IRQ_PRIORITY 7 @@ -1701,89 +1234,89 @@ // -// COMP_ENABLED - nrf_drv_comp - COMP peripheral driver +// COMP_ENABLED - nrf_drv_comp - COMP peripheral driver - legacy layer //========================================================== #ifndef COMP_ENABLED #define COMP_ENABLED 0 #endif // COMP_CONFIG_REF - Reference voltage - -// <0=> Internal 1.2V -// <1=> Internal 1.8V -// <2=> Internal 2.4V -// <4=> VDD -// <7=> ARef + +// <0=> Internal 1.2V +// <1=> Internal 1.8V +// <2=> Internal 2.4V +// <4=> VDD +// <7=> ARef #ifndef COMP_CONFIG_REF #define COMP_CONFIG_REF 1 #endif // COMP_CONFIG_MAIN_MODE - Main mode - -// <0=> Single ended -// <1=> Differential + +// <0=> Single ended +// <1=> Differential #ifndef COMP_CONFIG_MAIN_MODE #define COMP_CONFIG_MAIN_MODE 0 #endif // COMP_CONFIG_SPEED_MODE - Speed mode - -// <0=> Low power -// <1=> Normal -// <2=> High speed + +// <0=> Low power +// <1=> Normal +// <2=> High speed #ifndef COMP_CONFIG_SPEED_MODE #define COMP_CONFIG_SPEED_MODE 2 #endif // COMP_CONFIG_HYST - Hystheresis - -// <0=> No -// <1=> 50mV + +// <0=> No +// <1=> 50mV #ifndef COMP_CONFIG_HYST #define COMP_CONFIG_HYST 0 #endif // COMP_CONFIG_ISOURCE - Current Source - -// <0=> Off -// <1=> 2.5 uA -// <2=> 5 uA -// <3=> 10 uA + +// <0=> Off +// <1=> 2.5 uA +// <2=> 5 uA +// <3=> 10 uA #ifndef COMP_CONFIG_ISOURCE #define COMP_CONFIG_ISOURCE 0 #endif // COMP_CONFIG_INPUT - Analog input - -// <0=> 0 -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 + +// <0=> 0 +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef COMP_CONFIG_INPUT #define COMP_CONFIG_INPUT 0 #endif // COMP_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef COMP_CONFIG_IRQ_PRIORITY #define COMP_CONFIG_IRQ_PRIORITY 7 @@ -1791,35 +1324,35 @@ // -// EGU_ENABLED - nrf_drv_swi - SWI(EGU) peripheral driver - +// EGU_ENABLED - nrf_drv_swi - SWI(EGU) peripheral driver - legacy layer + #ifndef EGU_ENABLED -#define EGU_ENABLED 1 +#define EGU_ENABLED 0 #endif -// GPIOTE_ENABLED - nrf_drv_gpiote - GPIOTE peripheral driver +// GPIOTE_ENABLED - nrf_drv_gpiote - GPIOTE peripheral driver - legacy layer //========================================================== #ifndef GPIOTE_ENABLED #define GPIOTE_ENABLED 1 #endif -// GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS - Number of lower power input pins +// GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS - Number of lower power input pins #ifndef GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS -#define GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 4 +#define GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 1 #endif // GPIOTE_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef GPIOTE_CONFIG_IRQ_PRIORITY #define GPIOTE_CONFIG_IRQ_PRIORITY 7 @@ -1827,38 +1360,38 @@ // -// I2S_ENABLED - nrf_drv_i2s - I2S peripheral driver +// I2S_ENABLED - nrf_drv_i2s - I2S peripheral driver - legacy layer //========================================================== #ifndef I2S_ENABLED #define I2S_ENABLED 0 #endif -// I2S_CONFIG_SCK_PIN - SCK pin <0-31> +// I2S_CONFIG_SCK_PIN - SCK pin <0-31> #ifndef I2S_CONFIG_SCK_PIN #define I2S_CONFIG_SCK_PIN 31 #endif -// I2S_CONFIG_LRCK_PIN - LRCK pin <1-31> +// I2S_CONFIG_LRCK_PIN - LRCK pin <1-31> #ifndef I2S_CONFIG_LRCK_PIN #define I2S_CONFIG_LRCK_PIN 30 #endif -// I2S_CONFIG_MCK_PIN - MCK pin +// I2S_CONFIG_MCK_PIN - MCK pin #ifndef I2S_CONFIG_MCK_PIN #define I2S_CONFIG_MCK_PIN 255 #endif -// I2S_CONFIG_SDOUT_PIN - SDOUT pin <0-31> +// I2S_CONFIG_SDOUT_PIN - SDOUT pin <0-31> #ifndef I2S_CONFIG_SDOUT_PIN #define I2S_CONFIG_SDOUT_PIN 29 #endif -// I2S_CONFIG_SDIN_PIN - SDIN pin <0-31> +// I2S_CONFIG_SDIN_PIN - SDIN pin <0-31> #ifndef I2S_CONFIG_SDIN_PIN @@ -1866,186 +1399,237 @@ #endif // I2S_CONFIG_MASTER - Mode - -// <0=> Master -// <1=> Slave + +// <0=> Master +// <1=> Slave #ifndef I2S_CONFIG_MASTER #define I2S_CONFIG_MASTER 0 #endif // I2S_CONFIG_FORMAT - Format - -// <0=> I2S -// <1=> Aligned + +// <0=> I2S +// <1=> Aligned #ifndef I2S_CONFIG_FORMAT #define I2S_CONFIG_FORMAT 0 #endif // I2S_CONFIG_ALIGN - Alignment - -// <0=> Left -// <1=> Right + +// <0=> Left +// <1=> Right #ifndef I2S_CONFIG_ALIGN #define I2S_CONFIG_ALIGN 0 #endif // I2S_CONFIG_SWIDTH - Sample width (bits) - -// <0=> 8 -// <1=> 16 -// <2=> 24 + +// <0=> 8 +// <1=> 16 +// <2=> 24 #ifndef I2S_CONFIG_SWIDTH #define I2S_CONFIG_SWIDTH 1 #endif // I2S_CONFIG_CHANNELS - Channels - -// <0=> Stereo -// <1=> Left -// <2=> Right + +// <0=> Stereo +// <1=> Left +// <2=> Right #ifndef I2S_CONFIG_CHANNELS #define I2S_CONFIG_CHANNELS 1 #endif // I2S_CONFIG_MCK_SETUP - MCK behavior - -// <0=> Disabled -// <2147483648=> 32MHz/2 -// <1342177280=> 32MHz/3 -// <1073741824=> 32MHz/4 -// <805306368=> 32MHz/5 -// <671088640=> 32MHz/6 -// <536870912=> 32MHz/8 -// <402653184=> 32MHz/10 -// <369098752=> 32MHz/11 -// <285212672=> 32MHz/15 -// <268435456=> 32MHz/16 -// <201326592=> 32MHz/21 -// <184549376=> 32MHz/23 -// <142606336=> 32MHz/30 -// <138412032=> 32MHz/31 -// <134217728=> 32MHz/32 -// <100663296=> 32MHz/42 -// <68157440=> 32MHz/63 -// <34340864=> 32MHz/125 + +// <0=> Disabled +// <2147483648=> 32MHz/2 +// <1342177280=> 32MHz/3 +// <1073741824=> 32MHz/4 +// <805306368=> 32MHz/5 +// <671088640=> 32MHz/6 +// <536870912=> 32MHz/8 +// <402653184=> 32MHz/10 +// <369098752=> 32MHz/11 +// <285212672=> 32MHz/15 +// <268435456=> 32MHz/16 +// <201326592=> 32MHz/21 +// <184549376=> 32MHz/23 +// <142606336=> 32MHz/30 +// <138412032=> 32MHz/31 +// <134217728=> 32MHz/32 +// <100663296=> 32MHz/42 +// <68157440=> 32MHz/63 +// <34340864=> 32MHz/125 #ifndef I2S_CONFIG_MCK_SETUP #define I2S_CONFIG_MCK_SETUP 536870912 #endif // I2S_CONFIG_RATIO - MCK/LRCK ratio - -// <0=> 32x -// <1=> 48x -// <2=> 64x -// <3=> 96x -// <4=> 128x -// <5=> 192x -// <6=> 256x -// <7=> 384x -// <8=> 512x + +// <0=> 32x +// <1=> 48x +// <2=> 64x +// <3=> 96x +// <4=> 128x +// <5=> 192x +// <6=> 256x +// <7=> 384x +// <8=> 512x #ifndef I2S_CONFIG_RATIO #define I2S_CONFIG_RATIO 2000 #endif // I2S_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef I2S_CONFIG_IRQ_PRIORITY #define I2S_CONFIG_IRQ_PRIORITY 7 #endif +// I2S_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef I2S_CONFIG_LOG_ENABLED +#define I2S_CONFIG_LOG_ENABLED 0 +#endif +// I2S_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef I2S_CONFIG_LOG_LEVEL +#define I2S_CONFIG_LOG_LEVEL 3 +#endif + +// I2S_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef I2S_CONFIG_INFO_COLOR +#define I2S_CONFIG_INFO_COLOR 0 +#endif + +// I2S_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef I2S_CONFIG_DEBUG_COLOR +#define I2S_CONFIG_DEBUG_COLOR 0 +#endif + // -// LPCOMP_ENABLED - nrf_drv_lpcomp - LPCOMP peripheral driver +// + +// LPCOMP_ENABLED - nrf_drv_lpcomp - LPCOMP peripheral driver - legacy layer //========================================================== #ifndef LPCOMP_ENABLED #define LPCOMP_ENABLED 0 #endif // LPCOMP_CONFIG_REFERENCE - Reference voltage - -// <0=> Supply 1/8 -// <1=> Supply 2/8 -// <2=> Supply 3/8 -// <3=> Supply 4/8 -// <4=> Supply 5/8 -// <5=> Supply 6/8 -// <6=> Supply 7/8 -// <8=> Supply 1/16 (nRF52) -// <9=> Supply 3/16 (nRF52) -// <10=> Supply 5/16 (nRF52) -// <11=> Supply 7/16 (nRF52) -// <12=> Supply 9/16 (nRF52) -// <13=> Supply 11/16 (nRF52) -// <14=> Supply 13/16 (nRF52) -// <15=> Supply 15/16 (nRF52) -// <7=> External Ref 0 -// <65543=> External Ref 1 + +// <0=> Supply 1/8 +// <1=> Supply 2/8 +// <2=> Supply 3/8 +// <3=> Supply 4/8 +// <4=> Supply 5/8 +// <5=> Supply 6/8 +// <6=> Supply 7/8 +// <8=> Supply 1/16 (nRF52) +// <9=> Supply 3/16 (nRF52) +// <10=> Supply 5/16 (nRF52) +// <11=> Supply 7/16 (nRF52) +// <12=> Supply 9/16 (nRF52) +// <13=> Supply 11/16 (nRF52) +// <14=> Supply 13/16 (nRF52) +// <15=> Supply 15/16 (nRF52) +// <7=> External Ref 0 +// <65543=> External Ref 1 #ifndef LPCOMP_CONFIG_REFERENCE #define LPCOMP_CONFIG_REFERENCE 3 #endif // LPCOMP_CONFIG_DETECTION - Detection - -// <0=> Crossing -// <1=> Up -// <2=> Down + +// <0=> Crossing +// <1=> Up +// <2=> Down #ifndef LPCOMP_CONFIG_DETECTION #define LPCOMP_CONFIG_DETECTION 2 #endif // LPCOMP_CONFIG_INPUT - Analog input - -// <0=> 0 -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 + +// <0=> 0 +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef LPCOMP_CONFIG_INPUT #define LPCOMP_CONFIG_INPUT 0 #endif // LPCOMP_CONFIG_HYST - Hysteresis - + #ifndef LPCOMP_CONFIG_HYST #define LPCOMP_CONFIG_HYST 0 #endif // LPCOMP_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef LPCOMP_CONFIG_IRQ_PRIORITY #define LPCOMP_CONFIG_IRQ_PRIORITY 7 @@ -2053,43 +1637,2208 @@ // -// PDM_ENABLED - nrf_drv_pdm - PDM peripheral driver +// NRFX_CLOCK_ENABLED - nrfx_clock - CLOCK peripheral driver //========================================================== -#ifndef PDM_ENABLED -#define PDM_ENABLED 0 +#ifndef NRFX_CLOCK_ENABLED +#define NRFX_CLOCK_ENABLED 0 #endif -// PDM_CONFIG_MODE - Mode +// NRFX_CLOCK_CONFIG_LF_SRC - LF Clock Source + +// <0=> RC +// <1=> XTAL +// <2=> Synth -// <0=> Stereo -// <1=> Mono - -#ifndef PDM_CONFIG_MODE -#define PDM_CONFIG_MODE 1 +#ifndef NRFX_CLOCK_CONFIG_LF_SRC +#define NRFX_CLOCK_CONFIG_LF_SRC 1 #endif -// PDM_CONFIG_EDGE - Edge +// NRFX_CLOCK_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 -// <0=> Left falling -// <1=> Left rising - -#ifndef PDM_CONFIG_EDGE -#define PDM_CONFIG_EDGE 0 +#ifndef NRFX_CLOCK_CONFIG_IRQ_PRIORITY +#define NRFX_CLOCK_CONFIG_IRQ_PRIORITY 7 #endif -// PDM_CONFIG_CLOCK_FREQ - Clock frequency +// NRFX_CLOCK_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_CLOCK_CONFIG_LOG_ENABLED +#define NRFX_CLOCK_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_CLOCK_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug -// <134217728=> 1000k -// <138412032=> 1032k (default) -// <142606336=> 1067k - -#ifndef PDM_CONFIG_CLOCK_FREQ -#define PDM_CONFIG_CLOCK_FREQ 138412032 +#ifndef NRFX_CLOCK_CONFIG_LOG_LEVEL +#define NRFX_CLOCK_CONFIG_LOG_LEVEL 3 #endif -// PDM_CONFIG_IRQ_PRIORITY - Interrupt priority +// NRFX_CLOCK_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_CLOCK_CONFIG_INFO_COLOR +#define NRFX_CLOCK_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_CLOCK_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_CLOCK_CONFIG_DEBUG_COLOR +#define NRFX_CLOCK_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_COMP_ENABLED - nrfx_comp - COMP peripheral driver +//========================================================== +#ifndef NRFX_COMP_ENABLED +#define NRFX_COMP_ENABLED 0 +#endif +// NRFX_COMP_CONFIG_REF - Reference voltage + +// <0=> Internal 1.2V +// <1=> Internal 1.8V +// <2=> Internal 2.4V +// <4=> VDD +// <7=> ARef + +#ifndef NRFX_COMP_CONFIG_REF +#define NRFX_COMP_CONFIG_REF 1 +#endif + +// NRFX_COMP_CONFIG_MAIN_MODE - Main mode + +// <0=> Single ended +// <1=> Differential + +#ifndef NRFX_COMP_CONFIG_MAIN_MODE +#define NRFX_COMP_CONFIG_MAIN_MODE 0 +#endif + +// NRFX_COMP_CONFIG_SPEED_MODE - Speed mode + +// <0=> Low power +// <1=> Normal +// <2=> High speed + +#ifndef NRFX_COMP_CONFIG_SPEED_MODE +#define NRFX_COMP_CONFIG_SPEED_MODE 2 +#endif + +// NRFX_COMP_CONFIG_HYST - Hystheresis + +// <0=> No +// <1=> 50mV + +#ifndef NRFX_COMP_CONFIG_HYST +#define NRFX_COMP_CONFIG_HYST 0 +#endif + +// NRFX_COMP_CONFIG_ISOURCE - Current Source + +// <0=> Off +// <1=> 2.5 uA +// <2=> 5 uA +// <3=> 10 uA + +#ifndef NRFX_COMP_CONFIG_ISOURCE +#define NRFX_COMP_CONFIG_ISOURCE 0 +#endif + +// NRFX_COMP_CONFIG_INPUT - Analog input + +// <0=> 0 +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_COMP_CONFIG_INPUT +#define NRFX_COMP_CONFIG_INPUT 0 +#endif + +// NRFX_COMP_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_COMP_CONFIG_IRQ_PRIORITY +#define NRFX_COMP_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_COMP_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_COMP_CONFIG_LOG_ENABLED +#define NRFX_COMP_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_COMP_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_COMP_CONFIG_LOG_LEVEL +#define NRFX_COMP_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_COMP_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_COMP_CONFIG_INFO_COLOR +#define NRFX_COMP_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_COMP_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_COMP_CONFIG_DEBUG_COLOR +#define NRFX_COMP_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_GPIOTE_ENABLED - nrfx_gpiote - GPIOTE peripheral driver +//========================================================== +#ifndef NRFX_GPIOTE_ENABLED +#define NRFX_GPIOTE_ENABLED 1 +#endif +// NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS - Number of lower power input pins +#ifndef NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS +#define NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 1 +#endif + +// NRFX_GPIOTE_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_GPIOTE_CONFIG_IRQ_PRIORITY +#define NRFX_GPIOTE_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_GPIOTE_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_GPIOTE_CONFIG_LOG_ENABLED +#define NRFX_GPIOTE_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_GPIOTE_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_GPIOTE_CONFIG_LOG_LEVEL +#define NRFX_GPIOTE_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_GPIOTE_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_GPIOTE_CONFIG_INFO_COLOR +#define NRFX_GPIOTE_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_GPIOTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_GPIOTE_CONFIG_DEBUG_COLOR +#define NRFX_GPIOTE_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_I2S_ENABLED - nrfx_i2s - I2S peripheral driver +//========================================================== +#ifndef NRFX_I2S_ENABLED +#define NRFX_I2S_ENABLED 0 +#endif +// NRFX_I2S_CONFIG_SCK_PIN - SCK pin <0-31> -// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice +#ifndef NRFX_I2S_CONFIG_SCK_PIN +#define NRFX_I2S_CONFIG_SCK_PIN 31 +#endif + +// NRFX_I2S_CONFIG_LRCK_PIN - LRCK pin <1-31> + + +#ifndef NRFX_I2S_CONFIG_LRCK_PIN +#define NRFX_I2S_CONFIG_LRCK_PIN 30 +#endif + +// NRFX_I2S_CONFIG_MCK_PIN - MCK pin +#ifndef NRFX_I2S_CONFIG_MCK_PIN +#define NRFX_I2S_CONFIG_MCK_PIN 255 +#endif + +// NRFX_I2S_CONFIG_SDOUT_PIN - SDOUT pin <0-31> + + +#ifndef NRFX_I2S_CONFIG_SDOUT_PIN +#define NRFX_I2S_CONFIG_SDOUT_PIN 29 +#endif + +// NRFX_I2S_CONFIG_SDIN_PIN - SDIN pin <0-31> + + +#ifndef NRFX_I2S_CONFIG_SDIN_PIN +#define NRFX_I2S_CONFIG_SDIN_PIN 28 +#endif + +// NRFX_I2S_CONFIG_MASTER - Mode + +// <0=> Master +// <1=> Slave + +#ifndef NRFX_I2S_CONFIG_MASTER +#define NRFX_I2S_CONFIG_MASTER 0 +#endif + +// NRFX_I2S_CONFIG_FORMAT - Format + +// <0=> I2S +// <1=> Aligned + +#ifndef NRFX_I2S_CONFIG_FORMAT +#define NRFX_I2S_CONFIG_FORMAT 0 +#endif + +// NRFX_I2S_CONFIG_ALIGN - Alignment + +// <0=> Left +// <1=> Right + +#ifndef NRFX_I2S_CONFIG_ALIGN +#define NRFX_I2S_CONFIG_ALIGN 0 +#endif + +// NRFX_I2S_CONFIG_SWIDTH - Sample width (bits) + +// <0=> 8 +// <1=> 16 +// <2=> 24 + +#ifndef NRFX_I2S_CONFIG_SWIDTH +#define NRFX_I2S_CONFIG_SWIDTH 1 +#endif + +// NRFX_I2S_CONFIG_CHANNELS - Channels + +// <0=> Stereo +// <1=> Left +// <2=> Right + +#ifndef NRFX_I2S_CONFIG_CHANNELS +#define NRFX_I2S_CONFIG_CHANNELS 1 +#endif + +// NRFX_I2S_CONFIG_MCK_SETUP - MCK behavior + +// <0=> Disabled +// <2147483648=> 32MHz/2 +// <1342177280=> 32MHz/3 +// <1073741824=> 32MHz/4 +// <805306368=> 32MHz/5 +// <671088640=> 32MHz/6 +// <536870912=> 32MHz/8 +// <402653184=> 32MHz/10 +// <369098752=> 32MHz/11 +// <285212672=> 32MHz/15 +// <268435456=> 32MHz/16 +// <201326592=> 32MHz/21 +// <184549376=> 32MHz/23 +// <142606336=> 32MHz/30 +// <138412032=> 32MHz/31 +// <134217728=> 32MHz/32 +// <100663296=> 32MHz/42 +// <68157440=> 32MHz/63 +// <34340864=> 32MHz/125 + +#ifndef NRFX_I2S_CONFIG_MCK_SETUP +#define NRFX_I2S_CONFIG_MCK_SETUP 536870912 +#endif + +// NRFX_I2S_CONFIG_RATIO - MCK/LRCK ratio + +// <0=> 32x +// <1=> 48x +// <2=> 64x +// <3=> 96x +// <4=> 128x +// <5=> 192x +// <6=> 256x +// <7=> 384x +// <8=> 512x + +#ifndef NRFX_I2S_CONFIG_RATIO +#define NRFX_I2S_CONFIG_RATIO 2000 +#endif + +// NRFX_I2S_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_I2S_CONFIG_IRQ_PRIORITY +#define NRFX_I2S_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_I2S_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_I2S_CONFIG_LOG_ENABLED +#define NRFX_I2S_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_I2S_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_I2S_CONFIG_LOG_LEVEL +#define NRFX_I2S_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_I2S_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_I2S_CONFIG_INFO_COLOR +#define NRFX_I2S_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_I2S_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_I2S_CONFIG_DEBUG_COLOR +#define NRFX_I2S_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_LPCOMP_ENABLED - nrfx_lpcomp - LPCOMP peripheral driver +//========================================================== +#ifndef NRFX_LPCOMP_ENABLED +#define NRFX_LPCOMP_ENABLED 0 +#endif +// NRFX_LPCOMP_CONFIG_REFERENCE - Reference voltage + +// <0=> Supply 1/8 +// <1=> Supply 2/8 +// <2=> Supply 3/8 +// <3=> Supply 4/8 +// <4=> Supply 5/8 +// <5=> Supply 6/8 +// <6=> Supply 7/8 +// <8=> Supply 1/16 (nRF52) +// <9=> Supply 3/16 (nRF52) +// <10=> Supply 5/16 (nRF52) +// <11=> Supply 7/16 (nRF52) +// <12=> Supply 9/16 (nRF52) +// <13=> Supply 11/16 (nRF52) +// <14=> Supply 13/16 (nRF52) +// <15=> Supply 15/16 (nRF52) +// <7=> External Ref 0 +// <65543=> External Ref 1 + +#ifndef NRFX_LPCOMP_CONFIG_REFERENCE +#define NRFX_LPCOMP_CONFIG_REFERENCE 3 +#endif + +// NRFX_LPCOMP_CONFIG_DETECTION - Detection + +// <0=> Crossing +// <1=> Up +// <2=> Down + +#ifndef NRFX_LPCOMP_CONFIG_DETECTION +#define NRFX_LPCOMP_CONFIG_DETECTION 2 +#endif + +// NRFX_LPCOMP_CONFIG_INPUT - Analog input + +// <0=> 0 +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_LPCOMP_CONFIG_INPUT +#define NRFX_LPCOMP_CONFIG_INPUT 0 +#endif + +// NRFX_LPCOMP_CONFIG_HYST - Hysteresis + + +#ifndef NRFX_LPCOMP_CONFIG_HYST +#define NRFX_LPCOMP_CONFIG_HYST 0 +#endif + +// NRFX_LPCOMP_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_LPCOMP_CONFIG_IRQ_PRIORITY +#define NRFX_LPCOMP_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_LPCOMP_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_LPCOMP_CONFIG_LOG_ENABLED +#define NRFX_LPCOMP_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_LPCOMP_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_LPCOMP_CONFIG_LOG_LEVEL +#define NRFX_LPCOMP_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_LPCOMP_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_LPCOMP_CONFIG_INFO_COLOR +#define NRFX_LPCOMP_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_LPCOMP_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_LPCOMP_CONFIG_DEBUG_COLOR +#define NRFX_LPCOMP_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_PDM_ENABLED - nrfx_pdm - PDM peripheral driver +//========================================================== +#ifndef NRFX_PDM_ENABLED +#define NRFX_PDM_ENABLED 0 +#endif +// NRFX_PDM_CONFIG_MODE - Mode + +// <0=> Stereo +// <1=> Mono + +#ifndef NRFX_PDM_CONFIG_MODE +#define NRFX_PDM_CONFIG_MODE 1 +#endif + +// NRFX_PDM_CONFIG_EDGE - Edge + +// <0=> Left falling +// <1=> Left rising + +#ifndef NRFX_PDM_CONFIG_EDGE +#define NRFX_PDM_CONFIG_EDGE 0 +#endif + +// NRFX_PDM_CONFIG_CLOCK_FREQ - Clock frequency + +// <134217728=> 1000k +// <138412032=> 1032k (default) +// <142606336=> 1067k + +#ifndef NRFX_PDM_CONFIG_CLOCK_FREQ +#define NRFX_PDM_CONFIG_CLOCK_FREQ 138412032 +#endif + +// NRFX_PDM_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_PDM_CONFIG_IRQ_PRIORITY +#define NRFX_PDM_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_PDM_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_PDM_CONFIG_LOG_ENABLED +#define NRFX_PDM_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_PDM_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_PDM_CONFIG_LOG_LEVEL +#define NRFX_PDM_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_PDM_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_PDM_CONFIG_INFO_COLOR +#define NRFX_PDM_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_PDM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_PDM_CONFIG_DEBUG_COLOR +#define NRFX_PDM_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_POWER_ENABLED - nrfx_power - POWER peripheral driver +//========================================================== +#ifndef NRFX_POWER_ENABLED +#define NRFX_POWER_ENABLED 0 +#endif +// NRFX_POWER_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_POWER_CONFIG_IRQ_PRIORITY +#define NRFX_POWER_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_POWER_CONFIG_DEFAULT_DCDCEN - The default configuration of main DCDC regulator + + +// This settings means only that components for DCDC regulator are installed and it can be enabled. + +#ifndef NRFX_POWER_CONFIG_DEFAULT_DCDCEN +#define NRFX_POWER_CONFIG_DEFAULT_DCDCEN 0 +#endif + +// NRFX_POWER_CONFIG_DEFAULT_DCDCENHV - The default configuration of High Voltage DCDC regulator + + +// This settings means only that components for DCDC regulator are installed and it can be enabled. + +#ifndef NRFX_POWER_CONFIG_DEFAULT_DCDCENHV +#define NRFX_POWER_CONFIG_DEFAULT_DCDCENHV 0 +#endif + +// + +// NRFX_PPI_ENABLED - nrfx_ppi - PPI peripheral allocator +//========================================================== +#ifndef NRFX_PPI_ENABLED +#define NRFX_PPI_ENABLED 1 +#endif +// NRFX_PPI_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_PPI_CONFIG_LOG_ENABLED +#define NRFX_PPI_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_PPI_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_PPI_CONFIG_LOG_LEVEL +#define NRFX_PPI_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_PPI_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_PPI_CONFIG_INFO_COLOR +#define NRFX_PPI_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_PPI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_PPI_CONFIG_DEBUG_COLOR +#define NRFX_PPI_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_PWM_ENABLED - nrfx_pwm - PWM peripheral driver +//========================================================== +#ifndef NRFX_PWM_ENABLED +#define NRFX_PWM_ENABLED 1 +#endif +// NRFX_PWM0_ENABLED - Enable PWM0 instance + + +#ifndef NRFX_PWM0_ENABLED +#define NRFX_PWM0_ENABLED 1 +#endif + +// NRFX_PWM1_ENABLED - Enable PWM1 instance + + +#ifndef NRFX_PWM1_ENABLED +#define NRFX_PWM1_ENABLED 1 +#endif + +// NRFX_PWM2_ENABLED - Enable PWM2 instance + + +#ifndef NRFX_PWM2_ENABLED +#define NRFX_PWM2_ENABLED 1 +#endif + +// NRFX_PWM3_ENABLED - Enable PWM3 instance + + +#ifndef NRFX_PWM3_ENABLED +#define NRFX_PWM3_ENABLED 1 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_OUT0_PIN - Out0 pin <0-31> + + +#ifndef NRFX_PWM_DEFAULT_CONFIG_OUT0_PIN +#define NRFX_PWM_DEFAULT_CONFIG_OUT0_PIN 31 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_OUT1_PIN - Out1 pin <0-31> + + +#ifndef NRFX_PWM_DEFAULT_CONFIG_OUT1_PIN +#define NRFX_PWM_DEFAULT_CONFIG_OUT1_PIN 31 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_OUT2_PIN - Out2 pin <0-31> + + +#ifndef NRFX_PWM_DEFAULT_CONFIG_OUT2_PIN +#define NRFX_PWM_DEFAULT_CONFIG_OUT2_PIN 31 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_OUT3_PIN - Out3 pin <0-31> + + +#ifndef NRFX_PWM_DEFAULT_CONFIG_OUT3_PIN +#define NRFX_PWM_DEFAULT_CONFIG_OUT3_PIN 31 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_BASE_CLOCK - Base clock + +// <0=> 16 MHz +// <1=> 8 MHz +// <2=> 4 MHz +// <3=> 2 MHz +// <4=> 1 MHz +// <5=> 500 kHz +// <6=> 250 kHz +// <7=> 125 kHz + +#ifndef NRFX_PWM_DEFAULT_CONFIG_BASE_CLOCK +#define NRFX_PWM_DEFAULT_CONFIG_BASE_CLOCK 4 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_COUNT_MODE - Count mode + +// <0=> Up +// <1=> Up and Down + +#ifndef NRFX_PWM_DEFAULT_CONFIG_COUNT_MODE +#define NRFX_PWM_DEFAULT_CONFIG_COUNT_MODE 0 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_TOP_VALUE - Top value +#ifndef NRFX_PWM_DEFAULT_CONFIG_TOP_VALUE +#define NRFX_PWM_DEFAULT_CONFIG_TOP_VALUE 1000 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_LOAD_MODE - Load mode + +// <0=> Common +// <1=> Grouped +// <2=> Individual +// <3=> Waveform + +#ifndef NRFX_PWM_DEFAULT_CONFIG_LOAD_MODE +#define NRFX_PWM_DEFAULT_CONFIG_LOAD_MODE 0 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_STEP_MODE - Step mode + +// <0=> Auto +// <1=> Triggered + +#ifndef NRFX_PWM_DEFAULT_CONFIG_STEP_MODE +#define NRFX_PWM_DEFAULT_CONFIG_STEP_MODE 0 +#endif + +// NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_PWM_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_PWM_CONFIG_LOG_ENABLED +#define NRFX_PWM_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_PWM_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_PWM_CONFIG_LOG_LEVEL +#define NRFX_PWM_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_PWM_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_PWM_CONFIG_INFO_COLOR +#define NRFX_PWM_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_PWM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_PWM_CONFIG_DEBUG_COLOR +#define NRFX_PWM_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_QDEC_ENABLED - nrfx_qdec - QDEC peripheral driver +//========================================================== +#ifndef NRFX_QDEC_ENABLED +#define NRFX_QDEC_ENABLED 0 +#endif +// NRFX_QDEC_CONFIG_REPORTPER - Report period + +// <0=> 10 Samples +// <1=> 40 Samples +// <2=> 80 Samples +// <3=> 120 Samples +// <4=> 160 Samples +// <5=> 200 Samples +// <6=> 240 Samples +// <7=> 280 Samples + +#ifndef NRFX_QDEC_CONFIG_REPORTPER +#define NRFX_QDEC_CONFIG_REPORTPER 0 +#endif + +// NRFX_QDEC_CONFIG_SAMPLEPER - Sample period + +// <0=> 128 us +// <1=> 256 us +// <2=> 512 us +// <3=> 1024 us +// <4=> 2048 us +// <5=> 4096 us +// <6=> 8192 us +// <7=> 16384 us + +#ifndef NRFX_QDEC_CONFIG_SAMPLEPER +#define NRFX_QDEC_CONFIG_SAMPLEPER 7 +#endif + +// NRFX_QDEC_CONFIG_PIO_A - A pin <0-31> + + +#ifndef NRFX_QDEC_CONFIG_PIO_A +#define NRFX_QDEC_CONFIG_PIO_A 31 +#endif + +// NRFX_QDEC_CONFIG_PIO_B - B pin <0-31> + + +#ifndef NRFX_QDEC_CONFIG_PIO_B +#define NRFX_QDEC_CONFIG_PIO_B 31 +#endif + +// NRFX_QDEC_CONFIG_PIO_LED - LED pin <0-31> + + +#ifndef NRFX_QDEC_CONFIG_PIO_LED +#define NRFX_QDEC_CONFIG_PIO_LED 31 +#endif + +// NRFX_QDEC_CONFIG_LEDPRE - LED pre +#ifndef NRFX_QDEC_CONFIG_LEDPRE +#define NRFX_QDEC_CONFIG_LEDPRE 511 +#endif + +// NRFX_QDEC_CONFIG_LEDPOL - LED polarity + +// <0=> Active low +// <1=> Active high + +#ifndef NRFX_QDEC_CONFIG_LEDPOL +#define NRFX_QDEC_CONFIG_LEDPOL 1 +#endif + +// NRFX_QDEC_CONFIG_DBFEN - Debouncing enable + + +#ifndef NRFX_QDEC_CONFIG_DBFEN +#define NRFX_QDEC_CONFIG_DBFEN 0 +#endif + +// NRFX_QDEC_CONFIG_SAMPLE_INTEN - Sample ready interrupt enable + + +#ifndef NRFX_QDEC_CONFIG_SAMPLE_INTEN +#define NRFX_QDEC_CONFIG_SAMPLE_INTEN 0 +#endif + +// NRFX_QDEC_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_QDEC_CONFIG_IRQ_PRIORITY +#define NRFX_QDEC_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_QDEC_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_QDEC_CONFIG_LOG_ENABLED +#define NRFX_QDEC_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_QDEC_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_QDEC_CONFIG_LOG_LEVEL +#define NRFX_QDEC_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_QDEC_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_QDEC_CONFIG_INFO_COLOR +#define NRFX_QDEC_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_QDEC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_QDEC_CONFIG_DEBUG_COLOR +#define NRFX_QDEC_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_QSPI_ENABLED - nrfx_qspi - QSPI peripheral driver +//========================================================== +#ifndef NRFX_QSPI_ENABLED +#define NRFX_QSPI_ENABLED 1 +#endif +// NRFX_QSPI_CONFIG_SCK_DELAY - tSHSL, tWHSL and tSHWL in number of 16 MHz periods (62.5 ns). <0-255> + + +#ifndef NRFX_QSPI_CONFIG_SCK_DELAY +#define NRFX_QSPI_CONFIG_SCK_DELAY 1 +#endif + +// NRFX_QSPI_CONFIG_XIP_OFFSET - Address offset in the external memory for Execute in Place operation. +#ifndef NRFX_QSPI_CONFIG_XIP_OFFSET +#define NRFX_QSPI_CONFIG_XIP_OFFSET 0 +#endif + +// NRFX_QSPI_CONFIG_READOC - Number of data lines and opcode used for reading. + +// <0=> FastRead +// <1=> Read2O +// <2=> Read2IO +// <3=> Read4O +// <4=> Read4IO + +#ifndef NRFX_QSPI_CONFIG_READOC +#define NRFX_QSPI_CONFIG_READOC 0 +#endif + +// NRFX_QSPI_CONFIG_WRITEOC - Number of data lines and opcode used for writing. + +// <0=> PP +// <1=> PP2O +// <2=> PP4O +// <3=> PP4IO + +#ifndef NRFX_QSPI_CONFIG_WRITEOC +#define NRFX_QSPI_CONFIG_WRITEOC 0 +#endif + +// NRFX_QSPI_CONFIG_ADDRMODE - Addressing mode. + +// <0=> 24bit +// <1=> 32bit + +#ifndef NRFX_QSPI_CONFIG_ADDRMODE +#define NRFX_QSPI_CONFIG_ADDRMODE 0 +#endif + +// NRFX_QSPI_CONFIG_MODE - SPI mode. + +// <0=> Mode 0 +// <1=> Mode 1 + +#ifndef NRFX_QSPI_CONFIG_MODE +#define NRFX_QSPI_CONFIG_MODE 0 +#endif + +// NRFX_QSPI_CONFIG_FREQUENCY - Frequency divider. + +// <0=> 32MHz/1 +// <1=> 32MHz/2 +// <2=> 32MHz/3 +// <3=> 32MHz/4 +// <4=> 32MHz/5 +// <5=> 32MHz/6 +// <6=> 32MHz/7 +// <7=> 32MHz/8 +// <8=> 32MHz/9 +// <9=> 32MHz/10 +// <10=> 32MHz/11 +// <11=> 32MHz/12 +// <12=> 32MHz/13 +// <13=> 32MHz/14 +// <14=> 32MHz/15 +// <15=> 32MHz/16 + +#ifndef NRFX_QSPI_CONFIG_FREQUENCY +#define NRFX_QSPI_CONFIG_FREQUENCY 15 +#endif + +// NRFX_QSPI_PIN_SCK - SCK pin value. +#ifndef NRFX_QSPI_PIN_SCK +#define NRFX_QSPI_PIN_SCK NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// NRFX_QSPI_PIN_CSN - CSN pin value. +#ifndef NRFX_QSPI_PIN_CSN +#define NRFX_QSPI_PIN_CSN NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// NRFX_QSPI_PIN_IO0 - IO0 pin value. +#ifndef NRFX_QSPI_PIN_IO0 +#define NRFX_QSPI_PIN_IO0 NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// NRFX_QSPI_PIN_IO1 - IO1 pin value. +#ifndef NRFX_QSPI_PIN_IO1 +#define NRFX_QSPI_PIN_IO1 NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// NRFX_QSPI_PIN_IO2 - IO2 pin value. +#ifndef NRFX_QSPI_PIN_IO2 +#define NRFX_QSPI_PIN_IO2 NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// NRFX_QSPI_PIN_IO3 - IO3 pin value. +#ifndef NRFX_QSPI_PIN_IO3 +#define NRFX_QSPI_PIN_IO3 NRF_QSPI_PIN_NOT_CONNECTED +#endif + +// NRFX_QSPI_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_QSPI_CONFIG_IRQ_PRIORITY +#define NRFX_QSPI_CONFIG_IRQ_PRIORITY 7 +#endif + +// + +// NRFX_RNG_ENABLED - nrfx_rng - RNG peripheral driver +//========================================================== +#ifndef NRFX_RNG_ENABLED +#define NRFX_RNG_ENABLED 0 +#endif +// NRFX_RNG_CONFIG_ERROR_CORRECTION - Error correction + + +#ifndef NRFX_RNG_CONFIG_ERROR_CORRECTION +#define NRFX_RNG_CONFIG_ERROR_CORRECTION 1 +#endif + +// NRFX_RNG_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_RNG_CONFIG_IRQ_PRIORITY +#define NRFX_RNG_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_RNG_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_RNG_CONFIG_LOG_ENABLED +#define NRFX_RNG_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_RNG_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_RNG_CONFIG_LOG_LEVEL +#define NRFX_RNG_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_RNG_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_RNG_CONFIG_INFO_COLOR +#define NRFX_RNG_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_RNG_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_RNG_CONFIG_DEBUG_COLOR +#define NRFX_RNG_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_RTC_ENABLED - nrfx_rtc - RTC peripheral driver +//========================================================== +#ifndef NRFX_RTC_ENABLED +#define NRFX_RTC_ENABLED 0 +#endif +// NRFX_RTC0_ENABLED - Enable RTC0 instance + + +#ifndef NRFX_RTC0_ENABLED +#define NRFX_RTC0_ENABLED 0 +#endif + +// NRFX_RTC1_ENABLED - Enable RTC1 instance + + +#ifndef NRFX_RTC1_ENABLED +#define NRFX_RTC1_ENABLED 0 +#endif + +// NRFX_RTC2_ENABLED - Enable RTC2 instance + + +#ifndef NRFX_RTC2_ENABLED +#define NRFX_RTC2_ENABLED 0 +#endif + +// NRFX_RTC_MAXIMUM_LATENCY_US - Maximum possible time[us] in highest priority interrupt +#ifndef NRFX_RTC_MAXIMUM_LATENCY_US +#define NRFX_RTC_MAXIMUM_LATENCY_US 2000 +#endif + +// NRFX_RTC_DEFAULT_CONFIG_FREQUENCY - Frequency <16-32768> + + +#ifndef NRFX_RTC_DEFAULT_CONFIG_FREQUENCY +#define NRFX_RTC_DEFAULT_CONFIG_FREQUENCY 32768 +#endif + +// NRFX_RTC_DEFAULT_CONFIG_RELIABLE - Ensures safe compare event triggering + + +#ifndef NRFX_RTC_DEFAULT_CONFIG_RELIABLE +#define NRFX_RTC_DEFAULT_CONFIG_RELIABLE 0 +#endif + +// NRFX_RTC_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_RTC_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_RTC_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_RTC_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_RTC_CONFIG_LOG_ENABLED +#define NRFX_RTC_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_RTC_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_RTC_CONFIG_LOG_LEVEL +#define NRFX_RTC_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_RTC_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_RTC_CONFIG_INFO_COLOR +#define NRFX_RTC_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_RTC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_RTC_CONFIG_DEBUG_COLOR +#define NRFX_RTC_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_SAADC_ENABLED - nrfx_saadc - SAADC peripheral driver +//========================================================== +#ifndef NRFX_SAADC_ENABLED +#define NRFX_SAADC_ENABLED 1 +#endif +// NRFX_SAADC_CONFIG_RESOLUTION - Resolution + +// <0=> 8 bit +// <1=> 10 bit +// <2=> 12 bit +// <3=> 14 bit + +#ifndef NRFX_SAADC_CONFIG_RESOLUTION +#define NRFX_SAADC_CONFIG_RESOLUTION 1 +#endif + +// NRFX_SAADC_CONFIG_OVERSAMPLE - Sample period + +// <0=> Disabled +// <1=> 2x +// <2=> 4x +// <3=> 8x +// <4=> 16x +// <5=> 32x +// <6=> 64x +// <7=> 128x +// <8=> 256x + +#ifndef NRFX_SAADC_CONFIG_OVERSAMPLE +#define NRFX_SAADC_CONFIG_OVERSAMPLE 0 +#endif + +// NRFX_SAADC_CONFIG_LP_MODE - Enabling low power mode + + +#ifndef NRFX_SAADC_CONFIG_LP_MODE +#define NRFX_SAADC_CONFIG_LP_MODE 0 +#endif + +// NRFX_SAADC_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_SAADC_CONFIG_IRQ_PRIORITY +#define NRFX_SAADC_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_SAADC_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_SAADC_CONFIG_LOG_ENABLED +#define NRFX_SAADC_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_SAADC_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_SAADC_CONFIG_LOG_LEVEL +#define NRFX_SAADC_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_SAADC_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SAADC_CONFIG_INFO_COLOR +#define NRFX_SAADC_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_SAADC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SAADC_CONFIG_DEBUG_COLOR +#define NRFX_SAADC_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_SPIM_ENABLED - nrfx_spim - SPIM peripheral driver +//========================================================== +#ifndef NRFX_SPIM_ENABLED +#define NRFX_SPIM_ENABLED 0 +#endif +// NRFX_SPIM0_ENABLED - Enable SPIM0 instance + + +#ifndef NRFX_SPIM0_ENABLED +#define NRFX_SPIM0_ENABLED 0 +#endif + +// NRFX_SPIM1_ENABLED - Enable SPIM1 instance + + +#ifndef NRFX_SPIM1_ENABLED +#define NRFX_SPIM1_ENABLED 0 +#endif + +// NRFX_SPIM2_ENABLED - Enable SPIM2 instance + + +#ifndef NRFX_SPIM2_ENABLED +#define NRFX_SPIM2_ENABLED 0 +#endif + +// NRFX_SPIM3_ENABLED - Enable SPIM3 instance + + +#ifndef NRFX_SPIM3_ENABLED +#define NRFX_SPIM3_ENABLED 0 +#endif + +// NRFX_SPIM_EXTENDED_ENABLED - Enable extended SPIM features + + +#ifndef NRFX_SPIM_EXTENDED_ENABLED +#define NRFX_SPIM_EXTENDED_ENABLED 0 +#endif + +// NRFX_SPIM_MISO_PULL_CFG - MISO pin pull configuration. + +// <0=> NRF_GPIO_PIN_NOPULL +// <1=> NRF_GPIO_PIN_PULLDOWN +// <3=> NRF_GPIO_PIN_PULLUP + +#ifndef NRFX_SPIM_MISO_PULL_CFG +#define NRFX_SPIM_MISO_PULL_CFG 1 +#endif + +// NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_SPIM_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_SPIM_CONFIG_LOG_ENABLED +#define NRFX_SPIM_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_SPIM_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_SPIM_CONFIG_LOG_LEVEL +#define NRFX_SPIM_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_SPIM_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SPIM_CONFIG_INFO_COLOR +#define NRFX_SPIM_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_SPIM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SPIM_CONFIG_DEBUG_COLOR +#define NRFX_SPIM_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_SPIS_ENABLED - nrfx_spis - SPIS peripheral driver +//========================================================== +#ifndef NRFX_SPIS_ENABLED +#define NRFX_SPIS_ENABLED 0 +#endif +// NRFX_SPIS0_ENABLED - Enable SPIS0 instance + + +#ifndef NRFX_SPIS0_ENABLED +#define NRFX_SPIS0_ENABLED 0 +#endif + +// NRFX_SPIS1_ENABLED - Enable SPIS1 instance + + +#ifndef NRFX_SPIS1_ENABLED +#define NRFX_SPIS1_ENABLED 0 +#endif + +// NRFX_SPIS2_ENABLED - Enable SPIS2 instance + + +#ifndef NRFX_SPIS2_ENABLED +#define NRFX_SPIS2_ENABLED 0 +#endif + +// NRFX_SPIS_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_SPIS_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_SPIS_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_SPIS_DEFAULT_DEF - SPIS default DEF character <0-255> + + +#ifndef NRFX_SPIS_DEFAULT_DEF +#define NRFX_SPIS_DEFAULT_DEF 255 +#endif + +// NRFX_SPIS_DEFAULT_ORC - SPIS default ORC character <0-255> + + +#ifndef NRFX_SPIS_DEFAULT_ORC +#define NRFX_SPIS_DEFAULT_ORC 255 +#endif + +// NRFX_SPIS_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_SPIS_CONFIG_LOG_ENABLED +#define NRFX_SPIS_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_SPIS_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_SPIS_CONFIG_LOG_LEVEL +#define NRFX_SPIS_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_SPIS_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SPIS_CONFIG_INFO_COLOR +#define NRFX_SPIS_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_SPIS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SPIS_CONFIG_DEBUG_COLOR +#define NRFX_SPIS_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_SPI_ENABLED - nrfx_spi - SPI peripheral driver +//========================================================== + +#ifndef NRFX_SPI_ENABLED +#define NRFX_SPI_ENABLED 1 +#endif +// NRFX_SPI0_ENABLED - Enable SPI0 instance + + +#ifndef NRFX_SPI0_ENABLED +#define NRFX_SPI0_ENABLED 1 +#endif + +// NRFX_SPI1_ENABLED - Enable SPI1 instance + + +#ifndef NRFX_SPI1_ENABLED +#define NRFX_SPI1_ENABLED 1 +#endif + +// NRFX_SPI2_ENABLED - Enable SPI2 instance + + +#ifndef NRFX_SPI2_ENABLED +#define NRFX_SPI2_ENABLED 1 +#endif + +// NRFX_SPI_MISO_PULL_CFG - MISO pin pull configuration. + +// <0=> NRF_GPIO_PIN_NOPULL +// <1=> NRF_GPIO_PIN_PULLDOWN +// <3=> NRF_GPIO_PIN_PULLUP + +#ifndef NRFX_SPI_MISO_PULL_CFG +#define NRFX_SPI_MISO_PULL_CFG 1 +#endif + +// NRFX_SPI_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_SPI_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_SPI_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_SPI_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_SPI_CONFIG_LOG_ENABLED +#define NRFX_SPI_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_SPI_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_SPI_CONFIG_LOG_LEVEL +#define NRFX_SPI_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_SPI_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SPI_CONFIG_INFO_COLOR +#define NRFX_SPI_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_SPI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SPI_CONFIG_DEBUG_COLOR +#define NRFX_SPI_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_SWI_ENABLED - nrfx_swi - SWI/EGU peripheral allocator +//========================================================== +#ifndef NRFX_SWI_ENABLED +#define NRFX_SWI_ENABLED 0 +#endif +// NRFX_EGU_ENABLED - Enable EGU support + + +#ifndef NRFX_EGU_ENABLED +#define NRFX_EGU_ENABLED 1 +#endif + +// NRFX_SWI0_DISABLED - Exclude SWI0 from being utilized by the driver + + +#ifndef NRFX_SWI0_DISABLED +#define NRFX_SWI0_DISABLED 0 +#endif + +// NRFX_SWI1_DISABLED - Exclude SWI1 from being utilized by the driver + + +#ifndef NRFX_SWI1_DISABLED +#define NRFX_SWI1_DISABLED 0 +#endif + +// NRFX_SWI2_DISABLED - Exclude SWI2 from being utilized by the driver + + +#ifndef NRFX_SWI2_DISABLED +#define NRFX_SWI2_DISABLED 0 +#endif + +// NRFX_SWI3_DISABLED - Exclude SWI3 from being utilized by the driver + + +#ifndef NRFX_SWI3_DISABLED +#define NRFX_SWI3_DISABLED 0 +#endif + +// NRFX_SWI4_DISABLED - Exclude SWI4 from being utilized by the driver + + +#ifndef NRFX_SWI4_DISABLED +#define NRFX_SWI4_DISABLED 0 +#endif + +// NRFX_SWI5_DISABLED - Exclude SWI5 from being utilized by the driver + + +#ifndef NRFX_SWI5_DISABLED +#define NRFX_SWI5_DISABLED 0 +#endif + +// NRFX_SWI_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_SWI_CONFIG_LOG_ENABLED +#define NRFX_SWI_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_SWI_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_SWI_CONFIG_LOG_LEVEL +#define NRFX_SWI_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_SWI_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SWI_CONFIG_INFO_COLOR +#define NRFX_SWI_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_SWI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_SWI_CONFIG_DEBUG_COLOR +#define NRFX_SWI_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_TIMER_ENABLED - nrfx_timer - TIMER periperal driver +//========================================================== +#ifndef NRFX_TIMER_ENABLED +#define NRFX_TIMER_ENABLED 0 +#endif +// NRFX_TIMER0_ENABLED - Enable TIMER0 instance + + +#ifndef NRFX_TIMER0_ENABLED +#define NRFX_TIMER0_ENABLED 0 +#endif + +// NRFX_TIMER1_ENABLED - Enable TIMER1 instance + + +#ifndef NRFX_TIMER1_ENABLED +#define NRFX_TIMER1_ENABLED 0 +#endif + +// NRFX_TIMER2_ENABLED - Enable TIMER2 instance + + +#ifndef NRFX_TIMER2_ENABLED +#define NRFX_TIMER2_ENABLED 0 +#endif + +// NRFX_TIMER3_ENABLED - Enable TIMER3 instance + + +#ifndef NRFX_TIMER3_ENABLED +#define NRFX_TIMER3_ENABLED 0 +#endif + +// NRFX_TIMER4_ENABLED - Enable TIMER4 instance + + +#ifndef NRFX_TIMER4_ENABLED +#define NRFX_TIMER4_ENABLED 0 +#endif + +// NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY - Timer frequency if in Timer mode + +// <0=> 16 MHz +// <1=> 8 MHz +// <2=> 4 MHz +// <3=> 2 MHz +// <4=> 1 MHz +// <5=> 500 kHz +// <6=> 250 kHz +// <7=> 125 kHz +// <8=> 62.5 kHz +// <9=> 31.25 kHz + +#ifndef NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY +#define NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY 0 +#endif + +// NRFX_TIMER_DEFAULT_CONFIG_MODE - Timer mode or operation + +// <0=> Timer +// <1=> Counter + +#ifndef NRFX_TIMER_DEFAULT_CONFIG_MODE +#define NRFX_TIMER_DEFAULT_CONFIG_MODE 0 +#endif + +// NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH - Timer counter bit width + +// <0=> 16 bit +// <1=> 8 bit +// <2=> 24 bit +// <3=> 32 bit + +#ifndef NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH +#define NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH 0 +#endif + +// NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_TIMER_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_TIMER_CONFIG_LOG_ENABLED +#define NRFX_TIMER_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_TIMER_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_TIMER_CONFIG_LOG_LEVEL +#define NRFX_TIMER_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_TIMER_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TIMER_CONFIG_INFO_COLOR +#define NRFX_TIMER_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_TIMER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TIMER_CONFIG_DEBUG_COLOR +#define NRFX_TIMER_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_TWIM_ENABLED - nrfx_twim - TWIM peripheral driver +//========================================================== +#ifndef NRFX_TWIM_ENABLED +#define NRFX_TWIM_ENABLED 1 +#endif +// NRFX_TWIM0_ENABLED - Enable TWIM0 instance + + +#ifndef NRFX_TWIM0_ENABLED +#define NRFX_TWIM0_ENABLED 1 +#endif + +// NRFX_TWIM1_ENABLED - Enable TWIM1 instance + + +#ifndef NRFX_TWIM1_ENABLED +#define NRFX_TWIM1_ENABLED 1 +#endif + +// NRFX_TWIM_DEFAULT_CONFIG_FREQUENCY - Frequency + +// <26738688=> 100k +// <67108864=> 250k +// <104857600=> 400k + +#ifndef NRFX_TWIM_DEFAULT_CONFIG_FREQUENCY +#define NRFX_TWIM_DEFAULT_CONFIG_FREQUENCY 26738688 +#endif + +// NRFX_TWIM_DEFAULT_CONFIG_HOLD_BUS_UNINIT - Enables bus holding after uninit + + +#ifndef NRFX_TWIM_DEFAULT_CONFIG_HOLD_BUS_UNINIT +#define NRFX_TWIM_DEFAULT_CONFIG_HOLD_BUS_UNINIT 0 +#endif + +// NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + // <0=> 0 (highest) // <1=> 1 // <2=> 2 @@ -2099,43 +3848,721 @@ // <6=> 6 // <7=> 7 +#ifndef NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_TWIM_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_TWIM_CONFIG_LOG_ENABLED +#define NRFX_TWIM_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_TWIM_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_TWIM_CONFIG_LOG_LEVEL +#define NRFX_TWIM_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_TWIM_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TWIM_CONFIG_INFO_COLOR +#define NRFX_TWIM_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_TWIM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TWIM_CONFIG_DEBUG_COLOR +#define NRFX_TWIM_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_TWIS_ENABLED - nrfx_twis - TWIS peripheral driver +//========================================================== +#ifndef NRFX_TWIS_ENABLED +#define NRFX_TWIS_ENABLED 0 +#endif +// NRFX_TWIS0_ENABLED - Enable TWIS0 instance + + +#ifndef NRFX_TWIS0_ENABLED +#define NRFX_TWIS0_ENABLED 0 +#endif + +// NRFX_TWIS1_ENABLED - Enable TWIS1 instance + + +#ifndef NRFX_TWIS1_ENABLED +#define NRFX_TWIS1_ENABLED 0 +#endif + +// NRFX_TWIS_ASSUME_INIT_AFTER_RESET_ONLY - Assume that any instance would be initialized only once + + +// Optimization flag. Registers used by TWIS are shared by other peripherals. Normally, during initialization driver tries to clear all registers to known state before doing the initialization itself. This gives initialization safe procedure, no matter when it would be called. If you activate TWIS only once and do never uninitialize it - set this flag to 1 what gives more optimal code. + +#ifndef NRFX_TWIS_ASSUME_INIT_AFTER_RESET_ONLY +#define NRFX_TWIS_ASSUME_INIT_AFTER_RESET_ONLY 0 +#endif + +// NRFX_TWIS_NO_SYNC_MODE - Remove support for synchronous mode + + +// Synchronous mode would be used in specific situations. And it uses some additional code and data memory to safely process state machine by polling it in status functions. If this functionality is not required it may be disabled to free some resources. + +#ifndef NRFX_TWIS_NO_SYNC_MODE +#define NRFX_TWIS_NO_SYNC_MODE 0 +#endif + +// NRFX_TWIS_DEFAULT_CONFIG_ADDR0 - Address0 +#ifndef NRFX_TWIS_DEFAULT_CONFIG_ADDR0 +#define NRFX_TWIS_DEFAULT_CONFIG_ADDR0 0 +#endif + +// NRFX_TWIS_DEFAULT_CONFIG_ADDR1 - Address1 +#ifndef NRFX_TWIS_DEFAULT_CONFIG_ADDR1 +#define NRFX_TWIS_DEFAULT_CONFIG_ADDR1 0 +#endif + +// NRFX_TWIS_DEFAULT_CONFIG_SCL_PULL - SCL pin pull configuration + +// <0=> Disabled +// <1=> Pull down +// <3=> Pull up + +#ifndef NRFX_TWIS_DEFAULT_CONFIG_SCL_PULL +#define NRFX_TWIS_DEFAULT_CONFIG_SCL_PULL 0 +#endif + +// NRFX_TWIS_DEFAULT_CONFIG_SDA_PULL - SDA pin pull configuration + +// <0=> Disabled +// <1=> Pull down +// <3=> Pull up + +#ifndef NRFX_TWIS_DEFAULT_CONFIG_SDA_PULL +#define NRFX_TWIS_DEFAULT_CONFIG_SDA_PULL 0 +#endif + +// NRFX_TWIS_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_TWIS_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_TWIS_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_TWIS_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_TWIS_CONFIG_LOG_ENABLED +#define NRFX_TWIS_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_TWIS_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_TWIS_CONFIG_LOG_LEVEL +#define NRFX_TWIS_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_TWIS_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TWIS_CONFIG_INFO_COLOR +#define NRFX_TWIS_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_TWIS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TWIS_CONFIG_DEBUG_COLOR +#define NRFX_TWIS_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +#ifndef NRFX_PRS_ENABLED +#define NRFX_PRS_ENABLED 1 +#endif + +// NRFX_TWI_ENABLED - nrfx_twi - TWI peripheral driver +//========================================================== + +#ifndef NRFX_TWI_ENABLED +#define NRFX_TWI_ENABLED 1 +#endif +// NRFX_TWI0_ENABLED - Enable TWI0 instance + + +#ifndef NRFX_TWI0_ENABLED +#define NRFX_TWI0_ENABLED 1 +#endif + +// NRFX_TWI1_ENABLED - Enable TWI1 instance + + +#ifndef NRFX_TWI1_ENABLED +#define NRFX_TWI1_ENABLED 1 +#endif + +// NRFX_TWI_DEFAULT_CONFIG_FREQUENCY - Frequency + +// <26738688=> 100k +// <67108864=> 250k +// <104857600=> 400k + +#ifndef NRFX_TWI_DEFAULT_CONFIG_FREQUENCY +#define NRFX_TWI_DEFAULT_CONFIG_FREQUENCY 26738688 +#endif + +// NRFX_TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT - Enables bus holding after uninit + + +#ifndef NRFX_TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT +#define NRFX_TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT 0 +#endif + +// NRFX_TWI_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_TWI_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_TWI_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_TWI_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_TWI_CONFIG_LOG_ENABLED +#define NRFX_TWI_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_TWI_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_TWI_CONFIG_LOG_LEVEL +#define NRFX_TWI_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_TWI_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TWI_CONFIG_INFO_COLOR +#define NRFX_TWI_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_TWI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_TWI_CONFIG_DEBUG_COLOR +#define NRFX_TWI_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_UARTE_ENABLED - nrfx_uarte - UARTE peripheral driver +//========================================================== +#ifndef NRFX_UARTE_ENABLED +#define NRFX_UARTE_ENABLED 0 +#endif +// NRFX_UARTE0_ENABLED - Enable UARTE0 instance +#ifndef NRFX_UARTE0_ENABLED +#define NRFX_UARTE0_ENABLED 0 +#endif + +// NRFX_UARTE1_ENABLED - Enable UARTE1 instance +#ifndef NRFX_UARTE1_ENABLED +#define NRFX_UARTE1_ENABLED 0 +#endif + +// NRFX_UARTE_DEFAULT_CONFIG_HWFC - Hardware Flow Control + +// <0=> Disabled +// <1=> Enabled + +#ifndef NRFX_UARTE_DEFAULT_CONFIG_HWFC +#define NRFX_UARTE_DEFAULT_CONFIG_HWFC 0 +#endif + +// NRFX_UARTE_DEFAULT_CONFIG_PARITY - Parity + +// <0=> Excluded +// <14=> Included + +#ifndef NRFX_UARTE_DEFAULT_CONFIG_PARITY +#define NRFX_UARTE_DEFAULT_CONFIG_PARITY 0 +#endif + +// NRFX_UARTE_DEFAULT_CONFIG_BAUDRATE - Default Baudrate + +// <323584=> 1200 baud +// <643072=> 2400 baud +// <1290240=> 4800 baud +// <2576384=> 9600 baud +// <3862528=> 14400 baud +// <5152768=> 19200 baud +// <7716864=> 28800 baud +// <8388608=> 31250 baud +// <10289152=> 38400 baud +// <15007744=> 56000 baud +// <15400960=> 57600 baud +// <20615168=> 76800 baud +// <30801920=> 115200 baud +// <61865984=> 230400 baud +// <67108864=> 250000 baud +// <121634816=> 460800 baud +// <251658240=> 921600 baud +// <268435456=> 1000000 baud + +#ifndef NRFX_UARTE_DEFAULT_CONFIG_BAUDRATE +#define NRFX_UARTE_DEFAULT_CONFIG_BAUDRATE 30801920 +#endif + +// NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_UARTE_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_UARTE_CONFIG_LOG_ENABLED +#define NRFX_UARTE_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_UARTE_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_UARTE_CONFIG_LOG_LEVEL +#define NRFX_UARTE_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_UARTE_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_UARTE_CONFIG_INFO_COLOR +#define NRFX_UARTE_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_UARTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_UARTE_CONFIG_DEBUG_COLOR +#define NRFX_UARTE_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_UART_ENABLED - nrfx_uart - UART peripheral driver +//========================================================== +#ifndef NRFX_UART_ENABLED +#define NRFX_UART_ENABLED 1 +#endif +// NRFX_UART0_ENABLED - Enable UART0 instance +#ifndef NRFX_UART0_ENABLED +#define NRFX_UART0_ENABLED 1 +#endif + +// NRFX_UART_DEFAULT_CONFIG_HWFC - Hardware Flow Control + +// <0=> Disabled +// <1=> Enabled + +#ifndef NRFX_UART_DEFAULT_CONFIG_HWFC +#define NRFX_UART_DEFAULT_CONFIG_HWFC 0 +#endif + +// NRFX_UART_DEFAULT_CONFIG_PARITY - Parity + +// <0=> Excluded +// <14=> Included + +#ifndef NRFX_UART_DEFAULT_CONFIG_PARITY +#define NRFX_UART_DEFAULT_CONFIG_PARITY 0 +#endif + +// NRFX_UART_DEFAULT_CONFIG_BAUDRATE - Default Baudrate + +// <323584=> 1200 baud +// <643072=> 2400 baud +// <1290240=> 4800 baud +// <2576384=> 9600 baud +// <3866624=> 14400 baud +// <5152768=> 19200 baud +// <7729152=> 28800 baud +// <8388608=> 31250 baud +// <10309632=> 38400 baud +// <15007744=> 56000 baud +// <15462400=> 57600 baud +// <20615168=> 76800 baud +// <30924800=> 115200 baud +// <61845504=> 230400 baud +// <67108864=> 250000 baud +// <123695104=> 460800 baud +// <247386112=> 921600 baud +// <268435456=> 1000000 baud + +#ifndef NRFX_UART_DEFAULT_CONFIG_BAUDRATE +#define NRFX_UART_DEFAULT_CONFIG_BAUDRATE 30924800 +#endif + +// NRFX_UART_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_UART_DEFAULT_CONFIG_IRQ_PRIORITY +#define NRFX_UART_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_UART_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_UART_CONFIG_LOG_ENABLED +#define NRFX_UART_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_UART_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_UART_CONFIG_LOG_LEVEL +#define NRFX_UART_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_UART_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_UART_CONFIG_INFO_COLOR +#define NRFX_UART_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_UART_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_UART_CONFIG_DEBUG_COLOR +#define NRFX_UART_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// NRFX_WDT_ENABLED - nrfx_wdt - WDT peripheral driver +//========================================================== +#ifndef NRFX_WDT_ENABLED +#define NRFX_WDT_ENABLED 0 +#endif +// NRFX_WDT_CONFIG_BEHAVIOUR - WDT behavior in CPU SLEEP or HALT mode + +// <1=> Run in SLEEP, Pause in HALT +// <8=> Pause in SLEEP, Run in HALT +// <9=> Run in SLEEP and HALT +// <0=> Pause in SLEEP and HALT + +#ifndef NRFX_WDT_CONFIG_BEHAVIOUR +#define NRFX_WDT_CONFIG_BEHAVIOUR 1 +#endif + +// NRFX_WDT_CONFIG_RELOAD_VALUE - Reload value <15-4294967295> + + +#ifndef NRFX_WDT_CONFIG_RELOAD_VALUE +#define NRFX_WDT_CONFIG_RELOAD_VALUE 2000 +#endif + +// NRFX_WDT_CONFIG_IRQ_PRIORITY - Interrupt priority + +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef NRFX_WDT_CONFIG_IRQ_PRIORITY +#define NRFX_WDT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRFX_WDT_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRFX_WDT_CONFIG_LOG_ENABLED +#define NRFX_WDT_CONFIG_LOG_ENABLED 0 +#endif +// NRFX_WDT_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRFX_WDT_CONFIG_LOG_LEVEL +#define NRFX_WDT_CONFIG_LOG_LEVEL 3 +#endif + +// NRFX_WDT_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_WDT_CONFIG_INFO_COLOR +#define NRFX_WDT_CONFIG_INFO_COLOR 0 +#endif + +// NRFX_WDT_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRFX_WDT_CONFIG_DEBUG_COLOR +#define NRFX_WDT_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// PDM_ENABLED - nrf_drv_pdm - PDM peripheral driver - legacy layer +//========================================================== +#ifndef PDM_ENABLED +#define PDM_ENABLED 0 +#endif +// PDM_CONFIG_MODE - Mode + +// <0=> Stereo +// <1=> Mono + +#ifndef PDM_CONFIG_MODE +#define PDM_CONFIG_MODE 1 +#endif + +// PDM_CONFIG_EDGE - Edge + +// <0=> Left falling +// <1=> Left rising + +#ifndef PDM_CONFIG_EDGE +#define PDM_CONFIG_EDGE 0 +#endif + +// PDM_CONFIG_CLOCK_FREQ - Clock frequency + +// <134217728=> 1000k +// <138412032=> 1032k (default) +// <142606336=> 1067k + +#ifndef PDM_CONFIG_CLOCK_FREQ +#define PDM_CONFIG_CLOCK_FREQ 138412032 +#endif + +// PDM_CONFIG_IRQ_PRIORITY - Interrupt priority + + +// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + #ifndef PDM_CONFIG_IRQ_PRIORITY #define PDM_CONFIG_IRQ_PRIORITY 7 #endif // -// PERIPHERAL_RESOURCE_SHARING_ENABLED - nrf_drv_common - Peripheral drivers common module - - -#ifndef PERIPHERAL_RESOURCE_SHARING_ENABLED -#define PERIPHERAL_RESOURCE_SHARING_ENABLED 1 -#endif - -// POWER_ENABLED - nrf_drv_power - POWER peripheral driver +// POWER_ENABLED - nrf_drv_power - POWER peripheral driver - legacy layer //========================================================== #ifndef POWER_ENABLED #define POWER_ENABLED 0 #endif // POWER_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef POWER_CONFIG_IRQ_PRIORITY #define POWER_CONFIG_IRQ_PRIORITY 7 #endif // POWER_CONFIG_DEFAULT_DCDCEN - The default configuration of main DCDC regulator - + // This settings means only that components for DCDC regulator are installed and it can be enabled. @@ -2144,7 +4571,7 @@ #endif // POWER_CONFIG_DEFAULT_DCDCENHV - The default configuration of High Voltage DCDC regulator - + // This settings means only that components for DCDC regulator are installed and it can be enabled. @@ -2154,40 +4581,40 @@ // -// PPI_ENABLED - nrf_drv_ppi - PPI peripheral driver - +// PPI_ENABLED - nrf_drv_ppi - PPI peripheral driver - legacy layer + #ifndef PPI_ENABLED -#define PPI_ENABLED 1 +#define PPI_ENABLED 0 #endif -// PWM_ENABLED - nrf_drv_pwm - PWM peripheral driver +// PWM_ENABLED - nrf_drv_pwm - PWM peripheral driver - legacy layer //========================================================== #ifndef PWM_ENABLED -#define PWM_ENABLED 1 +#define PWM_ENABLED 0 #endif -// PWM_DEFAULT_CONFIG_OUT0_PIN - Out0 pin <0-31> +// PWM_DEFAULT_CONFIG_OUT0_PIN - Out0 pin <0-31> #ifndef PWM_DEFAULT_CONFIG_OUT0_PIN #define PWM_DEFAULT_CONFIG_OUT0_PIN 31 #endif -// PWM_DEFAULT_CONFIG_OUT1_PIN - Out1 pin <0-31> +// PWM_DEFAULT_CONFIG_OUT1_PIN - Out1 pin <0-31> #ifndef PWM_DEFAULT_CONFIG_OUT1_PIN #define PWM_DEFAULT_CONFIG_OUT1_PIN 31 #endif -// PWM_DEFAULT_CONFIG_OUT2_PIN - Out2 pin <0-31> +// PWM_DEFAULT_CONFIG_OUT2_PIN - Out2 pin <0-31> #ifndef PWM_DEFAULT_CONFIG_OUT2_PIN #define PWM_DEFAULT_CONFIG_OUT2_PIN 31 #endif -// PWM_DEFAULT_CONFIG_OUT3_PIN - Out3 pin <0-31> +// PWM_DEFAULT_CONFIG_OUT3_PIN - Out3 pin <0-31> #ifndef PWM_DEFAULT_CONFIG_OUT3_PIN @@ -2195,197 +4622,197 @@ #endif // PWM_DEFAULT_CONFIG_BASE_CLOCK - Base clock - -// <0=> 16 MHz -// <1=> 8 MHz -// <2=> 4 MHz -// <3=> 2 MHz -// <4=> 1 MHz -// <5=> 500 kHz -// <6=> 250 kHz -// <7=> 125 kHz + +// <0=> 16 MHz +// <1=> 8 MHz +// <2=> 4 MHz +// <3=> 2 MHz +// <4=> 1 MHz +// <5=> 500 kHz +// <6=> 250 kHz +// <7=> 125 kHz #ifndef PWM_DEFAULT_CONFIG_BASE_CLOCK #define PWM_DEFAULT_CONFIG_BASE_CLOCK 4 #endif // PWM_DEFAULT_CONFIG_COUNT_MODE - Count mode - -// <0=> Up -// <1=> Up and Down + +// <0=> Up +// <1=> Up and Down #ifndef PWM_DEFAULT_CONFIG_COUNT_MODE #define PWM_DEFAULT_CONFIG_COUNT_MODE 0 #endif -// PWM_DEFAULT_CONFIG_TOP_VALUE - Top value +// PWM_DEFAULT_CONFIG_TOP_VALUE - Top value #ifndef PWM_DEFAULT_CONFIG_TOP_VALUE #define PWM_DEFAULT_CONFIG_TOP_VALUE 1000 #endif // PWM_DEFAULT_CONFIG_LOAD_MODE - Load mode - -// <0=> Common -// <1=> Grouped -// <2=> Individual -// <3=> Waveform + +// <0=> Common +// <1=> Grouped +// <2=> Individual +// <3=> Waveform #ifndef PWM_DEFAULT_CONFIG_LOAD_MODE #define PWM_DEFAULT_CONFIG_LOAD_MODE 0 #endif // PWM_DEFAULT_CONFIG_STEP_MODE - Step mode - -// <0=> Auto -// <1=> Triggered + +// <0=> Auto +// <1=> Triggered #ifndef PWM_DEFAULT_CONFIG_STEP_MODE #define PWM_DEFAULT_CONFIG_STEP_MODE 0 #endif // PWM_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + - -// Priorities 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef PWM_DEFAULT_CONFIG_IRQ_PRIORITY #define PWM_DEFAULT_CONFIG_IRQ_PRIORITY 7 #endif // PWM0_ENABLED - Enable PWM0 instance - + #ifndef PWM0_ENABLED -#define PWM0_ENABLED 1 +#define PWM0_ENABLED 0 #endif // PWM1_ENABLED - Enable PWM1 instance - + #ifndef PWM1_ENABLED -#define PWM1_ENABLED 1 +#define PWM1_ENABLED 0 #endif // PWM2_ENABLED - Enable PWM2 instance - + #ifndef PWM2_ENABLED -#define PWM2_ENABLED 1 +#define PWM2_ENABLED 0 #endif // PWM3_ENABLED - Enable PWM3 instance - + #ifndef PWM3_ENABLED -#define PWM3_ENABLED 1 +#define PWM3_ENABLED 0 #endif // -// QDEC_ENABLED - nrf_drv_qdec - QDEC peripheral driver +// QDEC_ENABLED - nrf_drv_qdec - QDEC peripheral driver - legacy layer //========================================================== #ifndef QDEC_ENABLED #define QDEC_ENABLED 0 #endif // QDEC_CONFIG_REPORTPER - Report period - -// <0=> 10 Samples -// <1=> 40 Samples -// <2=> 80 Samples -// <3=> 120 Samples -// <4=> 160 Samples -// <5=> 200 Samples -// <6=> 240 Samples -// <7=> 280 Samples + +// <0=> 10 Samples +// <1=> 40 Samples +// <2=> 80 Samples +// <3=> 120 Samples +// <4=> 160 Samples +// <5=> 200 Samples +// <6=> 240 Samples +// <7=> 280 Samples #ifndef QDEC_CONFIG_REPORTPER #define QDEC_CONFIG_REPORTPER 0 #endif // QDEC_CONFIG_SAMPLEPER - Sample period - -// <0=> 128 us -// <1=> 256 us -// <2=> 512 us -// <3=> 1024 us -// <4=> 2048 us -// <5=> 4096 us -// <6=> 8192 us -// <7=> 16384 us + +// <0=> 128 us +// <1=> 256 us +// <2=> 512 us +// <3=> 1024 us +// <4=> 2048 us +// <5=> 4096 us +// <6=> 8192 us +// <7=> 16384 us #ifndef QDEC_CONFIG_SAMPLEPER #define QDEC_CONFIG_SAMPLEPER 7 #endif -// QDEC_CONFIG_PIO_A - A pin <0-31> +// QDEC_CONFIG_PIO_A - A pin <0-31> #ifndef QDEC_CONFIG_PIO_A #define QDEC_CONFIG_PIO_A 31 #endif -// QDEC_CONFIG_PIO_B - B pin <0-31> +// QDEC_CONFIG_PIO_B - B pin <0-31> #ifndef QDEC_CONFIG_PIO_B #define QDEC_CONFIG_PIO_B 31 #endif -// QDEC_CONFIG_PIO_LED - LED pin <0-31> +// QDEC_CONFIG_PIO_LED - LED pin <0-31> #ifndef QDEC_CONFIG_PIO_LED #define QDEC_CONFIG_PIO_LED 31 #endif -// QDEC_CONFIG_LEDPRE - LED pre +// QDEC_CONFIG_LEDPRE - LED pre #ifndef QDEC_CONFIG_LEDPRE #define QDEC_CONFIG_LEDPRE 511 #endif // QDEC_CONFIG_LEDPOL - LED polarity - -// <0=> Active low -// <1=> Active high + +// <0=> Active low +// <1=> Active high #ifndef QDEC_CONFIG_LEDPOL #define QDEC_CONFIG_LEDPOL 1 #endif // QDEC_CONFIG_DBFEN - Debouncing enable - + #ifndef QDEC_CONFIG_DBFEN #define QDEC_CONFIG_DBFEN 0 #endif // QDEC_CONFIG_SAMPLE_INTEN - Sample ready interrupt enable - + #ifndef QDEC_CONFIG_SAMPLE_INTEN #define QDEC_CONFIG_SAMPLE_INTEN 0 #endif // QDEC_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef QDEC_CONFIG_IRQ_PRIORITY #define QDEC_CONFIG_IRQ_PRIORITY 7 @@ -2393,436 +4820,85 @@ // -// RNG_ENABLED - nrf_drv_rng - RNG peripheral driver -//========================================================== -#ifndef RNG_ENABLED -#define RNG_ENABLED 1 -#endif -// RNG_CONFIG_ERROR_CORRECTION - Error correction - - -#ifndef RNG_CONFIG_ERROR_CORRECTION -#define RNG_CONFIG_ERROR_CORRECTION 1 -#endif - -// RNG_CONFIG_POOL_SIZE - Pool size -#ifndef RNG_CONFIG_POOL_SIZE -#define RNG_CONFIG_POOL_SIZE 32 -#endif - -// RNG_CONFIG_IRQ_PRIORITY - Interrupt priority - - -// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 - -#ifndef RNG_CONFIG_IRQ_PRIORITY -#define RNG_CONFIG_IRQ_PRIORITY 7 -#endif - -// - -// RTC_ENABLED - nrf_drv_rtc - RTC peripheral driver -//========================================================== -#ifndef RTC_ENABLED -#define RTC_ENABLED 0 -#endif -// RTC_DEFAULT_CONFIG_FREQUENCY - Frequency <16-32768> - - -#ifndef RTC_DEFAULT_CONFIG_FREQUENCY -#define RTC_DEFAULT_CONFIG_FREQUENCY 32768 -#endif - -// RTC_DEFAULT_CONFIG_RELIABLE - Ensures safe compare event triggering - - -#ifndef RTC_DEFAULT_CONFIG_RELIABLE -#define RTC_DEFAULT_CONFIG_RELIABLE 0 -#endif - -// RTC_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - - -// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 - -#ifndef RTC_DEFAULT_CONFIG_IRQ_PRIORITY -#define RTC_DEFAULT_CONFIG_IRQ_PRIORITY 7 -#endif - -// RTC0_ENABLED - Enable RTC0 instance - - -#ifndef RTC0_ENABLED -#define RTC0_ENABLED 0 -#endif - -// RTC1_ENABLED - Enable RTC1 instance - - -#ifndef RTC1_ENABLED -#define RTC1_ENABLED 0 -#endif - -// RTC2_ENABLED - Enable RTC2 instance - - -#ifndef RTC2_ENABLED -#define RTC2_ENABLED 0 -#endif - -// NRF_MAXIMUM_LATENCY_US - Maximum possible time[us] in highest priority interrupt -#ifndef NRF_MAXIMUM_LATENCY_US -#define NRF_MAXIMUM_LATENCY_US 2000 -#endif - -// - -// SAADC_ENABLED - nrf_drv_saadc - SAADC peripheral driver -//========================================================== -#ifndef SAADC_ENABLED -#define SAADC_ENABLED 1 -#endif -// SAADC_CONFIG_RESOLUTION - Resolution - -// <0=> 8 bit -// <1=> 10 bit -// <2=> 12 bit -// <3=> 14 bit - -#ifndef SAADC_CONFIG_RESOLUTION -#define SAADC_CONFIG_RESOLUTION 2 -#endif - -// SAADC_CONFIG_OVERSAMPLE - Sample period - -// <0=> Disabled -// <1=> 2x -// <2=> 4x -// <3=> 8x -// <4=> 16x -// <5=> 32x -// <6=> 64x -// <7=> 128x -// <8=> 256x - -#ifndef SAADC_CONFIG_OVERSAMPLE -#define SAADC_CONFIG_OVERSAMPLE 0 -#endif - -// SAADC_CONFIG_LP_MODE - Enabling low power mode - - -#ifndef SAADC_CONFIG_LP_MODE -#define SAADC_CONFIG_LP_MODE 0 -#endif - -// SAADC_CONFIG_IRQ_PRIORITY - Interrupt priority - - -// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 - -#ifndef SAADC_CONFIG_IRQ_PRIORITY -#define SAADC_CONFIG_IRQ_PRIORITY 7 -#endif - -// - -// SPIS_ENABLED - nrf_drv_spis - SPI Slave driver -//========================================================== -#ifndef SPIS_ENABLED -#define SPIS_ENABLED 1 -#endif -// SPIS_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - - -// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 - -#ifndef SPIS_DEFAULT_CONFIG_IRQ_PRIORITY -#define SPIS_DEFAULT_CONFIG_IRQ_PRIORITY 7 -#endif - -// SPIS_DEFAULT_MODE - Mode - -// <0=> MODE_0 -// <1=> MODE_1 -// <2=> MODE_2 -// <3=> MODE_3 - -#ifndef SPIS_DEFAULT_MODE -#define SPIS_DEFAULT_MODE 0 -#endif - -// SPIS_DEFAULT_BIT_ORDER - SPIS default bit order - -// <0=> MSB first -// <1=> LSB first - -#ifndef SPIS_DEFAULT_BIT_ORDER -#define SPIS_DEFAULT_BIT_ORDER 0 -#endif - -// SPIS_DEFAULT_DEF - SPIS default DEF character <0-255> - - -#ifndef SPIS_DEFAULT_DEF -#define SPIS_DEFAULT_DEF 255 -#endif - -// SPIS_DEFAULT_ORC - SPIS default ORC character <0-255> - - -#ifndef SPIS_DEFAULT_ORC -#define SPIS_DEFAULT_ORC 255 -#endif - -// SPIS0_ENABLED - Enable SPIS0 instance - - -#ifndef SPIS0_ENABLED -#define SPIS0_ENABLED 1 -#endif - -// SPIS1_ENABLED - Enable SPIS1 instance - - -#ifndef SPIS1_ENABLED -#define SPIS1_ENABLED 0 -#endif - -// SPIS2_ENABLED - Enable SPIS2 instance - - -#ifndef SPIS2_ENABLED -#define SPIS2_ENABLED 0 -#endif - -// - -// SPI_ENABLED - nrf_drv_spi - SPI/SPIM peripheral driver -//========================================================== -#ifndef SPI_ENABLED -#define SPI_ENABLED 1 -#endif -// SPI_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - - -// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 - -#ifndef SPI_DEFAULT_CONFIG_IRQ_PRIORITY -#define SPI_DEFAULT_CONFIG_IRQ_PRIORITY 7 -#endif - -// NRF_SPI_DRV_MISO_PULLUP_CFG - MISO PIN pull-up configuration. - -// <0=> NRF_GPIO_PIN_NOPULL -// <1=> NRF_GPIO_PIN_PULLDOWN -// <3=> NRF_GPIO_PIN_PULLUP - -#ifndef NRF_SPI_DRV_MISO_PULLUP_CFG -#define NRF_SPI_DRV_MISO_PULLUP_CFG 1 -#endif - -// SPI0_ENABLED - Enable SPI0 instance -//========================================================== -#ifndef SPI0_ENABLED -#define SPI0_ENABLED 1 -#endif -// SPI0_USE_EASY_DMA - Use EasyDMA - - -#ifndef SPI0_USE_EASY_DMA -#define SPI0_USE_EASY_DMA 0 -#endif - -// SPI0_DEFAULT_FREQUENCY - SPI frequency - -// <33554432=> 125 kHz -// <67108864=> 250 kHz -// <134217728=> 500 kHz -// <268435456=> 1 MHz -// <536870912=> 2 MHz -// <1073741824=> 4 MHz -// <2147483648=> 8 MHz - -#ifndef SPI0_DEFAULT_FREQUENCY -#define SPI0_DEFAULT_FREQUENCY 1073741824 -#endif - -// - -// SPI1_ENABLED - Enable SPI1 instance -//========================================================== -#ifndef SPI1_ENABLED -#define SPI1_ENABLED 1 -#endif -// SPI1_USE_EASY_DMA - Use EasyDMA - - -#ifndef SPI1_USE_EASY_DMA -#define SPI1_USE_EASY_DMA 0 -#endif - -// SPI1_DEFAULT_FREQUENCY - SPI frequency - -// <33554432=> 125 kHz -// <67108864=> 250 kHz -// <134217728=> 500 kHz -// <268435456=> 1 MHz -// <536870912=> 2 MHz -// <1073741824=> 4 MHz -// <2147483648=> 8 MHz - -#ifndef SPI1_DEFAULT_FREQUENCY -#define SPI1_DEFAULT_FREQUENCY 1073741824 -#endif - -// - -// SPI2_ENABLED - Enable SPI2 instance -//========================================================== -#ifndef SPI2_ENABLED -#define SPI2_ENABLED 1 -#endif -// SPI2_USE_EASY_DMA - Use EasyDMA - - -#ifndef SPI2_USE_EASY_DMA -#define SPI2_USE_EASY_DMA 0 -#endif - -// SPI2_DEFAULT_FREQUENCY - SPI frequency - -// <33554432=> 125 kHz -// <67108864=> 250 kHz -// <134217728=> 500 kHz -// <268435456=> 1 MHz -// <536870912=> 2 MHz -// <1073741824=> 4 MHz -// <2147483648=> 8 MHz - -#ifndef SPI2_DEFAULT_FREQUENCY -#define SPI2_DEFAULT_FREQUENCY 1073741824 -#endif - -// - -// - -// QSPI_ENABLED - nrf_drv_qspi - QSPI peripheral driver. +// QSPI_ENABLED - nrf_drv_qspi - QSPI peripheral driver - legacy layer //========================================================== #ifndef QSPI_ENABLED -#define QSPI_ENABLED 1 +#define QSPI_ENABLED 0 #endif -#if QSPI_ENABLED -// QSPI_CONFIG_SCK_DELAY - tSHSL, tWHSL and tSHWL in number of 16 MHz periods (62.5 ns). <0-255> +// QSPI_CONFIG_SCK_DELAY - tSHSL, tWHSL and tSHWL in number of 16 MHz periods (62.5 ns). <0-255> #ifndef QSPI_CONFIG_SCK_DELAY #define QSPI_CONFIG_SCK_DELAY 1 #endif -// QSPI_CONFIG_READOC - Number of data lines and opcode used for reading. +// QSPI_CONFIG_XIP_OFFSET - Address offset in the external memory for Execute in Place operation. +#ifndef QSPI_CONFIG_XIP_OFFSET +#define QSPI_CONFIG_XIP_OFFSET 0 +#endif -// <0=> FastRead -// <1=> Read2O -// <2=> Read2IO -// <3=> Read4O -// <4=> Read4IO +// QSPI_CONFIG_READOC - Number of data lines and opcode used for reading. + +// <0=> FastRead +// <1=> Read2O +// <2=> Read2IO +// <3=> Read4O +// <4=> Read4IO #ifndef QSPI_CONFIG_READOC -#define QSPI_CONFIG_READOC 4 +#define QSPI_CONFIG_READOC 0 #endif // QSPI_CONFIG_WRITEOC - Number of data lines and opcode used for writing. - -// <0=> PP -// <1=> PP2O -// <2=> PP4O -// <3=> PP4IO + +// <0=> PP +// <1=> PP2O +// <2=> PP4O +// <3=> PP4IO #ifndef QSPI_CONFIG_WRITEOC -#define QSPI_CONFIG_WRITEOC 3 +#define QSPI_CONFIG_WRITEOC 0 #endif // QSPI_CONFIG_ADDRMODE - Addressing mode. - -// <0=> 24bit -// <1=> 32bit + +// <0=> 24bit +// <1=> 32bit #ifndef QSPI_CONFIG_ADDRMODE #define QSPI_CONFIG_ADDRMODE 0 #endif // QSPI_CONFIG_MODE - SPI mode. - -// <0=> Mode 0 -// <1=> Mode 1 + +// <0=> Mode 0 +// <1=> Mode 1 #ifndef QSPI_CONFIG_MODE #define QSPI_CONFIG_MODE 0 #endif // QSPI_CONFIG_FREQUENCY - Frequency divider. - -// <0=> 32MHz/1 -// <1=> 32MHz/2 -// <2=> 32MHz/3 -// <3=> 32MHz/4 -// <4=> 32MHz/5 -// <5=> 32MHz/6 -// <6=> 32MHz/7 -// <7=> 32MHz/8 -// <8=> 32MHz/9 -// <9=> 32MHz/10 -// <10=> 32MHz/11 -// <11=> 32MHz/12 -// <12=> 32MHz/13 -// <13=> 32MHz/14 -// <14=> 32MHz/15 -// <15=> 32MHz/16 + +// <0=> 32MHz/1 +// <1=> 32MHz/2 +// <2=> 32MHz/3 +// <3=> 32MHz/4 +// <4=> 32MHz/5 +// <5=> 32MHz/6 +// <6=> 32MHz/7 +// <7=> 32MHz/8 +// <8=> 32MHz/9 +// <9=> 32MHz/10 +// <10=> 32MHz/11 +// <11=> 32MHz/12 +// <12=> 32MHz/13 +// <13=> 32MHz/14 +// <14=> 32MHz/15 +// <15=> 32MHz/16 #ifndef QSPI_CONFIG_FREQUENCY -#define QSPI_CONFIG_FREQUENCY 1 +#define QSPI_CONFIG_FREQUENCY 15 #endif // QSPI_PIN_SCK - SCK pin value. @@ -2856,117 +4932,426 @@ #endif // QSPI_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef QSPI_CONFIG_IRQ_PRIORITY #define QSPI_CONFIG_IRQ_PRIORITY 7 #endif -#endif //QSPI_ENABLED +// + +// RNG_ENABLED - nrf_drv_rng - RNG peripheral driver - legacy layer +//========================================================== +#ifndef RNG_ENABLED +#define RNG_ENABLED 0 +#endif +// RNG_CONFIG_ERROR_CORRECTION - Error correction + + +#ifndef RNG_CONFIG_ERROR_CORRECTION +#define RNG_CONFIG_ERROR_CORRECTION 1 +#endif + +// RNG_CONFIG_POOL_SIZE - Pool size +#ifndef RNG_CONFIG_POOL_SIZE +#define RNG_CONFIG_POOL_SIZE 64 +#endif + +// RNG_CONFIG_IRQ_PRIORITY - Interrupt priority + + +// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef RNG_CONFIG_IRQ_PRIORITY +#define RNG_CONFIG_IRQ_PRIORITY 7 +#endif + +// + +// RTC_ENABLED - nrf_drv_rtc - RTC peripheral driver - legacy layer +//========================================================== +#ifndef RTC_ENABLED +#define RTC_ENABLED 0 +#endif +// RTC_DEFAULT_CONFIG_FREQUENCY - Frequency <16-32768> + + +#ifndef RTC_DEFAULT_CONFIG_FREQUENCY +#define RTC_DEFAULT_CONFIG_FREQUENCY 32768 +#endif + +// RTC_DEFAULT_CONFIG_RELIABLE - Ensures safe compare event triggering + + +#ifndef RTC_DEFAULT_CONFIG_RELIABLE +#define RTC_DEFAULT_CONFIG_RELIABLE 0 +#endif + +// RTC_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + + +// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef RTC_DEFAULT_CONFIG_IRQ_PRIORITY +#define RTC_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// RTC0_ENABLED - Enable RTC0 instance + + +#ifndef RTC0_ENABLED +#define RTC0_ENABLED 0 +#endif + +// RTC1_ENABLED - Enable RTC1 instance + + +#ifndef RTC1_ENABLED +#define RTC1_ENABLED 0 +#endif + +// RTC2_ENABLED - Enable RTC2 instance + + +#ifndef RTC2_ENABLED +#define RTC2_ENABLED 0 +#endif + +// NRF_MAXIMUM_LATENCY_US - Maximum possible time[us] in highest priority interrupt +#ifndef NRF_MAXIMUM_LATENCY_US +#define NRF_MAXIMUM_LATENCY_US 2000 +#endif + +// + +// SAADC_ENABLED - nrf_drv_saadc - SAADC peripheral driver - legacy layer +//========================================================== +#ifndef SAADC_ENABLED +#define SAADC_ENABLED 1 +#endif +// SAADC_CONFIG_RESOLUTION - Resolution + +// <0=> 8 bit +// <1=> 10 bit +// <2=> 12 bit +// <3=> 14 bit + +#ifndef SAADC_CONFIG_RESOLUTION +#define SAADC_CONFIG_RESOLUTION 1 +#endif + +// SAADC_CONFIG_OVERSAMPLE - Sample period + +// <0=> Disabled +// <1=> 2x +// <2=> 4x +// <3=> 8x +// <4=> 16x +// <5=> 32x +// <6=> 64x +// <7=> 128x +// <8=> 256x + +#ifndef SAADC_CONFIG_OVERSAMPLE +#define SAADC_CONFIG_OVERSAMPLE 0 +#endif + +// SAADC_CONFIG_LP_MODE - Enabling low power mode + + +#ifndef SAADC_CONFIG_LP_MODE +#define SAADC_CONFIG_LP_MODE 0 +#endif + +// SAADC_CONFIG_IRQ_PRIORITY - Interrupt priority + + +// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef SAADC_CONFIG_IRQ_PRIORITY +#define SAADC_CONFIG_IRQ_PRIORITY 7 +#endif + +// + +// SPIS_ENABLED - nrf_drv_spis - SPIS peripheral driver - legacy layer +//========================================================== +#ifndef SPIS_ENABLED +#define SPIS_ENABLED 0 +#endif +// SPIS_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + + +// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef SPIS_DEFAULT_CONFIG_IRQ_PRIORITY +#define SPIS_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// SPIS_DEFAULT_MODE - Mode + +// <0=> MODE_0 +// <1=> MODE_1 +// <2=> MODE_2 +// <3=> MODE_3 + +#ifndef SPIS_DEFAULT_MODE +#define SPIS_DEFAULT_MODE 0 +#endif + +// SPIS_DEFAULT_BIT_ORDER - SPIS default bit order + +// <0=> MSB first +// <1=> LSB first + +#ifndef SPIS_DEFAULT_BIT_ORDER +#define SPIS_DEFAULT_BIT_ORDER 0 +#endif + +// SPIS_DEFAULT_DEF - SPIS default DEF character <0-255> + + +#ifndef SPIS_DEFAULT_DEF +#define SPIS_DEFAULT_DEF 255 +#endif + +// SPIS_DEFAULT_ORC - SPIS default ORC character <0-255> + + +#ifndef SPIS_DEFAULT_ORC +#define SPIS_DEFAULT_ORC 255 +#endif + +// SPIS0_ENABLED - Enable SPIS0 instance + + +#ifndef SPIS0_ENABLED +#define SPIS0_ENABLED 0 +#endif + +// SPIS1_ENABLED - Enable SPIS1 instance + + +#ifndef SPIS1_ENABLED +#define SPIS1_ENABLED 0 +#endif + +// SPIS2_ENABLED - Enable SPIS2 instance + + +#ifndef SPIS2_ENABLED +#define SPIS2_ENABLED 0 +#endif + +// + +// SPI_ENABLED - nrf_drv_spi - SPI/SPIM peripheral driver - legacy layer +//========================================================== +#ifndef SPI_ENABLED +#define SPI_ENABLED 0 +#endif +// SPI_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + + +// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef SPI_DEFAULT_CONFIG_IRQ_PRIORITY +#define SPI_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + +// NRF_SPI_DRV_MISO_PULLUP_CFG - MISO PIN pull-up configuration. + +// <0=> NRF_GPIO_PIN_NOPULL +// <1=> NRF_GPIO_PIN_PULLDOWN +// <3=> NRF_GPIO_PIN_PULLUP + +#ifndef NRF_SPI_DRV_MISO_PULLUP_CFG +#define NRF_SPI_DRV_MISO_PULLUP_CFG 1 +#endif + +// SPI0_ENABLED - Enable SPI0 instance +//========================================================== +#ifndef SPI0_ENABLED +#define SPI0_ENABLED 1 +#endif +// SPI0_USE_EASY_DMA - Use EasyDMA + + +#ifndef SPI0_USE_EASY_DMA +#define SPI0_USE_EASY_DMA 1 +#endif + +// + +// SPI1_ENABLED - Enable SPI1 instance +//========================================================== +#ifndef SPI1_ENABLED +#define SPI1_ENABLED 1 +#endif +// SPI1_USE_EASY_DMA - Use EasyDMA + + +#ifndef SPI1_USE_EASY_DMA +#define SPI1_USE_EASY_DMA 1 +#endif + +// + +// SPI2_ENABLED - Enable SPI2 instance +//========================================================== +#ifndef SPI2_ENABLED +#define SPI2_ENABLED 1 +#endif +// SPI2_USE_EASY_DMA - Use EasyDMA + + +#ifndef SPI2_USE_EASY_DMA +#define SPI2_USE_EASY_DMA 1 +#endif // // -// TIMER_ENABLED - nrf_drv_timer - TIMER periperal driver +// TIMER_ENABLED - nrf_drv_timer - TIMER periperal driver - legacy layer //========================================================== #ifndef TIMER_ENABLED #define TIMER_ENABLED 0 #endif // TIMER_DEFAULT_CONFIG_FREQUENCY - Timer frequency if in Timer mode - -// <0=> 16 MHz -// <1=> 8 MHz -// <2=> 4 MHz -// <3=> 2 MHz -// <4=> 1 MHz -// <5=> 500 kHz -// <6=> 250 kHz -// <7=> 125 kHz -// <8=> 62.5 kHz -// <9=> 31.25 kHz + +// <0=> 16 MHz +// <1=> 8 MHz +// <2=> 4 MHz +// <3=> 2 MHz +// <4=> 1 MHz +// <5=> 500 kHz +// <6=> 250 kHz +// <7=> 125 kHz +// <8=> 62.5 kHz +// <9=> 31.25 kHz #ifndef TIMER_DEFAULT_CONFIG_FREQUENCY #define TIMER_DEFAULT_CONFIG_FREQUENCY 0 #endif // TIMER_DEFAULT_CONFIG_MODE - Timer mode or operation - -// <0=> Timer -// <1=> Counter + +// <0=> Timer +// <1=> Counter #ifndef TIMER_DEFAULT_CONFIG_MODE #define TIMER_DEFAULT_CONFIG_MODE 0 #endif // TIMER_DEFAULT_CONFIG_BIT_WIDTH - Timer counter bit width - -// <0=> 16 bit -// <1=> 8 bit -// <2=> 24 bit -// <3=> 32 bit + +// <0=> 16 bit +// <1=> 8 bit +// <2=> 24 bit +// <3=> 32 bit #ifndef TIMER_DEFAULT_CONFIG_BIT_WIDTH #define TIMER_DEFAULT_CONFIG_BIT_WIDTH 0 #endif // TIMER_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef TIMER_DEFAULT_CONFIG_IRQ_PRIORITY #define TIMER_DEFAULT_CONFIG_IRQ_PRIORITY 7 #endif // TIMER0_ENABLED - Enable TIMER0 instance - + #ifndef TIMER0_ENABLED #define TIMER0_ENABLED 0 #endif // TIMER1_ENABLED - Enable TIMER1 instance - + #ifndef TIMER1_ENABLED #define TIMER1_ENABLED 0 #endif // TIMER2_ENABLED - Enable TIMER2 instance - + #ifndef TIMER2_ENABLED #define TIMER2_ENABLED 0 #endif // TIMER3_ENABLED - Enable TIMER3 instance - + #ifndef TIMER3_ENABLED #define TIMER3_ENABLED 0 #endif // TIMER4_ENABLED - Enable TIMER4 instance - + #ifndef TIMER4_ENABLED #define TIMER4_ENABLED 0 @@ -2974,74 +5359,27 @@ // -// TWIS_ENABLED - nrf_drv_twis - TWIS peripheral driver +// TWIS_ENABLED - nrf_drv_twis - TWIS peripheral driver - legacy layer //========================================================== #ifndef TWIS_ENABLED #define TWIS_ENABLED 0 #endif -// TWIS_DEFAULT_CONFIG_ADDR0 - Address0 -#ifndef TWIS_DEFAULT_CONFIG_ADDR0 -#define TWIS_DEFAULT_CONFIG_ADDR0 0 -#endif - -// TWIS_DEFAULT_CONFIG_ADDR1 - Address1 -#ifndef TWIS_DEFAULT_CONFIG_ADDR1 -#define TWIS_DEFAULT_CONFIG_ADDR1 0 -#endif - -// TWIS_DEFAULT_CONFIG_SCL_PULL - SCL pin pull configuration - -// <0=> Disabled -// <1=> Pull down -// <3=> Pull up - -#ifndef TWIS_DEFAULT_CONFIG_SCL_PULL -#define TWIS_DEFAULT_CONFIG_SCL_PULL 0 -#endif - -// TWIS_DEFAULT_CONFIG_SDA_PULL - SDA pin pull configuration - -// <0=> Disabled -// <1=> Pull down -// <3=> Pull up - -#ifndef TWIS_DEFAULT_CONFIG_SDA_PULL -#define TWIS_DEFAULT_CONFIG_SDA_PULL 0 -#endif - -// TWIS_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - - -// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 - -#ifndef TWIS_DEFAULT_CONFIG_IRQ_PRIORITY -#define TWIS_DEFAULT_CONFIG_IRQ_PRIORITY 7 -#endif - // TWIS0_ENABLED - Enable TWIS0 instance - + #ifndef TWIS0_ENABLED #define TWIS0_ENABLED 0 #endif // TWIS1_ENABLED - Enable TWIS1 instance - + #ifndef TWIS1_ENABLED #define TWIS1_ENABLED 0 #endif // TWIS_ASSUME_INIT_AFTER_RESET_ONLY - Assume that any instance would be initialized only once - + // Optimization flag. Registers used by TWIS are shared by other peripherals. Normally, during initialization driver tries to clear all registers to known state before doing the initialization itself. This gives initialization safe procedure, no matter when it would be called. If you activate TWIS only once and do never uninitialize it - set this flag to 1 what gives more optimal code. @@ -3050,7 +5388,7 @@ #endif // TWIS_NO_SYNC_MODE - Remove support for synchronous mode - + // Synchronous mode would be used in specific situations. And it uses some additional code and data memory to safely process state machine by polling it in status functions. If this functionality is not required it may be disabled to free some resources. @@ -3058,49 +5396,96 @@ #define TWIS_NO_SYNC_MODE 0 #endif +// TWIS_DEFAULT_CONFIG_ADDR0 - Address0 +#ifndef TWIS_DEFAULT_CONFIG_ADDR0 +#define TWIS_DEFAULT_CONFIG_ADDR0 0 +#endif + +// TWIS_DEFAULT_CONFIG_ADDR1 - Address1 +#ifndef TWIS_DEFAULT_CONFIG_ADDR1 +#define TWIS_DEFAULT_CONFIG_ADDR1 0 +#endif + +// TWIS_DEFAULT_CONFIG_SCL_PULL - SCL pin pull configuration + +// <0=> Disabled +// <1=> Pull down +// <3=> Pull up + +#ifndef TWIS_DEFAULT_CONFIG_SCL_PULL +#define TWIS_DEFAULT_CONFIG_SCL_PULL 0 +#endif + +// TWIS_DEFAULT_CONFIG_SDA_PULL - SDA pin pull configuration + +// <0=> Disabled +// <1=> Pull down +// <3=> Pull up + +#ifndef TWIS_DEFAULT_CONFIG_SDA_PULL +#define TWIS_DEFAULT_CONFIG_SDA_PULL 0 +#endif + +// TWIS_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority + + +// Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 + +#ifndef TWIS_DEFAULT_CONFIG_IRQ_PRIORITY +#define TWIS_DEFAULT_CONFIG_IRQ_PRIORITY 7 +#endif + // -// TWI_ENABLED - nrf_drv_twi - TWI/TWIM peripheral driver +// TWI_ENABLED - nrf_drv_twi - TWI/TWIM peripheral driver - legacy layer //========================================================== #ifndef TWI_ENABLED #define TWI_ENABLED 1 #endif // TWI_DEFAULT_CONFIG_FREQUENCY - Frequency - -// <26738688=> 100k -// <67108864=> 250k -// <104857600=> 400k + +// <26738688=> 100k +// <67108864=> 250k +// <104857600=> 400k #ifndef TWI_DEFAULT_CONFIG_FREQUENCY #define TWI_DEFAULT_CONFIG_FREQUENCY 26738688 #endif // TWI_DEFAULT_CONFIG_CLR_BUS_INIT - Enables bus clearing procedure during init - + #ifndef TWI_DEFAULT_CONFIG_CLR_BUS_INIT #define TWI_DEFAULT_CONFIG_CLR_BUS_INIT 0 #endif // TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT - Enables bus holding after uninit - + #ifndef TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT #define TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT 0 #endif // TWI_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef TWI_DEFAULT_CONFIG_IRQ_PRIORITY #define TWI_DEFAULT_CONFIG_IRQ_PRIORITY 7 @@ -3112,7 +5497,7 @@ #define TWI0_ENABLED 1 #endif // TWI0_USE_EASY_DMA - Use EasyDMA (if present) - + #ifndef TWI0_USE_EASY_DMA #define TWI0_USE_EASY_DMA 0 @@ -3126,7 +5511,7 @@ #define TWI1_ENABLED 1 #endif // TWI1_USE_EASY_DMA - Use EasyDMA (if present) - + #ifndef TWI1_USE_EASY_DMA #define TWI1_USE_EASY_DMA 0 @@ -3136,78 +5521,78 @@ // -// UART_ENABLED - nrf_drv_uart - UART/UARTE peripheral driver +// UART_ENABLED - nrf_drv_uart - UART/UARTE peripheral driver - legacy layer //========================================================== #ifndef UART_ENABLED -#define UART_ENABLED 1 +#define UART_ENABLED 0 #endif // UART_DEFAULT_CONFIG_HWFC - Hardware Flow Control - -// <0=> Disabled -// <1=> Enabled + +// <0=> Disabled +// <1=> Enabled #ifndef UART_DEFAULT_CONFIG_HWFC -#define UART_DEFAULT_CONFIG_HWFC 1 +#define UART_DEFAULT_CONFIG_HWFC 0 #endif // UART_DEFAULT_CONFIG_PARITY - Parity - -// <0=> Excluded -// <14=> Included + +// <0=> Excluded +// <14=> Included #ifndef UART_DEFAULT_CONFIG_PARITY #define UART_DEFAULT_CONFIG_PARITY 0 #endif // UART_DEFAULT_CONFIG_BAUDRATE - Default Baudrate - -// <323584=> 1200 baud -// <643072=> 2400 baud -// <1290240=> 4800 baud -// <2576384=> 9600 baud -// <3862528=> 14400 baud -// <5152768=> 19200 baud -// <7716864=> 28800 baud -// <10289152=> 38400 baud -// <15400960=> 57600 baud -// <20615168=> 76800 baud -// <30801920=> 115200 baud -// <61865984=> 230400 baud -// <67108864=> 250000 baud -// <121634816=> 460800 baud -// <251658240=> 921600 baud -// <268435456=> 1000000 baud + +// <323584=> 1200 baud +// <643072=> 2400 baud +// <1290240=> 4800 baud +// <2576384=> 9600 baud +// <3862528=> 14400 baud +// <5152768=> 19200 baud +// <7716864=> 28800 baud +// <10289152=> 38400 baud +// <15400960=> 57600 baud +// <20615168=> 76800 baud +// <30801920=> 115200 baud +// <61865984=> 230400 baud +// <67108864=> 250000 baud +// <121634816=> 460800 baud +// <251658240=> 921600 baud +// <268435456=> 1000000 baud #ifndef UART_DEFAULT_CONFIG_BAUDRATE -#define UART_DEFAULT_CONFIG_BAUDRATE 2576384 +#define UART_DEFAULT_CONFIG_BAUDRATE 30801920 #endif // UART_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef UART_DEFAULT_CONFIG_IRQ_PRIORITY #define UART_DEFAULT_CONFIG_IRQ_PRIORITY 7 #endif // UART_EASY_DMA_SUPPORT - Driver supporting EasyDMA - + #ifndef UART_EASY_DMA_SUPPORT #define UART_EASY_DMA_SUPPORT 1 #endif // UART_LEGACY_SUPPORT - Driver supporting Legacy mode - + #ifndef UART_LEGACY_SUPPORT #define UART_LEGACY_SUPPORT 1 @@ -3219,7 +5604,7 @@ #define UART0_ENABLED 1 #endif // UART0_CONFIG_USE_EASY_DMA - Default setting for using EasyDMA - + #ifndef UART0_CONFIG_USE_EASY_DMA #define UART0_CONFIG_USE_EASY_DMA 1 @@ -3230,15 +5615,8 @@ // UART1_ENABLED - Enable UART1 instance //========================================================== #ifndef UART1_ENABLED -#define UART1_ENABLED 1 +#define UART1_ENABLED 0 #endif -// UART1_CONFIG_USE_EASY_DMA - Default setting for using EasyDMA - - -#ifndef UART1_CONFIG_USE_EASY_DMA -#define UART1_CONFIG_USE_EASY_DMA 1 -#endif - // // @@ -3249,50 +5627,50 @@ #define USBD_ENABLED 0 #endif // USBD_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef USBD_CONFIG_IRQ_PRIORITY #define USBD_CONFIG_IRQ_PRIORITY 7 #endif -// NRF_DRV_USBD_DMASCHEDULER_MODE - USBD SMA scheduler working scheme +// USBD_CONFIG_DMASCHEDULER_MODE - USBD SMA scheduler working scheme + +// <0=> Prioritized access +// <1=> Round Robin -// <0=> Prioritized access -// <1=> Round Robin - -#ifndef NRF_DRV_USBD_DMASCHEDULER_MODE -#define NRF_DRV_USBD_DMASCHEDULER_MODE 0 +#ifndef USBD_CONFIG_DMASCHEDULER_MODE +#define USBD_CONFIG_DMASCHEDULER_MODE 0 #endif // -// WDT_ENABLED - nrf_drv_wdt - WDT peripheral driver +// WDT_ENABLED - nrf_drv_wdt - WDT peripheral driver - legacy layer //========================================================== #ifndef WDT_ENABLED #define WDT_ENABLED 0 #endif // WDT_CONFIG_BEHAVIOUR - WDT behavior in CPU SLEEP or HALT mode - -// <1=> Run in SLEEP, Pause in HALT -// <8=> Pause in SLEEP, Run in HALT -// <9=> Run in SLEEP and HALT -// <0=> Pause in SLEEP and HALT + +// <1=> Run in SLEEP, Pause in HALT +// <8=> Pause in SLEEP, Run in HALT +// <9=> Run in SLEEP and HALT +// <0=> Pause in SLEEP and HALT #ifndef WDT_CONFIG_BEHAVIOUR #define WDT_CONFIG_BEHAVIOUR 1 #endif -// WDT_CONFIG_RELOAD_VALUE - Reload value <15-4294967295> +// WDT_CONFIG_RELOAD_VALUE - Reload value <15-4294967295> #ifndef WDT_CONFIG_RELOAD_VALUE @@ -3300,17 +5678,17 @@ #endif // WDT_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef WDT_CONFIG_IRQ_PRIORITY #define WDT_CONFIG_IRQ_PRIORITY 7 @@ -3318,21 +5696,34 @@ // -// +// //========================================================== -// nRF_Libraries +// nRF_Drivers_External + +//========================================================== +// NRF_TWI_SENSOR_ENABLED - nrf_twi_sensor - nRF TWI Sensor module + + +#ifndef NRF_TWI_SENSOR_ENABLED +#define NRF_TWI_SENSOR_ENABLED 0 +#endif + +// +//========================================================== + +// nRF_Libraries //========================================================== // APP_GPIOTE_ENABLED - app_gpiote - GPIOTE events dispatcher - + #ifndef APP_GPIOTE_ENABLED #define APP_GPIOTE_ENABLED 0 #endif // APP_PWM_ENABLED - app_pwm - PWM functionality - + #ifndef APP_PWM_ENABLED #define APP_PWM_ENABLED 0 @@ -3344,14 +5735,14 @@ #define APP_SCHEDULER_ENABLED 0 #endif // APP_SCHEDULER_WITH_PAUSE - Enabling pause feature - + #ifndef APP_SCHEDULER_WITH_PAUSE #define APP_SCHEDULER_WITH_PAUSE 0 #endif // APP_SCHEDULER_WITH_PROFILER - Enabling scheduler profiling - + #ifndef APP_SCHEDULER_WITH_PROFILER #define APP_SCHEDULER_WITH_PROFILER 0 @@ -3359,42 +5750,87 @@ // +// APP_SDCARD_ENABLED - app_sdcard - SD/MMC card support using SPI +//========================================================== +#ifndef APP_SDCARD_ENABLED +#define APP_SDCARD_ENABLED 0 +#endif +// APP_SDCARD_SPI_INSTANCE - SPI instance used + +// <0=> 0 +// <1=> 1 +// <2=> 2 + +#ifndef APP_SDCARD_SPI_INSTANCE +#define APP_SDCARD_SPI_INSTANCE 0 +#endif + +// APP_SDCARD_FREQ_INIT - SPI frequency + +// <33554432=> 125 kHz +// <67108864=> 250 kHz +// <134217728=> 500 kHz +// <268435456=> 1 MHz +// <536870912=> 2 MHz +// <1073741824=> 4 MHz +// <2147483648=> 8 MHz + +#ifndef APP_SDCARD_FREQ_INIT +#define APP_SDCARD_FREQ_INIT 67108864 +#endif + +// APP_SDCARD_FREQ_DATA - SPI frequency + +// <33554432=> 125 kHz +// <67108864=> 250 kHz +// <134217728=> 500 kHz +// <268435456=> 1 MHz +// <536870912=> 2 MHz +// <1073741824=> 4 MHz +// <2147483648=> 8 MHz + +#ifndef APP_SDCARD_FREQ_DATA +#define APP_SDCARD_FREQ_DATA 1073741824 +#endif + +// + // APP_TIMER_ENABLED - app_timer - Application timer functionality //========================================================== #ifndef APP_TIMER_ENABLED #define APP_TIMER_ENABLED 0 #endif // APP_TIMER_CONFIG_RTC_FREQUENCY - Configure RTC prescaler. - -// <0=> 32768 Hz -// <1=> 16384 Hz -// <3=> 8192 Hz -// <7=> 4096 Hz -// <15=> 2048 Hz -// <31=> 1024 Hz + +// <0=> 32768 Hz +// <1=> 16384 Hz +// <3=> 8192 Hz +// <7=> 4096 Hz +// <15=> 2048 Hz +// <31=> 1024 Hz #ifndef APP_TIMER_CONFIG_RTC_FREQUENCY #define APP_TIMER_CONFIG_RTC_FREQUENCY 0 #endif // APP_TIMER_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef APP_TIMER_CONFIG_IRQ_PRIORITY #define APP_TIMER_CONFIG_IRQ_PRIORITY 7 #endif -// APP_TIMER_CONFIG_OP_QUEUE_SIZE - Capacity of timer requests queue. +// APP_TIMER_CONFIG_OP_QUEUE_SIZE - Capacity of timer requests queue. // Size of the queue depends on how many timers are used // in the system, how often timers are started and overall // system latency. If queue size is too small app_timer calls @@ -3405,21 +5841,14 @@ #endif // APP_TIMER_CONFIG_USE_SCHEDULER - Enable scheduling app_timer events to app_scheduler - + #ifndef APP_TIMER_CONFIG_USE_SCHEDULER #define APP_TIMER_CONFIG_USE_SCHEDULER 0 #endif -// APP_TIMER_WITH_PROFILER - Enable app_timer profiling - - -#ifndef APP_TIMER_WITH_PROFILER -#define APP_TIMER_WITH_PROFILER 0 -#endif - // APP_TIMER_KEEPS_RTC_ACTIVE - Enable RTC always on - + // If option is enabled RTC is kept running even if there is no active timers. // This option can be used when app_timer is used for timestamping. @@ -3428,111 +5857,259 @@ #define APP_TIMER_KEEPS_RTC_ACTIVE 0 #endif -// APP_TIMER_CONFIG_SWI_NUMBER - Configure SWI instance used. +// App Timer Legacy configuration - Legacy configuration. -// <0=> 0 -// <1=> 1 +//========================================================== +// APP_TIMER_WITH_PROFILER - Enable app_timer profiling + + +#ifndef APP_TIMER_WITH_PROFILER +#define APP_TIMER_WITH_PROFILER 0 +#endif + +// APP_TIMER_CONFIG_SWI_NUMBER - Configure SWI instance used. + #ifndef APP_TIMER_CONFIG_SWI_NUMBER #define APP_TIMER_CONFIG_SWI_NUMBER 0 #endif -// - -// NRF_TWI_MNGR_ENABLED - nrf_twi_mngr - TWI transaction manager - - -#ifndef NRF_TWI_MNGR_ENABLED -#define NRF_TWI_MNGR_ENABLED 0 -#endif - -// APP_UART_ENABLED - app_uart - UART driver +// //========================================================== -#ifndef APP_UART_ENABLED -#define APP_UART_ENABLED 0 + +// + +// APP_USBD_AUDIO_ENABLED - app_usbd_audio - USB AUDIO class + + +#ifndef APP_USBD_AUDIO_ENABLED +#define APP_USBD_AUDIO_ENABLED 0 #endif -// APP_UART_DRIVER_INSTANCE - UART instance used -// <0=> 0 +// APP_USBD_CDC_ACM_ENABLED - app_usbd_cdc_acm - USB CDC ACM class + -#ifndef APP_UART_DRIVER_INSTANCE -#define APP_UART_DRIVER_INSTANCE 0 +#ifndef APP_USBD_CDC_ACM_ENABLED +#define APP_USBD_CDC_ACM_ENABLED 0 +#endif + +// APP_USBD_ENABLED - app_usbd - USB Device library +//========================================================== +#ifndef APP_USBD_ENABLED +#define APP_USBD_ENABLED 0 +#endif +// APP_USBD_VID - Vendor ID <0x0000-0xFFFF> + + +// Vendor ID ordered from USB IF: http://www.usb.org/developers/vendor/ + +#ifndef APP_USBD_VID +#define APP_USBD_VID 0 +#endif + +// APP_USBD_PID - Product ID <0x0000-0xFFFF> + + +// Selected Product ID + +#ifndef APP_USBD_PID +#define APP_USBD_PID 0 +#endif + +// APP_USBD_DEVICE_VER_MAJOR - Device version, major part <0-99> + + +// Device version, will be converted automatically to BCD notation. Use just decimal values. + +#ifndef APP_USBD_DEVICE_VER_MAJOR +#define APP_USBD_DEVICE_VER_MAJOR 1 +#endif + +// APP_USBD_DEVICE_VER_MINOR - Device version, minor part <0-99> + + +// Device version, will be converted automatically to BCD notation. Use just decimal values. + +#ifndef APP_USBD_DEVICE_VER_MINOR +#define APP_USBD_DEVICE_VER_MINOR 0 +#endif + +// APP_USBD_CONFIG_SELF_POWERED - Self powered + + +#ifndef APP_USBD_CONFIG_SELF_POWERED +#define APP_USBD_CONFIG_SELF_POWERED 1 +#endif + +// APP_USBD_CONFIG_MAX_POWER - MaxPower field in configuration descriptor in milliamps <0-500> + + +#ifndef APP_USBD_CONFIG_MAX_POWER +#define APP_USBD_CONFIG_MAX_POWER 500 +#endif + +// APP_USBD_CONFIG_POWER_EVENTS_PROCESS - Process power events + + +// Enable processing power events in USB event handler. + +#ifndef APP_USBD_CONFIG_POWER_EVENTS_PROCESS +#define APP_USBD_CONFIG_POWER_EVENTS_PROCESS 1 +#endif + +// APP_USBD_CONFIG_EVENT_QUEUE_ENABLE - Enable event queue + +// This is the default configuration when all the events are placed into internal queue. +// Disable it when external queue is used like app_scheduler or if you wish to process all events inside interrupts. +// Processing all events from the interrupt level adds requirement not to call any functions that modifies the USBD library state from the context higher than USB interrupt context. +// Functions that modify USBD state are functions for sleep, wakeup, start, stop, enable and disable. +//========================================================== +#ifndef APP_USBD_CONFIG_EVENT_QUEUE_ENABLE +#define APP_USBD_CONFIG_EVENT_QUEUE_ENABLE 1 +#endif +// APP_USBD_CONFIG_EVENT_QUEUE_SIZE - The size of event queue <16-64> + + +// The size of the queue for the events that would be processed in the main loop. + +#ifndef APP_USBD_CONFIG_EVENT_QUEUE_SIZE +#define APP_USBD_CONFIG_EVENT_QUEUE_SIZE 32 +#endif + +// APP_USBD_CONFIG_SOF_HANDLING_MODE - Change SOF events handling mode. + + +// Normal queue - SOF events are pushed normally into event queue. +// Compress queue - SOF events are counted and binded with other events or executed when queue is empty. +// This prevents queue from filling with SOF events. +// Interrupt - SOF events are processed in interrupt. +// <0=> Normal queue +// <1=> Compress queue +// <2=> Interrupt + +#ifndef APP_USBD_CONFIG_SOF_HANDLING_MODE +#define APP_USBD_CONFIG_SOF_HANDLING_MODE 1 #endif // -// APP_USBD_CLASS_AUDIO_ENABLED - app_usbd_audio - USB AUDIO class +// APP_USBD_CONFIG_SOF_TIMESTAMP_PROVIDE - Provide a function that generates timestamps for logs based on the current SOF + +// The function app_usbd_sof_timestamp_get will be implemented if the logger is enabled. +// Use it when initializing the logger. +// SOF processing will be always enabled when this configuration parameter is active. +// Notice that this option is configured outside of APP_USBD_CONFIG_LOG_ENABLED. +// This means that it will work even if the logging in this very module is disabled. -#ifndef APP_USBD_CLASS_AUDIO_ENABLED -#define APP_USBD_CLASS_AUDIO_ENABLED 0 +#ifndef APP_USBD_CONFIG_SOF_TIMESTAMP_PROVIDE +#define APP_USBD_CONFIG_SOF_TIMESTAMP_PROVIDE 0 #endif -// APP_USBD_CLASS_CDC_ACM_ENABLED - app_usbd_cdc_acm - USB CDC ACM class +// APP_USBD_CONFIG_LOG_ENABLED - Enable logging in the module +//========================================================== +#ifndef APP_USBD_CONFIG_LOG_ENABLED +#define APP_USBD_CONFIG_LOG_ENABLED 0 +#endif +// APP_USBD_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug - -#ifndef APP_USBD_CLASS_CDC_ACM_ENABLED -#define APP_USBD_CLASS_CDC_ACM_ENABLED 0 +#ifndef APP_USBD_CONFIG_LOG_LEVEL +#define APP_USBD_CONFIG_LOG_LEVEL 3 #endif -// APP_USBD_CLASS_HID_ENABLED - app_usbd_hid - USB HID class +// APP_USBD_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White +#ifndef APP_USBD_CONFIG_INFO_COLOR +#define APP_USBD_CONFIG_INFO_COLOR 0 +#endif -#ifndef APP_USBD_CLASS_HID_ENABLED -#define APP_USBD_CLASS_HID_ENABLED 0 +// APP_USBD_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef APP_USBD_CONFIG_DEBUG_COLOR +#define APP_USBD_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// + +// APP_USBD_HID_ENABLED - app_usbd_hid - USB HID class + + +#ifndef APP_USBD_HID_ENABLED +#define APP_USBD_HID_ENABLED 0 #endif // APP_USBD_HID_GENERIC_ENABLED - app_usbd_hid_generic - USB HID generic - + #ifndef APP_USBD_HID_GENERIC_ENABLED #define APP_USBD_HID_GENERIC_ENABLED 0 #endif // APP_USBD_HID_KBD_ENABLED - app_usbd_hid_kbd - USB HID keyboard - + #ifndef APP_USBD_HID_KBD_ENABLED #define APP_USBD_HID_KBD_ENABLED 0 #endif // APP_USBD_HID_MOUSE_ENABLED - app_usbd_hid_mouse - USB HID mouse - + #ifndef APP_USBD_HID_MOUSE_ENABLED #define APP_USBD_HID_MOUSE_ENABLED 0 #endif // APP_USBD_MSC_ENABLED - app_usbd_msc - USB MSC class - + #ifndef APP_USBD_MSC_ENABLED #define APP_USBD_MSC_ENABLED 0 #endif -// BUTTON_ENABLED - app_button - buttons handling module - - -#ifndef BUTTON_ENABLED -#define BUTTON_ENABLED 0 -#endif - // CRC16_ENABLED - crc16 - CRC16 calculation routines - + #ifndef CRC16_ENABLED #define CRC16_ENABLED 0 #endif // CRC32_ENABLED - crc32 - CRC32 calculation routines - + #ifndef CRC32_ENABLED #define CRC32_ENABLED 0 #endif // ECC_ENABLED - ecc - Elliptic Curve Cryptography Library - + #ifndef ECC_ENABLED #define ECC_ENABLED 0 @@ -3547,7 +6124,7 @@ // Configure the number of virtual pages to use and their size. //========================================================== -// FDS_VIRTUAL_PAGES - Number of virtual flash pages to use. +// FDS_VIRTUAL_PAGES - Number of virtual flash pages to use. // One of the virtual pages is reserved by the system for garbage collection. // Therefore, the minimum is two virtual pages: one page to store data and one page to be used by the system for garbage collection. // The total amount of flash memory that is used by FDS amounts to @ref FDS_VIRTUAL_PAGES * @ref FDS_VIRTUAL_PAGE_SIZE * 4 bytes. @@ -3557,19 +6134,19 @@ #endif // FDS_VIRTUAL_PAGE_SIZE - The size of a virtual flash page. - + // Expressed in number of 4-byte words. // By default, a virtual page is the same size as a physical page. // The size of a virtual page must be a multiple of the size of a physical page. -// <1024=> 1024 -// <2048=> 2048 +// <1024=> 1024 +// <2048=> 2048 #ifndef FDS_VIRTUAL_PAGE_SIZE #define FDS_VIRTUAL_PAGE_SIZE 1024 #endif -// +// //========================================================== // Backend - Backend configuration @@ -3577,31 +6154,31 @@ // Configure which nrf_fstorage backend is used by FDS to write to flash. //========================================================== // FDS_BACKEND - FDS flash backend. - + // NRF_FSTORAGE_SD uses the nrf_fstorage_sd backend implementation using the SoftDevice API. Use this if you have a SoftDevice present. // NRF_FSTORAGE_NVMC uses the nrf_fstorage_nvmc implementation. Use this setting if you don't use the SoftDevice. -// <1=> NRF_FSTORAGE_NVMC -// <2=> NRF_FSTORAGE_SD +// <1=> NRF_FSTORAGE_NVMC +// <2=> NRF_FSTORAGE_SD #ifndef FDS_BACKEND #define FDS_BACKEND 1 #endif -// +// //========================================================== // Queue - Queue settings //========================================================== -// FDS_OP_QUEUE_SIZE - Size of the internal queue. +// FDS_OP_QUEUE_SIZE - Size of the internal queue. // Increase this value if you frequently get synchronous FDS_ERR_NO_SPACE_IN_QUEUES errors. #ifndef FDS_OP_QUEUE_SIZE #define FDS_OP_QUEUE_SIZE 4 #endif -// +// //========================================================== // CRC - CRC functionality @@ -3617,12 +6194,12 @@ #define FDS_CRC_CHECK_ON_READ 0 #endif // FDS_CRC_CHECK_ON_WRITE - Perform a CRC check on newly written records. - + // Perform a CRC check on newly written records. // This setting can be used to make sure that the record data was not altered while being written to flash. -// <1=> Enabled -// <0=> Disabled +// <1=> Enabled +// <0=> Disabled #ifndef FDS_CRC_CHECK_ON_WRITE #define FDS_CRC_CHECK_ON_WRITE 0 @@ -3630,18 +6207,18 @@ // -// +// //========================================================== // Users - Number of users //========================================================== -// FDS_MAX_USERS - Maximum number of callbacks that can be registered. +// FDS_MAX_USERS - Maximum number of callbacks that can be registered. #ifndef FDS_MAX_USERS #define FDS_MAX_USERS 4 #endif -// +// //========================================================== // @@ -3652,7 +6229,7 @@ #define HARDFAULT_HANDLER_ENABLED 0 #endif // HARDFAULT_HANDLER_GDB_PSP_BACKTRACE - Bypass the GDB problem with multiple stack pointers backtrace - + // There is a known bug in GDB which causes it to incorrectly backtrace the code // when multiple stack pointers are used (main and process stack pointers). @@ -3673,17 +6250,17 @@ #ifndef HCI_MEM_POOL_ENABLED #define HCI_MEM_POOL_ENABLED 0 #endif -// HCI_TX_BUF_SIZE - TX buffer size in bytes. +// HCI_TX_BUF_SIZE - TX buffer size in bytes. #ifndef HCI_TX_BUF_SIZE #define HCI_TX_BUF_SIZE 600 #endif -// HCI_RX_BUF_SIZE - RX buffer size in bytes. +// HCI_RX_BUF_SIZE - RX buffer size in bytes. #ifndef HCI_RX_BUF_SIZE #define HCI_RX_BUF_SIZE 600 #endif -// HCI_RX_BUF_QUEUE_SIZE - RX buffer queue size. +// HCI_RX_BUF_QUEUE_SIZE - RX buffer queue size. #ifndef HCI_RX_BUF_QUEUE_SIZE #define HCI_RX_BUF_QUEUE_SIZE 4 #endif @@ -3696,55 +6273,55 @@ #define HCI_SLIP_ENABLED 0 #endif // HCI_UART_BAUDRATE - Default Baudrate - -// <323584=> 1200 baud -// <643072=> 2400 baud -// <1290240=> 4800 baud -// <2576384=> 9600 baud -// <3862528=> 14400 baud -// <5152768=> 19200 baud -// <7716864=> 28800 baud -// <10289152=> 38400 baud -// <15400960=> 57600 baud -// <20615168=> 76800 baud -// <30801920=> 115200 baud -// <61865984=> 230400 baud -// <67108864=> 250000 baud -// <121634816=> 460800 baud -// <251658240=> 921600 baud -// <268435456=> 1000000 baud + +// <323584=> 1200 baud +// <643072=> 2400 baud +// <1290240=> 4800 baud +// <2576384=> 9600 baud +// <3862528=> 14400 baud +// <5152768=> 19200 baud +// <7716864=> 28800 baud +// <10289152=> 38400 baud +// <15400960=> 57600 baud +// <20615168=> 76800 baud +// <30801920=> 115200 baud +// <61865984=> 230400 baud +// <67108864=> 250000 baud +// <121634816=> 460800 baud +// <251658240=> 921600 baud +// <268435456=> 1000000 baud #ifndef HCI_UART_BAUDRATE #define HCI_UART_BAUDRATE 30801920 #endif // HCI_UART_FLOW_CONTROL - Hardware Flow Control - -// <0=> Disabled -// <1=> Enabled + +// <0=> Disabled +// <1=> Enabled #ifndef HCI_UART_FLOW_CONTROL #define HCI_UART_FLOW_CONTROL 0 #endif -// HCI_UART_RX_PIN - UART RX pin +// HCI_UART_RX_PIN - UART RX pin #ifndef HCI_UART_RX_PIN -#define HCI_UART_RX_PIN 8 +#define HCI_UART_RX_PIN 31 #endif -// HCI_UART_TX_PIN - UART TX pin +// HCI_UART_TX_PIN - UART TX pin #ifndef HCI_UART_TX_PIN -#define HCI_UART_TX_PIN 6 +#define HCI_UART_TX_PIN 31 #endif -// HCI_UART_RTS_PIN - UART RTS pin +// HCI_UART_RTS_PIN - UART RTS pin #ifndef HCI_UART_RTS_PIN -#define HCI_UART_RTS_PIN 5 +#define HCI_UART_RTS_PIN 31 #endif -// HCI_UART_CTS_PIN - UART CTS pin +// HCI_UART_CTS_PIN - UART CTS pin #ifndef HCI_UART_CTS_PIN -#define HCI_UART_CTS_PIN 7 +#define HCI_UART_CTS_PIN 31 #endif // @@ -3754,7 +6331,7 @@ #ifndef HCI_TRANSPORT_ENABLED #define HCI_TRANSPORT_ENABLED 0 #endif -// HCI_MAX_PACKET_SIZE_IN_BITS - Maximum size of a single application packet in bits. +// HCI_MAX_PACKET_SIZE_IN_BITS - Maximum size of a single application packet in bits. #ifndef HCI_MAX_PACKET_SIZE_IN_BITS #define HCI_MAX_PACKET_SIZE_IN_BITS 8000 #endif @@ -3762,14 +6339,14 @@ // // LED_SOFTBLINK_ENABLED - led_softblink - led_softblink module - + #ifndef LED_SOFTBLINK_ENABLED #define LED_SOFTBLINK_ENABLED 0 #endif // LOW_POWER_PWM_ENABLED - low_power_pwm - low_power_pwm module - + #ifndef LOW_POWER_PWM_ENABLED #define LOW_POWER_PWM_ENABLED 0 @@ -3780,113 +6357,163 @@ #ifndef MEM_MANAGER_ENABLED #define MEM_MANAGER_ENABLED 0 #endif -// MEMORY_MANAGER_SMALL_BLOCK_COUNT - Size of each memory blocks identified as 'small' block. <0-255> +// MEMORY_MANAGER_SMALL_BLOCK_COUNT - Size of each memory blocks identified as 'small' block. <0-255> #ifndef MEMORY_MANAGER_SMALL_BLOCK_COUNT #define MEMORY_MANAGER_SMALL_BLOCK_COUNT 1 #endif -// MEMORY_MANAGER_SMALL_BLOCK_SIZE - Size of each memory blocks identified as 'small' block. +// MEMORY_MANAGER_SMALL_BLOCK_SIZE - Size of each memory blocks identified as 'small' block. // Size of each memory blocks identified as 'small' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_SMALL_BLOCK_SIZE #define MEMORY_MANAGER_SMALL_BLOCK_SIZE 32 #endif -// MEMORY_MANAGER_MEDIUM_BLOCK_COUNT - Size of each memory blocks identified as 'medium' block. <0-255> +// MEMORY_MANAGER_MEDIUM_BLOCK_COUNT - Size of each memory blocks identified as 'medium' block. <0-255> #ifndef MEMORY_MANAGER_MEDIUM_BLOCK_COUNT #define MEMORY_MANAGER_MEDIUM_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_MEDIUM_BLOCK_SIZE - Size of each memory blocks identified as 'medium' block. +// MEMORY_MANAGER_MEDIUM_BLOCK_SIZE - Size of each memory blocks identified as 'medium' block. // Size of each memory blocks identified as 'medium' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_MEDIUM_BLOCK_SIZE #define MEMORY_MANAGER_MEDIUM_BLOCK_SIZE 256 #endif -// MEMORY_MANAGER_LARGE_BLOCK_COUNT - Size of each memory blocks identified as 'large' block. <0-255> +// MEMORY_MANAGER_LARGE_BLOCK_COUNT - Size of each memory blocks identified as 'large' block. <0-255> #ifndef MEMORY_MANAGER_LARGE_BLOCK_COUNT #define MEMORY_MANAGER_LARGE_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_LARGE_BLOCK_SIZE - Size of each memory blocks identified as 'large' block. +// MEMORY_MANAGER_LARGE_BLOCK_SIZE - Size of each memory blocks identified as 'large' block. // Size of each memory blocks identified as 'large' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_LARGE_BLOCK_SIZE #define MEMORY_MANAGER_LARGE_BLOCK_SIZE 256 #endif -// MEMORY_MANAGER_XLARGE_BLOCK_COUNT - Size of each memory blocks identified as 'extra large' block. <0-255> +// MEMORY_MANAGER_XLARGE_BLOCK_COUNT - Size of each memory blocks identified as 'extra large' block. <0-255> #ifndef MEMORY_MANAGER_XLARGE_BLOCK_COUNT #define MEMORY_MANAGER_XLARGE_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_XLARGE_BLOCK_SIZE - Size of each memory blocks identified as 'extra large' block. +// MEMORY_MANAGER_XLARGE_BLOCK_SIZE - Size of each memory blocks identified as 'extra large' block. // Size of each memory blocks identified as 'extra large' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_XLARGE_BLOCK_SIZE #define MEMORY_MANAGER_XLARGE_BLOCK_SIZE 1320 #endif -// MEMORY_MANAGER_XXLARGE_BLOCK_COUNT - Size of each memory blocks identified as 'extra extra large' block. <0-255> +// MEMORY_MANAGER_XXLARGE_BLOCK_COUNT - Size of each memory blocks identified as 'extra extra large' block. <0-255> #ifndef MEMORY_MANAGER_XXLARGE_BLOCK_COUNT #define MEMORY_MANAGER_XXLARGE_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_XXLARGE_BLOCK_SIZE - Size of each memory blocks identified as 'extra extra large' block. +// MEMORY_MANAGER_XXLARGE_BLOCK_SIZE - Size of each memory blocks identified as 'extra extra large' block. // Size of each memory blocks identified as 'extra extra large' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_XXLARGE_BLOCK_SIZE #define MEMORY_MANAGER_XXLARGE_BLOCK_SIZE 3444 #endif -// MEMORY_MANAGER_XSMALL_BLOCK_COUNT - Size of each memory blocks identified as 'extra small' block. <0-255> +// MEMORY_MANAGER_XSMALL_BLOCK_COUNT - Size of each memory blocks identified as 'extra small' block. <0-255> #ifndef MEMORY_MANAGER_XSMALL_BLOCK_COUNT #define MEMORY_MANAGER_XSMALL_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_XSMALL_BLOCK_SIZE - Size of each memory blocks identified as 'extra small' block. +// MEMORY_MANAGER_XSMALL_BLOCK_SIZE - Size of each memory blocks identified as 'extra small' block. // Size of each memory blocks identified as 'extra large' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_XSMALL_BLOCK_SIZE #define MEMORY_MANAGER_XSMALL_BLOCK_SIZE 64 #endif -// MEMORY_MANAGER_XXSMALL_BLOCK_COUNT - Size of each memory blocks identified as 'extra extra small' block. <0-255> +// MEMORY_MANAGER_XXSMALL_BLOCK_COUNT - Size of each memory blocks identified as 'extra extra small' block. <0-255> #ifndef MEMORY_MANAGER_XXSMALL_BLOCK_COUNT #define MEMORY_MANAGER_XXSMALL_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_XXSMALL_BLOCK_SIZE - Size of each memory blocks identified as 'extra extra small' block. +// MEMORY_MANAGER_XXSMALL_BLOCK_SIZE - Size of each memory blocks identified as 'extra extra small' block. // Size of each memory blocks identified as 'extra extra small' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_XXSMALL_BLOCK_SIZE #define MEMORY_MANAGER_XXSMALL_BLOCK_SIZE 32 #endif -// MEM_MANAGER_DISABLE_API_PARAM_CHECK - Disable API parameter checks in the module. +// MEM_MANAGER_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef MEM_MANAGER_CONFIG_LOG_ENABLED +#define MEM_MANAGER_CONFIG_LOG_ENABLED 0 +#endif +// MEM_MANAGER_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug +#ifndef MEM_MANAGER_CONFIG_LOG_LEVEL +#define MEM_MANAGER_CONFIG_LOG_LEVEL 3 +#endif + +// MEM_MANAGER_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef MEM_MANAGER_CONFIG_INFO_COLOR +#define MEM_MANAGER_CONFIG_INFO_COLOR 0 +#endif + +// MEM_MANAGER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef MEM_MANAGER_CONFIG_DEBUG_COLOR +#define MEM_MANAGER_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// MEM_MANAGER_DISABLE_API_PARAM_CHECK - Disable API parameter checks in the module. + #ifndef MEM_MANAGER_DISABLE_API_PARAM_CHECK #define MEM_MANAGER_DISABLE_API_PARAM_CHECK 0 #endif // - // NRF_BALLOC_ENABLED - nrf_balloc - Block allocator module //========================================================== #ifndef NRF_BALLOC_ENABLED @@ -3897,14 +6524,14 @@ #ifndef NRF_BALLOC_CONFIG_DEBUG_ENABLED #define NRF_BALLOC_CONFIG_DEBUG_ENABLED 0 #endif -// NRF_BALLOC_CONFIG_HEAD_GUARD_WORDS - Number of words used as head guard. <0-255> +// NRF_BALLOC_CONFIG_HEAD_GUARD_WORDS - Number of words used as head guard. <0-255> #ifndef NRF_BALLOC_CONFIG_HEAD_GUARD_WORDS #define NRF_BALLOC_CONFIG_HEAD_GUARD_WORDS 1 #endif -// NRF_BALLOC_CONFIG_TAIL_GUARD_WORDS - Number of words used as tail guard. <0-255> +// NRF_BALLOC_CONFIG_TAIL_GUARD_WORDS - Number of words used as tail guard. <0-255> #ifndef NRF_BALLOC_CONFIG_TAIL_GUARD_WORDS @@ -3912,26 +6539,33 @@ #endif // NRF_BALLOC_CONFIG_BASIC_CHECKS_ENABLED - Enables basic checks in this module. - + #ifndef NRF_BALLOC_CONFIG_BASIC_CHECKS_ENABLED #define NRF_BALLOC_CONFIG_BASIC_CHECKS_ENABLED 0 #endif // NRF_BALLOC_CONFIG_DOUBLE_FREE_CHECK_ENABLED - Enables double memory free check in this module. - + #ifndef NRF_BALLOC_CONFIG_DOUBLE_FREE_CHECK_ENABLED #define NRF_BALLOC_CONFIG_DOUBLE_FREE_CHECK_ENABLED 0 #endif // NRF_BALLOC_CONFIG_DATA_TRASHING_CHECK_ENABLED - Enables free memory corruption check in this module. - + #ifndef NRF_BALLOC_CONFIG_DATA_TRASHING_CHECK_ENABLED #define NRF_BALLOC_CONFIG_DATA_TRASHING_CHECK_ENABLED 0 #endif +// NRF_BALLOC_CLI_CMDS - Enable CLI commands specific to the module + + +#ifndef NRF_BALLOC_CLI_CMDS +#define NRF_BALLOC_CLI_CMDS 0 +#endif + // // @@ -3941,32 +6575,32 @@ #ifndef NRF_CSENSE_ENABLED #define NRF_CSENSE_ENABLED 0 #endif -// NRF_CSENSE_PAD_HYSTERESIS - Minimum value of change required to determine that a pad was touched. +// NRF_CSENSE_PAD_HYSTERESIS - Minimum value of change required to determine that a pad was touched. #ifndef NRF_CSENSE_PAD_HYSTERESIS #define NRF_CSENSE_PAD_HYSTERESIS 15 #endif -// NRF_CSENSE_PAD_DEVIATION - Minimum value measured on a pad required to take it into account while calculating the step. +// NRF_CSENSE_PAD_DEVIATION - Minimum value measured on a pad required to take it into account while calculating the step. #ifndef NRF_CSENSE_PAD_DEVIATION #define NRF_CSENSE_PAD_DEVIATION 70 #endif -// NRF_CSENSE_MIN_PAD_VALUE - Minimum normalized value on a pad required to take its value into account. +// NRF_CSENSE_MIN_PAD_VALUE - Minimum normalized value on a pad required to take its value into account. #ifndef NRF_CSENSE_MIN_PAD_VALUE #define NRF_CSENSE_MIN_PAD_VALUE 20 #endif -// NRF_CSENSE_MAX_PADS_NUMBER - Maximum number of pads used for one instance. +// NRF_CSENSE_MAX_PADS_NUMBER - Maximum number of pads used for one instance. #ifndef NRF_CSENSE_MAX_PADS_NUMBER #define NRF_CSENSE_MAX_PADS_NUMBER 20 #endif -// NRF_CSENSE_MAX_VALUE - Maximum normalized value obtained from measurement. +// NRF_CSENSE_MAX_VALUE - Maximum normalized value obtained from measurement. #ifndef NRF_CSENSE_MAX_VALUE #define NRF_CSENSE_MAX_VALUE 1000 #endif -// NRF_CSENSE_OUTPUT_PIN - Output pin used by the low-level module. +// NRF_CSENSE_OUTPUT_PIN - Output pin used by the low-level module. // This is used when capacitive sensor does not use COMP. #ifndef NRF_CSENSE_OUTPUT_PIN @@ -3987,17 +6621,17 @@ #ifndef USE_COMP #define USE_COMP 0 #endif -// TIMER0_FOR_CSENSE - First TIMER instance used by the driver (not used on nRF51). +// TIMER0_FOR_CSENSE - First TIMER instance used by the driver (not used on nRF51). #ifndef TIMER0_FOR_CSENSE #define TIMER0_FOR_CSENSE 1 #endif -// TIMER1_FOR_CSENSE - Second TIMER instance used by the driver (not used on nRF51). +// TIMER1_FOR_CSENSE - Second TIMER instance used by the driver (not used on nRF51). #ifndef TIMER1_FOR_CSENSE #define TIMER1_FOR_CSENSE 2 #endif -// MEASUREMENT_PERIOD - Single measurement period. +// MEASUREMENT_PERIOD - Single measurement period. // Time of a single measurement can be calculated as // T = (1/2)*MEASUREMENT_PERIOD*(1/f_OSC) where f_OSC = I_SOURCE / (2C*(VUP-VDOWN) ). // I_SOURCE, VUP, and VDOWN are values used to initialize COMP and C is the capacitance of the used pad. @@ -4011,10 +6645,10 @@ // // NRF_FPRINTF_ENABLED - nrf_fprintf - fprintf function. - + #ifndef NRF_FPRINTF_ENABLED -#define NRF_FPRINTF_ENABLED 0 +#define NRF_FPRINTF_ENABLED 1 #endif // NRF_FSTORAGE_ENABLED - nrf_fstorage - Flash abstraction library @@ -4022,18 +6656,36 @@ #ifndef NRF_FSTORAGE_ENABLED #define NRF_FSTORAGE_ENABLED 1 #endif -// nrf_fstorage_sd - Implementation using the SoftDevice. +// nrf_fstorage - Common settings -// Configuration options for the fstorage implementation using the SoftDevice. +// Common settings to all fstorage implementations //========================================================== -// NRF_FSTORAGE_SD_QUEUE_SIZE - Size of the internal queue of operations. +// NRF_FSTORAGE_PARAM_CHECK_DISABLED - Disable user input validation + + +// If selected, use ASSERT to validate user input. +// This effectively removes user input validation in production code. +// Recommended setting: OFF, only enable this setting if size is a major concern. + +#ifndef NRF_FSTORAGE_PARAM_CHECK_DISABLED +#define NRF_FSTORAGE_PARAM_CHECK_DISABLED 0 +#endif + +// +//========================================================== + +// nrf_fstorage_sd - Implementation using the SoftDevice + +// Configuration options for the fstorage implementation using the SoftDevice +//========================================================== +// NRF_FSTORAGE_SD_QUEUE_SIZE - Size of the internal queue of operations // Increase this value if API calls frequently return the error @ref NRF_ERROR_NO_MEM. #ifndef NRF_FSTORAGE_SD_QUEUE_SIZE #define NRF_FSTORAGE_SD_QUEUE_SIZE 4 #endif -// NRF_FSTORAGE_SD_MAX_RETRIES - Maximum number of attempts at executing an operation when the SoftDevice is busy. +// NRF_FSTORAGE_SD_MAX_RETRIES - Maximum number of attempts at executing an operation when the SoftDevice is busy // Increase this value if events frequently return the @ref NRF_ERROR_TIMEOUT error. // The SoftDevice might fail to schedule flash access due to high BLE activity. @@ -4041,7 +6693,7 @@ #define NRF_FSTORAGE_SD_MAX_RETRIES 8 #endif -// NRF_FSTORAGE_SD_MAX_WRITE_SIZE - Maximum number of bytes to be written to flash in a single operation. +// NRF_FSTORAGE_SD_MAX_WRITE_SIZE - Maximum number of bytes to be written to flash in a single operation // This value must be a multiple of four. // Lowering this value can increase the chances of the SoftDevice being able to execute flash operations in between radio activity. // This value is bound by the maximum number of bytes that can be written to flash in a single call to @ref sd_flash_write. @@ -4051,16 +6703,23 @@ #define NRF_FSTORAGE_SD_MAX_WRITE_SIZE 4096 #endif -// +// //========================================================== // -// NRF_MEMOBJ_ENABLED - nrf_memobj - Linked memory allocator module +// NRF_GFX_ENABLED - nrf_gfx - GFX module + +#ifndef NRF_GFX_ENABLED +#define NRF_GFX_ENABLED 0 +#endif + +// NRF_MEMOBJ_ENABLED - nrf_memobj - Linked memory allocator module + #ifndef NRF_MEMOBJ_ENABLED -#define NRF_MEMOBJ_ENABLED 0 +#define NRF_MEMOBJ_ENABLED 1 #endif // NRF_PWR_MGMT_ENABLED - nrf_pwr_mgmt - Power management module @@ -4076,56 +6735,56 @@ #define NRF_PWR_MGMT_CONFIG_DEBUG_PIN_ENABLED 0 #endif // NRF_PWR_MGMT_SLEEP_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef NRF_PWR_MGMT_SLEEP_DEBUG_PIN #define NRF_PWR_MGMT_SLEEP_DEBUG_PIN 31 @@ -4134,7 +6793,7 @@ // // NRF_PWR_MGMT_CONFIG_CPU_USAGE_MONITOR_ENABLED - Enables CPU usage monitor. - + // Module will trace percentage of CPU usage in one second intervals. @@ -4147,7 +6806,7 @@ #ifndef NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_ENABLED #define NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_ENABLED 0 #endif -// NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_S - Standby timeout (in seconds). +// NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_S - Standby timeout (in seconds). // Shutdown procedure will begin no earlier than after this number of seconds. #ifndef NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_S @@ -4157,27 +6816,27 @@ // // NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED - Enables FPU event cleaning. - + #ifndef NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED -#define NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED 1 +#define NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED 0 #endif // NRF_PWR_MGMT_CONFIG_AUTO_SHUTDOWN_RETRY - Blocked shutdown procedure will be retried every second. - + #ifndef NRF_PWR_MGMT_CONFIG_AUTO_SHUTDOWN_RETRY #define NRF_PWR_MGMT_CONFIG_AUTO_SHUTDOWN_RETRY 0 #endif // NRF_PWR_MGMT_CONFIG_USE_SCHEDULER - Module will use @ref app_scheduler. - + #ifndef NRF_PWR_MGMT_CONFIG_USE_SCHEDULER #define NRF_PWR_MGMT_CONFIG_USE_SCHEDULER 0 #endif -// NRF_PWR_MGMT_CONFIG_HANDLER_PRIORITY_COUNT - The number of priorities for module handlers. +// NRF_PWR_MGMT_CONFIG_HANDLER_PRIORITY_COUNT - The number of priorities for module handlers. // The number of stages of the shutdown process. #ifndef NRF_PWR_MGMT_CONFIG_HANDLER_PRIORITY_COUNT @@ -4186,29 +6845,57 @@ // -// NRF_QUEUE_ENABLED - nrf_queue - Queue module - - +// NRF_QUEUE_ENABLED - nrf_queue - Queue module +//========================================================== #ifndef NRF_QUEUE_ENABLED -#define NRF_QUEUE_ENABLED 1 +#define NRF_QUEUE_ENABLED 0 +#endif +// NRF_QUEUE_CLI_CMDS - Enable CLI commands specific to the module + + +#ifndef NRF_QUEUE_CLI_CMDS +#define NRF_QUEUE_CLI_CMDS 0 #endif -// NRF_SECTION_ITER_ENABLED - nrf_section_iter - Section iterator +// +// NRF_SECTION_ITER_ENABLED - nrf_section_iter - Section iterator + #ifndef NRF_SECTION_ITER_ENABLED #define NRF_SECTION_ITER_ENABLED 1 #endif -// NRF_STRERROR_ENABLED - nrf_strerror - Library for converting error code to string. +// NRF_SORTLIST_ENABLED - nrf_sortlist - Sorted list + +#ifndef NRF_SORTLIST_ENABLED +#define NRF_SORTLIST_ENABLED 0 +#endif + +// NRF_SPI_MNGR_ENABLED - nrf_spi_mngr - SPI transaction manager + + +#ifndef NRF_SPI_MNGR_ENABLED +#define NRF_SPI_MNGR_ENABLED 0 +#endif + +// NRF_STRERROR_ENABLED - nrf_strerror - Library for converting error code to string. + #ifndef NRF_STRERROR_ENABLED -#define NRF_STRERROR_ENABLED 0 +#define NRF_STRERROR_ENABLED 1 +#endif + +// NRF_TWI_MNGR_ENABLED - nrf_twi_mngr - TWI transaction manager + + +#ifndef NRF_TWI_MNGR_ENABLED +#define NRF_TWI_MNGR_ENABLED 0 #endif // SLIP_ENABLED - slip - SLIP encoding and decoding - + #ifndef SLIP_ENABLED #define SLIP_ENABLED 0 @@ -4220,37 +6907,37 @@ #define TASK_MANAGER_ENABLED 0 #endif // TASK_MANAGER_CLI_CMDS - Enable CLI commands specific to the module - + #ifndef TASK_MANAGER_CLI_CMDS -#define TASK_MANAGER_CLI_CMDS 1 +#define TASK_MANAGER_CLI_CMDS 0 #endif -// TASK_MANAGER_CONFIG_MAX_TASKS - Maximum number of tasks which can be created +// TASK_MANAGER_CONFIG_MAX_TASKS - Maximum number of tasks which can be created #ifndef TASK_MANAGER_CONFIG_MAX_TASKS #define TASK_MANAGER_CONFIG_MAX_TASKS 2 #endif -// TASK_MANAGER_CONFIG_STACK_SIZE - Stack size for every task (power of 2) +// TASK_MANAGER_CONFIG_STACK_SIZE - Stack size for every task (power of 2) #ifndef TASK_MANAGER_CONFIG_STACK_SIZE #define TASK_MANAGER_CONFIG_STACK_SIZE 1024 #endif // TASK_MANAGER_CONFIG_STACK_PROFILER_ENABLED - Enable stack profiling. - + #ifndef TASK_MANAGER_CONFIG_STACK_PROFILER_ENABLED #define TASK_MANAGER_CONFIG_STACK_PROFILER_ENABLED 1 #endif // TASK_MANAGER_CONFIG_STACK_GUARD - Configures stack guard. - -// <0=> Disabled -// <4=> 32 bytes -// <5=> 64 bytes -// <6=> 128 bytes -// <7=> 256 bytes -// <8=> 512 bytes + +// <0=> Disabled +// <4=> 32 bytes +// <5=> 64 bytes +// <6=> 128 bytes +// <7=> 256 bytes +// <8=> 512 bytes #ifndef TASK_MANAGER_CONFIG_STACK_GUARD #define TASK_MANAGER_CONFIG_STACK_GUARD 7 @@ -4258,34 +6945,68 @@ // -// nrf_cli - Command line interface. +// app_button - buttons handling module //========================================================== -// NRF_CLI_ENABLED - Enable/disable CLI module. +// BUTTON_ENABLED - Enables Button module + +#ifndef BUTTON_ENABLED +#define BUTTON_ENABLED 0 +#endif + +// BUTTON_HIGH_ACCURACY_ENABLED - Enables GPIOTE high accuracy for buttons + + +#ifndef BUTTON_HIGH_ACCURACY_ENABLED +#define BUTTON_HIGH_ACCURACY_ENABLED 0 +#endif + +// +//========================================================== + +// nrf_cli - Command line interface + +//========================================================== +// NRF_CLI_ENABLED - Enable/disable the CLI module. + #ifndef NRF_CLI_ENABLED #define NRF_CLI_ENABLED 0 #endif -// NRF_CLI_ARGC_MAX - Maximum number of parameters passed to command handler. +// NRF_CLI_ARGC_MAX - Maximum number of parameters passed to the command handler. #ifndef NRF_CLI_ARGC_MAX #define NRF_CLI_ARGC_MAX 12 #endif -// NRF_CLI_BUILD_IN_CMDS_ENABLED - CLI build in commands. - +// NRF_CLI_BUILD_IN_CMDS_ENABLED - CLI built-in commands. + #ifndef NRF_CLI_BUILD_IN_CMDS_ENABLED #define NRF_CLI_BUILD_IN_CMDS_ENABLED 1 #endif -// NRF_CLI_CMD_BUFF_SIZE - Maximum buffer size for single command. +// NRF_CLI_CMD_BUFF_SIZE - Maximum buffer size for a single command. #ifndef NRF_CLI_CMD_BUFF_SIZE #define NRF_CLI_CMD_BUFF_SIZE 128 #endif -// NRF_CLI_PRINTF_BUFF_SIZE - Maximum print buffer size. +// NRF_CLI_ECHO_STATUS - CLI echo status. If set, echo is ON. + + +#ifndef NRF_CLI_ECHO_STATUS +#define NRF_CLI_ECHO_STATUS 1 +#endif + +// NRF_CLI_WILDCARD_ENABLED - Enable wildcard functionality for CLI commands. + + +#ifndef NRF_CLI_WILDCARD_ENABLED +#define NRF_CLI_WILDCARD_ENABLED 0 +#endif + +// NRF_CLI_PRINTF_BUFF_SIZE - Maximum print buffer size. #ifndef NRF_CLI_PRINTF_BUFF_SIZE #define NRF_CLI_PRINTF_BUFF_SIZE 23 #endif @@ -4295,12 +7016,12 @@ #ifndef NRF_CLI_HISTORY_ENABLED #define NRF_CLI_HISTORY_ENABLED 1 #endif -// NRF_CLI_HISTORY_ELEMENT_SIZE - Size of one memory object reserved for CLI history +// NRF_CLI_HISTORY_ELEMENT_SIZE - Size of one memory object reserved for CLI history. #ifndef NRF_CLI_HISTORY_ELEMENT_SIZE #define NRF_CLI_HISTORY_ELEMENT_SIZE 32 #endif -// NRF_CLI_HISTORY_ELEMENT_COUNT - Number of history memory objects +// NRF_CLI_HISTORY_ELEMENT_COUNT - Number of history memory objects. #ifndef NRF_CLI_HISTORY_ELEMENT_COUNT #define NRF_CLI_HISTORY_ELEMENT_COUNT 8 #endif @@ -4308,116 +7029,50 @@ // // NRF_CLI_VT100_COLORS_ENABLED - CLI VT100 colors. - + #ifndef NRF_CLI_VT100_COLORS_ENABLED #define NRF_CLI_VT100_COLORS_ENABLED 1 #endif -// NRF_CLI_LOG_BACKEND - Enable logger backend interface. +// NRF_CLI_STATISTICS_ENABLED - Enable CLI statistics. + +#ifndef NRF_CLI_STATISTICS_ENABLED +#define NRF_CLI_STATISTICS_ENABLED 1 +#endif + +// NRF_CLI_LOG_BACKEND - Enable logger backend interface. + #ifndef NRF_CLI_LOG_BACKEND #define NRF_CLI_LOG_BACKEND 1 #endif // NRF_CLI_USES_TASK_MANAGER_ENABLED - Enable CLI to use task_manager - + #ifndef NRF_CLI_USES_TASK_MANAGER_ENABLED #define NRF_CLI_USES_TASK_MANAGER_ENABLED 0 #endif -// +// //========================================================== -// nrf_cli_rtt - RTT command line interface transport. - -//========================================================== -// NRF_CLI_RTT_ENABLED - Enable/disable CLI RTT module. - - -#ifndef NRF_CLI_RTT_ENABLED -#define NRF_CLI_RTT_ENABLED 0 -#endif - -// NRF_CLI_RTT_TERMINAL_ID - RTT terminal ID for CLI. -#ifndef NRF_CLI_RTT_TERMINAL_ID -#define NRF_CLI_RTT_TERMINAL_ID 0 -#endif - -// +// //========================================================== -// -//========================================================== - -// nRF_Log +// nRF_Log //========================================================== -// NRF_LOG_BACKEND_RTT_ENABLED - nrf_log_backend_rtt - Log RTT backend -//========================================================== -#ifndef NRF_LOG_BACKEND_RTT_ENABLED -#define NRF_LOG_BACKEND_RTT_ENABLED 0 -#endif -// NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE - Size of buffer for partially processed strings. -// Size of the buffer is a trade-off between RAM usage and processing. -// if buffer is smaller then strings will often be fragmented. -// It is recommended to use size which will fit typical log and only the -// longer one will be fragmented. +// NRF_LOG_STR_FORMATTER_TIMESTAMP_FORMAT_ENABLED - nrf_log_str_formatter - Log string formatter + -#ifndef NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE -#define NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE 64 +#ifndef NRF_LOG_STR_FORMATTER_TIMESTAMP_FORMAT_ENABLED +#define NRF_LOG_STR_FORMATTER_TIMESTAMP_FORMAT_ENABLED 1 #endif -// - -// NRF_LOG_BACKEND_UART_ENABLED - nrf_log_backend_uart - Log UART backend -//========================================================== -#ifndef NRF_LOG_BACKEND_UART_ENABLED -#define NRF_LOG_BACKEND_UART_ENABLED 0 -#endif -// NRF_LOG_BACKEND_UART_TX_PIN - UART TX pin -#ifndef NRF_LOG_BACKEND_UART_TX_PIN -#define NRF_LOG_BACKEND_UART_TX_PIN 6 -#endif - -// NRF_LOG_BACKEND_UART_BAUDRATE - Default Baudrate - -// <323584=> 1200 baud -// <643072=> 2400 baud -// <1290240=> 4800 baud -// <2576384=> 9600 baud -// <3862528=> 14400 baud -// <5152768=> 19200 baud -// <7716864=> 28800 baud -// <10289152=> 38400 baud -// <15400960=> 57600 baud -// <20615168=> 76800 baud -// <30801920=> 115200 baud -// <61865984=> 230400 baud -// <67108864=> 250000 baud -// <121634816=> 460800 baud -// <251658240=> 921600 baud -// <268435456=> 1000000 baud - -#ifndef NRF_LOG_BACKEND_UART_BAUDRATE -#define NRF_LOG_BACKEND_UART_BAUDRATE 30801920 -#endif - -// NRF_LOG_BACKEND_UART_TEMP_BUFFER_SIZE - Size of buffer for partially processed strings. -// Size of the buffer is a trade-off between RAM usage and processing. -// if buffer is smaller then strings will often be fragmented. -// It is recommended to use size which will fit typical log and only the -// longer one will be fragmented. - -#ifndef NRF_LOG_BACKEND_UART_TEMP_BUFFER_SIZE -#define NRF_LOG_BACKEND_UART_TEMP_BUFFER_SIZE 64 -#endif - -// - -// nrf_log - Logging +// nrf_log - Logger //========================================================== // NRF_LOG_ENABLED - Logging module for nRF5 SDK @@ -4431,69 +7086,69 @@ #define NRF_LOG_USES_COLORS 0 #endif // NRF_LOG_COLOR_DEFAULT - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_LOG_COLOR_DEFAULT #define NRF_LOG_COLOR_DEFAULT 0 #endif // NRF_LOG_ERROR_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_LOG_ERROR_COLOR -#define NRF_LOG_ERROR_COLOR 0 +#define NRF_LOG_ERROR_COLOR 2 #endif // NRF_LOG_WARNING_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_LOG_WARNING_COLOR -#define NRF_LOG_WARNING_COLOR 0 +#define NRF_LOG_WARNING_COLOR 4 #endif // // NRF_LOG_DEFAULT_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_LOG_DEFAULT_LEVEL #define NRF_LOG_DEFAULT_LEVEL 3 #endif // NRF_LOG_DEFERRED - Enable deffered logger. - + // Log data is buffered and can be processed in idle. @@ -4502,60 +7157,65 @@ #endif // NRF_LOG_BUFSIZE - Size of the buffer for storing logs (in bytes). - + // Must be power of 2 and multiple of 4. // If NRF_LOG_DEFERRED = 0 then buffer size can be reduced to minimum. -// <128=> 128 -// <256=> 256 -// <512=> 512 -// <1024=> 1024 -// <2048=> 2048 -// <4096=> 4096 -// <8192=> 8192 -// <16384=> 16384 +// <128=> 128 +// <256=> 256 +// <512=> 512 +// <1024=> 1024 +// <2048=> 2048 +// <4096=> 4096 +// <8192=> 8192 +// <16384=> 16384 #ifndef NRF_LOG_BUFSIZE #define NRF_LOG_BUFSIZE 1024 #endif // NRF_LOG_ALLOW_OVERFLOW - Configures behavior when circular buffer is full. + - -// If set then oldest logs are overwritten. Otherwise a +// If set then oldest logs are overwritten. Otherwise a // marker is injected informing about overflow. #ifndef NRF_LOG_ALLOW_OVERFLOW #define NRF_LOG_ALLOW_OVERFLOW 1 #endif -// NRF_LOG_USES_TIMESTAMP - Enable timestamping - +// NRF_LOG_USES_TIMESTAMP - Enable timestamping // Function for getting the timestamp is provided by the user - +//========================================================== #ifndef NRF_LOG_USES_TIMESTAMP #define NRF_LOG_USES_TIMESTAMP 0 #endif +// NRF_LOG_TIMESTAMP_DEFAULT_FREQUENCY - Default frequency of the timestamp (in Hz) +#ifndef NRF_LOG_TIMESTAMP_DEFAULT_FREQUENCY +#define NRF_LOG_TIMESTAMP_DEFAULT_FREQUENCY 32768 +#endif + +// // NRF_LOG_FILTERS_ENABLED - Enable dynamic filtering of logs. - + #ifndef NRF_LOG_FILTERS_ENABLED -#define NRF_LOG_FILTERS_ENABLED 1 +#define NRF_LOG_FILTERS_ENABLED 0 #endif // NRF_LOG_CLI_CMDS - Enable CLI commands for the module. - + #ifndef NRF_LOG_CLI_CMDS -#define NRF_LOG_CLI_CMDS 1 +#define NRF_LOG_CLI_CMDS 0 #endif // Log message pool - Configuration of log message pool //========================================================== -// NRF_LOG_MSGPOOL_ELEMENT_SIZE - Size of a single element in the pool of memory objects. +// NRF_LOG_MSGPOOL_ELEMENT_SIZE - Size of a single element in the pool of memory objects. // If a small value is set, then performance of logs processing // is degraded because data is fragmented. Bigger value impacts // RAM memory utilization. The size is set to fit a message with @@ -4565,7 +7225,7 @@ #define NRF_LOG_MSGPOOL_ELEMENT_SIZE 20 #endif -// NRF_LOG_MSGPOOL_ELEMENT_COUNT - Number of elements in the pool of memory objects +// NRF_LOG_MSGPOOL_ELEMENT_COUNT - Number of elements in the pool of memory objects // If a small value is set, then it may lead to a deadlock // in certain cases if backend has high latency and holds // multiple messages for long time. Bigger value impacts @@ -4575,15 +7235,15 @@ #define NRF_LOG_MSGPOOL_ELEMENT_COUNT 8 #endif -// +// //========================================================== // -// nrf_log module configuration +// nrf_log module configuration //========================================================== -// nrf_log in nRF_Core +// nrf_log in nRF_Core //========================================================== // NRF_MPU_CONFIG_LOG_ENABLED - Enables logging in the module. @@ -4592,44 +7252,44 @@ #define NRF_MPU_CONFIG_LOG_ENABLED 0 #endif // NRF_MPU_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_MPU_CONFIG_LOG_LEVEL #define NRF_MPU_CONFIG_LOG_LEVEL 3 #endif // NRF_MPU_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_MPU_CONFIG_INFO_COLOR #define NRF_MPU_CONFIG_INFO_COLOR 0 #endif // NRF_MPU_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_MPU_CONFIG_DEBUG_COLOR #define NRF_MPU_CONFIG_DEBUG_COLOR 0 @@ -4643,44 +7303,44 @@ #define NRF_STACK_GUARD_CONFIG_LOG_ENABLED 0 #endif // NRF_STACK_GUARD_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_STACK_GUARD_CONFIG_LOG_LEVEL #define NRF_STACK_GUARD_CONFIG_LOG_LEVEL 3 #endif // NRF_STACK_GUARD_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_STACK_GUARD_CONFIG_INFO_COLOR #define NRF_STACK_GUARD_CONFIG_INFO_COLOR 0 #endif // NRF_STACK_GUARD_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_STACK_GUARD_CONFIG_DEBUG_COLOR #define NRF_STACK_GUARD_CONFIG_DEBUG_COLOR 0 @@ -4694,44 +7354,44 @@ #define TASK_MANAGER_CONFIG_LOG_ENABLED 0 #endif // TASK_MANAGER_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef TASK_MANAGER_CONFIG_LOG_LEVEL #define TASK_MANAGER_CONFIG_LOG_LEVEL 3 #endif // TASK_MANAGER_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TASK_MANAGER_CONFIG_INFO_COLOR #define TASK_MANAGER_CONFIG_INFO_COLOR 0 #endif // TASK_MANAGER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TASK_MANAGER_CONFIG_DEBUG_COLOR #define TASK_MANAGER_CONFIG_DEBUG_COLOR 0 @@ -4739,10 +7399,10 @@ // -// +// //========================================================== -// nrf_log in nRF_Drivers +// nrf_log in nRF_Drivers //========================================================== // CLOCK_CONFIG_LOG_ENABLED - Enables logging in the module. @@ -4751,44 +7411,44 @@ #define CLOCK_CONFIG_LOG_ENABLED 0 #endif // CLOCK_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef CLOCK_CONFIG_LOG_LEVEL #define CLOCK_CONFIG_LOG_LEVEL 3 #endif // CLOCK_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef CLOCK_CONFIG_INFO_COLOR #define CLOCK_CONFIG_INFO_COLOR 0 #endif // CLOCK_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef CLOCK_CONFIG_DEBUG_COLOR #define CLOCK_CONFIG_DEBUG_COLOR 0 @@ -4796,101 +7456,50 @@ // -// COMMON_CONFIG_LOG_ENABLED - Enables logging in the module. -//========================================================== -#ifndef COMMON_CONFIG_LOG_ENABLED -#define COMMON_CONFIG_LOG_ENABLED 0 -#endif -// COMMON_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef COMMON_CONFIG_LOG_LEVEL -#define COMMON_CONFIG_LOG_LEVEL 3 -#endif - -// COMMON_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef COMMON_CONFIG_INFO_COLOR -#define COMMON_CONFIG_INFO_COLOR 0 -#endif - -// COMMON_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef COMMON_CONFIG_DEBUG_COLOR -#define COMMON_CONFIG_DEBUG_COLOR 0 -#endif - -// - // COMP_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef COMP_CONFIG_LOG_ENABLED #define COMP_CONFIG_LOG_ENABLED 0 #endif // COMP_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef COMP_CONFIG_LOG_LEVEL #define COMP_CONFIG_LOG_LEVEL 3 #endif // COMP_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef COMP_CONFIG_INFO_COLOR #define COMP_CONFIG_INFO_COLOR 0 #endif // COMP_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef COMP_CONFIG_DEBUG_COLOR #define COMP_CONFIG_DEBUG_COLOR 0 @@ -4904,44 +7513,44 @@ #define GPIOTE_CONFIG_LOG_ENABLED 0 #endif // GPIOTE_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef GPIOTE_CONFIG_LOG_LEVEL #define GPIOTE_CONFIG_LOG_LEVEL 3 #endif // GPIOTE_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef GPIOTE_CONFIG_INFO_COLOR #define GPIOTE_CONFIG_INFO_COLOR 0 #endif // GPIOTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef GPIOTE_CONFIG_DEBUG_COLOR #define GPIOTE_CONFIG_DEBUG_COLOR 0 @@ -4949,101 +7558,50 @@ // -// I2S_CONFIG_LOG_ENABLED - Enables logging in the module. -//========================================================== -#ifndef I2S_CONFIG_LOG_ENABLED -#define I2S_CONFIG_LOG_ENABLED 0 -#endif -// I2S_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef I2S_CONFIG_LOG_LEVEL -#define I2S_CONFIG_LOG_LEVEL 3 -#endif - -// I2S_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef I2S_CONFIG_INFO_COLOR -#define I2S_CONFIG_INFO_COLOR 0 -#endif - -// I2S_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef I2S_CONFIG_DEBUG_COLOR -#define I2S_CONFIG_DEBUG_COLOR 0 -#endif - -// - // LPCOMP_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef LPCOMP_CONFIG_LOG_ENABLED #define LPCOMP_CONFIG_LOG_ENABLED 0 #endif // LPCOMP_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef LPCOMP_CONFIG_LOG_LEVEL #define LPCOMP_CONFIG_LOG_LEVEL 3 #endif // LPCOMP_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef LPCOMP_CONFIG_INFO_COLOR #define LPCOMP_CONFIG_INFO_COLOR 0 #endif // LPCOMP_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef LPCOMP_CONFIG_DEBUG_COLOR #define LPCOMP_CONFIG_DEBUG_COLOR 0 @@ -5057,44 +7615,44 @@ #define PDM_CONFIG_LOG_ENABLED 0 #endif // PDM_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef PDM_CONFIG_LOG_LEVEL #define PDM_CONFIG_LOG_LEVEL 3 #endif // PDM_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PDM_CONFIG_INFO_COLOR #define PDM_CONFIG_INFO_COLOR 0 #endif // PDM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PDM_CONFIG_DEBUG_COLOR #define PDM_CONFIG_DEBUG_COLOR 0 @@ -5108,44 +7666,44 @@ #define PPI_CONFIG_LOG_ENABLED 0 #endif // PPI_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef PPI_CONFIG_LOG_LEVEL #define PPI_CONFIG_LOG_LEVEL 3 #endif // PPI_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PPI_CONFIG_INFO_COLOR #define PPI_CONFIG_INFO_COLOR 0 #endif // PPI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PPI_CONFIG_DEBUG_COLOR #define PPI_CONFIG_DEBUG_COLOR 0 @@ -5159,44 +7717,44 @@ #define PWM_CONFIG_LOG_ENABLED 0 #endif // PWM_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef PWM_CONFIG_LOG_LEVEL #define PWM_CONFIG_LOG_LEVEL 3 #endif // PWM_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PWM_CONFIG_INFO_COLOR #define PWM_CONFIG_INFO_COLOR 0 #endif // PWM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PWM_CONFIG_DEBUG_COLOR #define PWM_CONFIG_DEBUG_COLOR 0 @@ -5210,44 +7768,44 @@ #define QDEC_CONFIG_LOG_ENABLED 0 #endif // QDEC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef QDEC_CONFIG_LOG_LEVEL #define QDEC_CONFIG_LOG_LEVEL 3 #endif // QDEC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef QDEC_CONFIG_INFO_COLOR #define QDEC_CONFIG_INFO_COLOR 0 #endif // QDEC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef QDEC_CONFIG_DEBUG_COLOR #define QDEC_CONFIG_DEBUG_COLOR 0 @@ -5261,51 +7819,51 @@ #define RNG_CONFIG_LOG_ENABLED 0 #endif // RNG_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef RNG_CONFIG_LOG_LEVEL #define RNG_CONFIG_LOG_LEVEL 3 #endif // RNG_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef RNG_CONFIG_INFO_COLOR #define RNG_CONFIG_INFO_COLOR 0 #endif // RNG_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef RNG_CONFIG_DEBUG_COLOR #define RNG_CONFIG_DEBUG_COLOR 0 #endif // RNG_CONFIG_RANDOM_NUMBER_LOG_ENABLED - Enables logging of random numbers. - + #ifndef RNG_CONFIG_RANDOM_NUMBER_LOG_ENABLED #define RNG_CONFIG_RANDOM_NUMBER_LOG_ENABLED 0 @@ -5319,44 +7877,44 @@ #define RTC_CONFIG_LOG_ENABLED 0 #endif // RTC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef RTC_CONFIG_LOG_LEVEL #define RTC_CONFIG_LOG_LEVEL 3 #endif // RTC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef RTC_CONFIG_INFO_COLOR #define RTC_CONFIG_INFO_COLOR 0 #endif // RTC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef RTC_CONFIG_DEBUG_COLOR #define RTC_CONFIG_DEBUG_COLOR 0 @@ -5370,44 +7928,44 @@ #define SAADC_CONFIG_LOG_ENABLED 0 #endif // SAADC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef SAADC_CONFIG_LOG_LEVEL #define SAADC_CONFIG_LOG_LEVEL 3 #endif // SAADC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SAADC_CONFIG_INFO_COLOR #define SAADC_CONFIG_INFO_COLOR 0 #endif // SAADC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SAADC_CONFIG_DEBUG_COLOR #define SAADC_CONFIG_DEBUG_COLOR 0 @@ -5421,44 +7979,44 @@ #define SPIS_CONFIG_LOG_ENABLED 0 #endif // SPIS_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef SPIS_CONFIG_LOG_LEVEL #define SPIS_CONFIG_LOG_LEVEL 3 #endif // SPIS_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SPIS_CONFIG_INFO_COLOR #define SPIS_CONFIG_INFO_COLOR 0 #endif // SPIS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SPIS_CONFIG_DEBUG_COLOR #define SPIS_CONFIG_DEBUG_COLOR 0 @@ -5472,44 +8030,44 @@ #define SPI_CONFIG_LOG_ENABLED 0 #endif // SPI_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef SPI_CONFIG_LOG_LEVEL #define SPI_CONFIG_LOG_LEVEL 3 #endif // SPI_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SPI_CONFIG_INFO_COLOR #define SPI_CONFIG_INFO_COLOR 0 #endif // SPI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SPI_CONFIG_DEBUG_COLOR #define SPI_CONFIG_DEBUG_COLOR 0 @@ -5517,101 +8075,50 @@ // -// SWI_CONFIG_LOG_ENABLED - Enables logging in the module. -//========================================================== -#ifndef SWI_CONFIG_LOG_ENABLED -#define SWI_CONFIG_LOG_ENABLED 0 -#endif -// SWI_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug - -#ifndef SWI_CONFIG_LOG_LEVEL -#define SWI_CONFIG_LOG_LEVEL 3 -#endif - -// SWI_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef SWI_CONFIG_INFO_COLOR -#define SWI_CONFIG_INFO_COLOR 0 -#endif - -// SWI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White - -#ifndef SWI_CONFIG_DEBUG_COLOR -#define SWI_CONFIG_DEBUG_COLOR 0 -#endif - -// - // TIMER_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef TIMER_CONFIG_LOG_ENABLED #define TIMER_CONFIG_LOG_ENABLED 0 #endif // TIMER_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef TIMER_CONFIG_LOG_LEVEL #define TIMER_CONFIG_LOG_LEVEL 3 #endif // TIMER_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TIMER_CONFIG_INFO_COLOR #define TIMER_CONFIG_INFO_COLOR 0 #endif // TIMER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TIMER_CONFIG_DEBUG_COLOR #define TIMER_CONFIG_DEBUG_COLOR 0 @@ -5625,44 +8132,44 @@ #define TWIS_CONFIG_LOG_ENABLED 0 #endif // TWIS_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef TWIS_CONFIG_LOG_LEVEL #define TWIS_CONFIG_LOG_LEVEL 3 #endif // TWIS_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TWIS_CONFIG_INFO_COLOR #define TWIS_CONFIG_INFO_COLOR 0 #endif // TWIS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TWIS_CONFIG_DEBUG_COLOR #define TWIS_CONFIG_DEBUG_COLOR 0 @@ -5676,44 +8183,44 @@ #define TWI_CONFIG_LOG_ENABLED 0 #endif // TWI_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef TWI_CONFIG_LOG_LEVEL #define TWI_CONFIG_LOG_LEVEL 3 #endif // TWI_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TWI_CONFIG_INFO_COLOR #define TWI_CONFIG_INFO_COLOR 0 #endif // TWI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TWI_CONFIG_DEBUG_COLOR #define TWI_CONFIG_DEBUG_COLOR 0 @@ -5727,44 +8234,44 @@ #define UART_CONFIG_LOG_ENABLED 0 #endif // UART_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef UART_CONFIG_LOG_LEVEL #define UART_CONFIG_LOG_LEVEL 3 #endif // UART_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef UART_CONFIG_INFO_COLOR #define UART_CONFIG_INFO_COLOR 0 #endif // UART_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef UART_CONFIG_DEBUG_COLOR #define UART_CONFIG_DEBUG_COLOR 0 @@ -5778,44 +8285,44 @@ #define USBD_CONFIG_LOG_ENABLED 0 #endif // USBD_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef USBD_CONFIG_LOG_LEVEL #define USBD_CONFIG_LOG_LEVEL 3 #endif // USBD_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef USBD_CONFIG_INFO_COLOR #define USBD_CONFIG_INFO_COLOR 0 #endif // USBD_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef USBD_CONFIG_DEBUG_COLOR #define USBD_CONFIG_DEBUG_COLOR 0 @@ -5829,44 +8336,44 @@ #define WDT_CONFIG_LOG_ENABLED 0 #endif // WDT_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef WDT_CONFIG_LOG_LEVEL #define WDT_CONFIG_LOG_LEVEL 3 #endif // WDT_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef WDT_CONFIG_INFO_COLOR #define WDT_CONFIG_INFO_COLOR 0 #endif // WDT_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef WDT_CONFIG_DEBUG_COLOR #define WDT_CONFIG_DEBUG_COLOR 0 @@ -5874,56 +8381,123 @@ // -// +// //========================================================== -// nrf_log in nRF_Libraries +// nrf_log in nRF_Libraries //========================================================== +// APP_TIMER_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef APP_TIMER_CONFIG_LOG_ENABLED +#define APP_TIMER_CONFIG_LOG_ENABLED 0 +#endif +// APP_TIMER_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef APP_TIMER_CONFIG_LOG_LEVEL +#define APP_TIMER_CONFIG_LOG_LEVEL 3 +#endif + +// APP_TIMER_CONFIG_INITIAL_LOG_LEVEL - Initial severity level if dynamic filtering is enabled. + + +// If module generates a lot of logs, initial log level can +// be decreased to prevent flooding. Severity level can be +// increased on instance basis. +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef APP_TIMER_CONFIG_INITIAL_LOG_LEVEL +#define APP_TIMER_CONFIG_INITIAL_LOG_LEVEL 3 +#endif + +// APP_TIMER_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef APP_TIMER_CONFIG_INFO_COLOR +#define APP_TIMER_CONFIG_INFO_COLOR 0 +#endif + +// APP_TIMER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef APP_TIMER_CONFIG_DEBUG_COLOR +#define APP_TIMER_CONFIG_DEBUG_COLOR 0 +#endif + +// + // APP_USBD_CDC_ACM_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef APP_USBD_CDC_ACM_CONFIG_LOG_ENABLED #define APP_USBD_CDC_ACM_CONFIG_LOG_ENABLED 0 #endif // APP_USBD_CDC_ACM_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef APP_USBD_CDC_ACM_CONFIG_LOG_LEVEL #define APP_USBD_CDC_ACM_CONFIG_LOG_LEVEL 3 #endif // APP_USBD_CDC_ACM_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_CDC_ACM_CONFIG_INFO_COLOR #define APP_USBD_CDC_ACM_CONFIG_INFO_COLOR 0 #endif // APP_USBD_CDC_ACM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_CDC_ACM_CONFIG_DEBUG_COLOR #define APP_USBD_CDC_ACM_CONFIG_DEBUG_COLOR 0 @@ -5931,50 +8505,101 @@ // +// APP_USBD_DUMMY_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef APP_USBD_DUMMY_CONFIG_LOG_ENABLED +#define APP_USBD_DUMMY_CONFIG_LOG_ENABLED 0 +#endif +// APP_USBD_DUMMY_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef APP_USBD_DUMMY_CONFIG_LOG_LEVEL +#define APP_USBD_DUMMY_CONFIG_LOG_LEVEL 3 +#endif + +// APP_USBD_DUMMY_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef APP_USBD_DUMMY_CONFIG_INFO_COLOR +#define APP_USBD_DUMMY_CONFIG_INFO_COLOR 0 +#endif + +// APP_USBD_DUMMY_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef APP_USBD_DUMMY_CONFIG_DEBUG_COLOR +#define APP_USBD_DUMMY_CONFIG_DEBUG_COLOR 0 +#endif + +// + // APP_USBD_MSC_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef APP_USBD_MSC_CONFIG_LOG_ENABLED #define APP_USBD_MSC_CONFIG_LOG_ENABLED 0 #endif // APP_USBD_MSC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef APP_USBD_MSC_CONFIG_LOG_LEVEL #define APP_USBD_MSC_CONFIG_LOG_LEVEL 3 #endif // APP_USBD_MSC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_MSC_CONFIG_INFO_COLOR #define APP_USBD_MSC_CONFIG_INFO_COLOR 0 #endif // APP_USBD_MSC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_MSC_CONFIG_DEBUG_COLOR #define APP_USBD_MSC_CONFIG_DEBUG_COLOR 0 @@ -5982,12 +8607,119 @@ // -// MEM_MANAGER_ENABLE_LOGS - Enable debug trace in the module. - - -#ifndef MEM_MANAGER_ENABLE_LOGS -#define MEM_MANAGER_ENABLE_LOGS 0 +// APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_ENABLED +#define APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_ENABLED 0 #endif +// APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_LEVEL +#define APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_LEVEL 3 +#endif + +// APP_USBD_NRF_DFU_TRIGGER_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef APP_USBD_NRF_DFU_TRIGGER_CONFIG_INFO_COLOR +#define APP_USBD_NRF_DFU_TRIGGER_CONFIG_INFO_COLOR 0 +#endif + +// APP_USBD_NRF_DFU_TRIGGER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef APP_USBD_NRF_DFU_TRIGGER_CONFIG_DEBUG_COLOR +#define APP_USBD_NRF_DFU_TRIGGER_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// NRF_ATFIFO_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRF_ATFIFO_CONFIG_LOG_ENABLED +#define NRF_ATFIFO_CONFIG_LOG_ENABLED 0 +#endif +// NRF_ATFIFO_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_ATFIFO_CONFIG_LOG_LEVEL +#define NRF_ATFIFO_CONFIG_LOG_LEVEL 3 +#endif + +// NRF_ATFIFO_CONFIG_LOG_INIT_FILTER_LEVEL - Initial severity level if dynamic filtering is enabled + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_ATFIFO_CONFIG_LOG_INIT_FILTER_LEVEL +#define NRF_ATFIFO_CONFIG_LOG_INIT_FILTER_LEVEL 3 +#endif + +// NRF_ATFIFO_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_ATFIFO_CONFIG_INFO_COLOR +#define NRF_ATFIFO_CONFIG_INFO_COLOR 0 +#endif + +// NRF_ATFIFO_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_ATFIFO_CONFIG_DEBUG_COLOR +#define NRF_ATFIFO_CONFIG_DEBUG_COLOR 0 +#endif + +// // NRF_BALLOC_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== @@ -5995,44 +8727,60 @@ #define NRF_BALLOC_CONFIG_LOG_ENABLED 0 #endif // NRF_BALLOC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_BALLOC_CONFIG_LOG_LEVEL #define NRF_BALLOC_CONFIG_LOG_LEVEL 3 #endif -// NRF_BALLOC_CONFIG_INFO_COLOR - ANSI escape code prefix. +// NRF_BALLOC_CONFIG_INITIAL_LOG_LEVEL - Initial severity level if dynamic filtering is enabled. + -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// If module generates a lot of logs, initial log level can +// be decreased to prevent flooding. Severity level can be +// increased on instance basis. +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_BALLOC_CONFIG_INITIAL_LOG_LEVEL +#define NRF_BALLOC_CONFIG_INITIAL_LOG_LEVEL 3 +#endif + +// NRF_BALLOC_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_BALLOC_CONFIG_INFO_COLOR #define NRF_BALLOC_CONFIG_INFO_COLOR 0 #endif // NRF_BALLOC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_BALLOC_CONFIG_DEBUG_COLOR #define NRF_BALLOC_CONFIG_DEBUG_COLOR 0 @@ -6046,44 +8794,44 @@ #define NRF_CLI_BLE_UART_CONFIG_LOG_ENABLED 0 #endif // NRF_CLI_BLE_UART_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_CLI_BLE_UART_CONFIG_LOG_LEVEL #define NRF_CLI_BLE_UART_CONFIG_LOG_LEVEL 3 #endif // NRF_CLI_BLE_UART_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_CLI_BLE_UART_CONFIG_INFO_COLOR #define NRF_CLI_BLE_UART_CONFIG_INFO_COLOR 0 #endif // NRF_CLI_BLE_UART_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_CLI_BLE_UART_CONFIG_DEBUG_COLOR #define NRF_CLI_BLE_UART_CONFIG_DEBUG_COLOR 0 @@ -6091,50 +8839,101 @@ // +// NRF_CLI_LIBUARTE_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRF_CLI_LIBUARTE_CONFIG_LOG_ENABLED +#define NRF_CLI_LIBUARTE_CONFIG_LOG_ENABLED 0 +#endif +// NRF_CLI_LIBUARTE_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_CLI_LIBUARTE_CONFIG_LOG_LEVEL +#define NRF_CLI_LIBUARTE_CONFIG_LOG_LEVEL 3 +#endif + +// NRF_CLI_LIBUARTE_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_CLI_LIBUARTE_CONFIG_INFO_COLOR +#define NRF_CLI_LIBUARTE_CONFIG_INFO_COLOR 0 +#endif + +// NRF_CLI_LIBUARTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_CLI_LIBUARTE_CONFIG_DEBUG_COLOR +#define NRF_CLI_LIBUARTE_CONFIG_DEBUG_COLOR 0 +#endif + +// + // NRF_CLI_UART_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_CLI_UART_CONFIG_LOG_ENABLED #define NRF_CLI_UART_CONFIG_LOG_ENABLED 0 #endif // NRF_CLI_UART_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_CLI_UART_CONFIG_LOG_LEVEL #define NRF_CLI_UART_CONFIG_LOG_LEVEL 3 #endif // NRF_CLI_UART_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_CLI_UART_CONFIG_INFO_COLOR #define NRF_CLI_UART_CONFIG_INFO_COLOR 0 #endif // NRF_CLI_UART_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_CLI_UART_CONFIG_DEBUG_COLOR #define NRF_CLI_UART_CONFIG_DEBUG_COLOR 0 @@ -6142,50 +8941,101 @@ // +// NRF_LIBUARTE_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRF_LIBUARTE_CONFIG_LOG_ENABLED +#define NRF_LIBUARTE_CONFIG_LOG_ENABLED 0 +#endif +// NRF_LIBUARTE_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_LIBUARTE_CONFIG_LOG_LEVEL +#define NRF_LIBUARTE_CONFIG_LOG_LEVEL 3 +#endif + +// NRF_LIBUARTE_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_LIBUARTE_CONFIG_INFO_COLOR +#define NRF_LIBUARTE_CONFIG_INFO_COLOR 0 +#endif + +// NRF_LIBUARTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_LIBUARTE_CONFIG_DEBUG_COLOR +#define NRF_LIBUARTE_CONFIG_DEBUG_COLOR 0 +#endif + +// + // NRF_MEMOBJ_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_MEMOBJ_CONFIG_LOG_ENABLED #define NRF_MEMOBJ_CONFIG_LOG_ENABLED 0 #endif // NRF_MEMOBJ_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_MEMOBJ_CONFIG_LOG_LEVEL #define NRF_MEMOBJ_CONFIG_LOG_LEVEL 3 #endif // NRF_MEMOBJ_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_MEMOBJ_CONFIG_INFO_COLOR #define NRF_MEMOBJ_CONFIG_INFO_COLOR 0 #endif // NRF_MEMOBJ_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_MEMOBJ_CONFIG_DEBUG_COLOR #define NRF_MEMOBJ_CONFIG_DEBUG_COLOR 0 @@ -6199,44 +9049,44 @@ #define NRF_PWR_MGMT_CONFIG_LOG_ENABLED 0 #endif // NRF_PWR_MGMT_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_PWR_MGMT_CONFIG_LOG_LEVEL #define NRF_PWR_MGMT_CONFIG_LOG_LEVEL 3 #endif // NRF_PWR_MGMT_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_PWR_MGMT_CONFIG_INFO_COLOR #define NRF_PWR_MGMT_CONFIG_INFO_COLOR 0 #endif // NRF_PWR_MGMT_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_PWR_MGMT_CONFIG_DEBUG_COLOR #define NRF_PWR_MGMT_CONFIG_DEBUG_COLOR 0 @@ -6244,50 +9094,113 @@ // +// NRF_QUEUE_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRF_QUEUE_CONFIG_LOG_ENABLED +#define NRF_QUEUE_CONFIG_LOG_ENABLED 0 +#endif +// NRF_QUEUE_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_QUEUE_CONFIG_LOG_LEVEL +#define NRF_QUEUE_CONFIG_LOG_LEVEL 3 +#endif + +// NRF_QUEUE_CONFIG_LOG_INIT_FILTER_LEVEL - Initial severity level if dynamic filtering is enabled + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_QUEUE_CONFIG_LOG_INIT_FILTER_LEVEL +#define NRF_QUEUE_CONFIG_LOG_INIT_FILTER_LEVEL 3 +#endif + +// NRF_QUEUE_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_QUEUE_CONFIG_INFO_COLOR +#define NRF_QUEUE_CONFIG_INFO_COLOR 0 +#endif + +// NRF_QUEUE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_QUEUE_CONFIG_DEBUG_COLOR +#define NRF_QUEUE_CONFIG_DEBUG_COLOR 0 +#endif + +// + // NRF_SDH_ANT_LOG_ENABLED - Enable logging in SoftDevice handler (ANT) module. //========================================================== #ifndef NRF_SDH_ANT_LOG_ENABLED -#define NRF_SDH_ANT_LOG_ENABLED 1 +#define NRF_SDH_ANT_LOG_ENABLED 0 #endif // NRF_SDH_ANT_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_SDH_ANT_LOG_LEVEL #define NRF_SDH_ANT_LOG_LEVEL 3 #endif // NRF_SDH_ANT_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_ANT_INFO_COLOR #define NRF_SDH_ANT_INFO_COLOR 0 #endif // NRF_SDH_ANT_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_ANT_DEBUG_COLOR #define NRF_SDH_ANT_DEBUG_COLOR 0 @@ -6301,44 +9214,44 @@ #define NRF_SDH_BLE_LOG_ENABLED 1 #endif // NRF_SDH_BLE_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_SDH_BLE_LOG_LEVEL #define NRF_SDH_BLE_LOG_LEVEL 3 #endif // NRF_SDH_BLE_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_BLE_INFO_COLOR #define NRF_SDH_BLE_INFO_COLOR 0 #endif // NRF_SDH_BLE_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_BLE_DEBUG_COLOR #define NRF_SDH_BLE_DEBUG_COLOR 0 @@ -6352,44 +9265,44 @@ #define NRF_SDH_LOG_ENABLED 1 #endif // NRF_SDH_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_SDH_LOG_LEVEL #define NRF_SDH_LOG_LEVEL 3 #endif // NRF_SDH_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_INFO_COLOR #define NRF_SDH_INFO_COLOR 0 #endif // NRF_SDH_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_DEBUG_COLOR #define NRF_SDH_DEBUG_COLOR 0 @@ -6403,44 +9316,44 @@ #define NRF_SDH_SOC_LOG_ENABLED 1 #endif // NRF_SDH_SOC_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_SDH_SOC_LOG_LEVEL #define NRF_SDH_SOC_LOG_LEVEL 3 #endif // NRF_SDH_SOC_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_SOC_INFO_COLOR #define NRF_SDH_SOC_INFO_COLOR 0 #endif // NRF_SDH_SOC_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_SOC_DEBUG_COLOR #define NRF_SDH_SOC_DEBUG_COLOR 0 @@ -6448,30 +9361,203 @@ // -// +// NRF_SORTLIST_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRF_SORTLIST_CONFIG_LOG_ENABLED +#define NRF_SORTLIST_CONFIG_LOG_ENABLED 0 +#endif +// NRF_SORTLIST_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_SORTLIST_CONFIG_LOG_LEVEL +#define NRF_SORTLIST_CONFIG_LOG_LEVEL 3 +#endif + +// NRF_SORTLIST_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_SORTLIST_CONFIG_INFO_COLOR +#define NRF_SORTLIST_CONFIG_INFO_COLOR 0 +#endif + +// NRF_SORTLIST_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_SORTLIST_CONFIG_DEBUG_COLOR +#define NRF_SORTLIST_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// NRF_TWI_SENSOR_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NRF_TWI_SENSOR_CONFIG_LOG_ENABLED +#define NRF_TWI_SENSOR_CONFIG_LOG_ENABLED 0 +#endif +// NRF_TWI_SENSOR_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NRF_TWI_SENSOR_CONFIG_LOG_LEVEL +#define NRF_TWI_SENSOR_CONFIG_LOG_LEVEL 3 +#endif + +// NRF_TWI_SENSOR_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_TWI_SENSOR_CONFIG_INFO_COLOR +#define NRF_TWI_SENSOR_CONFIG_INFO_COLOR 0 +#endif + +// NRF_TWI_SENSOR_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NRF_TWI_SENSOR_CONFIG_DEBUG_COLOR +#define NRF_TWI_SENSOR_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// //========================================================== -// -//========================================================== - -// -//========================================================== - -// -//========================================================== - -// nRF_NFC +// nrf_log in nRF_Serialization //========================================================== -// NFC_BLE_OOB_ADVDATA_ENABLED - nfc_ble_oob_advdata - Encoding the advertising data and/or scan response data which is specific for OOB pairing +// SER_HAL_TRANSPORT_CONFIG_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef SER_HAL_TRANSPORT_CONFIG_LOG_ENABLED +#define SER_HAL_TRANSPORT_CONFIG_LOG_ENABLED 0 +#endif +// SER_HAL_TRANSPORT_CONFIG_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef SER_HAL_TRANSPORT_CONFIG_LOG_LEVEL +#define SER_HAL_TRANSPORT_CONFIG_LOG_LEVEL 3 +#endif + +// SER_HAL_TRANSPORT_CONFIG_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef SER_HAL_TRANSPORT_CONFIG_INFO_COLOR +#define SER_HAL_TRANSPORT_CONFIG_INFO_COLOR 0 +#endif + +// SER_HAL_TRANSPORT_CONFIG_DEBUG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef SER_HAL_TRANSPORT_CONFIG_DEBUG_COLOR +#define SER_HAL_TRANSPORT_CONFIG_DEBUG_COLOR 0 +#endif + +// + +// +//========================================================== + +// +//========================================================== + +// +//========================================================== + +// +//========================================================== + +// nRF_NFC + +//========================================================== +// NFC_AC_REC_ENABLED - nfc_ac_rec - NFC NDEF Alternative Carrier record encoder + + +#ifndef NFC_AC_REC_ENABLED +#define NFC_AC_REC_ENABLED 0 +#endif + +// NFC_AC_REC_PARSER_ENABLED - nfc_ac_rec_parser - Alternative Carrier record parser + + +#ifndef NFC_AC_REC_PARSER_ENABLED +#define NFC_AC_REC_PARSER_ENABLED 0 +#endif + +// NFC_BLE_OOB_ADVDATA_ENABLED - nfc_ble_oob_advdata - AD data for OOB pairing encoder //========================================================== #ifndef NFC_BLE_OOB_ADVDATA_ENABLED #define NFC_BLE_OOB_ADVDATA_ENABLED 0 #endif // ADVANCED_ADVDATA_SUPPORT - Non-mandatory AD types for BLE OOB pairing are encoded inside the NDEF message (e.g. service UUIDs) - -// <1=> Enabled -// <0=> Disabled + +// <1=> Enabled +// <0=> Disabled #ifndef ADVANCED_ADVDATA_SUPPORT #define ADVANCED_ADVDATA_SUPPORT 0 @@ -6479,6 +9565,13 @@ // +// NFC_BLE_OOB_ADVDATA_PARSER_ENABLED - nfc_ble_oob_advdata_parser - BLE OOB pairing AD data parser + + +#ifndef NFC_BLE_OOB_ADVDATA_PARSER_ENABLED +#define NFC_BLE_OOB_ADVDATA_PARSER_ENABLED 0 +#endif + // NFC_BLE_PAIR_LIB_ENABLED - nfc_ble_pair_lib - Library parameters //========================================================== #ifndef NFC_BLE_PAIR_LIB_ENABLED @@ -6490,44 +9583,44 @@ #define NFC_BLE_PAIR_LIB_LOG_ENABLED 0 #endif // NFC_BLE_PAIR_LIB_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NFC_BLE_PAIR_LIB_LOG_LEVEL #define NFC_BLE_PAIR_LIB_LOG_LEVEL 3 #endif // NFC_BLE_PAIR_LIB_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_BLE_PAIR_LIB_INFO_COLOR #define NFC_BLE_PAIR_LIB_INFO_COLOR 0 #endif // NFC_BLE_PAIR_LIB_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_BLE_PAIR_LIB_DEBUG_COLOR #define NFC_BLE_PAIR_LIB_DEBUG_COLOR 0 @@ -6546,84 +9639,28 @@ #define BLE_NFC_SEC_PARAM_BOND 1 #endif // BLE_NFC_SEC_PARAM_KDIST_OWN_ENC - Enables Long Term Key and Master Identification distribution by device. - + #ifndef BLE_NFC_SEC_PARAM_KDIST_OWN_ENC #define BLE_NFC_SEC_PARAM_KDIST_OWN_ENC 1 #endif // BLE_NFC_SEC_PARAM_KDIST_OWN_ID - Enables Identity Resolving Key and Identity Address Information distribution by device. - + #ifndef BLE_NFC_SEC_PARAM_KDIST_OWN_ID #define BLE_NFC_SEC_PARAM_KDIST_OWN_ID 1 #endif // BLE_NFC_SEC_PARAM_KDIST_PEER_ENC - Enables Long Term Key and Master Identification distribution by peer. - + #ifndef BLE_NFC_SEC_PARAM_KDIST_PEER_ENC #define BLE_NFC_SEC_PARAM_KDIST_PEER_ENC 1 #endif // BLE_NFC_SEC_PARAM_KDIST_PEER_ID - Enables Identity Resolving Key and Identity Address Information distribution by peer. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_PEER_ID -#define BLE_NFC_SEC_PARAM_KDIST_PEER_ID 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_OWN_ENC - Enables Long Term Key and Master Identification distribution by device. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_OWN_ENC -#define BLE_NFC_SEC_PARAM_KDIST_OWN_ENC 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_OWN_ID - Enables Identity Resolving Key and Identity Address Information distribution by device. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_OWN_ID -#define BLE_NFC_SEC_PARAM_KDIST_OWN_ID 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_PEER_ENC - Enables Long Term Key and Master Identification distribution by peer. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_PEER_ENC -#define BLE_NFC_SEC_PARAM_KDIST_PEER_ENC 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_PEER_ID - Enables Identity Resolving Key and Identity Address Information distribution by peer. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_PEER_ID -#define BLE_NFC_SEC_PARAM_KDIST_PEER_ID 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_OWN_ENC - Enables Long Term Key and Master Identification distribution by device. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_OWN_ENC -#define BLE_NFC_SEC_PARAM_KDIST_OWN_ENC 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_OWN_ID - Enables Identity Resolving Key and Identity Address Information distribution by device. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_OWN_ID -#define BLE_NFC_SEC_PARAM_KDIST_OWN_ID 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_PEER_ENC - Enables Long Term Key and Master Identification distribution by peer. - - -#ifndef BLE_NFC_SEC_PARAM_KDIST_PEER_ENC -#define BLE_NFC_SEC_PARAM_KDIST_PEER_ENC 1 -#endif - -// BLE_NFC_SEC_PARAM_KDIST_PEER_ID - Enables Identity Resolving Key and Identity Address Information distribution by peer. - + #ifndef BLE_NFC_SEC_PARAM_KDIST_PEER_ID #define BLE_NFC_SEC_PARAM_KDIST_PEER_ID 1 @@ -6632,53 +9669,109 @@ // // BLE_NFC_SEC_PARAM_MIN_KEY_SIZE - Minimal size of a security key. - -// <7=> 7 -// <8=> 8 -// <9=> 9 -// <10=> 10 -// <11=> 11 -// <12=> 12 -// <13=> 13 -// <14=> 14 -// <15=> 15 -// <16=> 16 + +// <7=> 7 +// <8=> 8 +// <9=> 9 +// <10=> 10 +// <11=> 11 +// <12=> 12 +// <13=> 13 +// <14=> 14 +// <15=> 15 +// <16=> 16 #ifndef BLE_NFC_SEC_PARAM_MIN_KEY_SIZE #define BLE_NFC_SEC_PARAM_MIN_KEY_SIZE 7 #endif // BLE_NFC_SEC_PARAM_MAX_KEY_SIZE - Maximal size of a security key. - -// <7=> 7 -// <8=> 8 -// <9=> 9 -// <10=> 10 -// <11=> 11 -// <12=> 12 -// <13=> 13 -// <14=> 14 -// <15=> 15 -// <16=> 16 + +// <7=> 7 +// <8=> 8 +// <9=> 9 +// <10=> 10 +// <11=> 11 +// <12=> 12 +// <13=> 13 +// <14=> 14 +// <15=> 15 +// <16=> 16 #ifndef BLE_NFC_SEC_PARAM_MAX_KEY_SIZE #define BLE_NFC_SEC_PARAM_MAX_KEY_SIZE 16 #endif -// +// //========================================================== // +// NFC_BLE_PAIR_MSG_ENABLED - nfc_ble_pair_msg - NDEF message for OOB pairing encoder + + +#ifndef NFC_BLE_PAIR_MSG_ENABLED +#define NFC_BLE_PAIR_MSG_ENABLED 0 +#endif + +// NFC_CH_COMMON_ENABLED - nfc_ble_pair_common - OOB pairing common data + + +#ifndef NFC_CH_COMMON_ENABLED +#define NFC_CH_COMMON_ENABLED 0 +#endif + +// NFC_EP_OOB_REC_ENABLED - nfc_ep_oob_rec - EP record for BLE pairing encoder + + +#ifndef NFC_EP_OOB_REC_ENABLED +#define NFC_EP_OOB_REC_ENABLED 0 +#endif + +// NFC_HS_REC_ENABLED - nfc_hs_rec - Handover Select NDEF record encoder + + +#ifndef NFC_HS_REC_ENABLED +#define NFC_HS_REC_ENABLED 0 +#endif + +// NFC_LE_OOB_REC_ENABLED - nfc_le_oob_rec - LE record for BLE pairing encoder + + +#ifndef NFC_LE_OOB_REC_ENABLED +#define NFC_LE_OOB_REC_ENABLED 0 +#endif + +// NFC_LE_OOB_REC_PARSER_ENABLED - nfc_le_oob_rec_parser - LE record parser + + +#ifndef NFC_LE_OOB_REC_PARSER_ENABLED +#define NFC_LE_OOB_REC_PARSER_ENABLED 0 +#endif + +// NFC_NDEF_LAUNCHAPP_MSG_ENABLED - nfc_launchapp_msg - Encoding data for NDEF Application Launching message for NFC Tag + + +#ifndef NFC_NDEF_LAUNCHAPP_MSG_ENABLED +#define NFC_NDEF_LAUNCHAPP_MSG_ENABLED 0 +#endif + +// NFC_NDEF_LAUNCHAPP_REC_ENABLED - nfc_launchapp_rec - Encoding data for NDEF Application Launching record for NFC Tag + + +#ifndef NFC_NDEF_LAUNCHAPP_REC_ENABLED +#define NFC_NDEF_LAUNCHAPP_REC_ENABLED 0 +#endif + // NFC_NDEF_MSG_ENABLED - nfc_ndef_msg - NFC NDEF Message generator module //========================================================== #ifndef NFC_NDEF_MSG_ENABLED #define NFC_NDEF_MSG_ENABLED 0 #endif // NFC_NDEF_MSG_TAG_TYPE - NFC Tag Type - -// <2=> Type 2 Tag -// <4=> Type 4 Tag + +// <2=> Type 2 Tag +// <4=> Type 4 Tag #ifndef NFC_NDEF_MSG_TAG_TYPE #define NFC_NDEF_MSG_TAG_TYPE 2 @@ -6697,28 +9790,28 @@ #define NFC_NDEF_MSG_PARSER_LOG_ENABLED 0 #endif // NFC_NDEF_MSG_PARSER_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NFC_NDEF_MSG_PARSER_LOG_LEVEL #define NFC_NDEF_MSG_PARSER_LOG_LEVEL 3 #endif // NFC_NDEF_MSG_PARSER_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_NDEF_MSG_PARSER_INFO_COLOR #define NFC_NDEF_MSG_PARSER_INFO_COLOR 0 @@ -6728,6 +9821,13 @@ // +// NFC_NDEF_RECORD_ENABLED - nfc_ndef_record - NFC NDEF Record generator module + + +#ifndef NFC_NDEF_RECORD_ENABLED +#define NFC_NDEF_RECORD_ENABLED 0 +#endif + // NFC_NDEF_RECORD_PARSER_ENABLED - nfc_ndef_record_parser - NFC NDEF Record parser module //========================================================== #ifndef NFC_NDEF_RECORD_PARSER_ENABLED @@ -6739,28 +9839,28 @@ #define NFC_NDEF_RECORD_PARSER_LOG_ENABLED 0 #endif // NFC_NDEF_RECORD_PARSER_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NFC_NDEF_RECORD_PARSER_LOG_LEVEL #define NFC_NDEF_RECORD_PARSER_LOG_LEVEL 3 #endif // NFC_NDEF_RECORD_PARSER_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_NDEF_RECORD_PARSER_INFO_COLOR #define NFC_NDEF_RECORD_PARSER_INFO_COLOR 0 @@ -6770,23 +9870,44 @@ // +// NFC_NDEF_TEXT_RECORD_ENABLED - nfc_text_rec - Encoding data for a text record for NFC Tag + + +#ifndef NFC_NDEF_TEXT_RECORD_ENABLED +#define NFC_NDEF_TEXT_RECORD_ENABLED 0 +#endif + +// NFC_NDEF_URI_MSG_ENABLED - nfc_uri_msg - Encoding data for NDEF message with URI record for NFC Tag + + +#ifndef NFC_NDEF_URI_MSG_ENABLED +#define NFC_NDEF_URI_MSG_ENABLED 0 +#endif + +// NFC_NDEF_URI_REC_ENABLED - nfc_uri_rec - Encoding data for a URI record for NFC Tag + + +#ifndef NFC_NDEF_URI_REC_ENABLED +#define NFC_NDEF_URI_REC_ENABLED 0 +#endif + // NFC_T2T_HAL_ENABLED - nfc_t2t_hal - Hardware Abstraction Layer for NFC library. //========================================================== #ifndef NFC_T2T_HAL_ENABLED #define NFC_T2T_HAL_ENABLED 0 #endif // NFCT_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NFCT_CONFIG_IRQ_PRIORITY #define NFCT_CONFIG_IRQ_PRIORITY 7 @@ -6798,88 +9919,88 @@ #define HAL_NFC_CONFIG_LOG_ENABLED 0 #endif // HAL_NFC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef HAL_NFC_CONFIG_LOG_LEVEL #define HAL_NFC_CONFIG_LOG_LEVEL 3 #endif // HAL_NFC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_INFO_COLOR #define HAL_NFC_CONFIG_INFO_COLOR 0 #endif // HAL_NFC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_DEBUG_COLOR #define HAL_NFC_CONFIG_DEBUG_COLOR 0 #endif // HAL_NFC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef HAL_NFC_CONFIG_LOG_LEVEL #define HAL_NFC_CONFIG_LOG_LEVEL 3 #endif // HAL_NFC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_INFO_COLOR #define HAL_NFC_CONFIG_INFO_COLOR 0 #endif // HAL_NFC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_DEBUG_COLOR #define HAL_NFC_CONFIG_DEBUG_COLOR 0 @@ -6893,560 +10014,560 @@ #define HAL_NFC_CONFIG_DEBUG_PIN_ENABLED 0 #endif // HAL_NFC_HCLOCK_ON_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_ON_DEBUG_PIN #define HAL_NFC_HCLOCK_ON_DEBUG_PIN 11 #endif // HAL_NFC_HCLOCK_OFF_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_OFF_DEBUG_PIN #define HAL_NFC_HCLOCK_OFF_DEBUG_PIN 12 #endif // HAL_NFC_NFC_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_NFC_EVENT_DEBUG_PIN #define HAL_NFC_NFC_EVENT_DEBUG_PIN 24 #endif // HAL_NFC_DETECT_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_DETECT_EVENT_DEBUG_PIN #define HAL_NFC_DETECT_EVENT_DEBUG_PIN 25 #endif // HAL_NFC_TIMER4_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_TIMER4_EVENT_DEBUG_PIN #define HAL_NFC_TIMER4_EVENT_DEBUG_PIN 28 #endif // HAL_NFC_HCLOCK_ON_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_ON_DEBUG_PIN #define HAL_NFC_HCLOCK_ON_DEBUG_PIN 31 #endif // HAL_NFC_HCLOCK_OFF_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_OFF_DEBUG_PIN #define HAL_NFC_HCLOCK_OFF_DEBUG_PIN 31 #endif // HAL_NFC_NFC_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_NFC_EVENT_DEBUG_PIN #define HAL_NFC_NFC_EVENT_DEBUG_PIN 31 #endif // HAL_NFC_DETECT_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_DETECT_EVENT_DEBUG_PIN #define HAL_NFC_DETECT_EVENT_DEBUG_PIN 31 #endif // HAL_NFC_TIMER4_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_TIMER4_EVENT_DEBUG_PIN #define HAL_NFC_TIMER4_EVENT_DEBUG_PIN 31 @@ -7456,23 +10577,149 @@ // +// NFC_T2T_PARSER_ENABLED - nfc_type_2_tag_parser - Parser for decoding Type 2 Tag data +//========================================================== +#ifndef NFC_T2T_PARSER_ENABLED +#define NFC_T2T_PARSER_ENABLED 0 +#endif +// NFC_T2T_PARSER_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NFC_T2T_PARSER_LOG_ENABLED +#define NFC_T2T_PARSER_LOG_ENABLED 0 +#endif +// NFC_T2T_PARSER_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NFC_T2T_PARSER_LOG_LEVEL +#define NFC_T2T_PARSER_LOG_LEVEL 3 +#endif + +// NFC_T2T_PARSER_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NFC_T2T_PARSER_INFO_COLOR +#define NFC_T2T_PARSER_INFO_COLOR 0 +#endif + +// + +// + +// NFC_T4T_APDU_ENABLED - nfc_t4t_apdu - APDU encoder/decoder for Type 4 Tag +//========================================================== +#ifndef NFC_T4T_APDU_ENABLED +#define NFC_T4T_APDU_ENABLED 0 +#endif +// NFC_T4T_APDU_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NFC_T4T_APDU_LOG_ENABLED +#define NFC_T4T_APDU_LOG_ENABLED 0 +#endif +// NFC_T4T_APDU_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NFC_T4T_APDU_LOG_LEVEL +#define NFC_T4T_APDU_LOG_LEVEL 3 +#endif + +// NFC_T4T_APDU_LOG_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NFC_T4T_APDU_LOG_COLOR +#define NFC_T4T_APDU_LOG_COLOR 0 +#endif + +// + +// + +// NFC_T4T_CC_FILE_PARSER_ENABLED - nfc_t4t_cc_file - Capability Container file for Type 4 Tag +//========================================================== +#ifndef NFC_T4T_CC_FILE_PARSER_ENABLED +#define NFC_T4T_CC_FILE_PARSER_ENABLED 0 +#endif +// NFC_T4T_CC_FILE_PARSER_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NFC_T4T_CC_FILE_PARSER_LOG_ENABLED +#define NFC_T4T_CC_FILE_PARSER_LOG_ENABLED 0 +#endif +// NFC_T4T_CC_FILE_PARSER_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NFC_T4T_CC_FILE_PARSER_LOG_LEVEL +#define NFC_T4T_CC_FILE_PARSER_LOG_LEVEL 3 +#endif + +// NFC_T4T_CC_FILE_PARSER_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NFC_T4T_CC_FILE_PARSER_INFO_COLOR +#define NFC_T4T_CC_FILE_PARSER_INFO_COLOR 0 +#endif + +// + +// + // NFC_T4T_HAL_ENABLED - nfc_t4t_hal - Hardware Abstraction Layer for NFC library. //========================================================== #ifndef NFC_T4T_HAL_ENABLED #define NFC_T4T_HAL_ENABLED 0 #endif // NFCT_CONFIG_IRQ_PRIORITY - Interrupt priority - + // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NFCT_CONFIG_IRQ_PRIORITY #define NFCT_CONFIG_IRQ_PRIORITY 7 @@ -7484,88 +10731,88 @@ #define HAL_NFC_CONFIG_LOG_ENABLED 0 #endif // HAL_NFC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef HAL_NFC_CONFIG_LOG_LEVEL #define HAL_NFC_CONFIG_LOG_LEVEL 3 #endif // HAL_NFC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_INFO_COLOR #define HAL_NFC_CONFIG_INFO_COLOR 0 #endif // HAL_NFC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_DEBUG_COLOR #define HAL_NFC_CONFIG_DEBUG_COLOR 0 #endif // HAL_NFC_CONFIG_LOG_LEVEL - Default Severity level - -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef HAL_NFC_CONFIG_LOG_LEVEL #define HAL_NFC_CONFIG_LOG_LEVEL 3 #endif // HAL_NFC_CONFIG_INFO_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_INFO_COLOR #define HAL_NFC_CONFIG_INFO_COLOR 0 #endif // HAL_NFC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. - -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef HAL_NFC_CONFIG_DEBUG_COLOR #define HAL_NFC_CONFIG_DEBUG_COLOR 0 @@ -7579,560 +10826,560 @@ #define HAL_NFC_CONFIG_DEBUG_PIN_ENABLED 0 #endif // HAL_NFC_HCLOCK_ON_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_ON_DEBUG_PIN #define HAL_NFC_HCLOCK_ON_DEBUG_PIN 31 #endif // HAL_NFC_HCLOCK_OFF_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_OFF_DEBUG_PIN #define HAL_NFC_HCLOCK_OFF_DEBUG_PIN 31 #endif // HAL_NFC_NFC_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_NFC_EVENT_DEBUG_PIN #define HAL_NFC_NFC_EVENT_DEBUG_PIN 31 #endif // HAL_NFC_DETECT_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_DETECT_EVENT_DEBUG_PIN #define HAL_NFC_DETECT_EVENT_DEBUG_PIN 31 #endif // HAL_NFC_TIMER4_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_TIMER4_EVENT_DEBUG_PIN #define HAL_NFC_TIMER4_EVENT_DEBUG_PIN 31 #endif // HAL_NFC_HCLOCK_ON_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_ON_DEBUG_PIN #define HAL_NFC_HCLOCK_ON_DEBUG_PIN 31 #endif // HAL_NFC_HCLOCK_OFF_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_HCLOCK_OFF_DEBUG_PIN #define HAL_NFC_HCLOCK_OFF_DEBUG_PIN 31 #endif // HAL_NFC_NFC_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_NFC_EVENT_DEBUG_PIN #define HAL_NFC_NFC_EVENT_DEBUG_PIN 31 #endif // HAL_NFC_DETECT_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_DETECT_EVENT_DEBUG_PIN #define HAL_NFC_DETECT_EVENT_DEBUG_PIN 31 #endif // HAL_NFC_TIMER4_EVENT_DEBUG_PIN - Pin number - -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <32=> 32 (P1.0) -// <33=> 33 (P1.1) -// <34=> 34 (P1.2) -// <35=> 35 (P1.3) -// <36=> 36 (P1.4) -// <37=> 37 (P1.5) -// <38=> 38 (P1.6) -// <39=> 39 (P1.7) -// <40=> 40 (P1.8) -// <41=> 41 (P1.9) -// <42=> 42 (P1.10) -// <43=> 43 (P1.11) -// <44=> 44 (P1.12) -// <45=> 45 (P1.13) -// <46=> 46 (P1.14) -// <47=> 47 (P1.15) -// <4294967295=> Not connected + +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <32=> 32 (P1.0) +// <33=> 33 (P1.1) +// <34=> 34 (P1.2) +// <35=> 35 (P1.3) +// <36=> 36 (P1.4) +// <37=> 37 (P1.5) +// <38=> 38 (P1.6) +// <39=> 39 (P1.7) +// <40=> 40 (P1.8) +// <41=> 41 (P1.9) +// <42=> 42 (P1.10) +// <43=> 43 (P1.11) +// <44=> 44 (P1.12) +// <45=> 45 (P1.13) +// <46=> 46 (P1.14) +// <47=> 47 (P1.15) +// <4294967295=> Not connected #ifndef HAL_NFC_TIMER4_EVENT_DEBUG_PIN #define HAL_NFC_TIMER4_EVENT_DEBUG_PIN 31 @@ -8142,510 +11389,491 @@ // -// +// NFC_T4T_HL_DETECTION_PROCEDURES_ENABLED - nfc_t4t_hl_detection_procedures - NDEF Detection Procedure for Type 4 Tag //========================================================== - -// nRF_Segger_RTT - +#ifndef NFC_T4T_HL_DETECTION_PROCEDURES_ENABLED +#define NFC_T4T_HL_DETECTION_PROCEDURES_ENABLED 0 +#endif +// NFC_T4T_HL_DETECTION_PROCEDURES_LOG_ENABLED - Enables logging in the module. //========================================================== -// segger_rtt - SEGGER RTT +#ifndef NFC_T4T_HL_DETECTION_PROCEDURES_LOG_ENABLED +#define NFC_T4T_HL_DETECTION_PROCEDURES_LOG_ENABLED 0 +#endif +// NFC_T4T_HL_DETECTION_PROCEDURES_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug -//========================================================== -// SEGGER_RTT_CONFIG_BUFFER_SIZE_UP - Size of upstream buffer. -// Note that either @ref NRF_LOG_BACKEND_RTT_OUTPUT_BUFFER_SIZE -// or this value is actually used. It depends on which one is bigger. - -#ifndef SEGGER_RTT_CONFIG_BUFFER_SIZE_UP -#define SEGGER_RTT_CONFIG_BUFFER_SIZE_UP 512 +#ifndef NFC_T4T_HL_DETECTION_PROCEDURES_LOG_LEVEL +#define NFC_T4T_HL_DETECTION_PROCEDURES_LOG_LEVEL 3 #endif -// SEGGER_RTT_CONFIG_MAX_NUM_UP_BUFFERS - Size of upstream buffer. -#ifndef SEGGER_RTT_CONFIG_MAX_NUM_UP_BUFFERS -#define SEGGER_RTT_CONFIG_MAX_NUM_UP_BUFFERS 2 +// NFC_T4T_HL_DETECTION_PROCEDURES_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NFC_T4T_HL_DETECTION_PROCEDURES_INFO_COLOR +#define NFC_T4T_HL_DETECTION_PROCEDURES_INFO_COLOR 0 #endif -// SEGGER_RTT_CONFIG_BUFFER_SIZE_DOWN - Size of upstream buffer. -#ifndef SEGGER_RTT_CONFIG_BUFFER_SIZE_DOWN -#define SEGGER_RTT_CONFIG_BUFFER_SIZE_DOWN 16 -#endif - -// SEGGER_RTT_CONFIG_MAX_NUM_DOWN_BUFFERS - Size of upstream buffer. -#ifndef SEGGER_RTT_CONFIG_MAX_NUM_DOWN_BUFFERS -#define SEGGER_RTT_CONFIG_MAX_NUM_DOWN_BUFFERS 2 -#endif - -// SEGGER_RTT_CONFIG_DEFAULT_MODE - RTT behavior if the buffer is full. - - -// The following modes are supported: -// - SKIP - Do not block, output nothing. -// - TRIM - Do not block, output as much as fits. -// - BLOCK - Wait until there is space in the buffer. -// <0=> SKIP -// <1=> TRIM -// <2=> BLOCK_IF_FIFO_FULL - -#ifndef SEGGER_RTT_CONFIG_DEFAULT_MODE -#define SEGGER_RTT_CONFIG_DEFAULT_MODE 0 -#endif - -// -//========================================================== - -// -//========================================================== - -// nRF_SoftDevice - -//========================================================== -// NRF_SDH_ANT_ENABLED - nrf_sdh_ant - SoftDevice ANT event handler -//========================================================== -#ifndef NRF_SDH_ANT_ENABLED -#define NRF_SDH_ANT_ENABLED 0 -#endif -// ANT Channels - -//========================================================== -// NRF_SDH_ANT_TOTAL_CHANNELS_ALLOCATED - Allocated ANT channels. -#ifndef NRF_SDH_ANT_TOTAL_CHANNELS_ALLOCATED -#define NRF_SDH_ANT_TOTAL_CHANNELS_ALLOCATED 0 -#endif - -// NRF_SDH_ANT_ENCRYPTED_CHANNELS - Encrypted ANT channels. -#ifndef NRF_SDH_ANT_ENCRYPTED_CHANNELS -#define NRF_SDH_ANT_ENCRYPTED_CHANNELS 0 -#endif - -// -//========================================================== - -// ANT Queues - -//========================================================== -// NRF_SDH_ANT_EVENT_QUEUE_SIZE - Event queue size. -#ifndef NRF_SDH_ANT_EVENT_QUEUE_SIZE -#define NRF_SDH_ANT_EVENT_QUEUE_SIZE 32 -#endif - -// NRF_SDH_ANT_BURST_QUEUE_SIZE - ANT burst queue size. -#ifndef NRF_SDH_ANT_BURST_QUEUE_SIZE -#define NRF_SDH_ANT_BURST_QUEUE_SIZE 128 -#endif - -// -//========================================================== - -// ANT Observers - Observers and priority levels - -//========================================================== -// NRF_SDH_ANT_OBSERVER_PRIO_LEVELS - Total number of priority levels for ANT observers. -// This setting configures the number of priority levels available for the ANT event handlers. -// The priority level of a handler determines the order in which it receives events, with respect to other handlers. - -#ifndef NRF_SDH_ANT_OBSERVER_PRIO_LEVELS -#define NRF_SDH_ANT_OBSERVER_PRIO_LEVELS 2 -#endif - -// ANT Observers priorities - Invididual priorities - -//========================================================== -// ANT_BPWR_ANT_OBSERVER_PRIO -// Priority with which ANT events are dispatched to the Bicycle Power Profile. - -#ifndef ANT_BPWR_ANT_OBSERVER_PRIO -#define ANT_BPWR_ANT_OBSERVER_PRIO 1 -#endif - -// ANT_BSC_ANT_OBSERVER_PRIO -// Priority with which ANT events are dispatched to the Bicycle Speed and Cadence Profile. - -#ifndef ANT_BSC_ANT_OBSERVER_PRIO -#define ANT_BSC_ANT_OBSERVER_PRIO 1 -#endif - -// ANT_ENCRYPT_ANT_OBSERVER_PRIO -// Priority with which ANT events are dispatched to the Cryptographic ANT stack configuration module. - -#ifndef ANT_ENCRYPT_ANT_OBSERVER_PRIO -#define ANT_ENCRYPT_ANT_OBSERVER_PRIO 1 -#endif - -// ANT_HRM_ANT_OBSERVER_PRIO -// Priority with which ANT events are dispatched to the Heart Rate Monitor. - -#ifndef ANT_HRM_ANT_OBSERVER_PRIO -#define ANT_HRM_ANT_OBSERVER_PRIO 1 -#endif - -// ANT_SDM_ANT_OBSERVER_PRIO -// Priority with which ANT events are dispatched to the Stride Based Speed and Distance Monitor Profile. - -#ifndef ANT_SDM_ANT_OBSERVER_PRIO -#define ANT_SDM_ANT_OBSERVER_PRIO 1 -#endif - -// ANT_STATE_INDICATOR_ANT_OBSERVER_PRIO -// Priority with which ANT events are dispatched to the ANT state indicator module. - -#ifndef ANT_STATE_INDICATOR_ANT_OBSERVER_PRIO -#define ANT_STATE_INDICATOR_ANT_OBSERVER_PRIO 1 -#endif - -// BSP_BTN_ANT_OBSERVER_PRIO -// Priority with which ANT events are dispatched to the Button Control module. - -#ifndef BSP_BTN_ANT_OBSERVER_PRIO -#define BSP_BTN_ANT_OBSERVER_PRIO 1 -#endif - -// -//========================================================== - -// -//========================================================== - - // +// APDU_BUFF_SIZE - Size (in bytes) of the buffer for APDU storage +#ifndef APDU_BUFF_SIZE +#define APDU_BUFF_SIZE 250 +#endif + +// CC_STORAGE_BUFF_SIZE - Size (in bytes) of the buffer for CC file storage +#ifndef CC_STORAGE_BUFF_SIZE +#define CC_STORAGE_BUFF_SIZE 64 +#endif + +// + +// NFC_T4T_TLV_BLOCK_PARSER_ENABLED - nfc_t4t_tlv_block - TLV block for Type 4 Tag +//========================================================== +#ifndef NFC_T4T_TLV_BLOCK_PARSER_ENABLED +#define NFC_T4T_TLV_BLOCK_PARSER_ENABLED 0 +#endif +// NFC_T4T_TLV_BLOCK_PARSER_LOG_ENABLED - Enables logging in the module. +//========================================================== +#ifndef NFC_T4T_TLV_BLOCK_PARSER_LOG_ENABLED +#define NFC_T4T_TLV_BLOCK_PARSER_LOG_ENABLED 0 +#endif +// NFC_T4T_TLV_BLOCK_PARSER_LOG_LEVEL - Default Severity level + +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug + +#ifndef NFC_T4T_TLV_BLOCK_PARSER_LOG_LEVEL +#define NFC_T4T_TLV_BLOCK_PARSER_LOG_LEVEL 3 +#endif + +// NFC_T4T_TLV_BLOCK_PARSER_INFO_COLOR - ANSI escape code prefix. + +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White + +#ifndef NFC_T4T_TLV_BLOCK_PARSER_INFO_COLOR +#define NFC_T4T_TLV_BLOCK_PARSER_INFO_COLOR 0 +#endif + +// + +// + +// +//========================================================== + +// nRF_SoftDevice + +//========================================================== // NRF_SDH_BLE_ENABLED - nrf_sdh_ble - SoftDevice BLE event handler //========================================================== #ifndef NRF_SDH_BLE_ENABLED -#define NRF_SDH_BLE_ENABLED 1 +#define NRF_SDH_BLE_ENABLED 0 #endif // BLE Stack configuration - Stack configuration parameters -// These values are not used directly by the SoftDevice handler but the application or other libraries might depend on them. -// Keep them up-to-date with the desired configuration. +// The SoftDevice handler will configure the stack with these parameters when calling @ref nrf_sdh_ble_default_cfg_set. +// Other libraries might depend on these values; keep them up-to-date even if you are not explicitely calling @ref nrf_sdh_ble_default_cfg_set. //========================================================== -// NRF_SDH_BLE_PERIPHERAL_LINK_COUNT - Maximum number of peripheral links. +// NRF_SDH_BLE_GAP_DATA_LENGTH <27-251> + + +// Requested BLE GAP data length to be negotiated. + +#ifndef NRF_SDH_BLE_GAP_DATA_LENGTH +#define NRF_SDH_BLE_GAP_DATA_LENGTH 27 +#endif + +// NRF_SDH_BLE_PERIPHERAL_LINK_COUNT - Maximum number of peripheral links. #ifndef NRF_SDH_BLE_PERIPHERAL_LINK_COUNT #define NRF_SDH_BLE_PERIPHERAL_LINK_COUNT 0 #endif -// NRF_SDH_BLE_CENTRAL_LINK_COUNT - Maximum number of central links. +// NRF_SDH_BLE_CENTRAL_LINK_COUNT - Maximum number of central links. #ifndef NRF_SDH_BLE_CENTRAL_LINK_COUNT #define NRF_SDH_BLE_CENTRAL_LINK_COUNT 0 #endif -// NRF_SDH_BLE_TOTAL_LINK_COUNT - Maximum number of total concurrent connections using the default configuration. +// NRF_SDH_BLE_TOTAL_LINK_COUNT - Total link count. +// Maximum number of total concurrent connections using the default configuration. + #ifndef NRF_SDH_BLE_TOTAL_LINK_COUNT #define NRF_SDH_BLE_TOTAL_LINK_COUNT 1 #endif -// NRF_SDH_BLE_GAP_EVENT_LENGTH - The time set aside for this connection on every connection interval in 1.25 ms units. +// NRF_SDH_BLE_GAP_EVENT_LENGTH - GAP event length. +// The time set aside for this connection on every connection interval in 1.25 ms units. + #ifndef NRF_SDH_BLE_GAP_EVENT_LENGTH -#define NRF_SDH_BLE_GAP_EVENT_LENGTH 3 +#define NRF_SDH_BLE_GAP_EVENT_LENGTH 6 #endif -// NRF_SDH_BLE_GATT_MAX_MTU_SIZE - Static maximum MTU size. +// NRF_SDH_BLE_GATT_MAX_MTU_SIZE - Static maximum MTU size. #ifndef NRF_SDH_BLE_GATT_MAX_MTU_SIZE #define NRF_SDH_BLE_GATT_MAX_MTU_SIZE 23 #endif -// NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE - Attribute Table size in bytes. The size must be a multiple of 4. +// NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE - Attribute Table size in bytes. The size must be a multiple of 4. #ifndef NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE #define NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE 1408 #endif -// NRF_SDH_BLE_VS_UUID_COUNT - The number of vendor-specific UUIDs. +// NRF_SDH_BLE_VS_UUID_COUNT - The number of vendor-specific UUIDs. #ifndef NRF_SDH_BLE_VS_UUID_COUNT #define NRF_SDH_BLE_VS_UUID_COUNT 0 #endif // NRF_SDH_BLE_SERVICE_CHANGED - Include the Service Changed characteristic in the Attribute Table. - + #ifndef NRF_SDH_BLE_SERVICE_CHANGED #define NRF_SDH_BLE_SERVICE_CHANGED 0 #endif -// +// //========================================================== // BLE Observers - Observers and priority levels //========================================================== -// NRF_SDH_BLE_OBSERVER_PRIO_LEVELS - Total number of priority levels for BLE observers. +// NRF_SDH_BLE_OBSERVER_PRIO_LEVELS - Total number of priority levels for BLE observers. // This setting configures the number of priority levels available for BLE event handlers. // The priority level of a handler determines the order in which it receives events, with respect to other handlers. #ifndef NRF_SDH_BLE_OBSERVER_PRIO_LEVELS -#define NRF_SDH_BLE_OBSERVER_PRIO_LEVELS 3 +#define NRF_SDH_BLE_OBSERVER_PRIO_LEVELS 4 #endif // BLE Observers priorities - Invididual priorities //========================================================== -// BLE_ADV_BLE_OBSERVER_PRIO +// BLE_ADV_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Advertising module. #ifndef BLE_ADV_BLE_OBSERVER_PRIO -#define BLE_ADV_BLE_OBSERVER_PRIO 2 +#define BLE_ADV_BLE_OBSERVER_PRIO 1 #endif -// BLE_ANCS_C_BLE_OBSERVER_PRIO +// BLE_ANCS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Apple Notification Service Client. #ifndef BLE_ANCS_C_BLE_OBSERVER_PRIO #define BLE_ANCS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_ANS_C_BLE_OBSERVER_PRIO +// BLE_ANS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Alert Notification Service Client. #ifndef BLE_ANS_C_BLE_OBSERVER_PRIO #define BLE_ANS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_BAS_BLE_OBSERVER_PRIO +// BLE_BAS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Battery Service. #ifndef BLE_BAS_BLE_OBSERVER_PRIO #define BLE_BAS_BLE_OBSERVER_PRIO 2 #endif -// BLE_BAS_C_BLE_OBSERVER_PRIO +// BLE_BAS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Battery Service Client. #ifndef BLE_BAS_C_BLE_OBSERVER_PRIO #define BLE_BAS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_BPS_BLE_OBSERVER_PRIO +// BLE_BPS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Blood Pressure Service. #ifndef BLE_BPS_BLE_OBSERVER_PRIO #define BLE_BPS_BLE_OBSERVER_PRIO 2 #endif -// BLE_CONN_PARAMS_BLE_OBSERVER_PRIO +// BLE_CONN_PARAMS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Connection parameters module. #ifndef BLE_CONN_PARAMS_BLE_OBSERVER_PRIO -#define BLE_CONN_PARAMS_BLE_OBSERVER_PRIO 2 +#define BLE_CONN_PARAMS_BLE_OBSERVER_PRIO 1 #endif -// BLE_CONN_STATE_BLE_OBSERVER_PRIO +// BLE_CONN_STATE_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Connection State module. #ifndef BLE_CONN_STATE_BLE_OBSERVER_PRIO #define BLE_CONN_STATE_BLE_OBSERVER_PRIO 0 #endif -// BLE_CSCS_BLE_OBSERVER_PRIO +// BLE_CSCS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Cycling Speed and Cadence Service. #ifndef BLE_CSCS_BLE_OBSERVER_PRIO #define BLE_CSCS_BLE_OBSERVER_PRIO 2 #endif -// BLE_CTS_C_BLE_OBSERVER_PRIO +// BLE_CTS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Current Time Service Client. #ifndef BLE_CTS_C_BLE_OBSERVER_PRIO #define BLE_CTS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_DB_DISC_BLE_OBSERVER_PRIO +// BLE_DB_DISC_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Database Discovery module. #ifndef BLE_DB_DISC_BLE_OBSERVER_PRIO #define BLE_DB_DISC_BLE_OBSERVER_PRIO 1 #endif -// BLE_DFU_BLE_OBSERVER_PRIO +// BLE_DFU_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the DFU Service. #ifndef BLE_DFU_BLE_OBSERVER_PRIO #define BLE_DFU_BLE_OBSERVER_PRIO 2 #endif -// BLE_GLS_BLE_OBSERVER_PRIO +// BLE_DIS_C_BLE_OBSERVER_PRIO +// Priority with which BLE events are dispatched to the Device Information Client. + +#ifndef BLE_DIS_C_BLE_OBSERVER_PRIO +#define BLE_DIS_C_BLE_OBSERVER_PRIO 2 +#endif + +// BLE_GLS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Glucose Service. #ifndef BLE_GLS_BLE_OBSERVER_PRIO #define BLE_GLS_BLE_OBSERVER_PRIO 2 #endif -// BLE_HIDS_BLE_OBSERVER_PRIO +// BLE_HIDS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Human Interface Device Service. #ifndef BLE_HIDS_BLE_OBSERVER_PRIO #define BLE_HIDS_BLE_OBSERVER_PRIO 2 #endif -// BLE_HRS_BLE_OBSERVER_PRIO +// BLE_HRS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Heart Rate Service. #ifndef BLE_HRS_BLE_OBSERVER_PRIO #define BLE_HRS_BLE_OBSERVER_PRIO 2 #endif -// BLE_HRS_C_BLE_OBSERVER_PRIO +// BLE_HRS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Heart Rate Service Client. #ifndef BLE_HRS_C_BLE_OBSERVER_PRIO #define BLE_HRS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_HTS_BLE_OBSERVER_PRIO +// BLE_HTS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Health Thermometer Service. #ifndef BLE_HTS_BLE_OBSERVER_PRIO #define BLE_HTS_BLE_OBSERVER_PRIO 2 #endif -// BLE_IAS_BLE_OBSERVER_PRIO +// BLE_IAS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Immediate Alert Service. #ifndef BLE_IAS_BLE_OBSERVER_PRIO #define BLE_IAS_BLE_OBSERVER_PRIO 2 #endif -// BLE_IAS_C_BLE_OBSERVER_PRIO +// BLE_IAS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Immediate Alert Service Client. #ifndef BLE_IAS_C_BLE_OBSERVER_PRIO #define BLE_IAS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_LBS_BLE_OBSERVER_PRIO +// BLE_LBS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the LED Button Service. #ifndef BLE_LBS_BLE_OBSERVER_PRIO #define BLE_LBS_BLE_OBSERVER_PRIO 2 #endif -// BLE_LBS_C_BLE_OBSERVER_PRIO +// BLE_LBS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the LED Button Service Client. #ifndef BLE_LBS_C_BLE_OBSERVER_PRIO #define BLE_LBS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_LLS_BLE_OBSERVER_PRIO +// BLE_LESC_OBSERVER_PRIO +// Priority with which BLE events are dispatched to the BLE LESC module. + +#ifndef BLE_LESC_OBSERVER_PRIO +#define BLE_LESC_OBSERVER_PRIO 2 +#endif + +// BLE_LLS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Link Loss Service. #ifndef BLE_LLS_BLE_OBSERVER_PRIO #define BLE_LLS_BLE_OBSERVER_PRIO 2 #endif -// BLE_LNS_BLE_OBSERVER_PRIO +// BLE_LNS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Location Navigation Service. #ifndef BLE_LNS_BLE_OBSERVER_PRIO #define BLE_LNS_BLE_OBSERVER_PRIO 2 #endif -// BLE_NUS_BLE_OBSERVER_PRIO +// BLE_NUS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the UART Service. #ifndef BLE_NUS_BLE_OBSERVER_PRIO #define BLE_NUS_BLE_OBSERVER_PRIO 2 #endif -// BLE_NUS_C_BLE_OBSERVER_PRIO +// BLE_NUS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the UART Central Service. #ifndef BLE_NUS_C_BLE_OBSERVER_PRIO #define BLE_NUS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_OTS_BLE_OBSERVER_PRIO +// BLE_OTS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Object transfer service. #ifndef BLE_OTS_BLE_OBSERVER_PRIO #define BLE_OTS_BLE_OBSERVER_PRIO 2 #endif -// BLE_OTS_C_BLE_OBSERVER_PRIO +// BLE_OTS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Object transfer service client. #ifndef BLE_OTS_C_BLE_OBSERVER_PRIO #define BLE_OTS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_RSCS_BLE_OBSERVER_PRIO +// BLE_RSCS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Running Speed and Cadence Service. #ifndef BLE_RSCS_BLE_OBSERVER_PRIO #define BLE_RSCS_BLE_OBSERVER_PRIO 2 #endif -// BLE_RSCS_C_BLE_OBSERVER_PRIO +// BLE_RSCS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Running Speed and Cadence Client. #ifndef BLE_RSCS_C_BLE_OBSERVER_PRIO #define BLE_RSCS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_TPS_BLE_OBSERVER_PRIO +// BLE_TPS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the TX Power Service. #ifndef BLE_TPS_BLE_OBSERVER_PRIO #define BLE_TPS_BLE_OBSERVER_PRIO 2 #endif -// BSP_BTN_BLE_OBSERVER_PRIO +// BSP_BTN_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Button Control module. #ifndef BSP_BTN_BLE_OBSERVER_PRIO #define BSP_BTN_BLE_OBSERVER_PRIO 1 #endif -// NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO +// NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif -// NRF_BLE_BMS_BLE_OBSERVER_PRIO +// NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO +// Priority with which BLE events are dispatched to the NFC pairing library. + +#ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO +#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 +#endif + +// NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO +// Priority with which BLE events are dispatched to the NFC pairing library. + +#ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO +#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 +#endif + +// NRF_BLE_BMS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Bond Management Service. #ifndef NRF_BLE_BMS_BLE_OBSERVER_PRIO #define NRF_BLE_BMS_BLE_OBSERVER_PRIO 2 #endif -// NRF_BLE_CGMS_BLE_OBSERVER_PRIO +// NRF_BLE_CGMS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Contiuon Glucose Monitoring Service. #ifndef NRF_BLE_CGMS_BLE_OBSERVER_PRIO #define NRF_BLE_CGMS_BLE_OBSERVER_PRIO 2 #endif -// NRF_BLE_GATTS_C_BLE_OBSERVER_PRIO +// NRF_BLE_ES_BLE_OBSERVER_PRIO +// Priority with which BLE events are dispatched to the Eddystone module. + +#ifndef NRF_BLE_ES_BLE_OBSERVER_PRIO +#define NRF_BLE_ES_BLE_OBSERVER_PRIO 2 +#endif + +// NRF_BLE_GATTS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the GATT Service Client. #ifndef NRF_BLE_GATTS_C_BLE_OBSERVER_PRIO #define NRF_BLE_GATTS_C_BLE_OBSERVER_PRIO 2 #endif -// NRF_BLE_GATT_BLE_OBSERVER_PRIO +// NRF_BLE_GATT_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the GATT module. #ifndef NRF_BLE_GATT_BLE_OBSERVER_PRIO -#define NRF_BLE_GATT_BLE_OBSERVER_PRIO 2 +#define NRF_BLE_GATT_BLE_OBSERVER_PRIO 1 #endif -// NRF_BLE_QWR_BLE_OBSERVER_PRIO +// NRF_BLE_QWR_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Queued writes module. #ifndef NRF_BLE_QWR_BLE_OBSERVER_PRIO #define NRF_BLE_QWR_BLE_OBSERVER_PRIO 2 #endif -// PM_BLE_OBSERVER_PRIO -// Priority with which BLE events are dispatched to the Peer Manager module. - +// PM_BLE_OBSERVER_PRIO - Priority with which BLE events are dispatched to the Peer Manager module. #ifndef PM_BLE_OBSERVER_PRIO -#define PM_BLE_OBSERVER_PRIO 2 +#define PM_BLE_OBSERVER_PRIO 1 #endif -// +// //========================================================== -// +// //========================================================== @@ -8654,46 +11882,46 @@ // NRF_SDH_ENABLED - nrf_sdh - SoftDevice handler //========================================================== #ifndef NRF_SDH_ENABLED -#define NRF_SDH_ENABLED 1 +#define NRF_SDH_ENABLED 0 #endif -// Dispatch model +// Dispatch model // This setting configures how Stack events are dispatched to the application. //========================================================== // NRF_SDH_DISPATCH_MODEL - + // NRF_SDH_DISPATCH_MODEL_INTERRUPT: SoftDevice events are passed to the application from the interrupt context. // NRF_SDH_DISPATCH_MODEL_APPSH: SoftDevice events are scheduled using @ref app_scheduler. // NRF_SDH_DISPATCH_MODEL_POLLING: SoftDevice events are to be fetched manually. -// <0=> NRF_SDH_DISPATCH_MODEL_INTERRUPT -// <1=> NRF_SDH_DISPATCH_MODEL_APPSH -// <2=> NRF_SDH_DISPATCH_MODEL_POLLING +// <0=> NRF_SDH_DISPATCH_MODEL_INTERRUPT +// <1=> NRF_SDH_DISPATCH_MODEL_APPSH +// <2=> NRF_SDH_DISPATCH_MODEL_POLLING #ifndef NRF_SDH_DISPATCH_MODEL #define NRF_SDH_DISPATCH_MODEL 0 #endif -// +// //========================================================== // Clock - SoftDevice clock configuration //========================================================== // NRF_SDH_CLOCK_LF_SRC - SoftDevice clock source. - -// <0=> NRF_CLOCK_LF_SRC_RC -// <1=> NRF_CLOCK_LF_SRC_XTAL -// <2=> NRF_CLOCK_LF_SRC_SYNTH + +// <0=> NRF_CLOCK_LF_SRC_RC +// <1=> NRF_CLOCK_LF_SRC_XTAL +// <2=> NRF_CLOCK_LF_SRC_SYNTH #include "nrf5x_lf_clk_helper.h" -// NRF_SDH_CLOCK_LF_RC_CTIV - SoftDevice calibration timer interval. +// NRF_SDH_CLOCK_LF_RC_CTIV - SoftDevice calibration timer interval. #ifndef NRF_SDH_CLOCK_LF_RC_CTIV #define NRF_SDH_CLOCK_LF_RC_CTIV 0 #endif -// NRF_SDH_CLOCK_LF_RC_TEMP_CTIV - SoftDevice calibration timer interval under constant temperature. +// NRF_SDH_CLOCK_LF_RC_TEMP_CTIV - SoftDevice calibration timer interval under constant temperature. // How often (in number of calibration intervals) the RC oscillator shall be calibrated // if the temperature has not changed. @@ -8701,28 +11929,32 @@ #define NRF_SDH_CLOCK_LF_RC_TEMP_CTIV 0 #endif -// NRF_SDH_CLOCK_LF_XTAL_ACCURACY - External crystal clock accuracy used in the LL to compute timing windows. +// NRF_SDH_CLOCK_LF_ACCURACY - External clock accuracy used in the LL to compute timing. + +// <0=> NRF_CLOCK_LF_ACCURACY_250_PPM +// <1=> NRF_CLOCK_LF_ACCURACY_500_PPM +// <2=> NRF_CLOCK_LF_ACCURACY_150_PPM +// <3=> NRF_CLOCK_LF_ACCURACY_100_PPM +// <4=> NRF_CLOCK_LF_ACCURACY_75_PPM +// <5=> NRF_CLOCK_LF_ACCURACY_50_PPM +// <6=> NRF_CLOCK_LF_ACCURACY_30_PPM +// <7=> NRF_CLOCK_LF_ACCURACY_20_PPM +// <8=> NRF_CLOCK_LF_ACCURACY_10_PPM +// <9=> NRF_CLOCK_LF_ACCURACY_5_PPM +// <10=> NRF_CLOCK_LF_ACCURACY_2_PPM +// <11=> NRF_CLOCK_LF_ACCURACY_1_PPM -// <0=> NRF_CLOCK_LF_XTAL_ACCURACY_250_PPM -// <1=> NRF_CLOCK_LF_XTAL_ACCURACY_500_PPM -// <2=> NRF_CLOCK_LF_XTAL_ACCURACY_150_PPM -// <3=> NRF_CLOCK_LF_XTAL_ACCURACY_100_PPM -// <4=> NRF_CLOCK_LF_XTAL_ACCURACY_75_PPM -// <5=> NRF_CLOCK_LF_XTAL_ACCURACY_50_PPM -// <6=> NRF_CLOCK_LF_XTAL_ACCURACY_30_PPM -// <7=> NRF_CLOCK_LF_XTAL_ACCURACY_20_PPM - -#ifndef NRF_SDH_CLOCK_LF_XTAL_ACCURACY -#define NRF_SDH_CLOCK_LF_XTAL_ACCURACY 7 +#ifndef NRF_SDH_CLOCK_LF_ACCURACY +#define NRF_SDH_CLOCK_LF_ACCURACY 7 #endif -// +// //========================================================== // SDH Observers - Observers and priority levels //========================================================== -// NRF_SDH_REQ_OBSERVER_PRIO_LEVELS - Total number of priority levels for request observers. +// NRF_SDH_REQ_OBSERVER_PRIO_LEVELS - Total number of priority levels for request observers. // This setting configures the number of priority levels available for the SoftDevice request event handlers. // The priority level of a handler determines the order in which it receives events, with respect to other handlers. @@ -8730,7 +11962,7 @@ #define NRF_SDH_REQ_OBSERVER_PRIO_LEVELS 2 #endif -// NRF_SDH_STATE_OBSERVER_PRIO_LEVELS - Total number of priority levels for state observers. +// NRF_SDH_STATE_OBSERVER_PRIO_LEVELS - Total number of priority levels for state observers. // This setting configures the number of priority levels available for the SoftDevice state event handlers. // The priority level of a handler determines the order in which it receives events, with respect to other handlers. @@ -8738,7 +11970,7 @@ #define NRF_SDH_STATE_OBSERVER_PRIO_LEVELS 2 #endif -// NRF_SDH_STACK_OBSERVER_PRIO_LEVELS - Total number of priority levels for stack event observers. +// NRF_SDH_STACK_OBSERVER_PRIO_LEVELS - Total number of priority levels for stack event observers. // This setting configures the number of priority levels available for the SoftDevice stack event handlers (ANT, BLE, SoC). // The priority level of a handler determines the order in which it receives events, with respect to other handlers. @@ -8750,34 +11982,34 @@ // State Observers priorities - Invididual priorities //========================================================== -// CLOCK_CONFIG_STATE_OBSERVER_PRIO +// CLOCK_CONFIG_STATE_OBSERVER_PRIO // Priority with which state events are dispatched to the Clock driver. #ifndef CLOCK_CONFIG_STATE_OBSERVER_PRIO #define CLOCK_CONFIG_STATE_OBSERVER_PRIO 0 #endif -// POWER_CONFIG_STATE_OBSERVER_PRIO +// POWER_CONFIG_STATE_OBSERVER_PRIO // Priority with which state events are dispatched to the Power driver. #ifndef POWER_CONFIG_STATE_OBSERVER_PRIO #define POWER_CONFIG_STATE_OBSERVER_PRIO 0 #endif -// RNG_CONFIG_STATE_OBSERVER_PRIO +// RNG_CONFIG_STATE_OBSERVER_PRIO // Priority with which state events are dispatched to this module. #ifndef RNG_CONFIG_STATE_OBSERVER_PRIO #define RNG_CONFIG_STATE_OBSERVER_PRIO 0 #endif -// +// //========================================================== // Stack Event Observers priorities - Invididual priorities //========================================================== -// NRF_SDH_ANT_STACK_OBSERVER_PRIO +// NRF_SDH_ANT_STACK_OBSERVER_PRIO // This setting configures the priority with which ANT events are processed with respect to other events coming from the stack. // Modify this setting if you need to have ANT events dispatched before or after other stack events, such as BLE or SoC. // Zero is the highest priority. @@ -8786,7 +12018,7 @@ #define NRF_SDH_ANT_STACK_OBSERVER_PRIO 0 #endif -// NRF_SDH_BLE_STACK_OBSERVER_PRIO +// NRF_SDH_BLE_STACK_OBSERVER_PRIO // This setting configures the priority with which BLE events are processed with respect to other events coming from the stack. // Modify this setting if you need to have BLE events dispatched before or after other stack events, such as ANT or SoC. // Zero is the highest priority. @@ -8795,7 +12027,7 @@ #define NRF_SDH_BLE_STACK_OBSERVER_PRIO 0 #endif -// NRF_SDH_SOC_STACK_OBSERVER_PRIO +// NRF_SDH_SOC_STACK_OBSERVER_PRIO // This setting configures the priority with which SoC events are processed with respect to other events coming from the stack. // Modify this setting if you need to have SoC events dispatched before or after other stack events, such as ANT or BLE. // Zero is the highest priority. @@ -8804,10 +12036,10 @@ #define NRF_SDH_SOC_STACK_OBSERVER_PRIO 0 #endif -// +// //========================================================== -// +// //========================================================== @@ -8821,7 +12053,7 @@ // SoC Observers - Observers and priority levels //========================================================== -// NRF_SDH_SOC_OBSERVER_PRIO_LEVELS - Total number of priority levels for SoC observers. +// NRF_SDH_SOC_OBSERVER_PRIO_LEVELS - Total number of priority levels for SoC observers. // This setting configures the number of priority levels available for the SoC event handlers. // The priority level of a handler determines the order in which it receives events, with respect to other handlers. @@ -8832,44 +12064,44 @@ // SoC Observers priorities - Invididual priorities //========================================================== -// BLE_ADV_SOC_OBSERVER_PRIO +// BLE_ADV_SOC_OBSERVER_PRIO // Priority with which SoC events are dispatched to the Advertising module. #ifndef BLE_ADV_SOC_OBSERVER_PRIO #define BLE_ADV_SOC_OBSERVER_PRIO 1 #endif -// BLE_DFU_SOC_OBSERVER_PRIO +// BLE_DFU_SOC_OBSERVER_PRIO // Priority with which BLE events are dispatched to the DFU Service. #ifndef BLE_DFU_SOC_OBSERVER_PRIO #define BLE_DFU_SOC_OBSERVER_PRIO 1 #endif -// CLOCK_CONFIG_SOC_OBSERVER_PRIO +// CLOCK_CONFIG_SOC_OBSERVER_PRIO // Priority with which SoC events are dispatched to the Clock driver. #ifndef CLOCK_CONFIG_SOC_OBSERVER_PRIO #define CLOCK_CONFIG_SOC_OBSERVER_PRIO 0 #endif -// POWER_CONFIG_SOC_OBSERVER_PRIO +// POWER_CONFIG_SOC_OBSERVER_PRIO // Priority with which SoC events are dispatched to the Power driver. #ifndef POWER_CONFIG_SOC_OBSERVER_PRIO #define POWER_CONFIG_SOC_OBSERVER_PRIO 0 #endif -// +// //========================================================== -// +// //========================================================== // -// +// //========================================================== // <<< end of configuration section >>> diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/device/TOOLCHAIN_ARM_STD/nRF52840.sct b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/device/TOOLCHAIN_ARM_STD/nRF52840.sct index d510188439..1beafe2d87 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/device/TOOLCHAIN_ARM_STD/nRF52840.sct +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/device/TOOLCHAIN_ARM_STD/nRF52840.sct @@ -9,15 +9,9 @@ #define MBED_APP_SIZE 0x100000 #endif -/* If softdevice is present, set aside space for it */ #if !defined(MBED_RAM_START) - #if defined(SOFTDEVICE_PRESENT) - #define MBED_RAM_START 0x20003188 - #define MBED_RAM_SIZE 0x3CE78 - #else - #define MBED_RAM_START 0x20000000 - #define MBED_RAM_SIZE 0x40000 - #endif + #define MBED_RAM_START 0x20000000 + #define MBED_RAM_SIZE 0x40000 #endif #define Stack_Size MBED_BOOT_STACK_SIZE diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/device/TOOLCHAIN_GCC_ARM/NRF52840.ld b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/device/TOOLCHAIN_GCC_ARM/NRF52840.ld index 590dd11ad4..efca2de256 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/device/TOOLCHAIN_GCC_ARM/NRF52840.ld +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/device/TOOLCHAIN_GCC_ARM/NRF52840.ld @@ -25,19 +25,13 @@ #define MBED_APP_SIZE 0x100000 #endif -#if !defined(MBED_BOOT_STACK_SIZE) - #define MBED_BOOT_STACK_SIZE 0x800 +#if !defined(MBED_RAM_START) + #define MBED_RAM_START 0x20000000 + #define MBED_RAM_SIZE 0x40000 #endif -/* If softdevice is present, set aside space for it */ -#if !defined(MBED_RAM_START) - #if defined(SOFTDEVICE_PRESENT) - #define MBED_RAM_START 0x20003188 - #define MBED_RAM_SIZE 0x3CE78 - #else - #define MBED_RAM_START 0x20000000 - #define MBED_RAM_SIZE 0x40000 - #endif +#if !defined(MBED_BOOT_STACK_SIZE) + #define MBED_BOOT_STACK_SIZE 0x800 #endif #define MBED_RAM0_START MBED_RAM_START diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/device/TOOLCHAIN_IAR/nRF52840.icf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/device/TOOLCHAIN_IAR/nRF52840.icf index 8402657f30..600c5b546b 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/device/TOOLCHAIN_IAR/nRF52840.icf +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/TARGET_MCU_NRF52840/device/TOOLCHAIN_IAR/nRF52840.icf @@ -11,15 +11,9 @@ if (!isdefinedsymbol(MBED_APP_SIZE)) { define symbol MBED_APP_SIZE = 0x100000; } -/* If softdevice is present, set aside space for it */ if (!isdefinedsymbol(MBED_RAM_START)) { - if (isdefinedsymbol(SOFTDEVICE_PRESENT)) { - define symbol MBED_RAM_START = 0x20003188; - define symbol MBED_RAM_SIZE = 0x3CE78; - } else { define symbol MBED_RAM_START = 0x20000000; - define symbol MBED_RAM_SIZE = 0x40000; - } + define symbol MBED_RAM_SIZE = 0x40000; } if (!isdefinedsymbol(MBED_BOOT_STACK_SIZE)) { diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/analogin_api.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/analogin_api.c index 2b5b0bd06e..4f92148a0e 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/analogin_api.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/analogin_api.c @@ -1,5 +1,6 @@ /* mbed Microcontroller Library - * Copyright (c) 2006-2013 ARM Limited + * Copyright (c) 2016-2018 Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,23 +16,27 @@ */ #if DEVICE_ANALOGIN + #include "hal/analogin_api.h" #include "pinmap.h" #include "PeripheralPins.h" -#include "nrf_drv_saadc.h" +#include "nrfx_saadc.h" +#include "nrfx_errors.h" +#include "sdk_config.h" #define ADC_12BIT_RANGE 0x0FFF #define ADC_16BIT_RANGE 0xFFFF /* Unused event handler but driver requires one. */ -static void analog_in_event_handler(nrf_drv_saadc_evt_t const *p_event) +static void analog_in_event_handler(nrfx_saadc_evt_t const *p_event) { (void) p_event; + } -/* Interrupt handler implemented in nrf_drv_saadc.c. */ +/* Interrupt handler implemented in nrfx_saadc.c. */ void SAADC_IRQHandler(void); /** Initialize the analogin peripheral @@ -41,7 +46,7 @@ void SAADC_IRQHandler(void); * @param pin The analogin pin name */ void analogin_init(analogin_t *obj, PinName pin) -{ +{ MBED_ASSERT(obj); /* Only initialize SAADC on first pin. */ @@ -52,21 +57,21 @@ void analogin_init(analogin_t *obj, PinName pin) first_init = false; /* Use configuration from sdk_config.h. - * Default is: + * Default is: * - 12 bit. * - No oversampling. * - Priority 7 (lowest). * - No low power mode. */ - nrf_drv_saadc_config_t adc_config = { + nrfx_saadc_config_t adc_config = { .resolution = (nrf_saadc_resolution_t)SAADC_CONFIG_RESOLUTION, .oversample = (nrf_saadc_oversample_t)SAADC_CONFIG_OVERSAMPLE, .interrupt_priority = SAADC_CONFIG_IRQ_PRIORITY, .low_power_mode = SAADC_CONFIG_LP_MODE }; - ret_code_t result = nrf_drv_saadc_init(&adc_config, analog_in_event_handler); - MBED_ASSERT(result == NRF_SUCCESS); + ret_code_t result = nrfx_saadc_init(&adc_config, analog_in_event_handler); + MBED_ASSERT(result == NRFX_SUCCESS); /* Register interrupt handler in vector table. */ NVIC_SetVector(SAADC_IRQn, (uint32_t)SAADC_IRQHandler); @@ -94,8 +99,8 @@ void analogin_init(analogin_t *obj, PinName pin) .pin_n = NRF_SAADC_INPUT_DISABLED }; - ret_code_t result = nrf_drv_saadc_channel_init(channel, &channel_config); - MBED_ASSERT(result == NRF_SUCCESS); + ret_code_t result = nrfx_saadc_channel_init(channel, &channel_config); + MBED_ASSERT(result == NRFX_SUCCESS); /* Store channel in ADC object. */ obj->channel = channel; @@ -116,10 +121,10 @@ uint16_t analogin_read_u16(analogin_t *obj) /* Read single channel, blocking. */ nrf_saadc_value_t value = { 0 }; - ret_code_t result = nrf_drv_saadc_sample_convert(obj->channel, &value); + ret_code_t result = nrfx_saadc_sample_convert(obj->channel, &value); /* nrf_saadc_value_t is a signed integer. Only take the absolute value. */ - if ((result == NRF_SUCCESS) && (value > 0)) { + if ((result == NRFX_SUCCESS) && (value > 0)) { /* Normalize 12 bit ADC value to 16 bit Mbed ADC range. */ uint32_t normalized = value; diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/common_rtc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/common_rtc.c new file mode 100644 index 0000000000..8d3ad4ba56 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/common_rtc.c @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2013 Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic Semiconductor ASA + * integrated circuit in a product or a software update for such product, must reproduce + * the above copyright notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific prior + * written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary or object form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "us_ticker_api.h" +#include "common_rtc.h" +#include "app_util.h" +#include "lp_ticker_api.h" +#include "mbed_critical.h" + +#if defined(NRF52_PAN_20) +/* Macro for testing if the SoftDevice is active, regardless of whether the + * application is build with the SoftDevice or not. + */ +#if defined(SOFTDEVICE_PRESENT) +#include "nrf_sdh.h" +#define NRF_HAL_SD_IS_ENABLED() nrf_sdh_is_enabled() +#else +#define NRF_HAL_SD_IS_ENABLED() 0 +#endif +#endif + + +//------------------------------------------------------------------------------ +// Common stuff used also by lp_ticker and rtc_api (see "common_rtc.h"). +// +#include "app_util_platform.h" + +bool m_common_rtc_enabled = false; +uint32_t volatile m_common_rtc_overflows = 0; +bool volatile lp_ticker_interrupt_fire = false; + +__STATIC_INLINE void rtc_ovf_event_check(void) +{ + if (nrf_rtc_event_pending(COMMON_RTC_INSTANCE, NRF_RTC_EVENT_OVERFLOW)) { + nrf_rtc_event_clear(COMMON_RTC_INSTANCE, NRF_RTC_EVENT_OVERFLOW); + /* Don't disable this event. It shall occur periodically. + * It is needed for RTC. */ + + ++m_common_rtc_overflows; + } +} + +#if defined(TARGET_MCU_NRF51822) +void common_rtc_irq_handler(void) +#else +void COMMON_RTC_IRQ_HANDLER(void) +#endif +{ + rtc_ovf_event_check(); + +#if DEVICE_LPTICKER + if (nrf_rtc_event_pending(COMMON_RTC_INSTANCE, LP_TICKER_EVENT) || + lp_ticker_interrupt_fire) { + + if (lp_ticker_interrupt_fire) { + lp_ticker_interrupt_fire = false; + } + + lp_ticker_irq_handler(); + } +#endif +} + +/* Function for fix errata 20: RTC Register values are invalid. */ +__STATIC_INLINE void errata_20(void) +{ +#if defined(NRF52_PAN_20) + if (!NRF_HAL_SD_IS_ENABLED()) + { + NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; + NRF_CLOCK->TASKS_LFCLKSTART = 1; + + while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) + { + } + } + NRF_RTC1->TASKS_STOP = 0; +#endif +} + +void RTC1_IRQHandler(void); + +void common_rtc_init(void) +{ + if (m_common_rtc_enabled) { +#if DEVICE_LPTICKER + nrf_rtc_event_clear(COMMON_RTC_INSTANCE, LP_TICKER_EVENT); + nrf_rtc_int_disable(COMMON_RTC_INSTANCE, LP_TICKER_INT_MASK); +#endif + return; + } + + errata_20(); + + nrf_rtc_task_trigger(COMMON_RTC_INSTANCE, NRF_RTC_TASK_STOP); + + NVIC_SetVector(RTC1_IRQn, (uint32_t)RTC1_IRQHandler); + + /* RTC is driven by the low frequency (32.768 kHz) clock, a proper request + * must be made to have it running. + * Currently this clock is started in 'SystemInit' (see "system_nrf51.c" + * or "system_nrf52.c", respectively). + */ + + nrf_rtc_prescaler_set(COMMON_RTC_INSTANCE, 0); + + /* Clear all RTC events. */ +#if defined(TARGET_MCU_NRF51822) + nrf_rtc_event_clear(COMMON_RTC_INSTANCE, OS_TICK_EVENT); +#endif +#if DEVICE_LPTICKER + nrf_rtc_event_clear(COMMON_RTC_INSTANCE, LP_TICKER_EVENT); +#endif + nrf_rtc_event_clear(COMMON_RTC_INSTANCE, NRF_RTC_EVENT_OVERFLOW); + + /* Disable all RTC events (According to NRF_51 Reference Manual + * RTC events can not be used to control RTC interrupts). + * IRQ signal to NVIC is provided if interrupt is enabled. + */ + + nrf_rtc_event_disable(COMMON_RTC_INSTANCE, NRF_RTC_INT_OVERFLOW_MASK +#if defined(TARGET_MCU_NRF51822) + | OS_TICK_INT_MASK +#endif +#if DEVICE_LPTICKER + | LP_TICKER_INT_MASK +#endif + ); + + /* This interrupt is enabled permanently, since overflow indications are needed + * continuously. + */ + nrf_rtc_int_enable(COMMON_RTC_INSTANCE, NRF_RTC_INT_OVERFLOW_MASK); + + /* Disable LP ticker interrupt for now. */ +#if DEVICE_LPTICKER + nrf_rtc_int_disable(COMMON_RTC_INSTANCE, LP_TICKER_INT_MASK); +#endif + + NRFX_IRQ_PRIORITY_SET(nrfx_get_irq_number(COMMON_RTC_INSTANCE), APP_IRQ_PRIORITY_HIGH); + NRFX_IRQ_ENABLE(nrfx_get_irq_number(COMMON_RTC_INSTANCE)); + + nrf_rtc_task_trigger(COMMON_RTC_INSTANCE, NRF_RTC_TASK_START); + + m_common_rtc_enabled = true; +} + +void common_rtc_free() +{ + nrf_rtc_task_trigger(COMMON_RTC_INSTANCE, NRF_RTC_TASK_STOP); + nrf_rtc_int_disable(COMMON_RTC_INSTANCE, LP_TICKER_INT_MASK); + NVIC_DisableIRQ(nrfx_get_irq_number(COMMON_RTC_INSTANCE)); + + m_common_rtc_enabled = false; +} + +void common_rtc_set_interrupt(uint32_t ticks_count, uint32_t cc_channel, + uint32_t int_mask) +{ + /* Set ticks value when interrupt should be fired. + * Interrupt scheduling is performed in upper layers. */ + + core_util_critical_section_enter(); + + /* Wrap ticks_count before comparisons. */ + ticks_count = RTC_WRAP(ticks_count); + + /* COMPARE occurs when a CC register is N and the COUNTER value transitions from N-1 to N. + * If the COUNTER is N, writing N+2 to a CC register is guaranteed to trigger a + * COMPARE event at N+2. + */ + const uint32_t now = nrf_rtc_counter_get(COMMON_RTC_INSTANCE); + + if (now == ticks_count || + RTC_WRAP(now + 1) == ticks_count) { + ticks_count = RTC_WRAP(ticks_count + 2); + } + + nrf_rtc_cc_set(COMMON_RTC_INSTANCE, cc_channel, ticks_count); + + if (!nrf_rtc_int_is_enabled(COMMON_RTC_INSTANCE, int_mask)) { + nrf_rtc_event_clear(COMMON_RTC_INSTANCE, LP_TICKER_EVENT); + nrf_rtc_int_enable(COMMON_RTC_INSTANCE, int_mask); + } + + core_util_critical_section_exit(); +} + +/* Since there is no SysTick on NRF51, the RTC1 channel 0 is used as an + * alternative source of RTOS ticks. + */ +#if defined(TARGET_MCU_NRF51822) + +#include "mbed_toolchain.h" + + +#define MAX_RTC_COUNTER_VAL ((1uL << RTC_COUNTER_BITS) - 1) + +#ifndef RTC1_CONFIG_FREQUENCY + #define RTC1_CONFIG_FREQUENCY 32678 // [Hz] +#endif + + + +void COMMON_RTC_IRQ_HANDLER(void) +{ + if(!nrf_rtc_event_pending(COMMON_RTC_INSTANCE, OS_TICK_EVENT)) { + common_rtc_irq_handler(); + } +} + +IRQn_Type mbed_get_m0_tick_irqn() +{ + return SWI3_IRQn; +} + + +#endif // defined(TARGET_MCU_NRF51822) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/common_rtc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/common_rtc.h new file mode 100644 index 0000000000..b9bde52c35 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/common_rtc.h @@ -0,0 +1,54 @@ +/* mbed Microcontroller Library + * Copyright (c) 2015-2018 ARM Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COMMON_RTC_H +#define COMMON_RTC_H + +#include "nrf_rtc.h" + +#define RTC_COUNTER_BITS 24u +#define RTC_FREQ 32768u + +// Instance 0 is reserved for SoftDevice. +// Instance 1 is used as a common one for lp_ticker and (in case +// of NRF51) as an alternative tick source for RTOS. +#define COMMON_RTC_INSTANCE NRF_RTC1 +#define COMMON_RTC_IRQ_HANDLER RTC1_IRQHandler +#define OS_TICK_CC_CHANNEL 0 +#define LP_TICKER_CC_CHANNEL 1 + +#define COMMON_RTC_EVENT_COMPARE(channel) \ + CONCAT_2(NRF_RTC_EVENT_COMPARE_, channel) +#define COMMON_RTC_INT_COMPARE_MASK(channel) \ + CONCAT_3(NRF_RTC_INT_COMPARE, channel, _MASK) + +#define OS_TICK_EVENT COMMON_RTC_EVENT_COMPARE(OS_TICK_CC_CHANNEL) +#define OS_TICK_INT_MASK COMMON_RTC_INT_COMPARE_MASK(OS_TICK_CC_CHANNEL) +#define LP_TICKER_EVENT COMMON_RTC_EVENT_COMPARE(LP_TICKER_CC_CHANNEL) +#define LP_TICKER_INT_MASK COMMON_RTC_INT_COMPARE_MASK(LP_TICKER_CC_CHANNEL) + +extern bool m_common_rtc_enabled; +extern uint32_t volatile m_common_rtc_overflows; +extern bool volatile lp_ticker_interrupt_fire; + +void common_rtc_init(void); +uint32_t common_rtc_32bit_ticks_get(void); +uint64_t common_rtc_64bit_us_get(void); +void common_rtc_set_interrupt(uint32_t us_timestamp, uint32_t cc_channel, + uint32_t int_mask); + +#endif // COMMON_RTC_H diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/gpio_api.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/gpio_api.c new file mode 100644 index 0000000000..b53cc2ff3d --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/gpio_api.c @@ -0,0 +1,260 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2018 ARM Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "mbed_assert.h" +#include "gpio_api.h" +#include "gpio_irq_api.h" +#include "pinmap.h" +#include "nrfx_gpiote.h" + + +#if defined(TARGET_MCU_NRF51822) +#define GPIO_PIN_COUNT 31 +#elif defined(TARGET_MCU_NRF52832) +#define GPIO_PIN_COUNT 32 +#elif defined(TARGET_MCU_NRF52840) +#define GPIO_PIN_COUNT 48 +#else +#error not recognized gpio count for mcu +#endif + +typedef struct { + bool used_as_gpio : 1; + PinDirection direction : 1; + PinMode pull : 2; + bool used_as_irq : 1; + bool irq_fall : 1; + bool irq_rise : 1; +} gpio_cfg_t; + +#if GPIO_PIN_COUNT > 32 +typedef uint64_t gpio_mask_t; +#else +typedef uint32_t gpio_mask_t; +#endif + +static gpio_mask_t m_gpio_initialized; +static gpio_cfg_t m_gpio_cfg[GPIO_PIN_COUNT]; + + +/*********** + GPIO IRQ +***********/ + +static gpio_irq_handler m_irq_handler; +static uint32_t m_channel_ids[GPIO_PIN_COUNT] = {0}; +static gpio_mask_t m_gpio_irq_enabled; + + +static void gpiote_irq_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) +{ + nrf_gpio_pin_sense_t sense = nrf_gpio_pin_sense_get(pin); + gpio_irq_event event = (sense == NRF_GPIO_PIN_SENSE_LOW) ? IRQ_RISE : IRQ_FALL; + + if (m_gpio_irq_enabled & ((gpio_mask_t)1 << pin)) { + if (((event == IRQ_RISE) && m_gpio_cfg[pin].irq_rise) + || ((event == IRQ_FALL) && m_gpio_cfg[pin].irq_fall)) { + m_irq_handler(m_channel_ids[pin], event); + } + } +} + +void GPIOTE_IRQHandler(void);// exported from nrf_drv_gpiote.c + +void gpio_init(gpio_t *obj, PinName pin) +{ + obj->pin = pin; + if (pin == (PinName)NC) { + return; + } + MBED_ASSERT((uint32_t)pin < GPIO_PIN_COUNT); + + NVIC_SetVector(GPIOTE_IRQn, (uint32_t) GPIOTE_IRQHandler); + + (void) nrfx_gpiote_init(); + + m_gpio_cfg[obj->pin].used_as_gpio = true; +} + +#ifdef TARGET_SDK_11 +// implement polyfill of gpio hal for the nRF5 SDK v11 +__STATIC_INLINE uint32_t nrf_gpio_pin_out_read(uint32_t pin) +{ + return (NRF_GPIO->OUTSET & (1UL << (pin))); +} +#endif + +int gpio_read(gpio_t *obj) +{ + MBED_ASSERT(obj->pin != (PinName)NC); + if (m_gpio_cfg[obj->pin].direction == PIN_OUTPUT) { + return (nrf_gpio_pin_out_read(obj->pin) ? 1 : 0); + } else { + return nrf_gpio_pin_read(obj->pin); + } +} + +static void gpiote_pin_uninit(uint8_t pin) +{ + if (m_gpio_initialized & ((gpio_mask_t)1UL << pin)) { + if ((m_gpio_cfg[pin].direction == PIN_OUTPUT) && (!m_gpio_cfg[pin].used_as_irq)) { + nrfx_gpiote_out_uninit(pin); + } else if (m_gpio_cfg[pin].used_as_irq) { + nrfx_gpiote_in_uninit(pin); + } + } +} + +static void gpio_apply_config(uint8_t pin) +{ + if (m_gpio_cfg[pin].used_as_gpio || m_gpio_cfg[pin].used_as_irq) { + if ((m_gpio_cfg[pin].direction == PIN_INPUT) + || (m_gpio_cfg[pin].used_as_irq)) { + //Configure as input. + nrfx_gpiote_in_config_t cfg; + + cfg.hi_accuracy = false; + cfg.is_watcher = false; + cfg.sense = NRF_GPIOTE_POLARITY_TOGGLE; + switch (m_gpio_cfg[pin].pull) { + case PullUp: + cfg.pull = NRF_GPIO_PIN_PULLUP; + break; + case PullDown: + cfg.pull = NRF_GPIO_PIN_PULLDOWN; + break; + default: + cfg.pull = NRF_GPIO_PIN_NOPULL; + break; + } + if (m_gpio_cfg[pin].used_as_irq) { + nrfx_gpiote_in_init(pin, &cfg, gpiote_irq_handler); + if ((m_gpio_irq_enabled & ((gpio_mask_t)1 << pin)) + && (m_gpio_cfg[pin].irq_rise || m_gpio_cfg[pin].irq_fall)) { + nrfx_gpiote_in_event_enable(pin, true); + } + } else { + nrf_gpio_cfg_input(pin, cfg.pull); + } + } else { + // Configure as output. + nrfx_gpiote_out_config_t cfg = NRFX_GPIOTE_CONFIG_OUT_SIMPLE(nrf_gpio_pin_out_read(pin)); + nrfx_gpiote_out_init(pin, &cfg); + } + m_gpio_initialized |= ((gpio_mask_t)1UL << pin); + } else { + m_gpio_initialized &= ~((gpio_mask_t)1UL << pin); + } +} + + +void gpio_mode(gpio_t *obj, PinMode mode) +{ + MBED_ASSERT(obj->pin != (PinName)NC); + + gpiote_pin_uninit(obj->pin); // try to uninitialize gpio before a change. + + m_gpio_cfg[obj->pin].pull = mode; + gpio_apply_config(obj->pin); +} + + +void gpio_dir(gpio_t *obj, PinDirection direction) +{ + MBED_ASSERT(obj->pin != (PinName)NC); + + gpiote_pin_uninit(obj->pin); // try to uninitialize gpio before a change. + + m_gpio_cfg[obj->pin].direction = direction; + gpio_apply_config(obj->pin); +} + + +/*********** + GPIO IRQ +***********/ + +int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id) +{ + if (pin == NC) { + return -1; + } + MBED_ASSERT((uint32_t)pin < GPIO_PIN_COUNT); + (void) nrfx_gpiote_init(); + + gpiote_pin_uninit(pin); // try to uninitialize gpio before a change. + + m_gpio_cfg[pin].used_as_irq = true; + m_gpio_cfg[pin].pull = PullNone; + m_channel_ids[pin] = id; + obj->ch = pin; + m_irq_handler = handler; + m_channel_ids[pin] = id; + + gpio_apply_config(pin); + return 1; +} + + +void gpio_irq_free(gpio_irq_t *obj) +{ + nrfx_gpiote_in_uninit(obj->ch); + m_gpio_cfg[obj->ch].used_as_irq = false; + m_channel_ids[obj->ch] = 0; + + gpio_apply_config(obj->ch); +} + + +void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) +{ + gpio_cfg_t *cfg = &m_gpio_cfg[obj->ch]; + bool irq_enabled_before = + (m_gpio_irq_enabled & ((gpio_mask_t)1 << obj->ch)) && + (cfg->irq_rise || cfg->irq_fall); + + if (event == IRQ_RISE) { + cfg->irq_rise = enable ? true : false; + } else if (event == IRQ_FALL) { + cfg->irq_fall = enable ? true : false; + } + + bool irq_enabled_after = cfg->irq_rise || cfg->irq_fall; + + if (irq_enabled_before != irq_enabled_after) { + if (irq_enabled_after) { + gpio_irq_enable(obj); + } else { + gpio_irq_disable(obj); + } + } +} + + +void gpio_irq_enable(gpio_irq_t *obj) +{ + m_gpio_irq_enabled |= ((gpio_mask_t)1 << obj->ch); + if (m_gpio_cfg[obj->ch].irq_rise || m_gpio_cfg[obj->ch].irq_fall) { + nrfx_gpiote_in_event_enable(obj->ch, true); + } +} + + +void gpio_irq_disable(gpio_irq_t *obj) +{ + m_gpio_irq_enabled &= ~((gpio_mask_t)1 << obj->ch); + nrfx_gpiote_in_event_disable(obj->ch); +} diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/i2c_api.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/i2c_api.c index b05573a1a5..31fa23848c 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/i2c_api.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/i2c_api.c @@ -55,9 +55,9 @@ #include "pinmap_ex.h" #include "PeripheralPins.h" -#include "nrf_drv_twi.h" -#include "nrf_drv_common.h" +#include "nrfx_twi.h" #include "app_util_platform.h" +#include "prs/nrfx_prs.h" #if 0 #define DEBUG_PRINTF(...) printf(__VA_ARGS__) @@ -108,7 +108,7 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) /* Get instance from pin configuration. */ int instance = pin_instance_i2c(sda, scl); - MBED_ASSERT(instance < ENABLED_TWI_COUNT); + MBED_ASSERT(instance < NRFX_TWI_ENABLED_COUNT); /* Initialize i2c_t object */ config->instance = instance; @@ -228,6 +228,15 @@ void i2c_configure_twi_instance(i2c_t *obj) struct i2c_s *config = obj; #endif + static nrfx_irq_handler_t const irq_handlers[NRFX_TWI_ENABLED_COUNT] = { + #if NRFX_CHECK(NRFX_TWI0_ENABLED) + nrfx_twi_0_irq_handler, + #endif + #if NRFX_CHECK(NRFX_TWI1_ENABLED) + nrfx_twi_1_irq_handler, + #endif + }; + int instance = config->instance; /* Get pointer to object of the current owner of the peripheral. */ @@ -252,8 +261,22 @@ void i2c_configure_twi_instance(i2c_t *obj) /* Force resource release. This is necessary because mbed drivers don't * deinitialize on object destruction. */ - nrf_drv_common_irq_disable(nrf_drv_get_IRQn((void *) nordic_nrf5_twi_register[instance])); - nrf_drv_common_per_res_release(nordic_nrf5_twi_register[instance]); + NRFX_IRQ_DISABLE((nrfx_get_irq_number((void const*)nordic_nrf5_twi_register[instance]))); + /* Release and re-initialize the irq handlers. + * observation: based on call flow, this is called only during i2c_reset and i2c_byte_write + * The nrfx_prs_acquire is normally called in nrfx_twi_init which is part of the i2c_configure_driver_instance, + * not i2c_configure_twi_intance. Hence I think the release and acquire is not doing any useful work here. + * Keeping for reference and should clean up after testing if found not useful. + */ + + nrfx_prs_release(nordic_nrf5_twi_register[instance]); + if (nrfx_prs_acquire(nordic_nrf5_twi_register[instance], + irq_handlers[instance]) != NRFX_SUCCESS) + { + DEBUG_PRINTF("Function: %s, nrfx_prs_acquire error code: %s.", + __func__, + err_code); + } /* Reset shorts register. */ nrf_twi_shorts_set(nordic_nrf5_twi_register[instance], 0); @@ -370,30 +393,29 @@ int i2c_byte_write(i2c_t *obj, int data) if (error & NRF_TWI_ERROR_ADDRESS_NACK) { result = 0; // set NACK - } - } else { + } else { + /* Normal write. Send next byte after clearing event flag. */ + nrf_twi_event_clear(nordic_nrf5_twi_register[instance], NRF_TWI_EVENT_TXDSENT); + nrf_twi_txd_set(nordic_nrf5_twi_register[instance], data); - /* Normal write. Send next byte after clearing event flag. */ - nrf_twi_event_clear(nordic_nrf5_twi_register[instance], NRF_TWI_EVENT_TXDSENT); - nrf_twi_txd_set(nordic_nrf5_twi_register[instance], data); + /* Setup stop watch for timeout. */ + uint32_t start_us = lp_ticker_read(); + uint32_t now_us = start_us; - /* Setup stop watch for timeout. */ - uint32_t start_us = lp_ticker_read(); - uint32_t now_us = start_us; + /* Block until timeout or the byte has been sent. */ + while (((now_us - start_us) < MAXIMUM_TIMEOUT_US) && + !(nrf_twi_event_check(nordic_nrf5_twi_register[instance], NRF_TWI_EVENT_TXDSENT))) { + now_us = lp_ticker_read(); + } - /* Block until timeout or the byte has been sent. */ - while (((now_us - start_us) < MAXIMUM_TIMEOUT_US) && - !(nrf_twi_event_check(nordic_nrf5_twi_register[instance], NRF_TWI_EVENT_TXDSENT))) { - now_us = lp_ticker_read(); - } + /* Check the error code to see if the byte was acknowledged. */ + uint32_t error = nrf_twi_errorsrc_get_and_clear(nordic_nrf5_twi_register[instance]); - /* Check the error code to see if the byte was acknowledged. */ - uint32_t error = nrf_twi_errorsrc_get_and_clear(nordic_nrf5_twi_register[instance]); - - if (error & NRF_TWI_ERROR_DATA_NACK) { - result = 0; // set NACK - } else if (now_us - start_us >= MAXIMUM_TIMEOUT_US) { - result = 2; // set timeout + if (error & NRF_TWI_ERROR_DATA_NACK) { + result = 0; // set NACK + } else if (now_us - start_us >= MAXIMUM_TIMEOUT_US) { + result = 2; // set timeout + } } } @@ -531,11 +553,11 @@ void i2c_reset(i2c_t *obj) */ /* Global array holding driver configuration for easy access. */ -static const nrf_drv_twi_t nordic_nrf5_instance[2] = { NRF_DRV_TWI_INSTANCE(0), NRF_DRV_TWI_INSTANCE(1) }; +static const nrfx_twi_t nordic_nrf5_instance[2] = { NRFX_TWI_INSTANCE(0), NRFX_TWI_INSTANCE(1) }; /* Forward declare interrupt handler. */ #if DEVICE_I2C_ASYNCH -static void nordic_nrf5_twi_event_handler(nrf_drv_twi_evt_t const *p_event, void *p_context); +static void nordic_nrf5_twi_event_handler(nrfx_twi_evt_t const *p_event, void *p_context); #endif /** @@ -576,24 +598,22 @@ static void i2c_configure_driver_instance(i2c_t *obj) config->mode = NORDIC_I2C_MODE_DRIVER; /* If the peripheral is already running, then disable it and use the driver API to uninitialize it.*/ - if (nordic_nrf5_instance[instance].reg.p_twi->ENABLE) { - nrf_drv_twi_disable(&nordic_nrf5_instance[instance]); - nrf_drv_twi_uninit(&nordic_nrf5_instance[instance]); + if (nordic_nrf5_instance[instance].p_twi->ENABLE) { + nrfx_twi_disable(&nordic_nrf5_instance[instance]); + nrfx_twi_uninit(&nordic_nrf5_instance[instance]); } /* Force resource release. This is necessary because mbed drivers don't * deinitialize on object destruction. */ - nrf_drv_common_irq_disable(nrf_drv_get_IRQn((void *) nordic_nrf5_twi_register[instance])); - nrf_drv_common_per_res_release(nordic_nrf5_twi_register[instance]); + NRFX_IRQ_DISABLE((nrfx_get_irq_number((void const*)nordic_nrf5_twi_register[instance]))); /* Configure driver with new settings. */ - nrf_drv_twi_config_t twi_config = { + nrfx_twi_config_t twi_config = { .scl = config->scl, .sda = config->sda, .frequency = config->frequency, .interrupt_priority = APP_IRQ_PRIORITY_LOWEST, - .clear_bus_init = false, .hold_bus_uninit = false }; @@ -602,28 +622,28 @@ static void i2c_configure_driver_instance(i2c_t *obj) if (config->handler) { /* Initialze driver in non-blocking mode. */ - nrf_drv_twi_init(&nordic_nrf5_instance[instance], - &twi_config, - nordic_nrf5_twi_event_handler, - obj); + nrfx_twi_init(&nordic_nrf5_instance[instance], + &twi_config, + nordic_nrf5_twi_event_handler, + obj); } else { /* Initialze driver in blocking mode. */ - nrf_drv_twi_init(&nordic_nrf5_instance[instance], - &twi_config, - NULL, - NULL); + nrfx_twi_init(&nordic_nrf5_instance[instance], + &twi_config, + NULL, + NULL); } #else /* Initialze driver in blocking mode. */ - nrf_drv_twi_init(&nordic_nrf5_instance[instance], - &twi_config, - NULL, - NULL); + nrfx_twi_init(&nordic_nrf5_instance[instance], + &twi_config, + NULL, + NULL); #endif /* Enable peripheral. */ - nrf_drv_twi_enable(&nordic_nrf5_instance[instance]); + nrfx_twi_enable(&nordic_nrf5_instance[instance]); } } @@ -654,7 +674,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) i2c_configure_driver_instance(obj); /* Initialize transaction. */ - ret_code_t retval = nrf_drv_twi_rx(&nordic_nrf5_instance[instance], + ret_code_t retval = nrfx_twi_rx(&nordic_nrf5_instance[instance], address >> 1, (uint8_t *) data, length); @@ -698,7 +718,7 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) i2c_configure_driver_instance(obj); /* Initialize transaction. */ - ret_code_t retval = nrf_drv_twi_tx(&nordic_nrf5_instance[instance], + ret_code_t retval = nrfx_twi_tx(&nordic_nrf5_instance[instance], address >> 1, (const uint8_t *) data, length, @@ -729,7 +749,7 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) */ /* Callback function for driver calls. This is called from ISR context. */ -static void nordic_nrf5_twi_event_handler(nrf_drv_twi_evt_t const *p_event, void *p_context) +static void nordic_nrf5_twi_event_handler(nrfx_twi_evt_t const *p_event, void *p_context) { // Only safe to use with mbed-printf. //DEBUG_PRINTF("nordic_nrf5_twi_event_handler: %d %p\r\n", p_event->type, p_context); @@ -741,17 +761,17 @@ static void nordic_nrf5_twi_event_handler(nrf_drv_twi_evt_t const *p_event, void switch (p_event->type) { /* Transfer completed event. */ - case NRF_DRV_TWI_EVT_DONE: + case NRFX_TWI_EVT_DONE: config->event = I2C_EVENT_TRANSFER_COMPLETE; break; /* Error event: NACK received after sending the address. */ - case NRF_DRV_TWI_EVT_ADDRESS_NACK: + case NRFX_TWI_EVT_ADDRESS_NACK: config->event = I2C_EVENT_ERROR_NO_SLAVE; break; /* Error event: NACK received after sending a data byte. */ - case NRF_DRV_TWI_EVT_DATA_NACK: + case NRFX_TWI_EVT_DATA_NACK: config->event = I2C_EVENT_TRANSFER_EARLY_NACK; break; @@ -819,16 +839,16 @@ void i2c_transfer_asynch(i2c_t *obj, i2c_configure_driver_instance(obj); /* Configure TWI transfer. */ - const nrf_drv_twi_xfer_desc_t twi_config = NRF_DRV_TWI_XFER_DESC_TXRX(address >> 1, + const nrfx_twi_xfer_desc_t twi_config = NRFX_TWI_XFER_DESC_TXRX(address >> 1, (uint8_t*) tx, tx_length, rx, rx_length); - uint32_t flags = (stop) ? 0 : NRF_DRV_TWI_FLAG_TX_NO_STOP; + uint32_t flags = (stop) ? 0 : NRFX_TWI_FLAG_TX_NO_STOP; /* Initiate TWI transfer using NRF driver. */ - ret_code_t result = nrf_drv_twi_xfer(&nordic_nrf5_instance[instance], + ret_code_t result = nrfx_twi_xfer(&nordic_nrf5_instance[instance], &twi_config, flags); @@ -873,7 +893,7 @@ uint8_t i2c_active(i2c_t *obj) DEBUG_PRINTF("i2c_active\r\n"); /* Query NRF driver if transaction is in progress. */ - return nrf_drv_twi_is_busy(&nordic_nrf5_instance[obj->i2c.instance]); + return nrfx_twi_is_busy(&nordic_nrf5_instance[obj->i2c.instance]); } /** Abort asynchronous transfer diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/object_owners.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/object_owners.c index 2f3bc3779a..e9d55f53fc 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/object_owners.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/object_owners.c @@ -1,5 +1,6 @@ /* mbed Microcontroller Library - * Copyright (c) 2018 ARM Limited + * Copyright (c) 2018 ARM Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/objects.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/objects.h index 39c4b60f67..d048efe1d7 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/objects.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/objects.h @@ -43,7 +43,7 @@ #include "PortNames.h" #include "PeripheralNames.h" #include "PinNames.h" -#include "nrf_drv_spi.h" +#include "nrfx_spi.h" #include "nrf_twi.h" #include "nrf_pwm.h" @@ -90,7 +90,7 @@ struct serial_s { struct spi_s { int instance; PinName cs; - nrf_drv_spi_config_t config; + nrfx_spi_config_t config; bool update; #if DEVICE_SPI_ASYNCH @@ -144,11 +144,11 @@ struct flash_s { #if DEVICE_QSPI -#include "nrf_drv_qspi.h" +#include "nrfx_qspi.h" struct qspi_s { uint32_t placeholder; - //nrf_drv_qspi_config_t config; + //nrfx_qspi_config_t config; }; #endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/pinmap_ex.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/pinmap_ex.c index bae8185331..1387714cc6 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/pinmap_ex.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/pinmap_ex.c @@ -1,5 +1,6 @@ /* mbed Microcontroller Library - * Copyright (c) 2018 ARM Limited + * Copyright (c) 2018 ARM Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/pinmap_ex.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/pinmap_ex.h index 5738248a3c..e80b8a5ec9 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/pinmap_ex.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/pinmap_ex.h @@ -1,5 +1,6 @@ /* mbed Microcontroller Library - * Copyright (c) 2018 ARM Limited + * Copyright (c) 2018 ARM Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/pwmout_api.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/pwmout_api.c index 767f0a8ee5..4f5f6dfb96 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/pwmout_api.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/pwmout_api.c @@ -39,10 +39,9 @@ #if DEVICE_PWMOUT #include "hal/pwmout_api.h" - -#include "pinmap_ex.h" -#include "nrf_drv_pwm.h" #include "PeripheralPins.h" +#include "pinmap_ex.h" +#include "nrfx_pwm.h" #if 0 #define DEBUG_PRINTF(...) do { printf(__VA_ARGS__); } while(0) @@ -62,18 +61,18 @@ #define SEQ_POLARITY_BIT (0x8000) /* Allocate PWM instances. */ -static nrf_drv_pwm_t nordic_nrf5_pwm_instance[] = { -#if PWM0_ENABLED - NRF_DRV_PWM_INSTANCE(0), +static nrfx_pwm_t nordic_nrf5_pwm_instance[] = { +#if NRFX_PWM0_ENABLED + NRFX_PWM_INSTANCE(0), #endif -#if PWM1_ENABLED - NRF_DRV_PWM_INSTANCE(1), +#if NRFX_PWM1_ENABLED + NRFX_PWM_INSTANCE(1), #endif -#if PWM2_ENABLED - NRF_DRV_PWM_INSTANCE(2), +#if NRFX_PWM2_ENABLED + NRFX_PWM_INSTANCE(2), #endif -#if PWM3_ENABLED - NRF_DRV_PWM_INSTANCE(3), +#if NRFX_PWM3_ENABLED + NRFX_PWM_INSTANCE(3), #endif }; @@ -87,12 +86,12 @@ static void nordic_pwm_init(pwmout_t *obj) * 1 pin per instance, otherwise they would share base count. * 1 MHz clock source to match the 1 us resolution. */ - nrf_drv_pwm_config_t config = { + nrfx_pwm_config_t config = { .output_pins = { obj->pin, - NRF_DRV_PWM_PIN_NOT_USED, - NRF_DRV_PWM_PIN_NOT_USED, - NRF_DRV_PWM_PIN_NOT_USED, + NRFX_PWM_PIN_NOT_USED, + NRFX_PWM_PIN_NOT_USED, + NRFX_PWM_PIN_NOT_USED, }, .irq_priority = PWM_DEFAULT_CONFIG_IRQ_PRIORITY, .base_clock = NRF_PWM_CLK_1MHz, @@ -103,11 +102,11 @@ static void nordic_pwm_init(pwmout_t *obj) }; /* Initialize instance with new configuration. */ - ret_code_t result = nrf_drv_pwm_init(&nordic_nrf5_pwm_instance[obj->instance], - &config, - NULL); + ret_code_t result = nrfx_pwm_init(&nordic_nrf5_pwm_instance[obj->instance], + &config, + NULL); - MBED_ASSERT(result == NRF_SUCCESS); + MBED_ASSERT(result == NRFX_SUCCESS); } /* Helper function for reinitializing the PWM instance and setting the duty-cycle. */ @@ -115,19 +114,19 @@ static void nordic_pwm_restart(pwmout_t *obj) { MBED_ASSERT(obj); - /* Uninitialize PWM instace */ - nrf_drv_pwm_uninit(&nordic_nrf5_pwm_instance[obj->instance]); + /* Uninitialize PWM instance */ + nrfx_pwm_uninit(&nordic_nrf5_pwm_instance[obj->instance]); /* (Re)initialize PWM instance. */ nordic_pwm_init(obj); /* Set duty-cycle from object. */ - ret_code_t result = nrf_drv_pwm_simple_playback(&nordic_nrf5_pwm_instance[obj->instance], - &obj->sequence, - 1, - NRF_DRV_PWM_FLAG_LOOP); + ret_code_t result = nrfx_pwm_simple_playback(&nordic_nrf5_pwm_instance[obj->instance], + &obj->sequence, + 1, + NRFX_PWM_FLAG_LOOP); - MBED_ASSERT(result == NRF_SUCCESS); + MBED_ASSERT(result == NRFX_SUCCESS); } /** Initialize the pwm out peripheral and configure the pin @@ -144,7 +143,7 @@ void pwmout_init(pwmout_t *obj, PinName pin) /* Get hardware instance from pinmap. */ int instance = pin_instance_pwm(pin); - MBED_ASSERT(instance < (int) (sizeof(nordic_nrf5_pwm_instance) / sizeof(nrf_drv_pwm_t))); + MBED_ASSERT(instance < (int) (sizeof(nordic_nrf5_pwm_instance) / sizeof(nrfx_pwm_t))); /* Populate PWM object with default values. */ obj->instance = instance; @@ -175,7 +174,7 @@ void pwmout_free(pwmout_t *obj) MBED_ASSERT(obj); /* Uninitialize PWM instance. */ - nrf_drv_pwm_uninit(&nordic_nrf5_pwm_instance[obj->instance]); + nrfx_pwm_uninit(&nordic_nrf5_pwm_instance[obj->instance]); } /** Set the output duty-cycle in range <0.0f, 1.0f> @@ -201,12 +200,12 @@ void pwmout_write(pwmout_t *obj, float percent) obj->percent = percent; /* Set new duty-cycle. */ - ret_code_t result = nrf_drv_pwm_simple_playback(&nordic_nrf5_pwm_instance[obj->instance], - &obj->sequence, - 1, - NRF_DRV_PWM_FLAG_LOOP); + ret_code_t result = nrfx_pwm_simple_playback(&nordic_nrf5_pwm_instance[obj->instance], + &obj->sequence, + 1, + NRFX_PWM_FLAG_LOOP); - MBED_ASSERT(result == NRF_SUCCESS); + MBED_ASSERT(result == NRFX_SUCCESS); } /** Read the current float-point output duty-cycle @@ -355,3 +354,4 @@ const PinMap *pwmout_pinmap() } #endif // DEVICE_PWMOUT + diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c index 83d4232e94..089318ce01 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c @@ -41,13 +41,12 @@ #include "hal/serial_api.h" #include "nrf_uarte.h" -#include "nrf_drv_uart.h" -#include "nrf_drv_common.h" +#include "nrfx_uart.h" #include "nrf_atfifo.h" #include "app_util_platform.h" #include "pinmap_ex.h" -#include "nrf_drv_ppi.h" -#include "nrf_drv_gpiote.h" +#include "nrfx_gpiote.h" +#include "nrfx_ppi.h" #include "PeripheralPins.h" #include "platform/mbed_atomic.h" @@ -108,18 +107,9 @@ */ typedef enum { - NRF_UARTE_EVENT_RXDRDY = offsetof(NRF_UARTE_Type, EVENTS_RXDRDY), NRF_UARTE_EVENT_TXDRDY = offsetof(NRF_UARTE_Type, EVENTS_TXDRDY), } nrf_uarte_event_extra_t; -/** - * Missing interrupt masks. - */ -typedef enum -{ - NRF_UARTE_INT_RXDRDY_MASK = UARTE_INTENSET_RXDRDY_Msk, - NRF_UARTE_INT_TXDRDY_MASK = UARTE_INTENSET_TXDRDY_Msk, -} nrf_uarte_int_mask_extra_t; /** * Internal struct for storing each UARTE instance's state: @@ -149,7 +139,7 @@ typedef struct { nrf_atfifo_t *fifo; uint32_t fifo_free_count; nrf_ppi_channel_t ppi_rts; - nrf_drv_gpiote_pin_t rts; + nrfx_gpiote_pin_t rts; bool rx_suspended; } nordic_uart_state_t; @@ -176,12 +166,12 @@ typedef enum { /** * UARTE state. One for each instance. */ -static nordic_uart_state_t nordic_nrf5_uart_state[UART_ENABLED_COUNT] = { 0 }; +static nordic_uart_state_t nordic_nrf5_uart_state[NRFX_UART_ENABLED_COUNT] = { 0 }; /** * Array with UARTE register pointers for easy access. */ -static NRF_UARTE_Type *nordic_nrf5_uart_register[UART_ENABLED_COUNT] = { +static NRF_UARTE_Type *nordic_nrf5_uart_register[NRFX_UART_ENABLED_COUNT] = { NRF_UARTE0, #if UART1_ENABLED NRF_UARTE1, @@ -203,8 +193,6 @@ NRF_ATFIFO_DEF(nordic_nrf5_uart_fifo_1, uint8_t, UART1_FIFO_BUFFER_SIZE); */ static uint8_t nordic_nrf5_uart_swi_mask_tx_0 = 0; static uint8_t nordic_nrf5_uart_swi_mask_rx_0 = 0; -static uint8_t nordic_nrf5_uart_swi_mask_tx_1 = 0; -static uint8_t nordic_nrf5_uart_swi_mask_rx_1 = 0; /** * Global variables expected by mbed_retarget.cpp for STDOUT. @@ -466,7 +454,7 @@ static void nordic_nrf5_uart_event_handler_rxstarted(int instance) if (nordic_nrf5_uart_state[instance].rts != NRF_UART_PSEL_DISCONNECTED) { if (nordic_nrf5_uart_state[instance].fifo_free_count > FIFO_MIN) { /* Clear rts since we are ready to receive the next byte */ - nrf_drv_gpiote_clr_task_trigger(nordic_nrf5_uart_state[instance].rts); + nrfx_gpiote_clr_task_trigger(nordic_nrf5_uart_state[instance].rts); } else { /* Suspend reception since there isn't enough buffer space. * The function serial_getc will restart reception. */ @@ -638,43 +626,43 @@ static void nordic_nrf5_uart_configure_object(serial_t *obj) uint32_t ret; /* Disable the PPI interconnect */ - ret = nrf_drv_ppi_channel_disable(nordic_nrf5_uart_state[uart_object->instance].ppi_rts); + ret = nrfx_ppi_channel_disable(nordic_nrf5_uart_state[uart_object->instance].ppi_rts); MBED_ASSERT(ret == NRF_SUCCESS); /* Free flow control gpiote pin if it was previously set */ if (nordic_nrf5_uart_state[uart_object->instance].rts != NRF_UART_PSEL_DISCONNECTED) { - nrf_drv_gpiote_out_uninit((nrf_drv_gpiote_pin_t)uart_object->rts); + nrfx_gpiote_out_uninit((nrfx_gpiote_pin_t)uart_object->rts); } /* Allocate and enable flow control gpiote pin if it is being used */ if (uart_object->rts != NRF_UART_PSEL_DISCONNECTED) { - static const nrf_drv_gpiote_out_config_t config = { + static const nrfx_gpiote_out_config_t config = { .init_state = NRF_GPIOTE_INITIAL_VALUE_HIGH, .task_pin = true, .action = NRF_GPIOTE_POLARITY_LOTOHI }; /* Allocate gpiote channel */ - ret = nrf_drv_gpiote_out_init((nrf_drv_gpiote_pin_t)uart_object->rts, &config); + ret = nrfx_gpiote_out_init((nrfx_gpiote_pin_t)uart_object->rts, &config); if (ret == NRF_ERROR_INVALID_STATE) { /* Pin was previously set to GPIO so uninitialize it */ - nrf_drv_gpiote_out_uninit((nrf_drv_gpiote_pin_t)uart_object->rts); - ret = nrf_drv_gpiote_out_init((nrf_drv_gpiote_pin_t)uart_object->rts, &config); + nrfx_gpiote_out_uninit((nrfx_gpiote_pin_t)uart_object->rts); + ret = nrfx_gpiote_out_init((nrfx_gpiote_pin_t)uart_object->rts, &config); } MBED_ASSERT(ret == NRF_SUCCESS); /* Set RTS high on the ENDRX event */ - ret = nrf_drv_ppi_channel_assign(nordic_nrf5_uart_state[uart_object->instance].ppi_rts, - nrf_uarte_event_address_get(nordic_nrf5_uart_register[uart_object->instance], NRF_UARTE_EVENT_ENDRX), - nrf_drv_gpiote_out_task_addr_get(uart_object->rts)); + ret = nrfx_ppi_channel_assign(nordic_nrf5_uart_state[uart_object->instance].ppi_rts, + nrf_uarte_event_address_get(nordic_nrf5_uart_register[uart_object->instance], NRF_UARTE_EVENT_ENDRX), + nrfx_gpiote_out_task_addr_get(uart_object->rts)); MBED_ASSERT(ret == NRF_SUCCESS); - ret = nrf_drv_ppi_channel_enable(nordic_nrf5_uart_state[uart_object->instance].ppi_rts); + ret = nrfx_ppi_channel_enable(nordic_nrf5_uart_state[uart_object->instance].ppi_rts); MBED_ASSERT(ret == NRF_SUCCESS); /* Enable gpiote task - rts pin can no longer be used as GPIO at this point */ - nrf_drv_gpiote_out_task_enable((nrf_drv_gpiote_pin_t)uart_object->rts); + nrfx_gpiote_out_task_enable((nrfx_gpiote_pin_t)uart_object->rts); } nordic_nrf5_uart_state[uart_object->instance].rts = uart_object->rts; @@ -682,12 +670,12 @@ static void nordic_nrf5_uart_configure_object(serial_t *obj) /* Enable flow control and parity. */ nrf_uarte_configure(nordic_nrf5_uart_register[uart_object->instance], - uart_object->parity, - uart_object->hwfc); + (nrf_uarte_parity_t) uart_object->parity, + (nrf_uarte_hwfc_t) uart_object->hwfc); /* Set baudrate. */ nrf_uarte_baudrate_set(nordic_nrf5_uart_register[uart_object->instance], - uart_object->baudrate); + (nrf_uarte_baudrate_t) uart_object->baudrate); } /** @@ -854,14 +842,14 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) first_init = false; /* Initialize components that serial relies on. */ - nrf_drv_ppi_init(); - if (!nrf_drv_gpiote_is_init()) { - nrf_drv_gpiote_init(); + if (!nrfx_gpiote_is_init()) { + nrfx_gpiote_init(); } /* Enable interrupts for SWI. */ NVIC_SetVector(SWI0_EGU0_IRQn, (uint32_t) nordic_nrf5_uart_swi0); - nrf_drv_common_irq_enable(SWI0_EGU0_IRQn, APP_IRQ_PRIORITY_LOWEST); + NRFX_IRQ_PRIORITY_SET(SWI0_EGU0_IRQn, APP_IRQ_PRIORITY_LOWEST); + NRFX_IRQ_ENABLE(SWI0_EGU0_IRQn); /* Initialize FIFO buffer for UARTE0. */ NRF_ATFIFO_INIT(nordic_nrf5_uart_fifo_0); @@ -871,7 +859,7 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) nordic_nrf5_uart_state[0].owner = NULL; /* Allocate a PPI channel for flow control */ - ret = nrf_drv_ppi_channel_alloc(&nordic_nrf5_uart_state[0].ppi_rts); + ret = nrfx_ppi_channel_alloc(&nordic_nrf5_uart_state[0].ppi_rts); MBED_ASSERT(ret == NRF_SUCCESS); /* Clear RTS */ @@ -881,7 +869,8 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) nrf_uarte_int_disable(nordic_nrf5_uart_register[0], 0xFFFFFFFF); NVIC_SetVector(UARTE0_UART0_IRQn, (uint32_t) nordic_nrf5_uart0_handler); - nrf_drv_common_irq_enable(UARTE0_UART0_IRQn, APP_IRQ_PRIORITY_HIGHEST); + NRFX_IRQ_PRIORITY_SET(UARTE0_UART0_IRQn, APP_IRQ_PRIORITY_HIGHEST); + NRFX_IRQ_ENABLE(UARTE0_UART0_IRQn); #if UART1_ENABLED /* Initialize FIFO buffer for UARTE1. */ @@ -902,7 +891,8 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) nrf_uarte_int_disable(nordic_nrf5_uart_register[1], 0xFFFFFFFF); NVIC_SetVector(UARTE1_IRQn, (uint32_t) nordic_nrf5_uart1_handler); - nrf_drv_common_irq_enable(UARTE1_IRQn, APP_IRQ_PRIORITY_HIGHEST); + NRFX_IRQ_PRIORITY_SET(nrfx_get_irq_number(UARTE1_IRQn), APP_IRQ_PRIORITY_HIGHEST); + NRFX_IRQ_ENABLE(nrfx_get_irq_number(UARTE1_IRQn)); #endif } @@ -947,7 +937,8 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) /* Wait until NRF_UARTE_EVENT_TXDRDY is set before proceeding. */ bool done = false; do { - done = nrf_uarte_event_extra_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDRDY); + done = nrf_uarte_event_check(nordic_nrf5_uart_register[instance], + (nrf_uarte_event_t) NRF_UARTE_EVENT_TXDRDY); } while(done == false); } @@ -1032,7 +1023,7 @@ void serial_baud(serial_t *obj, int baudrate) struct serial_s *uart_object = obj; #endif - nrf_uart_baudrate_t new_rate = NRF_UART_BAUDRATE_9600; + nrf_uarte_baudrate_t new_rate = NRF_UART_BAUDRATE_9600; /* Round down to nearest supported baud rate. */ if (baudrate < 2400) { @@ -1318,7 +1309,7 @@ int serial_getc(serial_t *obj) core_util_atomic_incr_u32(&nordic_nrf5_uart_state[instance].fifo_free_count, 1); if (nordic_nrf5_uart_state[instance].rx_suspended) { nordic_nrf5_uart_state[instance].rx_suspended = false; - nrf_drv_gpiote_clr_task_trigger(nordic_nrf5_uart_state[instance].rts); + nrfx_gpiote_clr_task_trigger(nordic_nrf5_uart_state[instance].rts); } return *byte; @@ -1347,10 +1338,10 @@ void serial_putc(serial_t *obj, int character) /* Wait until UART is ready to send next character. */ do { - done = nrf_uarte_event_extra_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDRDY); + done = nrf_uarte_event_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDRDY); } while(done == false); - nrf_uarte_event_extra_clear(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDRDY); + nrf_uarte_event_clear(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDRDY); /* Arm Tx DMA buffer. */ nordic_nrf5_uart_state[instance].tx_data = character; @@ -1413,7 +1404,7 @@ int serial_writable(serial_t *obj) int instance = uart_object->instance; return (!core_util_atomic_load_bool(&nordic_nrf5_uart_state[instance].tx_in_progress) && - (nrf_uarte_event_extra_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDRDY))); + (nrf_uarte_event_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDRDY))); } const PinMap *serial_tx_pinmap() @@ -1491,13 +1482,13 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx */ if (instance == 0) { - if (nrf_drv_is_in_RAM(tx) || (tx_length <= UART0_FIFO_BUFFER_SIZE)) { + if (nrfx_is_in_ram(tx) || (tx_length <= UART0_FIFO_BUFFER_SIZE)) { valid = true; } } #if UART1_ENABLED else { - if (nrf_drv_is_in_RAM(tx) || (tx_length <= UART1_FIFO_BUFFER_SIZE)) { + if (nrfx_is_in_ram(tx) || (tx_length <= UART1_FIFO_BUFFER_SIZE)) { valid = true; } } @@ -1509,7 +1500,7 @@ int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx uint8_t *buffer = NULL; /* Tx buffer is in RAM. */ - if (nrf_drv_is_in_RAM(tx)) { + if (nrfx_is_in_ram(tx)) { buffer = (uint8_t *) tx; } else { diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/sleep.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/sleep.c index a58591dd65..a0d0c8f313 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/sleep.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/sleep.c @@ -1,5 +1,6 @@ /* mbed Microcontroller Library - * Copyright (c) 2006-2013 ARM Limited + * Copyright (c) 2006-2018 Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/spi_api.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/spi_api.c index 4651e1700b..e16ae414e0 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/spi_api.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/spi_api.c @@ -44,13 +44,19 @@ #include "pinmap_ex.h" #include "PeripheralPins.h" -#include "nrf_drv_spi.h" +#include "nrfx_spi.h" + +#if 0 +#define DEBUG_PRINTF(...) printf(__VA_ARGS__) +#else +#define DEBUG_PRINTF(...) +#endif /* Pre-allocate instances and share them globally. */ -static const nrf_drv_spi_t nordic_nrf5_spi_instance[3] = { - NRF_DRV_SPI_INSTANCE(0), - NRF_DRV_SPI_INSTANCE(1), - NRF_DRV_SPI_INSTANCE(2) +static const nrfx_spi_t nordic_nrf5_spi_instance[3] = { + NRFX_SPI_INSTANCE(0), + NRFX_SPI_INSTANCE(1), + NRFX_SPI_INSTANCE(2) }; /* Keep track of which instance has been initialized. */ @@ -58,7 +64,7 @@ static bool nordic_nrf5_spi_initialized[3] = { false, false, false }; /* Forware declare interrupt handler. */ #if DEVICE_SPI_ASYNCH -static void nordic_nrf5_spi_event_handler(nrf_drv_spi_evt_t const *p_event, void *p_context); +static void nordic_nrf5_spi_event_handler(nrfx_spi_evt_t const *p_event, void *p_context); #endif /* Forward declaration. These functions are implemented in the driver but not @@ -99,19 +105,19 @@ static void spi_configure_driver_instance(spi_t *obj) /* Clean up and uninitialize peripheral if already initialized. */ if (nordic_nrf5_spi_initialized[instance]) { - nrf_drv_spi_uninit(&nordic_nrf5_spi_instance[instance]); + nrfx_spi_uninit(&nordic_nrf5_spi_instance[instance]); } #if DEVICE_SPI_ASYNCH /* Set callback handler in asynchronous mode. */ if (spi_inst->handler) { - nrf_drv_spi_init(&nordic_nrf5_spi_instance[instance], &(spi_inst->config), nordic_nrf5_spi_event_handler, obj); + nrfx_spi_init(&nordic_nrf5_spi_instance[instance], &(spi_inst->config), nordic_nrf5_spi_event_handler, obj); } else { - nrf_drv_spi_init(&nordic_nrf5_spi_instance[instance], &(spi_inst->config), NULL, NULL); + nrfx_spi_init(&nordic_nrf5_spi_instance[instance], &(spi_inst->config), NULL, NULL); } #else /* Set callback handler to NULL in synchronous mode. */ - nrf_drv_spi_init(&nordic_nrf5_spi_instance[instance], &(spi_inst->config), NULL, NULL); + nrfx_spi_init(&nordic_nrf5_spi_instance[instance], &(spi_inst->config), NULL, NULL); #endif /* Mark instance as initialized. */ @@ -141,7 +147,7 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel /* Get instance based on requested pins. */ spi_inst->instance = pin_instance_spi(mosi, miso, sclk); - MBED_ASSERT(spi_inst->instance < ENABLED_SPI_COUNT); + MBED_ASSERT(spi_inst->instance < NRFX_SPI_ENABLED_COUNT); /* Store chip select separately for manual enabling. */ spi_inst->cs = ssel; @@ -150,14 +156,14 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel spi_inst->config.sck_pin = sclk; spi_inst->config.mosi_pin = mosi; spi_inst->config.miso_pin = miso; - spi_inst->config.ss_pin = NRF_DRV_SPI_PIN_NOT_USED; + spi_inst->config.ss_pin = NRFX_SPI_PIN_NOT_USED; /* Use the default config. */ spi_inst->config.irq_priority = SPI_DEFAULT_CONFIG_IRQ_PRIORITY; spi_inst->config.orc = SPI_FILL_CHAR; - spi_inst->config.frequency = NRF_DRV_SPI_FREQ_1M; - spi_inst->config.mode = NRF_DRV_SPI_MODE_0; - spi_inst->config.bit_order = NRF_DRV_SPI_BIT_ORDER_MSB_FIRST; + spi_inst->config.frequency = NRF_SPI_FREQ_4M; + spi_inst->config.mode = NRF_SPI_MODE_0; + spi_inst->config.bit_order = NRF_SPI_BIT_ORDER_MSB_FIRST; #if DEVICE_SPI_ASYNCH /* Set default values for asynchronous variables. */ @@ -210,7 +216,7 @@ void spi_free(spi_t *obj) int instance = spi_inst->instance; /* Use driver uninit to free instance. */ - nrf_drv_spi_uninit(&nordic_nrf5_spi_instance[instance]); + nrfx_spi_uninit(&nordic_nrf5_spi_instance[instance]); /* Mark instance as uninitialized. */ nordic_nrf5_spi_initialized[instance] = false; @@ -238,17 +244,17 @@ void spi_format(spi_t *obj, int bits, int mode, int slave) struct spi_s *spi_inst = obj; #endif - nrf_drv_spi_mode_t new_mode = NRF_DRV_SPI_MODE_0; + nrf_spi_mode_t new_mode = NRF_SPI_MODE_0; /* Convert Mbed HAL mode to Nordic mode. */ if(mode == 0) { - new_mode = NRF_DRV_SPI_MODE_0; + new_mode = NRF_SPI_MODE_0; } else if(mode == 1) { - new_mode = NRF_DRV_SPI_MODE_1; + new_mode = NRF_SPI_MODE_1; } else if(mode == 2) { - new_mode = NRF_DRV_SPI_MODE_2; + new_mode = NRF_SPI_MODE_2; } else if(mode == 3) { - new_mode = NRF_DRV_SPI_MODE_3; + new_mode = NRF_SPI_MODE_3; } /* Check if configuration has changed. */ @@ -280,23 +286,23 @@ void spi_frequency(spi_t *obj, int hz) struct spi_s *spi_inst = obj; #endif - nrf_drv_spi_frequency_t new_frequency = NRF_DRV_SPI_FREQ_1M; + nrf_spi_frequency_t new_frequency = NRF_SPI_FREQ_1M; /* Convert frequency to Nordic enum type. */ if (hz < 250000) { - new_frequency = NRF_DRV_SPI_FREQ_125K; + new_frequency = NRF_SPI_FREQ_125K; } else if (hz < 500000) { - new_frequency = NRF_DRV_SPI_FREQ_250K; + new_frequency = NRF_SPI_FREQ_250K; } else if (hz < 1000000) { - new_frequency = NRF_DRV_SPI_FREQ_500K; + new_frequency = NRF_SPI_FREQ_500K; } else if (hz < 2000000) { - new_frequency = NRF_DRV_SPI_FREQ_1M; + new_frequency = NRF_SPI_FREQ_1M; } else if (hz < 4000000) { - new_frequency = NRF_DRV_SPI_FREQ_2M; + new_frequency = NRF_SPI_FREQ_2M; } else if (hz < 8000000) { - new_frequency = NRF_DRV_SPI_FREQ_4M; + new_frequency = NRF_SPI_FREQ_4M; } else { - new_frequency = NRF_DRV_SPI_FREQ_8M; + new_frequency = NRF_SPI_FREQ_8M; } /* Check if configuration has changed. */ @@ -316,6 +322,8 @@ void spi_frequency(spi_t *obj, int hz) */ int spi_master_write(spi_t *obj, int value) { + nrfx_err_t ret; + nrfx_spi_xfer_desc_t desc; #if DEVICE_SPI_ASYNCH struct spi_s *spi_inst = &obj->spi; #else @@ -337,7 +345,14 @@ int spi_master_write(spi_t *obj, int value) } /* Transfer 1 byte. */ - nrf_drv_spi_transfer(&nordic_nrf5_spi_instance[instance], &tx_buff, 1, &rx_buff, 1); + desc.p_tx_buffer = &tx_buff; + desc.p_rx_buffer = &rx_buff; + desc.tx_length = 1; + desc.rx_length = 1; + ret = nrfx_spi_xfer(&nordic_nrf5_spi_instance[instance], &desc, 0); + + if (ret != NRFX_SUCCESS) + DEBUG_PRINTF("%d error returned from nrf_spi_xfer\n\r"); /* Manually set chip select pin if defined. */ if (spi_inst->cs != NC) { @@ -365,6 +380,7 @@ int spi_master_write(spi_t *obj, int value) */ int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, char write_fill) { + nrfx_spi_xfer_desc_t desc; #if DEVICE_SPI_ASYNCH struct spi_s *spi_inst = &obj->spi; #else @@ -396,10 +412,10 @@ int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length, cha int tx_offset = 0; int rx_offset = 0; - ret_code_t result = NRF_SUCCESS; + ret_code_t result = NRFX_SUCCESS; /* Loop until all data is sent and received. */ - while (((tx_length > 0) || (rx_length > 0)) && (result == NRF_SUCCESS)) { + while (((tx_length > 0) || (rx_length > 0)) && (result == NRFX_SUCCESS)) { /* Check if tx_length is larger than 255 and if so, limit to 255. */ int tx_actual_length = (tx_length > 255) ? 255 : tx_length; @@ -418,11 +434,12 @@ int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length, cha NULL; /* Blocking transfer. */ - result = nrf_drv_spi_transfer(&nordic_nrf5_spi_instance[instance], - tx_actual_buffer, - tx_actual_length, - rx_actual_buffer, - rx_actual_length); + desc.p_tx_buffer = tx_actual_buffer; + desc.p_rx_buffer = rx_actual_buffer; + desc.tx_length = tx_actual_length; + desc.rx_length = rx_actual_length; + result = nrfx_spi_xfer(&nordic_nrf5_spi_instance[instance], + &desc, 0); /* Update loop variables. */ tx_length -= tx_actual_length; @@ -558,6 +575,7 @@ void spi_slave_write(spi_t *obj, int value) static ret_code_t spi_master_transfer_async_continue(spi_t *obj) { + nrfx_spi_xfer_desc_t desc; /* Remaining data to be transferred. */ size_t tx_length = obj->tx_buff.length - obj->tx_buff.pos; size_t rx_length = obj->rx_buff.length - obj->rx_buff.pos; @@ -572,17 +590,18 @@ static ret_code_t spi_master_transfer_async_continue(spi_t *obj) rx_length = 255; } - ret_code_t result = nrf_drv_spi_transfer(&nordic_nrf5_spi_instance[obj->spi.instance], - ((const uint8_t *)(obj->tx_buff.buffer) + obj->tx_buff.pos), - tx_length, - ((uint8_t *)(obj->rx_buff.buffer) + obj->rx_buff.pos), - rx_length); + desc.p_tx_buffer = ((const uint8_t *)(obj->tx_buff.buffer) + obj->tx_buff.pos); + desc.p_rx_buffer = ((uint8_t *)(obj->rx_buff.buffer) + obj->rx_buff.pos); + desc.tx_length = tx_length; + desc.rx_length = rx_length; + ret_code_t result = nrfx_spi_xfer(&nordic_nrf5_spi_instance[obj->spi.instance], + &desc, 0); return result; } /* Callback function for driver calls. This is called from ISR context. */ -static void nordic_nrf5_spi_event_handler(nrf_drv_spi_evt_t const *p_event, void *p_context) +static void nordic_nrf5_spi_event_handler(nrfx_spi_evt_t const *p_event, void *p_context) { // Only safe to use with mbed-printf. //DEBUG_PRINTF("nordic_nrf5_twi_event_handler: %d %p\r\n", p_event->type, p_context); @@ -593,11 +612,11 @@ static void nordic_nrf5_spi_event_handler(nrf_drv_spi_evt_t const *p_event, void spi_t *obj = (spi_t *) p_context; struct spi_s *spi_inst = &obj->spi; - if (p_event->type == NRF_DRV_SPI_EVENT_DONE) { + if (p_event->type == NRFX_SPI_EVENT_DONE) { /* Update buffers with new positions. */ - obj->tx_buff.pos += p_event->data.done.tx_length; - obj->rx_buff.pos += p_event->data.done.rx_length; + obj->tx_buff.pos += p_event->xfer_desc.tx_length; + obj->rx_buff.pos += p_event->xfer_desc.rx_length; /* Setup a new transfer if more data is pending. */ if ((obj->tx_buff.pos < obj->tx_buff.length) || (obj->rx_buff.pos < obj->tx_buff.length)) { @@ -606,7 +625,7 @@ static void nordic_nrf5_spi_event_handler(nrf_drv_spi_evt_t const *p_event, void ret_code_t result = spi_master_transfer_async_continue(obj); /* Abort if transfer wasn't accepted. */ - if (result != NRF_SUCCESS) { + if (result != NRFX_SUCCESS) { /* Signal callback handler that transfer failed. */ signal_error = true; @@ -736,7 +755,7 @@ void spi_master_transfer(spi_t *obj, ret_code_t result = spi_master_transfer_async_continue(obj); /* Signal error if event mask matches and event handler is set. */ - if ((result != NRF_SUCCESS) && (mask & SPI_EVENT_ERROR) && handler) { + if ((result != NRFX_SUCCESS) && (mask & SPI_EVENT_ERROR) && handler) { /* Cast handler to callback function pointer. */ void (*callback)(void) = (void (*)(void)) handler; @@ -792,7 +811,7 @@ void spi_abort_asynch(spi_t *obj) int instance = obj->spi.instance; /* Abort transfer. */ - nrf_drv_spi_abort(&nordic_nrf5_spi_instance[instance]); + nrfx_spi_abort(&nordic_nrf5_spi_instance[instance]); /* Force reconfiguration. */ object_owner_spi2c_set(instance, NULL); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/us_ticker.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/us_ticker.c new file mode 100644 index 0000000000..5b03a141b8 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/us_ticker.c @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2013 Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic Semiconductor ASA + * integrated circuit in a product or a software update for such product, must reproduce + * the above copyright notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific prior + * written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary or object form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "us_ticker.h" + +#include "us_ticker_api.h" +#include "nrf_timer.h" +#include "app_util_platform.h" +#include "nrfx_common.h" +#include "mbed_critical.h" + +bool us_ticker_initialized = false; + +/* us ticker is driven by 1MHz clock and counter length is 32 bits for nRF52 */ +const ticker_info_t* us_ticker_get_info() +{ + static const ticker_info_t info = { + US_TICKER_FREQ, + US_TICKER_COUNTER_BITS + }; + return &info; +} + +void us_ticker_init(void) +{ + if (us_ticker_initialized) { + nrf_timer_event_clear(NRF_TIMER1, NRF_TIMER_EVENT_COMPARE0); + nrf_timer_int_disable(NRF_TIMER1, nrf_timer_compare_int_get(NRF_TIMER_CC_CHANNEL0)); + return; + } + + nrf_timer_task_trigger(NRF_TIMER1, NRF_TIMER_TASK_STOP); + + nrf_timer_int_disable(NRF_TIMER1, nrf_timer_compare_int_get(NRF_TIMER_CC_CHANNEL0)); + + /* Configure timer as follows: + * - timer mode, + * - timer width 16 bits for NRF51 and 32 bits for NRF52, + * - timer freq 1 MHz. + */ + nrf_timer_mode_set(NRF_TIMER1, NRF_TIMER_MODE_TIMER); + + nrf_timer_frequency_set(NRF_TIMER1, NRF_TIMER_FREQ_1MHz); + +#ifdef TARGET_NRF52 + nrf_timer_bit_width_set(NRF_TIMER1, NRF_TIMER_BIT_WIDTH_32); +#else + nrf_timer_bit_width_set(NRF_TIMER1, NRF_TIMER_BIT_WIDTH_16); +#endif + + nrf_timer_cc_write(NRF_TIMER1, NRF_TIMER_CC_CHANNEL0, 0); + + nrf_timer_event_clear(NRF_TIMER1, NRF_TIMER_EVENT_COMPARE0); + + NVIC_SetVector(TIMER1_IRQn, (uint32_t)us_ticker_irq_handler); + + NRFX_IRQ_PRIORITY_SET(TIMER1_IRQn, APP_IRQ_PRIORITY_HIGH); + NRFX_IRQ_ENABLE(TIMER1_IRQn); + + nrf_timer_task_trigger(NRF_TIMER1, NRF_TIMER_TASK_START); + + /* Bug fix. First value can't be trusted. */ + nrf_timer_task_trigger(NRF_TIMER1, NRF_TIMER_TASK_CAPTURE1); + + us_ticker_initialized = true; +} + +uint32_t us_ticker_read() +{ + nrf_timer_task_trigger(NRF_TIMER1, NRF_TIMER_TASK_CAPTURE1); + + return nrf_timer_cc_read(NRF_TIMER1, NRF_TIMER_CC_CHANNEL1); +} + +void us_ticker_set_interrupt(timestamp_t timestamp) +{ + core_util_critical_section_enter(); + + const uint32_t counter_mask = ((1ULL << US_TICKER_COUNTER_BITS) - 1); + + nrf_timer_cc_write(NRF_TIMER1, NRF_TIMER_CC_CHANNEL0, timestamp & counter_mask); + + if (!nrf_timer_int_enable_check(NRF_TIMER1, nrf_timer_compare_int_get(NRF_TIMER_CC_CHANNEL0))) { + nrf_timer_event_clear(NRF_TIMER1, NRF_TIMER_EVENT_COMPARE0); + nrf_timer_int_enable(NRF_TIMER1, nrf_timer_compare_int_get(NRF_TIMER_CC_CHANNEL0)); + } + + core_util_critical_section_exit(); +} + +void us_ticker_fire_interrupt(void) +{ + NVIC_SetPendingIRQ(TIMER1_IRQn); +} + +void us_ticker_disable_interrupt(void) +{ + nrf_timer_int_disable(NRF_TIMER1, nrf_timer_compare_int_get(NRF_TIMER_CC_CHANNEL0)); +} + +void us_ticker_clear_interrupt(void) +{ + nrf_timer_event_clear(NRF_TIMER1, NRF_TIMER_EVENT_COMPARE0); +} + +void us_ticker_free(void) +{ + nrf_timer_task_trigger(NRF_TIMER1, NRF_TIMER_TASK_STOP); + nrf_timer_int_disable(NRF_TIMER1, nrf_timer_compare_int_get(NRF_TIMER_CC_CHANNEL0)); + NVIC_DisableIRQ(TIMER1_IRQn); + us_ticker_initialized = false; +} diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/us_ticker.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/us_ticker.h index defaf32542..fe58a638ab 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/us_ticker.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/us_ticker.h @@ -1,5 +1,6 @@ /* mbed Microcontroller Library - * Copyright (c) 2018 ARM Limited + * Copyright (c) 2018 ARM Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/README.md b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/README.md deleted file mode 100644 index 61aa551ec4..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Folder origin - -components/ble -components/softdevice -components/libraries/fstorage/nrf_fstorage_sd.* - -# Modifications - -Removed: - * common/nrf_sdh_freertos.c - * common/nrf_sdh_freertos.h - * s212/* - * s332/* - -Moved: - * s112/ to ../TARGET_SOFTDEVICE_S112 - * s132/ to ../TARGET_SOFTDEVICE_s132 - * s140/ to ../TARGET_SOFTDEVICE_s140 - -Renamed: - * ble.h to nrf_ble.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/ble/README.md b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/ble/README.md deleted file mode 100644 index 0b7a849b17..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/ble/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Folder origin - -components/ble - -# Modifications - -Removed - * ble_services/* - * ble_dtm/ble_dtm_hw_nrf51.c - * ble_advertising/* - * ble_db_discovery/* - * ble_dtm/* - * ble_racp/* - * common/* - * nrf_ble_gatt/* - * nrf_ble_qwr/* - * peer_manager/* - -Renamed - * #include "ble.h" -> #include "nrf_ble.h" diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_mbr.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_mbr.h deleted file mode 100644 index 5b63bad960..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_mbr.h +++ /dev/null @@ -1,131 +0,0 @@ -/** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/**@file - * - * @defgroup sdk_nrf_dfu_mbr MBR functions - * @{ - * @ingroup nrf_dfu - */ - -#ifndef NRF_DFU_MBR_H__ -#define NRF_DFU_MBR_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** @brief Function for copying the bootloader using an MBR command. - * - * @param[in] p_src Source address of the bootloader data to copy. - * @param[in] len Length of the data to copy in bytes. - * - * @return This function will return only if the command request could not be run. - * See @ref sd_mbr_command_copy_bl_t for possible return values. - */ -uint32_t nrf_dfu_mbr_copy_bl(uint32_t * p_src, uint32_t len); - - -/** @brief Function for copying the SoftDevice using an MBR command. - * - * @param[in] p_dst Target of the SoftDevice copy. - * @param[in] p_src Source address of the SoftDevice image to copy. - * @param[in] len Length of the data to copy in bytes. - * - * @retval NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly. - * @retval NRF_ERROR_INVALID_LENGTH Invalid len - * @retval NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF). - * @retval NRF_ERROR_INVALID_PARAM if an invalid command is given. - * @retval NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying. - */ -uint32_t nrf_dfu_mbr_copy_sd(uint32_t * p_dst, uint32_t * p_src, uint32_t len); - - -/** @brief Function for initializing the SoftDevice using an MBR command. - * - * @retval NRF_SUCCESS If the SoftDevice was copied successfully. - * Any other return value indicates that the SoftDevice - * could not be copied. - */ -uint32_t nrf_dfu_mbr_init_sd(void); - - -/** @brief Function for comparing source and target using an MBR command. - * - * @param[in] p_ptr1 First pointer to data to compare. - * @param[in] p_ptr2 Second pointer to data to compare. - * @param[in] len Length of the data to compare in bytes. - * - * @retval NRF_SUCCESS If the content of both memory blocks is equal. - * @retval NRF_ERROR_NULL If the content of the memory blocks differs. - */ -uint32_t nrf_dfu_mbr_compare(uint32_t * p_ptr1, uint32_t * p_ptr2, uint32_t len); - - -/** @brief Function for setting the address of the vector table using an MBR command. - * - * @param[in] address Address of the new vector table. - * - * @retval NRF_SUCCESS If the address of the new vector table was set. Any other - * return value indicates that the address could not be set. - */ -uint32_t nrf_dfu_mbr_vector_table_set(uint32_t address); - - -#ifndef SOFTDEVICE_PRESENT -/** @brief Function for setting the address of the irq table using an MBR command. - * - * @param[in] address Address of the new irq table. - * - * @retval NRF_SUCCESS If the address of the new irq table was set. Any other - * return value indicates that the address could not be set. - */ -uint32_t nrf_dfu_mbr_irq_forward_address_set(uint32_t address); -#endif - - -#ifdef __cplusplus -} -#endif - -#endif // NRF_DFU_MBR_H__ - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/doc/s112_nrf51822_5.1.0_release-notes.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/doc/s112_nrf51822_5.1.0_release-notes.pdf deleted file mode 100644 index 08f82cbe53..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/doc/s112_nrf51822_5.1.0_release-notes.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/hex/s112_nrf52810_5.1.0_softdevice.hex b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/hex/s112_nrf52810_5.1.0_softdevice.hex deleted file mode 100644 index 79fc6a560a..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/hex/s112_nrf52810_5.1.0_softdevice.hex +++ /dev/null @@ -1,5925 +0,0 @@ -:020000040000FA -:1000000000040020E90800007D050000C908000088 -:1000100087050000910500009B050000000000001E -:100020000000000000000000000000000D090000BA -:10003000A505000000000000AF050000B9050000A4 -:10004000C3050000CD050000D7050000E105000054 -:10005000EB050000F5050000FF05000009060000A3 -:10006000130600001D0600002706000031060000F0 -:100070003B060000450600004F0600005906000040 -:10008000630600006D060000770600008106000090 -:100090008B060000950600009F060000A9060000E0 -:1000A000B3060000BD060000C7060000D106000030 -:1000B000DB060000E5060000EF060000F906000080 -:1000C000030700000D0700001707000021070000CC -:1000D0002B070000350700003F070000490700001C -:1000E000530700005D07000067070000710700006C -:1000F0007B070000850700008F07000099070000BC -:10010000A30700001FB500F003F88DE80F001FBD26 -:1001100000F0E0BB1FB56FF00100009040100390AD -:10012000029001904FF010208069000B420900F00E -:100130001F045DF822300120A04083434DF8223097 -:10014000684600F045F91FBDF0B54FF6FF734FF458 -:10015000B4751A466E1E11E0A94201D3344600E080 -:100160000C46091B30F8027B641E3B441A44F9D14B -:100170009CB204EB134394B204EB12420029EBD17E -:1001800098B200EB134002EB124140EA0140F0BD8F -:10019000DE4992B00446D1E90001CDE91001FF2209 -:1001A0004021684600F03CFB94E80F008DE80F000A -:1001B000684610A902E004C841F8042D8842FAD12B -:1001C00010216846FFF7C0FF1090AA208DF8440068 -:1001D000FFF7A0FF00F0F3F84FF01024A069102201 -:1001E0006946803000F002F9A069082210A900F0E9 -:1001F000FDF800F0D8F84FF080510A6949690068AD -:100200004A43824201D8102070470020704710B541 -:10021000D0E900214FF0805002EB8103026944696C -:100220006243934209D84FF01022536903EB8103D4 -:100230000169406941438B4201D9092010BD5069D1 -:10024000401C01D0002010BD0F2010BD70B501680A -:100250000446AF4D4FF01020072952D2DFE801F0DD -:10026000330419293C1E2500D4E902656468294637 -:10027000304600F0CDF82A462146304600F0B6F868 -:10028000AA002146304600F09FFA002800D0032043 -:1002900070BD00F051FB4FF4805007E0201DFFF7C8 -:1002A000AAFF0028F4D100F047FB60682860002016 -:1002B00070BD241D94E80700920000F085FA002824 -:1002C000F6D00E2070BD8069401C12D0201DFFF7B3 -:1002D0009EFF0028F6D109E08069401C09D0201D4E -:1002E000FFF789FF0028EDD1606820B12046FFF7B5 -:1002F0004FFF042070BDFFF70DFF00F060F800F025 -:1003000052F8072070BD10B50C46182802D0012005 -:10031000086010BD2068FFF799FF206010BD4FF006 -:100320001024A069401C05D0A569A66980353079E4 -:10033000AA2808D06069401C2DD060690068401C64 -:1003400029D060692CE010212846FFF7FDFE3168B6 -:1003500081421CD1A16901F18002C03105E030B1B8 -:1003600008CA51F8040D984201D1012000E0002094 -:100370008A42F4D158B1286810B1042803D0FEE7AE -:10038000284600F057F862496868086008E000F005 -:1003900016F800F008F84FF480500168491C01D0AD -:1003A00000F0A4FAFEE7BFF34F8F5A4801685A4A9B -:1003B00001F4E06111430160BFF34F8FFEE74FF09E -:1003C00010208169491C02D0806900F0AEB87047E6 -:1003D000524A01681160121D416811604F4A8168DC -:1003E00010321160111DC068086070472DE9F0419E -:1003F00017460D460646002406E03046296800F000 -:10040000A7F8641C2D1D361DBC42F6D3BDE8F08153 -:1004100070B50C4605464FF4806608E0284600F0AB -:1004200084F8B44205D3A4F5806405F58055002C0A -:10043000F4D170BD4168044609B1012500E00025F2 -:100440004FF010267069A268920000F0BDF9C8B1A3 -:10045000204600F01AF89DB17669A56864684FF4EB -:10046000002084420AD2854208D229463046FFF74E -:10047000CFFF2A4621463046FFF7B8FFFFF79FFF20 -:10048000FFF791FFFFF746FEF8E72DE9FF414FF038 -:100490001024616980680D0B01EB800000F6FF708D -:1004A000010B0020009001900290024603906846E4 -:1004B00001230BE0560902F01F0C50F8267003FAD6 -:1004C0000CFC47EA0C0740F82670521CAA42F1D3F4 -:1004D0000AE04A0901F01F0650F8225003FA06F616 -:1004E000354340F82250491C8029F2D3A169090BF9 -:1004F0004A0901F01F0150F822408B409C4340F80C -:100500002240FFF765FFBDE8FF8100005C090000A5 -:10051000000000200CED00E00400FA050006004099 -:10052000144801680029FCD07047134A0221116069 -:1005300010490B68002BFCD00F4B1B1D186008687E -:100540000028FCD00020106008680028FCD070470C -:10055000094B10B501221A60064A1468002CFCD021 -:10056000016010680028FCD0002018601068002886 -:10057000FCD010BD00E4014004E5014008208F4993 -:1005800009680958084710208C4909680958084724 -:1005900014208A49096809580847182087490968BA -:1005A0000958084730208549096809580847382004 -:1005B00082490968095808473C2080490968095858 -:1005C000084740207D4909680958084744207B496D -:1005D00009680958084748207849096809580847B0 -:1005E0004C20764909680958084750207349096822 -:1005F0000958084754207149096809580847582084 -:100600006E490968095808475C206C49096809580F -:100610000847602069490968095808476420674904 -:100620000968095808476820644909680958084753 -:100630006C20624909680958084770205F490968B9 -:100640000958084774205D49096809580847782007 -:100650005A490968095808477C20584909680958C7 -:10066000084780205549096809580847842053499C -:1006700009680958084788205049096809580847F7 -:100680008C204E4909680958084790204B49096851 -:10069000095808479420494909680958084798208B -:1006A00046490968095808479C204449096809587F -:1006B0000847A0204149096809580847A4203F4934 -:1006C000096809580847A8203C490968095808479B -:1006D000AC203A49096809580847B02037490968E9 -:1006E00009580847B4203549096809580847B8200F -:1006F0003249096809580847BC2030490968095837 -:100700000847C0202D49096809580847C4202B49CB -:10071000096809580847C82028490968095808473E -:10072000CC202649096809580847D0202349096880 -:1007300009580847D4202149096809580847D82092 -:100740001E49096809580847DC201C4909680958EE -:100750000847E0201949096809580847E420174963 -:10076000096809580847E8201449096809580847E2 -:10077000EC201249096809580847F0200F49096818 -:1007800009580847F4200D49096809580847F82016 -:100790000A49096809580847FC20084909680958A6 -:1007A00008475FF480700549096809580847000048 -:1007B00003480449024A034B704700000000002030 -:1007C000680900006809000040EA010310B59B07B2 -:1007D0000FD1042A0DD310C808C9121F9C42F8D0AB -:1007E00020BA19BA884201D9012010BD4FF0FF305C -:1007F00010BD1AB1D30703D0521C07E0002010BD72 -:1008000010F8013B11F8014B1B1B07D110F8013BFD -:1008100011F8014B1B1B01D1921EF1D1184610BDDE -:1008200002F0FF0343EA032242EA024200F005B865 -:100830007047704770474FF000020429C0F01280E3 -:1008400010F0030C00F01B80CCF1040CBCF1020F83 -:1008500018BF00F8012BA8BF20F8022BA1EB0C0158 -:1008600000F00DB85FEAC17C24BF00F8012B00F84E -:10087000012B48BF00F8012B70474FF0000200B574 -:10088000134694469646203922BFA0E80C50A0E8B3 -:100890000C50B1F12001BFF4F7AF090728BFA0E861 -:1008A0000C5048BF0CC05DF804EB890028BF40F82D -:1008B000042B08BF704748BF20F8022B11F0804F6F -:1008C00018BF00F8012B7047014B1B68DB68184705 -:1008D0000000002009480A497047FFF7FBFFFFF7B7 -:1008E00011FC00BD20BFFDE7064B1847064A10600B -:1008F000016881F30888406800470000680900002B -:10090000680900001F030000000000201EF0040F13 -:100910000CBFEFF30881EFF3098188690238007892 -:10092000182803D100E00000074A1047074A126860 -:100930002C3212681047000000B5054B1B68054AB1 -:100940009B58984700BD00000703000000000020EE -:100950005809000004000000001000000000000022 -:0809600000FFFFFF0090D0032F -:10100000E00C002065730100858B0000D7720100A1 -:10101000858B0000858B0000858B000000000000A0 -:10102000000000000000000000000000BD7301008F -:10103000858B000000000000858B0000858B000080 -:10104000257401002B740100858B0000858B000046 -:10105000858B0000858B0000858B0000858B000050 -:1010600031740100858B0000858B0000377401000E -:10107000858B00003D740100437401004974010038 -:10108000858B0000858B0000858B0000858B000020 -:10109000858B0000858B0000858B0000858B000010 -:1010A000858B00004F740100858B0000858B00004C -:1010B000858B0000858B0000858B0000858B0000F0 -:1010C00055740100858B0000858B0000858B000026 -:1010D000858B0000858B0000858B0000858B0000D0 -:1010E000858B0000858B0000858B0000858B0000C0 -:1010F000858B0000858B0000858B0000858B0000B0 -:10110000858B0000858B000000F002F816F017F9BF -:101110000AA090E8000C82448344AAF10107DA4552 -:1011200001D116F00CF9AFF2090EBAE80F0013F076 -:10113000010F18BFFB1A43F001031847286701008D -:10114000486701000A4410F8014B14F00F0508BF6E -:1011500010F8015B240908BF10F8014B6D1E05D083 -:1011600010F8013B6D1E01F8013BF9D1641E03D05C -:10117000641E01F8015BFBD19142E4D3704700008B -:101180000023002400250026103A28BF78C1FBD890 -:10119000520728BF30C148BF0B6070471FB500F031 -:1011A00031F88DE80F001FBD8269034981614FF05E -:1011B0000100104470470000BD11000001B41EB4CE -:1011C00000B50EF089FE01B40198864601BC01B05D -:1011D0001EBD0000F0B44046494652465B460FB47F -:1011E00002A0013001B50648004700BF01BC864699 -:1011F0000FBC8046894692469B46F0BC7047000073 -:101200000911000016F098B870B51B4C054609206E -:101210002070A01C00F061F85920A08029462046CB -:10122000BDE8704006F05CBD06F065BD70B50C46CB -:101230001249097829B1A0F16001562908D301208B -:1012400013E0602804D0692802D043F201000CE0CA -:1012500020CC0B4E94E80E0006EB8000A0F58050E9 -:10126000241FD0F8806E2846B047206070BD012052 -:101270007047062070470000080000201C00002076 -:101280008474010010B504460021012000F032F8FA -:1012900000210B2000F02EF80421192000F02AF87C -:1012A00004210D2000F026F804210E2000F022F881 -:1012B00004210F2000F01EF80421C84300F01AF8A2 -:1012C0000621162000F016F80621152000F012F86D -:1012D0002046FFF799FF002010BDA621018070472E -:1012E000FFF7A2BF002070470A487047FFF79EBF74 -:1012F000704770474907090E002806DA00F00F0012 -:1013000000F1E02080F8141D704700F1E02080F823 -:101310000014704703F90042FE4810B5017900F14E -:101320000500490805D00AF065FABDE8104006F04E -:1013300080BB0AF046FAF8E702210BF079BB2DE9F1 -:10134000FC411D4690460E460746FFF7F5FF040098 -:101350000AD02078222804D3A07FC0F34010A842EE -:1013600005D10820BDE8FC8143F20200FAE7ADF8A0 -:1013700000703DB101208DF802008DF803608DF8FA -:10138000048002E000208DF8020068460AF060FC4C -:10139000A07F65F34510A0770020E3E730B5044651 -:1013A000A1F120000D460A2847D2DFE800F005072A -:1013B0000C19202532373C41FFDF3FE02078202800 -:1013C0003CD1FFDF3AE0D3480078032836D02078BC -:1013D000242833D0252831D023282FD0FFDF2DE03B -:1013E000207822282AD0232828D8FFDF26E020785A -:1013F000222823D0FFDF21E0207822281ED02428B5 -:101400001CD026281AD0272818D0292816D0FFDF6C -:1014100014E02078252811D0FFDF0FE02078252860 -:101420000CD0FFDF0AE02078252807D0FFDF05E099 -:101430002078282802D0FFDF00E0FFDF257030BDD4 -:101440001FB50022ADF800200C88ADF802404B8893 -:10145000ADF80430CA88ADF808208988ADF80610C8 -:101460000021ADF80A10ADF80C1080B14FF6FF70F6 -:101470000621844201D1ADF80210834201D1ADF8BA -:101480000410824203D14FF44860ADF8080068466A -:101490000AF0AEFA06F0CDFA04B010BD70B51446ED -:1014A0000D4606460EF098FF58B90DB1A54201D978 -:1014B0000C2070BD002408E056F824000EF08CFFCC -:1014C00008B1102070BD641CE4B2AC42F4D300201B -:1014D00070BDF0B50024059D10B1A94203D850E0BD -:1014E00009B90020F0BD0920F0BD055DD5B107198F -:1014F00097F801C0BCF1150F2DD03BDCBCF1150FE6 -:1015000038D2DFE80CF037122020262628282F2F8B -:10151000373737373737373737372000025D22BB49 -:10152000641CE4B28C42F9D3DBE7022DDBD1BD7839 -:101530001D70072D01D26D0701D40A20F0BD15786A -:1015400045F0010515E0EF43FF0707E0012D07D047 -:1015500010E00620F0BD2F07A7F18057002FF5D02F -:101560003046F0BD1578AF0701D50B20F0BD45F032 -:1015700002051570055D641C2C44E4B28C4202D94E -:10158000B1E74FF448568C42AFD3AAE710B50278C2 -:10159000540809D0012243F20223012C07D0022C67 -:1015A0000DD0032C13D10FE00020087005E08079E6 -:1015B0000324B4EB901F0AD10A70002010BD80797B -:1015C000B2EB901F03D1F7E780798009F4D0184679 -:1015D00010BD38B50C460546694600F0D6FF002818 -:1015E0000DD19DF80010207861F34700207055F868 -:1015F000010FC4F80100A888A4F80500002038BD38 -:1016000038B51378C0B1022816D043A46D462468BB -:1016100000944C7905EB9414247864F34703137019 -:1016200003280ED003F0FE0010700868C2F8010015 -:101630008888A2F8050038BD23F0FE031370022845 -:10164000EED1D8B240F00100EEE738B50C4609788B -:10165000222901D2082038BDADF800008DF8022003 -:1016600068460AF003F906F0E4F9050003D12121E8 -:101670002046FFF793FE284638BD1CB500208DF8A4 -:101680000000CDF80100ADF805002248807B02285B -:1016900001D0012000E000208DF8070068460AF024 -:1016A00053F9002800D0FFDF1CBD2DE9FE430400E4 -:1016B00000D1FFDF2078174E20F00F00801C20F0B3 -:1016C000F0007030207060680178091F162930D250 -:1016D000DFE801F0FB2F2F2F52FA2F0BFAFA3FFB16 -:1016E0002F2FFB6BFB2F2FFBFBF986883046FFF774 -:1016F00023FE0546304609F0C2FCE0B160688079FF -:1017000085F83E0021212846FFF748FE304603F0C9 -:10171000A8FB03E0840100200302FF01304604F02F -:101720000FFD314602200EF00BFEA87F20F01000C6 -:10173000A877BDE8FE83207820F0F00020302070EC -:1017400006202072668060688079607206F049FB2E -:10175000D8E785882846FFF7EFFD00B9FFDF60680E -:101760008078012800D0FFDF6068817903B02846C7 -:10177000BDE8F04309F0B3BD86883046FFF7DCFDD5 -:10178000050000D1FFDF06F02CFB60683146C08801 -:10179000288160680089688160684089A88102208A -:1017A0000EF0CEFD0020A875C3E780783C2803D05A -:1017B000002502280CD000E00125002720B13C289C -:1017C00002D0022800D0FFDF27B1FFDFFFDFB0E744 -:1017D0000127F3E706F005FB1DB1B07800F0CBFE62 -:1017E00088E06568A879AD1C00B9FFDF96F8028033 -:1017F000B5F80290404606F0BCF8070000D1FFDFC4 -:101800000022022148460BF00AF9040000D1FFDF54 -:1018100022212046FFF7C2FDA17F012060F30101D4 -:10182000A177298B2181698B6181A98BA18184F8A2 -:1018300022808DF8080002AA032148460BF0EFF839 -:1018400000B9FFDFB888ADF80400B8788DF806005D -:1018500001AA052148460BF0E2F800B9FFDFB8887D -:10186000ADF80000F8788DF802006A460421484679 -:101870000BF0D5F800B9FFDF062105F1120000F0EA -:10188000A1FE18B36879800700D5FFDF6979E07D94 -:1018900061F34700E075D5F80600A0616889A08370 -:1018A000062105F10C0000F08DFEC8B13079410829 -:1018B000607861F347006070D6F80500C4F8020054 -:1018C000B6F8090015E027E021E02CE0E07D20F0EB -:1018D000FE00801CE075D5F81200A061E88ADEE702 -:1018E000607820F0FE00801C6070E868C4F8020098 -:1018F000288AE0803078032800D0FFDF00210846E6 -:101900000EF01EFDBDE8FE43012000F020BE204683 -:10191000BDE8FE4301F037BE06F063FA307C40F0CC -:101920000400307405E7BDE8FE4306F05ABA2DE91D -:10193000F047804600789146002702090C463E4653 -:10194000012A75D000204FF6FF71022A71D0072AB4 -:101950000AD00A2A6ED0FFDFA9F800600CB12780F8 -:1019600066800020BDE8F087D8F804502A78142A51 -:1019700076D006DC082A0BD00F2A17D0132A59D1AB -:101980001EE0172A09D0182A3FD0192AF7D152E0B1 -:1019900012271026A888214683E01C27092664B355 -:1019A0006888A080D8F804000079BDE01B270926CC -:1019B0001CB303202072D8F804004088A080CBE735 -:1019C000A9783C291CD010271826AD1CACB1287969 -:1019D00000B9FFDF6888A080288B6082288B208276 -:1019E000688BA082A88BE082687904F10802A91DA7 -:1019F000FFF706FE0120E073AEE7A9F80060B0E74C -:101A00001B270926002C7DD1F7E720271026002C64 -:101A1000F3D0A180D8F8040004F10902407A2072C2 -:101A2000D8F80410CB1C88781946FFF7E9FD93E736 -:101A30002DE039E07AE021270A26002CDDD06888E5 -:101A4000A080D8F8040000792072D8F8040040790A -:101A50006072F948017C21F0040101747CE7FFE722 -:101A600022270B26002CC8D0A888A080D8F8040014 -:101A700080782072D8F80400807900F0B2FD60729E -:101A8000D8F80400C07900F0ACFDA07264E798F8C3 -:101A90000800022801D0FFDF5EE712271026B8F801 -:101AA000020000F07CFD57E798F80820072A44D28E -:101AB000DFE802F03543433C3C3C04001127092693 -:101AC000002C9AD0B8F802502846FFF735FC90F861 -:101AD00022A0A58098F809002072042128460AF067 -:101AE000B9FF052128460AF0B5FF002128460AF073 -:101AF000B1FF012128460AF0ADFF032128460AF074 -:101B0000A9FF00E010E0022128460AF0A3FF062109 -:101B100028460AF09FFF504600F02DFD1CE71B27CA -:101B20000926002C8AD0A180207215E74A4621465A -:101B30004046BDE8F04701F05BBEFFDF0CE710B5A3 -:101B4000BD4C207801280ED0002009F0B9FF05F027 -:101B500070FF002808D1002108460EF0F1FB207824 -:101B6000032802D004E0082010BDA07800F003FD97 -:101B7000012000F0ECFC002010BD70B5002518B16C -:101B8000022813D0FFDF70BDFFF7D9FF0028FAD17C -:101B900006F024F90028F6D0017821F00F01891C05 -:101BA00021F0F00120310170057218E08EB230464C -:101BB000FFF7C2FB040000D1FFDF20782128E2D02C -:101BC00006F00CF978B1017821F00F01891C21F0A1 -:101BD000F00110310170022101724680A575BDE847 -:101BE000704006F0FEB821463046BDE87040132232 -:101BF0002BE52DE9F04116460C00804600D1FFDFB1 -:101C0000307820F00F00801C20F0F0001030307091 -:101C10002078022802D0FFDFBDE8F0814046FFF7C0 -:101C20008BFB050000D1FFDF61884FF6FF700027B6 -:101C3000814202D1A288824203D0814201D1A08890 -:101C400048B106F0CEF82068B0606068F060208986 -:101C50003082AF75E0E7A87D0128DDD1782300222E -:101C6000414602200EF0C2FA0220A875D4E738B52A -:101C700005460C4608460EF0AFFB70B9203D072D17 -:101C800037D2DFE805F004062328362E1C00062094 -:101C900038BD60680EF0E4FB08B1102038BD6188E3 -:101CA00020886A460AF012F805F0C3FE0028F5D134 -:101CB00061680029F2D0BDF800200A8038BDA07804 -:101CC00000F0010120880AF032F80EE02068BDE83B -:101CD000384001F0C2BF207800F001000AF08AF815 -:101CE00003E06188208809F095FFBDE8384005F0E1 -:101CF000A0BE072038BD70B505460C4608460EF05C -:101D000091FB08B1102070BD203D072D1BD2DFE8EC -:101D100005F0041818181A1A18002088FFF70CFB91 -:101D200020B10078222804D2082070BD43F20200BE -:101D300070BD2088A11C09F0EDFDBDE8704005F0E4 -:101D400078BE062070BD072070BD3B48001D70475F -:101D500038B51421384815F074FA012000F0F7FB6B -:101D6000354C6846611D05F0CFFF9DF800102079C5 -:101D700061F3470020F0010020710020A0734FF4B0 -:101D80006170A0810220E073FFF7C6FA00B1FFDFA7 -:101D900000F032FC01F0CAFB38BD10B50C46402102 -:101DA000204615F04EFAA07F20F00300A0772020F7 -:101DB00020700020A07584F8230010BD70477CB50A -:101DC00005460EF009FB08B110207CBD1A4C211D00 -:101DD00060680090A06801902846FFF7FAFB002891 -:101DE000F3D1FFF799FA0028EFD000996160BDF8B0 -:101DF000041021819DF80610A1727CBD10B5044627 -:101E00000EF010FB08B1102010BD0B4922460879D6 -:101E1000491D4008FFF7F4FB002010BDFEB50D463C -:101E200004004FF0000714D00822FFF737FB00280A -:101E300014D100260BE000008401002054F8260095 -:101E40006946FFF7A3FB002808D1761CF6B2AE4224 -:101E5000F4D309F020FC10B143F20320FEBDF74E8D -:101E6000F770FCB100271AE054F8270002A9FFF729 -:101E70008DFB00B1FFDF9DF808008DF8000054F8DD -:101E8000270050F8011FCDF801108088ADF805003B -:101E9000684609F025FC00B1FFDF7F1CFFB2AF42AE -:101EA000E2D3F5700020FEBD2DE9F0478AB015465B -:101EB000894604001DD00F4608222946FFF7EEFA96 -:101EC000002810D1002612E054F826006946103090 -:101ED00000F05BFB002806D13FB157F826000EF05A -:101EE0007BFA10B110200AB03CE5761CF6B2AE4287 -:101EF000EAD30026A5F101081CE000BF06F1010AA3 -:101F00000AF0FF0712E000BF54F82600017C4A08DF -:101F100054F827100B7CB2EB530F05D10622113079 -:101F2000113115F0E3F858B17F1CFFB2AF42EBD38B -:101F30000AF0FF064645E1DB4E4624B1012003E0EE -:101F400043F20520CFE7002009F0EAFB10B909F0C1 -:101F5000F3FB10B143F20420C5E75CB300270DF199 -:101F6000170825E054F827006946103000F00DFBF3 -:101F700000B1FFDF54F82700102250F8111FCDF8F0 -:101F800001108088ADF8050054F827100DF1070006 -:101F900015F0D8F896B156F827101022404615F0E3 -:101FA000D1F8684609F081FB00B1FFDF7F1CFFB26A -:101FB000AF42D7D3FFF761FB002094E7404601F022 -:101FC00040FEEEE730B585B004460EF005FA18B9CC -:101FD00060680EF04EFA10B1102005B030BD608878 -:101FE0004AF2B811884206D82078944D28B10128C9 -:101FF00006D0022804D00720EFE7FFF78DF917E09D -:102000006078022804D0032802D043F20220E4E7DB -:10201000E873C1B200200090ADF8040002292BD073 -:10202000032926D0FFDF684609F0E4FB05F001FD37 -:102030000028D2D1606801F0F7FD207858B1012066 -:102040008DF800000DF1010001F0FBFD684609F07C -:10205000C0FE00B1FFDF2078A873FFF70EFB608899 -:1020600060B1A88180B209F053FB00B1FFDF00200E -:10207000B3E78DF80500D6E74020FAE74FF461702A -:10208000EFE710B504460EF0CDF920B9606838B11D -:102090000EF0E6F908B1102010BD606801F0D1FD26 -:1020A000664881896180C17B6170807B20700020DF -:1020B00010BD2DE9F04186B0054600208DF80C00DA -:1020C0008DF804008DF808008DF810001E461446A7 -:1020D000884628460EF0CDF918B920460EF0C9F909 -:1020E00010B1102006B097E555EA040018D01F275C -:1020F00002AB03AA414628460097FFF7EAF90028F9 -:10210000F0D104AB01AA314620460097FFF7E1F970 -:102110000028E7D19DF80400C00703D00A20E1E7BA -:102120000720DFE73DB12946404609F0B7FC05F03E -:1021300080FC0028D6D13CB12146304609F0B7FCDE -:1021400005F077FC0028CDD13C499DF80800487087 -:102150000020C7E72DE9F04788B088464FF0000916 -:1021600037A104468DF81090D1E90001CDE90501B1 -:1021700020460EF031F990B92078012803D160682B -:102180000EF02AF958B92D4D4FF0010AA87B50B135 -:10219000E87B022807D160680EF06BF918B11020B7 -:1021A00008B0BDE8F0872878012801D00820F7E7BB -:1021B00006200AF0F1FB20B92078002867D001281A -:1021C00065D00CF041FB06460DF0D5FC301AC6B2C6 -:1021D00006200AF0D9FB074606200AF0DDFB391A73 -:1021E0002878022810D000200844301A10F0FF0F81 -:1021F0000CD0608943F6E172A0F120019142217870 -:102200000AD3012904D07DE00120EDE71320C7E7C0 -:10221000E0BBA189D1BB08E0012906D06978C907D4 -:1022200003D0A18991B3B4296CD8217861B1012977 -:102230000ED002290AD0032964D110E084010020C5 -:102240000706050403020100002609E0022607E054 -:1022500008B9A08908B1042609E0012607E0032691 -:10226000A87B50B1E87B022807D1606828B104A997 -:102270006068FFF78BF9002892D1207A40B10128DD -:1022800008D0022808D003283CD107E03AE03BE020 -:10229000002704E0012702E0022700E003270EB137 -:1022A000022E0ED16FB1E87860B36878800702D053 -:1022B00043F2012074E7022E03D1022F22D0032F14 -:1022C00020D0207808B101280AD1404605F051FB02 -:1022D000C0B14078C0B1404605F027FE85F80280C5 -:1022E0006089ADF800006089ADF802008DF80460E7 -:1022F000A87B0DF1050148B1E87B022818D003281E -:1023000008D119E007204BE7122049E7281D00F00B -:102310003CF900B1FFDF9DF810008DF80600207831 -:1023200001280ED0A87B98B1E87B022807D00FE0E7 -:1023300003208DF80500EEE78DF805A0EBE7606857 -:1023400030B1606850F8011FCDF80710808802E0B6 -:102350004846CDF80790ADF80B008DF80E70A07BC5 -:10236000C0F34002014662F35F01C0F3800041EA1E -:10237000800005A9085C8DF80D000028C2D06846D1 -:1023800009F05BFB05F055FB002893D1012009F013 -:1023900097FB05F04EFB00288CD1052E14D2DFE808 -:1023A00006F0030320200300A87805F0E2FA0500F8 -:1023B00000D1FFDF687800B9FFDF6878401E6870E1 -:1023C0005FF0030000F0C3F8012E0CD0A08950B1DB -:1023D00000228300114610460DF008FF18B10320BB -:1023E000DEE60220EEE70020DAE62DE9FC41804639 -:1023F0000D46032608460EF03CF810B11020BDE84B -:10240000FC814046FEF798FF040004D02078222883 -:1024100004D20820F3E743F20200F0E7A07F00F0C7 -:1024200003073DB1012F0AD000202946FFF708F825 -:102430000600E4D1012F04D0FFDF3046DFE70120A2 -:10244000F3E7A07D2946022801D011B107E0112051 -:10245000D5E7684600F0DDF90028D0D1694640464E -:1024600008F01DFF0600E8D10120A075E5E770B572 -:102470000C460546FEF760FF010005D022462846BF -:10248000BDE87040FFF7E1B843F2020070BD10B53F -:1024900009F070F9BDE8104005F0CBBA0123FEF752 -:1024A0004EBF00231A461946FEF749BF70B50546D0 -:1024B0000C4608460DF0B6FF08B1102070BD284646 -:1024C000FEF73AFF38B10178222902D3807F8006D7 -:1024D00004D4082070BD43F2020070BD2146284696 -:1024E00009F0E0FBBDE8704005F0A3BA38B5054639 -:1024F0000C4608460DF070FF08B1102038BD284684 -:10250000FEF71AFF20B10078222804D2082038BD37 -:1025100043F2020038BD3748007C400701D5112046 -:1025200038BD2078800802D16078800801D007206B -:1025300038BDADF8005020788DF8020060788DF835 -:102540000300684609F045FA05F073FA38BD30B566 -:10255000284D040008D0012C04D0022C06D0032CF6 -:1025600004D0FFDF2C7030BDFFDFFBE728780128A7 -:10257000F8D0FFDFF6E710B505F0FBF9040000D155 -:10258000FFDF6078401C607010BD0278520804D0F4 -:10259000012A02D043F202207047FEF7F7BF70B560 -:1025A0000C0006460DD0FEF7C7FE050000D1FFDF88 -:1025B000A68028892081288960816889A081A889CE -:1025C000E08170BD10B500231A4603E0845C23430C -:1025D000521CD2B28A42F9D30BB1002010BD0120A7 -:1025E00010BD00B5012803D0022801D0FFDF002074 -:1025F00000BD000084010020FE4800210160416010 -:10260000018170472DE9F743044692B09146406836 -:102610000DF026FF40B160680DF02BFF20B9607807 -:1026200000F00300022801D0012000E00020F14E5C -:10263000307248460DF0D0FE18B1102015B0BDE83C -:10264000F08349460120FEF7FBFE0028F6D1012564 -:102650008DF842504FF4C050ADF84000002210A950 -:10266000284604F035F80028E8D18DF842504FF4A0 -:1026700028504FF00008ADF8400047461C2168463E -:10268000CDF81C8014F0FFFD9DF81C0008AA20F076 -:102690000F00401C20F0F00010308DF81C00207856 -:1026A0008DF81D0061789DF81E0061F3420040F036 -:1026B00001008DF81E009DF800000AA940F00200FC -:1026C0008DF800002089ADF83000ADF832706089D7 -:1026D00007AFADF834000B97606810AC0E900A9409 -:1026E000684603F0EAFD0028A8D1BDF8200030803C -:1026F0008DF8425042F60120ADF840009DF81E00D2 -:1027000008AA20F00600801C20F001008DF81E00B1 -:102710000220ADF83000ADF8340013A80E900AA9DD -:10272000684603F0CAFD002888D1BDF820007080FB -:10273000311D484600F033F9002887D18DF842500A -:1027400042F6A620ADF840001C216846CDF81C805A -:1027500014F099FD9DF81C00ADF8345020F00F00E6 -:10276000401C20F0F00010308DF81C009DF81D007A -:1027700008AA20F0FF008DF81D009DF81E000AA990 -:1027800020F0060040F00100801C8DF81E009DF82E -:1027900000008DF8445040F002008DF80000CDE9B3 -:1027A0000A4711A80E90ADF83050684603F085FD39 -:1027B000002899D1BDF82000F08000203EE73EB50A -:1027C00004460820ADF8000020460DF005FE08B1D3 -:1027D00010203EBD21460120FEF732FE0028F8D130 -:1027E0002088ADF804006088ADF80600A088ADF838 -:1027F0000800E088ADF80A007E4801AB6A46808890 -:10280000002104F05FF9BDF800100829E1D0032091 -:102810003EBD1FB50446002002900820ADF8080018 -:10282000CDF80CD020460DF0D7FD10B1102004B02B -:1028300010BD704802AA81884FF6FF7004F084FB37 -:102840000028F4D1BDF80810082901D00320EEE7D4 -:10285000BDF800102180BDF802106180BDF80410A1 -:10286000A180BDF80610E180E1E701B582B0022049 -:10287000ADF800005F4802AB6A464088002104F0D2 -:1028800021F9BDF80010022900D003200EBD1CB5AF -:10289000002100910221ADF8001001900DF0C2FD61 -:1028A00008B110201CBD53486A4641884FF6FF709E -:1028B00004F04AFBBDF800100229F3D003201CBD30 -:1028C000FEB54C4C06461546207A0F46C00705D08B -:1028D00008460DF081FD18B11020FEBD0F20FEBD91 -:1028E000F82D01D90C20FEBD30460DF075FD18BB4A -:1028F000208801A903F027FA0028F4D130788DF858 -:102900000500208801A904F0BCF80028EBD1009054 -:102910009DF800009DF8051040F002008DF80000C1 -:10292000090703D040F008008DF8000020886946B0 -:1029300004F044F80028D6D1ADF8085020883B4672 -:1029400002AA002104F0BEF8BDF80810A942CAD0BE -:102950000320FEBD7CB5054600200090019008884C -:10296000ADF800000C46284601950DF079FD18B928 -:1029700020460DF057FD08B110207CBD15B1BDF803 -:10298000000050B11B486A4601884FF6FF7004F002 -:10299000DBFABDF8001021807CBD0C207CBD30B579 -:1029A00093B0044600200D460090142101A814F0B5 -:1029B0006AFC1C2108A814F066FC9DF80000CDF804 -:1029C00008D020F00F00401C20F0F00010308DF8EF -:1029D00000009DF8010020F0FF008DF801009DF837 -:1029E000200040F002008DF8200001208DF8460004 -:1029F00002E000009801002042F60420ADF84400F7 -:102A000011A801902088ADF83C006088ADF83E0028 -:102A1000A088ADF84000E088ADF842009DF80200C3 -:102A200006AA20F00600801C20F001008DF80200AC -:102A30000820ADF80C00ADF810000FA8059001A912 -:102A400008A803F03AFC002803D1BDF8180028803C -:102A5000002013B030BD00004FF0E0224FF40041E1 -:102A60000020C2F880111D4908701D4990020860BD -:102A7000704770B5194D04462878A04202D00CB1B9 -:102A800000B1FFDF2878A0420DD01649144A2C70FF -:102A90000020CCB1134E144B1436151F012C03D05B -:102AA000022C08D0FFDF70BD086002200860336090 -:102AB0004FF0407005E008600320086033604FF479 -:102AC00000001060286070BD086008604FF0607002 -:102AD000106070BD00B5FFDF00BD000018000020D1 -:102AE00008F5014000F500401802002070B50B20E9 -:102AF00000F0AFF9082000F0ACF900210B2000F045 -:102B0000BEF90021082000F0BAF9E54C0125656006 -:102B1000A5600020C4F84001C4F84401C4F848018D -:102B20000B2000F0A1F9082000F09EF90B2000F026 -:102B300085F9256070BD10B50B2000F08AF90820DA -:102B400000F087F9D648012141608160D5490A68C3 -:102B5000002AFCD10021C0F84011C0F84411C0F88F -:102B600048110B2000F080F9BDE81040082000F06B -:102B70007BB910B50B2000F077F9BDE810400820B4 -:102B800000F072B900B530B1012806D0022806D095 -:102B9000FFDF002000BDC44800BDC44800BDC348DD -:102BA000001D00BD70B5C2494FF000400860C14D26 -:102BB000C00BC5F80803C04800240460C5F84041B4 -:102BC0000820C43500F045F9C5F83C41BB48047005 -:102BD00070BD08B5B24A002128B1012811D00228E1 -:102BE0001CD0FFDF08BD4FF48030C2F80803C2F8E4 -:102BF0004803AC483C300160C2F84011BDE80840D1 -:102C0000D0E74FF40030C2F80803C2F84803A548E3 -:102C100040300160C2F84411A4480CE04FF4802019 -:102C2000C2F80803C2F848039E4844300160C2F865 -:102C300048119E48001D0068009008BD70B51646FA -:102C40000D460446022800D9FFDF002294480123E4 -:102C500004F110018B4000EB8401C1F8405526B10E -:102C6000C1F84021C0F8043303E0C0F80833C1F8CC -:102C70004021C0F8443370BD2DE9F0411C46154693 -:102C800030B1012834D0022839D0FFDFBDE8F0810F -:102C9000891E002221F07F411046FFF7CFFF012C53 -:102CA00024D00020854E834F012470703C618249FE -:102CB00000203C3908600220091D08607E4904207C -:102CC000303908607C483D350560C7F8004208206F -:102CD00000F0CAF82004C7F80403082000F0AEF89A -:102CE0007349E007091F08603470CFE70120D9E776 -:102CF000012B02D00022012005E00122FBE7012B7D -:102D000004D000220220BDE8F04197E70122F9E754 -:102D100064480068704770B5614CD4F840010025E4 -:102D2000012809D1D4F80803C00305D54FF4803039 -:102D3000C4F80803C4F84051D4F8440101280CD168 -:102D4000D4F80803800308D54FF40030C4F8080312 -:102D5000C4F8445101200CF0D0FBD4F848010128FC -:102D60000ED1D4F8080340030AD54FF48020C4F8EC -:102D70000803C4F84851BDE8704002200CF0BDBB08 -:102D800070BD10B54D4C207850B1FFF70BFF607847 -:102D9000002807D000206070BDE810400CF0ADBBEB -:102DA0000320F9E710BD4FF0E0214FF40010C1F807 -:102DB00000027047152000F057B83E490120086115 -:102DC000082000F051B83B494FF47C10C1F80803CB -:102DD0000020024601EB8003C3F84025C3F84021E0 -:102DE000401CC0B20628F5D37047410A43F6095289 -:102DF0005143C0F3080010FB02F000F5807001EBB6 -:102E00005020704710B5430B48F2376463431B0CE6 -:102E10005C020C602A4C03FB04002A4B4CF2F724A2 -:102E200043435B0D13FB04F404EB402000F580707A -:102E30004012107008681844086010BD00F01F02AE -:102E4000012191404009800000F1E020C0F800110C -:102E5000704700F01F02012191404009800000F1FD -:102E6000E020C0F88011704700F01F02012191405E -:102E70004009800000F1E020C0F880127047490747 -:102E8000090E002806DA00F00F0000F1E02080F8BB -:102E9000141D704700F1E02080F800147047000016 -:102EA00000B0004004B500404081004044B1004003 -:102EB00008F50140008000404085004030000020BF -:102EC000F7C2FFFF6F0C01000CF0ABBB0449002000 -:102ED00008604FF0E0210220C1F880027047000036 -:102EE000FC1F004010B50D2000F067F8C4B26FF071 -:102EF000040000F062F8C0B2844200D0FFDF36491F -:102F00000120086010BD70B50D2000F040F8334C72 -:102F10000020C4F800010125C4F804530D2000F07E -:102F200041F825604FF0E0216014C1F8000170BD48 -:102F300010B50D2000F02BF8284801214160002138 -:102F4000C0F80011BDE810400D2000F02BB8234957 -:102F500010B5D1F80001012801D0FFDF10BD1E48D7 -:102F6000001D00680022C0B2C1F80021BDE8104079 -:102F70000CF02CBF10B51948D0F800110029FBD077 -:102F8000FFF7E5FFBDE810400D2000F00BB800F0A2 -:102F90001F02012191404009800000F1E020C0F8AB -:102FA0008011704700F01F0201219140400980000C -:102FB00000F1E020C0F880127047002806DA00F027 -:102FC0000F0000F1E02090F8140D03E000F1E02084 -:102FD00090F800044009704704D5004000D000403C -:102FE0007047704770477047704770477047704729 -:102FF0007047704770477047704770477047704719 -:103000002CFFFFFFDBE5B15100800100A600FFFFB0 -:1030100070000000284F4C00DA0D499A2F95338438 -:1030200077AC2F1307CD6F7D177A70DE10B504468D -:103030000DF0D2F908B1102010BD2078C0F30210B5 -:10304000042807D86078072804D3A178102901D86C -:10305000814201D2072010BDE078410706D42179D2 -:103060004A0703D4000701D4080701D5062010BD84 -:10307000002010BD70B514460D46064604F0AEFEA5 -:1030800080B10178182221F00F01891C21F0F00194 -:10309000A03100F8081B214614F099F8BDE87040F3 -:1030A00004F09FBE29463046BDE870401322FEF76B -:1030B000CCBA2DE9F047064608A8894690E83004C6 -:1030C0001F4690461421284614F0DDF80021CAF866 -:1030D0000010B8F1000F03D0B9F1000F03D114E0D4 -:1030E0003878C00711D020680DF09CF9C0BBB8F14A -:1030F000000F07D120681230286020681430686003 -:103100002068A8602168CAF800103878800724D5A4 -:1031100060680DF0A5F918BBB9F1000F21D0FEF7DA -:1031200014FE0168C6F868118188A6F86C118079D0 -:1031300086F86E0101F02FFAF74FEF60626862B116 -:1031400096F8680106F2691140081032FEF758FA45 -:1031500010223946606813F0F5FF0020BDE8F087C3 -:1031600006E0606820B1E8606068C6F86401F4E7D2 -:103170001020F3E730B5054608780C4620F00F0024 -:10318000401C20F0F001103121700020607095F893 -:10319000230030B104280FD0052811D0062814D000 -:1031A000FFDF20780121B1EB101F04D295F8200039 -:1031B00000F01F00607030BD21F0F000203002E010 -:1031C00021F0F00030302070EBE721F0F0004030CB -:1031D000F9E7F0B591B0022715460C4606463A4687 -:1031E000ADF80870082103AB07F04EFE04900028EC -:1031F00010D004208DF804008DF80170E034099699 -:1032000005948DF818500AA968460BF003F900B12F -:10321000FFDF012011B0F0BD2DE9F84F0646808A8E -:103220000C4680B28246FEF787F80546BA4F3078E2 -:10323000203F4FF005094FF000080F287CD2DFE84F -:1032400000F07BA39D082C5B6A7CBADAFC97489758 -:1032500097000121504609F0EBFB040000D1FFDF8D -:1032600097F85C00C00701D0386E0BE0032104F131 -:103270001D000CF08CFDD4F81D00A849B0FBF1F244 -:1032800001FB1200C4F81D0070686067B068A06799 -:103290002878252872D0FFDF70E00121504609F020 -:1032A000C7FB060000D1FFDF3078810702D52978FF -:1032B000252904D040F001003070BDE8F88F0220CD -:1032C0002070307F207106F11D002D36C4E9020602 -:1032D000F3E70121504609F0ABFB050000D1FFDF09 -:1032E0002878C10604D5072020703D356560E4E7E5 -:1032F00040F008002870E0E7E87FC00600D5FFDF57 -:10330000307CB28800F0010301B05046BDE8F04FB8 -:10331000082107F0EFBE05B9FFDF716821B1102267 -:1033200005F1240013F00EFF28212846FEF736F899 -:10333000307A85F82000C0E7F6E00121504609F018 -:1033400077FB050000D1FFDF022105F185000CF0BD -:103350001EFD0420207005F5B4706060B5F885008E -:1033600020826D4810387C356561C4E90270A4E79D -:103370000121504609F05CFB00B9FFDF32462946C7 -:103380005046BDE8F84F75E605B9FFDF28782128DB -:1033900093D93079012803D1E87F40F01000E87715 -:1033A000324629465046FFF765FE2846BDE8F84FED -:1033B0002321FDF7F3BF3279A28004F1080308212D -:1033C000504607F061FDE06010B184F8009074E7AA -:1033D00045460121504609F02BFB040000D1FFDFD8 -:1033E00004F1620102231022081F09F0C6F90570DA -:1033F0003179417061E70121504609F019FB040061 -:1034000000D1FFDF94F8840000F00300012857D1B9 -:10341000E87FC0F340021AB994F8A000C00729D091 -:10342000D4F8601129B394F88330087C63F38700E3 -:103430000874EB7F63F3410000E071E0D4F86011A1 -:103440000874D4F8601162F30000087492B1D4F8E3 -:103450006001102205F12401883413F073FE207EF0 -:1034600040F001002076207820F0010004F888095F -:1034700018E0BAB994F88800C00713D0D4F85C11EA -:1034800081B194F88330087C63F387000874EB7F84 -:10349000D4F85C1163F341000874D4F85C1162F352 -:1034A0000000087494F88800800709D594F87C001F -:1034B000D4F86421400804F17D011032FEF7A0F831 -:1034C0008DF8009094F884006A4600F003008DF8AF -:1034D000010094F888108DF8021094F8A0008DF87F -:1034E00003002946504601F03FF82878252805D0EA -:1034F000212807D0FFDF2878222803D92221284657 -:10350000FDF74CFF0121504609F0A4FA00283FF4D2 -:10351000DFAEFFDFD1E60000C401002040420F0013 -:10352000716881F80180C8E6FFDFC6E670B5FD4C22 -:10353000002584F85C5025660AF039FF04F110017B -:10354000204604F007FC84F8305070BD70B50D467D -:10355000FDF7F2FE040000D1FFDF4FF4B8712846FA -:1035600013F091FE2434012105F1E0002C610AF0F2 -:103570001FFF002800D0FFDF70BD0A46014602F1A0 -:10358000E0000AF035BF70B50546406886B00178A6 -:10359000092906D00C2933D00D292FD0FFDF06B022 -:1035A00070BD46883046FDF7C7FE040000D1FFDF3E -:1035B00020782128F3D028281BD1686802210C30FC -:1035C00000F09DFFA8B168680821001D00F097FF7A -:1035D00078B104F12401304608F0E1FA04F029FA48 -:1035E00000B1FFDF06B02046BDE870402921FDF79D -:1035F000D5BE06B0BDE8704004F0F3BB0121817177 -:10360000686886883046FDF797FE040000D1FFDF2A -:1036100020782128C3D06868817909B1807808B101 -:10362000FFDFBCE704F0DDFBE07FC10721D08007AE -:1036300005D594F8200000F01F00102817D00520B1 -:1036400084F823002078292815D02428A7D13146D2 -:1036500005200CF075FE22212046FDF79FFE01217A -:10366000304609F0F7F9002899D0FFDF97E70620E8 -:10367000E6E70420E4E70121304609F0D9F9050026 -:1036800000D1FFDF25212046FDF788FE03208DF8BD -:103690000000694605F1E0000AF0A1FE0228C0D052 -:1036A0000028BED0FFDF7AE72DE9F04788B09A46C0 -:1036B000164688468146FDF73FFE05003AD0287839 -:1036C000222837D3232835D0E87FC00632D40027FC -:1036D0000121484609F0ACF9040005D1012100227E -:1036E000484609F09CF90446694600F064FF0098DA -:1036F00000B9FFDF00983CB1E0340461287822284B -:1037000004D0242802D005E0076103E025212846E3 -:10371000FDF744FE009801214170C0F82490868096 -:10372000C0E9028A01A90AF075FE022802D0002829 -:1037300000D0FFDF08B011E570B586B00546FDF793 -:10374000FBFD0078222814D90121284609F070F9E0 -:1037500004002CD1FFDF2AE0B4F85E0004F1620619 -:1037600030440178427829B121462846FFF731FDDF -:10377000B0B914E7ADF804200821284602AB07F0E1 -:1037800083FB03900028F4D005208DF800006946E3 -:1037900004F1E0000AF023FE022801D000B1FFDFAF -:1037A00002231022314604F15E0009F01CF8B4F83F -:1037B00060000028D0D1F2E610B586B00446FDF7CF -:1037C000BBFD0078222811D90121204609F030F9EB -:1037D000040000D1FFDF06208DF80000694604F1E7 -:1037E000E0000AF0FCFD002800D0FFDF06B010BDAD -:1037F0002DE9F84F054600780C460027010904F131 -:10380000080090463E46BA46009002297ED007291D -:1038100002D00A2909D142E068680178092905D057 -:103820000C292CD00D292AD0FFDF73E114271C2688 -:10383000002C6CD04088A080FDF77EFD5FEA000977 -:1038400000D1FFDF99F8170009F118014008009A2C -:10385000FDF7D6FE68688089208269684868C4F8E8 -:1038600012008868C4F81600A07E20F0060040F020 -:103870000100A07699F81E0040F040014FE01A27A1 -:103880000A26002CD5D08088A080FDF755FD0500C4 -:1038900000D1FFDF28460099FFF76CFC3AE10CB13C -:1038A000A88BA080287A4FF0010B0B287ED006DC75 -:1038B00001287CD0022808D0032804D137E00D2845 -:1038C00076D00E2875D0FFDF24E11E270926002CB4 -:1038D000AFD0A088FDF730FD5FEA000900D1FFDF1F -:1038E000287B00F003000128207A1DD020F0010081 -:1038F0002072297B890861F341002072297BC90865 -:1039000061F382002072297B090901E0F7E0AEE053 -:1039100061F3C300207299F81E0040F0800189F81D -:103920001E10F7E0A401002040F00100E0E713279B -:103930000D26002CA6D0A088FDF7FEFC81460121B3 -:10394000A08809F075F8050000D1FFDF686F817865 -:1039500001F003010129217A50D021F001012172E7 -:1039600083789B0863F3410121728378DB0863F35A -:103970008201217283781B0963F3C30121720378EA -:1039800063F306112172437863F3C711217284F83F -:1039900009A0C178A1720279E17A62F30001E172B3 -:1039A0000279520862F34101E17203E029E067E025 -:1039B0004EE05FE00279920862F38201E1720279DF -:1039C000D20862F3C301E1724279217B62F3000104 -:1039D00021734279520862F34101217342799208BE -:1039E00062F3820121734079C00860F3C30121733F -:1039F00099F8000023282AD9262139E041F0010155 -:103A0000ADE71827102694B3A088FDF795FC009029 -:103A10000121A08809F00CF85FEA000900D1FFDF5E -:103A2000E868A06099F8000040F0040189F80010EF -:103A300099F80100800708D584F80CB00098007848 -:103A4000232867D92721009852E084F80CA061E070 -:103A500015270F265CB1A088FDF76EFC8146062273 -:103A6000E868009907F096F984F80EB086E042E025 -:103A700048463DE016270926ECB3287B207249E032 -:103A8000287B19270E26B4B3C4F808A0A4F80CA00C -:103A9000012807D0022808D003280CD004280AD017 -:103AA000FFDF15E084F808B001E002202072607AA0 -:103AB00020F003000BE0697B042801F00F0141F0C6 -:103AC00080012172F3D1607A20F00300401C607203 -:103AD000A088FDF731FC0546007821281AD023285C -:103AE00000D0FFDF0121A08808F0B4FF2221284682 -:103AF000FDF754FC0EE0FFE7A8F800600FE00CB102 -:103B00006888A080287A032822D0042809D00528B4 -:103B10003AD0FFDFA8F800600CB127806680002053 -:103B200009E415270F26002CE6D0A088FDF704FC39 -:103B30000121A08808F07CFF050000D1FFDFD5F847 -:103B40001D000622009907F025F984F80EA0E1E790 -:103B500017270926002CCFD0A088FDF7EDFB814662 -:103B60000121A08808F064FF050000D1FFDF68781C -:103B7000800701D5022000E00120207299F80000A2 -:103B80002328C7D9272173E719270E26002CB3D085 -:103B9000A088FDF7D1FB5FEA000900D1FFDFC4F880 -:103BA00008A0A4F80CA084F808A0A07A40F00300B4 -:103BB000A07299F81F1061F38200A07299F81F108B -:103BC000C1F34002114205D099F8201001F01F0105 -:103BD000102926D020F00800A07299F81F00410893 -:103BE000607A61F3C3006072697A01F00301012910 -:103BF00090D140F004006072E97A207B61F300000C -:103C00002073AA7A617B62F300016173EA7A520839 -:103C100062F341002073A87A400860F341016173A8 -:103C200078E740F00800D7E710B5F94C30B101460D -:103C3000102204F1200013F085FA012084F83000EE -:103C400010BD10B5044600F0A6FCF1492046102234 -:103C5000BDE81040203113F075BA70B5EC4D060088 -:103C60004FF0000412D00CF0B7FB08B110240BE0A9 -:103C70000621304607F075F8411C04D02866012063 -:103C800085F85C0000E00724204670BD0020F7E7BF -:103C9000007810F00F0204D0012A05D0022A0CD1BE -:103CA00010E0000909D10AE00009012807D0022824 -:103CB00005D0032803D0042801D0072070470870DE -:103CC000002070470620704705282AD2DFE800F060 -:103CD00003070F171F00087820F0FF001EE0087888 -:103CE00020F00F00401C20F0F000103016E00878A3 -:103CF00020F00F00401C20F0F00020300EE008788B -:103D000020F00F00401C20F0F000303006E0087872 -:103D100020F00F00401C20F0F00040300870002020 -:103D20007047072070472DE9F043804687B00D4665 -:103D30004FF0000908460CF09CFBA8B94046FDF77F -:103D4000FBFA060003D0307822280BD104E043F2BE -:103D5000020007B0BDE8F08335B1B07FC10601D4E1 -:103D6000000703D50820F4E71020F2E7F07FC00633 -:103D700001D50D20EDE700270121404608F058FE4F -:103D8000040006D101210022404608F048FE04004C -:103D900005D0694600F00FFC009818B901E0042036 -:103DA000D7E7FFDF00980221E0344170C0F824809B -:103DB0004461078101210171297801F00102017E2E -:103DC00062F3010101762A78520862F382010176DA -:103DD0002A78920862F3C30101762A78D20862F346 -:103DE0000411017624213046FDF7D8FA01A9009884 -:103DF0000AF010FB022801D000B1FFDF4846A8E717 -:103E00002DE9FF4F9046834A0D4699B09A4607CA5E -:103E100015AB4FF0000983E807001998FDF78CFAFD -:103E2000060006D03078262806D008201DB0BDE850 -:103E3000F08F43F20200F9E725B94046FFF7F6F8A4 -:103E40000028F3D10121199808F0F2FD040000D1F7 -:103E5000FFDF852D27D007DCEDB1812D1DD0822D10 -:103E60001DD0832D08D11CE0862D1ED0882D1ED09C -:103E7000892D1ED08A2D1ED00F2020710F281CD016 -:103E800003F0ACFFD8B101208DF82800201D0B9065 -:103E90002079B0B12EE10020EFE70120EDE702200C -:103EA000EBE70320E9E70520E7E70620E5E7082040 -:103EB000E3E70920E1E70A20DFE70720B6E7112062 -:103EC000B4E798F80000D4E91D754208F07F00219E -:103ED00062F30000F07798F80020920862F3410046 -:103EE000F07798F80000C209607862F341006070D2 -:103EF00098F800000209207862F34710207098F8C3 -:103F00000000C208607862F30000607098F8010059 -:103F1000607198F8000000F00102A87862F30100D7 -:103F2000A870F27F62F38200A870F27F520862F3F9 -:103F3000C300A870627862F30410A8702278C0F3FE -:103F4000C00052092A706278C2F340026A7098F881 -:103F50000220EA7069712971B978C1F3C001084083 -:103F60005FEA000B2ED050460CF036FA98BBDAF818 -:103F70000C000CF031FA70BBDAF81C000CF02CFAD3 -:103F800048BBDAF80C00A060DAF81C00E060797831 -:103F9000607801F0010140EA41006070B978C0B278 -:103FA000C1F30011891E084060700020207706F1DF -:103FB00017006061701CA061A87800F00300012860 -:103FC0000AD049E07978607801F00101FD2242EAE7 -:103FD00041010840E1E719E0B87800F0030001284A -:103FE0003AD12A1D691D404600F094FA28793979A2 -:103FF00008408DF84C0069797A7911408DF81810D5 -:10400000084329D050460CF0E7F928B110200DE7FD -:10401000A4010020D87501000AF1100004F5AE7368 -:1040200004F18C028DE80D00002113AB5A462046A6 -:10403000FFF73FF80028EAD104F5B07204F1A403B9 -:10404000CDF800A0CDE90132012106AB5A46204649 -:10405000FFF72FF80028DAD16078800722D4A878FB -:10406000B978C0F38000C1F3800108431AD02978E1 -:1040700015AA387832F811204300DA4002F003091B -:10408000B9F1030F01D14FF00209BBF1000F09D0C4 -:10409000012901D0042905D1012801D0042801D12A -:1040A0004FF00409F07F40F001006BF34100F0771E -:1040B000607881074FF003000CD5A071BBF1000FB1 -:1040C00018D100BF8DF8500014AA3146199800F09D -:1040D0004BFA0FE00221B9F1020F1AD0B9F1010F2A -:1040E00019D0B9F1040F22D00020A071F07F20F088 -:1040F0000100F07725213046FDF750F90AA904F1B7 -:10410000E0000AF06CF910B1022800D0FFDF0020B7 -:104110008CE6A171D6E7A1710D2104F1200013F006 -:10412000B2F8207840F0020020700420CAE7012095 -:10413000A071DFE72DE9F04387B090468946044639 -:104140000025FDF7F9F8070004D03878272804D0B7 -:104150000820FEE543F20200FBE50121204608F0BD -:1041600067FC040000D1FFDFA6795FEA090005D0F3 -:10417000012821D0B9F1020F26D110E0B8F1000FCB -:1041800022D1012E05D0022E05D0032E05D0FFDF4F -:104190002DE00C252BE0012529E0022527E04046F3 -:1041A0000CF01AF9B0B9032E0ED11022414604F1D9 -:1041B0001D0012F0C7FF1AE0012E02D0022E03D11B -:1041C00004E0B8F1000F12D00720C2E540460CF021 -:1041D00003F908B11020BCE5102104F11D0013F013 -:1041E00030F80621404606F0BCFDC4F81D002078DA -:1041F000252140F0020020703846FDF7CFF82078E6 -:10420000C10713D020F00100207002208DF80000BB -:1042100004F11D0002908DF804506946C3300AF085 -:10422000DEF8022803D010B1FFDF00E02577002080 -:104230008FE530B587B00D460446FDF77DF860B1D7 -:104240000121204608F0F4FB04000CD028460CF0B5 -:10425000C3F828B1102007B030BD43F20200FAE7DE -:104260002078400701D40820F5E7294604F13D00F5 -:104270002022054612F066FF207840F010002070E2 -:1042800001070FD520F00800207007208DF80000EE -:10429000694604F1E00001950AF0A1F8022801D076 -:1042A00000B1FFDF0020D6E770B50D460646FDF7EA -:1042B00043F818B10078272817D102E043F2020032 -:1042C00070BD0121304608F0B3FB040000D1FFDFD0 -:1042D000A079022809D16078C00706D02A46214675 -:1042E0003046FEF776FF10B10FE0082070BDB4F83D -:1042F00060000E280BD204F1620102231022081F75 -:1043000008F03BFA012101704570002070BD1120BA -:1043100070BD70B5064614460D4608460CF05CF8B4 -:1043200018B920460CF07EF808B1102070BDA6F533 -:104330007F40FF380ED03046FCF7FEFF38B14178A1 -:1043400022464B08811C1846FDF75AF907E043F254 -:10435000020070BD2046FDF751FD0028F9D1102163 -:10436000E01D0BF014FDE21D294604F1170000F0DA -:1043700032F9002070BD2DE9F04104468AB015469F -:104380000E46002708460CF074F818B928460CF0C1 -:1043900070F818B110200AB0BDE8F0812046FCF793 -:1043A000CBFF5FEA000804D098F80000272810D15E -:1043B00002E043F20200EEE70121204608F038FB5C -:1043C000040000D1FFDF2078400702D56078800725 -:1043D00001D40820DFE7D4E91D01497801B18DB18E -:1043E000407800B176B1ADB1EA1D06A8E16800F0F1 -:1043F000F2F8102206A905F1170012F077FE18B1A5 -:10440000042707E00720C6E71022E91D04F12D006C -:1044100012F098FE2EB11022F11D04F11D0012F0D1 -:1044200091FE2078252140F0020020704046FCF7E4 -:10443000B5FF2078C10715D020F0010020700220C0 -:104440008DF8000004F11D000290103003908DF8EB -:1044500004706946B33009F0C2FF022803D010B1DE -:10446000FFDF00E02777002095E770B50D46064690 -:104470000BB1072070BDFCF75FFF040007D0207868 -:10448000222802D3A07F400604D4082070BD43F246 -:10449000020070BDA5B12946304607F080FB03F04D -:1044A000C8FA297C4A08E17F62F30001E1772A7C9F -:1044B00062F34101E177297C890884F8201004E047 -:1044C000304607F08FFB03F0B4FAA17F21F04001E2 -:1044D000A17770BD70B50D46FCF72EFF040005D026 -:1044E00028460BF09FFF20B1102070BD43F2020060 -:1044F00070BD29462046FEF73DFE002070BD04E059 -:1045000010F8012B0AB100207047491E89B2F7D27A -:104510000120704710B5C4780B7864F300030B706A -:10452000C478640864F341030B70C478A40864F38E -:1045300082030B70C478E40864F3C3030B7003793F -:10454000117863F30001117003795B0863F3410193 -:10455000117003799B0863F3820111700079C00820 -:1045600060F3C301117010BD70B51546064603F027 -:1045700035FC040000D1FFDF207820F00F00801C04 -:1045800020F0F0002030207066802868A060BDE830 -:10459000704003F026BC10B5134C94F8300000288E -:1045A00008D104F12001A1F1100009F05AFF012007 -:1045B00084F8300010BD10B190F8B9202AB10A4833 -:1045C00090F8350018B1002003E0B83001E006484B -:1045D00034300860704708B50023009313460A463C -:1045E00008F021FC08BD0000A4010020F0B5007B0C -:1045F000059F1E4614460D46012800D0FFDF0C2003 -:1046000030803A203880002C08D0287A032806D041 -:10461000287B012800D0FFDF17206081F0BDA8892A -:10462000FBE72DE9F04786B0144691F80C900E9AFE -:104630000D46B9F1010F0BD01021007B2E8A884660 -:10464000052807D0062833D0FFDF06B0BDE8F08785 -:104650000221F2E7E8890C2100EB400001EB400069 -:10466000188033201080002CEFD0E889608100276B -:104670001AE00096688808F1020301AA696900F04F -:1046800085FF06EB0800801C07EB470186B204EBB0 -:104690004102BDF8040090810DF1060140460E3242 -:1046A00009F048FF7F1CBFB26089B842E1D8CCE76F -:1046B00034201080E889B9F1010F11D0122148434C -:1046C0000E301880002CC0D0E88960814846B9F1CE -:1046D000010F00D00220207300270DF1040A1FE013 -:1046E0000621ECE70096688808F1020301AA6969CF -:1046F00000F04CFF06EB0800801C86B2B9F1010FF8 -:1047000012D007EBC70004EB4000BDF80410C181D4 -:1047100010220AF10201103012F014FD7F1CBFB20A -:104720006089B842DED890E707EB470104EB41020D -:10473000BDF80400D0810AF102014046103209F0B0 -:10474000F9FEEBE72DE9F0470E4688B090F80CC073 -:1047500096F80C80378AF5890C20109902F10C0428 -:104760004FF0000ABCF1030F08D0BCF1040F3ED09B -:10477000BCF1070F7DD0FFDF08B067E705EB850CC4 -:1047800000EB4C00188031200880002AF4D0A8F1FA -:10479000060000F0FF09558125E0182101A812F05C -:1047A00072FD00977088434601AA716900F0EEFE21 -:1047B000BDF804002080BDF80600E080BDF80800C8 -:1047C0002081A21C0DF10A01484609F0B3FEB9F19F -:1047D000000F00D018B184F804A0A4F802A007EBE1 -:1047E000080087B20A346D1EADB2D6D2C4E705EB1D -:1047F000850C00EB4C00188032200880002ABBD0CA -:10480000A8F1050000F0FF09558137E00097708896 -:10481000434601AA716900F0B9FE9DF80600BDF893 -:104820000410E1802179420860F3000162F3410144 -:10483000820862F38201C20862F3C301020962F3D3 -:104840000411420962F34511820962F38611217154 -:10485000C0096071BDF80700208122460DF10901F1 -:10486000484609F067FE18B184F802A0A4F800A039 -:1048700000E007E007EB080087B20A346D1EADB216 -:10488000C4D279E7A8F1020084B205FB08F000F178 -:104890000E0CA3F800C035230B80002AA6D055814A -:1048A0009481009783B270880E32716900F06EFEB9 -:1048B00062E72DE9F84F1E460A9D0C4681462AB153 -:1048C000607A00F58070D080E089108199F80C0042 -:1048D0000C274FF000084FF00E0A0D2873D2DFE8C6 -:1048E00000F09E070E1C28303846556A737373001B -:1048F000214648460095FFF779FEBDE8F88F207BFA -:104900009146082802D0032800D0FFDF37803020EE -:104910000AE000BFA9F80A80EFE7207B914604284F -:1049200000D0FFDF378031202880B9F1000FF1D1AE -:10493000E3E7207B9146042800D0FFDF3780322058 -:10494000F2E7207B9146022800D0FFDF378033203A -:10495000EAE7207B1746022800D0FFDF3420A6F8C4 -:1049600000A02880002FC8D0A7F80A80C5E7207BC8 -:104970001746042800D0FFDF3520A6F800A02880C5 -:10498000002FBAD04046A7F80A8012E0207B1746D5 -:10499000052802D0062800D0FFDF10203080362006 -:1049A0002880002FA9D0E0897881A7F80E80B9F877 -:1049B0000E00B881A1E7207B9146072800D0FFDFD9 -:1049C00037803720B0E72AE04FF0120018804FF010 -:1049D00038001700288090D0E0897881A7F80E80F1 -:1049E000A7F8108099F80C000A2805D00B2809D0E8 -:1049F0000C280DD0FFDF80E7207B0A2800D0FFDFE6 -:104A000001200AE0207B0B2800D0FFDF042004E017 -:104A1000207B0C2800D0FFDF052038736DE7FFDF17 -:104A20006BE770B50C460546FCF786FC20B10078B4 -:104A3000222804D2082070BD43F2020070BD052177 -:104A4000284607F0F5FF206008B1002070BD032064 -:104A500070BD30B44880087820F00F00C01C20F0F2 -:104A6000F000903001F8080B1DCA81E81D0030BC31 -:104A700003F0B7B92DE9FF4784B0002782460297BB -:104A8000079890468946123004F0D8F8401D20F06F -:104A90000306079828B907A95046FFF7C2FF002868 -:104AA00053D1B9F1000F05D00798017B19BB05253B -:104AB00004681BE098F80000092803D00D2812D0E4 -:104AC000FFDF45E0079903254868B0B3497B42887A -:104AD0007143914238D98AB2B3B2011D07F039FE51 -:104AE0000446078002E0079C042508340CB12088A6 -:104AF00010B1032D28D02BE007980121123004F0CB -:104B0000CFF8ADF80C00024602AB2946504606F03D -:104B1000BBF9070001D1A01C029007983A46123059 -:104B2000C8F80400A8F802A003A94046029B04F0BC -:104B3000C4F8C0B1072814D200E005E0DFE800F0B7 -:104B4000060811110F0A0C00132015E6002013E6C9 -:104B5000112011E608200FE643F203000CE60720BF -:104B60000AE6032008E6BDF80C002346CDE90070F4 -:104B70002A465046079900F019FD57B9032D08D170 -:104B80000798B3B2417B406871438AB2011D07F0B8 -:104B9000F4FDB9F1000FD9D0079981F80C90D5E751 -:104BA0002DE9FE4F91461A881C468A468046FAB186 -:104BB00002AB494606F068F9050019D04046A61C2C -:104BC000278808F079F83246072629463B460096A2 -:104BD00007F0A5FC20882346CDE900504A465146FF -:104BE000404600F0E3FC002020800120BDE8FE8F5D -:104BF0000020FBE710B586B01C46AAB104238DF84F -:104C000000301388ADF808305288ADF80A208A7851 -:104C10008DF80E200988ADF80C1000236A46214655 -:104C2000FFF728FF06B010BD1020FBE770B50D465A -:104C3000052107F0FDFE040000D1FFDF294604F145 -:104C40001200BDE8704004F014B82DE9F8430D4699 -:104C50008046002603F0C2F804462878102878D24F -:104C6000DFE800F0773B3453313112313131083114 -:104C7000313131312879001FC0B2022801D010280B -:104C800010D114BBFFDF35E004B9FFDF052140463A -:104C900007F0CEFE007B032806D004280BD007289F -:104CA00028D0FFDF072655E02879801FC0B20228F0 -:104CB00020D050B1F6E72879401FC0B2022819D0A1 -:104CC000102817D0EEE704B9FFDF13E004B9FFDFC7 -:104CD000287901280ED1172137E00521404607F039 -:104CE000A7FE070000D1FFDF07F11201404603F0E5 -:104CF0009DFF2CB12A4621464046FFF7AAFE29E037 -:104D000013214046FDF7B3FB24E004B9FFDF052182 -:104D1000404607F08DFE060000D1FFDF694606F130 -:104D2000120003F08DFF060000D0FFDFA9881729CD -:104D300001D2172200E00A46BDF80000824202D9E3 -:104D4000014602E005E01729C5D3404600F03EFCCD -:104D5000D0E7FFDF3046BDE8F883401D20F00302B6 -:104D600019B102FB01F0001D00E000201044704763 -:104D700013B5009850B100244FEA0D0007F093FCE2 -:104D8000002C02D1F74A009911601CBD01240020BB -:104D9000F4E72DE9F0470C4615462421204612F091 -:104DA00072FA05B9FFDFA87860732888DFF8B4A32A -:104DB000401D20F00301AF788946DAF8000007F0C3 -:104DC00090FC060000D1FFDF4FF000082660A6F837 -:104DD000008077B109FB07F1091D0AD0DAF800005D -:104DE00007F07FFC060000D1FFDF6660C6F8008098 -:104DF00001E0C4F80480298804F11200BDE8F047FE -:104E000003F006BF2DE9F047804601F112000D4680 -:104E1000814603F013FF401DD24F20F003026E7B4A -:104E200014462968386807F087FC3EB104FB06F297 -:104E3000121D03D06968386807F07EFC052007F072 -:104E4000A3FD0446052007F0A7FD201A012802D182 -:104E5000386807F03BFC49464046BDE8F04703F0A0 -:104E6000ECBE70B50546052107F0E2FD040000D157 -:104E7000FFDF04F112012846BDE8704003F0D6BE02 -:104E80002DE9F04F91B04FF0000BADF834B0ADF814 -:104E900004B047880C46054692460521384607F07F -:104EA000C7FD060000D1FFDF24B1A780A4F806B03B -:104EB000A4F808B0297809220B20B2EB111F7DD18C -:104EC0002A7A04F1100138274FF00C084FF001093D -:104ED0000391102A73D2DFE802F072F2F1F07F083A -:104EE000D2888D9F3DDBF3EEB6B6307B022800D032 -:104EF000FFDFA88908EBC001ADF804103021ADF840 -:104F00003410002C25D06081B5F80E9000271DE0EC -:104F100004EBC708317C88F80E10F189A8F80C1052 -:104F2000CDF800906888042304AA296900F02EFBBC -:104F3000BDF81010A8F8101009F10400BDF8121007 -:104F40007F1C1FFA80F9A8F81210BFB26089B8421E -:104F5000DED80DE1307B022800D0FFDFE98908EBC5 -:104F6000C100ADF804003020ADF83400287B0A9071 -:104F7000001FC0B20F90002CEBD06181B5F81090EB -:104F8000002725E0CDF800906888696903AA0A9B8C -:104F900000F0FCFA0A9804EBC70848441FFA80F9AD -:104FA00008F10C0204A90F9809F0C4FA18B188F8A6 -:104FB0000EB0A8F80CB0BDF80C1001E0D4E0CFE0C2 -:104FC000A8F81010BDF80E107F1CA8F81210BFB280 -:104FD0006089B842D6D8CBE00DA8009001AB22463C -:104FE00029463046FFF71DFBC2E0307B082805D07C -:104FF000FFDF03E0307B082800D0FFDFE8891030B6 -:10500000ADF804003620ADF83400002C3FD0A9895B -:105010006181F189A18127E0307B092800D0FFDF81 -:10502000A88900F10C01ADF804103721ADF8341057 -:10503000002C2CD06081E8890090AB89688804F14D -:105040000C02296956E0E8893921103080B2ADF8A8 -:105050000400ADF83410002C74D0A9896181287A3D -:105060000E280AD002212173E989E181288A009063 -:10507000EB8968886969039A3CE00121F3E70DA890 -:10508000009001AB224629463046FFF75BFB6FE0FC -:10509000307B0A2800D0FFDF1220ADF80400ADF805 -:1050A00034704CB3A9896181A4F810B0A4F80EB093 -:1050B00084F80C905CE020E002E031E039E042E06E -:1050C000307B0B2800D0FFDF288AADF83470123017 -:1050D000ADF8040084B104212173A9896181E989B3 -:1050E000E181298A2182688A00902B8A688804F1EC -:1050F0001202696900F04AFA3AE0307B0C2800D0CD -:10510000FFDF1220ADF80400ADF834703CB3052188 -:105110002173A4F80AB0A4F80EB0A4F810B027E0E8 -:105120000DA8009001AB224629463046FFF75EFAF3 -:105130001EE00DA8009001AB224629463046FFF73D -:10514000B8FB15E036E03B21ADF80400ADF83410B3 -:1051500084B3A4F80690A4F808B084F80AB007E075 -:10516000FFDF05E010000020297A012919D0FFDFB8 -:10517000BDF80400AAF800007CB1BDF8340020801E -:10518000BDF804006080BDF83400392805D03B2804 -:1051900003D03C2801D086F80CB011B00020BDE847 -:1051A000F08F3C21ADF80400ADF8341014B1697AE9 -:1051B000A172DDE7FFE7AAF80000EEE72DE9F8436A -:1051C00056880F46804615460521304607F030FCCC -:1051D000040000D1FFDF123400943B4641463046C4 -:1051E0006A6803F09CFEB6E570B50D46052107F030 -:1051F0001FFC040000D1FFDF294604F11200BDE8C6 -:10520000704003F028BD70B50D46052107F010FC75 -:10521000040000D1FFDF294604F11200BDE8704010 -:1052200003F046BD70B50546052107F001FC0400FA -:1052300000D1FFDF04F1080321462846BDE8704095 -:105240000422ADE470B50546052107F0F1FB04002A -:1052500000D1FFDF214628462368BDE870400522C3 -:105260009EE470B50646052107F0E2FB040000D17C -:10527000FFDF04F1120003F0E1FC401D20F0030504 -:1052800011E0011D00880322431821463046FFF734 -:1052900087FC00280BD0607BABB2684382B26068A9 -:1052A000011D07F0A0FA606841880029E9D170BDAE -:1052B00070B50E46054602F091FD040000D1FFDFF7 -:1052C0000120207266726580207820F00F00C01CDB -:1052D00020F0F00030302070BDE8704002F081BD59 -:1052E0002DE9F0438BB00D461446814606A9FFF721 -:1052F00098FB002814D14FF6FF7601274FF4205871 -:105300008CB103208DF800001020ADF8100007A824 -:10531000059007AA204604A909F02BF978B10720C7 -:105320000BB0BDE8F0830820ADF808508DF80E7082 -:105330008DF80000ADF80A60ADF80C800CE006981E -:10534000A17801742188C1818DF80E70ADF80850E4 -:10535000ADF80C80ADF80A606A4602214846069B0B -:10536000FFF788FBDCE708B501228DF8022042F642 -:105370000202ADF800200A4603236946FFF73AFC13 -:1053800008BD08B501228DF8022042F60302ADF8EF -:1053900000200A4604236946FFF72CFC08BD00B52F -:1053A00087B079B102228DF800200A88ADF8082074 -:1053B0004988ADF80A1000236A460521FFF75AFB19 -:1053C00007B000BD1020FBE709B1072312E4072056 -:1053D000704770B588B00D461446064606A9FFF71B -:1053E00020FB00280ED17CB10620ADF808508DF8C6 -:1053F0000000ADF80A40069B6A460821DC81304671 -:10540000FFF738FB08B070BD05208DF80000ADF83F -:105410000850F0E700B587B059B107238DF8003088 -:10542000ADF80820039100236A460921FFF722FB0B -:10543000C6E71020C4E770B588B00C4606460025C4 -:1054400006A9FFF7EEFA0028DCD1069801211230F8 -:1054500003F026FC9CB12178062921D2DFE801F077 -:10546000200505160318801E80B2C01EE28880B297 -:105470000AB1A3681BB1824203D90C20C2E71020F5 -:10548000C0E7042904D0A08850B901E00620B9E79C -:10549000012913D0022905D004291CD005292AD0BE -:1054A0000720AFE709208DF800006088ADF80800FC -:1054B000E088ADF80A00A068039023E00A208DF888 -:1054C00000006088ADF80800E088ADF80A00A06828 -:1054D0000A25039016E00B208DF800006088ADF8D7 -:1054E0000800A088ADF80A00E088ADF80C00A068BC -:1054F0000B25049006E00C208DF8000060788DF8F4 -:1055000008000C256A4629463046069BFFF7B2FA8A -:1055100078E700B587B00D228DF80020ADF80810AF -:1055200000236A461946FFF7A5FA49E700B587B098 -:1055300071B102228DF800200A88ADF80820498850 -:10554000ADF80A1000236A460621FFF793FA37E701 -:10555000102035E770B586B0064601200D46ADF83F -:1055600008108DF80000014600236A463046FFF718 -:1055700081FA040008D12946304601F0BDFA002125 -:10558000304601F0D7FA204606B070BDF8B51C468B -:1055900015460E46069F07F07DFB2346FF1DBCB255 -:1055A00031462A46009406F086FFF8BD30B4114615 -:1055B000DDE902423CB1032903D0002330BC05F0F1 -:1055C00099BD0123FAE71A8030BC704770B50C46CC -:1055D0000546FFF72BFB2146284601F09CFA28469A -:1055E000BDE87040012101F0A5BA000018B1817832 -:1055F000012938D101E010207047018842F60112DC -:10560000881A914231D018DC42F60102A1EB020067 -:1056100091422AD00CDC41B3B1F5C05F25D06FF4C4 -:10562000C050081821D0A0F57060FF381BD11CE0D5 -:1056300001281AD002280AD117E0B0F5807F14D0D3 -:1056400008DC012811D002280FD003280DD0FF2834 -:1056500009D10AE0B0F5817F07D0A0F5807003384A -:1056600003D0012801D0002070470F2070470A287E -:105670001ED007DC18D2DFE800F0191B1F1F171F10 -:10568000231D1F21102815D008DC0B2812D00C2850 -:1056900010D00D2816D00F2806D10DE011280BD000 -:1056A00084280BD087280FD0032070470020704734 -:1056B00005207047072070470F207047042070476F -:1056C000062070470C20704743F20200704738B53F -:1056D0000C46050041D06946FEF7DAFA002819D1D8 -:1056E0009DF80010607861F3020060706946681CE4 -:1056F000FEF7CEFA00280DD19DF80010607861F316 -:10570000C5006070A978C1F34101012903D00229C5 -:1057100005D0072038BD217821F0200102E0217852 -:1057200041F020012170410704D0A978C90861F334 -:1057300086106070607810F0380F07D0A9780909DA -:1057400061F3C710607010F0380F02D16078400626 -:1057500003D5207840F040002070002038BD70B59F -:1057600004460020088015466068FFF7B0FF002857 -:1057700016D12089A189884211D860688078C00735 -:105780000AD0B1F5007F0AD840F20120B1FBF0F257 -:1057900000FB1210288007E0B1F5FF7F01D90C2033 -:1057A00070BD01F201212980002070BD10B5047880 -:1057B000137864F3000313700478640864F34103FE -:1057C00013700478A40864F3820313700478E40867 -:1057D00064F3C30313700478240964F3041313708F -:1057E0000478640964F3451313700078800960F34A -:1057F0008613137031B10878C10701D1800701D534 -:10580000012000E0002060F3C713137010BD427840 -:10581000530702D002F0070306E012F0380F02D05F -:10582000C2F3C20300E001234A7863F302024A7024 -:10583000407810F0380F02D0C0F3C20005E04307F3 -:1058400002D000F0070000E0012060F3C5024A70BA -:1058500070472DE9F04F95B00D00824612D012210D -:10586000284611F0EEFC4FF6FF7B05AA01215846B1 -:1058700005F0B7F80024264637464FF420586FF459 -:10588000205972E0102015B0BDE8F08F9DF81E0081 -:1058900001280AD1BDF81C1041450BD011EB0900BD -:1058A0000AD001280CD002280CD0042C0ED0052CD4 -:1058B0000FD10DE0012400E00224BDF81A6008E0D9 -:1058C000032406E00424BDF81A7002E0052400E079 -:1058D0000624BDF81A10514547D12C74BEB34FF0C1 -:1058E000000810AA4FF0070ACDE90282CDE900A80E -:1058F0000DF13C091023CDF8109042463146584630 -:1059000005F022F908BBBDF83C002A46C0B210A938 -:1059100008F010FEC8B9AE81CFB1CDE900A80DF1F5 -:10592000080C0AAE40468CE8410213230022394697 -:10593000584605F009F940B9BDF83C00F11CC01EFD -:10594000C0B22A1D08F0F6FD10B103209BE70AE063 -:10595000BDF82900E881062C05D19DF81E00A8722B -:10596000BDF81C00288100208DE705A805F045F84A -:1059700000288BD0FFF77BFE85E72DE9F0471C461A -:10598000DDE90978DDF8209015460E00824600D149 -:10599000FFDF0CB1208818B1D5B11120BDE8F08728 -:1059A000022D01D0012100E0002106F1140003F0D6 -:1059B00009FFA8F8000002463B462946504605F07C -:1059C00063FAC9F8000008B9A41C3C600020E5E7B0 -:1059D0001320E3E7F0B41446DDE904528DB100234F -:1059E00014B1022C09D101E0012306E00D7CEE0781 -:1059F00003D025F0010501230D742146F0BC05F00C -:105A000079BB1A80F0BC70472DE9FE4F91461A8889 -:105A10001C468A468046FAB102AB494605F034FA84 -:105A2000050019D04046A61C278807F045F93246E4 -:105A3000072629463B46009606F071FD208823463E -:105A4000CDE900504A4651464046FFF7C3FF0020CB -:105A500020800120BDE8FE8F0020FBE72DE9F04704 -:105A600086B09146DDE90E460F46824603AA05A997 -:105A700004A8109D8DE807009846324621465046FE -:105A8000FFF77BFF049909B1012200E000222A7090 -:105A9000002817D1F84A03AB1060059A009104F171 -:105AA0001400CDE901204A463946504604F041FA37 -:105AB00090B108280ED2DFE800F00407040D0D09AC -:105AC0000B0B002006B069E71120FBE70720F9E780 -:105AD0000820F7E70320F5E7BDF80C100498CDE99E -:105AE00000014346324621465046FFF773FFE8E780 -:105AF0002DE9F04389B00D46DDE9108781461C464B -:105B00001646142103A811F0BEFB012002218DF8D6 -:105B100010108DF80C008DF81170ADF8146064B1A0 -:105B2000A278D20709D08DF81600E088ADF81A00E7 -:105B3000A088ADF81800A068079008A80095CDE9E6 -:105B40000110424603A948466B68FFF787FF09B07A -:105B5000BDE8F083F0B58BB00024064606940794A8 -:105B60000727089405A80994019400970294CDE9A9 -:105B700003400D4610232246304604F0E5FF78B975 -:105B80000AA806A9019400970294CDE90310BDF874 -:105B9000143000222946304604F0ACFD002801D024 -:105BA000FFF765FD0BB0F0BD04F04CBC2DE9FC41E6 -:105BB0000C468046002602F011F9054620780D2893 -:105BC0007ED2DFE800F0BC0713B325BD49496383EB -:105BD000AF959B00A848006820B1417841F01001C2 -:105BE0004170ADE0404602F029F9A9E004214046A9 -:105BF00006F01EFF070000D1FFDF07F11401404649 -:105C000003F074FDA5BB13214046FCF730FC97E080 -:105C10000421404606F00CFF070000D1FFDFE088BA -:105C2000ADF800000020B8819DF80000010704D500 -:105C3000C00602D5A088B88105E09DF801004006A5 -:105C40007ED5A088F88105B9FFDF22462946404667 -:105C500001F066FC022673E0E188ADF800109DF8C3 -:105C6000011009060FD5072803D006280AD00AE03C -:105C700024E00421404606F0DBFE060000D1FFDFF1 -:105C8000A088F0810226CDB9FFDF17E0042140464D -:105C900006F0CEFE070000D1FFDF07F1140004F08C -:105CA00008FC90F0010F02D1E079000648D5387C5D -:105CB000022640F00200387405B9FFDF224600E0FA -:105CC0003DE02946404601F02BFC39E004214046E6 -:105CD00006F0AEFE017C002D01F00206C1F340018A -:105CE0006171017C21F002010174E7D1FFDFE5E77A -:105CF00002260121404602F0D3F821E0042140466B -:105D000006F096FE0546606800902089ADF8040014 -:105D100001226946404602F0E4F8287C20F00200A7 -:105D200028740DE0002DC9D1FFDFC7E7022600214E -:105D30004046FFF768FA002DC0D1FFDFBEE7FFDF66 -:105D40003046BDE8FC813EB50C0009D001466B46EB -:105D500001AA002004F07AFF20B1FFF788FC3EBDC5 -:105D600010203EBD00202080A0709DF8050002A9F3 -:105D700000F00700FDF7A8FF50B99DF8080020705B -:105D80009DF8050002A9C0F3C200FDF79DFF08B110 -:105D900003203EBD9DF8080060709DF80500C10914 -:105DA000A07861F30410A0709DF80510890961F3D3 -:105DB000C300A0709DF80410890601D5022100E0FF -:105DC000012161F342009DF8001061F30000A07012 -:105DD00000203EBD70B5144606460D4651EA04004B -:105DE00005D075B108460AF03BFB78B901E0072001 -:105DF00070BD2946304604F08AFF10B1BDE87040FE -:105E000035E454B120460AF02BFB08B1102070BDD8 -:105E100021463046BDE8704095E7002070BD2DE971 -:105E2000FC5F0C4690460546002701780822007A60 -:105E30003E46B2EB111F7DD104F10A0100910A31F7 -:105E4000821E4FF0020A04F1080B0191092A72D256 -:105E5000DFE802F0EDE005F528287BAACE0068888F -:105E6000042106F0E5FD060000D1FFDFB08928B16E -:105E700052270726C3E00000080200205127102601 -:105E8000002C7DD06888A0800120A071A889002204 -:105E90000099FFF79FFF002873D1A8892081288AE5 -:105EA000E081D1E0B5F81290072824D1E87B000604 -:105EB00021D5512709F1140086B2002CE1D0A88920 -:105EC00000220099FFF786FF00285AD16888A08039 -:105ED00084F806A0A88920810120A073288A208246 -:105EE000A4F81290A88A009068884B46A969019A84 -:105EF00001F0F3FAA8E0502709F1120086B2002C55 -:105F00003ED0A88900225946FFF764FF002838D107 -:105F10006888A080A889E080287A072813D002200A -:105F20002073288AE081E87BC0096073A4F8109090 -:105F3000A88A01E085E082E0009068884B4604F181 -:105F40001202A969D4E70120EAE7B5F812905127B7 -:105F500009F1140086B2002C66D06888042106F08E -:105F600067FD83466888A080A88900220099FFF712 -:105F700031FF00286ED184F806A0A889208101E0B5 -:105F800052E067E00420A073288A2082A4F81290CF -:105F9000A88A009068884B46A969019A01F09DFA89 -:105FA000A989ABF80E104FE06888FBF7C5F90746E2 -:105FB0006888042106F03CFD064607B9FFDF06B9F4 -:105FC000FFDF687BC00702D05127142601E050276D -:105FD00012264CB36888A080502F06D084F806A003 -:105FE000287B594601F089FA2EE0287BA11DF9E7AC -:105FF000FE49A8894989814205D1542706269CB1CA -:106000006888A08020E053270BE06888A080A889DA -:10601000E08019E06888042106F00AFD00B9FFDF7E -:1060200055270826002CF0D1A8F8006011E056276B -:106030000726002CF8D06888A080002013E0FFDF3E -:1060400002E0012808D0FFDFA8F800600CB127802B -:1060500066800020BDE8FC9F57270726002CE3D070 -:106060006888A080687AA071EEE7401D20F00300E8 -:1060700009B14143091D01EB4000704713B5DB4AEC -:1060800000201071009848B10024684606F00BFB10 -:10609000002C02D1D64A009911601CBD01240020B9 -:1060A000F4E770B50D46064686B014465C212846D6 -:1060B00011F0E9F804B9FFDFA0786874A2782188AC -:1060C000284601F044FA0020A881E881228805F1E1 -:1060D0001401304603F0EFFA6A460121304604F01D -:1060E00080FC19E09DF80300000715D5BDF80610E7 -:1060F0003046FFF72FFD9DF80300BDF8061040F075 -:1061000010008DF80300BDF80300ADF81400FF2364 -:106110003046059A04F0C6FD684604F06EFC00287F -:10612000E0D006B070BD10B50C4601F1140003F0CC -:10613000F9FA0146627C2046BDE8104001F03CBA05 -:1061400070B50546042106F073FC040000D1FFDFA2 -:1061500004F114010C46284603F0C8FA21462846EB -:10616000BDE8704003F0C9BA70B58AB00C46064667 -:10617000FBF7E2F8050014D02878222827D30CB1C9 -:10618000A08890B101208DF80C0003208DF810003C -:1061900000208DF8110054B1A088ADF818002068D7 -:1061A00007E043F202000AB070BD0920FBE7ADF83A -:1061B000180005900421304606F03AFC040000D196 -:1061C000FFDF04F1140003F0C4FA000701D4082033 -:1061D000E9E701F003FE60B108A802210094CDE9CF -:1061E000011095F8232003A930466368FFF736FCB9 -:1061F000D9E71120D7E72DE9F04FB2F802A0834686 -:1062000089B0154689465046FBF796F807460421A3 -:10621000504606F00DFC0026044605964FF0020895 -:106220000696ADF81C6007B9FFDF04B9FFDF4146F1 -:10623000504605F0DEF860B907AA06A905A88DE862 -:1062400007004246214650466368FFF796FB00B1BF -:10625000FFDF664807AB0660DDE9051204F11400B4 -:10626000CDF80090CDE90320CDE9013197F8232046 -:10627000594650466B6803F0B5FA06000AD0022E64 -:1062800004D0032E14D0042E00D0FFDF09B0304616 -:10629000BDE8F08FBDF81C000028F7D00599CDE9C6 -:1062A00000104246214650466368FFF793FBEDE736 -:1062B000687840F008006870E8E72DE9F04F9BB07F -:1062C00004464FF000084948ADF85480ADF83080DE -:1062D000ADF85080A0F80880ADF81480ADF81880B3 -:1062E000ADF82080ADF81C80007916460D46474673 -:1062F000012808D0022806D0032804D0042802D0A0 -:1063000008201BB0C4E720460AF066F8D0BB284638 -:106310000AF062F8B0BB60680AF0ABF890BB606846 -:1063200048B160892189884202D8B1F5007F01D93E -:106330000C20E6E780460BAA06A92846FFF70FFACD -:106340000028DED168688078C0F34100022808D1B7 -:106350009DF8190010F0380F03D028690AF080F872 -:1063600080B905A92069FFF7B2F90028C9D12069D1 -:1063700050B1607880079DF8150000F0380002D514 -:10638000C0B301E011E0A8BB9DF8140080060ED553 -:106390009DF8150010F0380F03D060680AF060F81F -:1063A00018B960680AF065F808B11020A9E707A9D4 -:1063B0006069FFF78CF90028A3D1606940B19DF8AE -:1063C0001D0000F0070101293FD110F0380F3CD02B -:1063D00008A9A069FFF77BF9002892D19DF81C005D -:1063E000800632D49DF82000800604E008020020D8 -:1063F0001400002029E028D4A06940B19DF82100B4 -:1064000000F00701012920D110F0380F1DD0E068FD -:1064100018B10078C8B11C2817D20EAA611C2046FA -:10642000FFF7C4F90120B94660F30F27BA460746C3 -:106430008DF84E0042F60300ADF84C000DF13B0222 -:1064400017A9286808F095F808B1072059E79DF8C2 -:106450005C0016A9CDF80090C01CCDE9019100F0B8 -:10646000FF0B00230BF20122514613A804F0FCF9A4 -:10647000F0BBBDF858000990FE482A8929690092AE -:10648000CDE901106B89BDF82C202868069904F02D -:10649000EBF901007ED120784FF0020AC10601D449 -:1064A00080062BD5ADF80C90606950B907A906A8F5 -:1064B000FFF7ADF99DF81D0020F00700401C8DF896 -:1064C0001D009DF81C008DF84E7040F0C8008DF83E -:1064D0001C0042F60210ADF84C000CA903AACDF83E -:1064E00000A0CDE90121002340F2032213A800E01F -:1064F0001EE0079904F0B8F901004BD1DD484D4684 -:1065000008385B460089ADF839000EA8CDE9029045 -:10651000CDF80490CDF810904FF007090022CDF887 -:106520000090BDF858104FF6FF7004F0E3F810B17A -:10653000FFF79DF8E5E69DF83800000625D52946C9 -:10654000012060F30F218DF84E704FF42450ADF808 -:106550004C00ADF8105062789DF81000002362F3F3 -:1065600000008DF810006278CDF800A0520862F3A8 -:1065700041008DF8100004AACDE9012540F2032264 -:1065800013A804F071F9010004D1606888B3206990 -:10659000A8B900E086E005A906A8FFF738F96078F9 -:1065A000800706D49DF8150020F038008DF81500FE -:1065B00005E09DF8140040F040008DF814008DF8BF -:1065C0004E7042F60110ADF84C00208940F20121D6 -:1065D000B0FBF1F201FB1202606814ABCDF8008051 -:1065E000CDE90103002313A8059904F03DF901004A -:1065F00058D12078C00729D0ADF80C50A06950B907 -:1066000008A906A8FFF703F99DF8210020F007006C -:10661000401C8DF821009DF820008DF84E7040F050 -:1066200040008DF8200042F60310ADF84C0015A98B -:1066300003AACDF800A0CDE90121002340F20322F6 -:1066400013A8089904F010F901002BD1E06868B391 -:106650002946012060F30F218DF84E7042F6041098 -:10666000ADF84C00E068002302788DF86020407897 -:106670008DF86100E06818AA4088ADF86200E06813 -:1066800000798DF86400E068C088ADF86500CDF849 -:106690000090CDE901254FF4027213A804F0E4F84C -:1066A000010003D0099800F0B3FF2AE671480321E6 -:1066B0000838017156B100893080BDF850007080F3 -:1066C000BDF83000B080BDF85400F080002018E61E -:1066D00070B501258AB016460B46012802D0022863 -:1066E00016D104E08DF80E504FF4205003E08DF8E1 -:1066F0000E5042F60100ADF80C005BB10024601CA6 -:1067000060F30F2404AA08A9184607F032FF18B155 -:10671000072048E5102046E504A99DF820205548AB -:10672000CDE90021801E02900023214603A802F239 -:10673000012204F099F810B1FEF799FF33E54D48B6 -:1067400008380EB1C1883180057100202BE5F0B505 -:1067500093B0074601268DF83E6041F60100ADF882 -:106760003C0012AA0FA93046FFF7B2FF002848D11B -:10677000404C0025083CE7B31C2102A810F083FD23 -:106780009DF808008DF83E6040F020008DF808006C -:1067900042F60520ADF83C000E959DF83A001195A3 -:1067A00020F00600801C8DF83A009DF838006A46FB -:1067B00020F0FF008DF838009DF8390009A920F07D -:1067C000FF008DF839000420ADF82C00ADF8300042 -:1067D0000EA80A9011A80D900FA80990ADF82E50A0 -:1067E00002A8FFF76AFD00280BD1BDF80000608108 -:1067F00000E008E0BDF80400A081401CE0812571A4 -:10680000002013B0F0BD6581A581BDF84800F4E714 -:106810002DE9F74F1749A0B00024083917940A79D9 -:10682000A146012A04D0022A02D0082023B02FE575 -:10683000CA88824201D00620F8E721988A4682421F -:1068400001D10720F2E701202146ADF848004FF6BC -:10685000FF7860F30F21ADF84A808DF86E0042F6A4 -:10686000020B06918DF87240ADF86CB0ADF8704037 -:106870001CA901E0100200201391ADF8508012A86D -:1068800004F0DFF800252E462F460DAB072212A993 -:10689000404604F0D9F878B10A285DD195B38EB39B -:1068A000ADF86450ADF866609DF85E008DF8144058 -:1068B00019AC012864D06BE09DF83A001FB30128A1 -:1068C00059D1BDF8381059451FD118A809A901940C -:1068D0000294CDE9031007200090BDF83610102374 -:1068E0000022404604F030F9B0BBBDF86000042837 -:1068F00001D006284AD1BDF82410219881423AD10E -:106900000F2093E73AE0012835D1BDF83800B0F503 -:10691000205F03D042F6010188422CD1BAF806006C -:10692000BDF83610884201D1012700E0002705B1EB -:106930009EB1219881421ED118A809AA01940294FF -:10694000CDE90320072000900D4610230022404689 -:1069500004F0FAF800B902E02DE04E460BE0BDF875 -:106960006000022801D0102810D1C0B217AA09A9CE -:1069700007F0E0FD50B9BDF8369086E7052055E7F1 -:1069800005A917A8221D07F0F4FD08B103204DE763 -:106990009DF814000023001DC2B28DF81420229827 -:1069A0000092CDE901401BA8069903F05DFF10B9E4 -:1069B00002228AF80420FEF75AFE37E710B50B468C -:1069C000401E88B084B205AA00211846FEF7EEFEEC -:1069D00000200DF1080C06AA05A901908CE807001B -:1069E000072000900123002221464FF6FF7003F09C -:1069F00081FE0446BDF81800012800D0FFDF2046C4 -:106A0000FEF735FE08B010BDF0B5FF4F044687B065 -:106A100038790E46032804D0042802D0082007B095 -:106A2000F0BD04AA03A92046FEF799FE0500F6D1A1 -:106A300060688078C0F3410002280AD19DF80D00FB -:106A400010F0380F05D0206909F00AFD08B11020B8 -:106A5000E5E7208905AA21698DE807006389BDF86B -:106A600010202068039903F0FFFE10B1FEF7FFFD30 -:106A7000D5E716B1BDF814003080042038712846DF -:106A8000CDE7F8B50C0006460BD001464FF6FF7572 -:106A900000236A46284604F0D9F820B1FEF7E7FD46 -:106AA000F8BD1020F8BD69462046FEF710FE00280C -:106AB000F8D1A078314600F001032846009A04F08E -:106AC000F1F8EBE730B587B0144600220DF1080C61 -:106AD00005AD01928CE82C00072200920A4601467F -:106AE00023884FF6FF7003F005FEBDF814102180D7 -:106AF000FEF7BDFD07B030BD70B50D46042105F0B1 -:106B000097FF040000D1FFDF294604F11400BDE81F -:106B1000704002F017BE70B50D46042105F088FFE5 -:106B2000040000D1FFDF294604F11400BDE87040E5 -:106B300002F02BBE70B50D46042105F079FF04006C -:106B400000D1FFDF294604F11400BDE8704002F0D7 -:106B500043BE70B50546042105F06AFF040000D16C -:106B6000FFDF214628462368BDE870400122FEF77A -:106B70004BBF70B50646042105F05AFF040000D152 -:106B8000FFDF04F1140002F0CDFD401D20F00305ED -:106B900011E0011D00880022431821463046FEF70F -:106BA00033FF00280BD0607CABB2684382B2A06890 -:106BB000011D05F018FEA06841880029E9D170BDCB -:106BC00070B50546042105F033FF040000D1FFDF56 -:106BD000214628466368BDE870400222FEF714BFD4 -:106BE00070B50E46054601F0F9F8040000D1FFDF4C -:106BF0000120207266726580207820F00F00001D51 -:106C000020F0F00040302070BDE8704001F0E9B89D -:106C100010B50446012900D0FFDF2046BDE8104032 -:106C20000121FEF7F0BA2DE9F04F97B04FF0000ABE -:106C30000C008346ADF814A0D04619D0E06830B1FE -:106C4000A068A8B10188ADF81410A0F800A05846BB -:106C5000FAF772FB070043F2020961D03878222864 -:106C60005CD30421584605F0E3FE050005D103E09E -:106C7000102017B0BDE8F08FFFDF05F1140002F01F -:106C800051FD401D20F00306A078012803D0022802 -:106C900001D00720EDE7218807AA584603F0A1FE9E -:106CA00030BB07A803F0A9FE10BB07A803F0A5FEA0 -:106CB00048B99DF82600012805D1BDF82400A0F5AB -:106CC0002451023902D04FF45050D2E7E068B0B1FD -:106CD000CDE902A00720009005AACDF804A00492F7 -:106CE000A2882188BDF81430584603F003FD10B186 -:106CF000FEF7BDFCBDE7A168BDF8140008809DF853 -:106D00001F00C00602D543F20140B2E70B9838B12C -:106D1000A1780078012905D080071AD40820A8E7B7 -:106D20004846A6E7C007F9D002208DF83C00A868C5 -:106D30004FF00009A0B1697C4288714391420FD99C -:106D40008AB2B3B2011D05F004FD8046A0F800A090 -:106D500006E003208DF83C00D5F800804FF00109D3 -:106D60009DF8200010F0380F00D1FFDF9DF82000C3 -:106D70002649C0F3C200084497F8231010F8010C0C -:106D8000884201D90F2074E72088ADF8400014A98B -:106D90000095CDE90191434607220FA95846FEF719 -:106DA0005DFE002891D19DF8500050B9A0780128CF -:106DB00007D1687CB3B2704382B2A868011D05F0A8 -:106DC000DCFC002055E770B5064615460C46084623 -:106DD000FEF70CFC002805D12A4621463046BDE8C6 -:106DE000704075E470BD13E570B51E4614460D0085 -:106DF0000ED06CB1616859B160B10349C988814254 -:106E000008D0072070BD000008020020E2750100D4 -:106E10001020F7E72068FEF7E9FB0028F2D13246A0 -:106E200021462846BDE87040FFF747BA70B51546C1 -:106E30000C0006D038B1FE490989814203D00720F1 -:106E4000E0E71020DEE72068FEF7D0FB0028D9D16C -:106E500029462046BDE87040D6E570B5064686B0A6 -:106E60000D461446104609F0DDFAD0BB606809F003 -:106E700000FBB0BBA6F57F40FF3803D03046FAF7E1 -:106E80005BFA80B128466946FEF7E3FC00280CD186 -:106E90009DF810100F2008293CD2DFE801F0080609 -:106EA0000606060A0A0843F2020006B0AAE7032013 -:106EB000FBE79DF80210012908D1BDF80010B1F5DB -:106EC000C05FF2D06FF4C052D142EED09DF80610F0 -:106ED00001290DD1BDF80410A1F52851062907D2CA -:106EE00000E028E0DFE801F0030304030303DCE72C -:106EF0009DF80A1001290ED1BDF80810B1F5245FE4 -:106F0000D3D0A1F524510239CFD00129CDD0022907 -:106F100001D1CAE7FFDF606878B9002305AA2946D6 -:106F2000304603F093FE10B1FEF7A1FBBDE79DF8DC -:106F30001400800601D41020B7E761882246284655 -:106F40006368FFF7BFFDB0E72DE9F043814687B0E6 -:106F500088461446104609F065FA18B1102007B0AB -:106F6000BDE8F083002306AA4146484603F06EFEC2 -:106F700018B100BFFEF77BFBF1E79DF81800C006D3 -:106F800002D543F20140EAE70025072705A801954D -:106F900000970295CDE9035062884FF6FF73414692 -:106FA000484603F0D1FD060013D1606809F03AFAB3 -:106FB00060B960680195CDE9025000970495238877 -:106FC00062884146484603F0BFFD0646BDF81400FE -:106FD00020803046CEE739B1954B0A889B899A428A -:106FE00002D843F2030070471DE610B586B0904CFE -:106FF0000423ADF81430638943B1A4898C4201D2D3 -:10700000914205D943F2030006B010BD0620FBE70C -:10701000ADF81010002100910191ADF8003002216F -:107020008DF8021005A9029104A90391ADF8122070 -:107030006946FFF7F8FDE7E72DE9FC4781460E4674 -:10704000084609F0C9F988BB4846FAF775F95FEABE -:1070500000080AD098F80000222829D304214846C5 -:1070600005F0E6FC070005D103E043F20200BDE8AD -:10707000FC87FFDF07F1140002F06BFB0546307858 -:10708000012803D0022804D00720F0E7A8070FD575 -:1070900002E015F01C0F0BD0B079341DC00709D0E9 -:1070A000E08838B1A06809F097F918B11020DEE740 -:1070B0000820DCE732782088002628B3A0F20113EC -:1070C0000721112B18D20CD2DFE803F00B090D0BAE -:1070D0001D0B121D100B0B1D1D1D1D0B1D00022A6B -:1070E00011D10846C3E7012AFBD00CE02A0700E0D3 -:1070F000EA06002AF5DA06E0A0F5C0721F2A02D9D6 -:107100007D3A022AEDD8C6B200F068FE50B198F878 -:107110002300CDE90006FA89234639464846FEF7A2 -:10712000E7FCA4E71120A2E72DE9F04F8BB01F4642 -:1071300015460C4683460026FAF7FEF828B100787B -:10714000222805D208200BB094E543F20200FAE7AA -:10715000B80801D00720F6E7032F00D100274FF62B -:10716000FF79CCB1022D73D3204609F082F930B9F2 -:1071700004EB0508A8F1010009F07BF908B1102023 -:10718000E1E7AD1EAAB22146484603F014FE38F8E6 -:10719000021C88425CD1ADB22549B80702D5888966 -:1071A000401C00E001201FFA80F8F80701D08F8909 -:1071B00000E04F4605AA4146584603F012FC4FF046 -:1071C000070A4FF00009ACB3204608E040881028B9 -:1071D0003ED8361D304486B2AE4239D2A01902885C -:1071E0004245F3D354E000BF9DF8170002074FD586 -:1071F00084B304EB0608361DB8F80230B6B2102B83 -:1072000026D89A19AA4223D8B8F8002091421FD153 -:10721000C00620D5CDE900A90DF1080C0AAAA119D4 -:1072200048468CE80700B8F800100022584603E0F2 -:10723000080200202CE00BE003F05CFA10B1FEF72E -:1072400016FA80E7B8F80200BDF82810884202D08C -:107250000B2078E704E0B8F80200304486B206E07C -:10726000C00604D55846FEF775FC002888D19DF865 -:107270001700BDF81A1020F010008DF81700BDF8A7 -:107280001700ADF80000FF235846009A03F00AFDEE -:1072900005A803F0B2FB18B9BDF81A10B942A3D97A -:1072A0000421584605F0C4FB040000D1FFDFA28989 -:1072B0005AB1CDE900A94D46002321465846FEF7B4 -:1072C00017FC0028BDD1A5813DE700203BE72DE953 -:1072D000FF4F8BB01E4617000D464FF0000412D032 -:1072E000B00802D007200FB0C4E4032E00D100265E -:1072F0005DB1084609F0B4F828B93888691E084419 -:1073000009F0AEF808B11020EDE7C74AB00701D583 -:10731000D18900E00121F0074FF6FF7802D0D08933 -:10732000401E00E0404686B206AA0B9803F059FBC7 -:107330004FF000094FF0070B0DF1140A39E000BFC0 -:107340009DF81B00000734D5CDF80490CDF800B0AF -:10735000CDF80890CDE9039A434600220B9803F03C -:10736000F3FB60BB05B3BDF814103A88214428191B -:10737000091D8A4230D3BDF81E2020F8022BBDF82B -:10738000142020F8022BCDE900B9CDE90290CDF808 -:1073900010A0BDF81E10BDF8143000220B9803F0A9 -:1073A000D3FB08B103209EE7BDF814002044001D64 -:1073B00084B206A803F021FB20B10A2806D0FEF70C -:1073C00056F990E7BDF81E10B142B9D934B17DB17C -:1073D0003888A11C884203D20C2084E7052082E76C -:1073E00022462946404603F0E6FC01462819018062 -:1073F000A41C3C80002076E710B5044609F012F882 -:1074000008B1102010BD8848C0892080002010BD20 -:10741000F0B58BB00D460646142103A80FF033FFDC -:1074200001208DF80C008DF8100000208DF811005F -:10743000ADF814503046F9F77FFF48B100782228A4 -:1074400012D30421304605F0F3FA040005D103E01D -:1074500043F202000BB0F0BDFFDF04F11400074659 -:1074600002F077F9800601D40820F3E7207C02219E -:1074700040F00100207409A80094CDE90110072212 -:1074800003A930466368FEF7E9FA20B1217C21F0B8 -:1074900001012174DEE729463046FDF7A5FE08A963 -:1074A000384602F045F900B1FFDFBDF82040172C47 -:1074B00001D2172000E02046A84201D92C4602E064 -:1074C000172C00D2172421463046FFF724FB214613 -:1074D0003046FDF7ABFB0020BCE7F8B51C4615466F -:1074E0000E46069F05F0D6FB2346FF1DBCB2314673 -:1074F0002A46009404F0DFFFF8BD70B50C4605463F -:107500000E2120460FF09DFE002020802DB1012D80 -:1075100001D0FFDF76E4062000E00520A07171E4D1 -:1075200010B548800878134620F00F00001D20F0A9 -:10753000F00080300C4608701422194604F108004F -:107540000FF045FE00F04DFC3748046010BD2DE9FA -:10755000F047DFF8D890491D064621F00301174691 -:107560000C46D9F8000005F0BCF8050000D1FFDF9B -:107570004FF000083560A5F800802146D9F80000DA -:1075800005F0AFF8050000D1FFDF7560A5F80080B9 -:107590007FB104FB07F1091D0BD0D9F8000005F0FD -:1075A000A0F8040000D1FFDFB460C4F80080BDE89B -:1075B000F087C6F80880FAE72DE9F0411746491D23 -:1075C00021F00302194D064601681446286805F0AB -:1075D000B3F822467168286805F0AEF83FB104FBA5 -:1075E00007F2121D03D0B168286805F0A5F8042041 -:1075F00005F0CAF90446042005F0CEF9201A012846 -:1076000004D12868BDE8F04105F060B8BDE8F0811C -:1076100010B50C4603F0B1F900B1FFDF2046BDE81C -:107620001040FEF724B800000802002014000020DB -:1076300038B582880A800C46C188121D90B26A460D -:1076400004F0A2FBBDF80000032800D30320C1B260 -:10765000208800F06BFF38BD38B582880A800C4660 -:10766000C188121D90B26A4604F08EFBBDF800007E -:10767000022800D30220C1B2208800F057FF401C2E -:10768000C0B238BD2DE9FF5F0C46F94981462C2276 -:10769000D1E90201CDE9020109F1030020F0030163 -:1076A000C91C21F0030100916846114604F0FBFF5C -:1076B000F04E002C02D1F049009A8A6000990144F2 -:1076C0000091357E05F1010504D1E8B206F0D8FE3F -:1076D00000B1FFDF00984FF0000B00EB0510C01C5D -:1076E00020F00301009144B9327A81F800B0B08BE8 -:1076F00080B202F0CAFF00B1FFDF0098F1690844D0 -:1077000000902146684600F0D4FE0098C01C20F08E -:1077100003000090317A04B1002005F0AEF8009922 -:10772000084400902146684600F00BFF00273D46C4 -:10773000B24696F801800CE0284600F09DFE064611 -:1077400081788088FDF709FB71786D1C00FB01775B -:10775000EDB24545F0D10098C01C20F00300009028 -:1077600004B100203946FDF703FB009900270844C7 -:1077700000903D469AF801800CE0284600F07CFE1F -:107780000646C1788088FEF770FC71786D1C00FB9E -:107790000177EDB24545F0D10098C01C20F0030000 -:1077A000009004B100203946FEF768FC00990844B7 -:1077B00000210090084603F046FC0098C01D20F010 -:1077C00007020092F4BBAD490020FBF70DFC03F06B -:1077D000BDFAA9484178C06803F0F1FEA648103010 -:1077E000C0788DF8040010B1012804D005E0012014 -:1077F0008DF8040001E08DF804B001A803F0EEFF5D -:10780000FAF7A6FA9B4802AA00210C30FAF7FAFE12 -:1078100000B1FFDF9AF81900FEF799FF00B1FFDF12 -:1078200094484FF4F6713C300FF02DFD914804213F -:107830003C3080F8E91180F8EA11062180F8EB115C -:10784000032100E000E00171009904B0A1EB090000 -:10785000BDE8F09F70B5874C06463C34207804EBB9 -:107860004015E078083590B9A01990F8E801002893 -:107870000ED0A0780F2800D3FFDF202128460FF07C -:1078800002FD687866F3020068700120E070284607 -:1078900070BD2DE9F04105460C4600270078052112 -:1078A00090463E46B1EB101F00D0FFDF287A58B15A -:1078B00001280FD0FFDF00BFA8F800600CB12780BF -:1078C00066800020BDE8F0810127092674B1688830 -:1078D000A08008E00227142644B16888A0802869A7 -:1078E000E060A88A2082287B2072E5E7A8F8006083 -:1078F000E7E710B5604C6068C11D21F007018142C7 -:1079000000D0FFDF5B48012200210270417002724B -:107910000173052181821F21C182427358A1016137 -:107920000A21017642764FF4B061C161616841601D -:1079300010BD30B5504C1568636808339D4202D2C3 -:107940000420136030BD4B4B5D785A6802EBC502D2 -:10795000107051700320D080172090800120D070CB -:1079600090705878401C5870606808306060002043 -:1079700030BD70B506463F480024457807E02046F4 -:1079800000F07AFD0178B14204D0641CE4B2AC424C -:10799000F5D1002070BDF7B5064608780C46F8B161 -:1079A000FFF7E7FF0546202E06D0212E1AD0222E03 -:1079B00018D0232E14D110E000F069FD0DB16978C4 -:1079C00000E00021401A81B2A0780144FF2907D8C5 -:1079D00030B1A088022805D202E06088172801D2C1 -:1079E0000720FEBD65B9207802AA0121FFF7A1FF9B -:1079F0000028F6D12078FFF7BCFF050000D1FFDF9B -:107A0000202E08D0212E0ED0222E0FD0232E07D0CC -:107A1000FFDF0020FEBDA0786870A088E880F8E74E -:107A20006088A880F5E7A078A870F2E7A078E870F1 -:107A3000EFE71E2835D00EDC0C282ED008DC0928F4 -:107A400031D2DFE800F0133021303028282426001E -:107A5000122828D125E0302823D024DDA0F13A00D7 -:107A6000032820D2DFE800F01B1F1500002070471C -:107A7000E8750100440200201C00002000000020E6 -:107A80006E5246357800000043F20200EFE7042012 -:107A9000EDE70D20EBE70F20E9E70820E7E71120ED -:107AA000E5E70720E3E70320E1E710B5007800F001 -:107AB000010004F064F9BDE81040BAE70EB50178A2 -:107AC00001F001018DF80010417801F001018DF8FD -:107AD00001100178C1F340018DF802104178C1F323 -:107AE00040018DF80310017889088DF80410417861 -:107AF00089088DF8051081788DF80610C1788DF809 -:107B0000071000798DF80800684603F080FEFFF743 -:107B100090FF0EBD2DE9F84FDFF8F883FE4C0026EC -:107B20001FE0012000F050FD0120FFF793FE054605 -:107B30002C214746D8F8080004F0D3FD686000B94E -:107B4000FFDF686803F065FDA8B12846F9F7ADFDD1 -:107B5000284600F03FFD20B92C226968B86804F07F -:107B6000EBFD94F9E9010428DBDA022004F00CFFB4 -:107B700007460025A5E02C226968D8F8080004F023 -:107B8000DBFDF2E7B8F802104046491C89B2A8F8BC -:107B90000210B94201D3002141800221B8F802004D -:107BA00004F046FF002864D0B8F80200694604F0EB -:107BB0006AF8FFF73EFF00B1FFDF9DF8000078B1E3 -:107BC000B8F8020005F078F85FEA000900D1FFDF9D -:107BD000484604F004FB18B1B8F8020003F0F8FBC3 -:107BE000B8F8020005F056F85FEA000900D1FFDF9F -:107BF000484604F0ECFAE0BB0321B8F8020004F0B8 -:107C000017FF5FEA000B47D1FFDF45E0DBF80C0010 -:107C100010B10078FF2849D0022000F0D5FC0220E6 -:107C2000FFF718FE8246484604F0DDFBCAF8040060 -:107C300000B9FFDFDAF8040004F0A5FC0021009091 -:107C40000170B8F802105046AAF8021003F099FA31 -:107C5000484604F09AFC00B9FFDF504600F0BAFC39 -:107C600018B99AF80100000704D50099CBF80C1058 -:107C700012E024E0DBF80C0038B10178491C11F067 -:107C8000FF01017008D1FFDF06E0002211464846DF -:107C900000F0F0FB00B9FFDF94F9EA01022805DBF0 -:107CA000B8F8020003F048FA0028AFD194F9E901CE -:107CB000042804DB484604F0CCFC00B101266D1C0E -:107CC000EDB2BD4204D294F9EA010228BFF65AAFE0 -:107CD000002E7FF424AFBDE8F84F032000F074BC01 -:107CE00010B58C4CE06008682061AFF2D71000F04E -:107CF000DCFE607010BD884800213C38017085486A -:107D0000017086494160B2E670B505464FF080507B -:107D10000C46D0F8A410491C05D1D0F8A810C943CE -:107D20000904090C0BD050F8A01F01F001012970C3 -:107D3000416821608068A080287830B970BD062134 -:107D4000204608F024F801202870607940F0C00037 -:107D5000607170BD70B54FF080540D46D4F880103E -:107D6000491C0BD1D4F88410491C07D1D4F88810D1 -:107D7000491C03D1D4F88C10491C0CD0D4F88010C5 -:107D80000160D4F884104160D4F888108160D4F880 -:107D90008C10C16002E0102107F0F9FFD4F89000C8 -:107DA000401C0BD1D4F89400401C07D1D4F89800A3 -:107DB000401C03D1D4F89C00401C09D054F8900F0B -:107DC000286060686860A068A860E068E86070BDCE -:107DD0002846BDE87040102107F0D9BF4E48007911 -:107DE00038E570B54C4CE07830B3207804EB4010A7 -:107DF000407A00F00700204490F9E801002800DCF8 -:107E0000FFDF2078002504EB4010407A00F00700E7 -:107E1000011991F8E801401E81F8E8012078401C22 -:107E2000C0B220700F2800D12570A078401CA0702F -:107E300007F0E8FEE57070BDFFDF70BD3EB505469A -:107E4000032104F0F5FD0446284604F023FF05460F -:107E500004B9FFDFE06818B10078FF2800D1FFDF28 -:107E600001AA6946284600F005FB60B9FFDF0AE079 -:107E7000002202A9284600F0FDFA00B9FFDF9DF8B4 -:107E8000080000B1FFDF9DF80000411E8DF80010D2 -:107E9000EED2E0680199884201D10020E0603EBD49 -:107EA00070B50546A0F57F400C46FF3800D1FFDFD6 -:107EB000012C01D0FFDF70BDFFF790FF040000D15F -:107EC000FFDF207820F00F00401D20F0F000503040 -:107ED000207065800020207201202073BDE8704072 -:107EE0007FE72DE9F04116460D460746FFF776FF7E -:107EF000040000D1FFDF207820F00F00401D20F0AB -:107F0000F0005030207067800120207228682061C6 -:107F1000A88805E01C00002080020020600D0020E1 -:107F2000A0822673BDE8F0415BE77FB5FFF721FD36 -:107F3000040000D1FFDF02A92046FFF779FB0546C8 -:107F400003A92046FFF788FB8DF800508DF801004B -:107F5000BDF80800001DADF80200BDF80C00001DC2 -:107F6000ADF80400E088ADF80600684603F0F1FEC5 -:107F7000002800D0FFDF7FBD2DE9F04FFD4E044605 -:107F80008BB030784FF0000A18B108200BB0BDE874 -:107F9000F08F204608F046FA08B11020F6E7F64DBB -:107FA000287808B9FFF7A5FC2D7A00F070FAA842EE -:107FB00008D2281AC1B222460020FFF7BAFC5FEAB5 -:107FC000000AE3D1EB484FF00009C84641684F462C -:107FD000C91C21F003014160E748CDF80890CDF8B5 -:107FE00000904E464D4690F801B00EE0284600F055 -:107FF00043FA4178827809F10109884412FB01773C -:10800000C07810FB01666D1CEDB25D45EED10098A5 -:10801000029900EB890000EBC80000EB8700D64D09 -:1080200000EB860000EBC100297ADFF8488300EB03 -:10803000C100D8F80410471801213846FFF722FB89 -:10804000064621683844884202D8B6F5803F15D3E9 -:1080500020600020FFF78DFC04000DD004F10B0020 -:10806000D8F8041020F003004646884200D0FFDF15 -:108070006878401E68707460042087E700213846E5 -:10808000FFF700FB0546AE4200D0FFDFE919C8F854 -:10809000041021604FF6FF71A8F80210012188F842 -:1080A0000010504672E72DE9F0410446B1481746EA -:1080B0000D46007808B1082004E4084608F08CF961 -:1080C00008B11020F8E7AC4E307808B9FFF711FC82 -:1080D000601E1E2807D8012C38D12878FE2835D8F4 -:1080E00030760020E8E7A4F120001F2805D8E0B290 -:1080F0003A462946BDE8F0414DE4A4F140004FF076 -:1081000000081F281AD8402C02D0412C1ED110E0A4 -:108110002C78FF2C08D806F097FB074607F02BFDBC -:10812000381A401EA04201DA1220C5E728783072C2 -:1081300024E02846BDE8F04100F074BAA4F1A000A4 -:108140001F2803D8A02C03D0A12C06D00720B3E70A -:10815000287800F00100707610E029680920F829DD -:10816000AAD38A07A8D1727B02F00302012A04D1A4 -:10817000F28AD73293B28B429ED8F16140469BE798 -:108180002DE9F04781460E46084608F04BF948B9FC -:10819000484608F065F928B909F1030020F0030109 -:1081A000494502D01020BDE8F08773484FF0000A1F -:1081B0003C30817869B14178804600EB4114083445 -:1081C000378832460021204600F012FA050004D01C -:1081D00027E0A6F800A00520E5E7B9F1000F24D0BC -:1081E0003088B84201D90C251FE0607800F00705FF -:1081F000284600F0E9F908EB0507324697F8E80150 -:108200004946401C87F8E801204607F5F47700F05E -:10821000EFF905463878401E3870032000F0D4F995 -:108220002DB10C2D01D0A6F800A02846BBE7607840 -:10823000504E00F00701012923D002290CD0032958 -:1082400033D0FFDF98F801104046491CC9B288F8C6 -:1082500001100F2934D035E0616821B1000702D444 -:108260006088FFF7EBFD98F8EA014746012802D144 -:10827000707800F039FC97F9EA010428E2DBFFDFAF -:10828000E0E7616819B12C22B06804F055FA98F85B -:10829000E9014746032802D1707800F025FC97F9E0 -:1082A000E9010428CEDBFFDFCCE7C00602D56088F9 -:1082B000FFF7C4FD98F9EB010628C3DBFFDFC1E738 -:1082C00080F801A08178491E8170617801F0070172 -:1082D00001EB080090F8E811491C80F8E811A4E7C8 -:1082E00070B50D46044608F077F818B9284608F02E -:1082F00099F808B1102070BD29462046BDE87040AD -:1083000006F0F5B870B5044615460E46084608F066 -:1083100063F818B9284608F085F808B1102070BD38 -:10832000022C03D0102C01D0092070BD2A46314602 -:10833000204606F0FFF80028F7D0052070BD70B584 -:1083400014460D46064608F047F838B9284608F0A6 -:1083500069F818B9204608F083F808B1102070BDFC -:1083600022462946304606F004F90028F7D00720B7 -:1083700070BD00001C000020440200203EB50446F1 -:1083800008F050F808B110203EBD684603F0E1F94E -:10839000FFF74FFB0028F7D19DF806002070BDF8CD -:1083A00008006080BDF80A00A08000203EBD70B5C6 -:1083B00005460C46084608F053F820B93CB1206841 -:1083C00008F030F808B11020D2E7A08828B1214683 -:1083D0002846BDE87040FDF7C7BE0920C8E770B564 -:1083E00004460D46084607F0F7FF30B9601E1E2808 -:1083F00014D8284607F0F0FF08B11020B8E7022C87 -:1084000001D90720B4E704B9FFDFAC4800EB8400D2 -:1084100050F8041C2846BDE870400847A4F120002D -:108420001F28EED829462046BDE87040F9F71FBC4A -:1084300070B504460D46084607F0F4FF30B9601EDB -:108440001E280DD8284607F0C7FF08B110208FE777 -:10845000012C01D0022C01D1062089E7072087E7F3 -:10846000A4F120001F28F9D829462046BDE8704015 -:10847000F9F741BC03F07ABE30B5914D04466878F7 -:10848000A04200D8FFDF686800EBC40030BD70B5C3 -:108490008B4800252C46467807E02046FFF7ECFF86 -:1084A0004078641C2844C5B2E4B2B442F5D12846F1 -:1084B0005EE72DE9F041054681480C46027A501CE2 -:1084C000104410448618761CFF2E00D9FFDF286860 -:1084D000F6B2C01C20F003022A6014BB7848334671 -:1084E0000721203007F052FE002407E0072C10D2AD -:1084F000DFE804F004060408080A0400714804E0F8 -:10850000714802E0714800E0714807F05FFE0746DD -:1085100000E0FFDFA74200D0FFDF641CE4B2072CBD -:10852000E4D3286800EB06102860C5E5021D51431E -:10853000452900D245210844C01CB0FBF2F0C0B26E -:1085400070472DE9FC5F06465D484FF000088B46FA -:108550004746444690F8019022E02046FFF78CFF02 -:10856000050000D1FFDF687869463844C7B2284665 -:10857000FFF75EF8824601A92846FFF76DF803462B -:10858000BDF804005246001D81B2BDF80000001D78 -:1085900080B204F0CBFA6A78641C00FB0288E4B273 -:1085A0004C45DAD13068C01C20F003003060BBF1CC -:1085B000000F00D000204246394604F0C5FA316869 -:1085C00008443060BDE8FC9F3D493C310871002003 -:1085D000C87070473A493C31CA782AB10A7801EB31 -:1085E00042110831814201D00120704700207047BC -:1085F0002DE9F04106460078154600F00F040020F2 -:108600001080601E0F46052800D3FFDF2B482A4646 -:10861000103000EB8400394650F8043C3046BDE889 -:10862000F041184738B50446407800F003000128AF -:1086300003D002280BD0072038BD606858B107F07E -:1086400018FFD0B9606807F00BFF20B915E060682B -:1086500007F0C2FE88B969462046FBF719FB0028DF -:10866000EAD1607800F00300022808D19DF80000EC -:1086700028B1606807F0F4FE08B1102038BD6189A8 -:10868000F8290DD8208988420AD8607800F00302C2 -:108690000B48012A06D1D731C26989B28A4201D278 -:1086A000092038BD94E80E0000F10C0585E80E00A5 -:1086B0000AB900218182002038BD0000E875010060 -:1086C000440200207B1B000091B00000C98B000019 -:1086D00073E2000010B5EFF3108000F0010472B6F1 -:1086E000E7484178491C41704078012801D107F0E2 -:1086F000A9FA002C00D162B610BD70B5E04CE0784C -:1087000048B90125E570FFF7E5FF07F0A3FA20B1AE -:10871000002007F07EFA002070BD4FF080406571A8 -:10872000C0F80453F7E770B5EFF3108000F00105CF -:1087300072B6D34C607800B9FFDF6078401E60707D -:10874000607808B907F082FA002D00D162B670BDDA -:10875000CB4810B5C17821B100214171C170FFF73C -:10876000E2FF002010BD10B5044607F073FAC449BB -:10877000C978084000D001202060002010BD2DE9FC -:10878000F05FDFF8FC924278817889F806200026B5 -:1087900089F80710074689F808600078354620B147 -:1087A00001280FD002280FD0FFDF07F060FA98B140 -:1087B00007F064FAB0420FD1304607F063FA0028A0 -:1087C000FAD047E00126F0E7FFF784FF07F042FA0E -:1087D0000028FBD00226E8E701208407E060C4F807 -:1087E0000451A8490E600107D1F84412A54AC1F30B -:1087F000423124321160A349343108604FF0020B3A -:10880000C4F804B3A060DFF880A2DAF80010C9430E -:1088100041F3001101F10108DAF8001041F01001F4 -:10882000CAF8001000E020BFD4F804010028FAD0F4 -:10883000304607F027FA0028FAD0B8F1000F05D12A -:10884000DAF8001021F01001CAF80010C4F808B3DB -:10885000C4F8045199F807004C4670B1387860B9F3 -:1088600007F0F8F9074607F059FB6FF0004117B120 -:10887000C4E9031001E0C4E9030116B12571BDE8A4 -:10888000F09F0127BE0727714FF01908C6F808832B -:10889000B761C6F80051C6F80C51C6F8105107F080 -:1088A000D9F910B1A770376100E02770FFF712FF08 -:1088B0007449A07920310860C6F80483DFE770B5F9 -:1088C000050000D1FFDF4FF080424FF0FF30C2F8CB -:1088D00008030021C2F80011C2F80411C2F80C11FB -:1088E000C2F81011664C617007F0BAF910B101209E -:1088F000E07060702846BDE8704040E72DE9F04721 -:108900004FF08044D4F8080110B14FF0010801E0A5 -:108910004FF00008D4F8000100B101208146D4F8DE -:10892000040108B1012600E00026D4F80C0100B1D2 -:1089300001208246D4F8100108B1012700E0002789 -:1089400048EA090126EA010020EA0A00B84300D0FB -:10895000FFDF0025B8F1000F04D0C4F80851012052 -:1089600007F057F95FEA0900DFF814814FF00109B9 -:1089700013D0C4F8005198F8050020B188F80550CC -:10898000002007F046F998F8000030B107F062F9CE -:1089900018B188F80290C4F810900EB1C4F80451D0 -:1089A000BAF1000F0CD0C4F80C5198F802004646FA -:1089B00000B9FFDFB5703570C4F81490FFF7B3FE4F -:1089C000002F09D0C4F8105198F80400002803D0F3 -:1089D000BDE8F04700F01EB8BDE8F08770B5284D3F -:1089E000E87808B907F032F901208407A061A87877 -:1089F00058B100BFD4F80C0120B9002007F042F9AB -:108A00000028F7D10020C4F80C014FF0FF30C4F863 -:108A1000080370BD2DE9F041194C4FF08047012546 -:108A2000E079F0B1012803D0217A401E814218DAA2 -:108A300007F010F9064607F071FAE179012902D929 -:108A4000217A491C21720EB1216900E0E168411AC6 -:108A5000022902DA11F1020F0BDC0EB1206100E0F5 -:108A6000E060FFF737FE07F0F5F828B13D61A5702B -:108A700003E07D61BDE8F081257000202072F9E7F8 -:108A8000340000201805004010ED00E04FF0E02118 -:108A90004FF00070C1F88001C1F88002334B802292 -:108AA00083F80024C1F80001704700B50246042095 -:108AB0002F4903E001EBC0031B792BB1401EC0B26C -:108AC000F8D2FFDFFF2000BD41F8302001EBC001EC -:108AD00000224A718A7101220A7100BD244A0021D4 -:108AE00002EBC0000171704710B50446042800D3A2 -:108AF000FFDF1F4800EBC4042079012800D0FFDF0E -:108B00006079A179401CC0B2814200D060714FF001 -:108B1000E0214FF00070C1F8000210BD70B513489D -:108B2000042590F80004124E4009124C042818D075 -:108B3000FFDF16E0217806EBC1000279012A08D197 -:108B4000427983799A4204D04279827156F8310091 -:108B500080472078401CC0B22070042801D3002038 -:108B600020706D1EEDB2E5D270BD000019E000E08E -:108B70006C040020480000200F4A12680D498A4208 -:108B80000CD118470C4A12680A4B9A4206D101B51B -:108B900007F096F9FAF726FABDE801400749096897 -:108BA0000958084706480749054A064B7047000020 -:108BB00000000000BEBAFECAA4000020040000208D -:108BC000E00C0020E00C002070B50C46054600F0DB -:108BD00043FB21462846BDE8704001F026BC00005A -:108BE000F8B51D46DDE906470E000AD004F064F82A -:108BF0002346FF1DBCB231462A46009403F08FFC89 -:108C0000F8BDD019224619460EF09CFA2046F8BD50 -:108C100070B50D46044610210EF013FB2581172078 -:108C20006081A07B40F00A00A07370BD4FF6FF7218 -:108C30000A800146032007F083BB70470089704714 -:108C4000827BD30701D1920703D48089088000205A -:108C5000704705207047827B920700D5818170475D -:108C600001460020098841F6FE52114200D0012041 -:108C7000704700B50346807BC00701D0052000BDCA -:108C800059811846FFF7ECFFC00703D0987B40F0EE -:108C900004009873987B40F001009873002000BD99 -:108CA000827B520700D509B1408970471720704771 -:108CB000827B61F3C302827370472DE9FC5F0E462D -:108CC000044601789646012000FA01F14DF6FF5264 -:108CD00001EA020962684FF6FF7B1188594506D008 -:108CE000B9F1000F06D041F6FE55294202D001200D -:108CF000BDE8FC9F41EA090111801D0014D04FF02E -:108D0000000C85F800C023780521032267464FF048 -:108D1000020A0E2B74D2DFE803F0F809252F476210 -:108D20006974479092B3D0D70420E1E76168208945 -:108D30008B7B9B077DD5172848D30B89834245D36E -:108D40008989172901D3814240D185F800A0A5F86F -:108D500001003280616888816068817B21F00201B6 -:108D60008173C5E0042028702089A5F8010060897E -:108D7000A5F803003180BBE0208A3188C01D1FFAAE -:108D800080F8414522D3062028702089A5F80100EB -:108D90006089A5F80300A089A5F805000721208AAD -:108DA000CDE9000163693EE0082B10D0082028704F -:108DB0002089A5F801006089A5F8030031806A1DAB -:108DC000694604F10C0005F0D4FB10B15FE01020FF -:108DD000EDE730889DF800100844308088E00A20D4 -:108DE00028702089A5F80100328045E00C20287009 -:108DF0002089A5F801006089A5F8030031803BE0D7 -:108E000083E02189338800EB41021FFA82F8434551 -:108E10003DD3B8F1050F3AD30E222A700BEA410177 -:108E2000CDE90010E36860882A467146FFF7D8FE56 -:108E300000E04DE0A6F800805AE0402028706089EC -:108E40003188C01C1FFA80F8414520D3287871462C -:108E500020F03F00123028702089A5F801006089B9 -:108E6000CDE9000260882A46E368FFF7B9FEA6F85C -:108E70000080287840063BD461682089888037E0EC -:108E8000A0893288401D1FFA80F8424501D204278C -:108E90003EE0162028702089A5F801006089A5F819 -:108EA0000300A089CDE9000160882A467146236944 -:108EB000FFF796FEA6F80080DEE718202870207ADB -:108EC0006870A6F800A013E061680A88920401D4D3 -:108ED00005271DE0C9882289914201D0062717E0A5 -:108EE0001E21297030806068018821F400510180C2 -:108EF000B9F1000F0CD0618878230022032007F01D -:108F000075F961682078887007E0A6F800C003272B -:108F10006068018821EA090101803846E8E62DE908 -:108F2000FF4F85B01746129C0D001E461CD03078AE -:108F3000C10703D000F03F00192801D9012100E04A -:108F400000212046FFF7ACFEA8420DD32088A0F5F3 -:108F50007F41FF3908D03078410601D4000605D59D -:108F6000082009B0BDE8F08F0720FAE700208DF84F -:108F700000008DF8010030786B1E00F03F0C0121DD -:108F8000A81E4FF0050A4FF002094FF0030B9AB2EA -:108F9000BCF1200F75D2DFE80CF08B10745E7468A2 -:108FA000748C749C74B674BB74C974D574E2747494 -:108FB00074F274F074EF74EE748B052D78D18DF823 -:108FC0000090A0788DF804007088ADF80600307924 -:108FD0008DF80100707800F03F000C2829D00ADCE1 -:108FE000A0F10200092863D2DFE800F012621562E6 -:108FF0001A621D622000122824D004DC0E281BD027 -:109000001028DBD11BE016281FD01828D6D11FE06E -:109010002078800701E020784007002848DAEFE058 -:1090200020780007F9E72078C006F6E72078800668 -:10903000F3E720784006F0E720780006EDE7208887 -:10904000C005EAE720884005E7E720880005E4E757 -:109050002088C004E1E72078800729D5032D27D197 -:109060008DF800B0B6F8010082E0217849071FD5DD -:10907000062D1DD381B27078012803D0022817D1A4 -:1090800002E0CAE0022000E0102004228DF8002057 -:1090900072788DF80420801CB1FBF0F2ADF8062048 -:1090A00092B242438A4203D10397ADF80890A7E0F9 -:1090B0007AE02078000777D598B282088DF800A072 -:1090C000ADF80420B0EB820F6ED10297ADF8061018 -:1090D00096E02178C90667D5022D65D381B20620B6 -:1090E0008DF80000707802285ED300BFB1FBF0F26B -:1090F0008DF80400ADF8062092B242438A4253D163 -:10910000ADF808907BE0207880064DD5072003E07D -:10911000207840067FD508208DF80000A088ADF8A3 -:109120000400ADF80620ADF8081068E020780006CD -:1091300071D50920ADF804208DF80000ADF80610B7 -:1091400002975DE02188C90565D5022D63D381B200 -:109150000A208DF80000707804285CD3C6E72088C8 -:10916000400558D5012D56D10B208DF80000A08860 -:10917000ADF8040044E021E026E016E0FFE7208897 -:10918000000548D5052D46D30C208DF80000A08899 -:10919000ADF80400B6F803006D1FADF80850ADF847 -:1091A0000600ADF80AA02AE035E02088C00432D5D8 -:1091B000012D30D10D208DF8000021E020888004A1 -:1091C00029D4B6F80100E080A07B000723D5032D49 -:1091D00021D3307800F03F001B2818D00F208DF8E5 -:1091E0000000208840F40050A4F80000B6F8010008 -:1091F000ADF80400ED1EADF80650ADF808B00397C9 -:1092000069460598FBF721FD050008D016E00E2001 -:109210008DF80000EAE7072510E008250EE0307819 -:1092200000F03F001B2809D01D2807D00320059916 -:1092300007F086F8208800F400502080A07B4007CB -:1092400008D52046FFF70CFDC00703D1A07B20F016 -:109250000400A073284684E61FB5032806D1012028 -:109260008DF8000088B26946FBF7EFFC1FBD0000D7 -:10927000F8B51D46DDE906470E000AD003F01CFDD7 -:109280002346FF1DBCB231462A46009403F047F93D -:10929000F8BDD019224619460DF054FF2046F8BDFE -:1092A0002DE9FF4F8DB09B46DDE91B57DDF87CA013 -:1092B0000C46082B05D0E06901F000F950B11020F0 -:1092C000D2E02888092140F0100028808AF8001098 -:1092D000022617E0E16901208871E2694FF420510C -:1092E0009180E1698872E06942F601010181E069DB -:1092F000002181732888112140F0200028808AF8FD -:109300000010042638780A900A2038704FF00209BD -:1093100004F118004D460C9001F093FBB04681E03B -:10932000BBF1100F0ED1022D0CD0A9EB0800801C50 -:1093300080B20221CDE9001005AB52461E990D986E -:10934000FFF796FFBDF816101A98814203D9F74827 -:1093500000790F9004E003D10A9808B138702FE02B -:109360004FF00201CDE900190DF1160352461E9986 -:109370000D98FFF77DFF1D980088401B801B83B26E -:10938000C6F1FF00984200D203461E990BA8D9B13E -:109390005FF00002DDF878C0CDE9032009EB06019B -:1093A00089B2CDE901C10F980090BDF816100022D6 -:1093B0000D9801F0C9FB387070B1C0B2832807D096 -:1093C000BDF8160020833AE00AEB09018A19E1E7AB -:1093D000022011B0BDE8F08FBDF82C00811901F01A -:1093E000FF08022D0DD09AF80120424506D1BDF8A4 -:1093F0002010814207D0B8F1FF0F04D09AF8018005 -:109400001FE08AF80180C94800680178052902D167 -:10941000BDF81610818009EB08001FFA80F905EBF2 -:10942000080085B2DDE90C1005AB0F9A01F00CFBCA -:1094300028B91D980088411B4145BFF671AF022D28 -:1094400013D0BBF1100F0CD1A9EB0800801C81B226 -:109450000220CDE9000105AB52461E990D98FFF799 -:1094600007FF1D980580002038700020B1E72DE926 -:10947000F8439C46089E13460027B26B9AB3491FD7 -:109480008CB2F18FA1F57F45FF3D05D05518AD8811 -:109490002944891D8DB200E000252919B6F83C80C9 -:1094A0000831414520D82A44BCF8011022F8021B9B -:1094B000BCF8031022F8021B984622F8024B914692 -:1094C00003F0E8FB4FF00C0C41464A462346CDF82A -:1094D00000C002F0F0FFF587B16B00202944A41D05 -:1094E0002144088003E001E0092700E08327384693 -:1094F000BDE8F88310B50B88848F9C420CD9846B2F -:10950000E018048844B1848824F40044A41D234452 -:109510000B801060002010BD0A2010BD2DE9F0471F -:109520008AB00025904689468246ADF81850072734 -:109530004BE0059806888088000446D4A8F80060AF -:1095400007A8019500970295CDE903504FF40073E9 -:1095500000223146504601F0F7FA04003CD1BDF834 -:109560001800ADF82000059804888188B44216D10F -:109570000A0414D401950295039521F40041009743 -:10958000049541F4804342882146504601F0B2F8E8 -:1095900004000BD10598818841F40041818005AA1F -:1095A00008A94846FFF7A6FF0400DCD000970598FD -:1095B00002950195039504950188BDF81C300022A1 -:1095C000504601F097F80A2C06D105AA06A948468C -:1095D000FFF790FF0400ACD0ADF8185004E00598F8 -:1095E000818821F40041818005AA06A94846FFF739 -:1095F00081FF0028F3D00A2C03D020460AB0BDE832 -:10960000F0870020FAE710B50C46896B86B051B19F -:109610000C218DF80010A18FADF80810A16B0191FD -:109620006946FCF7C3FA00204FF6FF71A063E1879B -:10963000A08706B010BD2DE9F0410D460746896BA5 -:109640000020069E1446002911D0012B0FD132466E -:1096500029463846FFF762FF002808D1002C06D0C3 -:10966000324629463846BDE8F04100F036BFBDE835 -:10967000F0812DE9FC411446DDE9087C0E46DDE968 -:109680000A15521DBCF800E092B2964502D207209E -:10969000BDE8FC81ACF8002017222A70A5F8016013 -:1096A000A5F803300522CDE900423B462A46FFF7E4 -:1096B000DFFD0020ECE770B50C461546482120463A -:1096C0000DF0E1FD04F1080044F81C0F00204FF6F6 -:1096D000FF71E06161842084A5841720E08494F800 -:1096E0002A0040F00A0084F82A0070BD4FF6FF728D -:1096F0000A800146042006F023BE30B585B00C4632 -:109700000546FFF780FFA18E284629B101218DF87B -:1097100000106946FCF74AFA0020E06220636063AB -:1097200005B030BDB0F84000704700004C0000208C -:1097300090F84620920703D4408808800020F3E781 -:109740000620F1E790F846209207EDD5A0F84410E6 -:10975000EAE70146002009880A0700D5012011F038 -:10976000F00F01D040F00200CA0501D540F004001E -:109770008A0501D540F008004A0501D540F01000E7 -:109780000905D1D540F02000CEE700B5034690F89A -:109790004600C00701D0062000BDA3F842101846BD -:1097A000FFF7D7FF10F03E0F05D093F8460040F0CA -:1097B000040083F8460013F8460F40F001001870CB -:1097C000002000BD90F84620520700D511B1B0F836 -:1097D0004200A9E71720A7E710F8462F61F3C3025C -:1097E0000270A1E72DE9FF4F9BB00E00DDE92B349D -:1097F000DDE92978289D24D02878C10703D000F01E -:109800003F00192801D9012100E000212046FFF77F -:10981000D9FFB04215D32878410600F03F010CD49F -:109820001E290CD0218811F47F6F0AD13A8842B1E9 -:10983000A1F57F42FF3A04D001E0122901D10006D0 -:1098400002D504201FB0C5E5F9491D984FF0000A64 -:1098500008718DF818A08DF83CA00FAA0A60ADF829 -:109860001CA0ADF850A02978994601F03F02701F66 -:109870005B1C04F1180C4FF0060E4FF0040BCDF8F2 -:1098800058C01F2A7ED2DFE802F07D7D107D267D44 -:10989000AC7DF47DF37DF27DF17DF47DF07D7D7D09 -:1098A000EF7DEE7D7D7D7D7DED0094F84610B5F871 -:1098B0000100890701D5032E02D08DF818B022E3EC -:1098C0004FF40061ADF85010608003218DF83C101A -:1098D000ADF84000D8E2052EEFD1B5F801002083A5 -:1098E000ADF81C00B5F80310618308B1884201D9B6 -:1098F00001207FE10020A07220814FF6FF702084BC -:10990000169801F09EF8052089F8000002200290C8 -:1099100083460AAB1D9A16991B9801F095F890BBE7 -:109920009DF82E00012804D0022089F801001020A3 -:1099300003E0012089F8010002200590002203A91C -:109940000BA804F016FEE8BB9DF80C0005998142B7 -:109950003DD13A88801CA2EB0B01814237DB029992 -:109960000220CDE900010DF12A034A4641461B9829 -:10997000FFF77EFC02980BF1020B801C80B217AA45 -:1099800003A901E0A0E228E002900BA804F0F1FD99 -:1099900002999DF80C00CDE9000117AB4A464146FB -:1099A0001B98FFF765FC9DF80C100AAB0BEB010050 -:1099B0001FFA80FB02981D9A084480B20290169903 -:1099C0001B9800E003E001F03FF80028B6D0BBF19F -:1099D000020F02D0A7F800B053E20A208DF8180059 -:1099E0004FE200210391072EFFF467AFB5F80100A5 -:1099F0002083ADF81C00B5F80320628300283FF4F3 -:109A000077AF90423FF674AF0120A072B5F8050021 -:109A100020810020A073E06900F050FD78B9E16971 -:109A200001208871E2694FF420519180E1698872C8 -:109A3000E06942F601010181E06900218173F01FB4 -:109A400020841E98606207206084169800F0F9FF59 -:109A5000072089F800000120049002900020ADF852 -:109A60002A0028E01DE2A3E13AE1EAE016E2AEE0D6 -:109A700086E049E00298012814D0E0698079012845 -:109A800003D1BDF82800ADF80E00049803ABCDE972 -:109A900000B04A4641461B98FFF7EAFB0498001DB8 -:109AA00080B20490BDF82A00ADF80C00ADF80E00AD -:109AB000059880B202900AAB1D9A16991B9800F087 -:109AC000C3FF28B902983988001D05908142D1D280 -:109AD0000298012881D0E0698079012805D0BDF87D -:109AE0002810A1F57F40FF3803D1BDF82800ADF85C -:109AF0000E00049803ABCDE900B04A4641461B98DE -:109B0000FFF7B6FB0298BBE1072E02D0152E7FF4BB -:109B1000D4AEB5F801102183ADF81C10B5F80320C0 -:109B2000628300293FF4E4AE91423FF6E1AE0121A9 -:109B3000A1724FF0000BA4F808B084F80EB0052E07 -:109B400007D0C0B2691DE26904F0F4FC00287FF47C -:109B500044AF4FF6FF70208401A906AA14A8CDF8DF -:109B600000B081E885032878214600F03F031D9A64 -:109B70001B98FFF795FB8246208BADF81C0080E117 -:109B80000120032EC3D14021ADF85010B5F80110CB -:109B90002183ADF81C100AAAB8F1000F00D00023F1 -:109BA000CDE9020304921D98CDF804800090388816 -:109BB0000022401E83B21B9800F0C6FF8DF81800EB -:109BC00090BB0B2089F80000BDF8280037E04FF06B -:109BD000010C052E9BD18020ADF85000B5F8011086 -:109BE0002183B5F803002084ADF81C10B0F5007F88 -:109BF00003D907208DF8180085E140F47C422284C7 -:109C00000CA8B8F1000F00D00023CDE90330CDE956 -:109C1000018C1D9800903888401E83B21B9800F07C -:109C200093FF8DF8180028B18328A8D10220BDE049 -:109C30004C0000200D2189F80010BDF83000401CB8 -:109C40001EE1032E04D248067FF537AE002017E14F -:109C5000B5F80110ADF81C102878400602D58DF833 -:109C60003CE002E007208DF83C004FF000080320A4 -:109C7000CDE902081E9BCDF810801D980193A6F136 -:109C8000030B00901FFA8BF342461B9800F032FD45 -:109C90008DF818008DF83C80297849060DD520886C -:109CA000C00506D5208BBDF81C10884201D1C4F830 -:109CB000248040468DF81880E2E0832801D14FF0DF -:109CC000020A4FF48070ADF85000BDF81C002083EC -:109CD000A4F820B01E986062032060841321CCE0B9 -:109CE000052EFFF4EAADB5F80110ADF81C10A28FF7 -:109CF00062B3A2F57F43FE3B28D008228DF83C20BA -:109D00004FF0000B0523CDE9023BDDF878C0CDF81C -:109D100010B01D9A80B2CDF804C040F40043009208 -:109D2000B5F803201B9800F0E5FC8DF83CB04FF42B -:109D300000718DF81800ADF85010832810D0F8B1DC -:109D4000A18FA1F57F40FE3807D0DCE00B228DF813 -:109D50003C204FF6FE72A287D2E7A4F83CB0D2E0D6 -:109D600000942B4631461E9A1B98FFF780FB8DF816 -:109D7000180008B183284BD1BDF81C00208355E79B -:109D800000942B4631461E9A1B98FFF770FB8DF806 -:109D90001800E8BBE18FA06B0844811D8DE88203A9 -:109DA0004388828801881B98FFF763FC824668E03D -:109DB00095F80180022E70D15FEA080002D0B8F158 -:109DC000010F6AD109208DF83C0007A800908DF89A -:109DD00040804346002221461B98FFF72CFC8DF85B -:109DE00042004FF0000B8DF843B050B9B8F1010FAD -:109DF00012D0B8F1000F04D1A18FA1F57F40FF3838 -:109E00000AD0A08F40B18DF83CB04FF4806000E0E4 -:109E100037E0ADF850000DE00FA91B98FBF7C6FE28 -:109E200082468DF83CB04FF48060ADF85000BAF136 -:109E3000020F06D0FB480068C07928B18DF81800E1 -:109E400027E0A4F8188044E0BAF1000F03D0812085 -:109E50008DF818003DE007A80090434601222146F6 -:109E60001B98FFF7E8FB8DF8180021461B98FFF7B9 -:109E7000CAFB9DF8180020B9192189F800100120AB -:109E800038809DF83C0020B10FA91B98FBF78EFE8F -:109E90008246BAF1000F33D01BE018E08DF818E0CD -:109EA00031E02078000712D5012E10D10A208DF85C -:109EB0003C00E088ADF8400004201B9906F040FA11 -:109EC0000820ADF85000C1E648067FF5F6AC4FF02B -:109ED000040A2088BDF8501008432080BDF85000C7 -:109EE00080050BD5A18FA1F57F40FE3806D11E98C5 -:109EF000E06228982063A6864FF0030A5046A1E44A -:109F00009DF8180078B1012089F80000297889F8B7 -:109F10000110BDF81C10A9F802109DF8181089F85E -:109F20000410052038802088BDF850108843208018 -:109F3000E4E72DE9FF4F8846087895B0012181407C -:109F40004FF20900249C0140ADF820102088DDF874 -:109F50008890A0F57F424FF0000AFF3A02D029B165 -:109F6000000703D5012019B0BDE8F08F239E4FF004 -:109F7000000B0EA886F800B018995D460988ADF868 -:109F80003410A8498DF81CB0179A0A718DF838B0B2 -:109F9000086098F8000001283BD0022809D0032867 -:109FA0006FD1307820F03F001D303070B8F80400D9 -:109FB000E08098F800100320022904D1317821F0C4 -:109FC0003F011B31317094F84610090759D505AB94 -:109FD000B9F1000F13D0002102AA82E80B0007207C -:109FE000CDE90009BDF83400B8F80410C01E83B2F2 -:109FF0000022159800F0A8FD0028D1D101E0F11C45 -:10A00000EAE7B8F80400A6F80100BDF81400C01C87 -:10A0100004E198F805108DF81C1098F80400012848 -:10A0200006D04FF4007A02282CD00328B8D16CE176 -:10A030002188B8F8080011F40061ADF8201020D094 -:10A0400017281CD3B4F84010814218D3B4F8441038 -:10A05000172901D3814212D1317821F03F01C91C67 -:10A060003170A6F801000321ADF83410A4F84400C3 -:10A0700094F8460020F0020084F8460065E10525CA -:10A080007EE177E1208808F1080700F4FE60ADF872 -:10A09000200010F0F00F1BD010F0C00F03D0388854 -:10A0A000228B9042EBD199B9B878C00710D0B9682B -:10A0B0000720CDE902B1CDF804B00090CDF810B082 -:10A0C000FB88BA883988159800F014FB0028D6D18F -:10A0D0002398BDF82010401C80294ED006DC1029A2 -:10A0E0000DD020290BD0402987D124E0B1F5807F05 -:10A0F0006ED051457ED0B1F5806F97D1DEE0C806B5 -:10A1000001D5082000E0102082460DA907AA0520ED -:10A11000CDE902218DF83800ADF83CB0CDE90496C8 -:10A1200008A93888CDE90001534607222146159831 -:10A13000FFF7B6F8A8E09DF81C2001214FF00A0AAD -:10A14000002A9BD105ABB9F1000F00D00020CDE96A -:10A1500002100720CDE90009BDF834000493401E29 -:10A1600083B2218B0022159800F0EEFC8DF81C00C4 -:10A170000B203070BDF8140020E09DF81C20012158 -:10A180004FF00C0A002A22D113ABB9F1000F00D016 -:10A190000020CDE902100720CDE900090493BDF8A5 -:10A1A0003400228C401E83B2218B159800F0CCFC29 -:10A1B0008DF81C000D203070BDF84C00401CADF82F -:10A1C000340005208DF83800208BADF83C00BCE051 -:10A1D0003888218B88427FF452AF9DF81C004FF0E5 -:10A1E000120A00281CD1606AA8B1B878C0073FF4F1 -:10A1F00046AF00E018E0BA680720CDE902B2CDF81A -:10A2000004B00090CDF810B0FB88BA88159800F023 -:10A2100071FA8DF81C00132030700120ADF8340065 -:10A2200093E000004C0000203988208B8142D2D17D -:10A230009DF81C004FF0160A0028A06B08D0E0B370 -:10A240004FF6FF7000215F46ADF808B0019027E09F -:10A2500068B1B978C907BED1E18F0DAB0844821D42 -:10A2600003968DE80C0243888288018809E0B8785B -:10A27000C007BCD0BA680DAB03968DE80C02BB8852 -:10A28000FA881598FFF7F5F905005ED0072D72D012 -:10A2900076E0019005AA02A92046FFF72BF90146B6 -:10A2A000E28FBDF80800824201D00029F1D0E08F92 -:10A2B000A16B084407800198E08746E09DF81C00E8 -:10A2C0004FF0180A40B1208BC8B13888208321464E -:10A2D0001598FFF798F938E004F118000090237EF4 -:10A2E000012221461598FFF7A6F98DF81C000028D9 -:10A2F000EDD1192030700120ADF83400E7E70525D5 -:10A3000021461598FFF77FF93AE0208800F40070A5 -:10A31000ADF8200050452DD1A08FA0F57F41FE392A -:10A3200001D006252CE0D8F808004FF0160A48B1F5 -:10A33000A063B8F80C10A1874FF6FF71E187A0F871 -:10A3400000B002E04FF6FF70A087BDF8200030F4A7 -:10A350007F611AD0782300220420159905F046FF6A -:10A3600098F8000020712088BDF820100843208054 -:10A370000EE000E007252088BDF8201088432080EB -:10A38000208810F47F6F1CD03AE02188814321801F -:10A390009DF8380020B10EA91598FBF707FC05467B -:10A3A0009DF81C000028EBD086F801A00120307039 -:10A3B000208B70809DF81C0030710520ADF83400B2 -:10A3C000DEE7A18EE1B118980DAB0088ADF834003E -:10A3D0002398CDE90304CDE90139206B0090E36AAD -:10A3E000179A1598FFF7FEF9054601208DF83800F9 -:10A3F0000EA91598FBF7DAFB00B10546A4F834B0B6 -:10A4000094F8460040070AD52046FFF7A2F910F05D -:10A410003E0F04D114F8460F20F004002070189865 -:10A42000BDF83410018028469DE500B585B00428AC -:10A4300006D102208DF8000088B26946FBF7B6FB12 -:10A4400005B000BD10B5384C0B782268012B02D046 -:10A45000022B2AD111E013780BB1052B01D1042373 -:10A46000137023688A889A802268CB88D3802268F8 -:10A470000B891381498951810DE08B889380226873 -:10A48000CB88D38022680B8913814B8953818B89B8 -:10A490009381096911612168FBF788FB226800211B -:10A4A0000228117003D0002800D0812010BD832025 -:10A4B00010BD806B002800D00120704781780129F1 -:10A4C00009D10088B0F5205F03D042F6010188422F -:10A4D00001D10020704707207047F0B587B00024F5 -:10A4E00015460E460746ADF8144010E00698018860 -:10A4F0002980811DCDE90241072101940494009136 -:10A50000838842880188384600F0F4F830B906AAFA -:10A5100005A93046FEF7EEFF0028E7D00A2800D153 -:10A52000002007B0F0BD00004C00002010B58B7873 -:10A5300083B102789A4205D10B885BB102E08B7936 -:10A54000091D4BB18B789A42F9D1B0F801300C88D3 -:10A55000A342F4D1002010BD812010BD072826D0D1 -:10A5600012B1012A27D103E0497801F0070102E086 -:10A570004978C1F3C20105291DD2DFE801F00318B3 -:10A58000080C12000AB1032070470220704704280B -:10A590000DD250B10DE0052809D2801E022808D343 -:10A5A00003E0062803D0032803D0052070470020CD -:10A5B00070470F20704781207047C0B282060BD4CD -:10A5C000000607D5FE48807A4143C01D01EBD0004C -:10A5D00080B27047084670470020704770B51388F6 -:10A5E0000B800B781C0625D5F54CA47A844204D840 -:10A5F00043F010000870002070BD956800F0070659 -:10A6000005EBD0052D78F54065F304130B70137836 -:10A61000D17803F0030341EA032140F20123B1FBA7 -:10A62000F3F503FB15119268E41D00FB012000EB1C -:10A63000D40070BD906870BD37B51446BDF80410E5 -:10A6400011809DF804100A061ED5C1F30013DC49E1 -:10A65000A568897A814208D8FE2811D1C91DC90888 -:10A660005A4228460CF0E5FD0AE005EBD00100F067 -:10A670000702012508789540A843934018430870C5 -:10A68000207820F0100020703EBD2DE9F0410746F3 -:10A69000C81C0E4620F00300B04202D08620BDE860 -:10A6A000F081C74D002034462E60AF802881AA7209 -:10A6B000E8801AE0E988491CE980810614D4E17831 -:10A6C00000F0030041EA002040F20121B0FBF1F26A -:10A6D00001FB12012068FFF770FF2989084480B24E -:10A6E0002881381A3044A0600C3420784107E1D426 -:10A6F0000020D4E72DE9FF4F89B01646DDE9168A20 -:10A700000F46994623F44045084600F00DFB04002F -:10A710000FD0099802F056F90290207800060AD569 -:10A72000A748817A0298814205D887200DB0BDE8FC -:10A73000F08F0120FAE7224601A90298FFF74EFFA9 -:10A74000834600208DF80C004046B8F1070F1AD060 -:10A7500001222146FFF702FF0028E7D120784006BA -:10A7600011D502208DF80C00ADF81070BDF8040072 -:10A77000ADF81200ADF814601898ADF81650CDF889 -:10A780001CA0ADF818005FEA094004D500252E464C -:10A79000A84601270CE02178E07801F0030140EAA7 -:10A7A000012040F20121B0FBF1F2804601FB12874B -:10A7B0005FEA494009D5B84507D1A178207901F071 -:10A7C000030140EA0120B04201D3BE4201D9072073 -:10A7D000ACE7A8191FFA80F9B94501D90D20A5E702 -:10A7E0009DF80C0028B103A90998FBF7DDF90028B2 -:10A7F0009CD1B84507D1A0784FEA192161F3010037 -:10A80000A07084F804901A9800B10580199850EA55 -:10A810000A0027D0199830B10BEB06002A46199987 -:10A820000CF090FC0EE00BEB06085746189E0998BA -:10A8300002F030FA2B46F61DB5B239464246009575 -:10A8400001F039FE224601A90298FFF7C7FE9DF8E4 -:10A850000400224620F010008DF80400DDE901100C -:10A86000FFF7EAFE002061E72DE9FF4FDFF8509186 -:10A8700082461746B9F80610D9F8000001EB4101ED -:10A8800000EB810440F20120B2FBF0F185B000FB47 -:10A8900011764D46DDF84C8031460698FFF78DFE67 -:10A8A00029682A898B46611A0C3101441144AB880E -:10A8B00089B28B4202D8842009B038E70699CDB21C -:10A8C000290603D5A90601D50620F5E7B9F806C083 -:10A8D0000CF1010C1FFA8CFCA9F806C0149909B1FF -:10A8E000A1F800C0A90602D5C4F8088007E010440A -:10A8F00080B2A9F80800191A01EB0B00A0602246EB -:10A90000FE200699FFF798FEE77026712078390A35 -:10A9100061F30100320AA17840F0040062F3010102 -:10A92000A17020709AF802006071BAF80000E0800F -:10A9300000262673280602D599F80A7000E0012740 -:10A94000A80601D54FF000084D4600244FF0070936 -:10A950000FE0CDE902680196CDF800900496E988F1 -:10A960002046129B089AFFF7C5FE0028A4D1641C5C -:10A97000E4B2BC42EDD300209EE72DE9F0478046CB -:10A9800000F0D2F9070005D0002644460C4D40F2F5 -:10A99000012919E00120BDE8F087204600F0C4F944 -:10A9A0000278C17802F0030241EA0222B2FBF9F315 -:10A9B00009FB13210068FFF700FE304486B201E076 -:10A9C0008C040020641CA4B2E988601E8142E4DC8F -:10A9D000A8F10100E8802889801B288100203870B8 -:10A9E000D9E710B5144631B1491E218001F0EAFFC4 -:10A9F000A070002010BD012010BD10B5D249044642 -:10AA00000088CA88904201D30A2010BD096800EB73 -:10AA1000400001EB80025079A072D08820819178AB -:10AA2000107901F0030140EA0120A081A078E11C27 -:10AA3000FFF7D4FD20612088401C2080E0800020AA -:10AA400010BD0121018270472DE9FF4F85B04FF6FF -:10AA5000FF788246A3F8008048681F460D4680783C -:10AA60008DF8060048680088ADF8040000208DF8D5 -:10AA70000A00088A0C88A04200D304462C8241E0D8 -:10AA8000288A401C2882701D6968FFF74FFDB8BBFB -:10AA90003988414501D1601E38806888A04236D38C -:10AAA000B178307901F0030140EA012901A9701D54 -:10AAB000FFF73CFD20BB298941452CD000223146BF -:10AAC0000798FFF74BFDD8B92989494518D1E9689E -:10AAD0000391B5F80AC0D6F808B05046CDF800C0CA -:10AAE00002F0D8F8DDF800C05A460CF1070C1FFA46 -:10AAF0008CFC4B460399CDF800C001F0A6FC50B188 -:10AB0000641CA4B2204600F00FF90600B8D1641E00 -:10AB10002C820A20D0E67C807079B871F088B880E9 -:10AB20003178F07801F0030140EA01207881A7F83C -:10AB30000C90504601F046FF324607F10801FFF73E -:10AB40004DFD38610020B7E62DE9FF4F87B0814603 -:10AB50001C469246DDF860B0DDF85480089800F09D -:10AB6000E3F805000CD0484601F02CFF29780906CF -:10AB700008D57549897A814204D887200BB0D6E57B -:10AB80000120FBE7CAF309062A4601A9FFF726FDC3 -:10AB90000746149807281CD000222946FFF7DEFC40 -:10ABA0000028EBD12878400613D501208DF8080045 -:10ABB0000898ADF80C00BDF80400ADF80E00ADF833 -:10ABC0001060ADF8124002A94846FAF7EDFF0028E0 -:10ABD000D4D12978E87801F0030140EA0121AA786C -:10ABE000287902F0030240EA0220564507D0B1F569 -:10ABF000007F04D9611E814201DD0B20BEE7864241 -:10AC000001D90720BAE7801B85B2A54200D92546A5 -:10AC1000BBF1000F01D0ABF80050179818B1B9196B -:10AC20002A460CF08FFAB8F1000F0DD03E4448468A -:10AC30004446169F02F040F82146FF1DBCB2324642 -:10AC40002B46009401F06BFC002097E72DE9F041C2 -:10AC500007461D461646084600F066F804000BD06D -:10AC6000384601F0AFFE2178090607D53649897AC2 -:10AC7000814203D8872012E5012010E522463146A3 -:10AC8000FFF7ACFC65B12178E07801F0030140EA00 -:10AC90000120B0F5007F01D8012000E000202870DD -:10ACA0000020FCE42DE9F04107461D461646084603 -:10ACB00000F03AF804000BD0384601F083FE21780A -:10ACC000090607D52049897A814203D88720E6E41E -:10ACD0000120E4E422463146FFF7AEFCFF2D14D0FC -:10ACE0002178E07801F0030240EA022040F20122DC -:10ACF000B0FBF2F302FB130015B900F2012080B2A1 -:10AD0000E070000A60F3010121700020C7E410B573 -:10AD10000C4600F009F828B1C18821804079A07064 -:10AD2000002010BD012010BD0749CA88824209D306 -:10AD300040B1096800EB40006FF00B0202EB8000AD -:10AD400008447047002070478C04002010B505F0BF -:10AD5000F6FCF7F781FE05F0B7FBBDE8104005F003 -:10AD600045BC70B50346002002466FF02F050EE08B -:10AD70009C5CA4F130060A2E02D34FF0FF3070BD68 -:10AD800000EB800005EB4000521C2044D2B28A4206 -:10AD9000EED370BD30B50A240AE0B0FBF4F304FB37 -:10ADA00013008D18303005F8010C521E1846D2B22F -:10ADB000002AF2D130BD30B500234FF6FF7510E008 -:10ADC000040A44EA002084B2C85C6040C0F3031463 -:10ADD000604005EA00344440E0B25B1C84EA401065 -:10ADE0009BB29342ECD330BD70B514460B88012260 -:10ADF000A240134207D113430B8001230922011DF6 -:10AE000001F0BBFC047070BD2DE9FF4F81B00878E4 -:10AE1000DDE90E7B9A4691460E4640072CD40198F8 -:10AE200001F04AFF040000D1FFDF07F104082046CB -:10AE30001FFA88F101F0A7F8050000D1FFDF2046D6 -:10AE400029466A4601F0F1FA0098A0F80370A0F8CC -:10AE500005A0284601F097FB017869F306016BF322 -:10AE6000C711017020461FFA88F101F0CFF800B930 -:10AE7000FFDF019800F04CFB06EB0900017E491C46 -:10AE8000017605B0BDE8F08F2DE9F84F0E469A46E1 -:10AE900091460746032101F0CBFD0446808CDFF884 -:10AEA0009085002518B198F80000B0421ED13846B0 -:10AEB00001F002FF070000D1FFDF09F1040138466D -:10AEC00089B201F060F8050010D0384629466A467C -:10AED00001F0ABFA009800210A460180817000F071 -:10AEE00089FB0098C01DCAF8000021E098F8000016 -:10AEF000B04216D104F1220734F8301F012000FAC5 -:10AF000006F911EA090F00D0FFDF2088012340EA8B -:10AF1000090020800922391D384601F049FC0670DD -:10AF200006E0324604F1300104F12200FFF75CFF35 -:10AF3000092188F800102846BDE8F88FFEB51446B0 -:10AF40000D46064602AB0C220621FFF79DFF0028A6 -:10AF500026D00299687812220A70801C4870082254 -:10AF60004A80A870208888806088C880A08808816E -:10AF7000E088488100240C20CDE900040523062246 -:10AF800029463046FFF740FF214666F31F41F02374 -:10AF90000022012005F02AF96878801C68700120E1 -:10AFA000FEBD10B50446032101F042FD014600F14B -:10AFB00010022046BDE81040C0E72DE9FE4381465F -:10AFC00050781646884640B1FFDF3168C8F8041053 -:10AFD0007168C8F80810BDE8FE83B778022417B17D -:10AFE000022F13D0FFDF251D2A4602AB072148465A -:10AFF000FFF74AFF0028E8D002980121022F0170D4 -:10B00000317841704480878002D005E00624EAE769 -:10B01000B188C180F18801810024CDE90054052365 -:10B02000072241464846FFF7EFFE88F80440D2E782 -:10B0300010B50446032101F0FBFC0146021D204629 -:10B04000BDE81040B9E7FA4A0020092111707047A5 -:10B0500070B50C461546342120460CF014F9012039 -:10B060006070092104F118000CF00DF905B9FFDF3B -:10B070002978207861F30100207070BD70470021AD -:10B0800010B560F31F41012005F05AF9002010BDF2 -:10B09000FEB506460F0CFCF7A1FE050007D06F8039 -:10B0A0000321384601F0C4FC040008D106E003B0D7 -:10B0B0003846BDE8F0401321F7F7D9B9FFDF012E7C -:10B0C00001D0FFDFFEBD20782A4620F00800207066 -:10B0D00002208DF800004FF6FF70ADF80200ADF8C9 -:10B0E000040069463846F6F784FDFEBD00B5FFDF73 -:10B0F000002000BD2DE9FC410C461E461746804647 -:10B10000032101F095FC0546092C0AD2DFE804F082 -:10B1100005050505050509090700042303E00623C5 -:10B1200001E0FFDF0023CDE90076224629464046B4 -:10B13000FFF76AFEBDE8FC8138B50546A0F57F4003 -:10B14000FF381CD0284601F0A5FD040000D1FFDF28 -:10B15000204601F048F9002810D001466A462046F2 -:10B1600001F063F900980321B0F80540284601F08A -:10B170005FFC052C03D1007908B1002038BD012007 -:10B1800038BD2DE9F041044686B0408801F082FDCB -:10B19000050000D1FFDF03AA2846616800F038F9F6 -:10B1A000039D001F80B235F8032F698882420AD1BF -:10B1B00004290BD0052918D0062904D16088291D3F -:10B1C0006368F8F771FA06B0BDE8F08116462D1DE8 -:10B1D000224629463046F9F7F1FF0828F3D12246E6 -:10B1E00029463046FBF707F8EDE71646608803214D -:10B1F00001F01EFC00218DF80010042EE3D36A79C3 -:10B20000002AE0D02B7902274FF6FF78012B28D0B7 -:10B21000122B01D0132B0BD00491059169798DF875 -:10B2200010106388014604AA1846FFF7C6FECAE755 -:10B2300083789342C7D102781307C4D5062EC2D1B2 -:10B2400022F008020270608860F31F41012005F0BF -:10B2500077F88DF80070ADF802802889ADF8040009 -:10B2600017E0062EAFD383789342ACD10278130750 -:10B27000A9D522F008020270608860F31F41012006 -:10B2800005F05EF88DF800702889ADF80200ADF881 -:10B290000480608822466946F6F7ABFC93E770B5F8 -:10B2A0000D460646032101F0C3FB040004D02078BC -:10B2B000000704D5112070BD43F2020070BD2A467C -:10B2C00021463046FFF73AFE18B9286820616868C1 -:10B2D0006061207840F008002070002070BD2DE9EA -:10B2E000F04F0E4691B08046032101F0A1FB0446C9 -:10B2F000404601F0E1FC07460020079008900990C5 -:10B30000ADF830000A9002900390049004B9FFDF7A -:10B310000DF10809FFB9FFDF1DE038460BA9002237 -:10B3200000F024FF9DF82C0000F07F05092D00D3CC -:10B33000FFDF6019017E491E01769DF82C00000692 -:10B3400009D52A460CA907A8FFF74EFD19F80510E4 -:10B35000491C09F80510761EF6B2DED204F1300061 -:10B36000334D04F1220BDFF8CCA004F12607069040 -:10B3700010E05846069900F04DF806462870092856 -:10B3800000D3FFDF5AF8261040468847608CC05D26 -:10B39000B04202D0A08C0028EBD109202870254DA6 -:10B3A0004E4624350EE00CA907A800F033F80446F9 -:10B3B000375D55F8240000B9FFDF55F824203946E1 -:10B3C00040469047BDF81E000028ECD111B059E569 -:10B3D00010B5032101F02CFB040000D1FFDF09218F -:10B3E00004F118000BF04FFF207840F004002070AB -:10B3F00010BD10B50C46032101F01AFB01190A7E9D -:10B4000001211AB9008EA140084000D0012010BDD2 -:10B4100001F00BB810B50C4601230922011D01F003 -:10B42000E2F900782188012282409143218010BDF9 -:10B4300054000020107601002DE9FC470C4606461A -:10B44000694600F01DFD002860D106F07BF8B0428F -:10B450005CD02146304608F029FC28BB019D95F8B8 -:10B46000E400383518B9A87E08B1012000E00020BA -:10B47000814695F835004FF000084FF0010AA0B161 -:10B4800095F83600800710D584F8018084F800A074 -:10B4900084F80280A68095F83710A171298F218148 -:10B4A000698F618185F835802DE0304601F004FC1C -:10B4B000070000D1FFDF384600F032FE40B184F8CB -:10B4C00001800E212170A680E08084F802A01AE09D -:10B4D000304601F0DFFB070000D1FFDFB9F1000FBC -:10B4E00014D0384600F073FE80B1304605F0F5FE0A -:10B4F00084F801800B21217084F80280A680E97E07 -:10B50000A17185F81A800120BDE8FC870020FBE7C7 -:10B510001CB5694600F0B4FC00B1FFDF684600F0DE -:10B52000BCFCFA4900208968A1F8AA001CBD2DE9DD -:10B53000FC4104460E46062001F026FA0025074687 -:10B54000A846064417E02088401C80B22080B04204 -:10B5500002D34046A4F8008080B2B84204D3B0427F -:10B5600002D20020BDE8FC81694600F089FC002879 -:10B57000F8D06D1CEDB2AE42E5D84FF6FF702080DA -:10B580001220EFE710B505F019FF09F0EBFEE048D7 -:10B590004FF6FF711B228182C182002101708170F0 -:10B5A00082804FF4A471C18002814181032303731F -:10B5B000042141730146CA810A82438210BD70B5DD -:10B5C000D24C0D466060217005F085FE00F071FCE4 -:10B5D000FFF7D8FF207809F0B9F9284607F051F9AC -:10B5E00005F0F0FF2178606808F021FCBDE87040AC -:10B5F00009F0B8BE10B501240AB1002010BD21B178 -:10B60000012903D00024204610BD02210AF0DCFBF2 -:10B61000F9E72DE9F041040000D1FFDFBC48022129 -:10B6200016308046FFF783FF00B1FFDFB84D0620DC -:10B63000EF8A01F0A9F90646E88AB0421AD12046FD -:10B6400005F038FFE8B12078132817D1A0783C28FE -:10B6500014D1A088062101F0EBF9050000D1FFDF2D -:10B66000288805F03AFEA088062101F0F3F928B1F8 -:10B67000FFDF03E02146FFF7DFFE10B10120BDE848 -:10B68000F08102214046FFF752FF10B9E88AB84224 -:10B69000D2D10020F3E710B500F0CEFB08B10C20AA -:10B6A00010BD09F096FE002010BD10B504460078CC -:10B6B00018B1012801D0122010BD00F0C8FB20B144 -:10B6C00009F0E4FE08B10C2010BD207800F09EFBCC -:10B6D000E21D04F11703611CBDE8104009F08EBEA5 -:10B6E00010B50446007818B1012801D0122010BD11 -:10B6F00000F0A2FB08B10C2010BD207800F086FB02 -:10B70000611C09F042FE08B1002010BD072010BDE9 -:10B7100010B509F0BFFE08B1002010BD302010BDEB -:10B7200010B5044600F093FB08B10C2010BD204674 -:10B7300009F0A8FE002010BD10B500F088FB20B174 -:10B7400009F0A4FE08B10C2010BD09F08DFE002008 -:10B7500010BDFF2181704FF6FF7181806B494968F0 -:10B760000A7882718A880281498841810121417069 -:10B770000020704710B510F1080F17D00CDC10F145 -:10B78000280F13D010F1140F10D010F1100F0DD09E -:10B7900010F10C0F08D109E010F1040F06D028B108 -:10B7A000032803D0042801D0122010BD05F0B7F8FB -:10B7B000002010BD10B5134601220AF097F80020B2 -:10B7C00010BD10B5044600F042FB08B10C2010BDBE -:10B7D0002146002005F0F3FD002010BD10B5044601 -:10B7E00007F091FA20B1207807F07CF8002010BD16 -:10B7F0000C2010BD10B5044600F029FB08B10C2048 -:10B8000010BD2146012005F0DAFD002010BD38B53D -:10B8100004464FF6FF70ADF80000A079E179884248 -:10B8200013D021791F2910D861791F290DD8002242 -:10B8300011460AF023FF40B90022E07911460AF0D0 -:10B840001DFF10B9207A072801D9122038BD07F052 -:10B8500066FA48B900216846FFF769FE20B1204624 -:10B8600004F09CFF002038BD0C2038BD2DE9FC41C0 -:10B87000817804461A2925D00EDC16292DD2DFE85E -:10B8800001F02C2C2C2C2C212C2C2C2C2C2C2C2C6A -:10B890002C2C2C2C2C2121212A291ED00BDCA1F1AF -:10B8A0001E010C2919D2DFE801F018181818181811 -:10B8B00018181818180D3A3904290ED2DFE801F0CB -:10B8C0000D020D022088B0F5706F06D2012769467F -:10B8D00000F0D6FA18B1022044E6122042E6019D9B -:10B8E00068462E4605F5A37506F2471600F0B6FA2F -:10B8F00008B1287808B10C2034E62F70A078307099 -:10B90000684600F0CAFA00202CE60000580000202B -:10B91000980400201CB50C46694600F0B1FA0021DD -:10B9200018B12160217102201CBD019802463830F7 -:10B9300080F83E1093682360137B237190F83E30AB -:10B94000002BF5D100201CBD10B5044600F07FFA95 -:10B9500020B109F09BFD08B10C2010BD207800F04B -:10B9600055FAE279611C09F06AFE08B1002010BDA9 -:10B97000022010BD7CB504460088694600F080FABC -:10B98000020025D1A17801B90321E07800B9032094 -:10B99000019D0024012385F86931019D95F89A5194 -:10B9A0003DB9019D95F868511DB9019D95F85B5011 -:10B9B0000DB13A2208E0019D85F86831019B83F8BA -:10B9C0006A11019981F86B01019880F8694110466C -:10B9D0007CBD8178CA0802D1C278D30801D0122078 -:10B9E0007047490701D4510701D511207047C1E7BD -:10B9F00030B5428840F67B43911F994219D2818825 -:10BA00008C1F9C4215D28A4213D8C288B2F5FA7FA5 -:10BA10000FD2038940F67745A3F10A04AC4208D25D -:10BA2000521C4A43B2EB830F03DA41898089814279 -:10BA300001D9302030BD002030BD10B5044607F0DC -:10BA40006EF908B10C2010BD6079032824D8A179C3 -:10BA5000012921D8A17B03291ED8617BE1B10729E7 -:10BA60001AD82179052917D2DFE801F0030C030366 -:10BA700003002288202A0FD361888A420CD8B1F5AE -:10BA8000804F09D805F0F8FDFA4920794870204622 -:10BA9000BDE8104005F0B8BE122010BD10B51F283B -:10BAA00001D9122010BD05F029FF002010BD10B5EE -:10BAB0001F2801D9122010BD05F00FFF002010BD76 -:10BAC0007CB5012802D0002853D066E005F084FD43 -:10BAD000002862D005F0B6FD00285ED007F01FF9FF -:10BAE000F0BB05F02FFDA0F57F41FF3947D105F0F0 -:10BAF00041FEE04E707848B1012807D0042805D0F7 -:10BB0000002006F0F2FE60B3FFDF44E000220621D1 -:10BB100001A800F05FFF050029D0D7480321856008 -:10BB2000284609F03AFE284605F0EDFFD14C708A10 -:10BB3000012106F099FF0146A8620022284606F07E -:10BB4000E0FA228AE189707B0090337B288801F03B -:10BB50002AF800B1FFDF288805F0BEFB284601E087 -:10BB60000DE018E006F0C1FEA8B1FFDF13E00920E8 -:10BB70007CBD06F0A7FA044606F05CFE08B10C2076 -:10BB80007CBD44B1208805F0A8FB2088062100F088 -:10BB900061FF00B1FFDF00207CBD12207CBD70B5CD -:10BBA0000D46062100F044FF040003D094F849013B -:10BBB00010B10AE0022070BD94F84400142801D0AE -:10BBC000152802D194F8800108B10C2070BD102214 -:10BBD000294604F5A5700BF0B5FA012084F8490157 -:10BBE000002070BD10B5062100F022FF18B190F8BA -:10BBF000491111B107E0022010BD90F8441014293A -:10BC000003D0152901D00C2010BD022180F8491164 -:10BC1000002010BD2DE9FC410D464BF6803212216B -:10BC2000954213D895B1694600F02AF900280CD145 -:10BC3000019EB41C383627882A463946304609F01A -:10BC4000A2FD2088B842F6D100208BE4084689E4A2 -:10BC50001CB504460088694600F012F9002811D18D -:10BC600001987F22014680F8402080F84120002280 -:10BC700080F84220A07801F82C0FE07848702079F5 -:10BC8000887010461CBD1CB50C46694600F0F8F8DB -:10BC9000002806D1019890F8520000B101202070D0 -:10BCA00000201CBD1CB50C46694600F0E9F80028D0 -:10BCB00005D1019890F82C00012801D00C201CBD62 -:10BCC000019890F84000207000201CBD70B50D4612 -:10BCD0001646062100F0ACFE18B381880124C38803 -:10BCE000428804EB4104AC4217D842F2107463431B -:10BCF000A4106243B3FBF2F2521E94B24FF4FA72F4 -:10BD0000944200D91446A54200D22C46491C641C1A -:10BD1000B4FBF1F24A43521E91B290F86C211AB969 -:10BD200001E0022070BD01843180002070BD10B59B -:10BD30000C46062100F07CFE48B180F8B74024B1E3 -:10BD400090F8B51009B106F0ACFE002010BD02203D -:10BD500010BD017889B1417879B141881B290CD394 -:10BD600081881B2909D3C188022906D34149026869 -:10BD7000CA6040680861002070471220704710B503 -:10BD800006F041FE002010BD70B514460A46064676 -:10BD900000250121104606F067FE002800D828463D -:10BDA00005460121304600F038F806460121002002 -:10BDB00000F033F83118012296318D4206D901F195 -:10BDC0009600691AB1FBF0F0401C82B2228000207C -:10BDD00070BD10B5044600F03AF808B10C2010BD53 -:10BDE000601C09F019FC207800F0010005F047FC08 -:10BDF000002010BD10B5044606F091FF08B10C20DC -:10BE000010BD204605F08AFD002010BD18B10228A3 -:10BE100001D0012070470020704710B5012904D0DF -:10BE2000022905D0FFDF204610BDC000503001E0E0 -:10BE300080002C3084B2F6E710B506F070FF20B118 -:10BE400005F0F9FB08B1012010BD002010BD10B5B0 -:10BE500006F065FF002800D0012010BD416891F870 -:10BE6000E40091F8521049B940B1042806D00120ED -:10BE70007047000098040020580000200020F7E7D9 -:10BE800010B50C46062100F0D3FD606018B101200A -:10BE90002070002010BD022010BD416891F8B5202F -:10BEA000002AE5D0002281F8B520406806F0F9BDEF -:10BEB000DEE708B54FF6FF70ADF8000006E006219A -:10BEC000BDF8000000F0C6FD00B1FFDF00216846AC -:10BED000FFF72DFB0028F2D008BD000030B5058823 -:10BEE00025F4004421448CB24FF4004194420AD21C -:10BEF000121B92B21B339A4201D2A94307E005F408 -:10BF00000041214303E0A21A92B2A94311430180E8 -:10BF100030BD0844083050434A31084480B270476D -:10BF200070B51D4616460B46044629463046049A0F -:10BF3000FFF7EFFF0646B34200D2FFDF282120467D -:10BF40000BF0A1F94FF6FF70A082283EB0B26577E2 -:10BF50006080B0F5004F00D9FFDF618805F13C003B -:10BF6000814200D2FFDF60880835401B343880B240 -:10BF700020801B2800D21B2020800020A07770BDCD -:10BF80008161886170472DE9F05F0D46C1880446E4 -:10BF900000F12809008921F4004620F4004800F04F -:10BFA00062FB10B10020BDE8F09F4FF0000A4FF097 -:10BFB000010BB0450CD9617FA8EB0600401A083888 -:10BFC000854219DC09EB06000021058041801AE05A -:10BFD0006088617F801B471A083F0DD41B2F00DA51 -:10BFE000FFDFBD4201DC294600E0B9B2681A020455 -:10BFF000120C04D0424502DD84F817A0D2E709EB09 -:10C0000006000180428084F817B0CCE770B5044682 -:10C0100000F12802C088E37D20F400402BB11044D9 -:10C020000288438813448B4201D2002070BD002552 -:10C030008A4202D30180458008E0891A0904090C6C -:10C04000418003D0A01D00F01EFB08E0637F008844 -:10C050000833184481B26288A01DFFF73FFFE575E1 -:10C06000012070BD70B5034600F12804C5888088A2 -:10C0700020F400462644A84202D10020188270BD58 -:10C0800098893588A84206D3401B75882D1A20440C -:10C09000ADB2C01E05E02C1AA5B25C7F204430442E -:10C0A000401D0C88AC4200D90D809C8924B100242D -:10C0B00014700988198270BD0124F9E770B504462F -:10C0C00000F12801808820F400404518208A0028CB -:10C0D00025D0A189084480B2A08129886A881144AA -:10C0E000814200D2FFDF2888698800260844A189A0 -:10C0F000884212D1A069807F2871698819B1201DFA -:10C1000000F0C1FA08E0637F28880833184481B240 -:10C110006288201DFFF7E2FEA6812682012070BD05 -:10C120002DE9F041418987880026044600F1280561 -:10C13000B94218D004F10A0821F40040284441888B -:10C1400019B1404600F09FFA08E0637F0088083389 -:10C15000184481B262884046FFF7C0FE761C6189B0 -:10C16000B6B2B942E8D13046BDE8F0812DE9F041E0 -:10C1700004460B4627892830A68827F40041B4F8E6 -:10C180000A8001440D46B74201D10020ECE70AB114 -:10C19000481D106023B1627F691D18460AF0D2FF66 -:10C1A0002E88698804F1080021B18A1996B200F03E -:10C1B0006AFA06E0637F62880833991989B2FFF74B -:10C1C0008DFE474501D1208960813046CCE78188CA -:10C1D000C088814201D10120704700207047018949 -:10C1E0008088814201D1012070470020704770B5DE -:10C1F0008588C38800F1280425F4004223F4004117 -:10C2000014449D421AD08389058A5E192588638863 -:10C21000EC18A64214D313B18B4211D30EE0437F26 -:10C2200008325C192244408892B2801A80B22333CB -:10C23000984201D211B103E08A4201D1002070BDC1 -:10C24000012070BD2DE9F0478846C1880446008969 -:10C2500021F4004604F1280720F4004507EB060905 -:10C2600000F001FA002178BBB54204D9627FA81B17 -:10C27000801A002503E06088627F801B801A0838DE -:10C2800023D4E28962B1B9F80020B9F802303BB199 -:10C29000E81A2177404518DBE0893844801A09E024 -:10C2A000801A217740450ADB607FE18908303044FD -:10C2B00039440844C01EA4F81280BDE8F087454503 -:10C2C00003DB01202077E7E7FFE761820020F4E746 -:10C2D0002DE9F74F044600F12805C088884620F470 -:10C2E000004A608A05EB0A0608B1404502D20020E8 -:10C2F000BDE8FE8FE08978B13788B6F8029007EB89 -:10C300000901884200D0FFDF207F4FF0000B50EA88 -:10C31000090106D088B33BE00027A07FB946307101 -:10C32000F2E7E18959B1607F29440830504408445C -:10C33000B4F81F1020F8031D94F821108170E289D1 -:10C3400007EB080002EB0801E1813080A6F802B09B -:10C3500002985F4650B1637F30880833184481B239 -:10C360006288A01DFFF7BAFDE78121E0607FE189C7 -:10C3700008305044294408442DE0FFE7E089B4F830 -:10C380001F102844C01B20F8031D94F82110817051 -:10C3900009EB0800E28981B202EB0800E0813780F6 -:10C3A00071800298A0B1A01D00F06DF9A4F80EB044 -:10C3B000A07F401CA077A07D08B1E088A08284F80F -:10C3C00016B000BFA4F812B084F817B001208FE7B0 -:10C3D000E0892844C01B30F8031DA4F81F108078A2 -:10C3E00084F82100EEE710B5818800F1280321F4DC -:10C3F00000442344848AC288A14212D0914210D0C2 -:10C40000818971B9826972B11046FFF7E8FE50B9AF -:10C410001089283220F400401044197900798842AC -:10C4200001D1002010BD184610BD00F12803407F47 -:10C4300008300844C01E1060088808B9DB1E13606D -:10C4400008884988084480B270472DE9F04100F11E -:10C450002806407F1C4608309046431808884D88BF -:10C46000069ADB1EA0B1C01C80B2904214D9801A7B -:10C47000A04200DB204687B298183A4641460AF0AF -:10C4800035FE002816D1E01B84B2B844002005E038 -:10C49000ED1CADB2F61EE8E7101A80B20119A942F0 -:10C4A00006D8304422464146BDE8F0410AF01EBE9F -:10C4B0004FF0FF3058E62DE9F04100F12804407FAD -:10C4C0001E46083090464318002508884F88069A73 -:10C4D000DB1E90B1C01C80B2904212D9801AB042CB -:10C4E00000DB304685B299182A4640460AF02AFEFB -:10C4F000701B86B2A844002005E0FF1CBFB2E41EFA -:10C50000EAE7101A80B28119B94206D821183246DA -:10C5100040460AF017FEA81985B2284624E62DE900 -:10C52000F04100F12804407F1E4608309046431831 -:10C53000002508884F88069ADB1E90B1C01C80B287 -:10C54000904212D9801AB04200DB304685B298186A -:10C550002A4641460AF0F6FD701B86B2A844002028 -:10C5600005E0FF1CBFB2E41EEAE7101A80B2811991 -:10C57000B94206D82044324641460AF0E3FDA819E4 -:10C5800085B22846F0E5401D704710B5044600F11D -:10C590002801C288808820F400431944904206D0C4 -:10C5A000A28922B9228A12B9A28A904201D100201E -:10C5B00010BD0888498831B1201D00F064F80020C2 -:10C5C0002082012010BD637F62880833184481B245 -:10C5D000201DFFF783FCF2E70021C1810177418232 -:10C5E000C1758175704703881380C28942B1C288C2 -:10C5F00022F4004300F128021A440A60C0897047FF -:10C600000020704710B50446808AA0F57F41FF39AD -:10C6100000D0FFDFE088A082E08900B10120A07592 -:10C6200010BD4FF6FF71818200218175704710B5F2 -:10C630000446808AA0F57F41FF3900D1FFDFA07D4D -:10C6400028B9A088A18A884201D1002010BD01200C -:10C6500010BD8188828A914201D1807D08B100207D -:10C6600070470120704720F4004221F400439A42B1 -:10C6700007D100F4004001F40041884201D00120BC -:10C6800070470020704730B5044600880D4620F4FE -:10C690000040A84200D2FFDF21884FF400408843C9 -:10C6A0002843208030BD70B50C00054609D0082C09 -:10C6B00000D2FFDF1DB1A1B2286800F044F8201DB0 -:10C6C00070BD0DB100202860002070BD00210268FF -:10C6D00003E093881268194489B2002AF9D100F066 -:10C6E00032B870B500260D460446082900D2FFDF97 -:10C6F000206808B91EE0044620688188A94202D05B -:10C7000001680029F7D181880646A94201D1006855 -:10C710000DE005F1080293B20022994209D32844A2 -:10C72000491B0260818021680968216001602060E6 -:10C7300000E00026304670BD00230B608A8002684E -:10C740000A600160704700234360021D018102609E -:10C750007047F0B50F460188408815460C181E46F4 -:10C76000AC4200D3641B3044A84200D9FFDFA019BB -:10C77000A84200D9FFDF3819F0BD2DE9F041884605 -:10C7800006460188408815460C181F46AC4200D367 -:10C79000641B3844A84200D9FFDFE019A84200D941 -:10C7A000FFDF70883844708008EB0400BDE8F0813A -:10C7B0002DE9F041054600881E461746841B884631 -:10C7C000BC4200D33C442C8068883044B84200D935 -:10C7D000FFDFA019B84200D9FFDF688830446880C5 -:10C7E00008EB0400E2E72DE9F04106881D46044607 -:10C7F000701980B2174688462080B84201D3C01B0A -:10C8000020806088A84200D2FFDF7019B84200D9AA -:10C81000FFDF6088401B608008EB0600C6E7000071 -:10C820002DE9F041BF4D04469046A8780E46A0423F -:10C8300000D8FFDF05EB8607786A50F8240000B1C6 -:10C84000FFDFB868002816D0304600F032F9014604 -:10C85000B868FFF746FF05000CD0786A072E40F84D -:10C86000245000D3FFDFB0484246294650F8263016 -:10C87000204698472846BDE8F0812DE9F843050099 -:10C880000C46009524D00026E81C20F00300A842A6 -:10C8900000D0FFDFDFF88C820027314688F8007077 -:10C8A00088F8014088F8024088F8034088F804407E -:10C8B00088F8054088F80640684600F003F9002033 -:10C8C00042460099C91C21F00301009116B10FE006 -:10C8D0000126D9E702EB80035962002106E000BF80 -:10C8E000D3F824C04CF82170491CC9B2A142F7D337 -:10C8F0000099401C01EB8401C0B200910728E0D3ED -:10C90000481BBDE8F88310B5044603F08BFD08B161 -:10C91000102010BD2078834A618802EB8000927855 -:10C920000EE0436A53F8213043B14A1C6280A18073 -:10C93000406A50F82100A060002010BD491C89B257 -:10C940008A42EED86180052010BD70B505460C46C0 -:10C95000084603F067FD08B1102070BD072D01D314 -:10C96000072070BD25700020608070BD0EB569463F -:10C97000FFF7EBFF00B1FFDF6846FFF7C4FF08B128 -:10C9800000200EBD01200EBD10B50446072800D3BF -:10C99000FFDF6448005D10BD3EB5054600246946D2 -:10C9A000FFF7D3FF18B1FFDF01E0641CE4B2684673 -:10C9B000FFF7A9FF0028F8D02846FFF7E5FF001B86 -:10C9C000C0B23EBD57498978814201D9C0B2704793 -:10C9D000FF2070472DE9F04106291BD1514C00275B -:10C9E0003B464FF6FF7604EB810514F801C00AE0E0 -:10C9F000DC19D5F824E0A4B25EF824E0BEF1000F03 -:10CA000004D05B1C9BB29C45F2D83446048020467F -:10CA1000B44201D100202EE7BDE8F04100E7A0F5C7 -:10CA20007F43FF3B01D0072901D300207047F7E681 -:10CA3000A0F57F42FF3A0BD0072909D2394A9378F3 -:10CA4000834205D902EB8101496A51F82000704701 -:10CA5000002070472DE9F04104460D46A4F57F41C2 -:10CA600043F20200FF3902D0072D01D3072002E76D -:10CA70002C494FF000088A78A242F8D901EB8506CC -:10CA8000726A52F82470002FF1D0274839461C30C2 -:10CA900050F8252020469047716A284641F82480A6 -:10CAA00000F007F802463946B068FFF745FE00205F -:10CAB000E1E61D49383131F810004FF6FC71C01C19 -:10CAC000084070472DE9F843164E88460546002475 -:10CAD0002868C01C20F0030028602046FFF7E9FF0B -:10CAE000315D4843B8F1000F01D0002200E02A6810 -:10CAF0000146009232B100274FEA0D00FFF7D3FD47 -:10CB00001FB106E001270020F8E706EB8401009A38 -:10CB10008A602968641C0844E4B22860072CD7D3D3 -:10CB2000EFE60000B00400205876010070B50E4614 -:10CB30001D46114600F0D4F804462946304600F060 -:10CB4000D8F82044001D70BD2DE9F04190460D46F7 -:10CB500004004FF0000610D00027E01C20F0030076 -:10CB6000A04200D0FFDFDDB141460020FFF79BFD72 -:10CB70000C3000EB850617B112E00127EDE7614F9D -:10CB800004F10C00A9003C602572606000EB850098 -:10CB9000206060680AF077FB41463868FFF783FD44 -:10CBA0003046BDE8F0812DE9FF4F564C804681B0FC -:10CBB00020689A46934600B9FFDF2068027A424512 -:10CBC00003D9416851F8280020B143F2020005B0B2 -:10CBD000BDE8F08F5146029800F082F886B25846C0 -:10CBE0000E9900F086F885B27019001D87B2206892 -:10CBF000A14639460068FFF774FD04001FD0678026 -:10CC000025802946201D0E9D07465A460123009582 -:10CC1000FFF786F92088314638440123029ACDF87F -:10CC200000A0FFF77DF92088C1193846FFF7A8F961 -:10CC3000D9F800004168002041F82840C7E70420E7 -:10CC4000C5E770B52F4C0546206800B9FFDF2068A6 -:10CC5000017AA9420ED9426852F8251051B1002339 -:10CC600042F825304A880068FFF766FD21680020F9 -:10CC70000A7A08E043F2020070BD4B6853F8203096 -:10CC800033B9401CC0B28242F7D80868FFF71EFDD6 -:10CC9000002070BD70B51B4E05460024306800B9F9 -:10CCA000FFDF3068017AA94204D9406850F82500B6 -:10CCB00000B1041D204670BD70B5124E054600241B -:10CCC000306800B9FFDF3068017AA94206D94068B0 -:10CCD00050F8251011B131F8040B4418204670BDEE -:10CCE00010B50A460121FFF714F9C01C20F003001B -:10CCF00010BD10B50A460121FFF70BF9C01C20F04A -:10CD0000030010BD6400002070B50446C2F1100598 -:10CD100028190AF017FA15F0FF0108D0491EC9B208 -:10CD2000802060542046BDE870400AF08ABA70BD89 -:10CD300030B505E05B1EDBB2CC5CD55C6C40C45406 -:10CD4000002BF7D130BD10B5002409E00B78521E3E -:10CD500044EA430300F8013B11F8013BD2B2DC097D -:10CD6000002AF3D110BD2DE9F04389B01E46DDE95C -:10CD7000107990460D00044622D002460846F94933 -:10CD8000FEF718FD102221463846FFF7DCFFE07B56 -:10CD9000000606D5F34A3946102310320846FFF73D -:10CDA000C7FF102239464846FFF7CDFFF87B000643 -:10CDB00006D5EC4A4946102310320846FFF7B8FF63 -:10CDC000102120460AF03DFA0DE0103EB6B208EB05 -:10CDD0000601102322466846FFF7AAFF224628468E -:10CDE0006946FEF7E7FC102EEFD818D0F2B24146A4 -:10CDF0006846FFF789FF10234A46694604A8FFF7F3 -:10CE000097FF1023224604A96846FFF791FF2246A8 -:10CE100028466946FEF7CEFC09B0BDE8F083102332 -:10CE20003A464146EAE770B59CB01E4605461346B1 -:10CE300020980C468DF80800202219460DF10900B3 -:10CE40000AF080F9202221460DF129000AF07AF932 -:10CE500017A913A8CDE90001412302AA31462846AB -:10CE6000FFF781FF1CB070BD2DE9FF4F9FB014AEDE -:10CE7000DDE92D5410AFBB49CDE9007620232031E8 -:10CE80001AA8FFF770FF4FF000088DF808804FF0E8 -:10CE900001098DF8099054F8010FCDF80A00A08817 -:10CEA000ADF80E0014F8010C1022C0F340008DF80C -:10CEB000100055F8010FCDF81100A888ADF8150045 -:10CEC00015F8010C2C99C0F340008DF8170006A846 -:10CED00082460AF037F90AA88346102222990AF0FE -:10CEE00031F9A0483523083802AA40688DF83C8003 -:10CEF000CDE900760E901AA91F98FFF734FF8DF840 -:10CF000008808DF809902068CDF80A00A088ADF857 -:10CF10000E0014F8010C1022C0F340008DF8100030 -:10CF20002868CDF81100A888ADF8150015F8010C97 -:10CF30002C99C0F340008DF8170050460AF002F912 -:10CF40005846102222990AF0FDF886483523083801 -:10CF500002AA40688DF83C90CDE900760E901AA99F -:10CF60002098FFF700FF23B0BDE8F08FF0B59BB02D -:10CF70000C460546DDE922101E461746DDE9203243 -:10CF8000D0F801C0CDF808C0B0F805C0ADF80CC0AD -:10CF90000078C0F340008DF80E00D1F80100CDF804 -:10CFA0000F00B1F80500ADF8130008781946C0F37A -:10CFB00040008DF815001088ADF8160090788DF8B7 -:10CFC00018000DF1190010220AF0BCF80DF129002B -:10CFD000102231460AF0B6F80DF139001022394618 -:10CFE0000AF0B0F817A913A8CDE90001412302AA5D -:10CFF00021462846FFF7B7FE1BB0F0BDF0B5A3B041 -:10D0000017460D4604461E46102202A828990AF02B -:10D0100099F806A8202239460AF094F80EA8202292 -:10D0200029460AF08FF81EA91AA8CDE9000150235D -:10D0300002AA314616A8FFF796FE1698206023B084 -:10D04000F0BDF0B589B00446DDE90E070D4639782C -:10D05000109EC1F340018DF8001031789446C1F361 -:10D0600040018DF801101968CDF802109988ADF8CB -:10D07000061099798DF808100168CDF8091081889B -:10D08000ADF80D1080798DF80F0010236A466146C7 -:10D0900004A8FFF74DFE2246284604A9FEF78AFBA6 -:10D0A000D6F801000090B6F80500ADF80400D7F8F6 -:10D0B0000100CDF80600B7F80500ADF80A00002021 -:10D0C000039010236A46214604A8FFF731FE22464A -:10D0D000284604A9FEF76EFB09B0F0BD1FB51C6819 -:10D0E00000945B68019313680293526803920246AE -:10D0F00008466946FEF75EFB1FBD10B588B00446C2 -:10D10000106804905068059000200690079008462B -:10D110006A4604A9FEF74EFBBDF80000208008B067 -:10D1200010BD1FB51288ADF800201A88ADF8022096 -:10D130000022019202920392024608466946FEF7D7 -:10D1400039FB1FBD7FB5074B14460546083B9A1CAB -:10D150006846FFF7E6FF224669462846FFF7CDFFFF -:10D160007FBD0000A676010070B5044600780E462B -:10D17000012813D0052802D0092813D10EE0A06899 -:10D1800061690578052003F0DBF8052D0AD07823C6 -:10D1900000220520616903F029F803E00520616998 -:10D1A00003F0CEF831462046BDE8704001F086B865 -:10D1B00010B500F12D02C3799478411D64F0030489 -:10D1C0002340C371DB070DD04B79547923404B7159 -:10D1D0000B79127913400B718278C9788A4200D991 -:10D1E000817010BD00224A710A71F5E7417801296A -:10D1F00000D00C21017070472DE9F04F93B04FF033 -:10D20000000B0C690D468DF820B0097801260C2022 -:10D2100017464FF00D084FF0110A4FF008091B296F -:10D2200075D2DFE811F01B00C30206031E035D0385 -:10D230007003A203B703F803190461049304A00464 -:10D24000EC042A05340552055D05EE053106340669 -:10D2500063067F06F9061D07E606EB0614B1207883 -:10D260001D282AD0D5F808805FEA08004FD0012099 -:10D270008DF82000686A02220D908DF824200A2083 -:10D280008DF82500A8690A90A8880028EED098F8A3 -:10D29000001091B10F2910D27ED2DFE801F07D138A -:10D2A00049DEFEFDFCFBFAF938089CF8F70002287D -:10D2B0002DD124B120780C2801D00026EFE38DF881 -:10D2C0002020CBE10520696A03F03AF8A8880728F6 -:10D2D000EED1204600F0EDFF022809D0204600F0F4 -:10D2E000E8FF032807D9204600F0E3FF072802D211 -:10D2F0000120207004E0002CB8D020780128D7D17C -:10D3000098F80400C11F0A2902D30A2061E0C4E191 -:10D31000A070D8F80010E162B8F80410218698F8DF -:10D32000060084F83200012028700320207044E0B9 -:10D330000728BDD1002C99D020780D28B8D198F8B5 -:10D34000031094F82F20C1F3C000C2F3C0021042B2 -:10D3500001D0062000E00720890707D198F80510C2 -:10D360000142D2D198F806100142CED194F8312072 -:10D3700098F8051020EA02021142C6D194F8322032 -:10D3800098F8061090430142BFD198F80400C11FDD -:10D390000A29BAD2617D00E006E281427ED8D8F83F -:10D3A00000106160B8F80410218198F80600A0729E -:10D3B000012028700E20207003208DF82000686A5C -:10D3C0000D9004F12D000990601D0A900F300B9014 -:10D3D00022E12875FDE3412891D1204600F069FF44 -:10D3E000042802D1E078C00704D1204600F061FF94 -:10D3F0000F2884D1A88CD5F80C8080B24FF0400B58 -:10D40000E669FFF747FC324641465B464E46CDF89B -:10D410000090FFF750F80B208DF82000686A0D90FF -:10D42000E0690990002108A8FFF79EFE20780428F3 -:10D4300006D0A07D58B1012809D003280AD049E3BD -:10D4400005202070032028708DF82060CDE184F83D -:10D4500000A032E712202070E9E11128BCD120465B -:10D4600000F027FF042802D1E078C00719D0204639 -:10D4700000F01FFF062805D1E078C00711D1A07D7C -:10D4800002280ED0204600F014FF08E0CAE081E038 -:10D490006FE14EE121E101E1E7E017E0ADE11128A4 -:10D4A0009AD1102208F1010104F13C0009F04AFE72 -:10D4B000607801287ED012202070E078C00760D00C -:10D4C000A07D0028C8D00128C6D05AE0112890D1EC -:10D4D000204600F0EEFE082804D0204600F0E9FEC9 -:10D4E000132886D104F16C00102208F101010646D0 -:10D4F00009F028FE207808280DD014202070E1784B -:10D50000C8070DD0A07D02280AD06278022A04D074 -:10D510000328A1D035E00920F0E708B1012837D170 -:10D52000C80713D0A07D02281DD000200090D4E9A8 -:10D53000062133460EA8FFF776FC10220EA904F14F -:10D540003C0009F0D3FDC8B1042042E7D4E9091238 -:10D55000201D8DE8070004F12C0332460EA8616BF4 -:10D56000FFF76FFDE9E7606BC1F34401491E0068F6 -:10D57000C84000F0010040F08000D7E7207809287B -:10D5800006D185F800908DF8209033E32870ECE305 -:10D590000920FBE711289AD1204600F08AFE0A28CC -:10D5A00002D1E078C00704D1204600F082FE1528A1 -:10D5B0008DD100E08DE104F13C00102208F1010161 -:10D5C000064609F0BFFD20780A2816D016202070E4 -:10D5D000D4E90932606B611D8DE80F0004F15C0332 -:10D5E00004F16C0247310EA8FFF7C0FC10220EA90F -:10D5F000304609F07BFD18B1F5E20B20207071E296 -:10D600002046FFF7D5FDA078216A0A18C0F1100165 -:10D61000104609F016FE23E3394608A8FFF7A4FDDB -:10D6200006463BE20228B6D1204600F042FE04281E -:10D6300004D3204600F03DFE082809D3204600F020 -:10D6400038FE0E2829D3204600F033FE122824D2BB -:10D65000A07D02289FD10E208DF82000686A0D90D1 -:10D6600098F801008DF82400F0E3022893D12046B9 -:10D6700000F01FFE002810D0204600F01AFE0128FE -:10D68000F9D0204600F015FE0C28F4D004208DF8C7 -:10D69000240098F801008DF825005EE21128FCD1E5 -:10D6A000002CFAD020781728F7D16178606A022917 -:10D6B00011D0002101EB4101182606EBC101102217 -:10D6C000405808F1010109F03DFD0520696A00F0AC -:10D6D000E3FD2670F1E50121ECE70B28DDD1002CFC -:10D6E000DBD020781828D8D16078616A02281CD055 -:10D6F0005FF0000000EB4002102000EBC200095870 -:10D70000B8F8010008806078616A02280FD0002014 -:10D7100000EB4002142000EBC2000958404650F8CC -:10D72000032F0A604068486039E00120E2E70120E9 -:10D73000EEE71128B1D1002CAFD020781928ACD158 -:10D740006178606A022912D05FF0000101EB4101AB -:10D750001C2202EBC1011022405808F1010109F01E -:10D76000F1FC0520696A00F097FD1A20B6E001215E -:10D77000ECE7082891D1002C8FD020781A288CD182 -:10D78000606A98F80120017862F347010170616ACC -:10D79000D8F8022041F8012FB8F80600888005204B -:10D7A000696A00F079FD8EE2072012E638780128D8 -:10D7B00094D1182204F11400796809F008FDE07989 -:10D7C000C10894F82F0001EAD001E07861F300006D -:10D7D000E070217D002974D12178032909D0C00788 -:10D7E00025D0032028708DF82090686A0D90412084 -:10D7F00004E3607DA178884201D90620E9E502268C -:10D800002671E179204621F0E001E171617A21F091 -:10D81000F0016172A17A21F0F001A172FFF7C8FC5A -:10D820002E708DF82090686A0D900720E6E20420A3 -:10D83000ACE6387805289DD18DF82000686A0D90F7 -:10D84000B8680A900720ADF824000A988DF830B027 -:10D850006168016021898180A17A81710420207032 -:10D86000F4E23978052985D18DF82010696A0D9187 -:10D87000391D09AE0EC986E80E004121ADF824100D -:10D880008DF830B01070A88CD7F80C8080B240268C -:10D89000A769FFF711FA41463A463346C846CDF824 -:10D8A0000090FEF73CFE002108A8FFF75DFCE07841 -:10D8B00020F03E00801CE0702078052802D00F2068 -:10D8C0000CE049E1A07D20B1012802D0032802D05C -:10D8D00002E10720BFE584F80080EEE42070ECE46C -:10D8E000102104F15C0002F052FA606BB0BBA07D25 -:10D8F00018B1012801D00520FDE006202870F74866 -:10D900006063A063BEE23878022894D1387908B108 -:10D910002875B3E3A07D022802D0032805D022E0B9 -:10D92000B8680028F5D060631CE06078012806D054 -:10D93000A07994F82E10012805D0E84806E0A179D6 -:10D9400094F82E00F7E7B8680028E2D06063E0782A -:10D95000C00701D0012902D0E04803E003E0F868E5 -:10D960000028D6D0A063062010E68DF82090696AC2 -:10D970000D91E1784846C90709D06178022903D1A1 -:10D98000A17D29B1012903D0A17D032900D0072061 -:10D99000287031E138780528BBD1207807281ED0BF -:10D9A00084F800A005208DF82000686A0D90B86802 -:10D9B0000A90ADF824A08DF830B003210170E17811 -:10D9C000CA070FD0A27D022A1AD000210091D4E903 -:10D9D000061204F15C03401CFFF725FA67E384F8A4 -:10D9E0000090DFE7D4E90923211D8DE80E0004F142 -:10D9F0002C0304F15C02401C616BFFF722FB56E331 -:10DA0000626BC1F34401491E1268CA4002F0010171 -:10DA100041F08001DAE738780528BDD18DF8200083 -:10DA2000686A0D90B8680A90ADF824A08DF830B0FF -:10DA3000042100F8011B102204F15C0109F082FBB3 -:10DA4000002108A8FFF790FB2078092801D01320B7 -:10DA500044E70A2020709BE5E078C10742D0A17D11 -:10DA6000012902D0022927D038E0617808A80129CD -:10DA700016D004F16C010091D4E9061204F15C03A4 -:10DA8000001DFFF7BBFA0A20287003268DF82080BE -:10DA9000686A0D90002108A8FFF766FBDDE2C3E28B -:10DAA00004F15C010091D4E9062104F16C03001D2E -:10DAB000FFF7A4FA0026E9E7C0F3440114290DD2C8 -:10DAC0004FF0006101EBB0104FEAB060E070607899 -:10DAD000012801D01020BEE40620FFE6607801286E -:10DAE0003FF4B7AC0A2051E5E178C90708D0A17D21 -:10DAF000012903D10B20287004202FE028702DE08D -:10DB00000E2028706078616B012817D004F15C0347 -:10DB100004F16C020EA8FFF7E1FA2046FFF748FB7C -:10DB2000A0780EAEC0F11001304409F08AFB062047 -:10DB30008DF82000686A09960D909AE004F16C0354 -:10DB400004F15C020EA8FFF7C9FAE9E73978022967 -:10DB500003D139790029D1D029758FE28DF82000C1 -:10DB6000686A0D9058E538780728F6D1D4E909217C -:10DB70006078012808D004F16C00CDE90002029120 -:10DB800005D104F16C0304E004F15C00F5E704F155 -:10DB90005C0304F14C007A680646216AFFF764F9D9 -:10DBA0006078012821D1A078216A0A18C0F11001FB -:10DBB000104609F046FBD4E90923606B04F12D01FE -:10DBC0008DE80F0004F15C0304F16C0231460EA8ED -:10DBD00000E055E2FFF7CAF910220EA904F13C005B -:10DBE00009F084FA08B10B20AFE485F8008000BF8B -:10DBF0008DF82090686A0D908DF824A00CE5387897 -:10DC00000528AAD18DF82000686A0D90B8680A909E -:10DC1000ADF824A08DF830B080F80080617801293B -:10DC20001AD0D4E9093204F12D01A66B03920096B3 -:10DC3000CDE9011304F16C0304F15C0204F14C0121 -:10DC4000401CFFF793F9002108A8FFF78DFA6078D0 -:10DC5000012805D0152041E6D4E90923611DE4E738 -:10DC60000E20287006208DF82000686ACDF824B0B8 -:10DC70000D90A0788DF82800CEE438780328C0D124 -:10DC8000E079C00770D00F202870072066E7387849 -:10DC900004286BD11422391D04F1140009F097FAFD -:10DCA000616A208CA1F80900616AA078C871E179E5 -:10DCB000626A01F003011172616A627A0A73616A31 -:10DCC000A07A81F82400162060E485F800A08DF881 -:10DCD0002090696A50460D9190E00000A676010000 -:10DCE0003878052842D1B868A8616178606A02294D -:10DCF00001D0012100E0002101EB4101142606EBD7 -:10DD0000C1014058082102F042F86178606A022996 -:10DD100001D0012100E0002101EB410106EBC1012E -:10DD2000425802A8E169FFF70DFA6078626A02289A -:10DD300001D0012000E0002000EB4001102000EBAA -:10DD4000C1000223105802A90932FEF7F1FF626AEE -:10DD5000FD4B0EA80932A169FFF7E3F96178606A0B -:10DD6000022904D0012103E042E18BE0BDE0002163 -:10DD700001EB4101182606EBC101A27840580EA91B -:10DD800009F0E0F96178606A022901D0012100E020 -:10DD9000002101EB410106EBC1014058A178084484 -:10DDA000C1F1100109F04DFA05208DF82000686AD4 -:10DDB0000D90A8690A90ADF824A08DF830B0062126 -:10DDC00001706278616A022A01D0012200E000221B -:10DDD00002EB420206EBC202401C8958102209F0F5 -:10DDE000B1F9002108A8FFF7BFF91220C5F818B053 -:10DDF00028708DF82090686A0D900B208DF8240013 -:10DE00000AE43878052870D18DF82000686A0D90F2 -:10DE1000B8680A900B20ADF824000A980721017019 -:10DE20006178626A022901D0012100E0002101EB42 -:10DE30004103102101EBC30151580988A0F80110DA -:10DE40006178626A022902D0012101E02FE10021FC -:10DE500001EB4103142101EBC30151580A6840F85A -:10DE6000032F4968416059E01920287001208DF87E -:10DE7000300077E6162028708DF830B0002108A811 -:10DE8000FFF772F9032617E114202870B0E63878FE -:10DE900005282AD18DF82000686A0D90B8680A908C -:10DEA000ADF824A08DF830B080F800906278616AF7 -:10DEB0004E46022A01D0012200E0002202EB42027B -:10DEC0001C2303EBC202401C8958102209F03AF9C6 -:10DED000002108A8FFF748F9152028708DF8206068 -:10DEE000686A0D908DF824603CE680E0387805285B -:10DEF0007DD18DF82000686A0D90B8680A90ADF861 -:10DF000024900921017061690978490841706169AB -:10DF100051F8012FC0F802208988C18020781C2880 -:10DF2000A8D1A1E7E078C00702D04FF0060C01E0CD -:10DF30004FF0070C607802280AD04FF0000000BFB5 -:10DF400000EB040101F1090105D04FF0010004E0EC -:10DF50004FF00100F4E74FF000000B78204413EA83 -:10DF60000C030B7010F8092F02EA0C02027004D1A6 -:10DF70004FF01B0C84F800C0D2B394F801C0BCF180 -:10DF8000010F00D09BB990F800C0E0465FEACC7C5E -:10DF900004D028F001060670102606E05FEA887CAF -:10DFA00005D528F00206067013262E70032694F875 -:10DFB00001C0BCF1020F00D092B991F800C05FEA35 -:10DFC000CC7804D02CF001060E70172106E05FEA31 -:10DFD0008C7805D52CF002060E70192121700026D0 -:10DFE0000078D0BBCAB3C3BB1C20207035E012E060 -:10DFF00002E03878062841D11A2019E42078012857 -:10E000003CD00C283AD02046FFF7F0F809208DF8D4 -:10E010002000686A0D9031E03878052805D0062088 -:10E02000387003261820287046E005218DF820104E -:10E03000686A0D90B8680A900220ADF824000120AB -:10E040008DF830000A980170297D4170394608A882 -:10E05000FFF78AF8064618202870012E0ED02BE014 -:10E0600001208DF82000686A0D9003208DF82400AF -:10E07000287D8DF8250085F814B012E0287D80B148 -:10E080001D202070172028708DF82090686A0D9050 -:10E0900002208DF82400394608A8FFF765F80646E7 -:10E0A0000AE00CB1FE2020709DF8200020B1002174 -:10E0B00008A8FFF759F810E413B03046BDE8F08F18 -:10E0C0002DE9F04387B00C464E6900218DF804100D -:10E0D00001202578034602274FF007094FF0050C71 -:10E0E00085B1012D53D0022D39D1FE2030708DF82D -:10E0F0000030606A059003208DF80400207E8DF8C2 -:10E10000050063E02179012925D002292DD00329BA -:10E1100028D0042923D1B17D022920D131780D1FC7 -:10E12000042D04D30A3D032D01D31D2917D12189C4 -:10E13000022914D38DF80470237020899DF80410EF -:10E1400088421BD2082001E09E7601008DF8000075 -:10E15000606A059057E070780128EBD0052007B081 -:10E16000BDE8F0831D203070E4E771780229F5D115 -:10E1700031780C29F3D18DF80490DDE7083402F8EA -:10E1800004CB94E80B0082E80B000320E7E7157846 -:10E19000052DE4D18DF800C0656A05959568029556 -:10E1A0008DF8101094F80480B8F1010F13D0B8F175 -:10E1B000020F2DD0B8F1030F1CD0B8F1040FCED14F -:10E1C000ADF804700E202870207E6870002168462B -:10E1D000FEF7CAFF0CE0ADF804700B202870207E1B -:10E1E000002100F01F0068706846FEF7BDFF377021 -:10E1F0000020B4E7ADF804708DF8103085F800C049 -:10E20000207E6870277011466846FEF7ADFFA6E7CE -:10E21000ADF804902B70207F6870607F00F00100E3 -:10E22000A870A07F00F01F00E870E27F2A71C0078D -:10E230001CD094F8200000F00700687194F82100C9 -:10E2400000F00700A87100216846FEF78DFF2868DE -:10E25000F062A8883086A87986F83200A0694078F4 -:10E2600070752879B0700D203070C1E7A97169719F -:10E27000E9E700B587B005280CD101208DF8000032 -:10E280008DF80400002005918DF8050001466846D0 -:10E29000FEF76AFF07B000BD70B50C46054602F0F8 -:10E2A0004FF821462846BDE870407823002201F04F -:10E2B0009DBF08B1007870470C20704770B50C0006 -:10E2C00005784FF000010CD021702146F4F7A4FF2F -:10E2D00069482178405D884201D1032070BD022049 -:10E2E00070BDF4F799FF002070BD0279012A05D0B6 -:10E2F00000220A704B78012B02D003E00420704703 -:10E300000A758A6102799300521C0271C150032080 -:10E310007047F0B587B00F4605460124287905EB14 -:10E32000800050F8046C7078411E02290AD25249CC -:10E330003A46083901EB8000314650F8043C284643 -:10E34000984704460CB1012C11D12879401E10F0D9 -:10E35000FF00287101D00324E0E70A208DF80000B7 -:10E36000706A0590002101966846FFF7A7FF032C0D -:10E37000D4D007B02046F0BD70B515460A46044615 -:10E3800029461046FFF7C5FF064674B12078FE28DF -:10E390000BD1207C30B100202870294604F10C00FC -:10E3A000FFF7B7FF2046FEF721FF304670BD7047EC -:10E3B00070B50E4604467C2108F065FF0225012E4B -:10E3C00003D0022E04D0052070BD0120607000E053 -:10E3D00065702046FEF70AFFA575002070BD28B1C4 -:10E3E000027C1AB10A4600F10C01C5E70120704712 -:10E3F00010B5044686B0052001F0A2FF2078FE2863 -:10E4000006D000208DF8000069462046FFF7E7FFA0 -:10E4100006B010BD7CB50E4600218DF80410417881 -:10E42000012903D0022903D0002405E0046900E09B -:10E4300044690CB1217C89B16D4601462846FFF73D -:10E4400054FF032809D1324629462046FFF794FF9E -:10E450009DF80410002900D004207CBD04F10C05B7 -:10E46000EBE730B40C460146034A204630BC034B70 -:10E470000C3AFEF756BE0000E47601009E760100DD -:10E4800070B50D46040011D085B12101284608F071 -:10E49000D8FE10224E49284608F054FE4C4801216F -:10E4A0000838018044804560002070BD012070BDA7 -:10E4B00070B5474E00240546083E10E07068AA7B00 -:10E4C00000EB0410817B914208D1C17BEA7B914231 -:10E4D00004D10C22294608F009FE30B1641C3088B2 -:10E4E0008442EBDB4FF0FF3070BD204670BD70B54D -:10E4F0000D46060006D02DB1FFF7DAFF002803DB3A -:10E50000401C14E0102070BD314C083C208862880B -:10E51000411C914201D9042070BD6168102201EBB9 -:10E520000010314608F00EFE2088401C2080287024 -:10E53000002070BD70B514460D0018D0BCB100218C -:10E54000A170022802D0102811D105E0288870B1EE -:10E550000121A170108008E02846FFF7A9FF0028DC -:10E5600005DB401CA070A8892080002070BD012020 -:10E5700070BD70B5054614460E000BD000203070FB -:10E58000A878012808D005D91149A1F108010A8805 -:10E5900090420AD9012070BD24B1287820702888C3 -:10E5A000000A5070022008700FE064B14968102220 -:10E5B00001EB00112046103908F0C4FD28782073C3 -:10E5C0002888000A607310203070002070BD0000A1 -:10E5D000700000202DE9F04190460C4607460025CA -:10E5E000FE48072F00EB881607D2DFE807F0070781 -:10E5F000070704040400012500E0FFDF06F814709B -:10E60000002D13D0F548803000EB880191F82700E9 -:10E61000202803D006EB4000447001E081F826403A -:10E6200006EB44022020507081F82740BDE8F081BD -:10E63000F0B51F4614460E460546202A00D1FFDFDE -:10E64000E649E648803100EB871C0CEB440001EB07 -:10E650008702202E07D00CEB460140784B7848709B -:10E66000184620210AE092F82530407882F82500EB -:10E67000F6E701460CEB410005704078A142F8D165 -:10E6800092F82740202C03D00CEB4404637001E087 -:10E6900082F826300CEB41042023637082F82710A7 -:10E6A000F0BD30B50D46CE4B44190022181A72EB5E -:10E6B000020100D2FFDFCB48854200DDFFDFC94801 -:10E6C0004042854200DAFFDFC548401C844207DA39 -:10E6D000002C01DB204630BDC148401C201830BD55 -:10E6E000BF48C043FAE710B504460168407ABE4A05 -:10E6F00052F82020114450B10220084420F07F40FD -:10E70000F4F773FB94F90810BDE81040C9E7042042 -:10E71000F3E72DE9F047B14E803696F82D50DFF83B -:10E72000BC9206EB850090F8264034E009EB851793 -:10E730004FF0070817F81400012806D004282ED03F -:10E7400005282ED0062800D0FFDF01F0E3F80146AF -:10E7500007EB4400427806EB850080F8262090F80D -:10E760002720A24202D1202280F82720084601F06B -:10E77000DCF82A4621460120FFF72CFF9B48414642 -:10E7800000EB041002682046904796F82D5006EBE7 -:10E79000850090F82640202CC8D1BDE8F0870220E3 -:10E7A00000E003208046D0E710B58C4C2021803457 -:10E7B00084F8251084F8261084F82710002084F8A7 -:10E7C000280084F82D0084F82E10411EA16044F822 -:10E7D000100B2074607420736073A0738449E07719 -:10E7E00020750870487000217C4A103C02F8110026 -:10E7F000491CC9B22029F9D30120F4F7EAF9002015 -:10E80000F4F7E7F9012084F82200FAF73FF9794894 -:10E81000FAF74BF9764CA41E20707748FAF745F9C1 -:10E820006070BDE81040F4F761B910B5F4F783F9F2 -:10E830006F4CA41E2078FAF751F96078FAF74EF978 -:10E84000BDE8104001F09EB8202070472DE9F34F3D -:10E85000624E0025803606EB810A89B09AF82500C1 -:10E86000202822D0691E02916049009501EB00101A -:10E870008146D0E90112C0680391CDE90420B08B34 -:10E88000ADF81C00B07F8DF81E009DF81500C8B1D2 -:10E890000227554951F820400399E219114421F00B -:10E8A0007F41019184B102210FE00120F4F791F939 -:10E8B0000020F4F78EF9F4F75CF901F063F886F8BC -:10E8C0002F50A0E00427E4E700218DF8181002285B -:10E8D00001D0012820D10398391901440998081A58 -:10E8E0009DF81C1020F07F4001B10221333181429C -:10E8F0000BD203208DF815000398C4F13201401AA1 -:10E9000020F07F40322403900CE096F8240018B9E0 -:10E9100001F0A0F900284CD0322C03D214B101F040 -:10E9200025F801E001F02EF8314A107818B393462B -:10E930005278039B121B00219DF81840984601282D -:10E940001AD0032818D000208DF81E00002A04DDFC -:10E95000981A039001208DF818009DF81C0000B152 -:10E9600002210398254A20F07F40039003AB0998C9 -:10E9700001F014F810B110E00120E5E79DF81D004A -:10E9800018B99BF80000032812D08DF81C50CDF860 -:10E990000C808DF818408DF81E509DF8180058B165 -:10E9A00003980123C11900221846F4F765F906E01F -:10E9B00000200BB0BDE8F08F0120F4F70AF999F9B7 -:10E9C0000C20012300200199F4F756F9012086F864 -:10E9D0002F008AF828502022694611E0F006002016 -:10E9E000FF7F841E0020A107F4760100F0040020C0 -:10E9F000820000209B00010013E70000FFFF3F00A2 -:10EA0000F94808F0E4FB0120D3E72DE9F05FDFF8D7 -:10EA1000D883064608EB860090F82550202D1FD09D -:10EA2000A8F180002C4600EB8617A0F50079DFF8EE -:10EA3000BCB305E0A24607EB4A004478202C0AD07C -:10EA4000F4F766F909EB04135A4601211B1D00F087 -:10EA5000A5FF0028EED0AC4202D0334652461EE05D -:10EA6000E34808B1AFF30080F4F752F998F82F208B -:10EA70006AB1D8F80C20411C891A0902CA1701EBA7 -:10EA800012610912002902DD0020BDE8F09F314625 -:10EA9000FFF7DCFE08B10120F7E733462A462021C4 -:10EAA0000420FFF7C5FDEFE72DE9F041CE4C2569C5 -:10EAB000F4F72EF9401B0002C11700EB11600012A1 -:10EAC00000D4FFDF94F8220000B1FFDF012784F8B3 -:10EAD000227094F82E00202800D1FFDF94F82E60D9 -:10EAE000202084F82E00002584F82F5084F8205030 -:10EAF00084F82150BF4825600078022833D00328CD -:10EB000031D000202077A068401C05D04FF0FF30A6 -:10EB1000A0600120F4F75DF80020F4F75AF8F4F74C -:10EB200052F9F4F74AF9F4F724F807F043FEB24833 -:10EB3000056005604FF0E0214FF40040B846C1F891 -:10EB40008002F4F7C3F994F82D703846FFF75DFFA3 -:10EB50000028FAD0A448803800EB871010F816007F -:10EB6000022802D006E00120CCE73A4631460620D2 -:10EB7000FFF730FD84F8238004EB870090F826002F -:10EB8000202804D09B48801E4078F9F7ADFF207FF5 -:10EB9000002803D0F4F707F92577657746E50146A5 -:10EBA000914810B590F82D200024803800EB821099 -:10EBB00010F814302BB1641CE4B2202CF8D32020C0 -:10EBC00010BD8E4800EB0410016021460120FFF7C4 -:10EBD00001FD204610BD10B5012801D0032800D149 -:10EBE00071B3814A92F82D307F4C0022803C04EBB7 -:10EBF000831300BF13F812400CB1082010BD521C43 -:10EC0000D2B2202AF6D37B4A48B1022807D007297E -:10EC100016D2DFE801F01506080A0C0E10000021DC -:10EC20000AE01B2108E03A2106E0582104E07721A0 -:10EC300002E0962100E0B52151701070002010BD57 -:10EC4000072010BD6B4810B54078F4F7CEF880B2BD -:10EC500010BD10B5202811D2634991F82D30A1F1D3 -:10EC6000800202EB831414F810303BB191F82D3080 -:10EC700002EB831212F81020012A01D0002010BDEF -:10EC800091F82D2001460020FFF7A4FC012010BDC3 -:10EC900010B5F4F73DF8BDE81040F4F7A6B82DE93B -:10ECA000F0410E46504F01782025803F0C4607EB7F -:10ECB000831303E0254603EB45046478944202D0B5 -:10ECC000202CF7D108E0202C06D0A14206D103EB7E -:10ECD00041014978017007E00020A7E403EB4400FC -:10ECE00003EB450140784870454F7EB127B10021C4 -:10ECF00040F2DA30AFF300803078A04206D127B17D -:10ED0000002140F2DD30AFF30080357027B10021E3 -:10ED100040F2E230AFF30080012087E410B5426892 -:10ED20000B689A1A1202D41702EB1462121216D44C -:10ED3000497A91B1427A82B9324A006852F8211078 -:10ED4000126819441044001D891C081A0002C117DA -:10ED500000EB11600012322801DB012010BD002001 -:10ED600010BD2DE9F04781461F48244E00EB81007D -:10ED7000984690F825402020107006F50070154642 -:10ED800000EB81170BE000BF06EB04104946001DA5 -:10ED9000FFF7C4FF28B107EB44002C704478202C07 -:10EDA000F2D1297888F8001013E000BF06EB0415B3 -:10EDB000291D4846FFF7B2FF68B988F80040A97BD3 -:10EDC00099F80A00814201D80020E6E407EB4400EC -:10EDD0004478202CEAD10120DFE42DE9FC410E46E5 -:10EDE00007460024054D18E070070020FFFF3F0094 -:10EDF000000000008200002000F50040F004002028 -:10EE000000000000F47601009DF8000005EB001002 -:10EE10008168384600F0D6FD01246B4601AA3146D0 -:10EE20003846FFF79EFF0028EED02046BDE8FC8163 -:10EE300070B50446FF480125A54300EB841100EBA3 -:10EE40008510402208F07EF9FB4E26B1002140F2E9 -:10EE50005C40AFF30080F748803000EB850100EBA9 -:10EE60008400D0F82500C1F8250026B100214FF418 -:10EE70008C60AFF30080284670BD2DE9FC418446CC -:10EE8000EC481546089C00EB85170E4617F8140051 -:10EE9000012803D0022801D00020C7E70B46E74A2B -:10EEA0000121604600F07AFDA8B101AB6A4629460F -:10EEB0003046FFF756FF70B1DE489DF804209DF8FC -:10EEC0000010803000EB85068A4208D02B460520D2 -:10EED000FFF7AEFB0BE02A462146042014E0202970 -:10EEE00003D007EB4100407801E096F8250007EBDE -:10EEF000440148709DF80000202809D007EB40002D -:10EF000044702A4621460320FFF764FB01208DE769 -:10EF100006F8254F0120F070F3E7C94901EB001016 -:10EF2000001DFFF7E0BB7CB51D46134604460E46A8 -:10EF300000F1080221461846F3F764FF94F908002F -:10EF40000F2804DD1F3820722068401C206096B115 -:10EF50000220BC4951F82610461820686946801BDB -:10EF600020F07F40206094F908002844C01C1F282E -:10EF700003DA012009E00420EBE701AAF3F742FFDE -:10EF80009DF8040010B10098401C00900099206882 -:10EF900031440844C01C20F07F4060607CBD2DE9F6 -:10EFA000FE430C46064609786079907220799846AF -:10EFB0001546507241B19F48803090F82E1020299C -:10EFC0000AD00069401D0BE0D4E90223217903B087 -:10EFD0002846BDE8F043A6E79B484178701D0844E9 -:10EFE00020F07F47217900222846A368FFF79BFF86 -:10EFF0003946284600F0E6FCD4E902322179684619 -:10F00000FFF791FF41462846019CFFF7E6FE2B469D -:10F0100022460021304600F0C1FC002803D13146D1 -:10F02000284600F0CFFCBDE8FE832DE9FE4F814667 -:10F0300000F084FC30B1002799F8000020B10020D6 -:10F04000BDE8FE8F0127F7E77A4D7B4C4FF0000AB1 -:10F05000803524B1002140F2D340AFF3008095F811 -:10F060002D8085F823A0002624B100214FF49B6059 -:10F07000AFF300801FB94046FFF7DAFE804624B1A7 -:10F0800000214FF49C60AFF30080F3F741FE43464C -:10F090006A464946FFF783FF24B1002140F2E6406B -:10F0A000AFF3008095F82E0020280CD02969009835 -:10F0B000401A0002C21700EB1260001203D5684626 -:10F0C00000F080FC012624B100214FF49E60AFF3D4 -:10F0D000008095F823000028BBD124B1002140F224 -:10F0E000F640AFF30080F3F713FE6B46534A00215E -:10F0F00000F054FC0028A3D027B941466846FFF72A -:10F100006CFE064326B16846FFF7EDFAC9F8080021 -:10F1100024B1002140F20950AFF3008001208FE7B5 -:10F120002DE9FF5F8A46814600F008FC414C80349F -:10F1300010B39AF80000002710B1012800D0FFDFBB -:10F140003D4D25B1002140F27F50AFF300800120FA -:10F15000A84600905FEA080604D0002140F28750DC -:10F16000AFF30080009800F0E0FB94F82D500020F1 -:10F1700084F8230067B119E094F82E0001272028B5 -:10F1800000D1FFDF9AF800000028D9D0FFDFD7E7D1 -:10F190002846FFF74DFE054626B1002140F291506A -:10F1A000AFF3008094F823000028D3D126B10021CA -:10F1B00040F29B50AFF30080F3F7AAFD83462B4645 -:10F1C00001AA5146FFF7EBFE5FEA060804D00021D2 -:10F1D00040F2A250AFF300803B462A4601A95846B0 -:10F1E000CDF80090FFF749FE064604EB850090F845 -:10F1F00028B0B8F1000F04D0002140F2A950AFF3BD -:10F20000008000F087FB0090B8F1000F04D00021CF -:10F2100040F2AF50AFF3008094F82300002899D15A -:10F22000B8F1000F04D0002140F2B750AFF30080D6 -:10F2300003490BE0F006002000000000FFFF3F0044 -:10F24000F0040020F47601008200002001EB091098 -:10F250000DF1040C00F104009CE80E0080E80E00A3 -:10F260004EB35FEA080604D0002140F2C450AFF369 -:10F2700000803BEA070012D094F82E0020280ED11F -:10F2800026B1002140F2C950AFF300802846FFF7B5 -:10F29000BCFB20B99AF80000D8B3012849D0B8F1D6 -:10F2A000000F04D0002140F2E650AFF30080284662 -:10F2B00000F029FB01265FEA080504D0002140F296 -:10F2C000EF50AFF30080009800F02FFB25B1002134 -:10F2D00040F2F350AFF300808EB194F82D0004EBB0 -:10F2E000800090F82600202809D025B1002140F2A6 -:10F2F000FA50AFF30080F9484078F9F7F5FB25B1F3 -:10F30000002140F2FF50AFF3008004B03046BDE86A -:10F31000F09FFFE7B8F1000F04D0002140F2D15078 -:10F32000AFF3008094F82D2049460420FFF752F9EE -:10F33000C0E7002E3FF40EAF002140F2DC50AFF3E7 -:10F34000008007E72DE9F84FE54D814695F82D003F -:10F350004FF00008E34C4FF0010B474624B1002169 -:10F3600040F20D60AFF30080584600F0DEFA85F8F9 -:10F37000237024B1002140F21260AFF3008095F8B1 -:10F380002D00FFF755FD064695F8230028B1002C07 -:10F39000E4D000214FF4C3604BE024B1002140F2DF -:10F3A0001C60AFF30080CE48803800EB861111F866 -:10F3B0001900032856D1334605EB830A4A469AF8CA -:10F3C0002500904201D1012000E0002000900AF1C8 -:10F3D00025000021FFF763FC01460098014203D09D -:10F3E00001228AF82820AF77E1B324B1002140F24E -:10F3F0002160AFF30080324649460120FFF7EAF86A -:10F400009AF828A024B1002140F22C60AFF30080CC -:10F4100000F080FA834624B1002140F23160AFF35E -:10F42000008095F8230038B1002C97D0002140F2DD -:10F430003560AFF3008091E7BAF1000F07D095F87F -:10F440002E00202803D13046FFF7DFFAE0B124B1C7 -:10F45000002140F24960AFF30080304600F053FADB -:10F460004FF0010824B1002140F25260AFF3008058 -:10F47000584600F05AFA24B1002140F25660AFF32A -:10F4800000804046BDE8F88F002CF1D0002140F20A -:10F490004460AFF30080E6E70020F3F773BB012080 -:10F4A000F3F770BB8D48007870472DE9F0418C4C24 -:10F4B00094F82E0020281FD194F82D6004EB8607C5 -:10F4C00097F82550202D00D1FFDF8549803901EBC9 -:10F4D000861000EB4500407807F8250F0120F870F2 -:10F4E00084F82300294684F82E5032460220223424 -:10F4F000FFF770F8002020700FE42DE9F0417A4EFC -:10F50000774C012538B1012821D0022879D0032871 -:10F510007DD0FFDFF0E700F029FAFFF7C6FF207E7D -:10F5200000B1FFDF84F821500020F3F752FBA168FF -:10F53000481C04D0012300221846F3F79DFB14F861 -:10F540002E0F217806EB01110A68012154E0FFF724 -:10F55000ACFF0120F3F73DFB94F8210050B1A06807 -:10F56000401C07D014F82E0F217806EB01110A6811 -:10F57000062141E0207EDFF86481002708F10208BF -:10F58000012803D002281ED0FFDFB5E7A777F3F7E5 -:10F590000AFC98F80000032801D165772577607D83 -:10F5A000524951F8200094F8201051B948B16168CF -:10F5B0000123091A00221846F3F75EFB0220207689 -:10F5C0009AE7277698E784F8205000F0CFF9A07FDB -:10F5D00050B198F8010061680123091A0022184609 -:10F5E000F3F74AFB257600E0277614F82E0F2178F2 -:10F5F00006EB01110A680021BDE8F041104700E068 -:10F6000005E036480078BDE8F041F9F76DBAFFF73C -:10F610004CFF14F82E0F217806EB01110A68052122 -:10F62000EAE710B52E4C94F82E00202800D1FFDF19 -:10F6300014F82E0F21782C4A02EB01110A68BDE85C -:10F640001040042110477CB5254C054694F82E0047 -:10F65000202800D1FFDFA068401C00D0FFDF94F815 -:10F660002E00214901AA01EB0010694690F90C0017 -:10F670002844F3F7C7FB9DF904000F2801DD0120A2 -:10F6800000E00020009908446168084420F07F41B0 -:10F69000A16094F82100002807D002B00123BDE842 -:10F6A000704000221846F3F7E7BA7CBD30B5104A27 -:10F6B0000B1A541CB3EB940F1ED3451AB5EB940FE1 -:10F6C0001AD3934203D9101A43185B1C14E09542D5 -:10F6D00010D9511A0844401C43420DE0800000201C -:10F6E0007007002000000000F0040020F476010004 -:10F6F000FF7F841EFFDF0023184630BD0123002258 -:10F7000001460220F3F7B8BA0220F3F762BAF3F722 -:10F71000FFBA2DE9FC47B14C054694F82E0020288D -:10F7200000D1FFDF642D58D3AD4A0021521B71EB8D -:10F73000010052D394F82E20A0462046DFF8A49270 -:10F7400090F82D7009EB0214D8F8000001AA2844A3 -:10F750006946F3F757FB9DF90400002802DD009885 -:10F76000401C0090A068009962684618B21A22F006 -:10F770007F42B2F5800F30D208EB8702444692F800 -:10F780002520202A0AD009EB02125268101A000222 -:10F79000C21700EB1260001288421EDBA068401CFA -:10F7A00010D0F3F7B5FAA168081A0002C11700EBF0 -:10F7B00011600012022810DD0120F3F70AFA4FF061 -:10F7C000FF30A06020682844206026F07F40206140 -:10F7D000012084F82300BDE8FC870020FBE72DE929 -:10F7E000F0477E4C074694F82D00A4F1800606EB06 -:10F7F000801010F8170000B9FFDF94F82D50A046D4 -:10F80000794C24B1002140F66500AFF3008040F64A -:10F81000710940F67A0A06EB851600BF16F8170044 -:10F82000012818D0042810D005280ED006280CD0A6 -:10F830001CB100214846AFF3008020BF002CEDD062 -:10F8400000215046AFF30080E8E72A463946012000 -:10F85000FEF7C0FEF2E74FF0010A4FF000094546FF -:10F8600024B1002140F68100AFF30080504600F043 -:10F870005CF885F8239024B1002140F68600AFF3B0 -:10F88000008095F82D00FFF7D3FA064695F823007F -:10F8900028B1002CE4D0002140F68C001FE024B1F8 -:10F8A00000214FF40960AFF3008005EB860000F102 -:10F8B000270133463A462630FFF7F1F924B10021FB -:10F8C00040F69400AFF3008000F024F8824695F8EB -:10F8D000230038B1002CC3D0002140F69A00AFF3CA -:10F8E0000080BDE785F82D60012085F82300504693 -:10F8F00000F01BF8002C04D0002140F6A700AFF365 -:10F900000080BDE8F087354981F82D00012081F89D -:10F910002300704710B5354808B1AFF30080EFF30E -:10F92000108000F0010072B610BD10B5002804D19F -:10F930002F4808B1AFF3008062B610BD2D480068B3 -:10F94000C005C00D10D0103840B2002806DA00F013 -:10F950000F0000F1E02090F8140D03E000F1E0202A -:10F9600090F80004400970470820704710B51B4C00 -:10F9700094F82400002804D1F8F7ACFE012084F8A4 -:10F98000240010BD10B5154C94F82400002804D0B4 -:10F99000F8F7C9FE002084F8240010BD10B51C68DB -:10F9A0005B68241A181A24F07F4420F07F40A1429B -:10F9B00006D8B4F5800F03D2904201D8012010BDC3 -:10F9C000002010BDD0E90032D21A21F07F4311444B -:10F9D00021F07F41C0E9003170470000700700202E -:10F9E000FF1FA107F004002000000000000000003D -:10F9F0000000000004ED00E02DE9F041044680071E -:10FA00004FF000054FF0010604D55C480560066024 -:10FA100024F00204E0044FF0FF3705D55848466053 -:10FA2000C0F8087324F48054600003D5554805607D -:10FA300024F08044E0050FD55348C0F80052C0F8C8 -:10FA4000087352490D60091D0D60504A04210C32A3 -:10FA50001160066124F48074A00409D54C48466006 -:10FA6000C0F80052C0F808734A48056024F40054F6 -:10FA7000C4F38030C4F3C031884200D0FFDF14F4F7 -:10FA8000404F14D044484660C0F80873434886602D -:10FA9000C0F80052C0F8087341490D600A1D166095 -:10FAA0008660C0F808730D60166024F44044200599 -:10FAB0000AD53C4846608660C0F80873C0F84873B1 -:10FAC0003948056024F4006406F04EFE37480442CD -:10FAD00000D0FFDFBDE8F08170B52025002213467D -:10FAE00020FA02F1C90719D051B201F01F06012412 -:10FAF000B4404E09B60006F1E026C6F88041C6F8CB -:10FB00008042002906DA01F00F0101F1E02181F8BD -:10FB1000143D03E001F1E02181F80034521CAA42B7 -:10FB2000DED370BD70B5224C0D462060FFF764FF38 -:10FB30002068FFF7D1FF2846F8F7C1FE06F04AFA21 -:10FB400000F0D5F806F010FE06F05BFDF8F79EFF1A -:10FB5000BDE8704006F0ECBA10B5154C2068FFF710 -:10FB60004BFF2068FFF7B8FF06F0FEFDF8F736FF01 -:10FB70000020206010BD0A2070470000FC1F0040DC -:10FB800000C0004004E501400080004004850040C2 -:10FB900000D0004004D5004000E0004000F00040EC -:10FBA00000F5004000B0004008B50040FEFF0FFD2A -:10FBB0008400002070B522490A680AB30022154665 -:10FBC00001244B685B1C4B60092B00D34D600E7900 -:10FBD00004FA06F30E681E420FD0EFF3108212F003 -:10FBE000010272B600D001220C689C430C6002B97D -:10FBF00062B649680160002070BD521C092AE0D33A -:10FC0000052070BD4FF0E0214FF48000C1F80002E4 -:10FC10007047EFF3108111F0010F72B64FF001023F -:10FC200002FA00F20648036842EA0302026000D1C9 -:10FC300062B6E7E7024800210160416070470000BA -:10FC4000880000200120810708607047012081079B -:10FC50004860704712480068C00700D00120704714 -:10FC60000F48001F0068C00700D0012070470C48F3 -:10FC700008300068C00700D00120704708481030E5 -:10FC80000068704706490C310A68D20306D5096836 -:10FC900001F00301814201D101207047002070472B -:10FCA0000C0400402DE9F04115460E46044600279D -:10FCB00000F0E7F8A84215D3002341200FE000BF71 -:10FCC00094F84220A25CF25494F84210491CB1FB13 -:10FCD000F0F200FB12115B1C84F84210DBB2AB4265 -:10FCE000EED3012700F0D9F83846BDE8F08170491D -:10FCF00010B5802081F800046E49002081F8420090 -:10FD000081F84100433181F8420081F841004331DC -:10FD100081F8420081F84100674806F0BBFB664865 -:10FD2000401C06F0B7FBF3F7DDF8BDE8104000F02B -:10FD3000B4B8402070475F4800F0A3B80A460146B7 -:10FD40005C48AFE7402070475A48433000F099B80C -:10FD50000A46014657484330A4E74021017000207D -:10FD6000704710B504465348863000F08AF820707A -:10FD7000002010BD0A4601464E4810B58630FFF7F8 -:10FD800091FF08B1002010BD42F2070010BD70B510 -:10FD90000C460546412900D9FFDF48480068103865 -:10FDA00040B200F050F8C6B20D2000F04CF8C0B2DE -:10FDB000864203D2FFDF01E0F3F7DCF82246294652 -:10FDC0003C48FFF76FFF0028F6D070BD2DE9F041E9 -:10FDD000394F002506463F1D57F82540204600F0C4 -:10FDE00041F810B36D1CEDB2032DF5D3314843300B -:10FDF00000F038F8002825D02E4800F033F800280D -:10FE000020D02C48863000F02DF800281AD0F3F7C7 -:10FE10008FF8294806F046FBB0F5005F00D0FFDF01 -:10FE2000BDE8F041244806F053BB94F8410041215D -:10FE3000265414F8410F401CB0FBF1F201FB1200F4 -:10FE40002070D3E751E7002806DA00F00F0000F138 -:10FE5000E02090F8140D03E000F1E02090F8000499 -:10FE60004009704710F8411F4122491CB1FBF2F3D1 -:10FE700002FB13114078814201D10120704700201C -:10FE8000704710F8411F4078814201D3081A02E000 -:10FE9000C0F141000844C0B2704710B5064806F0F2 -:10FEA00001FB002803D1BDE81040F3F72CB810BDCA -:10FEB0000DE000E0A00700209000002004ED00E02D -:10FEC00070B5154D2878401CC4B26878844202D0C1 -:10FED000F3F78BF82C7070BD2DE9F0410E4C4FF00C -:10FEE000E02600BFF3F77FF820BF40BF20BF677850 -:10FEF00020786070D6F80052F1F7F6F9854305D105 -:10FF0000D6F8040210B92078B842EBD0F3F76AF8BB -:10FF10000020BDE8F0810000A00000202DE9F041A4 -:10FF2000012528034FF0E0210026C1F880011E4C76 -:10FF3000C4F800610C2000F02CF81C48016802682D -:10FF4000C94341F3001142F010020260C4F80453A7 -:10FF50002560491C00E020BFD4F80021002AFAD017 -:10FF600019B9016821F01001016011480768656046 -:10FF7000C4F80853C4F800610C2000F00AF83846B1 -:10FF8000BDE8F08110B50446FFF7C8FF20600020EF -:10FF900010BD00F01F02012191404009800000F1D6 -:10FFA000E020C0F88012704700C0004010ED00E073 -:10FFB00008C500402DE9F047FF4C0646FF21A06828 -:10FFC00000EB061211702178FF2910D04FF00809BC -:10FFD00009EB011109EB06174158C05900F0F4F97B -:10FFE000002807DDA168207801EB06110870267053 -:10FFF000BDE8F08794F8008045460DE0A06809EB65 -:020000040001F9 -:1000000005114158C05900F0DFF9002806DCA0684E -:10001000A84600EB08100578FF2DEFD1A06800EB93 -:10002000061100EB08100D700670E1E7F0B5E24B29 -:100030000446002001259A680C269B780CE000BF3E -:1000400005EB0017D75DA74204D106EB0017D7597F -:100050008F4204D0401CC0B28342F1D8FF20F0BDD3 -:1000600070B5FFF754FBD44C08252278A16805EB46 -:100070000212895800F0A8F9012808DD2178A0684B -:1000800005EB01114058BDE87040FFF737BBFFF7A3 -:1000900009FABDE87040F8F727BD2DE9F041C64CDC -:1000A0002578FFF734FBFF2D6ED04FF00808A268CB -:1000B00008EB0516915900F087F90228A06801DDC8 -:1000C00080595DE000EB051109782170022101EBF8 -:1000D0000511425C5AB1521E4254815901F580010A -:1000E00021F07F4181512846FFF764FF34E004236B -:1000F000012203EB051302EB051250F803C0875CE5 -:10010000BCF1000F10D0BCF5007F10D9CCF3080271 -:1001100050F806C00CEB423C2CF07F4C40F806C077 -:10012000C3589A1A520A09E0FF2181540AE0825901 -:1001300002EB4C3222F07F42825100224254284688 -:10014000FFF738FF0C21A06801EB05114158E0686A -:1001500050F82720384690472078FF2814D0FFF722 -:10016000D6FA2278A16808EB02124546895800F0B9 -:100170002BF9012893DD2178A06805EB0111405887 -:10018000BDE8F041FFF7BABABDE8F081F0B51D4611 -:1001900014460E460746FF2B00D3FFDFA00700D012 -:1001A000FFDF8548FF210022C0E90247C5700671C4 -:1001B0000170427082701046012204E002EB0013CD -:1001C000401CE154C0B2A842F8D3F0BD70B57A4CDF -:1001D000064665782079854200D3FFDFE06840F865 -:1001E00025606078401C6070284670BD2DE9FF5F77 -:1001F0001D468B460746FF24FFF789FADFF8B891C2 -:10020000064699F80100B84200D8FFDF00214FF000 -:1002100001084FF00C0A99F80220D9F808000EE006 -:1002200008EB0113C35CFF2B0ED0BB4205D10AEBD8 -:10023000011350F803C0DC450CD0491CC9B28A42F6 -:10024000EED8FF2C02D00DE00C46F6E799F803102B -:100250008A4203D1FF2004B0BDE8F09F1446521C2F -:1002600089F8022008EB04110AEB0412475440F805 -:1002700002B00421029B0022012B01EB04110CD0DF -:1002800040F801204FF4007808234FF0020C454558 -:1002900013D9E905C90D02D002E04550F2E7414605 -:1002A00006EB413203EB041322F07F42C250691A7D -:1002B0000CEB0412490A81540BE005B9012506EB49 -:1002C000453103EB041321F07F41C1500CEB0411C5 -:1002D000425499F800502046FFF76CFE99F8000050 -:1002E000A84201D0FFF7BCFE3846B4E770B50C4613 -:1002F0000546FFF70CFA064621462846FFF796FE0C -:100300000446FF281AD02C4D082101EB0411A868DF -:100310004158304600F058F800F58050C11700EB06 -:10032000D14040130221AA6801EB0411515C09B1CC -:1003300000EB4120002800DC012070BD002070BDD2 -:100340002DE9F04788468146FFF770FE0746FF28F3 -:100350001BD0194D2E78A8683146344605E0BC42C2 -:1003600006D0264600EB06121478FF2CF7D10CE0DD -:10037000FF2C0AD0A6420CD100EB011000782870A7 -:10038000FF2804D0FFF76CFE03E0002030E6FFF703 -:10039000BBF941464846FFF7A9FF0123A968024679 -:1003A00003EB0413FF20C854A878401EB84200D1C4 -:1003B000A87001EB041001E06C08002001EB0611AD -:1003C00000780870104613E6081A0002C11700EB07 -:1003D000116000127047000070B50446A0F50000DF -:1003E0002D4EB0F1786F02D23444A4F500042B48AE -:1003F000844201D2012500E0002500F043F848B115 -:1004000025B9B44204D32648006808E0012070BD35 -:10041000002070BD002DF9D1B442F9D321488442A7 -:10042000F6D2F3E710B50446A0F50000B0F1786FFE -:1004300003D219480444A4F5000400F023F84FF057 -:10044000804130B11648006804E08C4204D201209B -:1004500003E014488442F8D2002080F0010010BD6F -:1004600010B520B1FFF7DEFF08B1012010BD00205C -:1004700010BD10B520B1FFF7AFFF08B1012010BDCE -:10048000002010BD084809490068884201D10120B8 -:10049000704700207047000000000020008001002D -:1004A0002000002008000020A4000020BEBAFECAE0 -:1004B0000348044A0168914201D10021016070475C -:1004C000A4000020BEBAFECA43480021017041705A -:1004D00010218170704770B5054616460C46022003 -:1004E000F2F7C7FA3C490120F61E08703B48066047 -:1004F0003A4808380560001F046070BD10B502203E -:10050000F2F7B7FA34490120087035480021C0F8E5 -:100510000011C0F80411C0F8081132494FF400006E -:10052000086010BD10B52C4C207888B12D494FF4CF -:100530000000091D086000F041F8002120B10120F1 -:1005400060702948006801E061701020A07021707F -:10055000BDE810400020F2F78CBA1F4810B50178B2 -:1005600059B11F48D0F8000128B100F027F8002841 -:1005700000D0012010BD022010BD407810BD10B584 -:10058000C824641EE4B2FFF7E8FF022803D0012864 -:1005900000D0002010BD002CF3D1FFDFF9E70E489A -:1005A00010B5017841B100F009F818B10E480068A3 -:1005B000C0B210BD102010BD807810BD0848D0F822 -:1005C000001129B1D0F8041111B1D0F8080108B117 -:1005D0000020704701207047A800002010F500405F -:1005E00000F0004004F5014000F4004044480021C0 -:1005F00001704170704770B5064614460D460120E3 -:10060000F2F737FA3F480660001D0460001D0560E0 -:1006100070BD70B53A4A012540EA01411570394A6A -:10062000121F1160384C0026C4F80461374A4FF09D -:100630004071116058B1012800D0FFDFC4F800629A -:10064000256032494FF00070091F086070BDC4F882 -:100650000052256070BD2A48017871B12B4A4FF0D5 -:10066000407111602849D1F8042100211AB1284AAB -:100670001268427000E0417001700020F2F7F9B991 -:100680001F48017841B12048D0F80401002802D069 -:100690001F480068C0B270474078704770B50028A6 -:1006A00028D01748007800B9FFDF1748D0F80411A8 -:1006B00000291FD10223C0F8043316490A680C68C8 -:1006C000D24342F3001244F010040C609C034FF03C -:1006D000E025521C03E000BFC5F8804220BFD0F8DF -:1006E0000461002EF8D01AB90A6822F010020A60DC -:1006F000C0F8083370BD04490120886070470000CD -:10070000AB00002008F5004000F0004008F5014073 -:1007100000F4004010ED00E0FC4808B50021C0F8EE -:100720000011C0F80C11C0F81011C0F80411C0F885 -:100730001411C0F81811F6480068009008BD70B593 -:10074000F44D00246C702C7000F088FD85F8214079 -:10075000AC626C636C77092105F1140006F093FD1F -:10076000ED49601E0860091D0860091D0C60091D27 -:100770000860091D0C60091D0860091D0860091D3D -:100780000860091D0860091D0860091D0860091D31 -:100790000860091D0860091D086070BD70B5DD495D -:1007A0000268DE4C4A6142688A61007A08770C3C34 -:1007B0000A7DDA4B251F012042B10E7E00FA06F2B7 -:1007C0001A608E7D0EB1226000E02A604A7D002A08 -:1007D00005D04A7E90401860C97D09B1206070BD87 -:1007E000286070BDCF49CE480860091DCE4808601A -:1007F000704710B50446012902D0022902D0FFDF5C -:10080000002101E04FF08071C8480143C5480160F4 -:10081000C549E0B225390843C249091D0860BB48F3 -:10082000D0F80001002800D0FFDF10BD70B5012016 -:1008300000F0FEFCBE4900240C6001200860BD49A8 -:100840000A68BD4B22F077021A430A60091D0A6844 -:1008500022F47F4242F4B0520A60B24A40F25B6135 -:1008600024321160121F40F203111160111F086041 -:10087000AC490320091F0860AA499620303108605E -:10088000A44D95F91D0006F0A5F8AD49AB480860E8 -:10089000AB49AC489C3108609D480838091F086086 -:1008A000012000F0D0FC99491020C1F8040385F81C -:1008B0002D4070BD974A0368C2F802308088D0800E -:1008C00011727047934890F821007047914A517017 -:1008D00010707047F0B5054684008C488B88204422 -:1008E000C0F820360B78D1F8011043EA0121C0F896 -:1008F000001605F1080001278E4C07FA00F6FC3CB3 -:1009000052B1012A00D0FFDF206830432060206808 -:10091000AF4038432060F0BD2068B043F6E710B523 -:10092000044606F057F87B48447710BD794890F8A4 -:100930002E0070477B4AC1781032116000687949F7 -:100940000002083108607047252807D0262807D004 -:10095000272807D00A2807D8042206E0022107E04A -:100960001A2105E0502103E0062202EB4001C9B242 -:100970006C4A0C3A11606B49403108607047654819 -:10098000817A012915D0022912D1417D00290FD089 -:10099000827E0121C37E01FA02F299400A4368492E -:1009A0000A60007F684A002102EB8000C0F8101541 -:1009B0007047017DEAE7F0B5564B9C7A012C12D0C6 -:1009C000022C67D15D7D002D64D0604F4FF47A76A4 -:1009D000012C0AD05D7EDC7D04B1012401291FD0E9 -:1009E000022A1FD020E01D7DEDE71D7E9C7D04B115 -:1009F00001244FF4C86C012902D0022A07D008E074 -:100A0000022A00D1B44649F6FC61614405E0504F2A -:100A1000B44607EB0C0101F5FA71B1FBF6F107E002 -:100A2000292105E04A4F643F07F2E147B7FBF6F1A1 -:100A3000491F084447490860424900204039C1F82D -:100A40004C01280284F0010140EA015040F00312F9 -:100A5000197F3D4800EB8104C4F810259C7E3E4A76 -:100A600000EB810102EBC400C0F814153B4DC0F847 -:100A70001055DB7E02EBC300C0F814152449083979 -:100A8000C0F81015012000FA04F1984001432C48E9 -:100A9000001F0160F0BD2DE9F0410F461B490546DE -:100AA00003201646C1F80002254C2448241F20606C -:100AB000384605F0D9FF304605F0B6FF154815B1A8 -:100AC000012D09D011E001218172416B41F48011A7 -:100AD00041634FF4801007E002218172416B41F4C1 -:100AE000001141634FF40010206032463946BDE8E2 -:100AF000F04100205FE708B5FF208DF800000348B3 -:100B00000021C0F81011012101612EE00010004009 -:100B1000181100407C080020000E0040180500500D -:100B20000601020014150040250003020801100010 -:100B3000FC1F00403C1700408800008000000404B7 -:100B400008F501404080004000600040A2240200FF -:100B5000683602004C85004000F001404C810040A6 -:100B60009DF80010491E8DF800109DF8001019B175 -:100B7000D0F810110029F3D09DF80000002800D112 -:100B8000FFDF08BD2DE9FF5FFC4D0746002603206F -:100B90009B468946C5F80002DFF8E883F849C8F8A3 -:100BA0000010029805F060FF584605F03DFFF5483B -:100BB000F54CA8304FF0010A17B1012F1DD026E0E7 -:100BC000056094F82D00012805D002280BD0FFDF26 -:100BD00084F80AA01BE094F82C205B464846029952 -:100BE00005F096FF06E094F82C305A4648460299E4 -:100BF00005F045FFA16A4618EAE7E049091D0160D2 -:100C000094F82D00012838D0FFDF0220A072DF48C1 -:100C10000660DC49DE48A4310860606B40F40020C7 -:100C20006063D5F800724FF01009C5F808930020F2 -:100C3000C5F80002D3484FF48024001D046005F578 -:100C40000075FFF758FFFFF767FD2F60C8F80040F9 -:100C5000C5F804916100C8F80010CE49C1F84CA055 -:100C6000CA48001D0068B04200D3FFDF029904B0FB -:100C70005A463046BDE8F05F9DE694F82C205B466E -:100C80004846029905F022FFA16A4618BDE72DE902 -:100C9000F041BA4CD4F8000220F00306D4F8040363 -:100CA0001027C0F30015C4F808734FF00008C4F80B -:100CB0000082B449B248091D086004F50074FFF7CA -:100CC0005EFEFFF718FF44F8F08C00F0C7FA2660CC -:100CD000A4F50074002D01D0C4F80473BDE8F081C0 -:100CE0000068AD4920F07F400860704710B50120D2 -:100CF00000F09EFABDE81040012000F0A4BA4FF0C9 -:100D0000E0210220C1F800017047A4490870704733 -:100D1000A14938390860704770B59B4D0446A86AF0 -:100D2000A04200D3FFDF012028739A4900202C61E4 -:100D3000C1F844019548001F0460BDE8704000F010 -:100D400094BA70B5904C05460220207305F07AFEE7 -:100D5000024694F82C10284605F002FF8D4A002127 -:100D60002061C2F84411A16A08448849091F08603B -:100D700070BD84494FF48000091D08608248416BB2 -:100D800021F48001416300210173704781480121F2 -:100D90004160C1600021C0F844117C48001F01601F -:100DA0007948816270477C4940202431086073484B -:100DB000D0F8001241F04001C0F8001270476F48AF -:100DC000D0F8001221F04001C0F800127249002052 -:100DD0002431086070476948D0F8001221F01001F2 -:100DE000C0F8001201218161704764480021C0F8F9 -:100DF0001C11D0F8001241F01001C0F80012704729 -:100E00005E4908B5D1F81C21012A01D0002008BD97 -:100E1000614A0C32126802F07F02524202700020D6 -:100E2000C1F81C015E4800680090012008BDF8B5BB -:100E3000554C584D207B18B1D5F8440101280AD0F3 -:100E400000264E49D1F81001012806D00022A07AD0 -:100E5000012804D007E00126F3E74022F7E7D1F8A4 -:100E60000C31012B04D000231343012802D005E0EC -:100E70002023F9E7D1F80421012A05D000221A43E2 -:100E8000484F022802D008E01022F8E73B68012B07 -:100E900003D1D1F80C31012B04D0002313430228D5 -:100EA00002D007E00823F9E73A681AB9D1F80C2113 -:100EB000012A04D000221A43022802D004E00422AE -:100EC000F9E70EB1022300E000231343022809D101 -:100ED000D1F80401012805D1D5F84401012801D039 -:100EE000012600E0002630481E43026812F0FF0F82 -:100EF00003D0D1F81421012A00D0002284F82E203A -:100F0000006810F0FF0F03D0D1F81801012800D0BD -:100F1000002084F82F0023481030006884F8300047 -:100F20001D4824300068402803D1FFF716FB012834 -:100F300000D0002084F83100FFF7EEFB0020C5F858 -:100F400044011348001F006800903046F8BD30B5DA -:100F50000C00054600D1FFDFE00702D0012C00D0D5 -:100F6000FFDF55B10221084801294172C4720348CC -:100F70001ED0022921D0FFDF30BD17E00010004055 -:100F80000000040404F501407C080020488500406E -:100F900048810040008000403C150040AD0000202A -:100FA0001C11004000140040401600400121DAE707 -:100FB000D0F8001241F0040103E0D0F8001241F033 -:100FC0000801C0F80012D7E770B5AD4C0022E17AF5 -:100FD0008B0701D5430711D4CB0605D594F82F30E4 -:100FE00013B194F831304BB10B0702D594F820308F -:100FF00023B9490703D594F8211001B90122637A76 -:10100000A049012533B100F0020010430DD0BDE826 -:1010100070403CE69D4A9C481060D1F8000220F0E8 -:101020000300C1F80002E57270BD0026012B09D053 -:10103000022B17D0FFDFA06A01223044BDE87040C8 -:101040000021B8E4D1F8000220F00400C1F8000249 -:1010500000F004F90123A5721A460021962005F03C -:101060000EFD0FE0D1F8000220F00800C1F80002E8 -:1010700000F0F4F80220A07201231A460021962005 -:1010800005F024FD0646D6E72DE9F047DFF800A27B -:10109000DAF84C0108B1FFF772FC794C7B49606BC0 -:1010A000086000266663FFF7C2FEDFF8E8810546A8 -:1010B000D8F800006062A8F104000068A06205F0A2 -:1010C000C1FC84F82C00A07ADFF8CC9184F82D00C4 -:1010D000022808D1607830B1D9F8001009780140B1 -:1010E000207888430DD084F820606C4FE8070CD03E -:1010F00039786B4A4908606A52F821108847012103 -:101100000AE0012084F82000EFE7A80601D50221BB -:1011100002E0A80707D50021614A3B783832A06A6F -:1011200052F8232090473878C00713D1D9F800101F -:101130000622A01C093105F0D9FF40B9217AD9F85F -:1011400000000078B1EBD01F01D1012000E00020A9 -:1011500084F821002846FFF737FFA80705D5504837 -:101160003978083050F82100804715F00C0F07D06F -:101170004B483978183050F82110C5F3C000884723 -:10118000A80605D546483978283050F82100804710 -:101190003878042800D3FFDFA07A02281AD1207BF8 -:1011A000002817D0CAF8446102280FD0012800D0C7 -:1011B000FFDFA16A2069884200D8FFDFD4F8101051 -:1011C000C8F80010BDE8F04700F04FB82169A06AE8 -:1011D0000144F5E7BDE8F08700B5012802D00228F8 -:1011E00002D0FFDF282000BD182000BD10B541F659 -:1011F000A474012802D0022802D0FFDF204610BDCF -:1012000041F2883010BD10B541F2D474012802D0EB -:10121000022802D0FFDF204610BD41F2040010BDBD -:1012200000B5012802D0022800D0FFDF002000BD59 -:1012300000F01F02012191404009800000F1E020F0 -:10124000C0F88011704700F01F0201219140400951 -:10125000800000F1E020C0F88012704708480021AB -:10126000417281720121C17270470548416B41F49E -:101270008001416305494FF48000091F08607047F1 -:101280007C080020001000400000040408F5014024 -:10129000008000404485004004150040AD0000205F -:1012A0000C77010010B54348222105F0CAFF4148E0 -:1012B0000024017821F010010170012104F084FD67 -:1012C0003C494FF6FF70263981F8224088843A491C -:1012D0000880488010BDE5E7704700F05FB83549E9 -:1012E00001607047344908807047324926398A8C3A -:1012F000A2F57F43FF3B02D00021016008E091F896 -:1013000022202C492639012A02D001600120704791 -:10131000002070472748263810F8221F012908D0DE -:10132000012101702448234926390088888401203E -:101330007047002070472049488070471D491E4B68 -:1013400026398A8C5B889A4205D191F8222012B105 -:10135000016001207047002070471648164A263861 -:10136000818C5288914209D14FF6FF71818410F827 -:10137000221F19B100210170012070470020704721 -:101380000C480D4A2638818C5288914204D190F83D -:10139000220008B100207047012070470549263916 -:1013A0008A8C824205D1002081F822004FF6FF701E -:1013B00088847047DA080020AE00002070473C4A5D -:1013C000012338B1012804D113700868906088881F -:1013D0009081704753700868C2F802008888D080F6 -:1013E0007047334A10B1012807D00EE0507860B141 -:1013F000D2F802000860D08804E0107828B1906824 -:101400000860908988800120704700207047284933 -:1014100010B1012802D005E0487800E0087808B152 -:10142000012070470020704730B50C4605468DB04E -:101430004FF0030104F1030012B1FEF789FC01E053 -:10144000FEF7A5FC60790D2120F0C00040F04000BF -:10145000607104A805F017FFE0788DF81F0020796F -:101460008DF81E0060798DF81D001022294668460F -:1014700005F068FE684604F047FE9DF82F002070D6 -:101480009DF82E0060709DF82D00A0700DB030BD4D -:1014900010B5002904464FF0060102D0FEF758FCB3 -:1014A00001E0FEF774FC607920F0C000607110BDAF -:1014B000B200002070B5FC4E044696F8921000254C -:1014C00006F18000012909D096F88C10012912D06C -:1014D00096F86A00012818D0002070BD65701821A8 -:1014E000217050F8131FC4F802104068C4F80600B9 -:1014F00086F8925024E0657006212170D0F80E0025 -:10150000C4F8020086F88C501AE065701320E64992 -:10151000207020226C31A01C05F014FE0120A07167 -:1015200006F86A5FB188B184E04949684A7B86F869 -:10153000262086F822000888FBF7ACFBFBF771F841 -:10154000012070BDD84890F86A1011B1B0F86E0053 -:1015500070474FF6FF70704770B5D448017811B1ED -:101560000C26304670BDD04C0026354684F86260AB -:1015700084F8636084F8646084F8656084F85E6071 -:1015800084F8606084F8566084F8366084F8676098 -:101590007F21817094F8660028B1FFF710FCFEF7F8 -:1015A000C1FF84F8665084F86A5084F88C5084F83F -:1015B0009250BD489C3004F067FBBB48C43004F037 -:1015C00063FBCEE7B94910B500200870FFF7C4FFF0 -:1015D000002800D0FFDF10BDB34890F862007047CC -:1015E000B14900B591F8580091F85710C0F3800246 -:1015F000C0F340031A4400F001001044052910D242 -:10160000DFE801F00A050A030700A94906E0A94836 -:1016100000BDA749083101E0A549083931F810009B -:1016200000BDFFDF002000BD9F4840F27121B0F8EF -:101630005A00484370479C4890F86800002800D042 -:101640000120704710B5984C207A00F0EDFC40B1B5 -:10165000207C04F1110103F02DFF082801D00120A6 -:1016600010BD207A30B1022804D00120BDE810401E -:10167000FFF7CDBE0020F9E78B49087270478A4911 -:1016800081F8600070477CB50546874890F85D009A -:1016900003F025FF040013D0102104F00BF90028FB -:1016A0000ED12A4669462046FFF7BEFE7E486946AF -:1016B0009C3004F015FB7C4801219C3004F01FFB9A -:1016C0007CBD70B578490A310D4601F1920004F0F5 -:1016D00001FB754C04F19C00617A04F007FB29467C -:1016E00004F1C40004F0F6FA617A04F1C400BDE824 -:1016F000704004F0FBBA2DE9F0416B4C074694F8BA -:101700005D0003F0E2FE064694F85F0004F10A056E -:1017100028B126B11021304604F0CCF8A0B194F8DD -:101720006000002824D094F85E00002820D0607A61 -:10173000294600F08AFCA8B103F073FF3A46294617 -:10174000BDE8F041FFF770BE012060723A462946BD -:101750003046FFF769FE94F85D102846BDE8F04179 -:1017600003F04ABF39462846BDE8F041FFF790BE76 -:10177000BDE8F08170B54C4C207AB0B1022814D08D -:101780000120494960720A310D46FFF72AFE207A8E -:1017900000F04AFC84F85F00082084F85D00607A5D -:1017A000294600F049FC38B901E00020E9E7607AF9 -:1017B000294600F04AFC00B1012084F85E0094F84C -:1017C0005F0028B994F85700012801D0042806D1F9 -:1017D0003549207C113103F06DFE84F85D00002056 -:1017E0002060FDF755FA60600020FFF784FFFFF7E7 -:1017F00068FF94F85700012801D0042803D1BDE800 -:10180000704000203FE770BD70B5274C417B84F8E5 -:101810005810017984F85710012925D0B0F800201C -:10182000A4F85A20827B84F868208279F2B1022AD7 -:101830001CD00122227450F8072FC4F81120808890 -:10184000A4F8150094F85600012508B184F86350F7 -:1018500094F8360008B184F86450052933D2DFE8E3 -:1018600001F0070D2B2D0D000022D9E70022E1E742 -:101870000D4800219C3004F00AFA0FE00A480121CB -:101880009C3004F004FA0849113101F18B0004F096 -:1018900027FA0548217C9C3004F031FA02480121E6 -:1018A0009C3000F0DDFB0FE0FC080020C0000020B1 -:1018B00064770100D0891300062100E00221FA4874 -:1018C00004F0E5F900E0FFDFF7480421283004F0D8 -:1018D000DEF984F86250002070BD70B50546F24C08 -:1018E00000209C3C04F8640FEF482A46853805F038 -:1018F00029FC04F82E5C0120207070BD10B5EA4C64 -:1019000000229C3C84F8632004F8560F0246E64807 -:10191000653805F017FC0120607310BDE2499C3961 -:1019200081F86700704770B500F0ADFBDE4C9C3C61 -:10193000002694F8660028B1FFF741FAFEF7F2FDA1 -:1019400084F86660D94D2E7094F85700012804D0B1 -:10195000BDE87040002001F07EB9022001F07BF963 -:1019600094F86A0000B1FFDF6878002817D0207C67 -:1019700084F87100D4F81100C4F87200B4F81500AE -:10198000A4F876003C2084F86C0068680088A4F80D -:101990006E00012084F86A0000F06BFB6E7070BD71 -:1019A00010B50024C20701D0CA0708D082070BD5A2 -:1019B0008A0709D42620FEF7C7FF02240CE0252061 -:1019C000FEF7C2FF012407E0400705D5480703D40E -:1019D0002720FEF7B9FF0424FEF704FF204610BDC0 -:1019E0002DE9F041B148017859BBAF4C9C3C94F8CB -:1019F000621031B3002584F8615045702846583490 -:101A0000FFF783F9FEF712FFFEF7ECFEA848FEF79A -:101A100091FFA748C01EFFF763F920780021FFF768 -:101A2000BFFF2071FFF76BF9002101220846FFF785 -:101A300032F80F210520FEF749FFA079583C58B92C -:101A400001E00C2094E694F85F0028B994F8570060 -:101A5000012801D0042828D1FDF71AF9064631469D -:101A60006068FDF723FE934990FBF1F701FB170037 -:101A700041423046FCF715FE606020683844206023 -:101A800003F014FD216888420FD8C4E900560120F4 -:101A9000FFF731FEFFF715FE94F85700012801D03B -:101AA000042802D10120FFF7EEFD7F48617A9238C9 -:101AB000FEF700FF94F8570001280DD004280BD042 -:101AC00094F8630040B1784994F856206539764817 -:101AD00004F01CF984F8635094F8640048B172492A -:101AE00094F83620853901F1AD0004F025F984F829 -:101AF000645003F03BFD6C48503003F06CFD84F8FB -:101B00006600002034E669494860704770B5664C4D -:101B10000500A4F19C040AD094F85C1014F8580F46 -:101B2000FFF73EFF14F8041F084304F85C0994F81B -:101B3000610038B194F85700012800D1FFDFBDE8FB -:101B40007040F0E635B1002201234FF49671104643 -:101B5000FFF718F85448FFF7DBF894F8570005280A -:101B600009D2DFE800F0030303090300012108465E -:101B7000FFF7EDF900E0FFDF94F8581094F85C00EF -:101B800081434FF0010005D194F85710012904D08A -:101B900084F861004549087070BD002184F85C102C -:101BA000F8E7424810B5007848B93F489C3890F8AB -:101BB000620020B10020FFF7A9FF002010BD00F057 -:101BC00062FA0C2010BD394901204870704736492F -:101BD0009C3981F86500704770B5002500F016FF4C -:101BE00048B1324E3078012808D0022801D00328AD -:101BF00033D0FFDF70BDBDE8704094E62A4C9C3CBA -:101C000094F85700032828D094F8660018B1FEF71E -:101C100075FCFFF7C8F824485030FFF779F8962094 -:101C2000FFF78FF894F8570001280DD004280BD047 -:101C300094F86800012801D0032800D1102545F050 -:101C40000E010020FFF783F994F86700012801D105 -:101C5000FFF7CBF80220307070BDBDE87040012066 -:101C600054E710B5104C9C3C94F86700012801D152 -:101C700000F014FA94F8660018B1FFF7A0F8FEF728 -:101C800051FC00F0C3FEB8B1084C2078022800D007 -:101C9000FFDF0120FFF73AFF2078002803D02078EB -:101CA000012800D0FFDF10BD98090020C0000020EF -:101CB0005777010040420F00BDE8104033E610B5F1 -:101CC00003F0F8FB044603F0AEFC38B1204603F005 -:101CD00006FC18B1102103F0EDFD08B10020E2E789 -:101CE0000120E0E72DE9F84F04460026FEF71EFE2E -:101CF000DFF8C493074699F80000022800D0FFDF00 -:101D0000DFF8B8A39AF86700012801D100F0C6F9FE -:101D1000EA48EC3003F0DAFFFF258046002C78D04B -:101D2000E648EC3004F01EF8002872D0FEF7CAFD39 -:101D300000286ED0E14C9AF86600EC3460B103F0F4 -:101D4000FBFB0546FF2807D00146E01C03F0E8FB3B -:101D5000284603F0FBFB0743DFF860B3B8F1060F3A -:101D60000BF1800B55D2DFE808F097979703975552 -:101D70009AF8571001294CD0D046042949D067B9A8 -:101D800098F8680008B1022843D12078E11CC0F31C -:101D90008010FFF794FF00287ED198F8670047462F -:101DA00001282ED197F8920058BB012087F89200A5 -:101DB000FF2D0DD0C14A28469432511E03F099FBE5 -:101DC00000B9FFDF17F8930F40F0020038700CE005 -:101DD0002078C0F3801088F89300DBF86F10CBF800 -:101DE0001410BBF87310ABF81810B44D99F802003A -:101DF0009A354C467F2800D1FFDFA07828707F20DD -:101E0000A070AE48C430FEF783FF032189F80010AC -:101E100043E041E020789AF81010A046C0F380100B -:101E20005446884207D1A5490622113108F1030022 -:101E300005F05CF920B10020FF2D08D088B901E041 -:101E40000120F9E794F85D00A8420AD00FE070B1D4 -:101E500098F8000008F10301C0F38010FFF72FFF8E -:101E600028B994F85700012813D0042811D094F809 -:101E7000570088B96FB994F8680008B101280BD1F0 -:101E800098F8000008F10301C0F38010FFF717FF76 -:101E900010B994F86500C8B101269AF8660018B127 -:101EA000FEF78DFFFEF73EFB16B10120FFF72EFE79 -:101EB00099F800104846002906D00178012903D07E -:101EC0000078032800D0FFDFBDE8F88F7B49D9F800 -:101ED00004008031C34651F87B2FC0F80E208A8859 -:101EE00042828979017598F816204275B8F8172052 -:101EF000C282B8F819204280B8F81B208280B8F856 -:101F00001D20C2806E4A4146D2F80B308360D27BDE -:101F1000027311F8242F02F01F02027611F81F2914 -:101F2000520980F8442111F8051C427BC1F340118D -:101F30000A40427394F86A0000B1FFDF002784F87A -:101F40006C70D9F80400C8460188A4F86E10418866 -:101F5000A4F884108188A4F88610C188A4F8881099 -:101F600090F8440184F88A00544894F85F100A30CD -:101F7000009021B1607A009900F067F838B994F8C0 -:101F8000600058B1607A009900F056F830B1D4F88A -:101F90000A00A067E089A4F87C0002E0A767A4F823 -:101FA0007C709BF80000454AC0F38011D8F804000B -:101FB0008032FF2D417652F86F1FC0F81A109288B8 -:101FC000C28313D0C4F87E103C4AC08BA4F88200B0 -:101FD0007232511E284603F08CFA00B9FFDF94F8E4 -:101FE000710040F0020084F871000DE0C4F87E70CA -:101FF000A4F88270417E84F87110D0F81A10C4F8E9 -:102000007210C08BA4F87600012084F86A0000F0FA -:1020100030F888F8007000F036F8012000F01BFE60 -:102020003BE7012200F03FBE022803D0032801D085 -:102030000020704701207047012802D148798009AB -:1020400001D00020704701207047012806D148794F -:102050000121B1EB901F01D1012070470020704792 -:102060000278202322F0200203EA41110A43027081 -:102070007047114810B540680088FAF70BFEBDE8BC -:102080001040FAF7BFBA10B5FEF780FEFEF771FEFA -:10209000FEF7FDFDBDE81040FEF728BE064810B56E -:1020A000801CFEF7ADFE10B903497F208870BDE8A3 -:1020B0001040FEF790BE0000C0000020FC08002089 -:1020C000FC090020FE484068704770B506460D4682 -:1020D00014461046FFF78AF8022C10D0F94908443C -:1020E0004FF47A7100F2E140B0FBF1F000EB4600F2 -:1020F00005442046FFF770F82844603070BDF2496F -:10210000EDE72DE9F0410D46064601461746012050 -:1021100003F0B3FC044696F83200FFF767F896F830 -:102120003210022914D0E74940F2712208444FF4DA -:102130007A7100F2E140B0FBF1F170885043C1EBDD -:102140004000C01BA0F55970A54203D2214602E011 -:10215000DD49E9E72946814204D2A54201D2204661 -:1021600000E028467062BDE8F0812DE9FF4F89B09C -:10217000044690F83200DDF858909A46039049EAF8 -:102180000A00089094F844000025164619460D28C8 -:1021900003D00020069011B131E00120FAE794F855 -:1021A000E40003282BD1069848B3B4F85C01B04290 -:1021B00025D1D4F8EC00C4F8D800608840F2E241A0 -:1021C0004843C4F8DC00B4F83201B4F8BE10084447 -:1021D000C4F8E000204602F06CF9B4F86001E08237 -:1021E00094F85E016075B4F862016080B4F864012F -:1021F000A080B4F86601E080022084F8E400D4F8FE -:102200003C010290B4F8BE00D4F838810090B4F8D4 -:102210003011D4F82C010590BAF1000F04D094F8D5 -:10222000F80000287DD108E004F59670049004F5CC -:102230008C7704F1B80B001D07E004F5887004905A -:1022400004F1FC0704F5867B001D0790208F301AEF -:1022500000B20190701A00B2002805DAD4F8280103 -:10226000059001200890019894F8E410E9B1012943 -:102270007DD002297CD003297BD0FFDF2946059839 -:10228000FCF70FFA049908600798012106800020E6 -:102290003870397104980068B8608C48D0E905201E -:1022A000824267D9CBF8000081E1B8F1000F00D17C -:1022B000FFDFE08A40F271214843490001EB400012 -:1022C0000A9900F065FDC4F8E800608840F2E24138 -:1022D00048430A9900F05CFDC4F8EC0082B2204645 -:1022E000A16AFFF70EFF14F8320FFEF799FF4FF4C3 -:1022F0007A7100F2E140B0FBF1F101EB08000090CF -:102300002078FEF78DFF14F83219024602293FD0DB -:102310006C4815180846FEF769FF29184FF47A70C3 -:1023200000E075E101F2DB51B1FBF0F1E08A40F22F -:1023300071225043C1EB4001D4F8E80040F2E2437F -:102340000A1A0099551894F83220617D11FB03F1A7 -:1023500005F2C245FFF7B9FE5C49801C48618861FF -:1023600094F83200FEF75CFF4FF47A7103E087E0E7 -:1023700010E0BDE018E100F2E140B0FBF1F101EB4B -:102380000800281AB0F53D7FBFF478AFFFDF75E78E -:102390004D48BEE7E08A40F27122D4F8DC10504389 -:1023A00001EB40000A9900F0F3FCC4F8E8006088F3 -:1023B00040F2E24148430A9900F0EAFCC4F8EC001C -:1023C00082B22046A16AFFF79CFE009848BBB9F193 -:1023D000000F26D094F83200FEF708FF94F8321070 -:1023E000024602291BD0374840F2712510444FF4B1 -:1023F0007A7200F2E140B0FBF2F0D4F8E820D4F8B1 -:10240000DC300244E08A684303EB4000851A08464A -:10241000FEF7E2FE0299081A0544203D0CE02A4826 -:10242000E2E7E08A40F27122D4F8DC10504301EB7D -:102430004000D4F8E810451AD4F8E020D4F8D810B9 -:10244000D4F8E80040F2E24301FB020094F83220A5 -:10245000617D11FB03F1C834FFF737FE01461B48CD -:1024600040F27123416134F8C61C626A5943C2EBE1 -:102470004101A1F21331816101202077C83CFDE6C2 -:10248000628840F27123D4F8EC105A43C1EB420544 -:102490004543DDE900021044D4F8E020D4F8D8C068 -:1024A000801AD4F8E830401E0CFB023200FB0120F9 -:1024B00094F83220617D40F2E24311FB03F107E022 -:1024C000100A0020A224020004360200C8000020E6 -:1024D000FFF7FBFD0146FE48B9F1000F4161A5F28F -:1024E00013318161CBD0B8F1000FC8D1FFDFC5E651 -:1024F000618840F27123D4F8EC205943C2EB4105C6 -:10250000454394F84300212803D094F8440021283F -:1025100009D1B4F85C01301A00B2002803DB94F84A -:102520005F0100B10390089828B100980028029834 -:102530001AD000B1FFDFDDE900010844D4F8EC1047 -:10254000039A48430021FFF7C0FD0146E04840F2EE -:10255000712341616188D4F8EC205943C2EB4101F9 -:10256000A1F21331816189E610B1B8F1000F00D1F9 -:10257000FFDF0398FEF73AFE01460398022811D0C8 -:10258000D44808444FF47A7100F2E140B0FBF1F016 -:102590002D1A94F83200FEF71FFE0299081A05441E -:1025A000203DC8E7CC48ECE71046CBF80020626A33 -:1025B000104400F28310F8607971B4F8A800801B11 -:1025C00000B2002801DD03207871069820B3B9F12C -:1025D000000F17D0B4F8D020C2B3B4F8D20000BFB7 -:1025E000A4F8D20094F8D430401C4343934209D25B -:1025F0007879401E002805DD7971B4F8D200401CBE -:10260000A4F8D200BAF1000F27D094F8F80000B374 -:1026100002200DB0BDE8F08FB9F1000FDAD194F8C7 -:10262000E4000028EED0608840F27122D4F8EC106B -:102630005043C1EB4001384603F0E3F90004000CBD -:10264000E0D0179901B108800120E2E7FFE7002000 -:10265000C6E794F83401FCF775FE94F83401394666 -:1026600000F07CFB18B18AF0010084F8F90000202A -:10267000CFE7FEB50446FCF70BFB0146D4F8280172 -:10268000FDF714F8214600F08DFB94F844100D2955 -:1026900009D0228FB4F8F6101318994206DB491CB2 -:1026A000A4F8F61006E0B4F8F6000CE0401C104464 -:1026B000A4F8F60094F8FA0040B9B4F8F600B4F8BB -:1026C000AC10884202D1401CA4F8F600B4F83201E4 -:1026D0007F4D401CA4F83201B4F85E00B4F85C10E1 -:1026E000401A218F401E084486B216E07B482978A4 -:1026F00002AF002330F81110CDE9003794F84431CF -:1027000030F813000023084481B22046FFF72DFD66 -:10271000002821D0012817D0FFDFB4F8F620B01A26 -:1027200000B20028E2DA082084F85300012084F87F -:102730005200204601F07FFB204600F011FB287973 -:10274000BDE8FE40F6F7D0B9B4F8F600BDF80810C1 -:102750000844A4F8F600E0E7FEBD2DE9F041604C26 -:1027600003270125277500202074E07A04F1100664 -:1027700050B14FF47A71A069FBF793FFA06100217B -:10278000304603F03EF910E0002000F04AFB054619 -:10279000FEF74AFF05442946A069FBF782FFA061C6 -:1027A0002946304603F02DF9451C208C411C0A298E -:1027B00001D228442084606830B1208C401C0A2853 -:1027C00002D30220607500E06775607A002806D1A8 -:1027D000207B314600F0C2FA002800D1FFDFC2E4BE -:1027E0002DE9F04106463E480F460178384D032951 -:1027F00009D1017BB14206D1406828613846BDE865 -:10280000F04100F023BB304600F09EFA0621FAF7B3 -:102810000FF9040000D1FFDF304600F095FA21885F -:10282000884200D0FFDF214638462C61BDE8F041E8 -:1028300000F0C5BA10B52A4C207848B1012060726A -:10284000FFF7C5F92078032804D0207A002800D0AB -:102850000C2010BD207BFCF775FD207BFCF7BFFF33 -:10286000207BFCF7F6F900B9FFDF0020207010BDD7 -:1028700010B5FFF7DFFF00F016FB19490020C87202 -:1028800010BD70B50446012000F04FFAC5B20B2010 -:1028900000F04BFAC0B2854200D0FFDF6FF00400B9 -:1028A00000F043FAC5B2192000F03FFAC0B28542E9 -:1028B00000D0FFDF0649002001220C7188700A70E9 -:1028C0004870C87006490870BDE87040D0E7000045 -:1028D000C8000020A2240200043602007477010020 -:1028E000100A0020F749087070472DE9F041F64CB6 -:1028F00006462078E8BBF548FCF751F920732028FC -:1029000042D04FF00308666084F8008000256572AD -:1029100025727EB1012106F1D400FDF738FA0620B8 -:10292000FAF732F816F8D41FB1FBF0F200FB1210E0 -:10293000401C3070FCF786F940F2F651884200D214 -:10294000084600F23D1086B2FEF74AFEE061FEF74F -:102950006BFE0127D0B1A772002000F062FA064496 -:10296000FCF796F93146FBF79CFEA06184F81480D1 -:1029700000E009E084F81580D3492574207B1031EC -:1029800000F0ECF960B90AE00C2028E7FCF780F9C8 -:102990003146FBF786FEA061A572E772E6E7FFDF2E -:1029A00025840020FFF713F9002018E77CB50025E7 -:1029B000044680F8E450A0F83051C24900950195D2 -:1029C000C348097894F844212B4630F8111030F8A8 -:1029D00012002A46084481B22046FFF7C6FB00B128 -:1029E000FFDF44F8E05F012044F8085C2071E582D5 -:1029F000A582A57634F8A80C401E24F8A80CA4F8EB -:102A0000525000207CBDAF4948707047AE4810B5A9 -:102A1000417A012409B1002408E0C17A31B1406A49 -:102A2000AC49884202D90024FFF7CDF8204610BDFA -:102A300070B5A44C0646E088401CE080D4E9020151 -:102A40006278D6F8385112B12A4603F004F8A06033 -:102A5000854205D896F8E400012801D0E07808B155 -:102A6000002070BD012070BD70B504460D460846BB -:102A7000FEF7BCFB022D10D0974908444FF47A7141 -:102A800000F2E140B0FBF1F040F2E2414C4300F5CE -:102A90004D70844203D9201A70BD9049EDE70020A3 -:102AA00070BDFEB50025044680F8F85090F8B600D9 -:102AB000002849D194F8E400032845D1FCF7E8F850 -:102AC0000146D4F82801FCF7F1FD00283CDD214641 -:102AD00000F068F9411C208F0144A4F8F410B4F808 -:102AE000F410B4F8AC20511A09B200292CDD0121F0 -:102AF00084F8FA10B4F85E10B4F85C20891A491E04 -:102B0000084486B21AE06F49714802AA097830F881 -:102B10001110CDE90052B4F8F42094F8443130F8A3 -:102B200013000123084481B22046FFF71EFB002852 -:102B30000AD0012809D0022806D0FFDFB4F8F4003B -:102B4000301A00B20028DEDAFEBDB4F8F400BDF899 -:102B500008100844A4F8F400F0E77CB5002504460A -:102B6000012902D15748C17861B1042084F8E400FA -:102B7000FBF79AFFA4F83251208FA4F8F60084F8EE -:102B8000FA507CBD5249007894F8E42031F81000E6 -:102B90000123032A14D0012AEAD100BFCDE9003570 -:102BA00094F84431B4F8AC2031F8131000230844F1 -:102BB00081B22046FFF7D9FA0028D9D0FFDFD7E746 -:102BC000C4F8E050C4F8D850E8E770B53E4C002691 -:102BD0003546E07A08B1E57219E0A07A18B1012013 -:102BE00000F01FF90646FEF71FFD8119A069FBF7EB -:102BF00058FDA061257403206075607A30B93249B0 -:102C0000207B103100F0AAF800B9FFDF2584FBF724 -:102C10004BFF2C480079BDE87040F5F765BF10B553 -:102C2000062916D2DFE801F00509030C0C0D00217E -:102C300000E00121BDE810408FE7032180F8E41097 -:102C400010BDB0F8EC108AB2816ABDE81040FFF701 -:102C500058BAFFDF10BD10B548B1012803D00228D3 -:102C600005D0FFDF10BDBDE8104000F048B9BDE859 -:102C70001040AAE770B5134CA178022912D1E1885F -:102C800000290FD12569C5F83C0195F83200C035FF -:102C9000FEF7A2FAE96F081AA1680144A160E16891 -:102CA0000844E06070BD70B5054606488378022B85 -:102CB00016D0054C2434C1B1012915D0022916D0F3 -:102CC000FFDF70BDC8000020100A0020E1270100CE -:102CD00074770100DB821300A22402000436020094 -:102CE000046904F59C74E6E76D1E2560E9E710466B -:102CF000FEF789FA4FF47A7100F2E140B0FBF1F08F -:102D0000281A2060DDE7D24810B5007808B100200D -:102D100010BD0620F9F72AFE80F0010010BDCC4856 -:102D20000078002800D001207047002806DA00F063 -:102D30000F0000F1E02090F8140D03E000F1E02016 -:102D400090F800044009704710B50446202800D3CD -:102D5000FFDFBF48283030F8140010BDFCF7E0B9A1 -:102D600070B50446002084F8E40094F834514FF61E -:102D7000FF76202D00D3FFDFB548283020F81560FE -:102D800094F83401FBF765FF202084F8340198E7BC -:102D900002460020002904D0AE485143B1FBF0F0B8 -:102DA000401C7047002809D0D1F8EC20498840F237 -:102DB00071235943C2EB4101B0FBF1F0704770B58C -:102DC0000125A54E0C46082829D2DFE800F0040FA3 -:102DD00017171228281B204600F0FAF8204600F0AA -:102DE000BAF884F8F8500220B0706AE701F05FFB8F -:102DF00001E0FEF749F984F8F85062E72046BDE8A3 -:102E0000704036E494F8E400042800D0FFDF204648 -:102E1000FFF7A6FF3079BDE87040F5F765BEFFDF2C -:102E20004FE708B500284FF00101684602D0FCF7D3 -:102E30008FFF01E0FCF782FF9DF8000042F2107165 -:102E40000002B0FBF1F201FB120008BD70B5804C2E -:102E500005462078032800D0FFDF0026082D20D269 -:102E6000DFE805F0040D1717131F1F1A6662FEF73F -:102E7000B7FD00B1FFDF78490320887021E7FEF736 -:102E800090FE0028FAD0FFDF1BE7BDE87040FEF798 -:102E9000FBB8BDE8704060E4207BFBF7DAFE2670EB -:102EA0000FE7FFDF0DE7FEB56B4C0120E0704FF63A -:102EB000FF750CE00621F9F7BBFD060000D1FFDF2E -:102EC00096F83401FCF78BFC3046FFF749FF694662 -:102ED0000620F9F73AFD50B1FFDF08E0029830B163 -:102EE00090F8E41019B10088A842E3D104E06846E4 -:102EF000F9F709FD0028F1D00020E070FEBD70B5A3 -:102F0000534C0020E072A66920700120207200213D -:102F1000606802F042FC6068C0F82861257B80F898 -:102F20003451616AC0F82C61C0F838110688202D30 -:102F300000D3FFDF4648283020F815606068FFF7AF -:102F400035FD00B1FFDFFBF7AFFD43480079BDE879 -:102F50007040F5F7C9BD70B50546FBF773FE95F8EF -:102F6000326004463046FEF741F9022E26D03B4936 -:102F700040F2712208444FF47A7100F2E140B0FB54 -:102F8000F1F0D5F8EC10014468885043C1EB4006DD -:102F9000303EB72C00D8B7242946012002F06DFD41 -:102FA0002044341A29460120A4F2193402F065FDA8 -:102FB000696A9C30814203D9081A02E02849D7E7A0 -:102FC00000202549A042CC6000D32046886078E6E6 -:102FD00010B5044620490020C4F83801C880C4F860 -:102FE0003C0194F8F90038B9FBF752FED4F804110B -:102FF000FCF75CFB002811DCB4F8F610208F81424E -:1030000001D1B4F8AC10081AA4F8AE002187D4F8A6 -:103010002001C4F80401C4F8280114E034F8F40FC6 -:1030200034F8BC1C401A24F8460C208824F8BC0C48 -:103030002069E0626063A06944F83C0CE069A06329 -:10304000208CA087F43C2046BDE8104001F027B951 -:10305000100A002040420F00C8000020A2240200F5 -:1030600004360200012806D0022807D0042808D020 -:10307000082808D105E0012907D004E0022904D07E -:1030800001E0042901D0002070470120704770B58D -:10309000F74CE06890F844001B2800D0FFDFE068A0 -:1030A000002580F86B5090F8780100B1FFDFE068F0 -:1030B00090F86C1041B180F86C500188A0F87C1138 -:1030C00080F87A510D2108E00188A0F87C1180F881 -:1030D0007A51012180F87E110C2180F87811008846 -:1030E000F9F7D8FDF9F78EFAE078F5F7FDFCE0681E -:1030F00080F8445070BD70B5DD4C2079800725D52F -:103100006078002822D1226920460125D378C16841 -:103110009B1E01F13800162B7CD2DFE803F00B97E1 -:103120004D596A18973597436D6097979760717CF2 -:103130009797828F91F846200123194602F029FCC7 -:10314000002803D1E168082081F8460070BD10799D -:1031500091F843200A2A09D191F8A220824205D190 -:10316000002081F8430081F8660070BD91F84500A9 -:10317000020707D520F0080081F84500BDE870403F -:1031800001F02ABAFFDF70BD91F84500C00700D1F9 -:10319000FFDF01F021FAE06810F8451F21F001017E -:1031A000017070BD91F84400102800D0FFDFE06886 -:1031B000112180F86B5008E091F84400142800D0E9 -:1031C000FFDFE068152180F86B5080F8441070BD77 -:1031D00091F84400152800D0FFDF172005E091F892 -:1031E0004400152800D0FFDF1920E16881F8440071 -:1031F00070BDBDE870404AE7BDE8704001F0F8B925 -:1032000091F843200123002102F0C3FB00B9FFDF46 -:103210000E200FE01AE011F8450F20F004000870AE -:10322000ACE791F843200123002102F0B2FB00B982 -:10323000FFDF1C20E16881F8430070BD91F8440075 -:103240001E2801D000B1FFDF1F20CEE7FFDF70BDD9 -:103250008748C16891F84520130702D501214170C4 -:10326000704742F0080281F845204069C07881F833 -:10327000A10001F0A8B910B57D4CE1680A88A1F859 -:10328000A42181F8A20191F8310001F049F9E16827 -:1032900081F8A60191F8320001F042F9E16881F865 -:1032A000A701012081F8A001002081F86801E078E1 -:1032B000BDE81040F5F718BC10B56D4C012309218D -:1032C000E06890F84320383002F063FB38B1E168E1 -:1032D000002001F85A0F087301F8170C10BD0120E7 -:1032E000607010BD2DE9F843614CE06890F8431020 -:1032F0001D2909D05FF0000790F844101F2905D060 -:1033000077B300F1430503E00127F5E700F1440539 -:1033100010F8741F41F004010170606902F00DFEA5 -:103320004FF001080026F8B13946606901F00AF94A -:10333000D0B16A466169E06802F0C7FB80B360699A -:1033400002F0F9FDE168A1F85C01098F01F0DCF8F9 -:1033500038B3E068282180F8531080F8528041E0AB -:1033600002206070BDE8F883E06890F8680110B151 -:103370001E20FFF780FFAFB16069E168C07881F877 -:10338000A20008FA00F1C1F3006000B9FFDFE068B5 -:103390000A2180F8431090F8660040B9FFDF06E08C -:1033A00009E014E02E7001F017F9FFF751FFE06813 -:1033B00080F85B60D6E7E06890F8680110B1002003 -:1033C000FFF759FF2E70E06880F85B600AE0E06864 -:1033D0009DF8001080F85E119DF8011080F85F11D3 -:1033E00021202870E06800F144018D4203D1BDE83E -:1033F000F84301F0F1B880F86660B3E770B51C4C93 -:1034000001230B21E06890F84420383002F0C1FA23 -:10341000202650BBE0680123002190F8442038307A -:1034200002F0B7FA0125F0B1E06890F843002128D6 -:103430001BD0606902F071FDE0B1E06890F8741093 -:1034400041F0040180F8741061694A7902F00702C2 -:1034500080F83020097901F0070180F82F1090F8EA -:10346000693133BB09E0657070BD667070BD0000E6 -:10347000E4000020BDE87040EAE690F86831C3B986 -:1034800000F131035E788E4205D11978914202D164 -:1034900080F85B500DE000F5CD710D7002884A8018 -:1034A00090F82F200A7190F830004871E078F5F715 -:1034B0001BFBE1681E2081F84400BDE8704001F06C -:1034C00082B870B5FE4CE06890F84510890707D5C2 -:1034D00090F8432001230821383002F05AFAE8B16D -:1034E000E06890F86E00800712D4606902F009FD70 -:1034F000E16881F86F00606930F8052FA1F870204D -:103500004088A1F8720011F86E0F40F002000870B8 -:10351000E06890F86E10C90703D00FE001206070DA -:10352000A4E790F84500800700D5FFDFE06810F8B9 -:10353000451F41F00201017001F045F8E0680025E7 -:1035400090F84310062906D180F8435080F8665061 -:10355000E078F5F7C9FAE06890F85A11042985D1A6 -:1035600080F85A51E078F5F7BFFAE06890F8431018 -:103570000029D5D180F8665078E770B5D04C01238A -:103580000021E06890F84420383002F002FA01256A -:1035900078B9E06890F84420122A0AD00123052166 -:1035A000383002F0F6F910B1082060705EE76570FF -:1035B0005CE7E06890F86C0008B901F004F8E16895 -:1035C0006069C03102F08BFCE1686069983102F0FB -:1035D0008CFCE06890F8800100B1FFDFE1680888AA -:1035E000A1F8820101F5C271606902F070FCE16826 -:1035F000606901F5C67102F06FFCE06880F88051E7 -:10360000142180F84410E078BDE87040F5F76CBAFA -:1036100070B5AB4C01230021E06890F844203830AD -:1036200002F0B7F90125A0B1606902F026FC90B163 -:103630006069E168B0F80D00A1F85C01098F00F045 -:1036400063FF58B1E068282180F8531080F8525089 -:103650000CE765700AE7BDE87040F9E56069E1686C -:10366000027981F85E21B0F80520A1F8602102F00E -:10367000FBFBE168A1F86201606902F0F8FBE16818 -:10368000A1F86401606902F0F5FBE168A1F8660148 -:103690000D2081F84400E9E67CB5894C2079C0070B -:1036A00033D0606901230521C578E06890F8442093 -:1036B000383002F06EF968B1022D0BD00A2D09D016 -:1036C0000B2D07D0032D05D0062D03D0607840F0D8 -:1036D000080060706078002817D160690226C578FC -:1036E0001DB1012D01D0162D18D1E06890F84300CE -:1036F00002F042F990B1E16891F843001C280DD026 -:103700001D2803D0162D1AD066707CBD222081F8AA -:103710004300162D70D02A20FFF7ADFD192D6CD275 -:10372000DFE805F0262310358C8C3889498C292C4C -:10373000468C8C8C8C866F6C8C8C808C83002020CB -:1037400060707CBDE0680123194690F8462038304F -:1037500002F01FF920BB606902F0B7FBE16881F855 -:103760004801072081F846006AE000F0E9FF67E0C1 -:10377000FFF74EFF64E000F0C3FF61E0E06890F8FF -:10378000441011290BD1122180F8441058E0FFF7A2 -:10379000F4FE55E0E06890F84400172801D0667008 -:1037A0004EE000F019FFE1681B2081F8440047E07B -:1037B000FFF787FE44E0E06890F84500C00703D0BB -:1037C000607840F0010022E06946606902F09BFBEE -:1037D0009DF8000000F00501E06800F8741F9DF8F6 -:1037E000011001F04101417000F0EDFEE06810F8B9 -:1037F000451F41F0010113E014E01FE0FFF75CFDFD -:103800001EE0E06890F84500400702D50120607096 -:1038100016E000F0D8FEE06810F8451F41F0040102 -:1038200001700DE0FFF7EAFD0AE0FFF75BFD07E03E -:1038300000F045FF04E000F007FF01E0FFF708FD9E -:10384000E168F1E92002401C42F10002C1E90002F6 -:103850007CBD70B51A4C2079000743D560780028EC -:1038600040D1E06890F8A300FF2800D1FFDFE068B6 -:10387000FF2180F8A31090F84410192907D10025E2 -:1038800080F86B5000F0A8FEE06880F84450E068D3 -:1038900090F843101C291CD190F8440002F06CF8F9 -:1038A00098B1E0682221012380F8431090F8442069 -:1038B0000B21383002F06DF858B92A2002E00000E0 -:1038C000E4000020FFF7D7FC03E0E1681D2081F849 -:1038D0004300E06890F84610082903D102212170C6 -:1038E00080F8A310C2E5FA49C96891F85E210AB9C7 -:1038F00091F8312081F8312091F85F210AB991F8CF -:10390000322081F83220002801D00020B3E4704733 -:1039100070B5EF4C06460D46E06890F8A300FF280E -:1039200000D0FFDFE268002082F8A36015B1A2F8A2 -:1039300068009BE522F8620F0120107196E510B532 -:10394000E34C01230021E06890F84320383002F076 -:1039500020F800283ED0E06890F86811002939D09E -:1039600090F86911002935D190F8442001230B21EA -:10397000383002F00EF800282CD1E06890F86A1177 -:1039800090F83100FFF76EFB58B1E06890F86B11CA -:1039900090F83200FFF766FB18B1BDE81040002038 -:1039A00069E4E0680123032190F84420383001F0F5 -:1039B000F0FF00280ED1E0680123022190F8442096 -:1039C000383001F0E6FF002804D10021BDE81040A6 -:1039D00016209DE710BD70B5BD4CE06890F8A310AF -:1039E000FF296FD1617800296CD190F8462001231E -:1039F0001946383001F0CDFF002863D1E06890F817 -:103A0000461149B10021A0F8601090F8471180F8E4 -:103A1000A4100021022041E090F844200123042159 -:103A2000383001F0B6FF054600F0EDFE002849D120 -:103A3000284600F012FF002844D1E068012300214D -:103A400090F84320383001F0A4FF78B1E0680123FA -:103A5000042190F84420383001F09BFF30B9E06831 -:103A600090F85A0010B10021122017E0E06890F899 -:103A700043200A2A0DD0002D24D101230021383003 -:103A800001F087FF88B1E06890F85A1104290CD141 -:103A900007E010F8A21F817000210720BDE87040E8 -:103AA00036E790F86E00800702D0BDE8704046E728 -:103AB00000210C20FFF72CFFE06810F86E1F41F08A -:103AC00001010170D2E43EB505466846FDF70DFCE4 -:103AD00000B9FFDF2221009803F0B3FB0321009817 -:103AE00002F087F90098017821F010010170294651 -:103AF00002F0AEF9764CAD1E162D5BD2DFE805F074 -:103B00000B5A335B5B0B5A3E5A5B10265A5A5A1DAE -:103B10005B5B5A5A2A4FE168009891F8A41017E0AD -:103B2000A26800981178017191884171090A817128 -:103B30005188C171090A01723DE00321009802F029 -:103B400014FA0621009802F014FA34E000980621D5 -:103B5000017130E00098E16891F86A21027191F8F2 -:103B60006B11417127E0E1680098C83102F0C1F99A -:103B7000E16800989C3102F0C1F91CE05549D1E997 -:103B80000001CDE90101E06801A990F8740000F09E -:103B900005008DF80400009802F0BAF90BE0E16826 -:103BA00091F8680100280098D6D111F8312F0271E0 -:103BB0004978D6E7FFDFFDF7ADFB002800D1FFDF36 -:103BC0003EBD434810B5C06890F8491041B990F81F -:103BD000442001230621383001F0DBFE002800D00C -:103BE000012010BD70B53A4DE86890F8471039B122 -:103BF000012905D0022906D0032904D0FFDF35E4CE -:103C0000B0F8AC1041E090F84610082934D0B0F874 -:103C10005C10B0F85E2000248B1C9A4206D3511A27 -:103C2000891E0C04240C01D0641EA4B290F85A1012 -:103C300039B190F8432001230921383001F0A9FE61 -:103C400030B3FFF7BEFF78B1E9680020B1F8562025 -:103C5000B1F854108B1C9A4203D3501A801E00D026 -:103C6000401EA04200D284B20CB1641EA4B2E86827 -:103C7000B0F8AC10214408E0B0F85C100329BFD3C1 -:103C8000018FB0F85E201144491CA0F8A81047E449 -:103C90000024ECE770B50C4605464FF4D47120467D -:103CA00003F0F1FA25803BE4F8F7CBBF2DE9F041B2 -:103CB0000D4607460621F8F7BBFE040042D094F8F3 -:103CC0006C010026E0B16E700820287012E0000040 -:103CD000E40000208C770100268484F86C61D4F81D -:103CE0006E01C5F80200D4F87201C5F80600B4F8F8 -:103CF0007601688194F86C010028EDD1AE7094E0F3 -:103D000094F8780190B394F878010C2813D00D281A -:103D100001D0FFDF89E02088F8F7BCFF0746F8F7FD -:103D200086FC78B96E700D20287094F87A01A8701E -:103D30002088A88014E02088F8F7ACFF0746F8F741 -:103D400076FC10B10020BDE8F0816E700C20287068 -:103D500094F87A01A8702088A88094F87E01A87150 -:103D600084F878613846F8F75CFC5EE0FFE794F889 -:103D7000980130B16E700F20287084F898616F80C0 -:103D800053E094F8800180B16E700920287020887B -:103D90006880D4F884116960D4F88811A960B4F8F7 -:103DA0008C01A88184F880613FE094F88E0140B1D5 -:103DB0006E7016202870B4F89001688084F88E61C7 -:103DC00033E094F8920170B16E701720287005E00E -:103DD00084F89261D4F89401C5F8020094F8920135 -:103DE0000028F5D121E094F89A0140B119202870FB -:103DF00084F89A61D4F89C01C5F8020015E094F8A3 -:103E0000A00100289FD06E701420287009E000BF28 -:103E100084F8A061D4F8A201C5F80200B4F8A601A4 -:103E2000E88094F8A0010028F2D101208BE7FE4A37 -:103E30009060D1707047002180F8431080F84410E2 -:103E400080F8471090F8B61009B1022100E0032174 -:103E5000FEF7E5BE2DE9F041F34C0546E06809B1F7 -:103E6000002104E0B0F8BE10B0F8AE201144A0F874 -:103E7000BE1090F8461139B990F846200123194632 -:103E8000383001F086FD30B1E06830F8601FB0F8DE -:103E90004E2011440180E06890F8663033B1B0F8EC -:103EA0006210B0F8AE201144A0F8621090F96A7068 -:103EB000002F06DDB0F86810B0F8AE201144A0F86D -:103EC000681001213D2615B180F8536013E0227877 -:103ED000022A0AD0012A11D062782AB380F852103F -:103EE00012F0140F0DD01E2113E090F8A420062A22 -:103EF0003CD016223AE080F8521044E090F8482175 -:103F000034E0110702D580F853603CE0910603D5F8 -:103F1000232180F8531036E0900700D1FFDFE168DD -:103F20002A2081F853002AE02BB1B0F86220B0F8C3 -:103F300064309A4210D2002F05DDB0F86820B0F846 -:103F400064309A4208D2B0F86030B0F85E209342F4 -:103F500004D390F846310BB1222207E090F84730A5 -:103F60003BB1B0F85C30934209D3082280F853206B -:103F7000C1E7B0F85C20062A01D33E22F6E7E068EC -:103F800090F8521019B1E068BDE8F04153E7BDE880 -:103F9000F0410021FEF743BE2DE9F047A24C8146D7 -:103FA0000D46E0680088F8F787FE060000D1FFDFC5 -:103FB00060782843607020794FF000058006E06843 -:103FC00004D5A0F85C5080F8BC5003E030F85C1FCA -:103FD000491C0180FFF7F5FD012740B3A0880005CB -:103FE00006D5E06890F8491011B1A0F854501EE0D1 -:103FF000E068B0F85410491C89B2A0F85410B0F829 -:1040000056208A4201D3531A00E00023B4F806C0B8 -:104010000CF1050C634501D880F85A70914206D323 -:10402000A0F8545080F89871E078F4F75DFD20799D -:104030004FF0020810F0600F0ED0E06890F84710C3 -:1040400011B1032908D102E080F8477001E080F83F -:1040500047800121FEF7E3FDE06890F84710012951 -:1040600004D1A188C90501D580F84780B9F1000FB6 -:1040700078D1A188890502D5A0F8D05003E030F8A6 -:10408000D01F491C018000F085FBFFF7A4FC00F065 -:1040900058FD0028E06802D0A0F8B05003E030F8E6 -:1040A000B01F491C018000F04FFD38B1E16891F864 -:1040B000BC00022807D8401C81F8BC00E06890F8DA -:1040C000BC00022804D9E06820F8B05F4580057381 -:1040D000E0680123002190F84420383001F059FCB9 -:1040E00020B9E06890F844000C2859D1E068012319 -:1040F000002190F84320383001F04BFC98B3E06881 -:104100000123002190F84620383001F042FC50B3E2 -:10411000E06890F84710022942D190F8BC0010BB2B -:104120003046F8F754F8F0B1E16891F8A300FF28A1 -:1041300036D1B1F8AA00012832D981F8B570B1F8AA -:104140005E00B1F85C20831E9A4201DB012002E090 -:10415000801A401E80B2B1F8B020E3889A4203D39F -:10416000012204E027E01BE09A1A521C92B290420E -:1041700000D91046012801D181F8B55091F84021AD -:1041800092B1B1F8B220B1F842118A4201D30121B3 -:1041900002E0891A491C89B2884205D9084603E021 -:1041A000E168012081F8B550E1680A8F1044A1F858 -:1041B000AC00FFF717FDA088C0F340214846FFF789 -:1041C00049FEE06880F8B650BDE8F047FDF7C5B895 -:1041D0001549024648788B7818430DD10846C068C7 -:1041E00042B10979090703D590F84600082803D0A1 -:1041F00001207047FEF71CBC0020704770B50A4CC8 -:1042000005460E46A0882843A080A80703D5E807E6 -:1042100000D0FFDF2661EA074FF000014FF00100F8 -:104220001DD06661F27801E0E4000020062A02D089 -:104230000B2A14D10AE0E26892F84430172B0ED111 -:104240000023C2E91E3382F8480008E0E26892F8D1 -:104250004430112B03D182F8481082F86C00AA0771 -:1042600018D52269D278052A02D00B2A12D10AE089 -:10427000E16891F84420152A0CD10022E1E92022BE -:1042800001F8370C06E0E06890F84420102A01D1CC -:1042900080F84910280601D50820A07012E42DE905 -:1042A000F84F4FF00108414661F3070292468146FC -:1042B0000025FE4CA5806570A5702570E06080F833 -:1042C000B6800088F8F7F8FC070000D1FFDFE0684F -:1042D0000088FDF707F8E0680088FDF72CF8E06833 -:1042E000B0F8AA1071B190F8A310FF290FD190F87F -:1042F000461189B190F8462001231946383001F063 -:1043000048FB78B1E06890F8A300FF2804D0E0688B -:1043100090F8A300FFF7D7FBE06890F8B71089B1D9 -:10432000E58018E0E068A0F8605090F8471180F848 -:10433000A41000210220FFF7EBFAE06880F8B550E6 -:104340000220E7E790F86C1119B9018C828891423C -:1043500000D88188E180B0F8AE10491E8EB2B0F866 -:10436000B0103144A0F8B01090F8B41021B1A0F80A -:10437000B25080F8B45004E0B0F8B2103144A0F864 -:10438000B21030F85C1F31440180FFF71AFC20B1F5 -:10439000E06830F8541F31440180E068B0F8AA109A -:1043A000012902D8491CA0F8AA100EB180F8BC500F -:1043B00090F8B510A1B1B0F8B000E18888420FD2F2 -:1043C0003846F7F704FF58B1E06890F8401139B16A -:1043D000B0F8B210B0F84201814201D300F0B7FB4F -:1043E000E06880F8B55090F844100B2901D00C29F2 -:1043F00015D1028FB0F85C31D21A12B2002A0EDB4E -:10440000D0F85E11816090F862110173022101F011 -:10441000C4F9E06880F8445080F8768022E02129D1 -:104420000FD1018FB0F85C21891A09B2002908DB8D -:1044300090F86801FFF757FAE06800F8445FC57527 -:1044400010E090F8431021290CD1018FB0F85C01E5 -:10445000081A00B2002805DB0120FFF744FAE068E3 -:1044600080F84350E0680146B0F8AE20383001F0E3 -:104470000EFAE06890F8401109B1A0F8B2508C48EB -:1044800000908C4B8C4A4946504600F0D6FAE068C2 -:104490000123052190F84420383001F07AFA0028F1 -:1044A00003D0BDE8F84F00F05ABABDE8F88F00F02D -:1044B00019BB10B50446B0F862214388B0F8641106 -:1044C000B0F866019A4205D1A388994202D1E388E7 -:1044D00098420FD02388A4F87031A4F87221A4F870 -:1044E0007411A4F87601012084F86C016F48C0783B -:1044F000F4F7FAFA0121204601F04FF9002004F800 -:10450000440F0320E07010BD401A00B247F6FE7160 -:10451000884201DC002801DC012070470020704740 -:1045200010B5012808D0022808D0042808D008288F -:1045300006D0FFDF204610BD0124FBE70224F9E787 -:104540000324F7E72DE9F0478946044601F0EFFC24 -:104550008046204601F0EDFC544D0446E86890F892 -:10456000681121B190F86A7190F86B6101E0002741 -:104570003E46204601F09BFAA0B1EA6892F831105D -:1045800081420FD03C420AD0B9F1000F0AD1012874 -:1045900008D1022906D192F83000204202D1002031 -:1045A000BDE8F087404601F082FA50B1404601F084 -:1045B0007EFAE96891F83210884202D018EA0600C3 -:1045C000EED00120ECE739480021C06820F8681FD0 -:1045D0008178491C81707047344800B5C16811F872 -:1045E0006A0F401E40B20870002800DAFFDF00BDED -:1045F00010B52E4CE06890F85A11042916D190F8A5 -:10460000432001230021383001F0C3F900B9FFDF56 -:10461000E06890F86E10890703D4062180F84310F3 -:1046200004E0002180F8661080F85A11E06890F8E4 -:104630004500800707D5FFF7CFFFE06810F8451F5A -:1046400021F00201017010BD70B5184D2946E868CF -:10465000496990F8432009790E2A01D1122903D023 -:1046600000241D2A04D005E0BDE87040FEF724BEFA -:10467000162915D0172921D190F844101F291DD1D2 -:1046800080F84440FFF7A8FFE86880F85B4090F8A6 -:104690006801002812D00020BDE87040FEF7EBBD95 -:1046A00080F8434080F866401A20F5E7E4000020D7 -:1046B000993F0100D1410100FD410100EEE510B537 -:1046C0009E4CE06810F8741F41F0040101706069AD -:1046D00001F04DFC162806D1E06890F843001D2833 -:1046E00002D0222805D010BD606901F044FCFEF71D -:1046F000C2FDE168002081F8430081F8660010BD2A -:1047000010B58E4C01230021E06890F84420383029 -:1047100001F03FF930B1FFF756FFE168102081F852 -:10472000440010BDE0680123052190F84420383092 -:1047300001F02FF908B1082000E00120607010BDE1 -:1047400070B57E4C01230021E06890F84420383099 -:1047500001F01FF9012580B1606901F0B3FBE16848 -:10476000A1F85C01098FFFF7CFFE40B1E068282176 -:1047700080F8531080F8525090E565708EE5E1683E -:10478000606901F5AF7101F098FBE1680B2081F8D9 -:10479000440083E510B5FFF75CF8FEF77DFF674C3A -:1047A0002079400708D5607830B9E06890F8460075 -:1047B000072801D101202070FEF79DFC2079C0065A -:1047C00009D5607838B9E06890F844100B2902D117 -:1047D0000C2180F84410A07800070ED5E068012372 -:1047E000052190F84420383001F0D3F830B108208A -:1047F0006070E168002081F8780110BDBDE81040CC -:10480000002000F0CEBA10B528BB4C4CE16891F8FE -:104810004500C20702D00121092018E082070AD50D -:1048200001210C20FFF774F8E06810F86E1F41F0CA -:10483000010101700DE0420702D50121132006E0BD -:10484000000708D511F8A10FC87001210720FFF754 -:104850005FF8012010BD002010BD10B5374CE16895 -:1048600091F8442040B3102A06D0142A07D0152A04 -:1048700019D01B2A2BD119E001210B2018E0FBF7DE -:1048800063FA0C2816D3E0680821C830FBF760FAF9 -:1048900028B1E06804219C30FBF75AFA00B9FFDF29 -:1048A0000121042004E000F017F803E001210620B4 -:1048B000FFF72EF8012010BD1E2A08D191F85B00E9 -:1048C00038B991F8680110B191F8690108B1002078 -:1048D00010BD01211720EBE770B5184C0025E068EA -:1048E00090F8491101290AD0022925D190F86C10BD -:1048F000A9B1062180F8A4100121022017E090F848 -:104900007811002918D100F1880300F1C0010022BC -:1049100000F5A57000F0EAFF0121052007E090F8FE -:104920007400400701D5112000E00D200121FEF7A1 -:10493000EFFFE06880F84951B0E40000E400002097 -:10494000F6480078002800D00C20704710B50446C7 -:10495000FFF7F6FF00B1FFDFF048447210BDEF49EA -:1049600001200872704770B5EC4934314C6804F18D -:10497000380560B14FF4A4721B2114F8323F687CF3 -:1049800000F0A7FB2178BDE87040FBF732BF1F2085 -:1049900094F83110F7E72DE9F0410646DF48DF4D86 -:1049A00034304468DE48686204F138070120FFF7BC -:1049B000DAFF787C38B307F15001D94891E80E103E -:1049C00000F1480888E80E10396EC0F86110796E61 -:1049D000C0F865102230FCF79BF9D148012148301E -:1049E0000176D7E91212C0E90412A0F12602696A21 -:1049F000FBF701FE94F8320000F061FB0146012054 -:104A0000FBF707FE04E0686AFCF782F9FBF723FE78 -:104A10004EB9012294F8323096211046FCF7B2F8D4 -:104A20009620FCF78EF994F82C00012801D1FCF7B0 -:104A3000DCF902202870BDE8F0812DE9F047B74C81 -:104A40008046089F20781D461646894610B90EB14B -:104A500005B107B9FFDFE761C4E905650020C4E9D6 -:104A60000D892072E0712071E0706071AB4FA07110 -:104A7000A0703437A0817E68354636F8380BF8F7D9 -:104A80001BF9E0622888F8F705F92063FBF7CEFEF2 -:104A900005F11200FCF724F905F10E00FBF74AFFBF -:104AA0000120FCF732F9707EFBF74EFFFCF727F987 -:104AB0004FF4A4721B2115F8323F707C00F009FB03 -:104AC0002C782146FBF795FE224600210120FBF7BA -:104AD000E2FF7868D0F8B800FCF71EF9BDE8F047AF -:104AE000012058E78D4800B50078022800D0FFDF8C -:104AF00000BD8A4810B534304468FCF747F9FCF72C -:104B000038F9FCF7C4F8FCF7F1F8FBF7A4FD94F8CA -:104B10002C00012801D1FCF75EF9804CA08900F03F -:104B2000E7FAE269E179E07890470020207010BD53 -:104B30007A4810B50078022800D0FFDFBDE81040A9 -:104B4000D7E77648407970477448007970477349D1 -:104B50000120887170472DE9FC5F83466F481B2751 -:104B60003430A0F1140844686C4D264694F83D009A -:104B70004FF0000A4FF00109383458B3012862D0D1 -:104B8000022864D003286FD0FFDF296AA8460825D1 -:104B9000087820F008000870A37905EAC3031843D9 -:104BA00020F004000870E379042505EA8303184324 -:104BB00020F0100008706779D8F82C00F7F717FB81 -:104BC0000546FCF7DDFB022F55D0012F53D0032FF4 -:104BD00054D056E000F095FA01464FF4A47000F06E -:104BE00061FA1B2800D93846ADF804004046FCF7AE -:104BF000A5FB30B14FF48060296A00F07DFA0320F4 -:104C00001FE06A4601A9E86A00F04AFA286210B17A -:104C100094F8331029B14046FCF761FB84F8059005 -:104C2000B3E79DF8001031B9A0F800A080F802A009 -:104C3000012101F0DEF8BDF80410286A01F09DF9A9 -:104C400002206071A1E74046FCF749FB9DE7ADF803 -:104C500004706A4601A9E86A00F022FA2862002876 -:104C600093D1FFDF91E7FFE74046FCF767FB0028A1 -:104C70008BD1FFDF89E7A84301D002E00DB101210C -:104C800000E00021D8F820004546027842EA0111F0 -:104C90000170217C49B36179012926D004F15001CA -:104CA0001F488EC900F1480888E88E00216EC0F8C0 -:104CB0006110616EC0F865102230FCF729F81848C1 -:104CC000483080F818A0D4E91012C0E90412A0F10D -:104CD00026012A6AFBF78FFC96F8310000F0EFF905 -:104CE00001460020FBF795FC03E0FCF711F8FBF709 -:104CF000B2FCBBF1000F06D196F8313001229621AB -:104D00000020FBF73FFF85F80590296A0A88EA81B1 -:104D10008978297485F80090BDE8FC9FFC0000208C -:104D2000780A002070B5FF4C054639B9012D05D130 -:104D30002079401CC0B22071012820D8A1692846E2 -:104D40008847E0B1A179F84831B1012D04D141780B -:104D500011B90178C90612D5E17981B98DB9F14946 -:104D60000E310978CA0602D40078C00607D5A078AB -:104D700028B9A06A28B9608918B1C80601D40120F1 -:104D800070BD002070BD10B5E64CA06A00B9FFDF11 -:104D90006289D4E90910D21C02F0D4F9A06A6062D9 -:104DA00010BD2DE9F0470600DE48DE4D00F134006D -:104DB0004468686A04F13804477801D0012E03D1B1 -:104DC000296B01F0F9FE687068784FF000084FF029 -:104DD000010940B1012818D0022831D0032846D05B -:104DE000FFDFBDE8F087012E31D0FFF7CCFF394659 -:104DF0000122286BF7F76CFA27E000BF84F80780E0 -:104E000030E000BF84F807902CE0012E08D0FFF7B7 -:104E1000BAFF39460022286BF7F75AFA022EE0D083 -:104E2000D4E91201401C41F10001C4E91201E0790A -:104E3000012802D084F80790D3E784F80780D0E7F0 -:104E4000012E04D0286BF7F7C7FB022EC9D0D4E996 -:104E50001201401C41F10001C4E91201E07901286E -:104E6000D0D1CBE7687ABDE8F047F3F73DBE012E1D -:104E7000B7D0286BF7F7B0FBF4E72DE9F041014616 -:104E8000A848A84D343000274468686A01263834A1 -:104E9000027802F00302012A1AD0022A18D0032A4B -:104EA00003D0E87940F0040010E000F0BBFF18B335 -:104EB000A670A88940F40060A8810120696A00F00A -:104EC0001BF91DE0E771B6E5E671B4E5E871B2E5FE -:104ED0004078A8B1AA8942F40062AA81AA6A002A8D -:104EE000F1D01B2808D8287A20B1BDE8F0418020F5 -:104EF00000F0FEB80E709EE5E87940F01000E5E79E -:104F0000E0790128E0D1DDE770B58648854D343081 -:104F1000446828783834012800D0FFDFA0780126C3 -:104F200030B10020A0700146042000F0E5F82671A1 -:104F3000286A0078C043800706D1E07820B9E6707F -:104F40000220296A00F0D8F801210020FFF7EAFECC -:104F500010B1BDE87040CCE5BDE8704000201AE516 -:104F60002DE9F84F6F4F6F4C343700267D6882462D -:104F70008DF8006020783835022800D0FFDFA08946 -:104F800040F40070A0810020FFF7EDFC687CBAF1CE -:104F9000000F58D0FBF782FBFBF772FB4FF00109C3 -:104FA00068B9687C58B1606A417841B10078E979A4 -:104FB000C0F3C000884202D184F8039056E0606AD2 -:104FC0004178618121B1206BF7F73CF9A06200E0E4 -:104FD000A662A089B84640F02000A08126717868BA -:104FE00000F13807064690F82C00012813D1FBF792 -:104FF000F2FE3946304600F097FC60B1D8F8040064 -:105000003188A0F89411397A80F8961180F892913D -:10501000607AF3F769FD606AA9790078C0F38000CF -:10502000884205D000F0A1F8A08940F48070A081EA -:10503000606AE9790078C0F3C00088420AD1684606 -:10504000FFF71BFF06E008B1FBF755FBA08940F016 -:105050004000A08151460120FFF764FE00289DF822 -:10506000000007D010B10020FFF79BFEFFF741FDC5 -:10507000BDE8F88F10B10120FFF793FE0020FFF785 -:105080006AFD9DF800000028F2D00220FFF789FE9B -:10509000EEE7244A3432526892F83120FDF703BE1D -:1050A000F6F7E0BF022905D06FF00D0101EBD0004B -:1050B00080B270476FF00E0101EB9000F8E700B589 -:1050C000012802D0022802D0FFDF002000BD01200D -:1050D00000BD70B50C46054619461046FFF7E2FFC5 -:1050E000844200D22046002D01D0001D80B270BD48 -:1050F0000C4A0021526910470A4A012393705269F1 -:105100001047084810B53430446804F13800C17ABB -:10511000212910D0007B21280DD01C290ED01D295B -:105120000CD003E0FC000020780A00201F280FD0DC -:1051300094F8310010BD94F85E1106E01F2807D0E6 -:1051400094F86A0100F04FF8014694F8310008E045 -:1051500094F86A0114F8301F084000F044F8014642 -:105160006078BDE8104000F048B870B52E4844683B -:1051700094F83D003834002832D0022810D12A4D4E -:10518000343DE86AF6F79AFF00B9FFDFD4E9100171 -:10519000401C41F10001C4E91001687AF3F7A4FC56 -:1051A00000256571207920B1257100211020FFF7BD -:1051B000A3FFE07878B1E570FCF7CFF800B9FFDF26 -:1051C00000210820FFF798FFD4E91001401C41F1AD -:1051D0000001C4E91001A079012802D00120A071CA -:1051E00070BDA57170BDC10701D001207047800757 -:1051F00001D5022070470020704700B500290CD06F -:1052000008280BD0042809D0082907D0042905D084 -:10521000012806D0012904D0022000BDFFDF0820AC -:1052200000BD012000BD0000300100202DE9F0414B -:105230000F4606460024F64D0FE000BF05EBC40004 -:1052400090F84311B14206D10622394600F5A2700A -:1052500001F04CFF38B1641CE4B22878A042EDD8CC -:105260001020BDE8F0812046FBE770B50546E84810 -:105270000478621C027000EBC4060868C6F844019A -:105280008888A6F84801102C00D3FFDF86F8435128 -:10529000204670BD70B5054600F0F4F910281CD109 -:1052A000DB4C2078401EC0B22070A84215D004EB21 -:1052B000C00204EBC50102F58070D2F84321C1F8A9 -:1052C0004321D0F84700C1F84701207800F0DAF90F -:1052D000102802D0204480F8035170BD2DE9F0471A -:1052E000CB4C0646A719A078401EC5B2A57097F80A -:1052F0000381AE422AD004EB051A04EB06190AF129 -:10530000030109F10300102201F01CFF0AF18301DF -:1053100009F18300102201F015FF601905EB450229 -:1053200090F8031187F8031106EB460104EB4202E3 -:1053300004EB4101D2F80B31C1F80B31B2F80F2167 -:10534000A1F80F2190F83B0187F83B0104EBC8005E -:1053500090F84A01C00703D14046BDE8F04799E7FD -:10536000BDE8F08710B540F2C311A94801F069FF0C -:10537000FF220821A74801F05CFFA64800210A3857 -:1053800041704FF46171418010BD70B50D46064605 -:10539000FFF74CFF9E4C102807D004EBC00191F89A -:1053A0004A11C90701D0012070BD617808290ED2C9 -:1053B000102803D129463046FFF757FF617804EBE8 -:1053C000C000491C6170012180F84A11EBE7002000 -:1053D00070BD70B58E4D2878401E44B20BE000BF02 -:1053E00005EBC40090F84A01C00702D0E0B200F01B -:1053F0005AF9641E64B2002CF2DA70BD2DE9F04750 -:10540000984691460C460746FFF710FF05461028C0 -:1054100005D000F037F9102801D01220A0E77C4E0B -:10542000B07808281ED2102D04D121463846FFF747 -:105430001CFF0546B4781022601CB07006EB041700 -:10544000F81C494600F045FA07F183001022414656 -:1054500000F03FFA3019002180F8035180F83B1129 -:1054600008467DE707207BE7694810B58078401E35 -:1054700044B204E0E0B2FFF731FF641E64B2002CD6 -:10548000F8DA10BD63490A394870704761480A3834 -:105490004078704740B14AF2B811884204D85D495B -:1054A0000A394880012070470020704759480A385F -:1054B0004088704710B5FFF7B9FE102803D000F000 -:1054C000E1F8102800D1082010BD51498A788242A5 -:1054D00003D901EB001083307047002070474C491E -:1054E0008A78824203D901EB0010C01C704700206B -:1054F0007047474B10B59C7884420FD9184490F8F8 -:10550000030103EBC00090F843310B70D0F8441155 -:105510001160B0F848019080012010BD002010BD3E -:105520003B4A114491F803213A490A390A7002684A -:105530004A6080880881704710B5FBF720F818B1E1 -:10554000BDE81040FBF72BB8FF2010BD30498A782A -:10555000824209D9084490F8030101EBC00090F899 -:105560004A0100F001007047002070472DE9F04724 -:1055700000252F46264E2AE006EBC70404F5A2714B -:10558000884694F84301FFF795FF8146FFF7A7FF90 -:1055900094F84A11C90718D060B1B9F1080F05D2C3 -:1055A00006EB090191F83B11012903D0102100F00D -:1055B00081F950B11749284601F805906D1C94F8FF -:1055C00043214146EDB2FBF785F97F1CFFB23078ED -:1055D000B842D1D8C4E602460E4810B50A38407821 -:1055E00040B10B48817829B1C01CD21CFAF773FF77 -:1055F000012010BD002010BD054A01EB410102EB66 -:1056000041010268C1F80B218088A1F80F017047A1 -:10561000E80A00204201002001461022274800F03D -:1056200058B92648704726498A78824203D90844E7 -:1056300090F83B0108B100207047012070472DE928 -:10564000F0410E46074615460621304600F032F975 -:105650001B4C58B1002004E02118401C81F83B513C -:10566000C0B2A1788142F7D80120FAE53146384628 -:10567000FFF720FF082803D0204480F83B51F3E7D0 -:105680000020EEE50E4910B5034600208A7806E0BA -:105690000C1894F803419C4204D0401CC0B28242D2 -:1056A000F6D8102010BD06494A78521E4A7001EB08 -:1056B000C001002281F84A21ECE50000AB0C00207B -:1056C000E80A002000F00101400800F00102114446 -:1056D000400800F001021144400800F001021144AA -:1056E000400800F001021144400800F0010211449A -:1056F000400800F00102114401EB5000704710B562 -:1057000000248484048DDB004C43B3FBF2F394FB50 -:10571000F2F45B1C04859BB203FB02F4C384B4F572 -:10572000C84F01DD5B1EC3844FF4FA43B3FBF2F3B1 -:105730005B1C8385038C02EBC3035B1EB3FBF2F39C -:10574000C383838B4B43B3FBF2F1818310BD70B5F0 -:105750000546087B0E4600F01F0008730020E87520 -:1057600004463019007AFFF7ADFF2919641C8874CC -:10577000E97DE4B20844E875052CF2D3C0B22528CF -:1057800000D9FFDF70BD00238383028401EBC202D6 -:10579000521EB2FBF1F1C183704770B5002504467B -:1057A00000F13806032909D0F1B3012964D0022998 -:1057B0004BD101463046BDE87040C8E77021304605 -:1057C00001F061FDB571F571F5723573B573F5735F -:1057D000757135767576012086F83C00412186F892 -:1057E0003D10FF2186F86B1084F82C50258484F836 -:1057F000310084F8320060734FF448606080A4F890 -:10580000A850A4F8AA50A4F8AC50A4F8AE50A4F83C -:10581000B050A4F8B25084F8B55084F8B750A4F84A -:10582000BE5084F8BC5000E010E0A4F8D050A4F8BA -:10583000D25084F8685184F8695184F8405184F852 -:10584000465184F8495184F85A5170BDA4F8BE50AD -:1058500084F8B6506188FE480A460844B0FBF1F06F -:10586000A4F856004BF68030A4F85800E388304680 -:10587000FFF745FF21469DE7A4F8BE504188B4F8E4 -:105880006631B4F862213046BDE8704037E7C37D29 -:105890000BB1252B01D9122070472AB14B7B2BB1BC -:1058A000012B05D01F2070470020704700F0A9B9D8 -:1058B00000F04FB910B500231A4603E0845C23437F -:1058C000521CD2B28A42F9D30BB1002010BD012084 -:1058D00010BD30B5134606E0CC18D51A14F8014CAB -:1058E0005B1E4455DBB2002BF6D130BD70B50E46C1 -:1058F0008CB0144601461D4610226846FFF7E9FFAA -:105900001022314604A8FFF7E4FF684600F0FCFBD4 -:1059100008A94FF0100228461CB1FFF7DAFF0CB0BF -:1059200070BD01F00FFCFAE738B505460C46684635 -:10593000FBF766FA00281ED09DF90000207294F94A -:1059400009100022411A00D5494295F82D308B42AA -:1059500010DCFF2B0ED0A17A491CC9B2A17295F8B8 -:105960002E30994202D8617A7F2903D160720020DB -:10597000A0720122104638BD0C2806D00B2804D096 -:105980000D2802D01C38062801D8012070470020BD -:10599000704710B5A2F10F030C292ED2DFE801F0F9 -:1059A00006080D1215181C2D242B2D273AB324E0C0 -:1059B000072A24D0082A22D01FE00C2A1FD00B2A45 -:1059C0001DD01AE00D2A1AD017E00C2B17D914E0BD -:1059D000103A0B2A13D910E0032B10D990F8340099 -:1059E00058B11B2A0BD908E0062A08D005E01C3A5A -:1059F000062A04D901E00E2A01D0002010BD0120A2 -:105A000010BD2DE9F0410C46054640F2337786681B -:105A100006E000BFF9F73CF93946F8F742FEA86006 -:105A20002846F9F702FB0028F4D094B13046A96863 -:105A3000F9F73CFE00280CDD2044401EB0FBF4F7D3 -:105A400007FB04F13046F8F72CFEA8603846BDE8A5 -:105A5000F0810020FBE770B5044690420AD2101B8B -:105A6000642800D2642025188D4204D8F9F751FE2D -:105A700008B1284670BD204670BD2DE9F0410E46A4 -:105A80001B27384691F8311000F05AF84FF4A474EF -:105A9000A04200D920460546384696F8321000F05C -:105AA0004FF8A04200D9204628449830CFE7C107DC -:105AB00001D001207047810701D5022070474007BF -:105AC00001D508207047002070472DE9F0410546B8 -:105AD000164688460124084600F029FA0746404643 -:105AE00000F027FA0346FFF7E2FF02463846FFF7C9 -:105AF000DEFF52EA000100D10024990700D1002204 -:105B0000B90700D1002095F83110914200D1002250 -:105B1000327095F83210814200D1002070706AB95D -:105B200060B9404600F007FA298F401A00B247F6E4 -:105B3000FE71884201DC002800DC0024204686E754 -:105B4000022903D0C000703080B2704780003C3022 -:105B5000FAE7F0B50C7C8B7BCD7B5C404B7C0288FC -:105B60006B4044EA0323C67D5A400024D5B2120A92 -:105B700095FAA5F592FAA2F22D0E120E45EA02222E -:105B800002EB0212641C1A44E4B292B2032CEDD36D -:105B90005A402523B2FBF3F403FB142301EBD30596 -:105BA00003762F7A03F00704012505FA04F427424F -:105BB00001D043761BE05643320C521CD2B2002374 -:105BC000C418A47C944214D30024CE1896F808601C -:105BD00005FA04F73E4201D0521ED2B222B1641C33 -:105BE000E4B2082CF4D306E004EBC30141760020B4 -:105BF000F0BD121BD2B25B1CDBB2052BE0D31F2021 -:105C0000F0BDF0B5037E0C7E012504FB0232252396 -:105C1000B2FBF3F403FB142201EBD204027602F090 -:105C20000703247A05FA03F31C4201D0427620E0F0 -:105C3000C37DB2FBF3F403FB1422521CD2B2002347 -:105C4000C418A47C944216D30024CE18367A01E0FE -:105C5000FFDB050005FA04F73E4201D0521ED2B226 -:105C600022B1641CE4B2082CF1D306E004EBC301BA -:105C700041760020F0BD121BD2B25B1CDBB2052BBB -:105C8000DED31F20F0BD0000282101F0DABA30B5C4 -:105C90000546007801F00F0220F00F001043287035 -:105CA00007290BD2DFE801F004060406040804000B -:105CB000062405E00C2403E0222401E00024FFDF99 -:105CC000687820F03F002043687030BD007800F015 -:105CD0000F0070470A6840F8032F89888180704759 -:105CE0000A6840F8092F898881807047027840232C -:105CF00022F0400203EA81110A43027070470278E1 -:105D000022F0800242EAC1120270704770B5154657 -:105D10000E4604461F2A00D9FFDF2A46314604F109 -:105D2000090001F00FFA6078AD1D20F03F0005F08A -:105D30003F010843607070BD70B515460E460446BD -:105D40001F2A00D9FFDF2A46314604F1090001F07D -:105D5000F9F96078AD1D20F03F0005F03F010843E0 -:105D6000607070BD30B5017801F00F01032922D0B9 -:105D7000052925D14578B0F81910B0F81B40B0F8C6 -:105D80001730827D05F03F05222D19D1062917D342 -:105D90004FF44865A94213D8B4F5FA7F10D27AB10E -:105DA000082A0DD88A420BD28B4209D8B0F81D00C0 -:105DB000A84207D904E0407800F03F000C2801D049 -:105DC000002030BD012030BD00B5027801F0030392 -:105DD00022F003021A43027000224270012904D00B -:105DE000022902D0032901D0FFDF00BD012141704B -:105DF00000BD00B5027801F0030322F003021A434C -:105E0000027000224270012904D0022902D0032925 -:105E100001D0FFDF00BD0121417000BD007800F01E -:105E200003007047417889B1C0780E2805D00F284B -:105E300003D0102801D0192802D31B2904D905E06A -:105E4000524A105C884201D10120704700207047FF -:105E500030B50546C170192902D24C48445C01E0B6 -:105E60000024FFDF6C7030BDB0F807007047B0F859 -:105E700009007047B0F80B00704770B5B0F8072004 -:105E8000B0F80940B0F805300179951F40F67A4620 -:105E9000B54210D8B4F5FA7F0DD261B108290AD8FD -:105EA000914208D2934206D8B0F80B00B0F5486F83 -:105EB00001D8012070BD002070BD42680A60007AE0 -:105EC00008717047B0F80900704700797047426860 -:105ED0000A6080684860704780890880704750F881 -:105EE0000E2F0A60406848607047D0F816000860BE -:105EF00070470A6842604968816070470968C160FC -:105F000070470079704742680A608068486070474F -:105F10000A6842604968816070470179490704D086 -:105F20004079400701D00120704700207047007978 -:105F3000704740797047C08870470CB514A2D2E909 -:105F40000012CDE900120179407901F0070269469B -:105F50001DF80220012A04D800F00700085C01287F -:105F600001D900200CBD01200CBD017170470079E2 -:105F70007047417170474079704730B50C4605460F -:105F80001B2900D9FFDF6C7030BD00009477010041 -:105F9000000101020102020370B50C46A0F12001CC -:105FA0002A2901D301200CE03E280CD020CC084E39 -:105FB00094E80E0006EB8000241F50F8806C284601 -:105FC000B047206070BD2046EBF7EEF8F9E700001F -:105FD000B077010010B5524800F05CFA00B1FFDF65 -:105FE0004F48401C00F056FA002800D0FFDF10BDDB -:105FF0002DE9F14F4B4ED6F800B00127484800F08C -:1060000051FADFF81C8128B95FF0000708F10100A0 -:1060100000F05EFA444C00254FF003090120606057 -:10602000C4F80051C4F80451009931602060DFF8D1 -:10603000FCA018E0DAF80000C00614D50E2000F02D -:1060400064F8EFF3108010F0010072B600D0012068 -:10605000C4F80493D4F8001119B9D4F8041101B9A3 -:1060600020BF00B962B6D4F8000118B9D4F8040111 -:106070000028DFD0D4F804010028CFD137B1C6F80A -:1060800000B008F1010000F00DFA11E008F1010084 -:1060900000F008FA0028B9D1C4F80893C4F80451F4 -:1060A000C4F800510E2000F030F81D4800F010FA3E -:1060B0000020BDE8F88F2DE9F0438DB00D4606466F -:1060C00000240DF110090DF1200817E004EB44073E -:1060D000102255F82710684601F034F805EB8707C1 -:1060E00010224846796801F02DF86846FFF780FFD6 -:1060F00010224146B86801F025F8641CB442E5DB83 -:106100000DB00020BDE8F08372E700F01F0201210E -:1061100091404009800000F1E020C0F880127047F3 -:106120004A01002004E5004000E0004010ED00E0DE -:10613000CD4900200870704770B5CC4D01232B600D -:10614000CB4B1C68002CFCD0002407E00E680660D6 -:106150001E68002EFCD0001D091D641C9442F5D35E -:106160000020286018680028FCD070BD70B5BE4EB5 -:106170000446C04D3078022800D0FFDFAC4200D387 -:10618000FFDF7169BC48012903D847F230529442BD -:1061900001DD03224271491C7161291BC160B649AE -:1061A0007078F8F7BDFF002800D1FFDF70BD70B533 -:1061B000AD4C0D466178884200D0FFDFAD4E082D12 -:1061C0004BD2DFE805F04A041E2D4A4A4A382078AF -:1061D000022800D0FFDF03202070A078012801D022 -:1061E00020B108E0A06800F01FFD04E004F1080001 -:1061F00007C8FFF7A1FF05202070BDE87040F8F741 -:1062000053BCF8F745FD01466068F9F74FFAB04214 -:1062100002D2616902290BD30320F9F7FAFC12E0DC -:10622000F8F736FD01466068F9F740FAB042F3D25C -:10623000BDE870409AE7207802280AD0052806D0E9 -:10624000FFDF04202070BDE8704000F002B902209A -:1062500000E00320F9F7DDFCF3E7FFDF70BD70B568 -:106260000546F8F715FD804C60602078012800D0C5 -:10627000FFDF8149012008700020087104208D6033 -:1062800048717C48C860022020706078F8F748FFA9 -:10629000002800D1FFDF70BD10B5734C207808B125 -:1062A000112010BD7548F8F77AFC6070202804D0E2 -:1062B000012020700020606110BD032010BD020B82 -:1062C0000121B0F5003F02D291406D4806E0B0F5E3 -:1062D000802F08D2203A6A489140001D006808408B -:1062E00000D001207047002070472DE9F04114468E -:1062F00000EB84070E4605463F1F00F0A8FC4FF058 -:1063000080510A69504306EB8402121FB24201D247 -:10631000012200E000221CB10969B4EB910F02D9FF -:106320000920BDE8F08157498D4216D3AF4214D3FE -:10633000854205D2874203D245EA0600800701D094 -:106340001020EEE78E4208D33AB92846FFF7B7FF90 -:1063500018B93846FFF7B3FF08B10F20E1E74A4804 -:106360004A490068884205D0224631462846FFF750 -:10637000E3FE10E0FFF790FF0028D2D13A48002159 -:106380008560C0E9036481704FF4A97104FB01F0DA -:106390001830FFF764FF0020C3E770B54FF0805559 -:1063A000044628693749B1FBF0F084420AD300F073 -:1063B0004EFCA04201D8102070BD28696043FFF751 -:1063C0007EFF08B10F2070BD2F4830490068884219 -:1063D00004D02869604300F027FC0CE0FFF75CFF65 -:1063E0000028F0D129692048614381600121817032 -:1063F0002748FFF734FF002070BD2249090BB1EB9D -:10640000401F07D9404201EB4011202903D34FF030 -:10641000FF307047002101208840401E704770B552 -:1064200005460C4652EA030001D0062070BD00204C -:10643000FFF7E3FF284204D10120FFF7DEFF2042EF -:1064400001D00F2070BD21462846BDE8704000F005 -:1064500041BE10B5044C6078F8F7FBFB00B9FFDFD4 -:106460000020207010BD00004C01002004E5014018 -:1064700000E40140105C0C00BC0C0020AF61010086 -:106480000006004000800100A4000020BEBAFECA41 -:106490007C5E010000210170084670470146002023 -:1064A00008707047EFF3108101F0010172B60278B5 -:1064B000012A01D0012200E000220123037001B96A -:1064C00062B60AB1002070474FF400507047E9E708 -:1064D000EFF3108111F0010F72B64FF0000202705D -:1064E00000D162B600207047F2E700004C4909680D -:1064F0000160002070474A49086000207047012170 -:106500008A0720B1012804D042F204007047916745 -:1065100000E0D1670020704742490120086042F244 -:106520000600704708B504233E4A1907103230B1FF -:10653000C1F80433106840F0010010600BE01068EF -:1065400020F001001060C1F808330020C1F80801F4 -:10655000354800680090002008BD011F0B2909D8AC -:10656000304910310A6822F01E0242EA40000860F9 -:106570000020704742F205007047000100F18040A2 -:10658000C0F8041900207047000100F18040C0F8F5 -:10659000081900207047000100F18040D0F8000980 -:1065A000086000207047012801D9072070471F4A62 -:1065B00052F8200002680A43026000207047012858 -:1065C00001D907207047194A52F8200002688A430F -:1065D000026000207047012801D907207047134A44 -:1065E00052F820000068086000207047020010493F -:1065F0004FF0000003D0012A01D0072070470A6045 -:1066000070474FF080410020C1F808014FF0E020B2 -:10661000802180F800140121C0F8001170470000AB -:1066200000040040000500400801004058780100C7 -:10663000780500406249634B0A6863499A420968D9 -:1066400001D1C1F310010160002070475C495D4B2E -:106650000A685D49091D9A4201D1C0F31000086023 -:10666000002070475649574B0A68574908319A42EB -:1066700001D1C0F3100008600020704730B5504BC6 -:10668000504D1C6842F20803AC4202D0142802D2DA -:1066900003E0112801D3184630BDC3004B4818440D -:1066A000C0F81015C0F81425002030BD4449454BF2 -:1066B0000A6842F209019A4202D0062802D203E097 -:1066C000042801D308467047404A012142F830109F -:1066D000002070473A493B4B0A6842F209019A424E -:1066E00002D0062802D203E0042801D308467047EE -:1066F000364A012102EBC00041600020704770B5AE -:106700002F4A304E314C156842F2090304EB8002E7 -:10671000B54204D0062804D2C2F8001807E00428C5 -:1067200001D3184670BDC1F31000C2F80008002064 -:1067300070BD70B5224A234E244C156842F20903FD -:1067400004EB8002B54204D0062804D2D2F8000837 -:1067500007E0042801D3184670BDD2F80008C0F342 -:1067600010000860002070BD174910B508311848A6 -:1067700008601120154A002102EBC003C3F8101570 -:10678000C3F81415401C1428F6D3002006E0042892 -:1067900004D302EB8003C3F8001807E002EB800388 -:1067A000D3F80048C4F31004C3F80048401C06287E -:1067B000EDD310BD04490648083108607047000059 -:1067C000A4000020BEBAFECA00F5014000F001405E -:1067D0000000FEFF774B1B6803B19847BFF34F8F54 -:1067E00075480168754A01F4E06111430160BFF327 -:1067F0004F8FFEE710B5EFF3108010F0010F72B667 -:1068000001D0012400E0002400F0CAF850B1EAF7FA -:1068100067FDF8F70AF8F9F79FF9ECF7E2FB68492A -:106820000020086004B962B6002010BD70B50C46A7 -:106830000646EFF3108010F0010F72B601D001256B -:1068400000E0002500F0ACF818B105B962B60820E8 -:1068500070BDEAF7BFFCEAF747FD02460020430996 -:106860009B0003F1E02300F01F01D3F80031CB407F -:10687000D9071BD0202803D222FA00F1C90722D160 -:1068800041B2002906DA01F00F0101F1E02191F88F -:10689000141D03E001F1E02191F8001449090829D1 -:1068A00011D281B101290ED004290CD0401C6428DA -:1068B000D5D3ECF795FB4249424808602046F9F7EA -:1068C0008BFD60B904E005B962B641F2010070BD0C -:1068D000384804602EB13046F9F7CBFD18B11024CA -:1068E00029E0394E16E03078022802D94FF480545E -:1068F00021E007240028707801D0E0B908E0D0B189 -:10690000202818D8B078212815D8012813D001E004 -:10691000B07880B92D49802081F8140DEAF7E4FCA5 -:106920003146F9F7FFF8F7F73FFF00F0C3F93046BB -:10693000EAF7A8FC044605B962B61CB1FFF75AFF96 -:10694000204670BD002070BD10B5044600F028F848 -:1069500000B101202070002010BD1D4908600020FA -:10696000704710B50C46102808D011280BD01228FB -:106970000CD013280ED00120086010BDD4E900010E -:10698000FFF754FF0AE0FFF735FF07E02068FFF745 -:10699000DBFF03E00E49206808600020206010BD86 -:1069A000074808490068884201D10120704700204B -:1069B00070470000640100200CED00E00400FA05BF -:1069C000A4000020BEBAFECA607801000BE000E01F -:1069D0000400002000B5744910F1080F19D00CDC38 -:1069E00010F1280F1DD010F1140F18D010F1100F56 -:1069F00013D010F10C0F08D10DE010F1040F06D0E8 -:106A000080B103280ED004280CD0FFDF00BDFC208D -:106A100008E0F82006E0F42004E0F02002E0EC209A -:106A200000E0D820086000BD5F4900B5091D0128BD -:106A300003D0022803D0FFDF00BD032000E00420C4 -:106A4000086000BD584800B5001D016801F00F0145 -:106A5000032905D0006800F00F00042802D0FFDFF2 -:106A6000012000BD022000BD504930B1012803D1F2 -:106A7000086840F00100086070470868FBE72DE9EE -:106A8000F04105461F464FF4C8604FF47A7601295D -:106A900012D0022A17D046490C181846FAF7A6FB5E -:106AA00004443846FAF7BCFB204400F27120B0FBE6 -:106AB000F6F0281ABDE8F081022A00D1304649F6E6 -:106AC00008514418E9E73B493046E5E770B51546FB -:106AD0000646012914D0022B15D0354CFA34104645 -:106AE000FAF791FB4FF47A71012D0FD04A10A21AD8 -:106AF000104400F28920B0FBF1F0301A801E70BD06 -:106B000049F6CA64EBE72B4C643CE7E70A46EEE73C -:106B10002DE9F041054614464FF4C8604FF47A76EB -:106B2000012911D0022B16D021490F181046FAF76F -:106B30006AFB012C12D04FF4FA71791A08446438B8 -:106B4000B0FBF6F0281AB5E7022B00D1304649F623 -:106B500008514718EAE717493046E6E73146ECE7BF -:106B60002DE9F04105460C4616461046FAF73EFB65 -:106B700005EB4501C1EBC51100EBC1004FF47A757F -:106B8000012C0FD0691047182046FAF73CFB381A41 -:106B900000F60F60B0FBF5F43046FAF71DFB204419 -:106BA000401D87E72946EEE70C15004050160040CF -:106BB000A2240200683602002DE9FE430C468046FE -:106BC000FFF72CF9074698F80160204601A96A46AC -:106BD000F5F709FD05000DD0012F02D00320BDE817 -:106BE000FE83204602AA0199F5F71FFC0298B0F82F -:106BF00003000AE0022F14D1042E12D3B8F80300C8 -:106C0000BDF80020011D914204D8001D80B2A919D1 -:106C1000814202D14FF00000E1E702D24FF00100C3 -:106C2000DDE74FF00200DAE70B4A022111600B4961 -:106C30000B68002BFCD0084B1B1D1860086800284F -:106C4000FCD00020106008680028FCD070474FF08E -:106C5000805040697047000004E5014000E40140B5 -:106C600002000B464FF00000014620D0012A04D05C -:106C7000022A04D0032A0DD103E0012002E0022001 -:106C800015E00320072B05D2DFE803F00406080A0D -:106C90000C0E100007207047012108E0022106E0D9 -:106CA000032104E0042102E0052100E00621F7F7BA -:106CB00092BF0000F64805218170002101704170EB -:106CC0007047F4490A78012A05D0CA681044C860A0 -:106CD0004038F8F7B8BC8A6810448860F8E70028A4 -:106CE00019D00378EC49ED4A13B1012B0ED011E015 -:106CF0000379012B00D06BB943790BB1012B09D17A -:106D00008368643B8B4205D2C0680EE00379012B97 -:106D100002D00BB10020704743790BB1012BF9D1A0 -:106D2000C368643B8B42F5D280689042F2D8012060 -:106D30007047D84910B501220A700279A2B1002229 -:106D40000A71427992B104224A718268D04C52325F -:106D50008A60C0681434C8606060F7F799FFCC4956 -:106D600020600220887010BD0322E9E70322EBE7D0 -:106D700070B5044609B1012000E00320C54D002193 -:106D80002970217901B100202871607968B104204F -:106D9000BF4E6871A168F068F7F783FCA860E068EF -:106DA0005230E8600320B07070BD0320F0E72DE999 -:106DB000F04105460226F8F772FB006800B1FFDFDC -:106DC000B34C01273DB12878B0B1012805D0022885 -:106DD00010D0032813D027710CE06868C82807D3A7 -:106DE000F8F797FC20B16868FFF76BFF012603E016 -:106DF000002601E000F056F93046BDE8F081207829 -:106E00000028F7D16868FFF76AFF0028E3D06868B8 -:106E1000017879B1A078042800D0FFDF01216868EB -:106E2000FFF7A6FF9B49E078F8F77AF90028E1D14F -:106E3000FFDFDFE7FFF77DFF6770DBE72DE9F04756 -:106E4000934C8846E178884200D0FFDFDFF840921B -:106E5000002501278F4E09F11409B8F1080F75D2EA -:106E6000DFE808F0040C28527A808D95A07803287A -:106E700002D0022800D0FFDFBDE8F087A078032809 -:106E800002D0022800D0FFDF0420A07025712078F6 -:106E9000002878D1FFF715FF3078012806D0B068B8 -:106EA000E06000F01EF92061002060E0E078F8F773 -:106EB00034F8F5E7A078032802D0022800D0FFDFDD -:106EC000207800286DD1A078032816D0F7F7E0FECF -:106ED00001464F46D9F80000F8F7E8FB00280EDB22 -:106EE000796881420BDB081AF0606A49E078F8F7AC -:106EF00017F90028C0D1FFDFBEE7042028E00420F6 -:106F0000F8F787FEA570B7E7A078032802D002281B -:106F100000D0FFDF207888BBA078032817D0F7F7D0 -:106F2000B7FE01464F46D9F80000F8F7BFFB00282E -:106F3000E5DB79688142E2DB081AF0605549E078C8 -:106F4000F8F7EEF8002897D1FFDF95E740E005203D -:106F5000F8F75FFEA7708FE7A078042800D0FFDF66 -:106F6000022004E0A078042800D0FFDF0120A168FF -:106F70008847FFF71CFF054630E004E011E0A078E9 -:106F8000042800D0FFDFBDE8F04700F08BB8A07800 -:106F9000042804D0617809B1022800D0FFDF2078EE -:106FA00018B1BDE8F04700F086B8207920B106207E -:106FB000F8F72FFE2571CDE7607838B13549E078D4 -:106FC000F8F7AEF800B9FFDF657055E70720BFE7B7 -:106FD000FFDF51E73DB1012D03D0FFDF022DF9D1D5 -:106FE0004AE70420C3E70320C1E770B5050005D0D8 -:106FF000274CA078052803D0112070BD102070BD4B -:107000002748F7F7CCFDE070202803D00020A560CA -:10701000A07070BD032070BD1D4810B5017809B186 -:10702000112010BD8178052906D0012906D029B18B -:1070300001210170002010BD0F2010BD00F03BF8B1 -:10704000F8E770B5124C0546A07808B1012809D1BF -:1070500055B12846FFF743FE40B1287840B1A078EB -:10706000012809D00F2070BD102070BD072070BD11 -:107070002846FFF75EFE03E000212846FFF778FE72 -:107080000449E078F8F74CF800B9FFDF002070BD44 -:1070900068010020CC0C00203D860100FF1FA107E5 -:1070A0003D6E01000A4810B5006900F019F8BDE80E -:1070B0001040F7F7F9BC064810B5C078F7F7C9FDDE -:1070C00000B9FFDF0820F8F7A4FDBDE81040F1E5A6 -:1070D00068010020044A1060101D01600020704704 -:1070E00070470020704700000006004040EA01039E -:1070F00010B59B070FD1042A0DD310C808C9121F61 -:107100009C42F8D020BA19BA884201D9012010BD9A -:107110004FF0FF3010BD1AB1D30703D0521C07E067 -:10712000002010BD10F8013B11F8014B1B1B07D1CB -:1071300010F8013B11F8014B1B1B01D1921EF1D13C -:10714000184610BD032A40F2308010F0030C00F006 -:10715000158011F8013BBCF1020F624498BF11F891 -:1071600001CB00F8013B38BF11F8013BA2F104024A -:1071700098BF00F801CB38BF00F8013B11F00303C2 -:1071800000F02580083AC0F0088051F8043B083A26 -:1071900051F804CBA0E80810F5E7121D5CBF51F8C8 -:1071A000043B40F8043BAFF30080D20724BF11F842 -:1071B000013B11F801CB48BF11F8012B24BF00F8A7 -:1071C000013B00F801CB48BF00F8012B704710B518 -:1071D000203AC0F00B80B1E81850203AA0E81850CF -:1071E000B1E81850A0E81850BFF4F5AF5FEA027C90 -:1071F00024BFB1E81850A0E8185044BF18C918C0FF -:10720000BDE810405FEA827C24BF51F8043B40F89F -:10721000043B08BF7047D20728BF31F8023B48BF84 -:1072200011F8012B28BF20F8023B48BF00F8012BC2 -:10723000704702F0FF0343EA032242EA024200F0F1 -:1072400002B84FF000020429C0F0128010F0030CC5 -:1072500000F01B80CCF1040CBCF1020F18BF00F849 -:10726000012BA8BF20F8022BA1EB0C0100F00DB8F8 -:107270005FEAC17C24BF00F8012B00F8012B48BF56 -:1072800000F8012B70474FF0000200B513469446FA -:107290009646203922BFA0E80C50A0E80C50B1F16E -:1072A0002001BFF4F7AF090728BFA0E80C5048BF82 -:1072B0000CC05DF804EB890028BF40F8042B08BF20 -:1072C000704748BF20F8022B11F0804F18BF00F81C -:1072D000012B7047FEDF04207146084219D1069940 -:1072E000124A914215DC069902394878DF2810D1FC -:1072F0000878FE2807D0FF280BD14FF001004FF08F -:1073000000020B4B184741F201000099019A084B0B -:107310001847084B002B02D01B68DB6818474FF05A -:10732000FF3071464FF00002014B1847008001000A -:10733000D567010004000020184819497047FFF77D -:10734000FBFFE9F72BFF00BD4FF48050154909689A -:10735000884203D1144A13605B68184700BD0000DF -:1073600020BFFDE74FF480500E490968884210D1D4 -:107370000E4B18684FF0FF318842F1D080F3088837 -:107380004FF02021884204DD0948026803210A43A6 -:1073900002600848804708488047FFDFE00C002073 -:1073A000E00C00200000002004000020008001000C -:1073B00014090040B1040100497301000420714622 -:1073C000084202D0EFF3098101E0EFF308818869F8 -:1073D00002380078102813DB20280FDB2B280BDB6A -:1073E0000A4A12680A4B9A4203D1602804DB094A10 -:1073F0001047022008607047074A1047074A1047A5 -:10740000074A12682C32126810470000A4000020BE -:10741000BEBAFECAED120000995F01006369010067 -:10742000040000200D4B0E4908470E4B0C4908473D -:107430000D4B0B4908470D4B094908470C4B0849B0 -:1074400008470C4B064908470B4B054908470B4BAF -:10745000034908470A4B024908470000FD8800001D -:10746000798B0000C92E0000832D0000172D00002D -:107470004F2F0000F3120000D52A00001D8B0000E2 -:10748000A9110000797F000081810000E1820000E5 -:10749000058300003F8300007D830000AF83000070 -:1074A000DF83000031840000A78000006F1200001D -:1074B0006F120000BF1D0000FD1D00001D1E00001A -:1074C000A91E0000C51F000083200000B32000009B -:1074D000552100003F1B0000EB2300006F2400003B -:1074E0008F2400006B2800008F280000BF270000B9 -:1074F00013280000C128000055290000273D000086 -:10750000013E00003541000033420000A942000066 -:107510001343000077430000731200006B44000027 -:10752000D54400009D240000A32400007312000035 -:10753000731200007312000073120000AD240000EB -:10754000ED240000731200006F1200006F120000A3 -:107550006F120000E15200006753000083530000E7 -:107560009F5300002D550000C9530000D353000065 -:107570001554000037540000135500005555000005 -:107580006F120000C76D0000E76D0000E96D00009C -:107590002D6E00005B6E0000496F0000D76F000089 -:1075A000EB6F00003970000029710000CF720000FD -:1075B000F9730000D55D0000117400006F12000027 -:1075C0006F120000731200007312000073120000AB -:1075D0007312000073120000100110013A02000043 -:1075E0001A02000405060000BD7A0000AB7A000014 -:1075F000FFFFFFFF0000FFFFEDB000002F190000AC -:10760000814E00001F5E0000937800000000000023 -:10761000736B0000536B0000C16B000063520000ED -:107620002552000045520000A3AF000031B0000019 -:1076300039370000E16B000000000000116C000011 -:10764000B152000000000000000000000000000037 -:1076500000000000B93700004D3500004D35000036 -:107660009B1D000051B00000A3600000934D00007E -:10767000953C01007B3500007B350000BD1D0000FE -:107680007DB0000027610000054E0000A93C01000C -:1076900070017001400034005C002400A80100006B -:1076A0000300656C74620000000000000000000030 -:1076B0000000000000008700000000000000000043 -:1076C000000000000000BE83605ADB0B376038A565 -:1076D000F5AA9183886C000001000000F9D1000038 -:1076E000C1E00000000000010206030405000000E4 -:1076F0000700000000000000060000000A00000073 -:107700003200000073000000B4000000752C01007E -:1077100000000000631C0100314B0100000000006C -:1077200000000000E51C0100614F010000000000A6 -:1077300000000000D91B0100094F010000000000FB -:107740000000000023200100935001000000000011 -:1077500000000000555555D6BE898E000000A606D3 -:10776000340DC21300004A03EE059208000096048F -:107770001409920DF401FA00960064004B003200E7 -:107780001E0014000A000500020001000041000074 -:10779000000000000C0802170D0101020909010197 -:1077A0000602091818030101090903030500000076 -:1077B000356601004D660100656601007D660100C9 -:1077C000AD660100D5660100FF6601003367010068 -:1077D0009B630100EB6201001F64010095640100DE -:1077E000A5640100D16401005BFD000063FD0000A1 -:1077F00075FD0000FF64010019650100ED640100E2 -:10780000F7640100256501005B6501007B650100EF -:107810008965010097650100A7650100BF6501004A -:10782000D7650100ED65010000000000FB86000047 -:107830005187000067870000616C0100F15F010063 -:10784000B7600100EB6F0100197001004370010087 -:10785000B5FB000085FF00001C050040200500402E -:107860000010020084780100080000207C01000064 -:1078700044110000B0780100840100205C0B00007E -:107880008011000001190545600D0020360100013E -:1078900000703720FB349B5F80041B8000100D9923 -:1078A000E3070020A007002026080020024C10005B -:00000001FF diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf51822_5.0.0_release-notes.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf51822_5.0.0_release-notes.pdf deleted file mode 100644 index 0cff6f8c31..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf51822_5.0.0_release-notes.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf52_5.0.0_migration-document.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf52_5.0.0_migration-document.pdf deleted file mode 100644 index afd9ec7f41..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf52_5.0.0_migration-document.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/hex/s132_nrf52_5.0.0_softdevice.hex b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/hex/s132_nrf52_5.0.0_softdevice.hex deleted file mode 100644 index a644fbaf38..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/hex/s132_nrf52_5.0.0_softdevice.hex +++ /dev/null @@ -1,8678 +0,0 @@ -:020000040000FA -:1000000000040020E90800007D050000C908000088 -:1000100087050000910500009B050000000000001E -:100020000000000000000000000000000D090000BA -:10003000A505000000000000AF050000B9050000A4 -:10004000C3050000CD050000D7050000E105000054 -:10005000EB050000F5050000FF05000009060000A3 -:10006000130600001D0600002706000031060000F0 -:100070003B060000450600004F0600005906000040 -:10008000630600006D060000770600008106000090 -:100090008B060000950600009F060000A9060000E0 -:1000A000B3060000BD060000C7060000D106000030 -:1000B000DB060000E5060000EF060000F906000080 -:1000C000030700000D0700001707000021070000CC -:1000D0002B070000350700003F070000490700001C -:1000E000530700005D07000067070000710700006C -:1000F0007B070000850700008F07000099070000BC -:10010000A30700001FB500F003F88DE80F001FBD26 -:1001100000F0E0BB1FB56FF00100009040100390AD -:10012000029001904FF010208069000B420900F00E -:100130001F045DF822300120A04083434DF8223097 -:10014000684600F045F91FBDF0B54FF6FF734FF458 -:10015000B4751A466E1E11E0A94201D3344600E080 -:100160000C46091B30F8027B641E3B441A44F9D14B -:100170009CB204EB134394B204EB12420029EBD17E -:1001800098B200EB134002EB124140EA0140F0BD8F -:10019000DE4992B00446D1E90001CDE91001FF2209 -:1001A0004021684600F03CFB94E80F008DE80F000A -:1001B000684610A902E004C841F8042D8842FAD12B -:1001C00010216846FFF7C0FF1090AA208DF8440068 -:1001D000FFF7A0FF00F0F3F84FF01024A069102201 -:1001E0006946803000F002F9A069082210A900F0E9 -:1001F000FDF800F0D8F84FF080510A6949690068AD -:100200004A43824201D8102070470020704710B541 -:10021000D0E900214FF0805002EB8103026944696C -:100220006243934209D84FF01022536903EB8103D4 -:100230000169406941438B4201D9092010BD5069D1 -:10024000401C01D0002010BD0F2010BD70B501680A -:100250000446AF4D4FF01020072952D2DFE801F0DD -:10026000330419293C1E2500D4E902656468294637 -:10027000304600F0CDF82A462146304600F0B6F868 -:10028000AA002146304600F09FFA002800D0032043 -:1002900070BD00F051FB4FF4805007E0201DFFF7C8 -:1002A000AAFF0028F4D100F047FB60682860002016 -:1002B00070BD241D94E80700920000F085FA002824 -:1002C000F6D00E2070BD8069401C12D0201DFFF7B3 -:1002D0009EFF0028F6D109E08069401C09D0201D4E -:1002E000FFF789FF0028EDD1606820B12046FFF7B5 -:1002F0004FFF042070BDFFF70DFF00F060F800F025 -:1003000052F8072070BD10B50C46182802D0012005 -:10031000086010BD2068FFF799FF206010BD4FF006 -:100320001024A069401C05D0A569A66980353079E4 -:10033000AA2808D06069401C2DD060690068401C64 -:1003400029D060692CE010212846FFF7FDFE3168B6 -:1003500081421CD1A16901F18002C03105E030B1B8 -:1003600008CA51F8040D984201D1012000E0002094 -:100370008A42F4D158B1286810B1042803D0FEE7AE -:10038000284600F057F862496868086008E000F005 -:1003900016F800F008F84FF480500168491C01D0AD -:1003A00000F0A4FAFEE7BFF34F8F5A4801685A4A9B -:1003B00001F4E06111430160BFF34F8FFEE74FF09E -:1003C00010208169491C02D0806900F0AEB87047E6 -:1003D000524A01681160121D416811604F4A8168DC -:1003E00010321160111DC068086070472DE9F0419E -:1003F00017460D460646002406E03046296800F000 -:10040000A7F8641C2D1D361DBC42F6D3BDE8F08153 -:1004100070B50C4605464FF4806608E0284600F0AB -:1004200084F8B44205D3A4F5806405F58055002C0A -:10043000F4D170BD4168044609B1012500E00025F2 -:100440004FF010267069A268920000F0BDF9C8B1A3 -:10045000204600F01AF89DB17669A56864684FF4EB -:10046000002084420AD2854208D229463046FFF74E -:10047000CFFF2A4621463046FFF7B8FFFFF79FFF20 -:10048000FFF791FFFFF746FEF8E72DE9FF414FF038 -:100490001024616980680D0B01EB800000F6FF708D -:1004A000010B0020009001900290024603906846E4 -:1004B00001230BE0560902F01F0C50F8267003FAD6 -:1004C0000CFC47EA0C0740F82670521CAA42F1D3F4 -:1004D0000AE04A0901F01F0650F8225003FA06F616 -:1004E000354340F82250491C8029F2D3A169090BF9 -:1004F0004A0901F01F0150F822408B409C4340F80C -:100500002240FFF765FFBDE8FF8100005C090000A5 -:10051000000000200CED00E00400FA050006004099 -:10052000144801680029FCD07047134A0221116069 -:1005300010490B68002BFCD00F4B1B1D186008687E -:100540000028FCD00020106008680028FCD070470C -:10055000094B10B501221A60064A1468002CFCD021 -:10056000016010680028FCD0002018601068002886 -:10057000FCD010BD00E4014004E5014008208F4993 -:1005800009680958084710208C4909680958084724 -:1005900014208A49096809580847182087490968BA -:1005A0000958084730208549096809580847382004 -:1005B00082490968095808473C2080490968095858 -:1005C000084740207D4909680958084744207B496D -:1005D00009680958084748207849096809580847B0 -:1005E0004C20764909680958084750207349096822 -:1005F0000958084754207149096809580847582084 -:100600006E490968095808475C206C49096809580F -:100610000847602069490968095808476420674904 -:100620000968095808476820644909680958084753 -:100630006C20624909680958084770205F490968B9 -:100640000958084774205D49096809580847782007 -:100650005A490968095808477C20584909680958C7 -:10066000084780205549096809580847842053499C -:1006700009680958084788205049096809580847F7 -:100680008C204E4909680958084790204B49096851 -:10069000095808479420494909680958084798208B -:1006A00046490968095808479C204449096809587F -:1006B0000847A0204149096809580847A4203F4934 -:1006C000096809580847A8203C490968095808479B -:1006D000AC203A49096809580847B02037490968E9 -:1006E00009580847B4203549096809580847B8200F -:1006F0003249096809580847BC2030490968095837 -:100700000847C0202D49096809580847C4202B49CB -:10071000096809580847C82028490968095808473E -:10072000CC202649096809580847D0202349096880 -:1007300009580847D4202149096809580847D82092 -:100740001E49096809580847DC201C4909680958EE -:100750000847E0201949096809580847E420174963 -:10076000096809580847E8201449096809580847E2 -:10077000EC201249096809580847F0200F49096818 -:1007800009580847F4200D49096809580847F82016 -:100790000A49096809580847FC20084909680958A6 -:1007A00008475FF480700549096809580847000048 -:1007B00003480449024A034B704700000000002030 -:1007C000680900006809000040EA010310B59B07B2 -:1007D0000FD1042A0DD310C808C9121F9C42F8D0AB -:1007E00020BA19BA884201D9012010BD4FF0FF305C -:1007F00010BD1AB1D30703D0521C07E0002010BD72 -:1008000010F8013B11F8014B1B1B07D110F8013BFD -:1008100011F8014B1B1B01D1921EF1D1184610BDDE -:1008200002F0FF0343EA032242EA024200F005B865 -:100830007047704770474FF000020429C0F01280E3 -:1008400010F0030C00F01B80CCF1040CBCF1020F83 -:1008500018BF00F8012BA8BF20F8022BA1EB0C0158 -:1008600000F00DB85FEAC17C24BF00F8012B00F84E -:10087000012B48BF00F8012B70474FF0000200B574 -:10088000134694469646203922BFA0E80C50A0E8B3 -:100890000C50B1F12001BFF4F7AF090728BFA0E861 -:1008A0000C5048BF0CC05DF804EB890028BF40F82D -:1008B000042B08BF704748BF20F8022B11F0804F6F -:1008C00018BF00F8012B7047014B1B68DB68184705 -:1008D0000000002009480A497047FFF7FBFFFFF7B7 -:1008E00011FC00BD20BFFDE7064B1847064A10600B -:1008F000016881F30888406800470000680900002B -:10090000680900001F030000000000201EF0040F13 -:100910000CBFEFF30881EFF3098188690238007892 -:10092000182803D100E00000074A1047074A126860 -:100930002C3212681047000000B5054B1B68054AB1 -:100940009B58984700BD00000703000000000020EE -:100950005809000004000000001000000000000022 -:0809600000FFFFFF0090D0032F -:10100000E8120020111D0200152F0000831C0200B1 -:10101000152F0000152F0000152F00000000000004 -:10102000000000000000000000000000691D020038 -:10103000152F000000000000152F0000152F0000E4 -:10104000D11D0200D71D0200152F0000152F000032 -:10105000152F0000152F0000152F0000152F000080 -:10106000DD1D0200152F0000152F0000E31D0200FA -:10107000152F0000E91D0200EF1D0200F51D020002 -:10108000152F0000152F0000152F0000152F000050 -:10109000152F0000152F0000152F0000152F000040 -:1010A000152F0000FB1D0200152F0000152F00005A -:1010B000152F0000152F0000152F0000152F000020 -:1010C000011E0200152F0000152F0000152F000033 -:1010D000152F0000152F0000152F0000152F000000 -:1010E000152F0000152F0000152F0000152F0000F0 -:1010F000152F0000152F0000152F0000152F0000E0 -:10110000152F0000152F000000F002F820F0EDFD73 -:101110000AA090E8000C82448344AAF10107DA4552 -:1011200001D120F0E2FDAFF2090EBAE80F0013F092 -:10113000010F18BFFB1A43F0010318471C130200EC -:101140003C1302000A444FF0000C10F8013B13F06E -:10115000070408BF10F8014B1D1108BF10F8015B10 -:10116000641E05D010F8016B641E01F8016BF9D103 -:1011700013F0080F1EBF10F8014BAD1C0C1B09D15A -:101180006D1E58BF01F801CBFAD505E014F8016BCC -:1011900001F8016B6D1EF9D59142D6D3704700005E -:1011A0000023002400250026103A28BF78C1FBD870 -:1011B000520728BF30C148BF0B6070471FB500F011 -:1011C0003DF88DE80F001FBD1EF0040F0CBFEFF3BC -:1011D0000880EFF30980014A104700006F2E0000DD -:1011E0008269034981614FF001001044704700009B -:1011F000F511000001B41EB400B512F0AFFD01B44A -:101200000198864601BC01B01EBD0000F0B4404606 -:10121000494652465B460FB402A0013001B506486C -:10122000004700BF01BC86460FBC804689469246F7 -:101230009B46F0BC704700000911000020F052BD31 -:1012400070B51A4C054609202070A01C00F05FF80C -:101250005920A08029462046BDE8704007F0F1BF24 -:1012600007F0FABF70B50C461149097829B1A0F111 -:101270006001552908D3012013E0602804D06928B3 -:1012800002D043F201000CE020CC0A4E94E80E009C -:1012900006EB8000A0F58050241FD0F8806E284611 -:1012A000B047206070BD012070470000080000209A -:1012B0001C0000204C1E020010B504460021012035 -:1012C00000F03BF800210B2000F037F80421192032 -:1012D00000F033F804210D2000F02FF804210E2037 -:1012E00000F02BF804210F2000F027F80421C84358 -:1012F00000F023F80621162000F01FF80621152023 -:1013000000F01BF82046FFF79BFF002010BD9D2139 -:1013100001807047FFF7A4BF10487047104A10B50E -:1013200014680F4B0F4A08331A60FFF79BFF0C48F5 -:10133000001D046010BD704770474907090E002862 -:1013400006DA00F00F0000F1E02080F8141D70476D -:1013500000F1E02080F800147047000003F900421B -:101360001005024001000001FE48002101604160BB -:10137000018170472DE9F743044692B091464068D9 -:1013800012F0B2FF40B1606812F0B7FF20B9607888 -:1013900000F00300022801D0012000E00020F14EFF -:1013A0004D463072484612F05BFF18B1102015B060 -:1013B000BDE8F0832946012001F029FF0028F6D17D -:1013C00001258DF842504FF4C050ADF84000002286 -:1013D00010A9284606F0FAFB0028E8D18DF8425003 -:1013E0004FF428504FF00008ADF8400047461C214C -:1013F0006846CDF81C8020F018FC9DF81C0008AA57 -:1014000020F00F00401C20F0F00010308DF81C0080 -:1014100020788DF81D0061789DF81E0061F3420070 -:1014200040F001008DF81E009DF800000AA940F070 -:1014300002008DF800002089ADF83000ADF8327060 -:10144000608907AFADF834000B97606810AC0E9060 -:101450000A94684606F0AFF90028A8D1BDF820002C -:1014600030808DF8425042F60120ADF840009DF8E2 -:101470001E0008AA20F00600801C20F001008DF854 -:101480001E000220ADF83000ADF8340013A80E9015 -:101490000AA9684606F08FF9002888D1BDF8200017 -:1014A0007080311D484600F033F9002887D18DF84F -:1014B000425042F6A620ADF840001C216846CDF807 -:1014C0001C8020F0B2FB9DF81C00ADF8345020F0D9 -:1014D0000F00401C20F0F00010308DF81C009DF82B -:1014E0001D0008AA20F0FF008DF81D009DF81E00C9 -:1014F0000AA920F0060040F00100801C8DF81E00B3 -:101500009DF800008DF8445040F002008DF8000076 -:10151000CDE90A4711A80E90ADF83050684606F0A4 -:101520004AF9002899D1BDF82000F08000203EE75C -:101530003EB504460820ADF80000204612F090FEAB -:1015400008B110203EBD2146012001F060FE0028B8 -:10155000F8D12088ADF804006088ADF80600A088B6 -:10156000ADF80800E088ADF80A007E4801AB6A4695 -:101570008088002106F024FDBDF800100829E1D084 -:1015800003203EBD1FB50446002002900820ADF8A0 -:101590000800CDF80CD0204612F062FE10B11020E9 -:1015A00004B010BD6F4802AA81884FF6FF7006F0A4 -:1015B0004EFF0028F4D1BDF80810082901D00320FF -:1015C000EEE7BDF800102180BDF802106180BDF883 -:1015D0000410A180BDF80610E180E1E701B582B0FA -:1015E0000220ADF800005F4802AB6A464088002147 -:1015F00006F0E6FCBDF80010022900D003200EBD65 -:101600001CB5002100910221ADF80010019012F0EC -:101610004DFE08B110201CBD52486A4641884FF665 -:10162000FF7006F014FFBDF800100229F3D003206C -:101630001CBDFEB54B4C06461546207A0F46C0072A -:1016400005D0084612F00CFE18B11020FEBD0F2088 -:10165000FEBDF82D01D90C20FEBD304612F000FE73 -:1016600018BB208801A905F0ECFD0028F4D13078E2 -:101670008DF80500208801A906F081FC0028EBD137 -:1016800000909DF800009DF8051040F002008DF8D4 -:101690000000090703D040F008008DF80000208802 -:1016A000694606F009FC0028D6D1ADF8085020881C -:1016B0003B4602AA002106F083FCBDF80810A942AF -:1016C000CAD00320FEBD7CB50546002000900190E5 -:1016D0000888ADF800000C462846019512F004FE7B -:1016E00018B9204612F0E2FD08B110207CBD15B1FA -:1016F000BDF8000050B11B486A4601884FF6FF70E4 -:1017000006F0A5FEBDF8001021807CBD0C207CBD3C -:1017100030B593B0044600200D460090142101A876 -:1017200020F083FA1C2108A820F07FFA9DF8000021 -:10173000CDF808D020F00F00401C20F0F000103051 -:101740008DF800009DF8010020F0FF008DF80100E9 -:101750009DF8200040F002008DF8200001208DF857 -:10176000460001E0E201002042F60420ADF844000A -:1017700011A801902088ADF83C006088ADF83E00CB -:10178000A088ADF84000E088ADF842009DF8020066 -:1017900006AA20F00600801C20F001008DF802004F -:1017A0000820ADF80C00ADF810000FA8059001A9B5 -:1017B00008A806F000F8002803D1BDF8180028801A -:1017C000002013B030BD0000F0B5007B059F1E4621 -:1017D00014460D46012800D0FFDF0C2030803A204F -:1017E0003880002C08D0287A052806D0287B0128CC -:1017F00000D0FFDF17206081F0BDA889FBE72DE94D -:10180000F04786B0144691F80C900E9A0D46B9F147 -:10181000010F0BD01021007B2E8A8846052807D0A7 -:10182000062833D0FFDF06B0BDE8F0870221F2E7DB -:10183000E8890C2100EB400001EB400018803320C8 -:101840001080002CEFD0E889608100271AE0009614 -:10185000688808F1020301AA696900F07AFF06EBC3 -:101860000800801C07EB470186B204EB4102BDF87B -:10187000040090810DF1060140460E3210F04CFD3F -:101880007F1CBFB26089B842E1D8CCE73420108019 -:10189000E889B9F1010F11D0122148430E301880A8 -:1018A000002CC0D0E88960814846B9F1010F00D012 -:1018B0000220207300270DF1040A1FE00621ECE747 -:1018C0000096688808F1020301AA696900F041FFE7 -:1018D00006EB0800801C86B2B9F1010F12D007EBAD -:1018E000C70004EB4000BDF80410C18110220AF1CA -:1018F0000201103020F000F97F1CBFB26089B842AD -:10190000DED890E707EB470104EB4102BDF8040085 -:10191000D0810AF102014046103210F0FDFCEBE7E5 -:101920002DE9F0470E4688B090F80CC096F80C8070 -:10193000378AF5890C20109902F10C044FF0000A47 -:10194000BCF1030F08D0BCF1040F3ED0BCF1070F6F -:101950007DD0FFDF08B067E705EB850C00EB4C009E -:10196000188031200880002AF4D0A8F1060000F089 -:10197000FF09558125E0182101A820F056F90097AC -:101980007088434601AA716900F0E3FEBDF80400C7 -:101990002080BDF80600E080BDF808002081A21C70 -:1019A0000DF10A01484610F0B7FCB9F1000F00D064 -:1019B00018B184F804A0A4F802A007EB080087B2CD -:1019C0000A346D1EADB2D6D2C4E705EB850C00EB30 -:1019D0004C00188032200880002ABBD0A8F10500F6 -:1019E00000F0FF09558137E000977088434601AA4F -:1019F000716900F0AEFE9DF80600BDF80410E180AC -:101A00002179420860F3000162F34101820862F328 -:101A10008201C20862F3C301020962F304114209A0 -:101A200062F34511820962F386112171C009607168 -:101A3000BDF80700208122460DF10901484610F04B -:101A40006BFC18B184F802A0A4F800A000E007E045 -:101A500007EB080087B20A346D1EADB2C4D279E735 -:101A6000A8F1020084B205FB08F000F10E0CA3F807 -:101A700000C035230B80002AA6D0558194810097A1 -:101A800083B270880E32716900F063FE62E72DE95F -:101A9000F84F1E460A9D0C4681462AB1607A00F531 -:101AA0008070D080E089108199F80C000C274FF0ED -:101AB00000084FF00E0A0D2873D2DFE800F09E07F1 -:101AC0000E1C28303846556A737373002146484609 -:101AD0000095FFF779FEBDE8F88F207B9146082836 -:101AE00002D0032800D0FFDF378030200AE000BF9B -:101AF000A9F80A80EFE7207B9146042800D0FFDF99 -:101B0000378031202880B9F1000FF1D1E3E7207B45 -:101B10009146042800D0FFDF37803220F2E7207B97 -:101B20009146022800D0FFDF37803320EAE7207B90 -:101B30001746022800D0FFDF3420A6F800A0288036 -:101B4000002FC8D0A7F80A80C5E7207B17460428D5 -:101B500000D0FFDF3520A6F800A02880002FBAD0E3 -:101B60004046A7F80A8012E0207B1746052802D0DD -:101B7000062800D0FFDF1020308036202880002F7C -:101B8000A9D0E0897881A7F80E80B9F80E00B88155 -:101B9000A1E7207B9146072800D0FFDF3780372060 -:101BA000B0E72AE04FF0120018804FF0380017001D -:101BB000288090D0E0897881A7F80E80A7F810805F -:101BC00099F80C000A2805D00B2809D00C280DD054 -:101BD000FFDF80E7207B0C2800D0FFDF01200AE038 -:101BE000207B0D2800D0FFDF042004E0207B0E289E -:101BF00000D0FFDF052038736DE7FFDF6BE770B5BE -:101C00000C46054601F076FA20B10078222804D26D -:101C1000082070BD43F2020070BD052128460EF079 -:101C20001DFF206008B1002070BD032070BD2DE9AC -:101C3000FF4784B00027824602970798904689465E -:101C400012300AF0E2F8401D20F00306079828B988 -:101C500007A95046FFF7D3FF002853D1B9F1000F71 -:101C600005D00798017B19BB052504681BE098F88F -:101C70000000092803D00F2812D0FFDF45E00799A4 -:101C800003254868B0B3497B42887143914238D9F3 -:101C90008AB2B3B2011D0EF03AFD0446078002E09D -:101CA000079C042508340CB1208810B1032D28D0DE -:101CB0002BE00798012112300AF0DFF8ADF80C0094 -:101CC000024602AB2946504608F0B1F9070001D19F -:101CD000A01C029007983A461230C8F80400A8F8F1 -:101CE00002A003A94046029B0AF0D4F8C0B107281D -:101CF00014D200E005E0DFE800F0060811110F0A39 -:101D00000C00132026E6002024E6112022E60820FD -:101D100020E643F203001DE607201BE6032019E638 -:101D2000BDF80C002346CDE900702A4650460799BD -:101D300000F035FD57B9032D08D10798B3B2417BA8 -:101D4000406871438AB2011D0EF0F5FCB9F1000F35 -:101D5000D9D0079981F80C90D5E72DE9FE4F91462F -:101D60001A881C468A468046FAB102AB494608F0FA -:101D70005EF9050019D04046A61C27880EF08AFFA0 -:101D80003246072629463B4600960EF049FB20883E -:101D90002346CDE900504A465146404600F0FFFC3C -:101DA000002020800120BDE8FE8F0020FBE710B559 -:101DB00086B01C46AAB104238DF800301388ADF814 -:101DC00008305288ADF80A208A788DF80E200988EC -:101DD000ADF80C1000236A462146FFF728FF06B035 -:101DE00010BD1020FBE770B50D4605210EF036FE44 -:101DF000040000D1FFDF294604F11200BDE8704065 -:101E00000AF024B82DE9F8430D468046002607F075 -:101E1000CCFA0446287812287BD2DFE800F07A5406 -:101E2000543C355632321332323209323232323287 -:101E30002879001FC0B2022801D0102810D114BB8D -:101E4000FFDF35E004B9FFDF052140460EF006FE56 -:101E5000007B032806D004280BD0072828D0FFDFFA -:101E6000072657E02879801FC0B2022820D050B141 -:101E7000F6E72879401FC0B2022819D0102817D0E1 -:101E8000EEE704B9FFDF13E004B9FFDF287901288A -:101E90000ED1172139E0052140460EF0DFFD070085 -:101EA00000D1FFDF07F11201404609F0A6FF2CB177 -:101EB0002A462146404600F05CFC2BE013214046B8 -:101EC00002F0AAFC26E0FFDF24E004B9FFDF0521D1 -:101ED00040460EF0C3FD060000D1FFDF694606F163 -:101EE000120009F094FF060000D0FFDFA98817292F -:101EF00001D2172200E00A46BDF80000824202D952 -:101F0000014602E005E01729C3D3404600F057FC24 -:101F1000CEE7FFDF3046BDE8F883401D20F0030226 -:101F200019B102FB01F0001D00E0002010447047D1 -:101F300013B5009850B100244FEA0D000EF091FB4C -:101F4000002C02D1F84A009911601CBD0124002028 -:101F5000F4E72DE9F0470C461546242120461FF0F2 -:101F600064FE05B9FFDFA87860732888DFF8B8A39E -:101F7000401D20F00301AF788946DAF800000EF02A -:101F80008EFB060000D1FFDF4FF000082660A6F8A8 -:101F9000008077B109FB07F1091D0AD0DAF80000CB -:101FA0000EF07DFB060000D1FFDF6660C6F8008002 -:101FB00001E0C4F80480298804F11200BDE8F0476C -:101FC00009F00DBF2DE9F047804601F112000D46E2 -:101FD000814609F01AFF401DD34F20F003026E7BAB -:101FE0001446296838680EF085FB3EB104FB06F202 -:101FF000121D03D0696838680EF07CFB05200EF0D6 -:10200000D7FC044605200EF0DBFC201A012802D183 -:1020100038680EF039FB49464046BDE8F04709F004 -:10202000F3BE70B5054605210EF018FD040000D181 -:10203000FFDF04F112012846BDE8704009F0DDBE63 -:102040002DE9F04F91B04FF0000BADF834B0ADF882 -:1020500004B047880C4605469246052138460EF0E6 -:10206000FDFC060000D1FFDF24B1A780A4F806B074 -:10207000A4F808B0297809220B20B2EB111F297AA5 -:102080007DD104F110023827C91E4FF00C094FF022 -:10209000010803920F2973D2DFE801F0F4F3F28113 -:1020A00008D48A8FA13DDDF5F0B8B800307B022856 -:1020B00000D0FFDFA88909EBC001ADF80410302182 -:1020C000ADF83410002C25D06081B5F80E900027B3 -:1020D0001DE004EBC708317C88F80E10F189A8F8E0 -:1020E0000C10CDF800906888042304AA296900F038 -:1020F00030FBBDF81010A8F8101009F10400BDF86D -:1021000012107F1C1FFA80F9A8F81210BFB2608964 -:10211000B842DED80FE1307B022800D0FFDFE9892A -:1021200009EBC100ADF804003020ADF83400287B85 -:102130000A90001FC0B20F90002CEBD06181B5F85F -:102140001090002727E000BFCDF8009068886969EB -:1021500003AA0A9B00F0FDFA0A9904EBC70809EBF1 -:1021600001001FFA80F908F10C0204A90F9810F081 -:10217000D3F818B188F80EB0A8F80CB001E0D7E099 -:10218000D4E0BDF80C10A8F81010BDF80E107F1C9C -:10219000A8F81210BFB26089B842D5D8CBE00DA81C -:1021A000009001AB224629463046FFF728FBC2E0EB -:1021B000307B082805D0FFDF03E0307B082800D003 -:1021C000FFDFE8891030ADF804003620ADF83400A8 -:1021D000002C3FD0A9896181F189A18127E0307B62 -:1021E000092800D0FFDFA88900F10C01ADF8041028 -:1021F0003721ADF83410002C2CD06081E889009094 -:10220000AB89688804F10C02296956E0E889392114 -:10221000103080B2ADF80400ADF83410002C74D04A -:10222000A9896181287A10280AD002212173E989BD -:10223000E181288A0090EB8968886969039A3CE00B -:102240000121F3E70DA8009001AB22462946304654 -:10225000FFF766FB6FE0307B0A2800D0FFDF12201B -:10226000ADF80400ADF834704CB3A9896181A4F8CD -:1022700010B0A4F80EB084F80C805CE020E002E01E -:1022800031E039E042E0307B0B2800D0FFDF288AC4 -:10229000ADF834701230ADF8040084B1042121731C -:1022A000A9896181E989E181298A2182688A00906E -:1022B0002B8A688804F11202696900F04AFA3AE050 -:1022C000307B0C2800D0FFDF1220ADF80400ADF801 -:1022D00034703CB305212173A4F80AB0A4F80EB001 -:1022E000A4F810B027E00DA8009001AB22462946C3 -:1022F0003046FFF769FA1EE00DA8009001AB2246B8 -:1023000029463046FFF7C3FB15E036E03B21ADF828 -:102310000400ADF8341084B3A4F80680A4F808B023 -:1023200084F80AB007E0000010000020FFDF02E0A0 -:10233000012919D0FFDFBDF80400AAF800007CB124 -:10234000BDF834002080BDF804006080BDF8340082 -:10235000392805D03B2803D03C2801D086F80CB0A2 -:1023600011B00020BDE8F08F3C21ADF80400ADF8BD -:10237000341014B1697AA172DDE7FFE7AAF8000012 -:10238000EEE72DE9F84356880F46804615460521AD -:1023900030460EF063FB040000D1FFDF12340094DE -:1023A0003B46414630466A6809F02EFFB3E570B5FA -:1023B0000D4605210EF052FB040000D1FFDF294637 -:1023C00004F11200BDE8704009F02CBD70B50D4657 -:1023D00005210EF043FB040000D1FFDF294604F184 -:1023E0001200BDE8704009F050BD70B505460521EA -:1023F0000EF034FB040000D1FFDF04F10803214696 -:102400002846BDE870400422A7E470B505460521C2 -:102410000EF024FB040000D1FFDF2146284623688C -:10242000BDE87040052298E470B5064605210EF01F -:1024300015FB040000D1FFDF04F1120009F0E5FCF8 -:10244000401D20F0030511E0011D00880322431800 -:1024500021463046FFF781FC00280BD0607BABB2F1 -:10246000684382B26068011D0EF09BF96068418884 -:102470000029E9D170BD70B50E46054606F095FFFE -:10248000040000D1FFDF0120207266726580207891 -:1024900020F00F00C01C20F0F00030302070BDE8AC -:1024A000704006F085BF2DE9F0438BB00D46144611 -:1024B000814606A9FFF7A3FB002814D14FF6FF764B -:1024C00001274FF420588CB103208DF80000102014 -:1024D000ADF8100007A8059007AA204604A90FF040 -:1024E0003AFF78B107200BB0BDE8F0830820ADF8C3 -:1024F00008508DF80E708DF80000ADF80A60ADF848 -:102500000C800CE00698A17801742188C1818DF8B7 -:102510000E70ADF80850ADF80C80ADF80A606A4650 -:1025200002214846069BFFF782FBDCE708B5012243 -:102530008DF8022042F60202ADF800200A4603237D -:102540006946FFF734FC08BD08B501228DF802206A -:1025500042F60302ADF800200A4604236946FFF75D -:1025600026FC08BD00B587B079B102228DF80020A5 -:102570000A88ADF808204988ADF80A1000236A4699 -:102580000521FFF754FB07B000BD1020FBE709B1A0 -:1025900007230CE40720704770B588B00D46144639 -:1025A000064606A9FFF72BFB00280ED17CB10620BA -:1025B000ADF808508DF80000ADF80A40069B6A4659 -:1025C0000821DC813046FFF732FB08B070BD0520E2 -:1025D0008DF80000ADF80850F0E700B587B059B1AC -:1025E00007238DF80030ADF80820039100236A46D8 -:1025F0000921FFF71CFBC6E71020C4E770B588B0BF -:102600000C460646002506A9FFF7F9FA0028DCD19A -:1026100006980121123009F030FC9CB1217806297E -:1026200021D2DFE801F0200505160318801E80B2D4 -:10263000C01EE28880B20AB1A3681BB1824203D9EE -:102640000C20C2E71020C0E7042904D0A08850B9AC -:1026500001E00620B9E7012913D0022905D0042999 -:102660001CD005292AD00720AFE709208DF80000EB -:102670006088ADF80800E088ADF80A00A068039013 -:1026800023E00C208DF800006088ADF80800E08899 -:10269000ADF80A00A0680A25039016E00D208DF819 -:1026A00000006088ADF80800A088ADF80A00E08856 -:1026B000ADF80C00A0680B25049006E00E208DF804 -:1026C000000060788DF808000C256A4629463046DF -:1026D000069BFFF7ACFA78E700B587B00F228DF8BC -:1026E0000020ADF8081000236A461946FFF79FFA4C -:1026F00049E700B587B071B102228DF800200A8841 -:10270000ADF808204988ADF80A1000236A46062172 -:10271000FFF78DFA37E7102035E770B586B006462B -:1027200001200D46ADF808108DF800000146002389 -:102730006A463046FFF77BFA040008D12946304646 -:1027400005F058FC0021304605F072FC204606B02A -:1027500070BDF8B51C4615460E46069F0EF088FA69 -:102760002346FF1DBCB231462A4600940DF01FFEE1 -:10277000F8BD10B548800878144620F00F00C01C42 -:1027800020F0F00090300B4608701822214603F12B -:1027900008001FF0F6F9BDE8104006F009BE30B49D -:1027A0001146DDE902423CB1032903D0002330BCCD -:1027B00008F0D3BA0123FAE71A8030BC704770B52D -:1027C0000C460546FFF70FFB2146284605F021FC85 -:1027D0002846BDE87040012105F02ABC4FF0E022F8 -:1027E0004FF400410020C2F88011204908702049B0 -:1027F00090020860704730B51C4D04462878A0420E -:1028000018BF002C02D0002818BFFFDF2878A04294 -:1028100008BF30BD2C701749154A0020ECB1164D89 -:10282000DFF858C0131F012C0DD0022C1CBFFFDF96 -:1028300030BD086003200860CCF800504FF4000061 -:102840001060186030BD086002200860CCF80050AD -:102850004FF040701060186030BD086008604FF0A5 -:102860006070106030BD00B5FFDF00BD18000020B3 -:1028700008F5014000F500402403002014F5004055 -:1028800070B50B2000F0B5F9082000F0B2F9002176 -:102890000B2000F0C4F90021082000F0C0F9EC4C36 -:1028A00001256560A5600020C4F84001C4F844011A -:1028B000C4F848010B2000F0A7F9082000F0A4F9A3 -:1028C0000B2000F08BF9256070BD10B50B2000F0D7 -:1028D00090F9082000F08DF9DD4801214160816008 -:1028E000DC490A68002AFCD10021C0F84011C0F878 -:1028F0004411C0F848110B2000F086F9BDE81040E3 -:10290000082000F081B910B50B2000F07DF9BDE87A -:102910001040082000F078B900B530B1012806D089 -:10292000022806D0FFDF002000BDCB4800BDCB4809 -:1029300000BDCA48001D00BD70B5C9494FF0004038 -:102940000860C84DC00BC5F80803C74800240460E0 -:10295000C5F840410820C43500F04BF9C5F83C41AA -:10296000C248047070BD08B5B94A002128B10128D9 -:1029700011D002281CD0FFDF08BD4FF48030C2F810 -:102980000803C2F84803B3483C300160C2F8401164 -:10299000BDE80840D0E74FF40030C2F80803C2F8A1 -:1029A0004803AC4840300160C2F84411AB480CE029 -:1029B0004FF48020C2F80803C2F84803A548443009 -:1029C0000160C2F84811A548001D0068009008BDCC -:1029D00070B516460D460446022800D9FFDF0022D6 -:1029E0009B48012304F110018B4000EB8401C1F8E6 -:1029F000405526B1C1F84021C0F8043303E0C0F8C7 -:102A00000833C1F84021C0F8443370BD2DE9F041CE -:102A10001C46154630B1012834D0022839D0FFDFDA -:102A2000BDE8F081891E002221F07F411046FFF7AA -:102A3000CFFF012C24D000208C4E8A4F01247070CF -:102A40003C61894900203C3908600220091D08606A -:102A5000854904203039086083483D350560C7F852 -:102A60000042082000F0D0F82004C7F80403082032 -:102A700000F0B4F87A49E007091F08603470CFE726 -:102A80000120D9E7012B02D00022012005E001221C -:102A9000FBE7012B04D000220220BDE8F04197E7BC -:102AA0000122F9E76B480068704770B500F0C7F87D -:102AB000674C0546D4F840010026012809D1D4F816 -:102AC0000803C00305D54FF48030C4F80803C4F8E8 -:102AD0004061D4F8440101280CD1D4F808038003E4 -:102AE00008D54FF40030C4F80803C4F8446101204D -:102AF00010F0F6FBD4F8480101280CD1D4F80803F3 -:102B0000400308D54FF48020C4F80803C4F8486196 -:102B1000022010F0E5FB5648056070BD70B500F06E -:102B20008EF8524D0446287858B1FFF705FF6878B3 -:102B300020B1002085F8010010F0D2FB4C48046061 -:102B400070BD0320F8E74FF0E0214FF40010C1F80A -:102B500000027047152000F057B842490120086173 -:102B6000082000F051B83F494FF47C10C1F8080329 -:102B70000020024601EB8003C3F84025C3F8402142 -:102B8000401CC0B20628F5D37047410A43F60952EB -:102B90005143C0F3080010FB02F000F5807001EB18 -:102BA0005020704710B5430B48F2376463431B0C49 -:102BB0005C020C602F4C03FB04002F4B4CF2F724FB -:102BC00043435B0D13FB04F404EB402000F58070DD -:102BD0004012107008681844086010BD00F01F0211 -:102BE000012191404009800000F1E020C0F800116F -:102BF000704700F01F02012191404009800000F160 -:102C0000E020C0F88011704700F01F0201219140C0 -:102C10004009800000F1E020C0F8801270474907A9 -:102C2000090E002806DA00F00F0000F1E02080F81D -:102C3000141D704700F1E02080F8001470470C4824 -:102C4000001F00680A4A0D49121D116070470000FC -:102C500000B0004004B500404081004044B1004055 -:102C600008F501400080004040850040340000200D -:102C700014050240F7C2FFFF6F0C010001000001C4 -:102C80000A4810B50468094909480831086010F07D -:102C9000BBFB0648001D046010BD0649002008600B -:102CA0004FF0E0210220C1F8800270471005024079 -:102CB00001000001FC1F004010B50D2000F06FF86E -:102CC000C4B26FF0040000F06AF8C0B2844200D0D1 -:102CD000FFDF3A490120086010BD70B50D2000F0FB -:102CE00048F8374C0020C4F800010125C4F804530B -:102CF0000D2000F049F825604FF0E0216014C1F884 -:102D0000000170BD10B50D2000F033F82C480121F2 -:102D100041600021C0F80011BDE810400D2000F016 -:102D200033B8284810B50468264927480831086098 -:102D30002349D1F80001012804D0FFDF2148001DFC -:102D4000046010BD1D48001D00680022C0B2C1F81B -:102D5000002110F074FFF1E710B51948D0F8001108 -:102D60000029FBD0FFF7DDFFBDE810400D2000F08B -:102D70000BB800F01F02012191404009800000F1D2 -:102D8000E020C0F88011704700F01F02012191403F -:102D90004009800000F1E020C0F880127047002850 -:102DA00006DA00F00F0000F1E02090F8140D03E0C7 -:102DB00000F1E02090F800044009704704D500407D -:102DC00000D00040100502400100000110B5202095 -:102DD00000F075F8202000F07DF84449202081F8AB -:102DE0000004434900060860091D42480860FEF7D8 -:102DF00093FA3F49C83108603F48D0F8041341F0C6 -:102E00000101C0F80413D0F8041341F08071C0F838 -:102E10000413364901201C39C1F8000110BD10B55A -:102E2000202000F04CF8324800210160001D0160B4 -:102E30002F4A481EE83A10602F4AC2F808032C4B6C -:102E4000C8331960C2F80001C2F860012B4908605C -:102E5000BDE81040202000F03DB825492848EC3955 -:102E60000860704722492648E8390860704770B505 -:102E70001F4A8069E83A224911601F49D1F8006170 -:102E80000023204D1D4A5C1E1EB1A84206D300211E -:102E90000FE0D1F8606186B1A84209D2C1F80031D3 -:102EA000C1F860311460BDE87040202000F012B815 -:102EB0001168BDE870401EF0E3BEFFDF70BD00F09A -:102EC0001F02012191404009800000F1E020C0F87C -:102ED0008011704700F01F020121914040098000DD -:102EE00000F1E020C0F880127047000020E000E010 -:102EF000000602406413002000000240000402406B -:102F000001000001003002000F4A12680D498A4298 -:102F10000CD118470C4A12680A4B9A4206D101B5E7 -:102F200010F00EFFFFF799FFBDE80140074909685F -:102F30000958084706480749054A064B70470000EC -:102F400000000000BEBAFECAB0000020040000204D -:102F5000E8120020E812002070B50C46054609F082 -:102F6000F0FA21462846BDE870400AF0E2BB10B5F1 -:102F700011F054FBFFF732FC11F0F0F9BDE81040FE -:102F800011F0A2BA01208107086070470120810773 -:102F90004860704712480068C00700D001207047A1 -:102FA0000F48001F0068C00700D0012070470C4880 -:102FB00008300068C00700D0012070470848103072 -:102FC0000068704706490C310A68D20306D50968C3 -:102FD00001F00301814201D10120704700207047B8 -:102FE0000C0400407047704770477047704702F00C -:102FF000FF0343EA032242EA02421EF0F6BD704795 -:103000002CFFFFFFDBE5B151003002009D00FFFF08 -:1030100084000000404B4C0066D342DA82CFB49D5E -:10302000E40AD77E68976592800939FF30B5FF4D75 -:10303000044610280AD0112C06D02846122CC1783C -:1030400006D0132C08D0FFDFEC7030BDFFDFFBE7AC -:103050001129F9D0FFDFF7E71129F5D0FFDFF3E7FA -:1030600070B50FF0E3FA044610F0A0FC201AC4B2C9 -:1030700006200DF09DFC054606200DF0A1FC2E1A41 -:1030800007200DF095FC054607200DF099FCE74957 -:10309000281A3218C87812280DD000231A44132891 -:1030A0000BD0002002440878022808D000201044E9 -:1030B000201AC0B270BD0123F0E70120F2E7012021 -:1030C000F5E7DA4800B58079D849420897B051F859 -:1030D000070F89880CD017228DF80020CDF8020048 -:1030E000ADF806100BA968460AF0B4FF17B000BD92 -:1030F0004422F1E702210DF0B1BC2DE9F04196B078 -:103100001D4690460E460746FFF7F4FF04000BD01D -:103110002078222804D3A07FC0F34010A84206D113 -:10312000082016B0BDE8F08143F20200F9E749201B -:103130008DF80000ADF802703DB101208DF804005B -:103140008DF805608DF8068002E000208DF80400FF -:103150000BA968460AF07EFFA07F65F34510A077B3 -:103160000020DEE730B50446A1F120000D460A2814 -:103170004AD2DFE800F005070C1C2328353A3F440B -:10318000FFDF42E0207820283FD1FFDF3DE0A74865 -:103190000178032939D0C078132836D02078242824 -:1031A00033D0252831D023282FD0FFDF2DE0207801 -:1031B00022282AD0232828D8FFDF26E020782228BA -:1031C00023D0FFDF21E0207822281ED024281CD025 -:1031D00026281AD0272818D0292816D0FFDF14E077 -:1031E0002078252811D0FFDF0FE0207825280CD08B -:1031F000FFDF0AE02078252807D0FFDF05E02078F0 -:10320000282802D0FFDF00E0FFDF257030BD30B599 -:103210000B8840F67B444FF6FF72022801D09342A0 -:1032200004D09D1FA54224D2022802D04D88954289 -:1032300003D04D88AD1FA5421BD24C88A34218D89D -:103240008B88B3F5FA7F14D2022802D0C888904246 -:1032500005D0C88840F677450A38A84209D2C88800 -:10326000904208D0944206D05B1C6343B3EB800FBE -:1032700001DB072030BD002030BD70B514460D467F -:10328000064610F0EDFF60B90DB1A54201D90C2042 -:1032900070BD002409E000BF56F8240010F0E0FFE4 -:1032A00008B1102070BD641CE4B2AC42F4D300201D -:1032B00070BDF0B50024059D10B1A94203D850E0BF -:1032C00009B90020F0BD0920F0BD055DD5B1071991 -:1032D00097F801C0BCF1150F2DD03BDCBCF1150FE8 -:1032E00038D2DFE80CF037122020262628282F2F8E -:1032F000373737373737373737372000025D22BB4C -:10330000641CE4B28C42F9D3DBE7022DDBD1BD783B -:103310001D70072D01D26D0701D40A20F0BD15786C -:1033200045F0010515E0EF43FF0707E0012D07D049 -:1033300010E00620F0BD2F07A7F18057002FF5D031 -:103340003046F0BD1578AF0701D50B20F0BD45F034 -:1033500002051570055D641C2C44E4B28C4202D950 -:10336000B1E74FF448568C42AFD3AAE710B50278C4 -:10337000540809D0012243F20223012C07D0022C69 -:103380000DD0032C13D10FE00020087005E08079E8 -:103390000324B4EB901F0AD10A70002010BD80797D -:1033A000B2EB901F03D1F7E780798009F4D018467B -:1033B00010BD1E4A117C39B1517C022908D0032965 -:1033C00008D043F2022070470146901D01F0FCBC7A -:1033D000032100E0012101700020704738B50C4640 -:1033E0000546694601F0F0FC00280DD19DF800105B -:1033F000207861F34700207055F8010FC4F80100F0 -:10340000A888A4F80500002038BD38B51378E8B1C5 -:1034100002281BD006A46D46246800944C7905EB65 -:103420009414247864F34703137003E0CC01002064 -:103430000302FF0103280ED003F0FE00107008689D -:10344000C2F801008888A2F8050038BD23F0FE0309 -:1034500013700228E9D1D8B240F00100EEE730B590 -:103460000C46097897B0222902D2082017B030BD47 -:1034700028218DF80010ADF80200132A03D03B2A52 -:1034800001D00720F2E78DF804200BA968460AF066 -:10349000E1FD050003D121212046FFF763FE284608 -:1034A000E4E700B597B023218DF80010ADF80200D5 -:1034B0001088ADF804005088ADF80600D088ADF84B -:1034C0000A009088ADF808000020ADF80C00ADF8B7 -:1034D0000E000BA968460AF0BDFD07E600B597B0DF -:1034E0002C22FA4968461EF04CFB0020CDF8030060 -:1034F000ADF80700F648007C022801D0012000E06A -:1035000000208DF809000BA968460AF0A3FD0028E9 -:1035100000D0FFDFEAE52DE9FF470220EC4E8DF8F1 -:1035200004000027B08AADF80600B84643F202094D -:103530004DE001A80DF0FBF9050006D0B08AA8B354 -:10354000A6F81480ADF806803FE0039CA07F010739 -:103550002DD504F124000090A28EBDF8080021466C -:1035600004F1360301F00DFE050005D04D452BD0CA -:10357000112D3DD0FFDF3BE0A07F20F00800A077B9 -:10358000E07F810861F30000C10861F34100E0774A -:1035900094F8210000F01F0084F8200020782828EB -:1035A00027D129212046FFF7DDFD22E015E0400765 -:1035B0000BD5BDF80800214604F10E02FFF771FF9C -:1035C00005000DD04D4510D100257F1CFFB2022013 -:1035D0000DF0EEF9401CB842ABD8052D12D008E032 -:1035E000A07F20F00400A07703E0112D00D0FFDFC2 -:1035F0000025BDF80600B082052D05D0284604B090 -:10360000BDE8F087A6F814800020F8E770B50646FC -:10361000FFF770FD054605F0C8FE040000D1FFDF8E -:103620006680207820F00F00801C20F0F000203011 -:1036300020700620207295F83E006072BDE8704050 -:1036400005F0B6BE2DE9F04786B0040000D1FFDFDB -:1036500020789F4E20F00F00801C20F0F00070308A -:10366000207060680178091F182931D2DFE801F065 -:10367000FD30303053FC300CFCFC40FD3030FD762A -:10368000FDFD3030FDFDFBFA86883046FFF732FD48 -:103690000546304607F05FFAE0B16068807985F84A -:1036A0003E0021212846FFF75DFD3046FEF7B9FCBC -:1036B000304603F0C3FF3146022010F085FDA87F9D -:1036C00020F01000A877FFF726FF002800D0FFDFCA -:1036D00006B095E7207820F0F0002030207006201A -:1036E0002072668060688079607205F061FED8E7BC -:1036F00085882846FFF7FEFC00B9FFDF6068807808 -:10370000012800D0FFDF6068817906B02846BDE857 -:10371000F04707F0FDBD86883046FFF7EBFC05005B -:1037200000D1FFDF05F044FE60683146C088288183 -:1037300060680089688160684089A881022010F073 -:1037400043FD0020A875A87F00F003000228BFD128 -:10375000FFF7E1FE0028BBD0FFDFB9E780783C2807 -:1037600003D0002502280AD000E00125002720B15F -:103770003C2802D0022800D0FFDF17B1B8E00127B3 -:10378000F5E705F015FE1DB1B07801F0DCFAA1E017 -:103790006568B5F804A0A879AD1C012806D0307979 -:1037A000814605F097FB070003D101E0B078F7E709 -:1037B000FFDF0022022150460DF047F9040000D13E -:1037C000FFDF22212046FFF7CDFC2879012800D019 -:1037D0000220A17F804668F30101A177288B208118 -:1037E000688B6081A88BA08184F822908DF8088076 -:1037F000B8680090F86801906A46032150460DF0C1 -:1038000024F900B9FFDFB888ADF81000B8788DF85A -:10381000120004AA052150460DF017F900B9FFDF88 -:10382000B888ADF80C00F8788DF80E0003AA0421D2 -:1038300050460DF00AF900B9FFDF062105F112002C -:1038400001F0EDFA28B36879800700D5FFDF6979C8 -:10385000E07D61F34700E075D5F80600A061688956 -:10386000A08303E05EE057E050E062E0062105F14E -:103870000C0001F0D4FAB0B1B0794108607861F37E -:1038800047006070D6F80700C4F80200B6F80B00D5 -:1038900012E0E07D20F0FE00801CE075D5F81200FB -:1038A000A061E88ADCE7607820F0FE00801C607090 -:1038B000E868C4F80200288AE080B8F1010F09D056 -:1038C000B8F1020F14D0FFDF02E70000CC1F0200A6 -:1038D000CC0100203078032800D0FFDF002108460B -:1038E00010F072FC06B00120BDE8F04701F0FAB913 -:1038F000F078132800D0FFDF0021062010F064FCD0 -:1039000006B01120BDE8F047FFF790BB06B0204697 -:10391000BDE8F04701F0E6BE05F04AFDB07C40F09E -:10392000020004E005F044FDB07C40F00400B074F7 -:10393000CEE606B0BDE8F04705F03ABD2DE9F04708 -:1039400005460078914600270209FF480C463E468E -:10395000012A6DD000234FF6FF71022A69D0072A91 -:1039600009D00A2A71D0FFDFA9F800600CB12780C6 -:103970006680002044E6D5F804C09CF80060142E50 -:103980007DD010DC04F1080204F118080F2E21D0BC -:1039900004DC042E5AD0082E57D10DE0122E6FD021 -:1039A000132EF9D11FE0153E072E4ED2DFE806F0A8 -:1039B000C14D4D099FEAB00012271026BCF8040043 -:1039C00014E11C27092694B3BCF80200A0806868A3 -:1039D00000795AE11B2709264CB30320207268683E -:1039E0004088A080C0E79CF802003C2827D0102720 -:1039F00018260CF1020CD4B1BCF80200A080BCF86F -:103A000018006082BCF818002082BCF81A00A0825E -:103A1000BCF81C00E0829CF805000CF10601FFF7E1 -:103A2000F4FC9CF8040028B10120E0739CE703E05B -:103A3000BFE0DFE00220F8E7A9F8006099E71B2764 -:103A40000926002CF8D023728EE720E11D273726A7 -:103A5000002CF1D0A18069680879491DFFF7D5FCD9 -:103A6000686890F82B00A0756868C0780428E07D2D -:103A700016D020F00100E0756968C97801E06DE0BA -:103A800011E061F34200E07569681F22C97A61F3B1 -:103A9000C700E075696840460C311EF02DF863E7F9 -:103AA00040F00100E7E71D273726002CC4D0A18095 -:103AB0006868411D0079FFF7A8FC696804F10F02EE -:103AC00001F10C00CB7A01461846FFF79EFC6868AE -:103AD000807CA0756868C178E07D61F3420020F0C9 -:103AE000F900E0751F2140461EF09FF83CE72027B3 -:103AF0001026002CA0D0A180686804F10902407A49 -:103B000020726968CB1C88781946FFF77EFC2BE78A -:103B100021270A26002C8FD0BCF80210A1806968EA -:103B200009792172696849796172817C21F0040107 -:103B300057E022270B26002C84D0BCF80400A0807C -:103B40006868807820726868807901F077F960721F -:103B50006868C07901F072F9A07205E72427102681 -:103B6000002CA3D0BCF80200A080686800792081F6 -:103B70006868007A60816868C088A0816868408948 -:103B8000E081F1E623271026002C8FD0BCF802102C -:103B9000A1806968898821816968C98861816968AB -:103BA0000989A18169684989E181817C21F002014B -:103BB00017E0297A012903D0022914D0FFDFD3E6C8 -:103BC0001F271026002C95D06988A180A989218102 -:103BD000E9896181298AA181698AE181817C21F059 -:103BE00001018174C0E6122768881026214601F081 -:103BF00003F9B9E6287A072850D2DFE800F0373D0C -:103C00003D484848040011270926002C94D0B5F8F7 -:103C100002804046FFF76EFA90F822A0A4F80480D4 -:103C2000687A2072042140460CF02AFF05214046A4 -:103C30000CF026FF002140460CF022FF01214046F7 -:103C40000CF01EFF032140460CF01AFF02214046F3 -:103C50000CF016FF062140460CF012FF07214046EB -:103C60000CF00EFF504601F06EF87DE61B2709268A -:103C7000002C8AD0A180E6E61B270926002C84D0E0 -:103C8000A180287A012800D0022020726CE64A46E2 -:103C900021462846BDE8F04701F0AFBEFFDF63E6EE -:103CA00030B5294D97B0E878132802D0082017B016 -:103CB00030BD22208DF800000BA968460AF0CAF931 -:103CC000040002D1287901F03EF80021062010F00E -:103CD0007BFA2046EBE700B51B4897B0C078122866 -:103CE00001D0082016E41E208DF8000000208DF879 -:103CF00002008DF803000BA968460AF0ABF9002812 -:103D0000F0D10021062010F05FFA1120FFF78EF9A4 -:103D10000020E7E710B50C4C96B02078012815D0AC -:103D20001B208DF8000000208DF802000BA96846CA -:103D30000AF090F900280AD10021084610F044FA50 -:103D40002078032805D007E0CC010020082016B019 -:103D500010BDA07800F0F7FF012000F0C3FF0020A5 -:103D6000F5E770B5002538B1022817D0062836D0FF -:103D7000072800D0FFDF70BDFFF7CCFF0028FAD185 -:103D800005F013FB0028F6D0017821F00F01891C03 -:103D900021F0F0012031017005723FE08EB2304613 -:103DA000FFF7A8F9040000D1FFDF20782128E2D036 -:103DB00005F0FBFA60B1017821F00F01891C21F0B8 -:103DC000F00110310170022101724680A57525E0D5 -:103DD00021463046BDE870401322FFF740BBFE4845 -:103DE000C478122C03D0132C04D0FFDF70BDFFF772 -:103DF00072FF01E0FFF754FF0028F7D105F0D5FA74 -:103E00000028F3D0017821F00F01891C21F0F00186 -:103E100020310170122C05D002210172BDE87040E2 -:103E200005F0C6BA0121F8E72DE9F04116460C006D -:103E3000804600D1FFDF307820F00F00801C20F09A -:103E4000F000103030702078012804D0022817D0FC -:103E5000FFDFBDE8F0814046FFF74CF9050000D1D7 -:103E6000FFDF0320A87505F0A3FA94E80F000836D9 -:103E700086E80F00D848817C41F001018174E8E7B1 -:103E80004046FFF737F9050000D1FFDFA1884FF664 -:103E9000FF700027814202D1E288824203D0814232 -:103EA00001D1E08840B105F083FA94E80F000836AC -:103EB00086E80F00AF75CCE7A87D0128C9D178232B -:103EC00000224146022010F0D5F80220A875C0E774 -:103ED00030B5054697B00C46084610F0C1F978BBDE -:103EE00000210120203D072D73D2DFE805F00425D5 -:103EF0004C515A6640000021072010F03BF908B1F0 -:103F00001120D4E624208DF80000D4F80200CDF86A -:103F10000200A0798DF806000BA968460AF09AF80D -:103F2000050057D1002208231146072010F0A2F8FF -:103F300007284FD0FFDF4DE0606810F0D5F908B1D9 -:103F40001020B4E64A208DF800002088ADF8020069 -:103F50006088ADF804000BA968460AF07BF80500FC -:103F600038D1606898B3BDF83010018032E04C2041 -:103F70008DF800002088ADF80200A07800F0010064 -:103F80008DF8040014E0206801F0D5FF054621E01B -:103F90004B2207E08DF802000AE000BF8DF8021006 -:103FA00006E046228DF800202278D207F6D0F1E70D -:103FB0000BA968460AF04EF8E8E738208DF80000B3 -:103FC0002088ADF802006088ADF80400F0E701E059 -:103FD000FFE7072528466AE630B5054697B00C4648 -:103FE000084610F063F908B1102060E6203D072D67 -:103FF00027D2DFE805F00424242426262400208884 -:10400000FFF778F820B10078222804D208204EE685 -:1040100043F202004BE625208DF800002088ADF821 -:1040200002000BA968460AF015F80028DDD1DDF87A -:104030003210C4F802109DF83610A17137E6062040 -:1040400035E6072033E66448801D704738B51621F1 -:1040500061481DF0C8FD012000F044FE1120FEF76C -:10406000E5FF5D4C6846E11D05F0FFF89DF8001086 -:10407000A07961F3470020F00100A07100202074B6 -:104080004FF46170E08102206074FFF71AF800B10C -:10409000FFDFFDF769F901F0E2FA38BD10B50C4613 -:1040A000402120461DF09FFDA07F20F00300A07757 -:1040B000202020700020A07584F8230010BD7047D8 -:1040C0007CB5054610F0CCF808B110207CBD424C00 -:1040D000A11DD4F806000090D4F80A0001902846EB -:1040E000FFF77CF90028F1D1FEF7EBFF0028EDD0B7 -:1040F0000099C4F80610BDF8041061819DF80610FF -:1041000021737CBD10B5044610F0D0F808B1102022 -:1041100010BD314922468879C91D4008FFF775F95D -:10412000002010BD2DE9F0479CB00D4604004FF073 -:10413000000812D00822FFF7A0F800281CD10026A2 -:1041400009E000BF54F8260004A9FFF70FF9002882 -:1041500012D1761CF6B2AE42F4D32F460A2006AD39 -:104160000DF1440A8DF8180026465146284609F0FC -:1041700071FF20B143F203201CB0BDE8F087404638 -:10418000DFF8548088F805002EB300244FF00B09A7 -:104190001DE000BF56F8240005A9FFF7E7F800B1BD -:1041A000FFDF9DF81400A87056F8240050F8011F96 -:1041B000C5F803108088A5F8070085F800905146DF -:1041C000284609F047FF00B1FFDF641CE4B2BC429F -:1041D000E0D388F8057001E0CC0100200020CBE797 -:1041E0002DE9F0479EB01546894604001DD00F46C4 -:1041F00008222946FFF741F8002810D1002612E0D6 -:1042000054F8260005A9103000F0DEFD002806D184 -:104210003FB157F8260010F023F810B110201EB05F -:10422000ABE7761CF6B2AE42EAD30026A5F1010850 -:104230001CE000BF06F1010A0AF0FF0712E000BF10 -:1042400054F82600017C4A0854F827100B7CB2EB86 -:10425000530F05D10622113011311DF021FC78B128 -:104260007F1CFFB2AF42EBD30AF0FF064645E1DB0D -:10427000C8462E4607AD0DF1480924B1012003E0E0 -:1042800043F20520CBE700208DF81E0031208DF889 -:104290001C004946284609F0DDFE38B934208DF867 -:1042A0001C004946284609F0D5FE10B143F204200F -:1042B000B5E77CB300272BE054F82700A91C103089 -:1042C00000F082FD00B1FFDF54F82700102250F803 -:1042D000111FC5F803108088A5F8070054F82710AF -:1042E00005F109001DF008FCB8F1000F16D058F8D0 -:1042F0002710102205F119001DF0FEFB3220287056 -:104300004946284609F0A6FE00B1FFDF7F1CFFB238 -:10431000B742D1D3FFF7E2F8002080E705F119009A -:1043200001F0FDFDEAE770B596B004460FF098FF86 -:1043300018B960680FF0E1FF10B1102016B070BD21 -:1043400060884AF2B811884207D82078FE4D6E4640 -:1043500028B1012806D0022804D00720EEE7FEF796 -:10436000B0FE1AE06078022804D0032802D043F29D -:104370000220E3E7687417208DF80000697C0020B4 -:10438000CDF80200ADF80600022934D003292FD061 -:10439000FFDF0BA9684609F05DFE0028CED16068FA -:1043A00001F0B0FD207870B101208DF80200F01C02 -:1043B00001F0B5FD4E208DF800000BA9684609F00C -:1043C00049FE00B1FFDF20782874FFF787F8608886 -:1043D00098B1E88180B2ADF8020030208DF800007D -:1043E0000BA9684609F036FE00B1FFDF0020A5E703 -:1043F0008DF80700CDE74020FAE74FF46170E8E759 -:1044000010B504460FF052FF20B9606838B10FF0C4 -:104410006BFF08B1102010BD606801F080FDCA4834 -:10442000C1896180417C6170007C2070002010BDDA -:104430002DE9F0419CB0054600208DF864008DF810 -:1044400060008DF830008DF868001E4614468846DE -:1044500028460FF052FF18B920460FF04EFF10B15A -:1044600010201CB0F5E455EA040018D01F270CAB4F -:1044700019AA414628460097FEF71BFF0028F0D1F5 -:104480001AAB18AA314620460097FEF712FF002803 -:10449000E7D19DF86000C00703D00A20E1E70720BC -:1044A000DFE701AF7DB11A208DF804008DF806809A -:1044B00042462946F81C1DF01FFB0DA901A809F072 -:1044C000C9FD0028CDD17CB120208DF804008DF8E5 -:1044D000066032462146F81C1DF00EFB0DA901A80E -:1044E00009F0B8FD0028BCD197499DF8300048700C -:1044F0000020B6E72DE9F0479CB08A464FF000084F -:1045000092A104468DF83480D1E90001CDE919016A -:1045100020460FF0A5FE90B92078012803D16068ED -:104520000FF09EFE58B9884D4FF00109287C40B12C -:10453000687C022805D160680FF0DFFE08B110200A -:104540001AE62878012801D0082015E607200CF08B -:1045500037FA18B9207878B101280DD0FEF780FD20 -:1045600060B1608943F6E172A0F1200191422178A7 -:104570000CD3012904D0B6E01220FDE51320FBE5A1 -:1045800000287DD1A18900297AD109E0012907D02D -:104590006978C90704D0A189002971D0B4296FD8DE -:1045A000217831B1012908D0022904D0032967D12B -:1045B0000AE0002609E0022607E008B9A08908B150 -:1045C000042609E0012607E00326287C50B1687C18 -:1045D000022807D1606828B10DA96068FEF7C6FE01 -:1045E0000028ADD1207A30B1012806D0022806D0AB -:1045F000032878D105E0002704E0012702E0022724 -:1046000000E003270EB1022E0ED16FB16879B8B366 -:104610006878800702D043F20120ADE5022E03D175 -:10462000022F60D0032F5ED0207808B1012806D178 -:10463000504600F06BFB002887D185F802A01820B7 -:104640008DF838006089ADF83A006089ADF83C001B -:104650008DF83E600DF13F00FEF7ABFE00B1FFDFCD -:104660009DF834008DF840002078012806D0287C81 -:1046700068B1687C02280AD1606840B1606800E0D7 -:1046800031E050F8011FCDF84110808802E040462B -:10469000CDF84180ADF845008DF84870A07BC0F39F -:1046A0004002014662F35F01C0F3800041EA8000EE -:1046B00019A9085C8DF84700A8B169460EA809F051 -:1046C000C9FC0028A9D11B208DF838008DF83A903C -:1046D00069460EA809F0BEFC00289ED19DF8010095 -:1046E0001B281CD101E0072046E5052E0CD2DFE88F -:1046F00006F0030308080300A87800F017FB032066 -:1047000000E0022000F0EEFA012E0AD0A08940B1AC -:1047100000228300114610460FF0ACFC08B10320C4 -:104720002AE5002028E52DE9FC4107460D46032631 -:1047300008460FF0E2FD00286CD13846FEF7DAFC9F -:1047400004000CD0207805E0CC0100200706050409 -:1047500003020100222805D20820BDE8FC8143F2B3 -:104760000200FAE7A07F00F0030C2DB12946604655 -:10477000FEF74DFD0600F0D1BCF1010F05D0BCF1F4 -:10478000020F18D0FFDF3046E7E7A07D2946022858 -:1047900001D011B107E01120DFE76846FCF7F2FE17 -:1047A0000028DAD16946384606F075FD0600EAD1E0 -:1047B0000120A075E7E7A07D032803D1FE48807C97 -:1047C000C00701D035B30EE025B1A07F40071FD44C -:1047D000002100E00121384606F07DFD0600D2D11F -:1047E000A075002DCFD02A4621463846FEF759FE47 -:1047F00006461128C7D1A07F4107C4D4296844F8D0 -:104800000E1F6968616040F0040020740026BAE75A -:104810001126B8E71020A0E770B50C460546FEF754 -:1048200069FC010005D022462846BDE87040FEF72D -:1048300016BE43F2020070BD00B597B043218DF85B -:1048400000108DF802000BA9684609F003FC17B0B0 -:1048500000BD0123FEF751BC00231A461946FEF79E -:104860004CBC30B597B004460FF0FAFC10B11020E4 -:1048700017B030BD204600F095FA0028F8D1CE4D93 -:10488000E878112801D00820F2E7FEF7E9FBE0B351 -:104890002078800701D56879C0B31D208DF800000D -:1048A0002078022200F001008DF802006088ADF847 -:1048B0000400A088ADF806002078C0F3400102EAA9 -:1048C000500001438DF8091002A8FEF772FD00B1F7 -:1048D000FFDF0BA9684609F0BDFB0028C8D11E20E8 -:1048E0008DF8000001208DF8020000208DF80300F3 -:1048F0000BA9684609F0AEFB0028B9D1E08800F0AA -:104900006DFA0400B4D1122001E004E005E0FEF7E6 -:104910008DFB2046ACE71320AAE70720A8E72DE986 -:10492000F043A54E074697B0F078994615460C46D9 -:10493000122803D1FFF7CFF9002816D120460FF037 -:104940008FFCE8BB28460FF08BFCC8BB204600F06C -:1049500029FA002809D129460220FEF758FC002830 -:1049600003D1F078112803D0082017B0BDE8F083F8 -:1049700006200CF025F850B12078800701D5707919 -:1049800038B1FEF76DFB022805D21320EDE71220A7 -:10499000EBE70720E9E721208DF800006088ADF8FB -:1049A0000200A088ADF8040020784FF00008C0F3A2 -:1049B00040008DF80600207880071FD4384600E0BC -:1049C00002E00FF04DFC08B11020CEE73878400827 -:1049D00008D0012809D0022807D0032805D043F2C7 -:1049E0000220C2E78DF8078002E001208DF8070061 -:1049F00057F8010F0290B888ADF80C000DF10E00C9 -:104A0000FEF7D7FC08B10320AFE72888ADF8100007 -:104A10006888ADF81200A888ADF81400E888ADF8F1 -:104A20001600ADF81880ADF81A80484600F06EF90F -:104A300000289AD186F804900BA9684609F00AFB71 -:104A4000002892D1307900F071F9E08800F0C6F9C1 -:104A500004008AD11320FEF7E9FA204685E730B535 -:104A6000054697B00C4608460FF020FC08B1102010 -:104A7000FEE62846FEF73EFB38B10178222902D334 -:104A8000807F800604D40820F2E643F20200EFE6BD -:104A900013208DF80000ADF802500BA9684609F00C -:104AA000D9FA0028E4D19DF932107F2901D0217074 -:104AB000DEE60520DCE630B5054697B00C46084634 -:104AC0000FF0CEFB08B11020D2E62846FEF712FB0D -:104AD00020B10078222804D20820C9E643F202005F -:104AE000C6E63548807C400701D51120C0E6207815 -:104AF000800802D16078800801D00720B8E65620EF -:104B00008DF80000ADF8025020788DF80400607830 -:104B10008DF805000BA9684609F09CFAA8E62DE976 -:104B2000F041B0B014460D460646FEF7E3FA070022 -:104B300006D03878222806D2082030B0BDE8F081AF -:104B400043F20200F9E728460FF0D7FB30B94FF0E7 -:104B500000084CB120460FF0C7FB08B11020ECE76D -:104B6000C4F80080A4F804801348807C800701D535 -:104B70001120E2E797F8220004F0ACF98088011DCB -:104B8000FB2901D2001D00E0FB20C0B26A46294685 -:104B900000F0E3F82C22094904A81CF0F2FFBDF84C -:104BA0000200ADF81400BDF80600ADF81600ADF82F -:104BB0001260BDF8000003E0CC010020A01F02003D -:104BC000ADF81800BDF80400ADF81A001AA904A841 -:104BD00009F040FA00B1FFDFBDF86C00ADF8080045 -:104BE000BDF86E00ADF80A00BDF87000BDF8721097 -:104BF000BDF800200844ADF80C0007201B2A9CD308 -:104C0000BDF802101B2998D3FB2A96D8FB2994D80B -:104C100006278A4210D10121104600F05AF8BDF84B -:104C20000410884208D1BDF80200012100F051F8BB -:104C3000BDF80610884201D038467EE7BDF808006E -:104C400028B9BDF80A1011B9BDF80C1029B35DB12F -:104C5000298849B1698839B124B102982060BDF82A -:104C60000C00A080132068E7BDF80010BDF80A20F2 -:104C7000081A80B2ADF80000BDF80210891AADF82C -:104C80000210012100F025F8ADF80400BDF8020083 -:104C9000012100F01EF8ADF806002C226B490FA888 -:104CA0001CF06FFFADF83E60BDF80200ADF84000AB -:104CB000BDF80600ADF84200BDF80000ADF84400B4 -:104CC000BDF80400ADF8460025A90FA809F0C2F907 -:104CD00033E7022903D0C000703080B270478000F3 -:104CE0003C30FAE730B55A4D040008D0012C04D00E -:104CF000022C06D0032C04D0FFDF2C7030BDFFDF68 -:104D0000FBE728780128F8D0FFDFF6E710B5044666 -:104D100004F0E0F830B1407830B1204604F0EEFB0A -:104D2000002010BD072010BD122010BD10B504F0EA -:104D3000D1F8040000D1FFDF607800B9FFDF6078B0 -:104D4000401E607010BD10B504F0C4F8040000D11E -:104D5000FFDF6078401C607010BD10B5144631B1A3 -:104D60000A68226049686160218839B107E02080C3 -:104D700060800121FFF7ADFFA0800DE020806188F9 -:104D800001B96080A08820B920880121FFF7A1FF28 -:104D9000A080E088002804D160880121FFF799FFF6 -:104DA000E08010BD418843F6FD730A1F9A4209D284 -:104DB0008088042806D3B0F5804F03D8884201D8F4 -:104DC00000207047072070470278520804D0012A5B -:104DD00002D043F202207047FEF7C8BA10B548B1BE -:104DE00083000022114606200FF044F9062801D066 -:104DF000032010BD002010BD70B50C0006460DD07C -:104E0000FEF778F9050000D1FFDFA6802889208110 -:104E1000288960816889A081A889E08170BD10B56A -:104E200000231A4603E0845C2343521CD2B28A4218 -:104E3000F9D30BB1002010BD012010BD00B5012831 -:104E400003D0022801D0FFDF002000BDF81F0200C0 -:104E5000CC01002010B504460FF002FA08B1102072 -:104E600010BD2078C0F30210042807D86078072806 -:104E700004D3A178102901D8814201D2072010BDA6 -:104E8000E078410706D421794A0703D4000701D40A -:104E9000080701D5062010BD002010BD10B51378FD -:104EA0005C08C37F64F30003C3771478A40864F339 -:104EB0004103C3771078C309487863F34100487011 -:104EC00013781C090B7864F347130B701378DB0815 -:104ED00063F3000048705078487110BD10B5C47875 -:104EE0000B7864F300030B70C478640864F3410327 -:104EF0000B70C478A40864F382030B70C478E408D0 -:104F000064F3C3030B700379117863F3000111702C -:104F100003795B0863F34101117003799B0863F324 -:104F2000820111700079C00860F3C301117010BDD7 -:104F300070B514460D46064604F037FA80B1017884 -:104F4000182221F00F01891C21F0F001A03100F896 -:104F5000081B21461CF015FEBDE8704004F028BA7D -:104F600029463046BDE870401322FEF778BA10B5E6 -:104F7000FE4C94F8300000280CD104F120014FF6CB -:104F8000FF72A1F110000DF04DF900B1FFDF01201B -:104F900084F8300010BD2DE9F047064608A8894680 -:104FA00090E830041F469046142128461CF03DFE30 -:104FB0000021CAF80010B8F1000F03D0B9F1000FBA -:104FC00003D114E03878C00711D020680FF06EF9D3 -:104FD000F0BBB8F1000F07D12068123028602068BC -:104FE000143068602068A8602168CAF8001038781A -:104FF000800728D560680FF077F948BBB9F1000F3A -:105000002DD0FFF720F80168C6F8C8118188A6F8EE -:10501000CC11807986F8CE01FFF7A9FFDFF84C8329 -:1050200008F12008C5F80C80626862B196F8C801E2 -:1050300006F2C91140081032FEF7E7F91022414686 -:1050400060681CF059FD3878400712D5A06800E070 -:1050500002E00FF02BF950B11020BDE8F087606836 -:105060000028F9D0E8606068C6F8C401EBE7A068E2 -:1050700028610020F1E730B5054608780C4620F09D -:105080000F00401C20F0F0011031217000206070F2 -:1050900095F8230030B104280FD0052811D0062838 -:1050A00014D0FFDF20780121B1EB101F04D295F856 -:1050B000200000F01F00607030BD21F0F0002030B3 -:1050C00002E021F0F00030302070EBE721F0F0003A -:1050D0004030F9E710B510B190F8BD4044B1A34895 -:1050E00090F83540002064B108601060186010BD71 -:1050F00000F1BC040C6000F1E40100F58670116061 -:10510000F4E79A4C34340C60EFE700B58BB007231A -:10511000CDE902128DF801300191944900236431E8 -:105120000591099301468DF8103068460DF052F84C -:10513000002800D0FFDF0BB000BD70B590B0154661 -:105140000C4602220646ADF80820092103AB04F004 -:105150006EFF0490002812D00C208DF8010004206E -:105160008DF8040004F59A74099605948DF818508A -:105170000AA968460DF02EF800B1FFDF012010B03B -:1051800070BD30B597B00C462C251A998DF800509B -:10519000ADF80200B3B11868019058680290ADF8FC -:1051A0000C2010220DF10E001CF0A6FC0BA9684685 -:1051B00008F050FF002803D1A17F41F01001A17732 -:1051C00017B030BD00200190E8E72DE9F047064612 -:1051D000808A8CB080B20D468246FDF78BFF044674 -:1051E000624F3078283FDFF884914FF00008112893 -:1051F00073D2DFE800F072F1350936777E98A7F2B6 -:10520000EFEEEDEC5BECEC00A07F00F0030001287A -:1052100006D0002150460BF021FC050003D101E02F -:105220000121F7E7FFDF99F85C10C90702D0D9F830 -:1052300060000BE0032105F121000EF0E2FCD5F83F -:1052400021004B49B0FBF1F201FB1200C5F821002F -:105250007068A867B068E8672078252800D0FFDF6D -:10526000ECE0A07F00F00300012806D000215046AA -:105270000BF0F4FB060003D101E00121F7E7FFDFAB -:105280003078810702D52178252904D040F001002B -:1052900030700CB0E1E60220287096F820002871EA -:1052A00006F121003136C5E90206F2E7A07F00F0E1 -:1052B0000300012806D0002150460BF0CFFB04006C -:1052C00003D101E00121F7E7FFDF2078C10605D512 -:1052D0001320287041346C60DBE7BEE140F0080029 -:1052E0002070D6E72148082128380EF08AFC0320D8 -:1052F00016E02A208DF8000010220DF102007168DE -:105300001CF0FAFB10220DF11200B1681CF0F4FB46 -:10531000164968462C3908F09DFE00B1FFDF0420D5 -:1053200028706F60B5E7E07FC00600D5FFDF307CF6 -:10533000B28800F001030CB05046BDE8F0470921E7 -:1053400005F00BBD04B9FFDF716821B1102204F133 -:1053500024001CF0D1FB28212046FDF703FFA07F8D -:1053600000F00300022814D104E00000180200201D -:1053700040420F0004F12400002300901A46214609 -:105380005046FFF7FEFE112807D029212046FDF7E1 -:10539000E9FE307A84F820007BE7A07F000700D583 -:1053A000FFDF14F81E0F40F008002070A4F81680EC -:1053B000C4F81880C4F81C806178084661F3820044 -:1053C000410861F3C3006070307AE07061E727E064 -:1053D0003FE17AE051E000E037E0A07F00F0030019 -:1053E000012806D0002150460BF038FB040003D101 -:1053F00001E00121F7E7FFDF022104F189000EF04F -:1054000000FC1020287004F5E4706860B4F889107E -:10541000298204F18000FD496861C5E9029138E7FD -:10542000A07F00F00300012805D0002150460BF0BA -:1054300015FB18B901E00121F8E7FFDF0CB0324697 -:1054400021465046BDE8F04772E504B9FFDF2078F9 -:105450002128A1D93079012803D1E07F40F0100044 -:10546000E077324621465046FFF762FD0CB02046F9 -:10547000BDE8F0472321FDF775BE3279AA8005F11A -:1054800008030921504604F0D2FDE86010B1112054 -:105490002870FEE6A07F00F00300012806D000215E -:1054A00050460BF0DBFA040003D101E00121F7E7DD -:1054B000FFDF04F1660102231022081F0BF03BF905 -:1054C00080F8008031794170E3E6A07F00F00300AE -:1054D000012806D0002150460BF0C0FA050003D188 -:1054E00001E00121F7E7FFDF95F8880000F00300F5 -:1054F000012879D1A07F00F00307E07FC0F34006C8 -:1055000016B1012F04D02BE095F8A400C0072AD0D3 -:10551000D5F8C00118B395F88720017C62F38701A4 -:105520000174E27FD5F8C00162F341010174D5F83E -:10553000C00166F300010174AEB1D5F8C0011022BC -:1055400004F124018C351CF0D7FA287E40F00100CC -:105550002876287820F0010005F88C0900E016B1C3 -:10556000022F04D02CE095F88C00C00726D0D5F887 -:10557000BC1119B395F88720087C62F38700087482 -:10558000E27FD5F8BC1162F341000874D5F8BC1174 -:1055900066F3000008748EB1D5F8BC01102204F146 -:1055A00024018C351CF0A8FA287840F0010005F899 -:1055B000180B287820F0010005F8A409022F44D028 -:1055C0005FF0000000EB400005EBC00090F88C009D -:1055D000800709D595F88000D5F8C421400805F169 -:1055E00081011032FDF711FF05208DF8000095F8BC -:1055F00088006A4600F003008DF8010095F88C10D1 -:105600008DF8021095F8A4008DF80300214650464D -:1056100001F046FA2078252805D0212807D0FFDFA1 -:105620002078222803D922212046FDF79BFDA07F68 -:1056300000F0030001280AD0002150460BF020FAA8 -:1056400000283FF432AEFFDF23E60120BAE7012154 -:10565000F3E7716881F801801BE6FFDF19E670B59A -:105660006A4C0025103C04F85C5F65600CF07FFD1F -:105670006649A1F1100003F02AFE04F82C5C062014 -:10568000607262487C3020615030A0611030E0616F -:1056900070BD70B50D46FDF72DFD040000D1FFDF94 -:1056A0004FF4E87128461CF0C0FA5848543068613D -:1056B00004F124002861A07F00F00300012809D034 -:1056C0005FF0020105F59A700CF052FD002800D041 -:1056D000FFDF70BD0121F5E70A46014602F59A7029 -:1056E0000CF066BD70B5054640689CB0017809298C -:1056F00006D00C2937D00D2933D0FFDF1CB070BD88 -:1057000046883046FDF7F6FC040000D1FFDF207824 -:105710002128F3D0282821D1686802210C3001F01B -:10572000B4F9D8B168680821001D01F0AEF9A8B13C -:105730002D208DF80000ADF80260102204F1240144 -:1057400001A81CF0D9F90BA9684608F083FC00B148 -:10575000FFDF29212046FDF705FDCFE703F028FEF6 -:10576000CCE701218171686886883046FDF7C2FC6C -:10577000040000D1FFDFA07F00F00301022902D165 -:1057800020F01000A077207821280AD0686881795D -:1057900009B1807880B1A07F00F0030002285ED0BC -:1057A000FFDFA07F00F003000228A7D1FDF7B3FEC2 -:1057B0000028A3D0FFDFA1E703F0FAFDE07FC107D7 -:1057C00028D0800705D594F8200000F01F0010288D -:1057D0001ED0052084F82300207829281CD02428F6 -:1057E000DFD1314605200EF0EFFC22212046FDF7E7 -:1057F000B9FCA07F00F0030001282ED00021304624 -:105800000BF03EF90028CCD0FFDFCAE728020020C9 -:105810000620DFE70420DDE7A07F00F00300012879 -:1058200006D0002130460BF019F9050003D101E044 -:105830000121F7E7FFDF25212046FDF793FC0F202C -:105840008DF8580016A905F59A700CF0A8FC0228EE -:10585000A7D00028A5D0FFDFA3E70121CFE703F001 -:10586000A7FD9EE72DE9F0438BB099461546884683 -:105870000646FDF73FFC04004FD0207822284CD389 -:1058800023284AD0E07FC00647D4A07F00F0030061 -:10589000012806D0002130460BF0E0F8070002D0C6 -:1058A0000CE00121F7E7A07F00F00300012805D1FB -:1058B0000121002230460BF0C8F8074601AB02AACE -:1058C00003A93846FFF706FC039800B9FFDF4FB184 -:1058D000039807F59A7787612078222806D0242834 -:1058E00004D007E003990020886103E025212046C9 -:1058F000FDF738FC03980B21417046628580C0E9B2 -:105900000289029901610199416104A90CF062FCCC -:10591000022802D0002800D0FFDF0BB0BDE8F083E2 -:1059200070B586B00546FDF7E5FB017822291CD944 -:10593000807F00F00300012806D0002128460BF0EC -:105940008DF8040030D101E00121F7E7FFDF2BE003 -:10595000B4F8620004F1660630440178427831B14F -:1059600021462846FFF7E9FBB8B906B070BDADF88F -:1059700004200921284602AB04F059FB03900028BB -:10598000F3D011208DF80000694604F59A700CF0F0 -:1059900006FC022801D000B1FFDF022310223146AD -:1059A00004F162000AF0FDFEB4F864000028CFD1D3 -:1059B000DBE710B586B00446FDF79CFB0178222991 -:1059C00019D9807F00F00300012806D0002120466D -:1059D0000BF044F8040003D101E00121F7E7FFDFF9 -:1059E00012208DF80000694604F59A700CF0D7FB80 -:1059F000002800D0FFDF06B010BD2DE9F05F05469E -:105A00000C4600270078904601093E46BA4604F14C -:105A1000080B02297ED0072902D00A2909D142E0C9 -:105A200068680178092905D00C292CD00D292AD0C5 -:105A3000FFDFB2E114271C26002C6CD04088A08028 -:105A4000FDF758FB5FEA000900D1FFDF99F8170066 -:105A50005A46400809F11801FDF7D7FC68688089AB -:105A6000208269684868C4F812008868C4F8160083 -:105A7000A07E20F0060040F00100A07699F81E00FC -:105A800040F040014DE01A270A26002CD5D080882E -:105A9000A080FDF72FFB050000D1FFDF5946284607 -:105AA000FFF7E9FA79E10CB1A88BA080287A0D28DC -:105AB0007ED006DC01287CD0022808D0032804D13F -:105AC00035E00F2876D0102875D0FFDF65E11E275E -:105AD0000926002CB1D0A088FDF70CFB5FEA000975 -:105AE00000D1FFDF287B00F003000128207A1BD0C3 -:105AF00020F001002072297B890861F341002072A7 -:105B0000297BC90861F382002072297B090961F3AE -:105B1000C30001E036E1E9E0207299F81E0040F090 -:105B2000800189F81E1038E140F00100E2E71327F8 -:105B30000D26002CAAD0A088FDF7DCFA8146807FD4 -:105B400000F00300012806D00021A0880AF086FF9B -:105B5000050003D101E00121F7E7FFDF99F81E00FE -:105B600000F00302012A59D0E86F817801F00301A7 -:105B70000129217A54D021F00101217283789B08F8 -:105B800063F3410121728378DB0863F382012172A0 -:105B900083781B0963F3C3012172037863F3061151 -:105BA0002172437863F3C711217284F809A003E0DE -:105BB0005EE0A4E08BE09CE0C178A172012A32D0C3 -:105BC0004279E17A62F30001E1724279520862F3AC -:105BD0004101E1724279920862F38201E1724279F5 -:105BE000D20862F3C301E1720279217B62F3000102 -:105BF00021730279520862F34101217302799208FC -:105C000062F3820121730079C00860F3C30121733C -:105C100099F80000232859D9262168E0A86FA4E745 -:105C200041F00101A9E70279E17A62F30001E17232 -:105C30000279520862F34101E1720279920862F33B -:105C40008201E1720279D20862F3C301E172427902 -:105C5000217B62F3000121734279520862F3410112 -:105C600021734279920862F3820121734079CBE774 -:105C700018271026D4B3A088FDF73CFA8346807F0E -:105C800000F00300012807D00021A0880AF0E6FEFA -:105C90005FEA000903D101E00121F6E7FFDFE868D0 -:105CA000A06099F8000040F0040189F8001099F80C -:105CB0000100800708D5012020739BF800002328ED -:105CC0006BD9272158464FE084F80CA065E01527D2 -:105CD0000F265CB1A088FDF70DFA814606225946D1 -:105CE000E86808F01FFA0120A0739BE03FE04846F7 -:105CF0003AE016270926D4B3287B20724DE0287B92 -:105D000019270E269CB3C4F808A0A4F80CA00128FB -:105D100007D0022805D0032805D0042803D0FFDFD0 -:105D20000DE0207207E0697B042801F00F0141F0CB -:105D3000800121721CD0607A20F003006072A0887C -:105D4000FDF7D8F905460078212826D0232800D071 -:105D5000FFDFA87F00F00300012811D00021A088F8 -:105D60000AF08EFE22212846FDF7FCF915E004E03A -:105D7000607A20F00300401CE0E7A8F8006011E022 -:105D80000121ECE70CB16888A080287A03282BD089 -:105D900004280AD005284BD0FFDFA8F800600CB11A -:105DA000278066800020BDE8F09F15270F26002C75 -:105DB000E3D0A088FDF79EF9807F00F00300012862 -:105DC00006D00021A0880AF049FE050003D101E0B9 -:105DD0000121F7E7FFDFD5F821000622594608F038 -:105DE000A1F984F80EA0D8E717270926002CC4D003 -:105DF000A088FDF77FF98146807F00F0030001282D -:105E000006D00021A0880AF029FE050003D101E098 -:105E10000121F7E7FFDF6878800701D5022000E065 -:105E20000120207299F800002328B6D927215EE7C7 -:105E300019270E26002CA0D0A088FDF75BF95FEA99 -:105E4000000900D1FFDFC4F808A0A4F80CA084F872 -:105E500008A0A07A40F00300A07299F81F1061F327 -:105E60008200A07299F81F10C1F34002114205D0C0 -:105E700099F8201001F01F0110292CD020F0080003 -:105E8000A07299F81F004108607A61F3C300607244 -:105E9000697A01F003010129A5D140F00400607284 -:105EA00099F81E00E97A00F00300012816D0607B03 -:105EB00061F300006073AA7A217B62F30001217311 -:105EC000EA7A520862F341006073A87A400860F3EE -:105ED0004101217361E740F00800D1E7207B61F3C5 -:105EE00000002073AA7A617B62F300016173EA7A91 -:105EF000520862F341002073A87A400860F3410120 -:105F000061734AE710B5FE4C30B10146102204F12E -:105F100020001BF0F1FD012084F8300010BD10B509 -:105F20000446FFF724F8F64920461022BDE8104049 -:105F300020311BF0E1BD70B5F14D06004FF00004BB -:105F400012D00EF08DF908B110240BE00621304676 -:105F500008F0CFF8411C04D02866012085F85C00C9 -:105F600000E00724204670BD0020F7E7007810F01D -:105F70000F0204D0012A05D0022A0CD110E000093A -:105F800009D10AE00009012807D0022805D003281A -:105F900003D0042801D00720704708700020704704 -:105FA0000620704705282AD2DFE800F003070F1704 -:105FB0001F00087820F0FF001EE0087820F00F0096 -:105FC000401C20F0F000103016E0087820F00F00A0 -:105FD000401C20F0F00020300EE0087820F00F0088 -:105FE000401C20F0F000303006E0087820F00F0070 -:105FF000401C20F0F000403008700020704707205F -:1060000070472DE9F041804688B00D4600270846CC -:106010000EF073F9A8B94046FDF76CF8040003D000 -:106020002078222815D104E043F2020008B0BDE830 -:10603000F08145B9A07F010603D500F003000228D6 -:1060400001D01020F2E7A07FC10601D4010702D5DC -:106050000DB10820EAE7E17FC90601D50D20E5E78B -:1060600000F00300022805D125B12846FEF7F2FE14 -:106070000700DBD1A07F00F00300012806D000213B -:1060800040460AF0EBFC060002D00DE00121F7E7E4 -:10609000A07F00F0030001280CD000210022404620 -:1060A0000AF0D3FC060007D0A07F00F0030002280E -:1060B00004D009E00121F1E70420B7E725B12A4621 -:1060C00031462046FEF7EAFE07AB1A4669463046DF -:1060D000FFF700F8009800B9FFDF00990C20487026 -:1060E00006F59A70C1F82480486100200881A07FDD -:1060F00000F00300012828D0EDB302200871301D04 -:1061000088613078400908777078C0F3400048779C -:10611000287800F00102887F62F301008877E27F2F -:1061200062F382008877E27F520862F3C3008877C7 -:10613000727862F304108877A878C87701F1210299 -:1061400028462031FEF7CAFE22E001200871287897 -:1061500000F00102087E62F3010008762A785208F6 -:1061600062F3820008762A78920862F3C300087608 -:106170002A78D20800E007E062F3041008762421B0 -:106180002046FCF7EFFF0BE003200871052008769E -:1061900025212046FCF7E6FFA07F20F08000A077B5 -:1061A00001A900980CF016F8022801D000B1FFDF19 -:1061B00038463BE72DE9FF4F524A0D4699B09A46C3 -:1061C00007CA14AB002783E807001998FCF792FF71 -:1061D000060006D03078262806D008201DB0BDE87D -:1061E000F08F43F20200F9E7B07F00F00309B9F144 -:1061F000010F03D0B9F1020F07D008E03DB91B9899 -:10620000FEF728FE0028E9D101E01B9880BBB07F93 -:1062100000F00300012806D0002119980AF01EFCA6 -:10622000040003D101E00121F7E7FFDF852D28D02D -:1062300007DCF5B1812D1ED0822D1ED0832D08D113 -:106240001DE0862D1FD0882D1FD0892D1FD08A2DAF -:106250001FD00F2020710F281DD003F0A6F8E0B149 -:1062600001208DF83400201D0E902079B8B160E136 -:1062700011E00020EEE70120ECE70220EAE703202E -:10628000E8E70520E6E70620E4E70820E2E7092042 -:10629000E0E70A20DEE70720A0E711209EE7B9F13A -:1062A000010F17D0D4E91E50804602200190012032 -:1062B0000090A87898F80210C0F3C000C1F3C001A4 -:1062C00008405FEA000B63D050460DF0C9FF00287C -:1062D00072D133E0D4E91E850120019002200090A4 -:1062E000214630461B9AFEF7D9FD1B98007800F036 -:1062F0000101A87861F30100A870F17F04E00000BB -:10630000180200202420020061F38200A870F17FAF -:10631000490861F3C300A870617861F30410A870A4 -:106320002078400928706078C0F3400068701B989E -:106330008078E870002068712871BAE7DAF80C00FC -:106340000DF08EFFC0BBDAF81C000DF089FF98BB82 -:10635000DAF80C00A060DAF81C00E06098F80100A0 -:10636000617800F0010041EA4000607098F8021086 -:10637000C0B2C1F30011891E08406070002084F88B -:106380002000009906F1170002290BD001210AE034 -:1063900098F80110607801F00101FD2242EA410104 -:1063A0000840E2E7002104EB810188610199701C3B -:1063B000022902D0012101E028E0002104EB810143 -:1063C0008861A87800F00300012849D198F80200FC -:1063D00000F00300012843D1B9F1010F04D12A1DB7 -:1063E000691D1B98FEF77AFD287998F8041008407B -:1063F0008DF82C00697998F8052011408DF830103F -:1064000008432DD050460DF02BFF08B11020E5E6D3 -:106410000AF1100004F5DE7104F190020490B9F164 -:10642000020F3CD00090CDE9012100210BAB5A4670 -:106430002046FEF7B0FD0028E9D104F5E07104F133 -:10644000A802B9F1010F30D004980090CDE90121E4 -:1064500000210CAB5A462046FEF79DFD0028D6D100 -:106460006078800740D4A87898F80210C0F38000C4 -:10647000C1F38001084337D0297898F8000014AAA6 -:10648000B9F1010F17D032F810204B00DA4012F0AA -:10649000030718D0012F1ED0022F12D11DE0CDF816 -:1064A00000A0CDE901210121C0E7CDF800A0CDE990 -:1064B00001210121CDE732F811204300DA4002F03A -:1064C0000307032F07D0BBF1000F0DD0012906D021 -:1064D000042904D008E00227F5E70127F3E70128A3 -:1064E00001D0042800D10427F07F40F001006BF3B5 -:1064F0004100F077607881074FF003000CD5A07160 -:10650000BBF1000F15D100BF8DF85C0017AA314612 -:10651000199800F0C5FA0CE00221022F18D0012FC3 -:1065200018D0042F22D00020A071F07F20F00100AD -:10653000F07725213046FCF715FE0DA904F59A7079 -:106540000BF02DFE10B1022800D0FFDF002045E641 -:10655000A171D9E7A1710D2104F124001BF065FBA5 -:10656000207840F0020020700420CDE70120A071C7 -:10657000DFE72DE9F04387B09046894604460025C1 -:10658000FCF7B8FD060006D03078272806D0082092 -:1065900007B0BDE8F08343F20200F9E7B07F00F0F6 -:1065A0000300012806D0002120460AF057FA040013 -:1065B00003D101E00121F7E7FFDFA7795FEA0900D6 -:1065C00005D0012821D0B9F1020F26D110E0B8F191 -:1065D000000F22D1012F05D0022F05D0032F05D0A7 -:1065E000FFDF2DE00C252BE0012529E0022527E027 -:1065F00040460DF035FEB0B9032F0ED110224146B2 -:1066000004F121001BF078FA1AE0012F02D0022FCA -:1066100003D104E0B8F1000F12D00720B8E74046DC -:106620000DF01EFE08B11020B2E7102104F1210088 -:106630001BF0D9FA0621404607F05BFDC4F82100A3 -:106640002078252140F0020020703046FCF78AFDBA -:106650002078C10714D020F00100207002208DF8AE -:10666000000004F1210002908DF80450694604F501 -:106670009A700BF094FD022804D018B1FFDF01E0FE -:1066800084F82050002083E730B587B00D460446DB -:10669000FCF730FD88B1807F00F0030001280FD0A7 -:1066A000002120460AF0DAF904000ED028460DF049 -:1066B000D7FD38B1102007B030BD43F20200FAE731 -:1066C0000121EEE72078400701D40820F3E72946AE -:1066D00004F14100202205461BF00EFA207840F01C -:1066E0001000207001070FD520F008002070132043 -:1066F0008DF80000694604F59A7001950BF04FFD86 -:10670000022801D000B1FFDF0020D4E770B50D46AC -:106710000646FCF7EFFC18B1017827291FD102E0EB -:1067200043F2020070BD807F00F00300012806D014 -:10673000002130460AF092F9040003D101E0012162 -:10674000F7E7FFDFA079022809D16078C00706D0FB -:106750002A4621463046FEF7F0FC10B10FE0082033 -:1067600070BDB4F864000E280BD204F16601022358 -:106770001022081F09F0DFFF012101704570002081 -:1067800070BD112070BD70B5064686B014460D462A -:1067900008460DF065FD18B920460DF087FD10B1D3 -:1067A000102006B070BDA6F57F40FF380ED03046F1 -:1067B000FCF7A0FC38B1417822464B08811C1846F2 -:1067C000FCF723FE07E043F20200EAE72046FDF76C -:1067D00099FC0028E5D11021E01D0DF012FAE21D10 -:1067E00029466846FEF791FC102204F11700019932 -:1067F0001BF082F90020D4E72DE9F041044686B071 -:1068000015468846002708460DF077FD18B928463A -:106810000DF073FD10B1102006B008E42046FCF71F -:1068200069FC060003D03078272818D102E043F233 -:106830000200F1E7B07F00F00300012806D000213C -:1068400020460AF00BF9040003D101E00121F7E72B -:10685000FFDF2078400702D56078800701D4082048 -:10686000DAE7B07F00F00300012818D0D4E91E0158 -:10687000407800B1B5B1487810B1B8F1000F11D02F -:10688000C5B1EA1D6846E168FEF73FFC102205F13C -:10689000170001991BF004F930B104270AE0D4E98C -:1068A0001E10E5E70720B7E71022E91D04F13100CB -:1068B0001BF022F9B8F1000F06D0102208F10701F1 -:1068C00004F121001BF018F92078252140F0020086 -:1068D00020703046FCF746FC2078C10716D020F027 -:1068E0000100207002208DF8000004F121000290C8 -:1068F000103003908DF80470694604F59A700BF01F -:106900004EFC022804D018B1FFDF01E084F82070AB -:10691000002081E7F8B515460E460746FCF7EAFB6E -:10692000040004D02078222804D00820F8BD43F2C7 -:106930000200F8BDA07F00F00300022802D043F25D -:106940000400F8BD30460DF08BFC18B928460DF058 -:1069500087FC08B11020F8BD00953288B31C214691 -:106960003846FEF70EFC112814D00028F3D1297CFC -:106970004A08E17F62F30001E1772A7C62F341017A -:10698000E177297C890884F82010A17F21F080011B -:10699000A177F8BDA17F0907FBD4D6F80200C4F89F -:1069A0003600D6F80600C4F83A003088A0861022D7 -:1069B000294604F124001BF09FF8287C4108E07F61 -:1069C00061F38200E077297C61F3C300E077287CE3 -:1069D000800884F82100A07F40F00800A077002004 -:1069E000D3E770B596B00D46064613B1072016B032 -:1069F00070BDFCF77FFB040007D02078222802D36B -:106A0000A07F400604D40820F1E743F20200EEE73D -:106A1000C5B12D208DF80000ADF802601022294686 -:106A200001A81BF069F8287C4108E07F61F30000B1 -:106A3000E077297C61F34100E077287C800884F8C6 -:106A4000200004E02E208DF80000ADF802600BA9B4 -:106A5000684607F0FFFAA17F21F04001A177C6E761 -:106A600070B50D46FCF746FB040005D028460DF036 -:106A70001DFC20B1102070BD43F2020070BD2946FC -:106A80002046FEF7F8FA002070BD04E010F8012B54 -:106A90000AB100207047491E89B2F7D20120704721 -:106AA00070B51546064602F080FC040000D1FFDFF9 -:106AB000207820F00F00801C20F0F00020302070A3 -:106AC00066802868A060BDE8704002F071BC0000DC -:106AD00018B18178012938D101E010207047018870 -:106AE00042F60112881A914231D018DC42F60102B6 -:106AF000A1EB020091422AD00CDC41B3B1F5C05F9A -:106B000025D06FF4C050081821D0A0F57060FF3870 -:106B10001BD11CE001281AD002280AD117E0B0F5D9 -:106B2000807F14D008DC012811D002280FD0032860 -:106B30000DD0FF2809D10AE0B0F5817F07D0A0F57C -:106B40008070033803D0012801D0002070470F2047 -:106B500070470B2826D008DC1BD2DFE800F01C2091 -:106B600025251A25292325271E0011281CD008DCDD -:106B70000C2817D00D281DD00F2815D0102808D1AB -:106B800010E0822809D0842810D0852810D08728CA -:106B900012D003207047002070470520704743F251 -:106BA00003007047072070470F207047042070478C -:106BB000062070470C20704743F20200704738B53A -:106BC0000C46050041D06946FFF7D0F9002819D1DD -:106BD0009DF80010607861F3020060706946681CDF -:106BE000FFF7C4F900280DD19DF80010607861F31B -:106BF000C5006070A978C1F34101012903D00229C1 -:106C000005D0072038BD217821F0200102E021784D -:106C100041F020012170410704D0A978C90861F32F -:106C200086106070607810F0380F07D0A9780909D5 -:106C300061F3C710607010F0380F02D16078400621 -:106C400003D5207840F040002070002038BD70B59A -:106C500004460020088015466068FFF7B0FF002852 -:106C600016D12089A189884211D860688078C00730 -:106C70000AD0B1F5007F0AD840F20120B1FBF0F252 -:106C800000FB1210288007E0B1F5FF7F01D90C202E -:106C900070BD01F201212980002070BD10B504787B -:106CA000137864F3000313700478640864F34103F9 -:106CB00013700478A40864F3820313700478E40862 -:106CC00064F3C30313700478240964F3041313708A -:106CD0000478640964F3451313700078800960F345 -:106CE0008613137031B10878C10701D1800701D52F -:106CF000012000E0002060F3C713137010BD42783C -:106D0000530702D002F0070306E012F0380F02D05A -:106D1000C2F3C20300E001234A7863F302024A701F -:106D2000407810F0380F02D0C0F3C20005E04307EE -:106D300002D000F0070000E0012060F3C5024A70B5 -:106D400070472DE9F04F95B00D00804615D0B8F191 -:106D5000000F16D0122128461AF045FF4FF6FF7B90 -:106D600005AA0121584606F0C0FF002426463746F2 -:106D70004FF420596FF4205A75E0102015B0BDE88B -:106D8000F08F0720FAE700BF9DF81E0001280AD106 -:106D9000BDF81C0048450BD010EB0A000AD00128B2 -:106DA0000CD002280CD0042C0ED0052C0FD10DE0F5 -:106DB000012400E00224BDF81A6008E0032406E084 -:106DC0000424BDF81A7002E0052400E00624BDF892 -:106DD0001A10414547D12C74BEB34FF0000810AAD9 -:106DE0004FF0070ACDE90282CDE900A80DF13C0978 -:106DF0001023CDF8109042463146584607F028F847 -:106E000008BBBDF83C002A46C0B210A90BF084FABA -:106E1000C8B9AE81CFB1CDE900A80DF1080C0AAE1A -:106E200040468CE84102132300223946584607F0B9 -:106E30000FF840B9BDF83C00F11CC01EC0B22A1DBD -:106E40000BF06AFA10B1032098E70AE0BDF82900B8 -:106E5000E881062C05D19DF81E00A872BDF81C0023 -:106E6000288100208AE705A806F04BFF00288BD078 -:106E7000FFF76FFE82E72DE9F0471C46DDE9097850 -:106E8000DDF8209015460E00824600D1FFDF0CB1E0 -:106E9000208818B1D5B11120BDE8F087022D01D0AE -:106EA000012100E0002106F1140005F003FEA8F81E -:106EB000000002463B462946504603F0B8F8C9F8A0 -:106EC000000008B9A41C3C600020E5E71320E3E7BC -:106ED000F0B41446DDE904528DB1002314B1022C44 -:106EE00009D101E0012306E00D7CEE0703D025F077 -:106EF000010501230D742146F0BC03F02EBF1A805A -:106F0000F0BC70472DE9FE4F91461A881C468A4610 -:106F10008046FAB102AB494603F089F8050019D062 -:106F20004046A61C278809F0B5FE324607262946AA -:106F30003B46009609F074FA20882346CDE90050BC -:106F40004A4651464046FFF7C3FF002020800120FB -:106F5000BDE8FE8F0020FBE72DE9F04786B09146A3 -:106F6000DDE90E460F46824603AA05A904A8109D36 -:106F70008DE807009846324621465046FFF77BFFD2 -:106F8000049909B1012200E000222A70002817D1DB -:106F9000F84A03AB1060059A009104F11400CDE9A2 -:106FA00001204A463946504606F048F990B1082873 -:106FB0000ED2DFE800F00407040D0D090B0B0020D2 -:106FC00006B069E71120FBE70720F9E70820F7E79B -:106FD0000320F5E7BDF80C100498CDE90001434605 -:106FE000324621465046FFF773FFE8E72DE9F043AC -:106FF00089B00D46DDE9108781461C4616461421EE -:1070000003A81AF012FE012002218DF810108DF84D -:107010000C008DF81170ADF8146064B1A278D2073D -:1070200009D08DF81600E088ADF81A00A088ADF8F8 -:107030001800A068079008A80095CDE90110424605 -:1070400003A948466B68FFF787FF09B0BDE8F083E6 -:10705000F0B58BB0002406460694079407270894E1 -:1070600005A80994019400970294CDE903400D46C8 -:1070700010232246304606F0EBFE78B90AA806A98E -:10708000019400970294CDE90310BDF8143000225A -:107090002946304606F0B2FC002801D0FFF759FD22 -:1070A0000BB0F0BD06F052BB2DE9FC410C4680460A -:1070B000002602F07AF9054620780D287ED2DFE816 -:1070C00000F0BC0713B325BD49496383AF959B000E -:1070D000A848006820B1417841F010014170ADE04E -:1070E000404602F092F9A9E00421404609F0B6FCBE -:1070F000070000D1FFDF07F11401404605F06EFCE8 -:10710000A5BB13214046FDF787FB97E004214046CD -:1071100009F0A4FC070000D1FFDFE088ADF8000013 -:107120000020B8819DF80000010704D5C00602D5F3 -:10713000A088B88105E09DF8010040067ED5A088B2 -:10714000F88105B9FFDF22462946404601F068FC78 -:10715000022673E0E188ADF800109DF801100906E1 -:107160000FD5072803D006280AD00AE024E004211E -:10717000404609F073FC060000D1FFDFA088F081D3 -:107180000226CDB9FFDF17E00421404609F066FC76 -:10719000070000D1FFDF07F1140006F00EFB90F0AE -:1071A000010F02D1E079000648D5387C022640F074 -:1071B0000200387405B9FFDF224600E03DE02946B1 -:1071C000404601F02DFC39E00421404609F046FC20 -:1071D000017C002D01F00206C1F340016171017CC8 -:1071E00021F002010174E7D1FFDFE5E7022601216A -:1071F000404602F045F921E00421404609F02EFC0A -:107200000546606800902089ADF8040001226946B7 -:10721000404602F056F9287C20F0020028740DE068 -:10722000002DC9D1FFDFC7E7022600214046FBF74A -:10723000CDF8002DC0D1FFDFBEE7FFDF3046BDE84F -:10724000FC813EB50C0009D001466B4601AA002026 -:1072500006F080FE20B1FFF77CFC3EBD10203EBD55 -:1072600000202080A0709DF8050002A900F0070012 -:10727000FEF798FE50B99DF8080020709DF80500B3 -:1072800002A9C0F3C200FEF78DFE08B103203EBD87 -:107290009DF8080060709DF80500C109A07861F3B1 -:1072A0000410A0709DF80510890961F3C300A07057 -:1072B0009DF80410890601D5022100E0012161F347 -:1072C00042009DF8001061F30000A07000203EBD58 -:1072D00070B5144606460D4651EA040005D075B156 -:1072E00008460DF001F878B901E0072070BD294685 -:1072F000304606F090FE10B1BDE8704029E454B16C -:1073000020460CF0F1FF08B1102070BD2146304638 -:10731000BDE8704095E7002070BD2DE9FC5F0C468C -:1073200090460546002701780822007A3E46B2EBD7 -:10733000111F7DD104F10A0100910A31821E4FF024 -:10734000020A04F1080B0191092A72D2DFE802F067 -:10735000EDE005F528287BAACE006888042109F015 -:107360007DFB060000D1FFDFB08928B15227072638 -:10737000C3E000001403002051271026002C7DD00C -:107380006888A0800120A071A88900220099FFF7D9 -:107390009FFF002873D1A8892081288AE081D1E04D -:1073A000B5F81290072824D1E87B000621D5512793 -:1073B00009F1140086B2002CE1D0A88900220099BE -:1073C000FFF786FF00285AD16888A08084F806A0BD -:1073D000A88920810120A073288A2082A4F8129015 -:1073E000A88A009068884B46A969019A01F0F5FACD -:1073F000A8E0502709F1120086B2002C3ED0A889DF -:1074000000225946FFF764FF002838D16888A08021 -:10741000A889E080287A072813D002202073288AC0 -:10742000E081E87BC0096073A4F81090A88A01E0AD -:1074300085E082E0009068884B4604F11202A96959 -:10744000D4E70120EAE7B5F81290512709F11400BA -:1074500086B2002C66D06888042109F0FFFA8346C2 -:107460006888A080A88900220099FFF731FF0028D2 -:107470006ED184F806A0A889208101E052E067E07F -:107480000420A073288A2082A4F81290A88A009071 -:1074900068884B46A969019A01F09FFAA989ABF85F -:1074A0000E104FE06888FBF725FE07466888042128 -:1074B00009F0D4FA064607B9FFDF06B9FFDF687B9B -:1074C000C00702D05127142601E0502712264CB3E2 -:1074D0006888A080502F06D084F806A0287B5946E3 -:1074E00001F08BFA2EE0287BA11DF9E7FE49A8895F -:1074F0004989814205D1542706269CB16888A0801D -:1075000020E053270BE06888A080A889E08019E07C -:107510006888042109F0A2FA00B9FFDF5527082680 -:10752000002CF0D1A8F8006011E056270726002CA7 -:10753000F8D06888A080002013E0FFDF02E0012877 -:1075400008D0FFDFA8F800600CB12780668000201B -:10755000BDE8FC9F57270726002CE3D06888A08051 -:10756000687AA071EEE7401D20F0030009B14143A5 -:10757000091D01EB4000704713B5DB4A0020107174 -:10758000009848B10024684609F06BF8002C02D13D -:10759000D64A009911601CBD01240020F4E770B5A3 -:1075A0000D46064686B014465C2128461AF03DFB7F -:1075B00004B9FFDFA0786874A2782188284601F01A -:1075C00046FA0020A881E881228805F1140130469E -:1075D00005F0E9F96A460121304606F086FB19E01C -:1075E0009DF80300000715D5BDF806103046FFF7DB -:1075F0002FFD9DF80300BDF8061040F010008DF837 -:107600000300BDF80300ADF81400FF233046059ACF -:1076100006F0CCFC684606F074FB0028E0D006B00B -:1076200070BD10B50C4601F1140005F0F3F90146E8 -:10763000627C2046BDE8104001F03EBA70B50546B8 -:10764000042109F00BFA040000D1FFDF04F114015A -:107650000C46284605F0C2F921462846BDE8704090 -:1076600005F0C3B970B58AB00C460646FBF742FD7B -:10767000050014D02878222827D30CB1A08890B117 -:1076800001208DF80C0003208DF8100000208DF8EB -:10769000110054B1A088ADF81800206807E043F24B -:1076A00002000AB070BD0920FBE7ADF81800059094 -:1076B0000421304609F0D2F9040000D1FFDF04F1C3 -:1076C000140005F0BEF9C00601D40820E9E701F076 -:1076D0006CFE60B108A802210094CDE9011095F874 -:1076E000232003A930466368FFF736FCD9E7112051 -:1076F000D7E72DE9F04FB2F802A0834689B01546CE -:1077000089465046FBF7F6FC07460421504609F02F -:10771000A5F90026044605964FF002080696ADF836 -:107720001C6007B9FFDF04B9FFDF4146504603F094 -:107730007CFE60B907AA06A905A88DE807004246A5 -:10774000214650466368FFF796FB00B1FFDF6648AD -:1077500007AB0660DDE9051204F11400CDF80090D6 -:10776000CDE90320CDE9013197F823205946504651 -:107770006B6805F0AFF906000AD0022E04D0032E84 -:1077800014D0042E00D0FFDF09B03046BDE8F08FE2 -:10779000BDF81C000028F7D00599CDE9001042463D -:1077A000214650466368FFF793FBEDE7687840F0A9 -:1077B00008006870E8E72DE9F04F9BB004464FF0F1 -:1077C00000084948ADF85480ADF83080ADF85080DD -:1077D000A0F80880ADF81480ADF81880ADF82080CE -:1077E000ADF81C80007916460D464746012808D0A2 -:1077F000022806D0032804D0042802D008201BB099 -:10780000C4E720460CF02CFDD0BB28460CF028FD28 -:10781000B0BB60680CF071FD90BB606848B16089D6 -:107820002189884202D8B1F5007F01D90C20E6E712 -:1078300080460BAA06A92846FFF709FA0028DED1E0 -:1078400068688078C0F34100022808D19DF81900CB -:1078500010F0380F03D028690CF046FD80B905A957 -:107860002069FFF7ACF90028C9D1206950B16078D0 -:1078700080079DF8150000F0380002D5C0B301E084 -:1078800011E0A8BB9DF8140080060ED59DF81500E8 -:1078900010F0380F03D060680CF026FD18B960684E -:1078A0000CF02BFD08B11020A9E707A96069FFF7CC -:1078B00086F90028A3D1606940B19DF81D0000F051 -:1078C000070101293FD110F0380F3CD008A9A06969 -:1078D000FFF775F9002892D19DF81C00800632D47C -:1078E0009DF82000800604E014030020140000200E -:1078F00029E028D4A06940B19DF8210000F00701DB -:10790000012920D110F0380F1DD0E06818B100789F -:10791000C8B11C2817D20EAA611C2046FFF7BEF979 -:107920000120B94660F30F27BA4607468DF84E008E -:1079300042F60300ADF84C000DF13B0217A9286890 -:107940000AF009FD08B1072059E79DF85C0016A967 -:10795000CDF80090C01CCDE9019100F0FF0B002391 -:107960000BF20122514613A806F002F9F0BBBDF854 -:1079700058000990FE482A8929690092CDE9011032 -:107980006B89BDF82C202868069906F0F1F80100F3 -:107990007ED120784FF0020AC10601D480062BD593 -:1079A000ADF80C90606950B907A906A8FFF7A7F9D0 -:1079B0009DF81D0020F00700401C8DF81D009DF86B -:1079C0001C008DF84E7040F0C8008DF81C0042F687 -:1079D0000210ADF84C000CA903AACDF800A0CDE927 -:1079E0000121002340F2032213A800E01EE00799C2 -:1079F00006F0BEF801004BD1DD484D4608385B4625 -:107A00000089ADF839000EA8CDE90290CDF80490B8 -:107A1000CDF810904FF007090022CDF80090BDF886 -:107A200058104FF6FF7005F0E9FF10B1FFF791F81D -:107A3000E5E69DF83800000625D52946012060F3CB -:107A40000F218DF84E704FF42450ADF84C00ADF876 -:107A5000105062789DF81000002362F300008DF84A -:107A600010006278CDF800A0520862F341008DF852 -:107A7000100004AACDE9012540F2032213A806F064 -:107A800077F8010004D1606888B32069A8B900E0E4 -:107A900086E005A906A8FFF732F96078800706D4CA -:107AA0009DF8150020F038008DF8150005E09DF8D0 -:107AB000140040F040008DF814008DF84E7042F62E -:107AC0000110ADF84C00208940F20121B0FBF1F229 -:107AD00001FB1202606814ABCDF80080CDE9010310 -:107AE000002313A8059906F043F8010058D1207827 -:107AF000C00729D0ADF80C50A06950B908A906A854 -:107B0000FFF7FDF89DF8210020F00700401C8DF8DC -:107B100021009DF820008DF84E7040F040008DF857 -:107B2000200042F60310ADF84C0015A903AACDF8C9 -:107B300000A0CDE90121002340F2032213A80899F7 -:107B400006F016F801002BD1E06868B32946012041 -:107B500060F30F218DF84E7042F60410ADF84C0022 -:107B6000E068002302788DF8602040788DF861008D -:107B7000E06818AA4088ADF86200E06800798DF8E6 -:107B80006400E068C088ADF86500CDF80090CDE9EC -:107B900001254FF4027213A805F0EAFF010003D09B -:107BA000099800F0B5FF2AE67148032108380171F1 -:107BB00056B100893080BDF850007080BDF83000AB -:107BC000B080BDF85400F080002018E670B50125A3 -:107BD0008AB016460B46012802D0022816D104E0CE -:107BE0008DF80E504FF4205003E08DF80E5042F601 -:107BF0000100ADF80C005BB10024601C60F30F24A1 -:107C000004AA08A918460AF0A6FB18B1072048E5FF -:107C1000102046E504A99DF820205548CDE9002113 -:107C2000801E02900023214603A802F2012205F0E3 -:107C30009FFF10B1FEF78DFF33E54D4808380EB1B8 -:107C4000C1883180057100202BE5F0B593B007465F -:107C500001268DF83E6041F60100ADF83C0012AA05 -:107C60000FA93046FFF7B2FF002848D1404C00254D -:107C7000083CE7B31C2102A819F0D7FF9DF80800C3 -:107C80008DF83E6040F020008DF8080042F6052097 -:107C9000ADF83C000E959DF83A00119520F00600D5 -:107CA000801C8DF83A009DF838006A4620F0FF00ED -:107CB0008DF838009DF8390009A920F0FF008DF8F3 -:107CC00039000420ADF82C00ADF830000EA80A9061 -:107CD00011A80D900FA80990ADF82E5002A8FFF73B -:107CE0006AFD00280BD1BDF80000608100E008E0CB -:107CF000BDF80400A081401CE0812571002013B074 -:107D0000F0BD6581A581BDF84800F4E72DE9F74F86 -:107D10001749A0B00024083917940A79A146012A0E -:107D200004D0022A02D0082023B02FE5CA8882425C -:107D300001D00620F8E721988A46824201D1072027 -:107D4000F2E701202146ADF848004FF6FF7860F3D6 -:107D50000F21ADF84A808DF86E0042F6020B0691B5 -:107D60008DF87240ADF86CB0ADF870401CA901E020 -:107D70001C0300201391ADF8508012A805F0E5FF18 -:107D800000252E462F460DAB072212A9404605F0CE -:107D9000DFFF78B182285DD195B38EB3ADF8645022 -:107DA000ADF866609DF85E008DF8144019AC0128AE -:107DB00064D06BE09DF83A001FB3012859D1BDF89B -:107DC000381059451FD118A809A901940294CDE98A -:107DD000031007200090BDF8361010230022404603 -:107DE00006F036F8B0BBBDF86000042801D00628C4 -:107DF0004AD1BDF82410219881423AD10F2093E74F -:107E00003AE0012835D1BDF83800B0F5205F03D045 -:107E100042F6010188422CD1BAF80600BDF83610AE -:107E2000884201D1012700E0002705B19EB12198C9 -:107E300081421ED118A809AA01940294CDE9032019 -:107E4000072000900D4610230022404606F000F85F -:107E500000B902E02DE04E460BE0BDF860000228BC -:107E600001D0102810D1C0B217AA09A90AF054FAFB -:107E700050B9BDF8369086E7052055E705A917A843 -:107E8000221D0AF068FA08B103204DE79DF814009E -:107E90000023001DC2B28DF8142022980092CDE973 -:107EA00001401BA8069905F063FE10B902228AF86A -:107EB0000420FEF74EFE37E710B50B46401E88B093 -:107EC00084B205AA00211846FEF7E8FE00200DF155 -:107ED000080C06AA05A901908CE80700072000906D -:107EE0000123002221464FF6FF7005F087FD04466E -:107EF000BDF81800012800D0FFDF2046FEF729FE5C -:107F000008B010BDF0B5F94F044687B038790E4679 -:107F1000032804D0042802D0082007B0F0BD04AA2A -:107F200003A92046FEF793FE0500F6D1606880782D -:107F3000C0F3410002280AD19DF80D0010F0380F5F -:107F400005D020690CF0D0F908B11020E5E72089B0 -:107F500005AA21698DE807006389BDF81020206813 -:107F6000039905F005FE10B1FEF7F3FDD5E716B154 -:107F7000BDF814003080042038712846CDE7F8B5EC -:107F80000C0006460BD001464FF6FF7500236A46EB -:107F9000284605F0DFFF20B1FEF7DBFDF8BD10201D -:107FA000F8BD69462046FEF70AFE0028F8D1A07801 -:107FB000314600F001032846009A05F0F7FFEBE791 -:107FC00030B587B0144600220DF1080C05AD0192C2 -:107FD0008CE82C00072200920A46014623884FF6BF -:107FE000FF7005F00BFDBDF814102180FEF7B1FD08 -:107FF00007B030BD70B50D46042108F02FFD040018 -:1080000000D1FFDF294604F11400BDE8704004F000 -:1080100011BD70B50D46042108F020FD040000D10B -:10802000FFDF294604F11400BDE8704004F025BDCF -:1080300070B50D46042108F011FD040000D1FFDFEA -:10804000294604F11400BDE8704004F03DBD70B550 -:108050000546042108F002FD040000D1FFDF21469F -:1080600028462368BDE870400122FEF74BBF70B57B -:108070000646042108F0F2FC040000D1FFDF04F101 -:10808000140004F0C7FC401D20F0030511E0011DA1 -:1080900000880022431821463046FEF733FF0028AF -:1080A0000BD0607CABB2684382B2A068011D08F0BF -:1080B00078FBA06841880029E9D170BD70B50546FC -:1080C000042108F0CBFC040000D1FFDF2146284644 -:1080D0006368BDE870400222FEF714BF70B50E461B -:1080E000054601F062F9040000D1FFDF0120207293 -:1080F00066726580207820F00F00001D20F0F000EF -:1081000040302070BDE8704001F052B910B504460F -:10811000012900D0FFDF2046BDE810400121FAF719 -:1081200055B92DE9F04F97B04FF0000A0C00834687 -:10813000ADF818A0D04619D0E06830B1A068A8B159 -:108140000188ADF81810A0F800A05846FAF7D2FF41 -:10815000070043F2020967D03878222862D304214D -:10816000584608F07BFC050005D103E0102017B04D -:10817000BDE8F08FFFDF05F1140004F04BFC401D5B -:1081800020F00306A078012803D0022801D00720A0 -:10819000EDE7208878B1401C81B209AA584605F065 -:1081A000A4FD09A805F0ADFD9DF82E204FF4505117 -:1081B000012A0DD102E043F20300D8E7BDF82C20DC -:1081C000A2F52453023B03D1822801D0A0B901E0DB -:1081D0000846CCE7E068B0B1CDE902A0072006AAC6 -:1081E000CDF804A000900492A2882188BDF8183030 -:1081F000584605F003FC10B1FEF7ABFCB7E7A168E9 -:10820000BDF8180008809DF82700C00602D543F28B -:108210000140ACE70D9838B1A1780078012905D06C -:1082200080071AD40820A2E74846A0E7C007F9D083 -:1082300002208DF83C00A8684FF00009A0B1697CCD -:108240004288714391420FD98AB2B3B2011D08F03E -:108250005EFA8046A0F800A006E003208DF83C00FE -:10826000D5F800804FF001099DF8280010F0380F74 -:1082700000D1FFDF9DF828001D49C0F3C20008446B -:1082800097F8231010F8010C884201D90F206EE7EF -:108290002088ADF8400014A90095CDE9019143462E -:1082A00007220FA95846FEF757FE002885D19DF8F2 -:1082B000500050B9A078012807D1687CB3B2704350 -:1082C00082B2A868011D08F036FA00204FE770B5A9 -:1082D000064615460C460846FEF7FAFB002809D16B -:1082E0002A4621463046BDE870406FE41403002062 -:1082F0002E20020070BD09E570B51E4614460D0023 -:1083000009D044B1616831B138B1F849C9888142B6 -:1083100003D0072070BD102070BD2068FEF7D8FB89 -:108320000028F9D1324621462846BDE87040FFF7C3 -:1083300042BA70B515460C0006D038B1EB49098930 -:10834000814203D0072070BD102070BD2068FEF769 -:10835000BFFB0028F9D129462046BDE87040D1E591 -:1083600070B5064686B00D46144610460BF09EFFCB -:10837000D0BB60680BF0C1FFB0BBA6F57F40FF38F3 -:1083800003D03046FAF7B6FE80B128466946FEF7BC -:10839000D8FC00280CD19DF810100F2008293CD2E1 -:1083A000DFE801F008060606060A0A0843F20200A2 -:1083B00006B070BD0320FBE79DF80210012908D12B -:1083C000BDF80010B1F5C05FF2D06FF4C052D142D9 -:1083D000EED09DF8061001290DD1BDF80410A1F5CD -:1083E0002851062907D200E028E0DFE801F0030366 -:1083F00004030303DCE79DF80A1001290ED1BDF840 -:108400000810B1F5245FD3D0A1F524510239CFD0A3 -:108410000129CDD0022901D1CAE7FFDF606878B910 -:10842000002305AA2946304605F094FD10B1FEF759 -:1084300090FBBDE79DF81400800601D41020B7E73B -:108440006188224628466368FFF7BAFDB0E72DE948 -:10845000F043814687B08846144610460BF026FF4D -:1084600018B1102007B0BDE8F083002306AA4146EA -:10847000484605F06FFD10B1FEF76BFBF2E79DF883 -:108480001800C00602D543F20140EBE7002507279C -:1084900005A8019500970295CDE9035062884FF633 -:1084A000FF734146484605F0D3FC060013D16068CF -:1084B0000BF0FCFE60B960680195CDE902500097B1 -:1084C0000495238862884146484605F0C1FC06466B -:1084D000BDF8140020803046CEE739B1834B0A88BE -:1084E0009B899A4202D843F20300704719E610B5FF -:1084F00086B07E4C0423ADF81430638943B1A4895F -:108500008C4201D2914205D943F2030006B010BD5E -:108510000620FBE7ADF81010002100910191ADF8A5 -:10852000003002218DF8021005A9029104A90391DF -:10853000ADF812206946FFF7F4FDE7E72DE9FC47A7 -:1085400081460E4608460BF08BFE88BB4846FAF77C -:10855000D1FD5FEA00080AD098F80000222829D34C -:108560000421484608F07AFA070005D103E043F2F7 -:108570000200BDE8FC87FFDF07F1140004F061FA98 -:1085800005463078012803D0022804D00720F0E700 -:10859000A8070FD502E015F0340F0BD0B079341DC9 -:1085A000C00709D0E08838B1A0680BF059FE18B1B7 -:1085B0001020DEE70820DCE732782088002628B388 -:1085C000A0F201130721112B18D20CD2DFE803F01F -:1085D0000B090D0B1D0B121D100B0B1D1D1D1D0B73 -:1085E0001D00022A11D10846C3E7012AFBD00CE086 -:1085F000EA0600E0AA06002AF5DA06E0A0F5C07255 -:108600001F2A02D97D3A022AEDD8C6B200F0CDFE6B -:1086100050B198F82300CDE90006FA89234639467F -:108620004846FEF7E3FCA4E71120A2E72DE9F04F4E -:108630008BB01F4615460C4683460026FAF75AFDB6 -:1086400028B10078222805D208200BB090E543F22B -:108650000200FAE7B80801D00720F6E7032F00D19F -:1086600000274FF6FF79CCB1022D72D320460BF0D4 -:1086700044FE30B904EB0508A8F101000BF03DFE03 -:1086800008B11020E1E7AD1EAAB22146484605F028 -:108690005AFD38F8021C88425BD1ADB21349B807C5 -:1086A00002D58889401C00E001201FFA80F8F807F5 -:1086B00001D08F8900E04F4605AA4146584605F093 -:1086C00014FB4FF0070A4FF00009D4B3204608E02E -:1086D000408810283DD8361D304486B2AE4238D28C -:1086E000A01902884245F3D353E000001403002090 -:1086F0009DF8170002074CD594B304EB0608361D0D -:10870000B8F80230B6B2102B23D89A19AA4220D852 -:10871000B8F8002091421CD1C0061CD5CDE900A9B3 -:108720000DF1080C0AAAA11948468CE80700B8F810 -:1087300000100022584605F061F920B1FEF709FA51 -:1087400083E726E005E0B8F80200BDF8281088426B -:1087500001D00B2079E7B8F80200304486B207E078 -:10876000FFE7C00604D55846FEF772FC002889D101 -:108770009DF81700BDF81A1020F010008DF81700B2 -:10878000BDF81700ADF80000FF235846009A05F029 -:108790000DFC05A805F0B5FA18B9BDF81A10B942D4 -:1087A000A6D90421584608F059F9040000D1FFDF8A -:1087B000A2895AB1CDE900A94D4600232146584669 -:1087C000FEF714FC0028BBD1A5813EE700203CE762 -:1087D0002DE9FF4F8BB01E4617000D464FF00004E9 -:1087E00012D0B00802D007200FB0C1E4032E00D190 -:1087F00000265DB108460BF077FD28B93888691E60 -:1088000008440BF071FD08B11020EDE7C64AB0072F -:1088100001D5D18900E00121F0074FF6FF7802D0A1 -:10882000D089401E00E0404686B206AA0B9805F0AB -:108830005CFA4FF000094FF0070B0DF1140A38E015 -:108840009DF81B00000734D5CDF80490CDF800B09A -:10885000CDF80890CDE9039A434600220B9805F025 -:10886000F7FA60BB05B3BDF814103A882144281903 -:10887000091D8A4230D3BDF81E2020F8022BBDF816 -:10888000142020F8022BCDE900B9CDE90290CDF8F3 -:1088900010A0BDF81E10BDF8143000220B9805F092 -:1088A000D7FA08B103209FE7BDF814002044001D4B -:1088B00084B206A805F025FA20B1822806D0FEF77A -:1088C00048F991E7BDF81E10B142B9D934B17DB174 -:1088D0003888A11C884203D20C2085E7052083E755 -:1088E00022462946404605F02EFC01462819018003 -:1088F000A41C3C80002077E710B504460BF0D6FCA2 -:1089000008B1102010BD8848C0892080002010BD0B -:10891000F0B58BB00D460646142103A819F085F971 -:1089200001208DF80C008DF8100000208DF811004A -:10893000ADF814503046FAF7DDFB48B10078222834 -:1089400012D30421304608F089F8040005D103E071 -:1089500043F202000BB0F0BDFFDF04F11400074644 -:1089600004F06FF8400601D40820F3E7207C0221D0 -:1089700040F00100207409A80094CDE901100722FD -:1089800003A930466368FEF7E7FA20B1217C21F0A5 -:1089900001012174DEE729463046F9F708FD08A9F0 -:1089A000384604F03DF800B1FFDFBDF82040172C39 -:1089B00001D2172000E02046A84201D92C4602E04F -:1089C000172C00D2172421463046FFF722FB214600 -:1089D0003046F9F708FA0020BCE7F8B51C46154602 -:1089E0000E46069F08F044F92346FF1DBCB23146EF -:1089F0002A46009407F0DBFCF8BD70B50C4605462E -:108A00000E21204619F0EFF8002020802DB1012D15 -:108A100001D0FFDF70BD062000E00520A07170BD11 -:108A200010B548800878134620F00F00001D20F094 -:108A3000F00080300C4608701422194604F108003A -:108A400019F09FF800F0B4FC3748046010BD2DE920 -:108A5000F047DFF8D890491D064621F0030117467C -:108A60000C46D9F8000007F01AFE050000D1FFDF20 -:108A70004FF000083560A5F800802146D9F80000C5 -:108A800007F00DFE050000D1FFDF7560A5F800803E -:108A90007FB104FB07F1091D0BD0D9F8000007F0E6 -:108AA000FEFD040000D1FFDFB460C4F80080BDE823 -:108AB000F087C6F80880FAE72DE9F0411746491D0E -:108AC00021F00302194D064601681446286807F094 -:108AD00011FE22467168286807F00CFE3FB104FBC6 -:108AE00007F2121D03D0B168286807F003FE0420C6 -:108AF00007F05EFF0446042007F062FF201A0128F9 -:108B000004D12868BDE8F04107F0BEBDBDE8F081A2 -:108B100010B50C4605F0B5F800B1FFDF2046BDE802 -:108B20001040FEF716B800001403002014000020C7 -:108B300010B50C460246817B808819B1518981426B -:108B400000D908462080D18800F0C5FF032800D353 -:108B50000320C1B22088BDE8104000F0B1BF10B5BD -:108B60000C460246817B808819B11189814200D967 -:108B700008462080D18800F0AEFF022800D30220F2 -:108B8000C1B2208800F09CFF401CC0B210BD2DE98E -:108B9000F04F0C00F84999B08146D1E90201CDE9C6 -:108BA0000C0109F10300F54E20F003010091357E20 -:108BB00005F1010504D1E8B209F054FB00B1FFDF73 -:108BC00000984FF0000B00EB0510C01C20F00301D3 -:108BD00000915CB9707A327A81F800B01044C2B268 -:108BE000B08B80B204F0D5FE00B1FFDF0098F169D0 -:108BF000084400902146684600F02CFF0098C01CF5 -:108C000020F003000090737A327AB17A04B1002028 -:108C100007F016FE0099084400902146684600F0CF -:108C20006EFF00273D46B24696F801800CE02846CC -:108C300000F0F3FE064681788088F9F76EF97178C6 -:108C40006D1C00FB0177EDB24545F0D10098C01CCA -:108C500020F00300009004B100203946F9F768F9CC -:108C600000990027084400903D469AF801800CE0E6 -:108C7000284600F0D2FE0646C1788088FEF773FCD5 -:108C800071786D1C00FB0177EDB24545F0D100987D -:108C9000C01C20F00300009004B100203946FEF70C -:108CA0006BFC00994FF000080844009045469AF884 -:108CB00001700EE0284600F0B0FE0646807B30B121 -:108CC00006F1080001F0F9FE727800FB02886D1CC5 -:108CD000EDB2BD42EED10098C01C20F00300009020 -:108CE00004B10020414601F0ECFE00990844C01D8B -:108CF00020F007000090E4BBA24AA1491160111DB9 -:108D0000401E086001222C219F4807F062FCFAF700 -:108D10002EF99E484178806805F09CFB42208DF832 -:108D200004009A480C30C0788DF8060010B1012874 -:108D300004D005E001208DF8060001E08DF806B0B2 -:108D400001A806F0C5FE10B10EA805F042FC0021F6 -:108D50001E22084603F03CF8FBF778F987480CAA76 -:108D600000210C30F8F706FB00B1FFDF9AF819007C -:108D700000E015E0FEF769FF00B1FFDF7F484FF428 -:108D8000F671443018F051FF7C480421443080F8DB -:108D9000E91180F8EA11062180F8EB110321017135 -:108DA000009919B0A1EB0900BDE8F08F70B5734CC4 -:108DB00006464434207804EB4015E078083590B935 -:108DC000A01990F8E80100280ED0A0780F2800D351 -:108DD000FFDF2021284618F028FF687866F302009C -:108DE00068700120E070284670BD2DE9F04105460D -:108DF0000C4600270078052190463E46B1EB101F37 -:108E000000D0FFDF287A58B101280FD0FFDF00BF64 -:108E1000A8F800600CB1278066800020BDE8F081D2 -:108E20000127092674B16888A08008E0022714266B -:108E300044B16888A0802869E060A88A2082287BE5 -:108E40002072E5E7A8F80060E7E710B54F4C6068CE -:108E5000C11D21F00701814200D0FFDF47480121F9 -:108E60000022017042700172032343728172027307 -:108E7000052282821F22C282417345A202610A2218 -:108E8000027641764FF4B061C1616168416010BD06 -:108E900030B53E4C1568636810339D4202D2042001 -:108EA000136030BD354B5D785A6802EB05121070C7 -:108EB00051700320D080172090800120D0709070D6 -:108EC000002090735878401C5870606810306060C3 -:108ED000002030BD70B5064628480024457807E0DC -:108EE000204600F09AFD0178B14204D0641CE4B23F -:108EF000AC42F5D1002070BDF7B5064608780C46A7 -:108F000008B3FFF7E7FF0546202E08D0232E17D021 -:108F1000212E41D0222E3FD0242E2BD114E000F060 -:108F200087FD0DB1697800E00021401A81B2A07878 -:108F30000144FF291ED830B1A08802282CD219E0A4 -:108F40006088172828D215E0227A2AB36188172969 -:108F500010D3A08817280DD3A3795BB1E3794BB167 -:108F6000402A07D84FF6FB72914201D8904213D99C -:108F70000420FEBD0720FEBD342002003004002086 -:108F80000000002000060240600600201C000020B7 -:108F90006E5246357800000065B9207802AA01219A -:108FA000FFF776FF0028E6D12078FFF793FF050052 -:108FB00000D1FFDF203E052E18D2DFE806F0030BBC -:108FC0000E081100A0786870A088E8800FE0608823 -:108FD000A8800CE0A078A87009E0A078E87006E00E -:108FE00054F8020FA8606068E86000E0FFDF00202E -:108FF000C1E700B597B053218DF8001000780BA998 -:1090000000F001008DF80200684605F023F817B063 -:1090100000BD00B5017897B001F001018DF8021094 -:10902000417801F001018DF803100178C1F340018E -:109030008DF804104178C1F340018DF805100178D6 -:1090400089088DF80610417889088DF80710817815 -:109050008DF80810C1788DF8091000798DF80A0094 -:109060004D208DF800000BA9684604F0F3FFCEE711 -:109070002DE9F04FDFF8F883FE4C97B000271BE096 -:10908000012000F07FFD0120FFF790FE0546FA4821 -:1090900007F0C8FA686000B9FFDF686805F027F8D4 -:1090A000A0B12846FAF7CEFA284600F071FD18B9AB -:1090B000F148696807F0BFFA94F9E9010428DFDA9A -:1090C000022007F075FC06460025AAE0EA48696818 -:1090D00007F0B1FAF4E7B8F802104046491C89B22B -:1090E000A8F80210B14201D3002141800221B8F852 -:1090F000020007F0B3FC00286BD0B8F8020054213E -:109100008DF80010ADF802000BA9684604F0A2FF2C -:1091100000B1FFDF9DF8300010F0010F0FD0B8F85C -:10912000020007F0B7FD5FEA000900D1FFDF484603 -:1091300006F0A3FF18B1B8F8020002F065F9B8F81C -:10914000020007F095FD5FEA000900D1FFDF484605 -:1091500006F08CFFE8BB0321B8F8020007F07EFCA4 -:109160005FEA000B48D1FFDF46E000BFDBF81000EC -:1091700010B10078FF2849D0022000F003FD022042 -:10918000FFF714FE8246484607F0A2F8CAF804002A -:1091900000B9FFDFDAF8040007F07CF90021009045 -:1091A0000170B8F802105046AAF8021001F032FE21 -:1091B000484607F071F900B9FFDF504600F0E8FCBF -:1091C00018B99AF80100000704D50098CBF81000F0 -:1091D00012E024E0DBF8100038B10178491C11F0EE -:1091E000FF01017008D1FFDF06E00022114648466A -:1091F00000F011FC00B9FFDF94F9EA01022805DB59 -:10920000B8F8020001F0CAFD0028AFD194F9E901D5 -:10921000042804DB484607F0B5F900B101276D1CAE -:10922000EDB2B54204D294F9EA010228BFF653AF79 -:10923000002F7FF423AF17B00320BDE8F04F00F0FC -:10924000A1BC10B58A4CA0600868E060AFF2DF10E6 -:1092500002F031FD607010BD864800214438017075 -:109260008348017085494160704730B505464FF02D -:1092700080500C46D0F8A41097B0491C05D1D0F806 -:10928000A810C9430904090C08D050F8A01F01F028 -:10929000010129704168216080680EE02B208DF863 -:1092A00000000BA9684604F0D5FE00B1FFDF0120E5 -:1092B00028700C982060BDF83400A0802878002821 -:1092C00003D0607940F0C000607117B030BDF0B5D8 -:1092D0004FF080540746D4F8800097B00D462B26F7 -:1092E000401C0BD1D4F88400401C07D1D4F888006E -:1092F000401C03D1D4F88C00401C0BD0D4F8800063 -:109300003860D4F884007860D4F88800B860D4F865 -:109310008C0016E08DF82C6069460BA804F09AFECC -:1093200000B1FFDF01983860029878608DF82C60FA -:1093300069460BA804F08EFE00B1FFDF0198B8600B -:109340000298F860D4F89000401C0BD1D4F8940037 -:10935000401C07D1D4F89800401C03D1D4F89C00DD -:10936000401C08D054F8900F286060686860A068BE -:10937000A860E06816E08DF800600BA9684604F06C -:1093800069FE00B1FFDF0C9828600D9868608DF8C9 -:1093900000600BA9684604F05DFE00B1FFDF0C9889 -:1093A000A8600D98E86017B0F0BD32480079FDE480 -:1093B00070B5304CE07830B3207804EB4010407A40 -:1093C00000F00700204490F9E801002800DCFFDFEE -:1093D0002078002504EB4010407A00F007000119C6 -:1093E00091F8E801401E81F8E8012078401CC0B2E5 -:1093F00020700F2800D12570A078401CA0700AF0C2 -:109400001BFBE57070BDFFDF70BD3EB50546032157 -:1094100007F024FB0446284607F02AFC054604B959 -:10942000FFDF206918B10078FF2800D1FFDF01AA13 -:109430006946284600F0EFFA60B9FFDF0AE0002233 -:1094400002A9284600F0E7FA00B9FFDF9DF80800FE -:1094500000B1FFDF9DF80000411E8DF80010EED234 -:1094600020690199884201D1002020613EBD0000A1 -:109470001C000020740400206006002068130020F7 -:1094800070B50546A0F57F400C46FF3800D1FFDFE0 -:10949000012C01D0FFDF70BDFFF787FF040000D172 -:1094A000FFDF207820F00F00401D20F0F00050304A -:1094B000207065800020207201202073BDE870407C -:1094C00076E72DE9F04116460D460746FFF76DFF9A -:1094D000040000D1FFDF207820F00F00401D20F0B5 -:1094E000F0005030207067800120207228682061D1 -:1094F000A888A0822673BDE8F04159E730B599B03D -:10950000FFF7E8FC040000D1FFDF0CA92046FFF7BD -:109510000FFB05460BA92046FFF721FB0146522011 -:109520008DF80000BDF830008DF80250001DADF838 -:109530000400BDF82C008DF80310001DADF80600E6 -:10954000E088ADF808000DA9684604F083FD002806 -:1095500000D0FFDF19B030BD2DE9F047DFF80094EF -:109560000546002799F8000010B10820BDE8F087F3 -:1095700028460AF09BFE08B11020F7E7F94C207846 -:1095800008B9FFF762FC607A217A0844C6B200F09D -:109590004FFAB04207D2301AC1B22A460020FFF774 -:1095A00077FC0700E2D1D9F804004E46C01C20F039 -:1095B0000300C9F8040000F05EFB716800EB0108CD -:1095C00001214046FFF7E3FA0646296840448842F5 -:1095D00002D8B6F5803F15D328600020FFF77AFC4B -:1095E00005000DD005F11300D9F8041020F0030098 -:1095F0004E46884200D0FFDF6078401E6070756084 -:109600000420B3E700214046FFF7C1FA0446A64212 -:1096100000D0FFDF04EB0801C9F8041029604FF601 -:10962000FF71A9F80210012189F8001038469DE762 -:109630002DE9F0410446CA4817460D46007810B19E -:109640000820BDE8F08108460AF00AFE08B11020A3 -:10965000F7E7C44E307808B9FFF7F7FB601E1E2805 -:1096600007D8012C3FD12878FE283CD8307600203E -:10967000E7E7A4F120001F2805D8E0B23A462946C2 -:10968000BDE8F04138E4A4F140004FF000081F2885 -:1096900021D8402C02D0412C25D117E068782978B8 -:1096A0004418A97881421ED8FF2C08D808F0BEFFC4 -:1096B00007460AF07BF9381A801EA04201DA122010 -:1096C000BFE728883081A878B07224E02846BDE83A -:1096D000F04100F085BAA4F1A0001F2803D8A02C07 -:1096E00003D0A12C06D00720ABE7287800F00100BA -:1096F000707610E029680920F829A2D38A07A0D142 -:10970000727B02F00302012A04D1F28AD73293B2AB -:109710008B4296D8F161404693E72DE9F0478146A8 -:109720000E4608460AF0C2FD48B948460AF0DCFD7C -:1097300028B909F1030020F00301494501D01020A8 -:1097400014E788484FF0000A4430817869B14178C5 -:10975000804600EB41140834378832460021204609 -:1097600000F024FA050004D027E0A6F800A00520A8 -:10977000FCE6B9F1000F24D03088B84201D90C259D -:109780001FE0607800F00705284600F0FBF908EBC1 -:109790000507324697F8E8014946401C87F8E8017A -:1097A000204607F5F47700F001FA05463878401EA8 -:1097B0003870032000F0E6F92DB10C2D01D0A6F889 -:1097C00000A02846D2E66078654F00F00701012925 -:1097D00023D002290CD0032932D0FFDF98F80110E2 -:1097E0004046491CC9B288F801100F2933D034E033 -:1097F000616821B1000702D46088FFF706FE98F87F -:10980000EA014646012802D1787802F073FA96F907 -:10981000EA010428E2DBFFDFE0E7616811B15248AA -:1098200006F009FF98F8E9014646032802D1787846 -:1098300002F060FA96F9E9010428CFDBFFDFCDE7FB -:10984000C00602D56088FFF7E0FD98F9EB01062815 -:10985000C4DBFFDFC2E780F801A08178491E817078 -:10986000617801F0070101EB080090F8E811491C4C -:1098700080F8E811A5E770B50D4604460AF0F0FC43 -:1098800018B928460AF012FD08B1102070BD29460B -:109890002046BDE8704008F01CBD70B50446154672 -:1098A0000E4608460AF0DCFC18B928460AF0FEFC11 -:1098B00008B1102070BD022C03D0102C01D009205B -:1098C00070BD2A463146204608F026FD0028F7D014 -:1098D000052070BD70B514460D4606460AF0C0FC62 -:1098E00038B928460AF0E2FC18B920460AF0FCFC18 -:1098F00008B1102070BD22462946304608F02BFDE5 -:109900000028F7D0072070BD10B596B004460AF0C5 -:10991000CDFC10B1102016B010BD0F208DF8000046 -:109920000BA9684604F096FB0028F4D19DF834009A -:109930002070BDF836006080BDF83800A08000209F -:10994000E9E770B505460C4608460AF0CDFC20B99B -:1099500074B120680AF0AAFC40B1102070BD00006C -:109960001C0000203004002060060020A08828B1E0 -:1099700021462846BDE87040FDF774BE0920EDE79A -:1099800070B504460D4608460AF06AFC30B9601E00 -:109990001E2814D828460AF063FC08B11020DDE721 -:1099A000022C01D90720D9E704B9FFDFE64800EB14 -:1099B000840050F8041C2846BDE870400847A4F114 -:1099C00020001F28EED829462046BDE87040FAF74F -:1099D0007FBA70B504460D4608460AF067FC30B9F8 -:1099E000601E1E280DD828460AF03AFC08B1102047 -:1099F000B4E7012C01D0022C01D10620AEE70720EC -:109A0000ACE7A4F120001F28F9D829462046BDE87C -:109A10007040FAF7E1BA06F0E4BA30B5CB4D04462F -:109A20006878A04200D8FFDF686800EB041030BD02 -:109A300070B5C64800252C46467807E02046FFF75B -:109A4000ECFF4078641C2844C5B2E4B2B442F5D1BE -:109A5000284683E72DE9F0410C46064600F043F91D -:109A600007463068C01C20F0030232601CBBB748B8 -:109A70003B46092120300AF0CDFA002408E0092CE9 -:109A800011D2DFE804F005070509090B05050700F9 -:109A9000AF4804E0AF4802E0AF4800E0AF480AF04A -:109AA000D9FA054600E0FFDFA54200D0FFDF641CC5 -:109AB000E4B2092CE3D3306800EB07103060C0E556 -:109AC000021D5143452900D245210844C01CB0FB6A -:109AD000F2F0C0B2704700B597B055228DF8002063 -:109AE000001DADF80200ADF804100BA9684604F0A3 -:109AF000B1FA00B1FFDFBDF8300017B000BD2DE9AD -:109B0000FC5F064691484FF000088B4647464446A6 -:109B100090F8019022E02046FFF77FFF050000D17A -:109B2000FFDF687869463844C7B22846FFF700F877 -:109B3000824601A92846FFF712F80346BDF8040043 -:109B40005246001D81B2BDF80000001D80B206F033 -:109B5000DBFF6A78641C00FB0288E4B24C45DAD172 -:109B60003068C01C20F003003060BBF1000F00D053 -:109B700000204246394606F0D5FF3168084430607F -:109B8000BDE8FC9F7149443108710020C8707047DE -:109B90006E494431CA782AB10A7801EB4211083182 -:109BA000814201D001207047002070472DE9F0412B -:109BB00006460078154600F00F0400201080601E55 -:109BC0000F46052800D3FFDF5F482A46103000EB20 -:109BD0008400394650F8043C3046BDE8F04118474F -:109BE00038B50446407800F00300012803D002286D -:109BF0000BD0072038BD606858B10AF07EFBD0B9A1 -:109C000060680AF071FB20B915E060680AF028FB73 -:109C100088B969462046FCF7A9F90028EAD160789E -:109C200000F00300022808D19DF8000028B1606808 -:109C30000AF05AFB08B1102038BD6189F8290DD807 -:109C4000208988420AD8607800F003023F48012A40 -:109C500006D1D731C26989B28A4201D2092038BD02 -:109C600094E80E0000F10C0585E80E000AB9002109 -:109C70008182002038BD2DE9F05F4FF000093348A4 -:109C8000C8464F464E464D46CB464C4690F801A03E -:109C900011E02046FFF7C1FE4178827809F1010901 -:109CA000884412FB0177C27812FB0166807B10FBAF -:109CB0000155641CE4B25445EBD10BEB890000EB79 -:109CC000C80000EB870000EB860000EBC5011F48D1 -:109CD000027A01EBC201427A807A01EBC20101EB08 -:109CE000C000BDE8F09F2DE9F047DFF86090002547 -:109CF0002C4699F8092099F8081099F801700A443F -:109D0000D6B299F80A20114401F0FF0808E0204675 -:109D1000FFF783FE817B407811FB0055641CE4B2A1 -:109D2000BC42F4D199F80800401C3044304440440F -:109D3000401C0EB1012100E0002108444419FF2C11 -:109D400000D9FFDFE0B211E434200200300400202B -:109D5000633D00008DAB0000592F00003120010051 -:109D60002DE9F041074614468846084601F02EFDCD -:109D7000064608EB88001C22796802EBC0000D182B -:109D8000688C58B14146384601F028FD0146786894 -:109D90000078C200082305F120000CE0E88CA8B18F -:109DA0004146384601F021FD014678680823407895 -:109DB000C20005F1240006F0F4FC38B1062121723E -:109DC0006681D0E90010C4E9031009E02878092869 -:109DD0000BD00520207266816868E0600020287042 -:109DE0002046BDE8F04101F0E7BC07202072668103 -:109DF000F4E72DE9F04116460D460746406801EBB1 -:109E000085011C2202EBC1014418204601F00FFD20 -:109E100040B10021708865F30F2160F31F410820D5 -:109E20000AF0D2F909202070324629463846BDE8AA -:109E3000F04195E72DE9F0410E46074600241C212C -:109E4000F07816E004EB8403726801EBC303D25C84 -:109E50006AB1FFF7AAFA050000D1FFDF6F802A463A -:109E600021463046FFF7C5FF0120BDE8F081641CA4 -:109E7000E4B2A042E6D80020F7E770B50646002419 -:109E80001C21C0780AE000BF04EB8403726801EB78 -:109E9000C303D5182A782AB1641CE4B2A042F3D8CF -:109EA000402070BD2821284617F09DFE70688089EB -:109EB0002881204670BD70B5034600201C25DC7843 -:109EC0000DE000BF00EB80065A6805EBC606324481 -:109ED000167816B1128A8A4204D0401CC0B284425D -:109EE000F0D8402070BDF0B5044600201C26E5786F -:109EF0000EE000BF00EB8007636806EBC7073B443A -:109F00001F788F4202D15B78934204D0401CC0B2CC -:109F10008542EFD84020F0BD0078032801D0002012 -:109F20007047012070470078022801D00020704758 -:109F3000012070470078072801D0002070470120D9 -:109F400070472DE9F041064688461078F1781546AD -:109F5000884200D3FFDF2C781C27641CF078E4B221 -:109F6000A04201D8201AC4B204EB8401706807EB48 -:109F7000C1010844017821B14146884708B12C70DD -:109F800073E72878A042E8D1402028706DE770B5CB -:109F900014460B880122A240134207D113430B80C1 -:109FA00001230A22011D06F0C6FB047070BD2DE9D5 -:109FB000FF4F81B00878DDE90E7B9A4691460E4648 -:109FC00040072CD4019806F065FE040000D1FFDFA5 -:109FD00007F1040820461FFA88F105F0A9FE0500E4 -:109FE00000D1FFDF204629466A4606F092F9009824 -:109FF000A0F80370A0F805A0284606F04BFA0178F7 -:10A0000069F306016BF3C711017020461FFA88F14E -:10A0100005F0DEFE00B9FFDF019804F07CF906EBE5 -:10A020000900017F491C017705B0BDE8F08F2DE9DB -:10A03000F84F0E469A4691460746032106F00EFD5C -:10A040000446008DDFF8B085002518B198F80000AF -:10A05000B0421ED1384606F01DFE070000D1FFDFDA -:10A0600009F10401384689B205F062FE050010D0FE -:10A07000384629466A4606F04CF9009800210A46FF -:10A080000180817004F00AFA0098C01DCAF800002F -:10A0900021E098F80000B04216D104F1260734F808 -:10A0A000341F012000FA06F911EA090F00D0FFDF82 -:10A0B0002088012340EA090020800A22391D384601 -:10A0C00006F054FB067006E0324604F1340104F158 -:10A0D0002600FFF75CFF0A2188F800102846BDE83B -:10A0E000F88FFEB514460D46064602AB0C2206213B -:10A0F000FFF79DFF002826D00299687812220A7087 -:10A10000801C487008224A80A87020888880608857 -:10A11000C880A0880881E088488100240C20CDE90F -:10A1200000040523062229463046FFF740FF21465A -:10A1300066F31F41F0230022012009F09BFF68789D -:10A14000801C68700120FEBDFEB514460D46062237 -:10A15000064602AB1146FFF76AFF002812D0029BA9 -:10A16000132000211870A8785870022058809C8015 -:10A170000620CDE900010246052329463046FFF7B7 -:10A1800016FF0120FEBD2DE9FE430C46804644E04B -:10A1900002AB0E2207214046FFF749FF002841D0BD -:10A1A00060681C2267788678BF1C06EB860102EB8C -:10A1B000C101451802981421017047700A2141809D -:10A1C000698A0181E98A4181A9888180A98981817F -:10A1D000304601F0FBFA029905230722C8806F7010 -:10A1E0000420287000250E20CDE9000521464046B8 -:10A1F000FFF7DDFE294666F30F2168F31F41F023C8 -:10A200000022082009F036FF6078FC49801C60704D -:10A2100062682046921CFFF794FE606880784028B0 -:10A22000B6D10120BDE8FE83FEB50D46064638E0F6 -:10A2300002AB0E2207213046FFF7F9FE002835D089 -:10A2400068681C23C17801EB810203EBC202841809 -:10A25000029815220270627842700A224280A28916 -:10A260004281A2888281084601F0B0FA0146029834 -:10A270008180618AC180E18A0181A088B8B1002013 -:10A28000207000210E20CDE9000105230722294678 -:10A290003046FFF78CFE6A68D9492846D21CFFF782 -:10A2A00050FE6868C0784028C2D10120FEBD06205B -:10A2B000E6E72DE9FE430C46814644E0204601F0E6 -:10A2C000A0FAD0B302AB082207214846FFF7AFFE41 -:10A2D0000028A7D060681C2265780679AD1C06EBC3 -:10A2E000860102EBC10147180298B7F810800621D9 -:10A2F0000170457004214180304601F067FA014643 -:10A30000029805230722C180A0F804807D700820F0 -:10A3100038700025CDE9000521464846FFF747FE85 -:10A32000294666F30F2169F31F41F023002208201C -:10A3300009F0A0FE6078801C60706268B149204618 -:10A34000121DFFF7FEFD606801794029B6D101209A -:10A3500068E72DE9F34F83B00E4680E0304601F008 -:10A3600050FA002875D071681C2091F8068008EB1F -:10A37000880200EBC2000C184146304601F035FA65 -:10A380000146A078C30070684078C20004F1240040 -:10A3900006F023FA07468088E18B401A80B2002538 -:10A3A00081B3AA46218B814200D8084681460246E5 -:10A3B00002AB07210398FFF73AFE010028D0BAF15B -:10A3C000000F03D0029AB888022510808B46E28BDA -:10A3D0003968A9EB05001FFA80FA0A440398009235 -:10A3E00006F058FCED1D009A59465346009506F0BC -:10A3F00017F8E08B504480B2E083B988884209D1D5 -:10A40000012508E0FFE7801C4FF0010A80B2C9E790 -:10A41000002009E60025CDE90095238A0722314670 -:10A420000398FFF7C4FDE089401EE0818DB1A0785C -:10A43000401CA0707068F178427811FB02F1CAB23A -:10A44000816901230E3006F076F980F80080002043 -:10A45000E08372686C493046921DFFF772FD7068A8 -:10A46000817940297FF47AAF0120DDE570B5064699 -:10A4700048680D4614468179402910D104EB8401C7 -:10A480001C2202EBC101084401F0F2F9002806D0B9 -:10A490006868294684713046BDE8704059E770BD50 -:10A4A000FEB50C460746002645E0204601F0A9F916 -:10A4B000D8B360681C22417901EB810102EBC10134 -:10A4C0004518688900B9FFDF02AB0822072138462A -:10A4D000FFF7ADFD002833D00299607816220A708C -:10A4E000801C4870042048806068407901F06EF953 -:10A4F000014602980523072281806989C1800820CE -:10A50000CDE9000621463846FFF751FD6078801CF2 -:10A510006070A88969890844B0F5803F00D3FFDFE7 -:10A52000A88969890844A8816E81626837492046F4 -:10A53000521DFFF706FD606841794029B5D1012021 -:10A54000FEBD30B5438C458BC3F3C704002345B132 -:10A55000838B641EED1AC38A6D1E1D4495FBF3F3B5 -:10A56000E4B22CB1008918B1A04200D820460344BF -:10A570004FF6FF70834200D3034613800C7030BD4A -:10A580002DE9FC41074616460D46486802EB860158 -:10A590001C2202EBC101441801AA69462046FFF7BC -:10A5A000D0FFA1896389BDF80420C81880B2824217 -:10A5B0001FD001280AD99DF800C0BCF1000F03D0BC -:10A5C000B4F808C0844501D8002B12D0501A00D529 -:10A5D000002060816868407940280AD1204601F057 -:10A5E0003DF9002805D06868294646713846FFF7CE -:10A5F00057FFBDE8FC8100002C000020199F0000DF -:10A60000279F0000359F000071B800005DB8000072 -:10A610002DE9FE4F8946804615465088032106F0F5 -:10A620001DFA8346B8F80200402801D2402000E01D -:10A63000403880B282460146584601F0E2F80028D0 -:10A640007ED00AEB8A001C22DBF8041002EBC0006B -:10A650000C18204601F0EBF8002877D1B8F800007C -:10A66000E18A88423CD8A189D1B348456ED1002601 -:10A670005146584601F0B2F8218C0F18608B48B94A -:10A68000B9F1020F62D3B8F804006083618A88428E -:10A6900026D80226A9EB06001FFA80F9B888A28BFB -:10A6A000801A002814DD4946814500DA084683B245 -:10A6B00068886968029139680A44CDE9003206F079 -:10A6C000D7FADDE90121F61D009B009605F06FFE2B -:10A6D000A18B01EB090080B2A083618B884207D96E -:10A6E000688803B052465946BDE8F04F01F0DDB826 -:10A6F0001FD14FF009002872B8F802006881D7E92D -:10A700000001C5E90401608BA881284601F054F8D6 -:10A710005146584601F062F80146DBF80400082370 -:10A720000078C20004F1200006F03BF80020A0836E -:10A730006083A0890AF0FF02401EA081688800E0C3 -:10A7400004E003B05946BDE8F04F19E7BDE8FE8FBD -:10A750002DE9F041064615460F461C46184609F0FD -:10A760007FFD18B9206809F0A1FD08B1102007E4A9 -:10A770007168688C0978B0EBC10F01D3132005E430 -:10A780003946304601F02AF80146706808230078FF -:10A79000C20005F1200005F0CEFFD4E90012C0E9A7 -:10A7A00000120020E3E710B50446032106F056F935 -:10A7B0000146007800F00300012804D08A8A204670 -:10A7C000BDE81040C0E42046BDE8104001F114028D -:10A7D00087E470B50446032106F040F905460146BA -:10A7E0002046FFF766FD002816D029462046FFF7D1 -:10A7F00057FE002810D029462046FFF715FD0028F7 -:10A800000AD029462046FFF7BEFC002804D029467E -:10A810002046BDE870409CE570BD2DE9F0410C4636 -:10A8200080461EE0E178427811FB02F1CAB28169EC -:10A8300001230E3005F0B5FF077860681C22C1794E -:10A84000491EC17107EB8701606802EBC101461820 -:10A850003946204600F0D5FF18B1304600F0E0FF41 -:10A8600020B16068C1790029DCD180E7FEF79DFD49 -:10A87000050000D1FFDF0A202872384600F0A6FF4D -:10A8800068813946204600F0B0FF01466068082321 -:10A890004078C20006F1240005F083FFD0E90010E3 -:10A8A000C5E90310A5F80280284600F085FFB078BE -:10A8B00000B9FFDFB078401EB07058E770B50C46A5 -:10A8C0000546032106F0CAF801464068C2792244D1 -:10A8D000C2712846BDE870409FE72DE9FE4F8246D1 -:10A8E000507814460F464FF0000800284FD001283A -:10A8F00007D0022822D0FFDF2068B8606068F860C7 -:10A9000024E702AB0E2208215046FFF790FB0028F7 -:10A91000F2D00298152105230170217841700A2197 -:10A920004180C0F80480C0F80880A0F80C806288DC -:10A9300082810E20CDE90008082221E0A678304669 -:10A9400000F044FF054606EB86012C22786802EBF6 -:10A95000C1010822465A02AB11465046FFF767FB79 -:10A960000028C9D002980721017021784170042184 -:10A97000418008218580C680CDE9001805230A465C -:10A9800039465046FFF713FB87F80880DEE6A678C5 -:10A99000022516B1022E13D0FFDF2A1D914602AB0D -:10A9A00008215046FFF743FB0028A5D0029801215B -:10A9B000022E0170217841704580868002D005E02A -:10A9C0000625EAE7A188C180E1880181CDE90098E8 -:10A9D0000523082239465046D4E710B50446032122 -:10A9E00006F03CF8014600F108022046BDE81040A0 -:10A9F00073E72DE9F05F0C4601281DD0957992F898 -:10AA00000480567905EB85011F2202EBC10121F07C -:10AA1000030B08EB060111FB05F14FF6FF7202EA8A -:10AA2000C10909F1030115FB0611F94F21F0031AC1 -:10AA300040B101283DD124E06168E57891F80080BB -:10AA40004E78DFE75946786805F029FE606000B966 -:10AA5000FFDF5946606817F0E8F8E57051467868FE -:10AA600005F01DFE6168486100B9FFDF606842695A -:10AA700002EB09018161606880F8008060684670BF -:10AA800017E0606852464169786805F033FE5A461F -:10AA90006168786805F02EFE032005F089FF044602 -:10AAA000032005F08DFF201A012802D1786805F0F7 -:10AAB000EBFD0BEB0A00BDE8F09F024600210220EF -:10AAC00097E713B5009858B10024684605F0C9FD12 -:10AAD000CF490A22002C0A7001D1009A4A601CBD9D -:10AAE00001240020F2E770B50C46154638212046B7 -:10AAF00017F09BF8012666700A2104F11C0017F07C -:10AB000094F805B9FFDF297A207861F301002070FD -:10AB1000A879002817D02A4621460020FFF769FFB0 -:10AB20006168402088706168C870616808716168F8 -:10AB300048716168887161682888088161686888DF -:10AB400048816068868170BDC878002802D00022E4 -:10AB500001204EE7704770B50546002165F31F419F -:10AB6000012009F031FB0321284605F077FF04009E -:10AB700000D1FFDF21462846FFF75CF9002804D00A -:10AB8000207840F010002070012070BD2DE9FF41B9 -:10AB900080460E460F0CFEF708FC050007D06F80BC -:10ABA0000321384605F05AFF040008D106E004B03E -:10ABB0003846BDE8F0411321F9F72EBEFFDFB8F1AA -:10ABC000010F05D0B8F1080F18D0FFDFBDE8FF81F5 -:10ABD00020782A4620F0080020700020ADF80200FE -:10ABE00002208DF800004FF6FF70ADF80400ADF8BC -:10ABF000060069463846F9F717F9E7E7C6F3072173 -:10AC000001EB81021C23606803EBC202805C042814 -:10AC100003D008280AD0FFDFD8E7012000904FF4C6 -:10AC200040432A46204600F009FECFE704B02A46FA -:10AC30002046BDE8F041FFF7DCB82DE9F05F0027C2 -:10AC4000B0F80A9090460C4605463E46B9F1400FD2 -:10AC500001D2402001E0A9F140001FFA80FA287AD1 -:10AC6000C01E08286BD2DFE800F00D04192058360A -:10AC70003C4772271026002C6CD0D5E90301C4E9AB -:10AC800002015CE070271226002C63D00A2205F135 -:10AC90000C0104F1080016F074FF50E071270C2637 -:10ACA000002C57D0E868A06049E0742710269CB3B8 -:10ACB000D5E90301C4E902016888032105F0CEFE4D -:10ACC0008346FEF772FB024668885080514658461C -:10ACD000FFF746F833E075270A26ECB1A8892081F2 -:10ACE0002DE076271426BCB105F10C0004F1080311 -:10ACF00007C883E8070022E07727102664B1D5E96A -:10AD00000301C4E902016888032105F0A7FE01469A -:10AD10006888FFF782FD12E01CE073270826CCB19B -:10AD20006888032105F09AFE01460078C00606D522 -:10AD30006888FFF77FF810B96888F8F767FCA8F80B -:10AD400000602CB12780A4F8069066806888A080F7 -:10AD50000020B0E6A8F80060FAE72DE9FC410C46B7 -:10AD60001E4617468046032105F078FE05460A2C4C -:10AD70000AD2DFE804F005050505050509090907FC -:10AD8000042303E0062301E0FFDF0023CDE9007682 -:10AD9000224629464046FFF70AF92AE438B5054617 -:10ADA000A0F57F40FF3830D0284605F061FF040051 -:10ADB00000D1FFDF204605F08BFA002815D00146B0 -:10ADC0006A46204605F0A5FA00980321B0F8054030 -:10ADD000284605F043FE0546052C03D0402C05D23D -:10ADE000402404E0007A80B1002038BD403CA4B289 -:10ADF000214600F006FD40B1686804EB84013E2264 -:10AE000002EBC101405A0028EFD0012038BD0000FC -:10AE10002C0000202DE9F04F044689B0408805F051 -:10AE200027FF050000D1FFDF06AA2846616800F071 -:10AE3000C1FC069D001F81B235F8032F6B888A4242 -:10AE400005D1042B0AD0052B1DD0062B15D0224688 -:10AE50002846FFF7DDFB09B0BDE8F08F16462D1D33 -:10AE6000224629463046F7F78CFA0828F3D12246C5 -:10AE700029463046FCF73DFCEDE76088291D6368F4 -:10AE8000FAF7F0FCE7E717466088032105F0E6FDD6 -:10AE90004FF000088DF804800646ADF80680042FB8 -:10AEA000D9D36A79002AD6D028794FF6FF794FF0A6 -:10AEB0001C0A13282CD008DC012878D0062847D09B -:10AEC000072875D0122874D106E0142872D01528EE -:10AED00071D016286DD1ACE10C2F6AD1307800F01A -:10AEE0000301012965D040F0080030706879B07026 -:10AEF00001208DF804002889ADF808006889ADF8B4 -:10AF00000A00A889ADF80C00E889ADF80E0019E038 -:10AF1000B07890429FD1307801079CD5062F9AD106 -:10AF200020F0080030706088414660F31F41012026 -:10AF300009F04AF902208DF80400ADF8089028893C -:10AF4000ADF80A006088224601A9F8F76DFF82E794 -:10AF5000082F80D12F89B5F80A90402F01D24020C8 -:10AF600001E0A7F1400080B280460146304600F083 -:10AF700048FC08B3716808EB88002C2202EBC00083 -:10AF8000095A4945E3D1FE4807AAD0E90210CDE9A4 -:10AF9000071068798DF81C0008F0FF058DF81E5029 -:10AFA00060883146FFF799FC2246294639E0B6E031 -:10AFB00014E03CE039E0E6E0F148D0E90010CDE9EA -:10AFC00007106879ADF820708DF81C00ADF822905C -:10AFD000608807AA3146FFF780FC3CE7082FB6D10E -:10AFE0006889B5F80880402801D2402000E0403848 -:10AFF00087B23946304600F004FC0028A7D007EBA2 -:10B00000870271680AEBC2000844028A42459ED159 -:10B01000017808299BD140786979884297D1F9B2A3 -:10B0200022463046FEF7E5FE15E70E2F07D0CDF895 -:10B030001C80CDF8208068798DF81C00C8E76989EC -:10B04000EF898B46B5F80C903046FEF734FFABF134 -:10B050004001402901D309204AE0B9F1170F01D37B -:10B06000172F01D20B2043E040280ED000EB8002C6 -:10B0700071680AEBC20008440178012903D14078C5 -:10B0800069798842A9D00A2032E03046FEF7F5FE01 -:10B09000014640282BD001EB810372680AEBC30004 -:10B0A00002EB0008012288F800206A7988F8012064 -:10B0B00070682A894089B84200D938462D8A03230E -:10B0C0002372A282E7812082A4F80C906582084650 -:10B0D00000F07CFB6081A8F81490A8F81870A8F81C -:10B0E0000E50A8F810B0204600F066FBB3E604202E -:10B0F00005212172A4F80A80E08101212173A04971 -:10B10000D1E90421CDE9072169798DF81C10ADF84A -:10B110001E00608807AA3146FFF7DFFBE3E7062F32 -:10B12000E4D3B078904215D13078010712D520F0E1 -:10B13000080030706088414660F31F41012009F02B -:10B1400043F802208DF804002889ADF80800ADF816 -:10B150000A90F7E604213046FEF7C5FE0546402872 -:10B16000C4D002208303009022462946304600F0D6 -:10B1700065FB4146608865F30F2160F31F4108209D -:10B1800009F022F867E60E2FB0D104213046FEF711 -:10B19000AAFE81464028A9D04146608869F30F2164 -:10B1A00060F31F41082009F00FF8288A0790E8890A -:10B1B00000907068AF894089B84200D9384683460C -:10B1C000B5F80A8028890590484600F0FFFA6081AA -:10B1D000079840B10220079B00902246494630461E -:10B1E00000F02CFB37E6B8F1170F1ED3172F1CD336 -:10B1F0000420207200986082E781A4F810B0A4F8BF -:10B200000C8009EB890271680AEBC2000D180099E5 -:10B210000598A5F81480A5F818B0E9812882204681 -:10B2200000F0CAFA0620287015E601200B230090D2 -:10B23000D3E7082FA6D129893046FEF73CFE074602 -:10B2400040289FD007EB870271680AEBC2000844D0 -:10B25000804600F0ECFA002894D16D89B8F80E0011 -:10B260002844B0F5803F05D360883A46314600F067 -:10B270001CFBF0E5002D85D0A8F80E0060883A464A -:10B280003146FFF7F3F808202072384600F09EFAA6 -:10B290006081A58127E770B50D460646032105F0BC -:10B2A000DDFB040004D02078000704D5112070BD18 -:10B2B00043F2020070BD2A4621463046FEF711FFD8 -:10B2C00018B9286860616868A061207840F00800BB -:10B2D0002070002070BD70B50D460646032105F0B4 -:10B2E000BDFB040004D02078000704D4082070BD02 -:10B2F00043F2020070BD2A4621463046FEF724FF85 -:10B3000000B9A582207820F008002070002070BDD0 -:10B310002DE9F04F0E4691B08046032105F09EFBCB -:10B320000446404605F0B6FC07460020079008900A -:10B330000990ADF830000A9002900390049004B98F -:10B34000FFDF0DF1080917BBFFDF20E038460BA92E -:10B35000002204F046FE9DF82C0000F07F050A2D27 -:10B3600000D3FFDF6019017F491E01779DF82C0093 -:10B3700000060CD52A460CA907A8FEF708FE01E036 -:10B380005C20020019F80510491C09F80510761E0A -:10B39000F6B2DBD204F13400FC4D04F1260BDFF8E9 -:10B3A000F0A304F12A07069010E05846069900F031 -:10B3B0006EFA064628700A2800D3FFDF5AF82610D6 -:10B3C00040468847E08CC05DB04202D0208D002806 -:10B3D000EBD10A202870EE4D4E4628350EE00CA920 -:10B3E00007A800F054FA0446375D55F8240000B968 -:10B3F000FFDF55F82420394640469047BDF81E002F -:10B400000028ECD111B027E510B5032105F026FB8B -:10B41000040000D1FFDF0A2104F11C0016F005FC36 -:10B42000207840F00400207010BD10B50C460321B8 -:10B4300005F014FB01190A7F01211AB9808EA14081 -:10B44000084000D0012010BD2DE9F84F894615466F -:10B450008246032105F002FB070004D0284608F0CD -:10B46000FFFE40B903E043F20200BDE8F88F484612 -:10B4700008F01CFF08B11020F7E7786828B1698848 -:10B480000089814201D90920EFE7B9F800001C24A6 -:10B4900018B1402809D2402008E03846FEF7EDFCFC -:10B4A0008046402819D11320DFE7403880B280461B -:10B4B0000146384600F0A5F948B108EB88007968E4 -:10B4C00004EBC000085C012803D00820CDE705206C -:10B4D000CBE7FDF76AFF06000BD008EB8800796820 -:10B4E00004EBC0000C18B9F8000020B1E88910B1D5 -:10B4F00013E01120B9E72888172802D36888172895 -:10B5000001D20720B1E7686838B12B1D22464146B9 -:10B510003846FFF71DF90028A7D104F10C0269464F -:10B520002046FFF70EF8288860826888E082B9F824 -:10B53000000030B102202070E889A080E889A0B125 -:10B540002BE003202070A889A080786881784029AA -:10B5500005D180F8028039465046FEF714FE404679 -:10B5600000F034F9A9F8000021E07868218B4089C7 -:10B57000884200D908462083A6F802A00420307231 -:10B58000B9F800007081E0897082F181208B3082EF -:10B59000A08AB081304600F00FF97868C178402960 -:10B5A00005D180F8038039465046FEF73DFE002065 -:10B5B0005BE770B50D460646032105F04FFA04001F -:10B5C00003D0402D04D2402503E043F2020070BDB9 -:10B5D000403DADB2294600F014F958B105EB8501A4 -:10B5E0001C22606802EBC101084400F020F918B188 -:10B5F000082070BD052070BD2A462146304600F067 -:10B6000054F9002070BD2DE9F0410D4616468046E4 -:10B61000032105F023FA0446402D01D2402500E025 -:10B62000403DADB28CB1294600F0EBF880B105EB9E -:10B6300085011C22606802EBC1014718384600F002 -:10B64000F6F838B10820BDE8F08143F20200FAE7CD -:10B650000520F8E733463A4629462046FFF778F8B2 -:10B660000028F0D1EAB221464046FEF789FF0020CB -:10B67000E9E72DE9F0410D4616468046032105F025 -:10B68000EDF90446402D01D2402500E0403DAFB227 -:10B6900024B1304608F0E4FD38B902E043F202007C -:10B6A000D1E7306808F0DCFD08B11020CBE739465F -:10B6B000204600F0A6F860B107EB87011C22606805 -:10B6C00002EBC1014518284600F0B1F818B1082076 -:10B6D000B9E70520B7E7B088A98A884201D90C20CC -:10B6E000B1E76168E88C4978B0EBC10F01D3132052 -:10B6F000A9E73946204600F078F80146606808233B -:10B700004078C20005F1240005F015F8D6E90012D2 -:10B71000C0E90012FAB221464046FEF7A7FE00201B -:10B7200091E72DE9F0470D461F46904681460321DB -:10B7300005F094F90446402D01D2402001E0A5F126 -:10B74000400086B23CB14DB1384608F0CDFD50B155 -:10B750001020BDE8F08743F20200FAE76068C8B144 -:10B76000A0F80C8024E03146204600F04AF888B169 -:10B7700006EB86011C22606802EBC10145182846D1 -:10B7800000F055F840B10820E3E700002C0000204D -:10B79000742002000520DCE7A5F80880F2B22146FB -:10B7A0004846FEF7EDFE1FB1A88969890844388034 -:10B7B0000020CEE704F0ADBD017821F00F01491C57 -:10B7C00021F0F00110310170FDF7F2BD10B5044613 -:10B7D000402800D9FFDF4034A0B210BD4068426964 -:10B7E0000078484302EBC0007047C2784068037895 -:10B7F00012FB03F24378406901FB032100EBC10017 -:10B800007047C2788A4209D9406801EB81011C2245 -:10B8100002EBC101405C08B1012070470020704775 -:10B820000078062801D90120704700207047007871 -:10B83000062801D00120704700207047F0B401EBCA -:10B8400081061C27446807EBC6063444049D052680 -:10B850002670E3802571F0BCFEF782BA10B54189ED -:10B8600011B1FFF7DDFF08B1002010BD012010BDB0 -:10B8700010B5C18C8278B1EBC20F04D9C18911B166 -:10B88000FFF7CEFF08B1002010BD012010BD10B59C -:10B890000C4601230A22011D04F083FF0078218851 -:10B8A000012282409143218010BDF0B402EB820559 -:10B8B0001C264C6806EBC505072363554B681C79AD -:10B8C000402C03D11A71F0BCFEF7F3BCF0BC7047FA -:10B8D00010B5EFF3108000F0010472B6E94841782A -:10B8E000491C41704078012801D1F7F74BFB002C2F -:10B8F00000D162B610BD70B5E24CE07848B90125C0 -:10B90000E570FFF7E5FFF7F745FB20B1002008F0F1 -:10B910009AF8002070BD4FF080406571C0F8045364 -:10B92000F7E770B5EFF3108000F0010572B6D54C63 -:10B93000607800B9FFDF6078401E6070607808B9F9 -:10B94000F7F724FB002D00D162B670BDCD4810B5CD -:10B95000C17821B100214171C170FFF7E2FF0020E1 -:10B9600010BD10B50446F7F715FBC649C978084065 -:10B9700000D001202060002010BD2DE9F05FDFF82D -:10B9800004934278817889F80620002689F8071008 -:10B99000074689F808600078354620B101280FD0A5 -:10B9A00002280FD0FFDFF7F702FB98B1F7F706FB8D -:10B9B000B0420FD13046F7F705FB0028FAD047E038 -:10B9C0000126F0E7FFF784FFF7F7E4FA0028FBD041 -:10B9D0000226E8E701208407E060C4F80451AA4980 -:10B9E0000E600107D1F84412A74AC1F34231243254 -:10B9F0001160A549343108604FF0020BC4F804B35C -:10BA0000A060DFF888A2DAF80010C94341F3001102 -:10BA100001F10108DAF8001041F01001CAF8001035 -:10BA200000E020BFD4F804010028FAD03046F7F730 -:10BA3000C9FA0028FAD0B8F1000F05D1DAF80010E1 -:10BA400021F01001CAF80010C4F808B3C4F804517A -:10BA500099F807004C4670B1387860B9F7F79AFA50 -:10BA6000074608F09FF96FF0004117B1C4E90310D1 -:10BA700001E0C4E9030116B12571BDE8F09F01277B -:10BA8000BE0727714FF01908C6F80883B761C6F8DA -:10BA90000051C6F80C51C6F81051F7F77BFA10B1F7 -:10BAA000A770376100E02770FFF712FF7649A07991 -:10BAB00020310860C6F80483DFE770B5050000D1C7 -:10BAC000FFDF4FF080424FF0FF30C2F80803002143 -:10BAD000C2F80011C2F80411C2F80C11C2F810111A -:10BAE000684C6170F7F75CFA10B10120E07060708B -:10BAF0002846BDE8704040E72DE9F05F6448D0F883 -:10BB000000B0634A6349083211608406D4F8080122 -:10BB100010B14FF0010801E04FF00008D4F8000127 -:10BB200000B101208146D4F8040108B1012600E0EB -:10BB30000026D4F80C0100B101208246D4F810018F -:10BB400008B1012700E0002748EA090126EA0100C0 -:10BB500020EA0A00B84300D0FFDF0025B8F1000F4B -:10BB600004D0C4F80851012007F06DFF5FEA090016 -:10BB7000DFF810814FF0010913D0C4F8005198F894 -:10BB8000050020B188F80550002007F05CFF98F808 -:10BB9000000030B1F7F7FEF918B188F80290C4F848 -:10BBA00010900EB1C4F80451BAF1000F0CD0C4F8D3 -:10BBB0000C5198F80200464600B9FFDFB5703570A9 -:10BBC000C4F81490FFF7ADFE37B1C4F8105198F8DF -:10BBD000040008B100F020F82D49091DC1F800B09B -:10BBE0004BE770B5274DE87808B9F7F7CFF9012092 -:10BBF0008407A061A87850B1D4F80C0120B90020C6 -:10BC0000F7F7E0F90028F7D10020C4F80C014FF055 -:10BC1000FF30C4F8080370BD2DE9F041194C4FF016 -:10BC200080470125E079F0B1012803D0217A401E38 -:10BC3000814218DAF7F7AEF9064608F0B3F8E17971 -:10BC4000012902D9217A491C21720EB1216900E033 -:10BC5000E168411A022902DA11F1020F0BDC0EB180 -:10BC6000206100E0E060FFF733FEF7F793F928B1B9 -:10BC70003D61A57003E07D61BDE8F0812570002085 -:10BC80002072F9E7380000201805004010ED00E0B0 -:10BC900010050240010000014FF0E0214FF000705C -:10BCA000C1F88001C1F88002384B802283F800245B -:10BCB000C1F80001704700B502460420344903E092 -:10BCC00001EBC0031B792BB1401EC0B2F8D2FFDFDD -:10BCD000FF2000BD41F8302001EBC00100224A7175 -:10BCE0008A7101220A7100BD294A002102EBC000BD -:10BCF0000171704710B50446042800D3FFDF2448C3 -:10BD000000EBC4042079012800D0FFDF6079A1791D -:10BD1000401CC0B2814200D060714FF0E0214FF072 -:10BD20000070C1F8000210BD2DE9F0411948056806 -:10BD300018491948083108601448042690F800048E -:10BD4000134F4009154C042818D0FFDF16E0217866 -:10BD500007EBC1000279012A08D1427983799A421E -:10BD600004D04279827157F8310080472078401C16 -:10BD7000C0B22070042801D300202070761EF6B2D5 -:10BD8000E5D20448001D0560BDE8F08119E000E03F -:10BD90009006002010050240010000014C00002028 -:10BDA000F8B51D46DDE906470E000AD004F072FF23 -:10BDB0002346FF1DBCB231462A46009404F030FBF6 -:10BDC000F8BDD0192246194615F096FE2046F8BD5A -:10BDD000F84B586019721A80C90015F026BF70B56B -:10BDE0000D460446102115F0FEFE258117206081C6 -:10BDF000A07B40F00A00A07370BD4FF6FF720A806E -:10BE00000146032008F0E0B9704700897047827B43 -:10BE1000D30701D1920703D480890880002070479E -:10BE200005207047827B920700D5818170470146CB -:10BE30000020098847F2FE12114200D00120DD499E -:10BE4000497A002901D040F00800704700B5034648 -:10BE5000807BC00701D0052000BD59811846FFF73F -:10BE6000E6FFC00703D0987B40F004009873987BEE -:10BE700040F001009873002000BD827B520700D57E -:10BE800009B14089704717207047827B61F3C30274 -:10BE9000827370472DE9F04F0E46017804464FF04B -:10BEA000010B0BFA01F047F2FF1100EA010961688A -:10BEB0004FF6FF7887B008881D469646404506D065 -:10BEC000B9F1000F07D047F2FE12104203D0012053 -:10BED00007B0BDE8F08F40EA090008804FF0000A83 -:10BEE00095B185F800A022780027052003210223C0 -:10BEF000102A6FD2DFE802F06E0D2C35546F768079 -:10BF000054CBC79CCFFEFDFC20780B28EBD004203F -:10BF1000DEE762682089937B9B077DD5172851D384 -:10BF200013898342FBD39289172A01D3824249D1D4 -:10BF30002A7822F03F02921C2A70A5F80100318075 -:10BF4000616888816068817B21F00201817342E130 -:10BF5000042129702189A5F801106189A5F8031031 -:10BF60008FE0208A3188C01D1FFA80F84145D6D362 -:10BF7000062028702089A5F801006089A5F8030033 -:10BF8000A089A5F805000721208ACDE90001608875 -:10BF90002A4671466369FFF703FFA6F800801AE19D -:10BFA000082A10D0082129702189A5F8011061897B -:10BFB000A5F8031030806A1D694604F10C0006F0F4 -:10BFC000CAF910B1CCE01021EDE730889DF80010DF -:10BFD000084456E00EE10A2028702089A5F80100E7 -:10BFE0003180B2E00C2129702189A5F80110618906 -:10BFF000A5F803103080A8E0218933880BEB4102BB -:10C000001FFA82FA534576D3BAF1050F73D30E2285 -:10C010002A7008EA410100E07FE0CDE9001B60885A -:10C020002A467146E368FFF7BBFEA6F800A0D2E0FF -:10C030006048417A002970D0491E41724068217AD7 -:10C04000E26800EBC105D046A9882868D2F800C094 -:10C050000844A0F1080140F808CC506848608DF809 -:10C0600000308DF801A028680290A888ADF804007F -:10C0700060886946F5F7C6FEA5F80480002E01D059 -:10C0800040463080A7E0287840F080022A70287867 -:10C0900040F040022A7060893288C01C1FFA80F884 -:10C0A00042455DD3287820F03F0012302870228965 -:10C0B000A5F801206089CDE9000160882A46714613 -:10C0C000E368FFF76DFEA6F80080287841063CD5AE -:10C0D00000065ED58DF800B08DF801A03188CDE95D -:10C0E000025A091DADF804100420DFF8C88003E0EF -:10C0F00059E04FE02DE033E0049098F808008DF807 -:10C10000140060886946F5F77DFE074630880C30DC -:10C110003080022F02D0E7B36FE048E09DF8142092 -:10C12000D8F8041098F80830404601EBC2019A4252 -:10C1300016D28A88A2B9427A521C88F809200D606A -:10C1400030888880A6F800A057E061682089888040 -:10C1500041E0A1893288491D1FFA81F8424501D288 -:10C1600004274AE029782A4621F03F011631297038 -:10C170002189A5F801106189A5F80310A189CDE9ED -:10C180000010608871462369FFF70AFEA6F8008058 -:10C19000DBE720E0287820F03F0018302870207A74 -:10C1A0006870338017E060680188090404D40527AB -:10C1B00023E00000B0060020C0882189884201D019 -:10C1C00006271AE01E202870A6F800B060680188D3 -:10C1D00021F400410180B9F1000F0ED0DF486188E1 -:10C1E000002200888300032007F044FF6168207864 -:10C1F000887007E0A6F800A003276068018821EA9C -:10C2000009010180384663E62DE9F04F87B01746F3 -:10C21000109C0D0083461E461AD03078C10703D00B -:10C2200000F03F00192801D9012100E0002120463B -:10C23000FFF723FEA8420BD32088A0F57F41FF39EA -:10C2400006D03078410601D4000603D508203FE629 -:10C2500007203DE600208DF800008DF801003078C1 -:10C260006B1E00F03F0C0122A81E4FF0050A4FF094 -:10C27000020999B2BCF1200F76D2DFE80CF08C10E5 -:10C28000755F7569758D759E75B875BD75CB75D7FC -:10C2900075E4757575F475F275F175F0758C052D8D -:10C2A00079D104208DF80000A0788DF80400708802 -:10C2B000ADF8060030798DF80100707800F03F008D -:10C2C0000C2829D00ADCA0F10200092863D2DFE89B -:10C2D00000F0126215621A621D622000122824D03A -:10C2E00004DC0E281BD01028DAD11BE016281FD042 -:10C2F0001828D5D11FE02078800701E0207840077A -:10C30000002848DAF1E020780007F9E72078C00635 -:10C31000F6E720788006F3E720784006F0E72078FB -:10C320000006EDE72088C005EAE72088C004E7E7BB -:10C3300020888004E4E720884004E1E72078800733 -:10C3400029D5032D27D18DF800A0B6F8010083E090 -:10C35000217849071FD5062D1DD381B27078012899 -:10C3600003D0022817D102E0CCE0022000E0102028 -:10C3700006228DF8002072788DF80420801CB1FB15 -:10C38000F0F2ADF8062092B242438A4203D10397FD -:10C39000ADF80890A9E07BE02078000778D5072168 -:10C3A00098B28DF800108108ADF80410B0EB810F41 -:10C3B0006ED10297ADF8062097E02178C90667D5BF -:10C3C000022D65D381B208208DF800007078022814 -:10C3D0005ED300BFB1FBF0F28DF80400ADF806208B -:10C3E00092B242438A4253D1ADF808907CE0207863 -:10C3F00080064DD5092003E02078400648D50A2064 -:10C400008DF80000A088ADF80400ADF80610ADF876 -:10C41000082069E02078000672D50B20ADF80410E2 -:10C420008DF80000ADF8062002975EE02188C9056E -:10C4300066D5022D64D381B20C208DF8000070788F -:10C4400004285DD3C6E72088C00459D5012D57D1F3 -:10C450000D208DF80000A088ADF8040045E021E033 -:10C4600026E016E0FFE72088800449D5052D47D354 -:10C470000E208DF80000A088ADF80400B6F8030087 -:10C480006D1FADF80850ADF80600ADF80AA02BE01E -:10C4900036E02088400433D5012D31D10F208DF8AE -:10C4A000000022E0208800042AD4B6F80100E080D1 -:10C4B000A07B000724D5032D22D3307800F03F0065 -:10C4C0001B2819D011208DF80000208840F400406E -:10C4D000A4F80000B6F80100ADF80400ED1E03203A -:10C4E000ADF80650ADF80800039769465846F5F7D1 -:10C4F00089FC050008D016E010208DF80000E9E75F -:10C50000072510E008250EE0307800F03F001B28DA -:10C5100009D01D2807D05946032007F055FE208872 -:10C5200000F400402080A07B400708D52046FFF79C -:10C530007EFCC00703D1A07B20F00400A073284636 -:10C54000C6E400B587B0032805D18DF8000088B295 -:10C550006946F5F757FC07B000BD0000B0060020A3 -:10C56000F8B51D46DDE906470E000AD004F092FB3F -:10C570002346FF1DBCB231462A46009403F050FF0B -:10C58000F8BDD0192246194615F0B6FA2046F8BD76 -:10C590002DE9FF4F8DB09B46DDE91B57DDF87CA0F0 -:10C5A0000C46082B05D0E06901F00CF950B11020C1 -:10C5B000D2E02888092140F0100028808AF8001075 -:10C5C000022617E0E16901208871E2694FF42051E9 -:10C5D0009180E1698872E06942F601010181E069B8 -:10C5E000002181732888112140F0200028808AF8DA -:10C5F0000010042638780A900A2038704FF002099B -:10C6000004F118004D460C9001F09FFBB04681E00C -:10C61000BBF1100F0ED1022D0CD0A9EB0800801C2D -:10C6200080B20221CDE9001005AB52461E990D984B -:10C63000FFF796FFBDF816101A98814203D9F74804 -:10C6400000790F9004E003D10A9808B138702FE008 -:10C650004FF00201CDE900190DF1160352461E9963 -:10C660000D98FFF77DFF1D980088401B801B83B24B -:10C67000C6F1FF00984200D203461E990BA8D9B11B -:10C680005FF00002DDF878C0CDE9032009EB060178 -:10C6900089B2CDE901C10F980090BDF816100022B3 -:10C6A0000D9801F0D5FB387070B1C0B2832807D067 -:10C6B000BDF8160020833AE00AEB09018A19E1E788 -:10C6C000022011B0BDE8F08FBDF82C00811901F0F7 -:10C6D000FF08022D0DD09AF80120424506D1BDF881 -:10C6E0002010814207D0B8F1FF0F04D09AF80180E2 -:10C6F0001FE08AF80180C94800680178052902D145 -:10C70000BDF81610818009EB08001FFA80F905EBCF -:10C71000080085B2DDE90C1005AB0F9A01F018FB9B -:10C7200028B91D980088411B4145BFF671AF022D05 -:10C7300013D0BBF1100F0CD1A9EB0800801C81B203 -:10C740000220CDE9000105AB52461E990D98FFF776 -:10C7500007FF1D980580002038700020B1E72DE903 -:10C76000F8439C46089E13460027B26B9AB3491FB4 -:10C770008CB2F18FA1F57F45FF3D05D05518AD88EE -:10C780002944891D8DB200E000252919B6F83C80A6 -:10C790000831414520D82A44BCF8011022F8021B78 -:10C7A000BCF8031022F8021B984622F8024B91466F -:10C7B00004F05EFA4FF00C0C41464A462346CDF891 -:10C7C00000C003F0F4FDF587B16B00202944A41DDF -:10C7D0002144088003E001E0092700E08327384670 -:10C7E000BDE8F88310B50B88848F9C420CD9846B0C -:10C7F000E018048844B1848824F40044A41D234430 -:10C800000B801060002010BD822010BD2DE9F04784 -:10C810008AB00025904689468246ADF81850072711 -:10C820004BE0059806888088000446D4A8F800608C -:10C8300007A8019500970295CDE903504FF40073C6 -:10C8400000223146504601F003FB04003CD1BDF804 -:10C850001800ADF82000059804888188B44216D1EC -:10C860000A0414D401950295039521F40041009720 -:10C87000049541F4804342882146504601F0BEF8B9 -:10C8800004000BD10598818841F40041818005AAFC -:10C8900008A94846FFF7A6FF0400DCD000970598DA -:10C8A00002950195039504950188BDF81C3000227E -:10C8B000504601F0A3F8822C06D105AA06A94846E5 -:10C8C000FFF790FF0400ACD0ADF8185004E00598D5 -:10C8D000818821F40041818005AA06A94846FFF716 -:10C8E00081FF0028F3D0822C03D020460AB0BDE897 -:10C8F000F0870020FAE710B50C46896B86B051B17D -:10C900000C218DF80010A18FADF80810A16B0191DA -:10C910006946FAF7C9FB00204FF6FF71A063E18773 -:10C92000A08706B010BD2DE9F0410D460746896B82 -:10C930000020069E1446002911D0012B0FD132464B -:10C9400029463846FFF762FF002808D1002C06D0A0 -:10C95000324629463846BDE8F04100F042BFBDE806 -:10C96000F0812DE9FC411446DDE9087C0E46DDE945 -:10C970000A15521DBCF800E092B2964502D207207B -:10C98000BDE8FC81ACF8002017222A70A5F80160F0 -:10C99000A5F803300522CDE900423B462A46FFF7C1 -:10C9A000DFFD0020ECE770B50C4615464821204617 -:10C9B00015F03BF904F1080044F81C0F00204FF675 -:10C9C000FF71E06161842084A5841720E08494F8DD -:10C9D0002A0040F00A0084F82A0070BD4FF6FF726A -:10C9E0000A800146042007F0EFBB30B585B00C4645 -:10C9F0000546FFF780FFA18E284629B101218DF859 -:10CA000000106946FAF750FB0020E0622063606383 -:10CA100005B030BDB0F84000704700005000002065 -:10CA200090F84620920703D4408808800020F3E75E -:10CA30000620F1E790F846209207EDD5A0F84410C3 -:10CA4000EAE70146002009880A0700D5012011F015 -:10CA5000F00F01D040F00200CA0501D540F00400FB -:10CA60008A0501D540F010004A0501D540F02000AC -:10CA70000905D1D540F04000CEE700B5034690F857 -:10CA80004600C00701D0062000BDA3F8421018469A -:10CA9000FFF7D7FF10F0760F05D093F8460040F06F -:10CAA000040083F8460013F8460F40F001001870A8 -:10CAB000002000BD90F84620520700D511B1B0F813 -:10CAC0004200A9E71720A7E710F8462F61F3C30239 -:10CAD0000270A1E72DE9FF4F9BB00E00DDE92B347A -:10CAE000DDE92978289D25D02878C10703D000F0FA -:10CAF0003F00192801D9012100E000212046FFF75D -:10CB0000D9FFB04216D3287841060FD400F03F0178 -:10CB10001E2909D0218811F47F6F0BD13A884AB1C0 -:10CB2000A1F57F42FF3A05D0010606D500F03F008F -:10CB3000122802D004201FB0C4E5FC491D984FF014 -:10CB4000000A08718DF818A08DF830A00CAA0A60B0 -:10CB5000ADF81CA0ADF824A02978994601F03F0259 -:10CB6000701F5B1C04F1180CD3464FF0030ECDF878 -:10CB700028C01F2A7ED2DFE802F07D7D107D227D55 -:10CB8000AE7DF77DF67DF57DF47DF77DF37D7D7DD2 -:10CB9000F27DF17D7D7D7D7DF00094F84610B5F845 -:10CBA0000100890767D5032E65D14FF40061ADF808 -:10CBB000241060808DF830E0ADF83400E9E2052EF5 -:10CBC000F2D1B5F801002083ADF81C00B5F80310D0 -:10CBD0006183002870D088426ED884F80AB0A4F827 -:10CBE00008B04FF6FF7020840A9801F0AEF80520D7 -:10CBF00089F8000002208346029011AB1D9A0A9921 -:10CC00001B9801F0A5F820B15EE000BF8DF8180078 -:10CC1000FEE29DF84A00012804D0022089F80100B4 -:10CC2000102003E0012089F8010002200390002277 -:10CC300004A912A805F08FFBE8BB9DF8101003981B -:10CC400088423ED13A88891CA2EB0B00884238DB2F -:10CC500002990220CDE900010DF146034A46414602 -:10CC60001B98FFF77DFC02980BF1020B801C81B230 -:10CC700017AA01E0ACE2B1E0029104A912A805F004 -:10CC80006AFB02999DF81000CDE9000117AB4A46F6 -:10CC900041461B98FFF764FC9DF8100011AB0BEBAD -:10CCA00000011FFA81FB02991D9A084480B202908C -:10CCB0000A991B9801E004E091E001F049F800288E -:10CCC000B5D0BBF1020F03D10A208DF818005DE248 -:10CCD000A7F800B05AE2CDF80CB0072E7ED3B5F815 -:10CCE00001002083ADF81C00B5F803206283002802 -:10CCF00075D0904273D84FF0010B84F80AB0B5F8A4 -:10CD0000050020810020A073E06900F05BFD80B980 -:10CD1000E16942F6010081F806B0E2694FF4205162 -:10CD20009180E16981F80AB0E1690881E169002038 -:10CD30008873F01F20841E984FF0070B6062A4F8E0 -:10CD400022B00A9801F001F889F800B0012083466A -:10CD500004900020ADF846002AE026E2B0E147E169 -:10CD6000EDE01FE2B0E088E04FE000BFBBF1010F53 -:10CD700015D0E0698079012803D1BDF84400ADF8F1 -:10CD80000E0004990420CDE9000103AB4A46414658 -:10CD90001B98FFF7E5FB0498001D80B20490BDF8D6 -:10CDA0004600ADF80C00ADF80E0005981FFA80FBA8 -:10CDB00011AB1D9A0A991B9800F0CAFF28B939884F -:10CDC0000BF1040005908142D0D2BBF1010F3FF47A -:10CDD0001BAFE0698079012808D001E098E023E0EA -:10CDE000BDF84410A1F57F40FF3803D1BDF84400E1 -:10CDF000ADF80E0004990420CDE9000103AB4A46CA -:10CE000041461B98FFF7ACFB62E7072E01D0152EB9 -:10CE10007ED1B5F801102183ADF81C10B5F80320C0 -:10CE2000628309B1914201D90120EFE60121A1728B -:10CE3000A4F808B084F80EB0052E07D0C0B2691D62 -:10CE4000E26905F069FA00287FF4DEAE4FF6FF7064 -:10CE5000208401A806AA09A9CDF800B080E88603BD -:10CE60002878214600F03F031D9A1B98FFF790FB9E -:10CE70008246208BADF81C0088E10120032EC7D12B -:10CE80004021ADF82410B5F801102183ADF81C1035 -:10CE90000AAAB8F1000F00D00023CDE902030492E2 -:10CEA0001D98CDF80480009038880022401E83B27F -:10CEB0001B9800F0CDFF8DF8180050BB0B2189F8AE -:10CEC0000010BDF8280038E04FF0010C052E9FD16E -:10CED0008020ADF82400B5F801102183B5F80300D7 -:10CEE0002084ADF81C10B0F5007F01D907208DE635 -:10CEF00040F47C42228412A8B8F1000F00D0002335 -:10CF0000CDE90330CDE9018C1D980090388801E00F -:10CF10009CE007E0401E83B21B9800F099FF8DF85B -:10CF2000180028B18328A7D10220C7E050000020B4 -:10CF30000D2189F80010BDF84800401C25E1C80902 -:10CF400000EB40020EEB8200B04203D948067DD5CB -:10CF500058461AE1B5F80110ADF81C102A785206AF -:10CF600008D506228DF830202A78120605D58DF8CE -:10CF700030B02FE107228DF830200323CDE9023BAA -:10CF8000DDF878C0CDF810B01D9AA6EB000800922D -:10CF9000CDF804C01FFA88F300221B9800F02EFD84 -:10CFA0008DF818008DF830B0297849060DD5208805 -:10CFB000C00506D5208BBDF81C10884201D1C4F8ED -:10CFC00024B058468DF818B0DFE0832801D14FF027 -:10CFD000020A4FF48070ADF82400BDF81C002083D5 -:10CFE000A4F820801E986062032060841321C9E0A9 -:10CFF000052E2BD3B5F80110ADF81C10A28F32B35B -:10D00000A2F57F43FE3B29D008228DF8302005236E -:10D01000CDE9023BDDF878C0CDF810B01D9A80B2A2 -:10D02000CDF804C040F400430092B5F803201B98EB -:10D0300000F0E4FC4FF400718DF818008DF830B06A -:10D04000ADF82410832813D010B301E0DBE005E035 -:10D05000A08FA0F57F41FE3907D0D9E00B228DF8D3 -:10D0600030204FF6FE72A287D1E7A4F83CB0CFE0A3 -:10D0700000942B4631461E9A1B98FFF770FB8DF8E3 -:10D08000180008B183284BD1BDF81C0020834BE762 -:10D0900000942B4631461E9A1B98FFF760FB8DF8D3 -:10D0A0001800E8BBE18FA06B0844831D8DE888035E -:10D0B0004388828801881B98FFF753FC824665E00D -:10D0C00095F80180022E6FD15FEA080002D0B8F116 -:10D0D000010F7FD109208DF8300007A800908DF84E -:10D0E00034804346002221461B98FFF71CFC8DF834 -:10D0F00036008DF837B050B9B8F1010F11D0B8F142 -:10D10000000F04D1A08FA0F57F41FF3909D0A08F77 -:10D1100038B14FF480608DF830B0ADF824000EE0E7 -:10D1200034E00CA91B98F9F7BFFF82464FF48060EA -:10D130008DF830B0ADF82400BAF1020F06D0FB48EC -:10D140000068C07928B18DF8180027E0A4F818808D -:10D1500042E0BAF1000F03D081208DF818003BE0C7 -:10D1600007A800904346012221461B98FFF7DBFBEE -:10D170008DF8180021461B98FFF7BDFB9DF818009D -:10D1800020B9192189F80010012038809DF830005D -:10D1900020B10CA91B98F9F787FF8246BAF1000F5E -:10D1A00033D019E0062031E514E02078000711D5CE -:10D1B000012E0FD10A208DF83000E088ADF8340040 -:10D1C00004201B9907F000F80820ADF824007FE543 -:10D1D000480618D54FF0040A2088BDF824100843EB -:10D1E0002080BDF8240080050BD5A18FA1F57F40DC -:10D1F000FE3806D11E98E06228982063A6864FF07C -:10D20000030A504697E4042000E59DF8180078B121 -:10D21000012089F80000297889F80110BDF81C1058 -:10D22000A9F802109DF8180089F80400052038803C -:10D230002088BDF8241088432080E2E72DE9FF4FC5 -:10D240008846087895B0012181404FF20900249C5E -:10D250000140ADF820102088DDF88890A0F57F42CD -:10D260004FF0000AFF3A02D029B1000703D5012090 -:10D2700019B0BDE8F08F239E4FF0000B0EA886F882 -:10D2800000B018995D460988ADF83410A7498DF8AB -:10D290001CB0179A0A718DF838B0086098F8000031 -:10D2A00001283BD0022809D003286FD1307820F024 -:10D2B0003F001D303070B8F80400E08098F800108E -:10D2C0000320022904D1317821F03F011B31317054 -:10D2D00094F84610090759D505ABB9F1000F13D0E2 -:10D2E000002102AA82E80B000720CDE90009BDF861 -:10D2F0003400B8F80410C01E83B20022159800F064 -:10D30000A7FD0028D1D101E0F11CEAE7B8F804003C -:10D31000A6F80100BDF81400C01C04E198F805103F -:10D320008DF81C1098F80400012806D04FF4007AFC -:10D3300002282CD00328B8D16BE12188B8F8080066 -:10D3400011F40061ADF8201020D017281CD3B4F8D8 -:10D350004010814218D3B4F84410172901D38142F8 -:10D3600012D1317821F03F01C91C3170A6F80100BB -:10D370000321ADF83410A4F8440094F8460020F0DE -:10D38000020084F8460064E105257DE176E120880D -:10D3900008F1080700F4FE60ADF8200010F0F00F6F -:10D3A0001BD010F0C00F03D03888228B9042EBD1F5 -:10D3B00099B9B878C00710D0B9680720CDE902B193 -:10D3C000CDF804B00090CDF810B0FB88BA88398849 -:10D3D000159800F013FB0028D6D12398BDF8201033 -:10D3E000401C80294ED006DC10290DD020290BD0FE -:10D3F000402987D124E0B1F5807F70D051456DD0B0 -:10D40000B1F5806F97D1DDE0C80601D5082000E0B6 -:10D41000102082460DA907AA0520CDE902218DF82A -:10D420003800ADF83CB0CDE9049608A93888CDE9BC -:10D4300000015346072221461598FFF7A9F8A7E0F7 -:10D440009DF81C2001214FF00A0A002A9BD105AB50 -:10D45000B9F1000F00D00020CDE902100720CDE97E -:10D460000009BDF834000493401E83B2218B0022D2 -:10D47000159800F0EDFC8DF81C000B203070BDF805 -:10D48000140020E09DF81C2001214FF00C0A002A16 -:10D4900022D113ABB9F1000F00D00020CDE902106A -:10D4A0000720CDE900090493BDF83400228C401E0A -:10D4B00083B2218B159800F0CBFC8DF81C000D2059 -:10D4C0003070BDF84C00401CADF8340005208DF8DC -:10D4D0003800208BADF83C00BBE000E028E0388845 -:10D4E000218B88427FF450AF9DF81C004FF0120A48 -:10D4F00000281AD1606A98B1B878C0073FF444AFE9 -:10D50000BA680720CDE902B2CDF804B00090CDF89A -:10D5100010B0FB88BA88159800F070FA8DF81C00DE -:10D52000132030700120ADF8340092E0500000204C -:10D530003988208B8142D5D19DF81C004FF0160A06 -:10D540000028A06B08D0E0B34FF6FF7000215F46C3 -:10D55000ADF808B0019027E068B1B978C907C1D12A -:10D56000E18F0DAB0844821D03968DE80C024388C1 -:10D570008288018809E0B878C007BFD0BA680DABCF -:10D5800003968DE80C02BB88FA881598FFF7E9F935 -:10D5900005005ED0072D72D076E0019005AA02A9A1 -:10D5A0002046FFF71FF90146E28FBDF808008242CE -:10D5B00001D00029F1D0E08FA16B084407800198C9 -:10D5C000E08746E09DF81C004FF0180A40B1208B20 -:10D5D000C8B13888208321461598FFF78CF938E0C8 -:10D5E00004F118000090237E012221461598FFF7D0 -:10D5F0009AF98DF81C000028EDD119203070012017 -:10D60000ADF83400E7E7052521461598FFF773F9D3 -:10D610003AE0208800F40070ADF8200050452DD18C -:10D62000A08FA0F57F41FE3901D006252CE0D8F867 -:10D6300008004FF0160A48B1A063B8F80C10A18793 -:10D640004FF6FF71E187A0F800B002E04FF6FF70DF -:10D65000A087BDF8200030F47F611AD07823002223 -:10D660000420159906F006FD98F800002071208826 -:10D67000BDF82010084320800EE000E00725208838 -:10D68000BDF8201088432080208810F47F6F1CD0C4 -:10D690003AE02188814321809DF8380020B10EA90D -:10D6A0001598F9F701FD05469DF81C000028EBD000 -:10D6B00086F801A001203070208B70809DF81C003E -:10D6C00030710520ADF83400DEE7A18EE1B1189885 -:10D6D0000DAB0088ADF834002398CDE90304CDE903 -:10D6E0000139206B0090E36A179A1598FFF7F2F959 -:10D6F000054601208DF838000EA91598F9F7D4FCDD -:10D7000000B10546A4F834B094F8460040070AD5A5 -:10D710002046FFF796F910F0760F04D114F8460F63 -:10D7200020F0040020701898BDF8341001802846BD -:10D730009EE500B585B0042806D102208DF80000D2 -:10D7400088B26946F9F7B0FC05B000BD10B5384C99 -:10D750000B782268012B02D0022B2AD111E013781A -:10D760000BB1052B01D10423137023688A889A809A -:10D770002268CB88D38022680B8913814989518123 -:10D780000DE08B8893802268CB88D38022680B8938 -:10D7900013814B8953818B899381096911612168B8 -:10D7A000F9F782FC226800210228117003D00028BA -:10D7B00000D0812010BD832010BD806B002800D0D8 -:10D7C000012070478178012909D10088B0F5205FD8 -:10D7D00003D042F60101884201D1002070470720A2 -:10D7E0007047F0B587B0002415460E460746ADF8E1 -:10D7F000144010E0069801882980811DCDE902417E -:10D800000721019404940091838842880188384656 -:10D8100000F0F4F830B906AA05A93046FEF7E2FF99 -:10D820000028E7D0822800D1002007B0F0BD00001A -:10D830005000002010B58B7883B102789A4205D150 -:10D840000B885BB102E08B79091D4BB18B789A4252 -:10D85000F9D1B0F801300C88A342F4D1002010BDFA -:10D86000812010BD072826D012B1012A27D103E05C -:10D87000497801F0070102E04978C1F3C2010529A6 -:10D880001DD2DFE801F00318080C12000AB10320D2 -:10D8900070470220704704280DD250B10DE00528D2 -:10D8A00009D2801E022808D303E0062803D00328EB -:10D8B00003D005207047002070470F20704781205B -:10D8C0007047C0B282060BD4000607D5FE48807AA6 -:10D8D0004143C01D01EBD00080B27047084670473D -:10D8E0000020704770B513880B800B781C0625D577 -:10D8F000F54CA47A844204D843F01000087000204C -:10D9000070BD956800F0070605EBD0052D78F54051 -:10D9100065F304130B701378D17803F0030341EA25 -:10D92000032140F20123B1FBF3F503FB15119268CB -:10D93000E41D00FB012000EBD40070BD906870BDB9 -:10D9400037B51446BDF8041011809DF804100A067E -:10D950001ED5C1F30013DC49A568897A814208D835 -:10D96000FE2811D1C91DC9085A422846F5F73FFBC8 -:10D970000AE005EBD00100F0070201250878954088 -:10D98000A843934018430870207820F010002070BE -:10D990003EBD2DE9F0410746C81C0E4620F00300AD -:10D9A000B04202D08620BDE8F081C74D0020344649 -:10D9B0002E60AF802881AA72E8801AE0E988491CAD -:10D9C000E980810614D4E17800F0030041EA0020E8 -:10D9D00040F20121B0FBF1F201FB12012068FFF7D8 -:10D9E00070FF2989084480B22881381A3044A06029 -:10D9F0000C3420784107E1D40020D4E72DE9FF4F13 -:10DA000089B01646DDE9168A0F46994623F440454B -:10DA1000084600F00DFB04000FD0099802F0E6FF65 -:10DA20000290207800060AD5A748817A02988142A0 -:10DA300005D887200DB0BDE8F08F0120FAE7224617 -:10DA400001A90298FFF74EFF834600208DF80C00D5 -:10DA50004046B8F1070F1AD001222146FFF702FF16 -:10DA60000028E7D12078400611D502208DF80C005F -:10DA7000ADF81070BDF80400ADF81200ADF81460F8 -:10DA80001898ADF81650CDF81CA0ADF818005FEA54 -:10DA9000094004D500252E46A84601270CE0217830 -:10DAA000E07801F0030140EA012040F20121B0FBDF -:10DAB000F1F2804601FB12875FEA494009D5B8457B -:10DAC00007D1A178207901F0030140EA0120B0429A -:10DAD00001D3BE4201D90720ACE7A8191FFA80F98B -:10DAE000B94501D90D20A5E79DF80C0028B103A97F -:10DAF0000998F9F7D7FA00289CD1B84507D1A07842 -:10DB00004FEA192161F30100A07084F804901A987B -:10DB100000B10580199850EA0A0027D0199830B151 -:10DB20000BEB06002A46199913F0E6FF0EE00BEB0B -:10DB300006085746189E099803F09AF82B46F61DDA -:10DB4000B5B239464246009502F031FC224601A9A1 -:10DB50000298FFF7C7FE9DF80400224620F010004F -:10DB60008DF80400DDE90110FFF7EAFE002061E70F -:10DB70002DE9FF4FDFF8509182461746B9F806109D -:10DB8000D9F8000001EB410100EB810440F20120D3 -:10DB9000B2FBF0F185B000FB11764D46DDF84C800C -:10DBA00031460698FFF78DFE29682A898B46611A4F -:10DBB0000C3101441144AB8889B28B4202D88420D5 -:10DBC00009B038E70699CDB2290603D5A90601D5D3 -:10DBD0008520F5E7B9F806C00CF1010C1FFA8CFCA2 -:10DBE000A9F806C0149909B1A1F800C0A90602D588 -:10DBF000C4F8088007E0104480B2A9F80800191A98 -:10DC000001EB0B00A0602246FE200699FFF798FE6C -:10DC1000E77026712078390A61F30100320AA17891 -:10DC200040F0040062F30101A17020709AF8020034 -:10DC30006071BAF80000E08000262673280602D53D -:10DC400099F80A7000E00127A80601D54FF00008F6 -:10DC50004D4600244FF007090FE0CDE90268019618 -:10DC6000CDF800900496E9882046129B089AFFF7A9 -:10DC7000C5FE0028A4D1641CE4B2BC42EDD3002050 -:10DC80009EE72DE9F047804600F0D2F9070005D065 -:10DC9000002644460C4D40F2012919E00120BDE860 -:10DCA000F087204600F0C4F90278C17802F0030240 -:10DCB00041EA0222B2FBF9F309FB13210068FFF7E6 -:10DCC00000FE304486B201E0BC060020641CA4B211 -:10DCD000E988601E8142E4DCA8F10100E88028891F -:10DCE000801B288100203870D9E710B5144631B167 -:10DCF000491E218002F07AFEA070002010BD012094 -:10DD000010BD10B5D24904460088CA88904201D39C -:10DD1000822010BD096800EB400001EB80025079C1 -:10DD2000A072D08820819178107901F0030140EA37 -:10DD30000120A081A078E11CFFF7D4FD206120889C -:10DD4000401C2080E080002010BD0121018270472E -:10DD50002DE9FF4F85B04FF6FF788246A3F800808B -:10DD600048681F460D4680788DF806004868008890 -:10DD7000ADF8040000208DF80A00088A0C88A04243 -:10DD800000D304462C8241E0288A401C2882701D62 -:10DD90006968FFF74FFDB8BB3988414501D1601E66 -:10DDA00038806888A04236D3B178307901F0030119 -:10DDB00040EA012901A9701DFFF73CFD20BB29891C -:10DDC00041452CD0002231460798FFF74BFDD8B9CA -:10DDD0002989494518D1E9680391B5F80AC0D6F8F0 -:10DDE00008B05046CDF800C002F042FFDDF800C098 -:10DDF0005A460CF1070C1FFA8CFC4B460399CDF8E0 -:10DE000000C002F097FA50B1641CA4B2204600F0A2 -:10DE10000FF90600B8D1641E2C828220D0E67C80E7 -:10DE20007079B871F088B8803178F07801F003012A -:10DE300040EA01207881A7F80C90504602F0D6FD08 -:10DE4000324607F10801FFF74DFD38610020B7E6C3 -:10DE50002DE9FF4F87B081461C469246DDF860B041 -:10DE6000DDF85480089800F0E3F805000CD048462F -:10DE700002F0BCFD2978090608D57549897A8142E6 -:10DE800004D887200BB0D6E50120FBE7CAF30906CA -:10DE90002A4601A9FFF726FD0746149807281CD03B -:10DEA00000222946FFF7DEFC0028EBD12878400647 -:10DEB00013D501208DF808000898ADF80C00BDF8C6 -:10DEC0000400ADF80E00ADF81060ADF8124002A9E4 -:10DED0004846F9F7E7F80028D4D12978E87801F026 -:10DEE000030140EA0121AA78287902F0030240EAFE -:10DEF0000220564507D0B1F5007F04D9611E81424A -:10DF000001DD0B20BEE7864201D90720BAE7801B5E -:10DF100085B2A54200D92546BBF1000F01D0ABF870 -:10DF20000050179818B1B9192A4613F0E5FDB8F159 -:10DF3000000F0DD03E4448464446169F02F0AAFE0C -:10DF40002146FF1DBCB232462B46009402F068FA0F -:10DF5000002097E72DE9F04107461D461646084682 -:10DF600000F066F804000BD0384602F03FFD21783F -:10DF7000090607D53649897A814203D8872012E5F8 -:10DF8000012010E522463146FFF7ACFC65B121784F -:10DF9000E07801F0030140EA0120B0F5007F01D8EC -:10DFA000012000E0002028700020FCE42DE9F04171 -:10DFB00007461D461646084600F03AF804000BD006 -:10DFC000384602F013FD2178090607D52049897AE1 -:10DFD000814203D88720E6E40120E4E4224631466A -:10DFE000FFF7AEFCFF2D14D02178E07801F003029A -:10DFF00040EA022040F20122B0FBF2F302FB1300E0 -:10E0000015B900F2012080B2E070000A60F301014E -:10E0100021700020C7E410B50C4600F009F828B1C3 -:10E02000C18821804079A070002010BD012010BD62 -:10E030000749CA88824209D340B1096800EB400011 -:10E040006FF00B0202EB800008447047002070471D -:10E05000BC06002010B50C4601F03AFD80B3204606 -:10E0600000F0B7FA68B32278102A09D0112A07D035 -:10E07000022A05D0032A03D0162A2ED0FFDF1DE086 -:10E08000A0781E282BD00EDC0C2824D008DC092810 -:10E0900027D2DFE800F013261726261E1E1A1C00C2 -:10E0A00012281ED11BE0302819D01ADDA0F13A0049 -:10E0B000032816D2DFE800F011150B00002010BD78 -:10E0C00013E010E043F20200F9E70420F7E70D2027 -:10E0D000F5E70F20F3E70820F1E71120EFE707202D -:10E0E000EDE70320EBE7FFDFE8E7FFDFE6E700F01F -:10E0F00070BA70B50346002002466FF02F050EE09F -:10E100009C5CA4F130060A2E02D34FF0FF3070BDA4 -:10E1100000EB800005EB4000521C2044D2B28A4242 -:10E12000EED370BD30B50A240AE0B0FBF4F304FB73 -:10E1300013008D18303005F8010C521E1846D2B26B -:10E14000002AF2D130BD30B500234FF6FF7510E044 -:10E15000040A44EA002084B2C85C6040C0F303149F -:10E16000604005EA00344440E0B25B1C84EA4010A1 -:10E170009BB29342ECD330BD10B50AF0FFF90428EE -:10E1800003D00AF0FBF9052802D108F0A0FC28B959 -:10E190000BF056FB20B107F047FB08B1012010BD82 -:10E1A000002010BD0178406819B190F8721059B97B -:10E1B00001E001F017BD90F8041129B190F80401B5 -:10E1C000042801D0012070470020704770B50C462C -:10E1D0000546062102F042FC606008B1002006E01E -:10E1E0000721284602F03AFC606018B10120207037 -:10E1F000002070BD022070BD2DE9FC470C4606468C -:10E200006946FFF7E3FF00287DD19DF8000050B17B -:10E2100007F09CFAB0427CD0214630460EF0A1F9BE -:10E22000002873D12DE008F065F9B04271D0214685 -:10E2300030460CF041FC002868D1019D95F8C800DB -:10E2400022E0012000E00020804695F835004FF0E4 -:10E25000010A4FF00009F0B195F8360080071AD591 -:10E2600084F8019084F800A084F80290A68095F8C4 -:10E270003710A171298F2181698F618185F83590CF -:10E2800044E0019D95F8040158350028DBD1A87EB3 -:10E290000028D8D0D5E7304602F0FCFC070000D1BA -:10E2A000FFDF384601F051FE40B184F801900E21A5 -:10E2B0002170A680E08084F802A027E0304602F0BA -:10E2C000D7FC070000D1FFDFB8F1000F21D038469E -:10E2D00001F0CCFEB8B19DF8000038B90198D0F833 -:10E2E000F0004188B14201D180F80090304607F03B -:10E2F000C3F884F801900B21217084F80290A68065 -:10E30000E97EA17100E004E085F81A900120BDE8E3 -:10E31000FC870020FBE71CB56946FFF757FF00B1FB -:10E32000FFDF684601F06CFCF94900208968A1F81C -:10E33000CA001CBD2DE9FC4104460E46062002F031 -:10E3400037FB0546072002F033FB2844C7B20025FF -:10E35000A8463E4417E02088401C80B22080B0428E -:10E3600002D34046A4F8008080B2B84204D3B04241 -:10E3700002D20020BDE8FC816946FFF727FF002894 -:10E38000F8D06D1CEDB2AE42E5D84FF6FF7020809C -:10E390001220EFE738B54FF6FF70ADF800000DE042 -:10E3A0000621BDF8000002F06BFB04460721BDF812 -:10E3B000000002F065FB0CB100B1FFDF00216846F0 -:10E3C000FFF7B8FF0028EBD038BD2DE9F047D1A109 -:10E3D0000F79D1F8008007F0BDF810F003F8CF4CAA -:10E3E0004FF004091020A4F8389060874FF6FF76AC -:10E3F000A4F85460A4F85660002584F8315004F85D -:10E400002E5BC6492570A5713E39A573C1F87B8086 -:10E4100081F87F707B31481E0CF029FD25751B208B -:10E42000E0824FF4A47121836083A1830321A1774B -:10E4300084F81F9020846084B848A1843E38057019 -:10E440004680B3480C300570B448103805704680DB -:10E45000BDE8F08770B5AE4C0D466060217006F0E7 -:10E46000F3FFFFF797FFFFF7B0FF207809F031FDCA -:10E4700008F02EF9217860680CF00CFC20780FF081 -:10E4800011FA28460AF071FE07F06AF921786068EF -:10E490000EF068F9BDE870400FF0A4BF10B501247C -:10E4A0000AB1002010BD21B1012903D0002420466B -:10E4B00010BD022111F0C6FBF9E72DE9F047040079 -:10E4C00000D1FFDF954D002695F8310058B16670F8 -:10E4D0001620207095F83200A07095F83300E07097 -:10E4E00085F8316068E0287840B12C22A91C2046CC -:10E4F00013F002FB102020702E705DE095F82E00C6 -:10E5000060B10120E07095F82F00A07095F8300000 -:10E5100060701120207085F82E604DE07F48022148 -:10E5200056308246FFF706FF00B1FFDFB5F8569080 -:10E53000062002F03DFA0746072002F039FA384477 -:10E54000C7B2781C00F0FF08B5F85600B84212D1E7 -:10E55000204607F04BFF50BB95F8340070B366704F -:10E56000132020702021A01C13F03DFB0220A0707E -:10E5700085F8346020E040451AD1204607F09CF829 -:10E58000E0B12078132817D1A0783C2814D1A088B6 -:10E59000072102F063FA050000D1FFDF288806F0AA -:10E5A0006BFFA088072102F06BFA00B1FFDF03E0E8 -:10E5B0002146FFF721FE08B1012049E7022150461C -:10E5C000FFF7B8FE18B9B5F856104945BCD1002080 -:10E5D0003EE772E710B5514C207828B10A21BDE81A -:10E5E0001040102001F0A1BAFFF7C6FD08B10C20C1 -:10E5F00002E00FF042FF00202071012060710A212B -:10E60000E170207010BD70B5444D0446287828B1E3 -:10E61000BDE870403221102001F087BA207818B18F -:10E62000012801D0122010E001F090FA20B110F082 -:10E630006EF808B10C2008E0207801F057FA04F1D8 -:10E640001703E21D611C0FF06FFF28710120687134 -:10E650003221E970287070BD70B5304C05462078C5 -:10E6600028B1BDE870400B21102001F05EBA287877 -:10E6700018B1012801D012200EE0FFF77DFD08B18E -:10E680000C2009E0287801F031FA691C0FF0BCFE7B -:10E6900008B1002000E007202071012060710B21EB -:10E6A000E170207070BD10B51C4C217829B130216B -:10E6B000BDE81040102001F038BA008810F02AF8A8 -:10E6C000302110B10020207100E021710120607123 -:10E6D000E170207010BD70B5104C0546207828B14F -:10E6E000BDE870403121102001F01FBA01F02EFA70 -:10E6F00008B10C2005E0287800F0010010F004F8C3 -:10E7000000202071012060713121E170207070BD06 -:10E7100058000020FFFFFFFF1F0000000607002039 -:10E7200010B5FB4C207828B13421BDE810401020F2 -:10E7300001F0FBB901F00AFA20B10FF0E8FF08B1CF -:10E740000C2002E00FF044FF0020207101206071D6 -:10E750003421E170207010BDED48017819B10F210E -:10E76000102001F0E2B900210171102181700F2108 -:10E77000C170FF2181714FF6FF710181E549496840 -:10E780000A7882728A8882814988C1810121417117 -:10E790000170704710B5DE4C207828B12B21BDE800 -:10E7A0001040102001F0C1B90821A01D05F029FA80 -:10E7B00000202071012060712B21E170207010BDBC -:10E7C00070B5D34C217829B1BDE8704043211020A9 -:10E7D00001F0ABB990F90000042816D0032814D03A -:10E7E00098B1011D11D010F1080F0ED010F10C0FCF -:10E7F0000BD010F1100F08D010F1140F05D010F14C -:10E80000280F02D01220207103E0002506F020F826 -:10E8100025714320E07001206071207077E710B50A -:10E82000BB4C217829B12A21BDE81040102001F00D -:10E830007CB9A31D012200F1100110F03AFE002066 -:10E8400020711020A0702A20E070012060712070DB -:10E8500010BD70B5AE4C0546207828B1BDE87040BB -:10E860004621102001F061B909F088FE052804D086 -:10E87000284609F01BFB002000E00C20207101203D -:10E8800060714621E170207041E770B5A04C0546EB -:10E89000207828B1BDE870404421102001F045B92E -:10E8A00001F054F938B10C2020710120607144212D -:10E8B000E17020702BE72946002006F04CFE002076 -:10E8C000F2E770B5924C0546207828B1BDE870405B -:10E8D0004221102001F029B909F091FB50B10AF052 -:10E8E000A2FF38B128780AF064FC287808F026F9ED -:10E8F000002000E00C202071012060714221E170B5 -:10E90000207004E770B5824C0546207828B1BDE838 -:10E9100070401721102001F008B901F017F938B143 -:10E920000C202071012060711721E1702070EEE64B -:10E930002946012006F00FFE0020F2E738B5744D9D -:10E940000446287828B1BDE838404D21102001F058 -:10E95000ECB8A079E179884213D021791F2910D829 -:10E9600061791F290DD80022114612F0C7FA40B96B -:10E970000022E079114612F0C1FA10B9207A072876 -:10E9800001D9122012E04FF6FF70ADF800000AF036 -:10E9900057FF90B909F0F2FD78B900216846FFF7FA -:10E9A000C9FC50B1204605F070FE002028710120FE -:10E9B00068714D21E970287038BD0C20F6E72DE90B -:10E9C000FC47534C054694F82E0020B12821112015 -:10E9D00001F0ABF89BE4282084F83000012184F892 -:10E9E0002E10A8784FF000091A2825D00EDC162822 -:10E9F00031D2DFE800F0303030303021303030308C -:10EA00003030303030303030302121212A2822D0AF -:10EA10000BDCA0F11E000C281DD2DFE800F01C1C4E -:10EA20001C1C1C1C1C1C1C1C1C0D3A38042812D25B -:10EA3000DFE800F0110211022888B0F5706F0AD2E9 -:10EA40001F20884684F82F0028886946FFF7BEFB00 -:10EA500018B1022019E0122017E09DF80000019F74 -:10EA6000002806D007F5B377019E05D106F1ED0623 -:10EA700004E007F1EC07F7E706F267166846FFF7D0 -:10EA800091FB08B1387818B10C2084F82F003EE4CF -:10EA900087F80080A878307084F82F90684601F0DD -:10EAA000AFF834E47CB51A4C0546207820B1252116 -:10EAB000102001F03AF87CBD28886946FFF786FBF4 -:10EAC000020013484FF00001A0F13E000DD00222D9 -:10EAD000227140F8461F0171E1801020A0702520AE -:10EAE000E0700120607120707CBD019A134658329D -:10EAF00082F83E109E68C0F846601E7B80F84A602F -:10EB000092F83E60002EF3D12888E080E5E700000F -:10EB1000060700205800002010B540B10478406876 -:10EB200013B1B0F8480003E0B0F84A0000E0FB2061 -:10EB30001B2908D3814206D8B2F5A47F03D340F63F -:10EB40004800824201D9122010BD002010BD2DE9DD -:10EB5000FC41FA4D0446287828B1BDE8FC4150211B -:10EB6000102000F0E2BF4FF0010885F805801F215A -:10EB700029711021A9705021E9702188E98085F858 -:10EB8000008020886946FFF721FB08B102200DE0D4 -:10EB90002289E18801236846FFF7BEFF30B9A288C9 -:10EBA000618800236846FFF7B7FF10B12871BDE800 -:10EBB000FC819DF800103A20019E002749B186F89B -:10EBC0008981019991F8C81106F5C476B9B1287107 -:10EBD00013E086F8FD80019991F82011FC36002998 -:10EBE000F5D12F71E08870802089B0806088F08036 -:10EBF000A0883081012201990CE07770D7E72F714E -:10EC0000E08870802089B0806088F080A0883081A2 -:10EC100001990022304610F091FD86F80080ECE763 -:10EC200070B5C64D044686B0287830B106B0512183 -:10EC3000BDE87040102000F078BF01206871002608 -:10EC40002E711021A9705121E9702870208803A924 -:10EC5000FFF7BCFA18B10220287106B057E59DF8FD -:10EC60000C0040B100220499E088B1F84830984285 -:10EC700003D9C01A02E00122F5E70020E88063888A -:10EC8000B1F84A00834201D9181A00E00020288117 -:10EC9000009601960296E088ADF802002089ADF852 -:10ECA00004006088ADF80600A088ADF8080068464A -:10ECB00010F044FD2089BDF80410401A6881A08836 -:10ECC000BDF80810401AA881E088BDF80210401A6B -:10ECD000E988884200DC0846E8806088BDF80610B4 -:10ECE000401A2989884200DC08462881B5E770B5BA -:10ECF000924D0446287828B1BDE870403E2110208E -:10ED000000F013BF00F022FF20B10FF000FD08B1AA -:10ED10000C2008E0E2792078611C0FF07BFE08B13E -:10ED2000002000E002202871012068713E21E97076 -:10ED30002870ECE47CB5814C05461F2084F82F0038 -:10ED400028886946FFF742FA18B1022084F82F009C -:10ED50007CBDAA7802B90322EB7803B903239DF89E -:10ED600000603A2501210020002E019E06D086F881 -:10ED70009311019E96F8DC6146BB1FE086F80711EF -:10ED8000019E96F82C613EB9019E96F806611EB967 -:10ED9000019E96F87B6016B184F82F500AE0019D21 -:10EDA00085F80611019981F80821019981F8093146 -:10EDB00084F82F00019981F807017CBD019E96F827 -:10EDC00092611EB9019E96F87B6016B184F82F50AF -:10EDD0000AE0019D85F89211019981F89421019929 -:10EDE00081F8953184F82F00019981F893017CBD59 -:10EDF000524930B491F82E2022B1562130BC112056 -:10EE000000F093BE562281F83020012281F82E2096 -:10EE10008378DA0802D1C278D40801D0122004E045 -:10EE20005B0701D4520704D5112081F82F0030BCB4 -:10EE3000704730BC7EE770B5404C0546207828B15D -:10EE4000BDE870401D21102000F06FBE1F20207112 -:10EE5000012060711D21E170207009F08FFB0428F2 -:10EE60000BD0052809D0A9791220012907D031B18A -:10EE7000022904D0032929D101E00C2026E02978B9 -:10EE800009B1012922D1E97929B1012903D0022947 -:10EE900001D003291AD1698843F6FD720B1F302077 -:10EEA000934213D2AB881B1F93420FD22187A888AD -:10EEB0006087A87907F065FDE87907F0D0FD28782C -:10EEC000012805D00120002107F0F8FD20711EE483 -:10EED0000220F8E770B5194C217829B1BDE87040DF -:10EEE0001E21102000F021BE1F212171012161711E -:10EEF0001E22E270217002781221012A00D01AB974 -:10EF0000407818B1012801D0217187E40025012A39 -:10EF100009D009F033FB0C26052802D008F008FFC1 -:10EF200088B126717AE407F022FD48B107F031FD7F -:10EF3000618F208F09F070F803E0000006070020C1 -:10EF4000122020716AE4257168E42DE9F047F94C3C -:10EF500007469246B4F84400B7F84A200E4690425D -:10EF600000D31046804697F85210104600F0D4FDAA -:10EF7000B4F84610814200D208460546A146B4F8CE -:10EF80004840B7F84800844200D3044697F851102F -:10EF900000F0C2FDB9F84A10814200D208464FF491 -:10EFA000A4721B2C01D0904204D1B8F11B0F0DD0DC -:10EFB00095420BD0A6F8068035817480B080524609 -:10EFC0003946304610F0BAFB01203070BDE8F087BA -:10EFD0002DE9F04786B00546AFF6C800D0E90090AD -:10EFE000D44E804696F82E0028B12121112000F041 -:10EFF0009CFD06B0EAE71F2086F82F00212086F846 -:10F0000030004FF0010A86F82EA0284600F007FED7 -:10F01000002811D109F0B2FA05280CD009F0AEFA97 -:10F02000042808D096F8340028B907F063FAA0F550 -:10F030007F41FF3901D00C20AAE0BE4801AA3E382A -:10F040000190BD480290BB4806211038039004A8E7 -:10F0500001F0D4FC04007DD003210FF0DAFFB6F8F4 -:10F060004E00A4F84800B6F85000A4F84A0096F8FC -:10F070004D00009096F84C30B6F85020B6F84E107F -:10F08000208801F07EFD00B1FFDF208806F0F3F953 -:10F09000218804F10E0000F068FDA8A004F1120719 -:10F0A000006800900321684604F033FD00206946A3 -:10F0B0000A5C3A54401CC0B20328F9D3288A608005 -:10F0C000688AA080A88AE08094F8522094F85110B1 -:10F0D000B6F8520009F01DF80146A062204609F07A -:10F0E00038F8002784F85E7084F85F70687900F063 -:10F0F000FDFC6076D5F80600C4F81A006889E08344 -:10F10000C4F8089084F80C8084F8F8A0012204F177 -:10F11000FC012046FFF719FF8DF8007001216846B9 -:10F1200004F0F7FC9DF8000000F00701C0F3C102F5 -:10F130001144C0F3401008448DF80000401D2076B3 -:10F14000092801D208302076002120460FF061FF07 -:10F15000287B00E010E007F014FC69792879AA1DEB -:10F1600007F0E5FB50B107F014FC69792879AA1D76 -:10F1700007F080FC78B118E0092009E0208806F04B -:10F180007BF92088062101F07BFC00B1FFDF122013 -:10F1900086F82F002DE72146032007F08FFC20B9C9 -:10F1A0006A882988204608F0C0FE86F82F000028CB -:10F1B000F0D0208806F060F92088062101F060FC7C -:10F1C0000028E7D0FFDF14E738B55A4C207820B18B -:10F1D0002221102000F0A9FC38BD1F20207101253C -:10F1E00065712220E070257094F8340018BB09F096 -:10F1F000C5F9052805D007F07DF9A0F57F41FF3955 -:10F2000019D000202071684608F055FF0028E3D18E -:10F210000098008806F030F900980621008801F077 -:10F220002FFC00B1FFDF444884F834500C380078DC -:10F23000FCF760FD38BD0C20207138BD2DE9F04190 -:10F240003C4D044695F82E0028B1BDE8F04123213D -:10F25000112000F06ABC1F2085F82F00232085F8BC -:10F260003000012085F82E00618840F67B438A1F1C -:10F2700030209A4252D2A288961F9E424ED291428C -:10F280004CD8E188B1F5FA7F48D2218940F677461B -:10F29000A1F10A03B34241D2B1EBD20F3ED9618949 -:10F2A000A28991423AD84FF000082088062101F047 -:10F2B000D5FB06004FF0020707D000F093FC20B109 -:10F2C000D6F8F000017841B903E085F82F70BDE869 -:10F2D000F081D6F83C11097809B13A201EE00521E9 -:10F2E0008171D6F8F0004146A0F80880D6F8F020E9 -:10F2F000A0885081D6F8F020E0889081D6F8F020E0 -:10F300002089D081D6F8F000028943899A4204D836 -:10F310008279082A01D89A4203D3122085F82F0057 -:10F32000D5E722884280D6F8F000077085F82F10C4 -:10F33000CDE7000006070020640000201122330002 -:10F34000FEB5F84C0646207820B12421102000F0AC -:10F35000ECFBFEBD012565712420E0702570304670 -:10F3600010F042F808B1002000E0122020710028BF -:10F37000EFD1EC4884F83C503E38316840F87B1FB0 -:10F3800031790171002684F83C606946062001F05D -:10F39000F0FA00B1FFDF684601F0C9FA60B9BDF8C4 -:10F3A0000470029880F8F850684601F0C0FA18B965 -:10F3B000BDF80400B842F4D12671FEBD2DE9F0413C -:10F3C000D84D064695F82E0028B1BDE8F0412C2115 -:10F3D000112000F0AABB1F2085F82F002C2085F8F3 -:10F3E0003000012085F82E003088062101F036FB20 -:10F3F000040007D000F0F6FB20B1D4F8F010087834 -:10F4000030B901E0022026E0D4F83C01007808B1D0 -:10F410003A2020E094200027005D10F0010F19D061 -:10F42000D6F802004860D6F80600886054F8F00F5D -:10F43000718910228181206806F10C010E3012F0D2 -:10F440005BFB21680320087021683088488085F8BC -:10F450002F703CE70C2085F82F0038E72DE9F041AC -:10F46000B04D04460C26287828B1BDE8F04118219B -:10F47000102000F05ABB0AF0E3F9012730BB607995 -:10F48000032824D8A179012921D8A17B03291ED8DA -:10F49000617BE1B107291AD82179052917D2DFE864 -:10F4A00001F0030C030303002288202A0FD3618894 -:10F4B0008A420CD8B1F5804F09D806F0D6F92079E8 -:10F4C00085F83600204606F098FA064600E0122637 -:10F4D0002E716F711820E8702F70F8E610B5914CFE -:10F4E000217829B11A21BDE81040102000F01DBB81 -:10F4F00001781F2902D91220207106E00021217114 -:10F500000278411C104606F0FCFA012060711A21B5 -:10F51000E170207010BD10B5824C217829B12021F6 -:10F52000BDE81040102000F000BB01781F2902D96F -:10F530001220207106E0002121710278411C104642 -:10F5400006F0CEFA012060712021E170207010BD1C -:10F550002DE9FC41734C217829B1BDE8FC411B2108 -:10F56000102000F0E2BA012767710C2121710078A8 -:10F5700000261225012802D0002866D167E006F097 -:10F5800024F900285ED006F056F900285AD00AF077 -:10F5900057F900286CD106F06FF994F8360050B195 -:10F5A000012808D0042806D0002009F005FE00B18B -:10F5B000FFDF26715CE006F0C9F8A0F57F41FF3956 -:10F5C00056D10022072101A801F018FA05004FD0FA -:10F5D00055480321856028460FF0E2FB284606F0D7 -:10F5E000BAFBB4F84E00A5F84800B4F85000A5F8EE -:10F5F0004A00B4F8520001214C3409F016FF0146CC -:10F60000A8620022284608F0CEFF6078009014F827 -:10F61000043B288834F8022934F84E1901F0B1FA75 -:10F6200000B1FFDF288805F026FF284609F0C4FD59 -:10F6300000B1FFDF2671002205F5C4712846FFF7EF -:10F6400084FC15E006F0C1F890B1257110E008F0D7 -:10F65000A7FF054609F0E8FC50B9267145B1288896 -:10F6600005F00AFF2888072101F00AFA00B1FFDF40 -:10F670001B20E0702770BDE8FC812DE9F041294C8A -:10F680000646207828B1BDE8F0412D21102000F079 -:10F690004CBA3088072101F0E1F905004FF001076D -:10F6A00020D095F8690140B995F86400142801D07C -:10F6B000152802D195F8AA0150B10C202071102014 -:10F6C000A0702D20E0703088E08067712770FEE523 -:10F6D0001022B11C05F5B57012F00EFA85F86971AB -:10F6E0000020EBE70220E9E770B50E4C05462078D4 -:10F6F00028B1BDE870402E21102000F016BA2888ED -:10F70000072101F0ABF90221A0B190F869212AB9D3 -:10F7100090F86420142A09D0152A07D00C202071F3 -:10F7200009E00000060700205800002080F8691159 -:10F730000020F4E721711020A0702E20E0702888AE -:10F74000E08001206071207070BD2DE9FC47FD4C08 -:10F750000646207828B13821102000F0E6F9BDE8EF -:10F76000FC8770884BF68032122190420AD848B14B -:10F770004FF0000830886946FEF728FD20B10220CE -:10F78000207110E021710EE0019800F15809851CEC -:10F790002F887288394648460FF0BCFA2888B8424C -:10F7A000F6D184F80480012060713821E170207066 -:10F7B000D5E77CB5E34C0546207820B149211020DF -:10F7C00000F0B3F97CBD28886946FEF7FFFC38B12C -:10F7D00002202071012060714921E17020707CBD00 -:10F7E00001987F22014680F8602080F86120002285 -:10F7F00080F86220A87801F82C0FE8784870287902 -:10F8000088702271E6E71CB5CE4C217821B15421D5 -:10F81000102000F08AF91CBD00886946FEF7D6FC6E -:10F8200048B102202071012060715421E170102143 -:10F83000A17020701CBD019890F8720000B10120E9 -:10F8400000212171A071EEE71CB5BE4C217821B1D9 -:10F850001321102000F069F91CBD00886946FEF7ED -:10F86000B5FC08B1022005E0019890F82C100129A0 -:10F8700002D00C20207106E0602100222271095C78 -:10F8800021720088E080012060711321E170102155 -:10F89000A17020701CBD2DE9F041AA4C05462078CE -:10F8A00028B1BDE8F0414A21102000F03EB9288877 -:10F8B000072101F0D3F8012358B382886D88C688E8 -:10F8C000418803EB4207BD4217D342F210777E43D3 -:10F8D000BF107943B6FBF1F1491E89B24FF4FA76B5 -:10F8E000B14200D931468D4200D22946491C521CF2 -:10F8F000B1FBF2F15143491E8AB290F8961101B959 -:10F900000284E2800020207163714A20E07023703D -:10F91000DDE40220F7E770B58A4C0546207828B16F -:10F92000BDE870404C21102000F0FFB82888072166 -:10F9300001F094F890B1A97811F0010180F8D71086 -:10F9400004D090F8D51009B109F08AFD002020718B -:10F95000012060714C21E170207070BD0220F6E73B -:10F9600078490A781AB15221102000F0DEB80278E6 -:10F970009AB142788AB142881B2A0ED382881B2A08 -:10F980000BD3C288022A08D36E4A0368423242F877 -:10F990000A3F40685060002000E0122008710120FA -:10F9A00048715222CA700870704770B5654C0546A0 -:10F9B000207828B1BDE870405321102000F0B5B880 -:10F9C000287800F0010008F0A1FB287800F0010081 -:10F9D00009F0F7FC00202071012060715321E170D3 -:10F9E000207070BD70B5574D0646287828B1BDE827 -:10F9F00070405521102000F098B8012270881146FF -:10FA000008F087FB04467088012109F00EFD84424E -:10FA100000D204463088012100F06FF8064601212B -:10FA2000002000F06AF8304401219630844206D963 -:10FA300000F19601201AB0FBF1F0401C81B2E98080 -:10FA400000202871012068715521E970287070BD6F -:10FA500070B53C4D0446287828B1BDE870404E2171 -:10FA6000102000F062B800F071F808B10C200DE031 -:10FA7000601C0EF0A5FF207800F0010005F0F8FEF4 -:10FA8000207800F0010006F080FF0020287101209E -:10FA900068714E21E970287070BD70B5294C05461B -:10FAA000207828B1BDE870404B21102000F03DB80F -:10FAB00009F0C6FE08B10C2003E0287806F031F802 -:10FAC00000202071012060714B21E170207070BD19 -:10FAD00010B50178572907D21B4A52F8211019B1E5 -:10FAE000801C8847012010BD002010BD18B10228DD -:10FAF00001D0012070470020704710B5012904D0C3 -:10FB0000022905D0FFDF204610BDC000503001E0C3 -:10FB100080002C3084B2F6E7022903D0C000703098 -:10FB200080B2704780003C30FAE7064A92F83130E4 -:10FB3000002B06D182F8320082F83310012082F8BF -:10FB40003100704706070020C420020010B508F0FD -:10FB500015FD042807D008F011FD052803D009F091 -:10FB60006FFE002800D0012010BD2DE9FE430025C6 -:10FB70000F4680460A260421404604F042F84046DB -:10FB80000FF00EFC062000F013FF044615E0694656 -:10FB9000062000F0EEFE0AE0BDF80400B84206D0F0 -:10FBA0000298042241460E3011F07AFF50B16846A7 -:10FBB00000F0BDFE0500EFD0641E002C06DD002D18 -:10FBC000E5D005E040460FF0F4FBF5E705B9FFDFAF -:10FBD000D8F800000FF0A8F8761E01D00028CAD08F -:10FBE000BDE8FE8390F8721041B990F8C81029B1B1 -:10FBF00090F8C800042801D00120A2E70020A0E767 -:10FC0000017801299DD1416891F8D520002A98D02A -:10FC1000002281F8D520406809F022BC91E710B598 -:10FC2000038843F6FD711A1F8A4223D24288141FAB -:10FC30008C421FD29A421DD8C28940F67B43911F45 -:10FC4000994217D2018A8C1F9C4213D28A4211D842 -:10FC5000428AB2F5FA7F0DD2828A40F67744A2F149 -:10FC60000A03A34206D2B2EBD10F03D9C18A028B99 -:10FC7000914201D9302010BD017911B1012910D173 -:10FC800007E0417929B1012903D0022901D00329D4 -:10FC900007D1007B38B1012805D0022803D0032802 -:10FCA00001D0122010BD002010BD00000844083013 -:10FCB000424301F14A00104480B27047F0B51D463E -:10FCC0000446A818059B083000FB03F205F14A0022 -:10FCD000104486B2B14238BFFFDF0027276067605B -:10FCE000A760E76027616761A761E76127624FF658 -:10FCF000FF706762A082A6F1280080B265776080FD -:10FD0000B0F5004F88BFFFDF608805F13C018842F5 -:10FD100038BFFFDF6088401B3C3880B220801B2842 -:10FD200038BF1B202080A777F0BD816188617047B4 -:10FD30002DE9F04F0D46C188044600F128080089DE -:10FD400021F4004320F4004221F4004620F400474F -:10FD50004FF0010A4FF000099A4208D100F4004028 -:10FD600001F4004188421CBF0020BDE8F08FB7427B -:10FD70000BD9617FB81B401A083885421BDC08EBA1 -:10FD800006000021058041801EE06088617F801BA5 -:10FD9000401AB0F1080B0ED4BBF11B0FB8BFFFDF48 -:10FDA0005D45D4BF29461FFA8BF1681A0204120C74 -:10FDB00018BFBA4204DD84F817900020BDE8F08F28 -:10FDC00008EB06000180428084F817A0BDE8F08FA0 -:10FDD0002DE9F041044600F12802C08820F40043D8 -:10FDE000E07D002808BFBDE8F081D0180288438874 -:10FDF00013448B423CBF0020BDE8F08100279142B4 -:10FE00009CBF0180478013D9891A0D042D0C4580B1 -:10FE10000ED0E088A61D20F40040854288BFFFDF99 -:10FE200030884FF4004121EA0000284330800AE086 -:10FE3000627F008802F108031044083081B26288B2 -:10FE4000A01D00F0A8FBE7750120BDE8F08130B4EB -:10FE5000B0F804C0C488034600F128052CF4004023 -:10FE60002844A44503D10020188230BC7047B3F861 -:10FE70000CC00488A44509D34088ACEB040CA0EB6B -:10FE80000C0084B20CEB0500C01E06E0A4EB0C04D1 -:10FE90005D7FA4B2AC446044401DB1F800C0A445ED -:10FEA00088BF0C80B3F80CC0BCF1000F0CBF4FF042 -:10FEB000010C4FF0000C82F800C00988198230BC98 -:10FEC00070472DE9F041044600F12801808820F4B4 -:10FED00000404518208A002808BFBDE8F081A089AD -:10FEE00010B9A069807F2871A089218A084480B256 -:10FEF000A08129886A881144814238BFFFDF2888A1 -:10FF00006D88A2894119002791421AD175B1A08844 -:10FF1000261D20F40040A84238BFFFDF30884FF490 -:10FF2000004121EA00002843308009E0627F10444C -:10FF3000083081B202F108036288201D00F02BFB1B -:10FF4000A78127820120BDE8F0812DE9F047418992 -:10FF5000B0F804800027044600F1280A414518BF84 -:10FF60004FF400493AD000BF21F400405044468885 -:10FF70006EB1608904F10A0520F40040B04238BF38 -:10FF8000FFDF288829EA00003043288021E0637FD2 -:10FF9000008803F1080C18446389083023F40045F5 -:10FFA0006288284480B204F10A0190420BD2121AEE -:10FFB00092B20CF11B0C62452CBF03F4004229EAFB -:10FFC000030004D204E0801A80B229EA030210433D -:10FFD0000880781C618987B24145C5D13846BDE8A3 -:10FFE000F0872DE9F047B0F808800B46044600F191 -:10FFF0002801B0F80A90808828F4004C01EB0C0529 -:020000040001F9 -:10000000804504BF0020BDE8F087002A1CBF681DA2 -:10001000106023B1627F691D184611F06DFD2F88B5 -:100020006D888DB1E81987B2208904F1080620F4A3 -:100030000040A84238BFFFDF30884FF4004121EA7A -:100040000000284330800AE0607F6288C1190831CF -:1000500000F1080389B204F1080000F09CFAC845D9 -:1000600004BF208960813846BDE8F0878188C08858 -:1000700081420CBF012000207047018980888142A5 -:100080000CBF01200020704730B48488C28800F182 -:10009000280324F4004C22F40041634494421BD012 -:1000A0008289048A15191C885A88A3189D4216D380 -:1000B00012B18A4210D212E0437F0CF1080C1A19D7 -:1000C0006244408892B2801A80B22333984201D2AF -:1000D00011B104E08A4202D130BC0020704730BC2C -:1000E000012070472DE9F007B0F806C0048900F13F -:1000F000280702462CF400457E1924F400492CF40C -:10010000004A002024F400434FF00108D1450AD1F1 -:1001100004F400440CF4004C644504D05082BDE863 -:10012000F00700207047AB4208D992F81DC05B1B56 -:10013000A3EB0C03A3F10804002308E0B2F802C00B -:10014000547FACEB050CACEB040CACF10804002CB8 -:10015000E4DBB2F80EC0BCF1000F0DD0B6F800C061 -:1001600075884DB15B1B10778B42D7DBD089384443 -:10017000A0EB0C00C01E09E0A4EB0C0410778C422D -:1001800008DB507FD38918443044401D5182BDE8BC -:10019000F00770478B42A8BF82F81C80E6DABDE703 -:1001A0002DE9F05F044600F1280AC088934620F448 -:1001B00000400AEB0005608A894608B1484502D232 -:1001C0000020BDE8F09FE08980B1B5F800806E881E -:1001D00008EB0601884218BFFFDF207F4FF00007C1 -:1001E00050EA060108D0002840D04AE04FF000084D -:1001F000A17F46462971F0E7E08948B1617F01445B -:100200004819B4F81F10A0F8051094F82110C17116 -:10021000E18908EB09004944E18128806F80BBF146 -:10022000000F19D0607F298800F1080301440831CC -:1002300089B26288A01D00F0AEF9E781A07F401C62 -:10024000A077A07D00281CBFE088A082A7756782E8 -:10025000E7750120BDE8F09F607FE18908442844EC -:10026000B0F80510A4F81F10C0792EE0E089B4F8AA -:100270001F105044A0EB080020F8031D94F8211033 -:10028000817006EB090086B2E089BBF1000F48449B -:10029000E081A5F800806E800ED0E088A51D20F4D6 -:1002A0000040B04238BFFFDF28884FF4004121EA08 -:1002B000000030432880C0E7E0895044A0EB0800EC -:1002C00030F8031DA4F81F10807884F82100BEE7E1 -:1002D000818800F1280221F4004C6244B0F814C077 -:1002E000C388614518BF99420FD0818969B9806977 -:1002F00068B101898388994209D021F400412830EE -:10030000084411790079884201D1002070471046D5 -:10031000704700F12803407F01F1050C6044106034 -:100320000888002804BFD81E10600888498808443F -:1003300080B270472DE9F04115460A4600F12806C3 -:100340001C46407F531D0344108857880699002897 -:100350001CBFC01C80B226D088429CBF081A80B245 -:1003600013D9401AA042A8BF20461FFA80F8581897 -:100370004246294611F094FB002818BFBDE8F081E1 -:100380004544A4EB080084B2002001198F423CBF11 -:100390004FF0FF30BDE8F081304422462946BDE8E9 -:1003A000F04111F07DBBFA1C97B2F61ED4E72DE99F -:1003B000F04100F128071D46407F4B1D03441646BF -:1003C00008880024B1F80280069A00281CBFC01CCF -:1003D00080B21FD090429CBF101A80B20DD9801AF3 -:1003E000A842A8BF284684B299182246304611F088 -:1003F00083FB281B85B2264400204119414506D8BD -:1004000039182A46304611F077FB601984B220462D -:10041000BDE8F08108F103011FFA81F8FF1ED9E75A -:100420002DE9F04116460A4600F128071D46407F97 -:10043000531D034410880024B2F802800699002856 -:100440001CBFC01C80B21FD088429CBF081A80B25B -:100450000DD9401AA842A8BF284684B2581822468F -:10046000314611F049FB281B85B226440020411972 -:10047000414506D838442A46314611F03DFB601903 -:1004800084B22046BDE8F08108F103021FFA82F829 -:10049000FF1ED9E7401D704770B5044600F12801E2 -:1004A000C288808820F400431944904208D0A28971 -:1004B000002A04BF228A002A02D1A28A904201D1D6 -:1004C000002070BDB1F800C04D8885B1261D20F414 -:1004D0000040A84238BFFFDF30884FF4004121EAD6 -:1004E00000002843308000202082012070BD607F02 -:1004F0000CF1080100F10803084481B26288201D54 -:1005000000F049F8EFE70021C18101774182C17510 -:100510008175704703881380C289002A04BF0020B8 -:100520007047C28800F1280322F400421A440A608E -:10053000C089704710B50446808AA0F57F41FF3915 -:1005400018BFFFDFE088A082E089002818BF0120E3 -:10055000A07510BD4FF6FF71818200218175704733 -:1005600010B50446808AA0F57F41FF3908BFFFDF40 -:10057000A07D28B9A088A18A884204BF002010BDB0 -:10058000012010BD8188828A914205BF807D0028AC -:1005900000200120704710B4B0F800C02CF40044D3 -:1005A000214489B24FF4004491420AD2521A92B2C5 -:1005B0001B339A422CBF0CF4004224EA0C0104D2F3 -:1005C00004E0891A89B224EA0C021143018010BCAC -:1005D000704770B516464FF6FC72C91C01EA020559 -:1005E000D8B10446C01C20F00301A14200D0FFDFB7 -:1005F000201D012108E00246284401D2034600E004 -:100600000023491CC9B21360B142F4D916B104F1F8 -:10061000040001E04FF00000206005FB06F000F14F -:10062000040070BD024600201168002902D008466F -:1006300009681160704702680A60016070474FF6F0 -:10064000FC73C91C1940101A001F90FBF1F0C0B2D6 -:1006500070474FF6FC73C91C1940001D01FB0200D6 -:10066000704770B50C00054609D0082C00D2FFDF9A -:100670001DB1A1B2286800F044F8201D70BD0DB175 -:1006800000202860002070BD0021026803E09388EC -:100690001268194489B2002AF9D100F032B870B555 -:1006A00000260D460446082900D2FFDF206808B95D -:1006B0001EE0044620688188A94202D00168002912 -:1006C000F7D181880646A94201D100680DE005F105 -:1006D000080293B20022994209D32844491B0260C0 -:1006E00081802168096821600160206000E00026A7 -:1006F000304670BD00230B608A8002680A6001608A -:10070000704700234360021D018102607047F0B50D -:100710000F460188408815460C181E46AC4200D38F -:10072000641B3044A84200D9FFDFA019A84200D9B9 -:10073000FFDF3819F0BD2DE9F041884606460188F3 -:10074000408815460C181F46AC4200D3641B384441 -:10075000A84200D9FFDFE019A84200D9FFDF708866 -:100760003844708008EB0400BDE8F0812DE9F041C9 -:10077000054600881E461746841B8846BC4200D3A7 -:100780003C442C8068883044B84200D9FFDFA0196F -:10079000B84200D9FFDF68883044688008EB040065 -:1007A000E2E72DE9F04106881D460446701980B243 -:1007B000174688462080B84201D3C01B208060883D -:1007C000A84200D2FFDF7019B84200D9FFDF60886D -:1007D000401B608008EB0600C6E730B50D46018877 -:1007E000CC18944200D3A41A4088984200D8FFDF66 -:1007F000281930BD2DE9F041C14D04469046A87836 -:100800000E46A04200D8FFDF05EB8607B86A50F815 -:10081000240000B1FFDFB868FFF704FF05000CD02B -:10082000B86A082E40F8245000D3FFDFB54842468E -:10083000294650F82630204698472846BDE8F081E2 -:100840002DE9F0471E460400074602EB06009146DC -:100850008A46C5B227D000218846FF2800D9FFDF8D -:10086000E01C20F00300A04200D0FFDFB24500D919 -:10087000FFDFA34880F800A080F801908570C57064 -:10088000057145718671DFF87CA280F8079000261B -:100890000AF1400A8146FF1C27F003000746B8F121 -:1008A000000F03D005E04FF00101D5E709EB860109 -:1008B00088603AF8161019F8062001D04FF00000B1 -:1008C000FFF787FE761CF6B20744082EE3D3FF1C21 -:1008D00027F003002A460646B8F1000F0DD000208D -:1008E0000221FFF776FE4346002130440F46C846FA -:1008F000C01C20F003021BB110E0C9F84800EFE76C -:1009000008EB81060020B26206E000BFD6F828C0DE -:100910004CF82070401CC0B2A842F7D3491CC9B2A1 -:1009200002EB85000829E3D3001BBDE8F08710B572 -:10093000044603F0BBFC08B1102010BD2078704ABB -:10094000618802EB800092780EE0836A53F82130D0 -:1009500043B14A1C6280A180806A50F82100A060E7 -:10096000002010BD491C89B28A42EED86180052062 -:1009700010BD70B505460C46084603F097FC08B15B -:10098000102070BD082D01D3072070BD25700020F8 -:10099000608070BD0EB56946FFF7EBFF00B1FFDF69 -:1009A0006846FFF7C4FF08B100200EBD01200EBD50 -:1009B00010B50446082800D3FFDF5148005D10BD84 -:1009C0003EB5054600246946FFF7D3FF18B1FFDFA7 -:1009D00001E0641CE4B26846FFF7A9FF0028F8D0E4 -:1009E0002846FFF7E5FF001BC0B23EBD44498978A9 -:1009F000814201D9C0B27047FF2070472DE9F04114 -:100A000090460C460546062901D0072C10D13C4FD4 -:100A1000B86CFFF707FE02004FF6FF7604D0022104 -:100A2000B86CFFF70CFE00E030462880B04201D1E0 -:100A3000002003E742462146FFF7DCFE040002D116 -:100A4000288800F04FF82046F8E6A0F57F43FF3BEA -:100A500001D0082901D300207047CBE6A0F57F42E2 -:100A6000FF3A0BD0082909D2254A9378834205D949 -:100A700002EB8101896A51F820007047002070471D -:100A80002DE9F04105460C46A5F57F4143F20200F1 -:100A9000FF3902D0082C01D30720CFE618494FF0C8 -:100AA00000088A78AA42F8D901EB8406B26A52F8A3 -:100AB0002570002FF1D013483946203050F82420FB -:100AC00028469047B16A062C41F8258001D0072CB2 -:100AD00002D1284600F006F83946B068FFF7ABFDB2 -:100AE0000020ABE610B5064CC2B20221A06CFFF7A5 -:100AF000B0FD0146A06CBDE81040FFF79CBD0000B2 -:100B0000600700202022020070B50E461D461146E7 -:100B100000F0D4F804462946304600F0D8F82044C6 -:100B2000001D70BD2DE9F04190460D4604004FF0C8 -:100B3000000610D00027E01C20F00300A04200D0E7 -:100B4000FFDFDDB141460020FFF78BFD0C3000EBED -:100B5000850617B112E00127EDE7614F04F10C00A3 -:100B6000A9003C602572606000EB85002060606831 -:100B700011F05BF841463868FFF773FD3046BDE879 -:100B8000F0812DE9FF4F564C804681B020689A468F -:100B9000934600B9FFDF2068027A424503D94168D5 -:100BA00051F8280020B143F2020005B0BDE8F08FF3 -:100BB0005146029800F082F886B258460E9900F02D -:100BC00086F885B27019001D87B22068A1463946A3 -:100BD0000068FFF764FD04001FD067802580294668 -:100BE000201D0E9D07465A4601230095FFF766F823 -:100BF0002088314638440123029ACDF800A0FFF73F -:100C00005DF82088C1193846FFF78FF8D9F8000041 -:100C10004168002041F82840C7E70420C5E770B5C7 -:100C20002F4C0546206800B9FFDF2068017AA942F1 -:100C30000ED9426852F8251051B1002342F82530F0 -:100C40004A880068FFF756FD216800200A7A08E00C -:100C500043F2020070BD4B6853F8203033B9401C9A -:100C6000C0B28242F7D80868FFF70EFD002070BDC1 -:100C700070B51B4E05460024306800B9FFDF3068B0 -:100C8000017AA94204D9406850F8250000B1041D3A -:100C9000204670BD70B5124E05460024306800B97C -:100CA000FFDF3068017AA94206D9406850F8251064 -:100CB00011B131F8040B4418204670BD10B50A4636 -:100CC0000121FEF7F3FFC01C20F0030010BD10B59A -:100CD0000A460121FEF7EAFFC01C20F0030010BD08 -:100CE0006C00002070B5044600780E46012813D031 -:100CF000072802D00B2813D10EE0A068616905789F -:100D0000052003F061FA052D0AD078230022052082 -:100D1000616903F0AFF903E00520616903F054FA5B -:100D200031462046BDE8704001F0A8B910B500F189 -:100D30003902C3799478411D64F003042340C371E0 -:100D4000DB070DD04B79547923404B710B79127925 -:100D500013400B718278C9788A4200D9817010BD26 -:100D600000224A710A71F5E74178012900D00C216F -:100D7000017070472DE9F74F88B000208C698DF81D -:100D800004000878012617460D464FF007094FF07A -:100D9000110A4FF00A0B292876D2DFE810F029005B -:100DA000D20215032D036F037E039903C703DC03EF -:100DB0000604330457047004AE04BF04E204EA04DA -:100DC0000A052C0557057A05A605C605D605F605BC -:100DD000F805050637065906AD06EA06EC061B07B8 -:100DE0003B074407550792071B08410808080D08F0 -:100DF00014B120781E2829D0D5F808805FEA0800B1 -:100E000042D001208DF80400686A02228DF8082083 -:100E100006908DF809B0286A0390A8880028EFD0C2 -:100E200098F8001091B10F2910D27DD2DFE801F0BF -:100E30007C134BDCFEFDFCFBFAF9F8089EF7F6008C -:100E4000022821D124B120780C2801D00026F9E312 -:100E50008DF80420B3E10520696A03F0B5F9A8888C -:100E60000728EED1204601F003F9022809D02046D8 -:100E700001F0FEF8032808D9204601F0F9F8072808 -:100E800003D20120207005E003E2002CB8D02078C6 -:100E90000128D6D198F80400C11F0A2903D300BF46 -:100EA00085F81CB04CE2A070D8F80010A163B8F827 -:100EB0000410A18798F8060084F83E0001202870ED -:100EC0000320207046E00728BBD1002C98D0207862 -:100ED0000D28B6D198F8031094F83B20C1F3C00058 -:100EE000C2F3C002104201D0062000E007208907AB -:100EF00007D198F805100142D2D198F806100142A6 -:100F0000CED194F83D2098F8051020EA0202114253 -:100F1000C6D194F83E2098F8061090430142BFD104 -:100F200098F80400C11F00E008E20A29B8D2617FE6 -:100F3000814201D906209AE3D8F800106160B8F820 -:100F40000410218198F80600A072012028700E205C -:100F5000207003208DF80400686A069004F13900BF -:100F60000290601D039017300490DBE0412890D17F -:100F7000204601F07DF8042802D1E078C00704D1B2 -:100F8000204601F075F80F289ED1A88CD5F80C806A -:100F900080B24FF04009666AFFF76AFE32460826C3 -:100FA00041464B460096FFF702FA0D208DF80400EB -:100FB000686A0690606A0290002101A8FFF792FE1D -:100FC0002078042808D0A07F48B1012807D0032842 -:100FD00008D0102020709CE005202070CEE184F81D -:100FE00000A033E71220F5E71128C0D1204601F018 -:100FF0003FF8042802D1E078C00719D0204601F05C -:1010000037F8062805D1E078C00711D1A07F022863 -:101010000ED0204601F02CF8112808E0B3E083E060 -:1010200072E156E136E109E1EAE0D0E017E09ED155 -:10103000102208F1010104F1480010F05DFD607814 -:10104000012809D012202070E078C00765D0A07F69 -:1010500090B301285DD060E084F8009059E0112839 -:1010600085D1204601F004F8082804D0204600F07D -:10107000FFFF132888D12869D0B16869C0B104F195 -:101080007800102208F10101064610F035FD2078A5 -:10109000082812D014202070E078C0070FD0A07F5D -:1010A000022818D06178022912D0032831D034E008 -:1010B00000208DF80400ECE02BE00920EBE70B208A -:1010C0002870296901204870206CC1E9010662E29C -:1010D00008B101287AD10B202870296981F8019084 -:1010E000606A4860206AC1E9020648E2206CE27842 -:1010F0000068C2F34402521ED04000F0010040F0EC -:10110000800000E000200874E06A48614CE2064676 -:10111000FEE3042028700520BAE185F800B08DF8C0 -:1011200004B08EE33946F4E31128C4D1204600F020 -:101130009FFF0A2802D1E078C00704D1204600F0C2 -:1011400097FF1528B7D1102208F1010104F14800DA -:1011500010F0D2FC20780A2810D01620207012201F -:10116000287029690920487004F15800486020302F -:1011700088601038C860206C086184E30B20207000 -:10118000B9E22870FEE3022895D1204600F070FFF6 -:10119000042804D3204600F06BFF082809D320461A -:1011A00000F066FF0E2886D3204600F061FF12286B -:1011B0006FD2A07F0228B8D110208DF80400686A91 -:1011C000069098F801008DF80800F6E33DE2022849 -:1011D000ABD1204600F04CFF00285AD0204600F04A -:1011E00047FF0128F9D0204600F042FF0C28F4D038 -:1011F00004208DF8080098F801008DF809005AE7DE -:101200001128FCD1002CFAD020781728F7D161786A -:10121000E06A022910D0002101EB4101182606EBFB -:10122000C1011022405808F1010110F065FC0520B1 -:10123000696A00F010FF1DE10121EDE70B28DED106 -:10124000002CDCD020781828D9D16178E06A0229F6 -:101250001BD0002101EB4101102202EBC1014158DA -:10126000B8F8010008806078E16A02280FD00020F9 -:1012700000EB4002142000EBC2000958404650F831 -:10128000032F0A604068486039E00121E2E701204D -:10129000EEE7A1E11128B2D1002CB0D020781928B6 -:1012A000ADD16078E16A022811D0002000EB400245 -:1012B0001C2000EBC2001022085808F1010110F0B8 -:1012C0001BFC0520696A00F0C6FE1A20D4E001204C -:1012D000ECE7082893D1002C91D020781A288ED1E1 -:1012E000E06A98F80120017862F347010170E16A31 -:1012F000D8F8022041F8012FB8F8060088800520B0 -:10130000696A00F0A8FE3CE3112898D1002C98D01F -:1013100020781B2893D16178E06A02290CD0002143 -:1013200001EB4101202202EBC1011022405808F1DB -:10133000010110F0E1FBE2E70121F1E785F81C90E3 -:10134000EFE338780128A6D11C2204F11C0079684B -:1013500010F017FCE079C10894F83B0001EAD001D5 -:10136000E07861F30000E070217F09B1297733E173 -:10137000217803290AD0C0073FF42DAE032028703E -:101380008DF804B0686A06904120B1E3607FA178CF -:1013900088423FF6CFAD02262671E179204621F042 -:1013A000E001E171617A21F0F0016172A17A21F02E -:1013B000F001A172FFF7BAFC2E708DF804B0686AD4 -:1013C00006908DF80890ADE638781128CFD18DF8C9 -:1013D0000490696A0691916800208DF814000391C9 -:1013E000ADF8089008466168016021898180A17A82 -:1013F000817104202070E0E238781128B7D18DF88F -:101400000490686A0690381D02AB07C883E807009D -:101410004120ADF8080000208DF8140008460C218A -:101420000170A88CCA4680B2FE684FF04009D4F81B -:101430002080FFF72FFC3146082642464B46009697 -:10144000FEF7EEFF002101A8FFF74CFCE07820F04A -:101450003E00801CE0702078052801D00F200BE0B2 -:10146000A07F20B1012802D0032803D03DE184F8F9 -:1014700000A04EE62670E9E42070E7E438780328FF -:10148000A4D178680168A1664068E06605202870EC -:101490008DF80400686A069044E63878032895D1F0 -:1014A00078680168216740686067206C68B9A07F30 -:1014B00028B1012803D0062028700420E8E785F829 -:1014C0000090FE4820646064F9E385F80090F6E33C -:1014D0003878022892D1387900287CD1A07F022860 -:1014E0000BD00328F1D1607801280BD0A07994F8B3 -:1014F0003A1001280AD0F1480BE0B86800286BD0F8 -:10150000206411E0A17994F83A00F2E7B868002865 -:10151000F5D02064E078C00701D0012901D0E74868 -:1015200002E0F8680028EAD06064CEE78DF804B0E5 -:10153000696A0691E1785846C90709D0617802299D -:1015400003D1A17F29B1012903D0A17F032900D0B4 -:101550000820287064E33878112891D1B86828628F -:1015600009202870E0782969C0070DD081F8019022 -:10157000206A4860606A886004F16800C860A07FE3 -:1015800002287FF4BFADB1E501204870206C4860AF -:1015900004F16800886004F13800C860201D08610B -:1015A000206B4861606B88612AE2E1783878C9076E -:1015B00001D0062100E00A2188428BD1207807283B -:1015C0001DD084F800A000BF8DF80490686A0690D2 -:1015D000286A039001E0CAE08DE20024ADF808A07B -:1015E0008DF81440032100F8011B5168102210F0FF -:1015F00083FA002101A8FFF775FB2C6226E408207E -:101600002070E1E738781128A7D18DF80490686A36 -:1016100006909068039000208DF814000398ADF8B0 -:1016200008A0042100F8011B102204F1680110F049 -:1016300063FA002101A8FFF755FB2078092802D0A2 -:10164000132019E73CE384F800B016E0E17838781D -:10165000C90701D0062100E00A218842ADD110223D -:1016600004F14800796810F01BFA10B104202877C3 -:10167000EAE3207809283FF4EEAC0C2081E5E0781D -:10168000C10738D0A17F012902D002291BD02EE04A -:101690000D202870296981F801B06078012809D0EF -:1016A000206A4860606A886004F16800C860103091 -:1016B000086129E5606A4860206A886004F1780062 -:1016C000C8601038F4E7C0F3440114290FD24FF07A -:1016D000006101EBB0104FEAB060E0706078012863 -:1016E00003D010202070042057E10620C4E6607863 -:1016F00001283FF476AC0E2043E538780928ADD1B7 -:1017000085F800B00F208DF80400686A06905068D4 -:101710000290002101A8FFF7E5FAE8E7E078C007AA -:101720000AD0A07F012803D10F202870042036E1C1 -:10173000102028700E2032E115202870296902201F -:101740004870206C48606078012805D004F178006A -:1017500088601038C86053E104F168008860103078 -:10176000F8E738780228CAD138790028E0D02877FD -:1017700068E338781328FBD185F800A02969082090 -:10178000487078684860607801280DD004F16800DE -:1017900088601030C860206B0861606B486104F19C -:1017A00058008861A06A22E004F17800886010384F -:1017B000F0E738780728DBD16078012801D01320C2 -:1017C00029E2A178A06A0844C1F1100110F00BFAD7 -:1017D0001220287029690920487004F158004860D7 -:1017E000203088601038C860206C086144E0C8610F -:1017F000E06A086204E138780828B9D1102204F1BF -:101800004800796810F04CF908B10B202FE72078D8 -:101810000B2812D02046FFF789FAA178A06A084465 -:10182000C1F1100110F0DFF91620287008208DF8A2 -:101830000400686A0690002072E0132028708DF87A -:1018400004B0686A06908DF808A06BE43878112817 -:101850008ED1B86828621420287029690920487040 -:1018600004F158004860103088601030C860606C27 -:1018700008616078012806D004F139004861206BC6 -:101880008861606BB3E7601D4861606B8861206BA5 -:10189000ADE7387808288ED18DF80490686A0690F4 -:1018A000286A00260D210390ADF808A08DF8146079 -:1018B00000F8011B1022796802E000007423020086 -:1018C00010F01AF9002101A8FFF70CFA2E626078D7 -:1018D000012801D01520CFE51620287008208DF8AA -:1018E0000400686A029606901BE038780B2884D1C1 -:1018F000162028706078022802D12046FFF716FAD9 -:10190000A17878680844C1F1100110F06CF901E089 -:1019100083E215E008208DF80400686A0690786874 -:101920000290A0788DF80C004DE538780F288FD103 -:10193000E079C00773D01720287009202FE01146E6 -:1019400001A8FFF7CFF9FFF7E2BB38781028A2D142 -:101950001422391D04F11C0010F013F9E16A208DE6 -:10196000A1F80900E16AA078C871E179E26A01F0A2 -:1019700003011172E16A627A0A73E16AA07A81F85E -:10198000240000E09BE1242078E6192043E1387828 -:101990001128ACD1B86828621A20287005208DF86B -:1019A0000400686A0690CAE7387803289FD16078F7 -:1019B000E16A022802D0012001E05CE2002000EB95 -:1019C0004002142000EBC2027B688A58196811603B -:1019D000596851601B212970D5E9041205234B7009 -:1019E000636A4B606678E36A022E01D0012600E04C -:1019F000002606EB460600EBC6001858C1E90202B5 -:101A0000686A4862089800F050FB9CE738780E2816 -:101A100071D16078E26A022802D0012001E0ADE1D4 -:101A2000002000EB4001102000EBC1000223105801 -:101A3000093279680EF01EFB1C20287029690420E9 -:101A40004870206A4860E06A09308860FB4881E697 -:101A500038780D284FD16178E06A022901D0012140 -:101A600000E0002101EB4101182606EBC101A2783C -:101A70004058796810F040F86078E16A022801D097 -:101A8000012000E0002000EB400206EBC200B0465F -:101A90000858A1780844C1F1100110F0A4F88DF89D -:101AA0000490686A0690286A00260390ADF808A0A2 -:101AB0008DF81460062101706178E26A022901D074 -:101AC000012100E0002101EB410308EBC301401CB0 -:101AD0005158102210F010F8002101A8FFF702F968 -:101AE0001D202E6228708DF804B0686A06900B20C5 -:101AF0008DF8080067E481E0387811287ED18DF8F0 -:101B00000490686A0690B86803900B20ADF808004E -:101B1000039880F800906278E16A022A02D00122DC -:101B200001E091E1002202EB4202102303EBC2022A -:101B300089580988A0F801106178E26A022901D069 -:101B4000012100E0002101EB4103142101EBC3015D -:101B500051580A6840F8032F4968416056E0272031 -:101B6000287001208DF814002DE424202870002016 -:101B70009FE01F204FE0387811283FD18DF8049066 -:101B8000686A0690B868039000208DF814000398E6 -:101B9000ADF808A0082606706178E26A022901D033 -:101BA000012100E0002101EB41031C2101EBC301F5 -:101BB000401C515810220FF09FFF002101A8FFF791 -:101BC00091F8202028708DF804B0686A06908DF88E -:101BD000086061E43878112810D18DF80490686AA3 -:101BE0000690B86803900820ADF808000398092112 -:101BF0000170E16909784908417000E094E0E16909 -:101C000051F8012FC0F802208988C18020781D2852 -:101C1000ABD1A4E7222028708DF804B0686A069042 -:101C20008DF808A08BE6387811287DD1B868286235 -:101C300023202870296904204870206A4860E06ADF -:101C4000093088607E4885E538780D286CD1617848 -:101C5000E06A022901D0012100E0002101EB4101ED -:101C6000202606EBC1011022405879680FF044FF8E -:101C70008DF80490686A0690286A0390ADF808A071 -:101C800080F800B06278E16A022A01D0012200E007 -:101C9000002202EB420206EBC202401C89581022CD -:101CA0000FF02AFF0020286221781D29B1D02421BD -:101CB00029708DF81400002101A8FFF713F80326FE -:101CC000DFE0E078C00702D04FF0060C01E04FF0F3 -:101CD000070C6078022809D04FF0000000EB0401E7 -:101CE00001F1090105D04FF0010004E04FF00100BF -:101CF000F4E74FF000000B78204413EA0C030B705C -:101D000010F8092F02EA0C02027004D14FF01C0CEB -:101D100084F800C092B394F801C0BCF1010F00D068 -:101D2000E3B990F800C000E053E05FEACC7804D05B -:101D30002CF00106067018260EE05FEA8C7804D5B8 -:101D40002CF0020606701E2606E05FEA4C7805D5E8 -:101D50002CF00406067021262E70032694F801C08C -:101D6000BCF1020F00D0DAB991F800C05FEACC787C -:101D700005D02CF001060E7017210FE01AE05FEA83 -:101D80008C7804D52CF002060E70192106E05FEA6B -:101D90004C7805D52CF004060E701B21217000260E -:101DA0000078D0BBCAB3C3BB1D20207035E03878A3 -:101DB000122847D1282061E42078012842D00C283D -:101DC00040D02046FEF7D0FF0B208DF80400686A53 -:101DD000069037E038784FF02608112805D01220F9 -:101DE0001070032685F800804BE08DF80490686A37 -:101DF0000690B86803900220ADF8080001208DF825 -:101E00001400039805210170297F4170114601A833 -:101E1000FEF768FF064685F80080012E12D030E0FC -:101E200001208DF80400686A069003208DF80800F0 -:101E3000287F8DF809000020287716E06C23020027 -:101E400070220200287F80B11E202070252028707B -:101E50008DF804B0686A069002208DF808003946B3 -:101E600001A8FEF73FFF06460BE00CB1FE202070F4 -:101E70009DF8040028B1002101A8FEF733FFFEF70A -:101E8000E5BF0BB03046BDE8F08FF0B587B00C462B -:101E90004E6900218DF804100120257803460227A1 -:101EA0004FF0070C85B1012D50D0022D36D1FE2008 -:101EB00030708DF80030606A059003208DF80400C2 -:101EC000207E8DF8050060E02179012922D00229C9 -:101ED00029D0032924D0042920D1B17F02291DD182 -:101EE00031780D1F042D04D30A3D032D01D31E2983 -:101EF00014D12189022911D38DF80470237020890F -:101F00009DF80410884217D20A208DF80000606AFC -:101F1000059057E070780128EED0052007B0F0BD9D -:101F20001E203070E8E771780229F6D131780C294B -:101F3000F4D18DF804C0E1E71120083402F8040B55 -:101F400094E80B0082E80B000320E7E71578112DD9 -:101F5000E4D18DF800C0656A0595956802958DF805 -:101F6000101094F804E0BEF1010F13D0BEF1020F7F -:101F70002DD0BEF1030F1CD0BEF1040FCED1ADF8B1 -:101F800004700E202870207E687000216846FEF7DD -:101F9000A9FE0CE0ADF804700B202870207E002113 -:101FA00000F01F0068706846FEF79CFE3770002046 -:101FB000B4E7ADF804708DF8103005202870207E4D -:101FC0006870277011466846FEF78CFEA6E7ADF8EC -:101FD00004C02B70207F6870607F00F00100A87043 -:101FE000A07F00F01F00E870E27F2A71C0071CD0BC -:101FF00094F8200000F00700687194F8210000F0C8 -:102000000700A87100216846FEF76CFE2868B063DF -:10201000A888B087A87986F83E00A06940787077D4 -:102020002879B0700D203070C1E7A9716971E9E7B6 -:1020300000B587B005280CD101208DF800008DF87F -:102040000400002005918DF8050001466846FEF762 -:1020500049FE07B000BD70B50C46054602F0B4F865 -:1020600021462846BDE870407823002202F002B8DD -:1020700008B1007870470C207047000070B50C0064 -:1020800005784FF000010CD021702146F3F79DF840 -:1020900072482178405D884201D1032070BD022042 -:1020A00070BDF3F792F8002070BD027B032A05D0C3 -:1020B00000220A704B780B2B02D003E004207047FB -:1020C0000A770A62027B9300521C0273C1500320FC -:1020D0007047F0B587B00F4605460124287B05EB15 -:1020E000800050F8046C7078411E0C290AD25B49BC -:1020F0003A46123101EB8000314650F8043C284644 -:10210000984704460CB1012C11D1287B401E10F0D9 -:10211000FF00287301D00324E0E70C208DF80000B5 -:10212000706A0590002101966846FFF7A7FF032C0F -:10213000D4D007B02046F0BD70B515460A46044617 -:1021400029461046FFF7C5FF064674B12078FE28E1 -:102150000BD1207E30B100202870294604F10C00FC -:10216000FFF7B7FF2046FEF7FFFD304670BD704712 -:1021700070B50E46044688210FF057FD0225012E4A -:1021800003D0022E04D0052070BD0120607000E055 -:1021900065702046FEF7E8FDA577002070BD28B1E8 -:1021A000027E1AB10A4600F10C01C5E70120704712 -:1021B00010B5044686B0052002F006F82078FE2807 -:1021C00006D000208DF8000069462046FFF7E7FFA3 -:1021D00006B010BD7FB50E4600218DF80C10417879 -:1021E0000B2903D00C2903D0002405E0846900E00A -:1021F00044690CB1217E91B16D4601462846FFF736 -:1022000054FF032809D1324629462046FFF794FFA0 -:102210009DF80C10002900D0042004B070BD04F11A -:102220000C05EAE710B590B00C4607900B48042166 -:10223000801E08900A488DF8191009900F9269467F -:1022400006A8FFF7C7FF002805D1102220460199F4 -:102250000FF052FC002010B010BD000076220200EA -:102260006C23020070B50D46040011D085B1210128 -:1022700028460FF0B8FC10224E4928460FF03CFCCF -:102280004C4801210838018044804560002070BD21 -:10229000012070BD70B5474E00240546083E10E091 -:1022A0007068AA7B00EB0410817B914208D1C17B4E -:1022B000EA7B914204D10C2229460FF0F1FB30B1A8 -:1022C000641C30888442EBDB4FF0FF3070BD204649 -:1022D00070BD70B50D46060006D02DB1FFF7DAFFD0 -:1022E000002803DB401C14E0102070BD314C083C7A -:1022F00020886288411C914201D9042070BD616828 -:10230000102201EB001031460FF0F6FB2088401C34 -:1023100020802870002070BD70B514460D0018D0C4 -:10232000BCB10021A170022802D0102811D105E013 -:10233000288870B10121A170108008E02846FFF7BD -:10234000A9FF002805DB401CA070A8892080002080 -:1023500070BD012070BD70B5054614460E000BD04F -:1023600000203070A878012808D005D91149A1F1C2 -:1023700008010A8890420AD9012070BD24B128784A -:1023800020702888000A5070022008700FE064B1A5 -:102390004968102201EB0011204610390FF0ACFB08 -:1023A000287820732888000A60731020307000207D -:1023B00070BD0000780000202DE9F04190460C46E9 -:1023C00007460025FE48072F00EB881607D2DFE8F6 -:1023D00007F00707070704040400012500E0FFDFFA -:1023E00006F81470002D13D0F548803000EB8801FA -:1023F00091F82700202803D006EB4000447001E04C -:1024000081F8264006EB44022020507081F82740D6 -:10241000BDE8F081F0B51F4614460E460546202A59 -:1024200000D1FFDFE649E648803100EB871C0CEB6A -:10243000440001EB8702202E07D00CEB46014078C8 -:102440004B784870184620210AE092F825304078F1 -:1024500082F82500F6E701460CEB41000570407854 -:10246000A142F8D192F82740202C03D00CEB440471 -:10247000637001E082F826300CEB41042023637086 -:1024800082F82710F0BD30B50D46CE4B441900221E -:10249000181A72EB020100D2FFDFCB48854200DD43 -:1024A000FFDFC9484042854200DAFFDFC548401CD3 -:1024B000844207DA002C01DB204630BDC148401CB5 -:1024C000201830BDBF48C043FAE710B50446016884 -:1024D000407ABE4A52F82020114450B102200844EC -:1024E00020F07F40F0F751FB94F90810BDE8104050 -:1024F000C9E70420F3E72DE9F047B14E803696F89E -:102500002D50DFF8BC9206EB850090F8264034E0B1 -:1025100009EB85174FF0070817F81400012806D0BB -:1025200004282ED005282ED0062800D0FFDF01F089 -:10253000E5F8014607EB4400427806EB850080F899 -:10254000262090F82720A24202D1202280F82720BE -:10255000084601F0DEF82A4621460120FFF72CFF4D -:102560009B48414600EB041002682046904796F8CD -:102570002D5006EB850090F82640202CC8D1BDE8F0 -:10258000F087022000E003208046D0E710B58C4C95 -:102590002021803484F8251084F8261084F8271030 -:1025A000002084F8280084F82D0084F82E10411EA5 -:1025B000A16044F8100B2074607420736073A073E2 -:1025C0008449E07720750870487000217C4A103CEF -:1025D00002F81100491CC9B22029F9D30120F0F7F3 -:1025E000C2F90020F0F7BFF9012084F82200F9F7C2 -:1025F00053FB7948F9F75FFB764CA41E20707748AF -:10260000F9F759FB6070BDE81040F0F739B910B523 -:10261000F0F75BF96F4CA41E2078F9F765FB607842 -:10262000F9F762FBBDE8104001F0A0B82020704728 -:102630002DE9F34F624E0025803606EB810A89B002 -:102640009AF82500202822D0691E02916049009541 -:1026500001EB00108146D0E90112C0680391CDE979 -:102660000420B08BADF81C00B07F8DF81E009DF8E3 -:102670001500C8B10227554951F820400399E219C5 -:10268000114421F07F41019184B102210FE001202A -:10269000F0F769F90020F0F766F9F0F734F901F086 -:1026A00065F886F82F508AE00427E4E700218DF8CA -:1026B0001810022801D001281BD1039839190144B0 -:1026C0000998081A20F07F4033280BD903208DF891 -:1026D00015000398C4F13201401A20F07F403224E3 -:1026E00003900CE096F8240018B9F0F753FC00288A -:1026F0004DD0322C03D214B101F02CF801E001F0DE -:1027000035F8344A107820B393465278039B121B55 -:1027100000219DF81840984601281BD0032819D0A5 -:102720005FF000008DF81E00002A04DD981A039067 -:1027300001208DF818009DF81C0000B102210398BB -:10274000274A20F07F40039003AB099801F01AF864 -:1027500010B110E00120E5E79DF81D0018B99BF8C5 -:102760000000032812D08DF81C50CDF80C808DF895 -:1027700018408DF81E509DF8180058B10398012399 -:10278000C11900221846F0F741F906E000200BB00D -:10279000BDE8F08F0120F0F7E6F899F90C2001234D -:1027A00000200199F0F732F9012086F82F008AF80D -:1027B000285003482022694680300FF0E2F911E0EA -:1027C000AC090020FF7F841E0020A107B822020070 -:1027D000AC0700208A000020233F0100F7240100FD -:1027E000FFFF3F000120D2E72DE9F05FDFF84084D2 -:1027F000064608EB860090F82550202D1FD0A8F142 -:1028000080002C4600EB8617A0F50079DFF824B491 -:1028100005E0A24607EB4A004478202C0AD0F0F7E6 -:1028200041F909EB04135A4601211B1D00F0AAFFD0 -:102830000028EED0AC4202D0334652461EE0FE489D -:1028400008B1AFF30080F0F72DF998F82F206AB1A6 -:10285000D8F80C20411C891A0902CA1701EB126131 -:102860000912002902DD0020BDE8F09F3146FFF784 -:10287000DFFE08B10120F7E733462A462021042075 -:10288000FFF7C8FDEFE72DE9F041E94C2569F0F7C6 -:1028900009F9401B0002C11700EB1160001200D4BF -:1028A000FFDF94F8220000B1FFDF012784F82270D7 -:1028B00094F82E00202800D1FFDF94F82E6020200D -:1028C00084F82E00002584F82F5084F8205084F8D6 -:1028D0002150DA4825600078022833D0032831D00F -:1028E00000202077A068401C05D04FF0FF30A0608A -:1028F0000120F0F738F80020F0F735F8F0F733F959 -:10290000F0F72BF9EFF7FFFF0EF094FBCC480560D2 -:1029100005604FF0E0214FF40040B846C1F8800256 -:10292000F0F7BBF994F82D703846FFF75DFF0028EB -:10293000FAD0BF48803800EB871010F81600022844 -:1029400002D006E00120CCE73A4631460620FFF7E8 -:1029500033FD84F8238004EB870090F826002028BC -:1029600004D0B648801E4078F9F7C4F9207F0028CB -:1029700003D0F0F7E8F82577657749E50146AC48DC -:1029800010B590F82D200024803800EB821000BF95 -:1029900010F814302BB1641CE4B2202CF8D32020A2 -:1029A00010BDA84800EB0410016021460120FFF78C -:1029B00003FD204610BD10B5012801D0032800D129 -:1029C00071B39B4A92F82D30994C0022803C04EB65 -:1029D000831300BF13F812400CB1082010BD521C25 -:1029E000D2B2202AF6D3954A48B1022807D0072947 -:1029F00016D2DFE801F01506080A0C0E10000021BF -:102A00000AE01B2108E03A2106E0582104E0772182 -:102A100002E0962100E0B52151701070002010BD39 -:102A2000072010BD854810B54078F0F7AEF880B2A9 -:102A300010BD10B5202811D27D4991F82D30A1F19B -:102A4000800202EB831414F810303BB191F82D3062 -:102A500002EB831212F81020012A01D0002010BDD1 -:102A600091F82D2001460020FFF7A6FC012010BDA3 -:102A700010B5F0F717F8BDE81040F0F786B82DE96B -:102A8000F0410E466A4F01782025803F0C4607EB47 -:102A9000831303E0254603EB45046478944202D097 -:102AA000202CF7D108E0202C06D0A14206D103EB60 -:102AB00041014978017007E00020A9E403EB4400DC -:102AC00003EB4501407848705F4F7EB127B100218C -:102AD00040F2DA30AFF300803078A04206D127B15F -:102AE000002140F2DD30AFF30080357027B10021C6 -:102AF00040F2E230AFF30080012089E410B5426873 -:102B00000B689A1A1202D41702EB1462121216D42E -:102B1000497A91B1427A82B94C4A006852F8211040 -:102B2000126819441044001D891C081A0002C117BC -:102B300000EB11600012322801DB012010BD0020E3 -:102B400010BD2DE9F047814639483E4E00EB81002B -:102B5000984690F825402020107006F50070154624 -:102B600000EB81170BE000BF06EB04104946001D87 -:102B7000FFF7C4FF28B107EB44002C704478202CE9 -:102B8000F2D1297888F8001013E000BF06EB041595 -:102B9000291D4846FFF7B2FF68B988F80040A97BB5 -:102BA00099F80A00814201D80020E8E407EB4400CC -:102BB0004478202CEAD10120E1E42DE9FC410E46C5 -:102BC000074600241F4D08E09DF8000005EB0010AB -:102BD0008168384600F0EAFD01246B4601AA3146BF -:102BE0003846FFF7AEFF0028EED02046BDE8FC8156 -:102BF00070B504460E4801258038A54300EB8411CA -:102C000000EB851040220EF077FF0F4E26B1002119 -:102C100040F25C40AFF30080054800EB850100EB1B -:102C20008400D0F82500C1F82500AEB100210FE0E6 -:102C30002C0A0020FFFF3F00000000008A00002057 -:102C400000F50040AC07002000000000B8220200A0 -:102C50004FF48C60AFF30080284670BD2DE9FC4135 -:102C60008446FF481546089C00EB85170E4617F86A -:102C70001400012803D0022801D00020B6E70B463B -:102C8000F84A0121604600F07DFDA8B101AB6A461B -:102C900029463046FFF755FF70B1F1489DF80420F2 -:102CA0009DF80010803000EB85068A4208D02B4644 -:102CB0000520FFF7AFFB0BE02A462146042014E075 -:102CC000202903D007EB4100407801E096F8250069 -:102CD00007EB440148709DF80000202809D007EB5D -:102CE000400044702A4621460320FFF765FB01207F -:102CF0007CE706F8254F0120F070F3E7DA4901EB95 -:102D00000010001DFFF7E1BB7CB51D4613460446CD -:102D10000E4600F1080221461846EFF743FF94F9EA -:102D200008000F2804DD1F3820722068401C206036 -:102D300096B10220CD4951F8261046182068694600 -:102D4000801B20F07F40206094F908002844C01CBC -:102D50001F2803DA012009E00420EBE701AAEFF7BE -:102D600021FF9DF8040010B10098401C00900099CC -:102D7000206831440844C01C20F07F4060607CBD66 -:102D80002DE9FE430C460646097860799072207959 -:102D900098461546507241B1B148803090F82E10D7 -:102DA00020290AD00069401D0BE0D4E902232179D3 -:102DB00003B02846BDE8F043A6E7AD484178701D52 -:102DC000084420F07F47217900222846A368FFF7B6 -:102DD0009BFF3946284600F0E9FCD4E9023221790C -:102DE0006846FFF791FF41462846019CFFF7E5FE44 -:102DF0002B4622460021304600F0C4FC002803D1B7 -:102E00003146284600F0D2FCBDE8FE832DE9FE4F96 -:102E1000814600F087FC38B15FF0000799F80000A8 -:102E200020B10020BDE8FE8F0127F7E78C4D914CC3 -:102E30004FF0000A803524B1002140F2D340AFF3B7 -:102E4000008095F82D8085F823A0002624B100216C -:102E50004FF49B60AFF300801FB94046FFF7C8FEF8 -:102E6000804624B100214FF49C60AFF30080EFF75F -:102E700019FE43466A464946FFF782FF24B1002106 -:102E800040F2E640AFF3008095F82E0020280CD0E9 -:102E900029690098401A0002C21700EB1260001264 -:102EA00003D5684600F082FC012624B100214FF4CE -:102EB0009E60AFF3008095F823000028BBD124B1B9 -:102EC000002140F2F640AFF30080EFF7EBFD6B46D8 -:102ED000644A002100F056FC0028A3D027B94146DF -:102EE0006846FFF76AFE064326B16846FFF7EDFA2B -:102EF000C9F8080024B1002140F20950AFF3008066 -:102F000001208FE72DE9FF5F8A46814600F00AFC29 -:102F1000534C803410B39AF80000002710B10128F8 -:102F200000D0FFDF534D25B1002140F27F50AFF3B9 -:102F300000800120A84600905FEA080604D0002126 -:102F400040F28750AFF30080009800F0E2FB94F865 -:102F50002D50002084F8230067B119E094F82E006A -:102F60000127202800D1FFDF9AF800000028D9D0DF -:102F7000FFDFD7E72846FFF73BFE054626B10021D5 -:102F800040F29150AFF3008094F823000028D3D191 -:102F900026B1002140F29B50AFF30080EFF782FD95 -:102FA00083462B4601AA5146FFF7EAFE5FEA060870 -:102FB00004D0002140F2A250AFF300803B462A46E5 -:102FC00001A95846CDF80090FFF748FE064604EBED -:102FD000850090F828B0B8F1000F04D0002140F22D -:102FE000A950AFF3008000F089FB0090B8F1000F0A -:102FF00004D0002140F2AF50AFF3008094F82300DA -:10300000002899D1B8F1000F04D0002140F2B75048 -:10301000AFF3008014490DF1040C01EB09109CE89A -:103020000E0000F1040080E80E002EB35FEA0806EF -:1030300004D0002140F2C450AFF300803BEA070007 -:1030400020D094F82E0020281CD126B1002140F277 -:10305000C950AFF300802846FFF7C6FB90B90CE0DB -:10306000AC090020FFFF3F00AC070020B82202009F -:103070008A0000200000000010E09AF80000D8B399 -:10308000012849D0B8F1000F04D0002140F2E650E9 -:10309000AFF30080284600F02AFB01265FEA08050E -:1030A00004D0002140F2EF50AFF30080009800F010 -:1030B00030FB25B1002140F2F350AFF300808EB118 -:1030C00094F82D0004EB800090F82600202809D009 -:1030D00025B1002140F2FA50AFF30080F948407862 -:1030E000F8F708FE25B1002140F2FF50AFF3008051 -:1030F00004B03046BDE8F09FFFE7B8F1000F04D000 -:10310000002140F2D150AFF3008094F82D204946C1 -:103110000420FFF751F9C0E7002E3FF40DAF002166 -:1031200040F2DC50AFF3008006E72DE9F84FE64DA2 -:10313000814695F82D004FF00008E44C4FF0010B4C -:10314000474624B1002140F20D60AFF3008058469D -:1031500000F0DFFA85F8237024B1002140F21260FC -:10316000AFF3008095F82D00FFF742FD064695F875 -:10317000230028B1002CE4D000214FF4C3604BE0C1 -:1031800024B1002140F21C60AFF30080CE488038AB -:1031900000EB861111F81900032856D1334605EBD0 -:1031A000830A4A469AF82500904201D1012000E0A6 -:1031B000002000900AF125000021FFF760FC014685 -:1031C0000098014203D001228AF82820AF77E1B3AA -:1031D00024B1002140F22160AFF30080324649461D -:1031E0000120FFF7E9F89AF828A024B1002140F265 -:1031F0002C60AFF3008000F081FA834624B10021F7 -:1032000040F23160AFF3008095F8230038B1002C14 -:1032100097D0002140F23560AFF3008091E7BAF11A -:10322000000F07D095F82E00202803D13046FFF775 -:10323000DBFAE0B124B1002140F24960AFF3008035 -:10324000304600F054FA4FF0010824B1002140F25A -:103250005260AFF30080584600F05BFA24B10021C1 -:1032600040F25660AFF300804046BDE8F88F002C76 -:10327000F1D0002140F24460AFF30080E6E7002087 -:10328000EFF74ABB0120EFF747BB8E480078704745 -:103290002DE9F0418C4C94F82E0020281FD194F891 -:1032A0002D6004EB860797F82550202D00D1FFDF15 -:1032B0008549803901EB861000EB4500407807F81E -:1032C000250F0120F87084F82300294684F82E5039 -:1032D000324602202234FFF76FF8002020700CE401 -:1032E0002DE9F0417A4E784C012538B1012821D0E2 -:1032F000022879D003287DD0FFDFF0E700F02AFA1A -:10330000FFF7C6FF207E00B1FFDF84F821500020C8 -:10331000EFF729FBA168481C04D0012300221846BE -:10332000EFF774FB14F82E0F217806EB01110A68F1 -:10333000012154E0FFF7ACFF0120EFF714FB94F8F4 -:10334000210050B1A068401C07D014F82E0F21783E -:1033500006EB01110A68062141E0207EDFF8648156 -:10336000002708F10208012803D002281ED0FFDF41 -:10337000B5E7A777EFF7E7FB98F80000032801D13E -:1033800065772577607D534951F8200094F8201027 -:1033900051B948B161680123091A00221846EFF7B4 -:1033A00035FB022020769AE7277698E784F82050AC -:1033B00000F0D0F9A07F50B198F8010061680123B6 -:1033C000091A00221846EFF721FB257600E0277640 -:1033D00014F82E0F217806EB01110A680021BDE8D0 -:1033E000F041104700E005E036480078BDE8F041C4 -:1033F000F8F780BCFFF74CFF14F82E0F217806EB8E -:1034000001110A680521EAE710B52F4C94F82E0047 -:10341000202800D1FFDF14F82E0F21782C4A02EB70 -:1034200001110A68BDE81040042110477CB5264C04 -:10343000054694F82E00202800D1FFDFA068401C2C -:1034400000D0FFDF94F82E00214901AA01EB001003 -:10345000694690F90C002844EFF7A4FB9DF904009D -:103460000F2801DD012000E0002000990844616878 -:10347000084420F07F41A16094F82100002807D083 -:1034800002B00123BDE8704000221846EFF7BEBA33 -:103490007CBD30B5104A0B1A541CB3EB940F1FD3EC -:1034A000451AB5EB940F1BD3934203D9101A431856 -:1034B0005B1C15E0954211D9511A0844401C434247 -:1034C0000EE00000880000202C0A00200000000010 -:1034D000AC070020B8220200FF7F841EFFDF00231C -:1034E000184630BD0123002201460220EFF78EBAB4 -:1034F0000220EFF738BAEFF7D5BA2DE9FC47B14C07 -:10350000054694F82E00202800D1FFDF642D58D303 -:10351000AD4A0021521B71EB010052D394F82E20CA -:10352000A0462046DFF8A49290F82D7009EB021413 -:10353000D8F8000001AA28446946EFF733FB9DF94B -:103540000400002802DD0098401C0090A06800994B -:1035500062684618B21A22F07F42B2F5800F30D26C -:1035600008EB8702444692F82520202A0AD009EB6E -:1035700002125268101A0002C21700EB1260001209 -:1035800088421EDBA068401C10D0EFF78BFAA168C0 -:10359000081A0002C11700EB11600012022810DDAA -:1035A0000120EFF7E0F94FF0FF30A06020682844D9 -:1035B000206026F07F402061012084F82300BDE8D0 -:1035C000FC870020FBE72DE9F0477E4C074694F886 -:1035D0002D00A4F1800606EB801010F8170000B94A -:1035E000FFDF94F82D50A046794C24B1002140F61D -:1035F0006500AFF3008040F6710940F67A0A06EBE9 -:10360000851600BF16F81700012818D0042810D01E -:1036100005280ED006280CD01CB100214846AFF377 -:10362000008020BF002CEDD000215046AFF3008079 -:10363000E8E72A4639460120FEF7BEFEF2E74FF0E2 -:10364000010A4FF00009454624B1002140F68100EF -:10365000AFF30080504600F05CF885F8239024B169 -:10366000002140F68600AFF3008095F82D00FFF7AB -:10367000BFFA064695F8230028B1002CE4D00021BB -:1036800040F68C001FE024B100214FF40960AFF335 -:10369000008005EB860000F1270133463A462630CC -:1036A000FFF7EDF924B1002140F69400AFF300805C -:1036B00000F024F8824695F8230038B1002CC3D0DE -:1036C000002140F69A00AFF30080BDE785F82D6039 -:1036D000012085F82300504600F01BF8002C04D090 -:1036E000002140F6A700AFF30080BDE8F087354920 -:1036F00081F82D00012081F82300704710B535486E -:1037000008B1AFF30080EFF3108000F0010072B653 -:1037100010BD10B5002804D12F4808B1AFF30080C8 -:1037200062B610BD2D480068C005C00D10D010381D -:1037300040B2002806DA00F00F0000F1E02090F817 -:10374000140D03E000F1E02090F8000440097047F8 -:103750000820704710B51B4C94F82400002804D1B1 -:10376000F8F7B6F8012084F8240010BD10B5154C08 -:1037700094F82400002804D0F8F7D3F8002084F847 -:10378000240010BD10B51C685B68241A181A24F0B8 -:103790007F4420F07F40A14206D8B4F5800F03D2C9 -:1037A000904201D8012010BD002010BDD0E90032A8 -:1037B000D21A21F07F43114421F07F41C0E900314A -:1037C000704700002C0A0020FF1FA107AC07002053 -:1037D00000000000000000000000000004ED00E018 -:1037E000F0B5734AD2F80032724D002401212E78D0 -:1037F00056B9714E3460704F03263F1D3E606E4FC8 -:1038000004260C373E602970C2F80042D160116076 -:10381000694C4834D16425688542FBD35160D1603E -:10382000C2F80032F0BD2DE9F041044680074FF0A8 -:1038300000054FF0010604D560480560066024F0DD -:103840000204E0044FF0FF3705D55D484660C0F83C -:10385000087324F48054600003D55A48056024F0AE -:103860008044E0050FD55248C0F80052C0F80873F4 -:1038700051490D60091D0D604F4A04210C32116041 -:10388000066124F48074A00409D54F484660C0F84E -:103890000052C0F808734D48056024F40054C4F386 -:1038A0008030C4F3C031884200D0FFDF14F4404FB1 -:1038B00014D047484660C0F8087346488660C0F890 -:1038C0000052C0F8087344490D600A1D16608660F6 -:1038D000C0F808730D60166024F4404420050AD532 -:1038E0003E4846608660C0F80873C0F848733C489C -:1038F000056024F400640DF077FB3A48044200D0E0 -:10390000FFDFBDE8F08170B5202500224FEA0203F9 -:1039100020FA02F1C90719D051B201F01F060124A3 -:10392000B4404E09B60006F1E026C6F88041C6F85C -:103930008042002906DA01F00F0101F1E02181F84F -:10394000143D03E001F1E02181F80034521CAA4249 -:10395000DED370BD70B5174C0D466060FFF763FF96 -:103960006068FFF7D0FF2846F8F7A7F80CF05EFF75 -:1039700000F0ABF80DF038FB0DF083FAF8F78CF996 -:10398000BDE870400DF000B810B50A4C6068FFF754 -:103990004AFF6068FFF7B7FF0DF026FBF8F721F943 -:1039A0000020606010BD0348406870470A207047DF -:1039B000008000408C00002004850040FC1F004077 -:1039C00000C0004004E5014000D0004004D50040A4 -:1039D00000E0004000F0004000F5004000B0004072 -:1039E00008B50040FEFF0FFD70B522490A680AB312 -:1039F0000022154601244B685B1C4B60092B00D349 -:103A00004D600E7904FA06F30E681E420FD0EFF3F4 -:103A1000108212F0010272B600D001220C689C43A1 -:103A20000C6002B962B649680160002070BD521C8A -:103A3000092AE0D3052070BD4FF0E0214FF480004B -:103A4000C1F800027047EFF3108111F0010F72B658 -:103A50004FF0010202FA00F20648036842EA03024C -:103A6000026000D162B6E7E70248002101604160D0 -:103A70007047000094000020AD4911F8410F4978CB -:103A8000884201D3401A02E0C1F141010844C0B2AA -:103A90007047A749433111F8410F4978884201D353 -:103AA000401A02E0C1F141010844C0B27047A04988 -:103AB000863111F8410F4978884201D3401A02E05B -:103AC000C1F141010844C0B270479A4910B5802045 -:103AD00081F8000496490020433101F8410F4870F5 -:103AE000934901F8410F48709149863101F8410F1F -:103AF000487091480DF00EF98F48401C0DF00AF9FE -:103B0000EFF7DAF8BDE8104000F006B94020704742 -:103B1000B2E770B50C4605460026FFF7ADFF844AB4 -:103B2000A04214D30021641EE4B20FD392F84200E5 -:103B3000105C05F8010B92F84200401CC0B282F8FC -:103B400042004128EFD182F84210ECE7012600F054 -:103B5000E3F8304670BD402070479AE770B50C46D8 -:103B600005460026FFF795FF714A4332A04214D361 -:103B70000021641EE4B20FD392F84200105C05F8F5 -:103B8000010B92F84200401CC0B282F8420041286A -:103B9000EFD182F84210ECE7012600F0BDF8304684 -:103BA00070BD402101700020704710B50446FFF73A -:103BB0007EFF2070002010BD70B50C460546FFF753 -:103BC00076FF5B4A8632A04215D30021641EE4B220 -:103BD0000FD392F84200105C05F8010B92F84200F6 -:103BE000401CC0B282F842004128EFD182F8421056 -:103BF000ECE7002401E042F2070400F08DF82046D3 -:103C000070BD70B50C460546412900D9FFDF4B4811 -:103C10000068103840B200F066F8C6B20D2000F01F -:103C200062F8C0B2864203D2FFDF01E0EFF794F8FA -:103C300021462846FFF76DFF0028F7D070BD2DE91B -:103C4000F0413D4F0025064617F10407412257F881 -:103C5000254094F8421094F8410000F053F888B3DE -:103C60006D1CEDB2032DF1D331484122433090F861 -:103C7000421090F8410000F045F8002831D02C485F -:103C8000412290F8421090F8410000F03BF80028E3 -:103C900027D027484122863090F8421090F8410002 -:103CA00000F030F800281CD0EFF72CF822480DF077 -:103CB00039F8B0F5005F00D0FFDFBDE8F0411E48E5 -:103CC0000DF046B894F84100265494F84100401C89 -:103CD000C0B284F841004128C6D1002084F84100D8 -:103CE000C2E7BDE8F081002806DA00F00F0000F11D -:103CF000E02090F8140D03E000F1E02090F80004BB -:103D000040097047401C884204D0904200D109B15C -:103D1000002070470120704710B507480DF002F8E9 -:103D2000002803D1BDE81040EEF7D7BF10BD00005A -:103D30005C0A00200DE000E09C00002004ED00E0A3 -:103D4000164908784A78401CC0B2904205D0144BFE -:103D500001221A60BFF34F8F087070472DE9F041C0 -:103D60000E4C4FF0E02600BFEFF77CF820BF40BFBD -:103D700020BF677820786070D6F80052EDF7CCFA53 -:103D8000854305D1D6F8040210B92078B842EBD0AB -:103D9000EFF763F80020BDE8F0810000AC000020E0 -:103DA000180502402DE9F041012528034FF0E021DC -:103DB0000026C1F880011E4CC4F800610C2000F000 -:103DC0002CF81C4801680268C94341F3001142F015 -:103DD00010020260C4F804532560491C00E020BFB3 -:103DE000D4F80021002AFAD019B9016821F0100195 -:103DF0000160114807686560C4F80853C4F80061A1 -:103E00000C2000F00AF83846BDE8F08110B50446F1 -:103E1000FFF7C8FF2060002010BD00F01F02012145 -:103E200091404009800000F1E020C0F88012704706 -:103E300000C0004010ED00E008C500402DE9F0474B -:103E4000FF4C0646FF21A06800EB06121170217896 -:103E5000FF2910D04FF0080909EB011109EB0617F3 -:103E60004158C05900F0F4F9002807DDA168207816 -:103E700001EB061108702670BDE8F08794F8008009 -:103E800045460DE0A06809EB05114158C05900F006 -:103E9000DFF9002806DCA068A84600EB08100578CA -:103EA000FF2DEFD1A06800EB061100EB08100D709C -:103EB0000670E1E7F0B5E24B0446002001259A6860 -:103EC0000C269B780CE000BF05EB0017D75DA742DE -:103ED00004D106EB0017D7598F4204D0401CC0B262 -:103EE0008342F1D8FF20F0BD70B5FFF704FBD44C3E -:103EF00008252278A16805EB0212895800F0A8F97C -:103F0000012808DD2178A06805EB01114058BDE8C3 -:103F10007040FFF7E7BAFFF7B8F9BDE87040F7F770 -:103F2000E9BE2DE9F041C64C2578FFF7E4FAFF2DF4 -:103F30006ED04FF00808A26808EB0516915900F002 -:103F400087F90228A06801DD80595DE000EB0511CA -:103F500009782170022101EB0511425C5AB1521E11 -:103F60004254815901F5800121F07F418151284659 -:103F7000FFF764FF34E00423012203EB051302EB97 -:103F8000051250F803C0875CBCF1000F10D0BCF5DF -:103F9000007F10D9CCF3080250F806C00CEB423C6D -:103FA0002CF07F4C40F806C0C3589A1A520A09E018 -:103FB000FF2181540AE0825902EB4C3222F07F4209 -:103FC0008251002242542846FFF738FF0C21A06896 -:103FD00001EB05114158E06850F82720384690471A -:103FE0002078FF2814D0FFF786FA2278A16808EB22 -:103FF00002124546895800F02BF9012893DD2178FB -:10400000A06805EB01114058BDE8F041FFF76ABA1E -:10401000BDE8F081F0B51D4614460E460746FF2B5D -:1040200000D3FFDFA00700D0FFDF8548FF2100227B -:10403000C0E90247C5700671017042708270104677 -:10404000012204E002EB0013401CE154C0B2A8427C -:10405000F8D3F0BD70B57A4C064665782079854274 -:1040600000D3FFDFE06840F825606078401C607096 -:10407000284670BD2DE9FF5F1D468B460746FF248D -:10408000FFF739FADFF8B891064699F80100B8420F -:1040900000D8FFDF00214FF001084FF00C0A99F81B -:1040A0000220D9F808000EE008EB0113C35CFF2BD7 -:1040B0000ED0BB4205D10AEB011350F803C0DC451A -:1040C0000CD0491CC9B28A42EED8FF2C02D00DE0B8 -:1040D0000C46F6E799F803108A4203D1FF2004B09A -:1040E000BDE8F09F1446521C89F8022008EB041129 -:1040F0000AEB0412475440F802B00421029B00224C -:10410000012B01EB04110CD040F801204FF4007892 -:1041100008234FF0020C454513D9E905C90D02D01B -:1041200002E04550F2E7414606EB413203EB04134F -:1041300022F07F42C250691A0CEB0412490A8154E2 -:104140000BE005B9012506EB453103EB041321F023 -:104150007F41C1500CEB0411425499F800502046A5 -:10416000FFF76CFE99F80000A84201D0FFF7BCFEF3 -:104170003846B4E770B50C460546FFF7BCF906466D -:1041800021462846FFF796FE0446FF281AD02C4DFC -:10419000082101EB0411A8684158304600F058F896 -:1041A00000F58050C11700EBD14040130221AA68EE -:1041B00001EB0411515C09B100EB4120002800DC47 -:1041C000012070BD002070BD2DE9F0478846814672 -:1041D000FFF770FE0746FF281BD0194D2E78A86800 -:1041E0003146344605E0BC4206D0264600EB0612B6 -:1041F0001478FF2CF7D10CE0FF2C0AD0A6420CD18A -:1042000000EB011000782870FF2804D0FFF76CFE47 -:1042100003E0002030E6FFF76BF941464846FFF720 -:10422000A9FF0123A968024603EB0413FF20C85429 -:10423000A878401EB84200D1A87001EB041001E03C -:10424000280B002001EB061100780870104613E6D9 -:10425000081A0002C11700EB11600012704700003D -:1042600070B50446A0F500002D4EB0F1786F02D273 -:104270003444A4F500042B48844201D2012500E017 -:10428000002500F043F848B125B9B44204D32648CC -:10429000006808E0012070BD002070BD002DF9D13C -:1042A000B442F9D321488442F6D2F3E710B504466C -:1042B000A0F50000B0F1786F03D219480444A4F5CA -:1042C000000400F023F84FF0804130B11648006838 -:1042D00004E08C4204D2012003E014488442F8D266 -:1042E000002080F0010010BD10B520B1FFF7DEFF07 -:1042F00008B1012010BD002010BD10B520B1FFF79E -:10430000AFFF08B1012010BD002010BD08480949C9 -:104310000068884201D101207047002070470000EA -:1043200000000020003002002000002008000020D3 -:10433000B0000020BEBAFECA0548064A0168914294 -:1043400001D100210160044901200860704700008C -:10435000B0000020BEBAFECA40E50140534800212B -:104360000170417010218170704770B50546164686 -:104370000C460220EEF73FFA4C49012008704C49E8 -:10438000F01E08604B480560001F046070BD10B54A -:104390000220EEF730FA4549012008704648002116 -:1043A000C0F80011C0F80411C0F8081143494FF4D7 -:1043B0000000086010BD3D480178C9B1404A4FF483 -:1043C000000111603C49D1F800310022002B1CBFD4 -:1043D000D1F80431002B02D0D1F8081111B142708C -:1043E000102103E001214170364909688170027093 -:1043F0000020EEF700BA2D480178002904BF40786C -:1044000070472D48D0F80011002904BF02207047E2 -:10441000D0F8001100291CBFD0F80411002905D0E4 -:10442000D0F80801002804BF012070470020704721 -:104430001E4800B50278204B4078C821491EC9B2F9 -:1044400082B1D3F800C1BCF1000F10D0D3F8000145 -:1044500000281CBFD3F8040100280BD0D3F80801B2 -:1044600050B107E0022802D0012805D002E000295F -:10447000E4D1FFDF002000BD012000BD0B48017822 -:10448000002904BF807870470B48D0F8001100293C -:104490001CBFD0F80411002902D0D0F8080108B1DF -:1044A0001020704707480068C0B27047B400002071 -:1044B00010F5004008F5004000F0004004F5014010 -:1044C00008F5014000F400404C48002101704170A3 -:1044D000704770B5064614460D460120EEF78BF97D -:1044E00047480660001D0460001D056070BD70B582 -:1044F000424A012540EA01411570424A41F080716B -:104500001160414C0026C4F80461404A4FF04071EC -:104510001160002802BFC4F80052256070BD012858 -:1045200018BFFFDFC4F8006225604FF00070384903 -:10453000086070BD3148017879B1344A4FF040715C -:1045400011603149D1F804210021002A08BF4170CF -:1045500002D0304A1268427001700020EEF74BB969 -:1045600026480178002904BF407870472648D0F8D3 -:104570000401002808BF704726480068C0B2704791 -:10458000002808BF704730B51C480078002808BFD5 -:10459000FFDF1D48D0F80411002918BF30BD0224E8 -:1045A000C0F80443DFF870C0DCF80010C1F3001558 -:1045B000DCF8001041F01001CCF80010D0F8041124 -:1045C000002904BF4FF400414FF0E02207D100BFA3 -:1045D000C2F8801220BFD0F80431002BF8D02DB9DA -:1045E000DCF8001021F01001CCF80010C0F80843EE -:1045F00030BD05490120886070470000B7000020E9 -:1046000008F5004004F5004000F0004008F50140C6 -:1046100004F5014000F4004010ED00E070B5FF4CDF -:1046200000250120657025706572A572E07284F81E -:104630002150A56204F1380065630CF06BFB002883 -:1046400018BFFFDFA577F6480DF0F6FBF5494FF0F0 -:10465000FF300860091D0860091D0D60091D086014 -:10466000091D0D60091D0860091D0860091D08600D -:10467000091D0860091D0860091D0860091D086002 -:10468000091D0860091D086070BD30B4E349026867 -:10469000DFF898C34A6142688A61007A08770A7D28 -:1046A000E14BACF1040401204AB10A7E00FA02F2A7 -:1046B0001A608D7D002D0CBF2260CCF800204A7D51 -:1046C000002A04BF30BC70474A7E90401860C97D04 -:1046D00000290CBF2060CCF8000030BC7047D549E1 -:1046E000D3480860091DD4480860704710B50446D7 -:1046F000012908BF002105D002291ABFFFDF0021D0 -:104700004FF0807141F48470CA4940F48010086011 -:10471000E0B240F44030091D40F000700860C74826 -:10472000D0F80001002818BFFFDF10BD01202DE9DF -:10473000F04102254FF0E0270026C7F88051C0491C -:104740000E600860BF490A6822F0770242F08802D2 -:1047500042F000420A60091D0A6822F47F4242F4D6 -:10476000B0520A60AD4CB84965770D60B84AB74998 -:104770001160121FB7491160B74A40F25B611160C6 -:10478000121F40F203111160111F0860B34903208A -:104790000860B3499620086094F91E000CF06AFD89 -:1047A000607F002814BF4FF4C020AE48AE490860B7 -:1047B000AF49AE480860091FAE480860C7F880528C -:1047C0009E491020C1F8040384F82D60BDE8F081F3 -:1047D000A948016821F0010141F080710160704732 -:1047E0008E4A0368C2F802308088D0801172704708 -:1047F0008A4890F821007047884A517010707047BD -:10480000F0B50546800000F1804000F580508B88AF -:10481000C0F820360B78D1F8011043EA0121C0F826 -:10482000001605F10800012707FA00F6934C002A4C -:1048300004BF2068B04304D0012A18BFFFDF2068FE -:1048400030432060206807FA05F108432060F0BD7E -:1048500010B504460CF00EFD7048847710BD6F480B -:1048600090F82E0070476D4890F830007047844AE9 -:10487000C1781160006883490002086070472528EC -:1048800008BF02210ED0262808BF1A210AD02728E7 -:1048900008BF502106D00A2894BF0422062202EB4A -:1048A0004001C9B2784A116078490860704770B415 -:1048B0005A4B93F80AC0BCF1010F21D0BCF1020F92 -:1048C0001CBF70BC70475C7D002C04BF70BC70477F -:1048D0004FF47A74BCF1010F6D4E16D0DD7D93F864 -:1048E00019C0002D18BF0125012908BF292121D099 -:1048F000022A08BF674E06F2E141B1FBF4F119E06C -:104900001C7D002CE4D170BC70479D7D93F818C0CD -:10491000002D18BF0125012947D0022A06BF5E4E8F -:104920004FF47A714FF4C861314401F5FA7100BF58 -:10493000B1FBF4F1491F0844584908605849002068 -:10494000C1F84C014FEA0C2085F0010140EA01500A -:1049500040F00311187F820002F1804202F5C0424C -:10496000C2F810154F4901EB8001987EC20002F198 -:10497000804202F5F832C2F81415DFF82CC1C2F8F3 -:1049800010C5DA7ED30003F1804303F5F833C3F892 -:1049900014153849C3F81015012101FA00F09140AF -:1049A00008434249086070BC7047022A14BF4FF4A4 -:1049B000C8614FF47A7149F6FC621144B8E72DE9F9 -:1049C000F0411E4D0746032014468846C5F80002F4 -:1049D000124E707F002814BF4FF4C0202148334985 -:1049E000086040460CF094FC20460CF071FC01205D -:1049F00017B1012F60D062E02D4B19685A06022CC6 -:104A0000D2F8202314BFC2F30622C2F3066221F4B7 -:104A1000FE4141EA02211960B0724BE0380B0020E0 -:104A20004C0B0020000E0040180500500C050050F3 -:104A3000060102001415004025000302001000408A -:104A4000FC1F00403C1700406015004044800040BF -:104A50009CF5014028110040381500401015004019 -:104A6000441500400000040408F501404080004067 -:104A7000A4F501401011004074170040401600409A -:104A8000241500401C150040081500405415004036 -:104A9000A224020004360200683602004C85004061 -:104AA00000800040006000404C81004004F501405F -:104AB00088150040286002E00221B1726860F9495F -:104AC000C864F948006822464146BDE8F041EEE678 -:104AD0002DE9F0418846F549074603201546C1F8FF -:104AE0000002F34C607F002814BF4FF4C020F1484F -:104AF000F14E306040460CF00BFC28460CF0E8FB11 -:104B000017B1012F19D021E0EC490A684806022D9F -:104B1000D0F8200314BFC0F30620C0F3066022F4CF -:104B2000FE4242EA002008600120A072606B40F45F -:104B3000801060634FF4801007E00220A072606B69 -:104B400040F4001060634FF4001030602A46414684 -:104B5000BDE8F0410020AAE62DE9FF4FD34C824684 -:104B6000002681B003208946C4F80002D04D687F3A -:104B7000002814BF4FF4C020CE48CF4F38600398B0 -:104B80000CF0C6FB04980CF0A3FBCD494FF00108D4 -:104B9000BAF1000F03D0BAF1010F32D03BE0C74B9E -:104BA00004981A684FF0805C0228DCF8200314BFD8 -:104BB000C0F30620C0F3066022F4FE4242EA002061 -:104BC00018600C6095F82D00012806D0022818BF47 -:104BD000FFDF0CD085F80A801DE0DDE9031395F8AE -:104BE0002C2048460CF0E6FBA96A4618F2E7DDE9FE -:104BF000031295F82C3048460CF097FBA96A46182A -:104C0000E8E7B048086095F82D00012818BFFFDFDD -:104C100020D00220A872AC480660AD49AB480860BD -:104C2000686B40F400206863D4F800924FF0100ADB -:104C3000C4F808A30025C4F80052A6484FF4802BFE -:104C4000C0F800B0FF208DF80000C4F81051C4F87F -:104C500010800EE0DDE9031395F82C2096200CF06F -:104C600087FBA96A4618D4E79DF80000401E8DF81E -:104C700000009DF8000018B1D4F810010028F3D00E -:104C80009DF80000002808BFFFDFC4F80051C4F8F9 -:104C90000C51C4F81051C4F80451C4F81451C4F8AC -:104CA0001851C4F828518C4800680090C4F800924C -:104CB000C7F800B0C4F804A34FF400203860794866 -:104CC000C0F84C8078480068B04228BFFFDF30460B -:104CD000DDE9031205B0BDE8F04FE8E52DE9F8473E -:104CE000724CD4F8000220F00309D4F804034FF00A -:104CF000100AC0F30018C4F808A30026C4F8006224 -:104D00006B4D687F002814BF4FF4C020694871497B -:104D10000860A87A0127012802D0022803D014E0F5 -:104D2000287D10B911E0687D78B1A87EEA7E07FA87 -:104D300000F007FA02F210430860287F800000F1BB -:104D4000804000F5C040C0F81065FF208DF80000DD -:104D5000C4F81061276104E09DF80000401E8DF842 -:104D600000009DF8000018B1D4F810010028F3D01D -:104D70009DF80000002808BFFFDFC4F81061C4F8E8 -:104D800028616E72AE72EF72C4F80092B8F1000F33 -:104D900018BFC4F804A3BDE8F88700684F4920F0A5 -:104DA0007F40086070474FF0E0200221C0F880117A -:104DB000C0F8801270474FF0E0210220C1F80001D6 -:104DC000704747490870704710B546480BF0AAFF76 -:104DD000002818BFFFDF10BD42480BF0B9BF4249A1 -:104DE0000860704730B5324C0546A06AA84228BF1B -:104DF000FFDF012020732561607F40B128442061DE -:104E00002A48D0F8001241F04001C0F800122549AC -:104E10000020C1F84401354920690860606B2649CB -:104E200040F4800060634FF48000086030BD70B5CE -:104E30001F4C0546022020730CF057FA024694F8E6 -:104E40002C1028460CF0E0FA2061617F41B1084443 -:104E500020611648D0F8001241F04001C0F800125D -:104E600010490020C1F844012169A06A08441F4983 -:104E7000086070BD17494FF4800008600C48416B12 -:104E800021F480014163002101737047054801212D -:104E90004160C1600021C0F8441114480160044819 -:104EA00081627047008000404C8500400010004047 -:104EB000380B00200000040404F501408815004070 -:104EC000ACF5014004100040488500404881004096 -:104ED000A8F5014008F50140181100403C150040BC -:104EE000B9000020700B00200415004044850040EC -:104EF000FE4940204877FE490860FE48D0F800127D -:104F000041F04001C0F800127047FA48D0F8001292 -:104F100021F04001C0F80012F549022008607047F6 -:104F2000F448D0F8001221F01001C0F8001201215D -:104F300081617047EF480021C0F81C11D0F80012C1 -:104F400041F01001C0F800127047EA4981B0D1F871 -:104F50001C21012A1EBF002001B07047E64A1268DA -:104F600002F07F02524202700020C1F81C01E348A7 -:104F700000680090012001B0704730B50C00054674 -:104F800008BFFFDF14F0010F1CBF012CFFDF002D55 -:104F90000CBF01200220D54901284872CC72D549A6 -:104FA00004BFD1F8000240F0040007D0022807BF78 -:104FB000D1F8000240F00800FFDF30BDC1F8000268 -:104FC00030BD70B5C94C0023E17A11F0020F18BF53 -:104FD00010F0040F16D111F0100F1CBF94F82F2001 -:104FE000002A02D094F8312062B111F0080F1CBFE2 -:104FF00094F82020002A05D111F0040F03D094F872 -:10500000211001B9012394F809C00122B949BCF16A -:10501000000F06D000F00200184312D0BDE8704027 -:105020005CE6607F002814BF4FF4C020B448B54B45 -:105030001860D1F8000220F00300C1F80002E2720B -:1050400070BD00252846BCF1010F0BD0BCF1020F4A -:1050500018BFFFDF16D0A06A01222844BDE87040C7 -:10506000002124E4D1F8003223F00403C1F8003217 -:105070006072E272A27201231A46002196200CF09F -:1050800054F90FE0D1F8003223F00803C1F80032E0 -:105090006072E2720220A07201231A46002196205B -:1050A0000CF066F90546D6E72DE9F84F964FD7F88C -:1050B0004C218E4C93494FF00108A07A0026CAB1CA -:1050C000012802D0022803D014E0227D12B911E099 -:1050D000627D7AB1A27EE37E08FA02F208FA03F357 -:1050E0001A430A60227F920002F1804202F5C04218 -:1050F000C2F81065626B0A606663217B29B1D7F83C -:105100004411012908BF012200D00022794DD5F8B1 -:10511000101101290CBF40210021012805BFD5F83D -:105120000C31012B002320231943012805BFD5F89A -:105130000431012B002310230B437449022804BFC0 -:10514000D1F800C0BCF1010F07D1D5F80CC1BCF1FA -:10515000010F08BF4FF0080C01D04FF0000C4CEAD3 -:105160000303022804BF0968002905D1D5F80C11F2 -:10517000012908BF042100D000211943022803D1CE -:10518000002A18BF022200D100221143022804BFC6 -:10519000D5F80401012805D1D7F84401012818BF2A -:1051A000012000D1002040EA01095948016811F0AE -:1051B000FF0F03D0D5F81411012900D0002184F885 -:1051C0002E10006810F0FF0F03D0D5F81801012849 -:1051D00000D0002084F82F004E48006884F830008A -:1051E00043480068402803D1FFF705F9012800D0A3 -:1051F000002084F83100C5F80061C5F80C61C5F8DD -:105200001061C5F80461C5F81461C5F81861C5F8E6 -:105210002861414800680090C7F844613F48006831 -:105220004D46DFF8FC900090D9F800106162607F75 -:1052300000281CBF081A60623A480068A0620CF09F -:1052400054F884F82C00A07ADFF8DCA084F82D0054 -:1052500002280CD1607850B1DAF8001009780840C3 -:10526000217831EA000008BF84F8208001D084F85A -:105270002060DFF8B88015F0010F15D098F8001005 -:105280002B4A4908606A52F8211088470121294AAF -:1052900098F80030A06A52F82320904798F8000050 -:1052A00010F0010F0BD01FE015F0200F18BF0221E6 -:1052B000EDD115F0020F18BF0021E8D1EEE7DAF8C2 -:1052C0000000062200F10901A01C0CF0E9FB40B926 -:1052D000207ADAF800100978B0EBD11F08BF01205E -:1052E00000D0002084F82100284625E0380B00205B -:1052F0006015004000100040481500401C1100409F -:105300000000040408F50140008000400014004043 -:105310004016004010140040181100404481004025 -:10532000448500404085004004150040B90000203D -:10533000D022020008230200FFF743FE15F0020FFF -:1053400005D03D4898F8001050F82100804715F02E -:105350000C0F07D0394898F8001050F82110C5F309 -:10536000C000884715F0200F05D0354898F8001088 -:1053700050F82100804798F80000022805D105F078 -:105380006E00402806D101F0DDFB98F800000428EB -:1053900028BFFFDFA07A022818BFBDE8F88F207B66 -:1053A000002808BFBDE8F88FC7F84461022815D06F -:1053B000012818BFFFDFA16A2069884298BFFFDF7C -:1053C000D4F81000C9F80000606B1E4940F480005A -:1053D00060634FF480000860BDE8F88F2169A06A1F -:1053E0000844EFE7012804BF28207047022804BFC3 -:1053F0001820704700B5FFDF282000BD012804BF3A -:1054000041F6A4707047022804BF41F2883070470B -:1054100000B5FFDF41F6A47000BD012804BF41F2D2 -:10542000D4707047022804BF41F20400704700B5F1 -:10543000FFDF41F2D47000BDD8220200E822020052 -:10544000F822020004F5014010B53F480AF0F7FBCE -:1054500000213D480AF022FC01213B480AF0F2FB02 -:105460003A49002081F822004FF6FF7088843849BD -:105470000880488010BD704734498A8C824218BF2A -:105480007047002081F822004FF6FF708884704733 -:105490002D49016070472E49088070472B498A8C3E -:1054A000A2F57F43FF3B03D000210160084670470F -:1054B00091F822202549012A1ABF0160012000200D -:1054C0007047224901F1220091F82220012A04BFED -:1054D00000207047012202701D4800888884104611 -:1054E00070471B49488070471849194B8A8C5B8864 -:1054F0009A4206D191F82220002A1EBF01600120A5 -:105500007047002070471148114A818C528891429F -:1055100009D14FF6FF71818410F8221F19B10021C3 -:10552000017001207047002070470848084A818CAC -:105530005288914205D190F8220000281CBF00201B -:1055400070470120704700009A0B0020740B002068 -:10555000BA0000207047574A012340B1012818BF04 -:105560007047137008689060888890817047537006 -:105570000868C2F802008888D08070474D4A10B190 -:10558000012807D00EE0507860B1D2F80200086020 -:10559000D08804E0107828B19068086090898880ED -:1055A0000120704700207047424910B1012803D004 -:1055B00006E0487810B903E0087808B10120704788 -:1055C0000020704730B58DB00C4605460D2104A86B -:1055D0000CF02BFBE0788DF81F0020798DF81E0071 -:1055E00060798DF81D002868009068680190A868AF -:1055F0000290E868039068460BF0B2F920789DF8B5 -:105600002F1088420CD160789DF82E10884207D167 -:10561000A0789DF82D10884202BF01200DB030BD4A -:1056200000200DB030BD30B50C4605468DB04FF0B2 -:10563000030104F1030012B1FEF790FA01E0FEF756 -:10564000E0FA60790D2120F0C00040F04000607168 -:1056500004A80CF0EAFAE0788DF81F0020798DF8A4 -:105660001E0060798DF81D00286800906868019020 -:10567000A8680290E868039068460BF071F99DF8FD -:105680002F0020709DF82E0060709DF82D00A070F6 -:105690000DB030BD10B5002904464FF0060102D010 -:1056A000FEF75CFA01E0FEF7ACFA607920F0C0008A -:1056B000607110BDBE00002070B5FA4E044696F829 -:1056C00092000025012828D096F88C00012833D0BC -:1056D00096F86A0001281CBF002070BD6570132079 -:1056E0002070202206F16C01A01C0CF005FA0120AC -:1056F000A07186F86A50B6F86E10A6F88E10EA49C6 -:1057000049684A7B86F8902086F88C000888FBF769 -:10571000AFFAFAF71FFF012070BD657019202070E5 -:10572000D6F89300C4F80200D6F89700C4F8060033 -:1057300086F89250012070BD657006202070D6F862 -:105740008E00C4F8020086F88C50E4E7D54890F843 -:105750006A10002914BFB0F86E004FF6FF70704752 -:1057600070B5D14800250570017800291CBFFFDF06 -:1057700070BDCC4C84F8625084F8635084F8645057 -:1057800084F8655084F85E5084F8605084F8565070 -:1057900084F8365084F867507F21817094F8660051 -:1057A00028B1FFF7B2FBFEF706FE84F8665084F8D6 -:1057B0006A5084F88C5084F89250BC480AF0D6F8AD -:1057C000BDE87040BA480AF0D1B8B64890F8620017 -:1057D0007047B44900B591F8580091F85710C0F3DC -:1057E0008002C0F340031A4400F001001044052970 -:1057F00010D2DFE801F00B070B030900AD4931F8C7 -:10580000100000BDAC4800BDAC4900E0AC4931F827 -:10581000100000BDFFDF002000BDA24840F2712152 -:10582000B0F85A00484370479E4890F86800002836 -:1058300018BF0120704710B59A4C207A022818BF73 -:10584000032808D1207C04F1110108F071FF082819 -:105850001CBF012010BD207A002816BF022800209E -:105860000120BDE81040FFF79FBE8E4908727047C7 -:105870008C4981F8600070472DE9F041894C82B075 -:10588000207A002816BF022800200120607204F14F -:105890000A01FFF773FE207A022816BF03280121B0 -:1058A000002184F85F10082084F85D00607A0126EA -:1058B000002504F10A02012804BF527912F0C00F3A -:1058C0000AD004F10A02012804D1507900F0C00086 -:1058D000402801D0002000E0012084F85E0029B9B2 -:1058E00094F85700012818BF042806D1207C04F141 -:1058F000110108F01DFF84F85D002560FDF7B8F880 -:1059000060604FF0000894F85D0008F02DFF074636 -:1059100094F85F00002818BF002F04D010213846EB -:1059200009F093FD68B194F8600000281CBF94F85A -:105930005E0000281DD0607A04F10A0101280ED013 -:1059400012E06672424604F10A013846FFF76BFE28 -:1059500094F85D1004F10A0008F0FEFF09E04879B0 -:1059600000F0C000402840D0294604F10A00FFF7AB -:1059700091FE04F10A014D480AF01EF8617A4B4885 -:105980000AF03FF804F10A0149480AF015F8617A73 -:1059900047480AF036F894F8570001281EBF04283B -:1059A00002B0BDE8F081002594F85D0008F0E5FE46 -:1059B000040004BF02B0BDE8F081102109F045FDEC -:1059C00000281CBF02B0BDE8F0812A466946204687 -:1059D000FFF729FE6946354809F0FCFF01213348ED -:1059E0000AF01CF802B0BDE8F08108F0EEFF424674 -:1059F00004F10A01FFF717FEBBE770B5294C417BA4 -:105A000084F85810017984F8571001290CBF00223E -:105A10000288A4F85A20827B84F868208279002AC0 -:105A200016BF022A002201222274D0F80720C4F8EF -:105A30001120B0F80B00A4F8150094F856000125C9 -:105A4000002818BF84F8635094F83600002818BF67 -:105A500084F8645005293AD2DFE801F0030C1E34C3 -:105A60000C000021114809F084FF01210F4809F0C2 -:105A7000BFFF2DE001210D4809F07BFF04F111016A -:105A80000A4809F0A7FF217C084809F0C7FF012157 -:105A9000064809F0ADFF1BE00621044809F069FF44 -:105AA00016E00000BC0B0020CC000020580C0020A9 -:105AB000800C002028230200D0891300302302002C -:105AC000202302000221FE4809F053FF00E0FFDF1F -:105AD0000421FC4809F04DFF84F86250002070BD9D -:105AE00070B5F94C0546002084F864002A4604F19C -:105AF00017000CF001F884F83650012084F8640097 -:105B000070BD10B5F04C002284F8632084F8560074 -:105B1000024604F137000BF0EFFF012084F8630028 -:105B200010BDE94981F8670070472DE9F041E74E63 -:105B300082B0307808BBE44C94F86200E8B1FFF71B -:105B400043F9002584F8615075702846FFF739F94C -:105B5000FEF7ECFDFEF7C3FDDD48FEF788FEDD48ED -:105B6000FFF71BF994F85800002610F0010F08D039 -:105B70002520FEF784FE012612E002B00C20BDE8CD -:105B8000F08110F0020F04D02620FEF778FE0226E6 -:105B900006E010F0040F03D02720FEF770FE042665 -:105BA000FEF79DFD84F85C60FFF705F900210122F6 -:105BB0000846FEF78DFF0F210520FEF71DFE94F825 -:105BC0005E00002804BF94F85F00002805D194F817 -:105BD0005700012818BF042874D1FCF749FF064676 -:105BE00031466068FDF755FCBB4990FBF1F701FBBE -:105BF000170041423046FCF746FC6060206838449C -:105C0000206008F092FD2168884274D8C4E90056EB -:105C10004FF0010894F85D0008F0A6FD064694F8E0 -:105C20005F000127002818BF002E04D01021304645 -:105C300009F00BFC68B194F8600000281CBF94F8D0 -:105C40005E0000281DD0617A04F10A0001290ED0FF -:105C500012E03A46677204F10A013046FFF7E3FCAE -:105C600094F85D1004F10A0008F076FE09E040792E -:105C700000F0C00040281DD0414604F10A00FFF7A3 -:105C800009FD04F10A018E4809F096FE617A8C48FC -:105C900009F0B7FE04F10A018A4809F08DFE617A25 -:105CA000884809F0AEFE94F85700012818BF042870 -:105CB00021D108E008F089FE3A4604F10A01FFF715 -:105CC000B2FCDEE717E0012794F85D0008F055FD0F -:105CD000060010D0102109F0B8FB60B93A466946B9 -:105CE0003046FFF7A0FC6946754809F073FE0121B4 -:105CF000734809F093FE617A04F10A00FEF770FD23 -:105D000094F8570001281EBF042894F86300002867 -:105D100008D094F8562004F13701694809F09CFE38 -:105D200084F8635094F8640040B194F8362004F18C -:105D30001701644809F0BCFE84F8645008F069FD5E -:105D4000664808F0FAFD84F86600FFF745F802B0EF -:105D50000020BDE8F0815D494860704770B55A4C3D -:105D600006002BD094F8581094F85C20002521EA06 -:105D7000020010F0010F04D02520FEF780FD012560 -:105D800015E011F0020F02D012F0020F06D011F050 -:105D9000040F0CD012F0040F05D008E02620FEF707 -:105DA0006EFD022503E02720FEF769FD0425FEF7BE -:105DB00096FC94F85C00284384F85C0094F8610039 -:105DC00040B194F85700012808BFFFDFBDE87040DC -:105DD00000F0BFBA36B1002201234FF4967110468D -:105DE000FEF7BAFE3648FEF7FAFF94F8570005288A -:105DF00009D2DFE800F0030303090300012108468C -:105E0000FFF7BBF800E0FFDF94F8580094F85C104F -:105E100030EA01014FF0010002D02C49087070BD3A -:105E200094F85710012912BF84F86100002184F80A -:105E30005C10F2E710B5FEF7C7FF2448007840B9C0 -:105E4000214890F8620020B10020FFF787FF002072 -:105E500010BDFFF71BF8FFF70DF8FEF73FFFFEF749 -:105E6000A2FFFEF7B9FF0C2010BD184901204870B1 -:105E70007047154981F86500704770B5002503F03B -:105E8000A3FA48B1114E3078012809D0022801D078 -:105E9000032842D0FFDF70BDBDE8704000F059BA62 -:105EA000094C94F85700032837D094F8660018B1CD -:105EB000FEF76DFAFFF71CF80848FEF790FF0FE0B9 -:105EC000580C0020800C0020BC0B0020CC000020CF -:105ED0001B2302001823020040420F00A80C0020E0 -:105EE0009620FEF7A4FF94F85700012818BF042855 -:105EF0000AD094F86800012814BF0328102545F043 -:105F00000E010020FFF739F894F86700012808BF58 -:105F1000FFF710F80220307070BDBDE8704001201E -:105F20001CE770B5FE4DFF4C95F86700012817D0AF -:105F300095F8660018B1FEF7E8FFFEF73CFA03F0AB -:105F400043FAB8B12078022818BFFFDF0120FFF71D -:105F500005FF207800281EBF20780128FFDF70BDD4 -:105F6000F148FEF7F2FF002804BF7F20A070FEF783 -:105F7000D7FFDDE7BDE8704000F0EBB92DE9F05F39 -:105F800007464FF00009FEF76AFCE64E824630787D -:105F9000022818BFFFDFE24D7F2495F86700012833 -:105FA00030D0E24809F004FD83464FF0FF08002F8F -:105FB00000F0E480DD4809F00EFE002800F0DE80ED -:105FC000FEF716FC002800F0D98095F86600D74F40 -:105FD00068B108F003FC8046FF2808D00146F81C91 -:105FE00008F0EBFB404608F004FC40EA0A0A584679 -:105FF0004FF0000B062880F0C180DFE800F0BFBF43 -:10600000BF0CBF69C848FEF7A0FF002808BFB470E6 -:10601000FEF786FFC5E795F85700012818BF04284A -:1060200070D0BAF1000F18D195F86800002818BF99 -:10603000022867D13878F91CC0F3801008F078FB8B -:10604000824608F0DAFC40B1504608F096FB20B1D9 -:10605000102109F0FAF9002854D095F867000128BA -:1060600004BF95F89200002805D0B148FEF7B7FEAE -:106070000320307084E0012085F89200B8F1FF0F12 -:106080000FD005F19402511E404608F07FFB002816 -:1060900008BFFFDF95F8930040F0020085F89300F9 -:1060A0000CE03878C0F3801085F89300D5F8EF0045 -:1060B000C5F89400B5F8F300A5F89800B07805F19C -:1060C0009A077F2808BFFFDFB0783870B470CCE73C -:1060D0003878297CC0F38010884209D1062205F166 -:1060E0001101F81C0BF0DCFC002808BF012000D0D7 -:1060F0000020B8F1FF0F06D0C0B995F85D0040450B -:106100001AD113E03AE0B8B13878F91CC0F3801026 -:1061100008F00EFB044608F070FC38B1204608F089 -:106120002CFB18B1102109F090F928B195F857000F -:10613000012818BF04281DD095F85700F0B9BAF10E -:10614000000F17D195F86800002818BF012815D155 -:106150003878F91CC0F3801008F0EAFA044608F019 -:106160004CFC38B1204608F008FB18B1102109F0AA -:106170006CF918B195F865002C46D8B14FF00109BB -:1061800095F8660018B1FEF7C0FEFEF714F9B9F1F4 -:10619000000F1CBF0120FFF7E1FD307800281ABF77 -:1061A00030780128BDE8F09F3078032818BFFFDF62 -:1061B000BDE8F09F7068D4F8FB10C0F80E10B4F87A -:1061C000FF10418294F801110175B97D4175B7F84E -:1061D0001710C182B7F819104180B7F81B108180E1 -:1061E000B7F81D10C180534908300BF02AFE97F80C -:1061F000240000F01F017068017697F82410490907 -:1062000080F864113A78417BC2F340121140417327 -:1062100094F86A00002818BFFFDF84F86CB0D6F845 -:1062200004A0BAF80000A4F86E00BAF80200A4F8BE -:106230008400BAF80400A4F88600BAF80600A4F8AE -:1062400088009AF8640184F88A0094F85F0048B1E5 -:10625000607A04F10A01012804D1487900F0C000F5 -:10626000402835D094F8600040B1607A04F10A010A -:10627000012804BF487910F0C00F29D0C4F878B0C5 -:10628000A4F87CB03878B8F1FF0FC0F380108AF81A -:106290001900D4F8EF00CAF81A00B4F8F310AAF8FD -:1062A0001E101CD0C4F87E00BAF81E00A4F88200AC -:1062B00004F17202511E404608F068FA002808BF37 -:1062C000FFDF94F8710040F0020084F8710015E0DF -:1062D000D4F80A00A067E089A4F87C00D2E7164849 -:1062E0000BF0A6FD9AF8190084F87100DAF81A008C -:1062F000C4F87200BAF81E00A4F87600012084F8F1 -:106300006A0070680088FAF7B3FCFAF713F986F8A8 -:1063100000B0FEF7BBFDFEF7ADFDFEF7DFFC0DE0C4 -:10632000BC0B0020CC000020CE000020A80C0020D8 -:10633000800C0020C70C00203A0C0020FEF733FD33 -:10634000FEF74AFD012003F09CF919E7012203F052 -:1063500048BA70B5FEF79AFDFEF78CFDFEF7BEFC5D -:10636000FEF721FD1F4C002694F8660028B1FEF7C9 -:10637000CCFDFEF720F884F866601B4D2E70FEF70A -:106380002BFD94F85700012804D0BDE87040002090 -:1063900003F077B9022003F074F994F86A0000283A -:1063A00018BFFFDF6878002808BF70BD207C84F824 -:1063B0007100D4F81100C4F87200B4F81500A4F804 -:1063C00076003C2084F86C0068680188A4F86E10A0 -:1063D000012184F86A100088FAF74AFCFAF7AAF853 -:1063E0006E7070BDBC0B0020CC0000202DE9F04188 -:1063F000FF4F044600207978FE4D4FF00108064615 -:1064000011B1012923D007E095F85310002918BFD6 -:1064100087F8018000D0012079782B2211FB02F14E -:10642000294491F82820104318D02A22A01C293191 -:106430000BF062FB66700420207084F8028078788C -:106440002B2110FB01F0284480F8286023E095F808 -:106450002810002918BF7E70DDD1DDE795F87E0099 -:10646000E0B1D5F87F00C4F80200D5F88300C4F885 -:106470000600D5F88700C4F80A00D5F88B00C4F8E8 -:106480000E0095F88F00A07466701220207084F8BA -:10649000028085F87E600120BDE8F08195F8220039 -:1064A00001281ED0287801281CBF0020BDE8F081FB -:1064B0006670132020702022A91CA01C0BF01CFB6E -:1064C000A6712E70A888A884D5F89C00417B85F819 -:1064D000261085F822800088FAF7CAFBFAF73AF806 -:1064E000D9E7667006202070686AC4F8020085F853 -:1064F0002260D0E7BF480178002914BF80884FF69A -:10650000FF7070472DE9F041BA4C064694F8280018 -:10651000002818BFBDE8F081304609F049FA01466D -:1065200001250020072937D2DFE801F00A040736E9 -:106530003636090084F82A5009E0032000E00220E2 -:1065400084F82A0004F13301304609F09BFA84F8FC -:10655000320094F8AF0018B1FDF74DFF01281FD0AD -:10656000304609F057FA84F82B0004F12C0130462C -:1065700009F029FA9E4E04F1520730787F2808BFAF -:10658000FFDF307838707F20307084F82850BDE805 -:10659000F041032001F005BF84F83200BDE8F0812E -:1065A000FDF76CFF04F12C02511E08F0EFF80028F3 -:1065B00008BFFFDF94F82B1041F0020184F82B1084 -:1065C000D8E710B5002001F0F6FD8A4CA8B1FEF71F -:1065D000F2FB012200211046FEF7F1F904F1BC00A4 -:1065E000FEF7FDFBD4F8B400FEF7FCFB94F8A00026 -:1065F000032818BF02281FD022E0FEF747FCFEF751 -:1066000039FCFEF76BFBFEF7CEFB94F8AF0030B120 -:10661000FEF77BFCFDF7CFFE002084F8AF000120E1 -:1066200084F8B800022084F8B200FEF7D5FBBDE87C -:106630001040002001F0B5BE01210020FEF79DFCB6 -:10664000FEF778FC94F8AF0018B1FDF7A0FEFEF756 -:106650004FFC032084F8B20010BD66490028B1F851 -:10666000BA202CD0FF2A0BD24FF6FF7000EA42006E -:10667000A1F8BA00FF2888BFFF2001D9A1F8BA000D -:106680005B484268012A12BF002A0D224260D243B1 -:10669000C2EBC20303EB021291F8B930DB4303EB08 -:1066A000830CCCEB83131A444260900CB1F8BA20EF -:1066B000B0FBF2F302FB130081F8B9007047012A26 -:1066C000DED95008A1F8BA0008BF0120D8D1D5E71B -:1066D00070B5484C002584F8B250012684F8B260A9 -:1066E00094F8B20002281BBF94F8B20001280020E1 -:1066F000FFDF18BF70BD2B2101FB004181F828503E -:10670000401CC0B20228F6D3257084F8225094F8B9 -:10671000AF0028B1FEF7F9FBFDF74DFE84F8AF504E -:1067200084F8AE5084F89B60324884F8A05084F816 -:10673000B15040F2011120F8981F817070BD2DE911 -:10674000F0412C4C05460C2794F8B20001281FBFDD -:1067500094F8B20002280C20BDE8F081FEF734FB6B -:10676000FDF7E4FFFDF7BBFF94F898000126002831 -:1067700001BF94F89900002894F89A00002874D07A -:1067800094F8A000032802D0022805D008E00521D3 -:10679000194800F0DEFE03E00321174800F0D9FE9F -:1067A00094F8AC00002804BF94F8AD00002847D04E -:1067B000FCF75EF907463946D4F8A800FCF769FEF5 -:1067C0000E4990FBF1F801FB180041423846FBF7F7 -:1067D0005AFEC4F8A800D4F8A4004044C4F8A400A9 -:1067E00007F0A3FFD4F8A410884229D8002007E0BE -:1067F000D4000020D00C0020B40D002040420F0037 -:10680000C4E9290794F8AD0000281CBF012008F056 -:10681000AFF8012194F8AE0000281CBF94F8AC003A -:1068200000280DD094F8910004F19202012804D1BF -:10683000507900F0C00040280ED01046FEF72AFF25 -:1068400094F8911004F19200FDF7CAFF94F8B20099 -:106850000027012818D112E008F0B7F8324604F1F9 -:106860009201FEF7E0FEEBE7FFE794F8B2000228A2 -:1068700004BF84F8B2600C2006D1BDE8F08184F832 -:10688000B860022084F8B20094F89B0080B108F050 -:1068900018F8FE4808F051F884F8AF00FC48C4F836 -:1068A000B450FEF77AFAFEF797FA3846BDE8F08161 -:1068B00007F0AFFFEDE770B5FEF786FAF54C94F8F8 -:1068C000B200022803D0FEF787FA0C2070BD012029 -:1068D00084F8B900A4F8BA000220FEF772FAEE4874 -:1068E000FDF7C5FFED4B002004F1980294F8B110BC -:1068F000491CA3FB015C4FEA5C0CACEB8C0C6144C3 -:10690000C9B284F8B110895C012907D0401CC0B21B -:106910000328EBD3FFF755FE002070BD94F8B100BB -:10692000DF49085CFDF7ABFFFDF7D9FEF2E710B5D4 -:10693000D84C94F89030022B14BF032B00280BD1B5 -:1069400000291ABF022901200020114607F0F0FE9D -:1069500008281CBF012010BD94F89000002816BF25 -:10696000022800200120BDE81040FEF71DBEC948E6 -:1069700090F89000002816BF022800200120FEF7A2 -:1069800013BEC44981F890007047C24981F8AE0037 -:10699000704770B5BF4C94F89000002816BF0228CD -:1069A0000020012084F8910004F19201FEF7E6FD39 -:1069B00094F89000022816BF03280121002184F8D2 -:1069C000AD1094F89100002504F19202012804BF53 -:1069D000527912F0C00F0AD004F19202012804D1BA -:1069E000507900F0C000402801D0002000E00120D4 -:1069F00084F8AC00002804BF002970BDC4F8A4507E -:106A0000FCF736F8C4F8A80094F8AD0000281CBFC5 -:106A1000002007F0ADFF002694F8AE0000281ABF52 -:106A200094F8AC00002870BD94F8910004F1920134 -:106A3000012804D1487900F0C000402806D029463A -:106A400004F19200BDE87040FEF724BE07F0BDFFE0 -:106A5000324604F19201BDE87040FEF7E4BD002823 -:106A600016BF0228012200228A4981F89B2081F862 -:106A7000A100704770B5874D0C4600280CBF01215E -:106A8000002185F89B1085F8A2004FF0080085F8DA -:106A9000A3000BD1002C1ABF022C012000201146AC -:106AA00007F046FE85F8A300082801D0002070BD3D -:106AB000022C14BF032C1220F8D170BD754A032894 -:106AC00008BFC2F89C1082F8A000002070477149EE -:106AD00091F8A000032804D0012818BF022807D08D -:106AE00004E091F8A200012808BF70470020704719 -:106AF00091F8A100012814BF03280120F6D17047A6 -:106B000010B5FEF7C3F9FEF7B5F9FEF7E7F8FEF7A3 -:106B10004AF9604C94F8AF0030B1FEF7F6F9FDF792 -:106B20004AFC002084F8AF00012084F8B80002205D -:106B300084F8B200FEF750F9002010BD554981F8E5 -:106B4000B300704710B5FEF7A1F9FEF793F9FEF711 -:106B5000C5F8FEF728F94F4C94F8AF0030B1FEF7B6 -:106B6000D4F9FDF728FC002084F8AF00012084F858 -:106B7000B800022084F8B200FEF72EF9BDE81040FC -:106B8000002001F00EBC2DE9F84F424CFF217F2779 -:106B9000444E84F8B0104FF00008002800F0DC826A -:106BA00004F1BC0008F0E7FF30B904F1BC0009F0C3 -:106BB00002F8002800F0D08294F8B200334D052886 -:106BC00080F0C782DFE800F0F1F1F103F0002F4818 -:106BD00008F0EEFEB07094F89B0030B9FDF73FFE70 -:106BE000002808BF4FF0000801D04FF0010894F8CA -:106BF000AF0078B107F0F2FD84F8B0000146FF283D -:106C00000CD0E81C07F0D9FD94F8B00007F0F1FDB6 -:106C100040EA080894F8B000FF2812D107F081FE7E -:106C200084F8B00094F89B1059B1082809D128784D -:106C3000E91CC0F3801007F07BFD082818BF4FF057 -:106C40000008B078072880F0C781DFE800F04BB873 -:106C500004FCFCFC300094F8AF0018B1FEF755F9C5 -:106C6000FDF7A9FB0F48FEF770F9002808BF377041 -:106C7000FEF756F9B8F1000F00F0598194F8A00022 -:106C8000012818BF022840F052810DE08C0D002031 -:106C900038230200D00C00203E230200ABAAAAAA8F -:106CA0003B230200D4000020FEF718F868E094F8B7 -:106CB000AF0018B1FEF729F9FDF77DFBFE48FEF79E -:106CC00044F9002808BF3770FEF72AF9B8F1000F21 -:106CD00000F02D8194F8A00002284AD001284FD05E -:106CE00000F025B994F8AF0018B1FEF70EF9FDF7E2 -:106CF00062FBF148FEF729F9002808BF3770FEF75C -:106D00000FF9B8F1000F00F0128194F8A0000228EA -:106D10002FD0012834D003281CBFFFDFBDE8F88F37 -:106D2000E978D4F89C00827E91421BD12979C27EF9 -:106D3000914217D16979027F914213D1A979427F9B -:106D400091420FD1E979827F91420BD1297AC27F9A -:106D5000914207D12978427EC1F38011914208BF48 -:106D6000012100D0002194F8A220012A0ED0E9B11F -:106D7000D9E0D248FFF7C6FBBDE8F84F00F002BBF0 -:106D8000CE48FFF7BFFBBDE8F84F1AE4002974D1E5 -:106D900000F11A01C94808F016FEC84808F03AFE8A -:106DA000D4F89C104876BEE024E1D2E194F8A30028 -:106DB00008287DD094F8B01081425ED0B7E094F8F6 -:106DC000AF0018B1FEF7A1F8FDF7F5FABA48FEF7E3 -:106DD000BCF8002808BF3770FEF7A2F894F8AD00A1 -:106DE00000280CBF4FF0010B4FF0000B4FF00009D3 -:106DF0002878C10905F1090007D0407900F0C000EA -:106E0000402808BF4FF0010A01D04FF0000A94F863 -:106E1000A000032806D194F89B00002818BF94F81E -:106E2000A30001D194F8B00007F09EFC009088B157 -:106E3000102108F00AFB002818BF4FF0010BBAF12F -:106E4000000F07D000E0C7E005F109010098FEF748 -:106E5000B9FB814694F8A00003280FD0FDF73EFF50 -:106E6000B8F1000F69D0FDF7C3FC50EA090064D007 -:106E70009248FFF747FB00F041B954E0D4F89C007A -:106E8000E978827E91421DD12979C27E914219D141 -:106E90006979027F914215D1A979427F914211D13E -:106EA000E979827F91420DD1297AC27F914200E037 -:106EB0003DE007D12978407EC1F38011814208BFAF -:106EC000012500D0002594F8B000082805D094F8DA -:106ED000A310884208BF012600D00026B9F1000F98 -:106EE00005D1BBF1000F04D0FDF782FC08B10121F0 -:106EF00000E00021B8F1000F09D094F8A2000128A9 -:106F000003D020B955EA060001D0012000E000209E -:106F100001420CD094F8A200012804BF002DD4F83F -:106F20009C003FF435AFBDE8F84F00F08ABAFDF79A -:106F3000D5FEBDE8F84FFFF744BB94F8A100032845 -:106F400018BF02287ED1BAF1000F7BD0B9F1000F33 -:106F500078D1DFF8688194F87E00002872D101258D -:106F600084F8805094F8AF0018B1FDF744FA012876 -:106F700021D0404608F04EFD84F8810004F18201E2 -:106F8000404608F020FD404608F051FD84F8880096 -:106F900004F18901404608F024FD307804F18F089F -:106FA0007F2808BFFFDF307888F80000377084F84A -:106FB0007E500320A0E0FDF761FA04F18202511E29 -:106FC00007F0E4FB002808BFFFDF94F8810040F0E1 -:106FD000020084F88100D6E794F8AF0018B1FDF7FD -:106FE00094FFFDF7E8F93448FDF7AFFF00286CD1B6 -:106FF0003770CAE0314808F0DBFCB0703048E978FF -:10700000427A91421CD12979827A914218D16979C8 -:10701000C27A914214D1A979027B914210D1E979C7 -:10702000427B91420CD1297A827B914208D1297806 -:107030000078C1F38011B1EBD01F08BF012500D04B -:10704000002500E042E0FDF749FEB07804286BD14E -:10705000D5B31948FDF779FF002808BF3770FDF751 -:107060005FFF94F8B80000281CBF0020FFF7F5FA76 -:107070004FF0010884F8B880104D94F8530028BBF5 -:10708000042084F8550094F8AF00A5F1910918B1D7 -:10709000FDF7B1F9012835D0284608F0BBFC0949B5 -:1070A00081F8560009F12C01284608F08CFC00BF3D -:1070B00004F15E0128460AE0D40000208C0D002077 -:1070C000B40D0020D00C00202EE05EE016E008F0A9 -:1070D00005FD84F85D001F2884BF1F2084F85D0033 -:1070E00004F17D0530787F2808BFFFDF30782870F5 -:1070F000377084F85380042001F053F9BDE8F84F4D -:10710000FFF75FBAFDF7BAF909F12C02511E07F03B -:107110003DFB002808BFFFDFFE4890F8560040F016 -:10712000020089F82B00C3E7FB48FDF70EFF00289B -:1071300008BF3770FDF7F4FE94F8B800002804BFCC -:107140000120FFF78AFA84F8B880BDE8F84FFFF70E -:1071500038BAFFDFBDE8F88F94F8B200052828BFE1 -:10716000BDE8F88FDFE800F0030303041900F1E73E -:1071700094F8AF0018B1FDF7C8FEFDF71CF9E6481A -:10718000FDF7E3FE00283FF433AFFDF7C9FEFDF73E -:10719000A5FDBDE8F84FFFF714BADF48FDF7D5FEAF -:1071A000002808BF3770FDF7BBFE94F8B800002830 -:1071B00004BF0120FFF751FA84F8B880FDF78EFD77 -:1071C000BDE8F84FFFF7FDB970B5D24C94F8B200A6 -:1071D000072878D2DFE800F08D8D8D8D8D041000AA -:1071E000CE48FDF7FCFDFDF7A5FE9620FDF71FFE3E -:1071F000042084F8B20070BDFDF748FEFDF73AFEAA -:10720000FDF76CFDFDF7CFFD012584F8B850022095 -:1072100084F8B200FDF7E0FD2078002818BFFFDFFA -:107220000026A670D4F89C000188A1804188618363 -:107230008188A183C088E08384F8206094F8AD1031 -:10724000B74849B10178C21CC1F3801121B151790D -:1072500001F0C00140292ED094F8AE1041B110F8D1 -:10726000031BC1F3801119B1407910F0C00F22D077 -:10727000AC480AF0DDFD00BF94F8AF0018B1FDF78F -:10728000BAF8012820D0D4F89C00417EE171D0F8F2 -:107290001A10A160C08BA081666126832570D4F886 -:1072A0009C000088F9F7E4FCF9F744F9BDE8704068 -:1072B000022001F076B8D4F8E700C4F80E00B4F864 -:1072C000EB006082D8E714E0FDF7D8F804F108027B -:1072D000E11D07F05BFA002808BFFFDFE07940F00E -:1072E0000200E071D4F8BF006061B4F8C3002083ED -:1072F000D4E7FFDF70BD70B5864C94F8B20000256E -:10730000052828BF70BDDFE800F03939391B0300BC -:107310008148FDF71AFE10B97F497F200870FDF7FC -:10732000FFFD94F8B800002804BF0120FFF795F98D -:1073300084F8B850FDF7D2FCBDE87040FFF741B9C2 -:10734000FDF7A4FDFDF796FDFDF7C8FCFDF72BFD4D -:1073500094F8AF0028B1FDF7D8FDFDF72CF884F8BC -:10736000AF50012084F8B800022084F8B200FDF785 -:1073700033FDBDE87040002001F013B870BD01225C -:1073800001F0E1B870B5012000F015FF614CC8B103 -:1073900004F1E401A1F1280008F04CFB04F1E4063B -:1073A00094F89110304608F02CFB04F1920130461D -:1073B00008F002FB94F8AD00C0B394F8A0000328D5 -:1073C0001FD025E0FDF762FDFDF754FDFDF786FCBB -:1073D000FDF7E9FC94F8AF0030B1FDF796FDFCF73E -:1073E000EAFF002084F8AF00012084F8B8000220F2 -:1073F00084F8B200FDF7F0FCBDE87040002000F01A -:10740000D0BF94F89B00002818BF94F8A30001D1C6 -:1074100094F8B00007F0DBFA050007D001213046F0 -:1074200008F0EFFA2946304608F0C6FA3C48FDF766 -:10743000D6FC01210846FDF7A0FD052084F8B20026 -:1074400070BD70B5022000F0B6FE324C68B301206A -:1074500000F0A7FF04F1E401A1F1280008F0EAFA26 -:10746000D4F89C00417B04F1E40008F0C1FAD4F8A0 -:107470009C0004F1BC0204F1E4061278417BC2F3E3 -:1074800040121140417394F89110304608F0B9FA57 -:1074900004F19201304608F08FFA94F8AD00B8B3C9 -:1074A00094F8A00003281FD025E0FDF7EFFCFDF7BE -:1074B000E1FCFDF713FCFDF776FC94F8AF0030B16A -:1074C000FDF723FDFCF777FF002084F8AF000120D3 -:1074D00084F8B800022084F8B200FDF77DFCBDE816 -:1074E0007040002000F05DBF94F89B00002818BF9A -:1074F00094F8A30001D194F8B00007F068FA0500F1 -:1075000014D00121304608F07CFA294630460BE0C1 -:107510000CE00000D00C0020D40000208C0D0020D6 -:10752000B40D0020DE0C002008F046FAD4F89C00D0 -:10753000C18A324808F0FEFAD4F89C00417D2F48F9 -:1075400008F0FCFA2D48FDF74AFC062084F8B2004A -:1075500070BD70B50C46054608F008FA032C47D0FC -:10756000052C18BF70BD0521284608F002FA244CEE -:10757000D4F89C0000F10E01284608F0C5FAD4F8B2 -:107580009C0000F11201284608F0C2FAD4F89C00D1 -:10759000417D284608F0D2FAD4F89C00C18A2846DA -:1075A00008F0C8FAD4F89C004188284608F0B6FADA -:1075B000D4F89C008188284608F0B4FAD4F89C00DE -:1075C000C188284608F0B2FAD4F89C0000F10801FE -:1075D000284608F0CDFAD4F89C00017E284608F031 -:1075E000AFFA94F8B3102846BDE8704008F0B2BA7C -:1075F0002846BDE87040032108F0BBB9B40D002057 -:10760000D00C00202DE9FF4F06460C46488881B07B -:1076100040F2E24148430090E08A002500FB01FB74 -:1076200094F8630091460D2818BF0C281ED0252819 -:107630001EBF94F8640025284FF0000A16D0049865 -:1076400018B10121204603F029FB94F8510094F869 -:10765000528094F8C810074659B1012958D0022920 -:107660003DD0032918BFFFDF52D0A6E04FF0010A3A -:10767000E5E7B9F1000F08BFFFDFFE4D686800289D -:1076800008BFFFDF94F85100FDF7C7FE00F2E731B5 -:107690004FF47A70B1FBF0F0696800EB010994F8DF -:1076A0005100FDF7BAFE94F85110022907BFF249C4 -:1076B0004FF47A72F1494FF4C8621144084400F261 -:1076C000E7314FF47A70B1FBF0F040F2E241081A72 -:1076D0002969584449440844051D012015E0E5483E -:1076E000A9F101014068084308BFFFDFE448B9F190 -:1076F000000F006800EB0B0506D0DE48406800F282 -:107700002230A84288BFFFDF032084F8C80053E07E -:1077100094F86310009D25291CBF94F86410252956 -:1077200036D1B4F85810B4F8EA20891A491C09B2C5 -:1077300000292DDB94F8E81009B30F4694F8E910FE -:10774000002918BF8846022807BFCB484FF47A713A -:10775000CA484FF4C8610144022F07BFC6484FF41E -:107760007A72C6484FF4C8621044814208D9081A98 -:1077700000F5FA714FF47A70B1FBF0F0054407E0C0 -:10778000401A00F5FA714FF47A70B1FBF0F02D1A3F -:10779000B9F1000F10D0DFF8DC92D9F8040020B95D -:1077A000B9F80200002818BFFFDFD9F8040000F282 -:1077B0002230A84288BFFFDF05B9FFDF2946D4F891 -:1077C000CC00FAF760FEC4F8CC00B0600020307046 -:1077D0004FF0010986F80490204603F04CFBAAF113 -:1077E0000101084208BF86F8059006D094F8C80049 -:1077F00001280CBF0220032070714046D4F824B049 -:10780000FDF7FCFD0146022F07BF9B484FF47A723B -:107810009A484FF4C8621044084400F23F614FF4A4 -:107820007A70B1FBF0F0584400F5C970F06004982C -:1078300030EA0A0004BF05B0BDE8F08F29463046A3 -:1078400007F010FF87B2204603F015FBB8420FD8AF -:10785000074686F8059005FB07F1D4F8CC00FAF747 -:1078600012FEB0602946304607F0FCFE384487B26D -:107870003946204603F012FAB068C4F8CC0005B0CF -:10788000BDE8F08F2DE9F04304467E4885B00D46F3 -:1078900090F80004DFF8F091400999F800144909C4 -:1078A000884218BFFFDFDFF8CC81002708F13C06D3 -:1078B000082D80F0FA80DFE805F0045B656560F86C -:1078C000F894202C28BFFFDF36F814000621F9F7C2 -:1078D000C5F8050008BFFFDF202C28BFFFDF36F802 -:1078E00014002988884218BFFFDF95F8C8000028D7 -:1078F00008BFFFDF284602F0BCFEC8F80470A8F8F5 -:10790000027029460020C8F8107007F0EFFE00F161 -:107910009804686AA04218D995F85200FDF76EFDE8 -:1079200095F85110022907BF53494FF47A72534911 -:107930004FF4C862114408444FF47A7100F23F607A -:10794000B0FBF1F1686A0844071B29460020C8F81B -:10795000087007F0CBFE698840F2E242514398304C -:10796000081AA0F22230C8F80C0005B0BDE8F08378 -:1079700005B0BDE8F04303F05DB805B0BDE8F043E5 -:10798000FDF792BB99F8140D4049400991F8001495 -:107990004909884218BFFFDF202C28BFFFDF36F8D7 -:1079A00014000621F9F75AF8050008BFFFDF202C64 -:1079B00028BFFFDF36F814002988884218BFFFDF90 -:1079C0000022012329466846FFF71CFE95F8D200E5 -:1079D0006946FBF797FA002808BFFFDF05B0BDE84E -:1079E000F083202C28BFFFDF36F814000621F9F7BA -:1079F00035F8050008BFFFDF202C28BFFFDF36F871 -:107A000014002988884218BFFFDF95F8C8000428B1 -:107A100018BFFFDF85F8C87095F8D2404FF6FF79A0 -:107A2000202C28BFFFDF26F8149095F8D200FBF732 -:107A300000F8002808BFFFDF202085F8D200D5F825 -:107A4000D800002804BFD5F8D400C8F8140008D026 -:107A5000D5E937121144826911448161D5E93501B4 -:107A6000C860D5F8D40000281CBFD5F8D810016133 -:107A700014D10EE0DC0D002068360200A2240200C2 -:107A8000E000002001E000E00BE000E019E000E091 -:107A90000BE0D5F8D800002818BF8761FC480078B3 -:107AA00005B0BDE8F043F4F725B9FFDF05B0BDE848 -:107AB000F0832DE9F047F74D0746E88B6C68401CD2 -:107AC000E88328784FF00008002808BFFFDF07D0C0 -:107AD000DFF8C4A3042814D0052818BFFFDF40D066 -:107AE00021462869FAF7CFFCB86087F800800120AA -:107AF0003871A86800F5B370F860287804287CD144 -:107B000085E00029ECD02E69DAF8141039B38946E3 -:107B1000C9680029FBD1B9F1000F20D099F8000005 -:107B2000002808BFFFDFD9F81410D9F80400014479 -:107B30003046FBF7AEFC002807DA211A4A1E92FBFA -:107B4000F4F202FB0406214604E090FBF4F202FB8F -:107B5000140621468E4288BFFFDF3446C0E7444604 -:107B6000BEE70029BCD0D5F81890B9F1000F08BFC6 -:107B7000FFDF0026D9F8DC10DAF814403046721E18 -:107B80005CB1A069884228BF824284BF0246264673 -:107B90002046E468002CF4D106B9064609F1C80471 -:107BA000C9F8D860002E04BFC4F80C80CAF814408D -:107BB00005D0F068F460E060002818BF0461D4F8D4 -:107BC0001090C4F81880B9F1000F0ED0D9F8180041 -:107BD00048B1D4F814A0504538BFFFDFD9F81800D9 -:107BE000A0EB0A00A061C9F81880002E08BFC5F8F4 -:107BF000208009D03078002800E00DE008BFFFDFCA -:107C0000716970680844286240F6B83468E7E88B08 -:107C10000A2838BF032000D302207871E88B01289E -:107C200006D93846696807F01DFDE98B0844E883EA -:107C3000B8682861BDE8F0872DE9F0418046974893 -:107C400084B00E4690F80004954F410997F800045F -:107C50004009814218BFFFDF01210025082E8D4C0D -:107C600062D2DFE806F0041A35353061614D617388 -:107C70002173607800281CBF04B0BDE8F0818648FD -:107C8000456005612573A068C138FEF758FD0028DE -:107C900018BFFFDF04B0BDE8F081607850B1207BF1 -:107CA000002808BFFEF72CFF657304B0BDE8F04163 -:107CB000FAF7E9BDA173FEF7FEFD002818BFFFDF4C -:107CC00004B0BDE8F08104B0BDE8F041FDF7ECB9C7 -:107CD00097F8140D7349400991F800144909884236 -:107CE00018BFFFDF00216846FFF7E3FE6946404604 -:107CF000FBF708F9002808BFFFDF04B0BDE8F081FA -:107D00002078052818BFFFDF207F002808BFFFDF8D -:107D100025772570207DFAF78CFE002808BFFFDF4D -:107D2000257504B0BDE8F081FFDF04B0BDE8F08147 -:107D30002DE9F041574C0026207804281FBF2078F9 -:107D400005280C20BDE8F08101206070607B0025D3 -:107D5000A8B1EFF3108010F0010F72B60CBF00272E -:107D60000127607B00281CBFA07B002805D0FEF700 -:107D7000C7FE6573A573FAF786FD2FB903E0207D72 -:107D8000FBF7D3F900E062B6207DFBF71CFC207FF7 -:107D900028B125772078052818BFFFDF0C266570ED -:107DA0002570207DFAF745FE002808BFFFDF257506 -:107DB0003046BDE8F0812DE9F04F364883B00078B9 -:107DC000002818BFFFF7B4FF0120DFF8CC8088F847 -:107DD000000069460620F8F7CCFD002818BFFFDF39 -:107DE00000274FF6FF7934E0029800281CBF90F876 -:107DF000C81000292DD0008848451CBFDFF8A8A076 -:107E00004FF0200B3BD00621F8F728FE040008BFF6 -:107E1000FFDF94F8D200FBF7D6FB84F8C87094F823 -:107E2000D2504FF6FF76202D28BFFFDF2AF81560CD -:107E300094F8D200FAF7FDFD002808BFFFDF84F8B0 -:107E4000D2B069460620F8F794FD002818BFFFDF7E -:107E500010E06846F8F76BFD0028C5D00FE00298E7 -:107E600000281CBF90F8C810002903D0008848459E -:107E7000C9D104E06846F8F75AFD0028EFD088F829 -:107E80000070C8F8147003B00020BDE8F08F000047 -:107E9000DC000020F40D0020DC0D002001E000E0FB -:107EA0000BE000E019E000E0180E002010B50078AB -:107EB000F84C60B101280CBF40F6C410FFDF06D0BB -:107EC000A06841F66A01884228BFFFDF10BDA060AC -:107ED000F6E710B5EF4C00232070EF4803704370B5 -:107EE000037703734373837320218361017518380B -:107EF00043703A3010214FF6FF72428020F8042F71 -:107F0000491EFAD1180008BFA36005D0002B0EBF90 -:107F1000FFDF40F6C410A060A06841F66A01884205 -:107F200028BFFFDFBDE8104045E72DE9F043DA4CFC -:107F3000054685B0207816460F4600281EBF0C2047 -:107F400005B0BDE8F08395F8519095F85200D5F84A -:107F50002480FDF753FAB9F1020F07BFCF494FF460 -:107F60007A72CF494FF4C862114408444FF47A79C9 -:107F700000F23F60B0FBF9F0404400F22230C5F857 -:107F8000DC00A56195F8C800002818BFFFDF40F2AB -:107F90007120784360600120FDF730FA00F2E7308D -:107FA000B0FBF9F040F2712106FB0100A0606168AE -:107FB000A1F2F621884298BF01460020A160B9498C -:107FC00008610521217060702077E083B648FAF7D8 -:107FD000D5FC2075202808BFFFDFFAF749FD206196 -:107FE00001216846FFF765FD207D6946FAF78AFFA3 -:107FF000002808BFFFDF002005B0BDE8F083A648D9 -:10800000007800281CBF0020704710B50620F8F744 -:10801000C1FC80F0010010BD30B59F4C85B02278C6 -:10802000002A1EBF0C2005B030BD0D4640F2712164 -:10803000484360600120FDF7E1F94FF47A7100F2E6 -:10804000E730B0FBF1F040F2712105FB0100A060C8 -:108050006168A1F2F621884298BF01460020A16024 -:10806000607004212170E0838F48FAF787FC207547 -:10807000202808BFFFDF8B48406938B10146C0683F -:108080000028FBD111B1FAF7F3FC05E0FAF7F0FC98 -:1080900040F6B831FAF7F7F9206101216846FFF799 -:1080A00008FD207D6946FAF72DFF002808BFFFDF95 -:1080B000002005B030BD70B5774CA1690160FFF7B5 -:1080C00037FE002300BBA169D1F8D8205AB1D1E90D -:1080D00037C5AC449569AC44C2F818C0D1E9352C19 -:1080E000CCF80C2005E0DFF8BCC1D1F8D420CCF8E6 -:1080F0001420D1F8D420D1F8D810002A18BF11616B -:1081000002D1002918BF8B61A36170BD6549487019 -:10811000704770B540F2E24300FB03F510460C4691 -:10812000FDF76CF9022C07BF5C494FF47A725C4989 -:108130004FF4C862114408444FF47A7100F23F6072 -:10814000B0FBF1F000F2223085428CBF281A0020EB -:1081500070BD70B50D4606460146002007F0C6FA10 -:10816000044696F85200FDF749F996F85110022995 -:1081700007BF4A494FF47A7249494FF4C862114423 -:1081800008444FF47A7100F23F60B0FBF1F071885F -:1081900040F271225143C0EB4100A0F22230A542CF -:1081A00034BF21462946814203D2A5422CBF28462E -:1081B0002046706270BD3B4910B54968002801F146 -:1081C000980408BF04F5BC7409D0012808BF04F561 -:1081D000317404D0022814BFFFDF04F5B0742E48B8 -:1081E0008068A0428CBF0120002010BD10B52D4C2E -:1081F000607828B1D4E90201626807F05BFAA060F8 -:10820000D4E9010188429CBF2078002814BF0020D7 -:10821000012010BD04222DE9F043204FDFF88080BB -:1082200085B04FF47A79052980F0B980DFE801F054 -:108230000A2B033E890080F8C82005B0BDE8F04352 -:10824000FAF721BB044617480078002818BF84F8C5 -:10825000C82004D005B0BDE8F043FAF714BB0122F2 -:10826000002321466846FFF7CDF994F8D20069460D -:10827000FAF748FE002808BFFFDFB4F85800401C9A -:10828000A4F85800E6E7032180F8C81005B0BDE85F -:10829000F0830000DC000020F40D002068360200AE -:1082A000A2240200DC0D0020397C01000446408835 -:1082B00040F2E2414843B3490860D4F8F000214657 -:1082C0000089E082D4F8F00080796075D4F8F0007D -:1082D00040896080D4F8F0008089A080D4F8F00054 -:1082E000C089E0800020A66A07F000FA054694F8ED -:1082F0005200FDF783F894F8511002290EBF4FF495 -:108300007A7147464FF4C8613944084400F23F602F -:10831000B0FBF9F1608840F271225043C1EB40009C -:10832000A0F22230AE4234BF29463146814203D208 -:10833000AE422CBF304628466062022084F8C80056 -:10834000A4E706460146856A002007F0CFF90446F7 -:1083500096F85200FDF752F896F8511002290EBF18 -:108360004FF47A7147464FF4C8613944084400F22B -:108370003F60B0FBF9F0718840F271225143C0EBCD -:108380004100A0F22230A54234BF21462946814255 -:1083900003D2A5422CBF28462046706276E7FFDF55 -:1083A00074E72DE9F041DFF8E0810025774C98F87B -:1083B000001084B0052880F0C180DFE800F00316CB -:1083C0006DB9B900E5830846F3F794FC607800289E -:1083D00073D100216846FFF76CFB207D6946FAF7F0 -:1083E00091FD002808BFFFDF67E00120FDF706F8D8 -:1083F0006749684E08444FF47A71B0FBF1F0216987 -:10840000726840F2E2431144081AA16900F2DE608A -:108410004A88C83102FB03F772698A4208BF002507 -:1084200014D0216AFBF735F8002807DA391A4A1EFA -:1084300092FBF7F202FB0705394604E090FBF7F2E6 -:1084400002FB170539468D4288BFFFDFD8F80800C8 -:10845000854208D2A06940F271224188C1824A4314 -:1084600005EB420505E040F2E240B5FBF0F0A16902 -:10847000C882A06905214175C08A6FF41C71484308 -:1084800005EB400040F635413061B0EB410F28BFAD -:10849000FFDF04B0BDE8F081E5830846F3F72AFC6E -:1084A00001202077A0692169C0F8CC1080F8C8505D -:1084B0002178052918BFFFDF06D0FAF7E4F96573C4 -:1084C000A57304B0BDE8F081002808BFFFDFA069F4 -:1084D00090F8C800002818BFFFDFA06990F8D2000C -:1084E000202818BFFFDF2C48FAF748FAA169064692 -:1084F000202881F8D2000F8828BFFFDF274820F806 -:108500001670A06990F8D200202808BFFFDF002372 -:1085100001226846A169FFF775F8A069694690F8DD -:10852000D200FAF7EFFC002808BFFFDFA561C4E71F -:1085300004B00846BDE8F041F3F7DCBBFFDF04B050 -:10854000BDE8F081704770B5124D0446002912BF96 -:108550000129686070BD02291CBFFFDF70BD6888FB -:10856000401C68801046FCF758FF4FF47A7100F207 -:10857000E730B0FBF1F0201A686070BD0348007866 -:1085800070470000E0000020DC000020F40D002017 -:10859000C92E0200DC0D002085780100180E002095 -:1085A000FE48406870472DE9F0410D4606460146F9 -:1085B0001746012007F09AF8044696F85200FCF797 -:1085C0001DFF96F8521002290CBFF549F5490844E1 -:1085D0004FF47A7100F2E140B0FBF1F0718840F2A3 -:1085E00071225143C0EB4100C01BA0F55970A54258 -:1085F00034BF21462946814203D2A5422CBF2846DA -:1086000020467062BDE8F0812DE9FF4F8FB004462F -:1086100090F85200DDF8709098460B9049EA0800F7 -:108620000C9094F86400002617460D280CBF01201A -:1086300000200890B8F1000F04BF94F8040103284B -:1086400071D1089800286ED0B4F87C01B8426AD184 -:10865000D4F80C01C4F8F800608840F2E2414843C5 -:10866000C4F8FC00B4F85201B4F8DE100844C4F8B1 -:108670000001204604F00DFDB4F88001E08294F87A -:108680007E016075B4F882016080B4F88401A08036 -:10869000B4F88601C549E080C348097894F864318C -:1086A000628830F8111030F81300D4F828A008447C -:1086B0000004000C4FF0000105D000FB02F1BC48A3 -:1086C000B1FBF0F0411C1FFA81FB2146012007F0AD -:1086D0000DF8054694F85200FCF790FE94F85210FD -:1086E00002290CBFAE49AF49084400F2E1414FF402 -:1086F0007A70B1FBF0F1608840F271225043C1EB17 -:108700004000A0EB0B00A0F55970AA4534BF2946E4 -:108710005146814203D2AA452CBF5046284660628A -:10872000022084F80401D4E956ABB4F8DE000390CB -:10873000B4F85001D4F84C110691B8F1000F03D0F1 -:1087400094F8181149B17FE004F1D8010091743117 -:10875000099104F59C75091D07E004F596710091D7 -:10876000091D099104F58E75091D0A91B4F8581078 -:10877000381A791A09B200B20491002805DAD4F83F -:108780004801069001200C90084694F80411002935 -:108790005ED0012900F0668102297DD0032918BF2F -:1087A000FFDF00F0A98131460698F9F76CFE0999C0 -:1087B00008600A9801210780002028702971099813 -:1087C0000068A8607948D0E90520824287BF009AF6 -:1087D0001060009802600098626A0068104400F21D -:1087E0008310E8606971B4F8C800C01B00B20028AB -:1087F000C4BF032068710898002800F0F181B9F126 -:10880000000F18D0B4F8F020002A0CBF0020B4F8F4 -:10881000F200A4F8F20094F8F430401C584390425F -:1088200009D26879401E002805DD6971B4F8F200AC -:10883000401CA4F8F200B8F1000F00F0F58194F8A4 -:108840001801002800F0EC8113B00220BDE8F08F81 -:10885000BAF1000F08BFFFDFE08A40F27121484300 -:10886000490001EB400210980021002806D000FBCF -:1088700002F14F48B1FBF0F000F10101C4F808111A -:10888000608840F2E24100FB01F210994FF00000D5 -:1088900008D001FB02F100E042E04548B1FBF0F0F6 -:1088A00000F10100C4F80C010AF101064FF00100CB -:1088B000FCF7A4FD3F494FF47A7B0844B0FBFBF082 -:1088C000E18A40F271225143C0EB4101D4F8080122 -:1088D0000190091A314401F2C246607D510010FB3B -:1088E00001F00C900120FCF789FD33490844B0FBEE -:1088F000FBF1019801EB40010C9801EB000B01200A -:10890000FCF770FD584400F1620128484161816123 -:10891000A6EB0A00401EB0F53D7F38BFFFDF42E7FF -:10892000E28A40F271215143D4F8FC00109A00EB26 -:1089300041010020002A06D01D4802FB01F2B2FBD3 -:10894000F0F000F10100C4F80801628840F2E2434F -:1089500002FB03FC109B4FF0000206D0144A03FBFD -:108960000CF3B3FBF2F202F10102C4F80C21039AFA -:108970009AB9B9F1000F38D094F85200FCF73EFDD7 -:10898000014694F8520002280CBF054A054A1144DA -:1089900001F2E1424FF47A7110E026E0580E002017 -:1089A00004360200A224020042230200E800002054 -:1089B00040420F007D2A020083290200B2FBF1F140 -:1089C000D4F80821E38A114440F2712CD4F8FC2039 -:1089D00003FB0CF302EB4302561AFCF703FDABEB6F -:1089E00000003044A0F1200600E00E1AD4F8002167 -:1089F000D4F8F810D4F8080101FB020B607D40F2B6 -:108A0000E24110FB01F00C9094F852A05046FCF7A4 -:108A1000F5FC0146BAF1020F0CBFF948F9480844C9 -:108A200000F2E1414FF47A70B1FBF0F000EB4B0142 -:108A30000C9801EB000B5046FCF7D4FC584400F1B5 -:108A40006001F14840F2712341616288D4F80C1151 -:108A50005A43C1EB4201A1F213318161012084F834 -:108A60000401A0E6628840F27123D4F80C115A4345 -:108A7000C1EB420202FB00F6DDE903020244D4F836 -:108A80000001D4F8F8C0121AD4F80831521E0CFBB9 -:108A9000003002FB010B607D40F2E24110FB01F06F -:108AA0000C9094F852000190FCF7A8FC0146019844 -:108AB000022814BFD348D248084400F2E1414FF4E1 -:108AC0007A70B1FBF0F000EB4B010C9801EB000B5E -:108AD0000198FCF787FC584400F16001CA48B9F1DD -:108AE000000F4161A6F2133181613FF45CAEBAF12F -:108AF000000F08BFFFDF56E6628840F27123D4F80A -:108B00000C115A43C1EB420101FB00F694F86300DB -:108B100025281CBF94F8640025280AD1B4F87C01EC -:108B2000381A00B2002804DB94F87F01002818BF2F -:108B30000B900C9828B1039880B3BBF1000F18BFBD -:108B4000FFDFDDE903010144D4F80C0101FB00FA69 -:108B50000B98FCF753FC01460B9802280CBFA84861 -:108B6000A848084400F2E1414FF47A70B1FBF0F0FC -:108B700000EB4A0A0B98FCF735FC504400F1600109 -:108B8000A14840F2712341616288D4F80C115A4324 -:108B9000C1EB4201A1F21331816104E6FFE7BBF1B1 -:108BA000000F14BFBAF1000FFFDF0B98FCF726FC93 -:108BB0000B9902290CBF92499249084400F2E14105 -:108BC0004FF47A70B1FBF0F0361A94F85200FCF7CB -:108BD00009FCABEB00003044A0F12006B1E700BF78 -:108BE000B9F1000F7FF40EAE94F8040100283FF4B1 -:108BF00022AE618840F27122D4F80C015143C0EBDF -:108C00004101284606F02EFD0004000C3FF413AE8F -:108C10001D99002918BF0880012013B0BDE8F08F0E -:108C200094F85401FAF781FA94F854012946FAF7B6 -:108C300069F900281CBF88F0010084F819010020A0 -:108C400013B0BDE8F08F2DE9F04F704C804683B033 -:108C500020788A4600256C4E4FF00209032804BF95 -:108C6000207B40457CD1606830612078032818BFA4 -:108C7000FFDF0327BAF1080F70D2DFE80AF0040E15 -:108C80001B1B166F6F6A6562FCF74FFF002818BF49 -:108C9000FFDFB77003B0BDE8F08FFDF7CBF8002819 -:108CA00018BFFFDF03B0BDE8F08F03B0BDE8F04FA1 -:108CB000FCF7FAB927752574E07A012658B14FF40C -:108CC0007A71A069F9F7DFFBA061002104F11000BF -:108CD00006F0C8FC1AE001216846FAF71AFF9DF871 -:108CE000000042F210710002B0FBF1F201FB12052C -:108CF000FCF793FD05442946A069F9F7C4FBA06180 -:108D0000294604F1100006F0ADFC461C208C411CE5 -:108D10000A293CBF30442084606830B1208C401C5C -:108D20000A2828BF84F8159000D26775607A002859 -:108D30001CBF03B0BDE8F08F207B04F11001FAF7EF -:108D4000E1F8002808BFFFDF03B0BDE8F08F07E0BF -:108D500004E0207BF9F76DFE2570F5E7FFDFF3E710 -:108D6000B8F1200F28BFFFDF294F072137F818007F -:108D7000F7F774FE040008BFFFDFB8F1200F28BF2B -:108D8000FFDF37F818002188884218BFFFDF4FF057 -:108D900001083461BAF1080F80F04481DFE80AF07D -:108DA000049AA2A29DEEEEEDC4F85851F580C4F8E5 -:108DB0005C5194F8190138B9F9F75AFED4F8241126 -:108DC000FAF767FB002825DCB4F81611B4F8580050 -:108DD000814206D1B4F8CC10081AA4F8CE0020467F -:108DE00005E0081AA4F8CE00B4F816112046A4F83D -:108DF0005810D4F84011C4F82411C0F8481127E0E5 -:108E000004360200A2240200E8000020580E0020D0 -:108E1000800E0020B4F81411B4F85800081AA4F811 -:108E2000CE00B4F814112046A4F85810D4F8241138 -:108E3000C4F84011C4F84811D4F82C11C4F8D81063 -:108E4000D4F83011C4F84C11B4F83411A4F850110E -:108E500003F0D7FFF9F7E6FD94F852A00746504615 -:108E6000FCF7CCFABAF1020F0CBFFE49FE490844E8 -:108E70004FF47A7100F2E140B0FBF1F1D4F80C014B -:108E800040F27122014460885043C1EB4000A0F1E0 -:108E9000300AB72F98BFB7272146012006F026FCDD -:108EA0003844AAEB0000A0F21937A246214601205F -:108EB00006F01CFCDAF824109C30814288BF0D1AA1 -:108EC000F760BD4228BF3D46B56084F8188186F83A -:108ED000029039E704F0DBF801E0FCF7E5F884F8EC -:108EE000188131E7F9F7C4FDD4F84821014610464E -:108EF000FAF7CFFA48B1628840F27123D4F80C1126 -:108F00005A43C1EB4201B0FBF1F094F864100D2913 -:108F10000FD0B4F85810B4F816210B189A42AEBF0F -:108F2000501C401C0844A4F8160194F81A0178B9A2 -:108F300005E0B4F81601401CA4F8160108E0B4F8E6 -:108F40001601B4F8CC10884204BF401CA4F81601E6 -:108F5000B4F85201DFF81493401CA4F85201B4F89D -:108F60007E00B4F87C100DF1080B401AB4F85810CC -:108F7000401E08441FFA80FA17E045E052E03078BE -:108F8000002339F81000CDE9005B94F8641139F83A -:108F90001110084481B22046FFF736FB00283FF449 -:108FA000D3AE012818BFFFDF26D0B4F81621AAEBF4 -:108FB000020000B20028E2DA082084F8730084F886 -:108FC0007280204603F0D2FB84F8045194F8545187 -:108FD0004FF6FF78202D00D3FFDF27F8158094F897 -:108FE0005401F9F726FD202084F85401307903B0AC -:108FF000BDE8F04FF2F77EBEB4F81601BDF80810D8 -:109000000844A4F81601D0E794F80401042818BF16 -:10901000FFDF84F8045194F854514FF6FF78202D67 -:10902000DBD3D9E7FFDF8FE610B5914C207850B144 -:1090300001206072FCF71DFF2078032805D0207AFC -:10904000002808BF10BD0C2010BD207BFAF76DF87A -:10905000207BFAF7B8FA207BF9F7EBFC002808BF71 -:10906000FFDF0020207010BD2DE9F04F804F83B04E -:10907000387801244FF0000840B17C720120FCF7E1 -:10908000F8FE3878032818BF387A0DD0DFF8E4915D -:1090900089F8034069460720F7F76BFC002818BFE2 -:1090A000FFDF4FF6FF7440E0387BFAF73EF8387B7D -:1090B000FAF789FA387BF9F7BCFC002808BFFFDF14 -:1090C00087F80080E2E7029800281CBF90F804119E -:1090D00000292AD00088A0421CBFDFF89CA14FF0D5 -:1090E000200B3AD00721F7F7B9FC040008BFFFDFD7 -:1090F00094F85401FAF767FA84F8048194F854510B -:109100004FF6FF76202D28BFFFDF2AF8156094F870 -:109110005401F9F78EFC84F854B169460720F7F73B -:1091200028FC002818BFFFDF12E06846F7F7FFFBB6 -:109130000028C8D011E0029800281CBF90F8041144 -:10914000002905D00088A0F57F41FF39CAD104E08D -:109150006846F7F7ECFB0028EDD089F8038087F824 -:109160000B8003B00020BDE8F08F70B50446434883 -:1091700090F80004424D400995F8001449098842CE -:1091800018BFFFDF95F8140D40093E4991F800140F -:109190004909884218BFFFDF3649002001220C71BF -:1091A00088700A704870C87031490870BDE8704016 -:1091B0005AE73049087070472DE9F8432C4C0646B1 -:1091C0002078002875D13048F9F7D8FB2073202883 -:1091D0006FD0032766602770002565722572AEB1D7 -:1091E000012106F1F400FAF70CFD0620F7F7E0FB89 -:1091F00080460720F7F7DCFB96F8F4104044B1FBFB -:10920000F0F200FB1210401C86F8F400F9F70AFC9B -:109210001E49091838BF40F2F65000F59D7086B21D -:10922000FCF7D7FAE061FCF7F8FA4FF0010878B3E1 -:1092300084F80A8001216846FAF76BFC9DF800006B -:1092400042F210710002B0FBF1F201FB1200064481 -:10925000F9F70EFC3146F9F716F9A0612775677525 -:10926000257416E004360200A22402004223020004 -:10927000580E0020E8000020800E002001E000E0F1 -:109280000BE000E019E000E0478C01000AFAFFFF64 -:1092900012E0207B04F11001F9F734FE002808BF2A -:1092A000FFDF25840020FCF7E4FD0020BDE8F88303 -:1092B000FFE70C20BDE8F883F9F7DAFB3146F9F750 -:1092C000E2F8A061A57284F80B80C7E72DE9F047AA -:1092D00082B00026044680F80461A0F85061DFF8EF -:1092E00000944288FD4FD0F8288099F8000094F847 -:1092F000641137F8100037F8111008440104090C04 -:10930000304605D001FB02F0F649B0FBF1F0401CFD -:109310001FFA80FA2146012006F0E8F9054694F884 -:109320005200FCF76BF894F8521002290CBFEE497A -:10933000EE4908444FF47A7100F2E140B0FBF1F1DC -:10934000608840F271225043C1EB4000A0EB0A005C -:10935000A0F55970A84534BF29464146814203D241 -:10936000A8452CBF4046284660620096019699F8B1 -:10937000000094F86411002337F8100037F811103A -:109380001A46084481B22046FFF73EF9002818BF6C -:10939000FFDFC4F800610120C4F8F86084F804011C -:1093A000A4F81661A4F8146184F81A61B4F858009E -:1093B000401EA4F85800A4F8526102B00020BDE895 -:1093C000F087C74948707047C94810B5417A0124F1 -:1093D000002918BF002408D1C17A31B1406AC549BB -:1093E000884284BF0024FCF740FD204610BD70B5C4 -:1093F000BB4C0546E088401CE080D4E9020162785D -:10940000D5F85861002A1CBF324606F053F9A06017 -:10941000864208D895F80401012804D0E078002895 -:1094200004BF012070BD002070BD70B50D4640F234 -:10943000E24100FB01F42846FBF7E0FF022D0CBFE0 -:10944000A949AA4908444FF47A7100F2E140B0FBFF -:10945000F1F000F54D7084428CBF201A002070BDE1 -:109460002DE9F04383B00026044680F8186190F897 -:10947000D600002807BF94F80401032803B0BDE814 -:10948000F083F9F7F5FAD4F8482101461046FAF7C7 -:1094900000F80028DCBF03B0BDE8F083628840F22A -:1094A0007123D4F80C115A43C1EB4201B0FBF1F027 -:1094B000411CB4F858000144A4F81411B4F8CC10BD -:1094C000B4F81421891A09B20029DCBF03B0BDE841 -:1094D000F083012184F81A11B4F87E10B4F87C20CE -:1094E0007E4F891A491E084485B2DFF8F4810DF1D8 -:1094F00008091EE098F8000037F81000CDE900696F -:10950000B4F8142194F86411012337F811100844B9 -:1095100081B22046FFF778F8002804BF03B0BDE809 -:10952000F08301280FD0022812BFFFDF03B0BDE88F -:10953000F083B4F81401281A00B20028BCBF03B0AD -:10954000BDE8F083D6E7B4F81401BDF8081008446C -:10955000A4F81401EDE7F0B5DFF884C104265F4BF1 -:109560009CF80020002583B006297DD2DFE801F0B9 -:10957000073C03191941044680F8046107E00446DA -:109580009CF80300002818BF84F804610BD0F9F799 -:109590007AF9A4F85251B4F85800A4F8160184F8E6 -:1095A0001A5103B0F0BD33F8120094F804210121E0 -:1095B000032A13BF94F80421C4F80051C4F8F850EA -:1095C000012AE4D1CDE9001594F86411B4F8CC2057 -:1095D00033F811100023084481B22046FFF714F835 -:1095E000002818BFFFDFD2E7032180F8041103B081 -:1095F000F0BD0446B0F802C0866A90F8640133F802 -:10960000121033F8100008440104090C4FF0000058 -:1096100005D001FB0CF03349B0FBF1F0401C87B2E0 -:109620002146012006F062F8054694F85200FBF747 -:10963000E5FE94F8521002290CBF2B492B4908442F -:109640004FF47A7100F2E140B0FBF1F0618840F232 -:1096500071225143C0EB4100C01BA0F55970AE42CE -:1096600034BF2946314600E008E0814203D2AE42D1 -:109670002CBF30462846606203B0F0BDFFDF03B068 -:10968000F0BD2DE9F8431A4C0327154EE27AA17A72 -:1096900042F21079002550B1012843D002281CBFA6 -:1096A000FFDFBDE8F8834FF000081AB95EE04FF025 -:1096B00000080AB1E5722EE051B101216846FAF7BF -:1096C0004DFA9DF800000002B0FBF9F109FB11080A -:1096D000FCF7A3F800EB0801A0690DE042230200AB -:1096E000E800002040420F0004360200A2240200DD -:1096F000580E0020DB821300F8F7C5FEA061257428 -:109700006775607A30B9207B04F11001F9F7FAFB34 -:1097100000284BD02584F9F7B6F83079BDE8F84336 -:10972000F2F7E8BAE572A7692570012020720021DE -:10973000606805F035FB6068C0F84871217B80F8EF -:109740005411616AC0F84C71C0F8581190F8545126 -:109750000788202D28BFFFDF3C4820F8157060687F -:10976000FFF7B4FD002818BFFFDFD4E751B1012196 -:109770006846FAF7F3F99DF800000002B0FBF9F132 -:1097800009FB1108FCF749F800EB0801A069F8F79C -:109790007AFEA06125746775607A0028BAD1207BB3 -:1097A00004F11001F9F7AEFB0028B3D1FFDFB1E7F8 -:1097B00070B5274CA178022906BFE188002970BD49 -:1097C0002569C5F85C0195F85200FBF70BFED5F84A -:1097D0005C11081AA1680144A160E1680844E060D6 -:1097E00070BD70B505461A488378022B06BF006924 -:1097F00000F5AC74174C002904BF256070BD012929 -:1098000008BF681E0DD002291CBFFFDF70BD1046C7 -:10981000FBF703FE4FF47A7100F2E140B0FBF1F088 -:10982000281A206070BD0C48007800281CBF00205A -:10983000704710B50720F7F7ADF880F0010010BDB4 -:1098400005480078002818BF01207047800E0020CE -:10985000E80000207C0E0020580E0020F8490C285B -:10986000896881F8C3001ABF13281828704700229E -:1098700011280FD0072808BF704715280AD00128E3 -:109880001ABF002802287047A1F88220012081F821 -:1098900086007047A1F88820704770B5E84CA16831 -:1098A0000A88A1F8362181F8340191F85100012885 -:1098B00008BF012508D0022808BF022504D00428CB -:1098C00016BF08280325FFDFA06880F8385190F8FC -:1098D0005200012808BF012508D0022808BF022530 -:1098E00004D0042816BF08280325FFDFA068012143 -:1098F00080F8395180F83211002180F80611E078A3 -:10990000BDE87040F2F7F6B9F0B4CD48806890F841 -:109910004E30478EC68E458FB0F84010C28FB0F8DB -:1099200042C0022B1FD08D4238BF294601866245B6 -:1099300028BF62468286018FB0F84430994238BF12 -:109940000B464386818FB0F84640A14238BF0C4693 -:10995000C486BB4228BF1F464786B44228BF26465E -:10996000C686F0BC7047038E9D4228BF1D46838E7D -:109970009A4228BF1A46A94298BF0D4605869445CB -:1099800098BF62468286002180F84E10D3E7AC4A29 -:10999000012992681BD0002302290FD0032921D06E -:1099A00028B301282ED0032818BF704792F863000F -:1099B00013281CBF1628182805D1704792F8C30039 -:1099C000002808BF7047D2F8F0000370704792F883 -:1099D000C300012808BF7047D2F8F4000178491E7F -:1099E0000170704792F8C3000328ECD17047D2F899 -:1099F000F000B2F858108288891A09B20029A8BF6D -:109A000003707047B2F85800B2F8FA10401A00B26A -:109A10000028E1DA70472DE9F04100260327884C41 -:109A20000125A0B1206906F0CCF9A16881F8C20037 -:109A300005FA00F010F4000F08BFFFDFA06880F8FF -:109A40006370A0F8826080F88650BDE8F081A0685D -:109A50000023194690F86420583005F0A2FD002834 -:109A600004BF6570BDE8F0816078002818BFBDE8CC -:109A7000F081206906F0A5F9A16881F8C10081F89C -:109A80006470A1F8886081F88A50BDE8F08170B5F3 -:109A90006B4C84B0207910F0010F04BF04B070BD8E -:109AA000206900230521C578A06890F8632058300C -:109AB00005F077FD002818BF022D0FD00B2D18BF21 -:109AC000042D0BD0052D18BF062D07D00D2D18BF66 -:109AD000112D03D0607840F0080060706078002895 -:109AE0001CBF04B070BD2069C078801E162880F0AD -:109AF0005283DFE800F00BFBA7C5FA26FBF9FB9ABF -:109B0000F8FCFBFBFBE3F6F5F4F3F2F1A0680023AD -:109B1000012190F86620583005F043FD002840F000 -:109B2000B583206906F0A8F9A16881F8EE00072046 -:109B300081F86600002081F88A0081F8860000F034 -:109B4000A5BBA0680921002390F86320583005F0D8 -:109B500028FD20B1206906F0DFF9122814D0A06892 -:109B60000A21002390F86320583005F01AFD20B137 -:109B7000206906F0D1F9142821D0206906F0CCF92B -:109B8000162840F0838342E0A0680125002390F866 -:109B900063200921583005F004FD002808BF6570D6 -:109BA00000F074836078002840F07083A16881F829 -:109BB0007A0081F8860081F8630000F067BBA06836 -:109BC0000021012580F86310A0F8821080F886102B -:109BD0000421FEF71FFBA06890F84E10012900F049 -:109BE0007C820288A0F81621028EA0F81821828EAD -:109BF000A0F81A21428E00F58671A0F81C21C08EB3 -:109C000048820D72E078F2F775F800F03FBBA0686B -:109C100090F86310202940F03983002180F8631008 -:109C200080F886101A2000F02FBBA06890F863100F -:109C30000F292AD1002180F8681012213AE0000093 -:109C400004010020A06890F8631013291DD1D0F8FA -:109C5000F01000884988814218BFFFDFA068D0F863 -:109C6000F00000F12601206906F033F9A06800F148 -:109C7000BC01206906F035F91620A16800F064B92E -:109C8000A26892F86300162802D0022000F064BA9D -:109C9000D2F8F00002F1A80300F11E0100220E30FC -:109CA00005F007FCA0680021C0E92611012180F819 -:109CB0006810182180F8631000F0E8BA206906F0F7 -:109CC000B0F9032840F0E282206906F0AEF900BF47 -:109CD00001F022FC00F0DABA8DE202E2AEE152E1DC -:109CE0001EE135E103E050E0C4E004E0D5E1206985 -:109CF00006F00EF9ECE7A06890F863101B29C4D1B8 -:109D0000002580F88B5080F88650D0F8F01000883D -:109D10004988814218BFFFDFA068D0F8F0100D70AD -:109D2000D0F83C110A78002A18BFFFDF40F0F3801A -:109D300090F88C207AB180F88C500288CA80D0F8D4 -:109D40003C110D71D0F83C210D211170D0F83C214F -:109D50000188518010E00288CA80D0F83C110D7152 -:109D6000D0F83C2101211172D0F83C210C21117056 -:109D7000D0F83C21018851800088F6F779FFF6F78A -:109D8000D9FBE078F1F7B6FFC5E0A06800231946DB -:109D900090F86420583005F004FC50B9A068002306 -:109DA000082190F86320583005F0FBFB002800F0F4 -:109DB00027826078002840F06982A06890F88E00C1 -:109DC00010F0020F17D1206906F098F8A16881F809 -:109DD0008F00206906F094F8A168A1F8900020692E -:109DE00006F091F8A168A1F8920091F88E0040F079 -:109DF000020081F88E00A06890F88E1011F0010F1B -:109E000012D190F8642000231946583005F0C9FBA0 -:109E1000002808BFFFDF0121A06880F8641080F8E7 -:109E20008A100021A0F88810A06890F8631001291A -:109E300007D1002180F8631080F88610E078F1F7F0 -:109E400059FFA168D1F8F000098842888A4204BF0E -:109E50000178042940F01A8200250570E078F1F7B6 -:109E600049FFA06890F86310002908BF80F8865069 -:109E700000F00CBAA0680023072190F86320583046 -:109E800005F08FFB002800F0BB816078002840F0CF -:109E9000FD8102A9206906F079F8A0689DF80820E4 -:109EA000002590F89410114001F02F0180F89410D3 -:109EB00090F895109DF80920114001F0410180F8BB -:109EC000951080F88650D0F8F010008849888142BB -:109ED00018BFFFDFA068D0F8F0100D70D0F83C116B -:109EE0000A78002A18BFFFDF15D10288CA80D0F88F -:109EF0003C110D71D0F83C11029A8A60039ACA6035 -:109F0000D0F83C21072111700188D0F83C01418034 -:109F1000E078F1F7EFFEA06880F8635000F0B6B982 -:109F2000A0680023092190F86320583005F039FB20 -:109F3000002800F065816078002840F0A781A168C2 -:109F400081F87A0081F8860081F8630000F09EB9FC -:109F5000A0680023194690F86420583005F021FBD2 -:109F6000002800F04D816078002840F08F81A068C3 -:109F70000021A0F88810012180F88A10022180F8C1 -:109F8000641000F083B9A0680023194690F864209B -:109F9000583005F006FB00287ED0206905F0E0FF70 -:109FA00000287AD0206905F0D7FFA16808872069CA -:109FB00005F0CEFFA1684887206905F0CFFFA168B2 -:109FC0008887206905F0C6FFA168C88791F86300FB -:109FD0001D2813BF91F84E00012081F84E00012882 -:109FE00007D091F8FD00002804BF91F8FC0000287C -:109FF00003D01F2081F8640017E01E2081F8640060 -:10A000000A88A1F822210A8FA1F824214A8FA1F8F9 -:10A0100026218A8F01F58670A1F82821C98FC18376 -:10A0200001210175E078F1F765FEA0680021A0F834 -:10A030008810012180F88A1000F028B9A068002358 -:10A040000A2190F86320583005F0ABFA20B320695C -:10A0500005F086FFA8B1206905F07EFFA16808879A -:10A06000206905F075FFA1684887206905F076FF33 -:10A07000A1688887206905F06DFFA168C887FFF790 -:10A0800043FCA068002180F8861080F8631004214A -:10A09000FEF7C0F8A06801E01AE07CE090F84E10EE -:10A0A00001291AD00288A0F81621028EA0F81821E2 -:10A0B000828EA0F81A21428E00F58671A0F81C212C -:10A0C000C08E488201200872E078F1F713FEDDE0CF -:10A0D000607840F001006070D8E0022180F84E10F6 -:10A0E000D4E0A0680023194690F86420583005F0A9 -:10A0F00058FA80B3A06890F86300242812BF25287E -:10A10000607840F0200027D06846FBF7EDF9002882 -:10A1100008BF002105D0009805F053FE8DF8080017 -:10A1200002A9A06801AB162290F8630005F001FCBB -:10A13000A0B1A0689DF80420162180F8E42080F8E2 -:10A14000E5101A2180F86410012180F88A1000219E -:10A15000A0F888109AE053E0607097E0206905F05D -:10A1600022FFC0B1206905F018FFA16800F00700C8 -:10A1700081F84F00206905F014FF00F00701A06886 -:10A1800080F8501090F80721002A04BF90F80621AB -:10A19000002A04D024E00020FFF73DFC76E090F890 -:10A1A0004F3090F852C000F151029C4501BF127827 -:10A1B0008A42012180F87B1012D00288A0F82E215B -:10A1C00090F84F2000F5867180F8302190F850000B -:10A1D00081F82500012081F82000E078F1F78AFD60 -:10A1E000A068222180F86410012180F88A100021E3 -:10A1F000A0F888104AE0A06890F86300202801D0F9 -:10A200000120A9E7206905F0D8FEC0B3206905F058 -:10A21000C4FE00F0070060F30705206905F0C1FEE9 -:10A2200000F0070060F30F25A2680120002682F8E5 -:10A230008600A2F88260242082F86300D2F8080128 -:10A24000B2F851202946ADF8002005F020FB9DF81A -:10A250000020C1B28A4207BFA16881F8E860A26805 -:10A2600082F8E8109DF80110C0F30720814219BF61 -:10A27000A16881F8E900A06880F8E96006E0FFE7DE -:10A280000120FFF7C8FB1E20FFF707FBA068D0E9FD -:10A2900028134A1C43F10001C0E9282104B070BD15 -:10A2A0002DE9F047FE4D04464FF00007687808435B -:10A2B0006870287910F0200F2846806818BFA0F831 -:10A2C0007C7004D1B0F87C10491CA0F87C1090F888 -:10A2D0006910012639B990F863200023062158300F -:10A2E00005F05FF958B3A88810F4006F07D0A8688C -:10A2F00090F86910002918BFA0F874701FD1A868E1 -:10A30000B0F87410491C89B2A0F87410B0F8762027 -:10A310008A422CBF511A00218288521D8A4228BFCE -:10A3200080F87A60B0F87410B0F87620914206D3C5 -:10A33000A0F8747080F81261E878F1F7DBFC2879F6 -:10A3400010F0600F08D0A86890F8671021B980F865 -:10A3500067600121FDF75EFF4FF00808002C56D121 -:10A360006878002851D1287910F0040F0DD0A86822 -:10A3700090F86300032808BFFFDFA86890F8661014 -:10A38000072904BF2E7080F8667001F015F928794E -:10A3900010F0080F19D06878B8B9A868002190F8B3 -:10A3A000C300FFF7F4FAA86890F8C300FF2808BFBD -:10A3B000FFDFFF21A86880F8C31090F86610082915 -:10A3C00003D10221297080F86670FFF760FBA8783E -:10A3D00010F0080F16D0A8680023052190F863201C -:10A3E000583005F0DEF850B185F80180A868D0F843 -:10A3F0003C1108780C2808BF0020087002E00020FB -:10A4000003F04DFDA86801F010F800F06CFDA8689D -:10A41000A14600F1580490F8EC0030B9A27B00236B -:10A420000121204605F0BDF810B1208D401C20858B -:10A430003D21B9F1000F18D12878022808BF162055 -:10A440000ED0012804BFA86890F8EE0008D0687804 -:10A45000E8B110F0140F1CBF1E20E07602D005E01A -:10A46000E07603E010F0080F02D0E176A67641E036 -:10A4700010F0030F03D02A20E076A6763AE010F021 -:10A48000200F08BFFFDF2320E076A67632E094F8A5 -:10A490002E0028B1608D411C6185A18D884213D2A8 -:10A4A00094F8320028B1208E411C2186A18D88426B -:10A4B0000AD2218DE08C814203D3AA6892F8EC2065 -:10A4C00012B9A28D914203D32220E076A67611E044 -:10A4D000E17B31B1A18C814228BF84F81B80C5D2B9 -:10A4E00006E0A08C062803D33E20E076A67601E0A5 -:10A4F000A07EA0B1E7722773E7730221A868FDF779 -:10A5000089FEA86890F8C310012904D1D0F8F4009E -:10A510000178491E0170E878F1F7ECFB03E00021B7 -:10A52000A868FDF777FEBDE8F047FAF7ECBF5C4995 -:10A530004A788B781A430ED101280AD0087910F096 -:10A54000040F04D0886890F86600072803D0012023 -:10A550007047FDF74BBE0020704770B5504C064663 -:10A560000D46A0883043A08016F0020F04D016F0EC -:10A57000010F18BFFFDFE56016F0010F18BF25615E -:10A5800016F0020F12D0284605F01BFC062802D058 -:10A590000B282ED00AE0A06890F86310182905D186 -:10A5A0000021C0E92811012180F8691016F0800F00 -:10A5B0001CBF0820A07016F4806F08BF70BDA06893 -:10A5C000B0F8581080880844801D86B2284605F0EF -:10A5D000F8FB012804BFA068A0F8FA6015D028464F -:10A5E00005F0EFFB68B1284605F0EBFB182823D0F7 -:10A5F0000BE0A06890F86310122908BF0021D5D1A4 -:10A60000D2E7A068D0F8F0008680284605F0D9FB94 -:10A6100001281DD0284605F0D4FB08B3284605F0D4 -:10A62000D0FB182818BF70BDA068B0F8EA10284603 -:10A63000BDE8704005F0D3BCA06890F8E810002990 -:10A6400002BF90F8E91000290026A0F8EA60DCE7D4 -:10A65000A068B0F8FA102846BDE8704005F003BCC9 -:10A66000A068D0F8F00081882846BDE8704005F069 -:10A67000CABBF0B50A4C85B00026A060A680667003 -:10A68000A670054626700088FAF705FFA0680088C6 -:10A69000FAF727FFB5F8D000A168401C82B201E0AC -:10A6A0000401002001F1580004F085FD002818BFC6 -:10A6B000FFDF95F8640025280AD1B5F85810B5F8E1 -:10A6C000EA00081A00B20028A4BF6078002804D06D -:10A6D00095F8630025283BD119E0A06890F8E810B0 -:10A6E000002908BF90F8511080F8511090F8E91037 -:10A6F000002908BF90F8521080F852100020FFF790 -:10A70000CCF885F86460A16881F87B6020E0B5F83A -:10A710005810B5F8EA00081A00B20028A4BF607803 -:10A72000002815D1A06890F8E810002908BF90F81B -:10A73000511080F8511090F8E910002908BF90F8E6 -:10A74000521080F852100020FFF7A7F885F86360D8 -:10A75000A5F8D060A06890F8861039B1B0F88210E2 -:10A76000B0F88420914224BF05B0F0BD90F88A1063 -:10A7700039B1B0F88810B0F88420914224BF05B0F8 -:10A78000F0BDB0F88020B0F87E108A4224BF05B03A -:10A79000F0BD90F867208AB3B0F87C208A4224BFCD -:10A7A00005B0F0BD90F8C370FF2F00F02A81684615 -:10A7B000FAF774FE002808BFFFDF009805F03FFAA3 -:10A7C0000321009805F052FA0098017821F0100159 -:10A7D0000170394605F0C7FA192F80F0E780DFE8ED -:10A7E00007F02A22144EE5E5E61B7CE5E6E66CE57B -:10A7F000E5E5E5D8E6E6869FB8E5C500B0F87C104B -:10A80000062924BF05B0F0BDCCE7A06890F8ED1094 -:10A81000009805F02FFBCAE0A06890F8C4100098DB -:10A8200005F078FBC3E0A068D0F8F400411C009864 -:10A8300005F011FBBBE0A068D0F8F000817900982A -:10A8400005F0DDFAA068D0F8F0000189009805F065 -:10A85000CFFAA068D0F8F0004189009805F0B3FA6B -:10A86000A068D0F8F0008189009805F0B3FAA068DC -:10A87000D0F8F000C189009805F0B3FA97E0A0681D -:10A88000D0F8F000011D009805F0F8FAA068D0F8A3 -:10A89000F00000F10C01009805F0FAFAA068D0F879 -:10A8A000F00000F11E01009805F0F8FAA06800F130 -:10A8B000B801009805F000FB79E060690178009824 -:10A8C00005F012FB60698188009805F00FFB606954 -:10A8D0004188009805F00EFB69E0FE49D1E90001CE -:10A8E000CDE9020102A9009805F018FB5FE0A0681D -:10A8F000B0F84410009805F01BFBA068B0F84610B3 -:10A90000009805F019FBA068B0F84010009805F019 -:10A9100017FBA068B0F84210009805F015FB46E060 -:10A92000A068B0F84010009805F00AFBA068B0F8E5 -:10A930004210009805F008FBA068B0F84410009899 -:10A9400005F0F6FAA068B0F84610009805F0F4FAA1 -:10A950002DE0A06890F80811009805F01CFBA06895 -:10A9600090F80911009805F01AFB20E0A06890F813 -:10A97000E80004F087FF0146009805F028FBA06876 -:10A9800090F8E90004F07EFF0146009805F023FBF3 -:10A990000DE0A06890F8E510009805F040FBA06875 -:10A9A00090F8E410009805F03EFB00E0FFDFFAF7B6 -:10A9B00088FD002808BFFFDF009F384605F001FA38 -:10A9C000012809D0384605F0FCF960B1384605F099 -:10A9D000F8F918280FD014E0A068B0F8FA1038463B -:10A9E00005F041FA0DE0A068D0F8F0008188384603 -:10A9F00005F009FA05E0A068B0F8EA10384605F05D -:10AA0000EEFAB5480090B54BB54A2946304603F0FA -:10AA100081F9A0680023052190F86320583004F0E4 -:10AA2000C0FD002804BF05B0F0BD05B0BDE8F04092 -:10AA300002F041BFAB48806890F8861029B1B0F8A9 -:10AA40008210B0F8842091421AD290F88A1029B16D -:10AA5000B0F88810B0F88420914211D2B0F880206C -:10AA6000B0F87E108A420BD290F86720B0F87C00D4 -:10AA700022B1884204D200BF03F0ECB90628FBD310 -:10AA8000002001460CE470B50C46064615464FF40E -:10AA9000A071204607F0C9F82680002D08BFFFDF0F -:10AAA0002868C4F8F0006868C4F8F400A868C4F81E -:10AAB0003C0170BDF6F7B3B82DE9F0410D460746ED -:10AAC0000621F5F7CBFF040008BFBDE8F081D4F8FC -:10AAD0003C110026087858B14A8821888A4207D15B -:10AAE000082810D00D281FD00C2835D0072850D0AA -:10AAF00094F8120100285ED06E700F20287084F840 -:10AB000012616F8042E06E7008202870D4F83C011A -:10AB10004168C5F802108168C5F80610808968810F -:10AB2000D4F83C01067031E00846F6F7A1F8074674 -:10AB3000F5F716FDB8B96E700D202870D4F83C01F9 -:10AB40004068C5F80200D4F83C0106703846F5F7B5 -:10AB500001FD0120BDE8F0810846F6F789F80746B7 -:10AB6000F5F7FEFC10B10020BDE8F0816E700C20FE -:10AB70002870D4F83C014168C5F802100089E880CB -:10AB8000D4F83C0106703846F5F7E4FC0120BDE836 -:10AB9000F0816E7007202870D4F83C01416882680B -:10ABA000C068C5F80210C5F80620C5F80A00D4F838 -:10ABB0003C010670EAE794F81401C8B16E701420E5 -:10ABC000287094F814010028E0D000BF84F81461C4 -:10ABD000D4F81601C5F80200D4F81A01C5F8060029 -:10ABE000B4F81E01688194F814010028EED1CDE775 -:10ABF00094F8200180B16E701A20287084F82061CA -:10AC0000D4F82201C5F80200D4F82601C5F80600E0 -:10AC1000B4F82A016881B9E794F82C0148B16E7044 -:10AC20001B20287084F82C61D4F82E01C5F802008E -:10AC3000ACE794F80C0190B16E701820287094F86D -:10AC40000C010028A2D000BF84F80C61D4F80E01DA -:10AC5000C5F8020094F80C010028F5D196E794F8A5 -:10AC60003201002808BFBDE8F0816E701520287001 -:10AC700094F83201002889D084F83261D4F8340184 -:10AC8000C5F80200B4F83801E88094F832010028D1 -:10AC9000F2D17BE7134A5061D17070472DE9F0473C -:10ACA0000446481E85B238BFBDE8F08704F10808A5 -:10ACB0000126DFF830904FF0080A0027B4F8D000E2 -:10ACC000401CA4F8D000B4F87C00401CA4F87C0020 -:10ACD0000AE000005C230200A1A201002FA50100F0 -:10ACE0005BA501000401002094F8690040B994F8C4 -:10ACF00063200023062104F1580004F052FCD8B16F -:10AD0000B4F87400401C80B2A4F87400B4F8761053 -:10AD100081422CBF0A1A0022A3885B1D934228BFE0 -:10AD200084F87A60884207D3A4F8747084F81261BA -:10AD300099F80300F0F7DEFF94F8860020B1B4F82C -:10AD40008200401CA4F8820094F88A0020B1B4F874 -:10AD50008800401CA4F8880094F8EC0040B994F8EE -:10AD600066200023012104F1580004F01AFC20B1F0 -:10AD7000B4F88000401CA4F8800094F863000C280C -:10AD800002D00D2820D067E0B4F85800411CB4F878 -:10AD9000FA00814260D1D4F8F400411C404607F02B -:10ADA00050F80221204604F034F9D4F8F400007879 -:10ADB000002808BFFFDF0121FF20FEF7E8FD84F82F -:10ADC000637084F8966047E0B4F85800411CD4F8EA -:10ADD000F000808881423FD1D4F83C0101780029FD -:10ADE00018BFFFDF22D12188C180D4F8F00041894B -:10ADF000D4F83C010181D4F8F0008189D4F83C01F9 -:10AE00004181D4F8F000C189D4F83C018181D4F8A3 -:10AE10003C010771D4F83C0180F800A0D4F83C0153 -:10AE20002188418099F80300F0F764FF0121204652 -:10AE300004F0EFF803212046FDF7ECF9D9F80800FB -:10AE4000D0F8F0000078022818BFFFDF0221FF20B1 -:10AE5000FEF79DFD84F86370B4F85800401C691E2D -:10AE6000A4F858008DB2BFF429AFBDE8F087FE4AC0 -:10AE7000C2E90601704770B50446B0F87C0094F84A -:10AE80006710002908BFC0F1020503D0B4F87E1096 -:10AE9000081A051F94F87A0040B194F86320002343 -:10AEA000092104F1580004F07CFBA0B1B4F87460EF -:10AEB00094F8690058B994F863200023062104F13E -:10AEC000580004F06EFB002808BF284603D0B4F8F1 -:10AED0007600801B001F8542C8BF0546002DD4BFE9 -:10AEE0000020A8B270BDF0B5DF4C83B0A06890F828 -:10AEF000C310FF2907BF6178002903B0F0BD90F8A7 -:10AF0000662000230121583004F04BFB00281CBFB1 -:10AF100003B0F0BDA06890F8EC1029B103B0022096 -:10AF2000BDE8F040FEF79ABC90F863200023194674 -:10AF3000583004F036FB48B1A06890F87A0028B188 -:10AF400003B01220BDE8F040FEF788BCA0680025E1 -:10AF500090F86320122A23D004DC032A47D0112A58 -:10AF600024D003E0182A3CD0242A4CD0002304210A -:10AF7000583004F016FB00281CBF03B0F0BDD4F815 -:10AF800008C0022701269CF864001A2800F01E81E0 -:10AF900041DC012873D002287FD0032863D03EE033 -:10AFA00003B00B20BDE8F040FEF758BCF8F7D5FD24 -:10AFB0000C283CBF03B0F0BDA0680821D0F8F00019 -:10AFC0001E30F8F7CBFD28B1A0680421B830F8F79F -:10AFD000C5FD00B9FFDF03B00320BDE8F040FEF778 -:10AFE0003DBC03B00620BDE8F040FEF737BC90F84A -:10AFF000C21080F8C4100720FEF730FCA06880F86B -:10B00000635003B0F0BD1820FEF728FCA068A0F83C -:10B01000825003B0F0BD1F2847D022287ED0DCF834 -:10B02000F0000178002900F010814088BCF8001081 -:10B03000884274D100239CF8632019460CF1580013 -:10B0400004F0AFFA00286AD0A068D0F8F0100978B0 -:10B05000022972D0032971D0042970D0052908BFB4 -:10B0600008206DD0F1E09CF8C1008CF8C4000720E6 -:10B07000FEF7F4FBA06800F0B0B900E00DE00C2092 -:10B08000FEF7ECFBA068A0F8885090F88E1041F015 -:10B09000010180F88E1000F0A0B91320FEF7DEFB4E -:10B0A000A068A0F8885000F098B99CF8FD0000282E -:10B0B0001CBF03B0F0BD9CF8FC0088B1BCF8FE00DA -:10B0C000ACF84000BCF80001ACF84200BCF802014A -:10B0D000ACF84400BCF80401ACF846008CF8FC5015 -:10B0E000FEF712FC0421A068FDF794F8A06890F820 -:10B0F0004E10012908BF80F84E7016D00288A0F8C3 -:10B100001621028EA0F81821828EA0F81A21428EF4 -:10B1100000F58671A0F81C21C08E01E011E094E0DA -:10B1200048820E72E078F0F7E5FD1520FEF796FBF9 -:10B13000A068A0F8885000F050B94CE051E071E0F0 -:10B1400058E09CF87B0058B18CF8E8508CF8E95036 -:10B150001820FEF783FBA068A0F8885003B0F0BD6C -:10B160009CF8070100281CBF03B0F0BD9CF8060145 -:10B17000002804BF03B0F0BDBCF84F10DCF8080194 -:10B18000ADF80410BCF85110ADF80010019904F0AE -:10B190007EFB9DF80020C1B28A4207BFA16881F8FA -:10B1A000E850A26882F8E8109DF80110C0F307206B -:10B1B000814219BFA16881F8E900A06880F8E950D0 -:10B1C000182003B0BDE8F040FEF748BB1120FEF7A1 -:10B1D00045FBA06801E190F8640004F0D5F9A0BB3C -:10B1E00008E090F8681041B190F86900002808BFA5 -:10B1F000FFDF0A20FEF732FB27E0F8F7AEFC0C2851 -:10B2000023D3A0680821D0F8F0001E30F8F7A6FC80 -:10B2100028B1A0680421B830F8F7A0FC00B9FFDF1E -:10B220000320E7E790F88E0010F0030F0DD10C20FB -:10B23000FEF714FBA068A0F8825080F8866090F8B2 -:10B240008E1041F0010180F88E10A06890F8C310B4 -:10B25000FF291CBF03B0F0BD90F8632000231946FE -:10B26000583004F09EF901E004010020002804BFDA -:10B2700003B0F0BDA06890F8F810E9B3A1690978AF -:10B28000D1BB90F8640004F07FF9A8BBA068B0F8C7 -:10B2900058100A2935D900F108010522E06906F0A5 -:10B2A000FFFB0028A06802BF80F8F85003B0F0BD93 -:10B2B000D0F8F400017869B1411C0522E06906F07C -:10B2C000EFFB00281CBF03B0F0BDA068D0F8F4006D -:10B2D000007830B9A068E169D0F8F400401C06F0AD -:10B2E000B0FDA068D0F8F4000178491C017001207D -:10B2F000FEF7B4FAA06800E003E080F8F85003B06D -:10B30000F0BDA06890F8FC1011B190F8FD1011B3D9 -:10B3100090F80611002904BF03B0F0BD90F80711A2 -:10B3200000291CBF03B0F0BD90F8640004F02CF9B4 -:10B3300000281CBF03B0F0BDA06890F8512090F821 -:10B340000811012A4DD0022A4ED0042A14BF082A1F -:10B3500004294BD05DE0B0F8FE10A0F84010B0F822 -:10B360000011A0F84210B0F80211A0F84410B0F893 -:10B370000411A0F8461080F8FC5090F864001E28D4 -:10B3800005D003B01420BDE8F040FEF767BAFEF721 -:10B39000BBFA0421A068FCF73DFFA06890F84E10AE -:10B3A000012908BF80F84E7013D00288A0F816213A -:10B3B000028EA0F81821828EA0F81A21428E00F584 -:10B3C0008671A0F81C21C08E48820E72E078F0F7DA -:10B3D00091FC1520FEF742FAA06880F8645003B093 -:10B3E000F0BD012915D101E0022912D190F85210C7 -:10B3F00090F80901012907D0022908D0042914BFB7 -:10B40000082904280BD004E0012802D107E0022813 -:10B4100005D003B01620BDE8F040FEF71FBA03B018 -:10B420000020BDE8F040FEF738BA70B5044690F849 -:10B43000630000250C2814D00D2818BF70BDB4F887 -:10B440005800D4F8F010401C8988884218BF70BD9D -:10B45000D4F83C01FE4E0178002918BFFFDF45D12A -:10B4600022E0B4F85800B4F8FA10401C884218BF23 -:10B4700070BDD4F8F400411C04F1080006F0E1FCB2 -:10B480000221204603F0C5FDD4F8F400007800281E -:10B4900008BFFFDF0121FF20FEF779FA84F863502F -:10B4A000012084F8960070BD2188C180D4F8F00096 -:10B4B000D4F83C1140890881D4F8F000D4F83C114C -:10B4C00080894881D4F8F000D4F83C11C089888183 -:10B4D000D4F83C010571D4F83C1108200870D4F868 -:10B4E0003C1120884880F078F0F704FC01212046C8 -:10B4F00003F08FFD03212046FCF78CFEB068D0F8E6 -:10B50000F0000078022818BFFFDF0221FF20FEF7BD -:10B510003EFA84F8635070BD70B5CD4CA16891F8C7 -:10B520006320162A11BF132A91F88C20002A627812 -:10B530001BBF02206070002A70BD81F8C00000258A -:10B5400081F88B5081F88650D1F8F0000988408846 -:10B55000884218BFFFDFA068D0F8F0000078032809 -:10B5600018BFFFDF0321FF20FEF711FAA068D0F813 -:10B570003C110A78002A18BFFFDF19D10288CA805F -:10B58000D0F83C2190F8C0101171D0F83C110D7228 -:10B59000D0F83C210C211170D0F83C210188518059 -:10B5A0000088F5F765FBF4F7C5FFE078F0F7A2FB3C -:10B5B000A06880F8635070BD10B5A54C207910F0DC -:10B5C000020F08BF10BD6078002818BF10BDE068EA -:10B5D000C078192880F06981DFE800F05F4F0D8F97 -:10B5E000F8F8A6223FF86F83B1F8F8F8F8F7E3E02F -:10B5F000F9F5F4F8F300A0680023012190F8662023 -:10B60000583003F0CEFF002818BF10BD0821A068F5 -:10B6100080F86610002180F8861080F88A1010BD2E -:10B62000A0680023194690F86420583003F0B9FF51 -:10B6300018B1A168002081F88A00A068002319468B -:10B6400090F86320583003F0ACFF002808BF10BD0D -:10B650000020A16881F8860010BDA068002319466B -:10B6600090F86320583003F09CFF002808BFFFDFEC -:10B670000420A16881F8630010BDA068002319466A -:10B6800090F86320583003F08CFF002808BFFFDFDC -:10B690000C20A16881F8630010BDA0680023194642 -:10B6A00090F86320583003F07CFF002808BFFFDFCC -:10B6B0000D20A16881F8630010BDA0680023194621 -:10B6C00090F86320583003F06CFF002808BFFFDFBC -:10B6D0000121A06880F88B105FF00F0180F86310E3 -:10B6E00010BDA06890F86300122818BFFFDF012189 -:10B6F000A06880F88C101121F0E7A068002319469B -:10B7000090F86320583003F04CFF28B9A06890F8F7 -:10B710008C00002808BFFFDF0121A06880F88B1093 -:10B72000132180F8631010BDA06890F863001828FA -:10B7300018BFFFDF1B20A16881F8630010BDA0685F -:10B74000D0F8F01003884A889A4204BF0978042987 -:10B7500019D190F8632000231946583003F021FFD7 -:10B76000002808BFFFDFA06890F88E1011F0020FCC -:10B7700004BF012180F8631005D0002180F88610F5 -:10B78000D0F8F0000170A0680023194690F86420FA -:10B79000583003F006FF002808BF10BD0020A16844 -:10B7A00080E0A0680023194690F86320583003F029 -:10B7B000F8FE002808BFFFDF0520A16881F86300BC -:10B7C00010BD30E01FE012E001E067E06DE0A0682E -:10B7D0000023194690F86320583003F0E2FE002859 -:10B7E00008BFFFDF1D20A16881F86300E8E7A068BB -:10B7F0000023194690F86420583003F0D2FE002848 -:10B8000008BFFFDFCAE7A0680023194690F863204D -:10B81000583003F0C6FE002808BFFFDF2020A168D3 -:10B8200081F86300CCE7A06890F8641022291DD04D -:10B8300090F86310242918BFFFDFC1D190F8E810F9 -:10B84000002906BF90F8E9100029252102E0000038 -:10B850000401002018BF80F863107FF4F9AE0021C6 -:10B8600080F863100846FEF718F8F1E690F8E81043 -:10B87000002907BF90F8E9100029252180F86410FD -:10B880008CD1002180F8641080F87B1090F80601BC -:10B8900000281CBF0020FEF700F87FE7A168002009 -:10B8A00081F8640081F88A008AE7FFDF88E70000FA -:10B8B00070B5FC4CE1680A88A1F8E62181F8E40142 -:10B8C00091F85100012808BF012508D0022808BFBF -:10B8D000022504D0042816BF08280325FFDFE068EE -:10B8E00080F8E85190F85200012808BF012508D0DF -:10B8F000022808BF022504D0042816BF0828032503 -:10B90000FFDFE068012180F8E95180F8E2110021B1 -:10B9100080F89211E078BDE87040F0F7EBB9F0B430 -:10B92000E048C06890F84E30478EC68E458FB0F81C -:10B930004010C28FB0F842C0022B1FD08D4238BFDA -:10B9400029460186624528BF62468286018FB0F88B -:10B950004430994238BF0B464386818FB0F8464049 -:10B96000A14238BF0C46C486BB4228BF1F4647864B -:10B97000B44228BF2646C686F0BC7047038E9D425F -:10B9800028BF1D46838E9A4228BF1A46A94298BFF7 -:10B990000D460586944598BF62468286002180F850 -:10B9A0004E10D3E72DE9F04FBE4C83B0207910F054 -:10B9B000010F04BF03B0BDE8F08F606901230521CA -:10B9C000C578E06890F86420583003F0EAFD00285C -:10B9D00018BF022D0BD00A2D18BF0B2D07D0032D39 -:10B9E00018BF062D03D0607840F0080060706078C2 -:10B9F00000281CBF03B0BDE8F08F60690227012654 -:10BA000090F8038000254FF02009B8F1000F1CBF0B -:10BA1000B8F1010FB8F1160F1FD1E06890F863007C -:10BA200003F0B2FDC8B1E16891F86300202814D09A -:10BA3000212808D0B8F1160F0CBF84F80190677068 -:10BA400003B0BDE8F08F262081F86300B8F1160F2F -:10BA500000F0AE822A20FFF72BFFB8F1190F80F01B -:10BA6000E282DFE808F046230DC1FEFEFDFCFBFE8E -:10BA700091B8FAFEFEFEFEF9F8F7F6F5F4FEF300D3 -:10BA8000E0680123194690F86620583003F089FDDC -:10BA9000002840F04D84606904F0EEF9E16881F817 -:10BAA0006801072081F8660000F042BCE0680123CD -:10BAB000002190F86420583003F073FD002800F056 -:10BAC000F083606904F0D3F9E168A1F87C01B1F872 -:10BAD0005820801A00B247F6FE728242A8BF0028A2 -:10BAE0004BDD01F5BF71606904F0B8F90B20E16826 -:10BAF0003FE0E0680123002190F86420583003F013 -:10BB000050FD002800F0CD83606904F083F900281F -:10BB100000F08982606904F07AF9E168A1F87C019B -:10BB2000B1F85820801A00B247F6FE728242A8BFD0 -:10BB3000002822DD606904F064F9E16881F87E0183 -:10BB4000606904F059F9E168A1F88001606904F0C6 -:10BB50003EF9E168A1F88201606904F03FF9E1680B -:10BB6000A1F88401606904F040F9E168A1F8860158 -:10BB70000D2081F8640000F0DBBB282081F8730001 -:10BB800081F8726000F0D4BBE0680123002190F8D6 -:10BB90006420583003F005FD0028E0680CD0A0F8C0 -:10BBA000885090F88A10491C80F88A105FF01001C4 -:10BBB00080F8641000F0BCBB90F8642001230521DC -:10BBC000583003F0EEFC00281CBF0820607040F0E5 -:10BBD000AF8300F066BBE06890F86410112908BFDD -:10BBE000122140F09282E3E7E0680123002190F8FF -:10BBF0006420583003F0D5FC80B9E06890F86420E8 -:10BC0000122A0BD001230521583003F0CAFC00286A -:10BC100018BF082000F0458300F0C7B9E06890F82D -:10BC20008C1031B9A0F8885090F88A10491C80F81F -:10BC30008A1000F1E001606904F037F9E06800F172 -:10BC4000B801606904F03CF9E0680BE01BE2AFE189 -:10BC500059E1F1E0CFE0DBE0EAE23AE0A2E0FFE226 -:10BC600022E072E190F8AA01002818BFFFDFE06827 -:10BC70000188A0F8AC1100F5D771606904F003F9F0 -:10BC8000E06800F5DB71606904F005F9E06880F8B0 -:10BC9000AA61142180F86410E078F0F72BF800F026 -:10BCA00047BB000024010020E06890F864101729C9 -:10BCB00040F02B8290F88A10491E49B280F88A1011 -:10BCC0000029B8BFFFDF1C20E16881F8640000F0A4 -:10BCD0002FBBE06890F8651011F0020F09D090F8C2 -:10BCE000632001230821583003F05BFC002800F09A -:10BCF000D882E06890F88E0010F0020F17D16069CA -:10BD000004F0FCF8E16881F88F00606904F0F8F84D -:10BD1000E168A1F89000606904F0F5F8E168A1F825 -:10BD2000920091F88E0040F0020081F88E00E068E9 -:10BD300090F88E1011F0010F05D0E06890F86310B4 -:10BD400006291CD114E090F8650010F0020F18BF0E -:10BD5000FFDFE06890F8651041F0020180F865109F -:10BD6000A0F8885090F88A10491C80F88A10E4E7FF -:10BD700080F8635080F88650E078EFF7BBFFE0680A -:10BD800090F87A11042940F0D38280F87A51E07853 -:10BD9000EFF7B0FFE06890F86310002940F0C88228 -:10BDA00000F043BAE06890F8650010F0010F7BD115 -:10BDB0006946606904F0B7F8E0689DF8002090F8E3 -:10BDC0009410114001F02F0180F8941090F8951014 -:10BDD0009DF80120114001F0410180F89510A0F874 -:10BDE000885090F88A10491C80F88A1090F86510E5 -:10BDF00041F001011CE0E0680123092190F8632073 -:10BE0000583003F0CEFB002800F04B8200F041BA1E -:10BE1000E06890F8651011F0040F40F04282A0F83D -:10BE2000885090F88A2041F00401521C80F88A2042 -:10BE300080F8651000F07CBAE06890F8650010F0BA -:10BE4000300F31D1606904F08BF800287DD0606933 -:10BE500004F082F8E1680887606904F079F8E16825 -:10BE60004887606904F07AF8E1688887606904F0BF -:10BE700071F8E168C887207910F0020F03D02069BB -:10BE8000C078142811D091F863001D280DD091F8C6 -:10BE90004E0001280BD091F88901002804BF91F8C9 -:10BEA000880100280AD002E074E081F84E6091F821 -:10BEB000650040F0100081F865001AE091F8650017 -:10BEC00040F0200081F865000A88A1F8CA210A8F95 -:10BED000A1F8CC214A8FA1F8CE218A8F01F5CB7031 -:10BEE000A1F8D021C98F818780F83260E078EFF720 -:10BEF00001FFE068A0F8885090F88A10491C80F88B -:10BF00008A1000F015BAE06801230A2190F8632036 -:10BF1000583003F046FBE8B3606904F021F8B8B18B -:10BF2000606904F019F8E1680887606904F010F8A6 -:10BF3000E1684887606904F011F8E1688887606902 -:10BF400004F008F8E168C88700E06CE0FFF7E7FC60 -:10BF5000E068052180F8865080F86350FDF7FBFA11 -:10BF6000E06890F84E10012908BF80F84E7000F08C -:10BF7000DF810288A0F8BE21028EA0F8C021828E47 -:10BF8000A0F8C221428E00F5CB71A0F8C421C08E6A -:10BF9000088600E006E081F82660E078EFF7AAFE68 -:10BFA00000F0C6B9607840F00100607000F0C0B9E0 -:10BFB000E06801230B2190F86420583003F0F1FA77 -:10BFC00020B100BF84F8019000F0B2B9E06801230D -:10BFD000002190F86420583003F0E3FA002800F0C4 -:10BFE0006081E06890F863002528EBD0606903F079 -:10BFF000DAFFC0B1606903F0D4FFE16800F0070028 -:10C0000081F85000606903F0C8FF00F00701E068A4 -:10C0100080F84F1090F89321002A04BF90F89221E5 -:10C02000002A04D022E001F0DEF900F081B990F896 -:10C0300052C090F8503000F151028C4502BF117887 -:10C04000994280F87B6011D000F5CB7180F8DC61FB -:10C050000288A0F8DE2190F84F2080F8E02190F8C7 -:10C06000500081F84B00E078EFF744FEE0682221B1 -:10C0700080F86410A0F8885090F88A10491C80F865 -:10C080008A1000F055B9E06890F8631021290CBFC0 -:10C090004FF001084FF0000890F86410232908BF02 -:10C0A00000F1640705D0B8F1000F18BF00F1630775 -:10C0B0002BD0606903F099FFF0B3D4F81490484690 -:10C0C00003F087FF0090484603F087FF8146E06851 -:10C0D00090F89211002907BF4FF0000BDA4690F854 -:10C0E00094B190F895A1484603F05AFBB0B1E268CC -:10C0F00092F85110814211D019EA0B0F41D0B8F1DA -:10C10000000F08BF012802D008E0677010E1022983 -:10C1100004BF92F8500010EA090F32D0009803F0E3 -:10C120003FFB68B1009803F03BFBE16891F85210C7 -:10C13000884205D0009800E023E010EA0A0F20D0E2 -:10C140006A466169E06803F03AFBD8B3606903F0BE -:10C150004AFFE168A1F87C01B1F85820801A00B2CA -:10C1600047F6FE728242A8BF00284ADD9DF8000013 -:10C1700081F87E019DF8010081F87F01252038704B -:10C1800044E0E06890F8920100281CBF1E20FFF7F1 -:10C190008FFBB8F1000F16D0606903F012FEE16862 -:10C1A00081F8C20006FA00F010F0807F08BFFFDFC0 -:10C1B0000A21E06880F8631090F88600002808BF24 -:10C1C000FFDF0DE010E03D70E16891F88A00401E4D -:10C1D00040B281F88A000028B8BFFFDF01F003F900 -:10C1E000E06880F87B50A3E0E06890F892010028B6 -:10C1F0001CBF0020FFF75CFB3D70E06880F87B50BF -:10C2000004E0282081F8730081F87260E06800F192 -:10C2100064018F4209D190F88A10491E49B280F812 -:10C220008A100029B8BFFFDF82E080F886507FE0E7 -:10C23000606903F0F6FE16287AD1E06890F8630092 -:10C24000212802D0262805D072E0606903F0EDFEB7 -:10C25000FFF72EFBE06880F8635080F8865067E0B7 -:10C26000E06890F863000E2804D1606903F054FE82 -:10C27000122805D0E06890F863001D2818D112E05C -:10C28000E0680123092190F86320583003F089F910 -:10C2900038B1E06880F87A5080F8865080F86350B2 -:10C2A00046E0667044E0606903F036FE142805D06D -:10C2B000E06890F8630021282BD125E0E068052193 -:10C2C00080F8635080F88650FDF745F9E16891F8F1 -:10C2D0004E00012808BF81F84E7029D00A88A1F8C5 -:10C2E000BE210A8EA1F8C0218A8EA1F8C2214A8EF1 -:10C2F00001F5CB70A1F8C421C98E018680F82660B3 -:10C30000E078EFF7F7FC13E0606903F005FE16280C -:10C3100005D0606903F000FE172809D113E0E0683A -:10C3200080F8635080F886505FF01A00FFF7C0FA7B -:10C33000E068D0E928134A1C43F10001C0E9282134 -:10C3400003B0BDE8F08FE06890F864102329EFD1C6 -:10C3500080F8645090F88A10491E49B280F88A101B -:10C360000029B8BFFFDFE06880F87B5090F89201A9 -:10C37000002818BF0020DBD0D8E770B5F84E05467E -:10C380000C46F06890F8C300FF2818BFFFDFF26882 -:10C390000020002C82F8C3501CBFA2F8880070BD9A -:10C3A000A2F88200012082F8860070BD10B584B02A -:10C3B00004466846F9F772F8002808BFFFDF0098C6 -:10C3C00003F03DFC0321009803F050FC0098017835 -:10C3D00021F010010170214603F0C5FCA01E1628B3 -:10C3E00073D2DFE800F00BAA4EABAB13AA5CAAAB8A -:10C3F0001B2CAAAAAAAAABAB31734B8DD848C06834 -:10C4000090F8C410009803F035FD97E0D448C06858 -:10C4100090F8C410009803F07DFD8FE0D04CA06828 -:10C420000178009803F060FDA0688188009803F00F -:10C430005DFDA0684188009803F05CFD7EE0062168 -:10C44000009803F063FD79E0C54CE068B0F8441053 -:10C45000009803F06DFDE068B0F84610009803F016 -:10C460006BFDE068B0F84010009803F069FDE068EB -:10C47000B0F84210009803F067FD5FE0B84CE06848 -:10C4800043E0B74CE06800F1E801009803F01CFDC0 -:10C49000E06800F1BC01009803F020FD4EE00020B0 -:10C4A00002900390AE48C06890F8941001F0F50136 -:10C4B0008DF8081090F8950002A900F041008DF861 -:10C4C0000900009803F05DFD38E036E0A44CE06818 -:10C4D000B0F84010009803F033FDE068B0F8421067 -:10C4E000009803F031FDE068B0F84410009803F0C4 -:10C4F0001FFDE068B0F84610009803F01DFD1DE038 -:10C50000974CE06890F8921159B190F89411009806 -:10C5100003F041FDE06890F89511009803F03FFDAD -:10C520000CE090F85110009803F035FDE06890F8A9 -:10C530005210009803F033FD00E0FFDFF8F7C1FF71 -:10C54000002808BFFFDF04B010BD70B50C460546DB -:10C550004FF4F871204605F068FB258070BDF4F7B4 -:10C560005EBB2DE9F0410D4607460721F4F776FA48 -:10C57000040008BFBDE8F08194F896010026C8B118 -:10C580006E700820287094F8960188B1268484F88B -:10C590009661D4F89801C5F80200D4F89C01C5F85A -:10C5A0000600B4F8A001688194F896010028EDD146 -:10C5B000AE7044E094F8A201002837D094F8A201AC -:10C5C0000C2818D00D2818BFFFDF38D12088F4F7C9 -:10C5D0004FFB0746F3F7C4FFA0B96E700D2028701B -:10C5E00094F8A401A8702088A88084F8A261384635 -:10C5F000F3F7B0FF23E02088F4F73AFB0746F3F7A0 -:10C60000AFFF10B10020BDE8F0816E700C202870E3 -:10C6100094F8A401A8702088A88094F8A801A871B3 -:10C6200084F8A2613846F3F795FF08E094F8DA0140 -:10C6300040B16E700F20287084F8DA616F8001209D -:10C64000BDE8F08194F8AA0180B16E7009202870CD -:10C6500020886880D4F8AE01D4F8B2116860A9606F -:10C66000B4F8B601A88184F8AA61E8E794F8B801A3 -:10C6700040B16E7017202870B4F8BA01688084F851 -:10C68000B861DCE794F8D40188B16E701820287086 -:10C6900094F8D4010028D2D084F8D461D4F8D6011B -:10C6A000C5F8020094F8D4010028F5D1C7E794F842 -:10C6B000BC01C8B16E701420287094F8BC01002829 -:10C6C000BDD000BF84F8BC61D4F8BE01C5F802003B -:10C6D000D4F8C201C5F80600B4F8C601688194F820 -:10C6E000BC010028EED1AAE794F8C80180B16E70B1 -:10C6F0001A20287084F8C861D4F8CA01C5F802006D -:10C70000D4F8CE01C5F80600B4F8D201688196E7E6 -:10C7100094F8DC0140B11B20287084F8DC61D4F867 -:10C72000DE01C5F802008AE794F8E201002808BF9C -:10C73000BDE8F0816E701520287094F8E2010028A1 -:10C740003FF47DAF84F8E261D4F8E401C5F802005B -:10C75000B4F8E801E88094F8E2010028F2D16EE72D -:10C7600024010020FA4A9060D1707047002180F8BF -:10C77000631080F8641080F8671090F8D61011B13B -:10C780000221FCF7E8BE0321FCF7E5BE2DE9F047E6 -:10C79000EF4C81460D46E0680088F4F77BFA06000E -:10C7A00008BFFFDF60782843607020794FF00005F4 -:10C7B00010F0200FE0681CBFA0F87C5080F8DC501F -:10C7C00004D1B0F87C10491CA0F87C10E068012767 -:10C7D00090F8691039B990F8642001230621583087 -:10C7E00002F0DFFE48B3A08810F4006F07D0E068C5 -:10C7F00090F86910002918BFA0F874501DD1E068A6 -:10C80000B0F87410491C89B2A0F87410B0F87630F2 -:10C810008B422CBF5A1A0022B4F806C00CF1050C4A -:10C82000624598BF80F87A70994206D3A0F8745098 -:10C8300080F8DA71E078EFF75DFA20794FF0020ABC -:10C8400010F0600F11D0E06890F8671011B1032963 -:10C8500006D00AE080F867700121FCF77CFE04E056 -:10C8600080F867A00121FCF776FEE06890F8671079 -:10C87000012905D1A18811F4807F18BF80F867A035 -:10C880004FF00808B9F1000F40F03281A18811F48F -:10C89000007F18BFA0F8F05004D1B0F8F020521C6F -:10C8A000A0F8F02011F0080F47D06178002944D19A -:10C8B00090F8C300FF2808BFFFDFFF21E06880F881 -:10C8C000C31090F86410192905D0E06890F863103F -:10C8D00020290FD028E080F88B5090F88A10491E4C -:10C8E00049B280F88A100029B8BFFFDFE06880F8FD -:10C8F0006450EAE790F8640002F046FE80B1E06818 -:10C900002621012380F8631090F864200B21583011 -:10C9100002F047FE002804BF2A20FEF7C9FF03E00B -:10C92000E168212081F86300E06890F8661008292A -:10C9300004BF84F800A080F86650FFF733F8207930 -:10C9400010F0040F09D0607838B9E06890F86610EC -:10C95000072904BF277080F8665000F0C5FB2079D6 -:10C9600010F0100F09D0607838B9E06890F86410C2 -:10C970000B2904BF0C2180F86410A07810F0080F78 -:10C9800011D0E0680123052190F86420583002F0AE -:10C9900008FE28B184F80180E06880F8A25102E026 -:10C9A000002001F07CFA00F03CFD01F06EFA002856 -:10C9B000E06818BFA0F8D05004D1B0F8D010491CDE -:10C9C000A0F8D01001F064FA40B1E16891F8DC0001 -:10C9D00002289CBF401C81F8DC0004D8E06890F875 -:10C9E000DC00022806D9E068A0F8D050A0F8D250A8 -:10C9F00080F8DC50E0680123002190F86420583072 -:10CA000002F0CFFD20B9E06890F864000C2859D1FD -:10CA1000E0680123002190F86320583002F0C1FD46 -:10CA200000284FD0E0680123002190F8662058309C -:10CA300002F0B7FDF0B3E06890F86710022904BF78 -:10CA400090F8DC0000283DD13046F3F70FFB88B3A7 -:10CA5000E06890F8C310FF2934D1B0F8CA1001295A -:10CA600030D980F8D570B0F87E10B0F87C208B1EDD -:10CA70009A42AFBF0121891A491E89B2B0F8D0305D -:10CA8000E28893422FBF0122D21A521C92B29142E5 -:10CA900088BF1146012908BF80F8D55090F8612160 -:10CAA000A2B1B0F8D220B0F8620182422CBF0120BE -:10CAB000801A00E006E03CBF401C80B2814288BF83 -:10CAC000014603E0E068012180F8D550E068B0F845 -:10CAD0005820114489B2A0F8CC1090F86730002B90 -:10CAE00018BF012B5FD0022B1CBF032BFFDF09D027 -:10CAF000A088C0F340200028E06818BFA0F8DE50EE -:10CB00005BD153E090F86630082B23D0B0F87C104E -:10CB1000B0F87E2000268B1C9A4206D3511A891E3B -:10CB20000E04360C1CBF711E8EB290F87A1051B1F3 -:10CB300090F8632001230921583002F032FD0028CB -:10CB400008BF00262BD0E06890F8691099B90AE078 -:10CB500024010020B0F87C30032B24D3B0F87E10E1 -:10CB60001144491C1FE090F864200123062158302D -:10CB700002F017FD78B1E1680020B1F87620B1F835 -:10CB800074108B1C9A4203D3501A801E18BF401E8B -:10CB9000B04238BF86B2002E1CBF701E86B2E0685D -:10CBA000B0F8CC103144A0F8C810A1E7B0F8DE10FE -:10CBB000B0F8CE201144A0F8DE10E06890F86611BD -:10CBC00039B990F8662001231946583002F0E9FC83 -:10CBD00038B1E068B0F88010B0F8CE201144A0F869 -:10CBE0008010E06890F8863033B1B0F88210B0F869 -:10CBF000CE201144A0F8821090F98AC0BCF1000F39 -:10CC000006DDB0F88810B0F8CE201144A0F88810E6 -:10CC10003D22B9F1000F18BF80F873204DD1217863 -:10CC2000022910D0012908BF90F8681143D061781B -:10CC300039B380F8727011F0140F18BF1E210CD098 -:10CC400080F8731055E090F8C410062905BF90F8DD -:10CC5000C3100229162106212DE011F0080F18BF7C -:10CC600080F8732045D111F0200F18BF2321E7D1A0 -:10CC700011F0030F08BFFFDF2A20E16881F873007D -:10CC800033E02BB1B0F88210B0F88420914211D279 -:10CC9000BCF1000F05DDB0F88810B0F88420914297 -:10CCA00008D2B0F88020B0F87E108A4208D390F8FD -:10CCB00066212AB1222180F8731080F8727018E082 -:10CCC00090F867203AB1B0F87C208A4228BF80F8FB -:10CCD0007380F2D209E0B0F87C10062905D33E211A -:10CCE00080F8731080F8727003E0E06890F87210BA -:10CCF00079B1E06880F8635080F8645080F867503C -:10CD000090F8D610002914BF02210321FCF723FC60 -:10CD100002E00021FCF71FFCE06880F8D650BDE877 -:10CD2000F047F8F7F0BBF949024648788B7818438A -:10CD30000ED10846C0684AB1097911F0080F03D036 -:10CD400090F86600082803D001207047FCF74FBB1D -:10CD5000002070472DE9F041EC4C05460E46A088B6 -:10CD60002843A08015F0020F04D015F0010F18BF62 -:10CD7000FFDF266115F0010F4FF000084FF00107AB -:10CD80001CD03046666103F01CF8062802D00B2840 -:10CD90000BD013E0E06890F8641017290ED1002141 -:10CDA000C0E9261180F8687008E0E06890F8641027 -:10CDB000112904BF80F8688080F88C7015F0020F8C -:10CDC00018D02069C078052802D00B280BD011E0BC -:10CDD000E06890F8641015290CD10021C0E92811F1 -:10CDE00080F8697006E0E06890F86410102908BFC8 -:10CDF00080F8698015F0800F1CBF0820A070BDE886 -:10CE0000F0812DE9F84FC14C00254FF00108A580B5 -:10CE10006570A5702570E06068F30709074680F823 -:10CE2000D6800088F3F736FF5FEA000A08BFFFDF0D -:10CE3000E0680088F8F72FFBE0680088F8F751FBFE -:10CE4000E068B0F8CA1071B190F8C310FF290FD193 -:10CE500090F8661191B190F8662001231946583078 -:10CE600002F09FFB98B1E06890F8C300FF2805D05E -:10CE7000E06890F8C30000BFFFF798FAD4F80CC040 -:10CE80009CF8D700002818BFE5801ED10FE0E068AD -:10CE9000A0F8805090F8671180F8C410002102209B -:10CEA000FFF76BFAE06880F8D5500220E4E79CF8C1 -:10CEB000960138B9BCF82000BCF80410884288BF3D -:10CEC000E08002D8BCF80400E080BCF8CE00401E30 -:10CED00086B2BCF8D0003044ACF8D0009CF8D40046 -:10CEE00000281CBFACF8D2508CF8D45004D1BCF848 -:10CEF000D2003044ACF8D200BCF87C003044ACF82E -:10CF00007C009CF8690040B99CF86420012306214C -:10CF10000CF1580002F045FB28B1E068B0F874103D -:10CF20003144A0F87410E068B0F8CA1001299CBF21 -:10CF3000491CA0F8CA10002E18BF80F8DC5090F8E9 -:10CF4000D510A1B1B0F8D000E18888420FD2504688 -:10CF5000F3F78CF858B1E06890F8611139B1B0F886 -:10CF6000D210B0F86201814228BF00F094FFE2685D -:10CF700082F8D55092F864000B2818BF0C2817D1FE -:10CF8000B2F85810B2F87C31C91A09B200290FDB87 -:10CF900002F5BF7102F1080004F053FF0221E068BE -:10CFA00001F0FEFEE06880F8645080F8968048E06A -:10CFB000252824D1B2F85800B2F87C11401A00B2EA -:10CFC00000281CDB92F8921192F87E01002808BF1D -:10CFD00092F8510082F8510092F87F01002808BFB2 -:10CFE00092F8520082F8520000291CBF0020FEF780 -:10CFF0005FFCE06880F8645080F87B5021E092F894 -:10D00000630025281DD1B2F85800B2F87C11401AEF -:10D0100000B2002815DB92F87E01002808BF92F8C4 -:10D02000510082F8510092F87F01002808BF92F861 -:10D03000520082F852000020FEF73AFCE06880F8C7 -:10D040006350E16801F15800B1F8CE2002F0B3F866 -:10D05000E06890F86111002918BFA0F8D2502C4860 -:10D0600000902C4B2C4A3946484600F053FEE068AD -:10D070000123052190F86420583002F092FA00282C -:10D0800008BFBDE8F88FBDE8F84F00F014BC00F011 -:10D09000E1BE10B50446B0F882214388B0F884118F -:10D0A000B0F886019A4201BFA3889942E38898426A -:10D0B0000FD02388A4F89A31A4F89C21A4F89E11DB -:10D0C000A4F8A001012084F896011048C078EEF77A -:10D0D00011FE0121204601F063FE002084F8640067 -:10D0E000032084F8670010BD70B5084C207910F05B -:10D0F000020F08BF70BD6078002818BF70BD20699E -:10D10000C178891E162980F06C8107E02401002077 -:10D110008DC7010027CD010055CD0100DFE801F0EA -:10D120000BF969758B1BF942F95BBE80F9F9F9F9C6 -:10D13000FAF7F6F5F4F3E0680123194690F8662053 -:10D14000583002F02EFA002818BF70BD0820E168A0 -:10D1500081F8660070BD02F0DFFEE16891F863209F -:10D160000A2A04BF91F8C220824205D1002081F82A -:10D17000630081F8860070BD91F8650010F0080F1B -:10D1800004BFFFDF70BD20F0080081F8650091F852 -:10D190008A00401E40B281F88A000028A8BF70BDF6 -:10D1A00000F0D8B8E06890F8650010F0010F08BFF3 -:10D1B000FFDFE16891F88A00401E40B281F88A00E2 -:10D1C0000028B8BFFFDFE06890F8651021F001018A -:10D1D00080F8651070BDE06890F86400102818BFF2 -:10D1E000FFDF0121E06880F88B10112180F86410C6 -:10D1F00070BDE06890F86400142818BFFFDF0121BB -:10D20000E06880F88B101521F0E7E06890F8640082 -:10D21000152818BFFFDF1720E16881F8640070BD92 -:10D22000E06890F86400152818BFFFDF1920E16856 -:10D2300081F8640070BDE06890F864001C2818BF95 -:10D24000FFDF0025E06880F88B5090F8A2010028ED -:10D2500018BFFFDFE06890F88C1041B180F88C5067 -:10D260000188A0F8A61180F8A4510D2108E00188DA -:10D27000A0F8A61180F8A451012180F8A8110C2172 -:10D2800080F8A2110088F3F7F3FCF3F753F9E07884 -:10D29000EEF730FDE06880F8645070BDE06890F80B -:10D2A0007A11042915D0E06890F8651011F0020F8A -:10D2B00008BF70BD90F88A10491E49B280F88A10E4 -:10D2C0000029B8BFFFDFE06890F8651021F0020187 -:10D2D0007EE790F8632001230021583002F061F9C5 -:10D2E000002808BFFFDFE06890F88E1011F0020FF1 -:10D2F00007BF062180F86310002180F8861018BF50 -:10D3000080F87A11CFE760E04FE035E024E011E0EB -:10D3100000E066E0E0680123002190F863205830C7 -:10D3200002F03FF9002808BFFFDF0E20E16881F816 -:10D33000630070BDE06890F8651021F0040180F88A -:10D34000651090F88A10491E49B280F88A100029A9 -:10D35000A8BF70BDFFDF70BDE0680123002190F819 -:10D360006320583002F01DF9002808BFFFDF1D20A0 -:10D37000E16881F8630070BDE06890F8650000F036 -:10D380003000102818BFFFDFE06890F8651021F02A -:10D39000100180F8651090F88A10491E49B280F893 -:10D3A0008A100029A8BF70BDD4E7E06801230021DE -:10D3B00090F86320583002F0F4F8002808BFFFDF2F -:10D3C0002020E16881F8630070BDE06890F8640097 -:10D3D00022281CBF0028FFDF2320E16881F86400B9 -:10D3E00070BDFFDF70BD10B5FE4CE16891F86500BF -:10D3F00010F0080F1EBF0120607010BD40F0080043 -:10D4000081F86500606902F0DCFCE16881F8C10028 -:10D410000020A1F8880091F88A00401C81F88A0059 -:10D4200010BD2DE9F041EF4CE06890F8C310FF29E2 -:10D4300006BF61780029BDE8F08190F866200123DD -:10D440001946583002F0ADF8002818BFBDE8F08149 -:10D45000E068002790F8661159B1A0F8807090F844 -:10D46000671180F8C410BDE8F04100210220FEF7EA -:10D4700084BF90F8642001230421583002F091F811 -:10D480005FEA00084FF002054FF001060CD0D4F817 -:10D490000CC09CF8640010287ED014287DD015287C -:10D4A0007CD01C287BD0E1E0E16891F8650010F0A9 -:10D4B000010F05D0BDE8F04101210920FEF75DBF55 -:10D4C00010F0020F0CD001210C20FEF756FFE0688F -:10D4D00090F88E1041F0010180F88E10BDE8F081C7 -:10D4E00010F0040F05D0BDE8F04101211320FEF734 -:10D4F00044BF10F0080F09D091F8C10081F8C400B2 -:10D50000BDE8F04101210720FEF737BF10F0100FF2 -:10D5100002D091F8890120B191F8640022287DD1D0 -:10D520009BE091F8880188B1B1F88A01A1F8400028 -:10D53000B1F88C01A1F84200B1F88E01A1F84400C5 -:10D54000B1F89001A1F8460081F88871FEF7E7F97B -:10D550000521E068FBF7FFFFE06890F84E10012915 -:10D5600008BF80F84E5014D00288A0F8BE21028E69 -:10D57000A0F8C021828EA0F8C221428E00F5CB71A6 -:10D58000A0F8C421C08E088681F82660E078EEF706 -:10D59000B1FB0121152003E006E00BE023E056E09B -:10D5A000BDE8F041FEF7E9BEBDE8F04101210B20E6 -:10D5B000FEF7E3BEF6F7D1FA0C2838BFBDE8F081DC -:10D5C0000821E068E830F6F7C9FA28B1E0680421DC -:10D5D000BC30F6F7C3FA00B9FFDFBDE8F041012126 -:10D5E0000420FEF7CABE9CF86901012817D0022862 -:10D5F00018BFBDE8F0819CF88C0000281CBF0620F5 -:10D600008CF8C4004FF0010114BF02200D20FEF77A -:10D61000B4FEE06880F86971BDE8F08126E09CF80E -:10D62000A201002818BFBDE8F0810CF1A803002278 -:10D630000CF1E0010CF5B57001F03BFF0121052074 -:10D64000FEF79BFEE06880F86971BDE8F081BDE8F7 -:10D65000F04101210620FEF790BE91F87B00C0B991 -:10D6600091F8920110B191F8930190B1E068012313 -:10D67000002190F86320583001F093FFC8B1E068B2 -:10D680000123042190F86420583001F08AFF30B162 -:10D690000FE0BDE8F04101211720FEF76EBEE06803 -:10D6A00090F87A0028B1BDE8F04100211220FEF781 -:10D6B00064BEE06890F863200A2A4DD0B8F1000FEC -:10D6C00018BFBDE8F08101230021583001F069FF47 -:10D6D00048B1E06890F87A11042904BF90F88E00F0 -:10D6E00010F0030F42D0E0680123002190F863207E -:10D6F000583001F056FF002808BFBDE8F081E0680F -:10D7000090F8881111B190F88911E1B390F8921155 -:10D71000002908BFBDE8F08190F89311002918BFD7 -:10D72000BDE8F08190F8642001230B21583001F00E -:10D7300038FF002818BFBDE8F081E06890F851205C -:10D7400090F89411012A71D0022A73D0042A14BFD0 -:10D75000082A042970D082E090F8C21080F8C41022 -:10D76000BDE8F04100210720FEF707BE00210C2094 -:10D77000FEF703FEE06890F88E1041F0010180F89A -:10D780008E10BDE8F081FFE7B0F88A11A0F84010D4 -:10D79000B0F88C11A0F84210B0F88E11A0F8441027 -:10D7A000B0F89011A0F8461080F8887190F86500E4 -:10D7B00010F0200F34D0FEF7B2F80521E068FBF737 -:10D7C000CAFEE06890F84E10012908BF80F84E505C -:10D7D00017D00288A0F8BE21028E00F5CB71A0F808 -:10D7E000C02101E024010020828EA0F8C221428ED7 -:10D7F000A0F8C421C08E088681F82660E078EEF794 -:10D8000079FA01211520FEF7B8FDE06890F865105F -:10D8100021F0200141F0100180F86510BDE8F08191 -:10D82000BDE8F04100211420FEF7A7BD012916D163 -:10D8300002E0FFE7022912D190F8522090F89511EA -:10D84000012A07D0022A08D0042A14BF082A042972 -:10D8500022D004E0012902D11EE002291CD090F858 -:10D86000642001230321583001F09BFE002818BFDB -:10D87000BDE8F081E0680123022190F8642058306F -:10D8800001F08FFE002818BFBDE8F0810021BDE83F -:10D89000F0411620FEF771BDBDE8F0410020FEF713 -:10D8A00007B8000030B5FF4C05462078002818BFA7 -:10D8B000FFDFA57230BDFB49012048727047FA486E -:10D8C00000B502784168406801F1580C91F8633066 -:10D8D00090F85100252B1CBF9CF80CC0BCF1250F03 -:10D8E00017D0202B18BF212B38D0BCF1230F18BF25 -:10D8F00000BD002A08BF00BD91F8942191F8501096 -:10D90000114011F0010F44D0082818BF04284CD052 -:10D910004EE08AB191F87E11002908BF00BD0828A9 -:10D9200018BF042841D0082918BF04293DD0012878 -:10D9300018BF01293CD036E091F8E810002908BF53 -:10D9400000BD082818BF04282FD0082918BF0429B3 -:10D950002BD0012818BF01292AD024E0BCF1230FC5 -:10D96000C7D0002A08BF00BD91F8941111F0010F33 -:10D9700004D0082818BF042817D019E011F0020FAE -:10D9800008BF00BD082818BF04280ED001280FD0FA -:10D9900009E011F0020F08BF00BD082818BF0428D5 -:10D9A00003D0012804D0022000BDFFDF082000BD05 -:10D9B000012000BD2DE9F14FBB4E4FF0010831466B -:10D9C0006FF00E0A4F686FF00D0B97F85210F88E3B -:10D9D00002290CBF0AEB90000BEBD00085B2788EC9 -:10D9E000A84238BF0546AF4C2946606BF2F77AFB78 -:10D9F000DFF8B892E06200281DBF0021A170A0628C -:10DA000084F8028008BFC4F8289030787068014616 -:10DA100000F1580890F86930428E91F85210C08E8B -:10DA200002290CBF0AEB90000BEBD00080B28242BF -:10DA300038BF1046002B1CBF001D80B2F6F756FE03 -:10DA400098F81100002838D008F15001974891E863 -:10DA50000E1000F5027A8AE80E10D8F86010C0F8AF -:10DA60002112D8F86410C0F8251200F58170F7F77C -:10DA7000B6F9307800280CBF0120002080F00101A9 -:10DA80008B480176D8E91212C0E90412C4F8289034 -:10DA90004946A581A0F58372F6F71BFD97F8520061 -:10DAA000012808BF002104D002281ABFFFDF00218F -:10DAB00001210120F6F71BFD04E0A06AF7F78FF9BA -:10DAC000F6F738FD009848B9012297F852309621B0 -:10DAD0001046F7F741F89620F7F7A9F997F82C00C8 -:10DAE000012808BFF7F726FA02202070BDE8F88F5A -:10DAF0002DE9F04FDFF8B08183B0414681464E6892 -:10DB0000A1F11400009096F85D004FF0000A012783 -:10DB100006F15804A1F1380570B3012873D002282A -:10DB200075D0032818BFFFDF7FD0686A082201780C -:10DB300021F008010170A37902EAC302114321F028 -:10DB400004010170E279042303EA8202114321F007 -:10DB50001001017094F805B0286BF2F795FA82462F -:10DB6000F7F7E3FCBBF1020F66D0BBF1010F67D002 -:10DB7000BBF1030F68D06CE0B6F834B0FFF79FFE3E -:10DB8000022819BF6FF00D0000EBDB006FF00E00F4 -:10DB900000EB9B0081B2308E884238BF0146ADF861 -:10DBA0000810A6F84C100098F7F79EFC38B1696A87 -:10DBB000EF70AA694FF48060904703201EE001AA2D -:10DBC00002A9286BF2F743F9686210B194F8331098 -:10DBD00021B10098F7F75CFC6771A6E79DF8041087 -:10DBE00031B9A0F800A080F802A0012102F03EF8AF -:10DBF000BDF80810686A02F01AFA0220607194E712 -:10DC000001E004E011E00098F7F742FC8DE7B6F878 -:10DC10004C00ADF8000001AA6946286BF2F717F92D -:10DC20006862002808BFFFDF7FE70098F7F75CFC19 -:10DC3000002808BFFFDF78E730EA0A0009D106E0D4 -:10DC400030EA0A0005D102E0BAF1000F01D001214B -:10DC500000E00021686A027842EA01110170217C2B -:10DC600000291CBF617901293CD004F150010F4803 -:10DC700091E80E1000F5027A8AE80E10216EC0F8C5 -:10DC80002112616EC0F8251200F58170F7F7A7F830 -:10DC900098F8000000280CBF0121002104480176FB -:10DCA00008E000003C01002074010020C00E0020AC -:10DCB000C8100020D4E91012C0E90412A0F5837145 -:10DCC0006A6AF6F706FC96F85100012808BF0021A1 -:10DCD00004D002281ABFFFDF002101210020F6F73F -:10DCE00006FC03E0F7F77BF8F6F724FCB9F1000F28 -:10DCF00006D196F85130012296210020F6F72CFF2C -:10DD0000AF71686A018829828078A8742F7003B087 -:10DD1000BDE8F08F2DE9F0471E46174681460C46B8 -:10DD2000FE4DDDF82080287828B9002F1CBF002E7A -:10DD3000B8F1000F00D1FFDFC5F82080C5E90E94CF -:10DD4000C5E9067600206872287268712871A8718A -:10DD5000E871F34EE870E881307804F158072088C4 -:10DD6000F2F798FF28632088F2F782FF6863F7F7DD -:10DD70002BF8F6F7DBFC04F11200F7F70EF804F1CC -:10DD80000E00F6F774FD307800280CBF0320012048 -:10DD9000F7F717F8787EF6F772FDF7F70CF830789A -:10DDA0006FF00E056FF00D09002830D0618EE08E07 -:10DDB00094F852407A7C022C0CBF05EB900009EBE2 -:10DDC000D00080B2814238BF0846002A1CBF001D27 -:10DDD00080B22146F6F78AFC3078002831D070688E -:10DDE00090F86001002818BFF6F7F2FC22460021E7 -:10DDF0000120F6F76DFE7068D0F8D800F6F7F2FF54 -:10DE00000120FFF7D7FDBDE8F047F6F7E5BF97F82B -:10DE10001080278EB4F834A0FFF751FD022814BFFC -:10DE200009EBDA0005EB9A0085B2AF4234BF384601 -:10DE30002846B8F1000F1CBF001D80B294F8514075 -:10DE4000C7E7002122460846F6F742FE0120FFF709 -:10DE50004FFED8E7B24810B501783838007831B1B4 -:10DE6000022818BFFFDFBDE81040F6F7ADBF01285C -:10DE700018BFFFDFF7E7A94810B50078022818BFE0 -:10DE8000FFDFBDE8104000F044BAA4488079704735 -:10DE9000A24840797047A1490120C87170472DE917 -:10DEA000F04706009E489D4D4FF0010740684FF037 -:10DEB000000800F15804A86A90F8019018BF012EDC -:10DEC00003D1696B03F0D0FA68706878A0B10128BB -:10DED00031D0022849D003281CBFFFDFBDE8F087FE -:10DEE000012E08BFBDE8F087686BF2F70CFBA87A3B -:10DEF000BDE8F047EDF7FEBE012E08D001224946ED -:10DF0000686BF2F74DF9022E08BFBDE8F087D4E93F -:10DF10001202411C42F10000C4E91210E07901280C -:10DF200003D100BF84F8078000E0E771A87ABDE85C -:10DF3000F047EDF7DFBE012E08D000224946686B9E -:10DF4000F2F72EF9022E08BFBDE8F087D4E91201DE -:10DF5000401C41F10001C4E91201E07901280CBF25 -:10DF600084F80780E771BDE8F087012E06D0686B62 -:10DF7000F2F7C9FA022E08BFBDE8F087D4E9120112 -:10DF8000401C41F10001C4E91201E0790128CCD123 -:10DF9000C8E72DE9F041624F4FF000083846A7F17D -:10DFA00038044068012600F158052078012818BF80 -:10DFB000FFDFA87850B185F80280E670A26941467B -:10DFC000042090473878002818BF2E71606A03211A -:10DFD000007831EA000004BFE878002805D1EE702F -:10DFE000616AE670A269022090470121002000F0DA -:10DFF000B1F918B1BDE8F04100F08BB9BDE8F041CE -:10E000000020D7E42DE9F84F454C83462046A4F183 -:10E0100038054068217800F1580A287800264FF02A -:10E020000109022818BFFFDFE88940F40070E88189 -:10E030002078676800283A48406890F868000090A7 -:10E040003C8EB7F83480FFF73AFC022807BF6FF028 -:10E050000E0000EB98006FF00D0000EBD80080B2CE -:10E06000844238BF2046009900291CBF001D80B2A1 -:10E0700097F85110F6F73AFB9AF81100BBF1000F30 -:10E0800000F0FA80F6F77CFAF6F76AFA90B99AF897 -:10E09000110078B1A86A417861B100789AF8071048 -:10E0A000C0F3C000884205D185F80490BDE8F84F60 -:10E0B00000F02FB9A86A1A4FB0460188A5F81310CE -:10E0C00080786875E88940F02000E8816E713878C2 -:10E0D0007868583000907C6894F82C00012818D19A -:10E0E000F6F71EFF2046009901F023FA88B1387830 -:10E0F000002878680CBF00F5867000F5EA7021886A -:10E1000041800099097A017180F80090A87AEDF7B2 -:10E11000F1FDA86A0078C0F3800003E03C01002014 -:10E12000740100209AF80610884237D03878786851 -:10E1300000F1580490F85D0060B3022848D000BF99 -:10E1400084F80580387840B12079414628B12171A2 -:10E1500085F80390AA6910209047E07898B184F878 -:10E160000380F7F7D0F9002808BFFFDF082085F803 -:10E170000390AA6900219047D4E91002411C42F1A2 -:10E180000000C4E91010A07901280CBF84F80680B3 -:10E1900084F80690E88940F48070E881A86A9AF8CB -:10E1A00007300178C1F3C0029A4252D13A787A68B6 -:10E1B00001F0030102F15804012918BF022935D0EA -:10E1C00003291CBF287A40F0040012D0287240E0D6 -:10E1D000286BF1F776FE002808BFFFDFD4E91002B4 -:10E1E000411C42F10000C4E91010A87AEDF782FD4D -:10E1F000A6E701F05CFDA8B184F80290E9894846E1 -:10E2000041F40061E981A96A85F80390AA69904701 -:10E21000E079012803D100BF84F8078019E084F871 -:10E22000079016E0287A40F01000CFE74078F8B168 -:10E23000E98941F40061E981A97851B9FB28F1D855 -:10E24000687A002808BF4E4603D08020AA690021C2 -:10E2500090475946012000F07DF858B39AF8110014 -:10E26000002818BFBBF1000F1BD0A87868B118E0D8 -:10E27000E0790128D3D1CFE7002818BFF6F7B9F924 -:10E28000E88940F04000E881E3E7A96AAA89487874 -:10E29000904288BF1046C21CE86A03F02DFCE86A71 -:10E2A000A862002E1CBF0020FFF7F9FDBDE8F84F63 -:10E2B00000F02FB8002E1CBF0120FFF7F0FD00205A -:10E2C000FFF716FC9AF81100002818BFBBF1000FE9 -:10E2D0000DD0A87858B9A96AAA894878904288BF11 -:10E2E0001046C21CE86A03F007FCE86AA862002E28 -:10E2F00008BFBDE8F88F0220BDE8F84FCFE5354AEA -:10E300001378526892F851200BB1FBF76ABAFAF70A -:10E310001AB970B52F4900254C68F6F7B7FDF6F726 -:10E32000A9FDF6F7DBFCF6F73EFDF6F703F9F6F785 -:10E3300053FD94F82C00012808BFF6F7F1FD264C98 -:10E340000021A269E0899047226A217A20799047CA -:10E35000257070BD70B5204C0546002908BF012D01 -:10E3600005D16079401CC0B26071012830D8E169E4 -:10E370002846884700282BD0E179184839B1012D6B -:10E3800001BF41780029017811F0100F20D0217AC7 -:10E39000F1B910490978002918BF002102D029439A -:10E3A00004D013E0012D18BF0121F8D10C490978E0 -:10E3B00011F0100F04BF007810F0100F08D0E078B3 -:10E3C00030B9A07810B111F0100F01D0002070BD4D -:10E3D000012070BD740100203C0100204F0100208D -:10E3E0004C01002010B540F2C311F94803F0FBFBCB -:10E3F000FF220821F748E4F7FAFDF74800214170B1 -:10E400004FF46171418010BD2DE9F0410F46064681 -:10E4100000F03FFBEE4C102817D004EBC00191F840 -:10E420004A1111F0010F1CBF0120BDE8F081617895 -:10E4300008291FD2617804EBC000491C61700121DA -:10E4400080F84A110846BDE8F0816178082911D2A8 -:10E450002578681C207004EBC5083868C8F84401AA -:10E46000B888A8F84801102D28BFFFDF88F843615D -:10E470002846DFE70020BDE8F081D5480178491E35 -:10E480004BB2002BB8BF704770B4002500EBC3013E -:10E4900091F84A1111F0010F3BD04278D9B2521EC7 -:10E4A000427000EBC10282F84A5190F802C000228B -:10E4B000BCF1000F0BD9841894F803618E4202D18D -:10E4C000102A26D103E0521CD2B29445F3D8027828 -:10E4D000521ED2B202708A421BD000EBC20200EB85 -:10E4E000C10CD2F84341CCF84341D2F84721CCF8D3 -:10E4F0004721847890F800C00022002C09D98618A2 -:10E5000096F8036166450AD1102A1CBF024482F8BE -:10E510000311591E4BB2002BB8DA70BC7047521C65 -:10E52000D2B29442EBD8F4E72DE9F0471F4690466B -:10E530000E46814600F0ADFAA54C0546102830D0B5 -:10E54000A2780021002A0ED9631893F80331834280 -:10E5500005D110291CBF1220BDE8F08703E0491C3B -:10E56000C9B28A42F0D8082A2FD2102D1CD0A67822 -:10E570001022701CA07004EB061909F1030041463B -:10E5800000F086FF09F183001022394600F080FF79 -:10E59000A019002180F8035180F83B110846BDE81E -:10E5A000F087A278082A10D22578681C207004EB26 -:10E5B000C50A3068CAF84401B088AAF84801102D8D -:10E5C00028BFFFDF8AF84391D1E70720BDE8F08735 -:10E5D00070B47F488178491E4BB2002BBCBF70BC21 -:10E5E000704700BF817803F0FF0C491ECAB28270E9 -:10E5F00050FA83F191F8031194453ED000EB0215D7 -:10E6000000EB0C14D5F80360C4F80360D5F807607C -:10E61000C4F80760D5F80B60C4F80B60D5F80F603C -:10E62000C4F80F60D5F88360C4F88360D5F88760BC -:10E63000C4F88760D5F88B60C4F88B60D5F88F502C -:10E64000C4F88F50851800EB0C0402EB420295F8D9 -:10E6500003610CEB4C0C00EB420284F8036100EB0D -:10E660004C0CD2F80B61CCF80B61B2F80F21ACF86E -:10E670000F2195F83B2184F83B2100EBC10292F871 -:10E680004A2112F0010F33D190F802C00022BCF1F0 -:10E69000000F0BD9841894F803518D4202D1102A2F -:10E6A00026D103E0521CD2B29445F3D80278521E10 -:10E6B000D2B202708A421BD000EBC20200EBC10C46 -:10E6C000D2F84341CCF84341D2F84721CCF8472156 -:10E6D000847890F800C00022002C09D9851895F89C -:10E6E000035165450BD1102A1CBF024482F8031167 -:10E6F000591E4BB2002BBFF675AF70BC7047521C51 -:10E70000D2B29442EAD8F3E73349487070473248AE -:10E710004078704738B14AF2B811884203D82E4980 -:10E72000488001207047002070472B484088704780 -:10E7300010B500F0AEF9102814D0254A014600208B -:10E7400092F802C0BCF1000F0CD9131893F80331F2 -:10E750008B4203D1102818BF10BD03E0401CC0B28B -:10E760008445F2D8082010BD19498A78824286BFB4 -:10E7700001EB001083300020704715498A788242EF -:10E7800086BF01EB0010C01C00207047104B93F8AF -:10E7900002C084459CBF00207047184490F80301D4 -:10E7A00003EBC00090F843310B70D0F844111160B6 -:10E7B000B0F84801908001207047054A114491F853 -:10E7C000032105490A7002684A6080880881704701 -:10E7D000F0100020860100207C01002010B5F5F724 -:10E7E00027FE002804BFFF2010BDBDE81040F5F74C -:10E7F00045BEFE498A7882429CBF0020704708448B -:10E8000090F8030101EBC00090F84A0100F001000C -:10E8100070472DE9F047F54F0026B04638780028BC -:10E8200086BF4FF0080ADFF8C893BDE8F08700BF45 -:10E8300007EBC80505F5A27195F8430100F029F929 -:10E84000102808BF544610D0B978002400290BD9ED -:10E850003A1992F80321824202D1102C05D103E02B -:10E86000621CD4B2A142F3D80824B878A04286BF73 -:10E8700007EB0410C01C002095F84A1111F0010F9D -:10E8800016D050B1082C04D2391991F83B11012946 -:10E8900003D0102100F0D9FD50B109F806403046F0 -:10E8A000731C95F8432105F5A271DEB2F5F7A8FFB8 -:10E8B00008F1010000F0FF0838784045B8D8BDE8FD -:10E8C000F0872DE9F041C94C00263546A078002894 -:10E8D0008CBFC74FBDE8F0816119C0B291F80381C8 -:10E8E000A84286BF04EB0510C01C002091F83B1124 -:10E8F000012903D0102100F0A8FD58B104EBC80095 -:10E90000BD5590F8432100F5A2713046731CDEB26C -:10E91000F5F776FF681CC5B2A078A842DCD8BDE840 -:10E92000F08110B5F5F79BFF002804BF082010BD4B -:10E93000F5F799FFAE49085C10BDAE4910B54978AE -:10E9400041B1AA4B997829B1C21CD81CF5F70DFD2D -:10E95000012010BD002010BDA44A01EB410102EBD3 -:10E9600041010268C1F80B218088A1F80F017047AE -:10E970002DE9F0419D4D07460024A878002898BF56 -:10E98000BDE8F081C0B2A04213D905EB041010F12C -:10E9900083060ED01021304600F057FD48B904EB35 -:10E9A000440005EB400000F20B113A463046F6F702 -:10E9B0003AFE601CC4B2A878A042E3D8BDE8F0815A -:10E9C000014610228C4800F063BD8B48704770B53B -:10E9D000864D0446A878A04206D905EB0410102104 -:10E9E000833000F032FD08B1002070BD04EB44001C -:10E9F00005EB400000F20B1070BD7C498A78824222 -:10EA000006D9084490F83B01002804BF0120704754 -:10EA1000002070472DE9F0410E46074615460621B5 -:10EA2000304600F012FD714C98B1A17871B104F537 -:10EA30009D7011F0010F18BF00F8015FA17849081F -:10EA400004D0457000F8025F491EFAD10120BDE8EC -:10EA5000F0813846314600F01CF8102816D0A37813 -:10EA60000021002B12D9621892F80321824209D1A9 -:10EA7000102918BF082909D0601880F83B510120DF -:10EA8000BDE8F081491CC9B28B42ECD80020BDE83A -:10EA9000F0812DE9F041554D0646002428780F46B7 -:10EAA000002811D905EBC40090F84311B14206D1FA -:10EAB0000622394600F5A27002F0F2FF38B1601C60 -:10EAC000C4B22878A042EDD81020BDE8F0812046DD -:10EAD000BDE8F081454910B44A7801EBC003521EED -:10EAE0004A70002283F84A2191F802C0BCF1000F5D -:10EAF0000DD98B1893F80341844204D1102A1CBF0E -:10EB000010BC704703E0521CD2B29445F1D80A7889 -:10EB1000521ED2B20A70824204BF10BC704701EB91 -:10EB2000C00301EBC202D2F843C1C3F843C1D2F81B -:10EB30004721C3F847218C7891F800C00022002CAF -:10EB40009CBF10BC70478B1893F80331634506D106 -:10EB5000102A1CBF114481F8030110BC7047521CDD -:10EB6000D2B29442EFD810BC704770B41F490D1850 -:10EB70008A78521ED3B28B7095F80321984247D001 -:10EB800001EB001401EB031C00EB4000DCF8036018 -:10EB9000C4F80360DCF80760C4F80760DCF80B60B9 -:10EBA000C4F80B60DCF80F60C4F80F60DCF8836019 -:10EBB000C4F88360DCF88760C4F88760DCF88B6099 -:10EBC000C4F88B60DCF88FC0C4F88FC001EB030C75 -:10EBD00003EB43039CF8034101EB430385F8034136 -:10EBE00001EB4000D3F80B4108E00000F0100020DA -:10EBF000860100207C010020B3120020C0F80B41E8 -:10EC0000B3F80F31A0F80F319CF83B0185F83B01B8 -:10EC100001EBC20090F84A0110F0010F1CBF70BC5C -:10EC2000704700208C78002C0DD90B1893F803C185 -:10EC3000944504D110281CBF70BC704703E0401CF1 -:10EC4000C0B28442F1D80878401EC0B20870904229 -:10EC500004BF70BC704701EBC20301EBC000D0F8E9 -:10EC600043C1C3F843C1D0F84701C3F847018C78CA -:10EC70000B780020002C9CBF70BC704701EB000C8F -:10EC80009CF803C19C4506D110281CBF084480F89D -:10EC9000032170BC7047401CC0B28442EED870BCE7 -:10ECA0007047000010B50A7B02F01F020A730022B1 -:10ECB000C2758B181B7A03F0010C5B0803F001048A -:10ECC000A4445B0803F00104A4445B0803F00104BE -:10ECD000A4445B0803F0010464444FEA530C0CF0B5 -:10ECE000010323444FEA5C0C0CF00104234403EBC2 -:10ECF0005C0300EB020C521C8CF8123090F817C029 -:10ED0000D2B26344C375052AD3D3D8B2252888BFAD -:10ED1000FFDF10BD00238383028401EBC202521E79 -:10ED2000B2FBF1F1C183704770B46FF01F02010CA8 -:10ED300002EA90251F23A1F5AA4054381CBFA1F573 -:10ED4000AA40B0F1550009D0A1F52850AA381EBF3D -:10ED5000A1F52A40B0F1AA00012000D100204FF017 -:10ED6000000C62464FEA0C048CEA0106F643164397 -:10ED7000B6F1FF3F11D005F001064FEA5C0C4CEAFA -:10ED8000C63C03F0010652086D085B08641C42EAA9 -:10ED9000C632162CE8D370BC704770BC0020704798 -:10EDA0002DE9F04701270025044603290FD04FF431 -:10EDB000FA43002972D0012900F0F880022918BF17 -:10EDC000BDE8F0870146BDE8F04758306AE704F136 -:10EDD00058067021304602F028FFB571F571F572C2 -:10EDE0003573B573F573757135767576F52086F8DC -:10EDF0003C00412086F83D00FF2086F86B00A4F817 -:10EE0000C850A4F8CA50A4F8CC50A4F8CE50A4F826 -:10EE1000D050A4F8D25084F8D55084F8D750A4F834 -:10EE2000DE5084F8DC50A4F8F050A4F8F25084F8D6 -:10EE30002C50258484F8517084F852704FF4486047 -:10EE400060801B21218761874FF4A470E087A08731 -:10EE500021866186E086A086A4F84410A4F84600C6 -:10EE6000A4F84010A4F84200A4F84810A4F84A10EE -:10EE7000A4F84C10677384F8885184F8895184F899 -:10EE8000925184F8935184F8615184F8665184F862 -:10EE9000695184F87A51BDE8F087FFE7A4F8DE50A5 -:10EEA00084F8D6506088FE490144B1FBF0F1A4F823 -:10EEB00076104BF68031A4F87810E288A4F87C50E4 -:10EEC000B4F880C0D2000CFB00FCB2FBF0F29CFB5B -:10EED000F0FC521CA4F880C092B202FB00FC04F1CA -:10EEE0005801A4F87E20BCF5C84FC4BF521ECA8486 -:10EEF000B3FBF0F2521C8A8500F5802202F5EE3257 -:10EF0000531EB3FBF0F2CA838B8B03FB00F2B2FB00 -:10EF1000F0F08883214604F15800FFF7C3FED4F8CF -:10EF20000E106FF01F02080C02EA9126A0F5AA410C -:10EF30004FF01F0C54391CBFA0F5AA41B1F1550187 -:10EF40000AD0A0F52851AA391EBFA0F52A41B1F177 -:10EF5000AA014FF0010901D14FF00009002211462A -:10EF60004FEA020382EA00086FEA080848EA01084B -:10EF7000B8F1FF3F16D006F00108520842EAC83245 -:10EF800049080CF0010876085B1C41EAC8314FEAD9 -:10EF90005C0C162BE6D3B9F1000F1CBF84F860514E -:10EFA000BDE8F08784F86071BDE8F087A4F8DE5012 -:10EFB000B4F88221B4F88611B4F802C004F1580004 -:10EFC000A4F87C50B4F88040C90004FB0CF4B1FBF9 -:10EFD000F2F194FBF2F4491C048589B201FB02F4BE -:10EFE000C184B4F5C84FC4BF491EC184B3FBF2F15C -:10EFF000491C8185018C02EBC101491EB1FBF2F174 -:10F00000C183818B01FB0CF1B1FBF2F18183BDE87F -:10F01000F08770B50025044603290DD04FF4FA425D -:10F02000002958D001297DD0022918BF70BD0146A2 -:10F03000BDE87040583035E604F15806702130467E -:10F0400002F0F3FDB571F571F5723573B573F573B3 -:10F05000757135767576F52086F83C00412086F886 -:10F060003D00FF2086F86B00A4F8D050202084F8E3 -:10F07000D20084F8C850C4F8CC50012284F82C5037 -:10F0800084F8512084F852201B20208760874FF499 -:10F09000A471E187A18720866086E186A186A4F815 -:10F0A0004400A4F84610A4F84000A4F84210A4F8C4 -:10F0B0004800A4F84A00A4F84C00627384F8FC509D -:10F0C00084F8FD5084F8065184F8075184F8EC5018 -:10F0D00084F8F85070BD608871490144B1FBF0F1CB -:10F0E000A4F876104BF68031A4F87810E388A4F8E1 -:10F0F0007C50B4F880C0DB000CFB00FCB3FBF0F3E9 -:10F100009CFBF0FC5B1CA4F880C09BB203FB00FCE2 -:10F1100004F15801A4F87E30BCF5C84FC4BF5B1E93 -:10F12000CB8400E017E0B2FBF0F2521C8A8500F5B8 -:10F13000802202F5EE32531EB3FBF0F2CA838B8BB2 -:10F1400003FB00F2B2FBF0F08883214604F1580083 -:10F15000BDE87040A6E5D4F8F030B4F802C004F180 -:10F1600058005989DB89A4F87C50B4F88040DB0052 -:10F1700004FB0CF4B3FBF1F394FBF1F45B1C04858A -:10F180009BB203FB01F4C384B4F5C84FC4BF5B1E3C -:10F19000C384B2FBF1F2521C8285028C01EBC202E5 -:10F1A000521EB2FBF1F2C283828B02FB0CF2B2FB65 -:10F1B000F1F1818370BD2DE9F003C47D0CB1252CE4 -:10F1C00003D9BDE8F00312207047002A02BF0020D7 -:10F1D000BDE8F003704791F80DC01F260123314DA3 -:10F1E0004FF00008BCF1000F7AD0BCF1010F1EBF38 -:10F1F0001F20BDE8F0037047B0F800C00A7C8F7B89 -:10F2000091F80F907A404F7C87EA090742EA07227B -:10F2100082EA0C0C5FF000070CF0FF094FEA1C2C8F -:10F2200099FAA9F99CFAACFC4FEA19694FEA1C6CEF -:10F2300049EA0C2C0CEB0C1C7F1C9444FFB21FFA07 -:10F240008CFC032FE8D38CEA020C164F0022ECFB57 -:10F25000057212096FF0240502FB05C2D2B201EB60 -:10F26000D207027602F007053F7A03FA05F52F422E -:10F2700018BF42767ED104FB0CF2120C521CD2B2A3 -:10F280005FF0000400EB040C9CF812C094453CBFF6 -:10F29000A2EB0C02D2B218D34FF0000C0D1903E010 -:10F2A000FFDB050053E4B36E95F8085003FA0CF742 -:10F2B0003D421CBF521ED2B2002A6AD00CF1010C92 -:10F2C0000CF0FF0CBCF1080FF0D304F1010C0CF0B2 -:10F2D000FF04052CD6D33046BDE8F0037047FFE7A6 -:10F2E00090F818C00C7E474604FB02C2FB4C4FF05E -:10F2F000000CE2FB054C4FEA1C1C6FF024040CFBD5 -:10F300000422D2B201EBD204027602F0070C247A76 -:10F3100003FA0CFC14EA0C0F1FBF42764046BDE80E -:10F32000F003704790F817C0B2FBFCF40CFB1422FA -:10F33000521CD2B25FF0000400EB040C9CF812C027 -:10F3400094453CBFA2EB0C02D2B212D30D194FF080 -:10F35000000C2D7A03FA0CF815EA080F1CBF521E98 -:10F36000D2B27AB10CF1010C0CF0FF0CBCF1080F19 -:10F37000F0D300E010E004F1010C0CF0FF04052CC8 -:10F38000DAD3A8E70CEBC40141763846BDE8F003B8 -:10F3900070470CEBC40141764046BDE8F00370476E -:10F3A000CF4A016812681140CE4A126811430160C9 -:10F3B000704730B4CC49CA4B00244FF0010C0A7896 -:10F3C000521CD2B20A70202A08BF0C700D781A683D -:10F3D0000CFA05F52A42F2D0097802680CFA01F11C -:10F3E0005140016030BC7047017931F01F0113BFFB -:10F3F000002000221146704710B4435C491C03F002 -:10F40000010C5B0803F00104A4445B0803F0010451 -:10F41000A4445B0803F00104A4445B0803F0010466 -:10F42000A4445B0803F001045B08A44403F0010456 -:10F43000A4440CEB53031A44D2B20529DDDB012AA4 -:10F440008CBF0120002010BC704730B40022A1F115 -:10F45000010CBCF1000F11DD431E11F0010F08BFBC -:10F4600013F8012F5C785FEA6C0C07D013F8025F89 -:10F4700022435C782A43BCF1010CF7D1491E5CBFE2 -:10F48000405C0243002A0CBF0120002030BC7047C2 -:10F49000130008BF704710B401EB030CD41A1CF81A -:10F4A00001CC5B1E00F804C013F0FF03F4D110BCC4 -:10F4B0007047F0B58DB0164610251C466A46AC461E -:10F4C00000EB0C03A5EB0C0713F8013CD355ACF192 -:10F4D000010313F0FF0CF3D11546103210208446BF -:10F4E0000B18ACEB000713F8013C401ED35510F08D -:10F4F000FF00F5D1284601F033FA86B1102005F15E -:10F50000200201461318A1EB000C13F8013C401E29 -:10F5100004F80C3010F0FF00F4D10DB0F0BD0898E5 -:10F520002060099860600A98A0600B98E0600DB0B8 -:10F53000F0BD38B505460C466846F5F706FD0028CF -:10F5400008BF38BD9DF90020227294F909100020EF -:10F55000511A48BF494295F82D308B42C8BF38BD7B -:10F56000FF2B08BF38BDA17A491CC9B2A17295F81A -:10F570002E30994203D8617A7F2918BF38BD627254 -:10F580000020A072012038BD0C2818BF0B2806D01F -:10F590000D281CBF2038062884BF0020704701209A -:10F5A00070470C295AD2DFE801F006090E13161B2A -:10F5B000323C4153484E002A52D04FE0072A18BF30 -:10F5C000082A4DD04AE00C2A18BF0B2A48D045E043 -:10F5D0000D2A45D042E0A2F10F000D2840D93DE0B0 -:10F5E00023B1A2F110000C283AD937E0122A18BF33 -:10F5F000112A35D090F8340020B1122A2ED31B2ABC -:10F600002ED92BE0162A29D31B2A29D926E0A2F1CC -:10F610000F01032924D990F83400F8B11C2A1FD90E -:10F620001CE0002B08BF042A18D119E013B1062AE8 -:10F6300016D013E0012A11D112E01D2A1CBF1E2A88 -:10F640001F2A0DD00AE0A2F12000062808D905E003 -:10F6500013B10E2A04D001E0052A01D00020704722 -:10F66000012070472DE9F04187680D460446204689 -:10F67000F3F7CCFB98B1D5B13846A168F3F709FF91 -:10F68000002814DD2844401EB0FBF5F606FB05F10A -:10F690003846F2F7F8FEA0603046BDE8F081F3F797 -:10F6A000E7F94FF4E661F2F7EEFEA060DFE7002035 -:10F6B000BDE8F081904228BF704770B50446101B2A -:10F6C000642838BF642025188D4205D8F3F715FF4C -:10F6D00000281CBF284670BD204670BD53E4B36EA1 -:10F6E00064230200682302008E01002091F851304B -:10F6F0000A8E022B07BF92003C32D200703292B2C7 -:10F700008B8E934238BF1A464B8E91F852C0BCF193 -:10F71000020F07BF9B003C33DB0070339BB2C98EE6 -:10F72000994238BF0B4600280CBF01210021D01898 -:10F730009830002918BF04210844704730B48388EA -:10F74000B0F808C003EB0C049834002A18BF042258 -:10F7500022444C6A944224BF30BC7047121B521C96 -:10F7600052089B1A9BB2ACEB0202838092B20281D8 -:10F7700091F851506FF00E0C6FF00D04022D0CBF7C -:10F780000CEB930304EBD303438091F8521002294E -:10F790000CBF0CEB920104EBD201C18030BC70476E -:10F7A00010F0010F1CBF0120704710F0020F1CBFAA -:10F7B0000220704710F0040018BF082070472DE9A0 -:10F7C000F0410546174688460126084600F001FC30 -:10F7D0000446404600F001FC034610F0010F18BF3C -:10F7E000012008D113F0020F18BF022003D113F03B -:10F7F000040018BF082014F0010F18BF4FF0010CCF -:10F8000021D000BF50EA0C0108BF002613F0030FFF -:10F8100008BF002014F0030F08BF4FF0000C95F84C -:10F820005110814208BF0020387095F85210614590 -:10F8300008BF4FF0000C87F801C0002808BFBCF1DA -:10F84000000F1CD10DE014F0020F18BF4FF0020C96 -:10F85000D8D114F0040F14BF4FF0080C4FF0000C77 -:10F86000D0E7404600F0BFFBB5F85810401A00B290 -:10F8700047F6FE71884201DC002800DC0026304695 -:10F88000BDE8F08101281CBF02280020704718B491 -:10F89000CBB2C1F3072CC1B2C0F30720012B07D0B4 -:10F8A000022B09D0042B08BFBCF1040F23D006E0C3 -:10F8B000BCF1010F03D11EE0BCF1020F1BD00129E6 -:10F8C00006D0022907D0042908BF042813D004E079 -:10F8D000012802D10FE002280DD001EA0C0161F3EA -:10F8E0000702184060F30F22D0B210F0020F18BFC9 -:10F8F00002200BD106E0084003EA0C01084060F347 -:10F900000702EFE710F0010018BF01208DF800009A -:10F91000C2F3072010F0020F18BF022003D110F02D -:10F92000010018BF01208DF80100BDF8000018BCCF -:10F930007047162A10D12A220C2818BF0D280FD084 -:10F940004FF0230C20280DD031B10878012818BFC2 -:10F95000002805D0162805D00020704701207047E8 -:10F960001A70FBE783F800C0F8E70000282102F0D6 -:10F970003AB930B50546007801F00F0220F00F00CB -:10F980001043287007290BD2DFE801F004060406B3 -:10F9900004080400062405E00C2403E0222401E00E -:10F9A0000024FFDF687820F03F002043687030BDFE -:10F9B000007800F00F0070470A68C0F803208988BB -:10F9C000A0F807107047D0F803200A60B0F80700CD -:10F9D000888070470A68C0F809208988A0F80D104F -:10F9E0007047D0F809200A60B0F80D008880704791 -:10F9F0000278202322F0200203EA41111143017012 -:10FA000070470278402322F0400203EA811111433B -:10FA1000017070470078C0F380107047027880232F -:10FA200022F0800203EAC11111430170704700788F -:10FA3000C0097047D0F80320C1F80920B0F80720AA -:10FA4000A1F80D200A7822F080020A70007880095F -:10FA500042EAC0100870704770B515460E4604465D -:10FA60001F2A88BFFFDF2A46314604F1090002F051 -:10FA700043F86078A91D20F03F0001F03F010843E2 -:10FA8000607070BD70B5054640780E4600F03F04CA -:10FA9000062C38BFFFDFA01FC4B21F2C88BF1F2455 -:10FAA000224605F10901304602F026F8204670BDD5 -:10FAB00070B515460E4604461F2A88BFFFDF2A464A -:10FAC000314604F1090002F017F86078A91D20F012 -:10FAD0003F0001F03F010843607070BD70B50546FE -:10FAE00040780E4600F03F04062C38BFFFDFA01F11 -:10FAF000C4B21F2C88BFFFDF224605F10901304642 -:10FB000001F0FAFF204670BD0968C0F80F10704779 -:10FB10000A88A0F813208978417570474176090A50 -:10FB200081767047C176090A017770474177090AE3 -:10FB300081777047C175090A0176704781757047F2 -:10FB400090F8242001F01F0122F01F02114380F8D9 -:10FB500024107047072988BF072190F82420E0234C -:10FB600022F0E00203EA4111114380F824107047AB -:10FB70001F3002F066B94178007801F03F0110F0C3 -:10FB80000F0006D0012808D0022809D006280BD083 -:10FB90000FE0881F1F280AD90BE00C2909D106E0C5 -:10FBA000881F1F2803D904E0881F1F2801D80120BF -:10FBB0007047002070474178007801F03F0100F065 -:10FBC0000F00042805D1062903D325299CBF012055 -:10FBD00070470020704710B4017801F00F0103292D -:10FBE00022D0052925D14478B0F81910B0F81BC0EF -:10FBF000B0F81730827D04F03F04222C19D1062979 -:10FC000017D3B1F5486F98BFBCF5FA7F11D282B116 -:10FC1000082A98BF8A420CD28B429CBFB0F81D00C4 -:10FC2000B0F5486F05D807E0407800F03F000C2899 -:10FC300002D010BC0020704710BC01207047222168 -:10FC400001F0D1BF00B5027801F0030322F00302F6 -:10FC50001A43027000224270012914BF022900BD1C -:10FC6000032912BFFFDF0121417000BD01F0030332 -:10FC700000B5027822F003021A430270002242709B -:10FC8000012914BF022900BD032912BFFFDF012192 -:10FC9000417000BD007800F0030070470278102327 -:10FCA00022F0100203EA01111143017070474178FC -:10FCB000F9B1C078192850D2DFE800F00D10131602 -:10FCC000191C1F2225282B2E31344F4F4F4C373A09 -:10FCD0003D40434649000C2941D042E008293ED02E -:10FCE0003FE002293BD03CE0172938D039E00D290C -:10FCF00035D036E0012932D033E001292FD030E071 -:10FD000002292CD02DE0092929D02AE0092926D062 -:10FD100027E0012923D024E0012920D021E0062971 -:10FD20001DD01EE002291AD01BE0012917D018E0CF -:10FD3000012914D015E0092911D012E009290ED0AB -:10FD40000FE003290BD00CE0032908D009E00529B6 -:10FD500005D006E0032902D003E0FB2901D80120E9 -:10FD600070470020704730B50546C170192924D26C -:10FD7000DFE801F00D0F11131517171119191717D7 -:10FD80001B111921211D171719191D1D1F000C24E6 -:10FD900015E0082413E0022411E017240FE00D24DD -:10FDA0000DE001240BE0092409E0062407E0032408 -:10FDB00005E0052403E0182401E00024FFDF6C7057 -:10FDC00030BDC0787047C171090A01727047B0F840 -:10FDD000070070474172090A81727047B0F8090044 -:10FDE0007047C172090A01737047B0F80B00704781 -:10FDF0004171090A81717047B0F8050070470171BF -:10FE00007047007970474173090A81737047B0F8F1 -:10FE10000D00704730B4B0F80720894DB0F809C024 -:10FE2000B0F805300179941F2D1998BFBCF5FA7F01 -:10FE30000ED269B1082998BF914209D293429FBF5F -:10FE4000B0F80B00B0F5486F012030BC98BF704788 -:10FE5000002030BC7047001D01F0F3BF021D0846B2 -:10FE6000114601F0EEBF4172090A81727047B0F885 -:10FE70000900704701717047007970470A68426055 -:10FE800049688160704742680A60806848607047CE -:10FE90000988818170478089088070470A68C0F8A6 -:10FEA0000E204968C0F812107047D0F80E200A6082 -:10FEB000D0F81200486070470968C0F81610704703 -:10FEC000D0F81600086070470A684260496881608F -:10FED000704742680A608068486070470968C1607E -:10FEE0007047C06808607047017170474171090A26 -:10FEF00081717047C171090A0172704700797047BA -:10FF0000B0F805007047B0F80700704701717047FE -:10FF10000079704701717047007970470A68426044 -:10FF200049688160704742680A608068486070472D -:10FF30000171090A417170478171090AC1717047E5 -:10FF40000172090A417270478172090AC1727047D1 -:10FF500080887047C0887047008970474089704723 -:10FF600001891B2924BF4189B1F5A47F07D381886A -:10FF70001B2921BFC088B0F5A47F01207047002055 -:10FF800070470A68426049688160704742680A6049 -:10FF9000806848607047017170470079704741710F -:10FFA000704740797047017911F0070F1BBF407906 -:10FFB00010F0070F002001207047017911F0070FA2 -:10FFC0001BBF407910F0070F00200120704701711E -:10FFD000704700797047417170474079704781716F -:10FFE000090AC1717047C088704716A282B0D2E971 -:10FFF0000012CDE900120179407901F0070269464B -:020000040002F8 -:100000001DF80220012A07D800F00700085C01282B -:100010009EBF012002B07047002002B070470171FE -:10002000704700797047417170474079704730B52B -:100030000C460546FB2988BFFFDF6C7030BD000011 -:1000400086F3FFFF000101020102020370B50446BE -:10005000C2F11005281901F04FFD15F0FF0108D07D -:10006000491EC9B2802060542046BDE8704001F0AE -:10007000BABD70BD30B505E05B1EDBB2CC5CD55CB3 -:100080006C40C454002BF7D130BD10B5002409E0FA -:100090000B78521E44EA430300F8013B11F8013B80 -:1000A000D2B2DC09002AF3D110BD2DE9F0410C4693 -:1000B00001200978FF4E92B0154602274FF006083E -:1000C0004FF0040C71B101291ED0022945D003293B -:1000D00005D12978042902D105201070002012B022 -:1000E000BDE8F081606850B1CDE9010601202070C3 -:1000F0008DF80080606A05901146684663E02770BD -:1001000085F800C0566026E029780429E7D169689F -:1001100010222069FFF7B9FF6868C07B000606D58A -:10012000E44A2069102310320146FFF7A3FFD4E907 -:1001300004101022FFF7A9FF2069C07B000606D536 -:10014000DC4A6069102310320146FFF793FF2770E5 -:1001500085F800C06E600320C1E729780429BED16C -:10016000A08910280CD9A0F1100080B2A081A1684C -:100170004FF01003014468466A68FFF77BFF18E000 -:1001800004D14FF010032269A16807E0C2B20EA8A3 -:10019000A168FFF75BFF626910230EA90AA8FFF7A9 -:1001A00069FF10230AA968466A68FFF763FF032006 -:1001B000207060680590CDF818D08DF81080606AC6 -:1001C0000990294604A8F1F759FF88E72DE9F04185 -:1001D00007460D4601200B7806213BB1012B04D1C7 -:1001E0001378052B01D11170002079E76C69012685 -:1001F00020226170E8686060686A6062A168287C9B -:100200000870A681A068A968401C01F075FCA0894F -:1002100020222030A081A0686968213001F06CFCA8 -:10022000A08921462030A0812E703846BDE8F041DB -:10023000F1F73BBF2DE9F05F0D46834601200978B9 -:10024000174606464FF00608D1B1DFF868A24FF016 -:100250000009AAF1080A012923D002297ED0032926 -:100260000CD13978052909D179681022E86901F0A3 -:1002700043FC07203870183500207D60BDE8F09FF2 -:100280002C6A8C48202284F8018020306060202075 -:10029000A081686A60626968A06801F02DFC2E7018 -:1002A000D4E039780529E9D12C6A84F80180686A9C -:1002B000606251681022E86901F01EFCE869606024 -:1002C000A0684F4680F80090A681A0684670A0897B -:1002D000401C80B2A081A1680844696951F8012FCF -:1002E000026089888180A089801D80B2A0816969AF -:1002F000A2680978C1F340011154A089401C80B262 -:10030000A081A1680844296951F8012F02608988F9 -:100310008180A089801D80B2A0812969A2680978A6 -:10032000C1F340011154A0891022401C80B2A08169 -:10033000A1680844E96801F0DFFBA08910221030B1 -:1003400080B2A081A1680844A96801F0D5FBA0890A -:10035000103080B2A081A168014400E00DE0DAF81D -:1003600004000860A089001D80B2A081A1680F541C -:10037000A089401CA081022067E03978052992D12C -:1003800051681022A86901F0B7FB2C6A84F801803B -:10039000E8696060686A6062A16881F80090A6817F -:1003A000A0684670A089401C80B2A081A168084462 -:1003B000696951F8012F026089888180A089801DB8 -:1003C00080B2A0816969A2680978C1F34001115423 -:1003D000A089401C80B2A081A1680844296951F815 -:1003E000012F026089888180A089801D80B2A08150 -:1003F0002969A2680978C1F340011154A08910222B -:10040000401C80B2A081A1680844E96801F074FB37 -:10041000A0891022103080B2A081A1680844A96888 -:1004200001F06AFBA089103080B2A081A16801446C -:10043000DAF804000860A089001D80B2A081A168DC -:100440000E54A089401CA0810320287021465846E4 -:10045000BDE8F05FF1F729BE70B50D460646097894 -:10046000012041B1012905D11178052902D10820C7 -:100470001070002070BD2C6A062060706968616091 -:10048000696A6162EA69A16852F8013F0B6092886B -:100490008A80A081E869A1680078C0F34000887173 -:1004A000A089401C80B2A081A1680844A96951F8C4 -:1004B000012F01E074230200026089888180A089F5 -:1004C000801D80B2A081A969A2680978C1F34001AA -:1004D0001154A089401C80B2A081A16808446969B8 -:1004E0000A88028089788170A0891022C01C80B29D -:1004F000A081A1680844296901F0FEFAA0891022B0 -:10050000103080B2A081A1680844E96801F0F4FAD3 -:10051000A0891022103080B2A081A1680844A96887 -:1005200001F0EAFAA08921461030A081012028704C -:100530003046BDE87040F1F7B8BD70B50D460646CF -:100540000978012059B1012908D11178052905D16F -:1005500009201070506800685060002070BD6C6900 -:10056000062010226070E8686060686A606229692D -:10057000A06801F0C1FA1020A081A06820221030EC -:10058000A96801F0B9FAA0892022203080B2A081A8 -:10059000A1680844696801F0AFFAA08921462030BB -:1005A000A081012028703046BDE87040F1F77DBD84 -:1005B00070B50C46012009788EB01546062659B153 -:1005C000012934D0022905D12978042902D10A2031 -:1005D000107000200EB070BD606910236A4600786C -:1005E000C0F340008DF80000A0690078C0F340001F -:1005F0008DF80100E0680168CDF802108188ADF83F -:10060000061080798DF8080020690168CDF809107E -:100610008188ADF80D1080798DF80F006068059025 -:100620000AA80690A168FFF725FD01201DE02978A2 -:100630000429CFD1A06910236A4650F8011F009108 -:100640008088ADF80400606950F8011FCDF80610ED -:100650008088ADF80A0000200390606805900AA821 -:1006600006906968FFF706FD022020708DF8106083 -:10067000606A0990294604A8F1F700FDAAE700B5D1 -:100680000B788BB001204BB1012B05D111780429D7 -:1006900002D10B20107000200BB000BD4868019003 -:1006A00006A80290C86803680693406807908868A7 -:1006B00003680893406809900120087006208DF8AF -:1006C0000000486A059011466846F1F7D7FCE3E759 -:1006D00000B50B788BB0012043B1012BDCD1117830 -:1006E0000429D9D10C2010700020D5E7486801906A -:1006F00006A8029088680368069340680790002067 -:10070000089009900120087006208DF80000486AC2 -:10071000059011466846F1F7B1FCBDE700B50B78CE -:100720008BB0012043B1012BB6D111780429B3D18C -:100730000D2010700020AFE748680590CDF818D064 -:1007400088680088ADF80000C8680088ADF802002D -:1007500000200190029003900120087006208DF87F -:100760001000486A0990114604A8F1F787FC93E746 -:1007700030B403460C7801205CB1012C15D0022C5A -:1007800005D111780C2902D10E201070002030BC48 -:10079000704701200870C868042242704A684260AD -:1007A0000B4A8260921EC2600BE014780D2CEED1D1 -:1007B00002200870C86803244470526842608A6846 -:1007C0008260496A4162014630BC1846F1F76DBC4F -:1007D0006E2302002DE9F0410C4611490D68104AC4 -:1007E000104908321160A0F120012A2901D301200B -:1007F0000CE03E2810D040CC0B4F94E80E0007EBE5 -:100800008000241F50F8807C3046B84720600448A0 -:10081000001D0560BDE8F0812046E0F7E1FCF5E74A -:100820001005024001000001A423020010B5524847 -:1008300000F070FA00B1FFDF4F48401C00F06AFA88 -:10084000002800D0FFDF10BD2DE9F14F4B4ED6F848 -:1008500000B00127484800F065FADFF81C8128B98C -:100860005FF0000708F1010000F072FA444C002527 -:100870004FF0030901206060C4F80051C4F804512E -:10088000009931602060DFF8FCA018E0DAF8000081 -:10089000C00614D50E2000F064F8EFF3108010F0BD -:1008A000010072B600D00120C4F80493D4F80011FE -:1008B00019B9D4F8041101B920BF00B962B6D4F84F -:1008C000000118B9D4F804010028DFD0D4F80401DD -:1008D0000028CFD137B1C6F800B008F1010000F010 -:1008E00021FA11E008F1010000F01CFA0028B9D14A -:1008F000C4F80893C4F80451C4F800510E2000F065 -:1009000030F81D4800F024FA0020BDE8F88F2DE9EA -:10091000F0438DB00D46064600240DF110090DF18F -:10092000200817E004EB4407102255F8271068460A -:1009300001F0E2F805EB870710224846796801F0DC -:10094000DBF86846FFF780FF10224146B86801F0E7 -:10095000D3F8641CB442E5DB0DB00020BDE8F083A1 -:1009600072E700F01F02012191404009800000F170 -:10097000E020C0F8801270478F01002004E500409D -:1009800000E0004010ED00E0D848002101708170C7 -:10099000704770B5D64D01232B60D64B1C68002CD8 -:1009A000FCD0002407E00E6806601E68002EFCD014 -:1009B000001D091D641C9442F5D3002028601868AE -:1009C0000028FCD070BD70B5C84E0446CA4D3078C2 -:1009D000022800D0FFDFAC4200D3FFDF7169C748B7 -:1009E000012903D847F23052944201DD03224271BB -:1009F000491C7161291BC160C0497078F2F782FA05 -:100A0000002800D1FFDF70BD70B5B84C0D4661788D -:100A1000884200D0FFDFB84E082D4ED2DFE805F047 -:100A20004D0421304D4D4D3B2078022800D0FFDF92 -:100A300003202070A078022802D0012804D008E00A -:100A4000A06800F051FD04E004F1080007C8FFF7BA -:100A5000A0FF052020700020A070BDE87040F1F7D5 -:100A600012BFF2F705F801466068F2F712FDB042D6 -:100A700002D2616902290BD30320F2F7E4FF12E0EE -:100A8000F1F7F6FF01466068F2F703FDB042F3D2DA -:100A9000BDE8704097E7207802280AD0052806D0E4 -:100AA000FFDF04202070BDE8704000F014B9022080 -:100AB00000E00320F2F7C7FFF3E7FFDF70BD70B57A -:100AC0000546F1F7D5FF894C60602078012800D0F9 -:100AD000FFDF8A4901200870002008718D60042022 -:100AE00048718548C860022020706078F2F70AFAE1 -:100AF000002800D1FFDF70BD10B57C4CA07808B98C -:100B0000207808B1112010BD7D48F1F737FF6070E3 -:100B10006078202804D0012020700020606110BD82 -:100B2000032010BD0246010B0120B2F5003F02D2A6 -:100B3000884000F071BFB2F5802F03D22039884081 -:100B400000F072BFB2F5C02F03D24039884000F0E8 -:100B500074BFB2F5002F03D26039884000F076BF31 -:100B6000002070472DE9F041144600EB84070E4643 -:100B700005463F1F00F0CBFC4FF080510A695043FF -:100B800006EB8402121FB24201D2012200E00022D1 -:100B90001CB10969B4EB910F02D90920BDE8F081BD -:100BA00058498D4216D3AF4214D3854205D28742AD -:100BB00003D245EA0600800701D01020EEE78E42FE -:100BC00008D33AB92846FFF7ADFF18B93846FFF702 -:100BD000A9FF08B10F20E1E74B484C490068884263 -:100BE00005D0224631462846FFF7D3FE10E0FFF736 -:100BF00083FF0028D2D13D4801218560C0E903640C -:100C000081704FF4A97104FB01F01830FFF757FF12 -:100C10000020C3E770B54FF0805504462869394974 -:100C2000B1FBF0F084420AD300F071FCA04201D87D -:100C3000102070BD28696043FFF774FF08B10F20D2 -:100C400070BD314831490068884204D0286960434A -:100C500000F04AFC0CE0FFF74FFF0028F0D12969B3 -:100C6000224861438160022181702948FFF727FFF4 -:100C7000002070BD2349090BB1EB401F07D940424A -:100C800001EB4011202903D34FF0FF3070470021C2 -:100C900001208840401E704770B505460C46002074 -:100CA000FFF7E8FF28420ED10120FFF7E3FF2042C3 -:100CB00009D10220FFF7DEFF104204D10320FFF725 -:100CC000D9FF184201D00F2070BD21462846BDE84B -:100CD000704000F0C4BE10B5044C6078F1F7A9FE76 -:100CE00000B9FFDF00202070A07010BD940100202B -:100CF00004E5014000E40140105C0C00C412002037 -:100D0000090A020000300200B0000020BEBAFECA8C -:100D10007C5E0100002101700846704701460020FA -:100D200008707047EFF3108101F0010172B602788C -:100D3000012A01D0012200E000220123037001B941 -:100D400062B60AB1002070474FF400507047E9E7DF -:100D5000EFF3108111F0010F72B64FF00002027034 -:100D600000D162B600207047F2E700004C490968E4 -:100D70000160002070474A49086000207047012147 -:100D80008A0720B1012804D042F20400704791671D -:100D900000E0D1670020704742490120086042F21C -:100DA0000600704708B504233E4A1907103230B1D7 -:100DB000C1F80433106840F0010010600BE01068C7 -:100DC00020F001001060C1F808330020C1F80801CC -:100DD000354800680090002008BD011F0B2909D884 -:100DE000304910310A6822F01E0242EA40000860D1 -:100DF0000020704742F205007047000100F180407A -:100E0000C0F8041900207047000100F18040C0F8CC -:100E1000081900207047000100F18040D0F8000957 -:100E2000086000207047012801D9072070471F4A39 -:100E300052F8200002680A4302600020704701282F -:100E400001D907207047194A52F8200002688A43E6 -:100E5000026000207047012801D907207047134A1B -:100E600052F8200000680860002070470200104916 -:100E70004FF0000003D0012A01D0072070470A601C -:100E800070474FF080410020C1F808014FF0E0208A -:100E9000802180F800140121C0F800117047000083 -:100EA0000004004000050040080100404C240200FE -:100EB000780500406249634B0A6863499A420968B1 -:100EC00001D1C1F310010160002070475C495D4B06 -:100ED0000A685D49091D9A4201D1C0F310000860FB -:100EE000002070475649574B0A68574908319A42C3 -:100EF00001D1C0F3100008600020704730B5504B9E -:100F0000504D1C6842F20803AC4202D0142802D2B1 -:100F100003E0112801D3184630BDC3004B481844E4 -:100F2000C0F81015C0F81425002030BD4449454BC9 -:100F30000A6842F209019A4202D0062802D203E06E -:100F4000042801D308467047404A012142F8301076 -:100F5000002070473A493B4B0A6842F209019A4225 -:100F600002D0062802D203E0042801D308467047C5 -:100F7000364A012102EBC00041600020704770B585 -:100F80002F4A304E314C156842F2090304EB8002BF -:100F9000B54204D0062804D2C2F8001807E004289D -:100FA00001D3184670BDC1F31000C2F8000800203C -:100FB00070BD70B5224A234E244C156842F20903D5 -:100FC00004EB8002B54204D0062804D2D2F800080F -:100FD00007E0042801D3184670BDD2F80008C0F31A -:100FE00010000860002070BD174910B5083118487E -:100FF00008601120154A002102EBC003C3F8101548 -:10100000C3F81415401C1428F6D3002006E0042869 -:1010100004D302EB8003C3F8001807E002EB80035F -:10102000D3F80048C4F31004C3F80048401C062855 -:10103000EDD310BD04490648083108607047000030 -:10104000B0000020BEBAFECA00F5014000F0014029 -:101050000000FEFF7D4B1B6803B19847BFF34F8F25 -:101060007B4801687B4A01F4E06111430160BFF3F2 -:101070004F8FFEE710B5EFF3108010F0010F72B63E -:1010800001D0012400E0002400F0D6F850B1E0F7D0 -:1010900041F9F1F7BCFAF2F777FCE1F7C0FE6E49CF -:1010A0000020086004B962B6002010BD70B50C467F -:1010B0000646EFF3108010F0010F72B601D0012543 -:1010C00000E0002500F0B8F818B105B962B60820B4 -:1010D00070BDE0F79BF8E0F71FF9024600204309D6 -:1010E0009B0003F1E02300F01F01D3F80031CB4057 -:1010F000D9071BD0202803D222FA00F1C90722D138 -:1011000041B2002906DA01F00F0101F1E02191F866 -:10111000141D03E001F1E02191F8001449090829A8 -:1011200011D281B101290ED004290CD0401C6428B1 -:10113000D5D3E1F74BFE4849484808602046F3F70D -:101140008FF860B904E005B962B641F2010070BDE4 -:101150003E4804602EB13046F3F7CFF818B11024A2 -:1011600029E03F4E16E03078022802D94FF480542F -:1011700021E007240028707801D0E0B908E0D0B160 -:10118000202818D8B078212815D8012813D001E0DC -:10119000B07880B93349802081F8140DE0F7BCF8AD -:1011A0003146F2F7D7FBF1F7F1F900F0E3F93046F9 -:1011B000E0F782F8044605B962B61CB1FFF75AFFA2 -:1011C000204670BD002070BD10B5044600F034F814 -:1011D00000B101202070002010BD234908600020CC -:1011E000704770B50C4621490D682049204E0831E2 -:1011F0000E60102807D011280CD012280FD0132809 -:1012000011D0012013E0D4E90001FFF74FFF35466C -:1012100020600DE0FFF72EFF0025206008E0206829 -:10122000FFF7D2FF03E0104920680860002020602B -:101230000E48001D056070BD0748084900688842D7 -:1012400001D101207047002070470000AC01002050 -:101250000CED00E00400FA05B0000020BEBAFECAA2 -:10126000542402000BE000E00400002010050240BE -:101270000100000100B5764910F1080F08BFF82001 -:1012800024D014DC10F1280F08BFD8201ED010F194 -:10129000140F08BFEC2019D010F1100F08BFF02078 -:1012A00014D010F10C0F08BFF4200FD00CE010F197 -:1012B000040F08BFFC2009D0002818BF032805D060 -:1012C000042804BF086000BDFFDF00BD086000BD4A -:1012D00000B56049012808BF032004D0022816BFCA -:1012E000FFDF042000BD086000BD5A48016801F01E -:1012F0000F01032904BF01207047006800F00F00B0 -:10130000042804BF0220704700B5FFDF012000BDA4 -:101310005149002808BF086805D0012806BF0868A1 -:1013200040F0010070470860704770B5054601291C -:1013300014D0022A07BF49484FF47A7148484FF445 -:10134000C86144181846F4F759F820444FF47A71EC -:1013500000F27120B0FBF1F0281A70BD022A14BF10 -:101360004FF4C8604FF47A7049F608514418E9E721 -:1013700070B514460546012908BF49F6CA6605D06E -:10138000022B0CBF3748364800F1FA061046F4F736 -:1013900044F8012C0CBF4FF47A714FF4FA71711AB2 -:1013A00008444FF47A7100F28920B0FBF1F0281A5A -:1013B000801E70BD70B51546064601291AD0022B55 -:1013C00007BF26484FF47A7125484FF4C861441886 -:1013D0001046F4F722F8012D0CBF4FF47A714FF448 -:1013E000FA71611A08444FF47A716438B0FBF1F075 -:1013F000301A70BD022B14BF4FF4C8604FF47A70DE -:1014000049F608514418E3E770B505460C46164600 -:101410001046F3F7F3FF05EB4501C1EBC51100EBF7 -:10142000C100012C0CBF4FF47A714FF4FA714518CA -:101430002046F3F7F2FF281A4FF47A7100F60F6096 -:10144000B0FBF1F43046F3F7CDFF2044401D70BDF2 -:101450000C15004010150040501600406836020080 -:10146000A2240200043602002DE9F04184B088462F -:101470000746FEF70FFC05467E786A4601A94046FE -:10148000EFF748F804000ED0012D1EBF032004B072 -:10149000BDE8F08102AA40460199EEF73AFF0298B2 -:1014A000B0F803000AE0022D18D1042E16D3B7F8C5 -:1014B0000300BDF80020011D8A4206D3001D80B242 -:1014C000A119814238BF012004D104B04FF00000BF -:1014D000BDE8F0813CBF04B0BDE8F0814FF00200F0 -:1014E00004B0BDE8F08100000B4A022111600B49F5 -:1014F0000B68002BFCD0084B1B1D186008680028E7 -:10150000FCD00020106008680028FCD070474FF025 -:10151000805040697047000004E5014000E401404C -:1015200002000B464FF00000014620D0012A04D0F3 -:10153000022A04D0032A0DD103E0012002E0022098 -:1015400015E00320072B05D2DFE803F00406080AA4 -:101550000C0E100007207047012108E0022106E070 -:10156000032104E0042102E0052100E00621F1F757 -:1015700022BA0000FC4805218170002101704170F1 -:10158000C17081607047F9490A78012A06D0CA689B -:101590001044C860C8684038F1F748BF8A681044F2 -:1015A00088608868F7E710B5EF4CE078F1F741FA0A -:1015B00000B9FFDF0820F2F746FA0520A0700020EE -:1015C0002070607010BD002819D00378E849E94AFE -:1015D00013B1012B0ED011E00379012B00D06BB9B0 -:1015E00043790BB1012B09D18368643B8B4205D24F -:1015F000C0680EE00379012B02D00BB100207047C8 -:1016000043790BB1012BF9D1C368643B8B42F5D20E -:1016100080689042F2D8012070472DE9F0410446DD -:101620000227F1F72FFE006800B1FFDFCE4D012643 -:101630003CB12078B0B1012805D0022810D0032891 -:1016400013D02E710CE06068C82807D3F1F755FF5E -:1016500020B16068FFF797FF012703E0002701E052 -:1016600000F0CCF93846BDE8F08128780028F7D1A1 -:101670006068FFF7A8FF0028E3D06068DFF8EC821D -:10168000007828B3A878042800D0FFDF0020464661 -:1016900088F8000060680079C8B300203071606885 -:1016A0004079A8B30420707160688168E868F0F739 -:1016B000EAFEB0606068C0685230F0600320A87035 -:1016C000AA49E878F1F71EFC0028C9D1FFDFC7E777 -:1016D000404688F8006061680979D1B10021017144 -:1016E00061684979B9B104214171616889685231F1 -:1016F00081606168C968C160C0689B4C14346060D7 -:10170000F1F7B6F920606E700220A870A8E704E037 -:1017100005E00321E3E70321E6E70120BEE703201C -:10172000C1E72DE9F047904C8846E178884200D027 -:10173000FFDFDFF83492002501278C4E09F11409F0 -:10174000B8F1080F79D2DFE808F0040D2A557E843D -:101750009199A078032803D0A078022800D0FFDF59 -:10176000BDE8F087A078032803D0A078022800D035 -:10177000FFDF0420A0702571207800287AD1FFF7C0 -:1017800002FF3078012806D0B068E06000F07BF9F5 -:101790002061002062E0E078F1F7B0FAF5E7A07888 -:1017A000032803D0A078022800D0FFDF207800288B -:1017B0006FD1A078032816D0F1F75AF901464F46A9 -:1017C000D9F80000F1F765FE00280EDB7968814248 -:1017D0000BDB081AF0606549E078F1F793FB00280D -:1017E000BED1FFDFBCE7042029E00420F2F72BF98B -:1017F000A570B5E7A078032803D0A078022800D010 -:10180000FFDF207888BBA078032817D0F1F730F9E4 -:1018100001464F46D9F80000F1F73BFE0028E4DB13 -:1018200079688142E1DB081AF0605049E078F1F70D -:1018300069FB002894D1FFDF92E740E00520F2F732 -:1018400002F9A7708CE7A078042800D0FFDF0220FF -:1018500004E0A078042800D0FFDF0120A1688847B9 -:10186000FFF7DBFE054630E004E012E0A078042834 -:1018700000D0FFDFBDE8F04700F0C0B8A078042832 -:1018800005D0607810B1A078022800D0FFDF207862 -:1018900010B1BDE8F04786E6207920B10620F2F7C6 -:1018A000D2F82571CDE7607838B13049E078F1F7AA -:1018B00029FB00B9FFDF657052E70720BFE7FFDFB4 -:1018C0004EE73DB1012D03D0FFDF022DF9D147E7EF -:1018D0000420C3E70320C1E770B5050005D0224C02 -:1018E000A078052803D0112070BD102070BD2248BB -:1018F000F1F744F8E070E078202803D0A5600020DC -:10190000A07070BD032070BD174810B5017809B1F3 -:10191000112010BD817805290CD0817801290BD0C8 -:10192000817849B1012101708178012904D0807842 -:1019300010B103E00F2010BDFFF735FE002010BDF1 -:1019400070B5094E0446B07808B101280AD1ACB18F -:101950002046FFF738FE98B12078044D90B1B0785A -:1019600001282AD00F2070BDB0010020D412002021 -:101970003D860100FF1FA107231702001020F2E798 -:101980000720F0E701202870207990B1002028710D -:10199000607980B104206871A0685230A860E06866 -:1019A000E860E8681A4C6060F1F762F82060022095 -:1019B00016E00320EBE70320EDE7002028702079F4 -:1019C000A8B100202871607998B104206871A168DD -:1019D000F068F0F758FDA860E0685230E860032036 -:1019E000B0700C49F078F1F78DFA28B903E00320C4 -:1019F000E8E70320EAE7FFDF0020B4E7044810B57A -:101A00001438006900F037F8BDE81040F0F73BBF2C -:101A1000C4010020D41200201F490968014201D0EE -:101A200001207047002070471B49091D09680142C9 -:101A300001D0012070470020704717491031096814 -:101A4000014201D001207047002070471249143133 -:101A50000968014201D0012070470020704710B58D -:101A60000D4C2060201D01600B4810300260001DED -:101A70000360002010BD09490A6848F202139A4326 -:101A800002430A607047054A116848F2021301EAEE -:101A9000030099431160704700060040C8060240E9 -:101AA00040EA010310B59B070FD1042A0DD310C8DB -:101AB00008C9121F9C42F8D020BA19BA884201D92D -:101AC000012010BD4FF0FF3010BD1AB1D30703D075 -:101AD000521C07E0002010BD10F8013B11F8014B2B -:101AE0001B1B07D110F8013B11F8014B1B1B01D147 -:101AF000921EF1D1184610BD032A40F2308010F03A -:101B0000030C00F0158011F8013BBCF1020F624498 -:101B100098BF11F801CB00F8013B38BF11F8013B29 -:101B2000A2F1040298BF00F801CB38BF00F8013BD6 -:101B300011F0030300F02580083AC0F0088051F846 -:101B4000043B083A51F804CBA0E80810F5E7121D51 -:101B50005CBF51F8043B40F8043BAFF30080D20770 -:101B600024BF11F8013B11F801CB48BF11F8012B3C -:101B700024BF00F8013B00F801CB48BF00F8012B5F -:101B8000704710B5203AC0F00B80B1E81850203AE9 -:101B9000A0E81850B1E81850A0E81850BFF4F5AF0D -:101BA0005FEA027C24BFB1E81850A0E8185044BF97 -:101BB00018C918C0BDE810405FEA827C24BF51F804 -:101BC000043B40F8043B08BF7047D20728BF31F8F8 -:101BD000023B48BF11F8012B28BF20F8023B48BF49 -:101BE00000F8012B70474FF000020429C0F012806A -:101BF00010F0030C00F01B80CCF1040CBCF1020FC0 -:101C000018BF00F8012BA8BF20F8022BA1EB0C0194 -:101C100000F00DB85FEAC17C24BF00F8012B00F88A -:101C2000012B48BF00F8012B70474FF0000200B5B0 -:101C3000134694469646203922BFA0E80C50A0E8EF -:101C40000C50B1F12001BFF4F7AF090728BFA0E89D -:101C50000C5048BF0CC05DF804EB890028BF40F869 -:101C6000042B08BF704748BF20F8022B11F0804FAB -:101C700018BF00F8012B704770477047704700008D -:101C8000FEDF04207146084219D10699124A91429A -:101C900015DC069902394878DF2810D10878FE282B -:101CA00007D0FF280BD14FF001004FF000020B4B83 -:101CB000184741F201000099019A084B1847084B58 -:101CC000002B02D01B68DB6818474FF0FF307146CD -:101CD0004FF00002014B184700300200551002007F -:101CE00004000020184819497047FFF7FBFFDFF791 -:101CF00065FA00BD4FF4805015490968884203D148 -:101D0000144A13605B68184700BD000020BFFDE760 -:101D10004FF480500E490968884210D10E4B186864 -:101D20004FF0FF318842F1D080F308884FF0202136 -:101D3000884204DD0948026802210A43026008481B -:101D4000804708488047FFDFE8120020E8120020A3 -:101D500000000020040000200030020024050040A4 -:101D600039430100F51C020004207146084202D0EC -:101D7000EFF3098101E0EFF3088188690238007808 -:101D8000102813DB20280FDB2B280BDB0A4A1268F4 -:101D90000A4B9A4203D1602804DB094A104702200B -:101DA00008607047074A1047074A1047074A1268F9 -:101DB0002C32126810470000B0000020BEBAFECAE4 -:101DC0001D130000D5070200E311020004000020EB -:101DD0000D4B0E4908470E4B0C4908470D4B0B495C -:101DE00008470D4B094908470C4B084908470C4B5D -:101DF000064908470B4B054908470B4B0349084761 -:101E00000A4B024908470000F9BA0000092F0000F8 -:101E1000812C00001D2B0000AB2A0000232D0000A8 -:101E2000391300006728000029BD0000C911000017 -:101E300000210160818070470021016041600172D2 -:101E400070470A6802600B7903717047599500006A -:101E50001B970000779800009B980000D598000021 -:101E6000099900004399000081990000D39900006E -:101E700031960000A7120000A7120000C140000028 -:101E80000541000025410000E1410000274300001A -:101E90000144000031440000F5440000153D0000FD -:101EA000274700001948000039480000DD150000F0 -:101EB00001160000311500008515000033160000E2 -:101EC000C716000003600000B561000073650000E4 -:101ED000896600000D67000087670000F967000051 -:101EE00015690000E3690000616A000053480000C2 -:101EF0005948000063480000D73C00001F4900001B -:101F0000A13C00005F4A0000B74A00001F4B0000E0 -:101F1000A7120000A7120000A7120000A7240000CB -:101F20002D2500004925000065250000F32600004E -:101F30008F25000099250000DB250000FD2500000D -:101F4000D92600001B270000A7120000CF82000046 -:101F5000F7820000F98200003383000061830000F3 -:101F60004F840000DB840000EF8400003D8500000A -:101F70002D860000D1870000F9880000D172000092 -:101F800011890000A7120000A712000049B4000048 -:101F9000B3B5000007B6000073B6000023B7000019 -:101FA00051000000000000000000000000000000E0 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000003E000000D3 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF0000000000000000000500000000000000091 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000100110013A0200001A02000432 -:102030000506000013900000F38F0000FFFFFFFF74 -:102040000000FFFF3BAC00003D39000041200000D4 -:102050001B730000EB8D0000000000000000020078 -:10206000000000000002000000000000000100006D -:10207000000000006F8000004F800000BD80000065 -:1020800029240000EB2300000B240000A7A7000078 -:10209000D3A70000DBA9000021590000DD8000006B -:1020A000000000000D810000772400000000000007 -:1020B0000000000000000000BDA8000000000000BB -:1020C000B359000000000000000000000000000004 -:1020D0000000000000000000000000000000000000 -:1020E000000000000000000000000000D5E5000036 -:1020F00059E60000000000000000000000000000A1 -:1021000059E700000000000000000000000000008F -:1021100049F800000000000000000000000000007E -:1021200005E900005DF4000000000000DDF400009F -:1021300051F500000000000037EE0000D5EE000071 -:102140000000000017F50000D1EF0000C9F1000009 -:102150003DF2000041F30000A5EA0000000000008D -:1021600000000000BFE90000000000001FE80000C0 -:1021700095E70000BDF300007BF60000E9F60000E3 -:1021800000000000A7E60000D7E6000007E6000018 -:102190000000000021E70000000000000000000037 -:1021A000000000004BF700000000000000000000ED -:1021B000000000000000000000000000EFEC000044 -:1021C000000000000000000000000000C3E8000064 -:1021D000C1E700008BE800000000000053E80000A9 -:1021E0000000000000000000B3F7000097F80000B6 -:1021F0009BFA000017F900003DE9000051FA0000C9 -:10220000000000004FEB000021EC000061F900002D -:10221000ABF9000007F80000E5F90000F1ED00005F -:1022200093560000935600009D400000E7AA00006E -:102230009F750000531F000087AA01004BC50100D5 -:10224000D9560000D9560000BF40000049AB00003D -:1022500023760000C51F0000B5AA01005FC501007C -:10226000D001D001400038005C0024004001F001A2 -:1022700001000000010000000001020304120F1021 -:102280001100000013000000B10502007F060200EB -:10229000D10602001D07020071070200AB00020018 -:1022A000CD01020035020200590402003B05020084 -:1022B000750D01008B1E01000000000006000000EB -:1022C0000A0000003200000073000000B4000000AB -:1022D000B197010045850100235F010077DE010011 -:1022E000F772010077DE01007D5F010005E001006B -:1022F000876B010005E001007B5E010093DF0100B8 -:10230000C971010093DF01004D630100FFE201008C -:102310007F730100FFE20100555555D6BE898E003E -:102320000000A606340DC21300004A03EE05920811 -:10233000000096041409920D555555252627D6BE42 -:10234000898EF401FA00960064004B0032001E00F2 -:1023500014000A00050002000100000025410000F1 -:1023600000000000AAAED7AB15412010000003000A -:10237000656C7462000000000000000000000000B6 -:1023800000000000870000000000000000000000C6 -:1023900000000000BE83605ADB0B376038A5F5AA49 -:1023A0009183886CB50E0200CD0E0200E50E02008E -:1023B000FD0E02002D0F0200550F02007F0F0200DC -:1023C000B30F0200150C0200650B0200990C02000D -:1023D000150D0200250D0200510D0200A33B010066 -:1023E000AB3B0100B93B01007F0D0200990D0200DB -:1023F0006D0D0200770D0200A50D0200DB0D02003D -:10240000FB0D0200090E0200170E0200270E02004B -:102410003F0E0200570E02006D0E02000000000089 -:10242000F7B800004DB9000063B9000021150200A3 -:10243000490802000F090200D91802000919020018 -:1024400041190200E93901000D3E01001C05004060 -:10245000200500400010020078240200080000203F -:10246000C401000044110000A8240200CC01002097 -:102470001C110000A01100000118136813024C2069 -:102480001A010222782720FB349B5F801280021EF3 -:1024900010139F0A1B205C041AE2040128237F0109 -:0824A00002A329091DFB013113 -:00000001FF diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/doc/s132_nrf51822_5.0.0_release-notes.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/doc/s132_nrf51822_5.0.0_release-notes.pdf deleted file mode 100644 index 0cff6f8c31..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/doc/s132_nrf51822_5.0.0_release-notes.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/doc/s132_nrf52_5.0.0_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/doc/s132_nrf52_5.0.0_licence-agreement.txt deleted file mode 100644 index 00c2e54c47..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/doc/s132_nrf52_5.0.0_licence-agreement.txt +++ /dev/null @@ -1,35 +0,0 @@ -Copyright (c) 2007 - 2017, Nordic Semiconductor ASA -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form, except as embedded into a Nordic - Semiconductor ASA integrated circuit in a product or a software update for - such product, must reproduce the above copyright notice, this list of - conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - -3. Neither the name of Nordic Semiconductor ASA nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -4. This software, with or without modification, must only be used with a - Nordic Semiconductor ASA integrated circuit. - -5. Any software provided in binary form under this license must not be reverse - engineered, decompiled, modified and/or disassembled. - -THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS -OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/doc/s132_nrf52_5.0.0_migration-document.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/doc/s132_nrf52_5.0.0_migration-document.pdf deleted file mode 100644 index afd9ec7f41..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/doc/s132_nrf52_5.0.0_migration-document.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/hex/s132_nrf52_5.0.0_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/hex/s132_nrf52_5.0.0_licence-agreement.txt deleted file mode 100644 index 00c2e54c47..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/hex/s132_nrf52_5.0.0_licence-agreement.txt +++ /dev/null @@ -1,35 +0,0 @@ -Copyright (c) 2007 - 2017, Nordic Semiconductor ASA -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form, except as embedded into a Nordic - Semiconductor ASA integrated circuit in a product or a software update for - such product, must reproduce the above copyright notice, this list of - conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - -3. Neither the name of Nordic Semiconductor ASA nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -4. This software, with or without modification, must only be used with a - Nordic Semiconductor ASA integrated circuit. - -5. Any software provided in binary form under this license must not be reverse - engineered, decompiled, modified and/or disassembled. - -THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS -OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/hex/s132_nrf52_5.0.0_mbr.hex b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/hex/s132_nrf52_5.0.0_mbr.hex deleted file mode 100644 index 99c8a2082e..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/hex/s132_nrf52_5.0.0_mbr.hex +++ /dev/null @@ -1,77 +0,0 @@ -:2000000000040020E90800007D050000C908000087050000910500009B05000000000000B6 -:200020000000000000000000000000000D090000A505000000000000AF050000B90500008E -:20004000C3050000CD050000D7050000E1050000EB050000F5050000FF0500000906000047 -:20006000130600001D06000027060000310600003B060000450600004F06000059060000A0 -:20008000630600006D06000077060000810600008B060000950600009F060000A906000000 -:2000A000B3060000BD060000C7060000D1060000DB060000E5060000EF060000F906000060 -:2000C000030700000D07000017070000210700002B070000350700003F07000049070000B8 -:2000E000530700005D07000067070000710700007B070000850700008F0700009907000018 -:20010000A30700001FB500F003F88DE80F001FBD00F0E0BB1FB56FF00100009040100390E4 -:20012000029001904FF010208069000B420900F01F045DF822300120A04083434DF82230D6 -:20014000684600F045F91FBDF0B54FF6FF734FF4B4751A466E1E11E0A94201D3344600E029 -:200160000C46091B30F8027B641E3B441A44F9D19CB204EB134394B204EB12420029EBD13A -:2001800098B200EB134002EB124140EA0140F0BDDE4992B00446D1E90001CDE91001FF2229 -:2001A0004021684600F03CFB94E80F008DE80F00684610A902E004C841F8042D8842FAD1E6 -:2001C00010216846FFF7C0FF1090AA208DF84400FFF7A0FF00F0F3F84FF01024A06910223A -:2001E0006946803000F002F9A069082210A900F0FDF800F0D8F84FF080510A694969006887 -:200200004A43824201D8102070470020704710B5D0E900214FF0805002EB810302694469BF -:200220006243934209D84FF01022536903EB81030169406941438B4201D9092010BD5069D7 -:20024000401C01D0002010BD0F2010BD70B501680446AF4D4FF01020072952D2DFE801F039 -:20026000330419293C1E2500D4E9026564682946304600F0CDF82A462146304600F0B6F811 -:20028000AA002146304600F09FFA002800D0032070BD00F051FB4FF4805007E0201DFFF79D -:2002A000AAFF0028F4D100F047FB60682860002070BD241D94E80700920000F085FA0028EC -:2002C000F6D00E2070BD8069401C12D0201DFFF79EFF0028F6D109E08069401C09D0201DD3 -:2002E000FFF789FF0028EDD1606820B12046FFF74FFF042070BDFFF70DFF00F060F800F0CC -:2003000052F8072070BD10B50C46182802D00120086010BD2068FFF799FF206010BD4FF01E -:200320001024A069401C05D0A569A66980353079AA2808D06069401C2DD060690068401C7B -:2003400029D060692CE010212846FFF7FDFE316881421CD1A16901F18002C03105E030B1C1 -:2003600008CA51F8040D984201D1012000E000208A42F4D158B1286810B1042803D0FEE7B5 -:20038000284600F057F862496868086008E000F016F800F008F84FF480500168491C01D045 -:2003A00000F0A4FAFEE7BFF34F8F5A4801685A4A01F4E06111430160BFF34F8FFEE74FF0EC -:2003C00010208169491C02D0806900F0AEB87047524A01681160121D416811604F4A816895 -:2003E00010321160111DC068086070472DE9F04117460D460646002406E03046296800F091 -:20040000A7F8641C2D1D361DBC42F6D3BDE8F08170B50C4605464FF4806608E0284600F012 -:2004200084F8B44205D3A4F5806405F58055002CF4D170BD4168044609B1012500E0002530 -:200440004FF010267069A268920000F0BDF9C8B1204600F01AF89DB17669A56864684FF4E2 -:20046000002084420AD2854208D229463046FFF7CFFF2A4621463046FFF7B8FFFFF79FFFE2 -:20048000FFF791FFFFF746FEF8E72DE9FF414FF01024616980680D0B01EB800000F6FF7059 -:2004A000010B002000900190029002460390684601230BE0560902F01F0C50F8267003FA6E -:2004C0000CFC47EA0C0740F82670521CAA42F1D30AE04A0901F01F0650F8225003FA06F6DE -:2004E000354340F82250491C8029F2D3A169090B4A0901F01F0150F822408B409C4340F8F9 -:200500002240FFF765FFBDE8FF8100005C090000000000200CED00E00400FA050006004053 -:20052000144801680029FCD07047134A0221116010490B68002BFCD00F4B1B1D186008681C -:200540000028FCD00020106008680028FCD07047094B10B501221A60064A1468002CFCD082 -:20056000016010680028FCD00020186010680028FCD010BD00E4014004E5014008208F498E -:2005800009680958084710208C4909680958084714208A4909680958084718208749096873 -:2005A0000958084730208549096809580847382082490968095808473C2080490968095811 -:2005C000084740207D4909680958084744207B4909680958084748207849096809580847F2 -:2005E0004C207649096809580847502073490968095808475420714909680958084758209B -:200600006E490968095808475C206C49096809580847602069490968095808476420674929 -:20062000096809580847682064490968095808476C20624909680958084770205F49096842 -:200640000958084774205D4909680958084778205A490968095808477C2058490968095824 -:20066000084780205549096809580847842053490968095808478820504909680958084709 -:200680008C204E4909680958084790204B4909680958084794204949096809580847982072 -:2006A00046490968095808479C204449096809580847A0204149096809580847A4203F4969 -:2006C000096809580847A8203C49096809580847AC203A49096809580847B020374909685A -:2006E00009580847B4203549096809580847B8203249096809580847BC203049096809583C -:200700000847C0202D49096809580847C4202B49096809580847C820284909680958084720 -:20072000CC202649096809580847D0202349096809580847D4202149096809580847D82049 -:200740001E49096809580847DC201C49096809580847E0201949096809580847E4201749A8 -:20076000096809580847E8201449096809580847EC201249096809580847F0200F49096871 -:2007800009580847F4200D49096809580847F8200A49096809580847FC2008490968095853 -:2007A00008475FF480700549096809580847000003480449024A034B70470000000000202F -:2007C000680900006809000040EA010310B59B070FD1042A0DD310C808C9121F9C42F8D034 -:2007E00020BA19BA884201D9012010BD4FF0FF3010BD1AB1D30703D0521C07E0002010BDC5 -:2008000010F8013B11F8014B1B1B07D110F8013B11F8014B1B1B01D1921EF1D1184610BDF3 -:2008200002F0FF0343EA032242EA024200F005B87047704770474FF000020429C0F0128080 -:2008400010F0030C00F01B80CCF1040CBCF1020F18BF00F8012BA8BF20F8022BA1EB0C0133 -:2008600000F00DB85FEAC17C24BF00F8012B00F8012B48BF00F8012B70474FF0000200B53A -:20088000134694469646203922BFA0E80C50A0E80C50B1F12001BFF4F7AF090728BFA0E8AC -:2008A0000C5048BF0CC05DF804EB890028BF40F8042B08BF704748BF20F8022B11F0804F54 -:2008C00018BF00F8012B7047014B1B68DB6818470000002009480A497047FFF7FBFFFFF794 -:2008E00011FC00BD20BFFDE7064B1847064A1060016881F30888406800470000680900002E -:20090000680900001F030000000000201EF0040F0CBFEFF30881EFF30981886902380078BE -:20092000182803D100E00000074A1047074A12682C3212681047000000B5054B1B68054A4A -:200940009B58984700BD000007030000000000205809000004000000001000000000000069 -:0809600000FFFFFF0090D0032F -:00000001FF diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf51822_5.0.0_release-notes.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf51822_5.0.0_release-notes.pdf deleted file mode 100644 index 0cff6f8c31..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf51822_5.0.0_release-notes.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf52_5.0.0_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf52_5.0.0_licence-agreement.txt deleted file mode 100644 index 00c2e54c47..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf52_5.0.0_licence-agreement.txt +++ /dev/null @@ -1,35 +0,0 @@ -Copyright (c) 2007 - 2017, Nordic Semiconductor ASA -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form, except as embedded into a Nordic - Semiconductor ASA integrated circuit in a product or a software update for - such product, must reproduce the above copyright notice, this list of - conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - -3. Neither the name of Nordic Semiconductor ASA nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -4. This software, with or without modification, must only be used with a - Nordic Semiconductor ASA integrated circuit. - -5. Any software provided in binary form under this license must not be reverse - engineered, decompiled, modified and/or disassembled. - -THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS -OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf52_5.0.0_migration-document.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf52_5.0.0_migration-document.pdf deleted file mode 100644 index afd9ec7f41..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf52_5.0.0_migration-document.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/hex/s132_nrf52_5.0.0_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/hex/s132_nrf52_5.0.0_licence-agreement.txt deleted file mode 100644 index 00c2e54c47..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/hex/s132_nrf52_5.0.0_licence-agreement.txt +++ /dev/null @@ -1,35 +0,0 @@ -Copyright (c) 2007 - 2017, Nordic Semiconductor ASA -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form, except as embedded into a Nordic - Semiconductor ASA integrated circuit in a product or a software update for - such product, must reproduce the above copyright notice, this list of - conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - -3. Neither the name of Nordic Semiconductor ASA nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -4. This software, with or without modification, must only be used with a - Nordic Semiconductor ASA integrated circuit. - -5. Any software provided in binary form under this license must not be reverse - engineered, decompiled, modified and/or disassembled. - -THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS -OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/hex/s132_nrf52_5.0.0_softdevice.hex b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/hex/s132_nrf52_5.0.0_softdevice.hex deleted file mode 100644 index c52575693d..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/hex/s132_nrf52_5.0.0_softdevice.hex +++ /dev/null @@ -1,4265 +0,0 @@ -:20100000E8120020111D0200152F0000831C0200152F0000152F0000152F000000000000D5 -:20102000000000000000000000000000691D0200152F000000000000152F0000152F00005C -:20104000D11D0200D71D0200152F0000152F0000152F0000152F0000152F0000152F000012 -:20106000DD1D0200152F0000152F0000E31D0200152F0000E91D0200EF1D0200F51D02007C -:20108000152F0000152F0000152F0000152F0000152F0000152F0000152F0000152F000030 -:2010A000152F0000FB1D0200152F0000152F0000152F0000152F0000152F0000152F00003A -:2010C000011E0200152F0000152F0000152F0000152F0000152F0000152F0000152F000013 -:2010E000152F0000152F0000152F0000152F0000152F0000152F0000152F0000152F0000D0 -:20110000152F0000152F000000F002F820F0EDFD0AA090E8000C82448344AAF10107DA45E6 -:2011200001D120F0E2FDAFF2090EBAE80F0013F0010F18BFFB1A43F0010318471C130200BF -:201140003C1302000A444FF0000C10F8013B13F0070408BF10F8014B1D1108BF10F8015BDF -:20116000641E05D010F8016B641E01F8016BF9D113F0080F1EBF10F8014BAD1C0C1B09D1DE -:201180006D1E58BF01F801CBFAD505E014F8016B01F8016B6D1EF9D59142D6D370470000CB -:2011A0000023002400250026103A28BF78C1FBD8520728BF30C148BF0B6070471FB500F042 -:2011C0003DF88DE80F001FBD1EF0040F0CBFEFF30880EFF30980014A104700006F2E00007A -:2011E0008269034981614FF00100104470470000F511000001B41EB400B512F0AFFD01B4E6 -:201200000198864601BC01B01EBD0000F0B44046494652465B460FB402A0013001B5064894 -:20122000004700BF01BC86460FBC8046894692469B46F0BC704700000911000020F052BD6A -:2012400070B51A4C054609202070A01C00F05FF85920A08029462046BDE8704007F0F1BF92 -:2012600007F0FABF70B50C461149097829B1A0F16001552908D3012013E0602804D0692846 -:2012800002D043F201000CE020CC0A4E94E80E0006EB8000A0F58050241FD0F8806E28464F -:2012A000B047206070BD012070470000080000201C0000204C1E020010B504460021012091 -:2012C00000F03BF800210B2000F037F80421192000F033F804210D2000F02FF804210E204B -:2012E00000F02BF804210F2000F027F80421C84300F023F80621162000F01FF8062115207D -:2013000000F01BF82046FFF79BFF002010BD9D2101807047FFF7A4BF10487047104A10B56A -:2013200014680F4B0F4A08331A60FFF79BFF0C48001D046010BD704770474907090E00289A -:2013400006DA00F00F0000F1E02080F8141D704700F1E02080F800147047000003F90042EB -:201360001005024001000001FE48002101604160018170472DE9F743044692B09146406817 -:2013800012F0B2FF40B1606812F0B7FF20B9607800F00300022801D0012000E00020F14E2A -:2013A0004D463072484612F05BFF18B1102015B0BDE8F0832946012001F029FF0028F6D1A0 -:2013C00001258DF842504FF4C050ADF84000002210A9284606F0FAFB0028E8D18DF842506C -:2013E0004FF428504FF00008ADF8400047461C216846CDF81C8020F018FC9DF81C0008AAA6 -:2014000020F00F00401C20F0F00010308DF81C0020788DF81D0061789DF81E0061F3420014 -:2014200040F001008DF81E009DF800000AA940F002008DF800002089ADF83000ADF8327014 -:20144000608907AFADF834000B97606810AC0E900A94684606F0AFF90028A8D1BDF82000F0 -:2014600030808DF8425042F60120ADF840009DF81E0008AA20F00600801C20F001008DF8BA -:201480001E000220ADF83000ADF8340013A80E900AA9684606F08FF9002888D1BDF82000D0 -:2014A0007080311D484600F033F9002887D18DF8425042F6A620ADF840001C216846CDF81A -:2014C0001C8020F0B2FB9DF81C00ADF8345020F00F00401C20F0F00010308DF81C009DF8E8 -:2014E0001D0008AA20F0FF008DF81D009DF81E000AA920F0060040F00100801C8DF81E0080 -:201500009DF800008DF8445040F002008DF80000CDE90A4711A80E90ADF83050684606F03F -:201520004AF9002899D1BDF82000F08000203EE73EB504460820ADF80000204612F090FE4C -:2015400008B110203EBD2146012001F060FE0028F8D12088ADF804006088ADF80600A088D3 -:20156000ADF80800E088ADF80A007E4801AB6A468088002106F024FDBDF800100829E1D09E -:2015800003203EBD1FB50446002002900820ADF80800CDF80CD0204612F062FE10B110202E -:2015A00004B010BD6F4802AA81884FF6FF7006F04EFF0028F4D1BDF80810082901D0032068 -:2015C000EEE7BDF800102180BDF802106180BDF80410A180BDF80610E180E1E701B582B062 -:2015E0000220ADF800005F4802AB6A464088002106F0E6FCBDF80010022900D003200EBDB1 -:201600001CB5002100910221ADF80010019012F04DFE08B110201CBD52486A4641884FF677 -:20162000FF7006F014FFBDF800100229F3D003201CBDFEB54B4C06461546207A0F46C007DC -:2016400005D0084612F00CFE18B11020FEBD0F20FEBDF82D01D90C20FEBD304612F000FE61 -:2016600018BB208801A905F0ECFD0028F4D130788DF80500208801A906F081FC0028EBD19F -:2016800000909DF800009DF8051040F002008DF80000090703D040F008008DF8000020887C -:2016A000694606F009FC0028D6D1ADF8085020883B4602AA002106F083FCBDF80810A94291 -:2016C000CAD00320FEBD7CB505460020009001900888ADF800000C462846019512F004FE46 -:2016E00018B9204612F0E2FD08B110207CBD15B1BDF8000050B11B486A4601884FF6FF70E4 -:2017000006F0A5FEBDF8001021807CBD0C207CBD30B593B0044600200D460090142101A8D9 -:2017200020F083FA1C2108A820F07FFA9DF80000CDF808D020F00F00401C20F0F0001030B9 -:201740008DF800009DF8010020F0FF008DF801009DF8200040F002008DF8200001208DF8A7 -:20176000460001E0E201002042F60420ADF8440011A801902088ADF83C006088ADF83E005C -:20178000A088ADF84000E088ADF842009DF8020006AA20F00600801C20F001008DF802005C -:2017A0000820ADF80C00ADF810000FA8059001A908A806F000F8002803D1BDF81800288096 -:2017C000002013B030BD0000F0B5007B059F1E4614460D46012800D0FFDF0C2030803A2057 -:2017E0003880002C08D0287A052806D0287B012800D0FFDF17206081F0BDA889FBE72DE920 -:20180000F04786B0144691F80C900E9A0D46B9F1010F0BD01021007B2E8A8846052807D016 -:20182000062833D0FFDF06B0BDE8F0870221F2E7E8890C2100EB400001EB400018803320EB -:201840001080002CEFD0E889608100271AE00096688808F1020301AA696900F07AFF06EB3F -:201860000800801C07EB470186B204EB4102BDF8040090810DF1060140460E3210F04CFD42 -:201880007F1CBFB26089B842E1D8CCE734201080E889B9F1010F11D0122148430E30188069 -:2018A000002CC0D0E88960814846B9F1010F00D00220207300270DF1040A1FE00621ECE721 -:2018C0000096688808F1020301AA696900F041FF06EB0800801C86B2B9F1010F12D007EB7C -:2018E000C70004EB4000BDF80410C18110220AF10201103020F000F97F1CBFB26089B8427F -:20190000DED890E707EB470104EB4102BDF80400D0810AF102014046103210F0FDFCEBE793 -:201920002DE9F0470E4688B090F80CC096F80C80378AF5890C20109902F10C044FF0000A00 -:20194000BCF1030F08D0BCF1040F3ED0BCF1070F7DD0FFDF08B067E705EB850C00EB4C0076 -:20196000188031200880002AF4D0A8F1060000F0FF09558125E0182101A820F056F90097BE -:201980007088434601AA716900F0E3FEBDF804002080BDF80600E080BDF808002081A21CE0 -:2019A0000DF10A01484610F0B7FCB9F1000F00D018B184F804A0A4F802A007EB080087B2FA -:2019C0000A346D1EADB2D6D2C4E705EB850C00EB4C00188032200880002ABBD0A8F105000F -:2019E00000F0FF09558137E000977088434601AA716900F0AEFE9DF80600BDF80410E18004 -:201A00002179420860F3000162F34101820862F38201C20862F3C301020962F304114209F2 -:201A200062F34511820962F386112171C0096071BDF80700208122460DF10901484610F0FD -:201A40006BFC18B184F802A0A4F800A000E007E007EB080087B20A346D1EADB2C4D279E7E4 -:201A6000A8F1020084B205FB08F000F10E0CA3F800C035230B80002AA6D055819481009732 -:201A800083B270880E32716900F063FE62E72DE9F84F1E460A9D0C4681462AB1607A00F53A -:201AA0008070D080E089108199F80C000C274FF000084FF00E0A0D2873D2DFE800F09E07A8 -:201AC0000E1C28303846556A73737300214648460095FFF779FEBDE8F88F207B9146082829 -:201AE00002D0032800D0FFDF378030200AE000BFA9F80A80EFE7207B9146042800D0FFDF3E -:201B0000378031202880B9F1000FF1D1E3E7207B9146042800D0FFDF37803220F2E7207B07 -:201B20009146022800D0FFDF37803320EAE7207B1746022800D0FFDF3420A6F800A0288011 -:201B4000002FC8D0A7F80A80C5E7207B1746042800D0FFDF3520A6F800A02880002FBAD023 -:201B60004046A7F80A8012E0207B1746052802D0062800D0FFDF1020308036202880002FE4 -:201B8000A9D0E0897881A7F80E80B9F80E00B881A1E7207B9146072800D0FFDF3780372060 -:201BA000B0E72AE04FF0120018804FF038001700288090D0E0897881A7F80E80A7F8108047 -:201BC00099F80C000A2805D00B2809D00C280DD0FFDF80E7207B0C2800D0FFDF01200AE077 -:201BE000207B0D2800D0FFDF042004E0207B0E2800D0FFDF052038736DE7FFDF6BE770B567 -:201C00000C46054601F076FA20B10078222804D2082070BD43F2020070BD052128460EF012 -:201C20001DFF206008B1002070BD032070BD2DE9FF4784B000278246029707989046894656 -:201C400012300AF0E2F8401D20F00306079828B907A95046FFF7D3FF002853D1B9F1000F65 -:201C600005D00798017B19BB052504681BE098F80000092803D00F2812D0FFDF45E00799BF -:201C800003254868B0B3497B42887143914238D98AB2B3B2011D0EF03AFD0446078002E03C -:201CA000079C042508340CB1208810B1032D28D02BE00798012112300AF0DFF8ADF80C003E -:201CC000024602AB2946504608F0B1F9070001D1A01C029007983A461230C8F80400A8F87C -:201CE00002A003A94046029B0AF0D4F8C0B1072814D200E005E0DFE800F0060811110F0A62 -:201D00000C00132026E6002024E6112022E6082020E643F203001DE607201BE6032019E662 -:201D2000BDF80C002346CDE900702A465046079900F035FD57B9032D08D10798B3B2417BB2 -:201D4000406871438AB2011D0EF0F5FCB9F1000FD9D0079981F80C90D5E72DE9FE4F9146D1 -:201D60001A881C468A468046FAB102AB494608F05EF9050019D04046A61C27880EF08AFF27 -:201D80003246072629463B4600960EF049FB20882346CDE900504A465146404600F0FFFC27 -:201DA000002020800120BDE8FE8F0020FBE710B586B01C46AAB104238DF800301388ADF83A -:201DC00008305288ADF80A208A788DF80E200988ADF80C1000236A462146FFF728FF06B00E -:201DE00010BD1020FBE770B50D4605210EF036FE040000D1FFDF294604F11200BDE87040B6 -:201E00000AF024B82DE9F8430D468046002607F0CCFA0446287812287BD2DFE800F07A54A9 -:201E2000543C35563232133232320932323232322879001FC0B2022801D0102810D114BB62 -:201E4000FFDF35E004B9FFDF052140460EF006FE007B032806D004280BD0072828D0FFDFBE -:201E6000072657E02879801FC0B2022820D050B1F6E72879401FC0B2022819D0102817D0B0 -:201E8000EEE704B9FFDF13E004B9FFDF287901280ED1172139E0052140460EF0DFFD0700BD -:201EA00000D1FFDF07F11201404609F0A6FF2CB12A462146404600F05CFC2BE013214046FD -:201EC00002F0AAFC26E0FFDF24E004B9FFDF052140460EF0C3FD060000D1FFDF694606F122 -:201EE000120009F094FF060000D0FFDFA988172901D2172200E00A46BDF80000824202D98F -:201F0000014602E005E01729C3D3404600F057FCCEE7FFDF3046BDE8F883401D20F0030279 -:201F200019B102FB01F0001D00E000201044704713B5009850B100244FEA0D000EF091FB6C -:201F4000002C02D1F84A009911601CBD01240020F4E72DE9F0470C461546242120461FF089 -:201F600064FE05B9FFDFA87860732888DFF8B8A3401D20F00301AF788946DAF800000EF057 -:201F80008EFB060000D1FFDF4FF000082660A6F8008077B109FB07F1091D0AD0DAF8000022 -:201FA0000EF07DFB060000D1FFDF6660C6F8008001E0C4F80480298804F11200BDE8F0473D -:201FC00009F00DBF2DE9F047804601F112000D46814609F01AFF401DD34F20F003026E7B7C -:201FE0001446296838680EF085FB3EB104FB06F2121D03D0696838680EF07CFB05200EF0E7 -:20200000D7FC044605200EF0DBFC201A012802D138680EF039FB49464046BDE8F04709F0B7 -:20202000F3BE70B5054605210EF018FD040000D1FFDF04F112012846BDE8704009F0DDBE34 -:202040002DE9F04F91B04FF0000BADF834B0ADF804B047880C4605469246052138460EF0D8 -:20206000FDFC060000D1FFDF24B1A780A4F806B0A4F808B0297809220B20B2EB111F297AA9 -:202080007DD104F110023827C91E4FF00C094FF0010803920F2973D2DFE801F0F4F3F281E5 -:2020A00008D48A8FA13DDDF5F0B8B800307B022800D0FFDFA88909EBC001ADF804103021A8 -:2020C000ADF83410002C25D06081B5F80E9000271DE004EBC708317C88F80E10F189A8F883 -:2020E0000C10CDF800906888042304AA296900F030FBBDF81010A8F8101009F10400BDF8B5 -:2021000012107F1C1FFA80F9A8F81210BFB26089B842DED80FE1307B022800D0FFDFE989BF -:2021200009EBC100ADF804003020ADF83400287B0A90001FC0B20F90002CEBD06181B5F835 -:202140001090002727E000BFCDF800906888696903AA0A9B00F0FDFA0A9904EBC70809EB4D -:2021600001001FFA80F908F10C0204A90F9810F0D3F818B188F80EB0A8F80CB001E0D7E0AB -:20218000D4E0BDF80C10A8F81010BDF80E107F1CA8F81210BFB26089B842D5D8CBE00DA869 -:2021A000009001AB224629463046FFF728FBC2E0307B082805D0FFDF03E0307B082800D0BF -:2021C000FFDFE8891030ADF804003620ADF83400002C3FD0A9896181F189A18127E0307BFB -:2021E000092800D0FFDFA88900F10C01ADF804103721ADF83410002C2CD06081E8890090CD -:20220000AB89688804F10C02296956E0E8893921103080B2ADF80400ADF83410002C74D090 -:20222000A9896181287A10280AD002212173E989E181288A0090EB8968886969039A3CE01A -:202240000121F3E70DA8009001AB224629463046FFF766FB6FE0307B0A2800D0FFDF1220E1 -:20226000ADF80400ADF834704CB3A9896181A4F810B0A4F80EB084F80C805CE020E002E07D -:2022800031E039E042E0307B0B2800D0FFDF288AADF834701230ADF8040084B10421217392 -:2022A000A9896181E989E181298A2182688A00902B8A688804F11202696900F04AFA3AE090 -:2022C000307B0C2800D0FFDF1220ADF80400ADF834703CB305212173A4F80AB0A4F80EB0F4 -:2022E000A4F810B027E00DA8009001AB224629463046FFF769FA1EE00DA8009001AB22468D -:2023000029463046FFF7C3FB15E036E03B21ADF80400ADF8341084B3A4F80680A4F808B07E -:2023200084F80AB007E0000010000020FFDF02E0012919D0FFDFBDF80400AAF800007CB117 -:20234000BDF834002080BDF804006080BDF83400392805D03B2803D03C2801D086F80CB097 -:2023600011B00020BDE8F08F3C21ADF80400ADF8341014B1697AA172DDE7FFE7AAF8000062 -:20238000EEE72DE9F84356880F4680461546052130460EF063FB040000D1FFDF123400943E -:2023A0003B46414630466A6809F02EFFB3E570B50D4605210EF052FB040000D1FFDF294604 -:2023C00004F11200BDE8704009F02CBD70B50D4605210EF043FB040000D1FFDF294604F1CE -:2023E0001200BDE8704009F050BD70B5054605210EF034FB040000D1FFDF04F10803214693 -:202400002846BDE870400422A7E470B5054605210EF024FB040000D1FFDF21462846236882 -:20242000BDE87040052298E470B5064605210EF015FB040000D1FFDF04F1120009F0E5FC6B -:20244000401D20F0030511E0011D00880322431821463046FFF781FC00280BD0607BABB265 -:20246000684382B26068011D0EF09BF9606841880029E9D170BD70B50E46054606F095FF16 -:20248000040000D1FFDF0120207266726580207820F00F00C01C20F0F00030302070BDE8F1 -:2024A000704006F085BF2DE9F0438BB00D461446814606A9FFF7A3FB002814D14FF6FF7630 -:2024C00001274FF420588CB103208DF800001020ADF8100007A8059007AA204604A90FF048 -:2024E0003AFF78B107200BB0BDE8F0830820ADF808508DF80E708DF80000ADF80A60ADF81F -:202500000C800CE00698A17801742188C1818DF80E70ADF80850ADF80C80ADF80A606A463C -:2025200002214846069BFFF782FBDCE708B501228DF8022042F60202ADF800200A46032315 -:202540006946FFF734FC08BD08B501228DF8022042F60302ADF800200A4604236946FFF73C -:2025600026FC08BD00B587B079B102228DF800200A88ADF808204988ADF80A1000236A46D3 -:202580000521FFF754FB07B000BD1020FBE709B107230CE40720704770B588B00D4614468E -:2025A000064606A9FFF72BFB00280ED17CB10620ADF808508DF80000ADF80A40069B6A46E8 -:2025C0000821DC813046FFF732FB08B070BD05208DF80000ADF80850F0E700B587B059B183 -:2025E00007238DF80030ADF80820039100236A460921FFF71CFBC6E71020C4E770B588B0AC -:202600000C460646002506A9FFF7F9FA0028DCD106980121123009F030FC9CB1217806294E -:2026200021D2DFE801F0200505160318801E80B2C01EE28880B20AB1A3681BB1824203D918 -:202640000C20C2E71020C0E7042904D0A08850B901E00620B9E7012913D0022905D00429BB -:202660001CD005292AD00720AFE709208DF800006088ADF80800E088ADF80A00A068039094 -:2026800023E00C208DF800006088ADF80800E088ADF80A00A0680A25039016E00D208DF868 -:2026A00000006088ADF80800A088ADF80A00E088ADF80C00A0680B25049006E00E208DF830 -:2026C000000060788DF808000C256A4629463046069BFFF7ACFA78E700B587B00F228DF891 -:2026E0000020ADF8081000236A461946FFF79FFA49E700B587B071B102228DF800200A88A3 -:20270000ADF808204988ADF80A1000236A460621FFF78DFA37E7102035E770B586B00646D4 -:2027200001200D46ADF808108DF80000014600236A463046FFF77BFA040008D12946304626 -:2027400005F058FC0021304605F072FC204606B070BDF8B51C4615460E46069F0EF088FA0A -:202760002346FF1DBCB231462A4600940DF01FFEF8BD10B548800878144620F00F00C01CBA -:2027800020F0F00090300B4608701822214603F108001FF0F6F9BDE8104006F009BE30B47F -:2027A0001146DDE902423CB1032903D0002330BC08F0D3BA0123FAE71A8030BC704770B5D1 -:2027C0000C460546FFF70FFB2146284605F021FC2846BDE87040012105F02ABC4FF0E02274 -:2027E0004FF400410020C2F8801120490870204990020860704730B51C4D04462878A042D5 -:2028000018BF002C02D0002818BFFFDF2878A04208BF30BD2C701749154A0020ECB1164D55 -:20282000DFF858C0131F012C0DD0022C1CBFFFDF30BD086003200860CCF800504FF400004F -:202840001060186030BD086002200860CCF800504FF040701060186030BD086008604FF0CA -:202860006070106030BD00B5FFDF00BD1800002008F5014000F500402403002014F50040A0 -:2028800070B50B2000F0B5F9082000F0B2F900210B2000F0C4F90021082000F0C0F9EC4C64 -:2028A00001256560A5600020C4F84001C4F84401C4F848010B2000F0A7F9082000F0A4F995 -:2028C0000B2000F08BF9256070BD10B50B2000F090F9082000F08DF9DD48012141608160D7 -:2028E000DC490A68002AFCD10021C0F84011C0F84411C0F848110B2000F086F9BDE8104073 -:20290000082000F081B910B50B2000F07DF9BDE81040082000F078B900B530B1012806D03C -:20292000022806D0FFDF002000BDCB4800BDCB4800BDCA48001D00BD70B5C9494FF000409A -:202940000860C84DC00BC5F80803C74800240460C5F840410820C43500F04BF9C5F83C4103 -:20296000C248047070BD08B5B94A002128B1012811D002281CD0FFDF08BD4FF48030C2F882 -:202980000803C2F84803B3483C300160C2F84011BDE80840D0E74FF40030C2F80803C2F8BE -:2029A0004803AC4840300160C2F84411AB480CE04FF48020C2F80803C2F84803A54844300B -:2029C0000160C2F84811A548001D0068009008BD70B516460D460446022800D9FFDF00229B -:2029E0009B48012304F110018B4000EB8401C1F8405526B1C1F84021C0F8043303E0C0F8C6 -:202A00000833C1F84021C0F8443370BD2DE9F0411C46154630B1012834D0022839D0FFDFE2 -:202A2000BDE8F081891E002221F07F411046FFF7CFFF012C24D000208C4E8A4F01247070D3 -:202A40003C61894900203C3908600220091D0860854904203039086083483D350560C7F836 -:202A60000042082000F0D0F82004C7F80403082000F0B4F87A49E007091F08603470CFE7F2 -:202A80000120D9E7012B02D00022012005E00122FBE7012B04D000220220BDE8F04197E792 -:202AA0000122F9E76B480068704770B500F0C7F8674C0546D4F840010026012809D1D4F86D -:202AC0000803C00305D54FF48030C4F80803C4F84061D4F8440101280CD1D4F808038003C6 -:202AE00008D54FF40030C4F80803C4F84461012010F0F6FBD4F8480101280CD1D4F808035A -:202B0000400308D54FF48020C4F80803C4F84861022010F0E5FB5648056070BD70B500F03F -:202B20008EF8524D0446287858B1FFF705FF687820B1002085F8010010F0D2FB4C4804606F -:202B400070BD0320F8E74FF0E0214FF40010C1F800027047152000F057B8424901200861F8 -:202B6000082000F051B83F494FF47C10C1F808030020024601EB8003C3F84025C3F8402106 -:202B8000401CC0B20628F5D37047410A43F609525143C0F3080010FB02F000F5807001EBBE -:202BA0005020704710B5430B48F2376463431B0C5C020C602F4C03FB04002F4B4CF2F7241F -:202BC00043435B0D13FB04F404EB402000F580704012107008681844086010BD00F01F02E9 -:202BE000012191404009800000F1E020C0F80011704700F01F02012191404009800000F1EA -:202C0000E020C0F88011704700F01F02012191404009800000F1E020C0F8801270474907A5 -:202C2000090E002806DA00F00F0000F1E02080F8141D704700F1E02080F8001470470C489D -:202C4000001F00680A4A0D49121D11607047000000B0004004B500404081004044B10040CD -:202C600008F5014000800040408500403400002014050240F7C2FFFF6F0C0100010000016D -:202C80000A4810B50468094909480831086010F0BBFB0648001D046010BD06490020086044 -:202CA0004FF0E0210220C1F8800270471005024001000001FC1F004010B50D2000F06FF8C3 -:202CC000C4B26FF0040000F06AF8C0B2844200D0FFDF3A490120086010BD70B50D2000F0C8 -:202CE00048F8374C0020C4F800010125C4F804530D2000F049F825604FF0E0216014C1F8AB -:202D0000000170BD10B50D2000F033F82C48012141600021C0F80011BDE810400D2000F045 -:202D200033B8284810B5046826492748083108602349D1F80001012804D0FFDF2148001DF1 -:202D4000046010BD1D48001D00680022C0B2C1F8002110F074FFF1E710B51948D0F80011A0 -:202D60000029FBD0FFF7DDFFBDE810400D2000F00BB800F01F02012191404009800000F1FA -:202D8000E020C0F88011704700F01F02012191404009800000F1E020C0F88012704700284C -:202DA00006DA00F00F0000F1E02090F8140D03E000F1E02090F800044009704704D5004021 -:202DC00000D00040100502400100000110B5202000F075F8202000F07DF84449202081F83D -:202DE0000004434900060860091D42480860FEF793FA3F49C83108603F48D0F8041341F0BB -:202E00000101C0F80413D0F8041341F08071C0F80413364901201C39C1F8000110BD10B5D0 -:202E2000202000F04CF8324800210160001D01602F4A481EE83A10602F4AC2F808032C4B7E -:202E4000C8331960C2F80001C2F860012B490860BDE81040202000F03DB825492848EC392F -:202E60000860704722492648E8390860704770B51F4A8069E83A224911601F49D1F8006113 -:202E80000023204D1D4A5C1E1EB1A84206D300210FE0D1F8606186B1A84209D2C1F80031AF -:202EA000C1F860311460BDE87040202000F012B81168BDE870401EF0E3BEFFDF70BD00F08D -:202EC0001F02012191404009800000F1E020C0F88011704700F01F02012191404009800057 -:202EE00000F1E020C0F880127047000020E000E00006024064130020000002400004024099 -:202F000001000001003002000F4A12680D498A420CD118470C4A12680A4B9A4206D101B5BE -:202F200010F00EFFFFF799FFBDE80140074909680958084706480749054A064B70470000AA -:202F400000000000BEBAFECAB000002004000020E8120020E812002070B50C46054609F04E -:202F6000F0FA21462846BDE870400AF0E2BB10B511F054FBFFF732FC11F0F0F9BDE810408E -:202F800011F0A2BA0120810708607047012081074860704712480068C00700D001207047D3 -:202FA0000F48001F0068C00700D0012070470C4808300068C00700D00120704708481030D1 -:202FC0000068704706490C310A68D20306D5096801F00301814201D101207047002070477A -:202FE0000C0400407047704770477047704702F0FF0343EA032242EA02421EF0F6BD7047C0 -:203000002CFFFFFFDBE5B151003002009D00FFFF84000000404B4C0066D342DA82CFB49DA6 -:20302000E40AD77E68976592800939FF30B5FF4D044610280AD0112C06D02846122CC17811 -:2030400006D0132C08D0FFDFEC7030BDFFDFFBE71129F9D0FFDFF7E71129F5D0FFDFF3E726 -:2030600070B50FF0E3FA044610F0A0FC201AC4B206200DF09DFC054606200DF0A1FC2E1AAA -:2030800007200DF095FC054607200DF099FCE749281A3218C87812280DD000231A441328A8 -:2030A0000BD0002002440878022808D000201044201AC0B270BD0123F0E70120F2E70120EA -:2030C000F5E7DA4800B58079D849420897B051F8070F89880CD017228DF80020CDF80200A1 -:2030E000ADF806100BA968460AF0B4FF17B000BD4422F1E702210DF0B1BC2DE9F04196B02A -:203100001D4690460E460746FFF7F4FF04000BD02078222804D3A07FC0F34010A84206D171 -:20312000082016B0BDE8F08143F20200F9E749208DF80000ADF802703DB101208DF80400D7 -:203140008DF805608DF8068002E000208DF804000BA968460AF07EFFA07F65F34510A07733 -:203160000020DEE730B50446A1F120000D460A284AD2DFE800F005070C1C2328353A3F44C0 -:20318000FFDF42E0207820283FD1FFDF3DE0A7480178032939D0C078132836D0207824284A -:2031A00033D0252831D023282FD0FFDF2DE0207822282AD0232828D8FFDF26E0207822289C -:2031C00023D0FFDF21E0207822281ED024281CD026281AD0272818D0292816D0FFDF14E09D -:2031E0002078252811D0FFDF0FE0207825280CD0FFDF0AE02078252807D0FFDF05E020789C -:20320000282802D0FFDF00E0FFDF257030BD30B50B8840F67B444FF6FF72022801D093427B -:2032200004D09D1FA54224D2022802D04D88954203D04D88AD1FA5421BD24C88A34218D888 -:203240008B88B3F5FA7F14D2022802D0C888904205D0C88840F677450A38A84209D2C888C8 -:20326000904208D0944206D05B1C6343B3EB800F01DB072030BD002030BD70B514460D46DF -:20328000064610F0EDFF60B90DB1A54201D90C2070BD002409E000BF56F8240010F0E0FFE8 -:2032A00008B1102070BD641CE4B2AC42F4D3002070BDF0B50024059D10B1A94203D850E0BE -:2032C00009B90020F0BD0920F0BD055DD5B1071997F801C0BCF1150F2DD03BDCBCF1150F7B -:2032E00038D2DFE80CF037122020262628282F2F373737373737373737372000025D22BBFC -:20330000641CE4B28C42F9D3DBE7022DDBD1BD781D70072D01D26D0701D40A20F0BD1578EA -:2033200045F0010515E0EF43FF0707E0012D07D010E00620F0BD2F07A7F18057002FF5D0DD -:203340003046F0BD1578AF0701D50B20F0BD45F002051570055D641C2C44E4B28C4202D907 -:20336000B1E74FF448568C42AFD3AAE710B50278540809D0012243F20223012C07D0022CD0 -:203380000DD0032C13D10FE00020087005E080790324B4EB901F0AD10A70002010BD807928 -:2033A000B2EB901F03D1F7E780798009F4D0184610BD1E4A117C39B1517C022908D00329C3 -:2033C00008D043F2022070470146901D01F0FCBC032100E0012101700020704738B50C46BD -:2033E0000546694601F0F0FC00280DD19DF80010207861F34700207055F8010FC4F801006E -:20340000A888A4F80500002038BD38B51378E8B102281BD006A46D46246800944C7905EB6E -:203420009414247864F34703137003E0CC0100200302FF0103280ED003F0FE001070086865 -:20344000C2F801008888A2F8050038BD23F0FE0313700228E9D1D8B240F00100EEE730B51D -:203460000C46097897B0222902D2082017B030BD28218DF80010ADF80200132A03D03B2A3D -:2034800001D00720F2E78DF804200BA968460AF0E1FD050003D121212046FFF763FE284632 -:2034A000E4E700B597B023218DF80010ADF802001088ADF804005088ADF80600D088ADF804 -:2034C0000A009088ADF808000020ADF80C00ADF80E000BA968460AF0BDFD07E600B597B09A -:2034E0002C22FA4968461EF04CFB0020CDF80300ADF80700F648007C022801D0012000E0EE -:2035000000208DF809000BA968460AF0A3FD002800D0FFDFEAE52DE9FF470220EC4E8DF81F -:2035200004000027B08AADF80600B84643F202094DE001A80DF0FBF9050006D0B08AA8B306 -:20354000A6F81480ADF806803FE0039CA07F01072DD504F124000090A28EBDF8080021462A -:2035600004F1360301F00DFE050005D04D452BD0112D3DD0FFDF3BE0A07F20F00800A07728 -:20358000E07F810861F30000C10861F34100E07794F8210000F01F0084F8200020782828FA -:2035A00027D129212046FFF7DDFD22E015E040070BD5BDF80800214604F10E02FFF771FFE6 -:2035C00005000DD04D4510D100257F1CFFB202200DF0EEF9401CB842ABD8052D12D008E04A -:2035E000A07F20F00400A07703E0112D00D0FFDF0025BDF80600B082052D05D0284604B077 -:20360000BDE8F087A6F814800020F8E770B50646FFF770FD054605F0C8FE040000D1FFDFD0 -:203620006680207820F00F00801C20F0F000203020700620207295F83E006072BDE87040C7 -:2036400005F0B6BE2DE9F04786B0040000D1FFDF20789F4E20F00F00801C20F0F0007030EB -:20366000207060680178091F182931D2DFE801F0FD30303053FC300CFCFC40FD3030FD7635 -:20368000FDFD3030FDFDFBFA86883046FFF732FD0546304607F05FFAE0B16068807985F858 -:2036A0003E0021212846FFF75DFD3046FEF7B9FC304603F0C3FF3146022010F085FDA87F3F -:2036C00020F01000A877FFF726FF002800D0FFDF06B095E7207820F0F000203020700620EA -:2036E0002072668060688079607205F061FED8E785882846FFF7FEFC00B9FFDF60688078EA -:20370000012800D0FFDF6068817906B02846BDE8F04707F0FDBD86883046FFF7EBFC0500F9 -:2037200000D1FFDF05F044FE60683146C088288160680089688160684089A881022010F05D -:2037400043FD0020A875A87F00F003000228BFD1FFF7E1FE0028BBD0FFDFB9E780783C28B6 -:2037600003D0002502280AD000E00125002720B13C2802D0022800D0FFDF17B1B8E00127B9 -:20378000F5E705F015FE1DB1B07801F0DCFAA1E06568B5F804A0A879AD1C012806D0307957 -:2037A000814605F097FB070003D101E0B078F7E7FFDF0022022150460DF047F9040000D12E -:2037C000FFDF22212046FFF7CDFC2879012800D00220A17F804668F30101A177288B208138 -:2037E000688B6081A88BA08184F822908DF80880B8680090F86801906A46032150460DF05E -:2038000024F900B9FFDFB888ADF81000B8788DF8120004AA052150460DF017F900B9FFDF2A -:20382000B888ADF80C00F8788DF80E0003AA042150460DF00AF900B9FFDF062105F1120066 -:2038400001F0EDFA28B36879800700D5FFDF6979E07D61F34700E075D5F80600A0616889A6 -:20386000A08303E05EE057E050E062E0062105F10C0001F0D4FAB0B1B0794108607861F374 -:2038800047006070D6F80700C4F80200B6F80B0012E0E07D20F0FE00801CE075D5F8120098 -:2038A000A061E88ADCE7607820F0FE00801C6070E868C4F80200288AE080B8F1010F09D0CE -:2038C000B8F1020F14D0FFDF02E70000CC1F0200CC0100203078032800D0FFDF00210846B9 -:2038E00010F072FC06B00120BDE8F04701F0FAB9F078132800D0FFDF0021062010F064FC0B -:2039000006B01120BDE8F047FFF790BB06B02046BDE8F04701F0E6BE05F04AFDB07C40F07E -:20392000020004E005F044FDB07C40F00400B074CEE606B0BDE8F04705F03ABD2DE9F04768 -:2039400005460078914600270209FF480C463E46012A6DD000234FF6FF71022A69D0072AA8 -:2039600009D00A2A71D0FFDFA9F800600CB127806680002044E6D5F804C09CF80060142EBF -:203980007DD010DC04F1080204F118080F2E21D004DC042E5AD0082E57D10DE0122E6FD0A6 -:2039A000132EF9D11FE0153E072E4ED2DFE806F0C14D4D099FEAB00012271026BCF80400D4 -:2039C00014E11C27092694B3BCF80200A080686800795AE11B2709264CB3032020726868EA -:2039E0004088A080C0E79CF802003C2827D0102718260CF1020CD4B1BCF80200A080BCF8B8 -:203A000018006082BCF818002082BCF81A00A082BCF81C00E0829CF805000CF10601FFF789 -:203A2000F4FC9CF8040028B10120E0739CE703E0BFE0DFE00220F8E7A9F8006099E71B2729 -:203A40000926002CF8D023728EE720E11D273726002CF1D0A18069680879491DFFF7D5FC0A -:203A6000686890F82B00A0756868C0780428E07D16D020F00100E0756968C97801E06DE091 -:203A800011E061F34200E07569681F22C97A61F3C700E075696840460C311EF02DF863E774 -:203AA00040F00100E7E71D273726002CC4D0A1806868411D0079FFF7A8FC696804F10F026D -:203AC00001F10C00CB7A01461846FFF79EFC6868807CA0756868C178E07D61F3420020F081 -:203AE000F900E0751F2140461EF09FF83CE720271026002CA0D0A180686804F10902407A26 -:203B000020726968CB1C88781946FFF77EFC2BE721270A26002C8FD0BCF80210A1806968BF -:203B200009792172696849796172817C21F0040157E022270B26002C84D0BCF80400A080EE -:203B40006868807820726868807901F077F960726868C07901F072F9A07205E7242710262B -:203B6000002CA3D0BCF80200A0806868007920816868007A60816868C088A08168684089E9 -:203B8000E081F1E623271026002C8FD0BCF80210A1806968898821816968C98861816968A2 -:203BA0000989A18169684989E181817C21F0020117E0297A012903D0022914D0FFDFD3E6FE -:203BC0001F271026002C95D06988A180A9892181E9896181298AA181698AE181817C21F066 -:203BE00001018174C0E6122768881026214601F003F9B9E6287A072850D2DFE800F0373DB8 -:203C00003D484848040011270926002C94D0B5F802804046FFF76EFA90F822A0A4F8048017 -:203C2000687A2072042140460CF02AFF052140460CF026FF002140460CF022FF0121404607 -:203C40000CF01EFF032140460CF01AFF022140460CF016FF062140460CF012FF072140466A -:203C60000CF00EFF504601F06EF87DE61B270926002C8AD0A180E6E61B270926002C84D016 -:203C8000A180287A012800D0022020726CE64A4621462846BDE8F04701F0AFBEFFDF63E69C -:203CA00030B5294D97B0E878132802D0082017B030BD22208DF800000BA968460AF0CAF933 -:203CC000040002D1287901F03EF80021062010F07BFA2046EBE700B51B4897B0C078122880 -:203CE00001D0082016E41E208DF8000000208DF802008DF803000BA968460AF0ABF90028B7 -:203D0000F0D10021062010F05FFA1120FFF78EF90020E7E710B50C4C96B02078012815D09D -:203D20001B208DF8000000208DF802000BA968460AF090F900280AD10021084610F044FA87 -:203D40002078032805D007E0CC010020082016B010BDA07800F0F7FF012000F0C3FF00204B -:203D6000F5E770B5002538B1022817D0062836D0072800D0FFDF70BDFFF7CCFF0028FAD131 -:203D800005F013FB0028F6D0017821F00F01891C21F0F0012031017005723FE08EB23046E3 -:203DA000FFF7A8F9040000D1FFDF20782128E2D005F0FBFA60B1017821F00F01891C21F0DB -:203DC000F00110310170022101724680A57525E021463046BDE870401322FFF740BBFE4827 -:203DE000C478122C03D0132C04D0FFDF70BDFFF772FF01E0FFF754FF0028F7D105F0D5FA13 -:203E00000028F3D0017821F00F01891C21F0F00120310170122C05D002210172BDE87040B6 -:203E200005F0C6BA0121F8E72DE9F04116460C00804600D1FFDF307820F00F00801C20F075 -:203E4000F000103030702078012804D0022817D0FFDFBDE8F0814046FFF74CF9050000D161 -:203E6000FFDF0320A87505F0A3FA94E80F00083686E80F00D848817C41F001018174E8E738 -:203E80004046FFF737F9050000D1FFDFA1884FF6FF700027814202D1E288824203D0814264 -:203EA00001D1E08840B105F083FA94E80F00083686E80F00AF75CCE7A87D0128C9D17823C5 -:203EC00000224146022010F0D5F80220A875C0E730B5054697B00C46084610F0C1F978BB60 -:203EE00000210120203D072D73D2DFE805F004254C515A6640000021072010F03BF908B1F3 -:203F00001120D4E624208DF80000D4F80200CDF80200A0798DF806000BA968460AF09AF8C6 -:203F2000050057D1002208231146072010F0A2F807284FD0FFDF4DE0606810F0D5F908B147 -:203F40001020B4E64A208DF800002088ADF802006088ADF804000BA968460AF07BF80500F4 -:203F600038D1606898B3BDF83010018032E04C208DF800002088ADF80200A07800F0010054 -:203F80008DF8040014E0206801F0D5FF054621E04B2207E08DF802000AE000BF8DF80210F0 -:203FA00006E046228DF800202278D207F6D0F1E70BA968460AF04EF8E8E738208DF80000AF -:203FC0002088ADF802006088ADF80400F0E701E0FFE7072528466AE630B5054697B00C46B0 -:203FE000084610F063F908B1102060E6203D072D27D2DFE805F0042424242626240020881A -:20400000FFF778F820B10078222804D208204EE643F202004BE625208DF800002088ADF8F6 -:2040200002000BA968460AF015F80028DDD1DDF83210C4F802109DF83610A17137E606202A -:2040400035E6072033E66448801D704738B5162161481DF0C8FD012000F044FE1120FEF7ED -:20406000E5FF5D4C6846E11D05F0FFF89DF80010A07961F3470020F00100A07100202074EC -:204080004FF46170E08102206074FFF71AF800B1FFDFFDF769F901F0E2FA38BD10B50C46EF -:2040A000402120461DF09FFDA07F20F00300A077202020700020A07584F8230010BD70471F -:2040C0007CB5054610F0CCF808B110207CBD424CA11DD4F806000090D4F80A0001902846FB -:2040E000FFF77CF90028F1D1FEF7EBFF0028EDD00099C4F80610BDF8041061819DF80610E6 -:2041000021737CBD10B5044610F0D0F808B1102010BD314922468879C91D4008FFF775F9D0 -:20412000002010BD2DE9F0479CB00D4604004FF0000812D00822FFF7A0F800281CD1002686 -:2041400009E000BF54F8260004A9FFF70FF9002812D1761CF6B2AE42F4D32F460A2006AD4C -:204160000DF1440A8DF8180026465146284609F071FF20B143F203201CB0BDE8F0874046E5 -:20418000DFF8548088F805002EB300244FF00B091DE000BF56F8240005A9FFF7E7F800B135 -:2041A000FFDF9DF81400A87056F8240050F8011FC5F803108088A5F8070085F80090514666 -:2041C000284609F047FF00B1FFDF641CE4B2BC42E0D388F8057001E0CC0100200020CBE747 -:2041E0002DE9F0479EB01546894604001DD00F4608222946FFF741F8002810D1002612E0CB -:2042000054F8260005A9103000F0DEFD002806D13FB157F8260010F023F810B110201EB035 -:20422000ABE7761CF6B2AE42EAD30026A5F101081CE000BF06F1010A0AF0FF0712E000BFD2 -:2042400054F82600017C4A0854F827100B7CB2EB530F05D10622113011311DF021FC78B140 -:204260007F1CFFB2AF42EBD30AF0FF064645E1DBC8462E4607AD0DF1480924B1012003E09F -:2042800043F20520CBE700208DF81E0031208DF81C004946284609F0DDFE38B934208DF8C2 -:2042A0001C004946284609F0D5FE10B143F20420B5E77CB300272BE054F82700A91C10308A -:2042C00000F082FD00B1FFDF54F82700102250F8111FC5F803108088A5F8070054F82710C4 -:2042E00005F109001DF008FCB8F1000F16D058F82710102205F119001DF0FEFB3220287058 -:204300004946284609F0A6FE00B1FFDF7F1CFFB2B742D1D3FFF7E2F8002080E705F1190025 -:2043200001F0FDFDEAE770B596B004460FF098FF18B960680FF0E1FF10B1102016B070BD1A -:2043400060884AF2B811884207D82078FE4D6E4628B1012806D0022804D00720EEE7FEF769 -:20436000B0FE1AE06078022804D0032802D043F20220E3E7687417208DF80000697C002004 -:20438000CDF80200ADF80600022934D003292FD0FFDF0BA9684609F05DFE0028CED160682E -:2043A00001F0B0FD207870B101208DF80200F01C01F0B5FD4E208DF800000BA9684609F001 -:2043C00049FE00B1FFDF20782874FFF787F8608898B1E88180B2ADF8020030208DF8000016 -:2043E0000BA9684609F036FE00B1FFDF0020A5E78DF80700CDE74020FAE74FF46170E8E78F -:2044000010B504460FF052FF20B9606838B10FF06BFF08B1102010BD606801F080FDCA484C -:20442000C1896180417C6170007C2070002010BD2DE9F0419CB0054600208DF864008DF85E -:2044400060008DF830008DF868001E461446884628460FF052FF18B920460FF04EFF10B1CC -:2044600010201CB0F5E455EA040018D01F270CAB19AA414628460097FEF71BFF0028F0D1F8 -:204480001AAB18AA314620460097FEF712FF0028E7D19DF86000C00703D00A20E1E7072093 -:2044A000DFE701AF7DB11A208DF804008DF8068042462946F81C1DF01FFB0DA901A809F000 -:2044C000C9FD0028CDD17CB120208DF804008DF8066032462146F81C1DF00EFB0DA901A807 -:2044E00009F0B8FD0028BCD197499DF8300048700020B6E72DE9F0479CB08A464FF000088F -:2045000092A104468DF83480D1E90001CDE9190120460FF0A5FE90B92078012803D16068AC -:204520000FF09EFE58B9884D4FF00109287C40B1687C022805D160680FF0DFFE08B11020AB -:204540001AE62878012801D0082015E607200CF037FA18B9207878B101280DD0FEF780FD40 -:2045600060B1608943F6E172A0F12001914221780CD3012904D0B6E01220FDE51320FBE5FD -:2045800000287DD1A18900297AD109E0012907D06978C90704D0A189002971D0B4296FD8E0 -:2045A000217831B1012908D0022904D0032967D10AE0002609E0022607E008B9A08908B170 -:2045C000042609E0012607E00326287C50B1687C022807D1606828B10DA96068FEF7C6FE2E -:2045E0000028ADD1207A30B1012806D0022806D0032878D105E0002704E0012702E0022704 -:2046000000E003270EB1022E0ED16FB16879B8B36878800702D043F20120ADE5022E03D131 -:20462000022F60D0032F5ED0207808B1012806D1504600F06BFB002887D185F802A01820A5 -:204640008DF838006089ADF83A006089ADF83C008DF83E600DF13F00FEF7ABFE00B1FFDF7E -:204660009DF834008DF840002078012806D0287C68B1687C02280AD1606840B1606800E00E -:2046800031E050F8011FCDF84110808802E04046CDF84180ADF845008DF84870A07BC0F3A0 -:2046A0004002014662F35F01C0F3800041EA800019A9085C8DF84700A8B169460EA809F035 -:2046C000C9FC0028A9D11B208DF838008DF83A9069460EA809F0BEFC00289ED19DF80100E7 -:2046E0001B281CD101E0072046E5052E0CD2DFE806F0030308080300A87800F017FB03202B -:2047000000E0022000F0EEFA012E0AD0A08940B100228300114610460FF0ACFC08B10320C7 -:204720002AE5002028E52DE9FC4107460D46032608460FF0E2FD00286CD13846FEF7DAFC47 -:2047400004000CD0207805E0CC0100200706050403020100222805D20820BDE8FC8143F253 -:204760000200FAE7A07F00F0030C2DB129466046FEF74DFD0600F0D1BCF1010F05D0BCF100 -:20478000020F18D0FFDF3046E7E7A07D2946022801D011B107E01120DFE76846FCF7F2FE46 -:2047A0000028DAD16946384606F075FD0600EAD10120A075E7E7A07D032803D1FE48807C6E -:2047C000C00701D035B30EE025B1A07F40071FD4002100E00121384606F07DFD0600D2D182 -:2047E000A075002DCFD02A4621463846FEF759FE06461128C7D1A07F4107C4D4296844F84E -:204800000E1F6968616040F0040020740026BAE71126B8E71020A0E770B50C460546FEF706 -:2048200069FC010005D022462846BDE87040FEF716BE43F2020070BD00B597B043218DF800 -:2048400000108DF802000BA9684609F003FC17B000BD0123FEF751BC00231A461946FEF7E6 -:204860004CBC30B597B004460FF0FAFC10B1102017B030BD204600F095FA0028F8D1CE4D2F -:20488000E878112801D00820F2E7FEF7E9FBE0B32078800701D56879C0B31D208DF8000036 -:2048A0002078022200F001008DF802006088ADF80400A088ADF806002078C0F3400102EAE8 -:2048C000500001438DF8091002A8FEF772FD00B1FFDF0BA9684609F0BDFB0028C8D11E20F7 -:2048E0008DF8000001208DF8020000208DF803000BA9684609F0AEFB0028B9D1E08800F0D5 -:204900006DFA0400B4D1122001E004E005E0FEF78DFB2046ACE71320AAE70720A8E72DE9C5 -:20492000F043A54E074697B0F078994615460C46122803D1FFF7CFF9002816D120460FF089 -:204940008FFCE8BB28460FF08BFCC8BB204600F029FA002809D129460220FEF758FC002835 -:2049600003D1F078112803D0082017B0BDE8F08306200CF025F850B12078800701D57079CA -:2049800038B1FEF76DFB022805D21320EDE71220EBE70720E9E721208DF800006088ADF87B -:2049A0000200A088ADF8040020784FF00008C0F340008DF80600207880071FD4384600E057 -:2049C00002E00FF04DFC08B11020CEE73878400808D0012809D0022807D0032805D043F207 -:2049E0000220C2E78DF8078002E001208DF8070057F8010F0290B888ADF80C000DF10E0063 -:204A0000FEF7D7FC08B10320AFE72888ADF810006888ADF81200A888ADF81400E888ADF852 -:204A20001600ADF81880ADF81A80484600F06EF900289AD186F804900BA9684609F00AFBFA -:204A4000002892D1307900F071F9E08800F0C6F904008AD11320FEF7E9FA204685E730B590 -:204A6000054697B00C4608460FF020FC08B11020FEE62846FEF73EFB38B10178222902D3FE -:204A8000807F800604D40820F2E643F20200EFE613208DF80000ADF802500BA9684609F0A3 -:204AA000D9FA0028E4D19DF932107F2901D02170DEE60520DCE630B5054697B00C460846A2 -:204AC0000FF0CEFB08B11020D2E62846FEF712FB20B10078222804D20820C9E643F2020086 -:204AE000C6E63548807C400701D51120C0E62078800802D16078800801D00720B8E656203E -:204B00008DF80000ADF8025020788DF8040060788DF805000BA9684609F09CFAA8E62DE901 -:204B2000F041B0B014460D460646FEF7E3FA070006D03878222806D2082030B0BDE8F0814C -:204B400043F20200F9E728460FF0D7FB30B94FF000084CB120460FF0C7FB08B11020ECE7EF -:204B6000C4F80080A4F804801348807C800701D51120E2E797F8220004F0ACF98088011DBB -:204B8000FB2901D2001D00E0FB20C0B26A46294600F0E3F82C22094904A81CF0F2FFBDF8AC -:204BA0000200ADF81400BDF80600ADF81600ADF81260BDF8000003E0CC010020A01F020067 -:204BC000ADF81800BDF80400ADF81A001AA904A809F040FA00B1FFDFBDF86C00ADF80800A1 -:204BE000BDF86E00ADF80A00BDF87000BDF87210BDF800200844ADF80C0007201B2A9CD3DA -:204C0000BDF802101B2998D3FB2A96D8FB2994D806278A4210D10121104600F05AF8BDF8B2 -:204C20000410884208D1BDF80200012100F051F8BDF80610884201D038467EE7BDF80800A5 -:204C400028B9BDF80A1011B9BDF80C1029B35DB1298849B1698839B124B102982060BDF8F5 -:204C60000C00A080132068E7BDF80010BDF80A20081A80B2ADF80000BDF80210891AADF8DA -:204C80000210012100F025F8ADF80400BDF80200012100F01EF8ADF806002C226B490FA8E7 -:204CA0001CF06FFFADF83E60BDF80200ADF84000BDF80600ADF84200BDF80000ADF844005B -:204CC000BDF80400ADF8460025A90FA809F0C2F933E7022903D0C000703080B27047800016 -:204CE0003C30FAE730B55A4D040008D0012C04D0022C06D0032C04D0FFDF2C7030BDFFDFB2 -:204D0000FBE728780128F8D0FFDFF6E710B5044604F0E0F830B1407830B1204604F0EEFBCD -:204D2000002010BD072010BD122010BD10B504F0D1F8040000D1FFDF607800B9FFDF607817 -:204D4000401E607010BD10B504F0C4F8040000D1FFDF6078401C607010BD10B5144631B15E -:204D60000A68226049686160218839B107E0208060800121FFF7ADFFA0800DE02080618879 -:204D800001B96080A08820B920880121FFF7A1FFA080E088002804D160880121FFF799FFFB -:204DA000E08010BD418843F6FD730A1F9A4209D28088042806D3B0F5804F03D8884201D875 -:204DC00000207047072070470278520804D0012A02D043F202207047FEF7C8BA10B548B136 -:204DE00083000022114606200FF044F9062801D0032010BD002010BD70B50C0006460DD01F -:204E0000FEF778F9050000D1FFDFA68028892081288960816889A081A889E08170BD10B5D8 -:204E200000231A4603E0845C2343521CD2B28A42F9D30BB1002010BD012010BD00B50128C7 -:204E400003D0022801D0FFDF002000BDF81F0200CC01002010B504460FF002FA08B11020D0 -:204E600010BD2078C0F30210042807D86078072804D3A178102901D8814201D2072010BD6A -:204E8000E078410706D421794A0703D4000701D4080701D5062010BD002010BD10B51378E5 -:204EA0005C08C37F64F30003C3771478A40864F34103C3771078C309487863F34100487048 -:204EC00013781C090B7864F347130B701378DB0863F3000048705078487110BD10B5C478A8 -:204EE0000B7864F300030B70C478640864F341030B70C478A40864F382030B70C478E40835 -:204F000064F3C3030B700379117863F30001117003795B0863F34101117003799B0863F3AF -:204F2000820111700079C00860F3C301117010BD70B514460D46064604F037FA80B10178DA -:204F4000182221F00F01891C21F0F001A03100F8081B21461CF015FEBDE8704004F028BAB2 -:204F600029463046BDE870401322FEF778BA10B5FE4C94F8300000280CD104F120014FF670 -:204F8000FF72A1F110000DF04DF900B1FFDF012084F8300010BD2DE9F047064608A889467A -:204FA00090E830041F469046142128461CF03DFE0021CAF80010B8F1000F03D0B9F1000FE9 -:204FC00003D114E03878C00711D020680FF06EF9F0BBB8F1000F07D12068123028602068AE -:204FE000143068602068A8602168CAF800103878800728D560680FF077F948BBB9F1000F93 -:205000002DD0FFF720F80168C6F8C8118188A6F8CC11807986F8CE01FFF7A9FFDFF84C8377 -:2050200008F12008C5F80C80626862B196F8C80106F2C91140081032FEF7E7F910224146E8 -:2050400060681CF059FD3878400712D5A06800E002E00FF02BF950B11020BDE8F087606846 -:205060000028F9D0E8606068C6F8C401EBE7A06828610020F1E730B5054608780C4620F03F -:205080000F00401C20F0F001103121700020607095F8230030B104280FD0052811D006280A -:2050A00014D0FFDF20780121B1EB101F04D295F8200000F01F00607030BD21F0F000203009 -:2050C00002E021F0F00030302070EBE721F0F0004030F9E710B510B190F8BD4044B1A348EF -:2050E00090F83540002064B108601060186010BD00F1BC040C6000F1E40100F58670116012 -:20510000F4E79A4C34340C60EFE700B58BB00723CDE902128DF80130019194490023643163 -:205120000591099301468DF8103068460DF052F8002800D0FFDF0BB000BD70B590B015462E -:205140000C4602220646ADF80820092103AB04F06EFF0490002812D00C208DF80100042013 -:205160008DF8040004F59A74099605948DF818500AA968460DF02EF800B1FFDF012010B086 -:2051800070BD30B597B00C462C251A998DF80050ADF80200B3B11868019058680290ADF878 -:2051A0000C2010220DF10E001CF0A6FC0BA9684608F050FF002803D1A17F41F01001A177B8 -:2051C00017B030BD00200190E8E72DE9F0470646808A8CB080B20D468246FDF78BFF0446A7 -:2051E000624F3078283FDFF884914FF00008112873D2DFE800F072F1350936777E98A7F28A -:20520000EFEEEDEC5BECEC00A07F00F00300012806D0002150460BF021FC050003D101E00B -:205220000121F7E7FFDF99F85C10C90702D0D9F860000BE0032105F121000EF0E2FCD5F8F1 -:2052400021004B49B0FBF1F201FB1200C5F821007068A867B068E8672078252800D0FFDF3E -:20526000ECE0A07F00F00300012806D0002150460BF0F4FB060003D101E00121F7E7FFDF17 -:205280003078810702D52178252904D040F0010030700CB0E1E60220287096F820002871F7 -:2052A00006F121003136C5E90206F2E7A07F00F00300012806D0002150460BF0CFFB04004F -:2052C00003D101E00121F7E7FFDF2078C10605D51320287041346C60DBE7BEE140F008005D -:2052E0002070D6E72148082128380EF08AFC032016E02A208DF8000010220DF102007168F8 -:205300001CF0FAFB10220DF11200B1681CF0F4FB164968462C3908F09DFE00B1FFDF04207E -:2053200028706F60B5E7E07FC00600D5FFDF307CB28800F001030CB05046BDE8F047092160 -:2053400005F00BBD04B9FFDF716821B1102204F124001CF0D1FB28212046FDF703FFA07F63 -:2053600000F00300022814D104E000001802002040420F0004F12400002300901A462146E9 -:205380005046FFF7FEFE112807D029212046FDF7E9FE307A84F820007BE7A07F000700D547 -:2053A000FFDF14F81E0F40F008002070A4F81680C4F81880C4F81C806178084661F3820033 -:2053C000410861F3C3006070307AE07061E727E03FE17AE051E000E037E0A07F00F00300A0 -:2053E000012806D0002150460BF038FB040003D101E00121F7E7FFDF022104F189000EF093 -:2054000000FC1020287004F5E4706860B4F88910298204F18000FD496861C5E9029138E7DF -:20542000A07F00F00300012805D0002150460BF015FB18B901E00121F8E7FFDF0CB03246D5 -:2054400021465046BDE8F04772E504B9FFDF20782128A1D93079012803D1E07F40F01000E1 -:20546000E077324621465046FFF762FD0CB02046BDE8F0472321FDF775BE3279AA8005F1D7 -:2054800008030921504604F0D2FDE86010B111202870FEE6A07F00F00300012806D0002196 -:2054A00050460BF0DBFA040003D101E00121F7E7FFDF04F1660102231022081F0BF03BF9E6 -:2054C00080F8008031794170E3E6A07F00F00300012806D0002150460BF0C0FA050003D15A -:2054E00001E00121F7E7FFDF95F8880000F00300012879D1A07F00F00307E07FC0F3400601 -:2055000016B1012F04D02BE095F8A400C0072AD0D5F8C00118B395F88720017C62F38701DC -:205520000174E27FD5F8C00162F341010174D5F8C00166F300010174AEB1D5F8C00110227F -:2055400004F124018C351CF0D7FA287E40F001002876287820F0010005F88C0900E016B134 -:20556000022F04D02CE095F88C00C00726D0D5F8BC1119B395F88720087C62F387000874CE -:20558000E27FD5F8BC1162F341000874D5F8BC1166F3000008748EB1D5F8BC01102204F19F -:2055A00024018C351CF0A8FA287840F0010005F8180B287820F0010005F8A409022F44D0C6 -:2055C0005FF0000000EB400005EBC00090F88C00800709D595F88000D5F8C421400805F12B -:2055E00081011032FDF711FF05208DF8000095F888006A4600F003008DF8010095F88C10D2 -:205600008DF8021095F8A4008DF803002146504601F046FA2078252805D0212807D0FFDF54 -:205620002078222803D922212046FDF79BFDA07F00F0030001280AD0002150460BF020FA96 -:2056400000283FF432AEFFDF23E60120BAE70121F3E7716881F801801BE6FFDF19E670B594 -:205660006A4C0025103C04F85C5F65600CF07FFD6649A1F1100003F02AFE04F82C5C0620F9 -:20568000607262487C3020615030A0611030E06170BD70B50D46FDF72DFD040000D1FFDFE9 -:2056A0004FF4E87128461CF0C0FA58485430686104F124002861A07F00F00300012809D077 -:2056C0005FF0020105F59A700CF052FD002800D0FFDF70BD0121F5E70A46014602F59A7090 -:2056E0000CF066BD70B5054640689CB00178092906D00C2937D00D2933D0FFDF1CB070BD5A -:2057000046883046FDF7F6FC040000D1FFDF20782128F3D0282821D1686802210C3001F0A6 -:20572000B4F9D8B168680821001D01F0AEF9A8B12D208DF80000ADF80260102204F1240107 -:2057400001A81CF0D9F90BA9684608F083FC00B1FFDF29212046FDF705FDCFE703F028FEE5 -:20576000CCE701218171686886883046FDF7C2FC040000D1FFDFA07F00F00301022902D198 -:2057800020F01000A077207821280AD06868817909B1807880B1A07F00F0030002285ED000 -:2057A000FFDFA07F00F003000228A7D1FDF7B3FE0028A3D0FFDFA1E703F0FAFDE07FC107A0 -:2057C00028D0800705D594F8200000F01F0010281ED0052084F82300207829281CD02428AA -:2057E000DFD1314605200EF0EFFC22212046FDF7B9FCA07F00F0030001282ED00021304652 -:205800000BF03EF90028CCD0FFDFCAE7280200200620DFE70420DDE7A07F00F003000128AA -:2058200006D0002130460BF019F9050003D101E00121F7E7FFDF25212046FDF793FC0F20F8 -:205840008DF8580016A905F59A700CF0A8FC0228A7D00028A5D0FFDFA3E70121CFE703F097 -:20586000A7FD9EE72DE9F0438BB09946154688460646FDF73FFC04004FD0207822284CD3D4 -:2058800023284AD0E07FC00647D4A07F00F00300012806D0002130460BF0E0F8070002D00F -:2058A0000CE00121F7E7A07F00F00300012805D10121002230460BF0C8F8074601AB02AAD1 -:2058C00003A93846FFF706FC039800B9FFDF4FB1039807F59A7787612078222806D02428E0 -:2058E00004D007E003990020886103E025212046FDF738FC03980B21417046628580C0E9C3 -:205900000289029901610199416104A90CF062FC022802D0002800D0FFDF0BB0BDE8F08317 -:2059200070B586B00546FDF7E5FB017822291CD9807F00F00300012806D0002128460BF0B9 -:205940008DF8040030D101E00121F7E7FFDF2BE0B4F8620004F1660630440178427831B1FB -:2059600021462846FFF7E9FBB8B906B070BDADF804200921284602AB04F059FB0390002813 -:20598000F3D011208DF80000694604F59A700CF006FC022801D000B1FFDF02231022314686 -:2059A00004F162000AF0FDFEB4F864000028CFD1DBE710B586B00446FDF79CFB017822296D -:2059C00019D9807F00F00300012806D0002120460BF044F8040003D101E00121F7E7FFDF8F -:2059E00012208DF80000694604F59A700CF0D7FB002800D0FFDF06B010BD2DE9F05F054667 -:205A00000C4600270078904601093E46BA4604F1080B02297ED0072902D00A2909D142E07F -:205A200068680178092905D00C292CD00D292AD0FFDFB2E114271C26002C6CD04088A08077 -:205A4000FDF758FB5FEA000900D1FFDF99F817005A46400809F11801FDF7D7FC68688089BB -:205A6000208269684868C4F812008868C4F81600A07E20F0060040F00100A07699F81E0049 -:205A800040F040014DE01A270A26002CD5D08088A080FDF72FFB050000D1FFDF594628461F -:205AA000FFF7E9FA79E10CB1A88BA080287A0D287ED006DC01287CD0022808D0032804D125 -:205AC00035E00F2876D0102875D0FFDF65E11E270926002CB1D0A088FDF70CFB5FEA0009FD -:205AE00000D1FFDF287B00F003000128207A1BD020F001002072297B890861F341002072B4 -:205B0000297BC90861F382002072297B090961F3C30001E036E1E9E0207299F81E0040F0A9 -:205B2000800189F81E1038E140F00100E2E713270D26002CAAD0A088FDF7DCFA8146807F57 -:205B400000F00300012806D00021A0880AF086FF050003D101E00121F7E7FFDF99F81E0044 -:205B600000F00302012A59D0E86F817801F003010129217A54D021F00101217283789B086A -:205B800063F3410121728378DB0863F38201217283781B0963F3C3012172037863F30611DC -:205BA0002172437863F3C711217284F809A003E05EE0A4E08BE09CE0C178A172012A32D0AC -:205BC0004279E17A62F30001E1724279520862F34101E1724279920862F38201E1724279CC -:205BE000D20862F3C301E1720279217B62F3000121730279520862F3410121730279920849 -:205C000062F3820121730079C00860F3C301217399F80000232859D9262168E0A86FA4E7ED -:205C200041F00101A9E70279E17A62F30001E1720279520862F34101E1720279920862F3F9 -:205C40008201E1720279D20862F3C301E1724279217B62F3000121734279520862F34101C0 -:205C600021734279920862F3820121734079CBE718271026D4B3A088FDF73CFA8346807F4E -:205C800000F00300012807D00021A0880AF0E6FE5FEA000903D101E00121F6E7FFDFE868B6 -:205CA000A06099F8000040F0040189F8001099F80100800708D5012020739BF80000232805 -:205CC0006BD9272158464FE084F80CA065E015270F265CB1A088FDF70DFA814606225946CF -:205CE000E86808F01FFA0120A0739BE03FE048463AE016270926D4B3287B20724DE0287BD5 -:205D000019270E269CB3C4F808A0A4F80CA0012807D0022805D0032805D0042803D0FFDF38 -:205D20000DE0207207E0697B042801F00F0141F0800121721CD0607A20F003006072A088D4 -:205D4000FDF7D8F905460078212826D0232800D0FFDFA87F00F00300012811D00021A08816 -:205D60000AF08EFE22212846FDF7FCF915E004E0607A20F00300401CE0E7A8F8006011E029 -:205D80000121ECE70CB16888A080287A03282BD004280AD005284BD0FFDFA8F800600CB190 -:205DA000278066800020BDE8F09F15270F26002CE3D0A088FDF79EF9807F00F003000128E4 -:205DC00006D00021A0880AF049FE050003D101E00121F7E7FFDFD5F821000622594608F01E -:205DE000A1F984F80EA0D8E717270926002CC4D0A088FDF77FF98146807F00F0030001287D -:205E000006D00021A0880AF029FE050003D101E00121F7E7FFDF6878800701D5022000E06B -:205E20000120207299F800002328B6D927215EE719270E26002CA0D0A088FDF75BF95FEAEE -:205E4000000900D1FFDFC4F808A0A4F80CA084F808A0A07A40F00300A07299F81F1061F347 -:205E60008200A07299F81F10C1F34002114205D099F8201001F01F0110292CD020F0080091 -:205E8000A07299F81F004108607A61F3C3006072697A01F003010129A5D140F004006072B6 -:205EA00099F81E00E97A00F00300012816D0607B61F300006073AA7A217B62F30001217322 -:205EC000EA7A520862F341006073A87A400860F34101217361E740F00800D1E7207B61F3E1 -:205EE00000002073AA7A617B62F300016173EA7A520862F341002073A87A400860F34101FF -:205F000061734AE710B5FE4C30B10146102204F120001BF0F1FD012084F8300010BD10B5A6 -:205F20000446FFF724F8F64920461022BDE8104020311BF0E1BD70B5F14D06004FF0000493 -:205F400012D00EF08DF908B110240BE00621304608F0CFF8411C04D02866012085F85C00EE -:205F600000E00724204670BD0020F7E7007810F00F0204D0012A05D0022A0CD110E0000926 -:205F800009D10AE00009012807D0022805D0032803D0042801D0072070470870002070470D -:205FA0000620704705282AD2DFE800F003070F171F00087820F0FF001EE0087820F00F00A9 -:205FC000401C20F0F000103016E0087820F00F00401C20F0F00020300EE0087820F00F0057 -:205FE000401C20F0F000303006E0087820F00F00401C20F0F000403008700020704707201E -:2060000070472DE9F041804688B00D46002708460EF073F9A8B94046FDF76CF8040003D03C -:206020002078222815D104E043F2020008B0BDE8F08145B9A07F010603D500F00300022896 -:2060400001D01020F2E7A07FC10601D4010702D50DB10820EAE7E17FC90601D50D20E5E717 -:2060600000F00300022805D125B12846FEF7F2FE0700DBD1A07F00F00300012806D000211F -:2060800040460AF0EBFC060002D00DE00121F7E7A07F00F0030001280CD0002100224046F4 -:2060A0000AF0D3FC060007D0A07F00F00300022804D009E00121F1E70420B7E725B12A463F -:2060C00031462046FEF7EAFE07AB1A4669463046FFF700F8009800B9FFDF00990C20487035 -:2060E00006F59A70C1F82480486100200881A07F00F00300012828D0EDB302200871301D31 -:2061000088613078400908777078C0F340004877287800F00102887F62F301008877E27F3C -:2061200062F382008877E27F520862F3C3008877727862F304108877A878C87701F12102F1 -:2061400028462031FEF7CAFE22E001200871287800F00102087E62F3010008762A7852083E -:2061600062F3820008762A78920862F3C30008762A78D20800E007E062F304100876242189 -:206180002046FCF7EFFF0BE0032008710520087625212046FCF7E6FFA07F20F08000A07744 -:2061A00001A900980CF016F8022801D000B1FFDF38463BE72DE9FF4F524A0D4699B09A46ED -:2061C00007CA14AB002783E807001998FCF792FF060006D03078262806D008201DB0BDE81F -:2061E000F08F43F20200F9E7B07F00F00309B9F1010F03D0B9F1020F07D008E03DB91B982E -:20620000FEF728FE0028E9D101E01B9880BBB07F00F00300012806D0002119980AF01EFCAB -:20622000040003D101E00121F7E7FFDF852D28D007DCF5B1812D1ED0822D1ED0832D08D1D2 -:206240001DE0862D1FD0882D1FD0892D1FD08A2D1FD00F2020710F281DD003F0A6F8E0B1AA -:2062600001208DF83400201D0E902079B8B160E111E00020EEE70120ECE70220EAE7032036 -:20628000E8E70520E6E70620E4E70820E2E70920E0E70A20DEE70720A0E711209EE7B9F16E -:2062A000010F17D0D4E91E5080460220019001200090A87898F80210C0F3C000C1F3C001E8 -:2062C00008405FEA000B63D050460DF0C9FF002872D133E0D4E91E85012001900220009052 -:2062E000214630461B9AFEF7D9FD1B98007800F00101A87861F30100A870F17F04E0000043 -:20630000180200202420020061F38200A870F17F490861F3C300A870617861F30410A870C6 -:206320002078400928706078C0F3400068701B988078E870002068712871BAE7DAF80C002D -:206340000DF08EFFC0BBDAF81C000DF089FF98BBDAF80C00A060DAF81C00E06098F80100D5 -:20636000617800F0010041EA4000607098F80210C0B2C1F30011891E08406070002084F8E4 -:206380002000009906F1170002290BD001210AE098F80110607801F00101FD2242EA41012B -:2063A0000840E2E7002104EB810188610199701C022902D0012101E028E0002104EB810191 -:2063C0008861A87800F00300012849D198F8020000F00300012843D1B9F1010F04D12A1DE6 -:2063E000691D1B98FEF77AFD287998F8041008408DF82C00697998F8052011408DF830100D -:2064000008432DD050460DF02BFF08B11020E5E60AF1100004F5DE7104F190020490B9F1AB -:20642000020F3CD00090CDE9012100210BAB5A462046FEF7B0FD0028E9D104F5E07104F137 -:20644000A802B9F1010F30D004980090CDE9012100210CAB5A462046FEF79DFD0028D6D198 -:206460006078800740D4A87898F80210C0F38000C1F38001084337D0297898F8000014AA3E -:20648000B9F1010F17D032F810204B00DA4012F0030718D0012F1ED0022F12D11DE0CDF8B4 -:2064A00000A0CDE901210121C0E7CDF800A0CDE901210121CDE732F811204300DA4002F0DE -:2064C0000307032F07D0BBF1000F0DD0012906D0042904D008E00227F5E70127F3E70128F8 -:2064E00001D0042800D10427F07F40F001006BF34100F077607881074FF003000CD5A07169 -:20650000BBF1000F15D100BF8DF85C0017AA3146199800F0C5FA0CE00221022F18D0012F4A -:2065200018D0042F22D00020A071F07F20F00100F07725213046FCF715FE0DA904F59A70BB -:206540000BF02DFE10B1022800D0FFDF002045E6A171D9E7A1710D2104F124001BF065FB9B -:20656000207840F0020020700420CDE70120A071DFE72DE9F04387B090468946044600255D -:20658000FCF7B8FD060006D03078272806D0082007B0BDE8F08343F20200F9E7B07F00F07D -:2065A0000300012806D0002120460AF057FA040003D101E00121F7E7FFDFA7795FEA0900FE -:2065C00005D0012821D0B9F1020F26D110E0B8F1000F22D1012F05D0022F05D0032F05D06D -:2065E000FFDF2DE00C252BE0012529E0022527E040460DF035FEB0B9032F0ED1102241462E -:2066000004F121001BF078FA1AE0012F02D0022F03D104E0B8F1000F12D00720B8E740461C -:206620000DF01EFE08B11020B2E7102104F121001BF0D9FA0621404607F05BFDC4F82100C1 -:206640002078252140F0020020703046FCF78AFD2078C10714D020F00100207002208DF81E -:20666000000004F1210002908DF80450694604F59A700BF094FD022804D018B1FFDF01E0D5 -:2066800084F82050002083E730B587B00D460446FCF730FD88B1807F00F0030001280FD078 -:2066A000002120460AF0DAF904000ED028460DF0D7FD38B1102007B030BD43F20200FAE790 -:2066C0000121EEE72078400701D40820F3E7294604F14100202205461BF00EFA207840F000 -:2066E0001000207001070FD520F00800207013208DF80000694604F59A7001950BF04FFD1F -:20670000022801D000B1FFDF0020D4E770B50D460646FCF7EFFC18B1017827291FD102E00E -:2067200043F2020070BD807F00F00300012806D0002130460AF092F9040003D101E001210D -:20674000F7E7FFDFA079022809D16078C00706D02A4621463046FEF7F0FC10B10FE00820E5 -:2067600070BDB4F864000E280BD204F1660102231022081F09F0DFFF0121017045700020B0 -:2067800070BD112070BD70B5064686B014460D4608460DF065FD18B920460DF087FD10B1F4 -:2067A000102006B070BDA6F57F40FF380ED03046FCF7A0FC38B1417822464B08811C1846FA -:2067C000FCF723FE07E043F20200EAE72046FDF799FC0028E5D11021E01D0DF012FAE21DB3 -:2067E00029466846FEF791FC102204F1170001991BF082F90020D4E72DE9F041044686B0FA -:2068000015468846002708460DF077FD18B928460DF073FD10B1102006B008E42046FCF7D1 -:2068200069FC060003D03078272818D102E043F20200F1E7B07F00F00300012806D0002107 -:2068400020460AF00BF9040003D101E00121F7E7FFDF2078400702D56078800701D408202B -:20686000DAE7B07F00F00300012818D0D4E91E01407800B1B5B1487810B1B8F1000F11D05F -:20688000C5B1EA1D6846E168FEF73FFC102205F1170001991BF004F930B104270AE0D4E9C0 -:2068A0001E10E5E70720B7E71022E91D04F131001BF022F9B8F1000F06D0102208F10701D4 -:2068C00004F121001BF018F92078252140F0020020703046FCF746FC2078C10716D020F0E5 -:2068E0000100207002208DF8000004F121000290103003908DF80470694604F59A700BF03F -:206900004EFC022804D018B1FFDF01E084F82070002081E7F8B515460E460746FCF7EAFB92 -:20692000040004D02078222804D00820F8BD43F20200F8BDA07F00F00300022802D043F2BD -:206940000400F8BD30460DF08BFC18B928460DF087FC08B11020F8BD00953288B31C2146A2 -:206960003846FEF70EFC112814D00028F3D1297C4A08E17F62F30001E1772A7C62F341014F -:20698000E177297C890884F82010A17F21F08001A177F8BDA17F0907FBD4D6F80200C4F8B3 -:2069A0003600D6F80600C4F83A003088A0861022294604F124001BF09FF8287C4108E07F51 -:2069C00061F38200E077297C61F3C300E077287C800884F82100A07F40F00800A077002020 -:2069E000D3E770B596B00D46064613B1072016B070BDFCF77FFB040007D02078222802D3F6 -:206A0000A07F400604D40820F1E743F20200EEE7C5B12D208DF80000ADF80260102229463D -:206A200001A81BF069F8287C4108E07F61F30000E077297C61F34100E077287C800884F811 -:206A4000200004E02E208DF80000ADF802600BA9684607F0FFFAA17F21F04001A177C6E7CF -:206A600070B50D46FCF746FB040005D028460DF01DFC20B1102070BD43F2020070BD29460C -:206A80002046FEF7F8FA002070BD04E010F8012B0AB100207047491E89B2F7D2012070476F -:206AA00070B51546064602F080FC040000D1FFDF207820F00F00801C20F0F00020302070B6 -:206AC00066802868A060BDE8704002F071BC000018B18178012938D101E010207047018886 -:206AE00042F60112881A914231D018DC42F60102A1EB020091422AD00CDC41B3B1F5C05FAA -:206B000025D06FF4C050081821D0A0F57060FF381BD11CE001281AD002280AD117E0B0F5C4 -:206B2000807F14D008DC012811D002280FD003280DD0FF2809D10AE0B0F5817F07D0A0F577 -:206B40008070033803D0012801D0002070470F2070470B2826D008DC1BD2DFE800F01C2093 -:206B600025251A25292325271E0011281CD008DC0C2817D00D281DD00F2815D0102808D163 -:206B800010E0822809D0842810D0852810D0872812D003207047002070470520704743F216 -:206BA00003007047072070470F20704704207047062070470C20704743F20200704738B5E1 -:206BC0000C46050041D06946FFF7D0F9002819D19DF80010607861F3020060706946681CF7 -:206BE000FFF7C4F900280DD19DF80010607861F3C5006070A978C1F34101012903D0022937 -:206C000005D0072038BD217821F0200102E0217841F020012170410704D0A978C90861F3F8 -:206C200086106070607810F0380F07D0A978090961F3C710607010F0380F02D16078400692 -:206C400003D5207840F040002070002038BD70B504460020088015466068FFF7B0FF0028A8 -:206C600016D12089A189884211D860688078C0070AD0B1F5007F0AD840F20120B1FBF0F25E -:206C800000FB1210288007E0B1F5FF7F01D90C2070BD01F201212980002070BD10B50478A5 -:206CA000137864F3000313700478640864F3410313700478A40864F3820313700478E40877 -:206CC00064F3C30313700478240964F3041313700478640964F3451313700078800960F30B -:206CE0008613137031B10878C10701D1800701D5012000E0002060F3C713137010BD4278C7 -:206D0000530702D002F0070306E012F0380F02D0C2F3C20300E001234A7863F302024A70F6 -:206D2000407810F0380F02D0C0F3C20005E0430702D000F0070000E0012060F3C5024A7040 -:206D400070472DE9F04F95B00D00804615D0B8F1000F16D0122128461AF045FF4FF6FF7BDE -:206D600005AA0121584606F0C0FF0024264637464FF420596FF4205A75E0102015B0BDE85A -:206D8000F08F0720FAE700BF9DF81E0001280AD1BDF81C0048450BD010EB0A000AD00128B5 -:206DA0000CD002280CD0042C0ED0052C0FD10DE0012400E00224BDF81A6008E0032406E096 -:206DC0000424BDF81A7002E0052400E00624BDF81A10414547D12C74BEB34FF0000810AAA8 -:206DE0004FF0070ACDE90282CDE900A80DF13C091023CDF8109042463146584607F028F81C -:206E000008BBBDF83C002A46C0B210A90BF084FAC8B9AE81CFB1CDE900A80DF1080C0AAE52 -:206E200040468CE84102132300223946584607F00FF840B9BDF83C00F11CC01EC0B22A1D14 -:206E40000BF06AFA10B1032098E70AE0BDF82900E881062C05D19DF81E00A872BDF81C0099 -:206E6000288100208AE705A806F04BFF00288BD0FFF76FFE82E72DE9F0471C46DDE90978A6 -:206E8000DDF8209015460E00824600D1FFDF0CB1208818B1D5B11120BDE8F087022D01D08C -:206EA000012100E0002106F1140005F003FEA8F8000002463B462946504603F0B8F8C9F8DC -:206EC000000008B9A41C3C600020E5E71320E3E7F0B41446DDE904528DB1002314B1022C3E -:206EE00009D101E0012306E00D7CEE0703D025F0010501230D742146F0BC03F02EBF1A802F -:206F0000F0BC70472DE9FE4F91461A881C468A468046FAB102AB494603F089F8050019D0F1 -:206F20004046A61C278809F0B5FE3246072629463B46009609F074FA20882346CDE9005005 -:206F40004A4651464046FFF7C3FF002020800120BDE8FE8F0020FBE72DE9F04786B091465D -:206F6000DDE90E460F46824603AA05A904A8109D8DE807009846324621465046FFF77BFFE7 -:206F8000049909B1012200E000222A70002817D1F84A03AB1060059A009104F11400CDE97C -:206FA00001204A463946504606F048F990B108280ED2DFE800F00407040D0D090B0B002064 -:206FC00006B069E71120FBE70720F9E70820F7E70320F5E7BDF80C100498CDE900014346DF -:206FE000324621465046FFF773FFE8E72DE9F04389B00D46DDE9108781461C4616461421F9 -:2070000003A81AF012FE012002218DF810108DF80C008DF81170ADF8146064B1A278D2070A -:2070200009D08DF81600E088ADF81A00A088ADF81800A068079008A80095CDE9011042469D -:2070400003A948466B68FFF787FF09B0BDE8F083F0B58BB000240646069407940727089487 -:2070600005A80994019400970294CDE903400D4610232246304606F0EBFE78B90AA806A936 -:20708000019400970294CDE90310BDF8143000222946304606F0B2FC002801D0FFF759FD7C -:2070A0000BB0F0BD06F052BB2DE9FC410C468046002602F07AF9054620780D287ED2DFE840 -:2070C00000F0BC0713B325BD49496383AF959B00A848006820B1417841F010014170ADE09C -:2070E000404602F092F9A9E00421404609F0B6FC070000D1FFDF07F11401404605F06EFC06 -:20710000A5BB13214046FDF787FB97E00421404609F0A4FC070000D1FFDFE088ADF8000061 -:207120000020B8819DF80000010704D5C00602D5A088B88105E09DF8010040067ED5A08846 -:20714000F88105B9FFDF22462946404601F068FC022673E0E188ADF800109DF8011009061A -:207160000FD5072803D006280AD00AE024E00421404609F073FC060000D1FFDFA088F081D2 -:207180000226CDB9FFDF17E00421404609F066FC070000D1FFDF07F1140006F00EFB90F025 -:2071A000010F02D1E079000648D5387C022640F00200387405B9FFDF224600E03DE0294646 -:2071C000404601F02DFC39E00421404609F046FC017C002D01F00206C1F340016171017C29 -:2071E00021F002010174E7D1FFDFE5E702260121404602F045F921E00421404609F02EFCD5 -:207200000546606800902089ADF8040001226946404602F056F9287C20F0020028740DE0A1 -:20722000002DC9D1FFDFC7E7022600214046FBF7CDF8002DC0D1FFDFBEE7FFDF3046BDE83B -:20724000FC813EB50C0009D001466B4601AA002006F080FE20B1FFF77CFC3EBD10203EBD3D -:2072600000202080A0709DF8050002A900F00700FEF798FE50B99DF8080020709DF80500A7 -:2072800002A9C0F3C200FEF78DFE08B103203EBD9DF8080060709DF80500C109A07861F33A -:2072A0000410A0709DF80510890961F3C300A0709DF80410890601D5022100E0012161F3C0 -:2072C00042009DF8001061F30000A07000203EBD70B5144606460D4651EA040005D075B1F0 -:2072E00008460DF001F878B901E0072070BD2946304606F090FE10B1BDE8704029E454B153 -:2073000020460CF0F1FF08B1102070BD21463046BDE8704095E7002070BD2DE9FC5F0C4647 -:2073200090460546002701780822007A3E46B2EB111F7DD104F10A0100910A31821E4FF09E -:20734000020A04F1080B0191092A72D2DFE802F0EDE005F528287BAACE006888042109F03F -:207360007DFB060000D1FFDFB08928B152270726C3E000001403002051271026002C7DD027 -:207380006888A0800120A071A88900220099FFF79FFF002873D1A8892081288AE081D1E029 -:2073A000B5F81290072824D1E87B000621D5512709F1140086B2002CE1D0A8890022009974 -:2073C000FFF786FF00285AD16888A08084F806A0A88920810120A073288A2082A4F8129015 -:2073E000A88A009068884B46A969019A01F0F5FAA8E0502709F1120086B2002C3ED0A8890F -:2074000000225946FFF764FF002838D16888A080A889E080287A072813D002202073288A65 -:20742000E081E87BC0096073A4F81090A88A01E085E082E0009068884B4604F11202A969AA -:20744000D4E70120EAE7B5F81290512709F1140086B2002C66D06888042109F0FFFA834640 -:207460006888A080A88900220099FFF731FF00286ED184F806A0A889208101E052E067E035 -:207480000420A073288A2082A4F81290A88A009068884B46A969019A01F09FFAA989ABF8D4 -:2074A0000E104FE06888FBF725FE07466888042109F0D4FA064607B9FFDF06B9FFDF687BE7 -:2074C000C00702D05127142601E0502712264CB36888A080502F06D084F806A0287B594609 -:2074E00001F08BFA2EE0287BA11DF9E7FE49A8894989814205D1542706269CB16888A080E0 -:2075000020E053270BE06888A080A889E08019E06888042109F0A2FA00B9FFDF5527082681 -:20752000002CF0D1A8F8006011E056270726002CF8D06888A080002013E0FFDF02E00128C3 -:2075400008D0FFDFA8F800600CB1278066800020BDE8FC9F57270726002CE3D06888A08031 -:20756000687AA071EEE7401D20F0030009B14143091D01EB4000704713B5DB4A00201071FE -:20758000009848B10024684609F06BF8002C02D1D64A009911601CBD01240020F4E770B5E5 -:2075A0000D46064686B014465C2128461AF03DFB04B9FFDFA0786874A2782188284601F0BE -:2075C00046FA0020A881E881228805F11401304605F0E9F96A460121304606F086FB19E0FF -:2075E0009DF80300000715D5BDF806103046FFF72FFD9DF80300BDF8061040F010008DF877 -:207600000300BDF80300ADF81400FF233046059A06F0CCFC684606F074FB0028E0D006B060 -:2076200070BD10B50C4601F1140005F0F3F90146627C2046BDE8104001F03EBA70B5054646 -:20764000042109F00BFA040000D1FFDF04F114010C46284605F0C2F921462846BDE87040B0 -:2076600005F0C3B970B58AB00C460646FBF742FD050014D02878222827D30CB1A08890B178 -:2076800001208DF80C0003208DF8100000208DF8110054B1A088ADF81800206807E043F23C -:2076A00002000AB070BD0920FBE7ADF8180005900421304609F0D2F9040000D1FFDF04F17D -:2076C000140005F0BEF9C00601D40820E9E701F06CFE60B108A802210094CDE9011095F830 -:2076E000232003A930466368FFF736FCD9E71120D7E72DE9F04FB2F802A0834689B0154685 -:2077000089465046FBF7F6FC07460421504609F0A5F90026044605964FF002080696ADF8EC -:207720001C6007B9FFDF04B9FFDF4146504603F07CFE60B907AA06A905A88DE807004246E0 -:20774000214650466368FFF796FB00B1FFDF664807AB0660DDE9051204F11400CDF800904A -:20776000CDE90320CDE9013197F82320594650466B6805F0AFF906000AD0022E04D0032EBC -:2077800014D0042E00D0FFDF09B03046BDE8F08FBDF81C000028F7D00599CDE90010424626 -:2077A000214650466368FFF793FBEDE7687840F008006870E8E72DE9F04F9BB004464FF0C1 -:2077C00000084948ADF85480ADF83080ADF85080A0F80880ADF81480ADF81880ADF82080F2 -:2077E000ADF81C80007916460D464746012808D0022806D0032804D0042802D008201BB0A2 -:20780000C4E720460CF02CFDD0BB28460CF028FDB0BB60680CF071FD90BB606848B1608986 -:207820002189884202D8B1F5007F01D90C20E6E780460BAA06A92846FFF709FA0028DED19A -:2078400068688078C0F34100022808D19DF8190010F0380F03D028690CF046FD80B905A9EA -:207860002069FFF7ACF90028C9D1206950B1607880079DF8150000F0380002D5C0B301E03C -:2078800011E0A8BB9DF8140080060ED59DF8150010F0380F03D060680CF026FD18B960683E -:2078A0000CF02BFD08B11020A9E707A96069FFF786F90028A3D1606940B19DF81D0000F045 -:2078C000070101293FD110F0380F3CD008A9A069FFF775F9002892D19DF81C00800632D42D -:2078E0009DF82000800604E0140300201400002029E028D4A06940B19DF8210000F0070151 -:20790000012920D110F0380F1DD0E06818B10078C8B11C2817D20EAA611C2046FFF7BEF9A1 -:207920000120B94660F30F27BA4607468DF84E0042F60300ADF84C000DF13B0217A92868C7 -:207940000AF009FD08B1072059E79DF85C0016A9CDF80090C01CCDE9019100F0FF0B0023C1 -:207960000BF20122514613A806F002F9F0BBBDF858000990FE482A8929690092CDE901106F -:207980006B89BDF82C202868069906F0F1F801007ED120784FF0020AC10601D480062BD58F -:2079A000ADF80C90606950B907A906A8FFF7A7F99DF81D0020F00700401C8DF81D009DF864 -:2079C0001C008DF84E7040F0C8008DF81C0042F60210ADF84C000CA903AACDF800A0CDE9F7 -:2079E0000121002340F2032213A800E01EE0079906F0BEF801004BD1DD484D4608385B4650 -:207A00000089ADF839000EA8CDE90290CDF80490CDF810904FF007090022CDF80090BDF8C8 -:207A200058104FF6FF7005F0E9FF10B1FFF791F8E5E69DF83800000625D52946012060F392 -:207A40000F218DF84E704FF42450ADF84C00ADF8105062789DF81000002362F300008DF88A -:207A600010006278CDF800A0520862F341008DF8100004AACDE9012540F2032213A806F0A0 -:207A800077F8010004D1606888B32069A8B900E086E005A906A8FFF732F96078800706D4B8 -:207AA0009DF8150020F038008DF8150005E09DF8140040F040008DF814008DF84E7042F628 -:207AC0000110ADF84C00208940F20121B0FBF1F201FB1202606814ABCDF80080CDE9010383 -:207AE000002313A8059906F043F8010058D12078C00729D0ADF80C50A06950B908A906A8E5 -:207B0000FFF7FDF89DF8210020F00700401C8DF821009DF820008DF84E7040F040008DF8BE -:207B2000200042F60310ADF84C0015A903AACDF800A0CDE90121002340F2032213A808996B -:207B400006F016F801002BD1E06868B32946012060F30F218DF84E7042F60410ADF84C002E -:207B6000E068002302788DF8602040788DF86100E06818AA4088ADF86200E06800798DF85E -:207B80006400E068C088ADF86500CDF80090CDE901254FF4027213A805F0EAFF010003D092 -:207BA000099800F0B5FF2AE6714803210838017156B100893080BDF850007080BDF83000C7 -:207BC000B080BDF85400F080002018E670B501258AB016460B46012802D0022816D104E0BC -:207BE0008DF80E504FF4205003E08DF80E5042F60100ADF80C005BB10024601C60F30F240D -:207C000004AA08A918460AF0A6FB18B1072048E5102046E504A99DF820205548CDE900219E -:207C2000801E02900023214603A802F2012205F09FFF10B1FEF78DFF33E54D4808380EB147 -:207C4000C1883180057100202BE5F0B593B0074601268DF83E6041F60100ADF83C0012AA30 -:207C60000FA93046FFF7B2FF002848D1404C0025083CE7B31C2102A819F0D7FF9DF80800FC -:207C80008DF83E6040F020008DF8080042F60520ADF83C000E959DF83A00119520F0060078 -:207CA000801C8DF83A009DF838006A4620F0FF008DF838009DF8390009A920F0FF008DF80C -:207CC00039000420ADF82C00ADF830000EA80A9011A80D900FA80990ADF82E5002A8FFF7E8 -:207CE0006AFD00280BD1BDF80000608100E008E0BDF80400A081401CE0812571002013B0AB -:207D0000F0BD6581A581BDF84800F4E72DE9F74F1749A0B00024083917940A79A146012A21 -:207D200004D0022A02D0082023B02FE5CA88824201D00620F8E721988A46824201D1072030 -:207D4000F2E701202146ADF848004FF6FF7860F30F21ADF84A808DF86E0042F6020B069158 -:207D60008DF87240ADF86CB0ADF870401CA901E01C0300201391ADF8508012A805F0E5FF25 -:207D800000252E462F460DAB072212A9404605F0DFFF78B182285DD195B38EB3ADF86450FD -:207DA000ADF866609DF85E008DF8144019AC012864D06BE09DF83A001FB3012859D1BDF876 -:207DC000381059451FD118A809A901940294CDE9031007200090BDF83610102300224046DA -:207DE00006F036F8B0BBBDF86000042801D006284AD1BDF82410219881423AD10F2093E780 -:207E00003AE0012835D1BDF83800B0F5205F03D042F6010188422CD1BAF80600BDF8361081 -:207E2000884201D1012700E0002705B19EB1219881421ED118A809AA01940294CDE9032090 -:207E4000072000900D4610230022404606F000F800B902E02DE04E460BE0BDF860000228E9 -:207E600001D0102810D1C0B217AA09A90AF054FA50B9BDF8369086E7052055E705A917A82C -:207E8000221D0AF068FA08B103204DE79DF814000023001DC2B28DF8142022980092CDE91F -:207EA00001401BA8069905F063FE10B902228AF80420FEF74EFE37E710B50B46401E88B02B -:207EC00084B205AA00211846FEF7E8FE00200DF1080C06AA05A901908CE807000720009010 -:207EE0000123002221464FF6FF7005F087FD0446BDF81800012800D0FFDF2046FEF729FE38 -:207F000008B010BDF0B5F94F044687B038790E46032804D0042802D0082007B0F0BD04AA32 -:207F200003A92046FEF793FE0500F6D160688078C0F3410002280AD19DF80D0010F0380F3B -:207F400005D020690CF0D0F908B11020E5E7208905AA21698DE807006389BDF81020206892 -:207F6000039905F005FE10B1FEF7F3FDD5E716B1BDF814003080042038712846CDE7F8B52F -:207F80000C0006460BD001464FF6FF7500236A46284605F0DFFF20B1FEF7DBFDF8BD102017 -:207FA000F8BD69462046FEF70AFE0028F8D1A078314600F001032846009A05F0F7FFEBE7C1 -:207FC00030B587B0144600220DF1080C05AD01928CE82C00072200920A46014623884FF6D0 -:207FE000FF7005F00BFDBDF814102180FEF7B1FD07B030BD70B50D46042108F02FFD04008F -:2080000000D1FFDF294604F11400BDE8704004F011BD70B50D46042108F020FD040000D19B -:20802000FFDF294604F11400BDE8704004F025BD70B50D46042108F011FD040000D1FFDF69 -:20804000294604F11400BDE8704004F03DBD70B50546042108F002FD040000D1FFDF2146BF -:2080600028462368BDE870400122FEF74BBF70B50646042108F0F2FC040000D1FFDF04F16C -:20808000140004F0C7FC401D20F0030511E0011D00880022431821463046FEF733FF002860 -:2080A0000BD0607CABB2684382B2A068011D08F078FBA06841880029E9D170BD70B50546EB -:2080C000042108F0CBFC040000D1FFDF214628466368BDE870400222FEF714BF70B50E46AF -:2080E000054601F062F9040000D1FFDF0120207266726580207820F00F00001D20F0F000F2 -:2081000040302070BDE8704001F052B910B50446012900D0FFDF2046BDE810400121FAF7B9 -:2081200055B92DE9F04F97B04FF0000A0C008346ADF818A0D04619D0E06830B1A068A8B191 -:208140000188ADF81810A0F800A05846FAF7D2FF070043F2020967D03878222862D304215F -:20816000584608F07BFC050005D103E0102017B0BDE8F08FFFDF05F1140004F04BFC401D99 -:2081800020F00306A078012803D0022801D00720EDE7208878B1401C81B209AA584605F016 -:2081A000A4FD09A805F0ADFD9DF82E204FF45051012A0DD102E043F20300D8E7BDF82C2024 -:2081C000A2F52453023B03D1822801D0A0B901E00846CCE7E068B0B1CDE902A0072006AAF2 -:2081E000CDF804A000900492A2882188BDF81830584605F003FC10B1FEF7ABFCB7E7A1688A -:20820000BDF8180008809DF82700C00602D543F20140ACE70D9838B1A1780078012905D089 -:2082200080071AD40820A2E74846A0E7C007F9D002208DF83C00A8684FF00009A0B1697C02 -:208240004288714391420FD98AB2B3B2011D08F05EFA8046A0F800A006E003208DF83C000E -:20826000D5F800804FF001099DF8280010F0380F00D1FFDF9DF828001D49C0F3C2000844D1 -:2082800097F8231010F8010C884201D90F206EE72088ADF8400014A90095CDE9019143462F -:2082A00007220FA95846FEF757FE002885D19DF8500050B9A078012807D1687CB3B2704374 -:2082C00082B2A868011D08F036FA00204FE770B5064615460C460846FEF7FAFB002809D166 -:2082E0002A4621463046BDE870406FE4140300202E20020070BD09E570B51E4614460D00F7 -:2083000009D044B1616831B138B1F849C988814203D0072070BD102070BD2068FEF7D8FBD2 -:208320000028F9D1324621462846BDE87040FFF742BA70B515460C0006D038B1EB490989A6 -:20834000814203D0072070BD102070BD2068FEF7BFFB0028F9D129462046BDE87040D1E5CD -:2083600070B5064686B00D46144610460BF09EFFD0BB60680BF0C1FFB0BBA6F57F40FF38B1 -:2083800003D03046FAF7B6FE80B128466946FEF7D8FC00280CD19DF810100F2008293CD2B0 -:2083A000DFE801F008060606060A0A0843F2020006B070BD0320FBE79DF80210012908D100 -:2083C000BDF80010B1F5C05FF2D06FF4C052D142EED09DF8061001290DD1BDF80410A1F5F9 -:2083E0002851062907D200E028E0DFE801F0030304030303DCE79DF80A1001290ED1BDF819 -:208400000810B1F5245FD3D0A1F524510239CFD00129CDD0022901D1CAE7FFDF606878B947 -:20842000002305AA2946304605F094FD10B1FEF790FBBDE79DF81400800601D41020B7E748 -:208440006188224628466368FFF7BAFDB0E72DE9F043814687B08846144610460BF026FF69 -:2084600018B1102007B0BDE8F083002306AA4146484605F06FFD10B1FEF76BFBF2E79DF861 -:208480001800C00602D543F20140EBE70025072705A8019500970295CDE9035062884FF6E3 -:2084A000FF734146484605F0D3FC060013D160680BF0FCFE60B960680195CDE902500097B4 -:2084C0000495238862884146484605F0C1FC0646BDF8140020803046CEE739B1834B0A887D -:2084E0009B899A4202D843F20300704719E610B586B07E4C0423ADF81430638943B1A489D2 -:208500008C4201D2914205D943F2030006B010BD0620FBE7ADF81010002100910191ADF898 -:20852000003002218DF8021005A9029104A90391ADF812206946FFF7F4FDE7E72DE9FC473B -:2085400081460E4608460BF08BFE88BB4846FAF7D1FD5FEA00080AD098F80000222829D39D -:208560000421484608F07AFA070005D103E043F20200BDE8FC87FFDF07F1140004F061FA84 -:2085800005463078012803D0022804D00720F0E7A8070FD502E015F0340F0BD0B079341DDE -:2085A000C00709D0E08838B1A0680BF059FE18B11020DEE70820DCE732782088002628B374 -:2085C000A0F201130721112B18D20CD2DFE803F00B090D0B1D0B121D100B0B1D1D1D1D0BE7 -:2085E0001D00022A11D10846C3E7012AFBD00CE0EA0600E0AA06002AF5DA06E0A0F5C07250 -:208600001F2A02D97D3A022AEDD8C6B200F0CDFE50B198F82300CDE90006FA892346394680 -:208620004846FEF7E3FCA4E71120A2E72DE9F04F8BB01F4615460C4683460026FAF75AFDBA -:2086400028B10078222805D208200BB090E543F20200FAE7B80801D00720F6E7032F00D1A0 -:2086600000274FF6FF79CCB1022D72D320460BF044FE30B904EB0508A8F101000BF03DFECD -:2086800008B11020E1E7AD1EAAB22146484605F05AFD38F8021C88425BD1ADB21349B80703 -:2086A00002D58889401C00E001201FFA80F8F80701D08F8900E04F4605AA4146584605F0BE -:2086C00014FB4FF0070A4FF00009D4B3204608E0408810283DD8361D304486B2AE4238D210 -:2086E000A01902884245F3D353E00000140300209DF8170002074CD594B304EB0608361D13 -:20870000B8F80230B6B2102B23D89A19AA4220D8B8F8002091421CD1C0061CD5CDE900A99C -:208720000DF1080C0AAAA11948468CE80700B8F800100022584605F061F920B1FEF709FA18 -:2087400083E726E005E0B8F80200BDF82810884201D00B2079E7B8F80200304486B207E0BA -:20876000FFE7C00604D55846FEF772FC002889D19DF81700BDF81A1020F010008DF81700AA -:20878000BDF81700ADF80000FF235846009A05F00DFC05A805F0B5FA18B9BDF81A10B94214 -:2087A000A6D90421584608F059F9040000D1FFDFA2895AB1CDE900A94D460023214658462A -:2087C000FEF714FC0028BBD1A5813EE700203CE72DE9FF4F8BB01E4617000D464FF00004A2 -:2087E00012D0B00802D007200FB0C1E4032E00D100265DB108460BF077FD28B93888691E67 -:2088000008440BF071FD08B11020EDE7C64AB00701D5D18900E00121F0074FF6FF7802D068 -:20882000D089401E00E0404686B206AA0B9805F05CFA4FF000094FF0070B0DF1140A38E078 -:208840009DF81B00000734D5CDF80490CDF800B0CDF80890CDE9039A434600220B9805F097 -:20886000F7FA60BB05B3BDF814103A8821442819091D8A4230D3BDF81E2020F8022BBDF811 -:20888000142020F8022BCDE900B9CDE90290CDF810A0BDF81E10BDF8143000220B9805F09D -:2088A000D7FA08B103209FE7BDF814002044001D84B206A805F025FA20B1822806D0FEF7FD -:2088C00048F991E7BDF81E10B142B9D934B17DB13888A11C884203D20C2085E7052083E721 -:2088E00022462946404605F02EFC014628190180A41C3C80002077E710B504460BF0D6FC1D -:2089000008B1102010BD8848C0892080002010BDF0B58BB00D460646142103A819F085F915 -:2089200001208DF80C008DF8100000208DF81100ADF814503046FAF7DDFB48B10078222837 -:2089400012D30421304608F089F8040005D103E043F202000BB0F0BDFFDF04F1140007468E -:2089600004F06FF8400601D40820F3E7207C022140F00100207409A80094CDE901100722C6 -:2089800003A930466368FEF7E7FA20B1217C21F001012174DEE729463046F9F708FD08A9AE -:2089A000384604F03DF800B1FFDFBDF82040172C01D2172000E02046A84201D92C4602E0C1 -:2089C000172C00D2172421463046FFF722FB21463046F9F708FA0020BCE7F8B51C4615465B -:2089E0000E46069F08F044F92346FF1DBCB231462A46009407F0DBFCF8BD70B50C46054696 -:208A00000E21204619F0EFF8002020802DB1012D01D0FFDF70BD062000E00520A07170BDC0 -:208A200010B548800878134620F00F00001D20F0F00080300C4608701422194604F1080088 -:208A400019F09FF800F0B4FC3748046010BD2DE9F047DFF8D890491D064621F00301174676 -:208A60000C46D9F8000007F01AFE050000D1FFDF4FF000083560A5F800802146D9F80000DF -:208A800007F00DFE050000D1FFDF7560A5F800807FB104FB07F1091D0BD0D9F8000007F03E -:208AA000FEFD040000D1FFDFB460C4F80080BDE8F087C6F80880FAE72DE9F0411746491D6B -:208AC00021F00302194D064601681446286807F011FE22467168286807F00CFE3FB104FBB4 -:208AE00007F2121D03D0B168286807F003FE042007F05EFF0446042007F062FF201A012839 -:208B000004D12868BDE8F04107F0BEBDBDE8F08110B50C4605F0B5F800B1FFDF2046BDE83F -:208B20001040FEF716B80000140300201400002010B50C460246817B808819B151898142ED -:208B400000D908462080D18800F0C5FF032800D30320C1B22088BDE8104000F0B1BF10B5EB -:208B60000C460246817B808819B11189814200D908462080D18800F0AEFF022800D3022054 -:208B8000C1B2208800F09CFF401CC0B210BD2DE9F04F0C00F84999B08146D1E90201CDE96F -:208BA0000C0109F10300F54E20F003010091357E05F1010504D1E8B209F054FB00B1FFDFCE -:208BC00000984FF0000B00EB0510C01C20F0030100915CB9707A327A81F800B01044C2B296 -:208BE000B08B80B204F0D5FE00B1FFDF0098F169084400902146684600F02CFF0098C01C40 -:208C000020F003000090737A327AB17A04B1002007F016FE0099084400902146684600F093 -:208C20006EFF00273D46B24696F801800CE0284600F0F3FE064681788088F9F76EF971784E -:208C40006D1C00FB0177EDB24545F0D10098C01C20F00300009004B100203946F9F768F972 -:208C600000990027084400903D469AF801800CE0284600F0D2FE0646C1788088FEF773FCB7 -:208C800071786D1C00FB0177EDB24545F0D10098C01C20F00300009004B100203946FEF7A5 -:208CA0006BFC00994FF000080844009045469AF801700EE0284600F0B0FE0646807B30B1E1 -:208CC00006F1080001F0F9FE727800FB02886D1CEDB2BD42EED10098C01C20F00300009041 -:208CE00004B10020414601F0ECFE00990844C01D20F007000090E4BBA24AA1491160111DC0 -:208D0000401E086001222C219F4807F062FCFAF72EF99E484178806805F09CFB42208DF8CF -:208D200004009A480C30C0788DF8060010B1012804D005E001208DF8060001E08DF806B0E3 -:208D400001A806F0C5FE10B10EA805F042FC00211E22084603F03CF8FBF778F987480CAA49 -:208D600000210C30F8F706FB00B1FFDF9AF8190000E015E0FEF769FF00B1FFDF7F484FF4A1 -:208D8000F671443018F051FF7C480421443080F8E91180F8EA11062180F8EB11032101712D -:208DA000009919B0A1EB0900BDE8F08F70B5734C06464434207804EB4015E078083590B936 -:208DC000A01990F8E80100280ED0A0780F2800D3FFDF2021284618F028FF687866F302004A -:208DE00068700120E070284670BD2DE9F04105460C4600270078052190463E46B1EB101FC1 -:208E000000D0FFDF287A58B101280FD0FFDF00BFA8F800600CB1278066800020BDE8F081D4 -:208E20000127092674B16888A08008E00227142644B16888A0802869E060A88A2082287B0E -:208E40002072E5E7A8F80060E7E710B54F4C6068C11D21F00701814200D0FFDF47480121A5 -:208E600000220170427001720323437281720273052282821F22C282417345A202610A221D -:208E8000027641764FF4B061C1616168416010BD30B53E4C1568636810339D4202D2042025 -:208EA000136030BD354B5D785A6802EB0512107051700320D080172090800120D0709070DB -:208EC000002090735878401C5870606810306060002030BD70B5064628480024457807E0FD -:208EE000204600F09AFD0178B14204D0641CE4B2AC42F5D1002070BDF7B5064608780C4664 -:208F000008B3FFF7E7FF0546202E08D0232E17D0212E41D0222E3FD0242E2BD114E000F020 -:208F200087FD0DB1697800E00021401A81B2A0780144FF291ED830B1A08802282CD219E0DB -:208F40006088172828D215E0227A2AB36188172910D3A08817280DD3A3795BB1E3794BB1AF -:208F6000402A07D84FF6FB72914201D8904213D90420FEBD0720FEBD342002003004002021 -:208F80000000002000060240600600201C0000206E5246357800000065B9207802AA012170 -:208FA000FFF776FF0028E6D12078FFF793FF050000D1FFDF203E052E18D2DFE806F0030B4D -:208FC0000E081100A0786870A088E8800FE06088A8800CE0A078A87009E0A078E87006E090 -:208FE00054F8020FA8606068E86000E0FFDF0020C1E700B597B053218DF8001000780BA945 -:2090000000F001008DF80200684605F023F817B000BD00B5017897B001F001018DF8021097 -:20902000417801F001018DF803100178C1F340018DF804104178C1F340018DF80510017824 -:2090400089088DF80610417889088DF8071081788DF80810C1788DF8091000798DF80A0089 -:209060004D208DF800000BA9684604F0F3FFCEE72DE9F04FDFF8F883FE4C97B000271BE0A7 -:20908000012000F07FFD0120FFF790FE0546FA4807F0C8FA686000B9FFDF686805F027F815 -:2090A000A0B12846FAF7CEFA284600F071FD18B9F148696807F0BFFA94F9E9010428DFDA85 -:2090C000022007F075FC06460025AAE0EA48696807F0B1FAF4E7B8F802104046491C89B2A3 -:2090E000A8F80210B14201D3002141800221B8F8020007F0B3FC00286BD0B8F80200542110 -:209100008DF80010ADF802000BA9684604F0A2FF00B1FFDF9DF8300010F0010F0FD0B8F829 -:20912000020007F0B7FD5FEA000900D1FFDF484606F0A3FF18B1B8F8020002F065F9B8F8E0 -:20914000020007F095FD5FEA000900D1FFDF484606F08CFFE8BB0321B8F8020007F07EFC8A -:209160005FEA000B48D1FFDF46E000BFDBF8100010B10078FF2849D0022000F003FD02202F -:20918000FFF714FE8246484607F0A2F8CAF8040000B9FFDFDAF8040007F07CF90021009090 -:2091A0000170B8F802105046AAF8021001F032FE484607F071F900B9FFDF504600F0E8FC21 -:2091C00018B99AF80100000704D50098CBF8100012E024E0DBF8100038B10178491C11F03F -:2091E000FF01017008D1FFDF06E000221146484600F011FC00B9FFDF94F9EA01022805DB44 -:20920000B8F8020001F0CAFD0028AFD194F9E901042804DB484607F0B5F900B101276D1C25 -:20922000EDB2B54204D294F9EA010228BFF653AF002F7FF423AF17B00320BDE8F04F00F037 -:20924000A1BC10B58A4CA0600868E060AFF2DF1002F031FD607010BD86480021443801703D -:209260008348017085494160704730B505464FF080500C46D0F8A41097B0491C05D1D0F835 -:20928000A810C9430904090C08D050F8A01F01F0010129704168216080680EE02B208DF8AD -:2092A00000000BA9684604F0D5FE00B1FFDF012028700C982060BDF83400A0802878002848 -:2092C00003D0607940F0C000607117B030BDF0B54FF080540746D4F8800097B00D462B2631 -:2092E000401C0BD1D4F88400401C07D1D4F88800401C03D1D4F88C00401C0BD0D4F8800053 -:209300003860D4F884007860D4F88800B860D4F88C0016E08DF82C6069460BA804F09AFED4 -:2093200000B1FFDF01983860029878608DF82C6069460BA804F08EFE00B1FFDF0198B860C8 -:209340000298F860D4F89000401C0BD1D4F89400401C07D1D4F89800401C03D1D4F89C00F7 -:20936000401C08D054F8900F286060686860A068A860E06816E08DF800600BA9684604F02D -:2093800069FE00B1FFDF0C9828600D9868608DF800600BA9684604F05DFE00B1FFDF0C9875 -:2093A000A8600D98E86017B0F0BD32480079FDE470B5304CE07830B3207804EB4010407A03 -:2093C00000F00700204490F9E801002800DCFFDF2078002504EB4010407A00F00700011917 -:2093E00091F8E801401E81F8E8012078401CC0B220700F2800D12570A078401CA0700AF02A -:209400001BFBE57070BDFFDF70BD3EB50546032107F024FB0446284607F02AFC054604B954 -:20942000FFDF206918B10078FF2800D1FFDF01AA6946284600F0EFFA60B9FFDF0AE000220A -:2094400002A9284600F0E7FA00B9FFDF9DF8080000B1FFDF9DF80000411E8DF80010EED216 -:2094600020690199884201D1002020613EBD00001C0000207404002060060020681300209C -:2094800070B50546A0F57F400C46FF3800D1FFDF012C01D0FFDF70BDFFF787FF040000D176 -:2094A000FFDF207820F00F00401D20F0F0005030207065800020207201202073BDE870400A -:2094C00076E72DE9F04116460D460746FFF76DFF040000D1FFDF207820F00F00401D20F0B3 -:2094E000F0005030207067800120207228682061A888A0822673BDE8F04159E730B599B092 -:20950000FFF7E8FC040000D1FFDF0CA92046FFF70FFB05460BA92046FFF721FB0146522073 -:209520008DF80000BDF830008DF80250001DADF80400BDF82C008DF80310001DADF80600E3 -:20954000E088ADF808000DA9684604F083FD002800D0FFDF19B030BD2DE9F047DFF80094DA -:209560000546002799F8000010B10820BDE8F08728460AF09BFE08B11020F7E7F94C20783E -:2095800008B9FFF762FC607A217A0844C6B200F04FFAB04207D2301AC1B22A460020FFF736 -:2095A00077FC0700E2D1D9F804004E46C01C20F00300C9F8040000F05EFB716800EB01084B -:2095C00001214046FFF7E3FA064629684044884202D8B6F5803F15D328600020FFF77AFCA5 -:2095E00005000DD005F11300D9F8041020F003004E46884200D0FFDF6078401E60707560A1 -:209600000420B3E700214046FFF7C1FA0446A64200D0FFDF04EB0801C9F8041029604FF6B9 -:20962000FF71A9F80210012189F8001038469DE72DE9F0410446CA4817460D46007810B1C6 -:209640000820BDE8F08108460AF00AFE08B11020F7E7C44E307808B9FFF7F7FB601E1E288E -:2096600007D8012C3FD12878FE283CD830760020E7E7A4F120001F2805D8E0B23A46294606 -:20968000BDE8F04138E4A4F140004FF000081F2821D8402C02D0412C25D117E06878297863 -:2096A0004418A97881421ED8FF2C08D808F0BEFF07460AF07BF9381A801EA04201DA12201A -:2096C000BFE728883081A878B07224E02846BDE8F04100F085BAA4F1A0001F2803D8A02CA7 -:2096E00003D0A12C06D00720ABE7287800F00100707610E029680920F829A2D38A07A0D182 -:20970000727B02F00302012A04D1F28AD73293B28B4296D8F161404693E72DE9F0478146FA -:209720000E4608460AF0C2FD48B948460AF0DCFD28B909F1030020F00301494501D01020EB -:2097400014E788484FF0000A4430817869B14178804600EB411408343788324600212046B5 -:2097600000F024FA050004D027E0A6F800A00520FCE6B9F1000F24D03088B84201D90C254C -:209780001FE0607800F00705284600F0FBF908EB0507324697F8E8014946401C87F8E80162 -:2097A000204607F5F47700F001FA05463878401E3870032000F0E6F92DB10C2D01D0A6F878 -:2097C00000A02846D2E66078654F00F00701012923D002290CD0032932D0FFDF98F801106E -:2097E0004046491CC9B288F801100F2933D034E0616821B1000702D46088FFF706FE98F839 -:20980000EA014646012802D1787802F073FA96F9EA010428E2DBFFDFE0E7616811B1524859 -:2098200006F009FF98F8E9014646032802D1787802F060FA96F9E9010428CFDBFFDFCDE709 -:20984000C00602D56088FFF7E0FD98F9EB010628C4DBFFDFC2E780F801A08178491E817075 -:20986000617801F0070101EB080090F8E811491C80F8E811A5E770B50D4604460AF0F0FC97 -:2098800018B928460AF012FD08B1102070BD29462046BDE8704008F01CBD70B504461546A5 -:2098A0000E4608460AF0DCFC18B928460AF0FEFC08B1102070BD022C03D0102C01D00920B4 -:2098C00070BD2A463146204608F026FD0028F7D0052070BD70B514460D4606460AF0C0FCDE -:2098E00038B928460AF0E2FC18B920460AF0FCFC08B1102070BD22462946304608F02BFD85 -:209900000028F7D0072070BD10B596B004460AF0CDFC10B1102016B010BD0F208DF80000B4 -:209920000BA9684604F096FB0028F4D19DF834002070BDF836006080BDF83800A080002002 -:20994000E9E770B505460C4608460AF0CDFC20B974B120680AF0AAFC40B1102070BD0000F0 -:209960001C0000203004002060060020A08828B121462846BDE87040FDF774BE0920EDE783 -:2099800070B504460D4608460AF06AFC30B9601E1E2814D828460AF063FC08B11020DDE74A -:2099A000022C01D90720D9E704B9FFDFE64800EB840050F8041C2846BDE870400847A4F171 -:2099C00020001F28EED829462046BDE87040FAF77FBA70B504460D4608460AF067FC30B9B0 -:2099E000601E1E280DD828460AF03AFC08B11020B4E7012C01D0022C01D10620AEE70720BC -:209A0000ACE7A4F120001F28F9D829462046BDE87040FAF7E1BA06F0E4BA30B5CB4D044655 -:209A20006878A04200D8FFDF686800EB041030BD70B5C64800252C46467807E02046FFF727 -:209A4000ECFF4078641C2844C5B2E4B2B442F5D1284683E72DE9F0410C46064600F043F9C5 -:209A600007463068C01C20F0030232601CBBB7483B46092120300AF0CDFA002408E0092CAB -:209A800011D2DFE804F005070509090B05050700AF4804E0AF4802E0AF4800E0AF480AF06D -:209AA000D9FA054600E0FFDFA54200D0FFDF641CE4B2092CE3D3306800EB07103060C0E565 -:209AC000021D5143452900D245210844C01CB0FBF2F0C0B2704700B597B055228DF8002037 -:209AE000001DADF80200ADF804100BA9684604F0B1FA00B1FFDFBDF8300017B000BD2DE9DA -:209B0000FC5F064691484FF000088B464746444690F8019022E02046FFF77FFF050000D1CB -:209B2000FFDF687869463844C7B22846FFF700F8824601A92846FFF712F80346BDF8040085 -:209B40005246001D81B2BDF80000001D80B206F0DBFF6A78641C00FB0288E4B24C45DAD190 -:209B60003068C01C20F003003060BBF1000F00D000204246394606F0D5FF316808443060DD -:209B8000BDE8FC9F7149443108710020C87070476E494431CA782AB10A7801EB421108318B -:209BA000814201D001207047002070472DE9F04106460078154600F00F0400201080601ECB -:209BC0000F46052800D3FFDF5F482A46103000EB8400394650F8043C3046BDE8F0411847DA -:209BE00038B50446407800F00300012803D002280BD0072038BD606858B10AF07EFBD0B999 -:209C000060680AF071FB20B915E060680AF028FB88B969462046FCF7A9F90028EAD16078BD -:209C200000F00300022808D19DF8000028B160680AF05AFB08B1102038BD6189F8290DD8DB -:209C4000208988420AD8607800F003023F48012A06D1D731C26989B28A4201D2092038BD2E -:209C600094E80E0000F10C0585E80E000AB900218182002038BD2DE9F05F4FF000093348B9 -:209C8000C8464F464E464D46CB464C4690F801A011E02046FFF7C1FE4178827809F101096B -:209CA000884412FB0177C27812FB0166807B10FB0155641CE4B25445EBD10BEB890000EB74 -:209CC000C80000EB870000EB860000EBC5011F48027A01EBC201427A807A01EBC20101EB45 -:209CE000C000BDE8F09F2DE9F047DFF8609000252C4699F8092099F8081099F801700A4412 -:209D0000D6B299F80A20114401F0FF0808E02046FFF783FE817B407811FB0055641CE4B2C3 -:209D2000BC42F4D199F80800401C304430444044401C0EB1012100E0002108444419FF2CED -:209D400000D9FFDFE0B211E43420020030040020633D00008DAB0000592F00003120010069 -:209D60002DE9F041074614468846084601F02EFD064608EB88001C22796802EBC0000D1805 -:209D8000688C58B14146384601F028FD014678680078C200082305F120000CE0E88CA8B150 -:209DA0004146384601F021FD0146786808234078C20005F1240006F0F4FC38B10621217220 -:209DC0006681D0E90010C4E9031009E0287809280BD00520207266816868E0600020287018 -:209DE0002046BDE8F04101F0E7BC072020726681F4E72DE9F04116460D460746406801EB41 -:209E000085011C2202EBC1014418204601F00FFD40B10021708865F30F2160F31F410820A3 -:209E20000AF0D2F909202070324629463846BDE8F04195E72DE9F0410E46074600241C21A4 -:209E4000F07816E004EB8403726801EBC303D25C6AB1FFF7AAFA050000D1FFDF6F802A46AC -:209E600021463046FFF7C5FF0120BDE8F081641CE4B2A042E6D80020F7E770B506460024CB -:209E80001C21C0780AE000BF04EB8403726801EBC303D5182A782AB1641CE4B2A042F3D875 -:209EA000402070BD2821284617F09DFE706880892881204670BD70B5034600201C25DC787C -:209EC0000DE000BF00EB80065A6805EBC6063244167816B1128A8A4204D0401CC0B284424C -:209EE000F0D8402070BDF0B5044600201C26E5780EE000BF00EB8007636806EBC7073B4437 -:209F00001F788F4202D15B78934204D0401CC0B28542EFD84020F0BD0078032801D000208D -:209F20007047012070470078022801D000207047012070470078072801D000207047012000 -:209F400070472DE9F041064688461078F1781546884200D3FFDF2C781C27641CF078E4B2BD -:209F6000A04201D8201AC4B204EB8401706807EBC1010844017821B14146884708B12C7034 -:209F800073E72878A042E8D1402028706DE770B514460B880122A240134207D113430B80BB -:209FA00001230A22011D06F0C6FB047070BD2DE9FF4F81B00878DDE90E7B9A4691460E466C -:209FC00040072CD4019806F065FE040000D1FFDF07F1040820461FFA88F105F0A9FE0500F8 -:209FE00000D1FFDF204629466A4606F092F90098A0F80370A0F805A0284606F04BFA0178AA -:20A0000069F306016BF3C711017020461FFA88F105F0DEFE00B9FFDF019804F07CF906EBE3 -:20A020000900017F491C017705B0BDE8F08F2DE9F84F0E469A4691460746032106F00EFD07 -:20A040000446008DDFF8B085002518B198F80000B0421ED1384606F01DFE070000D1FFDF79 -:20A0600009F10401384689B205F062FE050010D0384629466A4606F04CF9009800210A460D -:20A080000180817004F00AFA0098C01DCAF8000021E098F80000B04216D104F1260734F867 -:20A0A000341F012000FA06F911EA090F00D0FFDF2088012340EA090020800A22391D3846D3 -:20A0C00006F054FB067006E0324604F1340104F12600FFF75CFF0A2188F800102846BDE803 -:20A0E000F88FFEB514460D46064602AB0C220621FFF79DFF002826D00299687812220A7052 -:20A10000801C487008224A80A870208888806088C880A0880881E088488100240C20CDE917 -:20A1200000040523062229463046FFF740FF214666F31F41F0230022012009F09BFF6878C8 -:20A14000801C68700120FEBDFEB514460D460622064602AB1146FFF76AFF002812D0029BD1 -:20A16000132000211870A8785870022058809C800620CDE900010246052329463046FFF7DD -:20A1800016FF0120FEBD2DE9FE430C46804644E002AB0E2207214046FFF749FF002841D039 -:20A1A00060681C2267788678BF1C06EB860102EBC101451802981421017047700A2141807A -:20A1C000698A0181E98A4181A9888180A9898181304601F0FBFA029905230722C8806F7000 -:20A1E0000420287000250E20CDE9000521464046FFF7DDFE294666F30F2168F31F41F02311 -:20A200000022082009F036FF6078FC49801C607062682046921CFFF794FE606880784028AF -:20A22000B6D10120BDE8FE83FEB50D46064638E002AB0E2207213046FFF7F9FE002835D051 -:20A2400068681C23C17801EB810203EBC2028418029815220270627842700A224280A28911 -:20A260004281A2888281084601F0B0FA014602988180618AC180E18A0181A088B8B1002059 -:20A28000207000210E20CDE900010523072229463046FFF78CFE6A68D9492846D21CFFF72C -:20A2A00050FE6868C0784028C2D10120FEBD0620E6E72DE9FE430C46814644E0204601F093 -:20A2C000A0FAD0B302AB082207214846FFF7AFFE0028A7D060681C2265780679AD1C06EB76 -:20A2E000860102EBC10147180298B7F8108006210170457004214180304601F067FA0146AE -:20A30000029805230722C180A0F804807D70082038700025CDE9000521464846FFF747FE28 -:20A32000294666F30F2169F31F41F0230022082009F0A0FE6078801C60706268B149204607 -:20A34000121DFFF7FEFD606801794029B6D1012068E72DE9F34F83B00E4680E0304601F095 -:20A3600050FA002875D071681C2091F8068008EB880200EBC2000C184146304601F035FA97 -:20A380000146A078C30070684078C20004F1240006F023FA07468088E18B401A80B20025AB -:20A3A00081B3AA46218B814200D808468146024602AB07210398FFF73AFE010028D0BAF193 -:20A3C000000F03D0029AB888022510808B46E28B3968A9EB05001FFA80FA0A440398009282 -:20A3E00006F058FCED1D009A59465346009506F017F8E08B504480B2E083B988884209D124 -:20A40000012508E0FFE7801C4FF0010A80B2C9E7002009E60025CDE90095238A07223146B4 -:20A420000398FFF7C4FDE089401EE0818DB1A078401CA0707068F178427811FB02F1CAB26A -:20A44000816901230E3006F076F980F800800020E08372686C493046921DFFF772FD7068DF -:20A46000817940297FF47AAF0120DDE570B5064648680D4614468179402910D104EB840174 -:20A480001C2202EBC101084401F0F2F9002806D06868294684713046BDE8704059E770BD3D -:20A4A000FEB50C460746002645E0204601F0A9F9D8B360681C22417901EB810102EBC1019E -:20A4C0004518688900B9FFDF02AB082207213846FFF7ADFD002833D00299607816220A702A -:20A4E000801C4870042048806068407901F06EF9014602980523072281806989C1800820B5 -:20A50000CDE9000621463846FFF751FD6078801C6070A88969890844B0F5803F00D3FFDF8E -:20A52000A88969890844A8816E81626837492046521DFFF706FD606841794029B5D10120EA -:20A54000FEBD30B5438C458BC3F3C704002345B1838B641EED1AC38A6D1E1D4495FBF3F3DC -:20A56000E4B22CB1008918B1A04200D8204603444FF6FF70834200D3034613800C7030BD1E -:20A580002DE9FC41074616460D46486802EB86011C2202EBC101441801AA69462046FFF749 -:20A5A000D0FFA1896389BDF80420C81880B282421FD001280AD99DF800C0BCF1000F03D028 -:20A5C000B4F808C0844501D8002B12D0501A00D5002060816868407940280AD1204601F0F5 -:20A5E0003DF9002805D06868294646713846FFF757FFBDE8FC8100002C000020199F000042 -:20A60000279F0000359F000071B800005DB800002DE9FE4F8946804615465088032106F01D -:20A620001DFA8346B8F80200402801D2402000E0403880B282460146584601F0E2F80028C3 -:20A640007ED00AEB8A001C22DBF8041002EBC0000C18204601F0EBF8002877D1B8F80000DD -:20A66000E18A88423CD8A189D1B348456ED100265146584601F0B2F8218C0F18608B48B961 -:20A68000B9F1020F62D3B8F804006083618A884226D80226A9EB06001FFA80F9B888A28BBF -:20A6A000801A002814DD4946814500DA084683B268886968029139680A44CDE9003206F014 -:20A6C000D7FADDE90121F61D009B009605F06FFEA18B01EB090080B2A083618B884207D90F -:20A6E000688803B052465946BDE8F04F01F0DDB81FD14FF009002872B8F802006881D7E9E9 -:20A700000001C5E90401608BA881284601F054F85146584601F062F80146DBF804000823FD -:20A720000078C20004F1200006F03BF80020A0836083A0890AF0FF02401EA081688800E008 -:20A7400004E003B05946BDE8F04F19E7BDE8FE8F2DE9F041064615460F461C46184609F0B1 -:20A760007FFD18B9206809F0A1FD08B1102007E47168688C0978B0EBC10F01D3132005E4F0 -:20A780003946304601F02AF80146706808230078C20005F1200005F0CEFFD4E90012C0E9DD -:20A7A00000120020E3E710B50446032106F056F90146007800F00300012804D08A8A2046FC -:20A7C000BDE81040C0E42046BDE8104001F1140287E470B50446032106F040F905460146BE -:20A7E0002046FFF766FD002816D029462046FFF757FE002810D029462046FFF715FD00285F -:20A800000AD029462046FFF7BEFC002804D029462046BDE870409CE570BD2DE9F0410C466C -:20A8200080461EE0E178427811FB02F1CAB2816901230E3005F0B5FF077860681C22C17912 -:20A84000491EC17107EB8701606802EBC10146183946204600F0D5FF18B1304600F0E0FF59 -:20A8600020B16068C1790029DCD180E7FEF79DFD050000D1FFDF0A202872384600F0A6FFAE -:20A8800068813946204600F0B0FF0146606808234078C20006F1240005F083FFD0E900103C -:20A8A000C5E90310A5F80280284600F085FFB07800B9FFDFB078401EB07058E770B50C46BB -:20A8C0000546032106F0CAF801464068C2792244C2712846BDE870409FE72DE9FE4F82461A -:20A8E000507814460F464FF0000800284FD0012807D0022822D0FFDF2068B8606068F86099 -:20A9000024E702AB0E2208215046FFF790FB0028F2D00298152105230170217841700A2147 -:20A920004180C0F80480C0F80880A0F80C80628882810E20CDE90008082221E0A67830461E -:20A9400000F044FF054606EB86012C22786802EBC1010822465A02AB11465046FFF767FB68 -:20A960000028C9D0029807210170217841700421418008218580C680CDE9001805230A46F9 -:20A9800039465046FFF713FB87F80880DEE6A678022516B1022E13D0FFDF2A1D914602AB0B -:20A9A00008215046FFF743FB0028A5D002980121022E0170217841704580868002D005E0DE -:20A9C0000625EAE7A188C180E1880181CDE900980523082239465046D4E710B50446032183 -:20A9E00006F03CF8014600F108022046BDE8104073E72DE9F05F0C4601281DD0957992F8D1 -:20AA00000480567905EB85011F2202EBC10121F0030B08EB060111FB05F14FF6FF7202EAC0 -:20AA2000C10909F1030115FB0611F94F21F0031A40B101283DD124E06168E57891F8008056 -:20AA40004E78DFE75946786805F029FE606000B9FFDF5946606817F0E8F8E570514678685E -:20AA600005F01DFE6168486100B9FFDF6068426902EB09018161606880F800806068467033 -:20AA800017E0606852464169786805F033FE5A466168786805F02EFE032005F089FF04465B -:20AAA000032005F08DFF201A012802D1786805F0EBFD0BEB0A00BDE8F09F02460021022040 -:20AAC00097E713B5009858B10024684605F0C9FDCF490A22002C0A7001D1009A4A601CBD29 -:20AAE00001240020F2E770B50C4615463821204617F09BF8012666700A2104F11C0017F0CD -:20AB000094F805B9FFDF297A207861F301002070A879002817D02A4621460020FFF769FF68 -:20AB20006168402088706168C87061680871616848716168887161682888088161686888B2 -:20AB400048816068868170BDC878002802D0002201204EE7704770B50546002165F31F417E -:20AB6000012009F031FB0321284605F077FF040000D1FFDF21462846FFF75CF9002804D0C3 -:20AB8000207840F010002070012070BD2DE9FF4180460E460F0CFEF708FC050007D06F80B0 -:20ABA0000321384605F05AFF040008D106E004B03846BDE8F0411321F9F72EBEFFDFB8F143 -:20ABC000010F05D0B8F1080F18D0FFDFBDE8FF8120782A4620F0080020700020ADF802006E -:20ABE00002208DF800004FF6FF70ADF80400ADF8060069463846F9F717F9E7E7C6F30721CA -:20AC000001EB81021C23606803EBC202805C042803D008280AD0FFDFD8E7012000904FF496 -:20AC200040432A46204600F009FECFE704B02A462046BDE8F041FFF7DCB82DE9F05F002798 -:20AC4000B0F80A9090460C4605463E46B9F1400F01D2402001E0A9F140001FFA80FA287A9F -:20AC6000C01E08286BD2DFE800F00D04192058363C4772271026002C6CD0D5E90301C4E9D1 -:20AC800002015CE070271226002C63D00A2205F10C0104F1080016F074FF50E071270C26A8 -:20ACA000002C57D0E868A06049E0742710269CB3D5E90301C4E902016888032105F0CEFE61 -:20ACC0008346FEF772FB02466888508051465846FFF746F833E075270A26ECB1A88920818A -:20ACE0002DE076271426BCB105F10C0004F1080307C883E8070022E07727102664B1D5E917 -:20AD00000301C4E902016888032105F0A7FE01466888FFF782FD12E01CE073270826CCB1F2 -:20AD20006888032105F09AFE01460078C00606D56888FFF77FF810B96888F8F767FCA8F80A -:20AD400000602CB12780A4F8069066806888A0800020B0E6A8F80060FAE72DE9FC410C46AB -:20AD60001E4617468046032105F078FE05460A2C0AD2DFE804F00505050505050909090765 -:20AD8000042303E0062301E0FFDF0023CDE90076224629464046FFF70AF92AE438B50546D6 -:20ADA000A0F57F40FF3830D0284605F061FF040000D1FFDF204605F08BFA002815D001465E -:20ADC0006A46204605F0A5FA00980321B0F80540284605F043FE0546052C03D0402C05D2EA -:20ADE000402404E0007A80B1002038BD403CA4B2214600F006FD40B1686804EB84013E228A -:20AE000002EBC101405A0028EFD0012038BD00002C0000202DE9F04F044689B0408805F00B -:20AE200027FF050000D1FFDF06AA2846616800F0C1FC069D001F81B235F8032F6B888A4291 -:20AE400005D1042B0AD0052B1DD0062B15D022462846FFF7DDFB09B0BDE8F08F16462D1DB9 -:20AE6000224629463046F7F78CFA0828F3D1224629463046FCF73DFCEDE76088291D6368D7 -:20AE8000FAF7F0FCE7E717466088032105F0E6FD4FF000088DF804800646ADF80680042FCC -:20AEA000D9D36A79002AD6D028794FF6FF794FF01C0A13282CD008DC012878D0062847D09F -:20AEC000072875D0122874D106E0142872D0152871D016286DD1ACE10C2F6AD1307800F086 -:20AEE0000301012965D040F0080030706879B07001208DF804002889ADF808006889ADF878 -:20AF00000A00A889ADF80C00E889ADF80E0019E0B07890429FD1307801079CD5062F9AD1FD -:20AF200020F0080030706088414660F31F41012009F04AF902208DF80400ADF80890288941 -:20AF4000ADF80A006088224601A9F8F76DFF82E7082F80D12F89B5F80A90402F01D240205B -:20AF600001E0A7F1400080B280460146304600F048FC08B3716808EB88002C2202EBC00025 -:20AF8000095A4945E3D1FE4807AAD0E90210CDE9071068798DF81C0008F0FF058DF81E500C -:20AFA00060883146FFF799FC2246294639E0B6E014E03CE039E0E6E0F148D0E90010CDE97A -:20AFC00007106879ADF820708DF81C00ADF82290608807AA3146FFF780FC3CE7082FB6D1E9 -:20AFE0006889B5F80880402801D2402000E0403887B23946304600F004FC0028A7D007EB89 -:20B00000870271680AEBC2000844028A42459ED1017808299BD140786979884297D1F9B2BC -:20B0200022463046FEF7E5FE15E70E2F07D0CDF81C80CDF8208068798DF81C00C8E7698961 -:20B04000EF898B46B5F80C903046FEF734FFABF14001402901D309204AE0B9F1170F01D3AF -:20B06000172F01D20B2043E040280ED000EB800271680AEBC20008440178012903D14078AB -:20B0800069798842A9D00A2032E03046FEF7F5FE014640282BD001EB810372680AEBC30045 -:20B0A00002EB0008012288F800206A7988F8012070682A894089B84200D938462D8A0323D2 -:20B0C0002372A282E7812082A4F80C906582084600F07CFB6081A8F81490A8F81870A8F8EC -:20B0E0000E50A8F810B0204600F066FBB3E6042005212172A4F80A80E08101212173A0493F -:20B10000D1E90421CDE9072169798DF81C10ADF81E00608807AA3146FFF7DFFBE3E7062F3D -:20B12000E4D3B078904215D13078010712D520F0080030706088414660F31F41012009F0ED -:20B1400043F802208DF804002889ADF80800ADF80A90F7E604213046FEF7C5FE0546402889 -:20B16000C4D002208303009022462946304600F065FB4146608865F30F2160F31F41082094 -:20B1800009F022F867E60E2FB0D104213046FEF7AAFE81464028A9D04146608869F30F21B6 -:20B1A00060F31F41082009F00FF8288A0790E88900907068AF894089B84200D93846834677 -:20B1C000B5F80A8028890590484600F0FFFA6081079840B10220079B009022464946304649 -:20B1E00000F02CFB37E6B8F1170F1ED3172F1CD30420207200986082E781A4F810B0A4F896 -:20B200000C8009EB890271680AEBC2000D1800990598A5F81480A5F818B0E9812882204628 -:20B2200000F0CAFA0620287015E601200B230090D3E7082FA6D129893046FEF73CFE0746B6 -:20B2400040289FD007EB870271680AEBC2000844804600F0ECFA002894D16D89B8F80E00E3 -:20B260002844B0F5803F05D360883A46314600F01CFBF0E5002D85D0A8F80E0060883A46D3 -:20B280003146FFF7F3F808202072384600F09EFA6081A58127E770B50D460646032105F0A4 -:20B2A000DDFB040004D02078000704D5112070BD43F2020070BD2A4621463046FEF711FF52 -:20B2C00018B9286860616868A061207840F008002070002070BD70B50D460646032105F0F1 -:20B2E000BDFB040004D02078000704D4082070BD43F2020070BD2A4621463046FEF724FF29 -:20B3000000B9A582207820F008002070002070BD2DE9F04F0E4691B08046032105F09EFB5E -:20B320000446404605F0B6FC07460020079008900990ADF830000A9002900390049004B97C -:20B34000FFDF0DF1080917BBFFDF20E038460BA9002204F046FE9DF82C0000F07F050A2D58 -:20B3600000D3FFDF6019017F491E01779DF82C0000060CD52A460CA907A8FEF708FE01E0EC -:20B380005C20020019F80510491C09F80510761EF6B2DBD204F13400FC4D04F1260BDFF836 -:20B3A000F0A304F12A07069010E05846069900F06EFA064628700A2800D3FFDF5AF826106A -:20B3C00040468847E08CC05DB04202D0208D0028EBD10A202870EE4D4E4628350EE00CA9A9 -:20B3E00007A800F054FA0446375D55F8240000B9FFDF55F82420394640469047BDF81E003A -:20B400000028ECD111B027E510B5032105F026FB040000D1FFDF0A2104F11C0016F005FC85 -:20B42000207840F00400207010BD10B50C46032105F014FB01190A7F01211AB9808EA1401D -:20B44000084000D0012010BD2DE9F84F894615468246032105F002FB070004D0284608F040 -:20B46000FFFE40B903E043F20200BDE8F88F484608F01CFF08B11020F7E7786828B169887E -:20B480000089814201D90920EFE7B9F800001C2418B1402809D2402008E03846FEF7EDFCE6 -:20B4A0008046402819D11320DFE7403880B280460146384600F0A5F948B108EB8800796863 -:20B4C00004EBC000085C012803D00820CDE70520CBE7FDF76AFF06000BD008EB8800796810 -:20B4E00004EBC0000C18B9F8000020B1E88910B113E01120B9E72888172802D3688817280E -:20B5000001D20720B1E7686838B12B1D224641463846FFF71DF90028A7D104F10C026946CD -:20B520002046FFF70EF8288860826888E082B9F8000030B102202070E889A080E889A0B12E -:20B540002BE003202070A889A08078688178402905D180F8028039465046FEF714FE404628 -:20B5600000F034F9A9F8000021E07868218B4089884200D908462083A6F802A0042030721D -:20B58000B9F800007081E0897082F181208B3082A08AB081304600F00FF97868C178402994 -:20B5A00005D180F8038039465046FEF73DFE00205BE770B50D460646032105F04FFA0400E9 -:20B5C00003D0402D04D2402503E043F2020070BD403DADB2294600F014F958B105EB8501E2 -:20B5E0001C22606802EBC101084400F020F918B1082070BD052070BD2A462146304600F094 -:20B6000054F9002070BD2DE9F0410D4616468046032105F023FA0446402D01D2402500E0CF -:20B62000403DADB28CB1294600F0EBF880B105EB85011C22606802EBC1014718384600F086 -:20B64000F6F838B10820BDE8F08143F20200FAE70520F8E733463A4629462046FFF778F885 -:20B660000028F0D1EAB221464046FEF789FF0020E9E72DE9F0410D4616468046032105F016 -:20B68000EDF90446402D01D2402500E0403DAFB224B1304608F0E4FD38B902E043F20200E9 -:20B6A000D1E7306808F0DCFD08B11020CBE73946204600F0A6F860B107EB87011C226068CA -:20B6C00002EBC1014518284600F0B1F818B10820B9E70520B7E7B088A98A884201D90C20C8 -:20B6E000B1E76168E88C4978B0EBC10F01D31320A9E73946204600F078F801466068082333 -:20B700004078C20005F1240005F015F8D6E90012C0E90012FAB221464046FEF7A7FE0020B4 -:20B7200091E72DE9F0470D461F4690468146032105F094F90446402D01D2402001E0A5F1E8 -:20B74000400086B23CB14DB1384608F0CDFD50B11020BDE8F08743F20200FAE76068C8B1A0 -:20B76000A0F80C8024E03146204600F04AF888B106EB86011C22606802EBC1014518284661 -:20B7800000F055F840B10820E3E700002C000020742002000520DCE7A5F80880F2B221468F -:20B7A0004846FEF7EDFE1FB1A8896989084438800020CEE704F0ADBD017821F00F01491CF2 -:20B7C00021F0F00110310170FDF7F2BD10B50446402800D9FFDF4034A0B210BD40684269FE -:20B7E0000078484302EBC0007047C2784068037812FB03F24378406901FB032100EBC10053 -:20B800007047C2788A4209D9406801EB81011C2202EBC101405C08B1012070470020704782 -:20B820000078062801D901207047002070470078062801D00120704700207047F0B401EB23 -:20B8400081061C27446807EBC6063444049D05262670E3802571F0BCFEF782BA10B5418975 -:20B8600011B1FFF7DDFF08B1002010BD012010BD10B5C18C8278B1EBC20F04D9C18911B13E -:20B88000FFF7CEFF08B1002010BD012010BD10B50C4601230A22011D04F083FF0078218835 -:20B8A000012282409143218010BDF0B402EB82051C264C6806EBC505072363554B681C796E -:20B8C000402C03D11A71F0BCFEF7F3BCF0BC704710B5EFF3108000F0010472B6E9484178AC -:20B8E000491C41704078012801D1F7F74BFB002C00D162B610BD70B5E24CE07848B9012597 -:20B90000E570FFF7E5FFF7F745FB20B1002008F09AF8002070BD4FF080406571C0F804531E -:20B92000F7E770B5EFF3108000F0010572B6D54C607800B9FFDF6078401E6070607808B945 -:20B94000F7F724FB002D00D162B670BDCD4810B5C17821B100214171C170FFF7E2FF0020B7 -:20B9600010BD10B50446F7F715FBC649C978084000D001202060002010BD2DE9F05FDFF8BB -:20B9800004934278817889F80620002689F80710074689F808600078354620B101280FD0F6 -:20B9A00002280FD0FFDFF7F702FB98B1F7F706FBB0420FD13046F7F705FB0028FAD047E02E -:20B9C0000126F0E7FFF784FFF7F7E4FA0028FBD00226E8E701208407E060C4F80451AA494A -:20B9E0000E600107D1F84412A74AC1F3423124321160A549343108604FF0020BC4F804B359 -:20BA0000A060DFF888A2DAF80010C94341F3001101F10108DAF8001041F01001CAF8001001 -:20BA200000E020BFD4F804010028FAD03046F7F7C9FA0028FAD0B8F1000F05D1DAF80010FB -:20BA400021F01001CAF80010C4F808B3C4F8045199F807004C4670B1387860B9F7F79AFAD4 -:20BA6000074608F09FF96FF0004117B1C4E9031001E0C4E9030116B12571BDE8F09F012776 -:20BA8000BE0727714FF01908C6F80883B761C6F80051C6F80C51C6F81051F7F77BFA10B11B -:20BAA000A770376100E02770FFF712FF7649A07920310860C6F80483DFE770B5050000D1C2 -:20BAC000FFDF4FF080424FF0FF30C2F808030021C2F80011C2F80411C2F80C11C2F81011E7 -:20BAE000684C6170F7F75CFA10B10120E07060702846BDE8704040E72DE9F05F6448D0F8B8 -:20BB000000B0634A6349083211608406D4F8080110B14FF0010801E04FF00008D4F8000114 -:20BB200000B101208146D4F8040108B1012600E00026D4F80C0100B101208246D4F8100165 -:20BB400008B1012700E0002748EA090126EA010020EA0A00B84300D0FFDF0025B8F1000F16 -:20BB600004D0C4F80851012007F06DFF5FEA0900DFF810814FF0010913D0C4F8005198F8D5 -:20BB8000050020B188F80550002007F05CFF98F8000030B1F7F7FEF918B188F80290C4F89B -:20BBA00010900EB1C4F80451BAF1000F0CD0C4F80C5198F80200464600B9FFDFB5703570E7 -:20BBC000C4F81490FFF7ADFE37B1C4F8105198F8040008B100F020F82D49091DC1F800B005 -:20BBE0004BE770B5274DE87808B9F7F7CFF901208407A061A87850B1D4F80C0120B9002003 -:20BC0000F7F7E0F90028F7D10020C4F80C014FF0FF30C4F8080370BD2DE9F041194C4FF037 -:20BC200080470125E079F0B1012803D0217A401E814218DAF7F7AEF9064608F0B3F8E17995 -:20BC4000012902D9217A491C21720EB1216900E0E168411A022902DA11F1020F0BDC0EB1BF -:20BC6000206100E0E060FFF733FEF7F793F928B13D61A57003E07D61BDE8F081257000206A -:20BC80002072F9E7380000201805004010ED00E010050240010000014FF0E0214FF0007058 -:20BCA000C1F88001C1F88002384B802283F80024C1F80001704700B502460420344903E059 -:20BCC00001EBC0031B792BB1401EC0B2F8D2FFDFFF2000BD41F8302001EBC00100224A71DE -:20BCE0008A7101220A7100BD294A002102EBC0000171704710B50446042800D3FFDF24482C -:20BD000000EBC4042079012800D0FFDF6079A179401CC0B2814200D060714FF0E0214FF05C -:20BD20000070C1F8000210BD2DE9F0411948056818491948083108601448042690F8000481 -:20BD4000134F4009154C042818D0FFDF16E0217807EBC1000279012A08D1427983799A4291 -:20BD600004D04279827157F8310080472078401CC0B22070042801D300202070761EF6B218 -:20BD8000E5D20448001D0560BDE8F08119E000E09006002010050240010000014C000020B4 -:20BDA000F8B51D46DDE906470E000AD004F072FF2346FF1DBCB231462A46009404F030FB86 -:20BDC000F8BDD0192246194615F096FE2046F8BDF84B586019721A80C90015F026BF70B552 -:20BDE0000D460446102115F0FEFE258117206081A07B40F00A00A07370BD4FF6FF720A80E1 -:20BE00000146032008F0E0B9704700897047827BD30701D1920703D48089088000207047AF -:20BE200005207047827B920700D58181704701460020098847F2FE12114200D00120DD4957 -:20BE4000497A002901D040F00800704700B50346807BC00701D0052000BD59811846FFF795 -:20BE6000E6FFC00703D0987B40F004009873987B40F001009873002000BD827B520700D59A -:20BE800009B14089704717207047827B61F3C302827370472DE9F04F0E46017804464FF00D -:20BEA000010B0BFA01F047F2FF1100EA010961684FF6FF7887B008881D469646404506D05D -:20BEC000B9F1000F07D047F2FE12104203D0012007B0BDE8F08F40EA090008804FF0000A64 -:20BEE00095B185F800A022780027052003210223102A6FD2DFE802F06E0D2C35546F7680E7 -:20BF000054CBC79CCFFEFDFC20780B28EBD00420DEE762682089937B9B077DD5172851D392 -:20BF200013898342FBD39289172A01D3824249D12A7822F03F02921C2A70A5F80100318038 -:20BF4000616888816068817B21F00201817342E1042129702189A5F801106189A5F8031070 -:20BF60008FE0208A3188C01D1FFA80F84145D6D3062028702089A5F801006089A5F80300C4 -:20BF8000A089A5F805000721208ACDE9000160882A4671466369FFF703FFA6F800801AE161 -:20BFA000082A10D0082129702189A5F801106189A5F8031030806A1D694604F10C0006F0DE -:20BFC000CAF910B1CCE01021EDE730889DF80010084456E00EE10A2028702089A5F8010055 -:20BFE0003180B2E00C2129702189A5F801106189A5F803103080A8E0218933880BEB410270 -:20C000001FFA82FA534576D3BAF1050F73D30E222A7008EA410100E07FE0CDE9001B6088AF -:20C020002A467146E368FFF7BBFEA6F800A0D2E06048417A002970D0491E41724068217AC6 -:20C04000E26800EBC105D046A9882868D2F800C00844A0F1080140F808CC506848608DF8AD -:20C0600000308DF801A028680290A888ADF8040060886946F5F7C6FEA5F80480002E01D008 -:20C0800040463080A7E0287840F080022A70287840F040022A7060893288C01C1FFA80F83B -:20C0A00042455DD3287820F03F00123028702289A5F801206089CDE9000160882A467146E8 -:20C0C000E368FFF76DFEA6F80080287841063CD500065ED58DF800B08DF801A03188CDE99B -:20C0E000025A091DADF804100420DFF8C88003E059E04FE02DE033E0049098F808008DF8A6 -:20C10000140060886946F5F77DFE074630880C303080022F02D0E7B36FE048E09DF814203F -:20C12000D8F8041098F80830404601EBC2019A4216D28A88A2B9427A521C88F809200D60AD -:20C1400030888880A6F800A057E061682089888041E0A1893288491D1FFA81F8424501D2D9 -:20C1600004274AE029782A4621F03F01163129702189A5F801106189A5F80310A189CDE956 -:20C180000010608871462369FFF70AFEA6F80080DBE720E0287820F03F0018302870207A1D -:20C1A0006870338017E060680188090404D4052723E00000B0060020C0882189884201D035 -:20C1C00006271AE01E202870A6F800B06068018821F400410180B9F1000F0ED0DF48618845 -:20C1E000002200888300032007F044FF61682078887007E0A6F800A003276068018821EAB1 -:20C2000009010180384663E62DE9F04F87B01746109C0D0083461E461AD03078C10703D0D0 -:20C2200000F03F00192801D9012100E000212046FFF723FEA8420BD32088A0F57F41FF3917 -:20C2400006D03078410601D4000603D508203FE607203DE600208DF800008DF801003078FC -:20C260006B1E00F03F0C0122A81E4FF0050A4FF0020999B2BCF1200F76D2DFE80CF08C10AB -:20C28000755F7569758D759E75B875BD75CB75D775E4757575F475F275F175F0758C052DDB -:20C2A00079D104208DF80000A0788DF804007088ADF8060030798DF80100707800F03F0001 -:20C2C0000C2829D00ADCA0F10200092863D2DFE800F0126215621A621D622000122824D067 -:20C2E00004DC0E281BD01028DAD11BE016281FD01828D5D11FE02078800701E0207840076E -:20C30000002848DAF1E020780007F9E72078C006F6E720788006F3E720784006F0E7207803 -:20C320000006EDE72088C005EAE72088C004E7E720888004E4E720884004E1E720788007E1 -:20C3400029D5032D27D18DF800A0B6F8010083E0217849071FD5062D1DD381B2707801283C -:20C3600003D0022817D102E0CCE0022000E0102006228DF8002072788DF80420801CB1FB70 -:20C38000F0F2ADF8062092B242438A4203D10397ADF80890A9E07BE02078000778D50721B8 -:20C3A00098B28DF800108108ADF80410B0EB810F6ED10297ADF8062097E02178C90667D573 -:20C3C000022D65D381B208208DF80000707802285ED300BFB1FBF0F28DF80400ADF8062032 -:20C3E00092B242438A4253D1ADF808907CE0207880064DD5092003E02078400648D50A207A -:20C400008DF80000A088ADF80400ADF80610ADF8082069E02078000672D50B20ADF804102C -:20C420008DF80000ADF8062002975EE02188C90566D5022D64D381B20C208DF800007078F1 -:20C4400004285DD3C6E72088C00459D5012D57D10D208DF80000A088ADF8040045E021E03A -:20C4600026E016E0FFE72088800449D5052D47D30E208DF80000A088ADF80400B6F803000F -:20C480006D1FADF80850ADF80600ADF80AA02BE036E02088400433D5012D31D10F208DF820 -:20C4A000000022E0208800042AD4B6F80100E080A07B000724D5032D22D3307800F03F00AA -:20C4C0001B2819D011208DF80000208840F40040A4F80000B6F80100ADF80400ED1E03203C -:20C4E000ADF80650ADF80800039769465846F5F789FC050008D016E010208DF80000E9E7E4 -:20C50000072510E008250EE0307800F03F001B2809D01D2807D05946032007F055FE208821 -:20C5200000F400402080A07B400708D52046FFF77EFCC00703D1A07B20F00400A0732846C7 -:20C54000C6E400B587B0032805D18DF8000088B26946F5F757FC07B000BD0000B00600204D -:20C56000F8B51D46DDE906470E000AD004F092FB2346FF1DBCB231462A46009403F050FF7F -:20C58000F8BDD0192246194615F0B6FA2046F8BD2DE9FF4F8DB09B46DDE91B57DDF87CA0BB -:20C5A0000C46082B05D0E06901F00CF950B11020D2E02888092140F0100028808AF80010AB -:20C5C000022617E0E16901208871E2694FF420519180E1698872E06942F601010181E06936 -:20C5E000002181732888112140F0200028808AF80010042638780A900A2038704FF002092A -:20C6000004F118004D460C9001F09FFBB04681E0BBF1100F0ED1022D0CD0A9EB0800801C0F -:20C6200080B20221CDE9001005AB52461E990D98FFF796FFBDF816101A98814203D9F74845 -:20C6400000790F9004E003D10A9808B138702FE04FF00201CDE900190DF1160352461E9981 -:20C660000D98FFF77DFF1D980088401B801B83B2C6F1FF00984200D203461E990BA8D9B19C -:20C680005FF00002DDF878C0CDE9032009EB060189B2CDE901C10F980090BDF81610002281 -:20C6A0000D9801F0D5FB387070B1C0B2832807D0BDF8160020833AE00AEB09018A19E1E765 -:20C6C000022011B0BDE8F08FBDF82C00811901F0FF08022D0DD09AF80120424506D1BDF80E -:20C6E0002010814207D0B8F1FF0F04D09AF801801FE08AF80180C94800680178052902D1DD -:20C70000BDF81610818009EB08001FFA80F905EB080085B2DDE90C1005AB0F9A01F018FB41 -:20C7200028B91D980088411B4145BFF671AF022D13D0BBF1100F0CD1A9EB0800801C81B2FF -:20C740000220CDE9000105AB52461E990D98FFF707FF1D980580002038700020B1E72DE990 -:20C76000F8439C46089E13460027B26B9AB3491F8CB2F18FA1F57F45FF3D05D05518AD88D9 -:20C780002944891D8DB200E000252919B6F83C800831414520D82A44BCF8011022F8021B75 -:20C7A000BCF8031022F8021B984622F8024B914604F05EFA4FF00C0C41464A462346CDF877 -:20C7C00000C003F0F4FDF587B16B00202944A41D2144088003E001E0092700E083273846E6 -:20C7E000BDE8F88310B50B88848F9C420CD9846BE018048844B1848824F40044A41D2344F3 -:20C800000B801060002010BD822010BD2DE9F0478AB00025904689468246ADF8185007276D -:20C820004BE0059806888088000446D4A8F8006007A8019500970295CDE903504FF400734A -:20C8400000223146504601F003FB04003CD1BDF81800ADF82000059804888188B44216D108 -:20C860000A0414D401950295039521F400410097049541F4804342882146504601F0BEF811 -:20C8800004000BD10598818841F40041818005AA08A94846FFF7A6FF0400DCD0009705982E -:20C8A00002950195039504950188BDF81C300022504601F0A3F8822C06D105AA06A94846DB -:20C8C000FFF790FF0400ACD0ADF8185004E00598818821F40041818005AA06A94846FFF783 -:20C8E00081FF0028F3D0822C03D020460AB0BDE8F0870020FAE710B50C46896B86B051B1CC -:20C900000C218DF80010A18FADF80810A16B01916946FAF7C9FB00204FF6FF71A063E18726 -:20C92000A08706B010BD2DE9F0410D460746896B0020069E1446002911D0012B0FD13246C6 -:20C9400029463846FFF762FF002808D1002C06D0324629463846BDE8F04100F042BFBDE8BF -:20C96000F0812DE9FC411446DDE9087C0E46DDE90A15521DBCF800E092B2964502D20720F9 -:20C98000BDE8FC81ACF8002017222A70A5F80160A5F803300522CDE900423B462A46FFF70A -:20C9A000DFFD0020ECE770B50C4615464821204615F03BF904F1080044F81C0F00204FF605 -:20C9C000FF71E06161842084A5841720E08494F82A0040F00A0084F82A0070BD4FF6FF72E0 -:20C9E0000A800146042007F0EFBB30B585B00C460546FFF780FFA18E284629B101218DF857 -:20CA000000106946FAF750FB0020E0622063606305B030BDB0F840007047000050000020C2 -:20CA200090F84620920703D4408808800020F3E70620F1E790F846209207EDD5A0F844101B -:20CA4000EAE70146002009880A0700D5012011F0F00F01D040F00200CA0501D540F004002A -:20CA60008A0501D540F010004A0501D540F020000905D1D540F04000CEE700B5034690F83D -:20CA80004600C00701D0062000BDA3F842101846FFF7D7FF10F0760F05D093F8460040F063 -:20CAA000040083F8460013F8460F40F001001870002000BD90F84620520700D511B1B0F835 -:20CAC0004200A9E71720A7E710F8462F61F3C3020270A1E72DE9FF4F9BB00E00DDE92B344D -:20CAE000DDE92978289D25D02878C10703D000F03F00192801D9012100E000212046FFF711 -:20CB0000D9FFB04216D3287841060FD400F03F011E2909D0218811F47F6F0BD13A884AB113 -:20CB2000A1F57F42FF3A05D0010606D500F03F00122802D004201FB0C4E5FC491D984FF09E -:20CB4000000A08718DF818A08DF830A00CAA0A60ADF81CA0ADF824A02978994601F03F0224 -:20CB6000701F5B1C04F1180CD3464FF0030ECDF828C01F2A7ED2DFE802F07D7D107D227D08 -:20CB8000AE7DF77DF67DF57DF47DF77DF37D7D7DF27DF17D7D7D7D7DF00094F84610B5F872 -:20CBA0000100890767D5032E65D14FF40061ADF8241060808DF830E0ADF83400E9E2052E78 -:20CBC000F2D1B5F801002083ADF81C00B5F803106183002870D088426ED884F80AB0A4F892 -:20CBE00008B04FF6FF7020840A9801F0AEF8052089F8000002208346029011AB1D9A0A99B3 -:20CC00001B9801F0A5F820B15EE000BF8DF81800FEE29DF84A00012804D0022089F8010008 -:20CC2000102003E0012089F8010002200390002204A912A805F08FFBE8BB9DF8101003988E -:20CC400088423ED13A88891CA2EB0B00884238DB02990220CDE900010DF146034A4641464D -:20CC60001B98FFF77DFC02980BF1020B801C81B217AA01E0ACE2B1E0029104A912A805F070 -:20CC80006AFB02999DF81000CDE9000117AB4A4641461B98FFF764FC9DF8100011AB0BEBFF -:20CCA00000011FFA81FB02991D9A084480B202900A991B9801E004E091E001F049F8002896 -:20CCC000B5D0BBF1020F03D10A208DF818005DE2A7F800B05AE2CDF80CB0072E7ED3B5F8F9 -:20CCE00001002083ADF81C00B5F803206283002875D0904273D84FF0010B84F80AB0B5F862 -:20CD0000050020810020A073E06900F05BFD80B9E16942F6010081F806B0E2694FF42051BF -:20CD20009180E16981F80AB0E1690881E16900208873F01F20841E984FF0070B6062A4F815 -:20CD400022B00A9801F001F889F800B00120834604900020ADF846002AE026E2B0E147E1F0 -:20CD6000EDE01FE2B0E088E04FE000BFBBF1010F15D0E0698079012803D1BDF84400ADF881 -:20CD80000E0004990420CDE9000103AB4A4641461B98FFF7E5FB0498001D80B20490BDF88B -:20CDA0004600ADF80C00ADF80E0005981FFA80FB11AB1D9A0A991B9800F0CAFF28B9398874 -:20CDC0000BF1040005908142D0D2BBF1010F3FF41BAFE0698079012808D001E098E023E001 -:20CDE000BDF84410A1F57F40FF3803D1BDF84400ADF80E0004990420CDE9000103AB4A4668 -:20CE000041461B98FFF7ACFB62E7072E01D0152E7ED1B5F801102183ADF81C10B5F8032057 -:20CE2000628309B1914201D90120EFE60121A172A4F808B084F80EB0052E07D0C0B2691DEB -:20CE4000E26905F069FA00287FF4DEAE4FF6FF70208401A806AA09A9CDF800B080E886033F -:20CE60002878214600F03F031D9A1B98FFF790FB8246208BADF81C0088E10120032EC7D107 -:20CE80004021ADF82410B5F801102183ADF81C100AAAB8F1000F00D00023CDE90203049275 -:20CEA0001D98CDF80480009038880022401E83B21B9800F0CDFF8DF8180050BB0B2189F8AB -:20CEC0000010BDF8280038E04FF0010C052E9FD18020ADF82400B5F801102183B5F80300E3 -:20CEE0002084ADF81C10B0F5007F01D907208DE640F47C42228412A8B8F1000F00D0002328 -:20CF0000CDE90330CDE9018C1D980090388801E09CE007E0401E83B21B9800F099FF8DF849 -:20CF2000180028B18328A7D10220C7E0500000200D2189F80010BDF84800401C25E1C809B5 -:20CF400000EB40020EEB8200B04203D948067DD558461AE1B5F80110ADF81C102A78520699 -:20CF600008D506228DF830202A78120605D58DF830B02FE107228DF830200323CDE9023BB7 -:20CF8000DDF878C0CDF810B01D9AA6EB00080092CDF804C01FFA88F300221B9800F02EFD10 -:20CFA0008DF818008DF830B0297849060DD52088C00506D5208BBDF81C10884201D1C4F871 -:20CFC00024B058468DF818B0DFE0832801D14FF0020A4FF48070ADF82400BDF81C0020839B -:20CFE000A4F820801E986062032060841321C9E0052E2BD3B5F80110ADF81C10A28F32B3C3 -:20D00000A2F57F43FE3B29D008228DF830200523CDE9023BDDF878C0CDF810B01D9A80B2F0 -:20D02000CDF804C040F400430092B5F803201B9800F0E4FC4FF400718DF818008DF830B055 -:20D04000ADF82410832813D010B301E0DBE005E0A08FA0F57F41FE3907D0D9E00B228DF828 -:20D0600030204FF6FE72A287D1E7A4F83CB0CFE000942B4631461E9A1B98FFF770FB8DF8C6 -:20D08000180008B183284BD1BDF81C0020834BE700942B4631461E9A1B98FFF760FB8DF895 -:20D0A0001800E8BBE18FA06B0844831D8DE888034388828801881B98FFF753FC824665E0EB -:20D0C00095F80180022E6FD15FEA080002D0B8F1010F7FD109208DF8300007A800908DF804 -:20D0E00034804346002221461B98FFF71CFC8DF836008DF837B050B9B8F1010F11D0B8F136 -:20D10000000F04D1A08FA0F57F41FF3909D0A08F38B14FF480608DF830B0ADF824000EE03F -:20D1200034E00CA91B98F9F7BFFF82464FF480608DF830B0ADF82400BAF1020F06D0FB48D7 -:20D140000068C07928B18DF8180027E0A4F8188042E0BAF1000F03D081208DF818003BE075 -:20D1600007A800904346012221461B98FFF7DBFB8DF8180021461B98FFF7BDFB9DF81800CC -:20D1800020B9192189F80010012038809DF8300020B10CA91B98F9F787FF8246BAF1000F1C -:20D1A00033D019E0062031E514E02078000711D5012E0FD10A208DF83000E088ADF834008F -:20D1C00004201B9907F000F80820ADF824007FE5480618D54FF0040A2088BDF824100843CF -:20D1E0002080BDF8240080050BD5A18FA1F57F40FE3806D11E98E06228982063A6864FF019 -:20D20000030A504697E4042000E59DF8180078B1012089F80000297889F80110BDF81C105B -:20D22000A9F802109DF8180089F80400052038802088BDF8241088432080E2E72DE9FF4F03 -:20D240008846087895B0012181404FF20900249C0140ADF820102088DDF88890A0F57F424D -:20D260004FF0000AFF3A02D029B1000703D5012019B0BDE8F08F239E4FF0000B0EA886F854 -:20D2800000B018995D460988ADF83410A7498DF81CB0179A0A718DF838B0086098F800003E -:20D2A00001283BD0022809D003286FD1307820F03F001D303070B8F80400E08098F8001034 -:20D2C0000320022904D1317821F03F011B31317094F84610090759D505ABB9F1000F13D0D8 -:20D2E000002102AA82E80B000720CDE90009BDF83400B8F80410C01E83B20022159800F087 -:20D30000A7FD0028D1D101E0F11CEAE7B8F80400A6F80100BDF81400C01C04E198F805105E -:20D320008DF81C1098F80400012806D04FF4007A02282CD00328B8D16BE12188B8F8080065 -:20D3400011F40061ADF8201020D017281CD3B4F84010814218D3B4F84410172901D38142F3 -:20D3600012D1317821F03F01C91C3170A6F801000321ADF83410A4F8440094F8460020F0DC -:20D38000020084F8460064E105257DE176E1208808F1080700F4FE60ADF8200010F0F00FDF -:20D3A0001BD010F0C00F03D03888228B9042EBD199B9B878C00710D0B9680720CDE902B10B -:20D3C000CDF804B00090CDF810B0FB88BA883988159800F013FB0028D6D12398BDF820101F -:20D3E000401C80294ED006DC10290DD020290BD0402987D124E0B1F5807F70D051456DD071 -:20D40000B1F5806F97D1DDE0C80601D5082000E0102082460DA907AA0520CDE902218DF8C4 -:20D420003800ADF83CB0CDE9049608A93888CDE900015346072221461598FFF7A9F8A7E0B7 -:20D440009DF81C2001214FF00A0A002A9BD105ABB9F1000F00D00020CDE902100720CDE9F2 -:20D460000009BDF834000493401E83B2218B0022159800F0EDFC8DF81C000B203070BDF81B -:20D48000140020E09DF81C2001214FF00C0A002A22D113ABB9F1000F00D00020CDE90210E4 -:20D4A0000720CDE900090493BDF83400228C401E83B2218B159800F0CBFC8DF81C000D20E7 -:20D4C0003070BDF84C00401CADF8340005208DF83800208BADF83C00BBE000E028E03888C5 -:20D4E000218B88427FF450AF9DF81C004FF0120A00281AD1606A98B1B878C0073FF444AFF5 -:20D50000BA680720CDE902B2CDF804B00090CDF810B0FB88BA88159800F070FA8DF81C005D -:20D52000132030700120ADF8340092E0500000203988208B8142D5D19DF81C004FF0160A57 -:20D540000028A06B08D0E0B34FF6FF7000215F46ADF808B0019027E068B1B978C907C1D112 -:20D56000E18F0DAB0844821D03968DE80C0243888288018809E0B878C007BFD0BA680DABD5 -:20D5800003968DE80C02BB88FA881598FFF7E9F905005ED0072D72D076E0019005AA02A93B -:20D5A0002046FFF71FF90146E28FBDF80800824201D00029F1D0E08FA16B0844078001981C -:20D5C000E08746E09DF81C004FF0180A40B1208BC8B13888208321461598FFF78CF938E08D -:20D5E00004F118000090237E012221461598FFF79AF98DF81C000028EDD1192030700120AC -:20D60000ADF83400E7E7052521461598FFF773F93AE0208800F40070ADF8200050452DD145 -:20D62000A08FA0F57F41FE3901D006252CE0D8F808004FF0160A48B1A063B8F80C10A18700 -:20D640004FF6FF71E187A0F800B002E04FF6FF70A087BDF8200030F47F611AD07823002228 -:20D660000420159906F006FD98F8000020712088BDF82010084320800EE000E007252088A4 -:20D68000BDF8201088432080208810F47F6F1CD03AE02188814321809DF8380020B10EA937 -:20D6A0001598F9F701FD05469DF81C000028EBD086F801A001203070208B70809DF81C00C4 -:20D6C00030710520ADF83400DEE7A18EE1B118980DAB0088ADF834002398CDE90304CDE92E -:20D6E0000139206B0090E36A179A1598FFF7F2F9054601208DF838000EA91598F9F7D4FCFC -:20D7000000B10546A4F834B094F8460040070AD52046FFF796F910F0760F04D114F8460FEF -:20D7200020F0040020701898BDF83410018028469EE500B585B0042806D102208DF8000096 -:20D7400088B26946F9F7B0FC05B000BD10B5384C0B782268012B02D0022B2AD111E01378DA -:20D760000BB1052B01D10423137023688A889A802268CB88D38022680B8913814989518104 -:20D780000DE08B8893802268CB88D38022680B8913814B8953818B89938109691161216857 -:20D7A000F9F782FC226800210228117003D0002800D0812010BD832010BD806B002800D019 -:20D7C000012070478178012909D10088B0F5205F03D042F60101884201D100207047072021 -:20D7E0007047F0B587B0002415460E460746ADF8144010E0069801882980811DCDE9024126 -:20D800000721019404940091838842880188384600F0F4F830B906AA05A93046FEF7E2FFD7 -:20D820000028E7D0822800D1002007B0F0BD00005000002010B58B7883B102789A4205D172 -:20D840000B885BB102E08B79091D4BB18B789A42F9D1B0F801300C88A342F4D1002010BD74 -:20D86000812010BD072826D012B1012A27D103E0497801F0070102E04978C1F3C20105294A -:20D880001DD2DFE801F00318080C12000AB1032070470220704704280DD250B10DE005280C -:20D8A00009D2801E022808D303E0062803D0032803D005207047002070470F2070478120CE -:20D8C0007047C0B282060BD4000607D5FE48807A4143C01D01EBD00080B27047084670478B -:20D8E0000020704770B513880B800B781C0625D5F54CA47A844204D843F01000087000208B -:20D9000070BD956800F0070605EBD0052D78F54065F304130B701378D17803F0030341EA5F -:20D92000032140F20123B1FBF3F503FB15119268E41D00FB012000EBD40070BD906870BD8D -:20D9400037B51446BDF8041011809DF804100A061ED5C1F30013DC49A568897A814208D8DC -:20D96000FE2811D1C91DC9085A422846F5F73FFB0AE005EBD00100F0070201250878954099 -:20D98000A843934018430870207820F0100020703EBD2DE9F0410746C81C0E4620F00300D4 -:20D9A000B04202D08620BDE8F081C74D002034462E60AF802881AA72E8801AE0E988491C7F -:20D9C000E980810614D4E17800F0030041EA002040F20121B0FBF1F201FB12012068FFF769 -:20D9E00070FF2989084480B22881381A3044A0600C3420784107E1D40020D4E72DE9FF4F05 -:20DA000089B01646DDE9168A0F46994623F44045084600F00DFB04000FD0099802F0E6FF9A -:20DA20000290207800060AD5A748817A0298814205D887200DB0BDE8F08F0120FAE72246C1 -:20DA400001A90298FFF74EFF834600208DF80C004046B8F1070F1AD001222146FFF702FF15 -:20DA60000028E7D12078400611D502208DF80C00ADF81070BDF80400ADF81200ADF81460A1 -:20DA80001898ADF81650CDF81CA0ADF818005FEA094004D500252E46A84601270CE02178EE -:20DAA000E07801F0030140EA012040F20121B0FBF1F2804601FB12875FEA494009D5B845E4 -:20DAC00007D1A178207901F0030140EA0120B04201D3BE4201D90720ACE7A8191FFA80F9CF -:20DAE000B94501D90D20A5E79DF80C0028B103A90998F9F7D7FA00289CD1B84507D1A0788B -:20DB00004FEA192161F30100A07084F804901A9800B10580199850EA0A0027D0199830B1B7 -:20DB20000BEB06002A46199913F0E6FF0EE00BEB06085746189E099803F09AF82B46F61DF0 -:20DB4000B5B239464246009502F031FC224601A90298FFF7C7FE9DF80400224620F010001B -:20DB60008DF80400DDE90110FFF7EAFE002061E72DE9FF4FDFF8509182461746B9F80610F7 -:20DB8000D9F8000001EB410100EB810440F20120B2FBF0F185B000FB11764D46DDF84C804A -:20DBA00031460698FFF78DFE29682A898B46611A0C3101441144AB8889B28B4202D88420AF -:20DBC00009B038E70699CDB2290603D5A90601D58520F5E7B9F806C00CF1010C1FFA8CFC20 -:20DBE000A9F806C0149909B1A1F800C0A90602D5C4F8088007E0104480B2A9F80800191AEB -:20DC000001EB0B00A0602246FE200699FFF798FEE77026712078390A61F30100320AA178E9 -:20DC200040F0040062F30101A17020709AF802006071BAF80000E08000262673280602D57D -:20DC400099F80A7000E00127A80601D54FF000084D4600244FF007090FE0CDE9026801963A -:20DC6000CDF800900496E9882046129B089AFFF7C5FE0028A4D1641CE4B2BC42EDD3002045 -:20DC80009EE72DE9F047804600F0D2F9070005D0002644460C4D40F2012919E00120BDE831 -:20DCA000F087204600F0C4F90278C17802F0030241EA0222B2FBF9F309FB13210068FFF7B2 -:20DCC00000FE304486B201E0BC060020641CA4B2E988601E8142E4DCA8F10100E8802889DC -:20DCE000801B288100203870D9E710B5144631B1491E218002F07AFEA070002010BD0120C7 -:20DD000010BD10B5D24904460088CA88904201D3822010BD096800EB400001EB800250794A -:20DD2000A072D08820819178107901F0030140EA0120A081A078E11CFFF7D4FD20612088E0 -:20DD4000401C2080E080002010BD0121018270472DE9FF4F85B04FF6FF788246A3F80080E6 -:20DD600048681F460D4680788DF8060048680088ADF8040000208DF80A00088A0C88A04220 -:20DD800000D304462C8241E0288A401C2882701D6968FFF74FFDB8BB3988414501D1601E35 -:20DDA00038806888A04236D3B178307901F0030140EA012901A9701DFFF73CFD20BB2989C2 -:20DDC00041452CD0002231460798FFF74BFDD8B92989494518D1E9680391B5F80AC0D6F867 -:20DDE00008B05046CDF800C002F042FFDDF800C05A460CF1070C1FFA8CFC4B460399CDF845 -:20DE000000C002F097FA50B1641CA4B2204600F00FF90600B8D1641E2C828220D0E67C8077 -:20DE20007079B871F088B8803178F07801F0030140EA01207881A7F80C90504602F0D6FD40 -:20DE4000324607F10801FFF74DFD38610020B7E62DE9FF4F87B081461C469246DDF860B032 -:20DE6000DDF85480089800F0E3F805000CD0484602F0BCFD2978090608D57549897A814263 -:20DE800004D887200BB0D6E50120FBE7CAF309062A4601A9FFF726FD0746149807281CD073 -:20DEA00000222946FFF7DEFC0028EBD12878400613D501208DF808000898ADF80C00BDF89B -:20DEC0000400ADF80E00ADF81060ADF8124002A94846F9F7E7F80028D4D12978E87801F0B8 -:20DEE000030140EA0121AA78287902F0030240EA0220564507D0B1F5007F04D9611E814216 -:20DF000001DD0B20BEE7864201D90720BAE7801B85B2A54200D92546BBF1000F01D0ABF8BD -:20DF20000050179818B1B9192A4613F0E5FDB8F1000F0DD03E4448464446169F02F0AAFE74 -:20DF40002146FF1DBCB232462B46009402F068FA002097E72DE9F04107461D4616460846C0 -:20DF600000F066F804000BD0384602F03FFD2178090607D53649897A814203D8872012E586 -:20DF8000012010E522463146FFF7ACFC65B12178E07801F0030140EA0120B0F5007F01D8AA -:20DFA000012000E0002028700020FCE42DE9F04107461D461646084600F03AF804000BD006 -:20DFC000384602F013FD2178090607D52049897A814203D88720E6E40120E4E422463146FA -:20DFE000FFF7AEFCFF2D14D02178E07801F0030240EA022040F20122B0FBF2F302FB130049 -:20E0000015B900F2012080B2E070000A60F3010121700020C7E410B50C4600F009F828B101 -:20E02000C18821804079A070002010BD012010BD0749CA88824209D340B1096800EB400083 -:20E040006FF00B0202EB80000844704700207047BC06002010B50C4601F03AFD80B3204653 -:20E0600000F0B7FA68B32278102A09D0112A07D0022A05D0032A03D0162A2ED0FFDF1DE00B -:20E08000A0781E282BD00EDC0C2824D008DC092827D2DFE800F013261726261E1E1A1C0042 -:20E0A00012281ED11BE0302819D01ADDA0F13A00032816D2DFE800F011150B00002010BD51 -:20E0C00013E010E043F20200F9E70420F7E70D20F5E70F20F3E70820F1E71120EFE7072004 -:20E0E000EDE70320EBE7FFDFE8E7FFDFE6E700F070BA70B50346002002466FF02F050EE08E -:20E100009C5CA4F130060A2E02D34FF0FF3070BD00EB800005EB4000521C2044D2B28A42D7 -:20E12000EED370BD30B50A240AE0B0FBF4F304FB13008D18303005F8010C521E1846D2B2EF -:20E14000002AF2D130BD30B500234FF6FF7510E0040A44EA002084B2C85C6040C0F3031414 -:20E16000604005EA00344440E0B25B1C84EA40109BB29342ECD330BD10B50AF0FFF90428E0 -:20E1800003D00AF0FBF9052802D108F0A0FC28B90BF056FB20B107F047FB08B1012010BD4C -:20E1A000002010BD0178406819B190F8721059B901E001F017BD90F8041129B190F80401C1 -:20E1C000042801D0012070470020704770B50C460546062102F042FC606008B1002006E0FB -:20E1E0000721284602F03AFC606018B101202070002070BD022070BD2DE9FC470C46064694 -:20E200006946FFF7E3FF00287DD19DF8000050B107F09CFAB0427CD0214630460EF0A1F92B -:20E22000002873D12DE008F065F9B04271D0214630460CF041FC002868D1019D95F8C80072 -:20E2400022E0012000E00020804695F835004FF0010A4FF00009F0B195F8360080071AD5A7 -:20E2600084F8019084F800A084F80290A68095F83710A171298F2181698F618185F83590E5 -:20E2800044E0019D95F8040158350028DBD1A87E0028D8D0D5E7304602F0FCFC070000D1DF -:20E2A000FFDF384601F051FE40B184F801900E212170A680E08084F802A027E0304602F0F1 -:20E2C000D7FC070000D1FFDFB8F1000F21D0384601F0CCFEB8B19DF8000038B90198D0F883 -:20E2E000F0004188B14201D180F80090304607F0C3F884F801900B21217084F80290A68072 -:20E30000E97EA17100E004E085F81A900120BDE8FC870020FBE71CB56946FFF757FF00B1D1 -:20E32000FFDF684601F06CFCF94900208968A1F8CA001CBD2DE9FC4104460E46062002F060 -:20E3400037FB0546072002F033FB2844C7B20025A8463E4417E02088401C80B22080B042C0 -:20E3600002D34046A4F8008080B2B84204D3B04202D20020BDE8FC816946FFF727FF002828 -:20E38000F8D06D1CEDB2AE42E5D84FF6FF7020801220EFE738B54FF6FF70ADF800000DE051 -:20E3A0000621BDF8000002F06BFB04460721BDF8000002F065FB0CB100B1FFDF0021684695 -:20E3C000FFF7B8FF0028EBD038BD2DE9F047D1A10F79D1F8008007F0BDF810F003F8CF4C66 -:20E3E0004FF004091020A4F8389060874FF6FF76A4F85460A4F85660002584F8315004F8DC -:20E400002E5BC6492570A5713E39A573C1F87B8081F87F707B31481E0CF029FD25751B2005 -:20E42000E0824FF4A47121836083A1830321A17784F81F9020846084B848A1843E38057078 -:20E440004680B3480C300570B448103805704680BDE8F08770B5AE4C0D466060217006F0F6 -:20E46000F3FFFFF797FFFFF7B0FF207809F031FD08F02EF9217860680CF00CFC20780FF09F -:20E4800011FA28460AF071FE07F06AF9217860680EF068F9BDE870400FF0A4BF10B50124DF -:20E4A0000AB1002010BD21B1012903D00024204610BD022111F0C6FBF9E72DE9F047040078 -:20E4C00000D1FFDF954D002695F8310058B166701620207095F83200A07095F83300E07043 -:20E4E00085F8316068E0287840B12C22A91C204613F002FB102020702E705DE095F82E0066 -:20E5000060B10120E07095F82F00A07095F8300060701120207085F82E604DE07F4802213D -:20E5200056308246FFF706FF00B1FFDFB5F85690062002F03DFA0746072002F039FA38440C -:20E54000C7B2781C00F0FF08B5F85600B84212D1204607F04BFF50BB95F8340070B366706B -:20E56000132020702021A01C13F03DFB0220A07085F8346020E040451AD1204607F09CF8FC -:20E58000E0B12078132817D1A0783C2814D1A088072102F063FA050000D1FFDF288806F0D5 -:20E5A0006BFFA088072102F06BFA00B1FFDF03E02146FFF721FE08B1012049E70221504699 -:20E5C000FFF7B8FE18B9B5F856104945BCD100203EE772E710B5514C207828B10A21BDE84F -:20E5E0001040102001F0A1BAFFF7C6FD08B10C2002E00FF042FF00202071012060710A21C1 -:20E60000E170207010BD70B5444D0446287828B1BDE870403221102001F087BA207818B168 -:20E62000012801D0122010E001F090FA20B110F06EF808B10C2008E0207801F057FA04F170 -:20E640001703E21D611C0FF06FFF2871012068713221E970287070BD70B5304C054620782F -:20E6600028B1BDE870400B21102001F05EBA287818B1012801D012200EE0FFF77DFD08B15B -:20E680000C2009E0287801F031FA691C0FF0BCFE08B1002000E007202071012060710B21DC -:20E6A000E170207070BD10B51C4C217829B13021BDE81040102001F038BA008810F02AF8A9 -:20E6C000302110B10020207100E0217101206071E170207010BD70B5104C0546207828B128 -:20E6E000BDE870403121102001F01FBA01F02EFA08B10C2005E0287800F0010010F004F809 -:20E7000000202071012060713121E170207070BD58000020FFFFFFFF1F0000000607002036 -:20E7200010B5FB4C207828B13421BDE81040102001F0FBB901F00AFA20B10FF0E8FF08B1D8 -:20E740000C2002E00FF044FF00202071012060713421E170207010BDED48017819B10F211B -:20E76000102001F0E2B900210171102181700F21C170FF2181714FF6FF710181E54949689F -:20E780000A7882728A8882814988C181012141710170704710B5DE4C207828B12B21BDE88E -:20E7A0001040102001F0C1B90821A01D05F029FA00202071012060712B21E170207010BDD3 -:20E7C00070B5D34C217829B1BDE870404321102001F0ABB990F90000042816D0032814D09A -:20E7E00098B1011D11D010F1080F0ED010F10C0F0BD010F1100F08D010F1140F05D010F1F2 -:20E80000280F02D01220207103E0002506F020F825714320E07001206071207077E710B528 -:20E82000BB4C217829B12A21BDE81040102001F07CB9A31D012200F1100110F03AFE00208B -:20E8400020711020A0702A20E07001206071207010BD70B5AE4C0546207828B1BDE87040CE -:20E860004621102001F061B909F088FE052804D0284609F01BFB002000E00C20207101201B -:20E8800060714621E170207041E770B5A04C0546207828B1BDE870404421102001F045B991 -:20E8A00001F054F938B10C202071012060714421E17020702BE72946002006F04CFE00203B -:20E8C000F2E770B5924C0546207828B1BDE870404221102001F029B909F091FB50B10AF065 -:20E8E000A2FF38B128780AF064FC287808F026F9002000E00C202071012060714221E1707A -:20E90000207004E770B5824C0546207828B1BDE870401721102001F008B901F017F938B174 -:20E920000C202071012060711721E1702070EEE62946012006F00FFE0020F2E738B5744D01 -:20E940000446287828B1BDE838404D21102001F0ECB8A079E179884213D021791F2910D8BA -:20E9600061791F290DD80022114612F0C7FA40B90022E079114612F0C1FA10B9207A07283A -:20E9800001D9122012E04FF6FF70ADF800000AF057FF90B909F0F2FD78B900216846FFF7A9 -:20E9A000C9FC50B1204605F070FE00202871012068714D21E970287038BD0C20F6E72DE9A2 -:20E9C000FC47534C054694F82E0020B12821112001F0ABF89BE4282084F83000012184F860 -:20E9E0002E10A8784FF000091A2825D00EDC162831D2DFE800F03030303030213030303087 -:20EA00003030303030303030302121212A2822D00BDCA0F11E000C281DD2DFE800F01C1CF7 -:20EA20001C1C1C1C1C1C1C1C1C0D3A38042812D2DFE800F0110211022888B0F5706F0AD25E -:20EA40001F20884684F82F0028886946FFF7BEFB18B1022019E0122017E09DF80000019FAE -:20EA6000002806D007F5B377019E05D106F1ED0604E007F1EC07F7E706F267166846FFF74D -:20EA800091FB08B1387818B10C2084F82F003EE487F80080A878307084F82F90684601F026 -:20EAA000AFF834E47CB51A4C0546207820B12521102001F03AF87CBD28886946FFF786FBA4 -:20EAC000020013484FF00001A0F13E000DD00222227140F8461F0171E1801020A070252041 -:20EAE000E0700120607120707CBD019A1346583282F83E109E68C0F846601E7B80F84A60A6 -:20EB000092F83E60002EF3D12888E080E5E70000060700205800002010B540B10478406880 -:20EB200013B1B0F8480003E0B0F84A0000E0FB201B2908D3814206D8B2F5A47F03D340F6BB -:20EB40004800824201D9122010BD002010BD2DE9FC41FA4D0446287828B1BDE8FC41502133 -:20EB6000102000F0E2BF4FF0010885F805801F2129711021A9705021E9702188E98085F80D -:20EB8000008020886946FFF721FB08B102200DE02289E18801236846FFF7BEFF30B9A28818 -:20EBA000618800236846FFF7B7FF10B12871BDE8FC819DF800103A20019E002749B186F836 -:20EBC0008981019991F8C81106F5C476B9B1287113E086F8FD80019991F82011FC3600295A -:20EBE000F5D12F71E08870802089B0806088F080A0883081012201990CE07770D7E72F715F -:20EC0000E08870802089B0806088F080A088308101990022304610F091FD86F80080ECE701 -:20EC200070B5C64D044686B0287830B106B05121BDE87040102000F078BF012068710026A7 -:20EC40002E711021A9705121E9702870208803A9FFF7BCFA18B10220287106B057E59DF85D -:20EC60000C0040B100220499E088B1F84830984203D9C01A02E00122F5E70020E88063886B -:20EC8000B1F84A00834201D9181A00E000202881009601960296E088ADF802002089ADF8E5 -:20ECA00004006088ADF80600A088ADF80800684610F044FD2089BDF80410401A6881A0881C -:20ECC000BDF80810401AA881E088BDF80210401AE988884200DC0846E8806088BDF80610DB -:20ECE000401A2989884200DC08462881B5E770B5924D0446287828B1BDE870403E21102024 -:20ED000000F013BF00F022FF20B10FF000FD08B10C2008E0E2792078611C0FF07BFE08B1E5 -:20ED2000002000E002202871012068713E21E9702870ECE47CB5814C05461F2084F82F00CB -:20ED400028886946FFF742FA18B1022084F82F007CBDAA7802B90322EB7803B903239DF877 -:20ED600000603A2501210020002E019E06D086F89311019E96F8DC6146BB1FE086F80711CD -:20ED8000019E96F82C613EB9019E96F806611EB9019E96F87B6016B184F82F500AE0019D05 -:20EDA00085F80611019981F80821019981F8093184F82F00019981F807017CBD019E96F80A -:20EDC00092611EB9019E96F87B6016B184F82F500AE0019D85F89211019981F89421019995 -:20EDE00081F8953184F82F00019981F893017CBD524930B491F82E2022B1562130BC11208C -:20EE000000F093BE562281F83020012281F82E208378DA0802D1C278D40801D0122004E0D9 -:20EE20005B0701D4520704D5112081F82F0030BC704730BC7EE770B5404C0546207828B12F -:20EE4000BDE870401D21102000F06FBE1F202071012060711D21E170207009F08FFB042842 -:20EE60000BD0052809D0A9791220012907D031B1022904D0032929D101E00C2026E02978A1 -:20EE800009B1012922D1E97929B1012903D0022901D003291AD1698843F6FD720B1F30203C -:20EEA000934213D2AB881B1F93420FD22187A8886087A87907F065FDE87907F0D0FD287877 -:20EEC000012805D00120002107F0F8FD20711EE40220F8E770B5194C217829B1BDE8704020 -:20EEE0001E21102000F021BE1F212171012161711E22E270217002781221012A00D01AB970 -:20EF0000407818B1012801D0217187E40025012A09D009F033FB0C26052802D008F008FFF9 -:20EF200088B126717AE407F022FD48B107F031FD618F208F09F070F803E00000060700205F -:20EF4000122020716AE4257168E42DE9F047F94C07469246B4F84400B7F84A200E469042D8 -:20EF600000D31046804697F85210104600F0D4FDB4F84610814200D208460546A146B4F8D7 -:20EF80004840B7F84800844200D3044697F8511000F0C2FDB9F84A10814200D208464FF43F -:20EFA000A4721B2C01D0904204D1B8F11B0F0DD095420BD0A6F8068035817480B080524684 -:20EFC0003946304610F0BAFB01203070BDE8F0872DE9F04786B00546AFF6C800D0E9009026 -:20EFE000D44E804696F82E0028B12121112000F09CFD06B0EAE71F2086F82F00212086F866 -:20F0000030004FF0010A86F82EA0284600F007FE002811D109F0B2FA05280CD009F0AEFA6E -:20F02000042808D096F8340028B907F063FAA0F57F41FF3901D00C20AAE0BE4801AA3E389A -:20F040000190BD480290BB4806211038039004A801F0D4FC04007DD003210FF0DAFFB6F81B -:20F060004E00A4F84800B6F85000A4F84A0096F84D00009096F84C30B6F85020B6F84E10DB -:20F08000208801F07EFD00B1FFDF208806F0F3F9218804F10E0000F068FDA8A004F11207EC -:20F0A000006800900321684604F033FD002069460A5C3A54401CC0B20328F9D3288A608048 -:20F0C000688AA080A88AE08094F8522094F85110B6F8520009F01DF80146A062204609F0EB -:20F0E00038F8002784F85E7084F85F70687900F0FDFC6076D5F80600C4F81A006889E08387 -:20F10000C4F8089084F80C8084F8F8A0012204F1FC012046FFF719FF8DF800700121684631 -:20F1200004F0F7FC9DF8000000F00701C0F3C1021144C0F3401008448DF80000401D2076C9 -:20F14000092801D208302076002120460FF061FF287B00E010E007F014FC69792879AA1D33 -:20F1600007F0E5FB50B107F014FC69792879AA1D07F080FC78B118E0092009E0208806F022 -:20F180007BF92088062101F07BFC00B1FFDF122086F82F002DE72146032007F08FFC20B95D -:20F1A0006A882988204608F0C0FE86F82F000028F0D0208806F060F92088062101F060FCE8 -:20F1C0000028E7D0FFDF14E738B55A4C207820B12221102000F0A9FC38BD1F202071012588 -:20F1E00065712220E070257094F8340018BB09F0C5F9052805D007F07DF9A0F57F41FF39CC -:20F2000019D000202071684608F055FF0028E3D10098008806F030F900980621008801F007 -:20F220002FFC00B1FFDF444884F834500C380078FCF760FD38BD0C20207138BD2DE9F0418E -:20F240003C4D044695F82E0028B1BDE8F0412321112000F06ABC1F2085F82F00232085F83B -:20F260003000012085F82E00618840F67B438A1F30209A4252D2A288961F9E424ED291420A -:20F280004CD8E188B1F5FA7F48D2218940F67746A1F10A03B34241D2B1EBD20F3ED96189E6 -:20F2A000A28991423AD84FF000082088062101F0D5FB06004FF0020707D000F093FC20B1F2 -:20F2C000D6F8F000017841B903E085F82F70BDE8F081D6F83C11097809B13A201EE0052114 -:20F2E0008171D6F8F0004146A0F80880D6F8F020A0885081D6F8F020E0889081D6F8F020AB -:20F300002089D081D6F8F000028943899A4204D88279082A01D89A4203D3122085F82F0090 -:20F32000D5E722884280D6F8F000077085F82F10CDE70000060700206400002011223300E9 -:20F34000FEB5F84C0646207820B12421102000F0ECFBFEBD012565712420E070257030465F -:20F3600010F042F808B1002000E0122020710028EFD1EC4884F83C503E38316840F87B1FD2 -:20F3800031790171002684F83C606946062001F0F0FA00B1FFDF684601F0C9FA60B9BDF8A4 -:20F3A0000470029880F8F850684601F0C0FA18B9BDF80400B842F4D12671FEBD2DE9F04144 -:20F3C000D84D064695F82E0028B1BDE8F0412C21112000F0AABB1F2085F82F002C2085F8CB -:20F3E0003000012085F82E003088062101F036FB040007D000F0F6FB20B1D4F8F010087837 -:20F4000030B901E0022026E0D4F83C01007808B13A2020E094200027005D10F0010F19D035 -:20F42000D6F802004860D6F80600886054F8F00F718910228181206806F10C010E3012F053 -:20F440005BFB21680320087021683088488085F82F703CE70C2085F82F0038E72DE9F041AC -:20F46000B04D04460C26287828B1BDE8F0411821102000F05ABB0AF0E3F9012730BB607994 -:20F48000032824D8A179012921D8A17B03291ED8617BE1B107291AD82179052917D2DFE8C2 -:20F4A00001F0030C030303002288202A0FD361888A420CD8B1F5804F09D806F0D6F9207920 -:20F4C00085F83600204606F098FA064600E012262E716F711820E8702F70F8E610B5914CF9 -:20F4E000217829B11A21BDE81040102000F01DBB01781F2902D91220207106E00021217179 -:20F500000278411C104606F0FCFA012060711A21E170207010BD10B5824C217829B12021B0 -:20F52000BDE81040102000F000BB01781F2902D91220207106E0002121710278411C1046D6 -:20F5400006F0CEFA012060712021E170207010BD2DE9FC41734C217829B1BDE8FC411B2169 -:20F56000102000F0E2BA012767710C212171007800261225012802D0002866D167E006F0A4 -:20F5800024F900285ED006F056F900285AD00AF057F900286CD106F06FF994F8360050B191 -:20F5A000012808D0042806D0002009F005FE00B1FFDF26715CE006F0C9F8A0F57F41FF3986 -:20F5C00056D10022072101A801F018FA05004FD055480321856028460FF0E2FB284606F096 -:20F5E000BAFBB4F84E00A5F84800B4F85000A5F84A00B4F8520001214C3409F016FF01469F -:20F60000A8620022284608F0CEFF6078009014F8043B288834F8022934F84E1901F0B1FAA2 -:20F6200000B1FFDF288805F026FF284609F0C4FD00B1FFDF2671002205F5C4712846FFF76E -:20F6400084FC15E006F0C1F890B1257110E008F0A7FF054609F0E8FC50B9267145B12888B3 -:20F6600005F00AFF2888072101F00AFA00B1FFDF1B20E0702770BDE8FC812DE9F041294C30 -:20F680000646207828B1BDE8F0412D21102000F04CBA3088072101F0E1F905004FF001076C -:20F6A00020D095F8690140B995F86400142801D0152802D195F8AA0150B10C202071102036 -:20F6C000A0702D20E0703088E08067712770FEE51022B11C05F5B57012F00EFA85F8697194 -:20F6E0000020EBE70220E9E770B50E4C0546207828B1BDE870402E21102000F016BA2888A7 -:20F70000072101F0ABF90221A0B190F869212AB990F86420142A09D0152A07D00C202071CD -:20F7200009E00000060700205800002080F869110020F4E721711020A0702E20E07028882E -:20F74000E08001206071207070BD2DE9FC47FD4C0646207828B13821102000F0E6F9BDE83E -:20F76000FC8770884BF68032122190420AD848B14FF0000830886946FEF728FD20B1022080 -:20F78000207110E021710EE0019800F15809851C2F887288394648460FF0BCFA2888B842BF -:20F7A000F6D184F80480012060713821E1702070D5E77CB5E34C0546207820B149211020EC -:20F7C00000F0B3F97CBD28886946FEF7FFFC38B102202071012060714921E17020707CBDF3 -:20F7E00001987F22014680F8602080F86120002280F86220A87801F82C0FE878487028796E -:20F8000088702271E6E71CB5CE4C217821B15421102000F08AF91CBD00886946FEF7D6FC4B -:20F8200048B102202071012060715421E1701021A17020701CBD019890F8720000B1012054 -:20F8400000212171A071EEE71CB5BE4C217821B11321102000F069F91CBD00886946FEF70E -:20F86000B5FC08B1022005E0019890F82C10012902D00C20207106E0602100222271095C80 -:20F8800021720088E080012060711321E1701021A17020701CBD2DE9F041AA4C05462078AB -:20F8A00028B1BDE8F0414A21102000F03EB92888072101F0D3F8012358B382886D88C68807 -:20F8C000418803EB4207BD4217D342F210777E43BF107943B6FBF1F1491E89B24FF4FA7650 -:20F8E000B14200D931468D4200D22946491C521CB1FBF2F15143491E8AB290F8961101B933 -:20F900000284E2800020207163714A20E0702370DDE40220F7E770B58A4C0546207828B1B5 -:20F92000BDE870404C21102000F0FFB82888072101F094F890B1A97811F0010180F8D71015 -:20F9400004D090F8D51009B109F08AFD00202071012060714C21E170207070BD0220F6E70F -:20F9600078490A781AB15221102000F0DEB802789AB142788AB142881B2A0ED382881B2A57 -:20F980000BD3C288022A08D36E4A0368423242F80A3F40685060002000E0122008710120FA -:20F9A00048715222CA700870704770B5654C0546207828B1BDE870405321102000F0B5B8C9 -:20F9C000287800F0010008F0A1FB287800F0010009F0F7FC00202071012060715321E1701D -:20F9E000207070BD70B5574D0646287828B1BDE870405521102000F098B80122708811460F -:20FA000008F087FB04467088012109F00EFD844200D204463088012100F06FF80646012183 -:20FA2000002000F06AF8304401219630844206D900F19601201AB0FBF1F0401C81B2E9800D -:20FA400000202871012068715521E970287070BD70B53C4D0446287828B1BDE870404E212A -:20FA6000102000F062B800F071F808B10C200DE0601C0EF0A5FF207800F0010005F0F8FE8F -:20FA8000207800F0010006F080FF00202871012068714E21E970287070BD70B5294C054643 -:20FAA000207828B1BDE870404B21102000F03DB809F0C6FE08B10C2003E0287806F031F8BB -:20FAC00000202071012060714B21E170207070BD10B50178572907D21B4A52F8211019B1C8 -:20FAE000801C8847012010BD002010BD18B1022801D0012070470020704710B5012904D08A -:20FB0000022905D0FFDF204610BDC000503001E080002C3084B2F6E7022903D0C000703066 -:20FB200080B2704780003C30FAE7064A92F83130002B06D182F8320082F83310012082F8CE -:20FB40003100704706070020C420020010B508F015FD042807D008F011FD052803D009F0D9 -:20FB60006FFE002800D0012010BD2DE9FE4300250F4680460A260421404604F042F840460C -:20FB80000FF00EFC062000F013FF044615E06946062000F0EEFE0AE0BDF80400B84206D0D1 -:20FBA0000298042241460E3011F07AFF50B1684600F0BDFE0500EFD0641E002C06DD002D6A -:20FBC000E5D005E040460FF0F4FBF5E705B9FFDFD8F800000FF0A8F8761E01D00028CAD009 -:20FBE000BDE8FE8390F8721041B990F8C81029B190F8C800042801D00120A2E70020A0E703 -:20FC0000017801299DD1416891F8D520002A98D0002281F8D520406809F022BC91E710B5CE -:20FC2000038843F6FD711A1F8A4223D24288141F8C421FD29A421DD8C28940F67B43911F1C -:20FC4000994217D2018A8C1F9C4213D28A4211D8428AB2F5FA7F0DD2828A40F67744A2F1D7 -:20FC60000A03A34206D2B2EBD10F03D9C18A028B914201D9302010BD017911B1012910D178 -:20FC800007E0417929B1012903D0022901D0032907D1007B38B1012805D0022803D0032862 -:20FCA00001D0122010BD002010BD000008440830424301F14A00104480B27047F0B51D46FD -:20FCC0000446A818059B083000FB03F205F14A00104486B2B14238BFFFDF00272760676049 -:20FCE000A760E76027616761A761E76127624FF6FF706762A082A6F1280080B26577608041 -:20FD0000B0F5004F88BFFFDF608805F13C01884238BFFFDF6088401B3C3880B220801B2844 -:20FD200038BF1B202080A777F0BD8161886170472DE9F04F0D46C188044600F128080089BF -:20FD400021F4004320F4004221F4004620F400474FF0010A4FF000099A4208D100F40040C4 -:20FD600001F4004188421CBF0020BDE8F08FB7420BD9617FB81B401A083885421BDC08EB89 -:20FD800006000021058041801EE06088617F801B401AB0F1080B0ED4BBF11B0FB8BFFFDF7A -:20FDA0005D45D4BF29461FFA8BF1681A0204120C18BFBA4204DD84F817900020BDE8F08F49 -:20FDC00008EB06000180428084F817A0BDE8F08F2DE9F041044600F12802C08820F4004345 -:20FDE000E07D002808BFBDE8F081D0180288438813448B423CBF0020BDE8F0810027914215 -:20FE00009CBF0180478013D9891A0D042D0C45800ED0E088A61D20F40040854288BFFFDF58 -:20FE200030884FF4004121EA0000284330800AE0627F008802F108031044083081B2628866 -:20FE4000A01D00F0A8FBE7750120BDE8F08130B4B0F804C0C488034600F128052CF400405C -:20FE60002844A44503D10020188230BC7047B3F80CC00488A44509D34088ACEB040CA0EB3A -:20FE80000C0084B20CEB0500C01E06E0A4EB0C045D7FA4B2AC446044401DB1F800C0A4454C -:20FEA00088BF0C80B3F80CC0BCF1000F0CBF4FF0010C4FF0000C82F800C00988198230BC88 -:20FEC00070472DE9F041044600F12801808820F400404518208A002808BFBDE8F081A0892F -:20FEE00010B9A069807F2871A089218A084480B2A08129886A881144814238BFFFDF2888E5 -:20FF00006D88A2894119002791421AD175B1A088261D20F40040A84238BFFFDF30884FF4E3 -:20FF2000004121EA00002843308009E0627F1044083081B202F108036288201D00F02BFB96 -:20FF4000A78127820120BDE8F0812DE9F0474189B0F804800027044600F1280A414518BF65 -:20FF60004FF400493AD000BF21F40040504446886EB1608904F10A0520F40040B04238BF2C -:20FF8000FFDF288829EA00003043288021E0637F008803F1080C18446389083023F4004556 -:20FFA0006288284480B204F10A0190420BD2121A92B20CF11B0C62452CBF03F4004229EA98 -:20FFC000030004D204E0801A80B229EA030210430880781C618987B24145C5D13846BDE8AF -:20FFE000F0872DE9F047B0F808800B46044600F12801B0F80A90808828F4004C01EB0C05A9 -:020000040001F9 -:20000000804504BF0020BDE8F087002A1CBF681D106023B1627F691D184611F06DFD2F8867 -:200020006D888DB1E81987B2208904F1080620F40040A84238BFFFDF30884FF4004121EA4D -:200040000000284330800AE0607F6288C119083100F1080389B204F1080000F09CFAC845F8 -:2000600004BF208960813846BDE8F0878188C08881420CBF0120002070470189808881426D -:200080000CBF01200020704730B48488C28800F1280324F4004C22F40041634494421BD024 -:2000A0008289048A15191C885A88A3189D4216D312B18A4210D212E0437F0CF1080C1A1907 -:2000C0006244408892B2801A80B22333984201D211B104E08A4202D130BC0020704730BCAB -:2000E000012070472DE9F007B0F806C0048900F1280702462CF400457E1924F400492CF43B -:20010000004A002024F400434FF00108D1450AD104F400440CF4004C644504D05082BDE865 -:20012000F00700207047AB4208D992F81DC05B1BA3EB0C03A3F10804002308E0B2F802C092 -:20014000547FACEB050CACEB040CACF10804002CE4DBB2F80EC0BCF1000F0DD0B6F800C06A -:2001600075884DB15B1B10778B42D7DBD0893844A0EB0C00C01E09E0A4EB0C0410778C42E1 -:2001800008DB507FD38918443044401D5182BDE8F00770478B42A8BF82F81C80E6DABDE750 -:2001A0002DE9F05F044600F1280AC088934620F400400AEB0005608A894608B1484502D22B -:2001C0000020BDE8F09FE08980B1B5F800806E8808EB0601884218BFFFDF207F4FF00007B0 -:2001E00050EA060108D0002840D04AE04FF00008A17F46462971F0E7E08948B1617F014499 -:200200004819B4F81F10A0F8051094F82110C171E18908EB09004944E18128806F80BBF16E -:20022000000F19D0607F298800F108030144083189B26288A01D00F0AEF9E781A07F401C60 -:20024000A077A07D00281CBFE088A082A7756782E7750120BDE8F09F607FE1890844284426 -:20026000B0F80510A4F81F10C0792EE0E089B4F81F105044A0EB080020F8031D94F821104F -:20028000817006EB090086B2E089BBF1000F4844E081A5F800806E800ED0E088A51D20F403 -:2002A0000040B04238BFFFDF28884FF4004121EA000030432880C0E7E0895044A0EB0800A6 -:2002C00030F8031DA4F81F10807884F82100BEE7818800F1280221F4004C6244B0F814C02A -:2002E000C388614518BF99420FD0818969B9806968B101898388994209D021F40041283057 -:20030000084411790079884201D1002070471046704700F12803407F01F1050C604410601C -:200320000888002804BFD81E106008884988084480B270472DE9F04115460A4600F1280635 -:200340001C46407F531D034410885788069900281CBFC01C80B226D088429CBF081A80B22F -:2003600013D9401AA042A8BF20461FFA80F858184246294611F094FB002818BFBDE8F081EB -:200380004544A4EB080084B2002001198F423CBF4FF0FF30BDE8F081304422462946BDE88D -:2003A000F04111F07DBBFA1C97B2F61ED4E72DE9F04100F128071D46407F4B1D0344164611 -:2003C00008880024B1F80280069A00281CBFC01C80B21FD090429CBF101A80B20DD9801A95 -:2003E000A842A8BF284684B299182246304611F083FB281B85B2264400204119414506D838 -:2004000039182A46304611F077FB601984B22046BDE8F08108F103011FFA81F8FF1ED9E79B -:200420002DE9F04116460A4600F128071D46407F531D034410880024B2F802800699002821 -:200440001CBFC01C80B21FD088429CBF081A80B20DD9401AA842A8BF284684B2581822463E -:20046000314611F049FB281B85B2264400204119414506D838442A46314611F03DFB6019E9 -:2004800084B22046BDE8F08108F103021FFA82F8FF1ED9E7401D704770B5044600F128019F -:2004A000C288808820F400431944904208D0A289002A04BF228A002A02D1A28A904201D1FB -:2004C000002070BDB1F800C04D8885B1261D20F40040A84238BFFFDF30884FF4004121EABE -:2004E00000002843308000202082012070BD607F0CF1080100F10803084481B26288201D4A -:2005000000F049F8EFE70021C18101774182C1758175704703881380C289002A04BF0020DD -:200520007047C28800F1280322F400421A440A60C089704710B50446808AA0F57F41FF39D8 -:2005400018BFFFDFE088A082E089002818BF0120A07510BD4FF6FF7181820021817570476B -:2005600010B50446808AA0F57F41FF3908BFFFDFA07D28B9A088A18A884204BF002010BD65 -:20058000012010BD8188828A914205BF807D002800200120704710B4B0F800C02CF4004414 -:2005A000214489B24FF4004491420AD2521A92B21B339A422CBF0CF4004224EA0C0104D26D -:2005C00004E0891A89B224EA0C021143018010BC704770B516464FF6FC72C91C01EA0205DA -:2005E000D8B10446C01C20F00301A14200D0FFDF201D012108E00246284401D2034600E0B0 -:200600000023491CC9B21360B142F4D916B104F1040001E04FF00000206005FB06F000F15D -:20062000040070BD024600201168002902D0084609681160704702680A60016070474FF695 -:20064000FC73C91C1940101A001F90FBF1F0C0B270474FF6FC73C91C1940001D01FB020002 -:20066000704770B50C00054609D0082C00D2FFDF1DB1A1B2286800F044F8201D70BD0DB185 -:2006800000202860002070BD0021026803E093881268194489B2002AF9D100F032B870B5D7 -:2006A00000260D460446082900D2FFDF206808B91EE0044620688188A94202D00168002925 -:2006C000F7D181880646A94201D100680DE005F1080293B20022994209D32844491B02609B -:2006E00081802168096821600160206000E00026304670BD00230B608A8002680A60016027 -:20070000704700234360021D018102607047F0B50F460188408815460C181E46AC4200D3B3 -:20072000641B3044A84200D9FFDFA019A84200D9FFDF3819F0BD2DE9F041884606460188E3 -:20074000408815460C181F46AC4200D3641B3844A84200D9FFDFE019A84200D9FFDF7088FE -:200760003844708008EB0400BDE8F0812DE9F041054600881E461746841B8846BC4200D3E7 -:200780003C442C8068883044B84200D9FFDFA019B84200D9FFDF68883044688008EB04006B -:2007A000E2E72DE9F04106881D460446701980B2174688462080B84201D3C01B2080608837 -:2007C000A84200D2FFDF7019B84200D9FFDF6088401B608008EB0600C6E730B50D460188BB -:2007E000CC18944200D3A41A4088984200D8FFDF281930BD2DE9F041C14D04469046A87893 -:200800000E46A04200D8FFDF05EB8607B86A50F8240000B1FFDFB868FFF704FF05000CD058 -:20082000B86A082E40F8245000D3FFDFB5484246294650F82630204698472846BDE8F081A8 -:200840002DE9F0471E460400074602EB060091468A46C5B227D000218846FF2800D9FFDFC1 -:20086000E01C20F00300A04200D0FFDFB24500D9FFDFA34880F800A080F801908570C570F5 -:20088000057145718671DFF87CA280F8079000260AF1400A8146FF1C27F003000746B8F1D4 -:2008A000000F03D005E04FF00101D5E709EB860188603AF8161019F8062001D04FF0000072 -:2008C000FFF787FE761CF6B20744082EE3D3FF1C27F003002A460646B8F1000F0DD0002086 -:2008E0000221FFF776FE4346002130440F46C846C01C20F003021BB110E0C9F84800EFE75E -:2009000008EB81060020B26206E000BFD6F828C04CF82070401CC0B2A842F7D3491CC9B298 -:2009200002EB85000829E3D3001BBDE8F08710B5044603F0BBFC08B1102010BD2078704A66 -:20094000618802EB800092780EE0836A53F8213043B14A1C6280A180806A50F82100A06010 -:20096000002010BD491C89B28A42EED86180052010BD70B505460C46084603F097FC08B136 -:20098000102070BD082D01D3072070BD25700020608070BD0EB56946FFF7EBFF00B1FFDFFA -:2009A0006846FFF7C4FF08B100200EBD01200EBD10B50446082800D3FFDF5148005D10BD8D -:2009C0003EB5054600246946FFF7D3FF18B1FFDF01E0641CE4B26846FFF7A9FF0028F8D064 -:2009E0002846FFF7E5FF001BC0B23EBD44498978814201D9C0B27047FF2070472DE9F041B6 -:200A000090460C460546062901D0072C10D13C4FB86CFFF707FE02004FF6FF7604D00221F2 -:200A2000B86CFFF70CFE00E030462880B04201D1002003E742462146FFF7DCFE040002D130 -:200A4000288800F04FF82046F8E6A0F57F43FF3B01D0082901D300207047CBE6A0F57F4226 -:200A6000FF3A0BD0082909D2254A9378834205D902EB8101896A51F82000704700207047E0 -:200A80002DE9F04105460C46A5F57F4143F20200FF3902D0082C01D30720CFE618494FF053 -:200AA00000088A78AA42F8D901EB8406B26A52F82570002FF1D013483946203050F8242058 -:200AC00028469047B16A062C41F8258001D0072C02D1284600F006F83946B068FFF7ABFD3E -:200AE0000020ABE610B5064CC2B20221A06CFFF7B0FD0146A06CBDE81040FFF79CBD000051 -:200B0000600700202022020070B50E461D46114600F0D4F804462946304600F0D8F82044C8 -:200B2000001D70BD2DE9F04190460D4604004FF0000610D00027E01C20F00300A04200D0EA -:200B4000FFDFDDB141460020FFF78BFD0C3000EB850617B112E00127EDE7614F04F10C00EB -:200B6000A9003C602572606000EB85002060606811F05BF841463868FFF773FD3046BDE825 -:200B8000F0812DE9FF4F564C804681B020689A46934600B9FFDF2068027A424503D94168FF -:200BA00051F8280020B143F2020005B0BDE8F08F5146029800F082F886B258460E9900F0DB -:200BC00086F885B27019001D87B22068A14639460068FFF764FD04001FD0678025802946E6 -:200BE000201D0E9D07465A4601230095FFF766F82088314638440123029ACDF800A0FFF75D -:200C00005DF82088C1193846FFF78FF8D9F800004168002041F82840C7E70420C5E770B524 -:200C20002F4C0546206800B9FFDF2068017AA9420ED9426852F8251051B1002342F825301D -:200C40004A880068FFF756FD216800200A7A08E043F2020070BD4B6853F8203033B9401C02 -:200C6000C0B28242F7D80868FFF70EFD002070BD70B51B4E05460024306800B9FFDF3068ED -:200C8000017AA94204D9406850F8250000B1041D204670BD70B5124E05460024306800B952 -:200CA000FFDF3068017AA94206D9406850F8251011B131F8040B4418204670BD10B50A4656 -:200CC0000121FEF7F3FFC01C20F0030010BD10B50A460121FEF7EAFFC01C20F0030010BD7E -:200CE0006C00002070B5044600780E46012813D0072802D00B2813D10EE0A06861690578CC -:200D0000052003F061FA052D0AD0782300220520616903F0AFF903E00520616903F054FAFA -:200D200031462046BDE8704001F0A8B910B500F13902C3799478411D64F003042340C371A6 -:200D4000DB070DD04B79547923404B710B79127913400B718278C9788A4200D9817010BDA8 -:200D600000224A710A71F5E74178012900D00C21017070472DE9F74F88B000208C698DF809 -:200D800004000878012617460D464FF007094FF0110A4FF00A0B292876D2DFE810F0290072 -:200DA000D20215032D036F037E039903C703DC030604330457047004AE04BF04E204EA0486 -:200DC0000A052C0557057A05A605C605D605F605F805050637065906AD06EA06EC061B0751 -:200DE0003B074407550792071B08410808080D0814B120781E2829D0D5F808805FEA08009E -:200E000042D001208DF80400686A02228DF8082006908DF809B0286A0390A8880028EFD063 -:200E200098F8001091B10F2910D27DD2DFE801F07C134BDCFEFDFCFBFAF9F8089EF7F60089 -:200E4000022821D124B120780C2801D00026F9E38DF80420B3E10520696A03F0B5F9A888FC -:200E60000728EED1204601F003F9022809D0204601F0FEF8032808D9204601F0F9F807285E -:200E800003D20120207005E003E2002CB8D020780128D6D198F80400C11F0A2903D300BFAA -:200EA00085F81CB04CE2A070D8F80010A163B8F80410A18798F8060084F83E0001202870D2 -:200EC0000320207046E00728BBD1002C98D020780D28B6D198F8031094F83B20C1F3C00098 -:200EE000C2F3C002104201D0062000E00720890707D198F805100142D2D198F8061001424F -:200F0000CED194F83D2098F8051020EA02021142C6D194F83E2098F8061090430142BFD176 -:200F200098F80400C11F00E008E20A29B8D2617F814201D906209AE3D8F800106160B8F845 -:200F40000410218198F80600A072012028700E20207003208DF80400686A069004F139007A -:200F60000290601D039017300490DBE0412890D1204601F07DF8042802D1E078C00704D1B0 -:200F8000204601F075F80F289ED1A88CD5F80C8080B24FF04009666AFFF76AFE32460826CC -:200FA00041464B460096FFF702FA0D208DF80400686A0690606A0290002101A8FFF792FEC7 -:200FC0002078042808D0A07F48B1012807D0032808D0102020709CE005202070CEE184F83E -:200FE00000A033E71220F5E71128C0D1204601F03FF8042802D1E078C00719D0204601F073 -:2010000037F8062805D1E078C00711D1A07F02280ED0204601F02CF8112808E0B3E083E0E3 -:2010200072E156E136E109E1EAE0D0E017E09ED1102208F1010104F1480010F05DFD6078A9 -:20104000012809D012202070E078C00765D0A07F90B301285DD060E084F8009059E0112802 -:2010600085D1204601F004F8082804D0204600F0FFFF132888D12869D0B16869C0B104F192 -:201080007800102208F10101064610F035FD2078082812D014202070E078C0070FD0A07FA2 -:2010A000022818D06178022912D0032831D034E000208DF80400ECE02BE00920EBE70B2052 -:2010C0002870296901204870206CC1E9010662E208B101287AD10B202870296981F8019000 -:2010E000606A4860206AC1E9020648E2206CE2780068C2F34402521ED04000F0010040F02E -:20110000800000E000200874E06A48614CE20646FEE3042028700520BAE185F800B08DF857 -:2011200004B08EE33946F4E31128C4D1204600F09FFF0A2802D1E078C00704D1204600F023 -:2011400097FF1528B7D1102208F1010104F1480010F0D2FC20780A2810D01620207012205A -:20116000287029690920487004F158004860203088601038C860206C086184E30B202070B0 -:20118000B9E22870FEE3022895D1204600F070FF042804D3204600F06BFF082809D32046B1 -:2011A00000F066FF0E2886D3204600F061FF12286FD2A07F0228B8D110208DF80400686ABD -:2011C000069098F801008DF80800F6E33DE20228ABD1204600F04CFF00285AD0204600F074 -:2011E00047FF0128F9D0204600F042FF0C28F4D004208DF8080098F801008DF809005AE717 -:201200001128FCD1002CFAD020781728F7D16178E06A022910D0002101EB4101182606EB87 -:20122000C1011022405808F1010110F065FC0520696A00F010FF1DE10121EDE70B28DED1F9 -:20124000002CDCD020781828D9D16178E06A02291BD0002101EB4101102202EBC101415832 -:20126000B8F8010008806078E16A02280FD0002000EB4002142000EBC2000958404650F8AC -:20128000032F0A604068486039E00121E2E70120EEE7A1E11128B2D1002CB0D020781928A5 -:2012A000ADD16078E16A022811D0002000EB40021C2000EBC2001022085808F1010110F0BF -:2012C0001BFC0520696A00F0C6FE1A20D4E00120ECE7082893D1002C91D020781A288ED10F -:2012E000E06A98F80120017862F347010170E16AD8F8022041F8012FB8F8060088800520E3 -:20130000696A00F0A8FE3CE3112898D1002C98D020781B2893D16178E06A02290CD0002185 -:2013200001EB4101202202EBC1011022405808F1010110F0E1FBE2E70121F1E785F81C9001 -:20134000EFE338780128A6D11C2204F11C00796810F017FCE079C10894F83B0001EAD00183 -:20136000E07861F30000E070217F09B1297733E1217803290AD0C0073FF42DAE0320287034 -:201380008DF804B0686A06904120B1E3607FA17888423FF6CFAD02262671E179204621F0B4 -:2013A000E001E171617A21F0F0016172A17A21F0F001A172FFF7BAFC2E708DF804B0686AC5 -:2013C00006908DF80890ADE638781128CFD18DF80490696A0691916800208DF81400039175 -:2013E000ADF8089008466168016021898180A17A817104202070E0E238781128B7D18DF814 -:201400000490686A0690381D02AB07C883E807004120ADF8080000208DF8140008460C214B -:201420000170A88CCA4680B2FE684FF04009D4F82080FFF72FFC3146082642464B460096F6 -:20144000FEF7EEFF002101A8FFF74CFCE07820F03E00801CE0702078052801D00F200BE060 -:20146000A07F20B1012802D0032803D03DE184F800A04EE62670E9E42070E7E4387803287C -:20148000A4D178680168A1664068E066052028708DF80400686A069044E63878032895D180 -:2014A00078680168216740686067206C68B9A07F28B1012803D0062028700420E8E785F81D -:2014C0000090FE4820646064F9E385F80090F6E33878022892D1387900287CD1A07F022880 -:2014E0000BD00328F1D1607801280BD0A07994F83A1001280AD0F1480BE0B86800286BD0AF -:20150000206411E0A17994F83A00F2E7B8680028F5D02064E078C00701D0012901D0E748F2 -:2015200002E0F8680028EAD06064CEE78DF804B0696A0691E1785846C90709D061780229C7 -:2015400003D1A17F29B1012903D0A17F032900D00820287064E33878112891D1B8682862A8 -:2015600009202870E0782969C0070DD081F80190206A4860606A886004F16800C860A07F8A -:2015800002287FF4BFADB1E501204870206C486004F16800886004F13800C860201D08615F -:2015A000206B4861606B88612AE2E1783878C90701D0062100E00A2188428BD1207807286E -:2015C0001DD084F800A000BF8DF80490686A0690286A039001E0CAE08DE20024ADF808A032 -:2015E0008DF81440032100F8011B5168102210F083FA002101A8FFF775FB2C6226E4082082 -:201600002070E1E738781128A7D18DF80490686A06909068039000208DF814000398ADF80C -:2016200008A0042100F8011B102204F1680110F063FA002101A8FFF755FB2078092802D031 -:20164000132019E73CE384F800B016E0E1783878C90701D0062100E00A218842ADD11022C0 -:2016600004F14800796810F01BFA10B104202877EAE3207809283FF4EEAC0C2081E5E07866 -:20168000C10738D0A17F012902D002291BD02EE00D202870296981F801B06078012809D0DF -:2016A000206A4860606A886004F16800C8601030086129E5606A4860206A886004F17800B9 -:2016C000C8601038F4E7C0F3440114290FD24FF0006101EBB0104FEAB060E07060780128C3 -:2016E00003D010202070042057E10620C4E6607801283FF476AC0E2043E538780928ADD120 -:2017000085F800B00F208DF80400686A069050680290002101A8FFF7E5FAE8E7E078C007A5 -:201720000AD0A07F012803D10F202870042036E1102028700E2032E1152028702969022027 -:201740004870206C48606078012805D004F1780088601038C86053E104F168008860103049 -:20176000F8E738780228CAD138790028E0D0287768E338781328FBD185F800A02969082014 -:20178000487078684860607801280DD004F1680088601030C860206B0861606B486104F121 -:2017A00058008861A06A22E004F1780088601038F0E738780728DBD16078012801D01320D8 -:2017C00029E2A178A06A0844C1F1100110F00BFA1220287029690920487004F15800486095 -:2017E000203088601038C860206C086144E0C861E06A086204E138780828B9D1102204F1D5 -:201800004800796810F04CF908B10B202FE720780B2812D02046FFF789FAA178A06A084465 -:20182000C1F1100110F0DFF91620287008208DF80400686A0690002072E0132028708DF864 -:2018400004B0686A06908DF808A06BE4387811288ED1B868286214202870296909204870BF -:2018600004F158004860103088601030C860606C08616078012806D004F139004861206B75 -:201880008861606BB3E7601D4861606B8861206BADE7387808288ED18DF80490686A069041 -:2018A000286A00260D210390ADF808A08DF8146000F8011B1022796802E0000074230200C7 -:2018C00010F01AF9002101A8FFF70CFA2E626078012801D01520CFE51620287008208DF869 -:2018E0000400686A029606901BE038780B2884D1162028706078022802D12046FFF716FAA2 -:20190000A17878680844C1F1100110F06CF901E083E215E008208DF80400686A0690786826 -:201920000290A0788DF80C004DE538780F288FD1E079C00773D01720287009202FE0114632 -:2019400001A8FFF7CFF9FFF7E2BB38781028A2D11422391D04F11C0010F013F9E16A208D91 -:20196000A1F80900E16AA078C871E179E26A01F003011172E16A627A0A73E16AA07A81F889 -:20198000240000E09BE1242078E6192043E138781128ACD1B86828621A20287005208DF83C -:2019A0000400686A0690CAE7387803289FD16078E16A022802D0012001E05CE2002000EB55 -:2019C0004002142000EBC2027B688A5819681160596851601B212970D5E9041205234B702D -:2019E000636A4B606678E36A022E01D0012600E0002606EB460600EBC6001858C1E902020A -:201A0000686A4862089800F050FB9CE738780E2871D16078E26A022802D0012001E0ADE114 -:201A2000002000EB4001102000EBC10002231058093279680EF01EFB1C2028702969042034 -:201A40004870206A4860E06A09308860FB4881E638780D284FD16178E06A022901D0012141 -:201A600000E0002101EB4101182606EBC101A2784058796810F040F86078E16A022801D05D -:201A8000012000E0002000EB400206EBC200B0460858A1780844C1F1100110F0A4F88DF8A6 -:201AA0000490686A0690286A00260390ADF808A08DF81460062101706178E26A022901D0E0 -:201AC000012100E0002101EB410308EBC301401C5158102210F010F8002101A8FFF702F902 -:201AE0001D202E6228708DF804B0686A06900B208DF8080067E481E0387811287ED18DF8BF -:201B00000490686A0690B86803900B20ADF80800039880F800906278E16A022A02D0012255 -:201B200001E091E1002202EB4202102303EBC20289580988A0F801106178E26A022901D0DE -:201B4000012100E0002101EB4103142101EBC30151580A6840F8032F4968416056E02720F9 -:201B6000287001208DF814002DE42420287000209FE01F204FE0387811283FD18DF8049007 -:201B8000686A0690B868039000208DF814000398ADF808A0082606706178E26A022901D0C4 -:201BA000012100E0002101EB41031C2101EBC301401C515810220FF09FFF002101A8FFF751 -:201BC00091F8202028708DF804B0686A06908DF8086061E43878112810D18DF80490686A1C -:201BE0000690B86803900820ADF80800039809210170E16909784908417000E094E0E16926 -:201C000051F8012FC0F802208988C18020781D28ABD1A4E7222028708DF804B0686A0690C0 -:201C20008DF808A08BE6387811287DD1B868286223202870296904204870206A4860E06A60 -:201C4000093088607E4885E538780D286CD16178E06A022901D0012100E0002101EB4101A1 -:201C6000202606EBC1011022405879680FF044FF8DF80490686A0690286A0390ADF808A08B -:201C800080F800B06278E16A022A01D0012200E0002202EB420206EBC202401C8958102280 -:201CA0000FF02AFF0020286221781D29B1D0242129708DF81400002101A8FFF713F8032687 -:201CC000DFE0E078C00702D04FF0060C01E04FF0070C6078022809D04FF0000000EB0401C6 -:201CE00001F1090105D04FF0010004E04FF00100F4E74FF000000B78204413EA0C030B7027 -:201D000010F8092F02EA0C02027004D14FF01C0C84F800C092B394F801C0BCF1010F00D080 -:201D2000E3B990F800C000E053E05FEACC7804D02CF00106067018260EE05FEA8C7804D560 -:201D40002CF0020606701E2606E05FEA4C7805D52CF00406067021262E70032694F801C0E1 -:201D6000BCF1020F00D0DAB991F800C05FEACC7805D02CF001060E7017210FE01AE05FEA8C -:201D80008C7804D52CF002060E70192106E05FEA4C7805D52CF004060E701B212170002626 -:201DA0000078D0BBCAB3C3BB1D20207035E03878122847D1282061E42078012842D00C28AD -:201DC00040D02046FEF7D0FF0B208DF80400686A069037E038784FF02608112805D0122039 -:201DE0001070032685F800804BE08DF80490686A0690B86803900220ADF8080001208DF869 -:201E00001400039805210170297F4170114601A8FEF768FF064685F80080012E12D030E05D -:201E200001208DF80400686A069003208DF80800287F8DF809000020287716E06C23020065 -:201E400070220200287F80B11E202070252028708DF804B0686A069002208DF8080039469C -:201E600001A8FEF73FFF06460BE00CB1FE2020709DF8040028B1002101A8FEF733FFFEF78C -:201E8000E5BF0BB03046BDE8F08FF0B587B00C464E6900218DF8041001202578034602277A -:201EA0004FF0070C85B1012D50D0022D36D1FE2030708DF80030606A059003208DF8040098 -:201EC000207E8DF8050060E02179012922D0022929D0032924D0042920D1B17F02291DD139 -:201EE00031780D1F042D04D30A3D032D01D31E2914D12189022911D38DF8047023702089A0 -:201F00009DF80410884217D20A208DF80000606A059057E070780128EED0052007B0F0BDC8 -:201F20001E203070E8E771780229F6D131780C29F4D18DF804C0E1E71120083402F8040BEF -:201F400094E80B0082E80B000320E7E71578112DE4D18DF800C0656A0595956802958DF84D -:201F6000101094F804E0BEF1010F13D0BEF1020F2DD0BEF1030F1CD0BEF1040FCED1ADF8BF -:201F800004700E202870207E687000216846FEF7A9FE0CE0ADF804700B202870207E00219F -:201FA00000F01F0068706846FEF79CFE37700020B4E7ADF804708DF8103005202870207E62 -:201FC0006870277011466846FEF78CFEA6E7ADF804C02B70207F6870607F00F00100A8701E -:201FE000A07F00F01F00E870E27F2A71C0071CD094F8200000F00700687194F8210000F093 -:202000000700A87100216846FEF76CFE2868B063A888B087A87986F83E00A06940787077E3 -:202020002879B0700D203070C1E7A9716971E9E700B587B005280CD101208DF800008DF885 -:202040000400002005918DF8050001466846FEF749FE07B000BD70B50C46054602F0B4F837 -:2020600021462846BDE870407823002202F002B808B1007870470C207047000070B50C00D1 -:2020800005784FF000010CD021702146F3F79DF872482178405D884201D1032070BD022032 -:2020A00070BDF3F792F8002070BD027B032A05D000220A704B780B2B02D003E0042070478E -:2020C0000A770A62027B9300521C0273C15003207047F0B587B00F4605460124287B05EB01 -:2020E000800050F8046C7078411E0C290AD25B493A46123101EB8000314650F8043C284610 -:20210000984704460CB1012C11D1287B401E10F0FF00287301D00324E0E70C208DF80000BF -:20212000706A0590002101966846FFF7A7FF032CD4D007B02046F0BD70B515460A46044677 -:2021400029461046FFF7C5FF064674B12078FE280BD1207E30B100202870294604F10C004E -:20216000FFF7B7FF2046FEF7FFFD304670BD704770B50E46044688210FF057FD0225012EED -:2021800003D0022E04D0052070BD0120607000E065702046FEF7E8FDA577002070BD28B1EE -:2021A000027E1AB10A4600F10C01C5E70120704710B5044686B0052002F006F82078FE28EA -:2021C00006D000208DF8000069462046FFF7E7FF06B010BD7FB50E4600218DF80C1041780D -:2021E0000B2903D00C2903D0002405E0846900E044690CB1217E91B16D4601462846FFF751 -:2022000054FF032809D1324629462046FFF794FF9DF80C10002900D0042004B070BD04F1EC -:202220000C05EAE710B590B00C4607900B480421801E08900A488DF8191009900F92694637 -:2022400006A8FFF7C7FF002805D11022204601990FF052FC002010B010BD00007622020050 -:202260006C23020070B50D46040011D085B1210128460FF0B8FC10224E4928460FF03CFC89 -:202280004C4801210838018044804560002070BD012070BD70B5474E00240546083E10E064 -:2022A0007068AA7B00EB0410817B914208D1C17BEA7B914204D10C2229460FF0F1FB30B1C8 -:2022C000641C30888442EBDB4FF0FF3070BD204670BD70B50D46060006D02DB1FFF7DAFF0B -:2022E000002803DB401C14E0102070BD314C083C20886288411C914201D9042070BD6168B4 -:20230000102201EB001031460FF0F6FB2088401C20802870002070BD70B514460D0018D02B -:20232000BCB10021A170022802D0102811D105E0288870B10121A170108008E02846FFF723 -:20234000A9FF002805DB401CA070A8892080002070BD012070BD70B5054614460E000BD042 -:2023600000203070A878012808D005D91149A1F108010A8890420AD9012070BD24B128789F -:2023800020702888000A5070022008700FE064B14968102201EB0011204610390FF0ACFB60 -:2023A000287820732888000A607310203070002070BD0000780000202DE9F04190460C4639 -:2023C00007460025FE48072F00EB881607D2DFE807F00707070704040400012500E0FFDFE3 -:2023E00006F81470002D13D0F548803000EB880191F82700202803D006EB4000447001E059 -:2024000081F8264006EB44022020507081F82740BDE8F081F0B51F4614460E460546202A63 -:2024200000D1FFDFE649E648803100EB871C0CEB440001EB8702202E07D00CEB4601407886 -:202440004B784870184620210AE092F82530407882F82500F6E701460CEB410005704078B9 -:20246000A142F8D192F82740202C03D00CEB4404637001E082F826300CEB4104202363708B -:2024800082F82710F0BD30B50D46CE4B44190022181A72EB020100D2FFDFCB48854200DD15 -:2024A000FFDFC9484042854200DAFFDFC548401C844207DA002C01DB204630BDC148401C5C -:2024C000201830BDBF48C043FAE710B504460168407ABE4A52F82020114450B10220084464 -:2024E00020F07F40F0F751FB94F90810BDE81040C9E70420F3E72DE9F047B14E803696F802 -:202500002D50DFF8BC9206EB850090F8264034E009EB85174FF0070817F81400012806D0A1 -:2025200004282ED005282ED0062800D0FFDF01F0E5F8014607EB4400427806EB850080F877 -:20254000262090F82720A24202D1202280F82720084601F0DEF82A4621460120FFF72CFF80 -:202560009B48414600EB041002682046904796F82D5006EB850090F82640202CC8D1BDE852 -:20258000F087022000E003208046D0E710B58C4C2021803484F8251084F8261084F827107A -:2025A000002084F8280084F82D0084F82E10411EA16044F8100B2074607420736073A0735C -:2025C0008449E07720750870487000217C4A103C02F81100491CC9B22029F9D30120F0F7D7 -:2025E000C2F90020F0F7BFF9012084F82200F9F753FB7948F9F75FFB764CA41E2070774886 -:20260000F9F759FB6070BDE81040F0F739B910B5F0F75BF96F4CA41E2078F9F765FB60789B -:20262000F9F762FBBDE8104001F0A0B8202070472DE9F34F624E0025803606EB810A89B080 -:202640009AF82500202822D0691E02916049009501EB00108146D0E90112C0680391CDE930 -:202660000420B08BADF81C00B07F8DF81E009DF81500C8B10227554951F820400399E2193E -:20268000114421F07F41019184B102210FE00120F0F769F90020F0F766F9F0F734F901F066 -:2026A00065F886F82F508AE00427E4E700218DF81810022801D001281BD103983919014450 -:2026C0000998081A20F07F4033280BD903208DF815000398C4F13201401A20F07F4032246A -:2026E00003900CE096F8240018B9F0F753FC00284DD0322C03D214B101F02CF801E001F07E -:2027000035F8344A107820B393465278039B121B00219DF81840984601281BD0032819D031 -:202720005FF000008DF81E00002A04DD981A039001208DF818009DF81C0000B10221039879 -:20274000274A20F07F40039003AB099801F01AF810B110E00120E5E79DF81D0018B99BF8A0 -:202760000000032812D08DF81C50CDF80C808DF818408DF81E509DF8180058B103980123C5 -:20278000C11900221846F0F741F906E000200BB0BDE8F08F0120F0F7E6F899F90C20012311 -:2027A00000200199F0F732F9012086F82F008AF8285003482022694680300FF0E2F911E0CE -:2027C000AC090020FF7F841E0020A107B8220200AC0700208A000020233F0100F724010064 -:2027E000FFFF3F000120D2E72DE9F05FDFF84084064608EB860090F82550202D1FD0A8F12B -:2028000080002C4600EB8617A0F50079DFF824B405E0A24607EB4A004478202C0AD0F0F7AF -:2028200041F909EB04135A4601211B1D00F0AAFF0028EED0AC4202D0334652461EE0FE48C5 -:2028400008B1AFF30080F0F72DF998F82F206AB1D8F80C20411C891A0902CA1701EB12614F -:202860000912002902DD0020BDE8F09F3146FFF7DFFE08B10120F7E733462A462021042091 -:20288000FFF7C8FDEFE72DE9F041E94C2569F0F709F9401B0002C11700EB1160001200D43D -:2028A000FFDF94F8220000B1FFDF012784F8227094F82E00202800D1FFDF94F82E602020BC -:2028C00084F82E00002584F82F5084F8205084F82150DA4825600078022833D0032831D0DD -:2028E00000202077A068401C05D04FF0FF30A0600120F0F738F80020F0F735F8F0F733F9FB -:20290000F0F72BF9EFF7FFFF0EF094FBCC48056005604FF0E0214FF40040B846C1F8800261 -:20292000F0F7BBF994F82D703846FFF75DFF0028FAD0BF48803800EB871010F81600022888 -:2029400002D006E00120CCE73A4631460620FFF733FD84F8238004EB870090F8260020281D -:2029600004D0B648801E4078F9F7C4F9207F002803D0F0F7E8F82577657749E50146AC4840 -:2029800010B590F82D200024803800EB821000BF10F814302BB1641CE4B2202CF8D32020F0 -:2029A00010BDA84800EB0410016021460120FFF703FD204610BD10B5012801D0032800D18E -:2029C00071B39B4A92F82D30994C0022803C04EB831300BF13F812400CB1082010BD521C83 -:2029E000D2B2202AF6D3954A48B1022807D0072916D2DFE801F01506080A0C0E100000211F -:202A00000AE01B2108E03A2106E0582104E0772102E0962100E0B52151701070002010BDF5 -:202A2000072010BD854810B54078F0F7AEF880B210BD10B5202811D27D4991F82D30A1F19E -:202A4000800202EB831414F810303BB191F82D3002EB831212F81020012A01D0002010BDAD -:202A600091F82D2001460020FFF7A6FC012010BD10B5F0F717F8BDE81040F0F786B82DE9A8 -:202A8000F0410E466A4F01782025803F0C4607EB831303E0254603EB45046478944202D098 -:202AA000202CF7D108E0202C06D0A14206D103EB41014978017007E00020A9E403EB440016 -:202AC00003EB4501407848705F4F7EB127B1002140F2DA30AFF300803078A04206D127B1E5 -:202AE000002140F2DD30AFF30080357027B1002140F2E230AFF30080012089E410B5426853 -:202B00000B689A1A1202D41702EB1462121216D4497A91B1427A82B94C4A006852F82110A9 -:202B2000126819441044001D891C081A0002C11700EB11600012322801DB012010BD0020FA -:202B400010BD2DE9F047814639483E4E00EB8100984690F825402020107006F500701546CA -:202B600000EB81170BE000BF06EB04104946001DFFF7C4FF28B107EB44002C704478202C0B -:202B8000F2D1297888F8001013E000BF06EB0415291D4846FFF7B2FF68B988F80040A97B05 -:202BA00099F80A00814201D80020E8E407EB44004478202CEAD10120E1E42DE9FC410E466C -:202BC000074600241F4D08E09DF8000005EB00108168384600F0EAFD01246B4601AA314665 -:202BE0003846FFF7AEFF0028EED02046BDE8FC8170B504460E4801258038A54300EB84113B -:202C000000EB851040220EF077FF0F4E26B1002140F25C40AFF30080054800EB850100EB70 -:202C20008400D0F82500C1F82500AEB100210FE02C0A0020FFFF3F00000000008A00002099 -:202C400000F50040AC07002000000000B82202004FF48C60AFF30080284670BD2DE9FC4151 -:202C60008446FF481546089C00EB85170E4617F81400012803D0022801D00020B6E70B4641 -:202C8000F84A0121604600F07DFDA8B101AB6A4629463046FFF755FF70B1F1489DF80420C9 -:202CA0009DF80010803000EB85068A4208D02B460520FFF7AFFB0BE02A462146042014E095 -:202CC000202903D007EB4100407801E096F8250007EB440148709DF80000202809D007EBC2 -:202CE000400044702A4621460320FFF765FB01207CE706F8254F0120F070F3E7DA4901EB30 -:202D00000010001DFFF7E1BB7CB51D46134604460E4600F1080221461846EFF743FF94F9F4 -:202D200008000F2804DD1F3820722068401C206096B10220CD4951F8261046182068694693 -:202D4000801B20F07F40206094F908002844C01C1F2803DA012009E00420EBE701AAEFF7F7 -:202D600021FF9DF8040010B10098401C00900099206831440844C01C20F07F4060607CBDCF -:202D80002DE9FE430C460646097860799072207998461546507241B1B148803090F82E10ED -:202DA00020290AD00069401D0BE0D4E90223217903B02846BDE8F043A6E7AD484178701D02 -:202DC000084420F07F47217900222846A368FFF79BFF3946284600F0E9FCD4E902322179BF -:202DE0006846FFF791FF41462846019CFFF7E5FE2B4622460021304600F0C4FC002803D118 -:202E00003146284600F0D2FCBDE8FE832DE9FE4F814600F087FC38B15FF0000799F800007C -:202E200020B10020BDE8FE8F0127F7E78C4D914C4FF0000A803524B1002140F2D340AFF3D8 -:202E4000008095F82D8085F823A0002624B100214FF49B60AFF300801FB94046FFF7C8FEE2 -:202E6000804624B100214FF49C60AFF30080EFF719FE43466A464946FFF782FF24B1002103 -:202E800040F2E640AFF3008095F82E0020280CD029690098401A0002C21700EB126000120B -:202EA00003D5684600F082FC012624B100214FF49E60AFF3008095F823000028BBD124B165 -:202EC000002140F2F640AFF30080EFF7EBFD6B46644A002100F056FC0028A3D027B94146B5 -:202EE0006846FFF76AFE064326B16846FFF7EDFAC9F8080024B1002140F20950AFF30080AF -:202F000001208FE72DE9FF5F8A46814600F00AFC534C803410B39AF80000002710B1012860 -:202F200000D0FFDF534D25B1002140F27F50AFF300800120A84600905FEA080604D000213E -:202F400040F28750AFF30080009800F0E2FB94F82D50002084F8230067B119E094F82E004E -:202F60000127202800D1FFDF9AF800000028D9D0FFDFD7E72846FFF73BFE054626B1002153 -:202F800040F29150AFF3008094F823000028D3D126B1002140F29B50AFF30080EFF782FDE5 -:202FA00083462B4601AA5146FFF7EAFE5FEA060804D0002140F2A250AFF300803B462A4634 -:202FC00001A95846CDF80090FFF748FE064604EB850090F828B0B8F1000F04D0002140F219 -:202FE000A950AFF3008000F089FB0090B8F1000F04D0002140F2AF50AFF3008094F8230003 -:20300000002899D1B8F1000F04D0002140F2B750AFF3008014490DF1040C01EB09109CE822 -:203020000E0000F1040080E80E002EB35FEA080604D0002140F2C450AFF300803BEA070056 -:2030400020D094F82E0020281CD126B1002140F2C950AFF300802846FFF7C6FB90B90CE0D2 -:20306000AC090020FFFF3F00AC070020B82202008A0000200000000010E09AF80000D8B3D8 -:20308000012849D0B8F1000F04D0002140F2E650AFF30080284600F02AFB01265FEA0805B7 -:2030A00004D0002140F2EF50AFF30080009800F030FB25B1002140F2F350AFF300808EB108 -:2030C00094F82D0004EB800090F82600202809D025B1002140F2FA50AFF30080F94840786B -:2030E000F8F708FE25B1002140F2FF50AFF3008004B03046BDE8F09FFFE7B8F1000F04D071 -:20310000002140F2D150AFF3008094F82D2049460420FFF751F9C0E7002E3FF40DAF002168 -:2031200040F2DC50AFF3008006E72DE9F84FE64D814695F82D004FF00008E44C4FF0010B4F -:20314000474624B1002140F20D60AFF30080584600F0DFFA85F8237024B1002140F212601A -:20316000AFF3008095F82D00FFF742FD064695F8230028B1002CE4D000214FF4C3604BE0D7 -:2031800024B1002140F21C60AFF30080CE48803800EB861111F81900032856D1334605EB3C -:2031A000830A4A469AF82500904201D1012000E0002000900AF125000021FFF760FC01460C -:2031C0000098014203D001228AF82820AF77E1B324B1002140F22160AFF3008032464946C8 -:2031E0000120FFF7E9F89AF828A024B1002140F22C60AFF3008000F081FA834624B100217D -:2032000040F23160AFF3008095F8230038B1002C97D0002140F23560AFF3008091E7BAF170 -:20322000000F07D095F82E00202803D13046FFF7DBFAE0B124B1002140F24960AFF300800C -:20324000304600F054FA4FF0010824B1002140F25260AFF30080584600F05BFA24B100219D -:2032600040F25660AFF300804046BDE8F88F002CF1D0002140F24460AFF30080E6E700209F -:20328000EFF74ABB0120EFF747BB8E48007870472DE9F0418C4C94F82E0020281FD194F898 -:2032A0002D6004EB860797F82550202D00D1FFDF8549803901EB861000EB4500407807F815 -:2032C000250F0120F87084F82300294684F82E50324602202234FFF76FF8002020700CE43C -:2032E0002DE9F0417A4E784C012538B1012821D0022879D003287DD0FFDFF0E700F02AFA1E -:20330000FFF7C6FF207E00B1FFDF84F821500020EFF729FBA168481C04D0012300221846C9 -:20332000EFF774FB14F82E0F217806EB01110A68012154E0FFF7ACFF0120EFF714FB94F848 -:20334000210050B1A068401C07D014F82E0F217806EB01110A68062141E0207EDFF8648117 -:20336000002708F10208012803D002281ED0FFDFB5E7A777EFF7E7FB98F80000032801D122 -:2033800065772577607D534951F8200094F8201051B948B161680123091A00221846EFF79E -:2033A00035FB022020769AE7277698E784F8205000F0D0F9A07F50B198F801006168012345 -:2033C000091A00221846EFF721FB257600E0277614F82E0F217806EB01110A680021BDE813 -:2033E000F041104700E005E036480078BDE8F041F8F780BCFFF74CFF14F82E0F217806EB75 -:2034000001110A680521EAE710B52F4C94F82E00202800D1FFDF14F82E0F21782C4A02EBFB -:2034200001110A68BDE81040042110477CB5264C054694F82E00202800D1FFDFA068401C94 -:2034400000D0FFDF94F82E00214901AA01EB0010694690F90C002844EFF7A4FB9DF9040024 -:203460000F2801DD012000E00020009908446168084420F07F41A16094F82100002807D09F -:2034800002B00123BDE8704000221846EFF7BEBA7CBD30B5104A0B1A541CB3EB940F1FD3E3 -:2034A000451AB5EB940F1BD3934203D9101A43185B1C15E0954211D9511A0844401C434281 -:2034C0000EE00000880000202C0A002000000000AC070020B8220200FF7F841EFFDF002330 -:2034E000184630BD0123002201460220EFF78EBA0220EFF738BAEFF7D5BA2DE9FC47B14CDF -:20350000054694F82E00202800D1FFDF642D58D3AD4A0021521B71EB010052D394F82E2012 -:20352000A0462046DFF8A49290F82D7009EB0214D8F8000001AA28446946EFF733FB9DF9C3 -:203540000400002802DD0098401C0090A068009962684618B21A22F07F42B2F5800F30D23C -:2035600008EB8702444692F82520202A0AD009EB02125268101A0002C21700EB126000121C -:2035800088421EDBA068401C10D0EFF78BFAA168081A0002C11700EB11600012022810DD2F -:2035A0000120EFF7E0F94FF0FF30A06020682844206026F07F402061012084F82300BDE88E -:2035C000FC870020FBE72DE9F0477E4C074694F82D00A4F1800606EB801010F8170000B9D5 -:2035E000FFDF94F82D50A046794C24B1002140F66500AFF3008040F6710940F67A0A06EB2B -:20360000851600BF16F81700012818D0042810D005280ED006280CD01CB100214846AFF3DB -:20362000008020BF002CEDD000215046AFF30080E8E72A4639460120FEF7BEFEF2E74FF0C1 -:20364000010A4FF00009454624B1002140F68100AFF30080504600F05CF885F8239024B1DE -:20366000002140F68600AFF3008095F82D00FFF7BFFA064695F8230028B1002CE4D000210C -:2036800040F68C001FE024B100214FF40960AFF3008005EB860000F1270133463A462630C7 -:2036A000FFF7EDF924B1002140F69400AFF3008000F024F8824695F8230038B1002CC3D020 -:2036C000002140F69A00AFF30080BDE785F82D60012085F82300504600F01BF8002C04D0CF -:2036E000002140F6A700AFF30080BDE8F087354981F82D00012081F82300704710B53548B4 -:2037000008B1AFF30080EFF3108000F0010072B610BD10B5002804D12F4808B1AFF3008062 -:2037200062B610BD2D480068C005C00D10D0103840B2002806DA00F00F0000F1E02090F89B -:20374000140D03E000F1E02090F80004400970470820704710B51B4C94F82400002804D130 -:20376000F8F7B6F8012084F8240010BD10B5154C94F82400002804D0F8F7D3F8002084F8F6 -:20378000240010BD10B51C685B68241A181A24F07F4420F07F40A14206D8B4F5800F03D248 -:2037A000904201D8012010BD002010BDD0E90032D21A21F07F43114421F07F41C0E90031D9 -:2037C000704700002C0A0020FF1FA107AC07002000000000000000000000000004ED00E072 -:2037E000F0B5734AD2F80032724D002401212E7856B9714E3460704F03263F1D3E606E4FBF -:2038000004260C373E602970C2F80042D1601160694C4834D16425688542FBD35160D160FC -:20382000C2F80032F0BD2DE9F041044680074FF000054FF0010604D560480560066024F0ED -:203840000204E0044FF0FF3705D55D484660C0F8087324F48054600003D55A48056024F072 -:203860008044E0050FD55248C0F80052C0F8087351490D60091D0D604F4A04210C321160DD -:20388000066124F48074A00409D54F484660C0F80052C0F808734D48056024F40054C4F39C -:2038A0008030C4F3C031884200D0FFDF14F4404F14D047484660C0F8087346488660C0F829 -:2038C0000052C0F8087344490D600A1D16608660C0F808730D60166024F4404420050AD530 -:2038E0003E4846608660C0F80873C0F848733C48056024F400640DF077FB3A48044200D0A4 -:20390000FFDFBDE8F08170B5202500224FEA020320FA02F1C90719D051B201F01F060124E5 -:20392000B4404E09B60006F1E026C6F88041C6F88042002906DA01F00F0101F1E02181F814 -:20394000143D03E001F1E02181F80034521CAA42DED370BD70B5174C0D466060FFF763FF68 -:203960006068FFF7D0FF2846F8F7A7F80CF05EFF00F0ABF80DF038FB0DF083FAF8F78CF9B4 -:20398000BDE870400DF000B810B50A4C6068FFF74AFF6068FFF7B7FF0DF026FBF8F721F960 -:2039A0000020606010BD0348406870470A207047008000408C00002004850040FC1F00403F -:2039C00000C0004004E5014000D0004004D5004000E0004000F0004000F5004000B000401F -:2039E00008B50040FEFF0FFD70B522490A680AB30022154601244B685B1C4B60092B00D384 -:203A00004D600E7904FA06F30E681E420FD0EFF3108212F0010272B600D001220C689C43DF -:203A20000C6002B962B649680160002070BD521C092AE0D3052070BD4FF0E0214FF480003F -:203A4000C1F800027047EFF3108111F0010F72B64FF0010202FA00F20648036842EA03022E -:203A6000026000D162B6E7E702480021016041607047000094000020AD4911F8410F497845 -:203A8000884201D3401A02E0C1F141010844C0B27047A749433111F8410F4978884201D3C7 -:203AA000401A02E0C1F141010844C0B27047A049863111F8410F4978884201D3401A02E0CD -:203AC000C1F141010844C0B270479A4910B5802081F8000496490020433101F8410F487044 -:203AE000934901F8410F48709149863101F8410F487091480DF00EF98F48401C0DF00AF947 -:203B0000EFF7DAF8BDE8104000F006B940207047B2E770B50C4605460026FFF7ADFF844A41 -:203B2000A04214D30021641EE4B20FD392F84200105C05F8010B92F84200401CC0B282F84C -:203B400042004128EFD182F84210ECE7012600F0E3F8304670BD402070479AE770B50C46B7 -:203B600005460026FFF795FF714A4332A04214D30021641EE4B20FD392F84200105C05F801 -:203B8000010B92F84200401CC0B282F842004128EFD182F84210ECE7012600F0BDF83046B9 -:203BA00070BD402101700020704710B50446FFF77EFF2070002010BD70B50C460546FFF778 -:203BC00076FF5B4A8632A04215D30021641EE4B20FD392F84200105C05F8010B92F8420021 -:203BE000401CC0B282F842004128EFD182F84210ECE7002401E042F2070400F08DF8204654 -:203C000070BD70B50C460546412900D9FFDF4B480068103840B200F066F8C6B20D2000F07C -:203C200062F8C0B2864203D2FFDF01E0EFF794F821462846FFF76DFF0028F7D070BD2DE981 -:203C4000F0413D4F0025064617F10407412257F8254094F8421094F8410000F053F888B3EB -:203C60006D1CEDB2032DF1D331484122433090F8421090F8410000F045F8002831D02C486C -:203C8000412290F8421090F8410000F03BF8002827D027484122863090F8421090F84100B1 -:203CA00000F030F800281CD0EFF72CF822480DF039F8B0F5005F00D0FFDFBDE8F0411E4848 -:203CC0000DF046B894F84100265494F84100401CC0B284F841004128C6D1002084F841006D -:203CE000C2E7BDE8F081002806DA00F00F0000F1E02090F8140D03E000F1E02090F8000404 -:203D000040097047401C884204D0904200D109B1002070470120704710B507480DF002F892 -:203D2000002803D1BDE81040EEF7D7BF10BD00005C0A00200DE000E09C00002004ED00E06A -:203D4000164908784A78401CC0B2904205D0144B01221A60BFF34F8F087070472DE9F0414B -:203D60000E4C4FF0E02600BFEFF77CF820BF40BF20BF677820786070D6F80052EDF7CCFABD -:203D8000854305D1D6F8040210B92078B842EBD0EFF763F80020BDE8F0810000AC00002058 -:203DA000180502402DE9F041012528034FF0E0210026C1F880011E4CC4F800610C2000F0C9 -:203DC0002CF81C4801680268C94341F3001142F010020260C4F804532560491C00E020BFD5 -:203DE000D4F80021002AFAD019B9016821F010010160114807686560C4F80853C4F8006163 -:203E00000C2000F00AF83846BDE8F08110B50446FFF7C8FF2060002010BD00F01F02012184 -:203E200091404009800000F1E020C0F88012704700C0004010ED00E008C500402DE9F047BF -:203E4000FF4C0646FF21A06800EB061211702178FF2910D04FF0080909EB011109EB061717 -:203E60004158C05900F0F4F9002807DDA168207801EB061108702670BDE8F08794F80080CD -:203E800045460DE0A06809EB05114158C05900F0DFF9002806DCA068A84600EB081005789E -:203EA000FF2DEFD1A06800EB061100EB08100D700670E1E7F0B5E24B0446002001259A68EA -:203EC0000C269B780CE000BF05EB0017D75DA74204D106EB0017D7598F4204D0401CC0B24E -:203EE0008342F1D8FF20F0BD70B5FFF704FBD44C08252278A16805EB0212895800F0A8F9E8 -:203F0000012808DD2178A06805EB01114058BDE87040FFF7E7BAFFF7B8F9BDE87040F7F782 -:203F2000E9BE2DE9F041C64C2578FFF7E4FAFF2D6ED04FF00808A26808EB0516915900F065 -:203F400087F90228A06801DD80595DE000EB051109782170022101EB0511425C5AB1521E6A -:203F60004254815901F5800121F07F4181512846FFF764FF34E00423012203EB051302EB9F -:203F8000051250F803C0875CBCF1000F10D0BCF5007F10D9CCF3080250F806C00CEB423C1B -:203FA0002CF07F4C40F806C0C3589A1A520A09E0FF2181540AE0825902EB4C3222F07F4210 -:203FC0008251002242542846FFF738FF0C21A06801EB05114158E06850F8272038469047BF -:203FE0002078FF2814D0FFF786FA2278A16808EB02124546895800F02BF9012893DD21784C -:20400000A06805EB01114058BDE8F041FFF76ABABDE8F081F0B51D4614460E460746FF2BCB -:2040200000D3FFDFA00700D0FFDF8548FF210022C0E90247C5700671017042708270104662 -:20404000012204E002EB0013401CE154C0B2A842F8D3F0BD70B57A4C064665782079854280 -:2040600000D3FFDFE06840F825606078401C6070284670BD2DE9FF5F1D468B460746FF24D3 -:20408000FFF739FADFF8B891064699F80100B84200D8FFDF00214FF001084FF00C0A99F8FA -:2040A0000220D9F808000EE008EB0113C35CFF2B0ED0BB4205D10AEB011350F803C0DC45E1 -:2040C0000CD0491CC9B28A42EED8FF2C02D00DE00C46F6E799F803108A4203D1FF2004B062 -:2040E000BDE8F09F1446521C89F8022008EB04110AEB0412475440F802B00421029B0022A5 -:20410000012B01EB04110CD040F801204FF4007808234FF0020C454513D9E905C90D02D0FE -:2041200002E04550F2E7414606EB413203EB041322F07F42C250691A0CEB0412490A8154A2 -:204140000BE005B9012506EB453103EB041321F07F41C1500CEB0411425499F80050204659 -:20416000FFF76CFE99F80000A84201D0FFF7BCFE3846B4E770B50C460546FFF7BCF9064611 -:2041800021462846FFF796FE0446FF281AD02C4D082101EB0411A8684158304600F058F863 -:2041A00000F58050C11700EBD14040130221AA6801EB0411515C09B100EB4120002800DC26 -:2041C000012070BD002070BD2DE9F04788468146FFF770FE0746FF281BD0194D2E78A86883 -:2041E0003146344605E0BC4206D0264600EB06121478FF2CF7D10CE0FF2C0AD0A6420CD171 -:2042000000EB011000782870FF2804D0FFF76CFE03E0002030E6FFF76BF941464846FFF7B9 -:20422000A9FF0123A968024603EB0413FF20C854A878401EB84200D1A87001EB041001E0D7 -:20424000280B002001EB061100780870104613E6081A0002C11700EB1160001270470000A8 -:2042600070B50446A0F500002D4EB0F1786F02D23444A4F500042B48844201D2012500E03C -:20428000002500F043F848B125B9B44204D32648006808E0012070BD002070BD002DF9D1DA -:2042A000B442F9D321488442F6D2F3E710B50446A0F50000B0F1786F03D219480444A4F528 -:2042C000000400F023F84FF0804130B11648006804E08C4204D2012003E014488442F8D2B0 -:2042E000002080F0010010BD10B520B1FFF7DEFF08B1012010BD002010BD10B520B1FFF7D7 -:20430000AFFF08B1012010BD002010BD084809490068884201D10120704700207047000006 -:2043200000000020003002002000002008000020B0000020BEBAFECA0548064A01689142DA -:2043400001D10021016004490120086070470000B0000020BEBAFECA40E50140534800214A -:204360000170417010218170704770B5054616460C460220EEF73FFA4C49012008704C4921 -:20438000F01E08604B480560001F046070BD10B50220EEF730FA4549012008704648002133 -:2043A000C0F80011C0F80411C0F8081143494FF40000086010BD3D480178C9B1404A4FF44D -:2043C000000111603C49D1F800310022002B1CBFD1F80431002B02D0D1F8081111B1427073 -:2043E000102103E00121417036490968817002700020EEF700BA2D480178002904BF407832 -:2044000070472D48D0F80011002904BF02207047D0F8001100291CBFD0F80411002905D01A -:20442000D0F80801002804BF01207047002070471E4800B50278204B4078C821491EC9B28E -:2044400082B1D3F800C1BCF1000F10D0D3F8000100281CBFD3F8040100280BD0D3F808018B -:2044600050B107E0022802D0012805D002E00029E4D1FFDF002000BD012000BD0B48017835 -:20448000002904BF807870470B48D0F8001100291CBFD0F80411002902D0D0F8080108B1EF -:2044A0001020704707480068C0B27047B400002010F5004008F5004000F0004004F5014075 -:2044C00008F5014000F400404C48002101704170704770B5064614460D460120EEF78BF934 -:2044E00047480660001D0460001D056070BD70B5424A012540EA01411570424A41F0807121 -:204500001160414C0026C4F80461404A4FF040711160002802BFC4F80052256070BD012899 -:2045200018BFFFDFC4F8006225604FF000703849086070BD3148017879B1344A4FF04071D4 -:2045400011603149D1F804210021002A08BF417002D0304A1268427001700020EEF74BB9CD -:2045600026480178002904BF407870472648D0F80401002808BF704726480068C0B2704719 -:20458000002808BF704730B51C480078002808BFFFDF1D48D0F80411002918BF30BD022492 -:2045A000C0F80443DFF870C0DCF80010C1F30015DCF8001041F01001CCF80010D0F8041171 -:2045C000002904BF4FF400414FF0E02207D100BFC2F8801220BFD0F80431002BF8D02DB992 -:2045E000DCF8001021F01001CCF80010C0F8084330BD05490120886070470000B70000200C -:2046000008F5004004F5004000F0004008F5014004F5014000F4004010ED00E070B5FF4CFB -:2046200000250120657025706572A572E07284F82150A56204F1380065630CF06BFB002817 -:2046400018BFFFDFA577F6480DF0F6FBF5494FF0FF300860091D0860091D0D60091D08609A -:20466000091D0D60091D0860091D0860091D0860091D0860091D0860091D0860091D0860C5 -:20468000091D0860091D086070BD30B4E3490268DFF898C34A6142688A61007A08770A7D65 -:2046A000E14BACF1040401204AB10A7E00FA02F21A608D7D002D0CBF2260CCF800204A7DEE -:2046C000002A04BF30BC70474A7E90401860C97D00290CBF2060CCF8000030BC7047D549FB -:2046E000D3480860091DD4480860704710B50446012908BF002105D002291ABFFFDF0021DD -:204700004FF0807141F48470CA4940F480100860E0B240F44030091D40F000700860C7488E -:20472000D0F80001002818BFFFDF10BD01202DE9F04102254FF0E0270026C7F88051C04972 -:204740000E600860BF490A6822F0770242F0880242F000420A60091D0A6822F47F4242F43F -:20476000B0520A60AD4CB84965770D60B84AB7491160121FB7491160B74A40F25B61116015 -:20478000121F40F203111160111F0860B34903200860B3499620086094F91E000CF06AFDEA -:2047A000607F002814BF4FF4C020AE48AE490860AF49AE480860091FAE480860C7F880523A -:2047C0009E491020C1F8040384F82D60BDE8F081A948016821F0010141F08071016070473C -:2047E0008E4A0368C2F802308088D080117270478A4890F821007047884A517010707047FC -:20480000F0B50546800000F1804000F580508B88C0F820360B78D1F8011043EA0121C0F82D -:20482000001605F10800012707FA00F6934C002A04BF2068B04304D0012A18BFFFDF2068C2 -:2048400030432060206807FA05F108432060F0BD10B504460CF00EFD7048847710BD6F4821 -:2048600090F82E0070476D4890F830007047844AC17811600068834900020860704725288D -:2048800008BF02210ED0262808BF1A210AD0272808BF502106D00A2894BF0422062202EB09 -:2048A0004001C9B2784A116078490860704770B45A4B93F80AC0BCF1010F21D0BCF1020F9F -:2048C0001CBF70BC70475C7D002C04BF70BC70474FF47A74BCF1010F6D4E16D0DD7D93F8FB -:2048E00019C0002D18BF0125012908BF292121D0022A08BF674E06F2E141B1FBF4F119E03D -:204900001C7D002CE4D170BC70479D7D93F818C0002D18BF0125012947D0022A06BF5E4EB5 -:204920004FF47A714FF4C861314401F5FA7100BFB1FBF4F1491F0844584908605849002039 -:20494000C1F84C014FEA0C2085F0010140EA015040F00311187F820002F1804202F5C042EF -:20496000C2F810154F4901EB8001987EC20002F1804202F5F832C2F81415DFF82CC1C2F844 -:2049800010C5DA7ED30003F1804303F5F833C3F814153849C3F81015012101FA00F091401A -:2049A00008434249086070BC7047022A14BF4FF4C8614FF47A7149F6FC621144B8E72DE996 -:2049C000F0411E4D0746032014468846C5F80002124E707F002814BF4FF4C0202148334992 -:2049E000086040460CF094FC20460CF071FC012017B1012F60D062E02D4B19685A06022C5C -:204A0000D2F8202314BFC2F30622C2F3066221F4FE4141EA02211960B0724BE0380B0020F1 -:204A20004C0B0020000E0040180500500C05005006010200141500402500030200100040F7 -:204A4000FC1F00403C17004060150040448000409CF5014028110040381500401015004072 -:204A6000441500400000040408F5014040800040A4F50140101100407417004040160040BB -:204A8000241500401C1500400815004054150040A224020004360200683602004C85004071 -:204AA00000800040006000404C81004004F5014088150040286002E00221B1726860F949B8 -:204AC000C864F948006822464146BDE8F041EEE62DE9F0418846F549074603201546C1F891 -:204AE0000002F34C607F002814BF4FF4C020F148F14E306040460CF00BFC28460CF0E8FB9A -:204B000017B1012F19D021E0EC490A684806022DD0F8200314BFC0F30620C0F3066022F4C9 -:204B2000FE4242EA002008600120A072606B40F4801060634FF4801007E00220A072606B43 -:204B400040F4001060634FF4001030602A464146BDE8F0410020AAE62DE9FF4FD34C8246A3 -:204B6000002681B003208946C4F80002D04D687F002814BF4FF4C020CE48CF4F38600398A5 -:204B80000CF0C6FB04980CF0A3FBCD494FF00108BAF1000F03D0BAF1010F32D03BE0C74B4D -:204BA00004981A684FF0805C0228DCF8200314BFC0F30620C0F3066022F4FE4242EA002034 -:204BC00018600C6095F82D00012806D0022818BFFFDF0CD085F80A801DE0DDE9031395F810 -:204BE0002C2048460CF0E6FBA96A4618F2E7DDE9031295F82C3048460CF097FBA96A461863 -:204C0000E8E7B048086095F82D00012818BFFFDF20D00220A872AC480660AD49AB480860F6 -:204C2000686B40F400206863D4F800924FF0100AC4F808A30025C4F80052A6484FF4802B55 -:204C4000C0F800B0FF208DF80000C4F81051C4F810800EE0DDE9031395F82C2096200CF08A -:204C600087FBA96A4618D4E79DF80000401E8DF800009DF8000018B1D4F810010028F3D0E8 -:204C80009DF80000002808BFFFDFC4F80051C4F80C51C4F81051C4F80451C4F81451C4F881 -:204CA0001851C4F828518C4800680090C4F80092C7F800B0C4F804A34FF4002038607948AE -:204CC000C0F84C8078480068B04228BFFFDF3046DDE9031205B0BDE8F04FE8E52DE9F84765 -:204CE000724CD4F8000220F00309D4F804034FF0100AC0F30018C4F808A30026C4F800626A -:204D00006B4D687F002814BF4FF4C020694871490860A87A0127012802D0022803D014E0CD -:204D2000287D10B911E0687D78B1A87EEA7E07FA00F007FA02F210430860287F800000F1BF -:204D4000804000F5C040C0F81065FF208DF80000C4F81061276104E09DF80000401E8DF8BC -:204D600000009DF8000018B1D4F810010028F3D09DF80000002808BFFFDFC4F81061C4F8C2 -:204D800028616E72AE72EF72C4F80092B8F1000F18BFC4F804A3BDE8F88700684F4920F0B5 -:204DA0007F40086070474FF0E0200221C0F88011C0F8801270474FF0E0210220C1F800014D -:204DC000704747490870704710B546480BF0AAFF002818BFFFDF10BD42480BF0B9BF424934 -:204DE0000860704730B5324C0546A06AA84228BFFFDF012020732561607F40B12844206136 -:204E00002A48D0F8001241F04001C0F8001225490020C1F84401354920690860606B2649D5 -:204E200040F4800060634FF48000086030BD70B51F4C0546022020730CF057FA024694F832 -:204E40002C1028460CF0E0FA2061617F41B1084420611648D0F8001241F04001C0F800123E -:204E600010490020C1F844012169A06A08441F49086070BD17494FF4800008600C48416B53 -:204E800021F480014163002101737047054801214160C1600021C0F8441114480160044824 -:204EA00081627047008000404C85004000100040380B00200000040404F5014088150040B5 -:204EC000ACF50140041000404885004048810040A8F5014008F50140181100403C15004070 -:204EE000B9000020700B00200415004044850040FE4940204877FE490860FE48D0F80012A7 -:204F000041F04001C0F800127047FA48D0F8001221F04001C0F80012F549022008607047E7 -:204F2000F448D0F8001221F01001C0F80012012181617047EF480021C0F81C11D0F800129D -:204F400041F01001C0F800127047EA4981B0D1F81C21012A1EBF002001B07047E64A1268EA -:204F600002F07F02524202700020C1F81C01E34800680090012001B0704730B50C000546DA -:204F800008BFFFDF14F0010F1CBF012CFFDF002D0CBF01200220D54901284872CC72D549DA -:204FA00004BFD1F8000240F0040007D0022807BFD1F8000240F00800FFDF30BDC1F80002DF -:204FC00030BD70B5C94C0023E17A11F0020F18BF10F0040F16D111F0100F1CBF94F82F2073 -:204FE000002A02D094F8312062B111F0080F1CBF94F82020002A05D111F0040F03D094F893 -:20500000211001B9012394F809C00122B949BCF1000F06D000F00200184312D0BDE87040F1 -:205020005CE6607F002814BF4FF4C020B448B54B1860D1F8000220F00300C1F80002E272D0 -:2050400070BD00252846BCF1010F0BD0BCF1020F18BFFFDF16D0A06A01222844BDE87040B1 -:20506000002124E4D1F8003223F00403C1F800326072E272A27201231A46002196200CF076 -:2050800054F90FE0D1F8003223F00803C1F800326072E2720220A07201231A46002196201B -:2050A0000CF066F90546D6E72DE9F84F964FD7F84C218E4C93494FF00108A07A0026CAB156 -:2050C000012802D0022803D014E0227D12B911E0627D7AB1A27EE37E08FA02F208FA03F310 -:2050E0001A430A60227F920002F1804202F5C042C2F81065626B0A606663217B29B1D7F894 -:205100004411012908BF012200D00022794DD5F8101101290CBF40210021012805BFD5F84F -:205120000C31012B002320231943012805BFD5F80431012B002310230B437449022804BFDB -:20514000D1F800C0BCF1010F07D1D5F80CC1BCF1010F08BF4FF0080C01D04FF0000C4CEA6E -:205160000303022804BF0968002905D1D5F80C11012908BF042100D000211943022803D181 -:20518000002A18BF022200D100221143022804BFD5F80401012805D1D7F84401012818BFD1 -:2051A000012000D1002040EA01095948016811F0FF0F03D0D5F81411012900D0002184F834 -:2051C0002E10006810F0FF0F03D0D5F81801012800D0002084F82F004E48006884F83000F4 -:2051E00043480068402803D1FFF705F9012800D0002084F83100C5F80061C5F80C61C5F8C1 -:205200001061C5F80461C5F81461C5F81861C5F82861414800680090C7F844613F48006879 -:205220004D46DFF8FC900090D9F800106162607F00281CBF081A60623A480068A0620CF096 -:2052400054F884F82C00A07ADFF8DCA084F82D0002280CD1607850B1DAF8001009780840B9 -:20526000217831EA000008BF84F8208001D084F82060DFF8B88015F0010F15D098F8001021 -:205280002B4A4908606A52F8211088470121294A98F80030A06A52F82320904798F80000E1 -:2052A00010F0010F0BD01FE015F0200F18BF0221EDD115F0020F18BF0021E8D1EEE7DAF8AA -:2052C0000000062200F10901A01C0CF0E9FB40B9207ADAF800100978B0EBD11F08BF0120A6 -:2052E00000D0002084F82100284625E0380B00206015004000100040481500401C1100403C -:205300000000040408F50140008000400014004040160040101400401811004044810040CB -:20532000448500404085004004150040B9000020D022020008230200FFF743FE15F0020FBF -:2053400005D03D4898F8001050F82100804715F00C0F07D0394898F8001050F82110C5F3DA -:20536000C000884715F0200F05D0354898F8001050F82100804798F80000022805D105F0C3 -:205380006E00402806D101F0DDFB98F80000042828BFFFDFA07A022818BFBDE8F88F207B34 -:2053A000002808BFBDE8F88FC7F84461022815D0012818BFFFDFA16A2069884298BFFFDFEE -:2053C000D4F81000C9F80000606B1E4940F4800060634FF480000860BDE8F88F2169A06A9C -:2053E0000844EFE7012804BF28207047022804BF1820704700B5FFDF282000BD012804BF40 -:2054000041F6A4707047022804BF41F28830704700B5FFDF41F6A47000BD012804BF41F241 -:20542000D4707047022804BF41F20400704700B5FFDF41F2D47000BDD8220200E8220200C7 -:20544000F822020004F5014010B53F480AF0F7FB00213D480AF022FC01213B480AF0F2FB74 -:205460003A49002081F822004FF6FF70888438490880488010BD704734498A8C824218BFAB -:205480007047002081F822004FF6FF70888470472D49016070472E49088070472B498A8C55 -:2054A000A2F57F43FF3B03D0002101600846704791F822202549012A1ABF01600120002020 -:2054C0007047224901F1220091F82220012A04BF00207047012202701D4800888884104622 -:2054E00070471B49488070471849194B8A8C5B889A4206D191F82220002A1EBF016001204D -:205500007047002070471148114A818C5288914209D14FF6FF71818410F8221F19B10021C7 -:20552000017001207047002070470848084A818C5288914205D190F8220000281CBF00204C -:2055400070470120704700009A0B0020740B0020BA0000207047574A012340B1012818BF11 -:20556000704713700868906088889081704753700868C2F802008888D08070474D4A10B15B -:20558000012807D00EE0507860B1D2F802000860D08804E0107828B19068086090898880F2 -:2055A0000120704700207047424910B1012803D006E0487810B903E0087808B10120704791 -:2055C0000020704730B58DB00C4605460D2104A80CF02BFBE0788DF81F0020798DF81E0001 -:2055E00060798DF81D002868009068680190A8680290E868039068460BF0B2F920789DF8A9 -:205600002F1088420CD160789DF82E10884207D1A0789DF82D10884202BF01200DB030BD17 -:2056200000200DB030BD30B50C4605468DB04FF0030104F1030012B1FEF790FA01E0FEF78E -:20564000E0FA60790D2120F0C00040F04000607104A80CF0EAFAE0788DF81F0020798DF8B2 -:205660001E0060798DF81D002868009068680190A8680290E868039068460BF071F99DF8E3 -:205680002F0020709DF82E0060709DF82D00A0700DB030BD10B5002904464FF0060102D0EC -:2056A000FEF75CFA01E0FEF7ACFA607920F0C000607110BDBE00002070B5FA4E044696F8B9 -:2056C00092000025012828D096F88C00012833D096F86A0001281CBF002070BD657013205B -:2056E0002070202206F16C01A01C0CF005FA0120A07186F86A50B6F86E10A6F88E10EA49B8 -:2057000049684A7B86F8902086F88C000888FBF7AFFAFAF71FFF012070BD657019202070B5 -:20572000D6F89300C4F80200D6F89700C4F8060086F89250012070BD657006202070D6F81C -:205740008E00C4F8020086F88C50E4E7D54890F86A10002914BFB0F86E004FF6FF7070473C -:2057600070B5D14800250570017800291CBFFFDF70BDCC4C84F8625084F8635084F8645024 -:2057800084F8655084F85E5084F8605084F8565084F8365084F867507F21817094F86600A8 -:2057A00028B1FFF7B2FBFEF706FE84F8665084F86A5084F88C5084F89250BC480AF0D6F88A -:2057C000BDE87040BA480AF0D1B8B64890F862007047B44900B591F8580091F85710C0F31A -:2057E0008002C0F340031A4400F001001044052910D2DFE801F00B070B030900AD4931F87E -:20580000100000BDAC4800BDAC4900E0AC4931F8100000BDFFDF002000BDA24840F27121E1 -:20582000B0F85A00484370479E4890F86800002818BF0120704710B59A4C207A022818BF31 -:20584000032808D1207C04F1110108F071FF08281CBF012010BD207A002816BF022800205F -:205860000120BDE81040FFF79FBE8E49087270478C4981F8600070472DE9F041894C82B004 -:20588000207A002816BF022800200120607204F10A01FFF773FE207A022816BF03280121E7 -:2058A000002184F85F10082084F85D00607A0126002504F10A02012804BF527912F0C00F2C -:2058C0000AD004F10A02012804D1507900F0C000402801D0002000E0012084F85E0029B960 -:2058E00094F85700012818BF042806D1207C04F1110108F01DFF84F85D002560FDF7B8F809 -:2059000060604FF0000894F85D0008F02DFF074694F85F00002818BF002F04D0102138468A -:2059200009F093FD68B194F8600000281CBF94F85E0000281DD0607A04F10A0101280ED0F6 -:2059400012E06672424604F10A013846FFF76BFE94F85D1004F10A0008F0FEFF09E0487981 -:2059600000F0C000402840D0294604F10A00FFF791FE04F10A014D480AF01EF8617A4B48F9 -:205980000AF03FF804F10A0149480AF015F8617A47480AF036F894F8570001281EBF042897 -:2059A00002B0BDE8F081002594F85D0008F0E5FE040004BF02B0BDE8F081102109F045FD3B -:2059C00000281CBF02B0BDE8F0812A4669462046FFF729FE6946354809F0FCFF012133489D -:2059E0000AF01CF802B0BDE8F08108F0EEFF424604F10A01FFF717FEBBE770B5294C417B61 -:205A000084F85810017984F8571001290CBF00220288A4F85A20827B84F868208279002A68 -:205A200016BF022A002201222274D0F80720C4F81120B0F80B00A4F8150094F85600012542 -:205A4000002818BF84F8635094F83600002818BF84F8645005293AD2DFE801F0030C1E34D4 -:205A60000C000021114809F084FF01210F4809F0BFFF2DE001210D4809F07BFF04F11101F6 -:205A80000A4809F0A7FF217C084809F0C7FF0121064809F0ADFF1BE00621044809F069FF85 -:205AA00016E00000BC0B0020CC000020580C0020800C002028230200D089130030230200DF -:205AC000202302000221FE4809F053FF00E0FFDF0421FC4809F04DFF84F86250002070BDE6 -:205AE00070B5F94C0546002084F864002A4604F117000CF001F884F83650012084F864007D -:205B000070BD10B5F04C002284F8632084F85600024604F137000BF0EFFF012084F8630007 -:205B200010BDE94981F8670070472DE9F041E74E82B0307808BBE44C94F86200E8B1FFF709 -:205B400043F9002584F8615075702846FFF739F9FEF7ECFDFEF7C3FDDD48FEF788FEDD48E4 -:205B6000FFF71BF994F85800002610F0010F08D02520FEF784FE012612E002B00C20BDE8D1 -:205B8000F08110F0020F04D02620FEF778FE022606E010F0040F03D02720FEF770FE042636 -:205BA000FEF79DFD84F85C60FFF705F9002101220846FEF78DFF0F210520FEF71DFE94F826 -:205BC0005E00002804BF94F85F00002805D194F85700012818BF042874D1FCF749FF0646B8 -:205BE00031466068FDF755FCBB4990FBF1F701FB170041423046FCF746FC606020683844A5 -:205C0000206008F092FD2168884274D8C4E900564FF0010894F85D0008F0A6FD064694F837 -:205C20005F000127002818BF002E04D01021304609F00BFC68B194F8600000281CBF94F8A1 -:205C40005E0000281DD0617A04F10A0001290ED012E03A46677204F10A013046FFF7E3FC59 -:205C600094F85D1004F10A0008F076FE09E0407900F0C00040281DD0414604F10A00FFF79D -:205C800009FD04F10A018E4809F096FE617A8C4809F0B7FE04F10A018A4809F08DFE617A0D -:205CA000884809F0AEFE94F85700012818BF042821D108E008F089FE3A4604F10A01FFF791 -:205CC000B2FCDEE717E0012794F85D0008F055FD060010D0102109F0B8FB60B93A466946F4 -:205CE0003046FFF7A0FC6946754809F073FE0121734809F093FE617A04F10A00FEF770FD23 -:205D000094F8570001281EBF042894F86300002808D094F8562004F13701694809F09CFE0C -:205D200084F8635094F8640040B194F8362004F11701644809F0BCFE84F8645008F069FD77 -:205D4000664808F0FAFD84F86600FFF745F802B00020BDE8F0815D494860704770B55A4CD9 -:205D600006002BD094F8581094F85C20002521EA020010F0010F04D02520FEF780FD012533 -:205D800015E011F0020F02D012F0020F06D011F0040F0CD012F0040F05D008E02620FEF744 -:205DA0006EFD022503E02720FEF769FD0425FEF796FC94F85C00284384F85C0094F8610004 -:205DC00040B194F85700012808BFFFDFBDE8704000F0BFBA36B1002201234FF49671104696 -:205DE000FEF7BAFE3648FEF7FAFF94F85700052809D2DFE800F00303030903000121084663 -:205E0000FFF7BBF800E0FFDF94F8580094F85C1030EA01014FF0010002D02C49087070BDF7 -:205E200094F85710012912BF84F86100002184F85C10F2E710B5FEF7C7FF2448007840B958 -:205E4000214890F8620020B10020FFF787FF002010BDFFF71BF8FFF70DF8FEF73FFFFEF769 -:205E6000A2FFFEF7B9FF0C2010BD1849012048707047154981F86500704770B5002503F0BA -:205E8000A3FA48B1114E3078012809D0022801D0032842D0FFDF70BDBDE8704000F059BAC8 -:205EA000094C94F85700032837D094F8660018B1FEF76DFAFFF71CF80848FEF790FF0FE094 -:205EC000580C0020800C0020BC0B0020CC0000201B2302001823020040420F00A80C0020DD -:205EE0009620FEF7A4FF94F85700012818BF04280AD094F86800012814BF0328102545F0E6 -:205F00000E010020FFF739F894F86700012808BFFFF710F80220307070BDBDE870400120E5 -:205F20001CE770B5FE4DFF4C95F86700012817D095F8660018B1FEF7E8FFFEF73CFA03F0E9 -:205F400043FAB8B12078022818BFFFDF0120FFF705FF207800281EBF20780128FFDF70BDA0 -:205F6000F148FEF7F2FF002804BF7F20A070FEF7D7FFDDE7BDE8704000F0EBB92DE9F05F8B -:205F800007464FF00009FEF76AFCE64E82463078022818BFFFDFE24D7F2495F8670001289F -:205FA00030D0E24809F004FD83464FF0FF08002F00F0E480DD4809F00EFE002800F0DE808B -:205FC000FEF716FC002800F0D98095F86600D74F68B108F003FC8046FF2808D00146F81C00 -:205FE00008F0EBFB404608F004FC40EA0A0A58464FF0000B062880F0C180DFE800F0BFBF0B -:20600000BF0CBF69C848FEF7A0FF002808BFB470FEF786FFC5E795F85700012818BF0428A0 -:2060200070D0BAF1000F18D195F86800002818BF022867D13878F91CC0F3801008F078FBB4 -:20604000824608F0DAFC40B1504608F096FB20B1102109F0FAF9002854D095F86700012843 -:2060600004BF95F89200002805D0B148FEF7B7FE0320307084E0012085F89200B8F1FF0F90 -:206080000FD005F19402511E404608F07FFB002808BFFFDF95F8930040F0020085F89300FF -:2060A0000CE03878C0F3801085F89300D5F8EF00C5F89400B5F8F300A5F89800B07805F1F1 -:2060C0009A077F2808BFFFDFB0783870B470CCE73878297CC0F38010884209D1062205F1D2 -:2060E0001101F81C0BF0DCFC002808BF012000D00020B8F1FF0F06D0C0B995F85D00404532 -:206100001AD113E03AE0B8B13878F91CC0F3801008F00EFB044608F070FC38B1204608F020 -:206120002CFB18B1102109F090F928B195F85700012818BF04281DD095F85700F0B9BAF1AE -:20614000000F17D195F86800002818BF012815D13878F91CC0F3801008F0EAFA044608F01F -:206160004CFC38B1204608F008FB18B1102109F06CF918B195F865002C46D8B14FF0010936 -:2061800095F8660018B1FEF7C0FEFEF714F9B9F1000F1CBF0120FFF7E1FD307800281ABF5C -:2061A00030780128BDE8F09F3078032818BFFFDFBDE8F09F7068D4F8FB10C0F80E10B4F8ED -:2061C000FF10418294F801110175B97D4175B7F81710C182B7F819104180B7F81B10818060 -:2061E000B7F81D10C180534908300BF02AFE97F8240000F01F017068017697F82410490964 -:2062000080F864113A78417BC2F340121140417394F86A00002818BFFFDF84F86CB0D6F8DE -:2062200004A0BAF80000A4F86E00BAF80200A4F88400BAF80400A4F88600BAF80600A4F8FE -:2062400088009AF8640184F88A0094F85F0048B1607A04F10A01012804D1487900F0C0008C -:20626000402835D094F8600040B1607A04F10A01012804BF487910F0C00F29D0C4F878B0A1 -:20628000A4F87CB03878B8F1FF0FC0F380108AF81900D4F8EF00CAF81A00B4F8F310AAF809 -:2062A0001E101CD0C4F87E00BAF81E00A4F8820004F17202511E404608F068FA002808BFF5 -:2062C000FFDF94F8710040F0020084F8710015E0D4F80A00A067E089A4F87C00D2E716485A -:2062E0000BF0A6FD9AF8190084F87100DAF81A00C4F87200BAF81E00A4F87600012084F8CF -:206300006A0070680088FAF7B3FCFAF713F986F800B0FEF7BBFDFEF7ADFDFEF7DFFC0DE0DF -:20632000BC0B0020CC000020CE000020A80C0020800C0020C70C00203A0C0020FEF733FD9E -:20634000FEF74AFD012003F09CF919E7012203F048BA70B5FEF79AFDFEF78CFDFEF7BEFC62 -:20636000FEF721FD1F4C002694F8660028B1FEF7CCFDFEF720F884F866601B4D2E70FEF7A6 -:206380002BFD94F85700012804D0BDE87040002003F077B9022003F074F994F86A000028BD -:2063A00018BFFFDF6878002808BF70BD207C84F87100D4F81100C4F87200B4F81500A4F83B -:2063C00076003C2084F86C0068680188A4F86E10012184F86A100088FAF74AFCFAF7AAF826 -:2063E0006E7070BDBC0B0020CC0000202DE9F041FF4F044600207978FE4D4FF001080646F0 -:2064000011B1012923D007E095F85310002918BF87F8018000D0012079782B2211FB02F198 -:20642000294491F82820104318D02A22A01C29310BF062FB66700420207084F802807878B1 -:206440002B2110FB01F0284480F8286023E095F82810002918BF7E70DDD1DDE795F87E0055 -:20646000E0B1D5F87F00C4F80200D5F88300C4F80600D5F88700C4F80A00D5F88B00C4F841 -:206480000E0095F88F00A07466701220207084F8028085F87E600120BDE8F08195F82200E7 -:2064A00001281ED0287801281CBF0020BDE8F0816670132020702022A91CA01C0BF01CFB7D -:2064C000A6712E70A888A884D5F89C00417B85F8261085F822800088FAF7CAFBFAF73AF853 -:2064E000D9E7667006202070686AC4F8020085F82260D0E7BF480178002914BF80884FF641 -:20650000FF7070472DE9F041BA4C064694F82800002818BFBDE8F081304609F049FA0146FA -:2065200001250020072937D2DFE801F00A0407363636090084F82A5009E0032000E0022060 -:2065400084F82A0004F13301304609F09BFA84F8320094F8AF0018B1FDF74DFF01281FD05E -:20656000304609F057FA84F82B0004F12C01304609F029FA9E4E04F1520730787F2808BFB0 -:20658000FFDF307838707F20307084F82850BDE8F041032001F005BF84F83200BDE8F08128 -:2065A000FDF76CFF04F12C02511E08F0EFF8002808BFFFDF94F82B1041F0020184F82B108C -:2065C000D8E710B5002001F0F6FD8A4CA8B1FEF7F2FB012200211046FEF7F1F904F1BC00F8 -:2065E000FEF7FDFBD4F8B400FEF7FCFB94F8A000032818BF02281FD022E0FEF747FCFEF7CC -:2066000039FCFEF76BFBFEF7CEFB94F8AF0030B1FEF77BFCFDF7CFFE002084F8AF00012077 -:2066200084F8B800022084F8B200FEF7D5FBBDE81040002001F0B5BE01210020FEF79DFCC8 -:20664000FEF778FC94F8AF0018B1FDF7A0FEFEF74FFC032084F8B20010BD66490028B1F85D -:20666000BA202CD0FF2A0BD24FF6FF7000EA4200A1F8BA00FF2888BFFF2001D9A1F8BA0051 -:206680005B484268012A12BF002A0D224260D243C2EBC20303EB021291F8B930DB4303EBAF -:2066A000830CCCEB83131A444260900CB1F8BA20B0FBF2F302FB130081F8B9007047012A2B -:2066C000DED95008A1F8BA0008BF0120D8D1D5E770B5484C002584F8B250012684F8B260FA -:2066E00094F8B20002281BBF94F8B20001280020FFDF18BF70BD2B2101FB004181F8285075 -:20670000401CC0B20228F6D3257084F8225094F8AF0028B1FEF7F9FBFDF74DFE84F8AF507E -:2067200084F8AE5084F89B60324884F8A05084F8B15040F2011120F8981F817070BD2DE9BE -:20674000F0412C4C05460C2794F8B20001281FBF94F8B20002280C20BDE8F081FEF734FBFF -:20676000FDF7E4FFFDF7BBFF94F898000126002801BF94F89900002894F89A00002874D082 -:2067800094F8A000032802D0022805D008E00521194800F0DEFE03E00321174800F0D9FE69 -:2067A00094F8AC00002804BF94F8AD00002847D0FCF75EF907463946D4F8A800FCF769FE5A -:2067C0000E4990FBF1F801FB180041423846FBF75AFEC4F8A800D4F8A4004044C4F8A400D7 -:2067E00007F0A3FFD4F8A410884229D8002007E0D4000020D00C0020B40D002040420F004C -:20680000C4E9290794F8AD0000281CBF012008F0AFF8012194F8AE0000281CBF94F8AC0008 -:2068200000280DD094F8910004F19202012804D1507900F0C00040280ED01046FEF72AFF7C -:2068400094F8911004F19200FDF7CAFF94F8B2000027012818D112E008F0B7F8324604F14A -:206860009201FEF7E0FEEBE7FFE794F8B200022804BF84F8B2600C2006D1BDE8F08184F8AC -:20688000B860022084F8B20094F89B0080B108F018F8FE4808F051F884F8AF00FC48C4F87E -:2068A000B450FEF77AFAFEF797FA3846BDE8F08107F0AFFFEDE770B5FEF786FAF54C94F871 -:2068C000B200022803D0FEF787FA0C2070BD012084F8B900A4F8BA000220FEF772FAEE48D5 -:2068E000FDF7C5FFED4B002004F1980294F8B110491CA3FB015C4FEA5C0CACEB8C0C6144D7 -:20690000C9B284F8B110895C012907D0401CC0B20328EBD3FFF755FE002070BD94F8B1004F -:20692000DF49085CFDF7ABFFFDF7D9FEF2E710B5D84C94F89030022B14BF032B00280BD122 -:2069400000291ABF022901200020114607F0F0FE08281CBF012010BD94F89000002816BF7B -:20696000022800200120BDE81040FEF71DBEC94890F89000002816BF022800200120FEF761 -:2069800013BEC44981F890007047C24981F8AE00704770B5BF4C94F89000002816BF0228FD -:2069A0000020012084F8910004F19201FEF7E6FD94F89000022816BF03280121002184F824 -:2069C000AD1094F89100002504F19202012804BF527912F0C00F0AD004F19202012804D146 -:2069E000507900F0C000402801D0002000E0012084F8AC00002804BF002970BDC4F8A450AB -:206A0000FCF736F8C4F8A80094F8AD0000281CBF002007F0ADFF002694F8AE0000281ABF91 -:206A200094F8AC00002870BD94F8910004F19201012804D1487900F0C000402806D0294608 -:206A400004F19200BDE87040FEF724BE07F0BDFF324604F19201BDE87040FEF7E4BD0028BD -:206A600016BF0228012200228A4981F89B2081F8A100704770B5874D0C4600280CBF01219A -:206A8000002185F89B1085F8A2004FF0080085F8A3000BD1002C1ABF022C01200020114680 -:206AA00007F046FE85F8A300082801D0002070BD022C14BF032C1220F8D170BD754A0328EB -:206AC00008BFC2F89C1082F8A00000207047714991F8A000032804D0012818BF022807D0B5 -:206AE00004E091F8A200012808BF70470020704791F8A100012814BF03280120F6D1704719 -:206B000010B5FEF7C3F9FEF7B5F9FEF7E7F8FEF74AF9604C94F8AF0030B1FEF7F6F9FDF7B0 -:206B20004AFC002084F8AF00012084F8B800022084F8B200FEF750F9002010BD554981F8DD -:206B4000B300704710B5FEF7A1F9FEF793F9FEF7C5F8FEF728F94F4C94F8AF0030B1FEF782 -:206B6000D4F9FDF728FC002084F8AF00012084F8B800022084F8B200FEF72EF9BDE810402F -:206B8000002001F00EBC2DE9F84F424CFF217F27444E84F8B0104FF00008002800F0DC82DE -:206BA00004F1BC0008F0E7FF30B904F1BC0009F002F8002800F0D08294F8B200334D052864 -:206BC00080F0C782DFE800F0F1F1F103F0002F4808F0EEFEB07094F89B0030B9FDF73FFEC3 -:206BE000002808BF4FF0000801D04FF0010894F8AF0078B107F0F2FD84F8B0000146FF2862 -:206C00000CD0E81C07F0D9FD94F8B00007F0F1FD40EA080894F8B000FF2812D107F081FEB0 -:206C200084F8B00094F89B1059B1082809D12878E91CC0F3801007F07BFD082818BF4FF040 -:206C40000008B078072880F0C781DFE800F04BB804FCFCFC300094F8AF0018B1FEF755F9F4 -:206C6000FDF7A9FB0F48FEF770F9002808BF3770FEF756F9B8F1000F00F0598194F8A0003F -:206C8000012818BF022840F052810DE08C0D002038230200D00C00203E230200ABAAAAAABC -:206CA0003B230200D4000020FEF718F868E094F8AF0018B1FEF729F9FDF77DFBFE48FEF771 -:206CC00044F9002808BF3770FEF72AF9B8F1000F00F02D8194F8A00002284AD001284FD0BB -:206CE00000F025B994F8AF0018B1FEF70EF9FDF762FBF148FEF729F9002808BF3770FEF79A -:206D00000FF9B8F1000F00F0128194F8A00002282FD0012834D003281CBFFFDFBDE8F88F9E -:206D2000E978D4F89C00827E91421BD12979C27E914217D16979027F914213D1A979427F31 -:206D400091420FD1E979827F91420BD1297AC27F914207D12978427EC1F38011914208BF9F -:206D6000012100D0002194F8A220012A0ED0E9B1D9E0D248FFF7C6FBBDE8F84F00F002BBEC -:206D8000CE48FFF7BFFBBDE8F84F1AE4002974D100F11A01C94808F016FEC84808F03AFE6C -:206DA000D4F89C104876BEE024E1D2E194F8A30008287DD094F8B01081425ED0B7E094F83B -:206DC000AF0018B1FEF7A1F8FDF7F5FABA48FEF7BCF8002808BF3770FEF7A2F894F8AD00C1 -:206DE00000280CBF4FF0010B4FF0000B4FF000092878C10905F1090007D0407900F0C0001A -:206E0000402808BF4FF0010A01D04FF0000A94F8A000032806D194F89B00002818BF94F8FF -:206E2000A30001D194F8B00007F09EFC009088B1102108F00AFB002818BF4FF0010BBAF124 -:206E4000000F07D000E0C7E005F109010098FEF7B9FB814694F8A00003280FD0FDF73EFF56 -:206E6000B8F1000F69D0FDF7C3FC50EA090064D09248FFF747FB00F041B954E0D4F89C005F -:206E8000E978827E91421DD12979C27E914219D16979027F914215D1A979427F914211D17D -:206EA000E979827F91420DD1297AC27F914200E03DE007D12978407EC1F38011814208BF04 -:206EC000012500D0002594F8B000082805D094F8A310884208BF012600D00026B9F1000FB0 -:206EE00005D1BBF1000F04D0FDF782FC08B1012100E00021B8F1000F09D094F8A2000128F7 -:206F000003D020B955EA060001D0012000E0002001420CD094F8A200012804BF002DD4F85C -:206F20009C003FF435AFBDE8F84F00F08ABAFDF7D5FEBDE8F84FFFF744BB94F8A10003287E -:206F400018BF02287ED1BAF1000F7BD0B9F1000F78D1DFF8688194F87E00002872D101257F -:206F600084F8805094F8AF0018B1FDF744FA012821D0404608F04EFD84F8810004F1820137 -:206F8000404608F020FD404608F051FD84F8880004F18901404608F024FD307804F18F0834 -:206FA0007F2808BFFFDF307888F80000377084F87E500320A0E0FDF761FA04F18202511E92 -:206FC00007F0E4FB002808BFFFDF94F8810040F0020084F88100D6E794F8AF0018B1FDF71D -:206FE00094FFFDF7E8F93448FDF7AFFF00286CD13770CAE0314808F0DBFCB0703048E97814 -:20700000427A91421CD12979827A914218D16979C27A914214D1A979027B914210D1E9790F -:20702000427B91420CD1297A827B914208D129780078C1F38011B1EBD01F08BF012500D0F1 -:20704000002500E042E0FDF749FEB07804286BD1D5B31948FDF779FF002808BF3770FDF75F -:207060005FFF94F8B80000281CBF0020FFF7F5FA4FF0010884F8B880104D94F8530028BB4B -:20708000042084F8550094F8AF00A5F1910918B1FDF7B1F9012835D0284608F0BBFC09498C -:2070A00081F8560009F12C01284608F08CFC00BF04F15E0128460AE0D40000208C0D0020D4 -:2070C000B40D0020D00C00202EE05EE016E008F005FD84F85D001F2884BF1F2084F85D001C -:2070E00004F17D0530787F2808BFFFDF30782870377084F85380042001F053F9BDE8F84FA2 -:20710000FFF75FBAFDF7BAF909F12C02511E07F03DFB002808BFFFDFFE4890F8560040F0D2 -:20712000020089F82B00C3E7FB48FDF70EFF002808BF3770FDF7F4FE94F8B800002804BF08 -:207140000120FFF78AFA84F8B880BDE8F84FFFF738BAFFDFBDE8F88F94F8B200052828BFB0 -:20716000BDE8F88FDFE800F0030303041900F1E794F8AF0018B1FDF7C8FEFDF71CF9E64839 -:20718000FDF7E3FE00283FF433AFFDF7C9FEFDF7A5FDBDE8F84FFFF714BADF48FDF7D5FEEE -:2071A000002808BF3770FDF7BBFE94F8B800002804BF0120FFF751FA84F8B880FDF78EFDC8 -:2071C000BDE8F84FFFF7FDB970B5D24C94F8B200072878D2DFE800F08D8D8D8D8D04100091 -:2071E000CE48FDF7FCFDFDF7A5FE9620FDF71FFE042084F8B20070BDFDF748FEFDF73AFE49 -:20720000FDF76CFDFDF7CFFD012584F8B850022084F8B200FDF7E0FD2078002818BFFFDF11 -:207220000026A670D4F89C000188A180418861838188A183C088E08384F8206094F8AD1036 -:20724000B74849B10178C21CC1F3801121B1517901F0C00140292ED094F8AE1041B110F8A0 -:20726000031BC1F3801119B1407910F0C00F22D0AC480AF0DDFD00BF94F8AF0018B1FDF7E8 -:20728000BAF8012820D0D4F89C00417EE171D0F81A10A160C08BA081666126832570D4F87A -:2072A0009C000088F9F7E4FCF9F744F9BDE87040022001F076B8D4F8E700C4F80E00B4F8EE -:2072C000EB006082D8E714E0FDF7D8F804F10802E11D07F05BFA002808BFFFDFE07940F0CB -:2072E0000200E071D4F8BF006061B4F8C3002083D4E7FFDF70BD70B5864C94F8B2000025BD -:20730000052828BF70BDDFE800F03939391B03008148FDF71AFE10B97F497F200870FDF73B -:20732000FFFD94F8B800002804BF0120FFF795F984F8B850FDF7D2FCBDE87040FFF741B9F2 -:20734000FDF7A4FDFDF796FDFDF7C8FCFDF72BFD94F8AF0028B1FDF7D8FDFDF72CF884F8CC -:20736000AF50012084F8B800022084F8B200FDF733FDBDE87040002001F013B870BD0122C4 -:2073800001F0E1B870B5012000F015FF614CC8B104F1E401A1F1280008F04CFB04F1E40641 -:2073A00094F89110304608F02CFB04F19201304608F002FB94F8AD00C0B394F8A000032815 -:2073C0001FD025E0FDF762FDFDF754FDFDF786FCFDF7E9FC94F8AF0030B1FDF796FDFCF73C -:2073E000EAFF002084F8AF00012084F8B800022084F8B200FDF7F0FCBDE87040002000F06F -:20740000D0BF94F89B00002818BF94F8A30001D194F8B00007F0DBFA050007D0012130463A -:2074200008F0EFFA2946304608F0C6FA3C48FDF7D6FC01210846FDF7A0FD052084F8B20030 -:2074400070BD70B5022000F0B6FE324C68B3012000F0A7FF04F1E401A1F1280008F0EAFA54 -:20746000D4F89C00417B04F1E40008F0C1FAD4F89C0004F1BC0204F1E4061278417BC2F367 -:2074800040121140417394F89110304608F0B9FA04F19201304608F08FFA94F8AD00B8B324 -:2074A00094F8A00003281FD025E0FDF7EFFCFDF7E1FCFDF713FCFDF776FC94F8AF0030B14C -:2074C000FDF723FDFCF777FF002084F8AF00012084F8B800022084F8B200FDF77DFCBDE82D -:2074E0007040002000F05DBF94F89B00002818BF94F8A30001D194F8B00007F068FA0500EF -:2075000014D00121304608F07CFA294630460BE00CE00000D00C0020D40000208C0D00201C -:20752000B40D0020DE0C002008F046FAD4F89C00C18A324808F0FEFAD4F89C00417D2F486E -:2075400008F0FCFA2D48FDF74AFC062084F8B20070BD70B50C46054608F008FA032C47D00B -:20756000052C18BF70BD0521284608F002FA244CD4F89C0000F10E01284608F0C5FAD4F885 -:207580009C0000F11201284608F0C2FAD4F89C00417D284608F0D2FAD4F89C00C18A2846B0 -:2075A00008F0C8FAD4F89C004188284608F0B6FAD4F89C008188284608F0B4FAD4F89C00DD -:2075C000C188284608F0B2FAD4F89C0000F10801284608F0CDFAD4F89C00017E284608F074 -:2075E000AFFA94F8B3102846BDE8704008F0B2BA2846BDE87040032108F0BBB9B40D002038 -:20760000D00C00202DE9FF4F06460C46488881B040F2E24148430090E08A002500FB01FB75 -:2076200094F8630091460D2818BF0C281ED025281EBF94F8640025284FF0000A16D0049824 -:2076400018B10121204603F029FB94F8510094F8528094F8C810074659B1012958D002294F -:207660003DD0032918BFFFDF52D0A6E04FF0010AE5E7B9F1000F08BFFFDFFE4D68680028BD -:2076800008BFFFDF94F85100FDF7C7FE00F2E7314FF47A70B1FBF0F0696800EB010994F89A -:2076A0005100FDF7BAFE94F85110022907BFF2494FF47A72F1494FF4C8621144084400F24B -:2076C000E7314FF47A70B1FBF0F040F2E241081A2969584449440844051D012015E0E548F6 -:2076E000A9F101014068084308BFFFDFE448B9F1000F006800EB0B0506D0DE48406800F278 -:207700002230A84288BFFFDF032084F8C80053E094F86310009D25291CBF94F8641025295B -:2077200036D1B4F85810B4F8EA20891A491C09B200292DDB94F8E81009B30F4694F8E9106A -:20774000002918BF8846022807BFCB484FF47A71CA484FF4C8610144022F07BFC6484FF41F -:207760007A72C6484FF4C8621044814208D9081A00F5FA714FF47A70B1FBF0F0054407E03F -:20778000401A00F5FA714FF47A70B1FBF0F02D1AB9F1000F10D0DFF8DC92D9F8040020B9A3 -:2077A000B9F80200002818BFFFDFD9F8040000F22230A84288BFFFDF05B9FFDF2946D4F83A -:2077C000CC00FAF760FEC4F8CC00B060002030704FF0010986F80490204603F04CFBAAF1A0 -:2077E0000101084208BF86F8059006D094F8C80001280CBF0220032070714046D4F824B0F9 -:20780000FDF7FCFD0146022F07BF9B484FF47A729A484FF4C8621044084400F23F614FF467 -:207820007A70B1FBF0F0584400F5C970F060049830EA0A0004BF05B0BDE8F08F2946304677 -:2078400007F010FF87B2204603F015FBB8420FD8074686F8059005FB07F1D4F8CC00FAF7BE -:2078600012FEB0602946304607F0FCFE384487B23946204603F012FAB068C4F8CC0005B024 -:20788000BDE8F08F2DE9F04304467E4885B00D4690F80004DFF8F091400999F800144909BF -:2078A000884218BFFFDFDFF8CC81002708F13C06082D80F0FA80DFE805F0045B656560F867 -:2078C000F894202C28BFFFDF36F814000621F9F7C5F8050008BFFFDF202C28BFFFDF36F80C -:2078E00014002988884218BFFFDF95F8C800002808BFFFDF284602F0BCFEC8F80470A8F834 -:20790000027029460020C8F8107007F0EFFE00F19804686AA04218D995F85200FDF76EFDD2 -:2079200095F85110022907BF53494FF47A7253494FF4C862114408444FF47A7100F23F6034 -:20794000B0FBF1F1686A0844071B29460020C8F8087007F0CBFE698840F2E2425143983030 -:20796000081AA0F22230C8F80C0005B0BDE8F08305B0BDE8F04303F05DB805B0BDE8F04346 -:20798000FDF792BB99F8140D4049400991F800144909884218BFFFDF202C28BFFFDF36F875 -:2079A00014000621F9F75AF8050008BFFFDF202C28BFFFDF36F814002988884218BFFFDF1D -:2079C0000022012329466846FFF71CFE95F8D2006946FBF797FA002808BFFFDF05B0BDE87C -:2079E000F083202C28BFFFDF36F814000621F9F735F8050008BFFFDF202C28BFFFDF36F894 -:207A000014002988884218BFFFDF95F8C800042818BFFFDF85F8C87095F8D2404FF6FF79DB -:207A2000202C28BFFFDF26F8149095F8D200FBF700F8002808BFFFDF202085F8D200D5F801 -:207A4000D800002804BFD5F8D400C8F8140008D0D5E937121144826911448161D5E93501A4 -:207A6000C860D5F8D40000281CBFD5F8D810016114D10EE0DC0D002068360200A2240200DF -:207A8000E000002001E000E00BE000E019E000E00BE0D5F8D800002818BF8761FC4800784E -:207AA00005B0BDE8F043F4F725B9FFDF05B0BDE8F0832DE9F047F74D0746E88B6C68401C44 -:207AC000E88328784FF00008002808BFFFDF07D0DFF8C4A3042814D0052818BFFFDF40D070 -:207AE00021462869FAF7CFFCB86087F8008001203871A86800F5B370F860287804287CD158 -:207B000085E00029ECD02E69DAF8141039B38946C9680029FBD1B9F1000F20D099F8000073 -:207B2000002808BFFFDFD9F81410D9F8040001443046FBF7AEFC002807DA211A4A1E92FB1E -:207B4000F4F202FB0406214604E090FBF4F202FB140621468E4288BFFFDF3446C0E744465E -:207B6000BEE70029BCD0D5F81890B9F1000F08BFFFDF0026D9F8DC10DAF814403046721EC9 -:207B80005CB1A069884228BF824284BF024626462046E468002CF4D106B9064609F1C804EF -:207BA000C9F8D860002E04BFC4F80C80CAF8144005D0F068F460E060002818BF0461D4F88C -:207BC0001090C4F81880B9F1000F0ED0D9F8180048B1D4F814A0504538BFFFDFD9F8180065 -:207BE000A0EB0A00A061C9F81880002E08BFC5F8208009D03078002800E00DE008BFFFDF29 -:207C0000716970680844286240F6B83468E7E88B0A2838BF032000D302207871E88B012832 -:207C200006D93846696807F01DFDE98B0844E883B8682861BDE8F0872DE9F0418046974829 -:207C400084B00E4690F80004954F410997F800044009814218BFFFDF01210025082E8D4C38 -:207C600062D2DFE806F0041A35353061614D61732173607800281CBF04B0BDE8F081864871 -:207C8000456005612573A068C138FEF758FD002818BFFFDF04B0BDE8F081607850B1207BDB -:207CA000002808BFFEF72CFF657304B0BDE8F041FAF7E9BDA173FEF7FEFD002818BFFFDFDB -:207CC00004B0BDE8F08104B0BDE8F041FDF7ECB997F8140D7349400991F800144909884249 -:207CE00018BFFFDF00216846FFF7E3FE69464046FBF708F9002808BFFFDF04B0BDE8F0816A -:207D00002078052818BFFFDF207F002808BFFFDF25772570207DFAF78CFE002808BFFFDF67 -:207D2000257504B0BDE8F081FFDF04B0BDE8F0812DE9F041574C0026207804281FBF2078ED -:207D400005280C20BDE8F08101206070607B0025A8B1EFF3108010F0010F72B60CBF0027CE -:207D60000127607B00281CBFA07B002805D0FEF7C7FE6573A573FAF786FD2FB903E0207D5F -:207D8000FBF7D3F900E062B6207DFBF71CFC207F28B125772078052818BFFFDF0C266570F1 -:207DA0002570207DFAF745FE002808BFFFDF25753046BDE8F0812DE9F04F364883B00078EC -:207DC000002818BFFFF7B4FF0120DFF8CC8088F8000069460620F8F7CCFD002818BFFFDFCD -:207DE00000274FF6FF7934E0029800281CBF90F8C81000292DD0008848451CBFDFF8A8A059 -:207E00004FF0200B3BD00621F8F728FE040008BFFFDF94F8D200FBF7D6FB84F8C87094F8A7 -:207E2000D2504FF6FF76202D28BFFFDF2AF8156094F8D200FAF7FDFD002808BFFFDF84F82B -:207E4000D2B069460620F8F794FD002818BFFFDF10E06846F8F76BFD0028C5D00FE0029833 -:207E600000281CBF90F8C810002903D000884845C9D104E06846F8F75AFD0028EFD088F8B5 -:207E80000070C8F8147003B00020BDE8F08F0000DC000020F40D0020DC0D002001E000E050 -:207EA0000BE000E019E000E0180E002010B50078F84C60B101280CBF40F6C410FFDF06D094 -:207EC000A06841F66A01884228BFFFDF10BDA060F6E710B5EF4C00232070EF4803704370AF -:207EE0000377037343738373202183610175183843703A3010214FF6FF72428020F8042FEA -:207F0000491EFAD1180008BFA36005D0002B0EBFFFDF40F6C410A060A06841F66A01884224 -:207F200028BFFFDFBDE8104045E72DE9F043DA4C054685B0207816460F4600281EBF0C20F2 -:207F400005B0BDE8F08395F8519095F85200D5F82480FDF753FAB9F1020F07BFCF494FF479 -:207F60007A72CF494FF4C862114408444FF47A7900F23F60B0FBF9F0404400F22230C5F80F -:207F8000DC00A56195F8C800002818BFFFDF40F27120784360600120FDF730FA00F2E73047 -:207FA000B0FBF9F040F2712106FB0100A0606168A1F2F621884298BF01460020A160B94969 -:207FC00008610521217060702077E083B648FAF7D5FC2075202808BFFFDFFAF749FD2061BD -:207FE00001216846FFF765FD207D6946FAF78AFF002808BFFFDF002005B0BDE8F083A648EB -:20800000007800281CBF0020704710B50620F8F7C1FC80F0010010BD30B59F4C85B022789A -:20802000002A1EBF0C2005B030BD0D4640F27121484360600120FDF7E1F94FF47A7100F2FA -:20804000E730B0FBF1F040F2712105FB0100A0606168A1F2F621884298BF01460020A160BC -:20806000607004212170E0838F48FAF787FC2075202808BFFFDF8B48406938B10146C06876 -:208080000028FBD111B1FAF7F3FC05E0FAF7F0FC40F6B831FAF7F7F9206101216846FFF741 -:2080A00008FD207D6946FAF72DFF002808BFFFDF002005B030BD70B5774CA1690160FFF77A -:2080C00037FE002300BBA169D1F8D8205AB1D1E937C5AC449569AC44C2F818C0D1E9352C76 -:2080E000CCF80C2005E0DFF8BCC1D1F8D420CCF81420D1F8D420D1F8D810002A18BF1161C1 -:2081000002D1002918BF8B61A36170BD65494870704770B540F2E24300FB03F510460C463B -:20812000FDF76CF9022C07BF5C494FF47A725C494FF4C862114408444FF47A7100F23F60AC -:20814000B0FBF1F000F2223085428CBF281A002070BD70B50D4606460146002007F0C6FACC -:20816000044696F85200FDF749F996F85110022907BF4A494FF47A7249494FF4C8621144A9 -:2081800008444FF47A7100F23F60B0FBF1F0718840F271225143C0EB4100A0F22230A5423F -:2081A00034BF21462946814203D2A5422CBF28462046706270BD3B4910B54968002801F1A5 -:2081C000980408BF04F5BC7409D0012808BF04F5317404D0022814BFFFDF04F5B0742E486A -:2081E0008068A0428CBF0120002010BD10B52D4C607828B1D4E90201626807F05BFAA06097 -:20820000D4E9010188429CBF2078002814BF0020012010BD04222DE9F043204FDFF8808024 -:2082200085B04FF47A79052980F0B980DFE801F00A2B033E890080F8C82005B0BDE8F04358 -:20824000FAF721BB044617480078002818BF84F8C82004D005B0BDE8F043FAF714BB012289 -:20826000002321466846FFF7CDF994F8D2006946FAF748FE002808BFFFDFB4F85800401C99 -:20828000A4F85800E6E7032180F8C81005B0BDE8F0830000DC000020F40D0020683602001F -:2082A000A2240200DC0D0020397C01000446408840F2E2414843B3490860D4F8F0002146BE -:2082C0000089E082D4F8F00080796075D4F8F00040896080D4F8F0008089A080D4F8F00023 -:2082E000C089E0800020A66A07F000FA054694F85200FDF783F894F8511002290EBF4FF4F4 -:208300007A7147464FF4C8613944084400F23F60B0FBF9F1608840F271225043C1EB40005E -:20832000A0F22230AE4234BF29463146814203D2AE422CBF304628466062022084F8C80011 -:20834000A4E706460146856A002007F0CFF9044696F85200FDF752F896F8511002290EBFE2 -:208360004FF47A7147464FF4C8613944084400F23F60B0FBF9F0718840F271225143C0EBEB -:208380004100A0F22230A54234BF21462946814203D2A5422CBF28462046706276E7FFDFBD -:2083A00074E72DE9F041DFF8E0810025774C98F8001084B0052880F0C180DFE800F0031679 -:2083C0006DB9B900E5830846F3F794FC6078002873D100216846FFF76CFB207D6946FAF7E1 -:2083E00091FD002808BFFFDF67E00120FDF706F86749684E08444FF47A71B0FBF1F02169D2 -:20840000726840F2E2431144081AA16900F2DE604A88C83102FB03F772698A4208BF002525 -:2084200014D0216AFBF735F8002807DA391A4A1E92FBF7F202FB0705394604E090FBF7F294 -:2084400002FB170539468D4288BFFFDFD8F80800854208D2A06940F271224188C1824A43B0 -:2084600005EB420505E040F2E240B5FBF0F0A169C882A06905214175C08A6FF41C714843FE -:2084800005EB400040F635413061B0EB410F28BFFFDF04B0BDE8F081E5830846F3F72AFC2F -:2084A00001202077A0692169C0F8CC1080F8C8502178052918BFFFDF06D0FAF7E4F9657355 -:2084C000A57304B0BDE8F081002808BFFFDFA06990F8C800002818BFFFDFA06990F8D20054 -:2084E000202818BFFFDF2C48FAF748FAA1690646202881F8D2000F8828BFFFDF274820F80C -:208500001670A06990F8D200202808BFFFDF002301226846A169FFF775F8A069694690F8E4 -:20852000D200FAF7EFFC002808BFFFDFA561C4E704B00846BDE8F041F3F7DCBBFFDF04B024 -:20854000BDE8F081704770B5124D0446002912BF0129686070BD02291CBFFFDF70BD688866 -:20856000401C68801046FCF758FF4FF47A7100F2E730B0FBF1F0201A686070BD0348007862 -:2085800070470000E0000020DC000020F40D0020C92E0200DC0D002085780100180E0020C1 -:2085A000FE48406870472DE9F0410D46064601461746012007F09AF8044696F85200FCF7C5 -:2085C0001DFF96F8521002290CBFF549F54908444FF47A7100F2E140B0FBF1F0718840F2D9 -:2085E00071225143C0EB4100C01BA0F55970A54234BF21462946814203D2A5422CBF2846A7 -:2086000020467062BDE8F0812DE9FF4F8FB0044690F85200DDF8709098460B9049EA0800BC -:208620000C9094F86400002617460D280CBF012000200890B8F1000F04BF94F8040103281B -:2086400071D1089800286ED0B4F87C01B8426AD1D4F80C01C4F8F800608840F2E24148431F -:20866000C4F8FC00B4F85201B4F8DE100844C4F80001204604F00DFDB4F88001E08294F821 -:208680007E016075B4F882016080B4F88401A080B4F88601C549E080C348097894F86431D8 -:2086A000628830F8111030F81300D4F828A008440004000C4FF0000105D000FB02F1BC4855 -:2086C000B1FBF0F0411C1FFA81FB2146012007F00DF8054694F85200FCF790FE94F8521000 -:2086E00002290CBFAE49AF49084400F2E1414FF47A70B1FBF0F1608840F271225043C1EB8F -:208700004000A0EB0B00A0F55970AA4534BF29465146814203D2AA452CBF50462846606205 -:20872000022084F80401D4E956ABB4F8DE000390B4F85001D4F84C110691B8F1000F03D073 -:2087400094F8181149B17FE004F1D80100917431099104F59C75091D07E004F596710091C5 -:20876000091D099104F58E75091D0A91B4F85810381A791A09B200B20491002805DAD4F8AE -:208780004801069001200C90084694F8041100295ED0012900F0668102297DD0032918BF7B -:2087A000FFDF00F0A98131460698F9F76CFE099908600A980121078000202870297109980A -:2087C0000068A8607948D0E90520824287BF009A1060009802600098626A0068104400F26A -:2087E0008310E8606971B4F8C800C01B00B20028C4BF032068710898002800F0F181B9F148 -:20880000000F18D0B4F8F020002A0CBF0020B4F8F200A4F8F20094F8F430401C58439042EB -:2088200009D26879401E002805DD6971B4F8F200401CA4F8F200B8F1000F00F0F58194F808 -:208840001801002800F0EC8113B00220BDE8F08FBAF1000F08BFFFDFE08A40F27121484359 -:20886000490001EB400210980021002806D000FB02F14F48B1FBF0F000F10101C4F80811E1 -:20888000608840F2E24100FB01F210994FF0000008D001FB02F100E042E04548B1FBF0F0E3 -:2088A00000F10100C4F80C010AF101064FF00100FCF7A4FD3F494FF47A7B0844B0FBFBF085 -:2088C000E18A40F271225143C0EB4101D4F808010190091A314401F2C246607D510010FBB5 -:2088E00001F00C900120FCF789FD33490844B0FBFBF1019801EB40010C9801EB000B012070 -:20890000FCF770FD584400F16201284841618161A6EB0A00401EB0F53D7F38BFFFDF42E7BB -:20892000E28A40F271215143D4F8FC00109A00EB41010020002A06D01D4802FB01F2B2FBB2 -:20894000F0F000F10100C4F80801628840F2E24302FB03FC109B4FF0000206D0144A03FB25 -:208960000CF3B3FBF2F202F10102C4F80C21039A9AB9B9F1000F38D094F85200FCF73EFDCA -:20898000014694F8520002280CBF054A054A114401F2E1424FF47A7110E026E0580E00200A -:2089A00004360200A224020042230200E800002040420F007D2A020083290200B2FBF1F1CD -:2089C000D4F80821E38A114440F2712CD4F8FC2003FB0CF302EB4302561AFCF703FDABEB01 -:2089E00000003044A0F1200600E00E1AD4F80021D4F8F810D4F8080101FB020B607D40F296 -:208A0000E24110FB01F00C9094F852A05046FCF7F5FC0146BAF1020F0CBFF948F948084407 -:208A200000F2E1414FF47A70B1FBF0F000EB4B010C9801EB000B5046FCF7D4FC584400F1B1 -:208A40006001F14840F2712341616288D4F80C115A43C1EB4201A1F213318161012084F85F -:208A60000401A0E6628840F27123D4F80C115A43C1EB420202FB00F6DDE903020244D4F875 -:208A80000001D4F8F8C0121AD4F80831521E0CFB003002FB010B607D40F2E24110FB01F042 -:208AA0000C9094F852000190FCF7A8FC01460198022814BFD348D248084400F2E1414FF45F -:208AC0007A70B1FBF0F000EB4B010C9801EB000B0198FCF787FC584400F16001CA48B9F195 -:208AE000000F4161A6F2133181613FF45CAEBAF1000F08BFFFDF56E6628840F27123D4F8B3 -:208B00000C115A43C1EB420101FB00F694F8630025281CBF94F8640025280AD1B4F87C0162 -:208B2000381A00B2002804DB94F87F01002818BF0B900C9828B1039880B3BBF1000F18BFA7 -:208B4000FFDFDDE903010144D4F80C0101FB00FA0B98FCF753FC01460B9802280CBFA848A5 -:208B6000A848084400F2E1414FF47A70B1FBF0F000EB4A0A0B98FCF735FC504400F1600100 -:208B8000A14840F2712341616288D4F80C115A43C1EB4201A1F21331816104E6FFE7BBF1F0 -:208BA000000F14BFBAF1000FFFDF0B98FCF726FC0B9902290CBF92499249084400F2E141D3 -:208BC0004FF47A70B1FBF0F0361A94F85200FCF709FCABEB00003044A0F12006B1E700BF9E -:208BE000B9F1000F7FF40EAE94F8040100283FF422AE618840F27122D4F80C015143C0EB0B -:208C00004101284606F02EFD0004000C3FF413AE1D99002918BF0880012013B0BDE8F08F39 -:208C200094F85401FAF781FA94F854012946FAF769F900281CBF88F0010084F81901002012 -:208C400013B0BDE8F08F2DE9F04F704C804683B020788A4600256C4E4FF00209032804BFA4 -:208C6000207B40457CD1606830612078032818BFFFDF0327BAF1080F70D2DFE80AF0040EB5 -:208C80001B1B166F6F6A6562FCF74FFF002818BFFFDFB77003B0BDE8F08FFDF7CBF800287E -:208CA00018BFFFDF03B0BDE8F08F03B0BDE8F04FFCF7FAB927752574E07A012658B14FF4E9 -:208CC0007A71A069F9F7DFFBA061002104F1100006F0C8FC1AE001216846FAF71AFF9DF88C -:208CE000000042F210710002B0FBF1F201FB1205FCF793FD05442946A069F9F7C4FBA06128 -:208D0000294604F1100006F0ADFC461C208C411C0A293CBF30442084606830B1208C401CDE -:208D20000A2828BF84F8159000D26775607A00281CBF03B0BDE8F08F207B04F11001FAF705 -:208D4000E1F8002808BFFFDF03B0BDE8F08F07E004E0207BF9F76DFE2570F5E7FFDFF3E7AC -:208D6000B8F1200F28BFFFDF294F072137F81800F7F774FE040008BFFFDFB8F1200F28BFA7 -:208D8000FFDF37F818002188884218BFFFDF4FF001083461BAF1080F80F04481DFE80AF0F1 -:208DA000049AA2A29DEEEEEDC4F85851F580C4F85C5194F8190138B9F9F75AFED4F8241148 -:208DC000FAF767FB002825DCB4F81611B4F85800814206D1B4F8CC10081AA4F8CE0020462C -:208DE00005E0081AA4F8CE00B4F816112046A4F85810D4F84011C4F82411C0F8481127E09F -:208E000004360200A2240200E8000020580E0020800E0020B4F81411B4F85800081AA4F87F -:208E2000CE00B4F814112046A4F85810D4F82411C4F84011C4F84811D4F82C11C4F8D81059 -:208E4000D4F83011C4F84C11B4F83411A4F8501103F0D7FFF9F7E6FD94F852A00746504601 -:208E6000FCF7CCFABAF1020F0CBFFE49FE4908444FF47A7100F2E140B0FBF1F1D4F80C0131 -:208E800040F27122014460885043C1EB4000A0F1300AB72F98BFB7272146012006F026FCDB -:208EA0003844AAEB0000A0F21937A2462146012006F01CFCDAF824109C30814288BF0D1A3E -:208EC000F760BD4228BF3D46B56084F8188186F8029039E704F0DBF801E0FCF7E5F884F884 -:208EE000188131E7F9F7C4FDD4F8482101461046FAF7CFFA48B1628840F27123D4F80C11F2 -:208F00005A43C1EB4201B0FBF1F094F864100D290FD0B4F85810B4F816210B189A42AEBFC1 -:208F2000501C401C0844A4F8160194F81A0178B905E0B4F81601401CA4F8160108E0B4F847 -:208F40001601B4F8CC10884204BF401CA4F81601B4F85201DFF81493401CA4F85201B4F862 -:208F60007E00B4F87C100DF1080B401AB4F85810401E08441FFA80FA17E045E052E0307889 -:208F8000002339F81000CDE9005B94F8641139F81110084481B22046FFF736FB00283FF4A2 -:208FA000D3AE012818BFFFDF26D0B4F81621AAEB020000B20028E2DA082084F8730084F8B9 -:208FC0007280204603F0D2FB84F8045194F854514FF6FF78202D00D3FFDF27F8158094F87D -:208FE0005401F9F726FD202084F85401307903B0BDE8F04FF2F77EBEB4F81601BDF8081003 -:209000000844A4F81601D0E794F80401042818BFFFDF84F8045194F854514FF6FF78202D1D -:20902000DBD3D9E7FFDF8FE610B5914C207850B101206072FCF71DFF2078032805D0207A00 -:20904000002808BF10BD0C2010BD207BFAF76DF8207BFAF7B8FA207BF9F7EBFC002808BFCB -:20906000FFDF0020207010BD2DE9F04F804F83B0387801244FF0000840B17C720120FCF72F -:20908000F8FE3878032818BF387A0DD0DFF8E49189F8034069460720F7F76BFC002818BF5F -:2090A000FFDF4FF6FF7440E0387BFAF73EF8387BFAF789FA387BF9F7BCFC002808BFFFDFD1 -:2090C00087F80080E2E7029800281CBF90F8041100292AD00088A0421CBFDFF89CA14FF0D3 -:2090E000200B3AD00721F7F7B9FC040008BFFFDF94F85401FAF767FA84F8048194F8545162 -:209100004FF6FF76202D28BFFFDF2AF8156094F85401F9F78EFC84F854B169460720F7F74C -:2091200028FC002818BFFFDF12E06846F7F7FFFB0028C8D011E0029800281CBF90F80411BB -:20914000002905D00088A0F57F41FF39CAD104E06846F7F7ECFB0028EDD089F8038087F892 -:209160000B8003B00020BDE8F08F70B50446434890F80004424D400995F800144909884252 -:2091800018BFFFDF95F8140D40093E4991F800144909884218BFFFDF3649002001220C71EF -:2091A00088700A704870C87031490870BDE870405AE73049087070472DE9F8432C4C064608 -:2091C0002078002875D13048F9F7D8FB207320286FD0032766602770002565722572AEB1BB -:2091E000012106F1F400FAF70CFD0620F7F7E0FB80460720F7F7DCFB96F8F4104044B1FB05 -:20920000F0F200FB1210401C86F8F400F9F70AFC1E49091838BF40F2F65000F59D7086B25A -:20922000FCF7D7FAE061FCF7F8FA4FF0010878B384F80A8001216846FAF76BFC9DF800000E -:2092400042F210710002B0FBF1F201FB12000644F9F70EFC3146F9F716F9A0612775677588 -:20926000257416E004360200A224020042230200580E0020E8000020800E002001E000E0F7 -:209280000BE000E019E000E0478C01000AFAFFFF12E0207B04F11001F9F734FE002808BFB0 -:2092A000FFDF25840020FCF7E4FD0020BDE8F883FFE70C20BDE8F883F9F7DAFB3146F9F795 -:2092C000E2F8A061A57284F80B80C7E72DE9F04782B00026044680F80461A0F85061DFF8FB -:2092E00000944288FD4FD0F8288099F8000094F8641137F8100037F8111008440104090CCD -:20930000304605D001FB02F0F649B0FBF1F0401C1FFA80FA2146012006F0E8F9054694F824 -:209320005200FCF76BF894F8521002290CBFEE49EE4908444FF47A7100F2E140B0FBF1F119 -:20934000608840F271225043C1EB4000A0EB0A00A0F55970A84534BF29464146814203D280 -:20936000A8452CBF4046284660620096019699F8000094F86411002337F8100037F81110EE -:209380001A46084481B22046FFF73EF9002818BFFFDFC4F800610120C4F8F86084F80401AB -:2093A000A4F81661A4F8146184F81A61B4F85800401EA4F85800A4F8526102B00020BDE876 -:2093C000F087C74948707047C94810B5417A0124002918BF002408D1C17A31B1406AC5490F -:2093E000884284BF0024FCF740FD204610BD70B5BB4C0546E088401CE080D4E902016278A4 -:20940000D5F85861002A1CBF324606F053F9A060864208D895F80401012804D0E078002850 -:2094200004BF012070BD002070BD70B50D4640F2E24100FB01F42846FBF7E0FF022D0CBFD8 -:20944000A949AA4908444FF47A7100F2E140B0FBF1F000F54D7084428CBF201A002070BDC4 -:209460002DE9F04383B00026044680F8186190F8D600002807BF94F80401032803B0BDE8AF -:20948000F083F9F7F5FAD4F8482101461046FAF700F80028DCBF03B0BDE8F083628840F215 -:2094A0007123D4F80C115A43C1EB4201B0FBF1F0411CB4F858000144A4F81411B4F8CC1028 -:2094C000B4F81421891A09B20029DCBF03B0BDE8F083012184F81A11B4F87E10B4F87C2073 -:2094E0007E4F891A491E084485B2DFF8F4810DF108091EE098F8000037F81000CDE90069CB -:20950000B4F8142194F86411012337F81110084481B22046FFF778F8002804BF03B0BDE867 -:20952000F08301280FD0022812BFFFDF03B0BDE8F083B4F81401281A00B20028BCBF03B001 -:20954000BDE8F083D6E7B4F81401BDF808100844A4F81401EDE7F0B5DFF884C104265F4B42 -:209560009CF80020002583B006297DD2DFE801F0073C03191941044680F8046107E0044698 -:209580009CF80300002818BF84F804610BD0F9F77AF9A4F85251B4F85800A4F8160184F8A4 -:2095A0001A5103B0F0BD33F8120094F804210121032A13BF94F80421C4F80051C4F8F8500F -:2095C000012AE4D1CDE9001594F86411B4F8CC2033F811100023084481B22046FFF714F8F1 -:2095E000002818BFFFDFD2E7032180F8041103B0F0BD0446B0F802C0866A90F8640133F808 -:20960000121033F8100008440104090C4FF0000005D001FB0CF03349B0FBF1F0401C87B2DE -:209620002146012006F062F8054694F85200FBF7E5FE94F8521002290CBF2B492B4908443C -:209640004FF47A7100F2E140B0FBF1F0618840F271225143C0EB4100C01BA0F55970AE42E6 -:2096600034BF2946314600E008E0814203D2AE422CBF30462846606203B0F0BDFFDF03B03F -:20968000F0BD2DE9F8431A4C0327154EE27AA17A42F21079002550B1012843D002281CBF3E -:2096A000FFDFBDE8F8834FF000081AB95EE04FF000080AB1E5722EE051B101216846FAF72A -:2096C0004DFA9DF800000002B0FBF9F109FB1108FCF7A3F800EB0801A0690DE0422302001B -:2096E000E800002040420F0004360200A2240200580E0020DB821300F8F7C5FEA06125748B -:209700006775607A30B9207B04F11001F9F7FAFB00284BD02584F9F7B6F83079BDE8F84311 -:20972000F2F7E8BAE572A7692570012020720021606805F035FB6068C0F84871217B80F894 -:209740005411616AC0F84C71C0F8581190F854510788202D28BFFFDF3C4820F8157060688C -:20976000FFF7B4FD002818BFFFDFD4E751B101216846FAF7F3F99DF800000002B0FBF9F1CF -:2097800009FB1108FCF749F800EB0801A069F8F77AFEA06125746775607A0028BAD1207B76 -:2097A00004F11001F9F7AEFB0028B3D1FFDFB1E770B5274CA178022906BFE188002970BD88 -:2097C0002569C5F85C0195F85200FBF70BFED5F85C11081AA1680144A160E1680844E06087 -:2097E00070BD70B505461A488378022B06BF006900F5AC74174C002904BF256070BD0129D4 -:2098000008BF681E0DD002291CBFFFDF70BD1046FBF703FE4FF47A7100F2E140B0FBF1F0F7 -:20982000281A206070BD0C48007800281CBF0020704710B50720F7F7ADF880F0010010BDD6 -:2098400005480078002818BF01207047800E0020E80000207C0E0020580E0020F8490C2811 -:20986000896881F8C3001ABF132818287047002211280FD0072808BF704715280AD0012889 -:209880001ABF002802287047A1F88220012081F886007047A1F88820704770B5E84CA1687A -:2098A0000A88A1F8362181F8340191F85100012808BF012508D0022808BF022504D0042898 -:2098C00016BF08280325FFDFA06880F8385190F85200012808BF012508D0022808BF022594 -:2098E00004D0042816BF08280325FFDFA068012180F8395180F83211002180F80611E0786E -:20990000BDE87040F2F7F6B9F0B4CD48806890F84E30478EC68E458FB0F84010C28FB0F8C5 -:2099200042C0022B1FD08D4238BF29460186624528BF62468286018FB0F84430994238BF91 -:209940000B464386818FB0F84640A14238BF0C46C486BB4228BF1F464786B44228BF2646DA -:20996000C686F0BC7047038E9D4228BF1D46838E9A4228BF1A46A94298BF0D460586944551 -:2099800098BF62468286002180F84E10D3E7AC4A012992681BD0002302290FD0032921D0C0 -:2099A00028B301282ED0032818BF704792F8630013281CBF1628182805D1704792F8C30091 -:2099C000002808BF7047D2F8F0000370704792F8C300012808BF7047D2F8F4000178491E6B -:2099E0000170704792F8C3000328ECD17047D2F8F000B2F858108288891A09B20029A8BF8F -:209A000003707047B2F85800B2F8FA10401A00B20028E1DA70472DE9F04100260327884C55 -:209A20000125A0B1206906F0CCF9A16881F8C20005FA00F010F4000F08BFFFDFA06880F800 -:209A40006370A0F8826080F88650BDE8F081A0680023194690F86420583005F0A2FD00287B -:209A600004BF6570BDE8F0816078002818BFBDE8F081206906F0A5F9A16881F8C10081F872 -:209A80006470A1F8886081F88A50BDE8F08170B56B4C84B0207910F0010F04BF04B070BDAB -:209AA000206900230521C578A06890F86320583005F077FD002818BF022D0FD00B2D18BF77 -:209AC000042D0BD0052D18BF062D07D00D2D18BF112D03D0607840F0080060706078002865 -:209AE0001CBF04B070BD2069C078801E162880F05283DFE800F00BFBA7C5FA26FBF9FB9AF6 -:209B0000F8FCFBFBFBE3F6F5F4F3F2F1A0680023012190F86620583005F043FD002840F058 -:209B2000B583206906F0A8F9A16881F8EE00072081F86600002081F88A0081F8860000F045 -:209B4000A5BBA0680921002390F86320583005F028FD20B1206906F0DFF9122814D0A06855 -:209B60000A21002390F86320583005F01AFD20B1206906F0D1F9142821D0206906F0CCF96D -:209B8000162840F0838342E0A0680125002390F863200921583005F004FD002808BF657067 -:209BA00000F074836078002840F07083A16881F87A0081F8860081F8630000F067BBA068AA -:209BC0000021012580F86310A0F8821080F886100421FEF71FFBA06890F84E10012900F0DF -:209BE0007C820288A0F81621028EA0F81821828EA0F81A21428E00F58671A0F81C21C08EEB -:209C000048820D72E078F2F775F800F03FBBA06890F86310202940F03983002180F863101F -:209C200080F886101A2000F02FBBA06890F863100F292AD1002180F8681012213AE000006E -:209C400004010020A06890F8631013291DD1D0F8F01000884988814218BFFFDFA068D0F849 -:209C6000F00000F12601206906F033F9A06800F1BC01206906F035F91620A16800F064B982 -:209C8000A26892F86300162802D0022000F064BAD2F8F00002F1A80300F11E0100220E30C5 -:209CA00005F007FCA0680021C0E92611012180F86810182180F8631000F0E8BA206906F05C -:209CC000B0F9032840F0E282206906F0AEF900BF01F022FC00F0DABA8DE202E2AEE152E18F -:209CE0001EE135E103E050E0C4E004E0D5E1206906F00EF9ECE7A06890F863101B29C4D1C9 -:209D0000002580F88B5080F88650D0F8F01000884988814218BFFFDFA068D0F8F0100D7097 -:209D2000D0F83C110A78002A18BFFFDF40F0F38090F88C207AB180F88C500288CA80D0F8BB -:209D40003C110D71D0F83C210D211170D0F83C210188518010E00288CA80D0F83C110D718E -:209D6000D0F83C2101211172D0F83C210C211170D0F83C21018851800088F6F779FFF6F7ED -:209D8000D9FBE078F1F7B6FFC5E0A0680023194690F86420583005F004FC50B9A06800230E -:209DA000082190F86320583005F0FBFB002800F027826078002840F06982A06890F88E0002 -:209DC00010F0020F17D1206906F098F8A16881F88F00206906F094F8A168A1F890002069A4 -:209DE00006F091F8A168A1F8920091F88E0040F0020081F88E00A06890F88E1011F0010F21 -:209E000012D190F8642000231946583005F0C9FB002808BFFFDF0121A06880F8641080F835 -:209E20008A100021A0F88810A06890F86310012907D1002180F8631080F88610E078F1F7D8 -:209E400059FFA168D1F8F000098842888A4204BF0178042940F01A8200250570E078F1F7B2 -:209E600049FFA06890F86310002908BF80F8865000F00CBAA0680023072190F863205830BD -:209E800005F08FFB002800F0BB816078002840F0FD8102A9206906F079F8A0689DF80820E1 -:209EA000002590F89410114001F02F0180F8941090F895109DF80920114001F0410180F8DC -:209EC000951080F88650D0F8F01000884988814218BFFFDFA068D0F8F0100D70D0F83C1194 -:209EE0000A78002A18BFFFDF15D10288CA80D0F83C110D71D0F83C11029A8A60039ACA6052 -:209F0000D0F83C21072111700188D0F83C014180E078F1F7EFFEA06880F8635000F0B6B965 -:209F2000A0680023092190F86320583005F039FB002800F065816078002840F0A781A168B1 -:209F400081F87A0081F8860081F8630000F09EB9A0680023194690F86420583005F021FBBD -:209F6000002800F04D816078002840F08F81A0680021A0F88810012180F88A10022180F893 -:209F8000641000F083B9A0680023194690F86420583005F006FB00287ED0206905F0E0FF3A -:209FA00000287AD0206905F0D7FFA1680887206905F0CEFFA1684887206905F0CFFFA168CB -:209FC0008887206905F0C6FFA168C88791F863001D2813BF91F84E00012081F84E000128EC -:209FE00007D091F8FD00002804BF91F8FC00002803D01F2081F8640017E01E2081F864006B -:20A000000A88A1F822210A8FA1F824214A8FA1F826218A8F01F58670A1F82821C98FC1831F -:20A0200001210175E078F1F765FEA0680021A0F88810012180F88A1000F028B9A06800235C -:20A040000A2190F86320583005F0ABFA20B3206905F086FFA8B1206905F07EFFA1680887E6 -:20A06000206905F075FFA1684887206905F076FFA1688887206905F06DFFA168C887FFF7D3 -:20A0800043FCA068002180F8861080F863100421FEF7C0F8A06801E01AE07CE090F84E1068 -:20A0A00001291AD00288A0F81621028EA0F81821828EA0F81A21428E00F58671A0F81C215E -:20A0C000C08E488201200872E078F1F713FEDDE0607840F001006070D8E0022180F84E1035 -:20A0E000D4E0A0680023194690F86420583005F058FA80B3A06890F86300242812BF2528B7 -:20A10000607840F0200027D06846FBF7EDF9002808BF002105D0009805F053FE8DF808004A -:20A1200002A9A06801AB162290F8630005F001FCA0B1A0689DF80420162180F8E42080F86E -:20A14000E5101A2180F86410012180F88A100021A0F888109AE053E0607097E0206905F0EC -:20A1600022FFC0B1206905F018FFA16800F0070081F84F00206905F014FF00F00701A0685F -:20A1800080F8501090F80721002A04BF90F80621002A04D024E00020FFF73DFC76E090F86C -:20A1A0004F3090F852C000F151029C4501BF12788A42012180F87B1012D00288A0F82E21D3 -:20A1C00090F84F2000F5867180F8302190F8500081F82500012081F82000E078F1F78AFDDC -:20A1E000A068222180F86410012180F88A100021A0F888104AE0A06890F86300202801D06D -:20A200000120A9E7206905F0D8FEC0B3206905F0C4FE00F0070060F30705206905F0C1FEF3 -:20A2200000F0070060F30F25A2680120002682F88600A2F88260242082F86300D2F80801DF -:20A24000B2F851202946ADF8002005F020FB9DF80020C1B28A4207BFA16881F8E860A26811 -:20A2600082F8E8109DF80110C0F30720814219BFA16881F8E900A06880F8E96006E0FFE751 -:20A280000120FFF7C8FB1E20FFF707FBA068D0E928134A1C43F10001C0E9282104B070BD44 -:20A2A0002DE9F047FE4D04464FF00007687808436870287910F0200F2846806818BFA0F8DE -:20A2C0007C7004D1B0F87C10491CA0F87C1090F86910012639B990F8632000230621583009 -:20A2E00005F05FF958B3A88810F4006F07D0A86890F86910002918BFA0F874701FD1A868FF -:20A30000B0F87410491C89B2A0F87410B0F876208A422CBF511A00218288521D8A4228BFA8 -:20A3200080F87A60B0F87410B0F87620914206D3A0F8747080F81261E878F1F7DBFC28798E -:20A3400010F0600F08D0A86890F8671021B980F867600121FDF75EFF4FF00808002C56D179 -:20A360006878002851D1287910F0040F0DD0A86890F86300032808BFFFDFA86890F8661049 -:20A38000072904BF2E7080F8667001F015F9287910F0080F19D06878B8B9A868002190F834 -:20A3A000C300FFF7F4FAA86890F8C300FF2808BFFFDFFF21A86880F8C31090F86610082925 -:20A3C00003D10221297080F86670FFF760FBA87810F0080F16D0A8680023052190F86320CD -:20A3E000583005F0DEF850B185F80180A868D0F83C1108780C2808BF0020087002E00020D1 -:20A4000003F04DFDA86801F010F800F06CFDA868A14600F1580490F8EC0030B9A27B0023BC -:20A420000121204605F0BDF810B1208D401C20853D21B9F1000F18D12878022808BF1620B4 -:20A440000ED0012804BFA86890F8EE0008D06878E8B110F0140F1CBF1E20E07602D005E012 -:20A46000E07603E010F0080F02D0E176A67641E010F0030F03D02A20E076A6763AE010F06B -:20A48000200F08BFFFDF2320E076A67632E094F82E0028B1608D411C6185A18D884213D281 -:20A4A00094F8320028B1208E411C2186A18D88420AD2218DE08C814203D3AA6892F8EC2024 -:20A4C00012B9A28D914203D32220E076A67611E0E17B31B1A18C814228BF84F81B80C5D271 -:20A4E00006E0A08C062803D33E20E076A67601E0A07EA0B1E7722773E7730221A868FDF7B2 -:20A5000089FEA86890F8C310012904D1D0F8F4000178491E0170E878F1F7ECFB03E000210A -:20A52000A868FDF777FEBDE8F047FAF7ECBF5C494A788B781A430ED101280AD0087910F000 -:20A54000040F04D0886890F86600072803D001207047FDF74BBE0020704770B5504C06467B -:20A560000D46A0883043A08016F0020F04D016F0010F18BFFFDFE56016F0010F18BF25615F -:20A5800016F0020F12D0284605F01BFC062802D00B282ED00AE0A06890F86310182905D113 -:20A5A0000021C0E92811012180F8691016F0800F1CBF0820A07016F4806F08BF70BDA068E8 -:20A5C000B0F8581080880844801D86B2284605F0F8FB012804BFA068A0F8FA6015D02846B3 -:20A5E00005F0EFFB68B1284605F0EBFB182823D00BE0A06890F86310122908BF0021D5D130 -:20A60000D2E7A068D0F8F0008680284605F0D9FB01281DD0284605F0D4FB08B3284605F01E -:20A62000D0FB182818BF70BDA068B0F8EA102846BDE8704005F0D3BCA06890F8E810002969 -:20A6400002BF90F8E91000290026A0F8EA60DCE7A068B0F8FA102846BDE8704005F003BC93 -:20A66000A068D0F8F00081882846BDE8704005F0CABBF0B50A4C85B00026A060A680667082 -:20A68000A670054626700088FAF705FFA0680088FAF727FFB5F8D000A168401C82B201E0A8 -:20A6A0000401002001F1580004F085FD002818BFFFDF95F8640025280AD1B5F85810B5F8FD -:20A6C000EA00081A00B20028A4BF6078002804D095F8630025283BD119E0A06890F8E81093 -:20A6E000002908BF90F8511080F8511090F8E910002908BF90F8521080F852100020FFF75D -:20A70000CCF885F86460A16881F87B6020E0B5F85810B5F8EA00081A00B20028A4BF6078F4 -:20A72000002815D1A06890F8E810002908BF90F8511080F8511090F8E910002908BF90F8D8 -:20A74000521080F852100020FFF7A7F885F86360A5F8D060A06890F8861039B1B0F88210B1 -:20A76000B0F88420914224BF05B0F0BD90F88A1039B1B0F88810B0F88420914224BF05B072 -:20A78000F0BDB0F88020B0F87E108A4224BF05B0F0BD90F867208AB3B0F87C208A4224BF3E -:20A7A00005B0F0BD90F8C370FF2F00F02A816846FAF774FE002808BFFFDF009805F03FFA0F -:20A7C0000321009805F052FA0098017821F010010170394605F0C7FA192F80F0E780DFE8BD -:20A7E00007F02A22144EE5E5E61B7CE5E6E66CE5E5E5E5D8E6E6869FB8E5C500B0F87C105D -:20A80000062924BF05B0F0BDCCE7A06890F8ED10009805F02FFBCAE0A06890F8C410009827 -:20A8200005F078FBC3E0A068D0F8F400411C009805F011FBBBE0A068D0F8F0008179009866 -:20A8400005F0DDFAA068D0F8F0000189009805F0CFFAA068D0F8F0004189009805F0B3FAC8 -:20A86000A068D0F8F0008189009805F0B3FAA068D0F8F000C189009805F0B3FA97E0A06811 -:20A88000D0F8F000011D009805F0F8FAA068D0F8F00000F10C01009805F0FAFAA068D0F854 -:20A8A000F00000F11E01009805F0F8FAA06800F1B801009805F000FB79E0606901780098AC -:20A8C00005F012FB60698188009805F00FFB60694188009805F00EFB69E0FE49D1E900019A -:20A8E000CDE9020102A9009805F018FB5FE0A068B0F84410009805F01BFBA068B0F8461068 -:20A90000009805F019FBA068B0F84010009805F017FBA068B0F84210009805F015FB46E032 -:20A92000A068B0F84010009805F00AFBA068B0F84210009805F008FBA068B0F84410009857 -:20A9400005F0F6FAA068B0F84610009805F0F4FA2DE0A06890F80811009805F01CFBA0682F -:20A9600090F80911009805F01AFB20E0A06890F8E80004F087FF0146009805F028FBA068A2 -:20A9800090F8E90004F07EFF0146009805F023FB0DE0A06890F8E510009805F040FBA068A1 -:20A9A00090F8E410009805F03EFB00E0FFDFFAF788FD002808BFFFDF009F384605F001FA47 -:20A9C000012809D0384605F0FCF960B1384605F0F8F918280FD014E0A068B0F8FA1038464D -:20A9E00005F041FA0DE0A068D0F8F0008188384605F009FA05E0A068B0F8EA10384605F0F9 -:20AA0000EEFAB5480090B54BB54A2946304603F081F9A0680023052190F86320583004F098 -:20AA2000C0FD002804BF05B0F0BD05B0BDE8F04002F041BFAB48806890F8861029B1B0F815 -:20AA40008210B0F8842091421AD290F88A1029B1B0F88810B0F88420914211D2B0F88020D3 -:20AA6000B0F87E108A420BD290F86720B0F87C0022B1884204D200BF03F0ECB90628FBD3FE -:20AA8000002001460CE470B50C46064615464FF4A071204607F0C9F82680002D08BFFFDF57 -:20AAA0002868C4F8F0006868C4F8F400A868C4F83C0170BDF6F7B3B82DE9F0410D46074665 -:20AAC0000621F5F7CBFF040008BFBDE8F081D4F83C110026087858B14A8821888A4207D1D1 -:20AAE000082810D00D281FD00C2835D0072850D094F8120100285ED06E700F20287084F884 -:20AB000012616F8042E06E7008202870D4F83C014168C5F802108168C5F8061080896881E4 -:20AB2000D4F83C01067031E00846F6F7A1F80746F5F716FDB8B96E700D202870D4F83C0148 -:20AB40004068C5F80200D4F83C0106703846F5F701FD0120BDE8F0810846F6F789F8074667 -:20AB6000F5F7FEFC10B10020BDE8F0816E700C202870D4F83C014168C5F802100089E880E4 -:20AB8000D4F83C0106703846F5F7E4FC0120BDE8F0816E7007202870D4F83C01416882687C -:20ABA000C068C5F80210C5F80620C5F80A00D4F83C010670EAE794F81401C8B16E70142078 -:20ABC000287094F814010028E0D000BF84F81461D4F81601C5F80200D4F81A01C5F8060068 -:20ABE000B4F81E01688194F814010028EED1CDE794F8200180B16E701A20287084F82061DA -:20AC0000D4F82201C5F80200D4F82601C5F80600B4F82A016881B9E794F82C0148B16E70E0 -:20AC20001B20287084F82C61D4F82E01C5F80200ACE794F80C0190B16E701820287094F8D7 -:20AC40000C010028A2D000BF84F80C61D4F80E01C5F8020094F80C010028F5D196E794F87B -:20AC60003201002808BFBDE8F0816E701520287094F83201002889D084F83261D4F83401A1 -:20AC8000C5F80200B4F83801E88094F832010028F2D17BE7134A5061D17070472DE9F04749 -:20ACA0000446481E85B238BFBDE8F08704F108080126DFF830904FF0080A0027B4F8D000E3 -:20ACC000401CA4F8D000B4F87C00401CA4F87C000AE000005C230200A1A201002FA501008C -:20ACE0005BA501000401002094F8690040B994F863200023062104F1580004F052FCD8B1CF -:20AD0000B4F87400401C80B2A4F87400B4F8761081422CBF0A1A0022A3885B1D934228BFF0 -:20AD200084F87A60884207D3A4F8747084F8126199F80300F0F7DEFF94F8860020B1B4F8C3 -:20AD40008200401CA4F8820094F88A0020B1B4F88800401CA4F8880094F8EC0040B994F85F -:20AD600066200023012104F1580004F01AFC20B1B4F88000401CA4F8800094F863000C2819 -:20AD800002D00D2820D067E0B4F85800411CB4F8FA00814260D1D4F8F400411C404607F0E0 -:20ADA00050F80221204604F034F9D4F8F4000078002808BFFFDF0121FF20FEF7E8FD84F805 -:20ADC000637084F8966047E0B4F85800411CD4F8F000808881423FD1D4F83C010178002964 -:20ADE00018BFFFDF22D12188C180D4F8F0004189D4F83C010181D4F8F0008189D4F83C01E1 -:20AE00004181D4F8F000C189D4F83C018181D4F83C010771D4F83C0180F800A0D4F83C01B4 -:20AE20002188418099F80300F0F764FF0121204604F0EFF803212046FDF7ECF9D9F808002B -:20AE4000D0F8F0000078022818BFFFDF0221FF20FEF79DFD84F86370B4F85800401C691EDC -:20AE6000A4F858008DB2BFF429AFBDE8F087FE4AC2E90601704770B50446B0F87C0094F828 -:20AE80006710002908BFC0F1020503D0B4F87E10081A051F94F87A0040B194F86320002317 -:20AEA000092104F1580004F07CFBA0B1B4F8746094F8690058B994F863200023062104F18B -:20AEC000580004F06EFB002808BF284603D0B4F87600801B001F8542C8BF0546002DD4BF58 -:20AEE0000020A8B270BDF0B5DF4C83B0A06890F8C310FF2907BF6178002903B0F0BD90F86D -:20AF0000662000230121583004F04BFB00281CBF03B0F0BDA06890F8EC1029B103B0022006 -:20AF2000BDE8F040FEF79ABC90F8632000231946583004F036FB48B1A06890F87A0028B1DB -:20AF400003B01220BDE8F040FEF788BCA068002590F86320122A23D004DC032A47D0112A38 -:20AF600024D003E0182A3CD0242A4CD000230421583004F016FB00281CBF03B0F0BDD4F83E -:20AF800008C0022701269CF864001A2800F01E8141DC012873D002287FD0032863D03EE052 -:20AFA00003B00B20BDE8F040FEF758BCF8F7D5FD0C283CBF03B0F0BDA0680821D0F8F0009C -:20AFC0001E30F8F7CBFD28B1A0680421B830F8F7C5FD00B9FFDF03B00320BDE8F040FEF796 -:20AFE0003DBC03B00620BDE8F040FEF737BC90F8C21080F8C4100720FEF730FCA06880F854 -:20B00000635003B0F0BD1820FEF728FCA068A0F8825003B0F0BD1F2847D022287ED0DCF830 -:20B02000F0000178002900F010814088BCF80010884274D100239CF8632019460CF1580074 -:20B0400004F0AFFA00286AD0A068D0F8F0100978022972D0032971D0042970D0052908BF64 -:20B0600008206DD0F1E09CF8C1008CF8C4000720FEF7F4FBA06800F0B0B900E00DE00C2098 -:20B08000FEF7ECFBA068A0F8885090F88E1041F0010180F88E1000F0A0B91320FEF7DEFBA3 -:20B0A000A068A0F8885000F098B99CF8FD0000281CBF03B0F0BD9CF8FC0088B1BCF8FE0068 -:20B0C000ACF84000BCF80001ACF84200BCF80201ACF84400BCF80401ACF846008CF8FC50DF -:20B0E000FEF712FC0421A068FDF794F8A06890F84E10012908BF80F84E7016D00288A0F883 -:20B100001621028EA0F81821828EA0F81A21428E00F58671A0F81C21C08E01E011E094E08F -:20B1200048820E72E078F0F7E5FD1520FEF796FBA068A0F8885000F050B94CE051E071E0CA -:20B1400058E09CF87B0058B18CF8E8508CF8E9501820FEF783FBA068A0F8885003B0F0BDA3 -:20B160009CF8070100281CBF03B0F0BD9CF80601002804BF03B0F0BDBCF84F10DCF80801FA -:20B18000ADF80410BCF85110ADF80010019904F07EFB9DF80020C1B28A4207BFA16881F8E9 -:20B1A000E850A26882F8E8109DF80110C0F30720814219BFA16881F8E900A06880F8E9509C -:20B1C000182003B0BDE8F040FEF748BB1120FEF745FBA06801E190F8640004F0D5F9A0BB5E -:20B1E00008E090F8681041B190F86900002808BFFFDF0A20FEF732FB27E0F8F7AEFC0C2897 -:20B2000023D3A0680821D0F8F0001E30F8F7A6FC28B1A0680421B830F8F7A0FC00B9FFDF60 -:20B220000320E7E790F88E0010F0030F0DD10C20FEF714FBA068A0F8825080F8866090F88F -:20B240008E1041F0010180F88E10A06890F8C310FF291CBF03B0F0BD90F8632000231946B4 -:20B26000583004F09EF901E004010020002804BF03B0F0BDA06890F8F810E9B3A1690978AB -:20B28000D1BB90F8640004F07FF9A8BBA068B0F858100A2935D900F108010522E06906F0AE -:20B2A000FFFB0028A06802BF80F8F85003B0F0BDD0F8F400017869B1411C0522E06906F071 -:20B2C000EFFB00281CBF03B0F0BDA068D0F8F400007830B9A068E169D0F8F400401C06F09C -:20B2E000B0FDA068D0F8F4000178491C01700120FEF7B4FAA06800E003E080F8F85003B08C -:20B30000F0BDA06890F8FC1011B190F8FD1011B390F80611002904BF03B0F0BD90F807113E -:20B3200000291CBF03B0F0BD90F8640004F02CF900281CBF03B0F0BDA06890F8512090F8B8 -:20B340000811012A4DD0022A4ED0042A14BF082A04294BD05DE0B0F8FE10A0F84010B0F844 -:20B360000011A0F84210B0F80211A0F84410B0F80411A0F8461080F8FC5090F864001E288A -:20B3800005D003B01420BDE8F040FEF767BAFEF7BBFA0421A068FCF73DFFA06890F84E1012 -:20B3A000012908BF80F84E7013D00288A0F81621028EA0F81821828EA0F81A21428E00F521 -:20B3C0008671A0F81C21C08E48820E72E078F0F791FC1520FEF742FAA06880F8645003B0F0 -:20B3E000F0BD012915D101E0022912D190F8521090F80901012907D0022908D0042914BF21 -:20B40000082904280BD004E0012802D107E0022805D003B01620BDE8F040FEF71FBA03B0EF -:20B420000020BDE8F040FEF738BA70B5044690F8630000250C2814D00D2818BF70BDB4F8B4 -:20B440005800D4F8F010401C8988884218BF70BDD4F83C01FE4E0178002918BFFFDF45D1CB -:20B4600022E0B4F85800B4F8FA10401C884218BF70BDD4F8F400411C04F1080006F0E1FCF9 -:20B480000221204603F0C5FDD4F8F4000078002808BFFFDF0121FF20FEF779FA84F8635091 -:20B4A000012084F8960070BD2188C180D4F8F000D4F83C1140890881D4F8F000D4F83C1146 -:20B4C00080894881D4F8F000D4F83C11C0898881D4F83C010571D4F83C1108200870D4F86F -:20B4E0003C1120884880F078F0F704FC0121204603F08FFD03212046FCF78CFEB068D0F852 -:20B50000F0000078022818BFFFDF0221FF20FEF73EFA84F8635070BD70B5CD4CA16891F849 -:20B520006320162A11BF132A91F88C20002A62781BBF02206070002A70BD81F8C000002581 -:20B5400081F88B5081F88650D1F8F00009884088884218BFFFDFA068D0F8F0000078032854 -:20B5600018BFFFDF0321FF20FEF711FAA068D0F83C110A78002A18BFFFDF19D10288CA8097 -:20B58000D0F83C2190F8C0101171D0F83C110D72D0F83C210C211170D0F83C2101885180C6 -:20B5A0000088F5F765FBF4F7C5FFE078F0F7A2FBA06880F8635070BD10B5A54C207910F07D -:20B5C000020F08BF10BD6078002818BF10BDE068C078192880F06981DFE800F05F4F0D8F06 -:20B5E000F8F8A6223FF86F83B1F8F8F8F8F7E3E0F9F5F4F8F300A0680023012190F86620F7 -:20B60000583003F0CEFF002818BF10BD0821A06880F86610002180F8861080F88A1010BDE9 -:20B62000A0680023194690F86420583003F0B9FF18B1A168002081F88A00A06800231946C2 -:20B6400090F86320583003F0ACFF002808BF10BD0020A16881F8860010BDA068002319467E -:20B6600090F86320583003F09CFF002808BFFFDF0420A16881F8630010BDA068002319467C -:20B6800090F86320583003F08CFF002808BFFFDF0C20A16881F8630010BDA0680023194664 -:20B6A00090F86320583003F07CFF002808BFFFDF0D20A16881F8630010BDA0680023194653 -:20B6C00090F86320583003F06CFF002808BFFFDF0121A06880F88B105FF00F0180F8631025 -:20B6E00010BDA06890F86300122818BFFFDF0121A06880F88C101121F0E7A06800231946CA -:20B7000090F86320583003F04CFF28B9A06890F88C00002808BFFFDF0121A06880F88B1051 -:20B72000132180F8631010BDA06890F86300182818BFFFDF1B20A16881F8630010BDA06840 -:20B74000D0F8F01003884A889A4204BF0978042919D190F8632000231946583003F021FF65 -:20B76000002808BFFFDFA06890F88E1011F0020F04BF012180F8631005D0002180F88610E8 -:20B78000D0F8F0000170A0680023194690F86420583003F006FF002808BF10BD0020A16885 -:20B7A00080E0A0680023194690F86320583003F0F8FE002808BFFFDF0520A16881F863004C -:20B7C00010BD30E01FE012E001E067E06DE0A0680023194690F86320583003F0E2FE00280E -:20B7E00008BFFFDF1D20A16881F86300E8E7A0680023194690F86420583003F0D2FE0028AA -:20B8000008BFFFDFCAE7A0680023194690F86320583003F0C6FE002808BFFFDF2020A168E8 -:20B8200081F86300CCE7A06890F8641022291DD090F86310242918BFFFDFC1D190F8E8102E -:20B84000002906BF90F8E9100029252102E000000401002018BF80F863107FF4F9AE002106 -:20B8600080F863100846FEF718F8F1E690F8E810002907BF90F8E9100029252180F8641068 -:20B880008CD1002180F8641080F87B1090F8060100281CBF0020FEF700F87FE7A16800200D -:20B8A00081F8640081F88A008AE7FFDF88E7000070B5FC4CE1680A88A1F8E62181F8E401A4 -:20B8C00091F85100012808BF012508D0022808BF022504D0042816BF08280325FFDFE06835 -:20B8E00080F8E85190F85200012808BF012508D0022808BF022504D0042816BF082803258A -:20B90000FFDFE068012180F8E95180F8E211002180F89211E078BDE87040F0F7EBB9F0B4AA -:20B92000E048C06890F84E30478EC68E458FB0F84010C28FB0F842C0022B1FD08D4238BFDF -:20B9400029460186624528BF62468286018FB0F84430994238BF0B464386818FB0F84640DD -:20B96000A14238BF0C46C486BB4228BF1F464786B44228BF2646C686F0BC7047038E9D42D3 -:20B9800028BF1D46838E9A4228BF1A46A94298BF0D460586944598BF62468286002180F890 -:20B9A0004E10D3E72DE9F04FBE4C83B0207910F0010F04BF03B0BDE8F08F60690123052187 -:20B9C000C578E06890F86420583003F0EAFD002818BF022D0BD00A2D18BF0B2D07D0032D1E -:20B9E00018BF062D03D0607840F008006070607800281CBF03B0BDE8F08F606902270126BF -:20BA000090F8038000254FF02009B8F1000F1CBFB8F1010FB8F1160F1FD1E06890F8630051 -:20BA200003F0B2FDC8B1E16891F86300202814D0212808D0B8F1160F0CBF84F801906770EC -:20BA400003B0BDE8F08F262081F86300B8F1160F00F0AE822A20FFF72BFFB8F1190F80F054 -:20BA6000E282DFE808F046230DC1FEFEFDFCFBFE91B8FAFEFEFEFEF9F8F7F6F5F4FEF3008B -:20BA8000E0680123194690F86620583003F089FD002840F04D84606904F0EEF9E16881F83D -:20BAA0006801072081F8660000F042BCE0680123002190F86420583003F073FD002800F08D -:20BAC000F083606904F0D3F9E168A1F87C01B1F85820801A00B247F6FE728242A8BF00289E -:20BAE0004BDD01F5BF71606904F0B8F90B20E1683FE0E0680123002190F86420583003F0E3 -:20BB000050FD002800F0CD83606904F083F9002800F08982606904F07AF9E168A1F87C0185 -:20BB2000B1F85820801A00B247F6FE728242A8BF002822DD606904F064F9E16881F87E013E -:20BB4000606904F059F9E168A1F88001606904F03EF9E168A1F88201606904F03FF9E168DC -:20BB6000A1F88401606904F040F9E168A1F886010D2081F8640000F0DBBB282081F8730084 -:20BB800081F8726000F0D4BBE0680123002190F86420583003F005FD0028E0680CD0A0F8E1 -:20BBA000885090F88A10491C80F88A105FF0100180F8641000F0BCBB90F86420012305210B -:20BBC000583003F0EEFC00281CBF0820607040F0AF8300F066BBE06890F86410112908BF4D -:20BBE000122140F09282E3E7E0680123002190F86420583003F0D5FC80B9E06890F8642092 -:20BC0000122A0BD001230521583003F0CAFC002818BF082000F0458300F0C7B9E06890F863 -:20BC20008C1031B9A0F8885090F88A10491C80F88A1000F1E001606904F037F9E06800F17D -:20BC4000B801606904F03CF9E0680BE01BE2AFE159E1F1E0CFE0DBE0EAE23AE0A2E0FFE2BB -:20BC600022E072E190F8AA01002818BFFFDFE0680188A0F8AC1100F5D771606904F003F943 -:20BC8000E06800F5DB71606904F005F9E06880F8AA61142180F86410E078F0F72BF800F022 -:20BCA00047BB000024010020E06890F86410172940F02B8290F88A10491E49B280F88A1046 -:20BCC0000029B8BFFFDF1C20E16881F8640000F02FBBE06890F8651011F0020F09D090F8F2 -:20BCE000632001230821583003F05BFC002800F0D882E06890F88E0010F0020F17D1606910 -:20BD000004F0FCF8E16881F88F00606904F0F8F8E168A1F89000606904F0F5F8E168A1F83F -:20BD2000920091F88E0040F0020081F88E00E06890F88E1011F0010F05D0E06890F863108A -:20BD400006291CD114E090F8650010F0020F18BFFFDFE06890F8651041F0020180F86510BA -:20BD6000A0F8885090F88A10491C80F88A10E4E780F8635080F88650E078EFF7BBFFE06836 -:20BD800090F87A11042940F0D38280F87A51E078EFF7B0FFE06890F86310002940F0C882C8 -:20BDA00000F043BAE06890F8650010F0010F7BD16946606904F0B7F8E0689DF8002090F865 -:20BDC0009410114001F02F0180F8941090F895109DF80120114001F0410180F89510A0F815 -:20BDE000885090F88A10491C80F88A1090F8651041F001011CE0E0680123092190F8632005 -:20BE0000583003F0CEFB002800F04B8200F041BAE06890F8651011F0040F40F04282A0F829 -:20BE2000885090F88A2041F00401521C80F88A2080F8651000F07CBAE06890F8650010F0EA -:20BE4000300F31D1606904F08BF800287DD0606904F082F8E1680887606904F079F8E16866 -:20BE60004887606904F07AF8E1688887606904F071F8E168C887207910F0020F03D02069A8 -:20BE8000C078142811D091F863001D280DD091F84E0001280BD091F88901002804BF91F8DD -:20BEA000880100280AD002E074E081F84E6091F8650040F0100081F865001AE091F86500A6 -:20BEC00040F0200081F865000A88A1F8CA210A8FA1F8CC214A8FA1F8CE218A8F01F5CB7054 -:20BEE000A1F8D021C98F818780F83260E078EFF701FFE068A0F8885090F88A10491C80F859 -:20BF00008A1000F015BAE06801230A2190F86320583003F046FBE8B3606904F021F8B8B190 -:20BF2000606904F019F8E1680887606904F010F8E1684887606904F011F8E1688887606997 -:20BF400004F008F8E168C88700E06CE0FFF7E7FCE068052180F8865080F86350FDF7FBFA80 -:20BF6000E06890F84E10012908BF80F84E7000F0DF810288A0F8BE21028EA0F8C021828E02 -:20BF8000A0F8C221428E00F5CB71A0F8C421C08E088600E006E081F82660E078EFF7AAFE21 -:20BFA00000F0C6B9607840F00100607000F0C0B9E06801230B2190F86420583003F0F1FAC6 -:20BFC00020B100BF84F8019000F0B2B9E0680123002190F86420583003F0E3FA002800F060 -:20BFE0006081E06890F863002528EBD0606903F0DAFFC0B1606903F0D4FFE16800F0070050 -:20C0000081F85000606903F0C8FF00F00701E06880F84F1090F89321002A04BF90F8922159 -:20C02000002A04D022E001F0DEF900F081B990F852C090F8503000F151028C4502BF11780D -:20C04000994280F87B6011D000F5CB7180F8DC610288A0F8DE2190F84F2080F8E02190F8D2 -:20C06000500081F84B00E078EFF744FEE068222180F86410A0F8885090F88A10491C80F846 -:20C080008A1000F055B9E06890F8631021290CBF4FF001084FF0000890F86410232908BF12 -:20C0A00000F1640705D0B8F1000F18BF00F163072BD0606903F099FFF0B3D4F81490484675 -:20C0C00003F087FF0090484603F087FF8146E06890F89211002907BF4FF0000BDA4690F835 -:20C0E00094B190F895A1484603F05AFBB0B1E26892F85110814211D019EA0B0F41D0B8F156 -:20C10000000F08BF012802D008E0677010E1022904BF92F8500010EA090F32D0009803F037 -:20C120003FFB68B1009803F03BFBE16891F85210884205D0009800E023E010EA0A0F20D09A -:20C140006A466169E06803F03AFBD8B3606903F04AFFE168A1F87C01B1F85820801A00B299 -:20C1600047F6FE728242A8BF00284ADD9DF8000081F87E019DF8010081F87F01252038708F -:20C1800044E0E06890F8920100281CBF1E20FFF78FFBB8F1000F16D0606903F012FEE168A4 -:20C1A00081F8C20006FA00F010F0807F08BFFFDF0A21E06880F8631090F88600002808BF55 -:20C1C000FFDF0DE010E03D70E16891F88A00401E40B281F88A000028B8BFFFDF01F003F9DE -:20C1E000E06880F87B50A3E0E06890F8920100281CBF0020FFF75CFB3D70E06880F87B5026 -:20C2000004E0282081F8730081F87260E06800F164018F4209D190F88A10491E49B280F876 -:20C220008A100029B8BFFFDF82E080F886507FE0606903F0F6FE16287AD1E06890F863006B -:20C24000212802D0262805D072E0606903F0EDFEFFF72EFBE06880F8635080F8865067E080 -:20C26000E06890F863000E2804D1606903F054FE122805D0E06890F863001D2818D112E010 -:20C28000E0680123092190F86320583003F089F938B1E06880F87A5080F8865080F8635014 -:20C2A00046E0667044E0606903F036FE142805D0E06890F8630021282BD125E0E068052172 -:20C2C00080F8635080F88650FDF745F9E16891F84E00012808BF81F84E7029D00A88A1F848 -:20C2E000BE210A8EA1F8C0218A8EA1F8C2214A8E01F5CB70A1F8C421C98E018680F8266056 -:20C30000E078EFF7F7FC13E0606903F005FE162805D0606903F000FE172809D113E0E06819 -:20C3200080F8635080F886505FF01A00FFF7C0FAE068D0E928134A1C43F10001C0E92821A2 -:20C3400003B0BDE8F08FE06890F864102329EFD180F8645090F88A10491E49B280F88A10F4 -:20C360000029B8BFFFDFE06880F87B5090F89201002818BF0020DBD0D8E770B5F84E05465A -:20C380000C46F06890F8C300FF2818BFFFDFF2680020002C82F8C3501CBFA2F8880070BD6F -:20C3A000A2F88200012082F8860070BD10B584B004466846F9F772F8002808BFFFDF009863 -:20C3C00003F03DFC0321009803F050FC0098017821F010010170214603F0C5FCA01E16287B -:20C3E00073D2DFE800F00BAA4EABAB13AA5CAAAB1B2CAAAAAAAAABAB31734B8DD848C06871 -:20C4000090F8C410009803F035FD97E0D448C06890F8C410009803F07DFD8FE0D04CA06854 -:20C420000178009803F060FDA0688188009803F05DFDA0684188009803F05CFD7EE006216B -:20C44000009803F063FD79E0C54CE068B0F84410009803F06DFDE068B0F84610009803F07D -:20C460006BFDE068B0F84010009803F069FDE068B0F84210009803F067FD5FE0B84CE06867 -:20C4800043E0B74CE06800F1E801009803F01CFDE06800F1BC01009803F020FD4EE00020C4 -:20C4A00002900390AE48C06890F8941001F0F5018DF8081090F8950002A900F041008DF80B -:20C4C0000900009803F05DFD38E036E0A44CE068B0F84010009803F033FDE068B0F8421013 -:20C4E000009803F031FDE068B0F84410009803F01FFDE068B0F84610009803F01DFD1DE0B0 -:20C50000974CE06890F8921159B190F89411009803F041FDE06890F89511009803F03FFD88 -:20C520000CE090F85110009803F035FDE06890F85210009803F033FD00E0FFDFF8F7C1FF0F -:20C54000002808BFFFDF04B010BD70B50C4605464FF4F871204605F068FB258070BDF4F7A4 -:20C560005EBB2DE9F0410D4607460721F4F776FA040008BFBDE8F08194F896010026C8B195 -:20C580006E700820287094F8960188B1268484F89661D4F89801C5F80200D4F89C01C5F83A -:20C5A0000600B4F8A001688194F896010028EDD1AE7044E094F8A201002837D094F8A20167 -:20C5C0000C2818D00D2818BFFFDF38D12088F4F74FFB0746F3F7C4FFA0B96E700D20287079 -:20C5E00094F8A401A8702088A88084F8A2613846F3F7B0FF23E02088F4F73AFB0746F3F78A -:20C60000AFFF10B10020BDE8F0816E700C20287094F8A401A8702088A88094F8A801A8716C -:20C6200084F8A2613846F3F795FF08E094F8DA0140B16E700F20287084F8DA616F800120D3 -:20C64000BDE8F08194F8AA0180B16E700920287020886880D4F8AE01D4F8B2116860A96052 -:20C66000B4F8B601A88184F8AA61E8E794F8B80140B16E7017202870B4F8BA01688084F82A -:20C68000B861DCE794F8D40188B16E701820287094F8D4010028D2D084F8D461D4F8D601F7 -:20C6A000C5F8020094F8D4010028F5D1C7E794F8BC01C8B16E701420287094F8BC010028E1 -:20C6C000BDD000BF84F8BC61D4F8BE01C5F80200D4F8C201C5F80600B4F8C601688194F8F1 -:20C6E000BC010028EED1AAE794F8C80180B16E701A20287084F8C861D4F8CA01C5F80200D4 -:20C70000D4F8CE01C5F80600B4F8D201688196E794F8DC0140B11B20287084F8DC61D4F824 -:20C72000DE01C5F802008AE794F8E201002808BFBDE8F0816E701520287094F8E201002834 -:20C740003FF47DAF84F8E261D4F8E401C5F80200B4F8E801E88094F8E2010028F2D16EE79F -:20C7600024010020FA4A9060D1707047002180F8631080F8641080F8671090F8D61011B131 -:20C780000221FCF7E8BE0321FCF7E5BE2DE9F047EF4C81460D46E0680088F4F77BFA06004B -:20C7A00008BFFFDF60782843607020794FF0000510F0200FE0681CBFA0F87C5080F8DC508A -:20C7C00004D1B0F87C10491CA0F87C10E068012790F8691039B990F8642001230621583085 -:20C7E00002F0DFFE48B3A08810F4006F07D0E06890F86910002918BFA0F874501DD1E06822 -:20C80000B0F87410491C89B2A0F87410B0F876308B422CBF5A1A0022B4F806C00CF1050C14 -:20C82000624598BF80F87A70994206D3A0F8745080F8DA71E078EFF75DFA20794FF0020A4C -:20C8400010F0600F11D0E06890F8671011B1032906D00AE080F867700121FCF77CFE04E0D1 -:20C8600080F867A00121FCF776FEE06890F86710012905D1A18811F4807F18BF80F867A0E6 -:20C880004FF00808B9F1000F40F03281A18811F4007F18BFA0F8F05004D1B0F8F020521C56 -:20C8A000A0F8F02011F0080F47D06178002944D190F8C300FF2808BFFFDFFF21E06880F893 -:20C8C000C31090F86410192905D0E06890F8631020290FD028E080F88B5090F88A10491E23 -:20C8E00049B280F88A100029B8BFFFDFE06880F86450EAE790F8640002F046FE80B1E068CD -:20C900002621012380F8631090F864200B21583002F047FE002804BF2A20FEF7C9FF03E0F5 -:20C92000E168212081F86300E06890F86610082904BF84F800A080F86650FFF733F8207953 -:20C9400010F0040F09D0607838B9E06890F86610072904BF277080F8665000F0C5FB2079DB -:20C9600010F0100F09D0607838B9E06890F864100B2904BF0C2180F86410A07810F0080F73 -:20C9800011D0E0680123052190F86420583002F008FE28B184F80180E06880F8A25102E02D -:20C9A000002001F07CFA00F03CFD01F06EFA0028E06818BFA0F8D05004D1B0F8D010491CAD -:20C9C000A0F8D01001F064FA40B1E16891F8DC0002289CBF401C81F8DC0004D8E06890F80F -:20C9E000DC00022806D9E068A0F8D050A0F8D25080F8DC50E0680123002190F864205830D3 -:20CA000002F0CFFD20B9E06890F864000C2859D1E0680123002190F86320583002F0C1FD1D -:20CA200000284FD0E0680123002190F86620583002F0B7FDF0B3E06890F86710022904BF0E -:20CA400090F8DC0000283DD13046F3F70FFB88B3E06890F8C310FF2934D1B0F8CA1001291B -:20CA600030D980F8D570B0F87E10B0F87C208B1E9A42AFBF0121891A491E89B2B0F8D03074 -:20CA8000E28893422FBF0122D21A521C92B2914288BF1146012908BF80F8D55090F861219F -:20CAA000A2B1B0F8D220B0F8620182422CBF0120801A00E006E03CBF401C80B2814288BFBB -:20CAC000014603E0E068012180F8D550E068B0F85820114489B2A0F8CC1090F86730002B6F -:20CAE00018BF012B5FD0022B1CBF032BFFDF09D0A088C0F340200028E06818BFA0F8DE50CF -:20CB00005BD153E090F86630082B23D0B0F87C10B0F87E2000268B1C9A4206D3511A891E64 -:20CB20000E04360C1CBF711E8EB290F87A1051B190F8632001230921583002F032FD0028B9 -:20CB400008BF00262BD0E06890F8691099B90AE024010020B0F87C30032B24D3B0F87E1074 -:20CB60001144491C1FE090F8642001230621583002F017FD78B1E1680020B1F87620B1F89D -:20CB800074108B1C9A4203D3501A801E18BF401EB04238BF86B2002E1CBF701E86B2E06843 -:20CBA000B0F8CC103144A0F8C810A1E7B0F8DE10B0F8CE201144A0F8DE10E06890F8661136 -:20CBC00039B990F8662001231946583002F0E9FC38B1E068B0F88010B0F8CE201144A0F887 -:20CBE0008010E06890F8863033B1B0F88210B0F8CE201144A0F8821090F98AC0BCF1000F5D -:20CC000006DDB0F88810B0F8CE201144A0F888103D22B9F1000F18BF80F873204DD1217825 -:20CC2000022910D0012908BF90F8681143D0617839B380F8727011F0140F18BF1E210CD0AF -:20CC400080F8731055E090F8C410062905BF90F8C3100229162106212DE011F0080F18BF75 -:20CC600080F8732045D111F0200F18BF2321E7D111F0030F08BFFFDF2A20E16881F8730059 -:20CC800033E02BB1B0F88210B0F88420914211D2BCF1000F05DDB0F88810B0F8842091426C -:20CCA00008D2B0F88020B0F87E108A4208D390F866212AB1222180F8731080F8727018E0FB -:20CCC00090F867203AB1B0F87C208A4228BF80F87380F2D209E0B0F87C10062905D33E21B1 -:20CCE00080F8731080F8727003E0E06890F8721079B1E06880F8635080F8645080F86750B2 -:20CD000090F8D610002914BF02210321FCF723FC02E00021FCF71FFCE06880F8D650BDE8B4 -:20CD2000F047F8F7F0BBF949024648788B7818430ED10846C0684AB1097911F0080F03D0BD -:20CD400090F86600082803D001207047FCF74FBB002070472DE9F041EC4C05460E46A088F0 -:20CD60002843A08015F0020F04D015F0010F18BFFFDF266115F0010F4FF000084FF001074A -:20CD80001CD03046666103F01CF8062802D00B280BD013E0E06890F8641017290ED10021DE -:20CDA000C0E9261180F8687008E0E06890F86410112904BF80F8688080F88C7015F0020F30 -:20CDC00018D02069C078052802D00B280BD011E0E06890F8641015290CD10021C0E928114A -:20CDE00080F8697006E0E06890F86410102908BF80F8698015F0800F1CBF0820A070BDE80B -:20CE0000F0812DE9F84FC14C00254FF00108A5806570A5702570E06068F30709074680F8B6 -:20CE2000D6800088F3F736FF5FEA000A08BFFFDFE0680088F8F72FFBE0680088F8F751FB09 -:20CE4000E068B0F8CA1071B190F8C310FF290FD190F8661191B190F8662001231946583029 -:20CE600002F09FFB98B1E06890F8C300FF2805D0E06890F8C30000BFFFF798FAD4F80CC0DC -:20CE80009CF8D700002818BFE5801ED10FE0E068A0F8805090F8671180F8C41000210220A6 -:20CEA000FFF76BFAE06880F8D5500220E4E79CF8960138B9BCF82000BCF80410884288BF7C -:20CEC000E08002D8BCF80400E080BCF8CE00401E86B2BCF8D0003044ACF8D0009CF8D40014 -:20CEE00000281CBFACF8D2508CF8D45004D1BCF8D2003044ACF8D200BCF87C003044ACF834 -:20CF00007C009CF8690040B99CF86420012306210CF1580002F045FB28B1E068B0F8741068 -:20CF20003144A0F87410E068B0F8CA1001299CBF491CA0F8CA10002E18BF80F8DC5090F809 -:20CF4000D510A1B1B0F8D000E18888420FD25046F3F78CF858B1E06890F8611139B1B0F82D -:20CF6000D210B0F86201814228BF00F094FFE26882F8D55092F864000B2818BF0C2817D19A -:20CF8000B2F85810B2F87C31C91A09B200290FDB02F5BF7102F1080004F053FF0221E068A4 -:20CFA00001F0FEFEE06880F8645080F8968048E0252824D1B2F85800B2F87C11401A00B2D3 -:20CFC00000281CDB92F8921192F87E01002808BF92F8510082F8510092F87F01002808BF6E -:20CFE00092F8520082F8520000291CBF0020FEF75FFCE06880F8645080F87B5021E092F8D3 -:20D00000630025281DD1B2F85800B2F87C11401A00B2002815DB92F87E01002808BF92F893 -:20D02000510082F8510092F87F01002808BF92F8520082F852000020FEF73AFCE06880F828 -:20D040006350E16801F15800B1F8CE2002F0B3F8E06890F86111002918BFA0F8D2502C48E6 -:20D0600000902C4B2C4A3946484600F053FEE0680123052190F86420583002F092FA002819 -:20D0800008BFBDE8F88FBDE8F84F00F014BC00F0E1BE10B50446B0F882214388B0F8841100 -:20D0A000B0F886019A4201BFA3889942E38898420FD02388A4F89A31A4F89C21A4F89E11C5 -:20D0C000A4F8A001012084F896011048C078EEF711FE0121204601F063FE002084F8640081 -:20D0E000032084F8670010BD70B5084C207910F0020F08BF70BD6078002818BF70BD2069B9 -:20D10000C178891E162980F06C8107E0240100208DC7010027CD010055CD0100DFE801F042 -:20D120000BF969758B1BF942F95BBE80F9F9F9F9FAF7F6F5F4F3E0680123194690F866201A -:20D14000583002F02EFA002818BF70BD0820E16881F8660070BD02F0DFFEE16891F8632060 -:20D160000A2A04BF91F8C220824205D1002081F8630081F8860070BD91F8650010F0080F86 -:20D1800004BFFFDF70BD20F0080081F8650091F88A00401E40B281F88A000028A8BF70BDA9 -:20D1A00000F0D8B8E06890F8650010F0010F08BFFFDFE16891F88A00401E40B281F88A0056 -:20D1C0000028B8BFFFDFE06890F8651021F0010180F8651070BDE06890F86400102818BF1D -:20D1E000FFDF0121E06880F88B10112180F8641070BDE06890F86400142818BFFFDF012142 -:20D20000E06880F88B101521F0E7E06890F86400152818BFFFDF1720E16881F8640070BDF6 -:20D22000E06890F86400152818BFFFDF1920E16881F8640070BDE06890F864001C2818BFED -:20D24000FFDF0025E06880F88B5090F8A201002818BFFFDFE06890F88C1041B180F88C5076 -:20D260000188A0F8A61180F8A4510D2108E00188A0F8A61180F8A451012180F8A8110C218E -:20D2800080F8A2110088F3F7F3FCF3F753F9E078EEF730FDE06880F8645070BDE06890F8F1 -:20D2A0007A11042915D0E06890F8651011F0020F08BF70BD90F88A10491E49B280F88A10F0 -:20D2C0000029B8BFFFDFE06890F8651021F002017EE790F8632001230021583002F061F9EE -:20D2E000002808BFFFDFE06890F88E1011F0020F07BF062180F86310002180F8861018BF03 -:20D3000080F87A11CFE760E04FE035E024E011E000E066E0E0680123002190F86320583095 -:20D3200002F03FF9002808BFFFDF0E20E16881F8630070BDE06890F8651021F0040180F8A3 -:20D34000651090F88A10491E49B280F88A100029A8BF70BDFFDF70BDE0680123002190F8E5 -:20D360006320583002F01DF9002808BFFFDF1D20E16881F8630070BDE06890F8650000F019 -:20D380003000102818BFFFDFE06890F8651021F0100180F8651090F88A10491E49B280F820 -:20D3A0008A100029A8BF70BDD4E7E0680123002190F86320583002F0F4F8002808BFFFDF90 -:20D3C0002020E16881F8630070BDE06890F8640022281CBF0028FFDF2320E16881F86400F3 -:20D3E00070BDFFDF70BD10B5FE4CE16891F8650010F0080F1EBF0120607010BD40F00800C5 -:20D4000081F86500606902F0DCFCE16881F8C1000020A1F8880091F88A00401C81F88A0065 -:20D4200010BD2DE9F041EF4CE06890F8C310FF2906BF61780029BDE8F08190F866200123C3 -:20D440001946583002F0ADF8002818BFBDE8F081E068002790F8661159B1A0F8807090F8B1 -:20D46000671180F8C410BDE8F04100210220FEF784BF90F8642001230421583002F091F83F -:20D480005FEA00084FF002054FF001060CD0D4F80CC09CF8640010287ED014287DD01528F7 -:20D4A0007CD01C287BD0E1E0E16891F8650010F0010F05D0BDE8F04101210920FEF75DBF82 -:20D4C00010F0020F0CD001210C20FEF756FFE06890F88E1041F0010180F88E10BDE8F081FA -:20D4E00010F0040F05D0BDE8F04101211320FEF744BF10F0080F09D091F8C10081F8C400AA -:20D50000BDE8F04101210720FEF737BF10F0100F02D091F8890120B191F8640022287DD1A7 -:20D520009BE091F8880188B1B1F88A01A1F84000B1F88C01A1F84200B1F88E01A1F84400F2 -:20D54000B1F89001A1F8460081F88871FEF7E7F90521E068FBF7FFFFE06890F84E100129B5 -:20D5600008BF80F84E5014D00288A0F8BE21028EA0F8C021828EA0F8C221428E00F5CB7154 -:20D58000A0F8C421C08E088681F82660E078EEF7B1FB0121152003E006E00BE023E056E006 -:20D5A000BDE8F041FEF7E9BEBDE8F04101210B20FEF7E3BEF6F7D1FA0C2838BFBDE8F08147 -:20D5C0000821E068E830F6F7C9FA28B1E0680421BC30F6F7C3FA00B9FFDFBDE8F0410121A7 -:20D5E0000420FEF7CABE9CF86901012817D0022818BFBDE8F0819CF88C0000281CBF06201C -:20D600008CF8C4004FF0010114BF02200D20FEF7B4FEE06880F86971BDE8F08126E09CF86E -:20D62000A201002818BFBDE8F0810CF1A80300220CF1E0010CF5B57001F03BFF01210520F2 -:20D64000FEF79BFEE06880F86971BDE8F081BDE8F04101210620FEF790BE91F87B00C0B9AE -:20D6600091F8920110B191F8930190B1E0680123002190F86320583001F093FFC8B1E0680B -:20D680000123042190F86420583001F08AFF30B10FE0BDE8F04101211720FEF76EBEE068CB -:20D6A00090F87A0028B1BDE8F04100211220FEF764BEE06890F863200A2A4DD0B8F1000FF3 -:20D6C00018BFBDE8F08101230021583001F069FF48B1E06890F87A11042904BF90F88E00DD -:20D6E00010F0030F42D0E0680123002190F86320583001F056FF002808BFBDE8F081E06853 -:20D7000090F8881111B190F88911E1B390F89211002908BFBDE8F08190F89311002918BF13 -:20D72000BDE8F08190F8642001230B21583001F038FF002818BFBDE8F081E06890F8512071 -:20D7400090F89411012A71D0022A73D0042A14BF082A042970D082E090F8C21080F8C41019 -:20D76000BDE8F04100210720FEF707BE00210C20FEF703FEE06890F88E1041F0010180F875 -:20D780008E10BDE8F081FFE7B0F88A11A0F84010B0F88C11A0F84210B0F88E11A0F8441062 -:20D7A000B0F89011A0F8461080F8887190F8650010F0200F34D0FEF7B2F80521E068FBF7A2 -:20D7C000CAFEE06890F84E10012908BF80F84E5017D00288A0F8BE21028E00F5CB71A0F80B -:20D7E000C02101E024010020828EA0F8C221428EA0F8C421C08E088681F82660E078EEF732 -:20D8000079FA01211520FEF7B8FDE06890F8651021F0200141F0100180F86510BDE8F081D8 -:20D82000BDE8F04100211420FEF7A7BD012916D102E0FFE7022912D190F8522090F8951155 -:20D84000012A07D0022A08D0042A14BF082A042922D004E0012902D11EE002291CD090F8F2 -:20D86000642001230321583001F09BFE002818BFBDE8F081E0680123022190F86420583092 -:20D8800001F08FFE002818BFBDE8F0810021BDE8F0411620FEF771BDBDE8F0410020FEF7BA -:20D8A00007B8000030B5FF4C05462078002818BFFFDFA57230BDFB49012048727047FA489D -:20D8C00000B502784168406801F1580C91F8633090F85100252B1CBF9CF80CC0BCF1250F11 -:20D8E00017D0202B18BF212B38D0BCF1230F18BF00BD002A08BF00BD91F8942191F8501083 -:20D90000114011F0010F44D0082818BF04284CD04EE08AB191F87E11002908BF00BD0828E4 -:20D9200018BF042841D0082918BF04293DD0012818BF01293CD036E091F8E810002908BFD4 -:20D9400000BD082818BF04282FD0082918BF04292BD0012818BF01292AD024E0BCF1230FA1 -:20D96000C7D0002A08BF00BD91F8941111F0010F04D0082818BF042817D019E011F0020F2A -:20D9800008BF00BD082818BF04280ED001280FD009E011F0020F08BF00BD082818BF042838 -:20D9A00003D0012804D0022000BDFFDF082000BD012000BD2DE9F14FBB4E4FF001083146F9 -:20D9C0006FF00E0A4F686FF00D0B97F85210F88E02290CBF0AEB90000BEBD00085B2788EAD -:20D9E000A84238BF0546AF4C2946606BF2F77AFBDFF8B892E06200281DBF0021A170A062CD -:20DA000084F8028008BFC4F8289030787068014600F1580890F86930428E91F85210C08E8B -:20DA200002290CBF0AEB90000BEBD00080B2824238BF1046002B1CBF001D80B2F6F756FECC -:20DA400098F81100002838D008F15001974891E80E1000F5027A8AE80E10D8F86010C0F83C -:20DA60002112D8F86410C0F8251200F58170F7F7B6F9307800280CBF0120002080F001016F -:20DA80008B480176D8E91212C0E90412C4F828904946A581A0F58372F6F71BFD97F85200FF -:20DAA000012808BF002104D002281ABFFFDF002101210120F6F71BFD04E0A06AF7F78FF9D3 -:20DAC000F6F738FD009848B9012297F8523096211046F7F741F89620F7F7A9F997F82C0022 -:20DAE000012808BFF7F726FA02202070BDE8F88F2DE9F04FDFF8B08183B0414681464E68B6 -:20DB0000A1F11400009096F85D004FF0000A012706F15804A1F1380570B3012873D0022898 -:20DB200075D0032818BFFFDF7FD0686A0822017821F008010170A37902EAC302114321F03F -:20DB400004010170E279042303EA8202114321F01001017094F805B0286BF2F795FA824661 -:20DB6000F7F7E3FCBBF1020F66D0BBF1010F67D0BBF1030F68D06CE0B6F834B0FFF79FFE8B -:20DB8000022819BF6FF00D0000EBDB006FF00E0000EB9B0081B2308E884238BF0146ADF8C0 -:20DBA0000810A6F84C100098F7F79EFC38B1696AEF70AA694FF48060904703201EE001AA3F -:20DBC00002A9286BF2F743F9686210B194F8331021B10098F7F75CFC6771A6E79DF80410CA -:20DBE00031B9A0F800A080F802A0012102F03EF8BDF80810686A02F01AFA0220607194E78C -:20DC000001E004E011E00098F7F742FC8DE7B6F84C00ADF8000001AA6946286BF2F717F991 -:20DC20006862002808BFFFDF7FE70098F7F75CFC002808BFFFDF78E730EA0A0009D106E0F9 -:20DC400030EA0A0005D102E0BAF1000F01D0012100E00021686A027842EA01110170217CA2 -:20DC600000291CBF617901293CD004F150010F4891E80E1000F5027A8AE80E10216EC0F814 -:20DC80002112616EC0F8251200F58170F7F7A7F898F8000000280CBF012100210448017697 -:20DCA00008E000003C01002074010020C00E0020C8100020D4E91012C0E90412A0F583717D -:20DCC0006A6AF6F706FC96F85100012808BF002104D002281ABFFFDF002101210020F6F78C -:20DCE00006FC03E0F7F77BF8F6F724FCB9F1000F06D196F85130012296210020F6F72CFF20 -:20DD0000AF71686A018829828078A8742F7003B0BDE8F08F2DE9F0471E46174681460C462C -:20DD2000FE4DDDF82080287828B9002F1CBF002EB8F1000F00D1FFDFC5F82080C5E90E9456 -:20DD4000C5E9067600206872287268712871A871E871F34EE870E881307804F1580720887B -:20DD6000F2F798FF28632088F2F782FF6863F7F72BF8F6F7DBFC04F11200F7F70EF804F1F6 -:20DD80000E00F6F774FD307800280CBF03200120F7F717F8787EF6F772FDF7F70CF830784F -:20DDA0006FF00E056FF00D09002830D0618EE08E94F852407A7C022C0CBF05EB900009EB76 -:20DDC000D00080B2814238BF0846002A1CBF001D80B22146F6F78AFC3078002831D0706862 -:20DDE00090F86001002818BFF6F7F2FC224600210120F6F76DFE7068D0F8D800F6F7F2FF08 -:20DE00000120FFF7D7FDBDE8F047F6F7E5BF97F81080278EB4F834A0FFF751FD022814BF15 -:20DE200009EBDA0005EB9A0085B2AF4234BF38462846B8F1000F1CBF001D80B294F8514084 -:20DE4000C7E7002122460846F6F742FE0120FFF74FFED8E7B24810B501783838007831B1EB -:20DE6000022818BFFFDFBDE81040F6F7ADBF012818BFFFDFF7E7A94810B50078022818BF8A -:20DE8000FFDFBDE8104000F044BAA44880797047A24840797047A1490120C87170472DE9BA -:20DEA000F04706009E489D4D4FF0010740684FF0000800F15804A86A90F8019018BF012EA1 -:20DEC00003D1696B03F0D0FA68706878A0B1012831D0022849D003281CBFFFDFBDE8F08767 -:20DEE000012E08BFBDE8F087686BF2F70CFBA87ABDE8F047EDF7FEBE012E08D001224946F6 -:20DF0000686BF2F74DF9022E08BFBDE8F087D4E91202411C42F10000C4E91210E07901283A -:20DF200003D100BF84F8078000E0E771A87ABDE8F047EDF7DFBE012E08D000224946686B09 -:20DF4000F2F72EF9022E08BFBDE8F087D4E91201401C41F10001C4E91201E07901280CBF32 -:20DF600084F80780E771BDE8F087012E06D0686BF2F7C9FA022E08BFBDE8F087D4E91201C3 -:20DF8000401C41F10001C4E91201E0790128CCD1C8E72DE9F041624F4FF000083846A7F10F -:20DFA00038044068012600F158052078012818BFFFDFA87850B185F80280E670A26941468A -:20DFC000042090473878002818BF2E71606A0321007831EA000004BFE878002805D1EE70F8 -:20DFE000616AE670A269022090470121002000F0B1F918B1BDE8F04100F08BB9BDE8F04177 -:20E000000020D7E42DE9F84F454C83462046A4F138054068217800F1580A287800264FF09D -:20E020000109022818BFFFDFE88940F40070E8812078676800283A48406890F86800009040 -:20E040003C8EB7F83480FFF73AFC022807BF6FF00E0000EB98006FF00D0000EBD80080B226 -:20E06000844238BF2046009900291CBF001D80B297F85110F6F73AFB9AF81100BBF1000F21 -:20E0800000F0FA80F6F77CFAF6F76AFA90B99AF8110078B1A86A417861B100789AF807104F -:20E0A000C0F3C000884205D185F80490BDE8F84F00F02FB9A86A1A4FB0460188A5F81310BE -:20E0C00080786875E88940F02000E8816E7138787868583000907C6894F82C00012818D10C -:20E0E000F6F71EFF2046009901F023FA88B13878002878680CBF00F5867000F5EA7021886A -:20E1000041800099097A017180F80090A87AEDF7F1FDA86A0078C0F3800003E03C010020B7 -:20E12000740100209AF80610884237D03878786800F1580490F85D0060B3022848D000BFFB -:20E1400084F80580387840B12079414628B1217185F80390AA6910209047E07898B184F84B -:20E160000380F7F7D0F9002808BFFFDF082085F80390AA6900219047D4E91002411C42F1F6 -:20E180000000C4E91010A07901280CBF84F8068084F80690E88940F48070E881A86A9AF8EF -:20E1A00007300178C1F3C0029A4252D13A787A6801F0030102F15804012918BF022935D031 -:20E1C00003291CBF287A40F0040012D0287240E0286BF1F776FE002808BFFFDFD4E910023B -:20E1E000411C42F10000C4E91010A87AEDF782FDA6E701F05CFDA8B184F80290E9894846FF -:20E2000041F40061E981A96A85F80390AA699047E079012803D100BF84F8078019E084F864 -:20E22000079016E0287A40F01000CFE74078F8B1E98941F40061E981A97851B9FB28F1D8CF -:20E24000687A002808BF4E4603D08020AA69002190475946012000F07DF858B39AF8110008 -:20E26000002818BFBBF1000F1BD0A87868B118E0E0790128D3D1CFE7002818BFF6F7B9F94E -:20E28000E88940F04000E881E3E7A96AAA894878904288BF1046C21CE86A03F02DFCE86A57 -:20E2A000A862002E1CBF0020FFF7F9FDBDE8F84F00F02FB8002E1CBF0120FFF7F0FD00204F -:20E2C000FFF716FC9AF81100002818BFBBF1000F0DD0A87858B9A96AAA894878904288BFAC -:20E2E0001046C21CE86A03F007FCE86AA862002E08BFBDE8F88F0220BDE8F84FCFE5354AE4 -:20E300001378526892F851200BB1FBF76ABAFAF71AB970B52F4900254C68F6F7B7FDF6F723 -:20E32000A9FDF6F7DBFCF6F73EFDF6F703F9F6F753FD94F82C00012808BFF6F7F1FD264C30 -:20E340000021A269E0899047226A217A20799047257070BD70B5204C0546002908BF012DFE -:20E3600005D16079401CC0B26071012830D8E1692846884700282BD0E179184839B1012DA2 -:20E3800001BF41780029017811F0100F20D0217AF1B910490978002918BF002102D02943D4 -:20E3A00004D013E0012D18BF0121F8D10C49097811F0100F04BF007810F0100F08D0E07826 -:20E3C00030B9A07810B111F0100F01D0002070BD012070BD740100203C0100204F0100208D -:20E3E0004C01002010B540F2C311F94803F0FBFBFF220821F748E4F7FAFDF748002141704F -:20E400004FF46171418010BD2DE9F0410F46064600F03FFBEE4C102817D004EBC00191F8B5 -:20E420004A1111F0010F1CBF0120BDE8F081617808291FD2617804EBC000491C6170012183 -:20E4400080F84A110846BDE8F0816178082911D22578681C207004EBC5083868C8F8440186 -:20E46000B888A8F84801102D28BFFFDF88F843612846DFE70020BDE8F081D5480178491EE6 -:20E480004BB2002BB8BF704770B4002500EBC30191F84A1111F0010F3BD04278D9B2521E79 -:20E4A000427000EBC10282F84A5190F802C00022BCF1000F0BD9841894F803618E4202D1AC -:20E4C000102A26D103E0521CD2B29445F3D80278521ED2B202708A421BD000EBC20200EB61 -:20E4E000C10CD2F84341CCF84341D2F84721CCF84721847890F800C00022002C09D9861849 -:20E5000096F8036166450AD1102A1CBF024482F80311591E4BB2002BB8DA70BC7047521C18 -:20E52000D2B29442EBD8F4E72DE9F0471F4690460E46814600F0ADFAA54C0546102830D035 -:20E54000A2780021002A0ED9631893F80331834205D110291CBF1220BDE8F08703E0491CF0 -:20E56000C9B28A42F0D8082A2FD2102D1CD0A6781022701CA07004EB061909F103004146B2 -:20E5800000F086FF09F183001022394600F080FFA019002180F8035180F83B110846BDE80C -:20E5A000F087A278082A10D22578681C207004EBC50A3068CAF84401B088AAF84801102D48 -:20E5C00028BFFFDF8AF84391D1E70720BDE8F08770B47F488178491E4BB2002BBCBF70BC0B -:20E5E000704700BF817803F0FF0C491ECAB2827050FA83F191F8031194453ED000EB021595 -:20E6000000EB0C14D5F80360C4F80360D5F80760C4F80760D5F80B60C4F80B60D5F80F60AE -:20E62000C4F80F60D5F88360C4F88360D5F88760C4F88760D5F88B60C4F88B60D5F88F50FE -:20E64000C4F88F50851800EB0C0402EB420295F803610CEB4C0C00EB420284F8036100EB1C -:20E660004C0CD2F80B61CCF80B61B2F80F21ACF80F2195F83B2184F83B2100EBC10292F835 -:20E680004A2112F0010F33D190F802C00022BCF1000F0BD9841894F803518D4202D1102A95 -:20E6A00026D103E0521CD2B29445F3D80278521ED2B202708A421BD000EBC20200EBC10CEC -:20E6C000D2F84341CCF84341D2F84721CCF84721847890F800C00022002C09D9851895F8A8 -:20E6E000035165450BD1102A1CBF024482F80311591E4BB2002BBFF675AF70BC7047521C8E -:20E70000D2B29442EAD8F3E733494870704732484078704738B14AF2B811884203D82E4925 -:20E72000488001207047002070472B484088704710B500F0AEF9102814D0254A0146002022 -:20E7400092F802C0BCF1000F0CD9131893F803318B4203D1102818BF10BD03E0401CC0B2B4 -:20E760008445F2D8082010BD19498A78824286BF01EB001083300020704715498A788242FA -:20E7800086BF01EB0010C01C00207047104B93F802C084459CBF00207047184490F80301FA -:20E7A00003EBC00090F843310B70D0F844111160B0F84801908001207047054A114491F8A0 -:20E7C000032105490A7002684A60808808817047F0100020860100207C01002010B5F5F7DC -:20E7E00027FE002804BFFF2010BDBDE81040F5F745BEFE498A7882429CBF002070470844AE -:20E8000090F8030101EBC00090F84A0100F0010070472DE9F047F54F0026B04638780028C0 -:20E8200086BF4FF0080ADFF8C893BDE8F08700BF07EBC80505F5A27195F8430100F029F986 -:20E84000102808BF544610D0B978002400290BD93A1992F80321824202D1102C05D103E050 -:20E86000621CD4B2A142F3D80824B878A04286BF07EB0410C01C002095F84A1111F0010F68 -:20E8800016D050B1082C04D2391991F83B11012903D0102100F0D9FD50B109F806403046AE -:20E8A000731C95F8432105F5A271DEB2F5F7A8FF08F1010000F0FF0838784045B8D8BDE84D -:20E8C000F0872DE9F041C94C00263546A07800288CBFC74FBDE8F0816119C0B291F8038114 -:20E8E000A84286BF04EB0510C01C002091F83B11012903D0102100F0A8FD58B104EBC80091 -:20E90000BD5590F8432100F5A2713046731CDEB2F5F776FF681CC5B2A078A842DCD8BDE8A5 -:20E92000F08110B5F5F79BFF002804BF082010BDF5F799FFAE49085C10BDAE4910B5497812 -:20E9400041B1AA4B997829B1C21CD81CF5F70DFD012010BD002010BDA44A01EB410102EB39 -:20E9600041010268C1F80B218088A1F80F0170472DE9F0419D4D07460024A878002898BF5D -:20E98000BDE8F081C0B2A04213D905EB041010F183060ED01021304600F057FD48B904EBDA -:20E9A000440005EB400000F20B113A463046F6F73AFE601CC4B2A878A042E3D8BDE8F081F5 -:20E9C000014610228C4800F063BD8B48704770B5864D0446A878A04206D905EB04101021F8 -:20E9E000833000F032FD08B1002070BD04EB440005EB400000F20B1070BD7C498A78824217 -:20EA000006D9084490F83B01002804BF01207047002070472DE9F0410E4607461546062103 -:20EA2000304600F012FD714C98B1A17871B104F59D7011F0010F18BF00F8015FA178490870 -:20EA400004D0457000F8025F491EFAD10120BDE8F0813846314600F01CF8102816D0A37839 -:20EA60000021002B12D9621892F80321824209D1102918BF082909D0601880F83B510120E2 -:20EA8000BDE8F081491CC9B28B42ECD80020BDE8F0812DE9F041554D0646002428780F466B -:20EAA000002811D905EBC40090F84311B14206D10622394600F5A27002F0F2FF38B1601CF4 -:20EAC000C4B22878A042EDD81020BDE8F0812046BDE8F081454910B44A7801EBC003521E84 -:20EAE0004A70002283F84A2191F802C0BCF1000F0DD98B1893F80341844204D1102A1CBF45 -:20EB000010BC704703E0521CD2B29445F1D80A78521ED2B20A70824204BF10BC704701EB15 -:20EB2000C00301EBC202D2F843C1C3F843C1D2F84721C3F847218C7891F800C00022002CE5 -:20EB40009CBF10BC70478B1893F80331634506D1102A1CBF114481F8030110BC7047521C1E -:20EB6000D2B29442EFD810BC704770B41F490D188A78521ED3B28B7095F80321984247D0AC -:20EB800001EB001401EB031C00EB4000DCF80360C4F80360DCF80760C4F80760DCF80B604C -:20EBA000C4F80B60DCF80F60C4F80F60DCF88360C4F88360DCF88760C4F88760DCF88B604D -:20EBC000C4F88B60DCF88FC0C4F88FC001EB030C03EB43039CF8034101EB430385F8034166 -:20EBE00001EB4000D3F80B4108E00000F0100020860100207C010020B3120020C0F80B419D -:20EC0000B3F80F31A0F80F319CF83B0185F83B0101EBC20090F84A0110F0010F1CBF70BC10 -:20EC2000704700208C78002C0DD90B1893F803C1944504D110281CBF70BC704703E0401C92 -:20EC4000C0B28442F1D80878401EC0B20870904204BF70BC704701EBC20301EBC000D0F84E -:20EC600043C1C3F843C1D0F84701C3F847018C780B780020002C9CBF70BC704701EB000CB5 -:20EC80009CF803C19C4506D110281CBF084480F8032170BC7047401CC0B28442EED870BC00 -:20ECA0007047000010B50A7B02F01F020A730022C2758B181B7A03F0010C5B0803F00104D7 -:20ECC000A4445B0803F00104A4445B0803F00104A4445B0803F0010464444FEA530C0CF02F -:20ECE000010323444FEA5C0C0CF00104234403EB5C0300EB020C521C8CF8123090F817C0C7 -:20ED0000D2B26344C375052AD3D3D8B2252888BFFFDF10BD00238383028401EBC202521E23 -:20ED2000B2FBF1F1C183704770B46FF01F02010C02EA90251F23A1F5AA4054381CBFA1F538 -:20ED4000AA40B0F1550009D0A1F52850AA381EBFA1F52A40B0F1AA00012000D100204FF091 -:20ED6000000C62464FEA0C048CEA0106F6431643B6F1FF3F11D005F001064FEA5C0C4CEAEE -:20ED8000C63C03F0010652086D085B08641C42EAC632162CE8D370BC704770BC00207047BE -:20EDA0002DE9F04701270025044603290FD04FF4FA43002972D0012900F0F880022918BFE5 -:20EDC000BDE8F0870146BDE8F04758306AE704F158067021304602F028FFB571F571F572B5 -:20EDE0003573B573F573757135767576F52086F83C00412086F83D00FF2086F86B00A4F8D0 -:20EE0000C850A4F8CA50A4F8CC50A4F8CE50A4F8D050A4F8D25084F8D55084F8D750A4F858 -:20EE2000DE5084F8DC50A4F8F050A4F8F25084F82C50258484F8517084F852704FF448603B -:20EE400060801B21218761874FF4A470E087A08721866186E086A086A4F84410A4F8460035 -:20EE6000A4F84010A4F84200A4F84810A4F84A10A4F84C10677384F8885184F8895184F8E5 -:20EE8000925184F8935184F8615184F8665184F8695184F87A51BDE8F087FFE7A4F8DE5085 -:20EEA00084F8D6506088FE490144B1FBF0F1A4F876104BF68031A4F87810E288A4F87C50A5 -:20EEC000B4F880C0D2000CFB00FCB2FBF0F29CFBF0FC521CA4F880C092B202FB00FC04F1E3 -:20EEE0005801A4F87E20BCF5C84FC4BF521ECA84B3FBF0F2521C8A8500F5802202F5EE32BB -:20EF0000531EB3FBF0F2CA838B8B03FB00F2B2FBF0F08883214604F15800FFF7C3FED4F8CE -:20EF20000E106FF01F02080C02EA9126A0F5AA414FF01F0C54391CBFA0F5AA41B1F15501B2 -:20EF40000AD0A0F52851AA391EBFA0F52A41B1F1AA014FF0010901D14FF0000900221146E0 -:20EF60004FEA020382EA00086FEA080848EA0108B8F1FF3F16D006F00108520842EAC832EF -:20EF800049080CF0010876085B1C41EAC8314FEA5C0C162BE6D3B9F1000F1CBF84F86051A6 -:20EFA000BDE8F08784F86071BDE8F087A4F8DE50B4F88221B4F88611B4F802C004F15800B5 -:20EFC000A4F87C50B4F88040C90004FB0CF4B1FBF2F194FBF2F4491C048589B201FB02F476 -:20EFE000C184B4F5C84FC4BF491EC184B3FBF2F1491C8185018C02EBC101491EB1FBF2F1AF -:20F00000C183818B01FB0CF1B1FBF2F18183BDE8F08770B50025044603290DD04FF4FA42DC -:20F02000002958D001297DD0022918BF70BD0146BDE87040583035E604F158067021304640 -:20F0400002F0F3FDB571F571F5723573B573F573757135767576F52086F83C00412086F879 -:20F060003D00FF2086F86B00A4F8D050202084F8D20084F8C850C4F8CC50012284F82C507A -:20F0800084F8512084F852201B20208760874FF4A471E187A18720866086E186A186A4F82E -:20F0A0004400A4F84610A4F84000A4F84210A4F84800A4F84A00A4F84C00627384F8FC5001 -:20F0C00084F8FD5084F8065184F8075184F8EC5084F8F85070BD608871490144B1FBF0F1A3 -:20F0E000A4F876104BF68031A4F87810E388A4F87C50B4F880C0DB000CFB00FCB3FBF0F3AA -:20F100009CFBF0FC5B1CA4F880C09BB203FB00FC04F15801A4F87E30BCF5C84FC4BF5B1E76 -:20F12000CB8400E017E0B2FBF0F2521C8A8500F5802202F5EE32531EB3FBF0F2CA838B8B8B -:20F1400003FB00F2B2FBF0F08883214604F15800BDE87040A6E5D4F8F030B4F802C004F144 -:20F1600058005989DB89A4F87C50B4F88040DB0004FB0CF4B3FBF1F394FBF1F45B1C04853D -:20F180009BB203FB01F4C384B4F5C84FC4BF5B1EC384B2FBF1F2521C8285028C01EBC202A2 -:20F1A000521EB2FBF1F2C283828B02FB0CF2B2FBF1F1818370BD2DE9F003C47D0CB1252CEA -:20F1C00003D9BDE8F00312207047002A02BF0020BDE8F003704791F80DC01F260123314D3B -:20F1E0004FF00008BCF1000F7AD0BCF1010F1EBF1F20BDE8F0037047B0F800C00A7C8F7BA2 -:20F2000091F80F907A404F7C87EA090742EA072282EA0C0C5FF000070CF0FF094FEA1C2C0C -:20F2200099FAA9F99CFAACFC4FEA19694FEA1C6C49EA0C2C0CEB0C1C7F1C9444FFB21FFA18 -:20F240008CFC032FE8D38CEA020C164F0022ECFB057212096FF0240502FB05C2D2B201EBF9 -:20F26000D207027602F007053F7A03FA05F52F4218BF42767ED104FB0CF2120C521CD2B233 -:20F280005FF0000400EB040C9CF812C094453CBFA2EB0C02D2B218D34FF0000C0D1903E088 -:20F2A000FFDB050053E4B36E95F8085003FA0CF73D421CBF521ED2B2002A6AD00CF1010C76 -:20F2C0000CF0FF0CBCF1080FF0D304F1010C0CF0FF04052CD6D33046BDE8F0037047FFE71A -:20F2E00090F818C00C7E474604FB02C2FB4C4FF0000CE2FB054C4FEA1C1C6FF024040CFB15 -:20F300000422D2B201EBD204027602F0070C247A03FA0CFC14EA0C0F1FBF42764046BDE887 -:20F32000F003704790F817C0B2FBFCF40CFB1422521CD2B25FF0000400EB040C9CF812C044 -:20F3400094453CBFA2EB0C02D2B212D30D194FF0000C2D7A03FA0CF815EA080F1CBF521E5B -:20F36000D2B27AB10CF1010C0CF0FF0CBCF1080FF0D300E010E004F1010C0CF0FF04052C44 -:20F38000DAD3A8E70CEBC40141763846BDE8F00370470CEBC40141764046BDE8F0037047A9 -:20F3A000CF4A016812681140CE4A126811430160704730B4CC49CA4B00244FF0010C0A7802 -:20F3C000521CD2B20A70202A08BF0C700D781A680CFA05F52A42F2D0097802680CFA01F11C -:20F3E0005140016030BC7047017931F01F0113BF002000221146704710B4435C491C03F0E0 -:20F40000010C5B0803F00104A4445B0803F00104A4445B0803F00104A4445B0803F00104BB -:20F42000A4445B0803F001045B08A44403F00104A4440CEB53031A44D2B20529DDDB012A1E -:20F440008CBF0120002010BC704730B40022A1F1010CBCF1000F11DD431E11F0010F08BF15 -:20F4600013F8012F5C785FEA6C0C07D013F8025F22435C782A43BCF1010CF7D1491E5CBFCF -:20F48000405C0243002A0CBF0120002030BC7047130008BF704710B401EB030CD41A1CF860 -:20F4A00001CC5B1E00F804C013F0FF03F4D110BC7047F0B58DB0164610251C466A46AC4686 -:20F4C00000EB0C03A5EB0C0713F8013CD355ACF1010313F0FF0CF3D1154610321020844615 -:20F4E0000B18ACEB000713F8013C401ED35510F0FF00F5D1284601F033FA86B1102005F1CF -:20F50000200201461318A1EB000C13F8013C401E04F80C3010F0FF00F4D10DB0F0BD089813 -:20F520002060099860600A98A0600B98E0600DB0F0BD38B505460C466846F5F706FD0028AC -:20F5400008BF38BD9DF90020227294F909100020511A48BF494295F82D308B42C8BF38BDAF -:20F56000FF2B08BF38BDA17A491CC9B2A17295F82E30994203D8617A7F2918BF38BD6272D3 -:20F580000020A072012038BD0C2818BF0B2806D00D281CBF2038062884BF0020704701203E -:20F5A00070470C295AD2DFE801F006090E13161B323C4153484E002A52D04FE0072A18BFFF -:20F5C000082A4DD04AE00C2A18BF0B2A48D045E00D2A45D042E0A2F10F000D2840D93DE0B8 -:20F5E00023B1A2F110000C283AD937E0122A18BF112A35D090F8340020B1122A2ED31B2AD4 -:20F600002ED92BE0162A29D31B2A29D926E0A2F10F01032924D990F83400F8B11C2A1FD9E0 -:20F620001CE0002B08BF042A18D119E013B1062A16D013E0012A11D112E01D2A1CBF1E2A96 -:20F640001F2A0DD00AE0A2F12000062808D905E013B10E2A04D001E0052A01D0002070476B -:20F66000012070472DE9F04187680D4604462046F3F7CCFB98B1D5B13846A168F3F709FF80 -:20F68000002814DD2844401EB0FBF5F606FB05F13846F2F7F8FEA0603046BDE8F081F3F727 -:20F6A000E7F94FF4E661F2F7EEFEA060DFE70020BDE8F081904228BF704770B50446101B05 -:20F6C000642838BF642025188D4205D8F3F715FF00281CBF284670BD204670BD53E4B36EB3 -:20F6E00064230200682302008E01002091F851300A8E022B07BF92003C32D200703292B2F8 -:20F700008B8E934238BF1A464B8E91F852C0BCF1020F07BF9B003C33DB0070339BB2C98E80 -:20F72000994238BF0B4600280CBF01210021D0189830002918BF04210844704730B48388A9 -:20F74000B0F808C003EB0C049834002A18BF042222444C6A944224BF30BC7047121B521C35 -:20F7600052089B1A9BB2ACEB0202838092B2028191F851506FF00E0C6FF00D04022D0CBFBB -:20F780000CEB930304EBD303438091F8521002290CBF0CEB920104EBD201C18030BC704743 -:20F7A00010F0010F1CBF0120704710F0020F1CBF0220704710F0040018BF082070472DE9F1 -:20F7C000F0410546174688460126084600F001FC0446404600F001FC034610F0010F18BF33 -:20F7E000012008D113F0020F18BF022003D113F0040018BF082014F0010F18BF4FF0010CF1 -:20F8000021D000BF50EA0C0108BF002613F0030F08BF002014F0030F08BF4FF0000C95F853 -:20F820005110814208BF0020387095F85210614508BF4FF0000C87F801C0002808BFBCF192 -:20F84000000F1CD10DE014F0020F18BF4FF0020CD8D114F0040F14BF4FF0080C4FF0000C55 -:20F86000D0E7404600F0BFFBB5F85810401A00B247F6FE71884201DC002800DC002630468D -:20F88000BDE8F08101281CBF02280020704718B4CBB2C1F3072CC1B2C0F30720012B07D0CD -:20F8A000022B09D0042B08BFBCF1040F23D006E0BCF1010F03D11EE0BCF1020F1BD0012951 -:20F8C00006D0022907D0042908BF042813D004E0012802D10FE002280DD001EA0C0161F32B -:20F8E0000702184060F30F22D0B210F0020F18BF02200BD106E0084003EA0C01084060F3F8 -:20F900000702EFE710F0010018BF01208DF80000C2F3072010F0020F18BF022003D110F0D0 -:20F92000010018BF01208DF80100BDF8000018BC7047162A10D12A220C2818BF0D280FD07C -:20F940004FF0230C20280DD031B10878012818BF002805D0162805D00020704701207047F3 -:20F960001A70FBE783F800C0F8E70000282102F03AB930B50546007801F00F0220F00F000A -:20F980001043287007290BD2DFE801F00406040604080400062405E00C2403E0222401E04A -:20F9A0000024FFDF687820F03F002043687030BD007800F00F0070470A68C0F80320898862 -:20F9C000A0F807107047D0F803200A60B0F80700888070470A68C0F809208988A0F80D10E5 -:20F9E0007047D0F809200A60B0F80D00888070470278202322F0200203EA4111114301708C -:20FA000070470278402322F0400203EA81111143017070470078C0F3801070470278802374 -:20FA200022F0800203EAC1111143017070470078C0097047D0F80320C1F80920B0F8072063 -:20FA4000A1F80D200A7822F080020A700078800942EAC0100870704770B515460E46044606 -:20FA60001F2A88BFFFDF2A46314604F1090002F043F86078A91D20F03F0001F03F0108439D -:20FA8000607070BD70B5054640780E4600F03F04062C38BFFFDFA01FC4B21F2C88BF1F24A9 -:20FAA000224605F10901304602F026F8204670BD70B515460E4604461F2A88BFFFDF2A46C9 -:20FAC000314604F1090002F017F86078A91D20F03F0001F03F010843607070BD70B50546DA -:20FAE00040780E4600F03F04062C38BFFFDFA01FC4B21F2C88BFFFDF224605F1090130463D -:20FB000001F0FAFF204670BD0968C0F80F1070470A88A0F813208978417570474176090AD4 -:20FB200081767047C176090A017770474177090A81777047C175090A017670478175704700 -:20FB400090F8242001F01F0122F01F02114380F824107047072988BF072190F82420E02370 -:20FB600022F0E00203EA4111114380F8241070471F3002F066B94178007801F03F0110F0D9 -:20FB80000F0006D0012808D0022809D006280BD00FE0881F1F280AD90BE00C2909D106E0D3 -:20FBA000881F1F2803D904E0881F1F2801D801207047002070474178007801F03F0100F0CF -:20FBC0000F00042805D1062903D325299CBF012070470020704710B4017801F00F0103294D -:20FBE00022D0052925D14478B0F81910B0F81BC0B0F81730827D04F03F04222C19D1062953 -:20FC000017D3B1F5486F98BFBCF5FA7F11D282B1082A98BF8A420CD28B429CBFB0F81D00E6 -:20FC2000B0F5486F05D807E0407800F03F000C2802D010BC0020704710BC0120704722212D -:20FC400001F0D1BF00B5027801F0030322F003021A43027000224270012914BF022900BD5E -:20FC6000032912BFFFDF0121417000BD01F0030300B5027822F003021A4302700022427039 -:20FC8000012914BF022900BD032912BFFFDF0121417000BD007800F0030070470278102345 -:20FCA00022F0100203EA01111143017070474178F9B1C078192850D2DFE800F00D101316AA -:20FCC000191C1F2225282B2E31344F4F4F4C373A3D40434649000C2941D042E008293ED003 -:20FCE0003FE002293BD03CE0172938D039E00D2935D036E0012932D033E001292FD030E069 -:20FD000002292CD02DE0092929D02AE0092926D027E0012923D024E0012920D021E00629E0 -:20FD20001DD01EE002291AD01BE0012917D018E0012914D015E0092911D012E009290ED0A7 -:20FD40000FE003290BD00CE0032908D009E0052905D006E0032902D003E0FB2901D80120EC -:20FD600070470020704730B50546C170192924D2DFE801F00D0F11131517171119191717B0 -:20FD80001B111921211D171719191D1D1F000C2415E0082413E0022411E017240FE00D2450 -:20FDA0000DE001240BE0092409E0062407E0032405E0052403E0182401E00024FFDF6C700C -:20FDC00030BDC0787047C171090A01727047B0F8070070474172090A81727047B0F8090051 -:20FDE0007047C172090A01737047B0F80B0070474171090A81717047B0F80500704701712D -:20FE00007047007970474173090A81737047B0F80D00704730B4B0F80720894DB0F809C023 -:20FE2000B0F805300179941F2D1998BFBCF5FA7F0ED269B1082998BF914209D293429FBF8E -:20FE4000B0F80B00B0F5486F012030BC98BF7047002030BC7047001D01F0F3BF021D084688 -:20FE6000114601F0EEBF4172090A81727047B0F80900704701717047007970470A68426048 -:20FE800049688160704742680A608068486070470988818170478089088070470A68C0F802 -:20FEA0000E204968C0F812107047D0F80E200A60D0F81200486070470968C0F81610704733 -:20FEC000D0F81600086070470A68426049688160704742680A608068486070470968C160DB -:20FEE0007047C06808607047017170474171090A81717047C171090A0172704700797047CE -:20FF0000B0F805007047B0F807007047017170470079704701717047007970470A68426051 -:20FF200049688160704742680A608068486070470171090A417170478171090AC171704741 -:20FF40000172090A417270478172090AC172704780887047C0887047008970474089704743 -:20FF600001891B2924BF4189B1F5A47F07D381881B2921BFC088B0F5A47F0120704700202E -:20FF800070470A68426049688160704742680A6080684860704701717047007970474171E7 -:20FFA000704740797047017911F0070F1BBF407910F0070F002001207047017911F0070F57 -:20FFC0001BBF407910F0070F0020012070470171704700797047417170474079704781715C -:20FFE000090AC1717047C088704716A282B0D2E90012CDE900120179407901F007026946AB -:020000040002F8 -:200000001DF80220012A07D800F00700085C01289EBF012002B07047002002B07047017139 -:20002000704700797047417170474079704730B50C460546FB2988BFFFDF6C7030BD00006C -:2000400086F3FFFF000101020102020370B50446C2F11005281901F04FFD15F0FF0108D08B -:20006000491EC9B2802060542046BDE8704001F0BABD70BD30B505E05B1EDBB2CC5CD55CD1 -:200080006C40C454002BF7D130BD10B5002409E00B78521E44EA430300F8013B11F8013B0A -:2000A000D2B2DC09002AF3D110BD2DE9F0410C4601200978FF4E92B0154602274FF0060881 -:2000C0004FF0040C71B101291ED0022945D0032905D12978042902D105201070002012B02D -:2000E000BDE8F081606850B1CDE90106012020708DF80080606A05901146684663E0277070 -:2001000085F800C0566026E029780429E7D1696810222069FFF7B9FF6868C07B000606D53A -:20012000E44A2069102310320146FFF7A3FFD4E904101022FFF7A9FF2069C07B000606D56E -:20014000DC4A6069102310320146FFF793FF277085F800C06E600320C1E729780429BED1A2 -:20016000A08910280CD9A0F1100080B2A081A1684FF01003014468466A68FFF77BFF18E0BD -:2001800004D14FF010032269A16807E0C2B20EA8A168FFF75BFF626910230EA90AA8FFF7DD -:2001A00069FF10230AA968466A68FFF763FF0320207060680590CDF818D08DF81080606A7D -:2001C0000990294604A8F1F759FF88E72DE9F04107460D4601200B7806213BB1012B04D11D -:2001E0001378052B01D11170002079E76C69012620226170E8686060686A6062A168287C11 -:200200000870A681A068A968401C01F075FCA08920222030A081A0686968213001F06CFC09 -:20022000A08921462030A0812E703846BDE8F041F1F73BBF2DE9F05F0D46834601200978C6 -:20024000174606464FF00608D1B1DFF868A24FF00009AAF1080A012923D002297ED003298E -:200260000CD13978052909D179681022E86901F043FC07203870183500207D60BDE8F09F07 -:200280002C6A8C48202284F80180203060602020A081686A60626968A06801F02DFC2E701F -:2002A000D4E039780529E9D12C6A84F80180686A606251681022E86901F01EFCE869606072 -:2002C000A0684F4680F80090A681A0684670A089401C80B2A081A1680844696951F8012F1C -:2002E000026089888180A089801D80B2A0816969A2680978C1F340011154A089401C80B203 -:20030000A081A1680844296951F8012F026089888180A089801D80B2A0812969A2680978B2 -:20032000C1F340011154A0891022401C80B2A081A1680844E96801F0DFFBA089102210304D -:2003400080B2A081A1680844A96801F0D5FBA089103080B2A081A168014400E00DE0DAF87A -:2003600004000860A089001D80B2A081A1680F54A089401CA081022067E03978052992D1BB -:2003800051681022A86901F0B7FB2C6A84F80180E8696060686A6062A16881F80090A6814D -:2003A000A0684670A089401C80B2A081A1680844696951F8012F026089888180A089801DCD -:2003C00080B2A0816969A2680978C1F340011154A089401C80B2A081A1680844296951F80B -:2003E000012F026089888180A089801D80B2A0812969A2680978C1F340011154A08910226E -:20040000401C80B2A081A1680844E96801F074FBA0891022103080B2A081A1680844A968D3 -:2004200001F06AFBA089103080B2A081A1680144DAF804000860A089001D80B2A081A1687C -:200440000E54A089401CA0810320287021465846BDE8F05FF1F729BE70B50D4606460978CC -:20046000012041B1012905D11178052902D108201070002070BD2C6A0620607069686160CC -:20048000696A6162EA69A16852F8013F0B6092888A80A081E869A1680078C0F34000887172 -:2004A000A089401C80B2A081A1680844A96951F8012F01E074230200026089888180A0896D -:2004C000801D80B2A081A969A2680978C1F340011154A089401C80B2A081A1680844696936 -:2004E0000A88028089788170A0891022C01C80B2A081A1680844296901F0FEFAA089102241 -:20050000103080B2A081A1680844E96801F0F4FAA0891022103080B2A081A1680844A9686F -:2005200001F0EAFAA08921461030A081012028703046BDE87040F1F7B8BD70B50D46064650 -:200540000978012059B1012908D11178052905D109201070506800685060002070BD6C69C4 -:20056000062010226070E8686060686A60622969A06801F0C1FA1020A081A068202210308E -:20058000A96801F0B9FAA0892022203080B2A081A1680844696801F0AFFAA08921462030F8 -:2005A000A081012028703046BDE87040F1F77DBD70B50C46012009788EB01546062659B18C -:2005C000012934D0022905D12978042902D10A20107000200EB070BD606910236A46007872 -:2005E000C0F340008DF80000A0690078C0F340008DF80100E0680168CDF802108188ADF853 -:20060000061080798DF8080020690168CDF809108188ADF80D1080798DF80F0060680590B9 -:200620000AA80690A168FFF725FD01201DE029780429CFD1A06910236A4650F8011F0091E0 -:200640008088ADF80400606950F8011FCDF806108088ADF80A0000200390606805900AA864 -:2006600006906968FFF706FD022020708DF81060606A0990294604A8F1F700FDAAE700B5CA -:200680000B788BB001204BB1012B05D11178042902D10B20107000200BB000BD4868019070 -:2006A00006A80290C8680368069340680790886803680893406809900120087006208DF80C -:2006C0000000486A059011466846F1F7D7FCE3E700B50B788BB0012043B1012BDCD111785F -:2006E0000429D9D10C2010700020D5E74868019006A80290886803680693406807900020C7 -:20070000089009900120087006208DF80000486A059011466846F1F7B1FCBDE700B50B78A7 -:200720008BB0012043B1012BB6D111780429B3D10D2010700020AFE748680590CDF818D027 -:2007400088680088ADF80000C8680088ADF8020000200190029003900120087006208DF803 -:200760001000486A0990114604A8F1F787FC93E730B403460C7801205CB1012C15D0022C17 -:2007800005D111780C2902D10E201070002030BC704701200870C868042242704A6842608C -:2007A0000B4A8260921EC2600BE014780D2CEED102200870C86803244470526842608A68CE -:2007C0008260496A4162014630BC1846F1F76DBC6E2302002DE9F0410C4611490D68104AEA -:2007E000104908321160A0F120012A2901D301200CE03E2810D040CC0B4F94E80E0007EBE7 -:200800008000241F50F8807C3046B84720600448001D0560BDE8F0812046E0F7E1FCF5E702 -:200820001005024001000001A423020010B5524800F070FA00B1FFDF4F48401C00F06AFA07 -:20084000002800D0FFDF10BD2DE9F14F4B4ED6F800B00127484800F065FADFF81C8128B92C -:200860005FF0000708F1010000F072FA444C00254FF0030901206060C4F80051C4F80451CD -:20088000009931602060DFF8FCA018E0DAF80000C00614D50E2000F064F8EFF3108010F0D6 -:2008A000010072B600D00120C4F80493D4F8001119B9D4F8041101B920BF00B962B6D4F805 -:2008C000000118B9D4F804010028DFD0D4F804010028CFD137B1C6F800B008F1010000F0C5 -:2008E00021FA11E008F1010000F01CFA0028B9D1C4F80893C4F80451C4F800510E2000F0A7 -:2009000030F81D4800F024FA0020BDE8F88F2DE9F0438DB00D46064600240DF110090DF192 -:20092000200817E004EB4407102255F82710684601F0E2F805EB870710224846796801F01F -:20094000DBF86846FFF780FF10224146B86801F0D3F8641CB442E5DB0DB00020BDE8F083E1 -:2009600072E700F01F02012191404009800000F1E020C0F8801270478F01002004E5004086 -:2009800000E0004010ED00E0D848002101708170704770B5D64D01232B60D64B1C68002C38 -:2009A000FCD0002407E00E6806601E68002EFCD0001D091D641C9442F5D30020286018687B -:2009C0000028FCD070BD70B5C84E0446CA4D3078022800D0FFDFAC4200D3FFDF7169C74852 -:2009E000012903D847F23052944201DD03224271491C7161291BC160C0497078F2F782FAB9 -:200A0000002800D1FFDF70BD70B5B84C0D466178884200D0FFDFB84E082D4ED2DFE805F0EE -:200A20004D0421304D4D4D3B2078022800D0FFDF03202070A078022802D0012804D008E0D6 -:200A4000A06800F051FD04E004F1080007C8FFF7A0FF052020700020A070BDE87040F1F7E9 -:200A600012BFF2F705F801466068F2F712FDB04202D2616902290BD30320F2F7E4FF12E03E -:200A8000F1F7F6FF01466068F2F703FDB042F3D2BDE8704097E7207802280AD0052806D058 -:200AA000FFDF04202070BDE8704000F014B9022000E00320F2F7C7FFF3E7FFDF70BD70B5B4 -:200AC0000546F1F7D5FF894C60602078012800D0FFDF8A4901200870002008718D600420F5 -:200AE00048718548C860022020706078F2F70AFA002800D1FFDF70BD10B57C4CA07808B967 -:200B0000207808B1112010BD7D48F1F737FF60706078202804D0012020700020606110BD80 -:200B2000032010BD0246010B0120B2F5003F02D2884000F071BFB2F5802F03D22039884062 -:200B400000F072BFB2F5C02F03D24039884000F074BFB2F5002F03D26039884000F076BF74 -:200B6000002070472DE9F041144600EB84070E4605463F1F00F0CBFC4FF080510A695043BD -:200B800006EB8402121FB24201D2012200E000221CB10969B4EB910F02D90920BDE8F08129 -:200BA00058498D4216D3AF4214D3854205D2874203D245EA0600800701D01020EEE78E4266 -:200BC00008D33AB92846FFF7ADFF18B93846FFF7A9FF08B10F20E1E74B484C490068884240 -:200BE00005D0224631462846FFF7D3FE10E0FFF783FF0028D2D13D4801218560C0E903643D -:200C000081704FF4A97104FB01F01830FFF757FF0020C3E770B54FF08055044628693949A2 -:200C2000B1FBF0F084420AD300F071FCA04201D8102070BD28696043FFF774FF08B10F208B -:200C400070BD314831490068884204D02869604300F04AFC0CE0FFF74FFF0028F0D1296959 -:200C6000224861438160022181702948FFF727FF002070BD2349090BB1EB401F07D94042BA -:200C800001EB4011202903D34FF0FF307047002101208840401E704770B505460C460020D2 -:200CA000FFF7E8FF28420ED10120FFF7E3FF204209D10220FFF7DEFF104204D10320FFF7A4 -:200CC000D9FF184201D00F2070BD21462846BDE8704000F0C4BE10B5044C6078F1F7A9FE9D -:200CE00000B9FFDF00202070A07010BD9401002004E5014000E40140105C0C00C41200205E -:200D0000090A020000300200B0000020BEBAFECA7C5E0100002101700846704701460020A3 -:200D200008707047EFF3108101F0010172B60278012A01D0012200E000220123037001B90A -:200D400062B60AB1002070474FF400507047E9E7EFF3108111F0010F72B64FF00002027070 -:200D600000D162B600207047F2E700004C4909680160002070474A490860002070470121A8 -:200D80008A0720B1012804D042F204007047916700E0D1670020704742490120086042F2D6 -:200DA0000600704708B504233E4A1907103230B1C1F80433106840F0010010600BE010685B -:200DC00020F001001060C1F808330020C1F80801354800680090002008BD011F0B2909D82D -:200DE000304910310A6822F01E0242EA400008600020704742F205007047000100F1804048 -:200E0000C0F8041900207047000100F18040C0F8081900207047000100F18040D0F8000941 -:200E2000086000207047012801D9072070471F4A52F8200002680A430260002070470128A6 -:200E400001D907207047194A52F8200002688A43026000207047012801D907207047134A5F -:200E600052F820000068086000207047020010494FF0000003D0012A01D0072070470A60B0 -:200E800070474FF080410020C1F808014FF0E020802180F800140121C0F8001170470000AB -:200EA0000004004000050040080100404C240200780500406249634B0A6863499A4209686D -:200EC00001D1C1F310010160002070475C495D4B0A685D49091D9A4201D1C0F310000860DF -:200EE000002070475649574B0A68574908319A4201D1C0F3100008600020704730B5504B5F -:200F0000504D1C6842F20803AC4202D0142802D203E0112801D3184630BDC3004B481844B4 -:200F2000C0F81015C0F81425002030BD4449454B0A6842F209019A4202D0062802D203E076 -:200F4000042801D308467047404A012142F83010002070473A493B4B0A6842F209019A42FA -:200F600002D0062802D203E0042801D308467047364A012102EBC00041600020704770B5C9 -:200F80002F4A304E314C156842F2090304EB8002B54204D0062804D2C2F8001807E00428FB -:200FA00001D3184670BDC1F31000C2F80008002070BD70B5224A234E244C156842F20903D0 -:200FC00004EB8002B54204D0062804D2D2F8000807E0042801D3184670BDD2F80008C0F308 -:200FE00010000860002070BD174910B50831184808601120154A002102EBC003C3F81015C5 -:20100000C3F81415401C1428F6D3002006E0042804D302EB8003C3F8001807E002EB8003E8 -:20102000D3F80048C4F31004C3F80048401C0628EDD310BD044906480831086070470000C5 -:20104000B0000020BEBAFECA00F5014000F001400000FEFF7D4B1B6803B19847BFF34F8FAE -:201060007B4801687B4A01F4E06111430160BFF34F8FFEE710B5EFF3108010F0010F72B6B0 -:2010800001D0012400E0002400F0D6F850B1E0F741F9F1F7BCFAF2F777FCE1F7C0FE6E493F -:2010A0000020086004B962B6002010BD70B50C460646EFF3108010F0010F72B601D0012582 -:2010C00000E0002500F0B8F818B105B962B6082070BDE0F79BF8E0F71FF90246002043096A -:2010E0009B0003F1E02300F01F01D3F80031CB40D9071BD0202803D222FA00F1C90722D18F -:2011000041B2002906DA01F00F0101F1E02191F8141D03E001F1E02191F80014490908292F -:2011200011D281B101290ED004290CD0401C6428D5D3E1F74BFE4849484808602046F3F7FF -:201140008FF860B904E005B962B641F2010070BD3E4804602EB13046F3F7CFF818B11024E7 -:2011600029E03F4E16E03078022802D94FF4805421E007240028707801D0E0B908E0D0B110 -:20118000202818D8B078212815D8012813D001E0B07880B93349802081F8140DE0F7BCF82A -:2011A0003146F2F7D7FBF1F7F1F900F0E3F93046E0F782F8044605B962B61CB1FFF75AFF5C -:2011C000204670BD002070BD10B5044600F034F800B101202070002010BD234908600020C1 -:2011E000704770B50C4621490D682049204E08310E60102807D011280CD012280FD01328EC -:2012000011D0012013E0D4E90001FFF74FFF354620600DE0FFF72EFF0025206008E02068B7 -:20122000FFF7D2FF03E0104920680860002020600E48001D056070BD074808490068884244 -:2012400001D101207047002070470000AC0100200CED00E00400FA05B0000020BEBAFECA54 -:20126000542402000BE000E004000020100502400100000100B5764910F1080F08BFF82041 -:2012800024D014DC10F1280F08BFD8201ED010F1140F08BFEC2019D010F1100F08BFF020AE -:2012A00014D010F10C0F08BFF4200FD00CE010F1040F08BFFC2009D0002818BF032805D0B9 -:2012C000042804BF086000BDFFDF00BD086000BD00B56049012808BF032004D0022816BFF6 -:2012E000FFDF042000BD086000BD5A48016801F00F01032904BF01207047006800F00F00D0 -:20130000042804BF0220704700B5FFDF012000BD5149002808BF086805D0012806BF086868 -:2013200040F0010070470860704770B50546012914D0022A07BF49484FF47A7148484FF4A4 -:20134000C86144181846F4F759F820444FF47A7100F27120B0FBF1F0281A70BD022A14BF5F -:201360004FF4C8604FF47A7049F608514418E9E770B514460546012908BF49F6CA6605D012 -:20138000022B0CBF3748364800F1FA061046F4F744F8012C0CBF4FF47A714FF4FA71711A8B -:2013A00008444FF47A7100F28920B0FBF1F0281A801E70BD70B51546064601291AD0022B72 -:2013C00007BF26484FF47A7125484FF4C86144181046F4F722F8012D0CBF4FF47A714FF4B1 -:2013E000FA71611A08444FF47A716438B0FBF1F0301A70BD022B14BF4FF4C8604FF47A7056 -:2014000049F608514418E3E770B505460C4616461046F3F7F3FF05EB4501C1EBC51100EB1B -:20142000C100012C0CBF4FF47A714FF4FA7145182046F3F7F2FF281A4FF47A7100F60F60A4 -:20144000B0FBF1F43046F3F7CDFF2044401D70BD0C150040101500405016004068360200D6 -:20146000A2240200043602002DE9F04184B088460746FEF70FFC05467E786A4601A94046B1 -:20148000EFF748F804000ED0012D1EBF032004B0BDE8F08102AA40460199EEF73AFF0298C8 -:2014A000B0F803000AE0022D18D1042E16D3B7F80300BDF80020011D8A4206D3001D80B2CB -:2014C000A119814238BF012004D104B04FF00000BDE8F0813CBF04B0BDE8F0814FF0020093 -:2014E00004B0BDE8F08100000B4A022111600B490B68002BFCD0084B1B1D186008680028E0 -:20150000FCD00020106008680028FCD070474FF0805040697047000004E5014000E4014096 -:2015200002000B464FF00000014620D0012A04D0022A04D0032A0DD103E0012002E00220D0 -:2015400015E00320072B05D2DFE803F00406080A0C0E100007207047012108E0022106E079 -:20156000032104E0042102E0052100E00621F1F722BA0000FC4805218170002101704170CD -:20158000C17081607047F9490A78012A06D0CA681044C860C8684038F1F748BF8A68104432 -:2015A00088608868F7E710B5EF4CE078F1F741FA00B9FFDF0820F2F746FA0520A0700020BD -:2015C0002070607010BD002819D00378E849E94A13B1012B0ED011E00379012B00D06BB993 -:2015E00043790BB1012B09D18368643B8B4205D2C0680EE00379012B02D00BB1002070471C -:2016000043790BB1012BF9D1C368643B8B42F5D280689042F2D8012070472DE9F041044611 -:201620000227F1F72FFE006800B1FFDFCE4D01263CB12078B0B1012805D0022810D003281A -:2016400013D02E710CE06068C82807D3F1F755FF20B16068FFF797FF012703E0002701E016 -:2016600000F0CCF93846BDE8F08128780028F7D16068FFF7A8FF0028E3D06068DFF8EC8244 -:20168000007828B3A878042800D0FFDF0020464688F8000060680079C8B30020307160688C -:2016A0004079A8B30420707160688168E868F0F7EAFEB0606068C0685230F0600320A87034 -:2016C000AA49E878F1F71EFC0028C9D1FFDFC7E7404688F8006061680979D1B100210171A1 -:2016E00061684979B9B10421417161688968523181606168C968C160C0689B4C14346060CE -:20170000F1F7B6F920606E700220A870A8E704E005E00321E3E70321E6E70120BEE703207A -:20172000C1E72DE9F047904C8846E178884200D0FFDFDFF83492002501278C4E09F114095E -:20174000B8F1080F79D2DFE808F0040D2A557E849199A078032803D0A078022800D0FFDFFD -:20176000BDE8F087A078032803D0A078022800D0FFDF0420A0702571207800287AD1FFF77C -:2017800002FF3078012806D0B068E06000F07BF92061002062E0E078F1F7B0FAF5E7A07824 -:2017A000032803D0A078022800D0FFDF207800286FD1A078032816D0F1F75AF901464F46FB -:2017C000D9F80000F1F765FE00280EDB796881420BDB081AF0606549E078F1F793FB00283C -:2017E000BED1FFDFBCE7042029E00420F2F72BF9A570B5E7A078032803D0A078022800D0A2 -:20180000FFDF207888BBA078032817D0F1F730F901464F46D9F80000F1F73BFE0028E4DB1F -:2018200079688142E1DB081AF0605049E078F1F769FB002894D1FFDF92E740E00520F2F787 -:2018400002F9A7708CE7A078042800D0FFDF022004E0A078042800D0FFDF0120A168884720 -:20186000FFF7DBFE054630E004E012E0A078042800D0FFDFBDE8F04700F0C0B8A0780428EE -:2018800005D0607810B1A078022800D0FFDF207810B1BDE8F04786E6207920B10620F2F7D0 -:2018A000D2F82571CDE7607838B13049E078F1F729FB00B9FFDF657052E70720BFE7FFDF26 -:2018C0004EE73DB1012D03D0FFDF022DF9D147E70420C3E70320C1E770B5050005D0224CD9 -:2018E000A078052803D0112070BD102070BD2248F1F744F8E070E078202803D0A56000209F -:20190000A07070BD032070BD174810B5017809B1112010BD817805290CD0817801290BD0E4 -:20192000817849B1012101708178012904D0807810B103E00F2010BDFFF735FE002010BD7C -:2019400070B5094E0446B07808B101280AD1ACB12046FFF738FE98B12078044D90B1B07852 -:2019600001282AD00F2070BDB0010020D41200203D860100FF1FA107231702001020F2E742 -:201980000720F0E701202870207990B100202871607980B104206871A0685230A860E0681C -:2019A000E860E8681A4C6060F1F762F82060022016E00320EBE70320EDE700202870207952 -:2019C000A8B100202871607998B104206871A168F068F0F758FDA860E0685230E8600320FC -:2019E000B0700C49F078F1F78DFA28B903E00320E8E70320EAE7FFDF0020B4E7044810B547 -:201A00001438006900F037F8BDE81040F0F73BBFC4010020D41200201F490968014201D044 -:201A200001207047002070471B49091D0968014201D0012070470020704717491031096827 -:201A4000014201D00120704700207047124914310968014201D0012070470020704710B52A -:201A60000D4C2060201D01600B4810300260001D0360002010BD09490A6848F202139A439D -:201A800002430A607047054A116848F2021301EA030099431160704700060040C806024081 -:201AA00040EA010310B59B070FD1042A0DD310C808C9121F9C42F8D020BA19BA884201D9D2 -:201AC000012010BD4FF0FF3010BD1AB1D30703D0521C07E0002010BD10F8013B11F8014B8A -:201AE0001B1B07D110F8013B11F8014B1B1B01D1921EF1D1184610BD032A40F2308010F08B -:201B0000030C00F0158011F8013BBCF1020F624498BF11F801CB00F8013B38BF11F8013BEC -:201B2000A2F1040298BF00F801CB38BF00F8013B11F0030300F02580083AC0F0088051F867 -:201B4000043B083A51F804CBA0E80810F5E7121D5CBF51F8043B40F8043BAFF30080D2072C -:201B600024BF11F8013B11F801CB48BF11F8012B24BF00F8013B00F801CB48BF00F8012B26 -:201B8000704710B5203AC0F00B80B1E81850203AA0E81850B1E81850A0E81850BFF4F5AFA1 -:201BA0005FEA027C24BFB1E81850A0E8185044BF18C918C0BDE810405FEA827C24BF51F866 -:201BC000043B40F8043B08BF7047D20728BF31F8023B48BF11F8012B28BF20F8023B48BF2C -:201BE00000F8012B70474FF000020429C0F0128010F0030C00F01B80CCF1040CBCF1020F35 -:201C000018BF00F8012BA8BF20F8022BA1EB0C0100F00DB85FEAC17C24BF00F8012B00F84A -:201C2000012B48BF00F8012B70474FF0000200B5134694469646203922BFA0E80C50A0E8EB -:201C40000C50B1F12001BFF4F7AF090728BFA0E80C5048BF0CC05DF804EB890028BF40F872 -:201C6000042B08BF704748BF20F8022B11F0804F18BF00F8012B70477047704770470000C4 -:201C8000FEDF04207146084219D10699124A914215DC069902394878DF2810D10878FE2871 -:201CA00007D0FF280BD14FF001004FF000020B4B184741F201000099019A084B1847084BA7 -:201CC000002B02D01B68DB6818474FF0FF3071464FF00002014B1847003002005510020038 -:201CE00004000020184819497047FFF7FBFFDFF765FA00BD4FF4805015490968884203D1E5 -:201D0000144A13605B68184700BD000020BFFDE74FF480500E490968884210D10E4B1868F1 -:201D20004FF0FF318842F1D080F308884FF02021884204DD0948026802210A43026008489E -:201D4000804708488047FFDFE8120020E812002000000020040000200030020024050040B4 -:201D600039430100F51C020004207146084202D0EFF3098101E0EFF3088188690238007881 -:201D8000102813DB20280FDB2B280BDB0A4A12680A4B9A4203D1602804DB094A10470220AC -:201DA00008607047074A1047074A1047074A12682C32126810470000B0000020BEBAFECAAA -:201DC0001D130000D5070200E3110200040000200D4B0E4908470E4B0C4908470D4B0B4934 -:201DE00008470D4B094908470C4B084908470C4B064908470B4B054908470B4B03490847CB -:201E00000A4B024908470000F9BA0000092F0000812C00001D2B0000AB2A0000232D0000CE -:201E2000391300006728000029BD0000C91100000021016081807047002101604160017237 -:201E400070470A6802600B7903717047599500001B970000779800009B980000D5980000F9 -:201E6000099900004399000081990000D399000031960000A7120000A7120000C140000024 -:201E80000541000025410000E1410000274300000144000031440000F5440000153D0000C5 -:201EA000274700001948000039480000DD15000001160000311500008515000033160000A0 -:201EC000C716000003600000B561000073650000896600000D67000087670000F967000023 -:201EE00015690000E3690000616A0000534800005948000063480000D73C00001F490000EB -:201F0000A13C00005F4A0000B74A00001F4B0000A7120000A7120000A7120000A7240000DA -:201F20002D2500004925000065250000F32600008F25000099250000DB250000FD250000AA -:201F4000D92600001B270000A7120000CF820000F7820000F98200003383000061830000A8 -:201F60004F840000DB840000EF8400003D8500002D860000D1870000F9880000D17200002B -:201F800011890000A7120000A712000049B40000B3B5000007B6000073B6000023B7000010 -:201FA0005100000000000000000000000000000000000000000000000000000000000000D0 -:201FC0000000000000000000000000003E00000000000000000000000000000000000000C3 -:201FE000000000000000000000000000000000000000000000000000500000000000000091 -:202000000000000000000000000000000000000000000000000000000000000000000000C0 -:2020200000000000100110013A0200001A0200040506000013900000F38F0000FFFFFFFFF6 -:202040000000FFFF3BAC00003D390000412000001B730000EB8D00000000000000000200BC -:2020600000000000000200000000000000010000000000006F8000004F800000BD80000062 -:2020800029240000EB2300000B240000A7A70000D3A70000DBA9000021590000DD80000093 -:2020A000000000000D81000077240000000000000000000000000000BDA800000000000092 -:2020C000B359000000000000000000000000000000000000000000000000000000000000F4 -:2020E000000000000000000000000000D5E5000059E60000000000000000000000000000E7 -:2021000059E7000000000000000000000000000049F800000000000000000000000000003E -:2021200005E900005DF4000000000000DDF4000051F500000000000037EE0000D5EE000061 -:202140000000000017F50000D1EF0000C9F100003DF2000041F30000A5EA00000000000007 -:2021600000000000BFE90000000000001FE8000095E70000BDF300007BF60000E9F6000034 -:2021800000000000A7E60000D7E6000007E600000000000021E70000000000000000000000 -:2021A000000000004BF700000000000000000000000000000000000000000000EFEC000002 -:2021C000000000000000000000000000C3E80000C1E700008BE800000000000053E80000FE -:2021E0000000000000000000B3F7000097F800009BFA000017F900003DE9000051FA000090 -:20220000000000004FEB000021EC000061F90000ABF9000007F80000E5F90000F1ED0000BE -:2022200093560000935600009D400000E7AA00009F750000531F000087AA01004BC5010095 -:20224000D9560000D9560000BF40000049AB000023760000C51F0000B5AA01005FC501002B -:20226000D001D001400038005C0024004001F00101000000010000000001020304120F1055 -:202280001100000013000000B10502007F060200D10602001D07020071070200AB000200B5 -:2022A000CD01020035020200590402003B050200750D01008B1E0100000000000600000041 -:2022C0000A0000003200000073000000B4000000B197010045850100235F010077DE0100AE -:2022E000F772010077DE01007D5F010005E00100876B010005E001007B5E010093DF010035 -:20230000C971010093DF01004D630100FFE201007F730100FFE20100555555D6BE898E00FD -:202320000000A606340DC21300004A03EE059208000096041409920D555555252627D6BEA6 -:20234000898EF401FA00960064004B0032001E0014000A0005000200010000002541000056 -:2023600000000000AAAED7AB1541201000000300656C746200000000000000000000000053 -:202380000000000087000000000000000000000000000000BE83605ADB0B376038A5F5AAC2 -:2023A0009183886CB50E0200CD0E0200E50E0200FD0E02002D0F0200550F02007F0F02003D -:2023C000B30F0200150C0200650B0200990C0200150D0200250D0200510D0200A33B010066 -:2023E000AB3B0100B93B01007F0D0200990D02006D0D0200770D0200A50D0200DB0D02002B -:20240000FB0D0200090E0200170E0200270E02003F0E0200570E02006D0E02000000000008 -:20242000F7B800004DB9000063B9000021150200490802000F090200D9180200091902000F -:2024400041190200E93901000D3E01001C0500402005004000100200782402000800002013 -:20246000C401000044110000A8240200CC0100201C110000A01100000118136813024C2094 -:202480001A010222782720FB349B5F801280021E10139F0A1B205C041AE2040128237F01B0 -:0824A00002A329091DFB013113 -:00000001FF diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.pdf deleted file mode 100644 index 1a1a731d3a..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt deleted file mode 100644 index b8d26c9a84..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt +++ /dev/null @@ -1,96 +0,0 @@ -S110/S120/S130/S132/S140 license agreement - - -NORDIC SEMICONDUCTOR ASA SOFTDEVICE LICENSE AGREEMENT - -License Agreement for the Nordic Semiconductor ASA ("Nordic") S110, S120, S130, S132, and S140 Bluetooth SoftDevice software packages -("SoftDevice"). - -You ("You" "Licensee") must carefully and thoroughly read this License Agreement ("Agreement"), and accept to adhere to this Agreement before -downloading, installing and/or using any software or content in the SoftDevice provided herewith. - -YOU ACCEPT THIS LICENSE AGREEMENT BY (A) CLICKING ACCEPT OR AGREE TO THIS LICENSE AGREEMENT, WHERE THIS -OPTION IS MADE AVAILABLE TO YOU; OR (B) BY ACTUALLY USING THE SOFTDEVICE, IN THIS CASE YOU AGREE THAT THE USE OF -THE SOFTDEVICE CONSTITUTES ACCEPTANCE OF THE LICENSING AGREEMENT FROM THAT POINT ONWARDS. - -IF YOU DO NOT AGREE TO BE BOUND BY THE TERMS OF THIS AGREEMENT, THEN DO NOT DOWNLOAD, INSTALL/COMPLETE -INSTALLATION OF, OR IN ANY OTHER WAY MAKE USE OF THE SOFTDEVICE. - -1. Grant of License -Subject to the terms in this Agreement Nordic grants Licensee a limited, non-exclusive, non-transferable, non-sub licensable, revocable license -("License"): (a) to use the SoftDevice solely in connection with a Nordic integrated circuit, and (b) to distribute the SoftDevice solely as integrated -in Licensee Product. Licensee shall not use the SoftDevice for any purpose other than specifically authorized herein. It is a material breach of this -agreement to use or modify the SoftDevice for use on any wireless connectivity integrated circuit other than a Nordic integrated circuit. - -2. Title -Nordic retains full rights, title, and ownership to the SoftDevice and any and all patents, copyrights, trade secrets, trade names, trademarks, and -other intellectual property rights in and to the SoftDevice. - -3. No Modifications or Reverse Engineering -Licensee shall not, modify, reverse engineer, disassemble, decompile or otherwise attempt to discover the source code of any non-source code -parts of the SoftDevice including, but not limited to pre-compiled hex files, binaries and object code. - -4. Distribution Restrictions -Except as set forward in Section 1 above, the Licensee may not disclose or distribute any or all parts of the SoftDevice to any third party. -Licensee agrees to provide reasonable security precautions to prevent unauthorized access to or use of the SoftDevice as proscribed herein. -Licensee also agrees that use of and access to the SoftDevice will be strictly limited to the employees and subcontractors of the Licensee -necessary for the performance of development, verification and production tasks under this Agreement. The Licensee is responsible for making -such employees and subcontractors comply with the obligations concerning use and non-disclosure of the SoftDevice. - -5. No Other Rights -Licensee shall use the SoftDevice only in compliance with this Agreement and shall refrain from using the SoftDevice in any way that may be -contrary to this Agreement. - -6. Fees -Nordic grants the License to the Licensee free of charge provided that the Licensee undertakes the obligations in the Agreement and warrants to -comply with the Agreement. - -7. DISCLAIMER OF WARRANTY -THE SOFTDEVICE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND EXPRESS OR IMPLIED AND NEITHER NORDIC, ITS -LICENSORS OR AFFILIATES NOR THE COPYRIGHT HOLDERS MAKE ANY REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OR -THAT THE SOFTDEVICE WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. THERE -IS NO WARRANTY BY NORDIC OR BY ANY OTHER PARTY THAT THE FUNCTIONS CONTAINED IN THE SOFTDEVICE WILL MEET THE -REQUIREMENTS OF LICENSEE OR THAT THE OPERATION OF THE SOFTDEVICE WILL BE UNINTERRUPTED OR ERROR-FREE. -LICENSEE ASSUMES ALL RESPONSIBILITY AND RISK FOR THE SELECTION OF THE SOFTDEVICE TO ACHIEVE LICENSEE’S -INTENDED RESULTS AND FOR THE INSTALLATION, USE AND RESULTS OBTAINED FROM IT. - - -8. No Support -Nordic is not obligated to furnish or make available to Licensee any further information, software, technical information, know-how, show-how, -bug-fixes or support. Nordic reserves the right to make changes to the SoftDevice without further notice. - -9. Limitation of Liability -In no event shall Nordic, its employees or suppliers, licensors or affiliates be liable for any lost profits, revenue, sales, data or costs of -procurement of substitute goods or services, property damage, personal injury, interruption of business, loss of business information or for any -special, direct, indirect, incidental, economic, punitive, special or consequential damages, however caused and whether arising under contract, -tort, negligence, or other theory of liability arising out of the use of or inability to use the SoftDevice, even if Nordic or its employees or suppliers, -licensors or affiliates are advised of the possibility of such damages. Because some countries/states/jurisdictions do not allow the exclusion or -limitation of liability, but may allow liability to be limited, in such cases, Nordic, its employees or licensors or affiliates’ liability shall be limited to -USD 50. - -10. Breach of Contract -Upon a breach of contract by the Licensee, Nordic and its licensor are entitled to damages in respect of any direct loss which can be reasonably -attributed to the breach by the Licensee. If the Licensee has acted with gross negligence or willful misconduct, the Licensee shall cover both -direct and indirect costs for Nordic and its licensors. - -11. Indemnity -Licensee undertakes to indemnify, hold harmless and defend Nordic and its directors, officers, affiliates, shareholders, licensors, employees and -agents from and against any claims or lawsuits, including attorney's fees, that arise or result of the Licensee’s execution of the License and which -is not due to causes for which Nordic is responsible. - -12. Governing Law -This Agreement shall be construed according to the laws of Norway, and hereby submits to the exclusive jurisdiction of the Oslo tingrett. - -13. Assignment -Licensee shall not assign this Agreement or any rights or obligations hereunder without the prior written consent of Nordic. - -14. Termination -Without prejudice to any other rights, Nordic may cancel this Agreement if Licensee does not abide by the terms and conditions of this -Agreement. Upon termination Licensee must promptly cease the use of the License and destroy all copies of the Licensed Technology and any -other material provided by Nordic or its affiliate, or produced by the Licensee in connection with the Agreement or the Licensed Technology. - -15. Third party beneficiaries -Nordic’s licensors are intended third party beneficiaries under this Agreement. - - diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52840_5.0.0-2.alpha_migration-document.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52840_5.0.0-2.alpha_migration-document.pdf deleted file mode 100644 index 8026762196..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52840_5.0.0-2.alpha_migration-document.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52840_5.0.0-2.alpha_readme.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52840_5.0.0-2.alpha_readme.txt deleted file mode 100644 index 2cce458228..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52840_5.0.0-2.alpha_readme.txt +++ /dev/null @@ -1,10 +0,0 @@ -s140_nrf52840_5.0.0-2.alpha - -This release consists of the following: - -- This readme file -- The s140_nrf52840_5.0.0-2.alpha API (SoftDevice header files) -- The s140_nrf52840_5.0.0-2.alpha license agreement -- The s140_nrf52840_5.0.0-2.alpha release notes -- The s140_nrf52840_5.0.0-2.alpha SoftDevice (binary hex file) -- The s140_nrf52840_5.0.0-2.alpha Migration Document diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52840_5.0.0-2.alpha_release-notes-update-1.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52840_5.0.0-2.alpha_release-notes-update-1.pdf deleted file mode 100644 index 9ffceb9b56..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52840_5.0.0-2.alpha_release-notes-update-1.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_err.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_err.h deleted file mode 100644 index 36d54a0dc0..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_err.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** - @addtogroup BLE_COMMON - @{ - @addtogroup nrf_error - @{ - @ingroup BLE_COMMON - @} - - @defgroup ble_err General error codes - @{ - - @brief General error code definitions for the BLE API. - - @ingroup BLE_COMMON -*/ -#ifndef NRF_BLE_ERR_H__ -#define NRF_BLE_ERR_H__ - -#include "nrf_error.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* @defgroup BLE_ERRORS Error Codes - * @{ */ -#define BLE_ERROR_NOT_ENABLED (NRF_ERROR_STK_BASE_NUM+0x001) /**< @ref sd_ble_enable has not been called. */ -#define BLE_ERROR_INVALID_CONN_HANDLE (NRF_ERROR_STK_BASE_NUM+0x002) /**< Invalid connection handle. */ -#define BLE_ERROR_INVALID_ATTR_HANDLE (NRF_ERROR_STK_BASE_NUM+0x003) /**< Invalid attribute handle. */ -#define BLE_ERROR_NO_TX_PACKETS (NRF_ERROR_STK_BASE_NUM+0x004) /**< Not enough application packets available on this connection. */ -#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x005) /**< Invalid role. */ -#define BLE_ERROR_BLOCKED_BY_OTHER_LINKS (NRF_ERROR_STK_BASE_NUM+0x006) /**< The attempt to change link settings failed due to the scheduling of other links. */ -/** @} */ - - -/** @defgroup BLE_ERROR_SUBRANGES Module specific error code subranges - * @brief Assignment of subranges for module specific error codes. - * @note For specific error codes, see ble_.h or ble_error_.h. - * @{ */ -#define NRF_L2CAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x100) /**< L2CAP specific errors. */ -#define NRF_GAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x200) /**< GAP specific errors. */ -#define NRF_GATTC_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x300) /**< GATT client specific errors. */ -#define NRF_GATTS_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x400) /**< GATT server specific errors. */ -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif - - -/** - @} - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_l2cap.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_l2cap.h deleted file mode 100644 index 90cce565d8..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_l2cap.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** - @addtogroup BLE_L2CAP Logical Link Control and Adaptation Protocol (L2CAP) - @{ - @brief Definitions and prototypes for the L2CAP interface. - */ - -#ifndef BLE_L2CAP_H__ -#define BLE_L2CAP_H__ - -#include "ble_types.h" -#include "ble_ranges.h" -#include "ble_err.h" -#include "nrf_svc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup BLE_L2CAP_DEFINES Defines - * @{ */ - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_L2CAP_H__ - -/** - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf52/nrf_mbr.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf52/nrf_mbr.h deleted file mode 100644 index ccbe96bd59..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf52/nrf_mbr.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/** - @defgroup nrf_mbr_api Master Boot Record API - @{ - - @brief APIs for updating SoftDevice and BootLoader - -*/ - -#ifndef NRF_MBR_H__ -#define NRF_MBR_H__ - -#include "nrf_svc.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup NRF_MBR_DEFINES Defines - * @{ */ - -/**@brief MBR SVC Base number. */ -#define MBR_SVC_BASE (0x18) - -/**@brief Page size in words. */ -#define MBR_PAGE_SIZE_IN_WORDS (1024) - -/** @brief The size that must be reserved for the MBR when a SoftDevice is written to flash. -This is the offset where the first byte of the SoftDevice hex file is written.*/ -#define MBR_SIZE (0x1000) - -/** @} */ - -/** @addtogroup NRF_MBR_ENUMS Enumerations - * @{ */ - -/**@brief nRF Master Boot Record API SVC numbers. */ -enum NRF_MBR_SVCS -{ - SD_MBR_COMMAND = MBR_SVC_BASE, /**< ::sd_mbr_command */ -}; - -/**@brief Possible values for ::sd_mbr_command_t.command */ -enum NRF_MBR_COMMANDS -{ - SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see sd_mbr_command_copy_bl_t*/ - SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ - SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD*/ - SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ - SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Start forwarding all exception to this address @see ::sd_mbr_command_vector_table_base_set_t*/ -}; - -/** @} */ - -/** @addtogroup NRF_MBR_TYPES Types - * @{ */ - -/**@brief This command copies part of a new SoftDevice - * The destination area is erased before copying. - * If dst is in the middle of a flash page, that whole flash page will be erased. - * If (dst+len) is in the middle of a flash page, that whole flash page will be erased. - * - * The user of this function is responsible for setting the BPROT registers. - * - * @retval ::NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly. - * @retval ::NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying. - */ -typedef struct -{ - uint32_t *src; /**< Pointer to the source of data to be copied.*/ - uint32_t *dst; /**< Pointer to the destination where the content is to be copied.*/ - uint32_t len; /**< Number of 32 bit words to copy. Must be a multiple of @ref MBR_PAGE_SIZE_IN_WORDS words.*/ -} sd_mbr_command_copy_sd_t; - - -/**@brief This command works like memcmp, but takes the length in words. - * - * @retval ::NRF_SUCCESS indicates that the contents of both memory blocks are equal. - * @retval ::NRF_ERROR_NULL indicates that the contents of the memory blocks are not equal. - */ -typedef struct -{ - uint32_t *ptr1; /**< Pointer to block of memory. */ - uint32_t *ptr2; /**< Pointer to block of memory. */ - uint32_t len; /**< Number of 32 bit words to compare.*/ -} sd_mbr_command_compare_t; - - -/**@brief This command copies a new BootLoader. - * With this command, destination of BootLoader is always the address written in NRF_UICR->BOOTADDR. - * - * Destination is erased by this function. - * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. - * - * This function will use PROTENSET to protect the flash that is not intended to be written. - * - * On success, this function will not return. It will start the new BootLoader from reset-vector as normal. - * - * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. - * @retval ::NRF_ERROR_FORBIDDEN if NRF_UICR->BOOTADDR is not set. - * @retval ::NRF_ERROR_INVALID_LENGTH if parameters attempts to read or write outside flash area. - * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) - */ -typedef struct -{ - uint32_t *bl_src; /**< Pointer to the source of the Bootloader to be be copied.*/ - uint32_t bl_len; /**< Number of 32 bit words to copy for BootLoader. */ -} sd_mbr_command_copy_bl_t; - -/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR - * - * Once this function has been called, this address is where the MBR will start to forward interrupts to after a reset. - * - * To restore default forwarding this function should be called with @param address set to 0. - * The MBR will then start forwarding to interrupts to the address in NFR_UICR->BOOTADDR or to the SoftDevice if the BOOTADDR is not set. - * - * On success, this function will not return. It will reset the device. - * - * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. - * @retval ::NRF_ERROR_INVALID_ADDR if parameter address is outside of the flash size. - * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) - */ -typedef struct -{ - uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ -} sd_mbr_command_vector_table_base_set_t; - - -typedef struct -{ - uint32_t command; /**< type of command to be issued see @ref NRF_MBR_COMMANDS. */ - union - { - sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ - sd_mbr_command_compare_t compare; /**< Parameters for verify.*/ - sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ - sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ - } params; -} sd_mbr_command_t; - -/** @} */ - -/** @addtogroup NRF_MBR_FUNCTIONS Functions - * @{ */ - -/**@brief Issue Master Boot Record commands - * - * Commands used when updating a SoftDevice and bootloader. - * - * The SD_MBR_COMMAND_COPY_BL and SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires parameters to be - * retained by the MBR when resetting the IC. This is done in a separate flash page - * provided by the application. The UICR register UICR.NRFFW[1] must be set - * to an address corresponding to a page in the application flash space. This page will be cleared - * by the MBR and used to store the command before reset. When the UICR.NRFFW[1] field is set - * the page it refers to must not be used by the application. If the UICR.NRFFW[1] is set to - * 0xFFFFFFFF (the default) MBR commands which use flash will be unavailable and return - * NRF_ERROR_NO_MEM. - * - * @param[in] param Pointer to a struct describing the command. - * - * @note For return values, see ::sd_mbr_command_copy_sd_t ::sd_mbr_command_copy_bl_t ::sd_mbr_command_compare_t ::sd_mbr_command_vector_table_base_set_t - * - * @retval NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF). - * @retval NRF_ERROR_INVALID_PARAM if an invalid command is given. -*/ -SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_MBR_H__ - -/** - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error_sdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error_sdm.h deleted file mode 100644 index 103659a913..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error_sdm.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - /** - @addtogroup nrf_sdm_api - @{ - @defgroup nrf_sdm_error SoftDevice Manager Error Codes - @{ - - @brief Error definitions for the SDM API -*/ - -/* Header guard */ -#ifndef NRF_ERROR_SDM_H__ -#define NRF_ERROR_SDM_H__ - -#include "nrf_error.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN (NRF_ERROR_SDM_BASE_NUM + 0) ///< Unknown LFCLK source. -#define NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION (NRF_ERROR_SDM_BASE_NUM + 1) ///< Incorrect interrupt configuration (can be caused by using illegal priority levels, or having enabled SoftDevice interrupts). -#define NRF_ERROR_SDM_INCORRECT_CLENR0 (NRF_ERROR_SDM_BASE_NUM + 2) ///< Incorrect CLENR0 (can be caused by erroneous SoftDevice flashing). - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_SDM_H__ - -/** - @} - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error_soc.h deleted file mode 100644 index e31d8c9c97..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error_soc.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/** - @addtogroup nrf_soc_api - @{ - @defgroup nrf_soc_error SoC Library Error Codes - @{ - - @brief Error definitions for the SoC library - -*/ - -/* Header guard */ -#ifndef NRF_ERROR_SOC_H__ -#define NRF_ERROR_SOC_H__ - -#include "nrf_error.h" -#ifdef __cplusplus -extern "C" { -#endif - -/* Mutex Errors */ -#define NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN (NRF_ERROR_SOC_BASE_NUM + 0) ///< Mutex already taken - -/* NVIC errors */ -#define NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE (NRF_ERROR_SOC_BASE_NUM + 1) ///< NVIC interrupt not available -#define NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED (NRF_ERROR_SOC_BASE_NUM + 2) ///< NVIC interrupt priority not allowed -#define NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 3) ///< NVIC should not return - -/* Power errors */ -#define NRF_ERROR_SOC_POWER_MODE_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 4) ///< Power mode unknown -#define NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 5) ///< Power POF threshold unknown -#define NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 6) ///< Power off should not return - -/* Rand errors */ -#define NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES (NRF_ERROR_SOC_BASE_NUM + 7) ///< RAND not enough values - -/* PPI errors */ -#define NRF_ERROR_SOC_PPI_INVALID_CHANNEL (NRF_ERROR_SOC_BASE_NUM + 8) ///< Invalid PPI Channel -#define NRF_ERROR_SOC_PPI_INVALID_GROUP (NRF_ERROR_SOC_BASE_NUM + 9) ///< Invalid PPI Group - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_SOC_H__ -/** - @} - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_svc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_svc.h deleted file mode 100644 index 31ea671529..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_svc.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifndef NRF_SVC__ -#define NRF_SVC__ - -#include "stdint.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SVCALL_AS_NORMAL_FUNCTION -#define SVCALL(number, return_type, signature) return_type signature -#else - -#ifndef SVCALL -#if defined (__CC_ARM) -#define SVCALL(number, return_type, signature) return_type __svc(number) signature -#elif defined (__GNUC__) -#ifdef __cplusplus -#define GCC_CAST_CPP (uint16_t) -#else -#define GCC_CAST_CPP -#endif -#define SVCALL(number, return_type, signature) \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wreturn-type\"") \ - __attribute__((naked)) \ - __attribute__((unused)) \ - static return_type signature \ - { \ - __asm( \ - "svc %0\n" \ - "bx r14" : : "I" (GCC_CAST_CPP number) : "r0" \ - ); \ - } \ - _Pragma("GCC diagnostic pop") - -#elif defined (__ICCARM__) -#define PRAGMA(x) _Pragma(#x) -#define SVCALL(number, return_type, signature) \ -PRAGMA(swi_number = (number)) \ - __swi return_type signature; -#else -#define SVCALL(number, return_type, signature) return_type signature -#endif -#endif // SVCALL - -#endif // SVCALL_AS_NORMAL_FUNCTION - -#ifdef __cplusplus -} -#endif -#endif // NRF_SVC__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/hex/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/hex/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt deleted file mode 100644 index b8d26c9a84..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/hex/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt +++ /dev/null @@ -1,96 +0,0 @@ -S110/S120/S130/S132/S140 license agreement - - -NORDIC SEMICONDUCTOR ASA SOFTDEVICE LICENSE AGREEMENT - -License Agreement for the Nordic Semiconductor ASA ("Nordic") S110, S120, S130, S132, and S140 Bluetooth SoftDevice software packages -("SoftDevice"). - -You ("You" "Licensee") must carefully and thoroughly read this License Agreement ("Agreement"), and accept to adhere to this Agreement before -downloading, installing and/or using any software or content in the SoftDevice provided herewith. - -YOU ACCEPT THIS LICENSE AGREEMENT BY (A) CLICKING ACCEPT OR AGREE TO THIS LICENSE AGREEMENT, WHERE THIS -OPTION IS MADE AVAILABLE TO YOU; OR (B) BY ACTUALLY USING THE SOFTDEVICE, IN THIS CASE YOU AGREE THAT THE USE OF -THE SOFTDEVICE CONSTITUTES ACCEPTANCE OF THE LICENSING AGREEMENT FROM THAT POINT ONWARDS. - -IF YOU DO NOT AGREE TO BE BOUND BY THE TERMS OF THIS AGREEMENT, THEN DO NOT DOWNLOAD, INSTALL/COMPLETE -INSTALLATION OF, OR IN ANY OTHER WAY MAKE USE OF THE SOFTDEVICE. - -1. Grant of License -Subject to the terms in this Agreement Nordic grants Licensee a limited, non-exclusive, non-transferable, non-sub licensable, revocable license -("License"): (a) to use the SoftDevice solely in connection with a Nordic integrated circuit, and (b) to distribute the SoftDevice solely as integrated -in Licensee Product. Licensee shall not use the SoftDevice for any purpose other than specifically authorized herein. It is a material breach of this -agreement to use or modify the SoftDevice for use on any wireless connectivity integrated circuit other than a Nordic integrated circuit. - -2. Title -Nordic retains full rights, title, and ownership to the SoftDevice and any and all patents, copyrights, trade secrets, trade names, trademarks, and -other intellectual property rights in and to the SoftDevice. - -3. No Modifications or Reverse Engineering -Licensee shall not, modify, reverse engineer, disassemble, decompile or otherwise attempt to discover the source code of any non-source code -parts of the SoftDevice including, but not limited to pre-compiled hex files, binaries and object code. - -4. Distribution Restrictions -Except as set forward in Section 1 above, the Licensee may not disclose or distribute any or all parts of the SoftDevice to any third party. -Licensee agrees to provide reasonable security precautions to prevent unauthorized access to or use of the SoftDevice as proscribed herein. -Licensee also agrees that use of and access to the SoftDevice will be strictly limited to the employees and subcontractors of the Licensee -necessary for the performance of development, verification and production tasks under this Agreement. The Licensee is responsible for making -such employees and subcontractors comply with the obligations concerning use and non-disclosure of the SoftDevice. - -5. No Other Rights -Licensee shall use the SoftDevice only in compliance with this Agreement and shall refrain from using the SoftDevice in any way that may be -contrary to this Agreement. - -6. Fees -Nordic grants the License to the Licensee free of charge provided that the Licensee undertakes the obligations in the Agreement and warrants to -comply with the Agreement. - -7. DISCLAIMER OF WARRANTY -THE SOFTDEVICE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND EXPRESS OR IMPLIED AND NEITHER NORDIC, ITS -LICENSORS OR AFFILIATES NOR THE COPYRIGHT HOLDERS MAKE ANY REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OR -THAT THE SOFTDEVICE WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. THERE -IS NO WARRANTY BY NORDIC OR BY ANY OTHER PARTY THAT THE FUNCTIONS CONTAINED IN THE SOFTDEVICE WILL MEET THE -REQUIREMENTS OF LICENSEE OR THAT THE OPERATION OF THE SOFTDEVICE WILL BE UNINTERRUPTED OR ERROR-FREE. -LICENSEE ASSUMES ALL RESPONSIBILITY AND RISK FOR THE SELECTION OF THE SOFTDEVICE TO ACHIEVE LICENSEE’S -INTENDED RESULTS AND FOR THE INSTALLATION, USE AND RESULTS OBTAINED FROM IT. - - -8. No Support -Nordic is not obligated to furnish or make available to Licensee any further information, software, technical information, know-how, show-how, -bug-fixes or support. Nordic reserves the right to make changes to the SoftDevice without further notice. - -9. Limitation of Liability -In no event shall Nordic, its employees or suppliers, licensors or affiliates be liable for any lost profits, revenue, sales, data or costs of -procurement of substitute goods or services, property damage, personal injury, interruption of business, loss of business information or for any -special, direct, indirect, incidental, economic, punitive, special or consequential damages, however caused and whether arising under contract, -tort, negligence, or other theory of liability arising out of the use of or inability to use the SoftDevice, even if Nordic or its employees or suppliers, -licensors or affiliates are advised of the possibility of such damages. Because some countries/states/jurisdictions do not allow the exclusion or -limitation of liability, but may allow liability to be limited, in such cases, Nordic, its employees or licensors or affiliates’ liability shall be limited to -USD 50. - -10. Breach of Contract -Upon a breach of contract by the Licensee, Nordic and its licensor are entitled to damages in respect of any direct loss which can be reasonably -attributed to the breach by the Licensee. If the Licensee has acted with gross negligence or willful misconduct, the Licensee shall cover both -direct and indirect costs for Nordic and its licensors. - -11. Indemnity -Licensee undertakes to indemnify, hold harmless and defend Nordic and its directors, officers, affiliates, shareholders, licensors, employees and -agents from and against any claims or lawsuits, including attorney's fees, that arise or result of the Licensee’s execution of the License and which -is not due to causes for which Nordic is responsible. - -12. Governing Law -This Agreement shall be construed according to the laws of Norway, and hereby submits to the exclusive jurisdiction of the Oslo tingrett. - -13. Assignment -Licensee shall not assign this Agreement or any rights or obligations hereunder without the prior written consent of Nordic. - -14. Termination -Without prejudice to any other rights, Nordic may cancel this Agreement if Licensee does not abide by the terms and conditions of this -Agreement. Upon termination Licensee must promptly cease the use of the License and destroy all copies of the Licensed Technology and any -other material provided by Nordic or its affiliate, or produced by the Licensee in connection with the Agreement or the Licensed Technology. - -15. Third party beneficiaries -Nordic’s licensors are intended third party beneficiaries under this Agreement. - - diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/hex/s140_nrf52840_5.0.0-2.alpha_softdevice.hex b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/hex/s140_nrf52840_5.0.0-2.alpha_softdevice.hex deleted file mode 100644 index a45fac6daa..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/hex/s140_nrf52840_5.0.0-2.alpha_softdevice.hex +++ /dev/null @@ -1,8363 +0,0 @@ -:020000040000FA -:1000000000040020E508000079050000C508000094 -:10001000830500008D05000097050000000000002A -:1000200000000000000000000000000009090000BE -:10003000A105000000000000AB050000B5050000B0 -:10004000BF050000C9050000D3050000DD05000064 -:10005000E7050000F1050000FB05000005060000B3 -:100060000F06000019060000230600002D06000000 -:1000700037060000410600004B0600005506000050 -:100080005F06000069060000730600007D060000A0 -:1000900087060000910600009B060000A5060000F0 -:1000A000AF060000B9060000C3060000CD06000040 -:1000B000D7060000E1060000EB060000F506000090 -:1000C000FF06000009070000130700001D070000DD -:1000D00027070000310700003B070000450700002C -:1000E0004F07000059070000630700006D0700007C -:1000F00077070000810700008B07000095070000CC -:100100009F0700001FB500F003F88DE80F001FBD2A -:1001100000F0DEBB1FB56FF00100009040100390AF -:10012000029001904FF010208069000B420900F00E -:100130001F045DF822300120A04083434DF8223097 -:10014000684600F044F91FBDF0B54FF6FF734FF459 -:10015000B4751A466E1E11E0A94201D3344600E080 -:100160000C46091B30F8027B641E3B441A44F9D14B -:100170009CB204EB134394B204EB12420029EBD17E -:1001800098B200EB134002EB124140EA0140F0BD8F -:10019000DD4992B00446D1E90001CDE91001FF220A -:1001A0004021684600F03AFB94E80F008DE80F000C -:1001B000684610A902E004C841F8042D8842FAD12B -:1001C00010216846FFF7C0FF1090AA208DF8440068 -:1001D000FFF7A0FF00F0F2F84FF01024A069102202 -:1001E0006946803000F001F9A069082210A900F0EA -:1001F000FCF800F0D7F84FF080510A6949690068AF -:100200004A43824201D8102070470020704710B541 -:10021000D0E900214FF0805002EB8103026944696C -:100220006243934209D84FF01022536903EB8103D4 -:100230000169406941438B4201D9092010BD5069D1 -:10024000401C01D0002010BD0F2010BD70B501680A -:100250000446AE4D4FF01020062951D2DFE801F0E0 -:10026000320318283B1DD4E90265646829463046EC -:1002700000F0CDF82A462146304600F0B6F8AA0034 -:100280002146304600F09EFA002800D0032070BDC1 -:1002900000F050FB4FF4805007E0201DFFF7ABFF4C -:1002A0000028F4D100F046FB60682860002070BD93 -:1002B000241D94E80700920000F084FA0028F6D08C -:1002C0000E2070BD8069401C12D0201DFFF79FFFDB -:1002D0000028F6D109E08069401C09D0201DFFF7F5 -:1002E0008AFF0028EDD1606820B12046FFF750FF5B -:1002F000042070BDFFF70EFF00F060F800F052F828 -:10030000072070BD10B50C46182802D001200860E7 -:1003100010BD2068FFF79AFF206010BD4FF0102439 -:10032000A069401C05D0A569A66980353079AA2846 -:1003300008D06069401C2DD060690068401C29D03D -:1003400060692CE010212846FFF7FEFE31688142EB -:100350001CD1A16901F18002C03105E030B108CAA9 -:1003600051F8040D984201D1012000E000208A429A -:10037000F4D158B1286810B1042803D0FEE728460C -:1003800000F057F861496868086008E000F016F866 -:1003900000F008F84FF480500168491C01D000F0CB -:1003A000A3FAFEE7BFF34F8F59480168594A01F499 -:1003B000E06111430160BFF34F8FFEE74FF0102063 -:1003C0008169491C02D0806900F0ADB87047524A7B -:1003D00001681160121D416811604F4A8168103236 -:1003E0001160111DC068086070472DE9F041174683 -:1003F0000D460646002406E03046296800F0A6F8BF -:10040000641C2D1D361DBC42F6D3BDE8F08170B5CD -:100410000C4605464FF4806608E0284600F083F855 -:10042000B44205D3A4F5806405F58055002CF4D1C1 -:1004300070BD4168044609B1012500E000254FF078 -:1004400010267069A268920000F0BCF9C8B120467D -:1004500000F01AF89DB17669A56864684FF4002031 -:1004600084420AD2854208D229463046FFF7CFFFA0 -:100470002A4621463046FFF7B8FFFFF79FFFFFF7F8 -:1004800091FFFFF747FEF8E72DE9FF414FF01024F9 -:10049000616980680D0B01EB800000F6FF70010BB5 -:1004A00000200090019002900246039068460123CC -:1004B0000BE0560902F01F0C50F8267003FA0CFCF2 -:1004C00047EA0C0740F82670521CAA42F1D30AE012 -:1004D0004A0901F01F0650F8225003FA06F6354388 -:1004E00040F82250491C8029F2D3A169090B4A091E -:1004F00001F01F0150F822408B409C4340F82240FD -:10050000FFF765FFBDE8FF815809000000000020EB -:100510000CED00E00400FA050006004014480168F4 -:100520000029FCD07047134A0221116010490B6862 -:10053000002BFCD00F4B1B1D186008680028FCD056 -:100540000020106008680028FCD07047094B10B5E7 -:1005500001221A60064A1468002CFCD00160106861 -:100560000028FCD00020186010680028FCD010BDC6 -:1005700000E4014004E5014008208F49096809585A -:10058000084710208C4909680958084714208A49EF -:100590000968095808471820874909680958084711 -:1005A0003020854909680958084738208249096878 -:1005B000095808473C2080490968095808474020E5 -:1005C0007D4909680958084744207B49096809584A -:1005D0000847482078490968095808474C20764957 -:1005E000096809580847502073490968095808479D -:1005F0005420714909680958084758206E4909680C -:10060000095808475C206C49096809580847602068 -:100610006949096809580847642067490968095801 -:100620000847682064490968095808476C206249EE -:1006300009680958084770205F4909680958084740 -:1006400074205D4909680958084778205A490968A3 -:10065000095808477C2058490968095808478020EC -:1006600055490968095808478420534909680958B9 -:100670000847882050490968095808478C204E4986 -:1006800009680958084790204B49096809580847E4 -:10069000942049490968095808479820464909683B -:1006A000095808479C204449096809580847A02070 -:1006B0004149096809580847A4203F490968095871 -:1006C0000847A8203C49096809580847AC203A491E -:1006D000096809580847B020374909680958084788 -:1006E000B4203549096809580847B82032490968D3 -:1006F00009580847BC203049096809580847C020F4 -:100700002D49096809580847C4202B490968095828 -:100710000847C8202849096809580847CC202649B5 -:10072000096809580847D02023490968095808472B -:10073000D4202149096809580847D8201E4909686A -:1007400009580847DC201C49096809580847E02077 -:100750001949096809580847E420174909680958E0 -:100760000847E8201449096809580847EC2012494D -:10077000096809580847F0200F49096809580847CF -:10078000F4200D49096809580847F8200A49096802 -:1007900009580847FC2008490968095808475FF4C8 -:1007A0008070054909680958084700000348044952 -:1007B000024A034B70470000000000206809000057 -:1007C0006809000040EA010310B59B070FD1042A15 -:1007D0000DD310C808C9121F9C42F8D020BA19BA0C -:1007E000884201D9012010BD4FF0FF3010BD1AB171 -:1007F000D30703D0521C07E0002010BD10F8013BC6 -:1008000011F8014B1B1B07D110F8013B11F8014BEC -:100810001B1B01D1921EF1D1184610BD02F0FF033F -:1008200043EA032242EA024200F005B870477047EB -:1008300070474FF000020429C0F0128010F0030C42 -:1008400000F01B80CCF1040CBCF1020F18BF00F8C3 -:10085000012BA8BF20F8022BA1EB0C0100F00DB872 -:100860005FEAC17C24BF00F8012B00F8012B48BFD0 -:1008700000F8012B70474FF0000200B51346944674 -:100880009646203922BFA0E80C50A0E80C50B1F1E8 -:100890002001BFF4F7AF090728BFA0E80C5048BFFC -:1008A0000CC05DF804EB890028BF40F8042B08BF9A -:1008B000704748BF20F8022B11F0804F18BF00F896 -:1008C000012B7047014B1B68DB68184700000020B4 -:1008D00009480A497047FFF7FBFFFFF713FC00BD0B -:1008E00020BFFDE7064B1847064A1060016881F3F8 -:1008F0000888406800470000680900006809000097 -:100900001D030000000000201EF0040F0CBFEFF3D9 -:100910000881EFF30981886902380078182803D12B -:1009200000E00000074A1047074A12682C3212689C -:100930001047000000B5054B1B68054A9B589847B7 -:1009400000BD000005030000000000205409000065 -:1009500004000000001000000000000000FFFFFF86 -:040960000090D00330 -:101000009012002091090200452F0000FF08020005 -:10101000452F0000452F0000452F00000000000074 -:10102000000000000000000000000000E9090200CC -:10103000452F000000000000452F0000452F000054 -:10104000510A0200570A0200452F0000452F0000F8 -:10105000452F0000452F0000452F0000452F0000C0 -:101060005D0A0200452F0000452F0000630A0200C0 -:10107000452F0000690A02006F0A0200750A02008B -:10108000452F0000452F0000452F0000452F000090 -:10109000452F0000452F0000452F0000452F000080 -:1010A000452F00007B0A0200452F0000452F00005D -:1010B000452F0000452F0000452F0000452F000060 -:1010C000810A0200452F0000452F0000452F000037 -:1010D000452F0000452F0000452F0000452F000040 -:1010E000452F0000452F0000452F0000452F000030 -:1010F000452F0000452F0000452F0000452F000020 -:10110000452F0000452F000000F002F81FF02DFCD5 -:101110000AA090E8000C82448344AAF10107DA4552 -:1011200001D11FF022FCAFF2090EBAE80F0013F054 -:10113000010F18BFFB1A43F0010318476CFF0100B1 -:101140008CFF01000A4410F8014B14F00F0508BF92 -:1011500010F8015B240908BF10F8014B6D1E05D083 -:1011600010F8013B6D1E01F8013BF9D1641E03D05C -:10117000641E01F8015BFBD19142E4D3704700008B -:101180000023002400250026103A28BF78C1FBD890 -:10119000520728BF30C148BF0B6070471FB500F031 -:1011A0003DF88DE80F001FBD1EF0040F0CBFEFF3DC -:1011B0000880EFF30980014A104700009F2E0000CD -:1011C0008269034981614FF00100104470470000BB -:1011D000D511000001B41EB400B511F0BFFC01B47C -:1011E0000198864601BC01B01EBD0000F0B4404627 -:1011F000494652465B460FB402A0013001B506488D -:10120000004700BF01BC86460FBC80468946924617 -:101210009B46F0BC70470000091100001FF0A2BB04 -:1012200070B51A4C054609202070A01C00F05FF82C -:101230005920A08029462046BDE8704008F0B2B889 -:1012400008F0BBB870B50C461149097829B1A0F176 -:101250006001512908D3012013E0602804D06928D7 -:1012600002D043F201000CE020CC0A4E94E80E00BC -:1012700006EB8000A0F58050241FD0F8806E284631 -:10128000B047206070BD01207047000008000020BA -:101290001C000020CC0A020010B5044600210120E9 -:1012A00000F03BF800210B2000F037F80421192052 -:1012B00000F033F804210D2000F02FF804210E2057 -:1012C00000F02BF804210F2000F027F80421C84378 -:1012D00000F023F80721162000F01FF80721152041 -:1012E00000F01BF82046FFF79BFF002010BD962161 -:1012F00001807047FFF7A4BF10487047104A10B52F -:1013000014680F4B0F4A08331A60FFF79BFF0C4815 -:10131000001D046010BD704770474907090E002882 -:1013200006DA00F00F0000F1E02080F8141D70478D -:1013300000F1E02080F800147047000003F900423B -:101340001005024001000001FE48002101604160DB -:10135000018170472DE9F743044692B091464068F9 -:1013600011F0B0FE40B1606811F0B5FE20B96078B0 -:1013700000F00300022801D0012000E00020F14E1F -:101380004D463072484611F059FE18B1102015B084 -:10139000BDE8F0832946012001F02EFF0028F6D198 -:1013A00001258DF842504FF4C050ADF840000022A6 -:1013B00010A9284606F09BFC0028E8D18DF8425081 -:1013C0004FF428504FF00008ADF8400047461C216C -:1013D0006846CDF81C801FF06AFA9DF81C0008AA28 -:1013E00020F00F00401C20F0F00010308DF81C00A1 -:1013F00020788DF81D0061789DF81E0061F3420091 -:1014000040F001008DF81E009DF800000AA940F090 -:1014100002008DF800002089ADF83000ADF8327080 -:10142000608907AFADF834000B97606810AC0E9080 -:101430000A94684606F04EFA0028A8D1BDF82000AC -:1014400030808DF8425042F60120ADF840009DF802 -:101450001E0008AA20F00600801C20F001008DF874 -:101460001E000220ADF83000ADF8340013A80E9035 -:101470000AA9684606F02EFA002888D1BDF8200097 -:101480007080311D484600F033F9002887D18DF86F -:10149000425042F6A620ADF840001C216846CDF827 -:1014A0001C801FF004FA9DF81C00ADF8345020F0A9 -:1014B0000F00401C20F0F00010308DF81C009DF84B -:1014C0001D0008AA20F0FF008DF81D009DF81E00E9 -:1014D0000AA920F0060040F00100801C8DF81E00D3 -:1014E0009DF800008DF8445040F002008DF8000097 -:1014F000CDE90A4711A80E90ADF83050684606F0C5 -:10150000E9F9002899D1BDF82000F08000203EE7DD -:101510003EB504460820ADF80000204611F08EFDCF -:1015200008B110203EBD2146012001F065FE0028D3 -:10153000F8D12088ADF804006088ADF80600A088D6 -:10154000ADF80800E088ADF80A007E4801AB6A46B5 -:101550008088002106F0C8FDBDF800100829E1D000 -:1015600003203EBD1FB50446002002900820ADF8C0 -:101570000800CDF80CD0204611F060FD10B110200D -:1015800004B010BD6F4802AA81884FF6FF7007F0C3 -:1015900047F80028F4D1BDF80810082901D003202D -:1015A000EEE7BDF800102180BDF802106180BDF8A3 -:1015B0000410A180BDF80610E180E1E701B582B01A -:1015C0000220ADF800005F4802AB6A464088002167 -:1015D00006F08AFDBDF80010022900D003200EBDE0 -:1015E0001CB5002100910221ADF80010019011F00E -:1015F0004BFD08B110201CBD52486A4641884FF689 -:10160000FF7007F00DF8BDF800100229F3D0032099 -:101610001CBDFEB54B4C06461546207A0F46C0074A -:1016200005D0084611F00AFD18B11020FEBD0F20AC -:10163000FEBDF82D01D90C20FEBD304611F0FEFC98 -:1016400018BB208801A905F04AFE0028F4D13078A3 -:101650008DF80500208801A906F024FD0028EBD1B3 -:1016600000909DF800009DF8051040F002008DF8F4 -:101670000000090703D040F008008DF80000208822 -:10168000694606F0ACFC0028D6D1ADF80850208899 -:101690003B4602AA002106F027FDBDF80810A9422A -:1016A000CAD00320FEBD7CB5054600200090019005 -:1016B0000888ADF800000C462846019511F002FD9F -:1016C00018B9204611F0E0FC08B110207CBD15B11E -:1016D000BDF8000050B11B486A4601884FF6FF7004 -:1016E00006F09EFFBDF8001021807CBD0C207CBD63 -:1016F00030B593B0044600200D460090142101A897 -:101700001FF0D5F81C2108A81FF0D1F89DF80000A3 -:10171000CDF808D020F00F00401C20F0F000103071 -:101720008DF800009DF8010020F0FF008DF8010009 -:101730009DF8200040F002008DF8200001208DF877 -:10174000460001E0CE01002042F60420ADF844003E -:1017500011A801902088ADF83C006088ADF83E00EB -:10176000A088ADF84000E088ADF842009DF8020086 -:1017700006AA20F00600801C20F001008DF802006F -:101780000820ADF80C00ADF810000FA8059001A9D5 -:1017900008A806F09FF8002803D1BDF8180028809B -:1017A000002013B030BD0000F0B5007B059F1E4641 -:1017B00014460D46012800D0FFDF0C2030803A206F -:1017C0003880002C08D0287A052806D0287B0128EC -:1017D00000D0FFDF17206081F0BDA889FBE72DE96D -:1017E000F04786B0144691F80C900E9A0D46B9F168 -:1017F000010F0BD01021007B2E8A8846052807D0C8 -:10180000062833D0FFDF06B0BDE8F0870221F2E7FB -:10181000E8890C2100EB400001EB400018803320E8 -:101820001080002CEFD0E889608100271AE0009634 -:10183000688808F1020301AA696900F0B2FF06EBAB -:101840000800801C07EB470186B204EB4102BDF89B -:10185000040090810DF1060140460E320FF09AFD12 -:101860007F1CBFB26089B842E1D8CCE73420108039 -:10187000E889B9F1010F11D0122148430E301880C8 -:10188000002CC0D0E88960814846B9F1010F00D032 -:101890000220207300270DF1040A1FE00621ECE767 -:1018A0000096688808F1020301AA696900F079FFCF -:1018B00006EB0800801C86B2B9F1010F12D007EBCD -:1018C000C70004EB4000BDF80410C18110220AF1EA -:1018D000020110301EF052FF7F1CBFB26089B84277 -:1018E000DED890E707EB470104EB4102BDF80400A6 -:1018F000D0810AF10201404610320FF04BFDEBE7B8 -:101900002DE9F0470E4688B090F80CC096F80C8090 -:10191000378AF5890C20109902F10C044FF0000A67 -:10192000BCF1030F08D0BCF1040F3ED0BCF1070F8F -:101930007DD0FFDF08B067E705EB850C00EB4C00BE -:10194000188031200880002AF4D0A8F1060000F0A9 -:10195000FF09558125E0182101A81EF0A8FF009776 -:101960007088434601AA716900F01BFFBDF80400AE -:101970002080BDF80600E080BDF808002081A21C90 -:101980000DF10A0148460FF005FDB9F1000F00D036 -:1019900018B184F804A0A4F802A007EB080087B2ED -:1019A0000A346D1EADB2D6D2C4E705EB850C00EB50 -:1019B0004C00188032200880002ABBD0A8F1050016 -:1019C00000F0FF09558137E000977088434601AA6F -:1019D000716900F0E6FE9DF80600BDF80410E18094 -:1019E0002179420860F3000162F34101820862F349 -:1019F0008201C20862F3C301020962F304114209C1 -:101A000062F34511820962F386112171C009607188 -:101A1000BDF80700208122460DF1090148460FF06C -:101A2000B9FC18B184F802A0A4F800A000E007E017 -:101A300007EB080087B20A346D1EADB2C4D279E755 -:101A4000A8F1020084B205FB08F000F10E0CA3F827 -:101A500000C035230B80002AA6D0558194810097C1 -:101A600083B270880E32716900F09BFE62E72DE947 -:101A7000F84F1E460A9D0C4681462AB1607A00F551 -:101A80008070D080E089108199F80C000C274FF00D -:101A900000084FF00E0A0D2873D2DFE800F09E0711 -:101AA0000E1C28303846556A737373002146484629 -:101AB0000095FFF779FEBDE8F88F207B9146082856 -:101AC00002D0032800D0FFDF378030200AE000BFBB -:101AD000A9F80A80EFE7207B9146042800D0FFDFB9 -:101AE000378031202880B9F1000FF1D1E3E7207B66 -:101AF0009146042800D0FFDF37803220F2E7207BB8 -:101B00009146022800D0FFDF37803320EAE7207BB0 -:101B10001746022800D0FFDF3420A6F800A0288056 -:101B2000002FC8D0A7F80A80C5E7207B17460428F5 -:101B300000D0FFDF3520A6F800A02880002FBAD003 -:101B40004046A7F80A8012E0207B1746052802D0FD -:101B5000062800D0FFDF1020308036202880002F9C -:101B6000A9D0E0897881A7F80E80B9F80E00B88175 -:101B7000A1E7207B9146072800D0FFDF3780372080 -:101B8000B0E72AE04FF0120018804FF0380017003D -:101B9000288090D0E0897881A7F80E80A7F810807F -:101BA00099F80C000A2805D00B2809D00C280DD074 -:101BB000FFDF80E7207B0C2800D0FFDF01200AE058 -:101BC000207B0D2800D0FFDF042004E0207B0E28BE -:101BD00000D0FFDF052038736DE7FFDF6BE770B5DE -:101BE0000C46054601F07BFA20B10078222804D289 -:101BF000082070BD43F2020070BD052128460DF09B -:101C000059FF206008B1002070BD032070BD38B5B9 -:101C10000546DDE905011446049A72B10B460090B1 -:101C20000422214628460AF0CFFE032C06D1214685 -:101C30002846BDE838400BF097B8198038BD2DE92B -:101C4000FF4F85B0002003900898904689461230D7 -:101C500008F061FB401D20F00306089828B908A988 -:101C60000598FFF7BCFF002861D1B9F1000F06D03D -:101C70000898017B00295FD10525046829E098F8C0 -:101C80000000092803D00F2820D0FFDF54E0089A75 -:101C900003255168527B48887243824246D901F13C -:101CA000040B098897B20C181FFA86FABC4200D3BD -:101CB000E41B5044B84200D9FFDF04EB0A00B842ED -:101CC00000D9FFDF5C440020208002E0089C04254E -:101CD00008340CB1208810B1032D27D02CE00898CF -:101CE0000121123008F04FFBADF81000024603ABA3 -:101CF000294605980AF059FD070001D1A01C039060 -:101D000008983A461230C8F804000598A8F802006E -:101D100004A94046039B08F043FBC0B1072814D236 -:101D2000DFE800F0080A1313110C0E00132009B0AD -:101D3000BDE8F08F0020FAE71120F8E70820F6E769 -:101D400043F20300F3E70720F1E70320EFE7BDF8D4 -:101D5000100003990097CDE9011023462A460899FF -:101D60000598FFF754FFC7B9032D16D10898B7B2ED -:101D70004568407B704384B2298868880E18A64263 -:101D800000D3361B3844A04200D9FFDFF019A0422F -:101D900000D9FFDF688838446880B9F1000FC9D0E6 -:101DA000089981F80C90C5E72DE9FF4791461A88FC -:101DB0001C468A4680460AB303AB49460AF0F5FC46 -:101DC00005001BD04046A61C27880DF090FF324628 -:101DD000072629463B4600960DF016FC20880399FD -:101DE0000095CDE9011023464A4651464046FFF78B -:101DF0000EFF00202080012004B005E50020FBE755 -:101E000010B586B01C46AAB104238DF800301388A3 -:101E1000ADF808305288ADF80A208A788DF80E2087 -:101E20000988ADF80C1000236A462146FFF707FF2A -:101E300006B010BD1020FBE770B50D4605210DF072 -:101E400039FE040000D1FFDF294604F11200BDE88D -:101E5000704008F081BA2DE9F8430D46804600260F -:101E600007F053FB0446287812287BD2DFE800F005 -:101E70007A54543C355632321332323209323232CD -:101E800032322879001FC0B2022801D0102810D1A8 -:101E900014BBFFDF35E004B9FFDF052140460DF03C -:101EA00009FE007B032806D004280BD0072828D081 -:101EB000FFDF072657E02879801FC0B2022820D014 -:101EC00050B1F6E72879401FC0B2022819D0102877 -:101ED00017D0EEE704B9FFDF13E004B9FFDF28797C -:101EE00001280ED1172139E0052140460DF0E2FD11 -:101EF000070000D1FFDF07F11201404608F003FAA6 -:101F00002CB12A462146404600F05BFC2BE0132111 -:101F1000404602F08AFC26E0FFDF24E004B9FFDF40 -:101F2000052140460DF0C6FD060000D1FFDF6946E1 -:101F300006F1120008F0F1F9060000D0FFDFA988D1 -:101F4000172901D2172200E00A46BDF8000082429C -:101F500002D9014602E005E01729C3D3404600F04C -:101F600046FCCEE7FFDF3046BDE8F883401D20F099 -:101F70000300021D01FB0020704708B1FE4A1060FB -:101F80000CF041BF2DE9F0470E461546242130469E -:101F90001EF08DFC05B9FFDFA87870732888DFF884 -:101FA000D8A3401D20F0030195F802900C46DAF802 -:101FB00000000CF03FFF070000D1FFDF4FF00008EA -:101FC0003760A7F8008004FB09F4211DDAF800004F -:101FD0000CF030FF040000D1FFDF7460C4F8008013 -:101FE000298806F11200BDE8F04708F07EB92DE916 -:101FF000F047804601F112000D46814608F08BF94A -:10200000401DDD4E20F003046F7B224629683068B6 -:102010000CF039FF7C43221D696830680CF033FFF7 -:1020200005200DF0F1FC044605200DF0F5FC201A0A -:10203000012802D130680CF0EEFE49464046BDE86A -:10204000F04708F067B970B5054605210DF032FD7F -:10205000040000D1FFDF04F112012846BDE8704002 -:1020600008F051B92DE9F04F91B04FF0000BADF8E9 -:1020700034B0ADF804B047880C46054692460521B9 -:1020800038460DF017FD060000D1FFDF24B1A78010 -:10209000A4F806B0A4F808B0297809220B20B2EB06 -:1020A000111F297A7DD104F110023827C91E4FF083 -:1020B0000C094FF0010803920F2973D2DFE801F0F9 -:1020C000F4F3F28108D48A8FA13DDDF5F0B8B800B1 -:1020D000307B022800D0FFDFA88909EBC001ADF8F2 -:1020E00004103021ADF83410002C25D06081B5F8F3 -:1020F0000E9000271DE004EBC708317C88F80E1015 -:10210000F189A8F80C10CDF800906888042304AA7F -:10211000296900F046FBBDF81010A8F8101009F16D -:102120000400BDF812107F1C1FFA80F9A8F81210E5 -:10213000BFB26089B842DED80CE1307B022800D003 -:10214000FFDFE98909EBC100ADF804003020ADF8EC -:102150003400287B0A90001FC0B20F90002CEBD0F7 -:102160006181B5F81090002727E000BFCDF80090FE -:102170006888696903AA0A9B00F013FB0A9904EBBB -:10218000C70809EB01001FFA80F908F10C0204A945 -:102190000F980FF0FFF818B188F80EB0A8F80CB03F -:1021A00001E0D4E0D1E0BDF80C10A8F81010BDF8A3 -:1021B0000E107F1CA8F81210BFB26089B842D5D8A3 -:1021C000C8E00DA8009001AB224629463046FFF733 -:1021D00006FBBFE0307B082805D0FFDF03E0307B43 -:1021E000082800D0FFDFE8891030ADF80400362061 -:1021F000ADF83400002C3FD0A9896181F189A1811B -:1022000027E0307B092800D0FFDFA88900F10C010E -:10221000ADF804103721ADF83410002C2CD06081BB -:10222000E8890090AB89688804F10C02296956E0BE -:10223000E8893921103080B2ADF80400ADF83410CF -:10224000002C74D0A9896181287A10280AD0022133 -:102250002173E989E181288A0090EB89688869699E -:10226000039A3CE00121F3E70DA8009001AB224660 -:1022700029463046FFF744FB6CE0307B0A2800D04B -:10228000FFDF1220ADF80400ADF834704CB3A9891B -:102290006181A4F810B0A4F80EB084F80C8059E065 -:1022A00020E002E031E039E042E0307B0B2800D052 -:1022B000FFDF288AADF834701230ADF8040084B125 -:1022C00004212173A9896181E989E181298A218217 -:1022D000688A00902B8A688804F11202696900F00C -:1022E00060FA37E0307B0C2800D0FFDF1220ADF819 -:1022F0000400ADF834703CB305212173A4F80AB092 -:10230000A4F80EB0A4F810B024E00DA8009001AB22 -:10231000224629463046FFF747FA1BE00DA80090F9 -:1023200001AB224629463046FFF7A1FB12E035E01B -:102330003B21ADF80400ADF834107CB3A4F806805E -:10234000A4F808B084F80AB004E0FFDF02E0012935 -:102350001BD0FFDFBDF80400AAF8000094B1BDF85F -:1023600034002080BDF804006080BDF834003928B6 -:1023700008D03B2806D001E0100000203C2801D006 -:1023800086F80CB0002011B0D2E43C21ADF8040076 -:10239000ADF8341014B1697AA172DBE7FFE7AAF84F -:1023A0000000EFE72DE9F84356880F4680461546B2 -:1023B000052130460DF07EFB040000D1FFDF123412 -:1023C00000943B46414630466A6808F0A3F9CBE5E5 -:1023D00070B50D4605210DF06DFB040000D1FFDF47 -:1023E000294604F11200BDE8704007F0A1BF70B5A6 -:1023F0000D4605210DF05EFB040000D1FFDF2946EC -:1024000004F11200BDE8704007F0C5BF70B5054685 -:1024100005210DF04FFB040000D1FFDF04F108039C -:1024200021462846BDE870400422BDE470B505464B -:1024300005210DF03FFB040000D1FFDF21462846B7 -:102440002368BDE870400522AEE42DE9F0478246DE -:1024500005210DF02FFB040000D1FFDF04F1120075 -:1024600007F059FF401D20F0030626E0011D0088FB -:102470000322431821465046FFF796FC002820D03F -:10248000607B656870431FFA80F82888B7B2814680 -:1024900010FA86F080B22880404502D3A0EB0800F5 -:1024A00028806888B84200D2FFDF09EB0701414568 -:1024B00000D9FFDF6888C01B6880606841880029F8 -:1024C000D4D1BDE8F08770B50E46054607F01DF87B -:1024D000040000D1FFDF0120207266726580207841 -:1024E00020F00F00C01C20F0F00030302070BDE85C -:1024F000704007F00DB82DE9F0438BB00D4614463F -:10250000814606A9FFF76BFB002814D14FF6FF7632 -:1025100001274FF420588CB103208DF800001020C3 -:10252000ADF8100007A8059007AA204604A90EF0F0 -:1025300050FF78B107200BB0BDE8F0830820ADF85C -:1025400008508DF80E708DF80000ADF80A60ADF8F7 -:102550000C800CE00698A17801742188C1818DF867 -:102560000E70ADF80850ADF80C80ADF80A606A4600 -:1025700002214846069BFFF762FBDCE708B5012213 -:102580008DF8022042F60202ADF800200A4603232D -:102590006946FFF735FC08BD08B501228DF8022019 -:1025A00042F60302ADF800200A4604236946FFF70D -:1025B00027FC08BD00B587B079B102228DF8002054 -:1025C0000A88ADF808204988ADF80A1000236A4649 -:1025D0000521FFF734FB07B000BD1020FBE709B170 -:1025E00007230DE40720704770B588B00D461446E8 -:1025F000064606A9FFF7F3FA00280ED17CB10620A3 -:10260000ADF808508DF80000ADF80A40069B6A4608 -:102610000821DC813046FFF712FB08B070BD0520B1 -:102620008DF80000ADF80850F0E700B587B059B15B -:1026300007238DF80030ADF80820039100236A4687 -:102640000921FFF7FCFAC6E71020C4E770B588B08F -:102650000C460646002506A9FFF7C1FA0028DCD182 -:1026600006980121123007F08EFE9CB121780629D0 -:1026700021D2DFE801F0200505160318801E80B284 -:10268000C01EE28880B20AB1A3681BB1824203D99E -:102690000C20C2E71020C0E7042904D0A08850B95C -:1026A00001E00620B9E7012913D0022905D0042949 -:1026B0001CD005292AD00720AFE709208DF800009B -:1026C0006088ADF80800E088ADF80A00A0680390C3 -:1026D00023E00C208DF800006088ADF80800E08849 -:1026E000ADF80A00A0680A25039016E00D208DF8C9 -:1026F00000006088ADF80800A088ADF80A00E08806 -:10270000ADF80C00A0680B25049006E00E208DF8B3 -:10271000000060788DF808000C256A46294630468E -:10272000069BFFF78CFA78E700B587B00F228DF88B -:102730000020ADF8081000236A461946FFF77FFA1B -:1027400049E700B587B071B102228DF800200A88F0 -:10275000ADF808204988ADF80A1000236A46062122 -:10276000FFF76DFA37E7102035E770B586B00646FB -:1027700001200D46ADF808108DF800000146002339 -:102780006A463046FFF75BFA040008D12946304616 -:1027900005F0C4FC0021304605F0DEFC204606B002 -:1027A00070BDF8B51C4615460E46069F0DF08DFA15 -:1027B0002346FF1DBCB231462A4600940CF0EBFEC6 -:1027C000F8BD10B548800878144620F00F00C01CF2 -:1027D00020F0F00090300B4608701822214603F1DB -:1027E00008001EF010F8BDE8104006F091BE70B56C -:1027F0000C460546FFF720FB2146284605F09DFCC8 -:102800002846BDE87040012105F0A6BC4FF0E0224B -:102810004FF400410020C2F880112049087020497F -:1028200090020860704730B51C4D04462878A042DD -:1028300018BF002C02D0002818BFFFDF2878A04264 -:1028400008BF30BD2C701749154A0020ECB1164D59 -:10285000DFF858C0131F012C0DD0022C1CBFFFDF66 -:1028600030BD086003200860CCF800504FF4000031 -:102870001060186030BD086002200860CCF800507D -:102880004FF040701060186030BD086008604FF075 -:102890006070106030BD00B5FFDF00BD1800002083 -:1028A00008F5014000F500401C03002014F500402D -:1028B00070B50B2000F0B5F9082000F0B2F9002146 -:1028C0000B2000F0C4F90021082000F0C0F9EC4C06 -:1028D00001256560A5600020C4F84001C4F84401EA -:1028E000C4F848010B2000F0A7F9082000F0A4F973 -:1028F0000B2000F08BF9256070BD10B50B2000F0A7 -:1029000090F9082000F08DF9DD48012141608160D7 -:10291000DC490A68002AFCD10021C0F84011C0F847 -:102920004411C0F848110B2000F086F9BDE81040B2 -:10293000082000F081B910B50B2000F07DF9BDE84A -:102940001040082000F078B900B530B1012806D059 -:10295000022806D0FFDF002000BDCB4800BDCB48D9 -:1029600000BDCA48001D00BD70B5C9494FF0004008 -:102970000860C84DC00BC5F80803C74800240460B0 -:10298000C5F840410820C43500F04BF9C5F83C417A -:10299000C248047070BD08B5B94A002128B10128A9 -:1029A00011D002281CD0FFDF08BD4FF48030C2F8E0 -:1029B0000803C2F84803B3483C300160C2F8401134 -:1029C000BDE80840D0E74FF40030C2F80803C2F871 -:1029D0004803AC4840300160C2F84411AB480CE0F9 -:1029E0004FF48020C2F80803C2F84803A5484430D9 -:1029F0000160C2F84811A548001D0068009008BD9C -:102A000070B516460D460446022800D9FFDF0022A5 -:102A10009B48012304F110018B4000EB8401C1F8B5 -:102A2000405526B1C1F84021C0F8043303E0C0F896 -:102A30000833C1F84021C0F8443370BD2DE9F0419E -:102A40001C46154630B1012834D0022839D0FFDFAA -:102A5000BDE8F081891E002221F07F411046FFF77A -:102A6000CFFF012C24D000208C4E8A4F012470709F -:102A70003C61894900203C3908600220091D08603A -:102A8000854904203039086083483D350560C7F822 -:102A90000042082000F0D0F82004C7F80403082002 -:102AA00000F0B4F87A49E007091F08603470CFE7F6 -:102AB0000120D9E7012B02D00022012005E00122EC -:102AC000FBE7012B04D000220220BDE8F04197E78C -:102AD0000122F9E76B480068704770B500F0C7F84D -:102AE000674C0546D4F840010026012809D1D4F8E6 -:102AF0000803C00305D54FF48030C4F80803C4F8B8 -:102B00004061D4F8440101280CD1D4F808038003B3 -:102B100008D54FF40030C4F80803C4F8446101201C -:102B20000FF0E6FAD4F8480101280CD1D4F80803D4 -:102B3000400308D54FF48020C4F80803C4F8486166 -:102B400002200FF0D5FA5648056070BD70B500F050 -:102B50008EF8524D0446287858B1FFF705FF687883 -:102B600020B1002085F801000FF0C2FA4C48046043 -:102B700070BD0320F8E74FF0E0214FF40010C1F8DA -:102B800000027047152000F057B842490120086143 -:102B9000082000F051B83F494FF47C10C1F80803F9 -:102BA0000020024601EB8003C3F84025C3F8402112 -:102BB000401CC0B20628F5D37047410A43F60952BB -:102BC0005143C0F3080010FB02F000F5807001EBE8 -:102BD0005020704710B5430B48F2376463431B0C19 -:102BE0005C020C602F4C03FB04002F4B4CF2F724CB -:102BF00043435B0D13FB04F404EB402000F58070AD -:102C00004012107008681844086010BD00F01F02E0 -:102C1000012191404009800000F1E020C0F800113E -:102C2000704700F01F02012191404009800000F12F -:102C3000E020C0F88011704700F01F020121914090 -:102C40004009800000F1E020C0F880127047490779 -:102C5000090E002806DA00F00F0000F1E02080F8ED -:102C6000141D704700F1E02080F8001470470C48F4 -:102C7000001F00680A4A0D49121D116070470000CC -:102C800000B0004004B500404081004044B1004025 -:102C900008F5014000800040408500402C000020E5 -:102CA00014050240F7C2FFFF6F0C01000100000194 -:102CB0000A4810B5046809490948083108600FF04E -:102CC000B4FA0648001D046010BD064900200860E3 -:102CD0004FF0E0210220C1F8800270471005024049 -:102CE00001000001FC1F004010B50D2000F06FF83E -:102CF000C4B26FF0040000F06AF8C0B2844200D0A1 -:102D0000FFDF3A490120086010BD70B50D2000F0CA -:102D100048F8374C0020C4F800010125C4F80453DA -:102D20000D2000F049F825604FF0E0216014C1F853 -:102D3000000170BD10B50D2000F033F82C480121C2 -:102D400041600021C0F80011BDE810400D2000F0E6 -:102D500033B8284810B50468264927480831086068 -:102D60002349D1F80001012804D0FFDF2148001DCC -:102D7000046010BD1D48001D00680022C0B2C1F8EB -:102D800000210FF024FEF1E710B51948D0F800112A -:102D90000029FBD0FFF7DDFFBDE810400D2000F05B -:102DA0000BB800F01F02012191404009800000F1A2 -:102DB000E020C0F88011704700F01F02012191400F -:102DC0004009800000F1E020C0F880127047002820 -:102DD00006DA00F00F0000F1E02090F8140D03E097 -:102DE00000F1E02090F800044009704704D500404D -:102DF00000D00040100502400100000110B5202065 -:102E000000F075F8202000F07DF84449202081F87A -:102E10000004434900060860091D42480860FEF7A7 -:102E20006BFA3F49C83108603F48D0F8041341F0BD -:102E30000101C0F80413D0F8041341F08071C0F808 -:102E40000413364901201C39C1F8000110BD10B52A -:102E5000202000F04CF8324800210160001D016084 -:102E60002F4A481EE83A10602F4AC2F808032C4B3C -:102E7000C8331960C2F80001C2F860012B4908602C -:102E8000BDE81040202000F03DB825492848EC3925 -:102E90000860704722492648E8390860704770B5D5 -:102EA0001F4A8069E83A224911601F49D1F8006140 -:102EB0000023204D1D4A5C1E1EB1A84206D30021EE -:102EC0000FE0D1F8606186B1A84209D2C1F80031A3 -:102ED000C1F860311460BDE87040202000F012B8E5 -:102EE0001168BDE870401DF009BDFFDF70BD00F046 -:102EF0001F02012191404009800000F1E020C0F84C -:102F00008011704700F01F020121914040098000AC -:102F100000F1E020C0F880127047000020E000E0DF -:102F2000000602400C130020000002400004024092 -:102F300001000001002002000F4A12680D498A4278 -:102F40000CD118470C4A12680A4B9A4206D101B5B7 -:102F50000FF0F6FDFFF799FFBDE80140074909684A -:102F60000958084706480749054A064B70470000BC -:102F700000000000BEBAFECAA0000020040000202D -:102F8000901200209012002070B50C46054607F004 -:102F90005EFD21462846BDE8704008F050BE10B5E1 -:102FA00010F01CFAFFF732FC10F0B4F8BDE8104046 -:102FB00010F066B90548064A0168914201D1002126 -:102FC000016004490120086070470000A000002053 -:102FD000BEBAFECA40E5014070477047704770476F -:102FE000704702F0FF0343EA032242EA02421DF067 -:102FF0003EBC7047704770477047000405060100EB -:1030000018FFFFFFDBE5B151002002009600FFFF33 -:10301000840000000000000030B5FE4D044610287A -:103020000AD0112C06D02846122CC17806D0132CB9 -:1030300008D0FFDFEC7030BDFFDFFBE71129F9D0CE -:10304000FFDFF7E71129F5D0FFDFF3E770B50EF0EA -:103050002BFB04460FF04AFB201AC4B206200CF0EA -:10306000D3FC054606200CF0D7FC2E1A07200CF0E6 -:10307000CBFC054607200CF0CFFCE649281A321895 -:10308000C87812280DD000231A4413280BD0002032 -:1030900002440878022808D000201044201AC0B248 -:1030A00070BD0123F0E70120F2E70120F5E7D948E0 -:1030B00000B58079D74942089BB051F8070F89883D -:1030C0000BD017220190ADF808108DF800200BA945 -:1030D000684609F053FA1BB000BD4622F2E7022110 -:1030E0000CF0E8BC2DE9F0419AB01D4690460E4622 -:1030F0000746FFF7F4FF04000BD02078222804D302 -:10310000A07FC0F34010A84206D108201AB0BDE845 -:10311000F08143F20200F9E74B208DF80000ADF892 -:1031200004703DB101208DF806008DF807608DF820 -:10313000088002E000208DF806000BA9684609F01F -:103140001DFAA07F65F34510A0770020DEE730B5BB -:103150000446A1F120000D460A284AD2DFE800F01B -:1031600005070C1C2328353A3F44FFDF42E0207856 -:1031700020283FD1FFDF3DE0A6480178032939D060 -:10318000C078132836D02078242833D0252831D091 -:1031900023282FD0FFDF2DE0207822282AD02328D3 -:1031A00028D8FFDF26E02078222823D0FFDF21E087 -:1031B000207822281ED024281CD026281AD0272880 -:1031C00018D0292816D0FFDF14E02078252811D048 -:1031D000FFDF0FE0207825280CD0FFDF0AE0207801 -:1031E000252807D0FFDF05E02078282802D0FFDF60 -:1031F00000E0FFDF257030BD30B50B8840F67B4422 -:103200004FF6FF72022801D0934204D09D1FA542C1 -:1032100024D2022802D04D88954203D04D88AD1F9C -:10322000A5421BD24C88A34218D88B88B3F5FA7FED -:1032300014D2022802D0C888904205D0C88840F62F -:1032400077450A38A84209D2C888904208D09442EB -:1032500006D05B1C6343B3EB800F01DB072030BD5E -:10326000002030BD70B514460D4606460FF0E6FE50 -:1032700058B90DB1A54201D90C2070BD002408E059 -:1032800056F824000FF0DAFE08B1102070BD641C5F -:10329000E4B2AC42F4D3002070BDF0B50024059D2B -:1032A00010B1A94203D850E009B90020F0BD0920AF -:1032B000F0BD055DD5B1071997F801C0BCF1150F38 -:1032C0002DD03BDCBCF1150F38D2DFE80CF0371203 -:1032D0002020262628282F2F3737373737373737FC -:1032E00037372000025D22BB641CE4B28C42F9D364 -:1032F000DBE7022DDBD1BD781D70072D01D26D07F4 -:1033000001D40A20F0BD157845F0010515E0EF4322 -:10331000FF0707E0012D07D010E00620F0BD2F07C2 -:10332000A7F18057002FF5D03046F0BD1578AF07D4 -:1033300001D50B20F0BD45F002051570055D641C3C -:103340002C44E4B28C4202D9B1E74FF448568C4287 -:10335000AFD3AAE710B50278540809D0012243F28E -:103360000223012C07D0022C0DD0032C13D10FE027 -:103370000020087005E080790324B4EB901F0AD187 -:103380000A70002010BD8079B2EB901F03D1F7E7DF -:1033900080798009F4D0184610BD1E4A117C39B1DD -:1033A000517C022908D0032908D043F2022070473B -:1033B0000146901D01F01EBD032100E001210170B6 -:1033C0000020704738B50C460546694601F012FDED -:1033D00000280DD19DF80010207861F3470020707F -:1033E00055F8010FC4F80100A888A4F805000020D2 -:1033F00038BD38B51378E8B102281BD006A46D4655 -:10340000246800944C7905EB9414247864F3470302 -:10341000137003E0B80100200302FF0103280ED05F -:1034200003F0FE0010700868C2F801008888A2F856 -:10343000050038BD23F0FE0313700228E9D1D8B28D -:1034400040F00100EEE730B50C4609789BB0222928 -:1034500002D208201BB030BD28218DF80010ADF835 -:103460000400132A03D03B2A01D00720F2E78DF88D -:1034700006200BA9684609F081F8050003D1212137 -:103480002046FFF764FE2846E4E700B59BB0232101 -:103490008DF80010ADF804001088ADF806005088D3 -:1034A000ADF80800D088ADF80C009088ADF80A009F -:1034B0000020ADF80E00ADF810000BA9684609F029 -:1034C0005DF808E62DE9FF470220FB4E8DF8040069 -:1034D0000027B08AADF80600B84643F202094DE075 -:1034E00001A80CF050FA050006D0B08AA8B3A6F8DF -:1034F0001480ADF806803FE0039CA07F01072DD526 -:1035000004F124000090A28EBDF80800214604F1C9 -:10351000360301F084FE050005D04D452BD0112D5A -:103520003DD0FFDF3BE0A07F20F00800A077E07FE8 -:10353000810861F30000C10861F34100E07794F86D -:10354000210000F01F0084F820002078282827D1CF -:1035500029212046FFF7FBFD22E015E040070BD5AF -:10356000BDF80800214604F10E02FFF78EFF0500AA -:103570000DD04D4510D100257F1CFFB202200CF06C -:1035800043FA401CB842ABD8052D12D008E0A07F0A -:1035900020F00400A07703E0112D00D0FFDF00250C -:1035A000BDF80600B082052D05D0284604B0BDE860 -:1035B000F087A6F814800020F8E72DE9FE43040008 -:1035C00000D1FFDF2078002720F00F00801C20F0C2 -:1035D000F000703020706068B74E0178091F17291D -:1035E0000ED2DFE801F0FD0D0C0D4AFC0D0FFCFCC6 -:1035F00037FD0D0DFD6CFDFD0D0DFDFDFB00FFDF2D -:10360000BDE8FE8385882846FFF769FD040000D1E8 -:10361000FFDF05F07DFFB07C212140F00400B07495 -:103620002046FFF794FD284609F09CF92846FEF74E -:103630000AFD284604F078F8294602200FF0BAFC6B -:10364000A07F20F01000A077FFF73CFF0028D7D024 -:10365000FFDFD5E785882846FFF741FD00B9FFDF8A -:1036600060688078012800D0FFDF6068817903B04E -:103670002846BDE8F04309F0D9BA86883046FFF7FE -:103680002EFD050000D1FFDF05F042FF60683146E6 -:10369000C088288160680089688160684089A88145 -:1036A00002200FF087FCAF75A87F00F0030002280E -:1036B000A6D1FFF707FF0028A2D0FFDFA0E78078A0 -:1036C0003C281BD0002502280ED08DF8007000B1D8 -:1036D000FFDF05F01DFFB07C40F00800B0748DB135 -:1036E000B07801F046FB01208DF800009DF8000045 -:1036F000012876D0022875D0FFDF81E701258DF8FB -:103700000070E6E76568B5F80490A879AD1C01285B -:1037100006D03079804605F0ADFC070003D101E00A -:10372000B078F7E7FFDF0022022148460CF0B9F934 -:10373000040000D1FFDF22212046FFF708FD287991 -:10374000012800D002208DF80000A17F6A4660F3B6 -:103750000101A177288B2081688B6081A88BA081D3 -:1037600084F82280032148460CF09BF900B9FFDF62 -:10377000B888ADF80800B8788DF80A0002AA0521CB -:1037800048460CF08EF900B9FFDFB888ADF80400A8 -:10379000F8788DF8060001AA042148460CF081F95A -:1037A00000B9FFDF062105F1120001F05AFB30B32A -:1037B0006879800700D5FFDF6979E07D61F3470014 -:1037C000E075D5F80600A0616889A083062105F19F -:1037D0000C0001F046FBE0B1B07904E041E03BE0D1 -:1037E00046E021E02CE04108607861F3470060701A -:1037F000D6F80700C4F80200B6F80B0012E0E07D2E -:1038000020F0FE00801CE075D5F81200A061E88A67 -:10381000DBE7607820F0FE00801C6070E868C4F888 -:103820000200288AE08061E73078032800D0FFDFBB -:10383000002108460FF0BEFB012001F065FADFE62B -:10384000F078132800D0FFDF002107200FF0B2FB33 -:103850001120FFF7E1FBD3E62046BDE8FE4301F06F -:103860009FBF05F055FEB07C40F04000B074C7E645 -:10387000BDE8FE4305F04CBE2DE9F05F054600783B -:103880000C4600270109DFF830A091463E46012989 -:103890006FD000234FF6FF7002296BD007290DD09F -:1038A0000A2968D0FFDF00BFA9F800600CB12780AB -:1038B00066800020BDE8F09FB8010020D5F804C064 -:1038C00004F108029CF80010132973D00EDC04F1F7 -:1038D00018080B2913D004DC042969D0082968D101 -:1038E0004AE00F295AD01229F9D1C2E01439072928 -:1038F0005FD2DFE801F0F2F35E5E49DFF0001127EE -:103900000926002C7DD0BCF804804046FFF7E7FB79 -:1039100090F822B0A4F804806868807920729AF840 -:103920001210404621F004018AF8121004210CF014 -:10393000D3F8052140460CF0CFF8002140460CF0AA -:10394000CBF8012140460CF0C7F8032140460CF0AB -:10395000C3F8022140460CF0BFF8062140460CF0A7 -:10396000BBF8072140460CF0B7F8584601F001FAC1 -:103970009AE70AE135E102E112271026BCF80400BB -:10398000214601F04FFA8FE71C270926B4B3BCF893 -:103990000200A08068680079207285E71B2709264D -:1039A00064B30420207268684088A0807CE701E04E -:1039B00034E0E3E09CF802003C2825D010271826CC -:1039C0000CF1020CD4B1BCF80200A080BCF81800C5 -:1039D0006082BCF818002082BCF81A00A082BCF8F3 -:1039E0001C00E0829CF805000CF10601FFF701FDC8 -:1039F0009CF8040018B10120E0730AE001E0022005 -:103A0000FAE7A9F8006054E71B270926002CF8D034 -:103A100023729AF8121021F00801F5E01D273726CD -:103A2000002CEED0A0806968081DCB7801461846AE -:103A3000FFF7DFFC6868C07AA0756868007B04281F -:103A4000E07D13D020F00100E07569681F22097B3A -:103A500061F34200E0756968897A61F3C700E07537 -:103A6000696840460D311CF089FE1DE740F00100F9 -:103A7000EAE71D273726002CC3D0A08069680879A3 -:103A8000491DFFF7B6FC696804F10F02C87A0C31D2 -:103A9000FFF7AFFC6868807CA0756868C178E07D3E -:103AA00061F3420020F0F900E0751F2140461CF050 -:103AB000FEFEF9E620271026002CA2D0A080686820 -:103AC00004F10902807A207269680B1DC8781946D2 -:103AD000FFF78FFCE8E63AE000E024E021270B2620 -:103AE000002C8ED0BCF80400A0806868807820721A -:103AF00068688079012805D0022803D003280ED0F9 -:103B0000FFDF002060726868C079012805D00228B4 -:103B100003D0032805D0FFDF0020A072C4E60420F4 -:103B2000F0E70420F9E723271026002CA4D0BCF8E6 -:103B30000200A0806868007920816868007A60814E -:103B40006868C088A08168684089E081ACE6222767 -:103B50001026002C90D06888A0806868808820811A -:103B60006868C088608168680089A0816868408949 -:103B7000E0819AF8121021F0400145E04A462146C2 -:103B80002846BDE8F05F01F0A9BF287A012803D0DC -:103B9000022814D0FFDF87E61F271026002C8CD0C8 -:103BA0006888A08068892081A8896081E889A081CF -:103BB000288AE0819AF8121021F0200124E01227CF -:103BC00010266888214601F02DF9002C89D06878EC -:103BD00000F007000528A1D19AF8121021F0020187 -:103BE00012E0297A062923D2DFE801F0041111033B -:103BF0000303C3E71B270926002C97D0A08023725C -:103C00009AF8121021F001018AF812104CE61B27D5 -:103C10000926002C8AD0A080287A012806D003200B -:103C200020729AF8121021F01001EDE70220F7E758 -:103C3000FFDF39E630B5F84D9BB0E878132801D0A6 -:103C4000082007E422208DF83C0069460FA808F000 -:103C500095FC040002D1287901F08BF8002107209F -:103C60000FF0A8F920460FE400B5EB489BB0C078F0 -:103C7000122801D0082024E41E208DF80000002026 -:103C80008DF804008DF805000BA9684608F076FC55 -:103C90000028F0D1002107200FF08CF91120FFF748 -:103CA000BBF900200DE410B5DB4C9AB02078012858 -:103CB00013D01B208DF8000000208DF804000BA904 -:103CC000684608F05BFC002808D1002108460FF088 -:103CD00071F92078032803D005E008201AB010BD40 -:103CE000A07801F046F8012001F00EF80020F5E779 -:103CF0002DE9F041C84C002740B102281DD007280B -:103D000042D0082800D0FFDFBDE8F081FFF7CBFFED -:103D10000028F9D105F0F9FB0028F5D0017821F051 -:103D20000F01891C21F0F00120310170077205F0AC -:103D3000EFFBA07C40F001001DE08EB23046FFF7A3 -:103D4000CEF9050000D1FFDF28782128DCD005F06E -:103D5000DCFB90B1017821F00F01891C21F0F0010A -:103D600010310170022101724680AF7505F0D0FB61 -:103D7000A07C40F00200A074C6E729463046BDE8AA -:103D8000F0411322FFF75FBBE578122D03D0132D0E -:103D900004D0FFDFB8E7FFF767FF01E0FFF74AFF56 -:103DA0000028B1D105F0B1FB0028ADD0017821F099 -:103DB0000F01891C21F0F00120310170122D07D074 -:103DC0000221017205F0A4FBA07C40F01000D2E7B4 -:103DD0000121F6E72DE9F04116460C00074600D117 -:103DE000FFDF307820F00F00801C20F0F000103052 -:103DF00030702078012803D0022817D0FFDF83E736 -:103E00003846FFF76CF9050000D1FFDF0220A875E6 -:103E100005F07EFB2068B0606068F0602089308229 -:103E20007D48817C41F0200181746DE73846FFF7C1 -:103E300056F9050000D1FFDF61884FF6FF7081421F -:103E400009D1A288824206D129463846BDE8F04110 -:103E50001322FFF7F8BA814201D1A08848B105F0DA -:103E600057FB2068B0606068F060208930820020D5 -:103E700006E078230022394602200EF0FBFF0120E5 -:103E8000A87541E730B505469BB00C4608460FF0D3 -:103E9000D5F878BB00210120203D092D6BD2DFE849 -:103EA00005F005254C505A616D7B4000002108202B -:103EB0000FF056F808B11120C3E624208DF8000059 -:103EC000D4F802000190A0798DF808000BA968468B -:103ED00008F054FB05004FD1082300221146184674 -:103EE0000EF0C8FF082847D0FFDF45E060680FF0FC -:103EF000E9F808B11020A4E64C208DF800002088D5 -:103F0000ADF804006088ADF806000BA9684608F01B -:103F100035FB050030D1606860B3BDF8301001801A -:103F20002AE04E208DF800002088ADF80400A0782B -:103F300000F001008DF8060029E0206802F06FF81B -:103F400017E04D2208E000BF8DF804001FE000BF1D -:103F50008DF804101BE048228DF800202278D2074B -:103F6000F6D0F1E72178C90705D057218DF8001068 -:103F7000EAE7054600E00725284662E638208DF886 -:103F800000002088ADF804006088ADF806000BA999 -:103F9000684608F0F3FAECE72078C00802D16078B0 -:103FA000C00801D007204CE63F208DF800002078A3 -:103FB0008DF8050060788DF80600207830B100207B -:103FC0008DF80400617819B1002102E00120F7E7C3 -:103FD00002210843B8E730B505469BB00C460846B9 -:103FE0000FF052F808B110202BE6203D092D2BD2FE -:103FF000DFE805F0052828282A2A2A2A2800208810 -:10400000FFF76DF820B10078222807D2082018E6C3 -:1040100043F2020015E60000B801002025208DF8CB -:1040200000002088ADF804000BA9684608F0A6FA45 -:104030000028D9D1DDF83210C4F802109DF83610EE -:10404000A171FEE50620FCE50720FAE5F748704778 -:1040500038B5F6481621801F1CF007FC012000F03F -:1040600053FE1120FEF7D8FFF04C6846A41FE11D57 -:1040700005F0ACF99DF80010A07961F3470020F03D -:104080000100A071002020744FF46170E0810220D3 -:104090006074FFF70CF800B1FFDFFDF755F901F090 -:1040A0003AFB38BD10B50C463E2120461CF0DDFB26 -:1040B000A07F20F00300A077202020700020A075B2 -:1040C00084F8230010BD70477CB505460EF0B6FF9E -:1040D00008B110207CBDD54CA41FA11DD4F806004A -:1040E0000090D4F80A0001902846FFF76BF90028E9 -:1040F000F0D1FEF7DCFF0028ECD00099C4F80610E0 -:10410000BDF8041061819DF8061021737CBD10B5C7 -:1041100004460EF0B9FF08B1102010BDC349224675 -:10412000891F8879C91D4008FFF763F9002010BD79 -:104130002DE9F047A0B00D4604004FF0000812D062 -:104140000822FFF78FF800281CD1002609E000BFE5 -:1041500054F8260004A9FFF7FDF8002812D1761CB8 -:10416000F6B2AE42F4D32F460A2006AD0DF1440A52 -:104170008DF8180026465146284608F0FFF920B170 -:1041800043F2032020B0BDE8F0874046DFF89C8270 -:10419000A8F1060888F805002EB300244FF00B099B -:1041A0001DE000BF56F8240005A9FFF7D3F800B1C1 -:1041B000FFDF9DF81400287156F8240050F8011F05 -:1041C000C5F805108088A5F8090085F800905146CB -:1041D000284608F0D3F900B1FFDF641CE4B2BC420A -:1041E000E0D388F805700020CCE72DE9F047A2B0B5 -:1041F0001546894604001ED00F4608222946FFF7BF -:1042000031F8002811D1002613E000BF54F8260031 -:1042100005A9103000F0EEFD002806D13FB157F897 -:1042200026000EF00BFF10B1102022B0ABE7761C79 -:10423000F6B2AE42EAD30026A5F101081CE000BFA9 -:1042400006F1010A0AF0FF0712E000BF54F8260049 -:10425000017C4A0854F827100B7CB2EB530F05D1B0 -:104260000622113011311CF05DFAC0B17F1CFFB283 -:10427000AF42EBD30AF0FF064645E1DBC8462F46C6 -:10428000342007AD0DF148098DF81C00264649463B -:10429000284608F073F928B143F20420C5E743F239 -:1042A0000520C2E796B300242CE000BF56F8240096 -:1042B000291D103000F09EFD00B1FFDF56F82400EC -:1042C000102250F8111FC5F805108088A5F80900C4 -:1042D00056F8241005F10B001CF050FAB8F1000F4D -:1042E00015D058F82410102205F11B001CF046FAD6 -:1042F000322028704946284608F040F900B1FFDF17 -:10430000641CE4B2BC42D1D3012206E004E005F112 -:104310001B0001F078FEEBE700224946284600F03A -:1043200094FD002081E770B59AB004460EF086FE39 -:1043300018B960680EF0CFFE10B110201AB070BD31 -:1043400060884AF2B811884206D8384D20786E4607 -:10435000AD1F18B1012804D00720EFE7FEF7A7FE34 -:1043600019E06078022804D0032802D043F202202A -:10437000E4E7687417208DF80000697C0020019044 -:10438000ADF80800022932D003292DD0FFDF0BA998 -:10439000684608F0F3F80028D0D1606801F026FEE6 -:1043A000207870B101208DF80400701D01F02BFE03 -:1043B00050208DF800000BA9684608F0DFF800B126 -:1043C000FFDF6088A8B1E88180B2ADF8040030203A -:1043D0008DF800000BA9684608F0D0F800B1FFDFA7 -:1043E000207828740020A9E78DF80900CFE7402045 -:1043F000FAE74FF46170E6E710B504460EF044FEAC -:1044000020B9606838B10EF05DFE08B1102010BD13 -:10441000606801F0F8FD0548801FC1896180417C1A -:104420006170007C2070002010BD0000BE010020E3 -:104430002DE9F041A0B0054600208DF874008DF8FC -:1044400070008DF86C008DF878001E461446884682 -:1044500028460EF040FE18B920460EF03CFE10B182 -:10446000102020B050E455EA040018D01F271BABE1 -:104470001DAA414628460097FEF70FFF0028F0D1FD -:104480001EAB1CAA314620460097FEF706FF002807 -:10449000E7D19DF87000C00703D00A20E1E70720AC -:1044A000DFE701AF7DB11A208DF804008DF8088098 -:1044B00042462946781D1CF061F90CA901A808F0B4 -:1044C0005DF80028CDD17CB120208DF804008DF856 -:1044D000086032462146781D1CF050F90CA901A84D -:1044E00008F04CF80028BCD1FF499DF86C004870DA -:1044F0000020B6E72DE9F0479EB08A464FF000084D -:10450000FAA104468DF86880D1E90001CDE91B01CC -:1045100020460EF093FD90B92078012803D1606801 -:104520000EF08CFD58B9F04D4FF00109287C48B1D0 -:10453000687C022806D160680EF0CDFD10B1102015 -:104540001EB020E62878012801D00820F8E70720CF -:104550000BF062FA18B9207848B1012807D0FEF7AD -:1045600075FD30B1A87C10F00C0F08D103E01220CB -:10457000E6E71320E4E7C10701D1800701D5112048 -:10458000DEE7608943F6E172A0F1200191422178D3 -:1045900007D301297ED100287CD1A189002979D1B6 -:1045A0000FE0022901D0032901D1A02872D30129EB -:1045B00007D06978C90704D0A18900296AD0B42935 -:1045C00068D8217831B1012908D0022904D0032903 -:1045D00060D10AE0002609E0022607E008B9A089B8 -:1045E00008B1042609E0012607E00326287C50B123 -:1045F000687C022807D1606828B11AA96068FEF7B4 -:10460000A9FE00289CD1207A30B1012806D00228CA -:1046100006D0032878D105E0002704E0012702E056 -:10462000022700E003270EB1022E0ED16FB1687988 -:1046300080B36878800702D043F2012080E7022E21 -:1046400003D1022F60D0032F5ED0207808B101285B -:1046500006D1504600F06CFB002889D185F802A0F5 -:1046600018208DF83C006089ADF840006089ADF8F5 -:1046700042008DF844600DF14500FEF78EFE00B15A -:10468000FFDF9DF868008DF846002078012808D0EB -:10469000287C00E038E058B1687C022808D16068C6 -:1046A00030B1606850F8011FCDF84710808802E0F3 -:1046B0004046CDF84780ADF84B008DF84E70A07B9A -:1046C000C0F34002014662F35F01C0F3800041EA9B -:1046D00080001BA9085C8DF84D00A8B169460FA8A1 -:1046E00007F04CFF0028A9D11B208DF83C008DF865 -:1046F000409069460FA807F041FF00289ED19DF821 -:1047000001001B281CD101E0072019E7052E0CD25F -:10471000DFE806F0030308080300A87800F01CFB9C -:10472000032000E0022000F0EFFA012E0AD0A08959 -:1047300040B100228300114610460EF09BFB08B1E9 -:104740000320FDE60020FBE62DE9FC4107460D466F -:10475000032608460EF0BFFC002864D13846FEF759 -:10476000BEFC040005D02078222805D20820BDE830 -:10477000FC8143F20200FAE7A07F00F0030C2DB1A8 -:1047800029466046FEF738FD0600F0D15648BCF1D8 -:10479000010F05D0BCF1020F17D0FFDF3046E6E76E -:1047A000A27D2946012A02D0807C800701D51120F4 -:1047B000DDE729B96846FCF7D5FE0028D7D1694660 -:1047C000384608F0E1F90646E8E7A17D022914D150 -:1047D000807C800611D425B1A07F40070BD4002136 -:1047E00000E00121384608F0FAF90600D6D1A0759C -:1047F000002DD3D002E01126D0E7A5B12A462146EC -:104800003846FEF742FE06461128C7D1A07F410771 -:10481000C4D4296844F80E1F6968616040F0040040 -:1048200020740026BAE71020A1E770B50C460546B3 -:10483000FEF755FC010005D022462846BDE8704031 -:10484000FEF701BE43F2020070BD00B59BB04521EA -:104850008DF800108DF804000BA9684607F08EFE55 -:104860001BB000BD0123FEF73DBC00231A461946CC -:10487000FEF738BC30B59BB004460EF0DFFB10B13C -:1048800010201BB030BD204600F0A2FA0028F8D15D -:10489000154DE878112801D00820F2E7FEF7D6FB85 -:1048A00020B1A87CC00603D51120EAE71320E8E771 -:1048B0002078800701D56879F0B31D208DF80000BD -:1048C0002078022200F001008DF804006088ADF825 -:1048D0000600A088ADF808002078C0F3400102EA85 -:1048E0005000014306E00000B8010020070605045F -:1048F000030201008DF80B100DF10A00FEF74DFDCB -:1049000000B1FFDF0BA9684607F038FE0028B8D1D8 -:104910001E208DF8000001208DF8040000208DF885 -:1049200005000BA9684607F029FE0028A9D1E088F8 -:1049300000F06AFA040000E005E0A2D11220FEF7C0 -:104940006BFB20469DE707209BE72DE9F041FE4CDD -:1049500007469AB0E078984616460D46122803D1CD -:10496000FFF782F900280ED128460EF067FB70BBD6 -:1049700030460EF063FB50BBA07C10F0180F01D145 -:10498000400703D511201AB0BDE8F081284600F099 -:104990001FFA0028F7D131460220FEF72DFC00282F -:1049A000F1D1E078112801D00820ECE706200BF0C7 -:1049B00033F850B12878800701D5607940B1FEF70F -:1049C00045FB022806D21320DDE71220DBE716E0C4 -:1049D0000720D8E721208DF800006888ADF8040092 -:1049E000A888ADF806002878C0F340008DF80800CC -:1049F000287880071DD438460EF020FB08B110201F -:104A0000C1E73878420808D0012A18D043F20221C1 -:104A1000022A18D0032A18D115E0C00700D00220BE -:104A20008DF8090057F8010FCDF80A00B888ADF8E5 -:104A30000E0004A8FEF7B1FC58B10320A3E7C0079D -:104A400005D00320ECE7C00701D008469BE7012012 -:104A5000E6E73088ADF812007088ADF81400B08831 -:104A6000ADF81600F088ADF818000020ADF81A0077 -:104A7000ADF81C00404600F05BF9002883D184F8B3 -:104A800004800BA9684607F079FD00288DD12079B4 -:104A900000F062F9E88800F0B7F9040085D113202E -:104AA000FEF7BAFA20466EE730B505469BB00C46D5 -:104AB00008460EF0E9FA08B11020E2E62846FEF7B3 -:104AC0000EFB38B10178222902D3807F800604D4FE -:104AD0000820D6E643F20200D3E613208DF800004A -:104AE000ADF804500BA9684607F048FD0028E4D152 -:104AF0009DF932107F2901D02170C2E60520C0E661 -:104B000030B505469BB00C4608460EF097FA08B142 -:104B10001020B6E62846FEF7E2FA20B100782228F7 -:104B200004D20820ADE643F20200AAE62078C008CD -:104B300002D16078C00801D00720A2E656208DF887 -:104B40000000ADF8045020788DF8070060788DF8EB -:104B50000800207830B100208DF80600617819B186 -:104B6000002102E00120F7E7022108438DF806004A -:104B70000020ADF80A000BA9684607F0FFFC80E6AC -:104B80002DE9F041B8B0144688460546FEF7A7FA6D -:104B9000060005D03078222805D2082038B0F3E688 -:104BA00043F20200FAE740460EF095FA28B90027D2 -:104BB0003CB120460EF086FA08B11020EEE72760DF -:104BC000A7806148807C400601D51120E6E796F871 -:104BD000220004F04FFA8088011DFB2901D2001D3C -:104BE00000E0FB20C0B26A46414600F0CCF82C221F -:104BF000564913A81BF007FEADF85050BDF802004F -:104C0000ADF85200BDF80600ADF85400BDF8000044 -:104C1000ADF85600BDF80400ADF8580004A913A87B -:104C200007F0ACFC00B1FFDFBDF81400ADF80800E0 -:104C3000BDF81600ADF80A00BDF81800BDF81A104E -:104C4000BDF800200844ADF80C0007201B2AA5D3AE -:104C5000BDF802101B29A1D3FB2A9FD8FB299DD8A0 -:104C600006268A4210D10121104600F03DF8BDF819 -:104C70000410884208D1BDF80200012100F034F888 -:104C8000BDF80610884201D0304687E7BDF808001D -:104C900028B9BDF80A0010B9BDF80C0038B124B12C -:104CA00002982060BDF80C00A080132076E7274909 -:104CB0002C222C311EA81BF0A6FDADF87C50BDF8AF -:104CC0000200ADF87E00BDF80600ADF88000BDF82A -:104CD0000000ADF88200BDF80400ADF8840029A9F9 -:104CE0001EA807F04BFC59E7032904D0022907D07E -:104CF000C000703006E04FF4747101EB801001E0E9 -:104D000080003C3080B2704730B50F4D040008D0B1 -:104D1000012C04D0022C06D0032C04D0FFDF2C7011 -:104D200030BDFFDFFBE728780128F8D0FFDFF6E78A -:104D300010B5044604F09EF950B1407850B12046B9 -:104D400004F09FFC002010BDB8010020100C0200F0 -:104D50000720F8E71220F6E710B504F08BF90400FD -:104D600000D1FFDF607800B9FFDF6078401E60701F -:104D7000E9E710B504F07EF9040000D1FFDF6078A8 -:104D8000401C6070DFE710B5144631B10A6822603C -:104D900049686160218839B107E020806080012185 -:104DA000FFF7A2FFA0800DE02080618801B960803C -:104DB000A08820B920880121FFF796FFA080E08815 -:104DC0000028C0D160880121FFF78EFFE080BAE79C -:104DD000418843F6FD730A1F9A4209D2808804284D -:104DE00006D3B0F5804F03D8884201D80020704721 -:104DF000072070470278520804D0012A02D043F2FB -:104E000002207047FEF7A6BA10B548B18300002211 -:104E1000114607200EF02EF8072801D0032092E754 -:104E2000002090E770B50C0006460DD0FEF757F94C -:104E3000050000D1FFDFA6802889208128896081B4 -:104E40006889A081A889E08170BD10B502F00102D7 -:104E500002713122027007F091FB002800D0FFDFC1 -:104E600071E710B500231A4603E0845C2343521C0B -:104E7000D2B28A42F9D30BB1002064E7012062E785 -:104E80002DE9F041884606460188408815460C18F1 -:104E90001F46AC4200D3641B3844A84200D9FFDF50 -:104EA000E019A84200D9FFDF70883844708008EB11 -:104EB0000400BDE8F08110B504460EF0BFF808B15B -:104EC000102010BD2078C0F30210042807D86078A5 -:104ED000072804D3A178102901D8814201D20720E4 -:104EE00010BDE078410706D421794A0703D40007B2 -:104EF00001D4080701D5062010BD002010BD10B553 -:104F000013785C08C37F64F30003C3771478A408A4 -:104F100064F34103C3771078C309487863F3410011 -:104F2000487013781C090B7864F347130B701378DF -:104F3000DB0863F3000048705078487110BD10B56D -:104F4000C4780B7864F300030B70C478640864F3CE -:104F500041030B70C478A40864F382030B70C47817 -:104F6000E40864F3C3030B700379117863F3000161 -:104F7000117003795B0863F34101117003799B0899 -:104F800063F3820111700079C00860F3C3011170EE -:104F900010BD70B514460D46064604F0B6FA80B151 -:104FA0000178142221F00F01891C21F0F001A031B9 -:104FB00000F8081B21461BF026FCBDE8704004F0F9 -:104FC000A7BA29463046BDE870401322FEF73BBA27 -:104FD00070B514460E46054604F097FA70B1017894 -:104FE00021F00F01891C21F0F00120310170458072 -:104FF00021688160BDE8704004F08ABA31462846D5 -:10500000BDE870401322FEF71EBA10B5FE4C94F8AE -:10501000300000280CD104F120014FF6FF72A1F1FD -:1050200010000CF03EF900B1FFDF012084F83000E1 -:1050300010BD2DE9F047064608A8894690E83004DF -:105040001F469046142128461BF031FC0021CAF867 -:105050000010B8F1000F03D0B9F1000F03D114E034 -:105060003878C00711D020680EF00EF8F0BBB8F108 -:10507000000F07D120681230286020681430686063 -:105080002068A8602168CAF800103878800728D501 -:1050900060680EF017F848BBB9F1000F2DD0FEF78D -:1050A000D5FF0168C6F8C8118188A6F8CC118079AF -:1050B00086F8CE01FFF7A9FFDFF84C8308F120083E -:1050C000C5F80C80626862B196F8C80106F2C91191 -:1050D00040081032FEF78DF91022414660681BF03F -:1050E0004DFB3878400712D5A06800E002E00DF0D3 -:1050F000CBFF50B11020BDE8F08760680028F9D0E0 -:10510000E8606068C6F8C401EBE7A0682861002089 -:10511000F1E730B5054608780C4620F00F00401C3A -:1051200020F0F001103121700020607095F823000C -:1051300030B104280FD0052811D0062814D0FFDF85 -:1051400020780121B1EB101F04D295F8200000F067 -:105150001F00607030BD21F0F000203002E021F02F -:10516000F00030302070EBE721F0F0004030F9E73C -:1051700010B510B190F8BD4044B1A34890F8354047 -:10518000002064B108601060186010BD00F1BC041C -:105190000C6000F1E40100F586701160F4E79A4CB0 -:1051A00034340C60EFE700B58BB00723CDE9021271 -:1051B0008DF80130019194490023643105910993E0 -:1051C00001468DF8103068460CF043F8002800D0F6 -:1051D000FFDF0BB000BD70B590B015460C46022243 -:1051E0000646ADF80820082103AB07F0DEFA04906C -:1051F000002812D00C208DF8010004208DF8040046 -:1052000004F59A74099605948DF818500AA9684611 -:105210000CF01FF800B1FFDF012010B070BD30B5F9 -:105220009BB00C462C251E998DF80050ADF804005B -:10523000C3B11868CDF80600D3F80400CDF80A0011 -:10524000ADF80E20102204A81BF098FA0BA96846AE -:1052500007F094F9002803D1A17F41F01001A17754 -:105260001BB030BD0020CDF80600E7E72DE9F04780 -:105270000646008A8CB080B20D468246FDF72FFFAD -:105280000446614F3078383FDFF87C814FF00009E9 -:10529000122873D2DFE800F072F8350936777E966F -:1052A000A3E7F7F6F5F4F35BF3F3A07F00F0030058 -:1052B000012806D0002150460AF0FCFB050003D16E -:1052C00001E00121F7E7FFDF98F85C10090602D53D -:1052D000D8F860000BE0032105F121000DF058FB28 -:1052E000D5F821004949B0FBF1F201FB1200C5F8E5 -:1052F00021007068A867B068E8672078252800D08A -:10530000FFDFE7E0A07F00F00300012806D00021C6 -:1053100050460AF0CFFB060003D101E00121F7E778 -:10532000FFDF3078810702D52178252904D040F0AD -:10533000010030700CB0DEE60220287096F82000E4 -:10534000287106F121003136C5E90206F2E7A07F97 -:1053500000F00300012806D0002150460AF0AAFB05 -:10536000040003D101E00121F7E7FFDF2078C10647 -:1053700005D51320287041346C60DBE7C9E140F0AB -:1053800008002070D6E72048082138380DF000FBCF -:10539000032014E02A208DF80000102201A8716873 -:1053A0001BF0ECF9102205A8B1681BF0E7F91649CB -:1053B00068463C3907F0E2F800B1FFDF04202870AE -:1053C0006F60B7E7E07FC00600D5FFDFB0680090F0 -:1053D000B38806220821504607F0F6FAAAE704B976 -:1053E000FFDF716821B1102204F124001BF0C6F91F -:1053F00028212046FDF7ABFEA07F00F00300022825 -:1054000013D104F1240003E01402002040420F00F5 -:10541000002300901A4621465046FFF700FF11284E -:1054200007D029212046FDF792FE307A84F820002B -:1054300080E7A07F000700D5FFDF14F81E0F40F0C3 -:1054400008002070A4F81690C4F81890C4F81C90B6 -:105450006178084661F38200410861F3C30060701F -:10546000307AE07066E7A07F00F0030001280CD0DE -:10547000002150460AF01EFB040009D107E01BE0A2 -:1054800043E17FE075E04DE02BE00121F1E7FFDF34 -:10549000022104F189000DF07BFA1020287004F538 -:1054A000E4706860B4F88910298204F18000FE4934 -:1054B0006861C5E902813DE7A07F00F00300012893 -:1054C00005D0002150460AF0F5FA18B901E0012193 -:1054D000F8E7FFDF0CB0324621465046BDE8F04702 -:1054E00057E504B9FFDF20782128A1D930790128B8 -:1054F00002D002280AD103E0E07F40F01000E077FC -:1055000098F85C1041F0010188F85C1032462146A1 -:105510005046FFF73EFD0CB02046BDE8F047232182 -:10552000FDF715BE3279AA8005F10803082150461F -:1055300007F03BF9E86008B1112021E0A07F00F0FE -:105540000300012806D0002150460AF0B3FA0400F7 -:1055500003D101E00121F7E7FFDF04F16601022337 -:105560001022081FFFF78CFC80F800903179417001 -:10557000E0E60821504607F0F7FB00289BD11220F7 -:105580002870D7E6A07F00F00300012806D0002194 -:1055900050460AF08FFA050003D101E00121F7E738 -:1055A000FFDF95F8880000F00300012878D1A07F84 -:1055B00000F00307E07FC0F3400616B1012F04D0CE -:1055C0002BE095F8A400C0072AD0D5F8C01119B374 -:1055D00095F88720087C62F387000874E27FD5F88D -:1055E000C01162F341000874D5F8C01166F30000E1 -:1055F0000874AEB1D5F8C001102204F124018C3535 -:105600001BF0BCF8287E40F001002876287820F0B6 -:10561000010005F88C0900E016B1022F04D02CE03F -:1056200095F88C00C00726D0D5F8BC1119B395F8B1 -:105630008720087C62F387000874E27FD5F8BC11EC -:1056400062F341000874D5F8BC1166F300000874D9 -:105650008EB1D5F8BC01102204F124018C351BF069 -:105660008DF8287840F0010005F8180B287820F014 -:10567000010005F8A409022F43D0002000EB4000F0 -:1056800005EBC00090F88C00800709D595F88000E4 -:10569000D5F8C421400805F181011032FDF7A9FEBB -:1056A00005208DF8000095F888006A4600F0030098 -:1056B0008DF8010095F88C108DF8021095F8A40073 -:1056C0008DF8030021465046FFF782FC20782528FC -:1056D00005D0212807D0FFDF2078222803D92221F6 -:1056E0002046FDF734FDA07F00F0030001280AD01A -:1056F000002150460AF0F0F900283FF427AEFFDF02 -:1057000018E60120BAE70121F3E7716881F80190FA -:1057100010E6FFDF0EE670B5634C0025103C14F870 -:105720005C0F20F08000207065600BF05AFD5E4930 -:10573000A1F1100003F07CFE04F82C5C06206072DE -:1057400059487C3020615030A0611030E06170BD5C -:1057500070B50D46FDF7C3FC040000D1FFDF4FF428 -:10576000E87128461BF0A3F84F485430686104F1F3 -:1057700024002861A07F00F00300012808D0022146 -:1057800005F59A700BF02EFD002800D0FFDF70BDEC -:105790000121F5E70A46014602F59A700BF042BD79 -:1057A00070B505464068A0B00178092906D00C29DB -:1057B00038D00D2934D0FFDF20B070BD4688304688 -:1057C000FDF78DFC040000D1FFDF20782128F3D005 -:1057D000282822D1686802210C3001F0D1F9E0B10B -:1057E00068680821001D01F0CBF9B0B12D208DF8BB -:1057F0000000ADF80460102204F124010DF1060050 -:105800001AF0BCFF0BA9684606F0B8FE00B1FFDF36 -:1058100029212046FDF79BFCCEE703F079FECBE77C -:1058200001218171686886883046FDF758FC0400C4 -:1058300000D1FFDFA07F00F00301022902D120F098 -:105840001000A077207821280AD06868817909B1F2 -:10585000807880B1A07F00F0030002285AD0FFDFDB -:10586000A07F00F003000228A6D1FDF72BFE002840 -:10587000A2D0FFDFA0E703F04BFEE07FC10724D0FA -:10588000800701D5062000E0052084F82300207859 -:1058900029281CD02428E3D1314606200DF08AFBAC -:1058A0002221204602E0000024020020FDF74FFCE8 -:1058B000A07F00F0030001282AD0002130460AF022 -:1058C0000BF90028CCD0FFDFCAE70420DDE7A07F7A -:1058D00000F00300012806D0002130460AF0EAF863 -:1058E000050003D101E00121F7E7FFDF2521204674 -:1058F000FDF72DFC0F208DF868001AA905F59A70A8 -:105900000BF087FC0228ABD00028A9D0FFDFA7E767 -:105910000121D3E703F0FCFDA2E72DE9F0438BB0B2 -:105920009946154688460646FDF7D9FB04004FD038 -:10593000207822284CD323284AD0E07FC00647D4C1 -:10594000A07F00F00300012806D0002130460AF0B5 -:10595000B1F8070002D00CE00121F7E7A07F00F0CA -:105960000300012805D10121002230460AF099F8F0 -:10597000074601AB02AA03A93846FFF7F9FB0398D3 -:1059800000B9FFDF4FB1039807F59A778761207858 -:10599000222806D0242804D007E00399002088613B -:1059A00003E025212046FDF7D2FB03980B2141702F -:1059B00046628580C0E902890299016101994161CD -:1059C00004A90BF046FC022802D0002800D0FFDF1B -:1059D0000BB0BDE8F083F0B587B00746FDF77FFB5D -:1059E000017822291DD9807F00F00300012806D00C -:1059F000002138460AF05EF804003FD101E00121A1 -:105A0000F7E7FFDF3AE000BFB4F8621004F1660088 -:105A100008440178427831B121463846FFF7DBFB74 -:105A2000B8B907B0F0BDADF804200821384602AB84 -:105A300006F0BBFE03900028F3D011208DF8000083 -:105A4000694604F59A700BF0E4FB022801D000B11E -:105A5000FFDF04F162052E88B01C80B22880102878 -:105A600001D3103828806888022800D2FFDFB61CD6 -:105A7000102E00D9FFDF6888801E6880B4F86400AB -:105A80000028C1D1CDE730B587B00546FDF727FB2B -:105A90000446007822281FD90821284607F064F917 -:105AA000002819D1A07F00F00300012806D00021B2 -:105AB000284609F0FFFF040003D101E00121F7E7C8 -:105AC000FFDF12208DF80000694604F59A700BF094 -:105AD000A0FB002800D0FFDF07B030BD2DE9F05F4C -:105AE00005460C4600270078904601093E46BB4615 -:105AF00004F1080A02297CD0072902D00A2909D119 -:105B000042E068680178092905D00C292CD00D29BC -:105B10002AD0FFDFC6E114271C26002C6AD040885B -:105B2000A080FDF7DCFA5FEA000900D1FFDF99F8F9 -:105B300017005246400809F11801FDF75AFC686841 -:105B40008089208268684168C4F812108068C4F8AF -:105B50001600A07E20F0060040F00100A07699F823 -:105B60001E0040F040014DE01A270A26002CD5D037 -:105B70008088A080FDF7B3FA050000D1FFDF514611 -:105B80002846FFF7C6FA8DE10CB1288BA080287A51 -:105B90000E287CD006DC01287AD0022808D0032801 -:105BA00004D135E0102874D0112873D0FFDF79E1DB -:105BB0001E270926002CB1D0A088FDF790FA5FEAD5 -:105BC000000900D1FFDF287B00F003000128207AC4 -:105BD0001BD020F001002072297B890861F341006D -:105BE0002072297BC90861F382002072297B090990 -:105BF00001E04CE119E161F3C300207299F81E0045 -:105C000040F0800189F81E104CE140F00100E2E70D -:105C100013270D26002CAAD0A088FDF760FA814634 -:105C2000807F00F00300012806D00021A08809F041 -:105C300041FF050003D101E00121F7E7FFDF99F8FB -:105C40001E0000F00302012A59D0E86F817801F0AC -:105C500003010129217A54D021F0010121728378B6 -:105C60009B0863F3410121728378DB0863F38201AF -:105C7000217283781B0963F3C3012172037863F3F4 -:105C800006112172437863F3C711217203E060E0CB -:105C9000A6E08EE09EE084F809B0C178A172012AE6 -:105CA00032D04279E17A62F30001E172427952081E -:105CB00062F34101E1724279920862F38201E1727A -:105CC0004279D20862F3C301E1720279217B62F367 -:105CD000000121730279520862F3410121730279B4 -:105CE000920862F3820121730079C00860F3C30156 -:105CF000217399F8000023285AD9262168E0A86F5B -:105D0000A4E741F00101A9E70279E17A62F3000119 -:105D1000E1720279520862F34101E172027992085C -:105D200062F38201E1720279D20862F3C301E17287 -:105D30004279217B62F3000121734279520862F3B8 -:105D4000410121734279920862F382012173407903 -:105D5000CBE718271026002C67D0A088FDF7BFF9E5 -:105D60008246807F00F00300012807D00021A08830 -:105D700009F0A0FE5FEA000903D101E00121F6E786 -:105D8000FFDFE868A06099F8000040F0040189F89E -:105D9000001099F80100800708D5012020739AF8B7 -:105DA000000023287ED92721504663E084F80CB0F8 -:105DB00078E015270F26C4B3A088FDF790F9814637 -:105DC00006225146E86806F041FC0120A073AEE0CF -:105DD00048464FE0162709263CB3287B207261E035 -:105DE000297BFE4802290CD019270E26ECB1012987 -:105DF0000DD003291AD004291BD0052919D0FFDFA3 -:105E000023E01B270926BCB30121217205E00121F3 -:105E10002172617A21F00301617210F85C1F4A0857 -:105E2000520062F3060101700FE02BE002202072A5 -:105E300007E0687B052900F00F0040F08000207229 -:105E40001BD0607A20F003006072A088FDF747F94C -:105E500005460078212825D0232800D0FFDFA87F21 -:105E600000F00300012810D00021A08809F034FEC2 -:105E700022212846FDF76BF914E0607A20F0030038 -:105E8000401CE1E7A8F8006011E00121EDE70CB14A -:105E90006888A080287A03282BD004280AD00528F7 -:105EA0004BD0FFDFA8F800600CB12780668000208F -:105EB000BDE8F09F15270F26002CE3D0A088FDF742 -:105EC0000EF9807F00F00300012806D00021A08891 -:105ED00009F0F0FD050003D101E00121F7E7FFDF44 -:105EE000D5F821000622514606F0B0FB84F80EB02A -:105EF000D8E717270926002CC4D0A088FDF7EFF8B3 -:105F00008146807F00F00300012806D00021A08890 -:105F100009F0D0FD050003D101E00121F7E7FFDF23 -:105F20006878800701D5022000E00120207299F8EE -:105F300000002328B6D927214AE719270E26002C6E -:105F4000A0D0A088FDF7CBF85FEA000900D1FFDF01 -:105F5000C4F808B0A4F80CB084F808B0A07A40F0F7 -:105F60000300A07299F81F1061F38200A07299F8E3 -:105F70001F1001EA510161F3C300A072687A00F0BA -:105F8000030001288ED1607A40F00400607299F815 -:105F90001E00E97A00F00300012813D0607B61F352 -:105FA00000006073AA7A217B62F300012173EA7A10 -:105FB000520862F341006073A87A400860F341011F -:105FC00021736FE7207B61F300002073AA7A617B65 -:105FD00062F300016173EA7A520862F341002073B0 -:105FE000A87A400860F3410161735BE710B57B4C10 -:105FF00030B10146102204F120001AF0BFFB01204D -:1060000084F8300010BD10B50446FEF7FEFF73495A -:1060100020461022BDE8104020311AF0AFBB70B509 -:106020006E4C06004FF0000514D00DF007F808B1D3 -:1060300010250DE00621304606F0EFFA411C06D08F -:10604000206614F85C0F40F08000207000E0072507 -:10605000284670BD14F85C0F20F08000F5E700784A -:1060600010F00F0204D0012A05D0022A0CD110E052 -:10607000000909D10AE00009012807D0022805D04B -:10608000032803D0042801D007207047087000209F -:1060900070470620704705282AD2DFE800F0030782 -:1060A0000F171F00087820F0FF001EE0087820F08E -:1060B0000F00401C20F0F000103016E0087820F0AF -:1060C0000F00401C20F0F00020300EE0087820F097 -:1060D0000F00401C20F0F000303006E0087820F07F -:1060E0000F00401C20F0F000403008700020704786 -:1060F000072070472DE9F041804688B00D46002703 -:1061000008460CF0E8FFA8B94046FCF7E8FF040099 -:1061100003D02078222815D104E043F2020008B011 -:10612000BDE8F08145B9A07F010603D500F003006A -:10613000022801D01020F2E7A07FC10601D4010798 -:1061400002D50DB10820EAE7244991F85C10C9078F -:1061500001D01120E3E7E17FC90601D50D20DEE77C -:1061600000F00300022805D125B12846FEF7A3FE62 -:106170000700D4D1A07F00F00300012806D0002141 -:10618000404609F097FC060002D00DE00121F7E738 -:10619000A07F00F0030001280CD00021002240461F -:1061A00009F07FFC060007D0A07F00F00300022862 -:1061B00004D009E00121F1E70420B0E725B12A4627 -:1061C00031462046FEF79BFE07AB1A46694630462D -:1061D000FEF7CEFF009800B9FFDF01E014020020B7 -:1061E00000990C20487006F59A70C1F82480486127 -:1061F00000200881A07F00F00300012828D0EDB323 -:1062000002200871301D8861307840090877707865 -:10621000C0F340004877287800F00102887F62F3DD -:1062200001008877E27F62F382008877E27F52087C -:1062300062F3C3008877727862F304108877A878D5 -:10624000C87701F1210228462031FEF778FE22E0CE -:1062500001200871287800F00102087E62F3010035 -:1062600008762A78520862F3820008762A78920823 -:1062700062F3C30008762A78D20800E007E062F3F0 -:106280000410087624212046FCF761FF0BE0032070 -:1062900008710520087625212046FCF758FFA07FCD -:1062A00020F08000A07701A900980AF0D2FF022810 -:1062B00001D000B1FFDF384631E72DE9FF4FF94A41 -:1062C0000D4699B09A4607CA14AB002783E8070029 -:1062D0001998FCF704FF060006D03078262806D06F -:1062E00008201DB0BDE8F08F43F20200F9E7B07F4F -:1062F00000F00309B9F1010F03D0B9F1020F07D083 -:1063000008E03DB91B98FEF7D6FD0028E9D101E071 -:106310001B9878BBB07F00F00300012806D0002155 -:10632000199809F0C7FB040003D101E00121F7E748 -:10633000FFDF852D25D007DCD5B1812D1BD0822D27 -:106340001BD0832D08D11AE0862D1CD0882D1CD09F -:10635000892D1CD08A2D1CD00F2020710F281AD017 -:1063600001208DF83400201D0E902079A8B158E14D -:106370000020F2E70FE00120EFE70220EDE7032025 -:10638000EBE70520E9E70620E7E70820E5E7092035 -:10639000E3E70A20E1E70720A3E7B9F1010F17D0EF -:1063A000D4E91E5080460220019001200090A87878 -:1063B00098F80210C0F3C000C1F3C00108405FEAC2 -:1063C000000B5DD050460CF039FE00286CD12DE05A -:1063D000D4E91E850120019002200090214630461C -:1063E0001B9AFEF78CFD1B98007800F00101A8783D -:1063F00061F30100A870F17F61F38200A870F17F62 -:10640000490861F3C300A870617861F30410A870B3 -:106410002078400928706078C0F3400068701B98AD -:106420008078E870002068712871C0E7DAF80C0005 -:106430000CF004FEC0BBDAF81C000CF0FFFD98BBAA -:10644000DAF80C00A060DAF81C00E06098F80100AF -:10645000617800F0010041EA4000607098F8021095 -:10646000C0B2C1F30011891E08406070002084F89A -:106470002000009906F1170002290BD001210AE043 -:1064800098F80110607801F00101FD2242EA410113 -:106490000840E2E7002104EB810188610199701C4A -:1064A000022902D0012101E028E0002104EB810152 -:1064B0008861A87800F00300012849D198F802000B -:1064C00000F00300012843D1B9F1010F04D12A1DC6 -:1064D000691D1B98FEF733FD297998F804000140E7 -:1064E0008DF82C10687998F8052010408DF8300050 -:1064F00001432DD050460CF0A1FD08B11020F0E66C -:106500000AF1100004F5DE7104F190020490B9F173 -:10651000020F3CD00090CDE9012100210BAB5A467F -:106520002046FEF786FD0028E9D104F5E07104F16C -:10653000A802B9F1010F30D004980090CDE90121F3 -:1065400000210CAB5A462046FEF773FD0028D6D139 -:106550006078800740D4A87898F80210C0F38000D3 -:10656000C1F38001084337D0297898F8000014AAB5 -:10657000B9F1010F17D032F810204B00DA4012F0B9 -:10658000030718D0012F1ED0022F12D11DE0CDF825 -:1065900000A0CDE901210121C0E7CDF800A0CDE99F -:1065A00001210121CDE732F811204300DA4002F049 -:1065B0000307032F07D0BBF1000F0DD0012906D030 -:1065C000042904D008E00227F5E70127F3E70128B2 -:1065D00001D0042800D10427F07F40F001006BF3C4 -:1065E0004100F077607881074FF003000CD5A0716F -:1065F000BBF1000F15D100BF8DF85C0017AA314622 -:106600001998FEF7E5FC0CE00221022F18D0012FAB -:1066100018D0042F22D00020A071F07F20F00100BC -:10662000F07725213046FCF792FD0DA904F59A700C -:106630000AF0EFFD10B1022800D0FFDF002050E685 -:10664000A171D9E7A1710D2104F124001AF02FF9ED -:10665000207840F0020020700420CDE70120A071D6 -:10666000DFE72DE9F04387B09046894604460025D0 -:10667000FCF735FD060006D03078272806D0082024 -:1066800007B0BDE8F08343F20200F9E7B07F00F005 -:106690000300012808D00021204609F00BFA04006D -:1066A00005D103E0680C02000121F5E7FFDFA779BF -:1066B0005FEA090005D0012821D0B9F1020F26D1E7 -:1066C00010E0B8F1000F22D1012F05D0022F05D024 -:1066D000032F05D0FFDF2DE00C252BE0012529E05D -:1066E000022527E040460CF0A9FCB0B9032F0ED1DB -:1066F0001022414604F121001AF040F81AE0012F5F -:1067000002D0022F03D104E0B8F1000F12D007200D -:10671000B6E740460CF092FC08B11020B0E710211B -:1067200004F121001AF0A1F80621404605F075FF9A -:10673000C4F821002078252140F002002070304666 -:10674000FCF705FD2078C10714D020F0010020706F -:1067500002208DF8000004F1210002908DF8045011 -:10676000694604F59A700AF054FD022804D018B165 -:10677000FFDF01E084F82050002081E730B587B0CA -:106780000D460446FCF7ABFC88B1807F00F00300A7 -:1067900001280FD00021204609F08CF904000ED00A -:1067A00028460CF04BFC38B1102007B030BD43F246 -:1067B0000200FAE70121EEE72078400701D4082023 -:1067C000F3E7294604F141002022054619F0D6FFDF -:1067D000207840F01000207001070FD520F008004D -:1067E000207013208DF80000694604F59A70019519 -:1067F0000AF00FFD022801D000B1FFDF0020D4E72E -:1068000070B50D460646FCF76AFC18B101782729D9 -:106810001FD102E043F2020070BD807F00F0030050 -:10682000012806D00021304609F044F9040003D1C4 -:1068300001E00121F7E7FFDFA079022809D16078A4 -:10684000C00706D02A4621463046FEF7C4FC10B1E8 -:106850000FE0082070BDB4F864000E280BD204F1DC -:10686000660102231022081FFEF70AFB01210170B6 -:106870004570002070BD112070BD70B5064686B011 -:1068800014460D4608460CF0D9FB18B920460CF00A -:10689000FBFB10B1102006B070BDA6F57F40FF389D -:1068A0000ED03046FCF71BFC38B1417822464B082D -:1068B000811C1846FCF79DFD07E043F20200EAE761 -:1068C0002046FDF724FC0028E5D11021E01D0CF046 -:1068D0005FF8E21D29466846FEF765FC102204F1C8 -:1068E0001700019919F04AFF0020D4E72DE9F04183 -:1068F000044686B015468846002708460CF0EBFB98 -:1069000018B928460CF0E7FB10B1102006B007E4D8 -:106910002046FCF7E4FB060003D03078272818D186 -:1069200002E043F20200F1E7B07F00F0030001282B -:1069300006D00021204609F0BDF8040003D101E093 -:106940000121F7E7FFDF2078400702D56078800754 -:1069500001D40820DAE7B07F00F00300012818D046 -:10696000D4E91E01407800B1B5B1487810B1B8F152 -:10697000000F11D0C5B1EA1D6846E168FEF713FCAF -:10698000102205F11700019919F0CCFE30B104274F -:106990000AE0D4E91E10E5E70720B7E71022E91D59 -:1069A00004F1310019F0EAFEB8F1000F06D0102210 -:1069B00008F1070104F1210019F0E0FE20782521FB -:1069C00040F0020020703046FCF7C1FB2078C10780 -:1069D00016D020F00100207002208DF8000004F194 -:1069E00021000290103003908DF80470694604F580 -:1069F0009A700AF00EFC022804D018B1FFDF01E003 -:106A000084F82070002081E7F8B515460E46074649 -:106A1000FCF765FB040004D02078222804D008206D -:106A2000F8BD43F20200F8BDA07F00F00300022889 -:106A300002D043F20500F8BD30460CF0FFFA18B959 -:106A400028460CF0FBFA08B11020F8BD00953288FA -:106A5000B31C21463846FEF7E2FB112814D000286B -:106A6000F3D1297C4A08E17F62F30001E1772A7CB7 -:106A700062F34101E177297C890884F82010A17F25 -:106A800021F08001A177F8BDA17F0907FBD4D6F8DA -:106A90000200C4F83600D6F80600C4F83A00308880 -:106AA000A0861022294604F1240019F067FE287CF4 -:106AB0004108E07F61F38200E077297C61F3C30045 -:106AC000E077287C800884F82100A07F40F008004F -:106AD000A0770020D3E770B59AB00D46064613B1F3 -:106AE00007201AB070BDFCF7FAFA040007D020782E -:106AF000222802D3A07F400604D40820F1E743F205 -:106B00000200EEE7CDB12D208DF80000ADF8046055 -:106B1000102229460DF1060019F030FE287C4108AC -:106B2000E07F61F30000E077297C61F34100E077CA -:106B3000287C800884F8200004E02E208DF80000D6 -:106B4000ADF804600BA9684605F018FDA17F21F09F -:106B50004001A177C5E770B50D46FCF7C0FA040007 -:106B600005D028460CF090FA20B1102070BD43F2F9 -:106B7000020070BD29462046FEF7CBFA002070BD0A -:106B800005E000BF10F8012B0AB100207047491E34 -:106B900089B2F7D20120704718B18178012938D124 -:106BA00001E010207047018842F60112881A9142D4 -:106BB00031D018DC42F60102A1EB020091422AD04A -:106BC0000CDC41B3B1F5C05F25D06FF4C05008189C -:106BD00021D0A0F57060FF381BD11CE001281AD02D -:106BE00002280AD117E0B0F5807F14D008DC012814 -:106BF00011D002280FD003280DD0FF2809D10AE0B8 -:106C0000B0F5817F07D0A0F58070033803D001284C -:106C100001D0002070470F2070470B2826D008DCD9 -:106C20001BD2DFE800F01C2025251A252923252763 -:106C30001E0011281CD008DC0C2817D00D281DD0F0 -:106C40000F2815D0102808D110E0822809D08428F8 -:106C500010D0852810D0872812D00320704700203C -:106C600070470520704743F20300704707207047C4 -:106C70000F20704704207047062070470C20704793 -:106C800043F20200704708280DD2DFE800F0040646 -:106C9000040C0C080A0A00207047112070470720D6 -:106CA0007047082070470320704738B50C46050030 -:106CB00041D06946FFF7D3F9002819D19DF800109B -:106CC000607861F3020060706946681CFFF7C7F9DD -:106CD00000280DD19DF80010607861F3C500607048 -:106CE000A978C1F34101012903D0022905D0072069 -:106CF00038BD217821F0200102E0217841F0200107 -:106D00002170410704D0A978C90861F3861060702A -:106D1000607810F0380F07D0A978090961F3C7101F -:106D2000607010F0380F02D16078400603D52078EB -:106D300040F040002070002038BD70B504460020AF -:106D4000088015466068FFF7B0FF002816D120893B -:106D5000A189884211D860688078C0070AD0B1F54F -:106D6000007F0AD840F20120B1FBF0F200FB1210C4 -:106D7000288007E0B1F5FF7F01D90C2070BD01F23A -:106D800001212980002070BD10B50478137864F3C8 -:106D9000000313700478640864F3410313700478EB -:106DA000A40864F3820313700478E40864F3C30353 -:106DB00013700478240964F30413137004786409CD -:106DC00064F3451313700078800960F38613137021 -:106DD00031B10878C10701D1800701D5012000E059 -:106DE000002060F3C713137010BD4278530702D020 -:106DF00002F0070306E012F0380F02D0C2F3C2031C -:106E000000E001234A7863F302024A70407810F0F0 -:106E1000380F02D0C0F3C20005E0430702D000F0F3 -:106E2000070000E0012060F3C5024A7070472DE9B9 -:106E3000F04F95B00D00804615D0B8F1000F16D078 -:106E40001221284619F011FD4FF6FF7B05AA0121FA -:106E5000584605F0DDF90024264637464FF4205900 -:106E60006FF4205A75E0102015B0BDE8F08F0720B0 -:106E7000FAE700BF9DF81E0001280AD1BDF81C00EA -:106E800048450BD010EB0A000AD001280CD002288C -:106E90000CD0042C0ED0052C0FD10DE0012400E005 -:106EA0000224BDF81A6008E0032406E00424BDF8BB -:106EB0001A7002E0052400E00624BDF81A104145CE -:106EC00047D12C74BEB34FF0000810AA4FF0070A48 -:106ED000CDE90282CDE900A80DF13C091023CDF8DF -:106EE000109042463146584605F045FA08BBBDF8B9 -:106EF0003C002A46C0B210A90AF04CFAC8B9AE81CB -:106F0000CFB1CDE900A80DF1080C0AAE40468CE8DF -:106F10004102132300223946584605F02CFA40B9A5 -:106F2000BDF83C00F11CC01EC0B22A1D0AF032FAA6 -:106F300010B1032098E70AE0BDF82900E881062C8B -:106F400005D19DF81E00A872BDF81C002881002004 -:106F50008AE705A805F068F900288BD0FFF75DFEE9 -:106F600082E72DE9F0471C46DDE90978DDF820903D -:106F700015460E00824600D1FFDF0CB1208818B103 -:106F8000D5B11120BDE8F087022D01D0012100E02C -:106F9000002106F1140004F013F8A8F800000246DE -:106FA0003B462946504605F000FCC9F8000008B9E8 -:106FB000A41C3C600020E5E71320E3E7F8B50D468C -:106FC00006461446DDE90710069ACAB10346009149 -:106FD00004222146304605F0F7FC5CB1022C08D1B2 -:106FE000A87CC00705D02146304605F0BDFE002034 -:106FF000A874F8BD21463046BDE8F84005F0B4BE9F -:107000001880F8BD2DE9FF4791461A881C468A462C -:1070100080460AB303AB494605F0C7FB05001BD009 -:107020004046A61C278808F062FE324607262946FD -:107030003B46009608F0E8FA208803990095CDE9D0 -:10704000011023464A4651464046FFF7B7FF00204D -:107050002080012004B095E70020FBE72DE9F047F0 -:107060008CB00D46DDE9149882461C461746022670 -:10707000142103A819F01BFC012002218DF8101027 -:107080008DF80C008DF81180ADF8147064B1A17802 -:10709000C90709D08DF81600E088ADF81A00A0885D -:1070A000ADF81800A06807900AAA09A908A88DE8F9 -:1070B00007003246294650466B68FFF752FF00280A -:1070C0000ED1DDE9080105F114028DE807000AABD5 -:1070D0004A4603A9504604F037FB18B1FFF7D3FD29 -:1070E0000CB04FE7DDE90801BDF828208DE8070066 -:1070F0003246294650466B68FFF760FF0020EFE7F5 -:10710000F0B58BB000240646069407940727089430 -:1071100005A80994019400970294CDE903400D4617 -:1071200010232246304605F026F978B90AA806A9A8 -:10713000019400970294CDE90310BDF814300022A9 -:107140002946304604F0EEFE002801D0FFF765FD29 -:107150000BB0F0BD04F080BD2DE9FC410C4680462B -:10716000002602F0D2F9054620780D287ED2DFE80D -:1071700000F0B2070BA918B33C5C6C8FA5949A0081 -:10718000404602F0F1F9A7E00421404608F092FCE5 -:10719000070000D1FFDF07F11401404603F0A4FE11 -:1071A0006AE00421404608F085FC070000D1FFDFBB -:1071B000E088ADF800000020B8819DF800000107CC -:1071C00004D5C00602D5A088B88105E09DF801006D -:1071D000400609D5A088F88105B9FFDF2246294677 -:1071E000404601F017FD022676E0A088694605F0CA -:1071F000A5F900B1FFDF9DF8020001280BD1BDF811 -:10720000000042F6011188420BD0A0F5245102394A -:1072100007D0491E05D0E079000600D5022635BB0F -:1072200001E0042658E0FFDF27E0E079000609D5F9 -:107230000421404608F03EFC060000D1FFDFA08894 -:10724000F08102269DB9FFDF17E00421404608F0D7 -:1072500031FC070000D1FFDF07F1140004F033FD1B -:1072600090F0010F05D1E079000601E033E004E081 -:1072700032D50226A7F810802DB122462946404675 -:1072800001F0C8FC28E013214046FDF7CEFA23E0C8 -:107290000226002DF1D1FFDFEFE702260121404653 -:1072A00002F0AEF918E0606800902089ADF80400A3 -:1072B00001226946404602F0C4F90DE0002DDCD100 -:1072C000FFDFDAE7022600214046FBF790F8002DA9 -:1072D000D3D1FFDFD1E7FFDF3046BDE8FC813EB50B -:1072E0000C0009D001466B4601AA002005F0C5F844 -:1072F00020B1FFF792FC3EBD10203EBD0020208053 -:10730000A0709DF8050002A900F00700FEF7C3FE7B -:1073100050B99DF8080020709DF8050002A9C0F33F -:10732000C200FEF7B8FE08B103203EBD9DF808007C -:1073300060709DF80500C109A07861F30410A07089 -:107340009DF80510890961F3C300A0709DF8041031 -:10735000890601D5022100E0012161F342009DF878 -:10736000001061F30000A07000203EBD70B514460F -:1073700006460D4651EA040005D075B108460BF0EB -:10738000A1FE78B901E0072070BD2946304605F01E -:10739000D5F810B1BDE870403FE454B120460BF081 -:1073A00091FE08B1102070BD21463046BDE8704006 -:1073B00095E7002070BD2DE9FE4F0C46904605462E -:1073C000002701780822007A3E46B2EB111F7DD1DA -:1073D00004F10A010091891E02910C31821E4FF0C6 -:1073E000020B4FF0010A0191092A70D2DFE802F086 -:1073F000F5F4056F252579B8F6006888042108F0B2 -:1074000059FB060000D1FFDFB08910B152270726D3 -:10741000EBE051271026002C7ED06888A08084F8ED -:1074200006A0A88900220099FFF7A0FF002874D1C8 -:10743000A8892081288AE081FDE0B5F8129007280C -:1074400025D1E87B000622D5512709F1140086B228 -:10745000002CE1D0A88900220099FFF787FF0028BF -:107460007CD16888A08084F806B0A889208184F83F -:107470000EA0288A2082A4F81290A88A009068881A -:107480004B46A969DDF8042001F0A1FBD3E05027A9 -:1074900009F1120086B2002C3ED0A8890022029980 -:1074A000FFF764FF002859D16888A080A889E08090 -:1074B000287A072813D002202073288AE081E87BED -:1074C000C0096073A4F81090A88A01E0B0E0ADE0B4 -:1074D000009068884B4604F11202A969D4E70120A4 -:1074E000EAE76888042108F0E5FAB5F812A05FEA37 -:1074F000000900D1FFDF09F1140004F0E4FB90F073 -:10750000010F02D1E87B000627D50AF114005127AC -:1075100086B2002C7FD001E072E01FE06888A08076 -:10752000A88900220099FFF721FF002816D184F8CE -:1075300006B0A88920810420A073288A2082A4F89C -:1075400012A0A88A009068885346A969019A01F0A0 -:107550003EFBA989A9F80E106DE00320BDE8FE8F5F -:107560006888FBF7BCFD82466888042108F0A2FA0F -:107570008146BAF1000F00D1FFDFB9F1000F00D151 -:10758000FFDFB9F81010A1F57F40FF3802D0512776 -:10759000142601E05027122694B36888A080502F4B -:1075A00006D084F806B0287B029901F020FB42E067 -:1075B000287BA11D01F01BFB00219AF82300CDE9D7 -:1075C00000010B46B9F80E2068884946FFF746FDD2 -:1075D0000028C3D12FE001E013E01FE0FB49A88998 -:1075E000C988814205D1542706264CB16888A080FD -:1075F00021E053270CE06888A080A889E0801AE089 -:1076000009E06888042108F055FA00B9FFDF552722 -:107610000826002CEFD1A8F8006011E056270726B5 -:10762000002CF8D06888A080002012E0FFDF02E084 -:10763000012807D0FFDFA8F800600CB12780668022 -:1076400000208BE757270726002CE4D06888A0800D -:10765000687AA071EFE7401D20F00300042202EBDE -:10766000400201FB00207047D84B00221A7008B17D -:10767000D74A106007F0C7BB70B50C46064686B007 -:1076800015465C21204619F012F905B9FFDFA878EC -:10769000E074AA782988204601F0D2FA0020A0815F -:1076A000E0814FF6FF7020822A8804F114013046F1 -:1076B00003F0FFFB6A460121304604F0A9FD19E002 -:1076C0009DF80300000715D5BDF806103046FFF7FA -:1076D00017FD9DF80300BDF8061040F010008DF86E -:1076E0000300BDF80300ADF81400FF233046059AEF -:1076F00004F0EFFE684604F097FD0028E0D006B0E5 -:1077000070BD70B5064601F114000C46054603F045 -:1077100007FC0146E27C204601F0BEFA29463046CD -:10772000BDE8704003F0E7BB70B50546042108F0E2 -:10773000C1F9040000D1FFDF04F114012846BDE8BF -:10774000704003F0D1BB2DE9F0418CB00C4680466F -:107750000226FBF7C4FC050014D02878222829D380 -:107760000CB1A08898B101208DF8180003208DF885 -:107770001C0000208DF81D005CB1A088ADF824002D -:10778000206808E043F202000CB0BDE8F081092057 -:10779000FAE7ADF8240008900421404608F08AF981 -:1077A000040000D1FFDF04F11400074603F0CFFB13 -:1077B000C00601D40820E7E705AA04A903A88DE8BC -:1077C00007003246214640466368FFF7CAFB00B116 -:1077D000FFDFDDE903018DE8830095F8232005AB89 -:1077E00006A9404603F0B0FF10B1FFF74CFACBE713 -:1077F000BDF81420DDE903018DE80700324621467B -:1078000040466368FFF7DAFB4FF6FF7020820020E6 -:10781000BAE72DE9F047B2F80290824688B01546E3 -:1078200088464846FBF75BFC06460421484608F0BC -:1078300041F904460020059002270690ADF81C008F -:1078400006B9FFDF04B9FFDF3946484605F0A2FA62 -:1078500060B907AA06A905A88DE807003A4621469F -:1078600048466368FFF77DFB00B1FFDFDDE90512E5 -:1078700004F11400CDF80080CDE9032007ABCDE979 -:10788000013196F82320514648466B6803F0A8FB67 -:1078900006000AD0022E04D0032E16D0042E00D0EB -:1078A000FFDF08B03046BDE8F087BDF81C000028B7 -:1078B000F7D0DDE905120091CDE901203A462146D5 -:1078C00048466368FFF77AFBEBE7687840F008000A -:1078D0006870E6E72DE9F04F9BB004464FF00008D2 -:1078E0003A48ADF85480ADF83080ADF85080A0F83B -:1078F0000480ADF81480ADF81880ADF82080ADF8A4 -:107900001C80007816460D464746012809D00228FB -:1079100007D0032805D0042803D008201BB0BDE8F9 -:10792000F08F20460BF08AFBD0BB28460BF086FB7D -:10793000B0BB60680BF0CFFB90BB606848B160895A -:107940002189884202D8B1F5007F01D90C20E5E7F2 -:1079500080460BAA06A92846FFF7EFF90028DDD1DB -:1079600068688078C0F34100022808D19DF81900AA -:1079700010F0380F03D028690BF0A4FB80B905A9DB -:107980002069FFF792F90028C8D1206950B16078CA -:1079900080079DF8150000F0380002D5F0B301E033 -:1079A00011E0D8BB9DF81400800613D59DF8150092 -:1079B00010F0380F03D060680BF084FB18B96068D2 -:1079C0000BF089FB30B11020A8E700001003002065 -:1079D0001400002007A96069FFF767F900289DD10E -:1079E000606940B19DF81D0000F0070101293BD1FD -:1079F00010F0380F38D008A9A069FFF756F9002811 -:107A00008CD19DF81C0080062ED49DF820008006A5 -:107A10002AD4A06950B19DF8210000E024E000F0D4 -:107A20000701012920D110F0380F1DD0E06818B1EE -:107A30000078C8B11C2817D20EAA611C2046FFF797 -:107A4000A3F90120B94660F30F27BA4607468DF81F -:107A50004E0042F60300ADF84C000DF13B0217A9B1 -:107A6000286809F0B6FC08B1072057E79DF85C00CC -:107A700016A9CDF80090C01CCDE9019100F0FF0BD4 -:107A800000230BF20122514613A804F005FBE8BBCA -:107A9000BDF858000990FE482A8929690092CDE96D -:107AA00001106B89BDF82C202868069904F0F4FABF -:107AB00001007DD120784FF0020AC10601D4800672 -:107AC0002BD5ADF80C90606950B907A906A8FFF74F -:107AD0008CF99DF81D0020F00700401C8DF81D005A -:107AE0009DF81C008DF84E7040F0C8008DF81C0009 -:107AF00042F60210ADF84C000CA903AACDF800A084 -:107B0000CDE90121002340F2032200E01FE013A889 -:107B1000079904F0C1FA01004AD1DD484D46001F23 -:107B20005B468088ADF839000EA8CDE90290CDF80B -:107B30000490CDF810904FF007090022CDF8009086 -:107B4000BDF858104FF6FF7004F0ECF910B1FFF7D4 -:107B500064F8E3E69DF83800000625D529460120A3 -:107B600060F30F218DF84E704FF42450ADF84C00A7 -:107B7000ADF8105062789DF81000002362F3000009 -:107B80008DF810006278CDF800A0520862F3410031 -:107B90008DF8100004AACDE9012540F2032213A8B4 -:107BA00004F07AFA010003D1606888B3206900E02C -:107BB00087E098B905A906A8FFF717F9607880074C -:107BC00006D49DF8150020F038008DF8150005E06A -:107BD0009DF8140040F040008DF814008DF84E70B0 -:107BE00042F60110ADF84C00208940F20121B0FBB3 -:107BF000F1F201FB1202606814ABCDF80080CDE910 -:107C00000103002313A8059904F046FA010058D196 -:107C10002078C00729D0ADF80C50A06950B908A948 -:107C200006A8FFF7E2F89DF8210020F00700401CAD -:107C30008DF821009DF820008DF84E7040F0400036 -:107C40008DF8200042F60310ADF84C0015A903AAE8 -:107C5000CDF800A0CDE90121002340F2032213A8B2 -:107C6000089904F019FA01002BD1E06868B329469D -:107C7000012060F30F218DF84E7042F60410ADF82C -:107C80004C00E068002302788DF8602040788DF881 -:107C90006100E06818AA4088ADF86200E0680079E9 -:107CA0008DF86400E068C088ADF86500CDF80090FC -:107CB000CDE901254FF4027213A804F0EDF901009B -:107CC00003D0099801F011F828E671480321001F3C -:107CD000017056B180883080BDF850007080BDF8CA -:107CE0003000B080BDF85400F080002016E670B57A -:107CF00001258AB016460B46012802D0022816D16B -:107D000004E08DF80E504FF4205003E08DF80E5033 -:107D100042F60100ADF80C0063B10024601C60F372 -:107D20000F2404AA08A9184609F053FB20B1072024 -:107D30000AB070BD1020FBE704A99DF8202054482C -:107D4000CDE90021801E02900023214603A802F203 -:107D5000012204F0A1F910B1FEF75FFFE8E74C48FB -:107D6000001F0EB14188318005700020E0E7F0B5BA -:107D700093B0074601268DF83E6041F60100ADF84C -:107D80003C0012AA0FA93046FFF7B1FF002848D1E6 -:107D90003F4C0025241FE7B31C2102A818F087FDE3 -:107DA0009DF808008DF83E6040F020008DF8080036 -:107DB00042F60520ADF83C000E959DF83A0011956D -:107DC00020F00600801C8DF83A009DF838006A46C5 -:107DD00020F0FF008DF838009DF8390009A920F047 -:107DE000FF008DF839000420ADF82C00ADF830000C -:107DF0000EA80A9011A80D900FA80990ADF82E506A -:107E000002A8FFF767FD00280BD1BDF80000E08055 -:107E100000E008E0BDF804002081401C608125706E -:107E2000002013B0F0BDE5802581BDF84800F4E7DF -:107E30002DE9F74F1649A0B00024091F17940A78BE -:107E4000A146012A04D0022A02D0082023B066E508 -:107E50004A88824201D00620F8E721988A46824269 -:107E600001D10720F2E701202146ADF848004FF686 -:107E7000FF788DF86E0042F6020B60F30F21ADF82B -:107E80004A80ADF86CB006918DF8724002E00000B7 -:107E9000140300201CA9ADF870401391ADF8508078 -:107EA00012A804F0E5F900252E462F460DAB072257 -:107EB00012A9404604F0DFF978B182285DD195B36C -:107EC0008EB3ADF86450ADF866609DF85E008DF835 -:107ED000144019AC012864D06BE09DF83A001FB340 -:107EE000012859D1BDF8381059451FD118A809A942 -:107EF00001940294CDE9031007200090BDF83610DC -:107F000010230022404604F036FAB0BBBDF86000F2 -:107F1000042801D006284AD1BDF8241021988142B6 -:107F20003AD10F2092E73AE0012835D1BDF8380068 -:107F3000B0F5205F03D042F6010188422CD1BAF897 -:107F40000200BDF83610884201D1012700E0002769 -:107F500005B19EB1219881421ED118A809AA0194A9 -:107F60000294CDE90320072000900D461023002243 -:107F7000404604F000FA00B902E02DE04E460BE066 -:107F8000BDF86000022801D0102810D1C0B217AA95 -:107F900009A909F0FFF950B9BDF8369086E7052028 -:107FA00054E705A917A8221D09F013FA08B1032008 -:107FB0004CE79DF814000023001DC2B28DF8142078 -:107FC00022980092CDE901401BA8069904F064F8BC -:107FD00010B902228AF80020FEF71FFE36E710B51E -:107FE0000B46401E88B084B205AA00211846FEF751 -:107FF000CBFE00200DF1080C06AA05A901908CE823 -:108000000700072000900123002221464FF6FF7051 -:1080100003F088FF0446BDF81800012800D0FFDFF8 -:108020002046FEF7FAFD08B010BDF0B5FF4F04463C -:1080300087B038780E46032804D0042802D00820E0 -:1080400007B0F0BD04AA03A92046FEF776FE05009E -:10805000F6D160688078C0F3410002280AD19DF80B -:108060000D0010F0380F05D020690BF02BF808B187 -:108070001020E5E7208905AA21698DE807006389BA -:10808000BDF810202068039904F006F810B1FEF73F -:10809000C4FDD5E716B1BDF8140030800420387057 -:1080A0002846CDE7F8B50C0006460CD001464FF641 -:1080B000FF7500236A46284604F0DFF928B100BFA7 -:1080C000FEF7ABFDF8BD1020F8BD69462046FEF76F -:1080D000ECFD0028F8D1A078314600F001032846D5 -:1080E000009A04F0F6F9EBE730B587B014460022A9 -:1080F0000DF1080C05AD01928CE82C0007220092CE -:108100000A46014623884FF6FF7003F00BFFBDF8C7 -:1081100014102180FEF781FD07B030BD70B50D460B -:10812000042107F0C7FC040000D1FFDF294604F159 -:108130001400BDE8704002F003BF70B50D46042185 -:1081400007F0B8FC040000D1FFDF294604F1140059 -:10815000BDE8704002F017BF70B50D46042107F06E -:10816000A9FC040000D1FFDF294604F11400BDE89A -:10817000704002F02FBF70B50546042107F09AFC4D -:10818000040000D1FFDF214628462368BDE8704087 -:108190000122FEF737BF2DE9F0478246042107F0A0 -:1081A00089FC040000D1FFDF04F1140002F0B8FEE6 -:1081B000401D20F0030626E0011D00880022431820 -:1081C00021465046FEF71EFF002820D0E07CA5681F -:1081D00070431FFA80F82888B7B2814610FA86F0FB -:1081E00080B22880404502D3A0EB08002880688830 -:1081F000B84200D2FFDF09EB0701414500D9FFDF9C -:108200006888C01B6880A06841880029D4D1BDE877 -:10821000F08770B50546042107F04CFC040000D13E -:10822000FFDF214628466368BDE870400222FEF762 -:10823000E9BE70B50E46054601F067F9040000D1AD -:10824000FFDF0120207266726580207820F00F0029 -:10825000001D20F0F00040302070BDE8704001F0BB -:1082600057B910B50446012900D0FFDF2046BDE80C -:1082700010400121FAF7BBB82DE9F34F9BB04FF046 -:10828000000B0C00ADF81CB05E461BD0E06830B1AE -:10829000A068B8B10188ADF81C10A0F800B01B9818 -:1082A000FAF71DFF5FEA000943F2020769D099F867 -:1082B0000000222863D304211B9807F0FBFB050074 -:1082C00005D103E010201DB0BDE8F08FFFDF05F100 -:1082D0001400109002F024FE401D20F00308A07846 -:1082E000012803D0022801D00720ECE7208878B1CC -:1082F000401C81B20BAA1B9803F08AFF0BA803F065 -:1083000093FF9DF836204FF45051012A0DD102E021 -:1083100043F20300D7E7BDF83420A2F52453023B13 -:1083200003D1822801D0A0B901E00846CBE7E0687C -:10833000B0B1CDE902B0072007AA0090CDF804B093 -:108340000492A2882188BDF81C301B9803F0EAFD36 -:1083500010B1FEF762FCB6E7A168BDF81C0008800A -:108360009DF82F00C00602D543F20140ABE70F98FD -:1083700038B1A1780078012905D080072AD40820D7 -:10838000A1E738469FE7C007F9D0002003900220FC -:108390008DF84C00A868EA7C418802FB08F28A420A -:1083A0001ED9031D0A93008896B247181FFA88FA4F -:1083B000B74200D3BF1B01EB0A00B04200D9FFDF78 -:1083C00007EB0A00B04200D9FFDF0A98C619A6F8E9 -:1083D00000B005E00120039003208DF84C002E68CA -:1083E0009DF8300010F0380F00D1FFDF9DF830000D -:1083F0000F49C0F3C200084410F8011C99F823008B -:10840000814201D90F205EE72088ADF8500008AA0C -:1084100006A905A88DE8070033462946039A1B984C -:10842000FEF79FFD002896D104E000001003002015 -:10843000FA2F0000DDE90501109A8DE8070008AB6E -:10844000072213A91B9803F07FF910B1FEF71BFC5C -:1084500039E7BDF82020DDE905018DE80700334646 -:108460002946039A1B98FEF7A9FD0598D0B9A07874 -:10847000012817D1E87CAC6800FB08F086B221889F -:1084800060881FFA88F70D18B54200D3AD1B384439 -:10849000B04200D9FFDFE819B04200D9FFDF6088A1 -:1084A0003844608000200EE770B5064615460C463D -:1084B0000846FEF771FB002805D12A4621463046C2 -:1084C000BDE8704013E470BDB2E470B51E461446BA -:1084D0000D0009D044B1616831B138B1FE49498815 -:1084E000814203D0072070BD102070BD2068FEF7C8 -:1084F00053FB0028F9D1324621462846BDE870409A -:10850000FFF7E8B970B515460C0006D038B1F2494E -:108510008988814203D0072070BD102070BD20687B -:10852000FEF73AFB0028F9D129462046BDE8704005 -:108530007BE570B5064686B00D46144610460AF037 -:10854000A3FDD0BB60680AF0C6FDB0BBA6F57F40B6 -:10855000FF3803D03046FAF7C2FD80B1284669469D -:10856000FEF765FC00280CD19DF810100F2008299B -:108570003CD2DFE801F008060606060A0A0843F2C4 -:10858000020006B070BD0320FBE79DF80210012930 -:1085900008D1BDF80010B1F5C05FF2D06FF4C05241 -:1085A000D142EED09DF8061001290DD1BDF804107E -:1085B000A1F52851062907D200E028E0DFE801F004 -:1085C000030304030303DCE79DF80A1001290ED11D -:1085D000BDF80810B1F5245FD3D0A1F524510239BC -:1085E000CFD00129CDD0022901D1CAE7FFDF6068D1 -:1085F00078B9002305AA2946304603F03EFF10B1A2 -:10860000FEF70BFBBDE79DF81400800601D4102097 -:10861000B7E76188224628466368FFF765FDB0E743 -:108620002DE9F043814687B08846144610460AF08B -:108630002BFD18B1102007B0BDE8F083002306AA77 -:108640004146484603F019FF18B100BFFEF7E5FAAE -:10865000F1E79DF81800C00602D543F20140EAE7B1 -:108660000025072705A8019500970295CDE903503D -:1086700062884FF6FF734146484603F07CFE0600D1 -:1086800013D160680AF000FD60B960680195CDE91A -:10869000025000970495238862884146484603F0BB -:1086A0006AFE0646BDF8140020803046CEE739B198 -:1086B000894B0A881B899A4202D843F2030070470B -:1086C000DAE510B586B0844C0423ADF81430E388A5 -:1086D00043B124898C4201D2914205D943F203006F -:1086E00006B010BD0620FBE7ADF810100021009188 -:1086F0000191ADF8003002218DF8021005A9029118 -:1087000004A90391ADF812206946FFF7B5FDE7E72C -:108710002DE9FC4781460F4608460AF08FFC88BBCE -:108720004846FAF7DCFC5FEA00080AD098F8000037 -:10873000222829D30421484607F0BCF9060005D1B8 -:1087400003E043F20200BDE8FC87FFDF06F11400FE -:1087500002F0FDFB05463878012803D0022804D03A -:108760000720F0E7A8070FD502E015F0340F0BD073 -:10877000B8793C1DC00709D0E08838B1A0680AF07C -:108780005DFC18B11020DEE70820DCE73A7820888D -:10879000002128B3A0F201130721112B18D20CD20B -:1087A000DFE803F00B090D0B1D0B121D100B0B1D49 -:1087B0001D1D1D0B1D00022A11D10846C3E7012A09 -:1087C000FBD00CE0EA0600E0AA06002AF5DA06E093 -:1087D000A0F5C0721F2A02D97D3A022AEDD8C1B293 -:1087E00098F82300CDE90001F28923463146484636 -:1087F000FEF734FCA7E72DE9F04F8BB01F46154676 -:108800000C4683460026FAF76AFC28B10078222835 -:1088100005D208200BB057E543F20200FAE7B8088A -:1088200001D00720F6E7032F00D100274FF6FF798C -:10883000CCB1022D71D320460AF04DFC30B904EBC7 -:108840000508A8F101000AF046FC08B11020E1E794 -:10885000AD1EAAB22146484603F009FF38F8021CB3 -:1088600088425AD1ADB21C49B80702D50889401CCC -:1088700000E001201FFA80F8F80701D00F8900E01E -:108880004F4605AA4146584603F0C2FC4FF0070A7E -:108890004FF00009FCB1204608E0408810283CD881 -:1088A000361D304486B2AE4237D2A0190288424506 -:1088B000F3D352E09DF8170002074ED57CB304EBCA -:1088C0000608361DB8F80230B6B2102B25D89A1912 -:1088D000AA4222D802E040E010030020B8F80020AD -:1088E00091421AD1C0061BD5CDE900A90DF1080CA3 -:1088F0000AAAA11948468CE80700B8F8001000221F -:10890000584603F00FFB10B1FEF787F982E7B8F87D -:108910000200BDF82810884202D00B207AE704E05C -:10892000B8F80200304486B206E0C00604D55846C6 -:10893000FEF7E6FB00288AD19DF81700BDF81A1053 -:1089400020F010008DF81700BDF81700ADF80000FA -:10895000FF235846009A03F0BCFD05A803F064FC11 -:1089600018B9BDF81A10B942A4D90421584607F025 -:10897000A1F8040000D1FFDFA2895AB1CDE900A916 -:108980004D46002321465846FEF768FB0028BDD11E -:10899000A5813FE700203DE72DE9FF4F8BB01E4644 -:1089A00017000D464FF0000412D0B00802D0072087 -:1089B0000FB089E4032E00D100265DB108460AF00D -:1089C00081FB28B93888691E08440AF07BFB08B18E -:1089D0001020EDE7CA4AB00701D5518900E0012116 -:1089E000F0074FF6FF7802D05089401E00E0404665 -:1089F00086B206AA0B9803F00BFC4FF000094FF06B -:108A0000070B0DF1140A38E09DF81B00000734D560 -:108A1000CDF80490CDF800B0CDF80890CDE9039AD8 -:108A2000434600220B9803F0A6FC60BB05B3BDF8DB -:108A300014103A8821442819091D8A4230D3BDF800 -:108A40001E2020F8022BBDF8142020F8022BCDE9BF -:108A500000B9CDE90290CDF810A0BDF81E10BDF808 -:108A6000143000220B9803F086FC08B103209FE726 -:108A7000BDF814002044001D84B206A803F0D4FB06 -:108A800020B1822806D0FEF7C8F891E7BDF81E1085 -:108A9000B142B9D934B17DB13888A11C884203D222 -:108AA0000C2085E7052083E722462946404603F04F -:108AB000DEFD014628190180A41C3C80002077E7D8 -:108AC00010B504460AF0E0FA08B1102010BD8C4839 -:108AD00040892080002010BD2DE9F0438DB00D4667 -:108AE00081464FF00208142106A817F0E0FE012687 -:108AF0008DF81C6000208DF81D008DF81860ADF811 -:108B000020504846FAF7EBFA48B10078222812D3F1 -:108B10000421484606F0CEFF040005D103E043F2ED -:108B200002000DB088E5FFDF04F11400074602F0F3 -:108B30000EFA400601D40820F3E705AA04A903A809 -:108B40008DE807004246214648466368FEF709FA69 -:108B500000B1FFDFDDE903018DE8830005AB0722EB -:108B600006A9484602F0F0FD10B1FEF78CF8D8E7F0 -:108B7000A674BDF81420DDE903018DE80700424624 -:108B8000214648466368FEF719FA29464846F9F730 -:108B90001FFC0BA9384602F0C9F900B1FFDFBDF890 -:108BA0002C40172C01D2172000E02046A84201D902 -:108BB0002C4602E0172C00D2172421464846FFF726 -:108BC000BCFA21464846F9F737F90020A9E7F8B57D -:108BD0001C4615460E46069F07F077F82346FF1DF4 -:108BE000BCB231462A46009406F0D5FCF8BD70B5FB -:108BF0000C4605460E21204617F037FE0020208047 -:108C00002DB1012D01D0FFDF70BD062000E0052051 -:108C1000A07170BD10B548800878144620F00F0090 -:108C2000001D20F0F00080300B4608701422214611 -:108C300003F1080017F0E7FDBDE8104000F068BC44 -:108C40002DE9F0472F4F491D064621F003019146BB -:108C50000C46386806F0EEF8050000D1FFDF4FF053 -:108C600000083560A5F800802146386806F0E2F873 -:108C7000050000D1FFDF7560A5F8008004FB09F155 -:108C8000091D386806F0D6F8040000D1FFDFB46093 -:108C9000C4F80080BDE8F0872DE9F041491D21F0BE -:108CA0000304184D1746064601682246286806F058 -:108CB000EAF822467168286806F0E5F87C43221D30 -:108CC000B168286806F0DFF8042006F09DFE04462F -:108CD000042006F0A1FE201A012804D12868BDE86E -:108CE000F04106F098B8BDE8F08110B50C4603F0ED -:108CF0005CFA00B1FFDF2046BDE81040FDF78DBFF4 -:108D00001003002014000020F0B59BB00546592048 -:108D10008DF80000281DADF80400ADF806101E46C1 -:108D200017460BA9684603F029FC00B1FFDFBDF828 -:108D30003040032C01D2204600E00320C1B2284677 -:108D400000F07EFF3870022C00D30224E1B22846E6 -:108D500000F076FF401C30701BB0F0BD2DE9F04FE5 -:108D60000C00FC499DB08246D1E90201FA4ECDE9E2 -:108D70000C010AF10300717A327A1144CDB220F06D -:108D800003010091377E07F1010704D1F8B208F022 -:108D9000A7FA00B1FFDF00982A4600EB0710C01CBD -:108DA00020F00301F7694FF00009009134B981F810 -:108DB0000090B8B203F081F800B1FFDF00982346BD -:108DC00038440090B07A317A2A460844C1B26846E5 -:108DD00000F0FEFE0098C01C20F003000090737AA3 -:108DE000327AB17A04B1002006F056FD00990844A9 -:108DF00000902146684600F02EFF00273D46B3460E -:108E000096F801800CE0284600F0C5FE0646817801 -:108E10008088F9F7ABF871786D1C00FB0177EDB233 -:108E20004545F0D10098C01C20F00300009004B12B -:108E300000203946F9F7A1F800990027084400906E -:108E40003D469BF801800CE0284600F0A4FE064653 -:108E5000C1788088FEF7FFFB71786D1C00FB0177FD -:108E6000EDB24545F0D10098C01C20F00300009001 -:108E700004B100203946FEF7F7FB00990844C01DF5 -:108E800020F007000090ECBBB54AB4491160111DF9 -:108E9000401E086001223C21B24806F08EFCFAF721 -:108EA0007EF8B1484178806804F00FF9AE4801249B -:108EB0000C300178012915D144218DF80410C078B7 -:108EC0008DF8080010B1012803D004E08DF80840A7 -:108ED00001E08DF8089001A805F047FE10B10EA83A -:108EE00004F0B3F900211E22084601F0F7F9FBF760 -:108EF000AFF803F018FD98480CAA00210C30F8F7E1 -:108F000029FA00E01DE000B1FFDF9BF81900FEF731 -:108F10002EFF00B1FFDF90484FF4B871443017F0D6 -:108F2000C6FC8D480221443080F8694180F86A11FE -:108F300080F86B1180F86C91062180F86D11052185 -:108F4000017100991DB0A1EB0A00BDE8F08F70B56A -:108F5000814D06464435287805EB4014E8780834FE -:108F6000A0B9A81990F86801002810D0A8780B289B -:108F700000D3FFDF207820F0FF002070607866F3D8 -:108F8000020020F0080060700120E870204670BDEB -:108F90002DE9F04105460C46002700780521904652 -:108FA0003E46B1EB101F00D0FFDF287A50B10128F8 -:108FB0000ED0FFDFA8F800600CB12780668000208B -:108FC000BDE8F0810127092674B16888A08008E017 -:108FD0000227142644B16888A0802869E060A88A26 -:108FE0002082287B2072E5E7A8F80060E7E710B54B -:108FF0005D4C6068C11D21F00701814200D0FFDF98 -:10900000554801210022017042700172032343720E -:1090100081720273052282821F22C282417353A28F -:1090200002610A22027641764FF4B061C161616843 -:10903000416010BD30B54C4C1568636808339D42E3 -:1090400002D20420136030BD434B5D785A6802EBB6 -:10905000C502107051700320D0801720908001202D -:10906000D07090705878401C58706068083060600C -:10907000002030BD70B5064637480024457807E02B -:10908000204600F088FD0178B14204D0641CE4B2AF -:10909000AC42F5D1002070BDF7B5064608780C4605 -:1090A00050B1FFF7E7FF0546202E07D0232E17D03B -:1090B000212E18D0222E16D00720FEBD00F076FDFE -:1090C0000DB1697800E00021401A81B2A078014416 -:1090D000FF29F1D80028EFD0A088022803D2EBE7BF -:1090E00060881728E8D365B9207802AA0121FFF724 -:1090F000A1FF0028E1D12078FFF7BCFF050000D1D7 -:10910000FFDF202E08D0212E0ED0222E0FD0232EAE -:1091100007D0FFDF0020FEBDA0786870A088E8803F -:10912000F8E76088A880F5E7A078A870F2E7A07853 -:10913000E870EFE700B59BB055218DF8001000787E -:109140000BA900F001008DF80400684603F016FA40 -:109150001BB000BD740C0200280400200000002099 -:1091600000060240DC0500201C0000206E5246353F -:109170007800000000B501789BB001F001018DF886 -:109180000410417801F001018DF805100178C1F358 -:1091900040018DF806104178C1F340018DF80710A9 -:1091A000017889088DF80810417889088DF8091030 -:1091B00081788DF80A10C1788DF80B1000798DF840 -:1091C0000C004F208DF800000BA9684603F0D6F97B -:1091D000BEE700B59BB058218DF80010ADF8040033 -:1091E0000BA9684603F0CAF900B1FFDF9DF8300013 -:1091F00000F00100ACE72DE9F84FDFF8F483FD4CF7 -:1092000000271BE0022000F066FD0120FFF79FFE13 -:109210000546F94806F0FAFA686000B9FFDF6868A9 -:1092200003F0F9F9A0B12846FAF7C7F9284600F08B -:1092300058FD18B9F048696806F0F1FA94F8690128 -:109240000028DFD1022006F0DFFB064600259AE069 -:10925000E948696806F0E3FAF4E7B8F80210404616 -:10926000491C89B2A8F80210B14201D30021418003 -:109270000221B8F8020006F01DFC00285DD0B8F805 -:109280000200FFF7A6FF78B1B8F8020006F02FFD44 -:109290005FEA000900D1FFDF484605F0E2FF18B1A0 -:1092A000B8F8020003F04FFDB8F8020006F00DFD1B -:1092B0005FEA000900D1FFDF484605F0CBFFE0BBC5 -:1092C0000321B8F8020006F0F5FB5FEA000B47D176 -:1092D000FFDF45E0DBF8040010B10078FF2848D03C -:1092E000042000F0F8FC0320FFF731FE82464846D8 -:1092F00006F0E2F8CAF8040000B9FFDFDAF804006B -:1093000006F0BCF9002100900170B8F80210504638 -:10931000AAF8021003F094FB484606F0B1F900B930 -:10932000FFDF504600F0DDFC18B99AF80100000795 -:1093300004D50099CBF8041012E022E0DBF8040019 -:1093400038B10178491C11F0FF01017008D1FFDF2D -:1093500006E000221146484600F01BFC00B9FFDF82 -:1093600094F86B0128B1B8F8020003F044FB002820 -:10937000B0D194F8690120B1484606F0F7F900B180 -:1093800001276D1CEDB2B54204D294F86B010028A0 -:109390007FF463AF002F7FF433AFBDE8F84F0520B3 -:1093A00000F099BC10B5924CA0600868E060AFF284 -:1093B000B91000F006FF607010BD8E4800214438DF -:1093C00001708B4801708D494160704730B505468A -:1093D0004FF080500C46D0F8A4109BB0491C05D12A -:1093E000D0F8A810C9430904090C08D050F8A01FF0 -:1093F00001F0010129704168216080680EE02B2096 -:109400008DF800000BA9684603F0B8F800B1FFDF43 -:10941000012028700C982060BDF83400A0802878C6 -:10942000002803D0607940F0C00060711BB030BDEF -:10943000F0B54FF080540746D4F880009BB00D463D -:109440002B26401C0BD1D4F88400401C07D1D4F843 -:109450008800401C03D1D4F88C00401C0BD0D4F8F9 -:1094600080003860D4F884007860D4F88800B86050 -:10947000D4F88C0016E08DF83C6069460FA803F024 -:109480007DF800B1FFDF01983860029878608DF8B0 -:109490003C6069460FA803F071F800B1FFDF019846 -:1094A000B8600298F860D4F89000401C0BD1D4F852 -:1094B0009400401C07D1D4F89800401C03D1D4F884 -:1094C0009C00401C08D054F8900F286060686860C9 -:1094D000A068A860E06816E08DF800600BA96846F7 -:1094E00003F04CF800B1FFDF0C9828600D9868601D -:1094F0008DF800600BA9684603F040F800B1FFDF6B -:109500000C98A8600D98E86026E43A4800791EE5BA -:1095100070B5384CE07828B3207804EB4010407ADE -:1095200000F00700204490F8680100B9FFDF2078C0 -:10953000002504EB4010407A00F00700011991F873 -:109540006801401E81F868012078401CC0B220707C -:109550000B2800D12570A078401CA07009F007F9F5 -:10956000E57070BDFFDF70BD3EB50546032106F016 -:10957000A1FA0446284606F0A8FB054604B9FFDF19 -:10958000606818B10078FF2800D1FFDF01AA6946A2 -:10959000284600F0FEFA60B9FFDF0AE0002202A9C7 -:1095A000284600F0F6FA00B9FFDF9DF8080000B188 -:1095B000FFDF9DF80000411E8DF80010EED26068BC -:1095C0000199884201D1002060600A4C94F86B0137 -:1095D000022800D3FFDF94F86B0118B904484078E3 -:1095E00000F00EFE94F86B01401C84F86B013EBD48 -:1095F0001C0000206C040020DC050020101300205B -:1096000070B50546A0F57F400C46FF3800D1FFDF5E -:10961000012C01D0FFDF70BDFFF777FF040000D100 -:10962000FFDF207820F00F00401D20F0F0005030C8 -:10963000207065800020207201202073BDE87040FA -:1096400066E770B515460C460646FFF75EFF90B11B -:10965000017821F00F01491D21F0F0015031017016 -:1096600046800121017221680161A1888182057310 -:10967000BDE870404CE73046BDE870401321FBF771 -:10968000D4B830B59DB0FFF7F5FC040000D1FFDF82 -:10969000A588E1880BAB0CAA2846FFF735FB5420C0 -:1096A0008DF800009DF830008DF804009DF82C0026 -:1096B0002D1D8DF80500ADF80650ADF80850E08876 -:1096C000ADF80A000DA9684602F058FF002800D046 -:1096D000FFDF1DB030BD2DE9F84FF94E05464FF0C4 -:1096E000000A307810B10820BDE8F88F284609F04C -:1096F000CBFC08B11020F7E7F24C207808B9FFF74F -:1097000076FC617A207A0844C4B200F04FFAA04295 -:1097100008D2201AC1B22A460020FFF78BFC5FEA6C -:10972000000AE1D1E6484FF00009C84641684F46BB -:10973000C91C21F003014160E248CDF800904E467B -:109740004C4690F801B00EE0204600F024FA417833 -:10975000827809F10109884412FB0177C07810FB77 -:109760000166641CE4B25C45EED10098D54C00EB78 -:10977000890000EBC80000EB8700217A00EB86002F -:1097800000EBC100617ADFF8388300EBC100A17AF9 -:1097900000EBC100D8F80410471801213846FFF744 -:1097A000DDFA064629683844884202D8B6F5803F7B -:1097B00013D328600020FFF75DFC60B1D8F80410D7 -:1097C00045460839814200D0FFDF6078401E607056 -:1097D000686808386860042086E700213846FFF78B -:1097E000BDFA0446A64200D0FFDFE119C8F8041014 -:1097F00029604FF6FF71A8F80210012188F80010C7 -:10980000504671E72DE9F0410446AD4817460D4634 -:10981000007810B10820BDE8F081084609F00EFC80 -:1098200008B11020F7E7A74E307808B9FFF7DFFB43 -:10983000601E1E2807D8012C3FD12878FE283CD86E -:1098400030760020E7E7A4F120001F2805D8E0B219 -:109850003A462946BDE8F0411EE4A4F140004FF02D -:1098600000081F2821D8402C02D0412C25D117E018 -:10987000687829784418A97881421ED8FF2C08D826 -:1098800007F012FF074608F031FF381A801EA04289 -:1098900001DA1220BFE728883081A878B07224E06E -:1098A0002846BDE8F04100F042BAA4F1A0001F280C -:1098B00003D8A02C03D0A12C06D00720ABE7287832 -:1098C00000F00100707610E029680920F829A2D381 -:1098D0008A07A0D1727B02F00302012A04D1F28A26 -:1098E000D73293B28B4296D8F161404693E72DE987 -:1098F000F04707460C46084609F0C6FB40B9384613 -:1099000009F0E0FB20B9F81C20F00300B84202D0B7 -:109910001020BDE8F0876B484FF000084430817894 -:1099200089B14178824600EB4115B4F8009015F8F2 -:10993000080F234600F00F000022294600F0DFF94F -:10994000060004D013E0A4F800800520E1E797B1F9 -:109950002188494501D90C260DE02878234600F0DE -:109960000F003A46294600F0CAF9060005D00C2E31 -:1099700001D0A4F800803046CBE79AF801005446A5 -:10998000401CC0B28AF801000B2801D184F8018084 -:10999000A078401EA070697801F00700062827D241 -:1099A000DFE800F026091E031E1E0807E3D46888BE -:1099B000FFF7DAFDDFE74448696805F030FF94F807 -:1099C000690130B93E48407800F01AFC94F869010A -:1099D00000B1FFDF94F86901401C84F86901CAE70F -:1099E00000EB0A0191F86801401C81F86801C2E7A8 -:1099F000FFDFC0E770B50D46044609F01FFB18B93C -:109A0000284609F041FB08B1102070BD29462046C8 -:109A1000BDE8704007F09BBC70B5044615460E4685 -:109A2000084609F00BFB18B9284609F02DFB08B1D0 -:109A3000102070BD022C03D0102C01D0092070BD65 -:109A40002A463146204607F0A5FC0028F7D005201D -:109A500070BD70B514460D46064609F0EFFA38B9E8 -:109A6000284609F011FB18B9204609F02BFB08B174 -:109A7000102070BD22462946304607F0AAFC002877 -:109A8000F7D0072070BD10B59AB0044609F0FCFA73 -:109A900010B110201AB010BD0F208DF800000BA9D6 -:109AA000684602F06BFD0028F4D19DF83400207068 -:109AB000BDF836006080BDF83800A0800020E9E7DE -:109AC0001C00002028040020DC05002070B505469D -:109AD0000C46084609F0F6FA20B93CB1206809F0B6 -:109AE000D3FA08B1102070BDA08828B121462846BD -:109AF000BDE87040FDF727BE092070BD70B5044673 -:109B00000D46084609F09AFA30B9601E1E2814D88E -:109B1000284609F093FA08B1102070BD022C01D933 -:109B2000072070BD04B9FFDFA64800EB840050F8A1 -:109B3000041C2846BDE870400847A4F120001F28F7 -:109B4000EED829462046BDE87040FAF79BB970B5BB -:109B500004460D46084609F097FA30B9601E1E28E3 -:109B60000DD8284609F06AFA08B1102070BD012C02 -:109B700001D0022C01D1062070BD072070BDA4F1D8 -:109B800020001F28F9D829462046BDE87040FAF782 -:109B900022BA05F01ABB30B58B4D04466878A04256 -:109BA00000D8FFDF686800EBC40030BD70B58648A0 -:109BB00000252C46467807E02046FFF7ECFF40786A -:109BC000641C2844C5B2E4B2B442F5D1284670BD45 -:109BD0002DE9F0410646022012B101EB4200401D82 -:109BE000C7B23068C01C20F0030232601BBB76484D -:109BF0003B460921203009F00DF9002408E0092C2A -:109C000011D2DFE804F005070509090B0B05050073 -:109C10006E4804E06E4802E06E4800E06E4809F0CD -:109C200019F9054600E0FFDFA54200D0FFDF641C04 -:109C3000E4B2092CE3D3306800EB07103060EAE5AA -:109C4000001D4143452900D24521491EB1FBF0F0DA -:109C5000401CC0B270472DE9FC5F06465A484FF0E1 -:109C600000088B464746454690F801901FE028467D -:109C7000FFF791FF040000D1FFDFB4F804A0E188F2 -:109C800001AB6A465046FFF73FF860789DF8043014 -:109C90003844C7B20AF1040081B280B29DF80020B6 -:109CA00005F05EFF62786D1C00FB0288EDB24D4549 -:109CB000DDD13068C01C20F003003060BBF1000F24 -:109CC00000D000204246394605F058FF316808446C -:109CD0003060BDE8FC9F3C49443108710020C870E9 -:109CE000704739494431CA782AB10A7801EB4211E8 -:109CF0000831814201D001207047002070472DE9D2 -:109D0000F041044600201880601E1D4616460F468E -:109D1000052800D3FFDF2B482A46103000EB8400D3 -:109D2000314650F8043C3846BDE8F041184738B594 -:109D30000446407800F00300012803D002280BD02D -:109D4000072038BD606858B109F0C5F9D0B960681E -:109D500009F0B8F920B915E0606809F06FF988B921 -:109D600069462046FCF77BF90028EAD1607800F0CC -:109D70000300022808D19DF8000028B1606809F0AE -:109D8000A1F908B1102038BD6189F8290DD82089C2 -:109D900088420AD8607800F003020B48012A06D1F5 -:109DA000D731C26989B28A4201D2092038BD94E80C -:109DB0000E0000F10C0585E80E000AB90021818231 -:109DC000002038BD740C020028040020F13C000083 -:109DD0006DC90000892F00009310010010B5EFF34A -:109DE000108000F0010472B6E9484178491C4170C6 -:109DF0004078012801D108F0D9FC002C00D162B6CE -:109E000010BD70B5E24CE07848B90125E570FFF768 -:109E1000E5FF08F0D3FC20B1002008F0AFFC0020E3 -:109E200070BD4FF080406571C0F80453F7E770B51E -:109E3000EFF3108000F0010572B6D54C607800B9E0 -:109E4000FFDF6078401E6070607808B908F0B2FCEF -:109E5000002D00D162B670BDCD4810B5C17821B1DA -:109E600000214171C170FFF7E2FF002010BD10B565 -:109E7000044608F0A3FCC649C978084000D0012078 -:109E80002060002010BD2DE9F05FDFF804934278D8 -:109E9000817889F80620002689F80710074689F896 -:109EA00008600078354620B101280FD002280FD075 -:109EB000FFDF08F090FC98B108F094FCB0420FD19D -:109EC000304608F093FC0028FAD047E00126F0E77E -:109ED000FFF784FF08F072FC0028FBD00226E8E7B9 -:109EE00001208407E060C4F80451AA490E6001070C -:109EF000D1F84412A74AC1F3423124321160A54976 -:109F00004FF0020B34310860C4F804B3A060DFF8EE -:109F100088A2DAF80010C94341F3001101F10108E9 -:109F2000DAF8001041F01001CAF8001000E020BF7C -:109F3000D4F804010028FAD0304608F057FC002875 -:109F4000FAD0B8F1000F05D1DAF8001021F01001B5 -:109F5000CAF80010C4F808B3C4F8045199F807000F -:109F60004C4670B1387860B908F028FC074608F014 -:109F700019FE6FF0004117B1C4E9031001E0C4E914 -:109F8000030116B12571BDE8F09F0127BE072771B7 -:109F90004FF01908C6F80883B761C6F80051C6F833 -:109FA0000C51C6F8105108F009FC10B1A7703761C8 -:109FB00000E02770FFF712FF7649A0792031086092 -:109FC000C6F80483DFE770B5050000D1FFDF4FF06E -:109FD00080424FF0FF30C2F808030021C2F80011A0 -:109FE000C2F80411C2F80C11C2F81011684C61706B -:109FF00008F0EAFB10B10120E07060702846BDE86F -:10A00000704040E72DE9F041614C4FF08047012559 -:10A01000E079F0B1012803D0217A401E814218DA9C -:10A0200008F0CCFB064608F0BDFDE179012902D914 -:10A03000217A491C21720EB1216900E0E168411AC0 -:10A04000022902DA11F1020F0BDC0EB1206100E0EF -:10A05000E060FFF7C3FE08F0B1FB28B13D61A570D9 -:10A0600003E07D61BDE8F081257000202072F9E7F2 -:10A070002DE9F05F4948D0F800B0484A4849083215 -:10A0800011608406D4F8080110B14FF0010801E016 -:10A090004FF00008D4F8000100B101208146D4F847 -:10A0A000040108B1012600E00026D4F80C0100B13B -:10A0B00001208246D4F8100108B1012700E00027F2 -:10A0C00048EA090126EA010020EA0A00B84300D064 -:10A0D000FFDF0025B8F1000F04D0C4F808510120BB -:10A0E00008F04CFB5FEA0900DFF8A4804FF001099B -:10A0F00013D0C4F8005198F8050020B188F8055035 -:10A10000002008F03BFB98F8000030B108F056FB47 -:10A1100018B188F80290C4F810900EB1C4F8045138 -:10A12000BAF1000F0CD0C4F80C5198F80200464662 -:10A1300000B9FFDFB5703570C4F81490FFF777FEF3 -:10A1400037B1C4F8105198F8040008B1FFF75AFF6E -:10A150001249091DC1F800B015E770B50C4DE8783B -:10A1600008B908F027FB01208407A061A87850B146 -:10A17000D4F80C0120B9002008F038FB0028F7D1F2 -:10A180000020C4F80C014FF0FF30C4F8080370BD84 -:10A19000300000201805004010ED00E010050240DE -:10A1A000010000014FF0E0214FF00070C1F8800184 -:10A1B000C1F88002384B802283F80024C1F80001E6 -:10A1C000704700B502460420344903E001EBC003A8 -:10A1D0001B792BB1401EC0B2F8D2FFDFFF2000BDBB -:10A1E00041F8302001EBC00100224A718A7101223E -:10A1F0000A7100BD294A002102EBC00001717047BD -:10A2000010B50446042800D3FFDF244800EBC40443 -:10A210002079012800D0FFDF6079A179401CC0B20D -:10A22000814200D060714FF0E0214FF00070C1F822 -:10A23000000210BD2DE9F041194805681849194878 -:10A24000083108601448042690F80004134F4009B0 -:10A25000154C042818D0FFDF16E0217807EBC10069 -:10A260000279012A08D1427983799A4204D042794D -:10A27000827157F8310080472078401CC0B22070AE -:10A28000042801D300202070761EF6B2E5D20448DF -:10A29000001D0560BDE8F08119E000E01C0600200B -:10A2A000100502400100000144000020F8B51D46E1 -:10A2B000DDE906470E000AD005F019FD2346FF1D13 -:10A2C000BCB231462A46009405F09EF9F8BDD0197B -:10A2D0002246194616F052FA2046F8BDF84B58604F -:10A2E00019721A80C90016F0E2BA70B50D4604461C -:10A2F000102116F0BAFA258117206081A07B40F06A -:10A300000A00A07370BD4FF6FF720A800146032059 -:10A3100008F050BE704700897047827BD30701D197 -:10A32000920703D480890880002070470520704779 -:10A33000827B920700D58181704701460020098801 -:10A3400047F2FE12114200D00120DD49497A00296E -:10A3500001D040F00800704700B50346807BC0077D -:10A3600001D0052000BD59811846FFF7E6FFC00760 -:10A3700003D0987B40F004009873987B40F0010074 -:10A380009873002000BD827B520700D509B1408937 -:10A39000704717207047827B61F3C3028273704756 -:10A3A0002DE9F04F0E46017804464FF0010B0BFAF1 -:10A3B00001F047F2FF1100EA010961684FF6FF78EA -:10A3C00087B008881D469646404506D0B9F1000F73 -:10A3D00007D047F2FE12104203D0012007B0BDE8BB -:10A3E000F08F40EA090008804FF0000A95B185F827 -:10A3F00000A022780027052003210223102A6FD213 -:10A40000DFE802F06E0D2C35546F768054CBC79C7C -:10A41000CFFEFDFC20780B28EBD00420DEE762683D -:10A420002089937B9B077DD5172851D313898342BD -:10A43000FBD39289172A01D3824249D12A7822F08C -:10A440003F02921C2A70A5F8010031806168888162 -:10A450006068817B21F00201817342E1042129704F -:10A460002189A5F801106189A5F803108FE0208AE1 -:10A470003188C01D1FFA80F84145D6D306202870C8 -:10A480002089A5F801006089A5F80300A089A5F836 -:10A4900005000721208ACDE9000160882A4671461F -:10A4A0006369FFF703FFA6F800801AE1082A10D0BD -:10A4B000082129702189A5F801106189A5F80310E8 -:10A4C00030806A1D694604F10C0006F082FF10B16D -:10A4D000CCE01021EDE730889DF80010084456E0EC -:10A4E0000EE10A2028702089A5F801003180B2E031 -:10A4F0000C2129702189A5F801106189A5F80310A4 -:10A500003080A8E0218933880BEB41021FFA82FAE0 -:10A51000534576D3BAF1050F73D30E222A7008EA99 -:10A52000410100E07FE0CDE9001B60882A467146CA -:10A53000E368FFF7BBFEA6F800A0D2E06048417ACE -:10A54000002970D0491E41724068217AE26800EB10 -:10A55000C105D046A9882868D2F800C00844A0F1F7 -:10A56000080140F808CC506848608DF800308DF83C -:10A5700001A028680290A888ADF8040060886946A8 -:10A58000F7F769FCA5F80480002E01D04046308022 -:10A59000A7E0287840F080022A70287840F0400236 -:10A5A0002A7060893288C01C1FFA80F842455DD34A -:10A5B000287820F03F00123028702289A5F8012069 -:10A5C0006089CDE9000160882A467146E368FFF79B -:10A5D0006DFEA6F80080287841063CD500065ED5C1 -:10A5E0008DF800B08DF801A03188CDE9025A091D1F -:10A5F000ADF804100420DFF8C88003E059E04FE014 -:10A600002DE033E0049098F808008DF8140060887D -:10A610006946F7F720FC074630880C303080022F5F -:10A6200002D0E7B36FE048E09DF81420D8F804109A -:10A6300098F80830404601EBC2019A4216D28A8847 -:10A64000A2B9427A521C88F809200D6030888880AF -:10A65000A6F800A057E061682089888041E0A189C0 -:10A660003288491D1FFA81F8424501D204274AE089 -:10A6700029782A4621F03F01163129702189A5F851 -:10A6800001106189A5F80310A189CDE90010608847 -:10A6900071462369FFF70AFEA6F80080DBE720E099 -:10A6A000287820F03F0018302870207A68703380B6 -:10A6B00017E060680188090404D4052723E000003E -:10A6C0003C060020C0882189884201D006271AE074 -:10A6D0001E202870A6F800B06068018821F40041AF -:10A6E0000180B9F1000F0ED0DF4861880022008898 -:10A6F0008300032008F0BEFB61682078887007E0C3 -:10A70000A6F800A003276068018821EA09010180FA -:10A71000384663E62DE9F04F87B01746109C0D00D0 -:10A7200083461E461AD03078C10703D000F03F00A0 -:10A73000192801D9012100E000212046FFF723FE5E -:10A74000A8420BD32088A0F57F41FF3906D030788E -:10A75000410601D4000603D508203FE607203DE668 -:10A7600000208DF800008DF8010030786B1E00F09D -:10A770003F0C0122A81E4FF0050A4FF0020999B2C2 -:10A78000BCF1200F76D2DFE80CF08C10755F756994 -:10A79000758D759E75B875BD75CB75D775E4757576 -:10A7A00075F475F275F175F0758C052D79D104206D -:10A7B0008DF80000A0788DF804007088ADF80600D0 -:10A7C00030798DF80100707800F03F000C2829D016 -:10A7D0000ADCA0F10200092863D2DFE800F012626F -:10A7E00015621A621D622000122824D004DC0E2893 -:10A7F0001BD01028DAD11BE016281FD01828D5D17D -:10A800001FE02078800701E020784007002848DA20 -:10A81000F1E020780007F9E72078C006F6E7207815 -:10A820008006F3E720784006F0E720780006EDE7A1 -:10A830002088C005EAE72088C004E7E72088800474 -:10A84000E4E720884004E1E72078800729D5032D3C -:10A8500027D18DF800A0B6F8010083E021784907E0 -:10A860001FD5062D1DD381B27078012803D0022890 -:10A8700017D102E0CCE0022000E0102006228DF883 -:10A88000002072788DF80420801CB1FBF0F2ADF846 -:10A89000062092B242438A4203D10397ADF8089052 -:10A8A000A9E07BE02078000778D5072198B28DF8E1 -:10A8B00000108108ADF80410B0EB810F6ED1029743 -:10A8C000ADF8062097E02178C90667D5022D65D33B -:10A8D00081B208208DF80000707802285ED300BF96 -:10A8E000B1FBF0F28DF80400ADF8062092B24243BD -:10A8F0008A4253D1ADF808907CE0207880064DD58F -:10A90000092003E02078400648D50A208DF8000091 -:10A91000A088ADF80400ADF80610ADF8082069E095 -:10A920002078000672D50B20ADF804108DF80000D9 -:10A93000ADF8062002975EE02188C90566D5022D94 -:10A9400064D381B20C208DF80000707804285DD3A8 -:10A95000C6E72088C00459D5012D57D10D208DF8A8 -:10A960000000A088ADF8040045E021E026E016E0F4 -:10A97000FFE72088800449D5052D47D30E208DF8A8 -:10A980000000A088ADF80400B6F803006D1FADF814 -:10A990000850ADF80600ADF80AA02BE036E020889C -:10A9A000400433D5012D31D10F208DF8000022E075 -:10A9B000208800042AD4B6F80100E080A07B0007BC -:10A9C00024D5032D22D3307800F03F001B2819D066 -:10A9D00011208DF80000208840F40040A4F8000009 -:10A9E000B6F80100ADF80400ED1E0320ADF80650E6 -:10A9F000ADF80800039769465846F7F72CFA0500AA -:10AA000008D016E010208DF80000E9E7072510E0D7 -:10AA100008250EE0307800F03F001B2809D01D28E3 -:10AA200007D05946032008F0C5FA208800F40040FA -:10AA30002080A07B400708D52046FFF77EFCC0079A -:10AA400003D1A07B20F00400A0732846C6E400B523 -:10AA500087B0032805D18DF8000088B26946F7F762 -:10AA6000FAF907B000BD00003C060020F8B51D460D -:10AA7000DDE906470E000AD005F039F92346FF1D2F -:10AA8000BCB231462A46009404F0BEFDF8BDD01990 -:10AA90002246194615F072FE2046F8BD2DE9FF4FFB -:10AAA0008DB09B46DDE91B57DDF87CA00C46082BDA -:10AAB00005D0E06901F00CF950B11020D2E02888EF -:10AAC000092140F0100028808AF80010022617E0C3 -:10AAD000E16901208871E2694FF420519180E169B8 -:10AAE0008872E06942F601010181E0690021817309 -:10AAF0002888112140F0200028808AF800100426C0 -:10AB000038780A900A2038704FF0020904F11800D2 -:10AB10004D460C9001F0ACFBB04681E0BBF1100F4C -:10AB20000ED1022D0CD0A9EB0800801C80B20221AE -:10AB3000CDE9001005AB52461E990D98FFF796FF20 -:10AB4000BDF816101A98814203D9F74800790F9082 -:10AB500004E003D10A9808B138702FE04FF00201E9 -:10AB6000CDE900190DF1160352461E990D98FFF715 -:10AB70007DFF1D980088401B801B83B2C6F1FF003B -:10AB8000984200D203461E990BA8D9B15FF000028B -:10AB9000DDF878C0CDE9032009EB060189B2CDE9E3 -:10ABA00001C10F980090BDF8161000220D9801F019 -:10ABB000E2FB387070B1C0B2832807D0BDF8160030 -:10ABC00020833AE00AEB09018A19E1E7022011B07B -:10ABD000BDE8F08FBDF82C00811901F0FF08022DAF -:10ABE0000DD09AF80120424506D1BDF820108142CF -:10ABF00007D0B8F1FF0F04D09AF801801FE08AF85F -:10AC00000180C94800680178052902D1BDF81610F5 -:10AC1000818009EB08001FFA80F905EB080085B276 -:10AC2000DDE90C1005AB0F9A01F025FB28B91D9842 -:10AC30000088411B4145BFF671AF022D13D0BBF117 -:10AC4000100F0CD1A9EB0800801C81B20220CDE9C5 -:10AC5000000105AB52461E990D98FFF707FF1D989E -:10AC60000580002038700020B1E72DE9F8439C46AC -:10AC7000089E13460027B26B9AB3491F8CB2F18F1E -:10AC8000A1F57F45FF3D05D05518AD882944891DA4 -:10AC90008DB200E000252919B6F83C800831414505 -:10ACA00020D82A44BCF8011022F8021BBCF803107B -:10ACB00022F8021B984622F8024B914605F005F84F -:10ACC0004FF00C0C41464A462346CDF800C004F034 -:10ACD00062FCF587B16B00202944A41D2144088043 -:10ACE00003E001E0092700E083273846BDE8F88348 -:10ACF00010B50B88848F9C420CD9846BE0180488B3 -:10AD000044B1848824F40044A41D23440B801060C3 -:10AD1000002010BD822010BD2DE9F0478AB000252B -:10AD2000904689468246ADF8185007274BE00598B3 -:10AD300006888088000446D4A8F8006007A801951A -:10AD400000970295CDE903504FF40073002231467D -:10AD5000504601F010FB04003CD1BDF81800ADF8DE -:10AD60002000059804888188B44216D10A0414D4BE -:10AD700001950295039521F400410097049541F453 -:10AD8000804342882146504601F0CCF804000BD1A4 -:10AD90000598818841F40041818005AA08A94846A8 -:10ADA000FFF7A6FF0400DCD00097059802950195F7 -:10ADB000039504950188BDF81C300022504601F02F -:10ADC000B1F8822C06D105AA06A94846FFF790FFE4 -:10ADD0000400ACD0ADF8185004E00598818821F447 -:10ADE0000041818005AA06A94846FFF781FF002897 -:10ADF000F3D0822C03D020460AB0BDE8F0870020B3 -:10AE0000FAE710B50C46896B86B051B10C218DF86C -:10AE10000010A18FADF80810A16B01916946FCF7F5 -:10AE20009BF900204FF6FF71A063E187A08706B071 -:10AE300010BD2DE9F0410D460746896B0020069EA6 -:10AE40001446002911D0012B0FD13246294638462D -:10AE5000FFF762FF002808D1002C06D032462946B1 -:10AE60003846BDE8F04100F042BFBDE8F0812DE971 -:10AE7000FC411446DDE9087C0E46DDE90A15521D49 -:10AE8000BCF800E092B2964502D20720BDE8FC81F2 -:10AE9000ACF8002017222A70A5F80160A5F803304D -:10AEA0000522CDE900423B462A46FFF7DFFD0020A0 -:10AEB000ECE770B50C4615464821204615F0F7FC26 -:10AEC00004F1080044F81C0F00204FF6FF71E06108 -:10AED00061842084A5841720E08494F82A0040F03F -:10AEE0000A0084F82A0070BD4FF6FF720A800146FE -:10AEF000042008F05FB830B585B00C460546FFF772 -:10AF000080FFA18E284629B101218DF800106946E5 -:10AF1000FCF722F90020E0622063606305B030BDD9 -:10AF2000B0F84000704700004800002090F846202C -:10AF3000920703D4408808800020F3E70620F1E759 -:10AF400090F846209207EDD5A0F84410EAE70146B4 -:10AF5000002009880A0700D5012011F0F00F01D068 -:10AF600040F00200CA0501D540F004008A0501D571 -:10AF700040F010004A0501D540F020000905D1D568 -:10AF800040F04000CEE700B5034690F84600C00709 -:10AF900001D0062000BDA3F842101846FFF7D7FFE6 -:10AFA00010F0760F05D093F8460040F0040083F8C7 -:10AFB000460013F8460F40F001001870002000BD55 -:10AFC00090F84620520700D511B1B0F84200A9E729 -:10AFD0001720A7E710F8462F61F3C3020270A1E71C -:10AFE0002DE9FF4F9BB00E00DDE92B34DDE9297818 -:10AFF000289D25D02878C10703D000F03F001928EC -:10B0000001D9012100E000212046FFF7D9FFB0421D -:10B0100016D3287841060FD400F03F011E2909D02D -:10B02000218811F47F6F0BD13A884AB1A1F57F4294 -:10B03000FF3A05D0010606D500F03F00122802D0E5 -:10B0400004201FB0C4E5FC491D984FF0000A0871A8 -:10B050008DF818A08DF830A00CAA0A60ADF81CA0DD -:10B06000ADF824A02978994601F03F02701F5B1CBF -:10B0700004F1180CD3464FF0030ECDF828C01F2A58 -:10B080007ED2DFE802F07D7D107D227DAE7DF77DF2 -:10B09000F67DF57DF47DF77DF37D7D7DF27DF17D9F -:10B0A0007D7D7D7DF00094F84610B5F8010089079C -:10B0B00067D5032E65D14FF40061ADF82410608090 -:10B0C0008DF830E0ADF83400E9E2052EF2D1B5F8A4 -:10B0D00001002083ADF81C00B5F80310618300283F -:10B0E00070D088426ED884F80AB0A4F808B04FF641 -:10B0F000FF7020840A9801F0BBF8052089F8000051 -:10B1000002208346029011AB1D9A0A991B9801F008 -:10B11000B2F820B15EE000BF8DF81800FEE29DF8A5 -:10B120004A00012804D0022089F80100102003E021 -:10B13000012089F8010002200390002204A912A82E -:10B1400006F047F9E8BB9DF81010039888423ED1FD -:10B150003A88891CA2EB0B00884238DB0299022056 -:10B16000CDE900010DF146034A4641461B98FFF721 -:10B170007DFC02980BF1020B801C81B217AA01E042 -:10B18000ACE2B1E0029104A912A806F022F90299FA -:10B190009DF81000CDE9000117AB4A4641461B98C7 -:10B1A000FFF764FC9DF8100011AB0BEB00011FFAD8 -:10B1B00081FB02991D9A084480B202900A991B985B -:10B1C00001E004E091E001F056F80028B5D0BBF1B1 -:10B1D000020F03D10A208DF818005DE2A7F800B035 -:10B1E0005AE2CDF80CB0072E7ED3B5F801002083CB -:10B1F000ADF81C00B5F803206283002875D090429A -:10B2000073D84FF0010B84F80AB0B5F8050020811F -:10B210000020A073E06900F05BFD80B9E16942F6AF -:10B22000010081F806B0E2694FF420519180E16994 -:10B2300081F80AB0E1690881E16900208873F01F94 -:10B2400020841E984FF0070B6062A4F822B00A9881 -:10B2500001F00EF889F800B0012083460490002028 -:10B26000ADF846002AE026E2B0E147E1EDE01FE25A -:10B27000B0E088E04FE000BFBBF1010F15D0E069FE -:10B280008079012803D1BDF84400ADF80E0004997F -:10B290000420CDE9000103AB4A4641461B98FFF765 -:10B2A000E5FB0498001D80B20490BDF84600ADF89F -:10B2B0000C00ADF80E0005981FFA80FB11AB1D9A2B -:10B2C0000A991B9800F0D7FF28B939880BF10400C0 -:10B2D00005908142D0D2BBF1010F3FF41BAFE06972 -:10B2E0008079012808D001E098E023E0BDF84410FF -:10B2F000A1F57F40FF3803D1BDF84400ADF80E0042 -:10B3000004990420CDE9000103AB4A4641461B984D -:10B31000FFF7ACFB62E7072E01D0152E7ED1B5F802 -:10B3200001102183ADF81C10B5F80320628309B128 -:10B33000914201D90120EFE60121A172A4F808B0E1 -:10B3400084F80EB0052E07D0C0B2691DE26906F080 -:10B3500021F800287FF4DEAE4FF6FF70208401A8AC -:10B3600006AA09A9CDF800B080E88603287821460E -:10B3700000F03F031D9A1B98FFF790FB8246208B3D -:10B38000ADF81C0088E10120032EC7D14021ADF8A3 -:10B390002410B5F801102183ADF81C100AAAB8F1E9 -:10B3A000000F00D00023CDE9020304921D98CDF8D0 -:10B3B0000480009038880022401E83B21B9800F061 -:10B3C000DAFF8DF8180050BB0B2189F80010BDF88A -:10B3D000280038E04FF0010C052E9FD18020ADF8F9 -:10B3E0002400B5F801102183B5F803002084ADF8DE -:10B3F0001C10B0F5007F01D907208DE640F47C4297 -:10B40000228412A8B8F1000F00D00023CDE9033048 -:10B41000CDE9018C1D980090388801E09CE007E0A0 -:10B42000401E83B21B9800F0A6FF8DF8180028B1CB -:10B430008328A7D10220C7E0480000200D2189F809 -:10B440000010BDF84800401C25E1C80900EB40028F -:10B450000EEB8200B04203D948067DD558461AE16A -:10B46000B5F80110ADF81C102A78520608D506224E -:10B470008DF830202A78120605D58DF830B02FE1EE -:10B4800007228DF830200323CDE9023BDDF878C098 -:10B49000CDF810B01D9AA6EB00080092CDF804C0BC -:10B4A0001FFA88F300221B9800F03CFD8DF818006D -:10B4B0008DF830B0297849060DD52088C00506D50D -:10B4C000208BBDF81C10884201D1C4F824B0584626 -:10B4D0008DF818B0DFE0832801D14FF0020A4FF455 -:10B4E0008070ADF82400BDF81C002083A4F82080F3 -:10B4F0001E986062032060841321C9E0052E2BD3BF -:10B50000B5F80110ADF81C10A28F32B3A2F57F433D -:10B51000FE3B29D008228DF830200523CDE9023BDF -:10B52000DDF878C0CDF810B01D9A80B2CDF804C017 -:10B5300040F400430092B5F803201B9800F0F2FCA1 -:10B540004FF400718DF818008DF830B0ADF824106C -:10B55000832813D010B301E0DBE005E0A08FA0F555 -:10B560007F41FE3907D0D9E00B228DF830204FF60D -:10B57000FE72A287D1E7A4F83CB0CFE000942B463E -:10B5800031461E9A1B98FFF770FB8DF8180008B122 -:10B5900083284BD1BDF81C0020834BE700942B4639 -:10B5A00031461E9A1B98FFF760FB8DF81800E8BB28 -:10B5B000E18FA06B0844831D8DE88803438882884F -:10B5C00001881B98FFF753FC824665E095F80180DF -:10B5D000022E6FD15FEA080002D0B8F1010F7FD1CF -:10B5E00009208DF8300007A800908DF8348043467C -:10B5F000002221461B98FFF71CFC8DF835008DF8C2 -:10B6000036B050B9B8F1010F11D0B8F1000F04D124 -:10B61000A08FA0F57F41FF3909D0A08F38B14FF43A -:10B6200080608DF830B0ADF824000EE034E00CA955 -:10B630001B98FBF791FD82464FF480608DF830B087 -:10B64000ADF82400BAF1020F06D0FB4800688079FB -:10B6500028B18DF8180027E0A4F8188042E0BAF16C -:10B66000000F03D081208DF818003BE007A8009060 -:10B670004346012221461B98FFF7DBFB8DF818009B -:10B6800021461B98FFF7BDFB9DF8180020B9192132 -:10B6900089F80010012038809DF8300020B10CA9F5 -:10B6A0001B98FBF759FD8246BAF1000F33D019E021 -:10B6B000062031E514E02078000711D5012E0FD1C6 -:10B6C0000A208DF83000E088ADF8340004201B9982 -:10B6D00007F070FC0820ADF824007FE5480618D577 -:10B6E0004FF0040A2088BDF8241008432080BDF8DC -:10B6F000240080050BD5A18FA1F57F40FE3806D12F -:10B700001E98E06228982063A6864FF0030A5046F0 -:10B7100097E4042000E59DF8180078B1012089F82D -:10B720000000297889F80110BDF81C10A9F8021052 -:10B730009DF8180089F80400052038802088BDF89D -:10B74000241088432080E2E72DE9FF4F88460878DF -:10B7500095B0012181404FF20900249C0140ADF8D1 -:10B7600020102088DDF88890A0F57F424FF0000A75 -:10B77000FF3A02D029B1000703D5012019B0BDE876 -:10B78000F08F239E4FF0000B0EA886F800B018999A -:10B790005D460988ADF83410A7498DF81CB0179A9A -:10B7A0000A718DF838B0086098F8000001283BD085 -:10B7B000022809D003286FD1307820F03F001D30D7 -:10B7C0003070B8F80400E08098F8001003200229D7 -:10B7D00004D1317821F03F011B31317094F84610CB -:10B7E000090759D505ABB9F1000F13D0002102AA02 -:10B7F00082E80B000720CDE90009BDF83400B8F855 -:10B800000410C01E83B20022159800F0B4FD002879 -:10B81000D1D101E0F11CEAE7B8F80400A6F8010074 -:10B82000BDF81400C01C04E198F805108DF81C1038 -:10B8300098F80400012806D04FF4007A02282CD092 -:10B840000328B8D16BE12188B8F8080011F4006131 -:10B85000ADF8201020D017281CD3B4F84010814236 -:10B8600018D3B4F84410172901D3814212D131788A -:10B8700021F03F01C91C3170A6F801000321ADF889 -:10B880003410A4F8440094F8460020F0020084F834 -:10B89000460064E105257DE176E1208808F108078E -:10B8A00000F4FE60ADF8200010F0F00F1BD010F097 -:10B8B000C00F03D03888228B9042EBD199B9B87869 -:10B8C000C00710D0B9680720CDE902B1CDF804B0A7 -:10B8D0000090CDF810B0FB88BA883988159800F030 -:10B8E00021FB0028D6D12398BDF82010401C8029C8 -:10B8F0004ED006DC10290DD020290BD0402987D14D -:10B9000024E0B1F5807F70D051456DD0B1F5806FE6 -:10B9100097D1DDE0C80601D5082000E0102082465E -:10B920000DA907AA0520CDE902218DF83800ADF850 -:10B930003CB0CDE9049608A93888CDE9000153460A -:10B94000072221461598FFF7A9F8A7E09DF81C20CB -:10B9500001214FF00A0A002A9BD105ABB9F1000F73 -:10B9600000D00020CDE902100720CDE90009BDF884 -:10B9700034000493401E83B2218B0022159800F0FE -:10B98000FAFC8DF81C000B203070BDF8140020E08C -:10B990009DF81C2001214FF00C0A002A22D113AB84 -:10B9A000B9F1000F00D00020CDE902100720CDE949 -:10B9B00000090493BDF83400228C401E83B2218B11 -:10B9C000159800F0D8FC8DF81C000D203070BDF8E3 -:10B9D0004C00401CADF8340005208DF83800208B59 -:10B9E000ADF83C00BBE000E028E03888218B8842BD -:10B9F0007FF450AF9DF81C004FF0120A00281AD1B6 -:10BA0000606A98B1B878C0073FF444AFBA680720BD -:10BA1000CDE902B2CDF804B00090CDF810B0FB88AB -:10BA2000BA88159800F07EFA8DF81C00132030704B -:10BA30000120ADF8340092E0480000203988208BC6 -:10BA40008142D5D19DF81C004FF0160A0028A06B4A -:10BA500008D0E0B34FF6FF7000215F46ADF808B0A4 -:10BA6000019027E068B1B978C907C1D1E18F0DAB6A -:10BA70000844821D03968DE80C0243888288018861 -:10BA800009E0B878C007BFD0BA680DAB03968DE85F -:10BA90000C02BB88FA881598FFF7E9F905005ED01B -:10BAA000072D72D076E0019005AA02A92046FFF783 -:10BAB0001FF90146E28FBDF80800824201D000293B -:10BAC000F1D0E08FA16B084407800198E08746E041 -:10BAD0009DF81C004FF0180A40B1208BC8B138887F -:10BAE000208321461598FFF78CF938E004F11800FF -:10BAF0000090237E012221461598FFF79AF98DF8D0 -:10BB00001C000028EDD1192030700120ADF8340060 -:10BB1000E7E7052521461598FFF773F93AE02088F5 -:10BB200000F40070ADF8200050452DD1A08FA0F595 -:10BB30007F41FE3901D006252CE0D8F808004FF0EF -:10BB4000160A48B1A063B8F80C10A1874FF6FF7130 -:10BB5000E187A0F800B002E04FF6FF70A087BDF8C3 -:10BB6000200030F47F611AD0782300220420159938 -:10BB700007F080F998F8000020712088BDF82010A7 -:10BB8000084320800EE000E007252088BDF8201043 -:10BB900088432080208810F47F6F1CD03AE02188F1 -:10BBA000814321809DF8380020B10EA91598FBF73C -:10BBB000D3FA05469DF81C000028EBD086F801A0BA -:10BBC00001203070208B70809DF81C0030710520A2 -:10BBD000ADF83400DEE7A18EE1B118980DAB008816 -:10BBE000ADF834002398CDE90304CDE90139206B89 -:10BBF0000090E36A179A1598FFF7F2F905460120BD -:10BC00008DF838000EA91598FBF7A6FA00B1054685 -:10BC1000A4F834B094F8460040070AD52046FFF750 -:10BC200096F910F0760F04D114F8460F20F00400B6 -:10BC300020701898BDF83410018028469EE500B5A4 -:10BC400085B0042806D102208DF8000088B269462C -:10BC5000FBF782FA05B000BD10B5384C0B782268AE -:10BC6000012B02D0022B2AD111E013780BB1052B46 -:10BC700001D10423137023688A889A802268CB88B4 -:10BC8000D38022680B891381498951810DE08B880B -:10BC900093802268CB88D38022680B8913814B89DB -:10BCA00053818B899381096911612168FBF754FAEB -:10BCB000226800210228117003D0002800D08120C2 -:10BCC00010BD832010BD806B002800D0012070477C -:10BCD0008178012909D10088B0F5205F03D042F6B0 -:10BCE0000101884201D10020704707207047F0B55C -:10BCF00087B0002415460E460746ADF8144010E004 -:10BD0000069801882980811DCDE90241072101940F -:10BD100004940091838842880188384600F002F933 -:10BD200030B906AA05A93046FEF7E2FF0028E7D0A1 -:10BD3000822800D1002007B0F0BD0000480000209C -:10BD400010B58B7883B102789A4205D10B885BB12C -:10BD500002E08B79091D4BB18B789A42F9D1B0F88A -:10BD600001300C88A342F4D1002010BD812010BD09 -:10BD7000072826D012B1012A27D103E0497801F023 -:10BD8000070102E04978C1F3C20105291DD2DFE8AD -:10BD900001F00318080C12000AB1032070470220BA -:10BDA000704704280DD250B10DE0052809D2801E3D -:10BDB000022808D303E0062803D0032803D0052077 -:10BDC0007047002070470F20704781207047C0B235 -:10BDD000820610D400060CD5FA48807A421ED3178A -:10BDE00002EB5372012303EBE20201FB002080B25D -:10BDF0007047084670470020704770B513880B8065 -:10BE00000D782B062AD5EF4B9B7A834204D845F058 -:10BE100010000870002070BD946800F0070604EB65 -:10BE2000D0042478F44064F304150D701478D178AC -:10BE300004F0030441EA042140F20124B1FBF4F5CB -:10BE400004FB151192685B1E00FB0120D91703EB60 -:10BE50005171012202EBE101084470BD906870BD90 -:10BE600037B51446BDF8041011809DF804100A0679 -:10BE700022D5C1F30013D3490122A568897A8142F2 -:10BE80000CD8FE2814D1491EC81701EB507002EBE4 -:10BE9000E0015A422846F7F7A4F809E005EBD00183 -:10BEA00000F007050878AA409043AB40184308709B -:10BEB000207820F0100020703EBD2DE9F0410746AB -:10BEC000C81C0E4620F00300B04202D08620BDE818 -:10BED000F081BC4D002034462E60AF802881AA72CC -:10BEE000E8801AE0E988491CE980810614D4E178E9 -:10BEF00000F0030041EA002040F20121B0FBF1F222 -:10BF000001FB12012068FFF762FF2989084480B213 -:10BF10002881381A3044A0600C3420784107E1D4DD -:10BF20000020D4E72DE9FF4F89B01646DDE9168AD7 -:10BF30000F46994623F44045084600F00CFB0400E8 -:10BF40000FD0099803F07EFD0290207800060AD5F4 -:10BF50009C48817A0298814205D887200DB0BDE8BF -:10BF6000F08F0120FAE7224601A90298FFF745FF6A -:10BF7000834600208DF80C004046B8F1070F1AD018 -:10BF800001222146FFF7F4FE0028E7D12078400681 -:10BF900011D502208DF80C00ADF81070BDF804002A -:10BFA000ADF81200ADF814601898ADF81650CDF841 -:10BFB0001CA0ADF818005FEA094004D500252E4604 -:10BFC000A84601270CE02178E07801F0030140EA5F -:10BFD000012040F20121B0FBF1F2804601FB128703 -:10BFE0005FEA494009D5B84507D1A178207901F029 -:10BFF000030140EA0120B04201D3BE4201D907202B -:10C00000ACE7A8191FFA80F9B94501D90D20A5E7B9 -:10C010009DF80C0028B103A90998FBF79BF80028AC -:10C020009CD1B84507D1A0784FEA192161F30100EE -:10C03000A07084F804901A9800B10580199850EA0D -:10C040000A0027D0199830B10BEB06002A4619993F -:10C0500014F094FB0EE00BEB06085746189E099867 -:10C0600003F033FE2B46F61DB5B239464246009525 -:10C0700003F091FA224601A90298FFF7BEFE9DF84F -:10C080000400224620F010008DF80400DDE90110C4 -:10C09000FFF7E6FE002061E72DE9FF4FDFF824916E -:10C0A00082461746B9F80610D9F8000001EB4101A5 -:10C0B00000EB810440F20120B2FBF0F185B000FBFF -:10C0C00011764D46DDF84C8031460698FFF77FFE2D -:10C0D00029682A898B46611A0C3101441144AB88C6 -:10C0E00089B28B4202D8842009B038E70699CDB2D4 -:10C0F000290603D5A90601D58520F5E7B9F806C0BC -:10C100000CF1010C1FFA8CFCA9F806C0149909B1B6 -:10C11000A1F800C0A90602D5C4F8088007E01044C1 -:10C1200080B2A9F80800191A01EB0B00A0602246A2 -:10C13000FE200699FFF794FEE77026712078390AF1 -:10C1400061F30100320AA17840F0040062F30101BA -:10C15000A17020709AF802006071BAF80000E080C7 -:10C1600000262673280602D599F80A7000E00127F8 -:10C17000A80601D54FF000084D4600244FF00709EE -:10C180000FE0CDE902680196CDF800900496E988A9 -:10C190002046129B089AFFF7C5FE0028A4D1641C14 -:10C1A000E4B2BC42EDD300209EE72DE9F047804683 -:10C1B00000F0D1F9070007D000264446014D40F2B7 -:10C1C000012918E0480600200120BDE8F08720463C -:10C1D00000F0C1F90278C17802F0030241EA0222BC -:10C1E000B2FBF9F309FB13210068FFF7F0FD3044BF -:10C1F000641C86B2A4B2E988601E8142E7DCA8F123 -:10C200000100E8802889801B288100203870DCE745 -:10C2100010B5144631B1491E218003F013FCA07003 -:10C22000002010BD012010BD10B5D3490446008880 -:10C23000CA88904201D3822010BD096800EB4000FB -:10C2400001EB80025079A072D0882081917810791A -:10C2500001F0030140EA0120A081A078E11CFFF772 -:10C26000CCFD20612088401C2080E080002010BD93 -:10C270000121018270472DE9FF4F85B04FF6FF780D -:10C280008246A3F8008048681F460D4680788DF8E6 -:10C29000060048680088ADF8040000208DF80A0008 -:10C2A000088A0C88A04200D304462C8241E0288AE8 -:10C2B000401C2882701D6968FFF742FDB8BB3988B1 -:10C2C000414501D1601E38806888A04236D3B178DC -:10C2D000307901F0030140EA012901A9701DFFF73F -:10C2E0002FFD20BB298941452CD0002231460798DB -:10C2F000FFF73EFDD8B92989494518D1E96803916E -:10C30000B5F80AC0D6F808B05046CDF800C003F022 -:10C31000DCFCDDF800C05A460CF1070C1FFA8CFC5F -:10C320004B460399CDF800C003F0F8F850B1641CF7 -:10C33000A4B2204600F00FF90600B8D1641E2C828A -:10C340008220D1E67C807079B871F088B88031782D -:10C35000F07801F0030140EA01207881A7F80C9001 -:10C36000504603F06FFB324607F10801FFF745FD29 -:10C3700038610020B8E62DE9FF4F87B081461C46A2 -:10C380009246DDF860B0DDF85480089800F0E3F8DC -:10C3900005000CD0484603F055FB2978090608D55E -:10C3A0007549897A814204D887200BB0D7E50120EE -:10C3B000FBE7CAF309062A4601A9FFF71EFD074657 -:10C3C000149807281CD000222946FFF7D1FC00282A -:10C3D000EBD12878400613D501208DF80800089885 -:10C3E000ADF80C00BDF80400ADF80E00ADF810601B -:10C3F000ADF8124002A94846FAF7ACFE0028D4D1A5 -:10C400002978E87801F0030140EA0121AA78287927 -:10C4100002F0030240EA0220564507D0B1F5007F42 -:10C4200004D9611E814201DD0B20BEE7864201D99D -:10C430000720BAE7801B85B2A54200D92546BBF18B -:10C44000000F01D0ABF80050179818B1B9192A465F -:10C4500014F094F9B8F1000F0DD03E44484644461C -:10C46000169F03F044FC2146FF1DBCB232462B460A -:10C47000009403F0C9F8002097E72DE9F041074642 -:10C480001D461646084600F066F804000BD03846F4 -:10C4900003F0D8FA2178090607D53749897A81420D -:10C4A00003D8872013E5012011E522463146FFF726 -:10C4B000A4FC65B12178E07801F0030140EA012095 -:10C4C000B0F5007F01D8012000E000202870002096 -:10C4D000FDE42DE9F04107461D461646084600F0EA -:10C4E0003AF804000BD0384603F0ACFA217809067C -:10C4F00007D52149897A814203D88720E7E40120C2 -:10C50000E5E422463146FFF7ABFCFF2D14D021783D -:10C51000E07801F0030240EA022040F20122B0FB81 -:10C52000F2F302FB130015B900F2012080B2E070B3 -:10C53000000A60F3010121700020C8E410B50C4628 -:10C5400000F009F828B1C18821804079A07000204E -:10C5500010BD012010BD0849CA88824209D340B1EC -:10C56000096800EB40006FF00B0202EB800008440A -:10C5700070470020704700004806002010B50C46A8 -:10C5800002F0F3FA78B3204600F05FFE60B3227841 -:10C59000102A09D0112A07D0022A05D0032A03D075 -:10C5A000162A2DD0FFDF1CE0A0781A2817D00DDC4A -:10C5B000132814D2DFE800F0151319131320201CE0 -:10C5C0001E28131322131313131326002A2806DD23 -:10C5D0003C280FD003DC302814D03A2810D0032098 -:10C5E00010BD002010BD14E011E043F20200F9E795 -:10C5F0000420F7E70D20F5E70F20F3E70820F1E727 -:10C600001120EFE70720EDE743F20600EAE7FFDF3E -:10C61000E7E7FFDFE5E700F018BE70B5034600204E -:10C6200002466FF02F050EE09C5CA4F130060A2E46 -:10C6300002D34FF0FF3070BD00EB800005EB4000EF -:10C64000521C2044D2B28A42EED370BD30B50A24C7 -:10C650000AE0B0FBF4F304FB13008D18303005F84A -:10C66000010C521E1846D2B2002AF2D130BD30B5AC -:10C6700000234FF6FF7510E0040A44EA002084B25C -:10C68000C85C6040C0F30314604005EA00344440D5 -:10C69000E0B25B1C84EA40109BB29342ECD330BD05 -:10C6A000F0B516460B880122B240134215D1134350 -:10C6B0000B800446051D018840880F18092F00D300 -:10C6C000093F401C092800D9FFDF781C092800D940 -:10C6D000FFDF6088401C6080EE55F0BDF0B5068835 -:10C6E0000446051D0F46701C81B22180092901D323 -:10C6F000093921806088012800D2FFDF701C0928D9 -:10C7000000D9FFDF60880122401E6080A85D398863 -:10C71000824091433980F0BD2DE9F0410E468046BC -:10C72000DDE9065089781746090612D420F8045D21 -:10C730004380404603F0DBFA040000D1FFDF2D1DEB -:10C740002046A9B202F038FC00B9FFDF404600F0F5 -:10C750001AFC06EB4701087C401C0874BDE8F08118 -:10C760007CB505461220187048780C46801C58701D -:10C7700008205880108898805088D8809088188128 -:10C78000D08858810C20CDE90003052306222146DC -:10C790002846FFF7C1FFF02300222946012006F0BA -:10C7A00069FB6078801C60707CBD2DE9F84F0F46F6 -:10C7B0009A4691460546032103F07CF90446808C95 -:10C7C000DFF86085002618B198F80000B84221D142 -:10C7D000284603F08CFA050000D1FFDF09F10401BF -:10C7E000284689B202F098FB060013D002F046FFFB -:10C7F0000770284631466A4602F07FFE0098002105 -:10C800000A460180817000F084FC0098C01DCAF8BF -:10C81000000030E098F80000B84225D104F122056C -:10C8200034F8301F012000FA07F911EA090F00D08F -:10C83000FFDF208840EA090020802C8805F10409E8 -:10C84000641E092C00D309342C806888401C0928F8 -:10C8500000D9FFDF601C092800D9FFDF6888401C71 -:10C86000688009F8047006E03A4604F1300104F1EA -:10C870002200FFF715FF092188F800103046BDE8B7 -:10C88000F88F38B50546032103F014F90446807883 -:10C8900000F07F00012814D002226B4606212846B2 -:10C8A000121DFFF782FF00280AD0A07800F07F0059 -:10C8B000012808D0228921462846009B00F084FAEE -:10C8C00038BD0822E9E704F1080221462846009B0A -:10C8D000FFF746FF38BDFEB514460D46064602ABCF -:10C8E00006220721FFF761FF80B1029B012007228A -:10C8F00018705C700220588000249C800620CDE9CE -:10C900000003052329463046FFF706FFEC70FEBD05 -:10C9100010B50446032103F0CDF80146C278204645 -:10C92000BDE81040D7E7FF4909200870704770B58F -:10C930000C4615463421204613F0B9FF01206070E3 -:10C940002078122120F00F00207004F1100013F065 -:10C95000AEFF05B9FFDF2978A07861F30600A0706B -:10C9600070BD70470146012006F024BB3EB58DB274 -:10C970000321284603F09EF8040000D1FFDF207851 -:10C98000002220F00F00207002208DF800004FF6EA -:10C99000FF70ADF80200ADF8040069462846F7F7CD -:10C9A00019FA3EBDF0B50C46002600780121174665 -:10C9B0003546B1EB101F00D0FFDFFFDF3D800CB12B -:10C9C000268065800020F0BD2DE9FC4788461D4685 -:10C9D0001746814603210A9E03F06CF8040000D13B -:10C9E000FFDFCDE900563B46424621464846FFF769 -:10C9F00093FEBDE8FC8738B50546A0F57F40FF38BB -:10CA00001CD0284603F061F9040000D1FFDF204666 -:10CA100002F052FD002810D001466A46204602F07E -:10CA20006CFD0098B0F80500052807D103212846C1 -:10CA300003F040F8C07808B1002038BD012038BDAF -:10CA40002DE9FF410546408803F03FF9040000D17D -:10CA5000FFDF03AA2046696800F0ADF9039C001FC0 -:10CA600034F8032F618882420AD104290AD00529AB -:10CA700017D0062904D16888211D6B68F8F74DFF8F -:10CA8000BDE8FF811646241D2A4621463046F5F7AB -:10CA900089FC0828F4D12A4621463046FAF7B9FE27 -:10CAA000EEE716466888032103F004F801460020EB -:10CAB0008DF80000042EE3D36279002AE0D02379B8 -:10CAC00043F30000401C05D14F789742D8D10F782E -:10CAD0003F07D5D0142B3CDA4FF002074FF6FF7812 -:10CAE000012B34D0122B02D0132B32D11DE00C2E8F -:10CAF0002FD18B7803F07F03012B2AD0087820F008 -:10CB00000F00401C08706079487001208DF800000B -:10CB10002089ADF802006089ADF80400A089ADF865 -:10CB20000600E089ADF8080028E0062E11D108784B -:10CB300020F00F0008706988012006F03BFA8DF89C -:10CB40000070ADF802802089ADF8040016E0062ED2 -:10CB500005D0002894D06888FFF7BDFE90E70878DC -:10CB600020F00F0008706988012006F023FA8DF884 -:10CB700000702089ADF80200ADF8048068882A466C -:10CB80006946F7F727F97BE7F8B50D460646032116 -:10CB900002F090FF040012D0207800F00F0001286E -:10CBA00010D06B460C2206213046FFF7FEFD58B12F -:10CBB0002A4621463046009BFFF7D2FD08E043F2AB -:10CBC0000200F8BD1120F8BD2868A0606868E06028 -:10CBD000207820F00F00401C20700020F8BDF8B530 -:10CBE0000D460646032102F065FF040006D02078BA -:10CBF00000F00F00012804D00820F8BD43F2020025 -:10CC0000F8BD06226B4611463046FFF7CEFD30B127 -:10CC10002A4621463046009B00F0D6F800E02581E8 -:10CC2000207820F00F0020700020F8BD2DE9F04F93 -:10CC30000F4691B08046032102F03CFF0446404677 -:10CC400003F055F84FF00009CDF82090CDF824906E -:10CC5000ADF834900546CDF82890CDF82C90CDF85D -:10CC60000890CDF80C90CDF8109004B9FFDF02AE1B -:10CC700005B9FFDFB2467F1EFFB219D328460CA9C3 -:10CC8000002202F0A2FA9DF83060092E00D3FFDFE7 -:10CC900004EB46013246087C401E08740DA908A822 -:10CCA000FFF7FEFC1AF80610491C0AF80610E2E726 -:10CCB00004F1300006900E381A4FDFF86CB0051DF5 -:10CCC000059010E0DDE90501FFF708FD0646387024 -:10CCD000092800D3FFDF5BF8261040468847608CA8 -:10CCE000405DB04202D0A08C0028EBD109200E4E4E -:10CCF0003870243620E00DA908A8FFF7EFFC0546A0 -:10CD000004EB4507787CC00716D02946204600F082 -:10CD100054F808B987F811901AF8057056F82500EC -:10CD200028B903E0500000209C0C0200FFDF56F8F9 -:10CD30002520394640469047BDF822000028DAD128 -:10CD400011B0BDE8F08F10B5032102F0B3FE04006E -:10CD500000D1FFDF122104F1100013F0A8FDA0782C -:10CD600040F08000A07010BD70B50D46032102F0A8 -:10CD7000A1FE040000D1FFDF092D00D3FFDF29460B -:10CD8000204600F01AF8002803D004EB45020121E8 -:10CD9000517470BD70B50D46032102F08BFE044640 -:10CDA000294600F00AF820B9208E0121A940084048 -:10CDB00000D0012070BD02F0A0BB00EB4100007C60 -:10CDC000002800D0012070471CB513241C704C783B -:10CDD0005C7002245C809A800622CDE90023052342 -:10CDE000FFF79AFC1CBD000010B50AF047FB0428B1 -:10CDF00003D00AF043FB052802D108F0F9FC28B95A -:10CE00000BF008FD20B107F0FEFB08B1012010BDBA -:10CE1000002010BD0178406819B190F8711059B91F -:10CE200001E001F02EBF90F80C1129B190F80C012F -:10CE3000042801D0012070470020704770B50C46CF -:10CE40000546062102F036FE606008B1002006E0CB -:10CE50000721284602F02EFE606018B101202070E4 -:10CE6000002070BD022070BD2DE9FC470C4606462F -:10CE70006946FFF7E3FF00287DD19DF8000050B11F -:10CE800007F060FBB0427CD0214630460EF06BF9D3 -:10CE9000002873D12DE008F0ABF9B04271D02146E3 -:10CEA00030460CF0BFFD002868D1019D95F8D000F8 -:10CEB00022E0012000E00020804695F835004FF088 -:10CEC000010A4FF00009F0B195F8360080071AD535 -:10CED00084F8019084F800A084F80290A68095F868 -:10CEE0003710A171298F2181698F618185F8359073 -:10CEF00044E0019D95F80C0158350028DBD1687E8F -:10CF00000028D8D0D5E7304602F0F1FE070000D166 -:10CF1000FFDF384602F00DF940B184F801900E2190 -:10CF20002170A680E08084F802A027E0304602F05D -:10CF3000CCFE070000D1FFDFB8F1000F21D038464A -:10CF400002F088F9B8B19DF8000038B90198D0F81E -:10CF5000F8004188B14201D180F80090304607F0D6 -:10CF6000A7F984F801900B21217084F80290A68023 -:10CF7000A97EA17100E004E085F819900120BDE8C8 -:10CF8000FC870020FBE71CB56946FFF757FF00B19F -:10CF9000FFDF684601F083FEFB4900208968A1F8A5 -:10CFA000D2001CBD2DE9FC4104460E46062002F0CD -:10CFB0002BFD0546072002F027FD2844C7B20025B7 -:10CFC000A8463E4417E02088401C80B22080B04232 -:10CFD00002D34046A4F8008080B2B84204D3B042E5 -:10CFE00002D20020BDE8FC816946FFF727FF002838 -:10CFF000F8D06D1CEDB2AE42E5D84FF6FF70208040 -:10D000001220EFE738B54FF6FF70ADF800000DE0E5 -:10D010000621BDF8000002F05FFD04460721BDF8BF -:10D02000000002F059FD0CB100B1FFDF002168469D -:10D03000FFF7B8FF0028EBD038BD2DE9F047D3A1AA -:10D040000F79D1F8008007F0A1F910F0B3F9D14CB5 -:10D050004FF004091020A4F84690A4F848004FF6B9 -:10D06000FF76A4F86460A4F86660002584F8415057 -:10D0700004F83E5BC7492570A57142312573C1F89C -:10D0800009804F730931481E0CF095FEA5741B20D2 -:10D09000A0824FF4A471E182208361830121217772 -:10D0A00061770321A17784F81F9020846084B948B8 -:10D0B000A1843E3805704680B3480C300570B548F1 -:10D0C000103805704680BDE8F08770B5AE4C0D464F -:10D0D0006060217007F0D4F8FFF794FFFFF7ADFF11 -:10D0E000207809F02AFE08F0C7F9217860680CF072 -:10D0F00079FD20780FF094F928460BF048F807F0F6 -:10D100002CFA217860680EF021F9BDE8704010F02B -:10D1100051B910B501240AB1002010BD21B1012977 -:10D1200003D00024204610BD022111F03BFDF9E799 -:10D130002DE9F047040000D1FFDF964D002695F859 -:10D14000410058B166701620207095F84200A0701A -:10D1500095F84300E07085F8416069E0287840B1B7 -:10D160003C22A91C204613F009FB102020702E70D1 -:10D170005EE095F83E0060B10120E07095F83F0058 -:10D18000A07095F8400060701120207085F83E6016 -:10D190004EE08048022166308246FFF703FF00B16F -:10D1A000FFDFB5F86690062002F02EFC0746072048 -:10D1B00002F02AFC3844C7B2781C00F0FF0800BF18 -:10D1C000B5F86600B84212D1204607F09DFF50BB6B -:10D1D00095F8440070B36670132020702021A01CC5 -:10D1E00013F043FB0220A07085F8446020E0404526 -:10D1F0001AD1204607F070F9E0B12078132817D132 -:10D20000A0783C2814D1A088072102F053FC050027 -:10D2100000D1FFDF288807F04BF8A088072102F033 -:10D220005BFC00B1FFDF03E02146FFF71DFE08B104 -:10D23000012048E702215046FFF7B4FE18B9B5F8BF -:10D2400066104945BCD100203DE771E710B5514C4F -:10D25000207828B10A21BDE81040102001F0B3BCAD -:10D26000FFF7C2FD08B10C2002E010F0E9F8002041 -:10D270002071012060710A21E170207010BD70B52D -:10D28000444D0446287828B1BDE870403221102072 -:10D2900001F099BC207818B1012801D0122010E0CB -:10D2A00001F09EFC20B110F016FA08B10C2008E045 -:10D2B000207801F068FC04F11703E21D611C10F0F6 -:10D2C00017F92871012068713221E970287070BD4A -:10D2D00070B5304C0546207828B1BDE870400B2170 -:10D2E000102001F070BC287818B1012801D012205C -:10D2F0000EE0FFF779FD08B10C2009E0287801F075 -:10D3000042FC691C10F063F808B1002000E007201F -:10D310002071012060710B21E170207070BD10B58B -:10D320001C4C217829B13021BDE81040102001F0BB -:10D330004ABC008810F0D2F9302110B100202071D1 -:10D3400000E0217101206071E170207010BD70B5A6 -:10D35000104C0546207828B1BDE8704031211020DE -:10D3600001F031BC01F03CFC08B10C2005E028784C -:10D3700000F0010010F0ACF9002020710120607174 -:10D380003121E170207070BD54000020FFFFFFFFCD -:10D390001F0000009206002010B5F74C207828B13D -:10D3A0003421BDE81040102001F00DBC01F018FC44 -:10D3B00020B110F090F908B10C2002E010F0EFF865 -:10D3C00000202071012060713421E170207010BDB7 -:10D3D000E948017819B10F21102001F0F4BB0021B8 -:10D3E0000171102181700F21C170FF2181714FF6F1 -:10D3F000FF710181E14949680A7882728A888281D5 -:10D400004988C181012141710170704710B5DA4C22 -:10D41000207828B12B21BDE81040102001F0D3BBAB -:10D420000821A01D05F0B4FA0020207101206071D0 -:10D430002B21E170207010BD70B5CF4C217829B13F -:10D44000BDE870404521102001F0BDBB90F90000FF -:10D45000042822D0092820D008281ED007281CD054 -:10D4600006281AD0052818D0022816D0032814D070 -:10D4700098B1011D11D010F1080F0ED010F10C0F52 -:10D480000BD010F1100F08D010F1140F05D010F1CF -:10D49000280F02D01220207103E0002506F0B3F817 -:10D4A00025714520E0700120607120706BE710B598 -:10D4B000B14C217829B12A21BDE81040102001F09B -:10D4C00082BBA31D012200F1100110F0E0FE00203C -:10D4D00020711020A0702A20E0700120607120705F -:10D4E00010BD70B5A44C0546207828B1BDE8704049 -:10D4F0004821102001F067BB09F0C0FF052804D0C7 -:10D50000284609F0F8FB002000E00C2020710120E3 -:10D5100060714821E170207035E770B5964C054682 -:10D52000207828B1BDE870405721102001F04BBB96 -:10D5300009F0C6FC80B10BF060F968B128780128C9 -:10D5400000D000200EF077FF0020207101206071D4 -:10D550005721E170207016E70C20F6E770B5864C75 -:10D560000546207828B1BDE870404621102001F022 -:10D570002ABB01F035FB38B10C202071012060710D -:10D580004621E1702070FEE62946002006F0FFFEED -:10D590000020F2E770B5784C0546207828B1BDE848 -:10D5A00070404421102001F00EBB09F089FC50B1FD -:10D5B0000BF023F938B128780AF00DFE287808F02E -:10D5C00052F9002000E00C202071012060714421FC -:10D5D000E1702070D7E670B5674C0546207828B119 -:10D5E000BDE870401721102001F0EDBA01F0F8FA03 -:10D5F00038B10C202071012060711721E17020707A -:10D60000C1E62946012006F0C2FE0020F2E738B547 -:10D61000594D0446287828B1BDE838404F211020E4 -:10D6200001F0D1BAA079E179884213D021791F297C -:10D6300010D861791F290DD80022114612F0B0FBD5 -:10D6400040B90022E079114612F0AAFB10B9207A05 -:10D65000072801D9122012E04FF6FF70ADF8000044 -:10D660000BF0D8F890B909F009FF78B900216846A5 -:10D67000FFF798FC50B1204605F0EAFE0020287123 -:10D68000012068714F21E970287038BD0C20F6E741 -:10D690002DE9FC47384C054694F83E0020B128217E -:10D6A000112001F090FA6AE4282084F8400001215A -:10D6B00084F83E10A8784FF000091A2825D00EDC17 -:10D6C000162831D2DFE800F03030303030213030F1 -:10D6D00030303030303030303030302121212A2885 -:10D6E00022D00BDCA0F11E000C281DD2DFE800F0D8 -:10D6F0001C1C1C1C1C1C1C1C1C1C1C0D3A3804284B -:10D7000012D2DFE800F0110211022888B0F5706F24 -:10D710000AD21F20884684F83F0028886946FFF710 -:10D720008DFB18B1022019E0122017E09DF80000CF -:10D73000019F002806D007F5B777019E05D106F1B5 -:10D74000F10604E007F1F007F7E706F26F16684606 -:10D75000FFF760FB08B1387818B10C2084F83F005F -:10D760000DE487F80080A878307084F83F90684610 -:10D7700001F095FA03E40000920600205400002016 -:10D780007CB5F84C0546207820B12521102001F009 -:10D790001AFA7CBD28886946FFF750FB0200F14861 -:10D7A0004FF00001A0F13E000DD00222227140F89E -:10D7B000461F0171E1801020A0702520E07001203B -:10D7C000607120707CBD019A1346583282F83F1078 -:10D7D0009E68C0F846601E7B80F84A6092F83F6001 -:10D7E000002EF3D12888E080E5E710B540B1047839 -:10D7F000406813B1B0F8480003E0B0F84A0000E018 -:10D80000FB201B2908D3814206D8B2F5A47F03D39D -:10D8100040F64800824201D9122010BD002010BD00 -:10D820002DE9FC41CF4D0446287828B1BDE8FC41E4 -:10D830005221102001F0C7B94FF0010885F805808A -:10D840001F2129711021A9705221E9702188E980D6 -:10D8500085F8008020886946FFF7F0FA08B10220B9 -:10D860000DE02289E18801236846FFF7BEFF30B949 -:10D87000A288618800236846FFF7B7FF10B12871BE -:10D88000BDE8FC819DF800103A20019E002749B1B7 -:10D8900086F89181019991F8D21106F5C876C1B147 -:10D8A000287114E086F80981019991F82C1106F588 -:10D8B00084760029F4D12F71E08870802089B080AF -:10D8C0006088F080A0883081012201990CE0777097 -:10D8D000D6E72F71E08870802089B0806088F08062 -:10D8E000A088308101990022304610F085FE86F82C -:10D8F0000080ECE770B59B4D044686B0287830B1C7 -:10D9000006B05321BDE87040102001F05CB9012041 -:10D91000687100262E711021A9705321E9702870BA -:10D92000208803A9FFF78AFA18B10220287106B0EF -:10D9300029E59DF80C0040B100220499E088B1F877 -:10D940004830984203D9C01A02E00122F5E70020CE -:10D95000E8806388B1F84A00834201D9181A00E0D0 -:10D9600000202881009601960296E088ADF802001A -:10D970002089ADF804006088ADF80600A088ADF8F5 -:10D980000800684610F038FE2089BDF80410401ADF -:10D990006881A088BDF80810401AA881E088BDF809 -:10D9A0000210401AE988884200DC0846E880608856 -:10D9B000BDF80610401A2989884200DC08462881F3 -:10D9C000B5E7034600200AB1012200E002221A4214 -:10D9D00002D1490700D1122070477CB5614D044641 -:10D9E000287820B13F21102001F0EDF87CBD012006 -:10D9F00068711F2129711021A9703F21E9702870D9 -:10DA0000617820780122FFF7DCFF28B9A17820781F -:10DA10000022FFF7D6FF08B128717CBD617820781D -:10DA20006B46012201F04AF9A178207801AB00226F -:10DA300001F044F99DF8000085F85A009DF80400B3 -:10DA400085F85B000020E7E770B5464D86B00446D8 -:10DA50001F200E4685F83F00208803A9FFF7EEF946 -:10DA600008B102200BE0E178A0780122FFF7A9FFBE -:10DA700028B92179A0780022FFF7A3FF10B185F81B -:10DA80003F0054E7E178A07802AB012201F016F9DB -:10DA90002179A0786B46002201F010F99DF808006A -:10DAA0009DF800100843400719D59DF80C00092483 -:10DAB00038B90020049910F01BFD0499496A884286 -:10DAC0000AD89DF80C00012809D1049910F010FD26 -:10DAD0000499496A884202D985F83F4027E79DF8B2 -:10DAE0000C3001203A220021002B049B93F898303F -:10DAF0001BD0012B32D0049A82F89C01049A82F840 -:10DB00009A01049880F89B61049A9DF8080082F8B5 -:10DB10009D01049A9DF8000082F89E01049880F807 -:10DB20009C1100BF85F83F1001E7012B16D0049A25 -:10DB300082F81401049A82F81201049880F81361A3 -:10DB4000049A9DF8080082F81501049A9DF80000D7 -:10DB500082F81601049880F81411E3E785F83F2055 -:10DB6000E5E60000920600201CB5FE4991F83E2033 -:10DB70002AB1BDE81C405621112001F024B85622DC -:10DB800081F84020012281F83E200188ADF8001084 -:10DB900081788DF80210C1788DF8031001798DF825 -:10DBA0000410C088ADF8060000216846FFF74CFF5E -:10DBB0001CBD2DE9F041EB4C0546207828B1BDE8AD -:10DBC000F0411D21102000F0FEBF1F27277101200A -:10DBD00060711D21E170207009F050FC0C260428B2 -:10DBE00045D0052843D0A9791220012904D019B1C4 -:10DBF000022901D003292BD1297809B1012927D184 -:10DC0000E97929B1012903D0022901D003291FD1C3 -:10DC1000698843F6FD720B1F3020934218D2AB88FF -:10DC20001B1F934214D2A4F84610A888A4F84800F9 -:10DC30004FF00008A87907F03EFDC0B1E87907F081 -:10DC400095FD012007F031FD20B12771BDE8F0817D -:10DC50002071FBE72878012801D018B109E00021E4 -:10DC6000022001E00021012007F0B2FD08B1267179 -:10DC7000ECE784F80480E9E770B5BA4C217829B163 -:10DC8000BDE870401E21102000F09DBF1F212171B2 -:10DC9000012161711E22E270217002781221012A95 -:10DCA00000D01AB9407818B1012801D0217133E4AD -:10DCB00000260C25012A08D009F0E0FB052802D037 -:10DCC00008F076FF78B1257126E407F00DFD0120FC -:10DCD00007F088FD00B1FFDFB4F84810B4F8460043 -:10DCE00009F0FBF8EEE7267116E42DE9F0479D4CAC -:10DCF00007469246B4F85200B7F84A200E469042C2 -:10DD000000D31046804697F85210104600F04BFFA3 -:10DD1000B4F85410814200D208460546A146B4F832 -:10DD20005640B7F84800844200D3044697F8511093 -:10DD300000F039FFB9F85810814200D208464FF47C -:10DD4000A4721B2C01D0904204D1B8F11B0F0DD04E -:10DD500095420BD0A6F8068035817480B08052467B -:10DD60003946304610F048FC01203070BDE8F0879D -:10DD70002DE9F04F85B00546AFF6F011794ED1E9A7 -:10DD8000009196F83E00884630B12121112000F024 -:10DD90001AFF05B0BDE8F08F1F2086F83F00212054 -:10DDA00086F840004FF0010B86F83EB0284600F0A0 -:10DDB00091FF002811D109F061FB05280CD009F072 -:10DDC0005DFB042808D096F8440028B907F010FA43 -:10DDD000A0F57F41FF3901D00C20D5E0614801AAB0 -:10DDE0003E380190604802905E480621103803904A -:10DDF00004A801F02FFE04007ED0032110F069F882 -:10DE0000B6F85E00A4F84800B6F86000A4F84A002E -:10DE100096F85A0084F84F0096F85B0084F850009A -:10DE200096F85D00009096F85C30B6F86020B6F881 -:10DE30005E10208801F0D2FE00B1FFDF208806F0DE -:10DE400036FA218804F10D0000F0D9FE47A004F154 -:10DE50001107006800900321684604F024FD0020AB -:10DE600069460A5C3A54401CC0B20328F9D3288A98 -:10DE70006080688AA080A88AE08094F8522094F894 -:10DE80005110B6F8620009F0A5F80146A0622046DC -:10DE900009F0E4F84FF0000A84F85EA084F85FA06F -:10DEA0005746687900F06FFE6076D5F80600C4F832 -:10DEB0001A006889E083C4F8089084F80C8084F81C -:10DEC00000B1012204F584712046FFF70EFF8DF8A2 -:10DED00000700121684604F0E6FC9DF8000000F0A7 -:10DEE0000701C0F3C1021144C0F3401008448DF88B -:10DEF0000000401D207600E015E0092801D208301E -:10DF00002076002120460FF0E4FF287B07F0D3FBAA -:10DF100058B107F0E9FB69792879AA1D07F032FCAE -:10DF200007000ED01AE009202EE0208806F0C0F984 -:10DF30002088062101F0D0FD00283FF44DAFFFDF1F -:10DF40004AE72146032007F043FC070006D16A8810 -:10DF50002988204608F01DFF070012D0208806F00F -:10DF6000A7F905E09206002060000020112233008E -:10DF70002088062101F0B0FD00B1FFDF86F83F7078 -:10DF800007E7504684F8F4A086F83F0001E738B56B -:10DF9000FE4C207820B12221102000F014FE38BD64 -:10DFA0001F202071012565712220E070257094F8F2 -:10DFB000440010BB09F062FA052805D007F018F9F3 -:10DFC000A0F57F41FF3918D000202071684608F085 -:10DFD000D3FF0028E3D10098008806F069F9009883 -:10DFE0000621008801F078FD00B1FFDFE84884F8E1 -:10DFF00044500078FCF704F938BD0C20207138BD7E -:10E000002DE9F041E14D044695F83E0028B1BDE808 -:10E01000F0412321112000F0D6BD1F2085F83F00DC -:10E02000232085F84000012085F83E00618840F6F5 -:10E030007B438A1F30209A4251D2A288961F9E426B -:10E040004DD291424BD8E188B1F5FA7F47D2218970 -:10E0500040F67746A1F10A03B34240D2B1EBD20FAA -:10E060003DD96189A289914239D84FF000082088B2 -:10E07000062101F01FFD06004FF0020707D000F057 -:10E0800000FE20B1D6F8F800017839B902E085F831 -:10E090003F70DBE5D6F84011097809B13A201EE05F -:10E0A00005218171D6F8F8004146A0F80880D6F81D -:10E0B000F820A0885081D6F8F820E0889081D6F822 -:10E0C000F8202089D081D6F8F800028943899A4245 -:10E0D00004D88279082A01D89A4203D3122085F8FD -:10E0E0003F00B3E522884280D6F8F800077085F833 -:10E0F0003F10ABE5FEB5A54C0646207820B12421A3 -:10E10000102000F060FDFEBD012565712420E07047 -:10E110002570304610F04BF808B1002000E01220C6 -:10E1200020710028EFD1994884F84A504230316874 -:10E13000C0F8091031794173002684F84A606946B5 -:10E14000062001F042FC00B1FFDF684601F01BFC35 -:10E1500060B9BDF80470029880F80051684601F07B -:10E1600012FC18B9BDF80400B842F4D12671FEBD06 -:10E170002DE9F041854D064695F83E0028B1BDE8F1 -:10E18000F0412C21112000F01EBD1F2085F83F001A -:10E190002C2085F84000012085F83E0030880621BB -:10E1A00001F088FC040007D000F06BFD20B1D4F82A -:10E1B000F810087830B901E0022026E0D4F84001D8 -:10E1C000007808B13A2020E094200027005D10F08C -:10E1D000010F19D0D6F802004860D6F80600886012 -:10E1E00054F8F80F718910228181206806F10C0122 -:10E1F0000E3012F0C3FA21680320087021683088BD -:10E20000488085F83F7021E50C2085F83F001DE52A -:10E2100010B586B004464088ADF81000049800F0B0 -:10E220009FFD8DF80400A088ADF800002089ADF8AE -:10E230000200607B8DF80500A07B8DF80600D4F805 -:10E240000F00CDF80700B4F81300ADF80B00207BE9 -:10E250008DF80D00607D8DF80E00684606F037FAE7 -:10E2600006B010BD70B5044680780C25800603D436 -:10E27000607B06F0D0F918B12046FFF7C9FF0546CC -:10E28000284614E5F0B5414E044689B030780C2795 -:10E2900030B109B01821BDE8F040102000F093BC67 -:10E2A0000AF0B8FA012500287AD1607900270328FE -:10E2B0002ED8A07901282BD8A07B032828D8607BF2 -:10E2C00030B3072824D821792020052920D2DFE87F -:10E2D00001F0040D03030400A0202188814217D31C -:10E2E0006088814214D8B0F5804F11D8FF208DF896 -:10E2F000040021790097BDF80000052940F01000C6 -:10E30000ADF8000015D2DFE801F0050A07150D0091 -:10E31000122745E040F0010040F0020006E040F026 -:10E32000090001E040F0010040F00400ADF80000F9 -:10E3300000E0FFDFBDF800000090BDF80000ADF880 -:10E3400006002088029060880390607B8DF81000A2 -:10E3500060798DF81100A0798DF81200D4F80700CB -:10E36000CDF81300B4F80B00ADF81700A07B8DF8C2 -:10E3700019007F208DF81C708DF81A008DF81D5043 -:10E380008DF81B508DF81E7004E0000092060020EE -:10E39000540000208DF81F7001A8FFF763FF0746A7 -:10E3A000377175711820F070357009B0F0BD38B54F -:10E3B00004460078EF283ED8D4E90101884202D90A -:10E3C000A078000737D56088ADF80000009800F00D -:10E3D000FFFC80B36188C806E07D02D501282AD100 -:10E3E00003E0012801D0032825D1607E012803D055 -:10E3F000022801D003281ED1207BE0B107281AD8BB -:10E40000607B28B1012803D0022801D0032812D153 -:10E41000A07B08B101280ED1607D28B1012803D06E -:10E42000022801D0032806D1E07E08B1012802D1DC -:10E43000A07E0F2801D9122038BDA068B0F1807FDE -:10E4400002D26068202803D2080701D4112038BD09 -:10E45000002038BD70B5FB4D0646287828B1BDE8D0 -:10E4600070404121102000F0AEBB0C240AF0D2F91C -:10E4700050B93046FFF79BFF040005D13046FFF747 -:10E48000F1FE040000D1A87101202C7168714121B6 -:10E49000E97028700BE400781F2801D9122070471A -:10E4A00000207047F0B5E74C014689B0207830B1C4 -:10E4B00009B01A21BDE8F040102000F084BB0846E6 -:10E4C000FFF7E9FF30B120711A20E0700120607180 -:10E4D00020706AE7FF208DF8000003208DF801000E -:10E4E00000278DF8027011F8016B8DF803601F2270 -:10E4F0006D4601A812F042F92771291D304606F039 -:10E500003DF9E1E7C1781F2907D84078042803D0F6 -:10E51000032806D009B102E009B11220704711208A -:10E5200070470020704710B5C64C0246207828B1CD -:10E530004221BDE81040102000F045BB1046FFF717 -:10E54000E1FF30B120714220E07001206071207045 -:10E5500010BD00202071D078111D06F00FF9F2E7F0 -:10E5600010B5B84C217829B12021BDE81040102009 -:10E5700000F029BB01781F2902D91220207106E082 -:10E58000002121710278411C104606F0E5F81020A8 -:10E59000A070012060712021E170207010BD7CB559 -:10E5A000A84D04460C20287162781220012A16D842 -:10E5B00021780026012901D049B110E07AB105F097 -:10E5C000F1FF002876D00AF025F950B172E008F08A -:10E5D00067FF044609F03AFD002860D06AE0287120 -:10E5E00068E006F02DF8A07806F0DFF850B10128B9 -:10E5F00008D0042806D0002009F0F0FD00B1FFDFAC -:10E600002E7157E005F09EFFA0F57F41FF3951D1F3 -:10E610000022072101A801F01DFA04004AD08A480F -:10E620000321846020460FF019FB204606F04DFAC6 -:10E63000B5F85E0024F8480FB5F86000608015F862 -:10E640005A0FE07168782072A17A288909F086FE55 -:10E6500044F8200C28890121483C09F07FFE01463E -:10E660000022204608F068FFE8780090AB78EA883E -:10E67000A98820885A3D01F0B1FA00B1FFDF208857 -:10E6800005F015FE204609F0A9FD00B1FFDF2E714F -:10E69000002204F5C8712046FFF727FB0AE02E711F -:10E6A00044B1208805F004FE2088072101F014FA07 -:10E6B00000B1FFDF1020A8700120687128707CBDB8 -:10E6C00060490A781AB14321102000F07CBA432235 -:10E6D000CA70012163E71CB55A4C217829B1BDE805 -:10E6E0001C401B21102000F06EBA00788DF800004D -:10E6F00001208DF80100FF208DF802000020ADF808 -:10E7000004008DF8060001466846FFF748FF1B200D -:10E71000E0701CBD2DE9F0414A4C0646207828B136 -:10E72000BDE8F0412D21102000F04DBA30880721BE -:10E7300001F0C0F905004FF0010720D095F87101F4 -:10E7400040B995F86400112801D0122802D195F83B -:10E75000B40150B10C2020711020A0702D20E07069 -:10E760003088E0806771277093E41022B11C05F5B2 -:10E77000B97012F003F885F871710020EBE7022000 -:10E78000E9E770B52F4C0546207828B1BDE8704008 -:10E790002E21102000F017BA2888072101F08AF9ED -:10E7A000022178B190F871212AB990F86420112AD9 -:10E7B00004D0122A02D00C20207104E080F87111DC -:10E7C0000020F9E721711020A0702E20E070288829 -:10E7D000E08001206071207053E52DE9FC47194C61 -:10E7E0000646207828B13821102000F0ECF9BDE869 -:10E7F000FC8770884BF68032122190420AD848B1CB -:10E800004FF0000830886946FEF718FB20B102205F -:10E81000207110E021710EE0019800F15809851C6B -:10E820002F887288394648460FF0E6F92888B842A2 -:10E83000F6D184F80480012060713821E1702070E5 -:10E84000D5E7000092060020540000207CB5FF4C64 -:10E850000546207820B14B21102000F0B4F97CBD92 -:10E8600028886946FEF7EAFA38B1022020710120B3 -:10E8700060714B21E17020707CBD01987F220146C0 -:10E8800080F8602080F86120002280F86220A8785B -:10E8900001F82C0FE8784870287988702271E6E733 -:10E8A0001CB5EA4C217821B15821102000F08BF9D9 -:10E8B0001CBD00886946FEF7C1FA48B102202071EC -:10E8C000012060715821E1701021A17020701CBDE1 -:10E8D000019890F8710000B1012000212171A07110 -:10E8E000EEE71CB5D94C217821B11321102000F09E -:10E8F0006AF91CBD00886946FEF7A0FA08B102203B -:10E9000005E0019890F82C10012902D00C2020710C -:10E9100006E0602100222271095C21720088E080FB -:10E92000012060711321E1701021A17020701CBDC5 -:10E930002DE9F041C54C0546207828B1BDE8F041ED -:10E940004C21102000F03FB92888072101F0B2F8CF -:10E95000012358B382886D88C688418803EB42073B -:10E96000BD4217D342F210777E43BF107943B6FB06 -:10E97000F1F1491E89B24FF4FA76B14200D931461D -:10E980008D4200D22946491C521CB1FBF2F1514381 -:10E99000491E8AB290F8A01101B90284E2800020D9 -:10E9A000207163714C20E07023702CE40220F7E7A3 -:10E9B00070B5A64C0546207828B1BDE870404E21C0 -:10E9C000102000F000B92888072101F073F890B1F9 -:10E9D000A97811F0010180F8DF1004D090F8DD1063 -:10E9E00009B109F0EBFC00202071012060714E217B -:10E9F000E170207045E40220F6E794490A781AB1E4 -:10EA00005421102000F0DFB802789AB142788AB120 -:10EA100042881B2A0ED382881B2A0BD3C288022A63 -:10EA200008D38A4A0368423242F81A3F406850606D -:10EA3000002000E012200871012048715422CA70A1 -:10EA40000870704770B5814C0546207828B1BDE844 -:10EA500070405521102000F0B6B8287800F0010071 -:10EA600008F0B5FA287800F0010009F043FC002016 -:10EA70002071012060715521E17020700AE570B5A8 -:10EA8000724D0646287828B1BDE870405921102003 -:10EA900000F099B801227088114608F09BFA0446EC -:10EAA0007088012109F05AFC844200D20446308863 -:10EAB000012100F06FF806460121002000F06AF8FD -:10EAC000304401219630844206D900F19601201A83 -:10EAD000B0FBF1F0401C81B2E980002028710120D8 -:10EAE00068715921E9702870D4E470B5574D044617 -:10EAF000287828B1BDE870405021102000F063B89C -:10EB000000F06EF808B10C200DE0601C0EF01EFF46 -:10EB1000207800F0010005F08EFD207800F0010063 -:10EB200006F0DDFD00202871012068715021E97098 -:10EB30002870AFE470B5454C0546207828B1BDE893 -:10EB400070404D21102000F03EB809F063FE08B17E -:10EB50000C2003E0287805F023FE0020207101201E -:10EB600060714D21E170207094E410B501785A294C -:10EB700007D2374A52F8211019B1001D88470120E9 -:10EB800010BD002010BD18B1022801D0012070472F -:10EB900000207047012903D080002C3080B27047DC -:10EBA000C0005030FAE7032904D0022907D0C00082 -:10EBB000703006E04FF4747101EB801001E08000CA -:10EBC0003C3080B27047214A92F84130002B06D188 -:10EBD00082F8420082F84310012082F84100704719 -:10EBE00010B508F04BFC042807D008F047FC0528B6 -:10EBF00003D009F00FFE002800D0012010BD2DE940 -:10EC0000FE4300250F4680460A260421404603F0B5 -:10EC1000BFFE40460FF0A7FA062000F0F5FE0446BE -:10EC20001AE06946062000F0D0FE0AE0BDF80400B4 -:10EC3000B84206D00298042241460D3011F072FD10 -:10EC400078B1684600F09FFE050003E092060020C0 -:10EC5000E40C0200EAD0641E002C06DD002DE0D09A -:10EC600005E040460FF088FAF5E705B9FFDFD8F870 -:10EC700000000EF0CBFF761E01D00028C5D0BDE805 -:10EC8000FE8390F8711041B990F8D01029B190F836 -:10EC9000D000042801D0012070470020704701787F -:10ECA00001290AD1416891F8DD20002A05D000220F -:10ECB00081F8DD20406809F081BB70470AB101226C -:10ECC00000E00222024201D0072001E001F007002B -:10ECD0001870704710B5038843F6FD711A1F8A42F9 -:10ECE00023D24288141F8C421FD29A421DD8C28957 -:10ECF00040F67B43911F994217D2018A8C1F9C4298 -:10ED000013D28A4211D8428AB2F5FA7F0DD2828A92 -:10ED100040F67744A2F10A03A34206D2B2EBD10F28 -:10ED200003D9C18A028B914201D9302010BD0179EB -:10ED300011B1012910D107E0417929B1012903D08E -:10ED4000022901D0032907D1007B38B1012805D061 -:10ED5000022803D0032801D0122010BD002010BDCE -:10ED600080B200B5C1074FEA807112D000294FEA86 -:10ED7000007104DA002926DB410727D523E00029AA -:10ED80004FEA407119DA00291DDAC0061ED50120AC -:10ED900000BD00294FEA007107DA002913DB4107A3 -:10EDA00011D4C00612D5022000BD00290BDB41079B -:10EDB00009D4C0060AD5032000BD002903DAC00625 -:10EDC00004D5042000BDC00600D5FFDF002000BD33 -:10EDD00080B2C10605D4010713D4C1070FD0800744 -:10EDE0000BE0C1074FEA807104D0002902DB400725 -:10EDF00005D406E0010704D44007002801DB012008 -:10EE000070470020704720B100234360021D01813C -:10EE10000260081D7047026800212AB193881268B9 -:10EE2000194489B2002AF9D100234360021D0181EF -:10EE30000260704730B4026800230AB30268938806 -:10EE40008B421EBF1368002B1046F7D1B2F804C0E6 -:10EE500013468C4508BF116811D001F10804A5B212 -:10EE60000024AC4538BF00230AD3ACEB010C11449D -:10EE70000C60A1F804C00268126802600A600160B8 -:10EE800030BC1846704700230B608A8002680A6015 -:10EE90000160704708440830424301F14A001044C1 -:10EEA00080B27047F0B51D460446A818059B08308F -:10EEB00000FB03F205F14A00104486B2B14238BFAC -:10EEC000FFDF002727606760A760E7602761676151 -:10EED000A761E76127624FF6FF706762A082A6F123 -:10EEE000280080B265776080B0F5004F88BFFFDFF3 -:10EEF000608805F13C01884238BFFFDF6088401B15 -:10EF00003C3880B220801B2838BF1B202080A77788 -:10EF1000F0BD8161886170472DE9F04F0D46C188D1 -:10EF2000044600F12808008921F4004320F400423F -:10EF300021F4004620F400474FF0010A4FF0000989 -:10EF40009A4208D100F4004001F4004188421CBFFD -:10EF50000020BDE8F08FB7420BD9617FB81B401A83 -:10EF6000083885421BDC08EB060000210580418043 -:10EF70001EE06088617F801B401AB0F1080B0ED440 -:10EF8000BBF11B0FB8BFFFDF5D45D4BF29461FFA99 -:10EF90008BF1681A0204120C18BFBA4204DD84F81F -:10EFA00017900020BDE8F08F08EB0600018042803A -:10EFB00084F817A0BDE8F08F2DE9F041044600F178 -:10EFC0002802C08820F40043E07D002808BFBDE887 -:10EFD000F081D0180288438813448B423CBF002044 -:10EFE000BDE8F081002791429CBF0180478013D982 -:10EFF000891A0D042D0C45800ED0E088A61D20F442 -:10F000000040854288BFFFDF30884FF4004121EA8D -:10F010000000284330800AE0627F008802F1080384 -:10F020001044083081B26288A01D00F0A8FBE7758B -:10F030000120BDE8F08130B4B0F804C0C4880346B4 -:10F0400000F128052CF400402844A44503D10020F9 -:10F05000188230BC7047B3F80CC00488A44509D3AB -:10F060004088ACEB040CA0EB0C0084B20CEB050068 -:10F07000C01E06E0A4EB0C045D7FA4B2AC44604467 -:10F08000401DB1F800C0A44588BF0C80B3F80CC087 -:10F09000BCF1000F0CBF4FF0010C4FF0000C82F8D8 -:10F0A00000C00988198230BC70472DE9F041044640 -:10F0B00000F12801808820F400404518208A0028AB -:10F0C00008BFBDE8F081A08910B9A069807F2871D0 -:10F0D000A089218A084480B2A08129886A881144C5 -:10F0E000814238BFFFDF28886D88A2894119002737 -:10F0F00091421AD175B1A088261D20F40040A84283 -:10F1000038BFFFDF30884FF4004121EA0000284378 -:10F11000308009E0627F1044083081B202F10803B8 -:10F120006288201D00F02BFBA78127820120BDE80B -:10F13000F0812DE9F0474189B0F8048000270446AA -:10F1400000F1280A414518BF4FF400493AD000BFEA -:10F1500021F40040504446886EB1608904F10A05EC -:10F1600020F40040B04238BFFFDF288829EA0000C1 -:10F170003043288021E0637F008803F1080C1844A5 -:10F180006389083023F400456288284480B204F182 -:10F190000A0190420BD2121A92B20CF11B0C62457A -:10F1A0002CBF03F4004229EA030004D204E0801AD1 -:10F1B00080B229EA030210430880781C618987B273 -:10F1C0004145C5D13846BDE8F0872DE9F047B0F894 -:10F1D00008800B46044600F12801B0F80A908088A8 -:10F1E00028F4004C01EB0C05804504BF0020BDE86D -:10F1F000F087002A1CBF681D106023B1627F691D63 -:10F20000184611F0BBFA2F886D888DB1E81987B2C6 -:10F21000208904F1080620F40040A84238BFFFDF2F -:10F2200030884FF4004121EA0000284330800AE092 -:10F23000607F6288C119083100F1080389B204F1C6 -:10F24000080000F09CFAC84504BF20896081384658 -:10F25000BDE8F0878188C08881420CBF0120002072 -:10F2600070470189808881420CBF012000207047CF -:10F2700030B48488C28800F1280324F4004C22F4BE -:10F280000041634494421BD08289048A15191C886A -:10F290005A88A3189D4216D312B18A4210D212E0A6 -:10F2A000437F0CF1080C1A196244408892B2801A0C -:10F2B00080B22333984201D211B104E08A4202D1D4 -:10F2C00030BC0020704730BC012070472DE9F007AA -:10F2D000B0F806C0048900F1280702462CF4004566 -:10F2E0007E1924F400492CF4004A002024F4004341 -:10F2F0004FF00108D1450AD104F400440CF4004C4D -:10F30000644504D05082BDE8F00700207047AB424E -:10F3100008D992F81DC05B1BA3EB0C03A3F10804F2 -:10F32000002308E0B2F802C0547FACEB050CACEB54 -:10F33000040CACF10804002CE4DBB2F80EC0BCF104 -:10F34000000F0DD0B6F800C075884DB15B1B10776B -:10F350008B42D7DBD0893844A0EB0C00C01E09E0FB -:10F36000A4EB0C0410778C4208DB507FD38918443F -:10F370003044401D5182BDE8F00770478B42A8BF62 -:10F3800082F81C80E6DABDE72DE9F05F044600F163 -:10F39000280AC088934620F400400AEB0005608AE2 -:10F3A000894608B1484502D20020BDE8F09FE089B7 -:10F3B00080B1B5F800806E8808EB0601884218BF5E -:10F3C000FFDF207F4FF0000750EA060108D0002839 -:10F3D00040D04AE04FF00008A17F46462971F0E78F -:10F3E000E08948B1617F01444819B4F81F10A0F8C2 -:10F3F000051094F82110C171E18908EB0900494416 -:10F40000E18128806F80BBF1000F19D0607F2988CF -:10F4100000F108030144083189B26288A01D00F0A0 -:10F42000AEF9E781A07F401CA077A07D00281CBF1B -:10F43000E088A082A7756782E7750120BDE8F09F8C -:10F44000607FE18908442844B0F80510A4F81F1033 -:10F45000C0792EE0E089B4F81F105044A0EB0800FA -:10F4600020F8031D94F82110817006EB090086B284 -:10F47000E089BBF1000F4844E081A5F800806E8070 -:10F480000ED0E088A51D20F40040B04238BFFFDF59 -:10F4900028884FF4004121EA000030432880C0E76B -:10F4A000E0895044A0EB080030F8031DA4F81F10B9 -:10F4B000807884F82100BEE7818800F1280221F4D9 -:10F4C000004C6244B0F814C0C388614518BF99422B -:10F4D0000FD0818969B9806968B1018983889942AF -:10F4E00009D021F40041283008441179007988427C -:10F4F00001D1002070471046704700F12803407F7B -:10F5000001F1050C604410600888002804BFD81E73 -:10F51000106008884988084480B270472DE9F0419E -:10F5200015460A4600F128061C46407F531D034439 -:10F5300010885788069900281CBFC01C80B226D0AE -:10F5400088429CBF081A80B213D9401AA042A8BFB3 -:10F5500020461FFA80F858184246294611F0E2F872 -:10F56000002818BFBDE8F0814544A4EB080084B230 -:10F57000002001198F423CBF4FF0FF30BDE8F08101 -:10F58000304422462946BDE8F04111F0CBB8FA1CC0 -:10F5900097B2F61ED4E72DE9F04100F128071D4689 -:10F5A000407F4B1D0344164608880024B1F80280B2 -:10F5B000069A00281CBFC01C80B21FD090429CBF7E -:10F5C000101A80B20DD9801AA842A8BF284684B26A -:10F5D00099182246304611F0D1F8281B85B22644EE -:10F5E00000204119414506D839182A46304611F005 -:10F5F000C5F8601984B22046BDE8F08108F1030126 -:10F600001FFA81F8FF1ED9E72DE9F04116460A4698 -:10F6100000F128071D46407F531D03441088002435 -:10F62000B2F80280069900281CBFC01C80B21FD00F -:10F6300088429CBF081A80B20DD9401AA842A8BFC0 -:10F64000284684B258182246314611F097F8281BF4 -:10F6500085B2264400204119414506D838442A463F -:10F66000314611F08BF8601984B22046BDE8F08174 -:10F6700008F103021FFA82F8FF1ED9E7401D704708 -:10F6800070B5044600F12801C288808820F4004348 -:10F690001944904208D0A289002A04BF228A002A75 -:10F6A00002D1A28A904201D1002070BDB1F800C001 -:10F6B0004D8885B1261D20F40040A84238BFFFDFE9 -:10F6C00030884FF4004121EA0000284330800020B8 -:10F6D0002082012070BD607F0CF1080100F1080359 -:10F6E000084481B26288201D00F049F8EFE700214C -:10F6F000C18101774182C17581757047038813808C -:10F70000C289002A04BF00207047C28800F1280384 -:10F7100022F400421A440A60C089704710B50446BA -:10F72000808AA0F57F41FF3918BFFFDFE088A08203 -:10F73000E089002818BF0120A07510BD4FF6FF71A9 -:10F74000818200218175704710B50446808AA0F53A -:10F750007F41FF3908BFFFDFA07D28B9A088A18ABB -:10F76000884204BF002010BD012010BD8188828A1C -:10F77000914205BF807D002800200120704710B411 -:10F78000B0F800C02CF40044214489B24FF4004486 -:10F7900091420AD2521A92B21B339A422CBF0CF4F5 -:10F7A000004224EA0C0104D204E0891A89B224EA56 -:10F7B0000C021143018010BC704770B516464FF61D -:10F7C000FC72C91C01EA0205D8B10446C01C20F035 -:10F7D0000301A14200D0FFDF201D012108E0024605 -:10F7E000284401D2034600E00023491CC9B213603B -:10F7F000B142F4D916B104F1040001E04FF0000069 -:10F80000206005FB06F000F1040070BD02460020F8 -:10F810001168002902D00846096811607047026823 -:10F820000A60016070474FF6FC73C91C1940101A3A -:10F83000001F90FBF1F0C0B270474FF6FC73C91C7B -:10F840001940001D01FB0200704700002DE9F04146 -:10F85000C14D04469046A8780E46A04200D8FFDF6E -:10F8600005EB8607B86A50F8240000B1FFDFB868DE -:10F87000FFF7CCFF05000CD0B86A082E40F82450E2 -:10F8800000D3FFDFB5484246294650F826302046CF -:10F8900098472846BDE8F0812DE9F0471E46040050 -:10F8A000074602EB060091468A46C5B227D00021E2 -:10F8B0008846FF2800D9FFDFE01C20F00300A042AB -:10F8C00000D0FFDFB24500D9FFDFA34880F800A0D9 -:10F8D00080F801908570C570057145718671DFF8FB -:10F8E0007CA280F8079000260AF1400A8146FF1C9E -:10F8F00027F003000746B8F1000F03D005E04FF0F2 -:10F900000101D5E709EB860188603AF8161019F86D -:10F91000062001D04FF00000FFF74FFF761CF6B233 -:10F920000744082EE3D3FF1C27F003002A460646AF -:10F93000B8F1000F0DD000200221FFF73EFF434633 -:10F94000002130440F46C846C01C20F003021BB102 -:10F9500010E0C9F84800EFE708EB81060020B2622A -:10F9600006E000BFD6F828C04CF82070401CC0B29A -:10F97000A842F7D3491CC9B202EB85000829E3D39A -:10F98000001BBDE8F08710B5044603F07DFB08B10D -:10F99000102010BD2078704A618802EB80009278B8 -:10F9A0000EE0836A53F8213043B14A1C6280A18083 -:10F9B000806A50F82100A060002010BD491C89B267 -:10F9C0008A42EED86180052010BD70B505460C4610 -:10F9D000084603F059FB08B1102070BD082D01D373 -:10F9E000072070BD25700020608070BD0EB569468F -:10F9F000FFF7EBFF00B1FFDF6846FFF7C4FF08B178 -:10FA000000200EBD01200EBD10B50446082800D30D -:10FA1000FFDF5148005D10BD3EB505460024694634 -:10FA2000FFF7D3FF18B1FFDF01E0641CE4B26846C2 -:10FA3000FFF7A9FF0028F8D02846FFF7E5FF001BD5 -:10FA4000C0B23EBD44498978814201D9C0B27047F5 -:10FA5000FF2070472DE9F04190460C4605460629E7 -:10FA600001D0072C10D13C4FB86CFFF7CFFE02003D -:10FA70004FF6FF7604D00221B86CFFF7D4FE00E009 -:10FA800030462880B04201D1002003E7424621469B -:10FA9000FFF7DCFE040002D1288800F04FF8204672 -:10FAA000F8E6A0F57F43FF3B01D0082901D30020F1 -:10FAB0007047CBE6A0F57F42FF3A0BD0082909D268 -:10FAC000254A9378834205D902EB8101896A51F86E -:10FAD00020007047002070472DE9F04105460C4694 -:10FAE000A5F57F4143F20200FF3902D0082C01D373 -:10FAF0000720CFE618494FF000088A78AA42F8D9C3 -:10FB000001EB8406B26A52F82570002FF1D0134839 -:10FB10003946203050F8242028469047B16A062CF8 -:10FB200041F8258001D0072C02D1284600F006F8C4 -:10FB30003946B068FFF773FE0020ABE610B5064CFF -:10FB4000C2B20221A06CFFF778FE0146A06CBDE8AE -:10FB50001040FFF764BE0000FC0600204C0E0200BF -:10FB600070B50E461D46114600F0D5F804462946EC -:10FB7000304600F0D9F82044001D70BD2DE9F04159 -:10FB800090460D4604004FF0000610D00027E01C00 -:10FB900020F00300A04200D0FFDFE5B14146002085 -:10FBA000FFF731F90C3000EB850617B113E00127A0 -:10FBB000EDE7624F04F10C00A9003C602572606023 -:10FBC00000EB85002060606810F071FE38684146E7 -:10FBD0000068FFF718F93046BDE8F0812DE9FF4FC6 -:10FBE000564C804681B020689A46934600B9FFDFA4 -:10FBF0002068027A424503D9416851F8280020B1B3 -:10FC000043F2020005B0BDE8F08F5146029800F0C3 -:10FC100082F886B258460E9900F086F885B27019BF -:10FC2000001D87B22068A14639460068FFF702F937 -:10FC300004001FD0678025802946201D0E9D0746A1 -:10FC40005A4601230095FFF72DF9208831463844A4 -:10FC50000123029ACDF800A0FFF724F92088C119EA -:10FC60003846FFF756F9D9F800004168002041F8FE -:10FC70002840C7E70420C5E770B5304C054620682A -:10FC800000B9FFDF2068017AA9420ED9426852F814 -:10FC9000251051B1002342F825304A880068FFF74B -:10FCA000F2F8216800200A7A08E043F2020070BDF1 -:10FCB0004B6853F8203033B9401CC0B28242F7D8A9 -:10FCC0000868FFF7A8F8002070BD70B51B4E054608 -:10FCD0000024306800B9FFDF3068017AA94204D9F6 -:10FCE000406850F8250000B1041D204670BD70B575 -:10FCF000124E05460024306800B9FFDF3068017AF3 -:10FD0000A94206D9406850F8251011B131F8040B0A -:10FD10004418204670BD10B50A460121FFF7BAF815 -:10FD2000C01C20F0030010BD10B50A460121FFF7EA -:10FD3000B1F8C01C20F0030010BD000068000020D6 -:10FD400070B5044600780E4601281AD0072802D064 -:10FD50000C281AD115E0A068216905780B2D0CD06C -:10FD6000052003F027F9052D0FD078230022052068 -:10FD7000D4F8101003F07EF807E078230022062064 -:10FD8000F8E70520216903F015F931462046BDE862 -:10FD9000704001F0ADB910B500F13902C379947823 -:10FDA000411D64F003042340C371DB070DD04B7980 -:10FDB000547923404B710B79127913400B7182787F -:10FDC000C9788A4200D9817010BD00224A710A7137 -:10FDD000F5E74178012900D00C21017070472DE929 -:10FDE000F74F86B000208C690D468DF80400097825 -:10FDF0000127FA4816464FF0070A4FF011094FF055 -:10FE00000A0B2A2978D2DFE811F02A0011035203E5 -:10FE10006903A803B303CC03FA030F043B04620491 -:10FE200081049A04D504E60405051005300554053F -:10FE300077059C05C605E005EE050F06270630068A -:10FE400063068506D6060D071B074B076A07790769 -:10FE50008A07C407FB072708E407E807ED0714B182 -:10FE600020781D2829D0D5F808805FEA080043D003 -:10FE700001208DF80400686A059003208DF80800C1 -:10FE80008DF809B0286A0390A8880028EFD098F868 -:10FE9000001091B10F2910D27ED2DFE801F07D145D -:10FEA0004CDCFDFCFBFAF9F8F7089FF6F500022898 -:10FEB00022D124B120780C2801D0002770E3022041 -:10FEC0008DF80400ACE10620696A03F073F8A88895 -:10FED0000728EDD1204601F006F9022809D0204676 -:10FEE00001F001F9032808D9204601F0FCF80728A1 -:10FEF00003D20120207005E011E2002CB7D0207859 -:10FF00000128D5D198F80400C11F0A2903D300BFE6 -:10FF100085F81CB089E2A070D8F80010A163B8F889 -:10FF20000410A18798F8060084F83E00012028708C -:10FF30000320207046E00728BAD1002C97D0207803 -:10FF40000D28B5D198F8031094F83B20C1F3C000F8 -:10FF5000C2F3C002104201D00E2000E00F2089073A -:10FF600007D198F805100142D2D198F80610014245 -:10FF7000CED194F83D2098F8051020EA02021142F3 -:10FF8000C6D194F83E2098F8061090430142BFD1A4 -:10FF900098F80400C11F00E045E20A29B8D2617F49 -:10FFA000814201D90620C2E3D8F800106160B8F898 -:10FFB0000410218198F80600A072012028700E20FC -:10FFC000207003208DF80400686A059004F1390060 -:10FFD0000290601D03901730049067E2412890D191 -:10FFE000204601F080F8042802D1E078C00704D14F -:10FFF000204601F078F80F289ED1A88CEF6880B2D7 -:020000040001F9 -:100000004FF0400AD4F82480FFF75FFE39460827F6 -:10001000424653460097FFF7BEFA0E208DF80400C3 -:10002000686A0590606A0290002101A8FFF788FEC7 -:100030002078042806D0A07F38B1012805D00328F5 -:1000400006D0AEE3052020700BE284F8009034E780 -:100050001220207066E01128C1D1204601F043F83B -:10006000042802D1E078C00719D0204601F03BF8FF -:10007000062805D1E078C00711D1A07F02280ED054 -:10008000204601F030F808E0AFE07DE09AE16EE153 -:100090004EE106E1E5E0CBE01CE011289FD1102203 -:1000A00008F1010104F1480010F068FB60780128B4 -:1000B0000DD012202070E078C00703D0A07F88B355 -:1000C00001282FD085F800B08DF804B0F0E384F853 -:1000D00000A027E011288FD1204601F004F808285D -:1000E00004D0204600F0FFFF132885D12869D8B13D -:1000F0006869C8B104F17800102208F101010746CF -:1001000010F03CFB2078082812D014202070E078F2 -:10011000C0070FD0A07F022818D06178022912D022 -:100120000328CFD10420FDE300208DF80400F6E081 -:100130000920EBE70B202870296901204870206C0A -:10014000C1E9010792E208B1012870D10B202870A3 -:10015000296981F801A0606A4860206AC1E9020744 -:1001600078E2206CE2780068C2F34402521ED0406C -:1001700000F0010040F0800000E000200874E06A18 -:1001800048617CE20746F9E31128D0D1204600F00F -:10019000AAFF0A2802D1E078C00704D1204600F067 -:1001A000A2FF1528C3D1102208F1010104F1480073 -:1001B00010F0E4FA20780A2812D0162020701220BD -:1001C000287029690920487004F1580048602030DF -:1001D00088601038C860206C0861ACE3C40F02006E -:1001E0000B202070E4E22870D9E102289FD120463C -:1001F00000F079FF042804D3204600F074FF08289B -:1002000009D3204600F06FFF0E2890D3204600F05F -:100210006AFF12288BD2A07F022888D18DF8049023 -:10022000686A059098F801008DF80800FBE36CE21D -:100230000228AAD1204600F056FF00286FD02046A1 -:1002400000F051FF0128F9D0204600F04CFF0C28A7 -:10025000F4D005208DF8080098F801008DF8090009 -:1002600065E71128FCD1002CFAD020781728F7D1A7 -:100270006178E06A022912D05FF0000101EB4101D0 -:10028000182606EBC1011022405808F1010110F0B8 -:1002900075FA0520696A00F019FF26700DE6012144 -:1002A000ECE70B28DCD1002CDAD020781828D7D145 -:1002B0006178E06A02292CD05FF0000101EB410176 -:1002C000102202EBC1014158B8F8010008806078A3 -:1002D000E16A022820D0002000EB4002142000EB4D -:1002E000C2000958404650F8032F0A604068486031 -:1002F0000520696A00F0EAFE6078022810D04FF00D -:1003000000002044407A20F001000CD14FF00101A0 -:100310000BE04FF00101D1E74FF00100DCE77FE295 -:100320004FF00100EDE74FF000012144487279E3FE -:10033000112895D1002C93D02078192890D160787D -:10034000E16A022811D0002000EB40021C2000EBE3 -:10035000C2001022085808F1010110F00FFA052020 -:10036000696A00F0B3FE1A20F5E00120ECE70828E6 -:1003700098D1002C98D020781A2893D1E06A98F868 -:100380000120017862F347010170E16AD8F8022088 -:1003900041F8012FB8F8060088800520696A00F04E -:1003A00095FE6078022807D04FF000002044407A84 -:1003B00020F002012BD033E04FF00100F6E720449B -:1003C00041722FE31128B4D1002CB4D020781B281F -:1003D000AFD16178E06A02291CD0002101EB410114 -:1003E000202202EBC1011022405808F1010110F057 -:1003F000C5F90520696A00F069FE607802280CD012 -:100400004FF000002044407A20F0040108D14FF062 -:100410000100D4E74FF00101E0E74FF00100F1E700 -:100420004FF00000CBE785F81CA0FAE330780128F4 -:1004300084D11C2204F11C00716810F0E4F9E07909 -:10044000C10894F83B0001EAD001E07861F30000B4 -:10045000E070217FF1BB217803290AD0C0073FF467 -:10046000F9AD032028708DF804B0686A059041202A -:100470009EE3607FA17888423FF694AD0227277102 -:10048000E179204621F0E001E171617A21F0F0018B -:100490006172A17A21F0F001A172FFF77CFC2F704C -:1004A0008DF804B0686A05908DF808A0F2E3307802 -:1004B000112888D18DF804A0696A0591B16803916B -:1004C000ADF808A008466168016021898180A17AA1 -:1004D000817100E06AE004202070A4E230781128E5 -:1004E000A6D18DF804A0686A0590301D02AB07C83C -:1004F00083E807004120ADF8080008460C21017090 -:10050000A88CD6F80C8080B24027D4F82090FFF752 -:10051000EEFB41464FF008084A463B46CDF80080C6 -:10052000FFF772F8002101A8FFF70AFCE07820F03D -:100530003E00801CE0702078052801D00F200AE0E2 -:10054000A07F00283FF4C3AD0128FBD003287DD154 -:1005500084F80080B1E42070AFE430780328A8D19B -:1005600070680168A1664068E0660520287035E281 -:10057000317803299DD171680A68226749686167EB -:10058000216C51B9A17F19B1012901D0062029E1BF -:1005900085F800A02064606401E085F800A00327CE -:1005A000F3E33178022984D1317909B1297737E130 -:1005B000A17F022910D00329EFD16178012910D041 -:1005C000A17994F83A2001290FD02064E178C90775 -:1005D00013D0012A0ED010E0B0680028E7D02064C4 -:1005E0000BE0A27994F83A10EDE7B1680029DED06B -:1005F0002164EBE7F0680028D9D06064CDE78DF87E -:1006000004B0696A0591E1785846C90709D0617854 -:10061000022903D1A17F29B1012903D0A17F032998 -:1006200000D00820287012E230781128BFD1B068BD -:10063000286209202870E0782969C0070FD081F866 -:1006400001A0206A4860606A886000E0ABE004F1C5 -:100650006800C860A07F02287FF48FAD81E501208B -:100660004870206C486004F16800886004F138002C -:10067000C860201D0861206B4861606B88611FE2C3 -:10068000E1783078C90701D0062100E00A218842CC -:100690008DD12078072817D084F800908DF804A019 -:1006A000686A0590286A0390ADF80890032100F865 -:1006B000011B1022716810F061F8002101A8FFF7FA -:1006C0003FFB00202862C2E408202070E6E7307873 -:1006D0001128ABD18DF804A0686A0590B06803902A -:1006E000ADF80890042100F8011B102204F1680104 -:1006F00010F044F8002101A8FFF722FB2078092818 -:1007000001D0132027E784F800B016E0E1783078B4 -:10071000C90701D0062100E00A21884286D11022B3 -:1007200004F1480071680FF0FDFF10B10420287734 -:10073000A2E3207809283FF4C5AC0C2053E5E0780B -:10074000C10735D0A17F012902D002291BD02CE09E -:100750000D202870296981F801B06078012809D03E -:10076000206A4860606A886004F16800C8601030E0 -:10077000086104E5606A4860206A886004F17800D6 -:10078000C8601038F4E7C0F3440114290DD24FF0CB -:10079000006101EBB0104FEAB060E07060780128B2 -:1007A00001D0102055E40620D5E6607801288AD0D3 -:1007B0000E2018E5307809288BD185F800B010207C -:1007C0008DF80400686A059070680290002101A805 -:1007D000FFF7B6FAE9E7E078C00706D0A07F012866 -:1007E0001FD10F2028700420F8E0152028702969F7 -:1007F00002204870206C48606078012805D004F120 -:10080000780088601038C8605AE104F16800886098 -:100810001030F8E730780228CED1307908B1287747 -:1008200028E3102028700F20D8E030781328F7D163 -:1008300085F80090296908204870706848606078E1 -:1008400001280DD004F1680088601030C860206B6A -:100850000861606B486104F158008861A06A21E07A -:1008600004F1780088601038F0E730780728D7D195 -:10087000607801281AD1A078A16A0A18C0F1100185 -:1008800010460FF0F2FF12202870296909204870E5 -:1008900004F158004860203088601038C860206C2F -:1008A000086141E0C861E06A086209E11320C9E01B -:1008B000CBE030780828B3D1102204F148007168E9 -:1008C0000FF030FF08B10B2031E720780B28EDD076 -:1008D0002046FFF760FAA078A16A0A18C0F110015B -:1008E00010460FF0C2FF1620287008208DF8040073 -:1008F000686A0590002049E03078112890D1B068EE -:1009000028621420287029690920487004F15800D1 -:100910004860103088601030C860606C0861607892 -:10092000012800E09EE006D004F139004861206B08 -:100930008861606BB6E7601D4861606B8861206B01 -:10094000B0E73078082892D18DF804A0686A059045 -:10095000286A0390ADF808900D2100F8011B1022C1 -:1009600071680FF00BFF002101A8FFF7E9F90020E3 -:1009700028626178012902D01520ECE569E2162190 -:10098000297008218DF80410696A05910290A078F9 -:100990008DF80C007EE130780B288CD11620287061 -:1009A0006078022802D12046FFF7F5F9A078716837 -:1009B0000A18C0F1100110460FF057FF08208DF8FB -:1009C0000400686A05907068E0E730780F2895D1D8 -:1009D000E079C0077BD01720287009208DF804002B -:1009E000686A059056E13078102887D11422311DAD -:1009F00004F11C000FF007FFE16A208DA1F8090047 -:100A0000E16AA078C871E179E26A01F0030111722C -:100A1000E16A627A0A73E16AA07A81F82400607858 -:100A2000012876D0B3E13EE26078022801D00120AF -:100A300000E000202044407AC0070BD0E078C007D7 -:100A400008D1192028708DF804B0686A05908DF8D7 -:100A500008901FE11E2071E63078112874D1B0682B -:100A600028621A2028700520B8E7307803286BD157 -:100A70006078E26A022801D0012000E0002000EB4B -:100A80004001142000EBC1015158726813680B60DB -:100A900052684A601B212970D5E9041205234B7066 -:100AA000636A4B606778E36A022F01D0012700E098 -:100AB000002707EB470700EBC7001858C1E90202FF -:100AC000686A4862069800F02AFBFFF75BBB87E183 -:100AD00030780E2838D16078E26A022801D00120EF -:100AE00000E0002000EB4000102101EBC0000223D9 -:100AF0001058093271680EF055FA1C2028702969C7 -:100B000004204870206A4860E06A09308860FA482A -:100B100079E65AE130780D2816D16178E06A022929 -:100B200001D0012100E0002101EB4101182707EB72 -:100B3000C101A278405871680FF020FE6178E06A28 -:100B4000022902D0012101E0A9E0002101EB4101CD -:100B500007EBC1014058A1780844C1F110010FF022 -:100B600084FE8DF804A0686A0590286A0390ADF8A9 -:100B70000890062101706278E16A022A01D0012200 -:100B800000E0002202EB420207EBC202401C89583F -:100B900010220FF0F3FD002101A8FFF7D1F800208B -:100BA00028621D2028708DF804B0686A05900B201B -:100BB0008DF808006EE03078112870D18DF804A00F -:100BC000686A0590B06803900B20ADF808000398A0 -:100BD00080F800A06278E16A022A01D0012200E0D8 -:100BE000002202EB4202102303EBC202895809885B -:100BF000A0F801106178E26A022901D0012100E029 -:100C0000002101EB4103142101EBC30151580A6893 -:100C100040F8032F49684160002101A8FFF790F8D0 -:100C200018E729E16078022801D0012000E00020C7 -:100C30002044407A800701D51F2003E721207DE56D -:100C4000307811282BD18DF804A0686A0590B0681F -:100C50000390ADF80890082707706178E26A0229CE -:100C600001D0012100E0002101EB41031C2101EB37 -:100C7000C301401C515810220FF080FD002101A833 -:100C8000FFF75EF8202028708DF804B0686A0590A0 -:100C90008DF80870314601A8FFF752F815E775E0A6 -:100CA0003078112872D18DF804A0686A0590B06878 -:100CB00003900820ADF80800039809210170E1694C -:100CC000097849084170E16951F8012FC0F8022004 -:100CD0008988C180002101A8FFF732F8AEE760786B -:100CE000022801D0012100E000212144497A49076E -:100CF00001D52220A6E6012849D068E030781128E5 -:100D000044D1B068286223202870296904204870E3 -:100D1000206A4860E06A09308860784873E5307876 -:100D20000D2833D16178E06A022901D0012100E069 -:100D3000002101EB4101202707EBC101102240589F -:100D400071680FF01BFD8DF804A0686A0590286A91 -:100D50000390ADF8089080F800B06278E16A022A4A -:100D600001D0012200E0002202EB420207EBC202A6 -:100D7000401C895810220FF001FD002101A8FEF748 -:100D8000DFFF002028626078B5E791E037E024209B -:100D9000D4E4607802280BD000202044407AC107B8 -:100DA00002D0E178C90705D0810705D51920A9E44B -:100DB0000120F2E71720A5E4400701D51B20A1E49C -:100DC0001C2020706078012801D01820B6E427206C -:100DD000B4E4282028700B2000E63078122849D18E -:100DE0002920ABE42078012844D00C2842D02046AA -:100DF000FEF7EFFF0C208DF80400686A059039E0DB -:100E000030784FF02608112805D0122030700327C3 -:100E100085F800804CE08DF804A0686A0590B06801 -:100E200003900220ADF80800039805210170297F86 -:100E30004170002101A8FEF783FF0B208DF804000C -:100E4000686A0590314601A8FEF77AFF074685F8E3 -:100E50000080012F0ED02BE001208DF80400686A7D -:100E6000059004208DF80800287F8DF809000020E7 -:100E7000287712E0287F80B11D202070252028705F -:100E80008DF804B0686A059002208DF8080031469C -:100E900001A8FEF755FF07460AE00CB1FE202070BE -:100EA0009DF8040020B1002101A8FEF749FF0AE4E3 -:100EB00009B03846BDE8F08F2DE9F04F85B00C46FB -:100EC0004E69002190468DF8041001272278BA4619 -:100ED0004FF00209072022B1012A51D0022A20D165 -:100EE000CAE0217901290BD0022916D0032911D09B -:100EF000042916D11CE00000BC0F0200FE2F0000E8 -:100F0000707801280CD10620616A02F029F80028C7 -:100F100007D11CE01D20307019E07178022901D042 -:100F2000052798E031780C2929D18DF8040010E0CC -:100F3000B07F022823D13078011F042904D30A3955 -:100F4000032901D31D281AD12089022817D38DF82F -:100F5000049084F800A020899DF80410884203D2F0 -:100F60000A208DF800003FE01121083488F80010B5 -:100F700094E80E00C8E901120327C8F80C306AE0B3 -:100F800098F80020112A66D18DF80000626A049258 -:100F9000D8F80850029522794FF00B0B012A06D0A1 -:100FA000022A29D0032A11D0042A54D159E0ADF8DD -:100FB000049085F800B0207E4F4600F01F00687056 -:100FC00000216846FEF7BCFE377043E0ADF80490A0 -:100FD00005202870207E68704E4600216846FEF786 -:100FE000AFFE26708DF800B0606A049041466846F6 -:100FF000FEF7A6FE07462EE0ADF8040085F800A037 -:10100000207F6870607F00F00100A870A07F00F072 -:101010001F00E870E27F2A71C0071FD094F82000FB -:1010200000F00F00687194F8210000F00F00A87123 -:1010300000216846FEF784FE2868B063A888B08760 -:10104000A87986F83E00A069407870772879B0705A -:101050000D2030700027384605B02BE7A971697163 -:10106000E6E7ADF804900E202870207E687000211D -:101070006846FEF765FEEDE7FE2030708DF800A0B3 -:10108000606A049004208DF80400207E8DF805002D -:10109000EDE700B50023012285B0052810D0062811 -:1010A0000CD102208DF8002004918DF8040000BFBF -:1010B0008DF8053000216846FEF742FE05B000BD00 -:1010C0008DF8002004918DF80420F1E770B50C46EE -:1010D000054601F06FFF21462846BDE870407823A1 -:1010E000002201F0C7BE08B1007870470C2070479D -:1010F00070B50C0005784FF000010CD0217021462E -:10110000F4F7B4F874482178405D884201D1032097 -:1011100070BD022070BDF4F7A9F8002070BD027BFD -:10112000032A05D000220A704B780B2B02D003E073 -:10113000042070470A770A62027B9300521C0273F4 -:10114000C15003207047F0B585B00F460546012415 -:10115000287B05EB800050F8046C7078411E0C2948 -:101160000AD25D493A46123101EB8000314650F80F -:10117000043C2846984704460CB1012C11D1287B29 -:10118000401E10F0FF00287301D00324E0E70D207B -:101190008DF80000706A0490002101966846FFF700 -:1011A000A7FF032CD4D005B02046F0BD70B515467E -:1011B0000A46044629461046FFF7C5FF064674B1A5 -:1011C0002078FE280BD1207E30B1002028702946DF -:1011D00004F10C00FFF7B7FF2046FEF7FAFD30469A -:1011E00070BD704770B50E46044688210FF05FFB56 -:1011F0000225012E03D0022E04D0052070BD01204F -:10120000607000E065702046FEF7E3FDA5770020E2 -:1012100070BD28B1027E1AB10A4600F10C01C5E783 -:101220000120704730B5044687B00D46062001F016 -:10123000C1FE2946052001F0BDFE2078FE2806D01B -:1012400000208DF8000069462046FFF7E2FF07B056 -:1012500030BD7FB50E4600218DF80C1041780B296A -:1012600003D00C2903D0002405E0846900E0446920 -:101270000CB1217E91B16D4601462846FFF74FFF24 -:10128000032809D1324629462046FFF78FFF9DF8F3 -:101290000C10002900D0042004B070BD04F10C052E -:1012A000EAE710B590B00C4607900B480421801E69 -:1012B00008900A488DF8191009900F92694606A8FF -:1012C000FFF7C7FF002805D11022204601990FF033 -:1012D00055FA002010B010BD9E0E0200BC0F020097 -:1012E00070B50D46040011D085B1210128460FF0DC -:1012F000BCFA10224E4928460FF040FA4C48012112 -:101300000838018044804560002070BD012070BD18 -:1013100070B5474E00240546083E10E07068AA7B71 -:1013200000EB0410817B914208D1C17BEA7B9142A2 -:1013300004D10C2229460FF0F5F930B1641C308835 -:101340008442EBDB4FF0FF3070BD204670BD70B5BE -:101350000D46060006D02DB1FFF7DAFF002803DBAB -:10136000401C14E0102070BD314C083C208862887D -:10137000411C914201D9042070BD6168102201EB2B -:10138000001031460FF0FAF92088401C20802870A8 -:10139000002070BD70B514460D0018D0BCB10021FE -:1013A000A170022802D0102811D105E0288870B160 -:1013B0000121A170108008E02846FFF7A9FF00284E -:1013C00005DB401CA070A8892080002070BD012092 -:1013D00070BD70B5054614460E000BD0002030706D -:1013E000A878012808D005D91149A1F108010A8877 -:1013F00090420AD9012070BD24B128782070288835 -:10140000000A5070022008700FE064B14968102291 -:1014100001EB0011204610390FF0B0F92878207345 -:101420002888000A607310203070002070BD000012 -:10143000740000202DE9F04190460C460746002537 -:10144000FE48072F00EB881607D2DFE807F00707F2 -:10145000070704040400012500E0FFDF06F814700C -:10146000002D13D0F548803000EB880191F827005B -:10147000202803D006EB4000447001E081F82640AC -:1014800006EB44022020507081F82740BDE8F0812F -:10149000F0B51F4614460E460546202A00D1FFDF50 -:1014A000E649E648803100EB871C0CEB440001EB79 -:1014B0008702202E07D00CEB460140784B7848700D -:1014C000184620210AE092F82530407882F825005D -:1014D000F6E701460CEB410005704078A142F8D1D7 -:1014E00092F82740202C03D00CEB4404637001E0F9 -:1014F00082F826300CEB41042023637082F8271019 -:10150000F0BD30B50D46CE4B44190022181A72EBCF -:10151000020100D2FFDFCB48854200DDFFDFC94872 -:101520004042854200DAFFDFC548401C844207DAAA -:10153000002C01DB204630BDC148401C201830BDC6 -:10154000BF48C043FAE710B504460168407ABE4A76 -:1015500052F82020114450B10220084420F07F406E -:10156000F1F72BFB94F90810BDE81040C9E70420FF -:10157000F3E72DE9F047B14E803696F82D50DFF8AD -:10158000BC9206EB850090F8264038E009EB851701 -:101590004FF0070817F81400012806D0042816D0C9 -:1015A000052816D0062800D0FFDF00F056FF07EB15 -:1015B00044014A7806EB850181F8262091F827201E -:1015C000A24202D1202281F8272028B105E0022082 -:1015D00000E003208046E8E762B62A462146012063 -:1015E000FFF728FF9948414600EB041002682046A7 -:1015F000904796F82D5006EB850090F82640202C59 -:10160000C4D1BDE8F08710B58C4C2021803484F81B -:10161000251084F8261084F82710002084F828006C -:1016200084F82D0084F82E10411EA16044F8100BA0 -:101630002074607420736073A0738549E07720750F -:101640000870487000217D4AB4F1100402F81100BE -:10165000491CC9B22029F9D30120F1F79CF90020D7 -:10166000F1F799F9012084F82200F8F79BFD7948F9 -:10167000F8F7A7FD764CA41E20707748F8F7A1FD77 -:101680006070BDE81040F1F713B910B5F1F735F906 -:101690006F4CA41E2078F8F7ADFD6078F8F7AAFD2E -:1016A000BDE8104000F003BF202070472DE9F34F44 -:1016B000624E0025803606EB810A89B09AF8250033 -:1016C000202822D0691E02916049009501EB00108C -:1016D0008146D0E90112C0680391CDE90420B08BA6 -:1016E000ADF81C00B07F8DF81E009DF81500C8B144 -:1016F0000227554951F820400399E219114421F07D -:101700007F41019184B102210FE00120F1F743F9FB -:101710000020F1F740F9F1F70EF900F0C8FE86F865 -:101720002F508AE00427E4E700218DF818100228E2 -:1017300001D001281BD10398391901440998081ACE -:1017400020F07F4033280BD903208DF81500039833 -:10175000C4F13201401A20F07F40322403900CE0A3 -:1017600096F8240018B901F029F800284DD0322C41 -:1017700003D214B100F08FFE01E000F098FE344A6D -:10178000107820B393465278039B121B00219DF8DA -:101790001840984601281BD0032819D05FF000009C -:1017A0008DF81E00002A04DD981A039001208DF8A0 -:1017B00018009DF81C0000B102210398274A20F070 -:1017C0007F40039003AB099800F07DFE10B110E05C -:1017D0000120E5E79DF81D0018B99BF800000328DB -:1017E00012D08DF81C50CDF80C808DF818408DF873 -:1017F0001E509DF8180058B103980123C11900220A -:101800001846F1F71BF906E000200BB0BDE8F08F99 -:101810000120F1F7C0F899F90C200123002001996B -:10182000F1F70CF9012086F82F008AF828500348B8 -:101830002022694680300EF0E6FF11E048090020C2 -:10184000FF7F841E0020A107E00E02004807002051 -:1018500086000020232D010073150100FFFF3F00CB -:101860000120D2E72DE9F05FDFF88C84064608EB13 -:10187000860090F82550202D1FD0A8F180002C461E -:1018800000EB8617A0F50079DFF870B405E0A246FA -:1018900007EB4A004478202C0AD0F1F71BF909EB3A -:1018A00004135A4601211B1D00F00DFE0028EED046 -:1018B000AC4202D0334652461AE0F1F70BF998F8E1 -:1018C0002F206AB1D8F80C20411C891A0902CA17C6 -:1018D00001EB12610912002902DD0020BDE8F09F32 -:1018E0003146FFF7E3FE08B10120F7E733462A4609 -:1018F00020210420FFF7CCFDEFE72DE9F041FE4C5D -:101900002569F1F7E7F8401B0002C11700EB1160F1 -:10191000001200D4FFDF94F8220000B1FFDF01279E -:1019200084F8227094F82E00202800D1FFDF94F86C -:101930002E60202084F82E00002584F82F5084F893 -:10194000205084F82150EE4825600078022833D0DA -:10195000032831D000202077A068401C05D04FF02C -:10196000FF30A0600120F1F716F80020F1F713F81E -:10197000F1F711F9F1F709F9F0F7DDFF0EF0ACFA24 -:10198000E048056005604FF0E0214FF40040B846A4 -:10199000C1F88002F1F799F994F82D703846FFF7F5 -:1019A00061FF0028FAD0D448803800EB871010F887 -:1019B0001600022802D006E00120CCE73A46314664 -:1019C0000620FFF737FD84F8238004EB870090F8AA -:1019D0002600202804D0CA48801E4078F8F710FC62 -:1019E000207F002803D0F1F7C6F8257765774DE50D -:1019F0000146C14810B590F82D200024803800EB36 -:101A0000821000BF10F814302BB1641CE4B2202CFB -:101A1000F8D3202010BDBC4800EB04100160214623 -:101A20000120FFF707FD204610BD10B5012801D0A9 -:101A3000032800D171B3B04A92F82D30AE4C002289 -:101A4000803C04EB831300BF13F812400CB1082054 -:101A500010BD521CD2B2202AF6D3A94A48B102289E -:101A600007D0072916D2DFE801F01506080A0C0E88 -:101A7000100000210AE01B2108E03A2106E058216D -:101A800004E0772102E0962100E0B521517010704A -:101A9000002010BD072010BD994810B54078F1F71F -:101AA0008CF880B210BD10B5202811D2924991F85F -:101AB0002D30A1F1800202EB831414F810303BB1F9 -:101AC00091F82D3002EB831212F81020012A01D078 -:101AD000002010BD91F82D2001460020FFF7AAFC40 -:101AE000012010BD10B5F0F7F5FFBDE81040F1F78B -:101AF00064B8F0B5804F04782025803F264607EB78 -:101B0000831303E0254603EB45046478944202D036 -:101B1000202CF7D108E0202C06D0A64206D103EBFA -:101B200046025278027007E00020F0BD03EB44004B -:101B300003EB45024078507019B10878A04200D1FB -:101B40000D700120F0BD10B542680B689A1A1202A0 -:101B5000D41702EB1462121216D4497A91B1427A68 -:101B600082B96A4A006852F8211012681944104478 -:101B7000001D891C081A0002C11700EB1160001239 -:101B8000322801DB012010BD002010BD2DE9F047F7 -:101B9000814659485C4E00EB8100984690F82540FC -:101BA0002020107006F50070154600EB81170AE042 -:101BB00006EB04104946001DFFF7C5FF28B107EBEF -:101BC00044002C704478202CF2D1297888F8001039 -:101BD00013E000BF06EB0415291D4846FFF7B3FFCD -:101BE00068B988F80040A97B99F80A00814201D8B9 -:101BF000002006E507EB44004478202CEAD10120C0 -:101C0000FFE42DE9FC410E46074600243E4D08E066 -:101C10009DF8000005EB00108168384600F067FC75 -:101C200001246B4601AA31463846FFF7AFFF002872 -:101C3000EED02046BDE8FC8170B504462E48012553 -:101C40008038A54300EB841100EB851040220EF094 -:101C500095FD294800EB850100EB8400D0F82500B4 -:101C6000C1F82500284670BD2DE9FC418446224874 -:101C700015468038089C00EB85170E4617F81400AF -:101C8000012803D0022801D00020D3E70B461B4ACD -:101C90000121604600F017FCA0B101AB6A4629465D -:101CA0003046FFF773FF68B19DF804209DF80010DF -:101CB00011488A4200EB850608D02B460520FFF725 -:101CC000E7FB0BE02A462146042014E0202903D03C -:101CD00007EB4100407801E096F8250007EB44014E -:101CE00048709DF80000202816D007EB4000447093 -:101CF0002A46214603200BE0C8090020FFFF3F00D1 -:101D00008600002000F5004048070020E00E020099 -:101D1000FFF790FB01208DE706F8254F0120F070BA -:101D2000E6E7FA4901EB0010001D0CE47CB51D4606 -:101D3000134604460E4600F1080221461846F0F705 -:101D400049FF94F908000F2804DD1F38207220682D -:101D5000401C206096B10220ED4951F8261046182B -:101D600020686946801B20F07F40206094F90800BD -:101D70002844C01C1F2803DA012009E00420EBE7F7 -:101D800001AAF0F727FF9DF8040010B10098401C4D -:101D900000900099206831440844C01C20F07F4026 -:101DA00060607CBD2DE9FE430C46074609786079EA -:101DB0009072207998461546507241B1781D20F0F6 -:101DC0007F46D44890F82E00202808D00AE0D4E9B5 -:101DD0000223217903B02846BDE8F043A6E7CE48A8 -:101DE00040780644217900222846A368FFF79EFF29 -:101DF0003146284600F07BFBD4E90232217968465F -:101E0000FFF794FF41462846019CFFF7FAFE2B4658 -:101E100022460021384600F056FB002803D13946FF -:101E2000284600F064FBBDE8FE832DE9FE438046B2 -:101E300000F019FB28B1002798F8000018B1002025 -:101E4000F1E70127F8E7B34C4FF0000994F82D6053 -:101E500084F8239000251FB93046FFF7EDFE0646B3 -:101E6000F0F738FE33466A464146FFF79BFF94F889 -:101E70002E0020280CD021690098401A0002C217B9 -:101E800000EB1260001203D5684600F030FB01251C -:101E900094F823000028D9D1F0F71CFE6B469F4A26 -:101EA000002100F010FB0028BDD027B9314668465C -:101EB000FFF7A7FE054325B16846FFF744FBC8F8C6 -:101EC00008000120AFE72DE9FF5F8A46814600F058 -:101ED000CAFA904C48B19AF80000002710B10128C6 -:101EE00000D0FFDF4FF0010810E094F82E0001272A -:101EF000202800D1FFDF9AF800000028F2D0FFDF91 -:101F0000F0E700BFB8F1000F00D162B694F82D5091 -:101F1000002084F823003FB92846FFF78DFE0546D0 -:101F200094F823000028EDD1F0F7D4FD06462B46A7 -:101F300001AA5146FFF736FF3B462A4601A9304623 -:101F4000CDF80090FFF790FE064604EB850090F870 -:101F500028B000F082FA804694F823000028D1D1FE -:101F60006A490DF1040C01EB09109CE80E0000F128 -:101F7000040080E80E00D6B13BEA07000CD094F8CC -:101F80002E00202808D12846FFF76CFC20B99AF8CB -:101F9000000028B10128B5D0284600F057FA05E026 -:101FA00094F82D2049460420FFF744FA0126B8F1A1 -:101FB000000F00D162B666B194F82D0004EB8000EA -:101FC00090F82600202804D05348801E4078F8F767 -:101FD00017F9304604B081E42DE9F05F4D4C81469D -:101FE00094F82D004FF000080125474605B962B668 -:101FF00004F8237FA07AFFF71FFE064614F8230992 -:102000000028F3D14348803800EB861111F81900FD -:10201000032837D1334604EB830A4A469AF8250051 -:10202000904201D1012000E0002083460AF1250002 -:102030000021FFF75EFD014610EA0B0F03D00122DD -:102040008AF82820A777E9B1324649460120FFF7F0 -:10205000F1F99AF828A000F000FA054694F8230058 -:102060000028C3D1BAF1000F07D094F82E00202821 -:1020700003D13046FFF7F6FB20B1304600F0E6F919 -:102080004FF0010805B962B6404627E40020F0F79A -:102090005BBC0120F0F758BC1F48801E00787047D9 -:1020A0002DE9F0411B4C94F82E0020281FD194F804 -:1020B0002D6004EB860797F82550202D00D1FFDF17 -:1020C0001449803901EB861000EB4500407807F891 -:1020D000250F0120F87084F82300294684F82E503B -:1020E000324602202234FFF7A5F9002020707EE45A -:1020F0002DE9F041054E074C012588B101282BD070 -:10210000022874D0032873D0FFDF70E44807002052 -:10211000E00E0200C809002086000020FFFF3F00FB -:1021200000F0B9F9FFF7BCFF207E00B1FFDF84F8B3 -:1021300021500020F0F72FFCA168481C04D0012397 -:1021400000221846F0F77AFC14F82E0F217806EBDF -:1021500001110A68012154E0FFF7A2FF0120F0F706 -:102160001AFC94F8210050B1A068401C07D014F864 -:102170002E0F217806EB01110A68062141E0207E2E -:10218000DFF880830027012803D002281ED0FFDF5C -:102190002DE4A777F0F7EFFC98F80000032801D1B1 -:1021A00065772577607DD84951F8200094F8201094 -:1021B00051B948B161680123091A00221846F0F7A5 -:1021C0003DFC0220207612E4277610E484F82050AB -:1021D00000F061F9A07F60B198F801006168012307 -:1021E000091A00221846F0F729FC257602E00BE0D8 -:1021F00011E0277614F82E0F217806EB01110A68FA -:102200000021BDE8F0411047BE48801E0078BDE8BF -:10221000F041F7F7F5BFFFF743FF14F82E0F2178D1 -:1022200006EB01110A680521EBE710B5B74C94F8ED -:102230002E00202800D1FFDF14F82E0F2178B44A99 -:1022400002EB01110A68BDE81040042110477CB57B -:10225000AE4C054694F82E00202800D1FFDFA06880 -:10226000401C00D0FFDF94F82E00A94901AA01EB21 -:102270000010694690F90C002844F0F7ABFC9DF97A -:1022800004000F2801DD012000E00020009908442F -:102290006168084420F07F41A16094F82100002883 -:1022A00007D002B00123BDE8704000221846F0F7C5 -:1022B000C5BB7CBD30B5974A0B1A541CB3EB940FC9 -:1022C00012D3451AB5EB940F0ED3934203D9101ACB -:1022D00043185B1C08E0954204D9511A0844401C7D -:1022E000434201E0FFDF0023184630BD01230022F6 -:1022F00001460220F0F7A2BB0220F0F74CBBF0F73A -:10230000E9BB2DE9FC47814D044695F82E002028B5 -:1023100000D1FFDF642C4AD37F4A0021121B71EBEE -:10232000010044D395F82E20A8462846DFF8E09116 -:1023300090F82D7009EB0215D8F8000001AA20448E -:102340006946F0F747FC9DF90400002802DD00987B -:10235000401C0090A96800986A680E18B21A22F012 -:102360007F42B2F5800F22D208EB8702454692F8F1 -:102370002520202A07D009EB02125268511A21F0B9 -:102380007F41814213D3A868401C05D00120F0F79B -:1023900002FB4FF0FF30A86028682044286026F038 -:1023A0007F402861012085F82300BDE8FC870020DC -:1023B000FBE72DE9F041554C074694F82D00A4F1B8 -:1023C000800606EB801010F8170000B9FFDF94F8C4 -:1023D0002D5006EB851606E004280CD005280AD0FF -:1023E000062808D020BF16F817000128F4D10125CF -:1023F0004FF0000807E02A4639460120FFF71AF897 -:10240000F1E705B962B604F8238FA07AFFF714FC50 -:10241000064614F823090028F3D104EB860000F1E6 -:10242000270133463A462630FFF763FB00F015F8E4 -:10243000054694F823000028E3D184F82D6001209C -:1024400084F82300002D00D162B650E62F4981F8B0 -:102450002D00012081F823007047EFF3108000F079 -:10246000010072B670472D480068C005C00D10D03D -:10247000103840B2002806DA00F00F0000F1E0202A -:1024800090F8140D03E000F1E02090F800044009FA -:1024900070470820704710B51C4C94F824000028A1 -:1024A00004D1F7F79BFC012084F8240010BD10B57F -:1024B000164C94F82400002804D0F7F7B8FC00204C -:1024C00084F8240010BD10B51C685B68241A181A23 -:1024D00024F07F4420F07F40A14206D8B4F5800F5D -:1024E00003D2904201D8012010BD002010BDD0E9D8 -:1024F0000032D21A21F07F43114421F07F41C0E91C -:102500000031704786000020E00E0200C80900205C -:1025100048070020FF7F841EFF1FA10704ED00E095 -:10252000F0B5734AD2F80032724D002401212E78A2 -:1025300056B9714E3460704F03263F1D3E606E4F9A -:1025400004260C373E602970C2F80042D160116049 -:10255000694C4834D16425688542FBD35160D16011 -:10256000C2F80032F0BD2DE9F041044680074FF07B -:1025700000054FF0010604D560480560066024F0B0 -:102580000204E0044FF0FF3705D55D484660C0F80F -:10259000087324F48054600003D55A48056024F081 -:1025A0008044E0050FD55248C0F80052C0F80873C7 -:1025B00051490D60091D0D604F4A04210C32116014 -:1025C000066124F48074A00409D54F484660C0F821 -:1025D0000052C0F808734D48056024F40054C4F359 -:1025E0008030C4F3C031884200D0FFDF14F4404F84 -:1025F00014D047484660C0F8087346488660C0F863 -:102600000052C0F8087344490D600A1D16608660C8 -:10261000C0F808730D60166024F4404420050AD504 -:102620003E4846608660C0F80873C0F848733C486E -:10263000056024F400640DF029FC3A48044200D0FF -:10264000FFDFBDE8F08170B5202500224FEA0203CC -:1026500020FA02F1C90719D051B201F01F06012476 -:10266000B4404E09B60006F1E026C6F88041C6F82F -:102670008042002906DA01F00F0101F1E02181F822 -:10268000143D03E001F1E02181F80034521CAA421C -:10269000DED370BD70B5174C0D466060FFF763FF69 -:1026A0006068FFF7D0FF2846F7F78DFC0DF056F86D -:1026B00000F0D5F80DF0EAFB0DF035FBF7F772FDF1 -:1026C000BDE870400DF0F8B810B50A4C6068FFF72F -:1026D0004AFF6068FFF7B7FF0DF0D8FBF7F73DFD45 -:1026E0000020606010BD0348406870470A207047B2 -:1026F000008000408800002004850040FC1F00404E -:1027000000C0004004E5014000D0004004D5004076 -:1027100000E0004000F0004000F5004000B0004044 -:1027200008B50040FEFF0FFD70B51F490A68BAB139 -:1027300000231D4601244A68521C4A60092A00D31E -:102740004D600E7904FA06F20E6816420AD072B68F -:102750000B6893430B6062B649680160002070BD4E -:10276000052070BD5B1C092BE5D3FFDFF8E74FF0B8 -:10277000E0214FF48000C1F800027047EFF31081B0 -:1027800011F0010F72B64FF0010202FA00F2064892 -:10279000036842EA0302026000D162B6E7E702483A -:1027A00000210160416070479000002001208107F6 -:1027B0000860704701208107486070471248006830 -:1027C000C00700D0012070470F48001F0068C007F5 -:1027D00000D0012070470C4808300068C00700D0C6 -:1027E00001207047084810300068704706490C31D6 -:1027F0000A68D20306D5096801F00301814201D1BC -:1028000001207047002070470C040040C84911F8AF -:10281000210F4978884201D3401A02E0C1F1210119 -:102820000844C0B27047C249233111F8210F4978DA -:10283000884201D3401A02E0C1F121010844C0B22C -:102840007047BB49463111F8210F4978884201D3BE -:10285000401A02E0C1F121010844C0B27047B549F5 -:1028600010B5802081F80004B1490020233101F81F -:10287000210F4870AE4901F8210F4870AC4946312C -:1028800001F8210F4870AC480DF096F9AA48401C99 -:102890000DF092F9F0F728FABDE8104000F03DB9CC -:1028A00020207047B2E770B50C4605460026FFF7BA -:1028B000ADFF01469E48A14212D30022641EE4B23D -:1028C0000DD390F82210435C491CC9B205F8013BB6 -:1028D00080F822102129F1D180F82220EEE701268C -:1028E00000F01BF9304670BD202070479BE770B5A3 -:1028F0000C4605460026FFF796FF01468C4823301C -:10290000A14212D30022641EE4B20DD390F822102B -:10291000435C491CC9B205F8013B80F8221021290B -:10292000F1D180F82220EEE7012600F0F6F83046DB -:1029300070BD202101700020704710B50446FFF7DC -:1029400080FF2070002010BD70B50C460546FFF7D3 -:1029500078FF014676484630A14213D30022641E18 -:10296000E4B20DD390F82210435C491CC9B205F8BB -:10297000013B80F822102129F1D180F82220EEE7D6 -:10298000002401E042F2070400F0C7F8204670BDC1 -:1029900070B50C460546212900D9FFDF674800685D -:1029A000103840B200F0A0F8C6B20D2000F09CF83C -:1029B000C0B2864204D2FFDF02E000BFF0F7E4F9C4 -:1029C00021462846FFF76FFF0028F7D070BD2DE99C -:1029D000F047DFF86481564CA8F10108074623341C -:1029E00098F80000DFF84891002604F1230A38B96E -:1029F00094F8221094F82100212200F084F890B17C -:102A00004D4699F8221099F82100212200F07BF818 -:102A1000B8B155469AF822109AF82100212200F008 -:102A200072F848B335E094F82100275494F8210057 -:102A3000401CC0B284F8210021282AD184F82160EA -:102A400027E095F821002F5495F82100401CC0B2D2 -:102A500085F82100212801D185F8216098F800002F -:102A60004746B0B195F8221095F82100212200F0D8 -:102A70004AF870B13E700CE095F821002F5495F89B -:102A80002100401CC0B285F82100212801D185F821 -:102A9000216094F8221094F82100212200F033F8EC -:102AA00000281FD099F8221099F82100212200F067 -:102AB0002AF8002816D09AF822109AF8210021222C -:102AC00000F021F800280DD0F0F734F91A480DF085 -:102AD0007BF8B0F5005F00D0FFDFBDE8F047164897 -:102AE0000DF088B8BDE8F087002806DA00F00F0086 -:102AF00000F1E02090F8140D03E000F1E02090F8E0 -:102B0000000440097047401C884204D0904200D124 -:102B100009B1002070470120704710B506480DF03C -:102B200053F8002803D1BDE81040F0F7EEB810BD0F -:102B3000F80900200DE000E09900002004ED00E01D -:102B4000164908784A78401CC0B2904205D0144B10 -:102B500001221A60BFF34F8F087070472DE9F041D2 -:102B60000E4C4FF0E02600BFF0F794F920BF40BFB5 -:102B700020BF677820786070D6F80052EEF7BCFB73 -:102B8000854305D1D6F8040210B92078B842EBD0BD -:102B9000F0F77BF90020BDE8F08100009B000020E9 -:102BA000180502402DE9F041012528034FF0E021EE -:102BB0000026C1F880011E4CC4F800610C2000F012 -:102BC0002CF81C4801680268C94341F3001142F027 -:102BD00010020260C4F804532560491C00E020BFC5 -:102BE000D4F80021002AFAD019B9016821F01001A7 -:102BF0000160114807686560C4F80853C4F80061B3 -:102C00000C2000F00AF83846BDE8F08110B5044603 -:102C1000FFF7C8FF2060002010BD00F01F02012157 -:102C200091404009800000F1E020C0F88012704718 -:102C300000C0004010ED00E008C500402DE9F0475D -:102C4000F94C0646FF21606800EB061211702178EE -:102C5000FF2910D04FF0080909EB011109EB061705 -:102C60004158C05900F0E2F9002807DD616820787A -:102C700001EB061108702670BDE8F08794F800801B -:102C800045460DE0606809EB05114158C05900F058 -:102C9000CDF9002806DC6068A84600EB081005782E -:102CA000FF2DEFD1606800EB061100EB08100D70EE -:102CB0000670E1E7F0B5DC4B0446002001255A68B8 -:102CC0000C261B7A0CE000BF05EB0017D75DA7426E -:102CD00004D106EB0017D7598F4204D0401CC0B274 -:102CE0008342F1D8FF20F0BD70B5FFF708FBCE4C52 -:102CF00008252278616805EB0212895800F096F9E0 -:102D0000012808DD2178606805EB01114058BDE815 -:102D10007040FFF7EBBAFFF7BFF9BDE87040F7F777 -:102D20006FBA2DE9F041C04C2578FFF7E8FAFF2D86 -:102D30006ED04FF00808626808EB0516915900F054 -:102D400075F90228606801DD80595DE000EB05112E -:102D500009782170022101EB0511425C5AB1521E23 -:102D60004254815901F5800121F07F41815128466B -:102D7000FFF764FF34E00423012203EB051302EBA9 -:102D8000051250F803C0875CBCF1000F10D0BCF5F1 -:102D9000007F10D9CCF3080250F806C00CEB423C7F -:102DA0002CF07F4C40F806C0C3589A1A520A09E02A -:102DB000FF2181540AE0825902EB4C3222F07F421B -:102DC0008251002242542846FFF738FF0C216068E8 -:102DD00001EB05114158E06850F82720384690472C -:102DE0002078FF2814D0FFF78AFA2278616808EB70 -:102DF00002124546895800F019F9012893DD21781F -:102E0000606805EB01114058BDE8F041FFF76EBA6C -:102E1000BDE8F081F0B51D4614460E460746FF2B6F -:102E200000D3FFDFA00700D0FFDF7F48FF21002293 -:102E3000C76044600572067401704270104601223A -:102E400005E000BF02EB0013401CE154C0B2A842F1 -:102E5000F8D3F0BD70B5744C06466578207C854289 -:102E600000D3FFDFE06840F825606078401C6070A8 -:102E7000284670BD2DE9FF5F1D468B460746FF249F -:102E8000FFF73DFADFF8A091064699F80100B84235 -:102E900000D8FFDF00214FF001084FF00C0A99F82D -:102EA0000820D9F804000EE008EB0113C35CFF2BE7 -:102EB00027D0BB4205D10AEB011350F803C0DC4513 -:102EC00021D0491CC9B28A42EED8FF2C1BD008EB96 -:102ED00004110AEB0412475440F802B00421029B8B -:102EE0000022012B01EB041111D042504FF4007865 -:102EF00008234FF0020C454519D9E905C90D08D042 -:102F000008E00C46DDE7FF2004B0BDE8F09F455027 -:102F1000ECE7414606EB413203EB041322F07F421B -:102F2000C250691A0CEB0412490A81540BE005B92E -:102F3000012506EB453103EB041321F07F41C1501D -:102F40000CEB0411425499F800502046FFF776FE2E -:102F500099F80000A84201D0FFF7C6FE3846D3E733 -:102F600070B50C460546FFF7CAF9064621462846C5 -:102F7000FFF7A0FE0446FF281AD02B4D082101EBD5 -:102F8000041168684158304600F050F800F5805050 -:102F9000C11700EBD140401302216A6801EB041114 -:102FA000515C09B100EB4120002800DC012070BD1C -:102FB000002070BD2DE9F0410F468046FFF77AFEF4 -:102FC000FF281BD0184E357871682A462C4605E03C -:102FD000844206D0254601EB05131C78FF2CF7D15F -:102FE0000CE0FF2C0AD0A5420CD101EB02100078B6 -:102FF0003070FF2804D0FFF777FE03E0002007E7DA -:10300000FFF77AF939464046FFF7AAFFFF2201236E -:10301000716803EB0413CA5401EB041201EB0511B0 -:1030200012780A70F4E60000640A0020081A000210 -:10303000C11700EB116000127047000070B5044624 -:10304000A0F500002D4EB0F1786F02D23444A4F503 -:1030500000042B48844201D2012500E0002500F045 -:1030600043F848B125B9B44204D32648006808E0C3 -:10307000012070BD002070BD002DF9D1B442F9D3FC -:1030800021488442F6D2F3E710B50446A0F50000CB -:10309000B0F1786F03D219480444A4F5000400F09D -:1030A00023F84FF0804130B11648006804E08C42AC -:1030B00004D2012003E014488442F8D2002080F0BA -:1030C000010010BD10B520B1FFF7DEFF08B10120EF -:1030D00010BD002010BD10B520B1FFF7AFFF08B143 -:1030E000012010BD002010BD084809490068884231 -:1030F00001D101207047002070470000000000202F -:10310000002002002000002008000020A000002075 -:10311000BEBAFECA5348002101704170102181706F -:10312000704770B5054616460C460220EFF77BFB4C -:103130004C49012008704C49F01E08604B4805605E -:10314000001F046070BD10B50220EFF76CFB45490D -:103150000120087046480021C0F80011C0F8041191 -:10316000C0F8081143494FF40000086010BD3D4805 -:103170000178C9B1404A4FF4000111603C49D1F8CF -:1031800000310022002B1CBFD1F80431002B02D0EB -:10319000D1F8081111B14270102103E001214170F2 -:1031A00036490968817002700020EFF73CBB2D485A -:1031B0000178002904BF407870472D48D0F80011ED -:1031C000002904BF02207047D0F8001100291CBF5D -:1031D000D0F80411002905D0D0F80801002804BF58 -:1031E00001207047002070471E4800B50278204B30 -:1031F0004078C821491EC9B282B1D3F800C1BCF1E0 -:10320000000F10D0D3F8000100281CBFD3F8040130 -:1032100000280BD0D3F8080150B107E0022802D0F3 -:10322000012805D002E00029E4D1FFDF002000BD25 -:10323000012000BD0B480178002904BF8078704749 -:103240000B48D0F8001100291CBFD0F80411002948 -:1032500002D0D0F8080108B1102070470748006874 -:10326000C0B27047A400002010F5004008F50040EF -:1032700000F0004004F5014008F5014000F4004072 -:103280004D48002101704170704770B506461446E4 -:103290000D460120EFF7C7FA48480660001D04609C -:1032A000001D056070BD70B5434B012540EA024228 -:1032B0001D70434B42F080721A60424A424C002615 -:1032C0001160C4F80461414A4FF040711160002858 -:1032D00002BFC4F80052256070BD012818BFFFDF8F -:1032E000C4F8006225604FF000703949086070BD75 -:1032F0003148017879B1354A4FF040711160324957 -:10330000D1F804210021002A08BF417002D0314ABF -:103310001268427001700020EFF785BA26480178E4 -:10332000002904BF407870472748D0F804010028DE -:1033300008BF704727480068C0B27047002808BF20 -:10334000704730B51C480078002808BFFFDF1E48D2 -:10335000D0F80411002918BF30BD0224C0F804437E -:10336000DFF874C0DCF80010C1F30015DCF80010C1 -:1033700041F01001CCF80010D0F80411002904BF6E -:103380004FF400414FF0E02207D100BFC2F8801295 -:1033900020BFD0F80431002BF8D02DB9DCF8001094 -:1033A00021F01001CCF80010C0F8084330BD0649E8 -:1033B0000120886070470000A700002008F5004049 -:1033C00004F5004018F5004000F0004008F5014009 -:1033D00004F5014000F4004010ED00E070B5FE4C33 -:1033E000002501206570257025626572A572E07266 -:1033F00084F82950256304F13C00A5630CF0DCFB44 -:10340000002818BFFFDF84F82450F4480DF054FB67 -:10341000F3494FF011300860091D0860091D08606C -:10342000F0490860F0490D60091D0860091D086039 -:10343000091D0860091D0860091D0860091D086054 -:10344000091D0860091D0860091D0860657770BDC9 -:1034500030B4E1490268DFF898C34A6142688A6182 -:10346000007A08770A7DE14BACF1040401204AB1EF -:103470000A7E00FA02F21A608D7D002D0CBF2260D8 -:10348000CCF800204A7D002A04BF30BC70474A7E39 -:1034900090401860C97D00290CBF2060CCF8000066 -:1034A00030BC7047D449D3480860091DD348086030 -:1034B000704710B5044659B1012908BF4FF080711B -:1034C00006D0022917BF03294FF0C741FFDF0021B3 -:1034D00041F4847040F48010C7490860E0B240F4C1 -:1034E0004030091D40F000700860C548D0F8000168 -:1034F000002818BFFFDF10BD002800B5C14908BF74 -:1035000003200CD0012808BF042008D0022808BFDF -:10351000062004D0032816BFFFDF052000BD086089 -:1035200000BD70B502244FF0E02501200022C5F84F -:103530008041B5490A600860B44A40F25B6111609D -:10354000121F40F203111160111F0860AD490320E2 -:103550000860AF49962008609F4E96F9240000F05D -:1035600040FE707F002814BF4FF4C020A948AA492C -:103570000860AB49A9480860091FAA480860C5F857 -:1035800080429F491020C1F8040370BDA6494FF046 -:10359000004008607047904A0368C2F80230808893 -:1035A000D080117270478C4890F8290070478A4A81 -:1035B000517010707047F0B50546800000F18040F2 -:1035C00000F580508B88C0F820360B78D1F80110B8 -:1035D00043EA0121C0F8001605F10800012707FAA7 -:1035E00000F6924C002A04BF2068B04304D0012AA0 -:1035F00018BFFFDF206830432060206807FA05F11C -:1036000008432060F0BD10B5044600F0EAFD7248A2 -:1036100080F8244010BD704890F8340070476E4820 -:1036200090F836007047824AC1781160006881497D -:10363000000208607047252808BF02210ED0262806 -:1036400008BF1A210AD0272808BF502106D00A280F -:1036500094BF0422062202EB4001C9B2764A1160EF -:103660007649086070475C49086270475A498A7A0F -:10367000012A4AD0022A18BF70474B7D002B08BF91 -:103680007047DFF8BCC1012A43D0CA7D4B7E002AB7 -:1036900018BF012210F17D00CCF80000DFF8A4C1B2 -:1036A0000020CCF84C01180282F0010240EA0250DE -:1036B00040F00312087F830003F1804303F5C04309 -:1036C000C3F81025604A02EB8002887EC30003F134 -:1036D000804303F5F833C3F81425DFF870C1C3F84D -:1036E00010C5C97ECB0003F1804303F5F833C3F85E -:1036F00014254C4AC3F81025012202FA00F002FA00 -:1037000001F108435249086070470B7D002BB8D186 -:1037100070478A7D0B7E002A18BF01227E30BBE7EE -:103720002DE9F84F00280CBF012202222A4D344C0B -:103730000320AA72C4F80002687F002814BF4FF467 -:10374000C0203448424F38604FF00108002933D080 -:10375000012940D002291CBFFFDFBDE8F88F286A8D -:10376000002808BFFFDF296A286B08443949086030 -:103770003A4939480860A97A394801290EBF0460DE -:1037800038490160A86B40F40020A863D4F8009287 -:103790004FF0100AC4F808A30026C4F800621E48BF -:1037A0004FF4802BC0F800B0FF208DF80000C4F863 -:1037B0001061C4F8108084E0012A5DD0C4F8048050 -:1037C000022A18BFBDE8F88F687D002808BFBDE851 -:1037D000F88F1C4848E056E0780A00208C0A002048 -:1037E000040E0040000E0040100E0040180500506E -:1037F0000C050050060102001415004025000302CC -:103800000010004010150040FC1F0040381500401B -:10381000441500400000040408F5014040800040C9 -:10382000A4F50140101100407417004040160040FC -:10383000241500401C150040081500405415004098 -:103840004C85004000800040006000404C810040FA -:1038500004F501404885004048810040A8F501403A -:10386000ACF5014004100040C0F84C80F9480068F5 -:10387000BDE8F84F0A30F9E6C4F80080287D00283A -:10388000A7D1BDE8F88FF448012A806B07D0022A3F -:1038900018BFFFDF09D0BDE8F84F0A20E6E640F484 -:1038A0008010A8634FF4801004E040F40010A86377 -:1038B0004FF400103860EEE79DF80000401E8DF8D0 -:1038C00000009DF8000018B1D4F810010028F3D0D2 -:1038D0009DF80000002808BFFFDFC4F80061C4F8AD -:1038E0000C61C4F81061C4F80461C4F81461C4F830 -:1038F0001861C4F82861D94800680090C4F80092A3 -:10390000C7F800B0C4F804A34FF400203860296A57 -:10391000286BBDE8F84F08440A30A7E62DE9F847C0 -:10392000CF4CD4F8000220F00309D4F804034FF080 -:10393000100AC0F30018C4F808A30026C4F80062F7 -:10394000C54D687F002814BF4FF4C020C548C64944 -:103950000860A87A0127012802D0022803D014E0C9 -:10396000287D10B911E0687D78B1A87EEA7E07FA5B -:1039700000F007FA02F210430860287F800000F18F -:10398000804000F5C040C0F81065FF208DF80000B1 -:10399000C4F81061276104E09DF80000401E8DF816 -:1039A00000009DF8000018B1D4F810010028F3D0F1 -:1039B0009DF80000002808BFFFDFC4F81061C4F8BC -:1039C00028616E72AE72EF72C4F80092B8F1000F07 -:1039D00018BFC4F804A3BDE8F8870068A34920F025 -:1039E0007F40086070474FF0E0200221C0F880114E -:1039F000C0F8801270474FF0E0210220C1F80001AA -:103A000070479B490870704710B59A480CF0DCF875 -:103A1000002818BFFFDF10BD96480CF0EBB89649A0 -:103A20000860704730B58C4C0546206BA84228BF13 -:103A3000FFDF012020732561607F40B1A81C206159 -:103A40008748D0F8001241F04001C0F800128B49BD -:103A50000020C1F844018A4920690860A06B8949A7 -:103A600040F48000A0634FF48000086030BD00285F -:103A700004BF28207047012804BF1820704702287F -:103A800012BF03284FF4A870704700B5FFDF28204D -:103A900000BD002804BF41F2D4707047012804BF64 -:103AA00041F204007047022812BF032842F6A0002A -:103AB000704700B5FFDF41F2D47000BD002804BF9D -:103AC00042F2B8407047012804BF41F28830704785 -:103AD000022804BF44F690407047032804BF47F211 -:103AE000A030704700B5FFDF42F2B84000BDF0B52E -:103AF0000646594C02200D462073032914BF022D9F -:103B00004EF634170BD0002D08BF42F2B84706D04E -:103B1000012D1ABFFFDF42F2B84741F28837002E6D -:103B200008BF41F2D4700CD0012E08BF41F204004E -:103B300007D0022E17BF032E42F6A000FFDF41F28E -:103B4000D470381A002D504908444FF47A71B0FBF4 -:103B5000F1F708BF28200AD0012D08BF182006D091 -:103B6000022D17BF032D4FF4A870FFDF2820384423 -:103B7000032E16BF022E062101210844401D20619C -:103B8000617F41B1801C20613548D0F8001241F0BE -:103B90004001C0F8001239490020C1F844012169F0 -:103BA000206B084436490860F0BD2B490120487756 -:103BB000364902200860374935480860091F3648F1 -:103BC00008607047244900204877704726494FF421 -:103BD000800008602048816B21F48001816300210E -:103BE0000173704770B584B014460D46064604292B -:103BF00034BF042CFFDF294B0FCB8DE80F00684644 -:103C000000EB850026490057301A086004B070BDEB -:103C100070B584B014460D460646042A34BF042D00 -:103C2000FFDF204B0FCB8DE80F00684600EB8500CF -:103C30001B490057301A086004B070BD0F480121BD -:103C40004160C1600021C0F844110D480160024884 -:103C5000016370474C850040780A0020181100402D -:103C6000001000400000040408F501403C1500402D -:103C7000A9000020B40A0020041500400080004084 -:103C80004485004004F50140FF57020060150040E4 -:103C9000448000409CF5014028110040400F020084 -:103CA00044150040500F0200FE4800B5407F002838 -:103CB00018BFFFDF4020FC490860FC48D0F8001224 -:103CC00041F04001C0F8001200BDF64800B5407F49 -:103CD000002818BFFFDFF548D0F8001221F040019E -:103CE000C0F80012F0490020086000BDEF48D0F88D -:103CF000001221F01001C0F800120121816170470B -:103D0000EA480021C0F81C11D0F8001241F010015F -:103D1000C0F800127047E54981B0D1F81C21012A92 -:103D20001EBF002001B07047E14A126802F07F0216 -:103D3000524202700020C1F81C01DE480068009069 -:103D4000012001B0704730B50C00054608BFFFDF09 -:103D500014F0010F1CBF012CFFDF002D0CBF012050 -:103D60000220D04901284872CC72D04904BFD1F852 -:103D7000000240F0040007D0022807BFD1F800027B -:103D800040F00800FFDF30BDC1F8000230BD70B563 -:103D9000C44C0022E17A11F0020F18BF10F0040F9A -:103DA00016D111F0100F1CBF94F83530002B02D043 -:103DB00094F8373063B111F0080F1CBF94F8283025 -:103DC000002B05D111F0040F03D094F8291001B98C -:103DD0000122657AB54900234FF0010C35B100F09E -:103DE0000200104314D0BDE8704097E5607F0028C2 -:103DF00014BF4FF4C020B048B04A1060D1F80002A0 -:103E000020F00300C1F80002A37284F80BC070BD5B -:103E1000012D14D0022D18BFFFDF1CD0A07A01287D -:103E20000CBFA748A7484FF47A7100F2E730B0FB07 -:103E3000F1F0216BBDE87040081A8C3016E4D1F81F -:103E4000000220F00400C1F80002637284F80BC085 -:103E500084F80AC0E2E7D1F8000220F00800C1F8B7 -:103E60000002637284F80BC00220A072D6E72DE92D -:103E7000F84F954FD7F84C218A4C90494FF00108E4 -:103E8000A07A0026CAB1012802D0022803D014E08B -:103E9000227D12B911E0627D7AB1A27EE37E08FA3A -:103EA00002F208FA03F31A430A60227F920002F139 -:103EB000804202F5C042C2F81065A26B0A60A66398 -:103EC000217B29B1D7F84411012908BF012200D074 -:103ED0000022764DD5F8101101290CBF4021002198 -:103EE000012805BFD5F80C31012B002320231943ED -:103EF000012805BFD5F80431012B002310231943F5 -:103F0000724B022804BFD3F800C0BCF1010F07D1E7 -:103F1000D5F80CC1BCF1010F08BF4FF0080C01D05F -:103F20004FF0000C4CEA0101022804BF1B68002B73 -:103F300005D1D5F80C31012B08BF042300D0002394 -:103F40001943022803D1002A18BF022200D10022FF -:103F50001143022804BFD5F80401012805D1D7F880 -:103F60004401012818BF012000D1002040EA0109C6 -:103F70005748016811F0FF0F03D0D5F8141101293B -:103F800000D0002184F83410006810F0FF0F03D037 -:103F9000D5F81801012800D0002084F835004D48DC -:103FA000006884F836004048006818B1FFF7FFF851 -:103FB000012800D0002084F83700C5F80061C5F85A -:103FC0000C61C5F81061C5F80461C5F81461C5F845 -:103FD0001861C5F82861404800680090C7F844613E -:103FE0003E4800684D46DFF8F8900090D9F8000090 -:103FF000E062617F00291CBF801EE06239480068D2 -:104000002063A07ADFF8E0A002280CD1607850B1DC -:10401000DAF8001009780840217831EA000008BF7A -:1040200084F8288001D084F82860DFF8C08015F07B -:10403000010F15D098F800102D4A4908E06A52F88F -:104040002110884701212B4A98F80030206B52F844 -:104050002320904798F8000010F0010F0BD01FE0CC -:1040600015F0200F18BF0221EDD115F0020F18BF77 -:104070000021E8D1EEE7DAF80000062200F109019C -:10408000A01C0CF04FFB40B9207ADAF80010097838 -:10409000B0EBD11F08BF012000D0002084F8290018 -:1040A000284629E0780A00206015004000100040F2 -:1040B000481500401C1100400000040408F50140B0 -:1040C000F0FE0100B0F80100008000400014004044 -:1040D0004016004008140040181100404481004080 -:1040E000448500404085004004150040A9000020A0 -:1040F000F80E0200300F0200FFF749FE15F0020F24 -:1041000005D0594898F8001050F82100804715F064 -:104110000C0F07D0554898F8001050F82110C5F33F -:10412000C000884715F0200F05D0514898F80010BE -:1041300050F82100804798F80000022805D105F0CA -:104140006E00402806D101F093FB98F80000042887 -:1041500028BFFFDFA07A022818BFBDE8F88F207BB8 -:10416000002808BFBDE8F88FC7F84461022815D0C1 -:10417000012818BFFFDF216B2069884298BFFFDF4D -:10418000D4F81000C9F80000A06B3A4940F4800050 -:10419000A0634FF480000860BDE8F88F2169206BB0 -:1041A0000844EFE7002812BF012864207047022866 -:1041B00012BF03284FF4C870704700B5FFDF6420BA -:1041C00000BD2D49032818BF0228086803BF20F04E -:1041D000B30040F04C0040F0004020F00040086088 -:1041E000704700B52549022839D022DC10F10C0FA8 -:1041F00008BFF42033D010DC10F1280F02BFD82004 -:10420000086000BD10F1140F08BFEC2027D010F19A -:10421000100F08BFF02022D023E010F1080F08BFD4 -:10422000F8201CD010F1040F0CBFFC20002816D081 -:1042300017E0C01E072814D2DFE800F0100E0C0AA9 -:104240000806040009200AE0082008E0072006E02C -:10425000062004E0052002E0042000E003200860BE -:1042600000BDFFDF00BD0000000F0200100F0200C4 -:10427000200F020004F501403C1700400C150040DF -:1042800010B53F480AF08BFC00213D480AF0B6FC0F -:1042900001213B480AF086FC3A49002081F82200BF -:1042A0004FF6FF70888438490880488010BD7047F9 -:1042B00034498A8C824218BF7047002081F822005E -:1042C0004FF6FF70888470472D49016070472E4972 -:1042D000088070472B498A8CA2F57F43FF3B03D0AF -:1042E000002101600846704791F822202549012AE3 -:1042F0001ABF0160012000207047224901F122000D -:1043000091F82220012A04BF002070470122027088 -:104310001D4800888884104670471B4948807047B4 -:104320001849194B8A8C5B889A4206D191F8222051 -:10433000002A1EBF0160012070470020704711480D -:10434000114A818C5288914209D14FF6FF718184C4 -:1043500010F8221F19B100210170012070470020C0 -:1043600070470848084A818C5288914205D190F8DC -:10437000220000281CBF0020704701207047000069 -:10438000DE0A0020B80A0020AA0000207047514A27 -:10439000012340B1012818BF70471370086890606E -:1043A00088889081704753700868C2F80200888836 -:1043B000D0807047474A10B1012807D00EE05078EE -:1043C00060B1D2F802000860D08804E0107828B10B -:1043D00090680860908988800120704700207047AD -:1043E0003C4910B1012803D006E0487810B903E039 -:1043F000087808B1012070470020704730B58DB0B3 -:104400000C4605460D2104A80CF051FAE0788DF811 -:104410001F0020798DF81E0060798DF81D00286836 -:10442000009068680190A8680290E8680390684668 -:104430000BF02EFA20789DF82F1088420CD160786E -:104440009DF82E10884207D1A0789DF82D10884243 -:1044500002BF01200DB030BD00200DB030BD30B521 -:104460000C4605468DB00321E01CFEF740FA60794A -:104470000D2120F0C00040F04000607104A80CF055 -:1044800016FAE0788DF81F0020798DF81E0060790B -:104490008DF81D002868009068680190A868029057 -:1044A000E868039068460BF0F3F99DF82F00207040 -:1044B0009DF82E0060709DF82D00A0700DB030BDED -:1044C00010B504460621FEF712FA607920F0C0000C -:1044D000607110BDAE00002070B5FF4D0446286825 -:1044E00090F8D610002601291BD090F8B4100129AD -:1044F0001CBF002070BD66701321217000F1B60151 -:104500002022A01C0CF03AF90120A071286880F844 -:10451000B46068680088FBF7D8FBFBF70FF901204F -:1045200070BD667019212170D0F8D710C4F8021040 -:10453000D0F8DB10C4F8061090F8DF10A17280F8F4 -:10454000D660ECE7E448006890F8B410002914BF86 -:10455000B0F8B8004FF6FF70704710B5DE4C206819 -:10456000002808BFFFDF002120684170002808BF35 -:10457000FFDF2068417800291CBFFFDF10BDE42168 -:104580000CF095F921687F2081F83100FFF79DFB41 -:10459000FEF7EDFDD1480AF03DF9BDE81040D048E6 -:1045A0000AF038B9CC48006880787047CA4800B52E -:1045B000016891F82200C0F38002C0F340031A445E -:1045C00000F00100104491F82120C649062A10D2BB -:1045D000DFE802F00C070C03090BC34931F81000A7 -:1045E00000BDC24800BDC24900E0C24931F8100018 -:1045F00000BDFFDF002000BDB74840F27121006818 -:10460000808C48437047B448006890F83000002818 -:1046100018BF0120704710B5040016BF022C0020FF -:104620000120FFF7DDFE002808BF10BDAA48006882 -:104630000473012010BDA849096881F82A00704759 -:1046400010B5A54C2168087B002816BF0228002061 -:10465000012048730E31FFF7ADFE2168087B022868 -:1046600016BF03280122002281F82920082081F8A2 -:104670002700487B01F10E03012804BF5B7913F08A -:10468000C00F0AD001F10E03012804D1587900F0BF -:10469000C000402801D0002000E0012081F828005F -:1046A0002AB991F82100012818BF042806D1087DF5 -:1046B000153109F021F8216881F8270021684AF2B4 -:1046C000B8104860FDF70EFA2168886010BD30B55B -:1046D000814D0446407B296881F822002079052815 -:1046E0000ED2DFE800F0030507090B00002009E007 -:1046F000012007E0022005E0032003E0042001E0A0 -:10470000FFDF00202968012881F821000CBF00206C -:1047100020888884A07B81F83000A079002816BF0B -:104720000228002001200875D4F80700C1F8150000 -:10473000B4F80B00A1F8190091F8B1200120002A6B -:1047400018BF81F8B20091F89120002A18BF81F8B3 -:10475000B3008870002030BD70B55F4D0446002264 -:10476000286880F8B320224672300CF007F82868D9 -:10477000012180F8914080F8B31070BD10B5564CFF -:104780000022236883F8B22083F8B100024603F1C7 -:1047900092000BF0F3FF2168012081F8B20010BDF8 -:1047A0004D49096881F82F0070474B48006890F820 -:1047B000210070472DE9F041474C2068002808BFD0 -:1047C000FFDF00262068417831BB807820B3FFF7F7 -:1047D0001BF92068002580F82B5080F8E05028460F -:1047E000FFF70FF9FEF79DFEFEF75CFE4248FEF76D -:1047F0001AFF4248FFF7F1F800210846FFF777F962 -:104800002068002790F8220010F0010F07D0252023 -:10481000FEF711FF012711E00C20BDE8F08110F038 -:10482000020F04D02620FEF706FF022706E010F054 -:10483000040F03D02720FEF7FEFE0427FEF732FE0A -:10484000206880F82670FFF7D6F801210020FEF7D7 -:1048500067FF0F210520FEF7AAFE206890F82810B8 -:10486000002904BF90F82910002905D190F82100F3 -:10487000012818BF04286FD1FDF734F907462068D6 -:1048800039468068FDF716FD1D4990FBF1F801FBE4 -:10489000180041423846FCF734FE0146206881602A -:1048A00041684144416008F024FF014620684268A5 -:1048B000914251D8C0E90157012690F8270008F02D -:1048C00037FF07462068B04690F82900002818BF37 -:1048D000002F1BD0102115E0BC000020E40B0020AD -:1048E0000C0C0020680F0200780F0200C38913002F -:1048F000800F0200700F0200630F0200600F0200C1 -:1049000040420F00384609F08EFC70B1206890F8E4 -:104910002A1000291CBF90F8281000291CD0427BC7 -:1049200000F10E01012A0FD013E0206800F10E0102 -:1049300080F80D803846FFF792FD206890F8271028 -:104940000E3008F0D4FF07E0497901F0C00140299A -:1049500012D00E30FFF7B4FD2068417B0E30FEF719 -:104960001AFE2068FD4F90F8210005284FD2DFE89D -:1049700000F00A0F44490F0008F0EDFF21680E31E6 -:10498000FFF76DFDE8E70021384609F046FF3FE0FC -:104990000121384609F041FF206890F8270008F00F -:1049A000D0FE5FEA000803D0102109F03CFC68B19A -:1049B000206800F11501384609F061FF2068007D8C -:1049C000B0B1012818BFFFDF0DD021E02EB1206863 -:1049D00000F11B014046FFF742FD206800F11B017A -:1049E000384609F04CFF0121384609F063FF0FE01B -:1049F0000021384609F05EFF0AE00621384609F03A -:104A00000CFF05E00221384609F007FF00E0FFDF58 -:104A1000206800F10E01384609F023FF2068417B31 -:104A2000384609F03AFF206890F82110012918BF94 -:104A3000042916D090F8B21059B190F8B12080F83E -:104A4000712000F1920152300BF098FE206880F83E -:104A5000B250206800F1520190F87120384609F0F8 -:104A600052FF0421BE4809F0D8FE206800F10E0173 -:104A7000BB4809F0F6FE2068417BB94809F00DFFFC -:104A8000206890F8B31059B190F8912080F8512027 -:104A900000F1720132300BF071FE206880F8B350E3 -:104AA000206800F1320190F85120AD4809F04FFF25 -:104AB00008F091FEAB4808F00BFF216881F82E004A -:104AC000FEF7AAFF0020BDE8F081A74948607047C3 -:104AD00070B5A54C06002DD02068002590F8222046 -:104AE00090F8261022EA010010F0010F04D02520D2 -:104AF000FEF7A1FD012515E012F0020F02D011F022 -:104B0000020F06D012F0040F0CD011F0040F05D0E4 -:104B100008E02620FEF78FFD022503E02720FEF7A0 -:104B20008AFD0425FEF7BEFC206890F82610294374 -:104B300080F82610206890F82B1041B190F82100E1 -:104B4000012808BFFFDFBDE8704000F084BA1EB145 -:104B500002210020FEF7E4FD206890F82C007F4839 -:104B6000FEF75DFF206890F82100052809D2DFE8F4 -:104B700000F003030309030001210846FFF7E3F8EF -:104B800000E0FFDF206890F8221090F8262031EA3C -:104B900002024FF0010101D0417070BD90F8212058 -:104BA000012A12BF80F82B10002280F82620F3E79C -:104BB00010B5FEF729FF6C480068417831B980785C -:104BC00020B10020FFF784FF002010BDFFF736F86A -:104BD000FEF7FCFFFEF7A2FEFEF705FFFEF71CFF47 -:104BE0000C2010BD60490120096881F8E000704781 -:104BF0005D49096881F82D00704770B5002503F004 -:104C00007CFB70B14FF49670FEF72DFD564C20687A -:104C10004178012909D0022901D0032930D0FFDFD2 -:104C200070BDBDE8704000F016BA90F8211003295D -:104C300026D090F82E0018B1FEF785FAFFF734F869 -:104C40004848FEF7ECFE216891F82100012818BFC2 -:104C500004280AD091F83000012814BF0328102539 -:104C600045F00E010020FFF76EF8206890F82F0045 -:104C7000012808BFFFF744F802202168487070BD82 -:104C8000BDE87040012023E710B5374C206890F84C -:104C90002F10012909D13130FFF73DF818B92168EB -:104CA0007F2081F83100FFF721F8206890F82E006E -:104CB00018B1FFF70AF8FEF75AFA03F01EFBC0B16D -:104CC00020684078022818BFFFDF206890F8210094 -:104CD000012804BF4FF41970FEF7C5FC0120FFF74F -:104CE000F7FE2068417800291EBF40780128FFDFC9 -:104CF00010BDBDE8104000F0AEB92DE9F05F0546EB -:104D00000027FEF788FC184C80462068407802286F -:104D100018BFFFDF20684FF07F0A90F82F1001299D -:104D200037D0104809F099FDFF268146002D72D03A -:104D30000C4809F004FF00286DD0FEF734FC002871 -:104D400069D02068074D90F82E00B0B108F028FD1A -:104D50000646FF2811D00146E81C07E0E40B0020BE -:104D60000C0C0020340C0020BC00002008F009FDD1 -:104D7000304608F020FD40EA08084846DFF87893FE -:104D80004FF0010B062846D2DFE800F08F8F8F0E20 -:104D90008F623130FEF7BFFF002804BF206880F823 -:104DA00031A0FEF7A3FFBCE7206890F8211001298D -:104DB00018BF042979D0B8F1000F05D190F8301050 -:104DC000002918BF022970D190F82F10012904BFC3 -:104DD00090F8D610002906D0C848FEF720FE2168BA -:104DE0000320487062E080F8D6B0FF2180F8D71029 -:104DF000FF2E11D000F1D902511E304608F0AAFC56 -:104E0000002808BFFFDF206890F8D81041F00201A9 -:104E100080F8D8100DE048E02978C1F3801180F8BF -:104E2000D810D9F85310C0F8D910B9F85710A0F815 -:104E3000DD10206800F1DF0590F831007F2808BF01 -:104E4000FFDF206890F83110297080F831A0C3E7A7 -:104E50002878C0F380112068027D914206D100F1CC -:104E600015010622E81C0BF05DFC30B1206890F8BB -:104E70002700B04203D1FF2E01D0012200E0002222 -:104E8000206890F82110012918BF042900D14AB9DF -:104E900059B9B8F1000F05D190F83010002918BFAA -:104EA000012902D190F82D00D8B10127206890F88F -:104EB0002E0018B1FEF709FFFEF759F9002F1CBFAD -:104EC0000120FFF705FE2068417800291ABF4178CC -:104ED0000129BDE8F09F4078032818BFFFDFBDE837 -:104EE000F09F6068D9F85F10C0F80D10B9F8631032 -:104EF000A0F8111099F86510C174A97D0175B5F875 -:104F00001710C182B5F819104180B5F81B108180C7 -:104F1000B5F81D10C1807A4908300BF0D2FD95F824 -:104F2000240000F01F016068017695F824104909FB -:104F300080F86C11206890F8B400002818BFFFDFDB -:104F40004FF00008206880F8B68061680A88A0F8F1 -:104F5000B8204A88A0F8CE208A88A0F8D020CA8835 -:104F6000A0F8D22091F86C1180F8D41090F8291094 -:104F700049B1427B00F10E01012A04D1497901F0C7 -:104F8000C001402933D090F82A1041B1427B00F192 -:104F90000E01012A04BF497911F0C00F27D0C23099 -:104FA0000BF086FD2878FF2EC0F3801160684176F3 -:104FB000D9F85320C0F81A20B9F85710C1832168D6 -:104FC0001DD0C1F8C820C08BA1F8CC0001F1BC02F3 -:104FD0003046BB3108F0BEFB002808BFFFDF206869 -:104FE00090F8BB1041F0020180F8BB1015E0D0F83A -:104FF0000E10C0F8C210418AA0F8C610D2E7C1F85E -:10500000C880A1F8CC80427E81F8BB20D0F81A205D -:10501000C1F8BC20C08BA1F8C000206880F8B4B0F3 -:1050200060680088FAF751FEFAF778FB206880F88C -:105030000180FEF703FEFEF7C9FDFEF76FFCFEF7E9 -:10504000D2FCFEF7E9FC012003F09DFA2EE70023D5 -:105050001A4603F0A6BB70B5FEF7F0FDFEF7B6FDED -:10506000FEF75CFCFEF7BFFC264C0025206890F89C -:105070002E0030B1FEF729FEFEF779F8206880F89F -:105080002E5020684570FEF7C7FC206890F821007C -:10509000012804D0BDE87040002003F074BA02205B -:1050A00003F071FA206890F8B400002818BFFFDF01 -:1050B000206890F8E010002908BF70BD017D80F8DD -:1050C000BB10D0F81510C0F8BC10B0F81910A0F83B -:1050D000C0103C2180F8B61061680A88A0F8B8209A -:1050E000012280F8B4200888FAF7EFFDFAF716FBE2 -:1050F000206880F8E05070BDE40B00200C0C00200C -:10510000530C0020BC0000202DE9F041F94E04466C -:10511000304600217278406801270D4612B1012AFD -:1051200025D006E090F85E20002A18BF777000D0E6 -:1051300001217278C2EB021200EB820292F8223057 -:1051400019431BD002F124012A22A01C0BF016FBEC -:10515000657004202070A77070787168C0EB001033 -:1051600001EB800080F822500120BDE8F08190F82A -:105170002220002A18BF7570DAD1DAE790F89A1069 -:10518000C9B1D0F89B10C4F80210D0F89F10C4F831 -:105190000610D0F8A310C4F80A10D0F8A710C4F86D -:1051A0000E1090F8AB10A174657012212170A770D9 -:1051B00080F89A5019E0017801291CBF0020BDE851 -:1051C000F081657013212170811C2022A01C0BF03E -:1051D000D5FAA5717068057080F8CC50D0F8B80089 -:1051E0000088FAF772FDFAF7A9FA0120BDE8F0810C -:1051F000C04840680178002914BF80884FF6FF70CE -:1052000070472DE9F041BB4C0746606890F82200DA -:10521000002818BFBDE8F081384609F01EFB0146A2 -:105220000126002007294AD2DFE801F004080E49D0 -:1052300049491300616881F82E000EE0616881F829 -:105240002E6081F82C0015E06168032081F82E00A3 -:1052500003E06168022081F82E00606800F12F01F0 -:10526000384609F060FB0546FF2888BFFFDF60680D -:1052700080F82C50606890F8D20018B1FDF797FFC5 -:10528000012821D0384609F011FB616881F825001A -:105290003846263109F0ECFA606800F12D052078D7 -:1052A0007F2808BFFFDF207828707F20207060688B -:1052B00080F82260BDE8F041032001F0E7BF61689B -:1052C00081F82C00BDE8F081FDF7B4FF616801F1C1 -:1052D0002602253108F03EFA002808BFFFDF60688B -:1052E00090F8251041F0020180F82510D4E710B5A0 -:1052F000002001F039FF7F4CA8B1FEF77CFB0021B4 -:105300000120FEF70DFA7C48FEF789FB6068D0F8B3 -:10531000D800FEF787FB606890F8BC00032818BF30 -:10532000022822D025E0FEF789FCFEF74FFCFEF7AD -:10533000F5FAFEF758FB606890F8D20038B1FEF736 -:10534000C4FCFDF714FF6168002081F8D20060689A -:10535000012180F8DC10022180F8D510FEF75CFBFB -:10536000BDE81040002001F091BF01210020FEF7B0 -:10537000EAFCFEF7C5FC606890F8D20018B1FDF7B2 -:10538000E2FEFEF791FC6168032081F8D50010BDB4 -:10539000584B5968B1F8DE2060B3FF2A0CD24FF6A3 -:1053A000FF7000EA4200A1F8DE00FF2888BFFF205E -:1053B00002D900BFA1F8DE009868012812BF0028BA -:1053C0000D209860C043C0EBC00202EB001091F8C2 -:1053D000DD20D24302EB820CCCEB821210449860A9 -:1053E000B1F8DE20800CB0FBF2F302FB130081F871 -:1053F000DD007047012ADFD95008A1F8DE0008BFA0 -:105400000120D9D1D6E770B53A4D6B6893F8D50035 -:1054100002281FBF93F8D50001280C2070BD002181 -:1054200018460C46C1EB011200EB820282F82240C2 -:10543000491CC9B20229F5D31C7093F8D20030B1CF -:10544000FEF743FCFDF793FE686880F8D240686879 -:1054500080F8CC4080F8CD4080F8D140012180F820 -:10546000B71080F8BC4080F8D44040F2011120F819 -:10547000B41F8170002070BD1E4810B54068002127 -:1054800080F8D510012180F8D510FFF7BCFF002867 -:1054900018BFFFDF10BD2DE9F041164C06460C2762 -:1054A000606890F8D51001291FBF90F8D500022838 -:1054B0000C20BDE8F081FEF7A7FAFEF732F8FDF701 -:1054C000F1FF6068012590F8B410002901BF90F841 -:1054D000B510002990F8B61000291CBF90F8CD1027 -:1054E00000297BD090F8BC00032807D002280AD0FE -:1054F0000DE00000C40000203C0D00200521FE4806 -:1055000000F0F2FE03E00321FB4800F0EDFE6068CE -:1055100090F8CE10002904BF90F8D000002842D0A7 -:10552000FCF7E0FA074660683946D0F8C800FCF797 -:10553000C1FEF24990FBF1F801FB180041423846E8 -:10554000FBF7DFFF0146EE48C0F8C810D0F8C410E2 -:105550004144C0F8C41008F0CCF801466068D0F8A7 -:10556000C42091421FD80021C0E9311790F8D00023 -:10557000002818BF08F0C7F9606890F8D11000291A -:105580001CBF90F8CE1000290DD090F8AD2000F18E -:10559000AE01012A04D1497901F0C00140290FD0A0 -:1055A000AE30FEF78DFF606890F8AD10AE30FDF7BD -:1055B000F2FF6068002790F8D510012917D107E0A5 -:1055C00008F0C9F96168AE31FEF749FFEBE705E085 -:1055D00080F8DC50022180F8D51008E090F8D51052 -:1055E000022902BF80F8D5500C20BDE8F081606828 -:1055F00090F8B710B1B190F8BC00032818BF08F0BC -:105600000BF9C04808F064F90146606880F8D210D0 -:10561000C0F8D860BC48FEF7E0F9FEF7FDF938465F -:10562000BDE8F08108F0D7F8EBE770B5FEF7ECF9CC -:10563000B64C606890F8D510022903D0FEF7ECF95B -:105640000C2070BD012180F8DD10A0F8DE100220D2 -:10565000FEF7D7F9AE48FDF7E6FF6068DFF8B4C2A1 -:10566000002100F1B40300BF90F8D420521CACFB21 -:1056700002546408A4EB84042244D2B280F8D420FB -:10568000D25C012A08D0491CC9B20329ECD300BF5F -:10569000FFF72DFE002070BD90F8D4009E49085CF5 -:1056A000FDF7C9FFFDF7FEFEF2E79849496881F86A -:1056B000BD000020704710B5040016BF022C00206A -:1056C0000120FEF78DFE002808BF10BD8F48002185 -:1056D000406880F8AC4080F8CD10012010BD8B49A7 -:1056E000496881F8D100704710B5884C616891F81D -:1056F000AC00002816BF02280020012081F8AD0070 -:10570000AE31FEF757FE6068012180F8CD1090F8A9 -:10571000AC10022916BF03290122002280F8D020F4 -:1057200090F8AD1000F1AE03012904BF5B7913F0CE -:10573000C00F0AD000F1AE03012904D1597901F05C -:10574000C001402901D0002100E0012180F8CE10E5 -:10575000002904BF002A10BDFCF7C4F96168C1F834 -:10576000C8004AF2B810C1F8C40010BD002816BF26 -:105770000228012200226549496881F8B72081F892 -:10578000BE00704770B5614D0C4600280CBF012368 -:105790000023696881F8B73081F8BF004FF0080036 -:1057A00081F8C0000CD1002C1ABF022C012000206F -:1057B000114607F0A1FF6968082881F8C00001D0F0 -:1057C000002070BD022C14BF032C1220F8D170BD34 -:1057D0004E4A0328526808BFC2F8B81082F8BC00CD -:1057E000002070474949496881F8CF000020704780 -:1057F0004648416891F8BC00032804D0012818BF2E -:10580000022807D004E091F8BF00012808BF7047C4 -:105810000020704791F8BE00012814BF0328012022 -:10582000F6D1704710B5FEF709FAFEF7CFF9FEF78B -:1058300075F8FEF7D8F8354C606890F8D20038B1AA -:10584000FEF743FAFDF793FC6168002081F8D2006F -:105850006068012180F8DC10022180F8D510FEF785 -:10586000DBF8002010BD2949496881F8D60070474F -:1058700010B5FEF7E3F9FEF7A9F9FEF74FF8FEF7CA -:10588000B2F8224C606890F8D20038B1FEF71DFAE9 -:10589000FDF76DFC6168002081F8D200606801218D -:1058A00080F8DC10022180F8D510FEF7B5F8BDE8CD -:1058B0001040002001F0EABC2DE9F84F134DFF2104 -:1058C00000246A687F2782F8D31060B10D4809F080 -:1058D000E9F880B90B4809F01DF920B1094808F032 -:1058E000BCFF04281FD0686890F8D510052928BF90 -:1058F000BDE8F88F12E016E0640D002040420F0072 -:105900005C0C00203C0D0020880F0200C400002029 -:105910008E0F0200ABAAAAAA8B0F0200DFE801F0EB -:10592000F7F7F7F6F500686890F8D500FC4E4FF0F1 -:105930000108052880F0CC82DFE800F0EBEBEB03F8 -:10594000EA00F74808F089FFA870686890F8B70087 -:1059500028B9FDF760FE002808BF002400D001240C -:10596000686890F8D20080B107F01AFF6968FF28D4 -:1059700081F8D3000ED00146F01C07F002FF6868E2 -:1059800090F8D30007F017FF0443686890F8D3003D -:10599000FF280CD1686890F8B71091B190F8BC005E -:1059A000032804D007F089FF696881F8D300A8783C -:1059B000072880F0CC81DFE800F044B40AFDFDFD4B -:1059C000280007F048FF696881F8D300EFE76868AE -:1059D00090F8D20018B1FEF778F9FDF7C8FBD1486E -:1059E000FEF799F9002808BF2F70FEF77FF9002C09 -:1059F00000F04981686890F8BC00012818BF0228AF -:105A000040F04181FDF78AFF6AE0686890F8D200B3 -:105A100018B1FEF75AF9FDF7AAFBC248FEF77BF969 -:105A2000002808BF2F70FEF761F9002C00F02B81D1 -:105A3000686890F8BC0002284BD0012850D000F0D4 -:105A400022B9686890F8D20018B1FEF73EF9FDF768 -:105A50008EFBB448FEF75FF9002808BF2F70FEF7F1 -:105A600045F9002C00F00F81696891F8BC0002280C -:105A70002FD0012834D003281CBFFFDFBDE8F88FEA -:105A8000F278D1F8B800837E9A421BD13279C37E76 -:105A90009A4217D17279037F9A4213D1B279437F28 -:105AA0009A420FD1F279837F9A420BD1327AC37F27 -:105AB0009A4207D13278437EC2F380129A4208BFDD -:105AC000012200D0002291F8BF30012B0ED00AB382 -:105AD000D5E09348FFF795FBBDE8F84F00F01CBBFD -:105AE0008F48FFF78EFBBDE8F84F00E4002A77D11E -:105AF00000F11A018A4808F0BBFE894808F0D6FE7A -:105B00006968D1F8B8104876B9E0F9E1E3E1E0E17D -:105B10002CE1DDE191F8D30091F8C01088427CD1EE -:105B2000ADE0686890F8D20018B1FEF7CEF8FDF746 -:105B30001EFB7C48FEF7EFF8002808BF2F70FEF729 -:105B4000D5F8686890F8D01000290CBF4FF0010B11 -:105B50004FF0000B4FF000093178CA0906F1090136 -:105B600007D0497901F0C001402908BF4FF0010A70 -:105B700001D04FF0000A90F8BC10032906D190F82C -:105B8000B710002918BF90F8C00001D190F8D300D9 -:105B900007F0CEFD009088B1102108F044FB0028EA -:105BA00018BF4FF0010BBAF1000F07D006F1090141 -:105BB000009800E0CBE0FEF721FC8146686890F891 -:105BC000BC1003290DD0FDF7A9FE3CB3FDF7EBFC9B -:105BD00050EA09005DD05248FFF713FB00F048B9C6 -:105BE0004DE0D0F8B800F178827E91421ED1317933 -:105BF000C27E91421AD17179027F914216D1B17958 -:105C0000427F914212D1F179827F91420ED1317A55 -:105C1000C27F91420AD1317801E034E039E0407E20 -:105C2000C1F38011814208BF012600D00026B9F1DE -:105C3000000F05D1BBF1000F04D0FDF7B4FC08B193 -:105C4000012300E00023686890F8BF10012901D00B -:105C500011B10AE03CB908E02EB990F8D32090F8D1 -:105C6000C0C0624501D1012200E0002213420AD0E7 -:105C7000012904BF002ED0F8B8003FF439AFBDE8C9 -:105C8000F84F00F0BBBAFDF749FEBDE8F84FFFF74B -:105C90002EBB686890F8BE10032918BF02297DD179 -:105CA000BAF1000F7AD0B9F1000F77D11C4C90F8FF -:105CB0009A10002972D190F8CF1000296ED080F888 -:105CC0009C8090F8D20018B1FDF771FA01282BD012 -:105CD000204608F0EBFD0146686880F89D1000F151 -:105CE0009E01204608F0C4FD204608F0ECFD014668 -:105CF000686880F8A41000F1A501204608F0C6FDF0 -:105D0000686800F1AB0428787F2808BFFFDF287897 -:105D100020702F70686880F89A800320A6E0000049 -:105D20003C0D0020C4000020FDF784FA696801F1F1 -:105D30009E029D3107F00EFD002808BFFFDF686856 -:105D400090F89D1041F0020180F89D10CCE7686842 -:105D500090F8D20018B1FDF7B8FFFDF708FAFE4839 -:105D6000FDF7D9FF00286ED12F70C1E0FB4808F085 -:105D700074FDA870FA48F178427A91421ED13179C7 -:105D8000827A91421AD17179C27A914216D1B1794F -:105D9000027B914212D1F179427B00E054E09142C2 -:105DA0000CD1317A827B914208D131780078C1F3ED -:105DB0008011B1EBD01F08BF012600D00026FDF7EF -:105DC000ADFDA87804286CD1E6B3E348FDF7A3FF46 -:105DD000002808BF2F70FDF789FF686890F8DC0085 -:105DE00000281CBF0020FFF7D3FA6968DB4C81F85C -:105DF000DC8091F85E0038BB042081F86A0091F8DD -:105E0000D20018B1FDF7D3F9012835D0204608F0AB -:105E10004DFD6A680146204682F8611002F1620178 -:105E200008F026FD686800F16B01204608F09FFD30 -:105E30000446FF2888BFFFDFE1B268681F2980F8A9 -:105E4000681002E02DE053E012E084BF1F2180F8CB -:105E5000681000F1690428787F2808BFFFDF2878E0 -:105E600020702F70686880F85E80042001F00EFAC0 -:105E7000BDE8F84FFFF73BBAFDF7DCF9696801F1BF -:105E80006202613107F066FC002808BFFFDF696825 -:105E900001F13C0091F8611041F0020180F82510F9 -:105EA000C0E7AD48FDF737FF002808BF2F70FDF7AA -:105EB0001DFF686890F8DC00002804BF0120FFF790 -:105EC00067FA686880F8DC40BDE8F84FFFF70FBA62 -:105ED000FFDFBDE8F88F90F8D20018B1FDF7F5FEAE -:105EE000FDF745F99C48FDF716FF00283FF43CAF4D -:105EF000FDF7FCFEFDF712FDBDE8F84FFFF7F7B91F -:105F00009548FDF708FF002808BF2F70FDF7EEFE4B -:105F1000686890F8DC00002804BF0120FFF738FA19 -:105F2000686880F8DC40FDF7F9FCBDE8F84FFFF742 -:105F3000DEB92DE9F041884C606890F8D50007285B -:105F40007DD2DFE800F09898989898040F00834875 -:105F5000FDF765FDFDF7D4FE6168042081F8D500EA -:105F6000BDE8F081FDF76AFEFDF730FEFDF7D6FCD7 -:105F7000FDF739FD60680125022180F8DC5080F8CA -:105F8000D510FDF749FD60680078002818BFFFDFD5 -:105F9000002660688670D0F8B8100A8882804A8827 -:105FA00042838A888283C988C1836E4981F82060D0 -:105FB00090F8D02001F58471A1F584774AB10A7870 -:105FC000C2F38013CA1C23B1527902F0C002402AE6 -:105FD00030D090F8D12042B111F8032BC2F38012D7 -:105FE0001AB1497911F0C00F24D00E300AF060FDCB -:105FF000606890F8D20018B1FDF7D9F8012823D0D5 -:106000006068D0F8B8104A7EC271D1F81A20826058 -:10601000C98B81814661068360680570D0F8B8003D -:106020000088F9F752FEF9F779FBBDE8F04102204C -:1060300001F02CB9D7F80B11C0F80E1000E01AE0EF -:10604000B7F80F114182D3E7FDF7F4F8616801F169 -:106050000802C91D07F07EFB002808BFFFDF60684B -:10606000C17941F00201C171D7F8E3104161B7F87D -:10607000E7100183D0E7FFDFBDE8F08170B5364C53 -:10608000606890F8D5000025052828BF70BDDFE8BE -:1060900000F03E3E3E1D03002F48FDF73CFE002869 -:1060A00004BF7F202070FDF721FE606890F8DC00BF -:1060B000002804BF0120FFF76BF9606880F8DC500E -:1060C000FDF72CFCBDE87040FFF711B9FDF7B6FDF8 -:1060D000FDF77CFDFDF722FCFDF785FC606890F87C -:1060E000D20030B1FDF7F1FDFDF741F8606880F8AE -:1060F000D2506068012180F8DC10022180F8D510B0 -:10610000FDF78AFCBDE87040002001F0BFB870BD0B -:1061100000231A4601F08CB970B5012001F024F873 -:106120000D4C20B30E49A1F1280008F0CFFB6068A8 -:106130000B4E90F8AD10304608F0AFFB606800F1F0 -:10614000AE01304608F08DFB606890F8D010002951 -:1061500044D090F8BC1007E0C40000203C0D0020A3 -:10616000640D00205C0C0020032922D028E0FDF7FC -:1061700065FDFDF72BFDFDF7D1FBFDF734FC6068F5 -:1061800090F8D20038B1FDF7A0FDFCF7F0FF616890 -:10619000002081F8D2006068012180F8DC10022123 -:1061A00080F8D510FDF738FCBDE87040002001F004 -:1061B0006DB890F8B710002918BF90F8C00001D151 -:1061C00090F8D30007F0C9FB050007D00121304645 -:1061D00008F063FB2946304608F043FB7248FDF7A0 -:1061E0001EFC01210846FDF7AEFD00210846FDF723 -:1061F0007EFC6168052081F8D50070BD2DE9F04175 -:10620000022000F0B1FF694C0126F0B1012001F03D -:106210003DF86549A1F1280008F058FB6068624F1D -:1062200090F8AD10384608F038FB606800F1AE0118 -:10623000384608F016FB606890F8D01000293AD074 -:1062400090F8BC10032921D027E0FDF7F7FCFDF7FB -:10625000BDFCFDF763FBFDF7C6FB606890F8D2005C -:1062600038B1FDF732FDFCF782FF6168002081F84C -:10627000D2006068022180F8DC6080F8D510FDF75C -:10628000CBFBBDE8F041002001F000B890F8B7105A -:10629000002918BF90F8C00001D190F8D30007F092 -:1062A0005CFB050007D00121384608F0F6FA2946C4 -:1062B000384608F0D6FA6068D0F8B800C18A3A4883 -:1062C00008F07FFB6068D0F8B800017D364808F020 -:1062D0007CFB3548FDF7A3FB606880F8CC600621A5 -:1062E00080F8D510BDE8F08170B50C46054608F081 -:1062F00091FA032C51D0052C18BF70BD05212846FA -:1063000008F08BFA294C6068D0F8B80000F10D0154 -:10631000284608F040FB6068D0F8B80000F1110191 -:10632000284608F03CFB6068D0F8B800017D28469C -:1063300008F04BFB6068D0F8B800C18A284608F026 -:1063400040FB6068D0F8B8004188284608F02DFB73 -:106350006068D0F8B8008188284608F02AFB606899 -:10636000D0F8B800C188284608F027FB6068D0F84C -:10637000B80000F10801284608F041FB6068D0F839 -:10638000B800017E284608F022FB606890F8D6101D -:106390002846BDE8704008F024BB2846BDE87040A0 -:1063A000032108F03ABA0000640D0020C400002068 -:1063B0002DE9FF4F06460C46488881B040F2E24185 -:1063C00048430090E08A002500FB01FB94F863003D -:1063D0009046082816BF07284FF0010A4FF0000A20 -:1063E000049818B10121204603F000FC94F85100F4 -:1063F000012808BF002708D0022808BF012704D0C1 -:1064000003281ABFFFDF0027032794F8D000DFF826 -:10641000189448B101285CD0022842D0032818BF44 -:10642000FFDF56D000F0B6B8B8F1000F08BFFFDFAD -:10643000FE4D6868002808BFFFDF3846FDF729FBDE -:1064400000F2E7314FF47A70B1FBF0F0696800EBCD -:1064500001083846FDF71DFB012F04BF49464FF4E4 -:1064600096620BD0002F04BFF1494FF4C86205D0EB -:10647000032F0CBFEF49F04940F69802114408443D -:106480004AF2531101444FF47A70B1FBF0F040F23C -:10649000E241081A2969584441440844051D012075 -:1064A00014E0E24FA8F101017868084308BFFFDF5C -:1064B000E248B8F1000F006800EB0B0505D07868E2 -:1064C00000F21E30A84288BFFFDF032084F8D0000E -:1064D0005FE094F86300009D21281CBF94F86400DD -:1064E000212846D1B4F85800B4F80611401A401CCF -:1064F00000B200283DDB94F80401002839D00128BF -:1065000008BF002007D0022808BF012003D00328BD -:106510001CBFFFDF0020012F04BF49464FF49662E5 -:106520000BD0002F04BFC2494FF4C86205D0032F1F -:106530000CBFC049C04940F698021144012804BF6D -:1065400048464FF496620BD0002804BFB8484FF479 -:10655000C86205D003280CBFB648B74840F6980279 -:106560001044081A00F2E7314FF47A7091FBF0F012 -:106570000544B8F1000F0CD0AC4F786818B9788892 -:10658000002818BFFFDF786800F21E30A84288BFDD -:10659000FFDF05B9FFDF2946D4F8D400FAF7B1FFD1 -:1065A000C4F8D400B0600020307001203071204663 -:1065B00003F005FCAAF10101084204BF012070713B -:1065C00006D094F8D00001280CBF0220032070717F -:1065D00094F8510094F85280D4F824B0012808BFF0 -:1065E000002708D0022808BF012704D003281ABFBB -:1065F000FFDF00270327B8F1010F08BF00200AD0F2 -:10660000B8F1020F08BF012005D0B8F1030F1ABF7F -:10661000FFDF00200320FDF751FA012F08BF4FF4E0 -:1066200096610ED0002F04BFDFF804924FF4C861CA -:1066300007D0032F0CBFDFF8FC91DFF8FC9140F688 -:106640009801494408444AF2AB3101444FF47A704E -:10665000B1FBF0F0584400F5C770F060049830EAE0 -:106660000A0004BF05B0BDE8F08F2946304607F0A8 -:10667000D0FE87B2204603F0A2FBB8420FD801211A -:106680000746717105FB07F1D4F8D400FAF739FF1A -:10669000B0602946304607F0BCFE384487B2394620 -:1066A000204603F0A3FAB068C4F8D40005B0BDE8F2 -:1066B000F08F2DE9F0430446614885B00D4690F80F -:1066C0000004DFF88091400999F8001449098842D4 -:1066D00018BFFFDFDFF85481002708F13C06082DC2 -:1066E00080F02381DFE805F0047F898984FDFDCBFC -:1066F000202C28BFFFDF36F814000621F9F7DAF95D -:10670000050008BFFFDF202C28BFFFDF36F814008C -:106710002988884218BFFFDF95F8D000002808BFFD -:10672000FFDF284603F03BF8C8F80470A8F80270B1 -:1067300029460020C8F8107007F0F6FE00F1980610 -:10674000686AB0423CD995F85100012808BF00247E -:1067500008D0022808BF012404D003281ABFFFDF95 -:106760000024032495F85200012808BF002007D018 -:10677000022808BF012003D003281CBFFFDF002030 -:10678000FDF79CF9012C04BF27494FF496620BD00A -:10679000002C04BF26494FF4C86205D0032C0CBF5F -:1067A0002449254940F69802114408444AF2AB3185 -:1067B00008444FF47A71B0FBF1F1686A0844871B12 -:1067C00029460020C8F8087007F0AEFE698840F23C -:1067D000E24251439830081AA0F21E30C8F80C006B -:1067E00005B0BDE8F08305B0BDE8F04303F0D9B8CB -:1067F00005B0BDE8F043FDF73ABB99F8140D124916 -:10680000400991F800144909884218BFFFDF202C85 -:1068100028BFFFDF36F814000621F9F74BF9050011 -:1068200008BFFFDF202C11E0FC6601008C0D00206A -:10683000445B01000C1101002C5F0100D40000201A -:1068400001E000E00BE000E019E000E028BFFFDF1E -:1068500036F814002988884218BFFFDF0022012380 -:1068600029466846FFF7A4FD95F8DA006946FBF76C -:106870002AFB002808BFFFDF05B0BDE8F083202C0D -:1068800028BFFFDF36F814000621F9F713F90500D9 -:1068900008BFFFDF202C28BFFFDF36F8140029884F -:1068A000884218BFFFDF95F8D000042818BFFFDF2B -:1068B00085F8D07095F8DA404FF6FF79202C28BF84 -:1068C000FFDF26F8149095F8DA00FBF7ECF80028C3 -:1068D00008BFFFDF202085F8DA00D5F8E0000028A7 -:1068E00000E022E004BFD5F8DC00C8F8140008D0AE -:1068F000D5E939121144826911448161D5E9370122 -:10690000C860D5F8DC0000281CBFD5F8E010016194 -:1069100004D1D5F8E000002818BF8761FD48007851 -:1069200005B0BDE8F043F3F76BBCFFDF05B0BDE891 -:10693000F0832DE9F047F84D0746E88B6C68401C62 -:10694000E88328784FF00008002808BFFFDF07D051 -:10695000DFF8C8A3042814D0052818BFFFDF40D0F3 -:1069600021462869FAF7CDFDB86087F8008001203C -:106970003871A86800F25910F860287804287CD192 -:1069800085E00029ECD02E69DAF8141039B3894675 -:10699000C9680029FBD1B9F1000F20D099F8000097 -:1069A000002808BFFFDFD9F81410D9F8040001440B -:1069B0003046FBF77FFC002807DA211A4A1E92FBBB -:1069C000F4F202FB0406214604E090FBF4F202FB21 -:1069D000140621468E4288BFFFDF3446C0E7444696 -:1069E000BEE70029BCD0D5F81890B9F1000F08BF58 -:1069F000FFDF0026D9F8E410DAF814403046721EA2 -:106A00005CB1A069884228BF824284BF0246264604 -:106A10002046E468002CF4D106B9064609F1D004FA -:106A2000C9F8E060002E04BFC4F80C80CAF8144016 -:106A300005D0F068F460E060002818BF0461D4F865 -:106A40001090C4F81880B9F1000F0ED0D9F81800D2 -:106A500048B1D4F814A0504538BFFFDFD9F818006A -:106A6000A0EB0A00A061C9F81880002E08BFC5F885 -:106A7000208009D03078002800E00DE008BFFFDF5B -:106A8000716970680844286240F6B83468E7E88B9A -:106A90000A2838BF032000D302207871E88B012830 -:106AA00006D93846696807F0B4FCE98B0844E883E6 -:106AB000B8682861BDE8F0872DE9F0418046984824 -:106AC00084B00E4690F80004964F410997F80004F0 -:106AD0004009814218BFFFDF01210025082E8E4C9E -:106AE00062D2DFE806F0041A35353061614D61731A -:106AF0002173607800281CBF04B0BDE8F08187488E -:106B0000456005612573A068CD38FEF7C4FC0028F8 -:106B100018BFFFDF04B0BDE8F081607850B1207B82 -:106B2000002808BFFEF77EFE657304B0BDE8F041A3 -:106B3000FAF7E3BEA173FEF778FD002818BFFFDF68 -:106B400004B0BDE8F08104B0BDE8F041FDF78FB9B5 -:106B500097F8140D7449400991F8001449098842C6 -:106B600018BFFFDF00216846FFF7E3FE6946404695 -:106B7000FBF7A9F9002808BFFFDF04B0BDE8F081EA -:106B80002078052818BFFFDF207F002808BFFFDF1F -:106B900025772570207DFAF786FF002808BFFFDFE4 -:106BA000257504B0BDE8F081FFDF04B0BDE8F081D9 -:106BB00070B5594C0026207804281FBF207805287E -:106BC0000C2070BD01206070607B002518B372B688 -:106BD000607B00281CBFA07B002805D0FEF722FEAA -:106BE0006573A573FAF789FE62B6207DFBF7E1FBBA -:106BF000207F28B125772078052818BFFFDF0C26D5 -:106C000065702570207DFAF74EFF002808BFFFDF72 -:106C10002575304670BD207DFBF7DEF9E5E72DE9EF -:106C2000F04F3D4883B00078002818BFFFF7C0FF41 -:106C30000120DFF8E88088F8000069460620F8F7B0 -:106C4000C4FE002818BFFFDF00274FF6FF7934E0AD -:106C5000029800281CBF90F8D01000292DD0008881 -:106C600048451CBFDFF8C4A04FF0200B3BD00621E5 -:106C7000F8F720FF040008BFFFDF94F8DA00FBF705 -:106C800098FB84F8D07094F8DA504FF6FF76202DF8 -:106C900028BFFFDF2AF8156094F8DA00FAF703FF3F -:106CA000002808BFFFDF84F8DAB069460620F8F74D -:106CB0008CFE002818BFFFDF10E06846F8F763FE7F -:106CC0000028C5D00FE0029800281CBF90F8D01013 -:106CD000002903D000884845C9D104E06846F8F788 -:106CE00052FE0028EFD088F80070C8F8147003B086 -:106CF0000020BDE8F08F10B50078064CD8B101280F -:106D00000CBF40F6C410FFDF15D0A06841F66A0141 -:106D100088420DE0D0000020A40D00208C0D002042 -:106D200001E000E00BE000E019E000E0C80D002009 -:106D300028BFFFDF10BDA060E7E710B5FE4C0023C1 -:106D40002070FE48037043700377037343738373AB -:106D5000202183610175183843703A3010214FF6B5 -:106D6000FF72428020F8042F491EFAD1180008BF94 -:106D7000A36005D0002B0EBFFFDF40F6C410A0605B -:106D8000A06841F66A01884228BFFFDFBDE81040D5 -:106D900045E72DE9F047E94C054684B020781746D1 -:106DA000884600281EBF0C2004B0BDE8F08795F887 -:106DB000510095F85260D5F82490012808BF4FF093 -:106DC000000A0BD0022808BF4FF0010A06D00328A2 -:106DD0001ABFFFDF4FF0000A4FF0030A012E08BF71 -:106DE000002008D0022E08BF012004D0032E1ABFB5 -:106DF000FFDF00200320FCF761FE0146BAF1010F1E -:106E000004BFCF484FF496620DD0BAF1000F04BF13 -:106E1000CC484FF4C86206D0BAF1030F0CBFCA4881 -:106E2000CA4840F69802104408444AF2AB3108447C -:106E30004FF47A76B0FBF6F0484400F21E30C5F805 -:106E4000E400A56195F8D000002818BFFFDF40F2EC -:106E5000712008FB00F060600020FCF72FFE00F2BC -:106E6000E730B0FBF6F040F2712107FB0100A060B3 -:106E70006168A1F2E921884298BF01460020A16023 -:106E8000B34908610521217060702077E083B14823 -:106E9000FAF7AEFD2075202808BFFFDFFAF722FEC3 -:106EA000206101216846FFF744FD207D6946FBF71C -:106EB0000AF8002808BFFFDF002004B0BDE8F08713 -:106EC0009E48007800281CBF0020704710B506209F -:106ED000F8F78CFD80F0010010BD30B5974C85B0FF -:106EE0002278002A1EBF0C2005B030BD0D4640F2AE -:106EF0007121484360600020FCF7E0FD4FF47A7197 -:106F000000F2E730B0FBF1F040F2712105FB010027 -:106F1000A0606168A1F2E921884298BF0146002083 -:106F2000A160607004212170E0838A48FAF760FD57 -:106F30002075202808BFFFDF8548406938B1014629 -:106F4000C0680028FBD111B1FAF7CCFD05E0FAF7D3 -:106F5000C9FD40F6B831FAF7D4FA2061012168463C -:106F6000FFF7E7FC207D6946FAF7ADFF002808BF70 -:106F7000FFDF002005B030BD70B5704CA169016025 -:106F8000FFF716FE002300BBA169D1F8E0205AB13B -:106F9000D1E939C5AC449569AC44C2F818C0D1E90F -:106FA000372CCCF80C2005E0DFF8A4C1D1F8DC20A8 -:106FB000CCF81420D1F8DC20D1F8E010002A18BF5A -:106FC000116102D1002918BF8B61A36170BD6049B6 -:106FD0004870704770B540F2E24300FB03F6144678 -:106FE000012908BF002508D0022908BF012504D0C7 -:106FF00003291ABFFFDF00250325012C08BF00204D -:1070000008D0022C08BF012004D0032C1ABFFFDFD8 -:1070100000200320FCF752FD012D04BF48494FF426 -:1070200096620BD0002D04BF46494FF4C86205D0CC -:10703000032D0CBF4449454940F6980211440844C9 -:107040004AF2AB3108444FF47A71B0FBF1F000F230 -:107050001E3086428CBF301A002070BD2DE9F041F1 -:10706000064690F84F0000240D4610F0040F04BFB0 -:1070700096F8500010F0040F3146204611D007F06A -:1070800053FA07463146204607F032FAB8423146F5 -:10709000204602D907F02CFA01E007F045FA044631 -:1070A00002E007F041FA044696F85100012808BFB3 -:1070B000002708D0022808BF012704D003281ABFE0 -:1070C000FFDF0027032796F85200012808BF0020A1 -:1070D00007D0022808BF012003D003281CBFFFDF10 -:1070E0000020FCF7EBFC012F04BF15494FF496621A -:1070F0000BD0002F04BF13494FF4C86205D0032FF3 -:107100000CBF1149114940F69802114408444AF253 -:10711000AB3108444FF47A71B0FBF1F0718840F262 -:1071200071225143C0EB4100A0F21E30A54234BF92 -:107130002146294681420FE0D0000020A40D002006 -:10714000FC660100445B01000C1101002C5F010092 -:107150008C0D0020B96A010003D2A5422CBF28463D -:1071600020467062BDE8F081C64910B54968002824 -:1071700001F1980408BF04F5BC7409D0012808BFC8 -:1071800004F5317404D0022814BFFFDF04F5B07495 -:10719000BD488068A0428CBF0120002010BD10B502 -:1071A000B84C607828B1D4E90201626807F059F957 -:1071B000A060D4E9010188429CBF2078002814BF58 -:1071C0000020012010BD042210B584B005295AD238 -:1071D000DFE801F00A2B0330540080F8D02004B01F -:1071E000BDE81040FAF789BB0446A648007800289D -:1071F00018BF84F8D02004D004B0BDE81040FAF7DE -:107200007CBB0122002321466846FFF7D1F894F8A1 -:10721000DA006946FAF757FE002808BFFFDFB4F826 -:107220005800401CA4F85800E6E7032180F8D0106D -:1072300004B010BD0446408840F2E24148439349FF -:107240000860D4F8F8000089E082D4F8F80080796A -:107250002075D4F8F80040896080D4F8F80080895F -:10726000A080D4F8F800C089E0802046A16AFFF72A -:10727000F5FE022084F8D00004B010BD816A04B08D -:10728000BDE81040EAE6FFDF04B010BD2DE9F04193 -:10729000DFF8FC8100257C4C98F8001084B00528AC -:1072A00080F0C180DFE800F003166DB9B900E58316 -:1072B0000846F2F7A5FF6078002873D100216846E0 -:1072C000FFF737FB207D6946FAF7FDFD002808BF70 -:1072D000FFDF67E00020FCF7F1FB6E49694E0844D0 -:1072E0004FF47A71B0FBF1F02169726840F2E24329 -:1072F0001144081AA16900F2DE604A88D03102FB0D -:1073000003F772698A4208BF002514D0216AFAF790 -:10731000D1FF002807DA391A4A1E92FBF7F202FB66 -:107320000705394604E090FBF7F202FB17053946E2 -:107330008D4288BFFFDFD8F80800854208D2A069D7 -:1073400040F271224188C1824A4305EB420505E0C3 -:1073500040F2E240B5FBF0F0A169C882A0690521C6 -:107360000175C08A6FF41C71484305EB400040F67C -:1073700035413061B0EB410F28BFFFDF04B0BDE8FD -:10738000F081E5830846F2F73BFF01202077A069F2 -:107390002169C0F8D41080F8D0502178052918BF91 -:1073A000FFDF06D0FAF7A9FA6573A57304B0BDE84C -:1073B000F081002808BFFFDFA06990F8D000002806 -:1073C00018BFFFDFA06990F8DA00202818BFFFDFA0 -:1073D0003148FAF70DFBA1690646202881F8DA004A -:1073E0000F8828BFFFDF2D4820F81670A06990F89D -:1073F000DA00202808BFFFDF002301226846A169C8 -:10740000FEF7D6FFA069694690F8DA00FAF75BFD4F -:10741000002808BFFFDFA561C4E704B00846BDE847 -:10742000F041F2F7EDBEFFDF04B0BDE8F081704738 -:1074300070B5144D0446002904BF686070BD4FF458 -:107440007A76012910D002291CBFFFDF70BD688841 -:10745000401C68801046FCF71CFB00F2E730B0FBD4 -:10746000F6F0201A686070BD1846FCF79BFE00F22B -:10747000E730B0FBF6F0201A686070BD0248007873 -:10748000704700008C0D0020A40D0020D4000020C7 -:10749000D0000020D7020200B3660100C80D002012 -:1074A000FE48406870472DE9F04114460E460746F5 -:1074B000012A08BF002512D0022C08BF012504D0E4 -:1074C000032C1ABFFFDF00250325032C08BF4EF64F -:1074D000341007D0022C14BFFFDF012000D00020A1 -:1074E000FCF7ECFA012D08BFED4907D0002D08BFCD -:1074F000EC4903D0032D0CBFEB49EC4908444AF298 -:10750000531108444FF47A71B0FBF1F000EB4700DF -:107510008519012C08BF002008D0022C08BF0120CB -:1075200004D0032C1ABFFFDF00200320FCF79FFAD2 -:1075300028446030BDE8F0812DE9F041064690F81E -:107540004F00012490460D4610F0040F04BF96F83A -:10755000500010F0040F3146204611D006F0E4FF31 -:1075600007463146204606F0C3FFB8423146204662 -:1075700002D906F0BDFF01E006F0D6FF044602E0A6 -:1075800006F0D2FF044696F852000027012827D0C3 -:10759000022829D003282CD0FFDF3846FCF78EFACA -:1075A000C04940F2712208444AF2531108444FF492 -:1075B0007A71B0FBF1F071885143C0EB4100A0EB50 -:1075C0000800A0F55870A54234BF214629468142E3 -:1075D00003D2A5422CBF284620467062BDE8F08148 -:1075E0003846FCF76BFADBE70120FCF767FAAC4999 -:1075F000D7E70320FCF762FAAB49D2E72DE9FF4F4A -:107600008FB0044690F85200DDF8709098460690CE -:1076100049EA08000C9094F86400002617460828F0 -:107620000CBF012000200890B8F1000F04BF94F8AF -:107630000C01032846D10898002843D0B4F88401EF -:10764000B8423FD1D4F81401C4F80001618840F277 -:10765000E2404843C4F80401B4F85A01B4F8E61013 -:107660000844C4F80801204604F0FDFAB4F8880183 -:10767000E08294F886012075B4F88A016080B4F83D -:107680008C01A080B4F88E018A49E080884809788E -:1076900094F86C31628830F8111030F81300084407 -:1076A0000104090C4FF0000004D083485143B1FBA2 -:1076B000F0F0401C82B22046A16AFFF73DFF022095 -:1076C00084F80C01D4F864010B90B4F8E6B0B4F877 -:1076D0005801D4F860A1D4F854110491B8F1000F06 -:1076E00003D094F8201149B180E004F1E001019148 -:1076F0007431099104F5A075091D07E004F59A712C -:107700000191091D099104F59275091D0A91B4F8BA -:107710005810381A791A09B200B20091002805DA17 -:10772000D4F85001049001200C90084694F80C11F4 -:1077300000295FD0012900F0748102297DD003293E -:1077400018BFFFDF00F09E8131460498F9F7D9FE9B -:10775000099908600A980121078000202870297182 -:1077600009980068A8605348D0E90520824287BF85 -:10777000019A1060019802600198626A00681044E2 -:1077800000F28110E8606971B4F8D000C01B00B24B -:107790000028C4BF032068710898002800F0088200 -:1077A000B9F1000F19D000BFB4F8F820002A0CBFBF -:1077B0000020B4F8FA00A4F8FA0094F8FC30401C59 -:1077C0005843904209D26879401E002805DD69714E -:1077D000B4F8FA00401CA4F8FA00B8F1000F00F069 -:1077E0000B8294F82001002800F0028213B00220DE -:1077F000BDE8F08FBAF1000F08BFFFDFE18A40F269 -:107800007120484340F2E24101EB40021098002110 -:10781000002806D000FB02F12748B1FBF0F000F190 -:107820000101C4F81011608840F2E24100FB01F24E -:1078300010994FF0000008D000E05CE01E4801FB0A -:1078400002F1B1FBF0F000F10100C4F814014FF0B7 -:107850000000FCF7A7FC00F2E1414FF47A70B1FBA5 -:10786000F0F000EB0A060020FCF79CFC83460020A9 -:10787000FCF724F91149584401444FF47A70B1FBE4 -:10788000F0F0E18A40F271225143C0EB4101D4F89B -:107890001001091A314401F2C24611E0080E00201D -:1078A000FC660100445B01001C3801002C5F0100F4 -:1078B000920F0200DC00002040420F0091FD010009 -:1078C000217D520011FB02F10122FFF7ECFD811C2A -:1078D000FE48416181610020FCF764FC00F2E14157 -:1078E0004FF47A70B1FBF0F05044301AB0F53C7FA1 -:1078F00038BFFFDF28E7E18A40F27122D4F80401A3 -:10790000514300EB410210990020002906D0F048B5 -:1079100001FB02F1B1FBF0F000F10100C4F810012D -:10792000618840F2E24301FB03FC109B4FF0000131 -:1079300006D0E74903FB0CF3B3FBF1F101F10101C0 -:10794000C4F81411BBF1000F47D1B9F1000F44D0B6 -:1079500094F85200012805D0022809D0032818BF46 -:10796000FFDF0BD00020FCF7A9F80146D9480AE058 -:107970000120FCF7A3F80146D74804E00320FCF7F8 -:107980009DF80146D548E38A01444AF25310014468 -:107990004FF47A70B1FBF0F0D4F8101140F271227C -:1079A0000144D4F804015A4300EB4200461A94F80B -:1079B0005200012808BF002007D0022808BF01207C -:1079C00003D003281CBFFFDF0020FCF750F80B9901 -:1079D000081A3044A0F1200600E0161AD4F8082155 -:1079E000D4F80011D4F8100140F2E24301FB020088 -:1079F00094F85220217D11FB03F1FFF754FD01465D -:107A0000B24840F2712341616288D4F814115A439C -:107A1000C1EB4201A1F211318161012084F80C0116 -:107A200092E6628840F27123D4F814115A43C1EBF4 -:107A3000420202FB00F60098D4F800C10BEB0002F2 -:107A4000D4F80801D4F81031121A0CFB0030521E81 -:107A500002FB010094F85220217D40F2E24311FB29 -:107A600003F1FFF720FD01469848B9F1000F41618D -:107A7000A6F2113181613FF467AEBAF1000F08BF81 -:107A8000FFDF61E6628840F27123D4F814115A4393 -:107A9000C1EB420101FB00F694F8630021281CBFF2 -:107AA00094F8640021280AD1B4F88401381A00B28D -:107AB000002804DB94F88701002818BF06900C9872 -:107AC00030B10B98BBF1000F1AD0002818BFFFDFB0 -:107AD0000098D4F81411584448430021069AFFF73F -:107AE000E2FC0146794840F2712341616288D4F892 -:107AF00014115A43C1EB4201A1F21131816123E615 -:107B0000002814BFBAF1000FFFDF0698012808BF54 -:107B10004FF0000A0BD0022808BF4FF0010A06D030 -:107B200003281ABFFFDF4FF0000A4FF0030A94F852 -:107B30005200032808BF4EF634110BD0012808BFAD -:107B4000002004D002281ABFFFDF00200120FBF72D -:107B5000B5FF0146BAF1010F08BF5F4809D0BAF17D -:107B6000000F08BF5B4804D0BAF1030F0CBF5B489D -:107B70005B4801444AF2531001444FF47A70B1FB60 -:107B8000F0F0361A94F85200012808BF002007D000 -:107B9000022808BF012003D003281CBFFFDF0020FC -:107BA000FBF765FF0B99081A3044A0F120068FE718 -:107BB000B9F1000F7FF4F8AD94F80C0100283FF400 -:107BC0000CAE618840F27122D4F814015143C0EB2D -:107BD0004101284606F01DFC0004000C3FF4FDADF9 -:107BE0001D99002918BF0880012013B0BDE8F08F4F -:107BF00094F85C01FAF7F0F994F85C012946FAF779 -:107C000062F900281CBF88F0010084F821010020DF -:107C100013B0BDE8F08F2DE9F04F324F044683B02A -:107C200038788B460025294E4FF0020A4FF00308A2 -:107C3000032804BF387BA0427DD178683061387852 -:107C4000032818BFFFDFBBF1080F75D2DFE80BF088 -:107C5000040F1C1C1784847D7D62FCF7ABFD00289B -:107C600018BFFFDF86F8028003B0BDE8F08FFCF795 -:107C70009FFF002818BFFFDF03B0BDE8F08F03B0FF -:107C8000BDE8F04FFCF7F3B887F814803D74F87A3C -:107C9000012458B14FF47A71B869F9F732FCB86130 -:107CA000002107F1100006F0B4FB29E0012168462D -:107CB000FAF7F9FD9DF8000042F210710002B0FBE6 -:107CC000F1F201FB1204FCF797FC0DE0DC00002050 -:107CD00040420F00445B0100FC6601001C380100BB -:107CE0002C5F0100080E002004442146B869F9F712 -:107CF00008FCB861214607F1100006F08AFB441C1D -:107D0000388C411C0A293CBF20443884786830B143 -:107D1000388C401C0A2828BF87F815A001D287F8A4 -:107D20001580787A00281CBF03B0BDE8F08F387B3F -:107D300007F1100101E013E00EE0FAF7C4F80028A3 -:107D400008BFFFDF03B0BDE8F08F387BF9F7ABFE6B -:107D50003D7003B0BDE8F08FFFDF03B0BDE8F08FEA -:107D6000202C28BFFFDFDFF8EC94072139F814003E -:107D7000F7F7A0FE070008BFFFDF202C28BFFFDFBA -:107D800039F814003988884218BFFFDF3C46376154 -:107D90000127BBF1080F80F05581DFE80BF004A745 -:107DA000B1B1AAFDFDFCC4F86051F580C4F864517E -:107DB00094F8210138B9F9F795FED4F82C11FAF7A7 -:107DC00079FA00281BDCB4F81E11B4F8580081427F -:107DD00006D1B4F8D410081AA4F8D600204605E05D -:107DE000081AA4F8D600B4F81E112046A4F85810BA -:107DF000D4F84811C4F82C11C0F850111DE0B4F8A3 -:107E00001C11B4F85800081AA4F8D600B4F81C11D4 -:107E10002046A4F85810D4F82C11C4F84811C4F81E -:107E20005011D4F83411C4F8E010D4F83811C4F863 -:107E30005411B4F83C11A4F8581103F054FDF9F7AB -:107E40002BFE814694F85200012841D0022843D0ED -:107E5000032846D0FFDF2846FBF730FEFE4940F2FC -:107E6000712208444AF2531108444FF47A71B0FB6E -:107E7000F1F1D4F81401014460885043C1EB400093 -:107E8000A0F13008B9F1B70F98BF4FF0B7092146FC -:107E9000012006F049FB4844A8EB0000A0F2153889 -:107EA000A1462146012006F03FFBD9F824109C3062 -:107EB000814288BF0D1AC6F80C80454528BF45464B -:107EC000B56084F8207186F802A003B0BDE8F08F99 -:107ED0002846FBF7F3FDC1E73846FBF7EFFDDF4926 -:107EE000BDE74046FBF7EAFDDD49B8E703F0B9FE20 -:107EF00001E0FBF7BCFF84F8207103B0BDE8F08F10 -:107F0000F9F7F0FDD4F8502101461046FAF7D2F9FE -:107F100048B1628840F27123D4F814115A43C1EB7E -:107F20004201B0FBF1F094F8641008290FD0B4F8C6 -:107F30005810B4F81E210B189A42AEBF501C401CBA -:107F40000844A4F81E0194F8220178B905E0B4F8B9 -:107F50001E01401CA4F81E0108E0B4F81E01B4F88C -:107F6000D410884204BF401CA4F81E01B4F85A0182 -:107F7000DFF8F0A2401CA4F85A01B4F87E00B4F86F -:107F80007C100DF1080B401AB4F85810401E08443C -:107F90001FFA80F819E047E054E0307800233AF8FF -:107FA0001000CDE9005B94F86C113AF81110084408 -:107FB00081B22046FFF722FB002804BF03B0BDE8D2 -:107FC000F08F012818BFFFDF26D0B4F81E21A8EBE0 -:107FD000020000B20028E0DA082084F8720084F879 -:107FE0007170204603F0B6F984F80C5194F85C5196 -:107FF0004FF6FF77202D00D3FFDF29F8157094F896 -:108000005C01F9F750FD202084F85C01307903B061 -:10801000BDE8F04FF2F7F4B8B4F81E01BDF808104F -:108020000844A4F81E01D0E794F80C01042818BFF6 -:10803000FFDF84F80C5194F85C514FF6FF77202D48 -:10804000DBD3D9E7FFDF03B0BDE8F08F10B5864C76 -:10805000207850B101206072FCF7CAFD2078032817 -:1080600005D0207A002808BF10BD0C2010BD207B51 -:10807000F9F7B2FF207BFAF79CF9207BF9F713FDA3 -:10808000002808BFFFDF0020207010BD2DE9F04F51 -:10809000754F83B0387801244FF0000840B17C72EE -:1080A0000120FCF7A5FD3878032818BF387A0DD0D9 -:1080B000DFF8B89189F8034069460720F7F785FC97 -:1080C000002818BFFFDF4FF6FF7440E0387BF9F758 -:1080D00083FF387BFAF76DF9387BF9F7E4FC002869 -:1080E00008BFFFDF87F80080E2E7029800281CBF86 -:1080F00090F80C1100292AD00088A0421CBFDFF89C -:1081000054A14FF0200B3AD00721F7F7D3FC04001D -:1081100008BFFFDF94F85C01FAF74BF984F80C8193 -:1081200094F85C514FF6FF76202D28BFFFDF2AF828 -:10813000156094F85C01F9F7B6FC84F85CB1694607 -:108140000720F7F742FC002818BFFFDF12E068465F -:10815000F7F719FC0028C8D011E0029800281CBFCE -:1081600090F80C11002905D00088A0F57F41FF3957 -:10817000CAD104E06846F7F706FC0028EDD089F87C -:10818000038087F80B8003B00020BDE8F08F70B546 -:108190000446374890F80004364D400995F800141D -:1081A0004909884218BFFFDF95F8140D400932498C -:1081B00091F800144909884218BFFFDF2B490020BD -:1081C00001220C7188700A704870C87026490870C6 -:1081D000BDE870405AE72549087070472DE9F8431B -:1081E000214C06462078002877D12448F9F700FC76 -:1081F0002073202871D003276660277000256572E0 -:108200002572AEB1012106F1FC00FAF7C1FB062090 -:10821000F7F7FAFB80460720F7F7F6FB96F8FC1015 -:108220004044B1FBF0F200FB1210401C86F8FC0049 -:10823000F9F732FC1249091838BF40F2F65000F540 -:108240009C7086B2FCF7B2F9E061FCF7D5F94FF00B -:10825000010817E0300E0020445B0100FC660100BD -:108260001C380100920F0200080E0020DC000020E4 -:1082700001E000E00BE000E019E000E0177C010005 -:108280000AFAFFFF40B384F80A8001216846FAF732 -:108290000AFB9DF8000042F210710002B0FBF1F2FF -:1082A00001FB12000644F9F71DFC3146F9F729F9E4 -:1082B000A061277567752574207B04F11001F9F71B -:1082C00002FE002808BFFFDF25840020FCF790FC99 -:1082D0000020BDE8F88300E002E00C20BDE8F88350 -:1082E000F9F700FC3146F9F70CF9A061A57284F8A2 -:1082F0000B80DEE7FC4948707047FC4810B5417AB6 -:108300000124002918BF002408D1C17A31B1406A84 -:10831000F749884284BF0024FCF764FC204610BD66 -:1083200070B5F14C0546E088401CE080D4E90201BC -:108330006278D5F86061002A1CBF324606F091F8D9 -:10834000A060864208D895F80C01012804D0E07896 -:10835000002804BF012070BD002070BD70B5054627 -:10836000012908BF002408D0022908BF012404D035 -:1083700003291ABFFFDF0024032440F2E2404543F3 -:108380002046FBF79BFB012C08BFDA4907D0002CE5 -:1083900008BFD94903D0032C0CBFD849D849084499 -:1083A0004AF2531108444FF47A71B0FBF1F000F532 -:1083B0004C7085428CBF281A002070BD2DE9F04317 -:1083C00083B00026044680F8206190F8DE00002883 -:1083D00007BF94F80C01032803B0BDE8F083F9F758 -:1083E00081FBD4F8502101461046F9F763FF0028BD -:1083F000DCBF03B0BDE8F083628840F27123D4F89B -:1084000014115A43C1EB4201B0FBF1F0411CB4F826 -:1084100058000144A4F81C11B4F8D410B4F81C217D -:10842000891A09B20029DCBF03B0BDE8F08301213D -:1084300084F82211B4F87E10B4F87C20B14F891A68 -:10844000491E084485B2DFF8A0820DF108091EE03C -:1084500098F8000037F81000CDE90069B4F81C2145 -:1084600094F86C11012337F81110084481B22046AA -:10847000FFF7C4F8002804BF03B0BDE8F08301286B -:108480000FD0022812BFFFDF03B0BDE8F083B4F8BD -:108490001C01281A00B20028BCBF03B0BDE8F0835D -:1084A000D6E7B4F81C01BDF808100844A4F81C0174 -:1084B000EDE770B58C4E934B0025327882B04FF0CB -:1084C000040C06295CD2DFE801F0073B03181840D2 -:1084D000044680F80CC106E00446F078002818BF76 -:1084E00084F80CC10BD0F9F708FAA4F85A51B4F883 -:1084F0005800A4F81E0184F8225102B070BD33F870 -:10850000120094F80C210121032A13BF94F80C21C6 -:10851000C4F80851C4F80051012AE4D1CDE900158E -:1085200094F86C11B4F8D42033F8111000230844E7 -:1085300081B22046FFF762F8002818BFFFDFD2E7BC -:10854000032180F80C1102B070BD33F8121090F8BE -:108550006C21B0F802C033F8122011440A04120C46 -:108560004FF0000105D002FB0CF1674AB1FBF2F1BC -:10857000491C8AB2816A02B0BDE87040FEF7DCBFD8 -:10858000FFDF02B070BD2DE9F043584C0327564E73 -:10859000E27AA17A83B042F21079002558B101281D -:1085A00036D002281EBFFFDF03B0BDE8F0834FF0D6 -:1085B00000081AB9ACE04FF000080AB1E5721FE0FC -:1085C00051B101216846FAF792F99DF800000002C6 -:1085D000B0FBF9F109FB1108FCF70EF800EB0801FC -:1085E000A069F8F78EFFA06125746775607A30B9CD -:1085F000207B04F11001F9F766FC002873D0258474 -:10860000F9F77BF9307903B0BDE8F043F1F7F8BD35 -:10861000E572D4F818802570012727720021606860 -:1086200005F01CFB606880F8825180F88351C0F827 -:108630005081217B80F85C11616AC0F85481C0F8D8 -:10864000601190F85C81B0F80090B8F1200F28BF5D -:10865000FFDF2E4820F81890646884F80C51A4F8C5 -:108660005851DFF8A080307894F86C11628838F89F -:10867000100038F8111008440104090C4FF00000F4 -:1086800005D001FB02F02049B0FBF1F0401C82B2A2 -:108690002046A16AFEF750FF00950195307894F8C6 -:1086A0006C11002338F8100038F811101A460844ED -:1086B00081B22046FEF7A2FF002818BFFFDFC4F8F2 -:1086C0000851C4F8005184F80C71A4F81E51A4F8A4 -:1086D0001C5184F82251B4F85800401EA4F85800E8 -:1086E000A4F85A518CE735E0DC000020080E002089 -:1086F000CF821300FC660100445B01001C380100BE -:108700002C5F0100920F020040420F00300E00204B -:1087100051B101216846FAF7EAF89DF8000000021D -:10872000B0FBF9F109FB1108FBF766FF00EB08014C -:10873000A069F8F7E6FEA06125746775607A0028E5 -:108740007FF45DAF207B04F11001F9F7BCFB00283A -:108750007FF455AFFFDF52E770B5314CA1780229A5 -:1087600006BFE188002970BD2569C5F8640195F848 -:108770005200012808BF002007D0022808BF0120AE -:1087800003D003281CBFFFDF0020FBF770F9D5F8EA -:108790006411081AA1680144A160E1680844E0601E -:1087A00070BD70B505461E4890F802C0BCF1020FBE -:1087B00006BF006900F5B0741A4C002904BF25609B -:1087C00070BD4FF47A7601290DD002291CBFFFDF5E -:1087D00070BD1046FBF75DF900F2E140B0FBF6F02A -:1087E000281A206070BD1846FBF7DCFC00F2E1405F -:1087F000B0FBF6F0281A206070BD0B480078002806 -:108800001CBF0020704710B50720F7F7EFF880F085 -:10881000010010BD04480078002818BF01207047EF -:10882000DC0000202C0E0020080E002010B584B0C3 -:1088300004466846FBF74EFD002808BFFFDF00989E -:1088400006F0ADF90321009806F0C0F90098017810 -:1088500021F010010170214606F035FA192C80F044 -:108860002F81DFE804F03A2A0D65FEFEFD1C9FFE15 -:10887000FDFD88FEFEFEFEFCFDFDADCBE9FEFB002E -:10888000F748806890F8F110009806F0A1FAFBF71D -:1088900034FD00281CBF04B010BD00F0FDB8F04846 -:1088A000806890F8C910009806F0E2FAFBF725FD01 -:1088B000002840F0298100F026B9E9488068D0F806 -:1088C000FC00411C009806F074FAFBF716FD002826 -:1088D0001CBF04B010BD00F0DFB8E14CA068D0F8B8 -:1088E000F8008179009806F038FAA068D0F8F8000E -:1088F0000189009806F02AFAA068D0F8F8004189AA -:10890000009806F00EFAA068D0F8F8008189009867 -:1089100006F00EFAA068D0F8F800C189009806F0B9 -:108920000EFAFBF7EAFC00281CBF04B010BDB3E050 -:10893000CB4CA068D0F8F800011D009806F04CFA66 -:10894000A068D0F8F80000F10C01009806F04EFA8B -:10895000A068D0F8F80000F11E01009806F04CFA6B -:10896000A06800F1C001009806F054FAFBF7C5FCBE -:10897000002877D1C5E0BA4C60690178009806F00C -:1089800061FA60698188009806F05EFA6069418842 -:10899000009806F05DFAFBF7B0FC00281CBF04B09D -:1089A00010BD79E0AF49D1E90001CDE9020102A98A -:1089B000009806F061FAFBF7A0FC002852D1A0E075 -:1089C000A74CA068B0F84410009806F05FFAA068C1 -:1089D000B0F84610009806F05DFAA068B0F84010B4 -:1089E000009806F05BFAA068B0F84210009806F014 -:1089F00059FAFBF782FC002879D182E0984CA068F4 -:108A0000B0F84010009806F049FAA068B0F842109B -:108A1000009806F047FAA068B0F84410009806F0F5 -:108A200035FAA068B0F84610009806F033FAFBF764 -:108A300064FC002868D166E0894CA06890F81511A4 -:108A4000009806F056FAA06890F81611009806F003 -:108A500054FAFBF752FC002849D152E003E01EE033 -:108A60002FE02DE043E07E4CA06890F8040105F073 -:108A700065FE0146009806F044FAA06890F80501EA -:108A800005F05CFE0146009806F03FFAFBF735FC66 -:108A900000281CBF04B010BDFFDF04B010BD704C37 -:108AA000A06890F8ED10009806F053FAA06890F8CE -:108AB000EC10009806F051FAFBF71FFC20BB22E0F7 -:108AC000FFDFFBF71AFC002808BFFFDF0C2C19BFE3 -:108AD000132C182C04B010BD112C1CBF072C152C06 -:108AE00012D0012C19BF002C022C04B010BD0021A3 -:108AF0005B488068A0F88210012180F8861004B0DD -:108B000010BDFFDFF3E7FFDF554900208968A1F8BA -:108B1000880004B010BDF0B45148806890F84E3021 -:108B2000478EC68E458FB0F84010C28FB0F842C055 -:108B3000022B1FD08D4238BF29460186624528BFCF -:108B400062468286018FB0F84430994238BF0B46A6 -:108B50004386818FB0F84640A14238BF0C46C48698 -:108B6000BB4228BF1F464786B44228BF2646C6865A -:108B7000F0BC7047038E9D4228BF1D46838E9A42EB -:108B800028BF1A46A94298BF0D460586944598BF4E -:108B900062468286002180F84E10D3E770B5304CD3 -:108BA00082B0207910F0010F04BF02B070BD2069BF -:108BB00000230521C578A06890F86320583005F09F -:108BC000D1FB002818BF022D0CD00B2D18BF042D8F -:108BD00008D0052D1CBF062D0D2D03D0607840F068 -:108BE00008006070607800281CBF02B070BD20696A -:108BF000C078801E162880F0F683DFE810F016009B -:108C0000F403B700D5002E013500F403F001F4039E -:108C1000AD007801F000F403F403F403F4035F0201 -:108C200046027A02E4023703B003A0680023012160 -:108C300090F86520583005F095FB002840F0EE8351 -:108C4000206906F0C7F8A16881F8F200022081F8D7 -:108C50006500002081F88A0081F8860000F0DEBB04 -:108C6000F8000020AC0F0200A0680921002390F852 -:108C70006320583005F076FB20B1206906F0FAF841 -:108C8000122814D0A0680A21002390F863205830DD -:108C900005F068FB20B1206906F0ECF8142821D01B -:108CA000206906F0E7F8162840F0B88342E0A06893 -:108CB0000125002390F863200921583005F052FB6C -:108CC000002808BF657000F0A9836078002840F094 -:108CD000A583A16881F87A0081F8860081F8630095 -:108CE00000F09CBBA0680021012580F86310A0F86B -:108CF000821080F886100421FEF765FAA06890F8CB -:108D00004E10012900F0AE820288A0F82221028EC6 -:108D1000A0F82421828EA0F82621428E00F58C71C5 -:108D2000A0F82821C08E48820D72E078F1F768FA29 -:108D300000F074BBA06890F863101D2940F06E83AA -:108D4000002180F8981080F8631080F886101A20AF -:108D500001F06DF800F062BBA06890F863100C2978 -:108D600047D1002180F867100F2134E0A06890F807 -:108D7000631010293DD1D0F8F8100088498881424D -:108D800018BFFFDFA068D0F8F80000F126012069C5 -:108D900006F04DF8A06800F1C401206906F04FF814 -:108DA0001320A16800F086B9A26892F86300132826 -:108DB0001FD1D2F8F80002F1B00300F11E01002229 -:108DC0000E3005F064FAA0680021C0E928110121E5 -:108DD00080F86710152180F8631000F01FBBA068B1 -:108DE00090F86310132912BF102990F88C00002806 -:108DF00002D0022000F053BA206906F037F8A168CB -:108E0000002581F8C80081F88B5081F88650D1F890 -:108E1000F80009884088884218BFFFDFA068D0F8B2 -:108E2000F8100D70D0F840110A78002A18BFFFDF43 -:108E300040F026810288CA80D0F8402190F8C810FE -:108E40001171D0F840110D72D0F840210C21117031 -:108E5000D0F840210188518040E0A06890F863106C -:108E60001829C6D1002580F88B5080F88650D0F89C -:108E7000F81000884988814218BFFFDFA068D0F849 -:108E8000F8100D70D0F840110A78002A18BFFFDFE3 -:108E900040F0F68090F88C207AB180F88C500288EF -:108EA000CA80D0F840110D71D0F840210D21117009 -:108EB000D0F840210188518010E00288CA80D0F8A3 -:108EC00040110D71D0F8402101211172D0F84021DC -:108ED0000C211170D0F84021018851800088F6F7EC -:108EE000F4FEF6F71BFCE078F1F78AF9C8E0A06819 -:108EF0000023194690F86420583005F033FA50B931 -:108F0000A0680023082190F86320583005F02AFA61 -:108F1000002800F029826078002840F07F82A06855 -:108F200090F88E0010F0020F17D1206905F094FF21 -:108F3000A16881F88F00206905F090FFA168A1F871 -:108F40009000206905F08DFFA168A1F8920091F8CA -:108F50008E0040F0020081F88E00A06890F88E101C -:108F600011F0010F15D190F86420002319465830F4 -:108F700005F0F8F9002808BFFFDF0121A0680422EE -:108F800080F8641080F8F42080F88A100021A0F89E -:108F90008810A06890F86310012907D1002180F89B -:108FA000631080F88610E078F1F72AF9A168D1F80B -:108FB000F800098842888A4204BF0178042940F0F9 -:108FC0002D8200250570E078F1F71AF9A06890F875 -:108FD0006310002908BF80F8865000F01FBAA0680F -:108FE0000023072190F86320583005F0BBF90028D2 -:108FF00000F0BA816078002840F01082694620694C -:1090000005F072FFA0689DF80020002590F89410EC -:10901000114001F02F0180F8941090F895109DF800 -:109020000120114001F02F0180F8951080F8865042 -:10903000D0F8F81000884988814218BFFFDFA06887 -:10904000D0F8F8100D70D0F840110A78002A18BF37 -:10905000FFDF15D10288CA80D0F840110D71D0F819 -:109060004011009A8A60019ACA60D0F84021072115 -:1090700011700188D0F840014180E078F1F7C0F824 -:10908000A06880F8635000F0C9B9A06800230921E6 -:1090900090F86320583005F065F9002800F06481ED -:1090A0006078002840F0BA81A16881F87A0081F8E0 -:1090B000860000BF81F8630000F0B0B9A06800230B -:1090C000194690F86420583005F04CF9002800F05B -:1090D0004B816078002840F0A181A0680021A0F8B1 -:1090E0008810012180F88A100B2180F8641000F0AC -:1090F00095B9A0680023194690F86420583005F00F -:1091000031F900287DD0206905F0D8FE50B32069E0 -:1091100005F0D0FEA1680887206905F0C7FEA168A8 -:109120004887206905F0C8FEA1688887206905F096 -:10913000BFFEA168C88791F863001A2813BF91F891 -:109140004E00012081F84E00012807D091F8090156 -:10915000002804BF91F80801002813D01C2081F8D2 -:10916000640027E0A0680023194690F86420583076 -:1091700005F0F8F800286FD06078002800F03F81F3 -:1091800000F04CB91B2081F864000A88A1F82E2158 -:109190000A8FA1F830214A8FA1F832218A8F01F578 -:1091A0008C70A1F83421C98FC18301210175E07849 -:1091B000F1F726F8A0680021A0F88810012180F8B6 -:1091C0008A1000F02BB9A06800230A2190F86320D0 -:1091D000583005F0C7F8A0B1206905F06FFEB8B1AE -:1091E000206905F067FEA1680887206905F05EFE2A -:1091F000A1684887206905F05FFEA168888720691B -:1092000000E02AE005F054FEA168C887FFF783FC60 -:10921000A068002180F8861080F863100421FDF713 -:10922000D2FFA06890F84E1001291BD00288A0F848 -:109230002221028EA0F82421828EA0F82621428EBF -:1092400000F58C71A0F82821C08E48820120087298 -:10925000E078F0F7D5FFE1E04AE0607840F0010007 -:109260006070DBE0022180F84E10D7E0A068002398 -:10927000194690F86420583005F074F8C0B3A0681F -:1092800090F863201D2A0CD000230B21583005F0E4 -:1092900069F800281CBF607840F0200011D0607091 -:1092A000BCE0232180F8EC10162280F8ED20172175 -:1092B00080F86410012180F88A100021A0F888103D -:1092C000ACE0A06890F8630005F09DFA88B1A06852 -:1092D0002A22162180F8EC2080F8ED10172180F862 -:1092E0006410012180F88A100021A0F8881095E010 -:1092F0003AE0206905F0FFFD00F0070060F3070584 -:10930000206905F0FCFD00F0070060F30F25A06860 -:109310000122002680F88A20A0F888601E2280F8AA -:109320006420B0F84F20ADF80420B0F85100ADF83B -:1093300000002946019805F00AFA9DF80020C1B204 -:109340008A4219BFA26882F80411A16881F80461F9 -:109350009DF80110C0F3072081423CD13FE0A06896 -:1093600090F863001D2801D0012098E7206905F0DE -:10937000C2FD00F0070060F30705206905F0BFFD9E -:1093800000F0070060F30F25A0680121002680F897 -:109390008610A0F88260202180F86310B0F81511C3 -:1093A000ADF80410B0F85100ADF80000294601985E -:1093B00005F0CDF99DF80020C1B28A4219BFA2681C -:1093C00082F80411A16881F804619DF80110C0F3CE -:1093D0000720814203D0A16881F805011EE0A06842 -:1093E00080F805611AE0A0680023194690F864200F -:1093F000583004F0B7FF0028B6D0607870B9206903 -:1094000005F08DFCA16881F8C900052081F8640091 -:109410000020A1F88800012081F88A00A068D0E926 -:109420002A12491C42F10002C0E92A1202B070BDA2 -:109430002DE9F047FD4D04464FF0000768780843DA -:109440006870287910F0200F2846806818BFA0F8AF -:109450007C7004D1B0F87C10491CA0F87C1090F806 -:109460006810012639B990F863200023062158308E -:1094700004F078FF58B3A88810F4006F07D0A868EC -:1094800090F86810002918BFA0F874701FD1A86860 -:10949000B0F87410491C89B2A0F87410B0F87620A6 -:1094A0008A422CBF511A00218288521D8A4228BF4D -:1094B00080F87A60B0F87410B0F87620914206D344 -:1094C000A0F8747080F81E61E878F0F799FE2879AA -:1094D00010F0600F08D0A86890F8661021B980F8E5 -:1094E00066600121FDF76FFE4FF00808002C47D1A0 -:1094F0006878002842D1287910F0040F0DD0A868B0 -:1095000090F86300052808BFFFDFA86890F8651091 -:10951000022904BF2E7080F8657000F020FF2879C2 -:1095200010F0080F0AD0687840B9A86890F8651064 -:10953000032903D10221297080F86570FFF72EFB03 -:10954000A87810F0080F16D0A8680023052190F81D -:109550006320583004F006FF50B185F80180A868F8 -:10956000D0F8401108780C2808BF0020087002E0ED -:10957000002003F071FBA86800F07AFE00F08BFC7D -:10958000A868A14600F1580490F8F00030B9627B59 -:1095900000230121204604F0E5FE10B1208D401C7F -:1095A00020853D21B9F1000F18D12878022808BF85 -:1095B00016200ED0012804BFA86890F8F20008D049 -:1095C0006878E8B110F0140F1CBF1E20A07602D0FE -:1095D00005E0A07603E010F0080F02D0A1766676D1 -:1095E00041E010F0030F03D02A20A07666763AE01F -:1095F00010F0200F08BFFFDF2320A076667632E050 -:1096000094F82E0028B1608D411C6185A18D88429F -:1096100013D294F8320028B1208E411C2186A18DEE -:1096200088420AD2218DE08C814203D3AA6892F845 -:10963000F02012B9A28D914203D32220A076667643 -:1096400011E0A17B31B1A18C814228BF84F81A803E -:10965000C5D206E0A08C062803D33E20A07666760D -:1096600001E0607E58B1E7722773A7730221A868F2 -:10967000FDF7A9FDE878BDE8F047F0F7C1BDA8689F -:10968000BDE8F0470021FDF79EBD68494A788B7818 -:109690001A430ED101280AD0087910F0040F04D023 -:1096A000886890F86500022803D001207047FDF714 -:1096B00076BD0020704770B55C4C05460E46A0880C -:1096C0002843A08015F0020F04D015F0010F18BF39 -:1096D000FFDFE66015F0010F18BF266115F0020FDD -:1096E00012D0304605F01BFB062802D00B283BD0D9 -:1096F0000AE0A06890F86310152905D10021C0E99F -:109700002A11012180F8681015F0800F1CBF082075 -:10971000A07015F4806F08BF70BDA168B1F8580043 -:1097200089880844801D85B2304605F0F8FA012882 -:1097300022D0304605F0F3FA38B3304605F0EFFAA0 -:10974000182818BF70BDA06890F80411002902BF46 -:1097500090F8051100290025A0F806512946304649 -:10976000BDE8704005F0D5BBA06890F863100F29E4 -:1097700008BF0021C8D1C5E7A0682946A0F802515A -:109780003046BDE8704005F01CBBA0682946D0F803 -:10979000F80085803046BDE8704005F0E2BAF8B5C3 -:1097A000224D00260446A860AE806E70AE702E700A -:1097B0000088FAF78CFDA8680088FAF7AEFDB4F8C7 -:1097C000D800A968401C82B201F1580004F06FFC77 -:1097D000002818BFFFDF94F8640021280AD1B4F8EC -:1097E0005810B4F80601081A00B20028A4BF68781F -:1097F000002804D094F8630021283CD118E0A86820 -:1098000090F80411002908BF90F8511080F8511009 -:1098100090F80511002908BF90F8521080F85210F6 -:10982000002000F004FB84F8646024E0F8000020CD -:10983000B4F85810B4F80601081A00B20028A4BF02 -:109840006878002817D1A86890F80411002908BF8B -:1098500090F8511080F8511090F80511002908BFB8 -:1098600090F8521080F85210002000F0E0FA84F8CE -:10987000986084F86360A4F8D860A868374690F8C8 -:10988000861029B1B0F88210B0F8842091422AD213 -:1098900090F88A1029B1B0F88810B0F8842091426D -:1098A00021D2B0F88020B0F87E108A421BD290F806 -:1098B0006620B0F87C00002A47D0884213D2FD48C9 -:1098C0000090FD4BFD4A2146304603F041F8A86860 -:1098D0000023052190F86320583004F043FD002850 -:1098E00018BF02F0ABFDA86890F81211002908BF5C -:1098F000F8BD90F81411002906BF90F898100029BF -:10990000F8BD90F8632000230B21583004F02AFDA5 -:10991000002818BFF8BDA86800230B2190F8642028 -:10992000583004F01FFD002818BFF8BDA8680123B7 -:1099300090F8512090F81511012A09D0022A0AD076 -:10994000032A08BF042908D019E00628CBD2B6E7BD -:10995000012914D101E0022911D190F8522090F888 -:109960001611012A06D0022A07D0032A08BF0429AB -:1099700013D004E0012902D10FE002290DD080F8B4 -:109980009830A86890F8131100291CBFB0F8151181 -:10999000A0F84F1080F81271F8BD002000F047FACF -:1099A000EFE7C748806890F8861029B1B0F88210B8 -:1099B000B0F88420914219D290F88A1029B1B0F8F9 -:1099C0008810B0F88420914210D2B0F88020B0F80E -:1099D0007E108A420AD290F86620B0F87C001AB154 -:1099E000884203D203F0A7B80628FBD30020014623 -:1099F0001EE570B50C46064615464FF4A471204688 -:109A000006F055FF2680002D08BFFFDF2868C4F848 -:109A1000F8006868C4F8FC00A868C4F8400170BD8C -:109A2000F6F72AB92DE9F0410D4607460621F6F76B -:109A300041F8040008BFBDE8F081D4F840110026C9 -:109A4000087858B14A8821888A4207D1082810D05E -:109A50000D281FD00C2835D007284ED094F81E01B1 -:109A600000285CD06E700F20287084F81E616F8013 -:109A700025E06E7008202870D4F840014168C5F8D0 -:109A800002108168C5F8061080896881D4F8400109 -:109A9000067014E00846F6F718F90746F5F754FE85 -:109AA000B8B96E700D202870D4F840014068C5F830 -:109AB0000200D4F8400106703846F5F73FFE012059 -:109AC000BDE8F0810846F6F700F90746F5F73CFED9 -:109AD00010B10020BDE8F0816E700C202870D4F821 -:109AE00040014168C5F802100089E880D4F84001BF -:109AF00006703846F5F722FEE1E76E700720287001 -:109B0000D4F8400141688268C068C5F80210C5F801 -:109B10000620C5F80A00D4F840010670CFE794F893 -:109B20002001C8B16E701420287094F8200100281C -:109B3000C5D000BF84F82061D4F82201C5F8020026 -:109B4000D4F82601C5F80600B4F82A01688194F813 -:109B500020010028EED1B2E794F82C0180B16E709C -:109B60001A20287084F82C61D4F82E01C5F8020060 -:109B7000D4F83201C5F80600B4F8360168819EE7D2 -:109B800094F8180188B16E701820287094F81801A4 -:109B9000002894D084F81861D4F81A01C5F802009E -:109BA00094F818010028F5D189E794F838010028C5 -:109BB00008BFBDE8F0816E701520287094F8380158 -:109BC00000283FF47CAF00BF84F83861D4F83A0134 -:109BD000C5F80200B4F83E01E88094F83801002886 -:109BE000F2D16CE7364A5061D17070472DE9F047E9 -:109BF0000446481E85B238BFBDE8F0870127DFF86C -:109C0000C09004F108084FF0080A0026B4F8D80004 -:109C1000401CA4F8D800B4F87C00401CA4F87C00D8 -:109C200094F8680040B994F863200023062104F1F9 -:109C3000580004F097FBD8B1B4F87400401C80B20F -:109C4000A4F87400B4F8761081422CBF0A1A0022DE -:109C5000A3885B1D934228BF84F87A70884207D39B -:109C6000A4F8746084F81E7199F80300F0F7C8FA3C -:109C700094F8860020B1B4F88200401CA4F8820059 -:109C800094F88A0020B1B4F88800401CA4F8880039 -:109C900094F8F00040B994F865200023012104F104 -:109CA000580004F05FFB20B1B4F88000401CA4F819 -:109CB000800007E0319401008B960100B796010007 -:109CC000F800002094F8630007281FD1B4F858006A -:109CD000411CB4F80201814262D1D4F8FC00411C5D -:109CE000404606F0EEFE0221204604F0F2F884F829 -:109CF000636084F89770D4F8FC000078002808BFEF -:109D0000FFDFD4F8FC000178491E017094F863006D -:109D1000082845D1B4F85800411CD4F8F8008088D0 -:109D200081423DD1D4F840010178002918BFFFDFFE -:109D300022D12188C180D4F8F8004189D4F84001AB -:109D40000181D4F8F8008189D4F840014181D4F828 -:109D5000F800C189D4F840018181D4F8400106712E -:109D6000D4F8400180F800A0D4F840012188418057 -:109D700099F80300F0F744FA0121204604F0A9F80D -:109D800003212046FDF71FFAD4F8F8004188208807 -:109D9000814218BFFFDFD4F8F800067084F86360D2 -:109DA000B4F85800401C691EA4F858008DB2BFF4E6 -:109DB0002DAFBDE8F087FE4AC2E90601704770B5D5 -:109DC0000446B0F87C0094F86610002908BFC0F182 -:109DD000020503D0B4F87E10081A051F94F87A0023 -:109DE00040B194F863200023092104F1580004F0E5 -:109DF000B9FAA0B1B4F8746094F8680058B994F84E -:109E000063200023062104F1580004F0ABFA002877 -:109E100008BF284603D0B4F87600801B001F854297 -:109E2000C8BF0546002DD4BF0020A8B270BD10B534 -:109E3000DF4CA1680A88A1F83C2181F83A0191F829 -:109E40005100012808BF012108D0022808BF0221C3 -:109E500004D003281ABFFFDF00210321A06880F887 -:109E60003E1190F85200012808BF012108D00228B5 -:109E700008BF022104D003281ABFFFDF00210321FD -:109E8000A06880F83F11012180F83811E078BDE822 -:109E90001040F0F7B5B9F8B56846FAF71BFA002894 -:109EA00008BFF8BDC24C6078002818BFF8BDA06894 -:109EB0000023012190F86520583004F053FA00285F -:109EC00018BFF8BDA06890F8F010002918BF022054 -:109ED0004BD190F8632000231946583004F042FA21 -:109EE00038B1A06890F87A0018B11220FEF79EFCF5 -:109EF000F8BDA06890F863200E2A21D00F2A08BF71 -:109F00000B2032D0152A08BF06202ED00025202A8B -:109F10002ED000230421583004F024FA002818BF62 -:109F2000F8BDA0680227012690F8641017297CD09C -:109F300025DC012950D0052948D00B295AD022E030 -:109F4000F8F7D4FC0C2838BFF8BDA0680821D0F879 -:109F5000F8001E30F8F7CBFC28B1A0680421C0300F -:109F6000F8F7C5FC00B9FFDF0320FEF75FFCF8BD82 -:109F70001820FEF75BFCA068A0F88250F8BD1C29F1 -:109F800040D01E297ED0D0F8F8100A78002A7AD066 -:109F900049880288914276D190F8632000231946BF -:109FA000583004F0DFF900286DD0A068D0F8F81020 -:109FB0000978022908BF002066D0032979D0042936 -:109FC00071D0052908BF08207CD0A6E00720FEF745 -:109FD0002DFCA06800F049B90C20FEF727FCA06812 -:109FE000A0F8885090F88E1041F0010180F88E1092 -:109FF00000F03BB91320FEF719FCA068A0F88850C8 -:10A0000000F033B990F80911002918BFF8BD90F895 -:10A01000081199B1B0F80A11A0F84010B0F80C116D -:10A02000A0F84210B0F80E1100E03DE0A0F8441096 -:10A03000B0F81011A0F8461080F80851FEF76BFD3B -:10A040000421A068FDF7BFF8A06890F84E10012920 -:10A0500008BF80F84E7013D00288A0F82221028E2B -:10A06000A0F82421828EA0F82621428E00F58C7162 -:10A07000A0F82821C08E48820E72E078F0F7C0F870 -:10A08000152003E008E048E01CE012E0FEF7CEFBFC -:10A09000A068A0F88850E8E01820FEF7C7FBA06889 -:10A0A000A0F88850F8BD25E01120FEF7BFFBA0689E -:10A0B000DBE090F8671041B190F86800002808BF15 -:10A0C000FFDF0A20FEF7B2FB27E0F8F70FFC0C28B1 -:10A0D00023D3A0680821D0F8F8001E30F8F707FC59 -:10A0E00028B1A0680421C030F8F701FC00B9FFDFF7 -:10A0F0000320E7E790F88E0010F0030F0DD10C203D -:10A10000FEF794FBA068A0F8825080F8866090F873 -:10A110008E1041F0010180F88E106846FAF7DAF8E7 -:10A12000002808BFF8BDA0680023194690F86320F6 -:10A13000583004F017F9002808BFF8BDA06890F85F -:10A140000011B9B3A1690978A1BBB0F858100A2968 -:10A1500034D900F108010522E06906F0E3FA00288D -:10A16000A06804BF80F80051F8BDD0F8FC00017869 -:10A1700061B1411C0522E06906F0D4FA002818BF3D -:10A18000F8BDA068D0F8FC00007830B9A068E1699B -:10A19000D0F8FC00401C06F094FCA068D0F8FC004D -:10A1A0000178491C01700120FEF740FBA06802E025 -:10A1B000F800002002E080F80051F8BD90F8081186 -:10A1C00011B190F8091189B190F89810002908BFD1 -:10A1D000F8BD90F8642000230B21583004F0C2F839 -:10A1E000002808BF16203FF4C0AEF8BDB0F80A1131 -:10A1F000A0F84010B0F80C11A0F84210B0F80E1101 -:10A20000A0F84410B0F81011A0F8461080F80851DA -:10A2100090F864001B2818BF14207FF4A6AEFEF748 -:10A220007AFC0421A068FCF7CEFFA06890F84E10DD -:10A23000012908BF80F84E7013D00288A0F82221AF -:10A24000028EA0F82421828EA0F82621428E00F5ED -:10A250008C71A0F82821C08E48820E72E078EFF74A -:10A26000CFFF1520FEF7E2FAA06880F86450F8BD31 -:10A2700070B5044690F863000025072822D1B4F891 -:10A280005800B4F80211401C884218BF70BDD4F8C1 -:10A29000FC00411C04F1080006F013FC02212046DA -:10A2A00003F017FE84F86350012084F89700D4F877 -:10A2B000FC000078002808BFFFDFD4F8FC0001781C -:10A2C000491E017094F86300082818BF70BDB4F8E7 -:10A2D0005800D4F8F810401C8988884218BF70BD17 -:10A2E000D4F840010178002918BFFFDF22D121886E -:10A2F000C180D4F8F800D4F8401140890881D4F81E -:10A30000F800D4F8401180894881D4F8F800D4F8D6 -:10A310004011C0898881D4F840010571D4F84011FA -:10A3200008200870D4F8401120884880C148C078BF -:10A33000EFF766FF0121204603F0CBFD0321204605 -:10A34000FCF741FFD4F8F80021884088884218BF04 -:10A35000FFDFD4F8F800057084F8635070BD10B5C5 -:10A36000B44C207910F0020F08BF10BD60780028AF -:10A3700018BF10BDE068C078192880F05881DFE868 -:10A3800000F052420D82F8F8992232F86276A4F871 -:10A39000F8F8F8F7D42DE4F9F5F8F400A0680023F4 -:10A3A000012190F86520583003F0DCFF002818BF29 -:10A3B00010BD0321A06880F86510002180F8861088 -:10A3C00080F88A1010BDA0680023194690F8642018 -:10A3D000583003F0C7FF002808BF10BD0020A16857 -:10A3E00081F88A0010BDA0680023194690F8632008 -:10A3F000583003F0B7FF002808BFFFDF0920A1682D -:10A4000081F8630010BDA0680023194690F863200E -:10A41000583003F0A7FF002808BFFFDF0720A1681E -:10A4200081F8630010BDA0680023194690F86320EE -:10A43000583003F097FF002808BFFFDF0820A1680D -:10A4400081F8630010BDA0680023194690F86320CE -:10A45000583003F087FF002808BFFFDF0121A06804 -:10A4600080F88B105FF00C0180F8631010BDA068BD -:10A4700090F863000F2818BFFFDF0121A06880F863 -:10A480008C100E21F0E7A0680023194690F8632095 -:10A49000583003F067FF28B9A06890F88C000028B6 -:10A4A00008BFFFDF0121A06880F88B10102180F821 -:10A4B000631010BDA06890F86300152818BFFFDF77 -:10A4C0001820A16881F8630010BDA068D0F8F810CA -:10A4D00003884A889A4204BF0978042919D190F860 -:10A4E000632000231946583003F03CFF002808BFC2 -:10A4F000FFDFA06890F88E1011F0020F04BF012159 -:10A5000080F8631005D0002180F88610D0F8F8009C -:10A510000170A0680023194690F86420583003F0B9 -:10A5200021FF002808BF10BD58E7A0680023194686 -:10A5300090F86320583003F015FF002808BFFFDFB4 -:10A540000A20A16881F8630010BDA06800231946A5 -:10A5500090F86320583003F005FF002808BFFFDFA4 -:10A560001A20A16881F8630010BD25E00EE001E02B -:10A570004CE05CE0A0680023194690F86420583055 -:10A5800003F0F0FE002808BFFFDF27E7A06890F87F -:10A590009800012818BFFFDFA0680023194690F833 -:10A5A0006320583003F0DEFE002808BFFFDF1D20C7 -:10A5B000A16881F86300D7E7A06890F864101E29AD -:10A5C00012D090F86310202918BFFFDFCCD1B0F86B -:10A5D000061100291CBF212180F863100DD0A1684D -:10A5E000002081F88600BFE7B0F80611002918BFE7 -:10A5F000212180F864100021E2E6002180F8631038 -:10A6000080F898100846FFF712FCE8E7A06890F879 -:10A6100063001D2818BF072802D0082818BFFFDFD5 -:10A620000021A06880F8641080F88A109CE7FFDFA2 -:10A630009AE70000F80000202DE9F041FE4C0646A4 -:10A64000606904F06CFBE168002701F163020125F9 -:10A6500081F8C9004FF0050896420ED105FA00F0C6 -:10A6600010F0807F08BFFFDFE06880F86380A0F80B -:10A67000827080F88650BDE8F08101F16400864266 -:10A680001CBFFFDFBDE8F08181F86480A1F888700D -:10A6900081F88A50BDE8F081F0B4E748C06890F8CE -:10A6A0004E30478EC68E458FB0F84010C28FB0F83E -:10A6B00042C0022B1FD08D4238BF29460186624519 -:10A6C00028BF62468286018FB0F84430994238BF75 -:10A6D0000B464386818FB0F84640A14238BF0C46F6 -:10A6E000C486BB4228BF1F464786B44228BF2646C1 -:10A6F000C686F0BC7047038E9D4228BF1D46838EE0 -:10A700009A4228BF1A46A94298BF0D46058694452D -:10A7100098BF62468286002180F84E10D3E7F0B5DC -:10A72000C54C83B0207910F0010F04BF03B0F0BD19 -:10A73000606901230521C578E06890F864205830ED -:10A7400003F010FE002818BF022D0BD00A2D18BFF1 -:10A750000B2D07D0032D18BF062D03D0607840F0D5 -:10A7600008006070607800281CBF03B0F0BD60690D -:10A77000C078192880F0E483DFE800F04E280DC788 -:10A78000FBFBFAF9F8FBA3BCF7FBFBFBFBF6F5F4CC -:10A79000F3F2F1FBF000E0680123194690F8652020 -:10A7A000583003F0DFFD002840F0C083606904F0FA -:10A7B00011FBE16881F87001022081F8650000203A -:10A7C00081F88A0081F8860000F0B0BBE0680123C0 -:10A7D000002190F86420583003F0C4FD00287DD09B -:10A7E0006078002840F0A283606904F0EEFAE16826 -:10A7F000A1F88401B1F85820801A00B247F6FE7221 -:10A800008242A8BF002853DD01F5C371606904F0DE -:10A81000D3FA0620E16840E0E0680123002190F8C7 -:10A820006420583003F09EFD002857D0607800283F -:10A8300040F07C83606904F09BFA90B3606904F097 -:10A8400094FAE168A1F88401B1F85820801A00B2A6 -:10A8500047F6FE728242A8BF002829DD606904F035 -:10A860007EFAE16881F88601606904F073FAE168B4 -:10A87000A1F88801606904F058FAE168A1F88A013A -:10A88000606904F059FAE168A1F88C01606904F08C -:10A890005AFAE168A1F88E01082081F8640000F0FE -:10A8A00045BBFFE7E0686430FFF7C6FE00F03EBB43 -:10A8B000282081F87200012081F8710000F036BB79 -:10A8C0000CE0E0680123002190F86420583003F088 -:10A8D00049FD18B1607820B100F028BB012000F0DC -:10A8E00088B9E0680021A0F88810012180F88A105A -:10A8F0000D2106E0E06890F864100E2908BF0F21D2 -:10A9000059D180F8641000F011BBE06801230021E8 -:10A9100090F86420583003F025FD20B9E06890F8E5 -:10A920008C000028DAD06078002840F0FF82E068D0 -:10A9300000210125A0F8881080F88A5000F1E80174 -:10A94000606904F060FAE06800F1C001606904F039 -:10A9500065FAE06890F8B40100280BE0EAE1C5E18F -:10A9600074E106E1D5E0ECE059E22CE0A3E069E215 -:10A970001CE0E5E218BFFFDFE0680188A0F8B6112F -:10A9800000F5DC71606904F02CFAE06800F5E07114 -:10A99000606904F02EFAE06880F8B451112180F863 -:10A9A0006410E078EFF72CFC00F0C0BAE06890F893 -:10A9B0006410142902D0022000F01BB9002180F895 -:10A9C0008A1019219DE7E0680123002190F8642096 -:10A9D000583003F0C7FC50B9E0680123082190F813 -:10A9E0006320583003F0BEFC00283FF477AF607856 -:10A9F000002840F09B82E06890F88E0010F0020F73 -:10AA000017D1606904F028FAE16881F88F00606965 -:10AA100004F024FAE168A1F89000606904F021FADA -:10AA2000E168A1F8920091F88E0040F0020081F8F0 -:10AA30008E00E06802E000001801002090F88E10FF -:10AA400011F0010F15D190F8642001230021583036 -:10AA500003F088FC002808BFFFDF0121E068042222 -:10AA600080F8641080F8832180F88A100021A0F813 -:10AA70008810E06890F86310012907D1002180F860 -:10AA8000631080F88610E078EFF7BAFBE06890F882 -:10AA90008211042940F04A82002580F88251E07832 -:10AAA000EFF7AEFBE06890F86310002908BF80F86C -:10AAB000865000F03BBAE0680123002190F8642042 -:10AAC000583003F04FFC00283FF408AF60780028AE -:10AAD00040F02C826946606904F0D3F9E0689DF883 -:10AAE000002090F89410114001F02F0180F894108C -:10AAF00090F895109DF80120114001F02F0180F889 -:10AB000095100021A0F88810012180F88A100921F1 -:10AB1000F7E6E0680123092190F86320583003F03C -:10AB200021FC00283FF4DAAE6078002840F0FE8176 -:10AB3000E16881F87A0081F8860081F8630000F00E -:10AB4000F5B9E0680123002190F86420583003F043 -:10AB500009FC00283FF4C2AE6078002840F0E6818E -:10AB6000E0680021A0F88810012180F88A100B21EC -:10AB7000C7E6E0680123002190F86420583003F014 -:10AB8000F1FB00287ED0606904F098F9002804BF2A -:10AB9000E068643000F02281606904F08BF9E168BC -:10ABA0000887606904F082F9E1684887606904F009 -:10ABB00083F9E1688887606904F07AF9E168C887F9 -:10ABC000207910F0020F03D02069C078142813D028 -:10ABD00091F863001A280FD091F84E0001280ED08A -:10ABE00091F89101002804BF91F8900100280AD043 -:10ABF00005E0607000F09AB9012081F84E001C2039 -:10AC000081F8640018E01B2081F864000A88A1F82C -:10AC1000D4210A8FA1F8D6214A8FA1F8D8218A8F92 -:10AC200001F5D070A1F8DA21C98F8187012180F860 -:10AC30003210E078EFF7E4FAE0680021A0F888101D -:10AC40005FF0010180F88A1000F070B9E06801231C -:10AC50000A2190F86320583003F084FB90B16069BA -:10AC600004F02CF9B8B1606904F024F9E1680887B0 -:10AC7000606904F01BF9E1684887606904F01CF919 -:10AC8000E16800E02EE08887606904F011F9E1686E -:10AC9000C887FFF701FDE068002180F8861080F882 -:10ACA00063100521FDF705FCE06890F84E100129BE -:10ACB00000F029810288A0F8C821028EA0F8CA21DC -:10ACC000828EA0F8CC21428E00F5D071A0F8CE2162 -:10ACD000C08E0886012081F82600E078EFF790FA10 -:10ACE00000F024B9607840F0010082E7E0680123B9 -:10ACF000002190F86420583003F034FB00283FF422 -:10AD0000EDADE06890F8630021283FF4E7AD60788E -:10AD1000002865D1606904F0F2F800F00701E068EE -:10AD200080F86D110021A0F88810012180F88A10A8 -:10AD30001E21E6E5E06890F8641090F863201F2972 -:10AD400002D01D2A32D036E61D2A2FD01F290FBF70 -:10AD500000F16405FFDFE06800F16305606904F05D -:10AD6000DEF858B36169E06803F0A0FC064610F015 -:10AD7000FF0704BFC6F30720002832D0606904F043 -:10AD8000CCF8E168A1F88401B1F85820801A00B22B -:10AD900047F6FE728242A8BF00282FDD81F8867137 -:10ADA000300A81F88701212028702DE01E291CBF60 -:10ADB0001F2900F163053FF4FEADCFE7E06890F88E -:10ADC00063101D2909D1002180F89810302000F06F -:10ADD00077FFE168182081F8CA002846FFF72CFCAD -:10ADE000A4E000212970E06800F1630295420BD1D4 -:10ADF00080F89810002000F063FF05E0282081F81B -:10AE00007200012081F87100E06800F164018D4258 -:10AE10004FF0000118BF80F886104CD112E760692E -:10AE200004F099F8162846D1E06890F863101D29BF -:10AE30007CD1002180F8631080F8981080F886108B -:10AE4000232071E0E0680921012390F86320583045 -:10AE500003F088FA20B1606904F00CF8122813D0CE -:10AE6000E0680A21012390F86320583003F07AFA51 -:10AE700020B1606903F0FEFF14281DD0606903F063 -:10AE8000F9FF162852D142E0E06801252B4690F8E0 -:10AE900063200921583003F065FA002808BF657067 -:10AEA00044D0607838B9E068002180F87A1080F8E2 -:10AEB000861080F8631039E0E0680021012580F8F1 -:10AEC0006310A0F8821080F886100521FDF7F1FAD2 -:10AED000E06890F84E10012915D00288A0F8C8212A -:10AEE000028EA0F8CA21828EA0F8CC21428E00F5F5 -:10AEF000D071A0F8CE21C08E088681F82650E07867 -:10AF0000EFF77EF912E0022180F84E100EE0E068C3 -:10AF100090F863101D2909D1002180F8981080F85D -:10AF2000631080F886101A2000F0CAFEE068D0E9AD -:10AF30002A12491C42F10002C0E92A1203B0F0BDF6 -:10AF4000E0680123002190F86420583003F00AFAE9 -:10AF5000002801BF0120607003B0F0BD60780028B8 -:10AF60003FF4A0AC03B0F0BD30B585B004466846F0 -:10AF7000F9F7B0F9002808BFFFDF009803F00FFED3 -:10AF80000321009803F022FE0098017821F01001BF -:10AF90000170214603F097FEA01E162878D2DFE844 -:10AFA00000F00BAE23AFAF1BAE47AEAF3631AEAE47 -:10AFB000AEAEAFAF5D7892A0FE48C06890F8961034 -:10AFC00021B10621009803F003FF99E090F86F117A -:10AFD000009803F0FDFE93E0F648C06890F8C910B1 -:10AFE000009803F045FF8BE0F24DE86800F1F001B6 -:10AFF000009803F017FFE86800F1C401009803F01F -:10B000001BFF7DE00621009803F02EFF78E0E94D5C -:10B01000A8680178009803F015FFA8688188009857 -:10B0200003F012FFA8684188009803F011FF67E061 -:10B03000002002900390DF48C06890F8941001F05F -:10B04000F5018DF8081090F8950002A900F00900AC -:10B050008DF80900009803F042FF51E0D54DE868F3 -:10B06000B0F84410009803F011FFE868B0F84610FB -:10B07000009803F00FFFE868B0F84010009803F064 -:10B080000DFFE868B0F84210009803F00BFF37E0BE -:10B0900035E0C84DE868B0F84010009803F0FEFEB7 -:10B0A000E868B0F84210009803F0FCFEE868B0F8D9 -:10B0B0004410009803F0EAFEE868B0F846100098E3 -:10B0C00003F0E8FE1CE0BB4DE86890F89D11009885 -:10B0D00003F00FFFE86890F89E11009803F00DFF51 -:10B0E0000EE0B44DE86890F84F10009803F001FFAF -:10B0F000E86890F85010009803F0FFFE00E0FFDFD2 -:10B10000F9F7FBF8002808BFFFDF0C2C12BF072C53 -:10B1100005B030BD122C1CBF142C162C0DD0022CE7 -:10B1200004BF05B030BD0021A248C068A0F8881057 -:10B13000012180F88A1005B030BD9E480021C0680A -:10B14000A0F88210012180F8861005B030BD70B5DE -:10B150000C4605464FF4F871204605F0A8FB258003 -:10B1600070BDF4F789BD2DE9F0410D460746072172 -:10B17000F4F7A0FC040047D094F8A0010026D8B151 -:10B180006E700820287094F8A00188B1268484F895 -:10B19000A061D4F8A201C5F80200D4F8A601C5F850 -:10B1A0000600B4F8AA01688194F8A0010028EDD146 -:10B1B000AE700120BDE8F08194F8AC01002837D0D2 -:10B1C00094F8AC010C2818D00D2818BFFFDF4CD123 -:10B1D0002088F4F77AFD0746F4F7B6FAA0B96E7046 -:10B1E0000D20287094F8AE01A8702088A88084F8FB -:10B1F000AC613846F4F7A2FA37E02088F4F765FD31 -:10B200000746F4F7A1FA10B10020BDE8F0816E7096 -:10B210000C20287094F8AE01A8702088A88094F8BB -:10B22000B201A87184F8AC613846F4F787FA1CE0E3 -:10B2300094F8E40130B16E700F20287084F8E46156 -:10B240006F8012E094F8B40190B16E7009202870FC -:10B2500020886880D4F8B801D4F8BC116860A9606F -:10B26000B4F8C001A88184F8B4610120BDE8F08180 -:10B2700094F8C20140B16E7017202870B4F8C40170 -:10B28000688084F8C261F0E794F8DE0188B16E70DE -:10B290001820287094F8DE010028E6D084F8DE61DA -:10B2A000D4F8E001C5F8020094F8DE010028F5D1D9 -:10B2B000DBE794F8C601C8B16E701420287094F8CA -:10B2C000C6010028D1D000BF84F8C661D4F8C801F7 -:10B2D000C5F80200D4F8CC01C5F80600B4F8D001D6 -:10B2E000688194F8C6010028EED1BEE794F8D20137 -:10B2F00080B16E701A20287084F8D261D4F8D4011D -:10B30000C5F80200D4F8D801C5F80600B4F8DC018D -:10B310006881AAE794F8E601002808BFBDE8F0813B -:10B320006E701520287094F8E60100289DD000BFAB -:10B3300084F8E661D4F8E801C5F80200B4F8EC013D -:10B34000E88094F8E6010028F2D18EE7194A90606F -:10B35000D1707047002180F8631080F8641080F885 -:10B36000661090F8DE1011B10221FDF7A2B803219A -:10B37000FDF79FB82DE9F0470E4C80460D46E0687A -:10B380000088F4F7B4FC060008BFFFDF60782843AC -:10B39000607020794FF0000510F0200FE0681CBFAE -:10B3A000A0F87C5080F8E45008D1B0F87C10491C1B -:10B3B00002E0000018010020A0F87C10E0680127DE -:10B3C00090F8681039B990F86420012306215830AC -:10B3D00002F0C8FF48B3A08810F4006F07D0E068FF -:10B3E00090F86810002918BFA0F874501DD1E068CB -:10B3F000B0F87410491C8AB2A0F87420B0F8761026 -:10B4000091422CBF8B1A0023B4F806C00CF1050C36 -:10B41000634598BF80F87A708A4206D3A0F87450CA -:10B4200080F8E471E078EEF7EBFE20794FF0020946 -:10B4300010F0600F11D0E06890F8661011B1032988 -:10B4400006D00AE080F866700121FDF732F804E0CA -:10B4500080F866900121FDF72CF8E06890F86610FE -:10B46000012905D1A18811F4807F18BF80F866906A -:10B47000B8F1000F7DD1A18811F4007F18BFA0F8AA -:10B48000F85004D1B0F8F810491CA0F8F81000F0FA -:10B490004BFC00F004FE01F0D5FB0028E06818BF6B -:10B4A000A0F8D85004D1B0F8D810491CA0F8D81092 -:10B4B00001F0CBFB40B1E16891F8E40002289CBFA9 -:10B4C000401C81F8E40004D8E06890F8E400022809 -:10B4D00006D9E068A0F8D850A0F8DA5080F8E45017 -:10B4E000E0680123002190F86420583002F03AFF10 -:10B4F00020B9E06890F86400072859D1E06801237A -:10B50000002190F86320583002F02CFF00284FD023 -:10B51000E0680123002190F86520583002F022FFF6 -:10B52000002845D0E06890F86610022904BF90F822 -:10B53000E40000283CD13046F3F78CFEB8B3F8F7AE -:10B5400010FFA0B3E068B0F8D210012930D980F81C -:10B55000DD70B0F87E10B0F87C208B1E9A42AFBF31 -:10B560000121891A491E89B2B0F8D820E3889A428D -:10B5700000E034E02FBF01229A1A521C92B291428D -:10B5800088BF1146012908BF80F8DD5090F8692175 -:10B5900092B1B0F8DA20B0F86A0182422FBF0120E0 -:10B5A000801A401C80B2814288BF014604E0FFE758 -:10B5B000E068012180F8DD50D4F80CC0BCF85820B8 -:10B5C000501880B2ACF8D4009CF86610002918BF5F -:10B5D00001290ED002291CBF0329FFDF0CD0A0884F -:10B5E000C0F340200028E06818BFA0F8E6505FD103 -:10B5F00057E0ACF8D000F2E79CF86510032922D0A0 -:10B60000BCF87C00BCF87E100026821C914206D358 -:10B61000081A801E0604360C1CBF701E86B29CF8E9 -:10B620007A0058B19CF86320012309210CF15800DD -:10B6300002F098FE002808BF00262BD0E06890F8A2 -:10B64000681099B90AE0BCF87C100329D1D3BCF882 -:10B650007E001044401CACF8D000C0E790F8642095 -:10B6600001230621583002F07DFE78B1E268002007 -:10B67000B2F87610B2F87420931C994203D3881A5A -:10B68000801E18BF401EB04238BF86B2002E1CBFBD -:10B69000701E86B2E068B0F8D4103144A0F8D01023 -:10B6A0009DE7B0F8E610B0F8D6201144A0F8E610F7 -:10B6B000E06890F86E1139B990F8652001231946B9 -:10B6C000583002F04FFE38B1E068B0F88010B0F8A2 -:10B6D000D6201144A0F88010E06890F8863033B18D -:10B6E000B0F88210B0F8D6201144A0F8821090F87B -:10B6F0008AC0BCF1000F06D0B0F88810B0F8D62090 -:10B700001144A0F888103D22B8F1000F03D000BF0B -:10B7100080F8722010E02178022910D0012908BF9A -:10B7200090F8701106D06178F1B111F0140F18BFC4 -:10B730001E210BD080F8721080F871704DE090F8E7 -:10B740009610002914BF06211621F3E711F0080F07 -:10B75000DED111F0030F08BFFFDF2A21E06880F877 -:10B76000721080F8717038E02BB1B0F88210B0F828 -:10B770008420914211D2BCF1000F05D0B0F888109E -:10B78000B0F88420914208D2B0F88020B0F87E1042 -:10B790008A4208D390F86E212AB1222180F87210D3 -:10B7A00080F8717019E090F866204AB1B0F87C20FA -:10B7B0008A420FD3082180F8721080F871700CE073 -:10B7C000B0F87C10062905D33E2180F8721080F86D -:10B7D000717002E090F8711079B1E06880F8635000 -:10B7E00080F8645080F8665090F8DE10002914BF8D -:10B7F00002210321FCF75DFE02E00021FCF759FE67 -:10B80000E06880F8DE50BDE8F087FC4902464878E1 -:10B810008B7818430ED10846C0684AB1097911F0F7 -:10B82000080F03D090F86500032803D0012070476B -:10B83000FCF776BD002070472DE9F041EF4C05463E -:10B840000E46A0882843A08015F0020F04D015F002 -:10B85000010F18BFFFDF266115F0010F4FF0000840 -:10B860004FF001071CD03046666103F058FA0628F5 -:10B8700002D00B280BD013E0E06890F86410142974 -:10B880000ED10021C0E9281180F8677008E0E06857 -:10B8900090F864100E2904BF80F8678080F88C70DF -:10B8A00015F0020F18D02069C078052802D00B28A7 -:10B8B0000BD011E0E06890F8641012290CD100213F -:10B8C000C0E92A1180F8687006E0E06890F864101A -:10B8D0000D2908BF80F8688015F0800F1CBF082074 -:10B8E000A070BDE8F0812DE9F047C44C82B000257E -:10B8F00021690191A5806570A5704FF00108257040 -:10B90000E06068F30709074680F8DE800088F4F7F6 -:10B91000EEF95FEA000A08BFFFDFE0680088F8F789 -:10B92000D6FCE0680088F8F7F8FCE068B0F8D200D0 -:10B93000D0B101A8F8F7CEFCB0B1E06890F86E1174 -:10B9400091B190F8652001231946583002F00AFDA4 -:10B9500050B9E068A0F8805080F896500220FFF7B8 -:10B9600003FBE06880F8DD50D4F80CC09CF8DF00E1 -:10B97000002818BFE5800DD19CF8A00138B9BCF8AB -:10B980002000BCF80410884288BFE08002D8BCF8D0 -:10B990000400E080BCF8D600401E86B2BCF8D80097 -:10B9A0003044ACF8D8009CF8DC0000281CBFACF890 -:10B9B000DA508CF8DC5004D1BCF8DA003044ACF832 -:10B9C000DA00BCF87C003044ACF87C009CF86800DD -:10B9D00040B99CF86420012306210CF1580002F0C4 -:10B9E000C1FC28B1E068B0F874103144A0F87410BC -:10B9F000E068B0F8D21001299CBF491CA0F8D21011 -:10BA0000002E18BF80F8E45090F8DD10A1B1B0F816 -:10BA1000D800E18888420FD25046F3F71BFC58B19A -:10BA2000E06890F8691139B1B0F8DA10B0F86A013D -:10BA3000814228BF01F00CF9E26882F8DD5092F8EB -:10BA40006400062818BF072819D1B2F85810B2F8B8 -:10BA50008431C91A09B2002911DB02F5C37102F160 -:10BA6000080005F02EF80221E06802F0F7F8E0681F -:10BA700080F8835180F8645080F8978048E021284E -:10BA800020D1B2F85800B2F88411401A00B2002850 -:10BA900018DB92F88601002808BF92F8510082F85E -:10BAA000510092F88701002808BF92F8520082F8EE -:10BAB0005200002000F004F9E06880F8835180F81B -:10BAC000645025E092F86300212821D1B2F8580093 -:10BAD000B2F88411401A00B2002819DB92F88601EE -:10BAE000002808BF92F8510082F8510092F88701AF -:10BAF000002808BF92F8520082F85200002000F09F -:10BB0000DFF8E06880F8985080F8835180F863503F -:10BB1000E16801F15800B1F8D62002F0C8FAE068F7 -:10BB200090F86911002918BFA0F8DA503448009045 -:10BB3000344B354A3946484600F00AFFE068012395 -:10BB4000052190F86420583002F00CFC002818BF42 -:10BB500000F074FCE0680123072190F8642058305D -:10BB600002F000FC002818BF0C203AD000F06AFC5C -:10BB7000E06890F89A11002904BF02B0BDE8F08790 -:10BB800090F89C11002907BF90F89810002902B086 -:10BB9000BDE8F08790F8632001230B21583002F0B4 -:10BBA000E1FB00281CBF02B0BDE8F087E06801237C -:10BBB0000B2190F86420583002F0D4FB00281CBF01 -:10BBC00002B0BDE8F087E06890F8512090F89D1130 -:10BBD000012A1BD0022A1CD0032A08BF04291AD02C -:10BBE0002BE0E0680123082190F86420583002F02F -:10BBF000B9FB002818BF0820B8D1B9E71801002008 -:10BC000075B301000BB8010039B80100012914D146 -:10BC100001E0022911D190F8522090F89E11012ADA -:10BC200006D0022A07D0032A08BF042915D004E051 -:10BC3000012902D111E002290FD080F89880E06834 -:10BC400090F89B1100291CBFB0F89D11A0F84F106F -:10BC500080F89A5102B0BDE8F087002000F030F87B -:10BC6000EDE700F068BF10B50446B0F88A214388BC -:10BC7000B0F88C11B0F88E019A4201BFA3889942A6 -:10BC8000E38898420FD02388A4F8A431A4F8A62111 -:10BC9000A4F8A811A4F8AA01012084F8A001FC4886 -:10BCA000C078EEF7ADFA0121204601F0D7FF002061 -:10BCB00084F8830184F86400032084F8660010BDD2 -:10BCC00010B5F34CE1680A88A1F8EA2181F8E8018F -:10BCD00091F85100012808BF012108D0022808BFAF -:10BCE000022104D003281ABFFFDF00210321E068EE -:10BCF00080F8EC1190F85200012808BF012108D00B -:10BD0000022808BF022104D003281ABFFFDF002148 -:10BD10000321E06880F8ED11012180F8E611E07858 -:10BD2000BDE81040EEF76CBA2DE9F041D84C4FF069 -:10BD300002084FF00005207910F0080F14D0607849 -:10BD400090B9E06890F86410162905D180F88B50FE -:10BD500080F88A5080F8645090F86510032904BF79 -:10BD600084F8008080F86550FEF7D9FCA1884FF078 -:10BD7000010611F0040F4FF0070719D06078B8B929 -:10BD8000E06890F86420062A08BF80F8836108D034 -:10BD9000082A08BF80F8838103D0212A08BF80F8D1 -:10BDA000837190F86520022A04BF267080F86550E0 -:10BDB00011F0020F00F048816078002840F04481C3 -:10BDC0002069C078801E162880F03D81DFE800F0F1 -:10BDD0000BF9646F851EF948F955B97AF9F9F9F943 -:10BDE000E4F8FDF6F5F4E0680123194690F86520C3 -:10BDF000583002F0B7FA002840F02681E0680321AD -:10BE000080F8651080F8865000F0DCB8206903F0F7 -:10BE100031F80646E06890F86410052905D090F8DE -:10BE20006300052818BFFFDF04D0E06890F86300C6 -:10BE300005280AD1E06890F8CA10B14204BF80F822 -:10BE4000635080F8865000F0FF80E06890F864103E -:10BE500005290CBF80F86450FFDF40F0F580B1E0A9 -:10BE6000E06890F86400092818BFFFDFE06880F8F8 -:10BE70008A5080F8645000F0E7B8E06890F86400F9 -:10BE80000D2818BFFFDFE0685FF00E0180F88B60BF -:10BE900080F8641000F0D8B8E06890F864001128C9 -:10BEA00018BFFFDFE068122180F88B60F0E7E068E0 -:10BEB00090F86400122818BFFFDF1420E16881F8B1 -:10BEC0006400C1E0E06890F86400122818BFFFDF4A -:10BED0001620E16881F86400B6E0E06890F864003C -:10BEE000192818BFFFDFE06880F88B5080F88A506F -:10BEF00090F8AC01002818BFFFDFE06890F88C10C4 -:10BF000041B180F88C500188A0F8B01180F8AE5192 -:10BF10000D2107E00188A0F8B01180F8AE5180F83B -:10BF2000B2610C2180F8AC110088F3F7CEFEF3F774 -:10BF3000F5FBE078EEF764F9D4F80C0080F8645073 -:10BF400082E0E06890F8821104290ED0E0680123B5 -:10BF5000082190F86420583002F004FA00281CBF31 -:10BF6000E06880F88A506FD0E8E790F863200123FA -:10BF70000021583002F0F6F9002808BFFFDFE06822 -:10BF800090F88E1011F0020F0EBF80F8636080F8F9 -:10BF9000865080F88251D9E7E0680123002190F8AB -:10BFA0006320583002F0DEF9002808BFFFDF0A20C6 -:10BFB000E16881F8630047E03AE023E015E004E03F -:10BFC0001EE040E080F88A503EE0E0680123002156 -:10BFD00090F86320583002F0C5F9002808BFFFDF51 -:10BFE0001A20E16881F863002EE0E0680123002157 -:10BFF00090F86420583002F0B5F9002808BFFFDF40 -:10C00000E068DFE7E06890F89800012818BFFFDFDC -:10C01000E0680123002190F86320583002F0A2F973 -:10C02000002808BFFFDF1D20E16881F863000BE0F6 -:10C03000E06890F864001E2818BFFFDF1F20E16849 -:10C0400081F8640000E0FFDF207910F0100F08D0C5 -:10C05000607830B9E06890F86410062908BF80F86D -:10C060006470A07810F0080F08BFBDE8F081E068A8 -:10C070000123052190F86420583002F073F948B18B -:10C0800008206070E06880F8AC51BDE8F0810000E5 -:10C0900018010020BDE8F041002000F0DDBDF8B53A -:10C0A0006846F8F717F9002808BFF8BDDB4C607840 -:10C0B000002818BFF8BDE0680123194690F86520F4 -:10C0C000583002F04FF9002818BFF8BDE06800258D -:10C0D00090F86E1129B1A0F8805080F89650022097 -:10C0E00080E090F8632001230021583002F03AF9F3 -:10C0F00078B1E0680123042190F86420583002F000 -:10C1000031F930B9E06890F87A00002818BF1220A1 -:10C1100068D1E06890F86310052910D090F8642089 -:10C1200002270126112A4AD017DC092A08BF092054 -:10C1300058D00BDC012A7DD0052A39D017E0072022 -:10C14000FEF712FFE068A0F88250F8BD0B2A72D00B -:10C150000D2A08BF0B2045D009E0122A45D0192A24 -:10C1600072D01C2A69D01E2A08BF17203AD001239A -:10C170000421583002F0F6F8002818BFF8BDE06836 -:10C1800090F88211002973D090F8632001230021D8 -:10C19000583002F0E7F800286AD0E06890F8821181 -:10C1A000042904BF90F88E0010F0030F7DD0BDE08D -:10C1B0000720FEF7D9FEE068A0F88850F8BDF6F732 -:10C1C00095FB0C2838BFF8BD0821E068F030F6F781 -:10C1D0008EFB28B1E0680421C430F6F788FB00B973 -:10C1E000FFDF0420FEF7C0FEF8BD90F871110129B1 -:10C1F00010D0022918BFF8BD90F88C1000291ABF82 -:10C2000080F8966002200D20FEF7AEFEE06880F810 -:10C210007151F8BD90F8AC11002918BFF8BD00F1BC -:10C22000B00300F1E801002200F5B97002F02FF828 -:10C23000052003E00FE01CE006E021E0FEF794FE9D -:10C24000E06880F87151F8BD0620FEF78DFEE068C9 -:10C2500080F88A50F8BD0C20FEF786FEE068A0F852 -:10C26000885090F88E1041F0010180F88E10F8BDD2 -:10C270005CE01320FEF778FEE068A0F88850C9E083 -:10C2800090F89111002918BFF8BD90F8901199B15C -:10C29000B0F89211A0F84010B0F89411A0F8421034 -:10C2A000B0F89611A0F8441000E031E0B0F8981111 -:10C2B000A0F8461080F89051FEF7EEF90521E068ED -:10C2C000FCF7F7F8E06890F84E10012908BF80F8F5 -:10C2D0004E7014D00288A0F8C821028EA0F8CA219E -:10C2E000828EA0F8CC21428E00F5D071A0F8CE212C -:10C2F000C08E088681F82660E078EDF781FF152072 -:10C30000FEF732FEE068A0F8885080F86450F8BD6F -:10C310000C20FEF729FEE068A0F8825080F88660C5 -:10C3200090F88E1041F0010180F88E106846F7F702 -:10C33000D1FF002808BFF8BDE0680123002190F874 -:10C340006320583002F00EF830B1E06890F8901198 -:10C3500011B190F89111E9B1E0680123002190F842 -:10C360006320583001F0FEFF002808BFF8BDE068E8 -:10C3700090F89810002908BFF8BD90F864200123B8 -:10C380000B21583001F0EEFF002808BF16203FF4C3 -:10C3900029AFF8BDB0F89211A0F84010B0F8941190 -:10C3A000A0F84210B0F89611A0F84410B0F8981117 -:10C3B000A0F8461080F8905190F864001B2818BF30 -:10C3C00014207FF40FAFFEF767F90521E068FCF752 -:10C3D00070F8E06890F84E10012908BF80F84E70A0 -:10C3E00014D00288A0F8C821028EA0F8CA21828E3B -:10C3F000A0F8CC21428E00F5D071A0F8CE21C08EDD -:10C40000088681F82660E078EDF7FAFE1520FEF741 -:10C41000ABFDE06880F86450F8BD00001801002012 -:10C4200030B5F74C05462078002818BFFFDFA5720D -:10C430000020207330BDF24908737047F049012095 -:10C4400048727047EE49C872704770B4ED480121D8 -:10C45000426890F800C0406892F86360154690F812 -:10C46000510002F15803212E1CBF1C7B212C22D02D -:10C4700003231D2E40D01F2C1CBF70BC704700BF73 -:10C48000BCF1000F04BF70BC704795F84FC092F824 -:10C490006D210CEA020212F0040F14BF194612F0CB -:10C4A000010F4CD0032818BF032954D0012818BF0E -:10C4B000012953D04CE0BCF1000F0ED092F8861148 -:10C4C000002904BF70BC7047032818BF032942D05D -:10C4D000012818BF012941D03AE092F8041100293F -:10C4E00004BF70BC7047032818BF032933D001284C -:10C4F00018BF012932D02BE01F2CC1D0BCF1000F96 -:10C5000004BF70BC704792F89D2112F0040F14BF55 -:10C51000194612F0010F08D0032818BF03291AD0BA -:10C52000012818BF012919D012E012F0020F04BF30 -:10C5300070BC704703280ED001280FD008E012F01D -:10C54000020F04BF70BC7047032804D0012805D037 -:10C5500070BC0220704770BC0320704770BC012083 -:10C5600070472DE9F047A74F4FF0000839464FF0CC -:10C5700001094D6895F85210E88E01F086FF95F894 -:10C58000521080B26FF00D02032967D0022907BF55 -:10C590006FF00E0101EB900002EBD00086B268D084 -:10C5A000688EB04238BF0646954C3146606BF2F754 -:10C5B0008DFEDFF854A2E062002819BF84F80280E3 -:10C5C000A06284F80290C4F828A03878786800F156 -:10C5D0005808012000F009FE98F8100000284AD001 -:10C5E00008F15801884891E80E1000F5027989E8B1 -:10C5F0000E10D8F86810C0F82112D8F86C10C0F8E6 -:10C60000251200F58170F7F70AFA387800280CBF78 -:10C610000120002080F001017C480176D8E9141245 -:10C62000C0E90412C4F828A05146E681A0F583723F -:10C63000F6F72BFE95F85200012808BF002208D01B -:10C64000022808BF012204D003281ABFFFDF0022FE -:10C650000222A17B0120F6F726FE11E0B0F5747FDF -:10C6600038BF46469CD35038C11700EB916002EBAF -:10C67000A01086B294E7A06AF7F7D1F9F6F738FE72 -:10C6800001210020F7F75FFB02202070BDE8F08752 -:10C690002DE9F04FDFF86C9183B049464FF0000A66 -:10C6A0004E684FF0010806F1580496F85D00A1F1BC -:10C6B0001407A1F1380570B3012878D0022877D08B -:10C6C000032818BFFFDF74D0686A0823017821F0BF -:10C6D00008010170A27903EAC202114321F00401AA -:10C6E0000170E279042303EA8202114321F0100170 -:10C6F000017094F805A0286BF2F7BAFD0746F7F72A -:10C7000030FEBAF1020F79D0BAF1010F77D0BAF149 -:10C71000030F7DD08DE0FFE7FFF797FE014630461F -:10C7200001F0BCFE1FFA80FBFFF78FFE6FF00D01DA -:10C7300003281ED0022807BF6FF00E0000EB9B00FD -:10C7400001EBDB0080B220D0318E814238BF084639 -:10C75000ADF80400A6F84C003846F7F7E1FDB0B19B -:10C76000696A85F80380AA694FF4806090470320C6 -:10C7700030E0BBF5747F38BF5046E5D3ABF15000D5 -:10C78000C21700EB926001EBA01080B2DCE76A46B2 -:10C7900001A9286BF2F74FFC686210B194F83310CE -:10C7A00041B13846F7F790FD84F805808CE713E037 -:10C7B00016E02EE09DF8001031B9A0F800A080F836 -:10C7C00002A0012102F002FABDF80410686A02F02A -:10C7D000C6FB0220607177E73846F7F775FD73E70F -:10C7E000B6F84C00ADF804006A4601A9286BF2F7D0 -:10C7F00022FC6862002808BFFFDF65E710E012E056 -:10C800003001002068010020700E00207810002008 -:10C810000CE03846F7F784FD002808BFFFDF53E738 -:10C82000B84306D103E0B84303D100E00FB10121C2 -:10C8300000E00021686A027842EA01110170E17BA0 -:10C8400000291CBF6179012937D004F15801F8484B -:10C8500091E80E1000F5027787E80E10A16EC0F87F -:10C860002112E16EC0F8251200F58170F7F7D7F8B4 -:10C8700099F8000000280CBF01210021ED48017645 -:10C88000D4E91212C0E90412A0F583716A6AF6F7BE -:10C89000FCFC96F85100012808BF002208D00228AD -:10C8A00008BF012204D003281ABFFFDF00220222A2 -:10C8B000FB210020F6F7F7FC03E0F7F7B0F8F6F7F6 -:10C8C00017FD99F8000028B1686A007810F0100F81 -:10C8D00005D00CE001210846F7F735FA0AE0D64802 -:10C8E000007810F0100F04BF6879002802D0E878B3 -:10C8F0000028EFD0A87908BB85F8068096F852008A -:10C90000012808BF002408D0022808BF012404D051 -:10C9100003281ABFFFDF0024032496F851000128E2 -:10C9200008BF002007D0022808BF012003D0032839 -:10C930001CBFFFDF00202146F7F7D9F8686A01889D -:10C9400069828078287585F8008003B0BDE8F08F93 -:10C950002DE9F05FB94E8146DDF8288030781C461D -:10C9600017460D4628B9002F1CBF002CB8F1000F48 -:10C9700000D1FFDFC6F82080C6E90674C6E90E952F -:10C9800000247472FF20F072347274713471B471C7 -:10C99000F471AB4FF4703482387805F15808288868 -:10C9A000F3F7A5F930632888F3F78FF97063F7F789 -:10C9B0002BF8F6F7B6FDF7F7F8F805F11100F7F7E1 -:10C9C0000CF805F10D00F6F72EFE387800280CBFA4 -:10C9D00003200120F7F715F898F81800F6F72BFE5A -:10C9E000F7F709F895F85200012808BF002007D092 -:10C9F000022808BF012003D003281CBFFFDF00204E -:10CA0000F7F7DFFB38786FF00D066FF00E0920B3F3 -:10CA100098F81080B5F832A095F85210E88E01F021 -:10CA200034FD81B295F8520003286BD002280EBF66 -:10CA300009EB910106EBD1018CB26CD0A24538BF55 -:10CA40005446B8F1000F1CBF211D8CB2012864D0E0 -:10CA5000022865D0032865D027E098F80F80B5F844 -:10CA600030A0FFF7F2FC0146284601F017FD1FFA3F -:10CA700080FBFFF7EAFC032838D002280EBF09EB41 -:10CA80009B0006EBDB0084B23AD0A24538BF544687 -:10CA9000B8F1000F1CBF201D84B295F85100012889 -:10CAA0003BD002283CD003283CD0FFDF002528469D -:10CAB000F6F722FD29462046F6F7FBFC387870B3DE -:10CAC000786890F86801002818BFF6F75FFD01212B -:10CAD0000846F6F725FE7868D0F8E000F6F7A2FFE2 -:10CAE000FFF73FFDBDE8F05FF6F796BFBBF5747F3B -:10CAF000CBD3ABF15000C11700EB916006EBA01057 -:10CB000084B2C2E7B1F5747F98D35039CA1701EBEC -:10CB1000926106EBA1118CB290E70025C7E703E014 -:10CB20000125C4E70325C2E701210020F6F7F8FD3F -:10CB3000FFF7AEFDD6E770B54148404D05F138012D -:10CB400000784C68002840D094F85100012808BFB4 -:10CB5000002608D0022808BF012604D003281ABFE7 -:10CB6000FFDF0026032694F85200012808BF0021A9 -:10CB700008D0022808BF012104D003281ABFFFDF14 -:10CB80000021032132469620F7F72CF82878022856 -:10CB900018BFFFDF94F85150F6F736FF94F82C00D9 -:10CBA000012808BFF7F7ACF8012D08BF002008D016 -:10CBB000022D08BF012004D0032D1ABFFFDF002083 -:10CBC0000320BDE87040F6F797BC94F852000128A6 -:10CBD00008BF002608D0022808BF012604D0032879 -:10CBE0001ABFFFDF0026032694F85100012808BF72 -:10CBF000002108D0022808BF012104D003281ABF51 -:10CC0000FFDF0021032132469620F7F701F828784C -:10CC1000012818BFFFDF94F85250BDE7074810B550 -:10CC20000078022818BFFFDFBDE8104000F056BBB7 -:10CC3000700E0020781000204501002030010020F7 -:10CC400068010020FE4880797047FD4840797047B0 -:10CC5000FB490120C87170472DE9F0470600F948EB -:10CC6000F74D4FF0010740684FF0000800F15804FD -:10CC7000A86A90F8019018BF012E03D1696B03F0E8 -:10CC80003BFA68706878A0B1012830D0022848D0FB -:10CC900003281CBFFFDFBDE8F087012E08BFBDE8F9 -:10CCA000F087686BF2F723FDA87ABDE8F047EDF74F -:10CCB000A7BA012E08D001224946686BF2F764FB3F -:10CCC000022E08BFBDE8F087D4E91402411C42F1EE -:10CCD0000000C4E91410E079012802D184F807802B -:10CCE00000E0E771A87ABDE8F047EDF789BA012EB8 -:10CCF00008D000224946686BF2F746FB022E08BFB7 -:10CD0000BDE8F087D4E91401401C41F10001C4E9F9 -:10CD10001401E07901280CBF84F80780E771BDE8B1 -:10CD2000F087012E06D0686BF2F7E1FC022E08BFF7 -:10CD3000BDE8F087D4E91401401C41F10001C4E9C9 -:10CD40001401E0790128CCD1C8E72DE9F041BD4FAD -:10CD50004FF000083846A7F138044068012600F17A -:10CD600058052078012818BFFFDFA87850B185F852 -:10CD70000280E670A2694146042090473878002876 -:10CD800018BF2E71606A0321007831EA000004BFE9 -:10CD9000E878002805D1EE70616AE670A269022089 -:10CDA00090470121002000F0BCFA002808BF7C68F1 -:10CDB00003D0BDE8F04100F091BAFFF7D2FB94F840 -:10CDC0005100012808BF002007D0022808BF012019 -:10CDD00003D003281CBFFFDF0020F6F78DFB94F87B -:10CDE0005100012808BF002508D0022808BF0125EE -:10CDF00004D003281ABFFFDF0025032594F8520052 -:10CE0000012808BF002108D0022808BF012104D052 -:10CE100003281ABFFFDF002103212A46BDE8F041A5 -:10CE20009620F6F7DFBE2DE9F84F864E8346304652 -:10CE3000A6F138054068317800F1580A00272878B3 -:10CE40004FF00108B946022818BFFFDF288A40F4D6 -:10CE500000702882002000F0C8F99AF81000BBF199 -:10CE6000000F00F0F880F6F769FAF6F757FA90B974 -:10CE70009AF8100078B1A86A417861B100789AF800 -:10CE80000710C0F3C000884205D185F80480BDE8D2 -:10CE9000F84F00F023BAA86A0188A5F81510807829 -:10CEA000E875288A40F0200028826F713078706819 -:10CEB00058300090746894F82C00012818D1F6F7C7 -:10CEC00015FF2046009901F022FA88B13078002839 -:10CED00070680CBF00F58C7000F5EF702188418000 -:10CEE0000099097A017180F80080A87AEDF788F935 -:10CEF000A86A9AF806100078C0F38000884233D000 -:10CF00003078706800F1580490F85D0040B3022852 -:10CF100044D06771307840B12079394628B1217109 -:10CF200085F80380AA6910209047E07890B1E770F7 -:10CF3000F7F705FA002808BFFFDF082085F803800F -:10CF4000AA6900219047D4E91201401C41F1000177 -:10CF5000C4E91201A07901280CBFA77184F80680EA -:10CF6000288A40F480702882A86A9AF807300178ED -:10CF7000C1F3C0029A4256D13278726801F00301BF -:10CF800002F15804012918BF022939D003291CBF16 -:10CF9000287A40F0040012D0287244E0286BF2F79F -:10CFA00084F8002808BFFFDFD4E91210491C40F1C3 -:10CFB0000000C4E91210A87AEDF722F9A9E7297B4D -:10CFC00019B1C178EA7A91422DD001F020FE98B1D2 -:10CFD00084F80280298A404641F400612982A96AC6 -:10CFE00085F80380AA699047E079012801D1E771AB -:10CFF00019E084F8078016E0287A40F01000CBE7AB -:10D00000407820B3298A41F400612982A97851B976 -:10D01000FB28F1D8687A002808BFC14603D08020D9 -:10D02000AA69002190475946012000F07AF988B397 -:10D030009AF81000002818BFBBF1000F20D003E0C1 -:10D040003001002068010020A87868B118E0E0797C -:10D050000128CED1CBE7002818BFF6F7A8F9288A17 -:10D0600040F040002882DEE7A96AEA8948789042C9 -:10D0700088BF1046C21CE86A03F080FBE86AA86219 -:10D08000B9F1000F1CBF0020FFF7E6FDBDE8F84F27 -:10D0900000F024B930787468B9F1000F1CBF01208A -:10D0A000FFF7DAFDFFF7F4FA9AF81000002818BF2E -:10D0B000BBF1000F0DD0A87858B9A96AEA89487861 -:10D0C000904288BF1046C21CE86A03F057FBE86A2A -:10D0D000A862B9F1000F1CBF0220FFF7BDFD94F854 -:10D0E0005200012808BF002007D0022808BF0120F5 -:10D0F00003D003281CBFFFDF0020F6F7FDF994F8EA -:10D100005200012808BF002508D0022808BF0125C9 -:10D1100004D003281ABFFFDF0025032594F851002F -:10D12000012808BF002108D0022808BF012104D02F -:10D1300003281ABFFFDF002103212A46BDE8F84F6C -:10D140009620F6F765BD2DE9F0410D469549064656 -:10D1500094484C68007894F85220002822D0012A84 -:10D1600008BF002708D0022A08BF012704D0032ADD -:10D170001ABFFFDF0027032794F85100012808BFDA -:10D18000002208D0022808BF012204D003281ABFB9 -:10D19000FFDF002203223B4629463046BDE8F0412E -:10D1A000FBF7FFBA012A08BF002708D0022A08BFF0 -:10D1B000012704D0032A1ABFFFDF0027032794F8B2 -:10D1C0005100012808BF002208D0022808BF012210 -:10D1D00004D003281ABFFFDF002203223B46294662 -:10D1E0003046BDE8F041FAF723B92DE9F047014692 -:10D1F0006C4800246FF00D084568027805F158006E -:10D200006FF00E0909B3077C6E8E95F85210E88E08 -:10D2100001F03BF981B295F8520003284DD0022865 -:10D220000EBF09EB910108EBD1018CB24ED0A642A2 -:10D2300038BF3446002F1CBF211D8CB2012847D0B7 -:10D24000022847D0032847D024E0C77B2E8EFFF763 -:10D25000FCF80146284601F021F91FFA80FAFFF791 -:10D26000F4F803281DD002280EBF09EB9A0008EB42 -:10D27000DA0084B21FD0A64238BF3446002F1CBF4C -:10D28000201D84B295F85100012821D0022821D018 -:10D29000032821D0FFDF00212046BDE8F047F6F744 -:10D2A00008B9BAF5747FE6D3AAF15000C11700EBB4 -:10D2B000916008EBA01084B2DDE7B1F5747FB6D3BE -:10D2C0005039CA1701EB926108EBA1118CB2AEE79D -:10D2D0000021E1E70121DFE70321DDE770B53149F6 -:10D2E00000254C68F6F7AAFCF6F770FCF6F716FB7B -:10D2F000F6F779FBF5F7FCFFF6F764FCF6F78CFB25 -:10D3000094F82C00012808BFF6F7F0FC264C002109 -:10D31000A269208A9047226A217A20799047257055 -:10D3200070BD70B5204C0546002908BF012D05D100 -:10D330006079401CC0B26071012830D8E16928468C -:10D34000884700282BD0E179184839B1012D01BF59 -:10D3500041780029017811F0100F20D0217AF1B91D -:10D3600010490978002918BF002102D0294304D0B0 -:10D3700013E0012D18BF0121F8D10D49097811F0F2 -:10D38000100F04BF007810F0100F08D0E07830B90B -:10D39000A07810B111F0100F01D0002070BD012055 -:10D3A00070BD000068010020300100204501002010 -:10D3B0004201002010B540F2BB11F74803F055FAC6 -:10D3C000F648002141704FF46171418010BD2DE994 -:10D3D000F0410F46064600F0D6FAEF4C102817D061 -:10D3E00004EBC00191F8421111F0010F1CBF0120A4 -:10D3F000BDE8F081617808291FD2617804EBC00094 -:10D40000491C6170012180F842110846BDE8F08195 -:10D410006178082911D22578681C207004EBC508B2 -:10D420003868C8F83C01B888A8F84001102D28BF1A -:10D43000FFDF88F83B612846DFE70020BDE8F08188 -:10D44000D5480178491E4BB2002BB8BF704770B465 -:10D450005FF0000500EBC30191F8421111F0010FDC -:10D460003BD04278D9B2521E427000EBC10282F822 -:10D47000425190F802C00022BCF1000F0BD9841871 -:10D4800094F803618E4202D1102A26D103E0521C87 -:10D49000D2B29445F3D80278521ED2B202708A42B8 -:10D4A0001BD000EBC20200EBC10CD2F83B41CCF820 -:10D4B0003B41D2F83F21CCF83F21847890F800C05E -:10D4C0000022002C09D9861896F8036166450AD116 -:10D4D000102A1CBF024482F80311591E4BB2002BC4 -:10D4E000B8DA70BC7047521CD2B29442EBD8F4E761 -:10D4F0002DE9F0471E4617468846814600F043FA5C -:10D50000A54C0546102831D0A078002100280ED95E -:10D51000621892F80331AB4205D110291CBF1220CA -:10D52000BDE8F08703E0491CC9B28842F0D808285A -:10D5300032D2102D1DD000BF94F80280102208F1C5 -:10D540000100A07004EB081909F10300394600F04E -:10D550008DFE09F183001022314600F087FE04EBB6 -:10D56000080080F803510020BDE8F087A078082863 -:10D5700012D22578681C207004EBC50AD8F8000088 -:10D58000CAF83C01B8F80400AAF84001102D28BFE1 -:10D59000FFDF8AF83B91CFE70720BDE8F08770B442 -:10D5A0007D488178491E4BB2002BBCBF70BC7047D0 -:10D5B00003F0FF0C8178491ECAB2827050FA83F1E1 -:10D5C00091F8031194453AD000EB021400EB0C15CE -:10D5D000D4F80360C5F80360D4F80760C5F80760A5 -:10D5E000D4F80B60C5F80B60D4F80F60C5F80F6075 -:10D5F000D4F88360C5F88360D4F88760C5F8876085 -:10D60000D4F88B60C5F88B60D4F88F40C5F88F4094 -:10D61000841800EB0C0502EB420294F803410CEB7A -:10D620004C0C00EB420285F8034100EB4C0CD2F8A5 -:10D630000B41CCF80B41B2F80F21ACF80F2100EBF5 -:10D64000C10292F8422112F0010F35D190F802C0C8 -:10D6500000220C46BCF1000F0BD9851895F8035138 -:10D660008D4202D1102A27D103E0521CD2B2944538 -:10D67000F3D80178491EC9B20170A1421CD000EB59 -:10D68000C10100EBC402D1F83BC1C2F83BC1D1F8E3 -:10D690003F11C2F83F1190F802C002780021BCF19E -:10D6A000000F09D9451895F8035195420BD110295F -:10D6B0001CBF014481F80341591E4BB2002BBFF639 -:10D6C00077AF70BC7047491CC9B28C45EAD8F3E704 -:10D6D00032494870704731484078704738B14AF253 -:10D6E000B811884203D82D49488001207047002096 -:10D6F00070472A484088704710B500F044F9102858 -:10D7000014D0254A0146002092F802C0BCF1000F57 -:10D710000CD9131893F803318B4203D1102818BF8A -:10D7200010BD03E0401CC0B28445F2D8082010BDF3 -:10D7300019498A78824286BF01EB001083300020AD -:10D74000704715498A78824286BF01EB0010C01CE1 -:10D7500000207047104B93F802C084459CBF002006 -:10D760007047184490F8030103EBC00090F83B3178 -:10D770000B70D0F83C111160B0F84001908001208E -:10D780007047054A114491F8032104490A70026860 -:10D790004A60808808817047A01000207001002036 -:10D7A00010B5F5F721FD002804BFFF2010BDBDE82E -:10D7B0001040F5F73FBDF1498A7882429CBF0020B6 -:10D7C0007047084490F8030101EBC00090F8420153 -:10D7D00000F00100704770B5E84E0024254630780F -:10D7E000002814D906EBC50090F8421111F0010F82 -:10D7F00008D090F83B2100F59E712046631CDCB2F6 -:10D80000F5F7D9FE681CC5B23078A842EAD870781E -:10D81000A04218BFFFDF70BD70B5D84C002635465A -:10D82000A078002812D96019731C90F8030104EB4A -:10D83000C00000F59E7190F83B213046DEB2F5F74E -:10D84000BAFE681CC5B2A078A842ECD8C0B2B042FB -:10D8500018BFFFDF70BD10B5F5F7DDFE58B300242B -:10D86000F5F7DDFEC54A00211378002B23D900BF50 -:10D8700002EBC10C9CF842C11CF0010F17D084428E -:10D880001CBF04F1010C0CF0FF0410D193780020B0 -:10D89000002B0AD902EB000C9CF803C18C4508BF91 -:10D8A00010BD401CC0B28342F4D8102010BD491CEA -:10D8B000C9B28B42DCD8082010BD10B5F5F7ABFE1D -:10D8C000002804BF082010BDBDE81040F5F7A7BE32 -:10D8D000AB4910B5497841B1A84B997829B1C21C20 -:10D8E000D81CF5F71EFC012010BD002010BDA34A76 -:10D8F00001EB410102EB41010268C1F80B21808874 -:10D90000A1F80F01704770B59C4D0024A87800283D -:10D9100098BF70BDC0B2A04212D905EB041010F13F -:10D9200083060DD01021304600F07DFC40B904EB99 -:10D93000440005EB400000F20B113046F6F78FFD76 -:10D94000601CC4B2A878A042E4D870BD0146102281 -:10D950008C4800F08BBC8B48704770B5874D0446EF -:10D96000A878A04206D905EB04101021833000F0FE -:10D970005AFC08B1002070BD04EB440005EB4000E8 -:10D9800000F20B1070BD2DE9F0417C4D06460024DD -:10D9900028780F46002811D905EBC40090F83B11F8 -:10D9A000B14206D10622394600F59E7002F0BAFE59 -:10D9B00038B1601CC4B22878A042EDD81020BDE870 -:10D9C000F0812046BDE8F0816C4910B44A7801EB43 -:10D9D000C003521E4A70002283F8422191F802C00F -:10D9E000BCF1000F0DD98B1893F80341844204D188 -:10D9F000102A1CBF10BC704703E0521CD2B29445E1 -:10DA0000F1D80A78521ED2B20A70824204BF10BC0A -:10DA1000704701EBC00301EBC202D2F83BC1C3F86F -:10DA20003BC1D2F83F21C3F83F218C7891F800C068 -:10DA30000022002C9CBF10BC70478B1893F8033158 -:10DA4000634506D1102A1CBF114481F8030110BCA4 -:10DA50007047521CD2B29442EFD810BC704770B4D9 -:10DA600046490D188A78521ED3B28B7095F803215F -:10DA7000984239D001EB001C01EB031400EB40008D -:10DA8000D4F80360CCF80360D4F80760CCF80760E2 -:10DA9000D4F80B60CCF80B60D4F80F60CCF80F60B2 -:10DAA000D4F88360CCF88360D4F88760CCF88760C2 -:10DAB000D4F88B60CCF88B60D4F88F40CCF88F40D2 -:10DAC00001EB030C03EB43039CF803C101EB43039D -:10DAD00085F803C101EB4000D3F80BC1C0F80BC1BE -:10DAE000B3F80F31A0F80F3101EBC20090F84201FA -:10DAF00010F0010F1CBF70BC704700208C78002C08 -:10DB00000DD90B1893F803C1944504D110281CBFFC -:10DB100070BC704703E0401CC0B28442F1D8087862 -:10DB2000401EC0B20870904204BF70BC704701EB49 -:10DB3000C20301EBC000D0F83BC1C3F83BC1D0F831 -:10DB40003F01C3F83F018C780B780020002C9CBF6C -:10DB500070BC704701EB000C9CF803C19C4506D1DA -:10DB600010281CBF084480F8032170BC7047401C7B -:10DB7000C0B28442EED870BC70470000A0100020F4 -:10DB8000700100205B12002010B50A7B02F01F021A -:10DB90000A73002282758B181B7A03F0010C5B0854 -:10DBA00003F00104A4445B0803F00104A4445B08EF -:10DBB00003F00104A4445B0803F0010464444FEA49 -:10DBC000530C0CF0010323444FEA5C0C0CF00104ED -:10DBD000234403EB5C0300EB020C521C8CF8113065 -:10DBE00090F816C0D2B263448375052AD3D3D8B255 -:10DBF000252888BFFFDF10BD00238383028401EB4B -:10DC0000C202521EB2FBF1F1C183704770B46FF0D3 -:10DC10001F01050C01EA9024012000224FF01F0C87 -:10DC20001146134682EA0506F6430E43B6F1FF3F5E -:10DC300011D004F00106520842EAC63249080CF03D -:10DC4000010664085B1C41EAC6314FEA5C0C162BE6 -:10DC5000E8D370BC704770BC002070472DE9F0031A -:10DC60000A460021032A10D04FF4FA4C002A7CD037 -:10DC7000012A00F0FF80022A1CBFBDE8F0037047B4 -:10DC80000146BDE8F00358307EE7A0F8581080F850 -:10DC90005E1080F85F1080F8631080F8641080F8E0 -:10DCA000651080F8661080F85A1080F85B1080F8D4 -:10DCB0005C1080F85D1080F87110A0F8741080F886 -:10DCC0007A10A0F87C10A0F8821080F88610A0F8D6 -:10DCD000881080F88A1080F86F1080F8701080F833 -:10DCE000671080F8681080F88B1080F88C1080F82E -:10DCF0008E10F52280F89420092280F89520A0F853 -:10DD0000801080F89710A0F8D010A0F8D210A0F8DA -:10DD1000D410A0F8D610A0F8D810A0F8DA1080F827 -:10DD2000DD1080F8DF10A0F8E61080F8E410A0F80D -:10DD3000F810A0F8FA1080F82C1001844FF00108B8 -:10DD400080F8518080F852804FF4486242801B2254 -:10DD5000028742874FF4A473C38783870286428673 -:10DD6000C3868386A0F8442000E045E0A0F8463052 -:10DD7000A0F84020A0F84230A0F84820A0F84A209F -:10DD8000A0F84C2080F8901180F8981080F89A1133 -:10DD900080F8691180F86E1180F87111D0F80D20AB -:10DDA0006FF01F03140C03EA92271F2600231A4664 -:10DDB0004FEA030C83EA0405ED431543B5F1FF3F39 -:10DDC00015D007F001055B0843EAC53306F00105ED -:10DDD00052087F0876080CF1010C42EAC532BCF10A -:10DDE000160FE7D380F86811BDE8F003704780F89C -:10DDF0006881BDE8F0037047A0F8E61080F8DE10F7 -:10DE00004288FE4B1344B3FBF2F3A0F876304BF696 -:10DE10008033A0F87830C488A0F87C10B0F8801067 -:10DE200000F15803514391FBF2F1A0F88010E1009A -:10DE3000B1FBF2F1491C89B201FB02F4A0F87E109B -:10DE4000B4F5C84FC4BF491ED984BCFBF2F1491CCC -:10DE5000998502F5802101F5EE31A1F1010CBCFBA1 -:10DE6000F2F1D983B3F81CC00CFB02F1B1FBF2F163 -:10DE7000998305E7A0F8E61000F158024488B0F84D -:10DE80008A31B0F88E019184118DC0006143B0FBDE -:10DE9000F3F091FBF3F1401C118580B200FB03F11C -:10DEA000D084B1F5C84FC4BF401ED084BCFBF3F092 -:10DEB000401C9085108C03EBC000401EB0FBF3F0BB -:10DEC000D083908B6043B0FBF3F09083BDE8F00308 -:10DED00070470A4630B40021032A0DD04FF4FA4CA3 -:10DEE000002A7ED0012A7BD0022A1CBF30BC70479A -:10DEF000014630BC583047E6A0F8581080F85E1054 -:10DF000080F85F1080F8631080F8641080F8651066 -:10DF100080F8661080F85A1080F85B1080F85C106A -:10DF200080F85D1080F87110A0F8741080F87A10F5 -:10DF3000A0F87C10A0F8821080F88610A0F8881055 -:10DF400080F88A1080F86F1080F8701080F86710E1 -:10DF500080F8681080F88B1080F88C1080F88E1094 -:10DF6000F52280F89420092280F89520A0F88010EE -:10DF700080F89710A0F8D810202280F8DA2080F8D6 -:10DF8000D010C0F8D41080F82C10012280F8512055 -:10DF900080F852201B22028742874FF4A473C38764 -:10DFA000838702864286C3868386A0F84420A0F831 -:10DFB0004630A0F84020A0F84230A0F84820A0F851 -:10DFC0004A20A0F84C2080F8081180F8981080F8BA -:10DFD000121180F8F01080F8001130BC704700E09A -:10DFE00039E04288854B1344B3FBF2F3A0F8763056 -:10DFF0004BF68033A0F87830C488A0F87C10B0F8D5 -:10E00000801000F15803514391FBF2F1A0F8801009 -:10E01000E100B1FBF2F1491C89B201FB02F4A0F866 -:10E020007E10B4F5C84FC4BF491ED984BCFBF2F1C1 -:10E03000491C998502F5802101F5EE31A1F1010C11 -:10E04000BCFBF2F1D983B3F81CC00CFB02F1B1FBAD -:10E05000F2F199834CE7D0F8F84000F15802438878 -:10E060006089E4899184118D594391FBF0F1118508 -:10E07000E100B1FBF0F1491C89B201FB00F4D1844D -:10E08000B4F5C84FC4BF491ED184BCFBF0F1491C94 -:10E090009185118C00EBC101491EB1FBF0F1D183D8 -:10E0A000918B5943B1FBF0F0908330BC7047837D76 -:10E0B0000BB1252B01D912207047002A04BF002084 -:10E0C000704770B490F817C00C7E4D4D04FB02C22F -:10E0D0002C464FF0000CE2FB054C4FEA1C1C6FF085 -:10E0E00024040CFB0422D2B201EBD20CC27502F064 -:10E0F00007059CF808C0012404FA05F51CEA050F81 -:10E1000018BF02762CD1B2FBF3FC03FB1C22521C7D -:10E11000D2B24FF0000C00BF00EB0C035B7C9342CB -:10E120003CBFD21AD2B20ED301EB0C0500232D7ADC -:10E1300004FA03F635421CBF521ED2B26AB15B1C10 -:10E14000DBB2082BF4D30CF1010303F0FF0CBCF19C -:10E15000050FE1D370BC1F20704703EBCC010176A3 -:10E1600070BC00207047274A016812681140264A97 -:10E17000126811430160704730B42449214B0024D8 -:10E180004FF0010C0A78521CD2B20A70202A08BF44 -:10E190000C700D781A680CFA05F52A42F2D009784D -:10E1A00002680CFA01F15140016030BC70470179FE -:10E1B00031F01F0113BF002000221146704710B438 -:10E1C000435C03F0010C5B0803F00104A4445B080A -:10E1D00003F00104A4445B0803F00104A4445B08B9 -:10E1E00003F00104A4445B0803F00104A4445B08A9 -:10E1F00003F00104A4440CEB530309E0FFDB05002A -:10E2000053E4B36EB40F0200B80F02007A0100208D -:10E210001A44491CD2B20529D2DB012A8CBF012045 -:10E22000002010BC704730B40022A1F1010CBCF1F9 -:10E23000000F11DD431E11F0010F08BF13F8012F6D -:10E240005C785FEA6C0C07D013F8025F22435C78BD -:10E250002A43BCF1010CF7D1491E5CBF405C02436C -:10E26000002A0CBF0120002030BC7047130008BFFB -:10E27000704710B401EB030CD41A1CF801CC5B1EE0 -:10E2800000F804C013F0FF03F4D110BC7047F0B5E0 -:10E290008DB0164610251C466A46AC4600EB0C03B2 -:10E2A000A5EB0C0713F8013CD355ACF1010313F0B7 -:10E2B000FF0CF3D115461032102084460B18ACEB3E -:10E2C000000713F8013C401ED35510F0FF00F5D1B4 -:10E2D000284601F0DDFA86B1102005F12002014642 -:10E2E0001318A1EB000C13F8013C401E04F80C308D -:10E2F00010F0FF00F4D10DB0F0BD0898206009982F -:10E3000060600A98A0600B98E0600DB0F0BD38B571 -:10E3100005460C466846F5F7FEFC002808BF38BDE8 -:10E320009DF90020227294F909100020511A48BF6B -:10E33000494295F82D308B42C8BF38BDFF2B08BF2E -:10E3400038BDA17A491CC9B2A17295F82E30994204 -:10E3500003D8617A7F2918BF38BD62720020A0728D -:10E36000012038BD0C2950D2DFE801F006090E1358 -:10E37000161B323C3F4D4248002A48D045E0022A55 -:10E3800018BF032A43D040E0072A18BF062A3ED010 -:10E390003BE0082A3BD038E0A2F10C000D2836D92A -:10E3A00033E023B1A2F10D000C2830D92DE00F2A63 -:10E3B00018BF0E2A2BD090F8340020B10F2A24D396 -:10E3C000182A24D921E0132A1FD3182A1FD91CE0A8 -:10E3D000A2F10C0103291AD990F83400A8B1192A26 -:10E3E00015D912E0092A12D00FE0012A0FD00CE053 -:10E3F0001A2A1CBF1B2A1C2A09D006E0A2F11D0004 -:10E40000042804D901E00A2A01D000207047012025 -:10E4100070472DE9F04187680D4604462046F3F722 -:10E4200004FD98B1D5B13846A168F3F743FF002841 -:10E4300014DD401EB0FBF5F0461C06FB05F1384626 -:10E44000F3F75FF8A0603046BDE8F081F3F74AFBD0 -:10E4500040F22E71F3F755F8A060DFE70020BDE829 -:10E46000F081904228BF704770B50446101B6428A5 -:10E4700038BF642025188D4205D8F3F742FF0028E5 -:10E480001CBF284670BD204670BD032918BF7047C9 -:10E49000B0F5296F38BF4FF4296070470246808E6F -:10E4A000032918BF7047D18E92F85230032B04D144 -:10E4B000B1F5296F38BF4FF42961538840F2E24C1F -:10E4C00003FB0CF3528E4FF4747C0CEB821C8C45D6 -:10E4D0009CBF910101F57471591AA1F5967188429A -:10E4E00028BF0846B0F5296F38BF4FF42960704740 -:10E4F000CA8EB2F5296F38BF4FF42962498E4FF4A6 -:10E50000747303EB811393429CBF890101F574720C -:10E5100091B200280CBF0120002001F6283100280C -:10E5200018BF0420084470472DE9F00191F85160AC -:10E530000A8E4FF47477032E04BF07EB821294B255 -:10E5400006D0022E07BF92003C32D200703294B245 -:10E55000CB8E4D8E8A8E91F852C0032E16D0A242D9 -:10E5600028BF224692B2BCF1030F04BF07EB85110E -:10E5700089B207D0BCF1020F07BFA9003C31E90006 -:10E58000703189B2BCF1030F26D120E01E46BCF1E8 -:10E59000030F04D1B6F5296F38BF4FF429664988B7 -:10E5A00040F2E24801FB08F107EB8518B0459CBF3B -:10E5B000AE0106F57476891BA1F596718A4228BFD3 -:10E5C0000A46B2F5296F38BF4FF42962C7E7B3F5A1 -:10E5D000296F38BF4FF429638B4228BF0B460028B0 -:10E5E0000CBF01210021D0189830002918BF042148 -:10E5F0000844BDE8F001704770B48388B0F808C0E3 -:10E6000003EB0C049834002A18BF042222444C6AFD -:10E61000944224BF70BC7047121B0124521E04EBAD -:10E6200052029B1A9BB2ACEB0202838092B202812F -:10E6300091F851506FF00E06741C4FF0000C032D32 -:10E640001AD0022D0EBF06EB930304EBD3039BB24B -:10E650001DD0438091F8521003291AD002290EBF11 -:10E6600006EB920104EBD2011FFA81FC1BD000BF24 -:10E67000A0F806C070BC7047B3F5747F38BF63461E -:10E68000E7D3503BDD1703EB956304EBA3139BB279 -:10E69000DFE7B2F5747FEBD3A2F15001CA1701EBAB -:10E6A000926104EBA1111FFA81FCE1E7F8B5054680 -:10E6B0000E46084600F027FC0446304600F027FCD2 -:10E6C000014610F0010F18BF012008D111F0020F10 -:10E6D00018BF022003D111F0040018BF03208DF8E9 -:10E6E000000014F0010F18BF012208D114F0020F2E -:10E6F00018BF022203D114F0040218BF03228DF8C0 -:10E70000012011F0070F08BF00208DF8000014F061 -:10E71000070F08BF00228DF8012095F8511088429C -:10E7200008BF00208DF8000095F85200824208BF13 -:10E7300000228DF80120BDF80000F8BD012814BFAB -:10E740000228704703280CBF04200020704718B42B -:10E75000CBB2C1F3072CC1B2C0F30720012B07D005 -:10E76000022B09D0042B08BFBCF1040F23D006E014 -:10E77000BCF1010F03D11EE0BCF1020F1BD0012937 -:10E7800006D0022907D0042908BF042813D004E0CA -:10E79000012802D10FE002280DD001EA0C0161F33B -:10E7A0000702184060F30F22D0B210F0020F18BF1A -:10E7B000022010D106E0084003EA0C01084060F393 -:10E7C0000702EFE710F0010F18BF012003D110F08E -:10E7D000040018BF03208DF80000C2F3072010F0DA -:10E7E000020F18BF022008D110F0010F18BF01203E -:10E7F00003D110F0040018BF03208DF80100BDF80C -:10E80000000018BC7047072816BF08280120002008 -:10E8100070470000282102F028B830B5054600787E -:10E8200001F00F0220F00F0010432870092910D2C8 -:10E83000DFE801F0050705070509050B0D000624B3 -:10E8400009E00C2407E0222405E0012403E00E2463 -:10E8500001E00024FFDF6C7030BD007800F00F0095 -:10E8600070470A68C0F803208988A0F8071070472D -:10E87000D0F803200A60B0F80700888070470A6863 -:10E88000C0F809208988A0F80D107047D0F8092039 -:10E890000A60B0F80D00888070470278402322F0AB -:10E8A000400203EA81111143017070470078C0F300 -:10E8B000801070470278802322F0800203EAC111A1 -:10E8C0001143017070470078C0097047027802F068 -:10E8D0000F02072A16BF082AD0F80520D0F8032017 -:10E8E000C1F809200CBFB0F80920B0F80720A1F842 -:10E8F0000D200A7822F080020A700078800942EA2E -:10E90000C0100870704770B515460E4604461F2AA1 -:10E9100088BFFFDF2A46314604F1090001F02EFFCF -:10E92000A81D607070BD70B544780E460546062C73 -:10E9300038BFFFDFA01F84B21F2C88BF1F242246D0 -:10E9400005F10901304601F019FF204670BD70B590 -:10E9500015460E4604461F2A88BFFFDF2A46314669 -:10E9600004F1090001F00AFFA81D607070BD70B5C8 -:10E9700044780E460546062C38BFFFDFA01F84B240 -:10E980001F2C88BFFFDF224605F10901304601F048 -:10E99000F5FE204670BD0968C0F80F1070470A8860 -:10E9A000A0F813208978417570474176090A81766D -:10E9B0007047C176090A017770474177090A817764 -:10E9C0007047C175090A017670478175704790F8E4 -:10E9D000242001F01F0122F01F02114380F82410AF -:10E9E0007047072988BF072190F82420E02322F0F0 -:10E9F000E00203EA4111114380F8241070471F30F0 -:10EA000002F05FB8C17811F03F0F1BBF027912F01E -:10EA1000010F0022012211F03F0F1BBF037913F0F9 -:10EA2000020F002301231A4402EB4202530011F0AB -:10EA30003F0F1BBF027912F0080F0022012203EBE7 -:10EA4000420311F03F0F1BBF027912F0040F0022A6 -:10EA50000122134411F03F0F1BBF027912F0200F67 -:10EA60000022012202EBC20203EB420311F03F0F2E -:10EA70001BBF027912F0100F0022012202EB4202AA -:10EA80001A4411F03F0F1BBF007910F0400F002017 -:10EA90000120104410F0FF0014BF012100210844A0 -:10EAA000C0B2704710B50278417802F00F02082A10 -:10EAB0002ED2DFE802F004080B2D2D2D0F13881F36 -:10EAC0001F2823D924E00C2920D021E0881F1F28EB -:10EAD0001CD91DE0881F1F2818D919E04B1E242BB4 -:10EAE00016D80024072A18BF082A01D0204610BDD6 -:10EAF000C2789309032BF9D002F03F0C0CF101020C -:10EB00008A42F3D8FFF77EFF6045EFD8012010BDA1 -:10EB1000002010BD0278417802F00F02082A02BFDF -:10EB20000E29C0785FEA901005D0042A05D1062985 -:10EB300003D3252901D8012070470020704710B465 -:10EB4000017801F00F01032920D0052921D1447853 -:10EB5000B0F81910B0F81BC0B0F81730827D222C25 -:10EB600017D1062915D3B1F5486F98BFBCF5FA7FC8 -:10EB70000FD272B1082A98BF8A420AD28B429CBF38 -:10EB8000B0F81D00B0F5486F03D805E040780C28B8 -:10EB900002D010BC0020704710BC01207047222119 -:10EBA00001F063BE00B5027801F0030322F0030216 -:10EBB0001A43027000224270012914BF022900BDCD -:10EBC000032912BFFFDF0121417000BD01F00303E3 -:10EBD00000B5027822F003021A430270002242704C -:10EBE000012914BF022900BD032912BFFFDF012143 -:10EBF000417000BD007800F00300704702781023D8 -:10EC000022F0100203EA01111143017070474178AC -:10EC1000F9B1C078192850D2DFE800F00D101316B2 -:10EC2000191C1F2225282B2E31344F4F4F4C373AB9 -:10EC30003D40434649000C2941D042E008293ED0DE -:10EC40003FE002293BD03CE0172938D039E00D29BC -:10EC500035D036E0012932D033E001292FD030E021 -:10EC600002292CD02DE0092929D02AE0092926D013 -:10EC700027E0012923D024E0012920D021E0062922 -:10EC80001DD01EE002291AD01BE0012917D018E080 -:10EC9000012914D015E0092911D012E009290ED05C -:10ECA0000FE003290BD00CE0032908D009E0052967 -:10ECB00005D006E0032902D003E0FB2901D801209A -:10ECC00070470020704730B50546C170192922D21F -:10ECD000DFE801F00D0F1113151717111919171788 -:10ECE0001B112121211D171719191D1D1F000C248F -:10ECF00013E0082411E002240FE017240DE00D2496 -:10ED00000BE0012409E0092407E0062405E00324C0 -:10ED100003E0052401E00024FFDF6C7030BDC07803 -:10ED20007047C171090A01727047B0F80700704757 -:10ED30004172090A81727047B0F809007047C172C8 -:10ED4000090A01737047B0F80B0070474171090A56 -:10ED500081717047B0F80500704701717047007904 -:10ED600070474173090A81737047B0F80D0070470E -:10ED700030B4B0F807207E4DB0F809C0B0F80530C7 -:10ED80000179941F2D1998BFBCF5FA7F0ED269B195 -:10ED9000082998BF914209D293429FBFB0F80B0057 -:10EDA000B0F5486F012030BC98BF7047002030BCE0 -:10EDB0007047001D01F085BE021D0846114601F096 -:10EDC00080BE4172090A81727047B0F8090070472D -:10EDD00001717047007970470A6842604968816034 -:10EDE000704742680A60806848607047098881817E -:10EDF00070478089088070470A68C0F80E2049680B -:10EE0000C0F812107047D0F80E200A60D0F8120037 -:10EE1000486070470968C0F816107047D0F81600AF -:10EE2000086070470A6842604968816070474268BC -:10EE30000A608068486070470968C1607047C068B0 -:10EE400008607047017170474171090A817170470C -:10EE5000C171090A0172704700797047B0F8050066 -:10EE60007047B0F80700704701717047007970472C -:10EE700001717047007970470A6842604968816093 -:10EE8000704742680A608068486070470171090AEB -:10EE9000417170478171090AC17170470172090A95 -:10EEA000417270478172090AC17270478088704749 -:10EEB000C0887047008970474089704701891B29C5 -:10EEC00024BF4189B1F5A47F07D381881B2921BFC5 -:10EED000C088B0F5A47F01207047002070470A6801 -:10EEE000426049688160704742680A608068486093 -:10EEF00070470171704700797047417170474079E0 -:10EF000070470171704700797047417170474079CF -:10EF100070478171090AC1717047C088704715A296 -:10EF200082B0D2E90012CDE900120179407901F0F6 -:10EF3000070269461DF80220012A07D800F00700E1 -:10EF4000085C01289EBF012002B07047002002B07B -:10EF5000704701717047007970474171704730B553 -:10EF60000C460546FB2988BFFFDF6C7030BD0000F2 -:10EF700086F3FFFF000101020102020370B504469F -:10EF8000C2F11005281901F0F9FB15F0FF0108D0B6 -:10EF9000491EC9B2802060542046BDE8704001F08F -:10EFA00064BC70BD30B505E05B1EDBB2CC5CD55CEB -:10EFB0006C40C454002BF7D130BD10B5002409E0DB -:10EFC0000B78521E44EA430300F8013B11F8013B61 -:10EFD000D2B2DC09002AF3D110BD2DE9F0410C4674 -:10EFE00001200978FF4E92B0154602274FF006081F -:10EFF0004FF0040C71B101291ED0022945D003291C -:10F0000005D12978042902D105201070002012B002 -:10F01000BDE8F081606850B1CDE9010601202070A3 -:10F020008DF80080606A04901146684663E027709E -:10F0300085F800C0566026E029780429E7D1696880 -:10F0400010222069FFF7B9FF6868C07B000606D56B -:10F05000E44A2069102310320146FFF7A3FFD4E9E8 -:10F0600004101022FFF7A9FF2069C07B000606D517 -:10F07000DC4A6069102310320146FFF793FF2770C6 -:10F0800085F800C06E600320C1E729780429BED14D -:10F09000A08910280CD9A0F1100080B2A081A1682D -:10F0A0004FF01003014468466A68FFF77BFF18E0E1 -:10F0B00004D14FF010032269A16807E0C2B20DA885 -:10F0C000A168FFF75BFF626910230DA909A8FFF78C -:10F0D00069FF102309A968466A68FFF763FF0320E8 -:10F0E000207060680590CDF818D08DF81080606AA7 -:10F0F0000890294604A8F1F7FBFF88E72DE9F041C5 -:10F1000007460D4601200B7806213BB1012B04D1A7 -:10F110001378052B01D11170002079E76C69012665 -:10F1200020226170E8686060686A6062A168287C7B -:10F130000870A681A068A968401C01F01FFBA08987 -:10F1400020222030A081A0686968213001F016FBE0 -:10F15000A08921462030A0812E703846BDE8F041BC -:10F16000F1F7DDBF2DE9F05F0D46834601200978F8 -:10F17000174606464FF00608D1B1DFF868A24FF0F7 -:10F180000009AAF1080A012923D002297ED0032907 -:10F190000CD13978052909D179681022E86901F084 -:10F1A000EDFA07203870183500207D60BDE8F09F2B -:10F1B0002C6A8C48202284F8018020306060202056 -:10F1C000A081686A60626968A06801F0D7FA2E7051 -:10F1D000D4E039780529E9D12C6A84F80180686A7D -:10F1E000606251681022E86901F0C8FAE86960605D -:10F1F000A0684F4680F80090A681A0684670A0895C -:10F20000401C80B2A081A1680844696951F8012FAF -:10F21000026089888180A089801D80B2A08169698F -:10F22000A2680978C1F340011154A089401C80B242 -:10F23000A081A1680844296951F8012F02608988DA -:10F240008180A089801D80B2A0812969A268097887 -:10F25000C1F340011154A0891022401C80B2A0814A -:10F26000A1680844E96801F089FAA08910221030E9 -:10F2700080B2A081A1680844A96801F07FFAA08942 -:10F28000103080B2A081A168014400E00DE0DAF8FE -:10F2900004000860A089001D80B2A081A1680F54FD -:10F2A000A089401CA081022067E03978052992D10D -:10F2B00051681022A86901F061FA2C6A84F8018073 -:10F2C000E8696060686A6062A16881F80090A68160 -:10F2D000A0684670A089401C80B2A081A168084443 -:10F2E000696951F8012F026089888180A089801D99 -:10F2F00080B2A0816969A2680978C1F34001115404 -:10F30000A089401C80B2A081A1680844296951F8F5 -:10F31000012F026089888180A089801D80B2A08130 -:10F320002969A2680978C1F340011154A08910220B -:10F33000401C80B2A081A1680844E96801F01EFA6F -:10F34000A0891022103080B2A081A1680844A96869 -:10F3500001F014FAA089103080B2A081A1680144A4 -:10F36000DAF804000860A089001D80B2A081A168BD -:10F370000E54A089401CA0810320287021465846C5 -:10F38000BDE8F05FF1F7CBBE70B50D4606460978D3 -:10F39000012041B1012905D11178052902D10820A8 -:10F3A0001070002070BD2C6A062060706968616072 -:10F3B000696A6162EA69A16852F8013F0B6092884C -:10F3C0008A80A081E869A1680078C0F34000887154 -:10F3D000A089401C80B2A081A1680844A96951F8A5 -:10F3E000012F01E0C40F0200026089888180A0899A -:10F3F000801D80B2A081A969A2680978C1F340018B -:10F400001154A089401C80B2A081A1680844696998 -:10F410000A88028089788170A0891022C01C80B27D -:10F42000A081A1680844296901F0A8F9A0891022E7 -:10F43000103080B2A081A1680844E96801F09EF90B -:10F44000A0891022103080B2A081A1680844A96868 -:10F4500001F094F9A08921461030A0810120287084 -:10F460003046BDE87040F1F75ABE70B50D4606460D -:10F470000978012059B1012908D11178052905D150 -:10F4800009201070506800685060002070BD6C69E1 -:10F49000062010226070E8686060686A606229690E -:10F4A000A06801F06BF91020A081A0682022103024 -:10F4B000A96801F063F9A0892022203080B2A081E0 -:10F4C000A1680844696801F059F9A08921462030F3 -:10F4D000A081012028703046BDE87040F1F71FBEC2 -:10F4E00070B50C46012009788EB01546062659B134 -:10F4F000012934D0022905D12978042902D10A2012 -:10F50000107000200EB070BD606910236A4600784C -:10F51000C0F340008DF80000A0690078C0F34000FF -:10F520008DF80100E0680168CDF802108188ADF81F -:10F53000061080798DF8080020690168CDF809105F -:10F540008188ADF80D1080798DF80F006068059006 -:10F5500009A80690A168FFF725FD01201DE0297884 -:10F560000429CFD1A06910236A4650F8011F0091E9 -:10F570008088ADF80400606950F8011FCDF80610CE -:10F580008088ADF80A00002003906068059009A803 -:10F5900006906968FFF706FD022020708DF8106064 -:10F5A000606A0890294604A8F1F7A2FDAAE700B511 -:10F5B0000B7889B001204BB1012B05D111780429BA -:10F5C00002D10B201070002009B000BD48680190E6 -:10F5D00005A80290C868036805934068069088688B -:10F5E00003680793406808900120087006208DF892 -:10F5F0000000486A049011466846F1F779FDE3E798 -:10F6000000B50B7889B0012043B1012BDCD1117812 -:10F610000429D9D10C2010700020D5E7486801904A -:10F6200005A802908868036805934068069000204A -:10F63000079008900120087006208DF80000486AA5 -:10F64000049011466846F1F753FDBDE700B50B780D -:10F6500089B0012043B1012BB6D111780429B3D16F -:10F660000D2010700020AFE748680590CDF818D045 -:10F6700088680088ADF80000C8680088ADF802000E -:10F6800000200190029003900120087006208DF860 -:10F690001000486A0890114604A8F1F729FD93E785 -:10F6A00030B403460C7801205CB1012C15D0022C3B -:10F6B00005D111780C2902D10E201070002030BC29 -:10F6C000704701200870C868042242704A6842608E -:10F6D0000B4A8260921EC2600BE014780D2CEED1B2 -:10F6E00002200870C86803244470526842608A6827 -:10F6F0008260496A4162014630BC1846F1F70FBD8D -:10F70000BE0F02002DE9F0410C4611490D68104A68 -:10F71000104908321160A0F120012A2901D30120EB -:10F720000CE03E2810D040CC0B4F94E80E0007EBC5 -:10F730008000241F50F8807C3046B8472060044881 -:10F74000001D0560BDE8F0812046E1F739FDF5E7D1 -:10F750001005024001000001F40F020010B55248EC -:10F7600000F02AFA00B1FFDF4F48401C00F024FAF5 -:10F77000002800D0FFDF10BD2DE9F14F4B4ED6F829 -:10F7800000B00127484800F01FFADFF81C8128B9B3 -:10F790005FF0000708F1010000F02CFA444C00254E -:10F7A0004FF0030901206060C4F80051C4F804510F -:10F7B000009931602060DFF8FCA018E0DAF8000062 -:10F7C000C00614D50E2000F064F8EFF3108010F09E -:10F7D000010072B600D00120C4F80493D4F80011DF -:10F7E00019B9D4F8041101B920BF00B962B6D4F830 -:10F7F000000118B9D4F804010028DFD0D4F80401BE -:10F800000028CFD137B1C6F800B008F1010000F0F0 -:10F81000DBF911E008F1010000F0D6F90028B9D1B8 -:10F82000C4F80893C4F80451C4F800510E2000F045 -:10F8300030F81D4800F0DEF90020BDE8F88F2DE912 -:10F84000F0438DB00D46064600240DF110090DF170 -:10F85000200817E004EB4407102255F827106846EB -:10F8600000F08CFF05EB870710224846796800F00E -:10F8700085FF6846FFF780FF10224146B86800F018 -:10F880007DFF641CB442E5DB0DB00020BDE8F083D1 -:10F8900072E700F01F02012191404009800000F151 -:10F8A000E020C0F8801270477B01002004E5004092 -:10F8B00000E0004010ED00E0B548002101708170CB -:10F8C000704770B5B34D01232B60B34B1C68002CFF -:10F8D000FCD0002407E00E6806601E68002EFCD0F5 -:10F8E000001D091D641C9442F5D30020286018688F -:10F8F0000028FCD070BD70B5A54E0446A74D3078E9 -:10F90000022800D0FFDFAC4200D3FFDF7169A448BA -:10F91000012903D847F23052944201DD032242719B -:10F92000491C7161291BC1609D497078F2F7CBFABF -:10F93000002800D1FFDF70BD70B5954C0D46617891 -:10F94000884200D0FFDF954E082D4ED2DFE805F04B -:10F950004D0421304D4D4D3B2078022800D0FFDF73 -:10F9600003202070A078022802D0012804D008E0EB -:10F97000A06800F0FDFB04E004F1080007C8FFF7F1 -:10F98000A0FF052020700020A070BDE87040F1F7B6 -:10F99000B4BFF2F7A7F801466068F2F78BFCB042FB -:10F9A00002D2616902290BD30320F2F7E7FE12E0CD -:10F9B000F2F798F801466068F2F77CFCB042F3D2A7 -:10F9C000BDE8704097E7207802280AD0052806D0C5 -:10F9D000FFDF04202070BDE8704000F0CEB80220A8 -:10F9E00000E00320F2F7CAFEF3E7FFDF70BD70B559 -:10F9F0000546F2F777F8664C60602078012800D061 -:10FA0000FFDF674901200870002008718D60042025 -:10FA100048716248C860022020706078F2F753FA9B -:10FA2000002800D1FFDF70BD10B5594CA07808B98F -:10FA3000207808B1112010BD5A48F1F7D9FF607045 -:10FA40006078202804D0012020700020606110BD63 -:10FA5000032010BD002070472DE9F041144600EB53 -:10FA600084070E4605463F1F00F095FB4FF080527D -:10FA70001169484306EB8401091FB14201D20121FB -:10FA800000E000211CB11269B4EB920F02D90920E9 -:10FA9000BDE8F081444A95420ED3AF420CD3854273 -:10FAA00005D2874203D245EA0600800701D0102024 -:10FAB000EEE7964200D309B10F20E9E73B483C4905 -:10FAC0000068884205D0224631462846FFF7F9FEF5 -:10FAD00010E0FFF7A9FF0028DAD12D480121856049 -:10FAE000C0E9036481704FF4A97104FB01F0183080 -:10FAF000FFF77DFF0020CBE770B54FF0805504463F -:10FB000028692949B1FBF0F0844201D20F2070BD71 -:10FB100000F041FBA04201D8102070BD28692348A5 -:10FB200023490068884204D02869604300F020FB24 -:10FB30000CE0FFF779FF0028EFD1296914486143F1 -:10FB40008160022181701B48FFF751FF002070BDCA -:10FB50001548010B01208840401E704770B50D46C6 -:10FB60000446FFF7F5FF204201D00F2070BD294663 -:10FB70002046BDE8704000F0B4BD10B5044C60787C -:10FB8000F1F791FF00B9FFDF00202070A07010BDD9 -:10FB90008001002004E5014000E40140105C0C00FD -:10FBA0006C12002039F9010000200200A0000020A2 -:10FBB000BEBAFECA7C5E0100002101700846704793 -:10FBC0000146002008707047EFF3108101F0010139 -:10FBD00072B60278012A01D0012200E0002201233E -:10FBE000037001B962B60AB1002070474FF40050AB -:10FBF0007047E9E7EFF3108111F0010F72B64FF093 -:10FC00000002027000D162B600207047F2E70000E7 -:10FC10004C4909680160002070474A49086000208B -:10FC2000704701218A0720B1012804D042F2040064 -:10FC30007047916700E0D16700207047424901207A -:10FC4000086042F20600704708B504233E4A1907CF -:10FC5000103230B1C1F80433106840F00100106078 -:10FC60000BE0106820F001001060C1F8083300209C -:10FC7000C1F80801354800680090002008BD011F48 -:10FC80000B2909D8304910310A6822F01E0242EAD5 -:10FC9000400008600020704742F2050070470001F4 -:10FCA00000F18040C0F8041900207047000100F105 -:10FCB0008040C0F8081900207047000100F1804022 -:10FCC000D0F80009086000207047012801D90720FA -:10FCD00070471F4A52F8200002680A430260002061 -:10FCE0007047012801D907207047194A52F82000AF -:10FCF00002688A43026000207047012801D907206A -:10FD00007047134A52F820000068086000207047CE -:10FD1000020010494FF0000003D0012A01D0072053 -:10FD200070470A6070474FF080410020C1F8080119 -:10FD30004FF0E020802180F800140121C0F800116C -:10FD4000704700000004004000050040080100402A -:10FD50009C100200780500406249634B0A686349C1 -:10FD60009A42096801D1C1F3100101600020704777 -:10FD70005C495D4B0A685D49091D9A4201D1C0F397 -:10FD800010000860002070475649574B0A685749D1 -:10FD900008319A4201D1C0F310000860002070477A -:10FDA00030B5504B504D1C6842F20803AC4202D0B3 -:10FDB000142802D203E0112801D3184630BDC30035 -:10FDC0004B481844C0F81015C0F81425002030BD69 -:10FDD0004449454B0A6842F209019A4202D006287A -:10FDE00002D203E0042801D308467047404A0121AB -:10FDF00042F83010002070473A493B4B0A6842F203 -:10FE000009019A4202D0062802D203E0042801D355 -:10FE100008467047364A012102EBC00041600020CD -:10FE2000704770B52F4A304E314C156842F20903C5 -:10FE300004EB8002B54204D0062804D2C2F80018B0 -:10FE400007E0042801D3184670BDC1F31000C2F8C2 -:10FE50000008002070BD70B5224A234E244C15685E -:10FE600042F2090304EB8002B54204D0062804D212 -:10FE7000D2F8000807E0042801D3184670BDD2F874 -:10FE80000008C0F310000860002070BD174910B5CD -:10FE90000831184808601120154A002102EBC00300 -:10FEA000C3F81015C3F81415401C1428F6D300200D -:10FEB00006E0042804D302EB8003C3F8001807E02F -:10FEC00002EB8003D3F80048C4F31004C3F80048E1 -:10FED000401C0628EDD310BD0449064808310860CF -:10FEE00070470000A0000020BEBAFECA00F5014025 -:10FEF00000F001400000FEFF754B1B6803B19847FE -:10FF0000BFF34F8F73480168734A01F4E0611143F6 -:10FF10000160BFF34F8FFEE710B572B600F0CEF868 -:10FF200050B1E1F7E7F9F1F7B0FBF2F7CDFBE2F7FB -:10FF30008EFF6A490020086062B6002010BD70B5CF -:10FF40000C46054672B600F0B9F810B162B608204A -:10FF500070BDE1F74BF9E1F7CFF902460020430904 -:10FF60009B0003F1E02300F01F01D3F80031CB40E8 -:10FF7000D9071DD0202803D222FA00F1C90724D1C5 -:10FF800041B2002906DA01F00F0101F1E02191F8F8 -:10FF9000141D03E001F1E02191F80014490908293A -:10FFA00013D291B1012910D004290ED005290CD00B -:10FFB000401C6428D3D3E2F721FF48494848086031 -:10FFC0002046F3F73BF858B903E062B641F201006E -:10FFD00070BD3F4804602DB12846F3F77CF818B196 -:10FFE00010242BE03F4D18E02878022802D94FF466 -:10FFF000805423E007240028687801D058B908E02D -:020000040002F8 -:10000000E0B120281AD8A878212817D8012815D0BF -:1000100003E0A87808B162B612E03349802081F885 -:10002000140DE1F769F92946F2F734FBF1F7EBFA21 -:1000300000F0E4F82846E1F72FF9044662B61CB157 -:10004000FFF76AFF204670BD002070BD10B5044662 -:1000500000F034F800B101202070002010BD2349C9 -:1000600008600020704770B50C4621490D68204992 -:10007000204E08310E60102807D011280CD012280D -:100080000FD0132811D0012013E0D4E90001FFF7AD -:1000900056FF354620600DE0FFF73EFF002520604B -:1000A00008E02068FFF7D2FF03E0104920680860ED -:1000B000002020600E48001D056070BD07480849FB -:1000C0000068884201D1012070470020704700007D -:1000D000980100200CED00E00400FA05A0000020CB -:1000E000BEBAFECAA41002000BE000E0040000202B -:1000F00010050240010000012DE9F04184B088465E -:100100000746FEF777FD05467E786A4601A9404618 -:10011000EFF7F4FA04000ED0012D1EBF032004B047 -:10012000BDE8F08102AA40460199EFF7E6F902988E -:10013000B0F803000AE0022D14D1042E12D3B7F850 -:100140000300BDF80020011D8A420BD3001D80B2C0 -:10015000A119814238BF012008BF00209CBF04B014 -:10016000BDE8F0814FF0020004B0BDE8F08100006E -:100170000B4A022111600B490B68002BFCD0084B85 -:100180001B1D186008680028FCD00020106008685B -:100190000028FCD070474FF0805040697047000045 -:1001A00004E5014000E4014002000B464FF000006E -:1001B000014620D0012A04D0022A04D0032A0DD1FE -:1001C00003E0012002E0022015E00320072B05D206 -:1001D000DFE803F00406080A0C0E10000720704741 -:1001E000012108E0022106E0032104E0042102E0ED -:1001F000052100E00621F1F718BC0000FB480521AD -:100200008170002101704170C17081607047F849B0 -:100210000A78012A06D0CA681044C860C868323813 -:10022000F2F715B88A68104488608868F7E710B557 -:10023000EE4CE078F1F737FC00B9FFDF0820F2F769 -:100240009DFA0520A07000202070607010BD03781A -:10025000E849E94A13B1012B0ED011E00379012BD3 -:1002600000D06BB943790BB1012B09D18368643B92 -:100270008B4205D2C0680EE00379012B02D00BB18E -:100280000020704743790BB1012BF9D1C368643B5F -:100290008B42F5D280689042F2D8012070472DE958 -:1002A000F04104460227F1F7F4FE006800B1FFDFD9 -:1002B000CE4D01263CB12078B0B1012805D00228EE -:1002C00010D0032813D02E710CE06068C82807D323 -:1002D000F2F717F820B16068FFF799FF012703E0F4 -:1002E000002701E000F0CCF93846BDE8F08128781D -:1002F0000028F7D16068FFF7AAFF0028E3D0606804 -:10030000DFF8EC82007828B3A878042800D0FFDF5B -:100310000020464688F8000060680079C8B30020D5 -:10032000307160684079A8B304207071606881689A -:10033000E868F1F7E6F8B0606068C0683230F060F5 -:100340000320A870AA49E878F1F7BDFD0028C9D1BB -:10035000FFDFC7E7404688F8006061680979D1B1DE -:100360000021017161684979B9B104214171616865 -:100370008968323181606168C968C160C0689B4C1E -:1003800014346060F1F7AEFB20606E700220A8703C -:10039000A8E704E005E00321E3E70321E6E7012005 -:1003A000BEE70320C1E72DE9F047904C8846E1788D -:1003B000884200D0FFDFDFF83492002501278C4E01 -:1003C00009F11409B8F1080F79D2DFE808F0040D3B -:1003D0002A557E849199A078032803D0A07802281A -:1003E00000D0FFDFBDE8F087A078032803D0A07815 -:1003F000022800D0FFDF0420A0702571207800289B -:100400007AD1FFF704FF3078012806D0B068E060A9 -:1004100000F07BF92061002062E0E078F1F781FCD8 -:10042000F5E7A078032803D0A078022800D0FFDFEA -:10043000207800286FD1A078032816D0F1F752FB5E -:1004400001464F46D9F80000F1F734FF00280EDBD3 -:10045000796881420BDB081AF0606549E078F1F7B2 -:1004600032FD0028BED1FFDFBCE7042029E00420D4 -:10047000F2F784F9A570B5E7A078032803D0A07837 -:10048000022800D0FFDF207888BBA078032817D08F -:10049000F1F728FB01464F46D9F80000F1F70AFFB3 -:1004A0000028E4DB79688142E1DB081AF0605049FA -:1004B000E078F1F708FD002894D1FFDF92E740E0F3 -:1004C0000520F2F75BF9A7708CE7A078042800D02C -:1004D000FFDF022004E0A078042800D0FFDF012025 -:1004E000A1688847FFF7DBFE054630E004E012E034 -:1004F000A078042800D0FFDFBDE8F04700F0C0B8C6 -:10050000A078042805D0607810B1A078022800D027 -:10051000FFDF207810B1BDE8F04788E6207920B1F0 -:100520000620F2F72BF92571CDE7607838B1304914 -:10053000E078F1F7C8FC00B9FFDF657052E70720EB -:10054000BFE7FFDF4EE73DB1012D03D0FFDF022DF6 -:10055000F9D147E70420C3E70320C1E770B50500E0 -:1005600005D0224CA078052803D0112070BD1020A2 -:1005700070BD2248F1F73CFAE070E078202803D003 -:10058000A5600020A07070BD032070BD174810B595 -:10059000017809B1112010BD817805290CD081782E -:1005A00001290BD0817849B101210170817801299D -:1005B00004D0807810B103E00F2010BDFFF737FEA4 -:1005C000002010BD70B5094E0446B07808B101286E -:1005D0000AD1ACB12046FFF73AFE98B12078044D1D -:1005E00090B1B07801282AD00F2070BD9C01002066 -:1005F0007C1200203D860100FF1FA107A703020017 -:100600001020F2E70720F0E701202870207990B150 -:1006100000202871607980B104206871A0683230B0 -:10062000A860E068E860E8681A4C6060F1F75AFA80 -:100630002060022016E00320EBE70320EDE7002016 -:1006400028702079A8B100202871607998B1042021 -:100650006871A168F068F0F754FFA860E068323074 -:10066000E8600320B0700C49F078F1F72CFC28B951 -:1006700003E00320E8E70320EAE7FFDF0020B4E718 -:10068000044810B51438006900F037F8BDE8104090 -:10069000F1F733B9B00100207C1200201F4909682E -:1006A000014201D001207047002070471B49091DFD -:1006B0000968014201D001207047002070471749A6 -:1006C00010310968014201D00120704700207047B5 -:1006D000124914310968014201D0012070470020FD -:1006E000704710B50D4C2060201D01600B48103084 -:1006F0000260001D0360002010BD09490A6848F22D -:1007000002139A4302430A607047054A116848F28F -:10071000021301EA0300994311607047000600408C -:10072000C806024040EA010310B59B070FD1042A16 -:100730000DD310C808C9121F9C42F8D020BA19BAAC -:10074000884201D9012010BD4FF0FF3010BD1AB111 -:10075000D30703D0521C07E0002010BD10F8013B66 -:1007600011F8014B1B1B07D110F8013B11F8014B8D -:100770001B1B01D1921EF1D1184610BD032A40F275 -:10078000308010F0030C00F0158011F8013BBCF133 -:10079000020F624498BF11F801CB00F8013B38BF4B -:1007A00011F8013BA2F1040298BF00F801CB38BF59 -:1007B00000F8013B11F0030300F02580083AC0F077 -:1007C000088051F8043B083A51F804CBA0E808101F -:1007D000F5E7121D5CBF51F8043B40F8043BAFF352 -:1007E0000080D20724BF11F8013B11F801CB48BFAC -:1007F00011F8012B24BF00F8013B00F801CB48BFE2 -:1008000000F8012B704710B5203AC0F00B80B1E81A -:100810001850203AA0E81850B1E81850A0E8185035 -:10082000BFF4F5AF5FEA027C24BFB1E81850A0E83E -:10083000185044BF18C918C0BDE810405FEA827C58 -:1008400024BF51F8043B40F8043B08BF7047D2076F -:1008500028BF31F8023B48BF11F8012B28BF20F810 -:10086000023B48BF00F8012B70474FF000020429FB -:10087000C0F0128010F0030C00F01B80CCF1040CCF -:10088000BCF1020F18BF00F8012BA8BF20F8022B03 -:10089000A1EB0C0100F00DB85FEAC17C24BF00F8A9 -:1008A000012B00F8012B48BF00F8012B70474FF0D7 -:1008B000000200B5134694469646203922BFA0E8B0 -:1008C0000C50A0E80C50B1F12001BFF4F7AF0907BC -:1008D00028BFA0E80C5048BF0CC05DF804EB8900AD -:1008E00028BF40F8042B08BF704748BF20F8022BF0 -:1008F00011F0804F18BF00F8012B7047FEDF042075 -:100900007146084219D10699134A914215DC06999D -:1009100002394878DF2810D10878FE2807D0FF2850 -:100920000BD14FF001004FF000020C4B184741F281 -:1009300001000099019A094B184706980599084B40 -:10094000002B02D01B68DB6818474FF0FF304FF0D8 -:1009500000017246014B184700200200F9FE010019 -:1009600004000020184819497047FFF7FBFFE0F723 -:1009700015FC00BD4FF4805015490968884203D129 -:10098000144A13605B68184700BD000020BFFDE7F4 -:100990004FF480500E490968884210D10E4B1868F8 -:1009A0004FF0FF318842F1D080F308884FF02021CA -:1009B000884204DD0948026802210A4302600848AF -:1009C000804708488047FFDF9012002090120020E7 -:1009D0000000002004000020002002002405004048 -:1009E000B52F00007509020004207146084202D0AC -:1009F000EFF3098101E0EFF308818869023800789C -:100A0000102813DB20280FDB2B280BDB0A4A126887 -:100A10000A4B9A4203D1602804DB094A104702209E -:100A200008607047074A1047074A1047074A12688C -:100A30002C32126810470000A0000020BEBAFECA87 -:100A4000FD12000005F7010067000200040000200D -:100A50000D4B0E4908470E4B0C4908470D4B0B49EF -:100A600008470D4B094908470C4B084908470C4BF0 -:100A7000064908470B4B054908470B4B03490847F4 -:100A80000A4B02490847000071A00000392F0000FE -:100A9000B12C00004D2B0000DB2A0000532D00007C -:100AA000191300009728000035A20000A9110000CA -:100AB0000021016081807047002101604160017266 -:100AC00070470A6802600B7903717047D79600007F -:100AD000EF980000F5990000199A0000539A000061 -:100AE000879A0000CD9A0000FD9A00004F9B0000FD -:100AF000059800008712000087120000C94000001E -:100B00000F41000031410000EB410000274300008D -:100B1000F943000031440000F5440000A73C000008 -:100B2000494700002B4800004B480000BD1500005D -:100B3000E1150000111500006515000013160000F6 -:100B4000A7160000F5600000BB62000063660000AD -:100B50007D670000016800007B680000ED68000010 -:100B6000096A0000D76A0000576B00006548000062 -:100B70006B48000075480000693C00004B490000CC -:100B8000353C0000A94A0000014B0000814B0000E9 -:100B9000871200008712000087120000F72400006F -:100BA0007D25000099250000B525000043270000A1 -:100BB000DF250000E92500002B2600004D2600005F -:100BC000292700006B27000087120000A98400007D -:100BD000C9840000CB840000058500003385000037 -:100BE00021860000AF860000C38600001187000048 -:100BF000F787000099890000C18A00006D7300002A -:100C0000D98A0000871200008712000087120000B6 -:100C10005300000000000000000000000000000081 -:100C200000000000000000000000000000000000C4 -:100C30000000000000000000000000005200000062 -:100C400000000000000000000000000000000000A4 -:100C50000000000000000000000000000000000094 -:100C60000000000000000000100110013A02000026 -:100C70001A0200007591000035910000FFFFFFFF90 -:100C80000000FFFFA5C900007938000065200000C2 -:100C9000B7730000918F00000000000097810000F2 -:100CA00077810000138200004B2400000D24000017 -:100CB0002D24000083C8000011C90000D75900008E -:100CC000338200000000000063820000C72400009F -:100CD0000000000000000000000000000000000014 -:100CE000875A000000000000000000000000000023 -:100CF00000000000000000000000000000000000F4 -:100D00000000000000000000000000004DD20000C4 -:100D1000D1D2000000000000000000000000000030 -:100D2000D1D300000000000000000000000000001F -:100D3000E3E80000000000000000000000000000E8 -:100D4000D7D5000085E2000000000000A5E4000007 -:100D5000D7E6000000000000B3DB000079DC0000F3 -:100D60000000000061E5000071DD00008FDF000081 -:100D700001E00000F5E0000081D700000000000065 -:100D80000000000091D6000000000000AFD4000079 -:100D90000DD4000071E1000015E7000083E70000BA -:100DA000000000001FD300004FD300007FD20000DE -:100DB0000000000099D300000000000000000000C7 -:100DC00000000000DBE70000000000000000000061 -:100DD0000000000000000000000000000000000013 -:100DE000DBD900000000000055E4000027E500000A -:100DF000C1E6000095D5000039D400005DD50000A3 -:100E000000000000E3D4000000000000000000002B -:100E10004DE8000031E9000035EB0000B1E90000C9 -:100E20000FD60000EBEA00000000000021D800000F -:100E3000F5D80000FBE9000045EA000069DB00008E -:100E40001BD50000A1E800007FEA00005157000018 -:100E500051570000A54000002FC90000797600001E -:100E6000851F0000F39901004FB101009557000064 -:100E700095570000C740000063C9000003770000D9 -:100E8000EF1F0000219A010063B10100D001D001E1 -:100E90003E0034005C0024004801F0010100000025 -:100EA0000001020304000F101112000000130000E3 -:100EB000E1F40100AFF5010001F601004DF601007B -:100EC000A1F60100DBEF0100FDF0010065F101007A -:100ED00089F301006BF40100DFFD0000B90E010091 -:100EE00000000000060000000A00000032000000C0 -:100EF00073000000B4000000598701002F74010046 -:100F0000894C01001DCC01007D6001001DCC010059 -:100F1000FB4C010027CE0100B958010027CE01008B -:100F2000FB4B01004BCD0100335F01004BCD0100B5 -:100F30004F50010047D101001161010047D101006C -:100F40000004F4F4FE00F1F1FF000000131708089C -:100F50000000E8E8FC02E8E800000000F8FF0808EC -:100F6000555555D6BE898E0000009806250DB21342 -:100F700000000208F80FEF1700003C036D069E0901 -:100F8000000088040509820D555555252627D6BE33 -:100F9000898EF401FA00960064004B0032001E00B6 -:100FA00014000A00050002000100000025090000ED -:100FB00000000000AAAED7AB1541201000000300CE -:100FC000656C74620000000000000000000000007A -:100FD000000000008700000000000000000000008A -:100FE00000000000BE83605ADB0B376038A5F5AA0D -:100FF0009183886C59FD010071FD010089FD01009C -:10100000A1FD0100D1FD0100F9FD010023FE010059 -:1010100057FE0100F9FA010059FA01005DFB0100D9 -:10102000B9FB0100C9FB0100F5FB010033290100F8 -:101030003B2901004929010023FC01003DFC01007E -:1010400011FC01001BFC010049FC01007FFC0100B8 -:101050009FFC0100ADFC0100BBFC0100CBFC0100CA -:10106000E3FC0100FBFC010011FD01000000000099 -:10107000039E0000599E00006F9E0000A90102001F -:1010800079F701003FF801005D0502008D050200BF -:10109000C5050200292701000D2C01001C05004098 -:1010A0002005004000100200C810020008000020C7 -:1010B000B001000044110000F8100200B801002047 -:1010C000D8100000801100000119054910130020FC -:1010D0003601000100743720FB349B5F80041B80C5 -:1010E0000010022501540B0020337F0106A45C0C84 -:0810F000002029024810000055 -:00000001FF diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.pdf deleted file mode 100644 index 1a1a731d3a..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt deleted file mode 100644 index b8d26c9a84..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt +++ /dev/null @@ -1,96 +0,0 @@ -S110/S120/S130/S132/S140 license agreement - - -NORDIC SEMICONDUCTOR ASA SOFTDEVICE LICENSE AGREEMENT - -License Agreement for the Nordic Semiconductor ASA ("Nordic") S110, S120, S130, S132, and S140 Bluetooth SoftDevice software packages -("SoftDevice"). - -You ("You" "Licensee") must carefully and thoroughly read this License Agreement ("Agreement"), and accept to adhere to this Agreement before -downloading, installing and/or using any software or content in the SoftDevice provided herewith. - -YOU ACCEPT THIS LICENSE AGREEMENT BY (A) CLICKING ACCEPT OR AGREE TO THIS LICENSE AGREEMENT, WHERE THIS -OPTION IS MADE AVAILABLE TO YOU; OR (B) BY ACTUALLY USING THE SOFTDEVICE, IN THIS CASE YOU AGREE THAT THE USE OF -THE SOFTDEVICE CONSTITUTES ACCEPTANCE OF THE LICENSING AGREEMENT FROM THAT POINT ONWARDS. - -IF YOU DO NOT AGREE TO BE BOUND BY THE TERMS OF THIS AGREEMENT, THEN DO NOT DOWNLOAD, INSTALL/COMPLETE -INSTALLATION OF, OR IN ANY OTHER WAY MAKE USE OF THE SOFTDEVICE. - -1. Grant of License -Subject to the terms in this Agreement Nordic grants Licensee a limited, non-exclusive, non-transferable, non-sub licensable, revocable license -("License"): (a) to use the SoftDevice solely in connection with a Nordic integrated circuit, and (b) to distribute the SoftDevice solely as integrated -in Licensee Product. Licensee shall not use the SoftDevice for any purpose other than specifically authorized herein. It is a material breach of this -agreement to use or modify the SoftDevice for use on any wireless connectivity integrated circuit other than a Nordic integrated circuit. - -2. Title -Nordic retains full rights, title, and ownership to the SoftDevice and any and all patents, copyrights, trade secrets, trade names, trademarks, and -other intellectual property rights in and to the SoftDevice. - -3. No Modifications or Reverse Engineering -Licensee shall not, modify, reverse engineer, disassemble, decompile or otherwise attempt to discover the source code of any non-source code -parts of the SoftDevice including, but not limited to pre-compiled hex files, binaries and object code. - -4. Distribution Restrictions -Except as set forward in Section 1 above, the Licensee may not disclose or distribute any or all parts of the SoftDevice to any third party. -Licensee agrees to provide reasonable security precautions to prevent unauthorized access to or use of the SoftDevice as proscribed herein. -Licensee also agrees that use of and access to the SoftDevice will be strictly limited to the employees and subcontractors of the Licensee -necessary for the performance of development, verification and production tasks under this Agreement. The Licensee is responsible for making -such employees and subcontractors comply with the obligations concerning use and non-disclosure of the SoftDevice. - -5. No Other Rights -Licensee shall use the SoftDevice only in compliance with this Agreement and shall refrain from using the SoftDevice in any way that may be -contrary to this Agreement. - -6. Fees -Nordic grants the License to the Licensee free of charge provided that the Licensee undertakes the obligations in the Agreement and warrants to -comply with the Agreement. - -7. DISCLAIMER OF WARRANTY -THE SOFTDEVICE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND EXPRESS OR IMPLIED AND NEITHER NORDIC, ITS -LICENSORS OR AFFILIATES NOR THE COPYRIGHT HOLDERS MAKE ANY REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OR -THAT THE SOFTDEVICE WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. THERE -IS NO WARRANTY BY NORDIC OR BY ANY OTHER PARTY THAT THE FUNCTIONS CONTAINED IN THE SOFTDEVICE WILL MEET THE -REQUIREMENTS OF LICENSEE OR THAT THE OPERATION OF THE SOFTDEVICE WILL BE UNINTERRUPTED OR ERROR-FREE. -LICENSEE ASSUMES ALL RESPONSIBILITY AND RISK FOR THE SELECTION OF THE SOFTDEVICE TO ACHIEVE LICENSEE’S -INTENDED RESULTS AND FOR THE INSTALLATION, USE AND RESULTS OBTAINED FROM IT. - - -8. No Support -Nordic is not obligated to furnish or make available to Licensee any further information, software, technical information, know-how, show-how, -bug-fixes or support. Nordic reserves the right to make changes to the SoftDevice without further notice. - -9. Limitation of Liability -In no event shall Nordic, its employees or suppliers, licensors or affiliates be liable for any lost profits, revenue, sales, data or costs of -procurement of substitute goods or services, property damage, personal injury, interruption of business, loss of business information or for any -special, direct, indirect, incidental, economic, punitive, special or consequential damages, however caused and whether arising under contract, -tort, negligence, or other theory of liability arising out of the use of or inability to use the SoftDevice, even if Nordic or its employees or suppliers, -licensors or affiliates are advised of the possibility of such damages. Because some countries/states/jurisdictions do not allow the exclusion or -limitation of liability, but may allow liability to be limited, in such cases, Nordic, its employees or licensors or affiliates’ liability shall be limited to -USD 50. - -10. Breach of Contract -Upon a breach of contract by the Licensee, Nordic and its licensor are entitled to damages in respect of any direct loss which can be reasonably -attributed to the breach by the Licensee. If the Licensee has acted with gross negligence or willful misconduct, the Licensee shall cover both -direct and indirect costs for Nordic and its licensors. - -11. Indemnity -Licensee undertakes to indemnify, hold harmless and defend Nordic and its directors, officers, affiliates, shareholders, licensors, employees and -agents from and against any claims or lawsuits, including attorney's fees, that arise or result of the Licensee’s execution of the License and which -is not due to causes for which Nordic is responsible. - -12. Governing Law -This Agreement shall be construed according to the laws of Norway, and hereby submits to the exclusive jurisdiction of the Oslo tingrett. - -13. Assignment -Licensee shall not assign this Agreement or any rights or obligations hereunder without the prior written consent of Nordic. - -14. Termination -Without prejudice to any other rights, Nordic may cancel this Agreement if Licensee does not abide by the terms and conditions of this -Agreement. Upon termination Licensee must promptly cease the use of the License and destroy all copies of the Licensed Technology and any -other material provided by Nordic or its affiliate, or produced by the Licensee in connection with the Agreement or the Licensed Technology. - -15. Third party beneficiaries -Nordic’s licensors are intended third party beneficiaries under this Agreement. - - diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/doc/s140_nrf52840_5.0.0-2.alpha_migration-document.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/doc/s140_nrf52840_5.0.0-2.alpha_migration-document.pdf deleted file mode 100644 index 8026762196..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/doc/s140_nrf52840_5.0.0-2.alpha_migration-document.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/doc/s140_nrf52840_5.0.0-2.alpha_readme.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/doc/s140_nrf52840_5.0.0-2.alpha_readme.txt deleted file mode 100644 index 2cce458228..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/doc/s140_nrf52840_5.0.0-2.alpha_readme.txt +++ /dev/null @@ -1,10 +0,0 @@ -s140_nrf52840_5.0.0-2.alpha - -This release consists of the following: - -- This readme file -- The s140_nrf52840_5.0.0-2.alpha API (SoftDevice header files) -- The s140_nrf52840_5.0.0-2.alpha license agreement -- The s140_nrf52840_5.0.0-2.alpha release notes -- The s140_nrf52840_5.0.0-2.alpha SoftDevice (binary hex file) -- The s140_nrf52840_5.0.0-2.alpha Migration Document diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/doc/s140_nrf52840_5.0.0-2.alpha_release-notes-update-1.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/doc/s140_nrf52840_5.0.0-2.alpha_release-notes-update-1.pdf deleted file mode 100644 index 9ffceb9b56..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/doc/s140_nrf52840_5.0.0-2.alpha_release-notes-update-1.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/hex/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/hex/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt deleted file mode 100644 index b8d26c9a84..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/hex/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt +++ /dev/null @@ -1,96 +0,0 @@ -S110/S120/S130/S132/S140 license agreement - - -NORDIC SEMICONDUCTOR ASA SOFTDEVICE LICENSE AGREEMENT - -License Agreement for the Nordic Semiconductor ASA ("Nordic") S110, S120, S130, S132, and S140 Bluetooth SoftDevice software packages -("SoftDevice"). - -You ("You" "Licensee") must carefully and thoroughly read this License Agreement ("Agreement"), and accept to adhere to this Agreement before -downloading, installing and/or using any software or content in the SoftDevice provided herewith. - -YOU ACCEPT THIS LICENSE AGREEMENT BY (A) CLICKING ACCEPT OR AGREE TO THIS LICENSE AGREEMENT, WHERE THIS -OPTION IS MADE AVAILABLE TO YOU; OR (B) BY ACTUALLY USING THE SOFTDEVICE, IN THIS CASE YOU AGREE THAT THE USE OF -THE SOFTDEVICE CONSTITUTES ACCEPTANCE OF THE LICENSING AGREEMENT FROM THAT POINT ONWARDS. - -IF YOU DO NOT AGREE TO BE BOUND BY THE TERMS OF THIS AGREEMENT, THEN DO NOT DOWNLOAD, INSTALL/COMPLETE -INSTALLATION OF, OR IN ANY OTHER WAY MAKE USE OF THE SOFTDEVICE. - -1. Grant of License -Subject to the terms in this Agreement Nordic grants Licensee a limited, non-exclusive, non-transferable, non-sub licensable, revocable license -("License"): (a) to use the SoftDevice solely in connection with a Nordic integrated circuit, and (b) to distribute the SoftDevice solely as integrated -in Licensee Product. Licensee shall not use the SoftDevice for any purpose other than specifically authorized herein. It is a material breach of this -agreement to use or modify the SoftDevice for use on any wireless connectivity integrated circuit other than a Nordic integrated circuit. - -2. Title -Nordic retains full rights, title, and ownership to the SoftDevice and any and all patents, copyrights, trade secrets, trade names, trademarks, and -other intellectual property rights in and to the SoftDevice. - -3. No Modifications or Reverse Engineering -Licensee shall not, modify, reverse engineer, disassemble, decompile or otherwise attempt to discover the source code of any non-source code -parts of the SoftDevice including, but not limited to pre-compiled hex files, binaries and object code. - -4. Distribution Restrictions -Except as set forward in Section 1 above, the Licensee may not disclose or distribute any or all parts of the SoftDevice to any third party. -Licensee agrees to provide reasonable security precautions to prevent unauthorized access to or use of the SoftDevice as proscribed herein. -Licensee also agrees that use of and access to the SoftDevice will be strictly limited to the employees and subcontractors of the Licensee -necessary for the performance of development, verification and production tasks under this Agreement. The Licensee is responsible for making -such employees and subcontractors comply with the obligations concerning use and non-disclosure of the SoftDevice. - -5. No Other Rights -Licensee shall use the SoftDevice only in compliance with this Agreement and shall refrain from using the SoftDevice in any way that may be -contrary to this Agreement. - -6. Fees -Nordic grants the License to the Licensee free of charge provided that the Licensee undertakes the obligations in the Agreement and warrants to -comply with the Agreement. - -7. DISCLAIMER OF WARRANTY -THE SOFTDEVICE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND EXPRESS OR IMPLIED AND NEITHER NORDIC, ITS -LICENSORS OR AFFILIATES NOR THE COPYRIGHT HOLDERS MAKE ANY REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OR -THAT THE SOFTDEVICE WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. THERE -IS NO WARRANTY BY NORDIC OR BY ANY OTHER PARTY THAT THE FUNCTIONS CONTAINED IN THE SOFTDEVICE WILL MEET THE -REQUIREMENTS OF LICENSEE OR THAT THE OPERATION OF THE SOFTDEVICE WILL BE UNINTERRUPTED OR ERROR-FREE. -LICENSEE ASSUMES ALL RESPONSIBILITY AND RISK FOR THE SELECTION OF THE SOFTDEVICE TO ACHIEVE LICENSEE’S -INTENDED RESULTS AND FOR THE INSTALLATION, USE AND RESULTS OBTAINED FROM IT. - - -8. No Support -Nordic is not obligated to furnish or make available to Licensee any further information, software, technical information, know-how, show-how, -bug-fixes or support. Nordic reserves the right to make changes to the SoftDevice without further notice. - -9. Limitation of Liability -In no event shall Nordic, its employees or suppliers, licensors or affiliates be liable for any lost profits, revenue, sales, data or costs of -procurement of substitute goods or services, property damage, personal injury, interruption of business, loss of business information or for any -special, direct, indirect, incidental, economic, punitive, special or consequential damages, however caused and whether arising under contract, -tort, negligence, or other theory of liability arising out of the use of or inability to use the SoftDevice, even if Nordic or its employees or suppliers, -licensors or affiliates are advised of the possibility of such damages. Because some countries/states/jurisdictions do not allow the exclusion or -limitation of liability, but may allow liability to be limited, in such cases, Nordic, its employees or licensors or affiliates’ liability shall be limited to -USD 50. - -10. Breach of Contract -Upon a breach of contract by the Licensee, Nordic and its licensor are entitled to damages in respect of any direct loss which can be reasonably -attributed to the breach by the Licensee. If the Licensee has acted with gross negligence or willful misconduct, the Licensee shall cover both -direct and indirect costs for Nordic and its licensors. - -11. Indemnity -Licensee undertakes to indemnify, hold harmless and defend Nordic and its directors, officers, affiliates, shareholders, licensors, employees and -agents from and against any claims or lawsuits, including attorney's fees, that arise or result of the Licensee’s execution of the License and which -is not due to causes for which Nordic is responsible. - -12. Governing Law -This Agreement shall be construed according to the laws of Norway, and hereby submits to the exclusive jurisdiction of the Oslo tingrett. - -13. Assignment -Licensee shall not assign this Agreement or any rights or obligations hereunder without the prior written consent of Nordic. - -14. Termination -Without prejudice to any other rights, Nordic may cancel this Agreement if Licensee does not abide by the terms and conditions of this -Agreement. Upon termination Licensee must promptly cease the use of the License and destroy all copies of the Licensed Technology and any -other material provided by Nordic or its affiliate, or produced by the Licensee in connection with the Agreement or the Licensed Technology. - -15. Third party beneficiaries -Nordic’s licensors are intended third party beneficiaries under this Agreement. - - diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/hex/s140_nrf52840_5.0.0-2.alpha_mbr.hex b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/hex/s140_nrf52840_5.0.0-2.alpha_mbr.hex deleted file mode 100644 index 6a59aafe61..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/hex/s140_nrf52840_5.0.0-2.alpha_mbr.hex +++ /dev/null @@ -1,77 +0,0 @@ -:2000000000040020E508000079050000C5080000830500008D0500009705000000000000CE -:2000200000000000000000000000000009090000A105000000000000AB050000B50500009E -:20004000BF050000C9050000D3050000DD050000E7050000F1050000FB0500000506000067 -:200060000F06000019060000230600002D06000037060000410600004B06000055060000C0 -:200080005F06000069060000730600007D06000087060000910600009B060000A506000020 -:2000A000AF060000B9060000C3060000CD060000D7060000E1060000EB060000F506000080 -:2000C000FF06000009070000130700001D07000027070000310700003B07000045070000D9 -:2000E0004F07000059070000630700006D07000077070000810700008B0700009507000038 -:200100009F0700001FB500F003F88DE80F001FBD00F0DEBB1FB56FF00100009040100390EA -:20012000029001904FF010208069000B420900F01F045DF822300120A04083434DF82230D6 -:20014000684600F044F91FBDF0B54FF6FF734FF4B4751A466E1E11E0A94201D3344600E02A -:200160000C46091B30F8027B641E3B441A44F9D19CB204EB134394B204EB12420029EBD13A -:2001800098B200EB134002EB124140EA0140F0BDDD4992B00446D1E90001CDE91001FF222A -:2001A0004021684600F03AFB94E80F008DE80F00684610A902E004C841F8042D8842FAD1E8 -:2001C00010216846FFF7C0FF1090AA208DF84400FFF7A0FF00F0F2F84FF01024A06910223B -:2001E0006946803000F001F9A069082210A900F0FCF800F0D7F84FF080510A69496900688A -:200200004A43824201D8102070470020704710B5D0E900214FF0805002EB810302694469BF -:200220006243934209D84FF01022536903EB81030169406941438B4201D9092010BD5069D7 -:20024000401C01D0002010BD0F2010BD70B501680446AE4D4FF01020062951D2DFE801F03C -:20026000320318283B1DD4E9026564682946304600F0CDF82A462146304600F0B6F8AA0092 -:200280002146304600F09EFA002800D0032070BD00F050FB4FF4805007E0201DFFF7ABFF9F -:2002A0000028F4D100F046FB60682860002070BD241D94E80700920000F084FA0028F6D0D1 -:2002C0000E2070BD8069401C12D0201DFFF79FFF0028F6D109E08069401C09D0201DFFF7A2 -:2002E0008AFF0028EDD1606820B12046FFF750FF042070BDFFF70EFF00F060F800F052F875 -:20030000072070BD10B50C46182802D00120086010BD2068FFF79AFF206010BD4FF0102433 -:20032000A069401C05D0A569A66980353079AA2808D06069401C2DD060690068401C29D0B6 -:2003400060692CE010212846FFF7FEFE316881421CD1A16901F18002C03105E030B108CAE7 -:2003600051F8040D984201D1012000E000208A42F4D158B1286810B1042803D0FEE7284619 -:2003800000F057F861496868086008E000F016F800F008F84FF480500168491C01D000F0C4 -:2003A000A3FAFEE7BFF34F8F59480168594A01F4E06111430160BFF34F8FFEE74FF01020AF -:2003C0008169491C02D0806900F0ADB87047524A01681160121D416811604F4A8168103284 -:2003E0001160111DC068086070472DE9F04117460D460646002406E03046296800F0A6F835 -:20040000641C2D1D361DBC42F6D3BDE8F08170B50C4605464FF4806608E0284600F083F836 -:20042000B44205D3A4F5806405F58055002CF4D170BD4168044609B1012500E000254FF06D -:2004400010267069A268920000F0BCF9C8B1204600F01AF89DB17669A56864684FF4002002 -:2004600084420AD2854208D229463046FFF7CFFF2A4621463046FFF7B8FFFFF79FFFFFF70C -:2004800091FFFFF747FEF8E72DE9FF414FF01024616980680D0B01EB800000F6FF70010B42 -:2004A000002000900190029002460390684601230BE0560902F01F0C50F8267003FA0CFC72 -:2004C00047EA0C0740F82670521CAA42F1D30AE04A0901F01F0650F8225003FA06F635436E -:2004E00040F82250491C8029F2D3A169090B4A0901F01F0150F822408B409C4340F822400F -:20050000FFF765FFBDE8FF8158090000000000200CED00E00400FA050006004014480168F4 -:200520000029FCD07047134A0221116010490B68002BFCD00F4B1B1D186008680028FCD0ED -:200540000020106008680028FCD07047094B10B501221A60064A1468002CFCD0016010689D -:200560000028FCD00020186010680028FCD010BD00E4014004E5014008208F490968095895 -:20058000084710208C4909680958084714208A490968095808471820874909680958084795 -:2005A00030208549096809580847382082490968095808473C208049096809580847402012 -:2005C0007D4909680958084744207B49096809580847482078490968095808474C20764976 -:2005E000096809580847502073490968095808475420714909680958084758206E4909689E -:20060000095808475C206C490968095808476020694909680958084764206749096809587F -:200620000847682064490968095808476C20624909680958084770205F4909680958084764 -:2006400074205D4909680958084778205A490968095808477C2058490968095808478020E5 -:20066000554909680958084784205349096809580847882050490968095808478C204E49B5 -:2006800009680958084790204B4909680958084794204949096809580847982046490968B5 -:2006A000095808479C204449096809580847A0204149096809580847A4203F490968095897 -:2006C0000847A8203C49096809580847AC203A49096809580847B02037490968095808477C -:2006E000B4203549096809580847B8203249096809580847BC203049096809580847C020BD -:200700002D49096809580847C4202B49096809580847C8202849096809580847CC202649F4 -:20072000096809580847D0202349096809580847D4202149096809580847D8201E490968CC -:2007400009580847DC201C49096809580847E0201949096809580847E420174909680958AE -:200760000847E8201449096809580847EC201249096809580847F0200F4909680958084793 -:20078000F4200D49096809580847F8200A49096809580847FC2008490968095808475FF461 -:2007A00080700549096809580847000003480449024A034B70470000000000206809000060 -:2007C0006809000040EA010310B59B070FD1042A0DD310C808C9121F9C42F8D020BA19BAF8 -:2007E000884201D9012010BD4FF0FF3010BD1AB1D30703D0521C07E0002010BD10F8013B2E -:2008000011F8014B1B1B07D110F8013B11F8014B1B1B01D1921EF1D1184610BD02F0FF0343 -:2008200043EA032242EA024200F005B87047704770474FF000020429C0F0128010F0030C65 -:2008400000F01B80CCF1040CBCF1020F18BF00F8012BA8BF20F8022BA1EB0C0100F00DB88D -:200860005FEAC17C24BF00F8012B00F8012B48BF00F8012B70474FF0000200B513469446BC -:200880009646203922BFA0E80C50A0E80C50B1F12001BFF4F7AF090728BFA0E80C5048BF7C -:2008A0000CC05DF804EB890028BF40F8042B08BF704748BF20F8022B11F0804F18BF00F8E8 -:2008C000012B7047014B1B68DB6818470000002009480A497047FFF7FBFFFFF713FC00BD97 -:2008E00020BFFDE7064B1847064A1060016881F30888406800470000680900006809000087 -:200900001D030000000000201EF0040F0CBFEFF30881EFF30981886902380078182803D11D -:2009200000E00000074A1047074A12682C3212681047000000B5054B1B68054A9B5898478C -:2009400000BD000005030000000000205409000004000000001000000000000000FFFFFF44 -:040960000090D00330 -:00000001FF diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/mbr/nrf_mbr.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/mbr/nrf_mbr.h deleted file mode 100644 index ccbe96bd59..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/mbr/nrf_mbr.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/** - @defgroup nrf_mbr_api Master Boot Record API - @{ - - @brief APIs for updating SoftDevice and BootLoader - -*/ - -#ifndef NRF_MBR_H__ -#define NRF_MBR_H__ - -#include "nrf_svc.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup NRF_MBR_DEFINES Defines - * @{ */ - -/**@brief MBR SVC Base number. */ -#define MBR_SVC_BASE (0x18) - -/**@brief Page size in words. */ -#define MBR_PAGE_SIZE_IN_WORDS (1024) - -/** @brief The size that must be reserved for the MBR when a SoftDevice is written to flash. -This is the offset where the first byte of the SoftDevice hex file is written.*/ -#define MBR_SIZE (0x1000) - -/** @} */ - -/** @addtogroup NRF_MBR_ENUMS Enumerations - * @{ */ - -/**@brief nRF Master Boot Record API SVC numbers. */ -enum NRF_MBR_SVCS -{ - SD_MBR_COMMAND = MBR_SVC_BASE, /**< ::sd_mbr_command */ -}; - -/**@brief Possible values for ::sd_mbr_command_t.command */ -enum NRF_MBR_COMMANDS -{ - SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see sd_mbr_command_copy_bl_t*/ - SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ - SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD*/ - SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ - SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Start forwarding all exception to this address @see ::sd_mbr_command_vector_table_base_set_t*/ -}; - -/** @} */ - -/** @addtogroup NRF_MBR_TYPES Types - * @{ */ - -/**@brief This command copies part of a new SoftDevice - * The destination area is erased before copying. - * If dst is in the middle of a flash page, that whole flash page will be erased. - * If (dst+len) is in the middle of a flash page, that whole flash page will be erased. - * - * The user of this function is responsible for setting the BPROT registers. - * - * @retval ::NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly. - * @retval ::NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying. - */ -typedef struct -{ - uint32_t *src; /**< Pointer to the source of data to be copied.*/ - uint32_t *dst; /**< Pointer to the destination where the content is to be copied.*/ - uint32_t len; /**< Number of 32 bit words to copy. Must be a multiple of @ref MBR_PAGE_SIZE_IN_WORDS words.*/ -} sd_mbr_command_copy_sd_t; - - -/**@brief This command works like memcmp, but takes the length in words. - * - * @retval ::NRF_SUCCESS indicates that the contents of both memory blocks are equal. - * @retval ::NRF_ERROR_NULL indicates that the contents of the memory blocks are not equal. - */ -typedef struct -{ - uint32_t *ptr1; /**< Pointer to block of memory. */ - uint32_t *ptr2; /**< Pointer to block of memory. */ - uint32_t len; /**< Number of 32 bit words to compare.*/ -} sd_mbr_command_compare_t; - - -/**@brief This command copies a new BootLoader. - * With this command, destination of BootLoader is always the address written in NRF_UICR->BOOTADDR. - * - * Destination is erased by this function. - * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. - * - * This function will use PROTENSET to protect the flash that is not intended to be written. - * - * On success, this function will not return. It will start the new BootLoader from reset-vector as normal. - * - * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. - * @retval ::NRF_ERROR_FORBIDDEN if NRF_UICR->BOOTADDR is not set. - * @retval ::NRF_ERROR_INVALID_LENGTH if parameters attempts to read or write outside flash area. - * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) - */ -typedef struct -{ - uint32_t *bl_src; /**< Pointer to the source of the Bootloader to be be copied.*/ - uint32_t bl_len; /**< Number of 32 bit words to copy for BootLoader. */ -} sd_mbr_command_copy_bl_t; - -/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR - * - * Once this function has been called, this address is where the MBR will start to forward interrupts to after a reset. - * - * To restore default forwarding this function should be called with @param address set to 0. - * The MBR will then start forwarding to interrupts to the address in NFR_UICR->BOOTADDR or to the SoftDevice if the BOOTADDR is not set. - * - * On success, this function will not return. It will reset the device. - * - * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. - * @retval ::NRF_ERROR_INVALID_ADDR if parameter address is outside of the flash size. - * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) - */ -typedef struct -{ - uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ -} sd_mbr_command_vector_table_base_set_t; - - -typedef struct -{ - uint32_t command; /**< type of command to be issued see @ref NRF_MBR_COMMANDS. */ - union - { - sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ - sd_mbr_command_compare_t compare; /**< Parameters for verify.*/ - sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ - sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ - } params; -} sd_mbr_command_t; - -/** @} */ - -/** @addtogroup NRF_MBR_FUNCTIONS Functions - * @{ */ - -/**@brief Issue Master Boot Record commands - * - * Commands used when updating a SoftDevice and bootloader. - * - * The SD_MBR_COMMAND_COPY_BL and SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires parameters to be - * retained by the MBR when resetting the IC. This is done in a separate flash page - * provided by the application. The UICR register UICR.NRFFW[1] must be set - * to an address corresponding to a page in the application flash space. This page will be cleared - * by the MBR and used to store the command before reset. When the UICR.NRFFW[1] field is set - * the page it refers to must not be used by the application. If the UICR.NRFFW[1] is set to - * 0xFFFFFFFF (the default) MBR commands which use flash will be unavailable and return - * NRF_ERROR_NO_MEM. - * - * @param[in] param Pointer to a struct describing the command. - * - * @note For return values, see ::sd_mbr_command_copy_sd_t ::sd_mbr_command_copy_bl_t ::sd_mbr_command_compare_t ::sd_mbr_command_vector_table_base_set_t - * - * @retval NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF). - * @retval NRF_ERROR_INVALID_PARAM if an invalid command is given. -*/ -SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_MBR_H__ - -/** - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.pdf deleted file mode 100644 index 1a1a731d3a..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt deleted file mode 100644 index b8d26c9a84..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt +++ /dev/null @@ -1,96 +0,0 @@ -S110/S120/S130/S132/S140 license agreement - - -NORDIC SEMICONDUCTOR ASA SOFTDEVICE LICENSE AGREEMENT - -License Agreement for the Nordic Semiconductor ASA ("Nordic") S110, S120, S130, S132, and S140 Bluetooth SoftDevice software packages -("SoftDevice"). - -You ("You" "Licensee") must carefully and thoroughly read this License Agreement ("Agreement"), and accept to adhere to this Agreement before -downloading, installing and/or using any software or content in the SoftDevice provided herewith. - -YOU ACCEPT THIS LICENSE AGREEMENT BY (A) CLICKING ACCEPT OR AGREE TO THIS LICENSE AGREEMENT, WHERE THIS -OPTION IS MADE AVAILABLE TO YOU; OR (B) BY ACTUALLY USING THE SOFTDEVICE, IN THIS CASE YOU AGREE THAT THE USE OF -THE SOFTDEVICE CONSTITUTES ACCEPTANCE OF THE LICENSING AGREEMENT FROM THAT POINT ONWARDS. - -IF YOU DO NOT AGREE TO BE BOUND BY THE TERMS OF THIS AGREEMENT, THEN DO NOT DOWNLOAD, INSTALL/COMPLETE -INSTALLATION OF, OR IN ANY OTHER WAY MAKE USE OF THE SOFTDEVICE. - -1. Grant of License -Subject to the terms in this Agreement Nordic grants Licensee a limited, non-exclusive, non-transferable, non-sub licensable, revocable license -("License"): (a) to use the SoftDevice solely in connection with a Nordic integrated circuit, and (b) to distribute the SoftDevice solely as integrated -in Licensee Product. Licensee shall not use the SoftDevice for any purpose other than specifically authorized herein. It is a material breach of this -agreement to use or modify the SoftDevice for use on any wireless connectivity integrated circuit other than a Nordic integrated circuit. - -2. Title -Nordic retains full rights, title, and ownership to the SoftDevice and any and all patents, copyrights, trade secrets, trade names, trademarks, and -other intellectual property rights in and to the SoftDevice. - -3. No Modifications or Reverse Engineering -Licensee shall not, modify, reverse engineer, disassemble, decompile or otherwise attempt to discover the source code of any non-source code -parts of the SoftDevice including, but not limited to pre-compiled hex files, binaries and object code. - -4. Distribution Restrictions -Except as set forward in Section 1 above, the Licensee may not disclose or distribute any or all parts of the SoftDevice to any third party. -Licensee agrees to provide reasonable security precautions to prevent unauthorized access to or use of the SoftDevice as proscribed herein. -Licensee also agrees that use of and access to the SoftDevice will be strictly limited to the employees and subcontractors of the Licensee -necessary for the performance of development, verification and production tasks under this Agreement. The Licensee is responsible for making -such employees and subcontractors comply with the obligations concerning use and non-disclosure of the SoftDevice. - -5. No Other Rights -Licensee shall use the SoftDevice only in compliance with this Agreement and shall refrain from using the SoftDevice in any way that may be -contrary to this Agreement. - -6. Fees -Nordic grants the License to the Licensee free of charge provided that the Licensee undertakes the obligations in the Agreement and warrants to -comply with the Agreement. - -7. DISCLAIMER OF WARRANTY -THE SOFTDEVICE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND EXPRESS OR IMPLIED AND NEITHER NORDIC, ITS -LICENSORS OR AFFILIATES NOR THE COPYRIGHT HOLDERS MAKE ANY REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OR -THAT THE SOFTDEVICE WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. THERE -IS NO WARRANTY BY NORDIC OR BY ANY OTHER PARTY THAT THE FUNCTIONS CONTAINED IN THE SOFTDEVICE WILL MEET THE -REQUIREMENTS OF LICENSEE OR THAT THE OPERATION OF THE SOFTDEVICE WILL BE UNINTERRUPTED OR ERROR-FREE. -LICENSEE ASSUMES ALL RESPONSIBILITY AND RISK FOR THE SELECTION OF THE SOFTDEVICE TO ACHIEVE LICENSEE’S -INTENDED RESULTS AND FOR THE INSTALLATION, USE AND RESULTS OBTAINED FROM IT. - - -8. No Support -Nordic is not obligated to furnish or make available to Licensee any further information, software, technical information, know-how, show-how, -bug-fixes or support. Nordic reserves the right to make changes to the SoftDevice without further notice. - -9. Limitation of Liability -In no event shall Nordic, its employees or suppliers, licensors or affiliates be liable for any lost profits, revenue, sales, data or costs of -procurement of substitute goods or services, property damage, personal injury, interruption of business, loss of business information or for any -special, direct, indirect, incidental, economic, punitive, special or consequential damages, however caused and whether arising under contract, -tort, negligence, or other theory of liability arising out of the use of or inability to use the SoftDevice, even if Nordic or its employees or suppliers, -licensors or affiliates are advised of the possibility of such damages. Because some countries/states/jurisdictions do not allow the exclusion or -limitation of liability, but may allow liability to be limited, in such cases, Nordic, its employees or licensors or affiliates’ liability shall be limited to -USD 50. - -10. Breach of Contract -Upon a breach of contract by the Licensee, Nordic and its licensor are entitled to damages in respect of any direct loss which can be reasonably -attributed to the breach by the Licensee. If the Licensee has acted with gross negligence or willful misconduct, the Licensee shall cover both -direct and indirect costs for Nordic and its licensors. - -11. Indemnity -Licensee undertakes to indemnify, hold harmless and defend Nordic and its directors, officers, affiliates, shareholders, licensors, employees and -agents from and against any claims or lawsuits, including attorney's fees, that arise or result of the Licensee’s execution of the License and which -is not due to causes for which Nordic is responsible. - -12. Governing Law -This Agreement shall be construed according to the laws of Norway, and hereby submits to the exclusive jurisdiction of the Oslo tingrett. - -13. Assignment -Licensee shall not assign this Agreement or any rights or obligations hereunder without the prior written consent of Nordic. - -14. Termination -Without prejudice to any other rights, Nordic may cancel this Agreement if Licensee does not abide by the terms and conditions of this -Agreement. Upon termination Licensee must promptly cease the use of the License and destroy all copies of the Licensed Technology and any -other material provided by Nordic or its affiliate, or produced by the Licensee in connection with the Agreement or the Licensed Technology. - -15. Third party beneficiaries -Nordic’s licensors are intended third party beneficiaries under this Agreement. - - diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52840_5.0.0-2.alpha_migration-document.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52840_5.0.0-2.alpha_migration-document.pdf deleted file mode 100644 index 8026762196..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52840_5.0.0-2.alpha_migration-document.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52840_5.0.0-2.alpha_readme.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52840_5.0.0-2.alpha_readme.txt deleted file mode 100644 index 2cce458228..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52840_5.0.0-2.alpha_readme.txt +++ /dev/null @@ -1,10 +0,0 @@ -s140_nrf52840_5.0.0-2.alpha - -This release consists of the following: - -- This readme file -- The s140_nrf52840_5.0.0-2.alpha API (SoftDevice header files) -- The s140_nrf52840_5.0.0-2.alpha license agreement -- The s140_nrf52840_5.0.0-2.alpha release notes -- The s140_nrf52840_5.0.0-2.alpha SoftDevice (binary hex file) -- The s140_nrf52840_5.0.0-2.alpha Migration Document diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52840_5.0.0-2.alpha_release-notes-update-1.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52840_5.0.0-2.alpha_release-notes-update-1.pdf deleted file mode 100644 index 9ffceb9b56..0000000000 Binary files a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52840_5.0.0-2.alpha_release-notes-update-1.pdf and /dev/null differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_err.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_err.h deleted file mode 100644 index 36d54a0dc0..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_err.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** - @addtogroup BLE_COMMON - @{ - @addtogroup nrf_error - @{ - @ingroup BLE_COMMON - @} - - @defgroup ble_err General error codes - @{ - - @brief General error code definitions for the BLE API. - - @ingroup BLE_COMMON -*/ -#ifndef NRF_BLE_ERR_H__ -#define NRF_BLE_ERR_H__ - -#include "nrf_error.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* @defgroup BLE_ERRORS Error Codes - * @{ */ -#define BLE_ERROR_NOT_ENABLED (NRF_ERROR_STK_BASE_NUM+0x001) /**< @ref sd_ble_enable has not been called. */ -#define BLE_ERROR_INVALID_CONN_HANDLE (NRF_ERROR_STK_BASE_NUM+0x002) /**< Invalid connection handle. */ -#define BLE_ERROR_INVALID_ATTR_HANDLE (NRF_ERROR_STK_BASE_NUM+0x003) /**< Invalid attribute handle. */ -#define BLE_ERROR_NO_TX_PACKETS (NRF_ERROR_STK_BASE_NUM+0x004) /**< Not enough application packets available on this connection. */ -#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x005) /**< Invalid role. */ -#define BLE_ERROR_BLOCKED_BY_OTHER_LINKS (NRF_ERROR_STK_BASE_NUM+0x006) /**< The attempt to change link settings failed due to the scheduling of other links. */ -/** @} */ - - -/** @defgroup BLE_ERROR_SUBRANGES Module specific error code subranges - * @brief Assignment of subranges for module specific error codes. - * @note For specific error codes, see ble_.h or ble_error_.h. - * @{ */ -#define NRF_L2CAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x100) /**< L2CAP specific errors. */ -#define NRF_GAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x200) /**< GAP specific errors. */ -#define NRF_GATTC_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x300) /**< GATT client specific errors. */ -#define NRF_GATTS_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x400) /**< GATT server specific errors. */ -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif - - -/** - @} - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gattc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gattc.h deleted file mode 100644 index b6a75ece77..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gattc.h +++ /dev/null @@ -1,700 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** - @addtogroup BLE_GATTC Generic Attribute Profile (GATT) Client - @{ - @brief Definitions and prototypes for the GATT Client interface. - */ - -#ifndef BLE_GATTC_H__ -#define BLE_GATTC_H__ - -#include "ble_gatt.h" -#include "ble_types.h" -#include "ble_ranges.h" -#include "nrf_svc.h" -#include "nrf_error.h" -#include "nrf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_GATTC_ENUMERATIONS Enumerations - * @{ */ - -/**@brief GATTC API SVC numbers. */ -enum BLE_GATTC_SVCS -{ - SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER = BLE_GATTC_SVC_BASE, /**< Primary Service Discovery. */ - SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, /**< Relationship Discovery. */ - SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, /**< Characteristic Discovery. */ - SD_BLE_GATTC_DESCRIPTORS_DISCOVER, /**< Characteristic Descriptor Discovery. */ - SD_BLE_GATTC_ATTR_INFO_DISCOVER, /**< Attribute Information Discovery. */ - SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, /**< Read Characteristic Value by UUID. */ - SD_BLE_GATTC_READ, /**< Generic read. */ - SD_BLE_GATTC_CHAR_VALUES_READ, /**< Read multiple Characteristic Values. */ - SD_BLE_GATTC_WRITE, /**< Generic write. */ - SD_BLE_GATTC_HV_CONFIRM, /**< Handle Value Confirmation. */ - SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. */ -}; - -/** - * @brief GATT Client Event IDs. - */ -enum BLE_GATTC_EVTS -{ - BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP = BLE_GATTC_EVT_BASE, /**< Primary Service Discovery Response event. \n See @ref ble_gattc_evt_prim_srvc_disc_rsp_t. */ - BLE_GATTC_EVT_REL_DISC_RSP, /**< Relationship Discovery Response event. \n See @ref ble_gattc_evt_rel_disc_rsp_t. */ - BLE_GATTC_EVT_CHAR_DISC_RSP, /**< Characteristic Discovery Response event. \n See @ref ble_gattc_evt_char_disc_rsp_t. */ - BLE_GATTC_EVT_DESC_DISC_RSP, /**< Descriptor Discovery Response event. \n See @ref ble_gattc_evt_desc_disc_rsp_t. */ - BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, /**< Attribute Information Response event. \n See @ref ble_gattc_evt_attr_info_disc_rsp_t. */ - BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP, /**< Read By UUID Response event. \n See @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t. */ - BLE_GATTC_EVT_READ_RSP, /**< Read Response event. \n See @ref ble_gattc_evt_read_rsp_t. */ - BLE_GATTC_EVT_CHAR_VALS_READ_RSP, /**< Read multiple Response event. \n See @ref ble_gattc_evt_char_vals_read_rsp_t. */ - BLE_GATTC_EVT_WRITE_RSP, /**< Write Response event. \n See @ref ble_gattc_evt_write_rsp_t. */ - BLE_GATTC_EVT_HVX, /**< Handle Value Notification or Indication event. \n Confirm indication with @ref sd_ble_gattc_hv_confirm. \n See @ref ble_gattc_evt_hvx_t. */ - BLE_GATTC_EVT_EXCHANGE_MTU_RSP, /**< Exchange MTU Response event. \n See @ref ble_gattc_evt_exchange_mtu_rsp_t. */ - BLE_GATTC_EVT_TIMEOUT, /**< Timeout event. \n See @ref ble_gattc_evt_timeout_t. */ - BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE /**< Write without Response transmission complete. \n See @ref ble_gattc_evt_write_cmd_tx_complete_t. */ -}; - -/** @} */ - -/** @addtogroup BLE_GATTC_DEFINES Defines - * @{ */ - -/** @defgroup BLE_ERRORS_GATTC SVC return values specific to GATTC - * @{ */ -#define BLE_ERROR_GATTC_PROC_NOT_PERMITTED (NRF_GATTC_ERR_BASE + 0x000) /**< Procedure not Permitted. */ -/** @} */ - -/** @defgroup BLE_GATTC_ATTR_INFO_FORMAT Attribute Information Formats - * @{ */ -#define BLE_GATTC_ATTR_INFO_FORMAT_16BIT 1 /**< 16-bit Attribute Information Format. */ -#define BLE_GATTC_ATTR_INFO_FORMAT_128BIT 2 /**< 128-bit Attribute Information Format. */ -/** @} */ - -/** @defgroup BLE_GATTC_DEFAULTS GATT Client defaults - * @{ */ -#define BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Write without Response that can be queued for transmission. */ -/** @} */ - -/** @} */ - -/** @addtogroup BLE_GATTC_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE GATTC connection configuration parameters, set with @ref sd_ble_cfg_set. - */ -typedef struct -{ - uint8_t write_cmd_tx_queue_size; /**< The guaranteed minimum number of Write without Response that can be queued for transmission. - The default value is @ref BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT */ -} ble_gattc_conn_cfg_t; - -/**@brief Operation Handle Range. */ -typedef struct -{ - uint16_t start_handle; /**< Start Handle. */ - uint16_t end_handle; /**< End Handle. */ -} ble_gattc_handle_range_t; - - -/**@brief GATT service. */ -typedef struct -{ - ble_uuid_t uuid; /**< Service UUID. */ - ble_gattc_handle_range_t handle_range; /**< Service Handle Range. */ -} ble_gattc_service_t; - - -/**@brief GATT include. */ -typedef struct -{ - uint16_t handle; /**< Include Handle. */ - ble_gattc_service_t included_srvc; /**< Handle of the included service. */ -} ble_gattc_include_t; - - -/**@brief GATT characteristic. */ -typedef struct -{ - ble_uuid_t uuid; /**< Characteristic UUID. */ - ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ - uint8_t char_ext_props : 1; /**< Extended properties present. */ - uint16_t handle_decl; /**< Handle of the Characteristic Declaration. */ - uint16_t handle_value; /**< Handle of the Characteristic Value. */ -} ble_gattc_char_t; - - -/**@brief GATT descriptor. */ -typedef struct -{ - uint16_t handle; /**< Descriptor Handle. */ - ble_uuid_t uuid; /**< Descriptor UUID. */ -} ble_gattc_desc_t; - - -/**@brief Write Parameters. */ -typedef struct -{ - uint8_t write_op; /**< Write Operation to be performed, see @ref BLE_GATT_WRITE_OPS. */ - uint8_t flags; /**< Flags, see @ref BLE_GATT_EXEC_WRITE_FLAGS. */ - uint16_t handle; /**< Handle to the attribute to be written. */ - uint16_t offset; /**< Offset in bytes. @note For WRITE_CMD and WRITE_REQ, offset must be 0. */ - uint16_t len; /**< Length of data in bytes. */ - uint8_t const *p_value; /**< Pointer to the value data. */ -} ble_gattc_write_params_t; - -/**@brief Attribute Information for 16-bit Attribute UUID. */ -typedef struct -{ - uint16_t handle; /**< Attribute handle. */ - ble_uuid_t uuid; /**< 16-bit Attribute UUID. */ -} ble_gattc_attr_info16_t; - -/**@brief Attribute Information for 128-bit Attribute UUID. */ -typedef struct -{ - uint16_t handle; /**< Attribute handle. */ - ble_uuid128_t uuid; /**< 128-bit Attribute UUID. */ -} ble_gattc_attr_info128_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Service count. */ - ble_gattc_service_t services[1]; /**< Service data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_prim_srvc_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_REL_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Include count. */ - ble_gattc_include_t includes[1]; /**< Include data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_rel_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Characteristic count. */ - ble_gattc_char_t chars[1]; /**< Characteristic data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_char_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_DESC_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Descriptor count. */ - ble_gattc_desc_t descs[1]; /**< Descriptor data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_desc_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Attribute count. */ - uint8_t format; /**< Attribute information format, see @ref BLE_GATTC_ATTR_INFO_FORMAT. */ - union { - ble_gattc_attr_info16_t attr_info16[1]; /**< Attribute information for 16-bit Attribute UUID. - @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ - ble_gattc_attr_info128_t attr_info128[1]; /**< Attribute information for 128-bit Attribute UUID. - @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ - } info; /**< Attribute information union. */ -} ble_gattc_evt_attr_info_disc_rsp_t; - -/**@brief GATT read by UUID handle value pair. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - uint8_t *p_value; /**< Pointer to the Attribute Value, length is available in @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t::value_len. */ -} ble_gattc_handle_value_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP. */ -typedef struct -{ - uint16_t count; /**< Handle-Value Pair Count. */ - uint16_t value_len; /**< Length of the value in Handle-Value(s) list. */ - uint8_t handle_value[1]; /**< Handle-Value(s) list. To iterate through the list use @ref sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter. - @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_char_val_by_uuid_read_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_READ_RSP. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - uint16_t offset; /**< Offset of the attribute data. */ - uint16_t len; /**< Attribute data length. */ - uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_read_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP. */ -typedef struct -{ - uint16_t len; /**< Concatenated Attribute values length. */ - uint8_t values[1]; /**< Attribute values. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_char_vals_read_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_RSP. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - uint8_t write_op; /**< Type of write operation, see @ref BLE_GATT_WRITE_OPS. */ - uint16_t offset; /**< Data offset. */ - uint16_t len; /**< Data length. */ - uint8_t data[1]; /**< Data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_write_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_HVX. */ -typedef struct -{ - uint16_t handle; /**< Handle to which the HVx operation applies. */ - uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ - uint16_t len; /**< Attribute data length. */ - uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_hvx_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. */ -typedef struct -{ - uint16_t server_rx_mtu; /**< Server RX MTU size. */ -} ble_gattc_evt_exchange_mtu_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_TIMEOUT. */ -typedef struct -{ - uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ -} ble_gattc_evt_timeout_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE. */ -typedef struct -{ - uint8_t count; /**< Number of write without response transmissions completed. */ -} ble_gattc_evt_write_cmd_tx_complete_t; - -/**@brief GATTC event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which event occurred. */ - uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ - uint16_t error_handle; /**< In case of error: The handle causing the error. In all other cases @ref BLE_GATT_HANDLE_INVALID. */ - union - { - ble_gattc_evt_prim_srvc_disc_rsp_t prim_srvc_disc_rsp; /**< Primary Service Discovery Response Event Parameters. */ - ble_gattc_evt_rel_disc_rsp_t rel_disc_rsp; /**< Relationship Discovery Response Event Parameters. */ - ble_gattc_evt_char_disc_rsp_t char_disc_rsp; /**< Characteristic Discovery Response Event Parameters. */ - ble_gattc_evt_desc_disc_rsp_t desc_disc_rsp; /**< Descriptor Discovery Response Event Parameters. */ - ble_gattc_evt_char_val_by_uuid_read_rsp_t char_val_by_uuid_read_rsp; /**< Characteristic Value Read by UUID Response Event Parameters. */ - ble_gattc_evt_read_rsp_t read_rsp; /**< Read Response Event Parameters. */ - ble_gattc_evt_char_vals_read_rsp_t char_vals_read_rsp; /**< Characteristic Values Read Response Event Parameters. */ - ble_gattc_evt_write_rsp_t write_rsp; /**< Write Response Event Parameters. */ - ble_gattc_evt_hvx_t hvx; /**< Handle Value Notification/Indication Event Parameters. */ - ble_gattc_evt_exchange_mtu_rsp_t exchange_mtu_rsp; /**< Exchange MTU Response Event Parameters. */ - ble_gattc_evt_timeout_t timeout; /**< Timeout Event Parameters. */ - ble_gattc_evt_attr_info_disc_rsp_t attr_info_disc_rsp; /**< Attribute Information Discovery Event Parameters. */ - ble_gattc_evt_write_cmd_tx_complete_t write_cmd_tx_complete; /**< Write without Response transmission complete Event Parameters. */ - } params; /**< Event Parameters. @note Only valid if @ref gatt_status == @ref BLE_GATT_STATUS_SUCCESS. */ -} ble_gattc_evt_t; -/** @} */ - -/** @addtogroup BLE_GATTC_FUNCTIONS Functions - * @{ */ - -/**@brief Initiate or continue a GATT Primary Service Discovery procedure. - * - * @details This function initiates or resumes a Primary Service discovery procedure, starting from the supplied handle. - * If the last service has not been reached, this function must be called again with an updated start handle value to continue the search. - * - * @note If any of the discovered services have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with - * type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event. - * - * @events - * @event{@ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_PRIM_SRVC_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] start_handle Handle to start searching from. - * @param[in] p_srvc_uuid Pointer to the service UUID to be found. If it is NULL, all primary services will be returned. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Primary Service Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_services_discover(uint16_t conn_handle, uint16_t start_handle, ble_uuid_t const *p_srvc_uuid)); - - -/**@brief Initiate or continue a GATT Relationship Discovery procedure. - * - * @details This function initiates or resumes the Find Included Services sub-procedure. If the last included service has not been reached, - * this must be called again with an updated handle range to continue the search. - * - * @events - * @event{@ref BLE_GATTC_EVT_REL_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_REL_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Relationship Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Characteristic Discovery procedure. - * - * @details This function initiates or resumes a Characteristic discovery procedure. If the last Characteristic has not been reached, - * this must be called again with an updated handle range to continue the discovery. - * - * @note If any of the discovered characteristics have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with - * type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event. - * - * @events - * @event{@ref BLE_GATTC_EVT_CHAR_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_CHAR_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Characteristic Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteristics_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Characteristic Descriptor Discovery procedure. - * - * @details This function initiates or resumes a Characteristic Descriptor discovery procedure. If the last Descriptor has not been reached, - * this must be called again with an updated handle range to continue the discovery. - * - * @events - * @event{@ref BLE_GATTC_EVT_DESC_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_DESC_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range A pointer to the range of handles of the Characteristic to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Descriptor Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Read using Characteristic UUID procedure. - * - * @details This function initiates or resumes a Read using Characteristic UUID procedure. If the last Characteristic has not been reached, - * this must be called again with an updated handle range to continue the discovery. - * - * @events - * @event{@ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_READ_UUID_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_uuid Pointer to a Characteristic value UUID to read. - * @param[in] p_handle_range A pointer to the range of handles to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Read using Characteristic UUID procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle, ble_uuid_t const *p_uuid, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Read (Long) Characteristic or Descriptor procedure. - * - * @details This function initiates or resumes a GATT Read (Long) Characteristic or Descriptor procedure. If the Characteristic or Descriptor - * to be read is longer than ATT_MTU - 1, this function must be called multiple times with appropriate offset to read the - * complete value. - * - * @events - * @event{@ref BLE_GATTC_EVT_READ_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_VALUE_READ_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] handle The handle of the attribute to be read. - * @param[in] offset Offset into the attribute value to be read. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Read (Long) procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint16_t handle, uint16_t offset)); - - -/**@brief Initiate a GATT Read Multiple Characteristic Values procedure. - * - * @details This function initiates a GATT Read Multiple Characteristic Values procedure. - * - * @events - * @event{@ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_READ_MULT_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handles A pointer to the handle(s) of the attribute(s) to be read. - * @param[in] handle_count The number of handles in p_handles. - * - * @retval ::NRF_SUCCESS Successfully started the Read Multiple Characteristic Values procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(uint16_t conn_handle, uint16_t const *p_handles, uint16_t handle_count)); - - -/**@brief Perform a Write (Characteristic Value or Descriptor, with or without response, signed or not, long or reliable) procedure. - * - * @details This function can perform all write procedures described in GATT. - * - * @note Only one write with response procedure can be ongoing per connection at a time. - * If the application tries to write with response while another write with response procedure is ongoing, - * the function call will return @ref NRF_ERROR_BUSY. - * A @ref BLE_GATTC_EVT_WRITE_RSP event will be issued as soon as the write response arrives from the peer. - * - * @note The number of Write without Response that can be queued is configured by @ref ble_gattc_conn_cfg_t::write_cmd_tx_queue_size - * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. - * A @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event will be issued as soon as the transmission of the write without response is complete. - * - * @note The application can keep track of the available queue element count for writes without responses by following the procedure below: - * - Store initial queue element count in a variable. - * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. - * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event. - * - * @events - * @event{@ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE, Write without response transmission complete.} - * @event{@ref BLE_GATTC_EVT_WRITE_RSP, Write response received from the peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_VALUE_WRITE_WITHOUT_RESP_MSC} - * @mmsc{@ref BLE_GATTC_VALUE_WRITE_MSC} - * @mmsc{@ref BLE_GATTC_VALUE_LONG_WRITE_MSC} - * @mmsc{@ref BLE_GATTC_VALUE_RELIABLE_WRITE_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_write_params A pointer to a write parameters structure. - * - * @retval ::NRF_SUCCESS Successfully started the Write procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_BUSY For write with response, procedure already in progress. Wait for a @ref BLE_GATTC_EVT_WRITE_RSP event and retry. - * @retval ::NRF_ERROR_RESOURCES Too many writes without responses queued. - * Wait for a @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event and retry. - */ -SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, ble_gattc_write_params_t const *p_write_params)); - - -/**@brief Send a Handle Value Confirmation to the GATT Server. - * - * @mscs - * @mmsc{@ref BLE_GATTC_HVI_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] handle The handle of the attribute in the indication. - * - * @retval ::NRF_SUCCESS Successfully queued the Handle Value Confirmation for transmission. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no Indication pending to be confirmed. - * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle. - */ -SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_handle, uint16_t handle)); - -/**@brief Discovers information about a range of attributes on a GATT server. - * - * @events - * @event{@ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, Generated when information about a range of attributes has been received.} - * @endevents - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range The range of handles to request information about. - * - * @retval ::NRF_SUCCESS Successfully started an attribute information discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * p_handle_range)); - -/**@brief Start an ATT_MTU exchange by sending an Exchange MTU Request to the server. - * - * @details The SoftDevice sets ATT_MTU to the minimum of: - * - The Client RX MTU value, and - * - The Server RX MTU value from @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. - * - * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. - * - * @events - * @event{@ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_MTU_EXCHANGE} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] client_rx_mtu Client RX MTU size. - * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. - * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration - used for this connection. - * - The value must be equal to Server RX MTU size given in @ref sd_ble_gatts_exchange_mtu_reply - * if an ATT_MTU exchange has already been performed in the other direction. - * - * @retval ::NRF_SUCCESS Successfully sent request to the server. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state or an ATT_MTU exchange was already requested once. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid Client RX MTU size supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, uint32_t, sd_ble_gattc_exchange_mtu_request(uint16_t conn_handle, uint16_t client_rx_mtu)); - -/**@brief Iterate through Handle-Value(s) list in @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. - * - * @param[in] p_gattc_evt Pointer to event buffer containing @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. - * @note If the buffer contains different event, behavior is undefined. - * @param[in,out] p_iter Iterator, points to @ref ble_gattc_handle_value_t structure that will be filled in with - * the next Handle-Value pair in each iteration. If the function returns other than - * @ref NRF_SUCCESS, it will not be changed. - * - To start iteration, initialize the structure to zero. - * - To continue, pass the value from previous iteration. - * - * \code - * ble_gattc_handle_value_t iter; - * memset(&iter, 0, sizeof(ble_gattc_handle_value_t)); - * while (sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(&ble_evt.evt.gattc_evt, &iter) == NRF_SUCCESS) - * { - * app_handle = iter.handle; - * memcpy(app_value, iter.p_value, ble_evt.evt.gattc_evt.params.char_val_by_uuid_read_rsp.value_len); - * } - * \endcode - * - * @retval ::NRF_SUCCESS Successfully retrieved the next Handle-Value pair. - * @retval ::NRF_ERROR_NOT_FOUND No more Handle-Value pairs available in the list. - */ -__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter); - -/** @} */ - -#ifndef SUPPRESS_INLINE_IMPLEMENTATION - -__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter) -{ - uint32_t value_len = p_gattc_evt->params.char_val_by_uuid_read_rsp.value_len; - uint8_t *p_first = p_gattc_evt->params.char_val_by_uuid_read_rsp.handle_value; - uint8_t *p_next = p_iter->p_value ? p_iter->p_value + value_len : p_first; - - if ((p_next - p_first) / (sizeof(uint16_t) + value_len) < p_gattc_evt->params.char_val_by_uuid_read_rsp.count) - { - p_iter->handle = (uint16_t)p_next[1] << 8 | p_next[0]; - p_iter->p_value = p_next + sizeof(uint16_t); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_NOT_FOUND; - } -} - -#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ - -#ifdef __cplusplus -} -#endif -#endif /* BLE_GATTC_H__ */ - -/** - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gatts.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gatts.h deleted file mode 100644 index 6bb24831d8..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gatts.h +++ /dev/null @@ -1,832 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** - @addtogroup BLE_GATTS Generic Attribute Profile (GATT) Server - @{ - @brief Definitions and prototypes for the GATTS interface. - */ - -#ifndef BLE_GATTS_H__ -#define BLE_GATTS_H__ - -#include "ble_types.h" -#include "ble_ranges.h" -#include "ble_l2cap.h" -#include "ble_gap.h" -#include "ble_gatt.h" -#include "nrf_svc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_GATTS_ENUMERATIONS Enumerations - * @{ */ - -/** - * @brief GATTS API SVC numbers. - */ -enum BLE_GATTS_SVCS -{ - SD_BLE_GATTS_SERVICE_ADD = BLE_GATTS_SVC_BASE, /**< Add a service. */ - SD_BLE_GATTS_INCLUDE_ADD, /**< Add an included service. */ - SD_BLE_GATTS_CHARACTERISTIC_ADD, /**< Add a characteristic. */ - SD_BLE_GATTS_DESCRIPTOR_ADD, /**< Add a generic attribute. */ - SD_BLE_GATTS_VALUE_SET, /**< Set an attribute value. */ - SD_BLE_GATTS_VALUE_GET, /**< Get an attribute value. */ - SD_BLE_GATTS_HVX, /**< Handle Value Notification or Indication. */ - SD_BLE_GATTS_SERVICE_CHANGED, /**< Perform a Service Changed Indication to one or more peers. */ - SD_BLE_GATTS_RW_AUTHORIZE_REPLY, /**< Reply to an authorization request for a read or write operation on one or more attributes. */ - SD_BLE_GATTS_SYS_ATTR_SET, /**< Set the persistent system attributes for a connection. */ - SD_BLE_GATTS_SYS_ATTR_GET, /**< Retrieve the persistent system attributes. */ - SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, /**< Retrieve the first valid user handle. */ - SD_BLE_GATTS_ATTR_GET, /**< Retrieve the UUID and/or metadata of an attribute. */ - SD_BLE_GATTS_EXCHANGE_MTU_REPLY /**< Reply to Exchange MTU Request. */ -}; - -/** - * @brief GATT Server Event IDs. - */ -enum BLE_GATTS_EVTS -{ - BLE_GATTS_EVT_WRITE = BLE_GATTS_EVT_BASE, /**< Write operation performed. \n See @ref ble_gatts_evt_write_t. */ - BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST, /**< Read/Write Authorization request. \n Reply with @ref sd_ble_gatts_rw_authorize_reply. \n See @ref ble_gatts_evt_rw_authorize_request_t. */ - BLE_GATTS_EVT_SYS_ATTR_MISSING, /**< A persistent system attribute access is pending. \n Respond with @ref sd_ble_gatts_sys_attr_set. \n See @ref ble_gatts_evt_sys_attr_missing_t. */ - BLE_GATTS_EVT_HVC, /**< Handle Value Confirmation. \n See @ref ble_gatts_evt_hvc_t. */ - BLE_GATTS_EVT_SC_CONFIRM, /**< Service Changed Confirmation. \n No additional event structure applies. */ - BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. \n Reply with @ref sd_ble_gatts_exchange_mtu_reply. \n See @ref ble_gatts_evt_exchange_mtu_request_t. */ - BLE_GATTS_EVT_TIMEOUT, /**< Peer failed to respond to an ATT request in time. \n See @ref ble_gatts_evt_timeout_t. */ - BLE_GATTS_EVT_HVN_TX_COMPLETE /**< Handle Value Notification transmission complete. \n See @ref ble_gatts_evt_hvn_tx_complete_t. */ -}; - -/**@brief GATTS Configuration IDs. - * - * IDs that uniquely identify a GATTS configuration. - */ -enum BLE_GATTS_CFGS -{ - BLE_GATTS_CFG_SERVICE_CHANGED = BLE_GATTS_CFG_BASE, /**< Service changed configuration. */ - BLE_GATTS_CFG_ATTR_TAB_SIZE, /**< Attribute table size configuration. */ -}; - -/** @} */ - -/** @addtogroup BLE_GATTS_DEFINES Defines - * @{ */ - -/** @defgroup BLE_ERRORS_GATTS SVC return values specific to GATTS - * @{ */ -#define BLE_ERROR_GATTS_INVALID_ATTR_TYPE (NRF_GATTS_ERR_BASE + 0x000) /**< Invalid attribute type. */ -#define BLE_ERROR_GATTS_SYS_ATTR_MISSING (NRF_GATTS_ERR_BASE + 0x001) /**< System Attributes missing. */ -/** @} */ - -/** @defgroup BLE_GATTS_ATTR_LENS_MAX Maximum attribute lengths - * @{ */ -#define BLE_GATTS_FIX_ATTR_LEN_MAX (510) /**< Maximum length for fixed length Attribute Values. */ -#define BLE_GATTS_VAR_ATTR_LEN_MAX (512) /**< Maximum length for variable length Attribute Values. */ -/** @} */ - -/** @defgroup BLE_GATTS_SRVC_TYPES GATT Server Service Types - * @{ */ -#define BLE_GATTS_SRVC_TYPE_INVALID 0x00 /**< Invalid Service Type. */ -#define BLE_GATTS_SRVC_TYPE_PRIMARY 0x01 /**< Primary Service. */ -#define BLE_GATTS_SRVC_TYPE_SECONDARY 0x02 /**< Secondary Type. */ -/** @} */ - - -/** @defgroup BLE_GATTS_ATTR_TYPES GATT Server Attribute Types - * @{ */ -#define BLE_GATTS_ATTR_TYPE_INVALID 0x00 /**< Invalid Attribute Type. */ -#define BLE_GATTS_ATTR_TYPE_PRIM_SRVC_DECL 0x01 /**< Primary Service Declaration. */ -#define BLE_GATTS_ATTR_TYPE_SEC_SRVC_DECL 0x02 /**< Secondary Service Declaration. */ -#define BLE_GATTS_ATTR_TYPE_INC_DECL 0x03 /**< Include Declaration. */ -#define BLE_GATTS_ATTR_TYPE_CHAR_DECL 0x04 /**< Characteristic Declaration. */ -#define BLE_GATTS_ATTR_TYPE_CHAR_VAL 0x05 /**< Characteristic Value. */ -#define BLE_GATTS_ATTR_TYPE_DESC 0x06 /**< Descriptor. */ -#define BLE_GATTS_ATTR_TYPE_OTHER 0x07 /**< Other, non-GATT specific type. */ -/** @} */ - - -/** @defgroup BLE_GATTS_OPS GATT Server Operations - * @{ */ -#define BLE_GATTS_OP_INVALID 0x00 /**< Invalid Operation. */ -#define BLE_GATTS_OP_WRITE_REQ 0x01 /**< Write Request. */ -#define BLE_GATTS_OP_WRITE_CMD 0x02 /**< Write Command. */ -#define BLE_GATTS_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */ -#define BLE_GATTS_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */ -#define BLE_GATTS_OP_EXEC_WRITE_REQ_CANCEL 0x05 /**< Execute Write Request: Cancel all prepared writes. */ -#define BLE_GATTS_OP_EXEC_WRITE_REQ_NOW 0x06 /**< Execute Write Request: Immediately execute all prepared writes. */ -/** @} */ - -/** @defgroup BLE_GATTS_VLOCS GATT Value Locations - * @{ */ -#define BLE_GATTS_VLOC_INVALID 0x00 /**< Invalid Location. */ -#define BLE_GATTS_VLOC_STACK 0x01 /**< Attribute Value is located in stack memory, no user memory is required. */ -#define BLE_GATTS_VLOC_USER 0x02 /**< Attribute Value is located in user memory. This requires the user to maintain a valid buffer through the lifetime of the attribute, since the stack - will read and write directly to the memory using the pointer provided in the APIs. There are no alignment requirements for the buffer. */ -/** @} */ - -/** @defgroup BLE_GATTS_AUTHORIZE_TYPES GATT Server Authorization Types - * @{ */ -#define BLE_GATTS_AUTHORIZE_TYPE_INVALID 0x00 /**< Invalid Type. */ -#define BLE_GATTS_AUTHORIZE_TYPE_READ 0x01 /**< Authorize a Read Operation. */ -#define BLE_GATTS_AUTHORIZE_TYPE_WRITE 0x02 /**< Authorize a Write Request Operation. */ -/** @} */ - -/** @defgroup BLE_GATTS_SYS_ATTR_FLAGS System Attribute Flags - * @{ */ -#define BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS (1 << 0) /**< Restrict system attributes to system services only. */ -#define BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS (1 << 1) /**< Restrict system attributes to user services only. */ -/** @} */ - -/** @defgroup BLE_GATTS_SERVICE_CHANGED Service Changed Inclusion Values - * @{ - */ -#define BLE_GATTS_SERVICE_CHANGED_DEFAULT (1) /**< Default is to include the Service Changed characteristic in the Attribute Table. */ -/** @} */ - -/** @defgroup BLE_GATTS_ATTR_TAB_SIZE Attribute Table size - * @{ - */ -#define BLE_GATTS_ATTR_TAB_SIZE_MIN (248) /**< Minimum Attribute Table size */ -#define BLE_GATTS_ATTR_TAB_SIZE_DEFAULT (1408) /**< Default Attribute Table size. */ -/** @} */ - -/** @defgroup BLE_GATTS_DEFAULTS GATT Server defaults - * @{ - */ -#define BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Handle Value Notifications that can be queued for transmission. */ -/** @} */ - -/** @} */ - -/** @addtogroup BLE_GATTS_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE GATTS connection configuration parameters, set with @ref sd_ble_cfg_set. - */ -typedef struct -{ - uint8_t hvn_tx_queue_size; /**< Minimum guaranteed number of Handle Value Notifications that can be queued for transmission. - The default value is @ref BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT */ -} ble_gatts_conn_cfg_t; - -/**@brief Attribute metadata. */ -typedef struct -{ - ble_gap_conn_sec_mode_t read_perm; /**< Read permissions. */ - ble_gap_conn_sec_mode_t write_perm; /**< Write permissions. */ - uint8_t vlen :1; /**< Variable length attribute. */ - uint8_t vloc :2; /**< Value location, see @ref BLE_GATTS_VLOCS.*/ - uint8_t rd_auth :1; /**< Read authorization and value will be requested from the application on every read operation. */ - uint8_t wr_auth :1; /**< Write authorization will be requested from the application on every Write Request operation (but not Write Command). */ -} ble_gatts_attr_md_t; - - -/**@brief GATT Attribute. */ -typedef struct -{ - ble_uuid_t const *p_uuid; /**< Pointer to the attribute UUID. */ - ble_gatts_attr_md_t const *p_attr_md; /**< Pointer to the attribute metadata structure. */ - uint16_t init_len; /**< Initial attribute value length in bytes. */ - uint16_t init_offs; /**< Initial attribute value offset in bytes. If different from zero, the first init_offs bytes of the attribute value will be left uninitialized. */ - uint16_t max_len; /**< Maximum attribute value length in bytes, see @ref BLE_GATTS_ATTR_LENS_MAX for maximum values. */ - uint8_t *p_value; /**< Pointer to the attribute data. Please note that if the @ref BLE_GATTS_VLOC_USER value location is selected in the attribute metadata, this will have to point to a buffer - that remains valid through the lifetime of the attribute. This excludes usage of automatic variables that may go out of scope or any other temporary location. - The stack may access that memory directly without the application's knowledge. For writable characteristics, this value must not be a location in flash memory.*/ -} ble_gatts_attr_t; - -/**@brief GATT Attribute Value. */ -typedef struct -{ - uint16_t len; /**< Length in bytes to be written or read. Length in bytes written or read after successful return.*/ - uint16_t offset; /**< Attribute value offset. */ - uint8_t *p_value; /**< Pointer to where value is stored or will be stored. - If value is stored in user memory, only the attribute length is updated when p_value == NULL. - Set to NULL when reading to obtain the complete length of the attribute value */ -} ble_gatts_value_t; - - -/**@brief GATT Characteristic Presentation Format. */ -typedef struct -{ - uint8_t format; /**< Format of the value, see @ref BLE_GATT_CPF_FORMATS. */ - int8_t exponent; /**< Exponent for integer data types. */ - uint16_t unit; /**< Unit from Bluetooth Assigned Numbers. */ - uint8_t name_space; /**< Namespace from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ - uint16_t desc; /**< Namespace description from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ -} ble_gatts_char_pf_t; - - -/**@brief GATT Characteristic metadata. */ -typedef struct -{ - ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ - ble_gatt_char_ext_props_t char_ext_props; /**< Characteristic Extended Properties. */ - uint8_t const *p_char_user_desc; /**< Pointer to a UTF-8 encoded string (non-NULL terminated), NULL if the descriptor is not required. */ - uint16_t char_user_desc_max_size; /**< The maximum size in bytes of the user description descriptor. */ - uint16_t char_user_desc_size; /**< The size of the user description, must be smaller or equal to char_user_desc_max_size. */ - ble_gatts_char_pf_t const *p_char_pf; /**< Pointer to a presentation format structure or NULL if the CPF descriptor is not required. */ - ble_gatts_attr_md_t const *p_user_desc_md; /**< Attribute metadata for the User Description descriptor, or NULL for default values. */ - ble_gatts_attr_md_t const *p_cccd_md; /**< Attribute metadata for the Client Characteristic Configuration Descriptor, or NULL for default values. */ - ble_gatts_attr_md_t const *p_sccd_md; /**< Attribute metadata for the Server Characteristic Configuration Descriptor, or NULL for default values. */ -} ble_gatts_char_md_t; - - -/**@brief GATT Characteristic Definition Handles. */ -typedef struct -{ - uint16_t value_handle; /**< Handle to the characteristic value. */ - uint16_t user_desc_handle; /**< Handle to the User Description descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ - uint16_t cccd_handle; /**< Handle to the Client Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ - uint16_t sccd_handle; /**< Handle to the Server Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ -} ble_gatts_char_handles_t; - - -/**@brief GATT HVx parameters. */ -typedef struct -{ - uint16_t handle; /**< Characteristic Value Handle. */ - uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ - uint16_t offset; /**< Offset within the attribute value. */ - uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after successful return. */ - uint8_t const *p_data; /**< Actual data content, use NULL to use the current attribute value. */ -} ble_gatts_hvx_params_t; - -/**@brief GATT Authorization parameters. */ -typedef struct -{ - uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ - uint8_t update : 1; /**< If set, data supplied in p_data will be used to update the attribute value. - Please note that for @ref BLE_GATTS_AUTHORIZE_TYPE_WRITE operations this bit must always be set, - as the data to be written needs to be stored and later provided by the application. */ - uint16_t offset; /**< Offset of the attribute value being updated. */ - uint16_t len; /**< Length in bytes of the value in p_data pointer, see @ref BLE_GATTS_ATTR_LENS_MAX. */ - uint8_t const *p_data; /**< Pointer to new value used to update the attribute value. */ -} ble_gatts_authorize_params_t; - -/**@brief GATT Read or Write Authorize Reply parameters. */ -typedef struct -{ - uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ - union { - ble_gatts_authorize_params_t read; /**< Read authorization parameters. */ - ble_gatts_authorize_params_t write; /**< Write authorization parameters. */ - } params; /**< Reply Parameters. */ -} ble_gatts_rw_authorize_reply_params_t; - -/**@brief Service Changed Inclusion configuration parameters, set with @ref sd_ble_cfg_set. */ -typedef struct -{ - uint8_t service_changed : 1; /**< If 1, include the Service Changed characteristic in the Attribute Table. Default is @ref BLE_GATTS_SERVICE_CHANGED_DEFAULT. */ -} ble_gatts_cfg_service_changed_t; - -/**@brief Attribute table size configuration parameters, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true: - * - The specified Attribute Table size is too small. - * The minimum acceptable size is defined by @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. - * - The specified Attribute Table size is not a multiple of 4. - */ -typedef struct -{ - uint32_t attr_tab_size; /**< Attribute table size. Default is @ref BLE_GATTS_ATTR_TAB_SIZE_DEFAULT, minimum is @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. */ -} ble_gatts_cfg_attr_tab_size_t; - -/**@brief Config structure for GATTS configurations. */ -typedef union -{ - ble_gatts_cfg_service_changed_t service_changed; /**< Include service changed characteristic, cfg_id is @ref BLE_GATTS_CFG_SERVICE_CHANGED. */ - ble_gatts_cfg_attr_tab_size_t attr_tab_size; /**< Attribute table size, cfg_id is @ref BLE_GATTS_CFG_ATTR_TAB_SIZE. */ -} ble_gatts_cfg_t; - - -/**@brief Event structure for @ref BLE_GATTS_EVT_WRITE. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - ble_uuid_t uuid; /**< Attribute UUID. */ - uint8_t op; /**< Type of write operation, see @ref BLE_GATTS_OPS. */ - uint8_t auth_required; /**< Writing operation deferred due to authorization requirement. Application may use @ref sd_ble_gatts_value_set to finalize the writing operation. */ - uint16_t offset; /**< Offset for the write operation. */ - uint16_t len; /**< Length of the received data. */ - uint8_t data[1]; /**< Received data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gatts_evt_write_t; - -/**@brief Event substructure for authorized read requests, see @ref ble_gatts_evt_rw_authorize_request_t. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - ble_uuid_t uuid; /**< Attribute UUID. */ - uint16_t offset; /**< Offset for the read operation. */ -} ble_gatts_evt_read_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST. */ -typedef struct -{ - uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ - union { - ble_gatts_evt_read_t read; /**< Attribute Read Parameters. */ - ble_gatts_evt_write_t write; /**< Attribute Write Parameters. */ - } request; /**< Request Parameters. */ -} ble_gatts_evt_rw_authorize_request_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. */ -typedef struct -{ - uint8_t hint; /**< Hint (currently unused). */ -} ble_gatts_evt_sys_attr_missing_t; - - -/**@brief Event structure for @ref BLE_GATTS_EVT_HVC. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ -} ble_gatts_evt_hvc_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST. */ -typedef struct -{ - uint16_t client_rx_mtu; /**< Client RX MTU size. */ -} ble_gatts_evt_exchange_mtu_request_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_TIMEOUT. */ -typedef struct -{ - uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ -} ble_gatts_evt_timeout_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_HVN_TX_COMPLETE. */ -typedef struct -{ - uint8_t count; /**< Number of notification transmissions completed. */ -} ble_gatts_evt_hvn_tx_complete_t; - -/**@brief GATTS event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which the event occurred. */ - union - { - ble_gatts_evt_write_t write; /**< Write Event Parameters. */ - ble_gatts_evt_rw_authorize_request_t authorize_request; /**< Read or Write Authorize Request Parameters. */ - ble_gatts_evt_sys_attr_missing_t sys_attr_missing; /**< System attributes missing. */ - ble_gatts_evt_hvc_t hvc; /**< Handle Value Confirmation Event Parameters. */ - ble_gatts_evt_exchange_mtu_request_t exchange_mtu_request; /**< Exchange MTU Request Event Parameters. */ - ble_gatts_evt_timeout_t timeout; /**< Timeout Event. */ - ble_gatts_evt_hvn_tx_complete_t hvn_tx_complete; /**< Handle Value Notification transmission complete Event Parameters. */ - } params; /**< Event Parameters. */ -} ble_gatts_evt_t; - -/** @} */ - -/** @addtogroup BLE_GATTS_FUNCTIONS Functions - * @{ */ - -/**@brief Add a service declaration to the Attribute Table. - * - * @note Secondary Services are only relevant in the context of the entity that references them, it is therefore forbidden to - * add a secondary service declaration that is not referenced by another service later in the Attribute Table. - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] type Toggles between primary and secondary services, see @ref BLE_GATTS_SRVC_TYPES. - * @param[in] p_uuid Pointer to service UUID. - * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully added a service declaration. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, Vendor Specific UUIDs need to be present in the table. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ -SVCALL(SD_BLE_GATTS_SERVICE_ADD, uint32_t, sd_ble_gatts_service_add(uint8_t type, ble_uuid_t const *p_uuid, uint16_t *p_handle)); - - -/**@brief Add an include declaration to the Attribute Table. - * - * @note It is currently only possible to add an include declaration to the last added service (i.e. only sequential population is supported at this time). - * - * @note The included service must already be present in the Attribute Table prior to this call. - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] service_handle Handle of the service where the included service is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. - * @param[in] inc_srvc_handle Handle of the included service. - * @param[out] p_include_handle Pointer to a 16-bit word where the assigned handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully added an include declaration. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, handle values need to match previously added services. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_NOT_SUPPORTED Feature is not supported, service_handle must be that of the last added service. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, self inclusions are not allowed. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - */ -SVCALL(SD_BLE_GATTS_INCLUDE_ADD, uint32_t, sd_ble_gatts_include_add(uint16_t service_handle, uint16_t inc_srvc_handle, uint16_t *p_include_handle)); - - -/**@brief Add a characteristic declaration, a characteristic value declaration and optional characteristic descriptor declarations to the Attribute Table. - * - * @note It is currently only possible to add a characteristic to the last added service (i.e. only sequential population is supported at this time). - * - * @note Several restrictions apply to the parameters, such as matching permissions between the user description descriptor and the writable auxiliaries bits, - * readable (no security) and writable (selectable) CCCDs and SCCDs and valid presentation format values. - * - * @note If no metadata is provided for the optional descriptors, their permissions will be derived from the characteristic permissions. - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] service_handle Handle of the service where the characteristic is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. - * @param[in] p_char_md Characteristic metadata. - * @param[in] p_attr_char_value Pointer to the attribute structure corresponding to the characteristic value. - * @param[out] p_handles Pointer to the structure where the assigned handles will be stored. - * - * @retval ::NRF_SUCCESS Successfully added a characteristic. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, service handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a service context is required. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. - */ -SVCALL(SD_BLE_GATTS_CHARACTERISTIC_ADD, uint32_t, sd_ble_gatts_characteristic_add(uint16_t service_handle, ble_gatts_char_md_t const *p_char_md, ble_gatts_attr_t const *p_attr_char_value, ble_gatts_char_handles_t *p_handles)); - - -/**@brief Add a descriptor to the Attribute Table. - * - * @note It is currently only possible to add a descriptor to the last added characteristic (i.e. only sequential population is supported at this time). - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] char_handle Handle of the characteristic where the descriptor is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. - * @param[in] p_attr Pointer to the attribute structure. - * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully added a descriptor. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, characteristic handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a characteristic context is required. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. - */ -SVCALL(SD_BLE_GATTS_DESCRIPTOR_ADD, uint32_t, sd_ble_gatts_descriptor_add(uint16_t char_handle, ble_gatts_attr_t const *p_attr, uint16_t *p_handle)); - -/**@brief Set the value of a given attribute. - * - * @note Values other than system attributes can be set at any time, regardless of whether any active connections exist. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. - * @param[in] handle Attribute handle. - * @param[in,out] p_value Attribute value information. - * - * @retval ::NRF_SUCCESS Successfully set the value of the attribute. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden handle supplied, certain attributes are not modifiable by the application. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. - */ -SVCALL(SD_BLE_GATTS_VALUE_SET, uint32_t, sd_ble_gatts_value_set(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); - -/**@brief Get the value of a given attribute. - * - * @note If the attribute value is longer than the size of the supplied buffer, - * p_len will return the total attribute value length (excluding offset), - * and not the number of bytes actually returned in p_data. - * The application may use this information to allocate a suitable buffer size. - * - * @note When retrieving system attribute values with this function, the connection handle - * may refer to an already disconnected connection. Refer to the documentation of - * @ref sd_ble_gatts_sys_attr_get for further information. - * - * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. - * @param[in] handle Attribute handle. - * @param[in,out] p_value Attribute value information. - * - * @retval ::NRF_SUCCESS Successfully retrieved the value of the attribute. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid attribute offset supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. - * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. - */ -SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); - -/**@brief Notify or Indicate an attribute value. - * - * @details This function checks for the relevant Client Characteristic Configuration descriptor value to verify that the relevant operation - * (notification or indication) has been enabled by the client. It is also able to update the attribute value before issuing the PDU, so that - * the application can atomically perform a value update and a server initiated transaction with a single API call. - * - * @note The local attribute value may be updated even if an outgoing packet is not sent to the peer due to an error during execution. - * The Attribute Table has been updated if one of the following error codes is returned: @ref NRF_ERROR_INVALID_STATE, @ref NRF_ERROR_BUSY, - * @ref NRF_ERROR_FORBIDDEN, @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING and @ref NRF_ERROR_RESOURCES. - * The caller can check whether the value has been updated by looking at the contents of *(p_hvx_params->p_len). - * - * @note Only one indication procedure can be ongoing per connection at a time. - * If the application tries to indicate an attribute value while another indication procedure is ongoing, - * the function call will return @ref NRF_ERROR_BUSY. - * A @ref BLE_GATTS_EVT_HVC event will be issued as soon as the confirmation arrives from the peer. - * - * @note The number of Handle Value Notifications that can be queued is configured by @ref ble_gatts_conn_cfg_t::hvn_tx_queue_size - * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. - * A @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event will be issued as soon as the transmission of the notification is complete. - * - * @note The application can keep track of the available queue element count for notifications by following the procedure below: - * - Store initial queue element count in a variable. - * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. - * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event. - * - * @events - * @event{@ref BLE_GATTS_EVT_HVN_TX_COMPLETE, Notification transmission complete.} - * @event{@ref BLE_GATTS_EVT_HVC, Confirmation received from the peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} - * @mmsc{@ref BLE_GATTS_HVN_MSC} - * @mmsc{@ref BLE_GATTS_HVI_MSC} - * @mmsc{@ref BLE_GATTS_HVX_DISABLED_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_hvx_params Pointer to an HVx parameters structure. If the p_data member contains a non-NULL pointer the attribute value will be updated with - * the contents pointed by it before sending the notification or indication. - * - * @retval ::NRF_SUCCESS Successfully queued a notification or indication for transmission, and optionally updated the attribute value. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: - * - Invalid Connection State - * - Notifications and/or indications not enabled in the CCCD - * - An ATT_MTU exchange is ongoing - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied. Only attributes added directly by the application are available to notify and indicate. - * @retval ::BLE_ERROR_GATTS_INVALID_ATTR_TYPE Invalid attribute type(s) supplied, only characteristic values may be notified and indicated. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - * @retval ::NRF_ERROR_FORBIDDEN The connection's current security level is lower than the one required by the write permissions of the CCCD associated with this characteristic. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_BUSY For @ref BLE_GATT_HVX_INDICATION Procedure already in progress. Wait for a @ref BLE_GATTS_EVT_HVC event and retry. - * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. - * @retval ::NRF_ERROR_RESOURCES Too many notifications queued. - * Wait for a @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event and retry. - */ -SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t const *p_hvx_params)); - -/**@brief Indicate the Service Changed attribute value. - * - * @details This call will send a Handle Value Indication to one or more peers connected to inform them that the Attribute - * Table layout has changed. As soon as the peer has confirmed the indication, a @ref BLE_GATTS_EVT_SC_CONFIRM event will - * be issued. - * - * @note Some of the restrictions and limitations that apply to @ref sd_ble_gatts_hvx also apply here. - * - * @events - * @event{@ref BLE_GATTS_EVT_SC_CONFIRM, Confirmation of attribute table change received from peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTS_SC_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] start_handle Start of affected attribute handle range. - * @param[in] end_handle End of affected attribute handle range. - * - * @retval ::NRF_SUCCESS Successfully queued the Service Changed indication for transmission. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_NOT_SUPPORTED Service Changed not enabled at initialization. See @ref - * sd_ble_cfg_set and @ref ble_gatts_cfg_service_changed_t. - * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: - * - Invalid Connection State - * - Notifications and/or indications not enabled in the CCCD - * - An ATT_MTU exchange is ongoing - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied, handles must be in the range populated by the application. - * @retval ::NRF_ERROR_BUSY Procedure already in progress. - * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. - */ -SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle)); - -/**@brief Respond to a Read/Write authorization request. - * - * @note This call should only be used as a response to a @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event issued to the application. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_READ_REQ_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_WRITE_REQ_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_PEER_CANCEL_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_rw_authorize_reply_params Pointer to a structure with the attribute provided by the application. - * - * @note @ref ble_gatts_authorize_params_t::p_data is ignored when this function is used to respond - * to a @ref BLE_GATTS_AUTHORIZE_TYPE_READ event if @ref ble_gatts_authorize_params_t::update - * is set to 0. - * - * @retval ::NRF_SUCCESS Successfully queued a response to the peer, and in the case of a write operation, Attribute Table updated. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no authorization request pending. - * @retval ::NRF_ERROR_INVALID_PARAM Authorization op invalid, - * handle supplied does not match requested handle, - * or invalid data to be written provided by the application. - */ -SVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params)); - - -/**@brief Update persistent system attribute information. - * - * @details Supply information about persistent system attributes to the stack, - * previously obtained using @ref sd_ble_gatts_sys_attr_get. - * This call is only allowed for active connections, and is usually - * made immediately after a connection is established with an known bonded device, - * often as a response to a @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. - * - * p_sysattrs may point directly to the application's stored copy of the system attributes - * obtained using @ref sd_ble_gatts_sys_attr_get. - * If the pointer is NULL, the system attribute info is initialized, assuming that - * the application does not have any previously saved system attribute data for this device. - * - * @note The state of persistent system attributes is reset upon connection establishment and then remembered for its duration. - * - * @note If this call returns with an error code different from @ref NRF_SUCCESS, the storage of persistent system attributes may have been completed only partially. - * This means that the state of the attribute table is undefined, and the application should either provide a new set of attributes using this same call or - * reset the SoftDevice to return to a known state. - * - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be modified. - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be modified. - * - * @mscs - * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} - * @mmsc{@ref BLE_GATTS_SYS_ATTRS_UNK_PEER_MSC} - * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_sys_attr_data Pointer to a saved copy of system attributes supplied to the stack, or NULL. - * @param[in] len Size of data pointed by p_sys_attr_data, in octets. - * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS - * - * @retval ::NRF_SUCCESS Successfully set the system attribute information. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. - * @retval ::NRF_ERROR_INVALID_DATA Invalid data supplied, the data should be exactly the same as retrieved with @ref sd_ble_gatts_sys_attr_get. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ -SVCALL(SD_BLE_GATTS_SYS_ATTR_SET, uint32_t, sd_ble_gatts_sys_attr_set(uint16_t conn_handle, uint8_t const *p_sys_attr_data, uint16_t len, uint32_t flags)); - - -/**@brief Retrieve persistent system attribute information from the stack. - * - * @details This call is used to retrieve information about values to be stored persistently by the application - * during the lifetime of a connection or after it has been terminated. When a new connection is established with the same bonded device, - * the system attribute information retrieved with this function should be restored using using @ref sd_ble_gatts_sys_attr_set. - * If retrieved after disconnection, the data should be read before a new connection established. The connection handle for - * the previous, now disconnected, connection will remain valid until a new one is created to allow this API call to refer to it. - * Connection handles belonging to active connections can be used as well, but care should be taken since the system attributes - * may be written to at any time by the peer during a connection's lifetime. - * - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be returned. - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be returned. - * - * @mscs - * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle of the recently terminated connection. - * @param[out] p_sys_attr_data Pointer to a buffer where updated information about system attributes will be filled in. The format of the data is described - * in @ref BLE_GATTS_SYS_ATTRS_FORMAT. NULL can be provided to obtain the length of the data. - * @param[in,out] p_len Size of application buffer if p_sys_attr_data is not NULL. Unconditionally updated to actual length of system attribute data. - * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS - * - * @retval ::NRF_SUCCESS Successfully retrieved the system attribute information. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. - * @retval ::NRF_ERROR_DATA_SIZE The system attribute information did not fit into the provided buffer. - * @retval ::NRF_ERROR_NOT_FOUND No system attributes found. - */ -SVCALL(SD_BLE_GATTS_SYS_ATTR_GET, uint32_t, sd_ble_gatts_sys_attr_get(uint16_t conn_handle, uint8_t *p_sys_attr_data, uint16_t *p_len, uint32_t flags)); - - -/**@brief Retrieve the first valid user attribute handle. - * - * @param[out] p_handle Pointer to an integer where the handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully retrieved the handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - */ -SVCALL(SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, uint32_t, sd_ble_gatts_initial_user_handle_get(uint16_t *p_handle)); - -/**@brief Retrieve the attribute UUID and/or metadata. - * - * @param[in] handle Attribute handle - * @param[out] p_uuid UUID of the attribute. Use NULL to omit this field. - * @param[out] p_md Metadata of the attribute. Use NULL to omit this field. - * - * @retval ::NRF_SUCCESS Successfully retrieved the attribute metadata, - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. Returned when both @c p_uuid and @c p_md are NULL. - * @retval ::NRF_ERROR_NOT_FOUND Attribute was not found. - */ -SVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, ble_uuid_t * p_uuid, ble_gatts_attr_md_t * p_md)); - -/**@brief Reply to an ATT_MTU exchange request by sending an Exchange MTU Response to the client. - * - * @details This function is only used to reply to a @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST event. - * - * @details The SoftDevice sets ATT_MTU to the minimum of: - * - The Client RX MTU value from @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, and - * - The Server RX MTU value. - * - * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. - * - * @mscs - * @mmsc{@ref BLE_GATTS_MTU_EXCHANGE} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] server_rx_mtu Server RX MTU size. - * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. - * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration - used for this connection. - * - The value must be equal to Client RX MTU size given in @ref sd_ble_gattc_exchange_mtu_request - * if an ATT_MTU exchange has already been performed in the other direction. - * - * @retval ::NRF_SUCCESS Successfully sent response to the client. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no ATT_MTU exchange request pending. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid Server RX MTU size supplied. - */ -SVCALL(SD_BLE_GATTS_EXCHANGE_MTU_REPLY, uint32_t, sd_ble_gatts_exchange_mtu_reply(uint16_t conn_handle, uint16_t server_rx_mtu)); -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_GATTS_H__ - -/** - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_l2cap.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_l2cap.h deleted file mode 100644 index 90cce565d8..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_l2cap.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** - @addtogroup BLE_L2CAP Logical Link Control and Adaptation Protocol (L2CAP) - @{ - @brief Definitions and prototypes for the L2CAP interface. - */ - -#ifndef BLE_L2CAP_H__ -#define BLE_L2CAP_H__ - -#include "ble_types.h" -#include "ble_ranges.h" -#include "ble_err.h" -#include "nrf_svc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup BLE_L2CAP_DEFINES Defines - * @{ */ - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_L2CAP_H__ - -/** - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_ranges.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_ranges.h deleted file mode 100644 index f9c6af76b8..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_ranges.h +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** - @addtogroup BLE_COMMON - @{ - @defgroup ble_ranges Module specific SVC, event and option number subranges - @{ - - @brief Definition of SVC, event and option number subranges for each API module. - - @note - SVCs, event and option numbers are split into subranges for each API module. - Each module receives its entire allocated range of SVC calls, whether implemented or not, - but return BLE_ERROR_NOT_SUPPORTED for unimplemented or undefined calls in its range. - - Note that the symbols BLE__SVC_LAST is the end of the allocated SVC range, - rather than the last SVC function call actually defined and implemented. - - Specific SVC, event and option values are defined in each module's ble_.h file, - which defines names of each individual SVC code based on the range start value. -*/ - -#ifndef BLE_RANGES_H__ -#define BLE_RANGES_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define BLE_SVC_BASE 0x60 /**< Common BLE SVC base. */ -#define BLE_SVC_LAST 0x6B /**< Common BLE SVC last. */ - -#define BLE_GAP_SVC_BASE 0x6C /**< GAP BLE SVC base. */ -#define BLE_GAP_SVC_LAST 0x93 /**< GAP BLE SVC last. */ - -#define BLE_GATTC_SVC_BASE 0x94 /**< GATTC BLE SVC base. */ -#define BLE_GATTC_SVC_LAST 0x9F /**< GATTC BLE SVC last. */ - -#define BLE_GATTS_SVC_BASE 0xA0 /**< GATTS BLE SVC base. */ -#define BLE_GATTS_SVC_LAST 0xAF /**< GATTS BLE SVC last. */ - -#define BLE_L2CAP_SVC_BASE 0xB0 /**< L2CAP BLE SVC base. */ -#define BLE_L2CAP_SVC_LAST 0xBF /**< L2CAP BLE SVC last. */ - - -#define BLE_EVT_INVALID 0x00 /**< Invalid BLE Event. */ - -#define BLE_EVT_BASE 0x01 /**< Common BLE Event base. */ -#define BLE_EVT_LAST 0x0F /**< Common BLE Event last. */ - -#define BLE_GAP_EVT_BASE 0x10 /**< GAP BLE Event base. */ -#define BLE_GAP_EVT_LAST 0x2F /**< GAP BLE Event last. */ - -#define BLE_GATTC_EVT_BASE 0x30 /**< GATTC BLE Event base. */ -#define BLE_GATTC_EVT_LAST 0x4F /**< GATTC BLE Event last. */ - -#define BLE_GATTS_EVT_BASE 0x50 /**< GATTS BLE Event base. */ -#define BLE_GATTS_EVT_LAST 0x6F /**< GATTS BLE Event last. */ - -#define BLE_L2CAP_EVT_BASE 0x70 /**< L2CAP BLE Event base. */ -#define BLE_L2CAP_EVT_LAST 0x8F /**< L2CAP BLE Event last. */ - - -#define BLE_OPT_INVALID 0x00 /**< Invalid BLE Option. */ - -#define BLE_OPT_BASE 0x01 /**< Common BLE Option base. */ -#define BLE_OPT_LAST 0x1F /**< Common BLE Option last. */ - -#define BLE_GAP_OPT_BASE 0x20 /**< GAP BLE Option base. */ -#define BLE_GAP_OPT_LAST 0x3F /**< GAP BLE Option last. */ - -#define BLE_GATT_OPT_BASE 0x40 /**< GATT BLE Option base. */ -#define BLE_GATT_OPT_LAST 0x5F /**< GATT BLE Option last. */ - -#define BLE_GATTC_OPT_BASE 0x60 /**< GATTC BLE Option base. */ -#define BLE_GATTC_OPT_LAST 0x7F /**< GATTC BLE Option last. */ - -#define BLE_GATTS_OPT_BASE 0x80 /**< GATTS BLE Option base. */ -#define BLE_GATTS_OPT_LAST 0x9F /**< GATTS BLE Option last. */ - -#define BLE_L2CAP_OPT_BASE 0xA0 /**< L2CAP BLE Option base. */ -#define BLE_L2CAP_OPT_LAST 0xBF /**< L2CAP BLE Option last. */ - - -#define BLE_CFG_INVALID 0x00 /**< Invalid BLE configuration. */ - -#define BLE_CFG_BASE 0x01 /**< Common BLE configuration base. */ -#define BLE_CFG_LAST 0x1F /**< Common BLE configuration last. */ - -#define BLE_CONN_CFG_BASE 0x20 /**< BLE connection configuration base. */ -#define BLE_CONN_CFG_LAST 0x3F /**< BLE connection configuration last. */ - -#define BLE_GAP_CFG_BASE 0x40 /**< GAP BLE configuration base. */ -#define BLE_GAP_CFG_LAST 0x5F /**< GAP BLE configuration last. */ - -#define BLE_GATT_CFG_BASE 0x60 /**< GATT BLE configuration base. */ -#define BLE_GATT_CFG_LAST 0x7F /**< GATT BLE configuration last. */ - -#define BLE_GATTC_CFG_BASE 0x80 /**< GATTC BLE configuration base. */ -#define BLE_GATTC_CFG_LAST 0x9F /**< GATTC BLE configuration last. */ - -#define BLE_GATTS_CFG_BASE 0xA0 /**< GATTS BLE configuration base. */ -#define BLE_GATTS_CFG_LAST 0xBF /**< GATTS BLE configuration last. */ - -#define BLE_L2CAP_CFG_BASE 0xC0 /**< L2CAP BLE configuration base. */ -#define BLE_L2CAP_CFG_LAST 0xDF /**< L2CAP BLE configuration last. */ - - - - - -#ifdef __cplusplus -} -#endif -#endif /* BLE_RANGES_H__ */ - -/** - @} - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf52/nrf_mbr.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf52/nrf_mbr.h deleted file mode 100644 index ccbe96bd59..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf52/nrf_mbr.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/** - @defgroup nrf_mbr_api Master Boot Record API - @{ - - @brief APIs for updating SoftDevice and BootLoader - -*/ - -#ifndef NRF_MBR_H__ -#define NRF_MBR_H__ - -#include "nrf_svc.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup NRF_MBR_DEFINES Defines - * @{ */ - -/**@brief MBR SVC Base number. */ -#define MBR_SVC_BASE (0x18) - -/**@brief Page size in words. */ -#define MBR_PAGE_SIZE_IN_WORDS (1024) - -/** @brief The size that must be reserved for the MBR when a SoftDevice is written to flash. -This is the offset where the first byte of the SoftDevice hex file is written.*/ -#define MBR_SIZE (0x1000) - -/** @} */ - -/** @addtogroup NRF_MBR_ENUMS Enumerations - * @{ */ - -/**@brief nRF Master Boot Record API SVC numbers. */ -enum NRF_MBR_SVCS -{ - SD_MBR_COMMAND = MBR_SVC_BASE, /**< ::sd_mbr_command */ -}; - -/**@brief Possible values for ::sd_mbr_command_t.command */ -enum NRF_MBR_COMMANDS -{ - SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see sd_mbr_command_copy_bl_t*/ - SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ - SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD*/ - SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ - SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Start forwarding all exception to this address @see ::sd_mbr_command_vector_table_base_set_t*/ -}; - -/** @} */ - -/** @addtogroup NRF_MBR_TYPES Types - * @{ */ - -/**@brief This command copies part of a new SoftDevice - * The destination area is erased before copying. - * If dst is in the middle of a flash page, that whole flash page will be erased. - * If (dst+len) is in the middle of a flash page, that whole flash page will be erased. - * - * The user of this function is responsible for setting the BPROT registers. - * - * @retval ::NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly. - * @retval ::NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying. - */ -typedef struct -{ - uint32_t *src; /**< Pointer to the source of data to be copied.*/ - uint32_t *dst; /**< Pointer to the destination where the content is to be copied.*/ - uint32_t len; /**< Number of 32 bit words to copy. Must be a multiple of @ref MBR_PAGE_SIZE_IN_WORDS words.*/ -} sd_mbr_command_copy_sd_t; - - -/**@brief This command works like memcmp, but takes the length in words. - * - * @retval ::NRF_SUCCESS indicates that the contents of both memory blocks are equal. - * @retval ::NRF_ERROR_NULL indicates that the contents of the memory blocks are not equal. - */ -typedef struct -{ - uint32_t *ptr1; /**< Pointer to block of memory. */ - uint32_t *ptr2; /**< Pointer to block of memory. */ - uint32_t len; /**< Number of 32 bit words to compare.*/ -} sd_mbr_command_compare_t; - - -/**@brief This command copies a new BootLoader. - * With this command, destination of BootLoader is always the address written in NRF_UICR->BOOTADDR. - * - * Destination is erased by this function. - * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. - * - * This function will use PROTENSET to protect the flash that is not intended to be written. - * - * On success, this function will not return. It will start the new BootLoader from reset-vector as normal. - * - * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. - * @retval ::NRF_ERROR_FORBIDDEN if NRF_UICR->BOOTADDR is not set. - * @retval ::NRF_ERROR_INVALID_LENGTH if parameters attempts to read or write outside flash area. - * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) - */ -typedef struct -{ - uint32_t *bl_src; /**< Pointer to the source of the Bootloader to be be copied.*/ - uint32_t bl_len; /**< Number of 32 bit words to copy for BootLoader. */ -} sd_mbr_command_copy_bl_t; - -/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR - * - * Once this function has been called, this address is where the MBR will start to forward interrupts to after a reset. - * - * To restore default forwarding this function should be called with @param address set to 0. - * The MBR will then start forwarding to interrupts to the address in NFR_UICR->BOOTADDR or to the SoftDevice if the BOOTADDR is not set. - * - * On success, this function will not return. It will reset the device. - * - * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. - * @retval ::NRF_ERROR_INVALID_ADDR if parameter address is outside of the flash size. - * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) - */ -typedef struct -{ - uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ -} sd_mbr_command_vector_table_base_set_t; - - -typedef struct -{ - uint32_t command; /**< type of command to be issued see @ref NRF_MBR_COMMANDS. */ - union - { - sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ - sd_mbr_command_compare_t compare; /**< Parameters for verify.*/ - sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ - sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ - } params; -} sd_mbr_command_t; - -/** @} */ - -/** @addtogroup NRF_MBR_FUNCTIONS Functions - * @{ */ - -/**@brief Issue Master Boot Record commands - * - * Commands used when updating a SoftDevice and bootloader. - * - * The SD_MBR_COMMAND_COPY_BL and SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires parameters to be - * retained by the MBR when resetting the IC. This is done in a separate flash page - * provided by the application. The UICR register UICR.NRFFW[1] must be set - * to an address corresponding to a page in the application flash space. This page will be cleared - * by the MBR and used to store the command before reset. When the UICR.NRFFW[1] field is set - * the page it refers to must not be used by the application. If the UICR.NRFFW[1] is set to - * 0xFFFFFFFF (the default) MBR commands which use flash will be unavailable and return - * NRF_ERROR_NO_MEM. - * - * @param[in] param Pointer to a struct describing the command. - * - * @note For return values, see ::sd_mbr_command_copy_sd_t ::sd_mbr_command_copy_bl_t ::sd_mbr_command_compare_t ::sd_mbr_command_vector_table_base_set_t - * - * @retval NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF). - * @retval NRF_ERROR_INVALID_PARAM if an invalid command is given. -*/ -SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_MBR_H__ - -/** - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_ble.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_ble.h deleted file mode 100644 index c4835fa6ef..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_ble.h +++ /dev/null @@ -1,615 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** - @addtogroup BLE_COMMON BLE SoftDevice Common - @{ - @defgroup ble_api Events, type definitions and API calls - @{ - - @brief Module independent events, type definitions and API calls for the BLE SoftDevice. - - */ - -#ifndef BLE_H__ -#define BLE_H__ - -#include "ble_ranges.h" -#include "ble_types.h" -#include "ble_gap.h" -#include "ble_l2cap.h" -#include "ble_gatt.h" -#include "ble_gattc.h" -#include "ble_gatts.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_COMMON_ENUMERATIONS Enumerations - * @{ */ - -/** - * @brief Common API SVC numbers. - */ -enum BLE_COMMON_SVCS -{ - SD_BLE_ENABLE = BLE_SVC_BASE, /**< Enable and initialize the BLE stack */ - SD_BLE_EVT_GET, /**< Get an event from the pending events queue. */ - SD_BLE_UUID_VS_ADD, /**< Add a Vendor Specific UUID. */ - SD_BLE_UUID_DECODE, /**< Decode UUID bytes. */ - SD_BLE_UUID_ENCODE, /**< Encode UUID bytes. */ - SD_BLE_VERSION_GET, /**< Get the local version information (company ID, Link Layer Version, Link Layer Subversion). */ - SD_BLE_USER_MEM_REPLY, /**< User Memory Reply. */ - SD_BLE_OPT_SET, /**< Set a BLE option. */ - SD_BLE_OPT_GET, /**< Get a BLE option. */ - SD_BLE_CFG_SET, /**< Add a configuration to the BLE stack. */ -}; - -/** - * @brief BLE Module Independent Event IDs. - */ -enum BLE_COMMON_EVTS -{ - BLE_EVT_USER_MEM_REQUEST = BLE_EVT_BASE, /**< User Memory request. @ref ble_evt_user_mem_request_t */ - BLE_EVT_USER_MEM_RELEASE, /**< User Memory release. @ref ble_evt_user_mem_release_t */ -}; - -/**@brief BLE Connection Configuration IDs. - * - * IDs that uniquely identify a connection configuration. - */ -enum BLE_CONN_CFGS -{ - BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE, /**< BLE GAP specific connection configuration. */ - BLE_CONN_CFG_GATTC, /**< BLE GATTC specific connection configuration. */ - BLE_CONN_CFG_GATTS, /**< BLE GATTS specific connection configuration. */ - BLE_CONN_CFG_GATT, /**< BLE GATT specific connection configuration. */ -}; - -/**@brief BLE Common Configuration IDs. - * - * IDs that uniquely identify a common configuration. - */ -enum BLE_COMMON_CFGS -{ - BLE_COMMON_CFG_VS_UUID = BLE_CFG_BASE, /**< Vendor specific UUID configuration */ -}; - -/**@brief Common Option IDs. - * IDs that uniquely identify a common option. - */ -enum BLE_COMMON_OPTS -{ - BLE_COMMON_OPT_PA_LNA = BLE_OPT_BASE, /**< PA and LNA options */ - BLE_COMMON_OPT_CONN_EVT_EXT, /**< Extended connection events option */ -}; - -/** @} */ - -/** @addtogroup BLE_COMMON_DEFINES Defines - * @{ */ - -/** @brief Required pointer alignment for BLE Events. -*/ -#define BLE_EVT_PTR_ALIGNMENT 4 - -/** @brief Leaves the maximum of the two arguments. -*/ -#define BLE_MAX(a, b) ((a) < (b) ? (b) : (a)) - -/** @brief Maximum possible length for BLE Events. - * @note The highest value used for @ref ble_gatt_conn_cfg_t::att_mtu in any connection configuration shall be used as a parameter. - * If that value has not been configured for any connections then @ref BLE_GATT_ATT_MTU_DEFAULT must be used instead. -*/ -#define BLE_EVT_LEN_MAX(ATT_MTU) (BLE_MAX( \ - sizeof(ble_evt_t), \ - BLE_MAX( \ - offsetof(ble_evt_t, evt.gattc_evt.params.rel_disc_rsp.includes) + ((ATT_MTU) - 2) / 6 * sizeof(ble_gattc_include_t), \ - offsetof(ble_evt_t, evt.gattc_evt.params.attr_info_disc_rsp.info.attr_info16) + ((ATT_MTU) - 2) / 4 * sizeof(ble_gattc_attr_info16_t) \ - ) \ -)) - -/** @defgroup BLE_USER_MEM_TYPES User Memory Types - * @{ */ -#define BLE_USER_MEM_TYPE_INVALID 0x00 /**< Invalid User Memory Types. */ -#define BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES 0x01 /**< User Memory for GATTS queued writes. */ -/** @} */ - -/** @defgroup BLE_UUID_VS_COUNTS Vendor Specific UUID counts - * @{ - */ -#define BLE_UUID_VS_COUNT_DEFAULT 10 /**< Default VS UUID count. */ -#define BLE_UUID_VS_COUNT_MAX 254 /**< Maximum VS UUID count. */ -/** @} */ - -/** @defgroup BLE_COMMON_CFG_DEFAULTS Configuration defaults. - * @{ - */ -#define BLE_CONN_CFG_TAG_DEFAULT 0 /**< Default configuration tag, SoftDevice default connection configuration. */ - -/** @} */ - -/** @} */ - -/** @addtogroup BLE_COMMON_STRUCTURES Structures - * @{ */ - -/**@brief User Memory Block. */ -typedef struct -{ - uint8_t *p_mem; /**< Pointer to the start of the user memory block. */ - uint16_t len; /**< Length in bytes of the user memory block. */ -} ble_user_mem_block_t; - -/**@brief Event structure for @ref BLE_EVT_USER_MEM_REQUEST. */ -typedef struct -{ - uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ -} ble_evt_user_mem_request_t; - -/**@brief Event structure for @ref BLE_EVT_USER_MEM_RELEASE. */ -typedef struct -{ - uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ - ble_user_mem_block_t mem_block; /**< User memory block */ -} ble_evt_user_mem_release_t; - -/**@brief Event structure for events not associated with a specific function module. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which this event occurred. */ - union - { - ble_evt_user_mem_request_t user_mem_request; /**< User Memory Request Event Parameters. */ - ble_evt_user_mem_release_t user_mem_release; /**< User Memory Release Event Parameters. */ - } params; /**< Event parameter union. */ -} ble_common_evt_t; - -/**@brief BLE Event header. */ -typedef struct -{ - uint16_t evt_id; /**< Value from a BLE__EVT series. */ - uint16_t evt_len; /**< Length in octets including this header. */ -} ble_evt_hdr_t; - -/**@brief Common BLE Event type, wrapping the module specific event reports. */ -typedef struct -{ - ble_evt_hdr_t header; /**< Event header. */ - union - { - ble_common_evt_t common_evt; /**< Common Event, evt_id in BLE_EVT_* series. */ - ble_gap_evt_t gap_evt; /**< GAP originated event, evt_id in BLE_GAP_EVT_* series. */ - ble_gattc_evt_t gattc_evt; /**< GATT client originated event, evt_id in BLE_GATTC_EVT* series. */ - ble_gatts_evt_t gatts_evt; /**< GATT server originated event, evt_id in BLE_GATTS_EVT* series. */ - } evt; /**< Event union. */ -} ble_evt_t; - - -/** - * @brief Version Information. - */ -typedef struct -{ - uint8_t version_number; /**< Link Layer Version number for BT 4.1 spec is 7 (https://www.bluetooth.org/en-us/specification/assigned-numbers/link-layer). */ - uint16_t company_id; /**< Company ID, Nordic Semiconductor's company ID is 89 (0x0059) (https://www.bluetooth.org/apps/content/Default.aspx?doc_id=49708). */ - uint16_t subversion_number; /**< Link Layer Sub Version number, corresponds to the SoftDevice Config ID or Firmware ID (FWID). */ -} ble_version_t; - -/** - * @brief Configuration parameters for the PA and LNA. - */ -typedef struct -{ - uint8_t enable :1; /**< Enable toggling for this amplifier */ - uint8_t active_high :1; /**< Set the pin to be active high */ - uint8_t gpio_pin :6; /**< The GPIO pin to toggle for this amplifier */ -} ble_pa_lna_cfg_t; - -/** - * @brief PA & LNA GPIO toggle configuration - * - * This option configures the SoftDevice to toggle pins when the radio is active for use with a power amplifier and/or - * a low noise amplifier. - * - * Toggling the pins is achieved by using two PPI channels and a GPIOTE channel. The hardware channel IDs are provided - * by the application and should be regarded as reserved as long as any PA/LNA toggling is enabled. - * - * @note @ref sd_ble_opt_get is not supported for this option. - * @note This feature is only supported for nRF52, on nRF51 @ref NRF_ERROR_NOT_SUPPORTED will always be returned. - * @note Setting this option while the radio is in use (i.e. any of the roles are active) may have undefined consequences - * and must be avoided by the application. - */ -typedef struct -{ - ble_pa_lna_cfg_t pa_cfg; /**< Power Amplifier configuration */ - ble_pa_lna_cfg_t lna_cfg; /**< Low Noise Amplifier configuration */ - - uint8_t ppi_ch_id_set; /**< PPI channel used for radio pin setting */ - uint8_t ppi_ch_id_clr; /**< PPI channel used for radio pin clearing */ - uint8_t gpiote_ch_id; /**< GPIOTE channel used for radio pin toggling */ -} ble_common_opt_pa_lna_t; - -/** - * @brief Configuration of extended BLE connection events. - * - * When enabled the SoftDevice will dynamically extend the connection event when possible. - * - * The connection event length is controlled by the connection configuration as set by @ref ble_gap_conn_cfg_t::event_length. - * The connection event can be extended if there is time to send another packet pair before the start of the next connection interval, - * and if there are no conflicts with other BLE roles requesting radio time. - * - * @note @ref sd_ble_opt_get is not supported for this option. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable extended BLE connection events, disabled by default. */ -} ble_common_opt_conn_evt_ext_t; - -/**@brief Option structure for common options. */ -typedef union -{ - ble_common_opt_pa_lna_t pa_lna; /**< Parameters for controlling PA and LNA pin toggling. */ - ble_common_opt_conn_evt_ext_t conn_evt_ext; /**< Parameters for enabling extended connection events. */ -} ble_common_opt_t; - -/**@brief Common BLE Option type, wrapping the module specific options. */ -typedef union -{ - ble_common_opt_t common_opt; /**< COMMON options, opt_id in @ref BLE_COMMON_OPTS series. */ - ble_gap_opt_t gap_opt; /**< GAP option, opt_id in @ref BLE_GAP_OPTS series. */ -} ble_opt_t; - -/**@brief BLE connection configuration type, wrapping the module specific configurations, set with - * @ref sd_ble_cfg_set. - * - * @note Connection configurations don't have to be set. - * In the case that no configurations has been set, or fewer connection configurations has been set than enabled connections, - * the default connection configuration will be automatically added for the remaining connections. - * When creating connections with the default configuration, @ref BLE_CONN_CFG_TAG_DEFAULT should be used in - * place of @ref ble_conn_cfg_t::conn_cfg_tag. See @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect()" - * - * @mscs - * @mmsc{@ref BLE_CONN_CFG} - * @endmscs - - */ -typedef struct -{ - uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() - calls to select this configuration when creating a connection. - Must be different for all connection configurations added and not @ref BLE_CONN_CFG_TAG_DEFAULT. */ - union { - ble_gap_conn_cfg_t gap_conn_cfg; /**< GAP connection configuration, cfg_id is @ref BLE_CONN_CFG_GAP. */ - ble_gattc_conn_cfg_t gattc_conn_cfg; /**< GATTC connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTC. */ - ble_gatts_conn_cfg_t gatts_conn_cfg; /**< GATTS this connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTS. */ - ble_gatt_conn_cfg_t gatt_conn_cfg; /**< GATT this connection configuration, cfg_id is @ref BLE_CONN_CFG_GATT. */ - } params; /**< Connection configuration union. */ -} ble_conn_cfg_t; - -/** - * @brief Configuration of Vendor Specific UUIDs, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_INVALID_PARAM Too many UUIDs configured. - */ -typedef struct -{ - uint8_t vs_uuid_count; /**< Number of 128-bit Vendor Specific UUID bases to allocate memory for. - Default value is @ref BLE_UUID_VS_COUNT_DEFAULT. Maximum value is - @ref BLE_UUID_VS_COUNT_MAX. */ -} ble_common_cfg_vs_uuid_t; - -/**@brief Common BLE Configuration type, wrapping the common configurations. */ -typedef union -{ - ble_common_cfg_vs_uuid_t vs_uuid_cfg; /**< Vendor specific UUID configuration, cfg_id is @ref BLE_COMMON_CFG_VS_UUID. */ -} ble_common_cfg_t; - -/**@brief BLE Configuration type, wrapping the module specific configurations. */ -typedef union -{ - ble_conn_cfg_t conn_cfg; /**< Connection specific configurations, cfg_id in @ref BLE_CONN_CFGS series. */ - ble_common_cfg_t common_cfg; /**< Global common configurations, cfg_id in @ref BLE_COMMON_CFGS series. */ - ble_gap_cfg_t gap_cfg; /**< Global GAP configurations, cfg_id in @ref BLE_GAP_CFGS series. */ - ble_gatts_cfg_t gatts_cfg; /**< Global GATTS configuration, cfg_id in @ref BLE_GATTS_CFGS series. */ -} ble_cfg_t; - -/** @} */ - -/** @addtogroup BLE_COMMON_FUNCTIONS Functions - * @{ */ - -/**@brief Enable the BLE stack - * - * @param[in, out] p_app_ram_base Pointer to a variable containing the start address of the - * application RAM region (APP_RAM_BASE). On return, this will - * contain the minimum start address of the application RAM region - * required by the SoftDevice for this configuration. - * - * @note The memory requirement for a specific configuration will not increase between SoftDevices - * with the same major version number. - * - * @note The value of *p_app_ram_base when the app has done no custom configuration of the - * SoftDevice, i.e. the app has not called @ref sd_ble_cfg_set before @ref sd_ble_enable, can - * be found in the release notes. - * - * @note At runtime the IC's RAM is split into 2 regions: The SoftDevice RAM region is located - * between 0x20000000 and APP_RAM_BASE-1 and the application's RAM region is located between - * APP_RAM_BASE and the start of the call stack. - * - * @details This call initializes the BLE stack, no BLE related function other than @ref - * sd_ble_cfg_set can be called before this one. - * - * @mscs - * @mmsc{@ref BLE_COMMON_ENABLE} - * @endmscs - * - * @retval ::NRF_SUCCESS The BLE stack has been initialized successfully. - * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized and cannot be reinitialized. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. - * @retval ::NRF_ERROR_NO_MEM The amount of memory assigned to the SoftDevice by *p_app_ram_base is not - * large enough to fit this configuration's memory requirement. Check *p_app_ram_base - * and set the start address of the application RAM region accordingly. - */ -SVCALL(SD_BLE_ENABLE, uint32_t, sd_ble_enable(uint32_t * p_app_ram_base)); - -/**@brief Add configurations for the BLE stack - * - * @param[in] cfg_id Config ID, see @ref BLE_CONN_CFGS, @ref BLE_COMMON_CFGS, @ref - * BLE_GAP_CFGS or @ref BLE_GATTS_CFGS. - * @param[in] p_cfg Pointer to a ble_cfg_t structure containing the configuration value. - * @param[in] app_ram_base The start address of the application RAM region (APP_RAM_BASE). - * See @ref sd_ble_enable for details about APP_RAM_BASE. - * - * @note The memory requirement for a specific configuration will not increase between SoftDevices - * with the same major version number. - * - * @note If a configuration is set more than once, the last one set is the one that takes effect on - * @ref sd_ble_enable. - * - * @note Any part of the BLE stack that is NOT configured with @ref sd_ble_cfg_set will have default - * configuration. - * - * @note @ref sd_ble_cfg_set may be called at any time when the SoftDevice is enabled (see @ref - * sd_softdevice_enable) while the BLE part of the SoftDevice is not enabled (see @ref - * sd_ble_enable). - * - * @note Error codes for the configurations are described in the configuration structs. - * - * @mscs - * @mmsc{@ref BLE_COMMON_ENABLE} - * @endmscs - * - * @retval ::NRF_SUCCESS The configuration has been added successfully. - * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid cfg_id supplied. - * @retval ::NRF_ERROR_NO_MEM The amount of memory assigned to the SoftDevice by app_ram_base is not - * large enough to fit this configuration's memory requirement. - */ -SVCALL(SD_BLE_CFG_SET, uint32_t, sd_ble_cfg_set(uint32_t cfg_id, ble_cfg_t const * p_cfg, uint32_t app_ram_base)); - -/**@brief Get an event from the pending events queue. - * - * @param[out] p_dest Pointer to buffer to be filled in with an event, or NULL to retrieve the event length. - * This buffer must be aligned to the extend defined by @ref BLE_EVT_PTR_ALIGNMENT. - * The buffer should be interpreted as a @ref ble_evt_t struct. - * @param[in, out] p_len Pointer the length of the buffer, on return it is filled with the event length. - * - * @details This call allows the application to pull a BLE event from the BLE stack. The application is signaled that - * an event is available from the BLE stack by the triggering of the SD_EVT_IRQn interrupt. - * The application is free to choose whether to call this function from thread mode (main context) or directly from the - * Interrupt Service Routine that maps to SD_EVT_IRQn. In any case however, and because the BLE stack runs at a higher - * priority than the application, this function should be called in a loop (until @ref NRF_ERROR_NOT_FOUND is returned) - * every time SD_EVT_IRQn is raised to ensure that all available events are pulled from the BLE stack. Failure to do so - * could potentially leave events in the internal queue without the application being aware of this fact. - * - * Sizing the p_dest buffer is equally important, since the application needs to provide all the memory necessary for the event to - * be copied into application memory. If the buffer provided is not large enough to fit the entire contents of the event, - * @ref NRF_ERROR_DATA_SIZE will be returned and the application can then call again with a larger buffer size. - * The maximum possible event length is defined by @ref BLE_EVT_LEN_MAX. The application may also "peek" the event length - * by providing p_dest as a NULL pointer and inspecting the value of *p_len upon return: - * - * \code - * uint16_t len; - * errcode = sd_ble_evt_get(NULL, &len); - * \endcode - * - * @mscs - * @mmsc{@ref BLE_COMMON_IRQ_EVT_MSC} - * @mmsc{@ref BLE_COMMON_THREAD_EVT_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Event pulled and stored into the supplied buffer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. - * @retval ::NRF_ERROR_NOT_FOUND No events ready to be pulled. - * @retval ::NRF_ERROR_DATA_SIZE Event ready but could not fit into the supplied buffer. - */ -SVCALL(SD_BLE_EVT_GET, uint32_t, sd_ble_evt_get(uint8_t *p_dest, uint16_t *p_len)); - - -/**@brief Add a Vendor Specific base UUID. - * - * @details This call enables the application to add a vendor specific base UUID to the BLE stack's table, for later - * use with all other modules and APIs. This then allows the application to use the shorter, 24-bit @ref ble_uuid_t - * format when dealing with both 16-bit and 128-bit UUIDs without having to check for lengths and having split code - * paths. This is accomplished by extending the grouping mechanism that the Bluetooth SIG standard base UUID uses - * for all other 128-bit UUIDs. The type field in the @ref ble_uuid_t structure is an index (relative to - * @ref BLE_UUID_TYPE_VENDOR_BEGIN) to the table populated by multiple calls to this function, and the UUID field - * in the same structure contains the 2 bytes at indexes 12 and 13. The number of possible 128-bit UUIDs available to - * the application is therefore the number of Vendor Specific UUIDs added with the help of this function times 65536, - * although restricted to modifying bytes 12 and 13 for each of the entries in the supplied array. - * - * @note Bytes 12 and 13 of the provided UUID will not be used internally, since those are always replaced by - * the 16-bit uuid field in @ref ble_uuid_t. - * - * @note If a UUID is already present in the BLE stack's internal table, the corresponding index will be returned in - * p_uuid_type along with an NRF_SUCCESS error code. - * - * @param[in] p_vs_uuid Pointer to a 16-octet (128-bit) little endian Vendor Specific UUID disregarding - * bytes 12 and 13. - * @param[out] p_uuid_type Pointer to a uint8_t where the type field in @ref ble_uuid_t corresponding to this UUID will be stored. - * - * @retval ::NRF_SUCCESS Successfully added the Vendor Specific UUID. - * @retval ::NRF_ERROR_INVALID_ADDR If p_vs_uuid or p_uuid_type is NULL or invalid. - * @retval ::NRF_ERROR_NO_MEM If there are no more free slots for VS UUIDs. - */ -SVCALL(SD_BLE_UUID_VS_ADD, uint32_t, sd_ble_uuid_vs_add(ble_uuid128_t const *p_vs_uuid, uint8_t *p_uuid_type)); - - -/** @brief Decode little endian raw UUID bytes (16-bit or 128-bit) into a 24 bit @ref ble_uuid_t structure. - * - * @details The raw UUID bytes excluding bytes 12 and 13 (i.e. bytes 0-11 and 14-15) of p_uuid_le are compared - * to the corresponding ones in each entry of the table of vendor specific UUIDs populated with @ref sd_ble_uuid_vs_add - * to look for a match. If there is such a match, bytes 12 and 13 are returned as p_uuid->uuid and the index - * relative to @ref BLE_UUID_TYPE_VENDOR_BEGIN as p_uuid->type. - * - * @note If the UUID length supplied is 2, then the type set by this call will always be @ref BLE_UUID_TYPE_BLE. - * - * @param[in] uuid_le_len Length in bytes of the buffer pointed to by p_uuid_le (must be 2 or 16 bytes). - * @param[in] p_uuid_le Pointer pointing to little endian raw UUID bytes. - * @param[out] p_uuid Pointer to a @ref ble_uuid_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Successfully decoded into the @ref ble_uuid_t structure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid UUID length. - * @retval ::NRF_ERROR_NOT_FOUND For a 128-bit UUID, no match in the populated table of UUIDs. - */ -SVCALL(SD_BLE_UUID_DECODE, uint32_t, sd_ble_uuid_decode(uint8_t uuid_le_len, uint8_t const *p_uuid_le, ble_uuid_t *p_uuid)); - - -/** @brief Encode a @ref ble_uuid_t structure into little endian raw UUID bytes (16-bit or 128-bit). - * - * @note The pointer to the destination buffer p_uuid_le may be NULL, in which case only the validity and size of p_uuid is computed. - * - * @param[in] p_uuid Pointer to a @ref ble_uuid_t structure that will be encoded into bytes. - * @param[out] p_uuid_le_len Pointer to a uint8_t that will be filled with the encoded length (2 or 16 bytes). - * @param[out] p_uuid_le Pointer to a buffer where the little endian raw UUID bytes (2 or 16) will be stored. - * - * @retval ::NRF_SUCCESS Successfully encoded into the buffer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid UUID type. - */ -SVCALL(SD_BLE_UUID_ENCODE, uint32_t, sd_ble_uuid_encode(ble_uuid_t const *p_uuid, uint8_t *p_uuid_le_len, uint8_t *p_uuid_le)); - - -/**@brief Get Version Information. - * - * @details This call allows the application to get the BLE stack version information. - * - * @param[out] p_version Pointer to a ble_version_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Version information stored successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy (typically doing a locally-initiated disconnection procedure). - */ -SVCALL(SD_BLE_VERSION_GET, uint32_t, sd_ble_version_get(ble_version_t *p_version)); - - -/**@brief Provide a user memory block. - * - * @note This call can only be used as a response to a @ref BLE_EVT_USER_MEM_REQUEST event issued to the application. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_block Pointer to a user memory block structure or NULL if memory is managed by the application. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_PEER_CANCEL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully queued a response to the peer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid user memory block length supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection state or no user memory request pending. - */ -SVCALL(SD_BLE_USER_MEM_REPLY, uint32_t, sd_ble_user_mem_reply(uint16_t conn_handle, ble_user_mem_block_t const *p_block)); - -/**@brief Set a BLE option. - * - * @details This call allows the application to set the value of an option. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC} - * @endmscs - * - * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS. - * @param[in] p_opt Pointer to a ble_opt_t structure containing the option value. - * - * @retval ::NRF_SUCCESS Option set successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Unable to set the parameter at this time. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. - */ -SVCALL(SD_BLE_OPT_SET, uint32_t, sd_ble_opt_set(uint32_t opt_id, ble_opt_t const *p_opt)); - - -/**@brief Get a BLE option. - * - * @details This call allows the application to retrieve the value of an option. - * - * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS. - * @param[out] p_opt Pointer to a ble_opt_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Option retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Unable to retrieve the parameter at this time. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. - * @retval ::NRF_ERROR_NOT_SUPPORTED This option is not supported. - * - */ -SVCALL(SD_BLE_OPT_GET, uint32_t, sd_ble_opt_get(uint32_t opt_id, ble_opt_t *p_opt)); - -/** @} */ -#ifdef __cplusplus -} -#endif -#endif /* BLE_H__ */ - -/** - @} - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error_sdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error_sdm.h deleted file mode 100644 index 103659a913..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error_sdm.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - /** - @addtogroup nrf_sdm_api - @{ - @defgroup nrf_sdm_error SoftDevice Manager Error Codes - @{ - - @brief Error definitions for the SDM API -*/ - -/* Header guard */ -#ifndef NRF_ERROR_SDM_H__ -#define NRF_ERROR_SDM_H__ - -#include "nrf_error.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN (NRF_ERROR_SDM_BASE_NUM + 0) ///< Unknown LFCLK source. -#define NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION (NRF_ERROR_SDM_BASE_NUM + 1) ///< Incorrect interrupt configuration (can be caused by using illegal priority levels, or having enabled SoftDevice interrupts). -#define NRF_ERROR_SDM_INCORRECT_CLENR0 (NRF_ERROR_SDM_BASE_NUM + 2) ///< Incorrect CLENR0 (can be caused by erroneous SoftDevice flashing). - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_SDM_H__ - -/** - @} - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error_soc.h deleted file mode 100644 index e31d8c9c97..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error_soc.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/** - @addtogroup nrf_soc_api - @{ - @defgroup nrf_soc_error SoC Library Error Codes - @{ - - @brief Error definitions for the SoC library - -*/ - -/* Header guard */ -#ifndef NRF_ERROR_SOC_H__ -#define NRF_ERROR_SOC_H__ - -#include "nrf_error.h" -#ifdef __cplusplus -extern "C" { -#endif - -/* Mutex Errors */ -#define NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN (NRF_ERROR_SOC_BASE_NUM + 0) ///< Mutex already taken - -/* NVIC errors */ -#define NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE (NRF_ERROR_SOC_BASE_NUM + 1) ///< NVIC interrupt not available -#define NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED (NRF_ERROR_SOC_BASE_NUM + 2) ///< NVIC interrupt priority not allowed -#define NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 3) ///< NVIC should not return - -/* Power errors */ -#define NRF_ERROR_SOC_POWER_MODE_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 4) ///< Power mode unknown -#define NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 5) ///< Power POF threshold unknown -#define NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 6) ///< Power off should not return - -/* Rand errors */ -#define NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES (NRF_ERROR_SOC_BASE_NUM + 7) ///< RAND not enough values - -/* PPI errors */ -#define NRF_ERROR_SOC_PPI_INVALID_CHANNEL (NRF_ERROR_SOC_BASE_NUM + 8) ///< Invalid PPI Channel -#define NRF_ERROR_SOC_PPI_INVALID_GROUP (NRF_ERROR_SOC_BASE_NUM + 9) ///< Invalid PPI Group - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_SOC_H__ -/** - @} - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_sd_def.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_sd_def.h deleted file mode 100644 index 0b4d221d6a..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_sd_def.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#ifndef NRF_SD_DEF_H__ -#define NRF_SD_DEF_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define SD_PPI_CHANNELS_USED 0xFFFE0000uL /**< PPI channels utilized by SotfDevice (not available to the application). */ -#define SD_PPI_GROUPS_USED 0x0000000CuL /**< PPI groups utilized by SoftDevice (not available to the application). */ -#define SD_TIMERS_USED 0x00000001uL /**< Timers used by SoftDevice. */ -#define SD_SWI_USED 0x0000003CuL /**< Software interrupts used by SoftDevice */ - - -#ifdef __cplusplus -} -#endif - -#endif /* NRF_SD_DEF_H__ */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_sdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_sdm.h deleted file mode 100644 index 57ffe13358..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_sdm.h +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/** - @defgroup nrf_sdm_api SoftDevice Manager API - @{ - - @brief APIs for SoftDevice management. - -*/ - -#ifndef NRF_SDM_H__ -#define NRF_SDM_H__ - -#include "nrf_svc.h" -#include "nrf.h" -#include "nrf_soc.h" -#include "nrf_error_sdm.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup NRF_SDM_DEFINES Defines - * @{ */ -#ifdef NRFSOC_DOXYGEN -/// Declared in nrf_mbr.h -#define MBR_SIZE 0 -#warning test -#endif - -/** @brief The major version for the SoftDevice binary distributed with this header file. */ -#define SD_MAJOR_VERSION (0) - -/** @brief The minor version for the SoftDevice binary distributed with this header file. */ -#define SD_MINOR_VERSION (0) - -/** @brief The bugfix version for the SoftDevice binary distributed with this header file. */ -#define SD_BUGFIX_VERSION (0) - -/** @brief The full version number for the SoftDevice binary this header file was distributed - * with, as a decimal number in the form Mmmmbbb, where: - * - M is major version (one or more digits) - * - mmm is minor version (three digits) - * - bbb is bugfix version (three digits). */ -#define SD_VERSION (SD_MAJOR_VERSION * 1000000 + SD_MINOR_VERSION * 1000 + SD_BUGFIX_VERSION) - -/** @brief SoftDevice Manager SVC Base number. */ -#define SDM_SVC_BASE 0x10 - -/** @brief Invalid info field. Returned when an info field does not exist. */ -#define SDM_INFO_FIELD_INVALID (0) - -/** @brief Defines the SoftDevice Information Structure location (address) as an offset from -the start of the SoftDevice (without MBR)*/ -#define SOFTDEVICE_INFO_STRUCT_OFFSET (0x2000) - -/** @brief Defines the absolute SoftDevice Information Structure location (address) when the - * SoftDevice is installed just above the MBR (the usual case). */ -#define SOFTDEVICE_INFO_STRUCT_ADDRESS (SOFTDEVICE_INFO_STRUCT_OFFSET + MBR_SIZE) - -/** @brief Defines the offset for the SoftDevice Information Structure size value relative to the - * SoftDevice base address. The size value is of type uint8_t. */ -#define SD_INFO_STRUCT_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET) - -/** @brief Defines the offset for the SoftDevice size value relative to the SoftDevice base address. - * The size value is of type uint32_t. */ -#define SD_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x08) - -/** @brief Defines the offset for FWID value relative to the SoftDevice base address. The FWID value - * is of type uint16_t. */ -#define SD_FWID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x0C) - -/** @brief Defines the offset for the SoftDevice ID relative to the SoftDevice base address. The ID - * is of type uint32_t. */ -#define SD_ID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x10) - -/** @brief Defines the offset for the SoftDevice version relative to the SoftDevice base address in - * the same format as @ref SD_VERSION, stored as an uint32_t. */ -#define SD_VERSION_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x14) - -/** @brief Defines a macro for retrieving the actual SoftDevice Information Structure size value - * from a given base address. Use @ref MBR_SIZE as the argument when the SoftDevice is - * installed just above the MBR (the usual case). */ -#define SD_INFO_STRUCT_SIZE_GET(baseaddr) (*((uint8_t *) ((baseaddr) + SD_INFO_STRUCT_SIZE_OFFSET))) - -/** @brief Defines a macro for retrieving the actual SoftDevice size value from a given base - * address. Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above - * the MBR (the usual case). */ -#define SD_SIZE_GET(baseaddr) (*((uint32_t *) ((baseaddr) + SD_SIZE_OFFSET))) - -/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use @ref - * MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual - * case). */ -#define SD_FWID_GET(baseaddr) (*((uint16_t *) ((baseaddr) + SD_FWID_OFFSET))) - -/** @brief Defines a macro for retrieving the actual SoftDevice ID from a given base address. Use - * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the - * usual case). */ -#define SD_ID_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_ID_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (*((uint32_t *) ((baseaddr) + SD_ID_OFFSET))) : SDM_INFO_FIELD_INVALID) - -/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use @ref - * MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual - * case). */ -#define SD_VERSION_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_VERSION_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (*((uint32_t *) ((baseaddr) + SD_VERSION_OFFSET))) : SDM_INFO_FIELD_INVALID) - -/**@defgroup NRF_FAULT_ID_RANGES Fault ID ranges - * @{ */ -#define NRF_FAULT_ID_SD_RANGE_START 0x00000000 /**< SoftDevice ID range start. */ -#define NRF_FAULT_ID_APP_RANGE_START 0x00001000 /**< Application ID range start. */ -/**@} */ - -/**@defgroup NRF_FAULT_IDS Fault ID types - * @{ */ -#define NRF_FAULT_ID_SD_ASSERT (NRF_FAULT_ID_SD_RANGE_START + 1) /**< SoftDevice assertion. The info parameter is reserved for future used. */ -#define NRF_FAULT_ID_APP_MEMACC (NRF_FAULT_ID_APP_RANGE_START + 1) /**< Application invalid memory access (nRF52 only). The info parameter will contain 0x00000000, in case of SoftDevice RAM - access violation. In case of SoftDevice peripheral register violation the info parameter will contain the sub-region number of PREGION[0], on whose address range the disallowed - write access caused the memory access fault. */ -/**@} */ - -/** @} */ - -/** @addtogroup NRF_SDM_ENUMS Enumerations - * @{ */ - -/**@brief nRF SoftDevice Manager API SVC numbers. */ -enum NRF_SD_SVCS -{ - SD_SOFTDEVICE_ENABLE = SDM_SVC_BASE, /**< ::sd_softdevice_enable */ - SD_SOFTDEVICE_DISABLE, /**< ::sd_softdevice_disable */ - SD_SOFTDEVICE_IS_ENABLED, /**< ::sd_softdevice_is_enabled */ - SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, /**< ::sd_softdevice_vector_table_base_set */ - SVC_SDM_LAST /**< Placeholder for last SDM SVC */ -}; - -/** @} */ - -/** @addtogroup NRF_SDM_DEFINES Defines - * @{ */ - -/**@defgroup NRF_CLOCK_LF_XTAL_ACCURACY Clock accuracy - * @{ */ - -#define NRF_CLOCK_LF_XTAL_ACCURACY_250_PPM (0) /**< Default: 250 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_500_PPM (1) /**< 500 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_150_PPM (2) /**< 150 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_100_PPM (3) /**< 100 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_75_PPM (4) /**< 75 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_50_PPM (5) /**< 50 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_30_PPM (6) /**< 30 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_20_PPM (7) /**< 20 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_10_PPM (8) /**< 10 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_5_PPM (9) /**< 5 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_2_PPM (10) /**< 2 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_1_PPM (11) /**< 1 ppm */ - -/** @} */ - -/**@defgroup NRF_CLOCK_LF_SRC Possible LFCLK oscillator sources - * @{ */ - -#define NRF_CLOCK_LF_SRC_RC (0) /**< LFCLK RC oscillator. */ -#define NRF_CLOCK_LF_SRC_XTAL (1) /**< LFCLK crystal oscillator. */ -#define NRF_CLOCK_LF_SRC_SYNTH (2) /**< LFCLK Synthesized from HFCLK. */ - -/** @} */ - -/** @} */ - -/** @addtogroup NRF_SDM_TYPES Types - * @{ */ - -/**@brief Type representing LFCLK oscillator source. */ -typedef struct -{ - uint8_t source; /**< LF oscillator clock source, see @ref NRF_CLOCK_LF_SRC. */ - uint8_t rc_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second - units (nRF51: 1-64, nRF52: 1-32). - @note To avoid excessive clock drift, 0.5 degrees Celsius is the - maximum temperature change allowed in one calibration timer - interval. The interval should be selected to ensure this. - - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. */ - uint8_t rc_temp_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: How often (in number of calibration - intervals) the RC oscillator shall be calibrated if the temperature - hasn't changed. - 0: Always calibrate even if the temperature hasn't changed. - 1: Only calibrate if the temperature has changed (nRF51 only). - 2-33: Check the temperature and only calibrate if it has changed, - however calibration will take place every rc_temp_ctiv - intervals in any case. - - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. - - @note For nRF52, the application must ensure calibration at least once - every 8 seconds to ensure +/-250 ppm clock stability. The - recommended configuration for NRF_CLOCK_LF_SRC_RC on nRF52 is - rc_ctiv=16 and rc_temp_ctiv=2. This will ensure calibration at - least once every 8 seconds and for temperature changes of 0.5 - degrees Celsius every 4 seconds. See the Product Specification - for the nRF52 device being used for more information.*/ - uint8_t xtal_accuracy; /**< External crystal clock accuracy used in the LL to compute timing - windows, see @ref NRF_CLOCK_LF_XTAL_ACCURACY. - - @note For the NRF_CLOCK_LF_SRC_RC clock source this parameter is ignored. */ -} nrf_clock_lf_cfg_t; - -/**@brief Fault Handler type. - * - * When certain unrecoverable errors occur within the application or SoftDevice the fault handler will be called back. - * The protocol stack will be in an undefined state when this happens and the only way to recover will be to - * perform a reset, using e.g. CMSIS NVIC_SystemReset(). - * If the application returns from the fault handler the SoftDevice will call NVIC_SystemReset(). - * - * @note This callback is executed in HardFault context, thus SVC functions cannot be called from the fault callback. - * - * @param[in] id Fault identifier. See @ref NRF_FAULT_IDS. - * @param[in] pc The program counter of the instruction that triggered the fault. - * @param[in] info Optional additional information regarding the fault. Refer to each Fault identifier for details. - * - * @note When id is set to NRF_FAULT_ID_APP_MEMACC, pc will contain the address of the instruction being executed at the time when - * the fault is detected by the CPU. The CPU program counter may have advanced up to 2 instructions (no branching) after the one that triggered the fault. - */ -typedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info); - -/** @} */ - -/** @addtogroup NRF_SDM_FUNCTIONS Functions - * @{ */ - -/**@brief Enables the SoftDevice and by extension the protocol stack. - * - * @note Some care must be taken if a low frequency clock source is already running when calling this function: - * If the LF clock has a different source then the one currently running, it will be stopped. Then, the new - * clock source will be started. - * - * @note This function has no effect when returning with an error. - * - * @post If return code is ::NRF_SUCCESS - * - SoC library and protocol stack APIs are made available. - * - A portion of RAM will be unavailable (see relevant SDS documentation). - * - Some peripherals will be unavailable or available only through the SoC API (see relevant SDS documentation). - * - Interrupts will not arrive from protected peripherals or interrupts. - * - nrf_nvic_ functions must be used instead of CMSIS NVIC_ functions for reliable usage of the SoftDevice. - * - Interrupt latency may be affected by the SoftDevice (see relevant SDS documentation). - * - Chosen low frequency clock source will be running. - * - * @param p_clock_lf_cfg Low frequency clock source and accuracy. - If NULL the clock will be configured as an RC source with rc_ctiv = 16 and .rc_temp_ctiv = 2 - In the case of XTAL source, the PPM accuracy of the chosen clock source must be greater than or equal to the actual characteristics of your XTAL clock. - * @param fault_handler Callback to be invoked in case of fault, cannot be NULL. - * - * @retval ::NRF_SUCCESS - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE SoftDevice is already enabled, and the clock source and fault handler cannot be updated. - * @retval ::NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION SoftDevice interrupt is already enabled, or an enabled interrupt has an illegal priority level. - * @retval ::NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN Unknown low frequency clock source selected. - */ -SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lf_cfg_t const * p_clock_lf_cfg, nrf_fault_handler_t fault_handler)); - - -/**@brief Disables the SoftDevice and by extension the protocol stack. - * - * Idempotent function to disable the SoftDevice. - * - * @post SoC library and protocol stack APIs are made unavailable. - * @post All interrupts that was protected by the SoftDevice will be disabled and initialized to priority 0 (highest). - * @post All peripherals used by the SoftDevice will be reset to default values. - * @post All of RAM become available. - * @post All interrupts are forwarded to the application. - * @post LFCLK source chosen in ::sd_softdevice_enable will be left running. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_SOFTDEVICE_DISABLE, uint32_t, sd_softdevice_disable(void)); - -/**@brief Check if the SoftDevice is enabled. - * - * @param[out] p_softdevice_enabled If the SoftDevice is enabled: 1 else 0. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_SOFTDEVICE_IS_ENABLED, uint32_t, sd_softdevice_is_enabled(uint8_t * p_softdevice_enabled)); - -/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the SoftDevice - * - * This function is only intended to be called when a bootloader is enabled. - * - * @param[in] address The base address of the interrupt vector table for forwarded interrupts. - - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, uint32_t, sd_softdevice_vector_table_base_set(uint32_t address)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_SDM_H__ - -/** - @} -*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_soc.h deleted file mode 100644 index 875f9bb63f..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_soc.h +++ /dev/null @@ -1,926 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/** - * @defgroup nrf_soc_api SoC Library API - * @{ - * - * @brief APIs for the SoC library. - * - */ - -#ifndef NRF_SOC_H__ -#define NRF_SOC_H__ - -#include -#include -#include "nrf_svc.h" -#include "nrf.h" - -#include "nrf_error_soc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup NRF_SOC_DEFINES Defines - * @{ */ - -/**@brief The number of the lowest SVC number reserved for the SoC library. */ -#define SOC_SVC_BASE (0x20) /**< Base value for SVCs that are available when the SoftDevice is disabled. */ -#define SOC_SVC_BASE_NOT_AVAILABLE (0x2B) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ - -/**@brief Guaranteed time for application to process radio inactive notification. */ -#define NRF_RADIO_NOTIFICATION_INACTIVE_GUARANTEED_TIME_US (62) - -/**@brief The minimum allowed timeslot extension time. */ -#define NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US (200) - -#define SOC_ECB_KEY_LENGTH (16) /**< ECB key length. */ -#define SOC_ECB_CLEARTEXT_LENGTH (16) /**< ECB cleartext length. */ -#define SOC_ECB_CIPHERTEXT_LENGTH (SOC_ECB_CLEARTEXT_LENGTH) /**< ECB ciphertext length. */ - -#ifdef NRF51 -#define SD_EVT_IRQn (SWI2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ -#define SD_EVT_IRQHandler (SWI2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. */ -#define RADIO_NOTIFICATION_IRQn (SWI1_IRQn) /**< The radio notification IRQ number. */ -#define RADIO_NOTIFICATION_IRQHandler (SWI1_IRQHandler) /**< The radio notification IRQ handler. */ -#endif -#if defined(NRF52) || defined(NRF52840_XXAA) -#define SD_EVT_IRQn (SWI2_EGU2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ -#define SD_EVT_IRQHandler (SWI2_EGU2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. - The default interrupt priority for this handler is set to 4 */ -#define RADIO_NOTIFICATION_IRQn (SWI1_EGU1_IRQn) /**< The radio notification IRQ number. */ -#define RADIO_NOTIFICATION_IRQHandler (SWI1_EGU1_IRQHandler) /**< The radio notification IRQ handler. - The default interrupt priority for this handler is set to 4 */ -#endif - -#define NRF_RADIO_LENGTH_MIN_US (100) /**< The shortest allowed radio timeslot, in microseconds. */ -#define NRF_RADIO_LENGTH_MAX_US (100000) /**< The longest allowed radio timeslot, in microseconds. */ - -#define NRF_RADIO_DISTANCE_MAX_US (128000000UL - 1UL) /**< The longest timeslot distance, in microseconds, allowed for the distance parameter (see @ref nrf_radio_request_normal_t) in the request. */ - -#define NRF_RADIO_EARLIEST_TIMEOUT_MAX_US (128000000UL - 1UL) /**< The longest timeout, in microseconds, allowed when requesting the earliest possible timeslot. */ - -#define NRF_RADIO_START_JITTER_US (2) /**< The maximum jitter in @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START relative to the requested start time. */ - -/**@} */ - -/**@addtogroup NRF_SOC_ENUMS Enumerations - * @{ */ - -/**@brief The SVC numbers used by the SVC functions in the SoC library. */ -enum NRF_SOC_SVCS -{ - SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, - SD_PPI_CHANNEL_ENABLE_SET, - SD_PPI_CHANNEL_ENABLE_CLR, - SD_PPI_CHANNEL_ASSIGN, - SD_PPI_GROUP_TASK_ENABLE, - SD_PPI_GROUP_TASK_DISABLE, - SD_PPI_GROUP_ASSIGN, - SD_PPI_GROUP_GET, - SD_FLASH_PAGE_ERASE, - SD_FLASH_WRITE, - SD_FLASH_PROTECT, - SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, - SD_MUTEX_ACQUIRE, - SD_MUTEX_RELEASE, - SD_RAND_APPLICATION_POOL_CAPACITY_GET, - SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, - SD_RAND_APPLICATION_VECTOR_GET, - SD_POWER_MODE_SET, - SD_POWER_SYSTEM_OFF, - SD_POWER_RESET_REASON_GET, - SD_POWER_RESET_REASON_CLR, - SD_POWER_POF_ENABLE, - SD_POWER_POF_THRESHOLD_SET, - SD_POWER_RAM_POWER_SET, - SD_POWER_RAM_POWER_CLR, - SD_POWER_RAM_POWER_GET, - SD_POWER_GPREGRET_SET, - SD_POWER_GPREGRET_CLR, - SD_POWER_GPREGRET_GET, - SD_POWER_DCDC_MODE_SET, - SD_APP_EVT_WAIT, - SD_CLOCK_HFCLK_REQUEST, - SD_CLOCK_HFCLK_RELEASE, - SD_CLOCK_HFCLK_IS_RUNNING, - SD_RADIO_NOTIFICATION_CFG_SET, - SD_ECB_BLOCK_ENCRYPT, - SD_ECB_BLOCKS_ENCRYPT, - SD_RADIO_SESSION_OPEN, - SD_RADIO_SESSION_CLOSE, - SD_RADIO_REQUEST, - SD_EVT_GET, - SD_TEMP_GET, - SVC_SOC_LAST -}; - -/**@brief Possible values of a ::nrf_mutex_t. */ -enum NRF_MUTEX_VALUES -{ - NRF_MUTEX_FREE, - NRF_MUTEX_TAKEN -}; - -/**@brief Power modes. */ -enum NRF_POWER_MODES -{ - NRF_POWER_MODE_CONSTLAT, /**< Constant latency mode. See power management in the reference manual. */ - NRF_POWER_MODE_LOWPWR /**< Low power mode. See power management in the reference manual. */ -}; - - -/**@brief Power failure thresholds */ -enum NRF_POWER_THRESHOLDS -{ - NRF_POWER_THRESHOLD_V17 = 4UL, /**< 1.7 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V18, /**< 1.8 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V19, /**< 1.9 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V20, /**< 2.0 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V21, /**< 2.1 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V22, /**< 2.2 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V23, /**< 2.3 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V24, /**< 2.4 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V25, /**< 2.5 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V26, /**< 2.6 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V27, /**< 2.7 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V28 /**< 2.8 Volts power failure threshold. */ -}; - - -/**@brief DC/DC converter modes. */ -enum NRF_POWER_DCDC_MODES -{ - NRF_POWER_DCDC_DISABLE, /**< The DCDC is disabled. */ - NRF_POWER_DCDC_ENABLE /**< The DCDC is enabled. */ -}; - -/**@brief Radio notification distances. */ -enum NRF_RADIO_NOTIFICATION_DISTANCES -{ - NRF_RADIO_NOTIFICATION_DISTANCE_NONE = 0, /**< The event does not have a notification. */ - NRF_RADIO_NOTIFICATION_DISTANCE_800US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_1740US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_2680US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_3620US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_4560US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_5500US /**< The distance from the active notification to start of radio activity. */ -}; - - -/**@brief Radio notification types. */ -enum NRF_RADIO_NOTIFICATION_TYPES -{ - NRF_RADIO_NOTIFICATION_TYPE_NONE = 0, /**< The event does not have a radio notification signal. */ - NRF_RADIO_NOTIFICATION_TYPE_INT_ON_ACTIVE, /**< Using interrupt for notification when the radio will be enabled. */ - NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE, /**< Using interrupt for notification when the radio has been disabled. */ - NRF_RADIO_NOTIFICATION_TYPE_INT_ON_BOTH, /**< Using interrupt for notification both when the radio will be enabled and disabled. */ -}; - -/**@brief The Radio signal callback types. */ -enum NRF_RADIO_CALLBACK_SIGNAL_TYPE -{ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_START, /**< This signal indicates the start of the radio timeslot. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0, /**< This signal indicates the NRF_TIMER0 interrupt. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO, /**< This signal indicates the NRF_RADIO interrupt. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_FAILED, /**< This signal indicates extend action failed. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_SUCCEEDED /**< This signal indicates extend action succeeded. */ -}; - -/**@brief The actions requested by the signal callback. - * - * This code gives the SOC instructions about what action to take when the signal callback has - * returned. - */ -enum NRF_RADIO_SIGNAL_CALLBACK_ACTION -{ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE, /**< Return without action. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current timeslot (maximum execution time for this action is when the extension succeeded). */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_END, /**< End the current radio timeslot. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END /**< Request a new radio timeslot and end the current timeslot. */ -}; - -/**@brief Radio timeslot high frequency clock source configuration. */ -enum NRF_RADIO_HFCLK_CFG -{ - NRF_RADIO_HFCLK_CFG_XTAL_GUARANTEED, /**< The SoftDevice will guarantee that the high frequency clock source is the - external crystal for the whole duration of the timeslot. This should be the - preferred option for events that use the radio or require high timing accuracy. - @note The SoftDevice will automatically turn on and off the external crystal, - at the beginning and end of the timeslot, respectively. The crystal may also - intentionally be left running after the timeslot, in cases where it is needed - by the SoftDevice shortly after the end of the timeslot. */ - NRF_RADIO_HFCLK_CFG_NO_GUARANTEE /**< This configuration allows for earlier and tighter scheduling of timeslots. - The RC oscillator may be the clock source in part or for the whole duration of the timeslot. - The RC oscillator's accuracy must therefore be taken into consideration. - @note If the application will use the radio peripheral in timeslots with this configuration, - it must make sure that the crystal is running and stable before starting the radio. */ -}; - -/**@brief Radio timeslot priorities. */ -enum NRF_RADIO_PRIORITY -{ - NRF_RADIO_PRIORITY_HIGH, /**< High (equal priority as the normal connection priority of the SoftDevice stack(s)). */ - NRF_RADIO_PRIORITY_NORMAL, /**< Normal (equal priority as the priority of secondary activities of the SoftDevice stack(s)). */ -}; - -/**@brief Radio timeslot request type. */ -enum NRF_RADIO_REQUEST_TYPE -{ - NRF_RADIO_REQ_TYPE_EARLIEST, /**< Request radio timeslot as early as possible. This should always be used for the first request in a session. */ - NRF_RADIO_REQ_TYPE_NORMAL /**< Normal radio timeslot request. */ -}; - -/**@brief SoC Events. */ -enum NRF_SOC_EVTS -{ - NRF_EVT_HFCLKSTARTED, /**< Event indicating that the HFCLK has started. */ - NRF_EVT_POWER_FAILURE_WARNING, /**< Event indicating that a power failure warning has occurred. */ - NRF_EVT_FLASH_OPERATION_SUCCESS, /**< Event indicating that the ongoing flash operation has completed successfully. */ - NRF_EVT_FLASH_OPERATION_ERROR, /**< Event indicating that the ongoing flash operation has timed out with an error. */ - NRF_EVT_RADIO_BLOCKED, /**< Event indicating that a radio timeslot was blocked. */ - NRF_EVT_RADIO_CANCELED, /**< Event indicating that a radio timeslot was canceled by SoftDevice. */ - NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN, /**< Event indicating that a radio timeslot signal callback handler return was invalid. */ - NRF_EVT_RADIO_SESSION_IDLE, /**< Event indicating that a radio timeslot session is idle. */ - NRF_EVT_RADIO_SESSION_CLOSED, /**< Event indicating that a radio timeslot session is closed. */ - NRF_EVT_NUMBER_OF_EVTS -}; - -/**@} */ - - -/**@addtogroup NRF_SOC_STRUCTURES Structures - * @{ */ - -/**@brief Represents a mutex for use with the nrf_mutex functions. - * @note Accessing the value directly is not safe, use the mutex functions! - */ -typedef volatile uint8_t nrf_mutex_t; - -/**@brief Parameters for a request for a timeslot as early as possible. */ -typedef struct -{ - uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ - uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ - uint32_t length_us; /**< The radio timeslot length (in the range 100 to 100,000] microseconds). */ - uint32_t timeout_us; /**< Longest acceptable delay until the start of the requested timeslot (up to @ref NRF_RADIO_EARLIEST_TIMEOUT_MAX_US microseconds). */ -} nrf_radio_request_earliest_t; - -/**@brief Parameters for a normal radio timeslot request. */ -typedef struct -{ - uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ - uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ - uint32_t distance_us; /**< Distance from the start of the previous radio timeslot (up to @ref NRF_RADIO_DISTANCE_MAX_US microseconds). */ - uint32_t length_us; /**< The radio timeslot length (in the range [100..100,000] microseconds). */ -} nrf_radio_request_normal_t; - -/**@brief Radio timeslot request parameters. */ -typedef struct -{ - uint8_t request_type; /**< Type of request, see @ref NRF_RADIO_REQUEST_TYPE. */ - union - { - nrf_radio_request_earliest_t earliest; /**< Parameters for requesting a radio timeslot as early as possible. */ - nrf_radio_request_normal_t normal; /**< Parameters for requesting a normal radio timeslot. */ - } params; /**< Parameter union. */ -} nrf_radio_request_t; - -/**@brief Return parameters of the radio timeslot signal callback. */ -typedef struct -{ - uint8_t callback_action; /**< The action requested by the application when returning from the signal callback, see @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION. */ - union - { - struct - { - nrf_radio_request_t * p_next; /**< The request parameters for the next radio timeslot. */ - } request; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END. */ - struct - { - uint32_t length_us; /**< Requested extension of the radio timeslot duration (microseconds) (for minimum time see @ref NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US). */ - } extend; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND. */ - } params; /**< Parameter union. */ -} nrf_radio_signal_callback_return_param_t; - -/**@brief The radio timeslot signal callback type. - * - * @note In case of invalid return parameters, the radio timeslot will automatically end - * immediately after returning from the signal callback and the - * @ref NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN event will be sent. - * @note The returned struct pointer must remain valid after the signal callback - * function returns. For instance, this means that it must not point to a stack variable. - * - * @param[in] signal_type Type of signal, see @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE. - * - * @return Pointer to structure containing action requested by the application. - */ -typedef nrf_radio_signal_callback_return_param_t * (*nrf_radio_signal_callback_t) (uint8_t signal_type); - -/**@brief AES ECB parameter typedefs */ -typedef uint8_t soc_ecb_key_t[SOC_ECB_KEY_LENGTH]; /**< Encryption key type. */ -typedef uint8_t soc_ecb_cleartext_t[SOC_ECB_CLEARTEXT_LENGTH]; /**< Cleartext data type. */ -typedef uint8_t soc_ecb_ciphertext_t[SOC_ECB_CIPHERTEXT_LENGTH]; /**< Ciphertext data type. */ - -/**@brief AES ECB data structure */ -typedef struct -{ - soc_ecb_key_t key; /**< Encryption key. */ - soc_ecb_cleartext_t cleartext; /**< Cleartext data. */ - soc_ecb_ciphertext_t ciphertext; /**< Ciphertext data. */ -} nrf_ecb_hal_data_t; - -/**@brief AES ECB block. Used to provide multiple blocks in a single call - to @ref sd_ecb_blocks_encrypt.*/ -typedef struct -{ - soc_ecb_key_t const * p_key; /**< Pointer to the Encryption key. */ - soc_ecb_cleartext_t const * p_cleartext; /**< Pointer to the Cleartext data. */ - soc_ecb_ciphertext_t * p_ciphertext; /**< Pointer to the Ciphertext data. */ -} nrf_ecb_hal_data_block_t; - -/**@} */ - -/**@addtogroup NRF_SOC_FUNCTIONS Functions - * @{ */ - -/**@brief Initialize a mutex. - * - * @param[in] p_mutex Pointer to the mutex to initialize. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_MUTEX_NEW, uint32_t, sd_mutex_new(nrf_mutex_t * p_mutex)); - -/**@brief Attempt to acquire a mutex. - * - * @param[in] p_mutex Pointer to the mutex to acquire. - * - * @retval ::NRF_SUCCESS The mutex was successfully acquired. - * @retval ::NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN The mutex could not be acquired. - */ -SVCALL(SD_MUTEX_ACQUIRE, uint32_t, sd_mutex_acquire(nrf_mutex_t * p_mutex)); - -/**@brief Release a mutex. - * - * @param[in] p_mutex Pointer to the mutex to release. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_MUTEX_RELEASE, uint32_t, sd_mutex_release(nrf_mutex_t * p_mutex)); - -/**@brief Query the capacity of the application random pool. - * - * @param[out] p_pool_capacity The capacity of the pool. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_RAND_APPLICATION_POOL_CAPACITY_GET, uint32_t, sd_rand_application_pool_capacity_get(uint8_t * p_pool_capacity)); - -/**@brief Get number of random bytes available to the application. - * - * @param[out] p_bytes_available The number of bytes currently available in the pool. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, uint32_t, sd_rand_application_bytes_available_get(uint8_t * p_bytes_available)); - -/**@brief Get random bytes from the application pool. - * - * @param[out] p_buff Pointer to unit8_t buffer for storing the bytes. - * @param[in] length Number of bytes to take from pool and place in p_buff. - * - * @retval ::NRF_SUCCESS The requested bytes were written to p_buff. - * @retval ::NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES No bytes were written to the buffer, because there were not enough bytes available. -*/ -SVCALL(SD_RAND_APPLICATION_VECTOR_GET, uint32_t, sd_rand_application_vector_get(uint8_t * p_buff, uint8_t length)); - -/**@brief Gets the reset reason register. - * - * @param[out] p_reset_reason Contents of the NRF_POWER->RESETREAS register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RESET_REASON_GET, uint32_t, sd_power_reset_reason_get(uint32_t * p_reset_reason)); - -/**@brief Clears the bits of the reset reason register. - * - * @param[in] reset_reason_clr_msk Contains the bits to clear from the reset reason register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RESET_REASON_CLR, uint32_t, sd_power_reset_reason_clr(uint32_t reset_reason_clr_msk)); - -/**@brief Sets the power mode when in CPU sleep. - * - * @param[in] power_mode The power mode to use when in CPU sleep, see @ref NRF_POWER_MODES. @sa sd_app_evt_wait - * - * @retval ::NRF_SUCCESS The power mode was set. - * @retval ::NRF_ERROR_SOC_POWER_MODE_UNKNOWN The power mode was unknown. - */ -SVCALL(SD_POWER_MODE_SET, uint32_t, sd_power_mode_set(uint8_t power_mode)); - -/**@brief Puts the chip in System OFF mode. - * - * @retval ::NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN - */ -SVCALL(SD_POWER_SYSTEM_OFF, uint32_t, sd_power_system_off(void)); - -/**@brief Enables or disables the power-fail comparator. - * - * Enabling this will give a SoftDevice event (NRF_EVT_POWER_FAILURE_WARNING) when the power failure warning occurs. - * The event can be retrieved with sd_evt_get(); - * - * @param[in] pof_enable True if the power-fail comparator should be enabled, false if it should be disabled. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); - -/**@brief Sets the power-fail threshold value. - * - * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDS. - * - * @retval ::NRF_SUCCESS The power failure threshold was set. - * @retval ::NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN The power failure threshold is unknown. - */ -SVCALL(SD_POWER_POF_THRESHOLD_SET, uint32_t, sd_power_pof_threshold_set(uint8_t threshold)); - -/**@brief Writes the NRF_POWER->RAM[index].POWERSET register. - * - * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERSET register to write to. - * @param[in] ram_powerset Contains the word to write to the NRF_POWER->RAM[index].POWERSET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RAM_POWER_SET, uint32_t, sd_power_ram_power_set(uint8_t index, uint32_t ram_powerset)); - -/**@brief Writes the NRF_POWER->RAM[index].POWERCLR register. - * - * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERCLR register to write to. - * @param[in] ram_powerclr Contains the word to write to the NRF_POWER->RAM[index].POWERCLR register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RAM_POWER_CLR, uint32_t, sd_power_ram_power_clr(uint8_t index, uint32_t ram_powerclr)); - -/**@brief Get contents of NRF_POWER->RAM[index].POWER register, indicates power status of RAM[index] blocks. - * - * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWER register to read from. - * @param[out] p_ram_power Content of NRF_POWER->RAM[index].POWER register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RAM_POWER_GET, uint32_t, sd_power_ram_power_get(uint8_t index, uint32_t * p_ram_power)); - -/**@brief Set bits in the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[in] gpregret_msk Bits to be set in the GPREGRET register. - * - * @note nRF51 does only have one general purpose retained register, so gpregret_id must be 0 on nRF51. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_GPREGRET_SET, uint32_t, sd_power_gpregret_set(uint32_t gpregret_id, uint32_t gpregret_msk)); - -/**@brief Clear bits in the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[in] gpregret_msk Bits to be clear in the GPREGRET register. - * - * @note nRF51 does only have one general purpose retained register, so gpregret_id must be 0 on nRF51. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_id, uint32_t gpregret_msk)); - -/**@brief Get contents of the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[out] p_gpregret Contents of the GPREGRET register. - * - * @note nRF51 does only have one general purpose retained register, so gpregret_id must be 0 on nRF51. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret)); - -/**@brief Sets the DCDC mode. - * - * Enable or disable the DCDC peripheral. - * - * @param[in] dcdc_mode The mode of the DCDC, see @ref NRF_POWER_DCDC_MODES. - * - * @retval ::NRF_SUCCESS - * @retval ::NRF_ERROR_INVALID_PARAM The DCDC mode is invalid. - */ -SVCALL(SD_POWER_DCDC_MODE_SET, uint32_t, sd_power_dcdc_mode_set(uint8_t dcdc_mode)); - -/**@brief Request the high frequency crystal oscillator. - * - * Will start the high frequency crystal oscillator, the startup time of the crystal varies - * and the ::sd_clock_hfclk_is_running function can be polled to check if it has started. - * - * @see sd_clock_hfclk_is_running - * @see sd_clock_hfclk_release - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_CLOCK_HFCLK_REQUEST, uint32_t, sd_clock_hfclk_request(void)); - -/**@brief Releases the high frequency crystal oscillator. - * - * Will stop the high frequency crystal oscillator, this happens immediately. - * - * @see sd_clock_hfclk_is_running - * @see sd_clock_hfclk_request - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_CLOCK_HFCLK_RELEASE, uint32_t, sd_clock_hfclk_release(void)); - -/**@brief Checks if the high frequency crystal oscillator is running. - * - * @see sd_clock_hfclk_request - * @see sd_clock_hfclk_release - * - * @param[out] p_is_running 1 if the external crystal oscillator is running, 0 if not. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_CLOCK_HFCLK_IS_RUNNING, uint32_t, sd_clock_hfclk_is_running(uint32_t * p_is_running)); - -/**@brief Waits for an application event. - * - * An application event is either an application interrupt or a pended interrupt when the - * interrupt is disabled. When the interrupt is enabled it will be taken immediately since - * this function will wait in thread mode, then the execution will return in the application's - * main thread. When an interrupt is disabled and gets pended it will return to the application's - * main thread. The application must ensure that the pended flag is cleared using - * ::sd_nvic_ClearPendingIRQ in order to sleep using this function. This is only necessary for - * disabled interrupts, as the interrupt handler will clear the pending flag automatically for - * enabled interrupts. - * - * In order to wake up from disabled interrupts, the SEVONPEND flag has to be set in the Cortex-M0 - * System Control Register (SCR). @sa CMSIS_SCB - * - * @note If an application interrupt has happened since the last time sd_app_evt_wait was - * called this function will return immediately and not go to sleep. This is to avoid race - * conditions that can occur when a flag is updated in the interrupt handler and processed - * in the main loop. - * - * @post An application interrupt has happened or a interrupt pending flag is set. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_APP_EVT_WAIT, uint32_t, sd_app_evt_wait(void)); - -/**@brief Get PPI channel enable register contents. - * - * @param[out] p_channel_enable The contents of the PPI CHEN register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ENABLE_GET, uint32_t, sd_ppi_channel_enable_get(uint32_t * p_channel_enable)); - -/**@brief Set PPI channel enable register. - * - * @param[in] channel_enable_set_msk Mask containing the bits to set in the PPI CHEN register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ENABLE_SET, uint32_t, sd_ppi_channel_enable_set(uint32_t channel_enable_set_msk)); - -/**@brief Clear PPI channel enable register. - * - * @param[in] channel_enable_clr_msk Mask containing the bits to clear in the PPI CHEN register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ENABLE_CLR, uint32_t, sd_ppi_channel_enable_clr(uint32_t channel_enable_clr_msk)); - -/**@brief Assign endpoints to a PPI channel. - * - * @param[in] channel_num Number of the PPI channel to assign. - * @param[in] evt_endpoint Event endpoint of the PPI channel. - * @param[in] task_endpoint Task endpoint of the PPI channel. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_CHANNEL The channel number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ASSIGN, uint32_t, sd_ppi_channel_assign(uint8_t channel_num, const volatile void * evt_endpoint, const volatile void * task_endpoint)); - -/**@brief Task to enable a channel group. - * - * @param[in] group_num Number of the channel group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_TASK_ENABLE, uint32_t, sd_ppi_group_task_enable(uint8_t group_num)); - -/**@brief Task to disable a channel group. - * - * @param[in] group_num Number of the PPI group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_TASK_DISABLE, uint32_t, sd_ppi_group_task_disable(uint8_t group_num)); - -/**@brief Assign PPI channels to a channel group. - * - * @param[in] group_num Number of the channel group. - * @param[in] channel_msk Mask of the channels to assign to the group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_ASSIGN, uint32_t, sd_ppi_group_assign(uint8_t group_num, uint32_t channel_msk)); - -/**@brief Gets the PPI channels of a channel group. - * - * @param[in] group_num Number of the channel group. - * @param[out] p_channel_msk Mask of the channels assigned to the group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_GET, uint32_t, sd_ppi_group_get(uint8_t group_num, uint32_t * p_channel_msk)); - -/**@brief Configures the Radio Notification signal. - * - * @note - * - The notification signal latency depends on the interrupt priority settings of SWI used - * for notification signal. - * - To ensure that the radio notification signal behaves in a consistent way, the radio - * notifications must be configured when there is no protocol stack or other SoftDevice - * activity in progress. It is recommended that the radio notification signal is - * configured directly after the SoftDevice has been enabled. - * - In the period between the ACTIVE signal and the start of the Radio Event, the SoftDevice - * will interrupt the application to do Radio Event preparation. - * - Using the Radio Notification feature may limit the bandwidth, as the SoftDevice may have - * to shorten the connection events to have time for the Radio Notification signals. - * - * @param[in] type Type of notification signal, see @ref NRF_RADIO_NOTIFICATION_TYPES. - * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE shall be used to turn off radio - * notification. Using @ref NRF_RADIO_NOTIFICATION_DISTANCE_NONE is - * recommended (but not required) to be used with - * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE. - * - * @param[in] distance Distance between the notification signal and start of radio activity, see @ref NRF_RADIO_NOTIFICATION_DISTANCES. - * This parameter is ignored when @ref NRF_RADIO_NOTIFICATION_TYPE_NONE or - * @ref NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE is used. - * - * @retval ::NRF_ERROR_INVALID_PARAM The group number is invalid. - * @retval ::NRF_ERROR_INVALID_STATE A protocol stack or other SoftDevice is running. Stop all - * running activities and retry. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_RADIO_NOTIFICATION_CFG_SET, uint32_t, sd_radio_notification_cfg_set(uint8_t type, uint8_t distance)); - -/**@brief Encrypts a block according to the specified parameters. - * - * 128-bit AES encryption. - * - * @note: - * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while - * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application - * main or low interrupt level. - * - * @param[in, out] p_ecb_data Pointer to the ECB parameters' struct (two input - * parameters and one output parameter). - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_ECB_BLOCK_ENCRYPT, uint32_t, sd_ecb_block_encrypt(nrf_ecb_hal_data_t * p_ecb_data)); - -/**@brief Encrypts multiple data blocks provided as an array of data block structures. - * - * @details: Performs 128-bit AES encryption on multiple data blocks - * - * @note: - * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while - * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application - * main or low interrupt level. - * - * @param[in] block_count Count of blocks in the p_data_blocks array. - * @param[in,out] p_data_blocks Pointer to the first entry in a contiguous array of - * @ref nrf_ecb_hal_data_block_t structures. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_ECB_BLOCKS_ENCRYPT, uint32_t, sd_ecb_blocks_encrypt(uint8_t block_count, nrf_ecb_hal_data_block_t * p_data_blocks)); - -/**@brief Gets any pending events generated by the SoC API. - * - * The application should keep calling this function to get events, until ::NRF_ERROR_NOT_FOUND is returned. - * - * @param[out] p_evt_id Set to one of the values in @ref NRF_SOC_EVTS, if any events are pending. - * - * @retval ::NRF_SUCCESS An event was pending. The event id is written in the p_evt_id parameter. - * @retval ::NRF_ERROR_NOT_FOUND No pending events. - */ -SVCALL(SD_EVT_GET, uint32_t, sd_evt_get(uint32_t * p_evt_id)); - -/**@brief Get the temperature measured on the chip - * - * This function will block until the temperature measurement is done. - * It takes around 50 us from call to return. - * - * @param[out] p_temp Result of temperature measurement. Die temperature in 0.25 degrees Celsius. - * - * @retval ::NRF_SUCCESS A temperature measurement was done, and the temperature was written to temp - */ -SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp)); - -/**@brief Flash Write -* -* Commands to write a buffer to flash -* -* If the SoftDevice is enabled: -* This call initiates the flash access command, and its completion will be communicated to the -* application with exactly one of the following events: -* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. -* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. -* -* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the - * write has been completed -* -* @note -* - This call takes control over the radio and the CPU during flash erase and write to make sure that -* they will not interfere with the flash access. This means that all interrupts will be blocked -* for a predictable time (depending on the NVMC specification in nRF51 Series Reference Manual -* and the command parameters). -* - The data in the p_src buffer should not be modified before the @ref NRF_EVT_FLASH_OPERATION_SUCCESS -* or the @ref NRF_EVT_FLASH_OPERATION_ERROR have been received if the SoftDevice is enabled. -* -* -* @param[in] p_dst Pointer to start of flash location to be written. -* @param[in] p_src Pointer to buffer with data to be written. -* @param[in] size Number of 32-bit words to write. Maximum size is 256 32-bit words for nRF51 and 1024 for nRF52. -* -* @retval ::NRF_ERROR_INVALID_ADDR Tried to write to a non existing flash address, or p_dst or p_src was unaligned. -* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. -* @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or higher than the maximum allowed size. -* @retval ::NRF_ERROR_FORBIDDEN Tried to write to or read from protected location. -* @retval ::NRF_SUCCESS The command was accepted. -*/ -SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)); - - -/**@brief Flash Erase page -* -* Commands to erase a flash page -* If the SoftDevice is enabled: -* This call initiates the flash access command, and its completion will be communicated to the -* application with exactly one of the following events: -* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. -* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. -* -* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the -* erase has been completed -* -* @note -* - This call takes control over the radio and the CPU during flash erase and write to make sure that -* they will not interfere with the flash access. This means that all interrupts will be blocked -* for a predictable time (depending on the NVMC specification in nRF51 Series Reference Manual -* and the command parameters). -* -* -* @param[in] page_number Page number of the page to erase -* -* @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. -* @retval ::NRF_ERROR_INVALID_ADDR Tried to erase to a non existing flash page. -* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. -* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a protected page. -* @retval ::NRF_SUCCESS The command was accepted. -*/ -SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)); - - -/**@brief Flash Protection set - * - * Commands to set the flash protection configuration registers. - On nRF51 this sets the PROTENSETx registers of the MPU peripheral. - On nRF52 this sets the CONFIGx registers of the BPROT peripheral. - * - * @note To read the values read them directly. They are only write-protected. - * - * @param[in] block_cfg0 Value to be written to the configuration register. - * @param[in] block_cfg1 Value to be written to the configuration register. - * @param[in] block_cfg2 Value to be written to the configuration register (ignored on nRF51). - * @param[in] block_cfg3 Value to be written to the configuration register (ignored on nRF51). - * - * @retval ::NRF_ERROR_FORBIDDEN Tried to protect the SoftDevice. - * @retval ::NRF_SUCCESS Values successfully written to configuration registers. - */ -SVCALL(SD_FLASH_PROTECT, uint32_t, sd_flash_protect(uint32_t block_cfg0, uint32_t block_cfg1, uint32_t block_cfg2, uint32_t block_cfg3)); - -/**@brief Opens a session for radio timeslot requests. - * - * @note Only one session can be open at a time. - * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) will be called when the radio timeslot - * starts. From this point the NRF_RADIO and NRF_TIMER0 peripherals can be freely accessed - * by the application. - * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0) is called whenever the NRF_TIMER0 - * interrupt occurs. - * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO) is called whenever the NRF_RADIO - * interrupt occurs. - * @note p_radio_signal_callback() will be called at ARM interrupt priority level 0. This - * implies that none of the sd_* API calls can be used from p_radio_signal_callback(). - * - * @param[in] p_radio_signal_callback The signal callback. - * - * @retval ::NRF_ERROR_INVALID_ADDR p_radio_signal_callback is an invalid function pointer. - * @retval ::NRF_ERROR_BUSY If session cannot be opened. - * @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. - * @retval ::NRF_SUCCESS Otherwise. - */ - SVCALL(SD_RADIO_SESSION_OPEN, uint32_t, sd_radio_session_open(nrf_radio_signal_callback_t p_radio_signal_callback)); - -/**@brief Closes a session for radio timeslot requests. - * - * @note Any current radio timeslot will be finished before the session is closed. - * @note If a radio timeslot is scheduled when the session is closed, it will be canceled. - * @note The application cannot consider the session closed until the @ref NRF_EVT_RADIO_SESSION_CLOSED - * event is received. - * - * @retval ::NRF_ERROR_FORBIDDEN If session not opened. - * @retval ::NRF_ERROR_BUSY If session is currently being closed. - * @retval ::NRF_SUCCESS Otherwise. - */ - SVCALL(SD_RADIO_SESSION_CLOSE, uint32_t, sd_radio_session_close(void)); - -/**@brief Requests a radio timeslot. - * - * @note The request type is determined by p_request->request_type, and can be one of @ref NRF_RADIO_REQ_TYPE_EARLIEST - * and @ref NRF_RADIO_REQ_TYPE_NORMAL. The first request in a session must always be of type @ref NRF_RADIO_REQ_TYPE_EARLIEST. - * @note For a normal request (@ref NRF_RADIO_REQ_TYPE_NORMAL), the start time of a radio timeslot is specified by - * p_request->distance_us and is given relative to the start of the previous timeslot. - * @note A too small p_request->distance_us will lead to a @ref NRF_EVT_RADIO_BLOCKED event. - * @note Timeslots scheduled too close will lead to a @ref NRF_EVT_RADIO_BLOCKED event. - * @note See the SoftDevice Specification for more on radio timeslot scheduling, distances and lengths. - * @note If an opportunity for the first radio timeslot is not found before 100 ms after the call to this - * function, it is not scheduled, and instead a @ref NRF_EVT_RADIO_BLOCKED event is sent. - * The application may then try to schedule the first radio timeslot again. - * @note Successful requests will result in nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START). - * Unsuccessful requests will result in a @ref NRF_EVT_RADIO_BLOCKED event, see @ref NRF_SOC_EVTS. - * @note The jitter in the start time of the radio timeslots is +/- @ref NRF_RADIO_START_JITTER_US us. - * @note The nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) call has a latency relative to the - * specified radio timeslot start, but this does not affect the actual start time of the timeslot. - * @note NRF_TIMER0 is reset at the start of the radio timeslot, and is clocked at 1MHz from the high frequency - * (16 MHz) clock source. If p_request->hfclk_force_xtal is true, the high frequency clock is - * guaranteed to be clocked from the external crystal. - * @note The SoftDevice will neither access the NRF_RADIO peripheral nor the NRF_TIMER0 peripheral - * during the radio timeslot. - * - * @param[in] p_request Pointer to the request parameters. - * - * @retval ::NRF_ERROR_FORBIDDEN If session not opened or the session is not IDLE. - * @retval ::NRF_ERROR_INVALID_ADDR If the p_request pointer is invalid. - * @retval ::NRF_ERROR_INVALID_PARAM If the parameters of p_request are not valid. - * @retval ::NRF_SUCCESS Otherwise. - */ - SVCALL(SD_RADIO_REQUEST, uint32_t, sd_radio_request(nrf_radio_request_t const * p_request)); - -/**@} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_SOC_H__ - -/**@} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_svc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_svc.h deleted file mode 100644 index 31ea671529..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_svc.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. - * - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifndef NRF_SVC__ -#define NRF_SVC__ - -#include "stdint.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SVCALL_AS_NORMAL_FUNCTION -#define SVCALL(number, return_type, signature) return_type signature -#else - -#ifndef SVCALL -#if defined (__CC_ARM) -#define SVCALL(number, return_type, signature) return_type __svc(number) signature -#elif defined (__GNUC__) -#ifdef __cplusplus -#define GCC_CAST_CPP (uint16_t) -#else -#define GCC_CAST_CPP -#endif -#define SVCALL(number, return_type, signature) \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wreturn-type\"") \ - __attribute__((naked)) \ - __attribute__((unused)) \ - static return_type signature \ - { \ - __asm( \ - "svc %0\n" \ - "bx r14" : : "I" (GCC_CAST_CPP number) : "r0" \ - ); \ - } \ - _Pragma("GCC diagnostic pop") - -#elif defined (__ICCARM__) -#define PRAGMA(x) _Pragma(#x) -#define SVCALL(number, return_type, signature) \ -PRAGMA(swi_number = (number)) \ - __swi return_type signature; -#else -#define SVCALL(number, return_type, signature) return_type signature -#endif -#endif // SVCALL - -#endif // SVCALL_AS_NORMAL_FUNCTION - -#ifdef __cplusplus -} -#endif -#endif // NRF_SVC__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/hex/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/hex/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt deleted file mode 100644 index b8d26c9a84..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/hex/s140_nrf52840_5.0.0-2.alpha_licence-agreement.txt +++ /dev/null @@ -1,96 +0,0 @@ -S110/S120/S130/S132/S140 license agreement - - -NORDIC SEMICONDUCTOR ASA SOFTDEVICE LICENSE AGREEMENT - -License Agreement for the Nordic Semiconductor ASA ("Nordic") S110, S120, S130, S132, and S140 Bluetooth SoftDevice software packages -("SoftDevice"). - -You ("You" "Licensee") must carefully and thoroughly read this License Agreement ("Agreement"), and accept to adhere to this Agreement before -downloading, installing and/or using any software or content in the SoftDevice provided herewith. - -YOU ACCEPT THIS LICENSE AGREEMENT BY (A) CLICKING ACCEPT OR AGREE TO THIS LICENSE AGREEMENT, WHERE THIS -OPTION IS MADE AVAILABLE TO YOU; OR (B) BY ACTUALLY USING THE SOFTDEVICE, IN THIS CASE YOU AGREE THAT THE USE OF -THE SOFTDEVICE CONSTITUTES ACCEPTANCE OF THE LICENSING AGREEMENT FROM THAT POINT ONWARDS. - -IF YOU DO NOT AGREE TO BE BOUND BY THE TERMS OF THIS AGREEMENT, THEN DO NOT DOWNLOAD, INSTALL/COMPLETE -INSTALLATION OF, OR IN ANY OTHER WAY MAKE USE OF THE SOFTDEVICE. - -1. Grant of License -Subject to the terms in this Agreement Nordic grants Licensee a limited, non-exclusive, non-transferable, non-sub licensable, revocable license -("License"): (a) to use the SoftDevice solely in connection with a Nordic integrated circuit, and (b) to distribute the SoftDevice solely as integrated -in Licensee Product. Licensee shall not use the SoftDevice for any purpose other than specifically authorized herein. It is a material breach of this -agreement to use or modify the SoftDevice for use on any wireless connectivity integrated circuit other than a Nordic integrated circuit. - -2. Title -Nordic retains full rights, title, and ownership to the SoftDevice and any and all patents, copyrights, trade secrets, trade names, trademarks, and -other intellectual property rights in and to the SoftDevice. - -3. No Modifications or Reverse Engineering -Licensee shall not, modify, reverse engineer, disassemble, decompile or otherwise attempt to discover the source code of any non-source code -parts of the SoftDevice including, but not limited to pre-compiled hex files, binaries and object code. - -4. Distribution Restrictions -Except as set forward in Section 1 above, the Licensee may not disclose or distribute any or all parts of the SoftDevice to any third party. -Licensee agrees to provide reasonable security precautions to prevent unauthorized access to or use of the SoftDevice as proscribed herein. -Licensee also agrees that use of and access to the SoftDevice will be strictly limited to the employees and subcontractors of the Licensee -necessary for the performance of development, verification and production tasks under this Agreement. The Licensee is responsible for making -such employees and subcontractors comply with the obligations concerning use and non-disclosure of the SoftDevice. - -5. No Other Rights -Licensee shall use the SoftDevice only in compliance with this Agreement and shall refrain from using the SoftDevice in any way that may be -contrary to this Agreement. - -6. Fees -Nordic grants the License to the Licensee free of charge provided that the Licensee undertakes the obligations in the Agreement and warrants to -comply with the Agreement. - -7. DISCLAIMER OF WARRANTY -THE SOFTDEVICE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND EXPRESS OR IMPLIED AND NEITHER NORDIC, ITS -LICENSORS OR AFFILIATES NOR THE COPYRIGHT HOLDERS MAKE ANY REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE OR -THAT THE SOFTDEVICE WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. THERE -IS NO WARRANTY BY NORDIC OR BY ANY OTHER PARTY THAT THE FUNCTIONS CONTAINED IN THE SOFTDEVICE WILL MEET THE -REQUIREMENTS OF LICENSEE OR THAT THE OPERATION OF THE SOFTDEVICE WILL BE UNINTERRUPTED OR ERROR-FREE. -LICENSEE ASSUMES ALL RESPONSIBILITY AND RISK FOR THE SELECTION OF THE SOFTDEVICE TO ACHIEVE LICENSEE’S -INTENDED RESULTS AND FOR THE INSTALLATION, USE AND RESULTS OBTAINED FROM IT. - - -8. No Support -Nordic is not obligated to furnish or make available to Licensee any further information, software, technical information, know-how, show-how, -bug-fixes or support. Nordic reserves the right to make changes to the SoftDevice without further notice. - -9. Limitation of Liability -In no event shall Nordic, its employees or suppliers, licensors or affiliates be liable for any lost profits, revenue, sales, data or costs of -procurement of substitute goods or services, property damage, personal injury, interruption of business, loss of business information or for any -special, direct, indirect, incidental, economic, punitive, special or consequential damages, however caused and whether arising under contract, -tort, negligence, or other theory of liability arising out of the use of or inability to use the SoftDevice, even if Nordic or its employees or suppliers, -licensors or affiliates are advised of the possibility of such damages. Because some countries/states/jurisdictions do not allow the exclusion or -limitation of liability, but may allow liability to be limited, in such cases, Nordic, its employees or licensors or affiliates’ liability shall be limited to -USD 50. - -10. Breach of Contract -Upon a breach of contract by the Licensee, Nordic and its licensor are entitled to damages in respect of any direct loss which can be reasonably -attributed to the breach by the Licensee. If the Licensee has acted with gross negligence or willful misconduct, the Licensee shall cover both -direct and indirect costs for Nordic and its licensors. - -11. Indemnity -Licensee undertakes to indemnify, hold harmless and defend Nordic and its directors, officers, affiliates, shareholders, licensors, employees and -agents from and against any claims or lawsuits, including attorney's fees, that arise or result of the Licensee’s execution of the License and which -is not due to causes for which Nordic is responsible. - -12. Governing Law -This Agreement shall be construed according to the laws of Norway, and hereby submits to the exclusive jurisdiction of the Oslo tingrett. - -13. Assignment -Licensee shall not assign this Agreement or any rights or obligations hereunder without the prior written consent of Nordic. - -14. Termination -Without prejudice to any other rights, Nordic may cancel this Agreement if Licensee does not abide by the terms and conditions of this -Agreement. Upon termination Licensee must promptly cease the use of the License and destroy all copies of the Licensed Technology and any -other material provided by Nordic or its affiliate, or produced by the Licensee in connection with the Agreement or the Licensed Technology. - -15. Third party beneficiaries -Nordic’s licensors are intended third party beneficiaries under this Agreement. - - diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/hex/s140_nrf52840_5.0.0-2.alpha_softdevice.hex b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/hex/s140_nrf52840_5.0.0-2.alpha_softdevice.hex deleted file mode 100644 index 85c4719e3a..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/hex/s140_nrf52840_5.0.0-2.alpha_softdevice.hex +++ /dev/null @@ -1,4107 +0,0 @@ -:201000009012002091090200452F0000FF080200452F0000452F0000452F00000000000099 -:20102000000000000000000000000000E9090200452F000000000000452F0000452F000060 -:20104000510A0200570A0200452F0000452F0000452F0000452F0000452F0000452F000018 -:201060005D0A0200452F0000452F0000630A0200452F0000690A02006F0A0200750A0200CB -:20108000452F0000452F0000452F0000452F0000452F0000452F0000452F0000452F0000B0 -:2010A000452F00007B0A0200452F0000452F0000452F0000452F0000452F0000452F00007D -:2010C000810A0200452F0000452F0000452F0000452F0000452F0000452F0000452F000057 -:2010E000452F0000452F0000452F0000452F0000452F0000452F0000452F0000452F000050 -:20110000452F0000452F000000F002F81FF02DFC0AA090E8000C82448344AAF10107DA4548 -:2011200001D11FF022FCAFF2090EBAE80F0013F0010F18BFFB1A43F0010318476CFF010046 -:201140008CFF01000A4410F8014B14F00F0508BF10F8015B240908BF10F8014B6D1E05D076 -:2011600010F8013B6D1E01F8013BF9D1641E03D0641E01F8015BFBD19142E4D37047000068 -:201180000023002400250026103A28BF78C1FBD8520728BF30C148BF0B6070471FB500F062 -:2011A0003DF88DE80F001FBD1EF0040F0CBFEFF30880EFF30980014A104700009F2E00006A -:2011C0008269034981614FF00100104470470000D511000001B41EB400B511F0BFFC01B418 -:2011E0000198864601BC01B01EBD0000F0B44046494652465B460FB402A0013001B50648B5 -:20120000004700BF01BC86460FBC8046894692469B46F0BC70470000091100001FF0A2BB3D -:2012200070B51A4C054609202070A01C00F05FF85920A08029462046BDE8704008F0B2B8F7 -:2012400008F0BBB870B50C461149097829B1A0F16001512908D3012013E0602804D06928AF -:2012600002D043F201000CE020CC0A4E94E80E0006EB8000A0F58050241FD0F8806E28466F -:20128000B047206070BD012070470000080000201C000020CC0A020010B504460021012045 -:2012A00000F03BF800210B2000F037F80421192000F033F804210D2000F02FF804210E206B -:2012C00000F02BF804210F2000F027F80421C84300F023F80721162000F01FF8072115209B -:2012E00000F01BF82046FFF79BFF002010BD962101807047FFF7A4BF10487047104A10B592 -:2013000014680F4B0F4A08331A60FFF79BFF0C48001D046010BD704770474907090E0028BA -:2013200006DA00F00F0000F1E02080F8141D704700F1E02080F800147047000003F900420B -:201340001005024001000001FE48002101604160018170472DE9F743044692B09146406837 -:2013600011F0B0FE40B1606811F0B5FE20B9607800F00300022801D0012000E00020F14E52 -:201380004D463072484611F059FE18B1102015B0BDE8F0832946012001F02EFF0028F6D1BF -:2013A00001258DF842504FF4C050ADF84000002210A9284606F09BFC0028E8D18DF84250EA -:2013C0004FF428504FF00008ADF8400047461C216846CDF81C801FF06AFA9DF81C0008AA77 -:2013E00020F00F00401C20F0F00010308DF81C0020788DF81D0061789DF81E0061F3420035 -:2014000040F001008DF81E009DF800000AA940F002008DF800002089ADF83000ADF8327034 -:20142000608907AFADF834000B97606810AC0E900A94684606F04EFA0028A8D1BDF8200070 -:2014400030808DF8425042F60120ADF840009DF81E0008AA20F00600801C20F001008DF8DA -:201460001E000220ADF83000ADF8340013A80E900AA9684606F02EFA002888D1BDF8200050 -:201480007080311D484600F033F9002887D18DF8425042F6A620ADF840001C216846CDF83A -:2014A0001C801FF004FA9DF81C00ADF8345020F00F00401C20F0F00010308DF81C009DF8B8 -:2014C0001D0008AA20F0FF008DF81D009DF81E000AA920F0060040F00100801C8DF81E00A0 -:2014E0009DF800008DF8445040F002008DF80000CDE90A4711A80E90ADF83050684606F060 -:20150000E9F9002899D1BDF82000F08000203EE73EB504460820ADF80000204611F08EFDD1 -:2015200008B110203EBD2146012001F065FE0028F8D12088ADF804006088ADF80600A088EE -:20154000ADF80800E088ADF80A007E4801AB6A468088002106F0C8FDBDF800100829E1D01A -:2015600003203EBD1FB50446002002900820ADF80800CDF80CD0204611F060FD10B1102052 -:2015800004B010BD6F4802AA81884FF6FF7007F047F80028F4D1BDF80810082901D0032095 -:2015A000EEE7BDF800102180BDF802106180BDF80410A180BDF80610E180E1E701B582B082 -:2015C0000220ADF800005F4802AB6A464088002106F08AFDBDF80010022900D003200EBD2C -:2015E0001CB5002100910221ADF80010019011F04BFD08B110201CBD52486A4641884FF69C -:20160000FF7007F00DF8BDF800100229F3D003201CBDFEB54B4C06461546207A0F46C00709 -:2016200005D0084611F00AFD18B11020FEBD0F20FEBDF82D01D90C20FEBD304611F0FEFC8A -:2016400018BB208801A905F04AFE0028F4D130788DF80500208801A906F024FD0028EBD1BC -:2016600000909DF800009DF8051040F002008DF80000090703D040F008008DF8000020889C -:20168000694606F0ACFC0028D6D1ADF8085020883B4602AA002106F027FDBDF80810A94269 -:2016A000CAD00320FEBD7CB505460020009001900888ADF800000C462846019511F002FD6A -:2016C00018B9204611F0E0FC08B110207CBD15B1BDF8000050B11B486A4601884FF6FF7008 -:2016E00006F09EFFBDF8001021807CBD0C207CBD30B593B0044600200D460090142101A800 -:201700001FF0D5F81C2108A81FF0D1F89DF80000CDF808D020F00F00401C20F0F00010303B -:201720008DF800009DF8010020F0FF008DF801009DF8200040F002008DF8200001208DF8C7 -:20174000460001E0CE01002042F60420ADF8440011A801902088ADF83C006088ADF83E0090 -:20176000A088ADF84000E088ADF842009DF8020006AA20F00600801C20F001008DF802007C -:201780000820ADF80C00ADF810000FA8059001A908A806F09FF8002803D1BDF81800288017 -:2017A000002013B030BD0000F0B5007B059F1E4614460D46012800D0FFDF0C2030803A2077 -:2017C0003880002C08D0287A052806D0287B012800D0FFDF17206081F0BDA889FBE72DE940 -:2017E000F04786B0144691F80C900E9A0D46B9F1010F0BD01021007B2E8A8846052807D037 -:20180000062833D0FFDF06B0BDE8F0870221F2E7E8890C2100EB400001EB4000188033200B -:201820001080002CEFD0E889608100271AE00096688808F1020301AA696900F0B2FF06EB27 -:201840000800801C07EB470186B204EB4102BDF8040090810DF1060140460E320FF09AFD15 -:201860007F1CBFB26089B842E1D8CCE734201080E889B9F1010F11D0122148430E30188089 -:20188000002CC0D0E88960814846B9F1010F00D00220207300270DF1040A1FE00621ECE741 -:2018A0000096688808F1020301AA696900F079FF06EB0800801C86B2B9F1010F12D007EB64 -:2018C000C70004EB4000BDF80410C18110220AF1020110301EF052FF7F1CBFB26089B84249 -:2018E000DED890E707EB470104EB4102BDF80400D0810AF10201404610320FF04BFDEBE766 -:201900002DE9F0470E4688B090F80CC096F80C80378AF5890C20109902F10C044FF0000A20 -:20192000BCF1030F08D0BCF1040F3ED0BCF1070F7DD0FFDF08B067E705EB850C00EB4C0096 -:20194000188031200880002AF4D0A8F1060000F0FF09558125E0182101A81EF0A8FF009788 -:201960007088434601AA716900F01BFFBDF804002080BDF80600E080BDF808002081A21CC7 -:201980000DF10A0148460FF005FDB9F1000F00D018B184F804A0A4F802A007EB080087B2CC -:2019A0000A346D1EADB2D6D2C4E705EB850C00EB4C00188032200880002ABBD0A8F105002F -:2019C00000F0FF09558137E000977088434601AA716900F0E6FE9DF80600BDF80410E180EC -:2019E0002179420860F3000162F34101820862F38201C20862F3C301020962F30411420913 -:201A000062F34511820962F386112171C0096071BDF80700208122460DF1090148460FF01E -:201A2000B9FC18B184F802A0A4F800A000E007E007EB080087B20A346D1EADB2C4D279E7B6 -:201A4000A8F1020084B205FB08F000F10E0CA3F800C035230B80002AA6D055819481009752 -:201A600083B270880E32716900F09BFE62E72DE9F84F1E460A9D0C4681462AB1607A00F522 -:201A80008070D080E089108199F80C000C274FF000084FF00E0A0D2873D2DFE800F09E07C8 -:201AA0000E1C28303846556A73737300214648460095FFF779FEBDE8F88F207B9146082849 -:201AC00002D0032800D0FFDF378030200AE000BFA9F80A80EFE7207B9146042800D0FFDF5E -:201AE000378031202880B9F1000FF1D1E3E7207B9146042800D0FFDF37803220F2E7207B28 -:201B00009146022800D0FFDF37803320EAE7207B1746022800D0FFDF3420A6F800A0288031 -:201B2000002FC8D0A7F80A80C5E7207B1746042800D0FFDF3520A6F800A02880002FBAD043 -:201B40004046A7F80A8012E0207B1746052802D0062800D0FFDF1020308036202880002F04 -:201B6000A9D0E0897881A7F80E80B9F80E00B881A1E7207B9146072800D0FFDF3780372080 -:201B8000B0E72AE04FF0120018804FF038001700288090D0E0897881A7F80E80A7F8108067 -:201BA00099F80C000A2805D00B2809D00C280DD0FFDF80E7207B0C2800D0FFDF01200AE097 -:201BC000207B0D2800D0FFDF042004E0207B0E2800D0FFDF052038736DE7FFDF6BE770B587 -:201BE0000C46054601F07BFA20B10078222804D2082070BD43F2020070BD052128460DF02F -:201C000059FF206008B1002070BD032070BD38B50546DDE905011446049A72B10B46009096 -:201C20000422214628460AF0CFFE032C06D121462846BDE838400BF097B8198038BD2DE9FC -:201C4000FF4F85B000200390089890468946123008F061FB401D20F00306089828B908A9CB -:201C60000598FFF7BCFF002861D1B9F1000F06D00898017B00295FD10525046829E098F889 -:201C80000000092803D00F2820D0FFDF54E0089A03255168527B48887243824246D901F15D -:201CA000040B098897B20C181FFA86FABC4200D3E41B5044B84200D9FFDF04EB0A00B84276 -:201CC00000D9FFDF5C440020208002E0089C042508340CB1208810B1032D27D02CE0089809 -:201CE0000121123008F04FFBADF81000024603AB294605980AF059FD070001D1A01C03900F -:201D000008983A461230C8F804000598A8F8020004A94046039B08F043FBC0B1072814D2D1 -:201D2000DFE800F0080A1313110C0E00132009B0BDE8F08F0020FAE71120F8E70820F6E763 -:201D400043F20300F3E70720F1E70320EFE7BDF8100003990097CDE9011023462A46089940 -:201D60000598FFF754FFC7B9032D16D10898B7B24568407B704384B2298868880E18A642DD -:201D800000D3361B3844A04200D9FFDFF019A04200D9FFDF688838446880B9F1000FC9D0C2 -:201DA000089981F80C90C5E72DE9FF4791461A881C468A4680460AB303AB49460AF0F5FC0F -:201DC00005001BD04046A61C27880DF090FF3246072629463B4600960DF016FC2088039912 -:201DE0000095CDE9011023464A4651464046FFF70EFF00202080012004B005E50020FBE7ED -:201E000010B586B01C46AAB104238DF800301388ADF808305288ADF80A208A788DF80E2058 -:201E20000988ADF80C1000236A462146FFF707FF06B010BD1020FBE770B50D4605210DF0EA -:201E400039FE040000D1FFDF294604F11200BDE8704008F081BA2DE9F8430D46804600260A -:201E600007F053FB0446287812287BD2DFE800F07A54543C35563232133232320932323260 -:201E800032322879001FC0B2022801D0102810D114BBFFDF35E004B9FFDF052140460DF092 -:201EA00009FE007B032806D004280BD0072828D0FFDF072657E02879801FC0B2022820D063 -:201EC00050B1F6E72879401FC0B2022819D0102817D0EEE704B9FFDF13E004B9FFDF2879E1 -:201EE00001280ED1172139E0052140460DF0E2FD070000D1FFDF07F11201404608F003FAC5 -:201F00002CB12A462146404600F05BFC2BE01321404602F08AFC26E0FFDF24E004B9FFDF80 -:201F2000052140460DF0C6FD060000D1FFDF694606F1120008F0F1F9060000D0FFDFA98801 -:201F4000172901D2172200E00A46BDF80000824202D9014602E005E01729C3D3404600F057 -:201F600046FCCEE7FFDF3046BDE8F883401D20F00300021D01FB0020704708B1FE4A106023 -:201F80000CF041BF2DE9F0470E461546242130461EF08DFC05B9FFDFA87870732888DFF8D1 -:201FA000D8A3401D20F0030195F802900C46DAF800000CF03FFF070000D1FFDF4FF00008BB -:201FC0003760A7F8008004FB09F4211DDAF800000CF030FF040000D1FFDF7460C4F8008051 -:201FE000298806F11200BDE8F04708F07EB92DE9F047804601F112000D46814608F08BF96F -:20200000401DDD4E20F003046F7B2246296830680CF039FF7C43221D696830680CF033FFDD -:2020200005200DF0F1FC044605200DF0F5FC201A012802D130680CF0EEFE49464046BDE8C4 -:20204000F04708F067B970B5054605210DF032FD040000D1FFDF04F112012846BDE87040F1 -:2020600008F051B92DE9F04F91B04FF0000BADF834B0ADF804B047880C4605469246052132 -:2020800038460DF017FD060000D1FFDF24B1A780A4F806B0A4F808B0297809220B20B2EBC6 -:2020A000111F297A7DD104F110023827C91E4FF00C094FF0010803920F2973D2DFE801F04C -:2020C000F4F3F28108D48A8FA13DDDF5F0B8B800307B022800D0FFDFA88909EBC001ADF893 -:2020E00004103021ADF83410002C25D06081B5F80E9000271DE004EBC708317C88F80E1018 -:20210000F189A8F80C10CDF800906888042304AA296900F046FBBDF81010A8F8101009F11D -:202120000400BDF812107F1C1FFA80F9A8F81210BFB26089B842DED80CE1307B022800D039 -:20214000FFDFE98909EBC100ADF804003020ADF83400287B0A90001FC0B20F90002CEBD054 -:202160006181B5F81090002727E000BFCDF800906888696903AA0A9B00F013FB0A9904EB4A -:20218000C70809EB01001FFA80F908F10C0204A90F980FF0FFF818B188F80EB0A8F80CB035 -:2021A00001E0D4E0D1E0BDF80C10A8F81010BDF80E107F1CA8F81210BFB26089B842D5D817 -:2021C000C8E00DA8009001AB224629463046FFF706FBBFE0307B082805D0FFDF03E0307B67 -:2021E000082800D0FFDFE8891030ADF804003620ADF83400002C3FD0A9896181F189A1818D -:2022000027E0307B092800D0FFDFA88900F10C01ADF804103721ADF83410002C2CD06081FB -:20222000E8890090AB89688804F10C02296956E0E8893921103080B2ADF80400ADF83410DF -:20224000002C74D0A9896181287A10280AD002212173E989E181288A0090EB896888696943 -:20226000039A3CE00121F3E70DA8009001AB224629463046FFF744FB6CE0307B0A2800D03D -:20228000FFDF1220ADF80400ADF834704CB3A9896181A4F810B0A4F80EB084F80C8059E032 -:2022A00020E002E031E039E042E0307B0B2800D0FFDF288AADF834701230ADF8040084B149 -:2022C00004212173A9896181E989E181298A2182688A00902B8A688804F11202696900F015 -:2022E00060FA37E0307B0C2800D0FFDF1220ADF80400ADF834703CB305212173A4F80AB0BD -:20230000A4F80EB0A4F810B024E00DA8009001AB224629463046FFF747FA1BE00DA800904E -:2023200001AB224629463046FFF7A1FB12E035E03B21ADF80400ADF834107CB3A4F80680CC -:20234000A4F808B084F80AB004E0FFDF02E001291BD0FFDFBDF80400AAF8000094B1BDF807 -:2023600034002080BDF804006080BDF83400392808D03B2806D001E0100000203C2801D04F -:2023800086F80CB0002011B0D2E43C21ADF80400ADF8341014B1697AA172DBE7FFE7AAF878 -:2023A0000000EFE72DE9F84356880F4680461546052130460DF07EFB040000D1FFDF123497 -:2023C00000943B46414630466A6808F0A3F9CBE570B50D4605210DF06DFB040000D1FFDF1F -:2023E000294604F11200BDE8704007F0A1BF70B50D4605210DF05EFB040000D1FFDF2946A5 -:2024000004F11200BDE8704007F0C5BF70B5054605210DF04FFB040000D1FFDF04F1080355 -:2024200021462846BDE870400422BDE470B5054605210DF03FFB040000D1FFDF2146284656 -:202440002368BDE870400522AEE42DE9F047824605210DF02FFB040000D1FFDF04F11200C7 -:2024600007F059FF401D20F0030626E0011D00880322431821465046FFF796FC002820D0CE -:20248000607B656870431FFA80F82888B7B2814610FA86F080B22880404502D3A0EB080029 -:2024A00028806888B84200D2FFDF09EB0701414500D9FFDF6888C01B688060684188002934 -:2024C000D4D1BDE8F08770B50E46054607F01DF8040000D1FFDF01202072667265802078B0 -:2024E00020F00F00C01C20F0F00030302070BDE8704007F00DB82DE9F0438BB00D461446AF -:20250000814606A9FFF76BFB002814D14FF6FF7601274FF420588CB103208DF8000010202A -:20252000ADF8100007A8059007AA204604A90EF050FF78B107200BB0BDE8F0830820ADF8A1 -:2025400008508DF80E708DF80000ADF80A60ADF80C800CE00698A17801742188C1818DF8D3 -:202560000E70ADF80850ADF80C80ADF80A606A4602214846069BFFF762FBDCE708B50122A8 -:202580008DF8022042F60202ADF800200A4603236946FFF735FC08BD08B501228DF80220FB -:2025A00042F60302ADF800200A4604236946FFF727FC08BD00B587B079B102228DF8002036 -:2025C0000A88ADF808204988ADF80A1000236A460521FFF734FB07B000BD1020FBE709B1AE -:2025E00007230DE40720704770B588B00D461446064606A9FFF7F3FA00280ED17CB10620A0 -:20260000ADF808508DF80000ADF80A40069B6A460821DC813046FFF712FB08B070BD0520EF -:202620008DF80000ADF80850F0E700B587B059B107238DF80030ADF80820039100236A4638 -:202640000921FFF7FCFAC6E71020C4E770B588B00C460646002506A9FFF7C1FA0028DCD187 -:2026600006980121123007F08EFE9CB12178062921D2DFE801F0200505160318801E80B2EA -:20268000C01EE28880B20AB1A3681BB1824203D90C20C2E71020C0E7042904D0A08850B9B0 -:2026A00001E00620B9E7012913D0022905D004291CD005292AD00720AFE709208DF80000BA -:2026C0006088ADF80800E088ADF80A00A068039023E00C208DF800006088ADF80800E08802 -:2026E000ADF80A00A0680A25039016E00D208DF800006088ADF80800A088ADF80A00E088E5 -:20270000ADF80C00A0680B25049006E00E208DF8000060788DF808000C256A462946304678 -:20272000069BFFF78CFA78E700B587B00F228DF80020ADF8081000236A461946FFF77FFAFD -:2027400049E700B587B071B102228DF800200A88ADF808204988ADF80A1000236A46062189 -:20276000FFF76DFA37E7102035E770B586B0064601200D46ADF808108DF8000001460023CB -:202780006A463046FFF75BFA040008D12946304605F0C4FC0021304605F0DEFC204606B0CF -:2027A00070BDF8B51C4615460E46069F0DF08DFA2346FF1DBCB231462A4600940CF0EBFEB2 -:2027C000F8BD10B548800878144620F00F00C01C20F0F00090300B4608701822214603F1C4 -:2027E00008001EF010F8BDE8104006F091BE70B50C460546FFF720FB2146284605F09DFC4B -:202800002846BDE87040012105F0A6BC4FF0E0224FF400410020C2F8801120490870204902 -:2028200090020860704730B51C4D04462878A04218BF002C02D0002818BFFFDF2878A04299 -:2028400008BF30BD2C701749154A0020ECB1164DDFF858C0131F012C0DD0022C1CBFFFDF37 -:2028600030BD086003200860CCF800504FF400001060186030BD086002200860CCF8005046 -:202880004FF040701060186030BD086008604FF06070106030BD00B5FFDF00BD18000020B0 -:2028A00008F5014000F500401C03002014F5004070B50B2000F0B5F9082000F0B2F900214B -:2028C0000B2000F0C4F90021082000F0C0F9EC4C01256560A5600020C4F84001C4F84401E8 -:2028E000C4F848010B2000F0A7F9082000F0A4F90B2000F08BF9256070BD10B50B2000F032 -:2029000090F9082000F08DF9DD48012141608160DC490A68002AFCD10021C0F84011C0F857 -:202920004411C0F848110B2000F086F9BDE81040082000F081B910B50B2000F07DF9BDE855 -:202940001040082000F078B900B530B1012806D0022806D0FFDF002000BDCB4800BDCB48AB -:2029600000BDCA48001D00BD70B5C9494FF000400860C84DC00BC5F80803C7480024046051 -:20298000C5F840410820C43500F04BF9C5F83C41C248047070BD08B5B94A002128B10128DC -:2029A00011D002281CD0FFDF08BD4FF48030C2F80803C2F84803B3483C300160C2F84011ED -:2029C000BDE80840D0E74FF40030C2F80803C2F84803AC4840300160C2F84411AB480CE063 -:2029E0004FF48020C2F80803C2F84803A54844300160C2F84811A548001D0068009008BD8E -:202A000070B516460D460446022800D9FFDF00229B48012304F110018B4000EB8401C1F894 -:202A2000405526B1C1F84021C0F8043303E0C0F80833C1F84021C0F8443370BD2DE9F0418E -:202A40001C46154630B1012834D0022839D0FFDFBDE8F081891E002221F07F411046FFF79E -:202A6000CFFF012C24D000208C4E8A4F012470703C61894900203C3908600220091D086073 -:202A8000854904203039086083483D350560C7F80042082000F0D0F82004C7F804030820DE -:202AA00000F0B4F87A49E007091F08603470CFE70120D9E7012B02D00022012005E00122BC -:202AC000FBE7012B04D000220220BDE8F04197E70122F9E76B480068704770B500F0C7F8D3 -:202AE000674C0546D4F840010026012809D1D4F80803C00305D54FF48030C4F80803C4F8B8 -:202B00004061D4F8440101280CD1D4F80803800308D54FF40030C4F80803C4F8446101200A -:202B20000FF0E6FAD4F8480101280CD1D4F80803400308D54FF48020C4F80803C4F8486195 -:202B400002200FF0D5FA5648056070BD70B500F08EF8524D0446287858B1FFF705FF68784E -:202B600020B1002085F801000FF0C2FA4C48046070BD0320F8E74FF0E0214FF40010C1F8B8 -:202B800000027047152000F057B8424901200861082000F051B83F494FF47C10C1F80803F7 -:202BA0000020024601EB8003C3F84025C3F84021401CC0B20628F5D37047410A43F60952A8 -:202BC0005143C0F3080010FB02F000F5807001EB5020704710B5430B48F2376463431B0CFC -:202BE0005C020C602F4C03FB04002F4B4CF2F72443435B0D13FB04F404EB402000F5807093 -:202C00004012107008681844086010BD00F01F02012191404009800000F1E020C0F800115A -:202C2000704700F01F02012191404009800000F1E020C0F88011704700F01F02012191401B -:202C40004009800000F1E020C0F8801270474907090E002806DA00F00F0000F1E02080F8E2 -:202C6000141D704700F1E02080F8001470470C48001F00680A4A0D49121D1160704700005C -:202C800000B0004004B500404081004044B1004008F5014000800040408500402C000020C6 -:202CA00014050240F7C2FFFF6F0C0100010000010A4810B5046809490948083108600FF0BE -:202CC000B4FA0648001D046010BD0649002008604FF0E0210220C1F8800270471005024028 -:202CE00001000001FC1F004010B50D2000F06FF8C4B26FF0040000F06AF8C0B2844200D0FB -:202D0000FFDF3A490120086010BD70B50D2000F048F8374C0020C4F800010125C4F80453E1 -:202D20000D2000F049F825604FF0E0216014C1F8000170BD10B50D2000F033F82C48012172 -:202D400041600021C0F80011BDE810400D2000F033B8284810B504682649274808310860CB -:202D60002349D1F80001012804D0FFDF2148001D046010BD1D48001D00680022C0B2C1F854 -:202D800000210FF024FEF1E710B51948D0F800110029FBD0FFF7DDFFBDE810400D2000F042 -:202DA0000BB800F01F02012191404009800000F1E020C0F88011704700F01F02012191408E -:202DC0004009800000F1E020C0F880127047002806DA00F00F0000F1E02090F8140D03E0B4 -:202DE00000F1E02090F800044009704704D5004000D00040100502400100000110B52020CF -:202E000000F075F8202000F07DF84449202081F80004434900060860091D42480860FEF75F -:202E20006BFA3F49C83108603F48D0F8041341F00101C0F80413D0F8041341F08071C0F823 -:202E40000413364901201C39C1F8000110BD10B5202000F04CF8324800210160001D01602C -:202E60002F4A481EE83A10602F4AC2F808032C4BC8331960C2F80001C2F860012B49086006 -:202E8000BDE81040202000F03DB825492848EC390860704722492648E8390860704770B5B8 -:202EA0001F4A8069E83A224911601F49D1F800610023204D1D4A5C1E1EB1A84206D300210C -:202EC0000FE0D1F8606186B1A84209D2C1F80031C1F860311460BDE87040202000F012B886 -:202EE0001168BDE870401DF009BDFFDF70BD00F01F02012191404009800000F1E020C0F8B0 -:202F00008011704700F01F02012191404009800000F1E020C0F880127047000020E000E0CA -:202F2000000602400C130020000002400004024001000001002002000F4A12680D498A4269 -:202F40000CD118470C4A12680A4B9A4206D101B50FF0F6FDFFF799FFBDE801400749096880 -:202F60000958084706480749054A064B7047000000000000BEBAFECAA00000200400002088 -:202F8000901200209012002070B50C46054607F05EFD21462846BDE8704008F050BE10B5A4 -:202FA00010F01CFAFFF732FC10F0B4F8BDE8104010F066B90548064A0168914201D100214B -:202FC000016004490120086070470000A0000020BEBAFECA40E501407047704770477047C1 -:202FE000704702F0FF0343EA032242EA02421DF03EBC704770477047704700040506010071 -:2030000018FFFFFFDBE5B151002002009600FFFF840000000000000030B5FE4D04461028ED -:203020000AD0112C06D02846122CC17806D0132C08D0FFDFEC7030BDFFDFFBE71129F9D0E7 -:20304000FFDFF7E71129F5D0FFDFF3E770B50EF02BFB04460FF04AFB201AC4B206200CF054 -:20306000D3FC054606200CF0D7FC2E1A07200CF0CBFC054607200CF0CFFCE649281A32181B -:20308000C87812280DD000231A4413280BD0002002440878022808D000201044201AC0B23A -:2030A00070BD0123F0E70120F2E70120F5E7D94800B58079D74942089BB051F8070F8988FD -:2030C0000BD017220190ADF808108DF800200BA9684609F053FA1BB000BD4622F2E7022155 -:2030E0000CF0E8BC2DE9F0419AB01D4690460E460746FFF7F4FF04000BD02078222804D344 -:20310000A07FC0F34010A84206D108201AB0BDE8F08143F20200F9E74B208DF80000ADF818 -:2031200004703DB101208DF806008DF807608DF8088002E000208DF806000BA9684609F0A0 -:203140001DFAA07F65F34510A0770020DEE730B50446A1F120000D460A284AD2DFE800F057 -:2031600005070C1C2328353A3F44FFDF42E0207820283FD1FFDF3DE0A6480178032939D057 -:20318000C078132836D02078242833D0252831D023282FD0FFDF2DE0207822282AD0232825 -:2031A00028D8FFDF26E02078222823D0FFDF21E0207822281ED024281CD026281AD02728E8 -:2031C00018D0292816D0FFDF14E02078252811D0FFDF0FE0207825280CD0FFDF0AE020784A -:2031E000252807D0FFDF05E02078282802D0FFDF00E0FFDF257030BD30B50B8840F67B44A3 -:203200004FF6FF72022801D0934204D09D1FA54224D2022802D04D88954203D04D88AD1F9F -:20322000A5421BD24C88A34218D88B88B3F5FA7F14D2022802D0C888904205D0C88840F67E -:2032400077450A38A84209D2C888904208D0944206D05B1C6343B3EB800F01DB072030BDCB -:20326000002030BD70B514460D4606460FF0E6FE58B90DB1A54201D90C2070BD002408E04B -:2032800056F824000FF0DAFE08B1102070BD641CE4B2AC42F4D3002070BDF0B50024059D4C -:2032A00010B1A94203D850E009B90020F0BD0920F0BD055DD5B1071997F801C0BCF1150FC9 -:2032C0002DD03BDCBCF1150F38D2DFE80CF037122020262628282F2F373737373737373701 -:2032E00037372000025D22BB641CE4B28C42F9D3DBE7022DDBD1BD781D70072D01D26D077A -:2033000001D40A20F0BD157845F0010515E0EF43FF0707E0012D07D010E00620F0BD2F0727 -:20332000A7F18057002FF5D03046F0BD1578AF0701D50B20F0BD45F002051570055D641C73 -:203340002C44E4B28C4202D9B1E74FF448568C42AFD3AAE710B50278540809D0012243F298 -:203360000223012C07D0022C0DD0032C13D10FE00020087005E080790324B4EB901F0AD151 -:203380000A70002010BD8079B2EB901F03D1F7E780798009F4D0184610BD1E4A117C39B17F -:2033A000517C022908D0032908D043F2022070470146901D01F01EBD032100E001210170D4 -:2033C0000020704738B50C460546694601F012FD00280DD19DF80010207861F3470020706F -:2033E00055F8010FC4F80100A888A4F80500002038BD38B51378E8B102281BD006A46D464A -:20340000246800944C7905EB9414247864F34703137003E0B80100200302FF0103280ED0A5 -:2034200003F0FE0010700868C2F801008888A2F8050038BD23F0FE0313700228E9D1D8B247 -:2034400040F00100EEE730B50C4609789BB0222902D208201BB030BD28218DF80010ADF8E1 -:203460000400132A03D03B2A01D00720F2E78DF806200BA9684609F081F8050003D1212168 -:203480002046FFF764FE2846E4E700B59BB023218DF80010ADF804001088ADF80600508898 -:2034A000ADF80800D088ADF80C009088ADF80A000020ADF80E00ADF810000BA9684609F0AC -:2034C0005DF808E62DE9FF470220FB4E8DF804000027B08AADF80600B84643F202094DE0E2 -:2034E00001A80CF050FA050006D0B08AA8B3A6F81480ADF806803FE0039CA07F01072DD529 -:2035000004F124000090A28EBDF80800214604F1360301F084FE050005D04D452BD0112D68 -:203520003DD0FFDF3BE0A07F20F00800A077E07F810861F30000C10861F34100E07794F8BA -:20354000210000F01F0084F820002078282827D129212046FFF7FBFD22E015E040070BD503 -:20356000BDF80800214604F10E02FFF78EFF05000DD04D4510D100257F1CFFB202200CF0BB -:2035800043FA401CB842ABD8052D12D008E0A07F20F00400A07703E0112D00D0FFDF0025DB -:2035A000BDF80600B082052D05D0284604B0BDE8F087A6F814800020F8E72DE9FE4304004D -:2035C00000D1FFDF2078002720F00F00801C20F0F000703020706068B74E0178091F1729E4 -:2035E0000ED2DFE801F0FD0D0C0D4AFC0D0FFCFC37FD0D0DFD6CFDFD0D0DFDFDFB00FFDF18 -:20360000BDE8FE8385882846FFF769FD040000D1FFDF05F07DFFB07C212140F00400B074C3 -:203620002046FFF794FD284609F09CF92846FEF70AFD284604F078F8294602200FF0BAFC1F -:20364000A07F20F01000A077FFF73CFF0028D7D0FFDFD5E785882846FFF741FD00B9FFDF34 -:2036600060688078012800D0FFDF6068817903B02846BDE8F04309F0D9BA86883046FFF7F2 -:203680002EFD050000D1FFDF05F042FF60683146C088288160680089688160684089A881F1 -:2036A00002200FF087FCAF75A87F00F003000228A6D1FFF707FF0028A2D0FFDFA0E7807894 -:2036C0003C281BD0002502280ED08DF8007000B1FFDF05F01DFFB07C40F00800B0748DB113 -:2036E000B07801F046FB01208DF800009DF80000012876D0022875D0FFDF81E701258DF866 -:203700000070E6E76568B5F80490A879AD1C012806D03079804605F0ADFC070003D101E0AC -:20372000B078F7E7FFDF0022022148460CF0B9F9040000D1FFDF22212046FFF708FD28792C -:20374000012800D002208DF80000A17F6A4660F30101A177288B2081688B6081A88BA08110 -:2037600084F82280032148460CF09BF900B9FFDFB888ADF80800B8788DF80A0002AA0521D4 -:2037800048460CF08EF900B9FFDFB888ADF80400F8788DF8060001AA042148460CF081F9C9 -:2037A00000B9FFDF062105F1120001F05AFB30B36879800700D5FFDF6979E07D61F3470025 -:2037C000E075D5F80600A0616889A083062105F10C0001F046FBE0B1B07904E041E03BE077 -:2037E00046E021E02CE04108607861F347006070D6F80700C4F80200B6F80B0012E0E07D6F -:2038000020F0FE00801CE075D5F81200A061E88ADBE7607820F0FE00801C6070E868C4F837 -:203820000200288AE08061E73078032800D0FFDF002108460FF0BEFB012001F065FADFE64E -:20384000F078132800D0FFDF002107200FF0B2FB1120FFF7E1FBD3E62046BDE8FE4301F02A -:203860009FBF05F055FEB07C40F04000B074C7E6BDE8FE4305F04CBE2DE9F05F0546007828 -:203880000C4600270109DFF830A091463E4601296FD000234FF6FF7002296BD007290DD0F0 -:2038A0000A2968D0FFDF00BFA9F800600CB1278066800020BDE8F09FB8010020D5F804C0F7 -:2038C00004F108029CF80010132973D00EDC04F118080B2913D004DC042969D0082968D100 -:2038E0004AE00F295AD01229F9D1C2E0143907295FD2DFE801F0F2F35E5E49DFF00011273E -:203900000926002C7DD0BCF804804046FFF7E7FB90F822B0A4F804806868807920729AF802 -:203920001210404621F004018AF8121004210CF0D3F8052140460CF0CFF8002140460CF027 -:20394000CBF8012140460CF0C7F8032140460CF0C3F8022140460CF0BFF8062140460CF0DB -:20396000BBF8072140460CF0B7F8584601F001FA9AE70AE135E102E112271026BCF8040025 -:20398000214601F04FFA8FE71C270926B4B3BCF80200A08068680079207285E71B270926A9 -:2039A00064B30420207268684088A0807CE701E034E0E3E09CF802003C2825D01027182603 -:2039C0000CF1020CD4B1BCF80200A080BCF818006082BCF818002082BCF81A00A082BCF8C1 -:2039E0001C00E0829CF805000CF10601FFF701FD9CF8040018B10120E0730AE001E00220F6 -:203A0000FAE7A9F8006054E71B270926002CF8D023729AF8121021F00801F5E01D2737264B -:203A2000002CEED0A0806968081DCB7801461846FFF7DFFC6868C07AA0756868007B042837 -:203A4000E07D13D020F00100E07569681F22097B61F34200E0756968897A61F3C700E075FB -:203A6000696840460D311CF089FE1DE740F00100EAE71D273726002CC3D0A0806968087946 -:203A8000491DFFF7B6FC696804F10F02C87A0C31FFF7AFFC6868807CA0756868C178E07DDA -:203AA00061F3420020F0F900E0751F2140461CF0FEFEF9E620271026002CA2D0A08068685A -:203AC00004F10902807A207269680B1DC8781946FFF78FFCE8E63AE000E024E021270B26FC -:203AE000002C8ED0BCF80400A08068688078207268688079012805D0022803D003280ED03D -:203B0000FFDF002060726868C079012805D0022803D0032805D0FFDF0020A072C4E60420F3 -:203B2000F0E70420F9E723271026002CA4D0BCF80200A0806868007920816868007A60819F -:203B40006868C088A08168684089E081ACE622271026002C90D06888A0806868808820810C -:203B60006868C088608168680089A08168684089E0819AF8121021F0400145E04A462146B6 -:203B80002846BDE8F05F01F0A9BF287A012803D0022814D0FFDF87E61F271026002C8CD06F -:203BA0006888A08068892081A8896081E889A081288AE0819AF8121021F0200124E0122789 -:203BC00010266888214601F02DF9002C89D0687800F007000528A1D19AF8121021F002017E -:203BE00012E0297A062923D2DFE801F0041111030303C3E71B270926002C97D0A0802372C2 -:203C00009AF8121021F001018AF812104CE61B270926002C8AD0A080287A012806D003202C -:203C200020729AF8121021F01001EDE70220F7E7FFDF39E630B5F84D9BB0E878132801D06A -:203C4000082007E422208DF83C0069460FA808F095FC040002D1287901F08BF8002107202B -:203C60000FF0A8F920460FE400B5EB489BB0C078122801D0082024E41E208DF800000020C2 -:203C80008DF804008DF805000BA9684608F076FC0028F0D1002107200FF08CF91120FFF769 -:203CA000BBF900200DE410B5DB4C9AB02078012813D01B208DF8000000208DF804000BA948 -:203CC000684608F05BFC002808D1002108460FF071F92078032803D005E008201AB010BDD4 -:203CE000A07801F046F8012001F00EF80020F5E72DE9F041C84C002740B102281DD00728B0 -:203D000042D0082800D0FFDFBDE8F081FFF7CBFF0028F9D105F0F9FB0028F5D0017821F08B -:203D20000F01891C21F0F00120310170077205F0EFFBA07C40F001001DE08EB23046FFF7BC -:203D4000CEF9050000D1FFDF28782128DCD005F0DCFB90B1017821F00F01891C21F0F00105 -:203D600010310170022101724680AF7505F0D0FBA07C40F00200A074C6E729463046BDE8B8 -:203D8000F0411322FFF75FBBE578122D03D0132D04D0FFDFB8E7FFF767FF01E0FFF74AFF31 -:203DA0000028B1D105F0B1FB0028ADD0017821F00F01891C21F0F00120310170122D07D0FA -:203DC0000221017205F0A4FBA07C40F01000D2E70121F6E72DE9F04116460C00074600D1D8 -:203DE000FFDF307820F00F00801C20F0F000103030702078012803D0022817D0FFDF83E7B5 -:203E00003846FFF76CF9050000D1FFDF0220A87505F07EFB2068B0606068F060208930825D -:203E20007D48817C41F0200181746DE73846FFF756F9050000D1FFDF61884FF6FF7081424E -:203E400009D1A288824206D129463846BDE8F0411322FFF7F8BA814201D1A08848B105F078 -:203E600057FB2068B0606068F06020893082002006E078230022394602200EF0FBFF012068 -:203E8000A87541E730B505469BB00C4608460FF0D5F878BB00210120203D092D6BD2DFE8EA -:203EA00005F005254C505A616D7B4000002108200FF056F808B11120C3E624208DF8000072 -:203EC000D4F802000190A0798DF808000BA9684608F054FB05004FD108230022114618460D -:203EE0000EF0C8FF082847D0FFDF45E060680FF0E9F808B11020A4E64C208DF800002088FF -:203F0000ADF804006088ADF806000BA9684608F035FB050030D1606860B3BDF83010018084 -:203F20002AE04E208DF800002088ADF80400A07800F001008DF8060029E0206802F06FF8B5 -:203F400017E04D2208E000BF8DF804001FE000BF8DF804101BE048228DF800202278D207F7 -:203F6000F6D0F1E72178C90705D057218DF80010EAE7054600E00725284662E638208DF89D -:203F800000002088ADF804006088ADF806000BA9684608F0F3FAECE72078C00802D1607818 -:203FA000C00801D007204CE63F208DF8000020788DF8050060788DF80600207830B100200D -:203FC0008DF80400617819B1002102E00120F7E702210843B8E730B505469BB00C4608468B -:203FE0000FF052F808B110202BE6203D092D2BD2DFE805F0052828282A2A2A2A280020883D -:20400000FFF76DF820B10078222807D2082018E643F2020015E60000B801002025208DF8DE -:2040200000002088ADF804000BA9684608F0A6FA0028D9D1DDF83210C4F802109DF83610A3 -:20404000A171FEE50620FCE50720FAE5F748704738B5F6481621801F1CF007FC012000F047 -:2040600053FE1120FEF7D8FFF04C6846A41FE11D05F0ACF99DF80010A07961F3470020F044 -:204080000100A071002020744FF46170E08102206074FFF70CF800B1FFDFFDF755F901F033 -:2040A0003AFB38BD10B50C463E2120461CF0DDFBA07F20F00300A077202020700020A075C8 -:2040C00084F8230010BD70477CB505460EF0B6FF08B110207CBDD54CA41FA11DD4F80600F8 -:2040E0000090D4F80A0001902846FFF76BF90028F0D1FEF7DCFF0028ECD00099C4F80610F9 -:20410000BDF8041061819DF8061021737CBD10B504460EF0B9FF08B1102010BDC34922468D -:20412000891F8879C91D4008FFF763F9002010BD2DE9F047A0B00D4604004FF0000812D04C -:204140000822FFF78FF800281CD1002609E000BF54F8260004A9FFF7FDF8002812D1761C2E -:20416000F6B2AE42F4D32F460A2006AD0DF1440A8DF8180026465146284608F0FFF920B173 -:2041800043F2032020B0BDE8F0874046DFF89C82A8F1060888F805002EB300244FF00B09DC -:2041A0001DE000BF56F8240005A9FFF7D3F800B1FFDF9DF81400287156F8240050F8011FB7 -:2041C000C5F805108088A5F8090085F800905146284608F0D3F900B1FFDF641CE4B2BC42E6 -:2041E000E0D388F805700020CCE72DE9F047A2B01546894604001ED00F4608222946FFF7A5 -:2042000031F8002811D1002613E000BF54F8260005A9103000F0EEFD002806D13FB157F81A -:2042200026000EF00BFF10B1102022B0ABE7761CF6B2AE42EAD30026A5F101081CE000BF94 -:2042400006F1010A0AF0FF0712E000BF54F82600017C4A0854F827100B7CB2EB530F05D18B -:204260000622113011311CF05DFAC0B17F1CFFB2AF42EBD30AF0FF064645E1DBC8462F46FB -:20428000342007AD0DF148098DF81C0026464946284608F073F928B143F20420C5E743F246 -:2042A0000520C2E796B300242CE000BF56F82400291D103000F09EFD00B1FFDF56F8240074 -:2042C000102250F8111FC5F805108088A5F8090056F8241005F10B001CF050FAB8F1000F23 -:2042E00015D058F82410102205F11B001CF046FA322028704946284608F040F900B1FFDF1F -:20430000641CE4B2BC42D1D3012206E004E005F11B0001F078FEEBE700224946284600F09F -:2043200094FD002081E770B59AB004460EF086FE18B960680EF0CFFE10B110201AB070BDDD -:2043400060884AF2B811884206D8384D20786E46AD1F18B1012804D00720EFE7FEF7A7FECE -:2043600019E06078022804D0032802D043F20220E4E7687417208DF80000697C0020019021 -:20438000ADF80800022932D003292DD0FFDF0BA9684608F0F3F80028D0D1606801F026FE51 -:2043A000207870B101208DF80400701D01F02BFE50208DF800000BA9684608F0DFF800B11C -:2043C000FFDF6088A8B1E88180B2ADF8040030208DF800000BA9684608F0D0F800B1FFDFF4 -:2043E000207828740020A9E78DF80900CFE74020FAE74FF46170E6E710B504460EF044FE24 -:2044000020B9606838B10EF05DFE08B1102010BD606801F0F8FD0548801FC1896180417C81 -:204420006170007C2070002010BD0000BE0100202DE9F041A0B0054600208DF874008DF853 -:2044400070008DF86C008DF878001E461446884628460EF040FE18B920460EF03CFE10B198 -:20446000102020B050E455EA040018D01F271BAB1DAA414628460097FEF70FFF0028F0D192 -:204480001EAB1CAA314620460097FEF706FF0028E7D19DF87000C00703D00A20E1E7072087 -:2044A000DFE701AF7DB11A208DF804008DF8088042462946781D1CF061F90CA901A808F040 -:2044C0005DF80028CDD17CB120208DF804008DF8086032462146781D1CF050F90CA901A8B7 -:2044E00008F04CF80028BCD1FF499DF86C0048700020B6E72DE9F0479EB08A464FF000085B -:20450000FAA104468DF86880D1E90001CDE91B0120460EF093FD90B92078012803D1606822 -:204520000EF08CFD58B9F04D4FF00109287C48B1687C022806D160680EF0CDFD10B110205A -:204540001EB020E62878012801D00820F8E707200BF062FA18B9207848B1012807D0FEF711 -:2045600075FD30B1A87C10F00C0F08D103E01220E6E71320E4E7C10701D1800701D51120C8 -:20458000DEE7608943F6E172A0F120019142217807D301297ED100287CD1A189002979D15E -:2045A0000FE0022901D0032901D1A02872D3012907D06978C90704D0A18900296AD0B42915 -:2045C00068D8217831B1012908D0022904D0032960D10AE0002609E0022607E008B9A089D0 -:2045E00008B1042609E0012607E00326287C50B1687C022807D1606828B11AA96068FEF70C -:20460000A9FE00289CD1207A30B1012806D0022806D0032878D105E0002704E0012702E076 -:20462000022700E003270EB1022E0ED16FB1687980B36878800702D043F2012080E7022E1F -:2046400003D1022F60D0032F5ED0207808B1012806D1504600F06CFB002889D185F802A0E6 -:2046600018208DF83C006089ADF840006089ADF842008DF844600DF14500FEF78EFE00B105 -:20468000FFDF9DF868008DF846002078012808D0287C00E038E058B1687C022808D1606887 -:2046A00030B1606850F8011FCDF84710808802E04046CDF84780ADF84B008DF84E70A07B83 -:2046C000C0F34002014662F35F01C0F3800041EA80001BA9085C8DF84D00A8B169460FA852 -:2046E00007F04CFF0028A9D11B208DF83C008DF8409069460FA807F041FF00289ED19DF8BC -:2047000001001B281CD101E0072019E7052E0CD2DFE806F0030308080300A87800F01CFB52 -:20472000032000E0022000F0EFFA012E0AD0A08940B100228300114610460EF09BFB08B1B9 -:204740000320FDE60020FBE62DE9FC4107460D46032608460EF0BFFC002864D13846FEF75F -:20476000BEFC040005D02078222805D20820BDE8FC8143F20200FAE7A07F00F0030C2DB18F -:2047800029466046FEF738FD0600F0D15648BCF1010F05D0BCF1020F17D0FFDF3046E6E71D -:2047A000A27D2946012A02D0807C800701D51120DDE729B96846FCF7D5FE0028D7D169464B -:2047C000384608F0E1F90646E8E7A17D022914D1807C800611D425B1A07F40070BD400219D -:2047E00000E00121384608F0FAF90600D6D1A075002DD3D002E01126D0E7A5B12A462146BF -:204800003846FEF742FE06461128C7D1A07F4107C4D4296844F80E1F6968616040F0040009 -:2048200020740026BAE71020A1E770B50C460546FEF755FC010005D022462846BDE870405C -:20484000FEF701BE43F2020070BD00B59BB045218DF800108DF804000BA9684607F08EFED7 -:204860001BB000BD0123FEF73DBC00231A461946FEF738BC30B59BB004460EF0DFFB10B1C0 -:2048800010201BB030BD204600F0A2FA0028F8D1154DE878112801D00820F2E7FEF7D6FBBA -:2048A00020B1A87CC00603D51120EAE71320E8E72078800701D56879F0B31D208DF8000026 -:2048C0002078022200F001008DF804006088ADF80600A088ADF808002078C0F3400102EAC2 -:2048E0005000014306E00000B801002007060504030201008DF80B100DF10A00FEF74DFD62 -:2049000000B1FFDF0BA9684607F038FE0028B8D11E208DF8000001208DF8040000208DF8B6 -:2049200005000BA9684607F029FE0028A9D1E08800F06AFA040000E005E0A2D11220FEF731 -:204940006BFB20469DE707209BE72DE9F041FE4C07469AB0E078984616460D46122803D143 -:20496000FFF782F900280ED128460EF067FB70BB30460EF063FB50BBA07C10F0180F01D1D4 -:20498000400703D511201AB0BDE8F081284600F01FFA0028F7D131460220FEF72DFC0028A1 -:2049A000F1D1E078112801D00820ECE706200BF033F850B12878800701D5607940B1FEF7CF -:2049C00045FB022806D21320DDE71220DBE716E00720D8E721208DF800006888ADF804006F -:2049E000A888ADF806002878C0F340008DF80800287880071DD438460EF020FB08B1102024 -:204A0000C1E73878420808D0012A18D043F20221022A18D0032A18D115E0C00700D00220D9 -:204A20008DF8090057F8010FCDF80A00B888ADF80E0004A8FEF7B1FC58B10320A3E7C007FC -:204A400005D00320ECE7C00701D008469BE70120E6E73088ADF812007088ADF81400B088DD -:204A6000ADF81600F088ADF818000020ADF81A00ADF81C00404600F05BF9002883D184F8E4 -:204A800004800BA9684607F079FD00288DD1207900F062F9E88800F0B7F9040085D11320BC -:204AA000FEF7BAFA20466EE730B505469BB00C4608460EF0E9FA08B11020E2E62846FEF782 -:204AC0000EFB38B10178222902D3807F800604D40820D6E643F20200D3E613208DF8000062 -:204AE000ADF804500BA9684607F048FD0028E4D19DF932107F2901D02170C2E60520C0E6ED -:204B000030B505469BB00C4608460EF097FA08B11020B6E62846FEF7E2FA20B10078222894 -:204B200004D20820ADE643F20200AAE62078C00802D16078C00801D00720A2E656208DF8CF -:204B40000000ADF8045020788DF8070060788DF80800207830B100208DF80600617819B10C -:204B6000002102E00120F7E7022108438DF806000020ADF80A000BA9684607F0FFFC80E6B1 -:204B80002DE9F041B8B0144688460546FEF7A7FA060005D03078222805D2082038B0F3E6D0 -:204BA00043F20200FAE740460EF095FA28B900273CB120460EF086FA08B11020EEE72760AC -:204BC000A7806148807C400601D51120E6E796F8220004F04FFA8088011DFB2901D2001DC8 -:204BE00000E0FB20C0B26A46414600F0CCF82C22564913A81BF007FEADF85050BDF80200A9 -:204C0000ADF85200BDF80600ADF85400BDF80000ADF85600BDF80400ADF8580004A913A81B -:204C200007F0ACFC00B1FFDFBDF81400ADF80800BDF81600ADF80A00BDF81800BDF81A10AA -:204C4000BDF800200844ADF80C0007201B2AA5D3BDF802101B29A1D3FB2A9FD8FB299DD8EA -:204C600006268A4210D10121104600F03DF8BDF80410884208D1BDF80200012100F034F85D -:204C8000BDF80610884201D0304687E7BDF8080028B9BDF80A0010B9BDF80C0038B124B125 -:204CA00002982060BDF80C00A080132076E727492C222C311EA81BF0A6FDADF87C50BDF8B4 -:204CC0000200ADF87E00BDF80600ADF88000BDF80000ADF88200BDF80400ADF8840029A93F -:204CE0001EA807F04BFC59E7032904D0022907D0C000703006E04FF4747101EB801001E0A3 -:204D000080003C3080B2704730B50F4D040008D0012C04D0022C06D0032C04D0FFDF2C701F -:204D200030BDFFDFFBE728780128F8D0FFDFF6E710B5044604F09EF950B1407850B12046C0 -:204D400004F09FFC002010BDB8010020100C02000720F8E71220F6E710B504F08BF904008A -:204D600000D1FFDF607800B9FFDF6078401E6070E9E710B504F07EF9040000D1FFDF607884 -:204D8000401C6070DFE710B5144631B10A68226049686160218839B107E02080608001219E -:204DA000FFF7A2FFA0800DE02080618801B96080A08820B920880121FFF796FFA080E0884E -:204DC0000028C0D160880121FFF78EFFE080BAE7418843F6FD730A1F9A4209D28088042806 -:204DE00006D3B0F5804F03D8884201D800207047072070470278520804D0012A02D043F259 -:204E000002207047FEF7A6BA10B548B183000022114607200EF02EF8072801D0032092E7C3 -:204E2000002090E770B50C0006460DD0FEF757F9050000D1FFDFA68028892081288960817E -:204E40006889A081A889E08170BD10B502F0010202713122027007F091FB002800D0FFDF36 -:204E600071E710B500231A4603E0845C2343521CD2B28A42F9D30BB1002064E7012062E74E -:204E80002DE9F041884606460188408815460C181F46AC4200D3641B3844A84200D9FFDF1F -:204EA000E019A84200D9FFDF70883844708008EB0400BDE8F08110B504460EF0BFF808B16A -:204EC000102010BD2078C0F30210042807D86078072804D3A178102901D8814201D20720A7 -:204EE00010BDE078410706D421794A0703D4000701D4080701D5062010BD002010BD10B543 -:204F000013785C08C37F64F30003C3771478A40864F34103C3771078C309487863F3410014 -:204F2000487013781C090B7864F347130B701378DB0863F3000048705078487110BD10B5CB -:204F4000C4780B7864F300030B70C478640864F341030B70C478A40864F382030B70C47884 -:204F6000E40864F3C3030B700379117863F30001117003795B0863F34101117003799B08B9 -:204F800063F3820111700079C00860F3C301117010BD70B514460D46064604F0B6FA80B11E -:204FA0000178142221F00F01891C21F0F001A03100F8081B21461BF026FCBDE8704004F0B1 -:204FC000A7BA29463046BDE870401322FEF73BBA70B514460E46054604F097FA70B10178DA -:204FE00021F00F01891C21F0F00120310170458021688160BDE8704004F08ABA3146284686 -:20500000BDE870401322FEF71EBA10B5FE4C94F8300000280CD104F120014FF6FF72A1F10B -:2050200010000CF03EF900B1FFDF012084F8300010BD2DE9F047064608A8894690E8300440 -:205040001F469046142128461BF031FC0021CAF80010B8F1000F03D0B9F1000F03D114E03B -:205060003878C00711D020680EF00EF8F0BBB8F1000F07D12068123028602068143068602B -:205080002068A8602168CAF800103878800728D560680EF017F848BBB9F1000F2DD0FEF76E -:2050A000D5FF0168C6F8C8118188A6F8CC11807986F8CE01FFF7A9FFDFF84C8308F12008ED -:2050C000C5F80C80626862B196F8C80106F2C91140081032FEF78DF91022414660681BF0F0 -:2050E0004DFB3878400712D5A06800E002E00DF0CBFF50B11020BDE8F08760680028F9D0F3 -:20510000E8606068C6F8C401EBE7A06828610020F1E730B5054608780C4620F00F00401C24 -:2051200020F0F001103121700020607095F8230030B104280FD0052811D0062814D0FFDF12 -:2051400020780121B1EB101F04D295F8200000F01F00607030BD21F0F000203002E021F037 -:20516000F00030302070EBE721F0F0004030F9E710B510B190F8BD4044B1A34890F8354044 -:20518000002064B108601060186010BD00F1BC040C6000F1E40100F586701160F4E79A4CAD -:2051A00034340C60EFE700B58BB00723CDE902128DF8013001919449002364310591099352 -:2051C00001468DF8103068460CF043F8002800D0FFDF0BB000BD70B590B015460C4602225A -:2051E0000646ADF80820082103AB07F0DEFA0490002812D00C208DF8010004208DF80400F3 -:2052000004F59A74099605948DF818500AA968460CF01FF800B1FFDF012010B070BD30B56C -:205220009BB00C462C251E998DF80050ADF80400C3B11868CDF80600D3F80400CDF80A00EE -:20524000ADF80E20102204A81BF098FA0BA9684607F094F9002803D1A17F41F01001A177A4 -:205260001BB030BD0020CDF80600E7E72DE9F0470646008A8CB080B20D468246FDF72FFFEF -:205280000446614F3078383FDFF87C814FF00009122873D2DFE800F072F8350936777E963A -:2052A000A3E7F7F6F5F4F35BF3F3A07F00F00300012806D0002150460AF0FCFB050003D1C8 -:2052C00001E00121F7E7FFDF98F85C10090602D5D8F860000BE0032105F121000DF058FB87 -:2052E000D5F821004949B0FBF1F201FB1200C5F821007068A867B068E8672078252800D0B1 -:20530000FFDFE7E0A07F00F00300012806D0002150460AF0CFFB060003D101E00121F7E7A1 -:20532000FFDF3078810702D52178252904D040F0010030700CB0DEE60220287096F8200014 -:20534000287106F121003136C5E90206F2E7A07F00F00300012806D0002150460AF0AAFB3F -:20536000040003D101E00121F7E7FFDF2078C10605D51320287041346C60DBE7C9E140F0B5 -:2053800008002070D6E72048082138380DF000FB032014E02A208DF80000102201A8716825 -:2053A0001BF0ECF9102205A8B1681BF0E7F9164968463C3907F0E2F800B1FFDF042028707C -:2053C0006F60B7E7E07FC00600D5FFDFB0680090B38806220821504607F0F6FAAAE704B989 -:2053E000FFDF716821B1102204F124001BF0C6F928212046FDF7ABFEA07F00F00300022887 -:2054000013D104F1240003E01402002040420F00002300901A4621465046FFF700FF1128A7 -:2054200007D029212046FDF792FE307A84F8200080E7A07F000700D5FFDF14F81E0F40F072 -:2054400008002070A4F81690C4F81890C4F81C906178084661F38200410861F3C300607079 -:20546000307AE07066E7A07F00F0030001280CD0002150460AF01EFB040009D107E01BE044 -:2054800043E17FE075E04DE02BE00121F1E7FFDF022104F189000DF07BFA1020287004F550 -:2054A000E4706860B4F88910298204F18000FE496861C5E902813DE7A07F00F003000128CB -:2054C00005D0002150460AF0F5FA18B901E00121F8E7FFDF0CB0324621465046BDE8F047B9 -:2054E00057E504B9FFDF20782128A1D93079012802D002280AD103E0E07F40F01000E077F8 -:2055000098F85C1041F0010188F85C10324621465046FFF73EFD0CB02046BDE8F047232188 -:20552000FDF715BE3279AA8005F108030821504607F03BF9E86008B1112021E0A07F00F0A2 -:205540000300012806D0002150460AF0B3FA040003D101E00121F7E7FFDF04F166010223D3 -:205560001022081FFFF78CFC80F8009031794170E0E60821504607F0F7FB00289BD11220BD -:205580002870D7E6A07F00F00300012806D0002150460AF08FFA050003D101E00121F7E7B1 -:2055A000FFDF95F8880000F00300012878D1A07F00F00307E07FC0F3400616B1012F04D057 -:2055C0002BE095F8A400C0072AD0D5F8C01119B395F88720087C62F387000874E27FD5F826 -:2055E000C01162F341000874D5F8C01166F300000874AEB1D5F8C001102204F124018C355B -:205600001BF0BCF8287E40F001002876287820F0010005F88C0900E016B1022F04D02CE05B -:2056200095F88C00C00726D0D5F8BC1119B395F88720087C62F387000874E27FD5F8BC1123 -:2056400062F341000874D5F8BC1166F3000008748EB1D5F8BC01102204F124018C351BF0E8 -:205660008DF8287840F0010005F8180B287820F0010005F8A409022F43D0002000EB4000CA -:2056800005EBC00090F88C00800709D595F88000D5F8C421400805F181011032FDF7A9FE85 -:2056A00005208DF8000095F888006A4600F003008DF8010095F88C108DF8021095F8A40011 -:2056C0008DF8030021465046FFF782FC2078252805D0212807D0FFDF2078222803D9222118 -:2056E0002046FDF734FDA07F00F0030001280AD0002150460AF0F0F900283FF427AEFFDF62 -:2057000018E60120BAE70121F3E7716881F8019010E6FFDF0EE670B5634C0025103C14F8D1 -:205720005C0F20F08000207065600BF05AFD5E49A1F1100003F07CFE04F82C5C0620607295 -:2057400059487C3020615030A0611030E06170BD70B50D46FDF7C3FC040000D1FFDF4FF42B -:20576000E87128461BF0A3F84F485430686104F124002861A07F00F00300012808D0022100 -:2057800005F59A700BF02EFD002800D0FFDF70BD0121F5E70A46014602F59A700BF042BD4C -:2057A00070B505464068A0B00178092906D00C2938D00D2934D0FFDF20B070BD468830466A -:2057C000FDF78DFC040000D1FFDF20782128F3D0282822D1686802210C3001F0D1F9E0B137 -:2057E00068680821001D01F0CBF9B0B12D208DF80000ADF80460102204F124010DF1060052 -:205800001AF0BCFF0BA9684606F0B8FE00B1FFDF29212046FDF79BFCCEE703F079FECBE71A -:2058200001218171686886883046FDF758FC040000D1FFDFA07F00F00301022902D120F0E4 -:205840001000A077207821280AD06868817909B1807880B1A07F00F0030002285AD0FFDF75 -:20586000A07F00F003000228A6D1FDF72BFE0028A2D0FFDFA0E703F04BFEE07FC10724D002 -:20588000800701D5062000E0052084F82300207829281CD02428E3D1314606200DF08AFBED -:2058A0002221204602E0000024020020FDF74FFCA07F00F0030001282AD0002130460AF012 -:2058C0000BF90028CCD0FFDFCAE70420DDE7A07F00F00300012806D0002130460AF0EAF805 -:2058E000050003D101E00121F7E7FFDF25212046FDF72DFC0F208DF868001AA905F59A7064 -:205900000BF087FC0228ABD00028A9D0FFDFA7E70121D3E703F0FCFDA2E72DE9F0438BB082 -:205920009946154688460646FDF7D9FB04004FD0207822284CD323284AD0E07FC00647D482 -:20594000A07F00F00300012806D0002130460AF0B1F8070002D00CE00121F7E7A07F00F028 -:205960000300012805D10121002230460AF099F8074601AB02AA03A93846FFF7F9FB03988C -:2059800000B9FFDF4FB1039807F59A7787612078222806D0242804D007E00399002088617C -:2059A00003E025212046FDF7D2FB03980B21417046628580C0E90289029901610199416105 -:2059C00004A90BF046FC022802D0002800D0FFDF0BB0BDE8F083F0B587B00746FDF77FFBA1 -:2059E000017822291DD9807F00F00300012806D0002138460AF05EF804003FD101E00121F6 -:205A0000F7E7FFDF3AE000BFB4F8621004F1660008440178427831B121463846FFF7DBFB66 -:205A2000B8B907B0F0BDADF804200821384602AB06F0BBFE03900028F3D011208DF8000091 -:205A4000694604F59A700BF0E4FB022801D000B1FFDF04F162052E88B01C80B22880102840 -:205A600001D3103828806888022800D2FFDFB61C102E00D9FFDF6888801E6880B4F864004B -:205A80000028C1D1CDE730B587B00546FDF727FB0446007822281FD90821284607F064F92C -:205AA000002819D1A07F00F00300012806D00021284609F0FFFF040003D101E00121F7E784 -:205AC000FFDF12208DF80000694604F59A700BF0A0FB002800D0FFDF07B030BD2DE9F05F0A -:205AE00005460C4600270078904601093E46BB4604F1080A02297CD0072902D00A2909D178 -:205B000042E068680178092905D00C292CD00D292AD0FFDFC6E114271C26002C6AD0408882 -:205B2000A080FDF7DCFA5FEA000900D1FFDF99F817005246400809F11801FDF75AFC6868C5 -:205B40008089208268684168C4F812108068C4F81600A07E20F0060040F00100A07699F87D -:205B60001E0040F040014DE01A270A26002CD5D08088A080FDF7B3FA050000D1FFDF514613 -:205B80002846FFF7C6FA8DE10CB1288BA080287A0E287CD006DC01287AD0022808D003283D -:205BA00004D135E0102874D0112873D0FFDF79E11E270926002CB1D0A088FDF790FA5FEABB -:205BC000000900D1FFDF287B00F003000128207A1BD020F001002072297B890861F341005C -:205BE0002072297BC90861F382002072297B090901E04CE119E161F3C300207299F81E0020 -:205C000040F0800189F81E104CE140F00100E2E713270D26002CAAD0A088FDF760FA8146AD -:205C2000807F00F00300012806D00021A08809F041FF050003D101E00121F7E7FFDF99F8C8 -:205C40001E0000F00302012A59D0E86F817801F003010129217A54D021F00101217283780E -:205C60009B0863F3410121728378DB0863F38201217283781B0963F3C3012172037863F36F -:205C800006112172437863F3C711217203E060E0A6E08EE09EE084F809B0C178A172012A9D -:205CA00032D04279E17A62F30001E1724279520862F34101E1724279920862F38201E172A4 -:205CC0004279D20862F3C301E1720279217B62F3000121730279520862F341012173027947 -:205CE000920862F3820121730079C00860F3C301217399F8000023285AD9262168E0A86FFD -:205D0000A4E741F00101A9E70279E17A62F30001E1720279520862F34101E17202799208E2 -:205D200062F38201E1720279D20862F3C301E1724279217B62F3000121734279520862F3CC -:205D4000410121734279920862F3820121734079CBE718271026002C67D0A088FDF7BFF995 -:205D60008246807F00F00300012807D00021A08809F0A0FE5FEA000903D101E00121F6E783 -:205D8000FFDFE868A06099F8000040F0040189F8001099F80100800708D5012020739AF842 -:205DA000000023287ED92721504663E084F80CB078E015270F26C4B3A088FDF790F981463C -:205DC00006225146E86806F041FC0120A073AEE048464FE0162709263CB3287B207261E031 -:205DE000297BFE4802290CD019270E26ECB101290DD003291AD004291BD0052919D0FFDF77 -:205E000023E01B270926BCB30121217205E001212172617A21F00301617210F85C1F4A08B8 -:205E2000520062F3060101700FE02BE00220207207E0687B052900F00F0040F0800020725C -:205E40001BD0607A20F003006072A088FDF747F905460078212825D0232800D0FFDFA87F1B -:205E600000F00300012810D00021A08809F034FE22212846FDF76BF914E0607A20F00300C8 -:205E8000401CE1E7A8F8006011E00121EDE70CB16888A080287A03282BD004280AD005282F -:205EA0004BD0FFDFA8F800600CB1278066800020BDE8F09F15270F26002CE3D0A088FDF7DF -:205EC0000EF9807F00F00300012806D00021A08809F0F0FD050003D101E00121F7E7FFDF03 -:205EE000D5F821000622514606F0B0FB84F80EB0D8E717270926002CC4D0A088FDF7EFF82B -:205F00008146807F00F00300012806D00021A08809F0D0FD050003D101E00121F7E7FFDF22 -:205F20006878800701D5022000E00120207299F800002328B6D927214AE719270E26002CEB -:205F4000A0D0A088FDF7CBF85FEA000900D1FFDFC4F808B0A4F80CB084F808B0A07A40F0A7 -:205F60000300A07299F81F1061F38200A07299F81F1001EA510161F3C300A072687A00F06C -:205F8000030001288ED1607A40F00400607299F81E00E97A00F00300012813D0607B61F356 -:205FA00000006073AA7A217B62F300012173EA7A520862F341006073A87A400860F341013E -:205FC00021736FE7207B61F300002073AA7A617B62F300016173EA7A520862F34100207344 -:205FE000A87A400860F3410161735BE710B57B4C30B10146102204F120001AF0BFFB0120AC -:2060000084F8300010BD10B50446FEF7FEFF734920461022BDE8104020311AF0AFBB70B5D3 -:206020006E4C06004FF0000514D00DF007F808B110250DE00621304606F0EFFA411C06D0F2 -:20604000206614F85C0F40F08000207000E00725284670BD14F85C0F20F08000F5E7007801 -:2060600010F00F0204D0012A05D0022A0CD110E0000909D10AE00009012807D0022805D06D -:20608000032803D0042801D0072070470870002070470620704705282AD2DFE800F0030711 -:2060A0000F171F00087820F0FF001EE0087820F00F00401C20F0F000103016E0087820F04D -:2060C0000F00401C20F0F00020300EE0087820F00F00401C20F0F000303006E0087820F046 -:2060E0000F00401C20F0F0004030087000207047072070472DE9F041804688B00D460027D9 -:2061000008460CF0E8FFA8B94046FCF7E8FF040003D02078222815D104E043F2020008B01B -:20612000BDE8F08145B9A07F010603D500F00300022801D01020F2E7A07FC10601D4010793 -:2061400002D50DB10820EAE7244991F85C10C90701D01120E3E7E17FC90601D50D20DEE7BC -:2061600000F00300022805D125B12846FEF7A3FE0700D4D1A07F00F00300012806D0002174 -:20618000404609F097FC060002D00DE00121F7E7A07F00F0030001280CD000210022404648 -:2061A00009F07FFC060007D0A07F00F00300022804D009E00121F1E70420B0E725B12A469A -:2061C00031462046FEF79BFE07AB1A4669463046FEF7CEFF009800B9FFDF01E01402002015 -:2061E00000990C20487006F59A70C1F82480486100200881A07F00F00300012828D0EDB39B -:2062000002200871301D88613078400908777078C0F340004877287800F00102887F62F3B4 -:2062200001008877E27F62F382008877E27F520862F3C3008877727862F304108877A878E3 -:20624000C87701F1210228462031FEF778FE22E001200871287800F00102087E62F30100B5 -:2062600008762A78520862F3820008762A78920862F3C30008762A78D20800E007E062F3E5 -:206280000410087624212046FCF761FF0BE0032008710520087625212046FCF758FFA07F2F -:2062A00020F08000A07701A900980AF0D2FF022801D000B1FFDF384631E72DE9FF4FF94A63 -:2062C0000D4699B09A4607CA14AB002783E807001998FCF704FF060006D03078262806D0CA -:2062E00008201DB0BDE8F08F43F20200F9E7B07F00F00309B9F1010F03D0B9F1020F07D024 -:2063000008E03DB91B98FEF7D6FD0028E9D101E01B9878BBB07F00F00300012806D0002139 -:20632000199809F0C7FB040003D101E00121F7E7FFDF852D25D007DCD5B1812D1BD0822D02 -:206340001BD0832D08D11AE0862D1CD0882D1CD0892D1CD08A2D1CD00F2020710F281AD069 -:2063600001208DF83400201D0E902079A8B158E10020F2E70FE00120EFE70220EDE7032045 -:20638000EBE70520E9E70620E7E70820E5E70920E3E70A20E1E70720A3E7B9F1010F17D017 -:2063A000D4E91E5080460220019001200090A87898F80210C0F3C000C1F3C00108405FEA4D -:2063C000000B5DD050460CF039FE00286CD12DE0D4E91E85012001900220009021463046A9 -:2063E0001B9AFEF78CFD1B98007800F00101A87861F30100A870F17F61F38200A870F17FF2 -:20640000490861F3C300A870617861F30410A8702078400928706078C0F3400068701B98D4 -:206420008078E870002068712871C0E7DAF80C000CF004FEC0BBDAF81C000CF0FFFD98BB43 -:20644000DAF80C00A060DAF81C00E06098F80100617800F0010041EA4000607098F80210F8 -:20646000C0B2C1F30011891E08406070002084F82000009906F1170002290BD001210AE0B1 -:2064800098F80110607801F00101FD2242EA41010840E2E7002104EB810188610199701C51 -:2064A000022902D0012101E028E0002104EB81018861A87800F00300012849D198F8020071 -:2064C00000F00300012843D1B9F1010F04D12A1D691D1B98FEF733FD297998F804000140E1 -:2064E0008DF82C10687998F8052010408DF8300001432DD050460CF0A1FD08B11020F0E610 -:206500000AF1100004F5DE7104F190020490B9F1020F3CD00090CDE9012100210BAB5A4667 -:206520002046FEF786FD0028E9D104F5E07104F1A802B9F1010F30D004980090CDE90121F4 -:2065400000210CAB5A462046FEF773FD0028D6D16078800740D4A87898F80210C0F38000C1 -:20656000C1F38001084337D0297898F8000014AAB9F1010F17D032F810204B00DA4012F043 -:20658000030718D0012F1ED0022F12D11DE0CDF800A0CDE901210121C0E7CDF800A0CDE9B9 -:2065A00001210121CDE732F811204300DA4002F00307032F07D0BBF1000F0DD0012906D08E -:2065C000042904D008E00227F5E70127F3E7012801D0042800D10427F07F40F001006BF3AB -:2065E0004100F077607881074FF003000CD5A071BBF1000F15D100BF8DF85C0017AA3146E6 -:206600001998FEF7E5FC0CE00221022F18D0012F18D0042F22D00020A071F07F20F00100DD -:20662000F07725213046FCF792FD0DA904F59A700AF0EFFD10B1022800D0FFDF002050E627 -:20664000A171D9E7A1710D2104F124001AF02FF9207840F0020020700420CDE70120A07179 -:20666000DFE72DE9F04387B09046894604460025FCF735FD060006D03078272806D00820CA -:2066800007B0BDE8F08343F20200F9E7B07F00F00300012808D00021204609F00BFA040068 -:2066A00005D103E0680C02000121F5E7FFDFA7795FEA090005D0012821D0B9F1020F26D1BC -:2066C00010E0B8F1000F22D1012F05D0022F05D0032F05D0FFDF2DE00C252BE0012529E0B7 -:2066E000022527E040460CF0A9FCB0B9032F0ED11022414604F121001AF040F81AE0012F90 -:2067000002D0022F03D104E0B8F1000F12D00720B6E740460CF092FC08B11020B0E710219F -:2067200004F121001AF0A1F80621404605F075FFC4F821002078252140F002002070304697 -:20674000FCF705FD2078C10714D020F00100207002208DF8000004F1210002908DF8045037 -:20676000694604F59A700AF054FD022804D018B1FFDF01E084F82050002081E730B587B006 -:206780000D460446FCF7ABFC88B1807F00F0030001280FD00021204609F08CF904000ED0A8 -:2067A00028460CF04BFC38B1102007B030BD43F20200FAE70121EEE72078400701D4082080 -:2067C000F3E7294604F141002022054619F0D6FF207840F01000207001070FD520F0080063 -:2067E000207013208DF80000694604F59A7001950AF00FFD022801D000B1FFDF0020D4E79E -:2068000070B50D460646FCF76AFC18B1017827291FD102E043F2020070BD807F00F00300A1 -:20682000012806D00021304609F044F9040003D101E00121F7E7FFDFA079022809D1607800 -:20684000C00706D02A4621463046FEF7C4FC10B10FE0082070BDB4F864000E280BD204F17C -:20686000660102231022081FFEF70AFB012101704570002070BD112070BD70B5064686B09F -:2068800014460D4608460CF0D9FB18B920460CF0FBFB10B1102006B070BDA6F57F40FF389F -:2068A0000ED03046FCF71BFC38B1417822464B08811C1846FCF79DFD07E043F20200EAE7A6 -:2068C0002046FDF724FC0028E5D11021E01D0CF05FF8E21D29466846FEF765FC102204F146 -:2068E0001700019919F04AFF0020D4E72DE9F041044686B015468846002708460CF0EBFB73 -:2069000018B928460CF0E7FB10B1102006B007E42046FCF7E4FB060003D03078272818D1D7 -:2069200002E043F20200F1E7B07F00F00300012806D00021204609F0BDF8040003D101E057 -:206940000121F7E7FFDF2078400702D56078800701D40820DAE7B07F00F00300012818D053 -:20696000D4E91E01407800B1B5B1487810B1B8F1000F11D0C5B1EA1D6846E168FEF713FCDA -:20698000102205F11700019919F0CCFE30B104270AE0D4E91E10E5E70720B7E71022E91DA1 -:2069A00004F1310019F0EAFEB8F1000F06D0102208F1070104F1210019F0E0FE2078252124 -:2069C00040F0020020703046FCF7C1FB2078C10716D020F00100207002208DF8000004F14D -:2069E00021000290103003908DF80470694604F59A700AF00EFC022804D018B1FFDF01E0DC -:206A000084F82070002081E7F8B515460E460746FCF765FB040004D02078222804D0082030 -:206A2000F8BD43F20200F8BDA07F00F00300022802D043F20500F8BD30460CF0FFFA18B97C -:206A400028460CF0FBFA08B11020F8BD00953288B31C21463846FEF7E2FB112814D000281F -:206A6000F3D1297C4A08E17F62F30001E1772A7C62F34101E177297C890884F82010A17FB6 -:206A800021F08001A177F8BDA17F0907FBD4D6F80200C4F83600D6F80600C4F83A00308854 -:206AA000A0861022294604F1240019F067FE287C4108E07F61F38200E077297C61F3C30053 -:206AC000E077287C800884F82100A07F40F00800A0770020D3E770B59AB00D46064613B17C -:206AE00007201AB070BDFCF7FAFA040007D02078222802D3A07F400604D40820F1E743F28D -:206B00000200EEE7CDB12D208DF80000ADF80460102229460DF1060019F030FE287C41087C -:206B2000E07F61F30000E077297C61F34100E077287C800884F8200004E02E208DF800003B -:206B4000ADF804600BA9684605F018FDA17F21F04001A177C5E770B50D46FCF7C0FA040061 -:206B600005D028460CF090FA20B1102070BD43F2020070BD29462046FEF7CBFA002070BDDE -:206B800005E000BF10F8012B0AB100207047491E89B2F7D20120704718B18178012938D153 -:206BA00001E010207047018842F60112881A914231D018DC42F60102A1EB020091422AD039 -:206BC0000CDC41B3B1F5C05F25D06FF4C050081821D0A0F57060FF381BD11CE001281AD004 -:206BE00002280AD117E0B0F5807F14D008DC012811D002280FD003280DD0FF2809D10AE027 -:206C0000B0F5817F07D0A0F58070033803D0012801D0002070470F2070470B2826D008DCA1 -:206C20001BD2DFE800F01C2025251A25292325271E0011281CD008DC0C2817D00D281DD0EF -:206C40000F2815D0102808D110E0822809D0842810D0852810D0872812D0032070470020F0 -:206C600070470520704743F203007047072070470F20704704207047062070470C20704733 -:206C800043F20200704708280DD2DFE800F00406040C0C080A0A0020704711207047072018 -:206CA0007047082070470320704738B50C46050041D06946FFF7D3F9002819D19DF80010E7 -:206CC000607861F3020060706946681CFFF7C7F900280DD19DF80010607861F3C500607061 -:206CE000A978C1F34101012903D0022905D0072038BD217821F0200102E0217841F02001CC -:206D00002170410704D0A978C90861F386106070607810F0380F07D0A978090961F3C710C6 -:206D2000607010F0380F02D16078400603D5207840F040002070002038BD70B50446002037 -:206D4000088015466068FFF7B0FF002816D12089A189884211D860688078C0070AD0B1F547 -:206D6000007F0AD840F20120B1FBF0F200FB1210288007E0B1F5FF7F01D90C2070BD01F2DB -:206D800001212980002070BD10B50478137864F3000313700478640864F3410313700478B0 -:206DA000A40864F3820313700478E40864F3C30313700478240964F304131370047864093D -:206DC00064F3451313700078800960F38613137031B10878C10701D1800701D5012000E0B7 -:206DE000002060F3C713137010BD4278530702D002F0070306E012F0380F02D0C2F3C20399 -:206E000000E001234A7863F302024A70407810F0380F02D0C0F3C20005E0430702D000F061 -:206E2000070000E0012060F3C5024A7070472DE9F04F95B00D00804615D0B8F1000F16D0CF -:206E40001221284619F011FD4FF6FF7B05AA0121584605F0DDF90024264637464FF42059B8 -:206E60006FF4205A75E0102015B0BDE8F08F0720FAE700BF9DF81E0001280AD1BDF81C0078 -:206E800048450BD010EB0A000AD001280CD002280CD0042C0ED0052C0FD10DE0012400E08F -:206EA0000224BDF81A6008E0032406E00424BDF81A7002E0052400E00624BDF81A104145A7 -:206EC00047D12C74BEB34FF0000810AA4FF0070ACDE90282CDE900A80DF13C091023CDF865 -:206EE000109042463146584605F045FA08BBBDF83C002A46C0B210A90AF04CFAC8B9AE81E2 -:206F0000CFB1CDE900A80DF1080C0AAE40468CE84102132300223946584605F02CFA40B903 -:206F2000BDF83C00F11CC01EC0B22A1D0AF032FA10B1032098E70AE0BDF82900E881062CD0 -:206F400005D19DF81E00A872BDF81C00288100208AE705A805F068F900288BD0FFF75DFEAC -:206F600082E72DE9F0471C46DDE90978DDF8209015460E00824600D1FFDF0CB1208818B11F -:206F8000D5B11120BDE8F087022D01D0012100E0002106F1140004F013F8A8F80000024609 -:206FA0003B462946504605F000FCC9F8000008B9A41C3C600020E5E71320E3E7F8B50D4693 -:206FC00006461446DDE90710069ACAB10346009104222146304605F0F7FC5CB1022C08D13A -:206FE000A87CC00705D02146304605F0BDFE0020A874F8BD21463046BDE8F84005F0B4BE32 -:207000001880F8BD2DE9FF4791461A881C468A4680460AB303AB494605F0C7FB05001BD0B5 -:207020004046A61C278808F062FE3246072629463B46009608F0E8FA208803990095CDE96D -:20704000011023464A4651464046FFF7B7FF00202080012004B095E70020FBE72DE9F047FD -:207060008CB00D46DDE9149882461C4617460226142103A819F01BFC012002218DF8101077 -:207080008DF80C008DF81180ADF8147064B1A178C90709D08DF81600E088ADF81A00A0885F -:2070A000ADF81800A06807900AAA09A908A88DE807003246294650466B68FFF752FF002823 -:2070C0000ED1DDE9080105F114028DE807000AAB4A4603A9504604F037FB18B1FFF7D3FD3E -:2070E0000CB04FE7DDE90801BDF828208DE807003246294650466B68FFF760FF0020EFE7BB -:20710000F0B58BB000240646069407940727089405A80994019400970294CDE903400D46C8 -:2071200010232246304605F026F978B90AA806A9019400970294CDE90310BDF814300022F2 -:207140002946304604F0EEFE002801D0FFF765FD0BB0F0BD04F080BD2DE9FC410C46804615 -:20716000002602F0D2F9054620780D287ED2DFE800F0B2070BA918B33C5C6C8FA5949A006F -:20718000404602F0F1F9A7E00421404608F092FC070000D1FFDF07F11401404603F0A4FEF7 -:2071A0006AE00421404608F085FC070000D1FFDFE088ADF800000020B8819DF800000107A8 -:2071C00004D5C00602D5A088B88105E09DF80100400609D5A088F88105B9FFDF2246294625 -:2071E000404601F017FD022676E0A088694605F0A5F900B1FFDF9DF8020001280BD1BDF83C -:20720000000042F6011188420BD0A0F52451023907D0491E05D0E079000600D5022635BBDB -:2072200001E0042658E0FFDF27E0E079000609D50421404608F03EFC060000D1FFDFA0882F -:20724000F08102269DB9FFDF17E00421404608F031FC070000D1FFDF07F1140004F033FDB4 -:2072600090F0010F05D1E079000601E033E004E032D50226A7F810802DB1224629464046D8 -:2072800001F0C8FC28E013214046FDF7CEFA23E00226002DF1D1FFDFEFE70226012140461D -:2072A00002F0AEF918E0606800902089ADF8040001226946404602F0C4F90DE0002DDCD1C5 -:2072C000FFDFDAE7022600214046FBF790F8002DD3D1FFDFD1E7FFDF3046BDE8FC813EB5F6 -:2072E0000C0009D001466B4601AA002005F0C5F820B1FFF792FC3EBD10203EBD00202080F9 -:20730000A0709DF8050002A900F00700FEF7C3FE50B99DF8080020709DF8050002A9C0F33D -:20732000C200FEF7B8FE08B103203EBD9DF8080060709DF80500C109A07861F30410A070A8 -:207340009DF80510890961F3C300A0709DF80410890601D5022100E0012161F342009DF86C -:20736000001061F30000A07000203EBD70B5144606460D4651EA040005D075B108460BF0DD -:20738000A1FE78B901E0072070BD2946304605F0D5F810B1BDE870403FE454B120460BF0A2 -:2073A00091FE08B1102070BD21463046BDE8704095E7002070BD2DE9FE4F0C469046054657 -:2073C000002701780822007A3E46B2EB111F7DD104F10A010091891E02910C31821E4FF0E3 -:2073E000020B4FF0010A0191092A70D2DFE802F0F5F4056F252579B8F6006888042108F09B -:2074000059FB060000D1FFDFB08910B152270726EBE051271026002C7ED06888A08084F844 -:2074200006A0A88900220099FFF7A0FF002874D1A8892081288AE081FDE0B5F81290072878 -:2074400025D1E87B000622D5512709F1140086B2002CE1D0A88900220099FFF787FF0028AB -:207460007CD16888A08084F806B0A889208184F80EA0288A2082A4F81290A88A009068883D -:207480004B46A969DDF8042001F0A1FBD3E0502709F1120086B2002C3ED0A889002202992D -:2074A000FFF764FF002859D16888A080A889E080287A072813D002202073288AE081E87BA1 -:2074C000C0096073A4F81090A88A01E0B0E0ADE0009068884B4604F11202A969D4E701209C -:2074E000EAE76888042108F0E5FAB5F812A05FEA000900D1FFDF09F1140004F0E4FB90F00E -:20750000010F02D1E87B000627D50AF11400512786B2002C7FD001E072E01FE06888A080A7 -:20752000A88900220099FFF721FF002816D184F806B0A88920810420A073288A2082A4F80F -:2075400012A0A88A009068885346A969019A01F03EFBA989A9F80E106DE00320BDE8FE8FC4 -:207560006888FBF7BCFD82466888042108F0A2FA8146BAF1000F00D1FFDFB9F1000F00D145 -:20758000FFDFB9F81010A1F57F40FF3802D05127142601E05027122694B36888A080502FC6 -:2075A00006D084F806B0287B029901F020FB42E0287BA11D01F01BFB00219AF82300CDE963 -:2075C00000010B46B9F80E2068884946FFF746FD0028C3D12FE001E013E01FE0FB49A889AF -:2075E000C988814205D1542706264CB16888A08021E053270CE06888A080A889E0801AE0EB -:2076000009E06888042108F055FA00B9FFDF55270826002CEFD1A8F8006011E0562707265D -:20762000002CF8D06888A080002012E0FFDF02E0012807D0FFDFA8F800600CB1278066804C -:2076400000208BE757270726002CE4D06888A080687AA071EFE7401D20F00300042202EBB1 -:20766000400201FB00207047D84B00221A7008B1D74A106007F0C7BB70B50C46064686B06A -:2076800015465C21204619F012F905B9FFDFA878E074AA782988204601F0D2FA0020A08151 -:2076A000E0814FF6FF7020822A8804F11401304603F0FFFB6A460121304604F0A9FD19E019 -:2076C0009DF80300000715D5BDF806103046FFF717FD9DF80300BDF8061040F010008DF8AE -:2076E0000300BDF80300ADF81400FF233046059A04F0EFFE684604F097FD0028E0D006B03A -:2077000070BD70B5064601F114000C46054603F007FC0146E27C204601F0BEFA2946304699 -:20772000BDE8704003F0E7BB70B50546042108F0C1F9040000D1FFDF04F114012846BDE848 -:20774000704003F0D1BB2DE9F0418CB00C4680460226FBF7C4FC050014D02878222829D3B6 -:207760000CB1A08898B101208DF8180003208DF81C0000208DF81D005CB1A088ADF8240099 -:20778000206808E043F202000CB0BDE8F0810920FAE7ADF8240008900421404608F08AF9DF -:2077A000040000D1FFDF04F11400074603F0CFFBC00601D40820E7E705AA04A903A88DE8F6 -:2077C00007003246214640466368FFF7CAFB00B1FFDFDDE903018DE8830095F8232005ABE6 -:2077E00006A9404603F0B0FF10B1FFF74CFACBE7BDF81420DDE903018DE8070032462146F5 -:2078000040466368FFF7DAFB4FF6FF7020820020BAE72DE9F047B2F80290824688B0154651 -:2078200088464846FBF75BFC06460421484608F041F904460020059002270690ADF81C00F3 -:2078400006B9FFDF04B9FFDF3946484605F0A2FA60B907AA06A905A88DE807003A462146C9 -:2078600048466368FFF77DFB00B1FFDFDDE9051204F11400CDF80080CDE9032007ABCDE946 -:20788000013196F82320514648466B6803F0A8FB06000AD0022E04D0032E16D0042E00D05A -:2078A000FFDF08B03046BDE8F087BDF81C000028F7D0DDE905120091CDE901203A462146B4 -:2078C00048466368FFF77AFBEBE7687840F008006870E6E72DE9F04F9BB004464FF0000824 -:2078E0003A48ADF85480ADF83080ADF85080A0F80480ADF81480ADF81880ADF82080ADF847 -:207900001C80007816460D464746012809D0022807D0032805D0042803D008201BB0BDE87D -:20792000F08F20460BF08AFBD0BB28460BF086FBB0BB60680BF0CFFB90BB606848B1608980 -:207940002189884202D8B1F5007F01D90C20E5E780460BAA06A92846FFF7EFF90028DDD196 -:2079600068688078C0F34100022808D19DF8190010F0380F03D028690BF0A4FB80B905A96E -:207980002069FFF792F90028C8D1206950B1607880079DF8150000F0380002D5F0B301E006 -:2079A00011E0D8BB9DF81400800613D59DF8150010F0380F03D060680BF084FB18B960688D -:2079C0000BF089FB30B11020A8E70000100300201400002007A96069FFF767F900289DD1BC -:2079E000606940B19DF81D0000F0070101293BD110F0380F38D008A9A069FFF756F9002877 -:207A00008CD19DF81C0080062ED49DF8200080062AD4A06950B19DF8210000E024E000F003 -:207A20000701012920D110F0380F1DD0E06818B10078C8B11C2817D20EAA611C2046FFF72F -:207A4000A3F90120B94660F30F27BA4607468DF84E0042F60300ADF84C000DF13B0217A99A -:207A6000286809F0B6FC08B1072057E79DF85C0016A9CDF80090C01CCDE9019100F0FF0B8A -:207A800000230BF20122514613A804F005FBE8BBBDF858000990FE482A8929690092CDE941 -:207AA00001106B89BDF82C202868069904F0F4FA01007DD120784FF0020AC10601D480065B -:207AC0002BD5ADF80C90606950B907A906A8FFF78CF99DF81D0020F00700401C8DF81D00F3 -:207AE0009DF81C008DF84E7040F0C8008DF81C0042F60210ADF84C000CA903AACDF800A0F7 -:207B0000CDE90121002340F2032200E01FE013A8079904F0C1FA01004AD1DD484D46001F37 -:207B20005B468088ADF839000EA8CDE90290CDF80490CDF810904FF007090022CDF800903C -:207B4000BDF858104FF6FF7004F0ECF910B1FFF764F8E3E69DF83800000625D52946012042 -:207B600060F30F218DF84E704FF42450ADF84C00ADF8105062789DF81000002362F300009B -:207B80008DF810006278CDF800A0520862F341008DF8100004AACDE9012540F2032213A8F0 -:207BA00004F07AFA010003D1606888B3206900E087E098B905A906A8FFF717F960788007A3 -:207BC00006D49DF8150020F038008DF8150005E09DF8140040F040008DF814008DF84E7065 -:207BE00042F60110ADF84C00208940F20121B0FBF1F201FB1202606814ABCDF80080CDE92E -:207C00000103002313A8059904F046FA010058D12078C00729D0ADF80C50A06950B908A96A -:207C200006A8FFF7E2F89DF8210020F00700401C8DF821009DF820008DF84E7040F040008F -:207C40008DF8200042F60310ADF84C0015A903AACDF800A0CDE90121002340F2032213A866 -:207C6000089904F019FA01002BD1E06868B32946012060F30F218DF84E7042F60410ADF8B5 -:207C80004C00E068002302788DF8602040788DF86100E06818AA4088ADF86200E068007976 -:207CA0008DF86400E068C088ADF86500CDF80090CDE901254FF4027213A804F0EDF90100C3 -:207CC00003D0099801F011F828E671480321001F017056B180883080BDF850007080BDF852 -:207CE0003000B080BDF85400F080002016E670B501258AB016460B46012802D0022816D151 -:207D000004E08DF80E504FF4205003E08DF80E5042F60100ADF80C0063B10024601C60F332 -:207D20000F2404AA08A9184609F053FB20B107200AB070BD1020FBE704A99DF820205448FD -:207D4000CDE90021801E02900023214603A802F2012204F0A1F910B1FEF75FFFE8E74C48CB -:207D6000001F0EB14188318005700020E0E7F0B593B0074601268DF83E6041F60100ADF8F3 -:207D80003C0012AA0FA93046FFF7B1FF002848D13F4C0025241FE7B31C2102A818F087FDD6 -:207DA0009DF808008DF83E6040F020008DF8080042F60520ADF83C000E959DF83A001195D0 -:207DC00020F00600801C8DF83A009DF838006A4620F0FF008DF838009DF8390009A920F059 -:207DE000FF008DF839000420ADF82C00ADF830000EA80A9011A80D900FA80990ADF82E50E3 -:207E000002A8FFF767FD00280BD1BDF80000E08000E008E0BDF804002081401C6081257051 -:207E2000002013B0F0BDE5802581BDF84800F4E72DE9F74F1649A0B00024091F17940A784B -:207E4000A146012A04D0022A02D0082023B066E54A88824201D00620F8E721988A4682423F -:207E600001D10720F2E701202146ADF848004FF6FF788DF86E0042F6020B60F30F21ADF89F -:207E80004A80ADF86CB006918DF8724002E00000140300201CA9ADF870401391ADF850803D -:207EA00012A804F0E5F900252E462F460DAB072212A9404604F0DFF978B182285DD195B3F1 -:207EC0008EB3ADF86450ADF866609DF85E008DF8144019AC012864D06BE09DF83A001FB3C3 -:207EE000012859D1BDF8381059451FD118A809A901940294CDE9031007200090BDF836108C -:207F000010230022404604F036FAB0BBBDF86000042801D006284AD1BDF824102198814237 -:207F20003AD10F2092E73AE0012835D1BDF83800B0F5205F03D042F6010188422CD1BAF8AE -:207F40000200BDF83610884201D1012700E0002705B19EB1219881421ED118A809AA0194E1 -:207F60000294CDE90320072000900D4610230022404604F000FA00B902E02DE04E460BE098 -:207F8000BDF86000022801D0102810D1C0B217AA09A909F0FFF950B9BDF8369086E70520CC -:207FA00054E705A917A8221D09F013FA08B103204CE79DF814000023001DC2B28DF81420AF -:207FC00022980092CDE901401BA8069904F064F810B902228AF80020FEF71FFE36E710B529 -:207FE0000B46401E88B084B205AA00211846FEF7CBFE00200DF1080C06AA05A901908CE8E3 -:208000000700072000900123002221464FF6FF7003F088FF0446BDF81800012800D0FFDFD9 -:208020002046FEF7FAFD08B010BDF0B5FF4F044687B038780E46032804D0042802D00820CC -:2080400007B0F0BD04AA03A92046FEF776FE0500F6D160688078C0F3410002280AD19DF879 -:208060000D0010F0380F05D020690BF02BF808B11020E5E7208905AA21698DE80700638931 -:20808000BDF810202068039904F006F810B1FEF7C4FDD5E716B1BDF81400308004203870A6 -:2080A0002846CDE7F8B50C0006460CD001464FF6FF7500236A46284604F0DFF928B100BF18 -:2080C000FEF7ABFDF8BD1020F8BD69462046FEF7ECFD0028F8D1A078314600F00103284694 -:2080E000009A04F0F6F9EBE730B587B0144600220DF1080C05AD01928CE82C0007220092E7 -:208100000A46014623884FF6FF7003F00BFFBDF814102180FEF781FD07B030BD70B50D4663 -:20812000042107F0C7FC040000D1FFDF294604F11400BDE8704002F003BF70B50D4604218F -:2081400007F0B8FC040000D1FFDF294604F11400BDE8704002F017BF70B50D46042107F098 -:20816000A9FC040000D1FFDF294604F11400BDE8704002F02FBF70B50546042107F09AFCD8 -:20818000040000D1FFDF214628462368BDE870400122FEF737BF2DE9F0478246042107F038 -:2081A00089FC040000D1FFDF04F1140002F0B8FE401D20F0030626E0011D00880022431837 -:2081C00021465046FEF71EFF002820D0E07CA56870431FFA80F82888B7B2814610FA86F06B -:2081E00080B22880404502D3A0EB080028806888B84200D2FFDF09EB0701414500D9FFDF3D -:208200006888C01B6880A06841880029D4D1BDE8F08770B50546042107F04CFC040000D147 -:20822000FFDF214628466368BDE870400222FEF7E9BE70B50E46054601F067F9040000D1C1 -:20824000FFDF0120207266726580207820F00F00001D20F0F00040302070BDE8704001F0B6 -:2082600057B910B50446012900D0FFDF2046BDE810400121FAF7BBB82DE9F34F9BB04FF044 -:20828000000B0C00ADF81CB05E461BD0E06830B1A068B8B10188ADF81C10A0F800B01B98D8 -:2082A000FAF71DFF5FEA000943F2020769D099F80000222863D304211B9807F0FBFB05000D -:2082C00005D103E010201DB0BDE8F08FFFDF05F11400109002F024FE401D20F00308A07898 -:2082E000012803D0022801D00720ECE7208878B1401C81B20BAA1B9803F08AFF0BA803F0A3 -:2083000093FF9DF836204FF45051012A0DD102E043F20300D7E7BDF83420A2F52453023BC7 -:2083200003D1822801D0A0B901E00846CBE7E068B0B1CDE902B0072007AA0090CDF804B0C2 -:208340000492A2882188BDF81C301B9803F0EAFD10B1FEF762FCB6E7A168BDF81C00088013 -:208360009DF82F00C00602D543F20140ABE70F9838B1A1780078012905D080072AD40820C7 -:20838000A1E738469FE7C007F9D00020039002208DF84C00A868EA7C418802FB08F28A4219 -:2083A0001ED9031D0A93008896B247181FFA88FAB74200D3BF1B01EB0A00B04200D9FFDFFA -:2083C00007EB0A00B04200D9FFDF0A98C619A6F800B005E00120039003208DF84C002E6806 -:2083E0009DF8300010F0380F00D1FFDF9DF830000F49C0F3C200084410F8011C99F823000B -:20840000814201D90F205EE72088ADF8500008AA06A905A88DE8070033462946039A1B98EC -:20842000FEF79FFD002896D104E0000010030020FA2F0000DDE90501109A8DE8070008AB37 -:20844000072213A91B9803F07FF910B1FEF71BFC39E7BDF82020DDE905018DE80700334676 -:208460002946039A1B98FEF7A9FD0598D0B9A078012817D1E87CAC6800FB08F086B2218807 -:2084800060881FFA88F70D18B54200D3AD1B3844B04200D9FFDFE819B04200D9FFDF6088EE -:2084A0003844608000200EE770B5064615460C460846FEF771FB002805D12A462146304633 -:2084C000BDE8704013E470BDB2E470B51E4614460D0009D044B1616831B138B1FE49498823 -:2084E000814203D0072070BD102070BD2068FEF753FB0028F9D1324621462846BDE87040D6 -:20850000FFF7E8B970B515460C0006D038B1F2498988814203D0072070BD102070BD20685E -:20852000FEF73AFB0028F9D129462046BDE870407BE570B5064686B00D46144610460AF0F1 -:20854000A3FDD0BB60680AF0C6FDB0BBA6F57F40FF3803D03046FAF7C2FD80B12846694628 -:20856000FEF765FC00280CD19DF810100F2008293CD2DFE801F008060606060A0A0843F254 -:20858000020006B070BD0320FBE79DF80210012908D1BDF80010B1F5C05FF2D06FF4C05286 -:2085A000D142EED09DF8061001290DD1BDF80410A1F52851062907D200E028E0DFE801F0B7 -:2085C000030304030303DCE79DF80A1001290ED1BDF80810B1F5245FD3D0A1F5245102392E -:2085E000CFD00129CDD0022901D1CAE7FFDF606878B9002305AA2946304603F03EFF10B1E8 -:20860000FEF70BFBBDE79DF81400800601D41020B7E76188224628466368FFF765FDB0E770 -:208620002DE9F043814687B08846144610460AF02BFD18B1102007B0BDE8F083002306AAB8 -:208640004146484603F019FF18B100BFFEF7E5FAF1E79DF81800C00602D543F20140EAE735 -:208660000025072705A8019500970295CDE9035062884FF6FF734146484603F07CFE060004 -:2086800013D160680AF000FD60B960680195CDE9025000970495238862884146484603F0EB -:2086A0006AFE0646BDF8140020803046CEE739B1894B0A881B899A4202D843F203007047D9 -:2086C000DAE510B586B0844C0423ADF81430E38843B124898C4201D2914205D943F203006A -:2086E00006B010BD0620FBE7ADF81010002100910191ADF8003002218DF8021005A9029116 -:2087000004A90391ADF812206946FFF7B5FDE7E72DE9FC4781460F4608460AF08FFC88BB91 -:208720004846FAF7DCFC5FEA00080AD098F80000222829D30421484607F0BCF9060005D1A6 -:2087400003E043F20200BDE8FC87FFDF06F1140002F0FDFB05463878012803D0022804D00F -:208760000720F0E7A8070FD502E015F0340F0BD0B8793C1DC00709D0E08838B1A0680AF0E6 -:208780005DFC18B11020DEE70820DCE73A782088002128B3A0F201130721112B18D20CD2AF -:2087A000DFE803F00B090D0B1D0B121D100B0B1D1D1D1D0B1D00022A11D10846C3E7012A89 -:2087C000FBD00CE0EA0600E0AA06002AF5DA06E0A0F5C0721F2A02D97D3A022AEDD8C1B27D -:2087E00098F82300CDE90001F289234631464846FEF734FCA7E72DE9F04F8BB01F46154623 -:208800000C4683460026FAF76AFC28B10078222805D208200BB057E543F20200FAE7B80857 -:2088200001D00720F6E7032F00D100274FF6FF79CCB1022D71D320460AF04DFC30B904EB0B -:208840000508A8F101000AF046FC08B11020E1E7AD1EAAB22146484603F009FF38F8021C1F -:2088600088425AD1ADB21C49B80702D50889401C00E001201FFA80F8F80701D00F8900E0E2 -:208880004F4605AA4146584603F0C2FC4FF0070A4FF00009FCB1204608E0408810283CD817 -:2088A000361D304486B2AE4237D2A01902884245F3D352E09DF8170002074ED57CB304EB08 -:2088C0000608361DB8F80230B6B2102B25D89A19AA4222D802E040E010030020B8F8002017 -:2088E00091421AD1C0061BD5CDE900A90DF1080C0AAAA11948468CE80700B8F8001000223A -:20890000584603F00FFB10B1FEF787F982E7B8F80200BDF82810884202D00B207AE704E072 -:20892000B8F80200304486B206E0C00604D55846FEF7E6FB00288AD19DF81700BDF81A10D2 -:2089400020F010008DF81700BDF81700ADF80000FF235846009A03F0BCFD05A803F064FCE4 -:2089600018B9BDF81A10B942A4D90421584607F0A1F8040000D1FFDFA2895AB1CDE900A934 -:208980004D46002321465846FEF768FB0028BDD1A5813FE700203DE72DE9FF4F8BB01E467B -:2089A00017000D464FF0000412D0B00802D007200FB089E4032E00D100265DB108460AF0CD -:2089C00081FB28B93888691E08440AF07BFB08B11020EDE7CA4AB00701D5518900E00121FD -:2089E000F0074FF6FF7802D05089401E00E0404686B206AA0B9803F00BFC4FF000094FF049 -:208A0000070B0DF1140A38E09DF81B00000734D5CDF80490CDF800B0CDF80890CDE9039AD2 -:208A2000434600220B9803F0A6FC60BB05B3BDF814103A8821442819091D8A4230D3BDF895 -:208A40001E2020F8022BBDF8142020F8022BCDE900B9CDE90290CDF810A0BDF81E10BDF8A1 -:208A6000143000220B9803F086FC08B103209FE7BDF814002044001D84B206A803F0D4FB26 -:208A800020B1822806D0FEF7C8F891E7BDF81E10B142B9D934B17DB13888A11C884203D2C1 -:208AA0000C2085E7052083E722462946404603F0DEFD014628190180A41C3C80002077E761 -:208AC00010B504460AF0E0FA08B1102010BD8C4840892080002010BD2DE9F0438DB00D46FA -:208AE00081464FF00208142106A817F0E0FE01268DF81C6000208DF81D008DF81860ADF812 -:208B000020504846FAF7EBFA48B10078222812D30421484606F0CEFF040005D103E043F279 -:208B200002000DB088E5FFDF04F11400074602F00EFA400601D40820F3E705AA04A903A8B7 -:208B40008DE807004246214648466368FEF709FA00B1FFDFDDE903018DE8830005AB07222F -:208B600006A9484602F0F0FD10B1FEF78CF8D8E7A674BDF81420DDE903018DE8070042460F -:208B8000214648466368FEF719FA29464846F9F71FFC0BA9384602F0C9F900B1FFDFBDF8DB -:208BA0002C40172C01D2172000E02046A84201D92C4602E0172C00D2172421464846FFF763 -:208BC000BCFA21464846F9F737F90020A9E7F8B51C4615460E46069F07F077F82346FF1DCC -:208BE000BCB231462A46009406F0D5FCF8BD70B50C4605460E21204617F037FE00202080BD -:208C00002DB1012D01D0FFDF70BD062000E00520A07170BD10B548800878144620F00F007D -:208C2000001D20F0F00080300B4608701422214603F1080017F0E7FDBDE8104000F068BC11 -:208C40002DE9F0472F4F491D064621F0030191460C46386806F0EEF8050000D1FFDF4FF0EA -:208C600000083560A5F800802146386806F0E2F8050000D1FFDF7560A5F8008004FB09F1C4 -:208C8000091D386806F0D6F8040000D1FFDFB460C4F80080BDE8F0872DE9F041491D21F06D -:208CA0000304184D1746064601682246286806F0EAF822467168286806F0E5F87C43221DC4 -:208CC000B168286806F0DFF8042006F09DFE0446042006F0A1FE201A012804D12868BDE8F9 -:208CE000F04106F098B8BDE8F08110B50C4603F05CFA00B1FFDF2046BDE81040FDF78DBF5D -:208D00001003002014000020F0B59BB0054659208DF80000281DADF80400ADF806101E46A6 -:208D200017460BA9684603F029FC00B1FFDFBDF83040032C01D2204600E00320C1B228465C -:208D400000F07EFF3870022C00D30224E1B2284600F076FF401C30701BB0F0BD2DE9F04FA8 -:208D60000C00FC499DB08246D1E90201FA4ECDE90C010AF10300717A327A1144CDB220F04C -:208D800003010091377E07F1010704D1F8B208F0A7FA00B1FFDF00982A4600EB0710C01CFC -:208DA00020F00301F7694FF00009009134B981F80090B8B203F081F800B1FFDF009823460A -:208DC00038440090B07A317A2A460844C1B2684600F0FEFE0098C01C20F003000090737AE5 -:208DE000327AB17A04B1002006F056FD0099084400902146684600F02EFF00273D46B34634 -:208E000096F801800CE0284600F0C5FE064681788088F9F7ABF871786D1C00FB0177EDB2D2 -:208E20004545F0D10098C01C20F00300009004B100203946F9F7A1F8009900270844009057 -:208E40003D469BF801800CE0284600F0A4FE0646C1788088FEF7FFFB71786D1C00FB01772E -:208E6000EDB24545F0D10098C01C20F00300009004B100203946FEF7F7FB00990844C01DF4 -:208E800020F007000090ECBBB54AB4491160111D401E086001223C21B24806F08EFCFAF738 -:208EA0007EF8B1484178806804F00FF9AE4801240C300178012915D144218DF80410C07890 -:208EC0008DF8080010B1012803D004E08DF8084001E08DF8089001A805F047FE10B10EA83F -:208EE00004F0B3F900211E22084601F0F7F9FBF7AFF803F018FD98480CAA00210C30F8F7BF -:208F000029FA00E01DE000B1FFDF9BF81900FEF72EFF00B1FFDF90484FF4B871443017F0A6 -:208F2000C6FC8D480221443080F8694180F86A1180F86B1180F86C91062180F86D11052142 -:208F4000017100991DB0A1EB0A00BDE8F08F70B5814D06464435287805EB4014E878083447 -:208F6000A0B9A81990F86801002810D0A8780B2800D3FFDF207820F0FF002070607866F372 -:208F8000020020F0080060700120E870204670BD2DE9F04105460C4600270078052190465C -:208FA0003E46B1EB101F00D0FFDF287A50B101280ED0FFDFA8F800600CB1278066800020C2 -:208FC000BDE8F0810127092674B16888A08008E00227142644B16888A0802869E060A88A9C -:208FE0002082287B2072E5E7A8F80060E7E710B55D4C6068C11D21F00701814200D0FFDF62 -:209000005548012100220170427001720323437281720273052282821F22C282417353A23D -:2090200002610A22027641764FF4B061C1616168416010BD30B54C4C1568636808339D42E6 -:2090400002D20420136030BD434B5D785A6802EBC502107051700320D080172090800120C3 -:20906000D07090705878401C5870606808306060002030BD70B5064637480024457807E037 -:20908000204600F088FD0178B14204D0641CE4B2AC42F5D1002070BDF7B5064608780C46D4 -:2090A00050B1FFF7E7FF0546202E07D0232E17D0212E18D0222E16D00720FEBD00F076FD79 -:2090C0000DB1697800E00021401A81B2A0780144FF29F1D80028EFD0A088022803D2EBE735 -:2090E00060881728E8D365B9207802AA0121FFF7A1FF0028E1D12078FFF7BCFF050000D17B -:20910000FFDF202E08D0212E0ED0222E0FD0232E07D0FFDF0020FEBDA0786870A088E8808E -:20912000F8E76088A880F5E7A078A870F2E7A078E870EFE700B59BB055218DF80010007892 -:209140000BA900F001008DF80400684603F016FA1BB000BD740C02002804002000000020BA -:2091600000060240DC0500201C0000206E5246357800000000B501789BB001F001018DF8C6 -:209180000410417801F001018DF805100178C1F340018DF806104178C1F340018DF8071022 -:2091A000017889088DF80810417889088DF8091081788DF80A10C1788DF80B1000798DF8B1 -:2091C0000C004F208DF800000BA9684603F0D6F9BEE700B59BB058218DF80010ADF804000F -:2091E0000BA9684603F0CAF900B1FFDF9DF8300000F00100ACE72DE9F84FDFF8F483FD4C8B -:2092000000271BE0022000F066FD0120FFF79FFE0546F94806F0FAFA686000B9FFDF68685E -:2092200003F0F9F9A0B12846FAF7C7F9284600F058FD18B9F048696806F0F1FA94F8690175 -:209240000028DFD1022006F0DFFB064600259AE0E948696806F0E3FAF4E7B8F80210404661 -:20926000491C89B2A8F80210B14201D3002141800221B8F8020006F01DFC00285DD0B8F80A -:209280000200FFF7A6FF78B1B8F8020006F02FFD5FEA000900D1FFDF484605F0E2FF18B106 -:2092A000B8F8020003F04FFDB8F8020006F00DFD5FEA000900D1FFDF484605F0CBFFE0BB22 -:2092C0000321B8F8020006F0F5FB5FEA000B47D1FFDF45E0DBF8040010B10078FF2848D014 -:2092E000042000F0F8FC0320FFF731FE8246484606F0E2F8CAF8040000B9FFDFDAF80400C5 -:2093000006F0BCF9002100900170B8F802105046AAF8021003F094FB484606F0B1F900B90B -:20932000FFDF504600F0DDFC18B99AF80100000704D50099CBF8041012E022E0DBF8040071 -:2093400038B10178491C11F0FF01017008D1FFDF06E000221146484600F01BFC00B9FFDF92 -:2093600094F86B0128B1B8F8020003F044FB0028B0D194F8690120B1484606F0F7F900B1A3 -:2093800001276D1CEDB2B54204D294F86B0100287FF463AF002F7FF433AFBDE8F84F052076 -:2093A00000F099BC10B5924CA0600868E060AFF2B91000F006FF607010BD8E4800214438A6 -:2093C00001708B4801708D494160704730B505464FF080500C46D0F8A4109BB0491C05D117 -:2093E000D0F8A810C9430904090C08D050F8A01F01F0010129704168216080680EE02B2009 -:209400008DF800000BA9684603F0B8F800B1FFDF012028700C982060BDF83400A0802878AD -:20942000002803D0607940F0C00060711BB030BDF0B54FF080540746D4F880009BB00D46F0 -:209440002B26401C0BD1D4F88400401C07D1D4F88800401C03D1D4F88C00401C0BD0D4F820 -:2094600080003860D4F884007860D4F88800B860D4F88C0016E08DF83C6069460FA803F078 -:209480007DF800B1FFDF01983860029878608DF83C6069460FA803F071F800B1FFDF01981A -:2094A000B8600298F860D4F89000401C0BD1D4F89400401C07D1D4F89800401C03D1D4F81A -:2094C0009C00401C08D054F8900F286060686860A068A860E06816E08DF800600BA9684624 -:2094E00003F04CF800B1FFDF0C9828600D9868608DF800600BA9684603F040F800B1FFDF0C -:209500000C98A8600D98E86026E43A4800791EE570B5384CE07828B3207804EB4010407A3D -:2095200000F00700204490F8680100B9FFDF2078002504EB4010407A00F00700011991F8F8 -:209540006801401E81F868012078401CC0B220700B2800D12570A078401CA07009F007F956 -:20956000E57070BDFFDF70BD3EB50546032106F0A1FA0446284606F0A8FB054604B9FFDF34 -:20958000606818B10078FF2800D1FFDF01AA6946284600F0FEFA60B9FFDF0AE0002202A98E -:2095A000284600F0F6FA00B9FFDF9DF8080000B1FFDF9DF80000411E8DF80010EED2606889 -:2095C0000199884201D1002060600A4C94F86B01022800D3FFDF94F86B0118B9044840787F -:2095E00000F00EFE94F86B01401C84F86B013EBD1C0000206C040020DC0500201013002028 -:2096000070B50546A0F57F400C46FF3800D1FFDF012C01D0FFDF70BDFFF777FF040000D104 -:20962000FFDF207820F00F00401D20F0F0005030207065800020207201202073BDE8704088 -:2096400066E770B515460C460646FFF75EFF90B1017821F00F01491D21F0F0015031017017 -:2096600046800121017221680161A18881820573BDE870404CE73046BDE870401321FBF787 -:20968000D4B830B59DB0FFF7F5FC040000D1FFDFA588E1880BAB0CAA2846FFF735FB542068 -:2096A0008DF800009DF830008DF804009DF82C002D1D8DF80500ADF80650ADF80850E088E2 -:2096C000ADF80A000DA9684602F058FF002800D0FFDF1DB030BD2DE9F84FF94E05464FF070 -:2096E000000A307810B10820BDE8F88F284609F0CBFC08B11020F7E7F24C207808B9FFF721 -:2097000076FC617A207A0844C4B200F04FFAA04208D2201AC1B22A460020FFF78BFC5FEAA8 -:20972000000AE1D1E6484FF00009C84641684F46C91C21F003014160E248CDF800904E46FD -:209740004C4690F801B00EE0204600F024FA4178827809F10109884412FB0177C07810FB91 -:209760000166641CE4B25C45EED10098D54C00EB890000EBC80000EB8700217A00EB8600AE -:2097800000EBC100617ADFF8388300EBC100A17A00EBC100D8F80410471801213846FFF764 -:2097A000DDFA064629683844884202D8B6F5803F13D328600020FFF75DFC60B1D8F8041099 -:2097C00045460839814200D0FFDF6078401E6070686808386860042086E700213846FFF748 -:2097E000BDFA0446A64200D0FFDFE119C8F8041029604FF6FF71A8F80210012188F8001062 -:20980000504671E72DE9F0410446AD4817460D46007810B10820BDE8F081084609F00EFC5C -:2098200008B11020F7E7A74E307808B9FFF7DFFB601E1E2807D8012C3FD12878FE283CD879 -:2098400030760020E7E7A4F120001F2805D8E0B23A462946BDE8F0411EE4A4F140004FF02E -:2098600000081F2821D8402C02D0412C25D117E0687829784418A97881421ED8FF2C08D846 -:2098800007F012FF074608F031FF381A801EA04201DA1220BFE728883081A878B07224E01F -:2098A0002846BDE8F04100F042BAA4F1A0001F2803D8A02C03D0A12C06D00720ABE7287886 -:2098C00000F00100707610E029680920F829A2D38A07A0D1727B02F00302012A04D1F28A0F -:2098E000D73293B28B4296D8F161404693E72DE9F04707460C46084609F0C6FB40B9384622 -:2099000009F0E0FB20B9F81C20F00300B84202D01020BDE8F0876B484FF0000844308178F4 -:2099200089B14178824600EB4115B4F8009015F8080F234600F00F000022294600F0DFF90A -:20994000060004D013E0A4F800800520E1E797B12188494501D90C260DE02878234600F0C0 -:209960000F003A46294600F0CAF9060005D00C2E01D0A4F800803046CBE79AF801005446DF -:20998000401CC0B28AF801000B2801D184F80180A078401EA070697801F00700062827D2EE -:2099A000DFE800F026091E031E1E0807E3D46888FFF7DAFDDFE74448696805F030FF94F80E -:2099C000690130B93E48407800F01AFC94F8690100B1FFDF94F86901401C84F86901CAE782 -:2099E00000EB0A0191F86801401C81F86801C2E7FFDFC0E770B50D46044609F01FFB18B96D -:209A0000284609F041FB08B1102070BD29462046BDE8704007F09BBC70B5044615460E46F7 -:209A2000084609F00BFB18B9284609F02DFB08B1102070BD022C03D0102C01D0092070BDFF -:209A40002A463146204607F0A5FC0028F7D0052070BD70B514460D46064609F0EFFA38B9EF -:209A6000284609F011FB18B9204609F02BFB08B1102070BD22462946304607F0AAFC0028F5 -:209A8000F7D0072070BD10B59AB0044609F0FCFA10B110201AB010BD0F208DF800000BA973 -:209AA000684602F06BFD0028F4D19DF834002070BDF836006080BDF83800A0800020E9E790 -:209AC0001C00002028040020DC05002070B505460C46084609F0F6FA20B93CB1206809F0BD -:209AE000D3FA08B1102070BDA08828B121462846BDE87040FDF727BE092070BD70B50446BA -:209B00000D46084609F09AFA30B9601E1E2814D8284609F093FA08B1102070BD022C01D96C -:209B2000072070BD04B9FFDFA64800EB840050F8041C2846BDE870400847A4F120001F2863 -:209B4000EED829462046BDE87040FAF79BB970B504460D46084609F097FA30B9601E1E2889 -:209B60000DD8284609F06AFA08B1102070BD012C01D0022C01D1062070BD072070BDA4F1E5 -:209B800020001F28F9D829462046BDE87040FAF722BA05F01ABB30B58B4D04466878A04203 -:209BA00000D8FFDF686800EBC40030BD70B5864800252C46467807E02046FFF7ECFF407855 -:209BC000641C2844C5B2E4B2B442F5D1284670BD2DE9F0410646022012B101EB4200401D32 -:209BE000C7B23068C01C20F0030232601BBB76483B460921203009F00DF9002408E0092C02 -:209C000011D2DFE804F005070509090B0B0505006E4804E06E4802E06E4800E06E4809F0EC -:209C200019F9054600E0FFDFA54200D0FFDF641CE4B2092CE3D3306800EB07103060EAE57A -:209C4000001D4143452900D24521491EB1FBF0F0401CC0B270472DE9FC5F06465A484FF0A7 -:209C600000088B464746454690F801901FE02846FFF791FF040000D1FFDFB4F804A0E1887B -:209C800001AB6A465046FFF73FF860789DF804303844C7B20AF1040081B280B29DF80020F6 -:209CA00005F05EFF62786D1C00FB0288EDB24D45DDD13068C01C20F003003060BBF1000FB9 -:209CC00000D000204246394605F058FF316808443060BDE8FC9F3C49443108710020C870C1 -:209CE000704739494431CA782AB10A7801EB42110831814201D001207047002070472DE946 -:209D0000F041044600201880601E1D4616460F46052800D3FFDF2B482A46103000EB84000E -:209D2000314650F8043C3846BDE8F041184738B50446407800F00300012803D002280BD08E -:209D4000072038BD606858B109F0C5F9D0B9606809F0B8F920B915E0606809F06FF988B92C -:209D600069462046FCF77BF90028EAD1607800F00300022808D19DF8000028B1606809F087 -:209D8000A1F908B1102038BD6189F8290DD8208988420AD8607800F003020B48012A06D1E4 -:209DA000D731C26989B28A4201D2092038BD94E80E0000F10C0585E80E000AB9002181828A -:209DC000002038BD740C020028040020F13C00006DC90000892F00009310010010B5EFF33A -:209DE000108000F0010472B6E9484178491C41704078012801D108F0D9FC002C00D162B621 -:209E000010BD70B5E24CE07848B90125E570FFF7E5FF08F0D3FC20B1002008F0AFFC0020F9 -:209E200070BD4FF080406571C0F80453F7E770B5EFF3108000F0010572B6D54C607800B9CC -:209E4000FFDF6078401E6070607808B908F0B2FC002D00D162B670BDCD4810B5C17821B1B7 -:209E600000214171C170FFF7E2FF002010BD10B5044608F0A3FCC649C978084000D00120EB -:209E80002060002010BD2DE9F05FDFF804934278817889F80620002689F80710074689F89C -:209EA00008600078354620B101280FD002280FD0FFDF08F090FC98B108F094FCB0420FD160 -:209EC000304608F093FC0028FAD047E00126F0E7FFF784FF08F072FC0028FBD00226E8E7A5 -:209EE00001208407E060C4F80451AA490E600107D1F84412A74AC1F3423124321160A54910 -:209F00004FF0020B34310860C4F804B3A060DFF888A2DAF80010C94341F3001101F1010886 -:209F2000DAF8001041F01001CAF8001000E020BFD4F804010028FAD0304608F057FC0028C0 -:209F4000FAD0B8F1000F05D1DAF8001021F01001CAF80010C4F808B3C4F8045199F80700B3 -:209F60004C4670B1387860B908F028FC074608F019FE6FF0004117B1C4E9031001E0C4E937 -:209F8000030116B12571BDE8F09F0127BE0727714FF01908C6F80883B761C6F80051C6F819 -:209FA0000C51C6F8105108F009FC10B1A770376100E02770FFF712FF7649A07920310860A9 -:209FC000C6F80483DFE770B5050000D1FFDF4FF080424FF0FF30C2F808030021C2F800117D -:209FE000C2F80411C2F80C11C2F81011684C617008F0EAFB10B10120E07060702846BDE869 -:20A00000704040E72DE9F041614C4FF080470125E079F0B1012803D0217A401E814218DAA5 -:20A0200008F0CCFB064608F0BDFDE179012902D9217A491C21720EB1216900E0E168411AA4 -:20A04000022902DA11F1020F0BDC0EB1206100E0E060FFF7C3FE08F0B1FB28B13D61A570B8 -:20A0600003E07D61BDE8F081257000202072F9E72DE9F05F4948D0F800B0484A4849083217 -:20A0800011608406D4F8080110B14FF0010801E04FF00008D4F8000100B101208146D4F88D -:20A0A000040108B1012600E00026D4F80C0100B101208246D4F8100108B1012700E000277D -:20A0C00048EA090126EA010020EA0A00B84300D0FFDF0025B8F1000F04D0C4F8085101208F -:20A0E00008F04CFB5FEA0900DFF8A4804FF0010913D0C4F8005198F8050020B188F8055060 -:20A10000002008F03BFB98F8000030B108F056FB18B188F80290C4F810900EB1C4F8045130 -:20A12000BAF1000F0CD0C4F80C5198F80200464600B9FFDFB5703570C4F81490FFF777FE26 -:20A1400037B1C4F8105198F8040008B1FFF75AFF1249091DC1F800B015E770B50C4DE8789A -:20A1600008B908F027FB01208407A061A87850B1D4F80C0120B9002008F038FB0028F7D149 -:20A180000020C4F80C014FF0FF30C4F8080370BD300000201805004010ED00E01005024093 -:20A1A000010000014FF0E0214FF00070C1F88001C1F88002384B802283F80024C1F80001BB -:20A1C000704700B502460420344903E001EBC0031B792BB1401EC0B2F8D2FFDFFF2000BDD4 -:20A1E00041F8302001EBC00100224A718A7101220A7100BD294A002102EBC000017170478C -:20A2000010B50446042800D3FFDF244800EBC4042079012800D0FFDF6079A179401CC0B202 -:20A22000814200D060714FF0E0214FF00070C1F8000210BD2DE9F04119480568184919486C -:20A24000083108601448042690F80004134F4009154C042818D0FFDF16E0217807EBC1000B -:20A260000279012A08D1427983799A4204D04279827157F8310080472078401CC0B220700D -:20A28000042801D300202070761EF6B2E5D20448001D0560BDE8F08119E000E01C0600201C -:20A2A000100502400100000144000020F8B51D46DDE906470E000AD005F019FD2346FF1D46 -:20A2C000BCB231462A46009405F09EF9F8BDD0192246194616F052FA2046F8BDF84B58603C -:20A2E00019721A80C90016F0E2BA70B50D460446102116F0BAFA258117206081A07B40F018 -:20A300000A00A07370BD4FF6FF720A800146032008F050BE704700897047827BD30701D1A3 -:20A32000920703D4808908800020704705207047827B920700D5818170470146002009884D -:20A3400047F2FE12114200D00120DD49497A002901D040F00800704700B50346807BC007DE -:20A3600001D0052000BD59811846FFF7E6FFC00703D0987B40F004009873987B40F00100E7 -:20A380009873002000BD827B520700D509B14089704717207047827B61F3C30282737047C0 -:20A3A0002DE9F04F0E46017804464FF0010B0BFA01F047F2FF1100EA010961684FF6FF782E -:20A3C00087B008881D469646404506D0B9F1000F07D047F2FE12104203D0012007B0BDE8A1 -:20A3E000F08F40EA090008804FF0000A95B185F800A022780027052003210223102A6FD2CD -:20A40000DFE802F06E0D2C35546F768054CBC79CCFFEFDFC20780B28EBD00420DEE762686D -:20A420002089937B9B077DD5172851D313898342FBD39289172A01D3824249D12A7822F01D -:20A440003F02921C2A70A5F801003180616888816068817B21F00201817342E104212970A5 -:20A460002189A5F801106189A5F803108FE0208A3188C01D1FFA80F84145D6D306202870BD -:20A480002089A5F801006089A5F80300A089A5F805000721208ACDE9000160882A46714689 -:20A4A0006369FFF703FFA6F800801AE1082A10D0082129702189A5F801106189A5F80310F9 -:20A4C00030806A1D694604F10C0006F082FF10B1CCE01021EDE730889DF80010084456E0CD -:20A4E0000EE10A2028702089A5F801003180B2E00C2129702189A5F801106189A5F8031069 -:20A500003080A8E0218933880BEB41021FFA82FA534576D3BAF1050F73D30E222A7008EA2E -:20A52000410100E07FE0CDE9001B60882A467146E368FFF7BBFEA6F800A0D2E06048417A6D -:20A54000002970D0491E41724068217AE26800EBC105D046A9882868D2F800C00844A0F1FC -:20A56000080140F808CC506848608DF800308DF801A028680290A888ADF8040060886946F9 -:20A58000F7F769FCA5F80480002E01D040463080A7E0287840F080022A70287840F040028D -:20A5A0002A7060893288C01C1FFA80F842455DD3287820F03F00123028702289A5F8012008 -:20A5C0006089CDE9000160882A467146E368FFF76DFEA6F80080287841063CD500065ED5D1 -:20A5E0008DF800B08DF801A03188CDE9025A091DADF804100420DFF8C88003E059E04FE0C8 -:20A600002DE033E0049098F808008DF8140060886946F7F720FC074630880C303080022F92 -:20A6200002D0E7B36FE048E09DF81420D8F8041098F80830404601EBC2019A4216D28A88B7 -:20A64000A2B9427A521C88F809200D6030888880A6F800A057E061682089888041E0A18965 -:20A660003288491D1FFA81F8424501D204274AE029782A4621F03F01163129702189A5F8F0 -:20A6800001106189A5F80310A189CDE90010608871462369FFF70AFEA6F80080DBE720E016 -:20A6A000287820F03F0018302870207A6870338017E060680188090404D4052723E000004A -:20A6C0003C060020C0882189884201D006271AE01E202870A6F800B06068018821F4004199 -:20A6E0000180B9F1000F0ED0DF486188002200888300032008F0BEFB61682078887007E0F1 -:20A70000A6F800A003276068018821EA09010180384663E62DE9F04F87B01746109C0D0081 -:20A7200083461E461AD03078C10703D000F03F00192801D9012100E000212046FFF723FED5 -:20A74000A8420BD32088A0F57F41FF3906D03078410601D4000603D508203FE607203DE6ED -:20A7600000208DF800008DF8010030786B1E00F03F0C0122A81E4FF0050A4FF0020999B276 -:20A78000BCF1200F76D2DFE80CF08C10755F7569758D759E75B875BD75CB75D775E4757541 -:20A7A00075F475F275F175F0758C052D79D104208DF80000A0788DF804007088ADF8060094 -:20A7C00030798DF80100707800F03F000C2829D00ADCA0F10200092863D2DFE800F01262FC -:20A7E00015621A621D622000122824D004DC0E281BD01028DAD11BE016281FD01828D5D1A7 -:20A800001FE02078800701E020784007002848DAF1E020780007F9E72078C006F6E72078ED -:20A820008006F3E720784006F0E720780006EDE72088C005EAE72088C004E7E720888004ED -:20A84000E4E720884004E1E72078800729D5032D27D18DF800A0B6F8010083E02178490714 -:20A860001FD5062D1DD381B27078012803D0022817D102E0CCE0022000E0102006228DF82B -:20A88000002072788DF80420801CB1FBF0F2ADF8062092B242438A4203D10397ADF80890D0 -:20A8A000A9E07BE02078000778D5072198B28DF800108108ADF80410B0EB810F6ED102977C -:20A8C000ADF8062097E02178C90667D5022D65D381B208208DF80000707802285ED300BF49 -:20A8E000B1FBF0F28DF80400ADF8062092B242438A4253D1ADF808907CE0207880064DD5E4 -:20A90000092003E02078400648D50A208DF80000A088ADF80400ADF80610ADF8082069E0DF -:20A920002078000672D50B20ADF804108DF80000ADF8062002975EE02188C90566D5022D46 -:20A9400064D381B20C208DF80000707804285DD3C6E72088C00459D5012D57D10D208DF849 -:20A960000000A088ADF8040045E021E026E016E0FFE72088800449D5052D47D30E208DF8B5 -:20A980000000A088ADF80400B6F803006D1FADF80850ADF80600ADF80AA02BE036E02088E9 -:20A9A000400433D5012D31D10F208DF8000022E0208800042AD4B6F80100E080A07B00078A -:20A9C00024D5032D22D3307800F03F001B2819D011208DF80000208840F40040A4F80000E8 -:20A9E000B6F80100ADF80400ED1E0320ADF80650ADF80800039769465846F7F72CFA050029 -:20AA000008D016E010208DF80000E9E7072510E008250EE0307800F03F001B2809D01D2874 -:20AA200007D05946032008F0C5FA208800F400402080A07B400708D52046FFF77EFCC0076E -:20AA400003D1A07B20F00400A0732846C6E400B587B0032805D18DF8000088B26946F7F77F -:20AA6000FAF907B000BD00003C060020F8B51D46DDE906470E000AD005F039F92346FF1D56 -:20AA8000BCB231462A46009404F0BEFDF8BDD0192246194615F072FE2046F8BD2DE9FF4FC5 -:20AAA0008DB09B46DDE91B57DDF87CA00C46082B05D0E06901F00CF950B11020D2E0288823 -:20AAC000092140F0100028808AF80010022617E0E16901208871E2694FF420519180E169F5 -:20AAE0008872E06942F601010181E069002181732888112140F0200028808AF80010042663 -:20AB000038780A900A2038704FF0020904F118004D460C9001F0ACFBB04681E0BBF1100FD9 -:20AB20000ED1022D0CD0A9EB0800801C80B20221CDE9001005AB52461E990D98FFF796FFA9 -:20AB4000BDF816101A98814203D9F74800790F9004E003D10A9808B138702FE04FF0020166 -:20AB6000CDE900190DF1160352461E990D98FFF77DFF1D980088401B801B83B2C6F1FF006B -:20AB8000984200D203461E990BA8D9B15FF00002DDF878C0CDE9032009EB060189B2CDE9A9 -:20ABA00001C10F980090BDF8161000220D9801F0E2FB387070B1C0B2832807D0BDF81600A4 -:20ABC00020833AE00AEB09018A19E1E7022011B0BDE8F08FBDF82C00811901F0FF08022DA5 -:20ABE0000DD09AF80120424506D1BDF82010814207D0B8F1FF0F04D09AF801801FE08AF8C9 -:20AC00000180C94800680178052902D1BDF81610818009EB08001FFA80F905EB080085B227 -:20AC2000DDE90C1005AB0F9A01F025FB28B91D980088411B4145BFF671AF022D13D0BBF135 -:20AC4000100F0CD1A9EB0800801C81B20220CDE9000105AB52461E990D98FFF707FF1D985F -:20AC60000580002038700020B1E72DE9F8439C46089E13460027B26B9AB3491F8CB2F18FE6 -:20AC8000A1F57F45FF3D05D05518AD882944891D8DB200E000252919B6F83C8008314145E5 -:20ACA00020D82A44BCF8011022F8021BBCF8031022F8021B984622F8024B914605F005F826 -:20ACC0004FF00C0C41464A462346CDF800C004F062FCF587B16B00202944A41D21440880F3 -:20ACE00003E001E0092700E083273846BDE8F88310B50B88848F9C420CD9846BE018048897 -:20AD000044B1848824F40044A41D23440B801060002010BD822010BD2DE9F0478AB00025AB -:20AD2000904689468246ADF8185007274BE0059806888088000446D4A8F8006007A80195AA -:20AD400000970295CDE903504FF4007300223146504601F010FB04003CD1BDF81800ADF858 -:20AD60002000059804888188B44216D10A0414D401950295039521F400410097049541F42E -:20AD8000804342882146504601F0CCF804000BD10598818841F40041818005AA08A9484689 -:20ADA000FFF7A6FF0400DCD00097059802950195039504950188BDF81C300022504601F083 -:20ADC000B1F8822C06D105AA06A94846FFF790FF0400ACD0ADF8185004E00598818821F4A8 -:20ADE0000041818005AA06A94846FFF781FF0028F3D0822C03D020460AB0BDE8F0870020E7 -:20AE0000FAE710B50C46896B86B051B10C218DF80010A18FADF80810A16B01916946FCF71F -:20AE20009BF900204FF6FF71A063E187A08706B010BD2DE9F0410D460746896B0020069EF5 -:20AE40001446002911D0012B0FD1324629463846FFF762FF002808D1002C06D032462946DC -:20AE60003846BDE8F04100F042BFBDE8F0812DE9FC411446DDE9087C0E46DDE90A15521DD8 -:20AE8000BCF800E092B2964502D20720BDE8FC81ACF8002017222A70A5F80160A5F803307D -:20AEA0000522CDE900423B462A46FFF7DFFD0020ECE770B50C4615464821204615F0F7FC24 -:20AEC00004F1080044F81C0F00204FF6FF71E06161842084A5841720E08494F82A0040F0C5 -:20AEE0000A0084F82A0070BD4FF6FF720A800146042008F05FB830B585B00C460546FFF70E -:20AF000080FFA18E284629B101218DF800106946FCF722F90020E0622063606305B030BD7D -:20AF2000B0F84000704700004800002090F84620920703D4408808800020F3E70620F1E764 -:20AF400090F846209207EDD5A0F84410EAE70146002009880A0700D5012011F0F00F01D01B -:20AF600040F00200CA0501D540F004008A0501D540F010004A0501D540F020000905D1D5F8 -:20AF800040F04000CEE700B5034690F84600C00701D0062000BDA3F842101846FFF7D7FF2E -:20AFA00010F0760F05D093F8460040F0040083F8460013F8460F40F001001870002000BD7B -:20AFC00090F84620520700D511B1B0F84200A9E71720A7E710F8462F61F3C3020270A1E7C4 -:20AFE0002DE9FF4F9BB00E00DDE92B34DDE92978289D25D02878C10703D000F03F001928A3 -:20B0000001D9012100E000212046FFF7D9FFB04216D3287841060FD400F03F011E2909D00A -:20B02000218811F47F6F0BD13A884AB1A1F57F42FF3A05D0010606D500F03F00122802D059 -:20B0400004201FB0C4E5FC491D984FF0000A08718DF818A08DF830A00CAA0A60ADF81CA085 -:20B06000ADF824A02978994601F03F02701F5B1C04F1180CD3464FF0030ECDF828C01F2A37 -:20B080007ED2DFE802F07D7D107D227DAE7DF77DF67DF57DF47DF77DF37D7D7DF27DF17DD1 -:20B0A0007D7D7D7DF00094F84610B5F80100890767D5032E65D14FF40061ADF8241060808C -:20B0C0008DF830E0ADF83400E9E2052EF2D1B5F801002083ADF81C00B5F803106183002863 -:20B0E00070D088426ED884F80AB0A4F808B04FF6FF7020840A9801F0BBF8052089F8000032 -:20B1000002208346029011AB1D9A0A991B9801F0B2F820B15EE000BF8DF81800FEE29DF86E -:20B120004A00012804D0022089F80100102003E0012089F8010002200390002204A912A830 -:20B1400006F047F9E8BB9DF81010039888423ED13A88891CA2EB0B00884238DB0299022054 -:20B16000CDE900010DF146034A4641461B98FFF77DFC02980BF1020B801C81B217AA01E084 -:20B18000ACE2B1E0029104A912A806F022F902999DF81000CDE9000117AB4A4641461B9802 -:20B1A000FFF764FC9DF8100011AB0BEB00011FFA81FB02991D9A084480B202900A991B9894 -:20B1C00001E004E091E001F056F80028B5D0BBF1020F03D10A208DF818005DE2A7F800B067 -:20B1E0005AE2CDF80CB0072E7ED3B5F801002083ADF81C00B5F803206283002875D0904206 -:20B2000073D84FF0010B84F80AB0B5F8050020810020A073E06900F05BFD80B9E16942F690 -:20B22000010081F806B0E2694FF420519180E16981F80AB0E1690881E16900208873F01F0A -:20B2400020841E984FF0070B6062A4F822B00A9801F00EF889F800B00120834604900020AB -:20B26000ADF846002AE026E2B0E147E1EDE01FE2B0E088E04FE000BFBBF1010F15D0E0697A -:20B280008079012803D1BDF84400ADF80E0004990420CDE9000103AB4A4641461B98FFF726 -:20B2A000E5FB0498001D80B20490BDF84600ADF80C00ADF80E0005981FFA80FB11AB1D9A2C -:20B2C0000A991B9800F0D7FF28B939880BF1040005908142D0D2BBF1010F3FF41BAFE069B4 -:20B2E0008079012808D001E098E023E0BDF84410A1F57F40FF3803D1BDF84400ADF80E00E3 -:20B3000004990420CDE9000103AB4A4641461B98FFF7ACFB62E7072E01D0152E7ED1B5F812 -:20B3200001102183ADF81C10B5F80320628309B1914201D90120EFE60121A172A4F808B0EC -:20B3400084F80EB0052E07D0C0B2691DE26906F021F800287FF4DEAE4FF6FF70208401A82F -:20B3600006AA09A9CDF800B080E886032878214600F03F031D9A1B98FFF790FB8246208B6E -:20B38000ADF81C0088E10120032EC7D14021ADF82410B5F801102183ADF81C100AAAB8F1CF -:20B3A000000F00D00023CDE9020304921D98CDF80480009038880022401E83B21B9800F094 -:20B3C000DAFF8DF8180050BB0B2189F80010BDF8280038E04FF0010C052E9FD18020ADF806 -:20B3E0002400B5F801102183B5F803002084ADF81C10B0F5007F01D907208DE640F47C4218 -:20B40000228412A8B8F1000F00D00023CDE90330CDE9018C1D980090388801E09CE007E0AC -:20B42000401E83B21B9800F0A6FF8DF8180028B18328A7D10220C7E0480000200D2189F8B8 -:20B440000010BDF84800401C25E1C80900EB40020EEB8200B04203D948067DD558461AE1FD -:20B46000B5F80110ADF81C102A78520608D506228DF830202A78120605D58DF830B02FE160 -:20B4800007228DF830200323CDE9023BDDF878C0CDF810B01D9AA6EB00080092CDF804C098 -:20B4A0001FFA88F300221B9800F03CFD8DF818008DF830B0297849060DD52088C00506D5DE -:20B4C000208BBDF81C10884201D1C4F824B058468DF818B0DFE0832801D14FF0020A4FF4FF -:20B4E0008070ADF82400BDF81C002083A4F820801E986062032060841321C9E0052E2BD356 -:20B50000B5F80110ADF81C10A28F32B3A2F57F43FE3B29D008228DF830200523CDE9023BE1 -:20B52000DDF878C0CDF810B01D9A80B2CDF804C040F400430092B5F803201B9800F0F2FC9D -:20B540004FF400718DF818008DF830B0ADF82410832813D010B301E0DBE005E0A08FA0F5C6 -:20B560007F41FE3907D0D9E00B228DF830204FF6FE72A287D1E7A4F83CB0CFE000942B4670 -:20B5800031461E9A1B98FFF770FB8DF8180008B183284BD1BDF81C0020834BE700942B46A0 -:20B5A00031461E9A1B98FFF760FB8DF81800E8BBE18FA06B0844831D8DE8880343888288DC -:20B5C00001881B98FFF753FC824665E095F80180022E6FD15FEA080002D0B8F1010F7FD133 -:20B5E00009208DF8300007A800908DF834804346002221461B98FFF71CFC8DF835008DF8E3 -:20B6000036B050B9B8F1010F11D0B8F1000F04D1A08FA0F57F41FF3909D0A08F38B14FF424 -:20B6200080608DF830B0ADF824000EE034E00CA91B98FBF791FD82464FF480608DF830B0C2 -:20B64000ADF82400BAF1020F06D0FB480068807928B18DF8180027E0A4F8188042E0BAF16D -:20B66000000F03D081208DF818003BE007A800904346012221461B98FFF7DBFB8DF8180021 -:20B6800021461B98FFF7BDFB9DF8180020B9192189F80010012038809DF8300020B10CA96D -:20B6A0001B98FBF759FD8246BAF1000F33D019E0062031E514E02078000711D5012E0FD14D -:20B6C0000A208DF83000E088ADF8340004201B9907F070FC0820ADF824007FE5480618D57F -:20B6E0004FF0040A2088BDF8241008432080BDF8240080050BD5A18FA1F57F40FE3806D1B1 -:20B700001E98E06228982063A6864FF0030A504697E4042000E59DF8180078B1012089F8E4 -:20B720000000297889F80110BDF81C10A9F802109DF8180089F80400052038802088BDF8D6 -:20B74000241088432080E2E72DE9FF4F8846087895B0012181404FF20900249C0140ADF8B7 -:20B7600020102088DDF88890A0F57F424FF0000AFF3A02D029B1000703D5012019B0BDE812 -:20B78000F08F239E4FF0000B0EA886F800B018995D460988ADF83410A7498DF81CB0179A7B -:20B7A0000A718DF838B0086098F8000001283BD0022809D003286FD1307820F03F001D30C3 -:20B7C0003070B8F80400E08098F800100320022904D1317821F03F011B31317094F8461029 -:20B7E000090759D505ABB9F1000F13D0002102AA82E80B000720CDE90009BDF83400B8F8FE -:20B800000410C01E83B20022159800F0B4FD0028D1D101E0F11CEAE7B8F80400A6F80100B5 -:20B82000BDF81400C01C04E198F805108DF81C1098F80400012806D04FF4007A02282CD0B2 -:20B840000328B8D16BE12188B8F8080011F40061ADF8201020D017281CD3B4F8401081426F -:20B8600018D3B4F84410172901D3814212D1317821F03F01C91C3170A6F801000321ADF83B -:20B880003410A4F8440094F8460020F0020084F8460064E105257DE176E1208808F108070A -:20B8A00000F4FE60ADF8200010F0F00F1BD010F0C00F03D03888228B9042EBD199B9B87868 -:20B8C000C00710D0B9680720CDE902B1CDF804B00090CDF810B0FB88BA883988159800F05F -:20B8E00021FB0028D6D12398BDF82010401C80294ED006DC10290DD020290BD0402987D1BD -:20B9000024E0B1F5807F70D051456DD0B1F5806F97D1DDE0C80601D5082000E0102082460D -:20B920000DA907AA0520CDE902218DF83800ADF83CB0CDE9049608A93888CDE90001534643 -:20B94000072221461598FFF7A9F8A7E09DF81C2001214FF00A0A002A9BD105ABB9F1000F47 -:20B9600000D00020CDE902100720CDE90009BDF834000493401E83B2218B0022159800F0AB -:20B98000FAFC8DF81C000B203070BDF8140020E09DF81C2001214FF00C0A002A22D113AB59 -:20B9A000B9F1000F00D00020CDE902100720CDE900090493BDF83400228C401E83B2218BC3 -:20B9C000159800F0D8FC8DF81C000D203070BDF84C00401CADF8340005208DF83800208BC5 -:20B9E000ADF83C00BBE000E028E03888218B88427FF450AF9DF81C004FF0120A00281AD11C -:20BA0000606A98B1B878C0073FF444AFBA680720CDE902B2CDF804B00090CDF810B0FB8832 -:20BA2000BA88159800F07EFA8DF81C00132030700120ADF8340092E0480000203988208BFB -:20BA40008142D5D19DF81C004FF0160A0028A06B08D0E0B34FF6FF7000215F46ADF808B0F8 -:20BA6000019027E068B1B978C907C1D1E18F0DAB0844821D03968DE80C02438882880188F5 -:20BA800009E0B878C007BFD0BA680DAB03968DE80C02BB88FA881598FFF7E9F905005ED0C4 -:20BAA000072D72D076E0019005AA02A92046FFF71FF90146E28FBDF80800824201D0002928 -:20BAC000F1D0E08FA16B084407800198E08746E09DF81C004FF0180A40B1208BC8B138884A -:20BAE000208321461598FFF78CF938E004F118000090237E012221461598FFF79AF98DF879 -:20BB00001C000028EDD1192030700120ADF83400E7E7052521461598FFF773F93AE0208820 -:20BB200000F40070ADF8200050452DD1A08FA0F57F41FE3901D006252CE0D8F808004FF06F -:20BB4000160A48B1A063B8F80C10A1874FF6FF71E187A0F800B002E04FF6FF70A087BDF8FE -:20BB6000200030F47F611AD0782300220420159907F080F998F8000020712088BDF820100A -:20BB8000084320800EE000E007252088BDF8201088432080208810F47F6F1CD03AE021887F -:20BBA000814321809DF8380020B10EA91598FBF7D3FA05469DF81C000028EBD086F801A061 -:20BBC00001203070208B70809DF81C0030710520ADF83400DEE7A18EE1B118980DAB008843 -:20BBE000ADF834002398CDE90304CDE90139206B0090E36A179A1598FFF7F2F905460120F1 -:20BC00008DF838000EA91598FBF7A6FA00B10546A4F834B094F8460040070AD52046FFF7A1 -:20BC200096F910F0760F04D114F8460F20F0040020701898BDF83410018028469EE500B546 -:20BC400085B0042806D102208DF8000088B26946FBF782FA05B000BD10B5384C0B782268E6 -:20BC6000012B02D0022B2AD111E013780BB1052B01D10423137023688A889A802268CB8826 -:20BC8000D38022680B891381498951810DE08B8893802268CB88D38022680B8913814B8932 -:20BCA00053818B899381096911612168FBF754FA226800210228117003D0002800D0812019 -:20BCC00010BD832010BD806B002800D0012070478178012909D10088B0F5205F03D042F6B8 -:20BCE0000101884201D10020704707207047F0B587B0002415460E460746ADF8144010E00C -:20BD0000069801882980811DCDE902410721019404940091838842880188384600F002F90F -:20BD200030B906AA05A93046FEF7E2FF0028E7D0822800D1002007B0F0BD0000480000202A -:20BD400010B58B7883B102789A4205D10B885BB102E08B79091D4BB18B789A42F9D1B0F8C3 -:20BD600001300C88A342F4D1002010BD812010BD072826D012B1012A27D103E0497801F059 -:20BD8000070102E04978C1F3C20105291DD2DFE801F00318080C12000AB1032070470220B4 -:20BDA000704704280DD250B10DE0052809D2801E022808D303E0062803D0032803D0052021 -:20BDC0007047002070470F20704781207047C0B2820610D400060CD5FA48807A421ED3174C -:20BDE00002EB5372012303EBE20201FB002080B27047084670470020704770B513880B806F -:20BE00000D782B062AD5EF4B9B7A834204D845F010000870002070BD946800F0070604EB8B -:20BE2000D0042478F44064F304150D701478D17804F0030441EA042140F20124B1FBF4F565 -:20BE400004FB151192685B1E00FB0120D91703EB5171012202EBE101084470BD906870BDFE -:20BE600037B51446BDF8041011809DF804100A0622D5C1F30013D3490122A568897A814299 -:20BE80000CD8FE2814D1491EC81701EB507002EBE0015A422846F7F7A4F809E005EBD001B5 -:20BEA00000F007050878AA409043AB4018430870207820F0100020703EBD2DE9F0410746B4 -:20BEC000C81C0E4620F00300B04202D08620BDE8F081BC4D002034462E60AF802881AA7272 -:20BEE000E8801AE0E988491CE980810614D4E17800F0030041EA002040F20121B0FBF1F2B9 -:20BF000001FB12012068FFF762FF2989084480B22881381A3044A0600C3420784107E1D4BF -:20BF20000020D4E72DE9FF4F89B01646DDE9168A0F46994623F44045084600F00CFB0400AE -:20BF40000FD0099803F07EFD0290207800060AD59C48817A0298814205D887200DB0BDE8C2 -:20BF6000F08F0120FAE7224601A90298FFF745FF834600208DF80C004046B8F1070F1AD0B1 -:20BF800001222146FFF7F4FE0028E7D12078400611D502208DF80C00ADF81070BDF80400FA -:20BFA000ADF81200ADF814601898ADF81650CDF81CA0ADF818005FEA094004D500252E46B4 -:20BFC000A84601270CE02178E07801F0030140EA012040F20121B0FBF1F2804601FB1287F1 -:20BFE0005FEA494009D5B84507D1A178207901F0030140EA0120B04201D3BE4201D9072003 -:20C00000ACE7A8191FFA80F9B94501D90D20A5E79DF80C0028B103A90998FBF79BF8002835 -:20C020009CD1B84507D1A0784FEA192161F30100A07084F804901A9800B10580199850EAEB -:20C040000A0027D0199830B10BEB06002A46199914F094FB0EE00BEB06085746189E0998B6 -:20C0600003F033FE2B46F61DB5B239464246009503F091FA224601A90298FFF7BEFE9DF8A4 -:20C080000400224620F010008DF80400DDE90110FFF7E6FE002061E72DE9FF4FDFF8249182 -:20C0A00082461746B9F80610D9F8000001EB410100EB810440F20120B2FBF0F185B000FB14 -:20C0C00011764D46DDF84C8031460698FFF77FFE29682A898B46611A0C3101441144AB8883 -:20C0E00089B28B4202D8842009B038E70699CDB2290603D5A90601D58520F5E7B9F806C040 -:20C100000CF1010C1FFA8CFCA9F806C0149909B1A1F800C0A90602D5C4F8088007E0104448 -:20C1200080B2A9F80800191A01EB0B00A0602246FE200699FFF794FEE77026712078390A84 -:20C1400061F30100320AA17840F0040062F30101A17020709AF802006071BAF80000E08092 -:20C1600000262673280602D599F80A7000E00127A80601D54FF000084D4600244FF0070917 -:20C180000FE0CDE902680196CDF800900496E9882046129B089AFFF7C5FE0028A4D1641C0E -:20C1A000E4B2BC42EDD300209EE72DE9F047804600F0D1F9070007D000264446014D40F2AB -:20C1C000012918E0480600200120BDE8F087204600F0C1F90278C17802F0030241EA022289 -:20C1E000B2FBF9F309FB13210068FFF7F0FD3044641C86B2A4B2E988601E8142E7DCA8F193 -:20C200000100E8802889801B288100203870DCE710B5144631B1491E218003F013FCA0701A -:20C22000002010BD012010BD10B5D34904460088CA88904201D3822010BD096800EB40006D -:20C2400001EB80025079A072D08820819178107901F0030140EA0120A081A078E11CFFF79E -:20C26000CCFD20612088401C2080E080002010BD0121018270472DE9FF4F85B04FF6FF78D2 -:20C280008246A3F8008048681F460D4680788DF8060048680088ADF8040000208DF80A0040 -:20C2A000088A0C88A04200D304462C8241E0288A401C2882701D6968FFF742FDB8BB39880B -:20C2C000414501D1601E38806888A04236D3B178307901F0030140EA012901A9701DFFF7AD -:20C2E0002FFD20BB298941452CD0002231460798FFF73EFDD8B92989494518D1E9680391FB -:20C30000B5F80AC0D6F808B05046CDF800C003F0DCFCDDF800C05A460CF1070C1FFA8CFC54 -:20C320004B460399CDF800C003F0F8F850B1641CA4B2204600F00FF90600B8D1641E2C8274 -:20C340008220D1E67C807079B871F088B8803178F07801F0030140EA01207881A7F80C9041 -:20C36000504603F06FFB324607F10801FFF745FD38610020B8E62DE9FF4F87B081461C46FE -:20C380009246DDF860B0DDF85480089800F0E3F805000CD0484603F055FB2978090608D58D -:20C3A0007549897A814204D887200BB0D7E50120FBE7CAF309062A4601A9FFF71EFD0746B8 -:20C3C000149807281CD000222946FFF7D1FC0028EBD12878400613D501208DF80800089842 -:20C3E000ADF80C00BDF80400ADF80E00ADF81060ADF8124002A94846FAF7ACFE0028D4D173 -:20C400002978E87801F0030140EA0121AA78287902F0030240EA0220564507D0B1F5007F3D -:20C4200004D9611E814201DD0B20BEE7864201D90720BAE7801B85B2A54200D92546BBF11C -:20C44000000F01D0ABF80050179818B1B9192A4614F094F9B8F1000F0DD03E44484644468F -:20C46000169F03F044FC2146FF1DBCB232462B46009403F0C9F8002097E72DE9F041074680 -:20C480001D461646084600F066F804000BD0384603F0D8FA2178090607D53749897A814255 -:20C4A00003D8872013E5012011E522463146FFF7A4FC65B12178E07801F0030140EA01202F -:20C4C000B0F5007F01D8012000E0002028700020FDE42DE9F04107461D461646084600F014 -:20C4E0003AF804000BD0384603F0ACFA2178090607D52149897A814203D88720E7E40120F2 -:20C50000E5E422463146FFF7ABFCFF2D14D02178E07801F0030240EA022040F20122B0FB93 -:20C52000F2F302FB130015B900F2012080B2E070000A60F3010121700020C8E410B50C46D0 -:20C5400000F009F828B1C18821804079A070002010BD012010BD0849CA88824209D340B14F -:20C56000096800EB40006FF00B0202EB8000084470470020704700004806002010B50C46E7 -:20C5800002F0F3FA78B3204600F05FFE60B32278102A09D0112A07D0022A05D0032A03D00B -:20C5A000162A2DD0FFDF1CE0A0781A2817D00DDC132814D2DFE800F0151319131320201C9F -:20C5C0001E28131322131313131326002A2806DD3C280FD003DC302814D03A2810D0032050 -:20C5E00010BD002010BD14E011E043F20200F9E70420F7E70D20F5E70F20F3E70820F1E771 -:20C600001120EFE70720EDE743F20600EAE7FFDFE7E7FFDFE5E700F018BE70B50346002062 -:20C6200002466FF02F050EE09C5CA4F130060A2E02D34FF0FF3070BD00EB800005EB40002B -:20C64000521C2044D2B28A42EED370BD30B50A240AE0B0FBF4F304FB13008D18303005F827 -:20C66000010C521E1846D2B2002AF2D130BD30B500234FF6FF7510E0040A44EA002084B23E -:20C68000C85C6040C0F30314604005EA00344440E0B25B1C84EA40109BB29342ECD330BD30 -:20C6A000F0B516460B880122B240134215D113430B800446051D018840880F18092F00D3C6 -:20C6C000093F401C092800D9FFDF781C092800D9FFDF6088401C6080EE55F0BDF0B506880B -:20C6E0000446051D0F46701C81B22180092901D3093921806088012800D2FFDF701C0928B2 -:20C7000000D9FFDF60880122401E6080A85D3988824091433980F0BD2DE9F0410E468046F6 -:20C72000DDE9065089781746090612D420F8045D4380404603F0DBFA040000D1FFDF2D1D03 -:20C740002046A9B202F038FC00B9FFDF404600F01AFC06EB4701087C401C0874BDE8F08124 -:20C760007CB505461220187048780C46801C587008205880108898805088D880908818817C -:20C78000D08858810C20CDE900030523062221462846FFF7C1FFF02300222946012006F0ED -:20C7A00069FB6078801C60707CBD2DE9F84F0F469A4691460546032103F07CF90446808C02 -:20C7C000DFF86085002618B198F80000B84221D1284603F08CFA050000D1FFDF09F1040198 -:20C7E000284689B202F098FB060013D002F046FF0770284631466A4602F07FFE00980021B7 -:20C800000A460180817000F084FC0098C01DCAF8000030E098F80000B84225D104F1220503 -:20C8200034F8301F012000FA07F911EA090F00D0FFDF208840EA090020802C8805F104096F -:20C84000641E092C00D309342C806888401C092800D9FFDF601C092800D9FFDF6888401C81 -:20C86000688009F8047006E03A4604F1300104F12200FFF715FF092188F800103046BDE8D9 -:20C88000F88F38B50546032103F014F90446807800F07F00012814D002226B46062128468D -:20C8A000121DFFF782FF00280AD0A07800F07F00012808D0228921462846009B00F084FABF -:20C8C00038BD0822E9E704F1080221462846009BFFF746FF38BDFEB514460D46064602AB71 -:20C8E00006220721FFF761FF80B1029B0120072218705C700220588000249C800620CDE910 -:20C900000003052329463046FFF706FFEC70FEBD10B50446032103F0CDF80146C278204623 -:20C92000BDE81040D7E7FF4909200870704770B50C4615463421204613F0B9FF012060706B -:20C940002078122120F00F00207004F1100013F0AEFF05B9FFDF2978A07861F30600A070E9 -:20C9600070BD70470146012006F024BB3EB58DB20321284603F09EF8040000D1FFDF2078FE -:20C98000002220F00F00207002208DF800004FF6FF70ADF80200ADF8040069462846F7F710 -:20C9A00019FA3EBDF0B50C4600260078012117463546B1EB101F00D0FFDFFFDF3D800CB109 -:20C9C000268065800020F0BD2DE9FC4788461D461746814603210A9E03F06CF8040000D159 -:20C9E000FFDFCDE900563B46424621464846FFF793FEBDE8FC8738B50546A0F57F40FF38DD -:20CA00001CD0284603F061F9040000D1FFDF204602F052FD002810D001466A46204602F0BE -:20CA20006CFD0098B0F80500052807D10321284603F040F8C07808B1002038BD012038BD6A -:20CA40002DE9FF410546408803F03FF9040000D1FFDF03AA2046696800F0ADF9039C001F57 -:20CA600034F8032F618882420AD104290AD0052917D0062904D16888211D6B68F8F74DFF74 -:20CA8000BDE8FF811646241D2A4621463046F5F789FC0828F4D12A4621463046FAF7B9FE2C -:20CAA000EEE716466888032103F004F8014600208DF80000042EE3D36279002AE0D023791D -:20CAC00043F30000401C05D14F789742D8D10F783F07D5D0142B3CDA4FF002074FF6FF78DA -:20CAE000012B34D0122B02D0132B32D11DE00C2E2FD18B7803F07F03012B2AD0087820F051 -:20CB00000F00401C08706079487001208DF800002089ADF802006089ADF80400A089ADF84B -:20CB20000600E089ADF8080028E0062E11D1087820F00F0008706988012006F03BFA8DF8E2 -:20CB40000070ADF802802089ADF8040016E0062E05D0002894D06888FFF7BDFE90E70878C9 -:20CB600020F00F0008706988012006F023FA8DF800702089ADF80200ADF8048068882A462B -:20CB80006946F7F727F97BE7F8B50D460646032102F090FF040012D0207800F00F000128DF -:20CBA00010D06B460C2206213046FFF7FEFD58B12A4621463046009BFFF7D2FD08E043F255 -:20CBC0000200F8BD1120F8BD2868A0606868E060207820F00F00401C20700020F8BDF8B5F3 -:20CBE0000D460646032102F065FF040006D0207800F00F00012804D00820F8BD43F202009A -:20CC0000F8BD06226B4611463046FFF7CEFD30B12A4621463046009B00F0D6F800E02581EB -:20CC2000207820F00F0020700020F8BD2DE9F04F0F4691B08046032102F03CFF0446404606 -:20CC400003F055F84FF00009CDF82090CDF82490ADF834900546CDF82890CDF82C90CDF8E7 -:20CC60000890CDF80C90CDF8109004B9FFDF02AE05B9FFDFB2467F1EFFB219D328460CA91A -:20CC8000002202F0A2FA9DF83060092E00D3FFDF04EB46013246087C401E08740DA908A865 -:20CCA000FFF7FEFC1AF80610491C0AF80610E2E704F1300006900E381A4FDFF86CB0051D97 -:20CCC000059010E0DDE90501FFF708FD06463870092800D3FFDF5BF8261040468847608C68 -:20CCE000405DB04202D0A08C0028EBD109200E4E3870243620E00DA908A8FFF7EFFC0546AA -:20CD000004EB4507787CC00716D02946204600F054F808B987F811901AF8057056F825004B -:20CD200028B903E0500000209C0C0200FFDF56F82520394640469047BDF822000028DAD11E -:20CD400011B0BDE8F08F10B5032102F0B3FE040000D1FFDF122104F1100013F0A8FDA078B7 -:20CD600040F08000A07010BD70B50D46032102F0A1FE040000D1FFDF092D00D3FFDF2946F0 -:20CD8000204600F01AF8002803D004EB45020121517470BD70B50D46032102F08BFE044685 -:20CDA000294600F00AF820B9208E0121A940084000D0012070BD02F0A0BB00EB4100007C25 -:20CDC000002800D0012070471CB513241C704C785C7002245C809A800622CDE9002305231A -:20CDE000FFF79AFC1CBD000010B50AF047FB042803D00AF043FB052802D108F0F9FC28B9C8 -:20CE00000BF008FD20B107F0FEFB08B1012010BD002010BD0178406819B190F8711059B9B7 -:20CE200001E001F02EBF90F80C1129B190F80C01042801D0012070470020704770B50C46FC -:20CE40000546062102F036FE606008B1002006E00721284602F02EFE606018B101202070CD -:20CE6000002070BD022070BD2DE9FC470C4606466946FFF7E3FF00287DD19DF8000050B18C -:20CE800007F060FBB0427CD0214630460EF06BF9002873D12DE008F0ABF9B04271D0214614 -:20CEA00030460CF0BFFD002868D1019D95F8D00022E0012000E00020804695F835004FF0FE -:20CEC000010A4FF00009F0B195F8360080071AD584F8019084F800A084F80290A68095F83B -:20CEE0003710A171298F2181698F618185F8359044E0019D95F80C0158350028DBD1687EC0 -:20CF00000028D8D0D5E7304602F0F1FE070000D1FFDF384602F00DF940B184F801900E21D5 -:20CF20002170A680E08084F802A027E0304602F0CCFE070000D1FFDFB8F1000F21D03846A6 -:20CF400002F088F9B8B19DF8000038B90198D0F8F8004188B14201D180F80090304607F013 -:20CF6000A7F984F801900B21217084F80290A680A97EA17100E004E085F819900120BDE82A -:20CF8000FC870020FBE71CB56946FFF757FF00B1FFDF684601F083FEFB4900208968A1F8A3 -:20CFA000D2001CBD2DE9FC4104460E46062002F02BFD0546072002F027FD2844C7B2002503 -:20CFC000A8463E4417E02088401C80B22080B04202D34046A4F8008080B2B84204D3B042B6 -:20CFE00002D20020BDE8FC816946FFF727FF0028F8D06D1CEDB2AE42E5D84FF6FF70208037 -:20D000001220EFE738B54FF6FF70ADF800000DE00621BDF8000002F05FFD04460721BDF884 -:20D02000000002F059FD0CB100B1FFDF00216846FFF7B8FF0028EBD038BD2DE9F047D3A147 -:20D040000F79D1F8008007F0A1F910F0B3F9D14C4FF004091020A4F84690A4F848004FF68E -:20D06000FF76A4F86460A4F86660002584F8415004F83E5BC7492570A57142312573C1F833 -:20D0800009804F730931481E0CF095FEA5741B20A0824FF4A471E1822083618301212177A4 -:20D0A00061770321A17784F81F9020846084B948A1843E3805704680B3480C300570B54829 -:20D0C000103805704680BDE8F08770B5AE4C0D466060217007F0D4F8FFF794FFFFF7ADFF00 -:20D0E000207809F02AFE08F0C7F9217860680CF079FD20780FF094F928460BF048F807F028 -:20D100002CFA217860680EF021F9BDE8704010F051B910B501240AB1002010BD21B1012983 -:20D1200003D00024204610BD022111F03BFDF9E72DE9F047040000D1FFDF964D002695F8F3 -:20D14000410058B166701620207095F84200A07095F84300E07085F8416069E0287840B1F2 -:20D160003C22A91C204613F009FB102020702E705EE095F83E0060B10120E07095F83F006A -:20D18000A07095F8400060701120207085F83E604EE08048022166308246FFF703FF00B1E6 -:20D1A000FFDFB5F86690062002F02EFC0746072002F02AFC3844C7B2781C00F0FF0800BFE1 -:20D1C000B5F86600B84212D1204607F09DFF50BB95F8440070B36670132020702021A01CD1 -:20D1E00013F043FB0220A07085F8446020E040451AD1204607F070F9E0B12078132817D119 -:20D20000A0783C2814D1A088072102F053FC050000D1FFDF288807F04BF8A088072102F03C -:20D220005BFC00B1FFDF03E02146FFF71DFE08B1012048E702215046FFF7B4FE18B9B5F8C5 -:20D2400066104945BCD100203DE771E710B5514C207828B10A21BDE81040102001F0B3BC1E -:20D26000FFF7C2FD08B10C2002E010F0E9F800202071012060710A21E170207010BD70B5B0 -:20D28000444D0446287828B1BDE870403221102001F099BC207818B1012801D0122010E09F -:20D2A00001F09EFC20B110F016FA08B10C2008E0207801F068FC04F11703E21D611C10F0BD -:20D2C00017F92871012068713221E970287070BD70B5304C0546207828B1BDE870400B215C -:20D2E000102001F070BC287818B1012801D012200EE0FFF779FD08B10C2009E0287801F093 -:20D3000042FC691C10F063F808B1002000E007202071012060710B21E170207070BD10B58D -:20D320001C4C217829B13021BDE81040102001F04ABC008810F0D2F9302110B1002020718F -:20D3400000E0217101206071E170207010BD70B5104C0546207828B1BDE8704031211020A7 -:20D3600001F031BC01F03CFC08B10C2005E0287800F0010010F0ACF9002020710120607103 -:20D380003121E170207070BD54000020FFFFFFFF1F0000009206002010B5F74C207828B16D -:20D3A0003421BDE81040102001F00DBC01F018FC20B110F090F908B10C2002E010F0EFF82C -:20D3C00000202071012060713421E170207010BDE948017819B10F21102001F0F4BB002112 -:20D3E0000171102181700F21C170FF2181714FF6FF710181E14949680A7882728A88828189 -:20D400004988C181012141710170704710B5DA4C207828B12B21BDE81040102001F0D3BBB1 -:20D420000821A01D05F0B4FA00202071012060712B21E170207010BD70B5CF4C217829B113 -:20D44000BDE870404521102001F0BDBB90F90000042822D0092820D008281ED007281CD077 -:20D4600006281AD0052818D0022816D0032814D098B1011D11D010F1080F0ED010F10C0F06 -:20D480000BD010F1100F08D010F1140F05D010F1280F02D01220207103E0002506F0B3F84A -:20D4A00025714520E0700120607120706BE710B5B14C217829B12A21BDE81040102001F0B7 -:20D4C00082BBA31D012200F1100110F0E0FE002020711020A0702A20E0700120607120703F -:20D4E00010BD70B5A44C0546207828B1BDE870404821102001F067BB09F0C0FF052804D0D4 -:20D50000284609F0F8FB002000E00C202071012060714821E170207035E770B5964C05464A -:20D52000207828B1BDE870405721102001F04BBB09F0C6FC80B10BF060F968B12878012864 -:20D5400000D000200EF077FF00202071012060715721E170207016E70C20F6E770B5864C6E -:20D560000546207828B1BDE870404621102001F02ABB01F035FB38B10C2020710120607174 -:20D580004621E1702070FEE62946002006F0FFFE0020F2E770B5784C0546207828B1BDE89A -:20D5A00070404421102001F00EBB09F089FC50B10BF023F938B128780AF00DFE287808F0B0 -:20D5C00052F9002000E00C202071012060714421E1702070D7E670B5674C0546207828B1BA -:20D5E000BDE870401721102001F0EDBA01F0F8FA38B10C202071012060711721E170207042 -:20D60000C1E62946012006F0C2FE0020F2E738B5594D0446287828B1BDE838404F21102011 -:20D6200001F0D1BAA079E179884213D021791F2910D861791F290DD80022114612F0B0FB57 -:20D6400040B90022E079114612F0AAFB10B9207A072801D9122012E04FF6FF70ADF800006F -:20D660000BF0D8F890B909F009FF78B900216846FFF798FC50B1204605F0EAFE002028710E -:20D68000012068714F21E970287038BD0C20F6E72DE9FC47384C054694F83E0020B1282125 -:20D6A000112001F090FA6AE4282084F84000012184F83E10A8784FF000091A2825D00EDCF7 -:20D6C000162831D2DFE800F0303030303021303030303030303030303030302121212A281C -:20D6E00022D00BDCA0F11E000C281DD2DFE800F01C1C1C1C1C1C1C1C1C1C1C0D3A380428E9 -:20D7000012D2DFE800F0110211022888B0F5706F0AD21F20884684F83F0028886946FFF71B -:20D720008DFB18B1022019E0122017E09DF80000019F002806D007F5B777019E05D106F18B -:20D74000F10604E007F1F007F7E706F26F166846FFF760FB08B1387818B10C2084F83F008C -:20D760000DE487F80080A878307084F83F90684601F095FA03E4000092060020540000206D -:20D780007CB5F84C0546207820B12521102001F01AFA7CBD28886946FFF750FB0200F148D1 -:20D7A0004FF00001A0F13E000DD00222227140F8461F0171E1801020A0702520E070012060 -:20D7C000607120707CBD019A1346583282F83F109E68C0F846601E7B80F84A6092F83F6020 -:20D7E000002EF3D12888E080E5E710B540B10478406813B1B0F8480003E0B0F84A0000E018 -:20D80000FB201B2908D3814206D8B2F5A47F03D340F64800824201D9122010BD002010BD85 -:20D820002DE9FC41CF4D0446287828B1BDE8FC415221102001F0C7B94FF0010885F8058076 -:20D840001F2129711021A9705221E9702188E98085F8008020886946FFF7F0FA08B10220B7 -:20D860000DE02289E18801236846FFF7BEFF30B9A288618800236846FFF7B7FF10B128714F -:20D88000BDE8FC819DF800103A20019E002749B186F89181019991F8D21106F5C876C1B166 -:20D8A000287114E086F80981019991F82C1106F584760029F4D12F71E08870802089B080BF -:20D8C0006088F080A0883081012201990CE07770D6E72F71E08870802089B0806088F080A1 -:20D8E000A088308101990022304610F085FE86F80080ECE770B59B4D044686B0287830B1BB -:20D9000006B05321BDE87040102001F05CB90120687100262E711021A9705321E9702870E4 -:20D92000208803A9FFF78AFA18B10220287106B029E59DF80C0040B100220499E088B1F86F -:20D940004830984203D9C01A02E00122F5E70020E8806388B1F84A00834201D9181A00E0C7 -:20D9600000202881009601960296E088ADF802002089ADF804006088ADF80600A088ADF858 -:20D980000800684610F038FE2089BDF80410401A6881A088BDF80810401AA881E088BDF851 -:20D9A0000210401AE988884200DC0846E8806088BDF80610401A2989884200DC08462881D2 -:20D9C000B5E7034600200AB1012200E002221A4202D1490700D1122070477CB5614D0446FE -:20D9E000287820B13F21102001F0EDF87CBD012068711F2129711021A9703F21E9702870A8 -:20DA0000617820780122FFF7DCFF28B9A17820780022FFF7D6FF08B128717CBD6178207826 -:20DA20006B46012201F04AF9A178207801AB002201F044F99DF8000085F85A009DF804002C -:20DA400085F85B000020E7E770B5464D86B004461F200E4685F83F00208803A9FFF7EEF948 -:20DA600008B102200BE0E178A0780122FFF7A9FF28B92179A0780022FFF7A3FF10B185F823 -:20DA80003F0054E7E178A07802AB012201F016F92179A0786B46002201F010F99DF80800AF -:20DAA0009DF800100843400719D59DF80C00092438B90020049910F01BFD0499496A884293 -:20DAC0000AD89DF80C00012809D1049910F010FD0499496A884202D985F83F4027E79DF882 -:20DAE0000C3001203A220021002B049B93F898301BD0012B32D0049A82F89C01049A82F849 -:20DB00009A01049880F89B61049A9DF8080082F89D01049A9DF8000082F89E01049880F8A7 -:20DB20009C1100BF85F83F1001E7012B16D0049A82F81401049A82F81201049880F81361D3 -:20DB4000049A9DF8080082F81501049A9DF8000082F81601049880F81411E3E785F83F2057 -:20DB6000E5E60000920600201CB5FE4991F83E202AB1BDE81C405621112001F024B856225A -:20DB800081F84020012281F83E200188ADF8001081788DF80210C1788DF8031001798DF814 -:20DBA0000410C088ADF8060000216846FFF74CFF1CBD2DE9F041EB4C0546207828B1BDE896 -:20DBC000F0411D21102000F0FEBF1F272771012060711D21E170207009F050FC0C26042867 -:20DBE00045D0052843D0A9791220012904D019B1022901D003292BD1297809B1012927D113 -:20DC0000E97929B1012903D0022901D003291FD1698843F6FD720B1F3020934218D2AB88AE -:20DC20001B1F934214D2A4F84610A888A4F848004FF00008A87907F03EFDC0B1E87907F086 -:20DC400095FD012007F031FD20B12771BDE8F0812071FBE72878012801D018B109E000218D -:20DC6000022001E00021012007F0B2FD08B12671ECE784F80480E9E770B5BA4C217829B128 -:20DC8000BDE870401E21102000F09DBF1F212171012161711E22E270217002781221012AB3 -:20DCA00000D01AB9407818B1012801D0217133E400260C25012A08D009F0E0FB052802D070 -:20DCC00008F076FF78B1257126E407F00DFD012007F088FD00B1FFDFB4F84810B4F84600EB -:20DCE00009F0FBF8EEE7267116E42DE9F0479D4C07469246B4F85200B7F84A200E4690423A -:20DD000000D31046804697F85210104600F04BFFB4F85410814200D208460546A146B4F8C2 -:20DD20005640B7F84800844200D3044697F8511000F039FFB9F85810814200D208464FF41C -:20DD4000A4721B2C01D0904204D1B8F11B0F0DD095420BD0A6F8068035817480B0805246F6 -:20DD60003946304610F048FC01203070BDE8F0872DE9F04F85B00546AFF6F011794ED1E991 -:20DD8000009196F83E00884630B12121112000F01AFF05B0BDE8F08F1F2086F83F002120E5 -:20DDA00086F840004FF0010B86F83EB0284600F091FF002811D109F061FB05280CD009F09F -:20DDC0005DFB042808D096F8440028B907F010FAA0F57F41FF3901D00C20D5E0614801AAA0 -:20DDE0003E380190604802905E4806211038039004A801F02FFE04007ED0032110F069F899 -:20DE0000B6F85E00A4F84800B6F86000A4F84A0096F85A0084F84F0096F85B0084F85000B6 -:20DE200096F85D00009096F85C30B6F86020B6F85E10208801F0D2FE00B1FFDF208806F06D -:20DE400036FA218804F10D0000F0D9FE47A004F11107006800900321684604F024FD00202D -:20DE600069460A5C3A54401CC0B20328F9D3288A6080688AA080A88AE08094F8522094F87A -:20DE80005110B6F8620009F0A5F80146A062204609F0E4F84FF0000A84F85EA084F85FA0B9 -:20DEA0005746687900F06FFE6076D5F80600C4F81A006889E083C4F8089084F80C8084F8DC -:20DEC00000B1012204F584712046FFF70EFF8DF800700121684604F0E6FC9DF8000000F0F7 -:20DEE0000701C0F3C1021144C0F3401008448DF80000401D207600E015E0092801D2083077 -:20DF00002076002120460FF0E4FF287B07F0D3FB58B107F0E9FB69792879AA1D07F032FC47 -:20DF200007000ED01AE009202EE0208806F0C0F92088062101F0D0FD00283FF44DAFFFDFB2 -:20DF40004AE72146032007F043FC070006D16A882988204608F01DFF070012D0208806F04E -:20DF6000A7F905E09206002060000020112233002088062101F0B0FD00B1FFDF86F83F7055 -:20DF800007E7504684F8F4A086F83F0001E738B5FE4C207820B12221102000F014FE38BD3E -:20DFA0001F202071012565712220E070257094F8440010BB09F062FA052805D007F018F974 -:20DFC000A0F57F41FF3918D000202071684608F0D3FF0028E3D10098008806F069F90098B7 -:20DFE0000621008801F078FD00B1FFDFE84884F844500078FCF704F938BD0C20207138BD2E -:20E000002DE9F041E14D044695F83E0028B1BDE8F0412321112000F0D6BD1F2085F83F00D4 -:20E02000232085F84000012085F83E00618840F67B438A1F30209A4251D2A288961F9E4270 -:20E040004DD291424BD8E188B1F5FA7F47D2218940F67746A1F10A03B34240D2B1EBD20F4A -:20E060003DD96189A289914239D84FF000082088062101F01FFD06004FF0020707D000F059 -:20E0800000FE20B1D6F8F800017839B902E085F83F70DBE5D6F84011097809B13A201EE000 -:20E0A00005218171D6F8F8004146A0F80880D6F8F820A0885081D6F8F820E0889081D6F8CF -:20E0C000F8202089D081D6F8F800028943899A4204D88279082A01D89A4203D3122085F8F2 -:20E0E0003F00B3E522884280D6F8F800077085F83F10ABE5FEB5A54C0646207820B12421A6 -:20E10000102000F060FDFEBD012565712420E0702570304610F04BF808B1002000E01220FE -:20E1200020710028EFD1994884F84A5042303168C0F8091031794173002684F84A6069463A -:20E14000062001F042FC00B1FFDF684601F01BFC60B9BDF80470029880F80051684601F0E1 -:20E1600012FC18B9BDF80400B842F4D12671FEBD2DE9F041854D064695F83E0028B1BDE848 -:20E18000F0412C21112000F01EBD1F2085F83F002C2085F84000012085F83E003088062146 -:20E1A00001F088FC040007D000F06BFD20B1D4F8F810087830B901E0022026E0D4F8400193 -:20E1C000007808B13A2020E094200027005D10F0010F19D0D6F802004860D6F8060088604F -:20E1E00054F8F80F718910228181206806F10C010E3012F0C3FA21680320087021683088B0 -:20E20000488085F83F7021E50C2085F83F001DE510B586B004464088ADF81000049800F0CC -:20E220009FFD8DF80400A088ADF800002089ADF80200607B8DF80500A07B8DF80600D4F8C5 -:20E240000F00CDF80700B4F81300ADF80B00207B8DF80D00607D8DF80E00684606F037FA02 -:20E2600006B010BD70B5044680780C25800603D4607B06F0D0F918B12046FFF7C9FF054654 -:20E28000284614E5F0B5414E044689B030780C2730B109B01821BDE8F040102000F093BC6E -:20E2A0000AF0B8FA012500287AD16079002703282ED8A07901282BD8A07B032828D8607B82 -:20E2C00030B3072824D821792020052920D2DFE801F0040D03030400A0202188814217D34D -:20E2E0006088814214D8B0F5804F11D8FF208DF8040021790097BDF80000052940F010002E -:20E30000ADF8000015D2DFE801F0050A07150D00122745E040F0010040F0020006E040F0AA -:20E32000090001E040F0010040F00400ADF8000000E0FFDFBDF800000090BDF80000ADF88C -:20E3400006002088029060880390607B8DF8100060798DF81100A0798DF81200D4F80700A0 -:20E36000CDF81300B4F80B00ADF81700A07B8DF819007F208DF81C708DF81A008DF81D5058 -:20E380008DF81B508DF81E7004E0000092060020540000208DF81F7001A8FFF763FF074608 -:20E3A000377175711820F070357009B0F0BD38B504460078EF283ED8D4E90101884202D9EC -:20E3C000A078000737D56088ADF80000009800F0FFFC80B36188C806E07D02D501282AD1C0 -:20E3E00003E0012801D0032825D1607E012803D0022801D003281ED1207BE0B107281AD8E3 -:20E40000607B28B1012803D0022801D0032812D1A07B08B101280ED1607D28B1012803D0B5 -:20E42000022801D0032806D1E07E08B1012802D1A07E0F2801D9122038BDA068B0F1807FCE -:20E4400002D26068202803D2080701D4112038BD002038BD70B5FB4D0646287828B1BDE80D -:20E4600070404121102000F0AEBB0C240AF0D2F950B93046FFF79BFF040005D13046FFF7B7 -:20E48000F1FE040000D1A87101202C7168714121E97028700BE400781F2801D91220704744 -:20E4A00000207047F0B5E74C014689B0207830B109B01A21BDE8F040102000F084BB08463E -:20E4C000FFF7E9FF30B120711A20E0700120607120706AE7FF208DF8000003208DF8010042 -:20E4E00000278DF8027011F8016B8DF803601F226D4601A812F042F92771291D304606F07D -:20E500003DF9E1E7C1781F2907D84078042803D0032806D009B102E009B112207047112075 -:20E5200070470020704710B5C64C0246207828B14221BDE81040102000F045BB1046FFF7F9 -:20E54000E1FF30B120714220E07001206071207010BD00202071D078111D06F00FF9F2E76A -:20E5600010B5B84C217829B12021BDE81040102000F029BB01781F2902D91220207106E0E0 -:20E58000002121710278411C104606F0E5F81020A070012060712021E170207010BD7CB576 -:20E5A000A84D04460C20287162781220012A16D821780026012901D049B110E07AB105F06E -:20E5C000F1FF002876D00AF025F950B172E008F067FF044609F03AFD002860D06AE028715F -:20E5E00068E006F02DF8A07806F0DFF850B1012808D0042806D0002009F0F0FD00B1FFDF3A -:20E600002E7157E005F09EFFA0F57F41FF3951D10022072101A801F01DFA04004AD08A48F8 -:20E620000321846020460FF019FB204606F04DFAB5F85E0024F8480FB5F86000608015F83E -:20E640005A0FE07168782072A17A288909F086FE44F8200C28890121483C09F07FFE0146C9 -:20E660000022204608F068FFE8780090AB78EA88A98820885A3D01F0B1FA00B1FFDF2088EB -:20E6800005F015FE204609F0A9FD00B1FFDF2E71002204F5C8712046FFF727FB0AE02E71E4 -:20E6A00044B1208805F004FE2088072101F014FA00B1FFDF1020A8700120687128707CBD55 -:20E6C00060490A781AB14321102000F07CBA4322CA70012163E71CB55A4C217829B1BDE8F0 -:20E6E0001C401B21102000F06EBA00788DF8000001208DF80100FF208DF802000020ADF82B -:20E7000004008DF8060001466846FFF748FF1B20E0701CBD2DE9F0414A4C0646207828B13A -:20E72000BDE8F0412D21102000F04DBA3088072101F0C0F905004FF0010720D095F87101C9 -:20E7400040B995F86400112801D0122802D195F8B40150B10C2020711020A0702D20E070DB -:20E760003088E0806771277093E41022B11C05F5B97012F003F885F871710020EBE7022009 -:20E78000E9E770B52F4C0546207828B1BDE870402E21102000F017BA2888072101F08AF96C -:20E7A000022178B190F871212AB990F86420112A04D0122A02D00C20207104E080F871114C -:20E7C0000020F9E721711020A0702E20E0702888E08001206071207053E52DE9FC47194C41 -:20E7E0000646207828B13821102000F0ECF9BDE8FC8770884BF68032122190420AD848B10B -:20E800004FF0000830886946FEF718FB20B10220207110E021710EE0019800F15809851CC2 -:20E820002F887288394648460FF0E6F92888B842F6D184F80480012060713821E17020709F -:20E84000D5E7000092060020540000207CB5FF4C0546207820B14B21102000F0B4F97CBD2E -:20E8600028886946FEF7EAFA38B102202071012060714B21E17020707CBD01987F220146CB -:20E8800080F8602080F86120002280F86220A87801F82C0FE8784870287988702271E6E706 -:20E8A0001CB5EA4C217821B15821102000F08BF91CBD00886946FEF7C1FA48B1022020715D -:20E8C000012060715821E1701021A17020701CBD019890F8710000B1012000212171A071A9 -:20E8E000EEE71CB5D94C217821B11321102000F06AF91CBD00886946FEF7A0FA08B10220B1 -:20E9000005E0019890F82C10012902D00C20207106E0602100222271095C21720088E08000 -:20E92000012060711321E1701021A17020701CBD2DE9F041C54C0546207828B1BDE8F041CB -:20E940004C21102000F03FB92888072101F0B2F8012358B382886D88C688418803EB420743 -:20E96000BD4217D342F210777E43BF107943B6FBF1F1491E89B24FF4FA76B14200D931467C -:20E980008D4200D22946491C521CB1FBF2F15143491E8AB290F8A01101B90284E2800020D3 -:20E9A000207163714C20E07023702CE40220F7E770B5A64C0546207828B1BDE870404E21FC -:20E9C000102000F000B92888072101F073F890B1A97811F0010180F8DF1004D090F8DD1015 -:20E9E00009B109F0EBFC00202071012060714E21E170207045E40220F6E794490A781AB138 -:20EA00005421102000F0DFB802789AB142788AB142881B2A0ED382881B2A0BD3C288022A7D -:20EA200008D38A4A0368423242F81A3F40685060002000E012200871012048715422CA7028 -:20EA40000870704770B5814C0546207828B1BDE870405521102000F0B6B8287800F00100EF -:20EA600008F0B5FA287800F0010009F043FC00202071012060715521E17020700AE570B518 -:20EA8000724D0646287828B1BDE870405921102000F099B801227088114608F09BFA044669 -:20EAA0007088012109F05AFC844200D204463088012100F06FF806460121002000F06AF8FA -:20EAC000304401219630844206D900F19601201AB0FBF1F0401C81B2E98000202871012015 -:20EAE00068715921E9702870D4E470B5574D0446287828B1BDE870405021102000F063B88D -:20EB000000F06EF808B10C200DE0601C0EF01EFF207800F0010005F08EFD207800F00100A4 -:20EB200006F0DDFD00202871012068715021E9702870AFE470B5454C0546207828B1BDE846 -:20EB400070404D21102000F03EB809F063FE08B10C2003E0287805F023FE002020710120D7 -:20EB600060714D21E170207094E410B501785A2907D2374A52F8211019B1001D8847012090 -:20EB800010BD002010BD18B1022801D00120704700207047012903D080002C3080B2704786 -:20EBA000C0005030FAE7032904D0022907D0C000703006E04FF4747101EB801001E08000E7 -:20EBC0003C3080B27047214A92F84130002B06D182F8420082F84310012082F8410070475C -:20EBE00010B508F04BFC042807D008F047FC052803D009F00FFE002800D0012010BD2DE9D1 -:20EC0000FE4300250F4680460A260421404603F0BFFE40460FF0A7FA062000F0F5FE04466F -:20EC20001AE06946062000F0D0FE0AE0BDF80400B84206D00298042241460D3011F072FDE0 -:20EC400078B1684600F09FFE050003E092060020E40C0200EAD0641E002C06DD002DE0D096 -:20EC600005E040460FF088FAF5E705B9FFDFD8F800000EF0CBFF761E01D00028C5D0BDE8D1 -:20EC8000FE8390F8711041B990F8D01029B190F8D000042801D00120704700207047017831 -:20ECA00001290AD1416891F8DD20002A05D0002281F8DD20406809F081BB70470AB1012217 -:20ECC00000E00222024201D0072001E001F007001870704710B5038843F6FD711A1F8A42E0 -:20ECE00023D24288141F8C421FD29A421DD8C28940F67B43911F994217D2018A8C1F9C42CB -:20ED000013D28A4211D8428AB2F5FA7F0DD2828A40F67744A2F10A03A34206D2B2EBD10FB7 -:20ED200003D9C18A028B914201D9302010BD017911B1012910D107E0417929B1012903D096 -:20ED4000022901D0032907D1007B38B1012805D0022803D0032801D0122010BD002010BD6C -:20ED600080B200B5C1074FEA807112D000294FEA007104DA002926DB410727D523E000298D -:20ED80004FEA407119DA00291DDAC0061ED5012000BD00294FEA007107DA002913DB4107CC -:20EDA00011D4C00612D5022000BD00290BDB410709D4C0060AD5032000BD002903DAC0065D -:20EDC00004D5042000BDC00600D5FFDF002000BD80B2C10605D4010713D4C1070FD0800734 -:20EDE0000BE0C1074FEA807104D0002902DB400705D406E0010704D44007002801DB01200A -:20EE000070470020704720B100234360021D01810260081D7047026800212AB193881268F3 -:20EE2000194489B2002AF9D100234360021D01810260704730B4026800230AB30268938813 -:20EE40008B421EBF1368002B1046F7D1B2F804C013468C4508BF116811D001F10804A5B236 -:20EE60000024AC4538BF00230AD3ACEB010C11440C60A1F804C00268126802600A600160B3 -:20EE800030BC1846704700230B608A8002680A600160704708440830424301F14A00104454 -:20EEA00080B27047F0B51D460446A818059B083000FB03F205F14A00104486B2B14238BFD9 -:20EEC000FFDF002727606760A760E76027616761A761E76127624FF6FF706762A082A6F132 -:20EEE000280080B265776080B0F5004F88BFFFDF608805F13C01884238BFFFDF6088401BE6 -:20EF00003C3880B220801B2838BF1B202080A777F0BD8161886170472DE9F04F0D46C18858 -:20EF2000044600F12808008921F4004320F4004221F4004620F400474FF0010A4FF00009E7 -:20EF40009A4208D100F4004001F4004188421CBF0020BDE8F08FB7420BD9617FB81B401ABF -:20EF6000083885421BDC08EB06000021058041801EE06088617F801B401AB0F1080B0ED4E2 -:20EF8000BBF11B0FB8BFFFDF5D45D4BF29461FFA8BF1681A0204120C18BFBA4204DD84F837 -:20EFA00017900020BDE8F08F08EB06000180428084F817A0BDE8F08F2DE9F041044600F151 -:20EFC0002802C08820F40043E07D002808BFBDE8F081D0180288438813448B423CBF00208A -:20EFE000BDE8F081002791429CBF0180478013D9891A0D042D0C45800ED0E088A61D20F4A3 -:20F000000040854288BFFFDF30884FF4004121EA0000284330800AE0627F008802F1080311 -:20F020001044083081B26288A01D00F0A8FBE7750120BDE8F08130B4B0F804C0C48803465F -:20F0400000F128052CF400402844A44503D10020188230BC7047B3F80CC00488A44509D3E4 -:20F060004088ACEB040CA0EB0C0084B20CEB0500C01E06E0A4EB0C045D7FA4B2AC4460442F -:20F08000401DB1F800C0A44588BF0C80B3F80CC0BCF1000F0CBF4FF0010C4FF0000C82F8DF -:20F0A00000C00988198230BC70472DE9F041044600F12801808820F400404518208A00288B -:20F0C00008BFBDE8F081A08910B9A069807F2871A089218A084480B2A08129886A88114455 -:20F0E000814238BFFFDF28886D88A2894119002791421AD175B1A088261D20F40040A8429A -:20F1000038BFFFDF30884FF4004121EA00002843308009E0627F1044083081B202F1080331 -:20F120006288201D00F02BFBA78127820120BDE8F0812DE9F0474189B0F8048000270446D6 -:20F1400000F1280A414518BF4FF400493AD000BF21F40040504446886EB1608904F10A0517 -:20F1600020F40040B04238BFFFDF288829EA00003043288021E0637F008803F1080C1844C7 -:20F180006389083023F400456288284480B204F10A0190420BD2121A92B20CF11B0C62457D -:20F1A0002CBF03F4004229EA030004D204E0801A80B229EA030210430880781C618987B2E5 -:20F1C0004145C5D13846BDE8F0872DE9F047B0F808800B46044600F12801B0F80A908088FD -:20F1E00028F4004C01EB0C05804504BF0020BDE8F087002A1CBF681D106023B1627F691DB1 -:20F20000184611F0BBFA2F886D888DB1E81987B2208904F1080620F40040A84238BFFFDFF7 -:20F2200030884FF4004121EA0000284330800AE0607F6288C119083100F1080389B204F17A -:20F24000080000F09CFAC84504BF208960813846BDE8F0878188C08881420CBF012000200C -:20F2600070470189808881420CBF01200020704730B48488C28800F1280324F4004C22F4EF -:20F280000041634494421BD08289048A15191C885A88A3189D4216D312B18A4210D212E092 -:20F2A000437F0CF1080C1A196244408892B2801A80B22333984201D211B104E08A4202D182 -:20F2C00030BC0020704730BC012070472DE9F007B0F806C0048900F1280702462CF40045D2 -:20F2E0007E1924F400492CF4004A002024F400434FF00108D1450AD104F400440CF4004C70 -:20F30000644504D05082BDE8F00700207047AB4208D992F81DC05B1BA3EB0C03A3F1080443 -:20F32000002308E0B2F802C0547FACEB050CACEB040CACF10804002CE4DBB2F80EC0BCF17B -:20F34000000F0DD0B6F800C075884DB15B1B10778B42D7DBD0893844A0EB0C00C01E09E0A9 -:20F36000A4EB0C0410778C4208DB507FD38918443044401D5182BDE8F00770478B42A8BF04 -:20F3800082F81C80E6DABDE72DE9F05F044600F1280AC088934620F400400AEB0005608AC8 -:20F3A000894608B1484502D20020BDE8F09FE08980B1B5F800806E8808EB0601884218BFB8 -:20F3C000FFDF207F4FF0000750EA060108D0002840D04AE04FF00008A17F46462971F0E78B -:20F3E000E08948B1617F01444819B4F81F10A0F8051094F82110C171E18908EB09004944BB -:20F40000E18128806F80BBF1000F19D0607F298800F108030144083189B26288A01D00F073 -:20F42000AEF9E781A07F401CA077A07D00281CBFE088A082A7756782E7750120BDE8F09FCB -:20F44000607FE18908442844B0F80510A4F81F10C0792EE0E089B4F81F105044A0EB080071 -:20F4600020F8031D94F82110817006EB090086B2E089BBF1000F4844E081A5F800806E8058 -:20F480000ED0E088A51D20F40040B04238BFFFDF28884FF4004121EA000030432880C0E748 -:20F4A000E0895044A0EB080030F8031DA4F81F10807884F82100BEE7818800F1280221F436 -:20F4C000004C6244B0F814C0C388614518BF99420FD0818969B9806968B10189838899429E -:20F4E00009D021F400412830084411790079884201D1002070471046704700F12803407FDB -:20F5000001F1050C604410600888002804BFD81E106008884988084480B270472DE9F04116 -:20F5200015460A4600F128061C46407F531D034410885788069900281CBFC01C80B226D00C -:20F5400088429CBF081A80B213D9401AA042A8BF20461FFA80F858184246294611F0E2F86A -:20F56000002818BFBDE8F0814544A4EB080084B2002001198F423CBF4FF0FF30BDE8F08196 -:20F58000304422462946BDE8F04111F0CBB8FA1C97B2F61ED4E72DE9F04100F128071D46CE -:20F5A000407F4B1D0344164608880024B1F80280069A00281CBFC01C80B21FD090429CBFD5 -:20F5C000101A80B20DD9801AA842A8BF284684B299182246304611F0D1F8281B85B226441D -:20F5E00000204119414506D839182A46304611F0C5F8601984B22046BDE8F08108F1030110 -:20F600001FFA81F8FF1ED9E72DE9F04116460A4600F128071D46407F531D034410880024D3 -:20F62000B2F80280069900281CBFC01C80B21FD088429CBF081A80B20DD9401AA842A8BFF5 -:20F64000284684B258182246314611F097F8281B85B2264400204119414506D838442A4679 -:20F66000314611F08BF8601984B22046BDE8F08108F103021FFA82F8FF1ED9E7401D7047E2 -:20F6800070B5044600F12801C288808820F400431944904208D0A289002A04BF228A002A43 -:20F6A00002D1A28A904201D1002070BDB1F800C04D8885B1261D20F40040A84238BFFFDF90 -:20F6C00030884FF4004121EA00002843308000202082012070BD607F0CF1080100F10803D7 -:20F6E000084481B26288201D00F049F8EFE70021C18101774182C1758175704703881380BE -:20F70000C289002A04BF00207047C28800F1280322F400421A440A60C089704710B5044645 -:20F72000808AA0F57F41FF3918BFFFDFE088A082E089002818BF0120A07510BD4FF6FF71D3 -:20F74000818200218175704710B50446808AA0F57F41FF3908BFFFDFA07D28B9A088A18A3C -:20F76000884204BF002010BD012010BD8188828A914205BF807D002800200120704710B494 -:20F78000B0F800C02CF40044214489B24FF4004491420AD2521A92B21B339A422CBF0CF402 -:20F7A000004224EA0C0104D204E0891A89B224EA0C021143018010BC704770B516464FF61A -:20F7C000FC72C91C01EA0205D8B10446C01C20F00301A14200D0FFDF201D012108E0024601 -:20F7E000284401D2034600E00023491CC9B21360B142F4D916B104F1040001E04FF000008B -:20F80000206005FB06F000F1040070BD024600201168002902D00846096811607047026823 -:20F820000A60016070474FF6FC73C91C1940101A001F90FBF1F0C0B270474FF6FC73C91CDD -:20F840001940001D01FB0200704700002DE9F041C14D04469046A8780E46A04200D8FFDFFC -:20F8600005EB8607B86A50F8240000B1FFDFB868FFF7CCFF05000CD0B86A082E40F8245028 -:20F8800000D3FFDFB5484246294650F82630204698472846BDE8F0812DE9F0471E460400A7 -:20F8A000074602EB060091468A46C5B227D000218846FF2800D9FFDFE01C20F00300A04235 -:20F8C00000D0FFDFB24500D9FFDFA34880F800A080F801908570C570057145718671DFF89C -:20F8E0007CA280F8079000260AF1400A8146FF1C27F003000746B8F1000F03D005E04FF078 -:20F900000101D5E709EB860188603AF8161019F8062001D04FF00000FFF74FFF761CF6B2A9 -:20F920000744082EE3D3FF1C27F003002A460646B8F1000F0DD000200221FFF73EFF43460B -:20F94000002130440F46C846C01C20F003021BB110E0C9F84800EFE708EB81060020B26275 -:20F9600006E000BFD6F828C04CF82070401CC0B2A842F7D3491CC9B202EB85000829E3D39D -:20F98000001BBDE8F08710B5044603F07DFB08B1102010BD2078704A618802EB800092784E -:20F9A0000EE0836A53F8213043B14A1C6280A180806A50F82100A060002010BD491C89B293 -:20F9C0008A42EED86180052010BD70B505460C46084603F059FB08B1102070BD082D01D34C -:20F9E000072070BD25700020608070BD0EB56946FFF7EBFF00B1FFDF6846FFF7C4FF08B1F0 -:20FA000000200EBD01200EBD10B50446082800D3FFDF5148005D10BD3EB50546002469464B -:20FA2000FFF7D3FF18B1FFDF01E0641CE4B26846FFF7A9FF0028F8D02846FFF7E5FF001BC1 -:20FA4000C0B23EBD44498978814201D9C0B27047FF2070472DE9F04190460C460546062926 -:20FA600001D0072C10D13C4FB86CFFF7CFFE02004FF6FF7604D00221B86CFFF7D4FE00E0B0 -:20FA800030462880B04201D1002003E742462146FFF7DCFE040002D1288800F04FF8204697 -:20FAA000F8E6A0F57F43FF3B01D0082901D300207047CBE6A0F57F42FF3A0BD0082909D203 -:20FAC000254A9378834205D902EB8101896A51F820007047002070472DE9F04105460C46CC -:20FAE000A5F57F4143F20200FF3902D0082C01D30720CFE618494FF000088A78AA42F8D920 -:20FB000001EB8406B26A52F82570002FF1D013483946203050F8242028469047B16A062C3C -:20FB200041F8258001D0072C02D1284600F006F83946B068FFF773FE0020ABE610B5064CEE -:20FB4000C2B20221A06CFFF778FE0146A06CBDE81040FFF764BE0000FC0600204C0E0200B8 -:20FB600070B50E461D46114600F0D5F804462946304600F0D9F82044001D70BD2DE9F041B0 -:20FB800090460D4604004FF0000610D00027E01C20F00300A04200D0FFDFE5B14146002010 -:20FBA000FFF731F90C3000EB850617B113E00127EDE7624F04F10C00A9003C60257260606E -:20FBC00000EB85002060606810F071FE386841460068FFF718F93046BDE8F0812DE9FF4F78 -:20FBE000564C804681B020689A46934600B9FFDF2068027A424503D9416851F8280020B142 -:20FC000043F2020005B0BDE8F08F5146029800F082F886B258460E9900F086F885B270198E -:20FC2000001D87B22068A14639460068FFF702F904001FD0678025802946201D0E9D074604 -:20FC40005A4601230095FFF72DF92088314638440123029ACDF800A0FFF724F92088C119DA -:20FC60003846FFF756F9D9F800004168002041F82840C7E70420C5E770B5304C0546206894 -:20FC800000B9FFDF2068017AA9420ED9426852F8251051B1002342F825304A880068FFF7EB -:20FCA000F2F8216800200A7A08E043F2020070BD4B6853F8203033B9401CC0B28242F7D846 -:20FCC0000868FFF7A8F8002070BD70B51B4E05460024306800B9FFDF3068017AA94204D9CA -:20FCE000406850F8250000B1041D204670BD70B5124E05460024306800B9FFDF3068017A54 -:20FD0000A94206D9406850F8251011B131F8040B4418204670BD10B50A460121FFF7BAF82C -:20FD2000C01C20F0030010BD10B50A460121FFF7B1F8C01C20F0030010BD000068000020ED -:20FD400070B5044600780E4601281AD0072802D00C281AD115E0A068216905780B2D0CD01D -:20FD6000052003F027F9052D0FD0782300220520D4F8101003F07EF807E078230022062039 -:20FD8000F8E70520216903F015F931462046BDE8704001F0ADB910B500F13902C379947812 -:20FDA000411D64F003042340C371DB070DD04B79547923404B710B79127913400B718278AC -:20FDC000C9788A4200D9817010BD00224A710A71F5E74178012900D00C21017070472DE92D -:20FDE000F74F86B000208C690D468DF8040009780127FA4816464FF0070A4FF011094FF067 -:20FE00000A0B2A2978D2DFE811F02A00110352036903A803B303CC03FA030F043B04620484 -:20FE200081049A04D504E604050510053005540577059C05C605E005EE050F0627063006F7 -:20FE400063068506D6060D071B074B076A0779078A07C407FB072708E407E807ED0714B139 -:20FE600020781D2829D0D5F808805FEA080043D001208DF80400686A059003208DF8080032 -:20FE80008DF809B0286A0390A8880028EFD098F8001091B10F2910D27ED2DFE801F07D1453 -:20FEA0004CDCFDFCFBFAF9F8F7089FF6F500022822D124B120780C2801D0002770E3022087 -:20FEC0008DF80400ACE10620696A03F073F8A8880728EDD1204601F006F9022809D02046D9 -:20FEE00001F001F9032808D9204601F0FCF8072803D20120207005E011E2002CB7D02078E8 -:20FF00000128D5D198F80400C11F0A2903D300BF85F81CB089E2A070D8F80010A163B8F87E -:20FF20000410A18798F8060084F83E00012028700320207046E00728BAD1002C97D02078BE -:20FF40000D28B5D198F8031094F83B20C1F3C000C2F3C002104201D00E2000E00F20890781 -:20FF600007D198F805100142D2D198F806100142CED194F83D2098F8051020EA02021142A7 -:20FF8000C6D194F83E2098F8061090430142BFD198F80400C11F00E045E20A29B8D2617F7C -:20FFA000814201D90620C2E3D8F800106160B8F80410218198F80600A072012028700E2043 -:20FFC000207003208DF80400686A059004F139000290601D03901730049067E2412890D1C0 -:20FFE000204601F080F8042802D1E078C00704D1204601F078F80F289ED1A88CEF6880B215 -:020000040001F9 -:200000004FF0400AD4F82480FFF75FFE39460827424653460097FFF7BEFA0E208DF80400C9 -:20002000686A0590606A0290002101A8FFF788FE2078042806D0A07F38B1012805D00328EC -:2000400006D0AEE3052020700BE284F8009034E71220207066E01128C1D1204601F043F80B -:20006000042802D1E078C00719D0204601F03BF8062805D1E078C00711D1A07F02280ED0C3 -:20008000204601F030F808E0AFE07DE09AE16EE14EE106E1E5E0CBE01CE011289FD11022E6 -:2000A00008F1010104F1480010F068FB607801280DD012202070E078C00703D0A07F88B3B9 -:2000C00001282FD085F800B08DF804B0F0E384F800A027E011288FD1204601F004F8082880 -:2000E00004D0204600F0FFFF132885D12869D8B16869C8B104F17800102208F101010746FC -:2001000010F03CFB2078082812D014202070E078C0070FD0A07F022818D06178022912D025 -:200120000328CFD10420FDE300208DF80400F6E00920EBE70B202870296901204870206CBC -:20014000C1E9010792E208B1012870D10B202870296981F801A0606A4860206AC1E9020738 -:2001600078E2206CE2780068C2F34402521ED04000F0010040F0800000E000200874E06AF5 -:2001800048617CE20746F9E31128D0D1204600F0AAFF0A2802D1E078C00704D1204600F007 -:2001A000A2FF1528C3D1102208F1010104F1480010F0E4FA20780A2812D0162020701220E1 -:2001C000287029690920487004F158004860203088601038C860206C0861ACE3C40F02001E -:2001E0000B202070E4E22870D9E102289FD1204600F079FF042804D3204600F074FF0828C8 -:2002000009D3204600F06FFF0E2890D3204600F06AFF12288BD2A07F022888D18DF8049094 -:20022000686A059098F801008DF80800FBE36CE20228AAD1204600F056FF00286FD02046F0 -:2002400000F051FF0128F9D0204600F04CFF0C28F4D005208DF8080098F801008DF8090002 -:2002600065E71128FCD1002CFAD020781728F7D16178E06A022912D05FF0000101EB4101E9 -:20028000182606EBC1011022405808F1010110F075FA0520696A00F019FF26700DE601218E -:2002A000ECE70B28DCD1002CDAD020781828D7D16178E06A02292CD05FF0000101EB41016D -:2002C000102202EBC1014158B8F8010008806078E16A022820D0002000EB4002142000EBC2 -:2002E000C2000958404650F8032F0A60406848600520696A00F0EAFE6078022810D04FF030 -:2003000000002044407A20F001000CD14FF001010BE04FF00101D1E74FF00100DCE77FE248 -:200320004FF00100EDE74FF000012144487279E3112895D1002C93D02078192890D16078AE -:20034000E16A022811D0002000EB40021C2000EBC2001022085808F1010110F00FFA052056 -:20036000696A00F0B3FE1A20F5E00120ECE7082898D1002C98D020781A2893D1E06A98F8C1 -:200380000120017862F347010170E16AD8F8022041F8012FB8F8060088800520696A00F069 -:2003A00095FE6078022807D04FF000002044407A20F002012BD033E04FF00100F6E72044D2 -:2003C00041722FE31128B4D1002CB4D020781B28AFD16178E06A02291CD0002101EB410106 -:2003E000202202EBC1011022405808F1010110F0C5F90520696A00F069FE607802280CD05C -:200400004FF000002044407A20F0040108D14FF00100D4E74FF00101E0E74FF00100F1E776 -:200420004FF00000CBE785F81CA0FAE33078012884D11C2204F11C00716810F0E4F9E07931 -:20044000C10894F83B0001EAD001E07861F30000E070217FF1BB217803290AD0C0073FF46F -:20046000F9AD032028708DF804B0686A059041209EE3607FA17888423FF694AD02272771A0 -:20048000E179204621F0E001E171617A21F0F0016172A17A21F0F001A172FFF77CFC2F706B -:2004A0008DF804B0686A05908DF808A0F2E33078112888D18DF804A0696A0591B168039121 -:2004C000ADF808A008466168016021898180A17A817100E06AE004202070A4E2307811285A -:2004E000A6D18DF804A0686A0590301D02AB07C883E807004120ADF8080008460C210170C0 -:20050000A88CD6F80C8080B24027D4F82090FFF7EEFB41464FF008084A463B46CDF800802D -:20052000FFF772F8002101A8FFF70AFCE07820F03E00801CE0702078052801D00F200AE054 -:20054000A07F00283FF4C3AD0128FBD003287DD184F80080B1E42070AFE430780328A8D144 -:2005600070680168A1664068E0660520287035E2317803299DD171680A68226749686167E1 -:20058000216C51B9A17F19B1012901D0062029E185F800A02064606401E085F800A0032722 -:2005A000F3E33178022984D1317909B1297737E1A17F022910D00329EFD16178012910D026 -:2005C000A17994F83A2001290FD02064E178C90713D0012A0ED010E0B0680028E7D020640E -:2005E0000BE0A27994F83A10EDE7B1680029DED02164EBE7F0680028D9D06064CDE78DF8DE -:2006000004B0696A0591E1785846C90709D06178022903D1A17F29B1012903D0A17F032902 -:2006200000D00820287012E230781128BFD1B068286209202870E0782969C0070FD081F859 -:2006400001A0206A4860606A886000E0ABE004F16800C860A07F02287FF48FAD81E50120A6 -:200660004870206C486004F16800886004F13800C860201D0861206B4861606B88611FE265 -:20068000E1783078C90701D0062100E00A2188428DD12078072817D084F800908DF804A07B -:2006A000686A0590286A0390ADF80890032100F8011B1022716810F061F8002101A8FFF715 -:2006C0003FFB00202862C2E408202070E6E730781128ABD18DF804A0686A0590B068039073 -:2006E000ADF80890042100F8011B102204F1680110F044F8002101A8FFF722FB2078092812 -:2007000001D0132027E784F800B016E0E1783078C90701D0062100E00A21884286D110227E -:2007200004F1480071680FF0FDFF10B104202877A2E3207809283FF4C5AC0C2053E5E07876 -:20074000C10735D0A17F012902D002291BD02CE00D202870296981F801B06078012809D033 -:20076000206A4860606A886004F16800C8601030086104E5606A4860206A886004F178002D -:20078000C8601038F4E7C0F3440114290DD24FF0006101EBB0104FEAB060E0706078012814 -:2007A00001D0102055E40620D5E6607801288AD00E2018E5307809288BD185F800B0102006 -:2007C0008DF80400686A059070680290002101A8FFF7B6FAE9E7E078C00706D0A07F012842 -:2007E0001FD10F2028700420F8E015202870296902204870206C48606078012805D004F10E -:20080000780088601038C8605AE104F1680088601030F8E730780228CED1307908B12877F7 -:2008200028E3102028700F20D8E030781328F7D185F800902969082048707068486060787C -:2008400001280DD004F1680088601030C860206B0861606B486104F158008861A06A21E03C -:2008600004F1780088601038F0E730780728D7D1607801281AD1A078A16A0A18C0F1100192 -:2008800010460FF0F2FF1220287029690920487004F158004860203088601038C860206CAC -:2008A000086141E0C861E06A086209E11320C9E0CBE030780828B3D1102204F148007168BC -:2008C0000FF030FF08B10B2031E720780B28EDD02046FFF760FAA078A16A0A18C0F11001A9 -:2008E00010460FF0C2FF1620287008208DF80400686A0590002049E03078112890D1B06859 -:2009000028621420287029690920487004F158004860103088601030C860606C086160787C -:20092000012800E09EE006D004F139004861206B8861606BB6E7601D4861606B8861206B42 -:20094000B0E73078082892D18DF804A0686A0590286A0390ADF808900D2100F8011B10225F -:2009600071680FF00BFF002101A8FFF7E9F9002028626178012902D01520ECE569E21621EC -:20098000297008218DF80410696A05910290A0788DF80C007EE130780B288CD116202870F3 -:2009A0006078022802D12046FFF7F5F9A07871680A18C0F1100110460FF057FF08208DF8EB -:2009C0000400686A05907068E0E730780F2895D1E079C0077BD01720287009208DF80400DC -:2009E000686A059056E13078102887D11422311D04F11C000FF007FFE16A208DA1F80900ED -:200A0000E16AA078C871E179E26A01F003011172E16A627A0A73E16AA07A81F8240060789E -:200A2000012876D0B3E13EE26078022801D0012000E000202044407AC0070BD0E078C007C0 -:200A400008D1192028708DF804B0686A05908DF808901FE11E2071E63078112874D1B0685C -:200A600028621A2028700520B8E7307803286BD16078E26A022801D0012000E0002000EB1C -:200A80004001142000EBC1015158726813680B6052684A601B212970D5E9041205234B70DB -:200AA000636A4B606778E36A022F01D0012700E0002707EB470700EBC7001858C1E9020251 -:200AC000686A4862069800F02AFBFFF75BBB87E130780E2838D16078E26A022801D001204C -:200AE00000E0002000EB4000102101EBC00002231058093271680EF055FA1C20287029699A -:200B000004204870206A4860E06A09308860FA4879E65AE130780D2816D16178E06A02296E -:200B200001D0012100E0002101EB4101182707EBC101A278405871680FF020FE6178E06AD5 -:200B4000022902D0012101E0A9E0002101EB410107EBC1014058A1780844C1F110010FF04A -:200B600084FE8DF804A0686A0590286A0390ADF80890062101706278E16A022A01D0012224 -:200B800000E0002202EB420207EBC202401C895810220FF0F3FD002101A8FFF7D1F8002065 -:200BA00028621D2028708DF804B0686A05900B208DF808006EE03078112870D18DF804A0E5 -:200BC000686A0590B06803900B20ADF80800039880F800A06278E16A022A01D0012200E053 -:200BE000002202EB4202102303EBC20289580988A0F801106178E26A022901D0012100E07F -:200C0000002101EB4103142101EBC30151580A6840F8032F49684160002101A8FFF790F87F -:200C200018E729E16078022801D0012000E000202044407A800701D51F2003E721207DE570 -:200C4000307811282BD18DF804A0686A0590B0680390ADF80890082707706178E26A022949 -:200C600001D0012100E0002101EB41031C2101EBC301401C515810220FF080FD002101A8E6 -:200C8000FFF75EF8202028708DF804B0686A05908DF80870314601A8FFF752F815E775E0E2 -:200CA0003078112872D18DF804A0686A0590B06803900820ADF80800039809210170E16980 -:200CC000097849084170E16951F8012FC0F802208988C180002101A8FFF732F8AEE760784B -:200CE000022801D0012100E000212144497A490701D52220A6E6012849D068E0307811284F -:200D000044D1B068286223202870296904204870206A4860E06A09308860784873E5307876 -:200D20000D2833D16178E06A022901D0012100E0002101EB4101202707EBC1011022405845 -:200D400071680FF01BFD8DF804A0686A0590286A0390ADF8089080F800B06278E16A022A38 -:200D600001D0012200E0002202EB420207EBC202401C895810220FF001FD002101A8FEF76B -:200D8000DFFF002028626078B5E791E037E02420D4E4607802280BD000202044407AC107F0 -:200DA00002D0E178C90705D0810705D51920A9E40120F2E71720A5E4400701D51B20A1E4A4 -:200DC0001C2020706078012801D01820B6E42720B4E4282028700B2000E63078122849D1D7 -:200DE0002920ABE42078012844D00C2842D02046FEF7EFFF0C208DF80400686A059039E082 -:200E000030784FF02608112805D012203070032785F800804CE08DF804A0686A0590B068E2 -:200E200003900220ADF80800039805210170297F4170002101A8FEF783FF0B208DF80400D0 -:200E4000686A0590314601A8FEF77AFF074685F80080012F0ED02BE001208DF80400686ABE -:200E6000059004208DF80800287F8DF809000020287712E0287F80B11D20207025202870C4 -:200E80008DF804B0686A059002208DF80800314601A8FEF755FF07460AE00CB1FE202070F8 -:200EA0009DF8040020B1002101A8FEF749FF0AE409B03846BDE8F08F2DE9F04F85B00C469C -:200EC0004E69002190468DF8041001272278BA464FF00209072022B1012A51D0022A20D15C -:200EE000CAE0217901290BD0022916D0032911D0042916D11CE00000BC0F0200FE2F000081 -:200F0000707801280CD10620616A02F029F8002807D11CE01D20307019E07178022901D028 -:200F2000052798E031780C2929D18DF8040010E0B07F022823D13078011F042904D30A3960 -:200F4000032901D31D281AD12089022817D38DF8049084F800A020899DF80410884203D27E -:200F60000A208DF800003FE01121083488F8001094E80E00C8E901120327C8F80C306AE0E7 -:200F800098F80020112A66D18DF80000626A0492D8F80850029522794FF00B0B012A06D098 -:200FA000022A29D0032A11D0042A54D159E0ADF8049085F800B0207E4F4600F01F006870F2 -:200FC00000216846FEF7BCFE377043E0ADF8049005202870207E68704E4600216846FEF705 -:200FE000AFFE26708DF800B0606A049041466846FEF7A6FE07462EE0ADF8040085F800A02C -:20100000207F6870607F00F00100A870A07F00F01F00E870E27F2A71C0071FD094F820008D -:2010200000F00F00687194F8210000F00F00A87100216846FEF784FE2868B063A888B087C3 -:20104000A87986F83E00A069407870772879B0700D2030700027384605B02BE7A97169711D -:20106000E6E7ADF804900E202870207E687000216846FEF765FEEDE7FE2030708DF800A050 -:20108000606A049004208DF80400207E8DF80500EDE700B50023012285B0052810D00628DE -:2010A0000CD102208DF8002004918DF8040000BF8DF8053000216846FEF742FE05B000BD7F -:2010C0008DF8002004918DF80420F1E770B50C46054601F06FFF21462846BDE8704078236F -:2010E000002201F0C7BE08B1007870470C20704770B50C0005784FF000010CD021702146CB -:20110000F4F7B4F874482178405D884201D1032070BD022070BDF4F7A9F8002070BD027BB5 -:20112000032A05D000220A704B780B2B02D003E0042070470A770A62027B9300521C0273A8 -:20114000C15003207047F0B585B00F4605460124287B05EB800050F8046C7078411E0C29BE -:201160000AD25D493A46123101EB8000314650F8043C2846984704460CB1012C11D1287BB9 -:20118000401E10F0FF00287301D00324E0E70D208DF80000706A0490002101966846FFF71C -:2011A000A7FF032CD4D005B02046F0BD70B515460A46044629461046FFF7C5FF064674B1E4 -:2011C0002078FE280BD1207E30B100202870294604F10C00FFF7B7FF2046FEF7FAFD30465A -:2011E00070BD704770B50E46044688210FF05FFB0225012E03D0022E04D0052070BD0120A6 -:20120000607000E065702046FEF7E3FDA577002070BD28B1027E1AB10A4600F10C01C5E787 -:201220000120704730B5044687B00D46062001F0C1FE2946052001F0BDFE2078FE2806D073 -:2012400000208DF8000069462046FFF7E2FF07B030BD7FB50E4600218DF80C1041780B2922 -:2012600003D00C2903D0002405E0846900E044690CB1217E91B16D4601462846FFF74FFFC6 -:20128000032809D1324629462046FFF78FFF9DF80C10002900D0042004B070BD04F10C05C3 -:2012A000EAE710B590B00C4607900B480421801E08900A488DF8191009900F92694606A82A -:2012C000FFF7C7FF002805D11022204601990FF055FA002010B010BD9E0E0200BC0F0200AC -:2012E00070B50D46040011D085B1210128460FF0BCFA10224E4928460FF040FA4C480121F0 -:201300000838018044804560002070BD012070BD70B5474E00240546083E10E07068AA7BAC -:2013200000EB0410817B914208D1C17BEA7B914204D10C2229460FF0F5F930B1641C30881A -:201340008442EBDB4FF0FF3070BD204670BD70B50D46060006D02DB1FFF7DAFF002803DBCC -:20136000401C14E0102070BD314C083C20886288411C914201D9042070BD6168102201EB2B -:20138000001031460FF0FAF92088401C20802870002070BD70B514460D0018D0BCB1002149 -:2013A000A170022802D0102811D105E0288870B10121A170108008E02846FFF7A9FF002871 -:2013C00005DB401CA070A8892080002070BD012070BD70B5054614460E000BD000203070E2 -:2013E000A878012808D005D91149A1F108010A8890420AD9012070BD24B1287820702888AF -:20140000000A5070022008700FE064B14968102201EB0011204610390FF0B0F928782073FA -:201420002888000A607310203070002070BD0000740000202DE9F04190460C46074600258D -:20144000FE48072F00EB881607D2DFE807F00707070704040400012500E0FFDF06F8147062 -:20146000002D13D0F548803000EB880191F82700202803D006EB4000447001E081F826408B -:2014800006EB44022020507081F82740BDE8F081F0B51F4614460E460546202A00D1FFDF23 -:2014A000E649E648803100EB871C0CEB440001EB8702202E07D00CEB460140784B7848704A -:2014C000184620210AE092F82530407882F82500F6E701460CEB410005704078A142F8D118 -:2014E00092F82740202C03D00CEB4404637001E082F826300CEB41042023637082F8271016 -:20150000F0BD30B50D46CE4B44190022181A72EB020100D2FFDFCB48854200DDFFDFC94866 -:201520004042854200DAFFDFC548401C844207DA002C01DB204630BDC148401C201830BDB5 -:20154000BF48C043FAE710B504460168407ABE4A52F82020114450B10220084420F07F4049 -:20156000F1F72BFB94F90810BDE81040C9E70420F3E72DE9F047B14E803696F82D50DFF831 -:20158000BC9206EB850090F8264038E009EB85174FF0070817F81400012806D0042816D06F -:2015A000052816D0062800D0FFDF00F056FF07EB44014A7806EB850181F8262091F82720F8 -:2015C000A24202D1202281F8272028B105E0022000E003208046E8E762B62A4621460120CA -:2015E000FFF728FF9948414600EB041002682046904796F82D5006EB850090F82640202C05 -:20160000C4D1BDE8F08710B58C4C2021803484F8251084F8261084F82710002084F82800AD -:2016200084F82D0084F82E10411EA16044F8100B2074607420736073A0738549E0772075F5 -:201640000870487000217D4AB4F1100402F81100491CC9B22029F9D30120F1F79CF90020FB -:20166000F1F799F9012084F82200F8F79BFD7948F8F7A7FD764CA41E20707748F8F7A1FDF6 -:201680006070BDE81040F1F713B910B5F1F735F96F4CA41E2078F8F7ADFD6078F8F7AAFDDA -:2016A000BDE8104000F003BF202070472DE9F34F624E0025803606EB810A89B09AF825003D -:2016C000202822D0691E02916049009501EB00108146D0E90112C0680391CDE90420B08B18 -:2016E000ADF81C00B07F8DF81E009DF81500C8B10227554951F820400399E219114421F0C7 -:201700007F41019184B102210FE00120F1F743F90020F1F740F9F1F70EF900F0C8FE86F887 -:201720002F508AE00427E4E700218DF81810022801D001281BD10398391901440998081AF7 -:2017400020F07F4033280BD903208DF815000398C4F13201401A20F07F40322403900CE03D -:2017600096F8240018B901F029F800284DD0322C03D214B100F08FFE01E000F098FE344A35 -:20178000107820B393465278039B121B00219DF81840984601281BD0032819D05FF000001D -:2017A0008DF81E00002A04DD981A039001208DF818009DF81C0000B102210398274A20F0D7 -:2017C0007F40039003AB099800F07DFE10B110E00120E5E79DF81D0018B99BF8000003281E -:2017E00012D08DF81C50CDF80C808DF818408DF81E509DF8180058B103980123C119002284 -:201800001846F1F71BF906E000200BB0BDE8F08F0120F1F7C0F899F90C200123002001992C -:20182000F1F70CF9012086F82F008AF8285003482022694680300EF0E6FF11E048090020C2 -:20184000FF7F841E0020A107E00E02004807002086000020232D010073150100FFFF3F0084 -:201860000120D2E72DE9F05FDFF88C84064608EB860090F82550202D1FD0A8F180002C46B9 -:2018800000EB8617A0F50079DFF870B405E0A24607EB4A004478202C0AD0F1F71BF909EBDC -:2018A00004135A4601211B1D00F00DFE0028EED0AC4202D0334652461AE0F1F70BF998F8EF -:2018C0002F206AB1D8F80C20411C891A0902CA1701EB12610912002902DD0020BDE8F09FE0 -:2018E0003146FFF7E3FE08B10120F7E733462A4620210420FFF7CCFDEFE72DE9F041FE4C6E -:201900002569F1F7E7F8401B0002C11700EB1160001200D4FFDF94F8220000B1FFDF0127B8 -:2019200084F8227094F82E00202800D1FFDF94F82E60202084F82E00002584F82F5084F848 -:20194000205084F82150EE4825600078022833D0032831D000202077A068401C05D04FF06F -:20196000FF30A0600120F1F716F80020F1F713F8F1F711F9F1F709F9F0F7DDFF0EF0ACFACB -:20198000E048056005604FF0E0214FF40040B846C1F88002F1F799F994F82D703846FFF742 -:2019A00061FF0028FAD0D448803800EB871010F81600022802D006E00120CCE73A463146B4 -:2019C0000620FFF737FD84F8238004EB870090F82600202804D0CA48801E4078F8F710FCF5 -:2019E000207F002803D0F1F7C6F8257765774DE50146C14810B590F82D200024803800EB4C -:201A0000821000BF10F814302BB1641CE4B2202CF8D3202010BDBC4800EB04100160214648 -:201A20000120FFF707FD204610BD10B5012801D0032800D171B3B04A92F82D30AE4C00227C -:201A4000803C04EB831300BF13F812400CB1082010BD521CD2B2202AF6D3A94A48B102285C -:201A600007D0072916D2DFE801F01506080A0C0E100000210AE01B2108E03A2106E058217F -:201A800004E0772102E0962100E0B52151701070002010BD072010BD994810B54078F1F713 -:201AA0008CF880B210BD10B5202811D2924991F82D30A1F1800202EB831414F810303BB122 -:201AC00091F82D3002EB831212F81020012A01D0002010BD91F82D2001460020FFF7AAFCA2 -:201AE000012010BD10B5F0F7F5FFBDE81040F1F764B8F0B5804F04782025803F264607EB0D -:201B0000831303E0254603EB45046478944202D0202CF7D108E0202C06D0A64206D103EB5B -:201B200046025278027007E00020F0BD03EB440003EB45024078507019B10878A04200D191 -:201B40000D700120F0BD10B542680B689A1A1202D41702EB1462121216D4497A91B1427A73 -:201B600082B96A4A006852F82110126819441044001D891C081A0002C11700EB116000123C -:201B8000322801DB012010BD002010BD2DE9F047814659485C4E00EB8100984690F825409E -:201BA0002020107006F50070154600EB81170AE006EB04104946001DFFF7C5FF28B107EBFC -:201BC00044002C704478202CF2D1297888F8001013E000BF06EB0415291D4846FFF7B3FFF1 -:201BE00068B988F80040A97B99F80A00814201D8002006E507EB44004478202CEAD1012084 -:201C0000FFE42DE9FC410E46074600243E4D08E09DF8000005EB00108168384600F067FC07 -:201C200001246B4601AA31463846FFF7AFFF0028EED02046BDE8FC8170B504462E48012511 -:201C40008038A54300EB841100EB851040220EF095FD294800EB850100EB8400D0F82500B4 -:201C6000C1F82500284670BD2DE9FC418446224815468038089C00EB85170E4617F81400AF -:201C8000012803D0022801D00020D3E70B461B4A0121604600F017FCA0B101AB6A462946D6 -:201CA0003046FFF773FF68B19DF804209DF8001011488A4200EB850608D02B460520FFF7D0 -:201CC000E7FB0BE02A462146042014E0202903D007EB4100407801E096F8250007EB440176 -:201CE00048709DF80000202816D007EB400044702A46214603200BE0C8090020FFFF3F0070 -:201D00008600002000F5004048070020E00E0200FFF790FB01208DE706F8254F0120F07080 -:201D2000E6E7FA4901EB0010001D0CE47CB51D46134604460E4600F1080221461846F0F758 -:201D400049FF94F908000F2804DD1F3820722068401C206096B10220ED4951F826104618C5 -:201D600020686946801B20F07F40206094F908002844C01C1F2803DA012009E00420EBE741 -:201D800001AAF0F727FF9DF8040010B10098401C00900099206831440844C01C20F07F4020 -:201DA00060607CBD2DE9FE430C460746097860799072207998461546507241B1781D20F0AD -:201DC0007F46D44890F82E00202808D00AE0D4E90223217903B02846BDE8F043A6E7CE484A -:201DE00040780644217900222846A368FFF79EFF3146284600F07BFBD4E902322179684695 -:201E0000FFF794FF41462846019CFFF7FAFE2B4622460021384600F056FB002803D1394685 -:201E2000284600F064FBBDE8FE832DE9FE43804600F019FB28B1002798F8000018B1002025 -:201E4000F1E70127F8E7B34C4FF0000994F82D6084F8239000251FB93046FFF7EDFE064674 -:201E6000F0F738FE33466A464146FFF79BFF94F82E0020280CD021690098401A0002C217D0 -:201E800000EB1260001203D5684600F030FB012594F823000028D9D1F0F71CFE6B469F4AF0 -:201EA000002100F010FB0028BDD027B931466846FFF7A7FE054325B16846FFF744FBC8F8F0 -:201EC00008000120AFE72DE9FF5F8A46814600F0CAFA904C48B19AF80000002710B101280C -:201EE00000D0FFDF4FF0010810E094F82E000127202800D1FFDF9AF800000028F2D0FFDFC9 -:201F0000F0E700BFB8F1000F00D162B694F82D50002084F823003FB92846FFF78DFE054690 -:201F200094F823000028EDD1F0F7D4FD06462B4601AA5146FFF736FF3B462A4601A9304619 -:201F4000CDF80090FFF790FE064604EB850090F828B000F082FA804694F823000028D1D1DD -:201F60006A490DF1040C01EB09109CE80E0000F1040080E80E00D6B13BEA07000CD094F883 -:201F80002E00202808D12846FFF76CFC20B99AF8000028B10128B5D0284600F057FA05E0A0 -:201FA00094F82D2049460420FFF744FA0126B8F1000F00D162B666B194F82D0004EB80005A -:201FC00090F82600202804D05348801E4078F8F717F9304604B081E42DE9F05F4D4C8146F3 -:201FE00094F82D004FF000080125474605B962B604F8237FA07AFFF71FFE064614F8230909 -:202000000028F3D14348803800EB861111F81900032837D1334604EB830A4A469AF825007E -:20202000904201D1012000E0002083460AF125000021FFF75EFD014610EA0B0F03D001222F -:202040008AF82820A777E9B1324649460120FFF7F1F99AF828A000F000FA054694F82300B8 -:202060000028C3D1BAF1000F07D094F82E00202803D13046FFF7F6FB20B1304600F0E6F9CA -:202080004FF0010805B962B6404627E40020F0F75BBC0120F0F758BC1F48801E0078704723 -:2020A0002DE9F0411B4C94F82E0020281FD194F82D6004EB860797F82550202D00D1FFDFEB -:2020C0001449803901EB861000EB4500407807F8250F0120F87084F82300294684F82E50BC -:2020E000324602202234FFF7A5F9002020707EE42DE9F041054E074C012588B101282BD0DA -:20210000022874D0032873D0FFDF70E448070020E00E0200C809002086000020FFFF3F007E -:2021200000F0B9F9FFF7BCFF207E00B1FFDF84F821500020F0F72FFCA168481C04D001239B -:2021400000221846F0F77AFC14F82E0F217806EB01110A68012154E0FFF7A2FF0120F0F756 -:202160001AFC94F8210050B1A068401C07D014F82E0F217806EB01110A68062141E0207E23 -:20218000DFF880830027012803D002281ED0FFDF2DE4A777F0F7EFFC98F80000032801D1BE -:2021A00065772577607DD84951F8200094F8201051B948B161680123091A00221846F0F70A -:2021C0003DFC0220207612E4277610E484F8205000F061F9A07F60B198F8010061680123A3 -:2021E000091A00221846F0F729FC257602E00BE011E0277614F82E0F217806EB01110A68E3 -:202200000021BDE8F0411047BE48801E0078BDE8F041F7F7F5BFFFF743FF14F82E0F2178C2 -:2022200006EB01110A680521EBE710B5B74C94F82E00202800D1FFDF14F82E0F2178B44AD8 -:2022400002EB01110A68BDE81040042110477CB5AE4C054694F82E00202800D1FFDFA0686D -:20226000401C00D0FFDF94F82E00A94901AA01EB0010694690F90C002844F0F7ABFC9DF92D -:2022800004000F2801DD012000E00020009908446168084420F07F41A16094F82100002864 -:2022A00007D002B00123BDE8704000221846F0F7C5BB7CBD30B5974A0B1A541CB3EB940F60 -:2022C00012D3451AB5EB940F0ED3934203D9101A43185B1C08E0954204D9511A0844401C3A -:2022E000434201E0FFDF0023184630BD0123002201460220F0F7A2BB0220F0F74CBBF0F742 -:20230000E9BB2DE9FC47814D044695F82E00202800D1FFDF642C4AD37F4A0021121B71EBD6 -:20232000010044D395F82E20A8462846DFF8E09190F82D7009EB0215D8F8000001AA2044F7 -:202340006946F0F747FC9DF90400002802DD0098401C0090A96800986A680E18B21A22F000 -:202360007F42B2F5800F22D208EB8702454692F82520202A07D009EB02125268511A21F03D -:202380007F41814213D3A868401C05D00120F0F702FB4FF0FF30A86028682044286026F086 -:2023A0007F402861012085F82300BDE8FC870020FBE72DE9F041554C074694F82D00A4F167 -:2023C000800606EB801010F8170000B9FFDF94F82D5006EB851606E004280CD005280AD0B6 -:2023E000062808D020BF16F817000128F4D101254FF0000807E02A4639460120FFF71AF879 -:20240000F1E705B962B604F8238FA07AFFF714FC064614F823090028F3D104EB860000F16A -:20242000270133463A462630FFF763FB00F015F8054694F823000028E3D184F82D600120D4 -:2024400084F82300002D00D162B650E62F4981F82D00012081F823007047EFF3108000F09D -:20246000010072B670472D480068C005C00D10D0103840B2002806DA00F00F0000F1E020FB -:2024800090F8140D03E000F1E02090F80004400970470820704710B51C4C94F8240000284F -:2024A00004D1F7F79BFC012084F8240010BD10B5164C94F82400002804D0F7F7B8FC00209F -:2024C00084F8240010BD10B51C685B68241A181A24F07F4420F07F40A14206D8B4F5800F74 -:2024E00003D2904201D8012010BD002010BDD0E90032D21A21F07F43114421F07F41C0E908 -:202500000031704786000020E00E0200C809002048070020FF7F841EFF1FA10704ED00E026 -:20252000F0B5734AD2F80032724D002401212E7856B9714E3460704F03263F1D3E606E4F91 -:2025400004260C373E602970C2F80042D1601160694C4834D16425688542FBD35160D160CF -:20256000C2F80032F0BD2DE9F041044680074FF000054FF0010604D560480560066024F0C0 -:202580000204E0044FF0FF3705D55D484660C0F8087324F48054600003D55A48056024F045 -:2025A0008044E0050FD55248C0F80052C0F8087351490D60091D0D604F4A04210C321160B0 -:2025C000066124F48074A00409D54F484660C0F80052C0F808734D48056024F40054C4F36F -:2025E0008030C4F3C031884200D0FFDF14F4404F14D047484660C0F8087346488660C0F8FC -:202600000052C0F8087344490D600A1D16608660C0F808730D60166024F4404420050AD502 -:202620003E4846608660C0F80873C0F848733C48056024F400640DF029FC3A48044200D0C3 -:20264000FFDFBDE8F08170B5202500224FEA020320FA02F1C90719D051B201F01F060124B8 -:20266000B4404E09B60006F1E026C6F88041C6F88042002906DA01F00F0101F1E02181F8E7 -:20268000143D03E001F1E02181F80034521CAA42DED370BD70B5174C0D466060FFF763FF3B -:2026A0006068FFF7D0FF2846F7F78DFC0DF056F800F0D5F80DF0EAFB0DF035FBF7F772FD34 -:2026C000BDE870400DF0F8B810B50A4C6068FFF74AFF6068FFF7B7FF0DF0D8FBF7F73DFD6A -:2026E0000020606010BD0348406870470A207047008000408800002004850040FC1F004016 -:2027000000C0004004E5014000D0004004D5004000E0004000F0004000F5004000B00040F1 -:2027200008B50040FEFF0FFD70B51F490A68BAB100231D4601244A68521C4A60092A00D3AE -:202740004D600E7904FA06F20E6816420AD072B60B6893430B6062B649680160002070BD54 -:20276000052070BD5B1C092BE5D3FFDFF8E74FF0E0214FF48000C1F800027047EFF31081FF -:2027800011F0010F72B64FF0010202FA00F20648036842EA0302026000D162B6E7E7024883 -:2027A0000021016041607047900000200120810708607047012081074860704712480068FD -:2027C000C00700D0012070470F48001F0068C00700D0012070470C4808300068C00700D0B2 -:2027E00001207047084810300068704706490C310A68D20306D5096801F00301814201D1A9 -:2028000001207047002070470C040040C84911F8210F4978884201D3401A02E0C1F1210100 -:202820000844C0B27047C249233111F8210F4978884201D3401A02E0C1F121010844C0B25E -:202840007047BB49463111F8210F4978884201D3401A02E0C1F121010844C0B27047B5492B -:2028600010B5802081F80004B1490020233101F8210F4870AE4901F8210F4870AC494631E3 -:2028800001F8210F4870AC480DF096F9AA48401C0DF092F9F0F728FABDE8104000F03DB91D -:2028A00020207047B2E770B50C4605460026FFF7ADFF01469E48A14212D30022641EE4B2CF -:2028C0000DD390F82210435C491CC9B205F8013B80F822102129F1D180F82220EEE701263A -:2028E00000F01BF9304670BD202070479BE770B50C4605460026FFF796FF01468C482330D7 -:20290000A14212D30022641EE4B20DD390F82210435C491CC9B205F8013B80F8221021296F -:20292000F1D180F82220EEE7012600F0F6F8304670BD202101700020704710B50446FFF710 -:2029400080FF2070002010BD70B50C460546FFF778FF014676484630A14213D30022641E64 -:20296000E4B20DD390F82210435C491CC9B205F8013B80F822102129F1D180F82220EEE72A -:20298000002401E042F2070400F0C7F8204670BD70B50C460546212900D9FFDF67480068D7 -:2029A000103840B200F0A0F8C6B20D2000F09CF8C0B2864204D2FFDF02E000BFF0F7E4F9D9 -:2029C00021462846FFF76FFF0028F7D070BD2DE9F047DFF86481564CA8F1010807462334B1 -:2029E00098F80000DFF84891002604F1230A38B994F8221094F82100212200F084F890B103 -:202A00004D4699F8221099F82100212200F07BF8B8B155469AF822109AF82100212200F05A -:202A200072F848B335E094F82100275494F82100401CC0B284F8210021282AD184F821609B -:202A400027E095F821002F5495F82100401CC0B285F82100212801D185F8216098F800007B -:202A60004746B0B195F8221095F82100212200F04AF870B13E700CE095F821002F5495F80D -:202A80002100401CC0B285F82100212801D185F8216094F8221094F82100212200F033F8C7 -:202AA00000281FD099F8221099F82100212200F02AF8002816D09AF822109AF8210021226D -:202AC00000F021F800280DD0F0F734F91A480DF07BF8B0F5005F00D0FFDFBDE8F047164816 -:202AE0000DF088B8BDE8F087002806DA00F00F0000F1E02090F8140D03E000F1E02090F880 -:202B0000000440097047401C884204D0904200D109B1002070470120704710B506480DF09B -:202B200053F8002803D1BDE81040F0F7EEB810BDF80900200DE000E09900002004ED00E087 -:202B4000164908784A78401CC0B2904205D0144B01221A60BFF34F8F087070472DE9F0415D -:202B60000E4C4FF0E02600BFF0F794F920BF40BF20BF677820786070D6F80052EEF7BCFBC3 -:202B8000854305D1D6F8040210B92078B842EBD0F0F77BF90020BDE8F08100009B00002061 -:202BA000180502402DE9F041012528034FF0E0210026C1F880011E4CC4F800610C2000F0DB -:202BC0002CF81C4801680268C94341F3001142F010020260C4F804532560491C00E020BFE7 -:202BE000D4F80021002AFAD019B9016821F010010160114807686560C4F80853C4F8006175 -:202C00000C2000F00AF83846BDE8F08110B50446FFF7C8FF2060002010BD00F01F02012196 -:202C200091404009800000F1E020C0F88012704700C0004010ED00E008C500402DE9F047D1 -:202C4000F94C0646FF21606800EB061211702178FF2910D04FF0080909EB011109EB06176F -:202C60004158C05900F0E2F9002807DD6168207801EB061108702670BDE8F08794F8008031 -:202C800045460DE0606809EB05114158C05900F0CDF9002806DC6068A84600EB0810057842 -:202CA000FF2DEFD1606800EB061100EB08100D700670E1E7F0B5DC4B0446002001255A6882 -:202CC0000C261B7A0CE000BF05EB0017D75DA74204D106EB0017D7598F4204D0401CC0B2DE -:202CE0008342F1D8FF20F0BD70B5FFF708FBCE4C08252278616805EB0212895800F096F94E -:202D0000012808DD2178606805EB01114058BDE87040FFF7EBBAFFF7BFF9BDE87040F7F7C9 -:202D20006FBA2DE9F041C04C2578FFF7E8FAFF2D6ED04FF00808626808EB0516915900F037 -:202D400075F90228606801DD80595DE000EB051109782170022101EB0511425C5AB1521ECE -:202D60004254815901F5800121F07F4181512846FFF764FF34E00423012203EB051302EBB1 -:202D8000051250F803C0875CBCF1000F10D0BCF5007F10D9CCF3080250F806C00CEB423C2D -:202DA0002CF07F4C40F806C0C3589A1A520A09E0FF2181540AE0825902EB4C3222F07F4222 -:202DC0008251002242542846FFF738FF0C21606801EB05114158E06850F827203846904711 -:202DE0002078FF2814D0FFF78AFA2278616808EB02124546895800F019F9012893DD2178AC -:202E0000606805EB01114058BDE8F041FFF76EBABDE8F081F0B51D4614460E460746FF2B19 -:202E200000D3FFDFA00700D0FFDF7F48FF210022C76044600572067401704270104601222B -:202E400005E000BF02EB0013401CE154C0B2A842F8D3F0BD70B5744C06466578207C8542F8 -:202E600000D3FFDFE06840F825606078401C6070284670BD2DE9FF5F1D468B460746FF24E5 -:202E8000FFF73DFADFF8A091064699F80100B84200D8FFDF00214FF001084FF00C0A99F820 -:202EA0000820D9F804000EE008EB0113C35CFF2B27D0BB4205D10AEB011350F803C0DC45D8 -:202EC00021D0491CC9B28A42EED8FF2C1BD008EB04110AEB0412475440F802B00421029B1F -:202EE0000022012B01EB041111D042504FF4007808234FF0020C454519D9E905C90D08D0C5 -:202F000008E00C46DDE7FF2004B0BDE8F09F4550ECE7414606EB413203EB041322F07F4281 -:202F2000C250691A0CEB0412490A81540BE005B9012506EB453103EB041321F07F41C150AA -:202F40000CEB0411425499F800502046FFF776FE99F80000A84201D0FFF7C6FE3846D3E7E0 -:202F600070B50C460546FFF7CAF9064621462846FFF7A0FE0446FF281AD02B4D082101EB39 -:202F8000041168684158304600F050F800F58050C11700EBD140401302216A6801EB041123 -:202FA000515C09B100EB4120002800DC012070BD002070BD2DE9F0410F468046FFF77AFEEF -:202FC000FF281BD0184E357871682A462C4605E0844206D0254601EB05131C78FF2CF7D19A -:202FE0000CE0FF2C0AD0A5420CD101EB021000783070FF2804D0FFF777FE03E0002007E7AF -:20300000FFF77AF939464046FFF7AAFFFF220123716803EB0413CA5401EB041201EB05115E -:2030200012780A70F4E60000640A0020081A0002C11700EB116000127047000070B5044694 -:20304000A0F500002D4EB0F1786F02D23444A4F500042B48844201D2012500E0002500F0C8 -:2030600043F848B125B9B44204D32648006808E0012070BD002070BD002DF9D1B442F9D35F -:2030800021488442F6D2F3E710B50446A0F50000B0F1786F03D219480444A4F5000400F028 -:2030A00023F84FF0804130B11648006804E08C4204D2012003E014488442F8D2002080F046 -:2030C000010010BD10B520B1FFF7DEFF08B1012010BD002010BD10B520B1FFF7AFFF08B132 -:2030E000012010BD002010BD084809490068884201D1012070470020704700000000002080 -:20310000002002002000002008000020A0000020BEBAFECA53480021017041701021817025 -:20312000704770B5054616460C460220EFF77BFB4C49012008704C49F01E08604B4805600B -:20314000001F046070BD10B50220EFF76CFB45490120087046480021C0F80011C0F804111F -:20316000C0F8081143494FF40000086010BD3D480178C9B1404A4FF4000111603C49D1F875 -:2031800000310022002B1CBFD1F80431002B02D0D1F8081111B14270102103E0012141709E -:2031A00036490968817002700020EFF73CBB2D480178002904BF407870472D48D0F8001128 -:2031C000002904BF02207047D0F8001100291CBFD0F80411002905D0D0F80801002804BFB6 -:2031E00001207047002070471E4800B50278204B4078C821491EC9B282B1D3F800C1BCF131 -:20320000000F10D0D3F8000100281CBFD3F8040100280BD0D3F8080150B107E0022802D065 -:20322000012805D002E00029E4D1FFDF002000BD012000BD0B480178002904BF80787047D0 -:203240000B48D0F8001100291CBFD0F80411002902D0D0F8080108B110207047074800683E -:20326000C0B27047A400002010F5004008F5004000F0004004F5014008F5014000F4004003 -:203280004D48002101704170704770B5064614460D460120EFF7C7FA48480660001D046042 -:2032A000001D056070BD70B5434B012540EA02421D70434B42F080721A60424A424C00261F -:2032C0001160C4F80461414A4FF040711160002802BFC4F80052256070BD012818BFFFDFE9 -:2032E000C4F8006225604FF000703949086070BD3148017879B1354A4FF0407111603249EE -:20330000D1F804210021002A08BF417002D0314A1268427001700020EFF785BA26480178E6 -:20332000002904BF407870472748D0F80401002808BF704727480068C0B27047002808BF61 -:20334000704730B51C480078002808BFFFDF1E48D0F80411002918BF30BD0224C0F80443D3 -:20336000DFF874C0DCF80010C1F30015DCF8001041F01001CCF80010D0F80411002904BFD2 -:203380004FF400414FF0E02207D100BFC2F8801220BFD0F80431002BF8D02DB9DCF80010EC -:2033A00021F01001CCF80010C0F8084330BD06490120886070470000A700002008F5004014 -:2033C00004F5004018F5004000F0004008F5014004F5014000F4004010ED00E070B5FE4C3F -:2033E000002501206570257025626572A572E07284F82950256304F13C00A5630CF0DCFBCD -:20340000002818BFFFDF84F82450F4480DF054FBF3494FF011300860091D0860091D086017 -:20342000F0490860F0490D60091D0860091D0860091D0860091D0860091D0860091D0860F1 -:20344000091D0860091D0860091D0860657770BD30B4E1490268DFF898C34A6142688A61CF -:20346000007A08770A7DE14BACF1040401204AB10A7E00FA02F21A608D7D002D0CBF22606B -:20348000CCF800204A7D002A04BF30BC70474A7E90401860C97D00290CBF2060CCF8000063 -:2034A00030BC7047D449D3480860091DD3480860704710B5044659B1012908BF4FF080712F -:2034C00006D0022917BF03294FF0C741FFDF002141F4847040F48010C7490860E0B240F478 -:2034E0004030091D40F000700860C548D0F80001002818BFFFDF10BD002800B5C14908BF00 -:2035000003200CD0012808BF042008D0022808BF062004D0032816BFFFDF052000BD0860AD -:2035200000BD70B502244FF0E02501200022C5F88041B5490A600860B44A40F25B61116051 -:20354000121F40F203111160111F0860AD4903200860AF49962008609F4E96F9240000F0C4 -:2035600040FE707F002814BF4FF4C020A948AA490860AB49A9480860091FAA480860C5F828 -:2035800080429F491020C1F8040370BDA6494FF0004008607047904A0368C2F8023080889E -:2035A000D080117270478C4890F8290070478A4A517010707047F0B50546800000F1804058 -:2035C00000F580508B88C0F820360B78D1F8011043EA0121C0F8001605F10800012707FA64 -:2035E00000F6924C002A04BF2068B04304D0012A18BFFFDF206830432060206807FA05F1E1 -:2036000008432060F0BD10B5044600F0EAFD724880F8244010BD704890F8340070476E4808 -:2036200090F836007047824AC178116000688149000208607047252808BF02210ED02628E9 -:2036400008BF1A210AD0272808BF502106D00A2894BF0422062202EB4001C9B2764A116084 -:203660007649086070475C49086270475A498A7A012A4AD0022A18BF70474B7D002B08BF46 -:203680007047DFF8BCC1012A43D0CA7D4B7E002A18BF012210F17D00CCF80000DFF8A4C12F -:2036A0000020CCF84C01180282F0010240EA025040F00312087F830003F1804303F5C043CD -:2036C000C3F81025604A02EB8002887EC30003F1804303F5F833C3F81425DFF870C1C3F887 -:2036E00010C5C97ECB0003F1804303F5F833C3F814254C4AC3F81025012202FA00F002FA84 -:2037000001F108435249086070470B7D002BB8D170478A7D0B7E002A18BF01227E30BBE7BB -:203720002DE9F84F00280CBF012202222A4D344C0320AA72C4F80002687F002814BF4FF4D9 -:20374000C0203448424F38604FF00108002933D0012940D002291CBFFFDFBDE8F88F286A94 -:20376000002808BFFFDF296A286B0844394908603A4939480860A97A394801290EBF0460B5 -:2037800038490160A86B40F40020A863D4F800924FF0100AC4F808A30026C4F800621E480D -:2037A0004FF4802BC0F800B0FF208DF80000C4F81061C4F8108084E0012A5DD0C4F804809A -:2037C000022A18BFBDE8F88F687D002808BFBDE8F88F1C4848E056E0780A00208C0A0020A0 -:2037E000040E0040000E0040100E0040180500500C05005006010200141500402500030261 -:203800000010004010150040FC1F004038150040441500400000040408F50140408000402C -:20382000A4F50140101100407417004040160040241500401C1500400815004054150040FC -:203840004C85004000800040006000404C81004004F501404885004048810040A8F50140BC -:20386000ACF5014004100040C0F84C80F9480068BDE8F84F0A30F9E6C4F80080287D0028D7 -:20388000A7D1BDE8F88FF448012A806B07D0022A18BFFFDF09D0BDE8F84F0A20E6E640F48B -:2038A0008010A8634FF4801004E040F40010A8634FF400103860EEE79DF80000401E8DF82F -:2038C00000009DF8000018B1D4F810010028F3D09DF80000002808BFFFDFC4F80061C4F887 -:2038E0000C61C4F81061C4F80461C4F81461C4F81861C4F82861D94800680090C4F80092FB -:20390000C7F800B0C4F804A34FF400203860296A286BBDE8F84F08440A30A7E62DE9F84760 -:20392000CF4CD4F8000220F00309D4F804034FF0100AC0F30018C4F808A30026C4F80062E0 -:20394000C54D687F002814BF4FF4C020C548C6490860A87A0127012802D0022803D014E096 -:20396000287D10B911E0687D78B1A87EEA7E07FA00F007FA02F210430860287F800000F193 -:20398000804000F5C040C0F81065FF208DF80000C4F81061276104E09DF80000401E8DF890 -:2039A00000009DF8000018B1D4F810010028F3D09DF80000002808BFFFDFC4F81061C4F896 -:2039C00028616E72AE72EF72C4F80092B8F1000F18BFC4F804A3BDE8F8870068A34920F035 -:2039E0007F40086070474FF0E0200221C0F88011C0F8801270474FF0E0210220C1F8000121 -:203A000070479B490870704710B59A480CF0DCF8002818BFFFDF10BD96480CF0EBB896495F -:203A20000860704730B58C4C0546206BA84228BFFFDF012020732561607F40B1A81C2061D6 -:203A40008748D0F8001241F04001C0F800128B490020C1F844018A4920690860A06B8949EE -:203A600040F48000A0634FF48000086030BD002804BF28207047012804BF18207047022888 -:203A800012BF03284FF4A870704700B5FFDF282000BD002804BF41F2D4707047012804BF7B -:203AA00041F204007047022812BF032842F6A000704700B5FFDF41F2D47000BD002804BFB1 -:203AC00042F2B8407047012804BF41F288307047022804BF44F690407047032804BF47F2A0 -:203AE000A030704700B5FFDF42F2B84000BDF0B50646594C02200D462073032914BF022DF7 -:203B00004EF634170BD0002D08BF42F2B84706D0012D1ABFFFDF42F2B84741F28837002E06 -:203B200008BF41F2D4700CD0012E08BF41F2040007D0022E17BF032E42F6A000FFDF41F247 -:203B4000D470381A002D504908444FF47A71B0FBF1F708BF28200AD0012D08BF182006D010 -:203B6000022D17BF032D4FF4A870FFDF28203844032E16BF022E062101210844401D20616A -:203B8000617F41B1801C20613548D0F8001241F04001C0F8001239490020C1F84401216979 -:203BA000206B084436490860F0BD2B4901204877364902200860374935480860091F364832 -:203BC00008607047244900204877704726494FF4800008602048816B21F48001816300213A -:203BE0000173704770B584B014460D460646042934BF042CFFDF294B0FCB8DE80F0068469A -:203C000000EB850026490057301A086004B070BD70B584B014460D460646042A34BF042D37 -:203C2000FFDF204B0FCB8DE80F00684600EB85001B490057301A086004B070BD0F480121F8 -:203C40004160C1600021C0F844110D4801600248016370474C850040780A0020181100403D -:203C6000001000400000040408F501403C150040A9000020B40A002004150040008000405D -:203C80004485004004F50140FF57020060150040448000409CF5014028110040400F020034 -:203CA00044150040500F0200FE4800B5407F002818BFFFDF4020FC490860FC48D0F8001248 -:203CC00041F04001C0F8001200BDF64800B5407F002818BFFFDFF548D0F8001221F04001F3 -:203CE000C0F80012F0490020086000BDEF48D0F8001221F01001C0F80012012181617047C4 -:203D0000EA480021C0F81C11D0F8001241F01001C0F800127047E54981B0D1F81C21012A3E -:203D20001EBF002001B07047E14A126802F07F02524202700020C1F81C01DE4800680090EC -:203D4000012001B0704730B50C00054608BFFFDF14F0010F1CBF012CFFDF002D0CBF0120E6 -:203D60000220D04901284872CC72D04904BFD1F8000240F0040007D0022807BFD1F800027A -:203D800040F00800FFDF30BDC1F8000230BD70B5C44C0022E17A11F0020F18BF10F0040FCA -:203DA00016D111F0100F1CBF94F83530002B02D094F8373063B111F0080F1CBF94F8283055 -:203DC000002B05D111F0040F03D094F8291001B90122657AB54900234FF0010C35B100F037 -:203DE0000200104314D0BDE8704097E5607F002814BF4FF4C020B048B04A1060D1F800028F -:203E000020F00300C1F80002A37284F80BC070BD012D14D0022D18BFFFDF1CD0A07A012826 -:203E20000CBFA748A7484FF47A7100F2E730B0FBF1F0216BBDE87040081A8C3016E4D1F894 -:203E4000000220F00400C1F80002637284F80BC084F80AC0E2E7D1F8000220F00800C1F8CA -:203E60000002637284F80BC00220A072D6E72DE9F84F954FD7F84C218A4C90494FF00108BF -:203E8000A07A0026CAB1012802D0022803D014E0227D12B911E0627D7AB1A27EE37E08FA93 -:203EA00002F208FA03F31A430A60227F920002F1804202F5C042C2F81065A26B0A60A663BF -:203EC000217B29B1D7F84411012908BF012200D00022764DD5F8101101290CBF402100211A -:203EE000012805BFD5F80C31012B002320231943012805BFD5F80431012B00231023194310 -:203F0000724B022804BFD3F800C0BCF1010F07D1D5F80CC1BCF1010F08BF4FF0080C01D095 -:203F20004FF0000C4CEA0101022804BF1B68002B05D1D5F80C31012B08BF042300D0002376 -:203F40001943022803D1002A18BF022200D100221143022804BFD5F80401012805D1D7F80E -:203F60004401012818BF012000D1002040EA01095748016811F0FF0F03D0D5F814110129B0 -:203F800000D0002184F83410006810F0FF0F03D0D5F81801012800D0002084F835004D48E2 -:203FA000006884F836004048006818B1FFF7FFF8012800D0002084F83700C5F80061C5F89A -:203FC0000C61C5F81061C5F80461C5F81461C5F81861C5F82861404800680090C7F8446192 -:203FE0003E4800684D46DFF8F8900090D9F80000E062617F00291CBF801EE0623948006891 -:204000002063A07ADFF8E0A002280CD1607850B1DAF8001009780840217831EA000008BFA6 -:2040200084F8288001D084F82860DFF8C08015F0010F15D098F800102D4A4908E06A52F87A -:204040002110884701212B4A98F80030206B52F82320904798F8000010F0010F0BD01FE0A0 -:2040600015F0200F18BF0221EDD115F0020F18BF0021E8D1EEE7DAF80000062200F10901C3 -:20408000A01C0CF04FFB40B9207ADAF800100978B0EBD11F08BF012000D0002084F8290020 -:2040A000284629E0780A00206015004000100040481500401C1100400000040408F5014092 -:2040C000F0FE0100B0F80100008000400014004040160040081400401811004044810040D4 -:2040E000448500404085004004150040A9000020F80E0200300F0200FFF749FE15F0020FF4 -:2041000005D0594898F8001050F82100804715F00C0F07D0554898F8001050F82110C5F3F4 -:20412000C000884715F0200F05D0514898F8001050F82100804798F80000022805D105F0F9 -:204140006E00402806D101F093FB98F80000042828BFFFDFA07A022818BFBDE8F88F207BD0 -:20416000002808BFBDE8F88FC7F84461022815D0012818BFFFDF216B2069884298BFFFDFBF -:20418000D4F81000C9F80000A06B3A4940F48000A0634FF480000860BDE8F88F2169206BD1 -:2041A0000844EFE7002812BF012864207047022812BF03284FF4C870704700B5FFDF642011 -:2041C00000BD2D49032818BF0228086803BF20F0B30040F04C0040F0004020F000400860E7 -:2041E000704700B52549022839D022DC10F10C0F08BFF42033D010DC10F1280F02BFD820DD -:20420000086000BD10F1140F08BFEC2027D010F1100F08BFF02022D023E010F1080F08BFC0 -:20422000F8201CD010F1040F0CBFFC20002816D017E0C01E072814D2DFE800F0100E0C0A9C -:204240000806040009200AE0082008E0072006E0062004E0052002E0042000E0032008607C -:2042600000BDFFDF00BD0000000F0200100F0200200F020004F501403C1700400C15004055 -:2042800010B53F480AF08BFC00213D480AF0B6FC01213B480AF086FC3A49002081F82200A0 -:2042A0004FF6FF70888438490880488010BD704734498A8C824218BF7047002081F8220049 -:2042C0004FF6FF70888470472D49016070472E49088070472B498A8CA2F57F43FF3B03D033 -:2042E000002101600846704791F822202549012A1ABF0160012000207047224901F1220022 -:2043000091F82220012A04BF00207047012202701D4800888884104670471B49488070478F -:204320001849194B8A8C5B889A4206D191F82220002A1EBF016001207047002070471148D1 -:20434000114A818C5288914209D14FF6FF71818410F8221F19B10021017001207047002017 -:2043600070470848084A818C5288914205D190F8220000281CBF00207047012070470000F8 -:20438000DE0A0020B80A0020AA0000207047514A012340B1012818BF704713700868906068 -:2043A00088889081704753700868C2F802008888D0807047474A10B1012807D00EE0507817 -:2043C00060B1D2F802000860D08804E0107828B190680860908988800120704700207047CB -:2043E0003C4910B1012803D006E0487810B903E0087808B1012070470020704730B58DB01F -:204400000C4605460D2104A80CF051FAE0788DF81F0020798DF81E0060798DF81D0028689B -:20442000009068680190A8680290E868039068460BF02EFA20789DF82F1088420CD160784A -:204440009DF82E10884207D1A0789DF82D10884202BF01200DB030BD00200DB030BD30B5F8 -:204460000C4605468DB00321E01CFEF740FA60790D2120F0C00040F04000607104A80CF053 -:2044800016FAE0788DF81F0020798DF81E0060798DF81D002868009068680190A868029036 -:2044A000E868039068460BF0F3F99DF82F0020709DF82E0060709DF82D00A0700DB030BD21 -:2044C00010B504460621FEF712FA607920F0C000607110BDAE00002070B5FF4D0446286845 -:2044E00090F8D610002601291BD090F8B41001291CBF002070BD66701321217000F1B60132 -:204500002022A01C0CF03AF90120A071286880F8B46068680088FBF7D8FBFBF70FF90120E8 -:2045200070BD667019212170D0F8D710C4F80210D0F8DB10C4F8061090F8DF10A17280F8A9 -:20454000D660ECE7E448006890F8B410002914BFB0F8B8004FF6FF70704710B5DE4C206834 -:20456000002808BFFFDF002120684170002808BFFFDF2068417800291CBFFFDF10BDE42152 -:204580000CF095F921687F2081F83100FFF79DFBFEF7EDFDD1480AF03DF9BDE81040D048FC -:2045A0000AF038B9CC48006880787047CA4800B5016891F82200C0F38002C0F340031A4481 -:2045C00000F00100104491F82120C649062A10D2DFE802F00C070C03090BC34931F8100077 -:2045E00000BDC24800BDC24900E0C24931F8100000BDFFDF002000BDB74840F27121006865 -:20460000808C48437047B448006890F83000002818BF0120704710B5040016BF022C00206D -:204620000120FFF7DDFE002808BF10BDAA4800680473012010BDA849096881F82A00704751 -:2046400010B5A54C2168087B002816BF02280020012048730E31FFF7ADFE2168087B02285F -:2046600016BF03280122002281F82920082081F82700487B01F10E03012804BF5B7913F0E2 -:20468000C00F0AD001F10E03012804D1587900F0C000402801D0002000E0012081F82800F4 -:2046A0002AB991F82100012818BF042806D1087D153109F021F8216881F8270021684AF29F -:2046C000B8104860FDF70EFA2168886010BD30B5814D0446407B296881F822002079052886 -:2046E0000ED2DFE800F0030507090B00002009E0012007E0022005E0032003E0042001E0DD -:20470000FFDF00202968012881F821000CBF002020888884A07B81F83000A079002816BFCE -:204720000228002001200875D4F80700C1F81500B4F80B00A1F8190091F8B1200120002AE2 -:2047400018BF81F8B20091F89120002A18BF81F8B3008870002030BD70B55F4D04460022AE -:20476000286880F8B320224672300CF007F82868012180F8914080F8B31070BD10B5564C8F -:204780000022236883F8B22083F8B100024603F192000BF0F3FF2168012081F8B20010BD96 -:2047A0004D49096881F82F0070474B48006890F8210070472DE9F041474C2068002808BFE7 -:2047C000FFDF00262068417831BB807820B3FFF71BF92068002580F82B5080F8E05028461D -:2047E000FFF70FF9FEF79DFEFEF75CFE4248FEF71AFF4248FFF7F1F800210846FFF777F906 -:204800002068002790F8220010F0010F07D02520FEF711FF012711E00C20BDE8F08110F0B3 -:20482000020F04D02620FEF706FF022706E010F0040F03D02720FEF7FEFE0427FEF732FED6 -:20484000206880F82670FFF7D6F801210020FEF767FF0F210520FEF7AAFE206890F8281027 -:20486000002904BF90F82910002905D190F82100012818BF04286FD1FDF734F90746206881 -:2048800039468068FDF716FD1D4990FBF1F801FB180041423846FCF734FE014620688160E6 -:2048A00041684144416008F024FF014620684268914251D8C0E90157012690F8270008F0CA -:2048C00037FF07462068B04690F82900002818BF002F1BD0102115E0BC000020E40B0020FC -:2048E0000C0C0020680F0200780F0200C3891300800F0200700F0200630F0200600F020028 -:2049000040420F00384609F08EFC70B1206890F82A1000291CBF90F8281000291CD0427B04 -:2049200000F10E01012A0FD013E0206800F10E0180F80D803846FFF792FD206890F82710A3 -:204940000E3008F0D4FF07E0497901F0C001402912D00E30FFF7B4FD2068417B0E30FEF74C -:204960001AFE2068FD4F90F8210005284FD2DFE800F00A0F44490F0008F0EDFF21680E313C -:20498000FFF76DFDE8E70021384609F046FF3FE00121384609F041FF206890F8270008F0E4 -:2049A000D0FE5FEA000803D0102109F03CFC68B1206800F11501384609F061FF2068007D1F -:2049C000B0B1012818BFFFDF0DD021E02EB1206800F11B014046FFF742FD206800F11B01F6 -:2049E000384609F04CFF0121384609F063FF0FE00021384609F05EFF0AE00621384609F08E -:204A00000CFF05E00221384609F007FF00E0FFDF206800F10E01384609F023FF2068417BE3 -:204A2000384609F03AFF206890F82110012918BF042916D090F8B21059B190F8B12080F84C -:204A4000712000F1920152300BF098FE206880F8B250206800F1520190F87120384609F0D0 -:204A600052FF0421BE4809F0D8FE206800F10E01BB4809F0F6FE2068417BB94809F00DFF29 -:204A8000206890F8B31059B190F8912080F8512000F1720132300BF071FE206880F8B350E4 -:204AA000206800F1320190F85120AD4809F04FFF08F091FEAB4808F00BFF216881F82E0069 -:204AC000FEF7AAFF0020BDE8F081A7494860704770B5A54C06002DD02068002590F8222023 -:204AE00090F8261022EA010010F0010F04D02520FEF7A1FD012515E012F0020F02D011F02E -:204B0000020F06D012F0040F0CD011F0040F05D008E02620FEF78FFD022503E02720FEF7DF -:204B20008AFD0425FEF7BEFC206890F82610294380F82610206890F82B1041B190F82100D0 -:204B4000012808BFFFDFBDE8704000F084BA1EB102210020FEF7E4FD206890F82C007F4819 -:204B6000FEF75DFF206890F82100052809D2DFE800F003030309030001210846FFF7E3F89E -:204B800000E0FFDF206890F8221090F8262031EA02024FF0010101D0417070BD90F821206F -:204BA000012A12BF80F82B10002280F82620F3E710B5FEF729FF6C480068417831B98078F3 -:204BC00020B10020FFF784FF002010BDFFF736F8FEF7FCFFFEF7A2FEFEF705FFFEF71CFFCC -:204BE0000C2010BD60490120096881F8E00070475D49096881F82D00704770B5002503F0C0 -:204C00007CFB70B14FF49670FEF72DFD564C20684178012909D0022901D0032930D0FFDFA8 -:204C200070BDBDE8704000F016BA90F82110032926D090F82E0018B1FEF785FAFFF734F842 -:204C40004848FEF7ECFE216891F82100012818BF04280AD091F83000012814BF0328102597 -:204C600045F00E010020FFF76EF8206890F82F00012808BFFFF744F802202168487070BD83 -:204C8000BDE87040012023E710B5374C206890F82F10012909D13130FFF73DF818B9216813 -:204CA0007F2081F83100FFF721F8206890F82E0018B1FFF70AF8FEF75AFA03F01EFBC0B1D7 -:204CC00020684078022818BFFFDF206890F82100012804BF4FF41970FEF7C5FC0120FFF7FF -:204CE000F7FE2068417800291EBF40780128FFDF10BDBDE8104000F0AEB92DE9F05F0546F0 -:204D00000027FEF788FC184C804620684078022818BFFFDF20684FF07F0A90F82F10012969 -:204D200037D0104809F099FDFF268146002D72D00C4809F004FF00286DD0FEF734FC002828 -:204D400069D02068074D90F82E00B0B108F028FD0646FF2811D00146E81C07E0E40B002075 -:204D60000C0C0020340C0020BC00002008F009FD304608F020FD40EA08084846DFF878938C -:204D80004FF0010B062846D2DFE800F08F8F8F0E8F623130FEF7BFFF002804BF206880F820 -:204DA00031A0FEF7A3FFBCE7206890F82110012918BF042979D0B8F1000F05D190F83010DA -:204DC000002918BF022970D190F82F10012904BF90F8D610002906D0C848FEF720FE21689A -:204DE0000320487062E080F8D6B0FF2180F8D710FF2E11D000F1D902511E304608F0AAFCBC -:204E0000002808BFFFDF206890F8D81041F0020180F8D8100DE048E02978C1F3801180F8C6 -:204E2000D810D9F85310C0F8D910B9F85710A0F8DD10206800F1DF0590F831007F2808BF94 -:204E4000FFDF206890F83110297080F831A0C3E72878C0F380112068027D914206D100F111 -:204E600015010622E81C0BF05DFC30B1206890F82700B04203D1FF2E01D0012200E000229B -:204E8000206890F82110012918BF042900D14AB959B9B8F1000F05D190F83010002918BF67 -:204EA000012902D190F82D00D8B10127206890F82E0018B1FEF709FFFEF759F9002F1CBF3A -:204EC0000120FFF705FE2068417800291ABF41780129BDE8F09F4078032818BFFFDFBDE821 -:204EE000F09F6068D9F85F10C0F80D10B9F86310A0F8111099F86510C174A97D0175B5F8E5 -:204F00001710C182B5F819104180B5F81B108180B5F81D10C1807A4908300BF0D2FD95F84A -:204F2000240000F01F016068017695F82410490980F86C11206890F8B400002818BFFFDF55 -:204F40004FF00008206880F8B68061680A88A0F8B8204A88A0F8CE208A88A0F8D020CA88C5 -:204F6000A0F8D22091F86C1180F8D41090F8291049B1427B00F10E01012A04D1497901F01A -:204F8000C001402933D090F82A1041B1427B00F10E01012A04BF497911F0C00F27D0C2300A -:204FA0000BF086FD2878FF2EC0F3801160684176D9F85320C0F81A20B9F85710C1832168C8 -:204FC0001DD0C1F8C820C08BA1F8CC0001F1BC023046BB3108F0BEFB002808BFFFDF20687B -:204FE00090F8BB1041F0020180F8BB1015E0D0F80E10C0F8C210418AA0F8C610D2E7C1F8D7 -:20500000C880A1F8CC80427E81F8BB20D0F81A20C1F8BC20C08BA1F8C000206880F8B4B0B0 -:2050200060680088FAF751FEFAF778FB206880F80180FEF703FEFEF7C9FDFEF76FFCFEF7F5 -:20504000D2FCFEF7E9FC012003F09DFA2EE700231A4603F0A6BB70B5FEF7F0FDFEF7B6FD62 -:20506000FEF75CFCFEF7BFFC264C0025206890F82E0030B1FEF729FEFEF779F8206880F8FB -:205080002E5020684570FEF7C7FC206890F82100012804D0BDE87040002003F074BA0220B7 -:2050A00003F071FA206890F8B400002818BFFFDF206890F8E010002908BF70BD017D80F8DE -:2050C000BB10D0F81510C0F8BC10B0F81910A0F8C0103C2180F8B61061680A88A0F8B820F5 -:2050E000012280F8B4200888FAF7EFFDFAF716FB206880F8E05070BDE40B00200C0C00202E -:20510000530C0020BC0000202DE9F041F94E0446304600217278406801270D4612B1012ACA -:2051200025D006E090F85E20002A18BF777000D001217278C2EB021200EB820292F82230BE -:2051400019431BD002F124012A22A01C0BF016FB657004202070A77070787168C0EB0010C0 -:2051600001EB800080F822500120BDE8F08190F82220002A18BF7570DAD1DAE790F89A1054 -:20518000C9B1D0F89B10C4F80210D0F89F10C4F80610D0F8A310C4F80A10D0F8A710C4F87F -:2051A0000E1090F8AB10A174657012212170A77080F89A5019E0017801291CBF0020BDE82B -:2051C000F081657013212170811C2022A01C0BF0D5FAA5717068057080F8CC50D0F8B800E8 -:2051E0000088FAF772FDFAF7A9FA0120BDE8F081C04840680178002914BF80884FF6FF701B -:2052000070472DE9F041BB4C0746606890F82200002818BFBDE8F081384609F01EFB0146DE -:205220000126002007294AD2DFE801F004080E4949491300616881F82E000EE0616881F87B -:205240002E6081F82C0015E06168032081F82E0003E06168022081F82E00606800F12F0135 -:20526000384609F060FB0546FF2888BFFFDF606880F82C50606890F8D20018B1FDF797FF94 -:20528000012821D0384609F011FB616881F825003846263109F0ECFA606800F12D052078D3 -:2052A0007F2808BFFFDF207828707F202070606880F82260BDE8F041032001F0E7BF616828 -:2052C00081F82C00BDE8F081FDF7B4FF616801F12602253108F03EFA002808BFFFDF60686E -:2052E00090F8251041F0020180F82510D4E710B5002001F039FF7F4CA8B1FEF77CFB002196 -:205300000120FEF70DFA7C48FEF789FB6068D0F8D800FEF787FB606890F8BC00032818BF46 -:20532000022822D025E0FEF789FCFEF74FFCFEF7F5FAFEF758FB606890F8D20038B1FEF766 -:20534000C4FCFDF714FF6168002081F8D2006068012180F8DC10022180F8D510FEF75CFB38 -:20536000BDE81040002001F091BF01210020FEF7EAFCFEF7C5FC606890F8D20018B1FDF725 -:20538000E2FEFEF791FC6168032081F8D50010BD584B5968B1F8DE2060B3FF2A0CD24FF63A -:2053A000FF7000EA4200A1F8DE00FF2888BFFF2002D900BFA1F8DE009868012812BF00281B -:2053C0000D209860C043C0EBC00202EB001091F8DD20D24302EB820CCCEB8212104498608E -:2053E000B1F8DE20800CB0FBF2F302FB130081F8DD007047012ADFD95008A1F8DE0008BF54 -:205400000120D9D1D6E770B53A4D6B6893F8D50002281FBF93F8D50001280C2070BD00211A -:2054200018460C46C1EB011200EB820282F82240491CC9B20229F5D31C7093F8D20030B115 -:20544000FEF743FCFDF793FE686880F8D240686880F8CC4080F8CD4080F8D140012180F83D -:20546000B71080F8BC4080F8D44040F2011120F8B41F8170002070BD1E4810B54068002104 -:2054800080F8D510012180F8D510FFF7BCFF002818BFFFDF10BD2DE9F041164C06460C27AD -:2054A000606890F8D51001291FBF90F8D50002280C20BDE8F081FEF7A7FAFEF732F8FDF73D -:2054C000F1FF6068012590F8B410002901BF90F8B510002990F8B61000291CBF90F8CD108C -:2054E00000297BD090F8BC00032807D002280AD00DE00000C40000203C0D00200521FE4848 -:2055000000F0F2FE03E00321FB4800F0EDFE606890F8CE10002904BF90F8D000002842D0DA -:20552000FCF7E0FA074660683946D0F8C800FCF7C1FEF24990FBF1F801FB18004142384604 -:20554000FBF7DFFF0146EE48C0F8C810D0F8C4104144C0F8C41008F0CCF801466068D0F82E -:20556000C42091421FD80021C0E9311790F8D000002818BF08F0C7F9606890F8D110002902 -:205580001CBF90F8CE1000290DD090F8AD2000F1AE01012A04D1497901F0C00140290FD013 -:2055A000AE30FEF78DFF606890F8AD10AE30FDF7F2FF6068002790F8D510012917D107E067 -:2055C00008F0C9F96168AE31FEF749FFEBE705E080F8DC50022180F8D51008E090F8D510FC -:2055E000022902BF80F8D5500C20BDE8F081606890F8B710B1B190F8BC00032818BF08F029 -:205600000BF9C04808F064F90146606880F8D210C0F8D860BC48FEF7E0F9FEF7FDF9384695 -:20562000BDE8F08108F0D7F8EBE770B5FEF7ECF9B64C606890F8D510022903D0FEF7ECF9AD -:205640000C2070BD012180F8DD10A0F8DE100220FEF7D7F9AE48FDF7E6FF6068DFF8B4C219 -:20566000002100F1B40300BF90F8D420521CACFB02546408A4EB84042244D2B280F8D420E2 -:20568000D25C012A08D0491CC9B20329ECD300BFFFF72DFE002070BD90F8D4009E49085C3A -:2056A000FDF7C9FFFDF7FEFEF2E79849496881F8BD000020704710B5040016BF022C0020DA -:2056C0000120FEF78DFE002808BF10BD8F480021406880F8AC4080F8CD10012010BD8B4952 -:2056E000496881F8D100704710B5884C616891F8AC00002816BF02280020012081F8AD00D3 -:20570000AE31FEF757FE6068012180F8CD1090F8AC10022916BF03290122002280F8D02004 -:2057200090F8AD1000F1AE03012904BF5B7913F0C00F0AD000F1AE03012904D1597901F0B1 -:20574000C001402901D0002100E0012180F8CE10002904BF002A10BDFCF7C4F96168C1F8C0 -:20576000C8004AF2B810C1F8C40010BD002816BF0228012200226549496881F8B72081F87F -:20578000BE00704770B5614D0C4600280CBF01230023696881F8B73081F8BF004FF0080085 -:2057A00081F8C0000CD1002C1ABF022C01200020114607F0A1FF6968082881F8C00001D066 -:2057C000002070BD022C14BF032C1220F8D170BD4E4A0328526808BFC2F8B81082F8BC0028 -:2057E000002070474949496881F8CF00002070474648416891F8BC00032804D0012818BFF5 -:20580000022807D004E091F8BF00012808BF70470020704791F8BE00012814BF032801204E -:20582000F6D1704710B5FEF709FAFEF7CFF9FEF775F8FEF7D8F8354C606890F8D20038B1BD -:20584000FEF743FAFDF793FC6168002081F8D2006068012180F8DC10022180F8D510FEF79C -:20586000DBF8002010BD2949496881F8D600704710B5FEF7E3F9FEF7A9F9FEF74FF8FEF7E1 -:20588000B2F8224C606890F8D20038B1FEF71DFAFDF76DFC6168002081F8D200606801215E -:2058A00080F8DC10022180F8D510FEF7B5F8BDE81040002001F0EABC2DE9F84F134DFF21D9 -:2058C00000246A687F2782F8D31060B10D4809F0E9F880B90B4809F01DF920B1094808F0DA -:2058E000BCFF04281FD0686890F8D510052928BFBDE8F88F12E016E0640D002040420F004A -:205900005C0C00203C0D0020880F0200C40000208E0F0200ABAAAAAA8B0F0200DFE801F07D -:20592000F7F7F7F6F500686890F8D500FC4E4FF00108052880F0CC82DFE800F0EBEBEB0372 -:20594000EA00F74808F089FFA870686890F8B70028B9FDF760FE002808BF002400D001243C -:20596000686890F8D20080B107F01AFF6968FF2881F8D3000ED00146F01C07F002FF68687F -:2059800090F8D30007F017FF0443686890F8D300FF280CD1686890F8B71091B190F8BC0084 -:2059A000032804D007F089FF696881F8D300A878072880F0CC81DFE800F044B40AFDFDFD90 -:2059C000280007F048FF696881F8D300EFE7686890F8D20018B1FEF778F9FDF7C8FBD14845 -:2059E000FEF799F9002808BF2F70FEF77FF9002C00F04981686890F8BC00012818BF022801 -:205A000040F04181FDF78AFF6AE0686890F8D20018B1FEF75AF9FDF7AAFBC248FEF77BF986 -:205A2000002808BF2F70FEF761F9002C00F02B81686890F8BC0002284BD0012850D000F02F -:205A400022B9686890F8D20018B1FEF73EF9FDF78EFBB448FEF75FF9002808BF2F70FEF703 -:205A600045F9002C00F00F81696891F8BC0002282FD0012834D003281CBFFFDFBDE8F88FC0 -:205A8000F278D1F8B800837E9A421BD13279C37E9A4217D17279037F9A4213D1B279437F88 -:205AA0009A420FD1F279837F9A420BD1327AC37F9A4207D13278437EC2F380129A4208BF0E -:205AC000012200D0002291F8BF30012B0ED00AB3D5E09348FFF795FBBDE8F84F00F01CBBA9 -:205AE0008F48FFF78EFBBDE8F84F00E4002A77D100F11A018A4808F0BBFE894808F0D6FEE2 -:205B00006968D1F8B8104876B9E0F9E1E3E1E0E12CE1DDE191F8D30091F8C01088427CD1D6 -:205B2000ADE0686890F8D20018B1FEF7CEF8FDF71EFB7C48FEF7EFF8002808BF2F70FEF7FA -:205B4000D5F8686890F8D01000290CBF4FF0010B4FF0000B4FF000093178CA0906F10901F2 -:205B600007D0497901F0C001402908BF4FF0010A01D04FF0000A90F8BC10032906D190F867 -:205B8000B710002918BF90F8C00001D190F8D30007F0CEFD009088B1102108F044FB0028AE -:205BA00018BF4FF0010BBAF1000F07D006F10901009800E0CBE0FEF721FC8146686890F8DD -:205BC000BC1003290DD0FDF7A9FE3CB3FDF7EBFC50EA09005DD05248FFF713FB00F048B98C -:205BE0004DE0D0F8B800F178827E91421ED13179C27E91421AD17179027F914216D1B179D6 -:205C0000427F914212D1F179827F91420ED1317AC27F91420AD1317801E034E039E0407EE1 -:205C2000C1F38011814208BF012600D00026B9F1000F05D1BBF1000F04D0FDF7B4FC08B1FD -:205C4000012300E00023686890F8BF10012901D011B10AE03CB908E02EB990F8D32090F888 -:205C6000C0C0624501D1012200E0002213420AD0012904BF002ED0F8B8003FF439AFBDE87C -:205C8000F84F00F0BBBAFDF749FEBDE8F84FFFF72EBB686890F8BE10032918BF02297DD1B0 -:205CA000BAF1000F7AD0B9F1000F77D11C4C90F89A10002972D190F8CF1000296ED080F893 -:205CC0009C8090F8D20018B1FDF771FA01282BD0204608F0EBFD0146686880F89D1000F18F -:205CE0009E01204608F0C4FD204608F0ECFD0146686880F8A41000F1A501204608F0C6FDA4 -:205D0000686800F1AB0428787F2808BFFFDF287820702F70686880F89A800320A6E000004D -:205D20003C0D0020C4000020FDF784FA696801F19E029D3107F00EFD002808BFFFDF6868D4 -:205D400090F89D1041F0020180F89D10CCE7686890F8D20018B1FDF7B8FFFDF708FAFE4828 -:205D6000FDF7D9FF00286ED12F70C1E0FB4808F074FDA870FA48F178427A91421ED1317919 -:205D8000827A91421AD17179C27A914216D1B179027B914212D1F179427B00E054E09142FE -:205DA0000CD1317A827B914208D131780078C1F38011B1EBD01F08BF012600D00026FDF7E9 -:205DC000ADFDA87804286CD1E6B3E348FDF7A3FF002808BF2F70FDF789FF686890F8DC00F8 -:205DE00000281CBF0020FFF7D3FA6968DB4C81F8DC8091F85E0038BB042081F86A0091F886 -:205E0000D20018B1FDF7D3F9012835D0204608F04DFD6A680146204682F8611002F1620191 -:205E200008F026FD686800F16B01204608F09FFD0446FF2888BFFFDFE1B268681F2980F867 -:205E4000681002E02DE053E012E084BF1F2180F8681000F1690428787F2808BFFFDF287859 -:205E600020702F70686880F85E80042001F00EFABDE8F84FFFF73BBAFDF7DCF9696801F14D -:205E80006202613107F066FC002808BFFFDF696801F13C0091F8611041F0020180F825100C -:205EA000C0E7AD48FDF737FF002808BF2F70FDF71DFF686890F8DC00002804BF0120FFF748 -:205EC00067FA686880F8DC40BDE8F84FFFF70FBAFFDFBDE8F88F90F8D20018B1FDF7F5FE3E -:205EE000FDF745F99C48FDF716FF00283FF43CAFFDF7FCFEFDF712FDBDE8F84FFFF7F7B9BA -:205F00009548FDF708FF002808BF2F70FDF7EEFE686890F8DC00002804BF0120FFF738FAD3 -:205F2000686880F8DC40FDF7F9FCBDE8F84FFFF7DEB92DE9F041884C606890F8D50007282C -:205F40007DD2DFE800F09898989898040F008348FDF765FDFDF7D4FE6168042081F8D5000E -:205F6000BDE8F081FDF76AFEFDF730FEFDF7D6FCFDF739FD60680125022180F8DC5080F870 -:205F8000D510FDF749FD60680078002818BFFFDF002660688670D0F8B8100A8882804A88EB -:205FA00042838A888283C988C1836E4981F8206090F8D02001F58471A1F584774AB10A784F -:205FC000C2F38013CA1C23B1527902F0C002402A30D090F8D12042B111F8032BC2F38012EC -:205FE0001AB1497911F0C00F24D00E300AF060FD606890F8D20018B1FDF7D9F8012823D0EF -:206000006068D0F8B8104A7EC271D1F81A208260C98B81814661068360680570D0F8B80005 -:206020000088F9F752FEF9F779FBBDE8F041022001F02CB9D7F80B11C0F80E1000E01AE0CB -:20604000B7F80F114182D3E7FDF7F4F8616801F10802C91D07F07EFB002808BFFFDF606864 -:20606000C17941F00201C171D7F8E3104161B7F8E7100183D0E7FFDFBDE8F08170B5364CA0 -:20608000606890F8D5000025052828BF70BDDFE800F03E3E3E1D03002F48FDF73CFE002817 -:2060A00004BF7F202070FDF721FE606890F8DC00002804BF0120FFF76BF9606880F8DC50DD -:2060C000FDF72CFCBDE87040FFF711B9FDF7B6FDFDF77CFDFDF722FCFDF785FC606890F8A4 -:2060E000D20030B1FDF7F1FDFDF741F8606880F8D2506068012180F8DC10022180F8D510AE -:20610000FDF78AFCBDE87040002001F0BFB870BD00231A4601F08CB970B5012001F024F8EF -:206120000D4C20B30E49A1F1280008F0CFFB60680B4E90F8AD10304608F0AFFB606800F129 -:20614000AE01304608F08DFB606890F8D010002944D090F8BC1007E0C40000203C0D0020A5 -:20616000640D00205C0C0020032922D028E0FDF765FDFDF72BFDFDF7D1FBFDF734FC6068C2 -:2061800090F8D20038B1FDF7A0FDFCF7F0FF6168002081F8D2006068012180F8DC100221A4 -:2061A00080F8D510FDF738FCBDE87040002001F06DB890F8B710002918BF90F8C00001D166 -:2061C00090F8D30007F0C9FB050007D00121304608F063FB2946304608F043FB7248FDF716 -:2061E0001EFC01210846FDF7AEFD00210846FDF77EFC6168052081F8D50070BD2DE9F041E9 -:20620000022000F0B1FF694C0126F0B1012001F03DF86549A1F1280008F058FB6068624FCC -:2062200090F8AD10384608F038FB606800F1AE01384608F016FB606890F8D01000293AD01E -:2062400090F8BC10032921D027E0FDF7F7FCFDF7BDFCFDF763FBFDF7C6FB606890F8D20009 -:2062600038B1FDF732FDFCF782FF6168002081F8D2006068022180F8DC6080F8D510FDF77A -:20628000CBFBBDE8F041002001F000B890F8B710002918BF90F8C00001D190F8D30007F0DE -:2062A0005CFB050007D00121384608F0F6FA2946384608F0D6FA6068D0F8B800C18A3A4859 -:2062C00008F07FFB6068D0F8B800017D364808F07CFB3548FDF7A3FB606880F8CC600621F7 -:2062E00080F8D510BDE8F08170B50C46054608F091FA032C51D0052C18BF70BD05212846CD -:2063000008F08BFA294C6068D0F8B80000F10D01284608F040FB6068D0F8B80000F1110158 -:20632000284608F03CFB6068D0F8B800017D284608F04BFB6068D0F8B800C18A284608F055 -:2063400040FB6068D0F8B8004188284608F02DFB6068D0F8B8008188284608F02AFB6068BF -:20636000D0F8B800C188284608F027FB6068D0F8B80000F10801284608F041FB6068D0F858 -:20638000B800017E284608F022FB606890F8D6102846BDE8704008F024BB2846BDE87040B0 -:2063A000032108F03ABA0000640D0020C40000202DE9FF4F06460C46488881B040F2E24100 -:2063C00048430090E08A002500FB01FB94F863009046082816BF07284FF0010A4FF0000A90 -:2063E000049818B10121204603F000FC94F85100012808BF002708D0022808BF012704D008 -:2064000003281ABFFFDF0027032794F8D000DFF8189448B101285CD0022842D0032818BFDE -:20642000FFDF56D000F0B6B8B8F1000F08BFFFDFFE4D6868002808BFFFDF3846FDF729FB1F -:2064400000F2E7314FF47A70B1FBF0F0696800EB01083846FDF71DFB012F04BF49464FF465 -:2064600096620BD0002F04BFF1494FF4C86205D0032F0CBFEF49F04940F6980211440844FC -:206480004AF2531101444FF47A70B1FBF0F040F2E241081A2969584441440844051D0120A5 -:2064A00014E0E24FA8F101017868084308BFFFDFE248B8F1000F006800EB0B0505D0786852 -:2064C00000F21E30A84288BFFFDF032084F8D0005FE094F86300009D21281CBF94F864001F -:2064E000212846D1B4F85800B4F80611401A401C00B200283DDB94F80401002839D00128E2 -:2065000008BF002007D0022808BF012003D003281CBFFFDF0020012F04BF49464FF4966217 -:206520000BD0002F04BFC2494FF4C86205D0032F0CBFC049C04940F698021144012804BF21 -:2065400048464FF496620BD0002804BFB8484FF4C86205D003280CBFB648B74840F69802A7 -:206560001044081A00F2E7314FF47A7091FBF0F00544B8F1000F0CD0AC4F786818B9788879 -:20658000002818BFFFDF786800F21E30A84288BFFFDF05B9FFDF2946D4F8D400FAF7B1FFA3 -:2065A000C4F8D400B0600020307001203071204603F005FCAAF10101084204BF01207071B3 -:2065C00006D094F8D00001280CBF02200320707194F8510094F85280D4F824B0012808BFA4 -:2065E000002708D0022808BF012704D003281ABFFFDF00270327B8F1010F08BF00200AD002 -:20660000B8F1020F08BF012005D0B8F1030F1ABFFFDF00200320FDF751FA012F08BF4FF4D5 -:2066200096610ED0002F04BFDFF804924FF4C86107D0032F0CBFDFF8FC91DFF8FC9140F6E8 -:206640009801494408444AF2AB3101444FF47A70B1FBF0F0584400F5C770F060049830EAE4 -:206660000A0004BF05B0BDE8F08F2946304607F0D0FE87B2204603F0A2FBB8420FD8012198 -:206680000746717105FB07F1D4F8D400FAF739FFB0602946304607F0BCFE384487B2394630 -:2066A000204603F0A3FAB068C4F8D40005B0BDE8F08F2DE9F0430446614885B00D4690F817 -:2066C0000004DFF88091400999F800144909884218BFFFDFDFF85481002708F13C06082DCC -:2066E00080F02381DFE805F0047F898984FDFDCB202C28BFFFDF36F814000621F9F7DAF9AF -:20670000050008BFFFDF202C28BFFFDF36F814002988884218BFFFDF95F8D000002808BF00 -:20672000FFDF284603F03BF8C8F80470A8F8027029460020C8F8107007F0F6FE00F1980658 -:20674000686AB0423CD995F85100012808BF002408D0022808BF012404D003281ABFFFDFCA -:206760000024032495F85200012808BF002007D0022808BF012003D003281CBFFFDF00201F -:20678000FDF79CF9012C04BF27494FF496620BD0002C04BF26494FF4C86205D0032C0CBF60 -:2067A0002449254940F69802114408444AF2AB3108444FF47A71B0FBF1F1686A0844871BAE -:2067C00029460020C8F8087007F0AEFE698840F2E24251439830081AA0F21E30C8F80C00DE -:2067E00005B0BDE8F08305B0BDE8F04303F0D9B805B0BDE8F043FDF73ABB99F8140D124938 -:20680000400991F800144909884218BFFFDF202C28BFFFDF36F814000621F9F74BF905000E -:2068200008BFFFDF202C11E0FC6601008C0D0020445B01000C1101002C5F0100D40000201C -:2068400001E000E00BE000E019E000E028BFFFDF36F814002988884218BFFFDF0022012356 -:2068600029466846FFF7A4FD95F8DA006946FBF72AFB002808BFFFDF05B0BDE8F083202C51 -:2068800028BFFFDF36F814000621F9F713F9050008BFFFDF202C28BFFFDF36F81400298820 -:2068A000884218BFFFDF95F8D000042818BFFFDF85F8D07095F8DA404FF6FF79202C28BFC7 -:2068C000FFDF26F8149095F8DA00FBF7ECF8002808BFFFDF202085F8DA00D5F8E0000028A2 -:2068E00000E022E004BFD5F8DC00C8F8140008D0D5E939121144826911448161D5E9370128 -:20690000C860D5F8DC0000281CBFD5F8E010016104D1D5F8E000002818BF8761FD4800785E -:2069200005B0BDE8F043F3F76BBCFFDF05B0BDE8F0832DE9F047F84D0746E88B6C68401C8C -:20694000E88328784FF00008002808BFFFDF07D0DFF8C8A3042814D0052818BFFFDF40D0FD -:2069600021462869FAF7CDFDB86087F8008001203871A86800F25910F860287804287CD1A7 -:2069800085E00029ECD02E69DAF8141039B38946C9680029FBD1B9F1000F20D099F8000005 -:2069A000002808BFFFDFD9F81410D9F8040001443046FBF77FFC002807DA211A4A1E92FBDF -:2069C000F4F202FB0406214604E090FBF4F202FB140621468E4288BFFFDF3446C0E74446F0 -:2069E000BEE70029BCD0D5F81890B9F1000F08BFFFDF0026D9F8E410DAF814403046721E53 -:206A00005CB1A069884228BF824284BF024626462046E468002CF4D106B9064609F1D00478 -:206A2000C9F8E060002E04BFC4F80C80CAF8144005D0F068F460E060002818BF0461D4F815 -:206A40001090C4F81880B9F1000F0ED0D9F8180048B1D4F814A0504538BFFFDFD9F81800F6 -:206A6000A0EB0A00A061C9F81880002E08BFC5F8208009D03078002800E00DE008BFFFDFBA -:206A8000716970680844286240F6B83468E7E88B0A2838BF032000D302207871E88B0128C4 -:206AA00006D93846696807F0B4FCE98B0844E883B8682861BDE8F0872DE9F0418046984824 -:206AC00084B00E4690F80004964F410997F800044009814218BFFFDF01210025082E8E4CC8 -:206AE00062D2DFE806F0041A35353061614D61732173607800281CBF04B0BDE8F081874802 -:206B0000456005612573A068CD38FEF7C4FC002818BFFFDF04B0BDE8F081607850B1207BF5 -:206B2000002808BFFEF77EFE657304B0BDE8F041FAF7E3BEA173FEF778FD002818BFFFDFA6 -:206B400004B0BDE8F08104B0BDE8F041FDF78FB997F8140D7449400991F800144909884236 -:206B600018BFFFDF00216846FFF7E3FE69464046FBF7A9F9002808BFFFDF04B0BDE8F0815A -:206B80002078052818BFFFDF207F002808BFFFDF25772570207DFAF786FF002808BFFFDFFE -:206BA000257504B0BDE8F081FFDF04B0BDE8F08170B5594C0026207804281FBF2078052872 -:206BC0000C2070BD01206070607B002518B372B6607B00281CBFA07B002805D0FEF722FE6D -:206BE0006573A573FAF789FE62B6207DFBF7E1FB207F28B125772078052818BFFFDF0C26EA -:206C000065702570207DFAF74EFF002808BFFFDF2575304670BD207DFBF7DEF9E5E72DE9DD -:206C2000F04F3D4883B00078002818BFFFF7C0FF0120DFF8E88088F8000069460620F8F78D -:206C4000C4FE002818BFFFDF00274FF6FF7934E0029800281CBF90F8D01000292DD00088EA -:206C600048451CBFDFF8C4A04FF0200B3BD00621F8F720FF040008BFFFDF94F8DA00FBF7C6 -:206C800098FB84F8D07094F8DA504FF6FF76202D28BFFFDF2AF8156094F8DA00FAF703FF33 -:206CA000002808BFFFDF84F8DAB069460620F8F78CFE002818BFFFDF10E06846F8F763FEE8 -:206CC0000028C5D00FE0029800281CBF90F8D010002903D000884845C9D104E06846F8F7D7 -:206CE00052FE0028EFD088F80070C8F8147003B00020BDE8F08F10B50078064CD8B10128F1 -:206D00000CBF40F6C410FFDF15D0A06841F66A0188420DE0D0000020A40D00208C0D002000 -:206D200001E000E00BE000E019E000E0C80D002028BFFFDF10BDA060E7E710B5FE4C002367 -:206D40002070FE48037043700377037343738373202183610175183843703A3010214FF61D -:206D6000FF72428020F8042F491EFAD1180008BFA36005D0002B0EBFFFDF40F6C410A060CC -:206D8000A06841F66A01884228BFFFDFBDE8104045E72DE9F047E94C054684B020781746A3 -:206DA000884600281EBF0C2004B0BDE8F08795F8510095F85260D5F82490012808BF4FF037 -:206DC000000A0BD0022808BF4FF0010A06D003281ABFFFDF4FF0000A4FF0030A012E08BF50 -:206DE000002008D0022E08BF012004D0032E1ABFFFDF00200320FCF761FE0146BAF1010F30 -:206E000004BFCF484FF496620DD0BAF1000F04BFCC484FF4C86206D0BAF1030F0CBFCA4812 -:206E2000CA4840F69802104408444AF2AB3108444FF47A76B0FBF6F0484400F21E30C5F81F -:206E4000E400A56195F8D000002818BFFFDF40F2712008FB00F060600020FCF72FFE00F266 -:206E6000E730B0FBF6F040F2712107FB0100A0606168A1F2E921884298BF01460020A160B4 -:206E8000B34908610521217060702077E083B148FAF7AEFD2075202808BFFFDFFAF722FEE4 -:206EA000206101216846FFF744FD207D6946FBF70AF8002808BFFFDF002004B0BDE8F0874D -:206EC0009E48007800281CBF0020704710B50620F8F78CFD80F0010010BD30B5974C85B0DC -:206EE0002278002A1EBF0C2005B030BD0D4640F27121484360600020FCF7E0FD4FF47A71A3 -:206F000000F2E730B0FBF1F040F2712105FB0100A0606168A1F2E921884298BF0146002029 -:206F2000A160607004212170E0838A48FAF760FD2075202808BFFFDF8548406938B101461F -:206F4000C0680028FBD111B1FAF7CCFD05E0FAF7C9FD40F6B831FAF7D4FA206101216846CE -:206F6000FFF7E7FC207D6946FAF7ADFF002808BFFFDF002005B030BD70B5704CA169016074 -:206F8000FFF716FE002300BBA169D1F8E0205AB1D1E939C5AC449569AC44C2F818C0D1E949 -:206FA000372CCCF80C2005E0DFF8A4C1D1F8DC20CCF81420D1F8DC20D1F8E010002A18BF21 -:206FC000116102D1002918BF8B61A36170BD60494870704770B540F2E24300FB03F614466D -:206FE000012908BF002508D0022908BF012504D003291ABFFFDF00250325012C08BF002073 -:2070000008D0022C08BF012004D0032C1ABFFFDF00200320FCF752FD012D04BF48494FF47E -:2070200096620BD0002D04BF46494FF4C86205D0032D0CBF4449454940F698021144084435 -:207040004AF2AB3108444FF47A71B0FBF1F000F21E3086428CBF301A002070BD2DE9F041E1 -:20706000064690F84F0000240D4610F0040F04BF96F8500010F0040F3146204611D007F0FA -:2070800053FA07463146204607F032FAB8423146204602D907F02CFA01E007F045FA044626 -:2070A00002E007F041FA044696F85100012808BF002708D0022808BF012704D003281ABFB3 -:2070C000FFDF0027032796F85200012808BF002007D0022808BF012003D003281CBFFFDFF1 -:2070E0000020FCF7EBFC012F04BF15494FF496620BD0002F04BF13494FF4C86205D0032F6D -:207100000CBF1149114940F69802114408444AF2AB3108444FF47A71B0FBF1F0718840F236 -:2071200071225143C0EB4100A0F21E30A54234BF2146294681420FE0D0000020A40D002039 -:20714000FC660100445B01000C1101002C5F01008C0D0020B96A010003D2A5422CBF284690 -:2071600020467062BDE8F081C64910B54968002801F1980408BF04F5BC7409D0012808BFCD -:2071800004F5317404D0022814BFFFDF04F5B074BD488068A0428CBF0120002010BD10B598 -:2071A000B84C607828B1D4E90201626807F059F9A060D4E9010188429CBF2078002814BFD0 -:2071C0000020012010BD042210B584B005295AD2DFE801F00A2B0330540080F8D02004B098 -:2071E000BDE81040FAF789BB0446A6480078002818BF84F8D02004D004B0BDE81040FAF7DC -:207200007CBB0122002321466846FFF7D1F894F8DA006946FAF757FE002808BFFFDFB4F849 -:207220005800401CA4F85800E6E7032180F8D01004B010BD0446408840F2E241484393490E -:207240000860D4F8F8000089E082D4F8F80080792075D4F8F80040896080D4F8F80080898B -:20726000A080D4F8F800C089E0802046A16AFFF7F5FE022084F8D00004B010BD816A04B099 -:20728000BDE81040EAE6FFDF04B010BD2DE9F041DFF8FC8100257C4C98F8001084B0052841 -:2072A00080F0C180DFE800F003166DB9B900E5830846F2F7A5FF6078002873D10021684618 -:2072C000FFF737FB207D6946FAF7FDFD002808BFFFDF67E00020FCF7F1FB6E49694E084482 -:2072E0004FF47A71B0FBF1F02169726840F2E2431144081AA16900F2DE604A88D03102FB98 -:2073000003F772698A4208BF002514D0216AFAF7D1FF002807DA391A4A1E92FBF7F202FB79 -:207320000705394604E090FBF7F202FB170539468D4288BFFFDFD8F80800854208D2A0695C -:2073400040F271224188C1824A4305EB420505E040F2E240B5FBF0F0A169C882A06905214C -:207360000175C08A6FF41C71484305EB400040F635413061B0EB410F28BFFFDF04B0BDE85C -:20738000F081E5830846F2F73BFF01202077A0692169C0F8D41080F8D0502178052918BF86 -:2073A000FFDF06D0FAF7A9FA6573A57304B0BDE8F081002808BFFFDFA06990F8D000002875 -:2073C00018BFFFDFA06990F8DA00202818BFFFDF3148FAF70DFBA1690646202881F8DA002D -:2073E0000F8828BFFFDF2D4820F81670A06990F8DA00202808BFFFDF002301226846A169C8 -:20740000FEF7D6FFA069694690F8DA00FAF75BFD002808BFFFDFA561C4E704B00846BDE81A -:20742000F041F2F7EDBEFFDF04B0BDE8F081704770B5144D0446002904BF686070BD4FF434 -:207440007A76012910D002291CBFFFDF70BD6888401C68801046FCF71CFB00F2E730B0FBD9 -:20746000F6F0201A686070BD1846FCF79BFE00F2E730B0FBF6F0201A686070BD0248007882 -:20748000704700008C0D0020A40D0020D4000020D0000020D7020200B3660100C80D0020DD -:2074A000FE48406870472DE9F04114460E460746012A08BF002512D0022C08BF012504D0FD -:2074C000032C1ABFFFDF00250325032C08BF4EF6341007D0022C14BFFFDF012000D0002034 -:2074E000FCF7ECFA012D08BFED4907D0002D08BFEC4903D0032D0CBFEB49EC4908444AF2C9 -:20750000531108444FF47A71B0FBF1F000EB47008519012C08BF002008D0022C08BF01202F -:2075200004D0032C1ABFFFDF00200320FCF79FFA28446030BDE8F0812DE9F041064690F895 -:207540004F00012490460D4610F0040F04BF96F8500010F0040F3146204611D006F0E4FF30 -:2075600007463146204606F0C3FFB8423146204602D906F0BDFF01E006F0D6FF044602E0ED -:2075800006F0D2FF044696F852000027012827D0022829D003282CD0FFDF3846FCF78EFA92 -:2075A000C04940F2712208444AF2531108444FF47A71B0FBF1F071885143C0EB4100A0EB07 -:2075C0000800A0F55870A54234BF21462946814203D2A5422CBF284620467062BDE8F08170 -:2075E0003846FCF76BFADBE70120FCF767FAAC49D7E70320FCF762FAAB49D2E72DE9FF4F48 -:207600008FB0044690F85200DDF870909846069049EA08000C9094F8640000261746082844 -:207620000CBF012000200890B8F1000F04BF94F80C01032846D10898002843D0B4F8840144 -:20764000B8423FD1D4F81401C4F80001618840F2E2404843C4F80401B4F85A01B4F8E61050 -:207660000844C4F80801204604F0FDFAB4F88801E08294F886012075B4F88A016080B4F8A6 -:207680008C01A080B4F88E018A49E0808848097894F86C31628830F8111030F8130008449B -:2076A0000104090C4FF0000004D083485143B1FBF0F0401C82B22046A16AFFF73DFF02205D -:2076C00084F80C01D4F864010B90B4F8E6B0B4F85801D4F860A1D4F854110491B8F1000FC3 -:2076E00003D094F8201149B180E004F1E00101917431099104F5A075091D07E004F59A71DA -:207700000191091D099104F59275091D0A91B4F85810381A791A09B200B20091002805DA58 -:20772000D4F85001049001200C90084694F80C1100295FD0012900F0748102297DD00329D9 -:2077400018BFFFDF00F09E8131460498F9F7D9FE099908600A9801210780002028702971E4 -:2077600009980068A8605348D0E90520824287BF019A1060019802600198626A006810444E -:2077800000F28110E8606971B4F8D000C01B00B20028C4BF032068710898002800F0088252 -:2077A000B9F1000F19D000BFB4F8F820002A0CBF0020B4F8FA00A4F8FA0094F8FC30401C3F -:2077C0005843904209D26879401E002805DD6971B4F8FA00401CA4F8FA00B8F1000F00F0FE -:2077E0000B8294F82001002800F0028213B00220BDE8F08FBAF1000F08BFFFDFE18A40F2AE -:207800007120484340F2E24101EB400210980021002806D000FB02F12748B1FBF0F000F128 -:207820000101C4F81011608840F2E24100FB01F210994FF0000008D000E05CE01E4801FB00 -:2078400002F1B1FBF0F000F10100C4F814014FF00000FCF7A7FC00F2E1414FF47A70B1FB24 -:20786000F0F000EB0A060020FCF79CFC83460020FCF724F91149584401444FF47A70B1FB75 -:20788000F0F0E18A40F271225143C0EB4101D4F81001091A314401F2C24611E0080E0020C0 -:2078A000FC660100445B01001C3801002C5F0100920F0200DC00002040420F0091FD010025 -:2078C000217D520011FB02F10122FFF7ECFD811CFE48416181610020FCF764FC00F2E141C9 -:2078E0004FF47A70B1FBF0F05044301AB0F53C7F38BFFFDF28E7E18A40F27122D4F80401AC -:20790000514300EB410210990020002906D0F04801FB02F1B1FBF0F000F10100C4F810016B -:20792000618840F2E24301FB03FC109B4FF0000106D0E74903FB0CF3B3FBF1F101F101019A -:20794000C4F81411BBF1000F47D1B9F1000F44D094F85200012805D0022809D0032818BFC5 -:20796000FFDF0BD00020FCF7A9F80146D9480AE00120FCF7A3F80146D74804E00320FCF739 -:207980009DF80146D548E38A01444AF2531001444FF47A70B1FBF0F0D4F8101140F27122ED -:2079A0000144D4F804015A4300EB4200461A94F85200012808BF002007D0022808BF0120B0 -:2079C00003D003281CBFFFDF0020FCF750F80B99081A3044A0F1200600E0161AD4F808219F -:2079E000D4F80011D4F8100140F2E24301FB020094F85220217D11FB03F1FFF754FD01464E -:207A0000B24840F2712341616288D4F814115A43C1EB4201A1F211318161012084F80C013C -:207A200092E6628840F27123D4F814115A43C1EB420202FB00F60098D4F800C10BEB000290 -:207A4000D4F80801D4F81031121A0CFB0030521E02FB010094F85220217D40F2E24311FB74 -:207A600003F1FFF720FD01469848B9F1000F4161A6F2113181613FF467AEBAF1000F08BFF8 -:207A8000FFDF61E6628840F27123D4F814115A43C1EB420101FB00F694F8630021281CBF8F -:207AA00094F8640021280AD1B4F88401381A00B2002804DB94F88701002818BF06900C9829 -:207AC00030B10B98BBF1000F1AD0002818BFFFDF0098D4F81411584448430021069AFFF739 -:207AE000E2FC0146794840F2712341616288D4F814115A43C1EB4201A1F21131816123E611 -:207B0000002814BFBAF1000FFFDF0698012808BF4FF0000A0BD0022808BF4FF0010A06D00F -:207B200003281ABFFFDF4FF0000A4FF0030A94F85200032808BF4EF634110BD0012808BFAA -:207B4000002004D002281ABFFFDF00200120FBF7B5FF0146BAF1010F08BF5F4809D0BAF175 -:207B6000000F08BF5B4804D0BAF1030F0CBF5B485B4801444AF2531001444FF47A70B1FBE8 -:207B8000F0F0361A94F85200012808BF002007D0022808BF012003D003281CBFFFDF002007 -:207BA000FBF765FF0B99081A3044A0F120068FE7B9F1000F7FF4F8AD94F80C0100283FF443 -:207BC0000CAE618840F27122D4F814015143C0EB4101284606F01DFC0004000C3FF4FDAD71 -:207BE0001D99002918BF0880012013B0BDE8F08F94F85C01FAF7F0F994F85C012946FAF733 -:207C000062F900281CBF88F0010084F82101002013B0BDE8F08F2DE9F04F324F044683B095 -:207C200038788B460025294E4FF0020A4FF00308032804BF387BA0427DD1786830613878A0 -:207C4000032818BFFFDFBBF1080F75D2DFE80BF0040F1C1C1784847D7D62FCF7ABFD0028EF -:207C600018BFFFDF86F8028003B0BDE8F08FFCF79FFF002818BFFFDF03B0BDE8F08F03B080 -:207C8000BDE8F04FFCF7F3B887F814803D74F87A012458B14FF47A71B869F9F732FCB86178 -:207CA000002107F1100006F0B4FB29E001216846FAF7F9FD9DF8000042F210710002B0FB3F -:207CC000F1F201FB1204FCF797FC0DE0DC00002040420F00445B0100FC6601001C38010057 -:207CE0002C5F0100080E002004442146B869F9F708FCB861214607F1100006F08AFB441C9B -:207D0000388C411C0A293CBF20443884786830B1388C401C0A2828BF87F815A001D287F874 -:207D20001580787A00281CBF03B0BDE8F08F387B07F1100101E013E00EE0FAF7C4F800288F -:207D400008BFFFDF03B0BDE8F08F387BF9F7ABFE3D7003B0BDE8F08FFFDF03B0BDE8F08F22 -:207D6000202C28BFFFDFDFF8EC94072139F81400F7F7A0FE070008BFFFDF202C28BFFFDFE5 -:207D800039F814003988884218BFFFDF3C4637610127BBF1080F80F05581DFE80BF004A7A6 -:207DA000B1B1AAFDFDFCC4F86051F580C4F8645194F8210138B9F9F795FED4F82C11FAF752 -:207DC00079FA00281BDCB4F81E11B4F85800814206D1B4F8D410081AA4F8D600204605E029 -:207DE000081AA4F8D600B4F81E112046A4F85810D4F84811C4F82C11C0F850111DE0B4F8CA -:207E00001C11B4F85800081AA4F8D600B4F81C112046A4F85810D4F82C11C4F84811C4F880 -:207E20005011D4F83411C4F8E010D4F83811C4F85411B4F83C11A4F8581103F054FDF9F7BC -:207E40002BFE814694F85200012841D0022843D0032846D0FFDF2846FBF730FEFE4940F2B7 -:207E6000712208444AF2531108444FF47A71B0FBF1F1D4F81401014460885043C1EB4000EF -:207E8000A0F13008B9F1B70F98BF4FF0B7092146012006F049FB4844A8EB0000A0F2153893 -:207EA000A1462146012006F03FFBD9F824109C30814288BF0D1AC6F80C80454528BF4546DB -:207EC000B56084F8207186F802A003B0BDE8F08F2846FBF7F3FDC1E73846FBF7EFFDDF490D -:207EE000BDE74046FBF7EAFDDD49B8E703F0B9FE01E0FBF7BCFF84F8207103B0BDE8F08F9E -:207F0000F9F7F0FDD4F8502101461046FAF7D2F948B1628840F27123D4F814115A43C1EB0B -:207F20004201B0FBF1F094F8641008290FD0B4F85810B4F81E210B189A42AEBF501C401C2F -:207F40000844A4F81E0194F8220178B905E0B4F81E01401CA4F81E0108E0B4F81E01B4F814 -:207F6000D410884204BF401CA4F81E01B4F85A01DFF8F0A2401CA4F85A01B4F87E00B4F8E0 -:207F80007C100DF1080B401AB4F85810401E08441FFA80F819E047E054E0307800233AF84A -:207FA0001000CDE9005B94F86C113AF81110084481B22046FFF722FB002804BF03B0BDE809 -:207FC000F08F012818BFFFDF26D0B4F81E21A8EB020000B20028E0DA082084F8720084F8A8 -:207FE0007170204603F0B6F984F80C5194F85C514FF6FF77202D00D3FFDF29F8157094F89B -:208000005C01F9F750FD202084F85C01307903B0BDE8F04FF2F7F4B8B4F81E01BDF8081040 -:208020000844A4F81E01D0E794F80C01042818BFFFDF84F80C5194F85C514FF6FF77202DEE -:20804000DBD3D9E7FFDF03B0BDE8F08F10B5864C207850B101206072FCF7CAFD207803285D -:2080600005D0207A002808BF10BD0C2010BD207BF9F7B2FF207BFAF79CF9207BF9F713FDE4 -:20808000002808BFFFDF0020207010BD2DE9F04F754F83B0387801244FF0000840B17C724F -:2080A0000120FCF7A5FD3878032818BF387A0DD0DFF8B89189F8034069460720F7F785FCA0 -:2080C000002818BFFFDF4FF6FF7440E0387BF9F783FF387BFAF76DF9387BF9F7E4FC002811 -:2080E00008BFFFDF87F80080E2E7029800281CBF90F80C1100292AD00088A0421CBFDFF892 -:2081000054A14FF0200B3AD00721F7F7D3FC040008BFFFDF94F85C01FAF74BF984F80C8141 -:2081200094F85C514FF6FF76202D28BFFFDF2AF8156094F85C01F9F7B6FC84F85CB16946E0 -:208140000720F7F742FC002818BFFFDF12E06846F7F719FC0028C8D011E0029800281CBFFE -:2081600090F80C11002905D00088A0F57F41FF39CAD104E06846F7F706FC0028EDD089F8C4 -:20818000038087F80B8003B00020BDE8F08F70B50446374890F80004364D400995F8001474 -:2081A0004909884218BFFFDF95F8140D4009324991F800144909884218BFFFDF2B4900207A -:2081C00001220C7188700A704870C87026490870BDE870405AE72549087070472DE9F84332 -:2081E000214C06462078002877D12448F9F700FC2073202871D003276660277000256572C7 -:208200002572AEB1012106F1FC00FAF7C1FB0620F7F7FAFB80460720F7F7F6FB96F8FC1037 -:208220004044B1FBF0F200FB1210401C86F8FC00F9F732FC1249091838BF40F2F65000F53B -:208240009C7086B2FCF7B2F9E061FCF7D5F94FF0010817E0300E0020445B0100FC6601009A -:208260001C380100920F0200080E0020DC00002001E000E00BE000E019E000E0177C0100DB -:208280000AFAFFFF40B384F80A8001216846FAF70AFB9DF8000042F210710002B0FBF1F243 -:2082A00001FB12000644F9F71DFC3146F9F729F9A061277567752574207B04F11001F9F731 -:2082C00002FE002808BFFFDF25840020FCF790FC0020BDE8F88300E002E00C20BDE8F8833B -:2082E000F9F700FC3146F9F70CF9A061A57284F80B80DEE7FC4948707047FC4810B5417ACA -:208300000124002918BF002408D1C17A31B1406AF749884284BF0024FCF764FC204610BD7D -:2083200070B5F14C0546E088401CE080D4E902016278D5F86061002A1CBF324606F091F848 -:20834000A060864208D895F80C01012804D0E078002804BF012070BD002070BD70B5054690 -:20836000012908BF002408D0022908BF012404D003291ABFFFDF0024032440F2E24045431B -:208380002046FBF79BFB012C08BFDA4907D0002C08BFD94903D0032C0CBFD849D849084491 -:2083A0004AF2531108444FF47A71B0FBF1F000F54C7085428CBF281A002070BD2DE9F0437C -:2083C00083B00026044680F8206190F8DE00002807BF94F80C01032803B0BDE8F083F9F72E -:2083E00081FBD4F8502101461046F9F763FF0028DCBF03B0BDE8F083628840F27123D4F8CB -:2084000014115A43C1EB4201B0FBF1F0411CB4F858000144A4F81C11B4F8D410B4F81C2137 -:20842000891A09B20029DCBF03B0BDE8F083012184F82211B4F87E10B4F87C20B14F891A59 -:20844000491E084485B2DFF8A0820DF108091EE098F8000037F81000CDE90069B4F81C2155 -:2084600094F86C11012337F81110084481B22046FFF7C4F8002804BF03B0BDE8F083012809 -:208480000FD0022812BFFFDF03B0BDE8F083B4F81C01281A00B20028BCBF03B0BDE8F0832E -:2084A000D6E7B4F81C01BDF808100844A4F81C01EDE770B58C4E934B0025327882B04FF073 -:2084C000040C06295CD2DFE801F0073B03181840044680F80CC106E00446F078002818BF9C -:2084E00084F80CC10BD0F9F708FAA4F85A51B4F85800A4F81E0184F8225102B070BD33F867 -:20850000120094F80C210121032A13BF94F80C21C4F80851C4F80051012AE4D1CDE90015E9 -:2085200094F86C11B4F8D42033F811100023084481B22046FFF762F8002818BFFFDFD2E758 -:20854000032180F80C1102B070BD33F8121090F86C21B0F802C033F8122011440A04120CD9 -:208560004FF0000105D002FB0CF1674AB1FBF2F1491C8AB2816A02B0BDE87040FEF7DCBF89 -:20858000FFDF02B070BD2DE9F043584C0327564EE27AA17A83B042F21079002558B10128A5 -:2085A00036D002281EBFFFDF03B0BDE8F0834FF000081AB9ACE04FF000080AB1E5721FE007 -:2085C00051B101216846FAF792F99DF800000002B0FBF9F109FB1108FCF70EF800EB080117 -:2085E000A069F8F78EFFA06125746775607A30B9207B04F11001F9F766FC002873D02584B6 -:20860000F9F77BF9307903B0BDE8F043F1F7F8BDE572D4F81880257001272772002160682B -:2086200005F01CFB606880F8825180F88351C0F85081217B80F85C11616AC0F85481C0F8B5 -:20864000601190F85C81B0F80090B8F1200F28BFFFDF2E4820F81890646884F80C51A4F8F8 -:208660005851DFF8A080307894F86C11628838F8100038F8111008440104090C4FF0000089 -:2086800005D001FB02F02049B0FBF1F0401C82B22046A16AFEF750FF00950195307894F87E -:2086A0006C11002338F8100038F811101A46084481B22046FEF7A2FF002818BFFFDFC4F815 -:2086C0000851C4F8005184F80C71A4F81E51A4F81C5184F82251B4F85800401EA4F85800E2 -:2086E000A4F85A518CE735E0DC000020080E0020CF821300FC660100445B01001C380100BD -:208700002C5F0100920F020040420F00300E002051B101216846FAF7EAF89DF800000002FF -:20872000B0FBF9F109FB1108FBF766FF00EB0801A069F8F7E6FEA06125746775607A0028E8 -:208740007FF45DAF207B04F11001F9F7BCFB00287FF455AFFFDF52E770B5314CA1780229B6 -:2087600006BFE188002970BD2569C5F8640195F85200012808BF002007D0022808BF0120ED -:2087800003D003281CBFFFDF0020FBF770F9D5F86411081AA1680144A160E1680844E0601F -:2087A00070BD70B505461E4890F802C0BCF1020F06BF006900F5B0741A4C002904BF256090 -:2087C00070BD4FF47A7601290DD002291CBFFFDF70BD1046FBF75DF900F2E140B0FBF6F0DF -:2087E000281A206070BD1846FBF7DCFC00F2E140B0FBF6F0281A206070BD0B4800780028DC -:208800001CBF0020704710B50720F7F7EFF880F0010010BD04480078002818BF012070470C -:20882000DC0000202C0E0020080E002010B584B004466846FBF74EFD002808BFFFDF009819 -:2088400006F0ADF90321009806F0C0F90098017821F010010170214606F035FA192C80F02C -:208860002F81DFE804F03A2A0D65FEFEFD1C9FFEFDFD88FEFEFEFEFCFDFDADCBE9FEFB003B -:20888000F748806890F8F110009806F0A1FAFBF734FD00281CBF04B010BD00F0FDB8F0487B -:2088A000806890F8C910009806F0E2FAFBF725FD002840F0298100F026B9E9488068D0F83F -:2088C000FC00411C009806F074FAFBF716FD00281CBF04B010BD00F0DFB8E14CA068D0F836 -:2088E000F8008179009806F038FAA068D0F8F8000189009806F02AFAA068D0F8F800418930 -:20890000009806F00EFAA068D0F8F8008189009806F00EFAA068D0F8F800C189009806F0B9 -:208920000EFAFBF7EAFC00281CBF04B010BDB3E0CB4CA068D0F8F800011D009806F04CFA6F -:20894000A068D0F8F80000F10C01009806F04EFAA068D0F8F80000F11E01009806F04CFACF -:20896000A06800F1C001009806F054FAFBF7C5FC002877D1C5E0BA4C60690178009806F0C3 -:2089800061FA60698188009806F05EFA60694188009806F05DFAFBF7B0FC00281CBF04B0F8 -:2089A00010BD79E0AF49D1E90001CDE9020102A9009806F061FAFBF7A0FC002852D1A0E038 -:2089C000A74CA068B0F84410009806F05FFAA068B0F84610009806F05DFAA068B0F84010CE -:2089E000009806F05BFAA068B0F84210009806F059FAFBF782FC002879D182E0984CA06881 -:208A0000B0F84010009806F049FAA068B0F84210009806F047FAA068B0F84410009806F02A -:208A200035FAA068B0F84610009806F033FAFBF764FC002868D166E0894CA06890F81511C2 -:208A4000009806F056FAA06890F81611009806F054FAFBF752FC002849D152E003E01EE010 -:208A60002FE02DE043E07E4CA06890F8040105F065FE0146009806F044FAA06890F8050157 -:208A800005F05CFE0146009806F03FFAFBF735FC00281CBF04B010BDFFDF04B010BD704CB7 -:208AA000A06890F8ED10009806F053FAA06890F8EC10009806F051FAFBF71FFC20BB22E0FF -:208AC000FFDFFBF71AFC002808BFFFDF0C2C19BF132C182C04B010BD112C1CBF072C152C43 -:208AE00012D0012C19BF002C022C04B010BD00215B488068A0F88210012180F8861004B0FA -:208B000010BDFFDFF3E7FFDF554900208968A1F8880004B010BDF0B45148806890F84E3076 -:208B2000478EC68E458FB0F84010C28FB0F842C0022B1FD08D4238BF29460186624528BFDF -:208B400062468286018FB0F84430994238BF0B464386818FB0F84640A14238BF0C46C48619 -:208B6000BB4228BF1F464786B44228BF2646C686F0BC7047038E9D4228BF1D46838E9A4240 -:208B800028BF1A46A94298BF0D460586944598BF62468286002180F84E10D3E770B5304C3C -:208BA00082B0207910F0010F04BF02B070BD206900230521C578A06890F86320583005F099 -:208BC000D1FB002818BF022D0CD00B2D18BF042D08D0052D1CBF062D0D2D03D0607840F052 -:208BE00008006070607800281CBF02B070BD2069C078801E162880F0F683DFE810F0160080 -:208C0000F403B700D5002E013500F403F001F403AD007801F000F403F403F403F4035F023B -:208C200046027A02E4023703B003A0680023012190F86520583005F095FB002840F0EE836D -:208C4000206906F0C7F8A16881F8F200022081F86500002081F88A0081F8860000F0DEBBB7 -:208C6000F8000020AC0F0200A0680921002390F86320583005F076FB20B1206906F0FAF88F -:208C8000122814D0A0680A21002390F86320583005F068FB20B1206906F0ECF8142821D014 -:208CA000206906F0E7F8162840F0B88342E0A0680125002390F863200921583005F052FB3B -:208CC000002808BF657000F0A9836078002840F0A583A16881F87A0081F8860081F8630085 -:208CE00000F09CBBA0680021012580F86310A0F8821080F886100421FEF765FAA06890F8B2 -:208D00004E10012900F0AE820288A0F82221028EA0F82421828EA0F82621428E00F58C7128 -:208D2000A0F82821C08E48820D72E078F1F768FA00F074BBA06890F863101D2940F06E8390 -:208D4000002180F8981080F8631080F886101A2001F06DF800F062BBA06890F863100C2904 -:208D600047D1002180F867100F2134E0A06890F8631010293DD1D0F8F81000884988814251 -:208D800018BFFFDFA068D0F8F80000F12601206906F04DF8A06800F1C401206906F04FF8F6 -:208DA0001320A16800F086B9A26892F8630013281FD1D2F8F80002F1B00300F11E0100228C -:208DC0000E3005F064FAA0680021C0E92811012180F86710152180F8631000F01FBBA068F3 -:208DE00090F86310132912BF102990F88C00002802D0022000F053BA206906F037F8A1684E -:208E0000002581F8C80081F88B5081F88650D1F8F80009884088884218BFFFDFA068D0F8E0 -:208E2000F8100D70D0F840110A78002A18BFFFDF40F026810288CA80D0F8402190F8C810FF -:208E40001171D0F840110D72D0F840210C211170D0F840210188518040E0A06890F863107B -:208E60001829C6D1002580F88B5080F88650D0F8F81000884988814218BFFFDFA068D0F8E3 -:208E8000F8100D70D0F840110A78002A18BFFFDF40F0F68090F88C207AB180F88C500288F0 -:208EA000CA80D0F840110D71D0F840210D211170D0F840210188518010E00288CA80D0F8EA -:208EC00040110D71D0F8402101211172D0F840210C211170D0F84021018851800088F6F726 -:208EE000F4FEF6F71BFCE078F1F78AF9C8E0A0680023194690F86420583005F033FA50B9C8 -:208F0000A0680023082190F86320583005F02AFA002800F029826078002840F07F82A06855 -:208F200090F88E0010F0020F17D1206905F094FFA16881F88F00206905F090FFA168A1F851 -:208F40009000206905F08DFFA168A1F8920091F88E0040F0020081F88E00A06890F88E10C5 -:208F600011F0010F15D190F8642000231946583005F0F8F9002808BFFFDF0121A0680422E1 -:208F800080F8641080F8F42080F88A100021A0F88810A06890F86310012907D1002180F858 -:208FA000631080F88610E078F1F72AF9A168D1F8F800098842888A4204BF0178042940F043 -:208FC0002D8200250570E078F1F71AF9A06890F86310002908BF80F8865000F01FBAA068E3 -:208FE0000023072190F86320583005F0BBF9002800F0BA816078002840F01082694620699D -:2090000005F072FFA0689DF80020002590F89410114001F02F0180F8941090F895109DF88C -:209020000120114001F02F0180F8951080F88650D0F8F81000884988814218BFFFDFA06889 -:20904000D0F8F8100D70D0F840110A78002A18BFFFDF15D10288CA80D0F840110D71D0F830 -:209060004011009A8A60019ACA60D0F84021072111700188D0F840014180E078F1F7C0F839 -:20908000A06880F8635000F0C9B9A0680023092190F86320583005F065F9002800F06481F3 -:2090A0006078002840F0BA81A16881F87A0081F8860000BF81F8630000F0B0B9A06800232B -:2090C000194690F86420583005F04CF9002800F04B816078002840F0A181A0680021A0F86C -:2090E0008810012180F88A100B2180F8641000F095B9A0680023194690F86420583005F03B -:2091000031F900287DD0206905F0D8FE50B3206905F0D0FEA1680887206905F0C7FEA16829 -:209120004887206905F0C8FEA1688887206905F0BFFEA168C88791F863001A2813BF91F8E8 -:209140004E00012081F84E00012807D091F80901002804BF91F80801002813D01C2081F809 -:20916000640027E0A0680023194690F86420583005F0F8F800286FD06078002800F03F816A -:2091800000F04CB91B2081F864000A88A1F82E210A8FA1F830214A8FA1F832218A8F01F5F1 -:2091A0008C70A1F83421C98FC18301210175E078F1F726F8A0680021A0F88810012180F840 -:2091C0008A1000F02BB9A06800230A2190F86320583005F0C7F8A0B1206905F06FFEB8B1DF -:2091E000206905F067FEA1680887206905F05EFEA1684887206905F05FFEA16888872069C6 -:2092000000E02AE005F054FEA168C887FFF783FCA068002180F8861080F863100421FDF715 -:20922000D2FFA06890F84E1001291BD00288A0F82221028EA0F82421828EA0F82621428EC9 -:2092400000F58C71A0F82821C08E488201200872E078F0F7D5FFE1E04AE0607840F0010081 -:209260006070DBE0022180F84E10D7E0A0680023194690F86420583005F074F8C0B3A068B9 -:2092800090F863201D2A0CD000230B21583005F069F800281CBF607840F0200011D0607097 -:2092A000BCE0232180F8EC10162280F8ED20172180F86410012180F88A100021A0F88810F4 -:2092C000ACE0A06890F8630005F09DFA88B1A0682A22162180F8EC2080F8ED10172180F816 -:2092E0006410012180F88A100021A0F8881095E03AE0206905F0FFFD00F0070060F3070516 -:20930000206905F0FCFD00F0070060F30F25A0680122002680F88A20A0F888601E2280F8AD -:209320006420B0F84F20ADF80420B0F85100ADF800002946019805F00AFA9DF80020C1B202 -:209340008A4219BFA26882F80411A16881F804619DF80110C0F3072081423CD13FE0A06872 -:2093600090F863001D2801D0012098E7206905F0C2FD00F0070060F30705206905F0BFFD7F -:2093800000F0070060F30F25A0680121002680F88610A0F88260202180F86310B0F815117D -:2093A000ADF80410B0F85100ADF800002946019805F0CDF99DF80020C1B28A4219BFA268BD -:2093C00082F80411A16881F804619DF80110C0F30720814203D0A16881F805011EE0A06873 -:2093E00080F805611AE0A0680023194690F86420583004F0B7FF0028B6D0607870B9206995 -:2094000005F08DFCA16881F8C900052081F864000020A1F88800012081F88A00A068D0E95B -:209420002A12491C42F10002C0E92A1202B070BD2DE9F047FD4D04464FF000076878084340 -:209440006870287910F0200F2846806818BFA0F87C7004D1B0F87C10491CA0F87C1090F899 -:209460006810012639B990F8632000230621583004F078FF58B3A88810F4006F07D0A8687E -:2094800090F86810002918BFA0F874701FD1A868B0F87410491C89B2A0F87410B0F876202A -:2094A0008A422CBF511A00218288521D8A4228BF80F87A60B0F87410B0F87620914206D3D5 -:2094C000A0F8747080F81E61E878F0F799FE287910F0600F08D0A86890F8661021B980F8F3 -:2094E00066600121FDF76FFE4FF00808002C47D16878002842D1287910F0040F0DD0A868D4 -:2095000090F86300052808BFFFDFA86890F86510022904BF2E7080F8657000F020FF2879F8 -:2095200010F0080F0AD0687840B9A86890F86510032903D10221297080F86570FFF72EFB2C -:20954000A87810F0080F16D0A8680023052190F86320583004F006FF50B185F80180A868FA -:20956000D0F8401108780C2808BF0020087002E0002003F071FBA86800F07AFE00F08BFC6F -:20958000A868A14600F1580490F8F00030B9627B00230121204604F0E5FE10B1208D401CFD -:2095A00020853D21B9F1000F18D12878022808BF16200ED0012804BFA86890F8F20008D013 -:2095C0006878E8B110F0140F1CBF1E20A07602D005E0A07603E010F0080F02D0A176667634 -:2095E00041E010F0030F03D02A20A07666763AE010F0200F08BFFFDF2320A076667632E0F4 -:2096000094F82E0028B1608D411C6185A18D884213D294F8320028B1208E411C2186A18D33 -:2096200088420AD2218DE08C814203D3AA6892F8F02012B9A28D914203D32220A07666764E -:2096400011E0A17B31B1A18C814228BF84F81A80C5D206E0A08C062803D33E20A076667631 -:2096600001E0607E58B1E7722773A7730221A868FDF7A9FDE878BDE8F047F0F7C1BDA86897 -:20968000BDE8F0470021FDF79EBD68494A788B781A430ED101280AD0087910F0040F04D061 -:2096A000886890F86500022803D001207047FDF776BD0020704770B55C4C05460E46A08866 -:2096C0002843A08015F0020F04D015F0010F18BFFFDFE66015F0010F18BF266115F0020F7C -:2096E00012D0304605F01BFB062802D00B283BD00AE0A06890F86310152905D10021C0E9FE -:209700002A11012180F8681015F0800F1CBF0820A07015F4806F08BF70BDA168B1F858005F -:2097200089880844801D85B2304605F0F8FA012822D0304605F0F3FA38B3304605F0EFFAE9 -:20974000182818BF70BDA06890F80411002902BF90F8051100290025A0F806512946304676 -:20976000BDE8704005F0D5BBA06890F863100F2908BF0021C8D1C5E7A0682946A0F8025145 -:209780003046BDE8704005F01CBBA0682946D0F8F80085803046BDE8704005F0E2BAF8B5ED -:2097A000224D00260446A860AE806E70AE702E700088FAF78CFDA8680088FAF7AEFDB4F818 -:2097C000D800A968401C82B201F1580004F06FFC002818BFFFDF94F8640021280AD1B4F8CA -:2097E0005810B4F80601081A00B20028A4BF6878002804D094F8630021283CD118E0A868C6 -:2098000090F80411002908BF90F8511080F8511090F80511002908BF90F8521080F85210A7 -:20982000002000F004FB84F8646024E0F8000020B4F85810B4F80601081A00B20028A4BF97 -:209840006878002817D1A86890F80411002908BF90F8511080F8511090F80511002908BF2B -:2098600090F8521080F85210002000F0E0FA84F8986084F86360A4F8D860A868374690F89E -:20988000861029B1B0F88210B0F8842091422AD290F88A1029B1B0F88810B0F884209142A8 -:2098A00021D2B0F88020B0F87E108A421BD290F86620B0F87C00002A47D0884213D2FD4817 -:2098C0000090FD4BFD4A2146304603F041F8A8680023052190F86320583004F043FD002818 -:2098E00018BF02F0ABFDA86890F81211002908BFF8BD90F81411002906BF90F898100029A3 -:20990000F8BD90F8632000230B21583004F02AFD002818BFF8BDA86800230B2190F8642076 -:20992000583004F01FFD002818BFF8BDA868012390F8512090F81511012A09D0022A0AD0F6 -:20994000032A08BF042908D019E00628CBD2B6E7012914D101E0022911D190F8522090F82E -:209960001611012A06D0022A07D0032A08BF042913D004E0012902D10FE002290DD080F868 -:209980009830A86890F8131100291CBFB0F81511A0F84F1080F81271F8BD002000F047FA79 -:2099A000EFE7C748806890F8861029B1B0F88210B0F88420914219D290F88A1029B1B0F8FA -:2099C0008810B0F88420914210D2B0F88020B0F87E108A420AD290F86620B0F87C001AB1CB -:2099E000884203D203F0A7B80628FBD3002001461EE570B50C46064615464FF4A471204634 -:209A000006F055FF2680002D08BFFFDF2868C4F8F8006868C4F8FC00A868C4F8400170BD7E -:209A2000F6F72AB92DE9F0410D4607460621F6F741F8040008BFBDE8F081D4F840110026FE -:209A4000087858B14A8821888A4207D1082810D00D281FD00C2835D007284ED094F81E01F9 -:209A600000285CD06E700F20287084F81E616F8025E06E7008202870D4F840014168C5F8ED -:209A800002108168C5F8061080896881D4F84001067014E00846F6F718F90746F5F754FEB8 -:209AA000B8B96E700D202870D4F840014068C5F80200D4F8400106703846F5F73FFE0120D3 -:209AC000BDE8F0810846F6F700F90746F5F73CFE10B10020BDE8F0816E700C202870D4F864 -:209AE00040014168C5F802100089E880D4F8400106703846F5F722FEE1E76E70072028704A -:209B0000D4F8400141688268C068C5F80210C5F80620C5F80A00D4F840010670CFE794F83F -:209B20002001C8B16E701420287094F820010028C5D000BF84F82061D4F82201C5F802000D -:209B4000D4F82601C5F80600B4F82A01688194F820010028EED1B2E794F82C0180B16E709A -:209B60001A20287084F82C61D4F82E01C5F80200D4F83201C5F80600B4F8360168819EE73D -:209B800094F8180188B16E701820287094F81801002894D084F81861D4F81A01C5F802006D -:209BA00094F818010028F5D189E794F83801002808BFBDE8F0816E701520287094F8380168 -:209BC00000283FF47CAF00BF84F83861D4F83A01C5F80200B4F83E01E88094F83801002825 -:209BE000F2D16CE7364A5061D17070472DE9F0470446481E85B238BFBDE8F0870127DFF8E0 -:209C0000C09004F108084FF0080A0026B4F8D800401CA4F8D800B4F87C00401CA4F87C0088 -:209C200094F8680040B994F863200023062104F1580004F097FBD8B1B4F87400401C80B2D4 -:209C4000A4F87400B4F8761081422CBF0A1A0022A3885B1D934228BF84F87A70884207D365 -:209C6000A4F8746084F81E7199F80300F0F7C8FA94F8860020B1B4F88200401CA4F88200A1 -:209C800094F88A0020B1B4F88800401CA4F8880094F8F00040B994F865200023012104F169 -:209CA000580004F05FFB20B1B4F88000401CA4F8800007E0319401008B960100B79601006C -:209CC000F800002094F8630007281FD1B4F85800411CB4F80201814262D1D4F8FC00411C33 -:209CE000404606F0EEFE0221204604F0F2F884F8636084F89770D4F8FC000078002808BFA4 -:209D0000FFDFD4F8FC000178491E017094F86300082845D1B4F85800411CD4F8F8008088EA -:209D200081423DD1D4F840010178002918BFFFDF22D12188C180D4F8F8004189D4F8400176 -:209D40000181D4F8F8008189D4F840014181D4F8F800C189D4F840018181D4F84001067143 -:209D6000D4F8400180F800A0D4F840012188418099F80300F0F744FA0121204604F0A9F871 -:209D800003212046FDF71FFAD4F8F80041882088814218BFFFDFD4F8F800067084F8636006 -:209DA000B4F85800401C691EA4F858008DB2BFF42DAFBDE8F087FE4AC2E90601704770B508 -:209DC0000446B0F87C0094F86610002908BFC0F1020503D0B4F87E10081A051F94F87A0012 -:209DE00040B194F863200023092104F1580004F0B9FAA0B1B4F8746094F8680058B994F8C0 -:209E000063200023062104F1580004F0ABFA002808BF284603D0B4F87600801B001F8542BC -:209E2000C8BF0546002DD4BF0020A8B270BD10B5DF4CA1680A88A1F83C2181F83A0191F82B -:209E40005100012808BF012108D0022808BF022104D003281ABFFFDF00210321A06880F838 -:209E60003E1190F85200012808BF012108D0022808BF022104D003281ABFFFDF00210321C0 -:209E8000A06880F83F11012180F83811E078BDE81040F0F7B5B9F8B56846FAF71BFA0028E4 -:209EA00008BFF8BDC24C6078002818BFF8BDA0680023012190F86520583004F053FA002841 -:209EC00018BFF8BDA06890F8F010002918BF02204BD190F8632000231946583004F042FAE3 -:209EE00038B1A06890F87A0018B11220FEF79EFCF8BDA06890F863200E2A21D00F2A08BFF4 -:209F00000B2032D0152A08BF06202ED00025202A2ED000230421583004F024FA002818BF9C -:209F2000F8BDA0680227012690F8641017297CD025DC012950D0052948D00B295AD022E09B -:209F4000F8F7D4FC0C2838BFF8BDA0680821D0F8F8001E30F8F7CBFC28B1A0680421C03077 -:209F6000F8F7C5FC00B9FFDF0320FEF75FFCF8BD1820FEF75BFCA068A0F88250F8BD1C2982 -:209F800040D01E297ED0D0F8F8100A78002A7AD049880288914276D190F863200023194654 -:209FA000583004F0DFF900286DD0A068D0F8F8100978022908BF002066D0032979D00429A5 -:209FC00071D0052908BF08207CD0A6E00720FEF72DFCA06800F049B90C20FEF727FCA068C6 -:209FE000A0F8885090F88E1041F0010180F88E1000F03BB91320FEF719FCA068A0F88850E9 -:20A0000000F033B990F80911002918BFF8BD90F8081199B1B0F80A11A0F84010B0F80C11B2 -:20A02000A0F84210B0F80E1100E03DE0A0F84410B0F81011A0F8461080F80851FEF76BFDA1 -:20A040000421A068FDF7BFF8A06890F84E10012908BF80F84E7013D00288A0F82221028E3B -:20A06000A0F82421828EA0F82621428E00F58C71A0F82821C08E48820E72E078F0F7C0F8E2 -:20A08000152003E008E048E01CE012E0FEF7CEFBA068A0F88850E8E01820FEF7C7FBA068B5 -:20A0A000A0F88850F8BD25E01120FEF7BFFBA068DBE090F8671041B190F86800002808BF03 -:20A0C000FFDF0A20FEF7B2FB27E0F8F70FFC0C2823D3A0680821D0F8F8001E30F8F707FC7A -:20A0E00028B1A0680421C030F8F701FC00B9FFDF0320E7E790F88E0010F0030F0DD10C20C4 -:20A10000FEF794FBA068A0F8825080F8866090F88E1041F0010180F88E106846FAF7DAF80B -:20A12000002808BFF8BDA0680023194690F86320583004F017F9002808BFF8BDA06890F826 -:20A140000011B9B3A1690978A1BBB0F858100A2934D900F108010522E06906F0E3FA0028E6 -:20A16000A06804BF80F80051F8BDD0F8FC00017861B1411C0522E06906F0D4FA002818BFB7 -:20A18000F8BDA068D0F8FC00007830B9A068E169D0F8FC00401C06F094FCA068D0F8FC0019 -:20A1A0000178491C01700120FEF740FBA06802E0F800002002E080F80051F8BD90F80811FC -:20A1C00011B190F8091189B190F89810002908BFF8BD90F8642000230B21583004F0C2F87B -:20A1E000002808BF16203FF4C0AEF8BDB0F80A11A0F84010B0F80C11A0F84210B0F80E11C3 -:20A20000A0F84410B0F81011A0F8461080F8085190F864001B2818BF14207FF4A6AEFEF7D4 -:20A220007AFC0421A068FCF7CEFFA06890F84E10012908BF80F84E7013D00288A0F822215E -:20A24000028EA0F82421828EA0F82621428E00F58C71A0F82821C08E48820E72E078EFF729 -:20A26000CFFF1520FEF7E2FAA06880F86450F8BD70B5044690F863000025072822D1B4F8D4 -:20A280005800B4F80211401C884218BF70BDD4F8FC00411C04F1080006F013FC02212046CD -:20A2A00003F017FE84F86350012084F89700D4F8FC000078002808BFFFDFD4F8FC000178E5 -:20A2C000491E017094F86300082818BF70BDB4F85800D4F8F810401C8988884218BF70BD70 -:20A2E000D4F840010178002918BFFFDF22D12188C180D4F8F800D4F8401140890881D4F81E -:20A30000F800D4F8401180894881D4F8F800D4F84011C0898881D4F840010571D4F8401183 -:20A3200008200870D4F8401120884880C148C078EFF766FF0121204603F0CBFD0321204697 -:20A34000FCF741FFD4F8F80021884088884218BFFFDFD4F8F800057084F8635070BD10B5BC -:20A36000B44C207910F0020F08BF10BD6078002818BF10BDE068C078192880F05881DFE82A -:20A3800000F052420D82F8F8992232F86276A4F8F8F8F8F7D42DE4F9F5F8F400A068002398 -:20A3A000012190F86520583003F0DCFF002818BF10BD0321A06880F86510002180F8861004 -:20A3C00080F88A1010BDA0680023194690F86420583003F0C7FF002808BF10BD0020A168E2 -:20A3E00081F88A0010BDA0680023194690F86320583003F0B7FF002808BFFFDF0920A168C8 -:20A4000081F8630010BDA0680023194690F86320583003F0A7FF002808BFFFDF0720A168E0 -:20A4200081F8630010BDA0680023194690F86320583003F097FF002808BFFFDF0820A168CF -:20A4400081F8630010BDA0680023194690F86320583003F087FF002808BFFFDF0121A068C6 -:20A4600080F88B105FF00C0180F8631010BDA06890F863000F2818BFFFDF0121A06880F834 -:20A480008C100E21F0E7A0680023194690F86320583003F067FF28B9A06890F88C0000287F -:20A4A00008BFFFDF0121A06880F88B10102180F8631010BDA06890F86300152818BFFFDFEC -:20A4C0001820A16881F8630010BDA068D0F8F81003884A889A4204BF0978042919D190F89E -:20A4E000632000231946583003F03CFF002808BFFFDFA06890F88E1011F0020F04BF0121AF -:20A5000080F8631005D0002180F88610D0F8F8000170A0680023194690F86420583003F00A -:20A5200021FF002808BF10BD58E7A0680023194690F86320583003F015FF002808BFFFDF0F -:20A540000A20A16881F8630010BDA0680023194690F86320583003F005FF002808BFFFDF3E -:20A560001A20A16881F8630010BD25E00EE001E04CE05CE0A0680023194690F86420583095 -:20A5800003F0F0FE002808BFFFDF27E7A06890F89800012818BFFFDFA0680023194690F8E7 -:20A5A0006320583003F0DEFE002808BFFFDF1D20A16881F86300D7E7A06890F864101E29C9 -:20A5C00012D090F86310202918BFFFDFCCD1B0F8061100291CBF212180F863100DD0A1682D -:20A5E000002081F88600BFE7B0F80611002918BF212180F864100021E2E6002180F86310B4 -:20A6000080F898100846FFF712FCE8E7A06890F863001D2818BF072802D0082818BFFFDF04 -:20A620000021A06880F8641080F88A109CE7FFDF9AE70000F80000202DE9F041FE4C06461C -:20A64000606904F06CFBE168002701F16302012581F8C9004FF0050896420ED105FA00F0B5 -:20A6600010F0807F08BFFFDFE06880F86380A0F8827080F88650BDE8F08101F16400864287 -:20A680001CBFFFDFBDE8F08181F86480A1F8887081F88A50BDE8F081F0B4E748C06890F811 -:20A6A0004E30478EC68E458FB0F84010C28FB0F842C0022B1FD08D4238BF294601866245AD -:20A6C00028BF62468286018FB0F84430994238BF0B464386818FB0F84640A14238BF0C46E1 -:20A6E000C486BB4228BF1F464786B44228BF2646C686F0BC7047038E9D4228BF1D46838E37 -:20A700009A4228BF1A46A94298BF0D460586944598BF62468286002180F84E10D3E7F0B5C0 -:20A72000C54C83B0207910F0010F04BF03B0F0BD606901230521C578E06890F864205830DD -:20A7400003F010FE002818BF022D0BD00A2D18BF0B2D07D0032D18BF062D03D0607840F0BD -:20A7600008006070607800281CBF03B0F0BD6069C078192880F0E483DFE800F04E280DC7AC -:20A78000FBFBFAF9F8FBA3BCF7FBFBFBFBF6F5F4F3F2F1FBF000E0680123194690F8652023 -:20A7A000583003F0DFFD002840F0C083606904F011FBE16881F87001022081F8650000208B -:20A7C00081F88A0081F8860000F0B0BBE0680123002190F86420583003F0C4FD00287DD0D2 -:20A7E0006078002840F0A283606904F0EEFAE168A1F88401B1F85820801A00B247F6FE72DE -:20A800008242A8BF002853DD01F5C371606904F0D3FA0620E16840E0E0680123002190F85D -:20A820006420583003F09EFD002857D06078002840F07C83606904F09BFA90B3606904F0AE -:20A8400094FAE168A1F88401B1F85820801A00B247F6FE728242A8BF002829DD606904F0D3 -:20A860007EFAE16881F88601606904F073FAE168A1F88801606904F058FAE168A1F88A0106 -:20A88000606904F059FAE168A1F88C01606904F05AFAE168A1F88E01082081F8640000F0C2 -:20A8A00045BBFFE7E0686430FFF7C6FE00F03EBB282081F87200012081F8710000F036BB14 -:20A8C0000CE0E0680123002190F86420583003F049FD18B1607820B100F028BB012000F0DC -:20A8E00088B9E0680021A0F88810012180F88A100D2106E0E06890F864100E2908BF0F21C4 -:20A9000059D180F8641000F011BBE0680123002190F86420583003F025FD20B9E06890F886 -:20A920008C000028DAD06078002840F0FF82E06800210125A0F8881080F88A5000F1E8011D -:20A94000606904F060FAE06800F1C001606904F065FAE06890F8B40100280BE0EAE1C5E1C1 -:20A9600074E106E1D5E0ECE059E22CE0A3E069E21CE0E5E218BFFFDFE0680188A0F8B6115D -:20A9800000F5DC71606904F02CFAE06800F5E071606904F02EFAE06880F8B451112180F8B0 -:20A9A0006410E078EFF72CFC00F0C0BAE06890F86410142902D0022000F01BB9002180F881 -:20A9C0008A1019219DE7E0680123002190F86420583003F0C7FC50B9E0680123082190F822 -:20A9E0006320583003F0BEFC00283FF477AF6078002840F09B82E06890F88E0010F0020F62 -:20AA000017D1606904F028FAE16881F88F00606904F024FAE168A1F89000606904F021FAF9 -:20AA2000E168A1F8920091F88E0040F0020081F88E00E06802E000001801002090F88E10C9 -:20AA400011F0010F15D190F8642001230021583003F088FC002808BFFFDF0121E068042252 -:20AA600080F8641080F8832180F88A100021A0F88810E06890F86310012907D1002180F88D -:20AA8000631080F88610E078EFF7BAFBE06890F88211042940F04A82002580F88251E078EE -:20AAA000EFF7AEFBE06890F86310002908BF80F8865000F03BBAE0680123002190F8642008 -:20AAC000583003F04FFC00283FF408AF6078002840F02C826946606904F0D3F9E0689DF8AB -:20AAE000002090F89410114001F02F0180F8941090F895109DF80120114001F02F0180F8AF -:20AB000095100021A0F88810012180F88A100921F7E6E0680123092190F86320583003F0E8 -:20AB200021FC00283FF4DAAE6078002840F0FE81E16881F87A0081F8860081F8630000F05F -:20AB4000F5B9E0680123002190F86420583003F009FC00283FF4C2AE6078002840F0E681CC -:20AB6000E0680021A0F88810012180F88A100B21C7E6E0680123002190F86420583003F01B -:20AB8000F1FB00287ED0606904F098F9002804BFE068643000F02281606904F08BF9E16821 -:20ABA0000887606904F082F9E1684887606904F083F9E1688887606904F07AF9E168C8875D -:20ABC000207910F0020F03D02069C078142813D091F863001A280FD091F84E0001280ED02D -:20ABE00091F89101002804BF91F8900100280AD005E0607000F09AB9012081F84E001C2017 -:20AC000081F8640018E01B2081F864000A88A1F8D4210A8FA1F8D6214A8FA1F8D8218A8F7A -:20AC200001F5D070A1F8DA21C98F8187012180F83210E078EFF7E4FAE0680021A0F8881059 -:20AC40005FF0010180F88A1000F070B9E06801230A2190F86320583003F084FB90B16069D2 -:20AC600004F02CF9B8B1606904F024F9E1680887606904F01BF9E1684887606904F01CF9E5 -:20AC8000E16800E02EE08887606904F011F9E168C887FFF701FDE068002180F8861080F82C -:20ACA00063100521FDF705FCE06890F84E10012900F029810288A0F8C821028EA0F8CA21F6 -:20ACC000828EA0F8CC21428E00F5D071A0F8CE21C08E0886012081F82600E078EFF790FAEE -:20ACE00000F024B9607840F0010082E7E0680123002190F86420583003F034FB00283FF477 -:20AD0000EDADE06890F8630021283FF4E7AD6078002865D1606904F0F2F800F00701E06839 -:20AD200080F86D110021A0F88810012180F88A101E21E6E5E06890F8641090F863201F29F7 -:20AD400002D01D2A32D036E61D2A2FD01F290FBF00F16405FFDFE06800F16305606904F0CA -:20AD6000DEF858B36169E06803F0A0FC064610F0FF0704BFC6F30720002832D0606904F075 -:20AD8000CCF8E168A1F88401B1F85820801A00B247F6FE728242A8BF00282FDD81F886719F -:20ADA000300A81F88701212028702DE01E291CBF1F2900F163053FF4FEADCFE7E06890F84B -:20ADC00063101D2909D1002180F89810302000F077FFE168182081F8CA002846FFF72CFC99 -:20ADE000A4E000212970E06800F1630295420BD180F89810002000F063FF05E0282081F88C -:20AE00007200012081F87100E06800F164018D424FF0000118BF80F886104CD112E7606944 -:20AE200004F099F8162846D1E06890F863101D297CD1002180F8631080F8981080F8861028 -:20AE4000232071E0E0680921012390F86320583003F088FA20B1606904F00CF8122813D011 -:20AE6000E0680A21012390F86320583003F07AFA20B1606903F0FEFF14281DD0606903F0D2 -:20AE8000F9FF162852D142E0E06801252B4690F863200921583003F065FA002808BF657085 -:20AEA00044D0607838B9E068002180F87A1080F8861080F8631039E0E0680021012580F831 -:20AEC0006310A0F8821080F886100521FDF7F1FAE06890F84E10012915D00288A0F8C8217A -:20AEE000028EA0F8CA21828EA0F8CC21428E00F5D071A0F8CE21C08E088681F82650E078FA -:20AF0000EFF77EF912E0022180F84E100EE0E06890F863101D2909D1002180F8981080F8DF -:20AF2000631080F886101A2000F0CAFEE068D0E92A12491C42F10002C0E92A1203B0F0BD82 -:20AF4000E0680123002190F86420583003F00AFA002801BF0120607003B0F0BD60780028A0 -:20AF60003FF4A0AC03B0F0BD30B585B004466846F9F7B0F9002808BFFFDF009803F00FFEE2 -:20AF80000321009803F022FE0098017821F010010170214603F097FEA01E162878D2DFE842 -:20AFA00000F00BAE23AFAF1BAE47AEAF3631AEAEAEAEAFAF5D7892A0FE48C06890F89610DA -:20AFC00021B10621009803F003FF99E090F86F11009803F0FDFE93E0F648C06890F8C910AA -:20AFE000009803F045FF8BE0F24DE86800F1F001009803F017FFE86800F1C401009803F074 -:20B000001BFF7DE00621009803F02EFF78E0E94DA8680178009803F015FFA8688188009873 -:20B0200003F012FFA8684188009803F011FF67E0002002900390DF48C06890F8941001F0A0 -:20B04000F5018DF8081090F8950002A900F009008DF80900009803F042FF51E0D54DE8689F -:20B06000B0F84410009803F011FFE868B0F84610009803F00FFFE868B0F84010009803F07F -:20B080000DFFE868B0F84210009803F00BFF37E035E0C84DE868B0F84010009803F0FEFEB5 -:20B0A000E868B0F84210009803F0FCFEE868B0F84410009803F0EAFEE868B0F8461000981C -:20B0C00003F0E8FE1CE0BB4DE86890F89D11009803F00FFFE86890F89E11009803F00DFF56 -:20B0E0000EE0B44DE86890F84F10009803F001FFE86890F85010009803F0FFFE00E0FFDF21 -:20B10000F9F7FBF8002808BFFFDF0C2C12BF072C05B030BD122C1CBF142C162C0DD0022CFB -:20B1200004BF05B030BD0021A248C068A0F88810012180F88A1005B030BD9E480021C06842 -:20B14000A0F88210012180F8861005B030BD70B50C4605464FF4F871204605F0A8FB2580E2 -:20B1600070BDF4F789BD2DE9F0410D4607460721F4F7A0FC040047D094F8A0010026D8B1E4 -:20B180006E700820287094F8A00188B1268484F8A061D4F8A201C5F80200D4F8A601C5F826 -:20B1A0000600B4F8AA01688194F8A0010028EDD1AE700120BDE8F08194F8AC01002837D079 -:20B1C00094F8AC010C2818D00D2818BFFFDF4CD12088F4F77AFD0746F4F7B6FAA0B96E70EA -:20B1E0000D20287094F8AE01A8702088A88084F8AC613846F4F7A2FA37E02088F4F765FDCD -:20B200000746F4F7A1FA10B10020BDE8F0816E700C20287094F8AE01A8702088A88094F813 -:20B22000B201A87184F8AC613846F4F787FA1CE094F8E40130B16E700F20287084F8E4611B -:20B240006F8012E094F8B40190B16E700920287020886880D4F8B801D4F8BC116860A9606D -:20B26000B4F8C001A88184F8B4610120BDE8F08194F8C20140B16E7017202870B4F8C40112 -:20B28000688084F8C261F0E794F8DE0188B16E701820287094F8DE010028E6D084F8DE61FA -:20B2A000D4F8E001C5F8020094F8DE010028F5D1DBE794F8C601C8B16E701420287094F805 -:20B2C000C6010028D1D000BF84F8C661D4F8C801C5F80200D4F8CC01C5F80600B4F8D0014F -:20B2E000688194F8C6010028EED1BEE794F8D20180B16E701A20287084F8D261D4F8D401F6 -:20B30000C5F80200D4F8D801C5F80600B4F8DC016881AAE794F8E601002808BFBDE8F0818B -:20B320006E701520287094F8E60100289DD000BF84F8E661D4F8E801C5F80200B4F8EC01CB -:20B34000E88094F8E6010028F2D18EE7194A9060D1707047002180F8631080F8641080F8F7 -:20B36000661090F8DE1011B10221FDF7A2B80321FDF79FB82DE9F0470E4C80460D46E06837 -:20B380000088F4F7B4FC060008BFFFDF60782843607020794FF0000510F0200FE0681CBF9D -:20B3A000A0F87C5080F8E45008D1B0F87C10491C02E0000018010020A0F87C10E06801275C -:20B3C00090F8681039B990F8642001230621583002F0C8FF48B3A08810F4006F07D0E0682E -:20B3E00090F86810002918BFA0F874501DD1E068B0F87410491C8AB2A0F87420B0F8761094 -:20B4000091422CBF8B1A0023B4F806C00CF1050C634598BF80F87A708A4206D3A0F87450C4 -:20B4200080F8E471E078EEF7EBFE20794FF0020910F0600F11D0E06890F8661011B10329B2 -:20B4400006D00AE080F866700121FDF732F804E080F866900121FDF72CF8E06890F86610CC -:20B46000012905D1A18811F4807F18BF80F86690B8F1000F7DD1A18811F4007F18BFA0F838 -:20B48000F85004D1B0F8F810491CA0F8F81000F04BFC00F004FE01F0D5FB0028E06818BFA9 -:20B4A000A0F8D85004D1B0F8D810491CA0F8D81001F0CBFB40B1E16891F8E40002289CBF9F -:20B4C000401C81F8E40004D8E06890F8E400022806D9E068A0F8D850A0F8DA5080F8E450A4 -:20B4E000E0680123002190F86420583002F03AFF20B9E06890F86400072859D1E06801232E -:20B50000002190F86320583002F02CFF00284FD0E0680123002190F86520583002F022FFDE -:20B52000002845D0E06890F86610022904BF90F8E40000283CD13046F3F78CFEB8B3F8F7B5 -:20B5400010FFA0B3E068B0F8D210012930D980F8DD70B0F87E10B0F87C208B1E9A42AFBF52 -:20B560000121891A491E89B2B0F8D820E3889A4200E034E02FBF01229A1A521C92B291423F -:20B5800088BF1146012908BF80F8DD5090F8692192B1B0F8DA20B0F86A0182422FBF01209A -:20B5A000801A401C80B2814288BF014604E0FFE7E068012180F8DD50D4F80CC0BCF8582075 -:20B5C000501880B2ACF8D4009CF86610002918BF01290ED002291CBF0329FFDF0CD0A08833 -:20B5E000C0F340200028E06818BFA0F8E6505FD157E0ACF8D000F2E79CF86510032922D048 -:20B60000BCF87C00BCF87E100026821C914206D3081A801E0604360C1CBF701E86B29CF807 -:20B620007A0058B19CF86320012309210CF1580002F098FE002808BF00262BD0E06890F865 -:20B64000681099B90AE0BCF87C100329D1D3BCF87E001044401CACF8D000C0E790F864201D -:20B6600001230621583002F07DFE78B1E2680020B2F87610B2F87420931C994203D3881A87 -:20B68000801E18BF401EB04238BF86B2002E1CBF701E86B2E068B0F8D4103144A0F8D01026 -:20B6A0009DE7B0F8E610B0F8D6201144A0F8E610E06890F86E1139B990F865200123194616 -:20B6C000583002F04FFE38B1E068B0F88010B0F8D6201144A0F88010E06890F8863033B1B5 -:20B6E000B0F88210B0F8D6201144A0F8821090F88AC0BCF1000F06D0B0F88810B0F8D620B1 -:20B700001144A0F888103D22B8F1000F03D000BF80F8722010E02178022910D0012908BF6C -:20B7200090F8701106D06178F1B111F0140F18BF1E210BD080F8721080F871704DE090F892 -:20B740009610002914BF06211621F3E711F0080FDED111F0030F08BFFFDF2A21E06880F885 -:20B76000721080F8717038E02BB1B0F88210B0F88420914211D2BCF1000F05D0B0F88810ED -:20B78000B0F88420914208D2B0F88020B0F87E108A4208D390F86E212AB1222180F872105C -:20B7A00080F8717019E090F866204AB1B0F87C208A420FD3082180F8721080F871700CE0D4 -:20B7C000B0F87C10062905D33E2180F8721080F8717002E090F8711079B1E06880F86350F4 -:20B7E00080F8645080F8665090F8DE10002914BF02210321FCF75DFE02E00021FCF759FE9B -:20B80000E06880F8DE50BDE8F087FC49024648788B7818430ED10846C0684AB1097911F0A0 -:20B82000080F03D090F86500032803D001207047FCF776BD002070472DE9F041EF4C054691 -:20B840000E46A0882843A08015F0020F04D015F0010F18BFFFDF266115F0010F4FF000084A -:20B860004FF001071CD03046666103F058FA062802D00B280BD013E0E06890F86410142991 -:20B880000ED10021C0E9281180F8677008E0E06890F864100E2904BF80F8678080F88C707E -:20B8A00015F0020F18D02069C078052802D00B280BD011E0E06890F8641012290CD100214E -:20B8C000C0E92A1180F8687006E0E06890F864100D2908BF80F8688015F0800F1CBF082016 -:20B8E000A070BDE8F0812DE9F047C44C82B0002521690191A5806570A5704FF00108257066 -:20B90000E06068F30709074680F8DE800088F4F7EEF95FEA000A08BFFFDFE0680088F8F748 -:20B92000D6FCE0680088F8F7F8FCE068B0F8D200D0B101A8F8F7CEFCB0B1E06890F86E112D -:20B9400091B190F8652001231946583002F00AFD50B9E068A0F8805080F896500220FFF765 -:20B9600003FBE06880F8DD50D4F80CC09CF8DF00002818BFE5800DD19CF8A00138B9BCF8B5 -:20B980002000BCF80410884288BFE08002D8BCF80400E080BCF8D600401E86B2BCF8D800B0 -:20B9A0003044ACF8D8009CF8DC0000281CBFACF8DA508CF8DC5004D1BCF8DA003044ACF82B -:20B9C000DA00BCF87C003044ACF87C009CF8680040B99CF86420012306210CF1580002F02A -:20B9E000C1FC28B1E068B0F874103144A0F87410E068B0F8D21001299CBF491CA0F8D21076 -:20BA0000002E18BF80F8E45090F8DD10A1B1B0F8D800E18888420FD25046F3F71BFC58B17A -:20BA2000E06890F8691139B1B0F8DA10B0F86A01814228BF01F00CF9E26882F8DD5092F812 -:20BA40006400062818BF072819D1B2F85810B2F88431C91A09B2002911DB02F5C37102F122 -:20BA6000080005F02EF80221E06802F0F7F8E06880F8835180F8645080F8978048E0212897 -:20BA800020D1B2F85800B2F88411401A00B2002818DB92F88601002808BF92F8510082F8F8 -:20BAA000510092F88701002808BF92F8520082F85200002000F004F9E06880F8835180F873 -:20BAC000645025E092F86300212821D1B2F85800B2F88411401A00B2002819DB92F886010B -:20BAE000002808BF92F8510082F8510092F88701002808BF92F8520082F85200002000F0F8 -:20BB0000DFF8E06880F8985080F8835180F86350E16801F15800B1F8D62002F0C8FAE06801 -:20BB200090F86911002918BFA0F8DA5034480090344B354A3946484600F00AFFE0680123C5 -:20BB4000052190F86420583002F00CFC002818BF00F074FCE0680123072190F864205830AA -:20BB600002F000FC002818BF0C203AD000F06AFCE06890F89A11002904BF02B0BDE8F08717 -:20BB800090F89C11002907BF90F89810002902B0BDE8F08790F8632001230B21583002F085 -:20BBA000E1FB00281CBF02B0BDE8F087E06801230B2190F86420583002F0D4FB00281CBFE8 -:20BBC00002B0BDE8F087E06890F8512090F89D11012A1BD0022A1CD0032A08BF04291AD0E7 -:20BBE0002BE0E0680123082190F86420583002F0B9FB002818BF0820B8D1B9E718010020E2 -:20BC000075B301000BB8010039B80100012914D101E0022911D190F8522090F89E11012AEC -:20BC200006D0022A07D0032A08BF042915D004E0012902D111E002290FD080F89880E06871 -:20BC400090F89B1100291CBFB0F89D11A0F84F1080F89A5102B0BDE8F087002000F030F8F6 -:20BC6000EDE700F068BF10B50446B0F88A214388B0F88C11B0F88E019A4201BFA38899428E -:20BC8000E38898420FD02388A4F8A431A4F8A621A4F8A811A4F8AA01012084F8A001FC48E3 -:20BCA000C078EEF7ADFA0121204601F0D7FF002084F8830184F86400032084F8660010BD9F -:20BCC00010B5F34CE1680A88A1F8EA2181F8E80191F85100012808BF012108D0022808BFCA -:20BCE000022104D003281ABFFFDF00210321E06880F8EC1190F85200012808BF012108D0A5 -:20BD0000022808BF022104D003281ABFFFDF00210321E06880F8ED11012180F8E611E0786D -:20BD2000BDE81040EEF76CBA2DE9F041D84C4FF002084FF00005207910F0080F14D060789F -:20BD400090B9E06890F86410162905D180F88B5080F88A5080F8645090F86510032904BF84 -:20BD600084F8008080F86550FEF7D9FCA1884FF0010611F0040F4FF0070719D06078B8B9CE -:20BD8000E06890F86420062A08BF80F8836108D0082A08BF80F8838103D0212A08BF80F852 -:20BDA000837190F86520022A04BF267080F8655011F0020F00F048816078002840F0448110 -:20BDC0002069C078801E162880F03D81DFE800F00BF9646F851EF948F955B97AF9F9F9F9C1 -:20BDE000E4F8FDF6F5F4E0680123194690F86520583002F0B7FA002840F02681E06803211D -:20BE000080F8651080F8865000F0DCB8206903F031F80646E06890F86410052905D090F8A3 -:20BE20006300052818BFFFDF04D0E06890F8630005280AD1E06890F8CA10B14204BF80F8D6 -:20BE4000635080F8865000F0FF80E06890F8641005290CBF80F86450FFDF40F0F580B1E0F5 -:20BE6000E06890F86400092818BFFFDFE06880F88A5080F8645000F0E7B8E06890F864001F -:20BE80000D2818BFFFDFE0685FF00E0180F88B6080F8641000F0D8B8E06890F864001128D6 -:20BEA00018BFFFDFE068122180F88B60F0E7E06890F86400122818BFFFDF1420E16881F8FF -:20BEC0006400C1E0E06890F86400122818BFFFDF1620E16881F86400B6E0E06890F8640014 -:20BEE000192818BFFFDFE06880F88B5080F88A5090F8AC01002818BFFFDFE06890F88C10E1 -:20BF000041B180F88C500188A0F8B01180F8AE510D2107E00188A0F8B01180F8AE5180F89C -:20BF2000B2610C2180F8AC110088F3F7CEFEF3F7F5FBE078EEF764F9D4F80C0080F86450D6 -:20BF400082E0E06890F8821104290ED0E0680123082190F86420583002F004FA00281CBFF5 -:20BF6000E06880F88A506FD0E8E790F8632001230021583002F0F6F9002808BFFFDFE0684B -:20BF800090F88E1011F0020F0EBF80F8636080F8865080F88251D9E7E0680123002190F8F3 -:20BFA0006320583002F0DEF9002808BFFFDF0A20E16881F8630047E03AE023E015E004E074 -:20BFC0001EE040E080F88A503EE0E0680123002190F86320583002F0C5F9002808BFFFDF36 -:20BFE0001A20E16881F863002EE0E0680123002190F86420583002F0B5F9002808BFFFDF46 -:20C00000E068DFE7E06890F89800012818BFFFDFE0680123002190F86320583002F0A2F91F -:20C02000002808BFFFDF1D20E16881F863000BE0E06890F864001E2818BFFFDF1F20E1682F -:20C0400081F8640000E0FFDF207910F0100F08D0607830B9E06890F86410062908BF80F842 -:20C060006470A07810F0080F08BFBDE8F081E0680123052190F86420583002F073F948B163 -:20C0800008206070E06880F8AC51BDE8F081000018010020BDE8F041002000F0DDBDF8B56F -:20C0A0006846F8F717F9002808BFF8BDDB4C6078002818BFF8BDE0680123194690F86520A4 -:20C0C000583002F04FF9002818BFF8BDE068002590F86E1129B1A0F8805080F896500220B4 -:20C0E00080E090F8632001230021583002F03AF978B1E0680123042190F86420583002F0A3 -:20C1000031F930B9E06890F87A00002818BF122068D1E06890F86310052910D090F86420FB -:20C1200002270126112A4AD017DC092A08BF092058D00BDC012A7DD0052A39D017E0072067 -:20C14000FEF712FFE068A0F88250F8BD0B2A72D00D2A08BF0B2045D009E0122A45D0192A40 -:20C1600072D01C2A69D01E2A08BF17203AD001230421583002F0F6F8002818BFF8BDE06801 -:20C1800090F88211002973D090F8632001230021583002F0E7F800286AD0E06890F88211AA -:20C1A000042904BF90F88E0010F0030F7DD0BDE00720FEF7D9FEE068A0F88850F8BDF6F730 -:20C1C00095FB0C2838BFF8BD0821E068F030F6F78EFB28B1E0680421C430F6F788FB00B985 -:20C1E000FFDF0420FEF7C0FEF8BD90F87111012910D0022918BFF8BD90F88C1000291ABFE4 -:20C2000080F8966002200D20FEF7AEFEE06880F87151F8BD90F8AC11002918BFF8BD00F19E -:20C22000B00300F1E801002200F5B97002F02FF8052003E00FE01CE006E021E0FEF794FEB7 -:20C24000E06880F87151F8BD0620FEF78DFEE06880F88A50F8BD0C20FEF786FEE068A0F82D -:20C26000885090F88E1041F0010180F88E10F8BD5CE01320FEF778FEE068A0F88850C9E087 -:20C2800090F89111002918BFF8BD90F8901199B1B0F89211A0F84010B0F89411A0F84210E2 -:20C2A000B0F89611A0F8441000E031E0B0F89811A0F8461080F89051FEF7EEF90521E06870 -:20C2C000FCF7F7F8E06890F84E10012908BF80F84E7014D00288A0F8C821028EA0F8CA2125 -:20C2E000828EA0F8CC21428E00F5D071A0F8CE21C08E088681F82660E078EDF781FF152050 -:20C30000FEF732FEE068A0F8885080F86450F8BD0C20FEF729FEE068A0F8825080F8866007 -:20C3200090F88E1041F0010180F88E106846F7F7D1FF002808BFF8BDE0680123002190F869 -:20C340006320583002F00EF830B1E06890F8901111B190F89111E9B1E0680123002190F8ED -:20C360006320583001F0FEFF002808BFF8BDE06890F89810002908BFF8BD90F864200123D3 -:20C380000B21583001F0EEFF002808BF16203FF429AFF8BDB0F89211A0F84010B0F89411A6 -:20C3A000A0F84210B0F89611A0F84410B0F89811A0F8461080F8905190F864001B2818BFBA -:20C3C00014207FF40FAFFEF767F90521E068FCF770F8E06890F84E10012908BF80F84E7085 -:20C3E00014D00288A0F8C821028EA0F8CA21828EA0F8CC21428E00F5D071A0F8CE21C08ECB -:20C40000088681F82660E078EDF7FAFE1520FEF7ABFDE06880F86450F8BD00001801002027 -:20C4200030B5F74C05462078002818BFFFDFA5720020207330BDF24908737047F049012096 -:20C4400048727047EE49C872704770B4ED480121426890F800C0406892F86360154690F8FE -:20C46000510002F15803212E1CBF1C7B212C22D003231D2E40D01F2C1CBF70BC704700BFD4 -:20C48000BCF1000F04BF70BC704795F84FC092F86D210CEA020212F0040F14BF194612F043 -:20C4A000010F4CD0032818BF032954D0012818BF012953D04CE0BCF1000F0ED092F88611CA -:20C4C000002904BF70BC7047032818BF032942D0012818BF012941D03AE092F80411002930 -:20C4E00004BF70BC7047032818BF032933D0012818BF012932D02BE01F2CC1D0BCF1000F96 -:20C5000004BF70BC704792F89D2112F0040F14BF194612F0010F08D0032818BF03291AD0E4 -:20C52000012818BF012919D012E012F0020F04BF70BC704703280ED001280FD008E012F042 -:20C54000020F04BF70BC7047032804D0012805D070BC0220704770BC0320704770BC0120CF -:20C5600070472DE9F047A74F4FF0000839464FF001094D6895F85210E88E01F086FF95F895 -:20C58000521080B26FF00D02032967D0022907BF6FF00E0101EB900002EBD00086B268D02E -:20C5A000688EB04238BF0646954C3146606BF2F78DFEDFF854A2E062002819BF84F80280AC -:20C5C000A06284F80290C4F828A03878786800F15808012000F009FE98F8100000284AD0EC -:20C5E00008F15801884891E80E1000F5027989E80E10D8F86810C0F82112D8F86C10C0F84C -:20C60000251200F58170F7F70AFA387800280CBF0120002080F001017C480176D8E9141293 -:20C62000C0E90412C4F828A05146E681A0F58372F6F72BFE95F85200012808BF002208D050 -:20C64000022808BF012204D003281ABFFFDF00220222A17B0120F6F726FE11E0B0F5747FF3 -:20C6600038BF46469CD35038C11700EB916002EBA01086B294E7A06AF7F7D1F9F6F738FE57 -:20C6800001210020F7F75FFB02202070BDE8F0872DE9F04FDFF86C9183B049464FF0000A0E -:20C6A0004E684FF0010806F1580496F85D00A1F11407A1F1380570B3012878D0022877D0BD -:20C6C000032818BFFFDF74D0686A0823017821F008010170A27903EAC202114321F00401FF -:20C6E0000170E279042303EA8202114321F01001017094F805A0286BF2F7BAFD0746F7F750 -:20C7000030FEBAF1020F79D0BAF1010F77D0BAF1030F7DD08DE0FFE7FFF797FE014630463F -:20C7200001F0BCFE1FFA80FBFFF78FFE6FF00D0103281ED0022807BF6FF00E0000EB9B00CE -:20C7400001EBDB0080B220D0318E814238BF0846ADF80400A6F84C003846F7F7E1FDB0B1EB -:20C76000696A85F80380AA694FF480609047032030E0BBF5747F38BF5046E5D3ABF15000D2 -:20C78000C21700EB926001EBA01080B2DCE76A4601A9286BF2F74FFC686210B194F83310D7 -:20C7A00041B13846F7F790FD84F805808CE713E016E02EE09DF8001031B9A0F800A080F8E4 -:20C7C00002A0012102F002FABDF80410686A02F0C6FB0220607177E73846F7F775FD73E7D0 -:20C7E000B6F84C00ADF804006A4601A9286BF2F722FC6862002808BFFFDF65E710E012E0DD -:20C800003001002068010020700E0020781000200CE03846F7F784FD002808BFFFDF53E718 -:20C82000B84306D103E0B84303D100E00FB1012100E00021686A027842EA01110170E17B5A -:20C8400000291CBF6179012937D004F15801F84891E80E1000F5027787E80E10A16EC0F8E2 -:20C860002112E16EC0F8251200F58170F7F7D7F899F8000000280CBF01210021ED48017631 -:20C88000D4E91212C0E90412A0F583716A6AF6F7FCFC96F85100012808BF002208D00228C3 -:20C8A00008BF012204D003281ABFFFDF00220222FB210020F6F7F7FC03E0F7F7B0F8F6F710 -:20C8C00017FD99F8000028B1686A007810F0100F05D00CE001210846F7F735FA0AE0D6481B -:20C8E000007810F0100F04BF6879002802D0E8780028EFD0A87908BB85F8068096F85200F5 -:20C90000012808BF002408D0022808BF012404D003281ABFFFDF0024032496F8510001280C -:20C9200008BF002007D0022808BF012003D003281CBFFFDF00202146F7F7D9F8686A0188CF -:20C9400069828078287585F8008003B0BDE8F08F2DE9F05FB94E8146DDF8288030781C46C9 -:20C9600017460D4628B9002F1CBF002CB8F1000F00D1FFDFC6F82080C6E90674C6E90E95B0 -:20C9800000247472FF20F072347274713471B471F471AB4FF4703482387805F15808288888 -:20C9A000F3F7A5F930632888F3F78FF97063F7F72BF8F6F7B6FDF7F7F8F805F11100F7F7E3 -:20C9C0000CF805F10D00F6F72EFE387800280CBF03200120F7F715F898F81800F6F72BFE97 -:20C9E000F7F709F895F85200012808BF002007D0022808BF012003D003281CBFFFDF002099 -:20CA0000F7F7DFFB38786FF00D066FF00E0920B398F81080B5F832A095F85210E88E01F0EE -:20CA200034FD81B295F8520003286BD002280EBF09EB910106EBD1018CB26CD0A24538BFB5 -:20CA40005446B8F1000F1CBF211D8CB2012864D0022865D0032865D027E098F80F80B5F83E -:20CA600030A0FFF7F2FC0146284601F017FD1FFA80FBFFF7EAFC032838D002280EBF09EBBA -:20CA80009B0006EBDB0084B23AD0A24538BF5446B8F1000F1CBF201D84B295F8510001286A -:20CAA0003BD002283CD003283CD0FFDF00252846F6F722FD29462046F6F7FBFC387870B3F5 -:20CAC000786890F86801002818BFF6F75FFD01210846F6F725FE7868D0F8E000F6F7A2FFA7 -:20CAE000FFF73FFDBDE8F05FF6F796BFBBF5747FCBD3ABF15000C11700EB916006EBA0104C -:20CB000084B2C2E7B1F5747F98D35039CA1701EB926106EBA1118CB290E70025C7E703E0DB -:20CB20000125C4E70325C2E701210020F6F7F8FDFFF7AEFDD6E770B54148404D05F1380167 -:20CB400000784C68002840D094F85100012808BF002608D0022808BF012604D003281ABFB6 -:20CB6000FFDF0026032694F85200012808BF002108D0022808BF012104D003281ABFFFDFF8 -:20CB80000021032132469620F7F72CF82878022818BFFFDF94F85150F6F736FF94F82C008A -:20CBA000012808BFF7F7ACF8012D08BF002008D0022D08BF012004D0032D1ABFFFDF002014 -:20CBC0000320BDE87040F6F797BC94F85200012808BF002608D0022808BF012604D00328BA -:20CBE0001ABFFFDF0026032694F85100012808BF002108D0022808BF012104D003281ABF7E -:20CC0000FFDF0021032132469620F7F701F82878012818BFFFDF94F85250BDE7074810B578 -:20CC20000078022818BFFFDFBDE8104000F056BB700E0020781000204501002030010020AA -:20CC400068010020FE4880797047FD4840797047FB490120C87170472DE9F0470600F948B7 -:20CC6000F74D4FF0010740684FF0000800F15804A86A90F8019018BF012E03D1696B03F021 -:20CC80003BFA68706878A0B1012830D0022848D003281CBFFFDFBDE8F087012E08BFBDE850 -:20CCA000F087686BF2F723FDA87ABDE8F047EDF7A7BA012E08D001224946686BF2F764FB0A -:20CCC000022E08BFBDE8F087D4E91402411C42F10000C4E91410E079012802D184F80780B5 -:20CCE00000E0E771A87ABDE8F047EDF789BA012E08D000224946686BF2F746FB022E08BF2B -:20CD0000BDE8F087D4E91401401C41F10001C4E91401E07901280CBF84F80780E771BDE887 -:20CD2000F087012E06D0686BF2F7E1FC022E08BFBDE8F087D4E91401401C41F10001C4E9BD -:20CD40001401E0790128CCD1C8E72DE9F041BD4F4FF000083846A7F138044068012600F144 -:20CD600058052078012818BFFFDFA87850B185F80280E670A2694146042090473878002805 -:20CD800018BF2E71606A0321007831EA000004BFE878002805D1EE70616AE670A2690220CF -:20CDA00090470121002000F0BCFA002808BF7C6803D0BDE8F04100F091BAFFF7D2FB94F8AE -:20CDC0005100012808BF002007D0022808BF012003D003281CBFFFDF0020F6F78DFB94F831 -:20CDE0005100012808BF002508D0022808BF012504D003281ABFFFDF0025032594F85200FD -:20CE0000012808BF002108D0022808BF012104D003281ABFFFDF002103212A46BDE8F041D5 -:20CE20009620F6F7DFBE2DE9F84F864E83463046A6F138054068317800F1580A0027287803 -:20CE40004FF00108B946022818BFFFDF288A40F400702882002000F0C8F99AF81000BBF18D -:20CE6000000F00F0F880F6F769FAF6F757FA90B99AF8100078B1A86A417861B100789AF8B2 -:20CE80000710C0F3C000884205D185F80480BDE8F84F00F023BAA86A0188A5F81510807859 -:20CEA000E875288A40F0200028826F713078706858300090746894F82C00012818D1F6F75E -:20CEC00015FF2046009901F022FA88B13078002870680CBF00F58C7000F5EF7021884180D7 -:20CEE0000099097A017180F80080A87AEDF788F9A86A9AF806100078C0F38000884233D0F3 -:20CF00003078706800F1580490F85D0040B3022844D06771307840B12079394628B121713A -:20CF200085F80380AA6910209047E07890B1E770F7F705FA002808BFFFDF082085F8038005 -:20CF4000AA6900219047D4E91201401C41F10001C4E91201A07901280CBFA77184F8068080 -:20CF6000288A40F480702882A86A9AF807300178C1F3C0029A4256D13278726801F00301EB -:20CF800002F15804012918BF022939D003291CBF287A40F0040012D0287244E0286BF2F714 -:20CFA00084F8002808BFFFDFD4E91210491C40F10000C4E91210A87AEDF722F9A9E7297B8F -:20CFC00019B1C178EA7A91422DD001F020FE98B184F80280298A404641F400612982A96A37 -:20CFE00085F80380AA699047E079012801D1E77119E084F8078016E0287A40F01000CBE715 -:20D00000407820B3298A41F400612982A97851B9FB28F1D8687A002808BFC14603D080202F -:20D02000AA69002190475946012000F07AF988B39AF81000002818BFBBF1000F20D003E058 -:20D040003001002068010020A87868B118E0E0790128CED1CBE7002818BFF6F7A8F9288AB3 -:20D0600040F040002882DEE7A96AEA894878904288BF1046C21CE86A03F080FBE86AA86222 -:20D08000B9F1000F1CBF0020FFF7E6FDBDE8F84F00F024B930787468B9F1000F1CBF012011 -:20D0A000FFF7DAFDFFF7F4FA9AF81000002818BFBBF1000F0DD0A87858B9A96AEA8948780F -:20D0C000904288BF1046C21CE86A03F057FBE86AA862B9F1000F1CBF0220FFF7BDFD94F81E -:20D0E0005200012808BF002007D0022808BF012003D003281CBFFFDF0020F6F7FDF994F89F -:20D100005200012808BF002508D0022808BF012504D003281ABFFFDF0025032594F85100D9 -:20D12000012808BF002108D0022808BF012104D003281ABFFFDF002103212A46BDE8F84F9C -:20D140009620F6F765BD2DE9F0410D469549064694484C68007894F85220002822D0012AFB -:20D1600008BF002708D0022A08BF012704D0032A1ABFFFDF0027032794F85100012808BFF8 -:20D18000002208D0022808BF012204D003281ABFFFDF002203223B4629463046BDE8F04148 -:20D1A000FBF7FFBA012A08BF002708D0022A08BF012704D0032A1ABFFFDF0027032794F823 -:20D1C0005100012808BF002208D0022808BF012204D003281ABFFFDF002203223B46294613 -:20D1E0003046BDE8F041FAF723B92DE9F04701466C4800246FF00D084568027805F15800C1 -:20D200006FF00E0909B3077C6E8E95F85210E88E01F03BF981B295F8520003284DD002284F -:20D220000EBF09EB910108EBD1018CB24ED0A64238BF3446002F1CBF211D8CB2012847D05B -:20D24000022847D0032847D024E0C77B2E8EFFF7FCF80146284601F021F91FFA80FAFFF716 -:20D26000F4F803281DD002280EBF09EB9A0008EBDA0084B21FD0A64238BF3446002F1CBFD0 -:20D28000201D84B295F85100012821D0022821D0032821D0FFDF00212046BDE8F047F6F7BE -:20D2A00008B9BAF5747FE6D3AAF15000C11700EB916008EBA01084B2DDE7B1F5747FB6D3F4 -:20D2C0005039CA1701EB926108EBA1118CB2AEE70021E1E70121DFE70321DDE770B5314935 -:20D2E00000254C68F6F7AAFCF6F770FCF6F716FBF6F779FBF5F7FCFFF6F764FCF6F78CFB62 -:20D3000094F82C00012808BFF6F7F0FC264C0021A269208A9047226A217A20799047257041 -:20D3200070BD70B5204C0546002908BF012D05D16079401CC0B26071012830D8E16928468F -:20D34000884700282BD0E179184839B1012D01BF41780029017811F0100F20D0217AF1B999 -:20D3600010490978002918BF002102D0294304D013E0012D18BF0121F8D10D49097811F0E5 -:20D38000100F04BF007810F0100F08D0E07830B9A07810B111F0100F01D0002070BD0120C3 -:20D3A00070BD00006801002030010020450100204201002010B540F2BB11F74803F055FA59 -:20D3C000F648002141704FF46171418010BD2DE9F0410F46064600F0D6FAEF4C102817D098 -:20D3E00004EBC00191F8421111F0010F1CBF0120BDE8F081617808291FD2617804EBC000FB -:20D40000491C6170012180F842110846BDE8F0816178082911D22578681C207004EBC5082B -:20D420003868C8F83C01B888A8F84001102D28BFFFDF88F83B612846DFE70020BDE8F081A6 -:20D44000D5480178491E4BB2002BB8BF704770B45FF0000500EBC30191F8421111F0010F65 -:20D460003BD04278D9B2521E427000EBC10282F8425190F802C00022BCF1000F0BD98418D7 -:20D4800094F803618E4202D1102A26D103E0521CD2B29445F3D80278521ED2B202708A42A3 -:20D4A0001BD000EBC20200EBC10CD2F83B41CCF83B41D2F83F21CCF83F21847890F800C002 -:20D4C0000022002C09D9861896F8036166450AD1102A1CBF024482F80311591E4BB2002B7E -:20D4E000B8DA70BC7047521CD2B29442EBD8F4E72DE9F0471E4617468846814600F043FA81 -:20D50000A54C0546102831D0A078002100280ED9621892F80331AB4205D110291CBF12200D -:20D52000BDE8F08703E0491CC9B28842F0D8082832D2102D1DD000BF94F80280102208F124 -:20D540000100A07004EB081909F10300394600F08DFE09F183001022314600F087FE04EB29 -:20D56000080080F803510020BDE8F087A078082812D22578681C207004EBC50AD8F8000030 -:20D58000CAF83C01B8F80400AAF84001102D28BFFFDF8AF83B91CFE70720BDE8F08770B488 -:20D5A0007D488178491E4BB2002BBCBF70BC704703F0FF0C8178491ECAB2827050FA83F136 -:20D5C00091F8031194453AD000EB021400EB0C15D4F80360C5F80360D4F80760C5F8076018 -:20D5E000D4F80B60C5F80B60D4F80F60C5F80F60D4F88360C5F88360D4F88760C5F88760BF -:20D60000D4F88B60C5F88B60D4F88F40C5F88F40841800EB0C0502EB420294F803410CEBF4 -:20D620004C0C00EB420285F8034100EB4C0CD2F80B41CCF80B41B2F80F21ACF80F2100EBA0 -:20D64000C10292F8422112F0010F35D190F802C000220C46BCF1000F0BD9851895F8035126 -:20D660008D4202D1102A27D103E0521CD2B29445F3D80178491EC9B20170A1421CD000EBD7 -:20D68000C10100EBC402D1F83BC1C2F83BC1D1F83F11C2F83F1190F802C002780021BCF1E7 -:20D6A000000F09D9451895F8035195420BD110291CBF014481F80341591E4BB2002BBFF61E -:20D6C00077AF70BC7047491CC9B28C45EAD8F3E732494870704731484078704738B14AF2FD -:20D6E000B811884203D82D49488001207047002070472A484088704710B500F044F91028B4 -:20D7000014D0254A0146002092F802C0BCF1000F0CD9131893F803318B4203D1102818BFC8 -:20D7200010BD03E0401CC0B28445F2D8082010BD19498A78824286BF01EB001083300020A7 -:20D74000704715498A78824286BF01EB0010C01C00207047104B93F802C084459CBF00200E -:20D760007047184490F8030103EBC00090F83B310B70D0F83C111160B0F84001908001204D -:20D780007047054A114491F8032104490A7002684A60808808817047A010002070010020FD -:20D7A00010B5F5F721FD002804BFFF2010BDBDE81040F5F73FBDF1498A7882429CBF00206B -:20D7C0007047084490F8030101EBC00090F8420100F00100704770B5E84E00242546307809 -:20D7E000002814D906EBC50090F8421111F0010F08D090F83B2100F59E712046631CDCB23F -:20D80000F5F7D9FE681CC5B23078A842EAD87078A04218BFFFDF70BD70B5D84C0026354660 -:20D82000A078002812D96019731C90F8030104EBC00000F59E7190F83B213046DEB2F5F7A0 -:20D84000BAFE681CC5B2A078A842ECD8C0B2B04218BFFFDF70BD10B5F5F7DDFE58B300244E -:20D86000F5F7DDFEC54A00211378002B23D900BF02EBC10C9CF842C11CF0010F17D0844226 -:20D880001CBF04F1010C0CF0FF0410D193780020002B0AD902EB000C9CF803C18C4508BFA9 -:20D8A00010BD401CC0B28342F4D8102010BD491CC9B28B42DCD8082010BD10B5F5F7ABFE8F -:20D8C000002804BF082010BDBDE81040F5F7A7BEAB4910B5497841B1A84B997829B1C21CFA -:20D8E000D81CF5F71EFC012010BD002010BDA34A01EB410102EB41010268C1F80B218088B2 -:20D90000A1F80F01704770B59C4D0024A878002898BF70BDC0B2A04212D905EB041010F165 -:20D9200083060DD01021304600F07DFC40B904EB440005EB400000F20B113046F6F78FFD18 -:20D94000601CC4B2A878A042E4D870BD014610228C4800F08BBC8B48704770B5874D044699 -:20D96000A878A04206D905EB04101021833000F05AFC08B1002070BD04EB440005EB40002F -:20D9800000F20B1070BD2DE9F0417C4D0646002428780F46002811D905EBC40090F83B113E -:20D9A000B14206D10622394600F59E7002F0BAFE38B1601CC4B22878A042EDD81020BDE852 -:20D9C000F0812046BDE8F0816C4910B44A7801EBC003521E4A70002283F8422191F802C0FB -:20D9E000BCF1000F0DD98B1893F80341844204D1102A1CBF10BC704703E0521CD2B2944532 -:20DA0000F1D80A78521ED2B20A70824204BF10BC704701EBC00301EBC202D2F83BC1C3F863 -:20DA20003BC1D2F83F21C3F83F218C7891F800C00022002C9CBF10BC70478B1893F80331CA -:20DA4000634506D1102A1CBF114481F8030110BC7047521CD2B29442EFD810BC704770B4A7 -:20DA600046490D188A78521ED3B28B7095F80321984239D001EB001C01EB031400EB400036 -:20DA8000D4F80360CCF80360D4F80760CCF80760D4F80B60CCF80B60D4F80F60CCF80F60FE -:20DAA000D4F88360CCF88360D4F88760CCF88760D4F88B60CCF88B60D4F88F40CCF88F401E -:20DAC00001EB030C03EB43039CF803C101EB430385F803C101EB4000D3F80BC1C0F80BC105 -:20DAE000B3F80F31A0F80F3101EBC20090F8420110F0010F1CBF70BC704700208C78002CCC -:20DB00000DD90B1893F803C1944504D110281CBF70BC704703E0401CC0B28442F1D8087849 -:20DB2000401EC0B20870904204BF70BC704701EBC20301EBC000D0F83BC1C3F83BC1D0F885 -:20DB40003F01C3F83F018C780B780020002C9CBF70BC704701EB000C9CF803C19C4506D171 -:20DB600010281CBF084480F8032170BC7047401CC0B28442EED870BC70470000A0100020BA -:20DB8000700100205B12002010B50A7B02F01F020A73002282758B181B7A03F0010C5B08D9 -:20DBA00003F00104A4445B0803F00104A4445B0803F00104A4445B0803F0010464444FEAC3 -:20DBC000530C0CF0010323444FEA5C0C0CF00104234403EB5C0300EB020C521C8CF81130FD -:20DBE00090F816C0D2B263448375052AD3D3D8B2252888BFFFDF10BD00238383028401EB6B -:20DC0000C202521EB2FBF1F1C183704770B46FF01F01050C01EA9024012000224FF01F0C46 -:20DC20001146134682EA0506F6430E43B6F1FF3F11D004F00106520842EAC63249080CF0A7 -:20DC4000010664085B1C41EAC6314FEA5C0C162BE8D370BC704770BC002070472DE9F0032C -:20DC60000A460021032A10D04FF4FA4C002A7CD0012A00F0FF80022A1CBFBDE8F003704737 -:20DC80000146BDE8F00358307EE7A0F8581080F85E1080F85F1080F8631080F8641080F89C -:20DCA000651080F8661080F85A1080F85B1080F85C1080F85D1080F87110A0F8741080F8E6 -:20DCC0007A10A0F87C10A0F8821080F88610A0F8881080F88A1080F86F1080F8701080F8B5 -:20DCE000671080F8681080F88B1080F88C1080F88E10F52280F89420092280F89520A0F84D -:20DD0000801080F89710A0F8D010A0F8D210A0F8D410A0F8D610A0F8D810A0F8DA1080F8EE -:20DD2000DD1080F8DF10A0F8E61080F8E410A0F8F810A0F8FA1080F82C1001844FF00108D2 -:20DD400080F8518080F852804FF4486242801B22028742874FF4A473C387838702864286F4 -:20DD6000C3868386A0F8442000E045E0A0F84630A0F84020A0F84230A0F84820A0F84A203E -:20DD8000A0F84C2080F8901180F8981080F89A1180F8691180F86E1180F87111D0F80D204B -:20DDA0006FF01F03140C03EA92271F2600231A464FEA030C83EA0405ED431543B5F1FF3F2A -:20DDC00015D007F001055B0843EAC53306F0010552087F0876080CF1010C42EAC532BCF1A4 -:20DDE000160FE7D380F86811BDE8F003704780F86881BDE8F0037047A0F8E61080F8DE1060 -:20DE00004288FE4B1344B3FBF2F3A0F876304BF68033A0F87830C488A0F87C10B0F88010EB -:20DE200000F15803514391FBF2F1A0F88010E100B1FBF2F1491C89B201FB02F4A0F87E1043 -:20DE4000B4F5C84FC4BF491ED984BCFBF2F1491C998502F5802101F5EE31A1F1010CBCFB9B -:20DE6000F2F1D983B3F81CC00CFB02F1B1FBF2F1998305E7A0F8E61000F158024488B0F8FE -:20DE80008A31B0F88E019184118DC0006143B0FBF3F091FBF3F1401C118580B200FB03F168 -:20DEA000D084B1F5C84FC4BF401ED084BCFBF3F0401C9085108C03EBC000401EB0FBF3F0DB -:20DEC000D083908B6043B0FBF3F09083BDE8F00370470A4630B40021032A0DD04FF4FA4C59 -:20DEE000002A7ED0012A7BD0022A1CBF30BC7047014630BC583047E6A0F8581080F85E10BC -:20DF000080F85F1080F8631080F8641080F8651080F8661080F85A1080F85B1080F85C10BF -:20DF200080F85D1080F87110A0F8741080F87A10A0F87C10A0F8821080F88610A0F8881059 -:20DF400080F88A1080F86F1080F8701080F8671080F8681080F88B1080F88C1080F88E10A4 -:20DF6000F52280F89420092280F89520A0F8801080F89710A0F8D810202280F8DA2080F813 -:20DF8000D010C0F8D41080F82C10012280F8512080F852201B22028742874FF4A473C38728 -:20DFA000838702864286C3868386A0F84420A0F84630A0F84020A0F84230A0F84820A0F811 -:20DFC0004A20A0F84C2080F8081180F8981080F8121180F8F01080F8001130BC704700E003 -:20DFE00039E04288854B1344B3FBF2F3A0F876304BF68033A0F87830C488A0F87C10B0F8FA -:20E00000801000F15803514391FBF2F1A0F88010E100B1FBF2F1491C89B201FB02F4A0F85F -:20E020007E10B4F5C84FC4BF491ED984BCFBF2F1491C998502F5802101F5EE31A1F1010CE2 -:20E04000BCFBF2F1D983B3F81CC00CFB02F1B1FBF2F199834CE7D0F8F84000F15802438855 -:20E060006089E4899184118D594391FBF0F11185E100B1FBF0F1491C89B201FB00F4D184A5 -:20E08000B4F5C84FC4BF491ED184BCFBF0F1491C9185118C00EBC101491EB1FBF0F1D183DC -:20E0A000918B5943B1FBF0F0908330BC7047837D0BB1252B01D912207047002A04BF00208A -:20E0C000704770B490F817C00C7E4D4D04FB02C22C464FF0000CE2FB054C4FEA1C1C6FF064 -:20E0E00024040CFB0422D2B201EBD20CC27502F007059CF808C0012404FA05F51CEA050FB5 -:20E1000018BF02762CD1B2FBF3FC03FB1C22521CD2B24FF0000C00BF00EB0C035B7C934239 -:20E120003CBFD21AD2B20ED301EB0C0500232D7A04FA03F635421CBF521ED2B26AB15B1CFD -:20E14000DBB2082BF4D30CF1010303F0FF0CBCF1050FE1D370BC1F20704703EBCC01017670 -:20E1600070BC00207047274A016812681140264A126811430160704730B42449214B0024C0 -:20E180004FF0010C0A78521CD2B20A70202A08BF0C700D781A680CFA05F52A42F2D0097802 -:20E1A00002680CFA01F15140016030BC7047017931F01F0113BF002000221146704710B4C7 -:20E1C000435C03F0010C5B0803F00104A4445B0803F00104A4445B0803F00104A4445B0874 -:20E1E00003F00104A4445B0803F00104A4445B0803F00104A4440CEB530309E0FFDB0500A4 -:20E2000053E4B36EB40F0200B80F02007A0100201A44491CD2B20529D2DB012A8CBF0120C4 -:20E22000002010BC704730B40022A1F1010CBCF1000F11DD431E11F0010F08BF13F8012F78 -:20E240005C785FEA6C0C07D013F8025F22435C782A43BCF1010CF7D1491E5CBF405C02435B -:20E26000002A0CBF0120002030BC7047130008BF704710B401EB030CD41A1CF801CC5B1E2D -:20E2800000F804C013F0FF03F4D110BC7047F0B58DB0164610251C466A46AC4600EB0C0304 -:20E2A000A5EB0C0713F8013CD355ACF1010313F0FF0CF3D115461032102084460B18ACEB87 -:20E2C000000713F8013C401ED35510F0FF00F5D1284601F0DDFA86B1102005F120020146A8 -:20E2E0001318A1EB000C13F8013C401E04F80C3010F0FF00F4D10DB0F0BD0898206009988E -:20E3000060600A98A0600B98E0600DB0F0BD38B505460C466846F5F7FEFC002808BF38BD4C -:20E320009DF90020227294F909100020511A48BF494295F82D308B42C8BF38BDFF2B08BFAC -:20E3400038BDA17A491CC9B2A17295F82E30994203D8617A7F2918BF38BD62720020A072C4 -:20E36000012038BD0C2950D2DFE801F006090E13161B323C3F4D4248002A48D045E0022A00 -:20E3800018BF032A43D040E0072A18BF062A3ED03BE0082A3BD038E0A2F10C000D2836D9AD -:20E3A00033E023B1A2F10D000C2830D92DE00F2A18BF0E2A2BD090F8340020B10F2A24D38C -:20E3C000182A24D921E0132A1FD3182A1FD91CE0A2F10C0103291AD990F83400A8B1192A81 -:20E3E00015D912E0092A12D00FE0012A0FD00CE01A2A1CBF1B2A1C2A09D006E0A2F11D002A -:20E40000042804D901E00A2A01D000207047012070472DE9F04187680D4604462046F3F73B -:20E4200004FD98B1D5B13846A168F3F743FF002814DD401EB0FBF5F0461C06FB05F138467B -:20E44000F3F75FF8A0603046BDE8F081F3F74AFB40F22E71F3F755F8A060DFE70020BDE82D -:20E46000F081904228BF704770B50446101B642838BF642025188D4205D8F3F742FF0028DE -:20E480001CBF284670BD204670BD032918BF7047B0F5296F38BF4FF4296070470246808EAC -:20E4A000032918BF7047D18E92F85230032B04D1B1F5296F38BF4FF42961538840F2E24CF7 -:20E4C00003FB0CF3528E4FF4747C0CEB821C8C459CBF910101F57471591AA1F59671884224 -:20E4E00028BF0846B0F5296F38BF4FF429607047CA8EB2F5296F38BF4FF42962498E4FF4BA -:20E50000747303EB811393429CBF890101F5747291B200280CBF0120002001F6283100280D -:20E5200018BF0420084470472DE9F00191F851600A8E4FF47477032E04BF07EB821294B216 -:20E5400006D0022E07BF92003C32D200703294B2CB8E4D8E8A8E91F852C0032E16D0A24253 -:20E5600028BF224692B2BCF1030F04BF07EB851189B207D0BCF1020F07BFA9003C31E90069 -:20E58000703189B2BCF1030F26D120E01E46BCF1030F04D1B6F5296F38BF4FF42966498814 -:20E5A00040F2E24801FB08F107EB8518B0459CBFAE0106F57476891BA1F596718A4228BFA3 -:20E5C0000A46B2F5296F38BF4FF42962C7E7B3F5296F38BF4FF429638B4228BF0B46002806 -:20E5E0000CBF01210021D0189830002918BF04210844BDE8F001704770B48388B0F808C000 -:20E6000003EB0C049834002A18BF042222444C6A944224BF70BC7047121B0124521E04EBA0 -:20E6200052029B1A9BB2ACEB0202838092B2028191F851506FF00E06741C4FF0000C032D77 -:20E640001AD0022D0EBF06EB930304EBD3039BB21DD0438091F8521003291AD002290EBF92 -:20E6600006EB920104EBD2011FFA81FC1BD000BFA0F806C070BC7047B3F5747F38BF634698 -:20E68000E7D3503BDD1703EB956304EBA3139BB2DFE7B2F5747FEBD3A2F15001CA1701EB9A -:20E6A000926104EBA1111FFA81FCE1E7F8B505460E46084600F027FC0446304600F027FCE8 -:20E6C000014610F0010F18BF012008D111F0020F18BF022003D111F0040018BF03208DF8AF -:20E6E000000014F0010F18BF012208D114F0020F18BF022203D114F0040218BF03228DF8C4 -:20E70000012011F0070F08BF00208DF8000014F0070F08BF00228DF8012095F851108842F4 -:20E7200008BF00208DF8000095F85200824208BF00228DF80120BDF80000F8BD012814BFD5 -:20E740000228704703280CBF04200020704718B4CBB2C1F3072CC1B2C0F30720012B07D067 -:20E76000022B09D0042B08BFBCF1040F23D006E0BCF1010F03D11EE0BCF1020F1BD00129A2 -:20E7800006D0022907D0042908BF042813D004E0012802D10FE002280DD001EA0C0161F37C -:20E7A0000702184060F30F22D0B210F0020F18BF022010D106E0084003EA0C01084060F344 -:20E7C0000702EFE710F0010F18BF012003D110F0040018BF03208DF80000C2F3072010F01F -:20E7E000020F18BF022008D110F0010F18BF012003D110F0040018BF03208DF80100BDF821 -:20E80000000018BC7047072816BF08280120002070470000282102F028B830B5054600787E -:20E8200001F00F0220F00F0010432870092910D2DFE801F0050705070509050B0D00062493 -:20E8400009E00C2407E0222405E0012403E00E2401E00024FFDF6C7030BD007800F00F0030 -:20E8600070470A68C0F803208988A0F807107047D0F803200A60B0F80700888070470A68E8 -:20E88000C0F809208988A0F80D107047D0F809200A60B0F80D00888070470278402322F05C -:20E8A000400203EA81111143017070470078C0F3801070470278802322F0800203EAC11139 -:20E8C0001143017070470078C0097047027802F00F02072A16BF082AD0F80520D0F8032037 -:20E8E000C1F809200CBFB0F80920B0F80720A1F80D200A7822F080020A700078800942EA48 -:20E90000C0100870704770B515460E4604461F2A88BFFFDF2A46314604F1090001F02EFF69 -:20E92000A81D607070BD70B544780E460546062C38BFFFDFA01F84B21F2C88BF1F2422465C -:20E9400005F10901304601F019FF204670BD70B515460E4604461F2A88BFFFDF2A46314632 -:20E9600004F1090001F00AFFA81D607070BD70B544780E460546062C38BFFFDFA01F84B261 -:20E980001F2C88BFFFDF224605F10901304601F0F5FE204670BD0968C0F80F1070470A8821 -:20E9A000A0F813208978417570474176090A81767047C176090A017770474177090A81776A -:20E9C0007047C175090A017670478175704790F8242001F01F0122F01F02114380F824104C -:20E9E0007047072988BF072190F82420E02322F0E00203EA4111114380F8241070471F30B9 -:20EA000002F05FB8C17811F03F0F1BBF027912F0010F0022012211F03F0F1BBF037913F011 -:20EA2000020F002301231A4402EB4202530011F03F0F1BBF027912F0080F0022012203EBAC -:20EA4000420311F03F0F1BBF027912F0040F00220122134411F03F0F1BBF027912F0200F47 -:20EA60000022012202EBC20203EB420311F03F0F1BBF027912F0100F0022012202EB420232 -:20EA80001A4411F03F0F1BBF007910F0400F00200120104410F0FF0014BF01210021084431 -:20EAA000C0B2704710B50278417802F00F02082A2ED2DFE802F004080B2D2D2D0F13881FE0 -:20EAC0001F2823D924E00C2920D021E0881F1F281CD91DE0881F1F2818D919E04B1E242B59 -:20EAE00016D80024072A18BF082A01D0204610BDC2789309032BF9D002F03F0C0CF10102BC -:20EB00008A42F3D8FFF77EFF6045EFD8012010BD002010BD0278417802F00F02082A02BF7B -:20EB20000E29C0785FEA901005D0042A05D1062903D3252901D8012070470020704710B405 -:20EB4000017801F00F01032920D0052921D14478B0F81910B0F81BC0B0F81730827D222CB3 -:20EB600017D1062915D3B1F5486F98BFBCF5FA7F0FD272B1082A98BF8A420AD28B429CBF5B -:20EB8000B0F81D00B0F5486F03D805E040780C2802D010BC0020704710BC0120704722214C -:20EBA00001F063BE00B5027801F0030322F003021A43027000224270012914BF022900BD7E -:20EBC000032912BFFFDF0121417000BD01F0030300B5027822F003021A43027000224270EA -:20EBE000012914BF022900BD032912BFFFDF0121417000BD007800F00300704702781023F6 -:20EC000022F0100203EA01111143017070474178F9B1C078192850D2DFE800F00D1013165A -:20EC2000191C1F2225282B2E31344F4F4F4C373A3D40434649000C2941D042E008293ED0B3 -:20EC40003FE002293BD03CE0172938D039E00D2935D036E0012932D033E001292FD030E019 -:20EC600002292CD02DE0092929D02AE0092926D027E0012923D024E0012920D021E0062991 -:20EC80001DD01EE002291AD01BE0012917D018E0012914D015E0092911D012E009290ED058 -:20ECA0000FE003290BD00CE0032908D009E0052905D006E0032902D003E0FB2901D801209D -:20ECC00070470020704730B50546C170192922D2DFE801F00D0F1113151717111919171763 -:20ECE0001B112121211D171719191D1D1F000C2413E0082411E002240FE017240DE00D2401 -:20ED00000BE0012409E0092407E0062405E0032403E0052401E00024FFDF6C7030BDC078C0 -:20ED20007047C171090A01727047B0F8070070474172090A81727047B0F809007047C1723C -:20ED4000090A01737047B0F80B0070474171090A81717047B0F80500704701717047007997 -:20ED600070474173090A81737047B0F80D00704730B4B0F807207E4DB0F809C0B0F8053032 -:20ED80000179941F2D1998BFBCF5FA7F0ED269B1082998BF914209D293429FBFB0F80B0069 -:20EDA000B0F5486F012030BC98BF7047002030BC7047001D01F085BE021D0846114601F013 -:20EDC00080BE4172090A81727047B0F80900704701717047007970470A684260496881601E -:20EDE000704742680A608068486070470988818170478089088070470A68C0F80E20496866 -:20EE0000C0F812107047D0F80E200A60D0F81200486070470968C0F816107047D0F81600E4 -:20EE2000086070470A68426049688160704742680A608068486070470968C1607047C0688A -:20EE400008607047017170474171090A81717047C171090A0172704700797047B0F80500B0 -:20EE60007047B0F807007047017170470079704701717047007970470A684260496881601D -:20EE8000704742680A608068486070470171090A417170478171090AC17170470172090AFE -:20EEA000417270478172090AC172704780887047C0887047008970474089704701891B29AC -:20EEC00024BF4189B1F5A47F07D381881B2921BFC088B0F5A47F01207047002070470A6884 -:20EEE000426049688160704742680A60806848607047017170470079704741717047407951 -:20EF00007047017170470079704741717047407970478171090AC1717047C088704715A264 -:20EF200082B0D2E90012CDE900120179407901F0070269461DF80220012A07D800F00700F6 -:20EF4000085C01289EBF012002B07047002002B0704701717047007970474171704730B50D -:20EF60000C460546FB2988BFFFDF6C7030BD000086F3FFFF000101020102020370B50446F0 -:20EF8000C2F11005281901F0F9FB15F0FF0108D0491EC9B2802060542046BDE8704001F0C4 -:20EFA00064BC70BD30B505E05B1EDBB2CC5CD55C6C40C454002BF7D130BD10B5002409E065 -:20EFC0000B78521E44EA430300F8013B11F8013BD2B2DC09002AF3D110BD2DE9F0410C4694 -:20EFE00001200978FF4E92B0154602274FF006084FF0040C71B101291ED0022945D003291A -:20F0000005D12978042902D105201070002012B0BDE8F081606850B1CDE9010601202070A5 -:20F020008DF80080606A04901146684663E0277085F800C0566026E029780429E7D169683E -:20F0400010222069FFF7B9FF6868C07B000606D5E44A2069102310320146FFF7A3FFD4E993 -:20F0600004101022FFF7A9FF2069C07B000606D5DC4A6069102310320146FFF793FF27703D -:20F0800085F800C06E600320C1E729780429BED1A08910280CD9A0F1100080B2A081A168FA -:20F0A0004FF01003014468466A68FFF77BFF18E004D14FF010032269A16807E0C2B20DA806 -:20F0C000A168FFF75BFF626910230DA909A8FFF769FF102309A968466A68FFF763FF032034 -:20F0E000207060680590CDF818D08DF81080606A0890294604A8F1F7FBFF88E72DE9F0414C -:20F1000007460D4601200B7806213BB1012B04D11378052B01D11170002079E76C6901260D -:20F1200020226170E8686060686A6062A168287C0870A681A068A968401C01F01FFBA08923 -:20F1400020222030A081A0686968213001F016FBA08921462030A0812E703846BDE8F041DD -:20F16000F1F7DDBF2DE9F05F0D46834601200978174606464FF00608D1B1DFF868A24FF050 -:20F180000009AAF1080A012923D002297ED003290CD13978052909D179681022E86901F00C -:20F1A000EDFA07203870183500207D60BDE8F09F2C6A8C48202284F8018020306060202022 -:20F1C000A081686A60626968A06801F0D7FA2E70D4E039780529E9D12C6A84F80180686A8F -:20F1E000606251681022E86901F0C8FAE8696060A0684F4680F80090A681A0684670A0899A -:20F20000401C80B2A081A1680844696951F8012F026089888180A089801D80B2A081696940 -:20F22000A2680978C1F340011154A089401C80B2A081A1680844296951F8012F026089883E -:20F240008180A089801D80B2A0812969A2680978C1F340011154A0891022401C80B2A08113 -:20F26000A1680844E96801F089FAA0891022103080B2A081A1680844A96801F07FFAA0898D -:20F28000103080B2A081A168014400E00DE0DAF804000860A089001D80B2A081A1680F547D -:20F2A000A089401CA081022067E03978052992D151681022A86901F061FA2C6A84F8018022 -:20F2C000E8696060686A6062A16881F80090A681A0684670A089401C80B2A081A168084465 -:20F2E000696951F8012F026089888180A089801D80B2A0816969A2680978C1F3400111547F -:20F30000A089401C80B2A081A1680844296951F8012F026089888180A089801D80B2A08128 -:20F320002969A2680978C1F340011154A0891022401C80B2A081A1680844E96801F01EFA9D -:20F34000A0891022103080B2A081A1680844A96801F014FAA089103080B2A081A168014450 -:20F36000DAF804000860A089001D80B2A081A1680E54A089401CA0810320287021465846E5 -:20F38000BDE8F05FF1F7CBBE70B50D4606460978012041B1012905D11178052902D10820FE -:20F3A0001070002070BD2C6A0620607069686160696A6162EA69A16852F8013F0B60928861 -:20F3C0008A80A081E869A1680078C0F340008871A089401C80B2A081A1680844A96951F8BC -:20F3E000012F01E0C40F0200026089888180A089801D80B2A081A969A2680978C1F3400108 -:20F400001154A089401C80B2A081A168084469690A88028089788170A0891022C01C80B219 -:20F42000A081A1680844296901F0A8F9A0891022103080B2A081A1680844E96801F09EF916 -:20F44000A0891022103080B2A081A1680844A96801F094F9A08921461030A0810120287030 -:20F460003046BDE87040F1F75ABE70B50D4606460978012059B1012908D11178052905D1C1 -:20F4800009201070506800685060002070BD6C69062010226070E8686060686A6062296973 -:20F4A000A06801F06BF91020A081A06820221030A96801F063F9A0892022203080B2A081A8 -:20F4C000A1680844696801F059F9A08921462030A081012028703046BDE87040F1F71FBE79 -:20F4E00070B50C46012009788EB01546062659B1012934D0022905D12978042902D10A202A -:20F50000107000200EB070BD606910236A460078C0F340008DF80000A0690078C0F3400050 -:20F520008DF80100E0680168CDF802108188ADF8061080798DF8080020690168CDF80910A3 -:20F540008188ADF80D1080798DF80F006068059009A80690A168FFF725FD01201DE02978CF -:20F560000429CFD1A06910236A4650F8011F00918088ADF80400606950F8011FCDF806101C -:20F580008088ADF80A00002003906068059009A806906968FFF706FD022020708DF81060EC -:20F5A000606A0890294604A8F1F7A2FDAAE700B50B7889B001204BB1012B05D11178042970 -:20F5C00002D10B201070002009B000BD4868019005A80290C8680368059340680690886836 -:20F5E00003680793406808900120087006208DF80000486A049011466846F1F779FDE3E70F -:20F6000000B50B7889B0012043B1012BDCD111780429D9D10C2010700020D5E74868019062 -:20F6200005A80290886803680593406806900020079008900120087006208DF80000486A15 -:20F64000049011466846F1F753FDBDE700B50B7889B0012043B1012BB6D111780429B3D1C2 -:20F660000D2010700020AFE748680590CDF818D088680088ADF80000C8680088ADF80200B9 -:20F6800000200190029003900120087006208DF81000486A0890114604A8F1F729FD93E76B -:20F6A00030B403460C7801205CB1012C15D0022C05D111780C2902D10E201070002030BC0A -:20F6C000704701200870C868042242704A6842600B4A8260921EC2600BE014780D2CEED106 -:20F6E00002200870C86803244470526842608A688260496A4162014630BC1846F1F70FBD9A -:20F70000BE0F02002DE9F0410C4611490D68104A104908321160A0F120012A2901D301205A -:20F720000CE03E2810D040CC0B4F94E80E0007EB8000241F50F8807C3046B847206004486D -:20F74000001D0560BDE8F0812046E1F739FDF5E71005024001000001F40F020010B5524804 -:20F7600000F02AFA00B1FFDF4F48401C00F024FA002800D0FFDF10BD2DE9F14F4B4ED6F885 -:20F7800000B00127484800F01FFADFF81C8128B95FF0000708F1010000F02CFA444C002588 -:20F7A0004FF0030901206060C4F80051C4F80451009931602060DFF8FCA018E0DAF8000018 -:20F7C000C00614D50E2000F064F8EFF3108010F0010072B600D00120C4F80493D4F8001144 -:20F7E00019B9D4F8041101B920BF00B962B6D4F8000118B9D4F804010028DFD0D4F80401D5 -:20F800000028CFD137B1C6F800B008F1010000F0DBF911E008F1010000F0D6F90028B9D1B0 -:20F82000C4F80893C4F80451C4F800510E2000F030F81D4800F0DEF90020BDE8F88F2DE97F -:20F84000F0438DB00D46064600240DF110090DF1200817E004EB4407102255F827106846A3 -:20F8600000F08CFF05EB870710224846796800F085FF6846FFF780FF10224146B86800F08E -:20F880007DFF641CB442E5DB0DB00020BDE8F08372E700F01F02012191404009800000F1AA -:20F8A000E020C0F8801270477B01002004E5004000E0004010ED00E0B54800210170817005 -:20F8C000704770B5B34D01232B60B34B1C68002CFCD0002407E00E6806601E68002EFCD0BC -:20F8E000001D091D641C9442F5D30020286018680028FCD070BD70B5A54E0446A74D307860 -:20F90000022800D0FFDFAC4200D3FFDF7169A448012903D847F23052944201DD032242715E -:20F92000491C7161291BC1609D497078F2F7CBFA002800D1FFDF70BD70B5954C0D46617879 -:20F94000884200D0FFDF954E082D4ED2DFE805F04D0421304D4D4D3B2078022800D0FFDF07 -:20F9600003202070A078022802D0012804D008E0A06800F0FDFB04E004F1080007C8FFF745 -:20F98000A0FF052020700020A070BDE87040F1F7B4BFF2F7A7F801466068F2F78BFCB0423A -:20F9A00002D2616902290BD30320F2F7E7FE12E0F2F798F801466068F2F77CFCB042F3D21D -:20F9C000BDE8704097E7207802280AD0052806D0FFDF04202070BDE8704000F0CEB8022036 -:20F9E00000E00320F2F7CAFEF3E7FFDF70BD70B50546F2F777F8664C60602078012800D0A3 -:20FA0000FFDF674901200870002008718D60042048716248C860022020706078F2F753FACA -:20FA2000002800D1FFDF70BD10B5594CA07808B9207808B1112010BD5A48F1F7D9FF6070FE -:20FA40006078202804D0012020700020606110BD032010BD002070472DE9F041144600EB00 -:20FA600084070E4605463F1F00F095FB4FF080521169484306EB8401091FB14201D20121E2 -:20FA800000E000211CB11269B4EB920F02D90920BDE8F081444A95420ED3AF420CD38542E6 -:20FAA00005D2874203D245EA0600800701D01020EEE7964200D309B10F20E9E73B483C49D3 -:20FAC0000068884205D0224631462846FFF7F9FE10E0FFF7A9FF0028DAD12D480121856008 -:20FAE000C0E9036481704FF4A97104FB01F01830FFF77DFF0020CBE770B54FF080550446A9 -:20FB000028692949B1FBF0F0844201D20F2070BD00F041FBA04201D8102070BD2869234821 -:20FB200023490068884204D02869604300F020FB0CE0FFF779FF0028EFD129691448614340 -:20FB40008160022181701B48FFF751FF002070BD1548010B01208840401E704770B50D46DB -:20FB60000446FFF7F5FF204201D00F2070BD29462046BDE8704000F0B4BD10B5044C60784A -:20FB8000F1F791FF00B9FFDF00202070A07010BD8001002004E5014000E40140105C0C0061 -:20FBA0006C12002039F9010000200200A0000020BEBAFECA7C5E01000021017008467047E0 -:20FBC0000146002008707047EFF3108101F0010172B60278012A01D0012200E00022012342 -:20FBE000037001B962B60AB1002070474FF400507047E9E7EFF3108111F0010F72B64FF029 -:20FC00000002027000D162B600207047F2E700004C4909680160002070474A49086000207E -:20FC2000704701218A0720B1012804D042F204007047916700E0D16700207047424901200A -:20FC4000086042F20600704708B504233E4A1907103230B1C1F80433106840F00100106093 -:20FC60000BE0106820F001001060C1F808330020C1F80801354800680090002008BD011F50 -:20FC80000B2909D8304910310A6822F01E0242EA400008600020704742F205007047000155 -:20FCA00000F18040C0F8041900207047000100F18040C0F8081900207047000100F18040D3 -:20FCC000D0F80009086000207047012801D9072070471F4A52F8200002680A430260002027 -:20FCE0007047012801D907207047194A52F8200002688A43026000207047012801D9072005 -:20FD00007047134A52F820000068086000207047020010494FF0000003D0012A01D007202E -:20FD200070470A6070474FF080410020C1F808014FF0E020802180F800140121C0F80011B2 -:20FD4000704700000004004000050040080100409C100200780500406249634B0A68634938 -:20FD60009A42096801D1C1F310010160002070475C495D4B0A685D49091D9A4201D1C0F37B -:20FD800010000860002070475649574B0A68574908319A4201D1C0F31000086000207047D8 -:20FDA00030B5504B504D1C6842F20803AC4202D0142802D203E0112801D3184630BDC30095 -:20FDC0004B481844C0F81015C0F81425002030BD4449454B0A6842F209019A4202D00628B0 -:20FDE00002D203E0042801D308467047404A012142F83010002070473A493B4B0A6842F29B -:20FE000009019A4202D0062802D203E0042801D308467047364A012102EBC0004160002030 -:20FE2000704770B52F4A304E314C156842F2090304EB8002B54204D0062804D2C2F80018A3 -:20FE400007E0042801D3184670BDC1F31000C2F80008002070BD70B5224A234E244C15686E -:20FE600042F2090304EB8002B54204D0062804D2D2F8000807E0042801D3184670BDD2F8F4 -:20FE80000008C0F310000860002070BD174910B50831184808601120154A002102EBC0035B -:20FEA000C3F81015C3F81415401C1428F6D3002006E0042804D302EB8003C3F8001807E0EA -:20FEC00002EB8003D3F80048C4F31004C3F80048401C0628EDD310BD04490648083108607E -:20FEE00070470000A0000020BEBAFECA00F5014000F001400000FEFF754B1B6803B1984711 -:20FF0000BFF34F8F73480168734A01F4E06111430160BFF34F8FFEE710B572B600F0CEF86D -:20FF200050B1E1F7E7F9F1F7B0FBF2F7CDFBE2F78EFF6A490020086062B6002010BD70B5F9 -:20FF40000C46054672B600F0B9F810B162B6082070BDE1F74BF9E1F7CFF90246002043099D -:20FF60009B0003F1E02300F01F01D3F80031CB40D9071DD0202803D222FA00F1C90724D11C -:20FF800041B2002906DA01F00F0101F1E02191F8141D03E001F1E02191F8001449090829C1 -:20FFA00013D291B1012910D004290ED005290CD0401C6428D3D3E2F721FF484948480860EB -:20FFC0002046F3F73BF858B903E062B641F2010070BD3F4804602DB12846F3F77CF818B1D3 -:20FFE00010242BE03F4D18E02878022802D94FF4805423E007240028687801D058B908E082 -:020000040002F8 -:20000000E0B120281AD8A878212817D8012815D003E0A87808B162B612E03349802081F854 -:20002000140DE1F769F92946F2F734FBF1F7EBFA00F0E4F82846E1F72FF9044662B61CB1A8 -:20004000FFF76AFF204670BD002070BD10B5044600F034F800B101202070002010BD23497B -:2000600008600020704770B50C4621490D682049204E08310E60102807D011280CD012280F -:200080000FD0132811D0012013E0D4E90001FFF756FF354620600DE0FFF73EFF0025206088 -:2000A00008E02068FFF7D2FF03E0104920680860002020600E48001D056070BD0748084998 -:2000C0000068884201D101207047002070470000980100200CED00E00400FA05A000002018 -:2000E000BEBAFECAA41002000BE000E00400002010050240010000012DE9F04184B0884679 -:200100000746FEF777FD05467E786A4601A94046EFF7F4FA04000ED0012D1EBF032004B070 -:20012000BDE8F08102AA40460199EFF7E6F90298B0F803000AE0022D14D1042E12D3B7F80F -:200140000300BDF80020011D8A420BD3001D80B2A119814238BF012008BF00209CBF04B025 -:20016000BDE8F0814FF0020004B0BDE8F08100000B4A022111600B490B68002BFCD0084B64 -:200180001B1D186008680028FCD00020106008680028FCD070474FF0805040697047000031 -:2001A00004E5014000E4014002000B464FF00000014620D0012A04D0022A04D0032A0DD11D -:2001C00003E0012002E0022015E00320072B05D2DFE803F00406080A0C0E10000720704718 -:2001E000012108E0022106E0032104E0042102E0052100E00621F1F718BC0000FB4805218B -:200200008170002101704170C17081607047F8490A78012A06D0CA681044C860C8683238D5 -:20022000F2F715B88A68104488608868F7E710B5EE4CE078F1F737FC00B9FFDF0820F2F7F2 -:200240009DFA0520A07000202070607010BD0378E849E94A13B1012B0ED011E00379012B3F -:2002600000D06BB943790BB1012B09D18368643B8B4205D2C0680EE00379012B02D00BB192 -:200280000020704743790BB1012BF9D1C368643B8B42F5D280689042F2D8012070472DE949 -:2002A000F04104460227F1F7F4FE006800B1FFDFCE4D01263CB12078B0B1012805D0022879 -:2002C00010D0032813D02E710CE06068C82807D3F2F717F820B16068FFF799FF012703E0E9 -:2002E000002701E000F0CCF93846BDE8F08128780028F7D16068FFF7AAFF0028E3D0606813 -:20030000DFF8EC82007828B3A878042800D0FFDF0020464688F8000060680079C8B3002043 -:20032000307160684079A8B30420707160688168E868F1F7E6F8B0606068C0683230F060C2 -:200340000320A870AA49E878F1F7BDFD0028C9D1FFDFC7E7404688F8006061680979D1B1EC -:200360000021017161684979B9B10421417161688968323181606168C968C160C0689B4CF6 -:2003800014346060F1F7AEFB20606E700220A870A8E704E005E00321E3E70321E6E70120D4 -:2003A000BEE70320C1E72DE9F047904C8846E178884200D0FFDFDFF83492002501278C4E41 -:2003C00009F11409B8F1080F79D2DFE808F0040D2A557E849199A078032803D0A078022828 -:2003E00000D0FFDFBDE8F087A078032803D0A078022800D0FFDF0420A070257120780028A3 -:200400007AD1FFF704FF3078012806D0B068E06000F07BF92061002062E0E078F1F781FC95 -:20042000F5E7A078032803D0A078022800D0FFDF207800286FD1A078032816D0F1F752FB7C -:2004400001464F46D9F80000F1F734FF00280EDB796881420BDB081AF0606549E078F1F7D9 -:2004600032FD0028BED1FFDFBCE7042029E00420F2F784F9A570B5E7A078032803D0A0787F -:20048000022800D0FFDF207888BBA078032817D0F1F728FB01464F46D9F80000F1F70AFFD6 -:2004A0000028E4DB79688142E1DB081AF0605049E078F1F708FD002894D1FFDF92E740E0A1 -:2004C0000520F2F75BF9A7708CE7A078042800D0FFDF022004E0A078042800D0FFDF012025 -:2004E000A1688847FFF7DBFE054630E004E012E0A078042800D0FFDFBDE8F04700F0C0B8EE -:20050000A078042805D0607810B1A078022800D0FFDF207810B1BDE8F04788E6207920B12C -:200520000620F2F72BF92571CDE7607838B13049E078F1F7C8FC00B9FFDF657052E7072034 -:20054000BFE7FFDF4EE73DB1012D03D0FFDF022DF9D147E70420C3E70320C1E770B505002B -:2005600005D0224CA078052803D0112070BD102070BD2248F1F73CFAE070E078202803D01A -:20058000A5600020A07070BD032070BD174810B5017809B1112010BD817805290CD0817858 -:2005A00001290BD0817849B1012101708178012904D0807810B103E00F2010BDFFF737FEF6 -:2005C000002010BD70B5094E0446B07808B101280AD1ACB12046FFF73AFE98B12078044D60 -:2005E00090B1B07801282AD00F2070BD9C0100207C1200203D860100FF1FA107A703020072 -:200600001020F2E70720F0E701202870207990B100202871607980B104206871A068323016 -:20062000A860E068E860E8681A4C6060F1F75AFA2060022016E00320EBE70320EDE70020CC -:2006400028702079A8B100202871607998B104206871A168F068F0F754FFA860E0683230EB -:20066000E8600320B0700C49F078F1F72CFC28B903E00320E8E70320EAE7FFDF0020B4E7DF -:20068000044810B51438006900F037F8BDE81040F1F733B9B00100207C1200201F49096854 -:2006A000014201D001207047002070471B49091D0968014201D00120704700207047174959 -:2006C00010310968014201D00120704700207047124914310968014201D001207047002088 -:2006E000704710B50D4C2060201D01600B4810300260001D0360002010BD09490A6848F2A7 -:2007000002139A4302430A607047054A116848F2021301EA03009943116070470006004032 -:20072000C806024040EA010310B59B070FD1042A0DD310C808C9121F9C42F8D020BA19BAF9 -:20074000884201D9012010BD4FF0FF3010BD1AB1D30703D0521C07E0002010BD10F8013BCE -:2007600011F8014B1B1B07D110F8013B11F8014B1B1B01D1921EF1D1184610BD032A40F279 -:20078000308010F0030C00F0158011F8013BBCF1020F624498BF11F801CB00F8013B38BF15 -:2007A00011F8013BA2F1040298BF00F801CB38BF00F8013B11F0030300F02580083AC0F087 -:2007C000088051F8043B083A51F804CBA0E80810F5E7121D5CBF51F8043B40F8043BAFF348 -:2007E0000080D20724BF11F8013B11F801CB48BF11F8012B24BF00F8013B00F801CB48BF85 -:2008000000F8012B704710B5203AC0F00B80B1E81850203AA0E81850B1E81850A0E8185067 -:20082000BFF4F5AF5FEA027C24BFB1E81850A0E8185044BF18C918C0BDE810405FEA827CCE -:2008400024BF51F8043B40F8043B08BF7047D20728BF31F8023B48BF11F8012B28BF20F8D7 -:20086000023B48BF00F8012B70474FF000020429C0F0128010F0030C00F01B80CCF1040C42 -:20088000BCF1020F18BF00F8012BA8BF20F8022BA1EB0C0100F00DB85FEAC17C24BF00F844 -:2008A000012B00F8012B48BF00F8012B70474FF0000200B5134694469646203922BFA0E83F -:2008C0000C50A0E80C50B1F12001BFF4F7AF090728BFA0E80C5048BF0CC05DF804EB890041 -:2008E00028BF40F8042B08BF704748BF20F8022B11F0804F18BF00F8012B7047FEDF04205D -:200900007146084219D10699134A914215DC069902394878DF2810D10878FE2807D0FF2806 -:200920000BD14FF001004FF000020C4B184741F201000099019A094B184706980599084BFA -:20094000002B02D01B68DB6818474FF0FF304FF000017246014B184700200200F9FE01004A -:2009600004000020184819497047FFF7FBFFE0F715FC00BD4FF4805015490968884203D1C5 -:20098000144A13605B68184700BD000020BFFDE74FF480500E490968884210D10E4B186885 -:2009A0004FF0FF318842F1D080F308884FF02021884204DD0948026802210A430260084832 -:2009C000804708488047FFDF90120020901200200000002004000020002002002405004008 -:2009E000B52F00007509020004207146084202D0EFF3098101E0EFF3088188690238007841 -:200A0000102813DB20280FDB2B280BDB0A4A12680A4B9A4203D1602804DB094A104702203F -:200A200008607047074A1047074A1047074A12682C32126810470000A0000020BEBAFECA4D -:200A4000FD12000005F7010067000200040000200D4B0E4908470E4B0C4908470D4B0B4956 -:200A600008470D4B094908470C4B084908470C4B064908470B4B054908470B4B034908475E -:200A80000A4B02490847000071A00000392F0000B12C00004D2B0000DB2A0000532D000014 -:200AA000191300009728000035A20000A911000000210160818070470021016041600172EA -:200AC00070470A6802600B7903717047D7960000EF980000F5990000199A0000539A0000BA -:200AE000879A0000CD9A0000FD9A00004F9B0000059800008712000087120000C940000015 -:200B00000F41000031410000EB41000027430000F943000031440000F5440000A73C0000B0 -:200B2000494700002B4800004B480000BD150000E11500001115000065150000131600008E -:200B4000A7160000F5600000BB620000636600007D670000016800007B680000ED68000018 -:200B6000096A0000D76A0000576B0000654800006B48000075480000693C00004B490000A9 -:200B8000353C0000A94A0000014B0000814B0000871200008712000087120000F7240000F3 -:200BA0007D25000099250000B525000043270000DF250000E92500002B2600004D260000BB -:200BC000292700006B27000087120000A9840000C9840000CB84000005850000338500008F -:200BE00021860000AF860000C386000011870000F787000099890000C18A00006D7300006D -:200C0000D98A00008712000087120000871200005300000000000000000000000000000053 -:200C2000000000000000000000000000000000000000000000000000000000005200000062 -:200C4000000000000000000000000000000000000000000000000000000000000000000094 -:200C60000000000000000000100110013A0200001A0200007591000035910000FFFFFFFF32 -:200C80000000FFFFA5C900007938000065200000B7730000918F0000000000009781000050 -:200CA00077810000138200004B2400000D2400002D24000083C8000011C90000D759000061 -:200CC000338200000000000063820000C7240000000000000000000000000000000000008F -:200CE000875A00000000000000000000000000000000000000000000000000000000000013 -:200D00000000000000000000000000004DD20000D1D2000000000000000000000000000011 -:200D2000D1D30000000000000000000000000000E3E8000000000000000000000000000044 -:200D4000D7D5000085E2000000000000A5E40000D7E6000000000000B3DB000079DC000057 -:200D60000000000061E5000071DD00008FDF000001E00000F5E0000081D700000000000063 -:200D80000000000091D6000000000000AFD400000DD4000071E1000015E7000083E70000D0 -:200DA000000000001FD300004FD300007FD200000000000099D30000000000000000000062 -:200DC00000000000DBE7000000000000000000000000000000000000000000000000000051 -:200DE000DBD900000000000055E4000027E50000C1E6000095D5000039D400005DD50000AA -:200E000000000000E3D4000000000000000000004DE8000031E9000035EB0000B1E9000012 -:200E20000FD60000EBEA00000000000021D80000F5D80000FBE9000045EA000069DB0000DB -:200E40001BD50000A1E800007FEA00005157000051570000A54000002FC900007976000094 -:200E6000851F0000F39901004FB101009557000095570000C740000063C9000003770000BB -:200E8000EF1F0000219A010063B10100D001D0013E0034005C0024004801F00101000000A4 -:200EA0000001020304000F101112000000130000E1F40100AFF5010001F601004DF601001C -:200EC000A1F60100DBEF0100FDF0010065F1010089F301006BF40100DFFD0000B90E0100E9 -:200EE00000000000060000000A0000003200000073000000B4000000598701002F74010004 -:200F0000894C01001DCC01007D6001001DCC0100FB4C010027CE0100B958010027CE010003 -:200F2000FB4B01004BCD0100335F01004BCD01004F50010047D101001161010047D1010060 -:200F40000004F4F4FE00F1F1FF000000131708080000E8E8FC02E8E800000000F8FF0808E7 -:200F6000555555D6BE898E0000009806250DB21300000208F80FEF1700003C036D069E09C2 -:200F8000000088040509820D555555252627D6BE898EF401FA00960064004B0032001E0088 -:200FA00014000A0005000200010000002509000000000000AAAED7AB15412010000003007A -:200FC000656C746200000000000000000000000000000000870000000000000000000000E3 -:200FE00000000000BE83605ADB0B376038A5F5AA9183886C59FD010071FD010089FD0100A8 -:20100000A1FD0100D1FD0100F9FD010023FE010057FE0100F9FA010059FA01005DFB010052 -:20102000B9FB0100C9FB0100F5FB0100332901003B2901004929010023FC01003DFC0100B6 -:2010400011FC01001BFC010049FC01007FFC01009FFC0100ADFC0100BBFC0100CBFC0100E2 -:20106000E3FC0100FBFC010011FD010000000000039E0000599E00006F9E0000A901020038 -:2010800079F701003FF801005D0502008D050200C5050200292701000D2C01001C050040F7 -:2010A0002005004000100200C810020008000020B001000044110000F8100200B8010020CE -:2010C000D81000008011000001190549101300203601000100743720FB349B5F80041B80A1 -:1810E0000010022501540B0020337F0106A45C0C0020290248100000D9 -:00000001FF diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/boards/README.md b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/boards/README.md deleted file mode 100644 index 8217ae3c0f..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/boards/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Folder origin - -components/boards - -# Modifications - -Removed: - * d52_starterkit.h - * n5_starterkit.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/README.md b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/README.md deleted file mode 100644 index 8a21385d18..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Folder origin - -components/device - -# Modifications - -None. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/README.md b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/README.md deleted file mode 100644 index 485d1a6950..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Folder origin - -components/drivers_nrf - -# Modifications - -Removed: - * spi_master/spi_5W_master.c - * spi_master/spi_5W_master.h - * twi_master/deprecated/* - -Moved: - * nrf_soc_nosd/ to ../TARGET_SOFTDEVICE_NONE/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/clock/nrf_drv_clock.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/clock/nrf_drv_clock.c deleted file mode 100644 index cb02c3c7d7..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/clock/nrf_drv_clock.c +++ /dev/null @@ -1,627 +0,0 @@ -/** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(CLOCK) - -#include "nrf_drv_clock.h" -#include "nrf_error.h" -#include "app_util_platform.h" -#ifdef SOFTDEVICE_PRESENT -#include "nrf_sdh.h" -#include "nrf_sdh_soc.h" -#endif - -#define NRF_LOG_MODULE_NAME clock - -#if CLOCK_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL CLOCK_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR CLOCK_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR CLOCK_CONFIG_DEBUG_COLOR -#define EVT_TO_STR(event) (event == NRF_CLOCK_EVENT_HFCLKSTARTED ? "NRF_CLOCK_EVENT_HFCLKSTARTED" : \ - (event == NRF_CLOCK_EVENT_LFCLKSTARTED ? "NRF_CLOCK_EVENT_LFCLKSTARTED" : \ - (event == NRF_CLOCK_EVENT_DONE ? "NRF_CLOCK_EVENT_DONE" : \ - (event == NRF_CLOCK_EVENT_CTTO ? "NRF_CLOCK_EVENT_CTTO" : "UNKNOWN EVENT")))) -#else //CLOCK_CONFIG_LOG_ENABLED -#define EVT_TO_STR(event) "" -#define NRF_LOG_LEVEL 0 -#endif //CLOCK_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); - -/* Validate configuration */ -INTERRUPT_PRIORITY_VALIDATION(CLOCK_CONFIG_IRQ_PRIORITY); - -/*lint -save -e652 */ -#define NRF_CLOCK_LFCLK_RC CLOCK_LFCLKSRC_SRC_RC -#define NRF_CLOCK_LFCLK_Xtal CLOCK_LFCLKSRC_SRC_Xtal -#define NRF_CLOCK_LFCLK_Synth CLOCK_LFCLKSRC_SRC_Synth -/*lint -restore */ - -#if (CLOCK_CONFIG_LF_SRC == NRF_CLOCK_LFCLK_RC) && !defined(SOFTDEVICE_PRESENT) -#define CALIBRATION_SUPPORT 1 -#else -#define CALIBRATION_SUPPORT 0 -#endif -typedef enum -{ - CAL_STATE_IDLE, - CAL_STATE_CT, - CAL_STATE_HFCLK_REQ, - CAL_STATE_CAL, - CAL_STATE_ABORT, -} nrf_drv_clock_cal_state_t; - -/**@brief CLOCK control block. */ -typedef struct -{ - bool module_initialized; /*< Indicate the state of module */ - volatile bool hfclk_on; /*< High-frequency clock state. */ - volatile bool lfclk_on; /*< Low-frequency clock state. */ - volatile uint32_t hfclk_requests; /*< High-frequency clock request counter. */ - volatile nrf_drv_clock_handler_item_t * p_hf_head; - volatile uint32_t lfclk_requests; /*< Low-frequency clock request counter. */ - volatile nrf_drv_clock_handler_item_t * p_lf_head; -#if CALIBRATION_SUPPORT - nrf_drv_clock_handler_item_t cal_hfclk_started_handler_item; - nrf_drv_clock_event_handler_t cal_done_handler; - volatile nrf_drv_clock_cal_state_t cal_state; -#endif // CALIBRATION_SUPPORT -} nrf_drv_clock_cb_t; - -static nrf_drv_clock_cb_t m_clock_cb; - - -/**@brief Function for starting LFCLK. This function will return immediately without waiting for start. - */ -static void lfclk_start(void) -{ - nrf_clock_event_clear(NRF_CLOCK_EVENT_LFCLKSTARTED); - nrf_clock_int_enable(NRF_CLOCK_INT_LF_STARTED_MASK); - nrf_clock_task_trigger(NRF_CLOCK_TASK_LFCLKSTART); -} - -/**@brief Function for stopping LFCLK and calibration (if it was set up). - */ -static void lfclk_stop(void) -{ -#if CALIBRATION_SUPPORT - (void)nrf_drv_clock_calibration_abort(); -#endif - -#ifdef SOFTDEVICE_PRESENT - // If LFCLK is requested to stop while SD is still enabled, - // it indicates an error in the application. - // Enabling SD should increment the LFCLK request. - ASSERT(!nrf_sdh_is_enabled()); -#endif // SOFTDEVICE_PRESENT - - nrf_clock_task_trigger(NRF_CLOCK_TASK_LFCLKSTOP); - while (nrf_clock_lf_is_running()) - {} - m_clock_cb.lfclk_on = false; -} - -static void hfclk_start(void) -{ -#ifdef SOFTDEVICE_PRESENT - if (nrf_sdh_is_enabled()) - { - (void)sd_clock_hfclk_request(); - return; - } -#endif // SOFTDEVICE_PRESENT - - nrf_clock_event_clear(NRF_CLOCK_EVENT_HFCLKSTARTED); - nrf_clock_int_enable(NRF_CLOCK_INT_HF_STARTED_MASK); - nrf_clock_task_trigger(NRF_CLOCK_TASK_HFCLKSTART); -} - -static void hfclk_stop(void) -{ -#ifdef SOFTDEVICE_PRESENT - if (nrf_sdh_is_enabled()) - { - (void)sd_clock_hfclk_release(); - return; - } -#endif // SOFTDEVICE_PRESENT - - nrf_clock_task_trigger(NRF_CLOCK_TASK_HFCLKSTOP); - while (nrf_clock_hf_is_running(NRF_CLOCK_HFCLK_HIGH_ACCURACY)) - {} - m_clock_cb.hfclk_on = false; -} - -bool nrf_drv_clock_init_check(void) -{ - return m_clock_cb.module_initialized; -} - -ret_code_t nrf_drv_clock_init(void) -{ - ret_code_t err_code = NRF_SUCCESS; - if (m_clock_cb.module_initialized) - { - err_code = NRF_ERROR_MODULE_ALREADY_INITIALIZED; - } - else - { - m_clock_cb.p_hf_head = NULL; - m_clock_cb.hfclk_requests = 0; - m_clock_cb.p_lf_head = NULL; - m_clock_cb.lfclk_requests = 0; - nrf_drv_common_power_clock_irq_init(); -#ifdef SOFTDEVICE_PRESENT - if (!nrf_sdh_is_enabled()) -#endif - { - nrf_clock_lf_src_set((nrf_clock_lfclk_t)CLOCK_CONFIG_LF_SRC); - } - -#if CALIBRATION_SUPPORT - m_clock_cb.cal_state = CAL_STATE_IDLE; -#endif - - m_clock_cb.module_initialized = true; - } - - NRF_LOG_INFO("Function: %s, error code: %s.", - (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - -void nrf_drv_clock_uninit(void) -{ - ASSERT(m_clock_cb.module_initialized); - nrf_drv_common_clock_irq_disable(); - nrf_clock_int_disable(0xFFFFFFFF); - - lfclk_stop(); - hfclk_stop(); - m_clock_cb.module_initialized = false; - NRF_LOG_INFO("Uninitialized."); -} - -static void item_enqueue(nrf_drv_clock_handler_item_t ** p_head, - nrf_drv_clock_handler_item_t * p_item) -{ - nrf_drv_clock_handler_item_t * p_next = *p_head; - while (p_next) - { - if (p_next == p_item) - { - return; - } - p_next = p_next->p_next; - } - - p_item->p_next = (*p_head ? *p_head : NULL); - *p_head = p_item; -} - -static nrf_drv_clock_handler_item_t * item_dequeue(nrf_drv_clock_handler_item_t ** p_head) -{ - nrf_drv_clock_handler_item_t * p_item = *p_head; - if (p_item) - { - *p_head = p_item->p_next; - } - return p_item; -} - -void nrf_drv_clock_lfclk_request(nrf_drv_clock_handler_item_t * p_handler_item) -{ - ASSERT(m_clock_cb.module_initialized); - - if (m_clock_cb.lfclk_on) - { - if (p_handler_item) - { - p_handler_item->event_handler(NRF_DRV_CLOCK_EVT_LFCLK_STARTED); - } - CRITICAL_REGION_ENTER(); - ++(m_clock_cb.lfclk_requests); - CRITICAL_REGION_EXIT(); - } - else - { - CRITICAL_REGION_ENTER(); - if (p_handler_item) - { - item_enqueue((nrf_drv_clock_handler_item_t **)&m_clock_cb.p_lf_head, - p_handler_item); - } - if (m_clock_cb.lfclk_requests == 0) - { - lfclk_start(); - } - ++(m_clock_cb.lfclk_requests); - CRITICAL_REGION_EXIT(); - } - - ASSERT(m_clock_cb.lfclk_requests > 0); -} - -void nrf_drv_clock_lfclk_release(void) -{ - ASSERT(m_clock_cb.module_initialized); - ASSERT(m_clock_cb.lfclk_requests > 0); - - CRITICAL_REGION_ENTER(); - --(m_clock_cb.lfclk_requests); - if (m_clock_cb.lfclk_requests == 0) - { - lfclk_stop(); - } - CRITICAL_REGION_EXIT(); -} - -bool nrf_drv_clock_lfclk_is_running(void) -{ - ASSERT(m_clock_cb.module_initialized); - -#ifdef SOFTDEVICE_PRESENT - if (nrf_sdh_is_enabled()) - { - return true; - } -#endif // SOFTDEVICE_PRESENT - - return nrf_clock_lf_is_running(); -} - -void nrf_drv_clock_hfclk_request(nrf_drv_clock_handler_item_t * p_handler_item) -{ - ASSERT(m_clock_cb.module_initialized); - - if (m_clock_cb.hfclk_on) - { - if (p_handler_item) - { - p_handler_item->event_handler(NRF_DRV_CLOCK_EVT_HFCLK_STARTED); - } - CRITICAL_REGION_ENTER(); - ++(m_clock_cb.hfclk_requests); - CRITICAL_REGION_EXIT(); - } - else - { - CRITICAL_REGION_ENTER(); - if (p_handler_item) - { - item_enqueue((nrf_drv_clock_handler_item_t **)&m_clock_cb.p_hf_head, - p_handler_item); - } - if (m_clock_cb.hfclk_requests == 0) - { - hfclk_start(); - } - ++(m_clock_cb.hfclk_requests); - CRITICAL_REGION_EXIT(); - } - - ASSERT(m_clock_cb.hfclk_requests > 0); -} - -void nrf_drv_clock_hfclk_release(void) -{ - ASSERT(m_clock_cb.module_initialized); - ASSERT(m_clock_cb.hfclk_requests > 0); - - CRITICAL_REGION_ENTER(); - --(m_clock_cb.hfclk_requests); - if (m_clock_cb.hfclk_requests == 0) - { - hfclk_stop(); - } - CRITICAL_REGION_EXIT(); -} - -bool nrf_drv_clock_hfclk_is_running(void) -{ - ASSERT(m_clock_cb.module_initialized); - -#ifdef SOFTDEVICE_PRESENT - if (nrf_sdh_is_enabled()) - { - uint32_t is_running; - UNUSED_VARIABLE(sd_clock_hfclk_is_running(&is_running)); - return (is_running ? true : false); - } -#endif // SOFTDEVICE_PRESENT - - return nrf_clock_hf_is_running(NRF_CLOCK_HFCLK_HIGH_ACCURACY); -} - -#if CALIBRATION_SUPPORT -static void clock_calibration_hf_started(nrf_drv_clock_evt_type_t event) -{ - if (m_clock_cb.cal_state == CAL_STATE_ABORT) - { - nrf_drv_clock_hfclk_release(); - m_clock_cb.cal_state = CAL_STATE_IDLE; - if (m_clock_cb.cal_done_handler) - { - m_clock_cb.cal_done_handler(NRF_DRV_CLOCK_EVT_CAL_ABORTED); - } - } - else - { - nrf_clock_event_clear(NRF_CLOCK_EVENT_DONE); - nrf_clock_int_enable(NRF_CLOCK_INT_DONE_MASK); - m_clock_cb.cal_state = CAL_STATE_CAL; - nrf_clock_task_trigger(NRF_CLOCK_TASK_CAL); - } -} -#endif // CALIBRATION_SUPPORT - -ret_code_t nrf_drv_clock_calibration_start(uint8_t interval, nrf_drv_clock_event_handler_t handler) -{ - ret_code_t err_code = NRF_SUCCESS; -#if CALIBRATION_SUPPORT - ASSERT(m_clock_cb.cal_state == CAL_STATE_IDLE); - if (m_clock_cb.lfclk_on == false) - { - err_code = NRF_ERROR_INVALID_STATE; - } - else if (m_clock_cb.cal_state == CAL_STATE_IDLE) - { - m_clock_cb.cal_done_handler = handler; - m_clock_cb.cal_hfclk_started_handler_item.event_handler = clock_calibration_hf_started; - if (interval == 0) - { - m_clock_cb.cal_state = CAL_STATE_HFCLK_REQ; - nrf_drv_clock_hfclk_request(&m_clock_cb.cal_hfclk_started_handler_item); - } - else - { - m_clock_cb.cal_state = CAL_STATE_CT; - nrf_clock_cal_timer_timeout_set(interval); - nrf_clock_event_clear(NRF_CLOCK_EVENT_CTTO); - nrf_clock_int_enable(NRF_CLOCK_INT_CTTO_MASK); - nrf_clock_task_trigger(NRF_CLOCK_TASK_CTSTART); - } - } - else - { - err_code = NRF_ERROR_BUSY; - } - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -#else - err_code = NRF_ERROR_FORBIDDEN; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -#endif // CALIBRATION_SUPPORT -} - -ret_code_t nrf_drv_clock_calibration_abort(void) -{ - ret_code_t err_code = NRF_SUCCESS; -#if CALIBRATION_SUPPORT - CRITICAL_REGION_ENTER(); - switch (m_clock_cb.cal_state) - { - case CAL_STATE_CT: - nrf_clock_int_disable(NRF_CLOCK_INT_CTTO_MASK); - nrf_clock_task_trigger(NRF_CLOCK_TASK_CTSTOP); - m_clock_cb.cal_state = CAL_STATE_IDLE; - if (m_clock_cb.cal_done_handler) - { - m_clock_cb.cal_done_handler(NRF_DRV_CLOCK_EVT_CAL_ABORTED); - } - break; - case CAL_STATE_HFCLK_REQ: - /* fall through. */ - case CAL_STATE_CAL: - m_clock_cb.cal_state = CAL_STATE_ABORT; - break; - default: - break; - } - CRITICAL_REGION_EXIT(); - - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -#else - err_code = NRF_ERROR_FORBIDDEN; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -#endif // CALIBRATION_SUPPORT -} - -ret_code_t nrf_drv_clock_is_calibrating(bool * p_is_calibrating) -{ - ret_code_t err_code = NRF_SUCCESS; -#if CALIBRATION_SUPPORT - ASSERT(m_clock_cb.module_initialized); - *p_is_calibrating = (m_clock_cb.cal_state != CAL_STATE_IDLE); - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -#else - err_code = NRF_ERROR_FORBIDDEN; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -#endif // CALIBRATION_SUPPORT -} - -__STATIC_INLINE void clock_clk_started_notify(nrf_drv_clock_evt_type_t evt_type) -{ - nrf_drv_clock_handler_item_t **p_head; - if (evt_type == NRF_DRV_CLOCK_EVT_HFCLK_STARTED) - { - p_head = (nrf_drv_clock_handler_item_t **)&m_clock_cb.p_hf_head; - } - else - { - p_head = (nrf_drv_clock_handler_item_t **)&m_clock_cb.p_lf_head; - } - - while (1) - { - nrf_drv_clock_handler_item_t * p_item = item_dequeue(p_head); - if (!p_item) - { - break; - } - - p_item->event_handler(evt_type); - } -} - -#if NRF_DRV_COMMON_POWER_CLOCK_ISR -void nrf_drv_clock_onIRQ(void) -#else -void POWER_CLOCK_IRQHandler(void) -#endif -{ - if (nrf_clock_event_check(NRF_CLOCK_EVENT_HFCLKSTARTED)) - { - nrf_clock_event_clear(NRF_CLOCK_EVENT_HFCLKSTARTED); - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(NRF_CLOCK_EVENT_HFCLKSTARTED)); - nrf_clock_int_disable(NRF_CLOCK_INT_HF_STARTED_MASK); - m_clock_cb.hfclk_on = true; - clock_clk_started_notify(NRF_DRV_CLOCK_EVT_HFCLK_STARTED); - } - if (nrf_clock_event_check(NRF_CLOCK_EVENT_LFCLKSTARTED)) - { - nrf_clock_event_clear(NRF_CLOCK_EVENT_LFCLKSTARTED); - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(NRF_CLOCK_EVENT_LFCLKSTARTED)); - nrf_clock_int_disable(NRF_CLOCK_INT_LF_STARTED_MASK); - m_clock_cb.lfclk_on = true; - clock_clk_started_notify(NRF_DRV_CLOCK_EVT_LFCLK_STARTED); - } -#if CALIBRATION_SUPPORT - if (nrf_clock_event_check(NRF_CLOCK_EVENT_CTTO)) - { - nrf_clock_event_clear(NRF_CLOCK_EVENT_CTTO); - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(NRF_CLOCK_EVENT_CTTO)); - nrf_clock_int_disable(NRF_CLOCK_INT_CTTO_MASK); - nrf_drv_clock_hfclk_request(&m_clock_cb.cal_hfclk_started_handler_item); - } - - if (nrf_clock_event_check(NRF_CLOCK_EVENT_DONE)) - { - nrf_clock_event_clear(NRF_CLOCK_EVENT_DONE); - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(NRF_CLOCK_EVENT_DONE)); - nrf_clock_int_disable(NRF_CLOCK_INT_DONE_MASK); - nrf_drv_clock_hfclk_release(); - bool aborted = (m_clock_cb.cal_state == CAL_STATE_ABORT); - m_clock_cb.cal_state = CAL_STATE_IDLE; - if (m_clock_cb.cal_done_handler) - { - m_clock_cb.cal_done_handler(aborted ? - NRF_DRV_CLOCK_EVT_CAL_ABORTED : NRF_DRV_CLOCK_EVT_CAL_DONE); - } - } -#endif // CALIBRATION_SUPPORT -} - -#ifdef SOFTDEVICE_PRESENT -/** - * @brief SoftDevice SoC event handler. - * - * @param[in] evt_id SoC event. - * @param[in] p_context Context. - */ -static void soc_evt_handler(uint32_t evt_id, void * p_context) -{ - if (evt_id == NRF_EVT_HFCLKSTARTED) - { - clock_clk_started_notify(NRF_DRV_CLOCK_EVT_HFCLK_STARTED); - } -} - -NRF_SDH_SOC_OBSERVER(m_soc_evt_observer, CLOCK_CONFIG_SOC_OBSERVER_PRIO, soc_evt_handler, NULL); - -/** - * @brief SoftDevice enable/disable state handler. - * - * @param[in] state State. - * @param[in] p_context Context. - */ -static void sd_state_evt_handler(nrf_sdh_state_evt_t state, void * p_context) -{ - switch (state) - { - case NRF_SDH_EVT_STATE_ENABLE_PREPARE: - NVIC_DisableIRQ(POWER_CLOCK_IRQn); - break; - - case NRF_SDH_EVT_STATE_ENABLED: - CRITICAL_REGION_ENTER(); - /* Make sure that nrf_drv_clock module is initialized */ - if (!m_clock_cb.module_initialized) - { - (void)nrf_drv_clock_init(); - } - /* SD is one of the LFCLK requesters, but it will enable it by itself. */ - ++(m_clock_cb.lfclk_requests); - m_clock_cb.lfclk_on = true; - CRITICAL_REGION_EXIT(); - break; - - case NRF_SDH_EVT_STATE_DISABLED: - /* Reinit interrupts */ - ASSERT(m_clock_cb.module_initialized); - nrf_drv_common_irq_enable(POWER_CLOCK_IRQn, CLOCK_CONFIG_IRQ_PRIORITY); - - /* SD leaves LFCLK enabled - disable it if it is no longer required. */ - nrf_drv_clock_lfclk_release(); - break; - - default: - break; - } -} - -NRF_SDH_STATE_OBSERVER(m_sd_state_observer, CLOCK_CONFIG_STATE_OBSERVER_PRIO) = -{ - .handler = sd_state_evt_handler, - .p_context = NULL, -}; - -#endif // SOFTDEVICE_PRESENT - -#undef NRF_CLOCK_LFCLK_RC -#undef NRF_CLOCK_LFCLK_Xtal -#undef NRF_CLOCK_LFCLK_Synth - -#endif // NRF_MODULE_ENABLED(CLOCK) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/clock/nrf_drv_clock.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/clock/nrf_drv_clock.h deleted file mode 100644 index be2831bee6..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/clock/nrf_drv_clock.h +++ /dev/null @@ -1,285 +0,0 @@ -/** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#ifndef NRF_DRV_CLOCK_H__ -#define NRF_DRV_CLOCK_H__ - -#include -#include -#include "sdk_errors.h" -#include "nrf_assert.h" -#include "nrf_clock.h" -#include "sdk_config.h" -#include "nrf_drv_common.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * - * @addtogroup nrf_clock Clock HAL and driver - * @ingroup nrf_drivers - * @brief Clock APIs. - * @details The clock HAL provides basic APIs for accessing the registers of the clock. - * The clock driver provides APIs on a higher level. - * - * @defgroup nrf_drv_clock Clock driver - * @{ - * @ingroup nrf_clock - * @brief Driver for managing the low-frequency clock (LFCLK) and the high-frequency clock (HFCLK). - */ - -/** - * @brief Clock events. - */ -typedef enum -{ - NRF_DRV_CLOCK_EVT_HFCLK_STARTED, ///< HFCLK has been started. - NRF_DRV_CLOCK_EVT_LFCLK_STARTED, ///< LFCLK has been started. - NRF_DRV_CLOCK_EVT_CAL_DONE, ///< Calibration is done. - NRF_DRV_CLOCK_EVT_CAL_ABORTED, ///< Calibration has been aborted. -} nrf_drv_clock_evt_type_t; - -/** - * @brief Clock event handler. - * - * @param[in] event Event. - */ -typedef void (*nrf_drv_clock_event_handler_t)(nrf_drv_clock_evt_type_t event); - -// Forward declaration of the nrf_drv_clock_handler_item_t type. -typedef struct nrf_drv_clock_handler_item_s nrf_drv_clock_handler_item_t; - -struct nrf_drv_clock_handler_item_s -{ - nrf_drv_clock_handler_item_t * p_next; ///< A pointer to the next handler that should be called when the clock is started. - nrf_drv_clock_event_handler_t event_handler; ///< Function to be called when the clock is started. -}; - -/** - * @brief Function for checking if driver is already initialized - * - * This function is used to check whatever common POWER_CLOCK common interrupt - * should be disabled or not if @ref nrf_drv_power tries to disable the interrupt. - * - * @retval true Driver is initialized - * @retval false Driver is uninitialized - */ -bool nrf_drv_clock_init_check(void); - -/** - * @brief Function for initializing the nrf_drv_clock module. - * - * After initialization, the module is in power off state (clocks are not requested). - * - * @retval NRF_SUCCESS If the procedure was successful. - * @retval NRF_ERROR_MODULE_ALREADY_INITIALIZED If the driver was already initialized. - */ -ret_code_t nrf_drv_clock_init(void); - -/** - * @brief Function for uninitializing the clock module. - * - */ -void nrf_drv_clock_uninit(void); - -/** - * @brief Function for requesting the LFCLK. - * - * The low-frequency clock can be requested by different modules - * or contexts. The driver ensures that the clock will be started only when it is requested - * the first time. If the clock is not ready but it was already started, the handler item that is - * provided as an input parameter is added to the list of handlers that will be notified - * when the clock is started. If the clock is already enabled, user callback is called from the - * current context. - * - * The first request will start the selected LFCLK source. If an event handler is - * provided, it will be called once the LFCLK is started. If the LFCLK was already started at this - * time, the event handler will be called from the context of this function. Additionally, - * the @ref nrf_drv_clock_lfclk_is_running function can be polled to check if the clock has started. - * - * @note When a SoftDevice is enabled, the LFCLK is always running and the driver cannot control it. - * - * @note The handler item provided by the user cannot be an automatic variable. - * - * @param[in] p_handler_item A pointer to the event handler structure. - */ -void nrf_drv_clock_lfclk_request(nrf_drv_clock_handler_item_t * p_handler_item); - -/** - * @brief Function for releasing the LFCLK. - * - * If there are no more requests, the LFCLK source will be stopped. - * - * @note When a SoftDevice is enabled, the LFCLK is always running. - */ -void nrf_drv_clock_lfclk_release(void); - -/** - * @brief Function for checking the LFCLK state. - * - * @retval true If the LFCLK is running. - * @retval false If the LFCLK is not running. - */ -bool nrf_drv_clock_lfclk_is_running(void); - -/** - * @brief Function for requesting the high-accuracy source HFCLK. - * - * The high-accuracy source - * can be requested by different modules or contexts. The driver ensures that the high-accuracy - * clock will be started only when it is requested the first time. If the clock is not ready - * but it was already started, the handler item that is provided as an input parameter is added - * to the list of handlers that will be notified when the clock is started. - * - * If an event handler is provided, it will be called once the clock is started. If the clock was already - * started at this time, the event handler will be called from the context of this function. Additionally, - * the @ref nrf_drv_clock_hfclk_is_running function can be polled to check if the clock has started. - * - * @note If a SoftDevice is running, the clock is managed by the SoftDevice and all requests are handled by - * the SoftDevice. This function cannot be called from all interrupt priority levels in that case. - * @note The handler item provided by the user cannot be an automatic variable. - * - * @param[in] p_handler_item A pointer to the event handler structure. - */ -void nrf_drv_clock_hfclk_request(nrf_drv_clock_handler_item_t * p_handler_item); - -/** - * @brief Function for releasing the high-accuracy source HFCLK. - * - * If there are no more requests, the high-accuracy source will be released. - */ -void nrf_drv_clock_hfclk_release(void); - -/** - * @brief Function for checking the HFCLK state. - * - * @retval true If the HFCLK is running (for \nRFXX XTAL source). - * @retval false If the HFCLK is not running. - */ -bool nrf_drv_clock_hfclk_is_running(void); - -/** - * @brief Function for starting a single calibration process. - * - * This function can also delay the start of calibration by a user-specified value. The delay will use - * a low-power timer that is part of the CLOCK module. @ref nrf_drv_clock_is_calibrating can be called to - * check if calibration is still in progress. If a handler is provided, the user can be notified when - * calibration is completed. The ext calibration can be started from the handler context. - * - * The calibration process consists of three phases: - * - Delay (optional) - * - Requesting the high-accuracy HFCLK - * - Hardware-supported calibration - * - * @param[in] delay Time after which the calibration will be started (in 0.25 s units). - * @param[in] handler NULL or user function to be called when calibration is completed or aborted. - * - * @retval NRF_SUCCESS If the procedure was successful. - * @retval NRF_ERROR_FORBIDDEN If a SoftDevice is present or the selected LFCLK source is not an RC oscillator. - * @retval NRF_ERROR_INVALID_STATE If the low-frequency clock is off. - * @retval NRF_ERROR_BUSY If calibration is in progress. - */ -ret_code_t nrf_drv_clock_calibration_start(uint8_t delay, nrf_drv_clock_event_handler_t handler); - -/** - * @brief Function for aborting calibration. - * - * This function aborts on-going calibration. If calibration was started, it cannot be stopped. If a handler - * was provided by @ref nrf_drv_clock_calibration_start, this handler will be called once - * aborted calibration is completed. @ref nrf_drv_clock_is_calibrating can also be used to check - * if the system is calibrating. - * - * @retval NRF_SUCCESS If the procedure was successful. - * @retval NRF_ERROR_FORBIDDEN If a SoftDevice is present or the selected LFCLK source is not an RC oscillator. - */ -ret_code_t nrf_drv_clock_calibration_abort(void); - -/** - * @brief Function for checking if calibration is in progress. - * - * This function indicates that the system is - * in calibration if it is in any of the calibration process phases (see @ref nrf_drv_clock_calibration_start). - * - * @param[out] p_is_calibrating True if calibration is in progress, false if not. - * - * @retval NRF_SUCCESS If the procedure was successful. - * @retval NRF_ERROR_FORBIDDEN If a SoftDevice is present or the selected LFCLK source is not an RC oscillator. - */ -ret_code_t nrf_drv_clock_is_calibrating(bool * p_is_calibrating); - -/**@brief Function for returning a requested task address for the clock driver module. - * - * @param[in] task One of the peripheral tasks. - * - * @return Task address. - */ -__STATIC_INLINE uint32_t nrf_drv_clock_ppi_task_addr(nrf_clock_task_t task); - -/**@brief Function for returning a requested event address for the clock driver module. - * - * @param[in] event One of the peripheral events. - * - * @return Event address. - */ -__STATIC_INLINE uint32_t nrf_drv_clock_ppi_event_addr(nrf_clock_event_t event); -/** - *@} - **/ - -#ifndef SUPPRESS_INLINE_IMPLEMENTATION -__STATIC_INLINE uint32_t nrf_drv_clock_ppi_task_addr(nrf_clock_task_t task) -{ - return nrf_clock_task_address_get(task); -} - -__STATIC_INLINE uint32_t nrf_drv_clock_ppi_event_addr(nrf_clock_event_t event) -{ - return nrf_clock_event_address_get(event); -} -#endif //SUPPRESS_INLINE_IMPLEMENTATION - -/*lint --flb "Leave library region" */ - -#ifdef __cplusplus -} -#endif - -#endif // NRF_CLOCK_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/common/nrf_drv_common.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/common/nrf_drv_common.c deleted file mode 100644 index 8d93e97f60..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/common/nrf_drv_common.c +++ /dev/null @@ -1,297 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include -#include "nrf_drv_common.h" -#include "nrf_assert.h" -#include "app_util_platform.h" -#include "nrf_peripherals.h" - -#if NRF_DRV_COMMON_POWER_CLOCK_ISR -#include "nrf_drv_power.h" -#include "nrf_drv_clock.h" -#endif -#ifdef SOFTDEVICE_PRESENT -#include "nrf_soc.h" -#endif - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - -#define NRF_LOG_MODULE_NAME common - -#if COMMON_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL COMMON_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR COMMON_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR COMMON_CONFIG_DEBUG_COLOR -#else //COMMON_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL 0 -#endif //COMMON_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); - - -typedef struct { - nrf_drv_irq_handler_t handler; - bool acquired; -} shared_resource_t; - -// SPIM0, SPIS0, SPI0, TWIM0, TWIS0, TWI0 -#if (NRF_MODULE_ENABLED(SPI0) || NRF_MODULE_ENABLED(SPIS0) || NRF_MODULE_ENABLED(TWI0) || NRF_MODULE_ENABLED(TWIS0)) - #define SERIAL_BOX_0_IN_USE - // [this checking may need a different form in unit tests, hence macro] - #ifndef IS_SERIAL_BOX_0 - #define IS_SERIAL_BOX_0(p_per_base) (p_per_base == NRF_SPI0) - #endif - - static shared_resource_t m_serial_box_0 = { .acquired = false }; - void SPI0_TWI0_IRQHandler(void) - { - ASSERT(m_serial_box_0.handler); - m_serial_box_0.handler(); - } -#endif // (NRF_MODULE_ENABLED(SPI0) || NRF_MODULE_ENABLED(SPIS0) || NRF_MODULE_ENABLED(TWI0) || NRF_MODULE_ENABLED(TWIS0)) - -// SPIM1, SPIS1, SPI1, TWIM1, TWIS1, TWI1 -#if (NRF_MODULE_ENABLED(SPI1) || NRF_MODULE_ENABLED(SPIS1) || NRF_MODULE_ENABLED(TWI1) || NRF_MODULE_ENABLED(TWIS1)) - #define SERIAL_BOX_1_IN_USE - // [this checking may need a different form in unit tests, hence macro] - #ifndef IS_SERIAL_BOX_1 - #define IS_SERIAL_BOX_1(p_per_base) (p_per_base == NRF_SPI1) - #endif - - static shared_resource_t m_serial_box_1 = { .acquired = false }; -#ifdef TWIM_PRESENT - void SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler(void) -#else - void SPI1_TWI1_IRQHandler(void) -#endif - { - ASSERT(m_serial_box_1.handler); - m_serial_box_1.handler(); - } -#endif // (NRF_MODULE_ENABLED(SPI1) || NRF_MODULE_ENABLED(SPIS1) || NRF_MODULE_ENABLED(TWI1) || NRF_MODULE_ENABLED(TWIS1)) - -// SPIM2, SPIS2, SPI2 -#if (NRF_MODULE_ENABLED(SPI2) || NRF_MODULE_ENABLED(SPIS2)) - #define SERIAL_BOX_2_IN_USE - // [this checking may need a different form in unit tests, hence macro] - #ifndef IS_SERIAL_BOX_2 - #define IS_SERIAL_BOX_2(p_per_base) (p_per_base == NRF_SPI2) - #endif - - static shared_resource_t m_serial_box_2 = { .acquired = false }; - void SPIM2_SPIS2_SPI2_IRQHandler(void) - { - ASSERT(m_serial_box_2.handler); - m_serial_box_2.handler(); - } -#endif // (NRF_MODULE_ENABLED(SPI2) || NRF_MODULE_ENABLED(SPIS2)) - -// COMP, LPCOMP -#if (NRF_MODULE_ENABLED(COMP) || NRF_MODULE_ENABLED(LPCOMP)) - #define COMP_LPCOMP_IN_USE - - #ifndef IS_COMP_LPCOMP - #define IS_COMP_LPCOMP(p_per_base) ((p_per_base) == NRF_LPCOMP) - #endif - - static shared_resource_t m_comp_lpcomp = { .acquired = false }; - void LPCOMP_IRQHandler(void) - { - ASSERT(m_comp_lpcomp.handler); - m_comp_lpcomp.handler(); - } -#endif // (NRF_MODULE_ENABLED(COMP) || NRF_MODULE_ENABLED(LPCOMP)) - -#if defined(SERIAL_BOX_0_IN_USE) || \ - defined(SERIAL_BOX_1_IN_USE) || \ - defined(SERIAL_BOX_2_IN_USE) || \ - defined(COMP_LPCOMP_IN_USE) -static ret_code_t acquire_shared_resource(shared_resource_t * p_resource, - nrf_drv_irq_handler_t handler) -{ - ret_code_t err_code; - - bool busy = false; - - CRITICAL_REGION_ENTER(); - if (p_resource->acquired) - { - busy = true; - } - else - { - p_resource->acquired = true; - } - CRITICAL_REGION_EXIT(); - - if (busy) - { - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - p_resource->handler = handler; - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} -#endif - -ret_code_t nrf_drv_common_per_res_acquire(void const * p_per_base, - nrf_drv_irq_handler_t handler) -{ -#ifdef SERIAL_BOX_0_IN_USE - if (IS_SERIAL_BOX_0(p_per_base)) - { - return acquire_shared_resource(&m_serial_box_0, handler); - } -#endif - -#ifdef SERIAL_BOX_1_IN_USE - if (IS_SERIAL_BOX_1(p_per_base)) - { - return acquire_shared_resource(&m_serial_box_1, handler); - } -#endif - -#ifdef SERIAL_BOX_2_IN_USE - if (IS_SERIAL_BOX_2(p_per_base)) - { - return acquire_shared_resource(&m_serial_box_2, handler); - } -#endif - -#ifdef COMP_LPCOMP_IN_USE - if (IS_COMP_LPCOMP(p_per_base)) - { - return acquire_shared_resource(&m_comp_lpcomp, handler); - } -#endif - ret_code_t err_code; - - err_code = NRF_ERROR_INVALID_PARAM; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - -void nrf_drv_common_per_res_release(void const * p_per_base) -{ -#ifdef SERIAL_BOX_0_IN_USE - if (IS_SERIAL_BOX_0(p_per_base)) - { - m_serial_box_0.acquired = false; - } - else -#endif - -#ifdef SERIAL_BOX_1_IN_USE - if (IS_SERIAL_BOX_1(p_per_base)) - { - m_serial_box_1.acquired = false; - } - else -#endif - -#ifdef SERIAL_BOX_2_IN_USE - if (IS_SERIAL_BOX_2(p_per_base)) - { - m_serial_box_2.acquired = false; - } - else -#endif - -#ifdef COMP_LPCOMP_IN_USE - if (IS_COMP_LPCOMP(p_per_base)) - { - m_comp_lpcomp.acquired = false; - } - else -#endif - - {} -} - -#endif // NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - -#if NRF_MODULE_ENABLED(POWER) -void nrf_drv_common_power_irq_disable(void) -{ -#if NRF_DRV_COMMON_POWER_CLOCK_ISR - if (!nrf_drv_clock_init_check()) -#endif - { - nrf_drv_common_irq_disable(POWER_CLOCK_IRQn); - } -} -#endif - -#if NRF_MODULE_ENABLED(CLOCK) -void nrf_drv_common_clock_irq_disable(void) -{ -#if NRF_DRV_COMMON_POWER_CLOCK_ISR - if (!nrf_drv_power_init_check()) -#endif - { - nrf_drv_common_irq_disable(POWER_CLOCK_IRQn); - } -} -#endif - -#if NRF_DRV_COMMON_POWER_CLOCK_ISR -void POWER_CLOCK_IRQHandler(void) -{ - extern void nrf_drv_clock_onIRQ(void); - extern void nrf_drv_power_onIRQ(void); - - nrf_drv_clock_onIRQ(); - nrf_drv_power_onIRQ(); -} -#endif // NRF_DRV_COMMON_POWER_CLOCK_ISR - - -void nrf_drv_common_irq_enable(IRQn_Type IRQn, uint8_t priority) -{ - INTERRUPT_PRIORITY_ASSERT(priority); - - NVIC_SetPriority(IRQn, priority); - NVIC_ClearPendingIRQ(IRQn); - NVIC_EnableIRQ(IRQn); -} diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/common/nrf_drv_common.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/common/nrf_drv_common.h deleted file mode 100644 index cdf866a5cc..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/common/nrf_drv_common.h +++ /dev/null @@ -1,358 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#ifndef NRF_DRV_COMMON_H__ -#define NRF_DRV_COMMON_H__ - -#include -#include -#include "nrf.h" -#include "sdk_errors.h" -#include "sdk_common.h" -#include "nrf_assert.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef NRF51 -#ifdef SOFTDEVICE_PRESENT -#define INTERRUPT_PRIORITY_IS_VALID(pri) (((pri) == 1) || ((pri) == 3)) -#else -#define INTERRUPT_PRIORITY_IS_VALID(pri) ((pri) < 4) -#endif //SOFTDEVICE_PRESENT -#else -#ifdef SOFTDEVICE_PRESENT -#define INTERRUPT_PRIORITY_IS_VALID(pri) ((((pri) > 1) && ((pri) < 4)) || \ - (((pri) > 4) && ((pri) < 8))) -#else -#define INTERRUPT_PRIORITY_IS_VALID(pri) ((pri) < 8) -#endif //SOFTDEVICE_PRESENT -#endif //NRF52 - -#define INTERRUPT_PRIORITY_VALIDATION(pri) STATIC_ASSERT(INTERRUPT_PRIORITY_IS_VALID((pri))) -#define INTERRUPT_PRIORITY_ASSERT(pri) ASSERT(INTERRUPT_PRIORITY_IS_VALID((pri))) - -/** - * @defgroup nrf_drv_common Peripheral drivers common module - * @{ - * @ingroup nrf_drivers - */ - -/** - * @brief Offset of event registers in every peripheral instance. - * - * This is the offset where event registers start in every peripheral. - */ -#define NRF_DRV_COMMON_EVREGS_OFFSET 0x100U - -/** - * @brief The flag that is set when POWER_CLOCK ISR is implemented in common module - * - * This flag means that the function POWER_CLOCK_IRQHandler is implemented in - * nrf_drv_common.c file. In the @c clock and @c power modules functions - * nrf_drv_clock_onIRQ nrf_drv_power_onIRQ should be implemented - * and they would be called from common implementation. - * - * None of the checking is done here. - * The implementation functions in @c clock and @c power are required to handle - * correctly the case when they are called without any event bit set. - */ -#define NRF_DRV_COMMON_POWER_CLOCK_ISR (NRF_MODULE_ENABLED(CLOCK) && NRF_MODULE_ENABLED(POWER)) - -/** - * @brief Driver state. - */ -typedef enum -{ - NRF_DRV_STATE_UNINITIALIZED, /**< Uninitialized. */ - NRF_DRV_STATE_INITIALIZED, /**< Initialized but powered off. */ - NRF_DRV_STATE_POWERED_ON -} nrf_drv_state_t; - -/** - * @brief Driver power state selection. - */ -typedef enum -{ - NRF_DRV_PWR_CTRL_ON, /**< Power on request. */ - NRF_DRV_PWR_CTRL_OFF /**< Power off request. */ -} nrf_drv_pwr_ctrl_t; - -/** - * @brief IRQ handler type. - */ -typedef void (*nrf_drv_irq_handler_t)(void); - - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - -/** - * @brief Function for acquiring shared peripheral resources associated with - * the specified peripheral. - * - * Certain resources and registers are shared among peripherals that have - * the same ID (for example: SPI0, SPIM0, SPIS0, TWI0, TWIM0, and TWIS0). - * Only one of them can be utilized at a given time. This function reserves - * proper resources to be used by the specified peripheral. - * If PERIPHERAL_RESOURCE_SHARING_ENABLED is set to a non-zero value, IRQ - * handlers for peripherals that are sharing resources with others are - * implemented by the nrf_drv_common module instead of individual drivers. - * The drivers must then specify their interrupt handling routines and - * register them by using this function. - * - * @param[in] p_per_base Requested peripheral base pointer. - * @param[in] handler Interrupt handler to register. May be NULL - * if interrupts are not used for the peripheral. - * - * @retval NRF_SUCCESS If resources were acquired successfully. - * @retval NRF_ERROR_BUSY If resources were already acquired. - * @retval NRF_ERROR_INVALID_PARAM If the specified peripheral is not enabled - * or the peripheral does not share resources - * with other peripherals. - */ -ret_code_t nrf_drv_common_per_res_acquire(void const * p_per_base, - nrf_drv_irq_handler_t handler); - -/** - * @brief Function for releasing shared resources reserved previously by - * @ref nrf_drv_common_per_res_acquire() for the specified peripheral. - * - * @param[in] p_per_base Requested peripheral base pointer. - */ -void nrf_drv_common_per_res_release(void const * p_per_base); - -#endif // NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - - -/** - * @brief Function sets priority and enables NVIC interrupt - * - * @note Function checks if correct priority is used when softdevice is present - * - * @param[in] IRQn Interrupt id - * @param[in] priority Interrupt priority - */ -void nrf_drv_common_irq_enable(IRQn_Type IRQn, uint8_t priority); - -#if NRF_MODULE_ENABLED(POWER) -/** - * @brief Disable power IRQ - * - * Power and clock peripheral uses the same IRQ. - * This function disables POWER_CLOCK IRQ only if CLOCK driver - * is uninitialized. - * - * @sa nrf_drv_common_power_clock_irq_init - */ -void nrf_drv_common_power_irq_disable(void); -#endif - -#if NRF_MODULE_ENABLED(CLOCK) -/** - * @brief Disable clock IRQ - * - * Power and clock peripheral uses the same IRQ. - * This function disables POWER_CLOCK IRQ only if POWER driver - * is uninitialized. - * - * @sa nrf_drv_common_power_clock_irq_init - */ -void nrf_drv_common_clock_irq_disable(void); -#endif - -/** - * @brief Check if interrupt is enabled - * - * Function that checks if selected interrupt is enabled. - * - * @param[in] IRQn Interrupt id - * - * @retval true Selected IRQ is enabled. - * @retval false Selected IRQ is disabled. - */ -__STATIC_INLINE bool nrf_drv_common_irq_enable_check(IRQn_Type IRQn); - -/** - * @brief Function disables NVIC interrupt - * - * @param[in] IRQn Interrupt id - */ -__STATIC_INLINE void nrf_drv_common_irq_disable(IRQn_Type IRQn); - -/** - * @brief Convert bit position to event code - * - * Function for converting the bit position in INTEN register to event code - * that is equivalent to the offset of the event register from the beginning - * of peripheral instance. - * - * For example the result of this function can be casted directly to - * the types like @ref nrf_twis_event_t or @ref nrf_rng_event_t - * - * @param bit Bit position in INTEN register - * @return Event code to be casted to the right enum type or to be used in functions like - * @ref nrf_rng_event_get - * - * @sa nrf_drv_event_to_bitpos - */ -__STATIC_INLINE uint32_t nrf_drv_bitpos_to_event(uint32_t bit); - -/** - * @brief Convert event code to bit position - * - * This function can be used to get bit position in INTEN register from event code. - * - * @param event Event code that may be casted from enum values from types like - * @ref nrf_twis_event_t or @ref nrf_rng_event_t - * @return Bit position in INTEN register that corresponds to the given code. - * - * @sa nrf_drv_bitpos_to_event - */ -__STATIC_INLINE uint32_t nrf_drv_event_to_bitpos(uint32_t event); - -/** - * @brief Get interrupt number connected with given instance - * - * Function returns interrupt number for a given instance of any peripheral. - * @param[in] pinst Pointer to peripheral registry - * @return Interrupt number - */ -__STATIC_INLINE IRQn_Type nrf_drv_get_IRQn(void const * const pinst); - -#if NRF_MODULE_ENABLED(CLOCK) || NRF_MODULE_ENABLED(POWER) -/** - * @brief Enable and setup power clock IRQ - * - * This function would be called from @ref nrf_drv_clock and @ref nrf_drv_power - * to enable related interrupt. - * This function avoids multiple interrupt configuration. - * - * @note - * This function is aviable only if @ref nrf_drv_clock or @ref nrf_drv_power - * module is enabled. - * - * @note - * If both @ref nrf_drv_clock and @ref nrf_drv_power modules are enabled, - * during the compilation the check is made that - * @ref CLOCK_CONFIG_IRQ_PRIORITY equals @ref POWER_CONFIG_IRQ_PRIORITY. - * - * @sa nrf_drv_common_power_irq_disable - * @sa nrf_drv_common_clock_irq_disable - */ -__STATIC_INLINE void nrf_drv_common_power_clock_irq_init(void); -#endif - -/** - * @brief Check if given object is in RAM - * - * Function for analyzing if given location is placed in RAM. - * This function is used to determine if we have address that can be supported by EasyDMA. - * @param[in] ptr Pointer to the object - * @retval true Object is located in RAM - * @retval false Object is not located in RAM - */ -__STATIC_INLINE bool nrf_drv_is_in_RAM(void const * const ptr); - -#ifndef SUPPRESS_INLINE_IMPLEMENTATION - -__STATIC_INLINE bool nrf_drv_common_irq_enable_check(IRQn_Type IRQn) -{ - return 0 != (NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & - (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))); -} - -__STATIC_INLINE void nrf_drv_common_irq_disable(IRQn_Type IRQn) -{ - NVIC_DisableIRQ(IRQn); -} - -__STATIC_INLINE uint32_t nrf_drv_bitpos_to_event(uint32_t bit) -{ - return NRF_DRV_COMMON_EVREGS_OFFSET + bit * sizeof(uint32_t); -} - -__STATIC_INLINE uint32_t nrf_drv_event_to_bitpos(uint32_t event) -{ - return (event - NRF_DRV_COMMON_EVREGS_OFFSET) / sizeof(uint32_t); -} - -__STATIC_INLINE IRQn_Type nrf_drv_get_IRQn(void const * const pinst) -{ - uint8_t ret = (uint8_t)((uint32_t)pinst>>12U); - return (IRQn_Type) ret; -} - -#if NRF_MODULE_ENABLED(CLOCK) || NRF_MODULE_ENABLED(POWER) -__STATIC_INLINE void nrf_drv_common_power_clock_irq_init(void) -{ - if (!nrf_drv_common_irq_enable_check(POWER_CLOCK_IRQn)) - { - nrf_drv_common_irq_enable( - POWER_CLOCK_IRQn, -#if NRF_DRV_COMMON_POWER_CLOCK_ISR - #if CLOCK_CONFIG_IRQ_PRIORITY != POWER_CONFIG_IRQ_PRIORITY - #error CLOCK_CONFIG_IRQ_PRIORITY and POWER_CONFIG_IRQ_PRIORITY have to be the same. - #endif - CLOCK_CONFIG_IRQ_PRIORITY -#elif NRF_MODULE_ENABLED(CLOCK) - CLOCK_CONFIG_IRQ_PRIORITY -#elif NRF_MODULE_ENABLED(POWER) - POWER_CONFIG_IRQ_PRIORITY -#endif - ); - } -} -#endif - -__STATIC_INLINE bool nrf_drv_is_in_RAM(void const * const ptr) -{ - return ((((uintptr_t)ptr) & 0xE0000000u) == 0x20000000u); -} - -#endif // SUPPRESS_INLINE_IMPLEMENTATION - - -#ifdef __cplusplus -} -#endif - -#endif // NRF_DRV_COMMON_H__ - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/comp/nrf_drv_comp.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/comp/nrf_drv_comp.c deleted file mode 100644 index 90d56e0730..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/comp/nrf_drv_comp.c +++ /dev/null @@ -1,239 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(COMP) -#include "nrf_drv_comp.h" - -#include "nrf_assert.h" -#include "nrf_error.h" -#include "nrf_soc.h" -#include "nrf_drv_common.h" -#include "app_util_platform.h" -#include -#include -#include - -#define NRF_LOG_MODULE_NAME comp - -#if COMP_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL COMP_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR COMP_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR COMP_CONFIG_DEBUG_COLOR -#define EVT_TO_STR(event) (event == NRF_COMP_EVENT_READY ? "NRF_COMP_EVENT_READY" : \ - (event == NRF_COMP_EVENT_DOWN ? "NRF_COMP_EVENT_DOWN" : \ - (event == NRF_COMP_EVENT_UP ? "NRF_COMP_EVENT_UP" : \ - (event == NRF_COMP_EVENT_CROSS ? "NRF_COMP_EVENT_CROSS" : "UNKNOWN ERROR")))) -#else //COMP_CONFIG_LOG_ENABLED -#define EVT_TO_STR(event) "" -#define NRF_LOG_LEVEL 0 -#endif //COMP_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); - - - -static comp_events_handler_t m_comp_events_handler = NULL; -static nrf_drv_state_t m_state = NRF_DRV_STATE_UNINITIALIZED; - -static const nrf_drv_comp_config_t m_default_config = NRF_DRV_COMP_DEFAULT_CONFIG(NRF_COMP_INPUT_0); - -static void comp_execute_handler(nrf_comp_event_t event, uint32_t event_mask) -{ - if ( nrf_comp_event_check(event) && nrf_comp_int_enable_check(event_mask) ) - { - nrf_comp_event_clear(event); - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(event)); - - m_comp_events_handler(event); - } -} - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - #define IRQ_HANDLER_NAME irq_handler_for_comp - #define IRQ_HANDLER static void IRQ_HANDLER_NAME(void) - - IRQ_HANDLER; -#else - #define IRQ_HANDLER void COMP_LPCOMP_IRQHandler(void) -#endif // NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - -IRQ_HANDLER -{ - comp_execute_handler(NRF_COMP_EVENT_READY, COMP_INTENSET_READY_Msk); - comp_execute_handler(NRF_COMP_EVENT_DOWN, COMP_INTENSET_DOWN_Msk); - comp_execute_handler(NRF_COMP_EVENT_UP, COMP_INTENSET_UP_Msk); - comp_execute_handler(NRF_COMP_EVENT_CROSS, COMP_INTENSET_CROSS_Msk); -} - - -ret_code_t nrf_drv_comp_init(const nrf_drv_comp_config_t * p_config, - comp_events_handler_t event_handler) -{ - ret_code_t err_code; - - if (m_state != NRF_DRV_STATE_UNINITIALIZED) - { // COMP driver is already initialized - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - if (p_config == NULL) - { - p_config = &m_default_config; - } - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - if (nrf_drv_common_per_res_acquire(NRF_COMP, IRQ_HANDLER_NAME) != NRF_SUCCESS) - { - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } -#endif - - nrf_comp_task_trigger(NRF_COMP_TASK_STOP); - nrf_comp_enable(); - - // Clear events to be sure there are no leftovers. - nrf_comp_event_clear(NRF_COMP_EVENT_READY); - nrf_comp_event_clear(NRF_COMP_EVENT_DOWN); - nrf_comp_event_clear(NRF_COMP_EVENT_UP); - nrf_comp_event_clear(NRF_COMP_EVENT_CROSS); - - nrf_comp_ref_set(p_config->reference); - - //If external source is chosen, write to appropriate register. - if (p_config->reference == COMP_REFSEL_REFSEL_ARef) - { - nrf_comp_ext_ref_set(p_config->ext_ref); - } - - nrf_comp_th_set(p_config->threshold); - nrf_comp_main_mode_set(p_config->main_mode); - nrf_comp_speed_mode_set(p_config->speed_mode); - nrf_comp_hysteresis_set(p_config->hyst); -#if defined (COMP_ISOURCE_ISOURCE_Msk) - nrf_comp_isource_set(p_config->isource); -#endif - nrf_comp_shorts_disable(NRF_DRV_COMP_SHORT_STOP_AFTER_CROSS_EVT | NRF_DRV_COMP_SHORT_STOP_AFTER_UP_EVT | - NRF_DRV_COMP_SHORT_STOP_AFTER_DOWN_EVT); - nrf_comp_int_disable(COMP_INTENCLR_CROSS_Msk | COMP_INTENCLR_UP_Msk | - COMP_INTENCLR_DOWN_Msk | COMP_INTENCLR_READY_Msk); - - if (event_handler) - { - m_comp_events_handler = event_handler; - } - else - { - err_code = NRF_ERROR_INVALID_PARAM; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - nrf_comp_input_select(p_config->input); - - nrf_drv_common_irq_enable(COMP_LPCOMP_IRQn, p_config->interrupt_priority); - - m_state = NRF_DRV_STATE_INITIALIZED; - - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -void nrf_drv_comp_uninit(void) -{ - ASSERT(m_state != NRF_DRV_STATE_UNINITIALIZED); - nrf_drv_common_irq_disable(COMP_LPCOMP_IRQn); - nrf_comp_disable(); -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - nrf_drv_common_per_res_release(NRF_COMP); -#endif - m_state = NRF_DRV_STATE_UNINITIALIZED; - m_comp_events_handler = NULL; - NRF_LOG_INFO("Uninitialized."); -} - -void nrf_drv_comp_pin_select(nrf_comp_input_t psel) -{ - bool comp_enable_state = nrf_comp_enable_check(); - nrf_comp_task_trigger(NRF_COMP_TASK_STOP); - if (m_state == NRF_DRV_STATE_POWERED_ON) - { - m_state = NRF_DRV_STATE_INITIALIZED; - } - nrf_comp_disable(); - nrf_comp_input_select(psel); - if (comp_enable_state == true) - { - nrf_comp_enable(); - } -} - -void nrf_drv_comp_start(uint32_t comp_int_mask, uint32_t comp_shorts_mask) -{ - ASSERT(m_state == NRF_DRV_STATE_INITIALIZED); - nrf_comp_int_enable(comp_int_mask); - nrf_comp_shorts_enable(comp_shorts_mask); - nrf_comp_task_trigger(NRF_COMP_TASK_START); - m_state = NRF_DRV_STATE_POWERED_ON; - NRF_LOG_INFO("Enabled."); -} - -void nrf_drv_comp_stop(void) -{ - ASSERT(m_state == NRF_DRV_STATE_POWERED_ON); - nrf_comp_shorts_disable(UINT32_MAX); - nrf_comp_int_disable(UINT32_MAX); - nrf_comp_task_trigger(NRF_COMP_TASK_STOP); - m_state = NRF_DRV_STATE_INITIALIZED; - NRF_LOG_INFO("Disabled."); -} - -uint32_t nrf_drv_comp_sample() -{ - ASSERT(m_state == NRF_DRV_STATE_POWERED_ON); - nrf_comp_task_trigger(NRF_COMP_TASK_SAMPLE); - return nrf_comp_result_get(); -} -#endif //NRF_MODULE_ENABLED(COMP) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/comp/nrf_drv_comp.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/comp/nrf_drv_comp.h deleted file mode 100644 index 3c03c1d8d2..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/comp/nrf_drv_comp.h +++ /dev/null @@ -1,258 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#ifndef NRF_DRV_COMP_H__ -#define NRF_DRV_COMP_H__ - -#include "sdk_config.h" -#include "nrf_comp.h" -#include "sdk_errors.h" -#include "nrf_drv_common.h" -#include "app_util_platform.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @addtogroup nrf_comp COMP HAL and driver - * @ingroup nrf_drivers - * @brief @tagAPI52 Comparator (COMP) APIs. - * @details The COMP HAL provides basic APIs for accessing the registers of Comparator. - * The COMP driver provides APIs on a higher level. - * - * @defgroup nrf_drv_comp COMP driver - * @{ - * @ingroup nrf_comp - * @brief @tagAPI52 Comparator (COMP) driver. - */ - -/** - * @brief Macro to convert the threshold voltage to an integer value (needed by the COMP_TH register). - * - * @param[in] vol Voltage to be changed to COMP_TH register value. This value must not be smaller than - * reference voltage divided by 64. - * @param[in] ref Reference voltage. - */ -#define VOLTAGE_THRESHOLD_TO_INT(vol, ref) (uint8_t)(((vol) > ((ref) / 64)) ? (ROUNDED_DIV((vol) * 64,(ref)) - 1) : 0) - -/**@brief COMP event handler function type. - * @param[in] event COMP event. - */ -typedef void (* comp_events_handler_t)(nrf_comp_event_t event); - -/** - * @enum nrf_drv_comp_short_mask_t - * @brief COMP shortcut masks. - */ -typedef enum -{ - NRF_DRV_COMP_SHORT_STOP_AFTER_CROSS_EVT = COMP_SHORTS_CROSS_STOP_Msk, /*!< Shortcut between the CROSS event and the STOP task. */ - NRF_DRV_COMP_SHORT_STOP_AFTER_UP_EVT = COMP_SHORTS_UP_STOP_Msk, /*!< Shortcut between the UP event and the STOP task. */ - NRF_DRV_COMP_SHORT_STOP_AFTER_DOWN_EVT = COMP_SHORTS_DOWN_STOP_Msk /*!< Shortcut between the DOWN event and the STOP task. */ -}nrf_drv_comp_short_mask_t; - -/** - * @enum nrf_drv_comp_evt_en_mask_t - * @brief COMP events masks. - */ -typedef enum -{ - NRF_DRV_COMP_EVT_EN_CROSS_MASK = COMP_INTENSET_CROSS_Msk, /*!< CROSS event (generated after VIN+ == VIN-). */ - NRF_DRV_COMP_EVT_EN_UP_MASK = COMP_INTENSET_UP_Msk, /*!< UP event (generated when VIN+ crosses VIN- while increasing). */ - NRF_DRV_COMP_EVT_EN_DOWN_MASK = COMP_INTENSET_DOWN_Msk, /*!< DOWN event (generated when VIN+ crosses VIN- while decreasing). */ - NRF_DRV_COMP_EVT_EN_READY_MASK = COMP_INTENSET_READY_Msk /*!< READY event (generated when the module is ready). */ -}nrf_drv_comp_evt_en_mask_t; - -/**@brief COMP configuration. - */ -typedef struct -{ - nrf_comp_ref_t reference; /**< Reference selection. */ - nrf_comp_ext_ref_t ext_ref; /**< External analog reference selection. */ - nrf_comp_main_mode_t main_mode; /**< Main operation mode. */ - nrf_comp_th_t threshold; /**< Structure holding THDOWN and THUP values needed by the COMP_TH register. */ - nrf_comp_sp_mode_t speed_mode; /**< Speed and power mode. */ - nrf_comp_hyst_t hyst; /**< Comparator hysteresis.*/ -#if defined (COMP_ISOURCE_ISOURCE_Msk) || defined (__SDK_DOXYGEN__) - nrf_isource_t isource; /**< Current source selected on analog input. */ -#endif - nrf_comp_input_t input; /**< Input to be monitored. */ - uint8_t interrupt_priority; /**< Interrupt priority. */ -} nrf_drv_comp_config_t; - -/** @brief COMP threshold default configuration. */ -#define COMP_CONFIG_TH \ -{ \ - .th_down = VOLTAGE_THRESHOLD_TO_INT(0.5, 1.8), \ - .th_up = VOLTAGE_THRESHOLD_TO_INT(1.5, 1.8) \ -} - -/** @brief COMP driver default configuration including the COMP HAL configuration. */ -#if defined (COMP_ISOURCE_ISOURCE_Msk) -#define NRF_DRV_COMP_DEFAULT_CONFIG(INPUT) \ -{ \ - .reference = (nrf_comp_ref_t)COMP_CONFIG_REF, \ - .main_mode = (nrf_comp_main_mode_t)COMP_CONFIG_MAIN_MODE, \ - .threshold = COMP_CONFIG_TH, \ - .speed_mode = (nrf_comp_sp_mode_t)COMP_CONFIG_SPEED_MODE, \ - .hyst = (nrf_comp_hyst_t)COMP_CONFIG_HYST, \ - .isource = (nrf_isource_t)COMP_CONFIG_ISOURCE, \ - .input = (nrf_comp_input_t)INPUT, \ - .interrupt_priority = COMP_CONFIG_IRQ_PRIORITY \ -} -#else -#define NRF_DRV_COMP_DEFAULT_CONFIG(INPUT) \ -{ \ - .reference = (nrf_comp_ref_t)COMP_CONFIG_REF, \ - .main_mode = (nrf_comp_main_mode_t)COMP_CONFIG_MAIN_MODE, \ - .threshold = COMP_CONFIG_TH, \ - .speed_mode = (nrf_comp_sp_mode_t)COMP_CONFIG_SPEED_MODE, \ - .hyst = (nrf_comp_hyst_t)COMP_CONFIG_HYST, \ - .input = (nrf_comp_input_t)INPUT, \ - .interrupt_priority = COMP_CONFIG_IRQ_PRIORITY \ -} -#endif - -/** - * @brief Function for initializing the COMP driver. - * - * This function initializes the COMP driver, but does not enable the peripheral or any interrupts. - * To start the driver, call the function @ref nrf_drv_comp_start() after initialization. - * - * If no configuration structure is provided, the driver is initialized with the default settings. - * - * @param[in] p_config Initial configuration. If NULL, the default configuration is used. - * @param[in] event_handler Handler function. - * - * @retval NRF_ERROR_INVALID_PARAM If the configuration is invalid. - * @retval NRF_ERROR_INVALID_STATE If the driver has already been initialized. - * @retval NRF_ERROR_BUSY If the LPCOMP driver is initialized. - */ -ret_code_t nrf_drv_comp_init(const nrf_drv_comp_config_t * p_config, - comp_events_handler_t event_handler); - - -/** - * @brief Function for uninitializing the COMP driver. - * - * This function uninitializes the COMP driver. The COMP peripheral and - * its interrupts are disabled, and local variables are cleaned. After this call, you must - * initialize the driver again by calling nrf_drv_comp_init() if you want to use it. - * - * @sa nrf_drv_comp_stop() - */ -void nrf_drv_comp_uninit(void); - -/** - * @brief Function for setting the analog input. - * - * @param[in] psel COMP analog pin selection. - */ -void nrf_drv_comp_pin_select(nrf_comp_input_t psel); - -/** - * @brief Function for starting the COMP peripheral and interrupts. - * - * Before calling this function, the driver must be initialized. This function - * enables the COMP peripheral and its interrupts. - * - * @param[in] comp_evt_en_mask Mask of events to be enabled. This parameter should be built as - * 'or' of elements from @ref nrf_drv_comp_evt_en_mask_t. - * @param[in] comp_shorts_mask Mask of shorts to be enabled. This parameter should be built as - * 'or' of elements from @ref nrf_drv_comp_short_mask_t. - * - * @sa nrf_drv_comp_init() - * - */ -void nrf_drv_comp_start(uint32_t comp_evt_en_mask, uint32_t comp_shorts_mask); - -/**@brief Function for stopping the COMP peripheral. - * - * Before calling this function, the driver must be enabled. This function disables the COMP - * peripheral and its interrupts. - * - * @sa nrf_drv_comp_uninit() - * - */ -void nrf_drv_comp_stop(void); - -/** - * @brief Function for copying the current state of the comparator result to the RESULT register. - * - * @retval 0 If the input voltage is below the threshold (VIN+ < VIN-). - * @retval 1 If the input voltage is above the threshold (VIN+ > VIN-). - */ -uint32_t nrf_drv_comp_sample(void); - -/** - * @brief Function for getting the task address. - * - * Before calling this function, the driver must be enabled. - * - * @param[in] comp_task COMP task. - * - * @return Address of the given COMP task. - */ -__STATIC_INLINE uint32_t nrf_drv_comp_task_address_get(nrf_comp_task_t comp_task) -{ - return (uint32_t)nrf_comp_task_address_get(comp_task); -} - -/** - * @brief Function for getting the event address. - * - * @param[in] comp_event COMP event. - * - * @return Address of the given COMP event. - */ -__STATIC_INLINE uint32_t nrf_drv_comp_event_address_get(nrf_comp_event_t comp_event) -{ - return (uint32_t)nrf_comp_event_address_get(comp_event); -} - -/** - *@} - **/ - - -#ifdef __cplusplus -} -#endif -#endif /* NRF_DRV_COMP_H__ */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/delay/nrf_delay.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/delay/nrf_delay.h deleted file mode 100644 index 0a62f7db25..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/delay/nrf_delay.h +++ /dev/null @@ -1,269 +0,0 @@ -/** - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifndef _NRF_DELAY_H -#define _NRF_DELAY_H - -#include "nrf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define CLOCK_FREQ_16MHz (16000000UL) - -#ifdef NRF52_SERIES - #define CPU_FREQ_64MHz -#endif - -/** - * @brief Function for delaying execution for number of microseconds. - * - * @note NRF52 has instruction cache and because of that delay is not precise. - * - * @param number_of_us - * - */ -/*lint -e{438, 522, 40, 10, 563} */ -__STATIC_INLINE void nrf_delay_us(uint32_t number_of_us); - - -/** - * @brief Function for delaying execution for number of miliseconds. - * - * @note NRF52 has instruction cache and because of that delay is not precise. - * - * @note Function internally calls @ref nrf_delay_us so the maximum delay is the - * same as in case of @ref nrf_delay_us, approx. 71 minutes. - * - * @param number_of_ms - * - */ - -/*lint -e{438, 522, 40, 10, 563} */ -__STATIC_INLINE void nrf_delay_ms(uint32_t number_of_ms); - -#if defined ( __CC_ARM ) -__STATIC_INLINE void nrf_delay_us(uint32_t number_of_us) -{ - if (!number_of_us) - return; -__asm - { -loop: - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - CMP SystemCoreClock, CLOCK_FREQ_16MHz - BEQ cond - NOP -#ifdef CPU_FREQ_64MHz - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP -#endif //CPU_FREQ_64MHz -cond: - SUBS number_of_us, #1 - BNE loop - } -} - -#elif defined ( _WIN32 ) || defined ( __unix ) || defined( __APPLE__ ) - - -#ifndef CUSTOM_NRF_DELAY_US -__STATIC_INLINE void nrf_delay_us(uint32_t number_of_us) -{} -#endif - -#elif defined ( __GNUC__ ) || ( __ICCARM__ ) - -__STATIC_INLINE void nrf_delay_us(uint32_t number_of_us) -{ - const uint32_t clock16MHz = CLOCK_FREQ_16MHz; - if (number_of_us) - { -__ASM volatile ( -#if ( defined(__GNUC__) && (__CORTEX_M == (0x00U) ) ) - ".syntax unified\n" -#endif -"1:\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " CMP %[SystemCoreClock], %[clock16MHz]\n" - " BEQ.N 2f\n" - " NOP\n" -#ifdef CPU_FREQ_64MHz - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" - " NOP\n" -#endif //CPU_FREQ_64MHz -"2:\n" - " SUBS %[number_of_us], %[number_of_us], #1\n" - " BNE.N 1b\n" -#if ( defined(__GNUC__) && (__CORTEX_M == (0x00U) ) ) - ".syntax divided\n" -#endif -#if ( __CORTEX_M == (0x00U) ) - // The SUBS instruction in Cortex-M0 is available only in 16-bit encoding, - // hence it requires a "lo" register (r0-r7) as an operand. - : [number_of_us] "=l" (number_of_us) -#else - : [number_of_us] "=r" (number_of_us) -#endif - : [SystemCoreClock] "r" (SystemCoreClock), - [clock16MHz] "r" (clock16MHz), - "[number_of_us]" (number_of_us) - : "cc" - ); - } -} -#endif - -__STATIC_INLINE void nrf_delay_ms(uint32_t number_of_ms) -{ - nrf_delay_us(1000*number_of_ms); -} - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/gpiote/nrf_drv_gpiote.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/gpiote/nrf_drv_gpiote.h deleted file mode 100644 index 6c5f627b8c..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/gpiote/nrf_drv_gpiote.h +++ /dev/null @@ -1,385 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#ifndef NRF_DRV_GPIOTE__ -#define NRF_DRV_GPIOTE__ - -/** - * @addtogroup nrf_gpiote GPIOTE abstraction and driver - * @ingroup nrf_drivers - * @brief GPIOTE APIs. - * @defgroup nrf_drv_gpiote GPIOTE driver - * @{ - * @ingroup nrf_gpiote - * @brief GPIOTE driver for managing input and output pins. - */ - -#include "nrf_gpiote.h" -#include "nrf_gpio.h" -#include "sdk_errors.h" -#include -#include -#include "sdk_config.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@brief Input pin configuration. */ -typedef struct -{ - nrf_gpiote_polarity_t sense; /**< Transition that triggers interrupt. */ - nrf_gpio_pin_pull_t pull; /**< Pulling mode. */ - bool is_watcher; /**< True when the input pin is tracking an output pin. */ - bool hi_accuracy;/**< True when high accuracy (IN_EVENT) is used. */ -} nrf_drv_gpiote_in_config_t; - -/**@brief Macro for configuring a pin to use a GPIO IN or PORT EVENT to detect low-to-high transition. - * @details Set hi_accu to true to use IN_EVENT. */ -#define GPIOTE_CONFIG_IN_SENSE_LOTOHI(hi_accu) \ - { \ - .is_watcher = false, \ - .hi_accuracy = hi_accu, \ - .pull = NRF_GPIO_PIN_NOPULL, \ - .sense = NRF_GPIOTE_POLARITY_LOTOHI, \ - } - -/**@brief Macro for configuring a pin to use a GPIO IN or PORT EVENT to detect high-to-low transition. - * @details Set hi_accu to true to use IN_EVENT. */ -#define GPIOTE_CONFIG_IN_SENSE_HITOLO(hi_accu) \ - { \ - .is_watcher = false, \ - .hi_accuracy = hi_accu, \ - .pull = NRF_GPIO_PIN_NOPULL, \ - .sense = NRF_GPIOTE_POLARITY_HITOLO, \ - } - -/**@brief Macro for configuring a pin to use a GPIO IN or PORT EVENT to detect any change on the pin. - * @details Set hi_accu to true to use IN_EVENT.*/ -#define GPIOTE_CONFIG_IN_SENSE_TOGGLE(hi_accu) \ - { \ - .is_watcher = false, \ - .hi_accuracy = hi_accu, \ - .pull = NRF_GPIO_PIN_NOPULL, \ - .sense = NRF_GPIOTE_POLARITY_TOGGLE, \ - } - -/**@brief Output pin configuration. */ -typedef struct -{ - nrf_gpiote_polarity_t action; /**< Configuration of the pin task. */ - nrf_gpiote_outinit_t init_state; /**< Initial state of the output pin. */ - bool task_pin; /**< True if the pin is controlled by a GPIOTE task. */ -} nrf_drv_gpiote_out_config_t; - -/**@brief Macro for configuring a pin to use as output. GPIOTE is not used for the pin. */ -#define GPIOTE_CONFIG_OUT_SIMPLE(init_high) \ - { \ - .init_state = init_high ? NRF_GPIOTE_INITIAL_VALUE_HIGH : NRF_GPIOTE_INITIAL_VALUE_LOW, \ - .task_pin = false, \ - } - -/**@brief Macro for configuring a pin to use the GPIO OUT TASK to change the state from high to low. - * @details The task will clear the pin. Therefore, the pin is set initially. */ -#define GPIOTE_CONFIG_OUT_TASK_LOW \ - { \ - .init_state = NRF_GPIOTE_INITIAL_VALUE_HIGH, \ - .task_pin = true, \ - .action = NRF_GPIOTE_POLARITY_HITOLO, \ - } - -/**@brief Macro for configuring a pin to use the GPIO OUT TASK to change the state from low to high. - * @details The task will set the pin. Therefore, the pin is cleared initially. */ -#define GPIOTE_CONFIG_OUT_TASK_HIGH \ - { \ - .init_state = NRF_GPIOTE_INITIAL_VALUE_LOW, \ - .task_pin = true, \ - .action = NRF_GPIOTE_POLARITY_LOTOHI, \ - } - -/**@brief Macro for configuring a pin to use the GPIO OUT TASK to toggle the pin state. - * @details The initial pin state must be provided. */ -#define GPIOTE_CONFIG_OUT_TASK_TOGGLE(init_high) \ - { \ - .init_state = init_high ? NRF_GPIOTE_INITIAL_VALUE_HIGH : NRF_GPIOTE_INITIAL_VALUE_LOW, \ - .task_pin = true, \ - .action = NRF_GPIOTE_POLARITY_TOGGLE, \ - } - -/** @brief Pin. */ -typedef uint32_t nrf_drv_gpiote_pin_t; - -/** - * @brief Pin event handler prototype. - * @param pin Pin that triggered this event. - * @param action Action that lead to triggering this event. - */ -typedef void (*nrf_drv_gpiote_evt_handler_t)(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action); - -/** - * @brief Function for initializing the GPIOTE module. - * - * @details Only static configuration is supported to prevent the shared - * resource being customized by the initiator. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the driver was already initialized. - */ -ret_code_t nrf_drv_gpiote_init(void); - -/** - * @brief Function for checking if the GPIOTE module is initialized. - * - * @details The GPIOTE module is a shared module. Therefore, you should check if - * the module is already initialized and skip initialization if it is. - * - * @retval true If the module is already initialized. - * @retval false If the module is not initialized. - */ -bool nrf_drv_gpiote_is_init(void); - -/** - * @brief Function for uninitializing the GPIOTE module. - */ -void nrf_drv_gpiote_uninit(void); - -/** - * @brief Function for initializing a GPIOTE output pin. - * @details The output pin can be controlled by the CPU or by PPI. The initial - * configuration specifies which mode is used. If PPI mode is used, the driver - * attempts to allocate one of the available GPIOTE channels. If no channel is - * available, an error is returned. - * - * @param[in] pin Pin. - * @param[in] p_config Initial configuration. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the driver is not initialized or the pin is already used. - * @retval NRF_ERROR_NO_MEM If no GPIOTE channel is available. - */ -ret_code_t nrf_drv_gpiote_out_init(nrf_drv_gpiote_pin_t pin, - nrf_drv_gpiote_out_config_t const * p_config); - -/** - * @brief Function for uninitializing a GPIOTE output pin. - * @details The driver frees the GPIOTE channel if the output pin was using one. - * - * @param[in] pin Pin. - */ -void nrf_drv_gpiote_out_uninit(nrf_drv_gpiote_pin_t pin); - -/** - * @brief Function for setting a GPIOTE output pin. - * - * @param[in] pin Pin. - */ -void nrf_drv_gpiote_out_set(nrf_drv_gpiote_pin_t pin); - -/** - * @brief Function for clearing a GPIOTE output pin. - * - * @param[in] pin Pin. - */ -void nrf_drv_gpiote_out_clear(nrf_drv_gpiote_pin_t pin); - -/** - * @brief Function for toggling a GPIOTE output pin. - * - * @param[in] pin Pin. - */ -void nrf_drv_gpiote_out_toggle(nrf_drv_gpiote_pin_t pin); - -/** - * @brief Function for enabling a GPIOTE output pin task. - * - * @param[in] pin Pin. - */ -void nrf_drv_gpiote_out_task_enable(nrf_drv_gpiote_pin_t pin); - -/** - * @brief Function for disabling a GPIOTE output pin task. - * - * @param[in] pin Pin. - */ -void nrf_drv_gpiote_out_task_disable(nrf_drv_gpiote_pin_t pin); - -/** - * @brief Function for getting the address of a configurable GPIOTE task. - * - * @param[in] pin Pin. - * - * @return Address of OUT task. - */ -uint32_t nrf_drv_gpiote_out_task_addr_get(nrf_drv_gpiote_pin_t pin); - -#if defined(GPIOTE_FEATURE_SET_PRESENT) -/** - * @brief Function for getting the address of a configurable GPIOTE task. - * - * @param[in] pin Pin. - * - * @return Address of SET task. - */ -uint32_t nrf_drv_gpiote_set_task_addr_get(nrf_drv_gpiote_pin_t pin); -#endif // defined(GPIOTE_FEATURE_SET_PRESENT) - -#if defined(GPIOTE_FEATURE_CLR_PRESENT) -/** - * @brief Function for getting the address of a configurable GPIOTE task. - * - * @param[in] pin Pin. - * - * @return Address of CLR task. - */ -uint32_t nrf_drv_gpiote_clr_task_addr_get(nrf_drv_gpiote_pin_t pin); -#endif // defined(GPIOTE_FEATURE_CLR_PRESENT) - -/** - * @brief Function for initializing a GPIOTE input pin. - * @details The input pin can act in two ways: - * - lower accuracy but low power (high frequency clock not needed) - * - higher accuracy (high frequency clock required) - * - * The initial configuration specifies which mode is used. - * If high-accuracy mode is used, the driver attempts to allocate one - * of the available GPIOTE channels. If no channel is - * available, an error is returned. - * In low accuracy mode SENSE feature is used. In this case only one active pin - * can be detected at a time. It can be worked around by setting all of the used - * low accuracy pins to toggle mode. - * For more information about SENSE functionality, refer to Product Specification. - * - * @param[in] pin Pin. - * @param[in] p_config Initial configuration. - * @param[in] evt_handler User function to be called when the configured transition occurs. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the driver is not initialized or the pin is already used. - * @retval NRF_ERROR_NO_MEM If no GPIOTE channel is available. - */ -ret_code_t nrf_drv_gpiote_in_init(nrf_drv_gpiote_pin_t pin, - nrf_drv_gpiote_in_config_t const * p_config, - nrf_drv_gpiote_evt_handler_t evt_handler); - -/** - * @brief Function for uninitializing a GPIOTE input pin. - * @details The driver frees the GPIOTE channel if the input pin was using one. - * - * @param[in] pin Pin. - */ -void nrf_drv_gpiote_in_uninit(nrf_drv_gpiote_pin_t pin); - -/** - * @brief Function for enabling sensing of a GPIOTE input pin. - * - * @details If the input pin is configured as high-accuracy pin, the function - * enables an IN_EVENT. Otherwise, the function enables the GPIO sense mechanism. - * Note that a PORT event is shared between multiple pins, therefore the - * interrupt is always enabled. - * - * @param[in] pin Pin. - * @param[in] int_enable True to enable the interrupt. Always valid for a high-accuracy pin. - */ -void nrf_drv_gpiote_in_event_enable(nrf_drv_gpiote_pin_t pin, bool int_enable); - -/** - * @brief Function for disabling a GPIOTE input pin. - * - * @param[in] pin Pin. - */ -void nrf_drv_gpiote_in_event_disable(nrf_drv_gpiote_pin_t pin); - -/** - * @brief Function for checking if a GPIOTE input pin is set. - * - * @param[in] pin Pin. - * @retval true If the input pin is set. - * @retval false If the input pin is not set. - */ -bool nrf_drv_gpiote_in_is_set(nrf_drv_gpiote_pin_t pin); - -/** - * @brief Function for getting the address of a GPIOTE input pin event. - * @details If the pin is configured to use low-accuracy mode, the address of the PORT event is returned. - * - * @param[in] pin Pin. - */ -uint32_t nrf_drv_gpiote_in_event_addr_get(nrf_drv_gpiote_pin_t pin); - -/** - * @brief Function for forcing a specific state on the pin configured as task. - * - * @param[in] pin Pin. - * @param[in] state Pin state. - */ -void nrf_drv_gpiote_out_task_force(nrf_drv_gpiote_pin_t pin, uint8_t state); - -/** - * @brief Function for triggering the task OUT manually. - * - * @param[in] pin Pin. - */ -void nrf_drv_gpiote_out_task_trigger(nrf_drv_gpiote_pin_t pin); - -#ifdef NRF52_SERIES -/** - * @brief Function for triggering the task SET manually. - * - * @param[in] pin Pin. - */ -void nrf_drv_gpiote_set_task_trigger(nrf_drv_gpiote_pin_t pin); - -/** - * @brief Function for triggering the task CLR manually. - * - * @param[in] pin Pin. - */ -void nrf_drv_gpiote_clr_task_trigger(nrf_drv_gpiote_pin_t pin); -#endif - -/** - *@} - **/ - - -#ifdef __cplusplus -} -#endif - -#endif //NRF_DRV_GPIOTE__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_saadc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_saadc.c deleted file mode 100644 index c028eaa49e..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_saadc.c +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/** - * @file - * @brief SAADC HAL implementation - */ -#include "sdk_config.h" -#if SAADC_ENABLED -#include "nrf_saadc.h" - -void nrf_saadc_channel_init(uint8_t channel, nrf_saadc_channel_config_t const * const config) -{ - NRF_SAADC->CH[channel].CONFIG = - ((config->resistor_p << SAADC_CH_CONFIG_RESP_Pos) & SAADC_CH_CONFIG_RESP_Msk) - | ((config->resistor_n << SAADC_CH_CONFIG_RESN_Pos) & SAADC_CH_CONFIG_RESN_Msk) - | ((config->gain << SAADC_CH_CONFIG_GAIN_Pos) & SAADC_CH_CONFIG_GAIN_Msk) - | ((config->reference << SAADC_CH_CONFIG_REFSEL_Pos) & SAADC_CH_CONFIG_REFSEL_Msk) - | ((config->acq_time << SAADC_CH_CONFIG_TACQ_Pos) & SAADC_CH_CONFIG_TACQ_Msk) - | ((config->mode << SAADC_CH_CONFIG_MODE_Pos) & SAADC_CH_CONFIG_MODE_Msk) - | ((config->burst << SAADC_CH_CONFIG_BURST_Pos) & SAADC_CH_CONFIG_BURST_Msk); - nrf_saadc_channel_input_set(channel, config->pin_p, config->pin_n); - return; -} -#endif //SAADC_ENABLED - diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/i2s/nrf_drv_i2s.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/i2s/nrf_drv_i2s.c deleted file mode 100644 index ba4fe016c5..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/i2s/nrf_drv_i2s.c +++ /dev/null @@ -1,446 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(I2S) -#include "nrf_drv_i2s.h" -#include "nrf_drv_common.h" -#include "nrf_gpio.h" -#include "nrf_assert.h" -#include "app_util_platform.h" - -#define NRF_LOG_MODULE_NAME i2s - -#if I2S_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL I2S_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR I2S_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR I2S_CONFIG_DEBUG_COLOR -#define EVT_TO_STR(event) (event == NRF_I2S_EVENT_RXPTRUPD ? "NRF_I2S_EVENT_RXPTRUPD" : \ - (event == NRF_I2S_EVENT_TXPTRUPD ? "NRF_I2S_EVENT_TXPTRUPD" : \ - (event == NRF_I2S_EVENT_STOPPED ? "NRF_I2S_EVENT_STOPPED" : "UNKNOWN EVENT"))) -#else //I2S_CONFIG_LOG_ENABLED -#define EVT_TO_STR(event) "" -#define NRF_LOG_LEVEL 0 -#endif //I2S_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); - -#define MODULE_INITIALIZED (m_cb.state == NRF_DRV_STATE_INITIALIZED) /**< Macro designating whether the module has been initialized properly. */ - -// Control block - driver instance local data. -typedef struct -{ - nrf_drv_i2s_data_handler_t handler; - nrf_drv_state_t state; - - bool synchronized_mode : 1; - bool rx_ready : 1; - bool tx_ready : 1; - bool just_started : 1; - uint16_t buffer_half_size; - uint32_t * p_rx_buffer; - uint32_t * p_tx_buffer; -} i2s_control_block_t; -static i2s_control_block_t m_cb; - - -static nrf_drv_i2s_config_t const m_default_config = NRF_DRV_I2S_DEFAULT_CONFIG; - - -static void configure_pins(nrf_drv_i2s_config_t const * p_config) -{ - uint32_t mck_pin, sdout_pin, sdin_pin; - - // Configure pins used by the peripheral: - - // - SCK and LRCK (required) - depending on the mode of operation these - // pins are configured as outputs (in Master mode) or inputs (in Slave - // mode). - if (p_config->mode == NRF_I2S_MODE_MASTER) - { - nrf_gpio_cfg_output(p_config->sck_pin); - nrf_gpio_cfg_output(p_config->lrck_pin); - } - else - { - nrf_gpio_cfg_input(p_config->sck_pin, NRF_GPIO_PIN_NOPULL); - nrf_gpio_cfg_input(p_config->lrck_pin, NRF_GPIO_PIN_NOPULL); - } - - // - MCK (optional) - always output, - if (p_config->mck_pin != NRF_DRV_I2S_PIN_NOT_USED) - { - mck_pin = p_config->mck_pin; - nrf_gpio_cfg_output(mck_pin); - } - else - { - mck_pin = NRF_I2S_PIN_NOT_CONNECTED; - } - - // - SDOUT (optional) - always output, - if (p_config->sdout_pin != NRF_DRV_I2S_PIN_NOT_USED) - { - sdout_pin = p_config->sdout_pin; - nrf_gpio_cfg_output(sdout_pin); - } - else - { - sdout_pin = NRF_I2S_PIN_NOT_CONNECTED; - } - - // - SDIN (optional) - always input. - if (p_config->sdin_pin != NRF_DRV_I2S_PIN_NOT_USED) - { - sdin_pin = p_config->sdin_pin; - nrf_gpio_cfg_input(sdin_pin, NRF_GPIO_PIN_NOPULL); - } - else - { - sdin_pin = NRF_I2S_PIN_NOT_CONNECTED; - } - - nrf_i2s_pins_set(NRF_I2S, p_config->sck_pin, p_config->lrck_pin, - mck_pin, sdout_pin, sdin_pin); -} - - -ret_code_t nrf_drv_i2s_init(nrf_drv_i2s_config_t const * p_config, - nrf_drv_i2s_data_handler_t handler) -{ - ASSERT(handler); - - ret_code_t err_code; - - if (m_cb.state != NRF_DRV_STATE_UNINITIALIZED) - { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - if (p_config == NULL) - { - p_config = &m_default_config; - } - - if (!nrf_i2s_configure(NRF_I2S, p_config->mode, - p_config->format, - p_config->alignment, - p_config->sample_width, - p_config->channels, - p_config->mck_setup, - p_config->ratio)) - { - err_code = NRF_ERROR_INVALID_PARAM; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - configure_pins(p_config); - - m_cb.handler = handler; - - nrf_drv_common_irq_enable(I2S_IRQn, p_config->irq_priority); - - m_cb.state = NRF_DRV_STATE_INITIALIZED; - - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", - (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -void nrf_drv_i2s_uninit(void) -{ - ASSERT(m_cb.state != NRF_DRV_STATE_UNINITIALIZED); - - nrf_drv_i2s_stop(); - - nrf_drv_common_irq_disable(I2S_IRQn); - - m_cb.state = NRF_DRV_STATE_UNINITIALIZED; - NRF_LOG_INFO("Uninitialized."); -} - - -ret_code_t nrf_drv_i2s_start(uint32_t * p_rx_buffer, - uint32_t * p_tx_buffer, - uint16_t buffer_size, - uint8_t flags) -{ - ASSERT((p_rx_buffer != NULL) || (p_tx_buffer != NULL)); - - uint16_t buffer_half_size = buffer_size / 2; - ASSERT(buffer_half_size != 0); - - VERIFY_MODULE_INITIALIZED(); - - ret_code_t err_code; - - if ((p_rx_buffer != NULL) && !nrf_drv_is_in_RAM(p_rx_buffer)) - { - err_code = NRF_ERROR_INVALID_ADDR; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - if ((p_tx_buffer != NULL) && !nrf_drv_is_in_RAM(p_tx_buffer)) - { - err_code = NRF_ERROR_INVALID_ADDR; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - // Initially we set up the peripheral to use the first half of each buffer, - // then in 'I2S_IRQHandler' we will switch to the second half. - nrf_i2s_transfer_set(NRF_I2S, buffer_half_size, p_rx_buffer, p_tx_buffer); - - m_cb.p_rx_buffer = p_rx_buffer; - m_cb.p_tx_buffer = p_tx_buffer; - m_cb.buffer_half_size = buffer_half_size; - m_cb.just_started = true; - - if ((flags & NRF_DRV_I2S_FLAG_SYNCHRONIZED_MODE) && - // [synchronized mode makes sense only when both RX and TX are enabled] - (m_cb.p_rx_buffer != NULL) && (m_cb.p_tx_buffer != NULL)) - { - m_cb.synchronized_mode = true; - m_cb.rx_ready = false; - m_cb.tx_ready = false; - } - else - { - m_cb.synchronized_mode = false; - } - - nrf_i2s_enable(NRF_I2S); - - m_cb.state = NRF_DRV_STATE_POWERED_ON; - - if (m_cb.p_tx_buffer != NULL) - { - // Get from the application the first portion of data to be sent - we - // need to have it in the transmit buffer before we start the transfer. - // Unless the synchronized mode is active. In this mode we must wait - // with this until the first portion of data is received, so here we - // just make sure that there will be silence on the SDOUT line prior - // to that moment. - if (m_cb.synchronized_mode) - { - memset(m_cb.p_tx_buffer, 0, - m_cb.buffer_half_size * sizeof(uint32_t)); - } - else - { - m_cb.handler(NULL, m_cb.p_tx_buffer, m_cb.buffer_half_size); - } - } - - nrf_i2s_event_clear(NRF_I2S, NRF_I2S_EVENT_RXPTRUPD); - nrf_i2s_event_clear(NRF_I2S, NRF_I2S_EVENT_TXPTRUPD); - nrf_i2s_int_enable(NRF_I2S, - NRF_I2S_INT_RXPTRUPD_MASK | NRF_I2S_INT_TXPTRUPD_MASK); - nrf_i2s_task_trigger(NRF_I2S, NRF_I2S_TASK_START); - - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", - (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -void nrf_drv_i2s_stop(void) -{ - ASSERT(m_cb.state != NRF_DRV_STATE_UNINITIALIZED); - - // First disable interrupts, then trigger the STOP task, so no spurious - // RXPTRUPD and TXPTRUPD events (see FTPAN-55) will be processed. - nrf_i2s_int_disable(NRF_I2S, - NRF_I2S_INT_RXPTRUPD_MASK | NRF_I2S_INT_TXPTRUPD_MASK); - - nrf_i2s_task_trigger(NRF_I2S, NRF_I2S_TASK_STOP); - - nrf_i2s_disable(NRF_I2S); - - m_cb.state = NRF_DRV_STATE_INITIALIZED; - - NRF_LOG_INFO("Disabled."); -} - - -void I2S_IRQHandler(void) -{ - uint32_t const * p_data_received = NULL; - uint32_t * p_data_to_send = NULL; - - if (nrf_i2s_event_check(NRF_I2S, NRF_I2S_EVENT_TXPTRUPD)) - { - nrf_i2s_event_clear(NRF_I2S, NRF_I2S_EVENT_TXPTRUPD); - NRF_LOG_DEBUG("Event: %s.", - (uint32_t)EVT_TO_STR(NRF_I2S_EVENT_TXPTRUPD)); - - // If transmission is not enabled, but for some reason the TXPTRUPD - // event has been generated, just ignore it. - if (m_cb.p_tx_buffer != NULL) - { - uint32_t * p_tx_buffer_next; - if (nrf_i2s_tx_buffer_get(NRF_I2S) == m_cb.p_tx_buffer) - { - p_tx_buffer_next = m_cb.p_tx_buffer + m_cb.buffer_half_size; - } - else - { - p_tx_buffer_next = m_cb.p_tx_buffer; - } - nrf_i2s_tx_buffer_set(NRF_I2S, p_tx_buffer_next); - - m_cb.tx_ready = true; - - // Now the part of the buffer that we've configured as "next" should - // be filled by the application with proper data to be sent; - // the peripheral is sending data from the other part of the buffer - // (but it will finish soon...). - p_data_to_send = p_tx_buffer_next; - - } - } - - if (nrf_i2s_event_check(NRF_I2S, NRF_I2S_EVENT_RXPTRUPD)) - { - nrf_i2s_event_clear(NRF_I2S, NRF_I2S_EVENT_RXPTRUPD); - NRF_LOG_DEBUG("Event: %s.", - (uint32_t)EVT_TO_STR(NRF_I2S_EVENT_RXPTRUPD)); - - // If reception is not enabled, but for some reason the RXPTRUPD event - // has been generated, just ignore it. - if (m_cb.p_rx_buffer != NULL) - { - uint32_t * p_rx_buffer_next; - if (nrf_i2s_rx_buffer_get(NRF_I2S) == m_cb.p_rx_buffer) - { - p_rx_buffer_next = m_cb.p_rx_buffer + m_cb.buffer_half_size; - } - else - { - p_rx_buffer_next = m_cb.p_rx_buffer; - } - nrf_i2s_rx_buffer_set(NRF_I2S, p_rx_buffer_next); - - m_cb.rx_ready = true; - - // The RXPTRUPD event is generated for the first time right after - // the transfer is started. Since there is no data received yet at - // this point we only update the buffer pointer (it is done above), - // there is no callback to the application. - // [for synchronized mode this has to be handled differently - - // see below] - if (m_cb.just_started && !m_cb.synchronized_mode) - { - m_cb.just_started = false; - } - else - { - // The RXPTRUPD event indicates that from now on the peripheral - // will be filling the part of the buffer that was pointed at - // the time the event has been generated, hence now we can let - // the application process the data stored in the other part of - // the buffer - the one that we've just set to be filled next. - p_data_received = p_rx_buffer_next; - } - } - } - - // Call the data handler passing received data to the application and/or - // requesting data to be sent. - if (!m_cb.synchronized_mode) - { - if ((p_data_received != NULL) || (p_data_to_send != NULL)) - { - if (p_data_received != NULL) - { - NRF_LOG_DEBUG("Rx data:"); - NRF_LOG_HEXDUMP_DEBUG(p_data_received, - m_cb.buffer_half_size * sizeof(p_data_received[0])); - } - m_cb.handler(p_data_received, p_data_to_send, - m_cb.buffer_half_size); - if (p_data_to_send != NULL) - { - NRF_LOG_DEBUG("Tx data:"); - NRF_LOG_HEXDUMP_DEBUG(p_data_to_send, - m_cb.buffer_half_size * sizeof(p_data_to_send[0])); - } - } - } - // In the synchronized mode wait until the events for both RX and TX occur. - // And ignore the initial occurrences of these events, since they only - // indicate that the transfer has started - no data is received yet at - // that moment, so we have got nothing to pass to the application. - else - { - if (m_cb.rx_ready && m_cb.tx_ready) - { - m_cb.rx_ready = false; - m_cb.tx_ready = false; - - if (m_cb.just_started) - { - m_cb.just_started = false; - } - else - { - NRF_LOG_DEBUG("Rx data:"); - NRF_LOG_HEXDUMP_DEBUG(nrf_i2s_rx_buffer_get(NRF_I2S), - m_cb.buffer_half_size * sizeof(p_data_to_send[0])); - m_cb.handler(nrf_i2s_rx_buffer_get(NRF_I2S), - nrf_i2s_tx_buffer_get(NRF_I2S), - m_cb.buffer_half_size); - NRF_LOG_DEBUG("Tx data:"); - NRF_LOG_HEXDUMP_DEBUG(nrf_i2s_tx_buffer_get(NRF_I2S), - m_cb.buffer_half_size * sizeof(p_data_to_send[0])); - } - } - } -} -#endif //NRF_MODULE_ENABLED(I2S) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/i2s/nrf_drv_i2s.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/i2s/nrf_drv_i2s.h deleted file mode 100644 index 9ed4bf742e..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/i2s/nrf_drv_i2s.h +++ /dev/null @@ -1,255 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/**@file - * @addtogroup nrf_i2s I2S HAL and driver - * @ingroup nrf_drivers - * @brief @tagAPI52 Inter-IC Sound (I2S) interface APIs. - * - * @defgroup nrf_drv_i2s I2S driver - * @{ - * @ingroup nrf_i2s - * @brief @tagAPI52 Inter-IC Sound (I2S) interface driver. - */ - - -#ifndef NRF_DRV_I2S_H__ -#define NRF_DRV_I2S_H__ - -#include "nordic_common.h" -#include "sdk_config.h" -#include "nrf_i2s.h" -#include "sdk_errors.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/** - * @brief This value can be provided instead of a pin number for the signals - * SDOUT, SDIN, and MCK to specify that a given signal is not used - * and therefore does not need to be connected to a pin. - */ -#define NRF_DRV_I2S_PIN_NOT_USED 0xFF - -/** - * @brief Flag indicating that calls to the data handler for RX and TX should - * be synchronized, thus always combined into one call. - * - * Use this flag when calling @ref nrf_drv_i2s_start to force a common call - * to the @ref nrf_drv_i2s_data_handler_t "data handler" for RX and TX data. - * This is useful, for example, when received data should be processed and - * then be sent back. Obviously, this flag is only applicable when both - * directions (RX and TX) are enabled. - */ -#define NRF_DRV_I2S_FLAG_SYNCHRONIZED_MODE 0x01 - -/** - * @brief I2S driver configuration structure. - */ -typedef struct -{ - uint8_t sck_pin; ///< SCK pin number. - uint8_t lrck_pin; ///< LRCK pin number. - uint8_t mck_pin; ///< MCK pin number. - /**< Optional. Use @ref NRF_DRV_I2S_PIN_NOT_USED - * if this signal is not needed. */ - uint8_t sdout_pin; ///< SDOUT pin number. - /**< Optional. Use @ref NRF_DRV_I2S_PIN_NOT_USED - * if this signal is not needed. */ - uint8_t sdin_pin; ///< SDIN pin number. - /**< Optional. Use @ref NRF_DRV_I2S_PIN_NOT_USED - * if this signal is not needed. */ - uint8_t irq_priority; ///< Interrupt priority. - - nrf_i2s_mode_t mode; ///< Mode of operation. - nrf_i2s_format_t format; ///< Frame format. - nrf_i2s_align_t alignment; ///< Alignment of sample within a frame. - nrf_i2s_swidth_t sample_width; ///< Sample width. - nrf_i2s_channels_t channels; ///< Enabled channels. - nrf_i2s_mck_t mck_setup; ///< Master clock setup. - nrf_i2s_ratio_t ratio; ///< MCK/LRCK ratio. -} nrf_drv_i2s_config_t; - -/** - * @brief I2S driver default configuration. - */ -#define NRF_DRV_I2S_DEFAULT_CONFIG \ -{ \ - .sck_pin = I2S_CONFIG_SCK_PIN, \ - .lrck_pin = I2S_CONFIG_LRCK_PIN, \ - .mck_pin = I2S_CONFIG_MCK_PIN, \ - .sdout_pin = I2S_CONFIG_SDOUT_PIN, \ - .sdin_pin = I2S_CONFIG_SDIN_PIN, \ - .irq_priority = I2S_CONFIG_IRQ_PRIORITY, \ - .mode = (nrf_i2s_mode_t)I2S_CONFIG_MASTER, \ - .format = (nrf_i2s_format_t)I2S_CONFIG_FORMAT, \ - .alignment = (nrf_i2s_align_t)I2S_CONFIG_ALIGN, \ - .sample_width = (nrf_i2s_swidth_t)I2S_CONFIG_SWIDTH, \ - .channels = (nrf_i2s_channels_t)I2S_CONFIG_CHANNELS, \ - .mck_setup = (nrf_i2s_mck_t)I2S_CONFIG_MCK_SETUP, \ - .ratio = (nrf_i2s_ratio_t)I2S_CONFIG_RATIO, \ -} - -/** - * @brief I2S driver data handler type. - * - * A data handling function of this type must be specified during initialization - * of the driver. The driver will call this function when a new portion of data - * is received or a new portion of data should be prepared for transmission. - * The first case is indicated by a non-NULL value in the @p p_data_received - * parameter (which points to the memory containing the received data). - * Similarly, the second case is indicated by a non-NULL value in the - * @p p_data_to_send parameter (which points to where the data to be transmitted - * should be placed). - * - * @note The two cases mentioned above may be indicated separately or combined - * into one call (depending on the environment in which the driver is - * used). Therefore, both parameters should be checked and handled - * properly in every call. @ref NRF_DRV_I2S_FLAG_SYNCHRONIZED_MODE - * "Synchronized mode" can be used to always combine these indications. - * - * @param[in] p_data_received Pointer to the buffer with received data, - * or NULL if the handler is called to prepare - * transmission only. - * @param[out] p_data_to_send Pointer to the buffer where data to be sent - * should be written, or NULL if the handler is - * called for received data only. - * @param[in] number_of_words Length of data received and/or to be written - * (in 32-bit words). This value is always equal to - * half the size of the buffers set by the call - * to the @ref nrf_drv_i2s_start function. - */ -typedef void (* nrf_drv_i2s_data_handler_t)(uint32_t const * p_data_received, - uint32_t * p_data_to_send, - uint16_t number_of_words); - - -/** - * @brief Function for initializing the I2S driver. - * - * @param[in] p_config Pointer to the structure with initial configuration. - * If NULL, the default configuration is used. - * @param[in] handler Data handler provided by the user. Must not be NULL. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the driver was already initialized. - * @retval NRF_ERROR_INVALID_PARAM If the requested combination of configuration - * options is not allowed by the I2S peripheral. - */ -ret_code_t nrf_drv_i2s_init(nrf_drv_i2s_config_t const * p_config, - nrf_drv_i2s_data_handler_t handler); - -/** - * @brief Function for uninitializing the I2S driver. - */ -void nrf_drv_i2s_uninit(void); - -/** - * @brief Function for starting the continuous I2S transfer. - * - * The I2S data transfer can be performed in one of three modes: RX (reception) - * only, TX (transmission) only, or in both directions simultaneously. - * The mode is selected by specifying a proper buffer for a given direction - * in the call to this function or by passing NULL instead if this direction - * should be disabled. - * - * The length of the buffer (which is a common value for RX and TX if both - * directions are enabled) is specified in 32-bit words. One 32-bit memory - * word can either contain four 8-bit samples, two 16-bit samples, or one - * right-aligned 24-bit sample sign-extended to a 32-bit value. - * For a detailed memory mapping for different supported configurations, - * see the @linkProductSpecification52. - * - * The provided buffers are logically divided into two parts of equal size. - * One of them is in use by the peripheral (for storing received data or for - * getting data to be transmitted, respectively). The other part is provided - * to the application via a call to the defined @ref nrf_drv_i2s_data_handler_t - * "data handling function", so that the application can process the received - * data or prepare the next portion of data to be sent. The two parts are - * swapped every time @p buffer_size/2 data words are received or transmitted. - * - * Additional options are provided using the @p flags parameter: - * - @ref NRF_DRV_I2S_FLAG_SYNCHRONIZED_MODE - the calls to data handler should - * be done in a synchronized manner (one common call for TX and RX). - * Applicable only when both RX and TX are enabled. - * - * @attention All data exchange is done in the data handler only. In particular, - * no data should be written to the transmit buffer before calling - * this function (a proper call to the data handler to get the first - * portion of data to be sent will be done before the actual transfer - * starts). - * - * @note Peripherals using EasyDMA (like I2S) require the transfer buffers - * to be placed in the Data RAM region. If this condition is not met, - * this function will fail with the error code NRF_ERROR_INVALID_ADDR. - * - * @param[in] p_rx_buffer Pointer to the receive buffer. - * Pass NULL if reception is not required. - * @param[in] p_tx_buffer Pointer to the transmit buffer. - * Pass NULL if transmission is not required. - * @param[in] buffer_size Size of the buffers (in 32-bit words). - * The size must be an even number greater than 0. - * @param[in] flags Transfer options (0 for default settings). - * - * @retval NRF_SUCCESS If the operation was successful. - * @retval NRF_ERROR_INVALID_STATE If a transfer was already started or - * the driver has not been initialized. - * @retval NRF_ERROR_INVALID_ADDR If the provided buffers are not placed - * in the Data RAM region. - */ -ret_code_t nrf_drv_i2s_start(uint32_t * p_rx_buffer, - uint32_t * p_tx_buffer, - uint16_t buffer_size, - uint8_t flags); - -/** - * @brief Function for stopping the I2S transfer. - */ -void nrf_drv_i2s_stop(void); - - -#ifdef __cplusplus -} -#endif - -#endif // NRF_DRV_I2S_H__ - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/lpcomp/nrf_drv_lpcomp.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/lpcomp/nrf_drv_lpcomp.c deleted file mode 100644 index 38be84bce2..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/lpcomp/nrf_drv_lpcomp.c +++ /dev/null @@ -1,205 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(LPCOMP) -#include "nrf_drv_lpcomp.h" -#include "nrf_assert.h" -#include "nrf_error.h" -#include "nrf_soc.h" -#include "nrf_drv_common.h" -#include "app_util_platform.h" -#include -#include -#include - -#define NRF_LOG_MODULE_NAME lpcomp - -#if LPCOMP_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL LPCOMP_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR LPCOMP_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR LPCOMP_CONFIG_DEBUG_COLOR -#define EVT_TO_STR(event) (event == NRF_LPCOMP_EVENT_READY ? "NRF_LPCOMP_EVENT_READY" : \ - (event == NRF_LPCOMP_EVENT_DOWN ? "NRF_LPCOMP_EVENT_DOWN" : \ - (event == NRF_LPCOMP_EVENT_UP ? "NRF_LPCOMP_EVENT_UP" : \ - (event == NRF_LPCOMP_EVENT_CROSS ? "NRF_LPCOMP_EVENT_CROSS" : "UNKNOWN EVENT")))) -#else //LPCOMP_CONFIG_LOG_ENABLED -#define EVT_TO_STR(event) "" -#define NRF_LOG_LEVEL 0 -#endif //LPCOMP_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); - - -static lpcomp_events_handler_t m_lpcomp_events_handler = NULL; -static nrf_drv_state_t m_state = NRF_DRV_STATE_UNINITIALIZED; - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - #define IRQ_HANDLER_NAME irq_handler_for_lpcomp - #define IRQ_HANDLER static void IRQ_HANDLER_NAME(void) - - IRQ_HANDLER; -#else - #define IRQ_HANDLER void LPCOMP_IRQHandler(void) -#endif // NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - -static void lpcomp_execute_handler(nrf_lpcomp_event_t event, uint32_t event_mask) -{ - if ( nrf_lpcomp_event_check(event) && nrf_lpcomp_int_enable_check(event_mask) ) - { - nrf_lpcomp_event_clear(event); - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(event)); - - m_lpcomp_events_handler(event); - } -} - - -IRQ_HANDLER -{ - lpcomp_execute_handler(NRF_LPCOMP_EVENT_READY, LPCOMP_INTENSET_READY_Msk); - lpcomp_execute_handler(NRF_LPCOMP_EVENT_DOWN, LPCOMP_INTENSET_DOWN_Msk); - lpcomp_execute_handler(NRF_LPCOMP_EVENT_UP, LPCOMP_INTENSET_UP_Msk); - lpcomp_execute_handler(NRF_LPCOMP_EVENT_CROSS, LPCOMP_INTENSET_CROSS_Msk); -} - - -ret_code_t nrf_drv_lpcomp_init(const nrf_drv_lpcomp_config_t * p_config, - lpcomp_events_handler_t events_handler) -{ - ASSERT(p_config); - ret_code_t err_code; - - if (m_state != NRF_DRV_STATE_UNINITIALIZED) - { // LPCOMP driver is already initialized - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - if (nrf_drv_common_per_res_acquire(NRF_LPCOMP, IRQ_HANDLER_NAME) != NRF_SUCCESS) - { - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } -#endif - - nrf_lpcomp_configure(&(p_config->hal) ); - - if (events_handler) - { - m_lpcomp_events_handler = events_handler; - } - else - { - err_code = NRF_ERROR_INVALID_PARAM; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - nrf_lpcomp_input_select(p_config->input); - - switch (p_config->hal.detection) - { - case NRF_LPCOMP_DETECT_UP: - nrf_lpcomp_int_enable(LPCOMP_INTENSET_UP_Msk); - break; - - case NRF_LPCOMP_DETECT_DOWN: - nrf_lpcomp_int_enable(LPCOMP_INTENSET_DOWN_Msk); - break; - - case NRF_LPCOMP_DETECT_CROSS: - nrf_lpcomp_int_enable(LPCOMP_INTENSET_CROSS_Msk); - break; - - default: - break; - } - nrf_lpcomp_shorts_enable(NRF_LPCOMP_SHORT_READY_SAMPLE_MASK); - - nrf_drv_common_irq_enable(LPCOMP_IRQn, p_config->interrupt_priority); - - m_state = NRF_DRV_STATE_INITIALIZED; - - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -void nrf_drv_lpcomp_uninit(void) -{ - ASSERT(m_state != NRF_DRV_STATE_UNINITIALIZED); - nrf_drv_common_irq_disable(LPCOMP_IRQn); - nrf_drv_lpcomp_disable(); -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - nrf_drv_common_per_res_release(NRF_LPCOMP); -#endif - m_state = NRF_DRV_STATE_UNINITIALIZED; - m_lpcomp_events_handler = NULL; - NRF_LOG_INFO("Uninitialized."); -} - -void nrf_drv_lpcomp_enable(void) -{ - ASSERT(m_state == NRF_DRV_STATE_INITIALIZED); - nrf_lpcomp_enable(); - nrf_lpcomp_task_trigger(NRF_LPCOMP_TASK_START); - m_state = NRF_DRV_STATE_POWERED_ON; - NRF_LOG_INFO("Enabled."); -} - -void nrf_drv_lpcomp_disable(void) -{ - ASSERT(m_state == NRF_DRV_STATE_POWERED_ON); - nrf_lpcomp_disable(); - nrf_lpcomp_task_trigger(NRF_LPCOMP_TASK_STOP); - m_state = NRF_DRV_STATE_INITIALIZED; - NRF_LOG_INFO("Disabled."); -} - -void nrf_drv_lpcomp_event_handler_register(lpcomp_events_handler_t lpcomp_events_handler) -{ - m_lpcomp_events_handler = lpcomp_events_handler; -} - -#endif //NRF_MODULE_ENABLED(LPCOMP) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/pdm/nrf_drv_pdm.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/pdm/nrf_drv_pdm.c deleted file mode 100644 index 5a7aca44d0..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/pdm/nrf_drv_pdm.c +++ /dev/null @@ -1,365 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(PDM) -#include "nrf_drv_pdm.h" -#include "nrf_assert.h" -#include "nrf_drv_common.h" -#include "nrf_gpio.h" - -#define NRF_LOG_MODULE_NAME pdm - -#if PDM_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL PDM_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR PDM_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR PDM_CONFIG_DEBUG_COLOR -#define EVT_TO_STR(event) (event == NRF_PDM_EVENT_STARTED ? "NRF_PDM_EVENT_STARTED" : \ - (event == NRF_PDM_EVENT_STOPPED ? "NRF_PDM_EVENT_STOPPED" : \ - (event == NRF_PDM_EVENT_END ? "NRF_PDM_EVENT_END" : "UNKNOWN EVENT"))) -#else //PDM_CONFIG_LOG_ENABLED -#define EVT_TO_STR(event) "" -#define NRF_LOG_LEVEL 0 -#endif //PDM_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); - - -/** @brief PDM interface status. */ -typedef enum -{ - NRF_PDM_STATE_IDLE, - NRF_PDM_STATE_RUNNING, - NRF_PDM_STATE_STARTING, - NRF_PDM_STATE_STOPPING -} nrf_drv_pdm_state_t; - - -/** @brief PDM interface control block.*/ -typedef struct -{ - nrf_drv_pdm_event_handler_t event_handler; ///< Event handler function pointer. - int16_t * buff_address[2]; ///< Sample buffers. - uint16_t buff_length[2]; ///< Length of the sample buffers. - nrf_drv_state_t drv_state; ///< Driver state. - volatile nrf_drv_pdm_state_t op_state; ///< PDM peripheral operation state. - uint8_t active_buffer; ///< Number of currently active buffer. - uint8_t error; ///< Driver error flag. - uint8_t irq_priority; ///< Interrupt priority. - volatile uint8_t irq_buff_request; ///< Request the next buffer in the ISR. -} nrf_drv_pdm_cb_t; - - -static nrf_drv_pdm_cb_t m_cb; - - -void PDM_IRQHandler(void) -{ - if (nrf_pdm_event_check(NRF_PDM_EVENT_STARTED)) - { - nrf_pdm_event_clear(NRF_PDM_EVENT_STARTED); - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(NRF_PDM_EVENT_STARTED)); - - nrf_drv_pdm_evt_t evt; - uint8_t finished_buffer = m_cb.active_buffer; - - // Check if the next buffer was set before. - uint8_t next_buffer = (~m_cb.active_buffer) & 0x01; - if (m_cb.buff_address[next_buffer] || m_cb.op_state == NRF_PDM_STATE_STARTING) - { - evt.error = PDM_NO_ERROR; - m_cb.error = 0; - - // Release the full buffer if ready and request the next one. - if (m_cb.op_state == NRF_PDM_STATE_STARTING) - { - evt.buffer_released = 0; - m_cb.op_state = NRF_PDM_STATE_RUNNING; - } - else - { - evt.buffer_released = m_cb.buff_address[finished_buffer]; - m_cb.buff_address[finished_buffer] = 0; - m_cb.active_buffer = next_buffer; - } - evt.buffer_requested = true; - m_cb.event_handler(&evt); - } - else - { - // No next buffer available. Report an error. - // Do not request the new buffer as it was already done. - if (m_cb.error == 0) - { - evt.error = PDM_ERROR_OVERFLOW; - evt.buffer_released = 0; - evt.buffer_requested = false; - m_cb.error = 1; - m_cb.event_handler(&evt); - } - } - - if (m_cb.op_state == NRF_PDM_STATE_STARTING) - { - m_cb.op_state = NRF_PDM_STATE_RUNNING; - } - } - else if (nrf_pdm_event_check(NRF_PDM_EVENT_STOPPED)) - { - nrf_pdm_event_clear(NRF_PDM_EVENT_STOPPED); - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(NRF_PDM_EVENT_STOPPED)); - nrf_pdm_disable(); - m_cb.op_state = NRF_PDM_STATE_IDLE; - - // Release the buffers. - nrf_drv_pdm_evt_t evt; - evt.error = PDM_NO_ERROR; - evt.buffer_requested = false; - if (m_cb.buff_address[m_cb.active_buffer]) - { - evt.buffer_released = m_cb.buff_address[m_cb.active_buffer]; - m_cb.buff_address[m_cb.active_buffer] = 0; - m_cb.event_handler(&evt); - } - - uint8_t second_buffer = (~m_cb.active_buffer) & 0x01; - if (m_cb.buff_address[second_buffer]) - { - evt.buffer_released = m_cb.buff_address[second_buffer]; - m_cb.buff_address[second_buffer] = 0; - m_cb.event_handler(&evt); - } - m_cb.active_buffer = 0; - - - } - - if (m_cb.irq_buff_request) - { - nrf_drv_pdm_evt_t evt; - evt.buffer_released = 0; - evt.error = PDM_NO_ERROR; - evt.buffer_requested = true; - m_cb.irq_buff_request = 0; - m_cb.event_handler(&evt); - } -} - - -ret_code_t nrf_drv_pdm_init(nrf_drv_pdm_config_t const * p_config, - nrf_drv_pdm_event_handler_t event_handler) -{ - ret_code_t err_code; - - if (m_cb.drv_state != NRF_DRV_STATE_UNINITIALIZED) - { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - if ((p_config == NULL) - || (event_handler == NULL)) - { - err_code = NRF_ERROR_INVALID_PARAM; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - if (p_config->gain_l > NRF_PDM_GAIN_MAXIMUM - || p_config->gain_r > NRF_PDM_GAIN_MAXIMUM) - { - err_code = NRF_ERROR_INVALID_PARAM; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - - m_cb.buff_address[0] = 0; - m_cb.buff_address[1] = 0; - m_cb.active_buffer = 0; - m_cb.error = 0; - m_cb.event_handler = event_handler; - m_cb.op_state = NRF_PDM_STATE_IDLE; - - nrf_pdm_clock_set(p_config->clock_freq); - nrf_pdm_mode_set(p_config->mode, p_config->edge); - nrf_pdm_gain_set(p_config->gain_l, p_config->gain_r); - - nrf_gpio_cfg_output(p_config->pin_clk); - nrf_gpio_pin_clear(p_config->pin_clk); - nrf_gpio_cfg_input(p_config->pin_din, NRF_GPIO_PIN_NOPULL); - nrf_pdm_psel_connect(p_config->pin_clk, p_config->pin_din); - - nrf_pdm_event_clear(NRF_PDM_EVENT_STARTED); - nrf_pdm_event_clear(NRF_PDM_EVENT_END); - nrf_pdm_event_clear(NRF_PDM_EVENT_STOPPED); - nrf_pdm_int_enable(NRF_PDM_INT_STARTED | NRF_PDM_INT_STOPPED); - m_cb.irq_priority = p_config->interrupt_priority; - nrf_drv_common_irq_enable(PDM_IRQn, m_cb.irq_priority); - m_cb.drv_state = NRF_DRV_STATE_INITIALIZED; - - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -void nrf_drv_pdm_uninit(void) -{ - nrf_pdm_disable(); - nrf_pdm_psel_disconnect(); - m_cb.drv_state = NRF_DRV_STATE_UNINITIALIZED; - NRF_LOG_INFO("Uninitialized."); -} - -static void pdm_start() -{ - m_cb.drv_state = NRF_DRV_STATE_POWERED_ON; - nrf_pdm_enable(); - nrf_pdm_event_clear(NRF_PDM_EVENT_STARTED); - nrf_pdm_task_trigger(NRF_PDM_TASK_START); -} - -static void pdm_buf_request() -{ - m_cb.irq_buff_request = 1; - NVIC_SetPendingIRQ(PDM_IRQn); -} - -ret_code_t nrf_drv_pdm_start(void) -{ - ASSERT(m_cb.drv_state != NRF_DRV_STATE_UNINITIALIZED); - ret_code_t err_code; - - if (m_cb.op_state != NRF_PDM_STATE_IDLE) - { - if (m_cb.op_state == NRF_PDM_STATE_RUNNING) - { - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - m_cb.op_state = NRF_PDM_STATE_STARTING; - pdm_buf_request(); - - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - -ret_code_t nrf_drv_pdm_buffer_set(int16_t * buffer, uint16_t buffer_length) -{ - if (m_cb.drv_state == NRF_DRV_STATE_UNINITIALIZED) - { - return NRF_ERROR_INVALID_STATE; - } - if (m_cb.op_state == NRF_PDM_STATE_STOPPING) - { - return NRF_ERROR_BUSY; - } - if ((!buffer) || (buffer_length > NRF_PDM_MAX_BUFFER_SIZE)) - { - return NRF_ERROR_INVALID_PARAM; - } - - ret_code_t err_code = NRF_SUCCESS; - - // Enter the PDM critical section. - nrf_drv_common_irq_disable(PDM_IRQn); - - uint8_t next_buffer = (~m_cb.active_buffer) & 0x01; - if (m_cb.op_state == NRF_PDM_STATE_STARTING) - { - next_buffer = 0; - } - - if (m_cb.buff_address[next_buffer]) - { - // Buffer already set. - err_code = NRF_ERROR_BUSY; - } - else - { - m_cb.buff_address[next_buffer] = buffer; - m_cb.buff_length[next_buffer] = buffer_length; - nrf_pdm_buffer_set((uint32_t *)buffer, buffer_length); - - if (m_cb.drv_state != NRF_DRV_STATE_POWERED_ON) - { - pdm_start(); - } - } - - nrf_drv_common_irq_enable(PDM_IRQn, m_cb.irq_priority); - return err_code; -} - -ret_code_t nrf_drv_pdm_stop(void) -{ - ASSERT(m_cb.drv_state != NRF_DRV_STATE_UNINITIALIZED); - ret_code_t err_code; - - if (m_cb.op_state != NRF_PDM_STATE_RUNNING) - { - if (m_cb.op_state == NRF_PDM_STATE_IDLE || m_cb.op_state == NRF_PDM_STATE_STARTING) - { - nrf_pdm_disable(); - m_cb.op_state = NRF_PDM_STATE_IDLE; - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - m_cb.drv_state = NRF_DRV_STATE_INITIALIZED; - m_cb.op_state = NRF_PDM_STATE_STOPPING; - - nrf_pdm_task_trigger(NRF_PDM_TASK_STOP); - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - -#endif //NRF_MODULE_ENABLED(PDM) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/power/nrf_drv_power.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/power/nrf_drv_power.c deleted file mode 100644 index 3c1f26818c..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/power/nrf_drv_power.c +++ /dev/null @@ -1,477 +0,0 @@ -/** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(POWER) - -#include "nrf_drv_power.h" -#include "nrf_assert.h" -#include "nordic_common.h" -#include "app_util_platform.h" -#ifdef SOFTDEVICE_PRESENT -#include "nrf_sdm.h" -#include "nrf_soc.h" -#include "nrf_sdh.h" -#include "nrf_sdh_soc.h" -#endif - -/* Validate configuration */ -INTERRUPT_PRIORITY_VALIDATION(POWER_CONFIG_IRQ_PRIORITY); - -/** - * @internal - * @defgroup nrf_drv_power_internals POWER driver internals - * @ingroup nrf_drv_power - * - * Internal variables, auxiliary macros and functions of POWER driver. - * @{ - */ - -/** - * @brief Default configuration - * - * The structure with default configuration data. - * This structure would be used if configuration pointer given - * to the @ref nrf_drv_power_init is set to NULL. - */ -static const nrf_drv_power_config_t m_drv_power_config_default = -{ - .dcdcen = POWER_CONFIG_DEFAULT_DCDCEN, -#if NRF_POWER_HAS_VDDH - .dcdcenhv = POWER_CONFIG_DEFAULT_DCDCENHV, -#endif -}; - -/** - * @brief The initialization flag - */ -static bool m_initialized; - -/** - * @brief The handler of power fail comparator warning event - */ -static nrf_drv_power_pofwarn_event_handler_t m_pofwarn_handler; - -#if NRF_POWER_HAS_SLEEPEVT -/** - * @brief The handler of sleep event handler - */ -static nrf_drv_power_sleep_event_handler_t m_sleepevt_handler; -#endif - -#if NRF_POWER_HAS_USBREG -/** - * @brief The handler of USB power events - */ -static nrf_drv_power_usb_event_handler_t m_usbevt_handler; -#endif - -/** @} */ - -bool nrf_drv_power_init_check(void) -{ - return m_initialized; -} - -ret_code_t nrf_drv_power_init(nrf_drv_power_config_t const * p_config) -{ - nrf_drv_power_config_t const * p_used_config; - if (m_initialized) - { - return NRF_ERROR_MODULE_ALREADY_INITIALIZED; - } -#ifdef SOFTDEVICE_PRESENT - if (nrf_sdh_is_enabled()) - { - return NRF_ERROR_INVALID_STATE; - } -#endif - - p_used_config = (p_config != NULL) ? - p_config : (&m_drv_power_config_default); -#if NRF_POWER_HAS_VDDH - nrf_power_dcdcen_vddh_set(p_used_config->dcdcenhv); -#endif - nrf_power_dcdcen_set(p_used_config->dcdcen); - - nrf_drv_common_power_clock_irq_init(); - - m_initialized = true; - return NRF_SUCCESS; -} - -void nrf_drv_power_uninit(void) -{ - ASSERT(m_initialized); - nrf_drv_power_pof_uninit(); -#if NRF_POWER_HAS_SLEEPEVT - nrf_drv_power_sleepevt_uninit(); -#endif -#if NRF_POWER_HAS_USBREG - nrf_drv_power_usbevt_uninit(); -#endif - m_initialized = false; -} - -ret_code_t nrf_drv_power_pof_init(nrf_drv_power_pofwarn_config_t const * p_config) -{ - ASSERT(p_config != NULL); - - nrf_drv_power_pof_uninit(); - -#ifdef SOFTDEVICE_PRESENT - if (nrf_sdh_is_enabled()) - { - /* Currently when SD is enabled - the configuration can be changed - * in very limited range. - * It is the SoftDevice limitation. - */ -#if NRF_POWER_HAS_VDDH - if (p_config->thrvddh != nrf_power_pofcon_vddh_get()) - { - /* Cannot change THRVDDH with current SD API */ - return NRF_ERROR_INVALID_STATE; - } -#endif - if (p_config->thr != nrf_power_pofcon_get(NULL)) - { - /* Only limited number of THR values are supported and - * the values taken by SD is different than the one in hardware - */ - uint8_t thr; - switch (p_config->thr) - { - case NRF_POWER_POFTHR_V21: - thr = NRF_POWER_THRESHOLD_V21; - break; - case NRF_POWER_POFTHR_V23: - thr = NRF_POWER_THRESHOLD_V23; - break; - case NRF_POWER_POFTHR_V25: - thr = NRF_POWER_THRESHOLD_V25; - break; - case NRF_POWER_POFTHR_V27: - thr = NRF_POWER_THRESHOLD_V27; - break; - default: - /* Cannot configure */ - return NRF_ERROR_INVALID_STATE; - } - ASSERT(sd_power_pof_threshold_set(thr)); - } - } - else -#endif /* SOFTDEVICE_PRESENT */ - { - nrf_power_pofcon_set(true, p_config->thr); -#if NRF_POWER_HAS_VDDH - nrf_power_pofcon_vddh_set(p_config->thrvddh); -#endif - } - - if (p_config->handler != NULL) - { - m_pofwarn_handler = p_config->handler; -#ifdef SOFTDEVICE_PRESENT - if (nrf_sdh_is_enabled()) - { - (void) sd_power_pof_enable(true); - } - else -#endif - { - nrf_power_int_enable(NRF_POWER_INT_POFWARN_MASK); - } - } - return NRF_SUCCESS; -} - -void nrf_drv_power_pof_uninit(void) -{ -#ifdef SOFTDEVICE_PRESENT - if (nrf_sdh_is_enabled()) - { - (void) sd_power_pof_enable(false); - } - else -#endif - { - nrf_power_int_disable(NRF_POWER_INT_POFWARN_MASK); - } - m_pofwarn_handler = NULL; -} - -#if NRF_POWER_HAS_SLEEPEVT -ret_code_t nrf_drv_power_sleepevt_init(nrf_drv_power_sleepevt_config_t const * p_config) -{ - ASSERT(p_config != NULL); - - nrf_drv_power_sleepevt_uninit(); - if (p_config->handler != NULL) - { - uint32_t enmask = 0; - m_sleepevt_handler = p_config->handler; - if (p_config->en_enter) - { - enmask |= NRF_POWER_INT_SLEEPENTER_MASK; - nrf_power_event_clear(NRF_POWER_EVENT_SLEEPENTER); - } - if (p_config->en_exit) - { - enmask |= NRF_POWER_INT_SLEEPEXIT_MASK; - nrf_power_event_clear(NRF_POWER_EVENT_SLEEPEXIT); - } -#ifdef SOFTDEVICE_PRESENT - if (nrf_sdh_is_enabled()) - { - if (enmask != 0) - { - return NRF_ERROR_INVALID_STATE; - } - } - else -#endif - { - nrf_power_int_enable(enmask); - } - } - - return NRF_SUCCESS; -} - -void nrf_drv_power_sleepevt_uninit(void) -{ -#ifdef SOFTDEVICE_PRESENT - if (nrf_sdh_is_enabled()) - { - /* Nothing to do */ - } - else -#endif - { - nrf_power_int_disable( - NRF_POWER_INT_SLEEPENTER_MASK | - NRF_POWER_INT_SLEEPEXIT_MASK); - } - m_sleepevt_handler = NULL; -} -#endif /* NRF_POWER_HAS_SLEEPEVT */ - -#if NRF_POWER_HAS_USBREG -ret_code_t nrf_drv_power_usbevt_init(nrf_drv_power_usbevt_config_t const * p_config) -{ - nrf_drv_power_usbevt_uninit(); - if (p_config->handler != NULL) - { - m_usbevt_handler = p_config->handler; -#ifdef SOFTDEVICE_PRESENT - if (nrf_sdh_is_enabled()) - { - /** @todo Implement USB power events when SD support it */ - return NRF_ERROR_INVALID_STATE; - } - else -#endif - { - nrf_power_int_enable( - NRF_POWER_INT_USBDETECTED_MASK | - NRF_POWER_INT_USBREMOVED_MASK | - NRF_POWER_INT_USBPWRRDY_MASK); - } - } - return NRF_SUCCESS; -} - -void nrf_drv_power_usbevt_uninit(void) -{ -#ifdef SOFTDEVICE_PRESENT - if (nrf_sdh_is_enabled()) - { - /** @todo Implement USB power events when SD support it */ - } - else -#endif - { - nrf_power_int_disable( - NRF_POWER_INT_USBDETECTED_MASK | - NRF_POWER_INT_USBREMOVED_MASK | - NRF_POWER_INT_USBPWRRDY_MASK); - } - m_usbevt_handler = NULL; -} -#endif /* NRF_POWER_HAS_USBREG */ - - -/** - * @ingroup nrf_drv_power_internals - * @brief Interrupt handler - * - * POWER peripheral interrupt handler - */ -#if NRF_DRV_COMMON_POWER_CLOCK_ISR -void nrf_drv_power_onIRQ(void) -#else -void POWER_CLOCK_IRQHandler(void) -#endif -{ - uint32_t enabled = nrf_power_int_enable_get(); - if ((0 != (enabled & NRF_POWER_INT_POFWARN_MASK)) && - nrf_power_event_get_and_clear(NRF_POWER_EVENT_POFWARN)) - { - /* Cannot be null if event is enabled */ - ASSERT(m_pofwarn_handler != NULL); - m_pofwarn_handler(); - } -#if NRF_POWER_HAS_SLEEPEVT - if ((0 != (enabled & NRF_POWER_INT_SLEEPENTER_MASK)) && - nrf_power_event_get_and_clear(NRF_POWER_EVENT_SLEEPENTER)) - { - /* Cannot be null if event is enabled */ - ASSERT(m_sleepevt_handler != NULL); - m_sleepevt_handler(NRF_DRV_POWER_SLEEP_EVT_ENTER); - } - if ((0 != (enabled & NRF_POWER_INT_SLEEPEXIT_MASK)) && - nrf_power_event_get_and_clear(NRF_POWER_EVENT_SLEEPEXIT)) - { - /* Cannot be null if event is enabled */ - ASSERT(m_sleepevt_handler != NULL); - m_sleepevt_handler(NRF_DRV_POWER_SLEEP_EVT_EXIT); - } -#endif -#if NRF_POWER_HAS_USBREG - if ((0 != (enabled & NRF_POWER_INT_USBDETECTED_MASK)) && - nrf_power_event_get_and_clear(NRF_POWER_EVENT_USBDETECTED)) - { - /* Cannot be null if event is enabled */ - ASSERT(m_usbevt_handler != NULL); - m_usbevt_handler(NRF_DRV_POWER_USB_EVT_DETECTED); - } - if ((0 != (enabled & NRF_POWER_INT_USBREMOVED_MASK)) && - nrf_power_event_get_and_clear(NRF_POWER_EVENT_USBREMOVED)) - { - /* Cannot be null if event is enabled */ - ASSERT(m_usbevt_handler != NULL); - m_usbevt_handler(NRF_DRV_POWER_USB_EVT_REMOVED); - } - if ((0 != (enabled & NRF_POWER_INT_USBPWRRDY_MASK)) && - nrf_power_event_get_and_clear(NRF_POWER_EVENT_USBPWRRDY)) - { - /* Cannot be null if event is enabled */ - ASSERT(m_usbevt_handler != NULL); - m_usbevt_handler(NRF_DRV_POWER_USB_EVT_READY); - } -#endif -} - -#ifdef SOFTDEVICE_PRESENT - -static void nrf_drv_power_sdh_soc_evt_handler(uint32_t evt_id, void * p_context); -static void nrf_drv_power_sdh_state_evt_handler(nrf_sdh_state_evt_t state, void * p_context); - -NRF_SDH_SOC_OBSERVER(m_soc_observer, POWER_CONFIG_SOC_OBSERVER_PRIO, - nrf_drv_power_sdh_soc_evt_handler, NULL); - -NRF_SDH_STATE_OBSERVER(m_sd_observer, POWER_CONFIG_STATE_OBSERVER_PRIO) = -{ - .handler = nrf_drv_power_sdh_state_evt_handler, - .p_context = NULL -}; - -static void nrf_drv_power_sdh_soc_evt_handler(uint32_t evt_id, void * p_context) -{ - if (evt_id == NRF_EVT_POWER_FAILURE_WARNING) - { - /* Cannot be null if event is enabled */ - ASSERT(m_pofwarn_handler != NULL); - m_pofwarn_handler(); - } -} - -static void nrf_drv_power_on_sd_enable(void) -{ - ASSERT(m_initialized); /* This module has to be enabled first */ - CRITICAL_REGION_ENTER(); - if (m_pofwarn_handler != NULL) - { - (void) sd_power_pof_enable(true); - } - CRITICAL_REGION_EXIT(); -} - -static void nrf_drv_power_on_sd_disable(void) -{ - /* Reinit interrupts */ - ASSERT(m_initialized); - nrf_drv_common_irq_enable(POWER_CLOCK_IRQn, CLOCK_CONFIG_IRQ_PRIORITY); - if (m_pofwarn_handler != NULL) - { - nrf_power_int_enable(NRF_POWER_INT_POFWARN_MASK); - } -#if NRF_POWER_HAS_USBREG - if (m_usbevt_handler != NULL) - { - nrf_power_int_enable( - NRF_POWER_INT_USBDETECTED_MASK | - NRF_POWER_INT_USBREMOVED_MASK | - NRF_POWER_INT_USBPWRRDY_MASK); - } -#endif -} - -static void nrf_drv_power_sdh_state_evt_handler(nrf_sdh_state_evt_t state, void * p_context) -{ - switch (state) - { - case NRF_SDH_EVT_STATE_ENABLED: - nrf_drv_power_on_sd_enable(); - break; - - case NRF_SDH_EVT_STATE_DISABLED: - nrf_drv_power_on_sd_disable(); - break; - - default: - break; - } -} - -#endif // SOFTDEVICE_PRESENT - -#endif /* NRF_MODULE_ENABLED(POWER) */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/power/nrf_drv_power.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/power/nrf_drv_power.h deleted file mode 100644 index bb645e311f..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/power/nrf_drv_power.h +++ /dev/null @@ -1,371 +0,0 @@ -/** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifndef NRF_DRV_POWER_H__ -#define NRF_DRV_POWER_H__ - -#include -#include -#include "nrf_power.h" -#include "sdk_config.h" -#include "nrf_drv_common.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup nrf_power Power HAL and driver - * @ingroup nrf_drivers - * @brief POWER peripheral APIs. - * - * The power peripheral HAL provides basic APIs for accessing - * the registers of the POWER peripheral. - * The POWER driver provides APIs on a higher level. - */ - -/** - * @defgroup nrf_drv_power POWER driver - * @{ - * @ingroup nrf_power - * @brief Driver for managing events and the state of POWER peripheral. - * - */ - -/** - * @brief Power mode possible configurations - */ -typedef enum -{ - NRF_DRV_POWER_MODE_CONSTLAT, /**< Constant latency mode *///!< NRF_DRV_POWER_MODE_CONSTLAT - NRF_DRV_POWER_MODE_LOWPWR /**< Low power mode *///!< NRF_DRV_POWER_MODE_LOWPWR -}nrf_drv_power_mode_t; - -#if NRF_POWER_HAS_SLEEPEVT -/** - * @brief Events from power system - */ -typedef enum -{ - NRF_DRV_POWER_SLEEP_EVT_ENTER, /**< CPU entered WFI/WFE sleep - * - * Keep in mind that if this interrupt is enabled, - * it means that CPU was waken up just after WFI by this interrupt. - */ - NRF_DRV_POWER_SLEEP_EVT_EXIT /**< CPU exited WFI/WFE sleep */ -}nrf_drv_power_sleep_evt_t; -#endif /* NRF_POWER_HAS_SLEEPEVT */ - -#if NRF_POWER_HAS_USBREG -/** - * @brief Events from USB power system - */ -typedef enum -{ - NRF_DRV_POWER_USB_EVT_DETECTED, /**< USB power detected on the connector (plugged in). */ - NRF_DRV_POWER_USB_EVT_REMOVED, /**< USB power removed from the connector. */ - NRF_DRV_POWER_USB_EVT_READY /**< USB power regulator ready. */ -}nrf_drv_power_usb_evt_t; - -/** - * @brief USB power state - * - * The single enumerator that holds all data about current state of USB - * related POWER. - * - * Organized this way that higher power state has higher numeric value - */ -typedef enum -{ - NRF_DRV_POWER_USB_STATE_DISCONNECTED, /**< No power on USB lines detected */ - NRF_DRV_POWER_USB_STATE_CONNECTED, /**< The USB power is detected, but USB power regulator is not ready */ - NRF_DRV_POWER_USB_STATE_READY /**< From the power point of view USB is ready for working */ -}nrf_drv_power_usb_state_t; -#endif /* NRF_POWER_HAS_USBREG */ - -/** - * @name Callback types - * - * Defined types of callback functions - * @{ - */ -/** - * @brief Event handler for power failure warning - */ -typedef void (*nrf_drv_power_pofwarn_event_handler_t)(void); - -#if NRF_POWER_HAS_SLEEPEVT -/** - * @brief Event handler for entering/exiting sleep - * - * @param event Event type - */ -typedef void (*nrf_drv_power_sleep_event_handler_t)(nrf_drv_power_sleep_evt_t event); -#endif - -#if NRF_POWER_HAS_USBREG -/** - * @brief Event handler for USB related power events - * - * @param event Event type - */ -typedef void (*nrf_drv_power_usb_event_handler_t)(nrf_drv_power_usb_evt_t event); -#endif -/** @} */ - -/** - * @brief General power configuration - * - * Parameters required to initialize power driver. - */ -typedef struct -{ - /** - * @brief Enable main DCDC regulator - * - * This bit only informs the driver that elements for DCDC regulator - * are installed and regulator can be used. - * The regulator would be enabled or disabled automatically - * automatically by the hardware, basing on current power requirement. - */ - bool dcdcen:1; - -#if NRF_POWER_HAS_VDDH - /** - * @brief Enable HV DCDC regulator - * - * This bit only informs the driver that elements for DCDC regulator - * are installed and regulator can be used. - * The regulator would be enabled or disabled automatically - * automatically by the hardware, basing on current power requirement. - */ - bool dcdcenhv: 1; -#endif -}nrf_drv_power_config_t; - -/** - * @brief The configuration for power failure comparator - * - * Configuration used to enable and configure power failure comparator - */ -typedef struct -{ - nrf_drv_power_pofwarn_event_handler_t handler; //!< Event handler - nrf_power_pof_thr_t thr; //!< Threshold for power failure detection -#if NRF_POWER_HAS_VDDH - nrf_power_pof_thrvddh_t thrvddh; //!< Threshold for power failure detection on VDDH pin -#endif -}nrf_drv_power_pofwarn_config_t; - -#if NRF_POWER_HAS_SLEEPEVT -/** - * @brief The configuration of sleep event processing - * - * Configuration used to enable and configure sleep event handling - */ -typedef struct -{ - nrf_drv_power_sleep_event_handler_t handler; //!< Event handler - bool en_enter:1; //!< Enable event on sleep entering - bool en_exit :1; //!< Enable event on sleep exiting -}nrf_drv_power_sleepevt_config_t; -#endif - -#if NRF_POWER_HAS_USBREG -/** - * @brief The configuration of USB related power events - * - * Configuration used to enable and configure USB power event handling - */ -typedef struct -{ - nrf_drv_power_usb_event_handler_t handler; //!< Event processing -}nrf_drv_power_usbevt_config_t; -#endif /* NRF_POWER_HAS_USBREG */ - -/** - * @brief Function for checking if driver is already initialized - * - * This function is used to check whatever common POWER_CLOCK common interrupt - * should be disabled or not if @ref nrf_drv_clock tries to disable the interrupt. - * - * @retval true Driver is initialized - * @retval false Driver is uninitialized - * - * @sa nrf_drv_power_uninit - */ -bool nrf_drv_power_init_check(void); - -/** - * @brief Initialize power module driver - * - * Enabled power module driver would process all the interrupts from power system. - * - * @param[in] p_config Driver configuration. Can be NULL - the default configuration - * from @em sdk_config.h file would be used then. - * - * @retval NRF_ERROR_INVALID_STATE Power driver has to be enabled - * before SoftDevice. - * @retval NRF_ERROR_MODULE_ALREADY_INITIALIZED Module is initialized already. - * @retval NRF_SUCCESS Successfully initialized. - */ -ret_code_t nrf_drv_power_init(nrf_drv_power_config_t const * p_config); - -/** - * @brief Unintialize power module driver - * - * Disables all the interrupt handling in the module. - * - * @sa nrf_drv_power_init - */ -void nrf_drv_power_uninit(void); - -/** - * @brief Initialize power failure comparator - * - * Configures and setups the power failure comparator and enables it. - * - * @param[in] p_config Configuration with values and event handler. - * If event handler is set to NULL, interrupt would be disabled. - * - * @retval NRF_ERROR_INVALID_STATE POF is initialized when SD is enabled and - * the configuration differs from the old one and - * is not possible to be set using SD interface. - * @retval NRF_SUCCESS Successfully initialized and configured. - */ -ret_code_t nrf_drv_power_pof_init(nrf_drv_power_pofwarn_config_t const * p_config); - -/** - * @brief Turn off the power failure comparator - * - * Disables and clears the settings of the power failure comparator. - */ -void nrf_drv_power_pof_uninit(void); - -#if NRF_POWER_HAS_SLEEPEVT -/** - * @brief Initialize sleep entering and exiting events processing - * - * Configures and setups the sleep event processing. - * - * @param[in] p_config Configuration with values and event handler. - * - * @sa nrf_drv_power_sleepevt_uninit - * - * @note Sleep events are not available when SoftDevice is enabled. - * @note If sleep event is enabled when SoftDevice is initialized, sleep events - * would be automatically disabled - it is the limitation of the - * SoftDevice itself. - * - * @retval NRF_ERROR_INVALID_STATE This event cannot be initialized - * when SD is enabled. - * @retval NRF_SUCCESS Successfully initialized and configured. - */ -ret_code_t nrf_drv_power_sleepevt_init(nrf_drv_power_sleepevt_config_t const * p_config); - -/** - * @brief Uninitialize sleep entering and exiting events processing - * - * @sa nrf_drv_power_sleepevt_init - */ -void nrf_drv_power_sleepevt_uninit(void); -#endif /* NRF_POWER_HAS_SLEEPEVT */ - -#if NRF_POWER_HAS_USBREG -/** - * @brief Initialize USB power event processing - * - * Configures and setups the USB power event processing. - * - * @param[in] p_config Configuration with values and event handler. - * - * @sa nrf_drv_power_usbevt_uninit - * - * @retval NRF_ERROR_INVALID_STATE This event cannot be initialized - * when SD is enabled and SD does not support - * USB power events. - * @retval NRF_SUCCESS Successfully initialized and configured. - */ -ret_code_t nrf_drv_power_usbevt_init(nrf_drv_power_usbevt_config_t const * p_config); - -/** - * @brief Uninitalize USB power event processing - * - * @sa nrf_drv_power_usbevt_init - */ -void nrf_drv_power_usbevt_uninit(void); - -/** - * @brief Get the status of USB power - * - * @return Current USB power status - */ -__STATIC_INLINE nrf_drv_power_usb_state_t nrf_drv_power_usbstatus_get(void); - -#endif /* NRF_POWER_HAS_USBREG */ - -/** @} */ - -#ifndef SUPPRESS_INLINE_IMPLEMENTATION - -#if NRF_POWER_HAS_USBREG -__STATIC_INLINE nrf_drv_power_usb_state_t nrf_drv_power_usbstatus_get(void) -{ - uint32_t status = nrf_power_usbregstatus_get(); - if (0 == (status & NRF_POWER_USBREGSTATUS_VBUSDETECT_MASK)) - { - return NRF_DRV_POWER_USB_STATE_DISCONNECTED; - } - if (0 == (status & NRF_POWER_USBREGSTATUS_OUTPUTRDY_MASK)) - { - return NRF_DRV_POWER_USB_STATE_CONNECTED; - } - return NRF_DRV_POWER_USB_STATE_READY; -} -#endif /* NRF_POWER_HAS_USBREG */ - -#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ - - -#ifdef __cplusplus -} -#endif - -#endif /* NRF_DRV_POWER_H__ */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/ppi/nrf_drv_ppi.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/ppi/nrf_drv_ppi.c deleted file mode 100644 index 54611d809c..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/ppi/nrf_drv_ppi.c +++ /dev/null @@ -1,540 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(PPI) -#include - -#include "nrf.h" -#include "nrf_drv_ppi.h" -#include "nrf_drv_common.h" -#include "nrf_ppi.h" -#include "app_util_platform.h" - -#define NRF_LOG_MODULE_NAME ppi - -#if PPI_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL PPI_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR PPI_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR PPI_CONFIG_DEBUG_COLOR -#else //PPI_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL 0 -#endif //PPI_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); - - -static nrf_drv_state_t m_drv_state; /**< Driver state */ -static uint32_t m_channels_allocated; /**< Bitmap representing channels availability. 1 when a channel is allocated, 0 otherwise. */ -static uint8_t m_groups_allocated; /**< Bitmap representing groups availability. 1 when a group is allocated, 0 otherwise.*/ - - -/**@brief Compute a group mask (needed for driver internals, not used for NRF_PPI registers). - * @param[in] group Group number to transform to a mask. - * @retval Group mask. - */ -__STATIC_INLINE uint32_t group_to_mask(nrf_ppi_channel_group_t group) -{ - return (1uL << (uint32_t) group); -} - - -/**@brief Check whether a channel is a programmable channel and can be used by an application. - * @param[in] channel Channel to check. - * @retval true The channel is a programmable application channel. - * false The channel is used by a SoftDevice or is preprogrammed. - */ -__STATIC_INLINE bool is_programmable_app_channel(nrf_ppi_channel_t channel) -{ - return ((NRF_PPI_PROG_APP_CHANNELS_MASK & nrf_drv_ppi_channel_to_mask(channel)) != 0); -} - - -/**@brief Check whether a channels can be used by an application. - * @param[in] channel Channel mask to check. - * @retval true All specified channels can be used by an application. - * false At least one specified channel is used by a SoftDevice. - */ -__STATIC_INLINE bool are_app_channels(uint32_t channel_mask) -{ - //lint -e(587) - return ((~(NRF_PPI_ALL_APP_CHANNELS_MASK) & channel_mask) == 0); -} - - -/**@brief Check whether a channel can be used by an application. - * @param[in] channel Channel to check. - * @retval true The channel can be used by an application. - * false The channel is used by a SoftDevice. - */ -__STATIC_INLINE bool is_app_channel(nrf_ppi_channel_t channel) -{ - return are_app_channels(nrf_drv_ppi_channel_to_mask(channel)); -} - - -/**@brief Check whether a channel group can be used by an application. - * @param[in] group Group to check. - * @retval true The group is an application group. - * false The group is not an application group (this group either does not exist or - * it is used by a SoftDevice). - */ -__STATIC_INLINE bool is_app_group(nrf_ppi_channel_group_t group) -{ - return ((NRF_PPI_ALL_APP_GROUPS_MASK & group_to_mask(group)) != 0); -} - - -/**@brief Check whether a channel is allocated. - * @param[in] channel_num Channel number to check. - * @retval true The channel is allocated. - * false The channel is not allocated. - */ -__STATIC_INLINE bool is_allocated_channel(nrf_ppi_channel_t channel) -{ - return ((m_channels_allocated & nrf_drv_ppi_channel_to_mask(channel)) != 0); -} - - -/**@brief Set channel allocated indication. - * @param[in] channel_num Specifies the channel to set the "allocated" indication. - */ -__STATIC_INLINE void channel_allocated_set(nrf_ppi_channel_t channel) -{ - m_channels_allocated |= nrf_drv_ppi_channel_to_mask(channel); -} - - -/**@brief Clear channel allocated indication. - * @param[in] channel_num Specifies the channel to clear the "allocated" indication. - */ -__STATIC_INLINE void channel_allocated_clr(nrf_ppi_channel_t channel) -{ - m_channels_allocated &= ~nrf_drv_ppi_channel_to_mask(channel); -} - - -/**@brief Clear all allocated channels. - */ -__STATIC_INLINE void channel_allocated_clr_all(void) -{ - m_channels_allocated &= ~NRF_PPI_ALL_APP_CHANNELS_MASK; -} - - -/**@brief Check whether a group is allocated. - * @param[in] group_num Group number to check. - * @retval true The group is allocated. - * false The group is not allocated. - */ -__STATIC_INLINE bool is_allocated_group(nrf_ppi_channel_group_t group) -{ - return ((m_groups_allocated & group_to_mask(group)) != 0); -} - - -/**@brief Set group allocated indication. - * @param[in] group_num Specifies the group to set the "allocated" indication. - */ -__STATIC_INLINE void group_allocated_set(nrf_ppi_channel_group_t group) -{ - m_groups_allocated |= group_to_mask(group); -} - - -/**@brief Clear group allocated indication. - * @param[in] group_num Specifies the group to clear the "allocated" indication. - */ -__STATIC_INLINE void group_allocated_clr(nrf_ppi_channel_group_t group) -{ - m_groups_allocated &= ~group_to_mask(group); -} - - -/**@brief Clear all allocated groups. - */ -__STATIC_INLINE void group_allocated_clr_all() -{ - m_groups_allocated &= ~NRF_PPI_ALL_APP_GROUPS_MASK; -} - - -uint32_t nrf_drv_ppi_init(void) -{ - uint32_t err_code; - - if (m_drv_state == NRF_DRV_STATE_UNINITIALIZED) - { - m_drv_state = NRF_DRV_STATE_INITIALIZED; - err_code = NRF_SUCCESS; - } - else - { - - err_code = NRF_ERROR_MODULE_ALREADY_INITIALIZED; - } - - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -uint32_t nrf_drv_ppi_uninit(void) -{ - ret_code_t err_code = NRF_SUCCESS; - uint32_t mask = NRF_PPI_ALL_APP_GROUPS_MASK; - nrf_ppi_channel_group_t group; - - if (m_drv_state == NRF_DRV_STATE_UNINITIALIZED) - { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - m_drv_state = NRF_DRV_STATE_UNINITIALIZED; - - // Disable all channels and groups - nrf_ppi_channels_disable(NRF_PPI_ALL_APP_CHANNELS_MASK); - - for (group = NRF_PPI_CHANNEL_GROUP0; mask != 0; mask &= ~group_to_mask(group), group++) - { - if (mask & group_to_mask(group)) - { - nrf_ppi_channel_group_clear(group); - } - } - channel_allocated_clr_all(); - group_allocated_clr_all(); - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -uint32_t nrf_drv_ppi_channel_alloc(nrf_ppi_channel_t * p_channel) -{ - uint32_t err_code = NRF_SUCCESS; - nrf_ppi_channel_t channel; - uint32_t mask = 0; - - err_code = NRF_ERROR_NO_MEM; - - mask = NRF_PPI_PROG_APP_CHANNELS_MASK; - for (channel = NRF_PPI_CHANNEL0; mask != 0; mask &= ~nrf_drv_ppi_channel_to_mask(channel), channel++) - { - CRITICAL_REGION_ENTER(); - if ((mask & nrf_drv_ppi_channel_to_mask(channel)) && (!is_allocated_channel(channel))) - { - channel_allocated_set(channel); - *p_channel = channel; - err_code = NRF_SUCCESS; - } - CRITICAL_REGION_EXIT(); - if (err_code == NRF_SUCCESS) - { - NRF_LOG_INFO("Allocated channel: %d.", channel); - break; - } - } - - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -uint32_t nrf_drv_ppi_channel_free(nrf_ppi_channel_t channel) -{ - ret_code_t err_code = NRF_SUCCESS; - - if (!is_programmable_app_channel(channel)) - { - err_code = NRF_ERROR_INVALID_PARAM; - } - else - { - // First disable this channel - nrf_ppi_channel_disable(channel); - CRITICAL_REGION_ENTER(); - channel_allocated_clr(channel); - CRITICAL_REGION_EXIT(); - } - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -uint32_t nrf_drv_ppi_channel_assign(nrf_ppi_channel_t channel, uint32_t eep, uint32_t tep) -{ - VERIFY_PARAM_NOT_NULL((uint32_t *)eep); - VERIFY_PARAM_NOT_NULL((uint32_t *)tep); - - ret_code_t err_code = NRF_SUCCESS; - - if (!is_programmable_app_channel(channel)) - { - err_code = NRF_ERROR_INVALID_PARAM; - } - else if (!is_allocated_channel(channel)) - { - err_code = NRF_ERROR_INVALID_STATE; - } - else - { - nrf_ppi_channel_endpoint_setup(channel, eep, tep); - NRF_LOG_INFO("Assigned channel: %d, event end point: %x, task end point: %x.", channel, eep, tep); - } - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - -uint32_t nrf_drv_ppi_channel_fork_assign(nrf_ppi_channel_t channel, uint32_t fork_tep) -{ - ret_code_t err_code = NRF_SUCCESS; -#ifdef PPI_FEATURE_FORKS_PRESENT - if (!is_programmable_app_channel(channel)) - { - err_code = NRF_ERROR_INVALID_PARAM; - } - else if (!is_allocated_channel(channel)) - { - err_code = NRF_ERROR_INVALID_STATE; - } - else - { - nrf_ppi_fork_endpoint_setup(channel, fork_tep); - NRF_LOG_INFO("Fork assigned channel: %d, task end point: %d.", channel, fork_tep); - } - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -#else - err_code = NRF_ERROR_NOT_SUPPORTED; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -#endif -} - -uint32_t nrf_drv_ppi_channel_enable(nrf_ppi_channel_t channel) -{ - ret_code_t err_code = NRF_SUCCESS; - - if (!is_app_channel(channel)) - { - err_code = NRF_ERROR_INVALID_PARAM; - } - else if (is_programmable_app_channel(channel) && !is_allocated_channel(channel)) - { - err_code = NRF_ERROR_INVALID_STATE; - } - else - { - nrf_ppi_channel_enable(channel); - } - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -uint32_t nrf_drv_ppi_channel_disable(nrf_ppi_channel_t channel) -{ - ret_code_t err_code = NRF_SUCCESS; - - if (!is_app_channel(channel)) - { - err_code = NRF_ERROR_INVALID_PARAM; - } - else if (is_programmable_app_channel(channel) && !is_allocated_channel(channel)) - { - err_code = NRF_ERROR_INVALID_STATE; - } - else - { - nrf_ppi_channel_disable(channel); - err_code = NRF_SUCCESS; - } - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -uint32_t nrf_drv_ppi_group_alloc(nrf_ppi_channel_group_t * p_group) -{ - uint32_t err_code; - uint32_t mask = 0; - nrf_ppi_channel_group_t group; - - err_code = NRF_ERROR_NO_MEM; - - mask = NRF_PPI_ALL_APP_GROUPS_MASK; - for (group = NRF_PPI_CHANNEL_GROUP0; mask != 0; mask &= ~group_to_mask(group), group++) - { - CRITICAL_REGION_ENTER(); - if ((mask & group_to_mask(group)) && (!is_allocated_group(group))) - { - group_allocated_set(group); - *p_group = group; - err_code = NRF_SUCCESS; - } - CRITICAL_REGION_EXIT(); - if (err_code == NRF_SUCCESS) - { - NRF_LOG_INFO("Allocated group: %d.", group); - break; - } - } - - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -uint32_t nrf_drv_ppi_group_free(nrf_ppi_channel_group_t group) -{ - ret_code_t err_code = NRF_SUCCESS; - - if (!is_app_group(group)) - { - err_code = NRF_ERROR_INVALID_PARAM; - } - if (!is_allocated_group(group)) - { - err_code = NRF_ERROR_INVALID_STATE; - } - else - { - nrf_ppi_group_disable(group); - CRITICAL_REGION_ENTER(); - group_allocated_clr(group); - CRITICAL_REGION_EXIT(); - } - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -uint32_t nrf_drv_ppi_group_enable(nrf_ppi_channel_group_t group) -{ - ret_code_t err_code = NRF_SUCCESS; - - if (!is_app_group(group)) - { - err_code = NRF_ERROR_INVALID_PARAM; - } - else if (!is_allocated_group(group)) - { - err_code = NRF_ERROR_INVALID_STATE; - } - else - { - nrf_ppi_group_enable(group); - } - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -uint32_t nrf_drv_ppi_group_disable(nrf_ppi_channel_group_t group) -{ - ret_code_t err_code = NRF_SUCCESS; - - if (!is_app_group(group)) - { - err_code = NRF_ERROR_INVALID_PARAM; - } - else - { - nrf_ppi_group_disable(group); - } - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - -uint32_t nrf_drv_ppi_channels_remove_from_group(uint32_t channel_mask, - nrf_ppi_channel_group_t group) -{ - ret_code_t err_code = NRF_SUCCESS; - - if (!is_app_group(group)) - { - err_code = NRF_ERROR_INVALID_PARAM; - } - else if (!is_allocated_group(group)) - { - err_code = NRF_ERROR_INVALID_STATE; - } - else if (!are_app_channels(channel_mask)) - { - err_code = NRF_ERROR_INVALID_PARAM; - } - else - { - CRITICAL_REGION_ENTER(); - nrf_ppi_channels_remove_from_group(channel_mask, group); - CRITICAL_REGION_EXIT(); - } - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - -uint32_t nrf_drv_ppi_channels_include_in_group(uint32_t channel_mask, - nrf_ppi_channel_group_t group) -{ - ret_code_t err_code = NRF_SUCCESS; - - if (!is_app_group(group)) - { - err_code = NRF_ERROR_INVALID_PARAM; - } - else if (!is_allocated_group(group)) - { - err_code = NRF_ERROR_INVALID_STATE; - } - else if (!are_app_channels(channel_mask)) - { - err_code = NRF_ERROR_INVALID_PARAM; - } - else - { - CRITICAL_REGION_ENTER(); - nrf_ppi_channels_include_in_group(channel_mask, group); - CRITICAL_REGION_EXIT(); - } - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} -#endif //NRF_MODULE_ENABLED(PPI) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/ppi/nrf_drv_ppi.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/ppi/nrf_drv_ppi.h deleted file mode 100644 index 91fdf96a36..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/ppi/nrf_drv_ppi.h +++ /dev/null @@ -1,316 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#ifndef NRF_DRV_PPI_H -#define NRF_DRV_PPI_H - -/*lint ++flb "Enter library region" */ -#include "sdk_errors.h" -#include "nrf_ppi.h" -#include -#include - -/** @file - * - * @addtogroup nrf_ppi PPI HAL and driver - * @ingroup nrf_drivers - * @brief Programmable Peripheral Interconnect (PPI) APIs. - * - * @details The PPI HAL provides basic APIs for accessing the registers of the PPI. - * The PPI driver provides APIs on a higher level. - * - * @defgroup nrf_drv_ppi PPI driver - * @{ - * @ingroup nrf_ppi - * - * @brief Programmable Peripheral Interconnect (PPI) driver. - */ - -#include "sdk_resources.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if PPI_CH_NUM > 16 -#define NRF_PPI_ALL_APP_CHANNELS_MASK ((uint32_t)0xFFFFFFFFuL & ~(NRF_PPI_CHANNELS_USED)) /**< All PPI channels available to the application. */ -#define NRF_PPI_PROG_APP_CHANNELS_MASK ((uint32_t)0x000FFFFFuL & ~(NRF_PPI_CHANNELS_USED)) /**< Programmable PPI channels available to the application. */ -#else -#define NRF_PPI_ALL_APP_CHANNELS_MASK ((uint32_t)0xFFF0FFFFuL & ~(NRF_PPI_CHANNELS_USED)) /**< All PPI channels available to the application. */ -#define NRF_PPI_PROG_APP_CHANNELS_MASK ((uint32_t)0x0000FFFFuL & ~(NRF_PPI_CHANNELS_USED)) /**< Programmable PPI channels available to the application. */ -#endif - -#define NRF_PPI_ALL_APP_GROUPS_MASK (((1uL << PPI_GROUP_NUM) - 1) & ~(NRF_PPI_GROUPS_USED)) /**< All PPI groups available to the application. */ - - -/**@brief Function for initializing PPI module. - * - * @retval NRF_SUCCESS If the module was successfully initialized. - * @retval NRF_ERROR_MODULE_ALREADY_INITIALIZED If the module has already been initialized. - */ -uint32_t nrf_drv_ppi_init(void); - -/**@brief Function for uninitializing the PPI module. - * - * This function also disables all channels and clears the channel groups. - * - * @retval NRF_SUCCESS If the module was successfully uninitialized. - * @retval NRF_ERROR_INVALID_STATE If the module has not been initialized yet. - * @retval NRF_ERROR_INTERNAL If the channels or groups could not be disabled. - */ -uint32_t nrf_drv_ppi_uninit(void); - -/**@brief Function for allocating a PPI channel. - * @details This function allocates the first unused PPI channel. - * - * @param[out] p_channel Pointer to the PPI channel that has been allocated. - * - * @retval NRF_SUCCESS If the channel was successfully allocated. - * @retval NRF_ERROR_NO_MEM If there is no available channel to be used. - */ -uint32_t nrf_drv_ppi_channel_alloc(nrf_ppi_channel_t * p_channel); - -/**@brief Function for freeing a PPI channel. - * @details This function also disables the chosen channel. - * - * @param[in] channel PPI channel to be freed. - * - * @retval NRF_SUCCESS If the channel was successfully freed. - * @retval NRF_ERROR_INVALID_PARAM If the channel is not user-configurable. - */ -uint32_t nrf_drv_ppi_channel_free(nrf_ppi_channel_t channel); - -/**@brief Function for assigning task and event endpoints to the PPI channel. - * - * @param[in] channel PPI channel to be assigned endpoints. - * - * @param[in] eep Event endpoint address. - * - * @param[in] tep Task endpoint address. - * - * @retval NRF_SUCCESS If the channel was successfully assigned. - * @retval NRF_ERROR_INVALID_STATE If the channel is not allocated for the user. - * @retval NRF_ERROR_INVALID_PARAM If the channel is not user-configurable. - */ -uint32_t nrf_drv_ppi_channel_assign(nrf_ppi_channel_t channel, uint32_t eep, uint32_t tep); - -/**@brief Function for assigning or clearing fork endpoint to the PPI channel. - * - * @param[in] channel PPI channel to be assigned endpoints. - * - * @param[in] fork_tep Fork task endpoint address or 0 to clear. - * - * @retval NRF_SUCCESS If the channel was successfully assigned. - * @retval NRF_ERROR_INVALID_STATE If the channel is not allocated for the user. - * @retval NRF_ERROR_INVALID_PARAM If the channel is not user-configurable. - * @retval NRF_ERROR_NOT_SUPPORTED If function is not supported. - */ -uint32_t nrf_drv_ppi_channel_fork_assign(nrf_ppi_channel_t channel, uint32_t fork_tep); - -/**@brief Function for enabling a PPI channel. - * - * @param[in] channel PPI channel to be enabled. - * - * @retval NRF_SUCCESS If the channel was successfully enabled. - * @retval NRF_ERROR_INVALID_STATE If the user-configurable channel is not allocated. - * @retval NRF_ERROR_INVALID_PARAM If the channel cannot be enabled by the user. - */ -uint32_t nrf_drv_ppi_channel_enable(nrf_ppi_channel_t channel); - -/**@brief Function for disabling a PPI channel. - * - * @param[in] channel PPI channel to be disabled. - * - * @retval NRF_SUCCESS If the channel was successfully disabled. - * @retval NRF_ERROR_INVALID_STATE If the user-configurable channel is not allocated. - * @retval NRF_ERROR_INVALID_PARAM If the channel cannot be disabled by the user. - */ -uint32_t nrf_drv_ppi_channel_disable(nrf_ppi_channel_t channel); - -/**@brief Function for allocating a PPI channel group. - * @details This function allocates the first unused PPI group. - * - * @param[out] p_group Pointer to the PPI channel group that has been allocated. - * - * @retval NRF_SUCCESS If the channel group was successfully allocated. - * @retval NRF_ERROR_NO_MEM If there is no available channel group to be used. - */ -uint32_t nrf_drv_ppi_group_alloc(nrf_ppi_channel_group_t * p_group); - -/**@brief Function for freeing a PPI channel group. - * @details This function also disables the chosen group. - * - * @param[in] group PPI channel group to be freed. - * - * @retval NRF_SUCCESS If the channel group was successfully freed. - * @retval NRF_ERROR_INVALID_PARAM If the channel group is not user-configurable. - */ -uint32_t nrf_drv_ppi_group_free(nrf_ppi_channel_group_t group); - -/**@brief Compute a channel mask for NRF_PPI registers. - * - * @param[in] channel Channel number to transform to a mask. - * - * @retval Channel mask. - */ -__STATIC_INLINE uint32_t nrf_drv_ppi_channel_to_mask(nrf_ppi_channel_t channel) -{ - return (1uL << (uint32_t) channel); -} - -/**@brief Function for including multiple PPI channels in a channel group. - * - * @param[in] channel_mask PPI channels to be added. - * @param[in] group Channel group in which to include the channels. - * - * @retval NRF_SUCCESS If the channels was successfully included. - */ -uint32_t nrf_drv_ppi_channels_include_in_group(uint32_t channel_mask, - nrf_ppi_channel_group_t group); - -/**@brief Function for including a PPI channel in a channel group. - * - * @param[in] channel PPI channel to be added. - * @param[in] group Channel group in which to include the channel. - * - * @retval NRF_SUCCESS If the channel was successfully included. - */ -__STATIC_INLINE uint32_t nrf_drv_ppi_channel_include_in_group(nrf_ppi_channel_t channel, - nrf_ppi_channel_group_t group) -{ - return nrf_drv_ppi_channels_include_in_group(nrf_drv_ppi_channel_to_mask(channel), group); -} - -/**@brief Function for removing multiple PPI channels from a channel group. - * - * @param[in] channel_mask PPI channels to be removed. - * @param[in] group Channel group from which to remove the channels. - * - * @retval NRF_SUCCESS If the channel was successfully removed. - */ -uint32_t nrf_drv_ppi_channels_remove_from_group(uint32_t channel_mask, - nrf_ppi_channel_group_t group); - -/**@brief Function for removing a PPI channel from a channel group. - * - * @param[in] channel PPI channel to be removed. - * @param[in] group Channel group from which to remove the channel. - * - * @retval NRF_SUCCESS If the channel was successfully removed. - */ -__STATIC_INLINE uint32_t nrf_drv_ppi_channel_remove_from_group(nrf_ppi_channel_t channel, - nrf_ppi_channel_group_t group) -{ - return nrf_drv_ppi_channels_remove_from_group(nrf_drv_ppi_channel_to_mask(channel), group); -} - -/**@brief Function for clearing a PPI channel group. - * - * @param[in] group Channel group to be cleared. - * - * @retval NRF_SUCCESS If the group was successfully cleared. - */ -__STATIC_INLINE uint32_t nrf_drv_ppi_group_clear(nrf_ppi_channel_group_t group) -{ - return nrf_drv_ppi_channels_remove_from_group(NRF_PPI_ALL_APP_CHANNELS_MASK, group); -} - -/**@brief Function for enabling a PPI channel group. - * - * @param[in] group Channel group to be enabled. - * - * @retval NRF_SUCCESS If the group was successfully enabled. - */ -uint32_t nrf_drv_ppi_group_enable(nrf_ppi_channel_group_t group); - -/**@brief Function for disabling a PPI channel group. - * - * @param[in] group Channel group to be disabled. - * - * @retval NRF_SUCCESS If the group was successfully disabled. - */ -uint32_t nrf_drv_ppi_group_disable(nrf_ppi_channel_group_t group); - -/** - * @brief Function for getting the address of a PPI task. - * - * @param[in] task Task. - * - * @retval Task address. - */ -__STATIC_INLINE uint32_t nrf_drv_ppi_task_addr_get(nrf_ppi_task_t task) -{ - return (uint32_t) nrf_ppi_task_address_get(task); -} - -/** - * @brief Function for getting the address of a PPI group enable task. - * - * @param[in] group PPI channel group - * - * @retval Task address. - */ -__STATIC_INLINE uint32_t nrf_drv_ppi_task_addr_group_enable_get(nrf_ppi_channel_group_t group) -{ - return (uint32_t) nrf_ppi_task_group_enable_address_get(group); -} - -/** - * @brief Function for getting the address of a PPI group enable task. - * - * @param[in] group PPI channel group - * - * @retval Task address. - */ -__STATIC_INLINE uint32_t nrf_drv_ppi_task_addr_group_disable_get(nrf_ppi_channel_group_t group) -{ - return (uint32_t) nrf_ppi_task_group_disable_address_get(group); -} - -/** - *@} - **/ - -/*lint --flb "Leave library region" */ - -#ifdef __cplusplus -} -#endif - -#endif // NRF_DRV_PPI_H diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/pwm/nrf_drv_pwm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/pwm/nrf_drv_pwm.h deleted file mode 100644 index a5cece0c66..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/pwm/nrf_drv_pwm.h +++ /dev/null @@ -1,512 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/**@file - * @addtogroup nrf_pwm PWM HAL and driver - * @ingroup nrf_drivers - * @brief @tagAPI52 Pulse Width Modulation (PWM) module APIs. - * - * @defgroup nrf_drv_pwm PWM driver - * @{ - * @ingroup nrf_pwm - * @brief @tagAPI52 Pulse Width Modulation (PWM) module driver. - */ - - -#ifndef NRF_DRV_PWM_H__ -#define NRF_DRV_PWM_H__ - -#include "nordic_common.h" -#include "sdk_config.h" -#include "nrf_pwm.h" -#include "sdk_errors.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef PWM0_ENABLED -#define PWM0_ENABLED 0 -#endif -#ifndef PWM1_ENABLED -#define PWM1_ENABLED 0 -#endif -#ifndef PWM2_ENABLED -#define PWM2_ENABLED 0 -#endif -#ifndef PWM3_ENABLED -#define PWM3_ENABLED 0 -#endif -/** - * @brief PWM driver instance data structure. - */ -typedef struct -{ - NRF_PWM_Type * p_registers; ///< Pointer to the structure with PWM peripheral instance registers. - uint8_t drv_inst_idx; ///< Driver instance index. -} nrf_drv_pwm_t; - -#define PWM0_INSTANCE_INDEX 0 -#define PWM1_INSTANCE_INDEX PWM0_INSTANCE_INDEX+PWM0_ENABLED -#define PWM2_INSTANCE_INDEX PWM1_INSTANCE_INDEX+PWM1_ENABLED -#define PWM3_INSTANCE_INDEX PWM2_INSTANCE_INDEX+PWM2_ENABLED - -/** - * @brief Macro for creating a PWM driver instance. - */ -#define NRF_DRV_PWM_INSTANCE(id) \ -{ \ - .p_registers = CONCAT_2(NRF_PWM, id), \ - .drv_inst_idx = CONCAT_3(PWM, id, _INSTANCE_INDEX), \ -} - - -/** - * @brief This value can be provided instead of a pin number for any channel - * to specify that its output is not used and therefore does not need - * to be connected to a pin. - */ -#define NRF_DRV_PWM_PIN_NOT_USED 0xFF - -/** - * @brief This value can be added to a pin number to inverse its polarity - * (set idle state = 1). - */ -#define NRF_DRV_PWM_PIN_INVERTED 0x80 - -/** - * @brief PWM driver configuration structure. - */ -typedef struct -{ - uint8_t output_pins[NRF_PWM_CHANNEL_COUNT]; ///< Pin numbers for individual output channels (optional). - /**< Use @ref NRF_DRV_PWM_PIN_NOT_USED - * if a given output channel is not needed. */ - uint8_t irq_priority; ///< Interrupt priority. - nrf_pwm_clk_t base_clock; ///< Base clock frequency. - nrf_pwm_mode_t count_mode; ///< Operating mode of the pulse generator counter. - uint16_t top_value; ///< Value up to which the pulse generator counter counts. - nrf_pwm_dec_load_t load_mode; ///< Mode of loading sequence data from RAM. - nrf_pwm_dec_step_t step_mode; ///< Mode of advancing the active sequence. -} nrf_drv_pwm_config_t; - -/** - * @brief PWM driver default configuration. - */ -#define NRF_DRV_PWM_DEFAULT_CONFIG \ -{ \ - .output_pins = {PWM_DEFAULT_CONFIG_OUT0_PIN, \ - PWM_DEFAULT_CONFIG_OUT1_PIN, \ - PWM_DEFAULT_CONFIG_OUT2_PIN, \ - PWM_DEFAULT_CONFIG_OUT3_PIN }, \ - .irq_priority = PWM_DEFAULT_CONFIG_IRQ_PRIORITY, \ - .base_clock = (nrf_pwm_clk_t)PWM_DEFAULT_CONFIG_BASE_CLOCK, \ - .count_mode = (nrf_pwm_mode_t)PWM_DEFAULT_CONFIG_COUNT_MODE, \ - .top_value = PWM_DEFAULT_CONFIG_TOP_VALUE, \ - .load_mode = (nrf_pwm_dec_load_t)PWM_DEFAULT_CONFIG_LOAD_MODE, \ - .step_mode = (nrf_pwm_dec_step_t)PWM_DEFAULT_CONFIG_STEP_MODE, \ -} - - -/** - * @brief PWM flags providing additional playback options. - */ -typedef enum -{ - NRF_DRV_PWM_FLAG_STOP = 0x01, /**< When the requested playback is finished, - the peripheral should be stopped. - @note The STOP task is triggered when - the last value of the final sequence is - loaded from RAM, and the peripheral stops - at the end of the current PWM period. - For sequences with configured repeating - of duty cycle values, this might result in - less than the requested number of repeats - of the last value. */ - NRF_DRV_PWM_FLAG_LOOP = 0x02, /**< When the requested playback is finished, - it should be started from the beginning. - This flag is ignored if used together - with @ref NRF_DRV_PWM_FLAG_STOP. - @note The playback restart is done via a - shortcut configured in the PWM peripheral. - This shortcut triggers the proper starting - task when the final value of previous - playback is read from RAM and applied to - the pulse generator counter. - When this mechanism is used together with - the @ref NRF_PWM_STEP_TRIGGERED mode, - the playback restart will occur right - after switching to the final value (this - final value will be played only once). */ - NRF_DRV_PWM_FLAG_SIGNAL_END_SEQ0 = 0x04, /**< The event handler should be - called when the last value - from sequence 0 is loaded. */ - NRF_DRV_PWM_FLAG_SIGNAL_END_SEQ1 = 0x08, /**< The event handler should be - called when the last value - from sequence 1 is loaded. */ - NRF_DRV_PWM_FLAG_NO_EVT_FINISHED = 0x10, /**< The playback finished event - (enabled by default) should be - suppressed. */ - NRF_DRV_PWM_FLAG_START_VIA_TASK = 0x80, /**< The playback should not be - started directly by the called - function. Instead, the function - should only prepare it and - return the address of the task - to be triggered to start the - playback. */ -} nrf_drv_pwm_flag_t; - - -/** - * @brief PWM driver event type. - */ -typedef enum -{ - NRF_DRV_PWM_EVT_FINISHED, ///< Sequence playback finished. - NRF_DRV_PWM_EVT_END_SEQ0, /**< End of sequence 0 reached. Its data can be - safely modified now. */ - NRF_DRV_PWM_EVT_END_SEQ1, /**< End of sequence 1 reached. Its data can be - safely modified now. */ - NRF_DRV_PWM_EVT_STOPPED, ///< The PWM peripheral has been stopped. -} nrf_drv_pwm_evt_type_t; - -/** - * @brief PWM driver event handler type. - */ -typedef void (* nrf_drv_pwm_handler_t)(nrf_drv_pwm_evt_type_t event_type); - - -/** - * @brief Function for initializing the PWM driver. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_config Pointer to the structure with initial configuration. - * - * @param[in] handler Event handler provided by the user. If NULL is passed - * instead, event notifications are not done and PWM - * interrupts are disabled. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the driver was already initialized. - */ -ret_code_t nrf_drv_pwm_init(nrf_drv_pwm_t const * const p_instance, - nrf_drv_pwm_config_t const * p_config, - nrf_drv_pwm_handler_t handler); - -/** - * @brief Function for uninitializing the PWM driver. - * - * If any sequence playback is in progress, it is stopped immediately. - * - * @param[in] p_instance Pointer to the driver instance structure. - */ -void nrf_drv_pwm_uninit(nrf_drv_pwm_t const * const p_instance); - -/** - * @brief Function for starting a single sequence playback. - * - * To take advantage of the looping mechanism in the PWM peripheral, both - * sequences must be used (single sequence can be played back only once by - * the peripheral). Therefore, the provided sequence is internally set and - * played back as both sequence 0 and sequence 1. Consequently, if end of - * sequence notifications are required, events for both sequences should be - * used (that means that both the @ref NRF_DRV_PWM_FLAG_SIGNAL_END_SEQ0 flag - * and the @ref NRF_DRV_PWM_FLAG_SIGNAL_END_SEQ1 flag should be specified and - * the @ref NRF_DRV_PWM_EVT_END_SEQ0 event and the @ref NRF_DRV_PWM_EVT_END_SEQ1 - * event should be handled in the same way). - * - * Use the @ref NRF_DRV_PWM_FLAG_START_VIA_TASK flag if you want the playback - * to be only prepared by this function, and you want to start it later by - * triggering a task (using PPI for instance). The function will then return - * the address of the task to be triggered. - * - * @note The array containing the duty cycle values for the specified sequence - * must be in RAM and cannot be allocated on stack. - * For detailed information, see @ref nrf_pwm_sequence_t. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_sequence Sequence to be played back. - * @param[in] playback_count Number of playbacks to be performed (must not be 0). - * @param[in] flags Additional options. Pass any combination of - * @ref nrf_drv_pwm_flag_t "playback flags", or 0 - * for default settings. - * - * @return Address of the task to be triggered to start the playback if the @ref - * NRF_DRV_PWM_FLAG_START_VIA_TASK flag was used, 0 otherwise. - */ -uint32_t nrf_drv_pwm_simple_playback(nrf_drv_pwm_t const * const p_instance, - nrf_pwm_sequence_t const * p_sequence, - uint16_t playback_count, - uint32_t flags); - -/** - * @brief Function for starting a two-sequence playback. - * - * Use the @ref NRF_DRV_PWM_FLAG_START_VIA_TASK flag if you want the playback - * to be only prepared by this function, and you want to start it later by - * triggering a task (using PPI for instance). The function will then return - * the address of the task to be triggered. - * - * @note The array containing the duty cycle values for the specified sequence - * must be in RAM and cannot be allocated on stack. - * For detailed information, see @ref nrf_pwm_sequence_t. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_sequence_0 First sequence to be played back. - * @param[in] p_sequence_1 Second sequence to be played back. - * @param[in] playback_count Number of playbacks to be performed (must not be 0). - * @param[in] flags Additional options. Pass any combination of - * @ref nrf_drv_pwm_flag_t "playback flags", or 0 - * for default settings. - * - * @return Address of the task to be triggered to start the playback if the @ref - * NRF_DRV_PWM_FLAG_START_VIA_TASK flag was used, 0 otherwise. - */ -uint32_t nrf_drv_pwm_complex_playback(nrf_drv_pwm_t const * const p_instance, - nrf_pwm_sequence_t const * p_sequence_0, - nrf_pwm_sequence_t const * p_sequence_1, - uint16_t playback_count, - uint32_t flags); - -/** - * @brief Function for advancing the active sequence. - * - * This function only applies to @ref NRF_PWM_STEP_TRIGGERED mode. - * - * @param[in] p_instance Pointer to the driver instance structure. - */ -__STATIC_INLINE void nrf_drv_pwm_step(nrf_drv_pwm_t const * const p_instance); - -/** - * @brief Function for stopping the sequence playback. - * - * The playback is stopped at the end of the current PWM period. - * This means that if the active sequence is configured to repeat each duty - * cycle value for a certain number of PWM periods, the last played value - * might appear on the output less times than requested. - * - * @note This function can be instructed to wait until the playback is stopped - * (by setting @p wait_until_stopped to true). Note that, depending on - * the length of the PMW period, this might take a significant amount of - * time. Alternatively, the @ref nrf_drv_pwm_is_stopped function can be - * used to poll the status, or the @ref NRF_DRV_PWM_EVT_STOPPED event can - * be used to get the notification when the playback is stopped, provided - * the event handler is defined. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] wait_until_stopped If true, the function will not return until - * the playback is stopped. - * - * @retval true If the PWM peripheral is stopped. - * @retval false If the PWM peripheral is not stopped. - */ -bool nrf_drv_pwm_stop(nrf_drv_pwm_t const * const p_instance, - bool wait_until_stopped); - -/** - * @brief Function for checking the status of the PWM peripheral. - * - * @param[in] p_instance Pointer to the driver instance structure. - * - * @retval true If the PWM peripheral is stopped. - * @retval false If the PWM peripheral is not stopped. - */ -bool nrf_drv_pwm_is_stopped(nrf_drv_pwm_t const * const p_instance); - -/** - * @brief Function for updating the sequence data during playback. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] seq_id Identifier of the sequence (0 or 1). - * @param[in] p_sequence Pointer to the new sequence definition. - */ -__STATIC_INLINE void nrf_drv_pwm_sequence_update( - nrf_drv_pwm_t const * const p_instance, - uint8_t seq_id, - nrf_pwm_sequence_t const * p_sequence); - -/** - * @brief Function for updating the pointer to the duty cycle values - * in the specified sequence during playback. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] seq_id Identifier of the sequence (0 or 1). - * @param[in] values New pointer to the duty cycle values. - */ -__STATIC_INLINE void nrf_drv_pwm_sequence_values_update( - nrf_drv_pwm_t const * const p_instance, - uint8_t seq_id, - nrf_pwm_values_t values); - -/** - * @brief Function for updating the number of duty cycle values - * in the specified sequence during playback. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] seq_id Identifier of the sequence (0 or 1). - * @param[in] length New number of the duty cycle values. - */ -__STATIC_INLINE void nrf_drv_pwm_sequence_length_update( - nrf_drv_pwm_t const * const p_instance, - uint8_t seq_id, - uint16_t length); - -/** - * @brief Function for updating the number of repeats for duty cycle values - * in specified sequence during playback. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] seq_id Identifier of the sequence (0 or 1). - * @param[in] repeats New number of repeats. - */ -__STATIC_INLINE void nrf_drv_pwm_sequence_repeats_update( - nrf_drv_pwm_t const * const p_instance, - uint8_t seq_id, - uint32_t repeats); - -/** - * @brief Function for updating the additional delay after the specified - * sequence during playback. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] seq_id Identifier of the sequence (0 or 1). - * @param[in] end_delay New end delay value (in PWM periods). - */ -__STATIC_INLINE void nrf_drv_pwm_sequence_end_delay_update( - nrf_drv_pwm_t const * const p_instance, - uint8_t seq_id, - uint32_t end_delay); - -/** - * @brief Function for returning the address of a specified PWM task that can - * be used in PPI module. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] task Requested task. - * - * @return Task address. - */ -__STATIC_INLINE uint32_t nrf_drv_pwm_task_address_get( - nrf_drv_pwm_t const * const p_instance, - nrf_pwm_task_t task); - -/**@brief Function for returning the address of a specified PWM event that can - * be used in PPI module. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] event Requested event. - * - * @return Event address. - */ -__STATIC_INLINE uint32_t nrf_drv_pwm_event_address_get( - nrf_drv_pwm_t const * const p_instance, - nrf_pwm_event_t event); - - -#ifndef SUPPRESS_INLINE_IMPLEMENTATION - -__STATIC_INLINE void nrf_drv_pwm_step(nrf_drv_pwm_t const * const p_instance) -{ - nrf_pwm_task_trigger(p_instance->p_registers, NRF_PWM_TASK_NEXTSTEP); -} - -__STATIC_INLINE void nrf_drv_pwm_sequence_update( - nrf_drv_pwm_t const * const p_instance, - uint8_t seq_id, - nrf_pwm_sequence_t const * p_sequence) -{ - nrf_pwm_sequence_set(p_instance->p_registers, seq_id, p_sequence); -} - -__STATIC_INLINE void nrf_drv_pwm_sequence_values_update( - nrf_drv_pwm_t const * const p_instance, - uint8_t seq_id, - nrf_pwm_values_t values) -{ - nrf_pwm_seq_ptr_set(p_instance->p_registers, seq_id, values.p_raw); -} - -__STATIC_INLINE void nrf_drv_pwm_sequence_length_update( - nrf_drv_pwm_t const * const p_instance, - uint8_t seq_id, - uint16_t length) -{ - nrf_pwm_seq_cnt_set(p_instance->p_registers, seq_id, length); -} - -__STATIC_INLINE void nrf_drv_pwm_sequence_repeats_update( - nrf_drv_pwm_t const * const p_instance, - uint8_t seq_id, - uint32_t repeats) -{ - nrf_pwm_seq_refresh_set(p_instance->p_registers, seq_id, repeats); -} - -__STATIC_INLINE void nrf_drv_pwm_sequence_end_delay_update( - nrf_drv_pwm_t const * const p_instance, - uint8_t seq_id, - uint32_t end_delay) -{ - nrf_pwm_seq_end_delay_set(p_instance->p_registers, seq_id, end_delay); -} - -__STATIC_INLINE uint32_t nrf_drv_pwm_task_address_get( - nrf_drv_pwm_t const * const p_instance, - nrf_pwm_task_t task) -{ - return nrf_pwm_task_address_get(p_instance->p_registers, task); -} - -__STATIC_INLINE uint32_t nrf_drv_pwm_event_address_get( - nrf_drv_pwm_t const * const p_instance, - nrf_pwm_event_t event) -{ - return nrf_pwm_event_address_get(p_instance->p_registers, event); -} - -#endif // SUPPRESS_INLINE_IMPLEMENTATION - - -#ifdef __cplusplus -} -#endif - -#endif // NRF_DRV_PWM_H__ - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/qdec/nrf_drv_qdec.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/qdec/nrf_drv_qdec.h deleted file mode 100644 index 8327d287b1..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/qdec/nrf_drv_qdec.h +++ /dev/null @@ -1,185 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#ifndef NRF_DRV_QDEC_H__ -#define NRF_DRV_QDEC_H__ - -#include "nrf_qdec.h" -#include "sdk_config.h" -#include "sdk_errors.h" -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @addtogroup nrf_qdec QDEC HAL and driver - * @ingroup nrf_drivers - * @brief Quadrature decoder (QDEC) APIs. - * @details The QDEC HAL provides basic APIs for accessing the registers of the QDEC. - * The QDEC driver provides APIs on a higher level. - * - * @defgroup nrf_drv_qdec QDEC driver - * @{ - * @ingroup nrf_qdec - * @brief Quadrature decoder (QDEC) driver. - */ - -/**@brief QDEC configuration structure.*/ -typedef struct -{ - nrf_qdec_reportper_t reportper; /**< Report period in samples. */ - nrf_qdec_sampleper_t sampleper; /**< Sampling period in microseconds. */ - uint32_t psela; /**< Pin number for A input. */ - uint32_t pselb; /**< Pin number for B input. */ - uint32_t pselled; /**< Pin number for LED output. */ - uint32_t ledpre; /**< Time (in microseconds) how long LED is switched on before sampling. */ - nrf_qdec_ledpol_t ledpol; /**< Active LED polarity. */ - bool dbfen; /**< State of debouncing filter. */ - bool sample_inten; /**< Enabling sample ready interrupt. */ - uint8_t interrupt_priority; /**< QDEC interrupt priority. */ -} nrf_drv_qdec_config_t; - -/**@brief QDEC default configuration. */ -#define NRF_DRV_QDEC_DEFAULT_CONFIG \ - { \ - .reportper = (nrf_qdec_reportper_t)QDEC_CONFIG_REPORTPER, \ - .sampleper = (nrf_qdec_sampleper_t)QDEC_CONFIG_SAMPLEPER, \ - .psela = QDEC_CONFIG_PIO_A, \ - .pselb = QDEC_CONFIG_PIO_B, \ - .pselled = QDEC_CONFIG_PIO_LED, \ - .ledpre = QDEC_CONFIG_LEDPRE, \ - .ledpol = (nrf_qdec_ledpol_t)QDEC_CONFIG_LEDPOL, \ - .interrupt_priority = QDEC_CONFIG_IRQ_PRIORITY, \ - .dbfen = QDEC_CONFIG_DBFEN, \ - .sample_inten = QDEC_CONFIG_SAMPLE_INTEN \ - } - -/**@brief QDEC sample event data.*/ -typedef struct -{ - int8_t value; /**< Sample value. */ -} nrf_drv_qdec_sample_data_evt_t; - -/**@brief QDEC report event data.*/ -typedef struct -{ - int16_t acc; /**< Accumulated transitions. */ - uint16_t accdbl; /**< Accumulated double transitions. */ -} nrf_drv_qdec_report_data_evt_t; - -/**@brief QDEC event handler structure. */ -typedef struct -{ - nrf_qdec_event_t type; - union - { - nrf_drv_qdec_sample_data_evt_t sample; /**< Sample event data. */ - nrf_drv_qdec_report_data_evt_t report; /**< Report event data. */ - } data; -} nrf_drv_qdec_event_t; - -/**@brief QDEC event handler. - * @param[in] event QDEC event structure. - */ -typedef void (*qdec_event_handler_t)(nrf_drv_qdec_event_t event); - -/**@brief Function for initializing QDEC. - * - * @param[in] p_config Pointer to configuration parameters. - * @param[in] event_handler Event handler function. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_PARAM If invalid parameters were supplied. - * @retval NRF_ERROR_INVALID_STATE If QDEC was already initialized. - */ -ret_code_t nrf_drv_qdec_init(nrf_drv_qdec_config_t const * p_config, - qdec_event_handler_t event_handler); - -/**@brief Function for uninitializing QDEC. - * @note Function asserts if module is uninitialized. - */ -void nrf_drv_qdec_uninit(void); - -/**@brief Function for enabling QDEC. - * @note Function asserts if module is uninitialized or enabled. - */ -void nrf_drv_qdec_enable(void); - -/**@brief Function for disabling QDEC. - * @note Function asserts if module is uninitialized or disabled. - */ -void nrf_drv_qdec_disable(void); - -/**@brief Function for reading accumulated transitions QDEC. - * @note Function asserts if module is not enabled. - * @note Accumulators are cleared after reading. - * - * @param[out] p_acc Pointer to store accumulated transitions. - * @param[out] p_accdbl Pointer to store accumulated double transitions. - */ -void nrf_drv_qdec_accumulators_read(int16_t * p_acc, int16_t * p_accdbl); - -/** - * @brief Function for returning the address of a specific timer task. - * - * @param[in] task QDEC task. - * @param[out] p_task Task address. - */ -void nrf_drv_qdec_task_address_get(nrf_qdec_task_t task, uint32_t * p_task); - -/** - * @brief Function for returning the address of a specific timer event. - * - * @param[in] event QDEC event. - * @param[out] p_event Event address. - */ -void nrf_drv_qdec_event_address_get(nrf_qdec_event_t event, uint32_t * p_event); - -/** - *@} - **/ - -#ifdef __cplusplus -} -#endif - -#endif /* NRF_DRV_QDEC_H__ */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/radio_config/radio_config.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/radio_config/radio_config.c deleted file mode 100644 index 5f529a7db7..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/radio_config/radio_config.c +++ /dev/null @@ -1,188 +0,0 @@ -/** - * Copyright (c) 2009 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/** @file -* @addtogroup nrf_dev_radio_rx_example_main nrf_dev_radio_tx_example_main -* @{ -*/ - -#include "radio_config.h" -#include "nrf_delay.h" - -/* These are set to zero as ShockBurst packets don't have corresponding fields. */ -#define PACKET_S1_FIELD_SIZE (0UL) /**< Packet S1 field size in bits. */ -#define PACKET_S0_FIELD_SIZE (0UL) /**< Packet S0 field size in bits. */ -#define PACKET_LENGTH_FIELD_SIZE (0UL) /**< Packet length field size in bits. */ - -/** - * @brief Function for swapping/mirroring bits in a byte. - * - *@verbatim - * output_bit_7 = input_bit_0 - * output_bit_6 = input_bit_1 - * : - * output_bit_0 = input_bit_7 - *@endverbatim - * - * @param[in] inp is the input byte to be swapped. - * - * @return - * Returns the swapped/mirrored input byte. - */ -static uint32_t swap_bits(uint32_t inp); - -/** - * @brief Function for swapping bits in a 32 bit word for each byte individually. - * - * The bits are swapped as follows: - * @verbatim - * output[31:24] = input[24:31] - * output[23:16] = input[16:23] - * output[15:8] = input[8:15] - * output[7:0] = input[0:7] - * @endverbatim - * @param[in] input is the input word to be swapped. - * - * @return - * Returns the swapped input byte. - */ -static uint32_t bytewise_bitswap(uint32_t inp); - -static uint32_t swap_bits(uint32_t inp) -{ - uint32_t i; - uint32_t retval = 0; - - inp = (inp & 0x000000FFUL); - - for (i = 0; i < 8; i++) - { - retval |= ((inp >> i) & 0x01) << (7 - i); - } - - return retval; -} - - -static uint32_t bytewise_bitswap(uint32_t inp) -{ - return (swap_bits(inp >> 24) << 24) - | (swap_bits(inp >> 16) << 16) - | (swap_bits(inp >> 8) << 8) - | (swap_bits(inp)); -} - - -/** - * @brief Function for configuring the radio to operate in ShockBurst compatible mode. - * - * To configure the application running on nRF24L series devices: - * - * @verbatim - * uint8_t tx_address[5] = { 0xC0, 0x01, 0x23, 0x45, 0x67 }; - * hal_nrf_set_rf_channel(7); - * hal_nrf_set_address_width(HAL_NRF_AW_5BYTES); - * hal_nrf_set_address(HAL_NRF_TX, tx_address); - * hal_nrf_set_address(HAL_NRF_PIPE0, tx_address); - * hal_nrf_open_pipe(0, false); - * hal_nrf_set_datarate(HAL_NRF_1MBPS); - * hal_nrf_set_crc_mode(HAL_NRF_CRC_16BIT); - * hal_nrf_setup_dynamic_payload(0xFF); - * hal_nrf_enable_dynamic_payload(false); - * @endverbatim - * - * When transmitting packets with hal_nrf_write_tx_payload(const uint8_t *tx_pload, uint8_t length), - * match the length with PACKET_STATIC_LENGTH. - * hal_nrf_write_tx_payload(payload, PACKET_STATIC_LENGTH); - * -*/ -void radio_configure() -{ - // Radio config - NRF_RADIO->TXPOWER = (RADIO_TXPOWER_TXPOWER_0dBm << RADIO_TXPOWER_TXPOWER_Pos); - NRF_RADIO->FREQUENCY = 7UL; // Frequency bin 7, 2407MHz - NRF_RADIO->MODE = (RADIO_MODE_MODE_Nrf_1Mbit << RADIO_MODE_MODE_Pos); - - // Radio address config - NRF_RADIO->PREFIX0 = - ((uint32_t)swap_bits(0xC3) << 24) // Prefix byte of address 3 converted to nRF24L series format - | ((uint32_t)swap_bits(0xC2) << 16) // Prefix byte of address 2 converted to nRF24L series format - | ((uint32_t)swap_bits(0xC1) << 8) // Prefix byte of address 1 converted to nRF24L series format - | ((uint32_t)swap_bits(0xC0) << 0); // Prefix byte of address 0 converted to nRF24L series format - - NRF_RADIO->PREFIX1 = - ((uint32_t)swap_bits(0xC7) << 24) // Prefix byte of address 7 converted to nRF24L series format - | ((uint32_t)swap_bits(0xC6) << 16) // Prefix byte of address 6 converted to nRF24L series format - | ((uint32_t)swap_bits(0xC4) << 0); // Prefix byte of address 4 converted to nRF24L series format - - NRF_RADIO->BASE0 = bytewise_bitswap(0x01234567UL); // Base address for prefix 0 converted to nRF24L series format - NRF_RADIO->BASE1 = bytewise_bitswap(0x89ABCDEFUL); // Base address for prefix 1-7 converted to nRF24L series format - - NRF_RADIO->TXADDRESS = 0x00UL; // Set device address 0 to use when transmitting - NRF_RADIO->RXADDRESSES = 0x01UL; // Enable device address 0 to use to select which addresses to receive - - // Packet configuration - NRF_RADIO->PCNF0 = (PACKET_S1_FIELD_SIZE << RADIO_PCNF0_S1LEN_Pos) | - (PACKET_S0_FIELD_SIZE << RADIO_PCNF0_S0LEN_Pos) | - (PACKET_LENGTH_FIELD_SIZE << RADIO_PCNF0_LFLEN_Pos); //lint !e845 "The right argument to operator '|' is certain to be 0" - - // Packet configuration - NRF_RADIO->PCNF1 = (RADIO_PCNF1_WHITEEN_Disabled << RADIO_PCNF1_WHITEEN_Pos) | - (RADIO_PCNF1_ENDIAN_Big << RADIO_PCNF1_ENDIAN_Pos) | - (PACKET_BASE_ADDRESS_LENGTH << RADIO_PCNF1_BALEN_Pos) | - (PACKET_STATIC_LENGTH << RADIO_PCNF1_STATLEN_Pos) | - (PACKET_PAYLOAD_MAXSIZE << RADIO_PCNF1_MAXLEN_Pos); //lint !e845 "The right argument to operator '|' is certain to be 0" - - // CRC Config - NRF_RADIO->CRCCNF = (RADIO_CRCCNF_LEN_Two << RADIO_CRCCNF_LEN_Pos); // Number of checksum bits - if ((NRF_RADIO->CRCCNF & RADIO_CRCCNF_LEN_Msk) == (RADIO_CRCCNF_LEN_Two << RADIO_CRCCNF_LEN_Pos)) - { - NRF_RADIO->CRCINIT = 0xFFFFUL; // Initial value - NRF_RADIO->CRCPOLY = 0x11021UL; // CRC poly: x^16 + x^12^x^5 + 1 - } - else if ((NRF_RADIO->CRCCNF & RADIO_CRCCNF_LEN_Msk) == (RADIO_CRCCNF_LEN_One << RADIO_CRCCNF_LEN_Pos)) - { - NRF_RADIO->CRCINIT = 0xFFUL; // Initial value - NRF_RADIO->CRCPOLY = 0x107UL; // CRC poly: x^8 + x^2^x^1 + 1 - } -} - -/** - * @} - */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/rtc/nrf_drv_rtc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/rtc/nrf_drv_rtc.c deleted file mode 100644 index 551580f71e..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/rtc/nrf_drv_rtc.c +++ /dev/null @@ -1,356 +0,0 @@ -/** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(RTC) -#define ENABLED_RTC_COUNT (RTC0_ENABLED+RTC1_ENABLED+RTC2_ENABLED) -#if ENABLED_RTC_COUNT - -#include "nrf_drv_rtc.h" -#include "nrf_rtc.h" -#include "nrf_assert.h" -#include "app_util_platform.h" - -#define NRF_LOG_MODULE_NAME rtc - -#if RTC_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL RTC_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR RTC_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR RTC_CONFIG_DEBUG_COLOR -#define EVT_TO_STR(event) (event == NRF_RTC_EVENT_TICK ? "NRF_RTC_EVENT_TICK" : \ - (event == NRF_RTC_EVENT_OVERFLOW ? "NRF_RTC_EVENT_OVERFLOW" : \ - (event == NRF_RTC_EVENT_COMPARE_0 ? "NRF_RTC_EVENT_COMPARE_0" : \ - (event == NRF_RTC_EVENT_COMPARE_1 ? "NRF_RTC_EVENT_COMPARE_1" : \ - (event == NRF_RTC_EVENT_COMPARE_2 ? "NRF_RTC_EVENT_COMPARE_2" : \ - (event == NRF_RTC_EVENT_COMPARE_3 ? "NRF_RTC_EVENT_COMPARE_3" : "UNKNOWN EVENT") -#else //RTC_CONFIG_LOG_ENABLED -#define EVT_TO_STR(event) "" -#define NRF_LOG_LEVEL 0 -#endif //RTC_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); - -/**@brief RTC driver instance control block structure. */ -typedef struct -{ - nrf_drv_state_t state; /**< Instance state. */ - bool reliable; /**< Reliable mode flag. */ - uint8_t tick_latency; /**< Maximum length of interrupt handler in ticks (max 7.7 ms). */ -} nrf_drv_rtc_cb_t; - -// User callbacks local storage. -static nrf_drv_rtc_handler_t m_handlers[ENABLED_RTC_COUNT]; -static nrf_drv_rtc_cb_t m_cb[ENABLED_RTC_COUNT]; - -ret_code_t nrf_drv_rtc_init(nrf_drv_rtc_t const * const p_instance, - nrf_drv_rtc_config_t const * p_config, - nrf_drv_rtc_handler_t handler) -{ - ASSERT(p_config != NULL); - - ret_code_t err_code; - - if (handler) - { - m_handlers[p_instance->instance_id] = handler; - } - else - { - err_code = NRF_ERROR_INVALID_PARAM; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - if (m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED) - { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - nrf_drv_common_irq_enable(p_instance->irq, p_config->interrupt_priority); - nrf_rtc_prescaler_set(p_instance->p_reg, p_config->prescaler); - m_cb[p_instance->instance_id].reliable = p_config->reliable; - m_cb[p_instance->instance_id].tick_latency = p_config->tick_latency; - m_cb[p_instance->instance_id].state = NRF_DRV_STATE_INITIALIZED; - - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - -void nrf_drv_rtc_uninit(nrf_drv_rtc_t const * const p_instance) -{ - uint32_t mask = NRF_RTC_INT_TICK_MASK | - NRF_RTC_INT_OVERFLOW_MASK | - NRF_RTC_INT_COMPARE0_MASK | - NRF_RTC_INT_COMPARE1_MASK | - NRF_RTC_INT_COMPARE2_MASK | - NRF_RTC_INT_COMPARE3_MASK; - ASSERT(m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED); - - nrf_drv_common_irq_disable(p_instance->irq); - - nrf_rtc_task_trigger(p_instance->p_reg, NRF_RTC_TASK_STOP); - nrf_rtc_event_disable(p_instance->p_reg, mask); - nrf_rtc_int_disable(p_instance->p_reg, mask); - - m_cb[p_instance->instance_id].state = NRF_DRV_STATE_UNINITIALIZED; - NRF_LOG_INFO("Uninitialized."); -} - -void nrf_drv_rtc_enable(nrf_drv_rtc_t const * const p_instance) -{ - ASSERT(m_cb[p_instance->instance_id].state == NRF_DRV_STATE_INITIALIZED); - - nrf_rtc_task_trigger(p_instance->p_reg, NRF_RTC_TASK_START); - m_cb[p_instance->instance_id].state = NRF_DRV_STATE_POWERED_ON; - NRF_LOG_INFO("Enabled."); -} - -void nrf_drv_rtc_disable(nrf_drv_rtc_t const * const p_instance) -{ - ASSERT(m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED); - - nrf_rtc_task_trigger(p_instance->p_reg, NRF_RTC_TASK_STOP); - m_cb[p_instance->instance_id].state = NRF_DRV_STATE_INITIALIZED; - NRF_LOG_INFO("Disabled."); -} - -ret_code_t nrf_drv_rtc_cc_disable(nrf_drv_rtc_t const * const p_instance, uint32_t channel) -{ - ASSERT(m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED); - ASSERT(channelcc_channel_count); - - ret_code_t err_code; - uint32_t int_mask = RTC_CHANNEL_INT_MASK(channel); - nrf_rtc_event_t event = RTC_CHANNEL_EVENT_ADDR(channel); - - nrf_rtc_event_disable(p_instance->p_reg,int_mask); - if (nrf_rtc_int_is_enabled(p_instance->p_reg,int_mask)) - { - nrf_rtc_int_disable(p_instance->p_reg,int_mask); - if (nrf_rtc_event_pending(p_instance->p_reg,event)) - { - nrf_rtc_event_clear(p_instance->p_reg,event); - err_code = NRF_ERROR_TIMEOUT; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - } - NRF_LOG_INFO("RTC id: %d, channel disabled: %d.", p_instance->instance_id, channel); - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - -ret_code_t nrf_drv_rtc_cc_set(nrf_drv_rtc_t const * const p_instance, - uint32_t channel, - uint32_t val, - bool enable_irq) -{ - ASSERT(m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED); - ASSERT(channelcc_channel_count); - - ret_code_t err_code; - uint32_t int_mask = RTC_CHANNEL_INT_MASK(channel); - nrf_rtc_event_t event = RTC_CHANNEL_EVENT_ADDR(channel); - - nrf_rtc_event_disable(p_instance->p_reg, int_mask); - nrf_rtc_int_disable(p_instance->p_reg, int_mask); - - val = RTC_WRAP(val); - if (m_cb[p_instance->instance_id].reliable) - { - nrf_rtc_cc_set(p_instance->p_reg,channel,val); - uint32_t cnt = nrf_rtc_counter_get(p_instance->p_reg); - int32_t diff = cnt - val; - if (cnt < val) - { - diff += RTC_COUNTER_COUNTER_Msk; - } - if (diff < m_cb[p_instance->instance_id].tick_latency) - { - err_code = NRF_ERROR_TIMEOUT; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - } - else - { - nrf_rtc_cc_set(p_instance->p_reg,channel,val); - } - - if (enable_irq) - { - nrf_rtc_event_clear(p_instance->p_reg,event); - nrf_rtc_int_enable(p_instance->p_reg, int_mask); - } - nrf_rtc_event_enable(p_instance->p_reg,int_mask); - - NRF_LOG_INFO("RTC id: %d, channel enabled: %d, compare value: %d.", p_instance->instance_id, channel, val); - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - -void nrf_drv_rtc_tick_enable(nrf_drv_rtc_t const * const p_instance, bool enable_irq) -{ - nrf_rtc_event_t event = NRF_RTC_EVENT_TICK; - uint32_t mask = NRF_RTC_INT_TICK_MASK; - - nrf_rtc_event_clear(p_instance->p_reg, event); - nrf_rtc_event_enable(p_instance->p_reg, mask); - if (enable_irq) - { - nrf_rtc_int_enable(p_instance->p_reg, mask); - } - NRF_LOG_INFO("Tick events enabled."); -} - -void nrf_drv_rtc_tick_disable(nrf_drv_rtc_t const * const p_instance) -{ - uint32_t mask = NRF_RTC_INT_TICK_MASK; - - nrf_rtc_event_disable(p_instance->p_reg, mask); - nrf_rtc_int_disable(p_instance->p_reg, mask); - NRF_LOG_INFO("Tick events disabled."); -} - -void nrf_drv_rtc_overflow_enable(nrf_drv_rtc_t const * const p_instance, bool enable_irq) -{ - nrf_rtc_event_t event = NRF_RTC_EVENT_OVERFLOW; - uint32_t mask = NRF_RTC_INT_OVERFLOW_MASK; - - nrf_rtc_event_clear(p_instance->p_reg, event); - nrf_rtc_event_enable(p_instance->p_reg, mask); - if (enable_irq) - { - nrf_rtc_int_enable(p_instance->p_reg, mask); - } -} -void nrf_drv_rtc_overflow_disable(nrf_drv_rtc_t const * const p_instance) -{ - uint32_t mask = NRF_RTC_INT_OVERFLOW_MASK; - nrf_rtc_event_disable(p_instance->p_reg, mask); - nrf_rtc_int_disable(p_instance->p_reg, mask); -} - -uint32_t nrf_drv_rtc_max_ticks_get(nrf_drv_rtc_t const * const p_instance) -{ - uint32_t ticks; - if (m_cb[p_instance->instance_id].reliable) - { - ticks = RTC_COUNTER_COUNTER_Msk - m_cb[p_instance->instance_id].tick_latency; - } - else - { - ticks = RTC_COUNTER_COUNTER_Msk; - } - return ticks; -} - -/**@brief Generic function for handling RTC interrupt - * - * @param[in] p_reg Pointer to instance register structure. - * @param[in] instance_id Index of instance. - */ -__STATIC_INLINE void nrf_drv_rtc_int_handler(NRF_RTC_Type * p_reg, - uint32_t instance_id, - uint32_t channel_count) -{ - uint32_t i; - uint32_t int_mask = (uint32_t)NRF_RTC_INT_COMPARE0_MASK; - nrf_rtc_event_t event = NRF_RTC_EVENT_COMPARE_0; - - for (i = 0; i < channel_count; i++) - { - if (nrf_rtc_int_is_enabled(p_reg,int_mask) && nrf_rtc_event_pending(p_reg,event)) - { - nrf_rtc_event_disable(p_reg,int_mask); - nrf_rtc_int_disable(p_reg,int_mask); - nrf_rtc_event_clear(p_reg,event); - NRF_LOG_DEBUG("Event: %s, instance id: %d.", - (uint32_t)EVT_TO_STR(event), (uint32_t)instance_id); - m_handlers[instance_id]((nrf_drv_rtc_int_type_t)i); - } - int_mask <<= 1; - event = (nrf_rtc_event_t)((uint32_t)event + sizeof(uint32_t)); - } - event = NRF_RTC_EVENT_TICK; - if (nrf_rtc_int_is_enabled(p_reg,NRF_RTC_INT_TICK_MASK) && - nrf_rtc_event_pending(p_reg, event)) - { - nrf_rtc_event_clear(p_reg, event); - NRF_LOG_DEBUG("Event: %s, instance id: %d.", (uint32_t)EVT_TO_STR(event), instance_id); - m_handlers[instance_id](NRF_DRV_RTC_INT_TICK); - } - - event = NRF_RTC_EVENT_OVERFLOW; - if (nrf_rtc_int_is_enabled(p_reg,NRF_RTC_INT_OVERFLOW_MASK) && - nrf_rtc_event_pending(p_reg, event)) - { - nrf_rtc_event_clear(p_reg,event); - NRF_LOG_DEBUG("Event: %s, instance id: %d.", (uint32_t)EVT_TO_STR(event), instance_id); - m_handlers[instance_id](NRF_DRV_RTC_INT_OVERFLOW); - } -} - -#if NRF_MODULE_ENABLED(RTC0) -void RTC0_IRQHandler(void) -{ - nrf_drv_rtc_int_handler(NRF_RTC0,RTC0_INSTANCE_INDEX, NRF_RTC_CC_CHANNEL_COUNT(0)); -} -#endif - -#if NRF_MODULE_ENABLED(RTC1) -void RTC1_IRQHandler(void) -{ - nrf_drv_rtc_int_handler(NRF_RTC1,RTC1_INSTANCE_INDEX, NRF_RTC_CC_CHANNEL_COUNT(1)); -} -#endif - -#if NRF_MODULE_ENABLED(RTC2) -void RTC2_IRQHandler(void) -{ - nrf_drv_rtc_int_handler(NRF_RTC2,RTC2_INSTANCE_INDEX, NRF_RTC_CC_CHANNEL_COUNT(2)); -} -#endif -#endif //ENABLED_RTC_COUNT -#endif //NRF_MODULE_ENABLED(RTC) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/saadc/nrf_drv_saadc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/saadc/nrf_drv_saadc.h deleted file mode 100644 index 45b4204e70..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/saadc/nrf_drv_saadc.h +++ /dev/null @@ -1,326 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/** - * @addtogroup nrf_saadc SAADC HAL and driver - * @ingroup nrf_drivers - * @brief @tagAPI52 Successive Approximation Analog-to-Digital Converter (SAADC) APIs. - * @details The SAADC HAL provides basic APIs for accessing the registers of the SAADC peripheral. - * The SAADC driver provides APIs on a higher level. - * - * @defgroup nrf_drv_saadc SAADC driver - * @{ - * @ingroup nrf_saadc - * - * @brief @tagAPI52 Successive Approximation Analog-to-Digital Converter (SAADC) driver. - */ - -#ifndef NRF_DRV_SAADC_H__ -#define NRF_DRV_SAADC_H__ - -#include "sdk_config.h" -#include "nrf_saadc.h" -#include "sdk_errors.h" -#include "nrf_drv_common.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Value that should be set as high limit to disable limit detection. - */ -#define NRF_DRV_SAADC_LIMITH_DISABLED (2047) -/** - * @brief Value that should be set as low limit to disable limit detection. - */ -#define NRF_DRV_SAADC_LIMITL_DISABLED (-2048) - -/** - * @brief Macro for setting @ref nrf_drv_saadc_config_t to default settings. - */ -#define NRF_DRV_SAADC_DEFAULT_CONFIG \ - { \ - .resolution = (nrf_saadc_resolution_t)SAADC_CONFIG_RESOLUTION, \ - .oversample = (nrf_saadc_oversample_t)SAADC_CONFIG_OVERSAMPLE, \ - .interrupt_priority = SAADC_CONFIG_IRQ_PRIORITY, \ - .low_power_mode = SAADC_CONFIG_LP_MODE \ - } - -/** - * @brief Macro for setting @ref nrf_saadc_channel_config_t to default settings - * in single ended mode. - * - * @param PIN_P Analog input. - */ -#define NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(PIN_P) \ - { \ - .resistor_p = NRF_SAADC_RESISTOR_DISABLED, \ - .resistor_n = NRF_SAADC_RESISTOR_DISABLED, \ - .gain = NRF_SAADC_GAIN1_6, \ - .reference = NRF_SAADC_REFERENCE_INTERNAL, \ - .acq_time = NRF_SAADC_ACQTIME_10US, \ - .mode = NRF_SAADC_MODE_SINGLE_ENDED, \ - .burst = NRF_SAADC_BURST_DISABLED, \ - .pin_p = (nrf_saadc_input_t)(PIN_P), \ - .pin_n = NRF_SAADC_INPUT_DISABLED \ - } - -/** - * @brief Macro for setting @ref nrf_saadc_channel_config_t to default settings - * in differential mode. - * - * @param PIN_P Positive analog input. - * @param PIN_N Negative analog input. - */ -#define NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_DIFFERENTIAL(PIN_P, PIN_N) \ - { \ - .resistor_p = NRF_SAADC_RESISTOR_DISABLED, \ - .resistor_n = NRF_SAADC_RESISTOR_DISABLED, \ - .gain = NRF_SAADC_GAIN1_6, \ - .reference = NRF_SAADC_REFERENCE_INTERNAL, \ - .acq_time = NRF_SAADC_ACQTIME_10US, \ - .mode = NRF_SAADC_MODE_DIFFERENTIAL, \ - .pin_p = (nrf_saadc_input_t)(PIN_P), \ - .pin_n = (nrf_saadc_input_t)(PIN_N) \ - } - -/** - * @brief Analog-to-digital converter driver configuration structure. - */ -typedef struct -{ - nrf_saadc_resolution_t resolution; ///< Resolution configuration. - nrf_saadc_oversample_t oversample; ///< Oversampling configuration. - uint8_t interrupt_priority; ///< Interrupt priority. - bool low_power_mode; ///< Indicates if low power mode is active. -} nrf_drv_saadc_config_t; - -/** - * @brief Driver event types. - */ -typedef enum -{ - NRF_DRV_SAADC_EVT_DONE, ///< Event generated when the buffer is filled with samples. - NRF_DRV_SAADC_EVT_LIMIT, ///< Event generated after one of the limits is reached. - NRF_DRV_SAADC_EVT_CALIBRATEDONE ///< Event generated when the calibration is complete. -} nrf_drv_saadc_evt_type_t; - -/** - * @brief Analog-to-digital converter driver done event data. - */ -typedef struct -{ - nrf_saadc_value_t * p_buffer; ///< Pointer to buffer with converted samples. - uint16_t size; ///< Number of samples in the buffer. -} nrf_drv_saadc_done_evt_t; - -/** - * @brief Analog-to-digital converter driver limit event data. - */ -typedef struct -{ - uint8_t channel; ///< Channel on which the limit was detected. - nrf_saadc_limit_t limit_type; ///< Type of limit detected. -} nrf_drv_saadc_limit_evt_t; - -/** - * @brief Analog-to-digital converter driver event structure. - */ -typedef struct -{ - nrf_drv_saadc_evt_type_t type; ///< Event type. - union - { - nrf_drv_saadc_done_evt_t done; ///< Data for @ref NRF_DRV_SAADC_EVT_DONE event. - nrf_drv_saadc_limit_evt_t limit; ///< Data for @ref NRF_DRV_SAADC_EVT_LIMIT event. - } data; -} nrf_drv_saadc_evt_t; - -/** - * @brief ADC event handler. - * - * @param[in] p_event Pointer to an ADC event. The event structure is allocated on - * the stack, so it is valid only within the context of - * the event handler. - */ -typedef void (* nrf_drv_saadc_event_handler_t)(nrf_drv_saadc_evt_t const * p_event); - -/** - * @brief Function for initializing the SAADC. - * - * @param[in] p_config Pointer to a configuration structure. If NULL, the default one is used. - * @param[in] event_handler Event handler provided by the user. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the driver is already initialized. - * @retval NRF_ERROR_INVALID_PARAM If event_handler is NULL. - */ -ret_code_t nrf_drv_saadc_init(nrf_drv_saadc_config_t const * p_config, - nrf_drv_saadc_event_handler_t event_handler); - -/** - * @brief Function for uninitializing the SAADC. - * - * This function stops all ongoing conversions and disables all channels. - */ -void nrf_drv_saadc_uninit(void); - - -/** - * @brief Function for getting the address of a SAMPLE SAADC task. - * - * @return Task address. - */ -uint32_t nrf_drv_saadc_sample_task_get(void); - -/** - * @brief Function for initializing an SAADC channel. - * - * This function configures and enables the channel. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the ADC was not initialized. - * @retval NRF_ERROR_NO_MEM If the specified channel was already allocated. - */ -ret_code_t nrf_drv_saadc_channel_init(uint8_t channel, - nrf_saadc_channel_config_t const * const p_config); - - -/** - * @brief Function for uninitializing an SAADC channel. - * - * @retval NRF_SUCCESS If uninitialization was successful. - * @retval NRF_ERROR_BUSY If the ADC is busy. - */ -ret_code_t nrf_drv_saadc_channel_uninit(uint8_t channel); - -/** - * @brief Function for starting SAADC sampling. - * - * @retval NRF_SUCCESS If ADC sampling was triggered. - * @retval NRF_ERROR_INVALID_STATE If ADC is in idle state. - */ -ret_code_t nrf_drv_saadc_sample(void); - -/** - * @brief Blocking function for executing a single ADC conversion. - * - * This function selects the desired input, starts a single conversion, - * waits for it to finish, and returns the result. - * - * The function will fail if ADC is busy. - * - * @param[in] channel Channel. - * @param[out] p_value Pointer to the location where the result should be placed. - * - * @retval NRF_SUCCESS If conversion was successful. - * @retval NRF_ERROR_BUSY If the ADC driver is busy. - */ -ret_code_t nrf_drv_saadc_sample_convert(uint8_t channel, nrf_saadc_value_t * p_value); - -/** - * @brief Function for issuing conversion of data to the buffer. - * - * This function is non-blocking. The application is notified about filling the buffer by the event handler. - * Conversion will be done on all enabled channels. If the ADC is in idle state, the function will set up Easy - * DMA for the conversion. The ADC will be ready for sampling and wait for the SAMPLE task. It can be - * triggered manually by the @ref nrf_drv_saadc_sample function or by PPI using the @ref NRF_SAADC_TASK_SAMPLE - * task. If one buffer is already set and the conversion is ongoing, calling this function will - * result in queuing the given buffer. The driver will start filling the issued buffer when the first one is - * completed. If the function is called again before the first buffer is filled or calibration is in progress, - * it will return with error. - * - * @param[in] buffer Result buffer. - * @param[in] size Buffer size in words. - * - * @retval NRF_SUCCESS If conversion was successful. - * @retval NRF_ERROR_BUSY If the driver already has two buffers set or calibration is in progress. - */ -ret_code_t nrf_drv_saadc_buffer_convert(nrf_saadc_value_t * buffer, uint16_t size); - -/** - * @brief Function for triggering the ADC offset calibration. - * - * This function is non-blocking. The application is notified about completion by the event handler. - * Calibration will also trigger DONE and RESULTDONE events. - * - * The function will fail if ADC is busy or calibration is already in progress. - * - * @retval NRF_SUCCESS If calibration was started successfully. - * @retval NRF_ERROR_BUSY If the ADC driver is busy. - */ -ret_code_t nrf_drv_saadc_calibrate_offset(void); - -/** - * @brief Function for retrieving the SAADC state. - * - * @retval true If the ADC is busy. - * @retval false If the ADC is ready. - */ -bool nrf_drv_saadc_is_busy(void); - -/** - * @brief Function for aborting ongoing and buffered conversions. - * @note @ref NRF_DRV_SAADC_EVT_DONE event will be generated if there is a conversion in progress. - * Event will contain number of words in the sample buffer. - */ -void nrf_drv_saadc_abort(void); - -/** - * @brief Function for setting the SAADC channel limits. - * When limits are enabled and the result exceeds the defined bounds, the limit handler function is called. - * - * @param[in] channel SAADC channel number. - * @param[in] limit_low Lower limit (valid values from @ref NRF_DRV_SAADC_LIMITL_DISABLED to - * @ref NRF_DRV_SAADC_LIMITH_DISABLED). Conversion results below this value will trigger - * the handler function. Set to @ref NRF_DRV_SAADC_LIMITL_DISABLED to disable this limit. - * @param[in] limit_high Upper limit (valid values from @ref NRF_DRV_SAADC_LIMITL_DISABLED to - * @ref NRF_DRV_SAADC_LIMITH_DISABLED). Conversion results above this value will trigger - * the handler function. Set to @ref NRF_DRV_SAADC_LIMITH_DISABLED to disable this limit. - */ -void nrf_drv_saadc_limits_set(uint8_t channel, int16_t limit_low, int16_t limit_high); - -#ifdef __cplusplus -} -#endif - -#endif // NRF_DRV_SAADC_H__ - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/sdio/sdio.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/sdio/sdio.c deleted file mode 100644 index 381c77d36a..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/sdio/sdio.c +++ /dev/null @@ -1,244 +0,0 @@ -/** - * Copyright (c) 2009 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include - -#include "nrf.h" -#include "nrf_delay.h" -#include "sdio.h" -#include "nrf_gpio.h" - -#include "sdio_config.h" - -/*lint ++flb "Enter library region" */ - -/*lint -e717 -save "Suppress do {} while (0) for these macros" */ -#define SDIO_CLOCK_HIGH() do { NRF_GPIO->OUTSET = (1UL << SDIO_CONFIG_CLOCK_PIN_NUMBER); } while (0) /*!< Pulls SCL line high */ -#define SDIO_CLOCK_LOW() do { NRF_GPIO->OUTCLR = (1UL << SDIO_CONFIG_CLOCK_PIN_NUMBER); } while (0) /*!< Pulls SCL line low */ -#define SDIO_DATA_HIGH() do { NRF_GPIO->OUTSET = (1UL << SDIO_CONFIG_DATA_PIN_NUMBER); } while (0) /*!< Pulls SDA line high */ -#define SDIO_DATA_LOW() do { NRF_GPIO->OUTCLR = (1UL << SDIO_CONFIG_DATA_PIN_NUMBER); } while (0) /*!< Pulls SDA line low */ -#define SDIO_DATA_OUTPUT() do { NRF_GPIO->DIRSET = (1UL << SDIO_CONFIG_DATA_PIN_NUMBER); } while (0) /*!< Configures SDA pin as output */ -#define SDIO_CLOCK_OUTPUT() do { NRF_GPIO->DIRSET = (1UL << SDIO_CONFIG_CLOCK_PIN_NUMBER); } while (0) /*!< Configures SCL pin as output */ -/*lint -restore */ - -/*lint -emacro(845,SDIO_DATA_INPUT) // A zero has been given as right argument to operator '|'" */ - -#define SDIO_DATA_INPUT() do { \ - nrf_gpio_cfg_input(25, NRF_GPIO_PIN_NOPULL); \ -} while (0) - -#define SDIO_DATA_READ() ((NRF_GPIO->IN >> SDIO_CONFIG_DATA_PIN_NUMBER) & 0x1UL) /*!< Reads current state of SDA */ -#define SDIO_CLOCK_READ() ((NRF_GPIO->IN >> SDIO_CONFIG_CLOCK_PIN_NUMBER) & 0x1UL) /*!< Reads current state of SCL */ -#define SDIO_DELAY() nrf_delay_us(10) /*!< Time to wait when pin states are changed. For fast-mode the delay can be zero and for standard-mode 4 us delay is sufficient. */ - -void sdio_init(void) -{ - SDIO_CLOCK_HIGH(); - SDIO_DATA_HIGH(); - SDIO_CLOCK_OUTPUT(); - SDIO_DATA_INPUT(); - - // If slave is stuck in the middle of transfer, clock out bits until the slave ACKs the transfer - for (uint_fast8_t i = 16; i--;) - { - SDIO_DELAY(); - SDIO_CLOCK_LOW(); - SDIO_DELAY(); - SDIO_CLOCK_HIGH(); - SDIO_DELAY(); - - if (SDIO_DATA_READ()) - { - break; - } - } - - for (uint_fast8_t i = 5; i--;) - { - SDIO_DELAY(); - SDIO_CLOCK_LOW(); - SDIO_DELAY(); - SDIO_CLOCK_HIGH(); - } - - SDIO_DATA_OUTPUT(); - SDIO_DATA_HIGH(); - - SDIO_DELAY(); -} - -uint8_t sdio_read_byte(uint8_t address) -{ - uint8_t data_byte = 0; - - SDIO_DATA_OUTPUT(); - - for (uint_fast8_t i = 8; i--;) - { - SDIO_DELAY(); - - SDIO_CLOCK_LOW(); - - if (address & (1U << i)) - { - SDIO_DATA_HIGH(); - } - else - { - SDIO_DATA_LOW(); - } - - SDIO_DELAY(); - - SDIO_CLOCK_HIGH(); - } - - nrf_delay_us(20); - - SDIO_DATA_INPUT(); - - for (uint_fast8_t i = 8; i--;) - { - SDIO_CLOCK_LOW(); - SDIO_DELAY(); - SDIO_CLOCK_HIGH(); - SDIO_DELAY(); - data_byte |= (uint8_t)(SDIO_DATA_READ() << i); - } - - SDIO_DATA_HIGH(); - SDIO_DATA_OUTPUT(); - - SDIO_DELAY(); - - return data_byte; -} - -void sdio_read_burst(uint8_t * target_buffer, uint8_t target_buffer_size) -{ - uint_fast8_t address = 0x63; - - SDIO_DATA_OUTPUT(); - - for (uint_fast8_t bit_index=8; bit_index--;) - { - SDIO_CLOCK_LOW(); - - if (address & (1U << bit_index)) - { - SDIO_DATA_HIGH(); - } - else - { - SDIO_DATA_LOW(); - } - - SDIO_CLOCK_HIGH(); - } - - SDIO_DATA_INPUT(); - - for (uint_fast8_t target_buffer_index = 0; target_buffer_index < target_buffer_size; target_buffer_index++) - { - target_buffer[target_buffer_index] = 0; - - for (uint_fast8_t bit_index = 8; bit_index--;) - { - SDIO_CLOCK_LOW(); - SDIO_CLOCK_HIGH(); - target_buffer[target_buffer_index] |= (uint8_t)(SDIO_DATA_READ() << bit_index); - } - } -} - -void sdio_write_byte(uint8_t address, uint8_t data_byte) -{ - // Add write indication bit - address |= 0x80; - - SDIO_DATA_OUTPUT(); - - for (uint_fast8_t i = 8; i--;) - { - SDIO_DELAY(); - - SDIO_CLOCK_LOW(); - - if (address & (1U << i)) - { - SDIO_DATA_HIGH(); - } - else - { - SDIO_DATA_LOW(); - } - - SDIO_DELAY(); - - SDIO_CLOCK_HIGH(); - } - - SDIO_DELAY(); - - for (uint_fast8_t i = 8; i--;) - { - SDIO_CLOCK_LOW(); - - if (data_byte & (1U << i)) - { - SDIO_DATA_HIGH(); - } - else - { - SDIO_DATA_LOW(); - } - - SDIO_DELAY(); - - SDIO_CLOCK_HIGH(); - - SDIO_DELAY(); - } - - SDIO_DATA_HIGH(); - - SDIO_DELAY(); -} - -/*lint --flb "Leave library region" */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/spi_master/nrf_drv_spi.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/spi_master/nrf_drv_spi.c deleted file mode 100644 index 5697f5415f..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/spi_master/nrf_drv_spi.c +++ /dev/null @@ -1,783 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(SPI) -#include "nrf_drv_spi.h" -#if ENABLED_SPI_COUNT -#include "nrf_drv_common.h" -#include "nrf_gpio.h" -#include "nrf_assert.h" -#include "app_util_platform.h" - -#define NRF_LOG_MODULE_NAME spi - - -#if SPI_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL SPI_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR SPI_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR SPI_CONFIG_DEBUG_COLOR - -#else //SPI_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL 0 -#endif //SPI_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); - - -#define SPIM_ONLY ( defined(SPIM_PRESENT) && !defined(SPI_PRESENT)) -#define SPI_SPIM_PRESENT ( defined(SPIM_PRESENT) && defined(SPI_PRESENT)) -#define SPI_ONLY (!defined(SPIM_PRESENT) && defined(SPI_PRESENT)) - -#define SPI0_WITH_DMA (defined(SPI0_USE_EASY_DMA) && SPI0_USE_EASY_DMA && SPI0_ENABLED) -#define SPI1_WITH_DMA (defined(SPI1_USE_EASY_DMA) && SPI1_USE_EASY_DMA && SPI1_ENABLED) -#define SPI2_WITH_DMA (defined(SPI2_USE_EASY_DMA) && SPI2_USE_EASY_DMA && SPI2_ENABLED) - -#define SPI0_WITHOUT_DMA (defined(SPI0_USE_EASY_DMA) && !SPI0_USE_EASY_DMA && SPI0_ENABLED) -#define SPI1_WITHOUT_DMA (defined(SPI1_USE_EASY_DMA) && !SPI1_USE_EASY_DMA && SPI1_ENABLED) -#define SPI2_WITHOUT_DMA (defined(SPI2_USE_EASY_DMA) && !SPI2_USE_EASY_DMA && SPI2_ENABLED) - -// suppress: non-standard use of 'defined' preprocessor operator -/*lint -save -e491*/ -#if (SPI_ONLY && ENABLED_SPI_COUNT) || ((SPI_SPIM_PRESENT) && \ - (SPI0_WITHOUT_DMA || SPI1_WITHOUT_DMA || SPI2_WITHOUT_DMA)) - #define SPI_IN_USE 1 -#endif - -#if (SPIM_ONLY && ENABLED_SPI_COUNT) || ((SPI_SPIM_PRESENT) && \ - (SPI0_WITH_DMA || SPI1_WITH_DMA || SPI2_WITH_DMA)) - #define SPIM_IN_USE 1 -#endif - - -#if defined(SPIM_IN_USE) && defined(SPI_IN_USE) - // SPIM and SPI combined - #define CODE_FOR_SPIM(code) if (p_instance->use_easy_dma) { code } - #define CODE_FOR_SPI(code) else { code } -#elif defined(SPIM_IN_USE) && !defined(SPI_IN_USE) - // SPIM only - #define CODE_FOR_SPIM(code) { code } - #define CODE_FOR_SPI(code) -#elif !defined(SPIM_IN_USE) && defined(SPI_IN_USE) - // SPI only - #define CODE_FOR_SPIM(code) - #define CODE_FOR_SPI(code) { code } -#else - #error "Wrong configuration." -#endif - -#ifdef SPIM_IN_USE -#define END_INT_MASK NRF_SPIM_INT_END_MASK -#endif - -// Control block - driver instance local data. -typedef struct -{ - nrf_drv_spi_evt_handler_t handler; - void * p_context; - nrf_drv_spi_evt_t evt; // Keep the struct that is ready for event handler. Less memcpy. - nrf_drv_state_t state; - volatile bool transfer_in_progress; - - // [no need for 'volatile' attribute for the following members, as they - // are not concurrently used in IRQ handlers and main line code] - uint8_t ss_pin; - uint8_t orc; - uint8_t bytes_transferred; - -#if NRF_MODULE_ENABLED(SPIM_NRF52_ANOMALY_109_WORKAROUND) - uint8_t tx_length; - uint8_t rx_length; -#endif - - bool tx_done : 1; - bool rx_done : 1; - bool abort : 1; -} spi_control_block_t; -static spi_control_block_t m_cb[ENABLED_SPI_COUNT]; - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - #define IRQ_HANDLER_NAME(n) irq_handler_for_instance_##n - #define IRQ_HANDLER(n) static void IRQ_HANDLER_NAME(n)(void) - - #if NRF_MODULE_ENABLED(SPI0) - IRQ_HANDLER(0); - #endif - #if NRF_MODULE_ENABLED(SPI1) - IRQ_HANDLER(1); - #endif - #if NRF_MODULE_ENABLED(SPI2) - IRQ_HANDLER(2); - #endif - static nrf_drv_irq_handler_t const m_irq_handlers[ENABLED_SPI_COUNT] = { - #if NRF_MODULE_ENABLED(SPI0) - IRQ_HANDLER_NAME(0), - #endif - #if NRF_MODULE_ENABLED(SPI1) - IRQ_HANDLER_NAME(1), - #endif - #if NRF_MODULE_ENABLED(SPI2) - IRQ_HANDLER_NAME(2), - #endif - }; -#else - #define IRQ_HANDLER(n) void SPI##n##_IRQ_HANDLER(void) -#endif // NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - -ret_code_t nrf_drv_spi_init(nrf_drv_spi_t const * const p_instance, - nrf_drv_spi_config_t const * p_config, - nrf_drv_spi_evt_handler_t handler, - void * p_context) -{ - ASSERT(p_config); - spi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ret_code_t err_code; - - if (p_cb->state != NRF_DRV_STATE_UNINITIALIZED) - { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - if (nrf_drv_common_per_res_acquire(p_instance->p_registers, - m_irq_handlers[p_instance->drv_inst_idx]) != NRF_SUCCESS) - { - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } -#endif - - p_cb->handler = handler; - p_cb->p_context = p_context; - - uint32_t mosi_pin; - uint32_t miso_pin; - // Configure pins used by the peripheral: - // - SCK - output with initial value corresponding with the SPI mode used: - // 0 - for modes 0 and 1 (CPOL = 0), 1 - for modes 2 and 3 (CPOL = 1); - // according to the reference manual guidelines this pin and its input - // buffer must always be connected for the SPI to work. - if (p_config->mode <= NRF_DRV_SPI_MODE_1) - { - nrf_gpio_pin_clear(p_config->sck_pin); - } - else - { - nrf_gpio_pin_set(p_config->sck_pin); - } - nrf_gpio_cfg(p_config->sck_pin, - NRF_GPIO_PIN_DIR_OUTPUT, - NRF_GPIO_PIN_INPUT_CONNECT, - NRF_GPIO_PIN_NOPULL, - NRF_GPIO_PIN_S0S1, - NRF_GPIO_PIN_NOSENSE); - // - MOSI (optional) - output with initial value 0, - if (p_config->mosi_pin != NRF_DRV_SPI_PIN_NOT_USED) - { - mosi_pin = p_config->mosi_pin; - nrf_gpio_pin_clear(mosi_pin); - nrf_gpio_cfg_output(mosi_pin); - } - else - { - mosi_pin = NRF_SPI_PIN_NOT_CONNECTED; - } - // - MISO (optional) - input, - if (p_config->miso_pin != NRF_DRV_SPI_PIN_NOT_USED) - { - miso_pin = p_config->miso_pin; - nrf_gpio_cfg_input(miso_pin, (nrf_gpio_pin_pull_t)NRF_SPI_DRV_MISO_PULLUP_CFG); - } - else - { - miso_pin = NRF_SPI_PIN_NOT_CONNECTED; - } - // - Slave Select (optional) - output with initial value 1 (inactive). - if (p_config->ss_pin != NRF_DRV_SPI_PIN_NOT_USED) - { - nrf_gpio_pin_set(p_config->ss_pin); - nrf_gpio_cfg_output(p_config->ss_pin); - } - m_cb[p_instance->drv_inst_idx].ss_pin = p_config->ss_pin; - - CODE_FOR_SPIM - ( - NRF_SPIM_Type * p_spim = (NRF_SPIM_Type *)p_instance->p_registers; - nrf_spim_pins_set(p_spim, p_config->sck_pin, mosi_pin, miso_pin); - nrf_spim_frequency_set(p_spim, - (nrf_spim_frequency_t)p_config->frequency); - nrf_spim_configure(p_spim, - (nrf_spim_mode_t)p_config->mode, - (nrf_spim_bit_order_t)p_config->bit_order); - - nrf_spim_orc_set(p_spim, p_config->orc); - - if (p_cb->handler) - { - nrf_spim_int_enable(p_spim, END_INT_MASK); - } - - nrf_spim_enable(p_spim); - ) - CODE_FOR_SPI - ( - NRF_SPI_Type * p_spi = p_instance->p_registers; - nrf_spi_pins_set(p_spi, p_config->sck_pin, mosi_pin, miso_pin); - nrf_spi_frequency_set(p_spi, - (nrf_spi_frequency_t)p_config->frequency); - nrf_spi_configure(p_spi, - (nrf_spi_mode_t)p_config->mode, - (nrf_spi_bit_order_t)p_config->bit_order); - - m_cb[p_instance->drv_inst_idx].orc = p_config->orc; - - if (p_cb->handler) - { - nrf_spi_int_enable(p_spi, NRF_SPI_INT_READY_MASK); - } - - nrf_spi_enable(p_spi); - ) - - if (p_cb->handler) - { - nrf_drv_common_irq_enable(p_instance->irq, p_config->irq_priority); - } - - p_cb->transfer_in_progress = false; - p_cb->state = NRF_DRV_STATE_INITIALIZED; - - NRF_LOG_INFO("Init"); - - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - -void nrf_drv_spi_uninit(nrf_drv_spi_t const * const p_instance) -{ - spi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ASSERT(p_cb->state != NRF_DRV_STATE_UNINITIALIZED); - - if (p_cb->handler) - { - nrf_drv_common_irq_disable(p_instance->irq); - } - - #define DISABLE_ALL 0xFFFFFFFF - - CODE_FOR_SPIM - ( - NRF_SPIM_Type * p_spim = (NRF_SPIM_Type *)p_instance->p_registers; - if (p_cb->handler) - { - nrf_spim_int_disable(p_spim, DISABLE_ALL); - if (p_cb->transfer_in_progress) - { - // Ensure that SPI is not performing any transfer. - nrf_spim_task_trigger(p_spim, NRF_SPIM_TASK_STOP); - while (!nrf_spim_event_check(p_spim, NRF_SPIM_EVENT_STOPPED)) {} - p_cb->transfer_in_progress = false; - } - } - nrf_spim_event_clear(p_spim, NRF_SPIM_EVENT_END); - nrf_spim_disable(p_spim); - ) - CODE_FOR_SPI - ( - NRF_SPI_Type * p_spi = p_instance->p_registers; - if (p_cb->handler) - { - nrf_spi_int_disable(p_spi, DISABLE_ALL); - } - nrf_spi_disable(p_spi); - ) - #undef DISABLE_ALL - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - nrf_drv_common_per_res_release(p_instance->p_registers); -#endif - - p_cb->state = NRF_DRV_STATE_UNINITIALIZED; -} - -ret_code_t nrf_drv_spi_transfer(nrf_drv_spi_t const * const p_instance, - uint8_t const * p_tx_buffer, - uint8_t tx_buffer_length, - uint8_t * p_rx_buffer, - uint8_t rx_buffer_length) -{ - nrf_drv_spi_xfer_desc_t xfer_desc; - xfer_desc.p_tx_buffer = p_tx_buffer; - xfer_desc.p_rx_buffer = p_rx_buffer; - xfer_desc.tx_length = tx_buffer_length; - xfer_desc.rx_length = rx_buffer_length; - - NRF_LOG_INFO("Transfer tx_len:%d, rx_len:%d.", tx_buffer_length, rx_buffer_length); - NRF_LOG_DEBUG("Tx data:"); - NRF_LOG_HEXDUMP_DEBUG((uint8_t *)p_tx_buffer, tx_buffer_length * sizeof(p_tx_buffer[0])); - return nrf_drv_spi_xfer(p_instance, &xfer_desc, 0); -} - -static void finish_transfer(spi_control_block_t * p_cb) -{ - // If Slave Select signal is used, this is the time to deactivate it. - if (p_cb->ss_pin != NRF_DRV_SPI_PIN_NOT_USED) - { - nrf_gpio_pin_set(p_cb->ss_pin); - } - - // By clearing this flag before calling the handler we allow subsequent - // transfers to be started directly from the handler function. - p_cb->transfer_in_progress = false; - p_cb->evt.type = NRF_DRV_SPI_EVENT_DONE; - NRF_LOG_INFO("Transfer completed rx_len:%d.", p_cb->evt.data.done.rx_length); - NRF_LOG_DEBUG("Rx data:"); - NRF_LOG_HEXDUMP_DEBUG((uint8_t *)p_cb->evt.data.done.p_rx_buffer, - p_cb->evt.data.done.rx_length * - sizeof(p_cb->evt.data.done.p_rx_buffer[0])); - p_cb->handler(&p_cb->evt, p_cb->p_context); -} - -#ifdef SPI_IN_USE -// This function is called from IRQ handler or, in blocking mode, directly -// from the 'nrf_drv_spi_transfer' function. -// It returns true as long as the transfer should be continued, otherwise (when -// there is nothing more to send/receive) it returns false. -static bool transfer_byte(NRF_SPI_Type * p_spi, spi_control_block_t * p_cb) -{ - // Read the data byte received in this transfer and store it in RX buffer, - // if needed. - volatile uint8_t rx_data = nrf_spi_rxd_get(p_spi); - if (p_cb->bytes_transferred < p_cb->evt.data.done.rx_length) - { - p_cb->evt.data.done.p_rx_buffer[p_cb->bytes_transferred] = rx_data; - } - - ++p_cb->bytes_transferred; - - // Check if there are more bytes to send or receive and write proper data - // byte (next one from TX buffer or over-run character) to the TXD register - // when needed. - // NOTE - we've already used 'p_cb->bytes_transferred + 1' bytes from our - // buffers, because we take advantage of double buffering of TXD - // register (so in effect one byte is still being transmitted now); - // see how the transfer is started in the 'nrf_drv_spi_transfer' - // function. - uint16_t bytes_used = p_cb->bytes_transferred + 1; - - if (p_cb->abort) - { - if (bytes_used < p_cb->evt.data.done.tx_length) - { - p_cb->evt.data.done.tx_length = bytes_used; - } - if (bytes_used < p_cb->evt.data.done.rx_length) - { - p_cb->evt.data.done.rx_length = bytes_used; - } - } - - if (bytes_used < p_cb->evt.data.done.tx_length) - { - nrf_spi_txd_set(p_spi, p_cb->evt.data.done.p_tx_buffer[bytes_used]); - return true; - } - else if (bytes_used < p_cb->evt.data.done.rx_length) - { - nrf_spi_txd_set(p_spi, p_cb->orc); - return true; - } - - return (p_cb->bytes_transferred < p_cb->evt.data.done.tx_length || - p_cb->bytes_transferred < p_cb->evt.data.done.rx_length); -} - -static void spi_xfer(NRF_SPI_Type * p_spi, - spi_control_block_t * p_cb, - nrf_drv_spi_xfer_desc_t const * p_xfer_desc) -{ - p_cb->bytes_transferred = 0; - nrf_spi_int_disable(p_spi, NRF_SPI_INT_READY_MASK); - - nrf_spi_event_clear(p_spi, NRF_SPI_EVENT_READY); - - /** - * 4/23/2018 Arm Mbed modification to Nordic SDK 14.2. - * Interrupts must be enabled before transmitting the first byte in asynchronous mode. - */ - if (p_cb->handler) - { - nrf_spi_int_enable(p_spi, NRF_SPI_INT_READY_MASK); - } - - // Start the transfer by writing some byte to the TXD register; - // if TX buffer is not empty, take the first byte from this buffer, - // otherwise - use over-run character. - nrf_spi_txd_set(p_spi, - (p_xfer_desc->tx_length > 0 ? p_xfer_desc->p_tx_buffer[0] : p_cb->orc)); - - // TXD register is double buffered, so next byte to be transmitted can - // be written immediately, if needed, i.e. if TX or RX transfer is to - // be more that 1 byte long. Again - if there is something more in TX - // buffer send it, otherwise use over-run character. - if (p_xfer_desc->tx_length > 1) - { - nrf_spi_txd_set(p_spi, p_xfer_desc->p_tx_buffer[1]); - } - else if (p_xfer_desc->rx_length > 1) - { - nrf_spi_txd_set(p_spi, p_cb->orc); - } - - // For blocking mode (user handler not provided) wait here for READY - // events (indicating that the byte from TXD register was transmitted - // and a new incoming byte was moved to the RXD register) and continue - // transaction until all requested bytes are transferred. - // In non-blocking mode - IRQ service routine will do this stuff. - /** - * 4/23/2018 Arm Mbed modification to Nordic SDK 14.2. - * Interrupts must be enabled before transmitting the first byte in asynchronous mode. - */ - if (p_cb->handler == NULL) - { - do { - while (!nrf_spi_event_check(p_spi, NRF_SPI_EVENT_READY)) {} - nrf_spi_event_clear(p_spi, NRF_SPI_EVENT_READY); - NRF_LOG_DEBUG("SPI: Event: NRF_SPI_EVENT_READY."); - } while (transfer_byte(p_spi, p_cb)); - if (p_cb->ss_pin != NRF_DRV_SPI_PIN_NOT_USED) - { - nrf_gpio_pin_set(p_cb->ss_pin); - } - } -} -#endif // SPI_IN_USE - -#ifdef SPIM_IN_USE -__STATIC_INLINE void spim_int_enable(NRF_SPIM_Type * p_spim, bool enable) -{ - if (!enable) - { - nrf_spim_int_disable(p_spim, END_INT_MASK); - } - else - { - nrf_spim_int_enable(p_spim, END_INT_MASK); - } -} - -__STATIC_INLINE void spim_list_enable_handle(NRF_SPIM_Type * p_spim, uint32_t flags) -{ - if (NRF_DRV_SPI_FLAG_TX_POSTINC & flags) - { - nrf_spim_tx_list_enable(p_spim); - } - else - { - nrf_spim_tx_list_disable(p_spim); - } - - if (NRF_DRV_SPI_FLAG_RX_POSTINC & flags) - { - nrf_spim_rx_list_enable(p_spim); - } - else - { - nrf_spim_rx_list_disable(p_spim); - } -} - -static ret_code_t spim_xfer(NRF_SPIM_Type * p_spim, - spi_control_block_t * p_cb, - nrf_drv_spi_xfer_desc_t const * p_xfer_desc, - uint32_t flags) -{ - ret_code_t err_code; - // EasyDMA requires that transfer buffers are placed in Data RAM region; - // signal error if they are not. - if ((p_xfer_desc->p_tx_buffer != NULL && !nrf_drv_is_in_RAM(p_xfer_desc->p_tx_buffer)) || - (p_xfer_desc->p_rx_buffer != NULL && !nrf_drv_is_in_RAM(p_xfer_desc->p_rx_buffer))) - { - p_cb->transfer_in_progress = false; - err_code = NRF_ERROR_INVALID_ADDR; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - -#if NRF_MODULE_ENABLED(SPIM_NRF52_ANOMALY_109_WORKAROUND) - p_cb->tx_length = 0; - p_cb->rx_length = 0; -#endif - - nrf_spim_tx_buffer_set(p_spim, p_xfer_desc->p_tx_buffer, p_xfer_desc->tx_length); - nrf_spim_rx_buffer_set(p_spim, p_xfer_desc->p_rx_buffer, p_xfer_desc->rx_length); - - nrf_spim_event_clear(p_spim, NRF_SPIM_EVENT_END); - - spim_list_enable_handle(p_spim, flags); - - if (!(flags & NRF_DRV_SPI_FLAG_HOLD_XFER)) - { - nrf_spim_task_trigger(p_spim, NRF_SPIM_TASK_START); - } -#if NRF_MODULE_ENABLED(SPIM_NRF52_ANOMALY_109_WORKAROUND) - if (flags & NRF_DRV_SPI_FLAG_HOLD_XFER) - { - nrf_spim_event_clear(p_spim, NRF_SPIM_EVENT_STARTED); - p_cb->tx_length = p_xfer_desc->tx_length; - p_cb->rx_length = p_xfer_desc->rx_length; - nrf_spim_tx_buffer_set(p_spim, p_xfer_desc->p_tx_buffer, 0); - nrf_spim_rx_buffer_set(p_spim, p_xfer_desc->p_rx_buffer, 0); - nrf_spim_int_enable(p_spim, NRF_SPIM_INT_STARTED_MASK); - } -#endif - - if (!p_cb->handler) - { - while (!nrf_spim_event_check(p_spim, NRF_SPIM_EVENT_END)){} - if (p_cb->ss_pin != NRF_DRV_SPI_PIN_NOT_USED) - { - nrf_gpio_pin_set(p_cb->ss_pin); - } - } - else - { - spim_int_enable(p_spim, !(flags & NRF_DRV_SPI_FLAG_NO_XFER_EVT_HANDLER)); - } - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} -#endif - -ret_code_t nrf_drv_spi_xfer(nrf_drv_spi_t const * const p_instance, - nrf_drv_spi_xfer_desc_t const * p_xfer_desc, - uint32_t flags) -{ - spi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ASSERT(p_cb->state != NRF_DRV_STATE_UNINITIALIZED); - ASSERT(p_xfer_desc->p_tx_buffer != NULL || p_xfer_desc->tx_length == 0); - ASSERT(p_xfer_desc->p_rx_buffer != NULL || p_xfer_desc->rx_length == 0); - - ret_code_t err_code = NRF_SUCCESS; - - if (p_cb->transfer_in_progress) - { - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - else - { - if (p_cb->handler && !(flags & (NRF_DRV_SPI_FLAG_REPEATED_XFER | - NRF_DRV_SPI_FLAG_NO_XFER_EVT_HANDLER))) - { - p_cb->transfer_in_progress = true; - } - } - - p_cb->evt.data.done = *p_xfer_desc; - p_cb->tx_done = false; - p_cb->rx_done = false; - p_cb->abort = false; - - if (p_cb->ss_pin != NRF_DRV_SPI_PIN_NOT_USED) - { - nrf_gpio_pin_clear(p_cb->ss_pin); - } - CODE_FOR_SPIM - ( - return spim_xfer(p_instance->p_registers, p_cb, p_xfer_desc, flags); - ) - CODE_FOR_SPI - ( - if (flags) - { - p_cb->transfer_in_progress = false; - err_code = NRF_ERROR_NOT_SUPPORTED; - } - else - { - spi_xfer(p_instance->p_registers, p_cb, p_xfer_desc); - } - NRF_LOG_INFO("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - ) -} - - -void nrf_drv_spi_abort(nrf_drv_spi_t const * p_instance) -{ - spi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ASSERT(p_cb->state != NRF_DRV_STATE_UNINITIALIZED); - - CODE_FOR_SPIM - ( - nrf_spim_task_trigger(p_instance->p_registers, NRF_SPIM_TASK_STOP); - while (!nrf_spim_event_check(p_instance->p_registers, NRF_SPIM_EVENT_STOPPED)) {} - p_cb->transfer_in_progress = false; - ) - CODE_FOR_SPI - ( - p_cb->abort = true; - ) -} - - -#ifdef SPIM_IN_USE -static void irq_handler_spim(NRF_SPIM_Type * p_spim, spi_control_block_t * p_cb) -{ - -#if NRF_MODULE_ENABLED(SPIM_NRF52_ANOMALY_109_WORKAROUND) - if ((nrf_spim_int_enable_check(p_spim, NRF_SPIM_INT_STARTED_MASK)) && - (nrf_spim_event_check(p_spim, NRF_SPIM_EVENT_STARTED)) ) - { - /* Handle first, zero-length, auxiliary transmission. */ - nrf_spim_event_clear(p_spim, NRF_SPIM_EVENT_STARTED); - nrf_spim_event_clear(p_spim, NRF_SPIM_EVENT_END); - - ASSERT(p_spim->TXD.MAXCNT == 0); - p_spim->TXD.MAXCNT = p_cb->tx_length; - - ASSERT(p_spim->RXD.MAXCNT == 0); - p_spim->RXD.MAXCNT = p_cb->rx_length; - - /* Disable STARTED interrupt, used only in auxiliary transmission. */ - nrf_spim_int_disable(p_spim, NRF_SPIM_INT_STARTED_MASK); - - /* Start the actual, glitch-free transmission. */ - nrf_spim_task_trigger(p_spim, NRF_SPIM_TASK_START); - return; - } -#endif - - if (nrf_spim_event_check(p_spim, NRF_SPIM_EVENT_END)) - { - nrf_spim_event_clear(p_spim, NRF_SPIM_EVENT_END); - ASSERT(p_cb->handler); - NRF_LOG_DEBUG("SPIM: Event: NRF_SPIM_EVENT_END."); - finish_transfer(p_cb); - } -} - -uint32_t nrf_drv_spi_start_task_get(nrf_drv_spi_t const * p_instance) -{ - NRF_SPIM_Type * p_spim = (NRF_SPIM_Type *)p_instance->p_registers; - return nrf_spim_task_address_get(p_spim, NRF_SPIM_TASK_START); -} - -uint32_t nrf_drv_spi_end_event_get(nrf_drv_spi_t const * p_instance) -{ - NRF_SPIM_Type * p_spim = (NRF_SPIM_Type *)p_instance->p_registers; - return nrf_spim_event_address_get(p_spim, NRF_SPIM_EVENT_END); -} -#endif // SPIM_IN_USE - -#ifdef SPI_IN_USE -static void irq_handler_spi(NRF_SPI_Type * p_spi, spi_control_block_t * p_cb) -{ - ASSERT(p_cb->handler); - - nrf_spi_event_clear(p_spi, NRF_SPI_EVENT_READY); - NRF_LOG_DEBUG("SPI: Event: NRF_SPI_EVENT_READY."); - - if (!transfer_byte(p_spi, p_cb)) - { - finish_transfer(p_cb); - } -} -#endif // SPI_IN_USE - -#if NRF_MODULE_ENABLED(SPI0) -IRQ_HANDLER(0) -{ - spi_control_block_t * p_cb = &m_cb[SPI0_INSTANCE_INDEX]; - #if (SPI0_WITH_DMA || SPIM_ONLY) - irq_handler_spim(NRF_SPIM0, p_cb); - #else - irq_handler_spi(NRF_SPI0, p_cb); - #endif -} -#endif // NRF_MODULE_ENABLED(SPI0) - -#if NRF_MODULE_ENABLED(SPI1) -IRQ_HANDLER(1) -{ - spi_control_block_t * p_cb = &m_cb[SPI1_INSTANCE_INDEX]; - #if (SPI1_WITH_DMA || SPIM_ONLY) - irq_handler_spim(NRF_SPIM1, p_cb); - #else - irq_handler_spi(NRF_SPI1, p_cb); - #endif -} -#endif // NRF_MODULE_ENABLED(SPI1) - -#if NRF_MODULE_ENABLED(SPI2) -IRQ_HANDLER(2) -{ - spi_control_block_t * p_cb = &m_cb[SPI2_INSTANCE_INDEX]; - #if (SPI2_WITH_DMA || SPIM_ONLY) - irq_handler_spim(NRF_SPIM2, p_cb); - #else - irq_handler_spi(NRF_SPI2, p_cb); - #endif -} -/*lint -restore*/ -#endif // NRF_MODULE_ENABLED(SPI2) -#endif // ENABLED_SPI_COUNT -#endif // NRF_MODULE_ENABLED(SPI) - diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/spi_master/nrf_drv_spi.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/spi_master/nrf_drv_spi.h deleted file mode 100644 index 01eb9198be..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/spi_master/nrf_drv_spi.h +++ /dev/null @@ -1,468 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/**@file - * @addtogroup nrf_spi Serial peripheral interface (SPI/SPIM) - * @ingroup nrf_drivers - * @brief Serial peripheral interface (SPI/SPIM) APIs. - * - */ - -#ifndef NRF_DRV_SPI_H__ -#define NRF_DRV_SPI_H__ - -#include "nordic_common.h" -#include "sdk_config.h" -#include "nrf_peripherals.h" -#include "sdk_errors.h" - -#ifdef SPI0_ENABLED -#define SPI0_INCR SPI0_ENABLED -#else -#define SPI0_INCR 0 -#endif - -#ifdef SPI1_ENABLED -#define SPI1_INCR SPI1_ENABLED -#else -#define SPI1_INCR 0 -#endif - -#ifdef SPI2_ENABLED -#define SPI2_INCR SPI2_ENABLED -#else -#define SPI2_INCR 0 -#endif - -#ifdef SPI3_ENABLED -#define SPI3_INCR SPI3_ENABLED -#else -#define SPI3_INCR 0 -#endif - -#define ENABLED_SPI_COUNT (SPI0_INCR + SPI1_INCR + SPI2_INCR + SPI3_INCR) - -#ifdef SPI_PRESENT -#include "nrf_spi.h" -#endif - -#ifdef SPIM_PRESENT -#include "nrf_spim.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(SPIM_PRESENT) && defined(SPI_PRESENT) - #define NRF_DRV_SPI_PERIPHERAL(id) \ - (CONCAT_3(SPI, id, _USE_EASY_DMA) == 1 ? \ - (void *)CONCAT_2(NRF_SPIM, id) \ - : (void *)CONCAT_2(NRF_SPI, id)) - #define SPI2_IRQ SPIM2_SPIS2_SPI2_IRQn - #define SPI2_IRQ_HANDLER SPIM2_SPIS2_SPI2_IRQHandler -#elif defined (SPI_PRESENT) - #define NRF_DRV_SPI_PERIPHERAL(id) (void *)CONCAT_2(NRF_SPI, id) -#elif defined (SPIM_PRESENT) - #define NRF_DRV_SPI_PERIPHERAL(id) (void *)CONCAT_2(NRF_SPIM, id) -#endif - -#ifndef SPI_PRESENT -typedef nrf_spim_frequency_t nrf_spi_frequency_t; -typedef nrf_spim_mode_t nrf_spi_mode_t; -typedef nrf_spim_bit_order_t nrf_spi_bit_order_t; -#define NRF_SPI_PIN_NOT_CONNECTED 0xFFFFFFFF -#endif - -#ifdef NRF52810_XXAA -#define SPI0_IRQ SPIM0_SPIS0_IRQn -#define SPI0_IRQ_HANDLER SPIM0_SPIS0_IRQHandler -#else -#define SPI0_IRQ SPI0_TWI0_IRQn -#define SPI0_IRQ_HANDLER SPI0_TWI0_IRQHandler -#define SPI1_IRQ SPI1_TWI1_IRQn -#define SPI1_IRQ_HANDLER SPI1_TWI1_IRQHandler -#endif -/** - * @defgroup nrf_drv_spi SPI master driver - * @{ - * @ingroup nrf_spi - * - * @brief Multi-instance SPI master driver. - */ - -/** - * @brief SPI master driver instance data structure. - */ -typedef struct -{ - void * p_registers; ///< Pointer to the structure with SPI/SPIM peripheral instance registers. - IRQn_Type irq; ///< SPI/SPIM peripheral instance IRQ number. - uint8_t drv_inst_idx; ///< Driver instance index. - bool use_easy_dma; ///< True if the peripheral with EasyDMA (SPIM) shall be used. -} nrf_drv_spi_t; - -#define SPI0_INSTANCE_INDEX 0 -#define SPI1_INSTANCE_INDEX SPI0_INSTANCE_INDEX+SPI0_ENABLED -#define SPI2_INSTANCE_INDEX SPI1_INSTANCE_INDEX+SPI1_ENABLED - -#if defined(SPIM_PRESENT) && defined(SPI_PRESENT) -#define SPI_N_USE_EASY_DMA(_id) CONCAT_3(SPI, _id, _USE_EASY_DMA) -#elif defined(SPIM_PRESENT) && !defined(SPI_PRESENT) -#define SPI_N_USE_EASY_DMA(_id) true -#else -#define SPI_N_USE_EASY_DMA(_id) false -#endif - -/** - * @brief Macro for creating an SPI master driver instance. - */ -#define NRF_DRV_SPI_INSTANCE(id) \ -{ \ - .p_registers = NRF_DRV_SPI_PERIPHERAL(id), \ - .irq = CONCAT_3(SPI, id, _IRQ), \ - .drv_inst_idx = CONCAT_3(SPI, id, _INSTANCE_INDEX), \ - .use_easy_dma = SPI_N_USE_EASY_DMA(id) \ -} -/** - * @brief This value can be provided instead of a pin number for signals MOSI, - * MISO, and Slave Select to specify that the given signal is not used and - * therefore does not need to be connected to a pin. - */ -#define NRF_DRV_SPI_PIN_NOT_USED 0xFF - -/** - * @brief SPI data rates. - */ -typedef enum -{ - NRF_DRV_SPI_FREQ_125K = NRF_SPI_FREQ_125K, ///< 125 kbps. - NRF_DRV_SPI_FREQ_250K = NRF_SPI_FREQ_250K, ///< 250 kbps. - NRF_DRV_SPI_FREQ_500K = NRF_SPI_FREQ_500K, ///< 500 kbps. - NRF_DRV_SPI_FREQ_1M = NRF_SPI_FREQ_1M, ///< 1 Mbps. - NRF_DRV_SPI_FREQ_2M = NRF_SPI_FREQ_2M, ///< 2 Mbps. - NRF_DRV_SPI_FREQ_4M = NRF_SPI_FREQ_4M, ///< 4 Mbps. - NRF_DRV_SPI_FREQ_8M = NRF_SPI_FREQ_8M ///< 8 Mbps. -} nrf_drv_spi_frequency_t; - -/** - * @brief SPI modes. - */ -typedef enum -{ - NRF_DRV_SPI_MODE_0 = NRF_SPI_MODE_0, ///< SCK active high, sample on leading edge of clock. - NRF_DRV_SPI_MODE_1 = NRF_SPI_MODE_1, ///< SCK active high, sample on trailing edge of clock. - NRF_DRV_SPI_MODE_2 = NRF_SPI_MODE_2, ///< SCK active low, sample on leading edge of clock. - NRF_DRV_SPI_MODE_3 = NRF_SPI_MODE_3 ///< SCK active low, sample on trailing edge of clock. -} nrf_drv_spi_mode_t; - -/** - * @brief SPI bit orders. - */ -typedef enum -{ - NRF_DRV_SPI_BIT_ORDER_MSB_FIRST = NRF_SPI_BIT_ORDER_MSB_FIRST, ///< Most significant bit shifted out first. - NRF_DRV_SPI_BIT_ORDER_LSB_FIRST = NRF_SPI_BIT_ORDER_LSB_FIRST ///< Least significant bit shifted out first. -} nrf_drv_spi_bit_order_t; - -/** - * @brief SPI master driver instance configuration structure. - */ -typedef struct -{ - uint8_t sck_pin; ///< SCK pin number. - uint8_t mosi_pin; ///< MOSI pin number (optional). - /**< Set to @ref NRF_DRV_SPI_PIN_NOT_USED - * if this signal is not needed. */ - uint8_t miso_pin; ///< MISO pin number (optional). - /**< Set to @ref NRF_DRV_SPI_PIN_NOT_USED - * if this signal is not needed. */ - uint8_t ss_pin; ///< Slave Select pin number (optional). - /**< Set to @ref NRF_DRV_SPI_PIN_NOT_USED - * if this signal is not needed. The driver - * supports only active low for this signal. - * If the signal should be active high, - * it must be controlled externally. */ - uint8_t irq_priority; ///< Interrupt priority. - uint8_t orc; ///< Over-run character. - /**< This character is used when all bytes from the TX buffer are sent, - but the transfer continues due to RX. */ - nrf_drv_spi_frequency_t frequency; ///< SPI frequency. - nrf_drv_spi_mode_t mode; ///< SPI mode. - nrf_drv_spi_bit_order_t bit_order; ///< SPI bit order. -} nrf_drv_spi_config_t; - -/** - * @brief SPI master instance default configuration. - */ -#define NRF_DRV_SPI_DEFAULT_CONFIG \ -{ \ - .sck_pin = NRF_DRV_SPI_PIN_NOT_USED, \ - .mosi_pin = NRF_DRV_SPI_PIN_NOT_USED, \ - .miso_pin = NRF_DRV_SPI_PIN_NOT_USED, \ - .ss_pin = NRF_DRV_SPI_PIN_NOT_USED, \ - .irq_priority = SPI_DEFAULT_CONFIG_IRQ_PRIORITY, \ - .orc = 0xFF, \ - .frequency = NRF_DRV_SPI_FREQ_4M, \ - .mode = NRF_DRV_SPI_MODE_0, \ - .bit_order = NRF_DRV_SPI_BIT_ORDER_MSB_FIRST, \ -} - -#define NRF_DRV_SPI_FLAG_TX_POSTINC (1UL << 0) /**< TX buffer address incremented after transfer. */ -#define NRF_DRV_SPI_FLAG_RX_POSTINC (1UL << 1) /**< RX buffer address incremented after transfer. */ -#define NRF_DRV_SPI_FLAG_NO_XFER_EVT_HANDLER (1UL << 2) /**< Interrupt after each transfer is suppressed, and the event handler is not called. */ -#define NRF_DRV_SPI_FLAG_HOLD_XFER (1UL << 3) /**< Set up the transfer but do not start it. */ -#define NRF_DRV_SPI_FLAG_REPEATED_XFER (1UL << 4) /**< Flag indicating that the transfer will be executed multiple times. */ - -/** - * @brief Single transfer descriptor structure. - */ -typedef struct -{ - uint8_t const * p_tx_buffer; ///< Pointer to TX buffer. - uint8_t tx_length; ///< TX buffer length. - uint8_t * p_rx_buffer; ///< Pointer to RX buffer. - uint8_t rx_length; ///< RX buffer length. -}nrf_drv_spi_xfer_desc_t; - -/** - * @brief Macro for setting up single transfer descriptor. - * - * This macro is for internal use only. - */ -#define NRF_DRV_SPI_SINGLE_XFER(p_tx, tx_len, p_rx, rx_len) \ - { \ - .p_tx_buffer = (uint8_t const *)(p_tx), \ - .tx_length = (tx_len), \ - .p_rx_buffer = (p_rx), \ - .rx_length = (rx_len), \ - } - -/** - * @brief Macro for setting duplex TX RX transfer. - */ -#define NRF_DRV_SPI_XFER_TRX(p_tx_buf, tx_length, p_rx_buf, rx_length) \ - NRF_DRV_SPI_SINGLE_XFER(p_tx_buf, tx_length, p_rx_buf, rx_length) - -/** - * @brief Macro for setting TX transfer. - */ -#define NRF_DRV_SPI_XFER_TX(p_buf, length) \ - NRF_DRV_SPI_SINGLE_XFER(p_buf, length, NULL, 0) - -/** - * @brief Macro for setting RX transfer. - */ -#define NRF_DRV_SPI_XFER_RX(p_buf, length) \ - NRF_DRV_SPI_SINGLE_XFER(NULL, 0, p_buf, length) - -/** - * @brief SPI master driver event types, passed to the handler routine provided - * during initialization. - */ -typedef enum -{ - NRF_DRV_SPI_EVENT_DONE, ///< Transfer done. -} nrf_drv_spi_evt_type_t; - -typedef struct -{ - nrf_drv_spi_evt_type_t type; ///< Event type. - union - { - nrf_drv_spi_xfer_desc_t done; ///< Event data for DONE event. - } data; -} nrf_drv_spi_evt_t; - -/** - * @brief SPI master driver event handler type. - */ -typedef void (* nrf_drv_spi_evt_handler_t)(nrf_drv_spi_evt_t const * p_event, - void * p_context); - -/** - * @brief Function for initializing the SPI master driver instance. - * - * This function configures and enables the specified peripheral. - * - * @note MISO pin has pull down enabled. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_config Pointer to the structure with the initial configuration. - * - * @param handler Event handler provided by the user. If NULL, transfers - * will be performed in blocking mode. - * @param p_context Context passed to event handler. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the driver was already initialized. - * @retval NRF_ERROR_BUSY If some other peripheral with the same - * instance ID is already in use. This is - * possible only if PERIPHERAL_RESOURCE_SHARING_ENABLED - * is set to a value other than zero. - */ -ret_code_t nrf_drv_spi_init(nrf_drv_spi_t const * const p_instance, - nrf_drv_spi_config_t const * p_config, - nrf_drv_spi_evt_handler_t handler, - void * p_context); - -/** - * @brief Function for uninitializing the SPI master driver instance. - * - * @note Configuration of pins is kept. - * - * @param[in] p_instance Pointer to the driver instance structure. - */ -void nrf_drv_spi_uninit(nrf_drv_spi_t const * const p_instance); - -/** - * @brief Function for starting the SPI data transfer. - * - * If an event handler was provided in the @ref nrf_drv_spi_init call, this function - * returns immediately and the handler is called when the transfer is done. - * Otherwise, the transfer is performed in blocking mode, which means that this function - * returns when the transfer is finished. - * - * @note Peripherals using EasyDMA (for example, SPIM) require the transfer buffers - * to be placed in the Data RAM region. If they are not and an SPIM instance is - * used, this function will fail with the error code NRF_ERROR_INVALID_ADDR. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_tx_buffer Pointer to the transmit buffer. Can be NULL - * if there is nothing to send. - * @param tx_buffer_length Length of the transmit buffer. - * @param[in] p_rx_buffer Pointer to the receive buffer. Can be NULL - * if there is nothing to receive. - * @param rx_buffer_length Length of the receive buffer. - * - * @retval NRF_SUCCESS If the operation was successful. - * @retval NRF_ERROR_BUSY If a previously started transfer has not finished - * yet. - * @retval NRF_ERROR_INVALID_ADDR If the provided buffers are not placed in the Data - * RAM region. - */ -ret_code_t nrf_drv_spi_transfer(nrf_drv_spi_t const * const p_instance, - uint8_t const * p_tx_buffer, - uint8_t tx_buffer_length, - uint8_t * p_rx_buffer, - uint8_t rx_buffer_length); - -/** - * @brief Function for starting the SPI data transfer with additional option flags. - * - * Function enables customizing the transfer by using option flags. - * - * Additional options are provided using the flags parameter: - * - * - @ref NRF_DRV_SPI_FLAG_TX_POSTINC and @ref NRF_DRV_SPI_FLAG_RX_POSTINC: - * Post-incrementation of buffer addresses. Supported only by SPIM. - * - @ref NRF_DRV_SPI_FLAG_HOLD_XFER: Driver is not starting the transfer. Use this - * flag if the transfer is triggered externally by PPI. Supported only by SPIM. Use - * @ref nrf_drv_spi_start_task_get to get the address of the start task. - * - @ref NRF_DRV_SPI_FLAG_NO_XFER_EVT_HANDLER: No user event handler after transfer - * completion. This also means no interrupt at the end of the transfer. Supported only by SPIM. - * If @ref NRF_DRV_SPI_FLAG_NO_XFER_EVT_HANDLER is used, the driver does not set the instance into - * busy state, so you must ensure that the next transfers are set up when SPIM is not active. - * @ref nrf_drv_spi_end_event_get function can be used to detect end of transfer. Option can be used - * together with @ref NRF_DRV_SPI_FLAG_REPEATED_XFER to prepare a sequence of SPI transfers - * without interruptions. - * - @ref NRF_DRV_SPI_FLAG_REPEATED_XFER: Prepare for repeated transfers. You can set - * up a number of transfers that will be triggered externally (for example by PPI). An example is - * a TXRX transfer with the options @ref NRF_DRV_SPI_FLAG_RX_POSTINC, - * @ref NRF_DRV_SPI_FLAG_NO_XFER_EVT_HANDLER, and @ref NRF_DRV_SPI_FLAG_REPEATED_XFER. After the - * transfer is set up, a set of transfers can be triggered by PPI that will read, for example, - * the same register of an external component and put it into a RAM buffer without any interrupts. - * @ref nrf_drv_spi_end_event_get can be used to get the address of the END event, which can be - * used to count the number of transfers. If @ref NRF_DRV_SPI_FLAG_REPEATED_XFER is used, - * the driver does not set the instance into busy state, so you must ensure that the next - * transfers are set up when SPIM is not active. Supported only by SPIM. - * @note Function is intended to be used only in non-blocking mode. - * - * @param p_instance Pointer to the driver instance structure. - * @param p_xfer_desc Pointer to the transfer descriptor. - * @param flags Transfer options (0 for default settings). - * - * @retval NRF_SUCCESS If the procedure was successful. - * @retval NRF_ERROR_BUSY If the driver is not ready for a new transfer. - * @retval NRF_ERROR_NOT_SUPPORTED If the provided parameters are not supported. - * @retval NRF_ERROR_INVALID_ADDR If the provided buffers are not placed in the Data - * RAM region. - */ -ret_code_t nrf_drv_spi_xfer(nrf_drv_spi_t const * const p_instance, - nrf_drv_spi_xfer_desc_t const * p_xfer_desc, - uint32_t flags); - -/** - * @brief Function for returning the address of a SPIM start task. - * - * This function should be used if @ref nrf_drv_spi_xfer was called with the flag @ref NRF_DRV_SPI_FLAG_HOLD_XFER. - * In that case, the transfer is not started by the driver, but it must be started externally by PPI. - * - * @param[in] p_instance Pointer to the driver instance structure. - * - * @return Start task address. - */ -uint32_t nrf_drv_spi_start_task_get(nrf_drv_spi_t const * p_instance); - -/** - * @brief Function for returning the address of a END SPIM event. - * - * A END event can be used to detect the end of a transfer if the @ref NRF_DRV_SPI_FLAG_NO_XFER_EVT_HANDLER - * option is used. - * - * @param[in] p_instance Pointer to the driver instance structure. - * - * @return END event address. - */ -uint32_t nrf_drv_spi_end_event_get(nrf_drv_spi_t const * p_instance); - -/** - * @brief Function for aborting ongoing transfer. - * - * @param[in] p_instance Pointer to the driver instance structure. - */ -void nrf_drv_spi_abort(nrf_drv_spi_t const * p_instance); - -#ifdef __cplusplus -} -#endif - -#endif // NRF_DRV_SPI_H__ - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/spi_slave/nrf_drv_spis.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/spi_slave/nrf_drv_spis.h deleted file mode 100644 index 069773d3b9..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/spi_slave/nrf_drv_spis.h +++ /dev/null @@ -1,286 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/**@file - * @addtogroup nrf_spis SPIS HAL and driver - * @ingroup nrf_drivers - * @brief SPIS APIs. - * - */ - -#ifndef SPI_SLAVE_H__ -#define SPI_SLAVE_H__ - -#include -#include "nrf.h" -#include "nrf_error.h" -#include "sdk_config.h" -#include "nrf_spis.h" -#include "nrf_gpio.h" -#include "sdk_common.h" -#include "app_util_platform.h" -#include "nrf_peripherals.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SPIS0_ENABLED -#define SPIS0_INCR SPIS0_ENABLED -#else -#define SPIS0_INCR 0 -#endif - -#ifdef SPIS1_ENABLED -#define SPIS1_INCR SPIS1_ENABLED -#else -#define SPIS1_INCR 0 -#endif - -#ifdef SPIS2_ENABLED -#define SPIS2_INCR SPIS2_ENABLED -#else -#define SPIS2_INCR 0 -#endif - -#define ENABLED_SPIS_COUNT (SPIS0_INCR + SPIS1_INCR + SPIS2_INCR) - -#ifdef NRF52810_XXAA - #define SPIS0_IRQ SPIM0_SPIS0_IRQn - #define SPIS0_IRQ_HANDLER SPIM0_SPIS0_IRQHandler -#else - #define SPIS0_IRQ SPI0_TWI0_IRQn - #define SPIS0_IRQ_HANDLER SPI0_TWI0_IRQHandler - #define SPIS1_IRQ SPI1_TWI1_IRQn - #define SPIS1_IRQ_HANDLER SPI1_TWI1_IRQHandler -#if SPIS_COUNT > 2 - #define SPIS2_IRQ SPIM2_SPIS2_SPI2_IRQn - #define SPIS2_IRQ_HANDLER SPIM2_SPIS2_SPI2_IRQHandler -#endif -#endif // NRF52810_XXAA -/** - * @defgroup nrf_drv_spis SPI slave driver - * @{ - * @ingroup nrf_spis - * @brief Multi-instance SPI slave driver. - */ - -#define NRF_DRV_SPIS_DEFAULT_CSN_PULLUP NRF_GPIO_PIN_NOPULL /**< Default pull-up configuration of the SPI CS. */ -#define NRF_DRV_SPIS_DEFAULT_MISO_DRIVE NRF_GPIO_PIN_S0S1 /**< Default drive configuration of the SPI MISO. */ - -/** -* @brief This value can be provided instead of a pin number for the signals MOSI -* and MISO to specify that the given signal is not used and therefore -* does not need to be connected to a pin. -*/ -#define NRF_DRV_SPIS_PIN_NOT_USED 0xFF - -/** @brief SPIS transaction bit order definitions. */ -typedef enum -{ - NRF_DRV_SPIS_BIT_ORDER_LSB_FIRST = NRF_SPIS_BIT_ORDER_LSB_FIRST, /**< Least significant bit shifted out first. */ - NRF_DRV_SPIS_BIT_ORDER_MSB_FIRST = NRF_SPIS_BIT_ORDER_MSB_FIRST /**< Most significant bit shifted out first. */ -} nrf_drv_spis_endian_t; - -/** @brief SPIS mode definitions for clock polarity and phase. */ -typedef enum -{ - NRF_DRV_SPIS_MODE_0 = NRF_SPIS_MODE_0, /**< (CPOL = 0, CPHA = 0). */ - NRF_DRV_SPIS_MODE_1 = NRF_SPIS_MODE_1, /**< (CPOL = 0, CPHA = 1). */ - NRF_DRV_SPIS_MODE_2 = NRF_SPIS_MODE_2, /**< (CPOL = 1, CPHA = 0). */ - NRF_DRV_SPIS_MODE_3 = NRF_SPIS_MODE_3 /**< (CPOL = 1, CPHA = 1). */ -} nrf_drv_spis_mode_t; - -/** @brief Event callback function event definitions. */ -typedef enum -{ - NRF_DRV_SPIS_BUFFERS_SET_DONE, /**< Memory buffer set event. Memory buffers have been set successfully to the SPI slave device, and SPI transactions can be done. */ - NRF_DRV_SPIS_XFER_DONE, /**< SPI transaction event. SPI transaction has been completed. */ - NRF_DRV_SPIS_EVT_TYPE_MAX /**< Enumeration upper bound. */ -} nrf_drv_spis_event_type_t; - -/** @brief Structure containing the event context from the SPI slave driver. */ -typedef struct -{ - nrf_drv_spis_event_type_t evt_type; //!< Type of event. - uint32_t rx_amount; //!< Number of bytes received in last transaction. This parameter is only valid for @ref NRF_DRV_SPIS_XFER_DONE events. - uint32_t tx_amount; //!< Number of bytes transmitted in last transaction. This parameter is only valid for @ref NRF_DRV_SPIS_XFER_DONE events. -} nrf_drv_spis_event_t; - -/** @brief SPI slave driver instance data structure. */ -typedef struct -{ - NRF_SPIS_Type * p_reg; //!< SPIS instance register. - uint8_t instance_id; //!< SPIS instance ID. - IRQn_Type irq; //!< IRQ of the specific instance. -} nrf_drv_spis_t; - -#define SPIS0_INSTANCE_INDEX 0 -#define SPIS1_INSTANCE_INDEX SPIS0_INSTANCE_INDEX+SPIS0_ENABLED -#define SPIS2_INSTANCE_INDEX SPIS1_INSTANCE_INDEX+SPIS1_ENABLED - -/** @brief Macro for creating an SPI slave driver instance. */ -#define NRF_DRV_SPIS_INSTANCE(id) \ -{ \ - .p_reg = CONCAT_2(NRF_SPIS, id), \ - .irq = CONCAT_3(SPIS, id, _IRQ), \ - .instance_id = CONCAT_3(SPIS, id, _INSTANCE_INDEX), \ -} - -/** @brief SPI slave instance default configuration. */ -#define NRF_DRV_SPIS_DEFAULT_CONFIG \ -{ \ - .sck_pin = NRF_DRV_SPIS_PIN_NOT_USED, \ - .mosi_pin = NRF_DRV_SPIS_PIN_NOT_USED, \ - .miso_pin = NRF_DRV_SPIS_PIN_NOT_USED, \ - .csn_pin = NRF_DRV_SPIS_PIN_NOT_USED, \ - .miso_drive = NRF_DRV_SPIS_DEFAULT_MISO_DRIVE, \ - .csn_pullup = NRF_DRV_SPIS_DEFAULT_CSN_PULLUP, \ - .orc = SPIS_DEFAULT_ORC, \ - .def = SPIS_DEFAULT_DEF, \ - .mode = (nrf_drv_spis_mode_t)SPIS_DEFAULT_MODE, \ - .bit_order = (nrf_drv_spis_endian_t)SPIS_DEFAULT_BIT_ORDER, \ - .irq_priority = SPIS_DEFAULT_CONFIG_IRQ_PRIORITY, \ -} - -/** @brief SPI peripheral device configuration data. */ -typedef struct -{ - uint32_t miso_pin; //!< SPI MISO pin (optional). - /**< Set @ref NRF_DRV_SPIS_PIN_NOT_USED - * if this signal is not needed. */ - uint32_t mosi_pin; //!< SPI MOSI pin (optional). - /**< Set @ref NRF_DRV_SPIS_PIN_NOT_USED - * if this signal is not needed. */ - uint32_t sck_pin; //!< SPI SCK pin. - uint32_t csn_pin; //!< SPI CSN pin. - nrf_drv_spis_mode_t mode; //!< SPI mode. - nrf_drv_spis_endian_t bit_order; //!< SPI transaction bit order. - nrf_gpio_pin_pull_t csn_pullup; //!< CSN pin pull-up configuration. - nrf_gpio_pin_drive_t miso_drive; //!< MISO pin drive configuration. - uint8_t def; //!< Character clocked out in case of an ignored transaction. - uint8_t orc; //!< Character clocked out after an over-read of the transmit buffer. - uint8_t irq_priority; //!< Interrupt priority. -} nrf_drv_spis_config_t; - - -/** @brief SPI slave event callback function type. - * - * @param[in] event SPI slave driver event. - */ -typedef void (*nrf_drv_spis_event_handler_t)(nrf_drv_spis_event_t event); - -/** @brief Function for initializing the SPI slave driver instance. - * - * @note When the nRF52 Anomaly 109 workaround for SPIS is enabled, this function - * initializes the GPIOTE driver as well, and uses one of GPIOTE channels - * to detect falling edges on CSN pin. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_config Pointer to the structure with the initial configuration. - * If NULL, the default configuration will be used. - * @param[in] event_handler Function to be called by the SPI slave driver upon event. - * - * @retval NRF_SUCCESS If the initialization was successful. - * @retval NRF_ERROR_INVALID_PARAM If an invalid parameter is supplied. - * @retval NRF_ERROR_BUSY If some other peripheral with the same - * instance ID is already in use. This is - * possible only if PERIPHERAL_RESOURCE_SHARING_ENABLED - * is set to a value other than zero. - * @retval NRF_ERROR_INTERNAL GPIOTE channel for detecting falling edges - * on CSN pin cannot be initialized. Possible - * only when using nRF52 Anomaly 109 workaround. - */ -ret_code_t nrf_drv_spis_init(nrf_drv_spis_t const * const p_instance, - nrf_drv_spis_config_t const * p_config, - nrf_drv_spis_event_handler_t event_handler); - -/** - * @brief Function for uninitializing the SPI slave driver instance. - * - * @param[in] p_instance Pointer to the driver instance structure. - */ -void nrf_drv_spis_uninit(nrf_drv_spis_t const * const p_instance); - -/** @brief Function for preparing the SPI slave instance for a single SPI transaction. - * - * This function prepares the SPI slave device to be ready for a single SPI transaction. It configures - * the SPI slave device to use the memory supplied with the function call in SPI transactions. - * - * When either the memory buffer configuration or the SPI transaction has been - * completed, the event callback function will be called with the appropriate event - * @ref nrf_drv_spis_event_type_t. Note that the callback function can be called before returning from - * this function, because it is called from the SPI slave interrupt context. - * - * @note This function can be called from the callback function context. - * - * @note Client applications must call this function after every @ref NRF_DRV_SPIS_XFER_DONE event if - * the SPI slave driver should be prepared for a possible new SPI transaction. - * - * @note Peripherals that are using EasyDMA (for example, SPIS) require the transfer buffers - * to be placed in the Data RAM region. Otherwise, this function will fail - * with the error code NRF_ERROR_INVALID_ADDR. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_tx_buffer Pointer to the TX buffer. - * @param[in] p_rx_buffer Pointer to the RX buffer. - * @param[in] tx_buffer_length Length of the TX buffer in bytes. - * @param[in] rx_buffer_length Length of the RX buffer in bytes. - * - * @retval NRF_SUCCESS If the operation was successful. - * @retval NRF_ERROR_NULL If the operation failed because a NULL pointer was supplied. - * @retval NRF_ERROR_INVALID_STATE If the operation failed because the SPI slave device is in an incorrect state. - * @retval NRF_ERROR_INVALID_ADDR If the provided buffers are not placed in the Data - * RAM region. - * @retval NRF_ERROR_INTERNAL If the operation failed because of an internal error. - */ -ret_code_t nrf_drv_spis_buffers_set(nrf_drv_spis_t const * const p_instance, - const uint8_t * p_tx_buffer, - uint8_t tx_buffer_length, - uint8_t * p_rx_buffer, - uint8_t rx_buffer_length); - - -#ifdef __cplusplus -} -#endif - -#endif // SPI_SLAVE_H__ - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/swi/nrf_drv_swi.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/swi/nrf_drv_swi.c deleted file mode 100644 index 0d1ad30a42..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/swi/nrf_drv_swi.c +++ /dev/null @@ -1,508 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include "nrf_drv_common.h" -#include "nrf_error.h" -#include "nrf_assert.h" -#include -#include -#include -#include "nrf_drv_swi.h" -#include "app_util_platform.h" - -#define NRF_LOG_MODULE_NAME swi - -#if EGU_ENABLED -#if SWI_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL SWI_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR SWI_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR SWI_CONFIG_DEBUG_COLOR -#else //SWI_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL 0 -#endif //SWI_CONFIG_LOG_ENABLED -#endif //EGU_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); - -STATIC_ASSERT(SWI_COUNT > 0); - -#ifdef SWI_DISABLE0 - #undef SWI_DISABLE0 - #define SWI_DISABLE0 1uL -#else - #if SWI_COUNT > 0 - #define SWI_DISABLE0 0uL - #else - #define SWI_DISABLE0 1uL - #endif -#endif - -#ifdef SWI_DISABLE1 - #undef SWI_DISABLE1 - #define SWI_DISABLE1 1uL -#else - #if SWI_COUNT > 1 - #define SWI_DISABLE1 0uL - #else - #define SWI_DISABLE1 1uL - #endif -#endif - -#ifdef SWI_DISABLE2 - #undef SWI_DISABLE2 - #define SWI_DISABLE2 1uL -#else - #if SWI_COUNT > 2 - #define SWI_DISABLE2 0uL - #else - #define SWI_DISABLE2 1uL - #endif -#endif - -#ifdef SWI_DISABLE3 - #undef SWI_DISABLE3 - #define SWI_DISABLE3 1uL -#else - #if SWI_COUNT > 3 - #define SWI_DISABLE3 0uL - #else - #define SWI_DISABLE3 1uL - #endif -#endif - -#ifdef SWI_DISABLE4 - #undef SWI_DISABLE4 - #define SWI_DISABLE4 1uL -#else - #if SWI_COUNT > 4 - #define SWI_DISABLE4 0uL - #else - #define SWI_DISABLE4 1uL - #endif -#endif - -#ifdef SWI_DISABLE5 - #undef SWI_DISABLE5 - #define SWI_DISABLE5 1uL -#else - #if SWI_COUNT > 5 - #define SWI_DISABLE5 0uL - #else - #define SWI_DISABLE5 1uL - #endif -#endif - -#define SWI_START_NUMBER ( (SWI_DISABLE0) \ - + (SWI_DISABLE0 * SWI_DISABLE1) \ - + (SWI_DISABLE0 * SWI_DISABLE1 * SWI_DISABLE2) \ - + (SWI_DISABLE0 * SWI_DISABLE1 * SWI_DISABLE2 * SWI_DISABLE3) \ - + (SWI_DISABLE0 * SWI_DISABLE1 * SWI_DISABLE2 * SWI_DISABLE3 * SWI_DISABLE4) \ - + (SWI_DISABLE0 * SWI_DISABLE1 * SWI_DISABLE2 * SWI_DISABLE3 * SWI_DISABLE4 \ - * SWI_DISABLE5) ) - -#if (SWI_COUNT <= SWI_START_NUMBER) - #define SWI_ARRAY_SIZE 1 -#else - #define SWI_ARRAY_SIZE (SWI_COUNT - SWI_START_NUMBER) -#endif - -static nrf_drv_state_t m_drv_state = NRF_DRV_STATE_UNINITIALIZED; -static nrf_swi_handler_t m_swi_handlers[SWI_ARRAY_SIZE]; - -#if !EGU_ENABLED - static nrf_swi_flags_t m_swi_flags[SWI_ARRAY_SIZE]; - #define SWI_EGU_MIXED (0) - #define SWI_MAX_FLAGS (16u) -#elif ((SWI_ARRAY_SIZE > EGU_COUNT) && (SWI_COUNT > EGU_COUNT)) - #define SWI_EGU_MIXED (1u) - #define SWI_MAX_FLAGS (16u) - static nrf_swi_flags_t m_swi_flags[SWI_ARRAY_SIZE - EGU_COUNT]; -#else - #define SWI_EGU_MIXED (0) -#endif - -#if NRF_MODULE_ENABLED(EGU) -#define SWI_EGU_CH_DEF(_idx_, _arg_) CONCAT_3(EGU, _idx_, _CH_NUM), -#endif -/**@brief Function for getting max channel number of given SWI. - * - * @param[in] swi SWI number. - * @return number of available channels. - */ -uint32_t swi_channel_number(nrf_swi_t swi) -{ -#if NRF_MODULE_ENABLED(EGU) - static uint8_t const egu_ch_count[] = {MACRO_REPEAT_FOR(EGU_COUNT, SWI_EGU_CH_DEF)}; - - if (swi < EGU_COUNT) - { - return (uint32_t)egu_ch_count[swi]; - } - #if SWI_EGU_MIXED - if (swi < SWI_COUNT) - { - return (uint32_t)SWI_MAX_FLAGS; - } - #endif -#else // only SWI - if (swi < SWI_COUNT) - { - return (uint32_t)SWI_MAX_FLAGS; - } -#endif // NRF_MODULE_ENABLED(EGU) - - return 0; -} - -#if NRF_MODULE_ENABLED(EGU) -/**@brief Get the specific EGU instance. */ -__STATIC_INLINE NRF_EGU_Type * egu_instance_get(nrf_swi_t swi) -{ -#if SWI_EGU_MIXED - if (!(swi < EGU_COUNT)) - { - return NULL; - } -#endif - return (NRF_EGU_Type*) (NRF_EGU0_BASE + - (((uint32_t) swi) * (NRF_EGU1_BASE - NRF_EGU0_BASE))); -} - -/**@brief Software interrupt handler (can be using EGU). */ -static void nrf_drv_swi_process(nrf_swi_t swi, nrf_swi_flags_t flags) -{ - ASSERT(swi < SWI_COUNT); - - ASSERT(m_swi_handlers[swi - SWI_START_NUMBER]); - NRF_EGU_Type * NRF_EGUx = egu_instance_get(swi); - - if (NRF_EGUx != NULL) - { - flags = 0; - for (uint8_t i = 0; i < swi_channel_number(swi); ++i) - { - nrf_egu_event_t egu_event = nrf_egu_event_triggered_get(NRF_EGUx, i); - if (nrf_egu_event_check(NRF_EGUx, egu_event)) - { - flags |= (1u << i); - nrf_egu_event_clear(NRF_EGUx, egu_event); - } - } - } -#if SWI_EGU_MIXED // this code is needed to handle SWI instances without EGU - else - { - m_swi_flags[swi - SWI_START_NUMBER - EGU_COUNT] &= ~flags; - } -#endif - m_swi_handlers[swi - SWI_START_NUMBER](swi, flags); -} - -#else -/**@brief Software interrupt handler (without EGU). */ -static void nrf_drv_swi_process(nrf_swi_t swi, nrf_swi_flags_t flags) -{ - ASSERT(m_swi_handlers[swi - SWI_START_NUMBER]); - m_swi_flags[swi - SWI_START_NUMBER] &= ~flags; - m_swi_handlers[swi - SWI_START_NUMBER](swi, flags); -} -#endif - -#if NRF_MODULE_ENABLED(EGU) - #if SWI_EGU_MIXED - #define SWI_EGU_HANDLER_TEMPLATE(NUM) void SWI##NUM##_EGU##NUM##_IRQHandler(void) \ - { \ - nrf_drv_swi_process(NUM, 0); \ - } - #define SWI_HANDLER_TEMPLATE(NUM) void SWI##NUM##_IRQHandler(void) \ - { \ - nrf_drv_swi_process((NUM), \ - m_swi_flags[(NUM) - SWI_START_NUMBER - EGU_COUNT]);\ - } - #else - #define SWI_HANDLER_TEMPLATE(NUM) void SWI##NUM##_EGU##NUM##_IRQHandler(void) \ - { \ - nrf_drv_swi_process(NUM, 0); \ - } - #endif // SWI_EGU_MIXED -#else - #define SWI_HANDLER_TEMPLATE(NUM) void SWI##NUM##_IRQHandler(void) \ - { \ - nrf_drv_swi_process((NUM), m_swi_flags[(NUM) - SWI_START_NUMBER]); \ - } -#endif // NRF_MODULE_ENABLED(EGU) - - -#if SWI_EGU_MIXED == 0 - #if SWI_DISABLE0 == 0 - SWI_HANDLER_TEMPLATE(0) - #endif - - #if SWI_DISABLE1 == 0 - SWI_HANDLER_TEMPLATE(1) - #endif - - #if SWI_DISABLE2 == 0 - SWI_HANDLER_TEMPLATE(2) - #endif - - #if SWI_DISABLE3 == 0 - SWI_HANDLER_TEMPLATE(3) - #endif - - #if SWI_DISABLE4 == 0 - SWI_HANDLER_TEMPLATE(4) - #endif - - #if SWI_DISABLE5 == 0 - SWI_HANDLER_TEMPLATE(5) - #endif -#else // SWI_EGU_MIXED == 1: SWI and SWI_EGU handlers - #if SWI_DISABLE0 == 0 - SWI_EGU_HANDLER_TEMPLATE(0) - #endif - - #if SWI_DISABLE1 == 0 - SWI_EGU_HANDLER_TEMPLATE(1) // NRF52810_XXAA has 2xSWI-EGU and 4xSWI - #endif - - #if SWI_DISABLE2 == 0 - SWI_HANDLER_TEMPLATE(2) - #endif - - #if SWI_DISABLE3 == 0 - SWI_HANDLER_TEMPLATE(3) - #endif - - #if SWI_DISABLE4 == 0 - SWI_HANDLER_TEMPLATE(4) - #endif - - #if SWI_DISABLE5 == 0 - SWI_HANDLER_TEMPLATE(5) - #endif -#endif // SWI_EGU_MIXED == 0 - -#define AVAILABLE_SWI (0x3FuL & ~( \ - (SWI_DISABLE0 << 0) | (SWI_DISABLE1 << 1) | (SWI_DISABLE2 << 2) \ - | (SWI_DISABLE3 << 3) | (SWI_DISABLE4 << 4) | (SWI_DISABLE5 << 5) \ - )) - -#if (AVAILABLE_SWI == 0) - #warning No available SWIs. -#endif - -/**@brief Function for converting SWI number to system interrupt number. - * - * @param[in] swi SWI number. - * - * @retval IRQ number. - */ -__STATIC_INLINE IRQn_Type nrf_drv_swi_irq_of(nrf_swi_t swi) -{ - return (IRQn_Type)((uint32_t)SWI0_IRQn + (uint32_t)swi); -} - - -/**@brief Function for checking if given SWI is allocated. - * - * @param[in] swi SWI number. - */ -__STATIC_INLINE bool swi_is_allocated(nrf_swi_t swi) -{ - ASSERT(swi < SWI_COUNT); -#if SWI_START_NUMBER > 0 - if (swi < SWI_START_NUMBER) - { - return false; - } -#endif - /*lint -e(661) out of range case handled by assert above*/ - return m_swi_handlers[swi - SWI_START_NUMBER]; -} - -ret_code_t nrf_drv_swi_init(void) -{ - ret_code_t err_code; - - if (m_drv_state == NRF_DRV_STATE_UNINITIALIZED) - { - m_drv_state = NRF_DRV_STATE_INITIALIZED; - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - err_code = NRF_ERROR_MODULE_ALREADY_INITIALIZED; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -void nrf_drv_swi_uninit(void) -{ - ASSERT(m_drv_state != NRF_DRV_STATE_UNINITIALIZED) - - for (uint32_t i = SWI_START_NUMBER; i < SWI_COUNT; ++i) - { - m_swi_handlers[i - SWI_START_NUMBER] = NULL; - nrf_drv_common_irq_disable(nrf_drv_swi_irq_of((nrf_swi_t) i)); -#if NRF_MODULE_ENABLED(EGU) - NRF_EGU_Type * NRF_EGUx = egu_instance_get(i); - if (NRF_EGUx != NULL) - { - nrf_egu_int_disable(NRF_EGUx, NRF_EGU_INT_ALL); - } -#endif - } - m_drv_state = NRF_DRV_STATE_UNINITIALIZED; - return; -} - - -void nrf_drv_swi_free(nrf_swi_t * p_swi) -{ - ASSERT(swi_is_allocated(*p_swi)); - nrf_drv_common_irq_disable(nrf_drv_swi_irq_of(*p_swi)); - m_swi_handlers[(*p_swi) - SWI_START_NUMBER] = NULL; - *p_swi = NRF_SWI_UNALLOCATED; -} - - -ret_code_t nrf_drv_swi_alloc(nrf_swi_t * p_swi, nrf_swi_handler_t event_handler, uint32_t priority) -{ -#if !NRF_MODULE_ENABLED(EGU) - ASSERT(event_handler); -#endif - uint32_t err_code = NRF_ERROR_NO_MEM; - - for (uint32_t i = SWI_START_NUMBER; i < SWI_COUNT; i++) - { - CRITICAL_REGION_ENTER(); - if ((!swi_is_allocated(i)) && (AVAILABLE_SWI & (1 << i))) - { - m_swi_handlers[i - SWI_START_NUMBER] = event_handler; - *p_swi = (nrf_swi_t) i; - nrf_drv_common_irq_enable(nrf_drv_swi_irq_of(*p_swi), priority); -#if NRF_MODULE_ENABLED(EGU) - if ((event_handler != NULL) && (i < EGU_COUNT)) - { - NRF_EGU_Type * NRF_EGUx = egu_instance_get(i); - if (NRF_EGUx != NULL) - { - nrf_egu_int_enable(NRF_EGUx, NRF_EGU_INT_ALL); - } - } - #if SWI_EGU_MIXED - if (i >= EGU_COUNT) - { - ASSERT(event_handler); - } - #endif -#endif // NRF_MODULE_ENABLED(EGU) - err_code = NRF_SUCCESS; - } - CRITICAL_REGION_EXIT(); - if (err_code == NRF_SUCCESS) - { - NRF_LOG_INFO("SWI channel allocated: %d.", (*p_swi)); - break; - } - } - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -void nrf_drv_swi_trigger(nrf_swi_t swi, uint8_t flag_number) -{ - ASSERT(swi_is_allocated((uint32_t) swi)); - ASSERT(flag_number < swi_channel_number(swi)); -#if NRF_MODULE_ENABLED(EGU) - NRF_EGU_Type * NRF_EGUx = egu_instance_get(swi); - if (NRF_EGUx != NULL) - { - nrf_egu_task_trigger(NRF_EGUx, nrf_egu_task_trigger_get(NRF_EGUx, flag_number)); - } -#if SWI_EGU_MIXED - else - { - if (swi < SWI_COUNT) - { - /* for swi < EGU_COUNT above code will be executed */ - m_swi_flags[swi - SWI_START_NUMBER - EGU_COUNT] |= (1 << flag_number); - NVIC_SetPendingIRQ(nrf_drv_swi_irq_of(swi)); - } - } -#endif // SWI_EGU_MIXED -#else - m_swi_flags[swi - SWI_START_NUMBER] |= (1 << flag_number); - NVIC_SetPendingIRQ(nrf_drv_swi_irq_of(swi)); -#endif // NRF_MODULE_ENABLED(EGU) -} - - -#if NRF_MODULE_ENABLED(EGU) - -uint32_t nrf_drv_swi_task_trigger_address_get(nrf_swi_t swi, uint8_t channel) -{ - NRF_EGU_Type * NRF_EGUx = egu_instance_get(swi); - if (NRF_EGUx != NULL) - { - return (uint32_t)nrf_egu_task_trigger_address_get(NRF_EGUx, channel); - } - else - { - return 0; - } -} - -uint32_t nrf_drv_swi_event_triggered_address_get(nrf_swi_t swi, uint8_t channel) -{ - NRF_EGU_Type * NRF_EGUx = egu_instance_get(swi); - if (NRF_EGUx != NULL) - { - return (uint32_t)nrf_egu_event_triggered_address_get(NRF_EGUx, channel); - } - else - { - return 0; - } -} - -#endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/swi/nrf_drv_swi.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/swi/nrf_drv_swi.h deleted file mode 100644 index a3a4a0e043..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/swi/nrf_drv_swi.h +++ /dev/null @@ -1,212 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/**@file - * - * @defgroup nrf_drv_swi SWI driver - * @{ - * @ingroup nrf_drivers - * - * @brief Driver for software interrupts (SWI). - * @details The SWI driver allows the user to allocate SWIs and pass extra flags to interrupt handler functions. - */ - -#ifndef NRF_DRV_SWI_H__ -#define NRF_DRV_SWI_H__ - -#include -#include -#include "sdk_config.h" -#include "app_util.h" -#include "app_util_platform.h" -#include "sdk_common.h" -#include "sdk_errors.h" -#include "nrf_peripherals.h" - -#ifndef EGU_ENABLED - #define EGU_ENABLED 0 -#endif - -#if NRF_MODULE_ENABLED(EGU) -#include "nrf_egu.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef uint8_t nrf_swi_t; ///< @brief SWI channel (unsigned integer). - -/** @brief SWI user flags (unsigned integer). - * - * User flags are set during the SWI trigger and passed to the callback function as an argument. - */ -typedef uint16_t nrf_swi_flags_t; - -/** @brief Unallocated channel value. */ -#define NRF_SWI_UNALLOCATED ((nrf_swi_t) 0xFFFFFFFFuL) - -/** @brief SWI handler function. - * - * Takes two arguments: SWI number (nrf_swi_t) and flags (nrf_swi_flags_t). - */ -typedef void (* nrf_swi_handler_t)(nrf_swi_t, nrf_swi_flags_t); - -#ifdef SOFTDEVICE_PRESENT - #if SWI_COUNT > 2 - #undef SWI_COUNT - #ifdef NRF52810_XXAA - #define SWI_COUNT 3 // SoftDevice for NRF52810_XXAA utilizes 3 SWIs - #else - #define SWI_COUNT 2 // usually, SoftDevice utilizes 4 SWIs - #endif - #endif -#else - #ifdef SVCALL_AS_NORMAL_FUNCTION - // Serialization is enabled. - #if SWI_COUNT > 2 - #undef SWI_COUNT - #ifdef NRF52810_XXAA - #define SWI_COUNT 3 // SoftDevice for NRF52810_XXAA will utilize 3 SWIs - #else - #define SWI_COUNT 2 // usually, SoftDevice utilizes 4 SWIs - #endif - #endif - #endif -#endif - -#if NRF_MODULE_ENABLED(PWM_NRF52_ANOMALY_109_WORKAROUND) - #if (PWM_NRF52_ANOMALY_109_EGU_INSTANCE == 0) - #define SWI_DISABLE0 - #elif (PWM_NRF52_ANOMALY_109_EGU_INSTANCE == 1) - #define SWI_DISABLE1 - #elif (PWM_NRF52_ANOMALY_109_EGU_INSTANCE == 2) - #define SWI_DISABLE2 - #elif (PWM_NRF52_ANOMALY_109_EGU_INSTANCE == 3) - #define SWI_DISABLE3 - #elif (PWM_NRF52_ANOMALY_109_EGU_INSTANCE == 4) - #define SWI_DISABLE4 - #elif (PWM_NRF52_ANOMALY_109_EGU_INSTANCE == 5) - #define SWI_DISABLE5 - #endif -#endif - -/**@brief Default SWI priority. */ -#define SWI_DEFAULT_PRIORITY APP_IRQ_PRIORITY_LOWEST - - -/**@brief Function for initializing the SWI module. - * - * @retval NRF_SUCCESS If the module was successfully initialized. - * @retval NRF_ERROR_MODULE_ALREADY_INITIALIZED If the module has already been initialized. - */ -ret_code_t nrf_drv_swi_init(void); - - -/**@brief Function for uninitializing the SWI module. - * - * This function also disables all SWIs. - */ -void nrf_drv_swi_uninit(void); - - -/**@brief Function for allocating a first unused SWI instance and setting a handler. - * @details The event handler function returns void and takes one uint32_t argument (SWI number). - * - * @param[out] p_swi Pointer to the SWI that has been allocated. - * @param[in] event_handler Event handler function. - * If NULL, no interrupt will be enabled (can be NULL only if the EGU - driver is enabled and available. For some microcontrollers, it is - possible that number of EGUs and SWIs differ). - * For classic SWI, must be a valid handler pointer. - * @param[in] priority Interrupt priority. - * - * @retval NRF_SUCCESS If the SWI was successfully allocated. - * @retval NRF_ERROR_NO_MEM If there is no available SWI to be used. - */ -ret_code_t nrf_drv_swi_alloc(nrf_swi_t * p_swi, nrf_swi_handler_t event_handler, uint32_t priority); - - -/**@brief Function for freeing a previously allocated SWI. - * - * @param[in,out] p_swi SWI to free. The value is changed to NRF_SWI_UNALLOCATED on success. - */ -void nrf_drv_swi_free(nrf_swi_t * p_swi); - - -/**@brief Function for triggering the SWI. - * - * @param[in] swi SWI to trigger. - * @param[in] flag_number Number of user flag to trigger. - */ -void nrf_drv_swi_trigger(nrf_swi_t swi, uint8_t flag_number); - - -#if (EGU_ENABLED > 0) || defined(__SDK_DOXYGEN__) - - -/**@brief Function for returning the EGU trigger task address. - * - * @param[in] swi SWI instance. - * @param[in] channel Number of the EGU channel. - * - * @returns EGU trigger task address. - */ -uint32_t nrf_drv_swi_task_trigger_address_get(nrf_swi_t swi, uint8_t channel); - -/**@brief Function for returning the EGU triggered event address. - * - * @param[in] swi SWI instance. - * @param[in] channel Number of the EGU channel. - * - * @returns EGU triggered event address. - */ -uint32_t nrf_drv_swi_event_triggered_address_get(nrf_swi_t swi, uint8_t channel); - -#endif // NRF_MODULE_ENABLED(EGU) - - - -#ifdef __cplusplus -} -#endif - -#endif // NRF_DRV_SWI_H__ - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/timer/nrf_drv_timer.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/timer/nrf_drv_timer.c deleted file mode 100644 index 5aa048b48c..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/timer/nrf_drv_timer.c +++ /dev/null @@ -1,339 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(TIMER) -#define ENABLED_TIMER_COUNT (TIMER0_ENABLED+TIMER1_ENABLED+TIMER2_ENABLED+TIMER3_ENABLED+TIMER4_ENABLED) -#if ENABLED_TIMER_COUNT -#include "nrf_drv_timer.h" -#include "nrf_drv_common.h" -#include "app_util_platform.h" - -#define NRF_LOG_MODULE_NAME timer - -#if TIMER_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL TIMER_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR TIMER_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR TIMER_CONFIG_DEBUG_COLOR -#else //TIMER_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL 0 -#endif //TIMER_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); - -/**@brief Timer control block. */ -typedef struct -{ - nrf_timer_event_handler_t handler; - void * context; - nrf_drv_state_t state; -} timer_control_block_t; - -static timer_control_block_t m_cb[ENABLED_TIMER_COUNT]; - -ret_code_t nrf_drv_timer_init(nrf_drv_timer_t const * const p_instance, - nrf_drv_timer_config_t const * p_config, - nrf_timer_event_handler_t timer_event_handler) -{ - timer_control_block_t * p_cb = &m_cb[p_instance->instance_id]; - ASSERT(((p_instance->p_reg == NRF_TIMER0) && TIMER0_ENABLED) || (p_instance->p_reg != NRF_TIMER0)); - ASSERT(((p_instance->p_reg == NRF_TIMER1) && TIMER1_ENABLED) || (p_instance->p_reg != NRF_TIMER1)); - ASSERT(((p_instance->p_reg == NRF_TIMER2) && TIMER2_ENABLED) || (p_instance->p_reg != NRF_TIMER2)); -#if defined (NRF_TIMER3) - ASSERT(((p_instance->p_reg == NRF_TIMER3) && TIMER3_ENABLED) || (p_instance->p_reg != NRF_TIMER3)); -#endif -#if defined (NRF_TIMER4) - ASSERT(((p_instance->p_reg == NRF_TIMER4) && TIMER4_ENABLED) || (p_instance->p_reg != NRF_TIMER4)); -#endif -#ifdef SOFTDEVICE_PRESENT - ASSERT(p_instance->p_reg != NRF_TIMER0); -#endif - ASSERT(p_config); - - ret_code_t err_code; - - if (p_cb->state != NRF_DRV_STATE_UNINITIALIZED) - { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - if (timer_event_handler == NULL) - { - err_code = NRF_ERROR_INVALID_PARAM; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - /* Warning 685: Relational operator '<=' always evaluates to 'true'" - * Warning in NRF_TIMER_IS_BIT_WIDTH_VALID macro. Macro validate timers resolution. - * Not necessary in nRF52 based systems. Obligatory in nRF51 based systems. - */ - - /*lint -save -e685 */ - - ASSERT(NRF_TIMER_IS_BIT_WIDTH_VALID(p_instance->p_reg, p_config->bit_width)); - - //lint -restore - - p_cb->handler = timer_event_handler; - p_cb->context = p_config->p_context; - - uint8_t i; - for (i = 0; i < p_instance->cc_channel_count; ++i) - { - nrf_timer_event_clear(p_instance->p_reg, - nrf_timer_compare_event_get(i)); - } - - nrf_drv_common_irq_enable(nrf_drv_get_IRQn(p_instance->p_reg), - p_config->interrupt_priority); - - nrf_timer_mode_set(p_instance->p_reg, p_config->mode); - nrf_timer_bit_width_set(p_instance->p_reg, p_config->bit_width); - nrf_timer_frequency_set(p_instance->p_reg, p_config->frequency); - - p_cb->state = NRF_DRV_STATE_INITIALIZED; - - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - -void nrf_drv_timer_uninit(nrf_drv_timer_t const * const p_instance) -{ - nrf_drv_common_irq_disable(nrf_drv_get_IRQn(p_instance->p_reg)); - - #define DISABLE_ALL UINT32_MAX - nrf_timer_shorts_disable(p_instance->p_reg, DISABLE_ALL); - nrf_timer_int_disable(p_instance->p_reg, DISABLE_ALL); - #undef DISABLE_ALL - - if (m_cb[p_instance->instance_id].state == NRF_DRV_STATE_POWERED_ON) - { - nrf_drv_timer_disable(p_instance); - } - - m_cb[p_instance->instance_id].state = NRF_DRV_STATE_UNINITIALIZED; - NRF_LOG_INFO("Uninitialized instance: %d.", p_instance->instance_id); -} - -void nrf_drv_timer_enable(nrf_drv_timer_t const * const p_instance) -{ - ASSERT(m_cb[p_instance->instance_id].state == NRF_DRV_STATE_INITIALIZED); - nrf_timer_task_trigger(p_instance->p_reg, NRF_TIMER_TASK_START); - m_cb[p_instance->instance_id].state = NRF_DRV_STATE_POWERED_ON; - NRF_LOG_INFO("Enabled instance: %d.", p_instance->instance_id); -} - -void nrf_drv_timer_disable(nrf_drv_timer_t const * const p_instance) -{ - ASSERT(m_cb[p_instance->instance_id].state == NRF_DRV_STATE_POWERED_ON); - nrf_timer_task_trigger(p_instance->p_reg, NRF_TIMER_TASK_SHUTDOWN); - m_cb[p_instance->instance_id].state = NRF_DRV_STATE_INITIALIZED; - NRF_LOG_INFO("Disabled instance: %d.", p_instance->instance_id); -} - -void nrf_drv_timer_resume(nrf_drv_timer_t const * const p_instance) -{ - ASSERT(m_cb[p_instance->instance_id].state == NRF_DRV_STATE_POWERED_ON); - nrf_timer_task_trigger(p_instance->p_reg, NRF_TIMER_TASK_START); - NRF_LOG_INFO("Resumed instance: %d.", p_instance->instance_id); -} - -void nrf_drv_timer_pause(nrf_drv_timer_t const * const p_instance) -{ - ASSERT(m_cb[p_instance->instance_id].state == NRF_DRV_STATE_POWERED_ON); - nrf_timer_task_trigger(p_instance->p_reg, NRF_TIMER_TASK_STOP); - NRF_LOG_INFO("Paused instance: %d.", p_instance->instance_id); -} - -void nrf_drv_timer_clear(nrf_drv_timer_t const * const p_instance) -{ - ASSERT(m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED); - nrf_timer_task_trigger(p_instance->p_reg, NRF_TIMER_TASK_CLEAR); -} - -void nrf_drv_timer_increment(nrf_drv_timer_t const * const p_instance) -{ - ASSERT(m_cb[p_instance->instance_id].state == NRF_DRV_STATE_POWERED_ON); - ASSERT(nrf_timer_mode_get(p_instance->p_reg) != NRF_TIMER_MODE_TIMER); - - nrf_timer_task_trigger(p_instance->p_reg, NRF_TIMER_TASK_COUNT); -} - -uint32_t nrf_drv_timer_capture(nrf_drv_timer_t const * const p_instance, - nrf_timer_cc_channel_t cc_channel) -{ - ASSERT(m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED); - ASSERT(cc_channel < p_instance->cc_channel_count); - - nrf_timer_task_trigger(p_instance->p_reg, - nrf_timer_capture_task_get(cc_channel)); - return nrf_timer_cc_read(p_instance->p_reg, cc_channel); -} - -void nrf_drv_timer_compare(nrf_drv_timer_t const * const p_instance, - nrf_timer_cc_channel_t cc_channel, - uint32_t cc_value, - bool enable_int) -{ - nrf_timer_int_mask_t timer_int = nrf_timer_compare_int_get(cc_channel); - - if (enable_int) - { - nrf_timer_int_enable(p_instance->p_reg, timer_int); - } - else - { - nrf_timer_int_disable(p_instance->p_reg, timer_int); - } - - nrf_timer_cc_write(p_instance->p_reg, cc_channel, cc_value); - NRF_LOG_INFO("Timer id: %d, capture value set: %d, channel: %d.", p_instance->instance_id, cc_value, cc_channel); -} - -void nrf_drv_timer_extended_compare(nrf_drv_timer_t const * const p_instance, - nrf_timer_cc_channel_t cc_channel, - uint32_t cc_value, - nrf_timer_short_mask_t timer_short_mask, - bool enable_int) -{ - nrf_timer_shorts_disable(p_instance->p_reg, - (TIMER_SHORTS_COMPARE0_STOP_Msk << cc_channel) | - (TIMER_SHORTS_COMPARE0_CLEAR_Msk << cc_channel)); - - nrf_timer_shorts_enable(p_instance->p_reg, timer_short_mask); - - (void)nrf_drv_timer_compare(p_instance, - cc_channel, - cc_value, - enable_int); - NRF_LOG_INFO("Timer id: %d, capture value set: %d, channel: %d.", p_instance->instance_id, cc_value, cc_channel); -} - -void nrf_drv_timer_compare_int_enable(nrf_drv_timer_t const * const p_instance, - uint32_t channel) -{ - ASSERT(m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED); - ASSERT(channel < p_instance->cc_channel_count); - - nrf_timer_event_clear(p_instance->p_reg, - nrf_timer_compare_event_get(channel)); - nrf_timer_int_enable(p_instance->p_reg, - nrf_timer_compare_int_get(channel)); -} - -void nrf_drv_timer_compare_int_disable(nrf_drv_timer_t const * const p_instance, - uint32_t channel) -{ - ASSERT(m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED); - ASSERT(channel < p_instance->cc_channel_count); - - nrf_timer_int_disable(p_instance->p_reg, - nrf_timer_compare_int_get(channel)); -} - -static void irq_handler(NRF_TIMER_Type * p_reg, - timer_control_block_t * p_cb, - uint8_t channel_count) -{ - uint8_t i; - for (i = 0; i < channel_count; ++i) - { - nrf_timer_event_t event = nrf_timer_compare_event_get(i); - nrf_timer_int_mask_t int_mask = nrf_timer_compare_int_get(i); - - if (nrf_timer_event_check(p_reg, event) && - nrf_timer_int_enable_check(p_reg, int_mask)) - { - nrf_timer_event_clear(p_reg, event); - NRF_LOG_DEBUG("Compare event, channel: %d.", i); - p_cb->handler(event, p_cb->context); - } - } -} - -#if NRF_MODULE_ENABLED(TIMER0) -void TIMER0_IRQHandler(void) -{ - irq_handler(NRF_TIMER0, &m_cb[TIMER0_INSTANCE_INDEX], - NRF_TIMER_CC_CHANNEL_COUNT(0)); -} -#endif - -#if NRF_MODULE_ENABLED(TIMER1) -void TIMER1_IRQHandler(void) -{ - irq_handler(NRF_TIMER1, &m_cb[TIMER1_INSTANCE_INDEX], - NRF_TIMER_CC_CHANNEL_COUNT(1)); -} -#endif - -#if NRF_MODULE_ENABLED(TIMER2) -void TIMER2_IRQHandler(void) -{ - irq_handler(NRF_TIMER2, &m_cb[TIMER2_INSTANCE_INDEX], - NRF_TIMER_CC_CHANNEL_COUNT(2)); -} -#endif - -#if defined (NRF_TIMER3) -#if NRF_MODULE_ENABLED(TIMER3) -void TIMER3_IRQHandler(void) -{ - irq_handler(NRF_TIMER3, &m_cb[TIMER3_INSTANCE_INDEX], - NRF_TIMER_CC_CHANNEL_COUNT(3)); -} -#endif -#endif - -#if defined (NRF_TIMER4) -#if NRF_MODULE_ENABLED(TIMER4) -void TIMER4_IRQHandler(void) -{ - irq_handler(NRF_TIMER4, &m_cb[TIMER4_INSTANCE_INDEX], - NRF_TIMER_CC_CHANNEL_COUNT(4)); -} -#endif -#endif - -#endif // ENABLED_TIMER_COUNT -#endif // NRF_MODULE_ENABLED(TIMER) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/twi_master/nrf_drv_twi.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/twi_master/nrf_drv_twi.c deleted file mode 100644 index 1bf33a2160..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/twi_master/nrf_drv_twi.c +++ /dev/null @@ -1,1285 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(TWI) -#include "nrf_drv_twi.h" -#if ENABLED_TWI_COUNT -#include "nrf_drv_common.h" -#include "nrf_gpio.h" -#include "nrf_assert.h" -#include "app_util_platform.h" -#include "nrf_delay.h" - -#include - -#define NRF_LOG_MODULE_NAME twi - -/*lint -save -e491*/ - -#if TWI_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL TWI_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR TWI_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR TWI_CONFIG_DEBUG_COLOR -#define EVT_TO_STR(event) (event == NRF_DRV_TWI_EVT_DONE ? "EVT_DONE" : \ - (event == NRF_DRV_TWI_EVT_ADDRESS_NACK ? "EVT_ADDRESS_NACK" : \ - (event == NRF_DRV_TWI_EVT_DATA_NACK ? "EVT_DATA_NACK" : "UNKNOWN ERROR"))) -#define EVT_TO_STR_TWI(event) (event == NRF_TWI_EVENT_STOPPED ? "NRF_TWI_EVENT_STOPPED" : \ - (event == NRF_TWI_EVENT_RXDREADY ? "NRF_TWI_EVENT_RXDREADY" : \ - (event == NRF_TWI_EVENT_TXDSENT ? "NRF_TWI_EVENT_TXDSENT" : \ - (event == NRF_TWI_EVENT_ERROR ? "NRF_TWI_EVENT_ERROR" : \ - (event == NRF_TWI_EVENT_BB ? "NRF_TWI_EVENT_BB" : \ - (event == NRF_TWI_EVENT_SUSPENDED ? "NRF_TWI_EVENT_SUSPENDED" : "UNKNOWN ERROR")))))) -#define EVT_TO_STR_TWIM(event) (event == NRF_TWIM_EVENT_STOPPED ? "NRF_TWIM_EVENT_STOPPED" : \ - (event == NRF_TWIM_EVENT_ERROR ? "NRF_TWIM_EVENT_ERROR" : \ - (event == NRF_TWIM_EVENT_SUSPENDED ? "NRF_TWIM_EVENT_SUSPENDED" : \ - (event == NRF_TWIM_EVENT_RXSTARTED ? "NRF_TWIM_EVENT_RXSTARTED" : \ - (event == NRF_TWIM_EVENT_TXSTARTED ? "NRF_TWIM_EVENT_TXSTARTED" : \ - (event == NRF_TWIM_EVENT_LASTRX ? "NRF_TWIM_EVENT_LASTRX" : \ - (event == NRF_TWIM_EVENT_LASTTX ? "NRF_TWIM_EVENT_LASTTX" : "UNKNOWN ERROR"))))))) -#define TRANSFER_TO_STR(type) (type == NRF_DRV_TWI_XFER_TX ? "XFER_TX" : \ - (type == NRF_DRV_TWI_XFER_RX ? "XFER_RX" : \ - (type == NRF_DRV_TWI_XFER_TXRX ? "XFER_TXRX" : \ - (type == NRF_DRV_TWI_XFER_TXTX ? "XFER_TXTX" : "UNKNOWN TRANSFER TYPE")))) -#else //TWI_CONFIG_LOG_ENABLED -#define EVT_TO_STR(event) "" -#define EVT_TO_STR_TWI(event) "" -#define EVT_TO_STR_TWIM(event) "" -#define TRANSFER_TO_STR(event) "" -#define NRF_LOG_LEVEL 0 -#endif //TWI_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); - -#if (defined(TWIM_IN_USE) && defined(TWI_IN_USE)) - // TWIM and TWI combined - #define CODE_FOR_TWIM(code) if (p_instance->use_easy_dma) { code } - #define CODE_FOR_TWI(code) else { code } -#elif (defined(TWIM_IN_USE) && !defined(TWI_IN_USE)) - // TWIM only - #define CODE_FOR_TWIM(code) { code } - #define CODE_FOR_TWI(code) -#elif (!defined(TWIM_IN_USE) && defined(TWI_IN_USE)) - // TWI only - #define CODE_FOR_TWIM(code) - #define CODE_FOR_TWI(code) { code } -#else - #error "Wrong configuration." -#endif - -// All interrupt flags -#define DISABLE_ALL_INT_SHORT 0xFFFFFFFF - -#define SCL_PIN_INIT_CONF ( (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \ - | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) \ - | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) \ - | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) \ - | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)) -#define SDA_PIN_INIT_CONF SCL_PIN_INIT_CONF - -#define SDA_PIN_UNINIT_CONF ( (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \ - | (GPIO_PIN_CNF_DRIVE_H0H1 << GPIO_PIN_CNF_DRIVE_Pos) \ - | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) \ - | (GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos) \ - | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)) -#define SCL_PIN_UNINIT_CONF SDA_PIN_UNINIT_CONF - -#define SCL_PIN_INIT_CONF_CLR ( (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \ - | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) \ - | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) \ - | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) \ - | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos)) -#define SDA_PIN_INIT_CONF_CLR SCL_PIN_INIT_CONF_CLR - -#define HW_TIMEOUT 10000 - -// Control block - driver instance local data. -typedef struct -{ - nrf_drv_twi_evt_handler_t handler; - void * p_context; - volatile uint32_t int_mask; - nrf_drv_twi_xfer_desc_t xfer_desc; - uint32_t flags; - uint8_t * p_curr_buf; - uint8_t curr_length; - bool curr_no_stop; - nrf_drv_state_t state; - bool error; - volatile bool busy; - bool repeated; - uint8_t bytes_transferred; - bool hold_bus_uninit; -#if NRF_MODULE_ENABLED(TWIM_NRF52_ANOMALY_109_WORKAROUND) - nrf_twim_frequency_t bus_frequency; -#endif -} twi_control_block_t; - -static twi_control_block_t m_cb[ENABLED_TWI_COUNT]; - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - #define IRQ_HANDLER_NAME(n) irq_handler_for_instance_##n - #define IRQ_HANDLER(n) static void IRQ_HANDLER_NAME(n)(void) - - #if NRF_MODULE_ENABLED(TWI0) - IRQ_HANDLER(0); - #endif - #if NRF_MODULE_ENABLED(TWI1) - IRQ_HANDLER(1); - #endif - static nrf_drv_irq_handler_t const m_irq_handlers[ENABLED_TWI_COUNT] = { - #if NRF_MODULE_ENABLED(TWI0) - IRQ_HANDLER_NAME(0), - #endif - #if NRF_MODULE_ENABLED(TWI1) - IRQ_HANDLER_NAME(1), - #endif - }; -#else - #if defined (NRF52810_XXAA) - #define IRQ_HANDLER(n) void TWIM##n##_TWIS##n##_IRQHandler(void) - #else - #define IRQ_HANDLER(n) void SPI##n##_TWI##n##_IRQHandler(void) - #endif -#endif // NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - -static ret_code_t twi_process_error(uint32_t errorsrc) -{ - ret_code_t ret = NRF_ERROR_INTERNAL; -#ifdef TWI_IN_USE - if (errorsrc & NRF_TWI_ERROR_OVERRUN) - { - ret = NRF_ERROR_DRV_TWI_ERR_OVERRUN; - } -#endif - if (errorsrc & NRF_TWI_ERROR_ADDRESS_NACK) - { - ret = NRF_ERROR_DRV_TWI_ERR_ANACK; - } - - if (errorsrc & NRF_TWI_ERROR_DATA_NACK) - { - ret = NRF_ERROR_DRV_TWI_ERR_DNACK; - } - - return ret; -} - -static void twi_clear_bus(nrf_drv_twi_config_t const * p_config) -{ - NRF_GPIO->PIN_CNF[p_config->scl] = SCL_PIN_INIT_CONF; - NRF_GPIO->PIN_CNF[p_config->sda] = SDA_PIN_INIT_CONF; - - nrf_gpio_pin_set(p_config->scl); - nrf_gpio_pin_set(p_config->sda); - - NRF_GPIO->PIN_CNF[p_config->scl] = SCL_PIN_INIT_CONF_CLR; - NRF_GPIO->PIN_CNF[p_config->sda] = SDA_PIN_INIT_CONF_CLR; - - nrf_delay_us(4); - - for (int i = 0; i < 9; i++) - { - if (nrf_gpio_pin_read(p_config->sda)) - { - if (i == 0) - { - return; - } - else - { - break; - } - } - nrf_gpio_pin_clear(p_config->scl); - nrf_delay_us(4); - nrf_gpio_pin_set(p_config->scl); - nrf_delay_us(4); - } - nrf_gpio_pin_clear(p_config->sda); - nrf_delay_us(4); - nrf_gpio_pin_set(p_config->sda); -} - -ret_code_t nrf_drv_twi_init(nrf_drv_twi_t const * p_instance, - nrf_drv_twi_config_t const * p_config, - nrf_drv_twi_evt_handler_t event_handler, - void * p_context) -{ - ASSERT(p_config); - ASSERT(p_config->scl != p_config->sda); - twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ret_code_t err_code; - - if (p_cb->state != NRF_DRV_STATE_UNINITIALIZED) - { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - if (nrf_drv_common_per_res_acquire(p_instance->reg.p_regs, - m_irq_handlers[p_instance->drv_inst_idx]) != NRF_SUCCESS) - { - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } -#endif // NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - - p_cb->handler = event_handler; - p_cb->p_context = p_context; - p_cb->int_mask = 0; - p_cb->repeated = false; - p_cb->busy = false; - p_cb->hold_bus_uninit = p_config->hold_bus_uninit; -#if NRF_MODULE_ENABLED(TWIM_NRF52_ANOMALY_109_WORKAROUND) - p_cb->bus_frequency = (nrf_twim_frequency_t)p_config->frequency; -#endif - - if (p_config->clear_bus_init) - { - /* Send clocks (max 9) until slave device back from stuck mode */ - twi_clear_bus(p_config); - } - - /* To secure correct signal levels on the pins used by the TWI - master when the system is in OFF mode, and when the TWI master is - disabled, these pins must be configured in the GPIO peripheral. - */ - NRF_GPIO->PIN_CNF[p_config->scl] = SCL_PIN_INIT_CONF; - NRF_GPIO->PIN_CNF[p_config->sda] = SDA_PIN_INIT_CONF; - - CODE_FOR_TWIM - ( - NRF_TWIM_Type * p_twim = p_instance->reg.p_twim; - nrf_twim_pins_set(p_twim, p_config->scl, p_config->sda); - nrf_twim_frequency_set(p_twim, - (nrf_twim_frequency_t)p_config->frequency); - ) - CODE_FOR_TWI - ( - NRF_TWI_Type * p_twi = p_instance->reg.p_twi; - nrf_twi_pins_set(p_twi, p_config->scl, p_config->sda); - nrf_twi_frequency_set(p_twi, - (nrf_twi_frequency_t)p_config->frequency); - ) - - if (p_cb->handler) - { - CODE_FOR_TWIM - ( - nrf_drv_common_irq_enable(nrf_drv_get_IRQn((void *)p_instance->reg.p_twim), - p_config->interrupt_priority); - ) - CODE_FOR_TWI - ( - nrf_drv_common_irq_enable(nrf_drv_get_IRQn((void *)p_instance->reg.p_twi), - p_config->interrupt_priority); - ) - } - - p_cb->state = NRF_DRV_STATE_INITIALIZED; - - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - -void nrf_drv_twi_uninit(nrf_drv_twi_t const * p_instance) -{ - twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ASSERT(p_cb->state != NRF_DRV_STATE_UNINITIALIZED); - - if (p_cb->handler) - { - CODE_FOR_TWIM - ( - nrf_drv_common_irq_disable(nrf_drv_get_IRQn((void *)p_instance->reg.p_twim)); - ) - CODE_FOR_TWI - ( - nrf_drv_common_irq_disable(nrf_drv_get_IRQn((void *)p_instance->reg.p_twi)); - ) - } - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - nrf_drv_common_per_res_release(p_instance->reg.p_regs); -#endif - - if (!p_cb->hold_bus_uninit) - { - CODE_FOR_TWIM - ( - NRF_GPIO->PIN_CNF[p_instance->reg.p_twim->PSEL.SCL] = SCL_PIN_UNINIT_CONF; - NRF_GPIO->PIN_CNF[p_instance->reg.p_twim->PSEL.SDA] = SDA_PIN_UNINIT_CONF; - ) - CODE_FOR_TWI - ( - NRF_GPIO->PIN_CNF[p_instance->reg.p_twi->PSELSCL] = SCL_PIN_UNINIT_CONF; - NRF_GPIO->PIN_CNF[p_instance->reg.p_twi->PSELSDA] = SDA_PIN_UNINIT_CONF; - ) - } - - p_cb->state = NRF_DRV_STATE_UNINITIALIZED; - NRF_LOG_INFO("Instance uninitialized: %d.", p_instance->drv_inst_idx); -} - -void nrf_drv_twi_enable(nrf_drv_twi_t const * p_instance) -{ - twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ASSERT(p_cb->state == NRF_DRV_STATE_INITIALIZED); - - CODE_FOR_TWIM - ( - NRF_TWIM_Type * p_twim = p_instance->reg.p_twim; - - nrf_twim_enable(p_twim); - ) - CODE_FOR_TWI - ( - NRF_TWI_Type * p_twi = p_instance->reg.p_twi; - - nrf_twi_enable(p_twi); - ) - - p_cb->state = NRF_DRV_STATE_POWERED_ON; - NRF_LOG_INFO("Instance enabled: %d.", p_instance->drv_inst_idx); -} - -void nrf_drv_twi_disable(nrf_drv_twi_t const * p_instance) -{ - twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ASSERT(p_cb->state != NRF_DRV_STATE_UNINITIALIZED); - - CODE_FOR_TWIM - ( - NRF_TWIM_Type * p_twim = p_instance->reg.p_twim; - p_cb->int_mask = 0; - nrf_twim_int_disable(p_twim, DISABLE_ALL_INT_SHORT); - nrf_twim_shorts_disable(p_twim, DISABLE_ALL_INT_SHORT); - nrf_twim_disable(p_twim); - ) - CODE_FOR_TWI - ( - NRF_TWI_Type * p_twi = p_instance->reg.p_twi; - nrf_twi_int_disable(p_twi, DISABLE_ALL_INT_SHORT); - nrf_twi_shorts_disable(p_twi, DISABLE_ALL_INT_SHORT); - nrf_twi_disable(p_twi); - ) - - p_cb->state = NRF_DRV_STATE_INITIALIZED; - NRF_LOG_INFO("Instance disabled: %d.", p_instance->drv_inst_idx); -} - -#ifdef TWI_IN_USE -static bool twi_send_byte(NRF_TWI_Type * p_twi, - uint8_t const * p_data, - uint8_t length, - uint8_t * p_bytes_transferred, - bool no_stop) -{ - if (*p_bytes_transferred < length) - { - nrf_twi_txd_set(p_twi, p_data[*p_bytes_transferred]); - ++(*p_bytes_transferred); - } - else - { - if (no_stop) - { - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_SUSPEND); - return false; - } - else - { - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STOP); - } - } - return true; -} - -static void twi_receive_byte(NRF_TWI_Type * p_twi, - uint8_t * p_data, - uint8_t length, - uint8_t * p_bytes_transferred) -{ - if (*p_bytes_transferred < length) - { - p_data[*p_bytes_transferred] = nrf_twi_rxd_get(p_twi); - - ++(*p_bytes_transferred); - - if (*p_bytes_transferred == length - 1) - { - nrf_twi_shorts_set(p_twi, NRF_TWI_SHORT_BB_STOP_MASK); - } - else if (*p_bytes_transferred == length) - { - return; - } - - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_RESUME); - } -} - -static bool twi_transfer(NRF_TWI_Type * p_twi, - bool * p_error, - uint8_t * p_bytes_transferred, - uint8_t * p_data, - uint8_t length, - bool no_stop) -{ - bool do_stop_check = ((*p_error) || ((*p_bytes_transferred) == length)); - - if (*p_error) - { - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_TXDSENT); - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_RXDREADY); - } - else if (nrf_twi_event_check(p_twi, NRF_TWI_EVENT_ERROR)) - { - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); - NRF_LOG_DEBUG("TWI: Event: %s.", (uint32_t)EVT_TO_STR_TWI(NRF_TWI_EVENT_ERROR)); - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STOP); - *p_error = true; - } - else - { - if (nrf_twi_event_check(p_twi, NRF_TWI_EVENT_TXDSENT)) - { - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_TXDSENT); - NRF_LOG_DEBUG("TWI: Event: %s.", (uint32_t)EVT_TO_STR_TWI(NRF_TWI_EVENT_TXDSENT)); - if (nrf_twi_event_check(p_twi, NRF_TWI_EVENT_ERROR)) - { - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); - NRF_LOG_DEBUG("TWI: Event: %s.", (uint32_t)EVT_TO_STR_TWI(NRF_TWI_EVENT_ERROR)); - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STOP); - *p_error = true; - } - else - { - if (!twi_send_byte(p_twi, p_data, length, p_bytes_transferred, no_stop)) - { - return false; - } - } - } - else if (nrf_twi_event_check(p_twi, NRF_TWI_EVENT_RXDREADY)) - { - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_RXDREADY); - NRF_LOG_DEBUG("TWI: Event: %s.", (uint32_t)EVT_TO_STR_TWI(NRF_TWI_EVENT_RXDREADY)); - if (nrf_twi_event_check(p_twi, NRF_TWI_EVENT_ERROR)) - { - NRF_LOG_DEBUG("TWI: Event: %s.", (uint32_t)EVT_TO_STR_TWI(NRF_TWI_EVENT_ERROR)); - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STOP); - *p_error = true; - } - else - { - twi_receive_byte(p_twi, p_data, length, p_bytes_transferred); - } - } - } - - if (do_stop_check && nrf_twi_event_check(p_twi, NRF_TWI_EVENT_STOPPED)) - { - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_STOPPED); - NRF_LOG_DEBUG("TWI: Event: %s.", (uint32_t)EVT_TO_STR_TWI(NRF_TWI_EVENT_STOPPED)); - return false; - } - - return true; -} - -static ret_code_t twi_tx_start_transfer(twi_control_block_t * p_cb, - NRF_TWI_Type * p_twi, - uint8_t const * p_data, - uint8_t length, - bool no_stop) -{ - ret_code_t ret_code = NRF_SUCCESS; - volatile int32_t hw_timeout; - - hw_timeout = HW_TIMEOUT; - - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_STOPPED); - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_TXDSENT); - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_RXDREADY); - nrf_twi_shorts_set(p_twi, 0); - - p_cb->bytes_transferred = 0; - p_cb->error = false; - - /** - * 4/23/2018 Arm Mbed modification to Nordic SDK 14.2. - * Interrupts must be enabled before transmitting the first byte in asynchronous mode. - */ - if (p_cb->handler) - { - p_cb->int_mask = NRF_TWI_INT_STOPPED_MASK | - NRF_TWI_INT_ERROR_MASK | - NRF_TWI_INT_TXDSENT_MASK | - NRF_TWI_INT_RXDREADY_MASK; - nrf_twi_int_enable(p_twi, p_cb->int_mask); - } - - // In case TWI is suspended resume its operation. - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_RESUME); - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STARTTX); - - (void)twi_send_byte(p_twi, p_data, length, &p_cb->bytes_transferred, no_stop); - - /** - * 4/23/2018 Arm Mbed modification to Nordic SDK 14.2. - * Interrupts must be enabled before transmitting the first byte in asynchronous mode. - */ - if (p_cb->handler == NULL) - { - while ((hw_timeout > 0) && - twi_transfer(p_twi, - &p_cb->error, - &p_cb->bytes_transferred, - (uint8_t *)p_data, - length, - no_stop)) - { - hw_timeout--; - } - - if (p_cb->error) - { - uint32_t errorsrc = nrf_twi_errorsrc_get_and_clear(p_twi); - - if (errorsrc) - { - ret_code = twi_process_error(errorsrc); - } - } - - if (hw_timeout <= 0) - { - nrf_twi_disable(p_twi); - nrf_twi_enable(p_twi); - ret_code = NRF_ERROR_INTERNAL; - } - - } - return ret_code; -} - -static ret_code_t twi_rx_start_transfer(twi_control_block_t * p_cb, - NRF_TWI_Type * p_twi, - uint8_t const * p_data, - uint8_t length) -{ - ret_code_t ret_code = NRF_SUCCESS; - volatile int32_t hw_timeout; - - hw_timeout = HW_TIMEOUT; - - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_STOPPED); - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_TXDSENT); - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_RXDREADY); - - p_cb->bytes_transferred = 0; - p_cb->error = false; - - if (length == 1) - { - nrf_twi_shorts_set(p_twi, NRF_TWI_SHORT_BB_STOP_MASK); - } - else - { - nrf_twi_shorts_set(p_twi, NRF_TWI_SHORT_BB_SUSPEND_MASK); - } - - /** - * 4/23/2018 Arm Mbed modification to Nordic SDK 14.2. - * Interrupts must be enabled before transmitting the first byte in asynchronous mode. - */ - if (p_cb->handler) - { - p_cb->int_mask = NRF_TWI_INT_STOPPED_MASK | - NRF_TWI_INT_ERROR_MASK | - NRF_TWI_INT_TXDSENT_MASK | - NRF_TWI_INT_RXDREADY_MASK; - nrf_twi_int_enable(p_twi, p_cb->int_mask); - } - - // In case TWI is suspended resume its operation. - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_RESUME); - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STARTRX); - - /** - * 4/23/2018 Arm Mbed modification to Nordic SDK 14.2. - * Interrupts must be enabled before transmitting the first byte in asynchronous mode. - */ - if (p_cb->handler == NULL) - { - while ((hw_timeout > 0) && - twi_transfer(p_twi, - &p_cb->error, - &p_cb->bytes_transferred, - (uint8_t*)p_data, - length, - false)) - { - hw_timeout--; - } - - if (p_cb->error) - { - uint32_t errorsrc = nrf_twi_errorsrc_get_and_clear(p_twi); - - if (errorsrc) - { - ret_code = twi_process_error(errorsrc); - } - } - if (hw_timeout <= 0) - { - nrf_twi_disable(p_twi); - nrf_twi_enable(p_twi); - ret_code = NRF_ERROR_INTERNAL; - } - } - return ret_code; -} - -__STATIC_INLINE ret_code_t twi_xfer(twi_control_block_t * p_cb, - NRF_TWI_Type * p_twi, - nrf_drv_twi_xfer_desc_t const * p_xfer_desc, - uint32_t flags) -{ - - ret_code_t err_code = NRF_SUCCESS; - - /* Block TWI interrupts to ensure that function is not interrupted by TWI interrupt. */ - nrf_twi_int_disable(p_twi, DISABLE_ALL_INT_SHORT); - - if (p_cb->busy) - { - nrf_twi_int_enable(p_twi, p_cb->int_mask); - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - else - { - p_cb->busy = (NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER & flags) ? false : true; - } - - if (flags & NRF_DRV_TWI_FLAG_HOLD_XFER) - { - err_code = NRF_ERROR_NOT_SUPPORTED; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - p_cb->flags = flags; - p_cb->xfer_desc = *p_xfer_desc; - p_cb->curr_length = p_xfer_desc->primary_length; - p_cb->p_curr_buf = p_xfer_desc->p_primary_buf; - nrf_twi_address_set(p_twi, p_xfer_desc->address); - - if (p_xfer_desc->type != NRF_DRV_TWI_XFER_RX) - { - p_cb->curr_no_stop = ((p_xfer_desc->type == NRF_DRV_TWI_XFER_TX) && - !(flags & NRF_DRV_TWI_FLAG_TX_NO_STOP)) ? false : true; - - err_code = twi_tx_start_transfer(p_cb, - p_twi, - p_xfer_desc->p_primary_buf, - p_xfer_desc->primary_length, - p_cb->curr_no_stop); - } - else - { - p_cb->curr_no_stop = false; - - err_code = twi_rx_start_transfer(p_cb, - p_twi, - p_xfer_desc->p_primary_buf, - p_xfer_desc->primary_length); - } - if (p_cb->handler == NULL) - { - p_cb->busy = false; - } - return err_code; -} -#endif - - -bool nrf_drv_twi_is_busy(nrf_drv_twi_t const * p_instance) -{ - twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - return p_cb->busy; -} - - -#ifdef TWIM_IN_USE -__STATIC_INLINE void twim_list_enable_handle(NRF_TWIM_Type * p_twim, uint32_t flags) -{ - if (NRF_DRV_TWI_FLAG_TX_POSTINC & flags) - { - nrf_twim_tx_list_enable(p_twim); - } - else - { - nrf_twim_tx_list_disable(p_twim); - } - - if (NRF_DRV_TWI_FLAG_RX_POSTINC & flags) - { - nrf_twim_rx_list_enable(p_twim); - } - else - { - nrf_twim_rx_list_disable(p_twim); - } -} -__STATIC_INLINE ret_code_t twim_xfer(twi_control_block_t * p_cb, - NRF_TWIM_Type * p_twim, - nrf_drv_twi_xfer_desc_t const * p_xfer_desc, - uint32_t flags) -{ - ret_code_t err_code = NRF_SUCCESS; - nrf_twim_task_t start_task = NRF_TWIM_TASK_STARTTX; - nrf_twim_event_t evt_to_wait = NRF_TWIM_EVENT_STOPPED; - - if (!nrf_drv_is_in_RAM(p_xfer_desc->p_primary_buf)) - { - err_code = NRF_ERROR_INVALID_ADDR; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - /* Block TWI interrupts to ensure that function is not interrupted by TWI interrupt. */ - nrf_twim_int_disable(p_twim, DISABLE_ALL_INT_SHORT); - if (p_cb->busy) - { - nrf_twim_int_enable(p_twim, p_cb->int_mask); - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - else - { - p_cb->busy = ((NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER & flags) || - (NRF_DRV_TWI_FLAG_REPEATED_XFER & flags)) ? false: true; - } - - p_cb->xfer_desc = *p_xfer_desc; - p_cb->repeated = (flags & NRF_DRV_TWI_FLAG_REPEATED_XFER) ? true : false; - nrf_twim_address_set(p_twim, p_xfer_desc->address); - - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_STOPPED); - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_ERROR); - - twim_list_enable_handle(p_twim, flags); - switch (p_xfer_desc->type) - { - case NRF_DRV_TWI_XFER_TXTX: - ASSERT(!(flags & NRF_DRV_TWI_FLAG_REPEATED_XFER)); - ASSERT(!(flags & NRF_DRV_TWI_FLAG_HOLD_XFER)); - ASSERT(!(flags & NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER)); - if (!nrf_drv_is_in_RAM(p_xfer_desc->p_secondary_buf)) - { - err_code = NRF_ERROR_INVALID_ADDR; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTTX_SUSPEND_MASK); - nrf_twim_tx_buffer_set(p_twim, p_xfer_desc->p_primary_buf, p_xfer_desc->primary_length); - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_TXSTARTED); - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_LASTTX); - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_SUSPENDED); - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_STARTTX); - while (!nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_TXSTARTED)) - {} - NRF_LOG_DEBUG("TWIM: Event: %s.", (uint32_t)EVT_TO_STR_TWIM(NRF_TWIM_EVENT_TXSTARTED)); - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_TXSTARTED); - nrf_twim_tx_buffer_set(p_twim, p_xfer_desc->p_secondary_buf, p_xfer_desc->secondary_length); - p_cb->int_mask = NRF_TWIM_INT_SUSPENDED_MASK | NRF_TWIM_INT_ERROR_MASK; - break; - case NRF_DRV_TWI_XFER_TXRX: - nrf_twim_tx_buffer_set(p_twim, p_xfer_desc->p_primary_buf, p_xfer_desc->primary_length); - if (!nrf_drv_is_in_RAM(p_xfer_desc->p_secondary_buf)) - { - err_code = NRF_ERROR_INVALID_ADDR; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - nrf_twim_rx_buffer_set(p_twim, p_xfer_desc->p_secondary_buf, p_xfer_desc->secondary_length); - nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTTX_STARTRX_MASK | - NRF_TWIM_SHORT_LASTRX_STOP_MASK); - p_cb->int_mask = NRF_TWIM_INT_STOPPED_MASK | NRF_TWIM_INT_ERROR_MASK; - break; - case NRF_DRV_TWI_XFER_TX: - nrf_twim_tx_buffer_set(p_twim, p_xfer_desc->p_primary_buf, p_xfer_desc->primary_length); - if (NRF_DRV_TWI_FLAG_TX_NO_STOP & flags) - { - nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTTX_SUSPEND_MASK); - p_cb->int_mask = NRF_TWIM_INT_SUSPENDED_MASK | NRF_TWIM_INT_ERROR_MASK; - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_SUSPENDED); - evt_to_wait = NRF_TWIM_EVENT_SUSPENDED; - } - else - { - nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTTX_STOP_MASK); - p_cb->int_mask = NRF_TWIM_INT_STOPPED_MASK | NRF_TWIM_INT_ERROR_MASK; - } - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); - break; - case NRF_DRV_TWI_XFER_RX: - nrf_twim_rx_buffer_set(p_twim, p_xfer_desc->p_primary_buf, p_xfer_desc->primary_length); - nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTRX_STOP_MASK); - p_cb->int_mask = NRF_TWIM_INT_STOPPED_MASK | NRF_TWIM_INT_ERROR_MASK; - start_task = NRF_TWIM_TASK_STARTRX; - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); - break; - default: - err_code = NRF_ERROR_INVALID_PARAM; - break; - } - - if (!(flags & NRF_DRV_TWI_FLAG_HOLD_XFER) && (p_xfer_desc->type != NRF_DRV_TWI_XFER_TXTX)) - { - nrf_twim_task_trigger(p_twim, start_task); - } - - if (p_cb->handler) - { - if (flags & NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER) - { - p_cb->int_mask = NRF_TWIM_INT_ERROR_MASK; - } - nrf_twim_int_enable(p_twim, p_cb->int_mask); - -#if NRF_MODULE_ENABLED(TWIM_NRF52_ANOMALY_109_WORKAROUND) - if ((flags & NRF_DRV_TWI_FLAG_HOLD_XFER) && ((p_xfer_desc->type == NRF_DRV_TWI_XFER_TX) || - (p_xfer_desc->type == NRF_DRV_TWI_XFER_TXRX))) - { - p_cb->flags = flags; - twim_list_enable_handle(p_twim, 0); - p_twim->FREQUENCY = 0; - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_TXSTARTED); - nrf_twim_int_enable(p_twim, NRF_TWIM_INT_TXSTARTED_MASK); - } -#endif - } - else - { - while (!nrf_twim_event_check(p_twim, evt_to_wait)) - { - if (nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_ERROR)) - { - NRF_LOG_DEBUG("TWIM: Event: %s.", - (uint32_t)EVT_TO_STR_TWIM(NRF_TWIM_EVENT_ERROR)); - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_ERROR); - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_STOP); - evt_to_wait = NRF_TWIM_EVENT_STOPPED; - } - } - - uint32_t errorsrc = nrf_twim_errorsrc_get_and_clear(p_twim); - - p_cb->busy = false; - - if (errorsrc) - { - err_code = twi_process_error(errorsrc); - } - } - return err_code; -} -#endif - -ret_code_t nrf_drv_twi_xfer(nrf_drv_twi_t const * p_instance, - nrf_drv_twi_xfer_desc_t const * p_xfer_desc, - uint32_t flags) -{ - - ret_code_t err_code = NRF_SUCCESS; - twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - - // TXRX and TXTX transfers are support only in non-blocking mode. - ASSERT( !((p_cb->handler == NULL) && (p_xfer_desc->type == NRF_DRV_TWI_XFER_TXRX))); - ASSERT( !((p_cb->handler == NULL) && (p_xfer_desc->type == NRF_DRV_TWI_XFER_TXTX))); - - NRF_LOG_INFO("Transfer type: %s.", (uint32_t)TRANSFER_TO_STR(p_xfer_desc->type)); - NRF_LOG_INFO("Transfer buffers length: primary: %d, secondary: %d.", - p_xfer_desc->primary_length, p_xfer_desc->secondary_length); - NRF_LOG_DEBUG("Primary buffer data:"); - NRF_LOG_HEXDUMP_DEBUG((uint8_t *)p_xfer_desc->p_primary_buf, - p_xfer_desc->primary_length * sizeof(p_xfer_desc->p_primary_buf[0])); - NRF_LOG_DEBUG("Secondary buffer data:"); - NRF_LOG_HEXDUMP_DEBUG((uint8_t *)p_xfer_desc->p_secondary_buf, - p_xfer_desc->secondary_length * sizeof(p_xfer_desc->p_secondary_buf[0])); - - CODE_FOR_TWIM - ( - - err_code = twim_xfer(p_cb, (NRF_TWIM_Type *)p_instance->reg.p_twim, p_xfer_desc, flags); - ) - CODE_FOR_TWI - ( - if ( (NRF_DRV_TWI_FLAG_TX_POSTINC | NRF_DRV_TWI_FLAG_RX_POSTINC) & flags) - { - err_code = NRF_ERROR_NOT_SUPPORTED; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - err_code = twi_xfer(p_cb, (NRF_TWI_Type *)p_instance->reg.p_twi, p_xfer_desc, flags); - ) - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - -ret_code_t nrf_drv_twi_tx(nrf_drv_twi_t const * p_instance, - uint8_t address, - uint8_t const * p_data, - uint8_t length, - bool no_stop) -{ - nrf_drv_twi_xfer_desc_t xfer = NRF_DRV_TWI_XFER_DESC_TX(address, (uint8_t*)p_data, length); - - return nrf_drv_twi_xfer(p_instance, &xfer, no_stop ? NRF_DRV_TWI_FLAG_TX_NO_STOP : 0); -} - -ret_code_t nrf_drv_twi_rx(nrf_drv_twi_t const * p_instance, - uint8_t address, - uint8_t * p_data, - uint8_t length) -{ - nrf_drv_twi_xfer_desc_t xfer = NRF_DRV_TWI_XFER_DESC_RX(address, p_data, length); - return nrf_drv_twi_xfer(p_instance, &xfer, 0); -} - -uint32_t nrf_drv_twi_data_count_get(nrf_drv_twi_t const * const p_instance) -{ - CODE_FOR_TWIM - ( - ASSERT(false); - return 0; - ) - CODE_FOR_TWI - ( - return m_cb[p_instance->drv_inst_idx].bytes_transferred; - ) -} - -uint32_t nrf_drv_twi_start_task_get(nrf_drv_twi_t const * p_instance, - nrf_drv_twi_xfer_type_t xfer_type) -{ - CODE_FOR_TWIM - ( - return (uint32_t)nrf_twim_task_address_get(p_instance->reg.p_twim, - (xfer_type != NRF_DRV_TWI_XFER_RX) ? NRF_TWIM_TASK_STARTTX : NRF_TWIM_TASK_STARTRX); - ) - CODE_FOR_TWI - ( - return (uint32_t)nrf_twi_task_address_get(p_instance->reg.p_twi, - (xfer_type != NRF_DRV_TWI_XFER_RX) ? NRF_TWI_TASK_STARTTX : NRF_TWI_TASK_STARTRX); - ) -} - -uint32_t nrf_drv_twi_stopped_event_get(nrf_drv_twi_t const * p_instance) -{ - CODE_FOR_TWIM - ( - return (uint32_t)nrf_twim_event_address_get(p_instance->reg.p_twim, NRF_TWIM_EVENT_STOPPED); - ) - CODE_FOR_TWI - ( - return (uint32_t)nrf_twi_event_address_get(p_instance->reg.p_twi, NRF_TWI_EVENT_STOPPED); - ) -} - -#ifdef TWIM_IN_USE -static void irq_handler_twim(NRF_TWIM_Type * p_twim, twi_control_block_t * p_cb) -{ - -#if NRF_MODULE_ENABLED(TWIM_NRF52_ANOMALY_109_WORKAROUND) - /* Handle only workaround case. Can be used without TWIM handler in IRQs. */ - if (nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_TXSTARTED)) - { - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_TXSTARTED); - nrf_twim_int_disable(p_twim, NRF_TWIM_INT_TXSTARTED_MASK); - if (p_twim->FREQUENCY == 0) - { - // Set enable to zero to reset TWIM internal state. - nrf_twim_disable(p_twim); - nrf_twim_enable(p_twim); - - // Set proper frequency. - nrf_twim_frequency_set(p_twim, p_cb->bus_frequency); - twim_list_enable_handle(p_twim, p_cb->flags); - - // Start proper transmission. - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_STARTTX); - return; - } - } -#endif - - ASSERT(p_cb->handler); - - if (nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_ERROR)) - { - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_ERROR); - NRF_LOG_DEBUG("TWIM: Event: %s.", (uint32_t)EVT_TO_STR_TWIM(NRF_TWIM_EVENT_ERROR)); - if (!nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_STOPPED)) - { - nrf_twim_int_disable(p_twim, p_cb->int_mask); - p_cb->int_mask = NRF_TWIM_INT_STOPPED_MASK; - nrf_twim_int_enable(p_twim, p_cb->int_mask); - - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_STOP); - return; - } - } - - nrf_drv_twi_evt_t event; - - if (nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_STOPPED)) - { - NRF_LOG_DEBUG("TWIM: Event: %s.", (uint32_t)EVT_TO_STR_TWIM(NRF_TWIM_EVENT_STOPPED)); - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_STOPPED); - event.xfer_desc = p_cb->xfer_desc; - if (p_cb->error) - { - - event.xfer_desc.primary_length = (p_cb->xfer_desc.type == NRF_DRV_TWI_XFER_RX) ? - (uint8_t)nrf_twim_rxd_amount_get(p_twim) : (uint8_t)nrf_twim_txd_amount_get(p_twim); - event.xfer_desc.secondary_length = (p_cb->xfer_desc.type == NRF_DRV_TWI_XFER_TXRX) ? - (uint8_t)nrf_twim_rxd_amount_get(p_twim) : (uint8_t)nrf_twim_txd_amount_get(p_twim); - - } - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_LASTTX); - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_LASTRX); - if (!p_cb->repeated || p_cb->error) - { - nrf_twim_shorts_set(p_twim, 0); - p_cb->int_mask = 0; - nrf_twim_int_disable(p_twim, DISABLE_ALL_INT_SHORT); - } - } - else - { - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_SUSPENDED); - NRF_LOG_DEBUG("TWIM: Event: %s.", (uint32_t)EVT_TO_STR_TWIM(NRF_TWIM_EVENT_SUSPENDED)); - if (p_cb->xfer_desc.type == NRF_DRV_TWI_XFER_TX) - { - event.xfer_desc = p_cb->xfer_desc; - if (!p_cb->repeated) - { - nrf_twim_shorts_set(p_twim, 0); - p_cb->int_mask = 0; - nrf_twim_int_disable(p_twim, DISABLE_ALL_INT_SHORT); - } - } - else - { - nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTTX_STOP_MASK); - p_cb->int_mask = NRF_TWIM_INT_STOPPED_MASK | NRF_TWIM_INT_ERROR_MASK; - nrf_twim_int_disable(p_twim, DISABLE_ALL_INT_SHORT); - nrf_twim_int_enable(p_twim, p_cb->int_mask); - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_STARTTX); - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); - return; - } - } - - uint32_t errorsrc = nrf_twim_errorsrc_get_and_clear(p_twim); - if (errorsrc & NRF_TWIM_ERROR_ADDRESS_NACK) - { - event.type = NRF_DRV_TWI_EVT_ADDRESS_NACK; - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(NRF_DRV_TWI_EVT_ADDRESS_NACK)); - } - else if (errorsrc & NRF_TWIM_ERROR_DATA_NACK) - { - event.type = NRF_DRV_TWI_EVT_DATA_NACK; - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(NRF_DRV_TWI_EVT_DATA_NACK)); - } - else - { - event.type = NRF_DRV_TWI_EVT_DONE; - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(NRF_DRV_TWI_EVT_DONE)); - } - - if (!p_cb->repeated) - { - p_cb->busy = false; - } - p_cb->handler(&event, p_cb->p_context); -} -#endif // TWIM_IN_USE - -#ifdef TWI_IN_USE -static void irq_handler_twi(NRF_TWI_Type * p_twi, twi_control_block_t * p_cb) -{ - ASSERT(p_cb->handler); - - if (twi_transfer(p_twi, - &p_cb->error, - &p_cb->bytes_transferred, - p_cb->p_curr_buf, - p_cb->curr_length, - p_cb->curr_no_stop )) - { - return; - } - - if (!p_cb->error && - ((p_cb->xfer_desc.type == NRF_DRV_TWI_XFER_TXRX) || - (p_cb->xfer_desc.type == NRF_DRV_TWI_XFER_TXTX)) && - p_cb->p_curr_buf == p_cb->xfer_desc.p_primary_buf) - { - p_cb->p_curr_buf = p_cb->xfer_desc.p_secondary_buf; - p_cb->curr_length = p_cb->xfer_desc.secondary_length; - p_cb->curr_no_stop = (p_cb->flags & NRF_DRV_TWI_FLAG_TX_NO_STOP); - - if (p_cb->xfer_desc.type == NRF_DRV_TWI_XFER_TXTX) - { - (void)twi_tx_start_transfer(p_cb, - p_twi, - p_cb->p_curr_buf, - p_cb->curr_length, - p_cb->curr_no_stop); - } - else - { - (void)twi_rx_start_transfer(p_cb, p_twi, p_cb->p_curr_buf, p_cb->curr_length); - } - } - else - { - nrf_drv_twi_evt_t event; - event.xfer_desc = p_cb->xfer_desc; - - if (p_cb->error) - { - uint32_t errorsrc = nrf_twi_errorsrc_get_and_clear(p_twi); - if (errorsrc & NRF_TWI_ERROR_ADDRESS_NACK) - { - event.type = NRF_DRV_TWI_EVT_ADDRESS_NACK; - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(NRF_DRV_TWI_EVT_ADDRESS_NACK)); - } - else if (errorsrc & NRF_TWI_ERROR_DATA_NACK) - { - event.type = NRF_DRV_TWI_EVT_DATA_NACK; - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(NRF_DRV_TWI_EVT_DATA_NACK)); - } - } - else - { - event.type = NRF_DRV_TWI_EVT_DONE; - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(NRF_DRV_TWI_EVT_DONE)); - } - - p_cb->busy = false; - - if (!(NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER & p_cb->flags)) - { - p_cb->handler(&event, p_cb->p_context); - } - } - -} -#endif // TWI_IN_USE - -#if NRF_MODULE_ENABLED(TWI0) -IRQ_HANDLER(0) -{ - #if (TWIM_ONLY || TWI0_WITH_DMA) - irq_handler_twim(NRF_TWIM0, - #else - irq_handler_twi(NRF_TWI0, - #endif - &m_cb[TWI0_INSTANCE_INDEX]); -} -#endif // NRF_MODULE_ENABLED(TWI0) - -#if NRF_MODULE_ENABLED(TWI1) -IRQ_HANDLER(1) -{ - #if (TWIM_ONLY || TWI1_WITH_DMA) - irq_handler_twim(NRF_TWIM1, - #else - irq_handler_twi(NRF_TWI1, - #endif - &m_cb[TWI1_INSTANCE_INDEX]); -} -#endif // NRF_MODULE_ENABLED(TWI1) -#endif // TWI_COUNT -/*lint -restore*/ -#endif // NRF_MODULE_ENABLED(TWI) - diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/twi_master/nrf_drv_twi.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/twi_master/nrf_drv_twi.h deleted file mode 100644 index 0a73c88d96..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/twi_master/nrf_drv_twi.h +++ /dev/null @@ -1,497 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/**@file - * @addtogroup nrf_twi Two Wire master interface (TWI/TWIM) - * @ingroup nrf_drivers - * @brief Two Wire master interface (TWI/TWIM) APIs. - * - * - * @defgroup nrf_drv_twi TWI driver - * @{ - * @ingroup nrf_twi - * @brief TWI master APIs. - */ -#ifndef NRF_DRV_TWI_H__ -#define NRF_DRV_TWI_H__ - -#include "sdk_common.h" -#include "nrf_peripherals.h" - -#ifdef TWI0_ENABLED -#define TWI0_INCR TWI0_ENABLED -#else -#define TWI0_INCR 0 -#endif - -#ifdef TWI1_ENABLED -#define TWI1_INCR TWI1_ENABLED -#else -#define TWI1_INCR 0 -#endif - -#define ENABLED_TWI_COUNT (TWI0_INCR + TWI1_INCR) - -#define TWIM_ONLY ( defined(TWIM_PRESENT) && !defined(TWI_PRESENT)) -#define TWI_TWIM_PRESENT ( defined(TWIM_PRESENT) && defined(TWI_PRESENT)) -#define TWI_ONLY (!defined(TWIM_PRESENT) && defined(TWI_PRESENT)) - -#define TWI0_WITH_DMA (defined(TWI0_USE_EASY_DMA) && TWI0_USE_EASY_DMA && TWI0_ENABLED) -#define TWI1_WITH_DMA (defined(TWI1_USE_EASY_DMA) && TWI1_USE_EASY_DMA && TWI1_ENABLED) - -#define TWI0_WITHOUT_DMA (defined(TWI0_USE_EASY_DMA) && !TWI0_USE_EASY_DMA && TWI0_ENABLED) -#define TWI1_WITHOUT_DMA (defined(TWI1_USE_EASY_DMA) && !TWI1_USE_EASY_DMA && TWI1_ENABLED) - -// suppress: non-standard use of 'defined' preprocessor operator -/*lint -save -e491*/ -// Too complex macros for Doxygen -// This set of macros makes it possible to exclude parts of code when one type -// of supported peripherals is not used. -#ifndef DOXYGEN - -#if (TWI_ONLY && ENABLED_TWI_COUNT) || \ - ((TWI_TWIM_PRESENT) && (TWI0_WITHOUT_DMA || TWI1_WITHOUT_DMA)) -#define TWI_IN_USE 1 -#endif - -#if (TWIM_ONLY && ENABLED_TWI_COUNT) || \ - ((TWI_TWIM_PRESENT) && (TWI0_WITH_DMA || TWI1_WITH_DMA)) -#define TWIM_IN_USE 1 -#endif - -#endif // DOXYGEN - -#ifdef TWI_PRESENT - #include "nrf_twi.h" -#endif - -#ifdef TWIM_PRESENT - #include "nrf_twim.h" -#endif - -#include "sdk_errors.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined(TWIM_IN_USE) && defined(TWI_IN_USE) - #define NRF_DRV_TWI_PERIPHERAL(id) \ - (CONCAT_3(TWI, id, _USE_EASY_DMA) == 1 ? \ - (void *)CONCAT_2(NRF_TWIM, id) \ - : (void *)CONCAT_2(NRF_TWI, id)) -#elif defined(TWIM_IN_USE) && !defined(TWI_IN_USE) - #define NRF_DRV_TWI_PERIPHERAL(id) (void *)CONCAT_2(NRF_TWIM, id) -#else - #define NRF_DRV_TWI_PERIPHERAL(id) (void *)CONCAT_2(NRF_TWI, id) -#endif - -#ifndef TWI_PRESENT -typedef nrf_twim_frequency_t nrf_twi_frequency_t; -typedef nrf_twim_error_t nrf_twi_error_t; -#endif - -/** - * @brief Structure for the TWI master driver instance. - */ -typedef struct -{ - union - { -#ifdef TWIM_IN_USE - NRF_TWIM_Type * p_twim; ///< Pointer to a structure with TWIM registers. -#endif -#ifdef TWI_IN_USE - NRF_TWI_Type * p_twi; ///< Pointer to a structure with TWI registers. -#endif - void * p_regs; - } reg; - uint8_t drv_inst_idx; ///< Driver instance index. - bool use_easy_dma; ///< True if the peripheral with EasyDMA (TWIM) shall be used. -} nrf_drv_twi_t; - -#define TWI0_INSTANCE_INDEX 0 -#define TWI1_INSTANCE_INDEX TWI0_INSTANCE_INDEX+TWI0_INCR - -#ifndef DOXYGEN -#if defined(TWIM_IN_USE) - #if TWIM_ONLY - #define TWI_USE_EASY_DMA(_id) true - #else - #define TWI_USE_EASY_DMA(_id) CONCAT_3(TWI, _id, _USE_EASY_DMA) - #endif -#else - #define TWI_USE_EASY_DMA(_id) false -#endif -#endif // DOXYGEN - -/** - * @brief Macro for creating a TWI master driver instance. - */ -#define NRF_DRV_TWI_INSTANCE(id) \ -{ \ - .reg = {NRF_DRV_TWI_PERIPHERAL(id)}, \ - .drv_inst_idx = CONCAT_3(TWI, id, _INSTANCE_INDEX), \ - .use_easy_dma = TWI_USE_EASY_DMA(id) \ -} - -/** - * @brief Structure for the TWI master driver instance configuration. - */ -typedef struct -{ - uint32_t scl; ///< SCL pin number. - uint32_t sda; ///< SDA pin number. - nrf_twi_frequency_t frequency; ///< TWI frequency. - uint8_t interrupt_priority; ///< Interrupt priority. - bool clear_bus_init; ///< Clear bus during init. - bool hold_bus_uninit; ///< Hold pull up state on gpio pins after uninit. -} nrf_drv_twi_config_t; - -/** - * @brief TWI master driver instance default configuration. - */ -#define NRF_DRV_TWI_DEFAULT_CONFIG \ -{ \ - .frequency = (nrf_twi_frequency_t)TWI_DEFAULT_CONFIG_FREQUENCY, \ - .scl = 31, \ - .sda = 31, \ - .interrupt_priority = TWI_DEFAULT_CONFIG_IRQ_PRIORITY, \ - .clear_bus_init = TWI_DEFAULT_CONFIG_CLR_BUS_INIT, \ - .hold_bus_uninit = TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT, \ -} - -#define NRF_DRV_TWI_FLAG_TX_POSTINC (1UL << 0) /**< TX buffer address incremented after transfer. */ -#define NRF_DRV_TWI_FLAG_RX_POSTINC (1UL << 1) /**< RX buffer address incremented after transfer. */ -#define NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER (1UL << 2) /**< Interrupt after each transfer is suppressed, and the event handler is not called. */ -#define NRF_DRV_TWI_FLAG_HOLD_XFER (1UL << 3) /**< Set up the transfer but do not start it. */ -#define NRF_DRV_TWI_FLAG_REPEATED_XFER (1UL << 4) /**< Flag indicating that the transfer will be executed multiple times. */ -#define NRF_DRV_TWI_FLAG_TX_NO_STOP (1UL << 5) /**< Flag indicating that the TX transfer will not end with a stop condition. */ - -/** - * @brief TWI master driver event types. - */ -typedef enum -{ - NRF_DRV_TWI_EVT_DONE, ///< Transfer completed event. - NRF_DRV_TWI_EVT_ADDRESS_NACK, ///< Error event: NACK received after sending the address. - NRF_DRV_TWI_EVT_DATA_NACK ///< Error event: NACK received after sending a data byte. -} nrf_drv_twi_evt_type_t; - -/** - * @brief TWI master driver transfer types. - */ -typedef enum -{ - NRF_DRV_TWI_XFER_TX, ///< TX transfer. - NRF_DRV_TWI_XFER_RX, ///< RX transfer. - NRF_DRV_TWI_XFER_TXRX, ///< TX transfer followed by RX transfer with repeated start. - NRF_DRV_TWI_XFER_TXTX ///< TX transfer followed by TX transfer with repeated start. -} nrf_drv_twi_xfer_type_t; - -/** - * @brief Structure for a TWI transfer descriptor. - */ -typedef struct -{ - nrf_drv_twi_xfer_type_t type; ///< Type of transfer. - uint8_t address; ///< Slave address. - uint8_t primary_length; ///< Number of bytes transferred. - uint8_t secondary_length; ///< Number of bytes transferred. - uint8_t * p_primary_buf; ///< Pointer to transferred data. - uint8_t * p_secondary_buf; ///< Pointer to transferred data. -} nrf_drv_twi_xfer_desc_t; - - -/**@brief Macro for setting the TX transfer descriptor. */ -#define NRF_DRV_TWI_XFER_DESC_TX(addr, p_data, length) \ - { \ - .type = NRF_DRV_TWI_XFER_TX, \ - .address = addr, \ - .primary_length = length, \ - .p_primary_buf = p_data, \ - } - -/**@brief Macro for setting the RX transfer descriptor. */ -#define NRF_DRV_TWI_XFER_DESC_RX(addr, p_data, length) \ - { \ - .type = NRF_DRV_TWI_XFER_RX, \ - .address = addr, \ - .primary_length = length, \ - .p_primary_buf = p_data, \ - } - -/**@brief Macro for setting the TXRX transfer descriptor. */ -#define NRF_DRV_TWI_XFER_DESC_TXRX(addr, p_tx, tx_len, p_rx, rx_len) \ - { \ - .type = NRF_DRV_TWI_XFER_TXRX, \ - .address = addr, \ - .primary_length = tx_len, \ - .secondary_length = rx_len, \ - .p_primary_buf = p_tx, \ - .p_secondary_buf = p_rx, \ - } - -/**@brief Macro for setting the TXTX transfer descriptor. */ -#define NRF_DRV_TWI_XFER_DESC_TXTX(addr, p_tx, tx_len, p_tx2, tx_len2) \ - { \ - .type = NRF_DRV_TWI_XFER_TXTX, \ - .address = addr, \ - .primary_length = tx_len, \ - .secondary_length = tx_len2, \ - .p_primary_buf = p_tx, \ - .p_secondary_buf = p_tx2, \ - } - -/** - * @brief Structure for a TWI event. - */ -typedef struct -{ - nrf_drv_twi_evt_type_t type; ///< Event type. - nrf_drv_twi_xfer_desc_t xfer_desc; ///< Transfer details. -} nrf_drv_twi_evt_t; - -/** - * @brief TWI event handler prototype. - */ -typedef void (* nrf_drv_twi_evt_handler_t)(nrf_drv_twi_evt_t const * p_event, - void * p_context); - -/** - * @brief Function for initializing the TWI driver instance. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_config Initial configuration. - * @param[in] event_handler Event handler provided by the user. If NULL, blocking mode is enabled. - * @param[in] p_context Context passed to event handler. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the driver is in invalid state. - * @retval NRF_ERROR_BUSY If some other peripheral with the same - * instance ID is already in use. This is - * possible only if PERIPHERAL_RESOURCE_SHARING_ENABLED - * is set to a value other than zero. - */ -ret_code_t nrf_drv_twi_init(nrf_drv_twi_t const * p_instance, - nrf_drv_twi_config_t const * p_config, - nrf_drv_twi_evt_handler_t event_handler, - void * p_context); - -/** - * @brief Function for uninitializing the TWI instance. - * - * @param[in] p_instance Pointer to the driver instance structure. - */ -void nrf_drv_twi_uninit(nrf_drv_twi_t const * p_instance); - -/** - * @brief Function for enabling the TWI instance. - * - * @param[in] p_instance Pointer to the driver instance structure. - */ -void nrf_drv_twi_enable(nrf_drv_twi_t const * p_instance); - -/** - * @brief Function for disabling the TWI instance. - * - * @param[in] p_instance Pointer to the driver instance structure. - */ -void nrf_drv_twi_disable(nrf_drv_twi_t const * p_instance); - -/** - * @brief Function for sending data to a TWI slave. - * - * The transmission will be stopped when an error occurs. If a transfer is ongoing, - * the function returns the error code @ref NRF_ERROR_BUSY. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] address Address of a specific slave device (only 7 LSB). - * @param[in] p_data Pointer to a transmit buffer. - * @param[in] length Number of bytes to send. - * @param[in] no_stop If set, the stop condition is not generated on the bus - * after the transfer has completed successfully (allowing - * for a repeated start in the next transfer). - * - * @retval NRF_SUCCESS If the procedure was successful. - * @retval NRF_ERROR_BUSY If the driver is not ready for a new transfer. - * @retval NRF_ERROR_INTERNAL If an error was detected by hardware. - * @retval NRF_ERROR_INVALID_ADDR If the EasyDMA is used and memory adress in not in RAM. - * @retval NRF_ERROR_DRV_TWI_ERR_ANACK If NACK received after sending the address in polling mode. - * @retval NRF_ERROR_DRV_TWI_ERR_DNACK If NACK received after sending a data byte in polling mode. - */ -ret_code_t nrf_drv_twi_tx(nrf_drv_twi_t const * p_instance, - uint8_t address, - uint8_t const * p_data, - uint8_t length, - bool no_stop); - -/** - * @brief Function for reading data from a TWI slave. - * - * The transmission will be stopped when an error occurs. If a transfer is ongoing, - * the function returns the error code @ref NRF_ERROR_BUSY. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] address Address of a specific slave device (only 7 LSB). - * @param[in] p_data Pointer to a receive buffer. - * @param[in] length Number of bytes to be received. - * - * @retval NRF_SUCCESS If the procedure was successful. - * @retval NRF_ERROR_BUSY If the driver is not ready for a new transfer. - * @retval NRF_ERROR_INTERNAL If an error was detected by hardware. - * @retval NRF_ERROR_DRV_TWI_ERR_OVERRUN If the unread data was replaced by new data - * @retval NRF_ERROR_DRV_TWI_ERR_ANACK If NACK received after sending the address in polling mode. - * @retval NRF_ERROR_DRV_TWI_ERR_DNACK If NACK received after sending a data byte in polling mode. - */ -ret_code_t nrf_drv_twi_rx(nrf_drv_twi_t const * p_instance, - uint8_t address, - uint8_t * p_data, - uint8_t length); - -/** - * @brief Function for preparing a TWI transfer. - * - * The following transfer types can be configured (@ref nrf_drv_twi_xfer_desc_t::type): - * - @ref NRF_DRV_TWI_XFER_TXRX: Write operation followed by a read operation (without STOP condition in between). - * - @ref NRF_DRV_TWI_XFER_TXTX: Write operation followed by a write operation (without STOP condition in between). - * - @ref NRF_DRV_TWI_XFER_TX: Write operation (with or without STOP condition). - * - @ref NRF_DRV_TWI_XFER_RX: Read operation (with STOP condition). - * - * Additional options are provided using the flags parameter: - * - @ref NRF_DRV_TWI_FLAG_TX_POSTINC and @ref NRF_DRV_TWI_FLAG_RX_POSTINC: Post-incrementation of buffer addresses. Supported only by TWIM. - * - @ref NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER: No user event handler after transfer completion. In most cases, this also means no interrupt at the end of the transfer. - * - @ref NRF_DRV_TWI_FLAG_HOLD_XFER: Driver is not starting the transfer. Use this flag if the transfer is triggered externally by PPI. Supported only by TWIM. - * Use @ref nrf_drv_twi_start_task_get to get the address of the start task. - * - @ref NRF_DRV_TWI_FLAG_REPEATED_XFER: Prepare for repeated transfers. You can set up a number of transfers that will be triggered externally (for example by PPI). - * An example is a TXRX transfer with the options @ref NRF_DRV_TWI_FLAG_RX_POSTINC, @ref NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER, and @ref NRF_DRV_TWI_FLAG_REPEATED_XFER. - * After the transfer is set up, a set of transfers can be triggered by PPI that will read, for example, the same register of an - * external component and put it into a RAM buffer without any interrupts. @ref nrf_drv_twi_stopped_event_get can be used to get the - * address of the STOPPED event, which can be used to count the number of transfers. If @ref NRF_DRV_TWI_FLAG_REPEATED_XFER is used, - * the driver does not set the driver instance into busy state, so you must ensure that the next transfers are set up - * when TWIM is not active. Supported only by TWIM. - * - @ref NRF_DRV_TWI_FLAG_TX_NO_STOP: No stop condition after TX transfer. - * - * @note - * Some flag combinations are invalid: - * - @ref NRF_DRV_TWI_FLAG_TX_NO_STOP with @ref nrf_drv_twi_xfer_desc_t::type different than @ref NRF_DRV_TWI_XFER_TX - * - @ref NRF_DRV_TWI_FLAG_REPEATED_XFER with @ref nrf_drv_twi_xfer_desc_t::type set to @ref NRF_DRV_TWI_XFER_TXTX - * - * If @ref nrf_drv_twi_xfer_desc_t::type is set to @ref NRF_DRV_TWI_XFER_TX and the @ref NRF_DRV_TWI_FLAG_TX_NO_STOP and @ref NRF_DRV_TWI_FLAG_REPEATED_XFER - * flags are set, two tasks must be used to trigger a transfer: TASKS_RESUME followed by TASKS_STARTTX. If no stop condition is generated, - * TWIM is in SUSPENDED state. Therefore, it must be resumed before the transfer can be started. - * - * @note - * This function should be used only if the instance is configured to work in non-blocking mode. If the function is used in blocking mode, the driver asserts. - * @note If you are using this function with TWI, the only supported flag is @ref NRF_DRV_TWI_FLAG_TX_NO_STOP. All other flags require TWIM. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_xfer_desc Pointer to the transfer descriptor. - * @param[in] flags Transfer options (0 for default settings). - * - * @retval NRF_SUCCESS If the procedure was successful. - * @retval NRF_ERROR_BUSY If the driver is not ready for a new transfer. - * @retval NRF_ERROR_NOT_SUPPORTED If the provided parameters are not supported. - * @retval NRF_ERROR_INTERNAL If an error was detected by hardware. - * @retval NRF_ERROR_INVALID_ADDR If the EasyDMA is used and memory adress in not in RAM - * @retval NRF_ERROR_DRV_TWI_ERR_OVERRUN If the unread data was replaced by new data (TXRX and RX) - * @retval NRF_ERROR_DRV_TWI_ERR_ANACK If NACK received after sending the address. - * @retval NRF_ERROR_DRV_TWI_ERR_DNACK If NACK received after sending a data byte. - */ -ret_code_t nrf_drv_twi_xfer(nrf_drv_twi_t const * p_instance, - nrf_drv_twi_xfer_desc_t const * p_xfer_desc, - uint32_t flags); - -/** - * @brief Function for checking the TWI driver state. - * - * @param[in] p_instance TWI instance. - * - * @retval true If the TWI driver is currently busy performing a transfer. - * @retval false If the TWI driver is ready for a new transfer. - */ -bool nrf_drv_twi_is_busy(nrf_drv_twi_t const * p_instance); - -/** - * @brief Function for getting the transferred data count. - * - * This function provides valid results only in legacy mode. - * - * @param[in] p_instance Pointer to the driver instance structure. - * - * @return Data count. - */ -uint32_t nrf_drv_twi_data_count_get(nrf_drv_twi_t const * const p_instance); - -/** - * @brief Function for returning the address of a TWI/TWIM start task. - * - * This function should be used if @ref nrf_drv_twi_xfer was called with the flag @ref NRF_DRV_TWI_FLAG_HOLD_XFER. - * In that case, the transfer is not started by the driver, but it must be started externally by PPI. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] xfer_type Transfer type used in the last call of the @ref nrf_drv_twi_xfer function. - * - * @return Start task address (TX or RX) depending on the value of xfer_type. - */ -uint32_t nrf_drv_twi_start_task_get(nrf_drv_twi_t const * p_instance, nrf_drv_twi_xfer_type_t xfer_type); - -/** - * @brief Function for returning the address of a STOPPED TWI/TWIM event. - * - * A STOPPED event can be used to detect the end of a transfer if the @ref NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER - * option is used. - * - * @param[in] p_instance Pointer to the driver instance structure. - * - * @return STOPPED event address. - */ -uint32_t nrf_drv_twi_stopped_event_get(nrf_drv_twi_t const * p_instance); -/** - *@} - **/ - -/*lint -restore*/ - -#ifdef __cplusplus -} -#endif - -#endif // NRF_DRV_TWI_H__ - diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/twis_slave/nrf_drv_twis.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/twis_slave/nrf_drv_twis.c deleted file mode 100644 index d06dec9bcd..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/twis_slave/nrf_drv_twis.c +++ /dev/null @@ -1,977 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(TWIS) -#include "nrf_drv_twis.h" -#if ENABLED_TWIS_COUNT -#include "nrf_assert.h" -#include "app_util_platform.h" -#include "compiler_abstraction.h" - -#define NRF_LOG_MODULE_NAME twis - -#if TWIS_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL TWIS_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR TWIS_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR TWIS_CONFIG_DEBUG_COLOR -#define EVT_TO_STR(event) (event == NRF_TWIS_EVENT_STOPPED ? "NRF_TWIS_EVENT_STOPPED" : \ - (event == NRF_TWIS_EVENT_ERROR ? "NRF_TWIS_EVENT_ERROR" : \ - (event == NRF_TWIS_EVENT_RXSTARTED ? "NRF_TWIS_EVENT_RXSTARTED" : \ - (event == NRF_TWIS_EVENT_TXSTARTED ? "NRF_TWIS_EVENT_TXSTARTED" : \ - (event == NRF_TWIS_EVENT_WRITE ? "NRF_TWIS_EVENT_WRITE" : \ - (event == NRF_TWIS_EVENT_READ ? "NRF_TWIS_EVENT_READ" : "UNKNOWN EVENT")))))) -#else //TWIS_CONFIG_LOG_ENABLED -#define EVT_TO_STR(event) "" -#define NRF_LOG_LEVEL 0 -#endif //TWIS_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); - -/** - * @internal - * @ingroup lib_twis_drv - * @defgroup lib_twis_drv_ivars Software controlled TWI Slave internal variables - * - * Internal variables for TWIS. - * @{ - */ - -/** - * @brief Actual state of internal state machine - * - * Current substate of powered on state. - */ -typedef enum -{ - NRF_DRV_TWIS_SUBSTATE_IDLE, ///< No ongoing transmission - NRF_DRV_TWIS_SUBSTATE_READ_WAITING, ///< Read request received, waiting for data - NRF_DRV_TWIS_SUBSTATE_READ_PENDING, ///< Reading is actually pending (data sending) - NRF_DRV_TWIS_SUBSTATE_WRITE_WAITING, ///< Write request received, waiting for data buffer - NRF_DRV_TWIS_SUBSTATE_WRITE_PENDING, ///< Writing is actually pending (data receiving) -}nrf_drv_twis_substate_t; - -/** - * @brief Constant instance part - * - * Instance data that have not to change. - * It may be placed in FLASH memory. - */ -typedef struct -{ - NRF_TWIS_Type * const p_reg; ///< Peripheral registry address -} nrf_drv_twis_const_inst_t; - -/** - * @brief Variable instance part - * - * There are all informations for the instance that may change. - */ -typedef struct -{ - nrf_drv_state_t state; ///< Actual driver state - volatile nrf_drv_twis_substate_t substate; ///< Actual driver substate - nrf_drv_twis_event_handler_t ev_handler; ///< Event handler functiomn - volatile uint32_t error; ///< Internal error flags - /**< Internal copy of hardware errors flags merged - * with specific internal driver errors flags. - * - * @note This value can be changed in the interrupt - * and cleared in the main program. - * Always use Atomic load-store when updating - * this value in main loop. - */ -}nrf_drv_twis_var_inst_t; - - -/** The constant instance part implementation */ -static const nrf_drv_twis_const_inst_t m_const_inst[ENABLED_TWIS_COUNT] = -{ - #define X(n) { .p_reg = NRF_TWIS##n }, - #include "nrf_drv_twis_inst.def" -}; - -/** The variable instance part implementation */ -static nrf_drv_twis_var_inst_t m_var_inst[ENABLED_TWIS_COUNT] = -{ - #define X(n) { .state = NRF_DRV_STATE_UNINITIALIZED, \ - .substate = NRF_DRV_TWIS_SUBSTATE_IDLE, \ - .ev_handler = NULL, \ - .error = 0 }, - #include "nrf_drv_twis_inst.def" -}; - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - #define IRQ_HANDLER_NAME(n) irq_handler_for_instance_##n - #define IRQ_HANDLER(n) static void IRQ_HANDLER_NAME(n)(void) - - #if NRF_MODULE_ENABLED(TWIS0) - IRQ_HANDLER(0); - #endif - #if NRF_MODULE_ENABLED(TWIS1) - IRQ_HANDLER(1); - #endif - static nrf_drv_irq_handler_t const m_irq_handlers[ENABLED_TWIS_COUNT] = { - #if NRF_MODULE_ENABLED(TWIS0) - IRQ_HANDLER_NAME(0), - #endif - #if NRF_MODULE_ENABLED(TWIS1) - IRQ_HANDLER_NAME(1), - #endif - }; -#else - #if defined (NRF52810_XXAA) - #define IRQ_HANDLER(n) void TWIM##n##_TWIS##n##_IRQHandler(void) - #else - #define IRQ_HANDLER(n) \ - void SPIM##n##_SPIS##n##_TWIM##n##_TWIS##n##_SPI##n##_TWI##n##_IRQHandler(void) - #endif -#endif // NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - -/** - * @brief State processing semaphore - * - * There are semaphores used when when working in synchronous mode (without interrupts activated). - * @note - * In synchronous mode before every state checking the state machine is executed. - * But the situation where state checking function is called from main task and in the same from - * interrupt task has to be considered. - * In such a situation the @ref nrf_drv_twis_state_machine function may be interrupted by second - * call to the same function. - * If in this second call any event will be detected it may be lost because new substate would be - * overwritten when interrupted function finishes. - * In the same time information about event would be lost because it is cleared in interrupting - * function. - * @note - * To make situation described above safe, simple semaphore is implemented. - * It is just a binary flag that informs that state machine is actually executing and should not - * be processed in any interrupting function. - * Because of how it is used no atomic instructions are required to support this kind of semaphore. - * It is not waitable semaphore - function executed or not depending of its state. - */ -static uint8_t m_sm_semaphore[ENABLED_TWIS_COUNT]; - -/** - * @brief Used interrupts mask - * - * Mask for all interrupts used by this library - */ -static const uint32_t m_used_ints_mask = - NRF_TWIS_INT_STOPPED_MASK | - NRF_TWIS_INT_ERROR_MASK | - NRF_TWIS_INT_RXSTARTED_MASK | - NRF_TWIS_INT_TXSTARTED_MASK | - NRF_TWIS_INT_WRITE_MASK | - NRF_TWIS_INT_READ_MASK; - - -/** @} */ /* End of lib_driver_twis_slave_ivars */ - -/** - * @internal - * @ingroup lib_twis_drv - * @defgroup lib_twis_drv_ifunc Software controlled TWI Slave auxiliary internal functions - * - * Internal variables for TWIS. - * @{ - */ - -/** - * @brief Clear all events - * - * Function clears all actually pending events - */ -static void nrf_drv_twis_clear_all_events(NRF_TWIS_Type * const p_reg) -{ - /* Clear all events */ - nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_STOPPED); - nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_ERROR); - nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_RXSTARTED); - nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_TXSTARTED); - nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_WRITE); - nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_READ); -} - -/** - * @brief Reset all the registers to known state - * - * This function clears all registers that requires it to known state. - * TWIS is left disabled after this function. - * All events are cleared. - * @param[out] p_reg TWIS to reset register address - */ -static inline void nrf_drv_twis_swreset(NRF_TWIS_Type * const p_reg) -{ - /* Disable TWIS */ - nrf_twis_disable(p_reg); - - /* Disconnect pins */ - nrf_twis_pins_set(p_reg, ~0U, ~0U); - - /* Disable interrupt global for the instance */ - nrf_drv_common_irq_disable(nrf_drv_get_IRQn(p_reg)); - - /* Disable interrupts */ - nrf_twis_int_disable(p_reg, ~0U); -} - -/** - * @brief Configure pin - * - * Function configures selected for work as SDA or SCL. - * @param pin Pin number to configure - */ -static inline void nrf_drv_twis_config_pin(uint32_t pin, nrf_gpio_pin_pull_t pull) -{ - nrf_gpio_cfg(pin, - NRF_GPIO_PIN_DIR_INPUT, - NRF_GPIO_PIN_INPUT_DISCONNECT, - pull, - NRF_GPIO_PIN_S0D1, - NRF_GPIO_PIN_NOSENSE); -} - -/** - * @brief Call event handler - * - * Function that calls event handler. - * The event handler would be only called if its value is != NULL. - * @param instNr Driver instance number that has called this runtime. - * @param[in] pev Event structure to pass to event handler - * @note - * Remember about possible multithreading. - * It is acceptable to call old event function if it was already disabled. - * What is unacceptable is jump into NULL pointer. - */ -static void nrf_drv_call_event_handler(uint8_t instNr, nrf_drv_twis_evt_t const * const pev) -{ - nrf_drv_twis_event_handler_t evh = m_var_inst[instNr].ev_handler; - if (NULL != evh) - { - evh(pev); - } -} - -/** - * @brief Auxiliary function for getting event state on right bit possition - * - * This function calls @ref nrf_twis_event_get function but the the result - * is shifted to match INTEN register scheme. - * - * @param[in,out] p_reg TWIS to read event from - * @param ev Event code - * - * @return Selected event state shifted by @ref nrf_drv_event_to_bitpos - * - * @sa nrf_twis_event_get - * @sa nrf_drv_event_to_bitpos - */ -static inline uint32_t nrf_drv_twis_event_bit_get(NRF_TWIS_Type * const p_reg, nrf_twis_event_t ev) -{ - return (uint32_t)nrf_twis_event_get_and_clear(p_reg, ev) << nrf_drv_event_to_bitpos(ev); -} - -/** - * @brief Auxiliary function for checking event bit inside given flags value - * - * Function used here to check presence of the event inside given flags value. - * It transforms given event to bit possition and then checks if in given variable it is cleared. - * - * @param flags Flags to test - * @param ev Event code - * - * @retval true Flag for selected event is set - * @retval false Flag for selected event is cleared - */ -static inline bool nrf_drv_twis_check_bit(uint32_t flags, nrf_twis_event_t ev) -{ - return 0 != (flags & (1U<TXD.PTR, - evdata.data.tx_amount * sizeof(uint8_t)); - nrf_drv_call_event_handler(instNr, &evdata); - /* Go to idle and repeat the state machine if READ or WRITE events detected. - * This time READ or WRITE would be started */ - substate = NRF_DRV_TWIS_SUBSTATE_IDLE; - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_STOPPED); - } - else - { - nrf_drv_twis_process_error(instNr, - TWIS_EVT_READ_ERROR, - nrf_twis_error_source_get_and_clear(p_reg)); - substate = NRF_DRV_TWIS_SUBSTATE_IDLE; - ev = 0; - } - break; - case NRF_DRV_TWIS_SUBSTATE_WRITE_WAITING: - if (nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_RXSTARTED) || - nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_WRITE) || - nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_READ) || - nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_STOPPED)) - { - substate = NRF_DRV_TWIS_SUBSTATE_WRITE_PENDING; - /* Any other bits requires further processing in PENDING substate */ - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_RXSTARTED); - } - else - { - nrf_drv_twis_process_error(instNr, - TWIS_EVT_WRITE_ERROR, - nrf_twis_error_source_get_and_clear(p_reg)); - substate = NRF_DRV_TWIS_SUBSTATE_IDLE; - ev = 0; - } - break; - case NRF_DRV_TWIS_SUBSTATE_WRITE_PENDING: - if (nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_WRITE) || - nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_READ) || - nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_STOPPED)) - { - evdata.type = TWIS_EVT_WRITE_DONE; - evdata.data.rx_amount = nrf_twis_rx_amount_get(p_reg); - nrf_drv_call_event_handler(instNr, &evdata); - /* Go to idle and repeat the state machine if READ or WRITE events detected. - * This time READ or WRITE would be started */ - substate = NRF_DRV_TWIS_SUBSTATE_IDLE; - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_STOPPED); - } - else - { - nrf_drv_twis_process_error(instNr, - TWIS_EVT_WRITE_ERROR, - nrf_twis_error_source_get_and_clear(p_reg)); - substate = NRF_DRV_TWIS_SUBSTATE_IDLE; - ev = 0; - } - break; - default: - substate = NRF_DRV_TWIS_SUBSTATE_IDLE; - /* Do not clear any events and repeat the machine */ - break; - } - } - - m_var_inst[instNr].substate = substate; - if (!TWIS_NO_SYNC_MODE) - { - m_sm_semaphore[instNr] = 0; - } -} - -/** - * @brief This function - */ -static inline void nrf_drv_twis_preprocess_status(uint8_t instNr) -{ - if (!TWIS_NO_SYNC_MODE) - { - if (NULL == m_var_inst[instNr].ev_handler) - { - nrf_drv_twis_state_machine(instNr); - } - } -} - -/** - * @brief Interrupt service - * - * This function is called by all interrupts runtime for instances enabled in this library. - * @param instNr Driver instance number that has called this runtime. - */ -static inline void nrf_drv_twis_on_ISR(uint8_t instNr) -{ - nrf_drv_twis_state_machine(instNr); -} - -/** @} */ /* End of lib_driver_twis_slave_ifunc */ - - -/* ------------------------------------------------------------------------- - * Implementation of IRQ Handlers - */ -#define X(n) \ - IRQ_HANDLER(n) \ - { \ - nrf_drv_twis_on_ISR(TWIS##n##_INSTANCE_INDEX); \ - } -#include "nrf_drv_twis_inst.def" - -/* ------------------------------------------------------------------------- - * Implementation of interface functions - * - */ - - -ret_code_t nrf_drv_twis_init( - nrf_drv_twis_t const * const p_instance, - nrf_drv_twis_config_t const * p_config, - nrf_drv_twis_event_handler_t const event_handler) -{ - ASSERT(p_config); - ASSERT(p_config->scl != p_config->sda); - uint8_t instNr = p_instance->instNr; - NRF_TWIS_Type * const p_reg = m_const_inst[instNr].p_reg; - nrf_twis_config_addr_mask_t addr_mask = (nrf_twis_config_addr_mask_t)0; - ret_code_t err_code; - - if (m_var_inst[instNr].state != NRF_DRV_STATE_UNINITIALIZED) - { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - if (nrf_drv_common_per_res_acquire(p_reg, m_irq_handlers[instNr]) != NRF_SUCCESS) - { - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } -#endif - - if (!TWIS_ASSUME_INIT_AFTER_RESET_ONLY) - { - nrf_drv_twis_swreset(p_reg); - } - - nrf_drv_twis_config_pin(p_config->scl, p_config->scl_pull); - nrf_drv_twis_config_pin(p_config->sda, p_config->sda_pull); - - if (0 == (p_config->addr[0] | p_config->addr[1])) - addr_mask = NRF_TWIS_CONFIG_ADDRESS0_MASK; - else - { - if (0 != p_config->addr[0]) - { - addr_mask |= NRF_TWIS_CONFIG_ADDRESS0_MASK; - } - if (0 != p_config->addr[1]) - { - addr_mask |= NRF_TWIS_CONFIG_ADDRESS1_MASK; - } - } - - /* Peripheral interrupt configure - * (note - interrupts still needs to be configured in INTEN register. - * This is done in enable function) */ - nrf_drv_common_irq_enable(nrf_drv_get_IRQn(p_reg), p_config->interrupt_priority); - - /* Configure */ - nrf_twis_pins_set (p_reg, p_config->scl, p_config->sda); - nrf_twis_address_set (p_reg, 0, p_config->addr[0]); - nrf_twis_address_set (p_reg, 1, p_config->addr[1]); - nrf_twis_config_address_set(p_reg, addr_mask); - - /* Clear semaphore */ - if (!TWIS_NO_SYNC_MODE) - { - m_sm_semaphore[instNr] = 0; - } - /* Set internal instance variables */ - m_var_inst[instNr].substate = NRF_DRV_TWIS_SUBSTATE_IDLE; - m_var_inst[instNr].ev_handler = event_handler; - m_var_inst[instNr].state = NRF_DRV_STATE_INITIALIZED; - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -void nrf_drv_twis_uninit(nrf_drv_twis_t const * const p_instance) -{ - uint8_t instNr = p_instance->instNr; - NRF_TWIS_Type * const p_reg = m_const_inst[instNr].p_reg; - TWIS_PSEL_Type psel = p_reg->PSEL; - - ASSERT(m_var_inst[instNr].state != NRF_DRV_STATE_UNINITIALIZED); - - nrf_drv_twis_swreset(p_reg); - - /* Clear pins state if */ - if (!(TWIS_PSEL_SCL_CONNECT_Msk & psel.SCL)) - { - nrf_gpio_cfg_default(psel.SCL); - } - if (!(TWIS_PSEL_SDA_CONNECT_Msk & psel.SDA)) - { - nrf_gpio_cfg_default(psel.SDA); - } - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - nrf_drv_common_per_res_release(p_reg); -#endif - - /* Clear variables */ - m_var_inst[instNr].ev_handler = NULL; - m_var_inst[instNr].state = NRF_DRV_STATE_UNINITIALIZED; -} - - -void nrf_drv_twis_enable(nrf_drv_twis_t const * const p_instance) -{ - uint8_t instNr = p_instance->instNr; - NRF_TWIS_Type * const p_reg = m_const_inst[instNr].p_reg; - nrf_drv_twis_var_inst_t * const p_var_inst = &m_var_inst[instNr]; - - ASSERT(m_var_inst[instNr].state == NRF_DRV_STATE_INITIALIZED); - - nrf_drv_twis_clear_all_events(p_reg); - - /* Enable interrupts */ - if (NULL != p_var_inst->ev_handler) - { - nrf_twis_int_enable(p_reg, m_used_ints_mask); - } - - nrf_twis_enable(p_reg); - p_var_inst->error = 0; - p_var_inst->state = NRF_DRV_STATE_POWERED_ON; - p_var_inst->substate = NRF_DRV_TWIS_SUBSTATE_IDLE; -} - - -void nrf_drv_twis_disable(nrf_drv_twis_t const * const p_instance) -{ - uint8_t instNr = p_instance->instNr; - NRF_TWIS_Type * const p_reg = m_const_inst[instNr].p_reg; - - ASSERT(m_var_inst[instNr].state != NRF_DRV_STATE_UNINITIALIZED); - - nrf_twis_int_disable(p_reg, m_used_ints_mask); - - nrf_twis_disable(p_reg); - m_var_inst[instNr].state = NRF_DRV_STATE_INITIALIZED; -} - -/* ARM recommends not using the LDREX and STREX instructions in C code. - * This is because the compiler might generate loads and stores between - * LDREX and STREX, potentially clearing the exclusive monitor set by LDREX. - * This recommendation also applies to the byte, halfword, and doubleword - * variants LDREXB, STREXB, LDREXH, STREXH, LDREXD, and STREXD. - * - * This is the reason for the function below to be implemented in assembly. - */ -//lint -save -e578 -#if defined (__CC_ARM ) -static __ASM uint32_t nrf_drv_twis_error_get_and_clear_internal(uint32_t volatile * const perror) -{ - mov r3, r0 - mov r1, #0 -nrf_drv_twis_error_get_and_clear_internal_try - ldrex r0, [r3] - strex r2, r1, [r3] - cmp r2, r1 /* did this succeed? */ - bne nrf_drv_twis_error_get_and_clear_internal_try /* no – try again */ - bx lr -} -#elif defined ( __GNUC__ ) -static uint32_t nrf_drv_twis_error_get_and_clear_internal(uint32_t volatile * const perror) -{ - uint32_t ret; - uint32_t temp; - __ASM volatile( - " .syntax unified \n" - "nrf_drv_twis_error_get_and_clear_internal_try: \n" - " ldrex %[ret], [%[perror]] \n" - " strex %[temp], %[zero], [%[perror]] \n" - " cmp %[temp], %[zero] \n" - " bne nrf_drv_twis_error_get_and_clear_internal_try \n" - : /* Output */ - [ret]"=&l"(ret), - [temp]"=&l"(temp) - : /* Input */ - [zero]"l"(0), - [perror]"l"(perror) - ); - UNUSED_VARIABLE(temp); - return ret; -} -#elif defined ( __ICCARM__ ) -static uint32_t nrf_drv_twis_error_get_and_clear_internal(uint32_t volatile * const perror) -{ - uint32_t ret; - uint32_t temp; - __ASM volatile( - "1: \n" - " ldrex %[ret], [%[perror]] \n" - " strex %[temp], %[zero], [%[perror]] \n" - " cmp %[temp], %[zero] \n" - " bne.n 1b \n" - : /* Output */ - [ret]"=&l"(ret), - [temp]"=&l"(temp) - : /* Input */ - [zero]"l"(0), - [perror]"l"(perror) - ); - UNUSED_VARIABLE(temp); - return ret; -} -#else - #error Unknown compiler -#endif -//lint -restore - -uint32_t nrf_drv_twis_error_get_and_clear(nrf_drv_twis_t const * const p_instance) -{ - nrf_drv_twis_var_inst_t * const p_var_inst = &m_var_inst[p_instance->instNr]; - nrf_drv_twis_preprocess_status(p_instance->instNr); - /* Make sure that access to error member is atomic - * so there is no bit that is cleared if it is not copied to local variable already. */ - return nrf_drv_twis_error_get_and_clear_internal(&p_var_inst->error); -} - - -ret_code_t nrf_drv_twis_tx_prepare( - nrf_drv_twis_t const * const p_instance, - void const * const p_buf, - size_t size) -{ - ret_code_t err_code = NRF_SUCCESS; - uint8_t instNr = p_instance->instNr; - NRF_TWIS_Type * const p_reg = m_const_inst[instNr].p_reg; - nrf_drv_twis_var_inst_t * const p_var_inst = &m_var_inst[instNr]; - - /* Check power state*/ - if (p_var_inst->state != NRF_DRV_STATE_POWERED_ON) - { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - /* Check data address */ - if (!nrf_drv_is_in_RAM(p_buf)) - { - err_code = NRF_ERROR_INVALID_ADDR; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - /* Check data size */ - if ((size & TWIS_TXD_MAXCNT_MAXCNT_Msk) != size) - { - err_code = NRF_ERROR_INVALID_LENGTH; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - nrf_twis_tx_prepare(p_reg, (uint8_t const *)p_buf, (nrf_twis_amount_t)size); - NRF_LOG_INFO("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - -} - - -size_t nrf_drv_twis_tx_amount(nrf_drv_twis_t const * const p_instance) -{ - uint8_t instNr = p_instance->instNr; - NRF_TWIS_Type const * const p_reg = m_const_inst[instNr].p_reg; - - return nrf_twis_tx_amount_get(p_reg); -} - - -ret_code_t nrf_drv_twis_rx_prepare( - nrf_drv_twis_t const * const p_instance, - void * const p_buf, - size_t size) -{ - ret_code_t err_code; - uint8_t instNr = p_instance->instNr; - NRF_TWIS_Type * const p_reg = m_const_inst[instNr].p_reg; - nrf_drv_twis_var_inst_t * const p_var_inst = &m_var_inst[instNr]; - - /* Check power state*/ - if (p_var_inst->state != NRF_DRV_STATE_POWERED_ON) - { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - /* Check data address */ - if (!nrf_drv_is_in_RAM(p_buf)) - { - err_code = NRF_ERROR_INVALID_ADDR; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - /* Check data size */ - if ((size & TWIS_RXD_MAXCNT_MAXCNT_Msk) != size) - { - err_code = NRF_ERROR_INVALID_LENGTH; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - nrf_twis_rx_prepare(p_reg, (uint8_t *)p_buf, (nrf_twis_amount_t)size); - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; -} - - -size_t nrf_drv_twis_rx_amount(nrf_drv_twis_t const * const p_instance) -{ - uint8_t instNr = p_instance->instNr; - NRF_TWIS_Type const * const p_reg = m_const_inst[instNr].p_reg; - - return nrf_twis_rx_amount_get(p_reg); -} - - -bool nrf_drv_twis_is_busy(nrf_drv_twis_t const * const p_instance) -{ - nrf_drv_twis_preprocess_status(p_instance->instNr); - return NRF_DRV_TWIS_SUBSTATE_IDLE != m_var_inst[(p_instance->instNr)].substate; -} - -bool nrf_drv_twis_is_waiting_tx_buff(nrf_drv_twis_t const * const p_instance) -{ - nrf_drv_twis_preprocess_status(p_instance->instNr); - return NRF_DRV_TWIS_SUBSTATE_READ_WAITING == m_var_inst[(p_instance->instNr)].substate; -} - -bool nrf_drv_twis_is_waiting_rx_buff(nrf_drv_twis_t const * const p_instance) -{ - nrf_drv_twis_preprocess_status(p_instance->instNr); - return NRF_DRV_TWIS_SUBSTATE_WRITE_WAITING == m_var_inst[(p_instance->instNr)].substate; -} - -bool nrf_drv_twis_is_pending_tx(nrf_drv_twis_t const * const p_instance) -{ - nrf_drv_twis_preprocess_status(p_instance->instNr); - return NRF_DRV_TWIS_SUBSTATE_READ_PENDING == m_var_inst[(p_instance->instNr)].substate; -} - -bool nrf_drv_twis_is_pending_rx(nrf_drv_twis_t const * const p_instance) -{ - nrf_drv_twis_preprocess_status(p_instance->instNr); - return NRF_DRV_TWIS_SUBSTATE_WRITE_PENDING == m_var_inst[(p_instance->instNr)].substate; -} -#endif // TWIS_COUNT -#endif // NRF_MODULE_ENABLED(TWIS) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/twis_slave/nrf_drv_twis.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/twis_slave/nrf_drv_twis.h deleted file mode 100644 index aa70da2a2e..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/twis_slave/nrf_drv_twis.h +++ /dev/null @@ -1,409 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#ifndef NRF_DRV_TWIS_H__ -#define NRF_DRV_TWIS_H__ - -#include "sdk_config.h" -#include "nrf_drv_common.h" -#include "nrf_gpio.h" -#include "sdk_errors.h" -#include "nrf_twis.h" -#include -#include "app_util.h" - -#ifdef __cplusplus -extern "C" { -#endif -/**@file - * @addtogroup nrf_twis Two Wire slave interface (TWIS) - * @ingroup nrf_drivers - * @brief Two Wire slave interface (TWIS) APIs. - * - * - * @defgroup nrf_drv_twis TWIS driver - * @{ - * @ingroup nrf_twis - * @brief TWI slave APIs. - */ - -#ifdef TWIS0_ENABLED -#define TWIS0_INCR TWIS0_ENABLED -#else -#define TWIS0_INCR 0 -#endif - -#ifdef TWIS1_ENABLED -#define TWIS1_INCR TWIS1_ENABLED -#else -#define TWIS1_INCR 0 -#endif - -#define ENABLED_TWIS_COUNT (TWIS0_INCR + TWIS1_INCR) -/** - * @brief Event callback function event definitions. - */ -typedef enum -{ - TWIS_EVT_READ_REQ, ///< Read request detected - /**< If there is no buffer prepared, buf_req flag in the even will be set. - Call then @ref nrf_drv_twis_tx_prepare to give parameters for buffer. - */ - TWIS_EVT_READ_DONE, ///< Read request has finished - free any data - TWIS_EVT_READ_ERROR, ///< Read request finished with error - TWIS_EVT_WRITE_REQ, ///< Write request detected - /**< If there is no buffer prepared, buf_req flag in the even will be set. - Call then @ref nrf_drv_twis_rx_prepare to give parameters for buffer. - */ - TWIS_EVT_WRITE_DONE, ///< Write request has finished - process data - TWIS_EVT_WRITE_ERROR, ///< Write request finished with error - TWIS_EVT_GENERAL_ERROR ///< Error that happens not inside WRITE or READ transaction -} nrf_drv_twis_evt_type_t; - -/** - * @brief TWIS driver instance structure - * - * @note We only need instance number here so we could really use just a number - * that would be send to every driver function. - * But for compatibility reason this number is inserted into the structure. - */ -typedef struct -{ - uint8_t instNr; /**< Instance number */ -}nrf_drv_twis_t; - -/** - * @brief TWIS driver event structure - */ -typedef struct -{ - nrf_drv_twis_evt_type_t type; ///< Event type - union - { - bool buf_req; ///< Flag for @ref TWIS_EVT_READ_REQ and @ref TWIS_EVT_WRITE_REQ - /**< Information if transmission buffer requires to be prepared */ - uint32_t tx_amount; ///< Data for @ref TWIS_EVT_READ_DONE - uint32_t rx_amount; ///< Data for @ref TWIS_EVT_WRITE_DONE - uint32_t error; ///< Data for @ref TWIS_EVT_GENERAL_ERROR - }data; -}nrf_drv_twis_evt_t; - -/** - * @brief TWI slave event callback function type. - * - * @param[in] p_event Event information structure. - */ -typedef void (*nrf_drv_twis_event_handler_t)(nrf_drv_twis_evt_t const * const p_event); - -/** - * @brief Structure for TWIS configuration - */ -typedef struct -{ - uint32_t addr[2]; //!< Set addresses that this slave should respond. Set 0 to disable. - uint32_t scl; //!< SCL pin number - nrf_gpio_pin_pull_t scl_pull; //!< SCL pin pull - uint32_t sda; //!< SDA pin number - nrf_gpio_pin_pull_t sda_pull; //!< SDA pin pull - uint8_t interrupt_priority; //!< The priority of interrupt for the module to set -}nrf_drv_twis_config_t; - -/** - * @brief Possible error sources - * - * This is flag enum - values from this enum can be connected using logical or operator. - * @note - * We could use directly @ref nrf_twis_error_t. Error type enum is redefined here becouse - * of possible future extension (eg. supporting timeouts and synchronous mode). - */ -typedef enum -{ - NRF_DRV_TWIS_ERROR_OVERFLOW = NRF_TWIS_ERROR_OVERFLOW, /**< RX buffer overflow detected, and prevented */ - NRF_DRV_TWIS_ERROR_DATA_NACK = NRF_TWIS_ERROR_DATA_NACK, /**< NACK sent after receiving a data byte */ - NRF_DRV_TWIS_ERROR_OVERREAD = NRF_TWIS_ERROR_OVERREAD, /**< TX buffer over-read detected, and prevented */ - NRF_DRV_TWIS_ERROR_UNEXPECTED_EVENT = 1 << 8 /**< Unexpected event detected by state machine */ -}nrf_drv_twis_error_t; - -/** - * @internal - * @brief Internal macro for creating TWIS driver instance - * - * Second level of indirection in creating the instance. - * Do not use this macro directly. - * Use @ref NRF_DRV_TWIS_INSTANCE instead. - */ -#define NRF_DRV_TWIS_INSTANCE_x(id) \ - { \ - TWIS##id##_INSTANCE_INDEX \ - } - -/** - * @brief Macro for creating TWIS driver instance - * - * @param[in] id Instance index. Use 0 for TWIS0 and 1 for TWIS1 - */ -#define NRF_DRV_TWIS_INSTANCE(id) NRF_DRV_TWIS_INSTANCE_x(id) - -#define TWIS0_INSTANCE_INDEX 0 -#define TWIS1_INSTANCE_INDEX TWIS0_INSTANCE_INDEX+TWIS0_ENABLED - -/** - * @brief Generate default configuration for TWIS driver instance - */ -#define NRF_DRV_TWIS_DEFAULT_CONFIG \ -{ \ - .addr = { TWIS_DEFAULT_CONFIG_ADDR0, TWIS_DEFAULT_CONFIG_ADDR1 }, \ - .scl = 31, \ - .scl_pull = (nrf_gpio_pin_pull_t)TWIS_DEFAULT_CONFIG_SCL_PULL, \ - .sda = 31, \ - .sda_pull = (nrf_gpio_pin_pull_t)TWIS_DEFAULT_CONFIG_SDA_PULL, \ - .interrupt_priority = TWIS_DEFAULT_CONFIG_IRQ_PRIORITY \ -} - -/** - * @brief Function for initializing the TWIS driver instance. - * - * Function initializes and enables TWIS driver. - * @attention After driver initialization enable it by @ref nrf_drv_twis_enable - * - * @param[in] p_instance Pointer to the driver instance structure. - * @attention @em p_instance has to be global object. - * It would be used by interrupts so make it sure that object - * would not be destroyed when function is leaving. - * @param[in] p_config Initial configuration. - * @param[in] event_handler Event handler provided by the user. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the driver is already initialized. - * @retval NRF_ERROR_BUSY If some other peripheral with the same - * instance ID is already in use. This is - * possible only if PERIPHERAL_RESOURCE_SHARING_ENABLED - * is set to a value other than zero. - */ -ret_code_t nrf_drv_twis_init( - nrf_drv_twis_t const * const p_instance, - nrf_drv_twis_config_t const * p_config, - nrf_drv_twis_event_handler_t const event_handler); - -/** - * @brief Function for uninitializing the TWIS driver instance. - * - * Function initializes the peripheral and resets all registers to default values. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @note - * It is safe to call nrf_drv_twis_uninit even before initialization. - * Actually @ref nrf_drv_twis_init function calls this function to - * make sure that TWIS state is known. - * @note - * If TWIS driver was in uninitialized state before calling this function, - * selected pins would not be reset to default configuration. - */ -void nrf_drv_twis_uninit(nrf_drv_twis_t const * const p_instance); - -/** - * @brief Enable TWIS instance - * - * This function enables TWIS instance. - * Function defined if there is needs for dynamically enabling and disabling the peripheral. - * Use @ref nrf_drv_twis_enable and @ref nrf_drv_twis_disable functions. - * They do not change any configuration registers. - * - * @param p_instance Pointer to the driver instance structure. - */ -void nrf_drv_twis_enable(nrf_drv_twis_t const * const p_instance); - -/** - * @brief Disable TWIS instance - * - * Disabling TWIS instance gives possibility to turn off the TWIS while - * holding configuration done by @ref nrf_drv_twis_init - * - * @param p_instance Pointer to the driver instance structure. - */ -void nrf_drv_twis_disable(nrf_drv_twis_t const * const p_instance); - -/** - * @brief Get and clear last error flags - * - * Function gets information about errors. - * This is also the only possibility to exit from error substate of the internal state machine. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @return Error flags defined in @ref nrf_drv_twis_error_t - * @attention - * This function clears error state and flags. - */ -uint32_t nrf_drv_twis_error_get_and_clear(nrf_drv_twis_t const * const p_instance); - - -/** - * @brief Prepare data for sending - * - * This function should be used in response for @ref TWIS_EVT_READ_REQ event. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_buf Transmission buffer - * @attention Transmission buffer has to be placed in RAM. - * @param size Maximum number of bytes that master may read from buffer given. - * - * @retval NRF_SUCCESS Preparation finished properly - * @retval NRF_ERROR_INVALID_ADDR Given @em p_buf is not placed inside the RAM - * @retval NRF_ERROR_INVALID_LENGTH Wrong value in @em size parameter - * @retval NRF_ERROR_INVALID_STATE Module not initialized or not enabled - */ -ret_code_t nrf_drv_twis_tx_prepare( - nrf_drv_twis_t const * const p_instance, - void const * const p_buf, - size_t size); - -/** - * @brief Get number of transmitted bytes - * - * Function returns number of bytes sent. - * This function may be called after @ref TWIS_EVT_READ_DONE or @ref TWIS_EVT_READ_ERROR events. - * - * @param[in] p_instance Pointer to the driver instance structure. - * - * @return Number of bytes sent. - */ -size_t nrf_drv_twis_tx_amount(nrf_drv_twis_t const * const p_instance); - -/** - * @brief Prepare data for receiving - * - * This function should be used in response for @ref TWIS_EVT_WRITE_REQ event. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_buf Buffer that would be filled with received data - * @attention Receiving buffer has to be placed in RAM. - * @param size Size of the buffer (maximum amount of data to receive) - * - * @retval NRF_SUCCESS Preparation finished properly - * @retval NRF_ERROR_INVALID_ADDR Given @em p_buf is not placed inside the RAM - * @retval NRF_ERROR_INVALID_LENGTH Wrong value in @em size parameter - * @retval NRF_ERROR_INVALID_STATE Module not initialized or not enabled - */ -ret_code_t nrf_drv_twis_rx_prepare( - nrf_drv_twis_t const * const p_instance, - void * const p_buf, - size_t size); - -/** - * @brief Get number of received bytes - * - * Function returns number of bytes received. - * This function may be called after @ref TWIS_EVT_WRITE_DONE or @ref TWIS_EVT_WRITE_ERROR events. - * - * @param[in] p_instance Pointer to the driver instance structure. - * - * @return Number of bytes received. - */ -size_t nrf_drv_twis_rx_amount(nrf_drv_twis_t const * const p_instance); - -/** - * @brief Function checks if driver is busy right now - * - * Actual driver substate is tested. - * If driver is in any other state than IDLE or ERROR this function returns true. - * - * @param[in] p_instance Pointer to the driver instance structure. - * - * @retval true Driver is in state other than ERROR or IDLE - * @retval false There is no transmission pending. - */ -bool nrf_drv_twis_is_busy(nrf_drv_twis_t const * const p_instance); - -/** - * @brief Function checks if driver is waiting for tx buffer - * - * If this function returns true, it means that driver is stalled expecting - * of the @ref nrf_drv_twis_tx_prepare function call. - * - * @param[in] p_instance Pointer to the driver instance structure. - * - * @retval true Driver waits for @ref nrf_drv_twis_tx_prepare - * @retval false Driver is not in the state where it waits for preparing tx buffer. - */ -bool nrf_drv_twis_is_waiting_tx_buff(nrf_drv_twis_t const * const p_instance); - -/** - * @brief Function checks if driver is waiting for rx buffer - * - * If this function returns true, it means that driver is staled expecting - * of the @ref nrf_drv_twis_rx_prepare function call. - * - * @param[in] p_instance Pointer to the driver instance structure. - * - * @retval true Driver waits for @ref nrf_drv_twis_rx_prepare - * @retval false Driver is not in the state where it waits for preparing rx buffer. - */ -bool nrf_drv_twis_is_waiting_rx_buff(nrf_drv_twis_t const * const p_instance); - -/** - * @brief Check if driver is sending data - * - * If this function returns true, it means that there is ongoing output transmission. - * - * @param[in] p_instance Pointer to the driver instance structure. - * - * @retval true There is ongoing output transmission. - * @retval false Driver is in other state. - */ -bool nrf_drv_twis_is_pending_tx(nrf_drv_twis_t const * const p_instance); - -/** - * @brief Check if driver is receiving data - * - * If this function returns true, it means that there is ongoing input transmission. - * - * @param[in] p_instance Pointer to the driver instance structure. - * - * @retval true There is ongoing input transmission. - * @retval false Driver is in other state. - */ -bool nrf_drv_twis_is_pending_rx(nrf_drv_twis_t const * const p_instance); - -/** @} */ /* End of lib_twis_drv group */ - -#ifdef __cplusplus -} -#endif - -#endif /* NRF_DRV_TWIS_H__ */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/twis_slave/nrf_drv_twis_inst.def b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/twis_slave/nrf_drv_twis_inst.def deleted file mode 100644 index 419b23f68c..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/twis_slave/nrf_drv_twis_inst.def +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @file - * @brief Xmacro file with contains enumeration of TWIS instances to implement - * - * Use this file everywhere where anything has to be generated for all active TWIS instances. - * Xmacro format: - * - * @code - X(n) - * @endcode - * - * Where @em n is number of the instance itself (0 for NRF_TWIS0). - */ -#if (TWIS0_ENABLED == 1) - X(0) -#endif -#if (TWIS1_ENABLED == 1) - X(1) -#endif -#undef X diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/uart/nrf_drv_uart.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/uart/nrf_drv_uart.c deleted file mode 100644 index 495a92b22c..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/uart/nrf_drv_uart.c +++ /dev/null @@ -1,990 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(UART) -#include "nrf_drv_uart.h" -#include "nrf_assert.h" -#include "nrf_drv_common.h" -#include "nrf_gpio.h" -#include "app_util_platform.h" - -#define NRF_LOG_MODULE_NAME uart - -#if UART_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL UART_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR UART_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR UART_CONFIG_DEBUG_COLOR -#define EVT_TO_STR(event) (event == NRF_UART_EVENT_ERROR ? "NRF_UART_EVENT_ERROR" : "UNKNOWN EVENT") -#else //UART_CONFIG_LOG_ENABLED -#define EVT_TO_STR(event) "" -#define NRF_LOG_LEVEL 0 -#endif //UART_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); - -#if (defined(UARTE_IN_USE) && defined(UART_IN_USE)) - // UARTE and UART combined - #define CODE_FOR_UARTE(code) if (m_cb[p_instance->drv_inst_idx].use_easy_dma) { code } - #define CODE_FOR_UARTE_INT(idx, code) if (m_cb[idx].use_easy_dma) { code } - #define CODE_FOR_UART(code) else { code } -#elif (defined(UARTE_IN_USE) && !defined(UART_IN_USE)) - // UARTE only - #define CODE_FOR_UARTE(code) { code } - #define CODE_FOR_UARTE_INT(idx, code) { code } - #define CODE_FOR_UART(code) -#elif (!defined(UARTE_IN_USE) && defined(UART_IN_USE)) - // UART only - #define CODE_FOR_UARTE(code) - #define CODE_FOR_UARTE_INT(idx, code) - #define CODE_FOR_UART(code) { code } -#else - #error "Wrong configuration." -#endif - -#define TX_COUNTER_ABORT_REQ_VALUE 256 - -typedef struct -{ - void * p_context; - nrf_uart_event_handler_t handler; - uint8_t const * p_tx_buffer; - uint8_t * p_rx_buffer; - uint8_t * p_rx_secondary_buffer; - volatile uint16_t tx_counter; - uint8_t tx_buffer_length; - uint8_t rx_buffer_length; - uint8_t rx_secondary_buffer_length; - volatile uint8_t rx_counter; - bool rx_enabled; - nrf_drv_state_t state; -#if (defined(UARTE_IN_USE) && defined(UART_IN_USE)) - bool use_easy_dma; -#endif -} uart_control_block_t; - -static uart_control_block_t m_cb[UART_ENABLED_COUNT]; - -#ifdef NRF52810_XXAA - #define IRQ_HANDLER(n) void UARTE##n##_IRQHandler(void) -#else - #define IRQ_HANDLER(n) void UART##n##_IRQHandler(void) -#endif - -__STATIC_INLINE void apply_config(nrf_drv_uart_t const * p_instance, nrf_drv_uart_config_t const * p_config) -{ - if (p_config->pseltxd != NRF_UART_PSEL_DISCONNECTED) - { - nrf_gpio_pin_set(p_config->pseltxd); - nrf_gpio_cfg_output(p_config->pseltxd); - } - if (p_config->pselrxd != NRF_UART_PSEL_DISCONNECTED) - { - nrf_gpio_cfg_input(p_config->pselrxd, NRF_GPIO_PIN_NOPULL); - } - - CODE_FOR_UARTE - ( - nrf_uarte_baudrate_set(p_instance->reg.p_uarte, (nrf_uarte_baudrate_t)p_config->baudrate); - nrf_uarte_configure(p_instance->reg.p_uarte, (nrf_uarte_parity_t)p_config->parity, - (nrf_uarte_hwfc_t)p_config->hwfc); - nrf_uarte_txrx_pins_set(p_instance->reg.p_uarte, p_config->pseltxd, p_config->pselrxd); - if (p_config->hwfc == NRF_UART_HWFC_ENABLED) - { - if (p_config->pselcts != NRF_UART_PSEL_DISCONNECTED) - { - nrf_gpio_cfg_input(p_config->pselcts, NRF_GPIO_PIN_NOPULL); - } - if (p_config->pselrts != NRF_UART_PSEL_DISCONNECTED) - { - nrf_gpio_pin_set(p_config->pselrts); - nrf_gpio_cfg_output(p_config->pselrts); - } - nrf_uarte_hwfc_pins_set(p_instance->reg.p_uarte, p_config->pselrts, p_config->pselcts); - } - ) - CODE_FOR_UART - ( - nrf_uart_baudrate_set(p_instance->reg.p_uart, p_config->baudrate); - nrf_uart_configure(p_instance->reg.p_uart, p_config->parity, p_config->hwfc); - nrf_uart_txrx_pins_set(p_instance->reg.p_uart, p_config->pseltxd, p_config->pselrxd); - if (p_config->hwfc == NRF_UART_HWFC_ENABLED) - { - if (p_config->pselcts != NRF_UART_PSEL_DISCONNECTED) - { - nrf_gpio_cfg_input(p_config->pselcts, NRF_GPIO_PIN_NOPULL); - } - if (p_config->pselrts != NRF_UART_PSEL_DISCONNECTED) - { - nrf_gpio_pin_set(p_config->pselrts); - nrf_gpio_cfg_output(p_config->pselrts); - } - nrf_uart_hwfc_pins_set(p_instance->reg.p_uart, p_config->pselrts, p_config->pselcts); - } - ) -} - -__STATIC_INLINE void interrupts_enable(const nrf_drv_uart_t * p_instance, uint8_t interrupt_priority) -{ - CODE_FOR_UARTE - ( - nrf_uarte_event_clear(p_instance->reg.p_uarte, NRF_UARTE_EVENT_ENDRX); - nrf_uarte_event_clear(p_instance->reg.p_uarte, NRF_UARTE_EVENT_ENDTX); - nrf_uarte_event_clear(p_instance->reg.p_uarte, NRF_UARTE_EVENT_ERROR); - nrf_uarte_event_clear(p_instance->reg.p_uarte, NRF_UARTE_EVENT_RXTO); - nrf_uarte_int_enable(p_instance->reg.p_uarte, NRF_UARTE_INT_ENDRX_MASK | - NRF_UARTE_INT_ENDTX_MASK | - NRF_UARTE_INT_ERROR_MASK | - NRF_UARTE_INT_RXTO_MASK); - nrf_drv_common_irq_enable(nrf_drv_get_IRQn((void *)p_instance->reg.p_uarte), interrupt_priority); - ) - CODE_FOR_UART - ( - nrf_uart_event_clear(p_instance->reg.p_uart, NRF_UART_EVENT_TXDRDY); - nrf_uart_event_clear(p_instance->reg.p_uart, NRF_UART_EVENT_RXTO); - nrf_uart_int_enable(p_instance->reg.p_uart, NRF_UART_INT_MASK_TXDRDY | - NRF_UART_INT_MASK_RXTO); - nrf_drv_common_irq_enable(nrf_drv_get_IRQn((void *)p_instance->reg.p_uart), interrupt_priority); - ) -} - -__STATIC_INLINE void interrupts_disable(const nrf_drv_uart_t * p_instance) -{ - CODE_FOR_UARTE - ( - nrf_uarte_int_disable(p_instance->reg.p_uarte, NRF_UARTE_INT_ENDRX_MASK | - NRF_UARTE_INT_ENDTX_MASK | - NRF_UARTE_INT_ERROR_MASK | - NRF_UARTE_INT_RXTO_MASK); - nrf_drv_common_irq_disable(nrf_drv_get_IRQn((void *)p_instance->reg.p_uarte)); - ) - CODE_FOR_UART - ( - nrf_uart_int_disable(p_instance->reg.p_uart, NRF_UART_INT_MASK_RXDRDY | - NRF_UART_INT_MASK_TXDRDY | - NRF_UART_INT_MASK_ERROR | - NRF_UART_INT_MASK_RXTO); - nrf_drv_common_irq_disable(nrf_drv_get_IRQn((void *)p_instance->reg.p_uart)); - ) - -} - -__STATIC_INLINE void pins_to_default(const nrf_drv_uart_t * p_instance) -{ - /* Reset pins to default states */ - uint32_t txd; - uint32_t rxd; - uint32_t rts; - uint32_t cts; - - CODE_FOR_UARTE - ( - txd = nrf_uarte_tx_pin_get(p_instance->reg.p_uarte); - rxd = nrf_uarte_rx_pin_get(p_instance->reg.p_uarte); - rts = nrf_uarte_rts_pin_get(p_instance->reg.p_uarte); - cts = nrf_uarte_cts_pin_get(p_instance->reg.p_uarte); - nrf_uarte_txrx_pins_disconnect(p_instance->reg.p_uarte); - nrf_uarte_hwfc_pins_disconnect(p_instance->reg.p_uarte); - ) - CODE_FOR_UART - ( - txd = nrf_uart_tx_pin_get(p_instance->reg.p_uart); - rxd = nrf_uart_rx_pin_get(p_instance->reg.p_uart); - rts = nrf_uart_rts_pin_get(p_instance->reg.p_uart); - cts = nrf_uart_cts_pin_get(p_instance->reg.p_uart); - nrf_uart_txrx_pins_disconnect(p_instance->reg.p_uart); - nrf_uart_hwfc_pins_disconnect(p_instance->reg.p_uart); - ) - - if (txd != NRF_UART_PSEL_DISCONNECTED) - { - nrf_gpio_cfg_default(txd); - } - - if (rxd != NRF_UART_PSEL_DISCONNECTED) - { - nrf_gpio_cfg_default(rxd); - } - - if (cts != NRF_UART_PSEL_DISCONNECTED) - { - nrf_gpio_cfg_default(cts); - } - - if (rts != NRF_UART_PSEL_DISCONNECTED) - { - nrf_gpio_cfg_default(rts); - } - -} - -__STATIC_INLINE void uart_enable(const nrf_drv_uart_t * p_instance) -{ - CODE_FOR_UARTE(nrf_uarte_enable(p_instance->reg.p_uarte);) - CODE_FOR_UART(nrf_uart_enable(p_instance->reg.p_uart);); -} - -__STATIC_INLINE void uart_disable(const nrf_drv_uart_t * p_instance) -{ - CODE_FOR_UARTE(nrf_uarte_disable(p_instance->reg.p_uarte);) - CODE_FOR_UART(nrf_uart_disable(p_instance->reg.p_uart);); -} - -ret_code_t nrf_drv_uart_init(const nrf_drv_uart_t * p_instance, nrf_drv_uart_config_t const * p_config, - nrf_uart_event_handler_t event_handler) -{ - ASSERT(p_config); - uart_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ret_code_t err_code = NRF_SUCCESS; - - if (p_cb->state != NRF_DRV_STATE_UNINITIALIZED) - { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_ERROR("Init failed. id:%d in wrong state", nrf_drv_get_IRQn((void *)p_instance->reg.p_reg)); - return err_code; - } - -#if (defined(UARTE_IN_USE) && defined(UART_IN_USE)) - p_cb->use_easy_dma = p_config->use_easy_dma; -#endif - apply_config(p_instance, p_config); - - p_cb->handler = event_handler; - p_cb->p_context = p_config->p_context; - - if (p_cb->handler) - { - interrupts_enable(p_instance, p_config->interrupt_priority); - } - - uart_enable(p_instance); - p_cb->rx_buffer_length = 0; - p_cb->rx_secondary_buffer_length = 0; - p_cb->tx_buffer_length = 0; - p_cb->state = NRF_DRV_STATE_INITIALIZED; - p_cb->rx_enabled = false; - return err_code; -} - -void nrf_drv_uart_uninit(const nrf_drv_uart_t * p_instance) -{ - uart_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - - uart_disable(p_instance); - - if (p_cb->handler) - { - interrupts_disable(p_instance); - } - - pins_to_default(p_instance); - - p_cb->state = NRF_DRV_STATE_UNINITIALIZED; - p_cb->handler = NULL; - NRF_LOG_INFO("Uninit id: %d.", nrf_drv_get_IRQn((void *)p_instance->reg.p_reg)); -} - -#if defined(UART_IN_USE) -__STATIC_INLINE void tx_byte(NRF_UART_Type * p_uart, uart_control_block_t * p_cb) -{ - nrf_uart_event_clear(p_uart, NRF_UART_EVENT_TXDRDY); - uint8_t txd = p_cb->p_tx_buffer[p_cb->tx_counter]; - p_cb->tx_counter++; - nrf_uart_txd_set(p_uart, txd); -} - -__STATIC_INLINE ret_code_t nrf_drv_uart_tx_for_uart(const nrf_drv_uart_t * p_instance) -{ - uart_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ret_code_t err_code = NRF_SUCCESS; - - nrf_uart_event_clear(p_instance->reg.p_uart, NRF_UART_EVENT_TXDRDY); - nrf_uart_task_trigger(p_instance->reg.p_uart, NRF_UART_TASK_STARTTX); - - tx_byte(p_instance->reg.p_uart, p_cb); - - if (p_cb->handler == NULL) - { - while (p_cb->tx_counter < (uint16_t) p_cb->tx_buffer_length) - { - while (!nrf_uart_event_check(p_instance->reg.p_uart, NRF_UART_EVENT_TXDRDY) && - p_cb->tx_counter != TX_COUNTER_ABORT_REQ_VALUE) - { - } - if (p_cb->tx_counter != TX_COUNTER_ABORT_REQ_VALUE) - { - tx_byte(p_instance->reg.p_uart, p_cb); - } - } - - if (p_cb->tx_counter == TX_COUNTER_ABORT_REQ_VALUE) - { - err_code = NRF_ERROR_FORBIDDEN; - } - else - { - while (!nrf_uart_event_check(p_instance->reg.p_uart, NRF_UART_EVENT_TXDRDY)) - { - } - nrf_uart_task_trigger(p_instance->reg.p_uart, NRF_UART_TASK_STOPTX); - } - p_cb->tx_buffer_length = 0; - } - return err_code; -} -#endif - -#if defined(UARTE_IN_USE) -__STATIC_INLINE ret_code_t nrf_drv_uart_tx_for_uarte(const nrf_drv_uart_t * p_instance) -{ - uart_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ret_code_t err_code = NRF_SUCCESS; - - nrf_uarte_event_clear(p_instance->reg.p_uarte, NRF_UARTE_EVENT_ENDTX); - nrf_uarte_event_clear(p_instance->reg.p_uarte, NRF_UARTE_EVENT_TXSTOPPED); - nrf_uarte_tx_buffer_set(p_instance->reg.p_uarte, p_cb->p_tx_buffer, p_cb->tx_buffer_length); - nrf_uarte_task_trigger(p_instance->reg.p_uarte, NRF_UARTE_TASK_STARTTX); - - if (p_cb->handler == NULL) - { - bool endtx; - bool txstopped; - do - { - endtx = nrf_uarte_event_check(p_instance->reg.p_uarte, NRF_UARTE_EVENT_ENDTX); - txstopped = nrf_uarte_event_check(p_instance->reg.p_uarte, NRF_UARTE_EVENT_TXSTOPPED); - } - while ((!endtx) && (!txstopped)); - - if (txstopped) - { - err_code = NRF_ERROR_FORBIDDEN; - } - p_cb->tx_buffer_length = 0; - } - return err_code; -} -#endif - -ret_code_t nrf_drv_uart_tx(const nrf_drv_uart_t * p_instance, uint8_t const * const p_data, uint8_t length) -{ - uart_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ASSERT(p_cb->state == NRF_DRV_STATE_INITIALIZED); - ASSERT(length>0); - ASSERT(p_data); - - ret_code_t err_code; - - CODE_FOR_UARTE - ( - // EasyDMA requires that transfer buffers are placed in DataRAM, - // signal error if the are not. - if (!nrf_drv_is_in_RAM(p_data)) - { - err_code = NRF_ERROR_INVALID_ADDR; - NRF_LOG_ERROR("Id:%d, Easy-DMA buffer not in RAM: %08x", - nrf_drv_get_IRQn((void *)p_instance->reg.p_reg), p_data); - return err_code; - } - ) - - if (nrf_drv_uart_tx_in_progress(p_instance)) - { - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Id:%d busy",nrf_drv_get_IRQn((void *)p_instance->reg.p_reg)); - return err_code; - } - p_cb->tx_buffer_length = length; - p_cb->p_tx_buffer = p_data; - p_cb->tx_counter = 0; - - NRF_LOG_INFO("TX req id:%d length: %d.", - nrf_drv_get_IRQn((void *)p_instance->reg.p_reg), - p_cb->tx_buffer_length); - NRF_LOG_DEBUG("Tx data:"); - NRF_LOG_HEXDUMP_DEBUG((uint8_t *)p_cb->p_tx_buffer, - p_cb->tx_buffer_length * sizeof(p_cb->p_tx_buffer[0])); - - CODE_FOR_UARTE - ( - return nrf_drv_uart_tx_for_uarte(p_instance); - ) - CODE_FOR_UART - ( - return nrf_drv_uart_tx_for_uart(p_instance); - ) -} - -bool nrf_drv_uart_tx_in_progress(const nrf_drv_uart_t * p_instance) -{ - return (m_cb[p_instance->drv_inst_idx].tx_buffer_length != 0); -} - -#if defined(UART_IN_USE) -__STATIC_INLINE void rx_enable(const nrf_drv_uart_t * p_instance) -{ - nrf_uart_event_clear(p_instance->reg.p_uart, NRF_UART_EVENT_ERROR); - nrf_uart_event_clear(p_instance->reg.p_uart, NRF_UART_EVENT_RXDRDY); - nrf_uart_task_trigger(p_instance->reg.p_uart, NRF_UART_TASK_STARTRX); -} - -__STATIC_INLINE void rx_byte(NRF_UART_Type * p_uart, uart_control_block_t * p_cb) -{ - if (!p_cb->rx_buffer_length) - { - nrf_uart_event_clear(p_uart, NRF_UART_EVENT_RXDRDY); - // Byte received when buffer is not set - data lost. - (void) nrf_uart_rxd_get(p_uart); - return; - } - nrf_uart_event_clear(p_uart, NRF_UART_EVENT_RXDRDY); - p_cb->p_rx_buffer[p_cb->rx_counter] = nrf_uart_rxd_get(p_uart); - p_cb->rx_counter++; -} - -__STATIC_INLINE ret_code_t nrf_drv_uart_rx_for_uart(const nrf_drv_uart_t * p_instance, uint8_t * p_data, uint8_t length, bool second_buffer) -{ - ret_code_t err_code; - - uart_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - - if ((!p_cb->rx_enabled) && (!second_buffer)) - { - rx_enable(p_instance); - } - - if (p_cb->handler == NULL) - { - nrf_uart_event_clear(p_instance->reg.p_uart, NRF_UART_EVENT_RXTO); - - bool rxrdy; - bool rxto; - bool error; - do - { - do - { - error = nrf_uart_event_check(p_instance->reg.p_uart, NRF_UART_EVENT_ERROR); - rxrdy = nrf_uart_event_check(p_instance->reg.p_uart, NRF_UART_EVENT_RXDRDY); - rxto = nrf_uart_event_check(p_instance->reg.p_uart, NRF_UART_EVENT_RXTO); - } while ((!rxrdy) && (!rxto) && (!error)); - - if (error || rxto) - { - break; - } - rx_byte(p_instance->reg.p_uart, p_cb); - } while (p_cb->rx_buffer_length > p_cb->rx_counter); - - p_cb->rx_buffer_length = 0; - if (error) - { - err_code = NRF_ERROR_INTERNAL; - NRF_LOG_WARNING("RX Id: %d, transfer error.", nrf_drv_get_IRQn((void *)p_instance->reg.p_reg)); - return err_code; - } - - if (rxto) - { - NRF_LOG_WARNING("RX Id: %d, aborted.", nrf_drv_get_IRQn((void *)p_instance->reg.p_reg)); - err_code = NRF_ERROR_FORBIDDEN; - return err_code; - } - - if (p_cb->rx_enabled) - { - nrf_uart_task_trigger(p_instance->reg.p_uart, NRF_UART_TASK_STARTRX); - } - else - { - // Skip stopping RX if driver is forced to be enabled. - nrf_uart_task_trigger(p_instance->reg.p_uart, NRF_UART_TASK_STOPRX); - } - } - else - { - nrf_uart_int_enable(p_instance->reg.p_uart, NRF_UART_INT_MASK_RXDRDY | NRF_UART_INT_MASK_ERROR); - } - err_code = NRF_SUCCESS; - return err_code; -} -#endif - -#if defined(UARTE_IN_USE) -__STATIC_INLINE ret_code_t nrf_drv_uart_rx_for_uarte(const nrf_drv_uart_t * p_instance, uint8_t * p_data, uint8_t length, bool second_buffer) -{ - ret_code_t err_code = NRF_SUCCESS; - nrf_uarte_event_clear(p_instance->reg.p_uarte, NRF_UARTE_EVENT_ENDRX); - nrf_uarte_event_clear(p_instance->reg.p_uarte, NRF_UARTE_EVENT_RXTO); - nrf_uarte_rx_buffer_set(p_instance->reg.p_uarte, p_data, length); - if (!second_buffer) - { - nrf_uarte_task_trigger(p_instance->reg.p_uarte, NRF_UARTE_TASK_STARTRX); - } - else - { - nrf_uarte_shorts_enable(p_instance->reg.p_uarte, NRF_UARTE_SHORT_ENDRX_STARTRX); - } - - if (m_cb[p_instance->drv_inst_idx].handler == NULL) - { - bool endrx; - bool rxto; - bool error; - do { - endrx = nrf_uarte_event_check(p_instance->reg.p_uarte, NRF_UARTE_EVENT_ENDRX); - rxto = nrf_uarte_event_check(p_instance->reg.p_uarte, NRF_UARTE_EVENT_RXTO); - error = nrf_uarte_event_check(p_instance->reg.p_uarte, NRF_UARTE_EVENT_ERROR); - }while ((!endrx) && (!rxto) && (!error)); - - m_cb[p_instance->drv_inst_idx].rx_buffer_length = 0; - - if (error) - { - err_code = NRF_ERROR_INTERNAL; - } - - if (rxto) - { - err_code = NRF_ERROR_FORBIDDEN; - } - } - else - { - nrf_uarte_int_enable(p_instance->reg.p_uarte, NRF_UARTE_INT_ERROR_MASK | NRF_UARTE_INT_ENDRX_MASK); - } - return err_code; -} -#endif - -ret_code_t nrf_drv_uart_rx(const nrf_drv_uart_t * p_instance, uint8_t * p_data, uint8_t length) -{ - uart_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - - ASSERT(m_cb[p_instance->drv_inst_idx].state == NRF_DRV_STATE_INITIALIZED); - ASSERT(length>0); - - ret_code_t err_code; - - CODE_FOR_UARTE - ( - // EasyDMA requires that transfer buffers are placed in DataRAM, - // signal error if the are not. - if (!nrf_drv_is_in_RAM(p_data)) - { - err_code = NRF_ERROR_INVALID_ADDR; - NRF_LOG_ERROR("Id:%d, Easy-DMA buffer not in RAM: %08x", - nrf_drv_get_IRQn((void *)p_instance->reg.p_reg), p_data); - return err_code; - } - ) - - bool second_buffer = false; - - if (p_cb->handler) - { - CODE_FOR_UARTE - ( - nrf_uarte_int_disable(p_instance->reg.p_uarte, NRF_UARTE_INT_ERROR_MASK | NRF_UARTE_INT_ENDRX_MASK); - ) - CODE_FOR_UART - ( - nrf_uart_int_disable(p_instance->reg.p_uart, NRF_UART_INT_MASK_RXDRDY | NRF_UART_INT_MASK_ERROR); - ) - } - if (p_cb->rx_buffer_length != 0) - { - if (p_cb->rx_secondary_buffer_length != 0) - { - if (p_cb->handler) - { - CODE_FOR_UARTE - ( - nrf_uarte_int_enable(p_instance->reg.p_uarte, NRF_UARTE_INT_ERROR_MASK | NRF_UARTE_INT_ENDRX_MASK); - ) - CODE_FOR_UART - ( - nrf_uart_int_enable(p_instance->reg.p_uart, NRF_UART_INT_MASK_RXDRDY | NRF_UART_INT_MASK_ERROR); - ) - } - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("RX Id:%d, busy", nrf_drv_get_IRQn((void *)p_instance->reg.p_reg)); - return err_code; - } - second_buffer = true; - } - - if (!second_buffer) - { - p_cb->rx_buffer_length = length; - p_cb->p_rx_buffer = p_data; - p_cb->rx_counter = 0; - p_cb->rx_secondary_buffer_length = 0; - } - else - { - p_cb->p_rx_secondary_buffer = p_data; - p_cb->rx_secondary_buffer_length = length; - } - - NRF_LOG_INFO("RX Id:%d len:%d", nrf_drv_get_IRQn((void *)p_instance->reg.p_reg), length); - - CODE_FOR_UARTE - ( - return nrf_drv_uart_rx_for_uarte(p_instance, p_data, length, second_buffer); - ) - CODE_FOR_UART - ( - return nrf_drv_uart_rx_for_uart(p_instance, p_data, length, second_buffer); - ) -} - -bool nrf_drv_uart_rx_ready(nrf_drv_uart_t const * p_instance) -{ - CODE_FOR_UARTE - ( - return nrf_uarte_event_check(p_instance->reg.p_uarte, NRF_UARTE_EVENT_ENDRX); - ) - CODE_FOR_UART - ( - return nrf_uart_event_check(p_instance->reg.p_uart, NRF_UART_EVENT_RXDRDY); - ) -} - -void nrf_drv_uart_rx_enable(const nrf_drv_uart_t * p_instance) -{ - //Easy dma mode does not support enabling receiver without setting up buffer. - CODE_FOR_UARTE - ( - ASSERT(false); - ) - CODE_FOR_UART - ( - if (!m_cb[p_instance->drv_inst_idx].rx_enabled) - { - rx_enable(p_instance); - m_cb[p_instance->drv_inst_idx].rx_enabled = true; - } - ) -} - -void nrf_drv_uart_rx_disable(const nrf_drv_uart_t * p_instance) -{ - //Easy dma mode does not support enabling receiver without setting up buffer. - CODE_FOR_UARTE - ( - ASSERT(false); - ) - CODE_FOR_UART - ( - nrf_uart_task_trigger(p_instance->reg.p_uart, NRF_UART_TASK_STOPRX); - m_cb[p_instance->drv_inst_idx].rx_enabled = false; - ) -} - -uint32_t nrf_drv_uart_errorsrc_get(const nrf_drv_uart_t * p_instance) -{ - uint32_t errsrc; - CODE_FOR_UARTE - ( - nrf_uarte_event_clear(p_instance->reg.p_uarte, NRF_UARTE_EVENT_ERROR); - errsrc = nrf_uarte_errorsrc_get_and_clear(p_instance->reg.p_uarte); - ) - CODE_FOR_UART - ( - nrf_uart_event_clear(p_instance->reg.p_uart, NRF_UART_EVENT_ERROR); - errsrc = nrf_uart_errorsrc_get_and_clear(p_instance->reg.p_uart); - ) - return errsrc; -} - -__STATIC_INLINE void rx_done_event(uart_control_block_t * p_cb, uint8_t bytes, uint8_t * p_data) -{ - nrf_drv_uart_event_t event; - - event.type = NRF_DRV_UART_EVT_RX_DONE; - event.data.rxtx.bytes = bytes; - event.data.rxtx.p_data = p_data; - - p_cb->handler(&event, p_cb->p_context); -} - -__STATIC_INLINE void tx_done_event(uart_control_block_t * p_cb, uint8_t bytes) -{ - nrf_drv_uart_event_t event; - - event.type = NRF_DRV_UART_EVT_TX_DONE; - event.data.rxtx.bytes = bytes; - event.data.rxtx.p_data = (uint8_t *)p_cb->p_tx_buffer; - - p_cb->tx_buffer_length = 0; - - NRF_LOG_INFO("TX done len:%d", bytes); - p_cb->handler(&event, p_cb->p_context); -} - -void nrf_drv_uart_tx_abort(const nrf_drv_uart_t * p_instance) -{ - uart_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - - CODE_FOR_UARTE - ( - nrf_uarte_event_clear(p_instance->reg.p_uarte, NRF_UARTE_EVENT_TXSTOPPED); - nrf_uarte_task_trigger(p_instance->reg.p_uarte, NRF_UARTE_TASK_STOPTX); - if (p_cb->handler == NULL) - { - while (!nrf_uarte_event_check(p_instance->reg.p_uarte, NRF_UARTE_EVENT_TXSTOPPED)); - } - ) - CODE_FOR_UART - ( - nrf_uart_task_trigger(p_instance->reg.p_uart, NRF_UART_TASK_STOPTX); - if (p_cb->handler) - { - tx_done_event(p_cb, p_cb->tx_counter); - } - else - { - p_cb->tx_counter = TX_COUNTER_ABORT_REQ_VALUE; - } - ) - NRF_LOG_INFO("TX abort Id:%d", nrf_drv_get_IRQn((void *)p_instance->reg.p_reg)); -} - -void nrf_drv_uart_rx_abort(const nrf_drv_uart_t * p_instance) -{ - CODE_FOR_UARTE - ( - nrf_uarte_task_trigger(p_instance->reg.p_uarte, NRF_UARTE_TASK_STOPRX); - ) - CODE_FOR_UART - ( - nrf_uart_int_disable(p_instance->reg.p_uart, NRF_UART_INT_MASK_RXDRDY | NRF_UART_INT_MASK_ERROR); - nrf_uart_task_trigger(p_instance->reg.p_uart, NRF_UART_TASK_STOPRX); - ) - NRF_LOG_INFO("RX abort Id:%d", nrf_drv_get_IRQn((void *)p_instance->reg.p_reg)); -} - - -#if defined(UART_IN_USE) -__STATIC_INLINE void uart_irq_handler(NRF_UART_Type * p_uart, uart_control_block_t * p_cb) -{ - if (nrf_uart_int_enable_check(p_uart, NRF_UART_INT_MASK_ERROR) && - nrf_uart_event_check(p_uart, NRF_UART_EVENT_ERROR)) - { - nrf_drv_uart_event_t event; - nrf_uart_event_clear(p_uart, NRF_UART_EVENT_ERROR); - nrf_uart_int_disable(p_uart, NRF_UART_INT_MASK_RXDRDY | NRF_UART_INT_MASK_ERROR); - if (!p_cb->rx_enabled) - { - nrf_uart_task_trigger(p_uart, NRF_UART_TASK_STOPRX); - } - event.type = NRF_DRV_UART_EVT_ERROR; - event.data.error.error_mask = nrf_uart_errorsrc_get_and_clear(p_uart); - event.data.error.rxtx.bytes = p_cb->rx_buffer_length; - event.data.error.rxtx.p_data = p_cb->p_rx_buffer; - - //abort transfer - p_cb->rx_buffer_length = 0; - p_cb->rx_secondary_buffer_length = 0; - - p_cb->handler(&event,p_cb->p_context); - } - else if (nrf_uart_int_enable_check(p_uart, NRF_UART_INT_MASK_RXDRDY) && - nrf_uart_event_check(p_uart, NRF_UART_EVENT_RXDRDY)) - { - rx_byte(p_uart, p_cb); - if (p_cb->rx_buffer_length == p_cb->rx_counter) - { - if (p_cb->rx_secondary_buffer_length) - { - uint8_t * p_data = p_cb->p_rx_buffer; - uint8_t rx_counter = p_cb->rx_counter; - - //Switch to secondary buffer. - p_cb->rx_buffer_length = p_cb->rx_secondary_buffer_length; - p_cb->p_rx_buffer = p_cb->p_rx_secondary_buffer; - p_cb->rx_secondary_buffer_length = 0; - p_cb->rx_counter = 0; - rx_done_event(p_cb, rx_counter, p_data); - } - else - { - if (!p_cb->rx_enabled) - { - nrf_uart_task_trigger(p_uart, NRF_UART_TASK_STOPRX); - } - nrf_uart_int_disable(p_uart, NRF_UART_INT_MASK_RXDRDY | NRF_UART_INT_MASK_ERROR); - p_cb->rx_buffer_length = 0; - rx_done_event(p_cb, p_cb->rx_counter, p_cb->p_rx_buffer); - } - } - } - - if (nrf_uart_event_check(p_uart, NRF_UART_EVENT_TXDRDY)) - { - if (p_cb->tx_counter < (uint16_t) p_cb->tx_buffer_length) - { - tx_byte(p_uart, p_cb); - } - else - { - nrf_uart_event_clear(p_uart, NRF_UART_EVENT_TXDRDY); - if (p_cb->tx_buffer_length) - { - tx_done_event(p_cb, p_cb->tx_buffer_length); - } - } - } - - if (nrf_uart_event_check(p_uart, NRF_UART_EVENT_RXTO)) - { - nrf_uart_event_clear(p_uart, NRF_UART_EVENT_RXTO); - - // RXTO event may be triggered as a result of abort call. In th - if (p_cb->rx_enabled) - { - nrf_uart_task_trigger(p_uart, NRF_UART_TASK_STARTRX); - } - if (p_cb->rx_buffer_length) - { - p_cb->rx_buffer_length = 0; - rx_done_event(p_cb, p_cb->rx_counter, p_cb->p_rx_buffer); - } - } -} -#endif - -#if defined(UARTE_IN_USE) -__STATIC_INLINE void uarte_irq_handler(NRF_UARTE_Type * p_uarte, uart_control_block_t * p_cb) -{ - if (nrf_uarte_event_check(p_uarte, NRF_UARTE_EVENT_ERROR)) - { - nrf_drv_uart_event_t event; - - nrf_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ERROR); - - event.type = NRF_DRV_UART_EVT_ERROR; - event.data.error.error_mask = nrf_uarte_errorsrc_get_and_clear(p_uarte); - event.data.error.rxtx.bytes = nrf_uarte_rx_amount_get(p_uarte); - event.data.error.rxtx.p_data = p_cb->p_rx_buffer; - - //abort transfer - p_cb->rx_buffer_length = 0; - p_cb->rx_secondary_buffer_length = 0; - - p_cb->handler(&event, p_cb->p_context); - } - else if (nrf_uarte_event_check(p_uarte, NRF_UARTE_EVENT_ENDRX)) - { - nrf_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ENDRX); - uint8_t amount = nrf_uarte_rx_amount_get(p_uarte); - // If the transfer was stopped before completion, amount of transfered bytes - // will not be equal to the buffer length. Interrupted trunsfer is ignored. - if (amount == p_cb->rx_buffer_length) - { - if (p_cb->rx_secondary_buffer_length) - { - uint8_t * p_data = p_cb->p_rx_buffer; - nrf_uarte_shorts_disable(p_uarte, NRF_UARTE_SHORT_ENDRX_STARTRX); - p_cb->rx_buffer_length = p_cb->rx_secondary_buffer_length; - p_cb->p_rx_buffer = p_cb->p_rx_secondary_buffer; - p_cb->rx_secondary_buffer_length = 0; - rx_done_event(p_cb, amount, p_data); - } - else - { - p_cb->rx_buffer_length = 0; - rx_done_event(p_cb, amount, p_cb->p_rx_buffer); - } - } - } - - if (nrf_uarte_event_check(p_uarte, NRF_UARTE_EVENT_RXTO)) - { - nrf_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_RXTO); - if (p_cb->rx_buffer_length) - { - p_cb->rx_buffer_length = 0; - rx_done_event(p_cb, nrf_uarte_rx_amount_get(p_uarte), p_cb->p_rx_buffer); - } - } - - if (nrf_uarte_event_check(p_uarte, NRF_UARTE_EVENT_ENDTX)) - { - nrf_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ENDTX); - if (p_cb->tx_buffer_length) - { - tx_done_event(p_cb, nrf_uarte_tx_amount_get(p_uarte)); - } - } -} -#endif - -#if UART0_ENABLED -IRQ_HANDLER(0) -{ - CODE_FOR_UARTE_INT - ( - UART0_INSTANCE_INDEX, - uarte_irq_handler(NRF_UARTE0, &m_cb[UART0_INSTANCE_INDEX]); - ) - CODE_FOR_UART - ( - uart_irq_handler(NRF_UART0, &m_cb[UART0_INSTANCE_INDEX]); - ) -} -#endif - -#if UART1_ENABLED -void UARTE1_IRQHandler(void) -{ - CODE_FOR_UARTE_INT - ( - UART1_INSTANCE_INDEX, - uarte_irq_handler(NRF_UARTE1, &m_cb[UART1_INSTANCE_INDEX]); - ) - CODE_FOR_UART - ( - uart_irq_handler(NRF_UART1, &m_cb[UART1_INSTANCE_INDEX]); - ) -} -#endif -#endif //NRF_MODULE_ENABLED(UART) - diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/uart/nrf_drv_uart.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/uart/nrf_drv_uart.h deleted file mode 100644 index 3821922178..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/uart/nrf_drv_uart.h +++ /dev/null @@ -1,465 +0,0 @@ -/** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/**@file - * @addtogroup nrf_uart UART driver and HAL - * @ingroup nrf_drivers - * @brief UART API. - * @details The UART driver provides APIs for utilizing the UART peripheral. - * - * @defgroup nrf_drv_uart UART driver - * @{ - * @ingroup nrf_uart - * - * @brief UART driver. - */ - -#ifndef NRF_DRV_UART_H -#define NRF_DRV_UART_H - -#include "nrf_peripherals.h" - -#ifdef UART_PRESENT -#include "nrf_uart.h" -#endif - -#ifdef UARTE_PRESENT -#include "nrf_uarte.h" -#endif - -#include "sdk_errors.h" -#include "sdk_config.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef UART1_ENABLED -#define UART1_ENABLED 0 -#endif - -#ifndef UART0_ENABLED -#define UART0_ENABLED 0 -#endif - -#define UART0_INSTANCE_INDEX 0 -#define UART1_INSTANCE_INDEX UART0_ENABLED -#define UART_ENABLED_COUNT UART0_ENABLED + UART1_ENABLED - -#if defined(UARTE_PRESENT) && defined(UART_PRESENT) - #define NRF_DRV_UART_PERIPHERAL(id) \ - (CONCAT_3(UART, id, _CONFIG_USE_EASY_DMA) == 1 ? \ - (void *)CONCAT_2(NRF_UARTE, id) \ - : (void *)CONCAT_2(NRF_UART, id)) -#elif defined(UART_PRESENT) - #define NRF_DRV_UART_PERIPHERAL(id) (void *)CONCAT_2(NRF_UART, id) -#else //UARTE_PRESENT !UART_PRESENT - #define NRF_DRV_UART_PERIPHERAL(id) (void *)CONCAT_2(NRF_UARTE, id) -#endif - -// This set of macros makes it possible to exclude parts of code, when one type -// of supported peripherals is not used. - -#if defined(UARTE_PRESENT) && defined(UART_PRESENT) - -#if (UART_EASY_DMA_SUPPORT == 1) -#define UARTE_IN_USE -#endif - -#if (UART_LEGACY_SUPPORT == 1) -#define UART_IN_USE -#endif - -#if (UART_ENABLED == 1) && ((!defined(UARTE_IN_USE) && !defined(UART_IN_USE)) || ((UART_EASY_DMA_SUPPORT == 0) && (UART_LEGACY_SUPPORT == 0))) -#error "Illegal settings in uart module!" -#endif - -#elif defined(UART_PRESENT) -#define UART_IN_USE -#elif defined(UARTE_PRESENT) -#define UARTE_IN_USE -#endif - -#if defined(UARTE_PRESENT) && !defined(UART_PRESENT) -typedef nrf_uarte_hwfc_t nrf_uart_hwfc_t; -typedef nrf_uarte_parity_t nrf_uart_parity_t; -typedef nrf_uarte_baudrate_t nrf_uart_baudrate_t; -typedef nrf_uarte_error_mask_t nrf_uart_error_mask_t; -typedef nrf_uarte_task_t nrf_uart_task_t; -typedef nrf_uarte_event_t nrf_uart_event_t; -#ifndef NRF_UART_PSEL_DISCONNECTED -#define NRF_UART_PSEL_DISCONNECTED 0xFFFFFFFF -#endif -#endif - -/** - * @brief Structure for the UART driver instance. - */ -typedef struct -{ - union - { -#if (defined(UARTE_IN_USE)) - NRF_UARTE_Type * p_uarte; ///< Pointer to a structure with UARTE registers. -#endif -#if (defined(UART_IN_USE) || (UART_ENABLED == 0)) - NRF_UART_Type * p_uart; ///< Pointer to a structure with UART registers. -#endif - void * p_reg; - } reg; - uint8_t drv_inst_idx; ///< Driver instance index. -} nrf_drv_uart_t; - -/** - * @brief Macro for creating an UART driver instance. - */ -#define NRF_DRV_UART_INSTANCE(id) \ -{ \ - .reg = {NRF_DRV_UART_PERIPHERAL(id)}, \ - .drv_inst_idx = CONCAT_3(UART, id, _INSTANCE_INDEX),\ -} - -/** - * @brief Types of UART driver events. - */ -typedef enum -{ - NRF_DRV_UART_EVT_TX_DONE, ///< Requested TX transfer completed. - NRF_DRV_UART_EVT_RX_DONE, ///< Requested RX transfer completed. - NRF_DRV_UART_EVT_ERROR, ///< Error reported by UART peripheral. -} nrf_drv_uart_evt_type_t; - -/**@brief Structure for UART configuration. */ -typedef struct -{ - uint32_t pseltxd; ///< TXD pin number. - uint32_t pselrxd; ///< RXD pin number. - uint32_t pselcts; ///< CTS pin number. - uint32_t pselrts; ///< RTS pin number. - void * p_context; ///< Context passed to interrupt handler. - nrf_uart_hwfc_t hwfc; ///< Flow control configuration. - nrf_uart_parity_t parity; ///< Parity configuration. - nrf_uart_baudrate_t baudrate; ///< Baudrate. - uint8_t interrupt_priority; ///< Interrupt priority. -#ifdef UARTE_PRESENT - bool use_easy_dma; -#endif -} nrf_drv_uart_config_t; - -/**@brief UART default configuration. */ -#ifdef UARTE_PRESENT -#if !UART_LEGACY_SUPPORT -#define DEFAULT_CONFIG_USE_EASY_DMA true -#elif !UART_EASY_DMA_SUPPORT -#define DEFAULT_CONFIG_USE_EASY_DMA false -#else -#define DEFAULT_CONFIG_USE_EASY_DMA UART0_USE_EASY_DMA -#endif -#define NRF_DRV_UART_DEFAULT_CONFIG \ - { \ - .pseltxd = NRF_UART_PSEL_DISCONNECTED, \ - .pselrxd = NRF_UART_PSEL_DISCONNECTED, \ - .pselcts = NRF_UART_PSEL_DISCONNECTED, \ - .pselrts = NRF_UART_PSEL_DISCONNECTED, \ - .p_context = NULL, \ - .hwfc = (nrf_uart_hwfc_t)UART_DEFAULT_CONFIG_HWFC, \ - .parity = (nrf_uart_parity_t)UART_DEFAULT_CONFIG_PARITY, \ - .baudrate = (nrf_uart_baudrate_t)UART_DEFAULT_CONFIG_BAUDRATE, \ - .interrupt_priority = UART_DEFAULT_CONFIG_IRQ_PRIORITY, \ - .use_easy_dma = true \ - } -#else -#define NRF_DRV_UART_DEFAULT_CONFIG \ - { \ - .pseltxd = NRF_UART_PSEL_DISCONNECTED, \ - .pselrxd = NRF_UART_PSEL_DISCONNECTED, \ - .pselcts = NRF_UART_PSEL_DISCONNECTED, \ - .pselrts = NRF_UART_PSEL_DISCONNECTED, \ - .p_context = NULL, \ - .hwfc = (nrf_uart_hwfc_t)UART_DEFAULT_CONFIG_HWFC, \ - .parity = (nrf_uart_parity_t)UART_DEFAULT_CONFIG_PARITY, \ - .baudrate = (nrf_uart_baudrate_t)UART_DEFAULT_CONFIG_BAUDRATE, \ - .interrupt_priority = UART_DEFAULT_CONFIG_IRQ_PRIORITY, \ - } -#endif - -/**@brief Structure for UART transfer completion event. */ -typedef struct -{ - uint8_t * p_data; ///< Pointer to memory used for transfer. - uint8_t bytes; ///< Number of bytes transfered. -} nrf_drv_uart_xfer_evt_t; - -/**@brief Structure for UART error event. */ -typedef struct -{ - nrf_drv_uart_xfer_evt_t rxtx; ///< Transfer details includes number of bytes transfered. - uint32_t error_mask;///< Mask of error flags that generated the event. -} nrf_drv_uart_error_evt_t; - -/**@brief Structure for UART event. */ -typedef struct -{ - nrf_drv_uart_evt_type_t type; ///< Event type. - union - { - nrf_drv_uart_xfer_evt_t rxtx; ///< Data provided for transfer completion events. - nrf_drv_uart_error_evt_t error;///< Data provided for error event. - } data; -} nrf_drv_uart_event_t; - -/** - * @brief UART interrupt event handler. - * - * @param[in] p_event Pointer to event structure. Event is allocated on the stack so it is available - * only within the context of the event handler. - * @param[in] p_context Context passed to interrupt handler, set on initialization. - */ -typedef void (*nrf_uart_event_handler_t)(nrf_drv_uart_event_t * p_event, void * p_context); - -/** - * @brief Function for initializing the UART driver. - * - * This function configures and enables UART. After this function GPIO pins are controlled by UART. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_config Initial configuration. - * @param[in] event_handler Event handler provided by the user. If not provided driver works in - * blocking mode. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If driver is already initialized. - */ -ret_code_t nrf_drv_uart_init(nrf_drv_uart_t const * p_instance, - nrf_drv_uart_config_t const * p_config, - nrf_uart_event_handler_t event_handler); - -/** - * @brief Function for uninitializing the UART driver. - * @param[in] p_instance Pointer to the driver instance structure. - */ -void nrf_drv_uart_uninit(nrf_drv_uart_t const * p_instance); - -/** - * @brief Function for getting the address of a specific UART task. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] task Task. - * - * @return Task address. - */ -__STATIC_INLINE uint32_t nrf_drv_uart_task_address_get(nrf_drv_uart_t const * p_instance, - nrf_uart_task_t task); - -/** - * @brief Function for getting the address of a specific UART event. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] event Event. - * - * @return Event address. - */ -__STATIC_INLINE uint32_t nrf_drv_uart_event_address_get(nrf_drv_uart_t const * p_instance, - nrf_uart_event_t event); - -/** - * @brief Function for sending data over UART. - * - * If an event handler was provided in nrf_drv_uart_init() call, this function - * returns immediately and the handler is called when the transfer is done. - * Otherwise, the transfer is performed in blocking mode, i.e. this function - * returns when the transfer is finished. Blocking mode is not using interrupt so - * there is no context switching inside the function. - * - * @note Peripherals using EasyDMA (i.e. UARTE) require that the transfer buffers - * are placed in the Data RAM region. If they are not and UARTE instance is - * used, this function will fail with error code NRF_ERROR_INVALID_ADDR. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_data Pointer to data. - * @param[in] length Number of bytes to send. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_BUSY If driver is already transferring. - * @retval NRF_ERROR_FORBIDDEN If the transfer was aborted from a different context - * (blocking mode only, also see @ref nrf_drv_uart_rx_disable). - * @retval NRF_ERROR_INVALID_ADDR If p_data does not point to RAM buffer (UARTE only). - */ -ret_code_t nrf_drv_uart_tx(nrf_drv_uart_t const * p_instance, - uint8_t const * const p_data, uint8_t length); - -/** - * @brief Function for checking if UART is currently transmitting. - * - * @param[in] p_instance Pointer to the driver instance structure. - * - * @retval true If UART is transmitting. - * @retval false If UART is not transmitting. - */ -bool nrf_drv_uart_tx_in_progress(nrf_drv_uart_t const * p_instance); - -/** - * @brief Function for aborting any ongoing transmission. - * @note @ref NRF_DRV_UART_EVT_TX_DONE event will be generated in non-blocking mode. Event will - * contain number of bytes sent until abort was called. If Easy DMA is not used event will be - * called from the function context. If Easy DMA is used it will be called from UART interrupt - * context. - * - * @param[in] p_instance Pointer to the driver instance structure. - */ -void nrf_drv_uart_tx_abort(nrf_drv_uart_t const * p_instance); - -/** - * @brief Function for receiving data over UART. - * - * If an event handler was provided in the nrf_drv_uart_init() call, this function - * returns immediately and the handler is called when the transfer is done. - * Otherwise, the transfer is performed in blocking mode, i.e. this function - * returns when the transfer is finished. Blocking mode is not using interrupt so - * there is no context switching inside the function. - * The receive buffer pointer is double buffered in non-blocking mode. The secondary - * buffer can be set immediately after starting the transfer and will be filled - * when the primary buffer is full. The double buffering feature allows - * receiving data continuously. - * - * @note Peripherals using EasyDMA (i.e. UARTE) require that the transfer buffers - * are placed in the Data RAM region. If they are not and UARTE driver instance - * is used, this function will fail with error code NRF_ERROR_INVALID_ADDR. - * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_data Pointer to data. - * @param[in] length Number of bytes to receive. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_BUSY If the driver is already receiving - * (and the secondary buffer has already been set - * in non-blocking mode). - * @retval NRF_ERROR_FORBIDDEN If the transfer was aborted from a different context - * (blocking mode only, also see @ref nrf_drv_uart_rx_disable). - * @retval NRF_ERROR_INTERNAL If UART peripheral reported an error. - * @retval NRF_ERROR_INVALID_ADDR If p_data does not point to RAM buffer (UARTE only). - */ -ret_code_t nrf_drv_uart_rx(nrf_drv_uart_t const * p_instance, - uint8_t * p_data, uint8_t length); - - - -/** - * @brief Function for testing the receiver state in blocking mode. - * - * @param[in] p_instance Pointer to the driver instance structure. - * - * @retval true If the receiver has at least one byte of data to get. - * @retval false If the receiver is empty. - */ -bool nrf_drv_uart_rx_ready(nrf_drv_uart_t const * p_instance); - -/** - * @brief Function for enabling the receiver. - * - * UART has a 6-byte-long RX FIFO and it is used to store incoming data. If a user does not call the - * UART receive function before the FIFO is filled, an overrun error will appear. Enabling the receiver - * without specifying an RX buffer is supported only in UART mode (without Easy DMA). The receiver must be - * explicitly closed by the user @sa nrf_drv_uart_rx_disable. This function asserts if the mode is wrong. - * - * @param[in] p_instance Pointer to the driver instance structure. - */ -void nrf_drv_uart_rx_enable(nrf_drv_uart_t const * p_instance); - -/** - * @brief Function for disabling the receiver. - * - * This function must be called to close the receiver after it has been explicitly enabled by - * @sa nrf_drv_uart_rx_enable. The feature is supported only in UART mode (without Easy DMA). The function - * asserts if mode is wrong. - * - * @param[in] p_instance Pointer to the driver instance structure. - */ -void nrf_drv_uart_rx_disable(nrf_drv_uart_t const * p_instance); - -/** - * @brief Function for aborting any ongoing reception. - * @note @ref NRF_DRV_UART_EVT_RX_DONE event will be generated in non-blocking mode. The event will - * contain the number of bytes received until abort was called. The event is called from UART interrupt - * context. - * - * @param[in] p_instance Pointer to the driver instance structure. - */ -void nrf_drv_uart_rx_abort(nrf_drv_uart_t const * p_instance); - -/** - * @brief Function for reading error source mask. Mask contains values from @ref nrf_uart_error_mask_t. - * @note Function should be used in blocking mode only. In case of non-blocking mode, an error event is - * generated. Function clears error sources after reading. - * - * @param[in] p_instance Pointer to the driver instance structure. - * - * @retval Mask of reported errors. - */ -uint32_t nrf_drv_uart_errorsrc_get(nrf_drv_uart_t const * p_instance); - - -#ifndef SUPPRESS_INLINE_IMPLEMENTATION -__STATIC_INLINE uint32_t nrf_drv_uart_task_address_get(nrf_drv_uart_t const * p_instance, - nrf_uart_task_t task) -{ -#ifdef UART_IN_USE - return nrf_uart_task_address_get(p_instance->reg.p_uart, task); -#else - return nrf_uarte_task_address_get(p_instance->reg.p_uarte, (nrf_uarte_task_t)task); -#endif -} - -__STATIC_INLINE uint32_t nrf_drv_uart_event_address_get(nrf_drv_uart_t const * p_instance, - nrf_uart_event_t event) -{ -#ifdef UART_IN_USE - return nrf_uart_event_address_get(p_instance->reg.p_uart, event); -#else - return nrf_uarte_event_address_get(p_instance->reg.p_uarte, (nrf_uarte_event_t)event); -#endif -} -#endif //SUPPRESS_INLINE_IMPLEMENTATION - -#ifdef __cplusplus -} -#endif - -#endif //NRF_DRV_UART_H -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/usbd/nrf_drv_usbd.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/usbd/nrf_drv_usbd.c deleted file mode 100644 index 3b6a151d7a..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/usbd/nrf_drv_usbd.c +++ /dev/null @@ -1,2220 +0,0 @@ -/** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#include "sdk_config.h" -#if USBD_ENABLED -#include "nrf_drv_usbd.h" -#include "nrf.h" -#include "nordic_common.h" -#include "nrf_drv_common.h" -#include "nrf_atomic.h" -#include "nrf_delay.h" -#include "app_util_platform.h" -#include "nrf_drv_systick.h" /* Marker to delete when not required anymore: >> NRF_DRV_USBD_ERRATA_ENABLE << */ - -#include -#include - -#define NRF_LOG_MODULE_NAME USBD - -#if USBD_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL USBD_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR USBD_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR USBD_CONFIG_DEBUG_COLOR -#else //USBD_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL 0 -#endif //USBD_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); - -#ifndef NRF_DRV_USBD_EARLY_DMA_PROCESS -/* Try to process DMA request when endpoint transmission has been detected - * and just after last EasyDMA has been processed. - * It speeds up the transmission a little (about 10% measured) - * with a cost of more CPU power used. - */ -#define NRF_DRV_USBD_EARLY_DMA_PROCESS 1 -#endif - -#ifndef NRF_DRV_USBD_PROTO1_FIX_DEBUG -/* Debug information when events are fixed*/ -#define NRF_DRV_USBD_PROTO1_FIX_DEBUG 1 -#endif - -#define NRF_DRV_USBD_LOG_PROTO1_FIX_PRINTF(...) \ - do{ \ - if (NRF_DRV_USBD_PROTO1_FIX_DEBUG){ NRF_LOG_DEBUG(__VA_ARGS__); }\ - } while (0) - -#ifndef NRF_DRV_USBD_STARTED_EV_ENABLE -#define NRF_DRV_USBD_STARTED_EV_ENABLE 1 -#endif - -#ifndef NRF_USBD_ISO_DEBUG -/* Also generate information about ISOCHRONOUS events and transfers. - * Turn this off if no ISOCHRONOUS transfers are going to be debugged and this - * option generates a lot of useless messages. */ -#define NRF_USBD_ISO_DEBUG 1 -#endif - -#ifndef NRF_USBD_FAILED_TRANSFERS_DEBUG -/* Also generate debug information for failed transfers. - * It might be useful but may generate a lot of useless debug messages - * in some library usages (for example when transfer is generated and the - * result is used to check whatever endpoint was busy. */ -#define NRF_USBD_FAILED_TRANSFERS_DEBUG 1 -#endif - -#ifndef NRF_USBD_DMAREQ_PROCESS_DEBUG -/* Generate additional messages that mark the status inside - * @ref usbd_dmareq_process. - * It is useful to debug library internals but may generate a lot of - * useless debug messages. */ -#define NRF_USBD_DMAREQ_PROCESS_DEBUG 1 -#endif - - -/** - * @defgroup nrf_drv_usbd_int USB Device driver internal part - * @internal - * @ingroup nrf_drv_usbd - * - * This part contains auxiliary internal macros, variables and functions. - * @{ - */ - -/** - * @brief Assert endpoint number validity - * - * Internal macro to be used during program creation in debug mode. - * Generates assertion if endpoint number is not valid. - * - * @param ep Endpoint number to validity check - */ -#define USBD_ASSERT_EP_VALID(ep) ASSERT( \ - ((NRF_USBD_EPIN_CHECK(ep) && (NRF_USBD_EP_NR_GET(ep) < NRF_USBD_EPIN_CNT )) \ - || \ - (NRF_USBD_EPOUT_CHECK(ep) && (NRF_USBD_EP_NR_GET(ep) < NRF_USBD_EPOUT_CNT))) \ -); - -/** - * @brief Lowest position of bit for IN endpoint - * - * The first bit position corresponding to IN endpoint. - * @sa ep2bit bit2ep - */ -#define USBD_EPIN_BITPOS_0 0 - -/** - * @brief Lowest position of bit for OUT endpoint - * - * The first bit position corresponding to OUT endpoint - * @sa ep2bit bit2ep - */ -#define USBD_EPOUT_BITPOS_0 16 - -/** - * @brief Input endpoint bits mask - */ -#define USBD_EPIN_BIT_MASK (0xFFFFU << USBD_EPIN_BITPOS_0) - -/** - * @brief Output endpoint bits mask - */ -#define USBD_EPOUT_BIT_MASK (0xFFFFU << USBD_EPOUT_BITPOS_0) - -/** - * @brief Auxiliary macro to change EP number into bit position - * - * This macro is used by @ref ep2bit function but also for statically check - * the bitpos values integrity during compilation. - * - * @param[in] ep Endpoint number. - * @return Endpoint bit position. - */ -#define USBD_EP_BITPOS(ep) \ - ((NRF_USBD_EPIN_CHECK(ep) ? USBD_EPIN_BITPOS_0 : USBD_EPOUT_BITPOS_0) + NRF_USBD_EP_NR_GET(ep)) - -/** - * @brief Helper macro for creating an endpoint transfer event. - * - * @param[in] name Name of the created transfer event variable. - * @param[in] endpoint Endpoint number. - * @param[in] ep_stat Endpoint state to report. - * - * @return Initialized event constant variable. - */ -#define NRF_DRV_USBD_EP_TRANSFER_EVENT(name, endpont, ep_stat) \ - const nrf_drv_usbd_evt_t name = { \ - NRF_DRV_USBD_EVT_EPTRANSFER, \ - .data = { \ - .eptransfer = { \ - .ep = endpont, \ - .status = ep_stat \ - } \ - } \ - } - -/* Check it the bit positions values match defined DATAEPSTATUS bit positions */ -STATIC_ASSERT(USBD_EP_BITPOS(NRF_DRV_USBD_EPIN1) == USBD_EPDATASTATUS_EPIN1_Pos ); -STATIC_ASSERT(USBD_EP_BITPOS(NRF_DRV_USBD_EPIN2) == USBD_EPDATASTATUS_EPIN2_Pos ); -STATIC_ASSERT(USBD_EP_BITPOS(NRF_DRV_USBD_EPIN3) == USBD_EPDATASTATUS_EPIN3_Pos ); -STATIC_ASSERT(USBD_EP_BITPOS(NRF_DRV_USBD_EPIN4) == USBD_EPDATASTATUS_EPIN4_Pos ); -STATIC_ASSERT(USBD_EP_BITPOS(NRF_DRV_USBD_EPIN5) == USBD_EPDATASTATUS_EPIN5_Pos ); -STATIC_ASSERT(USBD_EP_BITPOS(NRF_DRV_USBD_EPIN6) == USBD_EPDATASTATUS_EPIN6_Pos ); -STATIC_ASSERT(USBD_EP_BITPOS(NRF_DRV_USBD_EPIN7) == USBD_EPDATASTATUS_EPIN7_Pos ); -STATIC_ASSERT(USBD_EP_BITPOS(NRF_DRV_USBD_EPOUT1) == USBD_EPDATASTATUS_EPOUT1_Pos); -STATIC_ASSERT(USBD_EP_BITPOS(NRF_DRV_USBD_EPOUT2) == USBD_EPDATASTATUS_EPOUT2_Pos); -STATIC_ASSERT(USBD_EP_BITPOS(NRF_DRV_USBD_EPOUT3) == USBD_EPDATASTATUS_EPOUT3_Pos); -STATIC_ASSERT(USBD_EP_BITPOS(NRF_DRV_USBD_EPOUT4) == USBD_EPDATASTATUS_EPOUT4_Pos); -STATIC_ASSERT(USBD_EP_BITPOS(NRF_DRV_USBD_EPOUT5) == USBD_EPDATASTATUS_EPOUT5_Pos); -STATIC_ASSERT(USBD_EP_BITPOS(NRF_DRV_USBD_EPOUT6) == USBD_EPDATASTATUS_EPOUT6_Pos); -STATIC_ASSERT(USBD_EP_BITPOS(NRF_DRV_USBD_EPOUT7) == USBD_EPDATASTATUS_EPOUT7_Pos); - - -/** - * @name Internal auxiliary definitions for SETUP packet - * - * Definitions used to take out the information about last SETUP packet direction - * from @c bmRequestType. - * @{ - */ -/** The position of DIR bit in bmRequestType inside SETUP packet */ -#define USBD_DRV_REQUESTTYPE_DIR_BITPOS 7 -/** The mask of DIR bit in bmRequestType inside SETUP packet */ -#define USBD_DRV_REQUESTTYPE_DIR_MASK (1U << USBD_DRV_REQUESTTYPE_DIR_BITPOS) -/** The value of DIR bit for OUT direction (Host -> Device) */ -#define USBD_DRV_REQUESTTYPE_DIR_OUT (0U << USBD_DRV_REQUESTTYPE_DIR_BITPOS) -/** The value of DIR bit for IN direction (Device -> Host) */ -#define USBD_DRV_REQUESTTYPE_DIR_IN (1U << USBD_DRV_REQUESTTYPE_DIR_BITPOS) -/** @} */ - -/** - * @brief Current driver state - */ -static nrf_drv_state_t m_drv_state = NRF_DRV_STATE_UNINITIALIZED; - -/** - * @brief Event handler for the library - * - * Event handler that would be called on events. - * - * @note Currently it cannot be null if any interrupt is activated. - */ -static nrf_drv_usbd_event_handler_t m_event_handler; - -/** - * @brief Detected state of the bus - * - * Internal state changed in interrupts handling when - * RESUME or SUSPEND event is processed. - * - * Values: - * - true - bus suspended - * - false - ongoing normal communication on the bus - * - * @note This is only the bus state and does not mean that the peripheral is in suspend state. - */ -static volatile bool m_bus_suspend; - -/** - * @brief Internal constant that contains interrupts disabled in suspend state - * - * Internal constant used in @ref nrf_drv_usbd_suspend_irq_config and @ref nrf_drv_usbd_active_irq_config - * functions. - */ -static const uint32_t m_irq_disabled_in_suspend = - NRF_USBD_INT_ENDEPIN0_MASK | - NRF_USBD_INT_EP0DATADONE_MASK | - NRF_USBD_INT_ENDEPOUT0_MASK | - NRF_USBD_INT_EP0SETUP_MASK | - NRF_USBD_INT_DATAEP_MASK; - -/** - * @brief Direction of last received Setup transfer - * - * This variable is used to redirect internal setup data event - * into selected endpoint (IN or OUT). - */ -static nrf_drv_usbd_ep_t m_last_setup_dir; - -/** - * @brief Mark endpoint readiness for DMA transfer - * - * Bits in this variable are cleared and set in interrupts. - * 1 means that endpoint is ready for DMA transfer. - * 0 means that DMA transfer cannot be performed on selected endpoint. - */ -static uint32_t m_ep_ready; - -/** - * @brief Mark endpoint with prepared data to transfer by DMA - * - * This variable can be from any place in the code (interrupt or main thread). - * It would be cleared only from USBD interrupt. - * - * Mask prepared USBD data for transmission. - * It is cleared when no more data to transmit left. - */ -static uint32_t m_ep_dma_waiting; - -/** - * @brief Current EasyDMA state - * - * Single flag, updated only inside interrupts, that marks current EasyDMA state. - * In USBD there is only one DMA channel working in background, and new transfer - * cannot be started when there is ongoing transfer on any other channel. - */ -static uint8_t m_dma_pending; - -/** - * @brief Simulated data EP status bits required for errata 104 - * - * Marker to delete when not required anymore: >> NRF_DRV_USBD_ERRATA_ENABLE << - */ -static uint32_t m_simulated_dataepstatus; - -/** - * @brief The structure that would hold transfer configuration to every endpoint - * - * The structure that holds all the data required by the endpoint to proceed - * with LIST functionality and generate quick callback directly when data - * buffer is ready. - */ -typedef struct -{ - nrf_drv_usbd_handler_t handler; //!< Handler for current transfer, function pointer - void * p_context; //!< Context for transfer handler - size_t transfer_cnt; //!< Number of transferred bytes in the current transfer - uint16_t max_packet_size; //!< Configured endpoint size - nrf_drv_usbd_ep_status_t status; //!< NRF_SUCCESS or error code, never NRF_ERROR_BUSY - this one is calculated -}usbd_drv_ep_state_t; - -/** - * @brief The array of transfer configurations for the endpoints. - * - * The status of the transfer on each endpoint. - */ -static struct -{ - usbd_drv_ep_state_t ep_out[NRF_USBD_EPOUT_CNT]; //!< Status for OUT endpoints. - usbd_drv_ep_state_t ep_in [NRF_USBD_EPIN_CNT ]; //!< Status for IN endpoints. -}m_ep_state; - -/** - * @brief Status variables for integrated feeders. - * - * Current status for integrated feeders (IN transfers). - * Integrated feeders are used for default transfers: - * 1. Simple RAM transfer - * 2. Simple flash transfer - * 3. RAM transfer with automatic ZLP - * 4. Flash transfer with automatic ZLP - */ -nrf_drv_usbd_transfer_t m_ep_feeder_state[NRF_USBD_EPIN_CNT]; - -/** - * @brief Status variables for integrated consumers - * - * Current status for integrated consumers - * Currently one type of transfer is supported: - * 1. Transfer to RAM - * - * Transfer is finished automatically when received data block is smaller - * than the endpoint buffer or all the required data is received. - */ -nrf_drv_usbd_transfer_t m_ep_consumer_state[NRF_USBD_EPOUT_CNT]; - - -/** - * @brief Buffer used to send data directly from FLASH - * - * This is internal buffer that would be used to emulate the possibility - * to transfer data directly from FLASH. - * We do not have to care about the source of data when calling transfer functions. - * - * We do not need more buffers that one, because only one transfer can be pending - * at once. - */ -static uint32_t m_tx_buffer[CEIL_DIV( - NRF_DRV_USBD_FEEDER_BUFFER_SIZE, sizeof(uint32_t))]; - - -/* Early declaration. Documentation above definition. */ -static void usbd_dmareq_process(void); - - -/** - * @brief Change endpoint number to endpoint event code - * - * @param ep Endpoint number - * - * @return Connected endpoint event code. - * - * Marker to delete when not required anymore: >> NRF_DRV_USBD_ERRATA_ENABLE << - */ -static inline nrf_usbd_event_t nrf_drv_usbd_ep_to_endevent(nrf_drv_usbd_ep_t ep) -{ - USBD_ASSERT_EP_VALID(ep); - - static const nrf_usbd_event_t epin_endev[] = - { - NRF_USBD_EVENT_ENDEPIN0, - NRF_USBD_EVENT_ENDEPIN1, - NRF_USBD_EVENT_ENDEPIN2, - NRF_USBD_EVENT_ENDEPIN3, - NRF_USBD_EVENT_ENDEPIN4, - NRF_USBD_EVENT_ENDEPIN5, - NRF_USBD_EVENT_ENDEPIN6, - NRF_USBD_EVENT_ENDEPIN7, - NRF_USBD_EVENT_ENDISOIN0 - }; - static const nrf_usbd_event_t epout_endev[] = - { - NRF_USBD_EVENT_ENDEPOUT0, - NRF_USBD_EVENT_ENDEPOUT1, - NRF_USBD_EVENT_ENDEPOUT2, - NRF_USBD_EVENT_ENDEPOUT3, - NRF_USBD_EVENT_ENDEPOUT4, - NRF_USBD_EVENT_ENDEPOUT5, - NRF_USBD_EVENT_ENDEPOUT6, - NRF_USBD_EVENT_ENDEPOUT7, - NRF_USBD_EVENT_ENDISOOUT0 - }; - - return (NRF_USBD_EPIN_CHECK(ep) ? epin_endev : epout_endev)[NRF_USBD_EP_NR_GET(ep)]; -} - - -/** - * @brief Get interrupt mask for selected endpoint - * - * @param[in] ep Endpoint number - * - * @return Interrupt mask related to the EasyDMA transfer end for the - * chosen endpoint. - */ -static inline uint32_t nrf_drv_usbd_ep_to_int(nrf_drv_usbd_ep_t ep) -{ - USBD_ASSERT_EP_VALID(ep); - - static const uint8_t epin_bitpos[] = - { - USBD_INTEN_ENDEPIN0_Pos, - USBD_INTEN_ENDEPIN1_Pos, - USBD_INTEN_ENDEPIN2_Pos, - USBD_INTEN_ENDEPIN3_Pos, - USBD_INTEN_ENDEPIN4_Pos, - USBD_INTEN_ENDEPIN5_Pos, - USBD_INTEN_ENDEPIN6_Pos, - USBD_INTEN_ENDEPIN7_Pos, - USBD_INTEN_ENDISOIN_Pos - }; - static const uint8_t epout_bitpos[] = - { - USBD_INTEN_ENDEPOUT0_Pos, - USBD_INTEN_ENDEPOUT1_Pos, - USBD_INTEN_ENDEPOUT2_Pos, - USBD_INTEN_ENDEPOUT3_Pos, - USBD_INTEN_ENDEPOUT4_Pos, - USBD_INTEN_ENDEPOUT5_Pos, - USBD_INTEN_ENDEPOUT6_Pos, - USBD_INTEN_ENDEPOUT7_Pos, - USBD_INTEN_ENDISOOUT_Pos - }; - - return 1UL << (NRF_USBD_EPIN_CHECK(ep) ? epin_bitpos : epout_bitpos)[NRF_USBD_EP_NR_GET(ep)]; -} - -/** - * @name Integrated feeders and consumers - * - * Internal, default functions for transfer processing. - * @{ - */ - -/** - * @brief Integrated consumer to RAM buffer. - * - * @param p_next See @ref nrf_drv_usbd_consumer_t documentation. - * @param p_context See @ref nrf_drv_usbd_consumer_t documentation. - * @param ep_size See @ref nrf_drv_usbd_consumer_t documentation. - * @param data_size See @ref nrf_drv_usbd_consumer_t documentation. - * - * @retval true Continue transfer. - * @retval false This was the last transfer. - */ -bool nrf_drv_usbd_consumer( - nrf_drv_usbd_ep_transfer_t * p_next, - void * p_context, - size_t ep_size, - size_t data_size) -{ - nrf_drv_usbd_transfer_t * p_transfer = p_context; - ASSERT(ep_size >= data_size); - ASSERT((p_transfer->p_data.rx == NULL) || - nrf_drv_is_in_RAM((const void*)(p_transfer->p_data.ptr))); - - size_t size = p_transfer->size; - if (size < data_size) - { - NRF_LOG_DEBUG("consumer: buffer too small: r: %u, l: %u", data_size, size); - /* Buffer size to small */ - p_next->size = 0; - p_next->p_data = p_transfer->p_data; - } - else - { - p_next->size = data_size; - p_next->p_data = p_transfer->p_data; - size -= data_size; - p_transfer->size = size; - p_transfer->p_data.ptr += data_size; - } - return (ep_size == data_size) && (size != 0); -} - -/** - * @brief Integrated feeder from RAM source. - * - * @param[out] p_next See @ref nrf_drv_usbd_feeder_t documentation. - * @param[in,out] p_context See @ref nrf_drv_usbd_feeder_t documentation. - * @param[in] ep_size See @ref nrf_drv_usbd_feeder_t documentation. - * - * @retval true Continue transfer. - * @retval false This was the last transfer. - */ -bool nrf_drv_usbd_feeder_ram( - nrf_drv_usbd_ep_transfer_t * p_next, - void * p_context, - size_t ep_size) -{ - nrf_drv_usbd_transfer_t * p_transfer = p_context; - ASSERT(nrf_drv_is_in_RAM((const void*)(p_transfer->p_data.ptr))); - - size_t tx_size = p_transfer->size; - if (tx_size > ep_size) - { - tx_size = ep_size; - } - - p_next->p_data = p_transfer->p_data; - p_next->size = tx_size; - - p_transfer->size -= tx_size; - p_transfer->p_data.ptr += tx_size; - - return (p_transfer->size != 0); -} - -/** - * @brief Integrated feeder from RAM source with ZLP. - * - * @param[out] p_next See @ref nrf_drv_usbd_feeder_t documentation. - * @param[in,out] p_context See @ref nrf_drv_usbd_feeder_t documentation. - * @param[in] ep_size See @ref nrf_drv_usbd_feeder_t documentation. - * - * @retval true Continue transfer. - * @retval false This was the last transfer. - */ -bool nrf_drv_usbd_feeder_ram_zlp( - nrf_drv_usbd_ep_transfer_t * p_next, - void * p_context, - size_t ep_size) -{ - nrf_drv_usbd_transfer_t * p_transfer = p_context; - ASSERT(nrf_drv_is_in_RAM((const void*)(p_transfer->p_data.ptr))); - - size_t tx_size = p_transfer->size; - if (tx_size > ep_size) - { - tx_size = ep_size; - } - - p_next->p_data.tx = (tx_size == 0) ? NULL : p_transfer->p_data.tx; - p_next->size = tx_size; - - p_transfer->size -= tx_size; - p_transfer->p_data.ptr += tx_size; - - return (tx_size != 0); -} - -/** - * @brief Integrated feeder from a flash source. - * - * @param[out] p_next See @ref nrf_drv_usbd_feeder_t documentation. - * @param[in,out] p_context See @ref nrf_drv_usbd_feeder_t documentation. - * @param[in] ep_size See @ref nrf_drv_usbd_feeder_t documentation. - * - * @retval true Continue transfer. - * @retval false This was the last transfer. - */ -bool nrf_drv_usbd_feeder_flash( - nrf_drv_usbd_ep_transfer_t * p_next, - void * p_context, - size_t ep_size) -{ - nrf_drv_usbd_transfer_t * p_transfer = p_context; - ASSERT(!nrf_drv_is_in_RAM((const void*)(p_transfer->p_data.ptr))); - - size_t tx_size = p_transfer->size; - void * p_buffer = nrf_drv_usbd_feeder_buffer_get(); - - if (tx_size > ep_size) - { - tx_size = ep_size; - } - - ASSERT(tx_size <= NRF_DRV_USBD_FEEDER_BUFFER_SIZE); - memcpy(p_buffer, (p_transfer->p_data.tx), tx_size); - - p_next->p_data.tx = p_buffer; - p_next->size = tx_size; - - p_transfer->size -= tx_size; - p_transfer->p_data.ptr += tx_size; - - return (p_transfer->size != 0); -} - -/** - * @brief Integrated feeder from a flash source with ZLP. - * - * @param[out] p_next See @ref nrf_drv_usbd_feeder_t documentation. - * @param[in,out] p_context See @ref nrf_drv_usbd_feeder_t documentation. - * @param[in] ep_size See @ref nrf_drv_usbd_feeder_t documentation. - * - * @retval true Continue transfer. - * @retval false This was the last transfer. - */ -bool nrf_drv_usbd_feeder_flash_zlp( - nrf_drv_usbd_ep_transfer_t * p_next, - void * p_context, - size_t ep_size) -{ - nrf_drv_usbd_transfer_t * p_transfer = p_context; - ASSERT(!nrf_drv_is_in_RAM((const void*)(p_transfer->p_data.ptr))); - - size_t tx_size = p_transfer->size; - void * p_buffer = nrf_drv_usbd_feeder_buffer_get(); - - if (tx_size > ep_size) - { - tx_size = ep_size; - } - - ASSERT(tx_size <= NRF_DRV_USBD_FEEDER_BUFFER_SIZE); - - if (tx_size != 0) - { - memcpy(p_buffer, (p_transfer->p_data.tx), tx_size); - p_next->p_data.tx = p_buffer; - } - else - { - p_next->p_data.tx = NULL; - } - p_next->size = tx_size; - - p_transfer->size -= tx_size; - p_transfer->p_data.ptr += tx_size; - - return (tx_size != 0); -} - -/** @} */ - -/** - * @brief Change Driver endpoint number to HAL endpoint number - * - * @param ep Driver endpoint identifier - * - * @return Endpoint identifier in HAL - * - * @sa nrf_drv_usbd_ep_from_hal - */ -static inline uint8_t ep_to_hal(nrf_drv_usbd_ep_t ep) -{ - USBD_ASSERT_EP_VALID(ep); - return (uint8_t)ep; -} - -/** - * @brief Generate start task number for selected endpoint index - * - * @param ep Endpoint number - * - * @return Task for starting EasyDMA transfer on selected endpoint. - */ -static inline nrf_usbd_task_t task_start_ep(nrf_drv_usbd_ep_t ep) -{ - USBD_ASSERT_EP_VALID(ep); - return (nrf_usbd_task_t)( - (NRF_USBD_EPIN_CHECK(ep) ? NRF_USBD_TASK_STARTEPIN0 : NRF_USBD_TASK_STARTEPOUT0) + - (NRF_USBD_EP_NR_GET(ep) * sizeof(uint32_t))); -} - -/** - * @brief Access selected endpoint state structure - * - * Function used to change or just read the state of selected endpoint. - * It is used for internal transmission state. - * - * @param ep Endpoint number - */ -static inline usbd_drv_ep_state_t* ep_state_access(nrf_drv_usbd_ep_t ep) -{ - USBD_ASSERT_EP_VALID(ep); - return ((NRF_USBD_EPIN_CHECK(ep) ? m_ep_state.ep_in : m_ep_state.ep_out) + - NRF_USBD_EP_NR_GET(ep)); -} - -/** - * @brief Change endpoint number to bit position - * - * Bit positions are defined the same way as they are placed in DATAEPSTATUS register, - * but bits for endpoint 0 are included. - * - * @param ep Endpoint number - * - * @return Bit position related to the given endpoint number - * - * @sa bit2ep - */ -static inline uint8_t ep2bit(nrf_drv_usbd_ep_t ep) -{ - USBD_ASSERT_EP_VALID(ep); - return USBD_EP_BITPOS(ep); -} - -/** - * @brief Change bit position to endpoint number - * - * @param bitpos Bit position - * - * @return Endpoint number corresponding to given bit position. - * - * @sa ep2bit - */ -static inline nrf_drv_usbd_ep_t bit2ep(uint8_t bitpos) -{ - STATIC_ASSERT(USBD_EPOUT_BITPOS_0 > USBD_EPIN_BITPOS_0); - return (nrf_drv_usbd_ep_t)((bitpos >= USBD_EPOUT_BITPOS_0) ? - NRF_USBD_EPOUT(bitpos - USBD_EPOUT_BITPOS_0) : NRF_USBD_EPIN(bitpos)); -} - -/** - * @brief Start selected EasyDMA transmission - * - * This is internal auxiliary function. - * No checking is made if EasyDMA is ready for new transmission. - * - * @param[in] ep Number of endpoint for transmission. - * If it is OUT endpoint transmission would be directed from endpoint to RAM. - * If it is in endpoint transmission would be directed from RAM to endpoint. - */ -static inline void usbd_dma_start(nrf_drv_usbd_ep_t ep) -{ - nrf_usbd_task_trigger(task_start_ep(ep)); -} - -/** - * @brief Abort pending transfer on selected endpoint - * - * @param ep Endpoint number. - * - * @note - * This function locks interrupts that may be costly. - * It is good idea to test if the endpoint is still busy before calling this function: - * @code - (m_ep_dma_waiting & (1U << ep2bit(ep))) - * @endcode - * This function would check it again, but it makes it inside critical section. - */ -static inline void usbd_ep_abort(nrf_drv_usbd_ep_t ep) -{ - CRITICAL_REGION_ENTER(); - - usbd_drv_ep_state_t * p_state = ep_state_access(ep); - - if (NRF_USBD_EPOUT_CHECK(ep)) - { - /* Host -> Device */ - if ((~m_ep_dma_waiting) & (1U << ep2bit(ep))) - { - /* If the bit in m_ep_dma_waiting in cleared - nothing would be - * processed inside transfer processing */ - nrf_drv_usbd_transfer_out_drop(ep); - } - else - { - p_state->handler.consumer = NULL; - m_ep_dma_waiting &= ~(1U << ep2bit(ep)); - m_ep_ready &= ~(1U << ep2bit(ep)); - } - /* Aborted */ - p_state->status = NRF_USBD_EP_ABORTED; - } - else - { - if ((m_ep_dma_waiting | (~m_ep_ready)) & (1U << ep2bit(ep))) - { - /* Device -> Host */ - m_ep_dma_waiting &= ~(1U << ep2bit(ep)); - m_ep_ready |= 1U << ep2bit(ep) ; - - p_state->handler.feeder = NULL; - p_state->status = NRF_USBD_EP_ABORTED; - NRF_DRV_USBD_EP_TRANSFER_EVENT(evt, ep, NRF_USBD_EP_ABORTED); - m_event_handler(&evt); - } - } - CRITICAL_REGION_EXIT(); -} - -void nrf_drv_usbd_ep_abort(nrf_drv_usbd_ep_t ep) -{ - usbd_ep_abort(ep); -} - - -/** - * @brief Abort all pending endpoints - * - * Function aborts all pending endpoint transfers. - */ -static void usbd_ep_abort_all(void) -{ - uint32_t ep_waiting = m_ep_dma_waiting | (m_ep_ready & USBD_EPOUT_BIT_MASK); - while (0 != ep_waiting) - { - uint8_t bitpos = __CLZ(__RBIT(ep_waiting)); - usbd_ep_abort(bit2ep(bitpos)); - ep_waiting &= ~(1U << bitpos); - } - - m_ep_ready = (((1U << NRF_USBD_EPIN_CNT) - 1U) << USBD_EPIN_BITPOS_0); -} - -/** - * @brief Force the USBD interrupt into pending state - * - * This function is used to force USBD interrupt to be processed right now. - * It makes it possible to process all EasyDMA access on one thread priority level. - */ -static inline void usbd_int_rise(void) -{ - NVIC_SetPendingIRQ(USBD_IRQn); -} - -/** - * @name USBD interrupt runtimes - * - * Interrupt runtimes that would be vectorized using @ref m_ivec_isr - * @{ - */ - -static void ev_usbreset_handler(void) -{ - m_bus_suspend = false; - m_last_setup_dir = NRF_DRV_USBD_EPOUT0; - - const nrf_drv_usbd_evt_t evt = { - .type = NRF_DRV_USBD_EVT_RESET - }; - - m_event_handler(&evt); -} - -static void ev_started_handler(void) -{ -#if NRF_DRV_USBD_STARTED_EV_ENABLE - uint32_t epstatus = nrf_usbd_epstatus_get_and_clear(); - - /* All finished endpoint have to be marked as busy */ - // #warning Check this one - // ASSERT(epstatus == ((~m_ep_ready) & epstatus)); - while (epstatus) - { - uint8_t bitpos = __CLZ(__RBIT(epstatus)); - nrf_drv_usbd_ep_t ep = bit2ep(bitpos); - epstatus &= ~(1UL << bitpos); - - UNUSED_VARIABLE(ep); - } -#endif -} - -/** - * @brief Handler for EasyDMA event without endpoint clearing. - * - * This handler would be called when EasyDMA transfer for endpoints that does not require clearing. - * All in endpoints are cleared automatically when new EasyDMA transfer is initialized. - * For endpoint 0 see @ref nrf_usbd_ep0out_dma_handler - * - * @param[in] ep Endpoint number - */ -static inline void nrf_usbd_ep0in_dma_handler(void) -{ - const nrf_drv_usbd_ep_t ep = NRF_DRV_USBD_EPIN0; - NRF_LOG_DEBUG("USB event: DMA ready IN0"); - m_dma_pending = 0; - - usbd_drv_ep_state_t * p_state = ep_state_access(ep); - if (NRF_USBD_EP_ABORTED == p_state->status) - { - /* Clear transfer information just in case */ - UNUSED_RETURN_VALUE(nrf_atomic_u32_and(&m_ep_dma_waiting, ~(1U << ep2bit(ep)))); - } - else if (p_state->handler.feeder == NULL) - { - UNUSED_RETURN_VALUE(nrf_atomic_u32_and(&m_ep_dma_waiting, ~(1U << ep2bit(ep)))); - } - else - { - /* Nothing to do */ - } -} - -/** - * @brief Handler for EasyDMA event without endpoint clearing. - * - * This handler would be called when EasyDMA transfer for endpoints that does not require clearing. - * All in endpoints are cleared automatically when new EasyDMA transfer is initialized. - * For endpoint 0 see @ref nrf_usbd_ep0out_dma_handler - * - * @param[in] ep Endpoint number - */ -static inline void nrf_usbd_epin_dma_handler(nrf_drv_usbd_ep_t ep) -{ - - NRF_LOG_DEBUG("USB event: DMA ready IN: %x", ep); - ASSERT(NRF_USBD_EPIN_CHECK(ep)); - ASSERT(!NRF_USBD_EPISO_CHECK(ep)); - ASSERT(NRF_USBD_EP_NR_GET(ep) > 0); - m_dma_pending = 0; - - usbd_drv_ep_state_t * p_state = ep_state_access(ep); - if (NRF_USBD_EP_ABORTED == p_state->status) - { - /* Clear transfer information just in case */ - UNUSED_RETURN_VALUE(nrf_atomic_u32_and(&m_ep_dma_waiting, ~(1U << ep2bit(ep)))); - } - else if (p_state->handler.feeder == NULL) - { - UNUSED_RETURN_VALUE(nrf_atomic_u32_and(&m_ep_dma_waiting, ~(1U << ep2bit(ep)))); - } - else - { - /* Nothing to do */ - } -} - -/** - * @brief Handler for EasyDMA event from in isochronous endpoint - * - * @todo RK documentation - */ -static inline void nrf_usbd_epiniso_dma_handler(nrf_drv_usbd_ep_t ep) -{ - if (NRF_USBD_ISO_DEBUG) - { - NRF_LOG_DEBUG("USB event: DMA ready ISOIN: %x", ep); - } - ASSERT(NRF_USBD_EPIN_CHECK(ep)); - ASSERT(NRF_USBD_EPISO_CHECK(ep)); - m_dma_pending = 0; - - usbd_drv_ep_state_t * p_state = ep_state_access(ep); - if (NRF_USBD_EP_ABORTED == p_state->status) - { - /* Clear transfer information just in case */ - UNUSED_RETURN_VALUE(nrf_atomic_u32_and(&m_ep_dma_waiting, ~(1U << ep2bit(ep)))); - } - else if (p_state->handler.feeder == NULL) - { - UNUSED_RETURN_VALUE(nrf_atomic_u32_and(&m_ep_dma_waiting, ~(1U << ep2bit(ep)))); - /* Send event to the user - for an ISO IN endpoint, the whole transfer is finished in this moment */ - NRF_DRV_USBD_EP_TRANSFER_EVENT(evt, ep, NRF_USBD_EP_OK); - m_event_handler(&evt); - } - else - { - /* Nothing to do */ - } -} - -/** - * @brief Handler for EasyDMA event for OUT endpoint 0. - * - * EP0 OUT have to be cleared automatically in special way - only in the middle of the transfer. - * It cannot be cleared when required transfer is finished because it means the same that accepting the comment. - */ -static inline void nrf_usbd_ep0out_dma_handler(void) -{ - const nrf_drv_usbd_ep_t ep = NRF_DRV_USBD_EPOUT0; - NRF_LOG_DEBUG("USB event: DMA ready OUT0"); - m_dma_pending = 0; - - usbd_drv_ep_state_t * p_state = ep_state_access(ep); - if (NRF_USBD_EP_ABORTED == p_state->status) - { - /* Clear transfer information just in case */ - UNUSED_RETURN_VALUE(nrf_atomic_u32_and(&m_ep_dma_waiting, ~(1U << ep2bit(ep)))); - } - else if (p_state->handler.consumer == NULL) - { - UNUSED_RETURN_VALUE(nrf_atomic_u32_and(&m_ep_dma_waiting, ~(1U << ep2bit(ep)))); - /* Send event to the user - for an OUT endpoint, the whole transfer is finished in this moment */ - NRF_DRV_USBD_EP_TRANSFER_EVENT(evt, ep, NRF_USBD_EP_OK); - m_event_handler(&evt); - return; - } - else - { - /* Nothing to do */ - } - - nrf_drv_usbd_setup_data_clear(); -} - -/** - * @brief Handler for EasyDMA event from endpoinpoint that requires clearing. - * - * This handler would be called when EasyDMA transfer for OUT endpoint has been finished. - * - * @param[in] ep Endpoint number - * - */ -static inline void nrf_usbd_epout_dma_handler(nrf_drv_usbd_ep_t ep) -{ - NRF_LOG_DEBUG("USB drv: DMA ready OUT: %x", ep); - ASSERT(NRF_USBD_EPOUT_CHECK(ep)); - ASSERT(!NRF_USBD_EPISO_CHECK(ep)); - ASSERT(NRF_USBD_EP_NR_GET(ep) > 0); - m_dma_pending = 0; - - usbd_drv_ep_state_t * p_state = ep_state_access(ep); - if (NRF_USBD_EP_ABORTED == p_state->status) - { - /* Clear transfer information just in case */ - UNUSED_RETURN_VALUE(nrf_atomic_u32_and(&m_ep_dma_waiting, ~(1U << ep2bit(ep)))); - } - else if (p_state->handler.consumer == NULL) - { - UNUSED_RETURN_VALUE(nrf_atomic_u32_and(&m_ep_dma_waiting, ~(1U << ep2bit(ep)))); - /* Send event to the user - for an OUT endpoint, the whole transfer is finished in this moment */ - NRF_DRV_USBD_EP_TRANSFER_EVENT(evt, ep, NRF_USBD_EP_OK); - m_event_handler(&evt); - } - else - { - /* Nothing to do */ - } - -#if NRF_DRV_USBD_EARLY_DMA_PROCESS - /* Speed up */ - usbd_dmareq_process(); -#endif -} - -/** - * @brief Handler for EasyDMA event from out isochronous endpoint - * - * @todo RK documentation - */ - -static inline void nrf_usbd_epoutiso_dma_handler(nrf_drv_usbd_ep_t ep) -{ - if (NRF_USBD_ISO_DEBUG) - { - NRF_LOG_DEBUG("USB drv: DMA ready ISOOUT: %x", ep); - } - ASSERT(NRF_USBD_EPISO_CHECK(ep)); - - m_dma_pending = 0; - - usbd_drv_ep_state_t * p_state = ep_state_access(ep); - if (NRF_USBD_EP_ABORTED == p_state->status) - { - /* Nothing to do - just ignore */ - } - else if (p_state->handler.consumer == NULL) - { - UNUSED_RETURN_VALUE(nrf_atomic_u32_and(&m_ep_dma_waiting, ~(1U << ep2bit(ep)))); - /* Send event to the user - for an OUT endpoint, the whole transfer is finished in this moment */ - NRF_DRV_USBD_EP_TRANSFER_EVENT(evt, ep, NRF_USBD_EP_OK); - m_event_handler(&evt); - } - else - { - /* Nothing to do */ - } -} - - -static void ev_dma_epin0_handler(void) { nrf_usbd_ep0in_dma_handler(); } -static void ev_dma_epin1_handler(void) { nrf_usbd_epin_dma_handler(NRF_DRV_USBD_EPIN1 ); } -static void ev_dma_epin2_handler(void) { nrf_usbd_epin_dma_handler(NRF_DRV_USBD_EPIN2 ); } -static void ev_dma_epin3_handler(void) { nrf_usbd_epin_dma_handler(NRF_DRV_USBD_EPIN3 ); } -static void ev_dma_epin4_handler(void) { nrf_usbd_epin_dma_handler(NRF_DRV_USBD_EPIN4 ); } -static void ev_dma_epin5_handler(void) { nrf_usbd_epin_dma_handler(NRF_DRV_USBD_EPIN5 ); } -static void ev_dma_epin6_handler(void) { nrf_usbd_epin_dma_handler(NRF_DRV_USBD_EPIN6 ); } -static void ev_dma_epin7_handler(void) { nrf_usbd_epin_dma_handler(NRF_DRV_USBD_EPIN7 ); } -static void ev_dma_epin8_handler(void) { nrf_usbd_epiniso_dma_handler(NRF_DRV_USBD_EPIN8 ); } - -static void ev_dma_epout0_handler(void) { nrf_usbd_ep0out_dma_handler(); } -static void ev_dma_epout1_handler(void) { nrf_usbd_epout_dma_handler(NRF_DRV_USBD_EPOUT1); } -static void ev_dma_epout2_handler(void) { nrf_usbd_epout_dma_handler(NRF_DRV_USBD_EPOUT2); } -static void ev_dma_epout3_handler(void) { nrf_usbd_epout_dma_handler(NRF_DRV_USBD_EPOUT3); } -static void ev_dma_epout4_handler(void) { nrf_usbd_epout_dma_handler(NRF_DRV_USBD_EPOUT4); } -static void ev_dma_epout5_handler(void) { nrf_usbd_epout_dma_handler(NRF_DRV_USBD_EPOUT5); } -static void ev_dma_epout6_handler(void) { nrf_usbd_epout_dma_handler(NRF_DRV_USBD_EPOUT6); } -static void ev_dma_epout7_handler(void) { nrf_usbd_epout_dma_handler(NRF_DRV_USBD_EPOUT7); } -static void ev_dma_epout8_handler(void) { nrf_usbd_epoutiso_dma_handler(NRF_DRV_USBD_EPOUT8); } - -static void ev_sof_handler(void) -{ - nrf_drv_usbd_evt_t evt = { - NRF_DRV_USBD_EVT_SOF, - .data = { .sof = { .framecnt = nrf_usbd_framecntr_get() }} - }; - - /* Process isochronous endpoints */ - m_ep_ready |= - (1U << ep2bit(NRF_DRV_USBD_EPIN8 )) | - (1U << ep2bit(NRF_DRV_USBD_EPOUT8)); - - m_event_handler(&evt); -} - -/** - * @brief React on data transfer finished - * - * Auxiliary internal function. - * @param ep Endpoint number - * @param bitpos Bit position for selected endpoint number - */ -static void usbd_ep_data_handler(nrf_drv_usbd_ep_t ep, uint8_t bitpos) -{ - NRF_LOG_DEBUG("USBD event: EndpointData: %x", ep); - /* Mark endpoint ready for next DMA access */ - m_ep_ready |= (1U << bitpos); - - if (NRF_USBD_EPIN_CHECK(ep)) - { - /* IN endpoint (Device -> Host) */ - if (0 == (m_ep_dma_waiting & (1U << bitpos))) - { - NRF_LOG_DEBUG("USBD event: EndpointData: In finished"); - /* No more data to be send - transmission finished */ - NRF_DRV_USBD_EP_TRANSFER_EVENT(evt, ep, NRF_USBD_EP_OK); - m_event_handler(&evt); - } - } - else - { - /* OUT endpoint (Host -> Device) */ - if (0 == (m_ep_dma_waiting & (1U << bitpos))) - { - NRF_LOG_DEBUG("USBD event: EndpointData: Out waiting"); - /* No buffer prepared - send event to the application */ - NRF_DRV_USBD_EP_TRANSFER_EVENT(evt, ep, NRF_USBD_EP_WAITING); - m_event_handler(&evt); - } - } -} - -static void ev_setup_data_handler(void) -{ - usbd_ep_data_handler(m_last_setup_dir, ep2bit(m_last_setup_dir)); -} - -static void ev_setup_handler(void) -{ - nrf_usbd_shorts_disable(NRF_USBD_SHORT_EP0DATADONE_EP0STATUS_MASK); - NRF_LOG_DEBUG("USBD event: Setup (rt:%.2x r:%.2x v:%.4x i:%.4x l:%u )", - nrf_usbd_setup_bmrequesttype_get(), - nrf_usbd_setup_brequest_get(), - nrf_usbd_setup_wvalue_get(), - nrf_usbd_setup_windex_get(), - nrf_usbd_setup_wlength_get()); - uint8_t bmRequestType = nrf_usbd_setup_bmrequesttype_get(); - - - if ((m_ep_dma_waiting | ((~m_ep_ready) & USBD_EPIN_BIT_MASK)) & (1U <handler.feeder) != NULL); - - if (NRF_USBD_EPIN_CHECK(ep)) - { - /* Device -> Host */ - continue_transfer = p_state->handler.feeder( - &transfer, - p_state->p_context, - p_state->max_packet_size); - - if (!continue_transfer) - { - p_state->handler.feeder = NULL; - if (ep == NRF_DRV_USBD_EPIN0) - { - /** Configure short right now - now if the last data is transferred, - * when host tries another data transfer, the endpoint will stall. */ - NRF_LOG_DEBUG("USB DMA process: Enable status short"); - nrf_usbd_shorts_enable(NRF_USBD_SHORT_EP0DATADONE_EP0STATUS_MASK); - } - } - } - else - { - /* Host -> Device */ - const size_t rx_size = nrf_drv_usbd_epout_size_get(ep); - continue_transfer = p_state->handler.consumer( - &transfer, - p_state->p_context, - p_state->max_packet_size, - rx_size); - - if (transfer.p_data.rx == NULL) - { - /* Dropping transfer - allow processing */ - ASSERT(transfer.size == 0); - } - else if (transfer.size < rx_size) - { - NRF_LOG_DEBUG("Endpoint %x overload (r: %u, e: %u)", ep, rx_size, transfer.size); - p_state->status = NRF_USBD_EP_OVERLOAD; - UNUSED_RETURN_VALUE(nrf_atomic_u32_and(&m_ep_dma_waiting, ~(1U << pos))); - NRF_DRV_USBD_EP_TRANSFER_EVENT(evt, ep, NRF_USBD_EP_OVERLOAD); - m_event_handler(&evt); - /* This endpoint will not be transmitted now, repeat the loop */ - continue; - } - else - { - /* Nothing to do - only check integrity if assertions are enabled */ - ASSERT(transfer.size == rx_size); - } - - if (!continue_transfer) - { - p_state->handler.consumer = NULL; - } - } - - m_dma_pending = 1; - m_ep_ready &= ~(1U << pos); - if (NRF_USBD_ISO_DEBUG || (!NRF_USBD_EPISO_CHECK(ep))) - { - NRF_LOG_DEBUG( - "USB DMA process: Starting transfer on EP: %x, size: %u", - ep, - transfer.size); - } - /* Update number of currently transferred bytes */ - p_state->transfer_cnt += transfer.size; - /* Start transfer to the endpoint buffer */ - nrf_usbd_ep_easydma_set(ep, transfer.p_data.ptr, (uint32_t)transfer.size); - - if (nrf_drv_usbd_errata_104()) - { - uint32_t cnt_end = (uint32_t)(-1); - do - { - uint32_t cnt = (uint32_t)(-1); - do - { - nrf_usbd_event_clear(NRF_USBD_EVENT_STARTED); - usbd_dma_start(ep); - nrf_drv_systick_delay_us(2); - ++cnt; - }while (!nrf_usbd_event_check(NRF_USBD_EVENT_STARTED)); - if (cnt) - { - NRF_DRV_USBD_LOG_PROTO1_FIX_PRINTF(" DMA restarted: %u times", cnt); - } - - nrf_drv_systick_delay_us(30); - while (0 == (0x20 & *((volatile uint32_t *)(NRF_USBD_BASE + 0x474)))) - { - nrf_drv_systick_delay_us(2); - } - nrf_drv_systick_delay_us(1); - - ++cnt_end; - } while (!nrf_usbd_event_check(nrf_drv_usbd_ep_to_endevent(ep))); - if (cnt_end) - { - NRF_DRV_USBD_LOG_PROTO1_FIX_PRINTF(" DMA fully restarted: %u times", cnt_end); - } - } - else - { - usbd_dma_start(ep); - } - - if (NRF_USBD_DMAREQ_PROCESS_DEBUG) - { - NRF_LOG_DEBUG("USB DMA process - finishing"); - } - /* Transfer started - exit the loop */ - break; - } - } - else - { - if (NRF_USBD_DMAREQ_PROCESS_DEBUG) - { - NRF_LOG_DEBUG("USB DMA process - EasyDMA busy"); - } - } -} -/** @} */ - -typedef void (*nrf_drv_usbd_isr_t)(void); - -/** - * @brief USBD interrupt service runtimes - * - */ -static const nrf_drv_usbd_isr_t m_isr[] = -{ - [USBD_INTEN_USBRESET_Pos ] = ev_usbreset_handler, - [USBD_INTEN_STARTED_Pos ] = ev_started_handler, - [USBD_INTEN_ENDEPIN0_Pos ] = ev_dma_epin0_handler, - [USBD_INTEN_ENDEPIN1_Pos ] = ev_dma_epin1_handler, - [USBD_INTEN_ENDEPIN2_Pos ] = ev_dma_epin2_handler, - [USBD_INTEN_ENDEPIN3_Pos ] = ev_dma_epin3_handler, - [USBD_INTEN_ENDEPIN4_Pos ] = ev_dma_epin4_handler, - [USBD_INTEN_ENDEPIN5_Pos ] = ev_dma_epin5_handler, - [USBD_INTEN_ENDEPIN6_Pos ] = ev_dma_epin6_handler, - [USBD_INTEN_ENDEPIN7_Pos ] = ev_dma_epin7_handler, - [USBD_INTEN_EP0DATADONE_Pos] = ev_setup_data_handler, - [USBD_INTEN_ENDISOIN_Pos ] = ev_dma_epin8_handler, - [USBD_INTEN_ENDEPOUT0_Pos ] = ev_dma_epout0_handler, - [USBD_INTEN_ENDEPOUT1_Pos ] = ev_dma_epout1_handler, - [USBD_INTEN_ENDEPOUT2_Pos ] = ev_dma_epout2_handler, - [USBD_INTEN_ENDEPOUT3_Pos ] = ev_dma_epout3_handler, - [USBD_INTEN_ENDEPOUT4_Pos ] = ev_dma_epout4_handler, - [USBD_INTEN_ENDEPOUT5_Pos ] = ev_dma_epout5_handler, - [USBD_INTEN_ENDEPOUT6_Pos ] = ev_dma_epout6_handler, - [USBD_INTEN_ENDEPOUT7_Pos ] = ev_dma_epout7_handler, - [USBD_INTEN_ENDISOOUT_Pos ] = ev_dma_epout8_handler, - [USBD_INTEN_SOF_Pos ] = ev_sof_handler, - [USBD_INTEN_USBEVENT_Pos ] = ev_usbevent_handler, - [USBD_INTEN_EP0SETUP_Pos ] = ev_setup_handler, - [USBD_INTEN_EPDATA_Pos ] = ev_epdata_handler, - [USBD_INTEN_ACCESSFAULT_Pos] = ev_accessfault_handler -}; - -/** - * @name Interrupt handlers - * - * @{ - */ -void USBD_IRQHandler(void) -{ - const uint32_t enabled = nrf_usbd_int_enable_get(); - uint32_t to_process = enabled; - uint32_t active = 0; - - /* Check all enabled interrupts */ - while (to_process) - { - uint8_t event_nr = __CLZ(__RBIT(to_process)); - if (nrf_usbd_event_get_and_clear((nrf_usbd_event_t)nrf_drv_bitpos_to_event(event_nr))) - { - active |= 1UL << event_nr; - } - to_process &= ~(1UL << event_nr); - } - - if (nrf_drv_usbd_errata_104()) - { - /* Event correcting */ - if ((0 == m_dma_pending) && (0 != (active & (USBD_INTEN_SOF_Msk)))) - { - uint8_t usbi, uoi, uii; - /* Testing */ - *((volatile uint32_t *)(NRF_USBD_BASE + 0x800)) = 0x7A9; - uii = (uint8_t)(*((volatile uint32_t *)(NRF_USBD_BASE + 0x804))); - if (0 != uii) - { - uii &= (uint8_t)(*((volatile uint32_t *)(NRF_USBD_BASE + 0x804))); - } - - *((volatile uint32_t *)(NRF_USBD_BASE + 0x800)) = 0x7AA; - uoi = (uint8_t)(*((volatile uint32_t *)(NRF_USBD_BASE + 0x804))); - if (0 != uoi) - { - uoi &= (uint8_t)(*((volatile uint32_t *)(NRF_USBD_BASE + 0x804))); - } - *((volatile uint32_t *)(NRF_USBD_BASE + 0x800)) = 0x7AB; - usbi = (uint8_t)(*((volatile uint32_t *)(NRF_USBD_BASE + 0x804))); - if (0 != usbi) - { - usbi &= (uint8_t)(*((volatile uint32_t *)(NRF_USBD_BASE + 0x804))); - } - /* Processing */ - *((volatile uint32_t *)(NRF_USBD_BASE + 0x800)) = 0x7AC; - uii &= (uint8_t)*((volatile uint32_t *)(NRF_USBD_BASE + 0x804)); - if (0 != uii) - { - uint8_t rb; - m_simulated_dataepstatus |= ((uint32_t)uii) << USBD_EPIN_BITPOS_0; - *((volatile uint32_t *)(NRF_USBD_BASE + 0x800)) = 0x7A9; - *((volatile uint32_t *)(NRF_USBD_BASE + 0x804)) = uii; - rb = (uint8_t)*((volatile uint32_t *)(NRF_USBD_BASE + 0x804)); - NRF_DRV_USBD_LOG_PROTO1_FIX_PRINTF(" uii: 0x%.2x (0x%.2x)", uii, rb); - } - - *((volatile uint32_t *)(NRF_USBD_BASE + 0x800)) = 0x7AD; - uoi &= (uint8_t)*((volatile uint32_t *)(NRF_USBD_BASE + 0x804)); - if (0 != uoi) - { - uint8_t rb; - m_simulated_dataepstatus |= ((uint32_t)uoi) << USBD_EPOUT_BITPOS_0; - *((volatile uint32_t *)(NRF_USBD_BASE + 0x800)) = 0x7AA; - *((volatile uint32_t *)(NRF_USBD_BASE + 0x804)) = uoi; - rb = (uint8_t)*((volatile uint32_t *)(NRF_USBD_BASE + 0x804)); - NRF_DRV_USBD_LOG_PROTO1_FIX_PRINTF(" uoi: 0x%.2u (0x%.2x)", uoi, rb); - } - - *((volatile uint32_t *)(NRF_USBD_BASE + 0x800)) = 0x7AE; - usbi &= (uint8_t)*((volatile uint32_t *)(NRF_USBD_BASE + 0x804)); - if (0 != usbi) - { - uint8_t rb; - if (usbi & 0x01) - { - active |= USBD_INTEN_EP0SETUP_Msk; - } - if (usbi & 0x10) - { - active |= USBD_INTEN_USBRESET_Msk; - } - *((volatile uint32_t *)(NRF_USBD_BASE + 0x800)) = 0x7AB; - *((volatile uint32_t *)(NRF_USBD_BASE + 0x804)) = usbi; - rb = (uint8_t)*((volatile uint32_t *)(NRF_USBD_BASE + 0x804)); - NRF_DRV_USBD_LOG_PROTO1_FIX_PRINTF(" usbi: 0x%.2u (0x%.2x)", usbi, rb); - } - - if (0 != (m_simulated_dataepstatus & - ~((1U << USBD_EPOUT_BITPOS_0) | (1U << USBD_EPIN_BITPOS_0)))) - { - active |= enabled & NRF_USBD_INT_DATAEP_MASK; - } - if (0 != (m_simulated_dataepstatus & - ((1U << USBD_EPOUT_BITPOS_0) | (1U << USBD_EPIN_BITPOS_0)))) - { - if (0 != (enabled & NRF_USBD_INT_EP0DATADONE_MASK)) - { - m_simulated_dataepstatus &= - ~((1U << USBD_EPOUT_BITPOS_0) | (1U << USBD_EPIN_BITPOS_0)); - active |= NRF_USBD_INT_EP0DATADONE_MASK; - } - } - } - } - - /* Process the active interrupts */ - bool setup_active = 0 != (active & NRF_USBD_INT_EP0SETUP_MASK); - active &= ~NRF_USBD_INT_EP0SETUP_MASK; - - while (active) - { - uint8_t event_nr = __CLZ(__RBIT(active)); - m_isr[event_nr](); - active &= ~(1UL << event_nr); - } - usbd_dmareq_process(); - - if (setup_active) - { - m_isr[USBD_INTEN_EP0SETUP_Pos](); - } -} - -/** @} */ -/** @} */ - -ret_code_t nrf_drv_usbd_init(nrf_drv_usbd_event_handler_t const event_handler) -{ - if (nrf_drv_usbd_errata_104()) - { - nrf_drv_systick_init(); - } - if (NULL == event_handler) - { - return NRF_ERROR_INVALID_PARAM; - } - if ( m_drv_state != NRF_DRV_STATE_UNINITIALIZED) - { - return NRF_ERROR_INVALID_STATE; - } - - m_event_handler = event_handler; - m_drv_state = NRF_DRV_STATE_INITIALIZED; - - uint8_t n; - for (n=0; nstatus = NRF_USBD_EP_OK; - p_state->handler.feeder = NULL; - p_state->transfer_cnt = 0; - } - for (n=0; nstatus = NRF_USBD_EP_OK; - p_state->handler.consumer = NULL; - p_state->transfer_cnt = 0; - } - - return NRF_SUCCESS; -} - -ret_code_t nrf_drv_usbd_uninit(void) -{ - if (m_drv_state != NRF_DRV_STATE_INITIALIZED) - { - return NRF_ERROR_INVALID_STATE; - } - - m_event_handler = NULL; - m_drv_state = NRF_DRV_STATE_UNINITIALIZED; - return NRF_SUCCESS; -} - -void nrf_drv_usbd_enable(void) -{ - ASSERT(m_drv_state == NRF_DRV_STATE_INITIALIZED); - - /* Prepare for READY event receiving */ - nrf_usbd_eventcause_clear(NRF_USBD_EVENTCAUSE_READY_MASK); - /* Enable the peripheral */ - nrf_usbd_enable(); - /* Waiting for peripheral to enable, this should take a few us */ - while (0 == (NRF_USBD_EVENTCAUSE_READY_MASK & nrf_usbd_eventcause_get())) - { - /* Empty loop */ - } - nrf_usbd_eventcause_clear(NRF_USBD_EVENTCAUSE_READY_MASK); - - if (nrf_drv_usbd_errata_166()) - { - *((volatile uint32_t *)(NRF_USBD_BASE + 0x800)) = 0x7E3; - *((volatile uint32_t *)(NRF_USBD_BASE + 0x804)) = 0x40; - __ISB(); - __DSB(); - } - - nrf_usbd_isosplit_set(NRF_USBD_ISOSPLIT_Half); - - m_ep_ready = (((1U << NRF_USBD_EPIN_CNT) - 1U) << USBD_EPIN_BITPOS_0); - m_ep_dma_waiting = 0; - m_dma_pending = 0; - m_last_setup_dir = NRF_DRV_USBD_EPOUT0; - - m_drv_state = NRF_DRV_STATE_POWERED_ON; -} - -void nrf_drv_usbd_disable(void) -{ - ASSERT(m_drv_state != NRF_DRV_STATE_UNINITIALIZED); - - /* Stop just in case */ - nrf_drv_usbd_stop(); - - /* Disable all parts */ - nrf_usbd_int_disable(nrf_usbd_int_enable_get()); - nrf_usbd_disable(); - m_dma_pending = 0; - m_drv_state = NRF_DRV_STATE_INITIALIZED; -} - -void nrf_drv_usbd_start(bool enable_sof) -{ - ASSERT(m_drv_state == NRF_DRV_STATE_POWERED_ON); - m_bus_suspend = false; - - uint32_t ints_to_enable = - NRF_USBD_INT_USBRESET_MASK | - NRF_USBD_INT_STARTED_MASK | - NRF_USBD_INT_ENDEPIN0_MASK | - NRF_USBD_INT_EP0DATADONE_MASK | - NRF_USBD_INT_ENDEPOUT0_MASK | - NRF_USBD_INT_USBEVENT_MASK | - NRF_USBD_INT_EP0SETUP_MASK | - NRF_USBD_INT_DATAEP_MASK | - NRF_USBD_INT_ACCESSFAULT_MASK; - - if (enable_sof || nrf_drv_usbd_errata_104()) - { - ints_to_enable |= NRF_USBD_INT_SOF_MASK; - } - - /* Enable all required interrupts */ - nrf_usbd_int_enable(ints_to_enable); - - /* Enable interrupt globally */ - nrf_drv_common_irq_enable(USBD_IRQn, USBD_CONFIG_IRQ_PRIORITY); - - /* Enable pullups */ - nrf_usbd_pullup_enable(); -} - -void nrf_drv_usbd_stop(void) -{ - ASSERT(m_drv_state == NRF_DRV_STATE_POWERED_ON); - - if (nrf_drv_common_irq_enable_check(USBD_IRQn)) - { - /* Abort transfers */ - usbd_ep_abort_all(); - - /* Disable pullups */ - nrf_usbd_pullup_disable(); - - /* Disable interrupt globally */ - nrf_drv_common_irq_disable(USBD_IRQn); - - /* Disable all interrupts */ - nrf_usbd_int_disable(~0U); - } -} - -bool nrf_drv_usbd_is_initialized(void) -{ - return (m_drv_state >= NRF_DRV_STATE_INITIALIZED); -} - -bool nrf_drv_usbd_is_enabled(void) -{ - return (m_drv_state >= NRF_DRV_STATE_POWERED_ON); -} - -bool nrf_drv_usbd_is_started(void) -{ - return (nrf_drv_usbd_is_enabled() && nrf_drv_common_irq_enable_check(USBD_IRQn)); -} - -bool nrf_drv_usbd_suspend(void) -{ - bool suspended = false; - - CRITICAL_REGION_ENTER(); - if (m_bus_suspend) - { - usbd_ep_abort_all(); - - if (!(nrf_usbd_eventcause_get() & NRF_USBD_EVENTCAUSE_RESUME_MASK)) - { - nrf_usbd_lowpower_enable(); - if (nrf_usbd_eventcause_get() & NRF_USBD_EVENTCAUSE_RESUME_MASK) - { - nrf_usbd_lowpower_disable(); - } - else - { - suspended = true; - } - } - } - CRITICAL_REGION_EXIT(); - - return suspended; -} - -bool nrf_drv_usbd_wakeup_req(void) -{ - bool started = false; - - CRITICAL_REGION_ENTER(); - if (m_bus_suspend && nrf_usbd_lowpower_check()) - { - nrf_usbd_lowpower_disable(); - started = true; - } - CRITICAL_REGION_EXIT(); - - return started; -} - -bool nrf_drv_usbd_suspend_check(void) -{ - return nrf_usbd_lowpower_check(); -} - -void nrf_drv_usbd_suspend_irq_config(void) -{ - nrf_usbd_int_disable(m_irq_disabled_in_suspend); -} - -void nrf_drv_usbd_active_irq_config(void) -{ - nrf_usbd_int_enable(m_irq_disabled_in_suspend); -} - -bool nrf_drv_usbd_bus_suspend_check(void) -{ - return m_bus_suspend; -} - -void nrf_drv_usbd_ep_max_packet_size_set(nrf_drv_usbd_ep_t ep, uint16_t size) -{ - /* Only power of 2 size allowed */ - ASSERT((size != 0) && (size & (size - 1)) == 0); - /* Packet size cannot be higher than maximum buffer size */ - ASSERT( ( NRF_USBD_EPISO_CHECK(ep) && (size <= usbd_ep_iso_capacity(ep))) - || - ((!NRF_USBD_EPISO_CHECK(ep)) && (size <= NRF_DRV_USBD_EPSIZE))); - - usbd_drv_ep_state_t * p_state = ep_state_access(ep); - p_state->max_packet_size = size; -} - -uint16_t nrf_drv_usbd_ep_max_packet_size_get(nrf_drv_usbd_ep_t ep) -{ - usbd_drv_ep_state_t const * p_state = ep_state_access(ep); - return p_state->max_packet_size; -} - -bool nrf_drv_usbd_ep_enable_check(nrf_drv_usbd_ep_t ep) -{ - return nrf_usbd_ep_enable_check(ep_to_hal(ep)); -} - -void nrf_drv_usbd_ep_enable(nrf_drv_usbd_ep_t ep) -{ - nrf_usbd_int_enable(nrf_drv_usbd_ep_to_int(ep)); - - if(nrf_usbd_ep_enable_check(ep)) - { - return; - } - nrf_usbd_ep_enable(ep_to_hal(ep)); - if ((NRF_USBD_EP_NR_GET(ep) != 0) && NRF_USBD_EPOUT_CHECK(ep) && (!NRF_USBD_EPISO_CHECK(ep))) - { - CRITICAL_REGION_ENTER(); - nrf_drv_usbd_transfer_out_drop(ep); - m_ep_dma_waiting &= ~(1U << ep2bit(ep)); - CRITICAL_REGION_EXIT(); - } -} - -void nrf_drv_usbd_ep_disable(nrf_drv_usbd_ep_t ep) -{ - usbd_ep_abort(ep); - nrf_usbd_ep_disable(ep_to_hal(ep)); - nrf_usbd_int_disable(nrf_drv_usbd_ep_to_int(ep)); -} - -void nrf_drv_usbd_ep_default_config(void) -{ - nrf_usbd_int_disable( - NRF_USBD_INT_ENDEPIN1_MASK | - NRF_USBD_INT_ENDEPIN2_MASK | - NRF_USBD_INT_ENDEPIN3_MASK | - NRF_USBD_INT_ENDEPIN4_MASK | - NRF_USBD_INT_ENDEPIN5_MASK | - NRF_USBD_INT_ENDEPIN6_MASK | - NRF_USBD_INT_ENDEPIN7_MASK | - NRF_USBD_INT_ENDISOIN0_MASK | - NRF_USBD_INT_ENDEPOUT1_MASK | - NRF_USBD_INT_ENDEPOUT2_MASK | - NRF_USBD_INT_ENDEPOUT3_MASK | - NRF_USBD_INT_ENDEPOUT4_MASK | - NRF_USBD_INT_ENDEPOUT5_MASK | - NRF_USBD_INT_ENDEPOUT6_MASK | - NRF_USBD_INT_ENDEPOUT7_MASK | - NRF_USBD_INT_ENDISOOUT0_MASK - ); - nrf_usbd_int_enable(NRF_USBD_INT_ENDEPIN0_MASK | NRF_USBD_INT_ENDEPOUT0_MASK); - nrf_usbd_ep_all_disable(); -} - -ret_code_t nrf_drv_usbd_ep_transfer( - nrf_drv_usbd_ep_t ep, - nrf_drv_usbd_transfer_t const * const p_transfer) -{ - ret_code_t ret; - const uint8_t ep_bitpos = ep2bit(ep); - ASSERT(NULL != p_transfer); - - CRITICAL_REGION_ENTER(); - /* Setup data transaction can go only in one direction at a time */ - if ((NRF_USBD_EP_NR_GET(ep) == 0) && (ep != m_last_setup_dir)) - { - ret = NRF_ERROR_INVALID_ADDR; - if (NRF_USBD_FAILED_TRANSFERS_DEBUG && (NRF_USBD_ISO_DEBUG || (!NRF_USBD_EPISO_CHECK(ep)))) - { - NRF_LOG_DEBUG("USB driver: Transfer failed: Invalid EPr\n"); - } - } - else if ((m_ep_dma_waiting | ((~m_ep_ready) & USBD_EPIN_BIT_MASK)) & (1U << ep_bitpos)) - { - /* IN (Device -> Host) transfer has to be transmitted out to allow new transmission */ - ret = NRF_ERROR_BUSY; - if (NRF_USBD_FAILED_TRANSFERS_DEBUG) - { - NRF_LOG_DEBUG("USB driver: Transfer failed: EP is busy"); - } - } - else - { - usbd_drv_ep_state_t * p_state = ep_state_access(ep); - /* Prepare transfer context and handler description */ - nrf_drv_usbd_transfer_t * p_context; - if (NRF_USBD_EPIN_CHECK(ep)) - { - p_context = m_ep_feeder_state + NRF_USBD_EP_NR_GET(ep); - if (nrf_drv_is_in_RAM(p_transfer->p_data.tx)) - { - /* RAM */ - if (0 == (p_transfer->flags & NRF_DRV_USBD_TRANSFER_ZLP_FLAG)) - { - p_state->handler.feeder = nrf_drv_usbd_feeder_ram; - if (NRF_USBD_ISO_DEBUG || (!NRF_USBD_EPISO_CHECK(ep))) - { - NRF_LOG_DEBUG( - "USB driver: Transfer called on endpoint %x, size: %u, mode: " - "RAM", - ep, - p_transfer->size); - } - } - else - { - p_state->handler.feeder = nrf_drv_usbd_feeder_ram_zlp; - if (NRF_USBD_ISO_DEBUG || (!NRF_USBD_EPISO_CHECK(ep))) - { - NRF_LOG_DEBUG( - "USB driver: Transfer called on endpoint %x, size: %u, mode: " - "RAM_ZLP", - ep, - p_transfer->size); - } - } - } - else - { - /* Flash */ - if (0 == (p_transfer->flags & NRF_DRV_USBD_TRANSFER_ZLP_FLAG)) - { - p_state->handler.feeder = nrf_drv_usbd_feeder_flash; - if (NRF_USBD_ISO_DEBUG || (!NRF_USBD_EPISO_CHECK(ep))) - { - NRF_LOG_DEBUG( - "USB driver: Transfer called on endpoint %x, size: %u, mode: " - "FLASH", - ep, - p_transfer->size); - } - } - else - { - p_state->handler.feeder = nrf_drv_usbd_feeder_flash_zlp; - if (NRF_USBD_ISO_DEBUG || (!NRF_USBD_EPISO_CHECK(ep))) - { - NRF_LOG_DEBUG( - "USB driver: Transfer called on endpoint %x, size: %u, mode: " - "FLASH_ZLP", - ep, - p_transfer->size); - } - } - } - } - else - { - p_context = m_ep_consumer_state + NRF_USBD_EP_NR_GET(ep); - ASSERT((p_transfer->p_data.rx == NULL) || (nrf_drv_is_in_RAM(p_transfer->p_data.rx))); - p_state->handler.consumer = nrf_drv_usbd_consumer; - } - *p_context = *p_transfer; - p_state->p_context = p_context; - - p_state->transfer_cnt = 0; - p_state->status = NRF_USBD_EP_OK; - m_ep_dma_waiting |= 1U << ep_bitpos; - ret = NRF_SUCCESS; - usbd_int_rise(); - } - CRITICAL_REGION_EXIT(); - return ret; -} - -ret_code_t nrf_drv_usbd_ep_handled_transfer( - nrf_drv_usbd_ep_t ep, - nrf_drv_usbd_handler_desc_t const * const p_handler) -{ - ret_code_t ret; - const uint8_t ep_bitpos = ep2bit(ep); - ASSERT(NULL != p_handler); - - CRITICAL_REGION_ENTER(); - /* Setup data transaction can go only in one direction at a time */ - if ((NRF_USBD_EP_NR_GET(ep) == 0) && (ep != m_last_setup_dir)) - { - ret = NRF_ERROR_INVALID_ADDR; - if (NRF_USBD_FAILED_TRANSFERS_DEBUG && (NRF_USBD_ISO_DEBUG || (!NRF_USBD_EPISO_CHECK(ep)))) - { - NRF_LOG_DEBUG("USB driver: Transfer failed: Invalid EP"); - } - } - else if ((m_ep_dma_waiting | ((~m_ep_ready) & USBD_EPIN_BIT_MASK)) & (1U << ep_bitpos)) - { - /* IN (Device -> Host) transfer has to be transmitted out to allow a new transmission */ - ret = NRF_ERROR_BUSY; - if (NRF_USBD_FAILED_TRANSFERS_DEBUG && (NRF_USBD_ISO_DEBUG || (!NRF_USBD_EPISO_CHECK(ep)))) - { - NRF_LOG_DEBUG("USB driver: Transfer failed: EP is busy");\ - } - } - else - { - /* Transfer can be configured now */ - usbd_drv_ep_state_t * p_state = ep_state_access(ep); - - p_state->transfer_cnt = 0; - p_state->handler = p_handler->handler; - p_state->p_context = p_handler->p_context; - p_state->status = NRF_USBD_EP_OK; - m_ep_dma_waiting |= 1U << ep_bitpos; - - ret = NRF_SUCCESS; - if (NRF_USBD_ISO_DEBUG || (!NRF_USBD_EPISO_CHECK(ep))) - { - NRF_LOG_DEBUG("USB driver: Transfer called on endpoint %x, mode: Handler", ep); - } - usbd_int_rise(); - } - CRITICAL_REGION_EXIT(); - return ret; -} - -void * nrf_drv_usbd_feeder_buffer_get(void) -{ - return m_tx_buffer; -} - -ret_code_t nrf_drv_usbd_ep_status_get(nrf_drv_usbd_ep_t ep, size_t * p_size) -{ - ret_code_t ret; - - usbd_drv_ep_state_t const * p_state = ep_state_access(ep); - CRITICAL_REGION_ENTER(); - *p_size = p_state->transfer_cnt; - ret = (p_state->handler.consumer == NULL) ? p_state->status : NRF_ERROR_BUSY; - CRITICAL_REGION_EXIT(); - return ret; -} - -size_t nrf_drv_usbd_epout_size_get(nrf_drv_usbd_ep_t ep) -{ - return nrf_usbd_epout_size_get(ep_to_hal(ep)); -} - -bool nrf_drv_usbd_ep_is_busy(nrf_drv_usbd_ep_t ep) -{ - return (0 != (m_ep_dma_waiting & (1UL << ep2bit(ep)))); -} - -void nrf_drv_usbd_ep_stall(nrf_drv_usbd_ep_t ep) -{ - NRF_LOG_DEBUG("USB: EP %x stalled.", ep); - nrf_usbd_ep_stall(ep_to_hal(ep)); -} - -void nrf_drv_usbd_ep_stall_clear(nrf_drv_usbd_ep_t ep) -{ - nrf_usbd_ep_unstall(ep_to_hal(ep)); -} - -bool nrf_drv_usbd_ep_stall_check(nrf_drv_usbd_ep_t ep) -{ - return nrf_usbd_ep_is_stall(ep_to_hal(ep)); -} - -void nrf_drv_usbd_ep_dtoggle_clear(nrf_drv_usbd_ep_t ep) -{ - nrf_usbd_dtoggle_set(ep, NRF_USBD_DTOGGLE_DATA0); -} - -void nrf_drv_usbd_setup_get(nrf_drv_usbd_setup_t * const p_setup) -{ - memset(p_setup, 0, sizeof(nrf_drv_usbd_setup_t)); - p_setup->bmRequestType = nrf_usbd_setup_bmrequesttype_get(); - p_setup->bmRequest = nrf_usbd_setup_brequest_get(); - p_setup->wValue = nrf_usbd_setup_wvalue_get(); - p_setup->wIndex = nrf_usbd_setup_windex_get(); - p_setup->wLength = nrf_usbd_setup_wlength_get(); -} - -void nrf_drv_usbd_setup_data_clear(void) -{ - if (nrf_drv_usbd_errata_104()) - { - /* For this fix to work properly, it must be ensured that the task is - * executed twice one after another - blocking ISR. This is however a temporary - * solution to be used only before production version of the chip. */ - uint32_t primask_copy = __get_PRIMASK(); - __disable_irq(); - nrf_usbd_task_trigger(NRF_USBD_TASK_EP0RCVOUT); - nrf_usbd_task_trigger(NRF_USBD_TASK_EP0RCVOUT); - __set_PRIMASK(primask_copy); - } - else - { - nrf_usbd_task_trigger(NRF_USBD_TASK_EP0RCVOUT); - } -} - -void nrf_drv_usbd_setup_clear(void) -{ - nrf_usbd_task_trigger(NRF_USBD_TASK_EP0STATUS); -} - -void nrf_drv_usbd_setup_stall(void) -{ - NRF_LOG_DEBUG("Setup stalled."); - nrf_usbd_task_trigger(NRF_USBD_TASK_EP0STALL); -} - -nrf_drv_usbd_ep_t nrf_drv_usbd_last_setup_dir_get(void) -{ - return m_last_setup_dir; -} - -void nrf_drv_usbd_transfer_out_drop(nrf_drv_usbd_ep_t ep) -{ - ASSERT(NRF_USBD_EPOUT_CHECK(ep)); - - if (nrf_drv_usbd_errata_sizeepout_rw()) - { - CRITICAL_REGION_ENTER(); - m_ep_ready &= ~(1U << ep2bit(ep)); - *((volatile uint32_t *)(NRF_USBD_BASE + 0x800)) = 0x7C5 + (2u * NRF_USBD_EP_NR_GET(ep)); - *((volatile uint32_t *)(NRF_USBD_BASE + 0x804)) = 0; - UNUSED_VARIABLE(((volatile uint32_t *)(NRF_USBD_BASE + 0x804))); - CRITICAL_REGION_EXIT(); - } - else - { - CRITICAL_REGION_ENTER(); - m_ep_ready &= ~(1U << ep2bit(ep)); - nrf_usbd_epout_clear(ep); - CRITICAL_REGION_EXIT(); - } -} - -#endif // USBD_ENABLED diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/usbd/nrf_drv_usbd.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/usbd/nrf_drv_usbd.h deleted file mode 100644 index 25d7b34253..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/usbd/nrf_drv_usbd.h +++ /dev/null @@ -1,947 +0,0 @@ -/** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifndef NRF_DRV_USBD_H__ -#define NRF_DRV_USBD_H__ - -#include "nrf_drv_common.h" -#include "sdk_errors.h" -#include "nrf_usbd.h" -#include -#include -#include "app_util.h" -#include "nrf_drv_usbd_errata.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup nrf_drv_usbd USB Device HAL and driver - * @ingroup nrf_drivers - * @brief @tagAPI52840 USB Device APIs. - * @details The USB Device HAL provides basic APIs for accessing - * the registers of the USBD. - * The USB Device driver provides APIs on a higher level. - * - * @{ - */ - -/** - * @name Possible schemes of DMA scheduling - * - * Definition of available configuration constants used by DMA scheduler - * @{ - */ - /** - * @brief Highly prioritized access - * - * Endpoint with lower number has always higher priority and its data would - * be transfered first. - * OUT endpoints ale processed before IN endpoints - */ - #define NRF_DRV_USBD_DMASCHEDULER_PRIORITIZED 0 - - /** - * @brief Round robin scheme - * - * All endpoints are processed in round-robin scheme. - * It means that when one endpoint is processed next in order would be - * the nearest with lower number. - * When no endpoints with lower number requires processing - then - * all endpoints from 0 are tested. - */ - #define NRF_DRV_USBD_DMASCHEDULER_ROUNDROBIN 1 - -/** @} */ - -/** - * @brief Number of bytes in the endpoint - * - * Constant that informs about endpoint size - */ -#define NRF_DRV_USBD_EPSIZE 64 - -/** - * @brief Number of bytes for isochronous endpoints - * - * Number of bytes for isochronous endpoints in total. - * This number would be shared between IN and OUT endpoint. - * It may be also assigned totaly to one endpoint. - * @sa nrf_usbd_isosplit_set - * @sa nrf_usbd_isosplit_get - */ -#define NRF_DRV_USBD_ISOSIZE 1024 - -/** - * @brief The size of internal feeder buffer. - * - * @sa nrf_drv_usbd_feeder_buffer_get - */ -#define NRF_DRV_USBD_FEEDER_BUFFER_SIZE NRF_DRV_USBD_EPSIZE - -/** - * @name Macros for creating endpoint identifiers - * - * Auxiliary macros to be used to create Endpoint identifier that is compatible - * with USB specification. - * @{ - */ - - /** - * @brief Create identifier for IN endpoint - * - * Simple macro to create IN endpoint identifier for given endpoint number. - * - * @param[in] n Endpoint number. - * - * @return Endpoint identifier that connects endpoint number and endpoint direction. - */ - #define NRF_DRV_USBD_EPIN(n) ((nrf_drv_usbd_ep_t)NRF_USBD_EPIN(n)) - /** - * @brief Create identifier for OUT endpoint - * - * Simple macro to create OUT endpoint identifier for given endpoint number. - * - * @param[in] n Endpoint number. - * - * @return Endpoint identifier that connects endpoint number and endpoint direction. - */ - #define NRF_DRV_USBD_EPOUT(n) ((nrf_drv_usbd_ep_t)NRF_USBD_EPOUT(n)) - -/** @} */ - -/** - * @brief Endpoint identifier - * - * Endpoint identifier used in the driver. - * This endpoint number is consistent with USB 2.0 specification. - */ -typedef enum -{ - NRF_DRV_USBD_EPOUT0 = NRF_USBD_EPOUT(0), /**< Endpoint OUT 0 */ - NRF_DRV_USBD_EPOUT1 = NRF_USBD_EPOUT(1), /**< Endpoint OUT 1 */ - NRF_DRV_USBD_EPOUT2 = NRF_USBD_EPOUT(2), /**< Endpoint OUT 2 */ - NRF_DRV_USBD_EPOUT3 = NRF_USBD_EPOUT(3), /**< Endpoint OUT 3 */ - NRF_DRV_USBD_EPOUT4 = NRF_USBD_EPOUT(4), /**< Endpoint OUT 4 */ - NRF_DRV_USBD_EPOUT5 = NRF_USBD_EPOUT(5), /**< Endpoint OUT 5 */ - NRF_DRV_USBD_EPOUT6 = NRF_USBD_EPOUT(6), /**< Endpoint OUT 6 */ - NRF_DRV_USBD_EPOUT7 = NRF_USBD_EPOUT(7), /**< Endpoint OUT 7 */ - NRF_DRV_USBD_EPOUT8 = NRF_USBD_EPOUT(8), /**< Endpoint OUT 8 */ - - NRF_DRV_USBD_EPIN0 = NRF_USBD_EPIN(0), /**< Endpoint IN 0 */ - NRF_DRV_USBD_EPIN1 = NRF_USBD_EPIN(1), /**< Endpoint IN 1 */ - NRF_DRV_USBD_EPIN2 = NRF_USBD_EPIN(2), /**< Endpoint IN 2 */ - NRF_DRV_USBD_EPIN3 = NRF_USBD_EPIN(3), /**< Endpoint IN 3 */ - NRF_DRV_USBD_EPIN4 = NRF_USBD_EPIN(4), /**< Endpoint IN 4 */ - NRF_DRV_USBD_EPIN5 = NRF_USBD_EPIN(5), /**< Endpoint IN 5 */ - NRF_DRV_USBD_EPIN6 = NRF_USBD_EPIN(6), /**< Endpoint IN 6 */ - NRF_DRV_USBD_EPIN7 = NRF_USBD_EPIN(7), /**< Endpoint IN 7 */ - NRF_DRV_USBD_EPIN8 = NRF_USBD_EPIN(8), /**< Endpoint IN 8 */ -}nrf_drv_usbd_ep_t; - -/** - * @brief Events generated by the library - * - * Enumeration of possible events that may be generated by the library. - */ -typedef enum -{ - NRF_DRV_USBD_EVT_SOF, /**< Start Of Frame event on USB bus detected */ - NRF_DRV_USBD_EVT_RESET, /**< Reset condition on USB bus detected */ - NRF_DRV_USBD_EVT_SUSPEND, /**< This device should go to suspend mode now */ - NRF_DRV_USBD_EVT_RESUME, /**< This device should resume from suspend now */ - NRF_DRV_USBD_EVT_WUREQ, /**< Wakeup request - the USBD peripheral is ready to generate WAKEUP signal after exiting low power mode. */ - NRF_DRV_USBD_EVT_SETUP, /**< Setup frame received and decoded */ - NRF_DRV_USBD_EVT_EPTRANSFER, /**< - * For Rx (OUT: Host->Device): - * 1. The packet has been received but there is no buffer prepared for transfer already. - * 2. Whole transfer has been finished - * - * For Tx (IN: Device->Host): - * The last packet from requested transfer has been transfered over USB bus and acknowledged - */ - NRF_DRV_USBD_EVT_CNT /**< Number of defined events */ -}nrf_drv_usbd_event_type_t; - -/** - * @brief Possible endpoint error codes - * - * Error codes that may be returned with @ref NRF_DRV_USBD_EVT_EPTRANSFER - */ -typedef enum -{ - NRF_USBD_EP_OK, /**< No error */ - NRF_USBD_EP_WAITING, /**< Data received, no buffer prepared already - waiting for configured transfer */ - NRF_USBD_EP_OVERLOAD, /**< Received number of bytes cannot fit given buffer - * This error would also be returned when next_transfer function has been defined - * but currently received data cannot fit completely in current buffer. - * No data split from single endpoint transmission is supported. - * - * When this error is reported - data is left inside endpoint buffer. - * Clear endpoint or prepare new buffer and read it. - */ - NRF_USBD_EP_ABORTED, /**< EP0 transfer can be aborted when new setup comes. - * Any other transfer can be aborted by USB reset or library stopping. - */ -}nrf_drv_usbd_ep_status_t; - - -/** - * @brief Event structure - * - * Structure passed to event handler - */ -typedef struct -{ - nrf_drv_usbd_event_type_t type; - union - { - struct{ - uint16_t framecnt; //!< Current value of frame counter - }sof; //!< Data aviable for @ref NRF_DRV_USBD_EVT_SOF - struct{ - nrf_drv_usbd_ep_t ep; //!< Endpoint number - }isocrc; - struct{ - nrf_drv_usbd_ep_t ep; //!< Endpoint number - nrf_drv_usbd_ep_status_t status; //!< Status for the endpoint - }eptransfer; - }data; -}nrf_drv_usbd_evt_t; - -/** - * @brief USBD event callback function type. - * - * @param[in] p_event Event information structure. - */ -typedef void (*nrf_drv_usbd_event_handler_t)(nrf_drv_usbd_evt_t const * const p_event); - -/** - * @brief Universal data pointer. - * - * Universal data pointer that can be used for any type of transfer. - */ -typedef union -{ - void const * tx; //!< Constant TX buffer pointer. - void * rx; //!< Writable RX buffer pointer. - uint32_t ptr; //!< Numeric value used internally by the library. -}nrf_drv_usbd_data_ptr_t; - -/** - * @brief Structure to be filled with information about the next transfer. - * - * This is used mainly for transfer feeders and consumers. - * It describes a single endpoint transfer and therefore the size of the buffer - * can never be higher than the endpoint size. - */ -typedef struct -{ - nrf_drv_usbd_data_ptr_t p_data; //!< Union with available data pointers used by the library. - size_t size; //!< Size of the requested transfer. -}nrf_drv_usbd_ep_transfer_t; - -/** - * @brief Flags for the current transfer. - * - * Flags configured for the transfer that can be merged using the bitwise 'or' operator (|). - */ -typedef enum -{ - NRF_DRV_USBD_TRANSFER_ZLP_FLAG = 1U << 0, //!< Add a zero-length packet. -}nrf_drv_usbd_transfer_flags_t; - -/** - * @brief Total transfer configuration. - * - * This structure is used to configure total transfer information. - * It is used by internal built-in feeders and consumers. - */ -typedef struct -{ - nrf_drv_usbd_data_ptr_t p_data; //!< Union with available data pointers used by the library. - size_t size; //!< Total size of the requested transfer. - uint32_t flags; //!< Transfer flags. - /**< Use the @ref nrf_drv_usbd_transfer_flags_t values. */ -}nrf_drv_usbd_transfer_t; - - -/** - * @brief Auxiliary macro for declaring IN transfer description with flags. - * - * The base macro for creating transfers with any configuration option. - * - * @param name Instance name. - * @param tx_buff Buffer to transfer. - * @param tx_size Transfer size. - * @param tx_flags Flags for the transfer (see @ref nrf_drv_usbd_transfer_flags_t). - * - * @return Configured variable with total transfer description. - */ -#define NRF_DRV_USBD_TRANSFER_IN_FLAGS(name, tx_buff, tx_size, tx_flags) \ - const nrf_drv_usbd_transfer_t name = { \ - .p_data = { .tx = (tx_buff) }, \ - .size = (tx_size), \ - .flags = (tx_flags) \ - } - -/** - * @brief Helper macro for declaring IN transfer description - * - * Normal transfer mode, no ZLP would be automatically generated. - * - * @sa nrf_drv_usbd_transfer_t - * @sa NRF_DRV_USBD_TRANSFER_IN_ZLP - * - * @param name Instance name - * @param tx_buff Buffer to transfer - * @param tx_size Transfer size - * - * @return Configured variable with total transfer description - * - */ -#define NRF_DRV_USBD_TRANSFER_IN(name, tx_buff, tx_size) \ - NRF_DRV_USBD_TRANSFER_IN_FLAGS(name, tx_buff, tx_size, 0) - -/** - * @brief Helper macro for declaring IN transfer description - * - * ZLP mode - Zero Length Packet would be generated on the end of the transfer - * (always!). - * - * @sa nrf_drv_usbd_transfer_t - * @sa NRF_DRV_USBD_TRANSFER_IN - * - * @param name Instance name - * @param tx_buff Buffer to transfer - * @param tx_size Transfer size - * - * @return Configured variable with total transfer description - */ -#define NRF_DRV_USBD_TRANSFER_IN_ZLP(name, tx_buff, tx_size) \ - NRF_DRV_USBD_TRANSFER_IN_FLAGS( \ - name, \ - tx_buff, \ - tx_size, \ - NRF_DRV_USBD_TRANSFER_ZLP_FLAG) - -/** - * @brief Helper macro for declaring OUT transfer item (@ref nrf_drv_usbd_transfer_t) - * - * @param name Instance name - * @param rx_buff Buffer to transfer - * @param rx_size Transfer size - * */ -#define NRF_DRV_USBD_TRANSFER_OUT(name, rx_buff, rx_size) \ - const nrf_drv_usbd_transfer_t name = { \ - .p_data = { .rx = (rx_buff) }, \ - .size = (rx_size), \ - .flags = 0 \ - } - -/** - * @brief USBD transfer feeder. - * - * Pointer for a transfer feeder. - * Transfer feeder is a feedback function used to prepare a single - * TX (Device->Host) endpoint transfer. - * - * The transfers provided by the feeder must be simple: - * - The size of the transfer provided by this function is limited to a single endpoint buffer. - * Bigger transfers are not handled automatically in this case. - * - Flash transfers are not automatically supported- you must copy them to the RAM buffer before. - * - * @note - * This function may use @ref nrf_drv_usbd_feeder_buffer_get to gain a temporary buffer - * that can be used to prepare transfer. - * - * @param[out] p_next Structure with the data for the next transfer to be filled. - * Required only if the function returns true. - * @param[in,out] p_context Context variable configured with the transfer. - * @param[in] ep_size The endpoint size. - * - * @retval false The current transfer is the last one - you do not need to call - * the function again. - * @retval true There is more data to be prepared and when the current transfer - * finishes, the feeder function is expected to be called again. - */ -typedef bool (*nrf_drv_usbd_feeder_t)( - nrf_drv_usbd_ep_transfer_t * p_next, - void * p_context, - size_t ep_size); - -/** - * @brief USBD transfer consumer. - * - * Pointer for a transfer consumer. - * Transfer consumer is a feedback function used to prepare a single - * RX (Host->Device) endpoint transfer. - * - * The transfer must provide a buffer big enough to fit the whole data from the endpoint. - * Otherwise, the NRF_USBD_EP_OVERLOAD event is generated. - * - * @param[out] p_next Structure with the data for the next transfer to be filled. - * Required only if the function returns true. - * @param[in,out] p_context Context variable configured with the transfer. - * @param[in] ep_size The endpoint size. - * @param[in] data_size Number of received bytes in the endpoint buffer. - * - * @retval false Current transfer is the last one - you do not need to call - * the function again. - * @retval true There is more data to be prepared and when current transfer - * finishes, the feeder function is expected to be called again. - */ -typedef bool (*nrf_drv_usbd_consumer_t)( - nrf_drv_usbd_ep_transfer_t * p_next, - void * p_context, - size_t ep_size, - size_t data_size); - -/** - * @brief Universal transfer handler. - * - * Union with feeder and consumer function pointer. - */ -typedef union -{ - nrf_drv_usbd_feeder_t feeder; //!< Feeder function pointer. - nrf_drv_usbd_consumer_t consumer; //!< Consumer function pointer. -}nrf_drv_usbd_handler_t; - -/** - * @brief USBD transfer descriptor. - * - * Universal structure that may hold the setup for callback configuration for - * IN or OUT type of the transfer. - */ -typedef struct -{ - nrf_drv_usbd_handler_t handler; //!< Handler for the current transfer, function pointer. - void * p_context; //!< Context for the transfer handler. -}nrf_drv_usbd_handler_desc_t; - -/** - * @brief Setup packet structure - * - * Structure that contains interpreted SETUP packet. - */ -typedef struct -{ - uint8_t bmRequestType; //!< byte 0 - uint8_t bmRequest; //!< byte 1 - uint16_t wValue; //!< byte 2 - uint16_t wIndex; //!< byte 4, 5 - uint16_t wLength; //!< byte 6, 7 -}nrf_drv_usbd_setup_t; - -/** - * @brief Library initialization - * - * @param[in] event_handler Event handler provided by the user. - */ -ret_code_t nrf_drv_usbd_init(nrf_drv_usbd_event_handler_t const event_handler); - -/** - * @brief Library deinitialization - */ -ret_code_t nrf_drv_usbd_uninit(void); - -/** - * @brief Enable the USBD port - * - * After calling this function USBD peripheral would be enabled. - * The USB LDO would be enabled. - * Enabled USBD peripheral would request HFCLK. - * This function does not enable external oscillator, so if it is not enabled by other part of the - * program after enabling USBD driver HFINT would be used for the USBD peripheral. - * It is perfectly fine until USBD is started. See @ref nrf_drv_usbd_start. - * - * In normal situation this function should be called in reaction to USBDETECTED - * event from POWER peripheral. - * - * Interrupts and USB pins pull-up would stay disabled until @ref nrf_drv_usbd_start - * function is called. - */ -void nrf_drv_usbd_enable(void); - -/** - * @brief Disable the USBD port - * - * After calling this function USBD peripheral would be disabled. - * No events would be detected or processed by the library. - * Clock for the peripheral would be disconnected. - */ -void nrf_drv_usbd_disable(void); - -/** - * @brief Start USB functionality - * - * After calling this function USBD peripheral should be fully functional - * and all new incoming events / interrupts would be processed by the library. - * - * Also only after calling this function host sees new connected device. - * - * Call this function when USBD power LDO regulator is ready - on USBPWRRDY event - * from POWER peripheral. - * - * Before USBD interrupts are enabled, external HFXO is requested. - * - * @param enable_sof The flag that is used to enable SOF processing. - * If it is false, SOF interrupt is left disabled and will not be generated. - * This improves power saving if SOF is not required. - * - * @note If the isochronous endpoints are going to be used, - * it is required to enable the SOF. - * In other case any isochronous endpoint would stay busy - * after first transmission. - */ -void nrf_drv_usbd_start(bool enable_sof); - -/** - * @brief Stop USB functionality - * - * This function disables USBD pull-up and interrupts. - * - * The HFXO request is released in this function. - * - * @note - * This function can also be used to logically disconnect USB from the HOST that - * would force it to enumerate device after calling @ref nrf_drv_usbd_start. - */ -void nrf_drv_usbd_stop(void); - -/** - * @brief Check if driver is initialized - * - * @retval false Driver is not initialized - * @retval true Driver is initialized - */ -bool nrf_drv_usbd_is_initialized(void); - -/** - * @brief Check if driver is enabled - * - * @retval false Driver is disabled - * @retval true Driver is enabled - */ -bool nrf_drv_usbd_is_enabled(void); - -/** - * @brief Check if driver is started - * - * @retval false Driver is not started - * @retval true Driver is started (fully functional) - * @note The USBD peripheral interrupt state is checked - */ -bool nrf_drv_usbd_is_started(void); - -/** - * @brief Suspend USBD operation - * - * The USBD peripheral is forced to go into the low power mode. - * The function has to be called in the reaction to @ref NRF_DRV_USBD_EVT_SUSPEND event - * when the firmware is ready. - * - * After successful call of this function most of the USBD registers would be unavailable. - * - * @note Check returned value for the feedback if suspending was successful. - * - * @retval true USBD peripheral successfully suspended - * @retval false USBD peripheral was not suspended due to resume detection. - * - */ -bool nrf_drv_usbd_suspend(void); - -/** - * @brief Start wake up procedure - * - * The USBD peripheral is forced to quit the low power mode. - * After calling this function all the USBD registers would be available. - * - * The hardware starts measuring time when wake up is possible. - * This may take 0-5 ms depending on how long the SUSPEND state was kept on the USB line. - - * When NRF_DRV_USBD_EVT_WUREQ event is generated it means that Wake Up signaling has just been - * started on the USB lines. - * - * @note Do not expect only @ref NRF_DRV_USBD_EVT_WUREQ event. - * There always may appear @ref NRF_DRV_USBD_EVT_RESUME event. - * @note NRF_DRV_USBD_EVT_WUREQ event means that Remote WakeUp signal - * has just begun to be generated. - * This may take up to 20 ms for the bus to become active. - * - * @retval true WakeUp procedure started. - * @retval false No WakeUp procedure started - bus is already active. - */ -bool nrf_drv_usbd_wakeup_req(void); - -/** - * @brief Check if USBD is in SUSPEND mode - * - * @note This is the information about peripheral itself, not about the bus state. - * - * @retval true USBD peripheral is suspended - * @retval false USBD peripheral is active - */ -bool nrf_drv_usbd_suspend_check(void); - -/** - * @brief Enable only interrupts that should be processed in SUSPEND mode - * - * Auxiliary function to help with SUSPEND mode integration. - * It enables only the interrupts that can be properly processed without stable HFCLK. - * - * Normally all the interrupts are enabled. - * Use this function to suspend interrupt processing that may require stable HFCLK until the - * clock is enabled. - * - * @sa nrf_drv_usbd_active_irq_config - */ -void nrf_drv_usbd_suspend_irq_config(void); - -/** - * @brief Default active interrupt configuration - * - * Default interrupt configuration. - * Use in a pair with @ref nrf_drv_usbd_active_irq_config. - * - * @sa nrf_drv_usbd_suspend_irq_config - */ -void nrf_drv_usbd_active_irq_config(void); - -/** - * @brief Check the bus state - * - * This function checks if the bus state is suspended - * - * @note The value returned by this function changes on SUSPEND and RESUME event processing. - * - * @retval true USBD bus is suspended - * @retval false USBD bus is active - */ -bool nrf_drv_usbd_bus_suspend_check(void); - -/** - * @brief Configure packet size that should be supported by the endpoint - * - * The real endpoint buffer size is always the same. - * This value sets max packet size that would be transmitted over the endpoint. - * This is required by the library - * - * @param[in] ep Endpoint number - * @param[in] size Required maximum packet size - * - * @note Endpoint size is always set to @ref NRF_DRV_USBD_EPSIZE or @ref NRF_DRV_USBD_ISOSIZE / 2 - * when @ref nrf_drv_usbd_ep_enable function is called. - */ -void nrf_drv_usbd_ep_max_packet_size_set(nrf_drv_usbd_ep_t ep, uint16_t size); - -/** - * @brief Get configured endpoint packet size - * - * Function to get configured endpoint size on the buffer. - * - * @param[in] ep Endpoint number - * - * @return Maximum pocket size configured on selected endpoint - */ -uint16_t nrf_drv_usbd_ep_max_packet_size_get(nrf_drv_usbd_ep_t ep); - -/** - * @brief Check if the selected endpoint is enabled. - * - * @param ep Endpoint number to check. - * - * @retval true Endpoint is enabled. - * @retval false Endpoint is disabled. - */ -bool nrf_drv_usbd_ep_enable_check(nrf_drv_usbd_ep_t ep); - -/** - * @brief Enable selected endpoint - * - * This function enables endpoint itself and its interrupts. - * @param ep Endpoint number to enable - * - * @note - * Max packet size is set to endpoint default maximum value. - * - * @sa nrf_drv_usbd_ep_max_packet_size_set - */ -void nrf_drv_usbd_ep_enable(nrf_drv_usbd_ep_t ep); - -/** - * @brief Disable selected endpoint - * - * This function disables endpoint itself and its interrupts. - * @param ep Endpoint number to disable - */ -void nrf_drv_usbd_ep_disable(nrf_drv_usbd_ep_t ep); - -/** - * @brief Disable all endpoints except for EP0 - * - * Disable all endpoints that can be disabled in USB device while it is still active. - */ -void nrf_drv_usbd_ep_default_config(void); - -/** - * @brief Start sending data over endpoint - * - * Function initializes endpoint transmission. - * This is asynchronous function - it finishes immediately after configuration - * for transmission is prepared. - * - * @note Data buffer pointed by p_data have to be kept active till - * @ref NRF_DRV_USBD_EVT_EPTRANSFER event is generated. - * - * @param[in] ep Endpoint number. - * For IN endpoint sending would be initiated. - * For OUT endpoint receiving would be initiated. - * @param[in] p_transfer - * - * @retval NRF_ERROR_BUSY Selected endpoint is pending. - * @retval NRF_ERROR_INVALID_ADDR Unexpected transfer on EPIN0 or EPOUT0. - * @retval NRF_ERROR_FORBIDDEN Endpoint stalled. - * @retval NRF_SUCCESS Transfer queued or started. - */ -ret_code_t nrf_drv_usbd_ep_transfer( - nrf_drv_usbd_ep_t ep, - nrf_drv_usbd_transfer_t const * const p_transfer); - -/** - * @brief Start sending data over the endpoint using the transfer handler function. - * - * This function initializes an endpoint transmission. - * Just before data is transmitted, the transfer handler - * is called and it prepares a data chunk. - * - * @param[in] ep Endpoint number. - * For an IN endpoint, sending is initiated. - * For an OUT endpoint, receiving is initiated. - * @param p_handler Transfer handler - feeder for IN direction and consumer for - * OUT direction. - * - * @retval NRF_ERROR_BUSY Selected endpoint is pending. - * @retval NRF_ERROR_INVALID_ADDR Unexpected transfer on EPIN0 or EPOUT0. - * @retval NRF_ERROR_FORBIDDEN Endpoint stalled. - * @retval NRF_SUCCESS Transfer queued or started. - */ -ret_code_t nrf_drv_usbd_ep_handled_transfer( - nrf_drv_usbd_ep_t ep, - nrf_drv_usbd_handler_desc_t const * const p_handler); - -/** - * @brief Get the temporary buffer to be used by the feeder. - * - * This buffer is used for TX transfers and it can be reused automatically - * when the transfer is finished. - * Use it for transfer preparation. - * - * May be used inside the feeder configured in @ref nrf_drv_usbd_ep_handled_transfer. - * - * @return Pointer to the buffer that can be used temporarily. - * - * @sa NRF_DRV_USBD_FEEDER_BUFFER_SIZE - */ -void * nrf_drv_usbd_feeder_buffer_get(void); - -/** - * @brief Get the information about last finished or current transfer - * - * Function returns the status of the last buffer set for transfer on selected endpoint. - * The status considers last buffer set by @ref nrf_drv_usbd_ep_transfer function or - * by transfer callback function. - * - * @param[in] ep Endpoint number. - * @param[out] p_size Information about the current/last transfer size. - * - * @retval NRF_SUCCESS Transfer already finished - * @retval NRF_ERROR_BUSY Ongoing transfer - * @retval NRF_ERROR_DATA_SIZE Too much of data received that cannot fit into buffer and cannot be splited into chunks. - * This may happen if buffer size is not a multiplication of endpoint buffer size. - */ -ret_code_t nrf_drv_usbd_ep_status_get(nrf_drv_usbd_ep_t ep, size_t * p_size); - -/** - * @brief Get number of received bytes - * - * Get the number of received bytes. - * The function behavior is undefined when called on IN endpoint. - * - * @param ep Endpoint number. - * - * @return Number of received bytes - */ -size_t nrf_drv_usbd_epout_size_get(nrf_drv_usbd_ep_t ep); - -/** - * @brief Check if endpoint buffer is ready or is under USB IP control - * - * Function to test if endpoint is busy. - * Endpoint that is busy cannot be accessed by MCU. - * It means that: - * - OUT (TX) endpoint: Last uploaded data is still in endpoint and is waiting - * to be received by the host. - * - IN (RX) endpoint: Endpoint is ready to receive data from the host - * and the endpoint does not have any data. - * When endpoint is not busy: - * - OUT (TX) endpoint: New data can be uploaded. - * - IN (RX) endpoint: New data can be downloaded using @ref nrf_drv_usbd_ep_transfer - * function. - */ -bool nrf_drv_usbd_ep_is_busy(nrf_drv_usbd_ep_t ep); - -/** - * @brief Stall endpoint - * - * Stall endpoit to send error information during next transfer request from - * the host. - * - * @note To stall endpoint it is safer to use @ref nrf_drv_usbd_setup_stall - * @note Stalled endpoint would not be cleared when DMA transfer finishes. - * - * @param ep Endpoint number to stall - * - */ -void nrf_drv_usbd_ep_stall(nrf_drv_usbd_ep_t ep); - -/** - * @brief Clear stall flag on endpoint - * - * This function clears endpoint that is stalled. - * @note - * If it is OUT endpoint (receiving) it would be also prepared for reception. - * It means that busy flag would be set. - * @note - * In endpoint (transmitting) would not be cleared - it gives possibility to - * write new data before transmitting. - */ -void nrf_drv_usbd_ep_stall_clear(nrf_drv_usbd_ep_t ep); - -/** - * @brief Check if endpoint is stalled - * - * This function gets stall state of selected endpoint - * - * @param ep Endpoint number to check - */ -bool nrf_drv_usbd_ep_stall_check(nrf_drv_usbd_ep_t ep); - -/** - * @brief Clear current endpoint data toggle - * - * @param ep Endpoint number to clear - */ -void nrf_drv_usbd_ep_dtoggle_clear(nrf_drv_usbd_ep_t ep); - -/** - * @brief Get parsed setup data - * - * Function fills the parsed setup data structure. - * - * @param[out] p_setup Pointer to data structure that would be filled by - * parsed data. - */ -void nrf_drv_usbd_setup_get(nrf_drv_usbd_setup_t * const p_setup); - -/** - * @brief Clear only for data transmission on setup endpoint - * - * This function may be called if any more data in control write transfer is expected. - * Clears only OUT endpoint to be able to take another OUT data token. - * It does not allow STATUS stage. - * @sa nrf_drv_usbd_setup_clear - */ -void nrf_drv_usbd_setup_data_clear(void); - -/** - * @brief Clear setup endpoint - * - * This function acknowledges setup when SETUP command was received and processed. - * It has to be called if no data respond for the SETUP command is sent. - * - * When there is any data transmission after SETUP command the data transmission - * itself would clear the endpoint. - */ -void nrf_drv_usbd_setup_clear(void); - -/** - * @brief Stall setup endpoint - * - * Mark and error on setup endpoint. - */ -void nrf_drv_usbd_setup_stall(void); - -/** -* @note -* This function locks interrupts that may be costly. -* It is good idea to test if the endpoint is still busy before calling this function: -* @code - (m_ep_dma_waiting & (1U << ep2bit(ep))) -* @endcode -* This function would check it again, but it makes it inside critical section. -*/ -void nrf_drv_usbd_ep_abort(nrf_drv_usbd_ep_t ep); - -/** - * @brief Get the information about expected transfer SETUP data direction - * - * Function returns the information about last expected transfer direction. - * - * @retval NRF_DRV_USBD_EPOUT0 Expecting OUT (Host->Device) direction or no data - * @retval NRF_DRV_USBD_EPIN0 Expecting IN (Device->Host) direction - */ -nrf_drv_usbd_ep_t nrf_drv_usbd_last_setup_dir_get(void); - -/** - * @brief Drop transfer on OUT endpoint - * - * @param[in] ep OUT endpoint ID - */ -void nrf_drv_usbd_transfer_out_drop(nrf_drv_usbd_ep_t ep); - -#ifdef __cplusplus -} -#endif - -/** @} */ -#endif /* NRF_DRV_USBD_H__ */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/usbd/nrf_drv_usbd_errata.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/usbd/nrf_drv_usbd_errata.h deleted file mode 100644 index 00371e9672..0000000000 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/usbd/nrf_drv_usbd_errata.h +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA - * - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifndef NRF_DRV_USBD_ERRATA_H__ -#define NRF_DRV_USBD_ERRATA_H__ - -#include -/** - * @defgroup nrf_drv_usbd_errata Functions to check if selected PAN is present in current chip - * @{ - * @ingroup nrf_drv_usbd - * - * Functions here are checking the presence of an error in current chip. - * The checking is done at runtime based on the microcontroller version. - * This file is subject to removal when nRF51840 prototype support is removed. - */ - -#ifndef NRF_DRV_USBD_ERRATA_ENABLE -/** - * @brief The constant that informs if errata should be enabled at all - * - * If this constant is set to 0, all the Errata bug fixes will be automatically disabled. - */ -#define NRF_DRV_USBD_ERRATA_ENABLE 1 -#endif - -/** - * @brief Internal auxiliary function to check if the program is running on NRF52840 chip - * @retval true It is NRF52480 chip - * @retval false It is other chip - */ -static inline bool nrf_drv_usbd_errata_type_52840(void) -{ - return ((((*(uint32_t *)0xF0000FE0) & 0xFF) == 0x08) && - (((*(uint32_t *)0xF0000FE4) & 0x0F) == 0x0)); -} - -/** - * @brief Internal auxiliary function to check if the program is running on first sample of - * NRF52840 chip - * @retval true It is NRF52480 chip and it is first sample version - * @retval false It is other chip - */ -static inline bool nrf_drv_usbd_errata_type_52840_proto1(void) -{ - return ( nrf_drv_usbd_errata_type_52840() && - ( ((*(uint32_t *)0xF0000FE8) & 0xF0) == 0x00 ) && - ( ((*(uint32_t *)0xF0000FEC) & 0xF0) == 0x00 ) ); -} - -/** - * @brief Function to check if chip requires errata 104 - * - * Errata: USBD: EPDATA event is not always generated. - * - * @retval true Errata should be implemented - * @retval false Errata should not be implemented - */ -static inline bool nrf_drv_usbd_errata_104(void) -{ - return NRF_DRV_USBD_ERRATA_ENABLE && nrf_drv_usbd_errata_type_52840_proto1(); -} - -/** - * @brief Function to check if chip requires errata 154 - * - * Errata: During setup read/write transfer USBD acknowledges setup stage without SETUP task. - * - * @retval true Errata should be implemented - * @retval false Errata should not be implemented - */ -static inline bool nrf_drv_usbd_errata_154(void) -{ - return NRF_DRV_USBD_ERRATA_ENABLE && nrf_drv_usbd_errata_type_52840_proto1(); -} - -/** - * @brief Function to check if chip requires errata 166 - * - * Errata: ISO double buffering not functional - * - * @retval true Errata should be implemented - * @retval false Errata should not be implemented - */ -static inline bool nrf_drv_usbd_errata_166(void) -{ - return NRF_DRV_USBD_ERRATA_ENABLE && true; -} - -/** - * @brief Function to check if chip requires errata ??? - * - * Errata: SIZE.EPOUT not writable - * - * @retval true Errata should be implemented - * @retval false Errata should not be implemented - */ -static inline bool nrf_drv_usbd_errata_sizeepout_rw(void) -{ - return NRF_DRV_USBD_ERRATA_ENABLE && nrf_drv_usbd_errata_type_52840_proto1(); -} - -/** @} */ -#endif /* NRF_DRV_USBD_ERRATA_H__ */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/README.md b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/README.md new file mode 100644 index 0000000000..2c717b29b1 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/README.md @@ -0,0 +1,23 @@ +# Folder origin + +components/softdevice + +# Modifications + +Removed: + * common/nrf_sdh_freertos.c + * common/nrf_sdh_freertos.h + * s112/toolchain + * s132/toolchain + * s212/ + +Moved: + * common/ to ../modules/softdevice/common + * mbr/nrf52832/ to ../TARGET_SOFTDEVICE_S132_MBR + * mbr/nrf52840/ to ../TARGET_SOFTDEVICE_S140_MBR + * s112/ to ../TARGET_SOFTDEVICE_S112 + * s132/ to ../TARGET_SOFTDEVICE_S132_FULL + * s140/ to ../TARGET_SOFTDEVICE_S140_FULL + +Renamed: + * ble.h to nrf_ble.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/ble/ble_radio_notification/ble_radio_notification.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/ble/ble_radio_notification/ble_radio_notification.c similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/ble/ble_radio_notification/ble_radio_notification.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/ble/ble_radio_notification/ble_radio_notification.c index a9f81e7692..b6dc48d6a9 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/ble/ble_radio_notification/ble_radio_notification.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/ble/ble_radio_notification/ble_radio_notification.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,11 +37,10 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ - #include "ble_radio_notification.h" +#include "nrf_nvic.h" #include -#include "nrf_nvic.h" static bool m_radio_active = false; /**< Current radio state. */ static ble_radio_notification_evt_handler_t m_evt_handler = NULL; /**< Application event handler for handling Radio Notification events. */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/ble/ble_radio_notification/ble_radio_notification.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/ble/ble_radio_notification/ble_radio_notification.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/ble/ble_radio_notification/ble_radio_notification.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/ble/ble_radio_notification/ble_radio_notification.h index 43e7946f3e..0f89b2f5dd 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/ble/ble_radio_notification/ble_radio_notification.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/ble/ble_radio_notification/ble_radio_notification.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_mbr.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_mbr.c similarity index 66% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_mbr.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_mbr.c index bb75141c77..974a46652f 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_mbr.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_mbr.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -41,6 +41,9 @@ #include "nrf_mbr.h" #include "nrf_dfu_types.h" #include "nrf_log.h" +#include "nrf_bootloader_info.h" + +#define MBR_IRQ_FORWARD_ADDRESS_ADDRESS (0x20000000) //!< The address of the variable that decides where the MBR forwards interrupts uint32_t nrf_dfu_mbr_copy_bl(uint32_t * p_src, uint32_t len) { @@ -60,28 +63,6 @@ uint32_t nrf_dfu_mbr_copy_bl(uint32_t * p_src, uint32_t len) } -uint32_t nrf_dfu_mbr_copy_sd(uint32_t * p_dst, uint32_t * p_src, uint32_t len) -{ - uint32_t ret_val; - uint32_t const len_words = len / sizeof(uint32_t); - - if ((len_words & (CODE_PAGE_SIZE / sizeof(uint32_t) - 1)) != 0) - return NRF_ERROR_INVALID_LENGTH; - - sd_mbr_command_t command = - { - .command = SD_MBR_COMMAND_COPY_SD, - .params.copy_sd.src = p_src, - .params.copy_sd.dst = p_dst, - .params.copy_sd.len = len_words - }; - - ret_val = sd_mbr_command(&command); - - return ret_val; -} - - uint32_t nrf_dfu_mbr_init_sd(void) { uint32_t ret_val; @@ -97,49 +78,14 @@ uint32_t nrf_dfu_mbr_init_sd(void) } -uint32_t nrf_dfu_mbr_compare(uint32_t * p_ptr1, uint32_t * p_ptr2, uint32_t len) +uint32_t nrf_dfu_mbr_irq_forward_address_set(void) { - uint32_t ret_val; - uint32_t const len_words = len / sizeof(uint32_t); - - sd_mbr_command_t command = - { - .command = SD_MBR_COMMAND_COMPARE, - .params.compare.ptr1 = p_ptr1, - .params.compare.ptr2 = p_ptr2, - .params.compare.len = len_words - }; - - ret_val = sd_mbr_command(&command); - - return ret_val; -} - - -uint32_t nrf_dfu_mbr_vector_table_set(uint32_t address) -{ - uint32_t ret_val; - - NRF_LOG_DEBUG("running vector table set"); - sd_mbr_command_t command = - { - .command = SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, - .params.base_set.address = address, - }; - - ret_val = sd_mbr_command(&command); - NRF_LOG_DEBUG("After running vector table set"); - - return ret_val; -} - - -#ifndef SOFTDEVICE_PRESENT -uint32_t nrf_dfu_mbr_irq_forward_address_set(uint32_t address) -{ - uint32_t ret_val; + uint32_t ret_val = NRF_ERROR_INVALID_PARAM; + uint32_t address = MBR_SIZE; NRF_LOG_DEBUG("running irq table set"); + +#ifndef BLE_STACK_SUPPORT_REQD sd_mbr_command_t command = { .command = SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, @@ -147,8 +93,17 @@ uint32_t nrf_dfu_mbr_irq_forward_address_set(uint32_t address) }; ret_val = sd_mbr_command(&command); +#endif + + if (ret_val == NRF_ERROR_INVALID_PARAM) + { + // Manually set the forward address if this MBR doesn't have the command. + *(uint32_t *)(MBR_IRQ_FORWARD_ADDRESS_ADDRESS) = address; + + ret_val = NRF_SUCCESS; + } + NRF_LOG_DEBUG("After running irq table set"); return ret_val; } -#endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_mbr.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_mbr.h new file mode 100644 index 0000000000..2fcd1b361d --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_mbr.h @@ -0,0 +1,90 @@ +/** + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +/**@file + * + * @defgroup sdk_nrf_dfu_mbr MBR functions + * @{ + * @ingroup nrf_dfu + */ + +#ifndef NRF_DFU_MBR_H__ +#define NRF_DFU_MBR_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** @brief Function for copying the bootloader using an MBR command. + * + * @param[in] p_src Source address of the bootloader data to copy. + * @param[in] len Length of the data to copy in bytes. + * + * @return This function will return only if the command request could not be run. + * See @ref sd_mbr_command_copy_bl_t for possible return values. + */ +uint32_t nrf_dfu_mbr_copy_bl(uint32_t * p_src, uint32_t len); + + +/** @brief Function for initializing the SoftDevice using an MBR command. + * + * @retval NRF_SUCCESS If the SoftDevice was initialized successfully. + * Any other return value indicates that the SoftDevice + * could not be initialized. + */ +uint32_t nrf_dfu_mbr_init_sd(void); + + +/** @brief Function for setting the address of the IRQ table to the app's using an MBR command. + * + * @retval NRF_SUCCESS If the address of the new irq table was set. Any other + * return value indicates that the address could not be set. + */ +uint32_t nrf_dfu_mbr_irq_forward_address_set(void); + + +#ifdef __cplusplus +} +#endif + +#endif // NRF_DFU_MBR_H__ + +/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_types.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_types.h similarity index 60% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_types.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_types.h index 0939d87d25..5ccd290103 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_types.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/dfu/nrf_dfu_types.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -53,61 +53,22 @@ #include "nrf.h" #include "nrf_mbr.h" #include "app_util_platform.h" +#include "sdk_config.h" -#ifdef SOFTDEVICE_PRESENT -#include "nrf_sdm.h" +#if defined(NRF_DFU_TRANSPORT_BLE) && NRF_DFU_TRANSPORT_BLE #include "ble_gap.h" -#endif - -#if defined(NRF_DFU_SVCI_ENABLED) - #include "nrf_dfu_svci.h" -#else - // Dummy type for nrf_dfu_peer_data_t if DFU SVCI is not in use - typedef struct - { - uint32_t crc; - } nrf_dfu_peer_data_t; - - // Dummy type for nrf_dfu_adv_name_t if DFU SVCI is not in use - typedef struct - { - uint32_t crc; - } nrf_dfu_adv_name_t; - +#define SYSTEM_SERVICE_ATT_SIZE 8 /**< Size of the system service attribute length including CRC-16 at the end. */ #endif #ifdef __cplusplus extern "C" { #endif -#if defined(SOFTDEVICE_PRESENT) -#include "nrf_sdm.h" +#define INIT_COMMAND_MAX_SIZE 256 /**< Maximum size of the init command stored in dfu_settings. */ -/** @brief Start address of the SoftDevice (excluding the area for the MBR). - */ -#define SOFTDEVICE_REGION_START MBR_SIZE - - -#ifndef CODE_REGION_1_START -#define CODE_REGION_1_START SD_SIZE_GET(MBR_SIZE) -#endif - - -#else - -#ifndef CODE_REGION_1_START -#define CODE_REGION_1_START MBR_SIZE -#endif - -#endif - - -#define INIT_COMMAND_MAX_SIZE 256 /**< Maximum size of the init command stored in dfu_settings. */ - -/** @brief Size of a flash codepage. This value is used for calculating the size of the reserved - * flash space in the bootloader region. It is checked against NRF_UICR->CODEPAGESIZE - * at run time to ensure that the region is correct. +/** @brief Size of a flash page. This value is used for calculating the size of the reserved + * flash space in the bootloader region. */ #if defined(NRF51) #define CODE_PAGE_SIZE (PAGE_SIZE_IN_WORDS * sizeof(uint32_t)) @@ -117,11 +78,10 @@ extern "C" { #error "Architecture not set." #endif - /** @brief Maximum size of a data object.*/ -#if defined( NRF51 ) +#if defined(NRF51) #define DATA_OBJECT_MAX_SIZE (CODE_PAGE_SIZE * 4) -#elif defined( NRF52_SERIES ) || defined ( __SDK_DOXYGEN__ ) +#elif defined(NRF52_SERIES) || defined (__SDK_DOXYGEN__) #define DATA_OBJECT_MAX_SIZE (CODE_PAGE_SIZE) #else #error "Architecture not set." @@ -129,19 +89,19 @@ extern "C" { /** @brief Page location of the bootloader settings address. */ - -#if defined ( NRF51 ) +#if defined (NRF51) #define BOOTLOADER_SETTINGS_ADDRESS (0x0003FC00UL) +#elif defined( NRF52810_XXAA ) + #define BOOTLOADER_SETTINGS_ADDRESS (0x0002F000UL) #elif defined( NRF52832_XXAA ) #define BOOTLOADER_SETTINGS_ADDRESS (0x0007F000UL) -#elif defined( NRF52840_XXAA ) +#elif defined(NRF52840_XXAA) #define BOOTLOADER_SETTINGS_ADDRESS (0x000FF000UL) #else #error No valid target set for BOOTLOADER_SETTINGS_ADDRESS. #endif - -#if defined(NRF52832_XXAA) +#define BOOTLOADER_SETTINGS_PAGE_SIZE (CODE_PAGE_SIZE) /** * @brief MBR parameters page in UICR. @@ -151,80 +111,47 @@ extern "C" { * @note If the value at the given location is 0xFFFFFFFF, no MBR parameters page is set. */ #define NRF_UICR_MBR_PARAMS_PAGE_ADDRESS (NRF_UICR_BASE + 0x18) - +#define NRF_MBR_PARAMS_PAGE_SIZE (CODE_PAGE_SIZE) /** @brief Page location of the MBR parameters page address. - * */ - -#if !defined(NRF52840_XXAA_ENGA) -#define NRF_MBR_PARAMS_PAGE_ADDRESS (0x0007E000UL) -#else -#define NRF_MBR_PARAMS_PAGE_ADDRESS (0x000FE000UL) +#if defined(NRF52840_XXAA) || defined(NRF52840_XXAA_ENGA) + #define NRF_MBR_PARAMS_PAGE_ADDRESS (0x000FE000UL) +#elif defined(NRF52832_XXAA) + #define NRF_MBR_PARAMS_PAGE_ADDRESS (0x0007E000UL) +#elif defined(NRF52810_XXAA) + #define NRF_MBR_PARAMS_PAGE_ADDRESS (0x0002E000UL) #endif -#endif - -#if defined(NRF52840_XXAA) - -/** - * @brief MBR parameters page in UICR. +/** @brief Size (in bytes) of the flash area reserved for application data. * - * Register location in UICR where the page address of the MBR parameters page is stored (only used by the nRF52 MBR). - * - * @note If the value at the given location is 0xFFFFFFFF, no MBR parameters page is set. - */ -#define NRF_UICR_MBR_PARAMS_PAGE_ADDRESS (NRF_UICR_BASE + 0x18) - - -/** @brief Page location of the MBR parameters page address. - * - */ -#define NRF_MBR_PARAMS_PAGE_ADDRESS (0x000FE000UL) - -#endif - - -/** @brief Size of the flash space reserved for application data. + * The area is found at the end of the application area, next to the start of + * the bootloader. This area will not be erased by the bootloader during a + * firmware upgrade. The default value is 3 pages which matches the size used + * in most SDK examples. */ #ifndef DFU_APP_DATA_RESERVED -#define DFU_APP_DATA_RESERVED CODE_PAGE_SIZE * 3 +#define DFU_APP_DATA_RESERVED (CODE_PAGE_SIZE * 3) #endif - /** @brief Total size of the region between the SoftDevice and the bootloader. */ -#define DFU_REGION_TOTAL_SIZE ((* (uint32_t *)NRF_UICR_BOOTLOADER_START_ADDRESS) - CODE_REGION_1_START) +#define DFU_REGION_END(bootloader_start_addr) ((bootloader_start_addr) - (DFU_APP_DATA_RESERVED)) -#ifdef SOFTDEVICE_PRESENT -/** @brief Start address of the SoftDevice (excluding the area for the MBR). - */ -#define SOFTDEVICE_REGION_START MBR_SIZE - - -/** @brief Size of the Code Region 0, found in the UICR.CLEN0 register. - * - * @details This value is identical to the start of Code Region 1. This value is used for - * compilation safety, because the linker will fail if the application expands - * into the bootloader. At run time, the bootloader uses the value found in UICR.CLEN0. - */ - -#ifndef CODE_REGION_1_START -#define CODE_REGION_1_START SD_SIZE_GET(MBR_SIZE) -#endif +#ifdef BLE_STACK_SUPPORT_REQD +#define DFU_REGION_START (nrf_dfu_bank0_start_addr()) #else -#ifndef CODE_REGION_1_START -#define CODE_REGION_1_START MBR_SIZE -#endif +#define DFU_REGION_START (MBR_SIZE) #endif +#define DFU_REGION_TOTAL_SIZE ((DFU_REGION_END) - (DFU_REGION_START)) + #define NRF_DFU_CURRENT_BANK_0 0x00 #define NRF_DFU_CURRENT_BANK_1 0x01 #define NRF_DFU_BANK_LAYOUT_DUAL 0x00 #define NRF_DFU_BANK_LAYOUT_SINGLE 0x01 - /** @brief DFU bank state codes. * * @details The DFU bank state indicates the content of a bank: @@ -237,7 +164,6 @@ extern "C" { #define NRF_DFU_BANK_VALID_BL 0xAA /**< Valid bootloader. */ #define NRF_DFU_BANK_VALID_SD_BL 0xAC /**< Valid SoftDevice and bootloader. */ - /** @brief Description of a single bank. */ #pragma pack(4) typedef struct @@ -250,19 +176,17 @@ typedef struct /**@brief DFU progress. * * Be aware of the difference between objects and firmware images. A firmware image consists of multiple objects, each of a maximum size @ref DATA_OBJECT_MAX_SIZE. - * + * * @note The union inside this struct is cleared when CREATE_OBJECT of command type is executed, and when there is a valid post-validation. - * In DFU activation (after reset) the @ref sd_start_address will be used in case of a SD/SD+BL update. + * In DFU activation (after reset) the @ref dfu_progress_t::update_start_address will be used in case of a SD/SD+BL update. */ -ANON_UNIONS_ENABLE +ANON_UNIONS_ENABLE; typedef struct { uint32_t command_size; /**< The size of the current init command stored in the DFU settings. */ uint32_t command_offset; /**< The offset of the currently received init command data. The offset will increase as the init command is received. */ uint32_t command_crc; /**< The calculated CRC of the init command (calculated after the transfer is completed). */ - uint32_t data_object_size; /**< The size of the last object created. Note that this size is not the size of the whole firmware image.*/ - union { struct @@ -274,11 +198,67 @@ typedef struct }; struct { - uint32_t sd_start_address; /**< Value indicating the start address of the SoftDevice source. Used for an SD/SD+BL update where the SD changes size or if the DFU process had a power loss when updating a SD with changed size. */ + uint32_t update_start_address; /**< Value indicating the start address of the new firmware (before copy). It's always used, but it's most important for an SD/SD+BL update where the SD changes size or if the DFU process had a power loss when updating a SD with changed size. */ }; }; } dfu_progress_t; -ANON_UNIONS_DISABLE +ANON_UNIONS_DISABLE; + +/** @brief Event types in the bootloader and DFU process. */ +typedef enum +{ + NRF_DFU_EVT_DFU_INITIALIZED, /**< Starting DFU. */ + NRF_DFU_EVT_TRANSPORT_ACTIVATED, /**< Transport activated (e.g. BLE connected, USB plugged in). */ + NRF_DFU_EVT_TRANSPORT_DEACTIVATED, /**< Transport deactivated (e.g. BLE disconnected, USB plugged out). */ + NRF_DFU_EVT_DFU_STARTED, /**< DFU process started. */ + NRF_DFU_EVT_OBJECT_RECEIVED, /**< A DFU data object has been received. */ + NRF_DFU_EVT_DFU_FAILED, /**< DFU process has failed, been interrupted, or hung. */ + NRF_DFU_EVT_DFU_COMPLETED, /**< DFU process completed. */ + NRF_DFU_EVT_DFU_ABORTED, /**< DFU process aborted. */ +} nrf_dfu_evt_type_t; + +/** + * @brief Function for notifying DFU state. + */ +typedef void (*nrf_dfu_observer_t)(nrf_dfu_evt_type_t notification); + + +#if defined(NRF_DFU_TRANSPORT_BLE) && NRF_DFU_TRANSPORT_BLE + +typedef struct +{ + uint32_t crc; /**< CRC of the rest of the parameters in this struct. */ + ble_gap_id_key_t ble_id; /**< BLE GAP identity key of the device that initiated the DFU process. */ + ble_gap_enc_key_t enc_key; /**< Encryption key structure containing encrypted diversifier and LTK for reestablishing the bond. */ + uint8_t sys_serv_attr[SYSTEM_SERVICE_ATT_SIZE]; /**< System service attributes for restoring of Service Changed Indication setting in DFU mode. */ +} nrf_dfu_peer_data_t; + +typedef enum +{ + DFU_PEER_DATA_STATE_INVALID = 0, + DFU_PEER_DATA_STATE_INITIALIZED = 1, + DFU_PEER_DATA_STATE_WRITE_REQUESTED = 2, + DFU_PEER_DATA_STATE_WRITE_FINISHED = 3, + DFU_PEER_DATA_STATE_WRITE_FAILED = 4, +} nrf_dfu_peer_data_state_t; + +typedef struct +{ + uint32_t crc; /**< CRC of the rest of the parameters in this struct. Calculated by the bootloader. */ + uint8_t name[20]; /**< New advertisement name to set. */ + uint32_t len; /**< Length of the advertisement name. */ +} nrf_dfu_adv_name_t; + +typedef enum +{ + DFU_ADV_NAME_STATE_INVALID = 0, + DFU_ADV_NAME_STATE_INITIALIZED = 1, + DFU_ADV_NAME_STATE_WRITE_REQUESTED = 2, + DFU_ADV_NAME_STATE_WRITE_FINISHED = 3, + DFU_ADV_NAME_STATE_WRITE_FAILED = 4, +} nrf_dfu_set_adv_name_state_t; + +#endif // NRF_DFU_TRANSPORT_BLE /**@brief DFU settings for application and bank data. @@ -286,7 +266,7 @@ ANON_UNIONS_DISABLE typedef struct { uint32_t crc; /**< CRC for the stored DFU settings, not including the CRC itself. If 0xFFFFFFF, the CRC has never been calculated. */ - uint32_t settings_version; /**< Version of the currect DFU settings struct layout. */ + uint32_t settings_version; /**< Version of the current DFU settings struct layout. */ uint32_t app_version; /**< Version of the last stored application. */ uint32_t bootloader_version; /**< Version of the last stored bootloader. */ @@ -297,27 +277,22 @@ typedef struct nrf_dfu_bank_t bank_1; /**< Bank 1. */ uint32_t write_offset; /**< Write offset for the current operation. */ - uint32_t sd_size; /**< SoftDevice size (if combined BL and SD). */ + uint32_t sd_size; /**< Size of the SoftDevice. */ dfu_progress_t progress; /**< Current DFU progress. */ uint32_t enter_buttonless_dfu; uint8_t init_command[INIT_COMMAND_MAX_SIZE]; /**< Buffer for storing the init command. */ +#if defined(NRF_DFU_TRANSPORT_BLE) && NRF_DFU_TRANSPORT_BLE nrf_dfu_peer_data_t peer_data; /**< Not included in calculated CRC. */ nrf_dfu_adv_name_t adv_name; /**< Not included in calculated CRC. */ +#endif // NRF_DFU_TRANSPORT_BLE + } nrf_dfu_settings_t; - -#ifdef SOFTDEVICE_PRESENT - - -#endif // SYSTEM_SERVICE_ATT_SIZE - - #pragma pack() // revert pack settings - #ifdef __cplusplus } #endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/nrf_bootloader_info.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/nrf_bootloader_info.h new file mode 100644 index 0000000000..812cddbf37 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/bootloader/nrf_bootloader_info.h @@ -0,0 +1,188 @@ +/** + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +/**@file + * + * @defgroup nrf_bootloader_info Bootloader Information + * @{ + * @ingroup nrf_bootloader + */ + +#ifndef NRF_BOOTLOADER_INFO_H__ +#define NRF_BOOTLOADER_INFO_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "app_util.h" +#include "nrf.h" +#include "nrf_mbr.h" + +/** @brief Macro for getting the start address of the bootloader image. + * + * The macro is not a compile time symbol. It cannot be used as a + * constant expression, for example, inside a static assert or linker script + * at-placement. + */ +#ifndef BOOTLOADER_START_ADDR +#if (__LINT__ == 1) + #define BOOTLOADER_START_ADDR (0x3AC00) +#elif defined(CODE_START) + #define BOOTLOADER_START_ADDR (CODE_START) +#else + #error Not a valid compiler/linker for BOOTLOADER_START_ADDR. +#endif +#endif + + +/** @brief Macro for getting the size of the bootloader image. + */ +#ifndef BOOTLOADER_SIZE +#if defined ( NRF51 ) + #define BOOTLOADER_SIZE (BOOTLOADER_SETTINGS_ADDRESS - BOOTLOADER_START_ADDR) +#elif defined( NRF52_SERIES ) + #define BOOTLOADER_SIZE (NRF_MBR_PARAMS_PAGE_ADDRESS - BOOTLOADER_START_ADDR) +#elif (__LINT__ == 1) + #define BOOTLOADER_SIZE (0x6000) +#endif +#endif + + +/** + * @brief Bootloader start address in UICR. + * + * Register location in UICR where the bootloader start address is stored. + * + * @note If the value at the given location is 0xFFFFFFFF, the bootloader address is not set. + */ +#define NRF_UICR_BOOTLOADER_START_ADDRESS (NRF_UICR_BASE + 0x14) + + +// The following macros are for accessing the SoftDevice information structure, +// which is found inside the SoftDevice binary. + +/** @brief Macro for converting an offset inside the SoftDevice information struct to an absolute address. + */ +#define SD_INFO_ABS_OFFSET_GET(baseaddr, offset) ((baseaddr) + (SOFTDEVICE_INFO_STRUCT_OFFSET) + (offset)) + +/** @brief Macros for reading a byte or a word at a particular offset inside a SoftDevice information struct. + * Use MBR_SIZE as baseaddr when the SoftDevice is installed just above the MBR (the usual case). + */ +#define SD_OFFSET_GET_UINT32(baseaddr, offset) (*((uint32_t *) SD_INFO_ABS_OFFSET_GET(baseaddr, offset))) +#define SD_OFFSET_GET_UINT16(baseaddr, offset) (*((uint16_t *) SD_INFO_ABS_OFFSET_GET(baseaddr, offset))) +#define SD_OFFSET_GET_UINT8(baseaddr, offset) (*((uint8_t *) SD_INFO_ABS_OFFSET_GET(baseaddr, offset))) + + +#ifdef BLE_STACK_SUPPORT_REQD +#include "nrf_sdm.h" +#else +/** @brief The offset inside the SoftDevice at which the information struct is placed. + * To see the layout of the information struct, see the SoftDevice specification. + */ +#define SOFTDEVICE_INFO_STRUCT_OFFSET (0x2000) + +#define SD_INFO_STRUCT_SIZE(baseaddr) SD_OFFSET_GET_UINT8(baseaddr, 0x00) + +/** @brief Macro for reading the size of a SoftDevice at a given base address. + */ +#ifndef SD_SIZE_GET +#define SD_SIZE_GET(baseaddr) SD_OFFSET_GET_UINT32(baseaddr, 0x08) +#endif + +/** @brief Macro for reading the version of a SoftDevice at a given base address. + * This expression checks the length of the information struct to see if the version is present. + * The version number is constructed like this: + * major_version * 1000000 + minor_version * 1000 + bugfix_version + */ +#ifndef SD_VERSION_GET +#define SD_VERSION_GET(baseaddr) ((SD_INFO_STRUCT_SIZE(baseaddr) > (0x14)) \ + ? SD_OFFSET_GET_UINT32(baseaddr, 0x14) \ + : 0) +#endif +#endif + + +/** @brief Macro for reading the magic number of a SoftDevice at a given base address. + */ +#ifndef SD_MAGIC_NUMBER_GET +#define SD_MAGIC_NUMBER_GET(baseaddr) SD_OFFSET_GET_UINT32(baseaddr, 0x04) +#endif + +/** @brief Macro for getting the absolute address of the magic number. + */ +#define SD_MAGIC_NUMBER_ABS_OFFSET_GET(baseaddr) SD_INFO_ABS_OFFSET_GET(baseaddr, 0x04) + +/** @brief The number present at a specific location in all SoftDevices. + */ +#define SD_MAGIC_NUMBER ((uint32_t)0x51B1E5DB) + +/** @brief Whether a SoftDevice is at its regular location. + */ +#ifndef SD_PRESENT +#define SD_PRESENT ((SD_MAGIC_NUMBER_GET(MBR_SIZE)) == (SD_MAGIC_NUMBER)) +#endif + +/** @brief The multiplier for the major version of the SoftDevice. See \ref SD_VERSION_GET + */ +#define SD_MAJOR_VERSION_MULTIPLIER (1000000) + +/** @brief Read the major version of the SoftDevice from the raw version number. See \ref SD_VERSION_GET. + */ +#define SD_MAJOR_VERSION_EXTRACT(raw_version) ((raw_version)/SD_MAJOR_VERSION_MULTIPLIER) + + +#define BOOTLOADER_DFU_GPREGRET_MASK (0xB0) /**< Magic pattern written to GPREGRET register to signal between main app and DFU. The 3 lower bits are assumed to be used for signalling purposes.*/ +#define BOOTLOADER_DFU_START_BIT_MASK (0x01) /**< Bit mask to signal from main application to enter DFU mode using a buttonless service. */ + +#define BOOTLOADER_DFU_GPREGRET2_MASK (0xA8) /**< Magic pattern written to GPREGRET2 register to signal between main app and DFU. The 3 lower bits are assumed to be used for signalling purposes.*/ +#define BOOTLOADER_DFU_SKIP_CRC_BIT_MASK (0x01) /**< Bit mask to signal from main application that CRC-check is not needed for image verification. */ + + +#define BOOTLOADER_DFU_START (BOOTLOADER_DFU_GPREGRET_MASK | BOOTLOADER_DFU_START_BIT_MASK) /**< Magic number to signal that bootloader should enter DFU mode because of signal from Buttonless DFU in main app.*/ +#define BOOTLOADER_DFU_SKIP_CRC (BOOTLOADER_DFU_GPREGRET2_MASK | BOOTLOADER_DFU_SKIP_CRC_BIT_MASK) /**< Magic number to signal that CRC can be skipped due to low power modes.*/ + + + +#ifdef __cplusplus +} +#endif + +#endif // #ifndef NRF_BOOTLOADER_INFO_H__ +/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/libraries/fstorage/nrf_fstorage_sd.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/fstorage/nrf_fstorage_sd.c similarity index 94% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/libraries/fstorage/nrf_fstorage_sd.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/fstorage/nrf_fstorage_sd.c index 6b75b364a6..ef5f6b82d2 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/libraries/fstorage/nrf_fstorage_sd.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/fstorage/nrf_fstorage_sd.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -67,7 +67,7 @@ typedef enum NRF_FSTORAGE_OP_ERASE //!< Erase flash pages. } nrf_fstorage_sd_opcode_t; -ANON_UNIONS_ENABLE +ANON_UNIONS_ENABLE; /**@brief fstorage operation queue element. */ typedef struct { @@ -91,7 +91,7 @@ typedef struct } erase; }; } nrf_fstorage_sd_op_t; -ANON_UNIONS_DISABLE +ANON_UNIONS_DISABLE; typedef enum { @@ -173,9 +173,10 @@ static void event_send(nrf_fstorage_sd_op_t const * p_op, ret_code_t result) switch (p_op->op_code) { case NRF_FSTORAGE_OP_WRITE: - evt.id = NRF_FSTORAGE_EVT_WRITE_RESULT; - evt.addr = p_op->write.dest; - evt.len = p_op->write.len; + evt.id = NRF_FSTORAGE_EVT_WRITE_RESULT; + evt.addr = p_op->write.dest; + evt.p_src = p_op->write.p_src; + evt.len = p_op->write.len; break; case NRF_FSTORAGE_OP_ERASE: @@ -235,6 +236,8 @@ static bool queue_load_next(void) /* Execute an operation in the queue. */ static void queue_process(void) { + uint32_t rc; + if (m_flags.state == NRF_FSTORAGE_STATE_IDLE) { if (!queue_load_next()) @@ -247,7 +250,6 @@ static void queue_process(void) m_flags.state = NRF_FSTORAGE_STATE_OP_EXECUTING; - uint32_t rc; switch (m_p_cur_op->op_code) { case NRF_FSTORAGE_OP_WRITE: @@ -285,11 +287,13 @@ static void queue_process(void) default: { - /* An error has occurred. We cannot proceed further with this operation. - * Reset the internal state so we can accept other operations. */ + /* An error has occurred. We cannot proceed further with this operation. */ event_send(m_p_cur_op, NRF_ERROR_INTERNAL); + /* Reset the internal state so we can accept other operations. */ m_flags.state = NRF_FSTORAGE_STATE_IDLE; m_flags.queue_running = false; + /* Free the current queue element. */ + queue_free(); } break; } } @@ -298,9 +302,7 @@ static void queue_process(void) /* Start processing the queue if it is not running and fstorage is not paused. */ static void queue_start(void) { - nrf_atomic_flag_t queue_running = nrf_atomic_u32_fetch_store(&m_flags.queue_running, true); - - if ( (!queue_running) + if ( (!nrf_atomic_flag_set_fetch(&m_flags.queue_running)) && (!m_flags.paused)) { queue_process(); @@ -372,14 +374,13 @@ static ret_code_t init(nrf_fstorage_t * p_fs, void * p_param) { UNUSED_PARAMETER(p_param); + p_fs->p_flash_info = &m_flash_info; + if (!nrf_atomic_flag_set_fetch(&m_flags.initialized)) { - p_fs->p_flash_info = &m_flash_info; - #if NRF_SDH_ENABLED m_flags.sd_enabled = nrf_sdh_is_enabled(); #endif - (void) NRF_ATFIFO_INIT(m_fifo); } @@ -511,8 +512,25 @@ void nrf_fstorage_sys_evt_handler(uint32_t sys_evt, void * p_context) { UNUSED_PARAMETER(p_context); + if ( (sys_evt != NRF_EVT_FLASH_OPERATION_SUCCESS) + && (sys_evt != NRF_EVT_FLASH_OPERATION_ERROR)) + { + /* Ignore any non-flash events. */ + return; + } + switch (m_flags.state) { + case NRF_FSTORAGE_STATE_IDLE: + /* Ignore flash events if no flash operation was requested. */ + return; + + case NRF_FSTORAGE_STATE_OP_PENDING: + /* The SoftDevice has completed a flash operation that was not requested by fstorage. + * It should be possible to request an operation now. + * Process the queue at the end of this function. */ + break; + case NRF_FSTORAGE_STATE_OP_EXECUTING: { /* Handle the result of a flash operation initiated by this module. */ @@ -547,16 +565,6 @@ void nrf_fstorage_sys_evt_handler(uint32_t sys_evt, void * p_context) queue_free(); } } break; - - case NRF_FSTORAGE_STATE_OP_PENDING: - /* The SoftDevice has completed a flash operation that was not requested by fstorage. - * It should be possible to request an operation now. - * Process the queue at the end of this function. */ - break; - - default: - /* If idle, return. */ - return; } if (!m_flags.paused) @@ -565,7 +573,7 @@ void nrf_fstorage_sys_evt_handler(uint32_t sys_evt, void * p_context) } else { - /* A flash operation has completed. Let the SoftDevice to change state. */ + /* A flash operation has completed. Let the SoftDevice change state. */ (void) nrf_sdh_request_continue(); } } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/libraries/fstorage/nrf_fstorage_sd.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/fstorage/nrf_fstorage_sd.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/libraries/fstorage/nrf_fstorage_sd.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/fstorage/nrf_fstorage_sd.h index 27f2789909..b35d15fe4e 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/libraries/fstorage/nrf_fstorage_sd.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_COMMON/libraries/fstorage/nrf_fstorage_sd.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_NONE/libraries/fstorage/nrf_fstorage_nvmc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_NONE/libraries/fstorage/nrf_fstorage_nvmc.c similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_NONE/libraries/fstorage/nrf_fstorage_nvmc.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_NONE/libraries/fstorage/nrf_fstorage_nvmc.c diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_NONE/libraries/fstorage/nrf_fstorage_nvmc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_NONE/libraries/fstorage/nrf_fstorage_nvmc.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_NONE/libraries/fstorage/nrf_fstorage_nvmc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_NONE/libraries/fstorage/nrf_fstorage_nvmc.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_error.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_error.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_error.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_error.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_nvic.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_nvic.c similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_nvic.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_nvic.c diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_nvic.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_nvic.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_nvic.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_nvic.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_soc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_soc.c similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_soc.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_soc.c diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_soc.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_soc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_NONE/nrf_soc_nosd/nrf_soc.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/hex/s132_nrf52_5.0.0_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/doc/s112_nrf52_6.0.0_licence-agreement.txt similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/hex/s132_nrf52_5.0.0_licence-agreement.txt rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/doc/s112_nrf52_6.0.0_licence-agreement.txt index 00c2e54c47..a71adee7b9 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/hex/s132_nrf52_5.0.0_licence-agreement.txt +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/doc/s112_nrf52_6.0.0_licence-agreement.txt @@ -1,4 +1,4 @@ -Copyright (c) 2007 - 2017, Nordic Semiconductor ASA +Copyright (c) 2007 - 2018, Nordic Semiconductor ASA All rights reserved. Redistribution and use in source and binary forms, with or without modification, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/doc/s112_nrf52_6.0.0_migration-document.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/doc/s112_nrf52_6.0.0_migration-document.pdf new file mode 100644 index 0000000000..6427793434 Binary files /dev/null and b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/doc/s112_nrf52_6.0.0_migration-document.pdf differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/doc/s112_nrf52_6.0.0_release-notes.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/doc/s112_nrf52_6.0.0_release-notes.pdf new file mode 100644 index 0000000000..4bbce7a9eb Binary files /dev/null and b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/doc/s112_nrf52_6.0.0_release-notes.pdf differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_err.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_err.h similarity index 90% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_err.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_err.h index 1b0b9d4435..1b4820dc3d 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_err.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_err.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -65,7 +65,9 @@ extern "C" { #define BLE_ERROR_NOT_ENABLED (NRF_ERROR_STK_BASE_NUM+0x001) /**< @ref sd_ble_enable has not been called. */ #define BLE_ERROR_INVALID_CONN_HANDLE (NRF_ERROR_STK_BASE_NUM+0x002) /**< Invalid connection handle. */ #define BLE_ERROR_INVALID_ATTR_HANDLE (NRF_ERROR_STK_BASE_NUM+0x003) /**< Invalid attribute handle. */ -#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x004) /**< Invalid role. */ +#define BLE_ERROR_INVALID_ADV_HANDLE (NRF_ERROR_STK_BASE_NUM+0x004) /**< Invalid advertising handle. */ +#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x005) /**< Invalid role. */ +#define BLE_ERROR_BLOCKED_BY_OTHER_LINKS (NRF_ERROR_STK_BASE_NUM+0x006) /**< The attempt to change link settings failed due to the scheduling of other links. */ /** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_gap.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_gap.h similarity index 76% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_gap.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_gap.h index f25cb40638..2bf80e2d10 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_gap.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_gap.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -70,7 +70,7 @@ enum BLE_GAP_SVCS SD_BLE_GAP_DEVICE_IDENTITIES_SET = BLE_GAP_SVC_BASE + 3, /**< Set device identity list. */ SD_BLE_GAP_PRIVACY_SET = BLE_GAP_SVC_BASE + 4, /**< Set Privacy settings*/ SD_BLE_GAP_PRIVACY_GET = BLE_GAP_SVC_BASE + 5, /**< Get Privacy settings*/ - SD_BLE_GAP_ADV_DATA_SET = BLE_GAP_SVC_BASE + 6, /**< Set Advertising Data. */ + SD_BLE_GAP_ADV_SET_CONFIGURE = BLE_GAP_SVC_BASE + 6, /**< Configure an advertising set. */ SD_BLE_GAP_ADV_START = BLE_GAP_SVC_BASE + 7, /**< Start Advertising. */ SD_BLE_GAP_ADV_STOP = BLE_GAP_SVC_BASE + 8, /**< Stop Advertising. */ SD_BLE_GAP_CONN_PARAM_UPDATE = BLE_GAP_SVC_BASE + 9, /**< Connection Parameter Update. */ @@ -119,6 +119,7 @@ enum BLE_GAP_EVTS BLE_GAP_EVT_SCAN_REQ_REPORT = BLE_GAP_EVT_BASE + 16, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ BLE_GAP_EVT_PHY_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 17, /**< PHY Update Request. \n Reply with @ref sd_ble_gap_phy_update. \n See @ref ble_gap_evt_phy_update_request_t. */ BLE_GAP_EVT_PHY_UPDATE = BLE_GAP_EVT_BASE + 18, /**< PHY Update Procedure is complete. \n See @ref ble_gap_evt_phy_update_t. */ + BLE_GAP_EVT_ADV_SET_TERMINATED = BLE_GAP_EVT_BASE + 22, /**< Advertising set terminated. \n See @ref ble_gap_evt_adv_set_terminated_t. */ }; /**@brief GAP Option IDs. @@ -129,9 +130,8 @@ enum BLE_GAP_OPTS BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ BLE_GAP_OPT_LOCAL_CONN_LATENCY = BLE_GAP_OPT_BASE + 1, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ BLE_GAP_OPT_PASSKEY = BLE_GAP_OPT_BASE + 2, /**< Set passkey. @ref ble_gap_opt_passkey_t */ - BLE_GAP_OPT_SCAN_REQ_REPORT = BLE_GAP_OPT_BASE + 3, /**< Scan request report. @ref ble_gap_opt_scan_req_report_t */ - BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT = BLE_GAP_OPT_BASE + 5, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ - BLE_GAP_OPT_SLAVE_LATENCY_DISABLE = BLE_GAP_OPT_BASE + 6, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ + BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT = BLE_GAP_OPT_BASE + 4, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ + BLE_GAP_OPT_SLAVE_LATENCY_DISABLE = BLE_GAP_OPT_BASE + 5, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ }; /**@brief GAP Configuration IDs. @@ -140,8 +140,16 @@ enum BLE_GAP_OPTS */ enum BLE_GAP_CFGS { - BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ - BLE_GAP_CFG_DEVICE_NAME = BLE_GAP_CFG_BASE + 1, /**< Device name configuration. */ + BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ + BLE_GAP_CFG_DEVICE_NAME = BLE_GAP_CFG_BASE + 1, /**< Device name configuration. */ +}; + +/**@brief GAP TX Power roles. + */ +enum BLE_GAP_TX_POWER_ROLES +{ + BLE_GAP_TX_POWER_ROLE_ADV = 1, /**< Advertiser role. */ + BLE_GAP_TX_POWER_ROLE_CONN = 3, /**< Connection role. */ }; /** @} */ @@ -169,7 +177,6 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_TIMEOUT_SOURCES GAP Timeout sources * @{ */ -#define BLE_GAP_TIMEOUT_SRC_ADVERTISING 0x00 /**< Advertising timeout. */ #define BLE_GAP_TIMEOUT_SRC_CONN 0x02 /**< Connection timeout. */ #define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x03 /**< Authenticated payload timeout. */ /**@} */ @@ -177,8 +184,8 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_ADDR_TYPES GAP Address types * @{ */ -#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public address. */ -#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static address. */ +#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public (identity) address.*/ +#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static (identity) address. */ #define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE 0x02 /**< Random private resolvable address. */ #define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE 0x03 /**< Random private non-resolvable address. */ /**@} */ @@ -193,7 +200,6 @@ enum BLE_GAP_CFGS /** @brief BLE address length. */ #define BLE_GAP_ADDR_LEN (6) - /**@defgroup BLE_GAP_PRIVACY_MODES Privacy modes * @{ */ #define BLE_GAP_PRIVACY_MODE_OFF 0x00 /**< Device will send and accept its identity address for its own address. */ @@ -203,6 +209,31 @@ enum BLE_GAP_CFGS the peer IRK is exchanged, non-zero and added to the identity list. */ /**@} */ +/** @brief Invalid power level. */ +#define BLE_GAP_POWER_LEVEL_INVALID 127 + +/** @brief Advertising set handle not set. */ +#define BLE_GAP_ADV_SET_HANDLE_NOT_SET (0xFF) + +/** @brief The default number of advertising sets. */ +#define BLE_GAP_ADV_SET_COUNT_DEFAULT (1) + +/** @brief The maximum number of advertising sets supported by this SoftDevice. */ +#define BLE_GAP_ADV_SET_COUNT_MAX (1) + +/**@defgroup BLE_GAP_ADV_SET_DATA_SIZES Advertising data sizes. + * @{ */ +#define BLE_GAP_ADV_SET_DATA_SIZE_MAX (31) /**< Maximum data length for an advertising set. */ +/**@}. */ + +/** @brief Set ID not available in advertising report. */ +#define BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE 0xFF + +/**@defgroup BLE_GAP_EVT_ADV_SET_TERMINATED_REASON GAP Advertising Set Terminated reasons + * @{ */ +#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_TIMEOUT 0x01 /**< Timeout value reached. */ +#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_LIMIT_REACHED 0x02 /**< @ref ble_gap_adv_params_t::max_adv_evts was reached. */ +/**@} */ /**@defgroup BLE_GAP_AD_TYPE_DEFINITIONS GAP Advertising and Scan Response Data format * @note Found at https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm @@ -258,24 +289,40 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_ADV_INTERVALS GAP Advertising interval max and min * @{ */ -#define BLE_GAP_ADV_INTERVAL_MIN 0x0020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ -#define BLE_GAP_ADV_INTERVAL_MAX 0x4000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. */ +#define BLE_GAP_ADV_INTERVAL_MIN 0x000020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ +#define BLE_GAP_ADV_INTERVAL_MAX 0x004000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. + @note Support for values above @ref BLE_GAP_ADV_INTERVAL_MAX + is experimental. Values above 0xFFFFFF, i.e 10,485.759375 s + are not supported. */ /**@} */ -/**@brief Maximum size of advertising data in octets. */ -#define BLE_GAP_ADV_MAX_SIZE (31) - /**@defgroup BLE_GAP_ADV_TYPES GAP Advertising types + * + * Advertising types defined in Bluetooth Core Specification v5.0, Vol 6, Part B, Section 4.4.2. + * + * The maximum advertising data length is defined by @ref BLE_GAP_ADV_SET_DATA_SIZE_MAX. + * Note that some of the advertising types do not support advertising data. Non-scannable types do not support + * scan response data. + * + * @note Extended advertising is not supported in this SoftDevice. * @{ */ -#define BLE_GAP_ADV_TYPE_ADV_IND 0x00 /**< Connectable undirected. */ -#define BLE_GAP_ADV_TYPE_ADV_DIRECT_IND 0x01 /**< Connectable directed. */ -#define BLE_GAP_ADV_TYPE_ADV_SCAN_IND 0x02 /**< Scannable undirected. */ -#define BLE_GAP_ADV_TYPE_ADV_NONCONN_IND 0x03 /**< Non connectable undirected. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED 0x01 /**< Connectable and scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE 0x02 /**< Connectable non-scannable directed advertising + events. Advertising interval is less that 3.75 ms. + Use this type for fast reconnections. + @note Advertising data is not supported. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED 0x03 /**< Connectable non-scannable directed advertising + events. + @note Advertising data is not supported. */ +#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x04 /**< Non-connectable scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x05 /**< Non-connectable non-scannable undirected + advertising events. */ /**@} */ - /**@defgroup BLE_GAP_ADV_FILTER_POLICIES GAP Advertising filter policies * @{ */ #define BLE_GAP_ADV_FP_ANY 0x00 /**< Allow scan requests and connect requests from any device. */ @@ -285,10 +332,12 @@ enum BLE_GAP_CFGS /**@} */ -/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values +/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values in 10 ms units * @{ */ -#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (180) /**< Maximum advertising time in limited discoverable mode (TGAP(lim_adv_timeout) = 180 s). */ -#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. */ +#define BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX (128) /**< Maximum high duty advertising time in 10 ms units. Corresponds to 1.28 s. */ +#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (18000) /**< Maximum advertising time in 10 ms units corresponding to TGAP(lim_adv_timeout) = 180 s in limited discoverable mode. */ +#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. + For high duty cycle advertising, this corresponds to @ref BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX. */ /**@} */ @@ -393,6 +442,10 @@ enum BLE_GAP_CFGS #define BLE_GAP_PHY_1MBPS 0x01 /**< 1 Mbps PHY. */ #define BLE_GAP_PHY_2MBPS 0x02 /**< 2 Mbps PHY. */ #define BLE_GAP_PHY_CODED 0x04 /**< Coded PHY. */ +#define BLE_GAP_PHY_NOT_SET 0xFF /**< PHY is not configured. */ + +/**@brief Supported PHYs in connections and for advertising. */ +#define BLE_GAP_PHYS_SUPPORTED (BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS) /**< All PHYs except @ref BLE_GAP_PHY_CODED are supported. */ /**@} */ @@ -451,8 +504,8 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_EVENT_LENGTH GAP event length defines. * @{ */ -#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ -#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ +#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ +#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ /**@} */ @@ -474,12 +527,23 @@ enum BLE_GAP_CFGS * @{ */ #define BLE_GAP_SEC_MODE 0x00 /**< No key (may be used to reject). */ /**@} */ + /** @} */ /**@addtogroup BLE_GAP_STRUCTURES Structures * @{ */ +/**@brief Advertising event properties. */ +typedef struct +{ + uint8_t type; /**< Advertising type. See @ref BLE_GAP_ADV_TYPES. */ + uint8_t anonymous : 1; /**< This feature is not supported on this SoftDevice. */ + uint8_t include_tx_power : 1; /**< This feature is not supported on this SoftDevice. */ +} ble_gap_adv_properties_t; + + + /**@brief Bluetooth Low Energy address. */ typedef struct { @@ -542,33 +606,88 @@ typedef struct } ble_gap_irk_t; -/**@brief Channel mask for RF channels used in advertising. */ -typedef struct -{ - uint8_t ch_37_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 37 */ - uint8_t ch_38_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 38 */ - uint8_t ch_39_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 39 */ -} ble_gap_adv_ch_mask_t; +/**@brief Channel mask (40 bits). + * Every channel is represented with a bit positioned as per channel index defined in Bluetooth Core Specification v5.0, + * Vol 6, Part B, Section 1.4.1. The LSB contained in array element 0 represents channel index 0, and bit 39 represents + * channel index 39. If a bit is set to 1, the channel is not used. + */ +typedef uint8_t ble_gap_ch_mask_t[5]; /**@brief GAP advertising parameters. */ typedef struct { - uint8_t type; /**< See @ref BLE_GAP_ADV_TYPES. */ - ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. - - When privacy is enabled and the local device use @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, the device identity list is searched for a matching - entry. If the local IRK for that device identity is set, the local IRK for that device will be used to generate the advertiser address field in the advertise packet. - - If type is @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this must be set to the targeted initiator. If the initiator is in the device identity list, - the peer IRK for that device will be used to generate the initiator address field in the ADV_DIRECT_IND packet. */ - uint8_t fp; /**< Filter Policy, see @ref BLE_GAP_ADV_FILTER_POLICIES. */ - uint16_t interval; /**< Advertising interval between 0x0020 and 0x4000 in 0.625 ms units (20 ms to 10.24 s), see @ref BLE_GAP_ADV_INTERVALS. - - If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this parameter must be set to 0 for high duty cycle directed advertising. - - If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, set @ref BLE_GAP_ADV_INTERVAL_MIN <= interval <= @ref BLE_GAP_ADV_INTERVAL_MAX for low duty cycle advertising.*/ - uint16_t timeout; /**< Advertising timeout between 0x0001 and 0x3FFF in seconds, 0x0000 disables timeout. See also @ref BLE_GAP_ADV_TIMEOUT_VALUES. If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this parameter must be set to 0 for High duty cycle directed advertising. */ - ble_gap_adv_ch_mask_t channel_mask; /**< Advertising channel mask. See @ref ble_gap_adv_ch_mask_t. */ + ble_gap_adv_properties_t properties; /**< The properties of the advertising events. */ + ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. + - When privacy is enabled and the local device uses + @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, + the device identity list is searched for a matching entry. If + the local IRK for that device identity is set, the local IRK + for that device will be used to generate the advertiser address + field in the advertising packet. + - If @ref ble_gap_adv_properties_t::type is directed, this must be + set to the targeted scanner or initiator. If the peer address is + in the device identity list, the peer IRK for that device will be + used to generate @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE + target addresses used in the advertising event PDUs. */ + uint32_t interval; /**< Advertising interval in 625 us units. @sa BLE_GAP_ADV_INTERVALS. + @note If @ref ble_gap_adv_properties_t::type is set to + @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE + advertising, this parameter is ignored. */ + uint16_t duration; /**< Advertising duration in 10 ms units. When timeout is reached, + an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. + @sa BLE_GAP_ADV_TIMEOUT_VALUES. */ + uint8_t max_adv_evts; /**< Maximum advertising events that shall be sent prior to disabling + advertising. Setting the value to 0 disables the limitation. When + the count of advertising events specified by this parameter + (if not 0) is reached, advertising will be automatically stopped + and an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised + @note If @ref ble_gap_adv_properties_t::type is set to + @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE, + this parameter is ignored. + @note Setting max_adv_evts to a values not equal to 0 is only supported + as an experimental feature in this SoftDevice. */ + ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary channels. + At least one of the primary channels, that is channel index 37-39, must be used. */ + uint8_t filter_policy; /**< Filter Policy. @sa BLE_GAP_ADV_FILTER_POLICIES. */ + uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising channel packets + are transmitted. If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS + will be used. + The only supported value by this SoftDevice is @ref BLE_GAP_PHY_1MBPS. */ + uint8_t secondary_phy; /**< This field is ignored on this SoftDevice. */ + uint8_t set_id:4; /**< This field is ignored on this SoftDevice. */ + uint8_t scan_req_notification:1; /**< Enable scan request notifications for this advertising set. When a + scan request is received and the scanner address is allowed + by the filter policy, @ref BLE_GAP_EVT_SCAN_REQ_REPORT is raised. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is a non-scannable + advertising type. */ } ble_gap_adv_params_t; +/**@brief GAP advertising data buffers. + * + * The application must provide the buffers for advertisement. The memory shall reside in application RAM, and + * shall never be modified while advertising. The data shall be kept alive until either: + * - @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. + * - @ref BLE_GAP_EVT_CONNECTED is raised with @ref ble_gap_evt_connected_t::adv_handle set to the corresponding + * advertising handle. + * - Advertising is stopped. + * - Advertising data is changed. + * To update advertising data while advertising, provide new buffers to @ref sd_ble_gap_adv_set_configure. */ +typedef struct +{ + ble_data_t adv_data; /**< Advertising data. + @note + Advertising data can only be specified for a @ref ble_gap_adv_properties_t::type + that is allowed to contain advertising data. */ + ble_data_t scan_rsp_data; /**< Scan response data. + @note + Scan response data can only be specified for a @ref ble_gap_adv_properties_t::type + that is scannable. */ +} ble_gap_adv_data_t; + + /**@brief Privacy. * * The privacy feature provides a way for the device to avoid being tracked over a period of time. @@ -696,6 +815,12 @@ typedef struct and the address is the device's identity address. */ uint8_t role; /**< BLE role for this connection, see @ref BLE_GAP_ROLES */ ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ + uint8_t adv_handle; /**< Advertising handle in which advertising has ended. + This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ + ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated + advertising set. The advertising buffers provided in + @ref sd_ble_gap_adv_set_configure are now released. + This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ } ble_gap_evt_connected_t; @@ -853,9 +978,22 @@ typedef struct /**@brief Event structure for @ref BLE_GAP_EVT_RSSI_CHANGED. */ typedef struct { - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ + int8_t rssi; /**< Received Signal Strength Indication in dBm. */ + uint8_t ch_index; /**< Data Channel Index on which the Signal Strength is measured (0-36). */ } ble_gap_evt_rssi_changed_t; +/**@brief Event structure for @ref BLE_GAP_EVT_ADV_SET_TERMINATED */ +typedef struct +{ + uint8_t reason; /**< Reason for why the advertising set terminated. See + @ref BLE_GAP_EVT_ADV_SET_TERMINATED_REASON. */ + uint8_t adv_handle; /**< Advertising handle in which advertising has ended. */ + uint8_t num_completed_adv_events; /**< If @ref ble_gap_adv_params_t::max_adv_evts was not set to 0, + this field indicates the number of completed advertising events. */ + ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated + advertising set. The advertising buffers provided in + @ref sd_ble_gap_adv_set_configure are now released. */ +} ble_gap_evt_adv_set_terminated_t; /**@brief Event structure for @ref BLE_GAP_EVT_SEC_REQUEST. */ typedef struct @@ -870,12 +1008,14 @@ typedef struct /**@brief Event structure for @ref BLE_GAP_EVT_SCAN_REQ_REPORT. */ typedef struct { + uint8_t adv_handle; /**< Advertising handle for the advertising set which received the Scan Request */ int8_t rssi; /**< Received Signal Strength Indication in dBm. */ ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 and the address is the device's identity address. */ } ble_gap_evt_scan_req_report_t; + /**@brief GAP event structure. */ typedef struct { @@ -895,6 +1035,7 @@ typedef struct ble_gap_evt_conn_sec_update_t conn_sec_update; /**< Connection Security Update Event Parameters. */ ble_gap_evt_timeout_t timeout; /**< Timeout Event Parameters. */ ble_gap_evt_rssi_changed_t rssi_changed; /**< RSSI Event Parameters. */ + ble_gap_evt_adv_set_terminated_t adv_set_terminated; /**< Advertising Set Terminated Event Parameters. */ ble_gap_evt_sec_request_t sec_request; /**< Security Request Event Parameters. */ ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report Parameters. */ ble_gap_evt_phy_update_request_t phy_update_request; /**< PHY Update Request Event Parameters. */ @@ -930,9 +1071,13 @@ typedef struct * @retval ::NRF_ERROR_CONN_COUNT The periph_role_count is too large. The maximum * supported sum of concurrent connections is * @ref BLE_GAP_ROLE_COUNT_COMBINED_MAX. + * @retval ::NRF_ERROR_RESOURCES The adv_set_count is too large. The maximum + * supported advertising handles is + * @ref BLE_GAP_ADV_SET_COUNT_MAX. */ typedef struct { + uint8_t adv_set_count; /**< Maximum number of advertising sets. Default value is @ref BLE_GAP_ADV_SET_COUNT_DEFAULT. */ uint8_t periph_role_count; /**< Maximum number of connections concurrently acting as a peripheral. Default value is @ref BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT. */ } ble_gap_cfg_role_count_t; @@ -984,24 +1129,27 @@ typedef union /**@brief Channel Map option. - * Used with @ref sd_ble_opt_get to get the current channel map - * or @ref sd_ble_opt_set to set a new channel map. When setting the - * channel map, it applies to all current and future connections. When getting the - * current channel map, it applies to a single connection and the connection handle - * must be supplied. * - * @note Setting the channel map may take some time, depending on connection parameters. - * The time taken may be different for each connection and the get operation will - * return the previous channel map until the new one has taken effect. + * @details Used with @ref sd_ble_opt_get to get the current channel map + * or @ref sd_ble_opt_set to set a new channel map. When setting the + * channel map, it applies to all current and future connections. When getting the + * current channel map, it applies to a single connection and the connection handle + * must be supplied. * - * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. - * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. + * @note Setting the channel map may take some time, depending on connection parameters. + * The time taken may be different for each connection and the get operation will + * return the previous channel map until the new one has taken effect. + * + * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. + * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. * * @retval ::NRF_SUCCESS Get or set successful. + * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: + * - Less then two bits in @ref ch_map are set. + * - Bits for primary advertising channels (37-39) are set. * @retval ::NRF_ERROR_BUSY Channel map was set again before enough time had passed. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied for get. - * @retval ::NRF_ERROR_NOT_SUPPORTED Returned by sd_ble_opt_set in peripheral-only SoftDevices. + * @retval ::NRF_ERROR_NOT_SUPPORTED Returned by @ref sd_ble_opt_set in peripheral-only SoftDevices. * */ typedef struct @@ -1013,21 +1161,21 @@ typedef struct /**@brief Local connection latency option. * - * Local connection latency is a feature which enables the slave to improve - * current consumption by ignoring the slave latency set by the peer. The - * local connection latency can only be set to a multiple of the slave latency, - * and cannot be longer than half of the supervision timeout. + * @details Local connection latency is a feature which enables the slave to improve + * current consumption by ignoring the slave latency set by the peer. The + * local connection latency can only be set to a multiple of the slave latency, + * and cannot be longer than half of the supervision timeout. * - * Used with @ref sd_ble_opt_set to set the local connection latency. The - * @ref sd_ble_opt_get is not supported for this option, but the actual - * local connection latency (unless set to NULL) is set as a return parameter - * when setting the option. + * @details Used with @ref sd_ble_opt_set to set the local connection latency. The + * @ref sd_ble_opt_get is not supported for this option, but the actual + * local connection latency (unless set to NULL) is set as a return parameter + * when setting the option. * - * @note The latency set will be truncated down to the closest slave latency event - * multiple, or the nearest multiple before half of the supervision timeout. + * @note The latency set will be truncated down to the closest slave latency event + * multiple, or the nearest multiple before half of the supervision timeout. * - * @note The local connection latency is disabled by default, and needs to be enabled for new - * connections and whenever the connection is updated. + * @note The local connection latency is disabled by default, and needs to be enabled for new + * connections and whenever the connection is updated. * * @retval ::NRF_SUCCESS Set successfully. * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. @@ -1042,8 +1190,9 @@ typedef struct /**@brief Disable slave latency * - * Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. - * When disabled, the peripheral will ignore the slave_latency set by the central. + * @details Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection + * (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. When disabled, the + * peripheral will ignore the slave_latency set by the central. * * @note Shall only be called on peripheral links. * @@ -1059,13 +1208,13 @@ typedef struct /**@brief Passkey Option. * - * Structure containing the passkey to be used during pairing. This can be used with @ref - * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication - * instead of generating a random one. + * @details Structure containing the passkey to be used during pairing. This can be used with @ref + * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication + * instead of generating a random one. * - * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. + * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. * - * @note @ref sd_ble_opt_get is not supported for this option. + * @note @ref sd_ble_opt_get is not supported for this option. * */ typedef struct @@ -1074,39 +1223,20 @@ typedef struct } ble_gap_opt_passkey_t; -/**@brief Scan request report option. - * - * This can be used with @ref sd_ble_opt_set to make the SoftDevice send - * @ref BLE_GAP_EVT_SCAN_REQ_REPORT events. - * - * @note Due to the limited space reserved for scan request report events, - * not all received scan requests will be reported. - * - * @note If whitelisting is used, only whitelisted requests are reported. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_STATE When advertising is ongoing while the option is set. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable scan request reports. */ -} ble_gap_opt_scan_req_report_t; - - /**@brief Authenticated payload timeout option. * - * This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other - * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. + * @details This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other + * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. * - * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated - * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted - * link. + * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated + * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted + * link. * - * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance - * to reset the timer. In addition the stack will try to prioritize running of LE ping over other - * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects - * on other activities, it is recommended to use high timeout values. - * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). + * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance + * to reset the timer. In addition the stack will try to prioritize running of LE ping over other + * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects + * on other activities, it is recommended to use high timeout values. + * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). * * @retval ::NRF_SUCCESS Set successfully. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. auth_payload_timeout was outside of allowed range. @@ -1118,14 +1248,12 @@ typedef struct uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit, see @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT. */ } ble_gap_opt_auth_payload_timeout_t; - /**@brief Option structure for GAP options. */ typedef union { ble_gap_opt_ch_map_t ch_map; /**< Parameters for the Channel Map option. */ ble_gap_opt_local_conn_latency_t local_conn_latency; /**< Parameters for the Local connection latency option */ ble_gap_opt_passkey_t passkey; /**< Parameters for the Passkey option.*/ - ble_gap_opt_scan_req_report_t scan_req_report; /**< Parameters for the scan request report option.*/ ble_gap_opt_auth_payload_timeout_t auth_payload_timeout; /**< Parameters for the authenticated payload timeout option.*/ ble_gap_opt_slave_latency_disable_t slave_latency_disable; /**< Parameters for the Disable slave latency option */ } ble_gap_opt_t; @@ -1263,36 +1391,50 @@ SVCALL(SD_BLE_GAP_PRIVACY_SET, uint32_t, sd_ble_gap_privacy_set(ble_gap_privacy_ SVCALL(SD_BLE_GAP_PRIVACY_GET, uint32_t, sd_ble_gap_privacy_get(ble_gap_privacy_params_t *p_privacy_params)); -/**@brief Set, clear or update advertising and scan response data. +/**@brief Configure an advertising set. Set, clear or update advertising and scan response data. * * @note The format of the advertising data will be checked by this call to ensure interoperability. * Limitations imposed by this API call to the data provided include having a flags data type in the scan response data and * duplicating the local name in the advertising data and scan response data. * - * @note To clear the advertising data and set it to a 0-length packet, simply provide a valid pointer (p_data/p_sr_data) with its corresponding - * length (dlen/srdlen) set to 0. - * - * @note The call will fail if p_data and p_sr_data are both NULL since this would have no effect. + * @note In order to update advertising data while advertising, new advertising buffers must be provided. * * @mscs * @mmsc{@ref BLE_GAP_ADV_MSC} * @endmscs * - * @param[in] p_data Raw data to be placed in advertising packet. If NULL, no changes are made to the current advertising packet data. - * @param[in] dlen Data length for p_data. Max size: @ref BLE_GAP_ADV_MAX_SIZE octets. Should be 0 if p_data is NULL, can be 0 if p_data is not NULL. - * @param[in] p_sr_data Raw data to be placed in scan response packet. If NULL, no changes are made to the current scan response packet data. - * @param[in] srdlen Data length for p_sr_data. Max size: @ref BLE_GAP_ADV_MAX_SIZE octets. Should be 0 if p_sr_data is NULL, can be 0 if p_data is not NULL. + * @param[in,out] p_adv_handle Provide a pointer to a handle containing @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to configure + * a new advertising set. On success, a new handle is then returned through the pointer. + * Provide a pointer to an existing advertising handle to configure an existing advertising set. + * @param[in] p_adv_data Advertising data. If set to NULL, no advertising data will be used. See @ref ble_gap_adv_data_t. + * @param[in] p_adv_params Advertising parameters. When this function is used to update advertising data while advertising, + * this parameter must be NULL. See @ref ble_gap_adv_params_t. * - * @retval ::NRF_SUCCESS Advertising data successfully updated or cleared. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, both p_data and p_sr_data cannot be NULL. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. - * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied, check the advertising data format specification. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data type. + * @retval ::NRF_SUCCESS Advertising set successfully configured. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: + * - Invalid advertising data configuration specified. See @ref ble_gap_adv_data_t. + * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. + * - Use of whitelist requested but whitelist has not been set, + * see @ref sd_ble_gap_whitelist_set. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR ble_gap_adv_params_t::p_peer_addr is invalid. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. + * - It is invalid to provide non-NULL advertising set parameters while advertising. + * - It is invalid to provide the same data buffers while advertising. To update + * advertising data, provide new advertising buffers. + * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE The provided advertising handle was not found. Use @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to + * configure a new advertising handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. + * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied. Check the advertising data format specification + * given in Bluetooth Specification Version 5.0, Volume 3, Part C, Chapter 11. + * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data length or advertising parameter configuration. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to configure a new advertising handle. Update an + * existing advertising handle instead. * @retval ::BLE_ERROR_GAP_UUID_LIST_MISMATCH Invalid UUID list supplied. */ -SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const *p_data, uint8_t dlen, uint8_t const *p_sr_data, uint8_t srdlen)); +SVCALL(SD_BLE_GAP_ADV_SET_CONFIGURE, uint32_t, sd_ble_gap_adv_set_configure(uint8_t *p_adv_handle, ble_gap_adv_data_t const *p_adv_data, ble_gap_adv_params_t const *p_adv_params)); /**@brief Start advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). @@ -1301,7 +1443,8 @@ SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const * * @events * @event{@ref BLE_GAP_EVT_CONNECTED, Generated after connection has been established through connectable advertising.} - * @event{@ref BLE_GAP_EVT_TIMEOUT, Advertisement has timed out.} + * @event{@ref BLE_GAP_EVT_ADV_SET_TERMINATED, Advertising set has terminated.} + * @event{@ref BLE_GAP_EVT_SCAN_REQ_REPORT, A scan request was received.} * @endevents * * @mscs @@ -1310,23 +1453,31 @@ SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} * @endmscs * - * @param[in] p_adv_params Pointer to advertising parameters structure. + * @param[in] adv_handle Advertising handle to advertise on, received from @ref sd_ble_gap_adv_set_configure. * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or - * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. If - * @ref ble_gap_adv_params_t::type is @ref BLE_GAP_ADV_TYPE_ADV_NONCONN_IND, - * this is ignored. + * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. For non-connectable + * advertising, this is ignored. * - * @retval ::NRF_SUCCESS The BLE stack has started advertising. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check the accepted ranges and limits. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Bluetooth address supplied. - * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Peripheral or Broadcaster) and try again + * @retval ::NRF_SUCCESS The BLE stack has started advertising. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. adv_handle is not configured or already advertising. + * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. Configure a new adveriting handle with @ref sd_ble_gap_adv_set_configure. + * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: + * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. + * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. + * @retval ::NRF_ERROR_RESOURCES Either: + * - adv_handle is configured with connectable advertising, but the event_length parameter + * associated with conn_cfg_tag is too small to be able to establish a connection on + * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. + * - Not enough BLE role slots available. + * Stop one or more currently active roles (Peripheral or Broadcaster) and try again + * - p_adv_params is configured with connectable advertising, but the event_length parameter + * associated with conn_cfg_tag is too small to be able to establish a connection on + * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. */ -SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(ble_gap_adv_params_t const *p_adv_params, uint8_t conn_cfg_tag)); +SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(uint8_t adv_handle, uint8_t conn_cfg_tag)); /**@brief Stop advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). @@ -1335,10 +1486,13 @@ SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(ble_gap_adv_params_t * @mmsc{@ref BLE_GAP_ADV_MSC} * @endmscs * + * @param[in] adv_handle The advertising handle that should stop advertising. + * * @retval ::NRF_SUCCESS The BLE stack has stopped advertising. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation (most probably not in advertising state). + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Invalid advertising handle. + * @retval ::NRF_ERROR_INVALID_STATE The advertising handle is not advertising. */ -SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(void)); +SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(uint8_t adv_handle)); @@ -1397,12 +1551,27 @@ SVCALL(SD_BLE_GAP_DISCONNECT, uint32_t, sd_ble_gap_disconnect(uint16_t conn_hand /**@brief Set the radio's transmit power. * - * @param[in] tx_power Radio transmit power in dBm (accepted values are -40, -20, -16, -12, -8, -4, 0, 3, and 4 dBm). + * @param[in] role The role to set the transmit power for, see @ref BLE_GAP_TX_POWER_ROLES for + * possible roles. + * @param[in] handle The handle parameter is interpreted depending on role: + * - If role is @ref BLE_GAP_TX_POWER_ROLE_CONN, this value is the specific connection handle. + * - If role is @ref BLE_GAP_TX_POWER_ROLE_ADV, the advertising set identified with the advertising handle, + * will use the specified transmit power, and include it in the advertising packet headers if + * @ref ble_gap_adv_properties_t::include_tx_power set. + * - For all other roles handle is ignored. + * @param[in] tx_power Radio transmit power in dBm (see note for accepted values). + * + * @note Supported tx_power values: -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +3dBm and +4dBm. + * @note The initiator will have the same transmit power as the scanner. + * @note When a connection is created it will inherit the transmit power from the initiator or + * advertiser leading to the connection. * * @retval ::NRF_SUCCESS Successfully changed the transmit power. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. */ -SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(int8_t tx_power)); +SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(uint8_t role, uint16_t handle, int8_t tx_power)); /**@brief Set GAP Appearance value. @@ -1744,7 +1913,7 @@ SVCALL(SD_BLE_GAP_CONN_SEC_GET, uint32_t, sd_ble_gap_conn_sec_get(uint16_t conn_ * @param[in] skip_count Number of RSSI samples with a change of threshold_dbm or more before sending a new @ref BLE_GAP_EVT_RSSI_CHANGED event. * * @retval ::NRF_SUCCESS Successfully activated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress. Invalid state to perform operation. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is already ongoing. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. */ SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_handle, uint8_t threshold_dbm, uint8_t skip_count)); @@ -1763,7 +1932,7 @@ SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_hand * @param[in] conn_handle Connection handle. * * @retval ::NRF_SUCCESS Successfully deactivated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. */ SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle)); @@ -1773,21 +1942,21 @@ SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle * * @ref sd_ble_gap_rssi_start must be called to start reporting RSSI before using this function. @ref NRF_ERROR_NOT_FOUND * will be returned until RSSI was sampled for the first time after calling @ref sd_ble_gap_rssi_start. - * * @mscs * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} * @endmscs * * @param[in] conn_handle Connection handle. * @param[out] p_rssi Pointer to the location where the RSSI measurement shall be stored. + * @param[out] p_ch_index Pointer to the location where Channel Index for the RSSI measurement shall be stored. * * @retval ::NRF_SUCCESS Successfully read the RSSI. * @retval ::NRF_ERROR_NOT_FOUND No sample is available. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing, or disconnection in progress. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. */ -SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi)); +SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi, uint8_t *p_ch_index)); /**@brief Initiate or respond to a PHY Update Procedure @@ -1799,12 +1968,17 @@ SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, * currently active PHYs in the respective directions, the SoftDevice will generate a * @ref BLE_GAP_EVT_PHY_UPDATE with the current PHYs set and will not initiate the * procedure in the Link Layer. - * If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys is - * @ref BLE_GAP_PHY_AUTO, then the stack will select a PHY for the respective direction - * based on the peer's PHY preferences and the local stack configuration. + * + * If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys is @ref BLE_GAP_PHY_AUTO, + * then the stack will select PHYs based on the peer's PHY preferences and the local link + * configuration. The PHY Update procedure will for this case result in a PHY combination + * that respects the time constraints configured with @ref sd_ble_cfg_set and the current + * link layer data length. + * * If the peer does not support the PHY Update Procedure, then the resulting * @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to * @ref BLE_HCI_UNSUPPORTED_REMOTE_FEATURE. + * * If the PHY procedure was rejected by the peer due to a procedure collision, the status * will be @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or * @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION. @@ -1827,7 +2001,8 @@ SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, * @retval ::NRF_SUCCESS Successfully requested a PHY Update. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Unsupported PHYs supplied to the call. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. * @retval ::NRF_ERROR_BUSY Procedure is already in progress or not allowed at this time. Process pending events and wait for the pending procedure to complete and retry. * @@ -1835,6 +2010,7 @@ SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)); + /** @} */ #ifdef __cplusplus diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_gatt.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_gatt.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_gatt.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_gatt.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gattc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_gattc.h similarity index 95% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gattc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_gattc.h index 191f3a85ea..7fb3920244 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gattc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_gattc.h @@ -45,12 +45,14 @@ #ifndef BLE_GATTC_H__ #define BLE_GATTC_H__ -#include "ble_gatt.h" -#include "ble_types.h" -#include "ble_ranges.h" +#include +#include "nrf.h" #include "nrf_svc.h" #include "nrf_error.h" -#include "nrf.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" +#include "ble_gatt.h" #ifdef __cplusplus extern "C" { @@ -372,6 +374,7 @@ typedef struct * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_services_discover(uint16_t conn_handle, uint16_t start_handle, ble_uuid_t const *p_srvc_uuid)); @@ -398,6 +401,7 @@ SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_se * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); @@ -426,6 +430,7 @@ SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteristics_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); @@ -451,6 +456,7 @@ SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteris * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); @@ -477,6 +483,7 @@ SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_dis * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle, ble_uuid_t const *p_uuid, ble_gattc_handle_range_t const *p_handle_range)); @@ -503,6 +510,7 @@ SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_b * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint16_t handle, uint16_t offset)); @@ -528,6 +536,7 @@ SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(uint16_t conn_handle, uint16_t const *p_handles, uint16_t handle_count)); @@ -574,6 +583,7 @@ SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(ui * @retval ::NRF_ERROR_BUSY For write with response, procedure already in progress. Wait for a @ref BLE_GATTC_EVT_WRITE_RSP event and retry. * @retval ::NRF_ERROR_RESOURCES Too many writes without responses queued. * Wait for a @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event and retry. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, ble_gattc_write_params_t const *p_write_params)); @@ -591,6 +601,7 @@ SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, bl * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no Indication pending to be confirmed. * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_handle, uint16_t handle)); @@ -608,6 +619,7 @@ SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_ * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * p_handle_range)); @@ -640,6 +652,7 @@ SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discove * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state or an ATT_MTU exchange was already requested once. * @retval ::NRF_ERROR_INVALID_PARAM Invalid Client RX MTU size supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, uint32_t, sd_ble_gattc_exchange_mtu_request(uint16_t conn_handle, uint16_t client_rx_mtu)); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gatts.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_gatts.h similarity index 96% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gatts.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_gatts.h index 5e8615c05d..e437b6e076 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gatts.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_gatts.h @@ -45,12 +45,15 @@ #ifndef BLE_GATTS_H__ #define BLE_GATTS_H__ -#include "ble_types.h" -#include "ble_ranges.h" -#include "ble_l2cap.h" -#include "ble_gap.h" -#include "ble_gatt.h" +#include #include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" +#include "ble_gatt.h" +#include "ble_gap.h" #ifdef __cplusplus extern "C" { @@ -286,7 +289,7 @@ typedef struct uint16_t handle; /**< Characteristic Value Handle. */ uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ uint16_t offset; /**< Offset within the attribute value. */ - uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after successful return. */ + uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after return. */ uint8_t const *p_data; /**< Actual data content, use NULL to use the current attribute value. */ } ble_gatts_hvx_params_t; @@ -546,8 +549,8 @@ SVCALL(SD_BLE_GATTS_VALUE_SET, uint32_t, sd_ble_gatts_value_set(uint16_t conn_ha /**@brief Get the value of a given attribute. * * @note If the attribute value is longer than the size of the supplied buffer, - * p_len will return the total attribute value length (excluding offset), - * and not the number of bytes actually returned in p_data. + * @ref ble_gatts_value_t::len will return the total attribute value length (excluding offset), + * and not the number of bytes actually returned in @ref ble_gatts_value_t::p_value. * The application may use this information to allocate a suitable buffer size. * * @note When retrieving system attribute values with this function, the connection handle @@ -576,7 +579,7 @@ SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_ha * @note The local attribute value may be updated even if an outgoing packet is not sent to the peer due to an error during execution. * The Attribute Table has been updated if one of the following error codes is returned: @ref NRF_ERROR_INVALID_STATE, @ref NRF_ERROR_BUSY, * @ref NRF_ERROR_FORBIDDEN, @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING and @ref NRF_ERROR_RESOURCES. - * The caller can check whether the value has been updated by looking at the contents of *(p_hvx_params->p_len). + * The caller can check whether the value has been updated by looking at the contents of *(@ref ble_gatts_hvx_params_t::p_len). * * @note Only one indication procedure can be ongoing per connection at a time. * If the application tries to indicate an attribute value while another indication procedure is ongoing, @@ -604,9 +607,12 @@ SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_ha * @mmsc{@ref BLE_GATTS_HVX_DISABLED_MSC} * @endmscs * - * @param[in] conn_handle Connection handle. - * @param[in] p_hvx_params Pointer to an HVx parameters structure. If the p_data member contains a non-NULL pointer the attribute value will be updated with - * the contents pointed by it before sending the notification or indication. + * @param[in] conn_handle Connection handle. + * @param[in,out] p_hvx_params Pointer to an HVx parameters structure. If @ref ble_gatts_hvx_params_t::p_data + * contains a non-NULL pointer the attribute value will be updated with the contents + * pointed by it before sending the notification or indication. If the attribute value + * is updated, @ref ble_gatts_hvx_params_t::p_len is updated by the SoftDevice to + * contain the number of actual bytes written, else it will be set to 0. * * @retval ::NRF_SUCCESS Successfully queued a notification or indication for transmission, and optionally updated the attribute value. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. @@ -625,6 +631,7 @@ SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_ha * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. * @retval ::NRF_ERROR_RESOURCES Too many notifications queued. * Wait for a @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event and retry. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t const *p_hvx_params)); @@ -660,6 +667,7 @@ SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_ga * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied, handles must be in the range populated by the application. * @retval ::NRF_ERROR_BUSY Procedure already in progress. * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle)); @@ -692,6 +700,7 @@ SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint * @retval ::NRF_ERROR_INVALID_PARAM Authorization op invalid, * handle supplied does not match requested handle, * or invalid data to be written provided by the application. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params)); @@ -813,7 +822,7 @@ SVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, b * @param[in] server_rx_mtu Server RX MTU size. * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration - used for this connection. + * used for this connection. * - The value must be equal to Client RX MTU size given in @ref sd_ble_gattc_exchange_mtu_request * if an ATT_MTU exchange has already been performed in the other direction. * @@ -821,6 +830,7 @@ SVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, b * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no ATT_MTU exchange request pending. * @retval ::NRF_ERROR_INVALID_PARAM Invalid Server RX MTU size supplied. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_EXCHANGE_MTU_REPLY, uint32_t, sd_ble_gatts_exchange_mtu_reply(uint16_t conn_handle, uint16_t server_rx_mtu)); /** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_hci.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_hci.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_hci.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_hci.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_ranges.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_ranges.h similarity index 93% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_ranges.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_ranges.h index 50f0d4c358..493dd43eb5 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_ranges.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_ranges.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -67,13 +67,13 @@ extern "C" { #define BLE_SVC_LAST 0x6B /**< Common BLE SVC last. */ #define BLE_GAP_SVC_BASE 0x6C /**< GAP BLE SVC base. */ -#define BLE_GAP_SVC_LAST 0x93 /**< GAP BLE SVC last. */ +#define BLE_GAP_SVC_LAST 0x9A /**< GAP BLE SVC last. */ -#define BLE_GATTC_SVC_BASE 0x94 /**< GATTC BLE SVC base. */ -#define BLE_GATTC_SVC_LAST 0x9F /**< GATTC BLE SVC last. */ +#define BLE_GATTC_SVC_BASE 0x9B /**< GATTC BLE SVC base. */ +#define BLE_GATTC_SVC_LAST 0xA7 /**< GATTC BLE SVC last. */ -#define BLE_GATTS_SVC_BASE 0xA0 /**< GATTS BLE SVC base. */ -#define BLE_GATTS_SVC_LAST 0xAF /**< GATTS BLE SVC last. */ +#define BLE_GATTS_SVC_BASE 0xA8 /**< GATTS BLE SVC base. */ +#define BLE_GATTS_SVC_LAST 0xB7 /**< GATTS BLE SVC last. */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_types.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_types.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_types.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/ble_types.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf52/nrf_mbr.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf52/nrf_mbr.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf52/nrf_mbr.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf52/nrf_mbr.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_ble.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_ble.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_ble.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_ble.h index 335e7e6db2..ad6b58f42f 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_ble.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_ble.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -49,8 +49,10 @@ #ifndef BLE_H__ #define BLE_H__ -#include "ble_ranges.h" -#include "ble_types.h" +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_err.h" #include "ble_gap.h" #include "ble_gatt.h" #include "ble_gattc.h" @@ -136,13 +138,9 @@ enum BLE_COMMON_OPTS * @note The highest value used for @ref ble_gatt_conn_cfg_t::att_mtu in any connection configuration shall be used as a parameter. * If that value has not been configured for any connections then @ref BLE_GATT_ATT_MTU_DEFAULT must be used instead. */ -#define BLE_EVT_LEN_MAX(ATT_MTU) (BLE_MAX( \ - sizeof(ble_evt_t), \ - BLE_MAX( \ - offsetof(ble_evt_t, evt.gattc_evt.params.rel_disc_rsp.includes) + ((ATT_MTU) - 2) / 6 * sizeof(ble_gattc_include_t), \ - offsetof(ble_evt_t, evt.gattc_evt.params.attr_info_disc_rsp.info.attr_info16) + ((ATT_MTU) - 2) / 4 * sizeof(ble_gattc_attr_info16_t) \ - ) \ -)) +#define BLE_EVT_LEN_MAX(ATT_MTU) ( \ + offsetof(ble_evt_t, evt.gattc_evt.params.prim_srvc_disc_rsp.services) + ((ATT_MTU) - 1) / 4 * sizeof(ble_gattc_service_t) \ +) /** @defgroup BLE_USER_MEM_TYPES User Memory Types * @{ */ @@ -301,7 +299,9 @@ typedef union * In the case that no configurations has been set, or fewer connection configurations has been set than enabled connections, * the default connection configuration will be automatically added for the remaining connections. * When creating connections with the default configuration, @ref BLE_CONN_CFG_TAG_DEFAULT should be used in - * place of @ref ble_conn_cfg_t::conn_cfg_tag. See @ref sd_ble_gap_adv_start() and sd_ble_gap_connect()" + * place of @ref ble_conn_cfg_t::conn_cfg_tag. + * + * @sa sd_ble_gap_adv_start() * * @mscs * @mmsc{@ref BLE_CONN_CFG} @@ -310,8 +310,9 @@ typedef union */ typedef struct { - uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the @ref sd_ble_gap_adv_start() and sd_ble_gap_connect() - calls to select this configuration when creating a connection. + uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the + @ref sd_ble_gap_adv_start() call + to select this configuration when creating a connection. Must be different for all connection configurations added and not @ref BLE_CONN_CFG_TAG_DEFAULT. */ union { ble_gap_conn_cfg_t gap_conn_cfg; /**< GAP connection configuration, cfg_id is @ref BLE_CONN_CFG_GAP. */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_error.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_error.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_error.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_error.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_error_sdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_error_sdm.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_error_sdm.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_error_sdm.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_error_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_error_soc.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_error_soc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_error_soc.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_nvic.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_nvic.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_nvic.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_nvic.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_sd_def.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_sd_def.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_sd_def.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_sd_def.h index 0b4d221d6a..c9ab241872 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_sd_def.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_sd_def.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_sdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_sdm.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_sdm.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_sdm.h index 60435ef9df..8c48d93678 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_sdm.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_sdm.h @@ -67,10 +67,10 @@ extern "C" { #endif /** @brief The major version for the SoftDevice binary distributed with this header file. */ -#define SD_MAJOR_VERSION (5) +#define SD_MAJOR_VERSION (6) /** @brief The minor version for the SoftDevice binary distributed with this header file. */ -#define SD_MINOR_VERSION (1) +#define SD_MINOR_VERSION (0) /** @brief The bugfix version for the SoftDevice binary distributed with this header file. */ #define SD_BUGFIX_VERSION (0) @@ -308,6 +308,7 @@ typedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info); * @retval ::NRF_ERROR_INVALID_STATE SoftDevice is already enabled, and the clock source and fault handler cannot be updated. * @retval ::NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION SoftDevice interrupt is already enabled, or an enabled interrupt has an illegal priority level. * @retval ::NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN Unknown low frequency clock source selected. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid clock source configuration supplied in p_clock_lf_cfg. */ SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lf_cfg_t const * p_clock_lf_cfg, nrf_fault_handler_t fault_handler)); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_soc.h similarity index 89% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_soc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_soc.h index ff79844817..2c4d958750 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_soc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_soc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -62,7 +62,7 @@ extern "C" { /**@brief The number of the lowest SVC number reserved for the SoC library. */ #define SOC_SVC_BASE (0x20) /**< Base value for SVCs that are available when the SoftDevice is disabled. */ -#define SOC_SVC_BASE_NOT_AVAILABLE (0x2B) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ +#define SOC_SVC_BASE_NOT_AVAILABLE (0x2C) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ /**@brief Guaranteed time for application to process radio inactive notification. */ #define NRF_RADIO_NOTIFICATION_INACTIVE_GUARANTEED_TIME_US (62) @@ -103,49 +103,50 @@ extern "C" { /**@brief The SVC numbers used by the SVC functions in the SoC library. */ enum NRF_SOC_SVCS { - SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, - SD_PPI_CHANNEL_ENABLE_SET, - SD_PPI_CHANNEL_ENABLE_CLR, - SD_PPI_CHANNEL_ASSIGN, - SD_PPI_GROUP_TASK_ENABLE, - SD_PPI_GROUP_TASK_DISABLE, - SD_PPI_GROUP_ASSIGN, - SD_PPI_GROUP_GET, - SD_FLASH_PAGE_ERASE, - SD_FLASH_WRITE, - SD_FLASH_PROTECT, - SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, - SD_MUTEX_ACQUIRE, - SD_MUTEX_RELEASE, - SD_RAND_APPLICATION_POOL_CAPACITY_GET, - SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, - SD_RAND_APPLICATION_VECTOR_GET, - SD_POWER_MODE_SET, - SD_POWER_SYSTEM_OFF, - SD_POWER_RESET_REASON_GET, - SD_POWER_RESET_REASON_CLR, - SD_POWER_POF_ENABLE, - SD_POWER_POF_THRESHOLD_SET, - SD_POWER_RAM_POWER_SET, - SD_POWER_RAM_POWER_CLR, - SD_POWER_RAM_POWER_GET, - SD_POWER_GPREGRET_SET, - SD_POWER_GPREGRET_CLR, - SD_POWER_GPREGRET_GET, - SD_POWER_DCDC_MODE_SET, - SD_APP_EVT_WAIT, - SD_CLOCK_HFCLK_REQUEST, - SD_CLOCK_HFCLK_RELEASE, - SD_CLOCK_HFCLK_IS_RUNNING, - SD_RADIO_NOTIFICATION_CFG_SET, - SD_ECB_BLOCK_ENCRYPT, - SD_ECB_BLOCKS_ENCRYPT, - SD_RADIO_SESSION_OPEN, - SD_RADIO_SESSION_CLOSE, - SD_RADIO_REQUEST, - SD_EVT_GET, - SD_TEMP_GET, - SVC_SOC_LAST + SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, + SD_PPI_CHANNEL_ENABLE_SET = SOC_SVC_BASE + 1, + SD_PPI_CHANNEL_ENABLE_CLR = SOC_SVC_BASE + 2, + SD_PPI_CHANNEL_ASSIGN = SOC_SVC_BASE + 3, + SD_PPI_GROUP_TASK_ENABLE = SOC_SVC_BASE + 4, + SD_PPI_GROUP_TASK_DISABLE = SOC_SVC_BASE + 5, + SD_PPI_GROUP_ASSIGN = SOC_SVC_BASE + 6, + SD_PPI_GROUP_GET = SOC_SVC_BASE + 7, + SD_FLASH_PAGE_ERASE = SOC_SVC_BASE + 8, + SD_FLASH_WRITE = SOC_SVC_BASE + 9, + SD_FLASH_PROTECT = SOC_SVC_BASE + 10, + SD_PROTECTED_REGISTER_WRITE = SOC_SVC_BASE + 11, + SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, + SD_MUTEX_ACQUIRE = SOC_SVC_BASE_NOT_AVAILABLE + 1, + SD_MUTEX_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 2, + SD_RAND_APPLICATION_POOL_CAPACITY_GET = SOC_SVC_BASE_NOT_AVAILABLE + 3, + SD_RAND_APPLICATION_BYTES_AVAILABLE_GET = SOC_SVC_BASE_NOT_AVAILABLE + 4, + SD_RAND_APPLICATION_VECTOR_GET = SOC_SVC_BASE_NOT_AVAILABLE + 5, + SD_POWER_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 6, + SD_POWER_SYSTEM_OFF = SOC_SVC_BASE_NOT_AVAILABLE + 7, + SD_POWER_RESET_REASON_GET = SOC_SVC_BASE_NOT_AVAILABLE + 8, + SD_POWER_RESET_REASON_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 9, + SD_POWER_POF_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 10, + SD_POWER_POF_THRESHOLD_SET = SOC_SVC_BASE_NOT_AVAILABLE + 11, + SD_POWER_RAM_POWER_SET = SOC_SVC_BASE_NOT_AVAILABLE + 13, + SD_POWER_RAM_POWER_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 14, + SD_POWER_RAM_POWER_GET = SOC_SVC_BASE_NOT_AVAILABLE + 15, + SD_POWER_GPREGRET_SET = SOC_SVC_BASE_NOT_AVAILABLE + 16, + SD_POWER_GPREGRET_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 17, + SD_POWER_GPREGRET_GET = SOC_SVC_BASE_NOT_AVAILABLE + 18, + SD_POWER_DCDC_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 19, + SD_APP_EVT_WAIT = SOC_SVC_BASE_NOT_AVAILABLE + 21, + SD_CLOCK_HFCLK_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 22, + SD_CLOCK_HFCLK_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 23, + SD_CLOCK_HFCLK_IS_RUNNING = SOC_SVC_BASE_NOT_AVAILABLE + 24, + SD_RADIO_NOTIFICATION_CFG_SET = SOC_SVC_BASE_NOT_AVAILABLE + 25, + SD_ECB_BLOCK_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 26, + SD_ECB_BLOCKS_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 27, + SD_RADIO_SESSION_OPEN = SOC_SVC_BASE_NOT_AVAILABLE + 28, + SD_RADIO_SESSION_CLOSE = SOC_SVC_BASE_NOT_AVAILABLE + 29, + SD_RADIO_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 30, + SD_EVT_GET = SOC_SVC_BASE_NOT_AVAILABLE + 31, + SD_TEMP_GET = SOC_SVC_BASE_NOT_AVAILABLE + 32, + SVC_SOC_LAST = SOC_SVC_BASE_NOT_AVAILABLE + 37 }; /**@brief Possible values of a ::nrf_mutex_t. */ @@ -181,6 +182,7 @@ enum NRF_POWER_THRESHOLDS }; + /**@brief DC/DC converter modes. */ enum NRF_POWER_DCDC_MODES { @@ -475,7 +477,9 @@ SVCALL(SD_POWER_SYSTEM_OFF, uint32_t, sd_power_system_off(void)); */ SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); -/**@brief Sets the power-fail threshold value. + +/**@brief Sets the power failure comparator threshold value. + * * * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDS. * @@ -484,6 +488,7 @@ SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); */ SVCALL(SD_POWER_POF_THRESHOLD_SET, uint32_t, sd_power_pof_threshold_set(uint8_t threshold)); + /**@brief Writes the NRF_POWER->RAM[index].POWERSET register. * * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERSET register to write to. @@ -538,9 +543,7 @@ SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_ */ SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret)); -/**@brief Sets the DCDC mode. - * - * Enable or disable the DCDC peripheral. +/**@brief Enable or disable the DC/DC regulator. * * @param[in] dcdc_mode The mode of the DCDC, see @ref NRF_POWER_DCDC_MODES. * @@ -549,6 +552,7 @@ SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_ */ SVCALL(SD_POWER_DCDC_MODE_SET, uint32_t, sd_power_dcdc_mode_set(uint8_t dcdc_mode)); + /**@brief Request the high frequency crystal oscillator. * * Will start the high frequency crystal oscillator, the startup time of the crystal varies @@ -790,6 +794,8 @@ SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp)); * and the command parameters). * - The data in the p_src buffer should not be modified before the @ref NRF_EVT_FLASH_OPERATION_SUCCESS * or the @ref NRF_EVT_FLASH_OPERATION_ERROR have been received if the SoftDevice is enabled. +* - This call will make the SoftDevice trigger a hardfault when the page is written, if it is +* protected. * * * @param[in] p_dst Pointer to start of flash location to be written. @@ -800,7 +806,7 @@ SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp)); * @retval ::NRF_ERROR_INVALID_ADDR Tried to write to a non existing flash address, or p_dst or p_src was unaligned. * @retval ::NRF_ERROR_BUSY The previous command has not yet completed. * @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or higher than the maximum allowed size. -* @retval ::NRF_ERROR_FORBIDDEN Tried to write to or read from protected location. +* @retval ::NRF_ERROR_FORBIDDEN Tried to write to an address outside the application flash area. * @retval ::NRF_SUCCESS The command was accepted. */ SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)); @@ -823,6 +829,8 @@ SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * they will not interfere with the flash access. This means that all interrupts will be blocked * for a predictable time (depending on the NVMC specification in the device's Product Specification * and the command parameters). +* - This call will make the SoftDevice trigger a hardfault when the page is erased, if it is +* protected. * * * @param[in] page_number Page number of the page to erase @@ -830,7 +838,7 @@ SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. * @retval ::NRF_ERROR_INVALID_ADDR Tried to erase to a non existing flash page. * @retval ::NRF_ERROR_BUSY The previous command has not yet completed. -* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a protected page. +* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a page outside the application flash area. * @retval ::NRF_SUCCESS The command was accepted. */ SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)); @@ -846,13 +854,14 @@ SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)) * * @note To read the values read them directly. They are only write-protected. * + * @note It is possible to use @ref sd_protected_register_write instead of this function. + * * @param[in] block_cfg0 Value to be written to the configuration register. * @param[in] block_cfg1 Value to be written to the configuration register. * @param[in] block_cfg2 Value to be written to the configuration register. * @param[in] block_cfg3 Value to be written to the configuration register. * * @retval ::NRF_ERROR_NOT_SUPPORTED Non-zero value supplied to one or more of the unsupported parameters. - * @retval ::NRF_ERROR_FORBIDDEN Tried to protect the flash region used by the SoftDevice. * @retval ::NRF_SUCCESS Values successfully written to configuration registers. */ SVCALL(SD_FLASH_PROTECT, uint32_t, sd_flash_protect(uint32_t block_cfg0, uint32_t block_cfg1, uint32_t block_cfg2, uint32_t block_cfg3)); @@ -924,6 +933,27 @@ SVCALL(SD_FLASH_PROTECT, uint32_t, sd_flash_protect(uint32_t block_cfg0, uint32_ */ SVCALL(SD_RADIO_REQUEST, uint32_t, sd_radio_request(nrf_radio_request_t const * p_request)); +/**@brief Write register protected by the SoftDevice + * + * This function writes to a register that is write-protected by the SoftDevice. Please refer to your + * SoftDevice Specification for more details about which registers that are protected by SoftDevice. + * This function can write to the following protected peripheral: + * - BPROT + * + * @note Protected registers may be read directly. + * @note Register that are write-once will return @ref NRF_SUCCESS on second set, even the value in + * the register has not changed. See the Product Specification for more details about register + * properties. + * + * @param[in] p_register Pointer to register to be written. + * @param[in] value Value to be written to the register. + * + * @retval ::NRF_ERROR_INVALID_ADDR This function can not write to the reguested register. + * @retval ::NRF_SUCCESS Value successfully written to register. + * + */ +SVCALL(SD_PROTECTED_REGISTER_WRITE, uint32_t, sd_protected_register_write(volatile uint32_t * p_register, uint32_t value)); + /**@} */ #ifdef __cplusplus diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_svc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_svc.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_svc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/headers/nrf_svc.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/doc/s112_nrf52810_5.1.0_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/hex/s112_nrf52_6.0.0_licence-agreement.txt similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/doc/s112_nrf52810_5.1.0_licence-agreement.txt rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/hex/s112_nrf52_6.0.0_licence-agreement.txt index 00c2e54c47..a71adee7b9 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/doc/s112_nrf52810_5.1.0_licence-agreement.txt +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/hex/s112_nrf52_6.0.0_licence-agreement.txt @@ -1,4 +1,4 @@ -Copyright (c) 2007 - 2017, Nordic Semiconductor ASA +Copyright (c) 2007 - 2018, Nordic Semiconductor ASA All rights reserved. Redistribution and use in source and binary forms, with or without modification, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/hex/s112_nrf52_6.0.0_softdevice.hex b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/hex/s112_nrf52_6.0.0_softdevice.hex new file mode 100644 index 0000000000..07d4432d80 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S112/hex/s112_nrf52_6.0.0_softdevice.hex @@ -0,0 +1,6143 @@ +:020000040000FA +:1000000000040020E90800007D050000C908000088 +:1000100087050000910500009B050000000000001E +:100020000000000000000000000000000D090000BA +:10003000A505000000000000AF050000B9050000A4 +:10004000C3050000CD050000D7050000E105000054 +:10005000EB050000F5050000FF05000009060000A3 +:10006000130600001D0600002706000031060000F0 +:100070003B060000450600004F0600005906000040 +:10008000630600006D060000770600008106000090 +:100090008B060000950600009F060000A9060000E0 +:1000A000B3060000BD060000C7060000D106000030 +:1000B000DB060000E5060000EF060000F906000080 +:1000C000030700000D0700001707000021070000CC +:1000D0002B070000350700003F070000490700001C +:1000E000530700005D07000067070000710700006C +:1000F0007B070000850700008F07000099070000BC +:10010000A30700001FB500F003F88DE80F001FBD26 +:1001100000F0E0BB1FB56FF00100009040100390AD +:10012000029001904FF010208069000B420900F00E +:100130001F045DF822300120A04083434DF8223097 +:10014000684600F045F91FBDF0B54FF6FF734FF458 +:10015000B4751A466E1E11E0A94201D3344600E080 +:100160000C46091B30F8027B641E3B441A44F9D14B +:100170009CB204EB134394B204EB12420029EBD17E +:1001800098B200EB134002EB124140EA0140F0BD8F +:10019000DE4992B00446D1E90001CDE91001FF2209 +:1001A0004021684600F03CFB94E80F008DE80F000A +:1001B000684610A902E004C841F8042D8842FAD12B +:1001C00010216846FFF7C0FF1090AA208DF8440068 +:1001D000FFF7A0FF00F0F3F84FF01024A069102201 +:1001E0006946803000F002F9A069082210A900F0E9 +:1001F000FDF800F0D8F84FF080510A6949690068AD +:100200004A43824201D8102070470020704710B541 +:10021000D0E900214FF0805002EB8103026944696C +:100220006243934209D84FF01022536903EB8103D4 +:100230000169406941438B4201D9092010BD5069D1 +:10024000401C01D0002010BD0F2010BD70B501680A +:100250000446AF4D4FF01020072952D2DFE801F0DD +:10026000330419293C1E2500D4E902656468294637 +:10027000304600F0CDF82A462146304600F0B6F868 +:10028000AA002146304600F09FFA002800D0032043 +:1002900070BD00F051FB4FF4805007E0201DFFF7C8 +:1002A000AAFF0028F4D100F047FB60682860002016 +:1002B00070BD241D94E80700920000F085FA002824 +:1002C000F6D00E2070BD8069401C12D0201DFFF7B3 +:1002D0009EFF0028F6D109E08069401C09D0201D4E +:1002E000FFF789FF0028EDD1606820B12046FFF7B5 +:1002F0004FFF042070BDFFF70DFF00F060F800F025 +:1003000052F8072070BD10B50C46182802D0012005 +:10031000086010BD2068FFF799FF206010BD4FF006 +:100320001024A069401C05D0A569A66980353079E4 +:10033000AA2808D06069401C2DD060690068401C64 +:1003400029D060692CE010212846FFF7FDFE3168B6 +:1003500081421CD1A16901F18002C03105E030B1B8 +:1003600008CA51F8040D984201D1012000E0002094 +:100370008A42F4D158B1286810B1042803D0FEE7AE +:10038000284600F057F862496868086008E000F005 +:1003900016F800F008F84FF480500168491C01D0AD +:1003A00000F0A4FAFEE7BFF34F8F5A4801685A4A9B +:1003B00001F4E06111430160BFF34F8FFEE74FF09E +:1003C00010208169491C02D0806900F0AEB87047E6 +:1003D000524A01681160121D416811604F4A8168DC +:1003E00010321160111DC068086070472DE9F0419E +:1003F00017460D460646002406E03046296800F000 +:10040000A7F8641C2D1D361DBC42F6D3BDE8F08153 +:1004100070B50C4605464FF4806608E0284600F0AB +:1004200084F8B44205D3A4F5806405F58055002C0A +:10043000F4D170BD4168044609B1012500E00025F2 +:100440004FF010267069A268920000F0BDF9C8B1A3 +:10045000204600F01AF89DB17669A56864684FF4EB +:10046000002084420AD2854208D229463046FFF74E +:10047000CFFF2A4621463046FFF7B8FFFFF79FFF20 +:10048000FFF791FFFFF746FEF8E72DE9FF414FF038 +:100490001024616980680D0B01EB800000F6FF708D +:1004A000010B0020009001900290024603906846E4 +:1004B00001230BE0560902F01F0C50F8267003FAD6 +:1004C0000CFC47EA0C0740F82670521CAA42F1D3F4 +:1004D0000AE04A0901F01F0650F8225003FA06F616 +:1004E000354340F82250491C8029F2D3A169090BF9 +:1004F0004A0901F01F0150F822408B409C4340F80C +:100500002240FFF765FFBDE8FF8100005C090000A5 +:10051000000000200CED00E00400FA050006004099 +:10052000144801680029FCD07047134A0221116069 +:1005300010490B68002BFCD00F4B1B1D186008687E +:100540000028FCD00020106008680028FCD070470C +:10055000094B10B501221A60064A1468002CFCD021 +:10056000016010680028FCD0002018601068002886 +:10057000FCD010BD00E4014004E5014008208F4993 +:1005800009680958084710208C4909680958084724 +:1005900014208A49096809580847182087490968BA +:1005A0000958084730208549096809580847382004 +:1005B00082490968095808473C2080490968095858 +:1005C000084740207D4909680958084744207B496D +:1005D00009680958084748207849096809580847B0 +:1005E0004C20764909680958084750207349096822 +:1005F0000958084754207149096809580847582084 +:100600006E490968095808475C206C49096809580F +:100610000847602069490968095808476420674904 +:100620000968095808476820644909680958084753 +:100630006C20624909680958084770205F490968B9 +:100640000958084774205D49096809580847782007 +:100650005A490968095808477C20584909680958C7 +:10066000084780205549096809580847842053499C +:1006700009680958084788205049096809580847F7 +:100680008C204E4909680958084790204B49096851 +:10069000095808479420494909680958084798208B +:1006A00046490968095808479C204449096809587F +:1006B0000847A0204149096809580847A4203F4934 +:1006C000096809580847A8203C490968095808479B +:1006D000AC203A49096809580847B02037490968E9 +:1006E00009580847B4203549096809580847B8200F +:1006F0003249096809580847BC2030490968095837 +:100700000847C0202D49096809580847C4202B49CB +:10071000096809580847C82028490968095808473E +:10072000CC202649096809580847D0202349096880 +:1007300009580847D4202149096809580847D82092 +:100740001E49096809580847DC201C4909680958EE +:100750000847E0201949096809580847E420174963 +:10076000096809580847E8201449096809580847E2 +:10077000EC201249096809580847F0200F49096818 +:1007800009580847F4200D49096809580847F82016 +:100790000A49096809580847FC20084909680958A6 +:1007A00008475FF480700549096809580847000048 +:1007B00003480449024A034B704700000000002030 +:1007C000680900006809000040EA010310B59B07B2 +:1007D0000FD1042A0DD310C808C9121F9C42F8D0AB +:1007E00020BA19BA884201D9012010BD4FF0FF305C +:1007F00010BD1AB1D30703D0521C07E0002010BD72 +:1008000010F8013B11F8014B1B1B07D110F8013BFD +:1008100011F8014B1B1B01D1921EF1D1184610BDDE +:1008200002F0FF0343EA032242EA024200F005B865 +:100830007047704770474FF000020429C0F01280E3 +:1008400010F0030C00F01B80CCF1040CBCF1020F83 +:1008500018BF00F8012BA8BF20F8022BA1EB0C0158 +:1008600000F00DB85FEAC17C24BF00F8012B00F84E +:10087000012B48BF00F8012B70474FF0000200B574 +:10088000134694469646203922BFA0E80C50A0E8B3 +:100890000C50B1F12001BFF4F7AF090728BFA0E861 +:1008A0000C5048BF0CC05DF804EB890028BF40F82D +:1008B000042B08BF704748BF20F8022B11F0804F6F +:1008C00018BF00F8012B7047014B1B68DB68184705 +:1008D0000000002009480A497047FFF7FBFFFFF7B7 +:1008E00011FC00BD20BFFDE7064B1847064A10600B +:1008F000016881F30888406800470000680900002B +:10090000680900001F030000000000201EF0040F13 +:100910000CBFEFF30881EFF3098188690238007892 +:10092000182803D100E00000074A1047074A126860 +:100930002C3212681047000000B5054B1B68054AB1 +:100940009B58984700BD00000703000000000020EE +:100950005809000004000000001000000000000022 +:0809600000FFFFFF0090D0032F +:10100000900D0020A9800100AD2E00001B80010082 +:10101000AD2E0000AD2E0000AD2E0000000000003F +:10102000000000000000000000000000018101003D +:10103000AD2E000000000000AD2E0000AD2E00001F +:10104000698101006F810100AD2E0000AD2E00000E +:10105000AD2E0000AD2E0000AD2E0000AD2E000024 +:1010600075810100AD2E0000AD2E00007B810100D6 +:10107000AD2E000081810100878101008D8101007A +:10108000AD2E0000AD2E0000AD2E0000AD2E0000F4 +:10109000AD2E0000AD2E0000AD2E0000AD2E0000E4 +:1010A000AD2E000093810100AD2E0000AD2E00009A +:1010B000AD2E0000AD2E0000AD2E0000AD2E0000C4 +:1010C00099810100AD2E0000AD2E0000AD2E000074 +:1010D000AD2E0000AD2E0000AD2E0000AD2E0000A4 +:1010E000AD2E0000AD2E0000AD2E0000AD2E000094 +:1010F000AD2E0000AD2E0000AD2E0000AD2E000084 +:10110000AD2E0000AD2E000000F002F816F0B9FF81 +:101110000AA090E8000C82448344AAF10107DA4552 +:1011200001D116F0AEFFAFF2090EBAE80F0013F0CE +:10113000010F18BFFB1A43F001031847B8740100F0 +:10114000D87401000A4410F8014B14F00F0508BFD1 +:1011500010F8015B240908BF10F8014B6D1E05D083 +:1011600010F8013B6D1E01F8013BF9D1641E03D05C +:10117000641E01F8015BFBD19142E4D3704700008B +:101180000023002400250026103A28BF78C1FBD890 +:10119000520728BF30C148BF0B6070471FB500F031 +:1011A00031F88DE80F001FBD8269034981614FF05E +:1011B0000100104470470000BD11000001B41EB4CE +:1011C00000B501F0FBFE01B40198864601BC01B0F8 +:1011D0001EBD0000F0B44046494652465B460FB47F +:1011E00002A0013001B50648004700BF01BC864699 +:1011F0000FBC8046894692469B46F0BC7047000073 +:101200000911000016F03ABF70B51B4C05460920C5 +:101210002070A01C00F061F85920A08029462046CB +:10122000BDE8704006F058BD06F061BD70B50C46D3 +:101230001249097829B1A0F160015E2908D3012083 +:1012400013E0602804D0692802D043F201000CE0CA +:1012500020CC0B4E94E80E0006EB8000A0F58050E9 +:10126000241FD0F8806E2846B047206070BD012052 +:101270007047062070470000080000201C00002076 +:10128000C881010010B504460021012000F032F8A9 +:1012900000210B2000F02EF80421192000F02AF87C +:1012A00004210D2000F026F804210E2000F022F881 +:1012B00004210F2000F01EF80421C84300F01AF8A2 +:1012C0000621162000F016F80621152000F012F86D +:1012D0002046FFF799FF002010BDA721018070472D +:1012E000FFF7A2BF002070470A487047FFF79EBF74 +:1012F000704770474907090E002806DA00F00F0012 +:1013000000F1E02080F8141D704700F1E02080F823 +:101310000014704703F9004230B5FF4D0446062C17 +:10132000A9780ED2DFE804F0030E0E0E0509FFDFE8 +:1013300008E0022906D0FFDF04E0032902D0FFDF26 +:1013400000E0FFDFAC7030BDF34810B5407E4108CF +:10135000F14800F11A0005D00AF07BFBBDE810400F +:1013600006F058BB0AF05CFBF8E730B50446A1F183 +:1013700020000D460A2847D2DFE800F005070C19C7 +:10138000202532373C41FFDF3FE0207820283CD148 +:10139000FFDF3AE0E0488078052836D0207824281E +:1013A00033D0252831D023282FD0FFDF2DE020781F +:1013B00022282AD0232828D8FFDF26E020782228D8 +:1013C00023D0FFDF21E0207822281ED024281CD043 +:1013D00026281AD0272818D0292816D0FFDF14E095 +:1013E0002078252811D0FFDF0FE0207825280CD0A9 +:1013F000FFDF0AE02078252807D0FFDF05E020780E +:10140000282802D0FFDF00E0FFDF257030BD1FB5C8 +:101410000022ADF800200C88ADF802404B88ADF8F2 +:101420000430CA88ADF808208988ADF8061000217C +:10143000ADF80A10ADF80C1080B14FF6FF70062120 +:10144000844201D1ADF80210834201D1ADF80410FD +:10145000824203D14FF44860ADF8080068460AF0B4 +:101460002DFC06F0D7FA04B010BD70B514460D4639 +:1014700006460FF00FFA60B90DB1A54201D90C2054 +:1014800070BD002409E000BF56F824000FF002FAF6 +:1014900008B1102070BD641CE4B2AC42F4D300204B +:1014A00070BD2DE9F04105461F4690460E460024CA +:1014B00000680FF03CFA10B11020BDE8F0812868F8 +:1014C0000028A88802D0B84202D84FE00028F4D003 +:1014D0000920F2E72868025DB2B1611C475C152F54 +:1014E0002DD03BDC3AD2DFE807F03912222228283F +:1014F0002A2A3131393939393939393939392200DA +:10150000025D32BB641CA4B2A142F9D833E0022AC6 +:10151000DED1A21C805C88F80000072801D24007B9 +:1015200001D40A20C9E7307840F0010015E0D0432B +:10153000C00707E0012A07D010E00620BDE710072A +:10154000A0F180500028F5D01846B6E73078820721 +:1015500001D50B20B1E740F0020030702868005D33 +:10156000084484B2A888A04202D2B1E74FF448539D +:1015700081B2A142AED800209FE710B5027854088E +:1015800009D0012243F20223012C07D0022C0DD0F6 +:10159000032C13D10FE00020087005E080790324AC +:1015A000B4EB901F0AD10A70002010BD8079B2EB15 +:1015B000901F03D1F7E780798009F4D0184610BD59 +:1015C00038B50C460546694601F089F800280DD16A +:1015D0009DF80010207861F34700207055F8010F46 +:1015E000C4F80100A888A4F80500002038BD38B56B +:1015F0001378C0B1022816D048A46D462468009420 +:101600004C7905EB9414247864F347031370032892 +:101610000ED003F0FE0010700868C2F80100888840 +:10162000A2F8050038BD23F0FE0313700228EED1A6 +:10163000D8B240F00100EEE702210BF07DBC38B5D6 +:101640000C460978222901D2082038BDADF80000E7 +:101650008DF8022068460AF038FA06F0DBF905003A +:1016600003D121212046FFF780FE284638BD1CB556 +:1016700000208DF80000CDF80100ADF805002648E7 +:1016800090F82200022801D0012000E000208DF80F +:10169000070068460AF086FA002800D0FFDF1CBD6C +:1016A0002DE9FF478CB00026BDF8347082461C46F9 +:1016B00090468DF81C60780703D560680FF0EAF853 +:1016C00068B9154D4FF0010995F8220058B195F809 +:1016D0002300022807D160680FF029F918B1102003 +:1016E00010B0BDE8F087380702D5A08980281AD845 +:1016F000780704D4B8F1000F01D0287E98B1E07DBE +:10170000C0F300108DF81B00617D072069B101292D +:101710000BD00229E4D003E0900100200302FF0176 +:101720000429DDD118E00720DAE78DF817908DF84D +:1017300019908DF8158060684F4678B107A9FFF7BA +:101740001CFF0028CCD1606850F8011FCDF80F10A5 +:101750008088ADF8130005E00620C1E7CDF80F60E2 +:10176000ADF81360E07B0028F6D1207C0028F3D18F +:10177000607C0028F0D1A07C0028EDD1E07CC00680 +:10178000EAD18DF800A0BDF83400ADF80200A068E1 +:101790000190A0680290FEA0D0E90010CDE90A10E7 +:1017A000E07C0AA901EB50101B3900788DF80C0081 +:1017B00095F8220030B195F82300022818D00328AC +:1017C00004D119E0F44800F08AFF00B1FFDF9DF872 +:1017D0001C008DF80E008DF818608DF816608DF8DD +:1017E0001A6009A968460AF0A5FA06F013F977E726 +:1017F00003208DF80D00EAE78DF80D70E7E7F0B5EE +:101800009DB000228DF868208DF858208DF860205A +:1018100005468DF86C20129213921492159219B10C +:101820000FC912AC84E80F00DB4C193CA0780528E6 +:1018300001D004280CD112986168884200D120B9E7 +:101840001498E168884203D110B108201DB0F0BDA2 +:101850001F26334618AA1AA912A8FFF722FE00284D +:10186000F4D133461BAA16A914A8FFF71AFE0028C4 +:10187000ECD19DF85800C00701D00A20E6E7A08A05 +:10188000410708D4A17D31B19DF86010890702D0CD +:1018900043F20120DAE79DF86010C90709D040073C +:1018A00007D4208818B144F25061884201D907203A +:1018B000CCE78DF8005003268DF8016001278DF8E4 +:1018C0000270BDF84C208DF8032001A8129916F083 +:1018D000D6FA68460AF08DFA06F09CF80028B5D1D1 +:1018E0008DF824508DF825608DF82670BDF85420B1 +:1018F0008DF827200AA8149916F0C1FA09A80AF051 +:101900009CFA06F087F80028A0D112AD241D95E8B6 +:101910000F0084E80F00002098E72DE9FE43040043 +:1019200000D1FFDF20789C4E20F00F00801C20F0BB +:10193000F000703020706068193E0178C91F1229CC +:1019400029D2DFE801F04BFD2809FDFD38FB2828EE +:1019500064FBFA2828FBFBF986883046FFF76CFE0B +:101960000546304609F0B1FCB8B16068807985F869 +:101970003E0021212846FFF7F8FC304603F07FFAAD +:10198000304604F0E9FB314601200EF037FFA87F16 +:1019900020F01000A877BDE8FE83207820F0F0004A +:1019A0002030207006202072668060688079607226 +:1019B00006F013FADDE785882846FFF73DFE00B9FB +:1019C000FFDF60688078012800D0FFDF60688179E0 +:1019D00003B02846BDE8F04309F0A6BD868830462E +:1019E000FFF72AFE050000D1FFDF06F0F6F9606878 +:1019F0003146C088288160680089688160684089B4 +:101A0000A88101200EF0FAFE0020A875C3E78078B7 +:101A1000022808D000B1FFDF06F0DFF96568A87979 +:101A2000AD1C10B102E0FFDFB5E7FFDFF778B5F8D6 +:101A30000290B046384605F08DFF060000D1FFDF6A +:101A40000022022148460BF06EFA040000D1FFDFAD +:101A500022212046FFF789FCA17F012060F30101CC +:101A6000A177298B2181698B6181A98BA18184F860 +:101A700022708DF8080002AA032148460BF053FAA1 +:101A800000B9FFDFB088ADF80400B0788DF806002B +:101A900001AA052148460BF046FA00B9FFDFB088DD +:101AA000ADF80000F0788DF802006A46042148463F +:101AB0000BF039FA00B9FFDF062105F1120000F042 +:101AC0002BFE08B36879800700D5FFDF6979E07DD8 +:101AD00061F34700E075D5F80600A0616889A0832E +:101AE000062105F10C0000F017FEB8B198F81910A6 +:101AF0004A08617862F347016170D8F81A10C4F897 +:101B00000210B8F81E0012E0E07D20F0FE00801CFC +:101B1000E075D5F81200A061E88AE0E7607820F06F +:101B2000FE00801C6070E868C4F80200288AE0802B +:101B30000320FFF7F1FB2EE707E012E00DE0FFE7DF +:101B40002046BDE8FE4301F020BD06F046F916F838 +:101B5000240F40F0040030701DE7BDE8FE4306F09E +:101B60003CB9B178052908D00429E4D106F035F94B +:101B70000220BDE8FE43FFF7CFBB80780028DAD013 +:101B8000F07800F093FD06F028F90320F1E700005B +:101B90000706050403020100A90100202DE9F04712 +:101BA000054600780027000991460C463E4601286C +:101BB00073D0022872D0072809D00A2824D0FFDF6A +:101BC000A9F800600CB127806680002089E5D5F86F +:101BD00004C0DFF8AC874FF0010A9CF800004FF614 +:101BE000FF7113287AD008DC07280ED00E281FD0EA +:101BF000112826D0122806D186E016280BD01728E7 +:101C000059D018286CD02146FBE012271026BCF8CA +:101C100004002146B8E01C270A26ECB3BCF80200F9 +:101C2000A080686800792072686840796072C7E7B0 +:101C30001B27092684B30320207268684088A0808F +:101C4000BEE79CF802003C28BAD010272C260CF1E5 +:101C5000020C0CB3BCF80200A080BCF81800608233 +:101C6000BCF818002082BCF81A00A082BCF81C0046 +:101C7000E0829CF8050004F108020CF10601FFF770 +:101C8000B6FC9CF8040001289AD184F80FA000202B +:101C9000207608F1040002E00AE06DE077E090E8C9 +:101CA0000E00D8F81000C4E90930C4E9071287E72C +:101CB000A9F8006089E720271126002CF8D0A18020 +:101CC000686804F10A02807820726868807A60721D +:101CD0006968C878091DFFF78AFC71E729E0FFE70A +:101CE00021270A26002CE3D0BCF80200A0806868F7 +:101CF0000079207268684079607298F8241021F0A9 +:101D0000040188F824105BE722270B26002CCFD093 +:101D1000BCF80400A08068688078207268688079C8 +:101D200000F009FD60726868C07900F004FDA072DF +:101D300046E726271C26002CBAD0A1806868C07808 +:101D4000607268688079A07208F1040090E80E0063 +:101D5000D8F81000C4E90530C4E903126868807837 +:101D60003C2803D0432804D0FFDF29E784F808A0EB +:101D700026E70220207223E7287A022801D0FFDF1D +:101D80001EE712271026688800F0B3FC18E7287AAF +:101D9000032836D0042834D0052832D0062801D0B4 +:101DA000FFDF0DE711270926002C81D0B5F802804E +:101DB0004046FFF741FC90F822A0A4F80480687A1E +:101DC0002072042140460BF0C9F8052140460BF073 +:101DD000C5F8002140460BF0C1F8012140460BF048 +:101DE000BDF8032140460BF0B9F8022140460BF044 +:101DF000B5F8062140460BF0B1F8504600F056FC0D +:101E0000DEE62846BDE8F04701F0F6BC70B50128D3 +:101E100001D0FFDF70BD8DB22846FFF70DFC040036 +:101E200000D1FFDF20782128F4D005F0D3FF80B166 +:101E3000017821F00F01891C21F0F00110310170AF +:101E40000221017245800020A075BDE8704005F0B8 +:101E5000C4BF21462846BDE870401322FFF7EFBB00 +:101E60002DE9F04116460C00804600D1FFDF3078A6 +:101E700020F00F00801C20F0F0001030307020782F +:101E8000022802D0FFDFBDE8F0814046FFF7D4FB17 +:101E9000050000D1FFDF61884FF6FF700027814207 +:101EA00002D1A288824203D0814201D1A08848B1E8 +:101EB00005F093FF2068B0606068F0602089308290 +:101EC000AF75E0E7A87D0128DDD1782300224146E7 +:101ED0000EF0EAFB0220A875D5E738B505460C469A +:101EE00008460EF0D7FC68B9203D062D30D2DFE859 +:101EF00005F00305222F271B062038BD60680EF071 +:101F00000DFD08B1102038BD618820886A460AF0AE +:101F1000D5F805F07FFD0028F5D161680029F2D0E1 +:101F2000BDF800200A8038BDA07800F001012088AB +:101F30000AF0F5F808E02068BDE8384001F092BEEC +:101F4000618820880AF053F8BDE8384005F062BD8A +:101F5000072038BD70B505460C4608460EF0C0FC9B +:101F600008B1102070BD202D07D0212D0DD0222DBD +:101F70000BD0252D09D0072070BD2088A11C09F0A9 +:101F8000F7FDBDE8704005F045BD062070BDFC487A +:101F90001930704708B52821F94816F011F80120CA +:101FA000FFF7BAF9F64968461A3105F0A9FEF44878 +:101FB0009DF80020417E62F3470121F00101417646 +:101FC000002180F822104FF461710184022180F811 +:101FD0002310FFF7B9F900B1FFDF00F0DDFB01F0DE +:101FE000A7FA08BD10B50C464021204615F0C6FFE3 +:101FF000A07F20F00300A077202020700020A07593 +:1020000084F8230010BD70472DE9FC4107460EF00F +:1020100041FC10B11020BDE8FC81D94E06F1190138 +:10202000D6F819000090B6F81D50ADF80450F47FB2 +:102030008DF806403846FFF7C3FA0028EBD1FFF7CA +:1020400083F90028E7D0009946F8191FB580B471CC +:10205000E1E710B504460EF043FC08B1102010BDB6 +:10206000C748C7492246407E1A314008FFF7BFFAE9 +:10207000002010BDFEB50D4604004FF0000712D041 +:102080000822FFF7F2F9002812D1002609E000BF6C +:1020900054F826006946FFF770FA002808D1761C2C +:1020A000F6B2AE42F4D309F012FC10B143F20320B1 +:1020B000FEBDB34E3776FCB100271AE054F8270076 +:1020C00002A9FFF75AFA00B1FFDF9DF808008DF86A +:1020D000000054F8270050F8011FCDF80110808847 +:1020E000ADF80500684609F017FC00B1FFDF7F1C62 +:1020F000FFB2AF42E2D335760020FEBD2DE9F047B6 +:102100008AB01546894604001DD00F46082229468C +:10211000FFF7ABF9002810D1002612E054F8260092 +:102120006946103000F0DBFA002806D13FB157F8BD +:1021300026000EF0AFFB10B110200AB046E5761C69 +:10214000F6B2AE42EAD30026A5F101081CE000BFBA +:1021500006F1010A0AF0FF0712E000BF54F826005A +:10216000017C4A0854F827100B7CB2EB530F05D1C1 +:1021700006221130113115F056FE58B17F1CFFB206 +:10218000AF42EBD30AF0FF064645E1DB4E4624B1F1 +:10219000012003E043F20520CFE7002009F0DCFB3B +:1021A00010B909F0E5FB10B143F20420C5E75CB3B8 +:1021B00000270DF1170825E054F827006946103074 +:1021C00000F08DFA00B1FFDF54F82700102250F81C +:1021D000111FCDF801108088ADF8050054F82710C4 +:1021E0000DF1070015F04BFE96B156F8271010229E +:1021F000404615F044FE684609F073FB00B1FFDF6E +:102200007F1CFFB2AF42D7D3FFF731FA002094E72B +:10221000404601F01BFDEEE730B585B004460EF0F8 +:1022200039FB18B960680EF082FB10B1102005B0C0 +:1022300030BD60884AF2B811884206D82078504DE7 +:1022400028B1012806D0022804D00720EFE7FFF7C5 +:102250007BF818E06078022804D0032802D043F20B +:102260000220E4E785F82300C1B200200090ADF819 +:10227000040002292CD0032927D0FFDF684609F08B +:10228000E8FB05F0C7FB0028D1D1606801F0D1FC64 +:10229000207858B101208DF800000DF1010001F007 +:1022A000D5FC684609F08EFF00B1FFDF207885F885 +:1022B0002200FFF7DCF9608860B1288480B209F061 +:1022C00043FB00B1FFDF0020B1E78DF80500D5E743 +:1022D0004020FAE74FF46170EFE710B504460EF0C6 +:1022E000FFFA20B9606838B10EF018FB08B1102071 +:1022F00010BD606801F0AAFC214830F8201F618001 +:10230000C178617080782070002010BD2DE9F843FD +:102310001446894606460EF0E3FAA0B948460EF088 +:1023200006FB80B920460EF002FB60B9144DA87878 +:10233000012800D13CB13178FF2906D049B143F2E0 +:102340000400BDE8F8831020FBE7012801D0042039 +:10235000F7E74FF00008B4B3052813D0042811D0D4 +:102360006946204600F0F2F90028EAD1207D58B1F4 +:1023700001280BD002280BD003280BD00720E0E760 +:10238000900100200820DCE7424604E0012202E040 +:10239000022200E003222346174600200099FFF79F +:1023A0007FF90028CDD1A0892880A07BE875BDF8F1 +:1023B0000000A882AF75BDF80000000701D5A08914 +:1023C00088B1A089288049460020FFF718FA002824 +:1023D000B7D1A87805280BD0042809D0287DC007DC +:1023E00003D0032002E08020ECE70220FEF794FFF8 +:1023F00086F800800020A4E72DE9FC41E54C064664 +:102400000D46A078022803D0032801D0082002E658 +:1024100016B143F20400FEE506200AF041FD10B9B2 +:10242000A078032845D00CF093FC07460DF027FE5A +:10243000381A00F0FF0806200AF02AFD0746062099 +:102440000AF02EFD391AA078042809D00022114480 +:10245000A8EB010111F0FF0F04D0032804D00DE018 +:102460000122F4E71320D6E5284605F073FAF0B10F +:102470004078F0B1284605F054FDE57001208DF854 +:1024800000008DF801008DF802602088ADF804008E +:10249000E07D8DF80600684609F06CFD05F0BAFA9B +:1024A0000028B4D1A078032805D0042010E005202E +:1024B000B1E51220AFE5E07805F04CFA040000D158 +:1024C000FFDF607800B9FFDF6078401E6070052094 +:1024D000FEF722FF00209EE51CB510B143F2040078 +:1024E0001CBDAC4CA078042803D0052801D00820DE +:1024F0001CBD00208DF8000001218DF801108DF821 +:102500000200684609F036FD05F084FA0028EFD194 +:10251000A078052804D00220FEF7FEFE00201CBD96 +:10252000E07800F0C3F80320F6E72DE9FC4180468F +:102530000D46032608460EF0FAF908B110206AE5A8 +:102540004046FFF779F8040004D02078222804D20E +:10255000082060E543F202005DE5A07F00F003077C +:102560003DB1012F0AD000202946FEF750FF06009A +:10257000E5D1012F04D0FFDF30464CE50120F3E721 +:10258000A07D2946022801D011B107E0112042E5C3 +:10259000684600F00EFA0028D1D16946404608F09E +:1025A000A3FF0600E8D10120A075E5E770B50C4651 +:1025B0000546FFF741F8010005D022462846BDE850 +:1025C0007040FFF73CB843F2020070BD10B501281F +:1025D00007D1704B9B78012B00D011B143F204005E +:1025E00010BD09F0E3F9BDE8104005F013BA01236E +:1025F00000F066B800231A46194600F061B870B5BD +:10260000064615460C4608460EF06AF918B92846E3 +:102610000EF066F908B1102070BD2A4621463046FA +:1026200009F034FD05F0F6F90028F5D121787F296D +:10263000F2D1052070BD7CB505460C4608460EF06B +:1026400029F908B110207CBD2846FEF7F5FF20B11E +:102650000078222804D208207CBD43F202007CBD11 +:102660004C4890F82400400701D511207CBD21780A +:10267000C80802D16078C20801D007207CBD890853 +:1026800001D1800801D006207CBDADF80050207833 +:102690008DF8020060788DF803000220ADF8040088 +:1026A000684609F0DCFA05F0B5F97CBD10B505F017 +:1026B00051F9040000D1FFDF6078401C607010BD4C +:1026C0001CB5ADF800008DF802308DF803108DF8C0 +:1026D0000420684609F0A9FC05F09CF91CBD0278AD +:1026E000520804D0012A02D043F202207047FEF7BC +:1026F00044BF70B50C0006460DD0FEF79DFF0500E7 +:1027000000D1FFDFA680288920812889608168891F +:10271000A081A889E08170BD10B500231A4603E0AE +:10272000845C2343521CD2B28A42F9D30BB10020FD +:1027300010BD012010BD00B530B1012803D0022822 +:1027400001D0FFDF002000BDFF2000BD00220A8075 +:1027500092B222F060020A800078062817D2DFE8E1 +:1027600000F0160306090C1142F0110007E042F0D8 +:102770001D0009E042F0150006E042F0100040F0B4 +:10278000020001E042F0100008800020704707209E +:102790007047000090010020FE4800210160416068 +:1027A000018170472DE9F743044692B09146406895 +:1027B0000EF0B4F840B160680EF0B9F820B9607856 +:1027C00000F00300022801D0012000E00020F14EBB +:1027D000307248460EF05EF818B1102015B0BDE812 +:1027E000F08349460120FEF712FE0028F6D10125AC +:1027F0008DF842504FF4C050ADF84000002210A9AF +:10280000284603F06FFF0028E8D18DF842504FF4BE +:1028100028504FF00008ADF8400047461C2168469C +:10282000CDF81C8015F0CCFB9DF81C0008AA20F008 +:102830000F00401C20F0F00010308DF81C002078B4 +:102840008DF81D0061789DF81E0061F3420040F094 +:1028500001008DF81E009DF800000AA940F002005A +:102860008DF800002089ADF83000ADF83270608935 +:1028700007AFADF834000B97606810AC0E900A9467 +:10288000684603F024FD0028A8D1BDF82000308060 +:102890008DF8425042F60120ADF840009DF81E0030 +:1028A00008AA20F00600801C20F001008DF81E0010 +:1028B0000220ADF83000ADF8340013A80E900AA93C +:1028C000684603F004FD002888D1BDF82000708020 +:1028D000311D484600F033F9002887D18DF8425069 +:1028E00042F6A620ADF840001C216846CDF81C80B9 +:1028F00015F066FB9DF81C00ADF8345020F00F0079 +:10290000401C20F0F00010308DF81C009DF81D00D8 +:1029100008AA20F0FF008DF81D009DF81E000AA9EE +:1029200020F0060040F00100801C8DF81E009DF88C +:1029300000008DF8445040F002008DF80000CDE911 +:102940000A4711A80E90ADF83050684603F0BFFC5E +:10295000002899D1BDF82000F08000203EE73EB568 +:1029600004460820ADF8000020460DF093FF08B1A2 +:1029700010203EBD21460120FEF749FD0028F8D178 +:102980002088ADF804006088ADF80600A088ADF896 +:102990000800E088ADF80A007E4801AB6A468088EE +:1029A000002104F099F8BDF800100829E1D00320B7 +:1029B0003EBD1FB50446002002900820ADF8080077 +:1029C000CDF80CD020460DF065FF10B1102004B0FA +:1029D00010BD704802AA81884FF6FF7004F0BEFA5D +:1029E0000028F4D1BDF80810082901D00320EEE733 +:1029F000BDF800102180BDF802106180BDF8041000 +:102A0000A180BDF80610E180E1E701B582B00220A7 +:102A1000ADF800005F4802AB6A464088002104F030 +:102A20005BF8BDF80010022900D003200EBD1CB5D4 +:102A3000002100910221ADF8001001900DF050FF2F +:102A400008B110201CBD53486A4641884FF6FF70FC +:102A500004F084FABDF800100229F3D003201CBD55 +:102A6000FEB54C4C06461546207A0F46C00705D0E9 +:102A700008460DF00FFF18B11020FEBD0F20FEBD5F +:102A8000F82D01D90C20FEBD30460DF003FF18BB18 +:102A9000208801A903F064F90028F4D130788DF87A +:102AA0000500208801A903F0F6FF0028EBD1009073 +:102AB0009DF800009DF8051040F002008DF8000020 +:102AC000090703D040F008008DF80000208869460F +:102AD00003F07EFF0028D6D1ADF8085020883B4691 +:102AE00002AA002103F0F8FFBDF80810A942CAD0DD +:102AF0000320FEBD7CB505460020009001900888AB +:102B0000ADF800000C46284601950DF007FF18B9F6 +:102B100020460DF0E5FE08B110207CBD15B1BDF8D2 +:102B2000000050B11B486A4601884FF6FF7004F060 +:102B300015FABDF8001021807CBD0C207CBD30B59D +:102B400093B0044600200D460090142101A815F012 +:102B500037FA1C2108A815F033FA9DF80000CDF8CB +:102B600008D020F00F00401C20F0F00010308DF84D +:102B700000009DF8010020F0FF008DF801009DF895 +:102B8000200040F002008DF8200001208DF8460062 +:102B900002E00000B801002042F60420ADF8440035 +:102BA00011A801902088ADF83C006088ADF83E0087 +:102BB000A088ADF84000E088ADF842009DF8020022 +:102BC00006AA20F00600801C20F001008DF802000B +:102BD0000820ADF80C00ADF810000FA8059001A971 +:102BE00008A803F074FB002803D1BDF81800288062 +:102BF000002013B030BD00004FF0E0224FF4004140 +:102C00000020C2F880111D4908701D49900208601B +:102C1000704770B5194D04462878A04202D00CB117 +:102C200000B1FFDF2878A0420DD01649144A2C705D +:102C30000020CCB1134E144B1436151F012C03D0B9 +:102C4000022C08D0FFDF70BD0860022008603360EE +:102C50004FF0407005E008600320086033604FF4D7 +:102C600000001060286070BD086008604FF0607060 +:102C7000106070BD00B5FFDF00BD0000180000202F +:102C800008F5014000F50040380200200CF04DBF6F +:102C90000449002008604FF0E0210220C1F88002C2 +:102CA00070470000FC1F004010B50D2000F067F8D1 +:102CB000C4B26FF0040000F062F8C0B2844200D0E9 +:102CC000FFDF36490120086010BD70B50D2000F00F +:102CD00040F8334C0020C4F800010125C4F8045327 +:102CE0000D2000F041F825604FF0E0216014C1F89C +:102CF000000170BD10B50D2000F02BF8284801210F +:102D000041600021C0F80011BDE810400D2000F026 +:102D10002BB8234910B5D1F80001012801D0FFDFFD +:102D200010BD1E48001D00680022C0B2C1F800217D +:102D3000BDE810400DF0D6BA10B51948D0F8001112 +:102D40000029FBD0FFF7E5FFBDE810400D2000F0A3 +:102D50000BB800F01F02012191404009800000F1F2 +:102D6000E020C0F88011704700F01F02012191405F +:102D70004009800000F1E020C0F880127047002870 +:102D800006DA00F00F0000F1E02090F8140D03E0E7 +:102D900000F1E02090F800044009704704D500409D +:102DA00000D00040704770477047704770477047C9 +:102DB000704700004FF0E0214FF00070C1F8800133 +:102DC000C1F88002334B802283F80024C1F800014F +:102DD000704700B5024604202F4903E001EBC00311 +:102DE0001B792BB1401EC0B2F8D2FFDFFF2000BD1F +:102DF00041F8302001EBC00100224A718A710122A2 +:102E00000A7100BD244A002102EBC0000171704725 +:102E100010B50446042800D3FFDF1F4800EBC404AC +:102E20002079012800D0FFDF6079A179401CC0B271 +:102E3000814200D060714FF0E0214FF00070C1F886 +:102E4000000210BD70B51348042590F80004124E1E +:102E50004009124C042818D0FFDF16E0217806EB59 +:102E6000C1000279012A08D1427983799A4204D0BB +:102E70004279827156F8310080472078401CC0B2F8 +:102E80002070042801D3002020706D1EEDB2E5D221 +:102E900070BD000019E000E0880400204800002018 +:102EA0000F4A12680D498A420CD118470C4A126821 +:102EB0000A4B9A4206D101B500F074F8FFF774FF8F +:102EC000BDE801400749096809580847064807490D +:102ED000054A064B7047000000000000BEBAFECA5B +:102EE000A400002004000020900D0020900D002080 +:102EF00070B50C46054606F021FB21462846BDE884 +:102F0000704007F006BC10B50DF07DFEFFF774FEB3 +:102F10000DF038FDBDE810400DF0CABD70B5034698 +:102F2000002002466FF02F050EE09C5CA4F13006F5 +:102F30000A2E02D34FF0FF3070BD00EB800005EB8E +:102F40004000521C2044D2B28A42EED370BD30B54C +:102F50000A240AE0B0FBF4F304FB13008D183030B0 +:102F600005F8010C521E1846D2B2002AF2D130BD2B +:102F700030B500234FF6FF7510E0040A44EA002044 +:102F800084B2C85C6040C0F30314604005EA0034BA +:102F90004440E0B25B1C84EA40109BB29342ECD305 +:102FA00030BD000070B5154D2878401CC4B268785B +:102FB000844202D0FFF7FBFE2C7070BD2DE9F0417A +:102FC0000E4C4FF0E02600BFFFF7EFFE20BF40BFE2 +:102FD00020BF677820786070D6F80052FEF784F939 +:102FE000854305D1D6F8040210B92078B842EBD059 +:102FF000FFF7DAFE0020BDE8F0810000A00000200D +:103000002CFFFFFFDBE5B15100900100A700FFFF9F +:1030100070000000808D5B0016425791AD5F58BC78 +:103020008E702F5A0FAA100DBCD52BFD10B504467B +:103030000DF030FC08B1102010BD2078C0F3021054 +:10304000042807D86078072804D3A178102901D86C +:10305000814201D2072010BDE078410706D42179D2 +:103060004A0703D4000701D4080701D5062010BD84 +:10307000002010BD70B514460D46064604F0AAFEA9 +:1030800080B10178182221F00F01891C21F0F00194 +:10309000A03100F8081B214614F036FFBDE870404F +:1030A00004F09BBE29463046BDE870401322FEF76F +:1030B000C6BA2DE9F047064608A8894690E83004CC +:1030C0001F4690461421284614F07AFF0021CAF8C2 +:1030D0000010B8F1000F03D0B9F1000F03D114E0D4 +:1030E0003878C00711D020680DF0FAFBC0BBB8F1EA +:1030F000000F07D120681230286020681430686003 +:103100002068A8602168CAF800103878800724D5A4 +:1031100060680DF003FC18BBB9F1000F21D0FEF779 +:1031200036FF0168C6F868118188A6F86C118079AD +:1031300086F86E0101F03BFAF84FEF60626862B109 +:1031400096F8680106F2691140081032FEF74FFA4E +:1031500010223946606814F092FE0020BDE8F08726 +:1031600006E0606820B1E8606068C6F86401F4E7D2 +:103170001020F3E730B5054608780C4620F00F0024 +:10318000401C20F0F001103121700020607095F893 +:10319000230030B104280FD0052811D0062814D000 +:1031A000FFDF20780121B1EB101F04D295F8200039 +:1031B00000F01F00607030BD21F0F000203002E010 +:1031C00021F0F00030302070EBE721F0F0004030CB +:1031D000F9E7F0B591B0022715460C4606463A4687 +:1031E000ADF80870082103AB07F074FF04900028C5 +:1031F00010D004208DF804008DF80170E034099699 +:1032000005948DF818500AA968460BF087FB00B1A9 +:10321000FFDF012011B0F0BD2DE9F84F0646808A8E +:103220000C4680B28246FEF707FA0546BB4F30785F +:10323000203F4FF005094FF000080F287CD2DFE84F +:1032400000F07BA39D082C5B6A7CBADAFD97489757 +:1032500097000121504609F06FFE040000D1FFDF06 +:1032600097F85C00C00701D0386E0BE0032104F131 +:103270001D000DF018F8D4F81D00A949B0FBF1F2BB +:1032800001FB1200C4F81D0070686067B068A06799 +:103290002878252872D0FFDF70E00121504609F020 +:1032A0004BFE060000D1FFDF3078810702D5297878 +:1032B000252904D040F001003070BDE8F88F0220CD +:1032C0002070307F207106F11D002D36C4E9020602 +:1032D000F3E70121504609F02FFE050000D1FFDF82 +:1032E0002878C10604D5072020703D356560E4E7E5 +:1032F00040F008002870E0E7E87F000700D5FFDF16 +:10330000307CB28800F0010301B05046BDE8F04FB8 +:10331000082108F014B805B9FFDF716821B1102247 +:1033200005F1240014F0ABFD28212846FEF71DF816 +:10333000307A85F82000C0E7F8E00121504609F016 +:10334000FBFD050000D1FFDF022105F185000CF037 +:10335000AAFF0420207005F5B4706060B5F8850000 +:1033600020826E4810387C356561C4E90270A4E79C +:103370000121504609F0E0FD00B9FFDF3246294641 +:103380005046BDE8F84F75E605B9FFDF28782128DB +:1033900093D93079012803D1E87F40F00800E8771D +:1033A000324629465046FFF765FE2846BDE8F84FED +:1033B0002321FDF7DABF3279A28004F10803082146 +:1033C000504607F087FEE06010B184F8009074E783 +:1033D00045460121504609F0AFFD040000D1FFDF52 +:1033E00004F1620102231022081F09F04AFC057053 +:1033F0003179417061E70121504609F09DFD0400DB +:1034000000D1FFDF94F8840000F00300012859D1B7 +:10341000E87F10F0010003D194F8A010C9072AD06A +:10342000D4F8602132B394F88330117C63F38701C0 +:103430001174AA7FD30963F3410100E072E0D4F86C +:1034400060211174D4F8602160F30001117490B10F +:10345000D4F86001102205F12401883414F00FFD26 +:10346000207E40F001002076207820F0010004F852 +:10347000880919E0C0B994F88810C90714D0D4F8A5 +:103480005C218AB194F88330117C63F38701117455 +:10349000AA7FD309D4F85C2163F341011174D4F8F5 +:1034A0005C2160F30001117494F88800800709D54D +:1034B00094F87C00D4F86421400804F17D011032B6 +:1034C000FEF795F88DF8009094F884006A4600F0B5 +:1034D00003008DF8010094F888108DF8021094F81C +:1034E000A0008DF803002946504601F049F82878DD +:1034F000252805D0212807D0FFDF2878222803D9E6 +:1035000022212846FDF731FF0121504609F026FD12 +:1035100000283FF4DDAEFFDFCFE60000E40100202D +:1035200040420F00716881F80180C6E6FFDFC4E603 +:1035300070B5FE4C002584F85C5025660BF0BBF995 +:1035400004F11001204604F001FC84F8305070BDF5 +:1035500070B50D46FEF770F8040000D1FFDF4FF4A0 +:10356000B871284614F02CFD2434012105F1E00047 +:103570002C610BF0A1F9002800D0FFDF70BD0A46D6 +:10358000014602F1E0000BF0B7B970B5054640689E +:1035900086B00178082906D00B2933D00C292FD00A +:1035A000FFDF06B070BD46883046FEF745F80400E0 +:1035B00000D1FFDF20782128F3D028281BD16868AC +:1035C00002210C3000F0A6FFA8B168680821001D98 +:1035D00000F0A0FF78B104F12401304608F0CCFCE3 +:1035E00004F018FA00B1FFDF06B02046BDE87040D5 +:1035F0002921FDF7BABE06B0BDE8704004F0EDBB6E +:1036000001218171686886883046FEF715F804004C +:1036100000D1FFDF20782128C3D06868817909B103 +:10362000807808B1FFDFBCE704F0D7FBA07F00067D +:1036300023D5E07FC00705D094F8200000F01F00DC +:10364000102818D05FF0050084F82300207829287E +:1036500015D02428A5D1314604200DF0CFF8222121 +:103660002046FDF782FE0121304609F077FC002854 +:1036700097D0FFDF95E70620E6E70420E4E7012185 +:10368000304609F059FC050000D1FFDF2521204616 +:10369000FDF76BFE03208DF80000694605F1E000A0 +:1036A0000BF021F90228BED00028BCD0FFDF78E75C +:1036B0002DE9F04788B09A46164688468146FDF7C0 +:1036C000BBFF05003AD02878222837D3232835D0ED +:1036D000E87F000732D400270121484609F02CFC7E +:1036E000040005D101210022484609F01CFC0446D3 +:1036F000694600F06CFF009800B9FFDF00983CB10C +:10370000E03404612878222804D0242802D005E07F +:10371000076103E025212846FDF727FE00980121D7 +:103720004170C0F824908680C0E9028A01A90BF09C +:10373000F5F8022802D0002800D0FFDF08B00DE520 +:1037400070B586B00546FDF777FF0078222814D9BA +:103750000121284609F0F0FB04002CD1FFDF2AE00C +:10376000B4F85E0004F1620630440178427829B171 +:1037700021462846FFF72DFDB0B912E7ADF8042029 +:103780000821284602AB07F0A5FC03900028F4D0DE +:1037900005208DF80000694604F1E0000BF0A3F865 +:1037A000022801D000B1FFDF02231022314604F1CC +:1037B0005E0009F09CFAB4F860000028D0D1F0E671 +:1037C00010B586B00446FDF737FF0078222811D9DE +:1037D0000121204609F0B0FB040000D1FFDF0620E4 +:1037E0008DF80000694604F1E0000BF07CF8002839 +:1037F00000D0FFDF06B010BD2DE9F84F0546007878 +:103800000C460027010904F1080090463E46BA46DE +:10381000009002297ED0072902D00A2909D142E06E +:1038200068680178082905D00B292CD00C292AD0EA +:10383000FFDF73E114271C26002C6CD04088A08089 +:10384000FDF7FAFE5FEA000900D1FFDF99F81700E3 +:1038500009F118014008009AFDF7C9FE68688089DF +:10386000208268684168C4F812108068C4F81600A5 +:10387000A07E20F0060040F00100A07699F81E001E +:1038800040F020014FE01A270A26002CD5D080886E +:10389000A080FDF7D1FE050000D1FFDF284600998A +:1038A000FFF768FC3AE10CB1A88BA080287A4FF0B2 +:1038B000010B0B287ED006DC01287CD0022808D022 +:1038C000032804D137E00D2876D00E2875D0FFDF0D +:1038D00024E11E270926002CAFD0A088FDF7ACFEFE +:1038E0005FEA000900D1FFDF287B00F00300012818 +:1038F000207A1DD020F001002072297B890861F315 +:1039000041002072297BC90861F382002072297B63 +:10391000090901E0F7E0AEE061F3C300207299F815 +:103920001E0040F0400189F81E10F7E0C40100209D +:1039300040F00100E0E713270D26002CA6D0A08858 +:10394000FDF77AFE81460121A08809F0F5FA05000D +:1039500000D1FFDF686F817801F003010129217A2E +:1039600050D021F00101217283789B0863F341015B +:1039700021728378DB0863F38201217283781B094B +:1039800063F3C3012172037863F306112172437854 +:1039900063F3C711217284F809A0C178A17202797A +:1039A000E17A62F30001E1720279520862F34101A7 +:1039B000E17203E029E067E04EE05FE002799208FF +:1039C00062F38201E1720279D20862F3C301E1720B +:1039D0004279217B62F3000121734279520862F33C +:1039E000410121734279920862F382012173407987 +:1039F000C00860F3C301217399F8000023282AD975 +:103A0000262139E041F00101ADE71827102694B3D3 +:103A1000A088FDF711FE00900121A08809F08CFA22 +:103A20005FEA000900D1FFDFE868A06099F80000B4 +:103A300040F0040189F8001099F80100800708D5CA +:103A400084F80CB000980078232867D927210098C3 +:103A500052E084F80CA061E015270F265CB1A08825 +:103A6000FDF7EAFD81460622E8680099FFF76FFA44 +:103A700084F80EB086E042E048463DE0162709266D +:103A8000ECB3287B207249E0287B19270E26B4B3BB +:103A9000C4F808A0A4F80CA0012807D0022808D078 +:103AA00003280CD004280AD0FFDF15E084F808B002 +:103AB00001E002202072607A20F003000BE0697BB5 +:103AC000042801F00F0141F080012172F3D1607AE6 +:103AD00020F00300401C6072A088FDF7ADFD054694 +:103AE000007821281AD0232800D0FFDF0121A088E8 +:103AF00009F034FA22212846FDF737FC0EE0FFE7F3 +:103B0000A8F800600FE00CB16888A080287A03282C +:103B100022D0042809D005283AD0FFDFA8F8006099 +:103B20000CB127806680002005E415270F26002CA5 +:103B3000E6D0A088FDF780FD0121A08809F0FCF9FE +:103B4000050000D1FFDFD5F81D0006220099FFF720 +:103B5000FEF984F80EA0E1E717270926002CCFD044 +:103B6000A088FDF769FD81460121A08809F0E4F9EC +:103B7000050000D1FFDF6878800701D5022000E052 +:103B80000120207299F800002328C7D9272173E764 +:103B900019270E26002CB3D0A088FDF74DFD5FEA53 +:103BA000000900D1FFDFC4F808A0A4F80CA084F835 +:103BB00008A0A07A40F00300A07299F81E10C9096D +:103BC00061F38200A07299F81F2099F81E1012EA82 +:103BD000D11F05D099F8201001F01F01102925D020 +:103BE00020F00800A07299F81F10607A61F3C300FA +:103BF0006072697A01F0030101298FD140F004005D +:103C00006072E87A217B60F300012173AA7A607BFD +:103C100062F300006073EA7A520862F34101217393 +:103C2000A97A490861F34100607377E740F0080022 +:103C3000D8E710B5FA4C30B10146102204F120004B +:103C400014F01DF9012084F8300010BD10B50446B1 +:103C500000F0ADFCF24920461022BDE810402031B2 +:103C600014F00DB970B5EE4D06004FF0000413D0FE +:103C70000CF010FE08B110240CE006213046FFF7CE +:103C80004DF9411C05D028665FF0010085F85C0005 +:103C900000E00724204670BD0020F7E7007810F010 +:103CA0000F0204D0012A05D0022A0CD110E000092D +:103CB00009D10AE00009012807D0022805D003280D +:103CC00003D0042801D007207047087000207047F7 +:103CD0000620704705282AD2DFE800F003070F17F7 +:103CE0001F00087820F0FF001EE0087820F00F0089 +:103CF000401C20F0F000103016E0087820F00F0093 +:103D0000401C20F0F00020300EE0087820F00F007A +:103D1000401C20F0F000303006E0087820F00F0062 +:103D2000401C20F0F0004030087000207047072051 +:103D300070472DE9F043804687B00D464FF00009EB +:103D400008460CF0F4FDA8B94046FDF775FC0600E6 +:103D500003D0307822280BD104E043F2020007B0F0 +:103D6000BDE8F08335B1B07FC10601D4000703D5AB +:103D70000820F4E71020F2E7F07F000701D50D20BE +:103D8000EDE700270121404609F0D6F8040006D1EE +:103D900001210022404609F0C6F8040005D069461A +:103DA00000F015FC009818B901E00420D7E7FFDF08 +:103DB00000980221E0344170C0F8248044610781FA +:103DC00001210171297801F00102017E62F30101F4 +:103DD00001762A78520862F3820101762A789208E5 +:103DE00062F3C30101762A78D20862F304110176E6 +:103DF00024213046FDF7B9FA01A900980AF08EFD9A +:103E0000022801D000B1FFDF4846A8E72DE9FF4FA7 +:103E10009046844A0E4697B09A4607CA14AB4FF0B4 +:103E2000000983E807001798FDF706FC050006D097 +:103E30002878262806D008201BB0BDE8F08F43F272 +:103E40000200F9E726B94046FFF7F0F80028F3D161 +:103E50000121179809F070F8040000D1FFDF852ECA +:103E600027D007DCEEB1812E1DD0822E1DD0832EEF +:103E700008D11CE0862E1ED0882E1ED0892E1ED082 +:103E80008A2E1ED00F2020710F281CD003F0A2FF15 +:103E9000D8B101208DF82C00201D0C902079B0B1F4 +:103EA00032E10020EFE70120EDE70220EBE70320FD +:103EB000E9E70520E7E70620E5E70820E3E7092032 +:103EC000E1E70A20DFE70720B6E71120B4E798F81A +:103ED0000000D4E91D764208A87F002162F3C710D4 +:103EE000A87798F800008208E87F62F30000E8777E +:103EF00098F80000C209607862F34100607098F899 +:103F000000000209207862F34710207098F8000042 +:103F1000C208607862F30000607098F80100607178 +:103F200098F8000000F00102B07862F30100B07070 +:103F3000AA7FD20962F38200B070EA7F62F3C30005 +:103F4000B070627862F30410B0702278C0F3C000E1 +:103F5000520932706278C2F34002727098F80220FF +:103F6000F27071713171B978C1F3C00108405FEA34 +:103F7000000B2ED050460CF08DFC98BBDAF80C00EC +:103F80000CF088FC70BBDAF81C000CF083FC48BB1A +:103F9000DAF80C00A060DAF81C00E060797860784C +:103FA00001F0010140EA41006070B978C0B2C1F38C +:103FB0000011891E084060700020207705F117006D +:103FC0006061681CA061B07800F0030001280AD08D +:103FD0004AE07978607801F00101FD2242EA41016E +:103FE0000840E1E719E0B87800F0030001283BD170 +:103FF000321D711D404600F099FA30793979084038 +:104000008DF8480071797A7911408DF828100843AD +:104010002AD050460CF03EFC30B110200CE70000D6 +:10402000C40100203C8301000AF1100004F5AE73C6 +:1040300004F18C028DE80D00002112AB5A46204697 +:10404000FFF737F80028E9D104F5B07204F1A403B2 +:10405000CDF800A0CDE9013201210AAB5A46204635 +:10406000FFF727F80028D9D16078800722D4B078EC +:10407000B978C0F38000C1F3800108431AD03078CA +:1040800014AA397832F810204B00DA4002F0030904 +:10409000B9F1030F01D14FF00209BBF1000F09D0B4 +:1040A000012801D0042805D1012901D0042901D11A +:1040B0004FF00409A87F40F08000A877E87F6BF3F9 +:1040C0000000E877607881074FF003000CD5A071FD +:1040D000BBF1000F18D100BF8DF84C0013AA294680 +:1040E000179800F04DFA0FE00221B9F1020F1AD033 +:1040F000B9F1010F19D0B9F1040F22D00020A0713D +:10410000A87F20F08000A87725212846FDF72DF90B +:104110000BA904F1E0000AF0E6FB10B1022800D080 +:10412000FFDF002088E6A171D6E7A1710D2104F11F +:10413000200013F045FF207840F00200207004209A +:10414000CAE70120A071DFE72DE9F04387B0904670 +:10415000894604460025FDF76FFA070004D0387839 +:10416000272804D00820FAE543F20200F7E50121F0 +:10417000204608F0E1FE040000D1FFDFA6795FEAE7 +:10418000090005D0012821D0B9F1020F26D110E095 +:10419000B8F1000F22D1012E05D0022E05D0032E3A +:1041A00005D0FFDF2DE00C252BE0012529E00225BD +:1041B00027E040460CF06EFBB0B9032E0ED1102262 +:1041C000414604F11D0013F05AFE1AE0012E02D000 +:1041D000022E03D104E0B8F1000F12D00720BEE593 +:1041E00040460CF057FB08B11020B8E5102104F14F +:1041F0001D0013F0C3FE06214046FEF78FFEC4F8F3 +:104200001D002078252140F0020020703846FDF77F +:10421000ACF82078C10713D020F0010020700220F4 +:104220008DF8000004F11D0002908DF804506946DD +:10423000C3300AF058FB022803D010B1FFDF00E0C2 +:10424000257700208BE530B587B00D460446FDF795 +:10425000F3F960B10121204608F06EFE04000CD095 +:1042600028460CF017FB28B1102007B030BD43F2F0 +:104270000200FAE72078400701D40820F5E7294634 +:1042800004F13D002022054613F0F9FD207840F0AE +:104290001000207001070FD520F0080020700720C3 +:1042A0008DF80000694604F1E00001950AF01BFB5F +:1042B000022801D000B1FFDF0020D6E770B50D461F +:1042C0000646FDF7B9F918B10078272817D102E0A2 +:1042D00043F2020070BD0121304608F02DFE0400BB +:1042E00000D1FFDFA079022809D16078C00706D08D +:1042F0002A4621463046FEF76CFF10B10FE0082039 +:1043000070BDB4F860000E280BD204F162010223E4 +:104310001022081F08F0B5FC012101704570002033 +:1043200070BD112070BD70B5064614460D46084696 +:104330000CF0B0FA18B920460CF0D2FA08B11020EF +:1043400070BDA6F57F40FF380ED03046FDF774F9FA +:1043500038B1417822464B08811C1846FDF747F9D1 +:1043600007E043F2020070BD2046FDF772FE002810 +:10437000F9D11021E01D0BF096FFE21D294604F152 +:10438000170000F034F9002070BD2DE9F04104461B +:104390008AB015460E46002708460CF0C8FA18B930 +:1043A00028460CF0C4FA18B110200AB0BDE8F0811C +:1043B0002046FDF741F95FEA000804D098F80000B4 +:1043C000272810D102E043F20200EEE70121204647 +:1043D00008F0B2FD040000D1FFDF2078400702D5CD +:1043E0006078800701D40820DFE7D4E91D0149780F +:1043F00001B18DB1407800B176B1ADB1EA1D06A82A +:10440000E16800F0F4F8102206A905F1170013F096 +:104410000AFD18B1042707E00720C6E71022E91DAE +:1044200004F12D0013F02BFD2EB11022F11D04F12B +:104430001D0013F024FD2078252140F0020020709B +:104440004046FCF792FF2078C10715D020F001000C +:10445000207002208DF8000004F11D000290103041 +:1044600003908DF804706946B3300AF03CFA0228D4 +:1044700003D010B1FFDF00E02777002095E770B58B +:104480000D4606460BB1072070BDFDF7D5F80400B8 +:1044900007D02078222802D3A07F800604D40820E9 +:1044A00070BD43F2020070BDADB12946304607F041 +:1044B00063FD03F0AFFA297C4A08A17F62F3C711BC +:1044C000A177297CE27F61F30002E277297C8908E9 +:1044D00084F8201004E0304607F071FD03F09AFAEA +:1044E000A17F21F02001A17770BD70B50D46FDF7C9 +:1044F000A3F8040005D028460CF0F2F920B11020F2 +:1045000070BD43F2020070BD29462046FEF732FE20 +:10451000002070BD05E000BF10F8012B0AB100209B +:104520007047491E89B2F7D20120704710B5C47890 +:104530000B7864F300030B70C478640864F34103E0 +:104540000B70C478A40864F382030B70C478E40889 +:1045500064F3C3030B700379117863F300011170E6 +:1045600003795B0863F34101117003799B0863F3DE +:10457000820111700079C00860F3C301117010BD91 +:1045800070B51546064603F025FC040000D1FFDF98 +:10459000207820F00F00801C20F0F00020302070E8 +:1045A00066802868A060BDE8704003F016BC10B5B6 +:1045B000134C94F83000002808D104F12001A1F137 +:1045C00010000AF0D2F9012084F8300010BD10B1BB +:1045D00090F8B9202AB10A4890F8350018B10020A7 +:1045E00003E0B83001E0064834300860704708B591 +:1045F0000023009313460A4608F099FE08BD000008 +:10460000C4010020F0B5007B059F1E4614460D46F0 +:10461000012800D0FFDF0C2030803A203880002CA9 +:1046200008D0287A032806D0287B012800D0FFDF95 +:1046300017206081F0BDA889FBE72DE9F04786B01F +:10464000144691F80C900E9A0D46B9F1010F0BD05B +:104650001021007B2E8A8846052807D0062833D0F3 +:10466000FFDF06B0BDE8F0870221F2E7E8890C2100 +:1046700000EB400001EB4000188033201080002C3C +:10468000EFD0E889608100271AE00096688808F179 +:10469000020301AA696900F084FF06EB0800801C90 +:1046A00007EB470186B204EB4102BDF8040090819C +:1046B0000DF1060140460E320AF0C0F97F1CBFB270 +:1046C0006089B842E1D8CCE734201080E889B9F19C +:1046D000010F11D0122148430E301880002CC0D099 +:1046E000E88960814846B9F1010F00D002202073AB +:1046F00000270DF1040A1FE00621ECE70096688808 +:1047000008F1020301AA696900F04BFF06EB0800FB +:10471000801C86B2B9F1010F12D007EBC70004EB81 +:104720004000BDF80410C18110220AF102011030CE +:1047300013F0A5FB7F1CBFB26089B842DED890E7BA +:1047400007EB470104EB4102BDF80400D0810AF1F8 +:104750000201404610320AF071F9EBE72DE9F0470B +:104760000E4688B090F80CC096F80C80378AF58910 +:104770000C20109902F10C044FF0000ABCF1030F59 +:1047800008D0BCF1040F3ED0BCF1070F7DD0FFDF95 +:1047900008B067E705EB850C00EB4C001880312072 +:1047A0000880002AF4D0A8F1060000F0FF09558126 +:1047B00025E0182101A813F003FC009770884346F8 +:1047C00001AA716900F0EDFEBDF804002080BDF87B +:1047D0000600E080BDF808002081A21C0DF10A014E +:1047E00048460AF02BF9B9F1000F00D018B184F84F +:1047F00004A0A4F802A007EB080087B20A346D1EDB +:10480000ADB2D6D2C4E705EB850C00EB4C001880A6 +:1048100032200880002ABBD0A8F1050000F0FF0973 +:10482000558137E000977088434601AA716900F00E +:10483000B8FE9DF80600BDF80410E1802179420819 +:1048400060F3000162F34101820862F38201C20851 +:1048500062F3C301020962F30411420962F34511D4 +:10486000820962F386112171C0096071BDF80700E9 +:10487000208122460DF1090148460AF0DFF818B1FF +:1048800084F802A0A4F800A000E007E007EB08000D +:1048900087B20A346D1EADB2C4D279E7A8F1020026 +:1048A00084B205FB08F000F10E0CA3F800C035231C +:1048B0000B80002AA6D055819481009783B270881E +:1048C0000E32716900F06DFE62E72DE9F84F1E4669 +:1048D0000A9D0C4681462AB1607A00F58070D0802E +:1048E000E089108199F80C000C274FF000084FF078 +:1048F0000E0A0D2873D2DFE800F09E070E1C283048 +:104900003846556A73737300214648460095FFF791 +:1049100079FEBDE8F88F207B9146082802D0032855 +:1049200000D0FFDF378030200AE000BFA9F80A80FE +:10493000EFE7207B9146042800D0FFDF378031204D +:104940002880B9F1000FF1D1E3E7207B91460428DC +:1049500000D0FFDF37803220F2E7207B914602282B +:1049600000D0FFDF37803320EAE7207B174602289C +:1049700000D0FFDF3420A6F800A02880002FC8D088 +:10498000A7F80A80C5E7207B1746042800D0FFDF80 +:104990003520A6F800A02880002FBAD04046A7F8FE +:1049A0000A8012E0207B1746052802D0062800D096 +:1049B000FFDF1020308036202880002FA9D0E0892A +:1049C0007881A7F80E80B9F80E00B881A1E7207BA6 +:1049D0009146072800D0FFDF37803720B0E72AE074 +:1049E0004FF0120018804FF038001700288090D048 +:1049F000E0897881A7F80E80A7F8108099F80C005C +:104A00000A2805D00B2809D00C280DD0FFDF80E73D +:104A1000207B0A2800D0FFDF01200AE0207B0B2842 +:104A200000D0FFDF042004E0207B0C2800D0FFDF53 +:104A3000052038736DE7FFDF6BE770B50C46054660 +:104A4000FCF7FAFD20B10078222804D2082070BDBE +:104A500043F2020070BD0521284608F06DFA20607F +:104A600008B1002070BD032070BD30B448800878C4 +:104A700020F00F00C01C20F0F000903001F8080B6F +:104A80001DCA81E81D0030BC03F0A7B92DE9FF471E +:104A900084B00027824602970798904689461230D4 +:104AA00004F03CFA401D20F00306079828B907A936 +:104AB0005046FFF7C2FF002854D1B9F1000F05D0CE +:104AC0000798017B19BB052504681BE098F80000D6 +:104AD000092803D00D2812D0FFDF46E007990325EF +:104AE0004868B0B3497B42887143914239D98AB250 +:104AF000B3B2011D08F0B1F80446078002E0079C3C +:104B0000042508340CB1208810B1032D29D02CE0E5 +:104B100007980121123004F033FAADF80C00024678 +:104B200002AB2946504606F0D5FA070001D1A01C79 +:104B3000029007983A461230C8F80400A8F802A07C +:104B400003A94046029B04F028FAD8B10A2817D2DC +:104B500000E006E0DFE800F007091414100B0D1464 +:104B60001412132014E6002012E6112010E608208B +:104B70000EE643F203000BE6072009E60D2007E6E8 +:104B8000032005E6BDF80C002346CDE900702A4657 +:104B90005046079900F015FD57B9032D08D1079825 +:104BA000B3B2417B406871438AB2011D08F069F8D5 +:104BB000B9F1000FD7D0079981F80C90D3E72DE910 +:104BC000FE4F91461A881C468A468046FAB102ABCF +:104BD000494606F07FFA050019D04046A61C2788F2 +:104BE00008F0EEFA3246072629463B46009607F0C3 +:104BF0001AFF20882346CDE900504A4651464046D8 +:104C000000F0DFFC002020800120BDE8FE8F0020A6 +:104C1000FBE710B586B01C46AAB104238DF800301E +:104C20001388ADF808305288ADF80A208A788DF8DC +:104C30000E200988ADF80C1000236A462146FFF7C4 +:104C400025FF06B010BD1020FBE770B50D4605210D +:104C500008F072F9040000D1FFDF294604F11200C8 +:104C6000BDE8704004F075B92DE9F8430D46804663 +:104C7000002603F0AFF804462878102878D2DFE841 +:104C800000F0773B34533131123131310831313159 +:104C900031312879001FC0B2022801D0102810D16C +:104CA00014BBFFDF35E004B9FFDF0521404608F003 +:104CB00043F9007B032806D004280BD0072828D00E +:104CC000FFDF072655E02879801FC0B2022820D0D8 +:104CD00050B1F6E72879401FC0B2022819D0102839 +:104CE00017D0EEE704B9FFDF13E004B9FFDF28793E +:104CF00001280ED1172137E00521404608F01CF9A4 +:104D0000070000D1FFDF07F11201404604F0FEF872 +:104D10002CB12A4621464046FFF7A7FE29E0132181 +:104D20004046FDF743FC24E004B9FFDF052140467F +:104D300008F002F9060000D1FFDF694606F1120013 +:104D400004F0EEF8060000D0FFDFA988172901D291 +:104D5000172200E00A46BDF80000824202D901464F +:104D600002E005E01729C5D3404600F03AFCD0E741 +:104D7000FFDF3046BDE8F883401D20F0030219B183 +:104D800002FB01F0001D00E000201044704713B545 +:104D9000009848B10024684607F009FF002C02D1B2 +:104DA000F74A009911601CBD01240020F4E72DE9A9 +:104DB000F0470C4615462421204613F001F905B9A9 +:104DC000FFDFA87860732888DFF8B4A3401D20F0C7 +:104DD0000301AF788946DAF8000007F006FF060005 +:104DE00000D1FFDF4FF000082660A6F8008077B101 +:104DF00009FB07F1091D0AD0DAF8000007F0F5FEFB +:104E0000060000D1FFDF6660C6F8008001E0C4F84C +:104E10000480298804F11200BDE8F04704F068B866 +:104E20002DE9F047804601F112000D46814604F05D +:104E300075F8401DD24F20F003026E7B144629689E +:104E4000386807F0FDFE3EB104FB06F2121D03D0E8 +:104E50006968386807F0F4FE052008F019F8044680 +:104E6000052008F01DF8201A012802D1386807F043 +:104E7000B1FE49464046BDE8F04704F04EB870B573 +:104E80000546052108F058F8040000D1FFDF04F1C1 +:104E900012012846BDE8704004F038B82DE9F04F03 +:104EA00091B04FF0000BADF834B0ADF804B04788C6 +:104EB0000C46054692460521384608F03DF80600A6 +:104EC00000D1FFDF24B1A780A4F806B0A4F808B091 +:104ED000297809220B20B2EB111F7DD12A7A04F127 +:104EE000100138274FF00C084FF001090391102AE8 +:104EF00073D2DFE802F072F2F1F07F08D2888D9F62 +:104F00003DDBF3EEB6B6307B022800D0FFDFA88988 +:104F100008EBC001ADF804103021ADF83410002CBE +:104F200025D06081B5F80E9000271DE004EBC7087E +:104F3000317C88F80E10F189A8F80C10CDF800909B +:104F40006888042304AA296900F02BFBBDF810101F +:104F5000A8F8101009F10400BDF812107F1C1FFA08 +:104F600080F9A8F81210BFB26089B842DED80DE10E +:104F7000307B022800D0FFDFE98908EBC100ADF8E3 +:104F800004003020ADF83400287B0A90001FC0B226 +:104F90000F90002CEBD06181B5F81090002725E030 +:104FA000CDF800906888696903AA0A9B00F0F9FAB5 +:104FB0000A9804EBC70848441FFA80F908F10C026C +:104FC00004A90F9809F03AFD18B188F80EB0A8F8B6 +:104FD0000CB0BDF80C1001E0D4E0CFE0A8F8101040 +:104FE000BDF80E107F1CA8F81210BFB26089B8423D +:104FF000D6D8CBE00DA8009001AB2246294630461A +:10500000FFF71BFBC2E0307B082805D0FFDF03E081 +:10501000307B082800D0FFDFE8891030ADF80400AD +:105020003620ADF83400002C3FD0A9896181F18988 +:10503000A18127E0307B092800D0FFDFA88900F19B +:105040000C01ADF804103721ADF83410002C2CD031 +:105050006081E8890090AB89688804F10C022969B5 +:1050600056E0E8893921103080B2ADF80400ADF87F +:105070003410002C74D0A9896181287A0E280AD0B6 +:1050800002212173E989E181288A0090EB896888EF +:105090006969039A3CE00121F3E70DA8009001AB98 +:1050A000224629463046FFF759FB6FE0307B0A283D +:1050B00000D0FFDF1220ADF80400ADF834704CB31F +:1050C000A9896181A4F810B0A4F80EB084F80C90FE +:1050D0005CE020E002E031E039E042E0307B0B2888 +:1050E00000D0FFDF288AADF834701230ADF804002C +:1050F00084B104212173A9896181E989E181298A27 +:105100002182688A00902B8A688804F112026969FA +:1051100000F047FA3AE0307B0C2800D0FFDF122085 +:10512000ADF80400ADF834703CB305212173A4F848 +:105130000AB0A4F80EB0A4F810B027E00DA80090B3 +:1051400001AB224629463046FFF75CFA1EE00DA867 +:10515000009001AB224629463046FFF7B6FB15E02A +:1051600034E03B21ADF80400ADF8341074B3A4F87A +:105170000690A4F808B084F80AB007E0FFDF05E065 +:1051800010000020297A012917D0FFDFBDF80400A4 +:10519000AAF800006CB1BDF834002080BDF804000E +:1051A0006080BDF83400392803D03C2801D086F84F +:1051B0000CB011B00020BDE8F08F3C21ADF8040028 +:1051C000ADF8341014B1697AA172DFE7AAF80000D3 +:1051D000EFE72DE9F84356880F468046154605212E +:1051E000304607F0A9FE040000D1FFDF123400941E +:1051F0003B46414630466A6804F003F8BAE570B5AC +:105200000D46052107F098FE040000D1FFDF294676 +:1052100004F11200BDE8704003F08DBE70B50D467C +:10522000052107F089FE040000D1FFDF294604F1C3 +:105230001200BDE8704003F0ABBE70B50546052115 +:1052400007F07AFE040000D1FFDF04F108032146D5 +:105250002846BDE870400422B1E470B5054605213A +:1052600007F06AFE040000D1FFDF214628462368CC +:10527000BDE870400522A2E470B50646052107F09E +:105280005BFE040000D1FFDF04F1120003F046FED4 +:10529000401D20F0030511E0011D00880322431882 +:1052A00021463046FFF78BFC00280BD0607BABB269 +:1052B000684382B26068011D07F019FD606841888B +:1052C0000029E9D170BD70B50E46054602F082FD99 +:1052D000040000D1FFDF0120207266726580207813 +:1052E00020F00F00C01C20F0F00030302070BDE82E +:1052F000704002F072BD2DE9F0438BB00D461446AC +:10530000814606A9FFF799FB002814D14FF6FF76D6 +:1053100001274FF420588CB103208DF80000102095 +:10532000ADF8100007A8059007AA204604A909F0C7 +:10533000A4FB78B107200BB0BDE8F0830820ADF8DE +:1053400008508DF80E708DF80000ADF80A60ADF8C9 +:105350000C800CE00698A17801742188C1818DF839 +:105360000E70ADF80850ADF80C80ADF80A606A46D2 +:1053700002214846069BFFF789FBDCE708B50122BE +:105380008DF8022042F60202ADF800200A460323FF +:105390006946FFF73EFC08BD08B501228DF80220E2 +:1053A00042F60302ADF800200A4604236946FFF7DF +:1053B00030FC08BD00B587B079B102228DF800201D +:1053C0000A88ADF808204988ADF80A1000236A461B +:1053D0000521FFF75BFB07B000BD1020FBE709B11B +:1053E000072316E40720704770B588B00D461446B1 +:1053F000064606A9FFF721FB00280ED17CB1062046 +:10540000ADF808508DF80000ADF80A40069B6A46DA +:105410000821DC813046FFF739FB08B070BD05205C +:105420008DF80000ADF80850F0E700B587B059B12D +:1054300007238DF80030ADF80820039100236A4659 +:105440000921FFF723FBC6E71020C4E770B588B039 +:105450000C460646002506A9FFF7EFFA0028DCD126 +:1054600006980121123003F08BFD9CB121780629AA +:1054700021D2DFE801F0200505160318801E80B256 +:10548000C01EE28880B20AB1A3681BB1824203D970 +:105490000C20C2E71020C0E7042904D0A08850B92E +:1054A00001E00620B9E7012913D0022905D004291B +:1054B0001CD005292AD00720AFE709208DF800006D +:1054C0006088ADF80800E088ADF80A00A068039095 +:1054D00023E00A208DF800006088ADF80800E0881D +:1054E000ADF80A00A0680A25039016E00B208DF89D +:1054F00000006088ADF80800A088ADF80A00E088D8 +:10550000ADF80C00A0680B25049006E00C208DF887 +:10551000000060788DF808000C256A462946304660 +:10552000069BFFF7B3FA78E700B587B00D228DF838 +:105530000020ADF8081000236A461946FFF7A6FAC6 +:1055400049E700B587B071B102228DF800200A88C2 +:10555000ADF808204988ADF80A1000236A460621F4 +:10556000FFF794FA37E7102035E770B586B00646A6 +:1055700001200D46ADF808108DF80000014600230B +:105580006A463046FFF782FA040008D129463046C1 +:1055900001F0BCFA0021304601F0D6FA204606B0F0 +:1055A00070BDF8B51C4615460E46069F07F0F6FD81 +:1055B0002346FF1DBCB231462A46009407F0FFF98E +:1055C000F8BD30B41146DDE902423CB1032903D0F5 +:1055D000002330BC05F0B3BE0123FAE71A8030BCCB +:1055E000704770B50C460546FFF72FFB214628464D +:1055F00001F09BFA2846BDE87040012101F0A4BAF1 +:1056000018B18178012938D101E010207047018854 +:1056100042F60112881A914231D018DC42F601029A +:10562000A1EB020091422AD00CDC41B3B1F5C05F7E +:1056300025D06FF4C050081821D0A0F57060FF3855 +:105640001BD11CE001281AD002280AD117E0B0F5BE +:10565000807F14D008DC012811D002280FD0032845 +:105660000DD0FF2809D10AE0B0F5817F07D0A0F561 +:105670008070033803D0012801D0002070470F202C +:1056800070470A281ED007DC18D2DFE800F0191B8B +:105690001F1F171F231D1F21102815D008DC0B28E2 +:1056A00012D00C2810D00D2816D00F2806D10DE0EE +:1056B00011280BD084280BD087280FD003207047E7 +:1056C0000020704705207047072070470F20704763 +:1056D00004207047062070470C20704743F20200F8 +:1056E000704738B50C46050041D06946FEF7D6FA3A +:1056F000002819D19DF80010607861F302006070F5 +:105700006946681CFEF7CAFA00280DD19DF8001002 +:10571000607861F3C5006070A978C1F34101012987 +:1057200003D0022905D0072038BD217821F02001BF +:1057300002E0217841F020012170410704D0A978CE +:10574000C90861F386106070607810F0380F07D0D8 +:10575000A978090961F3C710607010F0380F02D101 +:105760006078400603D5207840F04000207000208B +:1057700038BD70B504460020088015466068FFF704 +:10578000B0FF002816D12089A189884211D860680D +:105790008078C0070AD0B1F5007F0AD840F2012016 +:1057A000B1FBF0F200FB1210288007E0B1F5FF7F9B +:1057B00001D90C2070BD01F201212980002070BDAB +:1057C00010B50478137864F3000313700478640848 +:1057D00064F3410313700478A40864F38203137024 +:1057E0000478E40864F3C30313700478240964F3B1 +:1057F000041313700478640964F34513137000787C +:10580000800960F38613137031B10878C10701D1A4 +:10581000800701D5012000E0002060F3C71313705A +:1058200010BD4278530702D002F0070306E012F0E1 +:10583000380F02D0C2F3C20300E001234A7863F3B9 +:1058400002024A70407810F0380F02D0C0F3C20054 +:1058500005E0430702D000F0070000E0012060F3FC +:10586000C5024A7070472DE9F04F95B00D00824691 +:1058700012D01221284612F081FB4FF6FF7B05AAB9 +:105880000121584605F021FA0024264637464FF4F8 +:1058900020586FF4205972E0102015B0BDE8F08F49 +:1058A0009DF81E0001280AD1BDF81C1041450BD0FF +:1058B00011EB09000AD001280CD002280CD0042CCE +:1058C0000ED0052C0FD10DE0012400E00224BDF81C +:1058D0001A6008E0032406E00424BDF81A7002E010 +:1058E000052400E00624BDF81A10514547D12C7458 +:1058F000BEB34FF0000810AA4FF0070ACDE90282AC +:10590000CDE900A80DF13C091023CDF810904246D6 +:105910003146584605F08CFA08BBBDF83C002A46D3 +:10592000C0B210A909F08AF8C8B9AE81CFB1CDE9EB +:1059300000A80DF1080C0AAE40468CE84102132382 +:1059400000223946584605F073FA40B9BDF83C00CC +:10595000F11CC01EC0B22A1D09F070F810B103205E +:105960009BE70AE0BDF82900E881062C05D19DF8E7 +:105970001E00A872BDF81C00288100208DE705A834 +:1059800005F0AFF900288BD0FFF77BFE85E72DE906 +:10599000F0471C46DDE90978DDF8209015460E0039 +:1059A000824600D1FFDF0CB1208818B1D5B111209B +:1059B000BDE8F087022D01D0012100E0002106F1B1 +:1059C000140004F071F8A8F8000002463B4629468E +:1059D000504605F07FFBC9F8000008B9A41C3C60E4 +:1059E0000020E5E71320E3E7F0B41446DDE90452B4 +:1059F0008DB1002314B1022C09D101E0012306E08E +:105A00000D7CEE0703D025F0010501230D7421461E +:105A1000F0BC05F094BC1A80F0BC70472DE9FE4F35 +:105A200091461A881C468A468046FAB102AB49461E +:105A300005F050FB050019D04046A61C278807F04A +:105A4000BFFB3246072629463B46009606F0EBFF91 +:105A500020882346CDE900504A4651464046FFF78C +:105A6000C3FF002020800120BDE8FE8F0020FBE75F +:105A70002DE9F04786B09146DDE90E460F46824695 +:105A800003AA05A904A8109D8DE807009846324690 +:105A900021465046FFF77BFF049909B1012200E03F +:105AA00000222A70002818D1F94A03AB1060059A29 +:105AB000009104F11400CDE901204A4639465046D0 +:105AC00004F0A9FBA8B1092811D2DFE800F005080D +:105AD0000510100A0C0C0E00002006B068E711201B +:105AE000FBE70720F9E70820F7E70D20F5E703209B +:105AF000F3E7BDF80C100498CDE9000143463246A7 +:105B000021465046FFF770FFE6E72DE9F04389B0E4 +:105B10000D46DDE9108781461C461646142103A870 +:105B200012F04EFA012002218DF810108DF80C00B1 +:105B30008DF81170ADF8146064B1A278D20709D065 +:105B40008DF81600E088ADF81A00A088ADF81800AE +:105B5000A068079008A80095CDE90110424603A966 +:105B600048466B68FFF784FF09B0BDE8F083F0B5E5 +:105B70008BB000240646069407940727089405A8CE +:105B80000994019400970294CDE903400D46102337 +:105B90002246304605F04CF978B90AA806A90194C6 +:105BA00000970294CDE90310BDF814300022294675 +:105BB000304604F013FF002801D0FFF762FD0BB060 +:105BC000F0BD04F0B3BD2DE9FC410C468046002633 +:105BD00002F000F9054620780D287DD2DFE800F0BC +:105BE000BC0713B325BD49496383AF959B00A84803 +:105BF000006820B1417841F010014170ADE04046AD +:105C000002F018F9A9E00421404607F095F90700D1 +:105C100000D1FFDF07F11401404603F0D9FEA5BB18 +:105C200013214046FCF7C2FC97E00421404607F0F0 +:105C300083F9070000D1FFDFE088ADF80000002005 +:105C4000B8819DF80000010704D5C00602D5A088E0 +:105C5000B88105E09DF8010040067ED5A088F88156 +:105C600005B9FFDF22462946404601F063FC0226C3 +:105C700073E0E188ADF800109DF8011009060FD51A +:105C8000072803D006280AD00AE024E00421404671 +:105C900007F052F9060000D1FFDFA088F08102264C +:105CA000CDB9FFDF17E00421404607F045F90700B2 +:105CB00000D1FFDF07F1140004F06FFD90F0010F39 +:105CC00002D1E079000648D5387C022640F0020077 +:105CD000387405B9FFDF00E03EE022462946404621 +:105CE00001F028FC39E00421404607F025F9017C49 +:105CF000002D01F00206C1F340016171017C21F029 +:105D000002010174E7D1FFDFE5E7022601214046E9 +:105D100002F0C2F821E00421404607F00DF90546E3 +:105D2000606800902089ADF8040001226946404671 +:105D300002F0D3F8287C20F0020028740DE0002D3A +:105D4000C9D1FFDFC7E7022600214046FFF766FA08 +:105D5000002DC0D1FFDFBEE7FFDF3046BDE8FC818C +:105D60003EB50C0009D001466B4601AA002005F0A3 +:105D7000E1F820B1FFF785FC3EBD10203EBD0020BC +:105D80002080A0709DF8050002A900F00700FDF733 +:105D9000A1FF50B99DF8080020709DF8050002A9E8 +:105DA000C0F3C200FDF796FF08B103203EBD9DF889 +:105DB000080060709DF80500C109A07861F3041027 +:105DC000A0709DF80510890961F3C300A0709DF8CB +:105DD0000410890601D5022100E0012161F342008F +:105DE0009DF8001061F30000A07000203EBD70B56A +:105DF000144606460D4651EA040005D075B1084622 +:105E00000AF08CFD78B901E0072070BD29463046C4 +:105E100005F0F1F810B1BDE8704032E454B120460D +:105E20000AF07CFD08B1102070BD21463046BDE867 +:105E3000704095E7002070BD2DE9FC5F0C46904650 +:105E40000546002701780822007A3E46B2EB111F72 +:105E50007ED104F10A0100910A31821E4FF0020A3C +:105E600004F1080B0191092A73D2DFE802F0ECDF9C +:105E700005F427277AA9CD006888042107F05CF88B +:105E8000060000D1FFDFB08920B152270726C2E00B +:105E90002802002051271026002C7DD06888A08081 +:105EA0000120A071A88900220099FFF7A0FF002817 +:105EB00073D1A8892081288AE081D1E0B5F81290B9 +:105EC000072824D1E87B000621D5512709F11400C9 +:105ED00086B2002CE1D0A88900220099FFF787FF45 +:105EE00000285AD16888A08084F806A0A88920815B +:105EF0000120A073288A2082A4F81290A88A00901A +:105F000068884B46A969019A01F0F1FAA8E0502788 +:105F100009F1120086B2002C3ED0A8890022594611 +:105F2000FFF765FF002838D16888A080A889E08045 +:105F3000287A072813D002202073288AE081E87B82 +:105F4000C0096073A4F81090A88A0090688801E0E6 +:105F500083E080E04B4604F11202A969D4E70120F6 +:105F6000EAE7B5F81290512709F1140086B2002C27 +:105F700066D06888042106F0DFFF83466888A08029 +:105F8000A88900220099FFF732FF00286ED184F81B +:105F900006A0A889208101E052E067E00420A073F8 +:105FA000288A2082A4F81290A88A009068884B461C +:105FB000A969019A01F09BFAA989ABF80E104FE08C +:105FC0006888FBF739FB07466888042106F0B4FFB0 +:105FD000064607B9FFDF06B9FFDF687BC00702D0BE +:105FE0005127142601E0502712264CB36888A08060 +:105FF000502F06D084F806A0287B594601F087FA76 +:106000002EE0287BA11DF9E7FE49A8894989814234 +:1060100005D1542706269CB16888A08020E053272C +:106020000BE06888A080A889E08019E068880421D6 +:1060300006F082FF00B9FFDF55270826002CF0D1BB +:10604000A8F8006011E056270726002CF8D06888D1 +:10605000A080002013E0FFDF02E0012808D0FFDF6E +:10606000A8F800600CB1278066800020BDE8FC9F86 +:1060700057270726002CE3D06888A080687AA07193 +:10608000EEE7401D20F0030009B14143091D01EB7B +:106090004000704713B5DB4A00201071009848B1EA +:1060A0000024684606F083FD002C02D1D64A0099F0 +:1060B00011601CBD01240020F4E770B50D460646B2 +:1060C00086B014465C21284611F07AFF04B9FFDF40 +:1060D000A0786874A2782188284601F042FA00204E +:1060E000A881E881228805F11401304603F055FCAF +:1060F0006A460121304604F0E8FD19E09DF80300EE +:10610000000715D5BDF806103046FFF730FD9DF8A5 +:106110000300BDF8061040F010008DF80300BDF834 +:106120000300ADF81400FF233046059A04F02EFF5B +:10613000684604F0D6FD0028E0D006B070BD10B56A +:106140000C4601F1140003F05FFC0146627C20461E +:10615000BDE8104001F03ABA70B50546042106F0DA +:10616000EBFE040000D1FFDF04F114010C462846C9 +:1061700003F02EFC21462846BDE8704003F02FBCFA +:1061800070B58AB00C460646FBF756FA050014D0E7 +:106190002878222827D30CB1A08890B101208DF84F +:1061A0000C0003208DF8100000208DF8110054B170 +:1061B000A088ADF81800206807E043F202000AB09A +:1061C00070BD0920FBE7ADF81800059004213046AA +:1061D00006F0B2FE040000D1FFDF04F1140003F06A +:1061E0002AFC000701D40820E9E701F0F3FD60B1C3 +:1061F00008A802210094CDE9011095F8232003A9F5 +:1062000030466368FFF734FCD9E71120D7E72DE962 +:10621000F04FB2F802A0834689B015468946504631 +:10622000FBF70AFA07460421504606F085FE0026D1 +:10623000044605964FF002080696ADF81C6007B9B3 +:10624000FFDF04B9FFDF4146504605F0F7F950B9CA +:1062500007AA06A905A88DE8070042462146504630 +:106260006368FFF794FB674807AB0660DDE905123A +:1062700004F11400CDF80090CDE90320CDE90131FF +:1062800097F82320594650466B6803F01DFC060022 +:106290000AD0022E04D0032E14D0042E00D0FFDF2B +:1062A00009B03046BDE8F08FBDF81C000028F7D0DB +:1062B0000599CDE900104246214650466368FFF734 +:1062C00093FBEDE7687840F008006870E8E72DE997 +:1062D000F04F9BB004464FF000084A48ADF8548098 +:1062E000ADF83080ADF85080A0F80880ADF814808B +:1062F000ADF81880ADF82080ADF81C800079164606 +:106300000D464746012808D0022806D0032804D0AD +:10631000042802D008201BB0C4E720460AF0BAFACD +:10632000D0BB28460AF0B6FAB0BB60680AF0FFFAA4 +:1063300090BB606848B160892189884202D8B1F574 +:10634000007F01D90C20E6E780460BAA06A9284663 +:10635000FFF70FFA0028DED168688078C0F34100AB +:10636000022808D19DF8190010F0380F03D02869D1 +:106370000AF0D4FA80B905A92069FFF7B2F900281C +:10638000C9D1206950B1607880079DF8150000F0F0 +:10639000380002D5D0B301E011E0B8BB9DF814007D +:1063A00080060ED59DF8150010F0380F03D06068F8 +:1063B0000AF0B4FA18B960680AF0B9FA08B1102006 +:1063C000A9E707A96069FFF78CF90028A3D16069E4 +:1063D00040B19DF81D0000F0070101293FD110F0E8 +:1063E000380F3CD008A9A069FFF77BF9002892D1AB +:1063F0009DF81C00800632D49DF8200080062ED423 +:10640000A06904E0280200201400002027E040B129 +:106410009DF8210000F00701012920D110F0380F6C +:106420001DD0E06818B10078C8B11C2817D20EAA98 +:10643000611C2046FFF7C4F90120B94660F30F271D +:10644000BA4607468DF84E0042F60300ADF84C0000 +:106450000DF13B0217A9286808F00FFB08B10720CF +:1064600059E79DF85C0016A9CDF80090C01CCDE955 +:10647000019100F0FF0B00230BF20122514613A8FB +:1064800004F066FBF0BBBDF858000990FE482A896D +:1064900029690092CDE901106B89BDF82C2028688C +:1064A000069904F055FB01007ED120784FF0020AD6 +:1064B000C10601D480062BD5ADF80C90606950B9A7 +:1064C00007A906A8FFF7ADF99DF81D0020F0070009 +:1064D000401C8DF81D009DF81C008DF84E7040F09A +:1064E000C8008DF81C0042F60210ADF84C000CA953 +:1064F00003AACDF800A0CDE90121002340F2032238 +:1065000013A800E01EE0079904F022FB01004BD124 +:10651000DD484D4608385B460089ADF839000EA8C5 +:10652000CDE90290CDF80490CDF810904FF0070916 +:106530000022CDF80090BDF858104FF6FF7004F01F +:106540004DFA10B1FFF79DF8E5E69DF8380000061A +:1065500025D52946012060F30F218DF84E704FF4A8 +:106560002450ADF84C00ADF8105062789DF8100042 +:10657000002362F300008DF810006278CDF800A0CF +:10658000520862F341008DF8100004AACDE90125FC +:1065900040F2032213A804F0DBFA010004D1606882 +:1065A00088B32069A8B900E086E005A906A8FFF72E +:1065B00038F96078800706D49DF8150020F038007F +:1065C0008DF8150005E09DF8140040F040008DF8AE +:1065D00014008DF84E7042F60110ADF84C00208981 +:1065E00040F20121B0FBF1F201FB1202606814AB32 +:1065F000CDF80080CDE90103002313A8059904F02C +:10660000A7FA010058D12078C00729D0ADF80C5066 +:10661000A06950B908A906A8FFF703F99DF8210061 +:1066200020F00700401C8DF821009DF820008DF817 +:106630004E7040F040008DF8200042F60310ADF897 +:106640004C0015A903AACDF800A0CDE90121002333 +:1066500040F2032213A8089904F07AFA01002BD122 +:10666000E06868B32946012060F30F218DF84E7071 +:1066700042F60410ADF84C00E068002302788DF873 +:10668000602040788DF86100E06818AA4088ADF875 +:106690006200E06800798DF86400E068C088ADF8B9 +:1066A0006500CDF80090CDE901254FF4027213A8E2 +:1066B00004F04EFA010003D0099800F0B3FF2AE677 +:1066C000714803210838017156B100893080BDF846 +:1066D00050007080BDF83000B080BDF85400F080EC +:1066E000002018E670B501258AB016460B46012831 +:1066F00002D0022816D104E08DF80E504FF420503D +:1067000003E08DF80E5042F60100ADF80C005BB1CD +:106710000024601C60F30F2404AA08A9184608F09E +:10672000ACF918B107204AE5102048E504A99DF806 +:1067300020205548CDE90021801E029000232146EB +:1067400003A802F2012204F003FA10B1FEF799FF48 +:1067500035E54D4808380EB1C188318005710020FB +:106760002DE5F0B593B0074601268DF83E6041F661 +:106770000100ADF83C0012AA0FA93046FFF7B2FFA6 +:10678000002848D1404C0025083CE7B31C2102A852 +:1067900011F016FC9DF808008DF83E6040F02000D6 +:1067A0008DF8080042F60520ADF83C000E959DF8E6 +:1067B0003A00119520F00600801C8DF83A009DF8F3 +:1067C00038006A4620F0FF008DF838009DF8390047 +:1067D00009A920F0FF008DF839000420ADF82C0045 +:1067E000ADF830000EA80A9011A80D900FA80990DE +:1067F000ADF82E5002A8FFF76AFD00280BD1BDF8B6 +:106800000000608100E008E0BDF80400A081401CA9 +:10681000E0812571002013B0F0BD6581A581BDF830 +:106820004800F4E72DE9F74F1749A0B000240839D4 +:1068300017940A79A146012A04D0022A02D008201E +:1068400023B02FE5CA88824201D00620F8E72198BC +:106850008A46824201D10720F2E701202146ADF8A5 +:1068600048004FF6FF7860F30F21ADF84A808DF8AD +:106870006E0042F6020B06918DF87240ADF86CB0D6 +:10688000ADF870401CA901E0300200201391ADF872 +:10689000508012A804F049FA00252E462F460DAB71 +:1068A000072212A9404604F043FA78B10A285DD1C4 +:1068B00095B38EB3ADF86450ADF866609DF85E0098 +:1068C0008DF8144019AC012864D06BE09DF83A00B3 +:1068D0001FB3012859D1BDF8381059451FD118A848 +:1068E00009A901940294CDE9031007200090BDF896 +:1068F000361010230022404604F09AFAB0BBBDF8CF +:106900006000042801D006284AD1BDF8241021983F +:1069100081423AD10F2093E73AE0012835D1BDF802 +:106920003800B0F5205F03D042F6010188422CD137 +:10693000BAF80600BDF83610884201D1012700E000 +:10694000002705B19EB1219881421ED118A809AA3D +:1069500001940294CDE90320072000900D461023F6 +:106960000022404604F064FA00B902E02DE04E46F1 +:106970000BE0BDF86000022801D0102810D1C0B291 +:1069800017AA09A908F05AF850B9BDF8369086E759 +:10699000052055E705A917A8221D08F06EF808B1D3 +:1069A00003204DE79DF814000023001DC2B28DF8AE +:1069B000142022980092CDE901401BA8069904F00A +:1069C000C7F810B902228AF80420FEF75AFE37E70A +:1069D00010B50B46401E88B084B205AA00211846A7 +:1069E000FEF7EEFE00200DF1080C06AA05A90190A5 +:1069F0008CE80700072000900123002221464FF673 +:106A0000FF7003F0EBFF0446BDF81800012800D02A +:106A1000FFDF2046FEF735FE08B010BDF0B5FF4F92 +:106A2000044687B038790E46032804D0042802D0E3 +:106A3000082007B0F0BD04AA03A92046FEF799FE7E +:106A40000500F6D160688078C0F3410002280AD1C1 +:106A50009DF80D0010F0380F05D0206909F05EFF99 +:106A600008B11020E5E7208905AA21698DE8070013 +:106A70006389BDF810202068039904F069F810B10B +:106A8000FEF7FFFDD5E716B1BDF8140030800420F5 +:106A900038712846CDE7F8B50C0006460BD0014604 +:106AA0004FF6FF7500236A46284604F043FA20B1EA +:106AB000FEF7E7FDF8BD1020F8BD69462046FEF759 +:106AC00010FE0028F8D1A078314600F001032846D6 +:106AD000009A04F05BFAEBE730B587B01446002269 +:106AE0000DF1080C05AD01928CE82C0007220092F4 +:106AF0000A46014623884FF6FF7003F06FFFBDF88A +:106B000014102180FEF7BDFD07B030BD70B50D46F5 +:106B1000042106F011FA040000D1FFDF294604F138 +:106B20001400BDE8704002F07FBF70B50D4604212F +:106B300006F002FA040000D1FFDF294604F1140038 +:106B4000BDE8704002F093BF70B50D46042106F019 +:106B5000F3F9040000D1FFDF294604F11400BDE879 +:106B6000704002F0ABBF70B50546042106F0E4F9B1 +:106B7000040000D1FFDF214628462368BDE87040AD +:106B80000122FEF74BBF70B50646042106F0D4F98A +:106B9000040000D1FFDF04F1140002F035FF401DB6 +:106BA00020F0030511E0011D008800224318214652 +:106BB0003046FEF733FF00280BD0607CABB2684351 +:106BC00082B2A068011D06F092F8A06841880029F1 +:106BD000E9D170BD70B50546042106F0ADF9040099 +:106BE00000D1FFDF214628466368BDE870400222DD +:106BF000FEF714BF70B50E46054601F0EBF8040031 +:106C000000D1FFDF0120207266726580207820F0BD +:106C10000F00001D20F0F00040302070BDE87040F3 +:106C200001F0DBB810B50446012900D0FFDF204693 +:106C3000BDE810400121FEF7F1BA2DE9F04F97B001 +:106C40004FF0000A0C008346ADF814A0D04619D0CE +:106C5000E06830B1A068A8B10188ADF81410A0F8C0 +:106C600000A05846FAF7E8FC070043F2020961D099 +:106C7000387822285CD30421584606F05DF90500D7 +:106C800005D103E0102017B0BDE8F08FFFDF05F15C +:106C9000140002F0B9FE401D20F00306A078012880 +:106CA00003D0022801D00720EDE7218807AA584623 +:106CB00004F00BF830BB07A804F013F810BB07A8CA +:106CC00004F00FF848B99DF82600012805D1BDF859 +:106CD0002400A0F52451023902D04FF45050D2E7DD +:106CE000E068B0B1CDE902A00720009005AACDF878 +:106CF00004A00492A2882188BDF81430584603F0FD +:106D00006DFE10B1FEF7BDFCBDE7A168BDF8140033 +:106D100008809DF81F00C00602D543F20140B2E78B +:106D20000B9838B1A1780078012905D080071AD4D2 +:106D30000820A8E74846A6E7C007F9D002208DF84A +:106D40003C00A8684FF00009A0B1697C42887143FB +:106D500091420FD98AB2B3B2011D05F07EFF804681 +:106D6000A0F800A006E003208DF83C00D5F80080D4 +:106D70004FF001099DF8200010F0380F00D1FFDF1F +:106D80009DF820002649C0F3C200084497F823105C +:106D900010F8010C884201D90F2074E72088ADF863 +:106DA000400014A90095CDE90191434607220FA99F +:106DB0005846FEF75DFE002891D19DF8500050B96D +:106DC000A078012807D1687CB3B2704382B2A8686A +:106DD000011D05F056FF002055E770B50646154623 +:106DE0000C460846FEF70CFC002805D12A46214631 +:106DF0003046BDE8704075E470BD13E570B51E46C1 +:106E000014460D000ED06CB1616859B160B10349F0 +:106E1000C988814208D0072070BD000028020020E8 +:106E2000468301001020F7E72068FEF7E9FB002801 +:106E3000F2D1324621462846BDE87040FFF747BAF6 +:106E400070B515460C0006D038B1FE49098981425B +:106E500003D00720E0E71020DEE72068FEF7D0FB34 +:106E60000028D9D129462046BDE87040D6E570B546 +:106E7000064686B00D461446104609F031FDD0BBDB +:106E8000606809F054FDB0BBA6F57F40FF3803D021 +:106E90003046FAF7D1FB80B128466946FEF7E3FC9D +:106EA00000280CD19DF810100F2008293CD2DFE8F3 +:106EB00001F008060606060A0A0843F2020006B0B8 +:106EC000AAE70320FBE79DF80210012908D1BDF8CD +:106ED0000010B1F5C05FF2D06FF4C052D142EED0D5 +:106EE0009DF8061001290DD1BDF80410A1F5285117 +:106EF000062907D200E028E0DFE801F003030403DD +:106F00000303DCE79DF80A1001290ED1BDF8081033 +:106F1000B1F5245FD3D0A1F524510239CFD0012996 +:106F2000CDD0022901D1CAE7FFDF606878B900231C +:106F300005AA2946304603F0FDFF10B1FEF7A1FB7C +:106F4000BDE79DF81400800601D41020B7E76188E2 +:106F5000224628466368FFF7BFFDB0E72DE9F043FE +:106F6000814687B088461446104609F0B9FC18B12E +:106F7000102007B0BDE8F083002306AA414648462A +:106F800003F0D8FF18B100BFFEF77BFBF1E79DF8D7 +:106F90001800C00602D543F20140EAE700250727A2 +:106FA00005A8019500970295CDE9035062884FF638 +:106FB000FF734146484603F03BFF060013D160686B +:106FC00009F08EFC60B960680195CDE90250009728 +:106FD0000495238862884146484603F029FF064607 +:106FE000BDF8140020803046CEE739B1954B0A88B1 +:106FF0009B899A4202D843F2030070471DE610B500 +:1070000086B0904C0423ADF81430638943B1A48951 +:107010008C4201D2914205D943F2030006B010BD63 +:107020000620FBE7ADF81010002100910191ADF8AA +:10703000003002218DF8021005A9029104A90391E4 +:10704000ADF812206946FFF7F8FDE7E72DE9FC47A8 +:1070500081460E46084609F01DFC88BB4846FAF7F3 +:10706000EBFA5FEA00080AD098F80000222829D33A +:107070000421484605F060FF070005D103E043F214 +:107080000200BDE8FC87FFDF07F1140002F0D3FC2B +:1070900005463078012803D0022804D00720F0E705 +:1070A000A8070FD502E015F01C0F0BD0B079341DE6 +:1070B000C00709D0E08838B1A06809F0EBFB18B12F +:1070C0001020DEE70820DCE732782088002628B38D +:1070D000A0F201130721112B18D20CD2DFE803F024 +:1070E0000B090D0B1D0B121D100B0B1D1D1D1D0B78 +:1070F0001D00022A11D10846C3E7012AFBD00CE08B +:107100002A0700E0EA06002AF5DA06E0A0F5C072D8 +:107110001F2A02D97D3A022AEDD8C6B200F05AFEE3 +:1071200050B198F82300CDE90006FA892346394684 +:107130004846FEF7EAFCA4E71120A2E72DE9F04F4C +:107140008BB01F4615460C4683460026FAF774FAA4 +:1071500028B10078222805D208200BB094E543F22C +:107160000200FAE7B80801D00720F6E7032F00D1A4 +:1071700000274FF6FF79CCB1022D73D3204609F0DA +:10718000D6FB30B904EB0508A8F1010009F0CFFBEC +:1071900008B11020E1E7AD1EAAB221464846FBF730 +:1071A000E7FE38F8021C88425CD1ADB22549B80729 +:1071B00002D58889401C00E001201FFA80F8F807FA +:1071C00001D08F8900E04F4605AA4146584603F09A +:1071D0007CFD4FF0070A4FF00009ACB3204608E0F1 +:1071E000408810283ED8361D304486B2AE4239D28F +:1071F000A01902884245F3D354E000BF9DF8170060 +:1072000002074FD584B304EB0608361DB8F80230E8 +:10721000B6B2102B26D89A19AA4223D8B8F8002063 +:1072200091421FD1C00620D5CDE900A90DF1080C6F +:107230000AAAA11948468CE80700B8F800100022F5 +:10724000584603E0280200202CE00BE003F0C6FBC8 +:1072500010B1FEF716FA80E7B8F80200BDF8281062 +:10726000884202D00B2078E704E0B8F802003044EE +:1072700086B206E0C00604D55846FEF778FC002822 +:1072800088D19DF81700BDF81A1020F010008DF875 +:107290001700BDF81700ADF80000FF235846009A0C +:1072A00003F074FE05A803F01CFD18B9BDF81A1010 +:1072B000B942A3D90421584605F03EFE040000D18E +:1072C000FFDFA2895AB1CDE900A94D46002321462E +:1072D0005846FEF71AFC0028BDD1A5813DE70020E5 +:1072E0003BE72DE9FF4F8BB01E4617000D464FF0D0 +:1072F000000412D0B00802D007200FB0C4E4032E5F +:1073000000D100265DB1084609F008FB28B938888D +:10731000691E084409F002FB08B11020EDE7C74AD6 +:10732000B00701D5D18900E00121F0074FF6FF78C1 +:1073300002D0D089401E00E0404686B206AA0B98D3 +:1073400003F0C3FC4FF000094FF0070B0DF1140AD6 +:1073500039E000BF9DF81B00000734D5CDF804903C +:10736000CDF800B0CDF80890CDE9039A434600224D +:107370000B9803F05DFD60BB05B3BDF814103A88AF +:1073800021442819091D8A4230D3BDF81E2020F857 +:10739000022BBDF8142020F8022BCDE900B9CDE96D +:1073A0000290CDF810A0BDF81E10BDF814300022D8 +:1073B0000B9803F03DFD08B103209EE7BDF81400D3 +:1073C0002044001D84B206A803F08BFC20B10A28DB +:1073D00006D0FEF756F990E7BDF81E10B142B9D9B4 +:1073E00034B17DB13888A11C884203D20C2084E7D7 +:1073F000052082E7224629464046FBF7B9FD0146B3 +:1074000028190180A41C3C80002076E710B50446B2 +:1074100009F066FA08B1102010BD8848C0892080A4 +:10742000002010BDF0B58BB00D460646142103A810 +:1074300010F0C6FD01208DF80C008DF81000002022 +:107440008DF81100ADF814503046FAF7F5F848B150 +:107450000078222812D30421304605F06DFD040087 +:1074600005D103E043F202000BB0F0BDFFDF04F1F1 +:107470001400074602F0DFFA800601D40820F3E783 +:10748000207C022140F00100207409A80094CDE97D +:107490000110072203A930466368FEF7E9FA20B11C +:1074A000217C21F001012174DEE729463046FDF7F9 +:1074B000A6FE08A9384602F0ADFA00B1FFDFBDF81C +:1074C0002040172C01D2172000E02046A84201D905 +:1074D0002C4602E0172C00D2172421463046FFF735 +:1074E00024FB21463046FDF7B0FB0020BCE7F8B591 +:1074F0001C4615460E46069F05F050FE2346FF1D0E +:10750000BCB231462A46009405F059FAF8BD70B570 +:107510000C4605460E21204610F030FD002020804C +:107520002DB1012D01D0FFDF76E4062000E005201B +:10753000A07171E410B548800878134620F00F0060 +:10754000001D20F0F00080300C460870142219460F +:1075500004F1080010F0D8FC00F03FFC374804604C +:1075600010BD2DE9F047DFF8D890491D064621F0FF +:10757000030117460C46D9F8000005F036FB05005C +:1075800000D1FFDF4FF000083560A5F800802146EC +:10759000D9F8000005F029FB050000D1FFDF756078 +:1075A000A5F800807FB104FB07F1091D0BD0D9F8C5 +:1075B000000005F01AFB040000D1FFDFB460C4F83E +:1075C0000080BDE8F087C6F80880FAE72DE9F041B1 +:1075D0001746491D21F00302194D0646016814465D +:1075E000286805F02DFB22467168286805F028FB05 +:1075F0003FB104FB07F2121D03D0B168286805F003 +:107600001FFB042005F044FC0446042005F048FC60 +:10761000201A012804D12868BDE8F04105F0DABA43 +:10762000BDE8F08110B50C4603F01BFB00B1FFDF95 +:107630002046BDE81040FEF724B8000028020020D4 +:107640001400002038B582880A800C46C188121DBB +:1076500090B26A4604F091FDBDF80000032800D303 +:107660000320C1B2208800F077FF38BD38B582888A +:107670000A800C46C188121D90B26A4604F07DFD56 +:10768000BDF80000022800D30220C1B2208800F01B +:1076900063FF401CC0B238BD2DE9FE4F0C46F849CF +:1076A00081464022D1E90201CDE9010109F103003F +:1076B00020F00301C91C21F0030100916846114626 +:1076C00005F075FAEF4E002C02D1EF4A0099916057 +:1076D000009901440091357E05F1010504D1E8B21D +:1076E00007F052F900B1FFDF009800EB0510C01C55 +:1076F00020F00301009144B9727A00200870B08B29 +:1077000080B203F036F900B1FFDF0098F169084458 +:1077100000902146684600F0E6FE0098C01C20F06C +:1077200003000090717A04B1002005F02AFB009953 +:10773000084400902146684600F019FF00273D46A6 +:10774000B24696F801800CE0284600F0AFFE0646EF +:1077500081788088FDF710FB71786D1C00FB017744 +:10776000EDB24545F0D10098C01C20F00300009018 +:1077700004B100203946FDF70AFB009900270844B0 +:1077800000903D469AF801800CE0284600F08EFEFD +:107790000646C1788088FEF774FC71786D1C00FB8A +:1077A0000177EDB24545F0D10098C01C20F00300F0 +:1077B000009004B100203946FEF76CFC00990844A3 +:1077C00000210090084603F064FD2146684600F061 +:1077D00050FE0098C01D20F0070200922CBBAB4960 +:1077E0000020FBF7E3FAFAF7D5FBA64801AA00212F +:1077F0000C30FAF7D7FF00B1FFDF9AF81900FEF757 +:10780000B0FF00B1FFDF9F484FF4F671383010F041 +:10781000D7FB9C480421383080F8E91180F8EA1140 +:10782000062180F8EB11032101710099A1EB0900F9 +:10783000BDE8FE8F70B5934C06463834207804EBD3 +:107840004015E078083590B9A01990F8E8010028B3 +:107850000ED0A0780F2800D3FFDF2021284610F09B +:10786000AFFB687866F3020068700120E07028467C +:1078700070BD2DE9F04105460C4600270078052132 +:1078800090463E46B1EB101F00D0FFDF287A58B17A +:1078900001280FD0FFDF00BFA8F800600CB12780DF +:1078A00066800020BDE8F0810127092674B1688850 +:1078B000A08008E00227142644B16888A0802869C7 +:1078C000E060A88A2082287B2072E5E7A8F80060A3 +:1078D000E7E710B56C4C6068C11D21F007018142DB +:1078E00000D0FFDF67480121002201704270017261 +:1078F00041720273052282821F22C282417364A2F6 +:1079000002610A22027641764FF4B061C16161687A +:10791000416010BD30B55C4C1568636808339D420A +:1079200002D20420136030BD564B5D785A6802EBDA +:10793000C502107051700320D08017209080012064 +:10794000D07090705878401C587060680830606043 +:10795000002030BD70B506464A480024457807E04F +:10796000204600F0A3FD0178B14204D0641CE4B2CB +:10797000AC42F5D1002070BDF7B5064608780C463C +:10798000F8B1FFF7E7FF0546202E06D0212E1AD0CA +:10799000222E18D0232E14D110E000F092FD0DB14C +:1079A000697800E00021401A81B2A0780144FF29E3 +:1079B00007D830B1A088022805D202E060881728D5 +:1079C00001D20720FEBD65B9207802AA0121FFF788 +:1079D000A1FF0028F6D12078FFF7BCFF050000D1F9 +:1079E000FFDF202E08D0212E0ED0222E0FD0232EE6 +:1079F00007D0FFDF0020FEBDA0786870A088E88077 +:107A0000F8E76088A880F5E7A078A870F2E7A0788A +:107A1000E870EFE71A2841D00DDC13283ED2DFE8EA +:107A200000F01B3D203D3D272723252D3D3D293DD1 +:107A30003D3D3D3B0F00302802D003DC1E282DD1F8 +:107A4000072070473A38092828D2DFE800F01527C8 +:107A50000F272727272707000020704743F204003D +:107A6000704743F202007047042070470D207047B2 +:107A70000F2070470820704711207047132070476F +:107A80004C830100640200201C0000200000002044 +:107A90006E524635780000000620F0E70320EEE73E +:107AA00010B5007800F0010004F062FBBDE8104062 +:107AB000B0E70EB5017801F001018DF800104178B2 +:107AC00001F001018DF801100178C1F340018DF83A +:107AD00002104178C1F340018DF803100178890844 +:107AE0008DF80410417889088DF8051081788DF89B +:107AF0000610C1788DF8071000798DF808006846E7 +:107B000003F0B4FFFFF786FF0EBD2DE9F84FDFF855 +:107B1000F883FE4C00261FE0012000F06BFD0120E1 +:107B2000FFF788FE054640214746D8F8080005F0D3 +:107B30005CF8686000B9FFDF686803F084FEA8B1F4 +:107B40002846F9F7EAFE284600F05AFD20B94022FF +:107B50006968B86805F074F894F9E9010428DBDA7B +:107B6000022005F095F907460025A6E04022696845 +:107B7000D8F8080005F064F8F2E7B8F802104046BB +:107B8000491C89B2A8F80210B94201D300214180F2 +:107B90000221B8F8020005F0CFF9002865D0B8F846 +:107BA0000200694604F063FAFFF734FF00B1FFDF1B +:107BB0009DF8000078B1B8F8020005F001FB5FEA1B +:107BC000000900D1FFDF484604F08DFD18B1B8F878 +:107BD000020003F022FDB8F8020005F0DFFA5FEAC8 +:107BE000000900D1FFDF484604F075FDE8BB032122 +:107BF000B8F8020005F0A0F95FEA000B48D1FFDFFA +:107C000046E000BFDBF80C0010B10078FF2849D037 +:107C1000022000F0EFFC0220FFF70CFE82464846EF +:107C200004F065FECAF8040000B9FFDFDAF80400CA +:107C300004F02DFF002100900170B8F802105046AA +:107C4000AAF8021003F0C2FB484604F022FF00B974 +:107C5000FFDF504600F0D4FC18B99AF80100000785 +:107C600004D50099CBF80C1012E024E0DBF80C00EE +:107C700038B10178491C11F0FF01017008D1FFDF14 +:107C800006E000221146484600F0F1FB00B9FFDF94 +:107C900094F9EA01022805DBB8F8020003F071FB51 +:107CA0000028AFD194F9E901042804DB484604F028 +:107CB00054FF00B101266D1CEDB2BD4204D294F90F +:107CC000EA010228BFF659AF002E7FF423AFBDE8CA +:107CD000F84F032000F08EBC10B58B4CE0600868B4 +:107CE0002061AFF2D910FBF774F8607010BD8748BF +:107CF0000021383801708448017085494160BEE632 +:107D000070B505464FF080500C46D0F8A410491CC1 +:107D100005D1D0F8A810C9430904090C0BD050F8BC +:107D2000A01F01F001012970416821608068A080D6 +:107D3000287830B970BD0621204608F0B4FA012039 +:107D40002870607940F0C000607170BD70B54FF070 +:107D500080540D46D4F88010491C0BD1D4F88410FF +:107D6000491C07D1D4F88810491C03D1D4F88C10D1 +:107D7000491C0CD0D4F880100160D4F88410416004 +:107D8000D4F888108160D4F88C10C16002E0102112 +:107D900008F089FAD4F89000401C0BD1D4F8940074 +:107DA000401C07D1D4F89800401C03D1D4F89C00A3 +:107DB000401C09D054F8900F286060686860A06883 +:107DC000A860E068E86070BD2846BDE870401021FA +:107DD00008F069BA4D4800792CE570B54B4CE07855 +:107DE00030B3207804EB4010407A00F007002044C4 +:107DF00090F9E801002800DCFFDF2078002504EB83 +:107E00004010407A00F00700011991F8E801401E87 +:107E100081F8E8012078401CC0B220700F2800D102 +:107E20002570A078401CA07008F070F9E57070BD56 +:107E3000FFDF70BD3EB50546032105F07DF8044621 +:107E4000284605F0ABF9054604B9FFDFE06818B134 +:107E50000078FF2800D1FFDF01AA6946284600F01C +:107E600006FB60B9FFDF0AE0002202A9284600F005 +:107E7000FEFA00B9FFDF9DF8080000B1FFDF9DF8B2 +:107E80000000411E8DF80010EED2E0680199884292 +:107E900001D10020E0603EBD70B50546A0F57F40F1 +:107EA0000C46FF3800D1FFDF012C01D0FFDF70BD91 +:107EB000FFF790FF040000D1FFDF207820F00F00D3 +:107EC000401D20F0F00050302070658000202072AE +:107ED00001202073BDE870407FE72DE9F041164690 +:107EE0000D460746FFF776FF040000D1FFDF20783C +:107EF00020F00F00401D20F0F0005030207067800F +:107F000001202072286805E01C0000209C0200204F +:107F1000100E00202061A888A0822673BDE8F041E1 +:107F20005BE77FB5FFF716FD040000D1FFDF02A974 +:107F30002046FFF787FB054603A92046FFF796FB7F +:107F40008DF800508DF80100BDF80800001DADF857 +:107F50000200BDF80C00001DADF80400E088ADF88B +:107F60000600684604F0EDF8002800D0FFDF7FBD72 +:107F70002DE9F05FFA4E04464FF00008307810B15A +:107F80000820BDE8F09F204608F0AAFC08B11020A8 +:107F9000F7E7F44D287808B9FFF79BFC6D7A00F0FD +:107FA00090FAA84208D2281AC1B222460020FFF750 +:107FB000B1FC5FEA0008E4D1E9484168C91C21F03E +:107FC000030100274160E7483E46BA46BB463D46AE +:107FD00090F8019007E0284600F068FA40786D1CA0 +:107FE0000644EDB27F1C4D45F5D1DE4D0BEB87000D +:107FF000C6EBC60100EB8100697ADFF8649300EB01 +:108000008A0000EBC100D9F8041047180121384656 +:10801000FFF742FB064621683844884202D8B6F58D +:10802000803F15D320600020FFF794FC04000DD0A2 +:1080300004F10B00D9F8041020F003004E468842EA +:1080400000D0FFDF6878401E68707460042098E7F5 +:1080500000213846FFF720FB0546AE4200D0FFDF87 +:10806000E919C9F8041021604FF6FF71A9F8021050 +:10807000012189F80010404683E72DE9F0410446CC +:10808000B74817460D46007808B108200AE40846AC +:1080900008F000FC08B1102004E4B24E307808B9B2 +:1080A000FFF717FC601E1E2807D8012C3DD1287849 +:1080B000FE283AD830760020E8E7A4F120001F28F7 +:1080C00005D8E0B23A462946BDE8F04154E4A4F1AF +:1080D00040004FF000081F281FD8402C02D0412C30 +:1080E00023D115E028786C78012801D91320CDE739 +:1080F000FF2C08D806F02CFE074607F0C0FF381A00 +:10810000401EA04201DA1220C0E72888308124E016 +:108110002846BDE8F04100F09BBAA4F1A0001F285A +:1081200003D8A02C03D0A12C06D00720AEE72878D6 +:1081300000F00100707610E029680920F829A5D325 +:108140008A07A3D1727B02F00302012A04D1F28ACA +:10815000D73293B28B4299D8F161404696E72DE928 +:10816000F04781460E46084608F0BAFB48B9484633 +:1081700008F0D4FB28B909F1030020F003014945B8 +:1081800002D01020BDE8F08776484FF0000A383062 +:10819000817869B14178804600EB41140834378812 +:1081A00032460021204600F039FA050004D027E0CD +:1081B000A6F800A00520E5E7B9F1000F24D030882B +:1081C000B84201D90C251FE0607800F00705284669 +:1081D00000F010FA08EB0507324697F8E801494627 +:1081E000401C87F8E801204607F5F47700F016FAFE +:1081F00005463878401E3870032000F0FBF92DB199 +:108200000C2D01D0A6F800A02846BBE76078544E9C +:1082100000F00701012923D002290CD0032933D013 +:10822000FFDF98F801104046491CC9B288F80110D8 +:108230000F2934D035E0616821B1000702D460888D +:10824000FFF7F8FD98F8EA014746012802D1707857 +:10825000FAF7DEFD97F9EA010428E2DBFFDFE0E749 +:10826000616819B14022B06804F0EAFC98F8E901AD +:108270004746032802D17078FAF7CAFD97F9E90159 +:108280000428CEDBFFDFCCE7C00602D56088FFF70D +:10829000D1FD98F9EB010628C3DBFFDFC1E780F8C9 +:1082A00001A08178491E8170617801F0070101EB1E +:1082B000080090F8E811491C80F8E811A4E770B5AF +:1082C0000D46044608F0E6FA18B9284608F008FBFF +:1082D00008B1102070BD29462046BDE8704006F068 +:1082E0008ABB70B5044615460E46084608F0D2FA19 +:1082F00018B9284608F0F4FA08B1102070BD022C15 +:1083000003D0102C01D0092070BD2A4631462046EA +:1083100006F094FB0028F7D0052070BD70B5144618 +:108320000D46064608F0B6FA38B9284608F0D8FADD +:1083300018B9204608F0F2FA08B1102070BD2246A4 +:108340002946304606F099FB0028F7D0072070BD7B +:108350003EB5044608F0C4FA30B110203EBD00001E +:108360001C00002064020020684603F00EFBFFF7AB +:1083700051FB0028F2D19DF806002070BDF80800DE +:108380006080BDF80A00A0800020E7E770B50546D0 +:108390000C46084608F0C2FA20B93CB1206808F043 +:1083A0009FFA08B1102070BDA08828B12146284648 +:1083B000BDE87040FDF7E4BE092070BD70B504460D +:1083C0000D46084608F066FA30B9601E1E2814D81B +:1083D000284608F05FFA08B1102070BD022C01D9C0 +:1083E000072070BD04B9FFDFBF4800EB840050F8E0 +:1083F000041C2846BDE870400847A4F120001F284F +:1084000005D829462046BDE87040F9F766BDF02C36 +:10841000E6D1A86808F03EFA0028DDD1284603F02E +:10842000E2FEBDE87040FFF7F5BA70B504460D46B0 +:10843000084608F055FA30B9601E1E280DD82846A7 +:1084400008F028FA08B1102070BD012C01D0022CD0 +:1084500001D1062070BD072070BDA4F120001F28A7 +:10846000F9D829462046BDE87040F9F773BD04F0FD +:1084700001B908B5002918D1FAF745FD9B4800223B +:108480004178C06803F0B5F998481030C0788DF88D +:10849000000010B1012802D004E0012000E000201B +:1084A0008DF80000684603F0C8FA08BD30B5904D5D +:1084B00004466878A04200D8FFDF686800EBC4007B +:1084C00030BD70B58A4800252C46467807E0204626 +:1084D000FFF7ECFF4078641C2844C5B2E4B2B44214 +:1084E000F5D1284670BD2DE9F041054680480C467F +:1084F000427A9600761CFF2E00D9FFDF2868F6B27C +:10850000C01C20F003022A600CBB794833460621C8 +:10851000203008F099F8002408E0062C0FD2DFE89C +:1085200004F0050307070903724804E0724802E0FB +:10853000724800E0724808F0A7F8074600E0FFDF45 +:10854000A74200D0FFDF641CE4B2062CE5D3286804 +:1085500000EB0610286099E5021D5143452900D221 +:1085600045210844C01CB0FBF2F0C0B270472DE9B1 +:10857000FC5F06465E484FF000088B46474644467F +:1085800090F8019022E02046FFF790FF050000D10F +:10859000FFDF687869463844C7B22846FFF752F8CB +:1085A000824601A92846FFF761F80346BDF804009A +:1085B0005246001D81B2BDF80000001D80B204F0DB +:1085C00039FD6A78641C00FB0288E4B24C45DAD1BC +:1085D0003068C01C20F003003060BBF1000F00D0F9 +:1085E00000204246394604F033FD316808443060CB +:1085F000BDE8FC9F3E49383108710020C8707047C3 +:108600003B493831CA782AB10A7801EB4211083166 +:10861000814201D001207047002070472DE9F041D0 +:1086200006460078154600F00F0400201080601EFA +:108630000F46052800D3FFDF2B482A46103000EBF9 +:108640008400394650F8043C3046BDE8F0411847F4 +:1086500038B50446407800F00300012803D0022812 +:108660000BD0072038BD606858B108F060F9D0B968 +:10867000606808F053F920B915E0606808F00AF95D +:1086800088B969462046FBF709FB0028EAD16078E3 +:1086900000F00300022808D19DF8000028B16068AE +:1086A00008F03CF908B1102038BD6189F8290DD8CF +:1086B000208988420AD8607800F003020C48012A19 +:1086C00006D1D731C26989B28A4201D2092038BDA8 +:1086D00094E80E0000F10C0585E80E000AB90021AF +:1086E0008182002038BD00004C8301001C00002066 +:1086F000640200200D1E0000DDB20000F12E00001B +:108700007BE7000070B50B2000F0AFF9082000F007 +:10871000ACF900210B2000F0BEF90021082000F088 +:10872000BAF9E54C01256560A5600020C4F8400158 +:10873000C4F84401C4F848010B2000F0A1F9082056 +:1087400000F09EF90B2000F085F9256070BD10B592 +:108750000B2000F08AF9082000F087F9D6480121A3 +:1087600041608160D5490A68002AFCD10021C0F827 +:108770004011C0F84411C0F848110B2000F080F9F6 +:10878000BDE81040082000F07BB910B50B2000F0C8 +:1087900077F9BDE81040082000F072B900B530B19B +:1087A000012806D0022806D0FFDF002000BDC44803 +:1087B00000BDC44800BDC348001D00BD70B5C2491E +:1087C0004FF000400860C14DC00BC5F80803C04819 +:1087D00000240460C5F840410820C43500F045F984 +:1087E000C5F83C41BB48047070BD08B5B24A0021D1 +:1087F00028B1012811D002281CD0FFDF08BD4FF49A +:108800008030C2F80803C2F84803AC483C3001602D +:10881000C2F84011BDE80840D0E74FF40030C2F87C +:108820000803C2F84803A54840300160C2F844116B +:10883000A4480CE04FF48020C2F80803C2F84803B3 +:108840009E4844300160C2F848119E48001D0068EF +:10885000009008BD70B516460D460446022800D9A2 +:10886000FFDF00229448012304F110018B4000EB4C +:108870008401C1F8405526B1C1F84021C0F8043345 +:1088800003E0C0F80833C1F84021C0F8443370BD9C +:108890002DE9F0411C46154630B1012834D002289C +:1088A00039D0FFDFBDE8F081891E002221F07F4131 +:1088B0001046FFF7CFFF012C24D00020854E834FB8 +:1088C000012470703C61824900203C39086002201C +:1088D000091D08607E490420303908607C483D3518 +:1088E0000560C7F80042082000F0CAF82004C7F865 +:1088F0000403082000F0AEF87349E007091F086080 +:108900003470CFE70120D9E7012B02D000220120EB +:1089100005E00122FBE7012B04D000220220BDE884 +:10892000F04197E70122F9E764480068704770B5A5 +:10893000614CD4F840010025012809D1D4F808037E +:10894000C00305D54FF48030C4F80803C4F8405183 +:10895000D4F8440101280CD1D4F80803800308D5C9 +:108960004FF40030C4F80803C4F84451012007F064 +:1089700048F8D4F8480101280ED1D4F80803400380 +:108980000AD54FF48020C4F80803C4F84851BDE864 +:108990007040022007F035B870BD10B54D4C2078FE +:1089A00050B1FFF70BFF6078002807D000206070FF +:1089B000BDE8104007F025B80320F9E710BD4FF0DF +:1089C000E0214FF40010C1F800027047152000F0BC +:1089D00057B83E4901200861082000F051B83B49D2 +:1089E0004FF47C10C1F808030020024601EB80031D +:1089F000C3F84025C3F84021401CC0B20628F5D377 +:108A00007047410A43F609525143C0F3080010FB76 +:108A100002F000F5807001EB5020704710B5430B59 +:108A200048F2376463431B0C5C020C602A4C03FB66 +:108A300004002A4B4CF2F72443435B0D13FB04F470 +:108A400004EB402000F58070401210700868184454 +:108A5000086010BD00F01F02012191404009800014 +:108A600000F1E020C0F80011704700F01F02012162 +:108A700091404009800000F1E020C0F8801170476B +:108A800000F01F02012191404009800000F1E02028 +:108A9000C0F8801270474907090E002806DA00F076 +:108AA0000F0000F1E02080F8141D704700F1E02075 +:108AB00080F800147047000000B0004004B500408A +:108AC0004081004044B1004008F501400080004072 +:108AD0004085004030000020F7C2FFFF6F0C01000E +:108AE00010B5EFF3108000F0010472B6F048417841 +:108AF000491C41704078012801D107F02FFB002C60 +:108B000000D162B610BD70B5E94CE07848B90125D6 +:108B1000E570FFF7E5FF07F029FB20B1002007F023 +:108B2000FCFA002070BD4FF080406571C0F804531E +:108B3000F7E770B5EFF3108000F0010572B6DC4C7A +:108B4000607800B9FFDF6078401E6070607808B917 +:108B500007F008FB002D00D162B670BDD44810B5F7 +:108B6000C17821B100214171C170FFF7E2FF0020FF +:108B700010BD10B5044607F0F9FACD49C978084090 +:108B800000D001202060002010BD2DE9F05FDFF84B +:108B900020934278817889F80620002589F807100B +:108BA000064689F8085000782F4620B101280FD0DA +:108BB00002280FD0FFDF07F0E6FA98B107F0EAFAD3 +:108BC000A8420FD1284607F0E9FA0028FAD047E07A +:108BD0000125F0E7FFF784FF07F0C8FA0028FBD073 +:108BE0000225E8E701208407E060C4F80471B14978 +:108BF0000D600107D1F84412AE4AC1F3423124326C +:108C00001160AC49343108604FF0020BC4F804B372 +:108C1000A060DFF8A4A2DAF80010C94341F3001104 +:108C200001F10108DAF8001041F01001CAF8001053 +:108C300000E020BFD4F804010028FAD0284607F04D +:108C4000ADFA0028FAD0B8F1000F05D1DAF800101B +:108C500021F01001CAF80010C4F808B3C4F8047178 +:108C600099F807004C4670B1307860B907F07EFA89 +:108C7000064607F0B1FB6FF0004116B1C4E90310DE +:108C800001E0C4E9030115B12771BDE8F09F01209F +:108C90002071BDE8F05F00F0AFB870B5050000D1FD +:108CA000FFDF4FF080424FF0FF30C2F80803002191 +:108CB000C2F80011C2F80411C2F80C11C2F8101168 +:108CC0007B4C617007F058FA10B10120E0706070C1 +:108CD0002846BDE8704058E72DE9F05F4FF080442A +:108CE000D4F8080110B14FF0010801E04FF000087E +:108CF000D4F8000100B101208146D4F8040108B184 +:108D0000012700E00027D4F80C0100B101208246C1 +:108D1000D4F8100108B1012600E0002648EA090154 +:108D200027EA010020EA0A00B04300D0FFDF002557 +:108D3000B8F1000F04D0C4F80851012007F0EDF994 +:108D40005FEA0900DFF87491DFF864814FF0010BEE +:108D500015D0C4F8005198F8050020B188F80550E6 +:108D6000002007F0DAF998F80010404639B1057094 +:108D700088F802B00222C9F80020C4F810B00FB180 +:108D8000C4F80451BAF1000F0DD0C4F80C5198F892 +:108D90000200474600B9FFDFC9F80050BD70C4F8B3 +:108DA00014B0FFF7C6FE002E09D0C4F8105198F891 +:108DB0000400002803D0BDE8F05F00F041B864E78C +:108DC00070B53B4DE87808B907F0CCF9012084076D +:108DD000A061A87858B100BFD4F80C0120B90020D8 +:108DE00007F0DCF90028F7D10020C4F80C014FF09F +:108DF000FF30C4F8080370BD2DE9F0411926B4070F +:108E0000C4F808630125A5610020C4F80001C4F876 +:108E10000C01C4F8100107F0A9F9254F28B1274922 +:108E2000BD7002200860256100E03D70FFF758FE2C +:108E30002049B87920310860C4F80463BDE8F081A6 +:108E40002DE9F0411A4C4FF080470125E079F0B14F +:108E5000012803D0217A401E814218DA07F086F9F2 +:108E6000064607F0B9FAE179012902D9217A491CAD +:108E700021720EB1216900E0E168411A022902DA8B +:108E800011F1020F0EDC0EB1206100E0E060FFF78F +:108E900027FE07F06BF938B10849022008603D61F0 +:108EA000A57002E07D61C9E7257000202072C5E74A +:108EB000340000201805004010ED00E0340C0040A4 +:108EC000F8B51D46DDE906470E000AD004F078F932 +:108ED0002346FF1DBCB231462A46009403F0A3FD91 +:108EE000F8BDD019224619460EF0C9FF2046F8BD3C +:108EF00070B50D46044610210FF040F8258117206B +:108F00006081A07B40F00A00A07370BD4FF6FF7235 +:108F10000A800146022007F071BC70470089704743 +:108F2000827BD30701D1920703D480890880002077 +:108F3000704705207047827B920700D5818170477A +:108F400001460020098841F6FE52114200D001205E +:108F5000704700B50346807BC00701D0052000BDE7 +:108F600059811846FFF7ECFFC00703D0987B40F00B +:108F700004009873987B40F001009873002000BDB6 +:108F8000827B520700D509B140897047172070478E +:108F9000827B61F3C302827370472DE9FC5F0E464A +:108FA000044601789646012000FA01F14DF6FF5281 +:108FB00001EA020962684FF6FF7B1188594502D128 +:108FC0000920BDE8FC9FB9F1000F05D041F6FE5520 +:108FD000294201D00120F4E741EA090111801D0076 +:108FE00014D04FF0000C85F800C02378052103222F +:108FF00067464FF0020A0E2B74D2DFE803F0F8093F +:10900000252F47626974479092B3D0D70420D8E7E0 +:10901000616820898B7B9B077DD5172848D30B89F6 +:10902000834245D38989172901D3814240D185F8EC +:1090300000A0A5F801003280616888816068817BAA +:1090400021F002018173C5E0042028702089A5F871 +:1090500001006089A5F803003180BBE0208A3188D7 +:10906000C01D1FFA80F8414522D3062028702089B0 +:10907000A5F801006089A5F80300A089A5F80500FE +:109080000721208ACDE9000163693EE0082B10D05A +:10909000082028702089A5F801006089A5F8030040 +:1090A00031806A1D694604F10C0005F0E6FC10B140 +:1090B0005FE01020EDE730889DF800100844308014 +:1090C00088E00A2028702089A5F80100328045E058 +:1090D0000C2028702089A5F801006089A5F80300FC +:1090E00031803BE083E02189338800EB41021FFAA5 +:1090F00082F843453DD3B8F1050F3AD30E222A70CA +:109100000BEA4101CDE90010E36860882A46714608 +:10911000FFF7D6FE00E04DE0A6F800805AE04020C0 +:10912000287060893188C01C1FFA80F8414520D31F +:109130002878714620F03F00123028702089A5F869 +:1091400001006089CDE9000260882A46E368FFF7E4 +:10915000B7FEA6F80080287840063BD461682089D5 +:10916000888037E0A0893288401D1FFA80F8424588 +:1091700001D204273EE0162028702089A5F80100BE +:109180006089A5F80300A089CDE9000160882A461E +:1091900071462369FFF794FEA6F80080DEE71820E9 +:1091A0002870207A6870A6F800A013E061680A8829 +:1091B000920401D405271DE0C9882289914201D07B +:1091C000062717E01E21297030806068018821F48D +:1091D00000510180B9F1000F0CD061887823002282 +:1091E000022007F061FA61682078887007E0A6F82D +:1091F00000C003276068018821EA09010180384620 +:10920000DFE62DE9FF4F85B01746129C0D001E4684 +:109210001CD03078C10703D000F03F00192801D9D5 +:10922000012100E000212046FFF7AAFEA8420DD34D +:109230002088A0F57F41FF3908D03078410601D45D +:10924000000605D5082009B0BDE8F08F0720FAE731 +:1092500000208DF800008DF8010030786B1E00F0C2 +:109260003F0C0121A81E4FF0050A4FF002094FF0F4 +:10927000030B9AB2BCF1200F75D2DFE80CF08B1013 +:10928000745E7468748C749C74B674BB74C974D541 +:1092900074E2747474F274F074EF74EE748B052DD0 +:1092A00078D18DF80090A0788DF804007088ADF822 +:1092B000060030798DF80100707800F03F000C282E +:1092C00029D00ADCA0F10200092863D2DFE800F00F +:1092D000126215621A621D622000122824D004DC7A +:1092E0000E281BD01028DBD11BE016281FD0182811 +:1092F000D6D11FE02078800701E0207840070028C1 +:1093000048DAEFE020780007F9E72078C006F6E7B2 +:1093100020788006F3E720784006F0E72078000602 +:10932000EDE72088C005EAE720884005E7E72088C8 +:109330000005E4E72088C004E1E72078800729D50C +:10934000032D27D18DF800B0B6F8010082E0217816 +:1093500049071FD5062D1DD381B27078012803D08F +:10936000022817D102E0CAE0022000E01020042207 +:109370008DF8002072788DF80420801CB1FBF0F28B +:10938000ADF8062092B242438A4203D10397ADF86A +:109390000890A7E07AE02078000777D598B2820895 +:1093A0008DF800A0ADF80420B0EB820F6ED10297CB +:1093B000ADF8061096E02178C90667D5022D65D371 +:1093C00081B206208DF80000707802285ED300BFBD +:1093D000B1FBF0F28DF80400ADF8062092B24243E2 +:1093E0008A4253D1ADF808907BE0207880064DD5B5 +:1093F000072003E0207840067FD508208DF8000084 +:10940000A088ADF80400ADF80620ADF8081068E0BB +:109410002078000671D50920ADF804208DF80000F1 +:10942000ADF8061002975DE02188C90565D5022DCB +:1094300063D381B20A208DF80000707804285CD3D1 +:10944000C6E72088400558D5012D56D10B208DF850 +:109450000000A088ADF8040044E021E026E016E01A +:10946000FFE72088000548D5052D46D30C208DF850 +:109470000000A088ADF80400B6F803006D1FADF839 +:109480000850ADF80600ADF80AA02AE035E02088C3 +:10949000C00432D5012D30D10D208DF8000021E01F +:1094A0002088800429D4B6F80100E080A07B000762 +:1094B00023D5032D21D3307800F03F001B2818D08E +:1094C0000F208DF80000208840F40050A4F8000020 +:1094D000B6F80100ADF80400ED1EADF80650ADF889 +:1094E00008B0039769460598FBF7BEFB050008D056 +:1094F00016E00E208DF80000EAE7072510E00825A9 +:109500000EE0307800F03F001B2809D01D2807D05E +:109510000220059907F072F9208800F4005020809D +:10952000A07B400708D52046FFF70AFDC00703D1FE +:10953000A07B20F00400A073284684E61FB5022813 +:1095400006D101208DF8000088B26946FBF78CFB3C +:109550001FBD0000F8B51D46DDE906470E000AD024 +:1095600003F02EFE2346FF1DBCB231462A4600946E +:1095700003F059FAF8BDD019224619460EF07FFCC7 +:109580002046F8BD2DE9FF4F8DB09B46DDE91B5706 +:10959000DDF87CA00C46082B05D0E06901F002F94B +:1095A00050B11020D2E02888092140F01000288016 +:1095B0008AF80010022617E0E16901208871E2694B +:1095C0004FF420519180E1698872E06942F601010F +:1095D0000181E069002181732888112140F0200079 +:1095E00028808AF80010042638780A900A203870FB +:1095F0004FF0020904F118004D460C9001F095FB64 +:10960000B04681E0BBF1100F0ED1022D0CD0A9EBBA +:109610000800801C80B20221CDE9001005AB524643 +:109620001E990D98FFF796FFBDF816101A98814203 +:1096300003D9F74800790F9004E003D10A9808B1E4 +:1096400038702FE04FF00201CDE900190DF116033B +:1096500052461E990D98FFF77DFF1D980088401B0C +:10966000801B83B2C6F1FF00984200D203461E99C8 +:109670000BA8D9B15FF00002DDF878C0CDE9032076 +:1096800009EB060189B2CDE901C10F980090BDF840 +:10969000161000220D9801F0CBFB387070B1C0B2EB +:1096A000832807D0BDF8160020833AE00AEB0901B1 +:1096B0008A19E1E7022011B0BDE8F08FBDF82C0057 +:1096C000811901F0FF08022D0DD09AF801204245C2 +:1096D00006D1BDF82010814207D0B8F1FF0F04D0A9 +:1096E0009AF801801FE08AF80180C9480068017873 +:1096F000052902D1BDF81610818009EB08001FFA78 +:1097000080F905EB080085B2DDE90C1005AB0F9A76 +:1097100001F00EFB28B91D980088411B4145BFF69A +:1097200071AF022D13D0BBF1100F0CD1A9EB0800C3 +:10973000801C81B20220CDE9000105AB52461E9982 +:109740000D98FFF707FF1D98058000203870002056 +:10975000B1E72DE9F8439C46089E13460027B26BFB +:109760009AB3491F8CB2F18FA1F57F45FF3D05D01B +:109770005518AD882944891D8DB200E000252919AE +:10978000B6F83C800831414520D82A44BCF8011085 +:1097900022F8021BBCF8031022F8021B984622F89C +:1097A000024B914603F0FAFC4FF00C0C41464A463E +:1097B0002346CDF800C003F002F9F587B16B002015 +:1097C0002944A41D2144088003E001E0092700E0AA +:1097D00083273846BDE8F88310B50B88848F9C42F8 +:1097E0000CD9846BE018048844B1848824F40044C4 +:1097F000A41D23440B801060002010BD0A2010BD62 +:109800002DE9F0478AB00025904689468246ADF89A +:10981000185007274BE0059806888088000446D436 +:10982000A8F8006007A8019500970295CDE90350BC +:109830004FF4007300223146504601F0F9FA04005B +:109840003CD1BDF81800ADF8200005980488818847 +:10985000B44216D10A0414D401950295039521F45B +:1098600000410097049541F48043428821465046C8 +:1098700001F0B4F804000BD10598818841F400414F +:10988000818005AA08A94846FFF7A6FF0400DCD09E +:109890000097059802950195039504950188BDF8F8 +:1098A0001C300022504601F099F80A2C06D105AA76 +:1098B00006A94846FFF790FF0400ACD0ADF8185059 +:1098C00004E00598818821F40041818005AA06A959 +:1098D0004846FFF781FF0028F3D00A2C03D020462A +:1098E0000AB0BDE8F0870020FAE710B50C46896B96 +:1098F00086B051B10C218DF80010A18FADF8081081 +:10990000A16B01916946FCF75EF900204FF6FF71EB +:10991000A063E187A08706B010BD2DE9F0410D4698 +:109920000746896B0020069E1446002911D0012BA2 +:109930000FD1324629463846FFF762FF002808D18A +:10994000002C06D0324629463846BDE8F04100F0EA +:1099500038BFBDE8F0812DE9FC411446DDE9087C03 +:109960000E46DDE90A15521DBCF800E092B296459C +:1099700002D20720BDE8FC81ACF8002017222A7033 +:10998000A5F80160A5F803300522CDE900423B4669 +:109990002A46FFF7DFFD0020ECE770B50C461546C0 +:1099A000482120460EF00CFB04F1080044F81C0F7F +:1099B00000204FF6FF71E06161842084A5841720A8 +:1099C000E08494F82A0040F00A0084F82A0070BD70 +:1099D0004FF6FF720A800146032006F00FBF30B534 +:1099E00085B00C460546FFF780FFA18E284629B1B9 +:1099F00001218DF800106946FCF7E5F80020E062CF +:109A00002063606305B030BDB0F8400070470000CF +:109A10004C00002090F84620920703D4408808802C +:109A20000020F3E70620F1E790F846209207EDD5F5 +:109A3000A0F84410EAE70146002009880A0700D58B +:109A4000012011F0F00F01D040F00200CA0501D54D +:109A500040F004008A0501D540F008004A0501D510 +:109A600040F010000905D1D540F02000CEE700B548 +:109A7000034690F84600C00701D0062000BDA3F8B9 +:109A800042101846FFF7D7FF10F03E0F05D093F8AD +:109A9000460040F0040083F8460013F8460F40F0FB +:109AA00001001870002000BD90F84620520700D534 +:109AB00011B1B0F84200A9E71720A7E710F8462F28 +:109AC00061F3C3020270A1E72DE9FF4F9BB00E00C6 +:109AD000DDE92B34DDE92978289D24D02878C107D9 +:109AE00003D000F03F00192801D9012100E0002136 +:109AF0002046FFF7D9FFB04215D32878410600F081 +:109B00003F010CD41E290CD0218811F47F6F0AD19B +:109B10003A8842B1A1F57F42FF3A04D001E0122910 +:109B200001D1000602D504201FB0C5E5F9491D98F2 +:109B30004FF0000A08718DF818A08DF83CA00FAA0C +:109B40000A60ADF81CA0ADF850A02978994601F044 +:109B50003F02701F5B1C04F1180C4FF0060E4FF013 +:109B6000040BCDF858C01F2A7ED2DFE802F07D7DBD +:109B7000107D267DAC7DF47DF37DF27DF17DF47D5D +:109B8000F07D7D7DEF7DEE7D7D7D7D7DED0094F82A +:109B90004610B5F80100890701D5032E02D08DF8D3 +:109BA00018B022E34FF40061ADF85010608003213B +:109BB0008DF83C10ADF84000D8E2052EEFD1B5F895 +:109BC00001002083ADF81C00B5F80310618308B1D3 +:109BD000884201D901207FE10020A07220814FF648 +:109BE000FF702084169801F0A0F8052089F8000085 +:109BF0000220029083460AAB1D9A16991B9801F029 +:109C000097F890BB9DF82E00012804D0022089F817 +:109C10000100102003E0012089F8010002200590D6 +:109C2000002203A90BA804F028FFE8BB9DF80C0054 +:109C3000059981423DD13A88801CA2EB0B018142FB +:109C400037DB02990220CDE900010DF12A034A46D3 +:109C500041461B98FFF77EFC02980BF1020B801C1B +:109C600080B217AA03A901E0A0E228E002900BA8A5 +:109C700004F003FF02999DF80C00CDE9000117AB39 +:109C80004A4641461B98FFF765FC9DF80C100AAB4D +:109C90000BEB01001FFA80FB02981D9A084480B26A +:109CA000029016991B9800E003E001F041F80028AB +:109CB000B6D0BBF1020F02D0A7F800B053E20A20E1 +:109CC0008DF818004FE200210391072EFFF467AFD3 +:109CD000B5F801002083ADF81C00B5F803206283BD +:109CE00000283FF477AF90423FF674AF0120A07296 +:109CF000B5F8050020810020A073E06900F052FD56 +:109D000078B9E16901208871E2694FF420519180AE +:109D1000E1698872E06942F601010181E069002190 +:109D20008173F01F20841E9860620720608416985B +:109D300000F0FBFF072089F800000120049002904A +:109D40000020ADF82A0028E01DE2A3E13AE1EAE0B4 +:109D500016E2AEE086E049E00298012814D0E069FE +:109D60008079012803D1BDF82800ADF80E000498D1 +:109D700003ABCDE900B04A4641461B98FFF7EAFB2A +:109D80000498001D80B20490BDF82A00ADF80C00C4 +:109D9000ADF80E00059880B202900AAB1D9A169994 +:109DA0001B9800F0C5FF28B902983988001D05905E +:109DB0008142D1D20298012881D0E06980790128BE +:109DC00005D0BDF82810A1F57F40FF3803D1BDF8BC +:109DD0002800ADF80E00049803ABCDE900B04A4668 +:109DE00041461B98FFF7B6FB0298BBE1072E02D055 +:109DF000152E7FF4D4AEB5F801102183ADF81C10F8 +:109E0000B5F80320628300293FF4E4AE91423FF6A7 +:109E1000E1AE0121A1724FF0000BA4F808B084F864 +:109E20000EB0052E07D0C0B2691DE26904F006FE2F +:109E300000287FF444AF4FF6FF70208401A906AAE2 +:109E400014A8CDF800B081E885032878214600F0F9 +:109E50003F031D9A1B98FFF795FB8246208BADF8B8 +:109E60001C0080E10120032EC3D14021ADF8501029 +:109E7000B5F801102183ADF81C100AAAB8F1000F43 +:109E800000D00023CDE9020304921D98CDF8048090 +:109E9000009038880022401E83B21B9800F0C8FF53 +:109EA0008DF8180090BB0B2089F80000BDF8280041 +:109EB00037E04FF0010C052E9BD18020ADF850000B +:109EC000B5F801102183B5F803002084ADF81C100B +:109ED000B0F5007F03D907208DF8180085E140F424 +:109EE0007C4222840CA8B8F1000F00D00023CDE9F9 +:109EF0000330CDE9018C1D9800903888401E83B254 +:109F00001B9800F095FF8DF8180028B18328A8D180 +:109F10000220BDE04C0000200D2189F80010BDF8A2 +:109F20003000401C1EE1032E04D248067FF537AEF8 +:109F3000002017E1B5F80110ADF81C102878400694 +:109F400002D58DF83CE002E007208DF83C004FF090 +:109F500000080320CDE902081E9BCDF810801D9853 +:109F60000193A6F1030B00901FFA8BF342461B9856 +:109F700000F034FD8DF818008DF83C8029784906F2 +:109F80000DD52088C00506D5208BBDF81C10884251 +:109F900001D1C4F8248040468DF81880E2E083287F +:109FA00001D14FF0020A4FF48070ADF85000BDF8B7 +:109FB0001C002083A4F820B01E98606203206084F7 +:109FC0001321CCE0052EFFF4EAADB5F80110ADF891 +:109FD0001C10A28F62B3A2F57F43FE3B28D008225B +:109FE0008DF83C204FF0000B0523CDE9023BDDF856 +:109FF00078C0CDF810B01D9A80B2CDF804C040F4FE +:10A0000000430092B5F803201B9800F0E7FC8DF8A0 +:10A010003CB04FF400718DF81800ADF85010832853 +:10A0200010D0F8B1A18FA1F57F40FE3807D0DCE059 +:10A030000B228DF83C204FF6FE72A287D2E7A4F8DF +:10A040003CB0D2E000942B4631461E9A1B98FFF795 +:10A0500080FB8DF8180008B183284BD1BDF81C0097 +:10A06000208355E700942B4631461E9A1B98FFF734 +:10A0700070FB8DF81800E8BBE18FA06B0844811DD0 +:10A080008DE882034388828801881B98FFF763FC70 +:10A09000824668E095F80180022E70D15FEA0800E0 +:10A0A00002D0B8F1010F6AD109208DF83C0007A851 +:10A0B00000908DF840804346002221461B98FFF710 +:10A0C0002CFC8DF842004FF0000B8DF843B050B9D6 +:10A0D000B8F1010F12D0B8F1000F04D1A18FA1F592 +:10A0E0007F40FF380AD0A08F40B18DF83CB04FF4CC +:10A0F000806000E037E0ADF850000DE00FA91B983C +:10A10000FBF761FD82468DF83CB04FF48060ADF8FE +:10A110005000BAF1020F06D0FC480068C07928B19F +:10A120008DF8180027E0A4F8188044E0BAF1000F79 +:10A1300003D081208DF818003DE007A80090434629 +:10A14000012221461B98FFF7E8FB8DF818002146F5 +:10A150001B98FFF7CAFB9DF8180020B9192189F850 +:10A160000010012038809DF83C0020B10FA91B98F9 +:10A17000FBF729FD8246BAF1000F33D01BE018E04F +:10A180008DF818E031E02078000712D5012E10D1AB +:10A190000A208DF83C00E088ADF8400003201B99B0 +:10A1A00006F02CFB0820ADF85000C1E648067FF50C +:10A1B000F6AC4FF0040A2088BDF850100843208008 +:10A1C000BDF8500080050BD5A18FA1F57F40FE386A +:10A1D00006D11E98E06228982063A6864FF0030AF5 +:10A1E0005046A1E49DF8180078B1012089F80000DC +:10A1F000297889F80110BDF81C10A9F802109DF803 +:10A20000181089F80410052038802088BDF85010F7 +:10A2100088432080E4E72DE9FF4F8846087895B011 +:10A22000012181404FF20900249C0140ADF820102B +:10A230002088DDF88890A0F57F424FF0000AFF3AB1 +:10A2400006D039B1000705D5012019B0BDE8F08F5F +:10A250000820FAE7239E4FF0000B0EA886F800B006 +:10A2600018995D460988ADF83410A8498DF81CB0DE +:10A27000179A0A718DF838B0086098F80000012824 +:10A280003BD0022809D003286FD1307820F03F005E +:10A290001D303070B8F80400E08098F800100320FA +:10A2A000022904D1317821F03F011B31317094F83B +:10A2B0004610090759D505ABB9F1000F13D000219D +:10A2C00002AA82E80B000720CDE90009BDF834009E +:10A2D000B8F80410C01E83B20022159800F0A8FD43 +:10A2E0000028D1D101E0F11CEAE7B8F80400A6F893 +:10A2F0000100BDF81400C01C04E198F805108DF8A9 +:10A300001C1098F80400012806D04FF4007A0228A7 +:10A310002CD00328B8D16CE12188B8F8080011F4DA +:10A320000061ADF8201020D017281CD3B4F84010DD +:10A33000814218D3B4F84410172901D3814212D1B5 +:10A34000317821F03F01C91C3170A6F801000321CA +:10A35000ADF83410A4F8440094F8460020F0020050 +:10A3600084F8460065E105257EE177E1208808F163 +:10A37000080700F4FE60ADF8200010F0F00F1BD0CD +:10A3800010F0C00F03D03888228B9042EBD199B9DE +:10A39000B878C00710D0B9680720CDE902B1CDF870 +:10A3A00004B00090CDF810B0FB88BA8839881598B1 +:10A3B00000F014FB0028D6D12398BDF82010401CD3 +:10A3C00080294ED006DC10290DD020290BD0402941 +:10A3D00087D124E0B1F5807F6ED051457ED0B1F5B4 +:10A3E000806F97D1DEE0C80601D5082000E010207C +:10A3F00082460DA907AA0520CDE902218DF8380073 +:10A40000ADF83CB0CDE9049608A93888CDE9000143 +:10A410005346072221461598FFF7B4F8A8E09DF8A7 +:10A420001C2001214FF00A0A002A9BD105ABB9F18B +:10A43000000F00D00020CDE902100720CDE900096F +:10A44000BDF834000493401E83B2218B002215987E +:10A4500000F0EEFC8DF81C000B203070BDF81400ED +:10A4600020E09DF81C2001214FF00C0A002A22D187 +:10A4700013ABB9F1000F00D00020CDE90210072086 +:10A48000CDE900090493BDF83400228C401E83B24C +:10A49000218B159800F0CCFC8DF81C000D2030703D +:10A4A000BDF84C00401CADF8340005208DF8380094 +:10A4B000208BADF83C00BCE03888218B88427FF4CB +:10A4C00052AF9DF81C004FF0120A00281CD1606AA0 +:10A4D000A8B1B878C0073FF446AF00E018E0BA680A +:10A4E0000720CDE902B2CDF804B00090CDF810B04D +:10A4F000FB88BA88159800F071FA8DF81C001320BB +:10A5000030700120ADF8340093E000004C000020D2 +:10A510003988208B8142D2D19DF81C004FF0160A59 +:10A520000028A06B08D0E0B34FF6FF7000215F4613 +:10A53000ADF808B0019027E068B1B978C907BED17D +:10A54000E18F0DAB0844821D03968DE80C02438811 +:10A550008288018809E0B878C007BCD0BA680DAB22 +:10A5600003968DE80C02BB88FA881598FFF7F3F97B +:10A5700005005ED0072D72D076E0019005AA02A9F1 +:10A580002046FFF729F90146E28FBDF80800824214 +:10A5900001D00029F1D0E08FA16B08440780019819 +:10A5A000E08746E09DF81C004FF0180A40B1208B70 +:10A5B000C8B13888208321461598FFF796F938E00E +:10A5C00004F118000090237E012221461598FFF720 +:10A5D000A4F98DF81C000028EDD11920307001205D +:10A5E000ADF83400E7E7052521461598FFF77DF91A +:10A5F0003AE0208800F40070ADF8200050452DD1DD +:10A60000A08FA0F57F41FE3901D006252CE0D8F8B7 +:10A6100008004FF0160A48B1A063B8F80C10A187E3 +:10A620004FF6FF71E187A0F800B002E04FF6FF702F +:10A63000A087BDF8200030F47F611AD07823002273 +:10A640000320159906F030F898F800002071208852 +:10A65000BDF82010084320800EE000E00725208888 +:10A66000BDF8201088432080208810F47F6F1CD014 +:10A670003AE02188814321809DF8380020B10EA95D +:10A680001598FBF7A0FA05469DF81C000028EBD0B2 +:10A6900086F801A001203070208B70809DF81C008E +:10A6A00030710520ADF83400DEE7A18EE1B11898D5 +:10A6B0000DAB0088ADF834002398CDE90304CDE953 +:10A6C0000139206B0090E36A179A1598FFF7FCF99F +:10A6D000054601208DF838000EA91598FBF773FA8E +:10A6E00000B10546A4F834B094F8460040070AD5F6 +:10A6F0002046FFF7A0F910F03E0F04D114F8460FE2 +:10A7000020F0040020701898BDF83410018028460D +:10A710009BE500B585B0032806D102208DF8000026 +:10A7200088B26946FBF74FFA05B000BD10B5384C4A +:10A730000B782268012B02D0022B2AD111E013786A +:10A740000BB1052B01D10423137023688A889A80EA +:10A750002268CB88D38022680B8913814989518173 +:10A760000DE08B8893802268CB88D38022680B8988 +:10A7700013814B8953818B89938109691161216808 +:10A78000FBF721FA226800210228117003D000286B +:10A7900000D0812010BD832010BD806B002800D028 +:10A7A000012070478178012909D10088B0F5205F28 +:10A7B00003D042F60101884201D1002070470720F2 +:10A7C0007047F0B587B0002415460E460746ADF831 +:10A7D000144010E0069801882980811DCDE90241CE +:10A7E00007210194049400918388428801883846A7 +:10A7F00000F0F4F830B906AA05A93046FEF7ECFFE0 +:10A800000028E7D00A2800D1002007B0F0BD0000E2 +:10A810004C00002010B58B7883B102789A4205D1A4 +:10A820000B885BB102E08B79091D4BB18B789A42A2 +:10A83000F9D1B0F801300C88A342F4D1002010BD4A +:10A84000812010BD072826D012B1012A27D103E0AC +:10A85000497801F0070102E04978C1F3C2010529F6 +:10A860001DD2DFE801F00318080C12000AB1032022 +:10A8700070470220704704280DD250B10DE0052822 +:10A8800009D2801E022808D303E0062803D003283B +:10A8900003D005207047002070470F2070478120AB +:10A8A0007047C0B282060BD4000607D5FE48807AF6 +:10A8B0004143C01D01EBD00080B27047084670478D +:10A8C0000020704770B513880B800B781C0625D5C7 +:10A8D000F54CA47A844204D843F01000087000209C +:10A8E00070BD956800F0070605EBD0052D78F540A2 +:10A8F00065F304130B701378D17803F0030341EA76 +:10A90000032140F20123B1FBF3F503FB151192681B +:10A91000E41D00FB012000EBD40070BD906870BD09 +:10A9200037B51446BDF8041011809DF804100A06CE +:10A930001ED5C1F30013DC49A568897A814208D885 +:10A94000FE2811D1C91DC9085A4228460DF00EFB38 +:10A950000AE005EBD00100F00702012508789540D8 +:10A96000A843934018430870207820F0100020700E +:10A970003EBD2DE9F0410746C81C0E4620F00300FD +:10A98000B04202D08620BDE8F081C74D0020344699 +:10A990002E60AF802881AA72E8801AE0E988491CFD +:10A9A000E980810614D4E17800F0030041EA002038 +:10A9B00040F20121B0FBF1F201FB12012068FFF728 +:10A9C00070FF2989084480B22881381A3044A06079 +:10A9D0000C3420784107E1D40020D4E72DE9FF4F63 +:10A9E00089B01646DDE9168A0F46994623F440459C +:10A9F000084600F00DFB04000FD0099802F066FA3B +:10AA00000290207800060AD5A748817A02988142F0 +:10AA100005D887200DB0BDE8F08F0120FAE7224667 +:10AA200001A90298FFF74EFF834600208DF80C0025 +:10AA30004046B8F1070F1AD001222146FFF702FF66 +:10AA40000028E7D12078400611D502208DF80C00AF +:10AA5000ADF81070BDF80400ADF81200ADF8146048 +:10AA60001898ADF81650CDF81CA0ADF818005FEAA4 +:10AA7000094004D500252E46A84601270CE0217880 +:10AA8000E07801F0030140EA012040F20121B0FB2F +:10AA9000F1F2804601FB12875FEA494009D5B845CB +:10AAA00007D1A178207901F0030140EA0120B042EA +:10AAB00001D3BE4201D90720ACE7A8191FFA80F9DB +:10AAC000B94501D90D20A5E79DF80C0028B103A9CF +:10AAD0000998FBF776F800289CD1B84507D1A078F3 +:10AAE0004FEA192161F30100A07084F804901A98CC +:10AAF00000B10580199850EA0A0027D0199830B1A2 +:10AB00000BEB06002A4619990DF0B9F90EE00BEB94 +:10AB100006085746189E099802F040FB2B46F61D82 +:10AB2000B5B239464246009501F049FF224601A9D7 +:10AB30000298FFF7C7FE9DF80400224620F010009F +:10AB40008DF80400DDE90110FFF7EAFE002061E75F +:10AB50002DE9FF4FDFF8509182461746B9F80610ED +:10AB6000D9F8000001EB410100EB810440F2012023 +:10AB7000B2FBF0F185B000FB11764D46DDF84C805C +:10AB800031460698FFF78DFE29682A898B46611A9F +:10AB90000C3101441144AB8889B28B4202D8842025 +:10ABA00009B038E70699CDB2290603D5A90601D523 +:10ABB0000620F5E7B9F806C00CF1010C1FFA8CFC71 +:10ABC000A9F806C0149909B1A1F800C0A90602D5D8 +:10ABD000C4F8088007E0104480B2A9F80800191AE8 +:10ABE00001EB0B00A0602246FE200699FFF798FEBD +:10ABF000E77026712078390A61F30100320AA178E2 +:10AC000040F0040062F30101A17020709AF8020084 +:10AC10006071BAF80000E08000262673280602D58D +:10AC200099F80A7000E00127A80601D54FF0000846 +:10AC30004D4600244FF007090FE0CDE90268019668 +:10AC4000CDF800900496E9882046129B089AFFF7F9 +:10AC5000C5FE0028A4D1641CE4B2BC42EDD30020A0 +:10AC60009EE72DE9F047804600F0D2F9070005D0B5 +:10AC7000002644460C4D40F2012919E00120BDE8B0 +:10AC8000F087204600F0C4F90278C17802F0030290 +:10AC900041EA0222B2FBF9F309FB13210068FFF736 +:10ACA00000FE304486B201E0A8040020641CA4B277 +:10ACB000E988601E8142E4DCA8F10100E88028896F +:10ACC000801B288100203870D9E710B5144631B1B7 +:10ACD000491E218002F0FAF8A070002010BD01206A +:10ACE00010BD10B5D24904460088CA88904201D3ED +:10ACF0000A2010BD096800EB400001EB800250798A +:10AD0000A072D08820819178107901F0030140EA87 +:10AD10000120A081A078E11CFFF7D4FD20612088EC +:10AD2000401C2080E080002010BD0121018270477E +:10AD30002DE9FF4F85B04FF6FF788246A3F80080DB +:10AD400048681F460D4680788DF8060048680088E0 +:10AD5000ADF8040000208DF80A00088A0C88A04293 +:10AD600000D304462C8241E0288A401C2882701DB2 +:10AD70006968FFF74FFDB8BB3988414501D1601EB6 +:10AD800038806888A04236D3B178307901F0030169 +:10AD900040EA012901A9701DFFF73CFD20BB29896C +:10ADA00041452CD0002231460798FFF74BFDD8B91A +:10ADB0002989494518D1E9680391B5F80AC0D6F840 +:10ADC00008B05046CDF800C002F0E8F9DDF800C048 +:10ADD0005A460CF1070C1FFA8CFC4B460399CDF830 +:10ADE00000C001F0B6FD50B1641CA4B2204600F0D2 +:10ADF0000FF90600B8D1641E2C820A20D0E67C80B0 +:10AE00007079B871F088B8803178F07801F003017A +:10AE100040EA01207881A7F80C90504602F056F8DD +:10AE2000324607F10801FFF74DFD38610020B7E613 +:10AE30002DE9FF4F87B081461C469246DDF860B091 +:10AE4000DDF85480089800F0E3F805000CD048467F +:10AE500002F03CF82978090608D57549897A8142BB +:10AE600004D887200BB0D6E50120FBE7CAF309061A +:10AE70002A4601A9FFF726FD0746149807281CD08B +:10AE800000222946FFF7DEFC0028EBD12878400697 +:10AE900013D501208DF808000898ADF80C00BDF816 +:10AEA0000400ADF80E00ADF81060ADF8124002A934 +:10AEB0004846FAF786FE0028D4D12978E87801F0D0 +:10AEC000030140EA0121AA78287902F0030240EA4E +:10AED0000220564507D0B1F5007F04D9611E81429A +:10AEE00001DD0B20BEE7864201D90720BAE7801BAF +:10AEF00085B2A54200D92546BBF1000F01D0ABF8C1 +:10AF00000050179818B1B9192A460CF0B8FFB8F1DB +:10AF1000000F0DD03E4448464446169F02F050F9BB +:10AF20002146FF1DBCB232462B46009401F07BFD4A +:10AF3000002097E72DE9F04107461D4616460846D2 +:10AF400000F066F804000BD0384601F0BFFF21780E +:10AF5000090607D53649897A814203D8872012E548 +:10AF6000012010E522463146FFF7ACFC65B121789F +:10AF7000E07801F0030140EA0120B0F5007F01D83C +:10AF8000012000E0002028700020FCE42DE9F041C1 +:10AF900007461D461646084600F03AF804000BD056 +:10AFA000384601F093FF2178090607D52049897AB0 +:10AFB000814203D88720E6E40120E4E422463146BA +:10AFC000FFF7AEFCFF2D14D02178E07801F00302EA +:10AFD00040EA022040F20122B0FBF2F302FB130030 +:10AFE00015B900F2012080B2E070000A60F301019F +:10AFF00021700020C7E410B50C4600F009F828B114 +:10B00000C18821804079A070002010BD012010BDB2 +:10B010000749CA88824209D340B1096800EB400061 +:10B020006FF00B0202EB800008447047002070476D +:10B03000A804002070B514460B880122A2401342D8 +:10B0400007D113430B8001230922011D01F019FED2 +:10B05000047070BD2DE9FF4F81B00878DDE90E7BEB +:10B060009A4691460E4640072CD4019802F0A8F863 +:10B07000040000D1FFDF07F1040820461FFA88F121 +:10B0800001F005FA050000D1FFDF204629466A4697 +:10B0900001F04FFC0098A0F80370A0F805A0284626 +:10B0A00001F0F5FC017869F306016BF3C71101703B +:10B0B00020461FFA88F101F02DFA00B9FFDF019850 +:10B0C00000F048FB06EB0900017E491C017605B043 +:10B0D000BDE8F08F2DE9F84F0E469A469146074697 +:10B0E000032101F029FF0446808CDFF888850025C4 +:10B0F00018B198F80000B0421ED1384602F060F84E +:10B10000070000D1FFDF09F10401384689B201F0E0 +:10B11000BEF9050010D0384629466A4601F009FC00 +:10B12000009800210A460180817000F07DFB0098A4 +:10B13000C01DCAF8000021E098F80000B04216D106 +:10B1400004F1220734F8301F012000FA06F911EA51 +:10B15000090F00D0FFDF2088012340EA090020808A +:10B160000922391D384601F0A7FD067006E0324677 +:10B1700004F1300104F12200FFF75CFF092188F897 +:10B1800000102846BDE8F88FFEB514460D46064669 +:10B1900002AB0C220621FFF79DFF002826D0029962 +:10B1A000687812220A70801C487008224A80A870B1 +:10B1B000208888806088C880A0880881E0884881CD +:10B1C00000240C20CDE90004052306222946304640 +:10B1D000FFF740FF2146002266F31F41F02310468F +:10B1E00005F062FA6878801C68700120FEBD10B519 +:10B1F0000446032101F0A0FE014600F110022046A2 +:10B20000BDE81040C0E72DE9FE4381465078164660 +:10B21000884640B1FFDF3168C8F804107168C8F88B +:10B220000810BDE8FE83B778022417B1022F13D0AF +:10B23000FFDF251D2A4602AB07214846FFF74AFFDC +:10B240000028E8D002980121022F01703178417066 +:10B250004480878002D005E00624EAE7B188C180F7 +:10B26000F18801810024CDE90054052307224146DD +:10B270004846FFF7EFFE88F80440D2E710B50446D1 +:10B28000032101F059FE0146021D2046BDE8104091 +:10B29000B9E7F84A002009211170704770B50C46D3 +:10B2A0001546342120460CF08BFE012060700921E8 +:10B2B00004F118000CF084FE05B9FFDF297820782E +:10B2C00061F30100207070BD7047002110B560F37C +:10B2D0001F41002005F092FA002010BDFEB5064681 +:10B2E0000F0CFCF777FD050007D06F80032138466F +:10B2F00001F022FE040008D106E003B03846BDE8A4 +:10B30000F0401321F7F752B9FFDF0EB1FFDFFEBDAA +:10B3100020782A4620F00800207002208DF80000D6 +:10B320004FF6FF70ADF80200ADF8040069463846EC +:10B33000F6F796FDFEBD00B5FFDF002000BD2DE94C +:10B34000FC410C461E4617468046032101F0F4FDE1 +:10B350000546092C0AD2DFE804F0050505050505B8 +:10B3600009090700042303E0062301E0FFDF0023AF +:10B37000CDE90076224629464046FFF76BFEBDE840 +:10B38000FC8138B50546A0F57F40FF381CD0284623 +:10B3900001F004FF040000D1FFDF204601F0A7FA0E +:10B3A000002810D001466A46204601F0C2FA0098F3 +:10B3B0000321B0F80540284601F0BEFD052C03D15D +:10B3C000007908B1002038BD012038BD2DE9F041D9 +:10B3D000044686B0408801F0E1FE050000D1FFDFA1 +:10B3E00003AA2846616800F034F9039D001F80B26B +:10B3F00035F8032F698882420AD104290BD0052928 +:10B4000018D0062904D16088291D6368F8F750F91F +:10B4100006B0BDE8F08116462D1D2246294630466D +:10B42000F9F7D7FE0828F3D1224629463046FAF725 +:10B43000EEFEEDE716466088032101F07DFD002158 +:10B440008DF80010042EE3D36A79002AE0D02B791E +:10B4500002274FF6FF78012B28D0122B01D0132B97 +:10B460000BD00491059169798DF81010638801461D +:10B4700004AA1846FFF7C7FECAE783789342C7D1EC +:10B4800002781307C4D5062EC2D122F0080202703A +:10B49000608860F31F41002005F0B0F98DF800705E +:10B4A000ADF802802889ADF8040017E0062EAFD36E +:10B4B00083789342ACD102781307A9D522F0080211 +:10B4C0000270608860F31F41002005F097F98DF845 +:10B4D00000702889ADF80200ADF80480608822462B +:10B4E0006946F6F7BDFC93E770B50D4606460321A5 +:10B4F00001F022FD040004D02078000704D51120BB +:10B5000070BD43F2020070BD2A4621463046FFF767 +:10B510003BFE18B92868206168686061207840F0B7 +:10B5200008002070002070BD2DE9F04F0E4691B04C +:10B530008046032101F000FD0446404601F040FE34 +:10B5400007460020079008900990ADF830000A9057 +:10B5500002900390049004B9FFDF0DF10809FFB9D0 +:10B56000FFDF1DE038460BA9002201F083F89DF8AB +:10B570002C0000F07F05092D00D3FFDF6019017E4C +:10B58000491E01769DF82C00000609D52A460CA913 +:10B5900007A8FFF74FFD19F80510491C09F8051019 +:10B5A000761EF6B2DED204F13000324D04F1220BE9 +:10B5B000DFF8C4A004F12607069010E0584606996B +:10B5C00000F049F806462870092800D3FFDF5AF832 +:10B5D000261040468847608CC05DB04202D0A08CE7 +:10B5E0000028EBD109202870234D4E4624350EE06B +:10B5F0000CA907A800F02FF80446375D55F8240081 +:10B6000000B9FFDF55F82420394640469047BDF881 +:10B610001E000028ECD111B05AE510B5032101F04D +:10B620008BFC040000D1FFDF092104F118000CF0AD +:10B63000C7FC207840F00400207010BD10B50C4607 +:10B64000032101F079FC2044007E002800D0012075 +:10B6500010BD01F06EB910B50C4601230922011D81 +:10B6600001F045FB0078218801228240914321802E +:10B6700010BD000054000020748301002DE9FC4738 +:10B680000C460646694600F006FE002860D106F02A +:10B6900009FAB0425CD02146304609F0C4F828BB14 +:10B6A000019D95F8EC00383518B9E87E08B1012005 +:10B6B00000E00020814695F837004FF000084FF079 +:10B6C000010AA0B195F83800800710D584F80180F0 +:10B6D00084F800A084F80280A68095F83910A17142 +:10B6E000698F2181A98F618185F837802DE03046EF +:10B6F00001F066FD070000D1FFDF384600F094FF3F +:10B7000040B184F801800D212170A680E08084F88A +:10B7100002A01AE0304601F041FD070000D1FFDF32 +:10B72000B9F1000F14D0384600F0D5FF80B1304693 +:10B7300006F05DF884F801800A21217084F8028007 +:10B74000A680297FA17185F81B800120BDE8FC87B8 +:10B750000020FBE71CB5694600F09DFD00B1FFDF4E +:10B76000684600F0A5FDFC4900208968A1F8B200F8 +:10B770001CBD2DE9FC4104460E46062001F088FB65 +:10B7800000250746A846064417E02088401C80B2E2 +:10B790002080B04202D34046A4F8008080B2B84274 +:10B7A00004D3B04202D20020BDE8FC81694600F01B +:10B7B00072FD0028F8D06D1CEDB2AE42E5D84FF610 +:10B7C000FF7020801220EFE710B506F081F80AF034 +:10B7D000A0FBE2484FF6FF710422418181810021E4 +:10B7E000017003218170C2701B228280C28001819E +:10B7F00010BD70B5D84C0D466060217005F0F5FFA6 +:10B8000000F066FDFFF7E0FF207809F057FE2846BC +:10B8100007F092FC06F082F92178606809F0C5F81B +:10B82000BDE870400AF075BB10B501240AB10020D4 +:10B8300010BD21B1012903D00024204610BD0221F2 +:10B840000BF0D7F8F9E72DE9F041040000D1FFDF54 +:10B85000C24802210C308046FFF78BFF00B1FFDFAA +:10B86000BE4D0620AF8901F013FB0646A889B04201 +:10B870001CD1204606F0BBF8F8B106F051FBC8B168 +:10B880002078132816D1A078A0B1A088062101F055 +:10B8900053FB050000D1FFDF288805F0A8FFA08832 +:10B8A000062101F05BFB28B1FFDF03E02146FFF733 +:10B8B000E5FE10B10120BDE8F08102214046FFF70E +:10B8C00058FF10B9A889B842D0D10020F3E710B5CD +:10B8D00000F0C2FC08B10C2010BD0AF053FB0020A0 +:10B8E00010BD10B50446007818B1012801D012200F +:10B8F00010BD00F0BCFC20B10AF0A1FB08B10C2087 +:10B9000010BD207800F092FCE21D04F11703611CC9 +:10B91000BDE810400AF04ABB10B50446007818B1E3 +:10B92000012801D0122010BD00F096FC08B10C20B7 +:10B9300010BD207800F07AFC611C0AF0FDFA08B115 +:10B94000002010BD072010BD10B50AF07CFB08B127 +:10B95000002010BD302010BD10B5044600F087FC5B +:10B9600008B10C2010BD20460AF065FB002010BD78 +:10B9700010B500F07CFC20B10AF061FB08B10C208E +:10B9800010BD0AF04AFB002010BDFF2181704FF668 +:10B99000FF718180704949680A7882718A880281C2 +:10B9A0004988418101214170002070471CB5002465 +:10B9B00012F1080F15D00CDC12F1280F11D012F182 +:10B9C000140F0ED012F1100F0BD012F10C0F0CD17E +:10B9D00007E012F1040F04D01AB1032A01D0042A9F +:10B9E00003D1012804D0032806D0122420461CBD10 +:10B9F000104606F090FAF9E708461446694600F04A +:10BA00004AFC08B10224F1E7019880F8374000248D +:10BA1000ECE710B5134601220AF047FD002010BDE7 +:10BA200010B5044600F023FC08B10C2010BD2146DF +:10BA3000002005F04EFF002010BD10B5044607F0B1 +:10BA4000B3FD20B1207807F09DFB002010BD0C2035 +:10BA500010BD10B5044600F00AFC08B10C2010BD62 +:10BA60002146012005F035FF002010BD38B5044601 +:10BA70004FF6FF70ADF80000A079E179884213D04D +:10BA800021791F2910D861791F290DD8002211466C +:10BA90000BF0DCFB40B90022E07911460BF0D6FB3D +:10BAA00010B9207A072801D9122038BD07F088FD87 +:10BAB00048B900216846FFF75CFE20B1204605F03A +:10BAC000E1F8002038BD0C2038BD2DE9FC4181781B +:10BAD00004461A2925D00EDC16292DD2DFE801F004 +:10BAE0002C2C2C2C2C212C2C2C2C2C2C2C2C2C2CA1 +:10BAF0002C2C2C2121212A291ED00BDCA1F11E0186 +:10BB00000C2919D2DFE801F018181818181818189D +:10BB10001818180D3A3904290ED2DFE801F00D0289 +:10BB20000D022088B0F5706F06D20127694600F03B +:10BB3000B2FB18B1022037E6122035E6019D6846B7 +:10BB40002E4605F5A87506F2511600F097FB08B1D0 +:10BB5000287828B10C2027E658000020B4040020E3 +:10BB60002F70A0783070684600F0A2FB00201BE622 +:10BB70001CB50C46694600F08EFB002118B121600F +:10BB8000217102201CBD01980246383080F8401017 +:10BB900093682360137B237190F84030002BF5D11C +:10BBA00000201CBD10B5044600F061FB20B10AF076 +:10BBB00046FA08B10C2010BD207800F037FBE2797E +:10BBC000611C0AF018FB08B1002010BD022010BD56 +:10BBD000887800B90320C97801B903211070197061 +:10BBE000002070471FB50446008801A900F053FBF0 +:10BBF000002806D1A08830B1012804D0022802D044 +:10BC0000122004B010BD6B4603AA214601A8FFF71D +:10BC1000DFFF0028F5D1029A012182F87B11029AF8 +:10BC200092F8AE213AB9029A92F87A211AB9029A98 +:10BC300092F85D200AB13A200CE0029A82F87A115B +:10BC4000029A9DF80C1082F87C11029A9DF800105F +:10BC500082F87D11029A002182F87B11D1E7817868 +:10BC6000CA0802D1C278D30801D012207047490710 +:10BC700001D4510701D511207047B3E7F0B5871FF4 +:10BC8000DDE9056540F67B44A74213D28F1FA7422A +:10BC900010D288420ED8B2F5FA7F0BD2A3F10A0077 +:10BCA000241FA04206D2521C4A43B2EB830F01DA92 +:10BCB000AE4201D90020F0BD0120F0BD1CB5828943 +:10BCC0004189CDE900120389C28881884088FFF745 +:10BCD000D5FF08B100201CBD30201CBDF8B51546AD +:10BCE0000E46044607F06CFC08B10C20F8BD204657 +:10BCF00000F002FB0028F9D161884FF01100CA065C +:10BD0000F4D5E27D032AF1D04906EFD4002030704B +:10BD1000A07555B9FF208DF800006946002006F097 +:10BD2000E6F86946002006F0CCF82046BDE8F84069 +:10BD300006F00FB80022D1E770B514460D4606464E +:10BD4000FB2919D813B11F2916D81BE006F001F9F9 +:10BD500020B11F2D10D8032C0ED104E0032C02D0EB +:10BD6000042C00D045B107F02BFC38B1032C05D0D2 +:10BD7000042C03D00C2070BD122070BD304605F09D +:10BD8000DBFE08B1002070BD422070BD70B50446D6 +:10BD9000C0780E46122510B106F03FF818B1607851 +:10BDA000042802D010E0284670BD07F009FC0028E6 +:10BDB000F9D006F07DF80028F5D106F0CAF8002881 +:10BDC000F1D1E0780028EED16278E178207833462E +:10BDD000FFF7B2FF0028E7D16178E07800F0D7FAEA +:10BDE00028B1E078211D06F082F8002070BD1120F6 +:10BDF00070BD0021CAE770B50446C0780D46122612 +:10BE000010B106F094F8A0B16278042A11D0E1785C +:10BE100020782B46FFF790FF002809D16178E07861 +:10BE200000F0B5FA38B1E078211D06F04AF800209C +:10BE300070BD304670BD112070BD0021DBE77CB5C0 +:10BE4000044640784225012808D8A07805F074FE01 +:10BE500020B120781225012802D090B128467CBD5F +:10BE600006F06EF820B1A0880028F7D08028F5D819 +:10BE700006F06DF860B160780028EFD020780128D6 +:10BE800008D006F047FD044607F01FF9002865D0EA +:10BE90000C207CBD05F091FE10B906F04FF868B398 +:10BEA00007F08EFB0028F3D105F0FCFDA0F57F41E3 +:10BEB000FF39EDD105F002FFA68842F2107046432B +:10BEC000A079314605F0B3FF06F02AF8C0B1002290 +:10BED000062101A801F002F8040018D0FA48032155 +:10BEE000846020460AF035FA204606F0D3F906F0C1 +:10BEF00030F8F64D68B1288901210EE012207CBD92 +:10BF00003146002007F041F938B3FFDF30E0092067 +:10BF10007CBD06F020F80146288907F0FAF90146B1 +:10BF2000A0620022204606F01CFD06F012F808B9B7 +:10BF300006F011F8E8780090AB78EA88A9882088A4 +:10BF400001F0B5F800B1FFDF208805F04FFC314665 +:10BF5000204607F01AF900B1FFDF09E044B120885C +:10BF600005F045FC2088062100F0F8FF00B1FFDF56 +:10BF700000207CBD002162E770B50D46062100F06F +:10BF8000DBFF040003D094F8530110B10AE0022053 +:10BF900070BD94F84500142801D0152802D194F8FA +:10BFA000940108B10C2070BD1022294604F5AA7036 +:10BFB0000BF065FF012084F85301002070BD10B51F +:10BFC000062100F0B9FF18B190F8531111B107E044 +:10BFD000022010BD90F84510142903D0152901D076 +:10BFE0000C2010BD022180F85311002010BD2DE956 +:10BFF000FC410D464BF680321221954213D895B183 +:10C00000694600F048F900280CD1019EB41C38366E +:10C0100027882A46394630460AF091F92088B842E6 +:10C02000F6D1002087E5084685E51CB50446008862 +:10C03000694600F030F9002808D10199A378084634 +:10C0400091F82C2038319A4201D10C201CBD7F225E +:10C050000A728A720022CA72E17880F82D10217962 +:10C0600080F82E10A17880F82C1010461CBD1CB54D +:10C070000C46694600F00FF9002806D1019890F8A7 +:10C08000530000B10120207000201CBD7CB50D467E +:10C090001446694600F0FFF8002805D1019890F891 +:10C0A0002C00012801D00C207CBD019890F8401094 +:10C0B000297090F84100207000207CBD70B50D46BD +:10C0C0001646062100F038FF18B381880124C38882 +:10C0D000428804EB4104AC4217D842F21074634327 +:10C0E000A4106243B3FBF2F2521E94B24FF4FA7200 +:10C0F000944200D91446A54200D22C46491C641C27 +:10C10000B4FBF1F24A43521E91B290F880211AB961 +:10C1100001E0022070BD01843180002070BD10B5A7 +:10C120000C46062100F008FF48B180F8BF4024B15A +:10C1300090F8BD1009B107F011F9002010BD0220E0 +:10C1400010BD017891B1417881B141881B290DD38F +:10C1500081881B290AD3C188022907D35B49026859 +:10C1600041F8022F40684860002070471220704755 +:10C1700010B507F09CF8002010BD70B514460A46B3 +:10C18000064600250121104607F0C3F8002800D814 +:10C19000284605460121304600F04FF806460121A9 +:10C1A000002000F04AF83118012296318D4206D95C +:10C1B00001F19600691AB1FBF0F0401C82B22280B6 +:10C1C000002070BD10B5044600F051F808B10C20F5 +:10C1D00010BD601C09F0FCFF207800F0010005F0A4 +:10C1E00006FD002010BD10B50446062000F042FEFA +:10C1F00008B10C2010BD2078C00711D00022607853 +:10C2000011460BF023F808B1122010BDA06808F009 +:10C2100020FF6078D4F8041008F024FF002010BD3F +:10C22000002008F016FF00210846F5E718B10228A3 +:10C2300001D0012070470020704710B5012904D0BB +:10C24000022905D0FFDF204610BDC000503001E0BC +:10C2500080002C3084B2F6E710B507F0B1F920B1B8 +:10C2600005F0A3FC08B1012010BD002010BD10B5E1 +:10C2700007F0A6F9002800D0012010BD416891F810 +:10C28000EC0091F8531021B918B1042801D0012015 +:10C2900070470020704710B50C46062100F04CFE98 +:10C2A000606018B101202070002010BD022010BD78 +:10C2B000416891F8BD20002A05D0002281F8BD20F8 +:10C2C000406807F04BB8704758000020B4040020C5 +:10C2D00008B54FF6FF70ADF8000006E00621BDF886 +:10C2E000000000F03BFE00B1FFDF00216846FFF7D1 +:10C2F00040FA0028F2D008BD38B504460078EF288F +:10C3000041D86088ADF80000009800F048F888B384 +:10C310006188080708D4D4E90120824233D8202A52 +:10C3200031D3B0F1807F2ED2207B18B307282AD8D2 +:10C33000607B28B1012803D0022801D0032822D134 +:10C340004A0703D4022801D0032805D1A07B08B1F5 +:10C35000012818D1480707D4607D28B1012803D0EF +:10C36000022801D003280ED1C806E07D03D501289C +:10C3700009D104E007E0012801D0032803D1E07EC1 +:10C3800018B1012801D0122038BD002038BD1F2867 +:10C3900001D8032901D0002095E7012093E780B25E +:10C3A000C1060CD401071AD481064FEAC07103D527 +:10C3B000A9B9800713D410E079B180070BE0C10759 +:10C3C0004FEA807104D0002902DB400705D406E063 +:10C3D000010704D44007002801DB012073E7002097 +:10C3E00071E7000030B5058825F4004421448CB283 +:10C3F0004FF4004194420AD2121B92B21B339A426C +:10C4000001D2A94307E005F40041214303E0A21A49 +:10C4100092B2A9431143018030BD08440830504313 +:10C420004A31084480B2704770B51D4616460B4627 +:10C43000044629463046049AFFF7EFFF0646B3420A +:10C4400000D2FFDF282120460BF0BAFD4FF6FF7027 +:10C45000A082283EB0B265776080B0F5004F00D969 +:10C46000FFDF618805F13C00814200D2FFDF608878 +:10C470000835401B343880B220801B2800D21B2096 +:10C4800020800020A07770BD8161886170472DE910 +:10C49000F05F0D46C188044600F12809008921F4A7 +:10C4A000004620F4004800F062FB10B10020BDE817 +:10C4B000F09F4FF0000A4FF0010BB0450CD9617F9F +:10C4C000A8EB0600401A0838854219DC09EB060083 +:10C4D0000021058041801AE06088617F801B471A37 +:10C4E000083F0DD41B2F00DAFFDFBD4201DC2946D7 +:10C4F00000E0B9B2681A0204120C04D0424502DD11 +:10C5000084F817A0D2E709EB06000180428084F886 +:10C5100017B0CCE770B5044600F12802C088E37D6F +:10C5200020F400402BB110440288438813448B420E +:10C5300001D2002070BD00258A4202D301804580CF +:10C5400008E0891A0904090C418003D0A01D00F0FD +:10C550001EFB08E0637F00880833184481B26288BC +:10C56000A01DFFF73FFFE575012070BD70B50346C4 +:10C5700000F12804C588808820F400462644A8429B +:10C5800002D10020188270BD98893588A84206D350 +:10C59000401B75882D1A2044ADB2C01E05E02C1A30 +:10C5A000A5B25C7F20443044401D0C88AC4200D9C9 +:10C5B0000D809C8924B1002414700988198270BDF3 +:10C5C0000124F9E770B5044600F12801808820F4C1 +:10C5D00000404518208A002825D0A189084480B24F +:10C5E000A08129886A881144814200D2FFDF28880F +:10C5F000698800260844A189884212D1A069807FF9 +:10C600002871698819B1201D00F0C1FA08E0637F24 +:10C6100028880833184481B26288201DFFF7E2FEA3 +:10C62000A6812682012070BD2DE9F04141898788CD +:10C630000026044600F12805B94218D004F10A0882 +:10C6400021F400402844418819B1404600F09FFA87 +:10C6500008E0637F00880833184481B2628840464E +:10C66000FFF7C0FE761C6189B6B2B942E8D1304608 +:10C67000BDE8F0812DE9F04104460B4627892830BA +:10C68000A68827F40041B4F80A8001440D46B74259 +:10C6900001D10020ECE70AB1481D106023B1627F90 +:10C6A000691D18460BF0EBFB2E88698804F1080021 +:10C6B00021B18A1996B200F06AFA06E0637F6288B7 +:10C6C0000833991989B2FFF78DFE474501D12089BA +:10C6D00060813046CCE78188C088814201D1012049 +:10C6E00070470020704701898088814201D1012074 +:10C6F00070470020704770B58588C38800F1280412 +:10C7000025F4004223F4004114449D421AD0838949 +:10C71000058A5E1925886388EC18A64214D313B1E4 +:10C720008B4211D30EE0437F08325C1922444088CB +:10C7300092B2801A80B22333984201D211B103E041 +:10C740008A4201D1002070BD012070BD2DE9F04763 +:10C750008846C1880446008921F4004604F1280770 +:10C7600020F4004507EB060900F001FA002178BB30 +:10C77000B54204D9627FA81B801A002503E06088B7 +:10C78000627F801B801A083823D4E28962B1B9F82D +:10C790000020B9F802303BB1E81A2177404518DB98 +:10C7A000E0893844801A09E0801A217740450ADB85 +:10C7B000607FE1890830304439440844C01EA4F841 +:10C7C0001280BDE8F087454503DB01202077E7E7CD +:10C7D000FFE761820020F4E72DE9F74F044600F1FE +:10C7E0002805C088884620F4004A608A05EB0A06BE +:10C7F00008B1404502D20020BDE8FE8FE08978B143 +:10C800003788B6F8029007EB0901884200D0FFDFB5 +:10C81000207F4FF0000B50EA090106D088B33BE0BF +:10C820000027A07FB9463071F2E7E18959B1607FF6 +:10C830002944083050440844B4F81F1020F8031D60 +:10C8400094F821108170E28907EB080002EB0801DF +:10C85000E1813080A6F802B002985F4650B1637F54 +:10C8600030880833184481B26288A01DFFF7BAFDF2 +:10C87000E78121E0607FE189083050442944084481 +:10C880002DE0FFE7E089B4F81F102844C01B20F812 +:10C89000031D94F82110817009EB0800E28981B230 +:10C8A00002EB0800E081378071800298A0B1A01DE2 +:10C8B00000F06DF9A4F80EB0A07F401CA077A07D19 +:10C8C00008B1E088A08284F816B000BFA4F812B0C6 +:10C8D00084F817B001208FE7E0892844C01B30F8A6 +:10C8E000031DA4F81F10807884F82100EEE710B52E +:10C8F000818800F1280321F400442344848AC288FB +:10C90000A14212D0914210D0818971B9826972B16D +:10C910001046FFF7E8FE50B91089283220F4004095 +:10C92000104419790079884201D1002010BD1846C1 +:10C9300010BD00F12803407F08300844C01E10607D +:10C94000088808B9DB1E136008884988084480B24B +:10C9500070472DE9F04100F12806407F1C46083061 +:10C960009046431808884D88069ADB1EA0B1C01C6B +:10C9700080B2904214D9801AA04200DB204687B2D0 +:10C9800098183A4641460BF04EFA002816D1E01BA3 +:10C9900084B2B844002005E0ED1CADB2F61EE8E715 +:10C9A000101A80B20119A94206D8304422464146E5 +:10C9B000BDE8F0410BF037BA4FF0FF3058E62DE9F3 +:10C9C000F04100F12804407F1E460830904643188D +:10C9D000002508884F88069ADB1E90B1C01C80B2E3 +:10C9E000904212D9801AB04200DB304685B29918C5 +:10C9F0002A4640460BF043FA701B86B2A84400203A +:10CA000005E0FF1CBFB2E41EEAE7101A80B28119EC +:10CA1000B94206D82118324640460BF030FAA81920 +:10CA200085B2284624E62DE9F04100F12804407F34 +:10CA30001E46083090464318002508884F88069AFD +:10CA4000DB1E90B1C01C80B2904212D9801AB04255 +:10CA500000DB304685B298182A4641460BF00FFAA3 +:10CA6000701B86B2A844002005E0FF1CBFB2E41E84 +:10CA7000EAE7101A80B28119B94206D8204432463A +:10CA800041460BF0FCF9A81985B22846F0E5401D97 +:10CA9000704710B5044600F12801C288808820F450 +:10CAA00000431944904206D0A28922B9228A12B9C1 +:10CAB000A28A904201D1002010BD0888498831B176 +:10CAC000201D00F064F800202082012010BD637F4B +:10CAD00062880833184481B2201DFFF783FCF2E717 +:10CAE0000021C18101774182C1758175704703883A +:10CAF0001380C28942B1C28822F4004300F12802A7 +:10CB00001A440A60C08970470020704710B5044677 +:10CB1000808AA0F57F41FF3900D0FFDFE088A08246 +:10CB2000E08900B10120A07510BD4FF6FF71818230 +:10CB300000218175704710B50446808AA0F57F41B9 +:10CB4000FF3900D1FFDFA07D28B9A088A18A8842E3 +:10CB500001D1002010BD012010BD8188828A914240 +:10CB600001D1807D08B1002070470120704720F47A +:10CB7000004221F400439A4207D100F4004001F43E +:10CB80000041884201D0012070470020704730B535 +:10CB9000044600880D4620F40040A84200D2FFDF82 +:10CBA00021884FF4004088432843208030BD70B571 +:10CBB0000C00054609D0082C00D2FFDF1DB1A1B240 +:10CBC000286800F044F8201D70BD0DB100202860D9 +:10CBD000002070BD0021026803E0938812681944A8 +:10CBE00089B2002AF9D100F032B870B500260D469E +:10CBF0000446082900D2FFDF206808B91EE0044679 +:10CC000020688188A94202D001680029F7D1818873 +:10CC10000646A94201D100680DE005F1080293B271 +:10CC20000022994209D32844491B0260818021686F +:10CC3000096821600160206000E00026304670BD78 +:10CC400000230B608A8002680A600160704700233D +:10CC50004360021D018102607047F0B50F460188F4 +:10CC6000408815460C181E46AC4200D3641B304465 +:10CC7000A84200D9FFDFA019A84200D9FFDF381968 +:10CC8000F0BD2DE9F04188460646018840881546EA +:10CC90000C181F46AC4200D3641B3844A84200D98C +:10CCA000FFDFE019A84200D9FFDF708838447080A8 +:10CCB00008EB0400BDE8F0812DE9F041054600884D +:10CCC0001E461746841B8846BC4200D33C442C8039 +:10CCD00068883044B84200D9FFDFA019B84200D9B3 +:10CCE000FFDF68883044688008EB0400E2E72DE944 +:10CCF000F04106881D460446701980B217468846E2 +:10CD00002080B84201D3C01B20806088A84200D296 +:10CD1000FFDF7019B84200D9FFDF6088401B6080D8 +:10CD200008EB0600C6E700002DE9F041BF4D0446C0 +:10CD30009046A8780E46A04200D8FFDF05EB860794 +:10CD4000786A50F8240000B1FFDFB868002816D0D8 +:10CD5000304600F032F90146B868FFF746FF05009B +:10CD60000CD0786A072E40F8245000D3FFDFB0487B +:10CD70004246294650F82630204698472846BDE8C6 +:10CD8000F0812DE9F84305000C46009524D00026DB +:10CD9000E81C20F00300A84200D0FFDFDFF88C82FF +:10CDA0000027314688F8007088F8014088F8024072 +:10CDB00088F8034088F8044088F8054088F8064061 +:10CDC000684600F003F9002042460099C91C21F092 +:10CDD0000301009116B10FE00126D9E702EB8003B1 +:10CDE0005962002106E000BFD3F824C04CF821703E +:10CDF000491CC9B2A142F7D30099401C01EB840140 +:10CE0000C0B200910728E0D3481BBDE8F88310B5F5 +:10CE1000044603F065FD08B1102010BD2078834A58 +:10CE2000618802EB800092780EE0436A53F821306B +:10CE300043B14A1C6280A180406A50F82100A06082 +:10CE4000002010BD491C89B28A42EED861800520BD +:10CE500010BD70B505460C46084603F041FD08B10B +:10CE6000102070BD072D01D3072070BD2570002054 +:10CE7000608070BD0EB56946FFF7EBFF00B1FFDFC4 +:10CE80006846FFF7C4FF08B100200EBD01200EBDAB +:10CE900010B50446072800D3FFDF6448005D10BDCD +:10CEA0003EB5054600246946FFF7D3FF18B1FFDF02 +:10CEB00001E0641CE4B26846FFF7A9FF0028F8D03F +:10CEC0002846FFF7E5FF001BC0B23EBD57498978F1 +:10CED000814201D9C0B27047FF2070472DE9F0416F +:10CEE00006291BD1514C00273B464FF6FF7604EB39 +:10CEF000810514F801C00AE0DC19D5F824E0A4B2D9 +:10CF00005EF824E0BEF1000F04D05B1C9BB29C4590 +:10CF1000F2D8344604802046B44201D100202EE7E6 +:10CF2000BDE8F04100E7A0F57F43FF3B01D00729B2 +:10CF300001D300207047F7E6A0F57F42FF3A0BD0FF +:10CF4000072909D2394A9378834205D902EB810136 +:10CF5000496A51F820007047002070472DE9F041E0 +:10CF600004460D46A4F57F4143F20200FF3902D08A +:10CF7000072D01D3072002E72C494FF000088A78DB +:10CF8000A242F8D901EB8506726A52F82470002F8C +:10CF9000F1D0274839461C3050F8252020469047CC +:10CFA000716A284641F8248000F007F802463946A5 +:10CFB000B068FFF745FE0020E1E61D49383131F841 +:10CFC00010004FF6FC71C01C084070472DE9F84373 +:10CFD000164E8846054600242868C01C20F0030031 +:10CFE00028602046FFF7E9FF315D4843B8F1000FA4 +:10CFF00001D0002200E02A680146009232B10027E9 +:10D000004FEA0D00FFF7D3FD1FB106E00127002016 +:10D01000F8E706EB8401009A8A602968641C0844DA +:10D02000E4B22860072CD7D3EFE60000C404002048 +:10D03000BC83010070B50E461D46114600F0D4F8C1 +:10D0400004462946304600F0D8F82044001D70BD43 +:10D050002DE9F04190460D4604004FF0000610D037 +:10D060000027E01C20F00300A04200D0FFDFDDB16C +:10D0700041460020FFF79BFD0C3000EB850617B101 +:10D0800012E00127EDE7614F04F10C00A9003C60BC +:10D090002572606000EB8500206060680AF090FFF8 +:10D0A00041463868FFF783FD3046BDE8F0812DE941 +:10D0B000FF4F564C804681B020689A46934600B98F +:10D0C000FFDF2068027A424503D9416851F8280001 +:10D0D00020B143F2020005B0BDE8F08F514602983E +:10D0E00000F082F886B258460E9900F086F885B2B4 +:10D0F0007019001D87B22068A14639460068FFF705 +:10D1000074FD04001FD0678025802946201D0E9DD8 +:10D1100007465A4601230095FFF786F920883146D5 +:10D1200038440123029ACDF800A0FFF77DF920884A +:10D13000C1193846FFF7A8F9D9F800004168002066 +:10D1400041F82840C7E70420C5E770B52F4C0546D5 +:10D15000206800B9FFDF2068017AA9420ED9426831 +:10D1600052F8251051B1002342F825304A88006852 +:10D17000FFF766FD216800200A7A08E043F202000A +:10D1800070BD4B6853F8203033B9401CC0B28242A6 +:10D19000F7D80868FFF71EFD002070BD70B51B4E64 +:10D1A00005460024306800B9FFDF3068017AA942E3 +:10D1B00004D9406850F8250000B1041D204670BD18 +:10D1C00070B5124E05460024306800B9FFDF3068A4 +:10D1D000017AA94206D9406850F8251011B131F8FA +:10D1E000040B4418204670BD10B50A460121FFF714 +:10D1F00014F9C01C20F0030010BD10B50A4601212F +:10D20000FFF70BF9C01C20F0030010BD64000020E4 +:10D2100070B50446C2F1100528190AF030FE15F069 +:10D22000FF0108D0491EC9B2802060542046BDE8E5 +:10D2300070400AF0A3BE70BD30B505E05B1EDBB2E6 +:10D24000CC5CD55C6C40C454002BF7D130BD10B51C +:10D25000002409E00B78521E44EA430300F8013B26 +:10D2600011F8013BD2B2DC09002AF3D110BD2DE93F +:10D27000F04389B01E46DDE9107990460D00044662 +:10D2800022D002460846F949FEF7C3FB1022214688 +:10D290003846FFF7DCFFE07B000606D5F34A394647 +:10D2A000102310320846FFF7C7FF102239464846C0 +:10D2B000FFF7CDFFF87B000606D5EC4A4946102360 +:10D2C00010320846FFF7B8FF102120460AF056FE3C +:10D2D0000DE0103EB6B208EB060110232246684668 +:10D2E000FFF7AAFF224628466946FEF792FB102E5A +:10D2F000EFD818D0F2B241466846FFF789FF1023F5 +:10D300004A46694604A8FFF797FF1023224604A95E +:10D310006846FFF791FF224628466946FEF779FBEB +:10D3200009B0BDE8F08310233A464146EAE770B5FC +:10D330009CB01E460546134620980C468DF8080002 +:10D34000202219460DF109000AF099FD20222146FC +:10D350000DF129000AF093FD17A913A8CDE90001EA +:10D36000412302AA31462846FFF781FF1CB070BD59 +:10D370002DE9FF4F9FB014AEDDE92D5410AFBB492E +:10D38000CDE90076202320311AA8FFF770FF4FF077 +:10D3900000088DF808804FF001098DF8099054F8C5 +:10D3A000010FCDF80A00A088ADF80E0014F8010CAA +:10D3B0001022C0F340008DF8100055F8010FCDF891 +:10D3C0001100A888ADF8150015F8010C2C99C0F3D0 +:10D3D00040008DF8170006A882460AF050FD0AA802 +:10D3E0008346102222990AF04AFDA04835230838C6 +:10D3F00002AA40688DF83C80CDE900760E901AA90B +:10D400001F98FFF734FF8DF808808DF80990206889 +:10D41000CDF80A00A088ADF80E0014F8010C102217 +:10D42000C0F340008DF810002868CDF81100A888DE +:10D43000ADF8150015F8010C2C99C0F340008DF8DB +:10D44000170050460AF01BFD5846102222990AF098 +:10D4500016FD86483523083802AA40688DF83C90AE +:10D46000CDE900760E901AA92098FFF700FF23B0AF +:10D47000BDE8F08FF0B59BB00C460546DDE9221003 +:10D480001E461746DDE92032D0F801C0CDF808C0AD +:10D49000B0F805C0ADF80CC00078C0F340008DF8BE +:10D4A0000E00D1F80100CDF80F00B1F80500ADF87D +:10D4B000130008781946C0F340008DF81500108855 +:10D4C000ADF8160090788DF818000DF119001022B3 +:10D4D0000AF0D5FC0DF12900102231460AF0CFFCEC +:10D4E0000DF13900102239460AF0C9FC17A913A81A +:10D4F000CDE90001412302AA21462846FFF7B7FEE5 +:10D500001BB0F0BDF0B5A3B017460D4604461E464D +:10D51000102202A828990AF0B2FC06A82022394657 +:10D520000AF0ADFC0EA8202229460AF0A8FC1EA98C +:10D530001AA8CDE90001502302AA314616A8FFF728 +:10D5400096FE1698206023B0F0BDF0B589B0044671 +:10D55000DDE90E070D463978109EC1F340018DF8C4 +:10D56000001031789446C1F340018DF8011019681C +:10D57000CDF802109988ADF8061099798DF8081049 +:10D580000168CDF809108188ADF80D1080798DF80B +:10D590000F0010236A46614604A8FFF74DFE22469D +:10D5A000284604A9FEF735FAD6F801000090B6F82F +:10D5B0000500ADF80400D7F80100CDF80600B7F873 +:10D5C0000500ADF80A000020039010236A462146AA +:10D5D00004A8FFF731FE2246284604A9FEF719FAEF +:10D5E00009B0F0BD1FB51C6800945B680193136817 +:10D5F000029352680392024608466946FEF709FA0A +:10D600001FBD10B588B0044610680490506805909E +:10D6100000200690079008466A4604A9FEF7F9F92B +:10D62000BDF80000208008B010BD1FB51288ADF80D +:10D6300000201A88ADF80220002201920292039283 +:10D64000024608466946FEF7E4F91FBD7FB5074B61 +:10D6500014460546083B9A1C6846FFF7E6FF22463B +:10D6600069462846FFF7CDFF7FBD00000A84010010 +:10D6700070B5044600780E46012813D0052802D064 +:10D68000092813D10EE0A06861690578042003F031 +:10D69000B5F8052D0AD0782300220420616903F033 +:10D6A00003F803E00420616903F0A8F8314620463E +:10D6B000BDE8704001F086B810B500F12D02C379C5 +:10D6C0009478411D64F003042340C371DB070DD03F +:10D6D0004B79547923404B710B79127913400B71BC +:10D6E0008278C9788A4200D9817010BD00224A71BF +:10D6F0000A71F5E74178012900D00C2101707047CB +:10D700002DE9F04F93B04FF0000B0C690D468DF8EA +:10D7100020B0097801260C2017464FF00D084FF075 +:10D72000110A4FF008091B2975D2DFE811F01B0020 +:10D73000C30206031E035D037003A203B703F803CD +:10D74000190461049304A004EC042A05340552056D +:10D750005D05EE053106340663067F06F9061D07F2 +:10D76000E606EB0614B120781D282AD0D5F80880EB +:10D770005FEA08004FD001208DF82000686A02227D +:10D780000D908DF824200A208DF82500A8690A90B4 +:10D79000A8880028EED098F8001091B10F2910D277 +:10D7A0007ED2DFE801F07D1349DEFEFDFCFBFAF9D5 +:10D7B00038089CF8F70002282DD124B120780C28D5 +:10D7C00001D00026EFE38DF82020CBE10420696A28 +:10D7D00003F014F8A8880728EED1204600F0EDFFEA +:10D7E000022809D0204600F0E8FF032807D9204688 +:10D7F00000F0E3FF072802D20120207004E0002C93 +:10D80000B8D020780128D7D198F80400C11F0A2980 +:10D8100002D30A2061E0C4E1A070D8F80010E162F0 +:10D82000B8F80410218698F8060084F83200012028 +:10D8300028700320207044E00728BDD1002C99D027 +:10D8400020780D28B8D198F8031094F82F20C1F350 +:10D85000C000C2F3C002104201D0062000E0072041 +:10D86000890707D198F805100142D2D198F806101F +:10D870000142CED194F8312098F8051020EA020236 +:10D880001142C6D194F8322098F806109043014214 +:10D89000BFD198F80400C11F0A29BAD2617D00E007 +:10D8A00006E281427ED8D8F800106160B8F8041012 +:10D8B000218198F80600A072012028700E202070A7 +:10D8C00003208DF82000686A0D9004F12D00099066 +:10D8D000601D0A900F300B9022E12875FDE341286E +:10D8E00091D1204600F069FF042802D1E078C007FA +:10D8F00004D1204600F061FF0F2884D1A88CD5F810 +:10D900000C8080B24FF0400BE669FFF747FC3246CF +:10D9100041465B464E46CDF80090FFF750F80B208D +:10D920008DF82000686A0D90E0690990002108A830 +:10D93000FFF79EFE2078042806D0A07D58B101286C +:10D9400009D003280AD049E305202070032028705D +:10D950008DF82060CDE184F800A032E7122020701D +:10D96000E9E11128BCD1204600F027FF042802D1AC +:10D97000E078C00719D0204600F01FFF062805D127 +:10D98000E078C00711D1A07D02280ED0204600F01B +:10D9900014FF08E0CAE081E06FE14EE121E101E11E +:10D9A000E7E017E0ADE111289AD1102208F101015A +:10D9B00004F13C000AF063FA607801287ED012205E +:10D9C0002070E078C00760D0A07D0028C8D0012872 +:10D9D000C6D05AE0112890D1204600F0EEFE08286B +:10D9E00004D0204600F0E9FE132886D104F16C0033 +:10D9F000102208F1010106460AF041FA20780828B1 +:10DA00000DD014202070E178C8070DD0A07D022829 +:10DA10000AD06278022A04D00328A1D035E0092078 +:10DA2000F0E708B1012837D1C80713D0A07D02283C +:10DA30001DD000200090D4E9062133460EA8FFF740 +:10DA400076FC10220EA904F13C000AF0ECF9C8B1F2 +:10DA5000042042E7D4E90912201D8DE8070004F1F3 +:10DA60002C0332460EA8616BFFF76FFDE9E7606B90 +:10DA7000C1F34401491E0068C84000F0010040F0B5 +:10DA80008000D7E72078092806D185F800908DF826 +:10DA9000209033E32870ECE30920FBE711289AD1AA +:10DAA000204600F08AFE0A2802D1E078C00704D19F +:10DAB000204600F082FE15288DD100E08DE104F1B2 +:10DAC0003C00102208F1010106460AF0D8F920783E +:10DAD0000A2816D016202070D4E90932606B611D27 +:10DAE0008DE80F0004F15C0304F16C0247310EA8CD +:10DAF000FFF7C0FC10220EA930460AF094F918B1C5 +:10DB0000F5E20B20207071E22046FFF7D5FDA078EA +:10DB1000216A0A18C0F1100110460AF02FFA23E317 +:10DB2000394608A8FFF7A4FD06463BE20228B6D115 +:10DB3000204600F042FE042804D3204600F03DFEBB +:10DB4000082809D3204600F038FE0E2829D32046A5 +:10DB500000F033FE122824D2A07D02289FD10E208F +:10DB60008DF82000686A0D9098F801008DF8240067 +:10DB7000F0E3022893D1204600F01FFE002810D0C9 +:10DB8000204600F01AFE0128F9D0204600F015FECC +:10DB90000C28F4D004208DF8240098F801008DF8AA +:10DBA00025005EE21128FCD1002CFAD0207817283D +:10DBB000F7D16178606A022911D0002101EB41019F +:10DBC000182606EBC1011022405808F101010AF0A5 +:10DBD00056F90420696A00F0E3FD2670F1E50121A1 +:10DBE000ECE70B28DDD1002CDBD020781828D8D129 +:10DBF0006078616A02281CD05FF0000000EB4002F0 +:10DC0000102000EBC2000958B8F8010008806078C5 +:10DC1000616A02280FD0002000EB4002142000EBC4 +:10DC2000C2000958404650F8032F0A604068486017 +:10DC300039E00120E2E70120EEE71128B1D1002C04 +:10DC4000AFD020781928ACD16178606A022912D04F +:10DC50005FF0000101EB41011C2202EBC101102227 +:10DC6000405808F101010AF00AF90420696A00F03D +:10DC700097FD1A20B6E00121ECE7082891D1002C8D +:10DC80008FD020781A288CD1606A98F8012001780A +:10DC900062F347010170616AD8F8022041F8012F50 +:10DCA000B8F8060088800420696A00F079FD8EE2E9 +:10DCB000072012E63878012894D1182204F11400C4 +:10DCC00079680AF021F9E079C10894F82F0001EA97 +:10DCD000D001E07861F30000E070217D002974D16B +:10DCE0002178032909D0C00725D0032028708DF89A +:10DCF0002090686A0D90412004E3607DA1788842FD +:10DD000001D90620E9E502262671E179204621F0B5 +:10DD1000E001E171617A21F0F0016172A17A21F0F4 +:10DD2000F001A172FFF7C8FC2E708DF82090686A90 +:10DD30000D900720E6E20420ACE6387805289DD156 +:10DD40008DF82000686A0D90B8680A900720ADF839 +:10DD500024000A988DF830B06168016021898180C3 +:10DD6000A17A817104202070F4E23978052985D1E7 +:10DD70008DF82010696A0D91391D09AE0EC986E82B +:10DD80000E004121ADF824108DF830B01070A88C31 +:10DD9000D7F80C8080B24026A769FFF711FA4146F8 +:10DDA0003A463346C846CDF80090FEF73CFE0021C7 +:10DDB00008A8FFF75DFCE07820F03E00801CE070D2 +:10DDC0002078052802D00F200CE049E1A07D20B189 +:10DDD000012802D0032802D002E10720BFE584F821 +:10DDE0000080EEE42070ECE4102104F15C0002F00D +:10DDF0005AFA606BB0BBA07D18B1012801D0052094 +:10DE0000FDE006202870F7486063A063BEE2387822 +:10DE1000022894D1387908B12875B3E3A07D02288F +:10DE200002D0032805D022E0B8680028F5D060634E +:10DE30001CE06078012806D0A07994F82E10012803 +:10DE400005D0E84806E0A17994F82E00F7E7B86815 +:10DE50000028E2D06063E078C00701D0012902D039 +:10DE6000E04803E003E0F8680028D6D0A06306206D +:10DE700010E68DF82090696A0D91E1784846C9074F +:10DE800009D06178022903D1A17D29B1012903D0EC +:10DE9000A17D032900D00720287031E138780528BA +:10DEA000BBD1207807281ED084F800A005208DF86B +:10DEB0002000686A0D90B8680A90ADF824A08DF82B +:10DEC00030B003210170E178CA070FD0A27D022A89 +:10DED0001AD000210091D4E9061204F15C03401C21 +:10DEE000FFF725FA67E384F80090DFE7D4E9092318 +:10DEF000211D8DE80E0004F12C0304F15C02401C8E +:10DF0000616BFFF722FB56E3626BC1F34401491ECC +:10DF10001268CA4002F0010141F08001DAE7387866 +:10DF20000528BDD18DF82000686A0D90B8680A9068 +:10DF3000ADF824A08DF830B0042100F8011B1022A8 +:10DF400004F15C0109F09BFF002108A8FFF790FB9A +:10DF50002078092801D0132044E70A2020709BE58F +:10DF6000E078C10742D0A17D012902D0022927D043 +:10DF700038E0617808A8012916D004F16C010091FD +:10DF8000D4E9061204F15C03001DFFF7BBFA0A2076 +:10DF9000287003268DF82080686A0D90002108A85B +:10DFA000FFF766FBDDE2C3E204F15C010091D4E916 +:10DFB000062104F16C03001DFFF7A4FA0026E9E72F +:10DFC000C0F3440114290DD24FF0006101EBB010F1 +:10DFD0004FEAB060E0706078012801D01020BEE404 +:10DFE0000620FFE6607801283FF4B7AC0A2051E52F +:10DFF000E178C90708D0A17D012903D10B20287041 +:10E0000004202FE028702DE00E2028706078616BCE +:10E01000012817D004F15C0304F16C020EA8FFF78D +:10E02000E1FA2046FFF748FBA0780EAEC0F11001E0 +:10E03000304409F0A3FF06208DF82000686A099695 +:10E040000D909AE004F16C0304F15C020EA8FFF756 +:10E05000C9FAE9E73978022903D139790029D1D001 +:10E0600029758FE28DF82000686A0D9058E53878A0 +:10E070000728F6D1D4E909216078012808D004F1F5 +:10E080006C00CDE90002029105D104F16C0304E0BB +:10E0900004F15C00F5E704F15C0304F14C007A68DC +:10E0A0000646216AFFF764F96078012821D1A0783B +:10E0B000216A0A18C0F11001104609F05FFFD4E987 +:10E0C0000923606B04F12D018DE80F0004F15C035E +:10E0D00004F16C0231460EA800E055E2FFF7CAF9E0 +:10E0E00010220EA904F13C0009F09DFE08B10B209E +:10E0F000AFE485F8008000BF8DF82090686A0D902D +:10E100008DF824A00CE538780528AAD18DF82000D8 +:10E11000686A0D90B8680A90ADF824A08DF830B008 +:10E1200080F80080617801291AD0D4E9093204F11D +:10E130002D01A66B03920096CDE9011304F16C0347 +:10E1400004F15C0204F14C01401CFFF793F900213B +:10E1500008A8FFF78DFA6078012805D0152041E660 +:10E16000D4E90923611DE4E70E20287006208DF80C +:10E170002000686ACDF824B00D90A0788DF82800B2 +:10E18000CEE438780328C0D1E079C00770D00F20E2 +:10E190002870072066E7387804286BD11422391DCF +:10E1A00004F1140009F0B0FE616A208CA1F80900A6 +:10E1B000616AA078C871E179626A01F003011172A5 +:10E1C000616A627A0A73616AA07A81F82400162073 +:10E1D00060E485F800A08DF82090696A50460D91A2 +:10E1E00090E000000A8401003878052842D1B86820 +:10E1F000A8616178606A022901D0012100E0002154 +:10E2000001EB4101142606EBC1014058082102F040 +:10E210004AF86178606A022901D0012100E00021FA +:10E2200001EB410106EBC101425802A8E169FFF789 +:10E230000DFA6078626A022801D0012000E0002017 +:10E2400000EB4001102000EBC1000223105802A98E +:10E250000932FEF7F1FF626AFD4B0EA80932A1698F +:10E26000FFF7E3F96178606A022904D0012103E035 +:10E2700042E18BE0BDE0002101EB4101182606EBF5 +:10E28000C101A27840580EA909F0F9FD6178606AD1 +:10E29000022901D0012100E0002101EB410106EB40 +:10E2A000C1014058A1780844C1F1100109F066FE8F +:10E2B00005208DF82000686A0D90A8690A90ADF8D5 +:10E2C00024A08DF830B0062101706278616A022ABC +:10E2D00001D0012200E0002202EB420206EBC20262 +:10E2E000401C8958102209F0CAFD002108A8FFF738 +:10E2F000BFF91220C5F818B028708DF82090686A10 +:10E300000D900B208DF824000AE43878052870D190 +:10E310008DF82000686A0D90B8680A900B20ADF85F +:10E3200024000A98072101706178626A022901D0ED +:10E33000012100E0002101EB4103102101EBC301A9 +:10E3400051580988A0F801106178626A022902D048 +:10E35000012101E02FE1002101EB4103142101EB38 +:10E36000C30151580A6840F8032F4968416059E0D9 +:10E370001920287001208DF8300077E616202870CB +:10E380008DF830B0002108A8FFF772F9032617E1D5 +:10E3900014202870B0E6387805282AD18DF820009E +:10E3A000686A0D90B8680A90ADF824A08DF830B076 +:10E3B00080F800906278616A4E46022A01D00122FC +:10E3C00000E0002202EB42021C2303EBC202401CCD +:10E3D0008958102209F053FD002108A8FFF748F9D9 +:10E3E000152028708DF82060686A0D908DF82460E3 +:10E3F0003CE680E0387805287DD18DF82000686AF9 +:10E400000D90B8680A90ADF82490092101706169F7 +:10E41000097849084170616951F8012FC0F802205C +:10E420008988C18020781C28A8D1A1E7E078C0079E +:10E4300002D04FF0060C01E04FF0070C6078022884 +:10E440000AD04FF0000000BF00EB040101F1090108 +:10E4500005D04FF0010004E04FF00100F4E74FF069 +:10E4600000000B78204413EA0C030B7010F8092FFE +:10E4700002EA0C02027004D14FF01B0C84F800C0B9 +:10E48000D2B394F801C0BCF1010F00D09BB990F851 +:10E4900000C0E0465FEACC7C04D028F0010606709C +:10E4A000102606E05FEA887C05D528F00206067093 +:10E4B00013262E70032694F801C0BCF1020F00D081 +:10E4C00092B991F800C05FEACC7804D02CF0010634 +:10E4D0000E70172106E05FEA8C7805D52CF0020655 +:10E4E0000E701921217000260078D0BBCAB3C3BBBF +:10E4F0001C20207035E012E002E03878062841D177 +:10E500001A2019E4207801283CD00C283AD0204663 +:10E51000FFF7F0F809208DF82000686A0D9031E0CF +:10E520003878052805D00620387003261820287072 +:10E5300046E005218DF82010686A0D90B8680A90B1 +:10E540000220ADF8240001208DF830000A980170F7 +:10E55000297D4170394608A8FFF78AF80646182039 +:10E560002870012E0ED02BE001208DF82000686A63 +:10E570000D9003208DF82400287D8DF8250085F866 +:10E5800014B012E0287D80B11D2020701720287063 +:10E590008DF82090686A0D9002208DF8240039468D +:10E5A00008A8FFF765F806460AE00CB1FE202070C7 +:10E5B0009DF8200020B1002108A8FFF759F810E4C9 +:10E5C00013B03046BDE8F08F2DE9F04387B00C461C +:10E5D0004E6900218DF8041001202578034602279A +:10E5E0004FF007094FF0050C85B1012D53D0022DD6 +:10E5F00039D1FE2030708DF80030606A059003201C +:10E600008DF80400207E8DF8050063E02179012952 +:10E6100025D002292DD0032928D0042923D1B17D6A +:10E62000022920D131780D1F042D04D30A3D032D7A +:10E6300001D31D2917D12189022914D38DF8047023 +:10E64000237020899DF8041088421BD2082001E025 +:10E65000028401008DF80000606A059057E0707830 +:10E660000128EBD0052007B0BDE8F0831D203070F5 +:10E67000E4E771780229F5D131780C29F3D18DF8CE +:10E680000490DDE7083402F804CB94E80B0082E83C +:10E690000B000320E7E71578052DE4D18DF800C0C5 +:10E6A000656A0595956802958DF8101094F80480B8 +:10E6B000B8F1010F13D0B8F1020F2DD0B8F1030F4C +:10E6C0001CD0B8F1040FCED1ADF804700E20287024 +:10E6D000207E687000216846FEF7CAFF0CE0ADF8A6 +:10E6E00004700B202870207E002100F01F0068704D +:10E6F0006846FEF7BDFF37700020B4E7ADF8047040 +:10E700008DF8103085F800C0207E687027701146A3 +:10E710006846FEF7ADFFA6E7ADF804902B70207FAA +:10E720006870607F00F00100A870A07F00F01F00FB +:10E73000E870E27F2A71C0071CD094F8200000F036 +:10E740000700687194F8210000F00700A87100210B +:10E750006846FEF78DFF2868F062A8883086A879A1 +:10E7600086F83200A069407870752879B0700D2065 +:10E770003070C1E7A9716971E9E700B587B0042875 +:10E780000CD101208DF800008DF8040000200591C7 +:10E790008DF8050001466846FEF76AFF07B000BD28 +:10E7A00070B50C46054602F029F821462846BDE81A +:10E7B00070407823002201F077BF08B100787047DD +:10E7C0000C20704770B50C0005784FF000010CD09C +:10E7D00021702146F4F720FD69482178405D884288 +:10E7E00001D1032070BD022070BDF4F715FD00209B +:10E7F00070BD0279012A05D000220A704B78012BE6 +:10E8000002D003E0042070470A758A610279930000 +:10E81000521C0271C15003207047F0B587B00F46FB +:10E8200005460124287905EB800050F8046C7078C7 +:10E83000411E02290AD252493A46083901EB8000AA +:10E84000314650F8043C2846984704460CB1012C48 +:10E8500011D12879401E10F0FF00287101D0032447 +:10E86000E0E70A208DF80000706A0590002101960B +:10E870006846FFF7A7FF032CD4D007B02046F0BDB1 +:10E8800070B515460A46044629461046FFF7C5FFEF +:10E89000064674B12078FE280BD1207C30B10020D0 +:10E8A0002870294604F10C00FFF7B7FF2046FEF759 +:10E8B00021FF304670BD704770B50E4604467C217E +:10E8C00009F07EFB0225012E03D0022E04D0052084 +:10E8D00070BD0120607000E065702046FEF70AFF01 +:10E8E000A575002070BD28B1027C1AB10A4600F15E +:10E8F0000C01C5E70120704710B5044686B004201E +:10E9000001F07CFF2078FE2806D000208DF8000062 +:10E9100069462046FFF7E7FF06B010BD7CB50E46FE +:10E9200000218DF804104178012903D0022903D079 +:10E93000002405E0046900E044690CB1217C89B140 +:10E940006D4601462846FFF754FF032809D1324699 +:10E9500029462046FFF794FF9DF80410002900D0B7 +:10E9600004207CBD04F10C05EBE730B40C460146F5 +:10E97000034A204630BC034B0C3AFEF756BE00005B +:10E98000488401000284010070B50D46040011D0D6 +:10E9900085B12101284609F0F1FA10224E49284696 +:10E9A00009F06DFA4C480121083801804480456027 +:10E9B000002070BD012070BD70B5474E0024054693 +:10E9C000083E10E07068AA7B00EB0410817B914246 +:10E9D00008D1C17BEA7B914204D10C22294609F07F +:10E9E00022FA30B1641C30888442EBDB4FF0FF30F8 +:10E9F00070BD204670BD70B50D46060006D02DB125 +:10EA0000FFF7DAFF002803DB401C14E0102070BD84 +:10EA1000314C083C20886288411C914201D9042075 +:10EA200070BD6168102201EB0010314609F027FA31 +:10EA30002088401C20802870002070BD70B51446CE +:10EA40000D0018D0BCB10021A170022802D01028FE +:10EA500011D105E0288870B10121A170108008E073 +:10EA60002846FFF7A9FF002805DB401CA070A889F5 +:10EA70002080002070BD012070BD70B50546144691 +:10EA80000E000BD000203070A878012808D005D9DE +:10EA90001149A1F108010A8890420AD9012070BDEC +:10EAA00024B1287820702888000A5070022008704D +:10EAB0000FE064B14968102201EB001120461039C3 +:10EAC00009F0DDF9287820732888000A6073102087 +:10EAD0003070002070BD0000700000202DE9F04172 +:10EAE00090460C4607460025FE48072F00EB881687 +:10EAF00007D2DFE807F00707070704040400012531 +:10EB000000E0FFDF06F81470002D13D0F5488030C8 +:10EB100000EB880191F82700202803D006EB400085 +:10EB2000447001E081F8264006EB4402202050703A +:10EB300081F82740BDE8F081F0B51F4614460E4627 +:10EB40000546202A00D1FFDFE649E648803100EB88 +:10EB5000871C0CEB440001EB8702202E07D00CEB46 +:10EB6000460140784B784870184620210AE092F818 +:10EB70002530407882F82500F6E701460CEB41008D +:10EB800005704078A142F8D192F82740202C03D09C +:10EB90000CEB4404637001E082F826300CEB410476 +:10EBA0002023637082F82710F0BD30B50D46CE4BA0 +:10EBB00044190022181A72EB020100D2FFDFCB4881 +:10EBC000854200DDFFDFC9484042854200DAFFDFB1 +:10EBD000C548401C844207DA002C01DB204630BDCA +:10EBE000C148401C201830BDBF48C043FAE710B5EB +:10EBF00004460168407ABE4A52F82020114450B1C0 +:10EC00000220084420F07F40F9F7FBFE94F9081039 +:10EC1000BDE81040C9E70420F3E72DE9F047B14E05 +:10EC2000803696F82D50DFF8BC9206EB850090F800 +:10EC3000264034E009EB85174FF0070817F8140059 +:10EC4000012806D004282ED005282ED0062800D072 +:10EC5000FFDF01F0E3F8014607EB4400427806EBE2 +:10EC6000850080F8262090F82720A24202D1202299 +:10EC700080F82720084601F0DCF82A4621460120CA +:10EC8000FFF72CFF9B48414600EB0410026820462A +:10EC9000904796F82D5006EB850090F82640202CE2 +:10ECA000C8D1BDE8F087022000E003208046D0E70D +:10ECB00010B58C4C2021803484F8251084F826105F +:10ECC00084F82710002084F8280084F82D0084F8A8 +:10ECD0002E10411EA16044F8100B20746074207344 +:10ECE0006073A0738449E077207508704870002134 +:10ECF0007C4A103C02F81100491CC9B22029F9D302 +:10ED00000120F9F772FD0020F9F76FFD012084F86A +:10ED10002200F4F74FF87948F4F75BF8764CA41E1C +:10ED200020707748F4F755F86070BDE81040F9F7A7 +:10ED3000E9BC10B5F9F70BFD6F4CA41E2078F4F771 +:10ED400061F86078F4F75EF8BDE8104001F09EB815 +:10ED5000202070472DE9F34F624E0025803606EBE8 +:10ED6000810A89B09AF82500202822D0691E0291D4 +:10ED70006049009501EB00108146D0E90112C0689E +:10ED80000391CDE90420B08BADF81C00B07F8DF865 +:10ED90001E009DF81500C8B10227554951F82040C2 +:10EDA0000399E219114421F07F41019184B10221BC +:10EDB0000FE00120F9F719FD0020F9F716FDF9F72A +:10EDC000E4FC01F063F886F82F50A0E00427E4E7A4 +:10EDD00000218DF81810022801D0012820D10398B5 +:10EDE000391901440998081A9DF81C1020F07F4039 +:10EDF00001B10221333181420BD203208DF815007D +:10EE00000398C4F13201401A20F07F40322403906D +:10EE10000CE096F8240018B901F0A8F900284CD0AD +:10EE2000322C03D214B101F025F801E001F02EF8E4 +:10EE3000314A107818B393465278039B121B002175 +:10EE40009DF81840984601281AD0032818D00020B1 +:10EE50008DF81E00002A04DD981A039001208DF819 +:10EE600018009DF81C0000B102210398254A20F0EB +:10EE70007F40039003AB099801F014F810B110E043 +:10EE80000120E5E79DF81D0018B99BF80000032854 +:10EE900012D08DF81C50CDF80C808DF818408DF8EC +:10EEA0001E509DF8180058B103980123C119002283 +:10EEB0001846F9F7EDFC06E000200BB0BDE8F08F36 +:10EEC0000120F9F792FC99F90C2001230020019907 +:10EED000F9F7DEFC012086F82F008AF8285020225E +:10EEE000694611E004070020FF7F841E0020A1076F +:10EEF000588401000405002082000020570501000D +:10EF00001BEC0000FFFF3F00F94808F0FDFF012067 +:10EF1000D3E72DE9F05FDFF8D883064608EB8600DB +:10EF200090F82550202D1FD0A8F180002C4600EB32 +:10EF30008617A0F50079DFF8BCB305E0A24607EB21 +:10EF40004A004478202C0AD0F9F7EEFC09EB0413B0 +:10EF50005A4601211B1D00F0A5FF0028EED0AC424F +:10EF600002D0334652461EE0E34808B1AFF30080BA +:10EF7000F9F7DAFC98F82F206AB1D8F80C20411C78 +:10EF8000891A0902CA1701EB12610912002902DD70 +:10EF90000020BDE8F09F3146FFF7DCFE08B10120FC +:10EFA000F7E733462A4620210420FFF7C5FDEFE7A7 +:10EFB0002DE9F041CE4C2569F9F7B6FC401B000263 +:10EFC000C11700EB1160001200D4FFDF94F822009B +:10EFD00000B1FFDF012784F8227094F82E0020286A +:10EFE00000D1FFDF94F82E60202084F82E00002549 +:10EFF00084F82F5084F8205084F82150BF482560B1 +:10F000000078022833D0032831D000202077A06870 +:10F01000401C05D04FF0FF30A0600120F9F7E5FB60 +:10F020000020F9F7E2FBF9F7DAFCF9F7D2FCF9F77F +:10F03000ACFB08F0A7F9B248056005604FF0E0218D +:10F040004FF40040B846C1F88002F3F721FE94F86F +:10F050002D703846FFF75DFF0028FAD0A4488038AD +:10F0600000EB871010F81600022802D006E00120FD +:10F07000CCE73A4631460620FFF730FD84F823807E +:10F0800004EB870090F82600202804D09B48801EBF +:10F090004078F3F7BDFE207F002803D0F9F78FFCFE +:10F0A0002577657746E50146914810B590F82D2003 +:10F0B0000024803800EB821010F814302BB1641C4F +:10F0C000E4B2202CF8D3202010BD8E4800EB0410B1 +:10F0D000016021460120FFF701FD204610BD10B55B +:10F0E000012801D0032800D171B3814A92F82D3054 +:10F0F0007F4C0022803C04EB831300BF13F81240C6 +:10F100000CB1082010BD521CD2B2202AF6D37B4A83 +:10F1100048B1022807D0072916D2DFE801F015060A +:10F12000080A0C0E100000210AE01B2108E03A2119 +:10F1300006E0582104E0772102E0962100E0B521A5 +:10F1400051701070002010BD072010BD6B4810B525 +:10F150004078F9F756FC80B210BD10B5202811D2C6 +:10F16000634991F82D30A1F1800202EB831414F869 +:10F1700010303BB191F82D3002EB831212F81020C1 +:10F18000012A01D0002010BD91F82D200146002059 +:10F19000FFF7A4FC012010BD10B5F9F7C5FBBDE8D1 +:10F1A0001040F9F72EBC2DE9F0410E46504F017882 +:10F1B0002025803F0C4607EB831303E0254603EB35 +:10F1C00045046478944202D0202CF7D108E0202C2A +:10F1D00006D0A14206D103EB41014978017007E056 +:10F1E0000020A7E403EB440003EB4501407848709E +:10F1F000454F7EB127B1002140F2DA30AFF30080F5 +:10F200003078A04206D127B1002140F2DD30AFF3C3 +:10F210000080357027B1002140F2E230AFF300806A +:10F22000012087E410B542680B689A1A1202D417BD +:10F2300002EB1462121216D4497A91B1427A82B961 +:10F24000324A006852F82110126819441044001D17 +:10F25000891C081A0002C11700EB11600012322845 +:10F2600001DB012010BD002010BD2DE9F0478146D3 +:10F270001F48244E00EB8100984690F8254020203E +:10F28000107006F50070154600EB81170BE000BF0B +:10F2900006EB04104946001DFFF7C4FF28B107EB39 +:10F2A00044002C704478202CF2D1297888F8001082 +:10F2B00013E000BF06EB0415291D4846FFF7B2FF17 +:10F2C00068B988F80040A97B99F80A00814201D802 +:10F2D0000020E6E407EB44004478202CEAD101202A +:10F2E000DFE42DE9FC410E4607460024054D18E0F9 +:10F2F00084070020FFFF3F00000000008200002084 +:10F3000000F50040040500200000000058840100C2 +:10F310009DF8000005EB00108168384600F0D6FD2E +:10F3200001246B4601AA31463846FFF79EFF0028AC +:10F33000EED02046BDE8FC8170B50446FF480125AB +:10F34000A54300EB841100EB8510402208F097FDE7 +:10F35000FB4E26B1002140F25C40AFF30080F7483D +:10F36000803000EB850100EB8400D0F82500C1F867 +:10F37000250026B100214FF48C60AFF300802846B1 +:10F3800070BD2DE9FC418446EC481546089C00EB15 +:10F3900085170E4617F81400012803D0022801D063 +:10F3A0000020C7E70B46E74A0121604600F07AFDDE +:10F3B000A8B101AB6A4629463046FFF756FF70B147 +:10F3C000DE489DF804209DF80010803000EB850693 +:10F3D0008A4208D02B460520FFF7AEFB0BE02A46F9 +:10F3E0002146042014E0202903D007EB4100407897 +:10F3F00001E096F8250007EB440148709DF80000F5 +:10F40000202809D007EB400044702A4621460320FB +:10F41000FFF764FB01208DE706F8254F0120F0700F +:10F42000F3E7C94901EB0010001DFFF7E0BB7CB515 +:10F430001D46134604460E4600F1080221461846B2 +:10F44000F9F7ECFA94F908000F2804DD1F38207250 +:10F450002068401C206096B10220BC4951F826105B +:10F46000461820686946801B20F07F40206094F990 +:10F4700008002844C01C1F2803DA012009E00420EA +:10F48000EBE701AAF9F7CAFA9DF8040010B1009859 +:10F49000401C00900099206831440844C01C20F0B2 +:10F4A0007F4060607CBD2DE9FE430C46064609782E +:10F4B00060799072207998461546507241B19F4804 +:10F4C000803090F82E1020290AD00069401D0BE0F2 +:10F4D000D4E90223217903B02846BDE8F043A6E72A +:10F4E0009B484178701D084420F07F472179002215 +:10F4F0002846A368FFF79BFF3946284600F0E6FC44 +:10F50000D4E9023221796846FFF791FF4146284647 +:10F51000019CFFF7E6FE2B4622460021304600F014 +:10F52000C1FC002803D13146284600F0CFFCBDE8DD +:10F53000FE832DE9FE4F814600F084FC30B10027A8 +:10F5400099F8000020B10020BDE8FE8F0127F7E701 +:10F550007A4D7B4C4FF0000A803524B1002140F2F7 +:10F56000D340AFF3008095F82D8085F823A00026C6 +:10F5700024B100214FF49B60AFF300801FB94046D7 +:10F58000FFF7DAFE804624B100214FF49C60AFF310 +:10F590000080F9F7C9F943466A464946FFF783FFF9 +:10F5A00024B1002140F2E640AFF3008095F82E0030 +:10F5B00020280CD029690098401A0002C21700EBDD +:10F5C0001260001203D5684600F080FC012624B1C9 +:10F5D00000214FF49E60AFF3008095F823000028CF +:10F5E000BBD124B1002140F2F640AFF30080F9F71F +:10F5F0009BF96B46534A002100F054FC0028A3D02D +:10F6000027B941466846FFF76CFE064326B16846B7 +:10F61000FFF7EDFAC9F8080024B1002140F20950C3 +:10F62000AFF3008001208FE72DE9FF5F8A46814616 +:10F6300000F008FC414C803410B39AF80000002719 +:10F6400010B1012800D0FFDF3D4D25B1002140F26F +:10F650007F50AFF300800120A84600905FEA0806C3 +:10F6600004D0002140F28750AFF30080009800F0F2 +:10F67000E0FB94F82D50002084F8230067B119E0D6 +:10F6800094F82E000127202800D1FFDF9AF800000F +:10F690000028D9D0FFDFD7E72846FFF74DFE054603 +:10F6A00026B1002140F29150AFF3008094F823007E +:10F6B0000028D3D126B1002140F29B50AFF3008047 +:10F6C000F9F732F983462B4601AA5146FFF7EBFEC4 +:10F6D0005FEA060804D0002140F2A250AFF3008098 +:10F6E0003B462A4601A95846CDF80090FFF749FE4F +:10F6F000064604EB850090F828B0B8F1000F04D05E +:10F70000002140F2A950AFF3008000F087FB009089 +:10F71000B8F1000F04D0002140F2AF50AFF30080E9 +:10F7200094F82300002899D1B8F1000F04D00021EB +:10F7300040F2B750AFF3008003490BE0040700200C +:10F7400000000000FFFF3F00040500205884010076 +:10F750008200002001EB09100DF1040C00F10400FF +:10F760009CE80E0080E80E004EB35FEA080604D065 +:10F77000002140F2C450AFF300803BEA070012D0F2 +:10F7800094F82E0020280ED126B1002140F2C95055 +:10F79000AFF300802846FFF7BCFB20B99AF80000C1 +:10F7A000D8B3012849D0B8F1000F04D0002140F2AD +:10F7B000E650AFF30080284600F029FB01265FEAFF +:10F7C000080504D0002140F2EF50AFF3008000980C +:10F7D00000F02FFB25B1002140F2F350AFF3008081 +:10F7E0008EB194F82D0004EB800090F826002028BC +:10F7F00009D025B1002140F2FA50AFF30080F9485A +:10F800004078F3F705FB25B1002140F2FF50AFF33C +:10F81000008004B03046BDE8F09FFFE7B8F1000F6C +:10F8200004D0002140F2D150AFF3008094F82D2095 +:10F8300049460420FFF752F9C0E7002E3FF40EAF0F +:10F84000002140F2DC50AFF3008007E72DE9F84FCC +:10F85000E54D814695F82D004FF00008E34C4FF040 +:10F86000010B474624B1002140F20D60AFF3008048 +:10F87000584600F0DEFA85F8237024B1002140F2EA +:10F880001260AFF3008095F82D00FFF755FD064696 +:10F8900095F8230028B1002CE4D000214FF4C36078 +:10F8A0004BE024B1002140F21C60AFF30080CE4851 +:10F8B000803800EB861111F81900032856D1334621 +:10F8C00005EB830A4A469AF82500904201D10120AF +:10F8D00000E0002000900AF125000021FFF763FC02 +:10F8E00001460098014203D001228AF82820AF7710 +:10F8F000E1B324B1002140F22160AFF30080324631 +:10F9000049460120FFF7EAF89AF828A024B100211F +:10F9100040F22C60AFF3008000F080FA834624B1FF +:10F92000002140F23160AFF3008095F8230038B138 +:10F93000002C97D0002140F23560AFF3008091E7B2 +:10F94000BAF1000F07D095F82E00202803D13046D9 +:10F95000FFF7DFFAE0B124B1002140F24960AFF3D4 +:10F960000080304600F053FA4FF0010824B1002126 +:10F9700040F25260AFF30080584600F05AFA24B1CA +:10F98000002140F25660AFF300804046BDE8F88F9A +:10F99000002CF1D0002140F24460AFF30080E6E794 +:10F9A0000020F8F7FBBE0120F8F7F8BE8D4800787C +:10F9B00070472DE9F0418C4C94F82E0020281FD17F +:10F9C00094F82D6004EB860797F82550202D00D180 +:10F9D000FFDF8549803901EB861000EB4500407858 +:10F9E00007F8250F0120F87084F82300294684F8D1 +:10F9F0002E50324602202234FFF770F8002020708B +:10FA00000FE42DE9F0417A4E774C012538B10128F9 +:10FA100021D0022879D003287DD0FFDFF0E700F065 +:10FA200029FAFFF7C6FF207E00B1FFDF84F82150DE +:10FA30000020F8F7DAFEA168481C04D00123002258 +:10FA40001846F8F725FF14F82E0F217806EB011160 +:10FA50000A68012154E0FFF7ACFF0120F8F7C5FE6A +:10FA600094F8210050B1A068401C07D014F82E0F64 +:10FA7000217806EB01110A68062141E0207EDFF8BB +:10FA80006481002708F10208012803D002281ED053 +:10FA9000FFDFB5E7A777F8F792FF98F80000032893 +:10FAA00001D165772577607D524951F8200094F89F +:10FAB000201051B948B161680123091A0022184683 +:10FAC000F8F7E6FE022020769AE7277698E784F892 +:10FAD000205000F0CFF9A07F50B198F80100616884 +:10FAE0000123091A00221846F8F7D2FE257600E015 +:10FAF000277614F82E0F217806EB01110A680021F1 +:10FB0000BDE8F041104700E005E036480078BDE868 +:10FB1000F041F3F77DB9FFF74CFF14F82E0F217871 +:10FB200006EB01110A680521EAE710B52E4C94F89E +:10FB30002E00202800D1FFDF14F82E0F21782C4A48 +:10FB400002EB01110A68BDE81040042110477CB5A2 +:10FB5000254C054694F82E00202800D1FFDFA06830 +:10FB6000401C00D0FFDF94F82E00214901AA01EBD0 +:10FB70000010694690F90C002844F8F74FFF9DF9F2 +:10FB800004000F2801DD012000E000200099084456 +:10FB90006168084420F07F41A16094F821000028AA +:10FBA00007D002B00123BDE8704000221846F8F7E4 +:10FBB0006FBE7CBD30B5104A0B1A541CB3EB940FCA +:10FBC0001ED3451AB5EB940F1AD3934203D9101ADA +:10FBD00043185B1C14E0954210D9511A0844401C8C +:10FBE00043420DE080000020840700200000000058 +:10FBF0000405002058840100FF7F841EFFDF0023DE +:10FC0000184630BD0123002201460220F8F740BE0D +:10FC10000220F8F7EABDF8F787BE2DE9FC47B14CA2 +:10FC2000054694F82E00202800D1FFDF642D58D31C +:10FC3000AD4A0021521B71EB010052D394F82E20E3 +:10FC4000A0462046DFF8A49290F82D7009EB02142C +:10FC5000D8F8000001AA28446946F8F7DFFE9DF9AC +:10FC60000400002802DD0098401C0090A068009964 +:10FC700062684618B21A22F07F42B2F5800F30D285 +:10FC800008EB8702444692F82520202A0AD009EB87 +:10FC900002125268101A0002C21700EB1260001222 +:10FCA00088421EDBA068401C10D0F8F73DFEA1681A +:10FCB000081A0002C11700EB11600012022810DDC3 +:10FCC0000120F8F792FD4FF0FF30A0602068284433 +:10FCD000206026F07F402061012084F82300BDE8E9 +:10FCE000FC870020FBE72DE9F0477E4C074694F89F +:10FCF0002D00A4F1800606EB801010F8170000B963 +:10FD0000FFDF94F82D50A046794C24B1002140F635 +:10FD10006500AFF3008040F6710940F67A0A06EB01 +:10FD2000851600BF16F81700012818D0042810D037 +:10FD300005280ED006280CD01CB100214846AFF390 +:10FD4000008020BF002CEDD000215046AFF3008092 +:10FD5000E8E72A4639460120FEF7C0FEF2E74FF0F9 +:10FD6000010A4FF00009454624B1002140F6810008 +:10FD7000AFF30080504600F05CF885F8239024B182 +:10FD8000002140F68600AFF3008095F82D00FFF7C4 +:10FD9000D3FA064695F8230028B1002CE4D00021C0 +:10FDA00040F68C001FE024B100214FF40960AFF34E +:10FDB000008005EB860000F1270133463A462630E5 +:10FDC000FFF7F1F924B1002140F69400AFF3008071 +:10FDD00000F024F8824695F8230038B1002CC3D0F7 +:10FDE000002140F69A00AFF30080BDE785F82D6052 +:10FDF000012085F82300504600F01BF8002C04D0A9 +:10FE0000002140F6A700AFF30080BDE8F087354938 +:10FE100081F82D00012081F82300704710B5354886 +:10FE200008B1AFF30080EFF3108000F0010072B66C +:10FE300010BD10B5002804D12F4808B1AFF30080E1 +:10FE400062B610BD2D480068C005C00D10D0103836 +:10FE500040B2002806DA00F00F0000F1E02090F830 +:10FE6000140D03E000F1E02090F800044009704711 +:10FE70000820704710B51B4C94F82400002804D1CA +:10FE8000F8F72EFE012084F8240010BD10B5154CA3 +:10FE900094F82400002804D0F8F74BFE002084F8E2 +:10FEA000240010BD10B51C685B68241A181A24F0D1 +:10FEB0007F4420F07F40A14206D8B4F5800F03D2E2 +:10FEC000904201D8012010BD002010BDD0E90032C1 +:10FED000D21A21F07F43114421F07F41C0E9003163 +:10FEE0007047000084070020FF1FA10704050020C1 +:10FEF00000000000000000000000000004ED00E031 +:10FF00002DE9F041044680074FF000054FF001064F +:10FF100004D55C480560066024F00204E0044FF05C +:10FF2000FF3705D558484660C0F8087324F480545C +:10FF3000600003D55548056024F08044E0050FD5E6 +:10FF40005348C0F80052C0F8087352490D60091DAB +:10FF50000D60504A04210C321160066124F4807453 +:10FF6000A00409D54C484660C0F80052C0F8087398 +:10FF70004A48056024F40054C4F38030C4F3C0310F +:10FF8000884200D0FFDF14F4404F14D0444846604C +:10FF9000C0F8087343488660C0F80052C0F8087380 +:10FFA00041490D600A1D16608660C0F808730D6037 +:10FFB000166024F4404420050AD53C48466086601B +:10FFC000C0F80873C0F848733948056024F4006429 +:10FFD00007F0B2F93748044200D0FFDFBDE8F081F6 +:10FFE00070B520250022134620FA02F1C90719D066 +:10FFF00051B201F01F060124B4404E09B60006F1CB +:020000040001F9 +:10000000E026C6F88041C6F88042002906DA01F0F1 +:100010000F0101F1E02181F8143D03E001F1E0213D +:1000200081F80034521CAA42DED370BD70B5224C58 +:100030000D462060FFF764FF2068FFF7D1FF2846D8 +:10004000F8F72BFE06F0EEFD00F0DDF807F074F98E +:1000500007F0BFF8F2F7AEFEBDE8704006F090BEC4 +:1000600010B5154C2068FFF74BFF2068FFF7B8FF6D +:1000700007F062F9F8F7A4FE0020206010BD0A2006 +:1000800070470000FC1F004000C0004004E5014034 +:10009000008000400485004000D0004004D50040AE +:1000A00000E0004000F0004000F5004000B00040DB +:1000B00008B50040FEFF0FFD8400002070B5264902 +:1000C0000A680AB30022154601244B685B1C4B608A +:1000D000092B00D34D600E7904FA06F30E681E4218 +:1000E0000FD0EFF3108212F0010272B600D001229D +:1000F0000C689C430C6002B962B64968016000203C +:1001000070BD521C092AE0D3052070BD4FF0E021DC +:100110004FF48000C1F800027047EFF3108111F036 +:10012000010F72B64FF0010202FA00F20A480368AA +:1001300042EA0302026000D162B6E7E70648002106 +:100140000160416070470121814003480068084018 +:1001500000D00120704700008800002001208107A6 +:1001600008607047012081074860704712480068A6 +:10017000C00700D0012070470F48001F0068C0076B +:1001800000D0012070470C4808300068C00700D03C +:1001900001207047084810300068704706490C314C +:1001A0000A68D20306D5096801F00301814201D132 +:1001B00001207047002070470C0400402DE9F041F9 +:1001C00015460E460446002700F0E7F8A84215D36E +:1001D000002341200FE000BF94F84220A25CF254BB +:1001E00094F84210491CB1FBF0F200FB12115B1CA9 +:1001F00084F84210DBB2AB42EED3012700F0D9F80D +:100200003846BDE8F081704910B5802081F80004BF +:100210006E49002081F8420081F84100433181F8A5 +:10022000420081F84100433181F8420081F84100E9 +:10023000674806F017FF6648401C06F013FFF2F708 +:1002400033FDBDE8104000F0B4B8402070475F486F +:1002500000F0A3B80A4601465C48AFE7402070476B +:100260005A48433000F099B80A460146574843308F +:10027000A4E7402101700020704710B504465348A0 +:10028000863000F08AF82070002010BD0A46014632 +:100290004E4810B58630FFF791FF08B1002010BD21 +:1002A00042F2070010BD70B50C460546412900D941 +:1002B000FFDF48480068103840B200F050F8C6B27E +:1002C0000D2000F04CF8C0B2864203D2FFDF01E0FF +:1002D000F2F732FD224629463C48FFF76FFF00281F +:1002E000F6D070BD2DE9F041394F002506463F1D7F +:1002F00057F82540204600F041F810B36D1CEDB2D0 +:10030000032DF5D33148433000F038F8002825D0CC +:100310002E4800F033F8002820D02C48863000F01A +:100320002DF800281AD0F2F7E5FC294806F0A2FEC5 +:10033000B0F5005F00D0FFDFBDE8F041244806F0D3 +:10034000AFBE94F841004121265414F8410F401CDF +:10035000B0FBF1F201FB12002070D3E751E7002857 +:1003600006DA00F00F0000F1E02090F8140D03E031 +:1003700000F1E02090F800044009704710F8411F98 +:100380004122491CB1FBF2F302FB13114078814278 +:1003900001D1012070470020704710F8411F4078BC +:1003A000814201D3081A02E0C0F141000844C0B202 +:1003B000704710B5064806F05DFE002803D1BDE881 +:1003C0001040F2F782BC10BD0DE000E0B407002041 +:1003D0009000002004ED00E02DE9F0410125280304 +:1003E0004FF0E0210026C1F880011E4CC4F80061E6 +:1003F0000C2000F02CF81C4801680268C94341F346 +:10040000001142F010020260C4F804532560491C38 +:1004100000E020BFD4F80021002AFAD019B9016801 +:1004200021F010010160114807686560C4F80853A5 +:10043000C4F800610C2000F00AF83846BDE8F081ED +:1004400010B50446FFF7C8FF2060002010BD00F083 +:100450001F02012191404009800000F1E020C0F816 +:100460008012704700C0004010ED00E008C5004059 +:100470002DE9F047FF4C0646FF21A06800EB06126D +:1004800011702178FF2910D04FF0080909EB0111F4 +:1004900009EB06174158C05900F0F4F9002807DDB0 +:1004A000A168207801EB061108702670BDE8F0877E +:1004B00094F8008045460DE0A06809EB051141580D +:1004C000C05900F0DFF9002806DCA068A84600EB60 +:1004D00008100578FF2DEFD1A06800EB061100EBA6 +:1004E00008100D700670E1E7F0B5E24B04460020FD +:1004F00001259A680C269B780CE000BF05EB0017DD +:10050000D75DA74204D106EB0017D7598F4204D01C +:10051000401CC0B28342F1D8FF20F0BD70B5FFF798 +:100520007AFBD44C08252278A16805EB0212895881 +:1005300000F0A8F9012808DD2178A06805EB011179 +:100540004058BDE87040FFF75DBBFFF72FFABDE8EC +:100550007040F2F75DBC2DE9F041C64C2578FFF7FD +:100560005AFBFF2D6ED04FF00808A26808EB051665 +:10057000915900F087F90228A06801DD80595DE0FB +:1005800000EB051109782170022101EB0511425C95 +:100590005AB1521E4254815901F5800121F07F4128 +:1005A00081512846FFF764FF34E00423012203EB66 +:1005B000051302EB051250F803C0875CBCF1000F75 +:1005C00010D0BCF5007F10D9CCF3080250F806C05B +:1005D0000CEB423C2CF07F4C40F806C0C3589A1AF2 +:1005E000520A09E0FF2181540AE0825902EB4C32A1 +:1005F00022F07F428251002242542846FFF738FF02 +:100600000C21A06801EB05114158E06850F8272043 +:10061000384690472078FF2814D0FFF7FCFA22785C +:10062000A16808EB02124546895800F02BF9012811 +:1006300093DD2178A06805EB01114058BDE8F04139 +:10064000FFF7E0BABDE8F081F0B51D4614460E464E +:100650000746FF2B00D3FFDFA00700D0FFDF854850 +:10066000FF210022C0E90247C57006710170427087 +:1006700082701046012204E002EB0013401CE1549A +:10068000C0B2A842F8D3F0BD70B57A4C0646657882 +:100690002079854200D3FFDFE06840F8256060786C +:1006A000401C6070284670BD2DE9FF5F1D468B46DB +:1006B0000746FF24FFF7AFFADFF8B891064699F82E +:1006C0000100B84200D8FFDF00214FF001084FF0D1 +:1006D0000C0A99F80220D9F808000EE008EB011383 +:1006E000C35CFF2B0ED0BB4205D10AEB011350F8BF +:1006F00003C0DC450CD0491CC9B28A42EED8FF2C9D +:1007000002D00DE00C46F6E799F803108A4203D1B7 +:10071000FF2004B0BDE8F09F1446521C89F8022067 +:1007200008EB04110AEB0412475440F802B004210C +:10073000029B0022012B01EB04110CD040F8012098 +:100740004FF4007808234FF0020C454513D9E90512 +:10075000C90D02D002E04550F2E7414606EB4132B6 +:1007600003EB041322F07F42C250691A0CEB04120F +:10077000490A81540BE005B9012506EB453103EB2D +:10078000041321F07F41C1500CEB0411425499F83D +:1007900000502046FFF76CFE99F80000A84201D0F7 +:1007A000FFF7BCFE3846B4E770B50C460546FFF7C8 +:1007B00032FA064621462846FFF796FE0446FF28F1 +:1007C0001AD02C4D082101EB0411A868415830467D +:1007D00000F058F800F58050C11700EBD1404013ED +:1007E0000221AA6801EB0411515C09B100EB412020 +:1007F000002800DC012070BD002070BD2DE9F0470D +:1008000088468146FFF770FE0746FF281BD0194D2A +:100810002E78A8683146344605E0BC4206D026460C +:1008200000EB06121478FF2CF7D10CE0FF2C0AD055 +:10083000A6420CD100EB011000782870FF2804D0EC +:10084000FFF76CFE03E0002030E6FFF7E1F94146D8 +:100850004846FFF7A9FF0123A968024603EB0413EA +:10086000FF20C854A878401EB84200D1A87001EB00 +:10087000041001E08008002001EB061100780870E8 +:10088000104613E6081A0002C11700EB11600012AF +:100890007047000070B50446A0F500002D4EB0F181 +:1008A000786F02D23444A4F500042B48844201D26C +:1008B000012500E0002500F043F848B125B9B44215 +:1008C00004D32648006808E0012070BD002070BDF8 +:1008D000002DF9D1B442F9D321488442F6D2F3E78E +:1008E00010B50446A0F50000B0F1786F03D21948A6 +:1008F0000444A4F5000400F023F84FF0804130B127 +:100900001648006804E08C4204D2012003E0144839 +:100910008442F8D2002080F0010010BD10B520B153 +:10092000FFF7DEFF08B1012010BD002010BD10B59B +:1009300020B1FFF7AFFF08B1012010BD002010BDAE +:10094000084809490068884201D101207047002009 +:1009500070470000000000200090010020000020EF +:1009600008000020A4000020BEBAFECA0348044AC2 +:100970000168914201D1002101607047A40000206C +:10098000BEBAFECA45480021017041701021817035 +:10099000704770B5054616460C460220F2F739F945 +:1009A0003E490120F61E08703D4806603C48083864 +:1009B0000560001F046070BD10B50220F2F729F930 +:1009C00036490120087000F051F836494FF4000014 +:1009D000086010BD10B5314C207888B131494FF412 +:1009E0000000091D086000F04AF8002120B1012034 +:1009F00060702D48006801E061701020A0702170C7 +:100A0000BDE810400020F2F704B9244810B5017881 +:100A100059B12648D0F8000128B100F030F800287C +:100A200000D0012010BD022010BD407810BD10B5CF +:100A3000C824641EE4B2FFF7E8FF022803D00128AF +:100A400000D0002010BD002CF3D1FFDFF9E71348E0 +:100A500010B5017841B100F012F818B112480068E1 +:100A6000C0B210BD102010BD807810BD0F4800210D +:100A7000C0F80011C0F80411C0F8081170470B4805 +:100A8000D0F8001129B1D0F8041111B1D0F8080143 +:100A900008B100207047012070470000A800002026 +:100AA00010F5004004F5014000F4004000F0004063 +:100AB0004548002101704170704770B506461446E4 +:100AC0000D460120F2F7A5F840480660001D0460BD +:100AD000001D056070BD70B53B4B012540EA024228 +:100AE0001D703A4B1B1F1A60384A10321160384C87 +:100AF0000026C4F80461374A4FF04071116058B1C4 +:100B0000012800D0FFDFC4F80062256031494FF0B2 +:100B10000070091F086070BDC4F80052256070BDE8 +:100B20002948017871B12B4A4FF040711160284972 +:100B3000D1F8042100211AB1274A1268427000E05E +:100B4000417001700020F2F764B81F48017841B18C +:100B50001F48D0F80401002802D01F480068C0B226 +:100B600070474078704770B5002827D01648007845 +:100B700000B9FFDF1648D0F8041100291ED1022366 +:100B8000C0F8043315490A680C68D24342F30012D6 +:100B900044F010040C609C034FF0E025521C02E06E +:100BA000C5F8804220BFD0F80461002EF8D01AB9F1 +:100BB0000A6822F010020A60C0F8083370BD0449C8 +:100BC0000120886070470000AB00002008F500405D +:100BD00000F0004008F5014000F4004010ED00E096 +:100BE000FA4808B50021C0F80011C0F80C11C0F88F +:100BF0001011C0F80411C0F81411C0F81811F4480D +:100C00000068009008BD70B5F24D00246C702C7027 +:100C100000F02FFD85F82140AC62092105F1140098 +:100C20006C6307F0CDF9EC49601E0860091D08608F +:100C3000091D0C60091D0860091D0C60091D086074 +:100C4000091D0860091D0860091D0860091D08606C +:100C5000091D0860091D0860091D0860091D08605C +:100C600070BDDE4800B5016801F00F01032905D011 +:100C7000006800F00F00042802D0FFDF012000BD53 +:100C8000022000BD70B5D3490268D54C4A61426864 +:100C90008A61007A08770C3C0A7DD14B251F012020 +:100CA00042B10E7E00FA06F21A608E7D0EB122600D +:100CB00000E02A604A7D002A05D04A7E90401860F4 +:100CC000C97D09B1206070BD286070BD00F0D8BC3E +:100CD00010B500F0D5FCBD48D0F80001002800D0C8 +:100CE000FFDF10BD10B5012000F0ADFCBD480024B1 +:100CF000046001210160B94A40F25B602832106053 +:100D0000121F40F203101060101F0160B34903204E +:100D10000860B249962034310860B449B24808608E +:100D2000B249B3489C310860A9480838091F0860D7 +:100D3000012000F093FCA5491020C1F80403A54848 +:100D400080F82D4010BDA34A0368C2F802308088A5 +:100D5000D080117270479F4890F8210070479D4ADB +:100D6000517010707047F0B50546840097488B8825 +:100D70002044C0F820360B78D1F8011043EA012155 +:100D8000C0F8001605F1080001279A4C07FA00F692 +:100D900052B1012A00D0FFDF206830432060206874 +:100DA000AF4038432060F0BD2068B043F6E706F05E +:100DB000FBBB884890F82E007047884AC1781432EF +:100DC00011600068854900020C31086070472528D1 +:100DD00007D0262807D0272807D00A2807D80422BA +:100DE00006E0022107E01A2105E0502103E0062277 +:100DF00002EB4001C9B2794A083A1160774944319F +:100E0000086070477348817A012915D0022912D1F0 +:100E1000417D00290FD0827E0121C37E01FA02F2BA +:100E200099400A4371490A60007F734A002102EB2E +:100E30008000C0F810157047017DEAE72DE9F04702 +:100E400082466448847A012C10D0022C7DD1437DE7 +:100E5000002B7AD0694BDFF8A8914FF47A77012CF8 +:100E600006D0467EC47D7CB3012535E0037DEFE7E7 +:100E7000067E847D0CB1012500E000254FF4C86496 +:100E800040F6980C40F6E44801290ED0022A1CD006 +:100E9000012A03D0042A1BD05A4B4446191901F5E4 +:100EA000FA7100BFB1FBF7F123E0022A08D0012A52 +:100EB00002D0042A06D0444649F6FC612144F1E7F9 +:100EC0003C46F9E76446F7E705E04F4B3C46E5E76B +:100ED0004B466446E2E70025012940D0022A40D073 +:100EE000012A02D0042A3FD0484B03F2E143B3FB6E +:100EF000F7F1474A491F514411603D4A0021403AE9 +:100F0000C2F84C11310285F0010241EA025141F070 +:100F10000313027F384901EB8204C4F81035847E44 +:100F20003C4D01EB820305EBC401C1F814353A4A8C +:100F3000C1F81025C27E05EBC200C0F81435244963 +:100F40000839C0F81015012000E006E000FA04F1AD +:100F5000904001432548001F0160BDE8F08729212A +:100F6000C7E7294B643BC0E74B46BEE72DE9F0419C +:100F70000F461649054603201646C1F800021B4CD1 +:100F80002648241F2060384606F046FB304606F00F +:100F900035FB104815B1012D09D011E001218172F6 +:100FA000416B41F4801141634FF4801007E002214E +:100FB0008172416B41F4001141634FF400102060D5 +:100FC00032463946BDE8F041002037E700100040C6 +:100FD0001811004090080020000E0040101500403D +:100FE00018050050FC1F004000000C0408F50140EB +:100FF000408000404016004000600040A2240200F3 +:10100000D0FB010030D3010068360200C0D40100DB +:101010004C85004000F001404C8100400000040479 +:1010200008B5FF208DF80000F8480021C0F8101125 +:101030000121016105E000BF9DF80010491E8DF8F7 +:1010400000109DF8001019B1D0F810110029F3D04C +:101050009DF80000002800D1FFDF08BD2DE9FF5FEB +:10106000EA4E0746002503209B468946C6F8000243 +:10107000DFF8A083E649C8F80010029806F0CCFA21 +:10108000584606F0BBFAE348E34CA8304FF0010A9B +:1010900017B1012F1DD02EE0066094F82D00012815 +:1010A00005D002280BD0FFDF84F80AA023E094F8D3 +:1010B0002C205B464846029906F02CFB06E094F88B +:1010C0002C305A464846029906F0B3FAA16A4518F0 +:1010D000EAE7CE49091D016094F82D0094F82C2010 +:1010E000012802995B4648463BD006F05CFBA16AAA +:1010F00045180220A072C9480560C649C848A431F5 +:101100000860606B40F400206063D6F80072102421 +:10111000C6F808430020C6F80002BE494FF48029F3 +:10112000091DC1F8009006F50076FFF779FFFFF77B +:1011300057FD3760C8F80090C6F80441E103C8F8CD +:101140000010B849C1F84CA0B448001D0068A8427E +:1011500000D3FFDF029904B05A462846BDE8F05F8D +:101160006CE606F0A3FAC2E72DE9F041A74CD4F8EB +:10117000000220F00B06D4F804031027C0F300157A +:10118000C4F808734FF00008C4F80082A149A648CB +:10119000091D086004F50074FFF734FEFFF740FFF7 +:1011A00044F8F08C00F065FA2660A4F50074002D78 +:1011B00001D0C4F80473BDE8F08100689B4920F0B9 +:1011C0007F400860704710B5012000F03CFABDE890 +:1011D0001040012000F042BA4FF0E0210220C1F897 +:1011E000000170479249087070479049383908608B +:1011F000704770B5884D0446A86AA04200D3FFDF4F +:1012000001202873874900202C61C1F844018348DC +:10121000001F0460BDE8704000F048BA70B57E4C15 +:10122000064602200D462073FFF71BFD024694F888 +:101230002D0094F82C1001280ED0304606F00BFB40 +:10124000784920610020C1F844012169A06A08445E +:101250007249091F086070BD2B46304606F0CBFA74 +:10126000EEE76C494FF48000091D08606A48416B45 +:1012700021F4800141630021017370476E4A10B56B +:1012800002EBC0026B4BC2F81035C2F814150121F5 +:101290008140604801606048426B0A43426310BD70 +:1012A000604801214160C1600021C0F844115B48E1 +:1012B000001F01605848816270475C492431086012 +:1012C0005248D0F8001241F04001C0F800127047B7 +:1012D0004E48D0F8001221F04001C0F800125349E6 +:1012E00000202431086070474848D0F8001221F0EF +:1012F0001001C0F8001201218161704743480021AC +:10130000C0F81C11D0F8001241F01001C0F8001212 +:1013100070473E4908B5D1F81C21012A01D00020B0 +:1013200008BD424A0C32126802F07F02524202703B +:101330000020C1F81C013F481830006800900120CF +:1013400008BD30B50C00054600D1FFDFE00702D034 +:10135000012C00D0FFDF55B102212F480129417235 +:10136000C4722A4805D0022908D0FFDF30BD012110 +:10137000F3E7D0F8001241F0040103E0D0F80012C6 +:1013800041F00801C0F8001230BD70B5224C1F4B6F +:101390002246E17A527A8D074FF0010603D5850780 +:1013A00001D5450713D4CD0605D594F82F5015B1B6 +:1013B00094F831505DB10D0702D594F8205035B93D +:1013C000490702D594F8211009B1C00703D082B1B2 +:1013D000BDE87040C8E662B10025012A2ED0022A7D +:1013E0003CD0FFDFA06A01222844BDE87040002104 +:1013F00024E508490648091D0860D3F8000220F0DA +:101400000300C3F80002E67270BD00000010004047 +:101410000000040404F501409008002048850040C5 +:10142000488100400080004000000C043C15004052 +:10143000AD0000200411004000F00140D3F800028C +:1014400020F00400C3F8000200F013F90123A67293 +:101450001A460021962006F0ECF80FE0D3F80002BF +:1014600020F00800C3F8000200F003F90220A07287 +:1014700001231A460021962006F018F90546B1E727 +:101480002DE9F047BF4F3878042800D3FFDFDFF89D +:10149000F8A2DAF84C0108B1FFF7B4FCBB4CBC4928 +:1014A000606B08600026666300F00BF9DFF8E482E9 +:1014B0000546D8F800006062A8F104000068A06248 +:1014C000FFF7CFFB84F82C00A07ADFF8CC9284F8E9 +:1014D0002D00022808D1607830B1D9F800100978C1 +:1014E0000140207888430ED084F82060A80706D5F4 +:1014F0003978AA4A4908606A52F821108847E807F3 +:1015000005D000210AE0012084F82000EEE7A807BA +:1015100001D5012102E0280707D502219F4A3B7827 +:101520004832A06A52F8232090473878C0071DD16E +:10153000D9F800104846097801F00F01072913D2A5 +:1015400001680622A01C093106F06DFC40B9217A21 +:10155000D9F800000078B1EBD01F01D1012000E0E4 +:10156000002084F8210001E084F821602846FFF77C +:101570000CFFE80702D08948083014E0A80709D515 +:1015800086483978183050F8211045F38000401C07 +:1015900088470EE0280702D58048283003E0E80697 +:1015A00006D57E483830397850F82100804700E071 +:1015B000FFDFA07A022819D1207B002816D0CAF8B4 +:1015C000446102280ED0012800D0FFDFA16A206903 +:1015D000884200D8FFDF2169C8F80010BDE8F04755 +:1015E00000F064B82169A06A0144F5E7B5E400B5EC +:1015F000012802D0022802D0FFDF282000BD1820D9 +:1016000000BD10B541F6A474012802D0022802D012 +:10161000FFDF204610BD41F2883010BD10B541F209 +:10162000D474012802D0022802D0FFDF204610BD6A +:1016300041F2040010BD00B5012802D0022800D0FC +:10164000FFDF002000BD00F01F0201219140400992 +:10165000800000F1E020C0F88011704700F01F0208 +:10166000012191404009800000F1E020C0F8801283 +:10167000704746480021417281720121C172704752 +:1016800030B500240546012902D002290BD0FFDF26 +:1016900043480443404810300460424805433E48F4 +:1016A0001430056030BD4FF08074F1E73748416B6E +:1016B00041F48001416336494FF48000091F0860FE +:1016C0007047F8B5314C304E0020217B19B1D6F867 +:1016D0004411012907D00023A27A3349012A04D0FA +:1016E000022A0AD019E00123F6E7D1F80C010128FB +:1016F00001D0002011E008200FE0D1F80C010128F2 +:1017000006D0002229480068012803D0042002E006 +:101710000222F7E7002010431843D1F81021012AD4 +:101720002ED0002505432248026812F0FF0F03D097 +:10173000D1F81421012A00D0002284F82E2000685C +:1017400010F0FF0F03D0D1F81801012800D00020BD +:1017500084F82F0015481030006884F83000FFF737 +:1017600054F9012800D0002084F83100FFF738FA3E +:101770000020C6F844010F48006800902846F8BDD4 +:101780001025CFE7AD000020008000409008002029 +:1017900008F50140448500400415004070840100B4 +:1017A0000801100000000302001000400014004077 +:1017B000401600404481004010B54348222106F005 +:1017C000DDFB41480024017821F010010170012166 +:1017D00005F00FF93C494FF6FF70263981F8224099 +:1017E00088843A490880488010BDE5E7704700F0DA +:1017F0005FB8354901607047344908807047324905 +:1018000026398A8CA2F57F43FF3B02D0002101607C +:1018100008E091F822202C492639012A02D00160E3 +:1018200001207047002070472748263810F8221FF3 +:10183000012908D001210170244823492639008854 +:1018400088840120704700207047204948807047F5 +:101850001D491E4B26398A8C5B889A4205D191F826 +:10186000222012B101600120704700207047164805 +:10187000164A2638818C5288914209D14FF6FF7161 +:10188000818410F8221F19B10021017001207047D6 +:10189000002070470C480D4A2638818C52889142AE +:1018A00004D190F8220008B1002070470120704751 +:1018B000054926398A8C824205D1002081F8220010 +:1018C0004FF6FF7088847047EE080020AE000020BD +:1018D00070473C4A012338B1012804D113700868CD +:1018E000906088889081704753700868C2F8020041 +:1018F0008888D0807047334A10B1012807D00EE0A5 +:10190000507860B1D2F802000860D08804E0107806 +:1019100028B1906808609089888001207047002075 +:101920007047284910B1012802D005E0487800E04E +:10193000087808B1012070470020704730B50C4688 +:1019400005468DB04FF0030104F1030012B1FEF71C +:101950008BFC01E0FEF7A7FC60790D2120F0C000B0 +:1019600040F04000607104A806F02AFBE0788DF892 +:101970001F0020798DF81E0060798DF81D0010225F +:101980002946684606F07BFA684605F0E5F99DF8B9 +:101990002F0020709DF82E0060709DF82D00A07023 +:1019A0000DB030BD10B5002904464FF0060102D03D +:1019B000FEF75AFC01E0FEF776FC607920F0C000EB +:1019C000607110BDB2000020FE4A137882F8EF303B +:1019D000A2F8F00082F8EE10012082F8EC0092F8F4 +:1019E000C00008B192F8BC0082F8F200704770B5F0 +:1019F000F54E0446316891F8FA00002501280DD013 +:101A000091F8F400012818D091F8CA0001281ED0DE +:101A100091F8EC00012838D0002070BD65701720C7 +:101A2000207051F8FB0FC4F802004868C4F80600A3 +:101A3000087AA07201F8015C32E065700520207020 +:101A4000D1F8F600C4F8020081F8F45028E065707F +:101A5000112020702022A01CCC3106F010FA0121A8 +:101A6000A171306880F8CA50D648B0F8CE20A0F8EE +:101A7000F6207268537B80F8F83080F8F4101088F4 +:101A8000FBF78CFBFBF751F80AE065701320207020 +:101A900051F8EE0FC4F802008888E08001F8025C7B +:101AA000012070BDC848006890F8CA1011B1B0F8A4 +:101AB000CE0070474FF6FF70704770B5C24C20687B +:101AC00000B9FFDF2068417811B10C25284670BDB0 +:101AD00000254FF4827106F073FA2168FF20087028 +:101AE0007F2081F8360013204884282081F8C80020 +:101AF000012081F8B800002081F8BB00FFF7E8FB67 +:101B0000FEF768FFB14804F0E1FEB048283004F069 +:101B1000DDFEAE48503004F0D9FED7E710B5AA4C30 +:101B2000206800B9FFDF216800204870FFF7C5FF7B +:101B3000002800D0FFDF10BDA34909680978814261 +:101B400001D101207047002070479F4800B501680F +:101B500091F82400498CC0F38002C0F340031A447A +:101B600000F001001044132915D004DC102909D01D +:101B7000122904D10FE0152908D01D2904D0FFDF58 +:101B8000002000BD924903E0924800BD9049083111 +:101B900031F8100000BD8E490839F9E78A4840F253 +:101BA00071210068806A484370478748006890F850 +:101BB0003500002800D00120704710B5814C207BF3 +:101BC00000F024FE40B1207D04F1150104F04BFA31 +:101BD000082801D0012010BD207B30B1022804D09C +:101BE0000120BDE81040FFF79CBE0020F9E77649D0 +:101BF000096881F83000704770B50546714890F863 +:101C00002D0004F045FA040018D0102104F031FC36 +:101C1000002813D16C4E01202A463168C876204630 +:101C20001C31FFF78BFE316868481C3104F07BFEE5 +:101C3000BDE870400121654804F084BE70BD2DE907 +:101C4000F041604C074694F82D0004F017FA064660 +:101C500094F82F0004F10E0528B126B1102130466A +:101C600004F007FCA0B194F83000002824D094F8C8 +:101C70002E00002820D0607B294600F0D8FDA8B1B6 +:101C800004F0ABFA3A462946BDE8F041FFF756BEEC +:101C9000012060733A4629463046FFF74FFE94F81C +:101CA0002D102846BDE8F04104F081BA3946284697 +:101CB000BDE8F041FFF776BEBDE8F08170B5424C5B +:101CC0002168087BB0B1022814D0012048730E317E +:101CD000FFF711FE2068007B00F098FD216881F875 +:101CE0002F00082081F82D00487B0E3100F096FD72 +:101CF00040B901E00020E9E72168487B0E3100F09F +:101D000096FD00B10120216881F82E0091F82F0086 +:101D100018B991F82200400706D5087D153104F066 +:101D2000A2F9216881F82D00206800254560FDF7A3 +:101D300033FA216888600020FFF781FF2068C576AC +:101D400090F82200400703D5BDE87040002053E71B +:101D500070BD78B51B4904461B4D407B08732A684B +:101D6000207810706088ADF8000080B200F00101AA +:101D7000C0F3400341EA4301C0F3800341EA830119 +:101D8000C0F3C00341EAC301C0F3001341EA0311E9 +:101D9000C0F3401341EA4311C0F3801041EA8010C0 +:101DA0005084E07D012830D0022830D0FFDF286841 +:101DB00080F8BA60217B80F82410418C1D2928D03E +:101DC000616809E010090020C0000020140A00200A +:101DD000D8840100F18913008162617D80F835109B +:101DE000A17BC1B1022916D00121017554F80F1F42 +:101DF000C0F81510A188A0F81910217B012900D086 +:101E0000002180F83410002078BD0126CFE702269B +:101E1000CDE70021D5E70021E7E7FE48006890F80C +:101E20002200400701D50020704701207047F94A81 +:101E300010B512680023C2F8BC30548C1D2C0BD096 +:101E400079B1936A40F2712463431944491EB1FB8E +:101E5000F3F1C2F8C41006E0C2F8C43082F8C03012 +:101E600010BDC2F8C43082F8C00010BD0346E94876 +:101E700010B50168D1F8C4204AB1D1F8BC4034B1E2 +:101E80009A4206D90124D01AC1F8C4000EE00124F8 +:101E90000CE091F822100024C90703D040684321C8 +:101EA000008801E043210020FFF78EFD204610BD91 +:101EB000D848006890F8B70008B1002070470120AA +:101EC000704770B51F2801D2044600E01F24D14D91 +:101ED0000022286880F8B9202246783005F0CFFF2C +:101EE0002868012180F8974080F8B91070BD10B5BE +:101EF0001F2800D31F20C74CC2B20023206880F8DF +:101F0000B83080F8B720983005F0B9FF216801207B +:101F100081F8B80010BDBF49096881F8BB0070475F +:101F2000BC48006890F8220000F001007047B948F2 +:101F3000006890F82200C0F340007047002070470E +:101F4000B448006890F82200C0F3C0007047012038 +:101F50007047012070470120704770B500F085FC84 +:101F6000AC4C206850F8BC1F491C016010F8890C6B +:101F7000002530B1FFF7ACF9FEF72CFD206880F8A2 +:101F800033502068457090F8C01089B1D0F8BC205B +:101F900091420DD8022001F09DFA206890F82200AD +:101FA000C00703D060684321008816E043211BE08E +:101FB000D0F8C41019B1D0F8BC20914202D990F8E1 +:101FC0003700A8B1022001F085FA206890F82200BD +:101FD000C00708D060683C210088FFF7F5FCBDE829 +:101FE000704000F038BC3C21BDE870400020EBE4BC +:101FF000BDE87040002001F06DBA10B501280DD089 +:1020000002280DD004280FD0FFDF8248006890F826 +:10201000BA10BDE810402520FEF758BE252000E08C +:102020002620FEF7D4FEF0E72720FAE7024600203C +:10203000D30701D0CB0705D0930705D58B0703D471 +:1020400002207047012070475207FCD54907FAD497 +:10205000042070472DE9F0416E4C206800B9FFDF85 +:1020600020684178B1BB0178FF2934D0002580F881 +:102070003150857080F837502846FFF7B3F8FEF7E7 +:1020800031FE206890F9BB00FEF791FE6248FEF732 +:1020900094FE6148C01EFFF790F82068002190F878 +:1020A0002400FFF7C3FFFFF7A8FF206880F82C503B +:1020B000FFF792F82068002190F8BA200846FEF752 +:1020C00055FF0F210520FEF74AFE206890F82E10DC +:1020D00051B902E0FFE70C20EEE590F82F1019B996 +:1020E00090F8220040072AD5FDF756F806462068EA +:1020F00031468068FDF75EFD484990FBF1F701FB32 +:10210000170041423046FCF750FD014620688160CF +:1021100041683944416003F0A2FF014620684268EB +:1021200091420CD8C0E901560120FFF788FD2068D4 +:1021300090F82200400702D50120FFF75DFD2068DE +:10214000417B0E30FEF7FFFD206890F8B81059B1C2 +:1021500090F8B72080F8772000F19801583005F00A +:10216000D3FE206880F8B850206890F8B91059B1B3 +:1021700090F8972080F8572000F17801383005F06A +:10218000C3FE206880F8B9502068254E0021C77E24 +:102190003580304600F056FB2068408C13284FD025 +:1021A00004DC102871D0122804D16BE0152850D01F +:1021B0001D284ED0FFDF1A491948F639884604F029 +:1021C000ACFB184F1648797B04F0B3FB2168488CB0 +:1021D0001D2807D0152805D091F8772030465831B2 +:1021E00004F0B7FB0E4E042150363046358004F023 +:1021F00070FB4146304604F090FB797B304604F09A +:1022000098FB2168304691F85720383104F0B1FB33 +:102210000AE00000C0000020CB84010040420F0013 +:10222000140A00201009002003F079FF032106F1B1 +:10223000280003F0AAFF216881F8330000203BE565 +:102240000021304604F045FB0121304600F0FAFA47 +:10225000B1E70121304604F03CFB0121304600F09B +:10226000F1FA2168304627B11C3104F05CFB0121F2 +:1022700004E0153104F057FB2068017D304604F07E +:1022800061FB98E7062101E0FFE70221304604F0F8 +:1022900020FB90E7FE494860704770B5FC4C06464D +:1022A000206890F8312032B1408C1D2800D1FFDF2A +:1022B000BDE8704051E6002938D1F648FEF795FF99 +:1022C000206890F82C1090F82400FFF7AFFE054628 +:1022D00046B1FFF792FE002201234FF4967110469B +:1022E000FEF7BCFE216891F82C00284381F82C00F1 +:1022F00091F8242082434FF0010004D14A8C1D2A1A +:102300000BD081F831004870488C13280FD008DCBE +:1023100010280BD0122808D109E0002281F82C20C7 +:10232000F1E7152803D01D2801D0FFDF70BDBDE8FF +:10233000704001210846FFF704B8D54810B5006881 +:10234000417841B90078FF2805D000210846FFF701 +:10235000A4FF002010BD00F088FA0C2010BDCC496D +:102360000120096881F837007047C949096881F878 +:102370003200704770B5002500F09CFF50B1C44C8E +:1023800020684178012908D0022901D0032938D0DA +:10239000FFDF70BDBDE87040DFE581780029F8D12E +:1023A000418C102917D090F8330020B1FEF704FBC0 +:1023B0004020FEF782FFB7487830FEF716FF20680E +:1023C00090F8221049070ED490F83500012804D067 +:1023D000032802D002E0002117E0102545F00E018D +:1023E0000020FEF7AEFF206890F8340008B1FEF739 +:1023F00085FF00219620FEF711FF2168022048701A +:1024000070BD81780029FBD18178BDE87040012042 +:1024100043E7A2E510B59E4C206890F8340008B15F +:1024200000F02EFA206890F8330018B1FEF750FF44 +:10243000FEF7D0FA00F03EFF88B12068407802280D +:1024400000D0FFDF00210120FFF727FF206841783F +:10245000002903D04078012800D0FFDF10BDBDE87F +:1024600010407AE510B503F0FEFD044603F0B7FE18 +:1024700038B1204603F00CFE18B1102103F0F9FF2B +:1024800008B1002010BD012010BD2DE9F041804CA5 +:1024900005460F46206890F8CA0000B1FFDF2168AA +:1024A000002681F8CC602888A1F8CE006888A1F8C1 +:1024B000E400A888A1F8E600E888A1F8E80095F80B +:1024C0004C0181F8EA0091F82F0020B1487B0E31D1 +:1024D00000F0ADF940B9216891F8300068B1487B4F +:1024E0000E3100F09BF940B12068D0F80E10C0F812 +:1024F000D810418AA0F8DC1003E0206840F8D86FBB +:102500008680644863497830091F0078FF2FC0F344 +:102510008010687651F87F0FC5F81A008988E98322 +:10252000216813D0C1F8DE00E88BA1F8E20001F1C8 +:10253000D2023846D13103F0B5FD00B9FFDF206883 +:1025400010F8D11F41F002010170C5E501F1D20080 +:1025500041F8DE6F8E806A7E01F80D2CD5F81A10D6 +:102560000160E98B8180B7E52DE9F047DFF820A114 +:102570000F460646032809D0FFF7D2FC0446DAF8D6 +:10258000000090F8320020B1012003E0FFF7CFFCFB +:10259000044600208046FEF70CFC0546032E2CD096 +:1025A0000120814634EA080451D0DAF80000394CA1 +:1025B000564690F83300783460B103F096FD3870D9 +:1025C0000146FF2806D0E01C03F083FD387803F0B5 +:1025D00096FD0543316820780A7DC0F38010904253 +:1025E00005D10622E01C153105F01DFC38B1002094 +:1025F0003978FF290BD0D0B903E00220D1E70120C0 +:10260000F6E7306890F82D00884210D007E030B12E +:102610002078E11CC0F38010FFF724FF38B10020C0 +:10262000316891F82210490703D598B90FE00120CD +:10263000F6E77DB9184890F8350008B1484506D14D +:102640002078E11CC0F38010FFF70CFF10B10020D0 +:10265000BDE8F0870120FBE7F8B5FF208DF800000A +:10266000012569460520FFF77FFF002859D0084C57 +:1026700022689078E8BB07496068783111F80F6BE1 +:10268000437BC6F3401633404373012306E000004A +:10269000C0000020140A00201009002051F8086929 +:1026A000C0F80E608E8946828E7B0675CE7B46759D +:1026B0000E8AC6824E8A46808E8A8680CE8AC680E0 +:1026C0008E6986600E7F06734E7F06F01F060676C3 +:1026D000497F490980F84C1180F8343080F8353052 +:1026E00092F8C81080F8361092F8BB1080F83710B6 +:1026F00000E017E09DF80010FFF7C7FE20680121F9 +:1027000000F8CA1F81788088FFF75EF900F0A3F80F +:1027100021680020487000F0A8F8012000F0DAFEDF +:1027200000E000252846F8BDF8B5784C074600259E +:1027300020684078022800D0FFDF206890F834003D +:1027400008B100F09DF8724804F0E3F806465FB364 +:102750006F4804F01EF938B3FEF7FDFA20B3062ED9 +:1027600022D2DFE806F021212103213BFF208DF852 +:10277000000069460320FFF7F7FE0028206811D00B +:1027800090F8341031B190F8FA0018B99DF80000B3 +:1027900000F085F85E482838FEF727FD2168032001 +:1027A000487002E0807800B90125206890F8330075 +:1027B00018B1FEF78DFDFEF70DF91DB100210120C6 +:1027C000FFF76BFD20684178002906D04178012988 +:1027D00003D04078032800D0FFDFF8BDFFF73CFFAF +:1027E000E1E770B5494E05460C4630688078002810 +:1027F0000BD1FEF736FA03463068214690F8BA202E +:102800002846BDE8704000F09CBE70BD022803D091 +:10281000032801D00020704701207047012802D111 +:102820004879800901D000207047012070470128B5 +:1028300006D148790121B1EB901F01D101207047E9 +:10284000002070470278202322F0200203EA411181 +:102850000A43027070472D4810B540680088FAF7A7 +:102860009DFCBDE81040FAF751B910B5FEF718FD10 +:10287000FEF7F7FCFEF778FCBDE81040FEF7A3BCBE +:1028800010B5224C20683630FEF743FD18B9216898 +:102890007F2081F83600BDE81040FEF725BD70B5F9 +:1028A0001A4C0122216881F8FA200A7881F8FB206D +:1028B000FF280DD001F1FD02FC3103F0F3FB00B95C +:1028C000FFDF206810F8FC1F41F0020101700DE0ED +:1028D0000F480078C0F3801081F8FC000C487C3869 +:1028E00050F87F2F41F8FD2F80888880256895F863 +:1028F000360005F203157F2800D1FFDF206810F8AD +:10290000361F29707F21017070BD0000C0000020BB +:102910008C0A0020FE484068704770B506460D4698 +:1029200014461046FEF76DFE022C14D0012C14D074 +:10293000042C14D0F74908444FF47A7100F2E140B6 +:10294000B0FBF1F000EB460005442046FEF74FFED9 +:102950002844603070BDF049EDE7F049EBE7F049FD +:10296000E9E72DE9F0410E460746014614460120ED +:1029700003F08AFE054697F83500FEF742FE014651 +:1029800097F8350002281CD001281CD004281CD040 +:10299000E04840F2712208444FF47A7100F2E140BD +:1029A000B0FBF1F178885043C1EB4000041BA4F563 +:1029B000597402F051FB00B11E3CAE4207D22846CA +:1029C00006E0D548E5E7D548E3E7D548E1E73046F6 +:1029D000A04204D2AE4201D22C4600E034467C62D2 +:1029E000BDE8F0812DE9FF4F89B0044690F83580AD +:1029F00016989A4640EA0A00079094F84500002588 +:102A0000164619460D2803D00020059011B131E07B +:102A10000120FAE794F8EC0003282BD1059848B37D +:102A2000B4F86E01B04225D1D4F8F400C4F8E00047 +:102A3000608840F2E2414843C4F8E400B4F83A0147 +:102A4000B4F8C6100844C4F8E800204602F00EFBB3 +:102A5000B4F87201E08294F870016075B4F8740102 +:102A60006080B4F87601A080B4F87801E08002209C +:102A700084F8EC00D4F844010490B4F8C600D4F80B +:102A800040B10090B4F83811D4F834010390BAF191 +:102A9000000F04D094F8000100287DD108E004F56F +:102AA0009A70029004F5907704F1C009001D07E0C8 +:102AB00004F58C70029004F5827704F58A79001D84 +:102AC0000690208F301A00B20190701A00B20028D0 +:102AD00005DAD4F83001039001200790019894F8AA +:102AE000EC1041B301297DD002297CD003297BD091 +:102AF000FFDF29460398FCF758F80299012540F2B8 +:102B00007122086006980680002038703D71029896 +:102B10000068B8606088D4F8F4105043C1EB4001FD +:102B20008048A1F54D718161406988427BD9084692 +:102B3000C9F8001079E1BBF1000F00D1FFDF0121DE +:102B4000002003F008FE8046E18A40F271204143F4 +:102B500008EB41000A9900F075FDC4F8F0006088A8 +:102B600040F2E24148430A9900F06CFDC4F8F400D9 +:102B700082B22046A16AFFF7F4FE14F8350FFEF783 +:102B80005AFD4FF47A7100F2E140B0FBF1F101EB34 +:102B90000B000090207800E07EE1FEF74CFD02463D +:102BA00014F8350902283FD001283FD004283FD02F +:102BB00058495518FEF725FD28444FF47A7100F264 +:102BC000DB50B0FBF1F2E08A40F27121484308EBA0 +:102BD0004000811AD4F8F0000A1A0099551894F8A8 +:102BE000352002E0A8E025E0C6E0617D40F2E24346 +:102BF00011FB03F1203DFFF790FE4A49801C48611C +:102C000094F83500FEF717FD4FF47A7100F2E140B9 +:102C1000B0FBF1F101EB0B00281AB0F53D7FBFF4DA +:102C200068AFFFDF65E7FEE03B49C2E73B49C0E72D +:102C30003B49BEE7E08A40F27122D4F8E4105043E9 +:102C400001EB40000A9900F0FDFCC4F8F000608838 +:102C500040F2E24148430A9900F0F4FCC4F8F40061 +:102C600082B22046A16AFFF77CFE009880BB1698CE +:102C700070B394F835804046FEF7C3FC0146B8F1C6 +:102C8000020F21D0B8F1010F20D0B8F1040F20D0ED +:102C9000204840F2712308444FF47A7100F2E14079 +:102CA000B0FBF1F0D4F8F010D4F8E4200144E08A4D +:102CB000584302EB4000451A4046FEF798FC049941 +:102CC000081A0544203D11E01348E2E71348E0E705 +:102CD00001E01348DDE7E08A40F27122D4F8E41005 +:102CE000504301EB4000D4F8F010451AD4F8E82026 +:102CF000D4F8E010D4F8F00040F2E24301FB020007 +:102D000094F83520617D11FB03F1D0340CE0000014 +:102D1000B40A0020C0D4010004360200A22402003C +:102D2000D0FB0100C8000020FFF7F7FDFC49486117 +:102D300001202077D03CDCE6628840F27123D4F891 +:102D4000F4105A43C1EB42054543DDE9000210444B +:102D5000D4F8E820D4F8E0C0801AD4F8F030401E4F +:102D60000CFB023200FB012094F83520617D40F21B +:102D7000E24311FB03F14BE0618840F27123D4F888 +:102D8000F4205943C2EB4105454394F844002128FF +:102D900003D094F84500212809D1B4F86E01301A07 +:102DA00000B2002803DB94F8710100B18046079857 +:102DB00030B3009820BB049810B1BBF1000F00D1D4 +:102DC000FFDF94F83500FEF71CFC0146B8F1020F56 +:102DD00023D0B8F1010F22D0B8F1040F21D0D1488F +:102DE00008444FF47A7100F2E140B0FBF1F02D1A83 +:102DF00094F83500FEF7FBFB0499081A0544203DC2 +:102E0000DDE900010844D4F8F410424648430021AB +:102E1000FFF783FDC24948616BE6C348E0E7C3485A +:102E2000DEE7C348DCE7C9F80000616A084400F542 +:102E3000D270F86002F010F910B1F8681E30F86036 +:102E40007D71B4F8B000801B00B2002801DD0320C2 +:102E5000787105980028169822D0B8B1B4F8D81027 +:102E6000B9B3B4F8DA0000BFA4F8DA0094F8DC20B3 +:102E7000401C42438A4209D27879401E002805DD71 +:102E80007D71B4F8DA00401CA4F8DA00BAF1000F42 +:102E900026D094F80001F8B102200DB0BDE8F08F03 +:102EA0000028DBD194F8EC000028EFD0608840F2D5 +:102EB0007122D4F8F4105043C1EB4001384603F0BE +:102EC00098FB0004000CE1D0179901B108800120A3 +:102ED000E3E7FFE70020C7E794F83C01FCF7B6FC06 +:102EE00094F83C01394600F093FB18B18AF00100D8 +:102EF00084F801010020D0E7FEB50446FCF74CF948 +:102F00000146D4F83001FCF755FE214600F0A4FB41 +:102F100094F845100D2909D0228FB4F8FE1013182B +:102F2000994206DB491CA4F8FE1006E0B4F8FE0046 +:102F30000CE0401C1044A4F8FE0094F8020140B9D3 +:102F4000B4F8FE00B4F8B410884202D1401CA4F8D2 +:102F5000FE00B4F83A01724D401CA4F83A01B4F8EE +:102F60006000B4F85E10401A218F401E084486B2FB +:102F700018E0287800F039FB074694F84C0100F07F +:102F800034FB384481B2002002AACDE90002034696 +:102F9000B4F8FE202046FFF725FD002821D00128A7 +:102FA00017D0FFDFB4F8FE00301A00B20028E0DAD4 +:102FB000082084F85400012084F85300204601F0D2 +:102FC000FEFC204600F026FB2879BDE8FE40EFF726 +:102FD0001FBFB4F8FE00BDF808100844A4F8FE00B6 +:102FE000E0E7FEBD2DE9F041524C0327012527758E +:102FF0000020207494F8280004F1100650B14FF41A +:103000007A71A069FBF7D1FDA0610021304603F081 +:10301000F0FA10E0002000F05EFB0546FEF7BEFD72 +:1030200005442946A069FBF7C0FDA061294630464A +:1030300003F0DFFA451C208C411C0A2901D22844E8 +:103040002084606830B1208C401C0A2802D3022002 +:10305000607500E067752846FEF708FF002809D074 +:10306000607A002806D1207B314600F0D1FA002892 +:1030700000D1FFDFB4E42DE9F04106462D480F46AC +:103080000178274D032909D1017BB14206D140685F +:1030900028613846BDE8F04100F032BB304600F010 +:1030A000ADFA0621F9F748FF040000D1FFDF3046F2 +:1030B00000F0A4FA2188884200D0FFDF214638467C +:1030C0002C61BDE8F04100F0D4BA10B5194C20785D +:1030D00048B101206072FFF748F92078032804D036 +:1030E000207A002800D00C2010BD207BFCF7AEFB1E +:1030F000207BFCF7F8FD207BFCF72FF800B9FFDF01 +:103100000020207010BD10B5FFF7DFFF00F025FB99 +:103110000848002180F82810C172084610BD000040 +:10312000C8000020C0D4010004360200A22402001E +:10313000D0FB0100B40A002070B50446012000F065 +:1031400045FAC5B20B2000F041FAC0B2854200D06A +:10315000FFDF6FF0040000F039FAC5B2192000F06B +:1031600035FAC0B2854200D0FFDFFE4900200122BF +:103170000C7188700A704870C870FB490870BDE80F +:103180007040C0E7F749087070472DE9F047F64CEA +:10319000064689462078D8BBF448FBF784FF2073A5 +:1031A000202840D0032766602770002565722572AD +:1031B0007EB1012106F1DC00FDF775F80620F9F774 +:1031C00067FE16F8DC1FB1FBF0F200FB1210401C8A +:1031D0003070FBF7BBFF40F2F651884200D2084640 +:1031E00000F23D1086B2FEF7B0FCE061FEF7D6FCBF +:1031F0004FF00108D0B184F80A80002000F06BFA8B +:103200000644FBF7C9FF3146FBF7CFFCA06100E0A5 +:1032100009E027756775D4492574207B103100F0CB +:10322000F7F988B90FE00C20BDE8F087FBF7B4FF91 +:103230003146FBF7BAFCA061A57284F82880A9F298 +:103240002650E062E3E7FFDF25840020FFF78DF8DA +:103250000020E9E77CB50025044680F8EC50A0F892 +:103260003851C048007800F0C0F9064694F84C0187 +:1032700000F0BBF9304481B2002300951A46204685 +:103280000195FFF7AFFB00B1FFDF44F8E85F0120D5 +:1032900044F8085C2071E582A582A57634F8B00C6C +:1032A000401E24F8B00CA4F8525000207CBDAD495B +:1032B00048707047AC4810B5417A012409B1002428 +:1032C00009E090F8281031B1416AC06A814202D900 +:1032D0000024FFF744F8204620E770B5A14C0646CD +:1032E000E088401CE080D4E902016278D6F84051C1 +:1032F00012B12A4603F0A7F9A060854205D896F8D6 +:10330000EC00012801D0E07808B1002070BD012058 +:1033100070BD70B505460C460846FEF772F9022CE2 +:1033200014D0012C14D0042C14D0914908444FF42B +:103330007A7100F2E140B0FBF1F040F2E2414D431E +:1033400000F54D70854207D9281A70BD8949EDE70F +:103350008949EBE78949E9E7002070BDFEB5002601 +:10336000044680F8006190F8BE00002849D194F826 +:10337000EC00032845D1FBF70FFF0146D4F83001DC +:10338000FCF718FC00283CDD214600F065F9411CE3 +:10339000208F0144A4F8FC10B4F8FC10B4F8B42059 +:1033A000511A09B200292CDD012184F80211B4F868 +:1033B0006010B4F85E20891A491E084485B21AE0EC +:1033C0006848007800F011F9074694F84C0100F0C5 +:1033D0000CF9384481B202A8CDE90060B4F8FC20B1 +:1033E00001232046FFF7FEFA00280AD0012809D061 +:1033F000022806D0FFDFB4F8FC00281A00B200282B +:10340000DEDAFEBDB4F8FC00BDF808100844A4F8EC +:10341000FC00F0E72DE9FC4100250446012902D11A +:103420005048C17869B1042084F8EC00FBF7C0FD76 +:10343000A4F83A51208FA4F8FE0084F80251BDE8A8 +:10344000FC81007800F0D1F886B294F8EC000127F6 +:10345000032813D00128E9D194F84C0100F0C5F8F5 +:10346000CDE900753044B4F8B42081B20023204681 +:10347000FFF7B8FA0028D9D0FFDFD7E7C4F8E85043 +:10348000C4F8E05094F84C01B43400F0AEF8CDE943 +:103490000075304481B234F8B429E7E710B5062945 +:1034A00016D2DFE801F00509030C0C0D002100E045 +:1034B0000121BDE81040ADE7032180F8EC102DE6B6 +:1034C000B0F8F4108AB2816ABDE81040FFF749BA3B +:1034D000FFDF23E610B530B12349012807D00228C9 +:1034E0000BD0FFDF1AE6BDE8104000F062B9486A71 +:1034F000BDE81040002100F082B9002081F82800CA +:10350000FBF756FD17480079BDE81040EFF780BC87 +:1035100070B5144CA178022912D1E18800290FD18D +:103520002569C5F8440195F83500C835FEF75FF800 +:10353000E96F081AA1680144A160E1680844E060ED +:1035400070BD70B5054607488478022C18D0064C2B +:10355000243439B34FF47A76012915D0022917D0D3 +:10356000FFDF70BDC8000020B40A002077300100E2 +:10357000C0D4010004360200A2240200D0FB0100E6 +:10358000046904F5A074E4E71846FEF754F802E075 +:103590001046FEF743F800F2E140B0FBF6F0281ABF +:1035A0002060DEE72560DCE7EF4810B5007808B161 +:1035B0000020B3E50620F9F75DFC80F00100ADE5E1 +:1035C000E9480078002800D001207047002806DA7A +:1035D00000F00F0000F1E02090F8140D03E000F17E +:1035E000E02090F800044009704710B504460C280C +:1035F00000D3FFDFDD4830F814008FE510B5044636 +:10360000202800D3FFDFD848303030F8140085E59B +:10361000FCF70AB870B50446002084F8EC0094F872 +:103620003C514FF6FF76202D00D3FFDFCE483030DF +:1036300020F8156094F83C01FBF78FFD202084F8FA +:103640003C018EE702460020002904D0C8485143BF +:10365000B1FBF0F0401C7047002809D0D1F8F420ED +:10366000498840F271235943C2EB4101B0FBF1F0AC +:10367000704770B50125BF4E0C46082829D2DFE8F7 +:1036800000F0040F17171228281B204600F02BF912 +:10369000204600F0E3F884F800510220B07060E7A3 +:1036A00001F0D5FC01E0FDF7EBFE84F8005158E78E +:1036B0002046BDE870401FE494F8EC00042800D0D8 +:1036C000FFDF2046FFF7A6FF3079BDE87040EFF737 +:1036D0009FBBFFDF45E708B500284FF001016846B2 +:1036E00002D0FCF7C1FD01E0FCF7B4FD9DF800003D +:1036F00042F210710002B0FBF1F201FB120008BDB2 +:1037000070B5994C05462078032800D0FFDF0026CD +:10371000082D20D2DFE805F0040D1717131F1F1A1C +:103720006662FEF797FC00B1FFDF924903208870C4 +:1037300017E7FEF702FE0028FAD0FFDF11E7BDE829 +:103740007040FDF79DBEBDE870404BE4207BFBF769 +:1037500004FD267005E7FFDF03E7FEB5854C012079 +:10376000E0704FF6FF750CE00621F9F7E5FB060067 +:1037700000D1FFDF96F83C01FCF7B5FA3046FFF7C1 +:1037800049FF69460620F9F764FB50B1FFDF08E006 +:10379000029830B190F8EC1019B10088A842E3D13A +:1037A00004E06846F9F733FB0028F1D00020E07010 +:1037B000FEBD70B56C4C0025A07A18B10120FFF752 +:1037C0008AFF0546FEF7EAF94119A069FBF7EDF912 +:1037D0000025A061257403206075607A30B96249C4 +:1037E000207B1031FFF714FF00B9FFDF2584FBF7C2 +:1037F000DFFB60480079BDE87040EFF709BB2DE9B9 +:10380000F041594C0746002084F82800A669E07270 +:103810002070012020720021606802F09AFD60682B +:10382000C0F83061257B80F83C51C0F84071C0F889 +:1038300034610688202D00D3FFDF4B48303020F85C +:1038400015606068FFF706FD00B1FFDFFBF7B0FB16 +:1038500048480079BDE8F041EFF7DABA70B505469F +:10386000FBF774FC95F8356004463046FDF7C9FE59 +:10387000022E2AD0012E2AD0042E2AD03E4940F210 +:10388000712208444FF47A7100F2E140B0FBF1F08C +:10389000D5F8F410014468885043C1EB4006303E2F +:1038A000B72C00D8B7242946012002F0EDFE2044B1 +:1038B000341A29460120A4F2193402F0E5FE696A9F +:1038C0009C30814207D9081A06E02C49D7E72C49D9 +:1038D000D5E72C49D3E700202649A042CC6000D38D +:1038E000204688603DE610B5044622490020C4F811 +:1038F0004001C880C4F8440194F8010138B9FBF7CD +:103900004BFCD4F80C11FCF755F9002811DCB4F885 +:10391000FE10208F814201D1B4F8B410081AA4F827 +:10392000B6002187D4F82801C4F80C01C4F830018E +:1039300014E034F8FC0F34F8C41C401A24F8460C88 +:10394000208824F8C40C2069E0626063A06944F810 +:103950003C0CE069A063208CA087FC3C2046BDE8BD +:10396000104001F061BA0000B40A0020E8840100B0 +:1039700040420F00C8000020C0D4010004360200FD +:10398000A2240200D0FB01002DE9F0410E460446BE +:1039900003F0F3F80546204603F0F1F8044602F080 +:1039A00091FEFA4F010015D0386990F834208A4210 +:1039B00010D090F87A311BB190F87C3123421FD09F +:1039C0002EB990F83130234201D18A4218D890F8AC +:1039D0007A01A8B1284602F075FE70B1396991F8F4 +:1039E0003520824209D091F87A0118B191F87D0111 +:1039F000284205D091F87A0110B10120BDE8F0818C +:103A00000020FBE730B5E14C85B0E06900285CD0D0 +:103A10001421684604F0D4FA206990F83500FDF7C7 +:103A2000F0FD4FF47A7100F5FA70B0FBF1F5206902 +:103A300090F83500FDF7DBFD2844ADF8060020695D +:103A40000188ADF80010018FADF804104188ADF881 +:103A5000021090F8660130B1A069C11C039102F018 +:103A6000C6FF8DF81000206990F865018DF80800F8 +:103A7000E169684688472069002180F8661180F86E +:103A800065110399002920D090F8641100291CD1F8 +:103A900090F84410242918D09DF81010039A00299A +:103AA00013D013780124FF2B11D0072B0DD102293D +:103AB0000BD15178FF2908D180F864410399C0F8EF +:103AC00068119DF8101080F8671105B030BD1B29F2 +:103AD000F2D9FAE770B5AD4C206990F845001B2883 +:103AE00000D0FFDF2069002580F86D5090F88C0130 +:103AF00000B1FFDF206990F86E1041B180F86E5080 +:103B00000188A0F8901180F88E510C2108E00188FE +:103B1000A0F8901180F88E51012180F892110B21AC +:103B200080F88C110088F9F739FBF8F7EFFF20795E +:103B3000EFF76EF9206980F8455070BD70B5934C71 +:103B4000A079800729D5A078002826D1626920466F +:103B5000D17805690C2905F1380069D00CDCA1F198 +:103B600002014FF001060A2916D2DFE801F017150D +:103B7000414D5E2415291537132967D006DC0D2920 +:103B800049D0112947D0122906D155E0162966D00F +:103B9000172973D0FF2979D0FFDF70BD012395F875 +:103BA0004720194602F0E1FC0028F6D121690820DF +:103BB00081F8470070BD1079BDE8704001F0F1BA9E +:103BC00095F84600C00700D1FFDF01F0A9FA20698F +:103BD00010F8461F21F00101017070BD95F84500F5 +:103BE000102800D0FFDF2069112180F86D6008E007 +:103BF00095F84500142800D0FFDF2069152180F8D2 +:103C00006D6080F8451070BD95F84500152800D00E +:103C1000FFDF172005E095F84500152800D0FFDFED +:103C20001920216981F8450070BDBDE8704051E759 +:103C3000BDE8704001F089BA95F8442001230021C5 +:103C400002F093FC00B9FFDF0E2011E015F8460FDB +:103C500020F004002870BDE8704001F061BA95F8CA +:103C600044200123002102F080FC00B9FFDF1C206A +:103C7000216981F8440070BD00E007E095F8450037 +:103C80001E2801D000B1FFDF1F20CAE7BDE8704049 +:103C900001F052BA3D48016991F84620130702D558 +:103CA00001218170704742F0080281F84620806946 +:103CB000C07881F8A90001F02ABA10B5334C216907 +:103CC0000A88A1F8B82181F8B60191F8340001F012 +:103CD00012FA216981F8BA0191F8350001F00BFA66 +:103CE000216981F8BB01012081F8B401002081F82D +:103CF0007A012079BDE81040EFF78AB810B5234C5F +:103D000001230921206990F84420383002F02DFC6D +:103D100038B12169002001F85C0F087301F8180C14 +:103D200010BD0120A07010BD70B5184C01232146B4 +:103D30002069896990F8442009790E2A01D1122955 +:103D400003D000251D2A03D004E0BDE87040D5E76C +:103D5000162906D0232A01D1162902D0172909D005 +:103D60000CE000F8445F80F8245040781E2882D090 +:103D70001A2019E090F845201F2A09D0E269002A8C +:103D800003D0FF2901D180F8663174E7E4000020F8 +:103D900080F8455001F0C4F9206980F85D5090F832 +:103DA0007A010028F1D00020BDE8704085E72DE9B8 +:103DB000F843FE4C206990F844101D2908D00027D4 +:103DC00090F845101F2905D077B300F1440503E0B2 +:103DD0000127F5E700F1450510F8761F41F00401D1 +:103DE0000170A06902F0CFFE4FF001080026F8B183 +:103DF0003946A069FFF7C8FDD0B16A46A1692069BC +:103E000002F06EFC80B3A06902F0BBFE2169A1F84C +:103E10006E01098F01F055F938B32069282180F827 +:103E2000541080F8538047E00220A070BDE8F8836A +:103E3000206990F87A0110B11E20FFF73EFFAFB164 +:103E4000A0692169C07881F8AA0008FA00F1C1F3DD +:103E5000006000B9FFDF20690A2180F8441090F863 +:103E6000680040B9FFDF06E009E01AE02E7001F0BB +:103E700057F9FFF70FFF206980F85D60D6E72069EA +:103E800090F87A0118B10020FFF717FF2E70206913 +:103E900000F1450180F85D608D420DD180F84560EC +:103EA0000AE020699DF8001080F870119DF801105B +:103EB00080F8711121202870206900F145018D42A0 +:103EC00003D1BDE8F84301F02BB980F86860ADE795 +:103ED00070B5B64C01230B21206990F8452038308D +:103EE00002F043FB202650BB20690123002190F8FB +:103EF0004520383002F039FB0125F0B1206990F8F7 +:103F0000440021281BD0A06902F02DFEC8B1206911 +:103F100090F8761041F0040180F87610A1694A7992 +:103F200002F0070280F83120097901F0070180F8DA +:103F3000301090F87B311BBB06E0A5709BE6A670A5 +:103F400099E6BDE87040A5E690F87A31C3B900F172 +:103F500034035E788E4205D11978914202D180F8FF +:103F60005D500DE000F5D7710D7002884A8090F821 +:103F700030200A7190F8310048712079EEF748FF3F +:103F800021691E2081F84500BDE8704001F0BFB8EE +:103F900070B5864C206990F84610890707D590F8CF +:103FA000442001230821383002F0DFFAE8B120690B +:103FB00090F87000800712D4A06902F0C8FD216952 +:103FC00081F87100A06930F8052FA1F872204088AF +:103FD000A1F8740011F8700F40F002000870206919 +:103FE00090F87010C90703D00FE00120A07042E6DE +:103FF00090F84600800700D5FFDF206910F8461FC3 +:1040000041F00201017001F082F82069002590F86A +:104010004410062906D180F8445080F86850207971 +:10402000EEF7F6FE206990F86C110429DFD180F8D4 +:104030006C512079EEF7ECFE206990F844100029CD +:10404000D5D180F8685016E670B5584C0123002190 +:10405000206990F84520383002F087FA012578B9B8 +:10406000206990F84520122A0AD001230521383012 +:1040700002F07BFA10B10820A070FCE5A570FAE50B +:10408000206990F86E0008B901F041F82169A06933 +:10409000C83102F04AFD2169A069A03102F04BFD50 +:1040A000206990F8940100B1FFDF21690888A1F828 +:1040B000960101F5CC71A06902F02FFD2169A0697C +:1040C00001F5D07102F02EFD206980F89451142181 +:1040D00080F845102079BDE87040EEF799BE70B5C4 +:1040E000324C01230021206990F84520383002F03D +:1040F0003CFA0125A0B1A06902F0E5FC90B1A069ED +:104100002169B0F80D00A1F86E01098F00F0D9FF08 +:1041100058B12069282180F8541080F85350AAE53E +:10412000A570A8E5BDE87040B4E5A06921690279F1 +:1041300081F87021B0F80520A1F8722102F0BAFCD4 +:104140002169A1F87401A06902F0B7FC2169A1F806 +:104150007601A06902F0B4FC2169A1F878010D2074 +:1041600081F8450087E57CB5104CA079C00736D0B2 +:10417000A06901230521C578206990F845203830D1 +:1041800002F0F3F968B1AD1E0A2D06D2DFE805F0A2 +:1041900009090505090905050909A07840F0080085 +:1041A000A070A07800281AD1A06901E0E4000020E6 +:1041B000C57802261DB1012D01D0162D18D1206918 +:1041C00090F8440002F0B9F990B1216991F84400E7 +:1041D0001C280DD01D2803D0162D15D0A6707CBD2F +:1041E000232081F84400162D02D02A20FFF765FD18 +:1041F0000B2D3AD00BDC76D2DFE805F0312E1B40D8 +:104200009F9F4396549F34002020A0707CBD0120C6 +:10421000132D6AD006DC0C2D41D0112D6FD0122D3C +:1042200061D165E0162D76D0182D77D0FF2D5AD1AB +:104230007DE020690123194690F84720383002F0CC +:1042400094F920BBA06902F066FC216981F8520153 +:10425000072081F8470072E001F007F86FE0FFF7F0 +:104260003EFF6CE000F0E1FF69E0206990F8451046 +:1042700011290BD1122180F8451060E0FFF7E4FE10 +:104280005DE0206990F84500172801D0A67056E03F +:1042900000F046FF21691B2081F845004FE0FFF741 +:1042A00077FE4CE0206990F84600C00703D0A07864 +:1042B00040F0010021E06946A06902F04AFC9DF847 +:1042C000000000F00501206900F8761F9DF801103C +:1042D00001F04101417000F01AFF206910F8461FFB +:1042E00041F0010115E028E0FFE7FFF707FD26E0B8 +:1042F000216991F84610490704D5A0701FE010E02D +:1043000009E00BE000F003FF206910F8461F41F0C0 +:104310000401017013E0FFF7DBFD10E0FFF747FD3C +:104320000DE000F061FF0AE0FFF7FEFC07E0E16945 +:1043300019B1216981F8660101E0FFF7ABFC206942 +:10434000F0E92212491C42F10002C0E900127CBDD2 +:1043500070B5F84CA07900074AD5A078002847D15D +:10436000206990F8AB00FE2800D1FFDF2069FE2114 +:10437000002580F8AB1090F84510192906D180F877 +:104380006D5000F0CDFE206980F84550206990F80E +:1043900044101C2902D0242921D119E090F84500AD +:1043A00002F0CBF878B120692321012380F8441072 +:1043B00090F845200B21383002F0D7F878B92A2040 +:1043C000FFF77BFC0BE021691D2081F8440006E02B +:1043D000012180F8651180F8445080F86850206908 +:1043E00090F84710082903D10221217080F8AB1002 +:1043F00041E4D049096991F870210AB991F8342053 +:1044000081F8342091F871210AB991F8352081F8AA +:104410003520002801D000204FE4704770B5C54C0E +:1044200006460D46206990F8AB00FE2800D0FFDF5D +:104430002269002082F8AB6015B1A2F86A001AE484 +:1044400022F8640F0120107115E470B5B94C0123F6 +:104450000021206990F84420383002F086F80028C6 +:104460003FD0206990F87A1139B390F87B1121BBC5 +:1044700090F8452001230B21383002F076F8E0B99E +:10448000206990F8340000F036FE0546206990F867 +:10449000350000F030FE0646206990F87C11284671 +:1044A00000F01BFE50B1206990F87D11304600F0FD +:1044B00014FE18B10020FFF700FC11E02069012371 +:1044C000032190F84520383002F04FF840B92069B8 +:1044D0000123022190F84520383002F046F808B157 +:1044E000002052E400211620FFF798FF01204CE441 +:1044F00070B5904C206990F8AB10FE2978D1A17866 +:10450000002975D190F8472001231946383002F070 +:104510002CF800286CD1206990F8501149B1002185 +:10452000A0F8621090F8511180F8AC100021022020 +:104530005BE090F8452001230421383002F015F8A3 +:10454000054600F0F5FE002852D1284600F01AFF7B +:1045500000284DD120690123002190F844203830F3 +:1045600002F003F878B120690123042190F8452076 +:10457000383001F0FAFF30B9206990F85C0010B1D2 +:104580000021122031E0206990F844200A2A0DD041 +:10459000002D2DD101230021383001F0E6FF78B144 +:1045A000206990F86C1104290AD105E010F8AA1FBF +:1045B00081700021072018E090F87000800718D063 +:1045C000FFF743FF002813D120690123002190F851 +:1045D0004420383001F0C9FF002809D0206990F844 +:1045E0006401002804D00021FF20BDE8704015E7D9 +:1045F00009E000210C20FFF711FF206910F8701F5F +:1046000041F00101017099E43EB505466846FDF7A9 +:10461000F6F800B9FFDF2221009803F0AFFC032178 +:10462000009802F0FBF90098017821F01001017068 +:10463000294602F022FA3F4C0C2D27D00ADCA5F1C6 +:1046400002050A2D16D2DFE805F01C154416161CCB +:10465000154F1516132D0ED006DC0D2D2CD0112D57 +:1046600021D0122D06D106E0162D29D0172D4CD0C1 +:10467000FF2D55D0FFDFFDF7D7F8002800D1FFDF71 +:104680003EBD2169009891F8AC1017E0E2680098EF +:104690001178017191884171090A81715188C17144 +:1046A000090A0172E7E70321009802F084FA062163 +:1046B000009802F084FADEE7009806210171DAE73B +:1046C0000098216991F87C21027191F87D11417166 +:1046D000D1E721690098D03102F031FA21690098C0 +:1046E000A43102F031FAC6E71349D1E90001CDE95E +:1046F0000101206901A990F8760000F005008DF80D +:104700000400009802F02AFAB5E7216991F87A01CD +:1047100000280098D6D111F8342F02714978D6E7D5 +:10472000206990F86721D0F86811009802F0B3F979 +:10473000A1E70000E400002000850100F84810B562 +:10474000006990F84A1041B990F8452001230621EC +:10475000383001F00AFF002800D0012010BD70B5EC +:10476000EF4D286990F8481039B1012905D0022988 +:1047700006D0032904D0FFDF39E4B0F8B41041E0DB +:1047800090F84710082934D0B0F85E10B0F86020D7 +:1047900000248B1C9A4206D3511A891E0C04240C47 +:1047A00001D0641EA4B290F85C1039B190F8442096 +:1047B00001230921383001F0D8FE30B3FFF7BEFFE6 +:1047C00078B129690020B1F85820B1F856108B1C37 +:1047D0009A4203D3501A801E00D0401EA04200D23D +:1047E00084B20CB1641EA4B22869B0F8B41021449C +:1047F00008E0B0F85E100329BFD3018FB0F8602045 +:104800001144491CA0F8B0101DE40024ECE770B579 +:104810000C4605464FF4E071204603F0D1FB25809D +:1048200011E4F8F792BC2DE9F0410D460746062148 +:10483000F8F782FB04003DD094F880010026B8B15F +:104840006E70072028700DE0268484F88061D4F80B +:104850008201C5F80200D4F88601C5F80600B4F854 +:104860008A01688194F880010028EDD1AE7094E04F +:1048700094F88C0190B394F88C010B2813D00C2879 +:1048800001D0FFDF89E02088F8F788FC0746F8F7B9 +:1048900052F978B96E700C20287094F88E01A870C7 +:1048A0002088A88014E02088F8F778FC0746F8F7FD +:1048B00042F910B10020BDE8F0816E700B20287025 +:1048C00094F88E01A8702088A88094F89201A871AD +:1048D00084F88C613846F8F728F95EE0FFE794F831 +:1048E000AC0130B16E700E20287084F8AC616F801E +:1048F00053E094F8940180B16E70082028702088ED +:104900006880D4F898116960D4F89C11A960B4F853 +:10491000A001A88184F894613FE094F8A20140B11D +:104920006E7015202870B4F8A401688084F8A26124 +:1049300033E094F8A60170B16E701620287005E07F +:1049400084F8A661D4F8A801C5F8020094F8A6017D +:104950000028F5D121E094F8AE0140B1182028706C +:1049600084F8AE61D4F8B001C5F8020015E094F8FF +:10497000B40100289FD06E701220287009E000BF9B +:1049800084F8B461D4F8B601C5F80200B4F8BA01ED +:10499000E88094F8B4010028F2D101208BE7604848 +:1049A0000021C16101620846704730B55C4D0C467C +:1049B000E860FFF7F4FF00B1FFDF2C7130BD00218C +:1049C00080F8441080F8451080F8481090F8BE1028 +:1049D00009B1022100E00321FEF760BD2DE9F0419D +:1049E0004F4C0546206909B1002104E0B0F8C6101B +:1049F000B0F8B6201144A0F8C61090F8501139B99B +:104A000090F8472001231946383001F0AEFD30B14F +:104A1000206930F8621FB0F85420114401802069E9 +:104A200090F8683033B1B0F86410B0F8B620114493 +:104A3000A0F8641090F96C70002F06DDB0F86A10D1 +:104A4000B0F8B6201144A0F86A1001213D2615B136 +:104A500080F8546013E02278022A0AD0012A11D08B +:104A6000A2782AB380F8531012F0140F0DD01E2133 +:104A700013E090F8AC20062A3CD016223AE080F8E9 +:104A8000531044E090F8522134E0110702D580F829 +:104A900054603CE0910603D5232180F8541036E0A1 +:104AA000900700D1FFDF21692A2081F854002AE015 +:104AB0002BB1B0F86420B0F866309A4210D2002FC3 +:104AC00005DDB0F86A20B0F866309A4208D2B0F836 +:104AD0006230B0F86020934204D390F850310BB1AB +:104AE000222207E090F848303BB1B0F85E309342A4 +:104AF00009D3082280F85420C1E7B0F85E20062AC6 +:104B000001D33E22F6E7206990F8531019B12069CD +:104B1000BDE8F04153E7BDE8F0410021FEF7BEBC1F +:104B2000E40000202DE9F047FF4C81460D46206946 +:104B30000088F8F745FB060000D1FFDFA078284386 +:104B4000A070A0794FF000058006206904D5A0F878 +:104B50005E5080F8C45003E030F85E1F491C0180AD +:104B6000FFF7ECFD012740B3E088000506D520697A +:104B700090F84A1011B1A0F856501EE02069B0F824 +:104B80005610491C89B2A0F85610B0F858208A4235 +:104B900001D3531A00E00023B4F808C00CF1050C4F +:104BA000634501D880F85C70914206D3A0F8565056 +:104BB00080F8AC712079EEF72BF9A0794FF002085C +:104BC00010F0600F0ED0206990F8481011B1032941 +:104BD00008D102E080F8487001E080F848800121A7 +:104BE000FEF75CFC206990F84810012904D1E188A7 +:104BF000C90501D580F84880B9F1000F70D1E1886E +:104C0000890502D5A0F8D85003E030F8D81F491C18 +:104C1000018000F054FBFEF7F5FEFFF769FC00F0A1 +:104C20006AFD0028206902D0A0F8B85003E030F8EF +:104C3000B81F491C018000F061FD38B1216991F86D +:104C4000C400022807D8401C81F8C400206990F8ED +:104C5000C400022804D9206920F8B85F4580057394 +:104C600020690123002190F84520383001F07DFCB7 +:104C700020B9206990F845000C2859D120690123FA +:104C8000002190F84420383001F06FFC48B32069CF +:104C90000123002190F84720383001F066FC00B372 +:104CA000206990F84810022942D190F8C400C0B998 +:104CB0003046F7F710FDA0B1216991F8AB00FE284E +:104CC00036D1B1F8B200012832D981F8BD70B1F8FF +:104CD0006000B1F85E20831E9A4203DB012004E0ED +:104CE00031E025E0801A401E80B2B1F8B820238957 +:104CF0009A4201D3012202E09A1A521C92B29042C7 +:104D000000D91046012801D181F8BD5091F8482101 +:104D100092B1B1F8BA20B1F84A118A4201D3012107 +:104D200002E0891A491C89B2884205D9084603E085 +:104D30002169012081F8BD5021690A8F1044A1F832 +:104D4000B400FFF70CFDE088C0F340214846FFF7B0 +:104D500045FE206980F8BE50BDE8F047FCF787BDEE +:104D6000714902468878CB7818430DD1084600690E +:104D700042B18979090703D590F84700082803D084 +:104D800001207047FEF7A9BA0020704770B5664C45 +:104D900005460E46E0882843E080A80703D5E807CB +:104DA00000D0FFDF6661EA074FF000014FF001001D +:104DB0001AD0A661F278062A02D00B2A14D10AE092 +:104DC000226992F84530172B0ED10023E2E92033F7 +:104DD00002F8370C08E0226992F84530112B03D114 +:104DE00082F8491082F86E00AA0718D56269D27855 +:104DF000052A02D00B2A12D10AE0216991F8452038 +:104E0000152A0CD10022E1E9222201F83E0C06E02D +:104E1000206990F84520102A01D180F84A10280610 +:104E200001D50820E070A7E42DE9F84F3E4C00259D +:104E30004FF00108E580A570E5704146257061F3EB +:104E4000070220619246814680F8BE800088F8F70C +:104E5000B7F9070000D1FFDF20690088FCF7CCFC20 +:104E600020690088FCF7F1FC2069B0F8B21071B13C +:104E700090F8AB10FE290FD190F8501191B190F835 +:104E8000472001231946383001F06FFB80B12069BB +:104E900090F8AB00FE2805D0206990F8AB0000BF69 +:104EA000FFF7B2FB206990F8BF1089B1258118E0A7 +:104EB0002069A0F8625090F8511180F8AC100021E0 +:104EC0000220FFF7ABFA206980F8BD500220E7E727 +:104ED00090F8801119B9018C8288914200D881889C +:104EE0002181B0F8B610491E8EB2B0F8B810314426 +:104EF000A0F8B81090F8BC1021B1A0F8BA5080F812 +:104F0000BC5004E0B0F8BA103144A0F8BA1030F840 +:104F10005E1F31440180FFF711FC20B1206930F899 +:104F2000561F3144018001E0E40000202069B0F800 +:104F3000B210012902D8491CA0F8B2100EB180F8B5 +:104F4000C45090F8BD10A1B1B0F8B80021898842D2 +:104F50000FD23846F7F7BFFB58B1206990F84811D7 +:104F600039B1B0F8BA10B0F84A01814201D300F06B +:104F7000C8FB206980F8BD5090F845100B2901D07E +:104F80000C2915D1028FB0F86E31D21A12B2002A54 +:104F90000EDBD0F87011816090F87411017302215A +:104FA00001F0D7F9206980F8455080F8788024E036 +:104FB00021290FD1018FB0F86E21891A09B2002979 +:104FC00008DB90F87A01FFF714FA206900F8455FD2 +:104FD000057612E090F84410212901D022290CD145 +:104FE000018FB0F86E01081A00B2002805DB01201D +:104FF000FFF7FFF9206980F8445020690146B0F8B6 +:10500000B620383001F022FA206990F8481109B131 +:10501000A0F8BA50F9480090F94BFA4A4946504670 +:1050200000F0DCFA216A11B16078FCF727F92069F9 +:105030000123052190F84520383001F096FA002828 +:1050400003D0BDE8F84F00F042BABDE8F88F00F099 +:1050500022BBED49C8617047EB48C069002800D009 +:1050600001207047E84A50701162704710B504463D +:10507000B0F874214388B0F87611B0F878019A42FC +:1050800005D1A388994202D1E38898420FD02388A2 +:10509000A4F88431A4F88621A4F88811A4F88A0120 +:1050A000012084F88001D8480079EDF7B1FE012194 +:1050B000204601F04EF9002004F8450F0320E0706F +:1050C00010BD401A00B247F6FE71884201DC00288C +:1050D00001DC0120704700207047012802D002281F +:1050E00005D102E0012904D001E0022901D000200D +:1050F00070470120704710B5012804D0022804D061 +:10510000FFDF204610BD0124FBE70224F9E7BE487B +:105110000021006920F86A1F8178491C817070475E +:10512000B94800B5016911F86C0F401E40B2087013 +:10513000002800DAFFDF00BDB3482421006980F8B1 +:105140004410002180F86411704710B5AE4C2069FE +:1051500090F86C11042916D190F844200123002105 +:10516000383001F002FA00B9FFDF206990F87010C2 +:10517000890703D4062180F8441004E0002180F858 +:10518000681080F86C11206990F84600800707D5F8 +:10519000FFF7C6FF206910F8461F21F002010170D9 +:1051A00010BD994910B5096991F844200A2A09D11E +:1051B00091F8AA20824205D1002081F8440081F8AC +:1051C000680010BD91F84620130706D522F00800AC +:1051D00081F84600BDE81040A2E7FF2801D0FFDFBC +:1051E00010BDBDE81040A7E710B5874C206910F846 +:1051F000761F41F004010170A06901F0DEFC162861 +:1052000006D1206990F844001D2802D0232805D03B +:1052100010BDA06901F0D5FCFEF74FFD216900200B +:1052200081F8440081F8680010BD10B5764C012368 +:105230000021206990F84520383001F096F930B10E +:10524000FFF765FF2169102081F8450010BD206936 +:105250000123052190F84520383001F086F908B186 +:10526000082000E00120A07010BD70B5664C01233D +:105270000021206990F84520383001F076F90125A9 +:1052800080B1A06901F044FC2169A1F86E01098F89 +:10529000FFF717FF40B12069282180F8541080F8EB +:1052A0005350C0E5A570BEE52169A06901F5B8714C +:1052B00001F029FC21690B2081F84500B3E510B508 +:1052C000FFF746F8FEF74FFF4F4CA079400708D58F +:1052D000A07830B9206990F84700072801D1012053 +:1052E0002070FEF72BFCA079C00609D5A07838B94C +:1052F000206990F845100B2902D10C2180F8451047 +:10530000E07800070ED520690123052190F845209B +:10531000383001F02AF930B10820A070216900204E +:1053200081F88C0110BDBDE81040002000F048BBA2 +:1053300010B528BB344C216991F84600C20702D051 +:105340000121092018E082070AD501210C20FFF76E +:1053500065F8206910F8701F41F0010101700DE03F +:10536000420702D50121132006E0000708D511F8F5 +:10537000A90FC87001210720FFF750F8012010BDC8 +:10538000002010BD10B5204C216991F8452040B394 +:10539000102A06D0142A07D0152A19D01B2A2BD17F +:1053A00019E001210B2018E0FAF75AFF0C2816D358 +:1053B00020690821D030FAF757FF28B1206904216D +:1053C000A430FAF751FF00B9FFDF0121042004E007 +:1053D00000F01FF803E001210620FFF71FF801206D +:1053E00010BD1E2A08D191F85D0078B991F87A01B4 +:1053F00010B191F87B0148B1002010BD254B010090 +:10540000614D01008D4D0100E400002001211720B5 +:10541000E3E770B5174C0025206990F85311012976 +:105420000AD0022925D190F86E10A9B1062180F882 +:10543000AC100121022017E090F88C11002918D13E +:1054400000F1900300F1C801002200F5AA7001F0FC +:105450002CF80121052007E090F87600400701D5DF +:10546000112000E00D200121FEF7D8FF206980F80F +:105470005351D8E4E400002011F00C0F6FF00D023E +:105480000BD0B0F5747F01D2002070475038C1179F +:1054900000EB916002EBA01003E0022903D002EBC5 +:1054A000D00080B270476FF00E0101EB9000F8E77A +:1054B000F8480078002800D00C20704710B504464A +:1054C000FFF7F6FF00B1FFDFF248447210BDF1496B +:1054D00001200872704770B5EE4934314C6804F110 +:1054E000380580B194F83510204601F0BEF882B23C +:1054F0001B2114F8353FA87C00F008FC2178BDE89A +:105500007040FBF7E5BB1F2094F83410F7E72DE956 +:10551000F047E04E814634367468204694F83510E2 +:1055200001F0A3F880B294F83510FFF7A5FF1B2116 +:105530001B2800D90846D74D0746D74868627668C9 +:1055400001203836FFF7C7FFB07C4FF0000840B3AA +:1055500006F15801D04891E80E1000F1480A8AE897 +:105560000E10B16EC0F86110F16EC0F865102230F7 +:10557000FBF73BFEC848012148300176D6E91412FA +:10558000C0E90412A0F12602696AFBF796FA94F8C2 +:10559000350000F0B1FB0246F9B20120FBF79BFA9F +:1055A00004E0686AFBF721FEFBF7BAFAB9F1000FD5 +:1055B0000AD1012294F8353096211046FBF74EFDB2 +:1055C00041469620FBF72AFE94F82C00012801D1D1 +:1055D000FBF794FE02202870BDE8F0872DE9F04724 +:1055E000AC4C8046089F20781D461646894610B967 +:1055F0000EB105B107B9FFDFE761C4E90565002019 +:10560000C4E90D892072E0712071E0706071A14FD2 +:10561000A071A0703437A0817E68354636F8380B0B +:10562000F7F7CEFDE0622888F7F7B8FD2063FBF7B7 +:1056300059FB95F93700FBF7BAFB05F11200FBF7B0 +:10564000BCFD05F10E00FBF7B8FB0120FBF7CAFD1E +:10565000B07EFBF7BCFBFBF7BFFD95F83510284685 +:1056600001F003F882B21B2115F8353FB07C00F041 +:105670004DFB2C782146FBF72BFB22460021012015 +:10568000FBF774FC7868D0F8C000FBF7B2FDBDE80A +:10569000F04701203BE77F4800B50078022800D0A2 +:1056A000FFDF00BD7B4810B534304468FBF7F8FDE0 +:1056B000FBF7D7FDFBF758FDFBF785FDFBF730FA4D +:1056C00094F82C00012801D1FBF70EFE714CA08943 +:1056D00000F02BFBE269E179E07890470020207030 +:1056E00010BD6C4810B50078022800D0FFDFBDE87F +:1056F0001040D7E7D6E7674840797047654800799A +:1057000070476449012088717047624810B5343091 +:10571000446804F13800017B21290BD0407B21280B +:1057200008D01C2909D01D2907D01F280FD094F8B4 +:10573000340010BD94F8701106E01F2807D094F8CB +:105740007C0100F0CFFA014694F8340008E094F8A8 +:105750007C0114F8311F084000F0C4FA0146E078DB +:10576000BDE8104000F0ECBA2DE9F14F4948494F2F +:105770003430A0F1140B466882B006F138041B25C2 +:1057800060794FF0000A4FF0010958B3012868D042 +:1057900002286AD0032875D0FFDF386A0825B8468A +:1057A000017821F008010170A37905EAC3031943C8 +:1057B00021F004010170E379042505EA830319430C +:1057C00021F0100101706779D8F82C00F6F793FFEB +:1057D0000546FCF75FF8022F60D0012F5ED0032F43 +:1057E0005FD061E0FFF791FF8046FFF78EFF014633 +:1057F000304600F03DFF80B24146FFF73DFE1B28DA +:1058000000D92846ADF804005846FCF721F830B11D +:105810004FF48060396A00F08DFA03201FE06A4679 +:1058200001A9F86A00F05CFA386210B194F83510FA +:1058300029B15846FBF7DDFF84F80590ADE79DF8E8 +:10584000001031B9A0F800A080F802A0012101F0F9 +:10585000E5F8BDF80410386A01F0B5F9022060716E +:105860009BE75846FBF7C5FF97E7ADF804506A463B +:1058700001A9F86A00F034FA386200288DD1FFDF00 +:105880008BE7FFE75846FBF7E3FF002885D1FFDFF2 +:1058900083E703E008010020280B0020A84301D083 +:1058A00002E00DB1012100E00021D8F820004546BA +:1058B000027842EA01110170617C51B361790129DA +:1058C00027D004F15801FC488EC900F1480888E847 +:1058D0008E00A16EC0F86110E16EC0F86510223034 +:1058E000FBF783FCF448483080F818A0D4E9121282 +:1058F000C0E90412A0F126012A6AFBF7DEF896F847 +:10590000340000F0F9F90246FB210020FBF7E3F830 +:1059100003E0FBF76AFCFBF703F9029830B996F84D +:105920003430012296210020FBF798FB85F8059082 +:10593000296A0A88EA818978297485F80090BDE887 +:10594000FE8F70B5DD4C054639B9012D05D12079A2 +:10595000401CC0B22071012820D8A1692846884780 +:10596000E0B1A179D44831B1012D04D1417811B908 +:105970000178C90612D5E17981B98DB9CF490E31C7 +:105980000978CA0602D40078C00607D5A07828B9DD +:10599000A06A28B9608918B1C80601D4012070BD79 +:1059A000002070BD10B5C54CA06A00B9FFDF628948 +:1059B000D4E90910D21C02F062FAA06A606210BD3C +:1059C0002DE9F0470600BD48BC4D00F134004468A5 +:1059D000686A04F13804477801D0012E03D1296B9D +:1059E00001F072FF687068784FF000084FF001090D +:1059F00038B1012817D0022830D0032845D0FFDF66 +:105A0000EAE5012E31D0FFF7CDFF39460122286BA0 +:105A1000F6F7E2FE27E000BF84F8078030E000BF21 +:105A200084F807902CE0012E08D0FFF7BBFF394621 +:105A30000022286BF6F7D0FE022EE1D0D4E9140143 +:105A4000401C41F10001C4E91401E079012802D0B1 +:105A500084F80790C0E584F80780BDE5012E04D0E6 +:105A6000286BF7F73DF8022ECAD0D4E91401401C88 +:105A700041F10001C4E91401E0790128D0D1CBE75C +:105A8000687ABDE8F047EDF7C3B9012EB8D0286BAE +:105A9000F7F726F8F4E72DE9F04101468748874DEE +:105AA000343000274468686A01263834027802F0EE +:105AB0000302012A1BD0022A19D0032A03D0E87955 +:105AC00040F0040011E000F0C2FF20B3A670A889E6 +:105AD00040F40060A8810120696A00F02BF91EE003 +:105AE000E771BDE8F081E671FBE7E871F9E740781E +:105AF000A8B1AA8942F40062AA81AA6A002AF0D059 +:105B00001B2808D8287A20B1BDE8F041802000F099 +:105B10000CB90E70E5E7E87940F01000E5E7E079B0 +:105B20000128E0D1DCE770B56448644D3430446846 +:105B300028783834012800D0FFDFA078012630B162 +:105B40000020A0700146042000F0F4F82671286AB5 +:105B50000078C043800706D1E07820B9E6700220C3 +:105B6000296A00F0E7F801210020FFF7EAFE10B1F2 +:105B7000BDE8704096E5BDE870400020C7E42DE91F +:105B8000F84F4E4F4D4C343700267D6882468DF8D5 +:105B9000006020783835022800D0FFDFA08940F46B +:105BA0000070A0810020FFF796FCA87CBAF1000FDE +:105BB0005BD0FAF7D8FFFAF7C8FF4FF0010968B9D0 +:105BC000A87C58B1606A417841B10078E979C0F3A6 +:105BD000C000884202D184F8039059E0606A41789D +:105BE000618121B1206BF6F7B1FDA06200E0A662F1 +:105BF000A089B84640F02000A0812671786800F1A5 +:105C00003807064690F82C00012816D1FBF76CFBEC +:105C10003946304600F067FC78B1D8F80400318886 +:105C2000A0F8A811397A80F8AA11797A80F8AB1116 +:105C300080F8A691607AEDF7EBF8606AA9790078B0 +:105C4000C0F38000884205D000F084F8A08940F4B9 +:105C50008070A081606AE9790078C0F3C000884252 +:105C60000AD16846FFF717FF06E008B1FAF7A7FF69 +:105C7000A08940F04000A08151460120FFF761FE5D +:105C800000289DF8000007D010B10020FFF798FE13 +:105C9000FFF708FDBDE8F88F10B10120FFF790FE77 +:105CA0000020FFF761FD9DF800000028F2D00220DF +:105CB000FFF786FEEEE70000280B00200801002019 +:105CC00070B5064642480D464468FAF7CAFF0346D7 +:105CD00094F8342029463046BDE87040FDF731BCC9 +:105CE000F6F744BCC10701D001207047800701D5F9 +:105CF000022070470020704700B5012802D002281A +:105D000002D0FFDF002000BD012000BD70B50C46B1 +:105D1000054619461046FFF7AFFB844200D22046E5 +:105D20000DB1001D80B2C0B270BD294A0021343AC5 +:105D300052691047264A0123343A9370526910473A +:105D4000002904D0012803D0012901D00220704786 +:105D50000120704770B51E48446894F83D003834FF +:105D6000002832D0022810D1194D343DE86AF6F7E8 +:105D700029FC00B9FFDFD4E91201401C41F1000108 +:105D8000C4E91201687AEDF743F8002565712079BE +:105D900020B1257100211020FFF7CCFFE07878B109 +:105DA000E570FBF764FD00B9FFDF00210820FFF775 +:105DB000C1FFD4E91201401C41F10001C4E9120104 +:105DC000A079012802D00120A07170BDA57170BD1D +:105DD0003C0100202DE9F0410F4606460024FA4D13 +:105DE0000FE000BF05EBC40090F84311B14206D1AB +:105DF0000622394600F5A27002F015F838B1641C8D +:105E0000E4B22878A042EDD81020BDE8F081204609 +:105E1000FBE7F0B50746EC4816460478621C0270B2 +:105E200000EBC4050868C5F844018888A5F8480156 +:105E3000102C00D3FFDF85F8437185F84A612046B6 +:105E4000F0BD70B5054600F0F9F910281CD1DE4C04 +:105E50002078401EC0B22070A84215D004EBC002CA +:105E600004EBC50102F58070D2F84321C1F843214B +:105E7000D0F84700C1F84701207800F0DFF910287A +:105E800002D0204480F8035170BD2DE9F047CE4C7C +:105E90000646A719A078401EC5B2A57097F80381E1 +:105EA000AE422AD004EB051A04EB06190AF10301ED +:105EB00009F10300102201F0E2FF0AF1830109F168 +:105EC0008300102201F0DBFF601905EB450290F81A +:105ED000031187F8031106EB460104EB420204EBC1 +:105EE0004101D2F80B31C1F80B31B2F80F21A1F802 +:105EF0000F2190F83B0187F83B0104EBC80090F8B4 +:105F00004A01C00703D14046BDE8F04799E7BDE824 +:105F1000F08710B540F2C311AB4802F02FF8FF2212 +:105F20000821AA4802F022F8A84800210A38417046 +:105F30004FF46171418010BD70B50D460646FFF704 +:105F400049FFA14C102807D004EBC00191F84A1179 +:105F5000C90701D0012070BD6178082910D210282E +:105F600008D004EBC000012180F84A116078401C81 +:105F70006070EFE7012229463046FFF74AFFF5E758 +:105F8000002070BD70B5904D2878401E44B20AE0E4 +:105F900005EBC40090F84A01C00702D0E0B200F05F +:105FA0005EF9641E64B2002CF2DA70BD2DE9F04790 +:105FB000984691460C460746FFF70CFF0546102809 +:105FC00005D000F03BF9102801D012209FE77E4E4B +:105FD000B07808281FD2102D05D10022214638465E +:105FE000FFF717FF0546B4781022601CB07006EB6F +:105FF0000417F81C494600F04BFA07F18300102201 +:10600000414600F045FA3019002180F8035180F82C +:106010003B1108467BE7072079E76B4810B580788D +:10602000401E44B204E0E0B2FFF72FFF641E64B2EA +:10603000002CF8DA10BD65490A394870704763488A +:106040000A384078704740B14AF2B811884204D803 +:106050005E490A39488001207047002070475B483C +:106060000A384088704710B5FFF7B4FE102803D0F7 +:1060700000F0E4F8102800D1082010BD52498A78B9 +:10608000824203D901EB0010833070470020704733 +:106090004D498A78824203D901EB0010C01C704739 +:1060A00000207047484B10B59C7884420FD91844A3 +:1060B00090F8030103EBC00090F843310B70D0F867 +:1060C00044111160B0F848019080012010BD0020FB +:1060D00010BD3D4A114491F803213C490A390A7028 +:1060E00002684A6080880881704710B5FAF79FFC03 +:1060F00018B1BDE81040FAF7AABCFF2010BD324924 +:106100008A78824209D9084490F8030101EBC00063 +:1061100090F84A0100F001007047002070472DE917 +:10612000F04700252F46284E2BE000BF06EBC704A2 +:1061300004F5A271884694F84301FFF794FF814665 +:10614000FFF7A6FF94F84A11C90718D060B1B9F15A +:10615000080F05D206EB090191F83B11012903D084 +:10616000102100F086F950B11849284601F8059031 +:106170006D1C94F843214146EDB2FAF7F4FD7F1C03 +:10618000FFB23078B842D1D8C1E603460F4810B507 +:106190000A380A46407840B10B48817829B11A4440 +:1061A000C01CFAF7F6FB012010BD002010BD064A06 +:1061B00001EB410102EB41010268C1F80B2180882B +:1061C000A1F80F0170470000980B00204E0100203D +:1061D00001461022274800F05BB92648F2E726491D +:1061E0008A78824203D9084490F83B0108B1002024 +:1061F000E8E70120E6E72DE9F0410E46074615469F +:106200000621304600F035F91B4C58B1002004E05F +:106210002118401C81F83B51C0B2A1788142F7D8C7 +:106220000120F2E531463846FFF71DFF082803D06C +:10623000204480F83B51F3E70020E6E50E4910B515 +:10624000034600208A7806E00C1894F803419C422B +:1062500004D0401CC0B28242F6D8102010BD0649BE +:106260004A78521E4A7001EBC001002281F84A218F +:10627000E7E500005B0D0020980B002000F0010115 +:10628000400800F001021144400800F001021144EE +:10629000400800F001021144400800F001021144DE +:1062A000400800F001021144400800F001021144CE +:1062B00001EB5000704710B50024C484448DDB000E +:1062C0004C43B3FBF2F394FBF2F45B1C44859BB2AA +:1062D00003FB02F40385B4F5C84F01DD5B1E0385A3 +:1062E0004FF4FA43B3FBF2F35B1CC385438C02EB20 +:1062F000C3035B1EB3FBF2F30384C38B4B43B3FBBB +:10630000F2F1C18310BD70B50546087B0E4600F062 +:106310001F0008730020287604463019007AFFF722 +:10632000ADFF2919641CC874297EE4B2084428769C +:10633000052CF2D3C0B2252800D9FFDF70BD0023A1 +:10634000C383428401EBC202521EB2FBF1F101840D +:10635000704770B50025044600F13806032909D0BE +:10636000E9B3012967D002294ED101463046BDE884 +:106370007040C8E77821304601F022FEB571F57112 +:1063800035737573F573357475717576B57601204F +:1063900086F83E00412186F83F10FE2186F87310F2 +:1063A00084F82C50258484F8340084F835002821A2 +:1063B00084F8361060734FF448606080A4F8B050E1 +:1063C000A4F8B250A4F8B450A4F8B650A4F8B85049 +:1063D000A4F8BA5084F8BD5084F8BF5000E014E02F +:1063E000A4F8C65084F8C450A4F8D850A4F8DA50E1 +:1063F00084F87A5184F87B5184F8485184F85051DC +:1064000084F8535184F86C5170BDA4F8C65084F8D8 +:10641000BE506188F9480A460844B0FBF1F0A4F880 +:1064200058004BF68030A4F85A00E3883046FFF756 +:1064300042FF21469AE7A4F8C6504188B4F8783163 +:10644000B4F874213046BDE8704034E7037E0BB1E8 +:10645000252B01D9122070472AB14B7B2BB1012B80 +:1064600005D01F2070470020704700F0EEB900F003 +:1064700092B910B500231A4603E0845C2343521CF2 +:10648000D2B28A42F9D30BB1002010BD012010BD59 +:1064900030B5134606E0CC18D51A14F8014C5B1E33 +:1064A0004455DBB2002BF6D130BD70B50E468CB032 +:1064B000144601461D4610226846FFF7E9FF1022E8 +:1064C000314604A8FFF7E4FF684600F045FC08A940 +:1064D0004FF0100228461CB1FFF7DAFF0CB070BD78 +:1064E00001F0CDFCFAE738B505460C466846FAF7E8 +:1064F00010FF002820D09DF900002072A17E61725B +:1065000094F90A100022411A00D5494295F82D301D +:106510008B4210DCFF2B0ED0E17A491CC9B2E1722C +:1065200095F82E30994202D8A17A7F2903D1A07222 +:106530000020E0720122104638BD0C2813D00B2831 +:1065400011D00D280FD01C280DD01D280BD01E28CF +:1065500009D01F2807D0202805D0212803D02328C0 +:1065600001D0002070470120704710B5A2F10F0341 +:106570000C2939D2DFE801F006080D1215181C3875 +:106580002436382792B32FE0072A30D0082A2ED09D +:106590002AE00C2A2BD00B2A29D025E00D2A26D060 +:1065A00022E00C2B23D91FE0103A0B2A1FD91BE045 +:1065B000032B1CD990F83600B0B11B2A17D913E071 +:1065C000062A14D010E01C2A11D01D2A0FD01E2A32 +:1065D0000DD01F2A0BD0202A09D0212A07D0232A28 +:1065E00005D001E00E2A02D0002010BDFFE70120F7 +:1065F000FBE72DE9F0410C46054640F2337786680B +:1066000006E000BFF8F7C8FD3946F8F7CEFAA860F3 +:106610002846F8F78EFF0028F4D094B13046A968D8 +:10662000F9F7C8FA00280CDD2044401EB0FBF4F74F +:1066300007FB04F13046F8F7B8FAA8603846BDE821 +:10664000F0810020FBE770B5044690420AD2101B8F +:10665000642800D2642025188D4204D8F9F7DDFAA9 +:1066600008B1284670BD204670BD4FF4A470704735 +:106670004FF4A47070470844184498300AB10421BC +:1066800000E00021084470472DE9F0410E461B2729 +:10669000384691F8341000F06DF84FF4A474A0421D +:1066A00000D920460546384696F8351000F062F8C5 +:1066B000A04200D9204601462846BDE8F04100220C +:1066C0001346D8E7C10701D001207047810701D5E3 +:1066D00002207047400701D508207047002070470E +:1066E0002DE9F0410546164688460124084600F08B +:1066F00044FA0746404600F042FA0346FFF7E2FF3D +:1067000002463846FFF7DEFF52EA000100D10024BE +:10671000990700D10022B90700D1002095F8341064 +:10672000914200D10022327095F83510814200D19B +:10673000002070706AB960B9404600F022FA298FD3 +:10674000401A00B247F6FE71884201DC002800DCE6 +:106750000024204673E710B540F6C41254100129F6 +:1067600003D0022902D0FFDF02E008B110463CE767 +:1067700020463AE711F00C0F04D04FF4747101EB8E +:10678000801006E0022902D0C000703001E08000D5 +:106790003C3080B27047F0B50C7C8B7BCD7B5C408D +:1067A0004B7C02886B4044EA0323067E5A40002457 +:1067B000D5B2120A95FAA5F592FAA2F22D0E120E92 +:1067C00045EA022202EB0212641C1A44E4B292B2BD +:1067D000032CEDD35A402523B2FBF3F403FB14231F +:1067E00001EBD30543762F7A03F00704012505FA60 +:1067F00004F4274204D083761DE00000FFDB05008F +:106800005643320C521CD2B20023C418E47C94428A +:1068100013D30024CE18367A05FA04F73E4201D08D +:10682000521ED2B222B1641CE4B2082CF4D306E0AA +:1068300004EBC30181760020F0BD121BD2B25B1CB9 +:10684000DBB2052BE1D31F20F0BDF0B5437E0C7EFB +:10685000012504FB02322523B2FBF3F403FB1422CF +:1068600001EBD204427602F00703247A05FA03F31F +:106870001C4201D082761EE0037EB2FBF3F403FBE0 +:106880001422521CD2B20023C418E47C944214D3C4 +:106890000024CE1896F8086005FA04F73E4201D0AD +:1068A000521ED2B222B1641CE4B2082CF4D306E02A +:1068B00004EBC30181760020F0BD121BD2B25B1C39 +:1068C000DBB2052BE0D31F20F0BD0000282101F032 +:1068D00055BB30B50546007801F00F0220F00F00DF +:1068E00010432870092910D2DFE801F005070507D9 +:1068F0000509050B0D00062409E00C2407E02224FD +:1069000005E0012403E00E2401E00024FFDF6C70A9 +:1069100030BD007800F00F0070470A6840F8032F80 +:106920008988818070470A6840F8092F89888180AA +:1069300070470278402322F0400203EA81110A43A3 +:1069400002707047027822F0800242EAC11202709F +:10695000704770B514460E4605461F2A00D9FFDF62 +:106960002246314605F1090001F089FAA41D6C7038 +:1069700070BD70B514460E4605461F2A00D9FFDFCC +:106980002246314605F1090001F079FAA41D6C7028 +:1069900070BD30B5017801F00F01032920D0052921 +:1069A00021D14578B0F81910B0F81B40B0F8173075 +:1069B000827D222D17D1062915D34FF44865A942AF +:1069C00011D8B4F5FA7F0ED26AB1082A0BD88A42E0 +:1069D00009D28B4207D8B0F81D00A84205D902E0C1 +:1069E00040780C2801D0002030BD012030BD407817 +:1069F000704700B5027801F0030322F003021A4346 +:106A00000270012905D0022903D0032903D0FFDF3A +:106A100000BD002100E00121417000BD00B50278F9 +:106A200001F0030322F003021A430270012905D08A +:106A3000022903D0032903D0FFDF00BD002100E0BD +:106A40000121417000BD007800F0030070474178DB +:106A500089B1C0780E2805D00F2803D0102801D0A6 +:106A6000192802D31B2904D905E05B4A105C88422F +:106A700001D1012070470020704730B50124054640 +:106A8000C170192902D25448445C02E0FF2900D0A9 +:106A9000FFDF6C7030BD70B514460E4605461B2AEC +:106AA00000D9FFDF6C7022463146E81CBDE870401B +:106AB00001F0E5B9B0F807007047B0F80900704779 +:106AC000B0F80B00704770B5B0F80720B0F8094077 +:106AD000B0F805300179951F40F67A46B54210D8D6 +:106AE000B4F5FA7F0DD261B108290AD8914208D2D3 +:106AF000934206D8B0F80B00B0F5486F01D80120DA +:106B000070BD002070BD42680A60007A087170474D +:106B1000B0F8090070470079704742680A608068E1 +:106B20004860704780890880704750F80E2F0A60CF +:106B3000406848607047D0F81600086070470A68DF +:106B400042604968816070470968C1607047007998 +:106B5000704742680A608068486070470A6842600F +:106B60004968816070470179490704D0407940073E +:106B700001D00120704700207047007970474079AC +:106B80007047C08870470CB514A2D2E90012CDE955 +:106B900000120179407901F0070269461DF80220D0 +:106BA000012A04D800F00700085C012801D9002060 +:106BB0000CBD01200CBD0171704700797047417117 +:106BC00070474079704730B50C4605461B2900D9FF +:106BD000FFDF6C7030BD000008850100000101027C +:106BE0000102020370B50C46A0F12001312901D346 +:106BF00001200CE041280CD020CC094E94E80E0076 +:106C000006EB8000241F50F8806C2846B0472060B7 +:106C100070BD2046EAF7C8FAF9E706207047000081 +:106C20002485010010B5524800F01CFA00B1FFDFC6 +:106C30004F48401C00F016FA002800D0FFDF10BDBE +:106C40002DE9F14F4B4ED6F800B00127484800F02F +:106C500011FADFF81C8128B95FF0000708F1010084 +:106C600000F01EFA444C00254FF00309012060603B +:106C7000C4F80051C4F80451009931602060DFF875 +:106C8000FCA018E0DAF80000C00614D50E2000F0D1 +:106C900064F8EFF3108010F0010072B600D001200C +:106CA000C4F80493D4F8001119B9D4F8041101B947 +:106CB00020BF00B962B6D4F8000118B9D4F80401B5 +:106CC0000028DFD0D4F804010028CFD137B1C6F8AE +:106CD00000B008F1010000F0CDF911E008F1010069 +:106CE00000F0C8F90028B9D1C4F80893C4F80451D9 +:106CF000C4F800510E2000F030F81D4800F0D0F923 +:106D00000020BDE8F88F2DE9F0438DB00D46064612 +:106D100000240DF110090DF1200817E004EB4407E1 +:106D2000102255F82710684601F0A9F805EB8707EF +:106D300010224846796801F0A2F86846FFF780FF04 +:106D400010224146B86801F09AF8641CB442E5DBB1 +:106D50000DB00020BDE8F08372E700F01F020121B2 +:106D600091404009800000F1E020C0F88012704797 +:106D70005601002004E5004000E0004010ED00E076 +:106D8000AE4900200870704770B5AD4D01232B60EF +:106D9000AC4B1C68002CFCD0002407E00E68066099 +:106DA0001E68002EFCD0001D091D641C9442F5D302 +:106DB0000020286018680028FCD070BD70B59F4E78 +:106DC0000446A14D3078022800D0FFDFAC4200D34A +:106DD000FFDF71699D48012903D847F23052944280 +:106DE00001DD03224271491C7161291BC160974971 +:106DF0007078F8F719FC002800D1FFDF70BD70B57E +:106E00008E4C0D466178884200D0FFDF8E4E082DF3 +:106E10004BD2DFE805F04A041E2D4A4A4A38207852 +:106E2000022800D0FFDF03202070A078012801D0C5 +:106E300020B108E0A06800F07FFD04E004F1080044 +:106E400007C8FFF7A1FF05202070BDE87040F8F7E4 +:106E5000AFB8F8F7A1F901466068F8F7ABFEB042A9 +:106E600002D2616902290BD30320F9F756F912E027 +:106E7000F8F792F901466068F8F79CFEB042F3D249 +:106E8000BDE870409AE7207802280AD0052806D08D +:106E9000FFDF04202070BDE8704000F0C5B802207C +:106EA00000E00320F9F739F9F3E7FFDF70BD70B5B3 +:106EB0000546F8F771F9614C60602078012800D030 +:106EC000FFDF6249012008700020087104208D60F6 +:106ED00048715D48C860022020706078F8F7A4FB14 +:106EE000002800D1FFDF70BD10B5544C207838B9B0 +:106EF0000220F9F728F918B90320F9F724F908B1A5 +:106F0000112010BD5248F8F7CEF86070202804D048 +:106F1000012020700020606110BD032010BD2DE90C +:106F2000F041144600EB84070E4605463F1F00F073 +:106F300016FD4FF080521169484306EB8401091F8A +:106F4000B14201D2012100E000211CB11269B4EB71 +:106F5000920F02D90920BDE8F0813E4A95420ED336 +:106F6000AF420CD3854205D2874203D245EA0600E0 +:106F7000800701D01020EEE7964200D309B10F2020 +:106F8000E9E7354835490068884205D02246314650 +:106F90002846FFF7F9FE10E0FFF7A6FF0028DAD138 +:106FA000264800218560C0E9036481704FF4A9710F +:106FB00004FB01F01830FFF77AFF0020CBE770B533 +:106FC0004FF08055044628692249B1FBF0F0844215 +:106FD00001D20F2070BD00F0C2FCA04201D81020E9 +:106FE00070BD1D481D490068884204D0286960436F +:106FF00000F0A2FC0CE0FFF777FF0028F0D1296930 +:107000000E4861438160012181701548FFF74FFFF1 +:10701000002070BD30B452EA030402D030BC062018 +:10702000704730BC00F0E4BE10B5044C6078F8F74F +:1070300094F800B9FFDF0020207010BD5801002037 +:1070400004E5014000E40140105C0C006C0D0020E0 +:10705000FF6D010000900100A4000020BEBAFECA2E +:107060007C5E010000210170084670470146002047 +:1070700008707047EFF3108101F0010172B60278D9 +:10708000012A01D0012200E000220123037001B98E +:1070900062B60AB1002070474FF400507047E9E72C +:1070A000EFF3108111F0010F72B64FF00002027081 +:1070B00000D162B600207047F2E700004C49096831 +:1070C0000160002070474A49086000207047012194 +:1070D0008A0720B1012804D042F20400704791676A +:1070E00000E0D1670020704742490120086042F269 +:1070F0000600704708B504233E4A1907103230B124 +:10710000C1F80433106840F0010010600BE0106813 +:1071100020F001001060C1F808330020C1F8080118 +:10712000354800680090002008BD011F0B2909D8D0 +:10713000304910310A6822F01E0242EA400008601D +:107140000020704742F205007047000100F18040C6 +:10715000C0F8041900207047000100F18040C0F819 +:10716000081900207047000100F18040D0F80009A4 +:10717000086000207047012801D9072070471F4A86 +:1071800052F8200002680A4302600020704701287C +:1071900001D907207047194A52F8200002688A4333 +:1071A000026000207047012801D907207047134A68 +:1071B00052F8200000680860002070470200104963 +:1071C0004FF0000003D0012A01D0072070470A6069 +:1071D00070474FF080410020C1F808014FF0E020D7 +:1071E000802180F800140121C0F8001170470000D0 +:1071F000000400400005004008010040E88501004F +:10720000780500406249634B0A6863499A420968FD +:1072100001D1C1F310010160002070475C495D4B52 +:107220000A685D49091D9A4201D1C0F31000086047 +:10723000002070475649574B0A68574908319A420F +:1072400001D1C0F3100008600020704730B5504BEA +:10725000504D1C6842F20803AC4202D0142802D2FE +:1072600003E0112801D3184630BDC3004B48184431 +:10727000C0F81015C0F81425002030BD4449454B16 +:107280000A6842F209019A4202D0062802D203E0BB +:10729000042801D308467047404A012142F83010C3 +:1072A000002070473A493B4B0A6842F209019A4272 +:1072B00002D0062802D203E0042801D30846704712 +:1072C000364A012102EBC00041600020704770B5D2 +:1072D0002F4A304E314C156842F2090304EB80020C +:1072E000B54204D0062804D2C2F8001807E00428EA +:1072F00001D3184670BDC1F31000C2F80008002089 +:1073000070BD70B5224A234E244C156842F2090321 +:1073100004EB8002B54204D0062804D2D2F800085B +:1073200007E0042801D3184670BDD2F80008C0F366 +:1073300010000860002070BD174910B508311848CA +:1073400008601120154A002102EBC003C3F8101594 +:10735000C3F81415401C1428F6D3002006E00428B6 +:1073600004D302EB8003C3F8001807E002EB8003AC +:10737000D3F80048C4F31004C3F80048401C0628A2 +:10738000EDD310BD0449064808310860704700007D +:10739000A4000020BEBAFECA00F5014000F0014082 +:1073A0000000FEFF784B1B6803B19847BFF34F8F77 +:1073B00076480168764A01F4E06111430160BFF349 +:1073C0004F8FFEE710B5EFF3108010F0010F72B68B +:1073D00001D0012400E0002400F0CDF850B1E9F71D +:1073E0007FFFF7F7A6FCF8F73BFEEBF7DCFC6949FB +:1073F0000020086004B962B6002010BD70B50C46CC +:107400000546EFF3108010F0010F72B601D001268F +:1074100000E0002600F0AFF818B106B962B6082007 +:1074200070BDE9F7D7FEE9F75FFF02460020430988 +:107430009B0003F1E02300F01F01D3F80031CB40A3 +:10744000D9071BD0202803D222FA00F1C90722D184 +:1074500041B2002906DA01F00F0101F1E02191F8B3 +:10746000141D03E001F1E02191F8001449090829F5 +:1074700011D281B101290ED004290CD0401C6428FE +:10748000D5D3EBF78FFC4349434808602046F9F712 +:1074900001FA60B904E006B962B641F2010070BDBC +:1074A000394804602DB12846F9F741FA18B1102483 +:1074B0002CE03A4D19E02878022802D94FF4805484 +:1074C00024E007240028687801D0F8B908E0E8B182 +:1074D00020281BD8A878212818D8012816D001E028 +:1074E000A87898B9E8780B2810D82D49802081F821 +:1074F000140DE9F7F9FE2946F8F798FDF7F7D8FBE0 +:1075000000F060FA2846E9F7BDFE044606B962B607 +:107510001CB1FFF757FF204670BD002070BD10B5AD +:10752000044600F028F800B101202070002010BDB2 +:107530001C4908600020704710B50C46102808D080 +:1075400011280BD012280CD013280ED0012008606F +:1075500010BDD4E90001FFF751FF0AE0FFF732FF49 +:1075600007E02068FFF7DBFF03E00E4920680860B2 +:107570000020206010BD074807490068884201D1FB +:107580000120704700207047700100200CED00E0E2 +:107590000400FA05A4000020BEBAFECAF08501006E +:1075A0000BE000E00400002000B5C04910F1080F16 +:1075B00019D00CDC10F1280F1DD010F1140F18D0C9 +:1075C00010F1100F13D010F10C0F08D10DE010F1D5 +:1075D000040F06D080B103280ED004280CD0FFDFA2 +:1075E00000BDFC2008E0F82006E0F42004E0F020D4 +:1075F00002E0EC2000E0D820086000BDAB4900B5F7 +:10760000091D012803D0022803D0FFDF00BD03209D +:1076100000E00420086000BDA54930B1012803D175 +:10762000086840F0010008607047086820F0010019 +:10763000F9E72DE9F0411E4604464FF4C86040F6D4 +:10764000980340F6E4474FF47A75012917D0022ACF +:1076500024D0012A25D0042A25D0964938460F186F +:107660003046F9F7CEFF07443046F9F7E4FF3844D7 +:1076700000F27120B0FBF5F0201ABDE8F081022A7B +:1076800008D0012A02D0042A06D0384649F608510B +:107690004718E5E72846F9E71846F7E786492846F8 +:1076A000DDE78649DBE786491846D8E770B514461A +:1076B000064601291CD0022B1DD0012B1ED0042B05 +:1076C0001ED0804DFA351046F9F7A8FF4FF47A71B5 +:1076D000012C17D0022C17D0042C18D0CA00AA1ADB +:1076E000104400F28920B0FBF1F0301A801E70BD0A +:1076F00049F6CA65E7E7704D643DE3E76F4DE1E7A2 +:107700006F4DDFE70A46EAE74FF4FA72E7E74FF416 +:10771000FA62E4E72DE9F041144605464FF4C860EB +:1077200040F6980240F6E4474FF47A7601291BD0E0 +:10773000022B28D0012B29D0042B29D05D493846B3 +:107740000F182046F9F76AFF0146012C23D0022CBE +:1077500023D0042C24D04FF4FA50381A084464384B +:10776000B0FBF6F0281A88E7022B08D0012B02D0D4 +:10777000042B06D0384649F608514718E1E7304651 +:10778000F9E71046F7E74C493046D9E74B49D7E7C8 +:107790004B491046D4E73046DFE74FF4FA70DCE798 +:1077A0004FF4FA60D9E770B516460546012918D09E +:1077B000022B19D0012B1AD0042B1AD0414CFA34C9 +:1077C0001046F9F71EFF04443046F9F734FF204411 +:1077D0004FF47A7100F2E140B0FBF1F0281A801EFC +:1077E00070BD49F6CA64EBE7334C643CE7E7334CC1 +:1077F000E5E7334CE3E72DE9F04106461D460C462C +:107800009046104600F048F806EB4601C1EBC61161 +:1078100000EBC1004FF47A76012C14D0022C14D066 +:10782000042C15D0F10047182046F9F7F7FE381A56 +:1078300000F60F60B0FBF6F44046F9F7D8FE20449E +:107840002844401D19E73146EDE74FF4FA71EAE7A5 +:107850004FF4FA61E7E770B5044615460E46084650 +:10786000F9F7CFFE04EB4401C1EBC411C0EBC10436 +:107870003046F9F7E0FE241A284600F00DF82044BF +:107880004FF47A7100F6B730B0FBF1F42846F9F7FF +:10789000AEFE2044401D70BD082803D0042801D04E +:1078A000F9F7AFBE4DF68830704700000C15004068 +:1078B0005016004030D3010068360200A2240200B6 +:1078C000D0FB0100C0D401002DE9FE430C468046E8 +:1078D000FFF7B9F8074698F80160204601A96A4603 +:1078E000F5F705F905000DD0012F02D00320BDE802 +:1078F000FE83204602AA0199F5F71BF80298B0F81A +:1079000003000AE0022F14D1042E12D3B8F80300AA +:10791000BDF80020011D914204D8001D80B2A919B4 +:10792000814202D14FF00000E1E702D24FF00100A6 +:10793000DDE74FF00200DAE70B4A022111600B4944 +:107940000B68002BFCD0084B1B1D18600868002832 +:10795000FCD00020106008680028FCD070474FF071 +:10796000805040697047000004E5014000E4014098 +:1079700002000B464FF00000014620D0012A04D03F +:10798000022A04D0032A0DD103E0012002E00220E4 +:1079900015E00320072B05D2DFE803F00406080AF0 +:1079A0000C0E100007207047012108E0022106E0BC +:1079B000032104E0042102E0052100E00621F7F79D +:1079C0008EBB0000F94805218170002101704170D3 +:1079D0007047F7490A78012A05D0CA681044C86080 +:1079E0004038F8F7B4B88A6810448860F8E700288F +:1079F00019D00378EF49F04A13B1012B0ED011E0F2 +:107A00000379012B00D06BB943790BB1012B09D15C +:107A10008368643B8B4205D2C0680EE00379012B7A +:107A200002D00BB10020704743790BB1012BF9D183 +:107A3000C368643B8B42F5D280689042F2D8012043 +:107A40007047DB4910B501220A700279A2B1002209 +:107A50000A71427992B104224A718268D34C52323F +:107A60008A60C0681434C8606060F7F795FBCF493E +:107A700020600220887010BD0322E9E70322EBE7B3 +:107A800070B5044609B1012000E00320C84D002173 +:107A90002970217901B100202871607968B1042032 +:107AA000C24E6871A168F068F7F77FF8A860E068D7 +:107AB0005230E8600320B07070BD0320F0E72DE97C +:107AC000F04105460226F7F76EFF006800B1FFDFC0 +:107AD000B64C01273DB12878B0B1012805D0022865 +:107AE00010D0032813D027710CE06868C82807D38A +:107AF000F8F793F820B16868FFF76BFF012603E001 +:107B0000002601E000F05CF93046BDE8F081207805 +:107B10000028F7D16868FFF76AFF0028E3D068689B +:107B2000017879B1A078042800D0FFDF01216868CE +:107B3000FFF7A6FF9E49E078F7F776FD0028E1D130 +:107B4000FFDFDFE7FFF77DFF6770DBE72DE9F04739 +:107B5000964C8846E178884200D0FFDFDFF84C92EF +:107B600000250127924E09F11409B8F1080F75D2CA +:107B7000DFE808F0040C28527A808D95A07803285D +:107B800002D0022800D0FFDFBDE8F087A0780328EC +:107B900002D0022800D0FFDF0420A07025712078D9 +:107BA000002878D1FFF715FF3078012806D0B0689B +:107BB000E06000F024F92061002060E0E078F7F751 +:107BC00030FCF5E7A078032802D0022800D0FFDFC0 +:107BD000207800286DD1A078032816D0F7F7DCFABA +:107BE00001464F46D9F80000F7F7E4FF00280EDB06 +:107BF000796881420BDB081AF0606D49E078F7F78D +:107C000013FD0028C0D1FFDFBEE7042028E00420D8 +:107C1000F8F783FAA570B7E7A078032802D0022806 +:107C200000D0FFDF207888BBA078032817D0F7F7B3 +:107C3000B3FA01464F46D9F80000F7F7BBFF00281A +:107C4000E5DB79688142E2DB081AF0605849E078A8 +:107C5000F7F7EAFC002897D1FFDF95E740E0052021 +:107C6000F8F75BFAA7708FE7A078042800D0FFDF51 +:107C7000022004E0A078042800D0FFDF0120A168E2 +:107C80008847FFF71CFF054630E004E011E0A078CC +:107C9000042800D0FFDFBDE8F04700F091B8A078DD +:107CA000042804D0617809B1022800D0FFDF2078D1 +:107CB00018B1BDE8F04700F08CB8207920B106205B +:107CC000F8F72BFA2571CDE7607838B13849E078BC +:107CD000F7F7AAFC00B9FFDF657055E70720BFE79B +:107CE000FFDF51E73DB1012D03D0FFDF022DF9D1B8 +:107CF0004AE70420C3E70320C1E770B5050004D0BC +:107D00002A4CA078052806D101E0102070BD08207B +:107D1000F8F719FA08B1112070BD2848F7F7C3F930 +:107D2000E070202803D00020A560A07070BD032063 +:107D300070BD1E4810B5017809B1112010BD8178C1 +:107D4000052906D0012906D029B1012101700020A2 +:107D500010BD0F2010BD00F03CF8F8E770B5134CD3 +:107D60000546A07808B1012809D155B12846FFF78A +:107D70003EFE40B1287840B1A078012809D00F20FC +:107D800070BD102070BD072070BD2846FFF759FE5A +:107D900003E000212846FFF773FE0549E078F7F776 +:107DA00043FC00B9FFDF002070BD0000740100201B +:107DB0007C0D00203D860100FF1FA1074D7B0100C7 +:107DC0000A4810B5006900F019F8BDE81040F7F74F +:107DD000EFB8064810B5C078F7F7BFF900B9FFDF74 +:107DE0000820F8F79AF9BDE81040EBE5740100208F +:107DF000094A1060101D0160002070477047002084 +:107E00007047054B02465B4210201344FC2B01D8FF +:107E10001160002070470000000600407047704766 +:107E200070477047704740EA010310B59B070FD1B8 +:107E3000042A0DD310C808C9121F9C42F8D020BADA +:107E400019BA884201D9012010BD4FF0FF3010BD92 +:107E50001AB1D30703D0521C07E0002010BD10F860 +:107E6000013B11F8014B1B1B07D110F8013B11F826 +:107E7000014B1B1B01D1921EF1D1184610BD032AE4 +:107E800040F2308010F0030C00F0158011F8013B37 +:107E9000BCF1020F624498BF11F801CB00F8013B1E +:107EA00038BF11F8013BA2F1040298BF00F801CBE2 +:107EB00038BF00F8013B11F0030300F02580083AB9 +:107EC000C0F0088051F8043B083A51F804CBA0E810 +:107ED0000810F5E7121D5CBF51F8043B40F8043B65 +:107EE000AFF30080D20724BF11F8013B11F801CB9A +:107EF00048BF11F8012B24BF00F8013B00F801CB6B +:107F000048BF00F8012B704710B5203AC0F00B8035 +:107F1000B1E81850203AA0E81850B1E81850A0E88D +:107F20001850BFF4F5AF5FEA027C24BFB1E81850E7 +:107F3000A0E8185044BF18C918C0BDE810405FEA57 +:107F4000827C24BF51F8043B40F8043B08BF7047D3 +:107F5000D20728BF31F8023B48BF11F8012B28BFD8 +:107F600020F8023B48BF00F8012B704702F0FF03E6 +:107F700043EA032242EA024200F002B84FF0000254 +:107F80000429C0F0128010F0030C00F01B80CCF12B +:107F9000040CBCF1020F18BF00F8012BA8BF20F899 +:107FA000022BA1EB0C0100F00DB85FEAC17C24BFED +:107FB00000F8012B00F8012B48BF00F8012B704797 +:107FC0004FF0000200B5134694469646203922BF72 +:107FD000A0E80C50A0E80C50B1F12001BFF4F7AFBD +:107FE000090728BFA0E80C5048BF0CC05DF804EB9F +:107FF000890028BF40F8042B08BF704748BF20F80D +:10800000022B11F0804F18BF00F8012B704770470A +:108010007047704770470000FEDF04207146084239 +:1080200019D10699124A914215DC0699023948780D +:10803000DF2810D10878FE2807D0FF280BD14FF099 +:1080400001004FF000020B4B184741F2010000996C +:10805000019A084B1847084B002B02D01B68DB68BD +:1080600018474FF0FF3071464FF00002014B1847A0 +:1080700000900100A5730100040000201848194970 +:108080007047FFF7FBFFE9F789F800BD4FF4805018 +:1080900015490968884203D1144A13605B68184780 +:1080A00000BD000020BFFDE74FF480500E49096875 +:1080B000884210D10E4B18684FF0FF318842F1D042 +:1080C00080F308884FF02021884204DD09480268C7 +:1080D00003210A4302600848804708488047FFDFC1 +:1080E000900D0020900D00200000002004000020D2 +:1080F00000900100140900406D0901008D8001000D +:1081000004207146084202D0EFF3098101E0EFF349 +:108110000881886902380078102813DB20280FDBDB +:108120002C280BDB0A4A12680A4B9A4203D16028BA +:1081300004DB094A1047022008607047074A1047CD +:10814000074A1047074A12682C321268104700008D +:10815000A4000020BEBAFECAED120000E56B0100CB +:1081600039750100040000200D4B0E4908470E4BE5 +:108170000C4908470D4B0B4908470D4B0949084767 +:108180000C4B084908470C4B064908470B4B05495F +:1081900008470B4B034908470A4B024908470000B0 +:1081A000D98C0000A12E00008D2C00009B890000BE +:1081B0002F890000132D0000F3120000752C000021 +:1081C000452E0000A9110000717F00005F810000B2 +:1081D000BF820000E38200001D8300005183000085 +:1081E0008D830000BD8300002B8400007B80000095 +:1081F0006F1200006F1200000920000053200000E1 +:1082000075200000FD20000019220000DB22000084 +:108210000D230000F9230000D92400002B250000C5 +:10822000AD250000CD2500000B2A00002F2A0000FC +:108230005F290000B3290000612A0000F52A000030 +:10824000333D00000D3E0000494100004742000060 +:10825000BD420000274300008B4300007312000062 +:108260007F440000EB440000EF250000F5250000EE +:1082700073120000731200007312000073120000EA +:10828000FF25000037260000731200007312000063 +:10829000731200006F1200006F1200006F120000D6 +:1082A0006F1200006F1200006F1200006F120000CA +:1082B0006F120000F75200007D5300009953000038 +:1082C000B553000043550000DF530000E9530000A0 +:1082D0002B5400004D540000295500006B55000040 +:1082E0006F1200006F120000DB6D0000FB6D0000DC +:1082F000FD6D0000416E00006F6E00005D6F0000BC +:10830000EB6F0000FF6F00004D7000003D7100003A +:10831000E37200000D740000EF5D000025740000A2 +:108320006F1200006F120000731200007312000041 +:10833000731200007312000073120000100110018C +:108340003A0200001A02000405060000B37A000099 +:10835000A17A0000FFFFFFFF0000FFFF37B300001E +:108360009D1B00009D4E0000395E000073780000E8 +:1083700000000000876B0000676B0000D56B0000F9 +:10838000795200003B5200005B520000EFB1000048 +:108390007DB2000041370000F56B000000000000D6 +:1083A000256C0000C7520000000000000000000023 +:1083B0000000000000000000C1370000513500003F +:1083C00051350000E51F00009DB20000BB600000B9 +:1083D000AF4D00000F4801007F3500007F350000E1 +:1083E00007200000C9B200003F610000214E0000DC +:1083F0002348010070017001400034005C0024003B +:10840000C00100000300656C746200000000000001 +:1084100000000000000000000000870000000000D5 +:1084200000000000000000000000BE83605ADB0B6B +:10843000376038A5F5AA9183886C00000100000020 +:1084400001D70000C9E50000000000010206030496 +:10845000050000000700000000000000060000000A +:108460000A0000003200000073000000B4000000A9 +:10847000113501000000000015240100E356010041 +:108480000000000000000000292701007F5B0100C0 +:10849000000000000000000075230100275B0100C0 +:1084A000000000000000000013240100F556010048 +:1084B0000000000000000000E3270100C15C010093 +:1084C0000000000000000000555555D6BE898E0002 +:1084D0000000C706C70CC71200006B030F06B308E5 +:1084E0000000B704A708970CF401FA009600640096 +:1084F0004B0032001E0014000A00050002000100BB +:1085000000410000000000000C0802170D010102EC +:1085100009090101060209181803010109090303E9 +:1085200005000000057201001D7201003572010096 +:108530004D7201007D720100A5720100CF72010031 +:1085400003730100BF6F01001F6F01001570010070 +:10855000037E01006570010075700100A1700100CB +:10856000730201007B0201008D020100CF70010047 +:10857000E9700100BD700100C7700100F5700100D5 +:108580002B7101001B6C01004B710100597101003E +:1085900067710100777101008F710100A7710100FF +:1085A000BD7101001B6C010000000000078B000082 +:1085B0005D8B0000738B000071790100416C01003C +:1085C000076D0100FB7C0100337D01005D7D010032 +:1085D000BD000100410401001B6C01001B6C010087 +:1085E0001B6C01001B6C01001C05004020050040B5 +:1085F000001002001486010008000020880100001D +:10860000441100004886010090010020000C000089 +:108610008011000001190545100E002036010001EF +:1086200000703720FB349B5F80041B8000100D21FD +:10863000F7070020B40700203A0800200581100940 +:088640000020024C10000000B4 +:00000001FF diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/hex/s112_nrf52810_5.1.0_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf52_6.0.0_licence-agreement.txt similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/hex/s112_nrf52810_5.1.0_licence-agreement.txt rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf52_6.0.0_licence-agreement.txt index 00c2e54c47..a71adee7b9 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/hex/s112_nrf52810_5.1.0_licence-agreement.txt +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf52_6.0.0_licence-agreement.txt @@ -1,4 +1,4 @@ -Copyright (c) 2007 - 2017, Nordic Semiconductor ASA +Copyright (c) 2007 - 2018, Nordic Semiconductor ASA All rights reserved. Redistribution and use in source and binary forms, with or without modification, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf52_6.0.0_migration-document.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf52_6.0.0_migration-document.pdf new file mode 100644 index 0000000000..e88cd69f04 Binary files /dev/null and b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf52_6.0.0_migration-document.pdf differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf52_6.0.0_release-notes.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf52_6.0.0_release-notes.pdf new file mode 100644 index 0000000000..827c06bbfc Binary files /dev/null and b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf52_6.0.0_release-notes.pdf differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_err.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_err.h similarity index 90% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_err.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_err.h index 1b0b9d4435..1b4820dc3d 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_err.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_err.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -65,7 +65,9 @@ extern "C" { #define BLE_ERROR_NOT_ENABLED (NRF_ERROR_STK_BASE_NUM+0x001) /**< @ref sd_ble_enable has not been called. */ #define BLE_ERROR_INVALID_CONN_HANDLE (NRF_ERROR_STK_BASE_NUM+0x002) /**< Invalid connection handle. */ #define BLE_ERROR_INVALID_ATTR_HANDLE (NRF_ERROR_STK_BASE_NUM+0x003) /**< Invalid attribute handle. */ -#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x004) /**< Invalid role. */ +#define BLE_ERROR_INVALID_ADV_HANDLE (NRF_ERROR_STK_BASE_NUM+0x004) /**< Invalid advertising handle. */ +#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x005) /**< Invalid role. */ +#define BLE_ERROR_BLOCKED_BY_OTHER_LINKS (NRF_ERROR_STK_BASE_NUM+0x006) /**< The attempt to change link settings failed due to the scheduling of other links. */ /** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gap.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gap.h similarity index 58% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gap.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gap.h index 13f7721c58..8b13816106 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gap.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gap.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -45,10 +45,13 @@ #ifndef BLE_GAP_H__ #define BLE_GAP_H__ - -#include "ble_types.h" -#include "ble_ranges.h" +#include #include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" #ifdef __cplusplus extern "C" { @@ -61,43 +64,45 @@ extern "C" { */ enum BLE_GAP_SVCS { - SD_BLE_GAP_ADDR_SET = BLE_GAP_SVC_BASE, /**< Set own Bluetooth Address. */ - SD_BLE_GAP_ADDR_GET, /**< Get own Bluetooth Address. */ - SD_BLE_GAP_WHITELIST_SET, /**< Set active whitelist. */ - SD_BLE_GAP_DEVICE_IDENTITIES_SET, /**< Set device identity list. */ - SD_BLE_GAP_PRIVACY_SET, /**< Set Privacy settings*/ - SD_BLE_GAP_PRIVACY_GET, /**< Get Privacy settings*/ - SD_BLE_GAP_ADV_DATA_SET, /**< Set Advertising Data. */ - SD_BLE_GAP_ADV_START, /**< Start Advertising. */ - SD_BLE_GAP_ADV_STOP, /**< Stop Advertising. */ - SD_BLE_GAP_CONN_PARAM_UPDATE, /**< Connection Parameter Update. */ - SD_BLE_GAP_DISCONNECT, /**< Disconnect. */ - SD_BLE_GAP_TX_POWER_SET, /**< Set TX Power. */ - SD_BLE_GAP_APPEARANCE_SET, /**< Set Appearance. */ - SD_BLE_GAP_APPEARANCE_GET, /**< Get Appearance. */ - SD_BLE_GAP_PPCP_SET, /**< Set PPCP. */ - SD_BLE_GAP_PPCP_GET, /**< Get PPCP. */ - SD_BLE_GAP_DEVICE_NAME_SET, /**< Set Device Name. */ - SD_BLE_GAP_DEVICE_NAME_GET, /**< Get Device Name. */ - SD_BLE_GAP_AUTHENTICATE, /**< Initiate Pairing/Bonding. */ - SD_BLE_GAP_SEC_PARAMS_REPLY, /**< Reply with Security Parameters. */ - SD_BLE_GAP_AUTH_KEY_REPLY, /**< Reply with an authentication key. */ - SD_BLE_GAP_LESC_DHKEY_REPLY, /**< Reply with an LE Secure Connections DHKey. */ - SD_BLE_GAP_KEYPRESS_NOTIFY, /**< Notify of a keypress during an authentication procedure. */ - SD_BLE_GAP_LESC_OOB_DATA_GET, /**< Get the local LE Secure Connections OOB data. */ - SD_BLE_GAP_LESC_OOB_DATA_SET, /**< Set the remote LE Secure Connections OOB data. */ - SD_BLE_GAP_ENCRYPT, /**< Initiate encryption procedure. */ - SD_BLE_GAP_SEC_INFO_REPLY, /**< Reply with Security Information. */ - SD_BLE_GAP_CONN_SEC_GET, /**< Obtain connection security level. */ - SD_BLE_GAP_RSSI_START, /**< Start reporting of changes in RSSI. */ - SD_BLE_GAP_RSSI_STOP, /**< Stop reporting of changes in RSSI. */ - SD_BLE_GAP_SCAN_START, /**< Start Scanning. */ - SD_BLE_GAP_SCAN_STOP, /**< Stop Scanning. */ - SD_BLE_GAP_CONNECT, /**< Connect. */ - SD_BLE_GAP_CONNECT_CANCEL, /**< Cancel ongoing connection procedure. */ - SD_BLE_GAP_RSSI_GET, /**< Get the last RSSI sample. */ - SD_BLE_GAP_PHY_UPDATE, /**< Initiate or respond to a PHY Update Procedure. */ - SD_BLE_GAP_DATA_LENGTH_UPDATE, /**< Initiate or respond to a Data Length Update Procedure. */ + SD_BLE_GAP_ADDR_SET = BLE_GAP_SVC_BASE, /**< Set own Bluetooth Address. */ + SD_BLE_GAP_ADDR_GET = BLE_GAP_SVC_BASE + 1, /**< Get own Bluetooth Address. */ + SD_BLE_GAP_WHITELIST_SET = BLE_GAP_SVC_BASE + 2, /**< Set active whitelist. */ + SD_BLE_GAP_DEVICE_IDENTITIES_SET = BLE_GAP_SVC_BASE + 3, /**< Set device identity list. */ + SD_BLE_GAP_PRIVACY_SET = BLE_GAP_SVC_BASE + 4, /**< Set Privacy settings*/ + SD_BLE_GAP_PRIVACY_GET = BLE_GAP_SVC_BASE + 5, /**< Get Privacy settings*/ + SD_BLE_GAP_ADV_SET_CONFIGURE = BLE_GAP_SVC_BASE + 6, /**< Configure an advertising set. */ + SD_BLE_GAP_ADV_START = BLE_GAP_SVC_BASE + 7, /**< Start Advertising. */ + SD_BLE_GAP_ADV_STOP = BLE_GAP_SVC_BASE + 8, /**< Stop Advertising. */ + SD_BLE_GAP_CONN_PARAM_UPDATE = BLE_GAP_SVC_BASE + 9, /**< Connection Parameter Update. */ + SD_BLE_GAP_DISCONNECT = BLE_GAP_SVC_BASE + 10, /**< Disconnect. */ + SD_BLE_GAP_TX_POWER_SET = BLE_GAP_SVC_BASE + 11, /**< Set TX Power. */ + SD_BLE_GAP_APPEARANCE_SET = BLE_GAP_SVC_BASE + 12, /**< Set Appearance. */ + SD_BLE_GAP_APPEARANCE_GET = BLE_GAP_SVC_BASE + 13, /**< Get Appearance. */ + SD_BLE_GAP_PPCP_SET = BLE_GAP_SVC_BASE + 14, /**< Set PPCP. */ + SD_BLE_GAP_PPCP_GET = BLE_GAP_SVC_BASE + 15, /**< Get PPCP. */ + SD_BLE_GAP_DEVICE_NAME_SET = BLE_GAP_SVC_BASE + 16, /**< Set Device Name. */ + SD_BLE_GAP_DEVICE_NAME_GET = BLE_GAP_SVC_BASE + 17, /**< Get Device Name. */ + SD_BLE_GAP_AUTHENTICATE = BLE_GAP_SVC_BASE + 18, /**< Initiate Pairing/Bonding. */ + SD_BLE_GAP_SEC_PARAMS_REPLY = BLE_GAP_SVC_BASE + 19, /**< Reply with Security Parameters. */ + SD_BLE_GAP_AUTH_KEY_REPLY = BLE_GAP_SVC_BASE + 20, /**< Reply with an authentication key. */ + SD_BLE_GAP_LESC_DHKEY_REPLY = BLE_GAP_SVC_BASE + 21, /**< Reply with an LE Secure Connections DHKey. */ + SD_BLE_GAP_KEYPRESS_NOTIFY = BLE_GAP_SVC_BASE + 22, /**< Notify of a keypress during an authentication procedure. */ + SD_BLE_GAP_LESC_OOB_DATA_GET = BLE_GAP_SVC_BASE + 23, /**< Get the local LE Secure Connections OOB data. */ + SD_BLE_GAP_LESC_OOB_DATA_SET = BLE_GAP_SVC_BASE + 24, /**< Set the remote LE Secure Connections OOB data. */ + SD_BLE_GAP_ENCRYPT = BLE_GAP_SVC_BASE + 25, /**< Initiate encryption procedure. */ + SD_BLE_GAP_SEC_INFO_REPLY = BLE_GAP_SVC_BASE + 26, /**< Reply with Security Information. */ + SD_BLE_GAP_CONN_SEC_GET = BLE_GAP_SVC_BASE + 27, /**< Obtain connection security level. */ + SD_BLE_GAP_RSSI_START = BLE_GAP_SVC_BASE + 28, /**< Start reporting of changes in RSSI. */ + SD_BLE_GAP_RSSI_STOP = BLE_GAP_SVC_BASE + 29, /**< Stop reporting of changes in RSSI. */ + SD_BLE_GAP_SCAN_START = BLE_GAP_SVC_BASE + 30, /**< Start Scanning. */ + SD_BLE_GAP_SCAN_STOP = BLE_GAP_SVC_BASE + 31, /**< Stop Scanning. */ + SD_BLE_GAP_CONNECT = BLE_GAP_SVC_BASE + 32, /**< Connect. */ + SD_BLE_GAP_CONNECT_CANCEL = BLE_GAP_SVC_BASE + 33, /**< Cancel ongoing connection procedure. */ + SD_BLE_GAP_RSSI_GET = BLE_GAP_SVC_BASE + 34, /**< Get the last RSSI sample. */ + SD_BLE_GAP_PHY_UPDATE = BLE_GAP_SVC_BASE + 35, /**< Initiate or respond to a PHY Update Procedure. */ + SD_BLE_GAP_DATA_LENGTH_UPDATE = BLE_GAP_SVC_BASE + 36, /**< Initiate or respond to a Data Length Update Procedure. */ + SD_BLE_GAP_QOS_CHANNEL_SURVEY_START = BLE_GAP_SVC_BASE + 37, /**< Start Quality of Service (QoS) channel survey module. */ + SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP = BLE_GAP_SVC_BASE + 38, /**< Stop Quality of Service (QoS) channel survey module. */ }; /**@brief GAP Event IDs. @@ -105,27 +110,29 @@ enum BLE_GAP_SVCS */ enum BLE_GAP_EVTS { - BLE_GAP_EVT_CONNECTED = BLE_GAP_EVT_BASE, /**< Connection established. \n See @ref ble_gap_evt_connected_t. */ - BLE_GAP_EVT_DISCONNECTED, /**< Disconnected from peer. \n See @ref ble_gap_evt_disconnected_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE, /**< Connection Parameters updated. \n See @ref ble_gap_evt_conn_param_update_t. */ - BLE_GAP_EVT_SEC_PARAMS_REQUEST, /**< Request to provide security parameters. \n Reply with @ref sd_ble_gap_sec_params_reply. \n See @ref ble_gap_evt_sec_params_request_t. */ - BLE_GAP_EVT_SEC_INFO_REQUEST, /**< Request to provide security information. \n Reply with @ref sd_ble_gap_sec_info_reply. \n See @ref ble_gap_evt_sec_info_request_t. */ - BLE_GAP_EVT_PASSKEY_DISPLAY, /**< Request to display a passkey to the user. \n In LESC Numeric Comparison, reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_passkey_display_t. */ - BLE_GAP_EVT_KEY_PRESSED, /**< Notification of a keypress on the remote device.\n See @ref ble_gap_evt_key_pressed_t */ - BLE_GAP_EVT_AUTH_KEY_REQUEST, /**< Request to provide an authentication key. \n Reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_auth_key_request_t. */ - BLE_GAP_EVT_LESC_DHKEY_REQUEST, /**< Request to calculate an LE Secure Connections DHKey. \n Reply with @ref sd_ble_gap_lesc_dhkey_reply. \n See @ref ble_gap_evt_lesc_dhkey_request_t */ - BLE_GAP_EVT_AUTH_STATUS, /**< Authentication procedure completed with status. \n See @ref ble_gap_evt_auth_status_t. */ - BLE_GAP_EVT_CONN_SEC_UPDATE, /**< Connection security updated. \n See @ref ble_gap_evt_conn_sec_update_t. */ - BLE_GAP_EVT_TIMEOUT, /**< Timeout expired. \n See @ref ble_gap_evt_timeout_t. */ - BLE_GAP_EVT_RSSI_CHANGED, /**< RSSI report. \n See @ref ble_gap_evt_rssi_changed_t. */ - BLE_GAP_EVT_ADV_REPORT, /**< Advertising report. \n See @ref ble_gap_evt_adv_report_t. */ - BLE_GAP_EVT_SEC_REQUEST, /**< Security Request. \n See @ref ble_gap_evt_sec_request_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, /**< Connection Parameter Update Request. \n Reply with @ref sd_ble_gap_conn_param_update. \n See @ref ble_gap_evt_conn_param_update_request_t. */ - BLE_GAP_EVT_SCAN_REQ_REPORT, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ - BLE_GAP_EVT_PHY_UPDATE_REQUEST, /**< PHY Update Request. \n Reply with @ref sd_ble_gap_phy_update. \n See @ref ble_gap_evt_phy_update_request_t. */ - BLE_GAP_EVT_PHY_UPDATE, /**< PHY Update Procedure is complete. \n See @ref ble_gap_evt_phy_update_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST, /**< Data Length Update Request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ + BLE_GAP_EVT_CONNECTED = BLE_GAP_EVT_BASE, + BLE_GAP_EVT_DISCONNECTED = BLE_GAP_EVT_BASE + 1, /**< Disconnected from peer. \n See @ref ble_gap_evt_disconnected_t. */ + BLE_GAP_EVT_CONN_PARAM_UPDATE = BLE_GAP_EVT_BASE + 2, /**< Connection Parameters updated. \n See @ref ble_gap_evt_conn_param_update_t. */ + BLE_GAP_EVT_SEC_PARAMS_REQUEST = BLE_GAP_EVT_BASE + 3, /**< Request to provide security parameters. \n Reply with @ref sd_ble_gap_sec_params_reply. \n See @ref ble_gap_evt_sec_params_request_t. */ + BLE_GAP_EVT_SEC_INFO_REQUEST = BLE_GAP_EVT_BASE + 4, /**< Request to provide security information. \n Reply with @ref sd_ble_gap_sec_info_reply. \n See @ref ble_gap_evt_sec_info_request_t. */ + BLE_GAP_EVT_PASSKEY_DISPLAY = BLE_GAP_EVT_BASE + 5, /**< Request to display a passkey to the user. \n In LESC Numeric Comparison, reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_passkey_display_t. */ + BLE_GAP_EVT_KEY_PRESSED = BLE_GAP_EVT_BASE + 6, /**< Notification of a keypress on the remote device.\n See @ref ble_gap_evt_key_pressed_t */ + BLE_GAP_EVT_AUTH_KEY_REQUEST = BLE_GAP_EVT_BASE + 7, /**< Request to provide an authentication key. \n Reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_auth_key_request_t. */ + BLE_GAP_EVT_LESC_DHKEY_REQUEST = BLE_GAP_EVT_BASE + 8, /**< Request to calculate an LE Secure Connections DHKey. \n Reply with @ref sd_ble_gap_lesc_dhkey_reply. \n See @ref ble_gap_evt_lesc_dhkey_request_t */ + BLE_GAP_EVT_AUTH_STATUS = BLE_GAP_EVT_BASE + 9, /**< Authentication procedure completed with status. \n See @ref ble_gap_evt_auth_status_t. */ + BLE_GAP_EVT_CONN_SEC_UPDATE = BLE_GAP_EVT_BASE + 10, /**< Connection security updated. \n See @ref ble_gap_evt_conn_sec_update_t. */ + BLE_GAP_EVT_TIMEOUT = BLE_GAP_EVT_BASE + 11, /**< Timeout expired. \n See @ref ble_gap_evt_timeout_t. */ + BLE_GAP_EVT_RSSI_CHANGED = BLE_GAP_EVT_BASE + 12, /**< RSSI report. \n See @ref ble_gap_evt_rssi_changed_t. */ + BLE_GAP_EVT_ADV_REPORT = BLE_GAP_EVT_BASE + 13, /**< Advertising report. \n See @ref ble_gap_evt_adv_report_t. */ + BLE_GAP_EVT_SEC_REQUEST = BLE_GAP_EVT_BASE + 14, /**< Security Request. \n See @ref ble_gap_evt_sec_request_t. */ + BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 15, /**< Connection Parameter Update Request. \n Reply with @ref sd_ble_gap_conn_param_update. \n See @ref ble_gap_evt_conn_param_update_request_t. */ + BLE_GAP_EVT_SCAN_REQ_REPORT = BLE_GAP_EVT_BASE + 16, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ + BLE_GAP_EVT_PHY_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 17, /**< PHY Update Request. \n Reply with @ref sd_ble_gap_phy_update. \n See @ref ble_gap_evt_phy_update_request_t. */ + BLE_GAP_EVT_PHY_UPDATE = BLE_GAP_EVT_BASE + 18, /**< PHY Update Procedure is complete. \n See @ref ble_gap_evt_phy_update_t. */ + BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 19, /**< Data Length Update Request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ + BLE_GAP_EVT_DATA_LENGTH_UPDATE = BLE_GAP_EVT_BASE + 20, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ + BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT = BLE_GAP_EVT_BASE + 21, /**< Channel survey report. \n See @ref ble_gap_evt_qos_channel_survey_report_t. */ + BLE_GAP_EVT_ADV_SET_TERMINATED = BLE_GAP_EVT_BASE + 22, /**< Advertising set terminated. \n See @ref ble_gap_evt_adv_set_terminated_t. */ }; /**@brief GAP Option IDs. @@ -133,13 +140,12 @@ enum BLE_GAP_EVTS */ enum BLE_GAP_OPTS { - BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ - BLE_GAP_OPT_LOCAL_CONN_LATENCY, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ - BLE_GAP_OPT_PASSKEY, /**< Set passkey. @ref ble_gap_opt_passkey_t */ - BLE_GAP_OPT_SCAN_REQ_REPORT, /**< Scan request report. @ref ble_gap_opt_scan_req_report_t */ - BLE_GAP_OPT_COMPAT_MODE_1, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */ - BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ - BLE_GAP_OPT_SLAVE_LATENCY_DISABLE, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ + BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ + BLE_GAP_OPT_LOCAL_CONN_LATENCY = BLE_GAP_OPT_BASE + 1, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ + BLE_GAP_OPT_PASSKEY = BLE_GAP_OPT_BASE + 2, /**< Set passkey. @ref ble_gap_opt_passkey_t */ + BLE_GAP_OPT_COMPAT_MODE_1 = BLE_GAP_OPT_BASE + 3, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */ + BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT = BLE_GAP_OPT_BASE + 4, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ + BLE_GAP_OPT_SLAVE_LATENCY_DISABLE = BLE_GAP_OPT_BASE + 5, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ }; /**@brief GAP Configuration IDs. @@ -148,8 +154,17 @@ enum BLE_GAP_OPTS */ enum BLE_GAP_CFGS { - BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ - BLE_GAP_CFG_DEVICE_NAME, /**< Device name configuration. */ + BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ + BLE_GAP_CFG_DEVICE_NAME = BLE_GAP_CFG_BASE + 1, /**< Device name configuration. */ +}; + +/**@brief GAP TX Power roles. + */ +enum BLE_GAP_TX_POWER_ROLES +{ + BLE_GAP_TX_POWER_ROLE_ADV = 1, /**< Advertiser role. */ + BLE_GAP_TX_POWER_ROLE_SCAN_INIT = 2, /**< Scanner and initiator role. */ + BLE_GAP_TX_POWER_ROLE_CONN = 3, /**< Connection role. */ }; /** @} */ @@ -169,7 +184,6 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_ROLES GAP Roles - * @note Not explicitly used in peripheral API, but will be relevant for central API. * @{ */ #define BLE_GAP_ROLE_INVALID 0x0 /**< Invalid Role. */ #define BLE_GAP_ROLE_PERIPH 0x1 /**< Peripheral Role. */ @@ -179,7 +193,6 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_TIMEOUT_SOURCES GAP Timeout sources * @{ */ -#define BLE_GAP_TIMEOUT_SRC_ADVERTISING 0x00 /**< Advertising timeout. */ #define BLE_GAP_TIMEOUT_SRC_SCAN 0x01 /**< Scanning timeout. */ #define BLE_GAP_TIMEOUT_SRC_CONN 0x02 /**< Connection timeout. */ #define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x03 /**< Authenticated payload timeout. */ @@ -188,10 +201,12 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_ADDR_TYPES GAP Address types * @{ */ -#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public address. */ -#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static address. */ +#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public (identity) address.*/ +#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static (identity) address. */ #define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE 0x02 /**< Random private resolvable address. */ #define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE 0x03 /**< Random private non-resolvable address. */ +#define BLE_GAP_ADDR_TYPE_ANONYMOUS 0x7F /**< An advertiser may advertise without its address. + This type of advertising is called anonymous. */ /**@} */ @@ -204,7 +219,6 @@ enum BLE_GAP_CFGS /** @brief BLE address length. */ #define BLE_GAP_ADDR_LEN (6) - /**@defgroup BLE_GAP_PRIVACY_MODES Privacy modes * @{ */ #define BLE_GAP_PRIVACY_MODE_OFF 0x00 /**< Device will send and accept its identity address for its own address. */ @@ -214,6 +228,31 @@ enum BLE_GAP_CFGS the peer IRK is exchanged, non-zero and added to the identity list. */ /**@} */ +/** @brief Invalid power level. */ +#define BLE_GAP_POWER_LEVEL_INVALID 127 + +/** @brief Advertising set handle not set. */ +#define BLE_GAP_ADV_SET_HANDLE_NOT_SET (0xFF) + +/** @brief The default number of advertising sets. */ +#define BLE_GAP_ADV_SET_COUNT_DEFAULT (1) + +/** @brief The maximum number of advertising sets supported by this SoftDevice. */ +#define BLE_GAP_ADV_SET_COUNT_MAX (1) + +/**@defgroup BLE_GAP_ADV_SET_DATA_SIZES Advertising data sizes. + * @{ */ +#define BLE_GAP_ADV_SET_DATA_SIZE_MAX (31) /**< Maximum data length for an advertising set. */ +/**@}. */ + +/** @brief Set ID not available in advertising report. */ +#define BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE 0xFF + +/**@defgroup BLE_GAP_EVT_ADV_SET_TERMINATED_REASON GAP Advertising Set Terminated reasons + * @{ */ +#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_TIMEOUT 0x01 /**< Timeout value reached. */ +#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_LIMIT_REACHED 0x02 /**< @ref ble_gap_adv_params_t::max_adv_evts was reached. */ +/**@} */ /**@defgroup BLE_GAP_AD_TYPE_DEFINITIONS GAP Advertising and Scan Response Data format * @note Found at https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm @@ -269,45 +308,111 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_ADV_INTERVALS GAP Advertising interval max and min * @{ */ -#define BLE_GAP_ADV_INTERVAL_MIN 0x0020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ -#define BLE_GAP_ADV_INTERVAL_MAX 0x4000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. */ +#define BLE_GAP_ADV_INTERVAL_MIN 0x000020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ +#define BLE_GAP_ADV_INTERVAL_MAX 0x004000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. + @note Support for values above @ref BLE_GAP_ADV_INTERVAL_MAX + is experimental. Values above 0xFFFFFF, i.e 10,485.759375 s + are not supported. */ /**@} */ /**@defgroup BLE_GAP_SCAN_INTERVALS GAP Scan interval max and min * @{ */ #define BLE_GAP_SCAN_INTERVAL_MIN 0x0004 /**< Minimum Scan interval in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_INTERVAL_MAX 0x4000 /**< Maximum Scan interval in 625 us units, i.e. 10.24 s. */ +#define BLE_GAP_SCAN_INTERVAL_MAX 0xFFFF /**< Maximum Scan interval in 625 us units, i.e. 40,959.375 s. */ /** @} */ /**@defgroup BLE_GAP_SCAN_WINDOW GAP Scan window max and min * @{ */ #define BLE_GAP_SCAN_WINDOW_MIN 0x0004 /**< Minimum Scan window in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_WINDOW_MAX 0x4000 /**< Maximum Scan window in 625 us units, i.e. 10.24 s. */ +#define BLE_GAP_SCAN_WINDOW_MAX 0xFFFF /**< Maximum Scan window in 625 us units, i.e. 40,959.375 s. */ /** @} */ /**@defgroup BLE_GAP_SCAN_TIMEOUT GAP Scan timeout max and min * @{ */ -#define BLE_GAP_SCAN_TIMEOUT_MIN 0x0001 /**< Minimum Scan timeout in seconds. */ -#define BLE_GAP_SCAN_TIMEOUT_MAX 0xFFFF /**< Maximum Scan timeout in seconds. */ +#define BLE_GAP_SCAN_TIMEOUT_MIN 0x0001 /**< Minimum Scan timeout in 10 ms units, i.e 10 ms. */ +#define BLE_GAP_SCAN_TIMEOUT_UNLIMITED 0x0000 /**< Continue to scan forever. */ /** @} */ - -/**@brief Maximum size of advertising data in octets. */ -#define BLE_GAP_ADV_MAX_SIZE (31) - +/**@defgroup BLE_GAP_SCAN_BUFFER_SIZE GAP Minimum scanner buffer size + * + * Scan buffers are used for storing advertising data received from an advertiser. + * If ble_gap_scan_params_t::extended is set to 0, @ref BLE_GAP_SCAN_BUFFER_MIN is the minimum scan buffer length. + * else the minimum scan buffer size is @ref BLE_GAP_SCAN_BUFFER_EXTENDED_MIN. + * @{ */ +#define BLE_GAP_SCAN_BUFFER_MIN (31) /**< Minimum data length for an + advertising set. */ +#define BLE_GAP_SCAN_BUFFER_MAX (31) /**< Maximum data length for an + advertising set. */ +#define BLE_GAP_SCAN_BUFFER_EXTENDED_MIN (255) /**< Minimum data length for an + extended advertising set. */ +#define BLE_GAP_SCAN_BUFFER_EXTENDED_MAX (1650) /**< Maximum data length for an + extended advertising set. + @note Extended scanning is only + supported as an experimental + feature in this SoftDevice. + The scanner will only receive + advertising data up to 31 bytes. */ +/** @} */ /**@defgroup BLE_GAP_ADV_TYPES GAP Advertising types + * + * Advertising types defined in Bluetooth Core Specification v5.0, Vol 6, Part B, Section 4.4.2. + * + * The maximum advertising data length is defined by @ref BLE_GAP_ADV_SET_DATA_SIZE_MAX. + * Note that some of the advertising types do not support advertising data. Non-scannable types do not support + * scan response data. + * * @{ */ -#define BLE_GAP_ADV_TYPE_ADV_IND 0x00 /**< Connectable undirected. */ -#define BLE_GAP_ADV_TYPE_ADV_DIRECT_IND 0x01 /**< Connectable directed. */ -#define BLE_GAP_ADV_TYPE_ADV_SCAN_IND 0x02 /**< Scannable undirected. */ -#define BLE_GAP_ADV_TYPE_ADV_NONCONN_IND 0x03 /**< Non connectable undirected. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED 0x01 /**< Connectable and scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE 0x02 /**< Connectable non-scannable directed advertising + events. Advertising interval is less that 3.75 ms. + Use this type for fast reconnections. + @note Advertising data is not supported. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED 0x03 /**< Connectable non-scannable directed advertising + events. + @note Advertising data is not supported. */ +#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x04 /**< Non-connectable scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x05 /**< Non-connectable non-scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED 0x06 /**< Connectable non-scannable undirected advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_DIRECTED 0x07 /**< Connectable non-scannable directed advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x08 /**< Non-connectable scannable undirected advertising + events using extended advertising PDUs. + @note Only scan response data is supported. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_DIRECTED 0x09 /**< Non-connectable scannable directed advertising + events using extended advertising PDUs. + @note Only scan response data is supported. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x0A /**< Non-connectable non-scannable undirected advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED 0x0B /**< Non-connectable non-scannable directed advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ /**@} */ - /**@defgroup BLE_GAP_ADV_FILTER_POLICIES GAP Advertising filter policies * @{ */ #define BLE_GAP_ADV_FP_ANY 0x00 /**< Allow scan requests and connect requests from any device. */ @@ -316,11 +421,34 @@ enum BLE_GAP_CFGS #define BLE_GAP_ADV_FP_FILTER_BOTH 0x03 /**< Filter both scan and connect requests with whitelist. */ /**@} */ - -/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values +/**@defgroup BLE_GAP_ADV_DATA_STATUS GAP Advertising data status * @{ */ -#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (180) /**< Maximum advertising time in limited discoverable mode (TGAP(lim_adv_timeout) = 180 s). */ -#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. */ +#define BLE_GAP_ADV_DATA_STATUS_COMPLETE 0x00 /**< All data in the advertising event have been received. */ +#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA 0x01 /**< More data to be received. */ +#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED 0x02 /**< Incomplete data. Buffer size insufficient to receive more. */ +#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MISSED 0x03 /**< Failed to receive the remaining data. */ +/**@} */ + +/**@defgroup BLE_GAP_SCAN_FILTER_POLICIES GAP Scanner filter policies + * @{ */ +#define BLE_GAP_SCAN_FP_ACCEPT_ALL 0x00 /**< Accept all advertising packets except directed advertising packets + not addressed to this device. */ +#define BLE_GAP_SCAN_FP_WHITELIST 0x01 /**< Accept advertising packets from devices in the whitelist except directed + packets not addressed to this device. */ +#define BLE_GAP_SCAN_FP_ALL_NOT_RESOLVED_DIRECTED 0x02 /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_ACCEPT_ALL. + In addition, accept directed advertising packets, where the advertiser's + address is a resolvable private address that cannot be resolved. */ +#define BLE_GAP_SCAN_FP_WHITELIST_NOT_RESOLVED_DIRECTED 0x03 /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_WHITELIST. + In addition, accept directed advertising packets, where the advertiser's + address is a resolvable private address that cannot be resolved. */ +/**@} */ + +/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values in 10 ms units + * @{ */ +#define BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX (128) /**< Maximum high duty advertising time in 10 ms units. Corresponds to 1.28 s. */ +#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (18000) /**< Maximum advertising time in 10 ms units corresponding to TGAP(lim_adv_timeout) = 180 s in limited discoverable mode. */ +#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. + For high duty cycle advertising, this corresponds to @ref BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX. */ /**@} */ @@ -425,6 +553,10 @@ enum BLE_GAP_CFGS #define BLE_GAP_PHY_1MBPS 0x01 /**< 1 Mbps PHY. */ #define BLE_GAP_PHY_2MBPS 0x02 /**< 2 Mbps PHY. */ #define BLE_GAP_PHY_CODED 0x04 /**< Coded PHY. */ +#define BLE_GAP_PHY_NOT_SET 0xFF /**< PHY is not configured. */ + +/**@brief Supported PHYs in connections, for scanning, and for advertising. */ +#define BLE_GAP_PHYS_SUPPORTED (BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS) /**< All PHYs except @ref BLE_GAP_PHY_CODED are supported. */ /**@} */ @@ -483,8 +615,8 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_EVENT_LENGTH GAP event length defines. * @{ */ -#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ -#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ +#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ +#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ /**@} */ @@ -494,8 +626,8 @@ enum BLE_GAP_CFGS #define BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT (3) /**< Default maximum number of connections concurrently acting as centrals. */ #define BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT (1) /**< Default number of SMP instances shared between all connections acting as centrals. */ #define BLE_GAP_ROLE_COUNT_COMBINED_MAX (20) /**< Maximum supported number of concurrent connections in the peripheral and central roles combined. */ -/**@} */ +/**@} */ /**@brief Automatic data length parameter. */ #define BLE_GAP_DATA_LENGTH_AUTO 0 @@ -510,19 +642,64 @@ enum BLE_GAP_CFGS * @{ */ #define BLE_GAP_SEC_MODE 0x00 /**< No key (may be used to reject). */ /**@} */ + +/**@brief The total number of channels in Bluetooth Low Energy. */ +#define BLE_GAP_CHANNEL_COUNT (40) + +/**@defgroup BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS Quality of Service (QoS) Channel survey interval defines + * @{ */ +#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS (0) /**< Continuous channel survey. */ +#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MIN_US (7500) /**< Minimum channel survey interval in microseconds (7.5 ms). */ +#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MAX_US (4000000) /**< Maximum channel survey interval in microseconds (4 s). */ + /**@} */ + /** @} */ /**@addtogroup BLE_GAP_STRUCTURES Structures * @{ */ +/**@brief Advertising event properties. */ +typedef struct +{ + uint8_t type; /**< Advertising type. See @ref BLE_GAP_ADV_TYPES. */ + uint8_t anonymous : 1; /**< Omit advertiser's address from all PDUs. + @note Anonymous advertising is only available for + @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED and + @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED. */ + uint8_t include_tx_power : 1; /**< Include TxPower set by @ref sd_ble_gap_tx_power_set in the extended header + of the advertising PDU. + @note TxPower can only be added to the extended header when @ref type is an extended advertising type. */ +} ble_gap_adv_properties_t; + + +/**@brief Advertising report type. */ +typedef struct +{ + uint16_t connectable : 1; /**< Connectable advertising event type. */ + uint16_t scannable : 1; /**< Scannable advertising event type. */ + uint16_t directed : 1; /**< Directed advertising event type. */ + uint16_t scan_response : 1; /**< Received a scan response. */ + uint16_t extended_pdu : 1; /**< Received an extended advertising set. */ + uint16_t status : 2; /**< Data status. See @ref BLE_GAP_ADV_DATA_STATUS. */ + uint16_t reserved : 9; /**< Reserved for future use. */ +} ble_gap_adv_report_type_t; + +/**@brief Advertising Auxiliary Pointer. */ +typedef struct +{ + uint16_t aux_offset; /**< Time offset from the beginning of advertising packet to the auxiliary packet in 100 us units. */ + uint8_t aux_phy; /**< Indicates the PHY on which the auxiliary advertising packet is sent. See @ref BLE_GAP_PHYS. */ +} ble_gap_aux_pointer_t; + /**@brief Bluetooth Low Energy address. */ typedef struct { uint8_t addr_id_peer : 1; /**< Only valid for peer addresses. Reference to peer in device identities list (as set with @ref sd_ble_gap_device_identities_set) when peer is using privacy. */ uint8_t addr_type : 7; /**< See @ref BLE_GAP_ADDR_TYPES. */ - uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format. */ + uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format. + addr is not used if addr_type is @ref BLE_GAP_ADDR_TYPE_ANONYMOUS. */ } ble_gap_addr_t; @@ -578,44 +755,146 @@ typedef struct } ble_gap_irk_t; -/**@brief Channel mask for RF channels used in advertising. */ -typedef struct -{ - uint8_t ch_37_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 37 */ - uint8_t ch_38_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 38 */ - uint8_t ch_39_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 39 */ -} ble_gap_adv_ch_mask_t; +/**@brief Channel mask (40 bits). + * Every channel is represented with a bit positioned as per channel index defined in Bluetooth Core Specification v5.0, + * Vol 6, Part B, Section 1.4.1. The LSB contained in array element 0 represents channel index 0, and bit 39 represents + * channel index 39. If a bit is set to 1, the channel is not used. + */ +typedef uint8_t ble_gap_ch_mask_t[5]; /**@brief GAP advertising parameters. */ typedef struct { - uint8_t type; /**< See @ref BLE_GAP_ADV_TYPES. */ - ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. - - When privacy is enabled and the local device use @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, the device identity list is searched for a matching - entry. If the local IRK for that device identity is set, the local IRK for that device will be used to generate the advertiser address field in the advertise packet. - - If type is @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this must be set to the targeted initiator. If the initiator is in the device identity list, - the peer IRK for that device will be used to generate the initiator address field in the ADV_DIRECT_IND packet. */ - uint8_t fp; /**< Filter Policy, see @ref BLE_GAP_ADV_FILTER_POLICIES. */ - uint16_t interval; /**< Advertising interval between 0x0020 and 0x4000 in 0.625 ms units (20 ms to 10.24 s), see @ref BLE_GAP_ADV_INTERVALS. - - If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this parameter must be set to 0 for high duty cycle directed advertising. - - If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, set @ref BLE_GAP_ADV_INTERVAL_MIN <= interval <= @ref BLE_GAP_ADV_INTERVAL_MAX for low duty cycle advertising.*/ - uint16_t timeout; /**< Advertising timeout between 0x0001 and 0x3FFF in seconds, 0x0000 disables timeout. See also @ref BLE_GAP_ADV_TIMEOUT_VALUES. If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this parameter must be set to 0 for High duty cycle directed advertising. */ - ble_gap_adv_ch_mask_t channel_mask; /**< Advertising channel mask. See @ref ble_gap_adv_ch_mask_t. */ + ble_gap_adv_properties_t properties; /**< The properties of the advertising events. */ + ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. + @note ble_gap_addr_t::addr_type cannot be + @ref BLE_GAP_ADDR_TYPE_ANONYMOUS. + - When privacy is enabled and the local device uses + @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, + the device identity list is searched for a matching entry. If + the local IRK for that device identity is set, the local IRK + for that device will be used to generate the advertiser address + field in the advertising packet. + - If @ref ble_gap_adv_properties_t::type is directed, this must be + set to the targeted scanner or initiator. If the peer address is + in the device identity list, the peer IRK for that device will be + used to generate @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE + target addresses used in the advertising event PDUs. */ + uint32_t interval; /**< Advertising interval in 625 us units. @sa BLE_GAP_ADV_INTERVALS. + @note If @ref ble_gap_adv_properties_t::type is set to + @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE + advertising, this parameter is ignored. */ + uint16_t duration; /**< Advertising duration in 10 ms units. When timeout is reached, + an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. + @sa BLE_GAP_ADV_TIMEOUT_VALUES. */ + uint8_t max_adv_evts; /**< Maximum advertising events that shall be sent prior to disabling + advertising. Setting the value to 0 disables the limitation. When + the count of advertising events specified by this parameter + (if not 0) is reached, advertising will be automatically stopped + and an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised + @note If @ref ble_gap_adv_properties_t::type is set to + @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE, + this parameter is ignored. + @note Setting max_adv_evts to a values not equal to 0 is only supported + as an experimental feature in this SoftDevice. */ + ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary and secondary advertising channels. + At least one of the primary channels, that is channel index 37-39, must be used. + Masking away secondary advertising channels is not supported. */ + uint8_t filter_policy; /**< Filter Policy. @sa BLE_GAP_ADV_FILTER_POLICIES. */ + uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising channel packets + are transmitted. If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS + will be used. + The only supported value by this SoftDevice is @ref BLE_GAP_PHY_1MBPS. */ + uint8_t secondary_phy; /**< Indicates the PHY on which the secondary advertising channel packets + are transmitted. + If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS will be used. + Valid values are + @ref BLE_GAP_PHY_1MBPS and @ref BLE_GAP_PHY_2MBPS. @ref BLE_GAP_PHY_CODED + is not supported by this SoftDevice. + If @ref ble_gap_adv_properties_t::type is an extended advertising type + and connectable, this is the PHY that will be used to establish a + connection and send AUX_ADV_IND packets on. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ + uint8_t set_id:4; /**< The advertising set identifier distinguishes this advertising set from other + advertising sets transmitted by this and other devices. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ + uint8_t scan_req_notification:1; /**< Enable scan request notifications for this advertising set. When a + scan request is received and the scanner address is allowed + by the filter policy, @ref BLE_GAP_EVT_SCAN_REQ_REPORT is raised. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is a non-scannable + advertising type. */ } ble_gap_adv_params_t; +/**@brief GAP advertising data buffers. + * + * The application must provide the buffers for advertisement. The memory shall reside in application RAM, and + * shall never be modified while advertising. The data shall be kept alive until either: + * - @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. + * - @ref BLE_GAP_EVT_CONNECTED is raised with @ref ble_gap_evt_connected_t::adv_handle set to the corresponding + * advertising handle. + * - Advertising is stopped. + * - Advertising data is changed. + * To update advertising data while advertising, provide new buffers to @ref sd_ble_gap_adv_set_configure. */ +typedef struct +{ + ble_data_t adv_data; /**< Advertising data. + @note + Advertising data can only be specified for a @ref ble_gap_adv_properties_t::type + that is allowed to contain advertising data. */ + ble_data_t scan_rsp_data; /**< Scan response data. + @note + Scan response data can only be specified for a @ref ble_gap_adv_properties_t::type + that is scannable. */ +} ble_gap_adv_data_t; + + /**@brief GAP scanning parameters. */ typedef struct { - uint8_t active : 1; /**< If 1, perform active scanning (scan requests). */ - uint8_t use_whitelist : 1; /**< If 1, filter advertisers using current active whitelist. */ - uint8_t adv_dir_report : 1; /**< If 1, also report directed advertisements where the initiator field is set to a private resolvable address, - even if the address did not resolve to an entry in the device identity list. A report will be generated - even if the peer is not in the whitelist. */ - uint16_t interval; /**< Scan interval between 0x0004 and 0x4000 in 0.625 ms units (2.5 ms to 10.24 s). */ - uint16_t window; /**< Scan window between 0x0004 and 0x4000 in 0.625 ms units (2.5 ms to 10.24 s). */ - uint16_t timeout; /**< Scan timeout between 0x0001 and 0xFFFF in seconds, 0x0000 disables timeout. */ + uint8_t extended : 1; /**< If 1, the scanner will accept extended advertising packets. + If set to 0, the scanner will not receive advertising packets + on secondary advertising channels, and will not be able + to receive long advertising PDUs. + @note Extended scanning is only supported as an experimental feature in this + SoftDevice. */ + uint8_t report_incomplete_evts : 1; /**< If 1, events of type @ref ble_gap_evt_adv_report_t may have + @ref ble_gap_adv_report_type_t::status set to + @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. + This parameter is ignored when used with @ref sd_ble_gap_connect + @note This may be used to abort receiving more packets from an extended + advertising event, and is only available for extended + scanning, see @ref sd_ble_gap_scan_start. + @note This feature is not supported by this SoftDevice. */ + uint8_t active : 1; /**< If 1, perform active scanning by sending scan requests. + This parameter is ignored when used with @ref sd_ble_gap_connect. */ + uint8_t filter_policy : 2; /**< Scanning filter policy. @sa BLE_GAP_SCAN_FILTER_POLICIES. + @note Only @ref BLE_GAP_SCAN_FP_ACCEPT_ALL and + @ref BLE_GAP_SCAN_FP_WHITELIST are valid when used with + @ref sd_ble_gap_connect */ + uint8_t scan_phys; /**< Bitfield of PHYs to scan on. If set to @ref BLE_GAP_PHY_AUTO, + scan_phys will default to @ref BLE_GAP_PHY_1MBPS. + - If @ref ble_gap_scan_params_t::extended is set to 0, the only + supported PHY is @ref BLE_GAP_PHY_1MBPS. + - When used with @ref sd_ble_gap_scan_start, + the bitfield indicates the PHYs the scanner will use for scanning + on primary advertising channels. The scanner will accept + @ref BLE_GAP_PHYS_SUPPORTED as secondary advertising channel PHYs. + - When used with @ref sd_ble_gap_connect, the + bitfield indicates the PHYs on where a connection may be initiated. + If scan_phys contains @ref BLE_GAP_PHY_1MBPS and/or @ref BLE_GAP_PHY_2MBPS, + the primary scan PHY is @ref BLE_GAP_PHY_1MBPS. */ + uint16_t interval; /**< Scan interval in 625 us units. @sa BLE_GAP_SCAN_INTERVALS. */ + uint16_t window; /**< Scan window in 625 us units. @sa BLE_GAP_SCAN_WINDOW. */ + uint16_t timeout; /**< Scan timeout in 10 ms units. @sa BLE_GAP_SCAN_TIMEOUT. */ + ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary and secondary advertising channels. + At least one of the primary channels, that is channel index 37-39, must be + set to 0. + Masking away secondary channels is not supported. */ } ble_gap_scan_params_t; @@ -746,6 +1025,12 @@ typedef struct and the address is the device's identity address. */ uint8_t role; /**< BLE role for this connection, see @ref BLE_GAP_ROLES */ ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ + uint8_t adv_handle; /**< Advertising handle in which advertising has ended. + This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ + ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated + advertising set. The advertising buffers provided in + @ref sd_ble_gap_adv_set_configure are now released. + This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ } ble_gap_evt_connected_t; @@ -916,28 +1201,80 @@ typedef struct typedef struct { uint8_t src; /**< Source of timeout event, see @ref BLE_GAP_TIMEOUT_SOURCES. */ + union + { + ble_data_t adv_report_buffer; /**< If source is set to @ref BLE_GAP_TIMEOUT_SRC_SCAN, the released + scan buffer is contained in this field. */ + } params; /**< Event Parameters. */ } ble_gap_evt_timeout_t; /**@brief Event structure for @ref BLE_GAP_EVT_RSSI_CHANGED. */ typedef struct { - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ + int8_t rssi; /**< Received Signal Strength Indication in dBm. */ + uint8_t ch_index; /**< Data Channel Index on which the Signal Strength is measured (0-36). */ } ble_gap_evt_rssi_changed_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_ADV_REPORT. */ +/**@brief Event structure for @ref BLE_GAP_EVT_ADV_SET_TERMINATED */ typedef struct { - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 - and the address is the device's identity address. */ - ble_gap_addr_t direct_addr; /**< Set when the scanner is unable to resolve the private resolvable address of the initiator - field of a directed advertisement packet and the scanner has been enabled to report this in @ref ble_gap_scan_params_t::adv_dir_report. */ - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ - uint8_t scan_rsp : 1; /**< If 1, the report corresponds to a scan response and the type field may be ignored. */ - uint8_t type : 2; /**< See @ref BLE_GAP_ADV_TYPES. Only valid if the scan_rsp field is 0. */ - uint8_t dlen : 5; /**< Advertising or scan response data length. */ - uint8_t data[BLE_GAP_ADV_MAX_SIZE]; /**< Advertising or scan response data. */ + uint8_t reason; /**< Reason for why the advertising set terminated. See + @ref BLE_GAP_EVT_ADV_SET_TERMINATED_REASON. */ + uint8_t adv_handle; /**< Advertising handle in which advertising has ended. */ + uint8_t num_completed_adv_events; /**< If @ref ble_gap_adv_params_t::max_adv_evts was not set to 0, + this field indicates the number of completed advertising events. */ + ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated + advertising set. The advertising buffers provided in + @ref sd_ble_gap_adv_set_configure are now released. */ +} ble_gap_evt_adv_set_terminated_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_ADV_REPORT. + * + * @note If @ref ble_gap_adv_report_type_t::status is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, + * not all fields in the advertising report may be available. + * + * @note When ble_gap_adv_report_type_t::status is not set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, + * scanning will be paused. To continue scanning, call @ref sd_ble_gap_scan_start. + */ +typedef struct +{ + ble_gap_adv_report_type_t type; /**< Advertising report type. See @ref ble_gap_adv_report_type_t. */ + ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr is resolved: + @ref ble_gap_addr_t::addr_id_peer is set to 1 and the address is the + peer's identity address. */ + ble_gap_addr_t direct_addr; /**< Contains the target address of the advertising event if + @ref ble_gap_adv_report_type_t::directed is set to 1. If the + SoftDevice was able to resolve the address, + @ref ble_gap_addr_t::addr_id_peer is set to 1 and the direct_addr + contains the local identity address. If the target address of the + advertising event is @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE, + and the SoftDevice was unable to resolve it, the application may try + to resolve this address to find out if the advertising event was + directed to us. */ + uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising packet was received on. + See @ref BLE_GAP_PHYS. */ + uint8_t secondary_phy; /**< Indicates the PHY on which the secondary advertising packet was received on. + See @ref BLE_GAP_PHYS. This field is to 0 if no packets where received on + a secondary advertising channel. */ + int8_t tx_power; /**< TX Power reported by the advertiser in the last packet header received. + This field is set to @ref BLE_GAP_POWER_LEVEL_INVALID if the + last received packet did not contain the Tx Power field. + @note TX Power is only included in extended advertising packets. */ + int8_t rssi; /**< Received Signal Strength Indication in dBm of the last packet received. */ + uint8_t ch_index; /**< Channel Index on which the last advertising packet is received (0-39). */ + uint8_t set_id; /**< Set ID of the received advertising data. Set ID is not present + if set to @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */ + uint16_t data_id:12; /**< The advertising data ID of the received advertising data. Data ID + is not present if @ref ble_gap_evt_adv_report_t::set_id is set to + @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */ + ble_data_t data; /**< Received advertising or scan response data. If + @ref ble_gap_adv_report_type_t::status is not set to + @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the data buffer provided + in @ref sd_ble_gap_scan_start is now released. */ + ble_gap_aux_pointer_t aux_pointer; /**< The offset and PHY of the next advertising packet in this extended advertising + event. @note This field is only set if @ref ble_gap_adv_report_type_t::status + is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. */ } ble_gap_evt_adv_report_t; @@ -961,11 +1298,13 @@ typedef struct /**@brief Event structure for @ref BLE_GAP_EVT_SCAN_REQ_REPORT. */ typedef struct { + uint8_t adv_handle; /**< Advertising handle for the advertising set which received the Scan Request */ int8_t rssi; /**< Received Signal Strength Indication in dBm. */ ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 and the address is the device's identity address. */ } ble_gap_evt_scan_req_report_t; + /**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST. */ typedef struct { @@ -979,6 +1318,15 @@ typedef struct } ble_gap_evt_data_length_update_t; +/**@brief Event structure for @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT. */ +typedef struct +{ + int8_t channel_energy[BLE_GAP_CHANNEL_COUNT]; /**< The measured energy on the Bluetooth Low Energy + channels, in dBm, indexed by Channel Index. + If no measurement is available for the given channel, channel_energy is set to + @ref BLE_GAP_POWER_LEVEL_INVALID. */ +} ble_gap_evt_qos_channel_survey_report_t; + /**@brief GAP event structure. */ typedef struct { @@ -999,6 +1347,7 @@ typedef struct ble_gap_evt_timeout_t timeout; /**< Timeout Event Parameters. */ ble_gap_evt_rssi_changed_t rssi_changed; /**< RSSI Event Parameters. */ ble_gap_evt_adv_report_t adv_report; /**< Advertising Report Event Parameters. */ + ble_gap_evt_adv_set_terminated_t adv_set_terminated; /**< Advertising Set Terminated Event Parameters. */ ble_gap_evt_sec_request_t sec_request; /**< Security Request Event Parameters. */ ble_gap_evt_conn_param_update_request_t conn_param_update_request; /**< Connection Parameter Update Parameters. */ ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report Parameters. */ @@ -1006,6 +1355,7 @@ typedef struct ble_gap_evt_phy_update_t phy_update; /**< PHY Update Parameters. */ ble_gap_evt_data_length_update_request_t data_length_update_request; /**< Data Length Update Request Event Parameters. */ ble_gap_evt_data_length_update_t data_length_update; /**< Data Length Update Event Parameters. */ + ble_gap_evt_qos_channel_survey_report_t qos_channel_survey_report; /**< Quality of Service (QoS) Channel Survey Report Parameters. */ } params; /**< Event Parameters. */ } ble_gap_evt_t; @@ -1038,21 +1388,27 @@ typedef struct * large. The maximum supported sum of concurrent connections is * @ref BLE_GAP_ROLE_COUNT_COMBINED_MAX. * @retval ::NRF_ERROR_INVALID_PARAM central_sec_count is larger than central_role_count. + * @retval ::NRF_ERROR_RESOURCES The adv_set_count is too large. The maximum + * supported advertising handles is + * @ref BLE_GAP_ADV_SET_COUNT_MAX. */ typedef struct { + uint8_t adv_set_count; /**< Maximum number of advertising sets. Default value is @ref BLE_GAP_ADV_SET_COUNT_DEFAULT. */ uint8_t periph_role_count; /**< Maximum number of connections concurrently acting as a peripheral. Default value is @ref BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT. */ uint8_t central_role_count; /**< Maximum number of connections concurrently acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT. */ uint8_t central_sec_count; /**< Number of SMP instances shared between all connections acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT. */ + uint8_t qos_channel_survey_role_available:1; /**< If set, the Quality of Service (QoS) channel survey module is available to the + application using @ref sd_ble_gap_qos_channel_survey_start. */ } ble_gap_cfg_role_count_t; /** * @brief Device name and its properties, set with @ref sd_ble_cfg_set. * - * @note If the device name is not configured, the default device name will be @ref - * BLE_GAP_DEVNAME_DEFAULT, the maximum device name length will be @ref - * BLE_GAP_DEVNAME_DEFAULT_LEN, vloc will be set to @ref BLE_GATTS_VLOC_STACK and the device name + * @note If the device name is not configured, the default device name will be + * @ref BLE_GAP_DEVNAME_DEFAULT, the maximum device name length will be + * @ref BLE_GAP_DEVNAME_DEFAULT_LEN, vloc will be set to @ref BLE_GATTS_VLOC_STACK and the device name * will have no write access. * * @note If @ref max_len is more than @ref BLE_GAP_DEVNAME_DEFAULT_LEN and vloc is set to @ref BLE_GATTS_VLOC_STACK, @@ -1094,24 +1450,26 @@ typedef union /**@brief Channel Map option. - * Used with @ref sd_ble_opt_get to get the current channel map - * or @ref sd_ble_opt_set to set a new channel map. When setting the - * channel map, it applies to all current and future connections. When getting the - * current channel map, it applies to a single connection and the connection handle - * must be supplied. * - * @note Setting the channel map may take some time, depending on connection parameters. - * The time taken may be different for each connection and the get operation will - * return the previous channel map until the new one has taken effect. + * @details Used with @ref sd_ble_opt_get to get the current channel map + * or @ref sd_ble_opt_set to set a new channel map. When setting the + * channel map, it applies to all current and future connections. When getting the + * current channel map, it applies to a single connection and the connection handle + * must be supplied. * - * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. - * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. + * @note Setting the channel map may take some time, depending on connection parameters. + * The time taken may be different for each connection and the get operation will + * return the previous channel map until the new one has taken effect. + * + * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. + * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. * * @retval ::NRF_SUCCESS Get or set successful. + * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: + * - Less then two bits in @ref ch_map are set. + * - Bits for primary advertising channels (37-39) are set. * @retval ::NRF_ERROR_BUSY Channel map was set again before enough time had passed. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied for get. - * @retval ::NRF_ERROR_NOT_SUPPORTED Returned by sd_ble_opt_set in peripheral-only SoftDevices. * */ typedef struct @@ -1123,21 +1481,21 @@ typedef struct /**@brief Local connection latency option. * - * Local connection latency is a feature which enables the slave to improve - * current consumption by ignoring the slave latency set by the peer. The - * local connection latency can only be set to a multiple of the slave latency, - * and cannot be longer than half of the supervision timeout. + * @details Local connection latency is a feature which enables the slave to improve + * current consumption by ignoring the slave latency set by the peer. The + * local connection latency can only be set to a multiple of the slave latency, + * and cannot be longer than half of the supervision timeout. * - * Used with @ref sd_ble_opt_set to set the local connection latency. The - * @ref sd_ble_opt_get is not supported for this option, but the actual - * local connection latency (unless set to NULL) is set as a return parameter - * when setting the option. + * @details Used with @ref sd_ble_opt_set to set the local connection latency. The + * @ref sd_ble_opt_get is not supported for this option, but the actual + * local connection latency (unless set to NULL) is set as a return parameter + * when setting the option. * - * @note The latency set will be truncated down to the closest slave latency event - * multiple, or the nearest multiple before half of the supervision timeout. + * @note The latency set will be truncated down to the closest slave latency event + * multiple, or the nearest multiple before half of the supervision timeout. * - * @note The local connection latency is disabled by default, and needs to be enabled for new - * connections and whenever the connection is updated. + * @note The local connection latency is disabled by default, and needs to be enabled for new + * connections and whenever the connection is updated. * * @retval ::NRF_SUCCESS Set successfully. * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. @@ -1152,8 +1510,9 @@ typedef struct /**@brief Disable slave latency * - * Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. - * When disabled, the peripheral will ignore the slave_latency set by the central. + * @details Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection + * (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. When disabled, the + * peripheral will ignore the slave_latency set by the central. * * @note Shall only be called on peripheral links. * @@ -1169,13 +1528,13 @@ typedef struct /**@brief Passkey Option. * - * Structure containing the passkey to be used during pairing. This can be used with @ref - * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication - * instead of generating a random one. + * @details Structure containing the passkey to be used during pairing. This can be used with @ref + * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication + * instead of generating a random one. * - * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. + * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. * - * @note @ref sd_ble_opt_get is not supported for this option. + * @note @ref sd_ble_opt_get is not supported for this option. * */ typedef struct @@ -1184,35 +1543,17 @@ typedef struct } ble_gap_opt_passkey_t; -/**@brief Scan request report option. - * - * This can be used with @ref sd_ble_opt_set to make the SoftDevice send - * @ref BLE_GAP_EVT_SCAN_REQ_REPORT events. - * - * @note Due to the limited space reserved for scan request report events, - * not all received scan requests will be reported. - * - * @note If whitelisting is used, only whitelisted requests are reported. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_STATE When advertising is ongoing while the option is set. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable scan request reports. */ -} ble_gap_opt_scan_req_report_t; - /**@brief Compatibility mode 1 option. * - * This can be used with @ref sd_ble_opt_set to enable and disable - * compatibility mode 1. Compatibility mode 1 is disabled by default. + * @details This can be used with @ref sd_ble_opt_set to enable and disable + * compatibility mode 1. Compatibility mode 1 is disabled by default. * - * @note Compatibility mode 1 enables interoperability with devices that do not support a value of - * 0 for the WinOffset parameter in the Link Layer CONNECT_IND packet. This applies to a - * limited set of legacy peripheral devices from another vendor. Enabling this compatibility - * mode will only have an effect if the local device will act as a central device and - * initiate a connection to a peripheral device. In that case it may lead to the connection - * creation taking up to one connection interval longer to complete for all connections. + * @note Compatibility mode 1 enables interoperability with devices that do not support a value of + * 0 for the WinOffset parameter in the Link Layer CONNECT_IND packet. This applies to a + * limited set of legacy peripheral devices from another vendor. Enabling this compatibility + * mode will only have an effect if the local device will act as a central device and + * initiate a connection to a peripheral device. In that case it may lead to the connection + * creation taking up to one connection interval longer to complete for all connections. * * @retval ::NRF_SUCCESS Set successfully. * @retval ::NRF_ERROR_INVALID_STATE When connection creation is ongoing while mode 1 is set. @@ -1222,20 +1563,21 @@ typedef struct uint8_t enable : 1; /**< Enable compatibility mode 1.*/ } ble_gap_opt_compat_mode_1_t; + /**@brief Authenticated payload timeout option. * - * This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other - * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. + * @details This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other + * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. * - * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated - * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted - * link. + * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated + * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted + * link. * - * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance - * to reset the timer. In addition the stack will try to prioritize running of LE ping over other - * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects - * on other activities, it is recommended to use high timeout values. - * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). + * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance + * to reset the timer. In addition the stack will try to prioritize running of LE ping over other + * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects + * on other activities, it is recommended to use high timeout values. + * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). * * @retval ::NRF_SUCCESS Set successfully. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. auth_payload_timeout was outside of allowed range. @@ -1247,14 +1589,12 @@ typedef struct uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit, see @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT. */ } ble_gap_opt_auth_payload_timeout_t; - /**@brief Option structure for GAP options. */ typedef union { ble_gap_opt_ch_map_t ch_map; /**< Parameters for the Channel Map option. */ ble_gap_opt_local_conn_latency_t local_conn_latency; /**< Parameters for the Local connection latency option */ ble_gap_opt_passkey_t passkey; /**< Parameters for the Passkey option.*/ - ble_gap_opt_scan_req_report_t scan_req_report; /**< Parameters for the scan request report option.*/ ble_gap_opt_compat_mode_1_t compat_mode_1; /**< Parameters for the compatibility mode 1 option.*/ ble_gap_opt_auth_payload_timeout_t auth_payload_timeout; /**< Parameters for the authenticated payload timeout option.*/ ble_gap_opt_slave_latency_disable_t slave_latency_disable; /**< Parameters for the Disable slave latency option */ @@ -1404,37 +1744,51 @@ SVCALL(SD_BLE_GAP_PRIVACY_SET, uint32_t, sd_ble_gap_privacy_set(ble_gap_privacy_ SVCALL(SD_BLE_GAP_PRIVACY_GET, uint32_t, sd_ble_gap_privacy_get(ble_gap_privacy_params_t *p_privacy_params)); -/**@brief Set, clear or update advertising and scan response data. +/**@brief Configure an advertising set. Set, clear or update advertising and scan response data. * * @note The format of the advertising data will be checked by this call to ensure interoperability. * Limitations imposed by this API call to the data provided include having a flags data type in the scan response data and * duplicating the local name in the advertising data and scan response data. * - * @note To clear the advertising data and set it to a 0-length packet, simply provide a valid pointer (p_data/p_sr_data) with its corresponding - * length (dlen/srdlen) set to 0. - * - * @note The call will fail if p_data and p_sr_data are both NULL since this would have no effect. + * @note In order to update advertising data while advertising, new advertising buffers must be provided. * * @mscs * @mmsc{@ref BLE_GAP_ADV_MSC} * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * - * @param[in] p_data Raw data to be placed in advertising packet. If NULL, no changes are made to the current advertising packet data. - * @param[in] dlen Data length for p_data. Max size: @ref BLE_GAP_ADV_MAX_SIZE octets. Should be 0 if p_data is NULL, can be 0 if p_data is not NULL. - * @param[in] p_sr_data Raw data to be placed in scan response packet. If NULL, no changes are made to the current scan response packet data. - * @param[in] srdlen Data length for p_sr_data. Max size: @ref BLE_GAP_ADV_MAX_SIZE octets. Should be 0 if p_sr_data is NULL, can be 0 if p_data is not NULL. + * @param[in,out] p_adv_handle Provide a pointer to a handle containing @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to configure + * a new advertising set. On success, a new handle is then returned through the pointer. + * Provide a pointer to an existing advertising handle to configure an existing advertising set. + * @param[in] p_adv_data Advertising data. If set to NULL, no advertising data will be used. See @ref ble_gap_adv_data_t. + * @param[in] p_adv_params Advertising parameters. When this function is used to update advertising data while advertising, + * this parameter must be NULL. See @ref ble_gap_adv_params_t. * - * @retval ::NRF_SUCCESS Advertising data successfully updated or cleared. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, both p_data and p_sr_data cannot be NULL. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. - * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied, check the advertising data format specification. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data type. + * @retval ::NRF_SUCCESS Advertising set successfully configured. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: + * - Invalid advertising data configuration specified. See @ref ble_gap_adv_data_t. + * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. + * - Use of whitelist requested but whitelist has not been set, + * see @ref sd_ble_gap_whitelist_set. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR ble_gap_adv_params_t::p_peer_addr is invalid. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. + * - It is invalid to provide non-NULL advertising set parameters while advertising. + * - It is invalid to provide the same data buffers while advertising. To update + * advertising data, provide new advertising buffers. + * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE The provided advertising handle was not found. Use @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to + * configure a new advertising handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. + * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied. Check the advertising data format specification + * given in Bluetooth Specification Version 5.0, Volume 3, Part C, Chapter 11. + * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data length or advertising parameter configuration. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to configure a new advertising handle. Update an + * existing advertising handle instead. * @retval ::BLE_ERROR_GAP_UUID_LIST_MISMATCH Invalid UUID list supplied. */ -SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const *p_data, uint8_t dlen, uint8_t const *p_sr_data, uint8_t srdlen)); +SVCALL(SD_BLE_GAP_ADV_SET_CONFIGURE, uint32_t, sd_ble_gap_adv_set_configure(uint8_t *p_adv_handle, ble_gap_adv_data_t const *p_adv_data, ble_gap_adv_params_t const *p_adv_params)); /**@brief Start advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). @@ -1443,7 +1797,8 @@ SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const * * @events * @event{@ref BLE_GAP_EVT_CONNECTED, Generated after connection has been established through connectable advertising.} - * @event{@ref BLE_GAP_EVT_TIMEOUT, Advertisement has timed out.} + * @event{@ref BLE_GAP_EVT_ADV_SET_TERMINATED, Advertising set has terminated.} + * @event{@ref BLE_GAP_EVT_SCAN_REQ_REPORT, A scan request was received.} * @endevents * * @mscs @@ -1453,23 +1808,31 @@ SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * - * @param[in] p_adv_params Pointer to advertising parameters structure. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. If - * @ref ble_gap_adv_params_t::type is @ref BLE_GAP_ADV_TYPE_ADV_NONCONN_IND, - * this is ignored. + * @param[in] adv_handle Advertising handle to advertise on, received from @ref sd_ble_gap_adv_set_configure. + * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or + * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. For non-connectable + * advertising, this is ignored. * - * @retval ::NRF_SUCCESS The BLE stack has started advertising. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check the accepted ranges and limits. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Bluetooth address supplied. - * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Observer) and try again + * @retval ::NRF_SUCCESS The BLE stack has started advertising. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. adv_handle is not configured or already advertising. + * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. Configure a new adveriting handle with @ref sd_ble_gap_adv_set_configure. + * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: + * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. + * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. + * @retval ::NRF_ERROR_RESOURCES Either: + * - adv_handle is configured with connectable advertising, but the event_length parameter + * associated with conn_cfg_tag is too small to be able to establish a connection on + * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. + * - Not enough BLE role slots available. + Stop one or more currently active roles (Central, Peripheral, Broadcaster or Observer) and try again. + * - p_adv_params is configured with connectable advertising, but the event_length parameter + * associated with conn_cfg_tag is too small to be able to establish a connection on + * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. */ -SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(ble_gap_adv_params_t const *p_adv_params, uint8_t conn_cfg_tag)); +SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(uint8_t adv_handle, uint8_t conn_cfg_tag)); /**@brief Stop advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). @@ -1479,10 +1842,13 @@ SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(ble_gap_adv_params_t * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * + * @param[in] adv_handle The advertising handle that should stop advertising. + * * @retval ::NRF_SUCCESS The BLE stack has stopped advertising. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation (most probably not in advertising state). + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Invalid advertising handle. + * @retval ::NRF_ERROR_INVALID_STATE The advertising handle is not advertising. */ -SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(void)); +SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(uint8_t adv_handle)); @@ -1549,12 +1915,27 @@ SVCALL(SD_BLE_GAP_DISCONNECT, uint32_t, sd_ble_gap_disconnect(uint16_t conn_hand /**@brief Set the radio's transmit power. * - * @param[in] tx_power Radio transmit power in dBm (accepted values are -40, -20, -16, -12, -8, -4, 0, 3, and 4 dBm). + * @param[in] role The role to set the transmit power for, see @ref BLE_GAP_TX_POWER_ROLES for + * possible roles. + * @param[in] handle The handle parameter is interpreted depending on role: + * - If role is @ref BLE_GAP_TX_POWER_ROLE_CONN, this value is the specific connection handle. + * - If role is @ref BLE_GAP_TX_POWER_ROLE_ADV, the advertising set identified with the advertising handle, + * will use the specified transmit power, and include it in the advertising packet headers if + * @ref ble_gap_adv_properties_t::include_tx_power set. + * - For all other roles handle is ignored. + * @param[in] tx_power Radio transmit power in dBm (see note for accepted values). + * + * @note Supported tx_power values: -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +3dBm and +4dBm. + * @note The initiator will have the same transmit power as the scanner. + * @note When a connection is created it will inherit the transmit power from the initiator or + * advertiser leading to the connection. * * @retval ::NRF_SUCCESS Successfully changed the transmit power. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. */ -SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(int8_t tx_power)); +SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(uint8_t role, uint16_t handle, int8_t tx_power)); /**@brief Set GAP Appearance value. @@ -1775,6 +2156,7 @@ SVCALL(SD_BLE_GAP_SEC_PARAMS_REPLY, uint32_t, sd_ble_gap_sec_params_reply(uint16 */ SVCALL(SD_BLE_GAP_AUTH_KEY_REPLY, uint32_t, sd_ble_gap_auth_key_reply(uint16_t conn_handle, uint8_t key_type, uint8_t const *p_key)); + /**@brief Reply with an LE Secure connections DHKey. * * @details This function is only used to reply to a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. @@ -1808,6 +2190,7 @@ SVCALL(SD_BLE_GAP_AUTH_KEY_REPLY, uint32_t, sd_ble_gap_auth_key_reply(uint16_t c */ SVCALL(SD_BLE_GAP_LESC_DHKEY_REPLY, uint32_t, sd_ble_gap_lesc_dhkey_reply(uint16_t conn_handle, ble_gap_lesc_dhkey_t const *p_dhkey)); + /**@brief Notify the peer of a local keypress. * * @mscs @@ -1826,6 +2209,7 @@ SVCALL(SD_BLE_GAP_LESC_DHKEY_REPLY, uint32_t, sd_ble_gap_lesc_dhkey_reply(uint16 */ SVCALL(SD_BLE_GAP_KEYPRESS_NOTIFY, uint32_t, sd_ble_gap_keypress_notify(uint16_t conn_handle, uint8_t kp_not)); + /**@brief Generate a set of OOB data to send to a peer out of band. * * @note The @ref ble_gap_addr_t included in the OOB data returned will be the currently active one (or, if a connection has already been established, @@ -1836,7 +2220,7 @@ SVCALL(SD_BLE_GAP_KEYPRESS_NOTIFY, uint32_t, sd_ble_gap_keypress_notify(uint16_t * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} * @endmscs * - * @param[in] conn_handle Connection handle. Can be BLE_CONN_HANDLE_INVALID if a BLE connection has not been established yet. + * @param[in] conn_handle Connection handle. Can be @ref BLE_CONN_HANDLE_INVALID if a BLE connection has not been established yet. * @param[in] p_pk_own LE Secure Connections local P-256 Public Key. * @param[out] p_oobd_own The OOB data to be sent out of band to a peer. * @@ -1874,6 +2258,7 @@ SVCALL(SD_BLE_GAP_LESC_OOB_DATA_GET, uint32_t, sd_ble_gap_lesc_oob_data_get(uint */ SVCALL(SD_BLE_GAP_LESC_OOB_DATA_SET, uint32_t, sd_ble_gap_lesc_oob_data_set(uint16_t conn_handle, ble_gap_lesc_oob_data_t const *p_oobd_own, ble_gap_lesc_oob_data_t const *p_oobd_peer)); + /**@brief Initiate GAP Encryption procedure. * * @details In the central role, this function will initiate the encryption procedure using the encryption information provided. @@ -1958,7 +2343,7 @@ SVCALL(SD_BLE_GAP_CONN_SEC_GET, uint32_t, sd_ble_gap_conn_sec_get(uint16_t conn_ * @param[in] skip_count Number of RSSI samples with a change of threshold_dbm or more before sending a new @ref BLE_GAP_EVT_RSSI_CHANGED event. * * @retval ::NRF_SUCCESS Successfully activated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress. Invalid state to perform operation. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is already ongoing. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. */ SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_handle, uint8_t threshold_dbm, uint8_t skip_count)); @@ -1977,7 +2362,7 @@ SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_hand * @param[in] conn_handle Connection handle. * * @retval ::NRF_SUCCESS Successfully deactivated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. */ SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle)); @@ -1987,24 +2372,44 @@ SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle * * @ref sd_ble_gap_rssi_start must be called to start reporting RSSI before using this function. @ref NRF_ERROR_NOT_FOUND * will be returned until RSSI was sampled for the first time after calling @ref sd_ble_gap_rssi_start. - * * @mscs * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} * @endmscs * * @param[in] conn_handle Connection handle. * @param[out] p_rssi Pointer to the location where the RSSI measurement shall be stored. + * @param[out] p_ch_index Pointer to the location where Channel Index for the RSSI measurement shall be stored. * * @retval ::NRF_SUCCESS Successfully read the RSSI. * @retval ::NRF_ERROR_NOT_FOUND No sample is available. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing, or disconnection in progress. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. */ -SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi)); +SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi, uint8_t *p_ch_index)); -/**@brief Start scanning (GAP Discovery procedure, Observer Procedure). +/**@brief Start or continue scanning (GAP Discovery procedure, Observer Procedure). + * + * @note A call to this function will require the application to keep the memory pointed by + * p_adv_report_buffer alive until the buffer is released. The buffer is released when the scanner is stopped + * or when this function is called with another buffer. + * + * @note The scanner will automatically stop in the following cases: + * - @ref sd_ble_gap_scan_stop is called. + * - @ref sd_ble_gap_connect is called. + * - A @ref BLE_GAP_EVT_TIMEOUT with source set to @ref BLE_GAP_TIMEOUT_SRC_SCAN is received. + * - When a @ref BLE_GAP_EVT_ADV_REPORT event is received and @ref ble_gap_adv_report_type_t::status is not set to + * @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. In this case scanning is only paused to let the application + * access received data. The application must call this function to continue scanning, or call @ref sd_ble_gap_scan_stop + * to stop scanning. + * + * @note If a @ref BLE_GAP_EVT_ADV_REPORT event is received with @ref ble_gap_adv_report_type_t::status set to + * @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the scanner will continue scanning, and the application will + * receive more reports from this advertising event. The following reports will include the old and new received data. + * The application can stop the scanner from receiving more packets from this advertising event by calling this function. + * This might be useful when receiving data from extended advertising events where @ref ble_gap_evt_adv_report_t::aux_pointer + * is large. * * @events * @event{@ref BLE_GAP_EVT_ADV_REPORT, An advertising or scan response packet has been received.} @@ -2016,19 +2421,34 @@ SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * - * @param[in] p_scan_params Pointer to scan parameters structure. + * @param[in] p_scan_params Pointer to scan parameters structure. When this function is used to continue + * scanning, this parameter must be NULL. + * @param[in] p_adv_report_buffer Pointer to buffer used to store incoming advertising data. + * The memory pointed to should be kept alive until the scanning is stopped. + * See @ref BLE_GAP_SCAN_BUFFER_SIZE for minimum and maximum buffer size. + * If the scanner receives advertising data larger than can be stored in the buffer, + * a @ref BLE_GAP_EVT_ADV_REPORT will be raised with @ref ble_gap_adv_report_type_t::status + * set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED. * * @retval ::NRF_SUCCESS Successfully initiated scanning procedure. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - Scanning is already ongoing and p_scan_params was not NULL + * - Scanning is not running and p_scan_params was NULL. + * - The scanner has timed out when this function is called to continue scanning. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. See @ref ble_gap_scan_params_t. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported parameters supplied. See @ref ble_gap_scan_params_t. + * @retval ::NRF_ERROR_INVALID_LENGTH The provided buffer length is invalid. See @ref BLE_GAP_SCAN_BUFFER_MIN. * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. */ -SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params)); +SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params, ble_data_t const * p_adv_report_buffer)); /**@brief Stop scanning (GAP Discovery procedure, Observer Procedure). + * + * @note The buffer provided in @ref sd_ble_gap_scan_start is released. * * @mscs * @mmsc{@ref BLE_GAP_SCAN_MSC} @@ -2036,7 +2456,7 @@ SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_param * @endmscs * * @retval ::NRF_SUCCESS Successfully stopped scanning procedure. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation (most probably not in scanning state). + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Not in the scanning state. */ SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); @@ -2052,11 +2472,12 @@ SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC} * @endmscs * - * @param[in] p_peer_addr Pointer to peer address. If the use_whitelist bit is set in @ref ble_gap_scan_params_t, then this is ignored. + * @param[in] p_peer_addr Pointer to peer identity address. If @ref ble_gap_scan_params_t::filter_policy is set to use + * whitelist, then p_peer_addr is ignored. * @param[in] p_scan_params Pointer to scan parameters structure. * @param[in] p_conn_params Pointer to desired connection parameters. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. + * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or + * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. * * @retval ::NRF_SUCCESS Successfully initiated connection procedure. * @retval ::NRF_ERROR_INVALID_ADDR Invalid parameter(s) pointer supplied. @@ -2064,12 +2485,18 @@ SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); * - Invalid parameter(s) in p_scan_params or p_conn_params. * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. * - Peer address was not present in the device identity list, see @ref sd_ble_gap_device_identities_set. + * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. * @retval ::NRF_ERROR_INVALID_STATE The SoftDevice is in an invalid state to perform this operation. This may be due to an * existing locally initiated connect procedure, which must complete before initiating again. * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Peer address. * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again + * @retval ::NRF_ERROR_RESOURCES Either: + * - Not enough BLE role slots available. + * Stop one or more currently active roles (Central, Peripheral or Observer) and try again. + * - The event_length parameter associated with conn_cfg_tag is too small to be able to + * establish a connection on the selected @ref ble_gap_scan_params_t::scan_phys. + * Use @ref sd_ble_cfg_set to increase the event length. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. */ SVCALL(SD_BLE_GAP_CONNECT, uint32_t, sd_ble_gap_connect(ble_gap_addr_t const *p_peer_addr, ble_gap_scan_params_t const *p_scan_params, ble_gap_conn_params_t const *p_conn_params, uint8_t conn_cfg_tag)); @@ -2088,16 +2515,33 @@ SVCALL(SD_BLE_GAP_CONNECT_CANCEL, uint32_t, sd_ble_gap_connect_cancel(void)); /**@brief Initiate or respond to a PHY Update Procedure * - * @details This function is used to initiate or respond to a PHY Update Procedure. It will always generate a - * @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys - * is @ref BLE_GAP_PHY_AUTO, then the stack will select a PHY for the respective direction based on the peer's PHY preferences - * and the local stack configuration. If the peer does not support the PHY Update Procedure, then the - * resulting @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to + * @details This function is used to initiate or respond to a PHY Update Procedure. It will always + * generate a @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. + * If this function is used to initiate a PHY Update procedure and the only option + * provided in @ref ble_gap_phys_t::tx_phys and @ref ble_gap_phys_t::rx_phys is the + * currently active PHYs in the respective directions, the SoftDevice will generate a + * @ref BLE_GAP_EVT_PHY_UPDATE with the current PHYs set and will not initiate the + * procedure in the Link Layer. + * + * If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys is @ref BLE_GAP_PHY_AUTO, + * then the stack will select PHYs based on the peer's PHY preferences and the local link + * configuration. The PHY Update procedure will for this case result in a PHY combination + * that respects the time constraints configured with @ref sd_ble_cfg_set and the current + * link layer data length. + * + * When acting as a central, the SoftDevice will select the fastest common PHY in each direction. + * + * If the peer does not support the PHY Update Procedure, then the resulting + * @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to * @ref BLE_HCI_UNSUPPORTED_REMOTE_FEATURE. - * If the PHY procedure was rejected by the peer due to a procedure collision, the status will be - * @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION. - * If the peer responds to the PHY Update procedure with invalid parameters, the status will be @ref BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS. - * If the PHY procedure was rejected by the peer for a different reason, the status will contain the reason as specified by the peer. + * + * If the PHY procedure was rejected by the peer due to a procedure collision, the status + * will be @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or + * @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION. + * If the peer responds to the PHY Update procedure with invalid parameters, the status + * will be @ref BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS. + * If the PHY procedure was rejected by the peer for a different reason, the status will + * contain the reason as specified by the peer. * * @events * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update Procedure.} @@ -2114,17 +2558,16 @@ SVCALL(SD_BLE_GAP_CONNECT_CANCEL, uint32_t, sd_ble_gap_connect_cancel(void)); * @retval ::NRF_SUCCESS Successfully requested a PHY Update. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Unsupported PHYs supplied to the call. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. * @retval ::NRF_ERROR_BUSY Procedure is already in progress or not allowed at this time. Process pending events and wait for the pending procedure to complete and retry. * */ SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)); + /**@brief Initiate or respond to a Data Length Update Procedure. - * - * @note Only symmetric input parameters for the Data Length Update is supported. Only @ref - * BLE_GAP_DATA_LENGTH_AUTO for max_tx_time_us and max_rx_time_us is supported. * * @note If the application uses @ref BLE_GAP_DATA_LENGTH_AUTO for one or more members of * p_dl_params, the SoftDevice will choose the highest value supported in current @@ -2136,7 +2579,7 @@ SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_hand * the SoftDevice automatically decide the value for that member. * Set to NULL to use automatic values for all members. * @param[out] p_dl_limitation Pointer to limitation to be written when local device does not - * have enough resources to accommodate the requested Data Length + * have enough resources or does not support the requested Data Length * Update parameters. Ignored if NULL. * * @mscs @@ -2148,14 +2591,54 @@ SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_hand * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter supplied. * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED The requested parameters are not supported by the SoftDevice. - * @retval ::NRF_ERROR_RESOURCES The requested parameters can not be accommodated. Inspect - * p_dl_limitation so see where the limitation is. + * @retval ::NRF_ERROR_NOT_SUPPORTED The requested parameters are not supported by the SoftDevice. Inspect + * p_dl_limitation to see which parameter is not supported. + * @retval ::NRF_ERROR_RESOURCES The connection event length configured for this link is not sufficient for the requested parameters. + * Use @ref sd_ble_cfg_set with @ref BLE_CONN_CFG_GAP to increase the connection event length. + * Inspect p_dl_limitation to see where the limitation is. * @retval ::NRF_ERROR_BUSY Peer has already initiated a Data Length Update Procedure. Process the * pending @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST event to respond. */ SVCALL(SD_BLE_GAP_DATA_LENGTH_UPDATE, uint32_t, sd_ble_gap_data_length_update(uint16_t conn_handle, ble_gap_data_length_params_t const *p_dl_params, ble_gap_data_length_limitation_t *p_dl_limitation)); +/**@brief Start the Quality of Service (QoS) channel survey module. + * + * @details The channel survey module provides measurements of the energy levels on + * the Bluetooth Low Energy channels. When the module is enabled, @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT + * events will periodically report the measured energy levels for each channel. + * + * @note The measurements are scheduled with lower priority than other Bluetooth Low Energy roles, + * Radio Timeslot API events and Flash API events. + * + * @note The channel survey module will attempt to do measurements so that the average interval + * between measurements will be interval_us. However due to the channel survey module + * having the lowest priority of all roles and modules, this may not be possible. In that + * case fewer than expected channel survey reports may be given. + * + * @note In order to use the channel survey module, @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available + * must be set. This is done using @ref sd_ble_cfg_set. + * + * @param[in] interval_us Requested average interval for the measurements and reports. See + * @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS for valid ranges. If set + * to @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS, the channel + * survey role will be scheduled at every available opportunity. + * + * @retval ::NRF_SUCCESS The module is successfully started. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter supplied. interval_us is out of the + * allowed range. + * @retval ::NRF_ERROR_INVALID_STATE Trying to start the module when already running. + * @retval ::NRF_ERROR_RESOURCES The channel survey module is not available to the application. + * Set @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available using + * @ref sd_ble_cfg_set. + */ +SVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_START, uint32_t, sd_ble_gap_qos_channel_survey_start(uint32_t interval_us)); + +/**@brief Stop the Quality of Service (QoS) channel survey module. + * + * @retval ::NRF_SUCCESS The module is successfully stopped. + * @retval ::NRF_ERROR_INVALID_STATE Trying to stop the module when it is not running. + */ +SVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP, uint32_t, sd_ble_gap_qos_channel_survey_stop(void)); /** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gatt.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gatt.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gatt.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gatt.h index 4e054cf5c3..98a7a150bf 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gatt.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gatt.h @@ -45,8 +45,13 @@ #ifndef BLE_GATT_H__ #define BLE_GATT_H__ -#include "ble_types.h" +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" #include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" #ifdef __cplusplus extern "C" { @@ -179,7 +184,7 @@ extern "C" { /** * @brief BLE GATT connection configuration parameters, set with @ref sd_ble_cfg_set. * - * @retval NRF_ERROR_INVALID_PARAM att_mtu is smaller than @ref BLE_GATT_ATT_MTU_DEFAULT. + * @retval ::NRF_ERROR_INVALID_PARAM att_mtu is smaller than @ref BLE_GATT_ATT_MTU_DEFAULT. */ typedef struct { diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gattc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gattc.h similarity index 95% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gattc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gattc.h index 191f3a85ea..7fb3920244 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gattc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gattc.h @@ -45,12 +45,14 @@ #ifndef BLE_GATTC_H__ #define BLE_GATTC_H__ -#include "ble_gatt.h" -#include "ble_types.h" -#include "ble_ranges.h" +#include +#include "nrf.h" #include "nrf_svc.h" #include "nrf_error.h" -#include "nrf.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" +#include "ble_gatt.h" #ifdef __cplusplus extern "C" { @@ -372,6 +374,7 @@ typedef struct * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_services_discover(uint16_t conn_handle, uint16_t start_handle, ble_uuid_t const *p_srvc_uuid)); @@ -398,6 +401,7 @@ SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_se * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); @@ -426,6 +430,7 @@ SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteristics_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); @@ -451,6 +456,7 @@ SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteris * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); @@ -477,6 +483,7 @@ SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_dis * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle, ble_uuid_t const *p_uuid, ble_gattc_handle_range_t const *p_handle_range)); @@ -503,6 +510,7 @@ SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_b * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint16_t handle, uint16_t offset)); @@ -528,6 +536,7 @@ SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(uint16_t conn_handle, uint16_t const *p_handles, uint16_t handle_count)); @@ -574,6 +583,7 @@ SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(ui * @retval ::NRF_ERROR_BUSY For write with response, procedure already in progress. Wait for a @ref BLE_GATTC_EVT_WRITE_RSP event and retry. * @retval ::NRF_ERROR_RESOURCES Too many writes without responses queued. * Wait for a @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event and retry. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, ble_gattc_write_params_t const *p_write_params)); @@ -591,6 +601,7 @@ SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, bl * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no Indication pending to be confirmed. * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_handle, uint16_t handle)); @@ -608,6 +619,7 @@ SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_ * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * p_handle_range)); @@ -640,6 +652,7 @@ SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discove * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state or an ATT_MTU exchange was already requested once. * @retval ::NRF_ERROR_INVALID_PARAM Invalid Client RX MTU size supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, uint32_t, sd_ble_gattc_exchange_mtu_request(uint16_t conn_handle, uint16_t client_rx_mtu)); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gatts.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gatts.h similarity index 96% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gatts.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gatts.h index 5e8615c05d..e437b6e076 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gatts.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_gatts.h @@ -45,12 +45,15 @@ #ifndef BLE_GATTS_H__ #define BLE_GATTS_H__ -#include "ble_types.h" -#include "ble_ranges.h" -#include "ble_l2cap.h" -#include "ble_gap.h" -#include "ble_gatt.h" +#include #include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" +#include "ble_gatt.h" +#include "ble_gap.h" #ifdef __cplusplus extern "C" { @@ -286,7 +289,7 @@ typedef struct uint16_t handle; /**< Characteristic Value Handle. */ uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ uint16_t offset; /**< Offset within the attribute value. */ - uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after successful return. */ + uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after return. */ uint8_t const *p_data; /**< Actual data content, use NULL to use the current attribute value. */ } ble_gatts_hvx_params_t; @@ -546,8 +549,8 @@ SVCALL(SD_BLE_GATTS_VALUE_SET, uint32_t, sd_ble_gatts_value_set(uint16_t conn_ha /**@brief Get the value of a given attribute. * * @note If the attribute value is longer than the size of the supplied buffer, - * p_len will return the total attribute value length (excluding offset), - * and not the number of bytes actually returned in p_data. + * @ref ble_gatts_value_t::len will return the total attribute value length (excluding offset), + * and not the number of bytes actually returned in @ref ble_gatts_value_t::p_value. * The application may use this information to allocate a suitable buffer size. * * @note When retrieving system attribute values with this function, the connection handle @@ -576,7 +579,7 @@ SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_ha * @note The local attribute value may be updated even if an outgoing packet is not sent to the peer due to an error during execution. * The Attribute Table has been updated if one of the following error codes is returned: @ref NRF_ERROR_INVALID_STATE, @ref NRF_ERROR_BUSY, * @ref NRF_ERROR_FORBIDDEN, @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING and @ref NRF_ERROR_RESOURCES. - * The caller can check whether the value has been updated by looking at the contents of *(p_hvx_params->p_len). + * The caller can check whether the value has been updated by looking at the contents of *(@ref ble_gatts_hvx_params_t::p_len). * * @note Only one indication procedure can be ongoing per connection at a time. * If the application tries to indicate an attribute value while another indication procedure is ongoing, @@ -604,9 +607,12 @@ SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_ha * @mmsc{@ref BLE_GATTS_HVX_DISABLED_MSC} * @endmscs * - * @param[in] conn_handle Connection handle. - * @param[in] p_hvx_params Pointer to an HVx parameters structure. If the p_data member contains a non-NULL pointer the attribute value will be updated with - * the contents pointed by it before sending the notification or indication. + * @param[in] conn_handle Connection handle. + * @param[in,out] p_hvx_params Pointer to an HVx parameters structure. If @ref ble_gatts_hvx_params_t::p_data + * contains a non-NULL pointer the attribute value will be updated with the contents + * pointed by it before sending the notification or indication. If the attribute value + * is updated, @ref ble_gatts_hvx_params_t::p_len is updated by the SoftDevice to + * contain the number of actual bytes written, else it will be set to 0. * * @retval ::NRF_SUCCESS Successfully queued a notification or indication for transmission, and optionally updated the attribute value. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. @@ -625,6 +631,7 @@ SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_ha * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. * @retval ::NRF_ERROR_RESOURCES Too many notifications queued. * Wait for a @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event and retry. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t const *p_hvx_params)); @@ -660,6 +667,7 @@ SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_ga * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied, handles must be in the range populated by the application. * @retval ::NRF_ERROR_BUSY Procedure already in progress. * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle)); @@ -692,6 +700,7 @@ SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint * @retval ::NRF_ERROR_INVALID_PARAM Authorization op invalid, * handle supplied does not match requested handle, * or invalid data to be written provided by the application. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params)); @@ -813,7 +822,7 @@ SVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, b * @param[in] server_rx_mtu Server RX MTU size. * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration - used for this connection. + * used for this connection. * - The value must be equal to Client RX MTU size given in @ref sd_ble_gattc_exchange_mtu_request * if an ATT_MTU exchange has already been performed in the other direction. * @@ -821,6 +830,7 @@ SVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, b * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no ATT_MTU exchange request pending. * @retval ::NRF_ERROR_INVALID_PARAM Invalid Server RX MTU size supplied. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_EXCHANGE_MTU_REPLY, uint32_t, sd_ble_gatts_exchange_mtu_reply(uint16_t conn_handle, uint16_t server_rx_mtu)); /** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_hci.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_hci.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_hci.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_hci.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_l2cap.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_l2cap.h similarity index 91% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_l2cap.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_l2cap.h index 3b53ded092..eaeb4b7d28 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_l2cap.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_l2cap.h @@ -45,10 +45,12 @@ #ifndef BLE_L2CAP_H__ #define BLE_L2CAP_H__ -#include "ble_types.h" -#include "ble_ranges.h" -#include "ble_err.h" +#include #include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" #ifdef __cplusplus extern "C" { @@ -82,32 +84,32 @@ extern "C" { /**@brief L2CAP API SVC numbers. */ enum BLE_L2CAP_SVCS { - SD_BLE_L2CAP_CH_SETUP = BLE_L2CAP_SVC_BASE, /**< Set up an L2CAP channel. */ - SD_BLE_L2CAP_CH_RELEASE, /**< Release an L2CAP channel. */ - SD_BLE_L2CAP_CH_RX, /**< Receive an SDU on an L2CAP channel. */ - SD_BLE_L2CAP_CH_TX, /**< Transmit an SDU on an L2CAP channel. */ - SD_BLE_L2CAP_CH_FLOW_CONTROL, /**< Advanced SDU reception flow control. */ + SD_BLE_L2CAP_CH_SETUP = BLE_L2CAP_SVC_BASE + 0, /**< Set up an L2CAP channel. */ + SD_BLE_L2CAP_CH_RELEASE = BLE_L2CAP_SVC_BASE + 1, /**< Release an L2CAP channel. */ + SD_BLE_L2CAP_CH_RX = BLE_L2CAP_SVC_BASE + 2, /**< Receive an SDU on an L2CAP channel. */ + SD_BLE_L2CAP_CH_TX = BLE_L2CAP_SVC_BASE + 3, /**< Transmit an SDU on an L2CAP channel. */ + SD_BLE_L2CAP_CH_FLOW_CONTROL = BLE_L2CAP_SVC_BASE + 4, /**< Advanced SDU reception flow control. */ }; /**@brief L2CAP Event IDs. */ enum BLE_L2CAP_EVTS { - BLE_L2CAP_EVT_CH_SETUP_REQUEST = BLE_L2CAP_EVT_BASE, /**< L2CAP Channel Setup Request event. - \n See @ref ble_l2cap_evt_ch_setup_request_t. */ - BLE_L2CAP_EVT_CH_SETUP_REFUSED, /**< L2CAP Channel Setup Refused event. - \n See @ref ble_l2cap_evt_ch_setup_refused_t. */ - BLE_L2CAP_EVT_CH_SETUP, /**< L2CAP Channel Setup Completed event. - \n See @ref ble_l2cap_evt_ch_setup_t. */ - BLE_L2CAP_EVT_CH_RELEASED, /**< L2CAP Channel Released event. - \n No additional event structure applies. */ - BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED, /**< L2CAP Channel SDU data buffer released event. - \n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */ - BLE_L2CAP_EVT_CH_CREDIT, /**< L2CAP Channel Credit received. - \n See @ref ble_l2cap_evt_ch_credit_t. */ - BLE_L2CAP_EVT_CH_RX, /**< L2CAP Channel SDU received. - \n See @ref ble_l2cap_evt_ch_rx_t. */ - BLE_L2CAP_EVT_CH_TX, /**< L2CAP Channel SDU transmitted. - \n See @ref ble_l2cap_evt_ch_tx_t. */ + BLE_L2CAP_EVT_CH_SETUP_REQUEST = BLE_L2CAP_EVT_BASE + 0, /**< L2CAP Channel Setup Request event. + \n See @ref ble_l2cap_evt_ch_setup_request_t. */ + BLE_L2CAP_EVT_CH_SETUP_REFUSED = BLE_L2CAP_EVT_BASE + 1, /**< L2CAP Channel Setup Refused event. + \n See @ref ble_l2cap_evt_ch_setup_refused_t. */ + BLE_L2CAP_EVT_CH_SETUP = BLE_L2CAP_EVT_BASE + 2, /**< L2CAP Channel Setup Completed event. + \n See @ref ble_l2cap_evt_ch_setup_t. */ + BLE_L2CAP_EVT_CH_RELEASED = BLE_L2CAP_EVT_BASE + 3, /**< L2CAP Channel Released event. + \n No additional event structure applies. */ + BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED = BLE_L2CAP_EVT_BASE + 4, /**< L2CAP Channel SDU data buffer released event. + \n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */ + BLE_L2CAP_EVT_CH_CREDIT = BLE_L2CAP_EVT_BASE + 5, /**< L2CAP Channel Credit received. + \n See @ref ble_l2cap_evt_ch_credit_t. */ + BLE_L2CAP_EVT_CH_RX = BLE_L2CAP_EVT_BASE + 6, /**< L2CAP Channel SDU received. + \n See @ref ble_l2cap_evt_ch_rx_t. */ + BLE_L2CAP_EVT_CH_TX = BLE_L2CAP_EVT_BASE + 7, /**< L2CAP Channel SDU transmitted. + \n See @ref ble_l2cap_evt_ch_tx_t. */ }; /** @} */ @@ -472,8 +474,8 @@ SVCALL(SD_BLE_L2CAP_CH_TX, uint32_t, sd_ble_l2cap_ch_tx(uint16_t conn_handle, ui * available to the peer. If the value written by the SoftDevice is 0 when * credits parameter was set to 0, the peer will not be able to send more * data until more credits are provided by calling this function again with - * credits > 0. This parameter is ignored when local_cid is set to @ref - * BLE_L2CAP_CID_INVALID. + * credits > 0. This parameter is ignored when local_cid is set to + * @ref BLE_L2CAP_CID_INVALID. * * @note Application should take care when setting number of credits higher than default value. In * this case the application must make sure that the SoftDevice always has reception buffers diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_ranges.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_ranges.h similarity index 93% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_ranges.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_ranges.h index 5b9d891402..0935bca071 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_ranges.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_ranges.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -67,15 +67,15 @@ extern "C" { #define BLE_SVC_LAST 0x6B /**< Common BLE SVC last. */ #define BLE_GAP_SVC_BASE 0x6C /**< GAP BLE SVC base. */ -#define BLE_GAP_SVC_LAST 0x93 /**< GAP BLE SVC last. */ +#define BLE_GAP_SVC_LAST 0x9A /**< GAP BLE SVC last. */ -#define BLE_GATTC_SVC_BASE 0x94 /**< GATTC BLE SVC base. */ -#define BLE_GATTC_SVC_LAST 0x9F /**< GATTC BLE SVC last. */ +#define BLE_GATTC_SVC_BASE 0x9B /**< GATTC BLE SVC base. */ +#define BLE_GATTC_SVC_LAST 0xA7 /**< GATTC BLE SVC last. */ -#define BLE_GATTS_SVC_BASE 0xA0 /**< GATTS BLE SVC base. */ -#define BLE_GATTS_SVC_LAST 0xAF /**< GATTS BLE SVC last. */ +#define BLE_GATTS_SVC_BASE 0xA8 /**< GATTS BLE SVC base. */ +#define BLE_GATTS_SVC_LAST 0xB7 /**< GATTS BLE SVC last. */ -#define BLE_L2CAP_SVC_BASE 0xB0 /**< L2CAP BLE SVC base. */ +#define BLE_L2CAP_SVC_BASE 0xB8 /**< L2CAP BLE SVC base. */ #define BLE_L2CAP_SVC_LAST 0xBF /**< L2CAP BLE SVC last. */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_types.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_types.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_types.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/ble_types.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/mbr/nrf_mbr.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf52/nrf_mbr.h similarity index 75% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/mbr/nrf_mbr.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf52/nrf_mbr.h index c95bb8d4fd..cc5971c7a3 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/mbr/nrf_mbr.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf52/nrf_mbr.h @@ -81,13 +81,13 @@ enum NRF_MBR_SVCS /**@brief Possible values for ::sd_mbr_command_t.command */ enum NRF_MBR_COMMANDS { - SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see sd_mbr_command_copy_bl_t*/ + SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see ::sd_mbr_command_copy_bl_t*/ SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ - SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD*/ + SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD. Does not require any parameters in ::sd_mbr_command_t params.*/ SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ - SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset @see ::sd_mbr_command_vector_table_base_set_t*/ + SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset. @see ::sd_mbr_command_vector_table_base_set_t*/ SD_MBR_COMMAND_RESERVED, - SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address @see ::sd_mbr_command_irq_forward_address_set_t*/ + SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address. @see ::sd_mbr_command_irq_forward_address_set_t*/ }; /** @} */ @@ -96,6 +96,7 @@ enum NRF_MBR_COMMANDS * @{ */ /**@brief This command copies part of a new SoftDevice + * * The destination area is erased before copying. * If dst is in the middle of a flash page, that whole flash page will be erased. * If (dst+len) is in the middle of a flash page, that whole flash page will be erased. @@ -127,14 +128,16 @@ typedef struct /**@brief This command copies a new BootLoader. - * With this command, destination of BootLoader is always the address written in NRF_UICR->BOOTADDR. * - * Destination is erased by this function. - * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. + * With this command, destination of BootLoader is always the address written in + * NRF_UICR->BOOTADDR. * - * This function will use PROTENSET to protect the flash that is not intended to be written. + * Destination is erased by this function. + * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. * - * On success, this function will not return. It will start the new BootLoader from reset-vector as normal. + * This function will use PROTENSET to protect the flash that is not intended to be written. + * + * On success, this function will not return. It will start the new BootLoader from reset-vector as normal. * * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. * @retval ::NRF_ERROR_FORBIDDEN if NRF_UICR->BOOTADDR is not set. @@ -149,10 +152,12 @@ typedef struct /**@brief Change the address the MBR starts after a reset * - * Once this function has been called, this address is where the MBR will start to forward interrupts to after a reset. + * Once this function has been called, this address is where the MBR will start to forward + * interrupts to after a reset. * - * To restore default forwarding this function should be called with @param address set to 0. - * The MBR will then start forwarding to interrupts to the address in NFR_UICR->BOOTADDR or to the SoftDevice if the BOOTADDR is not set. + * To restore default forwarding this function should be called with @ref address set to 0. The + * MBR will then start forwarding interrupts to the address in NFR_UICR->BOOTADDR or to the + * SoftDevice if the BOOTADDR is not set. * * On success, this function will not return. It will reset the device. * @@ -166,6 +171,7 @@ typedef struct } sd_mbr_command_vector_table_base_set_t; /**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR + * * Unlike sd_mbr_command_vector_table_base_set_t, this function does not reset, and it does not * change where the MBR starts after reset. * @@ -176,9 +182,15 @@ typedef struct uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ } sd_mbr_command_irq_forward_address_set_t; +/**@brief Input structure containing data used when calling ::sd_mbr_command + * + * Depending on what command value that is set, the corresponding params value type must also be + * set. See @ref NRF_MBR_COMMANDS for command types and corresponding params value type. If command + * @ref SD_MBR_COMMAND_INIT_SD is set, it is not necessary to set any values under params. + */ typedef struct { - uint32_t command; /**< type of command to be issued see @ref NRF_MBR_COMMANDS. */ + uint32_t command; /**< Type of command to be issued. See @ref NRF_MBR_COMMANDS. */ union { sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ @@ -186,7 +198,7 @@ typedef struct sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ sd_mbr_command_irq_forward_address_set_t irq_forward_address_set; /**< Parameters for irq forward address set*/ - } params; + } params; /**< Command parameters. */ } sd_mbr_command_t; /** @} */ @@ -198,21 +210,22 @@ typedef struct * * Commands used when updating a SoftDevice and bootloader. * - * The SD_MBR_COMMAND_COPY_BL and SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires parameters to be - * retained by the MBR when resetting the IC. This is done in a separate flash page - * provided by the application. The UICR register UICR.NRFFW[1] must be set - * to an address corresponding to a page in the application flash space. This page will be cleared - * by the MBR and used to store the command before reset. When the UICR.NRFFW[1] field is set - * the page it refers to must not be used by the application. If the UICR.NRFFW[1] is set to - * 0xFFFFFFFF (the default) MBR commands which use flash will be unavailable and return - * NRF_ERROR_NO_MEM. + * The @ref SD_MBR_COMMAND_COPY_BL and @ref SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires + * parameters to be retained by the MBR when resetting the IC. This is done in a separate flash + * page provided by the application. The UICR register UICR.NRFFW[1] must be set to an address + * corresponding to a page in the application flash space. This page will be cleared by the MBR and + * used to store the command before reset. When the UICR.NRFFW[1] field is set the page it refers + * to must not be used by the application. If the UICR.NRFFW[1] is set to 0xFFFFFFFF (the default) + * MBR commands which use flash will be unavailable and return @ref NRF_ERROR_NO_MEM. * * @param[in] param Pointer to a struct describing the command. * - * @note For return values, see ::sd_mbr_command_copy_sd_t ::sd_mbr_command_copy_bl_t ::sd_mbr_command_compare_t ::sd_mbr_command_vector_table_base_set_t ::sd_mbr_command_irq_forward_address_set_t + * @note For return values, see ::sd_mbr_command_copy_sd_t, ::sd_mbr_command_copy_bl_t, + * ::sd_mbr_command_compare_t, ::sd_mbr_command_vector_table_base_set_t, + * ::sd_mbr_command_irq_forward_address_set_t * - * @retval NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF). - * @retval NRF_ERROR_INVALID_PARAM if an invalid command is given. + * @retval ::NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF). + * @retval ::NRF_ERROR_INVALID_PARAM if an invalid command is given. */ SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param)); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_ble.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_ble.h similarity index 94% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_ble.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_ble.h index 470577b8aa..9ebb41f538 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_ble.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_ble.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -49,8 +49,10 @@ #ifndef BLE_H__ #define BLE_H__ -#include "ble_ranges.h" -#include "ble_types.h" +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_err.h" #include "ble_gap.h" #include "ble_l2cap.h" #include "ble_gatt.h" @@ -86,8 +88,8 @@ enum BLE_COMMON_SVCS */ enum BLE_COMMON_EVTS { - BLE_EVT_USER_MEM_REQUEST = BLE_EVT_BASE, /**< User Memory request. @ref ble_evt_user_mem_request_t */ - BLE_EVT_USER_MEM_RELEASE, /**< User Memory release. @ref ble_evt_user_mem_release_t */ + BLE_EVT_USER_MEM_REQUEST = BLE_EVT_BASE + 0, /**< User Memory request. @ref ble_evt_user_mem_request_t */ + BLE_EVT_USER_MEM_RELEASE = BLE_EVT_BASE + 1, /**< User Memory release. @ref ble_evt_user_mem_release_t */ }; /**@brief BLE Connection Configuration IDs. @@ -96,11 +98,11 @@ enum BLE_COMMON_EVTS */ enum BLE_CONN_CFGS { - BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE, /**< BLE GAP specific connection configuration. */ - BLE_CONN_CFG_GATTC, /**< BLE GATTC specific connection configuration. */ - BLE_CONN_CFG_GATTS, /**< BLE GATTS specific connection configuration. */ - BLE_CONN_CFG_GATT, /**< BLE GATT specific connection configuration. */ - BLE_CONN_CFG_L2CAP, /**< BLE L2CAP specific connection configuration. */ + BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE + 0, /**< BLE GAP specific connection configuration. */ + BLE_CONN_CFG_GATTC = BLE_CONN_CFG_BASE + 1, /**< BLE GATTC specific connection configuration. */ + BLE_CONN_CFG_GATTS = BLE_CONN_CFG_BASE + 2, /**< BLE GATTS specific connection configuration. */ + BLE_CONN_CFG_GATT = BLE_CONN_CFG_BASE + 3, /**< BLE GATT specific connection configuration. */ + BLE_CONN_CFG_L2CAP = BLE_CONN_CFG_BASE + 4, /**< BLE L2CAP specific connection configuration. */ }; /**@brief BLE Common Configuration IDs. @@ -117,8 +119,8 @@ enum BLE_COMMON_CFGS */ enum BLE_COMMON_OPTS { - BLE_COMMON_OPT_PA_LNA = BLE_OPT_BASE, /**< PA and LNA options */ - BLE_COMMON_OPT_CONN_EVT_EXT, /**< Extended connection events option */ + BLE_COMMON_OPT_PA_LNA = BLE_OPT_BASE + 0, /**< PA and LNA options */ + BLE_COMMON_OPT_CONN_EVT_EXT = BLE_OPT_BASE + 1, /**< Extended connection events option */ }; /** @} */ @@ -138,13 +140,9 @@ enum BLE_COMMON_OPTS * @note The highest value used for @ref ble_gatt_conn_cfg_t::att_mtu in any connection configuration shall be used as a parameter. * If that value has not been configured for any connections then @ref BLE_GATT_ATT_MTU_DEFAULT must be used instead. */ -#define BLE_EVT_LEN_MAX(ATT_MTU) (BLE_MAX( \ - sizeof(ble_evt_t), \ - BLE_MAX( \ - offsetof(ble_evt_t, evt.gattc_evt.params.rel_disc_rsp.includes) + ((ATT_MTU) - 2) / 6 * sizeof(ble_gattc_include_t), \ - offsetof(ble_evt_t, evt.gattc_evt.params.attr_info_disc_rsp.info.attr_info16) + ((ATT_MTU) - 2) / 4 * sizeof(ble_gattc_attr_info16_t) \ - ) \ -)) +#define BLE_EVT_LEN_MAX(ATT_MTU) ( \ + offsetof(ble_evt_t, evt.gattc_evt.params.prim_srvc_disc_rsp.services) + ((ATT_MTU) - 1) / 4 * sizeof(ble_gattc_service_t) \ +) /** @defgroup BLE_USER_MEM_TYPES User Memory Types * @{ */ @@ -304,7 +302,10 @@ typedef union * In the case that no configurations has been set, or fewer connection configurations has been set than enabled connections, * the default connection configuration will be automatically added for the remaining connections. * When creating connections with the default configuration, @ref BLE_CONN_CFG_TAG_DEFAULT should be used in - * place of @ref ble_conn_cfg_t::conn_cfg_tag. See @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect()" + * place of @ref ble_conn_cfg_t::conn_cfg_tag. + * + * @sa sd_ble_gap_adv_start() + * @sa sd_ble_gap_connect() * * @mscs * @mmsc{@ref BLE_CONN_CFG} @@ -313,8 +314,9 @@ typedef union */ typedef struct { - uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() - calls to select this configuration when creating a connection. + uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the + @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() calls + to select this configuration when creating a connection. Must be different for all connection configurations added and not @ref BLE_CONN_CFG_TAG_DEFAULT. */ union { ble_gap_conn_cfg_t gap_conn_cfg; /**< GAP connection configuration, cfg_id is @ref BLE_CONN_CFG_GAP. */ @@ -482,7 +484,7 @@ SVCALL(SD_BLE_EVT_GET, uint32_t, sd_ble_evt_get(uint8_t *p_dest, uint16_t *p_len * the 16-bit uuid field in @ref ble_uuid_t. * * @note If a UUID is already present in the BLE stack's internal table, the corresponding index will be returned in - * p_uuid_type along with an NRF_SUCCESS error code. + * p_uuid_type along with an @ref NRF_SUCCESS error code. * * @param[in] p_vs_uuid Pointer to a 16-octet (128-bit) little endian Vendor Specific UUID disregarding * bytes 12 and 13. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_error.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_error.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_error.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_error.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_error_sdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_error_sdm.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_error_sdm.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_error_sdm.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_error_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_error_soc.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_error_soc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_error_soc.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_nvic.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_nvic.h similarity index 78% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_nvic.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_nvic.h index f4e3808071..c71a633c6b 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_nvic.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_nvic.h @@ -1,38 +1,41 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + /** * @defgroup nrf_nvic_api SoftDevice NVIC API * @{ @@ -54,7 +57,8 @@ #include #include "nrf.h" - +#include "nrf_svc.h" +#include "nrf_error.h" #include "nrf_error_soc.h" #ifdef __cplusplus @@ -69,49 +73,31 @@ extern "C" { #define __NRF_NVIC_NVMC_IRQn (30) /**< The peripheral ID of the NVMC. IRQ numbers are used to identify peripherals, but the NVMC doesn't have an IRQ number in the MDK. */ -#ifdef NRF51 - #define __NRF_NVIC_ISER_COUNT (1) /**< The number of ISER/ICER registers in the NVIC that are used. */ +#define __NRF_NVIC_ISER_COUNT (2) /**< The number of ISER/ICER registers in the NVIC that are used. */ - /**@brief Interrupts used by the SoftDevice. */ - #define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ - (1U << POWER_CLOCK_IRQn) \ - | (1U << RADIO_IRQn) \ - | (1U << RTC0_IRQn) \ - | (1U << TIMER0_IRQn) \ - | (1U << RNG_IRQn) \ - | (1U << ECB_IRQn) \ - | (1U << CCM_AAR_IRQn) \ - | (1U << TEMP_IRQn) \ - | (1U << __NRF_NVIC_NVMC_IRQn) \ - | (1U << (uint32_t)SWI5_IRQn) \ - )) +/**@brief Interrupts used by the SoftDevice, with IRQn in the range 0-31. */ +#define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ + (1U << POWER_CLOCK_IRQn) \ + | (1U << RADIO_IRQn) \ + | (1U << RTC0_IRQn) \ + | (1U << TIMER0_IRQn) \ + | (1U << RNG_IRQn) \ + | (1U << ECB_IRQn) \ + | (1U << CCM_AAR_IRQn) \ + | (1U << TEMP_IRQn) \ + | (1U << __NRF_NVIC_NVMC_IRQn) \ + | (1U << (uint32_t)SWI5_IRQn) \ + )) - /**@brief Interrupts available for to application. */ - #define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) -#endif +/**@brief Interrupts used by the SoftDevice, with IRQn in the range 32-63. */ +#define __NRF_NVIC_SD_IRQS_1 ((uint32_t)0) -#if defined(NRF52) || defined(NRF52840_XXAA) - #define __NRF_NVIC_ISER_COUNT (2) /**< The number of ISER/ICER registers in the NVIC that are used. */ +/**@brief Interrupts available for to application, with IRQn in the range 0-31. */ +#define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) - /**@brief Interrupts used by the SoftDevice. */ - #define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ - (1U << POWER_CLOCK_IRQn) \ - | (1U << RADIO_IRQn) \ - | (1U << RTC0_IRQn) \ - | (1U << TIMER0_IRQn) \ - | (1U << RNG_IRQn) \ - | (1U << ECB_IRQn) \ - | (1U << CCM_AAR_IRQn) \ - | (1U << TEMP_IRQn) \ - | (1U << __NRF_NVIC_NVMC_IRQn) \ - | (1U << (uint32_t)SWI5_EGU5_IRQn) \ - )) - #define __NRF_NVIC_SD_IRQS_1 ((uint32_t)0) +/**@brief Interrupts available for to application, with IRQn in the range 32-63. */ +#define __NRF_NVIC_APP_IRQS_1 (~__NRF_NVIC_SD_IRQS_1) - /**@brief Interrupts available for to application. */ - #define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) - #define __NRF_NVIC_APP_IRQS_1 (~__NRF_NVIC_SD_IRQS_1) -#endif /**@} */ /**@} */ @@ -307,12 +293,10 @@ __STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn) { return ((1UL<ICER[0] & __NRF_NVIC_APP_IRQS_0 ); NVIC->ICER[0] = __NRF_NVIC_APP_IRQS_0; - #if defined(NRF52) || defined(NRF52840_XXAA) nrf_nvic_state.__irq_masks[1] = ( NVIC->ICER[1] & __NRF_NVIC_APP_IRQS_1 ); NVIC->ICER[1] = __NRF_NVIC_APP_IRQS_1; - #endif *p_is_nested_critical_region = 0; } else @@ -493,9 +465,7 @@ __STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical { int was_masked = __sd_nvic_irq_disable(); NVIC->ISER[0] = nrf_nvic_state.__irq_masks[0]; - #if defined(NRF52) || defined(NRF52840_XXAA) NVIC->ISER[1] = nrf_nvic_state.__irq_masks[1]; - #endif nrf_nvic_state.__cr_flag = 0; if (!was_masked) { diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_sd_def.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_sd_def.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_sd_def.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_sd_def.h index 0b4d221d6a..c9ab241872 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_sd_def.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_sd_def.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_sdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_sdm.h similarity index 95% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_sdm.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_sdm.h index c41d86d46b..8c48d93678 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_sdm.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_sdm.h @@ -47,10 +47,12 @@ #ifndef NRF_SDM_H__ #define NRF_SDM_H__ -#include "nrf_svc.h" +#include #include "nrf.h" -#include "nrf_soc.h" +#include "nrf_svc.h" +#include "nrf_error.h" #include "nrf_error_sdm.h" +#include "nrf_soc.h" #ifdef __cplusplus extern "C" { @@ -65,7 +67,7 @@ extern "C" { #endif /** @brief The major version for the SoftDevice binary distributed with this header file. */ -#define SD_MAJOR_VERSION (5) +#define SD_MAJOR_VERSION (6) /** @brief The minor version for the SoftDevice binary distributed with this header file. */ #define SD_MINOR_VERSION (0) @@ -132,8 +134,8 @@ the start of the SoftDevice (without MBR)*/ * the MBR (the usual case). */ #define SD_SIZE_GET(baseaddr) (*((uint32_t *) ((baseaddr) + SD_SIZE_OFFSET))) -/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use @ref - * MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual +/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use + * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual * case). */ #define SD_FWID_GET(baseaddr) (*((uint16_t *) ((baseaddr) + SD_FWID_OFFSET))) @@ -227,27 +229,27 @@ enum NRF_SD_SVCS typedef struct { uint8_t source; /**< LF oscillator clock source, see @ref NRF_CLOCK_LF_SRC. */ - uint8_t rc_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second - units (nRF51: 1-64, nRF52: 1-32). + uint8_t rc_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second + units (nRF52: 1-32). @note To avoid excessive clock drift, 0.5 degrees Celsius is the maximum temperature change allowed in one calibration timer interval. The interval should be selected to ensure this. - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. */ - uint8_t rc_temp_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: How often (in number of calibration + @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. */ + uint8_t rc_temp_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: How often (in number of calibration intervals) the RC oscillator shall be calibrated if the temperature hasn't changed. 0: Always calibrate even if the temperature hasn't changed. - 1: Only calibrate if the temperature has changed (nRF51 only). + 1: Only calibrate if the temperature has changed (legacy - nRF51 only). 2-33: Check the temperature and only calibrate if it has changed, however calibration will take place every rc_temp_ctiv intervals in any case. - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. + @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. @note For nRF52, the application must ensure calibration at least once every 8 seconds to ensure +/-500 ppm clock stability. The - recommended configuration for NRF_CLOCK_LF_SRC_RC on nRF52 is + recommended configuration for ::NRF_CLOCK_LF_SRC_RC on nRF52 is rc_ctiv=16 and rc_temp_ctiv=2. This will ensure calibration at least once every 8 seconds and for temperature changes of 0.5 degrees Celsius every 4 seconds. See the Product Specification @@ -269,7 +271,7 @@ typedef struct * @param[in] pc The program counter of the instruction that triggered the fault. * @param[in] info Optional additional information regarding the fault. Refer to each Fault identifier for details. * - * @note When id is set to NRF_FAULT_ID_APP_MEMACC, pc will contain the address of the instruction being executed at the time when + * @note When id is set to @ref NRF_FAULT_ID_APP_MEMACC, pc will contain the address of the instruction being executed at the time when * the fault is detected by the CPU. The CPU program counter may have advanced up to 2 instructions (no branching) after the one that triggered the fault. */ typedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info); @@ -306,6 +308,7 @@ typedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info); * @retval ::NRF_ERROR_INVALID_STATE SoftDevice is already enabled, and the clock source and fault handler cannot be updated. * @retval ::NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION SoftDevice interrupt is already enabled, or an enabled interrupt has an illegal priority level. * @retval ::NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN Unknown low frequency clock source selected. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid clock source configuration supplied in p_clock_lf_cfg. */ SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lf_cfg_t const * p_clock_lf_cfg, nrf_fault_handler_t fault_handler)); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_soc.h similarity index 87% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_soc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_soc.h index d7d3c801b8..2c4d958750 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_soc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_soc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -48,10 +48,9 @@ #define NRF_SOC_H__ #include -#include -#include "nrf_svc.h" #include "nrf.h" - +#include "nrf_svc.h" +#include "nrf_error.h" #include "nrf_error_soc.h" #ifdef __cplusplus @@ -63,7 +62,7 @@ extern "C" { /**@brief The number of the lowest SVC number reserved for the SoC library. */ #define SOC_SVC_BASE (0x20) /**< Base value for SVCs that are available when the SoftDevice is disabled. */ -#define SOC_SVC_BASE_NOT_AVAILABLE (0x2B) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ +#define SOC_SVC_BASE_NOT_AVAILABLE (0x2C) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ /**@brief Guaranteed time for application to process radio inactive notification. */ #define NRF_RADIO_NOTIFICATION_INACTIVE_GUARANTEED_TIME_US (62) @@ -81,11 +80,11 @@ extern "C" { #define SOC_ECB_CLEARTEXT_LENGTH (16) /**< ECB cleartext length. */ #define SOC_ECB_CIPHERTEXT_LENGTH (SOC_ECB_CLEARTEXT_LENGTH) /**< ECB ciphertext length. */ -#define SD_EVT_IRQn (SWI2_EGU2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ -#define SD_EVT_IRQHandler (SWI2_EGU2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. +#define SD_EVT_IRQn (SWI2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ +#define SD_EVT_IRQHandler (SWI2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. The default interrupt priority for this handler is set to 4 */ -#define RADIO_NOTIFICATION_IRQn (SWI1_EGU1_IRQn) /**< The radio notification IRQ number. */ -#define RADIO_NOTIFICATION_IRQHandler (SWI1_EGU1_IRQHandler) /**< The radio notification IRQ handler. +#define RADIO_NOTIFICATION_IRQn (SWI1_IRQn) /**< The radio notification IRQ number. */ +#define RADIO_NOTIFICATION_IRQHandler (SWI1_IRQHandler) /**< The radio notification IRQ handler. The default interrupt priority for this handler is set to 4 */ #define NRF_RADIO_LENGTH_MIN_US (100) /**< The shortest allowed radio timeslot, in microseconds. */ #define NRF_RADIO_LENGTH_MAX_US (100000) /**< The longest allowed radio timeslot, in microseconds. */ @@ -104,49 +103,50 @@ extern "C" { /**@brief The SVC numbers used by the SVC functions in the SoC library. */ enum NRF_SOC_SVCS { - SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, - SD_PPI_CHANNEL_ENABLE_SET, - SD_PPI_CHANNEL_ENABLE_CLR, - SD_PPI_CHANNEL_ASSIGN, - SD_PPI_GROUP_TASK_ENABLE, - SD_PPI_GROUP_TASK_DISABLE, - SD_PPI_GROUP_ASSIGN, - SD_PPI_GROUP_GET, - SD_FLASH_PAGE_ERASE, - SD_FLASH_WRITE, - SD_FLASH_PROTECT, - SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, - SD_MUTEX_ACQUIRE, - SD_MUTEX_RELEASE, - SD_RAND_APPLICATION_POOL_CAPACITY_GET, - SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, - SD_RAND_APPLICATION_VECTOR_GET, - SD_POWER_MODE_SET, - SD_POWER_SYSTEM_OFF, - SD_POWER_RESET_REASON_GET, - SD_POWER_RESET_REASON_CLR, - SD_POWER_POF_ENABLE, - SD_POWER_POF_THRESHOLD_SET, - SD_POWER_RAM_POWER_SET, - SD_POWER_RAM_POWER_CLR, - SD_POWER_RAM_POWER_GET, - SD_POWER_GPREGRET_SET, - SD_POWER_GPREGRET_CLR, - SD_POWER_GPREGRET_GET, - SD_POWER_DCDC_MODE_SET, - SD_APP_EVT_WAIT, - SD_CLOCK_HFCLK_REQUEST, - SD_CLOCK_HFCLK_RELEASE, - SD_CLOCK_HFCLK_IS_RUNNING, - SD_RADIO_NOTIFICATION_CFG_SET, - SD_ECB_BLOCK_ENCRYPT, - SD_ECB_BLOCKS_ENCRYPT, - SD_RADIO_SESSION_OPEN, - SD_RADIO_SESSION_CLOSE, - SD_RADIO_REQUEST, - SD_EVT_GET, - SD_TEMP_GET, - SVC_SOC_LAST + SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, + SD_PPI_CHANNEL_ENABLE_SET = SOC_SVC_BASE + 1, + SD_PPI_CHANNEL_ENABLE_CLR = SOC_SVC_BASE + 2, + SD_PPI_CHANNEL_ASSIGN = SOC_SVC_BASE + 3, + SD_PPI_GROUP_TASK_ENABLE = SOC_SVC_BASE + 4, + SD_PPI_GROUP_TASK_DISABLE = SOC_SVC_BASE + 5, + SD_PPI_GROUP_ASSIGN = SOC_SVC_BASE + 6, + SD_PPI_GROUP_GET = SOC_SVC_BASE + 7, + SD_FLASH_PAGE_ERASE = SOC_SVC_BASE + 8, + SD_FLASH_WRITE = SOC_SVC_BASE + 9, + SD_FLASH_PROTECT = SOC_SVC_BASE + 10, + SD_PROTECTED_REGISTER_WRITE = SOC_SVC_BASE + 11, + SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, + SD_MUTEX_ACQUIRE = SOC_SVC_BASE_NOT_AVAILABLE + 1, + SD_MUTEX_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 2, + SD_RAND_APPLICATION_POOL_CAPACITY_GET = SOC_SVC_BASE_NOT_AVAILABLE + 3, + SD_RAND_APPLICATION_BYTES_AVAILABLE_GET = SOC_SVC_BASE_NOT_AVAILABLE + 4, + SD_RAND_APPLICATION_VECTOR_GET = SOC_SVC_BASE_NOT_AVAILABLE + 5, + SD_POWER_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 6, + SD_POWER_SYSTEM_OFF = SOC_SVC_BASE_NOT_AVAILABLE + 7, + SD_POWER_RESET_REASON_GET = SOC_SVC_BASE_NOT_AVAILABLE + 8, + SD_POWER_RESET_REASON_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 9, + SD_POWER_POF_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 10, + SD_POWER_POF_THRESHOLD_SET = SOC_SVC_BASE_NOT_AVAILABLE + 11, + SD_POWER_RAM_POWER_SET = SOC_SVC_BASE_NOT_AVAILABLE + 13, + SD_POWER_RAM_POWER_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 14, + SD_POWER_RAM_POWER_GET = SOC_SVC_BASE_NOT_AVAILABLE + 15, + SD_POWER_GPREGRET_SET = SOC_SVC_BASE_NOT_AVAILABLE + 16, + SD_POWER_GPREGRET_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 17, + SD_POWER_GPREGRET_GET = SOC_SVC_BASE_NOT_AVAILABLE + 18, + SD_POWER_DCDC_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 19, + SD_APP_EVT_WAIT = SOC_SVC_BASE_NOT_AVAILABLE + 21, + SD_CLOCK_HFCLK_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 22, + SD_CLOCK_HFCLK_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 23, + SD_CLOCK_HFCLK_IS_RUNNING = SOC_SVC_BASE_NOT_AVAILABLE + 24, + SD_RADIO_NOTIFICATION_CFG_SET = SOC_SVC_BASE_NOT_AVAILABLE + 25, + SD_ECB_BLOCK_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 26, + SD_ECB_BLOCKS_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 27, + SD_RADIO_SESSION_OPEN = SOC_SVC_BASE_NOT_AVAILABLE + 28, + SD_RADIO_SESSION_CLOSE = SOC_SVC_BASE_NOT_AVAILABLE + 29, + SD_RADIO_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 30, + SD_EVT_GET = SOC_SVC_BASE_NOT_AVAILABLE + 31, + SD_TEMP_GET = SOC_SVC_BASE_NOT_AVAILABLE + 32, + SVC_SOC_LAST = SOC_SVC_BASE_NOT_AVAILABLE + 37 }; /**@brief Possible values of a ::nrf_mutex_t. */ @@ -182,6 +182,7 @@ enum NRF_POWER_THRESHOLDS }; + /**@brief DC/DC converter modes. */ enum NRF_POWER_DCDC_MODES { @@ -232,8 +233,8 @@ enum NRF_RADIO_SIGNAL_CALLBACK_ACTION NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current timeslot. Maximum execution time for this action: @ref NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US. - This action must be started at least @ref - NRF_RADIO_MIN_EXTENSION_MARGIN_US before + This action must be started at least + @ref NRF_RADIO_MIN_EXTENSION_MARGIN_US before the end of the timeslot. */ NRF_RADIO_SIGNAL_CALLBACK_ACTION_END, /**< End the current radio timeslot. */ NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END /**< Request a new radio timeslot and end the current timeslot. */ @@ -476,7 +477,9 @@ SVCALL(SD_POWER_SYSTEM_OFF, uint32_t, sd_power_system_off(void)); */ SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); -/**@brief Sets the power-fail threshold value. + +/**@brief Sets the power failure comparator threshold value. + * * * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDS. * @@ -485,6 +488,7 @@ SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); */ SVCALL(SD_POWER_POF_THRESHOLD_SET, uint32_t, sd_power_pof_threshold_set(uint8_t threshold)); + /**@brief Writes the NRF_POWER->RAM[index].POWERSET register. * * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERSET register to write to. @@ -539,9 +543,7 @@ SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_ */ SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret)); -/**@brief Sets the DCDC mode. - * - * Enable or disable the DCDC peripheral. +/**@brief Enable or disable the DC/DC regulator. * * @param[in] dcdc_mode The mode of the DCDC, see @ref NRF_POWER_DCDC_MODES. * @@ -550,6 +552,7 @@ SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_ */ SVCALL(SD_POWER_DCDC_MODE_SET, uint32_t, sd_power_dcdc_mode_set(uint8_t dcdc_mode)); + /**@brief Request the high frequency crystal oscillator. * * Will start the high frequency crystal oscillator, the startup time of the crystal varies @@ -791,6 +794,8 @@ SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp)); * and the command parameters). * - The data in the p_src buffer should not be modified before the @ref NRF_EVT_FLASH_OPERATION_SUCCESS * or the @ref NRF_EVT_FLASH_OPERATION_ERROR have been received if the SoftDevice is enabled. +* - This call will make the SoftDevice trigger a hardfault when the page is written, if it is +* protected. * * * @param[in] p_dst Pointer to start of flash location to be written. @@ -801,7 +806,7 @@ SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp)); * @retval ::NRF_ERROR_INVALID_ADDR Tried to write to a non existing flash address, or p_dst or p_src was unaligned. * @retval ::NRF_ERROR_BUSY The previous command has not yet completed. * @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or higher than the maximum allowed size. -* @retval ::NRF_ERROR_FORBIDDEN Tried to write to or read from protected location. +* @retval ::NRF_ERROR_FORBIDDEN Tried to write to an address outside the application flash area. * @retval ::NRF_SUCCESS The command was accepted. */ SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)); @@ -824,6 +829,8 @@ SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * they will not interfere with the flash access. This means that all interrupts will be blocked * for a predictable time (depending on the NVMC specification in the device's Product Specification * and the command parameters). +* - This call will make the SoftDevice trigger a hardfault when the page is erased, if it is +* protected. * * * @param[in] page_number Page number of the page to erase @@ -831,7 +838,7 @@ SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. * @retval ::NRF_ERROR_INVALID_ADDR Tried to erase to a non existing flash page. * @retval ::NRF_ERROR_BUSY The previous command has not yet completed. -* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a protected page. +* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a page outside the application flash area. * @retval ::NRF_SUCCESS The command was accepted. */ SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)); @@ -842,14 +849,19 @@ SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)) * Commands to set the flash protection configuration registers. This sets the CONFIGx registers of the BPROT peripheral. * + * @note Not all parameters are valid for all products. Some bits in each parameter may not be + * valid for your product. Please refer your Product Specification for more details. + * * @note To read the values read them directly. They are only write-protected. * + * @note It is possible to use @ref sd_protected_register_write instead of this function. + * * @param[in] block_cfg0 Value to be written to the configuration register. * @param[in] block_cfg1 Value to be written to the configuration register. * @param[in] block_cfg2 Value to be written to the configuration register. * @param[in] block_cfg3 Value to be written to the configuration register. * - * @retval ::NRF_ERROR_FORBIDDEN Tried to protect the SoftDevice. + * @retval ::NRF_ERROR_NOT_SUPPORTED Non-zero value supplied to one or more of the unsupported parameters. * @retval ::NRF_SUCCESS Values successfully written to configuration registers. */ SVCALL(SD_FLASH_PROTECT, uint32_t, sd_flash_protect(uint32_t block_cfg0, uint32_t block_cfg1, uint32_t block_cfg2, uint32_t block_cfg3)); @@ -921,6 +933,27 @@ SVCALL(SD_FLASH_PROTECT, uint32_t, sd_flash_protect(uint32_t block_cfg0, uint32_ */ SVCALL(SD_RADIO_REQUEST, uint32_t, sd_radio_request(nrf_radio_request_t const * p_request)); +/**@brief Write register protected by the SoftDevice + * + * This function writes to a register that is write-protected by the SoftDevice. Please refer to your + * SoftDevice Specification for more details about which registers that are protected by SoftDevice. + * This function can write to the following protected peripheral: + * - BPROT + * + * @note Protected registers may be read directly. + * @note Register that are write-once will return @ref NRF_SUCCESS on second set, even the value in + * the register has not changed. See the Product Specification for more details about register + * properties. + * + * @param[in] p_register Pointer to register to be written. + * @param[in] value Value to be written to the register. + * + * @retval ::NRF_ERROR_INVALID_ADDR This function can not write to the reguested register. + * @retval ::NRF_SUCCESS Value successfully written to register. + * + */ +SVCALL(SD_PROTECTED_REGISTER_WRITE, uint32_t, sd_protected_register_write(volatile uint32_t * p_register, uint32_t value)); + /**@} */ #ifdef __cplusplus diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_svc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_svc.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_svc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_svc.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf52_5.0.0_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/hex/s132_nrf52_6.0.0_licence-agreement.txt similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf52_5.0.0_licence-agreement.txt rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/hex/s132_nrf52_6.0.0_licence-agreement.txt index 00c2e54c47..a71adee7b9 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/doc/s132_nrf52_5.0.0_licence-agreement.txt +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/hex/s132_nrf52_6.0.0_licence-agreement.txt @@ -1,4 +1,4 @@ -Copyright (c) 2007 - 2017, Nordic Semiconductor ASA +Copyright (c) 2007 - 2018, Nordic Semiconductor ASA All rights reserved. Redistribution and use in source and binary forms, with or without modification, diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/hex/s132_nrf52_6.0.0_softdevice.hex b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/hex/s132_nrf52_6.0.0_softdevice.hex new file mode 100644 index 0000000000..f30de08500 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/hex/s132_nrf52_6.0.0_softdevice.hex @@ -0,0 +1,9278 @@ +:020000040000FA +:1000000000040020E90800007D050000C908000088 +:1000100087050000910500009B050000000000001E +:100020000000000000000000000000000D090000BA +:10003000A505000000000000AF050000B9050000A4 +:10004000C3050000CD050000D7050000E105000054 +:10005000EB050000F5050000FF05000009060000A3 +:10006000130600001D0600002706000031060000F0 +:100070003B060000450600004F0600005906000040 +:10008000630600006D060000770600008106000090 +:100090008B060000950600009F060000A9060000E0 +:1000A000B3060000BD060000C7060000D106000030 +:1000B000DB060000E5060000EF060000F906000080 +:1000C000030700000D0700001707000021070000CC +:1000D0002B070000350700003F070000490700001C +:1000E000530700005D07000067070000710700006C +:1000F0007B070000850700008F07000099070000BC +:10010000A30700001FB500F003F88DE80F001FBD26 +:1001100000F0E0BB1FB56FF00100009040100390AD +:10012000029001904FF010208069000B420900F00E +:100130001F045DF822300120A04083434DF8223097 +:10014000684600F045F91FBDF0B54FF6FF734FF458 +:10015000B4751A466E1E11E0A94201D3344600E080 +:100160000C46091B30F8027B641E3B441A44F9D14B +:100170009CB204EB134394B204EB12420029EBD17E +:1001800098B200EB134002EB124140EA0140F0BD8F +:10019000DE4992B00446D1E90001CDE91001FF2209 +:1001A0004021684600F03CFB94E80F008DE80F000A +:1001B000684610A902E004C841F8042D8842FAD12B +:1001C00010216846FFF7C0FF1090AA208DF8440068 +:1001D000FFF7A0FF00F0F3F84FF01024A069102201 +:1001E0006946803000F002F9A069082210A900F0E9 +:1001F000FDF800F0D8F84FF080510A6949690068AD +:100200004A43824201D8102070470020704710B541 +:10021000D0E900214FF0805002EB8103026944696C +:100220006243934209D84FF01022536903EB8103D4 +:100230000169406941438B4201D9092010BD5069D1 +:10024000401C01D0002010BD0F2010BD70B501680A +:100250000446AF4D4FF01020072952D2DFE801F0DD +:10026000330419293C1E2500D4E902656468294637 +:10027000304600F0CDF82A462146304600F0B6F868 +:10028000AA002146304600F09FFA002800D0032043 +:1002900070BD00F051FB4FF4805007E0201DFFF7C8 +:1002A000AAFF0028F4D100F047FB60682860002016 +:1002B00070BD241D94E80700920000F085FA002824 +:1002C000F6D00E2070BD8069401C12D0201DFFF7B3 +:1002D0009EFF0028F6D109E08069401C09D0201D4E +:1002E000FFF789FF0028EDD1606820B12046FFF7B5 +:1002F0004FFF042070BDFFF70DFF00F060F800F025 +:1003000052F8072070BD10B50C46182802D0012005 +:10031000086010BD2068FFF799FF206010BD4FF006 +:100320001024A069401C05D0A569A66980353079E4 +:10033000AA2808D06069401C2DD060690068401C64 +:1003400029D060692CE010212846FFF7FDFE3168B6 +:1003500081421CD1A16901F18002C03105E030B1B8 +:1003600008CA51F8040D984201D1012000E0002094 +:100370008A42F4D158B1286810B1042803D0FEE7AE +:10038000284600F057F862496868086008E000F005 +:1003900016F800F008F84FF480500168491C01D0AD +:1003A00000F0A4FAFEE7BFF34F8F5A4801685A4A9B +:1003B00001F4E06111430160BFF34F8FFEE74FF09E +:1003C00010208169491C02D0806900F0AEB87047E6 +:1003D000524A01681160121D416811604F4A8168DC +:1003E00010321160111DC068086070472DE9F0419E +:1003F00017460D460646002406E03046296800F000 +:10040000A7F8641C2D1D361DBC42F6D3BDE8F08153 +:1004100070B50C4605464FF4806608E0284600F0AB +:1004200084F8B44205D3A4F5806405F58055002C0A +:10043000F4D170BD4168044609B1012500E00025F2 +:100440004FF010267069A268920000F0BDF9C8B1A3 +:10045000204600F01AF89DB17669A56864684FF4EB +:10046000002084420AD2854208D229463046FFF74E +:10047000CFFF2A4621463046FFF7B8FFFFF79FFF20 +:10048000FFF791FFFFF746FEF8E72DE9FF414FF038 +:100490001024616980680D0B01EB800000F6FF708D +:1004A000010B0020009001900290024603906846E4 +:1004B00001230BE0560902F01F0C50F8267003FAD6 +:1004C0000CFC47EA0C0740F82670521CAA42F1D3F4 +:1004D0000AE04A0901F01F0650F8225003FA06F616 +:1004E000354340F82250491C8029F2D3A169090BF9 +:1004F0004A0901F01F0150F822408B409C4340F80C +:100500002240FFF765FFBDE8FF8100005C090000A5 +:10051000000000200CED00E00400FA050006004099 +:10052000144801680029FCD07047134A0221116069 +:1005300010490B68002BFCD00F4B1B1D186008687E +:100540000028FCD00020106008680028FCD070470C +:10055000094B10B501221A60064A1468002CFCD021 +:10056000016010680028FCD0002018601068002886 +:10057000FCD010BD00E4014004E5014008208F4993 +:1005800009680958084710208C4909680958084724 +:1005900014208A49096809580847182087490968BA +:1005A0000958084730208549096809580847382004 +:1005B00082490968095808473C2080490968095858 +:1005C000084740207D4909680958084744207B496D +:1005D00009680958084748207849096809580847B0 +:1005E0004C20764909680958084750207349096822 +:1005F0000958084754207149096809580847582084 +:100600006E490968095808475C206C49096809580F +:100610000847602069490968095808476420674904 +:100620000968095808476820644909680958084753 +:100630006C20624909680958084770205F490968B9 +:100640000958084774205D49096809580847782007 +:100650005A490968095808477C20584909680958C7 +:10066000084780205549096809580847842053499C +:1006700009680958084788205049096809580847F7 +:100680008C204E4909680958084790204B49096851 +:10069000095808479420494909680958084798208B +:1006A00046490968095808479C204449096809587F +:1006B0000847A0204149096809580847A4203F4934 +:1006C000096809580847A8203C490968095808479B +:1006D000AC203A49096809580847B02037490968E9 +:1006E00009580847B4203549096809580847B8200F +:1006F0003249096809580847BC2030490968095837 +:100700000847C0202D49096809580847C4202B49CB +:10071000096809580847C82028490968095808473E +:10072000CC202649096809580847D0202349096880 +:1007300009580847D4202149096809580847D82092 +:100740001E49096809580847DC201C4909680958EE +:100750000847E0201949096809580847E420174963 +:10076000096809580847E8201449096809580847E2 +:10077000EC201249096809580847F0200F49096818 +:1007800009580847F4200D49096809580847F82016 +:100790000A49096809580847FC20084909680958A6 +:1007A00008475FF480700549096809580847000048 +:1007B00003480449024A034B704700000000002030 +:1007C000680900006809000040EA010310B59B07B2 +:1007D0000FD1042A0DD310C808C9121F9C42F8D0AB +:1007E00020BA19BA884201D9012010BD4FF0FF305C +:1007F00010BD1AB1D30703D0521C07E0002010BD72 +:1008000010F8013B11F8014B1B1B07D110F8013BFD +:1008100011F8014B1B1B01D1921EF1D1184610BDDE +:1008200002F0FF0343EA032242EA024200F005B865 +:100830007047704770474FF000020429C0F01280E3 +:1008400010F0030C00F01B80CCF1040CBCF1020F83 +:1008500018BF00F8012BA8BF20F8022BA1EB0C0158 +:1008600000F00DB85FEAC17C24BF00F8012B00F84E +:10087000012B48BF00F8012B70474FF0000200B574 +:10088000134694469646203922BFA0E80C50A0E8B3 +:100890000C50B1F12001BFF4F7AF090728BFA0E861 +:1008A0000C5048BF0CC05DF804EB890028BF40F82D +:1008B000042B08BF704748BF20F8022B11F0804F6F +:1008C00018BF00F8012B7047014B1B68DB68184705 +:1008D0000000002009480A497047FFF7FBFFFFF7B7 +:1008E00011FC00BD20BFFDE7064B1847064A10600B +:1008F000016881F30888406800470000680900002B +:10090000680900001F030000000000201EF0040F13 +:100910000CBFEFF30881EFF3098188690238007892 +:10092000182803D100E00000074A1047074A126860 +:100930002C3212681047000000B5054B1B68054AB1 +:100940009B58984700BD00000703000000000020EE +:100950005809000004000000001000000000000022 +:0809600000FFFFFF0090D0032F +:10100000E0120020D1430200192F000043430200E8 +:10101000192F0000192F0000192F000000000000F8 +:101020000000000000000000000000002944020051 +:10103000192F000000000000192F0000192F0000D8 +:101040009144020097440200192F0000192F00005C +:10105000192F0000192F0000192F0000192F000070 +:101060009D440200192F0000192F0000A344020024 +:10107000192F0000A9440200AF440200B544020049 +:10108000192F0000192F0000192F0000192F000040 +:10109000192F0000192F0000192F0000192F000030 +:1010A000192F0000BB440200192F0000192F000067 +:1010B000192F0000192F0000192F0000192F000010 +:1010C000C1440200192F0000192F0000192F000041 +:1010D000192F0000192F0000192F0000192F0000F0 +:1010E000192F0000192F0000192F0000192F0000E0 +:1010F000192F0000192F0000192F0000192F0000D0 +:10110000192F0000192F000000F002F823F04DF90C +:101110000AA090E8000C82448344AAF10107DA4552 +:1011200001D123F042F9AFF2090EBAE80F0013F033 +:10113000010F18BFFB1A43F0010318479038020053 +:10114000B03802000A444FF0000C10F8013B13F0D5 +:10115000070408BF10F8014B1D1108BF10F8015B10 +:10116000641E05D010F8016B641E01F8016BF9D103 +:1011700013F0080F1EBF10F8014BAD1C0C1B09D15A +:101180006D1E58BF01F801CBFAD505E014F8016BCC +:1011900001F8016B6D1EF9D59142D6D3704700005E +:1011A0000023002400250026103A28BF78C1FBD870 +:1011B000520728BF30C148BF0B6070471FB500F011 +:1011C0003DF88DE80F001FBD1EF0040F0CBFEFF3BC +:1011D0000880EFF30980014A10470000752E0000D7 +:1011E0008269034981614FF001001044704700009B +:1011F000F511000001B41EB400B512F00FFE01B4E9 +:101200000198864601BC01B01EBD0000F0B4404606 +:10121000494652465B460FB402A0013001B506486C +:10122000004700BF01BC86460FBC804689469246F7 +:101230009B46F0BC704700000911000023F0B2B8D3 +:1012400070B51A4C054609202070A01C00F05FF80C +:101250005920A08029462046BDE8704008F05CB8BF +:1012600008F065B870B50C461149097829B1A0F1AC +:1012700060015E2908D3012013E0602804D06928AA +:1012800002D043F201000CE020CC0A4E94E80E009C +:1012900006EB8000A0F58050241FD0F8806E284611 +:1012A000B047206070BD012070470000080000209A +:1012B0001C0000202845020010B504460021012032 +:1012C00000F03DF800210B2000F039F8042119202E +:1012D00000F035F804210D2000F031F804210E2033 +:1012E00000F02DF804210F2000F029F80421C84354 +:1012F00000F025F80621162000F021F8062115201F +:1013000000F01DF82046FFF79BFF002010BDA8212C +:1013100001807047FFF7A4BF11487047104870471D +:10132000104A10B514680F4B0F4A08331A60FFF7C4 +:1013300099FF0C48001D046010BD704770474907B5 +:10134000090E002806DA00F00F0000F1E02080F816 +:10135000141D704700F1E02080F800147047000071 +:1013600003F900421005024001000001FE4800217F +:1013700001604160018170472DE9F743044692B056 +:101380009146406813F00EF840B1606813F013F80E +:1013900020B9607800F00300022801D0012000E0AD +:1013A0000020F14E3072484612F0B8FF18B11020FC +:1013B00015B0BDE8F0834946012001F018FF002870 +:1013C000F6D101258DF842504FF4C050ADF84000E1 +:1013D000002210A9284606F047FC0028E8D18DF825 +:1013E00042504FF428504FF00008ADF840004746F7 +:1013F0001C216846CDF81C8022F07BFF9DF81C0064 +:1014000008AA20F00F00401C20F0F00010308DF8EA +:101410001C0020788DF81D0061789DF81E0061F396 +:10142000420040F001008DF81E009DF800000AA95E +:1014300040F002008DF800002089ADF83000ADF8D2 +:101440003270608907AFADF834000B97606810AC5C +:101450000E900A94684606F0FCF90028A8D1BDF861 +:10146000200030808DF8425042F60120ADF8400057 +:101470009DF81E0008AA20F00600801C20F0010044 +:101480008DF81E000220ADF83000ADF8340013A82E +:101490000E900AA9684606F0DCF9002888D1BDF84C +:1014A00020007080311D484600F033F9002887D1B4 +:1014B0008DF8425042F6A620ADF840001C21684647 +:1014C000CDF81C8022F015FF9DF81C00ADF83450BB +:1014D00020F00F00401C20F0F00010308DF81C00B0 +:1014E0009DF81D0008AA20F0FF008DF81D009DF852 +:1014F0001E000AA920F0060040F00100801C8DF8B3 +:101500001E009DF800008DF8445040F002008DF858 +:101510000000CDE90A4711A80E90ADF8305068469A +:1015200006F097F9002899D1BDF82000F08000203E +:101530003EE73EB504460820ADF80000204612F014 +:10154000EDFE08B110203EBD2146012001F04FFE06 +:101550000028F8D12088ADF804006088ADF80600B6 +:10156000A088ADF80800E088ADF80A007E4801AB1D +:101570006A468088002106F071FDBDF80010082938 +:10158000E1D003203EBD1FB5044600200290082094 +:10159000ADF80800CDF80CD0204612F0BFFE10B117 +:1015A000102004B010BD704802AA81884FF6FF7069 +:1015B00006F096FF0028F4D1BDF80810082901D0E4 +:1015C0000320EEE7BDF800102180BDF80210618015 +:1015D000BDF80410A180BDF80610E180E1E701B577 +:1015E00082B00220ADF800005F4802AB6A46408836 +:1015F000002106F033FDBDF80010022900D00320C1 +:101600000EBD1CB5002100910221ADF80010019023 +:1016100012F0AAFE08B110201CBD53486A4641884A +:101620004FF6FF7006F05CFFBDF800100229F3D002 +:1016300003201CBDFEB54C4C06461546207A0F46CD +:10164000C00705D0084612F069FE18B11020FEBD93 +:101650000F20FEBDF82D01D90C20FEBD304612F042 +:101660005DFE18BB208801A905F03CFE0028F4D1DE +:1016700030788DF80500208801A906F0CEFC0028FE +:10168000EBD100909DF800009DF8051040F002009D +:101690008DF80000090703D040F008008DF8000025 +:1016A0002088694606F056FC0028D6D1ADF80850CF +:1016B00020883B4602AA002106F0D0FCBDF80810A5 +:1016C000A942CAD00320FEBD7CB50546002000908B +:1016D00001900888ADF800000C462846019512F0EC +:1016E00061FE18B9204612F03FFE08B110207CBD03 +:1016F00015B1BDF8000050B11B486A4601884FF68D +:10170000FF7006F0EDFEBDF8001021807CBD0C20BE +:101710007CBD30B593B0044600200D4600901421E6 +:1017200001A822F0E6FD1C2108A822F0E2FD9DF8A8 +:101730000000CDF808D020F00F00401C20F0F00091 +:1017400010308DF800009DF8010020F0FF008DF8AA +:1017500001009DF8200040F002008DF820000120DB +:101760008DF8460002E000000C02002042F6042042 +:10177000ADF8440011A801902088ADF83C006088C5 +:10178000ADF83E00A088ADF84000E088ADF842001A +:101790009DF8020006AA20F00600801C20F001003F +:1017A0008DF802000820ADF80C00ADF810000FA86D +:1017B000059001A908A806F04CF8002803D1BDF84F +:1017C00018002880002013B030BD0000F0B5007B69 +:1017D000059F1E4614460D46012800D0FFDF0C2051 +:1017E00030803A203880002C08D0287A032806D090 +:1017F000287B012800D0FFDF17206081F0BDA88979 +:10180000FBE72DE9F04786B0144691F80C900E9A4C +:101810000D46B9F1010F0BD01021007B2E8A8846AE +:10182000052807D0062833D0FFDF06B0BDE8F087D3 +:101830000221F2E7E8890C2100EB400001EB4000B7 +:10184000188033201080002CEFD0E88960810027B9 +:101850001AE00096688808F1020301AA696900F09D +:1018600084FF06EB0800801C07EB470186B204EBFF +:101870004102BDF8040090810DF1060140460E3290 +:1018800010F018FE7F1CBFB26089B842E1D8CCE7E7 +:1018900034201080E889B9F1010F11D0122148439A +:1018A0000E301880002CC0D0E88960814846B9F11C +:1018B000010F00D00220207300270DF1040A1FE061 +:1018C0000621ECE70096688808F1020301AA69691D +:1018D00000F04BFF06EB0800801C86B2B9F1010F47 +:1018E00012D007EBC70004EB4000BDF80410C18123 +:1018F00010220AF10201103022F05AFC7F1CBFB204 +:101900006089B842DED890E707EB470104EB41025B +:10191000BDF80400D0810AF102014046103210F0F7 +:10192000C9FDEBE72DE9F0470E4688B090F80CC0F2 +:1019300096F80C80378AF5890C20109902F10C0476 +:101940004FF0000ABCF1030F08D0BCF1040F3ED0E9 +:10195000BCF1070F7DD0FFDF08B067E705EB850C12 +:1019600000EB4C00188031200880002AF4D0A8F148 +:10197000060000F0FF09558125E0182101A822F09A +:10198000B8FC00977088434601AA716900F0EDFE2B +:10199000BDF804002080BDF80600E080BDF8080016 +:1019A0002081A21C0DF10A01484610F083FDB9F117 +:1019B000000F00D018B184F804A0A4F802A007EB2F +:1019C000080087B20A346D1EADB2D6D2C4E705EB6B +:1019D000850C00EB4C00188032200880002ABBD018 +:1019E000A8F1050000F0FF09558137E000977088E5 +:1019F000434601AA716900F0B8FE9DF80600BDF8E3 +:101A00000410E1802179420860F3000162F3410192 +:101A1000820862F38201C20862F3C301020962F321 +:101A20000411420962F34511820962F386112171A2 +:101A3000C0096071BDF80700208122460DF109013F +:101A4000484610F037FD18B184F802A0A4F800A0B1 +:101A500000E007E007EB080087B20A346D1EADB264 +:101A6000C4D279E7A8F1020084B205FB08F000F1C6 +:101A70000E0CA3F800C035230B80002AA6D0558198 +:101A80009481009783B270880E32716900F06DFE08 +:101A900062E72DE9F84F1E460A9D0C4681462AB1A1 +:101AA000607A00F58070D080E089108199F80C0090 +:101AB0000C274FF000084FF00E0A0D2873D2DFE814 +:101AC00000F09E070E1C28303846556A7373730069 +:101AD000214648460095FFF779FEBDE8F88F207B48 +:101AE0009146082802D0032800D0FFDF378030203D +:101AF0000AE000BFA9F80A80EFE7207B914604289E +:101B000000D0FFDF378031202880B9F1000FF1D1FC +:101B1000E3E7207B9146042800D0FFDF37803220A6 +:101B2000F2E7207B9146022800D0FFDF3780332088 +:101B3000EAE7207B1746022800D0FFDF3420A6F812 +:101B400000A02880002FC8D0A7F80A80C5E7207B16 +:101B50001746042800D0FFDF3520A6F800A0288013 +:101B6000002FBAD04046A7F80A8012E0207B174623 +:101B7000052802D0062800D0FFDF10203080362054 +:101B80002880002FA9D0E0897881A7F80E80B9F8C5 +:101B90000E00B881A1E7207B9146072800D0FFDF27 +:101BA00037803720B0E72AE04FF0120018804FF05E +:101BB00038001700288090D0E0897881A7F80E803F +:101BC000A7F8108099F80C000A2805D00B2809D036 +:101BD0000C280DD0FFDF80E7207B0A2800D0FFDF34 +:101BE00001200AE0207B0B2800D0FFDF042004E066 +:101BF000207B0C2800D0FFDF052038736DE7FFDF66 +:101C00006BE770B50C46054601F025FC20B1007865 +:101C1000222804D2082070BD43F2020070BD0521C5 +:101C200028460EF0C5FE206008B1002070BD0320DC +:101C300070BD30B44880087820F00F00C01C20F040 +:101C4000F000903001F8080B1DCA81E81D0030BC7F +:101C500007F0E3BB2DE9FF4784B0002782460297D7 +:101C600007989046894612300AF014F9401D20F07A +:101C70000306079828B907A95046FFF7C2FF0028B6 +:101C800054D1B9F1000F05D00798017B19BB052588 +:101C900004681BE098F80000092803D00D2812D032 +:101CA000FFDF46E0079903254868B0B3497B4288C7 +:101CB0007143914239D98AB2B3B2011D0EF0EBFCE7 +:101CC0000446078002E0079C042508340CB12088F4 +:101CD00010B1032D29D02CE00798012112300AF011 +:101CE0000BF9ADF80C00024602AB2946504608F04D +:101CF000F0F9070001D1A01C029007983A46123073 +:101D0000C8F80400A8F802A003A94046029B0AF004 +:101D100000F9D8B10A2817D200E006E0DFE800F0A9 +:101D200007091414100B0D141412132014E60020CC +:101D300012E6112010E608200EE643F203000BE63F +:101D4000072009E60D2007E6032005E6BDF80C0094 +:101D50002346CDE900702A465046079900F015FD4C +:101D600057B9032D08D10798B3B2417B406871433E +:101D70008AB2011D0EF0A3FCB9F1000FD7D007996C +:101D800081F80C90D3E72DE9FE4F91461A881C4646 +:101D90008A468046FAB102AB494608F09AF9050036 +:101DA00019D04046A61C27880EF046FF324607266B +:101DB00029463B4600960EF054FB20882346CDE989 +:101DC00000504A465146404600F0DFFC002020808B +:101DD0000120BDE8FE8F0020FBE710B586B01C4651 +:101DE000AAB104238DF800301388ADF8083052886A +:101DF000ADF80A208A788DF80E200988ADF80C100D +:101E000000236A462146FFF725FF06B010BD1020CB +:101E1000FBE770B50D4605210EF0CAFD040000D1A8 +:101E2000FFDF294604F11200BDE870400AF04DB80A +:101E30002DE9F8430D468046002607F0EBFA0446EC +:101E40002878102878D2DFE800F0773B345331311E +:101E5000123131310831313131312879001FC0B2AE +:101E6000022801D0102810D114BBFFDF35E004B9DF +:101E7000FFDF052140460EF09BFD007B032806D0C6 +:101E800004280BD0072828D0FFDF072655E0287943 +:101E9000801FC0B2022820D050B1F6E72879401F39 +:101EA000C0B2022819D0102817D0EEE704B9FFDF1E +:101EB00013E004B9FFDF287901280ED1172137E09C +:101EC000052140460EF074FD070000D1FFDF07F149 +:101ED0001201404609F0D6FF2CB12A462146404661 +:101EE000FFF7A7FE29E01321404602F0A7FD24E0FA +:101EF00004B9FFDF052140460EF05AFD060000D16F +:101F0000FFDF694606F1120009F0C6FF060000D0A7 +:101F1000FFDFA988172901D2172200E00A46BDF881 +:101F20000000824202D9014602E005E01729C5D32C +:101F3000404600F03AFCD0E7FFDF3046BDE8F883CA +:101F4000401D20F0030219B102FB01F0001D00E06A +:101F500000201044704713B5009848B1002468462B +:101F60000EF043FB002C02D1F74A009911601CBD12 +:101F700001240020F4E72DE9F0470C461546242102 +:101F8000204622F0B6F905B9FFDFA87860732888EB +:101F9000DFF8B4A3401D20F00301AF788946DAF8DA +:101FA00000000EF040FB060000D1FFDF4FF00008FC +:101FB0002660A6F8008077B109FB07F1091D0AD059 +:101FC000DAF800000EF02FFB060000D1FFDF66609C +:101FD000C6F8008001E0C4F80480298804F11200EA +:101FE000BDE8F04709F040BF2DE9F047804601F118 +:101FF00012000D46814609F04DFF401DD24F20F0E2 +:1020000003026E7B1446296838680EF037FB3EB138 +:1020100004FB06F2121D03D0696838680EF02EFB2F +:1020200005200EF06DFC044605200EF071FC201A10 +:10203000012802D138680EF0EBFA49464046BDE867 +:10204000F04709F026BF70B5054605210EF0B0FC3B +:10205000040000D1FFDF04F112012846BDE8704002 +:1020600009F010BF2DE9F04F91B04FF0000BADF823 +:1020700034B0ADF804B047880C46054692460521B9 +:1020800038460EF095FC060000D1FFDF24B1A78092 +:10209000A4F806B0A4F808B0297809220B20B2EB06 +:1020A000111F7DD12A7A04F1100138274FF00C0856 +:1020B0004FF001090391102A73D2DFE802F072F2A7 +:1020C000F1F07F08D2888D9F3DDBF3EEB6B6307B12 +:1020D000022800D0FFDFA88908EBC001ADF804108A +:1020E0003021ADF83410002C25D06081B5F80E9069 +:1020F00000271DE004EBC708317C88F80E10F18939 +:10210000A8F80C10CDF800906888042304AA296967 +:1021100000F02BFBBDF81010A8F8101009F1040016 +:10212000BDF812107F1C1FFA80F9A8F81210BFB278 +:102130006089B842DED80DE1307B022800D0FFDF95 +:10214000E98908EBC100ADF804003020ADF8340097 +:10215000287B0A90001FC0B20F90002CEBD0618149 +:10216000B5F81090002725E0CDF8009068886969DF +:1021700003AA0A9B00F0F9FA0A9804EBC70848443E +:102180001FFA80F908F10C0204A90F9810F092F9D7 +:1021900018B188F80EB0A8F80CB0BDF80C1001E02A +:1021A000D4E0CFE0A8F81010BDF80E107F1CA8F8FE +:1021B0001210BFB26089B842D6D8CBE00DA800900B +:1021C00001AB224629463046FFF71BFBC2E0307BBD +:1021D000082805D0FFDF03E0307B082800D0FFDFB0 +:1021E000E8891030ADF804003620ADF83400002C3A +:1021F0003FD0A9896181F189A18127E0307B09283D +:1022000000D0FFDFA88900F10C01ADF804103721E0 +:10221000ADF83410002C2CD06081E8890090AB8997 +:10222000688804F10C02296956E0E88939211030E8 +:1022300080B2ADF80400ADF83410002C74D0A98938 +:102240006181287A0E280AD002212173E989E1816F +:10225000288A0090EB8968886969039A3CE001212B +:10226000F3E70DA8009001AB224629463046FFF760 +:1022700059FB6FE0307B0A2800D0FFDF1220ADF859 +:102280000400ADF834704CB3A9896181A4F810B092 +:10229000A4F80EB084F80C905CE020E002E031E09D +:1022A00039E042E0307B0B2800D0FFDF288AADF810 +:1022B00034701230ADF8040084B104212173A9896F +:1022C0006181E989E181298A2182688A00902B8ACB +:1022D000688804F11202696900F047FA3AE0307B3D +:1022E0000C2800D0FFDF1220ADF80400ADF83470E8 +:1022F0003CB305212173A4F80AB0A4F80EB0A4F8E9 +:1023000010B027E00DA8009001AB224629463046C8 +:10231000FFF75CFA1EE00DA8009001AB22462946AB +:102320003046FFF7B6FB15E034E03B21ADF8040082 +:10233000ADF8341074B3A4F80690A4F808B084F88B +:102340000AB007E0FFDF05E010000020297A01292C +:1023500017D0FFDFBDF80400AAF800006CB1BDF88B +:1023600034002080BDF804006080BDF834003928B6 +:1023700003D03C2801D086F80CB011B00020BDE895 +:10238000F08F3C21ADF80400ADF8341014B1697A37 +:10239000A172DFE7AAF80000EFE72DE9F8435688BD +:1023A0000F4680461546052130460EF001FB04001D +:1023B00000D1FFDF123400943B46414630466A6844 +:1023C00009F0DBFEBAE570B50D4605210EF0F0FA16 +:1023D000040000D1FFDF294604F11200BDE870407F +:1023E00009F065BD70B50D4605210EF0E1FA040057 +:1023F00000D1FFDF294604F11200BDE8704009F06A +:1024000083BD70B5054605210EF0D2FA040000D157 +:10241000FFDF04F1080321462846BDE8704004228E +:10242000B1E470B5054605210EF0C2FA040000D1F2 +:10243000FFDF214628462368BDE870400522A2E45C +:1024400070B5064605210EF0B3FA040000D1FFDF97 +:1024500004F1120009F01EFD401D20F0030511E0FB +:10246000011D00880322431821463046FFF78BFCEC +:1024700000280BD0607BABB2684382B26068011D5C +:102480000EF053F9606841880029E9D170BD70B53C +:102490000E46054606F0BEFF040000D1FFDF012016 +:1024A000207266726580207820F00F00C01C20F03A +:1024B000F00030302070BDE8704006F0AEBF2DE96E +:1024C000F0438BB00D461446814606A9FFF799FBF1 +:1024D000002814D14FF6FF7601274FF420588CB115 +:1024E00003208DF800001020ADF8100007A805901B +:1024F00007AA204604A90FF0FCFF78B107200BB013 +:10250000BDE8F0830820ADF808508DF80E708DF806 +:102510000000ADF80A60ADF80C800CE00698A178D8 +:1025200001742188C1818DF80E70ADF80850ADF8A6 +:102530000C80ADF80A606A4602214846069BFFF708 +:1025400089FBDCE708B501228DF8022042F6020281 +:10255000ADF800200A4603236946FFF73EFC08BD9C +:1025600008B501228DF8022042F60302ADF80020E2 +:102570000A4604236946FFF730FC08BD00B587B062 +:1025800079B102228DF800200A88ADF80820498828 +:10259000ADF80A1000236A460521FFF75BFB07B080 +:1025A00000BD1020FBE709B1072316E407207047A0 +:1025B00070B588B00D461446064606A9FFF721FB04 +:1025C00000280ED17CB10620ADF808508DF800002F +:1025D000ADF80A40069B6A460821DC813046FFF7C9 +:1025E00039FB08B070BD05208DF80000ADF808502B +:1025F000F0E700B587B059B107238DF80030ADF88A +:102600000820039100236A460921FFF723FBC6E750 +:102610001020C4E770B588B00C460646002506A910 +:10262000FFF7EFFA0028DCD106980121123009F0FB +:1026300063FC9CB12178062921D2DFE801F0200556 +:1026400005160318801E80B2C01EE28880B20AB14F +:10265000A3681BB1824203D90C20C2E71020C0E757 +:10266000042904D0A08850B901E00620B9E7012967 +:1026700013D0022905D004291CD005292AD007200F +:10268000AFE709208DF800006088ADF80800E08809 +:10269000ADF80A00A068039023E00A208DF800003E +:1026A0006088ADF80800E088ADF80A00A0680A2547 +:1026B000039016E00B208DF800006088ADF808004C +:1026C000A088ADF80A00E088ADF80C00A0680B25E2 +:1026D000049006E00C208DF8000060788DF808006A +:1026E0000C256A4629463046069BFFF7B3FA78E781 +:1026F00000B587B00D228DF80020ADF8081000233A +:102700006A461946FFF7A6FA49E700B587B071B1E6 +:1027100002228DF800200A88ADF808204988ADF81B +:102720000A1000236A460621FFF794FA37E71020C3 +:1027300035E770B586B0064601200D46ADF80810A5 +:102740008DF80000014600236A463046FFF782FA02 +:10275000040008D12946304605F09AFC0021304695 +:1027600005F0B4FC204606B070BDF8B51C46154611 +:102770000E46069F0EF04EFA2346FF1DBCB23146B0 +:102780002A4600940DF039FEF8BD30B41146DDE95B +:1027900002423CB1032903D0002330BC08F022BB25 +:1027A0000123FAE71A8030BC704770B50C46054625 +:1027B000FFF72FFB2146284605F079FC2846BDE8A7 +:1027C0007040012105F082BC4FF0E0224FF400413F +:1027D0000020C2F88011204908702049900208604A +:1027E000704730B51C4D04462878A04218BF002C15 +:1027F00002D0002818BFFFDF2878A04208BF30BDF4 +:102800002C701749154A0020ECB1164DDFF858C05E +:10281000131F012C0DD0022C1CBFFFDF30BD086040 +:1028200003200860CCF800504FF4000010601860DE +:1028300030BD086002200860CCF800504FF04070B6 +:102840001060186030BD086008604FF06070106064 +:1028500030BD00B5FFDF00BD1800002008F50140C5 +:1028600000F500408C02002014F5004070B50B20EC +:1028700000F0B5F9082000F0B2F900210B2000F0BB +:10288000C4F90021082000F0C0F9EC4C0125656076 +:10289000A5600020C4F84001C4F84401C4F8480110 +:1028A0000B2000F0A7F9082000F0A4F90B2000F09D +:1028B0008BF9256070BD10B50B2000F090F9082051 +:1028C00000F08DF9DD48012141608160DC490A6832 +:1028D000002AFCD10021C0F84011C0F84411C0F812 +:1028E00048110B2000F086F9BDE81040082000F0E8 +:1028F00081B910B50B2000F07DF9BDE8104008202B +:1029000000F078B900B530B1012806D0022806D011 +:10291000FFDF002000BDCB4800BDCB4800BDCA484A +:10292000001D00BD70B5C9494FF000400860C84D9A +:10293000C00BC5F80803C74800240460C5F840412F +:102940000820C43500F04BF9C5F83C41C24804707A +:1029500070BD08B5B94A002128B1012811D002285C +:102960001CD0FFDF08BD4FF48030C2F80803C2F866 +:102970004803B3483C300160C2F84011BDE808404C +:10298000D0E74FF40030C2F80803C2F84803AC485F +:1029900040300160C2F84411AB480CE04FF4802095 +:1029A000C2F80803C2F84803A54844300160C2F8E1 +:1029B0004811A548001D0068009008BD70B5164676 +:1029C0000D460446022800D9FFDF00229B48012360 +:1029D00004F110018B4000EB8401C1F8405526B191 +:1029E000C1F84021C0F8043303E0C0F80833C1F84F +:1029F0004021C0F8443370BD2DE9F0411C46154616 +:102A000030B1012834D0022839D0FFDFBDE8F08191 +:102A1000891E002221F07F411046FFF7CFFF012CD5 +:102A200024D000208C4E8A4F012470703C6189496B +:102A300000203C3908600220091D086085490420F7 +:102A40003039086083483D350560C7F800420820EA +:102A500000F0D0F82004C7F80403082000F0B4F810 +:102A60007A49E007091F08603470CFE70120D9E7F1 +:102A7000012B02D00022012005E00122FBE7012BFF +:102A800004D000220220BDE8F04197E70122F9E7D7 +:102A90006B480068704770B500F0C7F8674C054692 +:102AA000D4F840010026012809D1D4F80803C00356 +:102AB00005D54FF48030C4F80803C4F84061D4F859 +:102AC000440101280CD1D4F80803800308D54FF441 +:102AD0000030C4F80803C4F84461012010F0CDFCB4 +:102AE000D4F8480101280CD1D4F80803400308D5D4 +:102AF0004FF48020C4F80803C4F84861022010F0A5 +:102B0000BCFC5648056070BD70B500F08EF8524DA3 +:102B10000446287858B1FFF705FF687820B10020F7 +:102B200085F8010010F0A9FC4C48046070BD03203A +:102B3000F8E74FF0E0214FF40010C1F800027047B1 +:102B4000152000F057B8424901200861082000F024 +:102B500051B83F494FF47C10C1F8080300200246E9 +:102B600001EB8003C3F84025C3F84021401CC0B2EC +:102B70000628F5D37047410A43F609525143C0F382 +:102B8000080010FB02F000F5807001EB5020704748 +:102B900010B5430B48F2376463431B0C5C020C60B6 +:102BA0002F4C03FB04002F4B4CF2F72443435B0DE7 +:102BB00013FB04F404EB402000F580704012107009 +:102BC00008681844086010BD00F01F020121914000 +:102BD0004009800000F1E020C0F80011704700F0CB +:102BE0001F02012191404009800000F1E020C0F85F +:102BF0008011704700F01F020121914040098000C0 +:102C000000F1E020C0F8801270474907090E002843 +:102C100006DA00F00F0000F1E02080F8141D704784 +:102C200000F1E02080F8001470470C48001F006895 +:102C30000A4A0D49121D11607047000000B00040A3 +:102C400004B500404081004044B1004008F5014017 +:102C500000800040408500403800002014050240FC +:102C6000F7C2FFFF6F0C0100010000010A4810B518 +:102C70000468094909480831086010F092FC0648C8 +:102C8000001D046010BD0649002008604FF0E021DF +:102C90000220C1F8800270471005024001000001C7 +:102CA000FC1F004010B50D2000F06FF8C4B26FF0AB +:102CB000040000F06AF8C0B2844200D0FFDF3A4955 +:102CC0000120086010BD70B50D2000F048F8374CA9 +:102CD0000020C4F800010125C4F804530D2000F0C1 +:102CE00049F825604FF0E0216014C1F8000170BD83 +:102CF00010B50D2000F033F82C480121416000216F +:102D0000C0F80011BDE810400D2000F033B828488D +:102D100010B5046826492748083108602349D1F8CE +:102D20000001012804D0FFDF2148001D046010BD10 +:102D30001D48001D00680022C0B2C1F8002110F03B +:102D4000E7FFF1E710B51948D0F800110029FBD0D2 +:102D5000FFF7DDFFBDE810400D2000F00BB800F0DC +:102D60001F02012191404009800000F1E020C0F8DD +:102D70008011704700F01F0201219140400980003E +:102D800000F1E020C0F880127047002806DA00F059 +:102D90000F0000F1E02090F8140D03E000F1E020B6 +:102DA00090F800044009704704D5004000D000406E +:102DB000100502400100000110B5202000F082F84B +:102DC000202000F08AF84A49202081F8000449496F +:102DD00000060860091D48480860FEF79DFA45494D +:102DE000C83108604548D0F8041341F00101C0F82B +:102DF0000413D0F8041341F08071C0F804133C4967 +:102E000001201C39C1F8000110BD10B5202000F0D0 +:102E100059F8384800210160001D0160354A481EFC +:102E2000E83A1060354AC2F80803324BC8331960DB +:102E3000C2F80001C2F8600131490860BDE81040E5 +:102E4000202000F04AB82B492E48EC390860704722 +:102E500028492C48E8390860704726480160001D61 +:102E6000521E0260704723490120E8390860BFF311 +:102E70004F8F704770B51F4A8069E83A2149116049 +:102E80001E49D1F8006100231F4D1D4A5C1E1EB172 +:102E9000A84206D300210FE0D1F8606186B1A842B4 +:102EA00009D2C1F80031C1F860311460BDE870404A +:102EB000202000F012B81168BDE8704021F040BA3F +:102EC000FFDF70BD00F01F0201219140400980002A +:102ED00000F1E020C0F88011704700F01F020121CE +:102EE00091404009800000F1E020C0F88012704756 +:102EF00020E000E000060240C41400200000024070 +:102F00000004024001000001006002000F4A126844 +:102F10000D498A420CD118470C4A12680A4B9A4252 +:102F200006D101B510F06EFFFFF78DFFBDE801403F +:102F3000074909680958084706480749054A064BE2 +:102F40007047000000000000BEBAFECAB0000020BA +:102F500004000020E0120020E012002070B50C46B2 +:102F6000054609F0A7FA21462846BDE870400AF058 +:102F70008CBB10B511F0B0FBFFF726FC11F04CFA3A +:102F8000BDE8104011F0FEBA0120810708607047CB +:102F9000012081074860704712480068C00700D0D0 +:102FA000012070470F48001F0068C00700D00120B3 +:102FB00070470C4808300068C00700D001207047F7 +:102FC000084810300068704706490C310A68D2037F +:102FD00006D5096801F00301814201D10120704743 +:102FE000002070470C0400407047704770477047DE +:102FF000704770477047704770470004050600002F +:103000002CFFFFFFDBE5B15100600200A800FFFFCD +:1030100084000000808D5B0016425791AD5F58BC64 +:103020008E702F5A0FAA100DBCD52BFD30B5FC4D5C +:103030000446062CA9780ED2DFE804F0030E0E0E2B +:103040000509FFDF08E0022906D0FFDF04E00329BD +:1030500002D0FFDF00E0FFDFAC7030BD30B50446CA +:103060001038EF4D07280CD2DFE800F0040C060CF6 +:103070000C0C0C00FFDF05E0287E112802D0FFDFDA +:1030800000E0FFDF2C7630BD2DE9F0410FF09CFB16 +:10309000044610F038FD201AC5B206200DF030FCB1 +:1030A000044606200DF034FC211ADD4C207E122847 +:1030B00018D000200F1807200DF022FC064607202C +:1030C0000DF026FC301A3918207E13280CD0002071 +:1030D0000144A078042809D000200844281AC0B26E +:1030E000BDE8F0810120E5E70120F1E70120F4E7E8 +:1030F000CB4810B590F825004108C94800F12600DA +:1031000005D00BF0B6FABDE8104005F0AFBF0BF0EC +:1031100089FAF8E730B50446A1F120000D460A28E7 +:103120004AD2DFE800F005070C1C2328353A3F445B +:10313000FFDF42E0207820283FD1FFDF3DE0B848A4 +:103140008178052939D0007E122836D020782428AD +:1031500033D0252831D023282FD0FFDF2DE0207851 +:1031600022282AD0232828D8FFDF26E0207822280A +:1031700023D0FFDF21E0207822281ED024281CD075 +:1031800026281AD0272818D0292816D0FFDF14E0C7 +:103190002078252811D0FFDF0FE0207825280CD0DB +:1031A000FFDF0AE02078252807D0FFDF05E0207840 +:1031B000282802D0FFDF00E0FFDF257030BD10B50A +:1031C000012803D0022805D0FFDF10BDBDE8104064 +:1031D00003202BE79248007E122800D0FFDF002159 +:1031E000052011F04FF8BDE81040112036E71FB55B +:1031F00004466A46002001F01FFEB4B1BDF802206B +:103200004FF6FF700621824201D1ADF80210BDF8E1 +:103210000420824201D1ADF80410BDF808108142AB +:1032200003D14FF44860ADF8080068460BF089FF01 +:1032300005F01CFF04B010BD70B514460D460646DF +:1032400011F06CF858B90DB1A54201D90C2070BD30 +:10325000002408E056F8240011F060F808B11020AE +:1032600070BD641CE4B2AC42F4D3002070BD2DE903 +:10327000F04105461F4690460E460024006811F0B6 +:103280009AF808B110202BE728680028A88802D0F7 +:10329000B84202D84FE00028F5D0092020E728687E +:1032A000025DB2B1611C475C152F2DD03BDC3AD2D8 +:1032B000DFE807F03912222228282A2A3131393949 +:1032C00039393939393939392200025D32BB641C48 +:1032D000A4B2A142F9D833E0022ADED1A21C805C5C +:1032E00088F80000072801D2400701D40A20F7E639 +:1032F000307840F0010015E0D043C00707E0012A14 +:1033000007D010E00620EBE61007A0F1805000285F +:10331000F5D01846E4E63078820701D50B20DFE6C9 +:1033200040F0020030702868005D084484B2A8882C +:10333000A04202D2B1E74FF4485381B2A142AED8C5 +:103340000020CDE610B5027843F202235408012292 +:10335000022C12D003DC3CB1012C16D106E0032C68 +:1033600010D07F2C11D112E0002011E080790324CD +:10337000B4EB901F09D10A700BE08079B2EB901F7B +:1033800003D1F8E780798009F5D0184610BDFF20F9 +:103390000870002010BD224991F82E2042B191F80A +:1033A0002F10022909D0032909D043F202207047C7 +:1033B00001461B48253001F092BD032100E00121A8 +:1033C00001700020704738B50C460546694601F08B +:1033D00086FD00280DD19DF80010207861F347008C +:1033E000207055F8010FC4F80100A888A4F8050062 +:1033F000002038BD38B51378B0B1022814D0FF28AA +:103400001BD008A46D46246800944C7905EB9414F5 +:10341000247864F34703137003280AD010E00000F7 +:10342000D80100200302FF0123F0FE0313700228DD +:10343000F2D1D8B240F0010005E043F0FE00107078 +:10344000107820F0010010700868C2F80100888828 +:10345000A2F8050038BD02210DF0AABA38B50C4615 +:103460000978222901D2082038BDADF800008DF876 +:10347000022068460BF044F905F0F8FD050003D181 +:1034800021212046FFF746FE284638BD1CB5002006 +:103490008DF80000CDF80100ADF80500FE4890F869 +:1034A0002E00022801D0012000E000208DF8070046 +:1034B00068460BF056FB002800D0FFDF1CBD002241 +:1034C0000A80437892B263F345120A8043785B081E +:1034D00063F386120A8000780C282BD2DFE800F014 +:1034E0002A06090E1116191C1F220C2742F0110082 +:1034F00009E042F01D0008800020704742F01100F2 +:1035000012E042F0100040F00200F4E742F0100038 +:10351000F1E742F00100EEE742F0010004E042F082 +:103520000200E8E742F0020040F00400E3E742F066 +:103530000400E0E7072070472DE9FF478AB0002527 +:10354000BDF82C6082461C4690468DF81C507007D2 +:1035500003D5606810F0E2FE68B9CF4F4FF0010963 +:1035600097F82E0058B197F82F00022807D160680D +:1035700010F021FF18B110200EB0BDE8F087300721 +:1035800002D5A089802816D8700705D4B8F1000F9D +:1035900002D097F8240070B1E07DC0F300108DF8E0 +:1035A0001B00617D072041B1012906D00229E3D02B +:1035B0000429E1D12CE00720DEE749468DF8179079 +:1035C000F00609D4A27D072032B1012A04D0022AD4 +:1035D00005D0042AD0D11BE08DF8191002E002209A +:1035E0008DF819008DF815806068B0B107A9FFF754 +:1035F000A9FE0028C0D19DF81C00FF280AD06068F1 +:1036000050F8011FCDF80F108088ADF8130008E0C6 +:103610000620B1E743F20220AEE7CDF80F50ADF837 +:103620001350E07B0028F3D1207C0028F0D1607C8F +:103630000028EDD1A07C0028EAD1E07CC006E7D1CB +:103640008DF800A0BDF82C00ADF80200A068019034 +:10365000A068029004F10F0001F035FC8DF80C0019 +:103660000DF10D00FFF797FE00B1FFDF9DF81C0084 +:103670008DF80E008DF816508DF81850E07D08A9D1 +:1036800000F00F008DF81A0068460BF036FF05F0C9 +:10369000EDFC71E7F0B59DB000228DF868208DF843 +:1036A00058208DF8602005468DF86C2012921392F8 +:1036B0001492159219B10FC912AC84E80F00764C20 +:1036C000A078052801D004280CD11298616888429E +:1036D00000D120B91498E168884203D110B10820C4 +:1036E0001DB0F0BD1F26334618AA1AA912A8FFF76D +:1036F000BEFD0028F4D133461BAA16A914A8FFF773 +:10370000B6FD0028ECD19DF85800C00701D00A2072 +:10371000E6E7A08A410708D4A17D31B19DF8601089 +:10372000890702D043F20120DAE79DF86010C9074B +:1037300009D0400707D4208818B144F2506188426C +:1037400001D90720CCE78DF8005003268DF80160E1 +:1037500001278DF80270BDF84C208DF8032001A8D8 +:10376000129920F025FD68460BF028FF05F07EFC3D +:103770000028B5D18DF824508DF825608DF826707D +:10378000BDF854208DF827200AA8149920F010FDC8 +:1037900009A80BF060FF05F069FC0028A0D112AD6C +:1037A000241D95E80F0084E80F00002098E770B50D +:1037B00086B00D46040005D010F0FDFD20B11020AC +:1037C00006B070BD0820FBE72078C107A98802D0A9 +:1037D000FF2902D303E01F2901D20920F0E7800767 +:1037E00061D4FFF751FC38B12078C0F3C101012941 +:1037F00004D0032902D005E01320E1E7264991F81F +:10380000241041B1C0074FF000054FF0010604D06D +:103810008DF80F6003E00720D2E78DF80F5068465F +:10382000FFF7B9FD00B1FFDF2078C0F3C1008DF8CC +:1038300001008DF80250607808B98DF80260607858 +:10384000C00705D09DF8020040F001008DF802008D +:103850006078800705D59DF8020040F002008DF8E1 +:1038600002006078400705D59DF8020040F0040092 +:103870008DF802002078C0F380008DF80300608886 +:10388000ADF80600A088ADF80A00207A58B9607A31 +:1038900048B9A07A38B901E0D8010020E07A10B91F +:1038A000207BC00601D006208AE704F1080001F061 +:1038B0000AFB8DF80E0068460BF087F905F0D6FB81 +:1038C00000288BD18DF810608DF81150ADF8125092 +:1038D000ADF8145004A80BF0FDF905F0C7FB002863 +:1038E0008BD1E08864280AD248B1012001F001FBA5 +:1038F000002891D12078C00705D0152004E064216C +:10390000B0FBF1F0F2E71320FFF7A8FB002057E728 +:103910002DE9FF470220FF4E8DF804000027708E2E +:10392000ADF80600B84643F202094CE001A80CF0DD +:10393000A6FF050006D0708EA8B3A6F83280ADF8B9 +:1039400006803EE0039CA07F01072DD504F12400F2 +:103950000090A28EBDF80800214604F1360301F064 +:1039600054FC050005D04D452AD0112D3CD0FFDF79 +:103970003AE0A07F20F00801E07F420862F3C7111F +:10398000A177810861F30000E07794F8210000F04E +:103990001F0084F820002078282826D129212046DD +:1039A000FFF7B8FB21E014E040070AD5BDF8080096 +:1039B00004F10E0101F0ABFA05000DD04D4510D118 +:1039C00000257F1CFFB202200CF09AFF401CB84279 +:1039D000ACD8052D11D008E0A07F20F00400A0771E +:1039E00003E0112D00D0FFDF0025BDF80600708632 +:1039F000052D04D0284604B0BFE5A6F8328000208B +:103A0000F9E770B50646FFF726FD054605F002FD0D +:103A1000040000D1FFDF6680207820F00F00801CBA +:103A200020F0F000203020700620207295F83E0033 +:103A30006072BDE8704005F0F0BC2DE9F04786B03B +:103A4000040000D1FFDF2078B24D20F00F00801C71 +:103A500020F0F0007030207060680178491F1B2949 +:103A600033D2DFE801F0FE32323255FD320EFDFD79 +:103A700042FC32323278FCFCFB323232FCFCFAF986 +:103A8000FC00C6883046FFF7E6FC0546304607F0E6 +:103A9000A7F8E0B16068007A85F83E002121284649 +:103AA000FFF738FB3046FEF7CEFA304603F016FE3D +:103AB0003146012010F0E6FBA87F20F01000A87727 +:103AC000FFF726FF002800D0FFDF06B055E520787D +:103AD00020F0F000203020700620207266806068A0 +:103AE000007A607205F099FCD8E7C5882846FFF790 +:103AF000B2FC00B9FFDF60680079012800D0FFDF69 +:103B00006068017A06B02846BDE8F04707F044BC7B +:103B1000C6883046FFF79FFC050000D1FFDF05F0A7 +:103B20007CFC606831460089288160684089688132 +:103B300060688089A881012010F0A4FB0020A8758E +:103B4000A87F00F003000228BFD1FFF7E1FE0028A4 +:103B5000BBD0FFDFB9E70079022811D000B1FFDF49 +:103B600005F05BFC6668B6F806A0307A361D0128C1 +:103B70000CD0687E814605F0E5F9070009D107E021 +:103B800006B00220BDE8F047FFF719BBE878F1E77F +:103B9000FFDF0022022150460CF001FF040000D19B +:103BA000FFDF22212046FFF7B5FA3079012800D047 +:103BB0000220A17F804668F30101A177308B20812C +:103BC000708B6081B08BA08184F822908DF8088082 +:103BD000B8680090F86801906A46032150460CF0DE +:103BE000DEFE00B9FFDFB888ADF81000B8788DF8B8 +:103BF000120004AA052150460CF0D1FE00B9FFDFE7 +:103C0000B888ADF80C00F8788DF80E0003AA0421EE +:103C100050460CF0C4FE00B9FFDF062106F1120089 +:103C200001F093F938B37079800700D5FFDF71791F +:103C3000E07D61F34700E075D6F80600A061708969 +:103C4000A083062106F10C0001F07FF9E8B195F898 +:103C500025004108607805E032E02AE047E03FE0D7 +:103C600021E035E061F347006070D5F82600C4F824 +:103C70000200688D12E0E07D20F0FE00801CE075FF +:103C8000D6F81200A061F08ADAE7607820F0FE0032 +:103C9000801C6070F068C4F80200308AE080404602 +:103CA000FFF78DFA11E706B02046BDE8F04701F0B6 +:103CB00035BD05F0B2FB15F8300F40F0020005E00D +:103CC00005F0ABFB15F8300F40F004002870FCE65F +:103CD000287E132809D01528E4D11620FFF7BEF955 +:103CE00006B0BDE8F04705F098BB1420F6E7A978C8 +:103CF000052909D00429D5D105F08FFB022006B093 +:103D0000BDE8F047FFF792B900790028CAD0E878FB +:103D100002E00000D801002001F0BCF805F07DFBB6 +:103D20000320ECE72DE9F05F054600784FF000082E +:103D30000009DFF820A891460C46464601287AD0B3 +:103D400001274FF0020C4FF6FF73022874D00728AA +:103D50000BD00A2871D0FFDFA9F8006014B1A4F8D5 +:103D6000008066800020BDE8F09F696804F10800CB +:103D70000A78172A70D010DC4FF0000B142A31D0CB +:103D800006DC052A6DD0092A0FD0102A7ED11FE04B +:103D9000152A7CD0162AF9D1F0E01B3A052A75D2F3 +:103DA000DFE802F009C5FDDAFC00C8884FF0120810 +:103DB0001026214675E14FF01C080A26D4B38888E6 +:103DC000A0806868807920726868C0796072C3E7F3 +:103DD0004FF01B0814266CB303202072686880889B +:103DE000A080B9E70A793C2AB6D00D1D4FF0100823 +:103DF0002C26FCB16988A180298B6182298B2182C4 +:103E0000698BA182A98BE1826B790246A91D1846B4 +:103E1000FFF7F0FA2879012810D084F80FC0FF20AE +:103E20002076C4F81CB0C4F820B0C4F824B0C4F89C +:103E300028B091E712E013E13BE135E1E7730AF1C5 +:103E4000040084F818B090E80E00DAF81000C4E915 +:103E50000930C4E907127FE7A8E002E0A9F8006092 +:103E600080E72C264FF01D08002CF7D00546A380D4 +:103E7000887B2A880F1D60F300022A80887B400817 +:103E800060F341022A80887B800801E0E6E0ADE033 +:103E900060F382022A80887BB91CC00860F3C302E9 +:103EA0002A80B87A0011401C60F3041202F07F00EF +:103EB00028807878AA1CFFF79DFA387D05F1090261 +:103EC00007F11501FFF796FA387B01F04DF82874D9 +:103ED000787B01F049F86874F87EA874787AE87401 +:103EE00097F83B002875B87B6875A5F816B0DAF826 +:103EF0001C00A861397ABAF82000884201D2014634 +:103F000010E0B87AC0F3411002280BD0012809D084 +:103F1000288820F060002880A1840A4607F11C014F +:103F2000A86998E0288820F060004030F3E7112667 +:103F30004FF02008002C91D0A380686804F10A0299 +:103F4000007920726868007B607269688B1D48790F +:103F50001946FFF74FFAFFE60A264FF02108002C1A +:103F6000E9D08888A0806868807920726868C07904 +:103F700060729AF8301021F004018BE00B264FF0AC +:103F80002208002CD7D0C888A080686800792072E9 +:103F90006868007A00F0E8FF607201E052E039E002 +:103FA0006868407A00F0E0FFA072D5E61C264FF06A +:103FB0002608002CBFD0A3806868407960726868CA +:103FC000007AA0720AF1040090E80E00DAF81000FE +:103FD000C4E90530C4E90312686800793C2803D0BD +:103FE00043287DD0FFDFB7E62772B5E610264FF0F5 +:103FF0002408002C9FD08888A08068688079208160 +:104000006868807A608168680089A08168688089B2 +:10401000E081A1E610264FF02308002C8BD0888881 +:10402000A0806868C08820816868008960816868AD +:104030004089A08168688089E0819AF8301021F079 +:10404000020127E030264FF02508002C88D0A380FD +:1040500069682822496820F0ABF87DE64A4677E097 +:10406000287A012803D0022817D0FFDF74E6102633 +:104070004FF01F08002C85D06888A080A889208177 +:10408000E8896081288AA081688AE0819AF83010E6 +:1040900021F001018AF830105EE64FF01208102678 +:1040A000688800F03FFF57E62846BDE8F05F01F062 +:1040B000BFBC287A07284DD2DFE800F04C38384AD8 +:1040C0004A4A040009264FF01108002C92D06F884C +:1040D0003846FFF7C0F990F822A0A780687A00E080 +:1040E0002DE02072042138460CF074FC052138467E +:1040F0000CF070FC002138460CF06CFC01213846B5 +:104100000CF068FC032138460CF064FC02213846B0 +:104110000CF060FC062138460CF05CFC07213846A8 +:104120000CF058FC504600F0B5FE15E614264FF092 +:104130001B08002C8AD0A380287A012802D084F89A +:1041400008C009E62772DAE90710C4E9031003E69C +:104150002146A9E7FFDFFFE570B5FE4D287E122856 +:1041600001D0082070BD0AF0C3FF04F07FFF0400F7 +:1041700002D1687E00F08EFE0021052010F082F84A +:10418000204670BD1CB5F348007E132801D20820DC +:104190001CBD00208DF8000068460AF09BFD04F06D +:1041A00065FF0028F4D10021052010F06BF81120E4 +:1041B000FEF754FF00201CBD70B5012805D005286E +:1041C00025D0062800D0FFDF70BD8DB22846FFF74E +:1041D00042F9040000D1FFDF20782128F4D005F057 +:1041E00019F968B1017821F00F01891C21F0F00163 +:1041F000103101700221017245800020A07528E075 +:1042000021462846BDE870401322FFF727B9D14860 +:10421000047EA4F1120005281FD2DFE800F0060397 +:1042200003030300FFF7AEFF01E0FFF795FF00284F +:10423000CAD105F0EFF80028C6D0017821F00F01AF +:10424000891C21F0F00120310170132C07D00221CC +:104250000172BDE8704005F0E0B8FFDF70BD0121DC +:10426000F6E72DE9F04116460C00804600D1FFDF4D +:10427000307820F00F00801C20F0F00010303070FB +:104280002078012804D0022818D0FFDFBDE8F08193 +:104290004046FFF7E0F8050000D1FFDF0320A875D6 +:1042A00005F0BBF894E80F00083686E80F00A9482F +:1042B00010F8301F41F001010170E7E74046FFF7B9 +:1042C000CAF8050000D1FFDFA1884FF6FF70002774 +:1042D000814202D1E288824203D0814201D1E0884A +:1042E00040B105F09AF894E80F00083686E80F0010 +:1042F000AF75CBE7A87D0128C8D1782300224146BD +:104300000FF016FF0220A875C0E738B505460C4629 +:10431000084610F003F818BB203D062D4AD2DFE80E +:1043200005F0031B373C4230002106200FF080FFD0 +:1043300008B1112038BDA01C0AF0AFFF04F096FEB2 +:10434000050038D100220823114606200FF0F0FEA8 +:10435000062830D0FFDF2EE0606810F023F808B1A7 +:10436000102038BD618820886A460BF05FFB04F09E +:104370007DFE05001FD16068E8B1BDF80010018026 +:1043800019E0A07800F0010120880BF085FB0EE019 +:10439000206801F0FBFD05460DE0207800F00100EB +:1043A0000AF033F903E0618820880BF0C4FA04F0C6 +:1043B0005DFEF0E70725284638BD70B505460C467A +:1043C00008460FF0D1FF08B1102070BD202D07D096 +:1043D000212D0DD0222D0BD0252D09D0072070BD09 +:1043E0002088A11C0AF006FABDE8704004F03EBE29 +:1043F000062070BD57482530704708B53421554810 +:104400001FF077FF0120FEF711FE1120FEF726FEB8 +:1044100050496846263104F093FF4E489DF800202D +:1044200010F8251F62F3470121F0010101700021FE +:1044300041724FF46171A0F8071002218172FEF7FA +:1044400057FE00B1FFDFFCF791FF01F032F908BD24 +:1044500010B50C46402120461FF029FFA07F20F018 +:104460000300A077202020700020A07584F823008E +:1044700010BD70472DE9FC4107460FF04FFF10B10A +:104480001020BDE8FC81334E06F12501D6F8250049 +:104490000090B6F82950ADF8045096F82B408DF8EE +:1044A00006403846FEF78FFF0028EAD1FEF720FECF +:1044B0000028E6D0009946F8251FB580B471E0E7E2 +:1044C00010B504460FF050FF08B1102010BD214870 +:1044D0002049224690F8250026314008FEF78AFF41 +:1044E000002010BDFEB50D4604004FF0000712D0AD +:1044F0000822FEF7A1FE002812D1002609E000BF25 +:1045000054F826006946FEF71DFF002808D1761CE6 +:10451000F6B2AE42F4D309F07CFF10B143F20320AF +:10452000FEBD0C4E86F8247024B300271EE000BFA9 +:1045300054F8270002A9FEF705FF00B1FFDF9DF840 +:1045400008008DF8000054F8270050F8011FCDF83E +:10455000011001E0D80100208088ADF80500684610 +:1045600009F0A1FF00B1FFDF7F1CFFB2AF42DFD334 +:1045700086F824500020FEBD2DE9F0478AB015468C +:10458000894604001ED00F4608222946FEF754FE35 +:10459000002810D1002613E054F826006946103098 +:1045A00000F09DFC002806D147B157F826000FF017 +:1045B000B5FE18B110200AB0BDE8F087761CF6B23F +:1045C000AE42E9D30026A5F101081BE006F1010A7D +:1045D0000AF0FF0712E000BF54F82600017C4A08E9 +:1045E00054F827100B7CB2EB530F05D10622113083 +:1045F00011311FF0B1FD58B17F1CFFB2AF42EBD3B8 +:104600000AF0FF064645E1DB4E4624B1012003E0F7 +:1046100043F20520CFE7002009F076FF10B909F03A +:1046200087FF10B143F20420C5E75CB300270DF10A +:10463000170825E054F827006946103000F04FFCB9 +:1046400000B1FFDF54F82700102250F8111FCDF8F9 +:1046500001108088ADF8050054F827100DF107000F +:104660001FF0A6FD96B156F82710102240461FF005 +:104670009FFD684609F0F0FE00B1FFDF7F1CFFB22E +:10468000AF42D7D3FEF702FF002094E7404601F087 +:1046900071FCEEE730B585B004460FF03FFE18B967 +:1046A00060680FF088FE10B1102005B030BD608842 +:1046B0004AF2B811884206D82078FB4D28B101286B +:1046C00006D0022804D00720EFE7FEF711FD18E01E +:1046D0006078022804D0032802D043F20220E4E7E5 +:1046E00085F82F00C1B200200090ADF80400022927 +:1046F0002CD0032927D0FFDF684609F0BAFF04F069 +:10470000B5FC0028D1D1606801F027FC207858B1B1 +:1047100001208DF800000DF1010001F02BFC68462E +:104720000BF018FA00B1FFDF207885F82E00FEF7B5 +:10473000ADFE608860B1A88580B209F0DDFE00B1F1 +:10474000FFDF0020B1E78DF80500D5E74020FAE74C +:104750004FF46170EFE710B504460FF005FE20B985 +:10476000606838B10FF01EFE08B1102010BD6068FF +:1047700001F000FCCC4830F82C1F6180C1786170DA +:1047800080782070002010BD2DE9F843144689463A +:1047900006460FF0E9FDA0B948460FF00CFE80B9BF +:1047A00020460FF008FE60B9BF4DA878012800D15F +:1047B0003CB13178FF2906D049B143F20400BDE88D +:1047C000F8831020FBE7012801D00420F7E74FF021 +:1047D0000008A4B3052811D004280FD0694620464C +:1047E000FEF76DFE0028EAD1207D48B1012809D0EE +:1047F000022809D0032809D00720E0E70820DEE7D7 +:10480000424604E0012202E0022200E003222346A5 +:10481000174600200099FEF78FFE0028CFD1A0890F +:104820002880A07BE875BDF80000A882AF75BDF8B0 +:104830000000000701D5A08988B1A08928804946D9 +:104840000020FEF727FF0028B9D1A87805280BD053 +:10485000042809D0287DC00703D0032002E080206F +:10486000ECE70220FEF7E2FB86F800800020A6E7D6 +:104870007CB58D4C05460E46A078022803D003284F +:1048800001D008207CBD15B143F204007CBD072097 +:104890000CF03EF810B9A078032806D0FEF7F4FB20 +:1048A00028B1A078032804D009E012207CBD132091 +:1048B0007CBD304600F0CDFA0028F9D1E670012029 +:1048C0008DF800008DF801008DF802502088ADF8B9 +:1048D0000400E07D8DF8060068460AF0EAFF04F067 +:1048E000C5FB0028E4D1A078032805D05FF00400C0 +:1048F000FEF79CFB00207CBDE07800F0BAFA0520B2 +:10490000F6E71CB510B143F204001CBD664CA0785C +:10491000042803D0052801D008201CBD00208DF8F4 +:10492000000001218DF801108DF8020068460AF0A0 +:10493000C0FF04F09BFB0028EFD1A078052805D02C +:104940005FF00200FEF772FB00201CBDE07800F073 +:10495000A1FA0320F6E72DE9FC4180460E46032527 +:1049600008460FF028FD002866D14046FEF773FD8B +:10497000040004D02078222804D2082081E543F2E4 +:1049800002007EE5A07F00F003073EB1012F0CD0AE +:1049900000203146FEF72BFC0500EFD1012F06D099 +:1049A000022F1AD0FFDF28466BE50120F1E7A07D3A +:1049B0003146022801D011B107E0112061E56846B7 +:1049C000FCF7E1FD0028D9D16946404606F0A7FC76 +:1049D0000500E8D10120A075E5E7A07D032804D1FA +:1049E000314890F83000C00701D02EB30EE026B158 +:1049F000A07F40071ED4002100E00121404606F0C0 +:104A0000AEFC0500CFD1A075002ECCD0314640467B +:104A100000F07DFA05461128C5D1A07F4107C2D418 +:104A2000316844F80E1F7168616040F00400207422 +:104A30000025B8E71125B6E7102022E570B50C4631 +:104A40000546FEF708FD010005D022462846BDE8D0 +:104A50007040FEF703BD43F2020070BD10B501289F +:104A600007D1114B9B78012B00D011B143F2040008 +:104A700010BD09F084FDBDE8104004F0F7BA012331 +:104A800000F012BA00231A46194600F00DBA70B5AC +:104A900006460C4608460FF041FC18B920680FF096 +:104AA00063FC18B1102070BDD8010020F74D2A7E9C +:104AB000112A04D0132A00D33EB10820F3E721467F +:104AC0003046FEF774FE60B1EDE70920132A0DD0E1 +:104AD000142A0BD0A188FF29E5D31520FEF7BEFAD2 +:104AE0000020D4E90012C5E90712DCE7A1881F29DC +:104AF000D9D31320F2E72DE9F047DFF8908307467A +:104B000090B098F818009A4615460C46132803D31F +:104B1000FFF738FB002822D120460FF0FFFBA0BB97 +:104B200028460FF0FBFB80BB20784FF00101C00747 +:104B30004FF0000602D08DF83A1001E08DF83A608F +:104B40002078C0F3C1008DF800006278072042B1E0 +:104B5000012A06D0022A02D0042A00D1062010B071 +:104B60002AE58DF809106088ADF80A00A088ADF834 +:104B7000100020788946C0F3C10001281FD0032807 +:104B80001DD038460FF0CAFB08B11020E7E738788F +:104B9000400808D0012809D0022807D0032805D0F2 +:104BA00043F20220DBE78DF8026001E08DF802900D +:104BB00057F8010FCDF80300B888ADF807000DF1E4 +:104BC0000100FEF7E8FB08B10320C8E72888ADF82C +:104BD00016006888ADF81C00A888ADF82200E888A7 +:104BE000ADF82800ADF82E60ADF8346068460AF0E4 +:104BF000BDF8E8B998F818004546112801D00820FA +:104C0000ADE706200BF084FE38B12078C0F3C10078 +:104C1000012804D0032802D004E012209FE795F871 +:104C2000240028B1FEF730FA022803D2132096E7B9 +:104C3000072094E7504600F00CF900288FD185F842 +:104C400019A068460AF051FA04F010FA002886D13B +:104C5000687E00F00EF9E08864280AD248B101208D +:104C600000F047F9040091D11220FEF7F7F9204631 +:104C700075E76421B0FBF1F0F2E770B50646154622 +:104C80000C4608460FF070FB18B928460FF06CFB75 +:104C900008B1102007E72A46214630460AF0A9FE4F +:104CA00004F0E4F90028F5D121787F29F2D105201C +:104CB000F9E67CB505460C4608460FF02FFB08B117 +:104CC00010207CBD2846FEF7C6FB20B100782228C4 +:104CD00004D208207CBD43F202007CBD6B4890F8F2 +:104CE0003000400701D511207CBD2178C80802D1D1 +:104CF0006078C20801D007207CBD890801D18008F6 +:104D000001D006207CBDADF8005020788DF802005F +:104D100060788DF803000220ADF80400684609F0C1 +:104D200042FF04F0A3F97CBD70B586B014460D4671 +:104D30000646FEF790FB28B10078222805D208200D +:104D400006B0B0E643F20200FAE728460FF033FB64 +:104D500020B944B120460FF025FB08B11020EFE741 +:104D600000202060A080494890F83000800701D5DD +:104D70001120E5E703A9304609F0BDFD18B100BFD9 +:104D800004F074F9DCE7ADF80060BDF81400ADF88C +:104D90000200BDF81600ADF80400BDF81000BDF823 +:104DA0001210ADF80600ADF808107DB1298809B1E0 +:104DB000ADF80610698809B1ADF80210A98809B1EB +:104DC000ADF80810E98809B1ADF80410DCB1BDF800 +:104DD0000610814201D9081A2080BDF80210BDF8E2 +:104DE0001400814201D9081A6080BDF80800BDF89E +:104DF0000410BDF816200144BDF812001044814291 +:104E000001D9081AA080684609F0AAFEB8E71CB5C7 +:104E10001F490968CDE90010684609F0AAFF04F0AF +:104E200025F91CBD1CB5002000900190684609F0D2 +:104E3000A0FF04F01BF91CBD108008885080488832 +:104E40009080C88810818888D0800020508190810F +:104E5000704710B5044604F075F830B1407830B1B1 +:104E6000204604F07EFB002010BD052010BD12205E +:104E700010BD10B504F066F8040000D1FFDF6078C3 +:104E800000B9FFDF6078401E607010BDD8010020BF +:104E90009C46020010B504F055F8040000D1FFDF75 +:104EA0006078401C6070F0E71CB5ADF800008DF82C +:104EB00002308DF803108DF8042068460AF05EFD7C +:104EC00004F0D4F81CBD0CB52DA2D2E90012CDE936 +:104ED00000120079694601EB501000780CBD027891 +:104EE000520804D0012A02D043F202207047FEF794 +:104EF00029BA10B548B183000022114605200FF0F1 +:104F000017F9052801D00320BFE70020BDE71FB532 +:104F10006A46FFF791FF68460AF04CF904F0A6F8DC +:104F200004B0B2E770B50C0006460DD0FEF793FA58 +:104F3000050000D1FFDFA6802889208128896081B3 +:104F40006889A081A889E081ADE510B500231A46E3 +:104F500003E0845C2343521CD2B28A42F9D30BB1E2 +:104F6000002092E7012090E700B530B1012803D07E +:104F7000022801D0FFDF002000BDFF2000BD00009F +:104F8000070605040302010010B504460FF0C6F938 +:104F900008B1102010BD2078C0F30210042807D8F3 +:104FA0006078072804D3A178102901D8814201D262 +:104FB000072010BDE078410706D421794A0703D4C1 +:104FC000000701D4080701D5062010BD002010BD40 +:104FD00010B513785C08837F64F3C7138377137865 +:104FE0009C08C37F64F30003C3771078C309487833 +:104FF00063F34100487013781C090B7864F347137E +:105000000B701378DB0863F3000048705078487128 +:1050100010BD10B5C4780B7864F300030B70C4782E +:10502000640864F341030B70C478A40864F382033A +:105030000B70C478E40864F3C3030B700379117830 +:1050400063F30001117003795B0863F34101117090 +:1050500003799B0863F3820111700079C00860F343 +:10506000C301117010BD70B514460D46064604F01C +:10507000D1F980B10178182221F00F01891C21F0AB +:10508000F001A03100F8081B21461FF0D6F8BDE85A +:10509000704004F0C2B929463046BDE87040132282 +:1050A000FEF7DCB92DE9F047064608A8894690E8E6 +:1050B00030041F469046142128461FF01AF900219B +:1050C000CAF80010B8F1000F03D0B9F1000F03D1F6 +:1050D00014E03878C00711D020680FF045F9C0BB44 +:1050E000B8F1000F07D12068123028602068143012 +:1050F00068602068A8602168CAF8001038788007C6 +:1051000024D560680FF04EF918BBB9F1000F21D01B +:10511000FFF770F90168C6F868118188A6F86C116C +:10512000807986F86E0101F002FDF94FEF60626848 +:1051300062B196F8680106F2691140081032FEF774 +:1051400059F91022394660681FF032F80020BDE896 +:10515000F08706E0606820B1E8606068C6F8640126 +:10516000F4E71020F3E730B5054608780C4620F048 +:105170000F00401C20F0F001103121700020607001 +:1051800095F8230030B104280FD0052811D0062847 +:1051900014D0FFDF20780121B1EB101F04D295F865 +:1051A000200000F01F00607030BD21F0F0002030C2 +:1051B00002E021F0F00030302070EBE721F0F00049 +:1051C0004030F9E7F0B591B0022715460C46064687 +:1051D0003A46ADF80870092103AB04F07AFF049059 +:1051E000002810D004208DF804008DF80170E03400 +:1051F000099605948DF818500AA968460DF0CAF86A +:1052000000B1FFDF012011B0F0BD10B588B00C4631 +:105210000A99ADF80000C3B11868CDF802005868CB +:10522000CDF80600ADF80A20102203A81EF0C0FF3A +:1052300068460AF062F803F019FF002803D1A17F45 +:1052400041F01001A17708B010BD0020CDF8020098 +:10525000E6E72DE9F84F0646808A0D4680B2824681 +:10526000FEF7F9F804463078DFF8A48200274FF003 +:105270000509A8F120080F2870D2DFE800F06FF2CE +:105280003708387D8CC8F1F0EFF35FF3F300A07FAF +:1052900000F00300022809D05FF0000080F0010157 +:1052A00050460BF085FB050003D101E00120F5E736 +:1052B000FFDF98F85C10C90702D0D8F860000BE057 +:1052C000032105F11D000EF004FDD5F81D009149E4 +:1052D000B0FBF1F201FB1200C5F81D0070686867B1 +:1052E000B068A8672078252800D0FFDFCAE0A07F3B +:1052F00000F00300022809D05FF0000080F00101F7 +:1053000050460BF055FB060003D101E00120F5E704 +:10531000FFDF3078810702D52178252904D040F0BD +:1053200001003070BDE8F88F02202870307F2871AE +:1053300006F11D002D36C5E90206F3E7A07F00F057 +:105340000300022808D0002080F0010150460BF035 +:105350002FFB040004D102E00120F5E7A7E1FFDF05 +:105360002078C10604D5072028703D346C60D9E749 +:1053700040F008002070D5E7E07F000700D5FFDF90 +:10538000307CB28800F0010301B05046BDE8F04F18 +:10539000092105F027BD04B9FFDF716821B1102292 +:1053A00004F124001EF004FF28212046FDF7B2FE80 +:1053B000A07F00F0030002280ED104F12400002396 +:1053C00000901A4621465046FFF71FFF112807D0CC +:1053D00029212046FDF79EFE307A84F82000A1E7BF +:1053E000A07F000700D5FFDF14F81E0F40F0080073 +:1053F0002070E782A761E761C109607861F341002D +:10540000014660F382016170307AE0708AE7A07F24 +:1054100000F00300022809D05FF0000080F00101D5 +:1054200050460BF0C5FA040003D101E00120F5E776 +:10543000FFDF022104F185000EF04BFC04202870F0 +:1054400004F5B4706860B4F88500288230481038DC +:105450007C346C61C5E9028064E703E024E15BE031 +:105460002DE015E0A07F00F00300022807D0002007 +:1054700080F0010150460BF09BFA18B901E00120C1 +:10548000F6E7FFDF324621465046BDE8F84FEAE531 +:1054900004B9FFDF20782128A1D93079012803D170 +:1054A000E07F40F00800E077324621465046FFF7A3 +:1054B000DAFD2046BDE8F84F2321FDF72BBE3279F7 +:1054C000AA8005F108030921504604F002FEE860B5 +:1054D00010B185F8009025E7A07F00F003000228B6 +:1054E00008D0002080F0010150460BF061FA040062 +:1054F00003D101E00120F5E7FFDF04F1620102239F +:105500001022081F0BF0DBF807703179417009E7B2 +:105510003802002040420F00A07F00F00300022864 +:1055200008D0002080F0010150460BF041FA050040 +:1055300003D101E00120F5E7FFDF95F8840000F0DA +:10554000030001287AD1A07F00F00307E07F10F06C +:10555000010602D0022F04D133E095F8A000C00765 +:105560002BD0D5F8601121B395F88320087C62F325 +:1055700087000874A17FCA09D5F8601162F3410061 +:105580000874D5F8601166F300000874AEB1D5F860 +:105590006001102204F1240188351EF009FE287EE6 +:1055A00040F001002876287820F0010005F88809ED +:1055B00000E016B1022F04D02DE095F88800C00756 +:1055C00027D0D5F85C1121B395F88320087C62F3CD +:1055D00087000874A17FCA09D5F85C1162F3410005 +:1055E0000874D5F85C1166F3000008748EB1D5F824 +:1055F0005C01102204F1240188351EF0D9FD2878C1 +:1056000040F0010005F8180B287820F0010005F89B +:10561000A009022F44D0002000EB400005EBC000A1 +:1056200090F88800800709D595F87C00D5F86421AA +:10563000400805F17D011032FDF7DCFE8DF8009089 +:1056400095F884006A4600F003008DF8010095F893 +:1056500088108DF8021095F8A0008DF803002146FF +:10566000504601F04DFA2078252805D0212807D092 +:10567000FFDF2078222803D922212046FDF74AFDAA +:10568000A07F00F0030002280CD0002080F0010170 +:1056900050460BF09FF900283FF44FAEFFDF41E684 +:1056A0000120B9E70120F1E7706847703AE6FFDFB3 +:1056B00038E670B5FE4C002584F85C5025660CF089 +:1056C00036FE04F11001204603F060FE84F83050ED +:1056D00070BD70B50D46FDF7BEFE040000D1FFDFC2 +:1056E0004FF4B87128461EF004FE04F1240028612E +:1056F000A07F00F00300022808D0012105F1E0009E +:105700000CF016FE002800D0FFDF70BD0221F5E787 +:105710000A46014602F1E0000CF02ABE70B50546CB +:10572000406886B001780A2906D00D2933D00E29A9 +:105730002FD0FFDF06B070BD86883046FDF78BFEA8 +:10574000040000D1FFDF20782128F3D028281BD1C6 +:10575000686802210E3001F0C8F9A8B16868082114 +:10576000801D01F0C2F978B104F1240130460AF03D +:10577000A2F803F07BFC00B1FFDF06B02046BDE8D5 +:1057800070402921FDF7C6BC06B0BDE8704003F0AB +:1057900044BE012101726868C6883046FDF75BFE91 +:1057A000040000D1FFDFA07F00F00301022902D135 +:1057B00020F01000A077207821280AD06868017AAC +:1057C00009B1007980B1A07F00F00300022862D007 +:1057D000FFDFA07F00F003000228ABD1FEF798F8AE +:1057E0000028A7D0FFDFA5E703F017FEA17F08067A +:1057F0002BD5E07FC00705D094F8200000F01F00F3 +:10580000102820D05FF0050084F823002078292894 +:105810001DD02428DDD1314604200EF033FD222195 +:105820002046FDF777FCA07F00F00300022830D06F +:105830005FF0000080F0010130460BF0CBF800284B +:10584000C7D0FFDFC5E70620DEE70420DCE701F074 +:105850000300022808D0002080F0010130460BF040 +:10586000A7F8050003D101E00120F5E7FFDF2521BE +:105870002046FDF74FFC03208DF80000694605F136 +:10588000E0000CF06CFD0228A3D00028A1D0FFDFBF +:105890009FE70120CEE703F0C0FD9AE72DE9F04332 +:1058A00087B09946164688460746FDF7D4FD0400A2 +:1058B0004BD02078222848D3232846D0E07F000709 +:1058C00043D4A07F00F00300022809D05FF000005D +:1058D00080F0010138460BF06BF8050002D00CE0B7 +:1058E0000120F5E7A07F00F00300022805D0012188 +:1058F000002238460BF053F805466946284601F069 +:1059000026F9009800B9FFDF45B10098E035056140 +:105910002078222806D0242804D007E0009900200F +:10592000086103E025212046FDF7F4FB00980121E2 +:1059300041704762868001A9C0E902890CF02AFD06 +:10594000022802D0002800D0FFDF07B0BDE8F083B6 +:1059500070B586B00546FDF77EFD017822291ED977 +:10596000807F00F00300022808D0002080F00101B1 +:1059700028460BF01DF804002FD101E00120F5E7C7 +:10598000FFDF2AE0B4F85E0004F1620630440178DB +:10599000427829B121462846FFF714FCB0B9C9E680 +:1059A000ADF804200921284602AB04F092FB0390D5 +:1059B0000028F4D005208DF80000694604F1E000CD +:1059C0000CF0CDFC022801D000B1FFDF0223102231 +:1059D000314604F15E000AF0A8FEB4F86000002829 +:1059E000D0D1A7E610B586B00446FDF734FD0178A6 +:1059F00022291BD9807F00F00300022808D0002054 +:105A000080F0010120460AF0D3FF040003D101E039 +:105A10000120F5E7FFDF06208DF80000694604F15C +:105A2000E0000CF09CFC002800D0FFDF06B010BDA9 +:105A30002DE9F05F05460C460027007890460109E5 +:105A40003E4604F1080BBA4602297DD0072902D050 +:105A50000A2909D146E0686801780A2905D00D298C +:105A600030D00E292ED0FFDFBCE114271C26002CDD +:105A70006BD08088A080FDF7EEFC5FEA000900D1C2 +:105A8000FFDF99F817005A46400809F11801FDF7A1 +:105A9000B1FC6868C0892082696851F8060FC4F8B3 +:105AA00012004868C4F81600A07E20F0060001E04D +:105AB0001802002040F00100A07699F81E0040F086 +:105AC00020014DE01A270A26002CD1D0C088A080E2 +:105AD000FDF7C1FC050000D1FFDF59462846FFF75E +:105AE00042FB7FE10CB1A88BA080287A0B287DD0E7 +:105AF00006DC01287BD0022808D0032804D135E039 +:105B00000D2875D00E2874D0FFDF6BE11E27092603 +:105B1000002CADD0A088FDF79EFC5FEA000900D103 +:105B2000FFDF287B00F003000128207A1BD020F043 +:105B300001002072297B890861F341002072297BD2 +:105B4000C90861F3820001E041E1F2E02072297BA3 +:105B5000090961F3C300207299F81E0040F040016A +:105B600089F81E103EE140F00100E2E713270D2600 +:105B7000002CAAD0A088FDF76EFC8146807F00F043 +:105B80000300022808D0002080F00101A0880AF05C +:105B90000FFF050003D101E00120F5E7FFDF99F8D1 +:105BA0001E0000F00302022A50D0686F817801F0D5 +:105BB00003010129217A4BD021F001012172837860 +:105BC0009B0863F3410121728378DB0863F3820150 +:105BD000217283781B0963F3C3012172037863F395 +:105BE00006112172437863F3C71103E061E0A9E075 +:105BF00090E0A1E0217284F809A0C178A172022A84 +:105C000029D00279E17A62F30001E1720279520847 +:105C100062F34101E1720279920862F38201E1725A +:105C20000279D20862F3C301E1724279217B62F307 +:105C3000000121734279520862F3410121734279D4 +:105C4000920862F382012173407928E0A86FADE7E2 +:105C500041F00101B2E74279E17A62F30001E172B9 +:105C60004279520862F34101E1724279920862F38B +:105C70008201E1724279D20862F3C301E1720279D2 +:105C8000217B62F3000121730279520862F3410122 +:105C900021730279920862F3820121730079C008AE +:105CA00060F3C301217399F80000232831D926211C +:105CB00040E018271026E4B3A088FDF7CCFB83460C +:105CC000807F00F00300022809D0002080F001014D +:105CD000A0880AF06DFE5FEA000903D101E001200F +:105CE000F4E7FFDFE868A06099F8000040F00401E5 +:105CF00089F8001099F80100800708D50120207369 +:105D00009BF8000023286DD92721584651E084F8DC +:105D10000CA067E015270F265CB1A088FDF79BFB60 +:105D2000814606225946E86808F059F90120A07317 +:105D3000A2E041E048463CE016270926E4B3287B70 +:105D400020724FE0287B19270E26ACB3C4F808A0B8 +:105D5000A4F80CA0012807D0022805D0032805D0FC +:105D6000042803D0FFDF0DE0207207E0697B0428E0 +:105D700001F00F0141F0800121721ED0607A20F005 +:105D800003006072A088FDF766FB054600782128B5 +:105D900028D0232800D0FFDFA87F00F003000228CE +:105DA00013D0002080F00101A0880AF013FE222108 +:105DB0002846FDF7AFF915E004E0607A20F0030013 +:105DC000401CDEE7A8F8006011E00120EAE70CB112 +:105DD0006888A080287A03282ED004280AD00528B5 +:105DE00050D0FFDFA8F800600CB12780668000204B +:105DF000BDE8F09F15270F26002CE3D0A088FDF703 +:105E00002AFB807F00F00300022809D05FF0000029 +:105E100080F00101A0880AF0CBFD050003D101E06C +:105E20000120F5E7FFDFD5F81D000622594608F0EE +:105E3000D6F884F80EA0D5E717270926002CC1D084 +:105E4000A088FDF708FB8146807F00F00300022850 +:105E500008D0002080F00101A0880AF0A9FD05000B +:105E600003D101E00120F5E7FFDF6878800701D565 +:105E7000022000E00120207299F800002328B1D907 +:105E8000272157E719270E26002C9BD0A088FDF765 +:105E9000E2FA5FEA000900D1FFDFC4F808A0A4F825 +:105EA0000CA084F808A0A07A40F00300A07299F832 +:105EB0001E10C90961F38200A07299F81F2099F899 +:105EC0001E1012EAD11F05D099F8201001F01F0111 +:105ED00010292BD020F00800A07299F81F10607ACA +:105EE00061F3C3006072697A01F003010129A2D154 +:105EF00040F00400607299F81E0000F003000228D0 +:105F0000E87A16D0217B60F300012173AA7A607BC6 +:105F100062F300006073EA7A520862F34101217370 +:105F2000A97A490861F3410060735BE740F008001B +:105F3000D2E7617B60F300016173AA7A207B62F390 +:105F400000002073EA7A520862F341016173A97A72 +:105F5000490861F34100207344E710B5FE4C30B1AD +:105F60000146102204F120001EF022F9012084F8DD +:105F7000300010BD10B5044600F0D9FDF6492046AA +:105F80001022BDE8104020311EF012B970B5F24D5C +:105F900006004FF0000413D00EF0C0F908B1102431 +:105FA0000CE00621304608F001F8411C05D02866B7 +:105FB0005FF0010085F85C0000E00724204670BD1A +:105FC0000020F7E7007810F00F0204D0012A05D076 +:105FD000022A0CD110E0000909D10AE000090128C9 +:105FE00007D0022805D0032803D0042801D00720B9 +:105FF00070470870002070470620704705282AD295 +:10600000DFE800F003070F171F00087820F0FF00FB +:106010001EE0087820F00F00401C20F0F000103047 +:1060200016E0087820F00F00401C20F0F00020302F +:106030000EE0087820F00F00401C20F0F000303017 +:1060400006E0087820F00F00401C20F0F0004030FF +:10605000087000207047072070472DE9F041804606 +:1060600088B00D46002708460EF0A5F9A8B94046AD +:10607000FDF7F1F9040003D02078222815D104E0BF +:1060800043F2020008B0BDE8F08145B9A07F4106A7 +:1060900003D500F00300022801D01020F2E7A07F12 +:1060A000C10601D4010702D50DB10820EAE7E17F5E +:1060B000090701D50D20E5E700F00300022805D10E +:1060C00025B12846FEF760FF0700DBD1A07F00F076 +:1060D0000300022808D0002080F0010140460AF0A9 +:1060E00067FC060002D00FE00120F5E7A07F00F07A +:1060F000030002280ED0002080F00101002240465B +:106100000AF04DFC060007D0A07F00F00300022833 +:1061100004D009E00120EFE70420B3E725B12A46C7 +:1061200031462046FEF754FF6946304600F00FFD29 +:10613000009800B9FFDF0099022006F1E0024870E4 +:10614000C1F824804A6100220A81A27F02F0030282 +:10615000022A1CD001200871287800F00102087E74 +:1061600062F3010008762A78520862F3820008760A +:106170002A78920862F3C30008762A78D20862F37C +:106180000410087624212046FCF7C4FF33E035B321 +:106190000871301D88613078400908777078C0F345 +:1061A00040004877287800F00102887F62F3010000 +:1061B0008877A27FD20962F382008877E27F62F358 +:1061C000C3008877727862F304108877A878C8775C +:1061D00001F1210228462031FEF71BFF03E00320D6 +:1061E00008710520087625212046FCF793FFA07F43 +:1061F00020F04000A07701A900980CF0CBF802280D +:1062000001D000B1FFDF38463CE72DE9FF4F534A8C +:106210000D4699B09A4607CA0BAB002783E80700E2 +:106220001998FDF718F9060006D03078262806D010 +:1062300008201DB0BDE8F08F43F20200F9E7B07FFF +:1062400000F00309B9F1020F03D00020284302D067 +:1062500006E00120FAE71B98FEF796FE0028E8D139 +:10626000B07F00F00300022801D11B9979BB0228FE +:1062700008D0002080F0010119980AF099FB040071 +:1062800003D101E00120F5E7FFDF852D28D007DCF1 +:10629000F5B1812D1ED0822D1ED0832D08D11DE099 +:1062A000862D1FD0882D1FD0892D1FD08A2D1FD05D +:1062B0000F2020710F281DD003F0ACF8E0B10120B1 +:1062C0008DF84000201D11902079B8B167E111E0F0 +:1062D0000020EEE70120ECE70220EAE70320E8E7F0 +:1062E0000520E6E70620E4E70820E2E70920E0E7EA +:1062F0000A20DEE707209CE711209AE7B9F1020F98 +:1063000003D0A56F03D1A06F02E0656FFAE7606F5D +:10631000804632D04FF0010000904FF00200019013 +:10632000214630461B9AFEF753FE1B98007800F07A +:106330000101A87861F30100A870B17FC90961F378 +:106340008200A870F17F61F3C300A870617861F3E7 +:106350000410A870207803E018020020A446020070 +:10636000400928706078C0F3400068701B988078FE +:10637000E87000206871287103E00220009001207D +:106380000190A87898F80210C0F3C000C1F3C001D2 +:1063900008405FEA000B2CD050460DF0BFFF90BBC9 +:1063A000DAF80C000DF0BAFF68BBDAF81C000DF04B +:1063B000B5FF40BBDAF80C00A060DAF81C00E06022 +:1063C00098F80100617800F0010041EA4000607037 +:1063D00098F80210C0B2C1F30011891E0840607025 +:1063E00000202077019906F1170002290CD0012125 +:1063F0000BE098F80110607801F00101FD2242EAFB +:1064000041010840E3E732E0002104EB81014861EB +:106410000099701C022901D0012100E0002104EB49 +:1064200081014861A87800F00300012858D198F84C +:10643000020000F00300012852D1B9F1020F04D08C +:106440002A1D691D1B98FEF7E4FD297998F80400C0 +:1064500001408DF83810687998F8052010408DF8C3 +:106460003C0001433CD050460DF058FF08B11020CD +:10647000DFE60AF110010491B9F1020F18D00846C5 +:106480005FF0000104F18C03CDE9000304F5AE7266 +:1064900002920EAB5A462046FEF704FE0028E7D1D2 +:1064A000B9F1020F08D0504608D14FF0010107E0C2 +:1064B00050464FF00101E5E70498F5E74FF0000181 +:1064C00004F1A403CDE9000304F5B072029281F057 +:1064D00001010FAB5A462046FEF7E4FD0028C7D164 +:1064E0006078800734D4A87898F80210C0F3800050 +:1064F000C1F3800108432BD0297898F800000BAA3B +:10650000B9F1020F06D032F811204300DA4002F050 +:1065100003070AE032F810204B00DA4012F00307BC +:1065200005D0012F0BD0022F0BD0032F07D0BBF1CA +:10653000000F0DD0012906D0042904D008E002275D +:10654000F5E70127F3E7012801D0042800D104274B +:10655000B07F40F08000B077F17F6BF30001F177FE +:10656000607881074FF003000CD5A071BBF1000FDC +:1065700015D100BF8DF85C0017AA3146199800F0BC +:10658000BFFA0CE00221022F18D0012F18D0042FDF +:1065900022D00020A071B07F20F08000B0772521AC +:1065A0003046FCF7B7FD10A904F1E0000BF0D7FE70 +:1065B00010B1022800D0FFDF00203AE6A171D9E730 +:1065C000A1710D2104F120001DF093FE207840F010 +:1065D000020020700420CDE70120A071DFE72DE943 +:1065E000F04387B09046894604460025FCF733FF08 +:1065F000060006D03078272806D0082007B0BDE86E +:10660000F08343F20200F9E7B07F00F003000228B4 +:1066100008D0002080F0010120460AF0C9F90400EA +:1066200003D101E00120F5E7FFDFA7795FEA090068 +:1066300005D0012821D0B9F1020F26D110E0B8F120 +:10664000000F22D1012F05D0022F05D0032F05D036 +:10665000FFDF2DE00C252BE0012529E0022527E0B6 +:1066600040460DF05BFEB0B9032F0ED1102241461B +:1066700004F11D001DF09CFD1AE0012F02D0022F35 +:1066800003D104E0B8F1000F12D00720B6E740466E +:106690000DF044FE08B11020B0E7102104F11D00F8 +:1066A0001DF005FE0621404607F080FCC4F81D00E1 +:1066B0002078252140F0020020703046FCF72AFDAA +:1066C0002078C10713D020F00100207002208DF83F +:1066D000000004F11D0002908DF804506946C3309B +:1066E0000BF03DFE022803D010B1FFDF00E025775C +:1066F000002083E730B587B00D460446FCF7ABFEBB +:10670000A0B1807F00F00300022812D05FF00000EB +:1067100080F0010120460AF04BF904000ED0284613 +:106720000DF0FCFD38B1102007B030BD43F202007F +:10673000FAE70120ECE72078400701D40820F3E7CE +:10674000294604F13D00202205461DF031FD207848 +:1067500040F01000207001070FD520F008002070D5 +:1067600007208DF80000694604F1E00001950BF068 +:10677000F6FD022801D000B1FFDF0020D4E770B59C +:106780000D460646FCF767FE18B10178272921D18E +:1067900002E043F2020070BD807F00F00300022897 +:1067A00008D0002080F0010130460AF001F9040011 +:1067B00003D101E00120F5E7FFDFA079022809D12C +:1067C0006078C00706D02A4621463046FEF7FAFC1C +:1067D00010B10FE0082070BDB4F860000E280BD295 +:1067E00004F1620102231022081F09F068FF012151 +:1067F00001704570002070BD112070BD70B5064657 +:1068000014460D4608460DF089FD18B920460DF0D6 +:10681000ABFD08B1102070BDA6F57F40FF380ED04B +:106820003046FCF718FE38B1417822464B08811CEF +:106830001846FCF7DFFD07E043F2020070BD20467A +:10684000FDF73EFE0028F9D11021E01D0DF041FAC0 +:10685000E21D294604F1170000F089F9002070BDFF +:106860002DE9F04104468AB01546884600270846BF +:106870000DF0A1FD18B928460DF09DFD18B11020AE +:106880000AB0BDE8F0812046FCF7E5FD060003D024 +:10689000307827281BD102E043F20200F0E7B07FF6 +:1068A00000F00300022809D05FF0000080F0010131 +:1068B00020460AF07DF8040003D101E00120F5E74D +:1068C000FFDF2078400702D56078800701D40820D8 +:1068D000D6E7B07F00F00300022803D0A06F03D1F9 +:1068E000A16F02E0606FFAE7616F407800B19DB17F +:1068F000487810B1B8F1000F0ED0ADB1EA1D06A86E +:10690000E16800F034F9102206A905F117001DF026 +:1069100023FC18B1042707E00720B1E71022E91D86 +:1069200004F12D001DF044FCB8F1000F06D0102238 +:1069300008F1070104F11D001DF03AFC2078252123 +:1069400040F0020020703046FCF7E4FB2078C107DD +:1069500015D020F00100207002208DF8000004F115 +:106960001D000290103003908DF804706946B3301A +:106970000BF0F5FC022803D010B1FFDF00E0277711 +:1069800000207DE7F8B515460E460746FCF763FD87 +:10699000040004D02078222804D00820F8BD43F257 +:1069A0000200F8BDA07F00F00300022802D043F2ED +:1069B0000500F8BD30460DF0B1FC18B928460DF0C1 +:1069C000ADFC08B11020F8BD00953288B31C2146FB +:1069D0003846FEF71AFC112815D00028F3D1297C7F +:1069E0004A08A17F62F3C711A177297CE27F61F396 +:1069F0000002E277297C890884F82010A17F21F029 +:106A00004001A177F8BDA17F0907FBD4D6F80200A9 +:106A1000C4F83600D6F80600C4F83A003088A086DC +:106A20001022294604F124001DF0C2FB287C4108F5 +:106A3000E07F61F34100E077297C61F38200E07739 +:106A4000287C800884F82100A07F40F00800A0770F +:106A50000020D3E770B50D4606460BB1072070BD88 +:106A6000FCF7F9FC040007D02078222802D3A07F8D +:106A7000800604D4082070BD43F2020070BDADB1A1 +:106A80002946304608F017FF02F0F0FA297C4A0840 +:106A9000A17F62F3C711A177297CE27F61F3000235 +:106AA000E277297C890884F8201004E0304608F059 +:106AB0002AFF02F0DBFAA17F21F02001A17770BD4F +:106AC00070B50D46FCF7C7FC040005D028460DF054 +:106AD0004BFC20B1102070BD43F2020070BD29466E +:106AE0002046FEF740FB002070BD04E010F8012BAB +:106AF0000AB100207047491E89B2F7D201207047C1 +:106B000070B51546064602F085FC040000D1FFDF93 +:106B1000207820F00F00801C20F0F0002030207042 +:106B200066802868A060BDE8704002F076BC10B5B1 +:106B3000134C94F83000002808D104F12001A1F191 +:106B400010000BF04EFC012084F8300010BD10B195 +:106B500090F8B9202AB10A4890F8350018B1002001 +:106B600003E0B83001E0064834300860704708B5EB +:106B70000023009313460A460AF015F908BD0000E9 +:106B80001802002018B18178012938D101E01020C5 +:106B90007047018842F60112881A914231D018DC00 +:106BA00042F60102A1EB020091422AD00CDC41B373 +:106BB000B1F5C05F25D06FF4C050081821D0A0F502 +:106BC0007060FF381BD11CE001281AD002280AD1BE +:106BD00017E0B0F5807F14D008DC012811D002281E +:106BE0000FD003280DD0FF2809D10AE0B0F5817F2E +:106BF00007D0A0F58070033803D0012801D0002011 +:106C000070470F2070470A281ED007DC18D2DFE833 +:106C100000F0191B1F1F171F231D1F21102815D03F +:106C200008DC0B2812D00C2810D00D2816D00F2805 +:106C300006D10DE011280BD084280BD087280FD067 +:106C400003207047002070470520704707207047D9 +:106C50000F20704704207047062070470C207047B3 +:106C600043F20200704738B50C46050041D0694632 +:106C7000FFF7A8F9002819D19DF80010607861F39A +:106C8000020060706946681CFFF79CF900280DD16E +:106C90009DF80010607861F3C5006070A978C1F3B9 +:106CA0004101012903D0022905D0072038BD2178F0 +:106CB00021F0200102E0217841F0200121704107FC +:106CC00004D0A978C90861F386106070607810F06C +:106CD000380F07D0A978090961F3C710607010F068 +:106CE000380F02D16078400603D5207840F040008C +:106CF0002070002038BD70B504460020088015467D +:106D00006068FFF7B0FF002816D12089A18988426A +:106D100011D860688078C0070AD0B1F5007F0AD822 +:106D200040F20120B1FBF0F200FB1210288007E0D6 +:106D3000B1F5FF7F01D90C2070BD01F2012129803E +:106D4000002070BD10B50478137864F3000313704D +:106D50000478640864F3410313700478A40864F3AE +:106D6000820313700478E40864F3C3031370047897 +:106D7000240964F3041313700478640964F345135D +:106D800013700078800960F38613137031B10878AE +:106D9000C10701D1800701D5012000E0002060F388 +:106DA000C713137010BD4278530702D002F00703D7 +:106DB00006E012F0380F02D0C2F3C20300E0012354 +:106DC0004A7863F302024A70407810F0380F02D01C +:106DD000C0F3C20005E0430702D000F0070000E066 +:106DE000012060F3C5024A7070472DE9F04F95B05D +:106DF0000D00824612D0122128461DF058FA4FF697 +:106E0000FF7B05AA0121584606F01BFF00242646F9 +:106E100037464FF420586FF4205972E0102015B017 +:106E2000BDE8F08F9DF81E0001280AD1BDF81C10A6 +:106E300041450BD011EB09000AD001280CD00228E3 +:106E40000CD0042C0ED0052C0FD10DE0012400E055 +:106E50000224BDF81A6008E0032406E00424BDF80B +:106E60001A7002E0052400E00624BDF81A1051450E +:106E700047D12C74BEB34FF0000810AA4FF0070A98 +:106E8000CDE90282CDE900A80DF13C091023CDF82F +:106E9000109042463146584606F086FF08BBBDF8C2 +:106EA0003C002A46C0B210A90BF004FBC8B9AE8161 +:106EB000CFB1CDE900A80DF1080C0AAE40468CE830 +:106EC0004102132300223946584606F06DFF40B9AF +:106ED000BDF83C00F11CC01EC0B22A1D0BF0EAFA3E +:106EE00010B103209BE70AE0BDF82900E881062CD9 +:106EF00005D19DF81E00A872BDF81C002881002055 +:106F00008DE705A806F0A9FE00288BD0FFF77BFED1 +:106F100085E72DE9F0471C46DDE90978DDF820908A +:106F200015460E00824600D1FFDF0CB1208818B153 +:106F3000D5B11120BDE8F087022D01D0012100E07C +:106F4000002106F1140005F06BFDA8F800000246D0 +:106F50003B462946504603F0BCF8C9F8000008B982 +:106F6000A41C3C600020E5E71320E3E7F0B41446DE +:106F7000DDE904528DB1002314B1022C09D101E0E6 +:106F8000012306E00D7CEE0703D025F00105012367 +:106F90000D742146F0BC03F025BF1A80F0BC704789 +:106FA0002DE9FE4F91461A881C468A468046FAB162 +:106FB00002AB494603F08DF8050019D04046A61CE7 +:106FC000278809F039FE3246072629463B460096B7 +:106FD00009F047FA20882346CDE900504A46514639 +:106FE0004046FFF7C3FF002020800120BDE8FE8F50 +:106FF0000020FBE72DE9F04786B09146DDE90E461B +:107000000F46824603AA05A904A8109D8DE8070033 +:107010009846324621465046FFF77BFF049909B156 +:10702000012200E000222A70002818D1F94A03AB9F +:107030001060059A009104F11400CDE901204A4640 +:107040003946504606F0A3F8A8B1092811D2DFE866 +:1070500000F005080510100A0C0C0E00002006B008 +:1070600068E71120FBE70720F9E70820F7E70D2084 +:10707000F5E70320F3E7BDF80C100498CDE9000113 +:107080004346324621465046FFF770FFE6E72DE9BA +:10709000F04389B00D46DDE9108781461C4616464F +:1070A000142103A81DF025F9012002218DF81010EC +:1070B0008DF80C008DF81170ADF8146064B1A278F1 +:1070C000D20709D08DF81600E088ADF81A00A08824 +:1070D000ADF81800A068079008A80095CDE9011048 +:1070E000424603A948466B68FFF784FF09B0BDE834 +:1070F000F083F0B58BB0002406460694079407276A +:10710000089405A80994019400970294CDE90340DE +:107110000D4610232246304606F046FE78B90AA8EE +:1071200006A9019400970294CDE90310BDF814302C +:1071300000222946304606F00DFC002801D0FFF75A +:1071400062FD0BB0F0BD06F0ADBA2DE9FC410C4676 +:107150008046002602F05EF9054620780D287DD293 +:10716000DFE800F0BC0713B325BD49496383AF9541 +:107170009B00A848006820B1417841F0100141709F +:10718000ADE0404602F076F9A9E00421404609F05E +:107190000FFC070000D1FFDF07F11401404605F0A6 +:1071A000D3FBA5BB13214046FDF748FC97E0042123 +:1071B000404609F0FDFB070000D1FFDFE088ADF895 +:1071C00000000020B8819DF80000010704D5C0062A +:1071D00002D5A088B88105E09DF8010040067ED563 +:1071E000A088F88105B9FFDF22462946404601F014 +:1071F00063FC022673E0E188ADF800109DF80110F1 +:1072000009060FD5072803D006280AD00AE024E093 +:107210000421404609F0CCFB060000D1FFDFA08826 +:10722000F0810226CDB9FFDF17E00421404609F0C6 +:10723000BFFB070000D1FFDF07F1140006F069FA79 +:1072400090F0010F02D1E079000648D5387C022683 +:1072500040F00200387405B9FFDF00E03EE022464E +:107260002946404601F028FC39E00421404609F057 +:107270009FFB017C002D01F00206C1F3400161710A +:10728000017C21F002010174E7D1FFDFE5E702266E +:107290000121404602F020F921E00421404609F096 +:1072A00087FB0546606800902089ADF80400012244 +:1072B0006946404602F031F9287C20F0020028742B +:1072C0000DE0002DC9D1FFDFC7E7022600214046AF +:1072D000FBF788F8002DC0D1FFDFBEE7FFDF3046A7 +:1072E000BDE8FC813EB50C0009D001466B4601AA01 +:1072F000002006F0DBFD20B1FFF785FC3EBD10202D +:107300003EBD00202080A0709DF8050002A900F07D +:107310000700FEF773FE50B99DF8080020709DF835 +:10732000050002A9C0F3C200FEF768FE08B1032001 +:107330003EBD9DF8080060709DF80500C109A07869 +:1073400061F30410A0709DF80510890961F3C30072 +:10735000A0709DF80410890601D5022100E00121EA +:1073600061F342009DF8001061F30000A07000205E +:107370003EBD70B5144606460D4651EA040005D0E0 +:1073800075B108460DF00EF878B901E0072070BD20 +:107390002946304606F0EBFD10B1BDE8704032E4FE +:1073A00054B120460CF0FEFF08B1102070BD2146FC +:1073B0003046BDE8704095E7002070BD2DE9FC5FC8 +:1073C0000C4690460546002701780822007A3E4682 +:1073D000B2EB111F7ED104F10A0100910A31821E25 +:1073E0004FF0020A04F1080B0191092A73D2DFE879 +:1073F00002F0ECDF05F427277AA9CD006888042184 +:1074000009F0D6FA060000D1FFDFB08920B152277B +:107410000726C2E07C02002051271026002C7DD0D8 +:107420006888A0800120A071A88900220099FFF738 +:10743000A0FF002873D1A8892081288AE081D1E0AB +:10744000B5F81290072824D1E87B000621D55127F2 +:1074500009F1140086B2002CE1D0A889002200991D +:10746000FFF787FF00285AD16888A08084F806A01B +:10747000A88920810120A073288A2082A4F8129074 +:10748000A88A009068884B46A969019A01F0F1FA30 +:10749000A8E0502709F1120086B2002C3ED0A8893E +:1074A00000225946FFF765FF002838D16888A08080 +:1074B000A889E080287A072813D002202073288A20 +:1074C000E081E87BC0096073A4F81090A88A00905E +:1074D000688801E083E080E04B4604F11202A9696C +:1074E000D4E70120EAE7B5F81290512709F114001A +:1074F00086B2002C66D06888042109F059FA8346C8 +:107500006888A080A88900220099FFF732FF002830 +:107510006ED184F806A0A889208101E052E067E0DE +:107520000420A073288A2082A4F81290A88A0090D0 +:1075300068884B46A969019A01F09BFAA989ABF8C2 +:107540000E104FE06888FBF786FF07466888042125 +:1075500009F02EFA064607B9FFDF06B9FFDF687BA0 +:10756000C00702D05127142601E0502712264CB341 +:107570006888A080502F06D084F806A0287B594642 +:1075800001F087FA2EE0287BA11DF9E7FE49A889C2 +:107590004989814205D1542706269CB16888A0807C +:1075A00020E053270BE06888A080A889E08019E0DC +:1075B0006888042109F0FCF900B9FFDF5527082687 +:1075C000002CF0D1A8F8006011E056270726002C07 +:1075D000F8D06888A080002013E0FFDF02E00128D7 +:1075E00008D0FFDFA8F800600CB12780668000207B +:1075F000BDE8FC9F57270726002CE3D06888A080B1 +:10760000687AA071EEE7401D20F0030009B1414304 +:10761000091D01EB4000704713B5DB4A00201071D3 +:10762000009848B10024684608F0DFFF002C02D122 +:10763000D64A009911601CBD01240020F4E770B502 +:107640000D46064686B014465C2128461CF051FEC5 +:1076500004B9FFDFA0786874A2782188284601F079 +:1076600042FA0020A881E881228805F11401304601 +:1076700005F04FF96A460121304606F0E2FA19E0BA +:107680009DF80300000715D5BDF806103046FFF73A +:1076900030FD9DF80300BDF8061040F010008DF895 +:1076A0000300BDF80300ADF81400FF233046059A2F +:1076B00006F028FC684606F0D0FA0028E0D006B0B4 +:1076C00070BD10B50C4601F1140005F059F90146E2 +:1076D000627C2046BDE8104001F03ABA70B505461C +:1076E000042109F065F9040000D1FFDF04F1140161 +:1076F0000C46284605F028F921462846BDE870408A +:1077000005F029B970B58AB00C460646FBF7A3FE12 +:10771000050014D02878222827D30CB1A08890B176 +:1077200001208DF80C0003208DF8100000208DF84A +:10773000110054B1A088ADF81800206807E043F2AA +:1077400002000AB070BD0920FBE7ADF818000590F3 +:107750000421304609F02CF9040000D1FFDF04F1C8 +:10776000140005F024F9000701D40820E9E701F02E +:1077700051FE60B108A802210094CDE9011095F8EE +:10778000232003A930466368FFF734FCD9E71120B2 +:10779000D7E72DE9F04FB2F802A0834689B015462D +:1077A00089465046FBF757FE07460421504609F02C +:1077B000FFF80026044605964FF002080696ADF83D +:1077C0001C6007B9FFDF04B9FFDF4146504603F0F4 +:1077D00070FE50B907AA06A905A88DE80700424621 +:1077E000214650466368FFF794FB674807AB066085 +:1077F000DDE9051204F11400CDF80090CDE9032075 +:10780000CDE9013197F82320594650466B6805F0C1 +:1078100017F906000AD0022E04D0032E14D0042E2D +:1078200000D0FFDF09B03046BDE8F08FBDF81C0086 +:107830000028F7D00599CDE9001042462146504670 +:107840006368FFF793FBEDE7687840F00800687025 +:10785000E8E72DE9F04F9BB004464FF000084A4896 +:10786000ADF85480ADF83080ADF85080A0F80880B5 +:10787000ADF81480ADF81880ADF82080ADF81C800C +:10788000007916460D464746012808D0022806D042 +:10789000032804D0042802D008201BB0C4E72046E7 +:1078A0000CF03CFDD0BB28460CF038FDB0BB606846 +:1078B0000CF081FD90BB606848B1608921898842E5 +:1078C00002D8B1F5007F01D90C20E6E780460BAA6B +:1078D00006A92846FFF70FFA0028DED168688078ED +:1078E000C0F34100022808D19DF8190010F0380FAC +:1078F00003D028690CF056FD80B905A92069FFF76F +:10790000B2F90028C9D1206950B1607880079DF88C +:10791000150000F0380002D5D0B301E011E0B8BB8B +:107920009DF8140080060ED59DF8150010F0380F54 +:1079300003D060680CF036FD18B960680CF03BFDB0 +:1079400008B11020A9E707A96069FFF78CF90028A2 +:10795000A3D1606940B19DF81D0000F00701012925 +:107960003FD110F0380F3CD008A9A069FFF77BF990 +:10797000002892D19DF81C00800632D49DF820008A +:1079800080062ED4A06904E07C02002014000020B0 +:1079900027E040B19DF8210000F00701012920D126 +:1079A00010F0380F1DD0E06818B10078C8B11C285D +:1079B00017D20EAA611C2046FFF7C4F90120B94670 +:1079C00060F30F27BA4607468DF84E0042F60300D3 +:1079D000ADF84C000DF13B0217A928680AF089FDAB +:1079E00008B1072059E79DF85C0016A9CDF8009072 +:1079F000C01CCDE9019100F0FF0B00230BF2012226 +:107A0000514613A806F060F8F0BBBDF85800099085 +:107A1000FE482A8929690092CDE901106B89BDF8D9 +:107A20002C202868069906F04FF801007ED12078B6 +:107A30004FF0020AC10601D480062BD5ADF80C9098 +:107A4000606950B907A906A8FFF7ADF99DF81D00B8 +:107A500020F00700401C8DF81D009DF81C008DF8DB +:107A60004E7040F0C8008DF81C0042F60210ADF8D0 +:107A70004C000CA903AACDF800A0CDE901210023F8 +:107A800040F2032213A800E01EE0079906F01CF85C +:107A900001004BD1DD484D4608385B460089ADF802 +:107AA00039000EA8CDE90290CDF80490CDF81090E1 +:107AB0004FF007090022CDF80090BDF858104FF69E +:107AC000FF7005F047FF10B1FFF79DF8E5E69DF860 +:107AD0003800000625D52946012060F30F218DF8D6 +:107AE0004E704FF42450ADF84C00ADF81050627851 +:107AF0009DF81000002362F300008DF810006278FA +:107B0000CDF800A0520862F341008DF8100004AADD +:107B1000CDE9012540F2032213A805F0D5FF0100AD +:107B200004D1606888B32069A8B900E086E005A99F +:107B300006A8FFF738F96078800706D49DF815008D +:107B400020F038008DF8150005E09DF8140040F095 +:107B500040008DF814008DF84E7042F60110ADF81B +:107B60004C00208940F20121B0FBF1F201FB12022E +:107B7000606814ABCDF80080CDE90103002313A8A1 +:107B8000059905F0A1FF010058D12078C00729D040 +:107B9000ADF80C50A06950B908A906A8FFF703F981 +:107BA0009DF8210020F00700401C8DF821009DF871 +:107BB00020008DF84E7040F040008DF8200042F615 +:107BC0000310ADF84C0015A903AACDF800A0CDE92B +:107BD0000121002340F2032213A8089905F074FF45 +:107BE00001002BD1E06868B32946012060F30F2122 +:107BF0008DF84E7042F60410ADF84C00E06800239A +:107C000002788DF8602040788DF86100E06818AA4D +:107C10004088ADF86200E06800798DF86400E068A3 +:107C2000C088ADF86500CDF80090CDE901254FF48E +:107C3000027213A805F048FF010003D0099800F074 +:107C4000B3FF2AE6714803210838017156B1008953 +:107C50003080BDF850007080BDF83000B080BDF8B5 +:107C60005400F080002018E670B501258AB0164651 +:107C70000B46012802D0022816D104E08DF80E50E0 +:107C80004FF4205003E08DF80E5042F60100ADF89D +:107C90000C005BB10024601C60F30F2404AA08A947 +:107CA00018460AF026FC18B107204AE5102048E5DE +:107CB00004A99DF820205548CDE90021801E02909E +:107CC0000023214603A802F2012205F0FDFE10B1B7 +:107CD000FEF799FF35E54D4808380EB1C18831806F +:107CE000057100202DE5F0B593B0074601268DF80B +:107CF0003E6041F60100ADF83C0012AA0FA93046E3 +:107D0000FFF7B2FF002848D1404C0025083CE7B3FC +:107D10001C2102A81CF0EDFA9DF808008DF83E60C9 +:107D200040F020008DF8080042F60520ADF83C0038 +:107D30000E959DF83A00119520F00600801C8DF8F4 +:107D40003A009DF838006A4620F0FF008DF83800B0 +:107D50009DF8390009A920F0FF008DF839000420B2 +:107D6000ADF82C00ADF830000EA80A9011A80D90C7 +:107D70000FA80990ADF82E5002A8FFF76AFD002861 +:107D80000BD1BDF80000608100E008E0BDF8040000 +:107D9000A081401CE0812571002013B0F0BD6581F9 +:107DA000A581BDF84800F4E72DE9F74F1749A0B0C9 +:107DB0000024083917940A79A146012A04D0022A1E +:107DC00002D0082023B02FE5CA88824201D00620C5 +:107DD000F8E721988A46824201D10720F2E7012084 +:107DE0002146ADF848004FF6FF7860F30F21ADF85B +:107DF0004A808DF86E0042F6020B06918DF87240B3 +:107E0000ADF86CB0ADF870401CA901E08402002010 +:107E10001391ADF8508012A805F043FF00252E46BF +:107E20002F460DAB072212A9404605F03DFF78B161 +:107E30000A285DD195B38EB3ADF86450ADF8666095 +:107E40009DF85E008DF8144019AC012864D06BE0F9 +:107E50009DF83A001FB3012859D1BDF83810594593 +:107E60001FD118A809A901940294CDE90310072095 +:107E70000090BDF8361010230022404605F094FF14 +:107E8000B0BBBDF86000042801D006284AD1BDF877 +:107E90002410219881423AD10F2093E73AE001283B +:107EA00035D1BDF83800B0F5205F03D042F60101AE +:107EB00088422CD1BAF80600BDF83610884201D1AC +:107EC000012700E0002705B19EB1219881421ED113 +:107ED00018A809AA01940294CDE903200720009074 +:107EE0000D4610230022404605F05EFF00B902E077 +:107EF0002DE04E460BE0BDF86000022801D01028AE +:107F000010D1C0B217AA09A90AF0D4FA50B9BDF825 +:107F1000369086E7052055E705A917A8221D0AF027 +:107F2000E8FA08B103204DE79DF814000023001D76 +:107F3000C2B28DF8142022980092CDE901401BA80E +:107F4000069905F0C1FD10B902228AF80420FEF757 +:107F50005AFE37E710B50B46401E88B084B205AA1A +:107F600000211846FEF7EEFE00200DF1080C06AACF +:107F700005A901908CE8070007200090012300224A +:107F800021464FF6FF7005F0E5FC0446BDF81800E9 +:107F9000012800D0FFDF2046FEF735FE08B010BDF7 +:107FA000F0B5FF4F044687B038790E46032804D059 +:107FB000042802D0082007B0F0BD04AA03A9204677 +:107FC000FEF799FE0500F6D160688078C0F34100A5 +:107FD00002280AD19DF80D0010F0380F05D0206955 +:107FE0000CF0E0F908B11020E5E7208905AA216925 +:107FF0008DE807006389BDF810202068039905F01B +:1080000063FD10B1FEF7FFFDD5E716B1BDF8140012 +:108010003080042038712846CDE7F8B50C000646BC +:108020000BD001464FF6FF7500236A46284605F03F +:108030003DFF20B1FEF7E7FDF8BD1020F8BD694611 +:108040002046FEF710FE0028F8D1A078314600F057 +:1080500001032846009A05F055FFEBE730B587B0DD +:10806000144600220DF1080C05AD01928CE82C009D +:10807000072200920A46014623884FF6FF7005F05A +:1080800069FCBDF814102180FEF7BDFD07B030BDBE +:1080900070B50D46042108F08BFC040000D1FFDF11 +:1080A000294604F11400BDE8704004F079BC70B5B5 +:1080B0000D46042108F07CFC040000D1FFDF2946B6 +:1080C00004F11400BDE8704004F08DBC70B50D469D +:1080D000042108F06DFC040000D1FFDF294604F103 +:1080E0001400BDE8704004F0A5BC70B5054604213D +:1080F00008F05EFC040000D1FFDF2146284623681B +:10810000BDE870400122FEF74BBF70B50646042162 +:1081100008F04EFC040000D1FFDF04F1140004F06D +:108120002FFC401D20F0030511E0011D00880022F6 +:10813000431821463046FEF733FF00280BD0607C01 +:10814000ABB2684382B2A068011D08F0EEFAA068E5 +:1081500041880029E9D170BD70B50546042108F0B9 +:1081600027FC040000D1FFDF214628466368BDE8F4 +:1081700070400222FEF714BF70B50E46054601F0AE +:1081800049F9040000D1FFDF01202072667265808A +:10819000207820F00F00001D20F0F000403020700B +:1081A000BDE8704001F039B910B50446012900D08E +:1081B000FFDF2046BDE810400121FAF713B92DE991 +:1081C000F04F97B04FF0000A0C008346ADF814A0B2 +:1081D000D04619D0E06830B1A068A8B10188ADF8E8 +:1081E0001410A0F800A05846FBF735F9070043F239 +:1081F000020961D0387822285CD30421584608F05F +:10820000D7FB050005D103E0102017B0BDE8F08FC3 +:10821000FFDF05F1140004F0B3FB401D20F003065E +:10822000A078012803D0022801D00720EDE721889B +:1082300007AA584605F005FD30BB07A805F00DFD5F +:1082400010BB07A805F009FD48B99DF826000128D4 +:1082500005D1BDF82400A0F52451023902D04FF415 +:108260005050D2E7E068B0B1CDE902A007200090FD +:1082700005AACDF804A00492A2882188BDF8143084 +:10828000584605F067FB10B1FEF7BDFCBDE7A168DD +:10829000BDF8140008809DF81F00C00602D543F207 +:1082A0000140B2E70B9838B1A1780078012905D0D8 +:1082B00080071AD40820A8E74846A6E7C007F9D0E7 +:1082C00002208DF83C00A8684FF00009A0B1697C3D +:1082D0004288714391420FD98AB2B3B2011D08F0AE +:1082E000DAF98046A0F800A006E003208DF83C00F3 +:1082F000D5F800804FF001099DF8200010F0380FEC +:1083000000D1FFDF9DF820002649C0F3C2000844D9 +:1083100097F8231010F8010C884201D90F2074E758 +:108320002088ADF8400014A90095CDE9019143469D +:1083300007220FA95846FEF75DFE002891D19DF84F +:10834000500050B9A078012807D1687CB3B27043BF +:1083500082B2A868011D08F0B2F9002055E770B597 +:10836000064615460C460846FEF70CFC002805D1CB +:108370002A4621463046BDE8704075E470BD13E5DD +:1083800070B51E4614460D000ED06CB1616859B12F +:1083900060B10349C988814208D0072070BD000040 +:1083A0007C020020FA2F00001020F7E72068FEF77B +:1083B000E9FB0028F2D1324621462846BDE870404C +:1083C000FFF747BA70B515460C0006D038B1FE4924 +:1083D0000989814203D00720E0E71020DEE720680A +:1083E000FEF7D0FB0028D9D129462046BDE87040D1 +:1083F000D6E570B5064686B00D46144610460BF01D +:10840000B3FFD0BB60680BF0D6FFB0BBA6F57F40D2 +:10841000FF3803D03046FBF71EF880B12846694686 +:10842000FEF7E3FC00280CD19DF810100F2008295E +:108430003CD2DFE801F008060606060A0A0843F205 +:10844000020006B0AAE70320FBE79DF8021001290D +:1084500008D1BDF80010B1F5C05FF2D06FF4C05282 +:10846000D142EED09DF8061001290DD1BDF80410BF +:10847000A1F52851062907D200E028E0DFE801F045 +:10848000030304030303DCE79DF80A1001290ED15E +:10849000BDF80810B1F5245FD3D0A1F524510239FD +:1084A000CFD00129CDD0022901D1CAE7FFDF606812 +:1084B00078B9002305AA2946304605F0F7FC10B12B +:1084C000FEF7A1FBBDE79DF81400800601D4102043 +:1084D000B7E76188224628466368FFF7BFFDB0E72B +:1084E0002DE9F043814687B08846144610460BF0CC +:1084F0003BFF18B1102007B0BDE8F083002306AAA7 +:108500004146484605F0D2FC18B100BFFEF77BFBA0 +:10851000F1E79DF81800C00602D543F20140EAE7F2 +:108520000025072705A8019500970295CDE903507E +:1085300062884FF6FF734146484605F035FC060059 +:1085400013D160680BF010FF60B960680195CDE948 +:10855000025000970495238862884146484605F0FA +:1085600023FC0646BDF8140020803046CEE739B122 +:10857000954B0A889B899A4202D843F203007047C0 +:108580001DE610B586B0904C0423ADF81430638915 +:1085900043B1A4898C4201D2914205D943F2030030 +:1085A00006B010BD0620FBE7ADF8101000210091C9 +:1085B0000191ADF8003002218DF8021005A9029159 +:1085C00004A90391ADF812206946FFF7F8FDE7E72B +:1085D0002DE9FC4781460E4608460BF09FFE88BBFE +:1085E0004846FAF738FF5FEA00080AD098F800001A +:1085F000222829D30421484608F0DAF9070005D1DA +:1086000003E043F20200BDE8FC87FFDF07F114003E +:1086100004F0CDF905463078012803D0022804D0B3 +:108620000720F0E7A8070FD502E015F01C0F0BD0CC +:10863000B079341DC00709D0E08838B1A0680BF0CC +:108640006DFE18B11020DEE70820DCE732782088C4 +:10865000002628B3A0F201130721112B18D20CD247 +:10866000DFE803F00B090D0B1D0B121D100B0B1D8A +:108670001D1D1D0B1D00022A11D10846C3E7012A4A +:10868000FBD00CE02A0700E0EA06002AF5DA06E053 +:10869000A0F5C0721F2A02D97D3A022AEDD8C6B2CF +:1086A00000F0B8FE50B198F82300CDE90006FA8931 +:1086B000234639464846FEF7EAFCA4E71120A2E724 +:1086C0002DE9F04F8BB01F4615460C468346002619 +:1086D000FAF7C1FE28B10078222805D208200BB095 +:1086E00094E543F20200FAE7B80801D00720F6E764 +:1086F000032F00D100274FF6FF79CCB1022D73D3A1 +:1087000020460BF058FE30B904EB0508A8F1010033 +:108710000BF051FE08B11020E1E7AD1EAAB22146D0 +:10872000484605F06DFC38F8021C88425CD1ADB2B9 +:108730002549B80702D58889401C00E001201FFAAE +:1087400080F8F80701D08F8900E04F4605AA41461E +:10875000584605F076FA4FF0070A4FF00009ACB31F +:10876000204608E0408810283ED8361D304486B2A6 +:10877000AE4239D2A01902884245F3D354E000BF7B +:108780009DF8170002074FD584B304EB0608361D89 +:10879000B8F80230B6B2102B26D89A19AA4223D8BC +:1087A000B8F8002091421FD1C00620D5CDE900A91C +:1087B0000DF1080C0AAAA11948468CE80700B8F880 +:1087C00000100022584603E07C0200202CE00BE061 +:1087D00005F0C0F810B1FEF716FA80E7B8F802000D +:1087E000BDF82810884202D00B2078E704E0B8F8E2 +:1087F0000200304486B206E0C00604D55846FEF7B3 +:1088000078FC002888D19DF81700BDF81A1020F0D8 +:1088100010008DF81700BDF81700ADF80000FF2319 +:108820005846009A05F06EFB05A805F016FA18B92F +:10883000BDF81A10B942A3D90421584608F0B8F877 +:10884000040000D1FFDFA2895AB1CDE900A94D464D +:10885000002321465846FEF71AFC0028BDD1A58109 +:108860003DE700203BE72DE9FF4F8BB01E46170088 +:108870000D464FF0000412D0B00802D007200FB010 +:10888000C4E4032E00D100265DB108460BF08AFD3A +:1088900028B93888691E08440BF084FD08B11020FF +:1088A000EDE7C74AB00701D5D18900E00121F00703 +:1088B0004FF6FF7802D0D089401E00E0404686B2D5 +:1088C00006AA0B9805F0BDF94FF000094FF0070B11 +:1088D0000DF1140A39E000BF9DF81B00000734D5E4 +:1088E000CDF80490CDF800B0CDF80890CDE9039A0A +:1088F000434600220B9805F057FA60BB05B3BDF85C +:1089000014103A8821442819091D8A4230D3BDF831 +:108910001E2020F8022BBDF8142020F8022BCDE9F0 +:1089200000B9CDE90290CDF810A0BDF81E10BDF839 +:10893000143000220B9805F037FA08B103209EE7A7 +:10894000BDF814002044001D84B206A805F085F986 +:1089500020B10A2806D0FEF756F990E7BDF81E10A0 +:10896000B142B9D934B17DB13888A11C884203D253 +:108970000C2084E7052082E722462946404605F080 +:108980003FFB014628190180A41C3C80002076E7AB +:1089900010B504460BF0E8FC08B1102010BD884863 +:1089A000C0892080002010BDF0B58BB00D46064672 +:1089B000142103A81BF09DFC01208DF80C008DF8FC +:1089C000100000208DF81100ADF814503046FAF771 +:1089D00042FD48B10078222812D30421304607F026 +:1089E000E7FF040005D103E043F202000BB0F0BD45 +:1089F000FFDF04F11400074603F0D9FF800601D41D +:108A00000820F3E7207C022140F00100207409A82F +:108A10000094CDE90110072203A930466368FEF7F0 +:108A2000E9FA20B1217C21F001012174DEE7294619 +:108A30003046F9F7C8FC08A9384603F0A7FF00B193 +:108A4000FFDFBDF82040172C01D2172000E02046A0 +:108A5000A84201D92C4602E0172C00D21724214647 +:108A60003046FFF724FB21463046F9F7D2F90020C3 +:108A7000BCE7F8B51C4615460E46069F08F0CAF836 +:108A80002346FF1DBCB231462A46009407F0B5FCD0 +:108A9000F8BD70B50C4605460E2120461BF007FCBC +:108AA000002020802DB1012D01D0FFDF76E40620CB +:108AB00000E00520A07171E410B5488008781346E5 +:108AC00020F00F00001D20F0F00080300C460870F0 +:108AD0001422194604F108001BF0AFFB00F09DFCC6 +:108AE0003748046010BD2DE9F047DFF8D890491DE4 +:108AF000064621F0030117460C46D9F8000007F09E +:108B000092FD050000D1FFDF4FF000083560A5F8A9 +:108B100000802146D9F8000007F085FD050000D14E +:108B2000FFDF7560A5F800807FB104FB07F1091D28 +:108B30000BD0D9F8000007F076FD040000D1FFDF6C +:108B4000B460C4F80080BDE8F087C6F80880FAE792 +:108B50002DE9F0411746491D21F00302194D064643 +:108B600001681446286807F089FD22467168286864 +:108B700007F084FD3FB104FB07F2121D03D0B1687A +:108B8000286807F07BFD042007F0BAFE04460420A5 +:108B900007F0BEFE201A012804D12868BDE8F04184 +:108BA00007F036BDBDE8F08110B50C4605F015F8AC +:108BB00000B1FFDF2046BDE81040FEF724B80000FA +:108BC0007C0200201400002038B50C468288817B8E +:108BD00019B14189914200D90A462280C188121DEB +:108BE00090B26A4606F092FFBDF80000032800D359 +:108BF0000320C1B2208800F0A3FF38BD38B50C4671 +:108C00008288817B19B10189914200D90A4622806C +:108C1000C188121D90B26A4606F078FFBDF80000C8 +:108C2000022800D30220C1B2208800F089FF401C36 +:108C3000C0B238BD2DE9FE4F0C46FD4981464022A9 +:108C4000D1E90201CDE9010109F1030020F003019E +:108C5000C91C21F0030100916846114607F0C5FCCC +:108C6000F44E002C02D1F44A00999160009901441D +:108C70000091357F05F1010504D1E8B209F0C0FB90 +:108C800000B1FFDF009800EB0510C01C20F00301CD +:108C900000915CB9707AB27A1044C2B200200870B8 +:108CA000308C80B204F021FE00B1FFDF0098316A01 +:108CB000084400902146684600F00DFF0098C01C53 +:108CC00020F003000090B37AF27A717A04B10020A8 +:108CD00007F081FD0099084400902146684600F0A5 +:108CE0003AFF00273D46B24696F801800CE0284640 +:108CF00000F0D4FE064681788088F9F721F9717872 +:108D00006D1C00FB0177EDB24545F0D10098C01C09 +:108D100020F00300009004B100203946F9F71BF958 +:108D200000990027084400903D469AF801800CE025 +:108D3000284600F0B3FE0646C1788088FEF763FC43 +:108D400071786D1C00FB0177EDB24545F0D10098BC +:108D5000C01C20F00300009004B100203946FEF74B +:108D60005BFC00994FF000080844009045469AF8D3 +:108D700001700EE0284600F091FE0646807B30B17F +:108D800006F1080001F0DDFE727800FB02886D1C20 +:108D9000EDB2BD42EED10098C01C20F0030000905F +:108DA00004B10020414601F0D0FE00990844009033 +:108DB0002146684600F049FE0098C01D20F00702D9 +:108DC00000922CBB9D490020FAF747F8FBF715FBF2 +:108DD000984801AA00211030F8F7CEFA00B1FFDF61 +:108DE0009AF81D00FEF77FFF00B1FFDF91484FF4B6 +:108DF000F67144301BF07DFA8E480421443080F82F +:108E0000E91180F8EA11062180F8EB1103210171C4 +:108E10000099A1EB0900BDE8FE8F70B5854C0646B0 +:108E20004434207804EB4015E078083590B9A01957 +:108E300090F8E80100280ED0A0780F2800D3FFDFBB +:108E4000202128461BF055FA687866F30200687006 +:108E50000120E070284670BD2DE9F04105460C4622 +:108E600000270078052190463E46B1EB101F00D048 +:108E7000FFDF287A50B101280ED0FFDFA8F800608C +:108E80000CB1278066800020BDE8F081012709260B +:108E900074B16888A08008E00227142644B168886D +:108EA000A0802869E060A88A2082287B2072E5E7FC +:108EB000A8F80060E7E710B55F4C6068C11D21F0BD +:108EC0000701814200D0FFDF5A48012100220170D2 +:108ED00042700172417203238372C1720273027481 +:108EE000052202831F224283417455A242610A2255 +:108EF000027741774FF4B06101626168416010BD53 +:108F000030B54D4C1568636810339D4202D2042081 +:108F1000136030BD474B5D785A6802EB0512107044 +:108F200051700320D080172090800120D070907065 +:108F3000002090735878401C587060681030606052 +:108F4000002030BD70B506463A480024457807E059 +:108F5000204600F0A3FD0178B14204D0641CE4B2C5 +:108F6000AC42F5D1002070BDF7B5074608780C4635 +:108F700010B3FFF7E7FF0546A7F12006202F06D024 +:108F8000052E19D2DFE806F00F2B2B151A0000F082 +:108F900090FD0DB1697800E00021401AA17880B2FF +:108FA0000844FF2808D8A07830B1A088022824D22D +:108FB00002E06088172820D20720FEBD207AE0B1A9 +:108FC00061881729F8D3A1881729F5D3A179002939 +:108FD000F2D0E1790029EFD0402804D9ECE7242F22 +:108FE0000BD1207A48B161884FF6FB70814202D8DC +:108FF000A188814201D90420FEBD65B9207802AA6A +:109000000121FFF77DFF0028F6D12078FFF79AFFB6 +:10901000050000D1FFDF052E25D2DFE806F003189A +:109020001B151E00A0786870A088E8801CE0000076 +:10903000B0460200980300201C0000200000002021 +:109040006E524635780000006088A8800CE0A07859 +:10905000A87009E0A078E87006E054F8020FA86054 +:109060006068E86000E0FFDF0020FEBD1A2835D010 +:109070000DDC132832D2DFE800F01B31203131271C +:109080002723252D313129313131312F0F0030285F +:1090900002D003DC1E2821D1072070473A38092866 +:1090A0001CD2DFE800F0151B0F1B1B1B1B1B07004E +:1090B0000020704743F20400704743F202007047FB +:1090C000042070470D2070470F207047082070471C +:1090D0001120704713207047062070470320704707 +:1090E00010B5007800F0010006F001FDBDE8104069 +:1090F000BCE70EB5017801F001018DF80010417850 +:1091000001F001018DF801100178C1F340018DF8E3 +:1091100002104178C1F340018DF8031001788908ED +:109120008DF80410417889088DF8051081788DF844 +:109130000610C1788DF8071000798DF80800684690 +:1091400005F0ACFAFFF792FF0EBD2DE9F84FDFF8FE +:10915000F883FE4C00261FE0012000F03FFD0120B7 +:10916000FFF75BFE054640214746D8F8080007F0A8 +:109170005AFA686000B9FFDF686805F03EF8A8B1E8 +:109180002846FAF75AFC284600F02EFD20B9402266 +:109190006968B86807F072FA94F9E9010428DBDA23 +:1091A000022007F0ADFB07460025A6E040226968D3 +:1091B000D8F8080007F062FAF2E7B8F80210404663 +:1091C000491C89B2A8F80210B94201D3002141809C +:1091D0000221B8F8020007F0EBFB002865D0B8F8D0 +:1091E0000200694606F0F1FBFFF740FF00B1FFDF28 +:1091F0009DF8000078B1B8F8020007F01DFD5FEAA5 +:10920000000900D1FFDF484606F08BFF18B1B8F81F +:10921000020002F03DF9B8F8020007F0FBFC5FEA3B +:10922000000900D1FFDF484606F073FFE8BB0321C9 +:10923000B8F8020007F0BCFB5FEA000B48D1FFDF83 +:1092400046E000BFDBF8100010B10078FF2849D0DD +:10925000022000F0C3FC0220FFF7DFFD82464846F3 +:1092600007F063F8CAF8040000B9FFDFDAF8040079 +:1092700007F02BF9002100900170B8F80210504659 +:10928000AAF8021001F00AFE484607F020F900B9DA +:10929000FFDF504600F0A8FC18B99AF8010000075B +:1092A00004D50099CBF8101012E024E0DBF8100090 +:1092B00038B10178491C11F0FF01017008D1FFDFBE +:1092C00006E000221146484600F0BDFB00B9FFDF72 +:1092D00094F9EA01022805DBB8F8020001F0A3FDC9 +:1092E0000028AFD194F9E901042804DB484607F0CF +:1092F00052F900B101266D1CEDB2BD4204D294F9C1 +:10930000EA010228BFF659AF002E7FF423AFBDE873 +:10931000F84F032000F062BC10B58B4CE060086889 +:109320002061AFF2D91002F012FD607010BD8748C5 +:1093300000214438017084480170854941607047BC +:1093400070B505464FF080500C46D0F8A410491C6B +:1093500005D1D0F8A810C9430904090C0BD050F866 +:10936000A01F01F001012970416821608068A08080 +:10937000287830B970BD062120460AF0AAFC0120E9 +:109380002870607940F0C000607170BD70B54FF01A +:1093900080540D46D4F88010491C0BD1D4F88410A9 +:1093A000491C07D1D4F88810491C03D1D4F88C107B +:1093B000491C0CD0D4F880100160D4F884104160AE +:1093C000D4F888108160D4F88C10C16002E01021BC +:1093D0000AF07FFCD4F89000401C0BD1D4F8940024 +:1093E000401C07D1D4F89800401C03D1D4F89C004D +:1093F000401C09D054F8900F286060686860A0682D +:10940000A860E068E86070BD2846BDE870401021A3 +:109410000AF05FBC4D480079FFE470B54B4CE07832 +:1094200030B3207804EB4010407A00F0070020446D +:1094300090F9E801002800DCFFDF2078002504EB2C +:109440004010407A00F00700011991F8E801401E31 +:1094500081F8E8012078401CC0B220700F2800D1AC +:109460002570A078401CA0700AF096FBE57070BDD6 +:10947000FFDF70BD3EB50546032107F099FA0446AB +:10948000284607F0C7FB054604B9FFDF206918B17D +:109490000078FF2800D1FFDF01AA6946284600F0C6 +:1094A000D2FA60B9FFDF0AE0002202A9284600F0E4 +:1094B000CAFA00B9FFDF9DF8080000B1FFDF9DF890 +:1094C0000000411E8DF80010EED2206901998842FB +:1094D00001D1002020613EBD70B50546A0F57F405A +:1094E0000C46FF3800D1FFDF012C01D0FFDF70BD3B +:1094F000FFF790FF040000D1FFDF207820F00F007D +:10950000401D20F0F0005030207065800020207257 +:1095100001202073BDE870407FE72DE9F041164639 +:109520000D460746FFF776FF040000D1FFDF2078E5 +:1095300020F00F00401D20F0F000503020706780B8 +:1095400001202072286805E01C000020DC030020B8 +:10955000C81400202061A888A0822673BDE8F041CD +:109560005BE77FB5FFF7EEFC040000D1FFDF02A947 +:109570002046FFF729FB054603A92046FFF73EFBDF +:109580008DF800508DF80100BDF80800001DADF801 +:109590000200BDF80C00001DADF80400E088ADF835 +:1095A0000600684606F08CFA002800D0FFDF7FBD79 +:1095B0002DE9F047DFF8FC930546002799F80000F5 +:1095C00010B10820BDE8F08728460AF0CDFE08B1AA +:1095D0001020F7E7F84C207808B9FFF76CFCA07A68 +:1095E000617A0844C6B200F064FAB04207D2301A79 +:1095F000C1B22A460020FFF783FC0700E2D1D9F868 +:1096000004004E46C01C20F00300C9F8040000F01E +:1096100040FB716800EB010801214046FFF70AFB9F +:10962000064629684044884202D8B6F5803F15D3E3 +:1096300028600020FFF786FC05000DD005F113001F +:10964000D9F8041020F003004E46884200D0FFDF16 +:109650006078401E607075600420B3E700214046CA +:10966000FFF7E8FA0446A64200D0FFDF04EB08014A +:10967000C9F8041029604FF6FF71A9F80210012102 +:1096800089F8001038469DE72DE9F0410446C948A5 +:1096900017460E46007810B10820BDE8F081084654 +:1096A0000AF03CFE08B11020F7E7C34D287808B94E +:1096B000FFF701FC601E1E2807D8012C22D130784C +:1096C000FE281FD828770020E7E7A4F120001F28F4 +:1096D00005D8E0B23A463146BDE8F04144E4A4F191 +:1096E00040001F2805D831462046BDE8F04100F073 +:1096F000A3BAA4F1A0001F2804D80020A02C03D0F6 +:10970000A12C06D00720C8E7317801F00101697764 +:10971000C3E731680922F82901D38B0701D010462D +:10972000BBE76B7C03F00303012B04D16B8BD733B6 +:109730009CB28C42F3D82962AFE72DE9F04781460D +:109740000E4608460AF010FE48B948460AF02AFEBE +:1097500028B909F1030020F00301494501D0102088 +:1097600030E795484FF0000A4430817869B141787C +:10977000804600EB411408343788324600212046E9 +:1097800000F040FA050004D027E0A6F800A005206C +:1097900018E7B9F1000F24D03088B84201D90C2560 +:1097A0001FE0607800F00705284600F017FA08EB84 +:1097B0000507324697F8E8014946401C87F8E8015A +:1097C000204607F5F47700F01DFA05463878401E6C +:1097D0003870032000F002FA2DB10C2D01D0A6F84C +:1097E00000A02846EEE66078724E00F007010129DD +:1097F00023D002290CD0032933D0FFDF98F80110C1 +:109800004046491CC9B288F801100F2934D035E010 +:10981000616821B1000702D46088FFF72BFE98F839 +:10982000EA014746012802D1707802F0AFFA97F9B1 +:10983000EA010428E2DBFFDFE0E7616819B14022BA +:10984000B06806F01BFF98F8E9014746032802D1EB +:10985000707802F09BFA97F9E9010428CEDBFFDF6C +:10986000CCE7C00602D56088FFF704FE98F9EB014B +:109870000628C3DBFFDFC1E780F801A08178491E1D +:109880008170617801F0070101EB080090F8E811A0 +:10989000491C80F8E811A4E770B50D4604460AF0AB +:1098A0003DFD18B928460AF05FFD08B1102070BDD3 +:1098B00029462046BDE8704008F0D9BD70B5044681 +:1098C00015460E4608460AF029FD18B928460AF042 +:1098D0004BFD08B1102070BD022C03D0102C01D01C +:1098E000092070BD2A463146204608F0E3FD0028D5 +:1098F000F7D0052070BD70B514460D4606460AF037 +:109900000DFD38B928460AF02FFD18B920460AF097 +:1099100049FD08B1102070BD22462946304608F0A6 +:10992000E8FD0028F7D0072070BD3EB504460AF0D8 +:109930001BFD08B110203EBD684604F00FFEFFF786 +:1099400095FB0028F7D19DF806002070BDF80800AF +:109950006080BDF80A00A08000203EBD70B50546BD +:109960000C4608460AF01EFD20B93CB120680AF0FA +:10997000FBFC08B1102070BDA08828B12146284604 +:10998000BDE87040FDF7BEBE092070BD70B504464D +:109990000D4608460AF0C2FC30B9601E1E2818D8D1 +:1099A00028460AF0BBFC08B1102070BD022C05D976 +:1099B000072070BD1C0000209803002004B9FFDFC1 +:1099C000F94800EB840050F8041C2846BDE87040BC +:1099D0000847A4F120001F2805D829462046BDE8E5 +:1099E0007040FAF792BCF02CE2D1A8680AF096FC1D +:1099F0000028D9D1284606F0CBF8BDE87040FFF723 +:109A000035BB70B504460D4608460AF0ADFC30B9CA +:109A1000601E1E280DD828460AF080FC08B11020D0 +:109A2000C7E7012C01D0022C01D10620C1E7072095 +:109A3000BFE7A4F120001F28F9D829462046BDE839 +:109A40007040FAF7BABC06F033BB38B50446D748C5 +:109A5000007B00F00105D9B9F9F78BFA0DB1226846 +:109A600000E00022D2484178C06804F06EFBD04884 +:109A70001030C0788DF8000010B1012802D004E049 +:109A8000012000E000208DF80000684604F0DFFDB2 +:109A9000002D02D020682830206038BD30B5C34D7D +:109AA00004466878A04200D8FFDF686800EB041025 +:109AB00030BD70B5BD4800252C46467807E02046ED +:109AC000FFF7ECFF4078641C2844C5B2E4B2B4420E +:109AD000F5D128466DE72DE9F0410C46064600F029 +:109AE00006F907463068C01C20F00302326014BB40 +:109AF000AE483B46082124300AF0EAFA002409E087 +:109B0000082C10D2DFE804F0060408080A04040652 +:109B1000A84804E0A84802E0A84800E0A8480AF0E5 +:109B2000F7FA054600E0FFDFA54200D0FFDF641C26 +:109B3000E4B2082CE4D3306800EB07103060ACE5E9 +:109B4000021D5143452900D245210844C01CB0FBE9 +:109B5000F2F0C0B270472DE9FC5F064693484FF023 +:109B600000088B464746444690F8019022E0204684 +:109B7000FFF794FF050000D1FFDF6878694638449D +:109B8000C7B22846FFF720F8824601A92846FFF70A +:109B900035F80346BDF804005246001D81B2BDF8F9 +:109BA0000000001D80B206F081FF6A78641C00FB93 +:109BB0000288E4B24C45DAD13068C01C20F00300C2 +:109BC0003060BBF1000F00D000204246394606F05D +:109BD0007BFF316808443060BDE8FC9F7349443125 +:109BE00008710020C870704770494431CA782AB1A2 +:109BF0000A7801EB42110831814201D001207047FF +:109C0000002070472DE9F04106460078154600F027 +:109C10000F0400201080601E0F46052800D3FFDFD0 +:109C200061482A46103000EB8400394650F8043C65 +:109C30003046BDE8F041184770B50C46402802D0C8 +:109C4000412806D120E0A07861780D18E1788142A2 +:109C500001D90720ADE62078012801D91320A8E614 +:109C6000FF2D08D808F0B0FD064609F04CFF301A69 +:109C7000801EA84201DA12209BE64C4821688160D0 +:109C800021790173002094E6BDE87040084600F099 +:109C90005EB82DE9F0470027DFF810A13E463D46AB +:109CA000B9463C469AF801800AE02046FFF7F6FEE6 +:109CB0004178807B0E4410FB0155641CE4B27F1C8C +:109CC0004445F2D109EB8700C6EBC60100EB8100E9 +:109CD0009AF8092000EB850101EBC2019AF80A20ED +:109CE0009AF80B0001EBC20101EB80006AE42DE958 +:109CF000F047DFF8B8900026344699F8090099F843 +:109D00000A2099F801700244D5B299F80B2010444A +:109D100000F0FF0808E02046FFF7C0FE817B407896 +:109D200011FB0066641CE4B2BC42F4D199F809004E +:109D300099F80A10284428444044401C01B10121EC +:109D400008448419FF2C00D9FFDFE0B23AE438B5AB +:109D50000446407800F00300012803D002280BD00D +:109D6000072038BD606858B10AF025FBD0B960689B +:109D70000AF018FB20B915E060680AF0CFFA88B93C +:109D800069462046FCF71EF90028EAD1607800F009 +:109D90000300022816D19DF8000098B160680AF00F +:109DA00001FB78B1102038BDB046020098030020B6 +:109DB0001C000020B941000017AC00005D2F00001E +:109DC000F32101006189F8290DD8208988420AD839 +:109DD000607800F003020A48012A06D1D731026AEE +:109DE00089B28A4201D20920DDE794E80E0000F131 +:109DF000100585E80E000AB9002101830020D2E792 +:109E0000980300202DE9F04107461446884608468D +:109E100001F01CFD064608EB88001C22796802EB65 +:109E2000C0000D18688C58B14146384601F016FD47 +:109E3000014678680078C200082305F120000CE094 +:109E4000E88CA8B14146384601F00FFD014678681C +:109E500008234078C20005F1240006F066FC38B102 +:109E6000062121726681D0E90010C4E9031009E0DF +:109E7000287809280BD00520207266816868E06088 +:109E8000002028702046BDE8F04101F0D5BC072035 +:109E900020726681F4E72DE9F04116460D4607462B +:109EA000406801EB85011C2202EBC10144182046E9 +:109EB00001F0FDFC40B10021708865F30F2160F3D3 +:109EC0001F4107200AF0DEF909202070324629469A +:109ED0003846BDE8F04195E72DE9F0410E460746CA +:109EE00000241C21F07816E004EB8403726801EB77 +:109EF000C303D25C6AB1FFF78DFA050000D1FFDF22 +:109F00006F802A4621463046FFF7C5FF0120BDE895 +:109F1000F081641CE4B2A042E6D80020F7E770B5F7 +:109F2000064600241C21C0780AE000BF04EB84032D +:109F3000726801EBC303D5182A782AB1641CE4B215 +:109F4000A042F3D8402070BD282128461AF0AFF96E +:109F5000706880892881204670BD70B50346002056 +:109F60001C25DC780DE000BF00EB80065A6805EB8D +:109F7000C6063244167816B1128A8A4204D0401CB2 +:109F8000C0B28442F0D8402070BDF0B50446002035 +:109F90001C26E5780EE000BF00EB8007636806EB47 +:109FA000C7073B441F788F4202D15B78934204D0AD +:109FB000401CC0B28542EFD84020F0BD0078032895 +:109FC00001D000207047012070470078022801D09E +:109FD00000207047012070470078072801D000203A +:109FE0007047012070472DE9F041064688461078F9 +:109FF000F1781546884200D3FFDF2C781C27641CBB +:10A00000F078E4B2A04201D8201AC4B204EB840173 +:10A01000706807EBC1010844017821B141468847C7 +:10A0200008B12C7073E72878A042E8D1402028704E +:10A030006DE770B514460B880122A240134207D188 +:10A0400013430B8001230A22011D06F038FB047024 +:10A0500070BD2DE9FF4F81B00878DDE90E7B9A468F +:10A0600091460E4640072CD4019806F0E5FD040009 +:10A0700000D1FFDF07F1040820461FFA88F105F040 +:10A0800024FF050000D1FFDF204629466A4606F07E +:10A090006EF90098A0F80370A0F805A0284606F015 +:10A0A00014FA017869F306016BF3C71101702046B9 +:10A0B0001FFA88F105F04CFF00B9FFDF019803F0AB +:10A0C000B9FF06EB0900017F491C017705B0BDE827 +:10A0D000F08F2DE9F84F0E469A4691460746032128 +:10A0E00006F066FC0446008DDFF8B485002518B143 +:10A0F00098F80000B0421ED1384606F09DFD0700DA +:10A1000000D1FFDF09F10401384689B205F0DDFE18 +:10A11000050010D0384629466A4606F028F900980E +:10A1200000210A460180817004F054F80098C01D97 +:10A13000CAF8000021E098F80000B04216D104F1FE +:10A14000260734F8341F012000FA06F911EA090F36 +:10A1500000D0FFDF2088012340EA090020800A2286 +:10A16000391D384606F0C6FA067006E0324604F19C +:10A17000340104F12600FFF75CFF0A2188F8001083 +:10A180002846BDE8F88FFEB514460D46064602ABDC +:10A190000C220621FFF79DFF002826D0029968783F +:10A1A00012220A70801C487008224A80A8702088F9 +:10A1B00088806088C880A0880881E0884881002461 +:10A1C0000C20CDE900040523062229463046FFF77E +:10A1D00040FF2146002266F31F41F023104609F09C +:10A1E000A7FF6878801C68700120FEBDFEB514468C +:10A1F0000D460622064602AB1146FFF76AFF00280D +:10A2000012D0029B132000211870A87858700220E9 +:10A2100058809C800620CDE900010246052329468E +:10A220003046FFF716FF0120FEBD2DE9FE430C4628 +:10A23000804644E002AB0E2207214046FFF749FF6B +:10A24000002841D060681C2267788678BF1C06EB26 +:10A25000860102EBC1014518029814210170477074 +:10A260000A214180698A0181E98A4181A988818026 +:10A27000A9898181304601F0E9FA02990523072274 +:10A28000C8806F700420287000250E20CDE90005DD +:10A2900021464046FFF7DDFE294666F30F2168F3AD +:10A2A0001F41F0230022072009F042FF6078FD499A +:10A2B000801C607062682046921CFFF794FE606804 +:10A2C00080784028B6D10120BDE8FE83FEB50D465A +:10A2D000064638E002AB0E2207213046FFF7F9FEB2 +:10A2E000002835D068681C23C17801EB810203EB9C +:10A2F000C2028418029815220270627842700A2203 +:10A300004280A2894281A2888281084601F09EFA99 +:10A31000014602988180618AC180E18A0181A0881A +:10A32000B8B10020207000210E20CDE900010523E6 +:10A33000072229463046FFF78CFE6A68DA4928462C +:10A34000D21CFFF750FE6868C0784028C2D10120B7 +:10A35000FEBD0620E6E72DE9FE430C46814644E0BB +:10A36000204601F08EFAD0B302AB082207214846FE +:10A37000FFF7AFFE0028A7D060681C226578067939 +:10A38000AD1C06EB860102EBC10147180298B7F835 +:10A39000108006210170457004214180304601F093 +:10A3A00055FA0146029805230722C180A0F80480CF +:10A3B0007D70082038700025CDE90005214648460B +:10A3C000FFF747FE294666F30F2169F31F41F0238B +:10A3D0000022072009F0ACFE6078801C6070626883 +:10A3E000B2492046121DFFF7FEFD60680179402941 +:10A3F000B6D1012068E72DE9F34F83B00E4680E027 +:10A40000304601F03EFA002875D071681C2091F8A2 +:10A41000068008EB880200EBC2000C18414630466B +:10A4200001F023FA0146A078C30070684078C200AA +:10A4300004F1240006F095F907468088E18B401A64 +:10A4400080B2002581B3AA46218B814200D80846FC +:10A450008146024602AB07210398FFF73AFE01004E +:10A4600028D0BAF1000F03D0029AB88802251080D4 +:10A470008B46E28B3968A9EB05001FFA80FA0A4483 +:10A480000398009206F0D8FBED1D009A59465346FA +:10A49000009505F0E6FFE08B504480B2E083B98878 +:10A4A000884209D1012508E0FFE7801C4FF0010A2E +:10A4B00080B2C9E7002009E60025CDE90095238A8E +:10A4C000072231460398FFF7C4FDE089401EE08172 +:10A4D0008DB1A078401CA0707068F178427811FBB3 +:10A4E00002F1CAB2816901230E3006F0E8F880F863 +:10A4F00000800020E08372686D493046921DFFF7AE +:10A5000072FD7068817940297FF47AAF0120DDE522 +:10A5100070B5064648680D4614468179402910D129 +:10A5200004EB84011C2202EBC101084401F0E0F9B4 +:10A53000002806D06868294684713046BDE870401E +:10A5400059E770BDFEB50C460746002645E020469B +:10A5500001F097F9D8B360681C22417901EB8101C1 +:10A5600002EBC1014518688900B9FFDF02AB082280 +:10A5700007213846FFF7ADFD002833D002996078F7 +:10A5800016220A70801C4870042048806068407958 +:10A5900001F05CF901460298052307228180698950 +:10A5A000C1800820CDE9000621463846FFF751FD5D +:10A5B0006078801C6070A88969890844B0F5803F84 +:10A5C00000D3FFDFA88969890844A8816E81626889 +:10A5D00038492046521DFFF706FD60684179402941 +:10A5E000B5D10120FEBD30B5438C458BC3F3C70404 +:10A5F000002345B1838B641EED1AC38A6D1E1D4472 +:10A6000095FBF3F3E4B22CB1008918B1A04200D855 +:10A61000204603444FF6FF70834200D30346138065 +:10A620000C7030BD2DE9FC41074616460D464868C2 +:10A6300002EB86011C2202EBC10144186A4601A903 +:10A640002046FFF7D0FFA089618901448AB2BDF896 +:10A650000010914212D0081A00D50020608168686D +:10A66000407940280AD1204601F038F9002805D069 +:10A670006868294646713846FFF764FFBDE8FC81EB +:10A680002DE9FE4F8946804615465088032106F085 +:10A690008FF98346B8F8020040280DD240200CE024 +:10A6A00030000020BD9F0000CB9F0000D99F00001C +:10A6B000F1B80000DDB80000403880B282460146A3 +:10A6C000584601F0DEF800287ED00AEB8A001C22F2 +:10A6D000DBF8041002EBC0000C18204601F0E7F88C +:10A6E000002877D1B8F80000E18A88423CD8A189D7 +:10A6F000D1B348456ED100265146584601F0AEF818 +:10A70000218C0F18608B48B9B9F1020F62D3B8F8E9 +:10A7100004006083618A884226D80226A9EB0600DD +:10A720001FFA80F9B888A28B801A002814DD4946E8 +:10A73000814500DA084683B2688869680291396801 +:10A740000A44CDE9003206F065FADDE90121F61D83 +:10A75000009B009605F051FEA18B01EB090080B231 +:10A76000A083618B884207D9688803B05246594656 +:10A77000BDE8F04F01F0D9B81FD14FF009002872A1 +:10A78000B8F802006881D7E90001C5E90401608BCF +:10A79000A881284601F050F85146584601F05EF86D +:10A7A0000146DBF8040008230078C20004F1200011 +:10A7B00005F0BBFF0020A0836083A0890AF0FF02A0 +:10A7C000401EA081688800E004E003B05946BDE85F +:10A7D000F04F27E7BDE8FE8F2DE9F041064615460C +:10A7E0000F461C46184609F099FD18B9206809F073 +:10A7F000BBFD08B1102015E47168688C0978B0EBD6 +:10A80000C10F01D313200DE43946304601F026F87C +:10A810000146706808230078C20005F1200005F0A9 +:10A820004EFFD4E90012C0E900120020E3E710B5A2 +:10A830000446032106F0BCF80146007800F003004E +:10A84000022805D02046BDE8104001F114029AE428 +:10A850008A8A2046BDE81040C8E470B5044603214A +:10A8600006F0A6F8054601462046FFF774FD0028CD +:10A8700016D029462046FFF765FE002810D029464D +:10A880002046FFF723FD00280AD029462046FFF77F +:10A89000CCFC002804D029462046BDE87040AAE53B +:10A8A00070BD2DE9F0410C4680461EE0E17842780B +:10A8B00011FB02F1CAB2816901230E3005F035FFA8 +:10A8C000077860681C22C179491EC17107EB8701B6 +:10A8D000606802EBC10146183946204600F0D1FFFE +:10A8E00018B1304600F0DCFF20B16068C179002962 +:10A8F000DCD180E7FEF78EFD050000D1FFDF0A20E6 +:10A900002872384600F0A2FF68813946204600F0E0 +:10A91000ACFF0146606808234078C20006F12400BD +:10A9200005F003FFD0E90010C5E90310A5F8028087 +:10A93000284600F081FFB07800B9FFDFB078401EF4 +:10A94000B07058E770B50C460546032106F030F8A4 +:10A9500001464068C2792244C2712846BDE8704071 +:10A960009FE72DE9FE4F8246507814460F464FF080 +:10A97000000800284FD0012807D0022822D0FFDF8E +:10A980002068B8606068F86024E702AB0E220821F6 +:10A990005046FFF79EFB0028F2D0029815210523B0 +:10A9A0000170217841700A214180C0F80480C0F80C +:10A9B0000880A0F80C80628882810E20CDE9000812 +:10A9C000082221E0A678304600F040FF054606EB5D +:10A9D00086012C22786802EBC1010822465A02AB9C +:10A9E00011465046FFF775FB0028C9D00298072191 +:10A9F0000170217841700421418008218580C68042 +:10AA0000CDE9001805230A4639465046FFF721FBD9 +:10AA100087F80880DEE6A678022516B1022E13D04C +:10AA2000FFDF2A1D914602AB08215046FFF751FB7C +:10AA30000028A5D002980121022E017021784170D2 +:10AA40004580868002D005E00625EAE7A188C1801E +:10AA5000E1880181CDE90098052308223946504656 +:10AA6000D4E710B50446032105F0A2FF014600F12A +:10AA700008022046BDE8104073E72DE9F05F0C4660 +:10AA800001281DD0957992F80480567905EB85014F +:10AA90001F2202EBC10121F0030B08EB060111FBA1 +:10AAA00005F14FF6FF7202EAC10909F1030115FB36 +:10AAB0000611F94F21F0031A40B101283DD124E0DD +:10AAC0006168E57891F800804E78DFE7594678684C +:10AAD00005F0A9FD606000B9FFDF5946606819F014 +:10AAE00008FCE5705146786805F09DFD6168486195 +:10AAF00000B9FFDF6068426902EB090181616068AB +:10AB000080F800806068467017E0606852464169CE +:10AB1000786805F0B3FD5A466168786805F0AEFDC7 +:10AB2000032005F0EDFE0446032005F0F1FE201A97 +:10AB3000012802D1786805F06BFD0BEB0A00BDE837 +:10AB4000F09F02460021022097E773B5D24D0A20FC +:10AB50002870009848B100244FEA0D0005F045FD2B +:10AB6000002C01D1009969607CBD01240020F5E72B +:10AB700070B50C4615463821204619F0BAFB01265F +:10AB800066700A2104F11C0019F0B3FB05B9FFDF60 +:10AB9000297A207861F301002070A879002817D065 +:10ABA0002A4621460020FFF768FF61684020887030 +:10ABB0006168C8706168087161684871616888710E +:10ABC0006168288808816168688848816068868132 +:10ABD00070BDC878002802D0002201204DE77047E0 +:10ABE00070B50546002165F31F41002009F04AFBBE +:10ABF0000321284605F0DCFE040000D1FFDF2146DA +:10AC00002846FFF769F9002804D0207840F01000AA +:10AC10002070012070BD2DE9FF4180460E460F0CCB +:10AC2000FEF7F8FB050007D06F800321384605F0DA +:10AC3000BFFE040008D106E004B03846BDE8F0418C +:10AC40001321F9F7FBBEFFDF5FEA080005D0B8F17A +:10AC5000070F18D0FFDFBDE8FF8120782A4620F0DB +:10AC6000080020700020ADF8020002208DF80000DE +:10AC70004FF6FF70ADF80400ADF80600694638469F +:10AC8000F9F7EFFAE7E7C6F3072101EB81021C238E +:10AC9000606803EBC202805C042803D008280AD055 +:10ACA000FFDFD8E7012000904FF440432A462046BA +:10ACB00000F004FECFE704B02A462046BDE8F0418C +:10ACC000FFF7E9B82DE9F05F0027B0F80A90904649 +:10ACD0000C4605463E46B9F1400F01D2402001E046 +:10ACE000A9F140001FFA80FA287AC01E08286BD20A +:10ACF000DFE800F00D04192058363C477227102673 +:10AD0000002C6CD0D5E90301C4E902015CE0702796 +:10AD10001226002C63D00A2205F10C0104F1080070 +:10AD200019F08BFA50E071270C26002C57D0E868F8 +:10AD3000A06049E0742710269CB3D5E90301C4E95B +:10AD400002016888032105F033FE8346FEF762FBAB +:10AD500002466888508051465846FFF753F833E062 +:10AD600075270A26ECB1A88920812DE076271426C4 +:10AD7000BCB105F10C0004F1080307C883E8070023 +:10AD800022E07727102664B1D5E90301C4E9020166 +:10AD90006888032105F00CFE01466888FFF781FDF5 +:10ADA00012E01CE073270826CCB16888032105F067 +:10ADB000FFFD01460078C00606D56888FFF78CF8CD +:10ADC00010B96888F8F71DFEA8F800602CB127803C +:10ADD000A4F8069066806888A0800020AFE6A8F8F6 +:10ADE0000060FAE72DE9FC410C461E4617468046F6 +:10ADF000032105F0DDFD05460A2C0AD2DFE804F048 +:10AE000005050505050509090907042303E00623CF +:10AE100001E0FFDF0023CDE90076224629464046C7 +:10AE2000FFF717F92AE438B50546A0F57F40FF384B +:10AE300030D0284605F0EEFE040000D1FFDF2046AA +:10AE400005F073FA002815D001466A46204605F041 +:10AE50008EFA00980321B0F80540284605F0A8FDB9 +:10AE60000546052C03D0402C05D2402404E0007A8E +:10AE700080B1002038BD403CA4B2214600F001FD65 +:10AE800040B1686804EB84013E2202EBC101405AE4 +:10AE90000028EFD0012038BD300000202DE9F04F10 +:10AEA000044689B0408805F0B5FE050000D1FFDFFB +:10AEB00006AA2846616800F0BDFC069D001F81B20D +:10AEC00035F8032F6B888A4205D1042B0AD0052B55 +:10AED0001DD0062B15D022462846FFF7D1FB09B01E +:10AEE000BDE8F08F16462D1D224629463046F7F75D +:10AEF00054FA0828F3D1224629463046FCF749FC8B +:10AF0000EDE76088291D6368FAF7C8FCE7E7174694 +:10AF10006088032105F04CFD4FF000088DF8048097 +:10AF20000646ADF80680042FD9D36A79002AD6D018 +:10AF300028794FF6FF794FF01C0A13282CD008DC33 +:10AF4000012878D0062847D0072875D0122874D158 +:10AF500006E0142872D0152871D016286DD1ACE106 +:10AF60000C2F6AD1307800F00301022965D140F03E +:10AF7000080030706879B07001208DF804002889CD +:10AF8000ADF808006889ADF80A00A889ADF80C0092 +:10AF9000E889ADF80E0019E0B07890429FD1307882 +:10AFA00001079CD5062F9AD120F0080030706088E8 +:10AFB000414660F31F41002009F064F902208DF83A +:10AFC0000400ADF808902889ADF80A006088224690 +:10AFD00001A9F9F746F982E7082F80D12F89B5F842 +:10AFE0000A90402F01D2402001E0A7F1400080B23A +:10AFF00080460146304600F044FC08B3716808EB17 +:10B0000088002C2202EBC000095A4945E3D1FE48D2 +:10B0100007AAD0E90210CDE9071068798DF81C0065 +:10B0200008F0FF058DF81E5060883146FFF799FC47 +:10B030002246294639E0B6E014E03CE039E0E6E09B +:10B04000F148D0E90010CDE907106879ADF820701B +:10B050008DF81C00ADF82290608807AA3146FFF7F2 +:10B0600080FC3CE7082FB6D16889B5F808804028F5 +:10B0700001D2402000E0403887B23946304600F027 +:10B0800000FC0028A7D007EB870271680AEBC2001A +:10B090000844028A42459ED1017808299BD1407814 +:10B0A0006979884297D1F9B222463046FEF7F3FE1D +:10B0B00015E70E2F07D0CDF81C80CDF820806879D9 +:10B0C0008DF81C00C8E76989EF898B46B5F80C90AC +:10B0D0003046FEF742FFABF14001402901D3092081 +:10B0E0004AE0B9F1170F01D3172F01D20B2043E02B +:10B0F00040280ED000EB800271680AEBC2000844C1 +:10B100000178012903D1407869798842A9D00A20C1 +:10B1100032E03046FEF703FF014640282BD001EB1A +:10B12000810372680AEBC30002EB0008012288F871 +:10B1300000206A7988F8012070682A894089B8421D +:10B1400000D938462D8A03232372A282E781208208 +:10B15000A4F80C906582084600F078FB6081A8F89E +:10B160001490A8F81870A8F80E50A8F810B020464F +:10B1700000F062FBB3E6042005212172A4F80A80E6 +:10B18000E08101212173A049D1E90421CDE9072102 +:10B1900069798DF81C10ADF81E00608807AA314649 +:10B1A000FFF7DFFBE3E7062FE4D3B078904215D139 +:10B1B0003078010712D520F00800307060884146D1 +:10B1C00060F31F41002009F05DF802208DF80400B3 +:10B1D0002889ADF80800ADF80A90F7E6042130465A +:10B1E000FEF7D3FE05464028C4D00220830300901A +:10B1F00022462946304600F061FB4146608865F3EF +:10B200000F2160F31F41072009F03CF867E60E2F7D +:10B21000B0D104213046FEF7B8FE81464028A9D0BF +:10B220004146608869F30F2160F31F41072009F050 +:10B2300029F8288A0790E88900907068AF894089CA +:10B24000B84200D938468346B5F80A802889059067 +:10B25000484600F0FBFA6081079840B10220079B46 +:10B26000009022464946304600F028FB37E6B8F108 +:10B27000170F1ED3172F1CD3042020720098608252 +:10B28000E781A4F810B0A4F80C8009EB890271687A +:10B290000AEBC2000D1800990598A5F81480A5F8CE +:10B2A00018B0E9812882204600F0C6FA06202870EE +:10B2B00015E601200B230090D3E7082FA6D129899A +:10B2C0003046FEF74AFE074640289FD007EB87022C +:10B2D00071680AEBC2000844804600F0E8FA0028D2 +:10B2E00094D16D89B8F80E002844B0F5803F05D39D +:10B2F00060883A46314600F018FBF0E5002D85D015 +:10B30000A8F80E0060883A463146FFF701F9082098 +:10B310002072384600F09AFA6081A58127E770B55F +:10B320000D460646032105F043FB040004D02078B7 +:10B33000000704D5112070BD43F2020070BD2A46FB +:10B3400021463046FEF71FFF18B92868606168681B +:10B35000A061207840F008002070002070BD70B51A +:10B360000D460646032105F023FB040004D0207897 +:10B37000000704D4082070BD43F2020070BD2A46C5 +:10B3800021463046FEF732FF00B9A582207820F032 +:10B3900008002070002070BD2DE9F04F0E4691B0DE +:10B3A0008046032105F004FB0446404605F044FCBA +:10B3B00007460020079008900990ADF830000A90E9 +:10B3C00002900390049004B9FFDF0DF1080917BB48 +:10B3D000FFDF20E038460BA9002204F069FE9DF84B +:10B3E0002C0000F07F050A2D00D3FFDF6019017FDC +:10B3F000491E01779DF82C0000060CD52A460CA9A1 +:10B4000007A8FEF716FE01E0D846020019F805105D +:10B41000491C09F80510761EF6B2DBD204F134009F +:10B42000FA4D04F1260BDFF8E8A304F12A07069091 +:10B4300010E05846069900F06AFA064628700A2875 +:10B4400000D3FFDF5AF8261040468847E08CC05DE5 +:10B45000B04202D0208D0028EBD10A202870EC4D9C +:10B460004E4628350EE00CA907A800F050FA044615 +:10B47000375D55F8240000B9FFDF55F82420394620 +:10B4800040469047BDF81E000028ECD111B027E5DA +:10B4900010B5032105F08CFA040000D1FFDF0A216A +:10B4A00004F11C0018F025FF207840F00400207003 +:10B4B00010BD10B50C46032105F07AFA2044007F38 +:10B4C000002800D0012010BD2DE9F84F894615460F +:10B4D0008246032105F06CFA070004D0284608F0E4 +:10B4E0001DFF40B903E043F20200BDE8F88F484673 +:10B4F00008F03AFF08B11020F7E7786828B16988AA +:10B500000089814201D90920EFE7B9F800001C2425 +:10B5100018B1402809D2402008E03846FEF7FFFC69 +:10B520008046402819D11320DFE7403880B280469A +:10B530000146384600F0A5F948B108EB8800796863 +:10B5400004EBC000085C012803D00820CDE70520EB +:10B55000CBE7FDF75FFF06000BD008EB88007968AA +:10B5600004EBC0000C18B9F8000020B1E88910B154 +:10B5700013E01120B9E72888172802D36888172814 +:10B5800001D20720B1E7686838B12B1D2246414639 +:10B590003846FFF721F90028A7D104F10C026946CB +:10B5A0002046FFF720F8288860826888E082B9F892 +:10B5B000000030B102202070E889A080E889A0B1A5 +:10B5C0002BE003202070A889A0807868817840292A +:10B5D00005D180F8028039465046FEF726FE4046E7 +:10B5E00000F034F9A9F8000021E07868218B408947 +:10B5F000884200D908462083A6F802A004203072B1 +:10B60000B9F800007081E0897082F181208B30826E +:10B61000A08AB081304600F00FF97868C1784029DF +:10B6200005D180F8038039465046FEF74FFE0020D2 +:10B630005BE770B50D460646032105F0B9F9040035 +:10B6400003D0402D04D2402503E043F2020070BD38 +:10B65000403DADB2294600F014F958B105EB850123 +:10B660001C22606802EBC101084400F020F918B107 +:10B67000082070BD052070BD2A462146304600F0E6 +:10B6800054F9002070BD2DE9F0410D461646804664 +:10B69000032105F08DF90446402D01D2402500E03C +:10B6A000403DADB28CB1294600F0EBF880B105EB1E +:10B6B00085011C22606802EBC1014718384600F082 +:10B6C000F6F838B10820BDE8F08143F20200FAE74D +:10B6D0000520F8E733463A4629462046FFF77CF82E +:10B6E0000028F0D1EAB221464046FEF79BFF002039 +:10B6F000E9E72DE9F0410D4616468046032105F0A5 +:10B7000057F90446402D01D2402500E0403DAFB23C +:10B7100024B1304608F002FE38B902E043F20200DC +:10B72000D1E7306808F0FAFD08B11020CBE73946C0 +:10B73000204600F0A6F860B107EB87011C22606884 +:10B7400002EBC1014518284600F0B1F818B10820F5 +:10B75000B9E70520B7E7B088A98A884201D90C204B +:10B76000B1E76168E88C4978B0EBC10F01D31320D1 +:10B77000A9E73946204600F078F8014660680823BA +:10B780004078C20005F1240004F099FFD6E90012C8 +:10B79000C0E90012FAB221464046FEF7B9FE002089 +:10B7A00091E72DE9F0470D461F469046814603215B +:10B7B00005F0FEF80446402D01D2402001E0A5F13D +:10B7C000400086B23CB14DB1384608F0EBFD50B1B7 +:10B7D0001020BDE8F08743F20200FAE76068C8B1C4 +:10B7E000A0F80C8024E03146204600F04AF888B1E9 +:10B7F00006EB86011C22606802EBC1014518284651 +:10B8000000F055F840B10820E3E7000030000020C8 +:10B81000F04602000520DCE7A5F80880F2B22146D8 +:10B820004846FEF7FFFE1FB1A889698908443880A1 +:10B830000020CEE704F09BBD017821F00F01491CE8 +:10B8400021F0F00110310170FDF7E7BD10B504469D +:10B85000402800D9FFDF4034A0B210BD40684269E3 +:10B860000078484302EBC0007047C2784068037814 +:10B8700012FB03F24378406901FB032100EBC10096 +:10B880007047C2788A4209D9406801EB81011C22C5 +:10B8900002EBC101405C08B10120704700207047F5 +:10B8A0000078062801D901207047002070470078F1 +:10B8B000062801D00120704700207047F0B401EB4A +:10B8C00081061C27446807EBC6063444049D052600 +:10B8D0002670E3802571F0BCFEF794BA10B541895B +:10B8E00011B1FFF7DDFF08B1002010BD012010BD30 +:10B8F00010B5C18C8278B1EBC20F04D9C18911B1E6 +:10B90000FFF7CEFF08B1002010BD012010BD10B51B +:10B910000C4601230A22011D04F007FF007821884C +:10B92000012282409143218010BDF0B402EB8205D8 +:10B930001C264C6806EBC505072363554B681C792C +:10B94000402C03D11A71F0BCFEF705BDF0BC704766 +:10B9500010B5EFF3108000F0010472B6EE484178A4 +:10B96000491C41704078012801D1F7F70DFB002CEC +:10B9700000D162B610BD70B5E74CE07848B901253A +:10B98000E570FFF7E5FFF7F707FB20B1002008F0AF +:10B990000AF9002070BD4FF080406571C0F8045373 +:10B9A000F7E770B5EFF3108000F0010572B6DA4CDE +:10B9B000607800B9FFDF6078401E6070607808B979 +:10B9C000F7F7E6FA002D00D162B670BDD24810B587 +:10B9D000C17821B100214171C170FFF7E2FF002061 +:10B9E00010BD10B50446F7F7D7FACB49C97808401F +:10B9F00000D001202060002010BD2DE9F05FDFF8AD +:10BA000018934278817889F80620002589F8071074 +:10BA1000064689F8085000782F4620B101280FD03B +:10BA200002280FD0FFDFF7F7C4FA98B1F7F7C8FA8A +:10BA3000A8420FD12846F7F7C7FA0028FAD047E006 +:10BA40000125F0E7FFF784FFF7F7A6FA0028FBD0FF +:10BA50000225E8E701208407E060C4F80471AF49DB +:10BA60000D600107D1F84412AC4AC1F342312432CF +:10BA70001160AA49343108604FF0020BC4F804B3D6 +:10BA8000A060DFF89CA2DAF80010C94341F300116E +:10BA900001F10108DAF8001041F01001CAF80010B5 +:10BAA00000E020BFD4F804010028FAD02846F7F7B8 +:10BAB0008BFA0028FAD0B8F1000F05D1DAF800109F +:10BAC00021F01001CAF80010C4F808B3C4F80471DA +:10BAD00099F807004C4670B1307860B9F7F75CFA16 +:10BAE000064608F0BDF96FF0004116B1C4E9031035 +:10BAF00001E0C4E9030115B12771BDE8F09F012001 +:10BB00002071BDE8F05F00F0ABB870B5050000D162 +:10BB1000FFDF4FF080424FF0FF30C2F808030021F2 +:10BB2000C2F80011C2F80411C2F80C11C2F81011C9 +:10BB3000794C6170F7F736FA10B10120E07060704F +:10BB40002846BDE8704058E72DE9F05F7548D0F809 +:10BB500000B0744A7449083211608406D4F80801B0 +:10BB600008B1012600E00026D4F8000110B14FF022 +:10BB7000010801E04FF00008D4F8040108B10127E2 +:10BB800000E00027D4F80C0100B101208246D4F86F +:10BB9000100108B1012100E00021894646EA0801B0 +:10BBA00027EA010020EA0A0030EA090000D0FFDF9E +:10BBB000002526B1C4F80851012007F0F4FF564EC5 +:10BBC000B8F1000F10D0C4F80051707918B1757138 +:10BBD000002007F0E8FF307830B10120534935707C +:10BBE000B07002220A6020610FB1C4F80451BAF1AA +:10BBF000000F0BD0C4F80C51B07800B9FFDF4B48F0 +:10BC00000560B57001206061FFF7CBFEB9F1000F50 +:10BC100005D0C4F81051307908B100F045F8414919 +:10BC2000091DC1F800B068E770B53B4DE87808B968 +:10BC3000F7F7AEF901208407A061A87858B100BFDA +:10BC4000D4F80C0120B90020F7F7BEF90028F7D18D +:10BC50000020C4F80C014FF0FF30C4F8080370BD99 +:10BC60002DE9F0411926B407C4F808630125A56140 +:10BC70000020C4F80001C4F80C01C4F81001F7F763 +:10BC80008BF9254F28B12949BD7002200860256134 +:10BC900000E03D70FFF75CFE2049B8792031086074 +:10BCA000C4F80463BDE8F0812DE9F0411A4C4FF06F +:10BCB00080470125E079F0B1012803D0217A401EA8 +:10BCC000814218DAF7F768F9064608F0C9F8E17911 +:10BCD000012902D9217A491C21720EB1216900E0A3 +:10BCE000E168411A022902DA11F1020F0EDC0EB1ED +:10BCF000206100E0E060FFF72BFEF7F74DF938B167 +:10BD00000A49022008603D61A57002E07D61C9E733 +:10BD1000257000202072C5E73C0000201805004077 +:10BD200010ED00E01005024001000001340C00405D +:10BD30004FF0E0214FF00070C1F88001C1F880029F +:10BD4000384B802283F80024C1F80001704700B509 +:10BD500002460420344903E001EBC0031B792BB1F8 +:10BD6000401EC0B2F8D2FFDFFF2000BD41F83020F6 +:10BD700001EBC00100224A718A7101220A7100BDE3 +:10BD8000294A002102EBC0000171704710B504463A +:10BD9000042800D3FFDF244800EBC40420790128E5 +:10BDA00000D0FFDF6079A179401CC0B2814200D091 +:10BDB00060714FF0E0214FF00070C1F8000210BD3B +:10BDC0002DE9F041194805681849194808310860FB +:10BDD0001448042690F80004134F4009154C042819 +:10BDE00018D0FFDF16E0217807EBC1000279012AA5 +:10BDF00008D1427983799A4204D04279827157F806 +:10BE0000310080472078401CC0B22070042801D344 +:10BE100000202070761EF6B2E5D20448001D0560B1 +:10BE2000BDE8F08119E000E0C805002010050240DF +:10BE30000100000150000020F8B51D46DDE906476D +:10BE40000E000AD004F0F8FE2346FF1DBCB23146B6 +:10BE50002A46009404F005FBF8BDD0192246194685 +:10BE600018F0A6F92046F8BD70B50D46044610211D +:10BE700018F01DFA258117206081A07B40F00A0090 +:10BE8000A07370BD4FF6FF720A800146022008F0D1 +:10BE9000F9B9704700897047827BD30701D19207B7 +:10BEA00003D4808908800020704705207047827B7A +:10BEB000920700D58181704701460020098841F62C +:10BEC000FE52114200D00120704700B50346807B2E +:10BED000C00701D0052000BD59811846FFF7ECFFCF +:10BEE000C00703D0987B40F004009873987B40F023 +:10BEF00001009873002000BD827B520700D509B174 +:10BF00004089704717207047827B61F3C3028273B8 +:10BF100070472DE9FC5F0E460446017896460120E5 +:10BF200000FA01F14DF6FF5201EA020962684FF68C +:10BF3000FF7B1188594502D10920BDE8FC9FB9F16A +:10BF4000000F05D041F6FE55294201D00120F4E74B +:10BF500041EA090111801D0014D04FF0000C85F852 +:10BF600000C023780521032267464FF0020A0E2BFA +:10BF700074D2DFE803F0F809252F4762697447900F +:10BF800092B3D0D70420D8E7616820898B7B9B07C8 +:10BF90007DD5172848D30B89834245D38989172932 +:10BFA00001D3814240D185F800A0A5F8010032807C +:10BFB000616888816068817B21F002018173C5E03E +:10BFC000042028702089A5F801006089A5F80300E5 +:10BFD0003180BBE0208A3188C01D1FFA80F84145BE +:10BFE00022D3062028702089A5F801006089A5F8D1 +:10BFF0000300A089A5F805000721208ACDE90001EA +:10C0000063693EE0082B10D0082028702089A5F82D +:10C0100001006089A5F8030031806A1D694604F1BA +:10C020000C0006F066FA10B15FE01020EDE73088F2 +:10C030009DF800100844308088E00A20287020898C +:10C04000A5F80100328045E00C2028702089A5F871 +:10C0500001006089A5F8030031803BE083E021897D +:10C06000338800EB41021FFA82F843453DD3B8F113 +:10C07000050F3AD30E222A700BEA4101CDE90010D8 +:10C08000E36860882A467146FFF7D6FE00E04DE07F +:10C09000A6F800805AE04020287060893188C01CD2 +:10C0A0001FFA80F8414520D32878714620F03F00E0 +:10C0B000123028702089A5F801006089CDE90002BE +:10C0C00060882A46E368FFF7B7FEA6F80080287864 +:10C0D00040063BD461682089888037E0A089328897 +:10C0E000401D1FFA80F8424501D204273EE0162089 +:10C0F00028702089A5F801006089A5F80300A089AF +:10C10000CDE9000160882A4671462369FFF794FE55 +:10C11000A6F80080DEE718202870207A6870A6F85C +:10C1200000A013E061680A88920401D405271DE08D +:10C13000C9882289914201D0062717E01E21297063 +:10C1400030806068018821F400510180B9F1000F4E +:10C150000CD0618878230022022007F0E9FF616893 +:10C160002078887007E0A6F800C00327606801887F +:10C1700021EA090101803846DFE62DE9FF4F85B04D +:10C180001746129C0D001E461CD03078C10703D004 +:10C1900000F03F00192801D9012100E000212046CC +:10C1A000FFF7AAFEA8420DD32088A0F57F41FF39F2 +:10C1B00008D03078410601D4000605D5082009B022 +:10C1C000BDE8F08F0720FAE700208DF800008DF819 +:10C1D000010030786B1E00F03F0C0121A81E4FF0CB +:10C1E000050A4FF002094FF0030B9AB2BCF1200F81 +:10C1F00075D2DFE80CF08B10745E7468748C749CDC +:10C2000074B674BB74C974D574E2747474F274F047 +:10C2100074EF74EE748B052D78D18DF80090A078B2 +:10C220008DF804007088ADF8060030798DF80100B3 +:10C23000707800F03F000C2829D00ADCA0F1020041 +:10C24000092863D2DFE800F0126215621A621D62EB +:10C250002000122824D004DC0E281BD01028DBD1AB +:10C260001BE016281FD01828D6D11FE020788007A1 +:10C2700001E020784007002848DAEFE02078000746 +:10C28000F9E72078C006F6E720788006F3E7207803 +:10C290004006F0E720780006EDE72088C005EAE7D1 +:10C2A00020884005E7E720880005E4E72088C004EF +:10C2B000E1E72078800729D5032D27D18DF800B03C +:10C2C000B6F8010082E0217849071FD5062D1DD35D +:10C2D00081B27078012803D0022817D102E0CAE0A9 +:10C2E000022000E0102004228DF8002072788DF8E2 +:10C2F0000420801CB1FBF0F2ADF8062092B242435C +:10C300008A4203D10397ADF80890A7E07AE020783D +:10C31000000777D598B282088DF800A0ADF8042008 +:10C32000B0EB820F6ED10297ADF8061096E021783F +:10C33000C90667D5022D65D381B206208DF80000AD +:10C34000707802285ED300BFB1FBF0F28DF80400D4 +:10C35000ADF8062092B242438A4253D1ADF808901C +:10C360007BE0207880064DD5072003E0207840064A +:10C370007FD508208DF80000A088ADF80400ADF846 +:10C380000620ADF8081068E02078000671D5092075 +:10C39000ADF804208DF80000ADF8061002975DE0BE +:10C3A0002188C90565D5022D63D381B20A208DF895 +:10C3B0000000707804285CD3C6E72088400558D573 +:10C3C000012D56D10B208DF80000A088ADF8040097 +:10C3D00044E021E026E016E0FFE72088000548D58C +:10C3E000052D46D30C208DF80000A088ADF8040080 +:10C3F000B6F803006D1FADF80850ADF80600ADF8B3 +:10C400000AA02AE035E02088C00432D5012D30D1C1 +:10C410000D208DF8000021E02088800429D4B6F892 +:10C420000100E080A07B000723D5032D21D33078C5 +:10C4300000F03F001B2818D00F208DF80000208846 +:10C4400040F40050A4F80000B6F80100ADF8040074 +:10C45000ED1EADF80650ADF808B003976946059893 +:10C46000F5F7E6FC050008D016E00E208DF8000078 +:10C47000EAE7072510E008250EE0307800F03F00DD +:10C480001B2809D01D2807D00220059907F0FAFEC5 +:10C49000208800F400502080A07B400708D520466B +:10C4A000FFF70AFDC00703D1A07B20F00400A073B2 +:10C4B000284684E61FB5022806D101208DF8000029 +:10C4C00088B26946F5F7B4FC1FBD0000F8B51D46FB +:10C4D000DDE906470E000AD004F0AEFB2346FF1D3F +:10C4E000BCB231462A46009403F0BBFFF8BDD01918 +:10C4F0002246194617F05CFE2046F8BD2DE9FF4F95 +:10C500008DB09B46DDE91B57DDF87CA00C46082B5F +:10C5100005D0E06901F002F950B11020D2E028887E +:10C52000092140F0100028808AF80010022617E048 +:10C53000E16901208871E2694FF420519180E1693D +:10C540008872E06942F601010181E069002181738E +:10C550002888112140F0200028808AF80010042645 +:10C5600038780A900A2038704FF0020904F1180058 +:10C570004D460C9001F095FBB04681E0BBF1100FE9 +:10C580000ED1022D0CD0A9EB0800801C80B2022134 +:10C59000CDE9001005AB52461E990D98FFF796FFA6 +:10C5A000BDF816101A98814203D9F74800790F9008 +:10C5B00004E003D10A9808B138702FE04FF002016F +:10C5C000CDE900190DF1160352461E990D98FFF79B +:10C5D0007DFF1D980088401B801B83B2C6F1FF00C1 +:10C5E000984200D203461E990BA8D9B15FF0000211 +:10C5F000DDF878C0CDE9032009EB060189B2CDE969 +:10C6000001C10F980090BDF8161000220D9801F09E +:10C61000CBFB387070B1C0B2832807D0BDF81600CC +:10C6200020833AE00AEB09018A19E1E7022011B000 +:10C63000BDE8F08FBDF82C00811901F0FF08022D34 +:10C640000DD09AF80120424506D1BDF82010814254 +:10C6500007D0B8F1FF0F04D09AF801801FE08AF8E4 +:10C660000180C94800680178052902D1BDF816107B +:10C67000818009EB08001FFA80F905EB080085B2FC +:10C68000DDE90C1005AB0F9A01F00EFB28B91D98DF +:10C690000088411B4145BFF671AF022D13D0BBF19D +:10C6A000100F0CD1A9EB0800801C81B20220CDE94B +:10C6B000000105AB52461E990D98FFF707FF1D9824 +:10C6C0000580002038700020B1E72DE9F8439C4632 +:10C6D000089E13460027B26B9AB3491F8CB2F18FA4 +:10C6E000A1F57F45FF3D05D05518AD882944891D2A +:10C6F0008DB200E000252919B6F83C80083141458B +:10C7000020D82A44BCF8011022F8021BBCF8031000 +:10C7100022F8021B984622F8024B914604F07AFA5E +:10C720004FF00C0C41464A462346CDF800C003F0BA +:10C7300064FEF587B16B00202944A41D21440880C4 +:10C7400003E001E0092700E083273846BDE8F883CD +:10C7500010B50B88848F9C420CD9846BE018048838 +:10C7600044B1848824F40044A41D23440B80106049 +:10C77000002010BD0A2010BD2DE9F0478AB0002529 +:10C78000904689468246ADF8185007274BE0059839 +:10C7900006888088000446D4A8F8006007A80195A0 +:10C7A00000970295CDE903504FF400730022314603 +:10C7B000504601F0F9FA04003CD1BDF81800ADF87C +:10C7C0002000059804888188B44216D10A0414D444 +:10C7D00001950295039521F400410097049541F4D9 +:10C7E000804342882146504601F0B4F804000BD142 +:10C7F0000598818841F40041818005AA08A948462E +:10C80000FFF7A6FF0400DCD000970598029501957C +:10C81000039504950188BDF81C300022504601F0B4 +:10C8200099F80A2C06D105AA06A94846FFF790FFF9 +:10C830000400ACD0ADF8185004E00598818821F4CC +:10C840000041818005AA06A94846FFF781FF00281C +:10C85000F3D00A2C03D020460AB0BDE8F0870020B0 +:10C86000FAE710B50C46896B86B051B10C218DF8F2 +:10C870000010A18FADF80810A16B01916946FAF77D +:10C8800064FC00204FF6FF71A063E187A08706B02B +:10C8900010BD2DE9F0410D460746896B0020069E2C +:10C8A0001446002911D0012B0FD1324629463846B3 +:10C8B000FFF762FF002808D1002C06D03246294637 +:10C8C0003846BDE8F04100F038BFBDE8F0812DE901 +:10C8D000FC411446DDE9087C0E46DDE90A15521DCF +:10C8E000BCF800E092B2964502D20720BDE8FC8178 +:10C8F000ACF8002017222A70A5F80160A5F80330D3 +:10C900000522CDE900423B462A46FFF7DFFD002025 +:10C91000ECE770B50C4615464821204617F0E9FCB7 +:10C9200004F1080044F81C0F00204FF6FF71E0618D +:10C9300061842084A5841720E08494F82A0040F0C4 +:10C940000A0084F82A0070BD4FF6FF720A80014683 +:10C95000032007F097BC30B585B00C460546FFF7BD +:10C9600080FFA18E284629B101218DF8001069466B +:10C97000FAF7EBFB0020E0622063606305B030BD96 +:10C98000B0F84000704700005400002090F84620A6 +:10C99000920703D4408808800020F3E70620F1E7DF +:10C9A00090F846209207EDD5A0F84410EAE701463A +:10C9B000002009880A0700D5012011F0F00F01D0EE +:10C9C00040F00200CA0501D540F004008A0501D5F7 +:10C9D00040F008004A0501D540F010000905D1D506 +:10C9E00040F02000CEE700B5034690F84600C007AF +:10C9F00001D0062000BDA3F842101846FFF7D7FF6C +:10CA000010F03E0F05D093F8460040F0040083F884 +:10CA1000460013F8460F40F001001870002000BDDA +:10CA200090F84620520700D511B1B0F84200A9E7AE +:10CA30001720A7E710F8462F61F3C3020270A1E7A1 +:10CA40002DE9FF4F9BB00E00DDE92B34DDE929789D +:10CA5000289D24D02878C10703D000F03F00192872 +:10CA600001D9012100E000212046FFF7D9FFB042A3 +:10CA700015D32878410600F03F010CD41E290CD0B4 +:10CA8000218811F47F6F0AD13A8842B1A1F57F4223 +:10CA9000FF3A04D001E0122901D1000602D504209A +:10CAA0001FB0C5E5F9491D984FF0000A08718DF8CF +:10CAB00018A08DF83CA00FAA0A60ADF81CA0ADF834 +:10CAC00050A02978994601F03F02701F5B1C04F1C9 +:10CAD000180C4FF0060E4FF0040BCDF858C01F2A6B +:10CAE0007ED2DFE802F07D7D107D267DAC7DF47D79 +:10CAF000F37DF27DF17DF47DF07D7D7DEF7DEE7D3A +:10CB00007D7D7D7DED0094F84610B5F80100890724 +:10CB100001D5032E02D08DF818B022E34FF4006146 +:10CB2000ADF85010608003218DF83C10ADF8400046 +:10CB3000D8E2052EEFD1B5F801002083ADF81C0036 +:10CB4000B5F80310618308B1884201D901207FE163 +:10CB50000020A07220814FF6FF702084169801F00B +:10CB6000A0F8052089F800000220029083460AAB55 +:10CB70001D9A16991B9801F097F890BB9DF82E000E +:10CB8000012804D0022089F80100102003E00120D0 +:10CB900089F8010002200590002203A90BA805F0E6 +:10CBA000A8FCE8BB9DF80C00059981423DD13A886C +:10CBB000801CA2EB0B01814237DB02990220CDE9F8 +:10CBC00000010DF12A034A4641461B98FFF77EFCFF +:10CBD00002980BF1020B801C80B217AA03A901E096 +:10CBE000A0E228E002900BA805F083FC02999DF8D2 +:10CBF0000C00CDE9000117AB4A4641461B98FFF7F0 +:10CC000065FC9DF80C100AAB0BEB01001FFA80FBD2 +:10CC100002981D9A084480B2029016991B9800E071 +:10CC200003E001F041F80028B6D0BBF1020F02D0BA +:10CC3000A7F800B053E20A208DF818004FE2002157 +:10CC40000391072EFFF467AFB5F801002083ADF81C +:10CC50001C00B5F80320628300283FF477AF9042B0 +:10CC60003FF674AF0120A072B5F8050020810020C6 +:10CC7000A073E06900F052FD78B9E1690120887184 +:10CC8000E2694FF420519180E1698872E06942F6CF +:10CC900001010181E06900218173F01F20841E9849 +:10CCA000606207206084169800F0FBFF072089F877 +:10CCB00000000120049002900020ADF82A0028E036 +:10CCC0001DE2A3E13AE1EAE016E2AEE086E049E0E7 +:10CCD0000298012814D0E0698079012803D1BDF8B9 +:10CCE0002800ADF80E00049803ABCDE900B04A4629 +:10CCF00041461B98FFF7EAFB0498001D80B20490A0 +:10CD0000BDF82A00ADF80C00ADF80E00059880B211 +:10CD100002900AAB1D9A16991B9800F0C5FF28B91E +:10CD200002983988001D05908142D1D202980128CD +:10CD300081D0E0698079012805D0BDF82810A1F5DF +:10CD40007F40FF3803D1BDF82800ADF80E000498ED +:10CD500003ABCDE900B04A4641461B98FFF7B6FB4E +:10CD60000298BBE1072E02D0152E7FF4D4AEB5F8A1 +:10CD700001102183ADF81C10B5F80320628300294F +:10CD80003FF4E4AE91423FF6E1AE0121A1724FF0D3 +:10CD9000000BA4F808B084F80EB0052E07D0C0B27E +:10CDA000691DE26905F086FB00287FF444AF4FF669 +:10CDB000FF70208401A906AA14A8CDF800B081E86C +:10CDC00085032878214600F03F031D9A1B98FFF742 +:10CDD00095FB8246208BADF81C0080E10120032EDC +:10CDE000C3D14021ADF85010B5F801102183ADF842 +:10CDF0001C100AAAB8F1000F00D00023CDE90203ED +:10CE000004921D98CDF80480009038880022401EBE +:10CE100083B21B9800F0C8FF8DF8180090BB0B2060 +:10CE200089F80000BDF8280037E04FF0010C052E0E +:10CE30009BD18020ADF85000B5F801102183B5F8E2 +:10CE400003002084ADF81C10B0F5007F03D9072043 +:10CE50008DF8180085E140F47C4222840CA8B8F1DA +:10CE6000000F00D00023CDE90330CDE9018C1D98DF +:10CE700000903888401E83B21B9800F095FF8DF813 +:10CE8000180028B18328A8D10220BDE0540000205A +:10CE90000D2189F80010BDF83000401C1EE1032E62 +:10CEA00004D248067FF537AE002017E1B5F801102F +:10CEB000ADF81C102878400602D58DF83CE002E061 +:10CEC00007208DF83C004FF000080320CDE9020850 +:10CED0001E9BCDF810801D980193A6F1030B0090C6 +:10CEE0001FFA8BF342461B9800F034FD8DF81800B2 +:10CEF0008DF83C80297849060DD52088C00506D5D7 +:10CF0000208BBDF81C10884201D1C4F82480404613 +:10CF10008DF81880E2E0832801D14FF0020A4FF427 +:10CF20008070ADF85000BDF81C002083A4F820B03C +:10CF30001E986062032060841321CCE0052EFFF46C +:10CF4000EAADB5F80110ADF81C10A28F62B3A2F5DE +:10CF50007F43FE3B28D008228DF83C204FF0000B89 +:10CF60000523CDE9023BDDF878C0CDF810B01D9A5D +:10CF700080B2CDF804C040F400430092B5F803201D +:10CF80001B9800F0E7FC8DF83CB04FF400718DF871 +:10CF90001800ADF85010832810D0F8B1A18FA1F57A +:10CFA0007F40FE3807D0DCE00B228DF83C204FF6A6 +:10CFB000FE72A287D2E7A4F83CB0D2E000942B46E0 +:10CFC00031461E9A1B98FFF780FB8DF8180008B1B8 +:10CFD00083284BD1BDF81C00208355E700942B46D5 +:10CFE00031461E9A1B98FFF770FB8DF81800E8BBBE +:10CFF000E18FA06B0844811D8DE8820343888288FD +:10D0000001881B98FFF763FC824668E095F8018071 +:10D01000022E70D15FEA080002D0B8F1010F6AD188 +:10D0200009208DF83C0007A800908DF84080434609 +:10D03000002221461B98FFF72CFC8DF842004FF090 +:10D04000000B8DF843B050B9B8F1010F12D0B8F110 +:10D05000000F04D1A18FA1F57F40FF380AD0A08F27 +:10D0600040B18DF83CB04FF4806000E037E0ADF89F +:10D0700050000DE00FA91B98FAF767F882468DF86B +:10D080003CB04FF48060ADF85000BAF1020F06D00A +:10D09000FC480068C07928B18DF8180027E0A4F892 +:10D0A000188044E0BAF1000F03D081208DF81800F9 +:10D0B0003DE007A800904346012221461B98FFF758 +:10D0C000E8FB8DF8180021461B98FFF7CAFB9DF876 +:10D0D000180020B9192189F80010012038809DF826 +:10D0E0003C0020B10FA91B98FAF72FF88246BAF13D +:10D0F000000F33D01BE018E08DF818E031E0207805 +:10D10000000712D5012E10D10A208DF83C00E088CE +:10D11000ADF8400003201B9907F0B4F80820ADF8E3 +:10D120005000C1E648067FF5F6AC4FF0040A2088AF +:10D13000BDF8501008432080BDF8500080050BD585 +:10D14000A18FA1F57F40FE3806D11E98E062289895 +:10D150002063A6864FF0030A5046A1E49DF818000C +:10D1600078B1012089F80000297889F80110BDF80C +:10D170001C10A9F802109DF8181089F80410052059 +:10D1800038802088BDF8501088432080E4E72DE9DE +:10D19000FF4F8846087895B0012181404FF2090081 +:10D1A000249C0140ADF820102088DDF88890A0F57F +:10D1B0007F424FF0000AFF3A06D039B1000705D58B +:10D1C000012019B0BDE8F08F0820FAE7239E4FF048 +:10D1D000000B0EA886F800B018995D460988ADF8D6 +:10D1E0003410A8498DF81CB0179A0A718DF838B020 +:10D1F000086098F8000001283BD0022809D00328D5 +:10D200006FD1307820F03F001D303070B8F8040046 +:10D21000E08098F800100320022904D1317821F031 +:10D220003F011B31317094F84610090759D505AB01 +:10D23000B9F1000F13D0002102AA82E80B000720E9 +:10D24000CDE90009BDF83400B8F80410C01E83B25F +:10D250000022159800F0A8FD0028D1D101E0F11CB2 +:10D26000EAE7B8F80400A6F80100BDF81400C01CF5 +:10D2700004E198F805108DF81C1098F804000128B6 +:10D2800006D04FF4007A02282CD00328B8D16CE1E4 +:10D290002188B8F8080011F40061ADF8201020D002 +:10D2A00017281CD3B4F84010814218D3B4F84410A6 +:10D2B000172901D3814212D1317821F03F01C91CD5 +:10D2C0003170A6F801000321ADF83410A4F8440031 +:10D2D00094F8460020F0020084F8460065E1052538 +:10D2E0007EE177E1208808F1080700F4FE60ADF8E0 +:10D2F000200010F0F00F1BD010F0C00F03D03888C2 +:10D30000228B9042EBD199B9B878C00710D0B96898 +:10D310000720CDE902B1CDF804B00090CDF810B0EF +:10D32000FB88BA883988159800F014FB0028D6D1FC +:10D330002398BDF82010401C80294ED006DC10290F +:10D340000DD020290BD0402987D124E0B1F5807F72 +:10D350006ED051457ED0B1F5806F97D1DEE0C80622 +:10D3600001D5082000E0102082460DA907AA05205B +:10D37000CDE902218DF83800ADF83CB0CDE9049636 +:10D3800008A93888CDE9000153460722214615989F +:10D39000FFF7B4F8A8E09DF81C2001214FF00A0A1D +:10D3A000002A9BD105ABB9F1000F00D00020CDE9D8 +:10D3B00002100720CDE90009BDF834000493401E97 +:10D3C00083B2218B0022159800F0EEFC8DF81C0032 +:10D3D0000B203070BDF8140020E09DF81C200121C6 +:10D3E0004FF00C0A002A22D113ABB9F1000F00D084 +:10D3F0000020CDE902100720CDE900090493BDF813 +:10D400003400228C401E83B2218B159800F0CCFC96 +:10D410008DF81C000D203070BDF84C00401CADF89C +:10D42000340005208DF83800208BADF83C00BCE0BE +:10D430003888218B88427FF452AF9DF81C004FF052 +:10D44000120A00281CD1606AA8B1B878C0073FF45E +:10D4500046AF00E018E0BA680720CDE902B2CDF887 +:10D4600004B00090CDF810B0FB88BA88159800F091 +:10D4700071FA8DF81C00132030700120ADF83400D3 +:10D4800093E00000540000203988208B8142D2D1E3 +:10D490009DF81C004FF0160A0028A06B08D0E0B3DE +:10D4A0004FF6FF7000215F46ADF808B0019027E00D +:10D4B00068B1B978C907BED1E18F0DAB0844821DB0 +:10D4C00003968DE80C0243888288018809E0B878C9 +:10D4D000C007BCD0BA680DAB03968DE80C02BB88C0 +:10D4E000FA881598FFF7F3F905005ED0072D72D082 +:10D4F00076E0019005AA02A92046FFF729F9014626 +:10D50000E28FBDF80800824201D00029F1D0E08FFF +:10D51000A16B084407800198E08746E09DF81C0055 +:10D520004FF0180A40B1208BC8B1388820832146BB +:10D530001598FFF796F938E004F118000090237E63 +:10D54000012221461598FFF7A4F98DF81C00002848 +:10D55000EDD1192030700120ADF83400E7E7052542 +:10D5600021461598FFF77DF93AE0208800F4007015 +:10D57000ADF8200050452DD1A08FA0F57F41FE3998 +:10D5800001D006252CE0D8F808004FF0160A48B163 +:10D59000A063B8F80C10A1874FF6FF71E187A0F8DF +:10D5A00000B002E04FF6FF70A087BDF8200030F415 +:10D5B0007F611AD0782300220320159906F0B8FD68 +:10D5C00098F8000020712088BDF8201008432080C2 +:10D5D0000EE000E007252088BDF820108843208059 +:10D5E000208810F47F6F1CD03AE02188814321808D +:10D5F0009DF8380020B10EA91598F9F7A6FD05464B +:10D600009DF81C000028EBD086F801A001203070A6 +:10D61000208B70809DF81C0030710520ADF834001F +:10D62000DEE7A18EE1B118980DAB0088ADF83400AB +:10D630002398CDE90304CDE90139206B0090E36A1A +:10D64000179A1598FFF7FCF9054601208DF8380068 +:10D650000EA91598F9F779FD00B10546A4F834B084 +:10D6600094F8460040070AD52046FFF7A0F910F0CD +:10D670003E0F04D114F8460F20F0040020701898D3 +:10D68000BDF83410018028469BE500B585B003281D +:10D6900006D102208DF8000088B26946F9F755FDE1 +:10D6A00005B000BD10B5384C0B782268012B02D0B4 +:10D6B000022B2AD111E013780BB1052B01D10423E1 +:10D6C000137023688A889A802268CB88D380226866 +:10D6D0000B891381498951810DE08B8893802268E1 +:10D6E000CB88D38022680B8913814B8953818B8926 +:10D6F0009381096911612168F9F727FD22680021EA +:10D700000228117003D0002800D0812010BD832092 +:10D7100010BD806B002800D001207047817801295E +:10D7200009D10088B0F5205F03D042F6010188429C +:10D7300001D10020704707207047F0B587B0002462 +:10D7400015460E460746ADF8144010E006980188CD +:10D750002980811DCDE902410721019404940091A3 +:10D76000838842880188384600F0F4F830B906AA68 +:10D7700005A93046FEF7ECFF0028E7D00A2800D1C3 +:10D78000002007B0F0BD00005400002010B58B78D9 +:10D7900083B102789A4205D10B885BB102E08B79A4 +:10D7A000091D4BB18B789A42F9D1B0F801300C8841 +:10D7B000A342F4D1002010BD812010BD072826D03F +:10D7C00012B1012A27D103E0497801F0070102E0F4 +:10D7D0004978C1F3C20105291DD2DFE801F0031821 +:10D7E000080C12000AB10320704702207047042879 +:10D7F0000DD250B10DE0052809D2801E022808D3B1 +:10D8000003E0062803D0032803D00520704700203A +:10D8100070470F20704781207047C0B282060BD43A +:10D82000000607D5FE48807A4143C01D01EBD000B9 +:10D8300080B27047084670470020704770B5138863 +:10D840000B800B781C0625D5F54CA47A844204D8AD +:10D8500043F010000870002070BD956800F00706C6 +:10D8600005EBD0052D78F54065F304130B701378A4 +:10D87000D17803F0030341EA032140F20123B1FB15 +:10D88000F3F503FB15119268E41D00FB012000EB8A +:10D89000D40070BD906870BD37B51446BDF8041053 +:10D8A00011809DF804100A061ED5C1F30013DC494F +:10D8B000A568897A814208D8FE2811D1C91DC908F6 +:10D8C0005A42284616F0EBFC0AE005EBD00100F0C6 +:10D8D0000702012508789540A84393401843087033 +:10D8E000207820F0100020703EBD2DE9F041074661 +:10D8F000C81C0E4620F00300B04202D08620BDE8CE +:10D90000F081C74D002034462E60AF802881AA7276 +:10D91000E8801AE0E988491CE980810614D4E1789E +:10D9200000F0030041EA002040F20121B0FBF1F2D7 +:10D9300001FB12012068FFF770FF2989084480B2BB +:10D940002881381A3044A0600C3420784107E1D493 +:10D950000020D4E72DE9FF4F89B01646DDE9168A8D +:10D960000F46994623F44045084600F00DFB04009D +:10D970000FD0099802F0E2FF0290207800060AD545 +:10D98000A748817A0298814205D887200DB0BDE86A +:10D99000F08F0120FAE7224601A90298FFF74EFF17 +:10D9A000834600208DF80C004046B8F1070F1AD0CE +:10D9B00001222146FFF702FF0028E7D12078400628 +:10D9C00011D502208DF80C00ADF81070BDF80400E0 +:10D9D000ADF81200ADF814601898ADF81650CDF8F7 +:10D9E0001CA0ADF818005FEA094004D500252E46BA +:10D9F000A84601270CE02178E07801F0030140EA15 +:10DA0000012040F20121B0FBF1F2804601FB1287B8 +:10DA10005FEA494009D5B84507D1A178207901F0DE +:10DA2000030140EA0120B04201D3BE4201D90720E0 +:10DA3000ACE7A8191FFA80F9B94501D90D20A5E76F +:10DA40009DF80C0028B103A90998F9F77CFB002880 +:10DA50009CD1B84507D1A0784FEA192161F30100A4 +:10DA6000A07084F804901A9800B10580199850EAC3 +:10DA70000A0027D0199830B10BEB06002A461999F5 +:10DA800016F096FB0EE00BEB06085746189E099819 +:10DA900003F0C0F82B46F61DB5B239464246009554 +:10DAA00002F0ABFC224601A90298FFF7C7FE9DF8E1 +:10DAB0000400224620F010008DF80400DDE901107A +:10DAC000FFF7EAFE002061E72DE9FF4FDFF85091F4 +:10DAD00082461746B9F80610D9F8000001EB41015B +:10DAE00000EB810440F20120B2FBF0F185B000FBB5 +:10DAF00011764D46DDF84C8031460698FFF78DFED5 +:10DB000029682A898B46611A0C3101441144AB887B +:10DB100089B28B4202D8842009B038E70699CDB289 +:10DB2000290603D5A90601D50620F5E7B9F806C0F0 +:10DB30000CF1010C1FFA8CFCA9F806C0149909B16C +:10DB4000A1F800C0A90602D5C4F8088007E0104477 +:10DB500080B2A9F80800191A01EB0B00A060224658 +:10DB6000FE200699FFF798FEE77026712078390AA3 +:10DB700061F30100320AA17840F0040062F3010170 +:10DB8000A17020709AF802006071BAF80000E0807D +:10DB900000262673280602D599F80A7000E00127AE +:10DBA000A80601D54FF000084D4600244FF00709A4 +:10DBB0000FE0CDE902680196CDF800900496E9885F +:10DBC0002046129B089AFFF7C5FE0028A4D1641CCA +:10DBD000E4B2BC42EDD300209EE72DE9F047804639 +:10DBE00000F0D2F9070005D0002644460C4D40F263 +:10DBF000012919E00120BDE8F087204600F0C4F9B2 +:10DC00000278C17802F0030241EA0222B2FBF9F382 +:10DC100009FB13210068FFF700FE304486B201E0E3 +:10DC2000E8050020641CA4B2E988601E8142E4DC9F +:10DC3000A8F10100E8802889801B28810020387025 +:10DC4000D9E710B5144631B1491E218002F076FEA5 +:10DC5000A070002010BD012010BD10B5D2490446AF +:10DC60000088CA88904201D30A2010BD096800EBE1 +:10DC7000400001EB80025079A072D0882081917819 +:10DC8000107901F0030140EA0120A081A078E11C95 +:10DC9000FFF7D4FD20612088401C2080E080002018 +:10DCA00010BD0121018270472DE9FF4F85B04FF66D +:10DCB000FF788246A3F8008048681F460D468078AA +:10DCC0008DF8060048680088ADF8040000208DF843 +:10DCD0000A00088A0C88A04200D304462C8241E046 +:10DCE000288A401C2882701D6968FFF74FFDB8BB69 +:10DCF0003988414501D1601E38806888A04236D3FA +:10DD0000B178307901F0030140EA012901A9701DC1 +:10DD1000FFF73CFD20BB298941452CD0002231462C +:10DD20000798FFF74BFDD8B92989494518D1E9680B +:10DD30000391B5F80AC0D6F808B05046CDF800C037 +:10DD400002F068FFDDF800C05A460CF1070C1FFA1C +:10DD50008CFC4B460399CDF800C002F018FB50B183 +:10DD6000641CA4B2204600F00FF90600B8D1641E6E +:10DD70002C820A20D0E67C807079B871F088B88057 +:10DD80003178F07801F0030140EA01207881A7F8AA +:10DD90000C90504602F0D2FD324607F10801FFF721 +:10DDA0004DFD38610020B7E62DE9FF4F87B0814671 +:10DDB0001C469246DDF860B0DDF85480089800F00B +:10DDC000E3F805000CD0484602F0B8FD29780906B2 +:10DDD00008D57549897A814204D887200BB0D6E5E9 +:10DDE0000120FBE7CAF309062A4601A9FFF726FD31 +:10DDF0000746149807281CD000222946FFF7DEFCAE +:10DE00000028EBD12878400613D501208DF80800B2 +:10DE10000898ADF80C00BDF80400ADF80E00ADF8A0 +:10DE20001060ADF8124002A94846F9F78CF90028B5 +:10DE3000D4D12978E87801F0030140EA0121AA78D9 +:10DE4000287902F0030240EA0220564507D0B1F5D6 +:10DE5000007F04D9611E814201DD0B20BEE78642AE +:10DE600001D90720BAE7801B85B2A54200D9254613 +:10DE7000BBF1000F01D0ABF80050179818B1B919D9 +:10DE80002A4616F095F9B8F1000F0DD03E444846E9 +:10DE90004446169F02F0D0FE2146FF1DBCB232461A +:10DEA0002B46009402F0DDFA002097E72DE9F041BF +:10DEB00007461D461646084600F066F804000BD0DB +:10DEC000384602F03BFD2178090607D53649897AA4 +:10DED000814203D8872012E5012010E52246314611 +:10DEE000FFF7ACFC65B12178E07801F0030140EA6E +:10DEF0000120B0F5007F01D8012000E0002028704B +:10DF00000020FCE42DE9F04107461D461646084670 +:10DF100000F03AF804000BD0384602F00FFD2178EB +:10DF2000090607D52049897A814203D88720E6E48B +:10DF30000120E4E422463146FFF7AEFCFF2D14D069 +:10DF40002178E07801F0030240EA022040F2012249 +:10DF5000B0FBF2F302FB130015B900F2012080B20E +:10DF6000E070000A60F3010121700020C7E410B5E1 +:10DF70000C4600F009F828B1C18821804079A070D2 +:10DF8000002010BD012010BD0749CA88824209D374 +:10DF900040B1096800EB40006FF00B0202EB80001B +:10DFA0000844704700207047E805002070B503461C +:10DFB000002002466FF02F050EE09C5CA4F13006B5 +:10DFC0000A2E02D34FF0FF3070BD00EB800005EB4E +:10DFD0004000521C2044D2B28A42EED370BD30B50C +:10DFE0000A240AE0B0FBF4F304FB13008D18303070 +:10DFF00005F8010C521E1846D2B2002AF2D130BDEB +:10E0000030B500234FF6FF7510E0040A44EA002003 +:10E0100084B2C85C6040C0F30314604005EA003479 +:10E020004440E0B25B1C84EA40109BB29342ECD3C4 +:10E0300030BD000010B582B0694601F0D1FD002866 +:10E0400018BFFFDF9DF80000002448B1019890F848 +:10E05000DD0028B1019880F8DD4001980AF0AFF9A1 +:10E06000F8488068A0F8D24002B010BD2DE9F04712 +:10E0700004460D46062002F043FC0646072002F047 +:10E080003FFC304400F0FF08002718EB050618BFDE +:10E090004FF000091DD02088401C80B22080B04283 +:10E0A00028BFA4F800902588454501D3B54209D37F +:10E0B0000621284602F07CFC20B90721284602F000 +:10E0C00077FC10B10020BDE8F087781CC7B2BE42D3 +:10E0D000E1D84FF6FF7020801220BDE8F08770B5C0 +:10E0E00082B007F073FB0DF0AFF9D74C4FF6FF7617 +:10E0F00000256683A683D5A12570D1E90001CDE96D +:10E10000000165706946A01C16F008FAA11C601C8D +:10E1100014F04CF825721B2060814FF4A471A1818A +:10E12000E08121820321A1740422E274A082E082B2 +:10E13000A4F13E00218305704680C6480570A4F115 +:10E1400010000570468002B070BDF8B5BD4D174691 +:10E150000E466860297007F0B3FA4FF6FF70ADF80D +:10E16000000000216846FFF781FFA0B90621BDF835 +:10E17000000002F02FFC04460721BDF8000002F069 +:10E1800029FC002C1CBF0028FFDF00216846FFF798 +:10E190006DFF0028EAD0FFF7A2FF287812F07CF884 +:10E1A0000FF0A0FC2978686813F013FF28780CF0B2 +:10E1B000ABFB30460AF00FF807F020FC29786868BE +:10E1C0000BF048FA3946287814F0ADFDBDE8F84068 +:10E1D0000DF03AB910B50124002A1CBF002010BD73 +:10E1E000002908BF022105D0012918BF002401D051 +:10E1F000204610BD0EF088FEFAE72DE9F04F8BB0F7 +:10E20000040008BFFFDF02218F4E06F11C00FFF75C +:10E210002DFF002818BFFFDFB6F81CA0062002F073 +:10E220006FFB0546072002F06BFB284400F0FF0857 +:10E2300008F1010000F0FF094FF0000BB78B4745D4 +:10E2400025D120460FF022F8002840F0CE8030780B +:10E25000002800F0CE8084F801B014202070C4F8AB +:10E2600004B0C4F808B0C4F80CB0C4F810B0C4F8D6 +:10E2700014B0C4F818B0C4F81CB00220C4F820B020 +:10E28000207186F800B00BB00120BDE8F08F4F453B +:10E2900020D1204607F04CFB00287DD007F02AFF54 +:10E2A000002859D02078172856D12079002853D03B +:10E2B000E088072102F07CFB050008BFFFDF28880B +:10E2C00007F017FAE088072102F084FB002818BF46 +:10E2D000FFDF8AE004A9384601F082FC00285BD108 +:10E2E0009DF8100048B107F07EFBB84254D021469B +:10E2F00038460BF0B8F880B377E00FF05AF8B84220 +:10E3000077D02146384613F085FD00286DD1059859 +:10E3100000F1580590F8D00018B9E87E08B1012046 +:10E3200000E00020079095F8370000281CBF95F802 +:10E33000380010F0020F1CD084F801B001202070CA +:10E3400084F804B0E78095F839002072688F608106 +:10E35000A88FA08185F837B047E0FFE7059800F166 +:10E36000580590F80C010028DBD1E87E0028D8D0B1 +:10E37000D5E7384602F060FC0290002808BFFFDFB6 +:10E38000029801F06FFE50B184F801B00F212170A6 +:10E39000E7802081012000E02BE0207125E0384655 +:10E3A00002F038FC0290002808BFFFDF079800B396 +:10E3B000029801F0AEFEE0B19DF8100038B9059862 +:10E3C000D0F8F8004188B94208BF80F800B038465C +:10E3D00007F08FF984F801B00C20207084F804B0A5 +:10E3E000E780287F207285F81BB00BB00120BDE8C4 +:10E3F000F08F022106F11C00FFF738FE18B9B08B30 +:10E4000050457FF41BAF0BB02046BDE8F04F14F031 +:10E41000D0BC10B512F08AFC042803D012F086FCA0 +:10E42000052802D10FF078FD28B90AF0A9F920B12A +:10E4300007F08AFC08B10C2010BD0DF051F8002047 +:10E4400010BD00005C00002032060020FFFFFFFF2F +:10E450001F0000006800002010B504460078002866 +:10E460001EBF0128122010BD12F060FC042806D047 +:10E4700012F05CFC052802D00AF082F928B10DF0F8 +:10E480007EF900281CBF0C2010BD2078002816BF84 +:10E4900002280020012004F11703E21D611CBDE8E1 +:10E4A00010400DF075B810B50446007800281EBF66 +:10E4B0000128122010BD12F039FC042803D012F0FC +:10E4C00035FC052802D10FF027FD28B90AF058F9CC +:10E4D00020B107F039FC08B10C2010BD20780028CD +:10E4E00016BF022800200120611C0CF0BFFF00288D +:10E4F00014BF0020072010BD10B50DF043F900280F +:10E5000014BF0020302010BD10B5044612F00EFCE0 +:10E51000042806D012F00AFC052802D00AF030F9CF +:10E5200008B10C2010BD20460DF026F9002010BDCA +:10E5300010B512F0FBFB042806D012F0F7FB0528FB +:10E5400002D00AF01DF928B10DF019F900281CBFFE +:10E550000C2010BD0DF075F8002010BDFF2181705A +:10E560004FF6FF718180FE4949680A7882718A8876 +:10E57000028149884181012141700020704710B516 +:10E58000002482B012F1080F16D00CDC12F1280F13 +:10E5900018BF12F1140F0FD012F1100F18BF12F1A3 +:10E5A0000C0F09D00EE012F1040F18BF002A03D09F +:10E5B000032A18BF042A05D1012807D0022809D050 +:10E5C00003280BD0122402B0204610BD104607F0DD +:10E5D0008CFDF8E710460FF03AFAF4E708461446C7 +:10E5E000694601F0FDFA002818BF0224EBD19DF81E +:10E5F0000000019880F857400024E4E710B5134666 +:10E6000001220DF0A6FF002010BD10B5044612F047 +:10E610008DFB052804BF0C2010BD204611F02AFEFA +:10E62000002010BD10B5044612F080FB042806D06F +:10E6300012F07CFB052802D00AF0A2F808B10C20E9 +:10E6400010BD2146002007F0C2F8002010BD10B513 +:10E65000044611F0B9FE50B10AF085F838B12078BF +:10E6600009F0DDFD20780FF090FC002010BD0C209B +:10E6700010BD10B5044612F059FB042806D012F064 +:10E6800055FB052802D00AF07BF808B10C2010BD1C +:10E690002146012007F09BF8002010BD38B5044644 +:10E6A0004FF6FF70ADF80000A079E179884213D0F1 +:10E6B00021791F299CBF61791F290DD8002211469D +:10E6C00014F030FF40B90022E079114614F02AFF1F +:10E6D00010B9207A072801D9122038BD0AF050F865 +:10E6E00060B912F023FB48B900216846FFF7BEFC71 +:10E6F00020B1204606F031F8002038BD0C2038BD8E +:10E7000070B504468078002582B01A2825D00EDC2A +:10E71000162844D2DFE800F04343434343214343F8 +:10E7200043434343434343434343432121212A2853 +:10E7300035D00BDCA0F11E000C2830D2DFE800F051 +:10E740002F2F2F2F2F2F2F2F2F2F2F0D3A38042819 +:10E7500025D2DFE800F0240224022088B0F5706F93 +:10E760001DD20126694601F03BFA00281EBF022097 +:10E7700002B070BD9DF80000002801980BBF00F1A9 +:10E78000F40100F5B87100F1F50300F271130246CF +:10E7900012D192F8D00092F8732052B903E002B07F +:10E7A0004FF0120070BD002818BF042801D008786F +:10E7B00068B102B00C2070BD92F80C0192F8732081 +:10E7C000002AF6D1002818BF0428F0D1F1E70E7016 +:10E7D000A07818709DF8000048B1019890F8DD000D +:10E7E00028B1019880F8DD50019809F0E8FD02B0E9 +:10E7F000002070BDF0B583B00C46694601F0F0F919 +:10E8000028B1204615F074FE03B00220F0BD019837 +:10E81000002700F1580500F1080600BF85F8407098 +:10E820003146204615F07AFE95F840000028F5D1D3 +:10E8300003B0F0BD2DE9F0410D4604460189808802 +:10E8400000230DF0BCFF696A814228BFBDE8F0815A +:10E85000401A401C4108A0884FF0000C401A80B2BA +:10E86000A08022896FF00E07511A8AB2228195F892 +:10E870005460618816F00C0F6FF00D0328D0B0F5CE +:10E88000747F38BF604606D35038C61700EB9660D9 +:10E8900003EBA01080B2814238BF0846608095F833 +:10E8A0005510E08811F00C0F1BD0B2F5747F09D31E +:10E8B000A2F15001CA1701EB926103EBA11100BF55 +:10E8C0001FFA81FC604528BF6046E080BDE8F0810A +:10E8D000022E1ABF03EBD00080B207EB9000DAD112 +:10E8E000D8E702291ABF03EBD2011FFA81FC07EB1C +:10E8F0009201E7D1E4E7F0B587B00C46054604A9DC +:10E9000001F06EF900281CBF07B0F0BD9DF81000A3 +:10E91000002814BF002201220599B1F84A30FB2BD0 +:10E9200028BFFB23B1F84CC0BCF1FB0F28BF4FF050 +:10E93000FB0C0C4FD7E90006BF68009001960297C8 +:10E94000ADF80230ADF806C06846FFF773FF65808A +:10E95000BDF80400E080BDF80800608104E000001C +:10E960005C00002040470200BDF80200A080BDF816 +:10E970000600208107B00020F0BD2DE9F04F89B0DE +:10E9800004460088694601F02BF95FEA00081CBFC5 +:10E9900009B0BDE8F08FB4F806C02289ACF11B01C4 +:10E9A0001220E12924BF09B0BDE8F08FB2F5A47FA1 +:10E9B0003CBF09B0BDE8F08F44F29025AA4284BF65 +:10E9C00009B0BDE8F08F00276388A188A3F11B067A +:10E9D000E12E24BF09B0BDE8F08FB1F5A47F2EBFB2 +:10E9E0008D4209B0BDE8F08F1120BCF1FB0F99BF3B +:10E9F00040F64806B24209B0BDE8F08FFB2B92BF4B +:10EA0000B14209B0BDE8F08F208806A901F0E8F80E +:10EA1000002818BFFFDF35D19DF8180000280CBF73 +:10EA2000012200220799B1F84A00FB2828BFFB20E9 +:10EA3000B1F84C30FB2B28BFFB23DFF858B7DBF8CD +:10EA400000C0DBF804A0DBF808B0CDF808C0CDF8B2 +:10EA50000CA0CDF810B0ADF80A00ADF80E3002A849 +:10EA6000FFF7E8FEBDF80C0060F31F45BDF810008D +:10EA700060F31F49BDF80A0060F30F05BDF80E00F2 +:10EA800060F30F0962881FFA89F1092091423CBFA7 +:10EA900009B0BDE8F08FA9B2E28891423CBF09B04D +:10EAA000BDE8F08F4FEA1941A288238901EB154197 +:10EAB0001A4491423CBF09B0BDE8F08F9DF80000B8 +:10EAC0004FF001090028019808D000F5CD7580F8B5 +:10EAD0009B91019890F8DE0148B307E000F582753C +:10EAE00080F80591019890F8280110B14FF03A088C +:10EAF00018E0E08868806088E8802089A880A08885 +:10EB00002881012228460199FFF794FEA888B04287 +:10EB100028BF40F64800A8802889B0421DD228812D +:10EB200085F800906F7009B04046BDE8F08FE0882E +:10EB300068806088E8802089A880A08828810022D9 +:10EB400028460199FFF776FEA888B04228BF40F614 +:10EB50004800A8802889B042E1D340F64800DEE7AB +:10EB60000BE710B5044612F0E1F8042806D012F0C5 +:10EB7000DDF8052802D009F003FE28B10CF0FFFDF6 +:10EB800000281CBF0C2010BD2078002816BF0228CA +:10EB900000200120E279611C0CF075FF002814BFF1 +:10EBA0000020022010BD817831F0070207BFC27833 +:10EBB00032F007031220704711F0040F0EBF12F05D +:10EBC000040F1120704701F023B810B504460178F6 +:10EBD000122084B0012918BF002904D002291EBFC9 +:10EBE000032904B010BD6178002918BF012904D0A1 +:10EBF00002291EBF032904B010BDE17B21B9A17811 +:10EC000001291CBF04B010BDA17831F005021CBF62 +:10EC100004B010BD11F0050F04BF04B010BD11F019 +:10EC2000040F1EBF112004B010BDE178E388628993 +:10EC300000291EBF012904B010BD042B2EBF042AD9 +:10EC400004B010BDA17B002904BF04B010BD07298A +:10EC500084BF04B010BD12F069F8042837D012F058 +:10EC600065F8052833D0A0788DF80800A0788DF8D5 +:10EC7000000060788DF8040020788DF80300A07BF8 +:10EC80008DF80500E07B002818BF01208DF80600F4 +:10EC9000A07810F0010F10D0E078012808BF022002 +:10ECA00003D000280CBF012000208DF80100E0886F +:10ECB000ADF80A006089ADF80C0002A811F091FBD4 +:10ECC000002804BF68460FF065F904B010BD04B019 +:10ECD0000C2010BD10B5044602781220012A0FD076 +:10ECE000002A18BF10BD012A26D012F01FF80528EF +:10ECF00004D011F0F6F9002808BF10BD0C2010BD9B +:10ED00006178002918BF012906D0022918BF10BD5B +:10ED1000A188002908BF10BD6388002B1CBFA188F3 +:10ED20000029E0D003EB83035B0001EB8101B3EB2F +:10ED3000012F28BF10BDD6E70FF01DF8002804BF33 +:10ED4000122010BD0FF02CF800200FF0D3F800288F +:10ED500018BF10BD60780FF0B1F8002818BF10BDC3 +:10ED6000A1886088BDE8104011F064BB002100F06C +:10ED7000B1BF017811F0010F02D0406813F0ECBF71 +:10ED800013F0B9BF2DE9F04F8FB00D460246AFF634 +:10ED90004411D1E90001CDE90B011146284600F0EC +:10EDA00099FF00281CBF0FB0BDE8F08F11F0BEFF27 +:10EDB00004280CD011F0BAFF052808D0F64F387897 +:10EDC00028B90EF0F6FAA0F57F41FF3903D00FB055 +:10EDD0000C20BDE8F08FF1480890F1480990F14807 +:10EDE0000A9008AA06210DA801F0B0FD040002BF98 +:10EDF00009200FB0BDE8F08F03210DF052F9B98A58 +:10EE0000A4F84A10FA8AA4F84C20F87C0090BB7C45 +:10EE1000208801F088FE002818BFFFDF208806F058 +:10EE200067FC268804F10E094FF0000B4FF00A0A28 +:10EE30000421484604F04DFF48460DF001FB062032 +:10EE400001F05EFD80461CE005A9062001F039FDB9 +:10EE500005A801F014FD5FEA000B10D1BDF8180001 +:10EE6000B04206D00798042249460E3015F074F9D6 +:10EE700070B105A801F003FD5FEA000BEED0A8F128 +:10EE80000108B8F1000F07DDBBF1000FDCD007E08F +:10EE900048460DF0DEFAF2E7BBF1000F08BFFFDFD6 +:10EEA000D9F800000CF07AFFBAF1010A01D000286D +:10EEB000BED0BDA004F1120600680190032101A894 +:10EEC00004F0DEFE002001A90A5C3254401CC0B2EE +:10EED0000328F9D3A88B6080688CA080288DE080FF +:10EEE000687A10F0010F18BF01217CD0388B0A46D8 +:10EEF00011F009FB0146A062204611F030FB4FF0F3 +:10EF0000000884F85E8084F85F80A878002816BF27 +:10EF10000228002001206076D5F80300C4F81A000A +:10EF2000B5F80700E0830BA904F1080015F0F6FA24 +:10EF30004FF0010984F80091B4F84C0004F5827692 +:10EF40004A46FB2828BFFB207989814238BF084602 +:10EF500094F855104FF4747A11F00C0F1CBF0AEBA3 +:10EF600080111FFA81FC72D0B989614538BF8C4687 +:10EF7000B4F84A10FB2928BFFB21FB898B4238BF1C +:10EF8000194694F854B01BF00C0F1CBF0AEB811308 +:10EF90009BB265D03F8A9F4238BF3B461B2918BFB2 +:10EFA000B3F5A47F65D0F080A6F808C07180B38067 +:10EFB00021463046FFF73EFCB08840F648018842C3 +:10EFC00028BF40F64800B0803089884228BF40F60C +:10EFD0004800308186F800908DF800800121684655 +:10EFE00004F04EFE00E02BE09DF8000000F0070169 +:10EFF000C0F3C1021144C0F3401008448DF8000072 +:10F00000401D207609283CBF08302076002120468C +:10F010000DF047F868780EF0B9FEA9782878EA1C58 +:10F020000EF087FE002808BF122650D00EF0B8FE62 +:10F03000A9782878EA1C0EF01BFF06001FD046E0D6 +:10F0400010F0020F14BF022100214FE7FFE7022951 +:10F0500007BF81003C31C10070311FFA81FC83E79A +:10F06000BBF1020F07BF8B003C33CB0070339BB268 +:10F0700090E71B2818BFBCF5A47F94D1ACE7012012 +:10F080000EF04CFE060022D1214603200EF028FF90 +:10F0900006001CD1687A8DF8000010F0010F05D031 +:10F0A0006889ADF80200288AADF80400684611F0BE +:10F0B00098F9064695F83A00002818BF01200EF08E +:10F0C00033FE26B9204611F026F9060009D0208823 +:10F0D00006F00FFB2088062101F07CFC002818BFF9 +:10F0E000FFDF30460FB0BDE8F08F0146002049E653 +:10F0F00038B5294C207870B911F018FE052805D0D4 +:10F100000EF057F9A0F57F41FF3904D0684611F0A1 +:10F11000CCF910B113E00C2038BD0098008806F03F +:10F12000E8FA00980621008801F054FC002818BF76 +:10F13000FFDF012020701D480078FCF727FE00202B +:10F1400038BD70B4B0F802C08188C3880289448990 +:10F150008089ACF1060640F67B45AE423CBF8E1F6F +:10F16000AE4214D28C4598BFB3F5FA7F3EBFA2F1F0 +:10F170000A0C0F4D15EB0C0509D25B1C5943B1EB82 +:10F18000820F04DA84429EBF002070BC704730209A +:10F1900070BC70474047020032060020F405002092 +:10F1A0006800002022060020112233005C000020AD +:10F1B00089F3FFFF2DE9F047B0F802C004468188CB +:10F1C000C388028947898689ACF1060940F67B48E5 +:10F1D00030200025C1453ABFA1F10609C145BDE86F +:10F1E000F0878C4598BFB3F5FA7F3DBFA2F10A0CBA +:10F1F000DFF8B48418EB0C08BDE8F0875B1C5943BA +:10F20000B1EB820FA8BFBDE8F087B74288BFBDE869 +:10F21000F0872088062101F0CBFB68B190F8D01070 +:10F2200090F8732042B9002918BF042904D0D0F8FF +:10F23000F8100A781AB106E00220BDE8F087D0F88D +:10F240004421127812B13A20BDE8F08705228A7174 +:10F25000D0F8F8100D81D0F8F820A1885181D0F8AD +:10F26000F820E1889181D0F8F8202189D181D0F867 +:10F27000F8100A894B899A429EBF8A79082A9A42D5 +:10F2800024BF1220BDE8F08722884A80D0F8F80019 +:10F29000022101700020BDE8F087F0B583B005467B +:10F2A0000DF0F2F8002802BF122003B0F0BD0026D6 +:10F2B000FE4F012429467C70B81C15F02FF97E7092 +:10F2C0006946062001F0FDFA002818BFFFDF6846F6 +:10F2D00001F0D5FA002808BFBDF804500AD1029801 +:10F2E00080F80041684601F0CAFA18B9BDF8040078 +:10F2F000A842F4D103B00020F0BD10B50446008848 +:10F30000062101F055FB68B190F8D01090F87320F9 +:10F3100042B9002918BF042904D0D0F8F8100A789F +:10F3200012B105E0022010BDD0F8442112780AB1D4 +:10F330003A2010BD90F8962012F0010F04BF0C2067 +:10F3400010BDD4F80220D4F806304A608B60D0F8A3 +:10F35000F81062898A81D0F8F810E268C1F80E20AE +:10F360002269C1F812206269C1F81620A269C1F8A9 +:10F370001A20D0F8F82003211170D0F8F800218865 +:10F380004180002010BDF8B515460E46044609F030 +:10F39000F7F900281CBF0C20F8BD20781223EF28B5 +:10F3A00073D86088ADF8000010F0100F4FF0000126 +:10F3B0000CD010F0010F00F002021BD0B2B110F01F +:10F3C000080F08BF10F0040F1ED01AE010F0080F4D +:10F3D0007ED110F0200F18BF10F0030F78D110F07D +:10F3E000010F18BF10F0020F72D10DE010F0040FE2 +:10F3F0000AD106E02AB110F0080F08BF10F0040F80 +:10F4000002D010F00F0F63D1608810F0080F09D1FF +:10F41000D4E901C2624528BFBCF1200F58D3B2F134 +:10F42000807F55D2227B002A52D0072A50D894F8E8 +:10F430000DC0BCF1000F18BFBCF1010F05D0BCF12D +:10F44000020F18BFBCF1030F42D110F0040F05D119 +:10F45000BCF1020F18BFBCF1030F07D1A27B002A39 +:10F4600018BF012A34D110F0040F08D1627D002AA0 +:10F4700018BF012A03D0022A18BF032A28D1E27D2F +:10F4800010F0100F02D0012A10D021E0012A18BF7D +:10F49000032A1DD110F0100F08D1627E012A1CBF73 +:10F4A000022A032A14D1A27E0F2A11D8E27E002A52 +:10F4B00018BF012A0CD1E27D1123032A08D010F0D5 +:10F4C000100F04BF627E032A02D010F0400F01D05B +:10F4D0001846F8BD3170A17555B9FF208DF80000B0 +:10F4E0006946002006F0EDFD6946002006F0D4FDD7 +:10F4F0002046BDE8F84006F004BD002243E72DE9B0 +:10F50000F0470446C0780F46122510B106F063FD9F +:10F5100050B1607804280AD094F8038094F80090E1 +:10F520006678B8F1FB0F12D92846BDE8F08709F0DC +:10F5300027F90028F8D006F0A6FD0028F4D106F03F +:10F540009AFA002804BFE0780028EDD1E4E71FB163 +:10F55000B8F11F0F23D9E7E706F08DFA28B1B8F10B +:10F560001F0F98BF032E07D0DEE7032E18BF042E0F +:10F5700002D0B8F1000FD7D009F002F9002818BF67 +:10F58000032E04D0042E1CBF0C20BDE8F087484693 +:10F5900006F069FA002804BF4220BDE8F087E07851 +:10F5A00061781F2898BF03291CBF1120BDE8F08790 +:10F5B000211D06F086FD0020BDE8F08700219EE7B2 +:10F5C0002DE9F0470446C0788846122710B106F0AE +:10F5D00098FD38B16578042D04D0E67894F8009051 +:10F5E000FB2E02D93846BDE8F087B8F1000F02D0F3 +:10F5F0001F2E21D9F6E706F03EFA20B11F2E98BF44 +:10F60000032D06D0EEE7032D18BF042D01D0002EE8 +:10F61000E8D009F0B5F8002818BF032D04D0042D58 +:10F620001CBF0C20BDE8F087484606F01CFA0028F5 +:10F6300004BF4220BDE8F087E07861781F2898BFBA +:10F6400003291CBF1120BDE8F087211D06F024FD11 +:10F650000020BDE8F0870021B2E72DE9F041044623 +:10F660004078422582B0012808D8A07806F0FBF93E +:10F6700020B120781225012804D0A0B102B028467C +:10F68000BDE8F08106F04BFD20B1A0880028F5D040 +:10F690008028F3D806F050FD90B160780028EDD0B6 +:10F6A0002078012810D003E089F3FFFF3206002004 +:10F6B00007F0EAFE044608F0DBFC002800F0EA80D0 +:10F6C00002B00C20BDE8F08106F046FB38B906F028 +:10F6D0001FFD002802BF122002B0BDE8F08109F032 +:10F6E0004FF80028ECD106F07EF9A0F57F41FF39F4 +:10F6F000E6D106F050FBA08842F2107100FB01F643 +:10F70000A079314606F078FC06F0F4FC18B300222C +:10F71000072101A801F01AF9040002BF092002B074 +:10F72000BDE8F081F6480321846020460CF072FBAE +:10F73000204607F0EBF8F34DA88AA4F84A00E88ABF +:10F74000A4F84C0006F097F968B1288B012108F065 +:10F7500013FEA0620FE03146002008F063FD002890 +:10F7600018BFFFDFA1E006F0E9FC2A8B0146104636 +:10F7700008F002FEA06201460022204607F087FE44 +:10F7800006F079F9002808BF06F0D8FCE87C009064 +:10F79000AB7CEA8AA98A208801F0C5F9002818BF45 +:10F7A000FFDF208805F0A4FF3146204608F03AFD2F +:10F7B000002818BFFFDF2146B4F84C00002204F5F2 +:10F7C000CD76FB2828BFFB206B89834238BF1846C3 +:10F7D00091F855304FF4747413F00C0F1CBF04EB08 +:10F7E00080131FFA83FC38D0AF89674528BF67466E +:10F7F000B1F84A30FB2B28BFFB23B5F80EC09C455F +:10F8000038BF634691F854C01CF00C0F1CBF04EBCA +:10F81000831C1FFA8CF829D02C8A444528BF444603 +:10F820001B2B18BFB4F5A47F2ED0F08037817380D6 +:10F83000B4803046FEF7FEFFB08840F648018842AB +:10F8400028BF40F64800B0803089884228BF40F683 +:10F85000480030810120307027E0022B07BF830071 +:10F860003C33C30070331FFA83FCBDE7BCF1020FC9 +:10F8700007BF4FEA830C0CF13C0C4FEAC30C0CF1B0 +:10F88000700C1FFA8CF8C7E71B2818BFB7F5A47FC8 +:10F89000CBD10AE04CB1208805F02BFF208807214E +:10F8A00001F098F8002818BFFFDF002002B0BDE883 +:10F8B000F0810021D1E610B50C46072101F078F85F +:10F8C000002804BF022010BD90F8731109B10C206C +:10F8D00010BD90F86510142912BF152990F8C011B9 +:10F8E0000029F4D12168C0F874116168C0F878115A +:10F8F000A168C0F87C11E168C0F88011012180F88E +:10F900007311002010BD10B5072101F051F8002837 +:10F9100004BF022010BD90F8731109B10C2010BD76 +:10F9200090F86510142918BF1529F7D1022180F825 +:10F930007311002010BDF0B50E464BF68032122137 +:10F9400083B0964217D8B6B1694600F049F900284D +:10F950001CBF03B0F0BD019800F15807841C258836 +:10F960003246294638460CF00FFA2088A842F6D1D4 +:10F9700003B00020F0BD03B00846F0BD10B582B062 +:10F9800004460088694600F02BF900281CBF02B02D +:10F9900010BD0198A37800F1580190F82C209A42EC +:10F9A00002BF0C2002B010BD7F220A728A720022B0 +:10F9B000CA72E17880F82D10217980F82E10A17894 +:10F9C00080F82C1002B0104610BD10B582B00C4665 +:10F9D000694600F005F900281CBF02B010BD01986F +:10F9E00090F87300002818BF0120207002B000209A +:10F9F00010BD30B583B00D461446694600F0F0F8EE +:10FA000000281CBF03B030BD019890F82C000128DD +:10FA10001EBF0C2003B030BD019890F86010297013 +:10FA200090F86100207003B0002030BD70B50D4625 +:10FA30001646072100F0BCFF002804BF022070BD5D +:10FA400083884FF0010CC28841880CEB430C65455C +:10FA50001AD342F2107C02FB0CF240F6C41C01FBEC +:10FA60000CF1B2FBF1F1491E8CB2B4F5FA7F88BFFC +:10FA70004FF4FA74A54238BF2C46621C591CB2FBE5 +:10FA8000F1F25143491E8BB290F8AC11002908BF26 +:10FA900003843380002070BD10B50C46072100F0B0 +:10FAA00087FF002804BF022010BD80F8DF40002C33 +:10FAB0001EBF90F8DD10002908F081FC002010BD69 +:10FAC000017800291CBF417800290ED041881B29EC +:10FAD00021BF81881B29C188022906D30A490268EF +:10FAE00040680A654865002070471220704710B5CD +:10FAF000044610F005FD204608F009FC002010BD6A +:10FB00005C00002032060020F40500202DE9F041C1 +:10FB100016460F46044601221146384610F0F3FC03 +:10FB200005460121384608F027FC854228BF2846B3 +:10FB30000123E100503189B2E631884206D901F152 +:10FB40009602401AB0FBF2F0401C83B233800020D2 +:10FB5000BDE8F08110B5044611F0E8F8042806D09D +:10FB600011F0E4F8052802D008F00AFE08B10C20D4 +:10FB700010BD601C0BF05DFF207800F0010006F066 +:10FB800005F9207800F001000EF005F9002010BD05 +:10FB900010B50446072000F0A5FE00281CBF0C206D +:10FBA00010BD207810F0010F11D0002260781146AE +:10FBB00013F0B8FC00281CBF122010BDA0680AF08A +:10FBC00048FA607861680AF04DFA002010BD002004 +:10FBD0000AF03FFA002108460AF044FA002010BD5E +:10FBE00070B50C460546062100F0E2FE606010B1DB +:10FBF0000020207070BD0721284600F0D9FE60600B +:10FC0000002804BF022070BD01202070002070BDBC +:10FC100010B582B0044600886946FFF7E1FF020094 +:10FC20001CBF02B010BDA088002818BF012804D056 +:10FC300002281EBF122002B010BDA178002908BF03 +:10FC40000321E078002808BF03204FF0000C9DF846 +:10FC500000400123002C019C06D084F8A531019CB2 +:10FC600094F8F241ECB124E084F80F31019C94F84F +:10FC700034413CB9019C94F80E411CB9019C94F8A4 +:10FC80007D400CB13A2208E0019C84F80E31019BC2 +:10FC900083F81011019981F81101019880F80FC1C2 +:10FCA00015E0019C94F8A4411CB9019C94F87D4096 +:10FCB0000CB13A2208E0019C84F8A431019B83F83E +:10FCC000A611019981F8A701019880F8A5C102B099 +:10FCD000104610BD427A12F0070F10D032F0070321 +:10FCE0000DD112F0040F01D011207047012A18BF66 +:10FCF000022AF9D190F83A301BB9012A01D012201A +:10FD000070472DE9F0074FF0000C12F0010F40F69C +:10FD1000774740F67B4337D069B14489B0F810C0CB +:10FD2000261F43F6FD75AE423CBFACF10406AE4261 +:10FD300026D2644524D3C68AB0F81CC0448C058DF5 +:10FD4000B0F82E90B0F83480A6F1060A9A453CBF70 +:10FD5000ACF1060A9A4513D2664598BFB4F5FA7F0E +:10FD60003CBFA5F10A06BE420AD2641C04FB0CFC8F +:10FD7000BCEB850F04DAC14598BF4FF0010C03D9E5 +:10FD8000BDE8F0073020704712F0020F22D000EBE0 +:10FD90004C02D68AB2F81CC0558C148DB2F82E8055 +:10FDA000928EA6F106094B4584BFACF106094B457E +:10FDB000E6D9664598BFB5F5FA7F3CBFA4F10A03C2 +:10FDC000BB42DDD26B1C03FB0CF3B3EB840FD7DA21 +:10FDD0009045D5D802782AB1012A13D0BDE8F007A2 +:10FDE000122070470029817808D0002918BF012906 +:10FDF00008D0022918BF032904D0EFE7002918BF53 +:10FE00000129EBD14078002818BF012803D002282F +:10FE100018BF0328E2D1BDE8F007002070470000BA +:10FE200030B5058825F4004421448CB24FF40041DC +:10FE300094420AD2121B92B21B339A4201D2A943B6 +:10FE400007E005F40041214303E0A21A92B2A9435E +:10FE50001143018030BD0844083050434A31084402 +:10FE600080B2704770B51D4616460B4604462946BB +:10FE70003046049AFFF7EFFF0646B34200D2FFDF99 +:10FE80002821204614F035FA4FF6FF70A082283E54 +:10FE9000B0B265776080B0F5004F00D9FFDF6188B0 +:10FEA00005F13C00814200D2FFDF60880835401B2D +:10FEB000343880B220801B2800D21B2020800020F4 +:10FEC000A07770BD8161886170472DE9F05F0D46B4 +:10FED000C188044600F12809008921F4004620F475 +:10FEE000004800F062FB10B10020BDE8F09F4FF029 +:10FEF000000A4FF0010BB0450CD9617FA8EB06005A +:10FF0000401A0838854219DC09EB060000210580FB +:10FF100041801AE06088617F801B471A083F0DD43A +:10FF20001B2F00DAFFDFBD4201DC294600E0B9B239 +:10FF3000681A0204120C04D0424502DD84F817A0AE +:10FF4000D2E709EB06000180428084F817B0CCE7C5 +:10FF500070B5044600F12802C088E37D20F400401B +:10FF60002BB110440288438813448B4201D20020F5 +:10FF700070BD00258A4202D30180458008E0891ABD +:10FF80000904090C418003D0A01D00F01EFB08E00D +:10FF9000637F00880833184481B26288A01DFFF790 +:10FFA0003FFFE575012070BD70B5034600F12804E0 +:10FFB000C588808820F400462644A84202D100204B +:10FFC000188270BD98893588A84206D3401B758871 +:10FFD0002D1A2044ADB2C01E05E02C1AA5B25C7FDC +:10FFE00020443044401D0C88AC4200D90D809C89CF +:10FFF00024B1002414700988198270BD0124F9E726 +:020000040001F9 +:1000000070B5044600F12801808820F400404518AE +:10001000208A002825D0A189084480B2A08129889F +:100020006A881144814200D2FFDF2888698800264F +:100030000844A189884212D1A069807F287169880B +:1000400019B1201D00F0C1FA08E0637F2888083349 +:10005000184481B26288201DFFF7E2FEA681268245 +:10006000012070BD2DE9F0414189878800260446B2 +:1000700000F12805B94218D004F10A0821F4004023 +:100080002844418819B1404600F09FFA08E0637F98 +:1000900000880833184481B262884046FFF7C0FEEA +:1000A000761C6189B6B2B942E8D13046BDE8F0812C +:1000B0002DE9F04104460B4627892830A68827F40D +:1000C0000041B4F80A8001440D46B74201D1002036 +:1000D000ECE70AB1481D106023B1627F691D184624 +:1000E00014F066F82E88698804F1080021B18A1995 +:1000F00096B200F06AFA06E0637F628808339919C5 +:1001000089B2FFF78DFE474501D1208960813046D5 +:10011000CCE78188C088814201D10120704700204E +:10012000704701898088814201D1012070470020F9 +:10013000704770B58588C38800F1280425F4004213 +:1001400023F4004114449D421AD08389058A5E1924 +:1001500025886388EC18A64214D313B18B4211D3BF +:100160000EE0437F08325C192244408892B2801A24 +:1001700080B22333984201D211B103E08A4201D107 +:10018000002070BD012070BD2DE9F0478846C18870 +:100190000446008921F4004604F1280720F40045B4 +:1001A00007EB060900F001FA002178BBB54204D93B +:1001B000627FA81B801A002503E06088627F801B95 +:1001C000801A083823D4E28962B1B9F80020B9F85E +:1001D00002303BB1E81A2177404518DBE08938440A +:1001E000801A09E0801A217740450ADB607FE189A7 +:1001F0000830304439440844C01EA4F81280BDE8D9 +:10020000F087454503DB01202077E7E7FFE76182C0 +:100210000020F4E72DE9F74F044600F12805C088D7 +:10022000884620F4004A608A05EB0A0608B140457A +:1002300002D20020BDE8FE8FE08978B13788B6F899 +:10024000029007EB0901884200D0FFDF207F4FF0CA +:10025000000B50EA090106D088B33BE00027A07FDD +:10026000B9463071F2E7E18959B1607F294408301D +:1002700050440844B4F81F1020F8031D94F82110CE +:100280008170E28907EB080002EB0801E181308010 +:10029000A6F802B002985F4650B1637F30880833F9 +:1002A000184481B26288A01DFFF7BAFDE78121E002 +:1002B000607FE18908305044294408442DE0FFE77D +:1002C000E089B4F81F102844C01B20F8031D94F8DF +:1002D0002110817009EB0800E28981B202EB08006D +:1002E000E081378071800298A0B1A01D00F06DF907 +:1002F000A4F80EB0A07F401CA077A07D08B1E088D4 +:10030000A08284F816B000BFA4F812B084F817B029 +:1003100001208FE7E0892844C01B30F8031DA4F8B2 +:100320001F10807884F82100EEE710B5818800F175 +:10033000280321F400442344848AC288A14212D0B5 +:10034000914210D0818971B9826972B11046FFF76C +:10035000E8FE50B91089283220F400401044197981 +:100360000079884201D1002010BD184610BD00F16F +:100370002803407F08300844C01E1060088808B970 +:10038000DB1E136008884988084480B270472DE955 +:10039000F04100F12806407F1C4608309046431883 +:1003A00008884D88069ADB1EA0B1C01C80B290421E +:1003B00014D9801AA04200DB204687B298183A462A +:1003C000414613F0C9FE002816D1E01B84B2B844A0 +:1003D000002005E0ED1CADB2F61EE8E7101A80B271 +:1003E0000119A94206D8304422464146BDE8F041F1 +:1003F00013F0B2BE4FF0FF3058E62DE9F04100F1A6 +:100400002804407F1E46083090464318002508887F +:100410004F88069ADB1E90B1C01C80B2904212D960 +:10042000801AB04200DB304685B299182A46404611 +:1004300013F0BEFE701B86B2A844002005E0FF1C2E +:10044000BFB2E41EEAE7101A80B28119B94206D899 +:1004500021183246404613F0ABFEA81985B2284653 +:1004600024E62DE9F04100F12804407F1E460830C3 +:1004700090464318002508884F88069ADB1E90B1E5 +:10048000C01C80B2904212D9801AB04200DB3046C4 +:1004900085B298182A46414613F08AFE701B86B230 +:1004A000A844002005E0FF1CBFB2E41EEAE7101AD2 +:1004B00080B28119B94206D820443246414613F031 +:1004C00077FEA81985B22846F0E5401D704710B5A3 +:1004D000044600F12801C288808820F400431944B2 +:1004E000904206D0A28922B9228A12B9A28A9042E9 +:1004F00001D1002010BD0888498831B1201D00F0CD +:1005000064F800202082012010BD637F62880833D8 +:10051000184481B2201DFFF783FCF2E70021C1815E +:1005200001774182C1758175704703881380C28944 +:1005300042B1C28822F4004300F128021A440A6042 +:10054000C08970470020704710B50446808AA0F526 +:100550007F41FF3900D0FFDFE088A082E08900B151 +:100560000120A07510BD4FF6FF71818200218175B9 +:10057000704710B50446808AA0F57F41FF3900D14D +:10058000FFDFA07D28B9A088A18A884201D1002080 +:1005900010BD012010BD8188828A914201D1807DE9 +:1005A00008B1002070470120704720F4004221F478 +:1005B00000439A4207D100F4004001F40041884210 +:1005C00001D0012070470020704730B504460088F4 +:1005D0000D4620F40040A84200D2FFDF21884FF4EE +:1005E000004088432843208030BD70B50C0005468C +:1005F00009D0082C00D2FFDF1DB1A1B2286800F09D +:1006000044F8201D70BD0DB100202860002070BD91 +:100610000021026803E093881268194489B2002A15 +:10062000F9D100F032B870B500260D46044608290D +:1006300000D2FFDF206808B91EE0044620688188E8 +:10064000A94202D001680029F7D181880646A94253 +:1006500001D100680DE005F1080293B20022994231 +:1006600009D32844491B0260818021680968216000 +:100670000160206000E00026304670BD00230B6062 +:100680008A8002680A600160704700234360021D8F +:10069000018102607047F0B50F4601884088154619 +:1006A0000C181E46AC4200D3641B3044A84200D94B +:1006B000FFDFA019A84200D9FFDF3819F0BD2DE9EE +:1006C000F041884606460188408815460C181F46AA +:1006D000AC4200D3641B3844A84200D9FFDFE019C4 +:1006E000A84200D9FFDF70883844708008EB04000E +:1006F000BDE8F0812DE9F041054600881E46174609 +:10070000841B8846BC4200D33C442C80688830441B +:10071000B84200D9FFDFA019B84200D9FFDF6888CE +:100720003044688008EB0400E2E72DE9F0410688D8 +:100730001D460446701980B2174688462080B8428C +:1007400001D3C01B20806088A84200D2FFDF70194F +:10075000B84200D9FFDF6088401B608008EB0600CC +:10076000C6E730B50D460188CC18944200D3A41AD0 +:100770004088984200D8FFDF281930BD2DE9F041AC +:10078000C84D04469046A8780E46A04200D8FFDF28 +:1007900005EB8607B86A50F8240000B1FFDFB8689F +:1007A000002816D0304600F044F90146B868FFF73B +:1007B0003AFF05000CD0B86A082E40F8245000D348 +:1007C000FFDFB9484246294650F826302046984770 +:1007D0002846BDE8F0812DE9F8431E468C19914664 +:1007E0000F460546FF2C00D9FFDFB14500D9FFDFDA +:1007F000E4B200954DB300208046E81C20F00300D1 +:10080000A84200D0FFDF4946DFF89892684689F891 +:10081000001089F8017089F8024089F8034089F8CE +:10082000044089F8054089F8066089F80770414658 +:1008300000F008F9002142460F464B460098C01CC4 +:1008400020F00300009012B10EE00120D4E703EB8A +:100850008106B062002005E0D6F828C04CF8207070 +:10086000401CC0B2A042F7D30098491C00EB8400A2 +:10087000C9B200900829E1D3401BBDE8F88310B548 +:10088000044603F071FD08B1102010BD2078854AA0 +:10089000618802EB800092780EE0836A53F8213081 +:1008A00043B14A1C6280A180806A50F82100A06098 +:1008B000002010BD491C89B28A42EED86180052013 +:1008C00010BD70B505460C46084603F04DFD08B155 +:1008D000102070BD082D01D3072070BD25700020A9 +:1008E000608070BD0EB56946FFF7EBFF00B1FFDF1A +:1008F0006846FFF7C4FF08B100200EBD01200EBD01 +:1009000010B50446082800D3FFDF6648005D10BD1F +:100910003EB5054600246946FFF7D3FF18B1FFDF57 +:1009200001E0641CE4B26846FFF7A9FF0028F8D094 +:100930002846FFF7E5FF001BC0B23EBD5949897844 +:10094000814201D9C0B27047FF2070472DE9F041C4 +:10095000544B062903D007291CD19D7900E00025BE +:1009600000244FF6FF7603EB810713F801C00AE07D +:100970006319D7F828E09BB25EF823E0BEF1000FC0 +:1009800004D0641CA4B2A445F2D8334603801846B0 +:10099000B34201D100201CE7BDE8F041EEE6A0F52E +:1009A0007F43FF3B01D0082901D300207047E5E6D3 +:1009B000A0F57F42FF3A0BD0082909D2394A937833 +:1009C000834205D902EB8101896A51F82000704702 +:1009D000002070472DE9F04104460D46A4F57F4103 +:1009E00043F20200FF3902D0082D01D30720F0E6C0 +:1009F0002C494FF000088A78A242F8D901EB85060D +:100A0000B26A52F82470002FF1D0274839462030BE +:100A100050F8252020469047B16A284641F82480A6 +:100A200000F007F802463946B068FFF727FE0020BD +:100A3000CFE61D49403131F810004FF6FC71C01C63 +:100A4000084070472DE9F843164E884605460024B5 +:100A50002868C01C20F0030028602046FFF7E9FF4B +:100A6000315D4843B8F1000F01D0002200E02A6850 +:100A70000146009232B100274FEA0D00FFF7B5FDA5 +:100A80001FB106E001270020F8E706EB8401009A79 +:100A90008A602968641C0844E4B22860082CD7D313 +:100AA000EBE60000500600204C47020070B50E46F1 +:100AB0001D46114600F0D4F804462946304600F0A1 +:100AC000D8F82044001D70BD2DE9F04190460D4638 +:100AD00004004FF0000610D00027E01C20F00300B7 +:100AE000A04200D0FFDFDDB141460020FFF77DFDD1 +:100AF0000C3000EB850617B112E00127EDE7614FDE +:100B000004F10C00A9003C602572606000EB8500D8 +:100B10002060606813F0EDFB41463868FFF765FD23 +:100B20003046BDE8F0812DE9FF4F564C804681B03C +:100B300020689A46934600B9FFDF2068027A424552 +:100B400003D9416851F8280020B143F2020005B0F2 +:100B5000BDE8F08F5146029800F082F886B2584600 +:100B60000E9900F086F885B27019001D87B22068D2 +:100B7000A14639460068FFF756FD04001FD0678084 +:100B800025802946201D0E9D07465A4601230095C3 +:100B9000FFF768F92088314638440123029ACDF8DE +:100BA00000A0FFF75FF92088C1193846FFF78AF9DE +:100BB000D9F800004168002041F82840C7E7042028 +:100BC000C5E770B52F4C0546206800B9FFDF2068E7 +:100BD000017AA9420ED9426852F8251051B100237A +:100BE00042F825304A880068FFF748FD2168002058 +:100BF0000A7A08E043F2020070BD4B6853F82030D7 +:100C000033B9401CC0B28242F7D80868FFF700FD34 +:100C1000002070BD70B51B4E05460024306800B939 +:100C2000FFDF3068017AA94204D9406850F82500F6 +:100C300000B1041D204670BD70B5124E054600245B +:100C4000306800B9FFDF3068017AA94206D94068F0 +:100C500050F8251011B131F8040B4418204670BD2E +:100C600010B50A460121FFF7F6F8C01C20F003007A +:100C700010BD10B50A460121FFF7EDF8C01C20F0A9 +:100C8000030010BD7000002070B50446C2F11005CD +:100C9000281913F08DFA15F0FF0108D0491EC9B2CA +:100CA000802060542046BDE8704013F000BB70BD4A +:100CB00030B505E05B1EDBB2CC5CD55C6C40C45447 +:100CC000002BF7D130BD10B5002409E00B78521E7F +:100CD00044EA430300F8013B11F8013BD2B2DC09BE +:100CE000002AF3D110BD2DE9F04389B01E46DDE99D +:100CF000107990460D00044622D002460846F94974 +:100D0000FDF77CFC102221463846FFF7DCFFE07B34 +:100D1000000606D5F34A3946102310320846FFF77D +:100D2000C7FF102239464846FFF7CDFFF87B000683 +:100D300006D5EC4A4946102310320846FFF7B8FFA3 +:100D40001021204613F0B3FA0DE0103EB6B208EBC6 +:100D50000601102322466846FFF7AAFF22462846CE +:100D60006946FDF74BFC102EEFD818D0F2B2414681 +:100D70006846FFF789FF10234A46694604A8FFF733 +:100D800097FF1023224604A96846FFF791FF2246E9 +:100D900028466946FDF732FC09B0BDE8F083102310 +:100DA0003A464146EAE770B59CB01E4605461346F2 +:100DB00020980C468DF80800202219460DF10900F4 +:100DC00013F0F6F9202221460DF1290013F0F0F975 +:100DD00017A913A8CDE90001412302AA31462846EC +:100DE000FFF781FF1CB070BD2DE9FF4F9FB014AE1F +:100DF000DDE92D5410AFBB49CDE900762023203129 +:100E00001AA8FFF770FF4FF000088DF808804FF028 +:100E100001098DF8099054F8010FCDF80A00A08857 +:100E2000ADF80E0014F8010C1022C0F340008DF84C +:100E3000100055F8010FCDF81100A888ADF8150085 +:100E400015F8010C2C99C0F340008DF8170006A886 +:100E5000824613F0ADF90AA883461022229913F0B6 +:100E6000A7F9A0483523083802AA40688DF83C80CD +:100E7000CDE900760E901AA91F98FFF734FF8DF880 +:100E800008808DF809902068CDF80A00A088ADF898 +:100E90000E0014F8010C1022C0F340008DF8100071 +:100EA0002868CDF81100A888ADF8150015F8010CD8 +:100EB0002C99C0F340008DF81700504613F078F9D4 +:100EC00058461022229913F073F9864835230838C2 +:100ED00002AA40688DF83C90CDE900760E901AA9E0 +:100EE0002098FFF700FF23B0BDE8F08FF0B59BB06E +:100EF0000C460546DDE922101E461746DDE9203284 +:100F0000D0F801C0CDF808C0B0F805C0ADF80CC0ED +:100F10000078C0F340008DF80E00D1F80100CDF844 +:100F20000F00B1F80500ADF8130008781946C0F3BA +:100F300040008DF815001088ADF8160090788DF8F7 +:100F400018000DF11900102213F032F90DF12900EB +:100F50001022314613F02CF90DF1390010223946D8 +:100F600013F026F917A913A8CDE90001412302AA1D +:100F700021462846FFF7B7FE1BB0F0BDF0B5A3B081 +:100F800017460D4604461E46102202A8289913F063 +:100F90000FF906A82022394613F00AF90EA82022DC +:100FA000294613F005F91EA91AA8CDE9000150231E +:100FB00002AA314616A8FFF796FE1698206023B0C5 +:100FC000F0BDF0B589B00446DDE90E070D4639786D +:100FD000109EC1F340018DF8001031789446C1F3A2 +:100FE00040018DF801101968CDF802109988ADF80C +:100FF000061099798DF808100168CDF809108188DC +:10100000ADF80D1080798DF80F0010236A46614607 +:1010100004A8FFF74DFE2246284604A9FDF7EEFA84 +:10102000D6F801000090B6F80500ADF80400D7F836 +:101030000100CDF80600B7F80500ADF80A00002061 +:10104000039010236A46214604A8FFF731FE22468A +:10105000284604A9FDF7D2FA09B0F0BD1FB51C68F7 +:1010600000945B68019313680293526803920246EE +:1010700008466946FDF7C2FA1FBD10B588B00446A0 +:10108000106804905068059000200690079008466C +:101090006A4604A9FDF7B2FABDF80000208008B046 +:1010A00010BD1FB51288ADF800201A88ADF80220D7 +:1010B0000022019202920392024608466946FDF719 +:1010C0009DFA1FBD7FB5074B14460546083B9A1C89 +:1010D0006846FFF7E6FF224669462846FFF7CDFF40 +:1010E0007FBD0000A447020070B5044600780E469C +:1010F000012813D0052802D0092813D10EE0A068DA +:1011000061690578042003F0BDF8052D0AD0782325 +:1011100000220420616903F00BF803E004206169F8 +:1011200003F0B0F831462046BDE8704001F086B8C3 +:1011300010B500F12D02C3799478411D64F00304C9 +:101140002340C371DB070DD04B79547923404B7199 +:101150000B79127913400B718278C9788A4200D9D1 +:10116000817010BD00224A710A71F5E741780129AA +:1011700000D00C21017070472DE9F04F93B04FF073 +:10118000000B0C690D468DF820B0097801260C2063 +:1011900017464FF00D084FF0110A4FF008091B29B0 +:1011A00075D2DFE811F01B00C30206031E035D03C6 +:1011B0007003A203B703F803190461049304A004A5 +:1011C000EC042A05340552055D05EE0531063406AA +:1011D00063067F06F9061D07E606EB0614B12078C4 +:1011E0001D282AD0D5F808805FEA08004FD00120DA +:1011F0008DF82000686A02220D908DF824200A20C4 +:101200008DF82500A8690A90A8880028EED098F8E3 +:10121000001091B10F2910D27ED2DFE801F07D13CA +:1012200049DEFEFDFCFBFAF938089CF8F7000228BD +:101230002DD124B120780C2801D00026EFE38DF8C1 +:101240002020CBE10420696A03F01CF8A888072855 +:10125000EED1204600F0EDFF022809D0204600F034 +:10126000E8FF032807D9204600F0E3FF072802D251 +:101270000120207004E0002CB8D020780128D7D1BC +:1012800098F80400C11F0A2902D30A2061E0C4E1D2 +:10129000A070D8F80010E162B8F80410218698F820 +:1012A000060084F83200012028700320207044E0FA +:1012B0000728BDD1002C99D020780D28B8D198F8F6 +:1012C000031094F82F20C1F3C000C2F3C0021042F3 +:1012D00001D0062000E00720890707D198F8051003 +:1012E0000142D2D198F806100142CED194F83120B3 +:1012F00098F8051020EA02021142C6D194F8322073 +:1013000098F8061090430142BFD198F80400C11F1D +:101310000A29BAD2617D00E006E281427ED8D8F87F +:1013200000106160B8F80410218198F80600A072DE +:10133000012028700E20207003208DF82000686A9C +:101340000D9004F12D000990601D0A900F300B9054 +:1013500022E12875FDE3412891D1204600F069FF84 +:10136000042802D1E078C00704D1204600F061FFD4 +:101370000F2884D1A88CD5F80C8080B24FF0400B98 +:10138000E669FFF747FC324641465B464E46CDF8DC +:101390000090FFF732F80B208DF82000686A0D905E +:1013A000E0690990002108A8FFF79EFE2078042834 +:1013B00006D0A07D58B1012809D003280AD049E3FE +:1013C00005202070032028708DF82060CDE184F87E +:1013D00000A032E712202070E9E11128BCD120469C +:1013E00000F027FF042802D1E078C00719D020467A +:1013F00000F01FFF062805D1E078C00711D1A07DBD +:1014000002280ED0204600F014FF08E0CAE081E078 +:101410006FE14EE121E101E1E7E017E0ADE11128E4 +:101420009AD1102208F1010104F13C0012F0C0FE33 +:10143000607801287ED012202070E078C00760D04C +:10144000A07D0028C8D00128C6D05AE0112890D12C +:10145000204600F0EEFE082804D0204600F0E9FE09 +:10146000132886D104F16C00102208F10101064610 +:1014700012F09EFE207808280DD014202070E1780C +:10148000C8070DD0A07D02280AD06278022A04D0B5 +:101490000328A1D035E00920F0E708B1012837D1B1 +:1014A000C80713D0A07D02281DD000200090D4E9E9 +:1014B000062133460EA8FFF776FC10220EA904F190 +:1014C0003C0012F049FEC8B1042042E7D4E90912F9 +:1014D000201D8DE8070004F12C0332460EA8616B35 +:1014E000FFF76FFDE9E7606BC1F34401491E006837 +:1014F000C84000F0010040F08000D7E720780928BC +:1015000006D185F800908DF8209033E32870ECE345 +:101510000920FBE711289AD1204600F08AFE0A280C +:1015200002D1E078C00704D1204600F082FE1528E1 +:101530008DD100E08DE104F13C00102208F10101A1 +:10154000064612F035FE20780A2816D016202070A4 +:10155000D4E90932606B611D8DE80F0004F15C0372 +:1015600004F16C0247310EA8FFF7C0FC10220EA94F +:10157000304612F0F1FD18B1F5E20B20207071E257 +:101580002046FFF7D5FDA078216A0A18C0F11001A6 +:10159000104612F08CFE23E3394608A8FFF7A4FD9D +:1015A00006463BE20228B6D1204600F042FE04285F +:1015B00004D3204600F03DFE082809D3204600F061 +:1015C00038FE0E2829D3204600F033FE122824D2FC +:1015D000A07D02289FD10E208DF82000686A0D9012 +:1015E00098F801008DF82400F0E3022893D12046FA +:1015F00000F01FFE002810D0204600F01AFE01283F +:10160000F9D0204600F015FE0C28F4D004208DF807 +:10161000240098F801008DF825005EE21128FCD125 +:10162000002CFAD020781728F7D16178606A022957 +:1016300011D0002101EB4101182606EBC101102257 +:10164000405808F1010112F0B3FD0420696A00F06E +:10165000E3FD2670F1E50121ECE70B28DDD1002C3C +:10166000DBD020781828D8D16078616A02281CD095 +:101670005FF0000000EB4002102000EBC2000958B0 +:10168000B8F8010008806078616A02280FD0002055 +:1016900000EB4002142000EBC2000958404650F80D +:1016A000032F0A604068486039E00120E2E701202A +:1016B000EEE71128B1D1002CAFD020781928ACD199 +:1016C0006178606A022912D05FF0000101EB4101EC +:1016D0001C2202EBC1011022405808F1010112F056 +:1016E00067FD0420696A00F097FD1A20B6E0012129 +:1016F000ECE7082891D1002C8FD020781A288CD1C3 +:10170000606A98F80120017862F347010170616A0C +:10171000D8F8022041F8012FB8F80600888004208C +:10172000696A00F079FD8EE2072012E63878012818 +:1017300094D1182204F11400796812F07EFDE0794A +:10174000C10894F82F0001EAD001E07861F30000AD +:10175000E070217D002974D12178032909D0C007C8 +:1017600025D0032028708DF82090686A0D904120C4 +:1017700004E3607DA178884201D90620E9E50226CC +:101780002671E179204621F0E001E171617A21F0D2 +:10179000F0016172A17A21F0F001A172FFF7C8FC9B +:1017A0002E708DF82090686A0D900720E6E20420E4 +:1017B000ACE6387805289DD18DF82000686A0D9038 +:1017C000B8680A900720ADF824000A988DF830B068 +:1017D0006168016021898180A17A81710420207073 +:1017E000F4E23978052985D18DF82010696A0D91C8 +:1017F000391D09AE0EC986E80E004121ADF824104E +:101800008DF830B01070A88CD7F80C8080B24026CC +:10181000A769FFF711FA41463A463346C846CDF864 +:101820000090FEF71EFE002108A8FFF75DFCE0789F +:1018300020F03E00801CE0702078052802D00F20A8 +:101840000CE049E1A07D20B1012802D0032802D09C +:1018500002E10720BFE584F80080EEE42070ECE4AC +:10186000102104F15C0002F034FA606BB0BBA07D83 +:1018700018B1012801D00520FDE006202870F748A6 +:101880006063A063BEE23878022894D1387908B149 +:101890002875B3E3A07D022802D0032805D022E0FA +:1018A000B8680028F5D060631CE06078012806D095 +:1018B000A07994F82E10012805D0E84806E0A17917 +:1018C00094F82E00F7E7B8680028E2D06063E0786B +:1018D000C00701D0012902D0E04803E003E0F86826 +:1018E0000028D6D0A063062010E68DF82090696A03 +:1018F0000D91E1784846C90709D06178022903D1E2 +:10190000A17D29B1012903D0A17D032900D00720A1 +:10191000287031E138780528BBD1207807281ED0FF +:1019200084F800A005208DF82000686A0D90B86842 +:101930000A90ADF824A08DF830B003210170E17851 +:10194000CA070FD0A27D022A1AD000210091D4E943 +:10195000061204F15C03401CFFF725FA67E384F8E4 +:101960000090DFE7D4E90923211D8DE80E0004F182 +:101970002C0304F15C02401C616BFFF722FB56E371 +:10198000626BC1F34401491E1268CA4002F00101B2 +:1019900041F08001DAE738780528BDD18DF82000C4 +:1019A000686A0D90B8680A90ADF824A08DF830B040 +:1019B000042100F8011B102204F15C0112F0F8FB75 +:1019C000002108A8FFF790FB2078092801D01320F8 +:1019D00044E70A2020709BE5E078C10742D0A17D52 +:1019E000012902D0022927D038E0617808A801290E +:1019F00016D004F16C010091D4E9061204F15C03E5 +:101A0000001DFFF7BBFA0A20287003268DF82080FE +:101A1000686A0D90002108A8FFF766FBDDE2C3E2CB +:101A200004F15C010091D4E9062104F16C03001D6E +:101A3000FFF7A4FA0026E9E7C0F3440114290DD208 +:101A40004FF0006101EBB0104FEAB060E0706078D9 +:101A5000012801D01020BEE40620FFE660780128AE +:101A60003FF4B7AC0A2051E5E178C90708D0A17D61 +:101A7000012903D10B20287004202FE028702DE0CD +:101A80000E2028706078616B012817D004F15C0388 +:101A900004F16C020EA8FFF7E1FA2046FFF748FBBD +:101AA000A0780EAEC0F11001304412F000FC062008 +:101AB0008DF82000686A09960D909AE004F16C0395 +:101AC00004F15C020EA8FFF7C9FAE9E739780229A8 +:101AD00003D139790029D1D029758FE28DF8200002 +:101AE000686A0D9058E538780728F6D1D4E90921BD +:101AF0006078012808D004F16C00CDE90002029161 +:101B000005D104F16C0304E004F15C00F5E704F195 +:101B10005C0304F14C007A680646216AFFF764F919 +:101B20006078012821D1A078216A0A18C0F110013B +:101B3000104612F0BCFBD4E90923606B04F12D01BF +:101B40008DE80F0004F15C0304F16C0231460EA82D +:101B500000E055E2FFF7CAF910220EA904F13C009B +:101B600012F0FAFA08B10B20AFE485F8008000BF4C +:101B70008DF82090686A0D908DF824A00CE53878D7 +:101B80000528AAD18DF82000686A0D90B8680A90DF +:101B9000ADF824A08DF830B080F80080617801297C +:101BA0001AD0D4E9093204F12D01A66B03920096F4 +:101BB000CDE9011304F16C0304F15C0204F14C0162 +:101BC000401CFFF793F9002108A8FFF78DFA607811 +:101BD000012805D0152041E6D4E90923611DE4E779 +:101BE0000E20287006208DF82000686ACDF824B0F9 +:101BF0000D90A0788DF82800CEE438780328C0D165 +:101C0000E079C00770D00F202870072066E7387889 +:101C100004286BD11422391D04F1140012F00DFBBD +:101C2000616A208CA1F80900616AA078C871E17925 +:101C3000626A01F003011172616A627A0A73616A71 +:101C4000A07A81F82400162060E485F800A08DF8C1 +:101C50002090696A50460D9190E00000A447020070 +:101C60003878052842D1B868A8616178606A02298D +:101C700001D0012100E0002101EB4101142606EB17 +:101C8000C1014058082102F024F86178606A0229F5 +:101C900001D0012100E0002101EB410106EBC1016F +:101CA000425802A8E169FFF70DFA6078626A0228DB +:101CB00001D0012000E0002000EB4001102000EBEB +:101CC000C1000223105802A90932FEF7F1FF626A2F +:101CD000FD4B0EA80932A169FFF7E3F96178606A4C +:101CE000022904D0012103E042E18BE0BDE00021A4 +:101CF00001EB4101182606EBC101A27840580EA95C +:101D000012F056FA6178606A022901D0012100E0E0 +:101D1000002101EB410106EBC1014058A1780844C4 +:101D2000C1F1100112F0C3FA05208DF82000686A95 +:101D30000D90A8690A90ADF824A08DF830B0062166 +:101D400001706278616A022A01D0012200E000225B +:101D500002EB420206EBC202401C8958102212F02C +:101D600027FA002108A8FFF7BFF91220C5F818B01C +:101D700028708DF82090686A0D900B208DF8240053 +:101D80000AE43878052870D18DF82000686A0D9033 +:101D9000B8680A900B20ADF824000A98072101705A +:101DA0006178626A022901D0012100E0002101EB83 +:101DB0004103102101EBC30151580988A0F801101B +:101DC0006178626A022902D0012101E02FE100213D +:101DD00001EB4103142101EBC30151580A6840F89B +:101DE000032F4968416059E01920287001208DF8BF +:101DF000300077E6162028708DF830B0002108A852 +:101E0000FFF772F9032617E114202870B0E638783E +:101E100005282AD18DF82000686A0D90B8680A90CC +:101E2000ADF824A08DF830B080F800906278616A37 +:101E30004E46022A01D0012200E0002202EB4202BB +:101E40001C2303EBC202401C8958102212F0B0F987 +:101E5000002108A8FFF748F9152028708DF82060A8 +:101E6000686A0D908DF824603CE680E0387805289B +:101E70007DD18DF82000686A0D90B8680A90ADF8A1 +:101E800024900921017061690978490841706169EC +:101E900051F8012FC0F802208988C18020781C28C1 +:101EA000A8D1A1E7E078C00702D04FF0060C01E00E +:101EB0004FF0070C607802280AD04FF0000000BFF6 +:101EC00000EB040101F1090105D04FF0010004E02D +:101ED0004FF00100F4E74FF000000B78204413EAC4 +:101EE0000C030B7010F8092F02EA0C02027004D1E7 +:101EF0004FF01B0C84F800C0D2B394F801C0BCF1C1 +:101F0000010F00D09BB990F800C0E0465FEACC7C9E +:101F100004D028F001060670102606E05FEA887CEF +:101F200005D528F00206067013262E70032694F8B5 +:101F300001C0BCF1020F00D092B991F800C05FEA75 +:101F4000CC7804D02CF001060E70172106E05FEA71 +:101F50008C7805D52CF002060E7019212170002610 +:101F60000078D0BBCAB3C3BB1C20207035E012E0A0 +:101F700002E03878062841D11A2019E42078012897 +:101F80003CD00C283AD02046FFF7F0F809208DF815 +:101F90002000686A0D9031E03878052805D00620C9 +:101FA000387003261820287046E005218DF820108F +:101FB000686A0D90B8680A900220ADF824000120EC +:101FC0008DF830000A980170297D4170394608A8C3 +:101FD000FFF78AF8064618202870012E0ED02BE055 +:101FE00001208DF82000686A0D9003208DF82400F0 +:101FF000287D8DF8250085F814B012E0287D80B189 +:102000001D202070172028708DF82090686A0D9090 +:1020100002208DF82400394608A8FFF765F8064627 +:102020000AE00CB1FE2020709DF8200020B10021B4 +:1020300008A8FFF759F810E413B03046BDE8F08F58 +:102040002DE9F04387B00C464E6900218DF804104D +:1020500001202578034602274FF007094FF0050CB1 +:1020600085B1012D53D0022D39D1FE2030708DF86D +:102070000030606A059003208DF80400207E8DF802 +:10208000050063E02179012925D002292DD00329FB +:1020900028D0042923D1B17D022920D131780D1F08 +:1020A000042D04D30A3D032D01D31D2917D1218905 +:1020B000022914D38DF80470237020899DF8041030 +:1020C00088421BD2082001E09C4702008DF80000E6 +:1020D000606A059057E070780128EBD0052007B0C2 +:1020E000BDE8F0831D203070E4E771780229F5D156 +:1020F00031780C29F3D18DF80490DDE7083402F82B +:1021000004CB94E80B0082E80B000320E7E7157886 +:10211000052DE4D18DF800C0656A05959568029596 +:102120008DF8101094F80480B8F1010F13D0B8F1B5 +:10213000020F2DD0B8F1030F1CD0B8F1040FCED18F +:10214000ADF804700E202870207E6870002168466B +:10215000FEF7CAFF0CE0ADF804700B202870207E5B +:10216000002100F01F0068706846FEF7BDFF377061 +:102170000020B4E7ADF804708DF8103085F800C089 +:10218000207E6870277011466846FEF7ADFFA6E70F +:10219000ADF804902B70207F6870607F00F0010024 +:1021A000A870A07F00F01F00E870E27F2A71C007CE +:1021B0001CD094F8200000F00700687194F821000A +:1021C00000F00700A87100216846FEF78DFF28681F +:1021D000F062A8883086A87986F83200A069407835 +:1021E00070752879B0700D203070C1E7A9716971E0 +:1021F000E9E700B587B004280CD101208DF8000074 +:102200008DF80400002005918DF805000146684610 +:10221000FEF76AFF07B000BD70B50C46054602F038 +:1022200031F821462846BDE870407823002201F0AD +:102230007FBF08B1007870470C20704770B50C0064 +:1022400005784FF000010CD021702146F3F701F81A +:1022500069482178405D884201D1032070BD022089 +:1022600070BDF2F7F6FF002070BD0279012A05D09B +:1022700000220A704B78012B02D003E00420704743 +:102280000A758A6102799300521C0271C1500320C1 +:102290007047F0B587B00F4605460124287905EB55 +:1022A000800050F8046C7078411E02290AD252490D +:1022B0003A46083901EB8000314650F8043C284684 +:1022C000984704460CB1012C11D12879401E10F01A +:1022D000FF00287101D00324E0E70A208DF80000F8 +:1022E000706A0590002101966846FFF7A7FF032C4E +:1022F000D4D007B02046F0BD70B515460A46044656 +:1023000029461046FFF7C5FF064674B12078FE281F +:102310000BD1207C30B100202870294604F10C003C +:10232000FFF7B7FF2046FEF721FF304670BD70472C +:1023300070B50E4604467C2111F0DBFF0225012E0C +:1023400003D0022E04D0052070BD0120607000E093 +:1023500065702046FEF70AFFA575002070BD28B104 +:10236000027C1AB10A4600F10C01C5E70120704752 +:1023700010B5044686B0042001F084FF2078FE28C2 +:1023800006D000208DF8000069462046FFF7E7FFE1 +:1023900006B010BD7CB50E4600218DF804104178C2 +:1023A000012903D0022903D0002405E0046900E0DC +:1023B00044690CB1217C89B16D4601462846FFF77E +:1023C00054FF032809D1324629462046FFF794FFDF +:1023D0009DF80410002900D004207CBD04F10C05F8 +:1023E000EBE730B40C460146034A204630BC034BB1 +:1023F0000C3AFEF756BE0000E04702009C47020080 +:1024000070B50D46040011D085B12101284611F0A8 +:102410004EFF10224E49284611F0CAFE4C480121B9 +:102420000838018044804560002070BD012070BDE7 +:1024300070B5474E00240546083E10E07068AA7B40 +:1024400000EB0410817B914208D1C17BEA7B914271 +:1024500004D10C22294611F07FFE30B1641C308873 +:102460008442EBDB4FF0FF3070BD204670BD70B58D +:102470000D46060006D02DB1FFF7DAFF002803DB7A +:10248000401C14E0102070BD314C083C208862884C +:10249000411C914201D9042070BD6168102201EBFA +:1024A0000010314611F084FE2088401C20802870E6 +:1024B000002070BD70B514460D0018D0BCB10021CD +:1024C000A170022802D0102811D105E0288870B12F +:1024D0000121A170108008E02846FFF7A9FF00281D +:1024E00005DB401CA070A8892080002070BD012061 +:1024F00070BD70B5054614460E000BD0002030703C +:10250000A878012808D005D91149A1F108010A8845 +:1025100090420AD9012070BD24B128782070288803 +:10252000000A5070022008700FE064B14968102260 +:1025300001EB00112046103911F03AFE2878207383 +:102540002888000A607310203070002070BD0000E1 +:102550007C0000202DE9F04190460C4607460025FE +:10256000FE48072F00EB881607D2DFE807F00707C1 +:10257000070704040400012500E0FFDF06F81470DB +:10258000002D13D0F548803000EB880191F827002A +:10259000202803D006EB4000447001E081F826407B +:1025A00006EB44022020507081F82740BDE8F081FE +:1025B000F0B51F4614460E460546202A00D1FFDF1F +:1025C000E649E648803100EB871C0CEB440001EB48 +:1025D0008702202E07D00CEB460140784B784870DC +:1025E000184620210AE092F82530407882F825002C +:1025F000F6E701460CEB410005704078A142F8D1A6 +:1026000092F82740202C03D00CEB4404637001E0C7 +:1026100082F826300CEB41042023637082F82710E7 +:10262000F0BD30B50D46CE4B44190022181A72EB9E +:10263000020100D2FFDFCB48854200DDFFDFC94841 +:102640004042854200DAFFDFC548401C844207DA79 +:10265000002C01DB204630BDC148401C201830BD95 +:10266000BF48C043FAE710B504460168407ABE4A45 +:1026700052F82020114450B10220084420F07F403D +:10268000F0F779FA94F90810BDE81040C9E7042082 +:10269000F3E72DE9F047B14E803696F82D50DFF87C +:1026A000BC9206EB850090F8264034E009EB8517D4 +:1026B0004FF0070817F81400012806D004282ED080 +:1026C00005282ED0062800D0FFDF01F0E3F80146F0 +:1026D00007EB4400427806EB850080F8262090F84E +:1026E0002720A24202D1202280F82720084601F0AC +:1026F000DCF82A4621460120FFF72CFF9B48414683 +:1027000000EB041002682046904796F82D5006EB27 +:10271000850090F82640202CC8D1BDE8F087022023 +:1027200000E003208046D0E710B58C4C2021803497 +:1027300084F8251084F8261084F82710002084F8E7 +:10274000280084F82D0084F82E10411EA16044F862 +:10275000100B2074607420736073A0738449E07759 +:1027600020750870487000217C4A103C02F8110066 +:10277000491CC9B22029F9D30120F0F7EAF800205A +:10278000F0F7E7F8012084F82200F9F7D1FA794848 +:10279000F9F7DDFA764CA41E20707748F9F7D7FADE +:1027A0006070BDE81040F0F761B810B5F0F783F83D +:1027B0006F4CA41E2078F9F7E3FA6078F9F7E0FA95 +:1027C000BDE8104001F09EB8202070472DE9F34F7E +:1027D000624E0025803606EB810A89B09AF8250002 +:1027E000202822D0691E02916049009501EB00105B +:1027F0008146D0E90112C0680391CDE90420B08B75 +:10280000ADF81C00B07F8DF81E009DF81500C8B112 +:102810000227554951F820400399E219114421F04B +:102820007F41019184B102210FE00120F0F791F87E +:102830000020F0F78EF8F0F75CF801F063F886F806 +:102840002F50A0E00427E4E700218DF8181002289B +:1028500001D0012820D10398391901440998081A98 +:102860009DF81C1020F07F4001B1022133318142DC +:102870000BD203208DF815000398C4F13201401AE1 +:1028800020F07F40322403900CE096F8240018B921 +:10289000F0F782FB00284CD0322C03D214B101F0A7 +:1028A00025F801E001F02EF8314A107818B393466C +:1028B0005278039B121B00219DF81840984601286E +:1028C0001AD0032818D000208DF81E00002A04DD3D +:1028D000981A039001208DF818009DF81C0000B193 +:1028E00002210398254A20F07F40039003AB09980A +:1028F00001F014F810B110E00120E5E79DF81D008B +:1029000018B99BF80000032812D08DF81C50CDF8A0 +:102910000C808DF818408DF81E509DF8180058B1A5 +:1029200003980123C11900221846F0F765F806E064 +:1029300000200BB0BDE8F08F0120F0F70AF899F9FC +:102940000C20012300200199F0F756F8012086F8A9 +:102950002F008AF828502022694611E098080020AC +:10296000FF7F841E0020A107F04702009806002088 +:102970008E000020DF3F010093260100FFFF3F0093 +:10298000F94811F05AFC0120D3E72DE9F05FDFF898 +:10299000D883064608EB860090F82550202D1FD0DE +:1029A000A8F180002C4600EB8617A0F50079DFF82F +:1029B000BCB305E0A24607EB4A004478202C0AD0BD +:1029C000F0F766F809EB04135A4601211B1D00F0CD +:1029D000A5FF0028EED0AC4202D0334652461EE09E +:1029E000E34808B1AFF30080F0F752F898F82F20D1 +:1029F0006AB1D8F80C20411C891A0902CA1701EBE8 +:102A000012610912002902DD0020BDE8F09F314665 +:102A1000FFF7DCFE08B10120F7E733462A46202104 +:102A20000420FFF7C5FDEFE72DE9F041CE4C256905 +:102A3000F0F72EF8401B0002C11700EB11600012E6 +:102A400000D4FFDF94F8220000B1FFDF012784F8F3 +:102A5000227094F82E00202800D1FFDF94F82E6019 +:102A6000202084F82E00002584F82F5084F8205070 +:102A700084F82150BF4825600078022833D003280D +:102A800031D000202077A068401C05D04FF0FF30E7 +:102A9000A0600120EFF75DFF0020EFF75AFFF0F78D +:102AA00058F8F0F750F8EFF724FF10F0D7FDB248D0 +:102AB000056005604FF0E0214FF40040B846C1F8D2 +:102AC0008002F0F7E0F894F82D703846FFF75DFFCC +:102AD0000028FAD0A448803800EB871010F81600C0 +:102AE000022802D006E00120CCE73A463146062013 +:102AF000FFF730FD84F8238004EB870090F8260070 +:102B0000202804D09B48801E4078F9F73FF9207FA9 +:102B1000002803D0F0F70DF82577657746E50146E4 +:102B2000914810B590F82D200024803800EB8210D9 +:102B300010F814302BB1641CE4B2202CF8D3202000 +:102B400010BD8E4800EB0410016021460120FFF704 +:102B500001FD204610BD10B5012801D0032800D189 +:102B600071B3814A92F82D307F4C0022803C04EBF7 +:102B7000831300BF13F812400CB1082010BD521C83 +:102B8000D2B2202AF6D37B4A48B1022807D00729BF +:102B900016D2DFE801F01506080A0C0E100000211D +:102BA0000AE01B2108E03A2106E0582104E07721E1 +:102BB00002E0962100E0B52151701070002010BD98 +:102BC000072010BD6B4810B54078EFF7D4FF80B2F6 +:102BD00010BD10B5202811D2634991F82D30A1F114 +:102BE000800202EB831414F810303BB191F82D30C1 +:102BF00002EB831212F81020012A01D0002010BD30 +:102C000091F82D2001460020FFF7A4FC012010BD03 +:102C100010B5EFF73DFFBDE81040EFF7ACBF2DE971 +:102C2000F0410E46504F01782025803F0C4607EBBF +:102C3000831303E0254603EB45046478944202D0F5 +:102C4000202CF7D108E0202C06D0A14206D103EBBE +:102C500041014978017007E00020A7E403EB44003C +:102C600003EB450140784870454F7EB127B1002104 +:102C700040F2DA30AFF300803078A04206D127B1BD +:102C8000002140F2DD30AFF30080357027B1002124 +:102C900040F2E230AFF30080012087E410B54268D3 +:102CA0000B689A1A1202D41702EB1462121216D48D +:102CB000497A91B1427A82B9324A006852F82110B9 +:102CC000126819441044001D891C081A0002C1171B +:102CD00000EB11600012322801DB012010BD002042 +:102CE00010BD2DE9F04781461F48244E00EB8100BE +:102CF000984690F825402020107006F50070154683 +:102D000000EB81170BE000BF06EB04104946001DE5 +:102D1000FFF7C4FF28B107EB44002C704478202C47 +:102D2000F2D1297888F8001013E000BF06EB0415F3 +:102D3000291D4846FFF7B2FF68B988F80040A97B13 +:102D400099F80A00814201D80020E6E407EB44002C +:102D50004478202CEAD10120DFE42DE9FC410E4625 +:102D600007460024054D18E018090020FFFF3F002A +:102D7000000000008E00002000F5004098060020B2 +:102D800000000000F04702009DF8000005EB001075 +:102D90008168384600F0D6FD01246B4601AA314611 +:102DA0003846FFF79EFF0028EED02046BDE8FC81A4 +:102DB00070B50446FF480125A54300EB841100EBE4 +:102DC0008510402211F0F4F9FB4E26B1002140F2AB +:102DD0005C40AFF30080F748803000EB850100EBEA +:102DE0008400D0F82500C1F8250026B100214FF459 +:102DF0008C60AFF30080284670BD2DE9FC4184460D +:102E0000EC481546089C00EB85170E4617F8140091 +:102E1000012803D0022801D00020C7E70B46E74A6B +:102E20000121604600F07AFDA8B101AB6A4629464F +:102E30003046FFF756FF70B1DE489DF804209DF83C +:102E40000010803000EB85068A4208D02B46052012 +:102E5000FFF7AEFB0BE02A462146042014E02029B0 +:102E600003D007EB4100407801E096F8250007EB1E +:102E7000440148709DF80000202809D007EB40006D +:102E800044702A4621460320FFF764FB01208DE7AA +:102E900006F8254F0120F070F3E7C94901EB001057 +:102EA000001DFFF7E0BB7CB51D46134604460E46E9 +:102EB00000F1080221461846EFF76AFE94F908006F +:102EC0000F2804DD1F3820722068401C206096B156 +:102ED0000220BC4951F82610461820686946801B1C +:102EE00020F07F40206094F908002844C01C1F286F +:102EF00003DA012009E00420EBE701AAEFF748FE1E +:102F00009DF8040010B10098401C009000992068C2 +:102F100031440844C01C20F07F4060607CBD2DE936 +:102F2000FE430C46064609786079907220799846EF +:102F30001546507241B19F48803090F82E102029DC +:102F40000AD00069401D0BE0D4E90223217903B0C7 +:102F50002846BDE8F043A6E79B484178701D084429 +:102F600020F07F47217900222846A368FFF79BFFC6 +:102F70003946284600F0E6FCD4E902322179684659 +:102F8000FFF791FF41462846019CFFF7E6FE2B46DE +:102F900022460021304600F0C1FC002803D1314612 +:102FA000284600F0CFFCBDE8FE832DE9FE4F8146A8 +:102FB00000F084FC30B1002799F8000020B1002017 +:102FC000BDE8FE8F0127F7E77A4D7B4C4FF0000AF2 +:102FD000803524B1002140F2D340AFF3008095F852 +:102FE0002D8085F823A0002624B100214FF49B609A +:102FF000AFF300801FB94046FFF7DAFE804624B1E8 +:1030000000214FF49C60AFF30080EFF741FD434691 +:103010006A464946FFF783FF24B1002140F2E640AB +:10302000AFF3008095F82E0020280CD02969009875 +:10303000401A0002C21700EB1260001203D5684666 +:1030400000F080FC012624B100214FF49E60AFF314 +:10305000008095F823000028BBD124B1002140F264 +:10306000F640AFF30080EFF713FD6B46534A0021A3 +:1030700000F054FC0028A3D027B941466846FFF76A +:103080006CFE064326B16846FFF7EDFAC9F8080062 +:1030900024B1002140F20950AFF3008001208FE7F6 +:1030A0002DE9FF5F8A46814600F008FC414C8034E0 +:1030B00010B39AF80000002710B1012800D0FFDFFC +:1030C0003D4D25B1002140F27F50AFF3008001203B +:1030D000A84600905FEA080604D0002140F287501D +:1030E000AFF30080009800F0E0FB94F82D50002032 +:1030F00084F8230067B119E094F82E0001272028F6 +:1031000000D1FFDF9AF800000028D9D0FFDFD7E711 +:103110002846FFF74DFE054626B1002140F29150AA +:10312000AFF3008094F823000028D3D126B100210A +:1031300040F29B50AFF30080EFF7AAFC83462B468A +:1031400001AA5146FFF7EBFE5FEA060804D0002112 +:1031500040F2A250AFF300803B462A4601A95846F0 +:10316000CDF80090FFF749FE064604EB850090F885 +:1031700028B0B8F1000F04D0002140F2A950AFF3FD +:10318000008000F087FB0090B8F1000F04D0002110 +:1031900040F2AF50AFF3008094F82300002899D19B +:1031A000B8F1000F04D0002140F2B750AFF3008017 +:1031B00003490BE09808002000000000FFFF3F00DB +:1031C00098060020F04702008E00002001EB091055 +:1031D0000DF1040C00F104009CE80E0080E80E00E4 +:1031E0004EB35FEA080604D0002140F2C450AFF3AA +:1031F00000803BEA070012D094F82E0020280ED160 +:1032000026B1002140F2C950AFF300802846FFF7F5 +:10321000BCFB20B99AF80000D8B3012849D0B8F116 +:10322000000F04D0002140F2E650AFF300802846A2 +:1032300000F029FB01265FEA080504D0002140F2D6 +:10324000EF50AFF30080009800F02FFB25B1002174 +:1032500040F2F350AFF300808EB194F82D0004EBF0 +:10326000800090F82600202809D025B1002140F2E6 +:10327000FA50AFF30080F9484078F8F787FD25B1A0 +:10328000002140F2FF50AFF3008004B03046BDE8AB +:10329000F09FFFE7B8F1000F04D0002140F2D150B9 +:1032A000AFF3008094F82D2049460420FFF752F92F +:1032B000C0E7002E3FF40EAF002140F2DC50AFF328 +:1032C000008007E72DE9F84FE54D814695F82D0080 +:1032D0004FF00008E34C4FF0010B474624B10021AA +:1032E00040F20D60AFF30080584600F0DEFA85F83A +:1032F000237024B1002140F21260AFF3008095F8F2 +:103300002D00FFF755FD064695F8230028B1002C47 +:10331000E4D000214FF4C3604BE024B1002140F21F +:103320001C60AFF30080CE48803800EB861111F8A6 +:103330001900032856D1334605EB830A4A469AF80A +:103340002500904201D1012000E0002000900AF108 +:1033500025000021FFF763FC01460098014203D0DD +:1033600001228AF82820AF77E1B324B1002140F28E +:103370002160AFF30080324649460120FFF7EAF8AA +:103380009AF828A024B1002140F22C60AFF300800D +:1033900000F080FA834624B1002140F23160AFF39F +:1033A000008095F8230038B1002C97D0002140F21E +:1033B0003560AFF3008091E7BAF1000F07D095F8C0 +:1033C0002E00202803D13046FFF7DFFAE0B124B108 +:1033D000002140F24960AFF30080304600F053FA1C +:1033E0004FF0010824B1002140F25260AFF3008099 +:1033F000584600F05AFA24B1002140F25660AFF36B +:1034000000804046BDE8F88F002CF1D0002140F24A +:103410004460AFF30080E6E70020EFF773BA0120C5 +:10342000EFF770BA8D48007870472DE9F0418C4C69 +:1034300094F82E0020281FD194F82D6004EB860705 +:1034400097F82550202D00D1FFDF8549803901EB09 +:10345000861000EB4500407807F8250F0120F87032 +:1034600084F82300294684F82E5032460220223464 +:10347000FFF770F8002020700FE42DE9F0417A4E3C +:10348000774C012538B1012821D0022879D00328B2 +:103490007DD0FFDFF0E700F029FAFFF7C6FF207EBE +:1034A00000B1FFDF84F821500020EFF752FAA16845 +:1034B000481C04D0012300221846EFF79DFA14F8A7 +:1034C0002E0F217806EB01110A68012154E0FFF765 +:1034D000ACFF0120EFF73DFA94F8210050B1A0684D +:1034E000401C07D014F82E0F217806EB01110A6852 +:1034F000062141E0207EDFF86481002708F1020800 +:10350000012803D002281ED0FFDFB5E7A777EFF729 +:1035100010FB98F80000032801D165772577607DBE +:10352000524951F8200094F8201051B948B161680F +:103530000123091A00221846EFF75EFA02202076CE +:103540009AE7277698E784F8205000F0CFF9A07F1B +:1035500050B198F8010061680123091A0022184649 +:10356000EFF74AFA257600E0277614F82E0F217837 +:1035700006EB01110A680021BDE8F041104700E0A8 +:1035800005E036480078BDE8F041F8F7FFBBFFF7EB +:103590004CFF14F82E0F217806EB01110A68052163 +:1035A000EAE710B52E4C94F82E00202800D1FFDF5A +:1035B00014F82E0F21782C4A02EB01110A68BDE89D +:1035C0001040042110477CB5254C054694F82E0088 +:1035D000202800D1FFDFA068401C00D0FFDF94F856 +:1035E0002E00214901AA01EB0010694690F90C0058 +:1035F0002844EFF7CDFA9DF904000F2801DD0120E2 +:1036000000E00020009908446168084420F07F41F0 +:10361000A16094F82100002807D002B00123BDE882 +:10362000704000221846EFF7E7B97CBD30B5104A6C +:103630000B1A541CB3EB940F1ED3451AB5EB940F21 +:103640001AD3934203D9101A43185B1C14E0954215 +:1036500010D9511A0844401C43420DE08C00002050 +:10366000180900200000000098060020F047020022 +:10367000FF7F841EFFDF0023184630BD0123002298 +:1036800001460220EFF7B8B90220EFF762B9EFF771 +:10369000FFB92DE9FC47B14C054694F82E002028CF +:1036A00000D1FFDF642D58D3AD4A0021521B71EBCE +:1036B000010052D394F82E20A0462046DFF8A492B1 +:1036C00090F82D7009EB0214D8F8000001AA2844E4 +:1036D0006946EFF75DFA9DF90400002802DD0098C5 +:1036E000401C0090A068009962684618B21A22F047 +:1036F0007F42B2F5800F30D208EB8702444692F841 +:103700002520202A0AD009EB02125268101A000262 +:10371000C21700EB1260001288421EDBA068401C3A +:1037200010D0EFF7B5F9A168081A0002C11700EB35 +:1037300011600012022810DD0120EFF70AF94FF0A6 +:10374000FF30A06020682844206026F07F40206180 +:10375000012084F82300BDE8FC870020FBE72DE969 +:10376000F0477E4C074694F82D00A4F1800606EB46 +:10377000801010F8170000B9FFDF94F82D50A04614 +:10378000794C24B1002140F66500AFF3008040F68B +:10379000710940F67A0A06EB851600BF16F8170085 +:1037A000012818D0042810D005280ED006280CD0E7 +:1037B0001CB100214846AFF3008020BF002CEDD0A3 +:1037C00000215046AFF30080E8E72A463946012041 +:1037D000FEF7C0FEF2E74FF0010A4FF00009454640 +:1037E00024B1002140F68100AFF30080504600F084 +:1037F0005CF885F8239024B1002140F68600AFF3F1 +:10380000008095F82D00FFF7D3FA064695F82300BF +:1038100028B1002CE4D0002140F68C001FE024B138 +:1038200000214FF40960AFF3008005EB860000F142 +:10383000270133463A462630FFF7F1F924B100213B +:1038400040F69400AFF3008000F024F8824695F82B +:10385000230038B1002CC3D0002140F69A00AFF30A +:103860000080BDE785F82D60012085F823005046D3 +:1038700000F01BF8002C04D0002140F6A700AFF3A5 +:103880000080BDE8F087354981F82D00012081F8DE +:103890002300704710B5354808B1AFF30080EFF34F +:1038A000108000F0010072B610BD10B5002804D1E0 +:1038B0002F4808B1AFF3008062B610BD2D480068F4 +:1038C000C005C00D10D0103840B2002806DA00F054 +:1038D0000F0000F1E02090F8140D03E000F1E0206B +:1038E00090F80004400970470820704710B51B4C41 +:1038F00094F82400002804D1F8F72AF8012084F86D +:10390000240010BD10B5154C94F82400002804D0F4 +:10391000F8F747F8002084F8240010BD10B51C68A3 +:103920005B68241A181A24F07F4420F07F40A142DB +:1039300006D8B4F5800F03D2904201D8012010BD03 +:10394000002010BDD0E90032D21A21F07F4311448B +:1039500021F07F41C0E900317047000018090020C4 +:10396000FF1FA107980600200000000000000000D3 +:103970000000000004ED00E02DE9F041044680075E +:103980004FF000054FF001060CD560480560066059 +:103990000FF0C6FC20B15E48016841F4806101600F +:1039A00024F00204E0044FF0FF3705D55948466083 +:1039B000C0F8087324F48054600003D556480560AD +:1039C00024F08044E0050FD55448C0F80052C0F8F8 +:1039D000087353490D60091D0D60514A04210C32D2 +:1039E0001160066124F48074A00409D54D48466036 +:1039F000C0F80052C0F808734B48056024F4005426 +:103A0000C4F38030C4F3C031884200D0FFDF14F427 +:103A1000404F14D045484660C0F80873444886605B +:103A2000C0F80052C0F8087342490D600A1D1660C4 +:103A30008660C0F808730D60166024F440442005C9 +:103A40000AD53D4846608660C0F80873C0F84873E0 +:103A50003A48056024F400640FF0DAFD3848044267 +:103A600000D0FFDFBDE8F08170B5202500221346AD +:103A700020FA02F1C90719D051B201F01F06012442 +:103A8000B4404E09B60006F1E026C6F88041C6F8FB +:103A90008042002906DA01F00F0101F1E02181F8EE +:103AA000143D03E001F1E02181F80034521CAA42E8 +:103AB000DED370BD70B5234C0D462060FFF75CFF70 +:103AC0002068FFF7D1FF2846F8F71FF80FF0FAF942 +:103AD00000F0AFF80FF09CFD0FF0E7FCF8F728F9C5 +:103AE000BDE870400FF09CBA10B5164C2068FFF787 +:103AF00043FF2068FFF7B8FF0FF08AFDF8F794F84E +:103B00000020206010BD0A2070470000FC1F00400C +:103B10003C17004000C0004004E501400080004028 +:103B20000485004000D0004004D5004000E0004083 +:103B300000F0004000F5004000B0004008B5004033 +:103B4000FEFF0FFD9000002070B526490A680AB3F9 +:103B50000022154601244B685B1C4B60092B00D3E7 +:103B60004D600E7904FA06F30E681E420FD0EFF393 +:103B7000108212F0010272B600D001220C689C4340 +:103B80000C6002B962B649680160002070BD521C29 +:103B9000092AE0D3052070BD4FF0E0214FF48000EA +:103BA000C1F800027047EFF3108111F0010F72B6F7 +:103BB0004FF0010202FA00F20A48036842EA0302E7 +:103BC000026000D162B6E7E706480021016041606B +:103BD00070470121814003480068084000D001205F +:103BE00070470000940000202DE9F04115460E4674 +:103BF0000446002700F0E7F8A84215D3002341202F +:103C00000FE000BF94F84220A25CF25494F84210F6 +:103C1000491CB1FBF0F200FB12115B1C84F842104E +:103C2000DBB2AB42EED3012700F0D9F83846BDE84D +:103C3000F081704910B5802081F800046E490020A1 +:103C400081F8420081F84100433181F8420081F857 +:103C50004100433181F8420081F8410067480FF08C +:103C60006DFB6648401C0FF069FBEFF71BF8BDE8E1 +:103C7000104000F0B4B8402070475F4800F0A3B88F +:103C80000A4601465C48AFE7402070475A48433037 +:103C900000F099B80A46014657484330A4E740214E +:103CA00001700020704710B504465348863000F07C +:103CB0008AF82070002010BD0A4601464E4810B513 +:103CC0008630FFF791FF08B1002010BD42F20700D7 +:103CD00010BD70B50C460546412900D9FFDF4848A4 +:103CE0000068103840B200F050F8C6B20D2000F065 +:103CF0004CF8C0B2864203D2FFDF01E0EFF722F8B2 +:103D0000224629463C48FFF76FFF0028F6D070BDD9 +:103D10002DE9F041394F002506463F1D57F8254053 +:103D2000204600F041F810B36D1CEDB2032DF5D321 +:103D30003148433000F038F8002825D02E4800F0F4 +:103D400033F8002820D02C48863000F02DF80028C9 +:103D50001AD0EEF7CDFF29480FF0F8FAB0F5005F62 +:103D600000D0FFDFBDE8F04124480FF005BB94F818 +:103D700041004121265414F8410F401CB0FBF1F2E0 +:103D800001FB12002070D3E751E7002806DA00F0AB +:103D90000F0000F1E02090F8140D03E000F1E020A6 +:103DA00090F800044009704710F8411F4122491C57 +:103DB000B1FBF2F302FB13114078814201D10120E3 +:103DC00070470020704710F8411F4078814201D3AE +:103DD000081A02E0C0F141000844C0B2704710B5B3 +:103DE00006480FF0B3FA002803D1BDE81040EEF703 +:103DF0006ABF10BD0DE000E0480900209C000020D3 +:103E000004ED00E070B5154D2878401CC4B2687808 +:103E1000844202D0EFF727F82C7070BD2DE9F041F5 +:103E20000E4C4FF0E02600BFEFF712F820BF40BF66 +:103E300020BF677820786070D6F80052EDF76EFAF0 +:103E4000854305D1D6F8040210B92078B842EBD0EA +:103E5000EEF7F9FF0020BDE8F0810000AC00002083 +:103E60002DE9F041012528034FF0E0210026C1F89B +:103E700080011E4CC4F800610C2000F02CF81C4896 +:103E800001680268C94341F3001142F01002026068 +:103E9000C4F804532560491C00E020BFD4F8002179 +:103EA000002AFAD019B9016821F010010160114807 +:103EB00007686560C4F80853C4F800610C2000F07E +:103EC0000AF83846BDE8F08110B50446FFF7C8FF90 +:103ED0002060002010BD00F01F0201219140400928 +:103EE000800000F1E020C0F88012704700C0004060 +:103EF00010ED00E008C500402DE9F047FF4C0646F4 +:103F0000FF21A06800EB061211702178FF2910D064 +:103F10004FF0080909EB011109EB06174158C05988 +:103F200000F0F4F9002807DDA168207801EB061104 +:103F300008702670BDE8F08794F8008045460DE0D3 +:103F4000A06809EB05114158C05900F0DFF90028BD +:103F500006DCA068A84600EB08100578FF2DEFD11D +:103F6000A06800EB061100EB08100D700670E1E789 +:103F7000F0B5E24B0446002001259A680C269B7898 +:103F80000CE000BF05EB0017D75DA74204D106EB9C +:103F90000017D7598F4204D0401CC0B28342F1D8D9 +:103FA000FF20F0BD70B5FFF772FBD44C08252278D6 +:103FB000A16805EB0212895800F0A8F9012808DD74 +:103FC0002178A06805EB01114058BDE87040FFF76B +:103FD00055BBFFF727FABDE87040F7F7D7BE2DE9CC +:103FE000F041C64C2578FFF752FBFF2D6ED04FF005 +:103FF0000808A26808EB0516915900F087F9022815 +:10400000A06801DD80595DE000EB051109782170A1 +:10401000022101EB0511425C5AB1521E42548159F2 +:1040200001F5800121F07F4181512846FFF764FFAF +:1040300034E00423012203EB051302EB051250F8D0 +:1040400003C0875CBCF1000F10D0BCF5007F10D915 +:10405000CCF3080250F806C00CEB423C2CF07F4C2D +:1040600040F806C0C3589A1A520A09E0FF21815449 +:104070000AE0825902EB4C3222F07F428251002248 +:1040800042542846FFF738FF0C21A06801EB0511C8 +:104090004158E06850F82720384690472078FF289C +:1040A00014D0FFF7F4FA2278A16808EB0212454613 +:1040B000895800F02BF9012893DD2178A06805EBE1 +:1040C00001114058BDE8F041FFF7D8BABDE8F081D2 +:1040D000F0B51D4614460E460746FF2B00D3FFDF02 +:1040E000A00700D0FFDF8548FF210022C0E902477A +:1040F000C57006710170427082701046012204E0A2 +:1041000002EB0013401CE154C0B2A842F8D3F0BD4A +:1041100070B57A4C064665782079854200D3FFDF7A +:10412000E06840F825606078401C6070284670BDEB +:104130002DE9FF5F1D468B460746FF24FFF7A7FAD0 +:10414000DFF8B891064699F80100B84200D8FFDFC1 +:1041500000214FF001084FF00C0A99F80220D9F81D +:1041600008000EE008EB0113C35CFF2B0ED0BB422E +:1041700005D10AEB011350F803C0DC450CD0491CF3 +:10418000C9B28A42EED8FF2C02D00DE00C46F6E709 +:1041900099F803108A4203D1FF2004B0BDE8F09FD4 +:1041A0001446521C89F8022008EB04110AEB041291 +:1041B000475440F802B00421029B0022012B01EB7E +:1041C00004110CD040F801204FF4007808234FF080 +:1041D000020C454513D9E905C90D02D002E045504E +:1041E000F2E7414606EB413203EB041322F07F4233 +:1041F000C250691A0CEB0412490A81540BE005B94C +:10420000012506EB453103EB041321F07F41C1503A +:104210000CEB0411425499F800502046FFF76CFE55 +:1042200099F80000A84201D0FFF7BCFE3846B4E779 +:1042300070B50C460546FFF72AFA06462146284681 +:10424000FFF796FE0446FF281AD02C4D082101EBFB +:104250000411A8684158304600F058F800F5805025 +:10426000C11700EBD14040130221AA6801EB0411F1 +:10427000515C09B100EB4120002800DC012070BD39 +:10428000002070BD2DE9F04788468146FFF770FE9B +:104290000746FF281BD0194D2E78A86831463446B2 +:1042A00005E0BC4206D0264600EB06121478FF2C2F +:1042B000F7D10CE0FF2C0AD0A6420CD100EB011084 +:1042C00000782870FF2804D0FFF76CFE03E0002080 +:1042D00030E6FFF7D9F941464846FFF7A9FF012329 +:1042E000A968024603EB0413FF20C854A878401EB7 +:1042F000B84200D1A87001EB041001E0140A0020BC +:1043000001EB061100780870104613E6081A000247 +:10431000C11700EB116000127047000070B5044631 +:10432000A0F500002D4EB0F1786F02D23444A4F510 +:1043300000042B48844201D2012500E0002500F052 +:1043400043F848B125B9B44204D32648006808E0D0 +:10435000012070BD002070BD002DF9D1B442F9D309 +:1043600021488442F6D2F3E710B50446A0F50000D8 +:10437000B0F1786F03D219480444A4F5000400F0AA +:1043800023F84FF0804130B11648006804E08C42B9 +:1043900004D2012003E014488442F8D2002080F0C7 +:1043A000010010BD10B520B1FFF7DEFF08B10120FC +:1043B00010BD002010BD10B520B1FFF7AFFF08B150 +:1043C000012010BD002010BD08480949006888423E +:1043D00001D101207047002070470000000000203C +:1043E000006002002000002008000020B000002033 +:1043F000BEBAFECA0548064A0168914201D10021B1 +:10440000016004490120086070470000B0000020EE +:10441000BEBAFECA40E50140534800210170417018 +:1044200010218170704770B5054616460C46022073 +:10443000EEF7D7F94C49012008704C49F01E08608E +:104440004B480560001F046070BD10B50220EEF7F8 +:10445000C8F945490120087046480021C0F80011FC +:10446000C0F80411C0F8081143494FF40000086077 +:1044700010BD3D480178C9B1404A4FF400011160B8 +:104480003C49D1F800310022002B1CBFD1F8043187 +:10449000002B02D0D1F8081111B14270102103E0B5 +:1044A0000121417036490968817002700020EEF7E1 +:1044B00098B92D480178002904BF407870472D48ED +:1044C000D0F80011002904BF02207047D0F8001175 +:1044D00000291CBFD0F80411002905D0D0F808012C +:1044E000002804BF01207047002070471E4800B517 +:1044F0000278204B4078C821491EC9B282B1D3F856 +:1045000000C1BCF1000F10D0D3F8000100281CBF7F +:10451000D3F8040100280BD0D3F8080150B107E00C +:10452000022802D0012805D002E00029E4D1FFDFF3 +:10453000002000BD012000BD0B480178002904BF08 +:10454000807870470B48D0F8001100291CBFD0F8C4 +:104550000411002902D0D0F8080108B110207047DA +:1045600007480068C0B27047B400002010F5004052 +:1045700008F5004000F0004004F5014008F5014056 +:1045800000F400404C48002101704170704770B544 +:10459000064614460D460120EEF723F9474806600B +:1045A000001D0460001D056070BD70B54249012505 +:1045B0000D7040EA0241424A41F080711160414C65 +:1045C0000026C4F80461404A4FF040711160002891 +:1045D00002BFC4F80052256070BD012818BFFFDF7C +:1045E000C4F8006225604FF000703849086070BD63 +:1045F0003148017879B1344A4FF040711160314946 +:10460000D1F804210021002A08BF417002D0304AAD +:104610001268427001700020EEF7E3B82648017876 +:10462000002904BF407870472648D0F804010028CC +:1046300008BF704726480068C0B27047002808BF0E +:10464000704730B51C480078002808BFFFDF1D48C0 +:10465000D0F80411002918BF30BD0224C0F804436B +:10466000DFF870C0DCF80010C1F30015DCF80010B2 +:1046700041F01001CCF80010D0F80411002904BF5B +:104680004FF400414FF0E02207D100BFC2F8801282 +:1046900020BFD0F80431002BF8D02DB9DCF8001081 +:1046A00021F01001CCF80010C0F8084330BD0549D6 +:1046B0000120886070470000B700002008F5004026 +:1046C00004F5004000F0004008F5014004F5014009 +:1046D00000F4004010ED00E010B5FF480024012177 +:1046E0004470047044728472C17280F82140846204 +:1046F000446314300FF004FFF849601E0860091D80 +:104700000860091D0C60091D0860091D0C60091D69 +:104710000860091D0860091D0860091D0860091D61 +:104720000860091D0860091D0860091D0860091D51 +:10473000086010BDEA48016801F00F01032904BFB9 +:1047400001207047006800F00F00042804BF022019 +:10475000704700B5FFDF012000BD30B4DE490268BC +:10476000DFF884C34A6142688A61007A08770A7D6B +:10477000DC4BACF1040401204AB10A7E00FA02F2DB +:104780001A608D7D002D0CBF2260CCF800204A7D80 +:10479000002A04BF30BC70474A7E90401860C97D33 +:1047A00000290CBF2060CCF8000030BC704730B549 +:1047B00000250446012904D002290CBF4FF0807562 +:1047C000FFDF45F4847040F48010C849086044F469 +:1047D0004030091D40F00070086030BD30B5002544 +:1047E0000446012904D002290CBF4FF08075FFDF79 +:1047F00045F4847040F48010BC49086044F44030B3 +:10480000091D40F000700860B948D0F80001002888 +:1048100018BFFFDF30BD2DE9F04102264FF0E02741 +:1048200001240025C7F88061B248056004600EF0DD +:1048300077FDB14918B1086840F4806008600868E5 +:1048400020F0770040F0880040F0004008600EF053 +:1048500051FD30B1A948016821F47F4141F4B051C4 +:1048600001600EF047FD9C4940B1A5484E770660B7 +:10487000A54AA4481060121FA4481060A44A40F240 +:104880005B601060121F40F203101060101F046084 +:10489000934A032010609F4A96201060487F0028AA +:1048A00014BF4FF4C0209C4840F440209B4A106045 +:1048B0009C4A9B481060121F9B481060C7F880629A +:1048C0008B4A1020C2F8040381F82D50BDE8F08116 +:1048D0009648016821F0010141F080710160704744 +:1048E0007D4A0368C2F802308088D0801172704718 +:1048F000794B10B51A7A8A4208D101460622981CD3 +:104900000FF02AFC002804BF012010BD002010BDBC +:10491000714890F8210070476F4A517010707047CD +:10492000F0B50546800000F1804000F580508B888E +:10493000C0F820360B78D1F8011043EA0121C0F805 +:10494000001605F10800012707FA00F6784C002A46 +:1049500004BF2068B04304D0012A18BFFFDF2068DD +:1049600030432060206807FA05F108432060F0BD5D +:104970000EF096BF584890F82E007047564890F8B1 +:10498000300070476B4AC178116000686A490002C4 +:1049900008607047252808BF02210ED0262808BFCE +:1049A0001A210AD0272808BF502106D00A2894BF10 +:1049B0000422062202EB4001C9B2604A116060493C +:1049C00008607047F0B4444B9D7A012D61D0022DF0 +:1049D0001CBFF0BC704793F815C0BCF1000F04BFBA +:1049E000F0BC70474FF47A7C012D564C564F57D08F +:1049F000DE7D5D7E002E18BF0126012908BF29211A +:104A00000CD0022A0CBF514C012A03D0042A0CBF3F +:104A10003C464F4C04F2E141B1FBFCF1491F084414 +:104A20004C4908604C490020C1F84C01280286F02E +:104A3000010140EA015040F00311187F820002F1A9 +:104A4000804202F5C042C2F81015444901EB8002D1 +:104A5000997EC80000F1804000F5F830C0F81425B8 +:104A6000DFF8FCC0C0F810C5D87EC30003F1804356 +:104A700003F5F833C3F814252B4AC3F81025012297 +:104A800002FA01F102FA00F0084336490860F0BC6E +:104A9000704793F814C0BCF1000FA3D1F0BC70476D +:104AA0009E7D1D7E002E18BF0126012965D0022A99 +:104AB00004BF2D4C4FF47A710CD0012A08BF4FF47B +:104AC000C86107D0042A07BF3C4640F69801274C2E +:104AD00040F6E44121444BE0240A0020000E00404F +:104AE00010150040180500500C050050141500402A +:104AF00000100040FC1F00403C17004040170040E1 +:104B000060150040448000409CF5014028110040A1 +:104B100038150040441500400000040408F5014029 +:104B200040800040A4F5014010110040741700407F +:104B300040160040241500401C1500400815004098 +:104B400054150040A2240200D0FB010004360200EC +:104B5000C0D401004C85004000800040006000404F +:104B60004C81004004F501406836020030D301005A +:104B700001F5FA71B1FBFCF150E7022A08BF4FF4CE +:104B80007A710AD0012A08BF4FF4C86105D0042AFF +:104B90000CBF40F6980140F6E44149F6FC6211442E +:104BA000E8E72DE9F047FC4E80460320154689468C +:104BB000C6F80002F94F787F002814BF4FF4C020D8 +:104BC000F748F849086048460EF0A5FE28460EF062 +:104BD00095FE0124B8F1000F03D0B8F1010F16D0F3 +:104BE00018E00EF087FB78B1EF490A684806022DFD +:104BF000D0F820030CBFC0F30660C0F3062022F4F7 +:104C0000FE4242EA00200860BC72346002E00220EA +:104C1000B8727460E548C464E54800682A464946AD +:104C2000BDE8F047CEE62DE9F0418846DA4907466F +:104C300003201546C1F80002D84C607F002814BF3D +:104C40004FF4C020D648D74E306040460EF063FE89 +:104C500028460EF053FE17B1012F1CD024E00EF0B1 +:104C600049FB78B1D04A11685006022DD0F82003D4 +:104C70000CBFC0F30660C0F3062021F4FE4141EAF8 +:104C8000002010600120A072606B40F4801060630F +:104C90004FF4801007E00220A072606B40F4001017 +:104CA00060634FF4001030602A464146BDE8F04191 +:104CB000002087E62DE9FF4FB74C8346002581B0E1 +:104CC00003208946C4F80002B44E707F002814BF48 +:104CD0004FF4C020B248B34F386003980EF01BFE6B +:104CE00004980EF00BFEDFF8CCA24FF00108BBF1E8 +:104CF000000F03D0BBF1010F35D046E00EF0FAFAF9 +:104D000080B1A94A0498116853060228D3F82003F9 +:104D10000CBFC0F30660C0F3062021F4FE4141EA57 +:104D200000201060CAF8004096F82D00012806D037 +:104D3000022818BFFFDF0CD086F80A8025E0DDE9E5 +:104D4000031396F82C2048460EF066FEB16A45180B +:104D5000F2E7DDE9031296F82C3048460EF0EAFD42 +:104D6000B16A4518E8E79448CAF8000096F82D00A3 +:104D7000DDE90313012896F82C20484624D00EF0D4 +:104D800095FEB16A45180220B0728C4805608D49C5 +:104D90008B480860706B40F400207063D4F8009278 +:104DA0004FF0100AC4F808A30026C4F80062864831 +:104DB0004FF4802BC0F800B0FF208DF80000C4F83D +:104DC0001061C4F810800AE00EF0F2FDB16A4518D7 +:104DD000D9E700BF9DF80000401E8DF800009DF847 +:104DE000000018B1D4F810010028F3D09DF800009D +:104DF000002808BFFFDFC4F80061C4F80C61C4F8E4 +:104E00001061C4F80461C4F81461C4F818610EF0AC +:104E100071FA002818BFC4F828616C480068009037 +:104E2000C4F80092C7F800B0C4F804A34FF40020FF +:104E300038605E48C0F84C805D480068A84228BFD2 +:104E4000FFDF2846DDE9031205B0BDE8F04FB9E504 +:104E50002DE9F84F504CD4F8000220F00B09D4F89B +:104E600004034FF0100AC0F30018C4F808A300268A +:104E7000C4F80062494D687F002814BF4FF4C02079 +:104E8000474840F4402150480160A97A0127012990 +:104E900002D0022903D014E0297D11B911E0697D07 +:104EA00079B1A97EEA7E07FA01F107FA02F211430D +:104EB0000160287F800000F1804000F5C040C0F80C +:104EC0001065FF208DF80000C4F81061276104E030 +:104ED0009DF80000401E8DF800009DF8000018B1FC +:104EE000D4F810010028F3D09DF80000002808BF76 +:104EF000FFDFC4F810610EF0FDF9002818BFC4F8F8 +:104F000028616E72AE72EF72C4F80092B8F1000FB1 +:104F100018BFC4F804A3BDE8F88F00682C4920F03E +:104F20007F40086070474FF0E0200221C0F88011F8 +:104F3000C0F8801270474FF0E0210220C1F8000154 +:104F4000704724490870704723490860704730B59E +:104F5000124C0546A06AA84228BFFFDF012020733B +:104F60002561607F40B1284420610B48D0F80012D1 +:104F700041F04001C0F800120C490020C1F8440182 +:104F8000164920690860606B064940F48000606340 +:104F90004FF48000086030BD00100040240A00205B +:104FA0000000040404F50140881500400080004022 +:104FB0004C850040ACF5014004100040488500409D +:104FC00048810040A8F5014008F501401811004053 +:104FD0003C150040B9000020041500404485004005 +:104FE00070B505460E460220FE4C2073FE4801684F +:104FF00001F00F01032908BF012207D0006800F06B +:105000000F0004280EBF0222FFDF012294F82D00BA +:1050100094F82C10012819D028460EF0A5FD206127 +:10502000607F48B1216908442061F048D0F800123F +:1050300041F04001C0F80012ED490020C1F84401E0 +:105040002169A06A0844EB49086070BD33462846D0 +:105050000EF053FDE3E7E8494FF480000860E148B3 +:10506000416B21F480014163002101737047C2004C +:1050700002F1804202F5F832E04BC2F81035C2F876 +:10508000141501218140DE480160D648426B11436E +:1050900041637047D64801214160C1600021C0F8DA +:1050A0004411D4480160CF488162704710B504466E +:1050B0000EF020F900281CBFCA484477D14804608C +:1050C000CA48D0F8001241F04001C0F8001210BDEB +:1050D000C64810B5D0F8001221F04001C0F8001207 +:1050E0000EF008F9C749002818BF0220086010BD5B +:1050F000BE48D0F8001221F01001C0F800120121C2 +:1051000081617047B9480021C0F81C11D0F8001225 +:1051100041F01001C0F800127047B44981B0D1F8D5 +:105120001C21012A1EBF002001B07047B64A126838 +:1051300002F07F02524202700020C1F81C01B34805 +:1051400000680090012001B0704730B50C000546A2 +:1051500008BFFFDF14F0010F1CBF012CFFDF002D83 +:105160000CBF012002209F4901284872CC729F4940 +:1051700004BFD1F8000240F0040007D0022807BFA6 +:10518000D1F8000240F00800FFDF30BDC1F8000296 +:1051900030BD2DE9F84FDFF8789299F80000042827 +:1051A00028BFFFDFDFF848A2DAF84C1192488D4C97 +:1051B00000274FF00108D1B1A17A012902D00229BC +:1051C00003D014E0217D11B911E0617D79B1A17E98 +:1051D000E27E08FA01F108FA02F211430160217F30 +:1051E000890001F1804101F5C041C1F81075824884 +:1051F000616B01606763217B002019B1DAF844110B +:10520000012900D00021A27A784E012A6ED0022A0C +:1052100074D000BFD6F8101101290CBF1021002155 +:1052200041EA00057B48016811F0FF0F03D0D6F872 +:105230001411012900D0002184F82E10006810F00C +:10524000FF0F03D0D6F81801012800D0002084F801 +:105250002F007148006884F83000FFF72AF9012810 +:1052600018BF002084F83100C6F80071C6F80C7130 +:10527000C6F81071C6F80471C6F81471C6F8187132 +:105280000EF038F8002818BFC6F828716348006887 +:1052900000905748C0F8447161480068DFF854A195 +:1052A0000090DAF800006062617F00291CBF401A9C +:1052B00060625C480068A0624B48016801F00F0121 +:1052C000032908BF012007D0006800F00F00042860 +:1052D0000EBF0220FFDF012084F82C00A07ADFF847 +:1052E00048B184F82D00022824D116E0D6F80C012C +:1052F000012814BF002008208CE7FFE7D6F80C0136 +:10530000012814BF00200220484A1268012A14BF55 +:1053100004220022104308437CE7607850B1DBF898 +:10532000001009780840217831EA000008BF84F8AD +:10533000208001D084F8207015F0020F07D099F872 +:1053400000103B4A4908606A52F82110884715F05E +:10535000010F18BF00210DD0364A99F80030A06A1D +:1053600052F82320904700BF99F8000010F0010F79 +:105370002AD10AE015F0020F18BF0121ECD115F077 +:10538000080F18BF0221E7D1EEE7DBF80000007834 +:1053900000F00F00072828BF84F8217014D2DBF832 +:1053A0000000062200F10901A01C0EF0D5FE40B954 +:1053B000207ADBF800100978B0EBD11F08BF01207C +:1053C00000D0002084F82100E17A002011F0020FC3 +:1053D0001CBF15F0020F15F0040F45D111F0100F8E +:1053E0002AE00000240A00201015004000100040B0 +:1053F000008000404485004008F501400411004051 +:1054000004F5014060150040481500401C110040A3 +:10541000B900002040160040101400401811004050 +:1054200044810040408500400415004000140040C5 +:1054300008480200504802001CBF94F82F20002AA0 +:1054400002D094F831207AB111F0080F1CBF94F803 +:105450002020002A08D111F0040F02D094F8211066 +:1054600011B115F0010F00D00120617A19B198B186 +:10547000FFF7EEFC1EE0607F002814BF4FF4C02150 +:105480007F4980480160D6F8000220F00300C6F88A +:10549000000284F80B800DE04FF0000B012913D0BF +:1054A000022918BFFFDF21D0A06A01225844002141 +:1054B000FFF788FA15F0010F2BD0734899F8001008 +:1054C00050F82100804745E0D6F8000220F00400A3 +:1054D000C6F80002677284F80B80012384F80A8002 +:1054E0001A46002196200EF025FA10E0D6F80002A8 +:1054F00020F00800C6F80002677284F80B800220D2 +:10550000A07201231A46002196200EF051FA83461C +:10551000CAE715F0020F08D05C4999F8002028EA84 +:10552000950051F82210884714E015F0080F06D0B6 +:10553000574899F8001050F8210080470AE015F00C +:10554000100F08BFFFDF05D0524899F8001050F83F +:1055500021008047A07A022818BFBDE8F88F207B81 +:10556000002808BFBDE8F88F4B49C1F844710228F4 +:1055700014D0012818BFFFDFA16A2069884298BFB4 +:10558000FFDF2069CAF80000606B444940F48000E6 +:1055900060634FF480000860BDE8F88F2169A06A5D +:1055A0000844EFE738B500253D4C002818BFC4F883 +:1055B0000052C4F80051C4F80C51C4F81051C4F89A +:1055C0000451C4F81451C4F818510DF093FE00288A +:1055D00018BFC4F8285133480068009038BD01282E +:1055E00004BF28207047022804BF1820704700B568 +:1055F000FFDF282000BD012804BF41F6A4707047DA +:10560000022804BF41F28830704700B5FFDF41F641 +:10561000A47000BD012804BF41F2D4707047022875 +:1056200004BF41F20400704700B5FFDF41F2D470BF +:1056300000BD012812BF02280020704700B5FFDF1F +:10564000002000BD16490820C1F800021648407F1E +:10565000002814BF4FF4C02009480A4908601449C3 +:1056600012480860091D13480860091D12480860A7 +:10567000091D1248086009494FF44020086070472E +:105680000000040408F50140104802002048020010 +:1056900030480200404802000080004004F501400C +:1056A0000010004018110040240A002000110040A2 +:1056B000A0F50140141000401C11004010100040E3 +:1056C00010B53F4822210EF0F2FD3D48017821F04F +:1056D00010010170012107F017FC3A49002081F800 +:1056E00022004FF6FF70888437490880488010BD3B +:1056F000704734498A8C824218BF7047002081F875 +:1057000022004FF6FF70888470472D490160704772 +:105710002D49088070472B498A8CA2F57F43FF3BB7 +:1057200003D0002101600846704791F822202549E6 +:10573000012A1ABF0160012000207047214901F1B0 +:10574000220091F82220012A04BF00207047012284 +:1057500002701D4800888884104670471A494880A6 +:1057600070471849184B8A8C5B889A4206D191F889 +:105770002220002A1EBF01600120704700207047D0 +:105780001048114A818C5288914209D14FF6FF711D +:10579000818410F8221F19B1002101700120704787 +:1057A000002070470748084A818C5288914205D1F1 +:1057B00090F8220000281CBF00207047012070478D +:1057C000820A00205C0A0020BA0000207047574A75 +:1057D000012340B1012818BF70471370086890601A +:1057E00088889081704753700868C2F802008888E2 +:1057F000D08070474D4A10B1012807D00EE0507894 +:1058000060B1D2F802000860D08804E0107828B1B6 +:105810009068086090898880012070470020704758 +:10582000424910B1012803D006E0487810B903E0DE +:10583000087808B1012070470020704730B58DB05E +:105840000C4605460D2104A80EF053FDE0788DF8B6 +:105850001F0020798DF81E0060798DF81D002868E2 +:10586000009068680190A8680290E8680390684614 +:105870000DF0C2FB20789DF82F1088420CD1607883 +:105880009DF82E10884207D1A0789DF82D108842EF +:1058900002BF01200DB030BD00200DB030BD30B5CD +:1058A0000C4605468DB04FF0030104F1030012B120 +:1058B000FEF7F0F901E0FEF70CFA60790D2120F017 +:1058C000C00040F04000607104A80EF012FDE078C6 +:1058D0008DF81F0020798DF81E0060798DF81D006D +:1058E0002868009068680190A8680290E8680390B2 +:1058F00068460DF081FB9DF82F0020709DF82E006A +:1059000060709DF82D00A0700DB030BD10B500295D +:1059100004464FF0060102D0FEF7BCF901E0FEF7A5 +:10592000D8F9607920F0C000607110BDBE00002081 +:1059300070B5F84E0446306890F800110025012932 +:1059400019D090F8FA10012924D090F8D01001292C +:105950002AD090F8F21001291CBF002070BD65709C +:1059600017212170D0F8F4106160B0F8F81021818F +:1059700080F8F25016E065701C212170D0F80111FA +:105980006160D0F80511A16090F80911217380F8C9 +:10599000005107E0657007212170D0F8FC106160AC +:1059A00080F8FA50012070BD65701421217000F15B +:1059B000D2012022201D0EF0FBFB01212172306854 +:1059C00080F8D050D448B0F8D420A0F8FC207268F9 +:1059D000537B80F8FE3080F8FA101088FBF71AF934 +:1059E000FAF7C1FDDEE7CB48006890F8D010002937 +:1059F00014BFB0F8D4004FF6FF70704770B5C54CB7 +:105A00002068002808BFFFDF0025206845700028B7 +:105A100008BFFFDF2068417800291CBFFFDF70BD91 +:105A20004FF486710EF065FC2068FF2101707F2124 +:105A300080F8361013214184282180F8CC100121F0 +:105A400080F8B81080F8BD50FFF742FBFEF711FD5B +:105A5000B24806F0E5FFB24806F0E2FFBDE870404C +:105A6000B04806F0DDBFAB490968097881420CBF38 +:105A7000012000207047A748006890F82200C0F37A +:105A8000001070472DE9F04FA248016891F82400FA +:105A9000B1F822C0C0F38002C0F340031A4400F002 +:105AA00001001044CCF300121AB3BCF1130F1BD049 +:105AB0000BDCBCF1100F02BF9B4931F81000BDE8B0 +:105AC000F08FBCF1120F0FD00AE0BCF1150F08BF28 +:105AD00096490AD0BCF11D0F04BF9548BDE8F08F70 +:105AE000FFDF0020BDE8F08F924931F81000BDE8DB +:105AF000F08F002491F8BA2091F8BB108E4E8F4F92 +:105B00001CF0030F4FF47A7B4FF0190A25464FF42F +:105B1000C8784FF4BF794FF018037DD01CF0010F07 +:105B20001BD0082904BF44464FF0400C0FD0042975 +:105B300004BF4C464FF0100C09D0022907BF05F1F5 +:105B400018044FF0040C05F128044FF0080C0CEB7E +:105B50004C0E0EEB0C1CA44417E0082904BFC446ED +:105B600040240CD0042904BFCC46102407D00229BD +:105B700007BF05F1180C042405F1280C082404EBD8 +:105B8000C40404EB44040CEB440C022A04BF6C4E26 +:105B90004FF47A740CD0012A08BF4FF4C86407D0C0 +:105BA000042A07BF674E40F698043E4640F6E44498 +:105BB000344404F2E734B4FBFBF4C0EB001606EB0C +:105BC000860604EB8604082A30D0042A29D0022A4B +:105BD00007BF05F11802042505F128024FF0190A44 +:105BE00018BF08251AFB052212FB0040082922D005 +:105BF000042925D0022904BF0421C03004D0282361 +:105C000003F5A87108440821C1EBC10101EB410172 +:105C100003EB4101084400E017E0604400F52674FE +:105C200018E04A464FF0140A1025DBE742464FF0D1 +:105C3000140A4025D6E74346402100F53D60E3E7DE +:105C40004B46102100F57C70DEE71CF0020F18BFF8 +:105C5000FFDF02D02046BDE8F08F022A04BF384E95 +:105C60004FF47A7C0CD0012A08BF4FF4C86C07D0DF +:105C7000042A07BF334E40F6980C3E4640F6E44CEB +:105C8000B4440CF2E73CBCFBFBFCC0EB001404EB9F +:105C900084040CEB840C082A04BF4FF0140A402241 +:105CA0000CD0042A29D0022A07BF05F118080422C3 +:105CB00005F128084FF0190A18BF08221AFB0282C2 +:105CC00012FB00C0082904BF4FF4A87340210AD07A +:105CD000042904BF4FF4A873102104D002290EBF79 +:105CE000042128230821C1EBC10101EB410103EB91 +:105CF0004101084400F5B274ACE7C8464FF0140AFD +:105D00001022DBE7034840F271210068806A4843B3 +:105D100070470000CC000020A40A0020B00B002037 +:105D2000D80B0020000C0020744802007C480200C0 +:105D3000F18913006C480200A224020030D3010054 +:105D400068360200D0FB0100F848006890F8350082 +:105D5000002818BF0120704710B5F54C207B0228A1 +:105D600018BF032808D1207D04F1150105F018FDA6 +:105D700008281CBF012010BD207B002816BF022868 +:105D800000200120BDE81040FFF74ABDE74909683F +:105D900081F8300070472DE9F047E44D2968087B11 +:105DA000002816BF02280020012048730E31FFF79B +:105DB00021FD2968087B022816BF03280122002242 +:105DC00081F82F20082081F82D00487B012600272C +:105DD00001F10E03012804BF5B7913F0C00F0AD054 +:105DE00001F10E03012804D1587900F0C0004028C9 +:105DF00001D0002000E0012081F82E00002A04BF1D +:105E000091F8220010F0040F06D0087D153105F03E +:105E1000C7FC296881F82D0028684760FCF7F8FE68 +:105E20002968C34C4FF00009886094F82D0005F0F4 +:105E3000D3FC804694F82F00002818BFB8F1000F5B +:105E400004D01021404606F050FB68B194F83000B1 +:105E500000281CBF94F82E0000281DD0607B04F1A0 +:105E60000E0101280ED012E066734A4604F10E01BD +:105E70004046FFF714FD94F82D1004F10E0005F0D4 +:105E8000A4FD09E0487900F0C000402831D039462F +:105E900004F10E00FFF73AFD2868C77690F822005B +:105EA00010F0040F08BFBDE8F087002794F82D001C +:105EB00005F09BFC040008BFBDE8F087102106F048 +:105EC00014FB002818BFBDE8F08728683A4600F1A7 +:105ED0001C01C6762046FFF7E2FC286800F11C0191 +:105EE000944806F0D4FDBDE8F0470121914806F042 +:105EF000E9BD05F0A3FD4A4604F10E01FFF7CFFC12 +:105F0000CAE778B58A490446884D407B08732968FA +:105F1000207808706088ADF8000080B200F00102BF +:105F2000C0F3400342EA4302C0F3800342EA830223 +:105F3000C0F3C00342EAC302C0F3001342EA0312F3 +:105F4000C0F3401342EA4312C0F3801042EA8010CB +:105F50004884E07D012808BF012603D0022814BF31 +:105F6000FFDF0226286880F8BA60607E012808BF3B +:105F7000012603D0022814BFFFDF0226286880F81C +:105F8000BB60217B80F82410418C1D290CBF0021AF +:105F900061688162617D80F83510A17B002916BFA0 +:105FA0000229002101210175D4F80F10C0F8151045 +:105FB000B4F81310A0F81910A17EB0F8CE2061F348 +:105FC0000302A0F8CE20E17E012918BF002180F84D +:105FD0003410002078BD55480068408CC0F3001193 +:105FE00019B110F0040F05D002E010F0020F01D03B +:105FF00000207047012070474C4A00231268C2F805 +:10600000C030B2F822C0BCF11D0F02BFC2F8C830C8 +:1060100082F8C4307047002908BFC2F8C8300AD0DF +:10602000936A40F2712C03FB0CF31944491EB1FB37 +:10603000F3F1C2F8C81082F8C400704703463B4829 +:1060400010B50168D1F8C820002A1ABFD1F8C0C025 +:10605000BCF1000F012405D09A4205D90124D01AC1 +:10606000C1F8C800204610BD91F82210002411F09C +:10607000010F1CBF406800884FF0430108BF00209B +:1060800001F009F9EEE72948006890F8B700002808 +:106090000CBF01200020704770B51F2834BF044694 +:1060A0001F240022214D286880F8B920224678302C +:1060B0000EF07EF82868012180F8974080F8B9102A +:1060C00070BD10B51F2828BF1F20C2B2174C002377 +:1060D000206880F8B83080F8B72098300EF068F863 +:1060E0002168012081F8B80010BD1049096881F8C5 +:1060F000BD0070470D48006890F8220000F00100D4 +:1061000070470A48006890F82200C0F340007047CA +:106110000648006890F82200C0F34010704703481A +:10612000006890F82200C0F3C0007047CC00002047 +:10613000A40A0020B00B002001207047F748006837 +:1061400090F8BB00704770B5FEF7A4FFFEF783FF21 +:10615000FEF77EFEFEF7E7FEF04C2068D0F8C01098 +:10616000491CC0F8C01090F83300002530B1FEF78C +:10617000AFFFFEF77EF9206880F833502068457045 +:1061800090F8C410F9B1D0F8C02091421BD8042077 +:1061900002F050FA206890F8220010F0010F0CD0A5 +:1061A00060684321008801F076F860680088FAF79B +:1061B00031FDBDE87040FAF7C7B9BDE87040432132 +:1061C000002001F068B8D0F8C81019B1D0F8C0208C +:1061D000914202D990F83700D8B1042002F02AFA8F +:1061E000206890F8220010F0010F0CD060683C216C +:1061F000008801F050F860680088FAF70BFDBDE8F0 +:106200007040FAF7A1B9BDE870403C21002001F0D0 +:1062100042B8BDE87040002002F00CBA2DE9F84FFA +:10622000BE4E8046174630688B464FF0000A458CBC +:1062300015F0030F10D015F0010F05F0020005D086 +:10624000002808BF4FF0010A06D004E0002818BF5C +:106250004FF0020A00D1FFDF4FF000094C4615F065 +:10626000010F05F002000BD070B915F0040F0BD030 +:1062700049F00800002F18BF40F0030440D090E020 +:1062800010B115F0040F0DD015F0070F10D015F058 +:10629000010F05F0020036D0002808BF15F0040FEA +:1062A00027D03DE0002F18BF49F0090479D134E030 +:1062B0002FB149F0080415F0200F14D071E03168B7 +:1062C00005F0200291F87700104308BF49F001045F +:1062D00067D049F0180415F0200F62D191F8BA1078 +:1062E00008295AD156E0316891F8BA10082951D1DD +:1062F00053E049F00800002F18BF40F0010450D1CE +:1063000040F010044DE0002818BF15F0040F07D02E +:10631000002F18BF49F00B0443D149F0180440E0A6 +:1063200015F0030F3CD115F0040F39D077B1316867 +:1063300049F0080091F8BA1008290CBF40F0020497 +:1063400020F0020415F0200F22D02AE0316805F079 +:10635000200291F87700104308BF49F0030420D0D1 +:1063600049F0180015F0200F09D000BF91F8BA10BD +:10637000082914BF40F0020420F0020411E091F853 +:10638000BA20082A14BF40F0010020F00100EDE718 +:10639000082902D024F0010403E044F0010400E0E5 +:1063A000FFDF15F0400F18BFFFDFA8F8009098F846 +:1063B0000000072120F0200088F80000404606F089 +:1063C00034FB5146404606F033FD2146404606F078 +:1063D00038FD14F0010F0CD03068062300F10E01D7 +:1063E0000022404606F00AFD3068417B404606F038 +:1063F0005CFB14F0020F1BD03068BBF1000F0BD018 +:1064000000F11C0106230122404606F0F7FC0121A1 +:10641000404606F057FB0BE000F115010623012270 +:10642000404606F0EBFC3068017D404606F04AFB32 +:1064300014F0040F18BFFFDF14F0080F17D0CDF8C9 +:1064400000903068BDF800100223B0F8CE000209B9 +:1064500062F30B01ADF800109DF80110032260F308 +:1064600007118DF801106946404606F0C7FC012F60 +:1064700016D1306890F8770090B1404606F0D4FC11 +:106480003368401CC0B293F87710C0F125008142F8 +:10649000B8BF084682B203F15801404606F0FFFC3F +:1064A0000020002818BFFFDF0020002818BFFFDFF2 +:1064B0000020002818BFFFDFBDE8F88F2DE9F84362 +:1064C000164C2068002808BFFFDF2068417811BB08 +:1064D0000178FF291FD0002780F83170877080F87D +:1064E00037703846FEF72DFDFEF795F9206890F9D4 +:1064F000BD00FEF73DFA0A48FEF744FA0948FEF7E8 +:106500000CFD206890F8240010F0010F0CD025201D +:10651000FEF740FA10E00C20BDE8F883CC00002024 +:10652000684802006548020010F0020F18BF2620DC +:1065300068D000BFFEF72EFA206890F8BA10252028 +:10654000FEF735F9206880F82C70FEF7F4FC20681F +:10655000002190F8BA200846FEF765FB0F210520C0 +:10656000FEF7DAF92068FF4D012690F82E10002979 +:1065700001BF90F82F10002990F8220010F0040FAE +:1065800070D0FCF745FB8046206841468068FDF7E7 +:106590004DF8F54990FBF1F901FB190041424046E5 +:1065A000FCF73FF80146206881604168494441603A +:1065B00005F0F3F801462068426891426DD8C0E9C1 +:1065C00001784FF0010895F82D0005F005F9814696 +:1065D00095F82F00002818BFB9F1000F04D0102142 +:1065E000484605F082FFA0B195F8300000281CBF96 +:1065F00095F82E00002824D0687B05F10E010128B3 +:1066000015D019E010F0040F14BF2720FFDF91D13F +:1066100092E732466E7305F10E014846FFF73FF9E7 +:1066200095F82D1005F10E0005F0CFF909E0487935 +:1066300000F0C000402816D0414605F10E00FFF7DB +:1066400065F9206890F8220010F0040F25D095F825 +:106650002D0005F0CAF85FEA00081ED0102105F0F1 +:1066600044FF40B119E005F0E9F9324605F10E01A9 +:10667000FFF715F9E5E72068324600F11C01C67600 +:106680004046FFF70CF9206800F11C01B74806F0FE +:10669000FEF90121B54806F015FA2068417B0E305D +:1066A000FEF71EF9206890F8B81079B390F8B7207B +:1066B00080F8772000F1980158300DF0BEFD206879 +:1066C00090F82210C1F30011E9B9B0F8CE00022110 +:1066D0000609ADF800606846FDF7DCFA28B1BDF8A0 +:1066E0000000C0F30B00B04204D1BDF80000401C14 +:1066F000ADF800002168BDF80000B1F8CE2060F3CD +:106700000F12A1F8CE20206880F8B870206890F8A9 +:10671000B91059B190F8972080F8572000F178010E +:1067200038300DF08AFD206880F8B9702068B0F824 +:10673000CE10D0F8C020090951FA82F190F8BC209F +:10674000DFF82CC2114463460022E1FB0C3212092F +:106750006FF0240302FB031180F8BC1090F82210A4 +:10676000824E90F81B80C1F3001106F12809002920 +:106770005DD03780317821F020013170408C1328B2 +:1067800037D01CDC10284DD0122846D0FFDF00BFC8 +:1067900005F10E01754806F06CF9697B734806F047 +:1067A00084F92068418C1D2918BF15297ED090F8E6 +:1067B000772000F15801304606F0ADF97EE015284B +:1067C00018BF1D28E2D10121304606F02EF930789D +:1067D000B8F1000F40F020003070206812D000F1B6 +:1067E0001C01304606F053F90121304606F06AF9E3 +:1067F000CEE70021304606F018F9307840F020004E +:106800003070C5E700F11501304606F040F9206808 +:10681000017D304606F056F9BAE70621304606F00B +:1068200004F9B5E70221304606F0FFF8B0E7002290 +:1068300041463046FFF7F2FC206890F877100029B7 +:1068400004BF408C10F0010F05D110F0020F08BFFB +:1068500010F0200F04D0012241464846FFF7DEFC2D +:10686000F07810F03F0F1CBF307910F0100F25D0DA +:10687000304606F0D8F82268014692F82400C0F3AA +:106880008003C0F3400C634400F00100034492F81D +:106890002C00C0F38002C0F3400C624400F0010001 +:1068A0001044181AC0B200F00AFD00E006E00090A3 +:1068B000032304226946304606F0A0FA206890F8C7 +:1068C0002200C0F30010B0B12A4E042130463780B8 +:1068D00006F0ABF805F10E01304606F0CAF8697B08 +:1068E000304606F0E2F8206800F1380190F85720B1 +:1068F000304606F034F904F0C5FF03211E4805F0C8 +:1069000054F8216881F83300002005E61B494860EF +:1069100070472DE9F843194C8046206890F83120E3 +:1069200032B1408C1D2808BFFFDFBDE8F8430AE400 +:10693000012639B390F8BC00FEF72CF8206890F8D7 +:10694000BB102520FDF733FF206801224FF496711C +:1069500090F8BB300020FEF7ADF90948FEF7F4FAD5 +:10696000206810E0A40A002040420F00B00B002075 +:1069700053E4B36E000C0020280C0020CC00002053 +:10698000D80B002005E04670867080F83160BDE8C5 +:10699000F883FE48FEF7D8FA2068002590F8241006 +:1069A00090F82C0021EA000212F0010F18BF012517 +:1069B0000ED111F0020F04D010F0020F08BF022513 +:1069C00006D011F0040F03D010F0040F08BF042507 +:1069D0000027B8F1000F5CD0012D1CD0022D08BF9C +:1069E00026201CD0042D14BFFFDF272017D02068DD +:1069F00090F8BA102520FDF7DAFE206890F82210F2 +:106A0000C1F3001171B1002201234FF496711046B9 +:106A1000FEF750F93DE02520FDF7BCFFE7E7FDF765 +:106A2000B9FFE4E790F8BA3001224FF496710020E4 +:106A3000FEF740F9D548C17811F03F0F1CBF00792F +:106A400010F0100F25D0D14805F0EDFF2368014666 +:106A500093F82420C2F38000C2F3400C604402F09B +:106A6000010200EB020C93F82C20C2F38000C2F369 +:106A70004003184402F001020244ACEB0200C0B231 +:106A800000F01DFC0090032304226946BF4806F075 +:106A9000B5F9206890F82C10294380F82C1090F854 +:106AA000242032EA010112D04670408C132821D0F4 +:106AB0001CDC102808BFBDE8F88312281AD000BFDC +:106AC000C0F30010002818BFFFDFBDE8F883418C39 +:106AD0001D2908BF80F82C70E6D0C1F300110029F1 +:106AE00014BF80F8316080F83170DDE7152818BFD9 +:106AF0001D28E5D1BDE8F84301210846FEF725BB76 +:106B0000A34810B50068417841B90078FF2805D046 +:106B100000210846FFF7FDFE002010BDFEF7BAFA7F +:106B2000FEF799FAFEF794F9FEF7FDF90C2010BD77 +:106B300097490120096881F837007047944909682E +:106B400081F83200704770B5002501F0E3FB0028A2 +:106B50007CD08F4C2068417800260122012905D085 +:106B6000022901D003297DD0FFDF70BD8178022684 +:106B700039B390F8220010F0030F67D08548FEF774 +:106B8000E3F920680122962190F8BB301046FEF709 +:106B900091F800219620FEF723FA2068467090F8BD +:106BA000330020B1FDF751FC4020FEF77FFA20684A +:106BB00090F83400002808BF70BDBDE87040FEF7B3 +:106BC000A1BA418CC1F300129AB1102929D090F8D2 +:106BD000330020B1FDF739FC4020FEF767FA6D481D +:106BE000FEF7B2F9206890F8221011F0040F1DD0C2 +:106BF00027E090F8242090F82C309A4211D190F898 +:106C00007700002808BF11F0010F05D111F0020F25 +:106C100008BF11F0200F52D0BDE870400121084696 +:106C200077E6BDE870400021012072E690F835005B +:106C3000012814BF0328102545F00E010020FEF79F +:106C400084FA206890F83400002801E037E009E079 +:106C500018BFFEF757FA00219620FEF7C1F9206809 +:106C6000467070BD817801B3418C11F0010F21D0C5 +:106C700080F8D02090F8D210B0F8D40000F00BFBD0 +:106C800060680088F9F7C6FFF9F75EFC2068467077 +:106C9000FEF700FAFEF7DFF9FEF7DAF8FEF743F940 +:106CA000BDE87040032001F0C5BC8178BDE87040AC +:106CB00001202EE611F0020F04BFFFDF70BDBDE81A +:106CC0007040FFF740BAFFF73EBA10B5304C20686D +:106CD00090F8341049B13630FEF71FFA18B9216820 +:106CE0007F2081F83600FEF703FA206890F8330021 +:106CF00018B1FEF7EDF9FDF7BCFB01F00BFBA8B1F5 +:106D0000206890F82210C1F3001179B14078022870 +:106D100018BFFFDF00210120FFF7FBFD206841784D +:106D200000291EBF40780128FFDF10BDBDE81040DC +:106D3000FFF709BA2DE9F047154F0E4603283A68C8 +:106D4000518C0BD092F8320001F0010410F10009CF +:106D500018BF4FF001094FF0010805E0C1F34004EE +:106D60004FF000094FF00208FDF704FE054634EA33 +:106D7000090008BFBDE8F0873868064C90F833007A +:106D800098B104F064FD3070014605E0B00B0020BE +:106D9000CC000020280C0020FF2806D0E01C04F0C6 +:106DA0004BFD307804F05EFD05432078C0F3801180 +:106DB0003868027D914209D100F115010622E01CDC +:106DC0000DF0CAF9002808BF012000D0002031785A +:106DD000FF2906D0C0B9386890F82D00884215D137 +:106DE00012E098B12078E11CC0F3801004F0D8FCC8 +:106DF000064604F03BFE38B1304604F0F6FC18B10C +:106E0000102105F072FB08B1012000E00020396874 +:106E100091F8221011F0040F01D0F0B11AE0CDB9B1 +:106E2000FE4890F83500002818BF404515D114F8E9 +:106E3000030B2146C0F3801004F0B2FC044604F0BA +:106E400015FE38B1204604F0D0FC18B1102105F031 +:106E50004CFB10B10120BDE8F0870020BDE8F087B1 +:106E60002DE9F04FEE4D804683B02868002740782A +:106E7000022818BFFFDF28687F2490F8341049B13A +:106E80003630FEF74AF9002804BF286880F83640FB +:106E9000FEF72EF9E34805F0E8FD0646B8F1000FCD +:106EA00000F0A381DF4805F079FF002800F09D8104 +:106EB000FDF72EFD002800F098813046D94EFF21C5 +:106EC000DFF864A34FF000084FF0030B4FF0010907 +:106ED000062880F0B981DFE800F0FDFDFD03FD8F9D +:106EE0008DF8001069460320FFF724FF002828686A +:106EF0007CD090F8341011B190F8001159B1286885 +:106F0000807801283ED0C948FEF71EF8286880F82E +:106F100001B000F06EB99DF8003080F80091017862 +:106F200080F80111FF2B10D000F20312511E1846F9 +:106F300004F064FC002808BFFFDF286890F8021105 +:106F400041F0020180F802110DE03178C1F38011A7 +:106F500080F80211B149D1F88721C0F80321B1F8B6 +:106F60008B11A0F80711286800F2091690F8360076 +:106F70007F2808BFFFDF286890F83610317080F84E +:106F80003640BCE7A94CDAF8049004F12806A4F8CE +:106F900000800721204605F048FD0021204605F02D +:106FA00047FF4946204605F04CFF0623002206F124 +:106FB0000901204605F022FF2868417B204605F0A4 +:106FC00074FD286800F1380190F85720204605F03C +:106FD00066FF2046FDF7B8FF28680122962190F849 +:106FE000BB300020FDF766FE90E7FFE780780028C1 +:106FF00040F0FD8000F0F9B88DF8081002A90520D6 +:10700000FFF798FE0028286800F0EA808278884917 +:10701000002A7DD0A1F11F066C6890F8BB90D6F8CD +:107020000F00C4F80E00B6F813006082707D207562 +:10703000B07D6075B6F81700E082B6F81900608080 +:10704000B6F81B00A080B6F81D00E08004F108002F +:107050000DF064FA96F8240000F01F00207696F8F0 +:107060002400400984F86C0184F8549084F8559009 +:10707000286890F8CC1084F8561090F8BD0084F879 +:1070800057009DF80810686800F079F9022001F0B7 +:10709000D1FAA6F12804DAF80090A4F800800821BB +:1070A000204605F0C2FC0021204605F0C1FE4946FD +:1070B000204605F0C6FE6946304605F0EFFC304636 +:1070C00005F009FD0146204605F0EFFC06230022ED +:1070D000694600E0B8E0204605F090FE694630467B +:1070E00005F0CEFC304605F0E9FC0146204605F0EF +:1070F000E9FC062301226946204605F07FFE204672 +:10710000FDF722FF28680122962190F8BB3000E0AD +:1071100006E00020FDF7CEFD286880F801B068E0A9 +:107120006C6832783F4E607BC2F34012104060734F +:10713000D6F80F00C4F80E00B6F813006082707D18 +:107140002075B07D6075B6F81700E082B6F81900BA +:107150006080B6F81B00A080B6F81D00E0804FF0FC +:10716000010A04F108000DF0D9F996F8240000F0A6 +:107170001F00207696F82400400984F86C0184F8FA +:1071800054A084F855A0286890F8CC1084F85610C4 +:1071900090F8BD0084F857009DF80810686800F06A +:1071A000EEF8286880F8D09090F8D210B0F8D400AB +:1071B00000F071F868680088F9F72CFDF9F7C4F958 +:1071C000286880F80180FDF765FFFDF744FFFDF7B3 +:1071D0003FFEFDF7A8FE012001F02CFA09E000BFF8 +:1071E00090F82200C0F3001008B1012701E0FEF77B +:1071F000AAFF286890F8330018B1FDF769FFFDF782 +:1072000038F91FB100210120FFF783FB286841787E +:1072100000291ABF4178012903B00BE0A40A00201D +:10722000CC000020280C002060480200000C002048 +:10723000470C002008BFBDE8F08F4078032818BF36 +:10724000FFDF03B0BDE8F08F286890F82200C0F39C +:1072500000100028CBD0C8E770B5864C06460D4616 +:107260002068807858B1FDF765FA216803463046FA +:1072700091F8BB202946BDE8704001F048BAFDF7FF +:1072800059FA21680346304691F8BA202946BDE8EC +:10729000704001F03CBA784A137882F8F530A2F8D1 +:1072A000F60082F8F410012082F8F20092F8C4008F +:1072B000002818BF92F8C00082F8F800704778B52F +:1072C00004466C4800230093006890F8BA20082A0E +:1072D00004BF4FF4C87240230DD0042A04BF4FF4FA +:1072E000BF72102307D0022A07BF03F1180204233C +:1072F00003F128020823491D01FB032690F8BC2056 +:107300009DF8001062F3050141F040058DF8005032 +:1073100090F8BB00012804BF9DF8020020F0E000B7 +:107320002AD0022818BFFFDF21D000BF25F080003F +:107330008DF80000C4EB041106FB04F001EB8101A1 +:1073400000EB81044D48844228BFFFDF4C48A0FB7E +:107350000410BDF80110000960F30C01ADF8011034 +:10736000BDF800009DF8021040EA014078BD9DF88C +:10737000020020F0E00020308DF80200D6E72DE971 +:10738000F0413C4D04460E46286890F8D000002895 +:1073900018BFFFDF0027286880F8D2702188A0F886 +:1073A000D4106188A0F8EA10A188A0F8EC10E18858 +:1073B000A0F8EE1094F86C1180F8F01090F82F10EF +:1073C00049B1427B00F10E01012A04D1497901F053 +:1073D000C001402935D090F8301041B1427B00F116 +:1073E0000E01012A04BF497911F0C00F29D0DE3007 +:1073F0000DF082F82348FF2E0078C0F380106076ED +:107400001D48D0F88711C4F81A10B0F88B01E0833A +:1074100028681ED0C0F8E410E18BA0F8E81000F155 +:10742000D802511E304604F0E9F9002808BFFFDFFA +:10743000286890F8D71041F0020180F8D710BDE815 +:10744000F081D0F80E10C0F8DE10418AA0F8E210EA +:10745000D0E7C0F8E470A0F8E870617E80F8D7103B +:10746000D4F81A10C0F8D810E18BA0F8DC10BDE8F1 +:10747000F0810000CC000020A40A0020C4BF03005B +:1074800089888888280C0020FE48406870472DE9CC +:10749000F0410F46064601461446012005F098F9D2 +:1074A000054696F85500FEF7A6F8014696F85500F1 +:1074B000022808BFF44807D0012808BFF34803D0CA +:1074C00004280CBFF248F34808444FF47A7100F2E4 +:1074D000E140B0FBF1F0718840F271225143C0EB02 +:1074E0004100001BA0F5597402F0B6FD002818BF3A +:1074F0001E3CAF4234BF28463846A04203D2AF42BA +:107500002CBF3C462C467462BDE8F0812DE9FF4F4C +:107510008FB0044690F855601C98994640EA0900DF +:10752000039094F86500002790460D280CBF0120B9 +:1075300000200990B9F1000F04BF94F80C01032852 +:107540002BD1099848B3B4F88E01404525D1D4F821 +:107550001401C4F80001608840F2E2414843C4F8D5 +:107560000401B4F85A01B4F8E6100844C4F808015C +:10757000204602F07BFDB4F89201E08294F890017D +:107580006075B4F894016080B4F89601A080B4F8F6 +:107590009801E080022084F80C01D4F864010C907A +:1075A000B4F8E6B0B4F85801D4F860A1D4F8541196 +:1075B0000691B9F1000F03D094F8201149B193E07E +:1075C00004F1E00107917431089104F5A075091DDB +:1075D00007E004F59A710791091D089104F5927569 +:1075E000091D0A91B4F85810A8EB0000A8EB01019E +:1075F00009B200B20091002805DAD4F850010690D3 +:1076000001200390084694F80C11002971D001293B +:1076100000F03782022900F05F81032918BFFFDFE5 +:1076200000F0728239460698FAF7FBFF08990126A6 +:1076300040F2712208600A98A0F8008000202870AB +:107640002E7108980068A8606188D4F8140151432D +:10765000C0EB41009049A0F54D70886149698142B5 +:1076600087BF07990860079801600798616A0068FA +:10767000084400F5D270E86002F0EEFC10B1E86852 +:107680001E30E8606E71B4F8D000A0EB080000B2C4 +:107690000028C4BF03206871099800281C9800F0D6 +:1076A000A682C0B1B4F8F81000290CBF0020B4F8CD +:1076B000FA00A4F8FA0094F8FC20401C50438842D9 +:1076C00009D26879401E002805DD6E71B4F8FA0011 +:1076D000401CA4F8FA00B9F1000F00F0AB8294F856 +:1076E0002001002800F0A28213B00220BDE8F08F34 +:1076F000FFE7BAF1000F08BFFFDF94F855106148AB +:1077000090F8280005F079F90C90E18A40F2712098 +:1077100041430C98002200EB41011098002806D04C +:1077200000FB01F15D48B1FBF0F000F10102C4F88B +:107730001021608840F2E24100FB01F210994FF005 +:10774000000006D0554801FB02F1B1FBF0F000F15A +:107750000100C4F8140186B221464FF00100D4F8AC +:1077600028B005F035F8074694F85500FDF743FFBB +:10777000014694F85500022808BF434807D0012865 +:1077800008BF424803D004280CBF41484148084480 +:1077900000F2E1414FF47A70B1FBF0F1608840F201 +:1077A00071225043C1EB4000801BA0F5597602F0D6 +:1077B00053FC002818BF1E3EBB4534BF3846584610 +:1077C000B04203D2BB452CBF5E463E46666294F88B +:1077D0005500FDF72EFF4FF47A7600F2E140B0FB42 +:1077E000F6F000EB0A0794F85500FDF722FF01467A +:1077F00094F85500022808BF234A07D0012808BF83 +:10780000224A03D004280CBF214A224A01EB020B72 +:10781000FDF7F1FE584400F2DB514FF47A70B1FBF2 +:10782000F0F1E08A40F2712242430C98D4F810B192 +:1078300000EB4200401AA0EB0B003844A0F12007F7 +:10784000607D40F2E24110FB01F0049094F8556035 +:107850003046FDF7D0FE0146022E08BF0A4807D089 +:10786000012E08BF094803D0042E0CBF0848094860 +:10787000084400F2E1414FF47A70B1FBF0F000EB04 +:107880004B010DE0500C002004360200A22402003F +:10789000D0FB0100C0D40100D400002040420F0002 +:1078A000049801EB000B3046FDF799FE584400F1B7 +:1078B0006201FD48416194F85500FDF7BAFE00F2FF +:1078C000E1414FF47A70B1FBF0F05044381AB0F552 +:1078D0003D7F38BFFFDFA5E6E08A40F27121D4F892 +:1078E0000421484302EB400210980021002806D0F2 +:1078F00000FB02F1ED48B1FBF0F000F10101C4F82A +:107900001011618840F2E24001FB00F210994FF043 +:10791000000006D0E54801FB02F1B1FBF0F000F1F8 +:107920000100C4F8140186B221464FF00100D4F8DA +:1079300028A004F04DFF074694F85500FDF75BFEC4 +:10794000014694F85500022808BFD94807D00128FD +:1079500008BFD84803D004280CBFD748D7480844EC +:1079600000F2E1414FF47A70B1FBF0F1608840F22F +:1079700071225043C1EB4000801BA0F5597602F004 +:107980006BFB002818BF1E3EBA4534BF3846504630 +:10799000B04203D2BA452CBF56463E466662BBF1A2 +:1079A000000F2ED11C9860B394F855603046FDF757 +:1079B00022FE022E08BFBE4907D0012E08BFBD49D6 +:1079C00003D0042E0CBFBC49BC49084400F2E1417D +:1079D0004FF47A70B1FBF0F0D4F81011E38A084448 +:1079E00040F27121D4F80421594302EB41010F1AEE +:1079F0003046FDF7F4FD0C99081A3844A0F1200731 +:107A00000AE0E18A40F27122D4F80401514300EB0C +:107A10004100D4F81011471AD4F80821D4F8001105 +:107A2000D4F8100101FB020B607D40F2E24110FB33 +:107A300001FA94F855603046FDF7DDFD0146022E4F +:107A400008BF9B4807D0012E08BF9A4803D0042ED8 +:107A50000CBF99489948084400F2E1414FF47A700C +:107A6000B1FBF0F000EB4B0082443046FDF7B7FD70 +:107A7000504400F160018C484161012084F80C0100 +:107A8000D0E5628840F27123D4F814115A43C1EB57 +:107A9000420202FB00F70098D4F800C10BEB000291 +:107AA000D4F80801D4F81031121A0CFB0030521E21 +:107AB00002FB010B607D40F2E24110FB01FA94F8F9 +:107AC00055000646FDF797FD0146022E08BF78488F +:107AD00007D0012E08BF774803D0042E0CBF76488C +:107AE0007648084400F2E1414FF47A70B1FBF0F0BF +:107AF00000EB4B0082443046FDF771FD504400F12D +:107B00006001694841618DE5628840F27123D4F8D3 +:107B100014115A43C1EB420101FB00F794F86400D1 +:107B200024281CBF94F8650024280BD1B4F88E01DA +:107B3000A8EB000000B2002804DB94F891010028B3 +:107B400018BF0646039850B3BBF1000F27D10C981D +:107B5000002814BFBAF1000FFFDF94F85500FDF7BD +:107B60004AFD022E08BF524907D0012E08BF5149D5 +:107B700003D0042E0CBF50495049084400F2E141A3 +:107B80004FF47A70B1FBF0F03F1A94F85500FDF70E +:107B900026FD01460C98401A3844A0F120070098B1 +:107BA000D4F81411584400FB01FA3046FDF723FDC8 +:107BB0000146022E08BF3E4807D0012E08BF3D48AF +:107BC00003D0042E0CBF3C483C48084400F2E1417D +:107BD0004FF47A70B1FBF0F000EB4A0A3046FDF743 +:107BE000FEFC504400F160012F4841611AE5002875 +:107BF0007FF458AD94F80C0100283FF46CAD618817 +:107C000040F27122D4F814015143C0EB41012846DF +:107C100004F08DFD0004000C3FF45DAD1D990029BA +:107C200018BF0880012013B0BDE8F08F94F85C0104 +:107C3000FBF748FB94F85C012946FBF731FA002872 +:107C40001CBF89F0010084F82101002013B0BDE8B9 +:107C5000F08F2DE9F04F1A4C074683B02078894603 +:107C6000114E00254FF00208032804BF207BB842C4 +:107C70007ED1606830612078032818BFFFDF0327BA +:107C8000B9F1080F7FD2DFE809F0041D2828237E10 +:107C90007E796562FEF712FC002818BFFFDFB7701F +:107CA00003B0BDE8F08F0000D400002040420F0078 +:107CB00004360200A2240200D0FB0100C0D401005F +:107CC000500C0020FEF71CFF002818BFFFDFE7E77D +:107CD00003B0BDE8F04FFDF75CBA2775257494F842 +:107CE0002C00012658B14FF47A71A069FAF799FC7B +:107CF000A061002104F1100004F019FD1AE0012137 +:107D00006846FBF7BDFF9DF8000042F210710002CB +:107D1000B0FBF1F201FB1205FDF7F4FF0544294623 +:107D2000A069FAF77EFCA061294604F1100004F076 +:107D3000FEFC461C208C411C0A293CBF3044208498 +:107D4000606830B1208C401C0A2828BF84F8158058 +:107D500000D267753046FEF771F90028A0D0607A2E +:107D600000289DD1207B04F11001FBF799F901E077 +:107D70000BE008E0002808BFFFDF91E7207BFAF75F +:107D800028FF25708CE7FFDF8AE7202F28BFFFDF61 +:107D9000DFF804A407213AF81700F8F709FE0400F9 +:107DA00008BFFFDF202F28BFFFDFFB48218830F806 +:107DB0001700884218BFFFDF01273461B9F1080FAF +:107DC00080F05481DFE809F0049EA6A6A1F0F0EF50 +:107DD000C4F86051F580C4F8645194F8210138B9B1 +:107DE000FAF716FFD4F82C11FBF720FC00281BDC57 +:107DF000B4F81E11B4F85800814206D1B4F8D4107A +:107E0000081AA4F8D600204605E0081AA4F8D600FF +:107E1000B4F81E112046A4F85810D4F84811C4F83C +:107E20002C11C0F850111DE0B4F81C11B4F8580022 +:107E3000091AA4F8D610B4F81C112046A4F858105A +:107E4000D4F82C11C4F84811C4F85011D4F83411E6 +:107E5000C4F8E010D4F83811C4F85411B4F83C1147 +:107E6000A4F8581101F0ACFFFAF7ACFE94F855A055 +:107E700081465046FDF7BFFBBAF1020F08BFC74964 +:107E800009D0BAF1010F08BFC54904D0BAF1040FF7 +:107E90000CBFC449C44908444FF47A7100F2E14070 +:107EA000B0FBF1F1D4F8140140F271220144608872 +:107EB0005043C1EB4000A0F1300AB9F1B70F98BFB1 +:107EC0004FF0B7092146012004F082FC4844AAEB98 +:107ED0000000A0F21939A2462146012004F078FCE6 +:107EE000DAF824109C30814288BF0D1AC6F80C9035 +:107EF0004D4538BFA946C6F8089084F8207186F829 +:107F00000280CDE602F0A3F801E0FDF742F984F823 +:107F10002071C5E6FAF77CFED4F8502101461046E0 +:107F2000FBF784FB48B1628840F27123D4F8141146 +:107F30005A43C1EB4201B0FBF1F094F865100D29F2 +:107F40000FD0B4F85820B4F81E1113189942AEBFE0 +:107F5000481C401C1044A4F81E0194F8220178B972 +:107F600005E0B4F81E01401CA4F81E0108E0B4F8B6 +:107F70001E01B4F8D410884204BF401CA4F81E01AE +:107F8000B4F85A01DFF82492401CA4F85A01B4F85E +:107F90008000B4F87E10401AB4F85810401E08440F +:107FA0001FFA80FB24E053E060E000BF96F80080F9 +:107FB000B8F10C0F28BFFFDF39F8188094F86CA1D6 +:107FC000BAF10C0F28BFFFDF39F81A000023404434 +:107FD00081B202A8CDE90050B4F81E212046FFF777 +:107FE00095FA00283FF45CAE012818BFFFDF27D0C8 +:107FF000B4F81E01ABEB000000B20028D6DA08206E +:1080000084F8740084F87370204601F02AFB84F829 +:108010000C5194F85C514FF6FF77202D00D3FFDF11 +:108020005D4820F8157094F85C01FAF7D2FD202025 +:1080300084F85C01307903B0BDE8F04FF3F7A6BED9 +:10804000B4F81E01BDF808100844A4F81E01CFE7DB +:1080500094F80C01042818BFFFDF84F80C5194F841 +:108060005C514FF6FF77202DDAD3D8E7FFDF17E614 +:1080700010B54F4C207850B101206072FEF75EFDC4 +:108080002078032805D0207A002808BF10BD0C20D6 +:1080900010BD207BFBF716F9207BFBF760FB207BF4 +:1080A000FAF797FD002808BFFFDF0020207010BD01 +:1080B0002DE9F04F3E4F83B0387801244FF000088F +:1080C00040B17C720120FEF739FD3878032818BFD3 +:1080D000387A0DD0DFF8DC9089F803406946072034 +:1080E000F8F7EFFB002818BFFFDF4FF6FF7440E002 +:1080F000387BFBF7E7F8387BFBF731FB387BFAF787 +:1081000068FD002808BFFFDF87F80080E2E70298DB +:1081100000281CBF90F80C1100292AD00088A0422A +:108120001CBFDFF874A04FF0200B4AD00721F8F7EE +:108130003FFC040008BFFFDF94F85C01FBF70FFB76 +:1081400084F80C8194F85C514FF6FF76202D28BFFF +:10815000FFDF2AF8156094F85C01FAF73AFD84F81D +:108160005CB169460720F8F7ACFB002818BFFFDFB9 +:1081700022E06846F8F783FB0028C8D021E0029887 +:1081800000281CBF90F80C11002915D00088A0F51C +:108190007F41FF39CAD114E0840C0020043602006C +:1081A000A2240200D0FB0100C0D4010084480200D8 +:1081B000500C0020D40000206846F8F760FB00282F +:1081C000DDD089F8038087F82C8087F80B8003B016 +:1081D0000020BDE8F08F70B50446FD4890F800041B +:1081E000FC4D400995F800144909884218BFFFDF8B +:1081F00095F8140D4009F84991F80014490988428E +:1082000018BFFFDFF549002001220C7188700A7049 +:108210004870C870F2490870BDE8704048E7EF49FF +:10822000087070472DE9F843ED4C064688462078E3 +:1082300000285CD1EB48FAF772FC2073202856D056 +:10824000032766602770002565722572AEB1012193 +:1082500006F1FC00FBF73DFD0620F8F751FB8146D7 +:108260000720F8F74DFB96F8FC104844B1FBF0F2FC +:1082700000FB1210401C86F8FC00FAF7A3FCDA4958 +:10828000091838BF40F2F65000F23D1086B2FDF7F3 +:10829000F9FBE061FDF736FD4FF0010950B384F8BA +:1082A0000A9001216846FBF7EBFC9DF8000042F2C2 +:1082B00010710002B0FBF1F201FB12000644FAF764 +:1082C000A7FC3146FAF7ADF9A061277567752574EB +:1082D000207B04F11001FAF7E3FE002808BFFFDF5E +:1082E00025840020FEF72AFC0020BDE8F8830C203E +:1082F000BDE8F883FAF78CFC3146FAF792F9A061F1 +:10830000A57284F82C90A8F226502063DDE7B349CB +:1083100048707047B24810B5417A0124002918BF4F +:10832000002409D190F82C1031B1416A006B8142D0 +:1083300084BF0024FEF7FCFB204610BD70B5A74C9F +:108340000546E088401CE080D4E902016278D5F857 +:108350006061002A1CBF324604F019FAA060864210 +:1083600008D895F80C01012804D0E078002804BF53 +:10837000012070BD002070BD70B50C4640F2E24196 +:1083800000FB01F52046FDF736F9022C08BF97499E +:1083900007D0012C08BF964903D0042C0CBF954987 +:1083A000954908444FF47A7100F2E140B0FBF1F0D6 +:1083B00000F54D7085428CBF281A002070BD2DE954 +:1083C000F04F83B04FF00009044680F8209190F8F8 +:1083D000DE00002807BF94F80C01032803B0BDE8B5 +:1083E000F08FFAF715FCD4F8502101461046FBF740 +:1083F0001DF90028DCBF03B0BDE8F08F628840F2B1 +:108400007123D4F814115A43C1EB4201B0FBF1F0CF +:10841000411CB4F858000144A4F81C11B4F8D4105D +:10842000B4F81C21891A09B20029DCBF03B0BDE8E9 +:10843000F08F012184F82211B4F88010B4F87E2066 +:108440006E4F891A491E084485B2DFF890A10DF1DC +:10845000080B25E09AF800600C2E28BFFFDF37F8E4 +:10846000166094F86C81B8F10C0F28BFFFDF37F865 +:108470001800CDE9009B3044B4F81C2181B20123DF +:108480002046FFF743F8002804BF03B0BDE8F08F93 +:1084900001280FD0022812BFFFDF03B0BDE8F08F24 +:1084A000B4F81C01281A00B20028BCBF03B0BDE814 +:1084B000F08FCFE7B4F81C01BDF808100844A4F809 +:1084C0001C01EDE72DE9F0430422002583B00629C5 +:1084D0007DD2DFE801F0074B03191951044680F8FB +:1084E0000C2107E004463D48C178002918BF84F8F4 +:1084F0000C210CD0FAF798FAA4F85A51B4F85800A5 +:10850000A4F81E0184F8225103B0BDE8F083067878 +:108510000C2E28BFFFDF394F94F80C0137F8166096 +:108520004FF00109032807D00128E3D194F86C81AA +:10853000B8F10C0F0AD308E0C4F80851C4F8005190 +:1085400094F86C81B8F10C0F00D3FFDF37F81800F6 +:10855000CDE90095304481B2B4F8D4200023204600 +:10856000FEF7D4FF002818BFFFDFC3E7032180F820 +:108570000C1103B0BDE8F0830546876AB0F814011A +:10858000294686B2012004F023F9044695F85500E7 +:10859000FDF731F895F85510022908BF134907D0A7 +:1085A000012908BF124903D004290CBF11491249FF +:1085B00008444FF47A7100F2E140B0FBF1F06988B1 +:1085C00040F271225143C0EB4100801B18E02DE0C6 +:1085D00001E000E00BE000E019E000E0D400002042 +:1085E000500C0020537C01000AFAFFFF0436020001 +:1085F000A2240200D0FB0100C0D401008448020084 +:10860000A0F5597601F028FD002818BF1E3EA742AC +:1086100034BF20463846B04228BF344602D2A74273 +:1086200028BF3C466C6203B0BDE8F083FFDF03B0B7 +:10863000BDE8F083F8B5894C0246874F0025616894 +:10864000606A052A48D2DFE802F0032F34373E0083 +:10865000A07A002660B101216846FBF71BFB9DF85C +:10866000000042F210710002B0FBF1F201FB1206B1 +:10867000FDF748FB8119A069F9F7D3FFA0612574C4 +:1086800003206075607A38B9207B04F11001FAF795 +:1086900007FD002808BFFFDF2584FAF7C5F9387900 +:1086A000BDE8F840F3F772BBBDE8F840002100F0E8 +:1086B0006DB8C1F86001F8BDD1F86001BDE8F840BF +:1086C000012100F063B884F82C50FAF7ADF938793D +:1086D000BDE8F840F3F75ABBFFDFF8BD70B55E4C5C +:1086E000A178022906BFE188002970BD2569C5F877 +:1086F000640195F85500FCF772FFD5F86411081A6B +:10870000A1680144A160E1680844E06070BD70B5F3 +:108710000546514890F802C0BCF1020F06BF00693F +:1087200000F5B0744E4C002904BF256070BD4FF4B5 +:108730007A7601290DD002291CBFFFDF70BD1046DB +:10874000FCF768FF00F2E140B0FBF6F0281A206069 +:1087500070BD1846FCF76DFF00F2E140B0FBF6F08B +:10876000281A206070BD3D48007800281CBF0020FA +:10877000704710B50720F8F7B5F880F0010010BD7C +:1087800036480078002818BF012070472DE9F047CF +:10879000324C82B0002584F82C50D4F8188084F82C +:1087A0002810E572814625700127277229466068E6 +:1087B00003F030FB6168C1F85081267B81F85C6171 +:1087C000C1F86091C1F85481B1F80080202E28BF13 +:1087D000FFDF244820F81680646884F80C51DFF825 +:1087E0007880A4F8585198F800600C2E28BFFFDF5D +:1087F000DFF8749039F816A094F86C610C2E28BF3D +:10880000FFDF39F816000023504481B200951A4664 +:1088100020460195FEF77AFE002818BFFFDFC4F856 +:108820000851C4F8005184F80C71A4F81E51A4F842 +:108830001C5184F82251B4F85800401EA4F8580086 +:10884000A4F85A51FAF7F0F898F8040002B0BDE81D +:10885000F047F3F79BBA0000D4000020500C002032 +:10886000740C0020840C00208448020070B5FE4C7B +:1088700021690A88A1F8FC2181F8FA0191F85400D5 +:10888000012808BF012503D0022814BFFFDF0225FD +:10889000206980F8FE5190F85500012808BF012595 +:1088A00003D0022814BFFFDF02252069012180F8D0 +:1088B000FF5180F8F811002180F8A4112079BDE85B +:1088C0007040F3F763BA2DE9F04FE74C83B0A0791D +:1088D00010F0010F04BF03B0BDE8F08FA0690123C1 +:1088E0000521C578206990F86520583003F0B5FE61 +:1088F00068B1A81E0A2806D2DFE800F009090505BC +:10890000090905050909A07840F00800A070A078C1 +:1089100000281CBF03B0BDE8F08FA06920274FF0EE +:10892000020890F80390B9F1000F1CBFB9F1010FD4 +:10893000B9F1160F1ED1206990F8640003F076FE9D +:10894000C0B1216991F864001F2813D0202808D0F5 +:10895000B9F1160F0CBFA77084F8028003B0BDE810 +:10896000F08F262081F86400B9F1160F1CBF2A2071 +:10897000FFF77CFF47F6FE7A012600254FF0280B13 +:10898000B9F10C0F00F049810BDCB9F10C0F80F04C +:108990005884DFE809F068412BD9F6F6F5F4F3F6D0 +:1089A000AAD0B9F1150F00F0518211DCB9F1110F05 +:1089B00000F0BE83B9F1120F00F0C981B9F1130FB5 +:1089C00000F0B881B9F1140F00F0D58100F039BC86 +:1089D000B9F1160F00F06C82B9F1180F00F0CE82D9 +:1089E000B9F1FF0F00F0268400F02BBC20690123B1 +:1089F000194690F86720583003F02FFE002840F009 +:108A00002284A06904F018FB216981F87201072013 +:108A100081F8670000F017BC20690123002190F85D +:108A20006520583003F019FE002800F0BA83A069D1 +:108A300004F0FFFA2169A1F88E01B1F85820801ADC +:108A400000B28245A8BF0028DCBF81F874B081F86D +:108A5000736040F3F88301F5C871A06904F0E4FA8B +:108A60000B2021693DE020690123002190F8652059 +:108A7000583003F0F2FD002800F09383A06904F061 +:108A8000AFFA002800F0DD83A0692269B0F80D106C +:108A9000A2F88E11B2F85830C91A09B28A45A8BF97 +:108AA0000029DCBF82F874B082F8736040F3CB8396 +:108AB000017982F89011B0F80510A2F8921104F033 +:108AC00082FA2169A1F89401A06904F07FFA216972 +:108AD000A1F89601A06904F080FA2169A1F8980133 +:108AE0000D2081F8650000F0AEBB20690123002154 +:108AF00090F86520583003F0B0FD002820690BD0B5 +:108B0000A0F88A5090F88C10491C80F88C10102125 +:108B100080F8651000F097BB90F8652001230521CF +:108B2000583003F09AFD00281CBF0820A07040F0C8 +:108B30008A8300F036BB206990F86510112908BFC0 +:108B4000122140F09C82E3E720690123002190F884 +:108B50006520583003F081FDA0B9206990F86520A8 +:108B6000122A0FD001230521583003F076FD00288A +:108B700018BF082000F0158300F097B9B7E0F6E2BF +:108B800036E05EE3206990F88E1031B9A0F88A5083 +:108B900090F88C10491C80F88C1000F1E801A06955 +:108BA00004F063FA206900F1C001A06904F068FADA +:108BB000206990F8C001002818BFFFDF20690188F4 +:108BC000A0F8C21100F5E271A06904F03CFA206936 +:108BD00000F5E671A06904F03EFA206980F8C061F2 +:108BE000142180F865102079F3F7D0F800F02BBB42 +:108BF000206990F86510172940F0418290F88C1098 +:108C0000491E49B280F88C100029B8BFFFDF1B2035 +:108C1000216981F8650000F016BB206990F86610A4 +:108C200011F0020F09D090F8642001230821583078 +:108C300003F013FD002800F0B482206990F8900042 +:108C400010F0020F18D1A06904F02EFA216981F802 +:108C50009100A069B0F80520A1F89220B0F80700B3 +:108C6000A1F8940002E00000F000002091F89000CC +:108C700040F0020081F89000206990F8901011F007 +:108C8000010F05D0206990F8641006291CD114E06A +:108C900090F8660010F0020F18BFFFDF206990F80F +:108CA000661041F0020180F86610A0F88A5090F832 +:108CB0008C10491C80F88C10E4E780F8645080F830 +:108CC00088502079F3F762F8206990F88C11042914 +:108CD00040F0B98280F88C512079F3F757F8206979 +:108CE00090F86410002940F0AE8200F01EBA2069AE +:108CF00090F8660010F0010F77D16946A06904F082 +:108D0000DAF99DF8000000F02501206980F896103E +:108D10009DF8011001F0410180F89710A0F88A50E9 +:108D200090F88C10491C80F88C1090F8661041F077 +:108D300001011CE020690123092190F864205830CA +:108D400003F08BFC002840F0248200F02ABA20694E +:108D500090F8661011F0040F40F02382A0F88A50BA +:108D600090F88C2041F00401521C80F88C2080F88F +:108D7000661000F068BA206990F8660010F0300FB5 +:108D800033D1A06904F0B4F9002800F05A822769B1 +:108D9000A06904F0A9F938872769A06904F0A0F94F +:108DA00078872769A06904F0A1F9B8872769A069C5 +:108DB00004F098F9F887A07910F0020F03D06069E9 +:108DC000C078142812D0206990F864101C290DD0A6 +:108DD00090F84E1001290CD090F89B11002904BF87 +:108DE00090F89A1100290CD003E05BE0206980F82C +:108DF0004E60206990F8661041F0100180F866100E +:108E00001AE090F8661041F0200180F866100288A0 +:108E1000A0F8E021028FA0F8E221428FA0F8E4211F +:108E2000828F00F5D671A0F8E621C08F888781F87F +:108E300032602079F2F7AAFF2069A0F88A5090F8F2 +:108E40008C10491C80F88C1000F0FDB920690123BA +:108E50000A2190F86420583003F0FFFB10B3A0699A +:108E600004F046F9A8B12669A06904F03DF93087FD +:108E70002669A06904F034F970872669A06904F0B6 +:108E800035F9B0872669A06904F02CF9F08701F064 +:108E9000EDFA206980F8885080F8645001F0B6FA45 +:108EA00000F0D1B9A07840F00100A07000F0CBB97B +:108EB000206901230B2190F86520583003F0CDFB89 +:108EC00010B1A77000F0BFB920690123002190F80C +:108ED0006520583003F0C1FB002800F06281206952 +:108EE00090F864002428ECD0A06904F01CF9002854 +:108EF00000F0A781206990F8961041F0040180F8F5 +:108F00009610A1694A7902F0070280F85120097988 +:108F100001F0070180F8501090F8A531002B04BF34 +:108F200090F8A431002B1CD190F855C000F15403E7 +:108F30008C4502BF1978914280F87D6011D000F510 +:108F4000D67180F8F2610288A0F8F42190F85020E0 +:108F500080F8F62190F8510081F84B002079F2F763 +:108F600015FF2069212180F86510A0F88A5090F83B +:108F70008C10491C80F88C1000F065B9206990F8BD +:108F80006410202914BF0027012790F865102229BA +:108F900008BF00F1650804D0002F18BF00F1640875 +:108FA0006DD090F8961041F0040180F89610A069F9 +:108FB00004F0DBF8F0B3D4F81890484604F0C9F890 +:108FC0000090484604F0C9F8814603F03CFC0100DB +:108FD00018D0206990F854208A4213D090F8A43118 +:108FE00023B190F8A63113EA090F4BD0002F04BF2C +:108FF00090F8513013EA090F01D18A4242D890F813 +:10900000A401B8B1DDF80090484603F01CFC78B12B +:10901000216991F8552082420AD091F8A40120B12B +:1090200091F8A70110EA090F2CD091F8A40108B11A +:109030006A4600E026E0A169206903F013FCE8B36A +:10904000A06904F090F82169A1F88E01B1F85820C8 +:10905000801A00B28245A8BF0028DCBF81F874B036 +:1090600081F8736052DD9DF8000081F890019DF851 +:10907000010081F89101242088F8000046E084F87E +:109080000280E0E0206990F8A40100281CBF1E20A7 +:10909000FFF7ECFBB7B1A0692169C07881F8CA007D +:1090A00006FA00F010F0807F08BFFFDF0A21206978 +:1090B00080F8641090F88800002800E014E008BFF1 +:1090C000FFDF0DE088F80050216991F88C00401E08 +:1090D00040B281F88C000028B8BFFFDF01F07BF9B7 +:1090E000206980F87D50AEE0206990F8A40120B19D +:1090F0000020FFF7BBFB88F80050206900F16501F4 +:1091000080F87D50884508BF80F86550206900F1DF +:109110006501884509D190F88C10491E49B280F844 +:109120008C100029B8BFFFDF8DE080F888508AE0FE +:10913000206990F8961041F0040180F89610A0691B +:1091400004F02FF816287ED1206990F864002028BA +:1091500002D0262805D076E0A06904F026F8FFF7B3 +:1091600085FB206980F8645080F888506BE02069A6 +:1091700090F864200E2A03D1A1690979122902D03E +:109180001C2A1AD10FE001230921583003F065FA97 +:1091900038B1206980F87C5080F8885080F864509D +:1091A00051E0A6704FE0A1690979142904BF80F845 +:1091B000645080F888503FF471AE202A03D1A16931 +:1091C0000979162914D0262A03D1A169097916290B +:1091D0000ED0A1690979172904BF90F86520222AC9 +:1091E00013D0E2691AB1FF2908BF80F886612AE02E +:1091F00080F8645080F8885090F86500212818BFE6 +:109200001A2020D0FFF732FB1DE080F8655090F85F +:109210008C10491E49B280F88C100029B8BFFFDFBE +:10922000206980F87D5090F8A401002818BF002024 +:1092300009D0E7E7E06900281CBF206980F8866153 +:1092400001D101F0C8F82069D0E92A12491C42F185 +:109250000002C0E92A1203B0BDE8F08F70B5FB4EE2 +:1092600005460C46306990F8CB00FE2818BFFFDF9A +:1092700032690020002C82F8CB501CBFA2F88A0073 +:1092800070BDA2F88400012082F8880070BD30B55E +:1092900085B005466846FCF73EFA002808BFFFDFA8 +:1092A000222100980BF003F80321009803F040FE00 +:1092B0000098017821F010010170294603F066FE44 +:1092C000E24C0D2D04BF0621009830D00BDCA5F137 +:1092D00002000B2819D2DFE800F0201863191926C4 +:1092E000187018192C00152D7BD008DC112D2DD0ED +:1092F000122D18BF132D09D0142D30D005E0162DD6 +:1093000046D0172D6BD0FF2D6AD0FFDFFCF716FA81 +:10931000002808BFFFDF05B030BD2069009990F834 +:10932000CC000871F2E72169009891F8CC10017126 +:10933000ECE7E26800981178017191884171090A9F +:1093400081715188C171090A0172DFE70321009818 +:1093500003F025FF0621009803F025FFD6E72069DA +:10936000B0F84410009803F0ABFE2069B0F8461046 +:10937000009803F0A9FE2069B0F84010009803F0AF +:10938000A7FE2069B0F84210009803F0A5FEBDE7E3 +:109390002069009A90F8A611117190F8A7014BE08E +:1093A000206900F1F001009803F06EFE206900F1E1 +:1093B000C401009803F072FEA8E7A549D1E90001B5 +:1093C000CDE90201206902A990F8960000F025007D +:1093D0008DF80800009803F09CFE97E701E019E083 +:1093E0002CE02069B0F84010009803F071FE20696D +:1093F000B0F84210009803F06FFE2069B0F84410F6 +:10940000009803F05DFE2069B0F84610009803F064 +:109410005BFE7BE7206990F8A41139B1009990F8C0 +:10942000A6210A7190F8A70148716FE7009A90F899 +:109430005410117190F85500507167E7206990F849 +:109440008721D0F88811009803F0AEFD5EE770B573 +:109450000C4605464FF4007120460AF04AFF25806D +:1094600070BDF7F7AEBB2DE9F0410D460746072169 +:10947000F7F79EFA040008BFBDE8F08194F8AC014C +:109480000026B8B16E700920287094F8AC0178B14C +:10949000268484F8AC61D4F8AE016860D4F8B201D7 +:1094A000A860B4F8B601A88194F8AC010028EFD107 +:1094B0002E7144E094F8B801002837D094F8B80130 +:1094C0000D2818D00E2818BFFFDF38D12088F7F7F5 +:1094D000A1FB0746F7F74DF8A0B96E700E20287073 +:1094E00094F8BA0128712088E88084F8B861384679 +:1094F000F7F739F823E02088F7F78CFB0746F7F7F2 +:1095000038F810B10020BDE8F0816E700D20287091 +:1095100094F8BA0128712088E88094F8BE01287276 +:1095200084F8B8613846F7F71EF808E094F8F001BF +:1095300040B16E701020287084F8F061AF80012077 +:10954000BDE8F08194F8C00190B16E700A202870D7 +:109550002088A880D4F8C401D4F8C811C5F8060042 +:10956000C5F80A10B4F8CC01E88184F8C061E6E7D8 +:1095700094F8CE0140B16E701A202870B4F8D00172 +:10958000A88084F8CE61DAE794F8EA0180B16E70C1 +:109590001B20287094F8EA010028D0D084F8EA61F2 +:1095A000D4F8EC01686094F8EA010028F6D1C6E727 +:1095B00094F8D2012F1DA0B16E701520287094F878 +:1095C000D201002818BF04F5EA75B8D084F8D2613A +:1095D000294638460AF099FF94F8D2010028F5D1BF +:1095E000ADE794F8DE0150B16E701D20287084F84C +:1095F000DE6104F5F07138460AF087FF9FE794F8C2 +:10960000F20138B11E20287084F8F261D4F8F40118 +:10961000686094E794F8F801002808BFBDE8F0817D +:109620006E701620287094F8F801002887D000BFCB +:1096300084F8F861D4F8FA016860B4F8FE01288172 +:1096400094F8F8010028F3D179E70000F000002039 +:109650009C480200FE4AD0600020D0611062117167 +:109660007047002180F8641080F8651080F8681059 +:1096700090F8DE1011B10221FEF724BF0321FEF79E +:1096800021BF2DE9F047F24C814686B020690D4696 +:109690000088F7F7D1FA070008BFFFDFA07828435A +:1096A000A070A0794FF0000510F0200F20691CBFBA +:1096B000A0F87E5080F8E45004D1B0F87E10491C28 +:1096C000A0F87E102069012690F86A1039B990F848 +:1096D000652001230621583002F0BFFF48B3E0881F +:1096E00010F4006F07D0206990F86A10002918BFA5 +:1096F000A0F876501DD12069B0F87610491C89B2C7 +:10970000A0F87610B0F878208A422CBF531A0023B4 +:10971000B4F808C00CF1050C634598BF80F87C6074 +:10972000914206D3A0F8765080F8F0612079F2F7E4 +:109730002DFBA0794FF0020A10F0600F11D02069C4 +:1097400090F8681011B1032906D00AE080F868602B +:109750000121FEF7B7FE04E080F868A00121FEF7C2 +:10976000B1FE206990F86810012905D1E18811F453 +:10977000807F18BF80F868A04FF00808B9F1000F8B +:1097800040F09981E28812F4007F18BFA0F8F850E9 +:1097900004D1B0F8F810491CA0F8F81012F0080F26 +:1097A00050D0A17800294DD190F8CB00FE2808BFF9 +:1097B000FFDFFE21206980F8CB1090F86510192991 +:1097C00007D0206990F864101F2911D027292AD0CA +:1097D0002FE080F88D5090F88C10491E49B280F827 +:1097E0008C100029B8BFFFDF206980F86550E8E7DA +:1097F00090F8650002F01AFF80B12069262101234C +:1098000080F8641090F865200B21583002F025FF95 +:10981000002804BF2A20FFF729F80AE02169202048 +:1098200081F8640005E080F8856180F8645080F874 +:109830008850206990F86710082904BF84F800A0B8 +:1098400080F8CBA0FFF73FF8A07910F0040F07D005 +:10985000A07828B9206990F86700072808BF26700B +:1098600000F038FCA07910F0100F09D0A07838B9BA +:10987000206990F865100B2904BF0C2180F8651051 +:10988000E07810F0080F11D020690123052190F82D +:109890006520583002F0E1FE28B184F8028020698A +:1098A00080F8B85102E0002001F0F2FAE0690028E7 +:1098B0005BD000950195029503950495206990F879 +:1098C0005500FBF798FE4FF47A7100F5FA70B0FB83 +:1098D000F1FA206990F85500FBF781FE5044ADF88D +:1098E000060020690188ADF80010B0F85810ADF8F6 +:1098F00004104188ADF8021090F8860130B1A069DB +:10990000C11C039103F0FEFA8DF81000206990F855 +:1099100085018DF80800E16968468847206980F86C +:10992000865180F885510399F9B190F88411E1B915 +:1099300090F86410272918D09DF81010039AA1B14F +:109940001378FF2B06D0072B02BF02295178FF297D +:1099500002D00AE01B2908D880F884610399C0F876 +:1099600088119DF8101080F8871100F0CCFD01F0EF +:1099700085FA0028206918BFA0F8D85004D1B0F8A3 +:10998000D810491CA0F8D81001F07BFA40B1216929 +:1099900091F8E40002289CBF401C81F8E40004D840 +:1099A000206990F8E400022806D92069A0F8D85070 +:1099B000A0F8DA5080F8E45020690123002190F8E3 +:1099C0006520583002F049FE20B9206990F8650002 +:1099D0000C285AD120690123002190F864205830C6 +:1099E00002F03BFEB0B320690123002190F867200C +:1099F000583002F032FE68B3206990F868100229EE +:109A000004BF90F8E40000283FD13846F6F781FB08 +:109A100000B3206990F8CB10FE2936D1B0F8D210EF +:109A2000012932D980F8DD60B0F88010B0F87E20CE +:109A30008B1E9A42AFBF0121891A491E89B2B0F824 +:109A4000D82023899A422EBF01229A1A521C02E082 +:109A5000F000002019E038BF92B2914288BF114651 +:109A6000012908BF80F8DD5090F869218AB1B0F86B +:109A7000DA20B0F86A0182422FBF0120801A401C10 +:109A800080B2814288BF014603E02069012180F84D +:109A9000DD502069B0F85820114489B2A0F8D410E4 +:109AA00090F86830002B18BF012B5DD0022B1CBF33 +:109AB000032BFFDF09D0E088C0F340200028206995 +:109AC00018BFA0F8E65059D151E090F86730082B44 +:109AD00021D0B0F87E10B0F8802000278B1C9A426D +:109AE00006D3511A891E0F043F0C1CBF791E8FB27A +:109AF00090F87C1051B190F864200123092158306E +:109B000002F0ABFD002808BF002729D0206990F89B +:109B10006A1089B908E0B0F87E30032B24D3B0F87E +:109B200080101144491C1FE090F865200123062194 +:109B3000583002F092FD78B121690020B1F8782008 +:109B4000B1F876108B1C9A4203D3501A801E18BFAE +:109B5000401EB84238BF87B2002F1CBF781E87B2A4 +:109B60002069B0F8D4103944A0F8D010A3E7B0F8B9 +:109B7000E610B0F8D6201144A0F8E610206990F85D +:109B8000701139B990F8672001231946583002F056 +:109B900064FD38B12069B0F88210B0F8D6201144C5 +:109BA000A0F88210206990F8883033B1B0F88410A2 +:109BB000B0F8D6201144A0F8841090F98C20002A27 +:109BC00006DDB0F88A10B0F8D6C06144A0F88A105B +:109BD0004FF03D0CB9F1000F18BF80F874C049D1A7 +:109BE0002178022911D0012908BF90F872113FD0C5 +:109BF000A17821B380F8736011F0140F18BF1E21F3 +:109C000009D000BF80F8741050E090F8CC100629FD +:109C100018BF16212CE011F0080F18BF80F874C08F +:109C200044D111F0200F18BF2321EBD111F0030F05 +:109C300008BFFFDF2A20216981F8740032E02BB1D0 +:109C4000B0F88410B0F88630994210D2002A05DDB1 +:109C5000B0F88A10B0F88620914208D2B0F882207D +:109C6000B0F880108A4208D390F870212AB12221DE +:109C700080F8741080F8736018E090F868203AB1AA +:109C8000B0F87E208A4228BF80F87480F2D209E0C2 +:109C9000B0F87E10062905D33E2180F8741080F8B4 +:109CA000736003E0206990F8731079B1206980F83F +:109CB000645080F8655080F8685090F8DE100029F4 +:109CC00014BF02210321FEF7FDFB02E00021FEF795 +:109CD000F9FB206980F8DE5006B0BDE8F047FBF7DD +:109CE0004FBDF84902468878CB78184313D108460F +:109CF00000694AB1897911F0080F03D090F8670024 +:109D0000082808D001207047B0F84810028E914210 +:109D100001D8FEF713BB0020704770B5E94C05462B +:109D20000E46E0882843E08015F0020F04D015F0BD +:109D3000010F18BFFFDF666115F0010F4FF0000241 +:109D40004FF001001AD0A661F178062902D00B2944 +:109D50000BD013E0216991F86530172B0ED1002349 +:109D6000C1E9283381F8690008E0216991F865307C +:109D7000112B04BF81F8692081F88E0015F0020FC5 +:109D800018D06169C978052902D00B290BD011E0E0 +:109D9000216991F86520152A0CD10022C1E92A22F7 +:109DA00081F86A0006E0206990F86510102908BF64 +:109DB00080F86A2015F0800F1CBF0820E07070BD8D +:109DC0002DE9F84FBF4C00254FF00108E580A57044 +:109DD000E5702570206168F30709074680F8DE808A +:109DE0000088F6F729FF5FEA000A08BFFFDF206955 +:109DF0000088FBF78DFC20690088FBF7AFFC206929 +:109E0000B0F8D21071B190F8CB10FE290FD190F8B4 +:109E1000701189B190F8672001231946583002F07B +:109E20001CFC88B1206990F8CB00FE2804D0206982 +:109E300090F8CB00FFF72BFA206990F8DF1000298B +:109E400018BF25811BD10FE02069A0F8825090F83F +:109E5000711180F8CC1000210220FFF7FFF9206972 +:109E600080F8DD500220E5E790F8AC1129B9018CAB +:109E70008288914288BF218101D881882181B0F8F0 +:109E8000D610491E8EB2B0F8D8103144A0F8D810C0 +:109E900090F8DC1000291CBFA0F8DA5080F8DC50E4 +:109EA00004D1B0F8DA103144A0F8DA10B0F87E101E +:109EB0003144A0F87E1090F86A1039B990F8652006 +:109EC00001230621583002F0C8FB28B12069B0F800 +:109ED00076103144A0F876102069B0F8D21001292C +:109EE0009CBF491CA0F8D210002E18BF80F8E45087 +:109EF00090F8DD10A1B1B0F8D800218988420FD2C6 +:109F00005046F6F706F958B1206990F8691139B151 +:109F1000B0F8DA10B0F86A01814228BF00F0B4FF4F +:109F2000206980F8DD5090F865100B2918BF0C29C6 +:109F300016D1B0F85820B0F88E31D21A12B2002AD9 +:109F40000EDBD0F89011816090F89411017302211A +:109F500001F060FF206980F8655080F898804AE041 +:109F6000242924D1B0F85810B0F88E21891A09B2EA +:109F700000291CDB90F8A42190F89011002908BF5B +:109F800090F8541080F8541090F89111002908BFEF +:109F900090F8551080F85510002A1CBF0020FEF7DD +:109FA00065FC206980F8655080F87D5023E090F8CA +:109FB0006410242918BF25291DD1B0F85810B0F815 +:109FC0008E21891A09B2002915DB90F89011002919 +:109FD00008BF90F8541080F8541090F8911100299F +:109FE00008BF90F8551080F855100020FEF73EFC91 +:109FF000206980F86450216901F15800B1F8D62039 +:10A0000002F02CF9206990F86911002918BFA0F816 +:10A01000DA502D4800902D4B2D4A3946484600F025 +:10A0200073FE216A00291CBF6078FBF720F82069C5 +:10A030000123052190F86520583002F00EFB00281E +:10A0400008BFBDE8F88FBDE8F84F00F066BC00F02F +:10A05000FBBE1C49C86170471A48C069002818BF78 +:10A0600001207047174A50701162704710B50446BE +:10A07000B0F894214388B0F89611B0F898019A424C +:10A0800001BFA3889942E38898420FD02388A4F89F +:10A09000B031A4F8B221A4F8B411A4F8B60101209B +:10A0A00084F8AC0107480079F1F770FE01212046E1 +:10A0B00001F0B0FE002084F86500032084F86800F9 +:10A0C00010BD0000F000002083960100E39C010019 +:10A0D0001B9D010070B5FE4CA07910F0020F08BF67 +:10A0E00070BDA078002818BF70BD6169F8482722AC +:10A0F000CB780E26002500690D2B78D00BDCA3F160 +:10A1000002030B2B1FD2DFE803F0201E808B9F2F52 +:10A110001E591E73D100152B00F02A810BDC112B68 +:10A1200065D0122B00F0F480132B00F0FF80142B6D +:10A1300000F00E8107E0162B00F03281172B00F0A3 +:10A140003F81FF2B35D0FFDF70BD90F867200123E2 +:10A150001946583002F081FA002818BF70BD082057 +:10A16000216981F8670070BD90F8643009790A2B85 +:10A1700001BF90F8CA308B4280F8645080F8885054 +:10A1800008BF70BD90F8663013F0080F0DD023F0B3 +:10A19000080180F8661090F88C10491E49B280F8CA +:10A1A0008C100029A8BF70BDCFE0FF291CBFFFDFC6 +:10A1B00070BD80F8642080F8845170BD90F866000E +:10A1C00010F0010F08BFFFDF216991F88C00401EDD +:10A1D00040B281F88C000028B8BFFFDF206990F8FA +:10A1E000661021F0010100BF80F8661070BD21E00B +:10A1F00090F86500102818BFFFDF0121206980F862 +:10A200008D10112180F8651070BD90F8650014283C +:10A2100018BFFFDF0121206980F88D101521F1E7BB +:10A2200090F86500152818BFFFDF1720216981F815 +:10A23000650070BD90F86500152818BFFFDF192074 +:10A24000216981F8650070BD90F865001B2818BF72 +:10A25000FFDF206980F88D5090F8B801002818BF02 +:10A26000FFDF206990F88E1049B180F88E50018888 +:10A27000A0F8BC1180F8BA5180F8B8610AE00188F2 +:10A28000A0F8BC1180F8BA51012180F8BE110D214F +:10A2900080F8B8110088F6F7BDFCF6F755F920797B +:10A2A000F1F774FD206980F8655070BD90F88C114D +:10A2B000042915D0206990F8661011F0020F08BF2C +:10A2C00070BD90F88C10491E49B280F88C1000299E +:10A2D000B8BFFFDF206990F8661021F0020183E724 +:10A2E00090F8642001230021583002F0B6F90028CC +:10A2F00008BFFFDF206990F8901011F0020F07BF30 +:10A30000062180F8641080F8885080F88C51D1E7DD +:10A3100090F8642001230021583002F09EF90028B3 +:10A3200008BFFFDF206980F8646070BD90F8661098 +:10A3300021F0040180F8661090F88C10491E49B293 +:10A3400080F88C100029A8BF70BDFFDF70BD00BF72 +:10A3500090F8642001230021583002F07EF9002893 +:10A3600008BFFFDF1C20216981F8640070BD00BFB9 +:10A3700090F8660000F03000102818BFFFDF206959 +:10A3800090F8661021F0100180F8661090F88C109B +:10A39000491E49B280F88C100029A8BF70BDD4E7CF +:10A3A00090F8642001230021583002F056F900286B +:10A3B00008BFFFDF1F20216981F8640070BD00BF66 +:10A3C00090F8650021281CBF0028FFDF22202169AA +:10A3D00081F8650070BD3E49086990F8662012F06A +:10A3E000080F1EBF01208870704742F0080280F8F5 +:10A3F00066208969C97880F8C9100021A0F88A1000 +:10A4000090F88C10491C80F88C10704710B5304CB7 +:10A4100005212069FEF756F8206990F84E100129B1 +:10A4200002BF022180F84E1010BD00F5D6710288DF +:10A43000A0F8D421028EA0F8D621828EA0F8D821CF +:10A44000028FB0F844309A4228BF1A46CA85828FDC +:10A45000B0F84600824238BF10460886012081F8D5 +:10A4600026002079BDE81040F1F790BC184830B4C0 +:10A47000006990F84E30B0F832C0C48EB0F8401089 +:10A48000428F022B28D08A4238BF11460186C28FE4 +:10A49000B0F842108A4238BF11468186028FB0F868 +:10A4A00044108A4238BF11464186828FB0F8461068 +:10A4B0008A4238BF1146C186418E614588BF8C46AD +:10A4C000A0F832C0C18EA14288BF0C46C48601E00C +:10A4D000F000002030BC7047038E9A4228BF1A4615 +:10A4E000C58F838E9D4238BF2B468A4238BF1146A6 +:10A4F0000186B0F842108B4228BF0B4683860021AC +:10A5000080F84E10CAE770B5FE4C206990F8CB1069 +:10A51000FE2906BFA178002970BD90F867200123AD +:10A520001946583002F099F8002818BF70BD20690C +:10A53000002590F8701159B1A0F8825090F871116F +:10A5400080F8CC10BDE8704000210220FEF786BEE6 +:10A5500090F8652001230421583002F07EF80600AF +:10A560000CD0D4F810C09CF86500102861D01428D5 +:10A5700065D015287BD01B287ED0BEE0216991F8DC +:10A58000660010F0010F05D0BDE8704001210920E0 +:10A59000FEF764BE10F0020F0BD001210C20FEF775 +:10A5A0005DFE206990F8901041F0010180F8901054 +:10A5B00070BD10F0040F05D0BDE8704001211320DC +:10A5C000FEF74CBE10F0080F09D091F8C90081F8D1 +:10A5D000CC00BDE8704001210720FEF73FBE10F01F +:10A5E000100F02D091F89B0120B191F8650021284D +:10A5F00073D179E091F89A0188B1B1F89C01A1F882 +:10A600004000B1F89E01A1F84200B1F8A001A1F804 +:10A610004400B1F8A201A1F8460081F89A51FFF771 +:10A6200025FFFFF7F3FEBDE8704001211520FEF77E +:10A6300015BEBDE8704001210B20FEF70FBEF9F7F3 +:10A6400025FB0C2838BF70BD08212069F030F9F7D0 +:10A6500021FB28B120690421C430F9F71BFB00B9A4 +:10A66000FFDFBDE8704001210420FEF7F7BD9CF834 +:10A67000730101280DD000E030E0022818BF70BD42 +:10A680009CF88E00D8B106208CF8CC000121022065 +:10A690001DE09CF8B801002818BF70BD0CF1B00394 +:10A6A00000220CF1E8010CF5BA7001F052FF012113 +:10A6B0000520FEF7D3FD206980F8735170BD9CF82A +:10A6C000960010F0040F14BF11200D200121FEF799 +:10A6D000C5FD206980F8735170BD0EE0BDE8704083 +:10A6E00001210620FEF7BABD91F87D00C0B991F8AE +:10A6F000A40110B191F8A50190B1206901230021B6 +:10A7000090F86420583001F0A8FFC8B120690123F7 +:10A71000042190F86520583001F09FFF30B10FE020 +:10A72000BDE8704001211720FEF798BD206990F820 +:10A730007C0028B1BDE8704000211220FEF78EBDDC +:10A74000206990F864200A2A2BD0002E18BF70BD13 +:10A7500001230021583001F080FF48B1206990F8B2 +:10A760008C11042904BF90F8900010F0030F22D040 +:10A7700020690123002190F86420583001F06DFF1A +:10A7800000287DD0206990F89A1111B190F89B11A2 +:10A79000E9B190F8A411002972D090F8A511E9B39D +:10A7A00092E090F8CA1080F8CC10BDE8704000210B +:10A7B0000720FEF753BD00210C20FEF74FFD206956 +:10A7C00090F8901041F0010180F8901070BDB0F841 +:10A7D0009C11A0F84010B0F89E11A0F84210B0F8FB +:10A7E000A011A0F84410B0F8A211A0F8461080F80B +:10A7F0009A5190F8660010F0200F13D0FFF736FE44 +:10A80000FFF704FE01211520FEF728FD206990F8CE +:10A81000661021F0200141F0100100E008E080F80E +:10A82000661070BDBDE8704000211420FEF716BD13 +:10A8300090F8652001230B21583001F00EFFF8B984 +:10A84000206990F85400012808BF012503D0022890 +:10A8500014BFFFDF0225206990F85500012808BFCA +:10A86000012603D0022814BFFFDF02262069012D34 +:10A8700090F8A61105D0022D08BF022903D00DE0E3 +:10A8800022E001290AD190F8A711012E04D0022E4E +:10A8900008BF02290BD001E0012908D090F86520FB +:10A8A00001230321583001F0D8FE68B903E00020ED +:10A8B000FDF7DCFF08E020690123022190F8652004 +:10A8C000583001F0CAFEB0B120690123002190F890 +:10A8D0006420583001F0C1FE002808BF70BD206917 +:10A8E00090F88401002808BF70BD0021BDE87040C9 +:10A8F000FF20FEF7B3BCBDE8704000211620FEF734 +:10A90000ADBC0000F000002030B5FB4C05462078BF +:10A91000002818BFFFDF657230BDF74901200872BB +:10A9200070472DE9F14FF54F39464E68304696F89D +:10A93000551001F042FF96F8551080B211F00C0F3F +:10A940006FF00D047FD0B0F5747F38BF002506D3BB +:10A950005038C11700EB916004EBA01085B2708EE7 +:10A96000A84238BF0546E648DFF88C93C9F82400B2 +:10A97000786800F15808834609F13400BBF832705A +:10A9800040689BF8551090F86AA0584601F015FFF2 +:10A990009BF8551080B211F00C0F5FD0B0F5747FAA +:10A9A00038BF002406D35038C21700EB926004EB86 +:10A9B000A01084B2A74238BF3C46BAF1000F1CBFBA +:10A9C000201D84B2E0B2F9F709FF98F812000028C0 +:10A9D0004FD008F15801CA4891E80E1000F50274F2 +:10A9E00084E80E10D8F86810C0F82112D8F86C105E +:10A9F000C0F8251200F58170FAF7A6FABF48007872 +:10AA000000280CBF0120002080F00101BD48017624 +:10AA1000D8E91412C0E90412A0F58372D9F8241001 +:10AA2000F9F7B5FD96F85500012808BF002204D0BB +:10AA300002281ABFFFDF00220122E9B20120F9F744 +:10AA4000B4FD1CE0FFE7022919BF04EBD00085B27A +:10AA50006FF00E0101EB900081D17FE7022919BF51 +:10AA600004EBD00084B26FF00E0202EB9000A1D193 +:10AA70009FE7D9F82400FAF767FAF9F7B9FD0098CB +:10AA800050B9012296F8553096211046FAF712F97E +:10AA900000219620FAF7A4FA96F82C00012808BFA6 +:10AAA000FAF730FB022089F80000BDE8F88F2DE9A5 +:10AAB000F04FDFF8488283B0414681464D68A1F1EE +:10AAC0001400009095F85D0005F158060127A1F1EA +:10AAD000340470B3012879D0022878D0032818BF35 +:10AAE000FFDF75D0206A0823017821F0080101708A +:10AAF000B27903EAC202114321F004010170F27934 +:10AB0000042303EA8202114321F01001017096F838 +:10AB100005B0E06AF5F70DFB8246FAF743FEBBF19C +:10AB2000020F7AD0BBF1010F78D0BBF1030F76D0C2 +:10AB30008AE0FFE700F0CAFB0146284601F03BFE31 +:10AB40001FFA80FB00F0C2FB10F00C0F6FF00D013C +:10AB50004FF0000A20D0BBF5747F38BF504607D3B2 +:10AB6000ABF15000C21700EB926001EBA01080B275 +:10AB7000298E814238BF0846ADF80800A5F8480084 +:10AB80000098FAF7EEFD90B1216AA77062694FF460 +:10AB90008060904703202CE0022819BF01EBDB0006 +:10ABA00080B26FF00E0000EB9B00E1D1DFE701AA5D +:10ABB00002A9E06AF5F7F8F9206210B196F83510AD +:10ABC00039B10098FAF7A1FD77718BE713E016E031 +:10ABD00026E09DF8041031B9A0F800A080F802A08A +:10ABE000012102F0A5F9BDF80810206A02F0DFFA91 +:10ABF0000220707176E70098FAF787FD72E7B5F8E2 +:10AC00004800ADF8000001AA6946E06AF5F7CCF902 +:10AC10002062002808BFFFDF64E708E00BE00EE0D9 +:10AC20000098FAF79EFD002808BFFFDF5AE730EAD8 +:10AC30000A0009D106E030EA0A0005D102E0BAF1C3 +:10AC4000000F01D0012100E00021206A027842EAD1 +:10AC500001110170717C00291CBF7179012933D069 +:10AC600006F15801264891E80E1000F5027A8AE8AC +:10AC70000E10B16EC0F82112F16EC0F8251200F569 +:10AC80008170FAF761F998F8000000280CBF0121E3 +:10AC900000211C480176D6E91212C0E90412A0F581 +:10ACA0008371226AF9F773FC95F85400012808BFF4 +:10ACB000002204D002281ABFFFDF00220122FB215C +:10ACC0000020F9F772FC03E0FAF73EF9F9F790FC7F +:10ACD000B9F1000F06D195F85430012296210020D9 +:10ACE000F9F7E8FF6771206A0188E18180782074B4 +:10ACF000277003B0BDE8F08F140100204801002048 +:10AD0000C80C0020D00E00202DE9F0471E46174643 +:10AD100081460C46FE4DDDF82080287828B9002FAA +:10AD20001CBF002EB8F1000F00D1FFDFC5F81C805A +:10AD3000C5E90576C5E90D9400272F72EF712F71D3 +:10AD4000EF706F71AF71AF70AF81F24E04F15808C0 +:10AD50002088F5F771FFE8622088F5F75BFF28632C +:10AD6000F9F759FD94F95700F9F702FE04F11200C2 +:10AD7000FAF7D3F804F10E00F9F704FE3078002852 +:10AD80000CBF03200120FAF7DCF898F81A00F9F755 +:10AD900001FEFAF7D0F83078002804BFFF2094F8BD +:10ADA000544023D098F81250B4F8328094F85510DB +:10ADB000204601F002FD94F8554080B214F00C0FCB +:10ADC0006FF00D012CD0B0F5747F06D35038C21748 +:10ADD00000EB926001EBA01087B24046B84528BF57 +:10ADE0003846002D1CBF001D80B2C0B22146F9F7C5 +:10ADF000F5FC3078F8B1706890F86801002818BF49 +:10AE0000F9F766FD224600210120F9F70CFF706872 +:10AE1000D0F8E000FAF79BF8BDE8F047012080E5A4 +:10AE2000022C19BF01EBD00087B26FF00E0101EBCD +:10AE30009000D2D1D0E7002122460846F9F7F3FE70 +:10AE4000BDE8F047012032E6B24800B50178343859 +:10AE5000007819B1022818BFFFDF00BD012818BF14 +:10AE6000FFDF00BDAA4810B50078022818BFFFDF39 +:10AE7000BDE8104000F080BA00F07EBAA4484079E6 +:10AE80007047A34800797047A14901208871704735 +:10AE90002DE9F04706009F489D4D406800F1580499 +:10AEA000686A90F8019018BF012E03D1296B08F051 +:10AEB00093FE6870687800274FF00108A0B1012860 +:10AEC0003CD0022860D003281CBFFFDFBDE8F0871C +:10AED000012E08BFBDE8F087286BF5F71FFB687AE5 +:10AEE000BDE8F047F0F752BF012E14D0A86A002841 +:10AEF00008BFFFDF6889C21CD5E9091009F058F9BD +:10AF0000A86A686201224946286BF5F783F9022E88 +:10AF100008BFBDE8F087D4E91401401C41F10001ED +:10AF2000C4E91401E079012801D1E77101E084F856 +:10AF30000780687ABDE8F047F0F728BF012E14D0EB +:10AF4000A86A002808BFFFDF6889C21CD5E909107C +:10AF500009F02EF9A86A686200224946286BF5F7C5 +:10AF600059F9022E08BFBDE8F087D4E91410491C36 +:10AF700040F10000C4E91410E07901280CBFE7712A +:10AF800084F80780BDE8F087012E06D0286BF5F71E +:10AF9000C5FA022E08BFBDE8F087D4E91410491C99 +:10AFA00040F10000C4E91410E0790128BFD1BCE7EA +:10AFB0002DE9F041574F3846A7F13404406800F1BD +:10AFC00058052078012818BFFFDFA878012648B16E +:10AFD0000021A970A6706269042090473878002883 +:10AFE00018BF2E71206A0321007831EA000004BFE7 +:10AFF000E878002805D1EE70216AA6706269022007 +:10B0000090470121002000F0D6F918B1BDE8F041C9 +:10B0100000F0B2B9BDE8F041002082E42DE9F14F23 +:10B020003C4E4FF000083046A6F1340540683178B8 +:10B0300000F1580A2878C146022818BFFFDFA88906 +:10B0400040F40070A88171683078FF2091F85410A6 +:10B05000F9F7C4FB009800289AF8120000F0FD8070 +:10B06000F9F7ECFAF9F7DAFA012788B99AF8120039 +:10B0700070B1686A417859B100789AF80710C0F346 +:10B08000C000884204D1EF70BDE8F84F00F074B9F9 +:10B09000686A41786981002908BFC5F8288003D013 +:10B0A000286BF5F771F8A862A88940F02000A88104 +:10B0B00085F804803078706800F1580B044690F8E9 +:10B0C0002C0001281AD1FAF713F85946204601F04E +:10B0D00080FA98B13078002870680CBF00F58A704B +:10B0E00000F5F570218841809BF8081001719BF8EC +:10B0F000091041710770687AF0F748FE686A9AF89B +:10B1000006100078C0F3800088423BD0307803E01E +:10B110001401002048010020706800F1580490F8E4 +:10B120005D0058B3022847D084F8058030780028A5 +:10B130001CBF2079002806D084F80480AF706A69AB +:10B14000414610209047E07890B184F80380FAF7E8 +:10B1500017FB002808BFFFDF0820AF706A690021D5 +:10B160009047D4E91202411C42F10000C4E91210D8 +:10B17000A07901280CBF84F80680A771A88940F443 +:10B180008070A881686A9AF807300178C1F3C0021C +:10B190009A424FD13278726801F0030102F15804EB +:10B1A000012918BF022932D003291CBFE87940F0D9 +:10B1B000040012D0E8713DE0E86AF4F721FF0028AE +:10B1C00008BFFFDFD4E91210491C40F10000C4E9B8 +:10B1D0001210687AF0F7DAFDA6E701F0C1FE90B12F +:10B1E000A770A989384641F40061A981696AAF70E6 +:10B1F0006A699047E079012803D100BF84F807808D +:10B2000018E0E77116E0E87940F01000D2E74078E6 +:10B21000F8B1A98941F40061A981A96A51B1FB285B +:10B22000F1D8287A002808BFB94603D080206A697F +:10B23000002190470120009900F0BDF8B0B1B9F1AC +:10B24000000F1CBF0020FFF723FEBDE8F84F00F001 +:10B2500093B8E0790128D4D1D0E7002818BFF9F7D6 +:10B2600026FAA88940F04000A881E3E7B9F1000F71 +:10B270001CBF0120FFF70CFE0020FFF718FCB9F1FE +:10B28000000F08BFBDE8F88F0220BDE8F84FFFE5CA +:10B2900070B50D4606466848674900784C6850B15D +:10B2A000F9F748FA034694F8542029463046BDE899 +:10B2B0007040FDF72CBAF9F73DFA034694F8542094 +:10B2C00029463046BDE8704005F00ABD5A4802786C +:10B2D0004168406801F1580C91F8643090F85400CE +:10B2E000242B1CBF9CF80DC0BCF1240F13D01F2BC6 +:10B2F00018BF202B24D0BCF1220F18BF7047002AA2 +:10B3000008BF704791F8A62191F85110114011F033 +:10B31000010F27D02EE04AB191F89011002908BF03 +:10B320007047012818BF012924D021E091F8F210BC +:10B33000002908BF7047012818BF01291AD017E05B +:10B34000BCF1220FDBD0002A08BF704791F8A6118C +:10B3500011F0010F0ED111F0020F08BF7047012844 +:10B3600008D005E011F0020F08BF7047012801D096 +:10B3700002207047012070472F4910B54C68F9F73B +:10B3800089FEF9F768FEF9F763FDF9F7CCFDF9F7E7 +:10B390002FF994F82C00012808BFF9F7A9FE274CD3 +:10B3A00000216269A0899047E269E179E0789047DD +:10B3B0000020207010BD70B5204C0546002908BF44 +:10B3C000012D05D12079401CC0B22071012831D84F +:10B3D000A1692846884700282CD0A179184839B19E +:10B3E000012D01BF41780029017811F0100F21D003 +:10B3F000E179F9B910490978002908BF012D05D074 +:10B4000000290CBF01210021294311D10D490978E0 +:10B4100011F0100F04BF007810F0100F0AD0A078C0 +:10B4200040B9A06A20B9608910B111F0100F01D0A5 +:10B43000002070BD012070BD4801002014010020D3 +:10B44000C80C00202201002010B540F2C311F748BB +:10B4500008F02DFFFF220821F54808F020FFF548ED +:10B46000002141704FF46171418010BD2DE9F04120 +:10B470000E46054600F046FBEC4C102816D004EBB7 +:10B48000C00191F84A0110F0010F1CBF0120BDE876 +:10B49000F081607808283CBF012081F84A011CD265 +:10B4A0006078401C60700120BDE8F0816078082859 +:10B4B00013D222780127501C207004EBC208306898 +:10B4C000C8F84401B088A8F84801102A28BFFFDF57 +:10B4D00088F8435188F84A71E2E70020BDE8F0811E +:10B4E000D2480178491E4BB2002BB8BF704770B4E8 +:10B4F0005FF0000500EBC30191F84A1111F0010F54 +:10B500003BD04278D9B2521E427000EBC10282F8A1 +:10B510004A5190F802C00022BCF1000F0BD98418E8 +:10B5200094F803618E4202D1102A26D103E0521C06 +:10B53000D2B29445F3D80278521ED2B202708A4237 +:10B540001BD000EBC20200EBC10CD2F84341CCF897 +:10B550004341D2F84721CCF84721847890F800C0C5 +:10B560000022002C09D9861896F8036166450AD195 +:10B57000102A1CBF024482F80311591E4BB2002B43 +:10B58000B8DA70BC7047521CD2B29442EBD8F4E7E0 +:10B590002DE9F05F1F4690460E46814600F0B2FA54 +:10B5A000A24D0446102830D0A878002100280ED9DA +:10B5B0006A1892F80331A34205D110291CBF12204A +:10B5C000BDE8F09F03E0491CC9B28842F0D80828C2 +:10B5D00034D2102C1CD0AE781022701CA87005EB51 +:10B5E000061909F10300414600F0A2FF09F18300AA +:10B5F0001022394600F09CFFA819002180F8034171 +:10B6000080F83B110846BDE8F09FA878082815D2BD +:10B610002C78CA46601C287005EBC4093068C9F84C +:10B620004401B0884FF0000BA9F84801102C28BF46 +:10B63000FFDF89F843A189F84AB1CCE70720BDE8CC +:10B64000F09F70B479488178491E4BB2002BBCBF83 +:10B6500070BC704703F0FF0C8178491ECAB282703B +:10B6600050FA83F191F8031194453ED000EB021596 +:10B6700000EB0C14D5F80360C4F80360D5F807603C +:10B68000C4F80760D5F80B60C4F80B60D5F80F60FC +:10B69000C4F80F60D5F88360C4F88360D5F887607C +:10B6A000C4F88760D5F88B60C4F88B60D5F88F50EC +:10B6B000C4F88F50851800EB0C0402EB420295F899 +:10B6C00003610CEB4C0C00EB420284F8036100EBCD +:10B6D0004C0CD2F80B61CCF80B61B2F80F21ACF82E +:10B6E0000F2195F83B2184F83B2100EBC10292F831 +:10B6F0004A2112F0010F33D190F802C00022BCF1B0 +:10B70000000F0BD9841894F803518D4202D1102AEE +:10B7100026D103E0521CD2B29445F3D80278521ECF +:10B72000D2B202708A421BD000EBC20200EBC10C05 +:10B73000D2F84341CCF84341D2F84721CCF8472115 +:10B74000847890F800C00022002C09D9851895F85B +:10B75000035165450BD1102A1CBF024482F8031126 +:10B76000591E4BB2002BBFF675AF70BC7047521C10 +:10B77000D2B29442EAD8F3E72E49487070472D4878 +:10B780004078704738B14AF2B811884203D8294945 +:10B790004880012070470020704726484088704745 +:10B7A00010B500F0AFF9102814D0204A014600204F +:10B7B00092F802C0BCF1000F0CD9131893F80331B2 +:10B7C0008B4203D1102818BF10BD03E0401CC0B24B +:10B7D0008445F2D8082010BD14498A78824286BF79 +:10B7E00001EB001083300020704710498A788242B4 +:10B7F00086BF01EB0010C01C002070470B4B93F874 +:10B8000002C084459CBF00207047184490F8030193 +:10B8100003EBC00090F843310B70D0F84411116075 +:10B82000B0F848019080012070470000F80E002019 +:10B830005A01002050010020FE4A114491F80321D2 +:10B84000FD490A7002684A6080880881704710B517 +:10B85000F8F74CFE002804BFFF2010BDBDE81040E3 +:10B86000F8F76ABEF3498A7882429CBF002070478D +:10B87000084490F8030101EBC00090F84A0100F081 +:10B88000010070472DE9F047EA4F0026B0463878AE +:10B89000002886BF4FF0080ADFF8A093BDE8F087C4 +:10B8A00007EBC80505F5A27195F8430100F02AF9E8 +:10B8B000102808BF544610D0B978002400290BD9AD +:10B8C0003A1992F80321824202D1102C05D103E0EB +:10B8D000621CD4B2A142F3D80824B878A04286BF33 +:10B8E00007EB0410C01C002095F84A1111F0010F5D +:10B8F00016D050B1082C04D2391991F83B11012906 +:10B9000003D0102100F0F1FD50B109F80640304697 +:10B91000731C95F8432105F5A271DEB2F9F700F822 +:10B9200008F1010000F0FF0838784045B8D8BDE8BC +:10B93000F0872DE9F041BF4C00263546A07800285D +:10B940008CBFBE4FBDE8F0816119C0B291F8038190 +:10B95000A84286BF04EB0510C01C002091F83B11E3 +:10B96000012903D0102100F0C0FD58B104EBC8003C +:10B97000BD5590F8432100F5A2713046731CDEB22C +:10B98000F8F7CEFF681CC5B2A078A842DCD8BDE8A5 +:10B99000F08110B5F8F7EEFF002804BF082010BDB5 +:10B9A000F8F7ECFFA549085C10BD0A46A24910B59E +:10B9B000497841B19F4B997829B10244D81CF8F7D6 +:10B9C00032FD012010BD002010BD9A4A01EB41015B +:10B9D00002EB41010268C1F80B218088A1F80F0138 +:10B9E00070472DE9F041934D07460024A8780028C0 +:10B9F00098BFBDE8F081C0B2A04213D905EB041096 +:10BA000010F183060ED01021304600F06EFD48B9CB +:10BA100004EB440005EB400000F20B113A463046BF +:10BA2000F9F73DFF601CC4B2A878A042E3D8BDE896 +:10BA3000F08101461022824800F07ABD80487047AC +:10BA400070B57C4D0446A878A04206D905EB0410D9 +:10BA50001021833000F049FD08B1002070BD04EBD7 +:10BA6000440005EB400000F20B1070BD71498A786C +:10BA7000824206D9084490F83B01002804BF012007 +:10BA80007047002070472DE9F0410E4607461546E5 +:10BA90000621304600F029FD664C98B1A17871B1BD +:10BAA00004F59D7011F0010F18BF00F8015FA17837 +:10BAB000490804D0457000F8025F491EFAD1012000 +:10BAC000BDE8F0813846314600F01CF8102816D049 +:10BAD000A3780021002B12D9621892F80321824228 +:10BAE00009D1102918BF082909D0601880F83B51E6 +:10BAF0000120BDE8F081491CC9B28B42ECD800207E +:10BB0000BDE8F0812DE9F0414A4D06460024287831 +:10BB10000F46002812D900BF05EBC40090F843116E +:10BB2000B14206D10622394600F5A27008F014FB96 +:10BB300038B1601CC4B22878A042EDD81020BDE80E +:10BB4000F0812046BDE8F0813A4910B44A7801EB13 +:10BB5000C003521E4A70002283F84A2191F802C0A5 +:10BB6000BCF1000F0DD98B1893F80341844204D126 +:10BB7000102A1CBF10BC704703E0521CD2B294457F +:10BB8000F1D80A78521ED2B20A70824204BF10BCA9 +:10BB9000704701EBC00301EBC202D2F843C1C3F806 +:10BBA00043C1D2F84721C3F847218C7891F800C0EF +:10BBB0000022002C9CBF10BC70478B1893F80331F7 +:10BBC000634506D1102A1CBF114481F8030110BC43 +:10BBD0007047521CD2B29442EFD810BC704770B478 +:10BBE00014490D188A78521ED3B28B7095F8032130 +:10BBF000984247D001EB031C01EB0014DCF8036012 +:10BC0000C4F80360DCF80760C4F80760DCF80B6078 +:10BC1000C4F80B60DCF80F60C4F80F60DCF88360D8 +:10BC2000C4F88360DCF88760C4F88760DCF88B6058 +:10BC300008E00000F80E0020500100205A0100200A +:10BC4000BB100020C4F88B60DCF88FC0C4F88FC034 +:10BC500001EB030C03EB43039CF8034100EB4000B2 +:10BC600001EB430385F8034101EB4000D3F80B419E +:10BC7000C0F80B41B3F80F31A0F80F319CF83B012D +:10BC800085F83B0101EBC20090F84A0110F0010F6A +:10BC90001CBF70BC704700208C78002C0DD90B188D +:10BCA00093F803C1944504D110281CBF70BC7047A1 +:10BCB00003E0401CC0B28442F1D80878401EC0B2F4 +:10BCC0000870904204BF70BC704701EBC20301EBE7 +:10BCD000C000D0F843C1C3F843C1D0F84701C3F84E +:10BCE00047018C780B780020002C9CBF70BC7047FB +:10BCF00001EB000C9CF803C19C4506D110281CBF29 +:10BD0000084480F8032170BC7047401CC0B28442D4 +:10BD1000EED870BC7047000010B50A7B02F01F021D +:10BD20000A73002202768B181B7A03F0010C5B0861 +:10BD300003F00104A4445B0803F00104A4445B087D +:10BD400003F00104A4445B0803F0010464444FEAD7 +:10BD5000530C0CF0010323444FEA5C0C0CF001047B +:10BD6000234403EB5C0300EB020C521C8CF81330F1 +:10BD700090F818C0D2B263440376052AD3D3D8B260 +:10BD8000252888BFFFDF10BD0023C383428401EB59 +:10BD9000C202521EB2FBF1F10184704770B46FF021 +:10BDA0001F02010C02EA90251F23A1F5AA40543876 +:10BDB0001CBFA1F5AA40B0F1550009D0A1F528504B +:10BDC000AA381EBFA1F52A40B0F1AA00012000D177 +:10BDD00000204FF0000C62464FEA0C048CEA01068A +:10BDE000F6431643B6F1FF3F11D005F001064FEAC6 +:10BDF0005C0C4CEAC63C03F0010652086D085B0877 +:10BE0000641C42EAC632162CE8D370BC704770BC82 +:10BE1000002070472DE9F04701270025044603293B +:10BE20000FD04FF4FA4200297CD0012900F006819E +:10BE3000022918BFBDE8F0870146BDE8F047583039 +:10BE40006AE704F158067821304608F052FAB571D5 +:10BE5000F57135737573F573357475717576B576DF +:10BE6000212086F83E00412086F83F00FE2086F81B +:10BE7000730084F82C50258484F8547084F855702D +:10BE8000282084F856001B20208760874FF4A47078 +:10BE9000E087A0871B20208660864FF4A470E08690 +:10BEA000A0861B20A4F84000A4F844004FF4A4701E +:10BEB000A4F84600A4F842001B20A4F84A00A4F805 +:10BEC0004C00A4F8480067734FF448606080A4F801 +:10BED000D050A4F8D250A4F8D450A4F8D650A4F866 +:10BEE000D850A4F8DA5084F8DD5084F8DF50A4F874 +:10BEF000E65084F8E450A4F8F850A4F8FA5084F816 +:10BF00009A5184F89B5184F8A45184F8A55184F87F +:10BF1000695184F8705184F8735184F88C51BDE8EC +:10BF2000F087FFE7A4F8E65084F8DE506088FE4909 +:10BF30000144B1FBF0F1A4F878104BF68031A4F87D +:10BF40007A10E388A4F87E50B4F882C0DB000CFBC2 +:10BF500000FCB3FBF0F39CFBF0FC5B1CA4F882C07C +:10BF60009BB203FB00FC04F15801A4F88030BCF53F +:10BF7000C84FC4BF5B1E0B85B2FBF0F2521CCA85D2 +:10BF800000F5802202F5EE32531EB3FBF0F20A8474 +:10BF9000CB8B03FB00F2B2FBF0F0C883214604F127 +:10BFA0005800FFF7B9FE07F0A5F9E8B3D4F80E1072 +:10BFB0006FF01F02080C02EA91281F26A0F5AA4183 +:10BFC00054391CBFA0F5AA41B1F155010AD0A0F522 +:10BFD0002851AA391EBFA0F52A41B1F1AA014FF09C +:10BFE000010901D14FF00009002211464FEA020C6D +:10BFF00082EA0003DB430B43B3F1FF3F1AD008F0A2 +:10C000000103520842EAC33206F0010349087608E8 +:10C010000CF1010C41EAC3314FEA5808BCF1160F8C +:10C02000E6D3B9F1000F00E000E003D084F86851D6 +:10C03000BDE8F08784F86871BDE8F087A4F8E650A1 +:10C04000B4F89401B4F89831B4F802C004F158017E +:10C05000A4F87E50B4F88240DB0004FB0CF4B3FB80 +:10C06000F0F394FBF0F45B1C4C859BB203FB00F4F3 +:10C070000B85B4F5C84FC4BF5B1E0B85B2FBF0F255 +:10C08000521CCA854A8C00EBC202521EB2FBF0F26F +:10C090000A84CA8B02FB0CF2B2FBF0F0C883BDE845 +:10C0A000F08770B50025044603290DD04FF4FA42FD +:10C0B000002963D001297DD0022918BF70BD014637 +:10C0C000BDE87040583027E604F158067821304624 +:10C0D00008F00FF9B571F57135737573F573357433 +:10C0E00075717576B576212086F83E00412086F878 +:10C0F0003F00FE2086F8730084F82C502584012030 +:10C1000084F8540084F85500282184F856101B2127 +:10C11000218761874FF4A471E187A1871B212186C4 +:10C1200061864FF4A471E186A1861B21A4F840101A +:10C13000A4F844104FF4A471A4F84610A4F84210D7 +:10C140001B21A4F84A10A4F84C10A4F848106073FE +:10C15000A4F8D850202084F8DA0084F8D050C4F82D +:10C16000D45084F8045184F8055184F80E5184F8B1 +:10C170000F5184F8F45084F8005170BD60886A490A +:10C180000144B1FBF0F1A4F878104BF68031A4F82B +:10C190007A10E388A4F87E50B4F882C0DB000CFB70 +:10C1A00000FC9CFBF0FCB3FBF0F304F15801A4F895 +:10C1B00082C000E022E05B1C9BB203FB00FCA4F801 +:10C1C0008030BCF5C84FC4BF5B1E0B85B2FBF0F2DC +:10C1D000521CCA8500F5802202F5EE32531EB3FBD5 +:10C1E000F0F20A84CB8B03FB00F2B2FBF0F0C883C1 +:10C1F000214604F15800BDE870408DE5D4F8F830D0 +:10C20000B4F802C004F158005989DB89A4F87E50C3 +:10C21000B4F88240DB0004FB0CF4B3FBF1F394FBB5 +:10C22000F1F45B1C44859BB203FB01F40385B4F578 +:10C23000C84FC4BF5B1E0385B2FBF1F2521CC2851E +:10C24000428C01EBC202521EB2FBF1F20284C28B9D +:10C2500002FB0CF2B2FBF1F1C18370BD2DE9F003DA +:10C26000047E0CB1252C03D9BDE8F00312207047E1 +:10C27000002A02BF0020BDE8F003704791F80DC00E +:10C280001F260123294D4FF00008BCF1000F77D085 +:10C29000BCF1010F1EBF1F20BDE8F0037047B0F8CE +:10C2A00000C00A7C8F7B91F80F907A404F7C87EA20 +:10C2B000090742EA072282EA0C0C00270CF0FF096A +:10C2C0004FEA1C2C99FAA9F99CFAACFC4FEA1969BF +:10C2D0004FEA1C6C49EA0C2C0CEB0C1C7F1C9444A0 +:10C2E000FFB21FFA8CFC032FE8D38CEA020C0F4F2D +:10C2F0000022ECFB057212096FF0240502FB05C257 +:10C30000D2B201EBD207427602F007053F7A03FA78 +:10C3100005F52F4218BF82767ED104FB0CF2120C79 +:10C32000521CD2B2002403E0FFDB050053E4B36EDD +:10C3300000EB040C9CF813C094453CBFA2EB0C022C +:10C34000D2B212D30D194FF0000C2D7A03FA0CF76C +:10C350003D421CBF521ED2B2002A6AD00CF1010C21 +:10C360000CF0FF0CBCF1080FF0D304F1010C0CF041 +:10C37000FF04052CD7D33046BDE8F0037047FFE734 +:10C3800090F819C00C7E474604FB02C2FA4C4FF0ED +:10C39000000CE2FB054C4FEA1C1C6FF024040CFB64 +:10C3A0000422D2B201EBD204427602F0070C247AC6 +:10C3B00003FA0CFC14EA0C0F1FBF82764046BDE85E +:10C3C000F003704790F818C0B2FBFCF40CFB142289 +:10C3D000521CD2B25FF0000400EB040C9CF813C0B6 +:10C3E00094453CBFA2EB0C02D2B212D30D194FF010 +:10C3F000000C2D7A03FA0CF815EA080F1CBF521E28 +:10C40000D2B27AB10CF1010C0CF0FF0CBCF1080FA8 +:10C41000F0D304F1010C00E00EE00CF0FF04052C59 +:10C42000DAD3A8E70CEBC40181763846BDE8F00307 +:10C4300070470CEBC40181764046BDE8F0037047BD +:10C44000CE4A016812681140CD4A1268114301605A +:10C45000704730B4CB49C94B00244FF0010C0A7827 +:10C46000521CD2B20A70202A08BF0C700D781A68CC +:10C470000CFA05F52A42F2D0097802680CFA01F1AB +:10C480005140016030BC7047017931F01F0113BF8A +:10C49000002000221146704710B4435C491C03F091 +:10C4A000010C5B0803F00104A4445B0803F00104E1 +:10C4B000A4445B0803F00104A4445B0803F00104F6 +:10C4C000A4445B0803F001045B08A44403F00104E6 +:10C4D000A4440CEB53031A44D2B20529DDDB012A34 +:10C4E0008CBF0120002010BC704730B40022A1F1A5 +:10C4F000010CBCF1000F11DD431E11F0010F08BF4C +:10C5000013F8012F5C785FEA6C0C07D013F8025F18 +:10C5100022435C782A43BCF1010CF7D1491E5CBF71 +:10C52000405C0243002A0CBF0120002030BC704751 +:10C53000130008BF704710B401EB030CD41A1CF8A9 +:10C5400001CC5B1E00F804C013F0FF03F4D110BC53 +:10C550007047F0B58DB0164610251C466A46AC46AD +:10C5600000EB0C03A5EB0C0713F8013CD355ACF121 +:10C57000010313F0FF0CF3D115461032102084464E +:10C580000B18ACEB000713F8013C401ED35510F01C +:10C59000FF00F5D1284606F02FFD86B1102005F1E9 +:10C5A000200201461318A1EB000C13F8013C401EB9 +:10C5B00004F80C3010F0FF00F4D10DB0F0BD089875 +:10C5C0002060099860600A98A0600B98E0600DB048 +:10C5D000F0BD38B505460C466846F8F79EFD0028C4 +:10C5E00008BF38BD9DF900202272A07E607294F9C8 +:10C5F0000A100020511A48BF494295F82D308B424D +:10C60000C8BF38BDFF2B08BF38BDE17A491CC9B28D +:10C61000E17295F82E30994203D8A17A7F2918BF8C +:10C6200038BDA2720020E072012038BD0C2818BF6E +:10C630000B2810D00D2818BF1F280CD0202818BF99 +:10C64000212808D0222818BF232804D024281EBF60 +:10C65000262800207047012070470C2963D2DFE8AC +:10C6600001F006090E13161B323C415C484E002AAD +:10C670005BD058E0072A18BF082A56D053E00C2A8E +:10C6800018BF0B2A51D04EE00D2A4ED04BE0A2F13C +:10C690000F000C2849D946E023B1A2F110000B2865 +:10C6A00043D940E0122A18BF112A3ED090F8360034 +:10C6B00020B1122A37D31A2A37D934E0162A32D3B6 +:10C6C0001A2A32D92FE0A2F10F0103292DD990F8AF +:10C6D000360008B31B2A28D925E0002B08BF042AFE +:10C6E00021D122E013B1062A1FD01CE0012A1AD161 +:10C6F0001BE01C2A1CBF1D2A1E2A16D013E01F2A6D +:10C7000018BF202A11D0212A18BF222A0DD0232A8F +:10C710001CBF242A262A08D005E013B10E2A04D013 +:10C7200001E0052A01D000207047012070472DE963 +:10C73000F04187680D4604462046F6F736FC98B16E +:10C7400015B33846A168F6F771FF00281CDD2844B0 +:10C75000401EB0FBF5F606FB05F13846F5F761FF24 +:10C76000A0603046BDE8F081F6F752FA40F233712E +:10C77000F5F757FFA060DFE753E4B36EA44802006B +:10C78000A8480200620100200020BDE8F08190422C +:10C7900028BF704770B50446101B642838BF64205A +:10C7A00025188D4205D8F6F774FF00281CBF2846CF +:10C7B00070BD204670BD808E7047C08E70470844A3 +:10C7C00018449830002A14BF0421002108447047FF +:10C7D00030B491F854300A8E13F00C0F4FF4747C7F +:10C7E0001CBF0CEB821292B21DD08B8E934238BFCD +:10C7F0001A464B8E91F8554014F00C0F1CBF0CEBF1 +:10C8000083139BB217D0C98E994238BF0B460028BC +:10C810000CBF01200020D1189831002818BF042037 +:10C82000084430BC7047022B07BF92003C32D20054 +:10C83000703292B2D9E7022C07BF9B003C33DB0079 +:10C8400070339BB2DFE710F0010F1CBF012070476F +:10C8500010F0020F1CBF0220704710F0040018BF38 +:10C86000082070472DE9F041054617468846012605 +:10C87000084600F06EFC0446404600F06EFC03469D +:10C8800010F0010F18BF012008D113F0020F18BFDC +:10C89000022003D113F0040018BF082014F0010F88 +:10C8A00018BF4FF0010C20D050EA0C0108BF002641 +:10C8B00013F0030F08BF002014F0030F08BF4FF060 +:10C8C000000C95F85410814208BF0020387095F88C +:10C8D0005510614508BF4FF0000C87F801C00028D3 +:10C8E00008BFBCF1000F1CD10DE014F0020F18BFFF +:10C8F0004FF0020CD8D114F0040F14BF4FF0080C05 +:10C900004FF0000CD0E7404600F02DFCB5F8581071 +:10C91000401A00B247F6FE71884201DC002800DCB4 +:10C9200000263046BDE8F08101281CBF0228002007 +:10C93000704718B4CBB2C1F3072CC1B2C0F30720C3 +:10C94000012B05D0022B08BFBCF1020F1BD002E067 +:10C95000BCF1010F17D0012904D0022908BF022819 +:10C9600011D001E001280ED001EA0C0161F30702A9 +:10C9700010EA030060F30F22D0B210F0020F18BFCC +:10C9800002200BD106E0084003EA0C01084060F3E6 +:10C990000702EFE710F0010018BF01208DF800003A +:10C9A000C2F3072010F0020F18BF022003D110F0CD +:10C9B000010018BF01208DF80100BDF8000018BC6F +:10C9C0007047162A10D12A220C2818BF0D280FD024 +:10C9D0004FF0230C1F280DD031B10878012818BF63 +:10C9E000002805D0162805D0002070470120704788 +:10C9F0001A70FBE783F800C0F8E7012902D002298A +:10CA000005D007E0002804BF40F2E240704740F63E +:10CA1000C410704700B5FFDF40F2E24000BD0000E7 +:10CA2000282107F044BC4078704730B505460078AF +:10CA300001F00F0220F00F0010432870092910D2D6 +:10CA4000DFE801F0050705070509050B0D000624C1 +:10CA500009E00C2407E0222405E0012403E00E2471 +:10CA600001E00024FFDF6C7030BD007800F00F00A3 +:10CA700070470A68C0F803208988A0F8071070473B +:10CA8000D0F803200A60B0F80700888070470A6871 +:10CA9000C0F809208988A0F80D107047D0F8092047 +:10CAA0000A60B0F80D00888070470278402322F0B9 +:10CAB000400203EA81111143017070470078C0F30E +:10CAC000801070470278802322F0800203EAC111AF +:10CAD0001143017070470078C0097047027802F076 +:10CAE0000F02072A16BF082AD0F80520D0F8032025 +:10CAF000C1F809200CBFB0F80920B0F80720A1F850 +:10CB00000D200A7822F080020A700078800942EA3B +:10CB1000C0100870704770B514460E4605461F2AAF +:10CB200088BFFFDF2246314605F1090007F040FBD0 +:10CB3000A01D687070BD70B544780E460546062C81 +:10CB400038BFFFDFA01F84B21F2C88BF1F242246DE +:10CB500005F10901304607F02BFB204670BD70B58A +:10CB600014460E4605461F2A88BFFFDF224631467F +:10CB700005F1090007F01CFBA01D687070BD70B5C1 +:10CB800044780E460546062C38BFFFDFA01F84B24E +:10CB90001F2C88BFFFDF224605F10901304607F050 +:10CBA00007FB204670BD0968C0F80F1070470A885F +:10CBB000A0F8132089784175704790F8242001F07F +:10CBC0001F0122F01F02114380F82410704707292B +:10CBD00088BF072190F82420E02322F0E00203EA36 +:10CBE0004111114380F8241070471F3007F096BCA4 +:10CBF00010B5044600F0E3FA002818BF204410BD29 +:10CC0000C17811F03F0F1BBF027912F0010F002213 +:10CC1000012211F03F0F1BBF037913F0020F002315 +:10CC200001231A4402EB4202530011F03F0F1BBFD5 +:10CC3000027912F0080F0022012203EB420311F0E7 +:10CC40003F0F1BBF027912F0040F00220122134490 +:10CC500011F03F0F1BBF027912F0200F00220122BA +:10CC600002EBC20203EB420311F03F0F1BBF02793C +:10CC700012F0100F0022012202EB42021A4411F0BE +:10CC80003F0F1BBF007910F0400F0020012010441F +:10CC900010F0FF0014BF012100210844C0B270470A +:10CCA00070B50278417802F00F02082A4DD2DFE811 +:10CCB00002F004080B4C4C4C0F14881F1F280AD993 +:10CCC00043E00C2907D040E0881F1F2803D93CE02F +:10CCD000881F1F2839D8012070BD4A1E242A34D845 +:10CCE0008446C07800258209032A09D000F03F0459 +:10CCF000601C884204D86046FFF782FFA04201D939 +:10CD0000284670BD9CF803004FF0010610F03F0F5D +:10CD10001EBF1CF10400007810F0100F13D0644601 +:10CD20000421604600F04BFA002818BF14EB000005 +:10CD3000E6D0017801F03F012529E1D28078022177 +:10CD4000B1EB501FDCD3304670BD002070BDC07801 +:10CD5000800970470178002201F00F030121042BA4 +:10CD60000BD0082B1CBF0020704743780E2B04BF4C +:10CD7000C3785FEA931C04D106E04078801F1F2827 +:10CD800000D911460846704713F03F0F1EBF0079C7 +:10CD900010F0010F10F0020FF4D1F2E710B4017897 +:10CDA00001F00F01032920D0052921D14478B0F8E2 +:10CDB0001910B0F81BC0B0F81730827D222C17D1A3 +:10CDC000062915D3B1F5486F98BFBCF5FA7F0FD28D +:10CDD00072B1082A98BF8A420AD28B429CBFB0F82F +:10CDE0001D00B0F5486F03D805E040780C2802D04C +:10CDF00010BC0020704710BC012070472DE9F041A5 +:10CE00001F4614460D00064608BFFFDF2146304688 +:10CE100000F0D5F9040008BFFFDF30193A46294673 +:10CE2000BDE8F04107F0C4B9C07800F03F0070479A +:10CE3000C02202EA8111C27802F03F021143C170A0 +:10CE40007047C9B201F00102C1F340031A4402EB7A +:10CE50004202C1F3800303EB4202C1F3C00302EBC1 +:10CE60004302C1F3001303EB43031A44C1F340131D +:10CE700003EBC30302EB4302C1F380131A4412F025 +:10CE8000FF0202D0521CD2B20171C37802F03F01FE +:10CE900003F0C0031943C170511C417070472DE964 +:10CEA000F0410546C078164600F03F04C4F1240066 +:10CEB0000F46B042B8BFFFDF281932463946001D81 +:10CEC00007F076F9A019401C6870BDE8F0812DE9E3 +:10CED000F04105464478C0780F4600F03F06002C2C +:10CEE00008BFFFDFA01B401E84B21F2C88BF1F2479 +:10CEF0002FB1A819011D2246384607F059F92046DE +:10CF0000BDE8F0814078704700B5027801F0030376 +:10CF100022F003021A430270012914BF02290021E2 +:10CF200004D0032916BFFFDF012100BD417000BD01 +:10CF300000B5027801F0030322F003021A430270E5 +:10CF4000012914BF0229002104D0032916BFFFDFE5 +:10CF5000012100BD417000BD007800F00300704762 +:10CF6000417889B1C0780E2818BF0F2803D0102847 +:10CF700018BF192802D3FB2904D905E0BF4A105C69 +:10CF8000884201D1012070470020704730B501244C +:10CF90000546C17019293CBFB848445C02D3FF293B +:10CFA00018BFFFDF6C7030BD70B515460E460446E5 +:10CFB0001B2A88BFFFDF65702A463146E01CBDE8AA +:10CFC000704007F0F5B8B0F807007047B0F80900F6 +:10CFD0007047C172090A01737047B0F80B007047BF +:10CFE00030B4B0F80720A64DB0F809C0B0F805304D +:10CFF0000179941F2D1998BFBCF5FA7F0ED269B143 +:10D00000082998BF914209D293429FBFB0F80B0004 +:10D01000B0F5486F012030BC98BF7047002030BC8D +:10D020007047001D07F07ABA021D0846114607F046 +:10D0300075BAB0F809007047007970470A68426015 +:10D0400049688160704742680A608068486070473C +:10D050000988818170478089088070470A68C0F814 +:10D060000E204968C0F812107047D0F80E200A60F0 +:10D07000D0F81200486070470968C0F81610704771 +:10D08000D0F81600086070470A68426049688160FD +:10D09000704742680A608068486070470968C160EC +:10D0A0007047C06808607047007970470A6842603E +:10D0B00049688160704742680A60806848607047CC +:10D0C0000171090A417170478171090AC171704784 +:10D0D0000172090A417270478172090AC172704770 +:10D0E00080887047C08870470089704740897047C2 +:10D0F00001891B2924BF4189B1F5A47F07D3818809 +:10D100001B2921BFC088B0F5A47F012070470020F3 +:10D1100070470A68426049688160704742680A60E7 +:10D12000806848607047017911F0070F1BBF407994 +:10D1300010F0070F002001207047017911F0070F50 +:10D140001BBF407910F0070F0020012070470171CC +:10D15000704700797047417170474079704781711D +:10D16000090AC1717047C088704746A282B0D2E9EF +:10D170000012CDE900120179407901F007026946F9 +:10D180001DF80220012A07D800F00700085C0128DA +:10D190009EBF012002B07047002002B070470171AD +:10D1A000704700797047417170474079704730B5DA +:10D1B0000C460546FB2988BFFFDF6C7030BDC37885 +:10D1C000024613F03F0008BF70470520127903F0B4 +:10D1D0003F0312F0010F36D0002914BF0B20704717 +:10D1E00012F0020F32D0012914BF801D704700BF1A +:10D1F00012F0040F2DD0022914BF401C704700BF4D +:10D2000012F0080F28D0032914BF801C704700BFFC +:10D2100012F0100F23D0042914BFC01C704700BFA8 +:10D2200012F0200F1ED005291ABF1230C0B270476D +:10D2300012F0400F19D006291ABF401CC0B2704727 +:10D24000072918D114E00029CAD114E00129CFD14F +:10D2500011E00229D4D10EE00329D9D10BE0042931 +:10D26000DED108E00529E3D105E00629E8D102E096 +:10D27000834288BF7047002070470000AC4802001E +:10D2800086F3FFFF00010102010202032DE9F041D4 +:10D29000FA4D0446284600216A78806801270E4628 +:10D2A00012B1012A1ED006E090F86620002A18BFAD +:10D2B0006F7000D001216A78C2EB421200EB42028B +:10D2C00092F82830194324D0667090F8D90002F102 +:10D2D0002A0170B12A22201D06F06AFF0420207066 +:10D2E00027710DE090F82820002A18BF6E70E1D158 +:10D2F000E1E73C22201D06F05BFF0520207027712E +:10D300006878A968C0EB401001EB400080F8286005 +:10D310001DE090F8A410E9B190F8D900012818BFD9 +:10D32000FFDFA868D0F8A5106160D0F8A910A1604F +:10D33000D0F8AD10E160D0F8B110216190F8B510CF +:10D340002175667013212170277180F8A460012077 +:10D35000BDE8F08190F82210012922D0017801293E +:10D360001CBF0020BDE8F081667014212170811C73 +:10D370002022201D06F01CFF2672A9680E70C048EE +:10D3800082888284D0F8C420527B80F8262080F8DE +:10D390002270D1F8C4000088F3F73CFCF3F7E3F8FF +:10D3A000D5E7667007212170416A616080F82260CC +:10D3B000CDE7B24880680178002914BF80884FF615 +:10D3C000FF7070472DE9F84F4FF000088946064678 +:10D3D0000127CDF80080FFF748FBBDF80010A74DEE +:10D3E00021F06004ADF8004008284FD2DFE800F0DB +:10D3F00004070D4E184E132C44F003000DE044F0CA +:10D400001500ADF80000474641E044F0100000BFB1 +:10D41000ADF800003BE044F0020040F01000F7E7F8 +:10D42000A86890F8E000052818BFFFDF44F01A0054 +:10D43000ADF80000A96891F8E710002914BF40F08A +:10D44000010020F00100E3E7A86890F8E01003294C +:10D450000AD090F8E010062958D090F8E00004288F +:10D4600018BFFFDF5FD012E03046FFF770FC0028E6 +:10D4700018BFFFDF0AD1F07810F03F0F1FBF3079DF +:10D4800010F0020F44F00400ADF800004746BDF86C +:10D4900000000090BDF80000C0F3C00BA868CBEB03 +:10D4A0004B1A00EB4A0090F82800002818BFBDE88E +:10D4B000F88F3046FFF7D9FA80467048806800EB55 +:10D4C0004A0190F8C90001F12A04012808BF01258A +:10D4D00003D0022814BFFFDF0225257300206073EC +:10D4E0006648806890F8E11084F83B10FF21A17332 +:10D4F0007F21E176BDF80010618190F8E0100429E9 +:10D500001CBF90F8E01006293AD044E044F00A012C +:10D51000ADF8001090F8FA00002814BF41F00400A4 +:10D5200021F0040074E73046FFF711FCD8B1012860 +:10D5300004BF44F00100ADF8000014D0022818BF69 +:10D54000FFDFA4D144F00200ADF80000A96891F813 +:10D55000FA10002914BF40F0040020F00400ADF8D8 +:10D560000000474693E7F07810F03F0F1FBF307977 +:10D5700010F0020FBDF8000040F0040087D047E72C +:10D5800090F8E200012808BF012503D0022814BF4B +:10D59000FFDF0225657304F10900384D00902878FB +:10D5A0007F2808BFFFDF2978009801707F2028704E +:10D5B0006FB1B8F1070F04F11C01304603D2FFF739 +:10D5C000BAFA207239E0FFF782FC207204E00020F2 +:10D5D0002072B8F1070F30D3B8F1070F0DD1A8684A +:10D5E00090F8F91001B3D0F8EA10C4F80210B0F8BE +:10D5F000EE10E18090F8F0006070A07A10F0040F57 +:10D600000ED0A86890F8FA10E9B190F8F7102175DB +:10D61000D0F8F110C4F81510B0F8F500A4F819000E +:10D62000B8F1070F38D098E0F07810F03F0F1ABF2C +:10D63000307910F0010FFF20DED0621CA11C3046B3 +:10D6400001F071FDD9E7B8F1070F1CBFB8F1010F68 +:10D65000FFDFB9F1000F08BFFFDF99F80000207568 +:10D66000B8F1010F03D0B8F1070F0BD075E004F14A +:10D6700015013046FFF712FA6FE000006401002048 +:10D68000CC10002001213046FFF7B2FA0168C4F83F +:10D6900015108088A4F81900F07810F03F0F1CBF17 +:10D6A000317911F0080F1AD0A86890F8E020042A08 +:10D6B00006D090F8E000032811D111F0100F0ED021 +:10D6C00003213046FFF794FA407803210009A07344 +:10D6D0003046FFF78DFA0088C0F30B002082F07807 +:10D6E00010F03F0F1CBF307910F0400F13D0FA48F4 +:10D6F000FFF72DFBA96891F8E020032A14D006213A +:10D700003046FFF775FA0078E076A86890F8E010E8 +:10D71000062922D118E0A86890F8FB10002918BF4C +:10D7200090F8F800F0D1F0E791F8C910042914BF7F +:10D7300008290028E3D1F07810F03F0F1CBF3079A2 +:10D7400010F0080FDBD1E0E790F8E9100909A173A8 +:10D75000B0F8E800C0F30B002082A968012001EBBB +:10D760004A0181F82800BBF1000F14BF06200520F4 +:10D77000BDE8F84F03F0F4B82DE9F041D74DAA68A1 +:10D7800092F8D930002B6ED07F27012611B109788D +:10D79000FE2914D0804692F82800002818BFBDE862 +:10D7A000F08102F12A044046FFF75FF900210828C2 +:10D7B00079D2DFE800F0515356787878595CC64C3E +:10D7C00092F8A400002818BFBDE8F08182F8A66096 +:10D7D00092F8DD0018B1F6F76CFE012829D020463A +:10D7E000FFF76CF90146A86880F8A71000F1A801BE +:10D7F0002046FFF745F92046FFF76DF90146A86876 +:10D8000080F8AE1000F1AF012046FFF747F9A86895 +:10D8100000F1B50428787F2808BFFFDF2878207042 +:10D820002F70A86880F8A460BDE8F041052003F0DF +:10D8300097B8F6F781FEA96801F1A802A731FDF7B4 +:10D84000DDFF002808BFFFDFA86890F8A71041F0AF +:10D85000020180F8A710CEE7A17209E0A67221723A +:10D860000CE0032001E021E00220A07200E0FFDFD5 +:10D8700004F10B014046FFF75EF92072621CA11C07 +:10D88000404601F050FC287809347F2808BFFFDFAC +:10D89000287820702F70A86880F82860BDE8F041D3 +:10D8A000052003F05DB82172BDE8F081BDE8F041CC +:10D8B00088E570B5894C0022A06890F8C910104620 +:10D8C00002F0A8FE002831D0F7F735FBA0688449A4 +:10D8D00090F8DF000D5C2846F7F75CF8A06880F848 +:10D8E000E15090F8C910082916BF04290F202520FF +:10D8F000F6F75DFFA068002190F8C9200120F7F736 +:10D9000050F97548F7F720FBA068D0F80001F7F749 +:10D910001EFBA06890F8C91080F8E21090F8C800CB +:10D92000032814BF0228012908D103E0BDE8704094 +:10D9300001F032BC08210020F7F707FCA06890F83E +:10D94000C91080F8E210F7F7DDFBA06890F8DD0061 +:10D9500020B1F6F77AFD4020F7F7A8FBA168032075 +:10D9600081F8E00070BD2DE9F0410F469046054674 +:10D970000321FFF73DF94078584C0209A06890F860 +:10D98000E91062F3071180F8E91003212846FFF738 +:10D990002FF90188A068B0F8E82061F30B02A0F825 +:10D9A000E82080F8E77090F8C910012905D090F8B8 +:10D9B000E000032808BFBDE8F081E8784FF00106D9 +:10D9C00010F03F0F1CBF287910F0400F09D006213E +:10D9D0002846FFF70DF90178A06880F8F81080F864 +:10D9E000FB60A06890F8E01003292AD0E97811F0D4 +:10D9F0003F0F1CBF297911F0010F08D000F1F00290 +:10DA0000911F284601F08FFBA06880F8F960E87844 +:10DA100010F03F0F1ABF287910F0020FBDE8F08117 +:10DA200001212846FFF7E4F8A1680268C1F8F12057 +:10DA30008088A1F8F50081F8F78081F8FA60BDE8E8 +:10DA4000F081022F18BF012FD0D1BDE8F08123490A +:10DA5000896881F80A01704770B5204DA86890F870 +:10DA6000E010022919BF90F8E010012900210C46AE +:10DA70001CBF0C2070BD00BFC1EB411200EB420285 +:10DA8000034682F82840491CC9B20229F4D3047025 +:10DA900080F8224093F8DD0030B1F7F719FBF6F774 +:10DAA000E8FCA86880F8DD40A868012180F8DC4027 +:10DAB00080F8C11080F8C84080F8DF40282180F845 +:10DAC0000B1180F80A41A0F8E34080F8E5400721F7 +:10DAD00080F8C010002070BDD81100206401002023 +:10DAE000D4480200F74810B58068002180F8E010A3 +:10DAF000012180F8E010FFF7AFFF002818BFFFDF1B +:10DB000010BD2DE9F047EF4C07460C26A06890F8B1 +:10DB1000E01001291FBF90F8E00002280C20BDE8AA +:10DB2000F087F6F778FEA06890F90A01F6F720FF73 +:10DB3000A06890F8C91080F8E21090F8C010012594 +:10DB4000002978D090F8C8004FF00009032802D0CF +:10DB5000022805D008E00521DB4801F0ADFB03E019 +:10DB60000321D94801F0A8FBA06890F8D81000293B +:10DB700004BF90F8DB00002843D0F5F749F80646CB +:10DB8000A0683146D0F8D400F5F750FDCF4990FB9E +:10DB9000F1F801FB180041423046F4F742FD01461E +:10DBA000A068C0F8D410D0F8D0104144C0F8D0100C +:10DBB000FDF7F3FD0146A068D0F8D020914220D8AF +:10DBC000C0E9349690F8DB0000281CBF0120FDF767 +:10DBD00008FF0121A06890F8DC20002A1CBF90F803 +:10DBE000D820002A0DD090F8B93000F1BA02012BEC +:10DBF00004D1527902F0C002402A14D0BA30F7F7AB +:10DC000085FEA06890F8B910BA30F6F769FE0F21CA +:10DC10000720F6F781FEA068002690F8E0100129A1 +:10DC200018D112E007E0FDF709FFA1682A46BA31D2 +:10DC3000F7F735FEE5E790F8E010022904BF80F819 +:10DC4000E0500C2006D1BDE8F08780F80451022195 +:10DC500080F8E010A06890F8C10088B1FDF769FE77 +:10DC600003219B48FDF7A1FE0146A06880F8DD1066 +:10DC7000C0F800719748F7F750F93046BDE8F087D3 +:10DC8000FDF700FEECE738B58E4CA06890F8E01088 +:10DC900002291CBF0C2038BD012180F80511A0F815 +:10DCA000081129208DF800006846F5F7F3FF30B120 +:10DCB000A0689DF8001090F80601884205D1A06880 +:10DCC00090F80601401C8DF80000A1689DF8000046 +:10DCD00081F806010220F7F734F97F48F6F752FE83 +:10DCE000A168DFF8F8C1002091F8C03091F8DF207A +:10DCF000521CACFB02546408A4EB8404224481F857 +:10DD0000DF2023FA02F212F0010F03D1401CC0B24F +:10DD10000328EBD3FFF7CDFD002038BD69498968A2 +:10DD200081F8C900002070476649896881F8DA00E7 +:10DD3000704710B5634CA36893F8B830022B14BF3A +:10DD4000032B00280BD100291ABF02290120002033 +:10DD50001146FDF725FD08281CBF012010BDA06855 +:10DD600090F8B800002816BF022800200120BDE866 +:10DD70001040F7F755BD5348806890F8B800002868 +:10DD800016BF022800200120F7F74ABD4D498968D7 +:10DD900081F8B80070474B49896881F8DC0070470A +:10DDA00070B5484CA16891F8B800002816BF022849 +:10DDB0000020012081F8B900BA31F7F71BFDA068F7 +:10DDC00090F8B810022916BF03290121002180F81C +:10DDD000DB1090F8B920002500F1BA03012A04BF36 +:10DDE0005B7913F0C00F0AD000F1BA03012A04D105 +:10DDF0005A7902F0C002402A01D0002200E001223C +:10DE000080F8D820002A04BF002970BDC0F8D05087 +:10DE1000F4F7FEFEA168C1F8D40091F8DB000028F9 +:10DE20001CBF0020FDF7DDFD0026A06890F8DC1087 +:10DE300000291ABF90F8D810002970BD90F8B920B9 +:10DE400000F1BA01012A04D1497901F0C001402949 +:10DE500005D02946BDE87040BA30F7F757BDFDF749 +:10DE6000EDFDA1683246BDE87040BA31F7F717BD45 +:10DE700070B5144D0C4600280CBF01230023A9687F +:10DE800081F8C13081F8CB004FF0080081F8CC0058 +:10DE90000CD1002C1ABF022C012000201146FDF7E6 +:10DEA0007FFCA968082881F8CC0001D0002070BD53 +:10DEB000022C14BF032C1220F8D170BD002818BF0B +:10DEC00011207047640100200012002040420F0022 +:10DED000D8110020D1480200D7480200ABAAAAAA54 +:10DEE0000328FE4A926808BFC2F8C41082F8C8002E +:10DEF0000020704710B5044602F018FF052809D02D +:10DF000002F014FF042805D0F448806880F8D94056 +:10DF1000002010BD0C2010BDF048816891F8C800A9 +:10DF2000032804D0012818BF022807D004E091F884 +:10DF3000CB00012808BF70470020704791F8CA0045 +:10DF4000012814BF03280120F6D1704710B5F7F758 +:10DF5000A1F8F7F780F8F6F77BFFF6F7E4FFDF4C60 +:10DF6000A06890F8DD0038B1F7F7B2F8F6F781FA5B +:10DF7000A168002081F8DD00A068012180F804116B +:10DF8000022180F8E010002010BDD449896881F892 +:10DF9000FC007047017801291CBF122070474278AD +:10DFA0000023032ACD49896808BFC1F8C43081F82D +:10DFB000C820012281F8C920C27881F8B8200279EE +:10DFC000002A16BF022A0123002381F8C13081F8FC +:10DFD000CA20427981F8C020807981F8DA000020D7 +:10DFE0007047BE488068704701F0D6B82DE9F84FF9 +:10DFF0004FF00008B948F7F790F8B84C4FF07F0A97 +:10E00000002808BF84F800A0F7F772F8B448FEF7BC +:10E010002CFDA070A16891F8E220012A18BFFFDF53 +:10E020000AD0A06890F8DD0018B1F7F751F8F6F7BC +:10E0300020FA4046BDE8F88FA94D0026A5F5867761 +:10E04000072836D291F8C10028B9F6F793FC0028CA +:10E0500008BF002600D00126A06890F8DD0080B13E +:10E06000FDF7F5FBA168FF2881F8DE000ED0014620 +:10E07000E81CFDF7E1FBA06890F8DE00FDF7F2FB7D +:10E080000643A06890F8DE00FF2817D1FDF781FC59 +:10E0900087F8DE0097F8C11081B108280ED12878E2 +:10E0A000E91CC0F38010FDF77BFB082818BF002691 +:10E0B00004E002BF91F8D90000280126A0784FF0B3 +:10E0C00000094FF0010B08281BD2DFE800F035AF44 +:10E0D000041A1A1A12F9002E00F06581A06890F84F +:10E0E000C800012818BF022840F05D81F6F7B0FE95 +:10E0F0007AE036B1A06890F8C800022806D001285E +:10E1000072D0F6F7A5FE4FF003088AE700217448A5 +:10E11000FFF732FBA0684FF00808C0F8E790C0F89E +:10E12000EB90C0F8EF90C0F8F390C0F8F79080F84B +:10E13000FB9080F8E79074E74FF00008002E00F0A5 +:10E140003281A26892F8C80002282DD001284BD055 +:10E1500003287FF466AFD2F8C400E978837E994241 +:10E160001BD12979C37E994217D16979037F9942DE +:10E1700013D1A979437F99420FD1E979837F9942DD +:10E180000BD1297AC37F994207D12978437EC1F305 +:10E190008011994208BF012100D0002192F8CB20C4 +:10E1A000012A26D0A9B3FBE000214D48FFF7E4FA8D +:10E1B000A06890F8051129B1491E11F0FF0180F8FF +:10E1C00005117CD1C0F8E790C0F8EB90C0F8EF9053 +:10E1D000C0F8F390C0F8F79080F8FB904FF0080873 +:10E1E00080F8E7B01DE7FFE700213D48FFF7C4FADC +:10E1F00019E0002965D100BF00F11A013848FEF787 +:10E200003FFC3748FEF75AFCA168D1F8C4104876A5 +:10E21000C6E0FFE797F8CC00082850D097F8DE104A +:10E2200081424ED0BFE04FF00308FAE6A06890F8B4 +:10E23000DB1000290CBF4FF0010B4FF0000B4FF02B +:10E240000008297805F10902C90907D0517901F0C0 +:10E25000C001402908BF4FF0010901D04FF000096B +:10E2600090F8C810032906D190F8C110002918BFF2 +:10E2700090F8CC0001D190F8DE00FDF7ADFA5FEA2E +:10E28000000A13D01021FEF730F9002818BF4FF014 +:10E29000010BB9F1000F04BFA06890F8B9A00DD030 +:10E2A00005F109015046F7F7C9FA8046A068B9F1AF +:10E2B000000F90F8B9A018BF4AF0020A02E072E01D +:10E2C0008CE06DE090F8C810032913D0F6F7C0FD7C +:10E2D000DEB3F6F71DFB50EA080003E064010020FE +:10E2E000D811002062D08DF800A06946FD48FFF7E4 +:10E2F00043FA98E7D0F8C400E978827E91421BD1B6 +:10E300002979C27E914217D16979027F914213D156 +:10E31000A979427F91420FD1E979827F91420BD155 +:10E32000297AC27F914207D12978407EC1F38011BA +:10E33000814208BF012500D0002597F8DE0008289B +:10E3400008D097F8CC10884200E02FE008BF4FF0CB +:10E35000010901D04FF00009B8F1000F05D1BBF160 +:10E36000000F04D0F6F7D4FA08B1012000E0002035 +:10E370004EB197F8CB10012903D021B955EA090114 +:10E3800001D0012100E0002108420CD0A06890F8E3 +:10E39000CB10012904BF002DD0F8C4003FF42CAFEE +:10E3A0004FF00A083DE6F6F753FD3CE7A06890F809 +:10E3B000CA00032818BF02287FF435AFB9F1000F57 +:10E3C0003FF431AFB8F1000F7FF42DAFC648694676 +:10E3D00040680090C348FFF7CFF924E7A06890F8A1 +:10E3E000DA0000283FF48DAEF6F732FDA06890F811 +:10E3F000D91000297FF417AFC0F8E790C0F8EB9070 +:10E40000C0F8EF90C0F8F390C0F8F79080F8FB9058 +:10E4100080F8F8A0B348FEF79AFCE8B301287CD056 +:10E4200002287FF400AFA0684FF0030890F8C800FE +:10E43000032814BF0020012036EA00003FF4F1ADAC +:10E44000A84D1820E97811F03F0F3FF4EAAD297983 +:10E4500088437FF4E6AD04212846FEF7C9FB064653 +:10E46000A06890F8E20002F0CCF80146304600F0D7 +:10E47000B5FE00283FF4D5AD002202212846FFF763 +:10E4800072FA2846FEF763FC0146A06880F8E610A1 +:10E490003188A0F8E31000E005E0B17880F8E510DD +:10E4A0004FF00408BDE5002E3FF4BDAEA06890F823 +:10E4B000C810012918BF02297FF4B5AE894DE9784B +:10E4C00011F03F0F1CBF297911F0020F05D011F098 +:10E4D000010F18BF4FF0010901D14FF000094FF0B3 +:10E4E0000008B9F1000F52D028780027C609012191 +:10E4F0002846FEF77DFB36B1407900F0C000402889 +:10E5000008BF012600D00026A06890F8C810032993 +:10E5100008D190F8C110002900E0AEE018BF90F8D3 +:10E52000CC0001D190F8DE00FDF756F95FEA000853 +:10E530000CD01021FDF7D9FF46B101212846FEF786 +:10E5400057FB01464046F7F779F90746A068002EC9 +:10E5500090F8B98018BF48F00208E87810F03F0F33 +:10E560001CBF287910F0020F0ED02846FEF7B3FA30 +:10E57000824601212846FEF73BFB5146F6F7B8F9E3 +:10E58000002818BF012000D1002038435FD0E87870 +:10E5900010F03F0F1EBF297911F0100F11F0080F76 +:10E5A00041D004212846FEF723FB0646A06890F8D8 +:10E5B000E20002F026F80146304600F00FFEA0B15E +:10E5C000424600212846FFF7CEF94648FEF7BFFB3A +:10E5D0000146A06880F8E6103188A0F8E310B17811 +:10E5E00080F8E5104FF004081BE5A06890F8E20001 +:10E5F00001287FF418AEE87810F03F0F1CBF28798F +:10E6000010F0010F3FF40FAEB9F1000F04D100215B +:10E610002846FEF7D7FE06E68DF8008069462846B4 +:10E62000FEF7D0FEFFE510F03F0F1CBF297911F077 +:10E63000100F7FF4F8AD10F03F0F1CBF287910F0D9 +:10E64000010F3FF4F0ADB9F1000FE5D1DFE7A068AD +:10E6500090F8CA00032818BF02287FF4E4AD002E0A +:10E660003FF4E1AD002F7FF4DEAD1F48694600683E +:10E6700000902846FEF7A6FED5E5002E3FF4D3AD68 +:10E68000184D1820E97811F03F0F3FF4CCAD2979EF +:10E6900088437FF4C8AD04212846FEF7A9FA064650 +:10E6A000A06890F8E20001F0ACFF0146304600F0AF +:10E6B00095FD00283FF4B7AD002201212846FFF761 +:10E6C00052F92846FEF743FB0146A06880F8E610A1 +:10E6D0003188A0F8E310B17880F8E5104FF0040815 +:10E6E0009FE40000D8110020C84802002DE9F04145 +:10E6F000FD4CA0680078002818BFFFDF0025A06847 +:10E7000001278570D0F8C4100A8882804A88428325 +:10E710008A888283C988C18380F82050F34990F8A1 +:10E72000DB20A1F59A764AB10A78C2F38013CA1C9D +:10E7300023B1527902F0C002402A33D090F8DC2095 +:10E7400042B111F8032BC2F380121AB1497911F0CA +:10E75000C00F27D00E3005F0CFFEA06890F8DD0086 +:10E7600018B1F5F7A6FE012824D0A068D0F8C4108F +:10E770004A7EC271D1F81A208260C98B81814561BD +:10E780000583A0680770D0F8C42090F80A1182F8B9 +:10E790005710D0F8C4000088F2F73CFABDE8F04109 +:10E7A000F1F7D2BED6F83711C0F80E10B6F83B110B +:10E7B0004182D2E7F5F7C0FEA16801F10802C91D48 +:10E7C000FDF71CF8002808BFFFDFA068C17941F001 +:10E7D0000201C171D6F80F114161B6F8131101831E +:10E7E000CFE72DE9F84FC04C0546FF21A068002770 +:10E7F0004FF0010980F8DE1090F8C800BA460128F1 +:10E8000018BF022802D0032818BFFFDF28004FF0EE +:10E81000040B4FF07F08B54EA6F1280500F04B81A0 +:10E820002846FEF73DFA28B92846FEF793FA002855 +:10E8300000F04181A06890F8E000082880F038815D +:10E84000DFE800F0FEFEFE04080CCF7BFFF7CEFBF6 +:10E8500000F0C5B800F093FD00F0C1B8A448FEF781 +:10E8600004F92071E878717A88421CD12879B17A4C +:10E87000884218D16879F17A884214D1A879317B1D +:10E88000884210D1E879717B88420CD1287AB17B1B +:10E89000884208D128783178C0F38010B0EBD11FBE +:10E8A00008BF012500D00025F6F7D2FA8E48F6F70A +:10E8B00034FC002808BF84F80080F6F719FC2079A2 +:10E8C000042840F04D81002D00F04A81CDF800A0D1 +:10E8D000A2688748694692F8D93053B3064692F841 +:10E8E0006600002840F03C8102F1680582F872B0B1 +:10E8F0006932A91C304600F016FC05F10B013046C8 +:10E90000FEF73DF9C0B228721F2884BF1F2028726D +:10E91000207809357F2808BFFFDF2078287084F829 +:10E920000080A06880F86690062002F019F800F0D8 +:10E9300017B9FEF747FD00F013B903276A48F6F749 +:10E94000ECFB002808BF84F80080F6F7D1FB68488C +:10E95000FEF78BF880466648FEF7F9F9B8F1080F24 +:10E9600008BF00283AD1E978032011F03F0F35D0D5 +:10E970002979884332D100215D48FEF739F9062212 +:10E9800006F1090105F0E8FB40BB5948FEF796F88F +:10E9900080465648FEF79FF880451FD10121544814 +:10E9A000FEF726F90622F11C05F0D6FBB0B9504857 +:10E9B000FEF791F880464D48FEF780F880450DD16E +:10E9C000F6F768FBF6F747FBF6F742FAF6F7ABFA0D +:10E9D0000227FFF78BFE042001F0C2FF38460746EE +:10E9E000B2E0F6F735FA4048F6F797FB002808BF83 +:10E9F00084F80080F6F77CFB3D48FEF736F80746C2 +:10EA00003B48FEF7A4F9072F08BF00284FD1E9784B +:10EA1000012011F03F0F4AD02979884347D10021C6 +:10EA20003348FEF7E5F8062206F1090105F094FBEC +:10EA300000283CD12E48FEF741F805462B4800E05F +:10EA400036E0FEF748F8854231D1A06890F804110D +:10EA500029B3B0F8082190F80611012A05D9520807 +:10EA6000A0F8082108BFA0F80891012914BF0029C7 +:10EA70000D21C943C1EBC10202EB011190F8052140 +:10EA8000D24302EB8203C3EB82121144B0F8082197 +:10EA9000890CB1FBF2F302FB131180F8051180F829 +:10EAA000049169461248CDF800A0FEF78BFC57E0B0 +:10EAB000FFDFBDE8F88FA06890F8E000082843D297 +:10EAC000DFE800F0424242041F2E3F350648F6F7C9 +:10EAD00024FB002808BF84F80080F6F709FBA06833 +:10EAE00090F8DD0050B105E0640100200012002024 +:10EAF000D8110020F6F7ECFAF5F7BBFCF6F7A8F909 +:10EB00002EE0FE48F6F709FB002808BF84F80080D5 +:10EB1000F6F7EEFAA06890F8DD000028EED0E2E704 +:10EB2000F648F6F7FAFA38B984F8008004E0F348BA +:10EB3000F6F7F3FA0028F7D0F6F7DAFAF6F788F9DD +:10EB40000EE000F02FFE0BE00C2F80F01982DFE8C2 +:10EB500007F006FDFC07FBFAFAFA0BF94FBBA8E732 +:10EB6000BDE8F84FFEF7A5BE00220121022001F00A +:10EB700051FD002800F04181E149A1F12800FDF795 +:10EB8000ADFFA068DE4E90F8B9103046FDF78DFF5E +:10EB9000A06800F1BA013046FDF76BFFA06890F85D +:10EBA000DB10C1B190F8C810032906D190F8C1104C +:10EBB000002918BF90F8CC0001D190F8DE00FCF7D6 +:10EBC0003FFF050007D001213046FDF76EFF2946C3 +:10EBD0003046FDF74EFFCA48F6F7B6F90121084660 +:10EBE000F6F7B3FAA168082081F8E000BDE8F88FD5 +:10EBF000A06890F8E21090F8E2100022032001F0E3 +:10EC000009FD00287ED0BF4F0A2087F8E0000120D0 +:10EC100001F0A6FE07F59A71A1F12800FDF75EFF4D +:10EC2000A06807F59A7890F8B9104046FDF73DFFC7 +:10EC3000A06800F1BA014046FDF71BFFA06890F8FC +:10EC4000DB10C9B190F8C810032906D190F8C110A3 +:10EC5000002918BF90F8CC0001D190F8DE00FCF735 +:10EC6000EFFE5FEA000907D001214046FDF71DFFD6 +:10EC700049464046FDF7FDFEA268A149D2F8C4000E +:10EC8000C08AC875000A0876D2F8C400407DB07505 +:10EC90000846F6F759F99A48D7F8C41020230278A5 +:10ECA000497B22F0200203EA411111430170D7F899 +:10ECB000C4002A78417BC2F340121140417397F897 +:10ECC0000B01D7F8C4106FE0A06890F8E21090F83C +:10ECD000E2100022052001F09DFC98B1894D0B2027 +:10ECE00085F8E000022001F03BFE05F59A71A1F1E4 +:10ECF0002800FDF7F3FEA06805F59A7790F8B910A3 +:10ED0000384600E079E0FDF7D0FEA06800F1BA01D6 +:10ED10003846FDF7AEFEA06890F8DB10F9B190F828 +:10ED2000C810032906D190F8C110002918BF90F827 +:10ED3000CC0001D190F8DE00FCF782FE5FEA00080B +:10ED40000DD004E034E01BE18EE085E07FE001219E +:10ED50003846FDF7AAFE41463846FDF78AFEA2680E +:10ED60006749D2F8C400C08AC875000A0876D2F88C +:10ED7000C400407DB0750846F6F7E6F8D5F8C40043 +:10ED800080F80D90A06890F8E230012296210020D2 +:10ED9000F5F790FF5A48017821F020010170A06832 +:10EDA000D5F8C41090F80B0181F85600BDE8F88F33 +:10EDB000A06890F8E21090F8E2100022042001F020 +:10EDC00029FCD0B14E49A1F12800FDF787FEA068CB +:10EDD0004B4E90F8B9103046FDF767FEA06800F181 +:10EDE000BA013046FDF745FEA06890F8DB10E9B1A6 +:10EDF00090F8C810032904D00AE0BDE8F84F00F0ED +:10EE0000CBB990F8C110002918BF90F8CC0001D1FF +:10EE100090F8DE00FCF714FE050007D00121304613 +:10EE2000FDF743FE29463046FDF723FE3448F6F74A +:10EE30008BF8A06890F8E230012296210020F5F7C7 +:10EE400039FFA168092081F8E000BDE8F88FA068CB +:10EE500080F8E090BDE8F88FA068022180F8049166 +:10EE600080F8E010BDE8F88FA56815F8E31F11F0F1 +:10EE7000800F0CBF1E204FF49670B5F80120C2F32E +:10EE80000C0212FB00F6C80908BF4FF01E0906D09D +:10EE9000002806BFFFDF4FF000094FF49679A878ED +:10EEA000400908BF012703D0012814BF002702270B +:10EEB000A06890F8E20001F0A4FBA6EB0008287817 +:10EEC00008EB0906C0F38010002808BF4FF4FA7A57 +:10EED00005D006BFFFDF4FF0000A4FF0320A0948A5 +:10EEE00090F8FC90B9F10C0F28BFFFDF0648074AE5 +:10EEF00030F819000AEB00010AE00000640100206C +:10EF000000120020CC100020DC4802003F420F001D +:10EF100001FB0620511CB0FBF1F000F120094E442A +:10EF2000F6F709F8287800F03F052846F5F732FD96 +:10EF3000A06880F8E15039462520F5F738FC012219 +:10EF4000A8EB09013B461046F5F7B4FEFE48F5F77D +:10EF5000FBFF00213046F6F743F8A06880F8E27026 +:10EF6000F6F7D0F8A06890F8DD0020B1F5F76DFA5B +:10EF70005020F6F79BF8A06880F8E0B0BDE8F88F65 +:10EF8000FFDFBDE8F88FF14810B5806890F8E00029 +:10EF90000C285FD2DFE800F05E5E5E5E5E5E5E5E65 +:10EFA0000613472DE848F5F7CFFFF6F7ABF8002139 +:10EFB0009620F6F715F8E5490520896830E0E24823 +:10EFC000F5F7C2FFE14CA06890F8E23001229621EB +:10EFD0001046F5F76FFEA06890F8E2000021962039 +:10EFE000F5F7FEFFF6F78EF8A168062081F8E0003D +:10EFF00010BDD548F5F7A8FFD44CA06890F8E230D2 +:10F00000012296211046F5F755FEA06890F8E2001F +:10F0100000219620F5F7E4FFF6F774F8A1680720C1 +:10F0200081F8E00010BDF6F735F8F6F714F8F5F7BB +:10F030000FFFF5F778FFC5480121806880F80411BB +:10F04000022180F8E010FFF751FBBDE810400320DB +:10F0500001F086BCFFDF10BD70B5BC4CA06890F815 +:10F06000E0007F25082828BF70BDDFE800F03F3FA3 +:10F070003F172304390AB548F6F74FF830B9257021 +:10F0800004E0B248F6F749F80028F8D0F6F730F86F +:10F09000F5F7DEFEBDE87040FEF70BBCAB48F6F7B7 +:10F0A0003CF8002808BF2570F6F722F8BDE870404C +:10F0B00000F072B8A548F6F730F8002808BF2570B0 +:10F0C000F6F716F8A06890F8DD0018B1F6F700F82A +:10F0D000F5F7CFF9F5F7BCFEBDE87040FEF7E9BBE8 +:10F0E00000F060FBBDE87040FEF7E3BB70BD70B59B +:10F0F000964C06460D46012909D0A06890F8E230EA +:10F1000090F8E2203046BDE8704001F0E9BDF5F727 +:10F1100011FBA16891F8E220034629463046BDE87C +:10F12000704001F0DDBD70B50646884814460D46B6 +:10F13000806890F8DD0018B1F5F7BBF901280ED012 +:10F140003046FDF7BBFC20703046FDF78EFC0728EB +:10F1500013D229463046BDE87040FDF791BCF5F763 +:10F16000EBF92A462146FCF749FB002808BFFFDFE0 +:10F17000207840F00200207070BD3046FDF775FC2D +:10F18000072818BF70BD00213046FDF731FD01682A +:10F1900029608088A88070BD10B5F5F77BFFF5F772 +:10F1A0005AFFF5F755FEF5F7BEFE684CA06890F8DB +:10F1B000DD0038B1F5F78CFFF5F75BF9A1680020A9 +:10F1C00081F8DD00A068012180F80411022180F897 +:10F1D000E010BDE81040002001F0C2BB2DE9F04175 +:10F1E000044680780222B2EB501F26D00D462178CB +:10F1F00011F0800F0CBF1E204FF49670B4F8012060 +:10F20000C2F30C0212FB00F6C80908BF1E2105D08C +:10F21000002806BFFFDF00214FF49671701BA27813 +:10F22000520908BF012703D0012A14BF0027022773 +:10F23000B0F5877F28BFAE4202D20020BDE8F08142 +:10F2400045182078C0F38010002808BF4FF4FA76E4 +:10F2500003D006BFFFDF002632263D4890F8FC4071 +:10F260000C2C28BFFFDF3B483B4A30F81400311814 +:10F2700001FB0520511CB0FBF1F020300544334860 +:10F28000806890F8E200F6F7B6F904463846F6F7DB +:10F29000B2F94FF47A7184423ABF001B00F2E730B2 +:10F2A000201AB0FBF1F034BF42192A1A3946BDE8E2 +:10F2B000F041012001F0AEB970B50D460446FDF7EE +:10F2C000AFFB032D55D0052D18BF70BD052120467D +:10F2D000FDF7ABFB1D4DA868D0F8C40000F10E018E +:10F2E0002046FDF760FCA868D0F8C40000F11201C8 +:10F2F0002046FDF75CFCA868D0F8C410497DA175D4 +:10F30000D0F8C410C98AE175090A2176D0F8C41072 +:10F3100049886176090AA176D0F8C4108988E17617 +:10F32000090A2177D0F8C410C9886177090AA17742 +:10F33000D0F8C40000F108012046FDF756FCA8688B +:10F34000D0F8C400017E09E0D8110020640100203B +:10F35000CC100020DC4802003F420F002046FDF7A1 +:10F360002CFCA86890F8FC102046BDE87040FDF722 +:10F370002EBC2046BDE870400321FDF756BB2DE9A9 +:10F38000F84FFD48F5F7C9FEFB4C002804BF7F206D +:10F390002070F5F7ADFEA06890F8D900002818BFDE +:10F3A000FFDFF648FDF761FBDFF8D083E0704FF038 +:10F3B000000998F803004D4610F03F0F1CBF98F865 +:10F3C000040010F0080F14D0EC48FDF7C0FC70B139 +:10F3D000012802D002280AD00BE098F8030010F0B0 +:10F3E0003F0F1CBF98F8040010F0010F01D04FF040 +:10F3F0000109A06890F8DD0018B1F5F769FEF5F78E +:10F4000038F898F803002E4637464FF0000A10F0FF +:10F410003F0F1CBF98F8040010F0020F43D0A06803 +:10F42000DFF858A3002690F8DB0000280CBF012766 +:10F4300000279AF800000121C5095046FDF7D8FBC6 +:10F4400035B1407900F0C000402808BF012500D048 +:10F450000025A06890F8C810032906D190F8C110C3 +:10F46000002918BF90F8CC0001D190F8DE00FCF71D +:10F47000B3F95FEA000B0FD01021FDF736F8002832 +:10F4800018BF012745B101215046FDF7B1FB0146E8 +:10F490005846F6F7D3F90646A068002D90F8B9A0B3 +:10F4A00018BF4AF0020AE0784FF0030B072875D125 +:10F4B000B248FDF74CFC002800F0F280012803D090 +:10F4C000022800F031819FE0009700270321AB481C +:10F4D000FDF78EFBB9F1000F7ED0A16891F8E7200F +:10F4E000012A79D1427891F8E9301209B2EB131F61 +:10F4F00072D10088B1F8E810C0F30B00C1F30B0122 +:10F50000884269D19D48FDF722FCA16891F8E62068 +:10F51000904261D191F8C800012818BF022802D09A +:10F5200003283CD0B9E0F5F793FC98F8030010F0FD +:10F530003F0F1CBF98F8040010F0020F17D08F4F38 +:10F540003846FDF7C8FA804601213846FDF750FBE2 +:10F550004146F5F7CDF9002818BF012030430BD004 +:10F560008DF800A069468548FDF72CFF14E00021C6 +:10F570008248FDF727FF0FE0A06890F8CA00032833 +:10F5800018BF022808D13DB136B97D486946806868 +:10F5900000907A48FDF716FF03277EE034E0002153 +:10F5A0007648FDF725FBA1680622D1F8C4101A3170 +:10F5B00004F0D2FD50B97148FDF780FAA168D1F886 +:10F5C000C410497E884208BF012500D0002598F864 +:10F5D000030010F03F0F00E05CE01CBF98F804004F +:10F5E00010F0020F01D0CEB127E0A06890F8CB1048 +:10F5F000012901D015B10CE05DB937E090F8DE10BB +:10F6000090F8CC00814204D0F5F722FC5846BDE8C2 +:10F61000F88FA06890F8E2000B273EE0009870B1E8 +:10F62000564E3046FDF757FA074601213046FDF7A2 +:10F63000DFFA3946F5F75CF908B1012200E0002253 +:10F64000A06890F8CB10012907D041B92DB990F8E6 +:10F65000DE3090F8CC00834201D1012000E0002090 +:10F66000024217D0012908BF002DD2D10021434802 +:10F67000FDF7BEFAA1680268D1F8C410C1F81A20DB +:10F680008088C8833D48FDF719FAA168D1F8C410F5 +:10F690004876BEE7F5F7DCFB03273846BDE8F88F70 +:10F6A000F5F7D6FB03213548FDF7A2FAB9F1000FB3 +:10F6B00036D0A16891F8E7206ABB427891F8E9302A +:10F6C0001209B2EB131F2BD10088B1F8E810C0F378 +:10F6D0000B00C1F30B01884222D12848FDF737FB0C +:10F6E000A16891F8E62090421AD191F8C80001284B +:10F6F00018BF022814D198F8030010F03F0F1CBF68 +:10F7000098F8040010F0020F06D08DF800A06946AA +:10F710001A48FDF757FE03E000211848FDF752FE96 +:10F720005846BDE8F88F00BFF5F792FBA06890F847 +:10F73000C80003281CD01148FDF709FBA16891F807 +:10F74000E620904214D198F80320092012F03F0FD0 +:10F750000ED098F8042090430AD1B9F1000F07D0D9 +:10F7600091F8C80002280DD000210448FDF72AFEB8 +:10F770000320BDE8F88F000064010020D8110020AC +:10F78000C848020091F8050128B1401E10F0FF00A2 +:10F7900081F80501ECD1524601212348FEF7E3F838 +:10F7A0000920E6E710B5F5F753FB2048F5F7B5FC5F +:10F7B0001E4C002804BF7F202070F5F799FCA0683C +:10F7C00090F8041119B1002180F8041110BDB0F8AF +:10F7D000082190F80611FF2A0AD24FF6FF7303EAB8 +:10F7E0004202A0F80821FF2A84BFFF22A0F80821C6 +:10F7F000012914BF00290D21C943C1EBC10202EB4D +:10F80000011290F80511C94301EB8103C3EB81118B +:10F810001144B0F80821890CB1FBF2F302FB13117B +:10F8200080F80511CFE70000D81100206401002006 +:10F830002DE9FF4F07460C46488881B040F2E2416F +:10F8400048430090E08A002600FB01FB94F8640026 +:10F8500091460D2818BF0C281FD024281EBF94F8ED +:10F86000650024284FF0000A17D0049818B1012130 +:10F87000204602F0B2FB94F8540094F8558094F8B6 +:10F88000D010054661B101296DD0022952D003295B +:10F8900018BFFFDF67D000F0D5B84FF0010AE4E7EA +:10F8A000B9F1000F08BFFFDFFD4EB068002808BFA8 +:10F8B000FFDF94F85410FB4890F82400FDF79DF802 +:10F8C000009094F85400F5F7A5FE00F2E7314FF4EC +:10F8D0007A79B1FBF9F1F24880680E1894F8540077 +:10F8E000F5F798FE014694F85400022804BFEE484C +:10F8F0004FF47A720DD0012804BFEC484FF4C8626F +:10F9000007D0042807BFEA4840F69802E94840F6C5 +:10F91000E4421044084400F2E731B1FBF9F10098E9 +:10F92000401A00EB0B01DE48406930440844061DD4 +:10F93000012015E0DA48A9F101018068084308BFF9 +:10F94000FFDFDD48B9F1000F006800EB0B0606D0C1 +:10F95000D348806800F22230B04288BFFFDF032026 +:10F9600084F8D0006DE094F86410009E24291EBF36 +:10F9700094F86520242A25294FD1B4F85810B4F8FA +:10F98000F020891A491C09B2002946DB94F8F210CC +:10F99000002942D00D4694F8F310002918BF88467C +:10F9A000022804BFC0494FF47A700DD0012804BF6B +:10F9B000BE494FF4C86007D0042807BFBC4940F6D1 +:10F9C0009800BC4940F6E4400144022D04BFB6480B +:10F9D0004FF47A720DD0012D04BFB4484FF4C862C1 +:10F9E00007D0042D07BFB24840F69802B14840F650 +:10F9F000E4421044814208D9081A00F5FA714FF424 +:10FA00007A70B1FBF0F0064407E0401A00F5FA7195 +:10FA10004FF47A70B1FBF0F0361AB9F1000F10D044 +:10FA2000DFF87C92D9F8080020B9B9F80200002864 +:10FA300018BFFFDFD9F8080000F22230B04288BFBB +:10FA4000FFDF06B9FFDF3146D4F8D400F2F7E9FD55 +:10FA5000C4F8D400B860002038704FF0010987F86E +:10FA60000490204602F0A6FBAAF10101084208BF5B +:10FA700087F8059006D094F8D00001280CBF02202A +:10FA8000032078714046D4F824B0F5F7B4FD014660 +:10FA9000022D04BF84484FF47A720DD0012D04BFAB +:10FAA00082484FF4C86207D0042D07BF804840F653 +:10FAB0009802804840F6E4421044084400F23F6156 +:10FAC0004FF47A70B1FBF0F0584400F5C970F8605B +:10FAD000049830EA0A0004BF05B0BDE8F08F314653 +:10FAE0003846FCF724FE85B2204602F063FBA842AC +:10FAF0000FD8054687F8059006FB05F1D4F8D40029 +:10FB0000F2F78FFDB86031463846FCF710FE284406 +:10FB100085B22946204602F060FAB868C4F8D400DD +:10FB200005B0BDE8F08F2DE9F0430446634885B089 +:10FB30000D4690F80004DFF88891400999F8001408 +:10FB40004909884218BFFFDFDFF85481002708F118 +:10FB50004406082D80F00E81DFE805F0046872721B +:10FB60006DFEFEB6202C28BFFFDF36F814000621FC +:10FB7000F0F71EFF050008BFFFDF202C28BFFFDFC6 +:10FB800036F814002988884218BFFFDF95F8D000A6 +:10FB9000002808BFFFDF284601F02EFFC8F80870D4 +:10FBA000A8F8027029460020C8F81470FCF710FE6F +:10FBB00000F19804686AA04225D995F85500F5F738 +:10FBC0001AFD014695F85400022804BF36484FF448 +:10FBD0007A720DD0012804BF34484FF4C86207D0B0 +:10FBE000042807BF324840F69802324840F6E44203 +:10FBF000104408444FF47A7100F23F60B0FBF1F119 +:10FC0000686A0844071B29460020C8F80C70FCF7F6 +:10FC1000DFFD698840F2E24251439830081AA0F2B1 +:10FC20002230C8F8100005B0BDE8F08305B0BDE88B +:10FC3000F04302F0ADB805B0BDE8F043F5F7A9BA5E +:10FC400099F8140D1F49400991F800144909884298 +:10FC500018BFFFDF202C28BFFFDF36F81400062175 +:10FC6000F0F7A6FE050008BFFFDF202C28BFFFDF4E +:10FC700036F814002988884218BFFFDF00220123CC +:10FC800029466846FFF7D4FD95F8DA006946F3F790 +:10FC900007FA002808BFFFDF05B0BDE8F0830000C9 +:10FCA000281200204412002068360200A22402001C +:10FCB000D0FB010030D301007401002001E000E01E +:10FCC0000BE000E019E000E0202C28BFFFDF36F851 +:10FCD00014000621F0F76CFE050008BFFFDF202CA2 +:10FCE00028BFFFDF36F814002988884218BFFFDFDD +:10FCF00095F8D000042818BFFFDF85F8D07095F87C +:10FD0000DA404FF6FF79202C28BFFFDF26F8149049 +:10FD100095F8DA00F2F75DFF002808BFFFDF20202A +:10FD200085F8DA00D5F8E000002804BFD5F8DC003B +:10FD3000C8F8180008D0D5E9391211448269114475 +:10FD40008161D5E93701C860D5F8DC0000281CBF07 +:10FD5000D5F8E010016100E00CE004D1D5F8E00036 +:10FD6000002818BF8761FE48007805B0BDE8F04361 +:10FD7000ECF70CB8FFDF05B0BDE8F0832DE9F05FCC +:10FD8000F84E07468B46F08B7568401CF083307840 +:10FD90004FF00008002808BFFFDF07D0DFF8C89346 +:10FDA00004282ED0052818BFFFDF5BD05846FEF789 +:10FDB00018F9040008BFFFDF29463069F2F731FC6B +:10FDC000B86087F800800120387194F8C9000228D3 +:10FDD00008BFE64807D0012808BFE54803D004283B +:10FDE0000CBFE448E4484FF47A7100F2E140B0FB04 +:10FDF000F1F0B168FA300844F860307804287DD119 +:10FE000083E0002AD2D0D6F810A0D9F8184034B335 +:10FE1000A146E468002CFBD1B9F1000F1FD099F87E +:10FE20000000002808BFFFDFD9F81410D9F804003B +:10FE300001445046F3F7FAFB002807DA291A491E55 +:10FE400091FBF5F101FB05042A4604E090FBF5F176 +:10FE500001FB15042A46944288BFFFDF00E04446B8 +:10FE60002546A3E7002AA1D0B569002D08BFFFDF12 +:10FE70000024D5F8E420D9F818002346611E58B1B3 +:10FE80008369934228BF994284BF194604460346BA +:10FE9000C0680028F4D104B91C46C5F8E040D0354C +:10FEA000002C04BFC5F80C80C9F8185005D0E068D4 +:10FEB000E560E860002818BF0561D5F81090C5F826 +:10FEC0001880B9F1000F0ED0D9F8180048B1D5F854 +:10FED00014A0504538BFFFDFD9F81800A0EB0A0086 +:10FEE000A861C9F81880002C08BFC6F8208009D086 +:10FEF0002078002808BFFFDF616900E00AE0606841 +:10FF00000844306240F6B83550E7F08B0A2838BF15 +:10FF1000032000D302207871F08B012807D93846DE +:10FF20007168FCF704FC0146F08B0844F083B86864 +:10FF30003061BDE8F09F2DE9F04107468F4884B05D +:10FF40000D4690F80004DFF83882400998F8001454 +:10FF50004909884218BFFFDF01200026082D814C87 +:10FF600080F0BB80DFE805F004718C8C87B9B9A5FF +:10FF700060732073607800281CBF04B0BDE8F08176 +:10FF800079488660466126733846FEF72AF80500F0 +:10FF900008BFFFDF95F8C900022804BF79494FF474 +:10FFA0007A720DD0012804BF71494FF4C86207D09E +:10FFB000042807BF6F4940F69802734940F6E442AF +:10FFC00011444FF47A7201F2E731B1FBF2F1A26809 +:10FFD0008C18F5F704FB024695F8C900082808BFFD +:10FFE000082127D004280CBF0221002322D0022898 +:10FFF0000CBF182128211944042816BF08280F23F4 +:020000040002F8 +:1000000025235B1D082808BF402007D0042808BF0F +:10001000102003D002280CBF0420082013FB00107E +:10002000801A201AFDF76DFD002818BFFFDF04B00D +:10003000BDE8F08101EB410101F12803082814BF5C +:1000400004284FF4A871D6D0D1E7617851B1207B54 +:10005000002808BFFDF77AFF667304B0BDE8F041E1 +:10006000F2F7E2BCA073FDF70EFE002818BFFFDF19 +:1000700004B0BDE8F08104B0BDE8F041F5F789B8FF +:1000800098F8140D4149400991F800144909884233 +:1000900018BFFFDF002239466846FFF76FFE69464A +:1000A0003846F2F7FDFF002808BFFFDF04B0BDE8C7 +:1000B000F0812078052818BFFFDF207F002808BFC7 +:1000C000FFDF26772670207DF2F783FD002808BF2A +:1000D000FFDF267504B0BDE8F081FFDF04B0BDE8A6 +:1000E000F0812DE9F0411F4C0026207804281FBF25 +:1000F000207805280C20BDE8F08101206070607B2D +:100100000025A8B1EFF3108010F0010F72B60CBFFC +:1001100000270127607B00281CBFA07B002805D09A +:10012000FDF714FF6573A573F2F77EFC2FB903E0AA +:10013000207DF3F7C7F800E062B6207DF3F70FFBF0 +:10014000207F28B125772078052818BFFFDF0C26EF +:1001500065702570207DF2F73CFD002818E0000056 +:1001600070010020441200202812002004360200F2 +:10017000A2240200D0FB0100C0D4010001E000E095 +:100180000BE000E06836020030D3010019E000E027 +:1001900008BFFFDF25753046BDE8F0812DE9F04F3F +:1001A000FD4883B00078002818BFFFF79AFF0120B0 +:1001B000DFF8E88388F8000069460620F0F781FB45 +:1001C000002818BFFFDF00274FF6FF7934E00298C0 +:1001D00000281CBF90F8D01000292DD00088484579 +:1001E0001CBFDFF8BCA34FF0200B3BD00621F0F77B +:1001F000DFFB040008BFFFDF94F8DA00F3F7AFFA83 +:1002000084F8D07094F8DA504FF6FF76202D28BF8E +:10021000FFDF2AF8156094F8DA00F2F7DAFC00281C +:1002200008BFFFDF84F8DAB069460620F0F749FB23 +:10023000002818BFFFDF10E06846F0F720FB002819 +:10024000C5D00FE0029800281CBF90F8D0100029FC +:1002500003D000884845C9D104E06846F0F70FFB99 +:100260000028EFD088F80070C8F8187003B000209C +:10027000BDE8F08F10B5CB4C60B101280CBF40F643 +:10028000C410FFDF06D0A06841F66A01884228BF8B +:10029000FFDF10BDA060F6E710B5DFF808C3BE4C65 +:1002A00000238CF80000237063702377237363733B +:1002B000A3732020A3612075A4F11C004370423079 +:1002C00010214FF6FF72428020F8042F491EFAD108 +:1002D000CCF80830DCF8080041F66A01884228BFF3 +:1002E000FFDFFFF75BFF40F6C41101206160F5F707 +:1002F00082F900F2E7314FF47A70B1FBF0F042F28C +:1003000010710844A0606168A1F21731884298BF5B +:100310000146A16010BDF0B59F4C054685B0207820 +:1003200000281EBF0C2005B0F0BD95F8546095F86C +:1003300055006F6AF5F75FF9022E04BF9A494FF432 +:100340007A720DD0012E04BF98494FF4C86207D0CD +:10035000042E07BF964940F69802964940F6E442BB +:10036000114408444FF47A7100F23F60B0FBF1F0A1 +:10037000384400F22230C5F8E400A56195F8D000B9 +:10038000002818BFFFDF0020844948610521217043 +:1003900060702077E0838848F2F7C1FB2075202841 +:1003A00008BFFFDFF2F734FC2061217D012268469F +:1003B000FFF7E4FC207D6946F2F772FE002808BFD3 +:1003C000FFDF002005B0F0BD7348007800281CBF97 +:1003D0000020704710B50620F0F784FA80F0010085 +:1003E00010BD70B56C4C05462078002818BFFFDFA3 +:1003F000287801281CBF112070BD698840F2712245 +:10040000AD88514301206160F5F7F5F800F2E7315E +:100410004FF47A70B1FBF0F040F2712105FB01005E +:10042000A0606168A1F21731884298BF01460020A0 +:10043000A16070BD10B584B008431EBF112004B088 +:1004400010BD554C207800281EBF0C2004B010BDF4 +:100450000020607004212170E0835748F2F75FFBB1 +:100460002075202808BFFFDF4C48806938B101465D +:10047000C0680028FBD111B1F2F7CAFB05E0F2F722 +:10048000C7FB40F6B831F2F7CCF82061217D01229C +:100490006846FFF773FC207D6946F2F701FE0028ED +:1004A00008BFFFDF002004B010BD70B53A4CA16951 +:1004B0000160FFF716FE002300BBA169D1F8E02020 +:1004C0005AB1D1E939C5AC449569AC44C2F818C0F9 +:1004D000D1E9372CCCF80C2005E0DFF8C0C0D1F80A +:1004E000DC20CCF81820D1F8DC20D1F8E010002A6C +:1004F00018BF116102D1002918BF8B61A36170BDC3 +:1005000026494870704770B540F2E24300FB03F59E +:1005100010460C46F5F76FF8022C04BF22494FF441 +:100520007A720DD0012C04BF20494FF4C86207D065 +:10053000042C07BF1E4940F698021E4940F6E442CB +:10054000114408444FF47A7100F23F60B0FBF1F0BF +:1005500000F2223085428CBF281A002070BD70B591 +:100560000D46064601460020FCF732F9044696F88F +:100570005500F5F740F8014696F85400022804BFEC +:10058000094A4FF47A7020D0012804BF074A4FF47B +:10059000C8601AD0042811E044120020281200205C +:1005A0006C1200207001002068360200A2240200B4 +:1005B000D0FB010030D3010037FF010007BFFC4A28 +:1005C00040F69800FB4A40F6E440104408444FF4DB +:1005D0007A7100F23F60B0FBF1F0718840F2712255 +:1005E0005143C0EB4100A0F22230A54234BF214666 +:1005F0002946814203D2A5422CBF2846204670627C +:1006000070BD10B5F4F7EBFFEB498A684968511AE1 +:10061000084410BD2DE9F74FE74A00231826D2F809 +:1006200008B028270BF198044FF004084FF0100988 +:100630004FF0080A4FF4C8724FF4BF754FF0400CEA +:1006400006287CD2DFE800F0034A21472465142005 +:10065000042912D0082909D02A20022911D010FB20 +:100660000A40002328211944441877E010FB0C406D +:100670004FEA0C034FF4A871F5E710FB09402E2355 +:10068000F8E710FB08401821EDE704F5317465E048 +:10069000082904BF4FF4BA6140200CD0042915D0BA +:1006A000022903BF03F15C01324604203A461CBF15 +:1006B00003F1B001082000EBC00000EB400002EBAA +:1006C00040000844204400F19C0447E02A4640F2E0 +:1006D0008E211020EFE704F5B0743FE0082908BF31 +:1006E00040200CD0042904BF2A46102007D002293C +:1006F00007BF03F11802042003F128020820C0EB11 +:10070000C00000EB400002EB4001029858440C1876 +:1007100024E0082904BF4FF4356140200CD004299F +:1007200016D0022903BF324603F1B401042003F5B9 +:10073000B0711CBF3A46082000EB400300E00CE01B +:1007400003EB001010440844204400F19C0405E031 +:100750002A4640F2EE311020EEE7FFDF974880682E +:10076000A0428CBF0120002003B0BDE8F08F10B57F +:10077000914C607828B1D4E90301A268FCF707F82E +:10078000E060D4E9020188429CBF2078002814BFB1 +:100790000020012010BD04222DE9F04F884E894F22 +:1007A000DFF80C82DFF80C9285B04FF47A7A0529D5 +:1007B00080F0D280DFE801F00A2B0331920080F84C +:1007C000D02005B0BDE8F04FF2F72EB904467A48C4 +:1007D0000078002818BF84F8D02004D005B0BDE808 +:1007E000F04FF2F721B90122002321466846FFF7B6 +:1007F0001FF894F8DA006946F2F752FC002808BFA7 +:10080000FFDFB4F85800401CA4F85800E6E70321C5 +:1008100080F8D01005B0BDE8F08F8346408840F2E4 +:10082000E241484368490860DBF8F800594600890E +:10083000ABF81600DBF8F80080798BF81500DBF8D0 +:10084000F8004089ABF80200DBF8F8008089ABF8CB +:100850000400DBF8F800C089ABF806000020DBF8E4 +:100860002850FBF7B5FF04469BF85500F4F7C3FE8C +:100870009BF85410022908BF4FF47A710DD001295A +:1008800004BF3E464FF4C86107D0042907BF46465F +:1008900040F698014E4640F6E4413144084400F2E7 +:1008A0003F60B0FBFAF1BBF8020040F27122504306 +:1008B000C1EB4000A0F22230A54234BF21462946B8 +:1008C000814203D2A5422CBF28462046CBF8240003 +:1008D00002208BF8D00005B0BDE8F08F83460146BA +:1008E000856A0020FBF774FF04469BF85500F4F777 +:1008F00082FE9BF85410022908BF4FF47A710DD084 +:10090000012904BF3E464FF4C86107D0042907BF40 +:10091000464640F698014E4640F6E44131440844CC +:1009200000F23F60B0FBFAF0BBF8021040F2712217 +:100930005143C0EB4100A0F22230A54234BF214612 +:100940002946814203D2A5422CBF28462046CBF837 +:10095000240005B0BDE8F08FFFDF05B0BDE8F08FE3 +:100960002DE9F043DFF864800024144D98F800105E +:1009700085B0072880F0AD81DFE800F0042A2AFC6A +:10098000FCFBFB00EC830846EBF700FA68780028D4 +:1009900040F05E81297D00226846FFF7EFF9287D4F +:1009A0006946F2F77DFB002808BFFFDF00F050B971 +:1009B000D0FB010030D30100281200204412002097 +:1009C00068360200A2240200740100207001002099 +:1009D00002280CBF01260026287DFDF702FB04003B +:1009E00008BFFFDF94F8E2103046FCF706F8DFF8A6 +:1009F000449301462869D9F80820002E024408BF14 +:100A00004FF4FC706ED094F8E20094F8E2000828ED +:100A10001EBF94F8E2000428002000F0B98000BF57 +:100A200094F8E230082B1ABF94F8E230042B4FF40C +:100A3000A87305D094F8E230022B0CBF18232823AA +:100A4000034494F8E200082808BF40200BD094F833 +:100A5000E200042808BF102005D094F8E200022824 +:100A60000CBF04200820C0EBC00C0CEB401003446A +:100A700094F8E20008281EBF94F8E2000428002041 +:100A800079D000BF94F8E2C0BCF1080F1ABF94F807 +:100A9000E2C0BCF1040F4FF4A87C08D094F8E2C087 +:100AA000BCF1020F0CBF4FF0180C4FF0280C84441F +:100AB00094F8E200082808BF40200BD094F8E20028 +:100AC000042808BF102005D094F8E20002280CBFCB +:100AD0000420082000EB400606EB00106044184498 +:100AE00000F59A7010440844061D94F8E200F4F7EB +:100AF00082FD94F8E210022908BF8F490BD094F8C8 +:100B0000E210012908BF8D4905D094F8E2100429AC +:100B10000CBF8B498B4994F8E220022A08BF4FF49E +:100B20007A720ED094F8E220012A08BF4FF4C8620E +:100B300007D094F8E220042A0CBF40F6980240F651 +:100B4000E442114408444FF47A7100F2E730B0FBFC +:100B5000F1F0A969301A40F2E2434A88D03102FB31 +:100B600003F6D9F818208A4208BF00272AD0296A3C +:100B700002E0A8E055E014E0F2F758FD002819DA89 +:100B8000311A4A1E92FBF6F202FB0607314616E0C6 +:100B900094F8E200082818BF022000EB400028303B +:100BA0003EE794F8E200082818BF022000EB40005E +:100BB000283067E790FBF6F202FB160731468F42BA +:100BC00088BFFFDFD8F80800874208D2A86940F242 +:100BD00071224188C1824A4307EB420705E040F297 +:100BE000E240B7FBF0F0A969C88294F8E210A86966 +:100BF00080F8541094F8E21080F8551005214175E2 +:100C0000C08A6FF41C71484307EB400040F6354141 +:100C1000C9F81400B0EB410F28BFFFDF05B0BDE8F5 +:100C2000F08304280CBF01260026EC830846EBF76E +:100C3000ADF80120287785F82460A8692969C0F8F3 +:100C4000D41080F8D0402978052918BFFFDF06D0DE +:100C5000F1F7EAFE6C73AC7305B0BDE8F0830028D1 +:100C600008BFFFDFA86990F8D000002818BFFFDF99 +:100C7000A86990F8DA00202818BFFFDF3248F1F7A2 +:100C80004EFFA9690646202881F8DA000F8828BFA0 +:100C9000FFDF2E4820F81670A86990F8DA002028A7 +:100CA00008BFFFDF002301226846A969FEF7C0FDE7 +:100CB000A869694690F8DA00F2F7F2F9002808BF4F +:100CC000FFDFAC61C4E705B00846BDE8F043EBF7D1 +:100CD0005DB8FFDF05B0BDE8F08316494860704796 +:100CE00070B5144D0446002904BFA86070BD4FF4D0 +:100CF0007A76012910D002291CBFFFDF70BD6888F9 +:100D0000401C68801046F4F785FC00F2E730B0FB29 +:100D1000F6F0201AA86070BD1846F4F78AFC00F2BD +:100D2000E730B0FBF6F0201AA86070BD08480078E4 +:100D3000704700002812002068360200A22402003A +:100D4000D0FB010030D3010027FB01006C12002012 +:100D500044120020F7490C28896881F8CB001ABF9B +:100D6000132818287047002211280FD0072808BF21 +:100D7000704715280AD001281ABF0028022870479A +:100D8000A1F88420012081F888007047A1F88A200A +:100D9000704770B5E74CA1680A88A1F83E2181F838 +:100DA0003C0191F85400012808BF012503D0022816 +:100DB00014BFFFDF0225A06880F8405190F855006D +:100DC000012808BF012503D0022814BFFFDF022538 +:100DD000A068012180F8415180F83A11002180F883 +:100DE0000E11E078BDE87040EAF7D0BFD14A012982 +:100DF00092681BD0002302290FD0032922D030B3E0 +:100E000001282FD0032818BF704792F864001328D8 +:100E10001CBF1628182805D1704792F8CB0000286F +:100E200008BF7047D2F8F8000370704792F8CB0003 +:100E3000012808BF704700BFD2F8FC000178491EA6 +:100E40000170704792F8CB000328EBD17047D2F8BD +:100E5000F800B2F858108288891A09B20029A8BF90 +:100E600003707047B2F85800B2F80211401A00B28D +:100E70000028E1DA70472DE9F041AE4C0026032747 +:100E8000D4F808C0012590B12069C0788CF8CA0058 +:100E900005FA00F010F4000F08BFFFDFA06880F82B +:100EA0006470A0F8846080F88850BDE8F081002369 +:100EB0009CF8652019460CF15800FBF7CEFB002882 +:100EC00004BF6570BDE8F0816078002818BFBDE8F8 +:100ED000F0812069C178A06880F8C91080F8657039 +:100EE000A0F88A6080F88C50BDE8F08170B5914C14 +:100EF00084B0207910F0010F04BF04B070BD2069E8 +:100F000000230521C578A06890F864205830FBF7CD +:100F1000A4FB002818BF062D09D020DC022D1CBF21 +:100F2000042D052D03D0607840F0080060706078D3 +:100F300000281CBF04B070BD2069C078801E162830 +:100F400080F00783DFE800F011FF89A7D52CFFFEB2 +:100F5000FF7FFDD2FFFFFFC5FCFBFAF9F8F50B2D73 +:100F60001CBF0D2D112DDED1E1E7A068002301216A +:100F700090F867205830FBF770FB002840F05C8346 +:100F80002069FCF759F8A16881F8F600072081F87C +:100F90006700002081F88C0081F8880000F04CBBCD +:100FA000A0680921002390F864205830FBF755FB16 +:100FB00018B120690079122812D0A0680A210023F4 +:100FC00090F864205830FBF748FB18B1206900798D +:100FD000142820D020690079162840F02D8324E0C1 +:100FE000A0680125002390F8642009215830FBF700 +:100FF00034FB002808BF657000F01E83607800286D +:1010000040F01A83A16881F87C0081F8880081F89B +:10101000640000F011BBA168002081F86400A1F811 +:10102000840081F8880000F035BAA06890F8641058 +:101030001F2940F00183002180F8641080F8881097 +:101040001A2000F0F7BAA06890F864100F2927D191 +:10105000002180F86910122137E0A06890F8641030 +:1010600013291DD1D0F8F81000884988814218BF93 +:10107000FFDFA068D0F8F80000F126012069FCF736 +:1010800008F8A06800F1C4012069FCF70AF81620EE +:10109000A16800F05BB9A26892F86400162802D03B +:1010A000022000F03BBAD2F8F80002F1B00300F1E0 +:1010B0001E0100220E30FBF74CFAA0680021C0E9A7 +:1010C0002811012180F86910182180F8641000F0BF +:1010D000B3BA2069FCF765F8032840F0AD822069B7 +:1010E000FCF763F801F0D0FB00F0A6BA20690079A4 +:1010F000F8E7A06890F864101A29D1D1002580F88B +:101100008D5080F88850D0F8F810008849888142C6 +:1011100018BFFFDFA068D0F8F8100D70D0F84411A8 +:101120000A78002A18BFFFDF7ED190F88E20DAB14E +:101130000AE03CE27C010020B6E181E125E1F1E03A +:1011400008E12BE09EE0A9E180F88E500288CA8079 +:10115000D0F844110D71D0F844210E211170D0F84F +:1011600044210188518010E00288CA80D0F84411DF +:101170000D71D0F8442101211172D0F844210D21C4 +:101180001170D0F84421018851800088EFF742FDAA +:10119000EFF7DAF9E078EAF7F9FDBEE0A06800239E +:1011A000194690F865205830FBF757FA50B9A068F7 +:1011B0000023082190F864205830FBF74EFA0028ED +:1011C00000F0FA816078002840F03682A06890F83C +:1011D000900010F0020F14D12069FBF765FFA168A1 +:1011E00081F891002069B0F80520A1F89220B0F8AC +:1011F0000700A1F8940091F8900040F0020081F8F7 +:101200009000A06890F8901011F0010F14D190F8A0 +:101210006520002319465830FBF71FFA002808BF45 +:10122000FFDF0121A06800E077E080F8651080F81A +:101230008C100021A0F88A10A06890F86410012991 +:1012400007D1002180F8641080F88810E078EAF770 +:101250009DFDA168D1F8F800098842888A4204BF40 +:101260000178042940F0E88100250570E078EAF76C +:101270008DFDA06890F86410002908BF80F88850A0 +:1012800000F0DAB9A0680023072190F864205830F4 +:10129000FBF7E3F9002800F08F816078002840F028 +:1012A000CB8102A92069FBF739FF9DF808000025D2 +:1012B00000F02501A06880F896109DF8091001F053 +:1012C000410180F8971080F88850D0F8F810008815 +:1012D0004988814218BFFFDFA068D0F8F8100D7070 +:1012E000D0F844110A78002A18BFFFDF15D1028810 +:1012F000CA80D0F844110D71D0F84411029A8A6066 +:10130000039ACA60D0F84421082111700188D0F8EE +:1013100044014180E078EAF739FDA06880F8645024 +:1013200000F08AB9A0680023092190F864205830A1 +:10133000FBF793F9002800F03F816078002840F027 +:101340007B81A16881F87C0081F8880081F86400C5 +:1013500000F072B9A0680023194690F86520583053 +:10136000FBF77BF9002800F027816078002840F027 +:101370006381A0680021A0F88A10012180F88C10F8 +:10138000022180F8651000F057B9A06800231946C3 +:1013900090F865205830FBF760F900287FD020696D +:1013A000FBF7A6FE002879D0A5682069FBF79CFE14 +:1013B0002887A5682069FBF793FE6887A5682069E0 +:1013C000FBF794FEA887A5682069FBF78BFEE887EA +:1013D000A06890F864101C2913BF90F84E100121EA +:1013E00080F84E10012907D090F80511002904BF9C +:1013F00090F80411002903D01E2180F8651017E031 +:101400001D2180F865100288A0F82A21028FA0F81B +:101410002C21428FA0F82E21828F00F58A71A0F82E +:101420003021C08FC88301200875E078EAF7AEFC50 +:10143000A0680021A0F88A10012180F88C10FBE040 +:10144000A06800230A2190F864205830FBF705F9C2 +:1014500018B32069FBF74CFEA8B1A5682069FBF71B +:1014600043FE2887A5682069FBF73AFE6887A568D0 +:101470002069FBF73BFEA887A5682069FBF732FED1 +:10148000E88700F0FEFEA168002081F8880081F85E +:10149000640000BF00F0C6FECEE000E059E06078D6 +:1014A00040F001006070C7E0A0680023194690F882 +:1014B00065205830FBF7D1F878B3A06890F8640045 +:1014C000232812BF2428607840F0200026D06846E8 +:1014D000F4F747F9002808BF002104D0009802A9BA +:1014E000C0788DF80800A06801AB162290F864005F +:1014F000FBF767FAA0B1A0689DF80420162180F8D8 +:10150000EC2080F8ED10192180F86510012180F899 +:101510008C100021A0F88A108EE04DE060708BE006 +:101520002069FBF700FEA0B12269107900F00701E5 +:10153000A06880F85010527902F0070280F851201C +:1015400090F80F31002B04BF90F80E31002B04D01F +:1015500022E00020FFF78FFC6EE090F855C000F10C +:1015600054038C4501BF19789142012180F87D1008 +:1015700012D00288A0F8362190F8502000F58A7128 +:1015800080F8382190F8510081F82500012081F879 +:101590002000E078EAF7FAFBA068212180F86510C6 +:1015A000012180F88C100021A0F88A1044E0A06886 +:1015B00090F864001F2801D00120AFE72069FBF7F5 +:1015C000BCFD88B32069A2680179407901F0070168 +:1015D00061F30705294600F0070060F30F210120A1 +:1015E00082F888000025A2F88450232082F8640045 +:1015F000566DD2F81001FBF79CF9F2B2C1B28A42E3 +:1016000007BFA16881F8F250A26882F8F210C6F311 +:101610000721C0F30720814219BFA16881F8F300B8 +:10162000A06880F8F35007E0FFE70120FFF723FCF4 +:101630005FF01E00FFF7ADFBA068D0E92A12491C3D +:1016400042F10002C0E92A1204B070BD2DE9F04752 +:10165000FE4D04464FF0000768780843687028790B +:1016600010F0200F2846806818BFA0F87E7004D1C3 +:10167000B0F87E10491CA0F87E1090F86A10012680 +:1016800039B990F86420002306215830FAF7E5FFB5 +:1016900058B3A88810F4006F07D0A86890F86A10B3 +:1016A000002918BFA0F876701FD1A868B0F876108E +:1016B000491C89B2A0F87610B0F878208A422CBF75 +:1016C000511A00218288521D8A4228BF80F87C600E +:1016D000B0F87610B0F87820914206D3A0F8767072 +:1016E00080F81A61E878EAF751FB287910F0600F6A +:1016F00008D0A86890F8681021B980F868600121C6 +:10170000FFF749F84FF00808002C56D168780028F8 +:1017100051D1287910F0040F0DD0A86890F864001A +:10172000032808BFFFDFA86890F86710072904BFE7 +:101730002E7080F8677001F0F7F8287910F0080F24 +:1017400019D06878B8B9A868002190F8CB00FFF7E5 +:101750004DFBA86890F8CB00FE2808BFFFDFFE21F4 +:10176000A86880F8CB1090F86710082903D10221EF +:10177000297080F86770FFF7B9FBA87810F0080FA0 +:1017800016D0A8680023052190F864205830FAF795 +:1017900064FF50B185F80180A868D0F8441108783A +:1017A0000D2808BF0020087002E00020F9F770FB48 +:1017B000A86800F0F2FF00F0AEFDA868A14600F1B5 +:1017C000580490F8F40030B9E27B00230121204650 +:1017D000FAF743FF10B1608D401C60853D21B9F1DF +:1017E000000F18D12878022808BF16200ED0012833 +:1017F00004BFA86890F8F60008D06878E8B110F047 +:10180000140F1CBF1E20207702D005E0207703E0D4 +:1018100010F0080F02D02177E67641E010F0030FB8 +:1018200003D02A202077E6763AE010F0200F08BF98 +:10183000FFDF23202077E67632E094F8300028B1ED +:10184000A08D411CA185E18D884213D294F834000B +:1018500028B1608E411C6186E18D88420AD2618D7B +:10186000208D814203D3AA6892F8F42012B9E28D48 +:10187000914203D322202077E67611E0217C31B11A +:10188000E18C814228BF84F81C80C5D206E0E08C40 +:10189000062803D33E202077E67601E0E07EA0B163 +:1018A0002773677327740221A868FEF774FFA8687E +:1018B00090F8CB10012904D1D0F8FC000178491E22 +:1018C0000170E878EAF762FA03E00021A868FEF701 +:1018D00062FFBDE8F047F3F753BF5C4A5178937855 +:1018E000194314D111460128896809D0107910F0E4 +:1018F000040F03D091F86700072808D00120704733 +:10190000B1F84800098E884201D8FEF730BF0020A8 +:10191000704770B54D4C06460D46A0883043A080F8 +:1019200016F0020F04D016F0010F18BFFFDFE560BC +:1019300016F0010F18BF256116F0020F10D0E878DD +:10194000062802D00B2837D00AE0A06890F864106F +:10195000182905D10021C0E92A11012180F86A1057 +:1019600016F0800F1CBF0820A07016F4806F08BF0F +:1019700070BDA268B2F8580091880844801DE978CB +:1019800080B2012908BFA2F8020107D0002904BFD4 +:10199000D2F8F810888001D0182915D0E9782846A7 +:1019A00001291CD009B3182918BF70BDB2F8F01076 +:1019B000BDE87040FBF7D3BBA06890F86410122913 +:1019C00008BF0021CCD1C9E792F8F210002902BF6C +:1019D00092F8F31000290020A2F8F000DEE7B2F838 +:1019E00002114172090AA97270BDD2F8F8108988F3 +:1019F0004173090AA97370BDF0B5144C85B0002677 +:101A0000A060A6806670A670054626700088F3F771 +:101A10007FFEA0680088F3F7A1FEB5F8D800A168A2 +:101A2000401C82B201F15800FAF718FC002818BFD8 +:101A3000FFDF95F8650024280ED1B5F85810B5F8E9 +:101A4000F000081A00B2002802E000007C0100202B +:101A5000A4BF6078002806D095F86400242818BF39 +:101A600025283BD119E0A06890F8F210002908BFA2 +:101A700090F8541080F8541090F8F310002908BF23 +:101A800090F8551080F855100020FFF782F985F87E +:101A90006560A16881F87D6020E0B5F85810B5F860 +:101AA000F000081A00B20028A4BF6078002815D101 +:101AB000A06890F8F210002908BF90F8541080F840 +:101AC000541090F8F310002908BF90F8551080F8D2 +:101AD00055100020FFF75DF985F86460A5F8D8601F +:101AE000A06890F8881039B1B0F88410B0F886205A +:101AF000914224BF05B0F0BD90F88C1039B1B0F818 +:101B00008A10B0F88620914224BF05B0F0BDB0F82D +:101B10008220B0F880108A4224BF05B0F0BD90F852 +:101B200068208AB3B0F87E208A4224BF05B0F0BD99 +:101B300090F8CB70FE2F00F012816846F3F7EBFDB2 +:101B4000002808BFFFDF2221009802F0B0FB03212C +:101B50000098FBF7EDF90098017821F01001017071 +:101B60003946FBF713FA192F71D2DFE807F0271F68 +:101B70001445D6D6D71971D6D7D763D6D6D6D6C9F7 +:101B8000D7D77B94ADD6B600B0F87E10062924BF17 +:101B900005B0F0BDCCE7A168009891F8F51003E01E +:101BA000A168009891F8CC100171B7E0A068D0F856 +:101BB000FC00411C0098FBF734FAAFE0A1680098E4 +:101BC000D1F8F82092790271D1F8F8201289427187 +:101BD000120A8271D1F8F8205289C271120A027277 +:101BE000D1F8F82092894272120A8272D1F8F81064 +:101BF000C989FBF7EEF991E0A068D0F8F800011D63 +:101C00000098FBF71BFAA068D0F8F80000F10C016F +:101C10000098FBF71DFAA068D0F8F80000F11E014B +:101C20000098FBF71BFAA06800F1C0010098FBF7D1 +:101C300023FA73E06269009811780171918841710B +:101C4000090A81715188C171090A017266E064E074 +:101C5000FD49D1E90001CDE9020102A90098FBF795 +:101C600025FA5BE0A068B0F844100098FBF728FA6A +:101C7000A068B0F846100098FBF726FAA068B0F804 +:101C800040100098FBF724FAA068B0F842100098C2 +:101C9000FBF722FA42E0A068B0F840100098FBF78A +:101CA00017FAA068B0F842100098FBF715FAA06880 +:101CB000B0F844100098FBF703FAA068B0F846109B +:101CC0000098FBF701FA29E0A168009891F810212B +:101CD000027191F81111417120E0A06890F8F300B1 +:101CE000FAF722FE01460098FBF735FAA06890F853 +:101CF000F200FAF719FE01460098FBF728FA0DE00A +:101D0000A06890F8ED100098FBF749FAA06890F8E9 +:101D1000EC100098FBF747FA00E0FFDFF3F70EFD49 +:101D2000002808BFFFDF0098C178012903D049B11E +:101D300018290FD013E0A168B1F802114172090A05 +:101D400081720CE0A168D1F8F81089884173090A02 +:101D5000817304E0A168B1F8F010FBF700FABB480A +:101D60000090BB4BBB4A29463046F8F7CDFFA06830 +:101D70000023052190F864205830FAF76EFC002803 +:101D800004BF05B0F0BD05B0BDE8F040F8F7C5BD33 +:101D9000B148806890F8881029B1B0F88410B0F884 +:101DA000862091421AD290F88C1029B1B0F88A108E +:101DB000B0F88620914211D2B0F88220B0F880109D +:101DC0008A420BD290F86820B0F87E0022B1884297 +:101DD00004D200BFF9F738B80628FBD3002001462B +:101DE00034E470B50C46064615464FF4A4712046FF +:101DF00002F07FFA2680002D08BFFFDF2868C4F8B4 +:101E0000F8006868C4F8FC00A868C4F8440170BD14 +:101E1000EEF7D7BE2DE9F0410D4607460621EEF755 +:101E2000C7FD040008BFBDE8F081D4F844110026C6 +:101E3000087858B14A8821888A4207D1092810D0E9 +:101E40000E281DD00D2832D008284CD094F81A0145 +:101E5000002857D06E701020287084F81A61AF8067 +:101E60003EE06E7009202870D4F844014168696032 +:101E70008168A9608089A881D4F8440106702FE0A8 +:101E80000846EEF7C7FE0746EEF773FBB0B96E7073 +:101E90000E202870D4F8440140686860D4F84401EA +:101EA00006703846EEF75FFB0120BDE8F08108467A +:101EB000EEF7B0FE0746EEF75CFB10B10020BDE880 +:101EC000F0816E700D202870D4F84401416869607B +:101ED00000892881D4F8440106703846EEF743FBA8 +:101EE0000120BDE8F0816E7008202870D4F844010C +:101EF00041688268C0686960AA60E860D4F84401FB +:101F00000670EDE794F81C01B0B16E7015202870D2 +:101F100094F81C010028E3D084F81C61D4F81E0159 +:101F20006860D4F82201A860B4F82601A88194F86A +:101F30001C010028F0D1D3E794F8280170B16E702D +:101F40001D20287084F82861D4F82A016860D4F82C +:101F50002E01A860B4F83201A881C1E794F83401D9 +:101F600040B16E701E20287084F83461D4F83601B8 +:101F70006860B5E794F8140180B16E701B2028707A +:101F800094F814010028ABD084F81461D4F8160139 +:101F9000686094F814010028F6D1A1E794F83A019A +:101FA000002808BFBDE8F0816E701620287094F8F4 +:101FB0003A01002894D000BF84F83A61D4F83C017B +:101FC0006860B4F84001288194F83A010028F3D100 +:101FD00086E7214A5061D17070472DE9F0470446E9 +:101FE000481E85B238BFBDE8F08704F10808012615 +:101FF000DFF864904FF0090A5FF00007B4F8D800EA +:10200000401CA4F8D800B4F87E00401CA4F87E0060 +:1020100094F86A0040B994F864200023062104F182 +:102020005800FAF71AFB30B3B4F87600401C80B2BF +:10203000A4F87600B4F8781081422CBF0A1A002266 +:10204000A3885B1D934209E0F44802004D1602008C +:10205000DB180200131902007C01002028BF84F85D +:102060007C60884207D3A4F8767084F81A6199F8E6 +:102070000300E9F78BFE94F8880020B1B4F88400DF +:10208000401CA4F8840094F88C0020B1B4F88A00B5 +:10209000401CA4F88A0094F8F40040B994F8672032 +:1020A0000023012104F15800FAF7D7FA20B1B4F85F +:1020B0008200401CA4F8820094F864000C2802D02E +:1020C0000D2820D067E0B4F85800411CB4F8020194 +:1020D000814260D1D4F8FC00411C404602F01EFA57 +:1020E00002212046F9F7DDFFD4F8FC000078002833 +:1020F00008BFFFDF0121FE20FEF778FE84F8647040 +:1021000084F8986047E0B4F85800411CD4F8F8000F +:10211000808881423FD1D4F844010178002918BF5A +:10212000FFDF22D12188C180D4F8F8004189D4F89A +:1021300044010181D4F8F8008189D4F84401418137 +:10214000D4F8F800C189D4F844018181D4F844015D +:102150000771D4F8440180F800A0D4F84401218824 +:10216000418099F80300E9F711FE01212046F9F7B3 +:1021700098FF03212046FEF70EFBD9F80800D0F89F +:10218000F8000078022818BFFFDF0221FE20FEF7CA +:102190002DFE84F86470B4F85800401C691EA4F841 +:1021A00058008DB2BFF42AAFBDE8F087F84AC2E903 +:1021B0000601704770B50446B0F87E0094F86810C8 +:1021C000002908BFC0F1020503D0B4F88010081A36 +:1021D000051F94F87C0040B194F864200023092185 +:1021E00004F15800FAF739FAA0B1B4F8766094F81F +:1021F0006A0058B994F864200023062104F15800BD +:10220000FAF72BFA002808BF284603D0B4F8780064 +:10221000801B001F8542C8BF0546002DD4BF00208B +:10222000A8B270BD042110B5D94CA068FEF7B3FA6E +:10223000A06890F84E10012902BF022180F84E10CC +:1022400010BD00F58A710288A0F81E21028EA0F848 +:102250002021828EA0F82221028FB0F844309A42C9 +:1022600028BF1A460A82828FB0F84600824238BFE1 +:102270001046488201200872E078BDE81040E9F776 +:1022800085BDC34830B4806890F84E30B0F832C095 +:10229000C48EB0F84010428F022B25D08A4238BF3E +:1022A00011460186C28FB0F842108A4238BF1146EB +:1022B0008186028FB0F844108A4238BF11464186A9 +:1022C000828FB0F846108A4238BF1146C186418ECF +:1022D000614588BF8C46A0F832C0C18EA14288BF3C +:1022E0000C46C48630BC7047038E9A4228BF1A46FB +:1022F000C58F838E9D4238BF2B468A4238BF114618 +:102300000186B0F842108B4228BF0B46838600211D +:1023100080F84E10CDE770B59D4CA06890F8CB10BA +:10232000FE2906BF6178002970BD90F86720002360 +:1023300001215830FAF791F9002818BF70BDA06844 +:1023400090F8F41021B1BDE870400220FEF702BD04 +:1023500090F86420002319465830FAF77EF940B10E +:10236000A06890F87C0020B1BDE870401220FEF714 +:10237000F1BCA068002590F86420122A1FD004DC6C +:10238000032A3FD0112A1FD003E0182A35D0232A70 +:1023900043D0002304215830FAF75FF9002818BF12 +:1023A00070BDD4F808C09CF8650019287CD03BDCCF +:1023B00001286BD0022879D003285DD038E0BDE831 +:1023C00070400B20FEF7C6BCF1F760FC0C2838BF4C +:1023D00070BDA0680821D0F8F8001E30F1F75AFC53 +:1023E00028B1A0680421C030F1F754FC00B9FFDF28 +:1023F000BDE870400320FEF7ADBCBDE8704006208C +:10240000FEF7A8BC90F8CA1080F8CC100720FEF7A1 +:10241000A1FCA06880F8645070BD1820FEF79AFCFB +:10242000A068A0F8845070BD1E2847D021286BD02A +:10243000DCF8F80001260178002973D04088BCF848 +:10244000001088426ED100239CF8642019460CF1DC +:102450005800FAF702F9002864D0A068D0F8F81004 +:10246000097802297ED003297DD004297CD0052952 +:1024700008BF082079D0C7E09CF8C9008CF8CC00D0 +:102480000720FEF767FCA06800F06DB90C20FEF78E +:1024900061FCA068A0F88A5090F8901041F001010A +:1024A00080F8901000F05FB96DE0FFE71320FEF7B1 +:1024B00051FCA068A0F88A5000F055B99CF80501BD +:1024C000002818BF70BD9CF8040188B1BCF8060153 +:1024D000ACF84000BCF80801ACF84200BCF80A01B6 +:1024E000ACF84400BCF80C01ACF846008CF8045180 +:1024F000FFF7C7FEFFF796FE1520FEF72BFCA0683E +:10250000A0F88A5000F02FB99CF87D0058B18CF8E3 +:10251000F2508CF8F3501820FEF71CFCA068A0F8CD +:102520008A5070BD70E09CF80F01002818BF70BD84 +:102530009CF80E01002808BF70BDDCE91416DCF819 +:102540001001FAF7F6F9F2B2C1B28A4207BFA168E8 +:1025500081F8F250A26882F8F210C6F30721C0F3A6 +:10256000072003E016E01BE03BE022E0814219BFB8 +:10257000A16881F8F300A06880F8F3501820BDE846 +:102580007040FEF7E7BB1120FEF7E4FBA068EAE02D +:102590007C01002090F86500FAF748F8A0BB08E03D +:1025A00090F8691041B190F86A00002808BFFFDF79 +:1025B0000A20FEF7CFFB27E0F1F768FB0C2823D3B6 +:1025C000A0680821D0F8F8001E30F1F763FB28B1AD +:1025D000A0680421C030F1F75DFB00B9FFDF0320E4 +:1025E000E7E790F8900010F0030F0DD10C20FEF7F4 +:1025F000B1FBA068A0F8845080F8886090F8901033 +:1026000041F0010180F89010A06890F8CB10FE29ED +:1026100018BF70BD90F86420002319465830FAF7AF +:102620001CF8002808BF70BDA06890F80011E9B33D +:10263000A1690978D1BB90F86500F9F7F7FFA8BB4D +:10264000A068B0F858100A2931D900F10801052214 +:10265000E06901F081FD0028A06804BF80F8005106 +:1026600070BDD0F8FC00017861B1411C0522E06921 +:1026700001F072FD002818BF70BDA068D0F8FC0002 +:10268000007830B9A068E169D0F8FC00401C01F086 +:1026900045FFA068D0F8FC000178491C01700120BA +:1026A000FEF758FBA06880F8005170BDFFE7A068F6 +:1026B00090F8041111B190F8051181B390F80E1142 +:1026C000002908BF70BD90F80F11002918BF70BD18 +:1026D00090F86500F9F7AAFF002818BF70BDA06840 +:1026E00090F85400012808BF012503D0022814BF28 +:1026F000FFDF0225A06890F85500012808BF0126D9 +:1027000003D0022814BFFFDF0226A168012D91F833 +:1027100010012BD0022D08BF022829D033E0FFE79B +:10272000B0F80611A0F84010B0F80811A0F8421057 +:10273000B0F80A11A0F84410B0F80C11A0F8461037 +:1027400080F8045190F865001D2804D0BDE8704061 +:102750001420FEF7FFBAFFF794FDFFF763FD152085 +:10276000FEF7F8FAA06880F8655070BD01280AD11C +:1027700091F81101012E04D0022E08BF022807D0C3 +:1027800001E0012804D0BDE870401620FEF7E2BA4F +:10279000BDE870400020FEF7FCBA70B5044690F822 +:1027A000640000250C2814D00D2818BF70BDB4F8A3 +:1027B0005800D4F8F810401C8988884218BF70BDB2 +:1027C000D4F84401FE4E0178002918BFFFDF45D13F +:1027D00022E0B4F85800B4F80211401C884218BF37 +:1027E00070BDD4F8FC00411C04F1080001F096FE15 +:1027F00002212046F9F755FCD4F8FC0000780028A7 +:1028000008BFFFDF0121FE20FEF7F0FA84F86450D4 +:10281000012084F8980070BD2188C180D4F8F800A8 +:10282000D4F8441140890881D4F8F800D4F8441150 +:1028300080894881D4F8F800D4F84411C08988818F +:10284000D4F844010571D4F8441109200870D4F873 +:10285000441120884880F078E9F798FA0121204651 +:10286000F9F71FFC03212046FDF795FFB068D0F86B +:10287000F8000078022818BFFFDF0221FE20FEF7D3 +:10288000B5FA84F8645070BD70B5CD4CA16891F86C +:102890006420162A11BF132A91F88E20002A62782C +:1028A0001BBF02206070002A70BD81F8C80000259F +:1028B00081F88D5081F88850D1F8F8000988408857 +:1028C000884218BFFFDFA068D0F8F800007803281E +:1028D00018BFFFDF0321FE20FEF788FAA068D0F8BA +:1028E00044110A78002A18BFFFDF19D10288CA8074 +:1028F000D0F8442190F8C8101171D0F844110D722D +:10290000D0F844210D211170D0F844210188518064 +:102910000088EEF77FF9EDF717FEE078E9F736FA71 +:10292000A06880F8645070BD10B5A54C207910F0F7 +:10293000020F08BF10BD6078002818BF10BDE06806 +:10294000C078192880F06981DFE800F05F4F0D8FB3 +:10295000F8F8A6223FF86F83B1F8F8F8F8F7E3E04B +:10296000F9F5F4F8F300A0680023012190F867203E +:102970005830F9F772FE002818BF10BD0821A06872 +:1029800080F86710002180F8881080F88C1010BD46 +:10299000A0680023194690F865205830F9F75DFECD +:1029A00018B1A168002081F88C00A06800231946A6 +:1029B00090F864205830F9F750FE002808BF10BD89 +:1029C0000020A16881F8880010BDA0680023194686 +:1029D00090F864205830F9F740FE002808BFFFDF68 +:1029E0000420A16881F8640010BDA0680023194686 +:1029F00090F864205830F9F730FE002808BFFFDF58 +:102A00000C20A16881F8640010BDA068002319465D +:102A100090F864205830F9F720FE002808BFFFDF47 +:102A20000D20A16881F8640010BDA068002319463C +:102A300090F864205830F9F710FE002808BFFFDF37 +:102A40000121A06880F88D105FF00F0180F86410FC +:102A500010BDA06890F86400122818BFFFDF0121A4 +:102A6000A06880F88E101121F0E7A06800231946B5 +:102A700090F864205830F9F7F0FD28B9A06890F874 +:102A80008E00002808BFFFDF0121A06880F88D10AC +:102A9000132180F8641010BDA06890F86400182815 +:102AA00018BFFFDF1A20A16881F8640010BDA0687C +:102AB000D0F8F81003884A889A4204BF097804299C +:102AC00019D190F86420002319465830F9F7C5FD54 +:102AD000002808BFFFDFA06890F8901011F0020FE7 +:102AE00004BF012180F8641005D0002180F888100F +:102AF000D0F8F8000170A0680023194690F865200E +:102B00005830F9F7AAFD002808BF10BD0020A168C1 +:102B100080E0A0680023194690F864205830F9F747 +:102B20009CFD002808BFFFDF0520A16881F8640034 +:102B300010BD30E01FE012E001E067E06DE0A0684A +:102B40000023194690F864205830F9F786FD0028D4 +:102B500008BFFFDF1C20A16881F86400E8E7A068D7 +:102B60000023194690F865205830F9F776FD0028C3 +:102B700008BFFFDFCAE7A0680023194690F8642069 +:102B80005830F9F76AFD002808BFFFDF1F20A16851 +:102B900081F86400CCE7A06890F8651021291DD069 +:102BA00090F86410232918BFFFDFC1D190F8F2100C +:102BB000002906BF90F8F3100029242102E000004C +:102BC0007C01002018BF80F864107FF4F9AE00216A +:102BD00080F864100846FEF7DCF8F1E690F8F21091 +:102BE000002907BF90F8F3100029242180F8651010 +:102BF0008CD1002180F8651080F87D1090F80E01CE +:102C000000281CBF0020FEF7C4F87FE7A168002061 +:102C100081F8650081F88C008AE7FFDF88E7000013 +:102C200070B58D4C0829207A63D2DFE801F0041AD0 +:102C30005A5A2662625A80B1F1F7EDFD012211461F +:102C40001046F1F7F0FFF2F7FDFC0020A072F1F75B +:102C5000A1FEBDE87040F2F76EB9BDE87040EFF735 +:102C6000E3BED4E90001EFF7DCFC2060A07A401C51 +:102C7000C0B2A07228281CD370BDA07A0025401EC7 +:102C8000C6B2E0683044F2F748FA10B9E1687F2034 +:102C90008855A07A272828BF01252846F2F782FC0C +:102CA000A07A282809D2401CC0B2A072282828BFC8 +:102CB00070BDBDE87040F1F76DBE207A00281CBFE2 +:102CC000012000F085F8F2F7C3F8F2F72CF90120A3 +:102CD000E07262480078E9F759F8BDE87040EFF714 +:102CE000A3BE002808BF70BD0020BDE8704000F002 +:102CF0006FB8FFDF70BD10B5574C207A002804BFB5 +:102D00000C2010BD00202072E072607AF0F7DAFA31 +:102D1000607AF0F724FD607AEFF75BFF00280CBFC4 +:102D20001F20002010BD002270B54B4C06460D46FA +:102D3000207A68B12272E272607AF0F7C3FA607AA0 +:102D4000F0F70DFD607AEFF744FF002808BFFFDFC2 +:102D50004248E560067070BD70B5050007D0A5F566 +:102D6000E8503F494C3881429CBF122070BD3A4C1C +:102D7000E068002804BF092070BD207A00281CBF2D +:102D80000C2070BD3748EFF7CAFE6072202804BFE0 +:102D90001F2070BDEFF73CFF2060002D1CBF2844B2 +:102DA0002060012065602072002000F011F80020F2 +:102DB00070BD2949CA7A002A04BF002070471F222B +:102DC000027000224270CB684360CA7201207047D3 +:102DD0002DE9F04184B00746EFF71AFF1E4D8046FB +:102DE000414668682C6800EB800046002046F0F7FA +:102DF0001DFCB04206DB6868811B4046EFF711FC02 +:102E00000446286040F2337621464046F0F70EFC37 +:102E1000B04204DA31464046EFF703FC0446002096 +:102E20008DF8000040F2E760039004208DF8050063 +:102E3000002F14BF012003208DF80400684602947F +:102E4000F0F7B3F8687A6946F0F72AF9002808BF66 +:102E5000FFDF04B0BDE8F081AC1200209C0100202F +:102E6000B5EB3C00212C02002DE9F0410C46124943 +:102E70000D68114A114908321160A0F12001312971 +:102E800001D301200CE0412810D040CC0C4F94E835 +:102E90000E0007EB8000241F50F8807C3046B847B6 +:102EA00020600548001D0560BDE8F0812046DEF782 +:102EB00097F9F5E706207047100502400100000170 +:102EC000FC48020010B5524800F038FA00B1FFDFAC +:102ED0004F48401C00F032FA002800D0FFDF10BD40 +:102EE0002DE9F14F4B4ED6F800B00127484800F0CD +:102EF0002DFADFF81C8128B95FF0000708F1010006 +:102F000000F03AFA444C00254FF0030901206060BC +:102F1000C4F80051C4F80451009931602060DFF812 +:102F2000FCA018E0DAF80000C00614D50E2000F06E +:102F300064F8EFF3108010F0010072B600D00120A9 +:102F4000C4F80493D4F8001119B9D4F8041101B9E4 +:102F500020BF00B962B6D4F8000118B9D4F8040152 +:102F60000028DFD0D4F804010028CFD137B1C6F84B +:102F700000B008F1010000F0E9F911E008F10100EA +:102F800000F0E4F90028B9D1C4F80893C4F804515A +:102F9000C4F800510E2000F030F81D4800F0ECF9A4 +:102FA0000020BDE8F88F2DE9F0438DB00D460646B0 +:102FB00000240DF110090DF1200817E004EB44077F +:102FC000102255F82710684601F0F2F805EB870744 +:102FD00010224846796801F0EBF86846FFF780FF59 +:102FE00010224146B86801F0E3F8641CB442E5DB06 +:102FF0000DB00020BDE8F08372E700F01F02012150 +:1030000091404009800000F1E020C0F88012704734 +:103010009D01002004E5004000E0004010ED00E0CC +:10302000AA4900200870704770B5A94D01232B6094 +:10303000A84B1C68002CFCD0002407E00E6806603A +:103040001E68002EFCD0001D091D641C9442F5D39F +:103050000020286018680028FCD070BD70B59B4E19 +:1030600004469D4D3078022800D0FFDFAC4200D3EB +:10307000FFDF71699948012903D847F23052944221 +:1030800001DD03224271491C7161291BC160934912 +:103090007078F0F705F8002800D1FFDF70BD70B53B +:1030A0008A4C0D466178884200D0FFDF8A4E082D99 +:1030B0004BD2DFE805F04A041E2D4A4A4A382078F0 +:1030C000022800D0FFDF03202070A078012801D063 +:1030D00020B108E0A06800F0B7FD04E004F10800AA +:1030E00007C8FFF7A1FF05202070BDE87040EFF78B +:1030F0009BBCEFF78DFD01466068F0F797FAB04290 +:1031000002D2616902290BD30320F0F74CFD12E0D3 +:10311000EFF77EFD01466068F0F788FAB042F3D21F +:10312000BDE870409AE7207802280AD0052806D02A +:10313000FFDF04202070BDE8704000F0BDB8022021 +:1031400000E00320F0F72FFDF3E7FFDF70BD70B55F +:103150000546EFF75DFD5D4C60602078012800D0EA +:10316000FFDF5E49012008700020087104208D6097 +:1031700048715948C860022020706078EFF790FFCE +:10318000002800D1FFDF70BD10B5504C207838B951 +:103190000220F0F71EFD18B90320F0F71AFD08B160 +:1031A000112010BD4E48EFF7BAFC6070202804D003 +:1031B000012020700020606110BD032010BD2DE9AA +:1031C000F041144600EB84070E4605463F1F00F011 +:1031D0004EFD4FF080521169484306EB8401091FF0 +:1031E000B14201D2012100E000211CB11269B4EB0F +:1031F000920F02D90920BDE8F0813A4A95420ED3D8 +:10320000AF420CD3854205D2874203D245EA06007D +:10321000800701D01020EEE7964200D309B10F20BD +:10322000E9E7314831490068884205D022463146F5 +:103230002846FFF7F9FE10E0FFF7A6FF0028DAD1D5 +:10324000224800218560C0E9036481704FF4A971B0 +:1032500004FB01F01830FFF77AFF0020CBE770B5D0 +:103260004FF08055044628691E49B1FBF0F08442B6 +:1032700001D20F2070BD00F0FAFCA04201D810204E +:1032800070BD194819490068884204D02869604314 +:1032900000F0DAFC0CE0FFF777FF0028F0D1296995 +:1032A0000A4861438160012181701148FFF74FFF97 +:1032B000002070BD00F024BF10B5044C6078EFF71B +:1032C00088FC00B9FFDF0020207010BDA0010020A5 +:1032D00004E5014000E40140105C0C00BC12002039 +:1032E0009F30020000600200B0000020BEBAFECA9B +:1032F0007C5E01004FF08050D0F83011062903D0D9 +:10330000D0F83011491C07D1D0F83411062905D363 +:10331000D0F83401401C01D00020704701207047D4 +:103320004FF08050D0F83011062905D1D0F8340183 +:10333000062801D30120704700207047002101704A +:10334000084670470146002008707047EFF310816F +:1033500001F0010172B60278012A01D0012200E0D9 +:1033600000220123037001B962B60AB10020704740 +:103370004FF400507047E9E7EFF3108111F0010FAF +:1033800072B64FF00002027000D162B600207047A2 +:10339000F2E700004C4909680160002070474A4983 +:1033A00008600020704701218A0720B1012804D05D +:1033B00042F204007047916700E0D1670020704737 +:1033C00042490120086042F20600704708B5042314 +:1033D0003E4A1907103230B1C1F80433106840F08A +:1033E000010010600BE0106820F001001060C1F8CF +:1033F00008330020C1F8080135480068009000201B +:1034000008BD011F0B2909D8304910310A6822F084 +:103410001E0242EA400008600020704742F20500A8 +:103420007047000100F18040C0F804190020704787 +:10343000000100F18040C0F8081900207047000129 +:1034400000F18040D0F80009086000207047012892 +:1034500001D9072070471F4A52F8200002680A432A +:10346000026000207047012801D907207047194ADF +:1034700052F8200002688A43026000207047012849 +:1034800001D907207047134A52F8200000680860ED +:1034900000207047020010494FF0000003D0012ABD +:1034A00001D0072070470A6070474FF0804100202C +:1034B000C1F808014FF0E020802180F800140121BC +:1034C000C0F80011704700000004004000050040F3 +:1034D00008010040C0490200780500406249634B82 +:1034E0000A6863499A42096801D1C1F31001016079 +:1034F000002070475C495D4B0A685D49091D9A428E +:1035000001D1C0F310000860002070475649574BA6 +:103510000A68574908319A4201D1C0F31000086087 +:103520000020704730B5504B504D1C6842F20803E4 +:10353000AC4202D0142802D203E0112801D318466D +:1035400030BDC3004B481844C0F81015C0F814250E +:10355000002030BD4449454B0A6842F209019A42B5 +:1035600002D0062802D203E0042801D3084670479F +:10357000404A012142F83010002070473A493B4B45 +:103580000A6842F209019A4202D0062802D203E0F8 +:10359000042801D308467047364A012102EBC000D7 +:1035A00041600020704770B52F4A304E314C15688D +:1035B00042F2090304EB8002B54204D0062804D28B +:1035C000C2F8001807E0042801D3184670BDC1F303 +:1035D0001000C2F80008002070BD70B5224A234ECA +:1035E000244C156842F2090304EB8002B54204D072 +:1035F000062804D2D2F8000807E0042801D31846B0 +:1036000070BDD2F80008C0F310000860002070BD43 +:10361000174910B50831184808601120154A0021D3 +:1036200002EBC003C3F81015C3F81415401C14288E +:10363000F6D3002006E0042804D302EB8003C3F88D +:10364000001807E002EB8003D3F80048C4F310042D +:10365000C3F80048401C0628EDD310BD04490648B5 +:103660000831086070470000B0000020BEBAFECAF2 +:1036700000F5014000F001400000FEFF7E4B1B689A +:1036800003B19847BFF34F8F7C4801687C4A01F42F +:10369000E06111430160BFF34F8FFEE710B5EFF318 +:1036A000108010F0010F72B601D0012400E0002458 +:1036B00000F0D9F850B1DDF72DFEEFF776F8F0F70E +:1036C00013FADFF7A2FB6F490020086004B962B665 +:1036D000002010BD70B50C460546EFF3108010F0C9 +:1036E000010F72B601D0012600E0002600F0BBF801 +:1036F00018B106B962B6082070BDDDF787FDDDF7A9 +:103700000DFE0246002043099B0003F1E02300F078 +:103710001F01D3F80031CB40D9071BD0202803D29A +:1037200022FA00F1C90722D141B2002906DA01F0DC +:103730000F0101F1E02191F8141D03E001F1E021F6 +:1037400091F800144909082911D281B101290ED03C +:1037500004290CD0401C6428D5D3DFF72DFB494940 +:10376000494808602046F0F7D9FD60B904E006B981 +:1037700062B641F2010070BD3F4804602DB1284699 +:10378000F0F719FE18B110242CE0404D19E028780C +:10379000022802D94FF4805424E0072400286878D6 +:1037A00001D0F8B908E0E8B120281BD8A878212872 +:1037B00018D8012816D001E0A87898B9E8780B2825 +:1037C00010D83349802081F8140DDDF7A7FD294674 +:1037D000F0F770F9EEF7A8FF00F07CFA2846DDF765 +:1037E0006BFD044606B962B61CB1FFF757FF2046D1 +:1037F00070BD002070BD10B5044600F034F800B173 +:1038000001202070002010BD224908600020704770 +:1038100070B50C4620490D681F49204E08310E60D6 +:10382000102807D011280CD012280FD0132811D03F +:10383000012013E0D4E90001FFF74CFF354620607A +:103840000DE0FFF72BFF0025206008E02068FFF760 +:10385000D2FF03E00F4920680860002020600E4876 +:10386000001D056070BD074807490068884201D106 +:103870000120704700207047B80100200CED00E0E7 +:103880000400FA05B0000020BEBAFECAC849020012 +:103890000BE000E0040000201005024001000001E0 +:1038A00000B5C44910F1080F08BFF82024D014DC7B +:1038B00010F1280F08BFD8201ED010F1140F08BF38 +:1038C000EC2019D010F1100F08BFF02014D010F127 +:1038D0000C0F08BFF4200FD00CE010F1040F08BF4C +:1038E000FC2009D0002818BF032805D0042804BFF5 +:1038F000086000BDFFDF00BD086000BD00B5AE4937 +:10390000012808BF032004D0022816BFFFDF0420CF +:1039100000BD086000BDA949002804BF086820F068 +:10392000010005D0012806BF086840F0010070477B +:103930000860704770B51E460546012924D0022A4A +:1039400004BF9F484FF47A710DD0012A04BF9D48EF +:103950004FF4C86107D0042A07BF9B4840F698017E +:103960009A4840F6E44144181846F1F744FE0444EE +:103970003046F1F75EFE20444FF47A7100F2712078 +:10398000B0FBF1F0281A70BD022A08BF4FF47A701C +:103990000AD0012A08BF4FF4C86005D0042A0CBF22 +:1039A00040F6980040F6E44049F608514418DBE739 +:1039B00070B514460546012908BF49F6CA660DD000 +:1039C000022B08BF824807D0012B08BF7D4803D0D7 +:1039D000042B0CBF7C487F4800F1FA061046F1F733 +:1039E00019FE012C08BF4FF47A710AD0022C08BFCF +:1039F0004FF4FA7105D0042C0CBF4FF4FA614FF468 +:103A0000FA51711A08444FF47A7100F28920B0FB20 +:103A1000F1F0281A801E70BD70B5144606460129C3 +:103A200030D0022B04BF66494FF47A700DD0012BC1 +:103A300004BF64494FF4C86007D0042B07BF624934 +:103A400040F69800614940F6E4400D181046F1F741 +:103A5000E1FD012C08BF4FF47A710AD0022C08BF97 +:103A60004FF4FA7105D0042C0CBF4FF4FA614FF4F7 +:103A7000FA51691A08444FF47A716438B0FBF1F0D6 +:103A8000301A70BD022B08BF4FF47A700AD0012B98 +:103A900008BF4FF4C86005D0042B0CBF40F6980057 +:103AA00040F6E44049F608514518CFE770B5164690 +:103AB0000446012908BF49F6CA650DD0022B08BF8C +:103AC000434807D0012B08BF3E4803D0042B0CBF4E +:103AD0003D48404800F1FA051046F1F78CFD0544D9 +:103AE0003046F1F7A6FD28444FF47A7100F2E14028 +:103AF000B0FBF1F0201A801E70BD2DE9F0410746A1 +:103B00001E460C4615461046082A16BF04284DF6D8 +:103B10008830F1F770FD07EB4701C1EBC71100EBEF +:103B2000C100012C08BF4FF47A710AD0022C08BFE3 +:103B30004FF4FA7105D0042C0CBF4FF4FA614FF426 +:103B4000FA5147182046F1F765FD381A4FF47A719B +:103B500000F60F60B0FBF1F42846F1F740FD204479 +:103B60003044401DBDE8F08170B5054614460E4650 +:103B70000846F1F740FD05EB4502C2EBC512C0EB6C +:103B8000C2053046F1F755FD2D1A2046082C16BF08 +:103B900004284DF68830F1F72EFD28444FF47A7151 +:103BA00000F6B730B0FBF1F52046F1F718FD2844D8 +:103BB000401D70BD0C15004010150040501600400F +:103BC00068360200A2240200D0FB010030D30100BD +:103BD00004360200C0D401002DE9FE430C468046A5 +:103BE000F9F7BAF9074698F80160204601A96A4634 +:103BF000ECF79BFC05000DD0012F02D00320BDE89F +:103C0000FE83204602AA0199ECF7B1FB0298B0F8B6 +:103C100003000AE0022F14D1042E12D3B8F80300D7 +:103C2000BDF80020011D914204D8001D80B2A919E1 +:103C3000814202D14FF00000E1E702D24FF00100D3 +:103C4000DDE74FF00200DAE70B4A022111600B4971 +:103C50000B68002BFCD0084B1B1D1860086800285F +:103C6000FCD00020106008680028FCD070474FF09E +:103C7000805040697047000004E5014000E40140C5 +:103C800002000B464FF00000014620D0012A04D06C +:103C9000022A04D0032A0DD103E0012002E0022011 +:103CA00015E00320072B05D2DFE803F00406080A1D +:103CB0000C0E100007207047012108E0022106E0E9 +:103CC000032104E0042102E0052100E00621EEF7D3 +:103CD00042BF0000F9480521817000210170417048 +:103CE0007047F7490A78012A05D0CA681044C860AD +:103CF0004038EFF768BC8A6810448860F8E700280D +:103D000019D00378EF49F04A13B1012B0ED011E01E +:103D10000379012B00D06BB943790BB1012B09D189 +:103D20008368643B8B4205D2C0680EE00379012BA7 +:103D300002D00BB10020704743790BB1012BF9D1B0 +:103D4000C368643B8B42F5D280689042F2D8012070 +:103D50007047DB4910B501220A700279A2B1002236 +:103D60000A71427992B104224A718268D34C52326C +:103D70008A60C0681434C8606060EEF749FFCF49BC +:103D800020600220887010BD0322E9E70322EBE7E0 +:103D900070B5044609B1012000E00320C84D0021A0 +:103DA0002970217901B100202871607968B104205F +:103DB000C24E6871A168F068EEF733FCA860E06855 +:103DC0005230E8600320B07070BD0320F0E72DE9A9 +:103DD000F04105460226EFF722FB006800B1FFDF45 +:103DE000B64C01273DB12878B0B1012805D0022892 +:103DF00010D0032813D027710CE06868C82807D3B7 +:103E0000EFF747FC20B16868FFF76BFF012603E07E +:103E1000002601E000F05CF93046BDE8F081207832 +:103E20000028F7D16868FFF76AFF0028E3D06868C8 +:103E3000017879B1A078042800D0FFDF01216868FB +:103E4000FFF7A6FF9E49E078EFF72AF90028E1D1B5 +:103E5000FFDFDFE7FFF77DFF6770DBE72DE9F04766 +:103E6000964C8846E178884200D0FFDFDFF84C921C +:103E700000250127924E09F11409B8F1080F75D2F7 +:103E8000DFE808F0040C28527A808D95A07803288A +:103E900002D0022800D0FFDFBDE8F087A078032819 +:103EA00002D0022800D0FFDF0420A0702571207806 +:103EB000002878D1FFF715FF3078012806D0B068C8 +:103EC000E06000F031F92061002060E0E078EEF77A +:103ED000E4FFF5E7A078032802D0022800D0FFDF36 +:103EE000207800286DD1A078032816D0EEF790FE38 +:103EF00001464F46D9F80000EFF798FB00280EDB8B +:103F0000796881420BDB081AF0606D49E078EFF7C1 +:103F1000C7F80028C0D1FFDFBEE7042028E0042056 +:103F2000EFF741FEA570B7E7A078032802D002287A +:103F300000D0FFDF207888BBA078032817D0EEF7E9 +:103F400067FE01464F46D9F80000EFF76FFB0028E7 +:103F5000E5DB79688142E2DB081AF0605849E078D5 +:103F6000EFF79EF8002897D1FFDF95E740E00520A6 +:103F7000EFF719FEA7708FE7A078042800D0FFDFC5 +:103F8000022004E0A078042800D0FFDF0120A1680F +:103F90008847FFF71CFF054630E004E011E0A078F9 +:103FA000042800D0FFDFBDE8F04700F091B8A0780A +:103FB000042804D0617809B1022800D0FFDF2078FE +:103FC00018B1BDE8F04700F08CB8207920B1062088 +:103FD000EFF7E9FD2571CDE7607838B13849E07831 +:103FE000EFF75EF800B9FFDF657055E70720BFE720 +:103FF000FFDF51E73DB1012D03D0FFDF022DF9D1E5 +:104000004AE70420C3E70320C1E770B5050004D0E8 +:104010002A4CA078052806D101E0102070BD0820A8 +:10402000EFF7D7FD08B1112070BD2848EEF777FDF6 +:10403000E070202803D00020A560A07070BD032090 +:1040400070BD1E4810B5017809B1112010BD8178EE +:10405000052906D0012906D029B1012101700020CF +:1040600010BD0F2010BD00F03CF8F8E770B5134C00 +:104070000546A07808B1012809D155B12846FFF7B7 +:104080003EFE40B1287840B1A078012809D00F2029 +:1040900070BD102070BD072070BD2846FFF759FE87 +:1040A00003E000212846FFF773FE0549E078EEF7AC +:1040B000F7FF00B9FFDF002070BD0000BC01002049 +:1040C000CC1200203D860100FF1FA1075D3E0200CB +:1040D0000A4810B5006900F01FF8BDE81040EEF77F +:1040E000A3BC064810B5C078EEF773FD00B9FFDF3A +:1040F0000820EFF758FDBDE81040EBE5BC010020BB +:1041000010B5134C2060201D016011481030026072 +:10411000001D0360002010BD0E490A6848F202131A +:104120009A4302430A6070470A4A116848F2021330 +:1041300001EA0300994311607047054B02465B4258 +:1041400010201344FC2B01D81160002070470000A0 +:1041500000060040C806024040EA010310B59B0774 +:104160000FD1042A0DD310C808C9121F9C42F8D0E1 +:1041700020BA19BA884201D9012010BD4FF0FF3092 +:1041800010BD1AB1D30703D0521C07E0002010BDA8 +:1041900010F8013B11F8014B1B1B07D110F8013B34 +:1041A00011F8014B1B1B01D1921EF1D1184610BD15 +:1041B000032A40F2308010F0030C00F0158011F853 +:1041C000013BBCF1020F624498BF11F801CB00F82B +:1041D000013B38BF11F8013BA2F1040298BF00F87F +:1041E00001CB38BF00F8013B11F0030300F025803C +:1041F000083AC0F0088051F8043B083A51F804CB63 +:10420000A0E80810F5E7121D5CBF51F8043B40F828 +:10421000043BAFF30080D20724BF11F8013B11F833 +:1042200001CB48BF11F8012B24BF00F8013B00F877 +:1042300001CB48BF00F8012B704710B5203AC0F001 +:104240000B80B1E81850203AA0E81850B1E8185097 +:10425000A0E81850BFF4F5AF5FEA027C24BFB1E8D4 +:104260001850A0E8185044BF18C918C0BDE8104045 +:104270005FEA827C24BF51F8043B40F8043B08BF4E +:104280007047D20728BF31F8023B48BF11F8012B15 +:1042900028BF20F8023B48BF00F8012B704702F00E +:1042A000FF0343EA032242EA024200F002B84FF061 +:1042B00000020429C0F0128010F0030C00F01B80F3 +:1042C000CCF1040CBCF1020F18BF00F8012BA8BF01 +:1042D00020F8022BA1EB0C0100F00DB85FEAC17CC5 +:1042E00024BF00F8012B00F8012B48BF00F8012B78 +:1042F00070474FF0000200B51346944696462039A9 +:1043000022BFA0E80C50A0E80C50B1F12001BFF48E +:10431000F7AF090728BFA0E80C5048BF0CC05DF8F4 +:1043200004EB890028BF40F8042B08BF704748BF42 +:1043300020F8022B11F0804F18BF00F8012B7047B6 +:10434000FEDF04207146084219D10699124A9142B3 +:1043500015DC069902394878DF2810D10878FE2844 +:1043600007D0FF280BD14FF001004FF000020B4B9C +:10437000184741F201000099019A084B1847084B71 +:10438000002B02D01B68DB6818474FF0FF307146E6 +:104390004FF00002014B1847006002007D3602001A +:1043A00004000020184819497047FFF7FBFFDCF7AD +:1043B00005FF00BD4FF4805015490968884203D1BC +:1043C000144A13605B68184700BD000020BFFDE77A +:1043D0004FF480500E490968884210D10E4B18687E +:1043E0004FF0FF318842F1D080F308884FF0202150 +:1043F000884204DD0948026803210A430260084834 +:10440000804708488047FFDFE0120020E0120020CC +:104410000000002004000020006002001409004099 +:10442000F5430100B543020004207146084202D062 +:10443000EFF3098101E0EFF3088188690238007821 +:10444000102813DB20280FDB2C280BDB0A4A12680C +:104450000A4B9A4203D1602804DB094A1047022024 +:1044600008607047074A1047074A1047074A126812 +:104470002C32126810470000B0000020BEBAFECAFD +:1044800021130000692E02001138020004000020F0 +:104490000D4B0E4908470E4B0C4908470D4B0B4975 +:1044A00008470D4B094908470C4B084908470C4B76 +:1044B000064908470B4B054908470B4B034908477A +:1044C0000A4B02490847000049BB00000D2F0000BD +:1044D0006D2C0000092B0000972A00000F2D000012 +:1044E0003D13000053280000C1BD0000C9110000A9 +:1044F00000210160017170470021016081807047D7 +:10450000002101604160017270470A684B680260D7 +:104510004360B1F808C0A0F808C070470A6802609C +:104520000B79037170470000B19500003B970000C4 +:1045300099980000BD980000F79800002B990000A2 +:104540005D9900008D990000039A00008996000093 +:10455000A7120000A712000075440000C14400002B +:10456000E5440000794500009546000057470000EB +:1045700089470000714800000349000057490000C6 +:104580003D4A00005D4A0000DF15000003160000F0 +:10459000331500008715000035160000C91600000D +:1045A0005B6000000B620000DF650000F566000044 +:1045B0007F670000FD6700006168000085690000FA +:1045C000556A0000C16A00007F4A0000854A000069 +:1045D0008F4A000085410000F74A00005941000061 +:1045E0007B4C0000B34C0000294D00000F4E000032 +:1045F000254E0000A7120000A7120000A71200001D +:10460000A7120000A7120000A7120000A7120000C6 +:10461000A7120000BF24000045250000612500000E +:104620007D2500000B270000A7250000B125000014 +:10463000F325000015260000F126000033270000B6 +:10464000A7120000A71200005F8300007F83000014 +:1046500081830000C5830000F3830000E184000033 +:104660006F85000083850000D1850000C1860000B1 +:10467000678800009189000073730000A989000019 +:10468000A7120000A7120000C9B4000033B6000052 +:1046900087B60000F3B60000A3B7000001000000D9 +:1046A00000000000100110013A0200001A02000090 +:1046B000F3900000E1900000FFFFFFFF0000FFFF0C +:1046C000C5AC0000253D000065200000BD73000062 +:1046D000598E0000000000000000020000000000F1 +:1046E00000020000000000000001000000000000C7 +:1046F0000B810000EB800000598100004124000084 +:1047000003240000232400002FA800005BA8000061 +:1047100063AA0000515900007981000000000000E8 +:10472000A98100008F2400000000000000000000AC +:104730000000000045A9000000000000E55900004D +:10474000000000004808000048080000D3560000A0 +:10475000D35600005144000071AB00003F760000CA +:10476000771F0000E31D02004F9401001157000065 +:104770001157000073440000D3AB0000C376000063 +:10478000E91F0000111E0200639401007001700116 +:10479000400038005C0024004801000200000300D3 +:1047A000656C746200000000000000000000000062 +:1047B0000000000087000000000000000000000072 +:1047C00000000000BE83605ADB0B376038A5F5AAF5 +:1047D0009183886C010000007911010041200100E3 +:1047E00000000001020603040500000007000000AD +:1047F00000000000060000000A0000003200000077 +:1048000073000000B4000000DD860100DB0C020034 +:10481000CB6C010065AE010059F0010065AE0100EE +:10482000616E01001DB00100E3E701001DB0010051 +:10483000476B0100B1AF010087EF0100B1AF01008C +:10484000C76C010079AE0100E9DF010079AE01001B +:104850005972010091B20100EFF0010091B2010024 +:104860000300000001555555D6BE898E0000C706CD +:10487000C70CC71200006B030F06B3080000B70493 +:10488000A708970CF401FA00960064004B00320070 +:104890001E0014000A000500020001000041000093 +:1048A00000000000AAAED7AB154120100C0802177B +:1048B0000D0101020909010106020918180301018D +:1048C0000909030305000000FE000000FE000000CF +:1048D000FE555555252627D6BE898E00F401FA00CF +:1048E000960064004B0032001E0014000A00050010 +:1048F000020001002541000000000000DD3402003C +:10490000F53402000D350200253502005535020050 +:104910007D350200A7350200DB3502005F32020060 +:10492000BF310200B53202003B4102003D330200BC +:104930004D330200793302009F3C0100A73C010087 +:10494000B93C0100A7330200C133020095330200D5 +:104950009F330200CD33020003340200B52E020063 +:1049600023340200313402003F3402004F3402008D +:10497000673402007F34020095340200B52E020035 +:104980000000000077B90000CDB90000E3B90000D5 +:10499000813C0200E12E0200A72F02000B40020022 +:1049A000434002006D400200493B0100C93E010046 +:1049B000B52E0200B52E0200B52E0200B52E020063 +:1049C0001C0500402005004000100200EC490200D8 +:1049D00008000020D001000044110000244A020019 +:1049E000D801002008110000A0110000011813C810 +:1049F000140250201A0102227C2720FB349B5F8086 +:104A00001280021A10138B091B2048041ACE0401CD +:104A1000200B50A40AAC01300912CB637F010B6854 +:044A2000CC10A00016 +:00000001FF diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/mbed_lib.json b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/mbed_lib.json similarity index 81% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/mbed_lib.json rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/mbed_lib.json index 7189ece9f9..9b00dbe5a1 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/mbed_lib.json +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_FULL/mbed_lib.json @@ -2,10 +2,10 @@ "name": "softdevice", "macros": [ "SOFTDEVICE_PRESENT=1", - "S140", + "S132", "BLE_STACK_SUPPORT_REQD", "NRF_SDH_CLOCK_LF_XTAL_ACCURACY=7", - "NRF_SD_BLE_API_VERSION=5", + "NRF_SD_BLE_API_VERSION=6", "NRF_SDH_ENABLED=1", "NRF_SDH_BLE_ENABLED=1", "PEER_MANAGER_ENABLED=1", @@ -34,7 +34,10 @@ "target_overrides": { "*": { "target.features_add": ["BLE"], - "target.bootloader_img": "hex/s140_nrf52840_5.0.0-2.alpha_softdevice.hex" + "target.bootloader_img": "hex/s132_nrf52_6.0.0_softdevice.hex", + "target.app_offset": "0x26000", + "target.mbed_ram_start": "0x200032E8", + "target.mbed_ram_size": "0xCD18" } } } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf52/nrf_mbr.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/headers/nrf_mbr.h similarity index 75% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf52/nrf_mbr.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/headers/nrf_mbr.h index c95bb8d4fd..cc5971c7a3 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf52/nrf_mbr.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/headers/nrf_mbr.h @@ -81,13 +81,13 @@ enum NRF_MBR_SVCS /**@brief Possible values for ::sd_mbr_command_t.command */ enum NRF_MBR_COMMANDS { - SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see sd_mbr_command_copy_bl_t*/ + SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see ::sd_mbr_command_copy_bl_t*/ SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ - SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD*/ + SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD. Does not require any parameters in ::sd_mbr_command_t params.*/ SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ - SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset @see ::sd_mbr_command_vector_table_base_set_t*/ + SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset. @see ::sd_mbr_command_vector_table_base_set_t*/ SD_MBR_COMMAND_RESERVED, - SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address @see ::sd_mbr_command_irq_forward_address_set_t*/ + SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address. @see ::sd_mbr_command_irq_forward_address_set_t*/ }; /** @} */ @@ -96,6 +96,7 @@ enum NRF_MBR_COMMANDS * @{ */ /**@brief This command copies part of a new SoftDevice + * * The destination area is erased before copying. * If dst is in the middle of a flash page, that whole flash page will be erased. * If (dst+len) is in the middle of a flash page, that whole flash page will be erased. @@ -127,14 +128,16 @@ typedef struct /**@brief This command copies a new BootLoader. - * With this command, destination of BootLoader is always the address written in NRF_UICR->BOOTADDR. * - * Destination is erased by this function. - * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. + * With this command, destination of BootLoader is always the address written in + * NRF_UICR->BOOTADDR. * - * This function will use PROTENSET to protect the flash that is not intended to be written. + * Destination is erased by this function. + * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. * - * On success, this function will not return. It will start the new BootLoader from reset-vector as normal. + * This function will use PROTENSET to protect the flash that is not intended to be written. + * + * On success, this function will not return. It will start the new BootLoader from reset-vector as normal. * * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. * @retval ::NRF_ERROR_FORBIDDEN if NRF_UICR->BOOTADDR is not set. @@ -149,10 +152,12 @@ typedef struct /**@brief Change the address the MBR starts after a reset * - * Once this function has been called, this address is where the MBR will start to forward interrupts to after a reset. + * Once this function has been called, this address is where the MBR will start to forward + * interrupts to after a reset. * - * To restore default forwarding this function should be called with @param address set to 0. - * The MBR will then start forwarding to interrupts to the address in NFR_UICR->BOOTADDR or to the SoftDevice if the BOOTADDR is not set. + * To restore default forwarding this function should be called with @ref address set to 0. The + * MBR will then start forwarding interrupts to the address in NFR_UICR->BOOTADDR or to the + * SoftDevice if the BOOTADDR is not set. * * On success, this function will not return. It will reset the device. * @@ -166,6 +171,7 @@ typedef struct } sd_mbr_command_vector_table_base_set_t; /**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR + * * Unlike sd_mbr_command_vector_table_base_set_t, this function does not reset, and it does not * change where the MBR starts after reset. * @@ -176,9 +182,15 @@ typedef struct uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ } sd_mbr_command_irq_forward_address_set_t; +/**@brief Input structure containing data used when calling ::sd_mbr_command + * + * Depending on what command value that is set, the corresponding params value type must also be + * set. See @ref NRF_MBR_COMMANDS for command types and corresponding params value type. If command + * @ref SD_MBR_COMMAND_INIT_SD is set, it is not necessary to set any values under params. + */ typedef struct { - uint32_t command; /**< type of command to be issued see @ref NRF_MBR_COMMANDS. */ + uint32_t command; /**< Type of command to be issued. See @ref NRF_MBR_COMMANDS. */ union { sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ @@ -186,7 +198,7 @@ typedef struct sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ sd_mbr_command_irq_forward_address_set_t irq_forward_address_set; /**< Parameters for irq forward address set*/ - } params; + } params; /**< Command parameters. */ } sd_mbr_command_t; /** @} */ @@ -198,21 +210,22 @@ typedef struct * * Commands used when updating a SoftDevice and bootloader. * - * The SD_MBR_COMMAND_COPY_BL and SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires parameters to be - * retained by the MBR when resetting the IC. This is done in a separate flash page - * provided by the application. The UICR register UICR.NRFFW[1] must be set - * to an address corresponding to a page in the application flash space. This page will be cleared - * by the MBR and used to store the command before reset. When the UICR.NRFFW[1] field is set - * the page it refers to must not be used by the application. If the UICR.NRFFW[1] is set to - * 0xFFFFFFFF (the default) MBR commands which use flash will be unavailable and return - * NRF_ERROR_NO_MEM. + * The @ref SD_MBR_COMMAND_COPY_BL and @ref SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires + * parameters to be retained by the MBR when resetting the IC. This is done in a separate flash + * page provided by the application. The UICR register UICR.NRFFW[1] must be set to an address + * corresponding to a page in the application flash space. This page will be cleared by the MBR and + * used to store the command before reset. When the UICR.NRFFW[1] field is set the page it refers + * to must not be used by the application. If the UICR.NRFFW[1] is set to 0xFFFFFFFF (the default) + * MBR commands which use flash will be unavailable and return @ref NRF_ERROR_NO_MEM. * * @param[in] param Pointer to a struct describing the command. * - * @note For return values, see ::sd_mbr_command_copy_sd_t ::sd_mbr_command_copy_bl_t ::sd_mbr_command_compare_t ::sd_mbr_command_vector_table_base_set_t ::sd_mbr_command_irq_forward_address_set_t + * @note For return values, see ::sd_mbr_command_copy_sd_t, ::sd_mbr_command_copy_bl_t, + * ::sd_mbr_command_compare_t, ::sd_mbr_command_vector_table_base_set_t, + * ::sd_mbr_command_irq_forward_address_set_t * - * @retval NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF). - * @retval NRF_ERROR_INVALID_PARAM if an invalid command is given. + * @retval ::NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF). + * @retval ::NRF_ERROR_INVALID_PARAM if an invalid command is given. */ SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param)); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_svc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/headers/nrf_svc.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_svc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/headers/nrf_svc.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/hex/mbr_nrf52_2.2.2_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/hex/mbr_nrf52_2.2.2_licence-agreement.txt new file mode 100644 index 0000000000..a71adee7b9 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/hex/mbr_nrf52_2.2.2_licence-agreement.txt @@ -0,0 +1,35 @@ +Copyright (c) 2007 - 2018, Nordic Semiconductor ASA +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form, except as embedded into a Nordic + Semiconductor ASA integrated circuit in a product or a software update for + such product, must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of Nordic Semiconductor ASA nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +4. This software, with or without modification, must only be used with a + Nordic Semiconductor ASA integrated circuit. + +5. Any software provided in binary form under this license must not be reverse + engineered, decompiled, modified and/or disassembled. + +THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/hex/mbr_nrf52_2.2.2_mbr.hex b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/hex/mbr_nrf52_2.2.2_mbr.hex new file mode 100644 index 0000000000..a8e5a7c926 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/hex/mbr_nrf52_2.2.2_mbr.hex @@ -0,0 +1,154 @@ +:020000040000FA +:1000000000040020E90800007D050000C908000088 +:1000100087050000910500009B050000000000001E +:100020000000000000000000000000000D090000BA +:10003000A505000000000000AF050000B9050000A4 +:10004000C3050000CD050000D7050000E105000054 +:10005000EB050000F5050000FF05000009060000A3 +:10006000130600001D0600002706000031060000F0 +:100070003B060000450600004F0600005906000040 +:10008000630600006D060000770600008106000090 +:100090008B060000950600009F060000A9060000E0 +:1000A000B3060000BD060000C7060000D106000030 +:1000B000DB060000E5060000EF060000F906000080 +:1000C000030700000D0700001707000021070000CC +:1000D0002B070000350700003F070000490700001C +:1000E000530700005D07000067070000710700006C +:1000F0007B070000850700008F07000099070000BC +:10010000A30700001FB500F003F88DE80F001FBD26 +:1001100000F0E0BB1FB56FF00100009040100390AD +:10012000029001904FF010208069000B420900F00E +:100130001F045DF822300120A04083434DF8223097 +:10014000684600F045F91FBDF0B54FF6FF734FF458 +:10015000B4751A466E1E11E0A94201D3344600E080 +:100160000C46091B30F8027B641E3B441A44F9D14B +:100170009CB204EB134394B204EB12420029EBD17E +:1001800098B200EB134002EB124140EA0140F0BD8F +:10019000DE4992B00446D1E90001CDE91001FF2209 +:1001A0004021684600F03CFB94E80F008DE80F000A +:1001B000684610A902E004C841F8042D8842FAD12B +:1001C00010216846FFF7C0FF1090AA208DF8440068 +:1001D000FFF7A0FF00F0F3F84FF01024A069102201 +:1001E0006946803000F002F9A069082210A900F0E9 +:1001F000FDF800F0D8F84FF080510A6949690068AD +:100200004A43824201D8102070470020704710B541 +:10021000D0E900214FF0805002EB8103026944696C +:100220006243934209D84FF01022536903EB8103D4 +:100230000169406941438B4201D9092010BD5069D1 +:10024000401C01D0002010BD0F2010BD70B501680A +:100250000446AF4D4FF01020072952D2DFE801F0DD +:10026000330419293C1E2500D4E902656468294637 +:10027000304600F0CDF82A462146304600F0B6F868 +:10028000AA002146304600F09FFA002800D0032043 +:1002900070BD00F051FB4FF4805007E0201DFFF7C8 +:1002A000AAFF0028F4D100F047FB60682860002016 +:1002B00070BD241D94E80700920000F085FA002824 +:1002C000F6D00E2070BD8069401C12D0201DFFF7B3 +:1002D0009EFF0028F6D109E08069401C09D0201D4E +:1002E000FFF789FF0028EDD1606820B12046FFF7B5 +:1002F0004FFF042070BDFFF70DFF00F060F800F025 +:1003000052F8072070BD10B50C46182802D0012005 +:10031000086010BD2068FFF799FF206010BD4FF006 +:100320001024A069401C05D0A569A66980353079E4 +:10033000AA2808D06069401C2DD060690068401C64 +:1003400029D060692CE010212846FFF7FDFE3168B6 +:1003500081421CD1A16901F18002C03105E030B1B8 +:1003600008CA51F8040D984201D1012000E0002094 +:100370008A42F4D158B1286810B1042803D0FEE7AE +:10038000284600F057F862496868086008E000F005 +:1003900016F800F008F84FF480500168491C01D0AD +:1003A00000F0A4FAFEE7BFF34F8F5A4801685A4A9B +:1003B00001F4E06111430160BFF34F8FFEE74FF09E +:1003C00010208169491C02D0806900F0AEB87047E6 +:1003D000524A01681160121D416811604F4A8168DC +:1003E00010321160111DC068086070472DE9F0419E +:1003F00017460D460646002406E03046296800F000 +:10040000A7F8641C2D1D361DBC42F6D3BDE8F08153 +:1004100070B50C4605464FF4806608E0284600F0AB +:1004200084F8B44205D3A4F5806405F58055002C0A +:10043000F4D170BD4168044609B1012500E00025F2 +:100440004FF010267069A268920000F0BDF9C8B1A3 +:10045000204600F01AF89DB17669A56864684FF4EB +:10046000002084420AD2854208D229463046FFF74E +:10047000CFFF2A4621463046FFF7B8FFFFF79FFF20 +:10048000FFF791FFFFF746FEF8E72DE9FF414FF038 +:100490001024616980680D0B01EB800000F6FF708D +:1004A000010B0020009001900290024603906846E4 +:1004B00001230BE0560902F01F0C50F8267003FAD6 +:1004C0000CFC47EA0C0740F82670521CAA42F1D3F4 +:1004D0000AE04A0901F01F0650F8225003FA06F616 +:1004E000354340F82250491C8029F2D3A169090BF9 +:1004F0004A0901F01F0150F822408B409C4340F80C +:100500002240FFF765FFBDE8FF8100005C090000A5 +:10051000000000200CED00E00400FA050006004099 +:10052000144801680029FCD07047134A0221116069 +:1005300010490B68002BFCD00F4B1B1D186008687E +:100540000028FCD00020106008680028FCD070470C +:10055000094B10B501221A60064A1468002CFCD021 +:10056000016010680028FCD0002018601068002886 +:10057000FCD010BD00E4014004E5014008208F4993 +:1005800009680958084710208C4909680958084724 +:1005900014208A49096809580847182087490968BA +:1005A0000958084730208549096809580847382004 +:1005B00082490968095808473C2080490968095858 +:1005C000084740207D4909680958084744207B496D +:1005D00009680958084748207849096809580847B0 +:1005E0004C20764909680958084750207349096822 +:1005F0000958084754207149096809580847582084 +:100600006E490968095808475C206C49096809580F +:100610000847602069490968095808476420674904 +:100620000968095808476820644909680958084753 +:100630006C20624909680958084770205F490968B9 +:100640000958084774205D49096809580847782007 +:100650005A490968095808477C20584909680958C7 +:10066000084780205549096809580847842053499C +:1006700009680958084788205049096809580847F7 +:100680008C204E4909680958084790204B49096851 +:10069000095808479420494909680958084798208B +:1006A00046490968095808479C204449096809587F +:1006B0000847A0204149096809580847A4203F4934 +:1006C000096809580847A8203C490968095808479B +:1006D000AC203A49096809580847B02037490968E9 +:1006E00009580847B4203549096809580847B8200F +:1006F0003249096809580847BC2030490968095837 +:100700000847C0202D49096809580847C4202B49CB +:10071000096809580847C82028490968095808473E +:10072000CC202649096809580847D0202349096880 +:1007300009580847D4202149096809580847D82092 +:100740001E49096809580847DC201C4909680958EE +:100750000847E0201949096809580847E420174963 +:10076000096809580847E8201449096809580847E2 +:10077000EC201249096809580847F0200F49096818 +:1007800009580847F4200D49096809580847F82016 +:100790000A49096809580847FC20084909680958A6 +:1007A00008475FF480700549096809580847000048 +:1007B00003480449024A034B704700000000002030 +:1007C000680900006809000040EA010310B59B07B2 +:1007D0000FD1042A0DD310C808C9121F9C42F8D0AB +:1007E00020BA19BA884201D9012010BD4FF0FF305C +:1007F00010BD1AB1D30703D0521C07E0002010BD72 +:1008000010F8013B11F8014B1B1B07D110F8013BFD +:1008100011F8014B1B1B01D1921EF1D1184610BDDE +:1008200002F0FF0343EA032242EA024200F005B865 +:100830007047704770474FF000020429C0F01280E3 +:1008400010F0030C00F01B80CCF1040CBCF1020F83 +:1008500018BF00F8012BA8BF20F8022BA1EB0C0158 +:1008600000F00DB85FEAC17C24BF00F8012B00F84E +:10087000012B48BF00F8012B70474FF0000200B574 +:10088000134694469646203922BFA0E80C50A0E8B3 +:100890000C50B1F12001BFF4F7AF090728BFA0E861 +:1008A0000C5048BF0CC05DF804EB890028BF40F82D +:1008B000042B08BF704748BF20F8022B11F0804F6F +:1008C00018BF00F8012B7047014B1B68DB68184705 +:1008D0000000002009480A497047FFF7FBFFFFF7B7 +:1008E00011FC00BD20BFFDE7064B1847064A10600B +:1008F000016881F30888406800470000680900002B +:10090000680900001F030000000000201EF0040F13 +:100910000CBFEFF30881EFF3098188690238007892 +:10092000182803D100E00000074A1047074A126860 +:100930002C3212681047000000B5054B1B68054AB1 +:100940009B58984700BD00000703000000000020EE +:100950005809000004000000001000000000000022 +:0809600000FFFFFF0090D0032F +:04000005000008E906 +:00000001FF diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/libraries/fstorage/nrf_fstorage_nvmc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/libraries/fstorage/nrf_fstorage_nvmc.c similarity index 94% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/libraries/fstorage/nrf_fstorage_nvmc.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/libraries/fstorage/nrf_fstorage_nvmc.c index b7c1ac01f6..14b1859c93 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/libraries/fstorage/nrf_fstorage_nvmc.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/libraries/fstorage/nrf_fstorage_nvmc.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -69,6 +69,7 @@ static nrf_atomic_flag_t m_flash_operation_ongoing; /* Send event to the event handler. */ static void event_send(nrf_fstorage_t const * p_fs, nrf_fstorage_evt_id_t evt_id, + void const * p_src, uint32_t addr, uint32_t len, void * p_param) @@ -84,6 +85,7 @@ static void event_send(nrf_fstorage_t const * p_fs, .result = NRF_SUCCESS, .id = evt_id, .addr = addr, + .p_src = p_src, .len = len, .p_param = p_param, }; @@ -139,7 +141,7 @@ static ret_code_t write(nrf_fstorage_t const * p_fs, /* Clear the flag before sending the event, to allow API calls in the event context. */ (void) nrf_atomic_flag_clear(&m_flash_operation_ongoing); - event_send(p_fs, NRF_FSTORAGE_EVT_WRITE_RESULT, dest, len, p_param); + event_send(p_fs, NRF_FSTORAGE_EVT_WRITE_RESULT, p_src, dest, len, p_param); return NRF_SUCCESS; } @@ -166,7 +168,7 @@ static ret_code_t erase(nrf_fstorage_t const * p_fs, /* Clear the flag before sending the event, to allow API calls in the event context. */ (void) nrf_atomic_flag_clear(&m_flash_operation_ongoing); - event_send(p_fs, NRF_FSTORAGE_EVT_ERASE_RESULT, page_addr, len, p_param); + event_send(p_fs, NRF_FSTORAGE_EVT_ERASE_RESULT, NULL, page_addr, len, p_param); return NRF_SUCCESS; } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/libraries/fstorage/nrf_fstorage_nvmc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/libraries/fstorage/nrf_fstorage_nvmc.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/libraries/fstorage/nrf_fstorage_nvmc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/libraries/fstorage/nrf_fstorage_nvmc.h index be3477556c..bacd7457e0 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/libraries/fstorage/nrf_fstorage_nvmc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/libraries/fstorage/nrf_fstorage_nvmc.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/mbed_lib.json b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/mbed_lib.json similarity index 57% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/mbed_lib.json rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/mbed_lib.json index 875a95489a..bf28c4cb5b 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/mbed_lib.json +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/mbed_lib.json @@ -2,7 +2,7 @@ "name": "softdevice_mbr", "target_overrides": { "*": { - "target.bootloader_img": "hex/s132_nrf52_5.0.0_mbr.hex" + "target.bootloader_img": "hex/mbr_nrf52_2.2.2_mbr.hex" } } } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_error.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_error.h similarity index 95% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_error.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_error.h index 6ae2c9b52a..c673beb10d 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_error.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_error.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -38,6 +38,16 @@ * */ /* Header guard */ + +#ifndef SOFTDEVICE_PRESENT + +/** + @defgroup nrf_error Global Error Codes + @{ + + @brief Global Error definitions +*/ + #ifndef NRF_ERROR_H__ #define NRF_ERROR_H__ @@ -45,8 +55,6 @@ extern "C" { #endif -/// @cond Make doxygen skip this file - /** @defgroup NRF_ERRORS_BASE Error Codes Base number definitions * @{ */ #define NRF_ERROR_BASE_NUM (0x0) ///< Global error base @@ -74,14 +82,14 @@ extern "C" { #define NRF_ERROR_INVALID_ADDR (NRF_ERROR_BASE_NUM + 16) ///< Bad Memory Address #define NRF_ERROR_BUSY (NRF_ERROR_BASE_NUM + 17) ///< Busy - #ifdef __cplusplus } #endif #endif // NRF_ERROR_H__ -/// @endcond /** @} */ + +#endif // SOFTDEVICE_PRESENT diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_nvic.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_nvic.c similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_nvic.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_nvic.c index 45803bf61a..8fa8b2beb9 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_nvic.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_nvic.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_nvic.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_nvic.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_nvic.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_nvic.h index 3ab15d66d1..58dd0274eb 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_nvic.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_nvic.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/radio_config/radio_config.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_sdm.h similarity index 82% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/radio_config/radio_config.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_sdm.h index 2b4cacd106..ec3f150fc6 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/radio_config/radio_config.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_sdm.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2009 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,22 +37,20 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -#ifndef RADIO_CONFIG_H -#define RADIO_CONFIG_H +#ifndef NRF_SDM_H__ +#define NRF_SDM_H__ #ifdef __cplusplus extern "C" { #endif -#define PACKET_BASE_ADDRESS_LENGTH (4UL) //!< Packet base address length field size in bytes -#define PACKET_STATIC_LENGTH (1UL) //!< Packet static length in bytes -#define PACKET_PAYLOAD_MAXSIZE (PACKET_STATIC_LENGTH) //!< Packet payload maximum size in bytes - -void radio_configure(void); +#define NRF_FAULT_ID_SD_RANGE_START 0x00000000 /**< SoftDevice ID range start. */ +#define NRF_FAULT_ID_APP_RANGE_START 0x00001000 /**< Application ID range start. */ #ifdef __cplusplus } #endif +#endif // NRF_SDM_H__ + -#endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_soc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_soc.c similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_soc.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_soc.c index 8b273d74bf..da25fbbd32 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_soc.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_soc.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_soc.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_soc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_soc.h index 3119ada366..c1c9d04416 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_soc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_soc.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf52_6.0.0_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf52_6.0.0_licence-agreement.txt new file mode 100644 index 0000000000..a71adee7b9 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf52_6.0.0_licence-agreement.txt @@ -0,0 +1,35 @@ +Copyright (c) 2007 - 2018, Nordic Semiconductor ASA +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form, except as embedded into a Nordic + Semiconductor ASA integrated circuit in a product or a software update for + such product, must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of Nordic Semiconductor ASA nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +4. This software, with or without modification, must only be used with a + Nordic Semiconductor ASA integrated circuit. + +5. Any software provided in binary form under this license must not be reverse + engineered, decompiled, modified and/or disassembled. + +THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf52_6.0.0_migration-document.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf52_6.0.0_migration-document.pdf new file mode 100644 index 0000000000..e88cd69f04 Binary files /dev/null and b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf52_6.0.0_migration-document.pdf differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf52_6.0.0_release-notes.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf52_6.0.0_release-notes.pdf new file mode 100644 index 0000000000..827c06bbfc Binary files /dev/null and b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/doc/s132_nrf52_6.0.0_release-notes.pdf differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_err.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_err.h similarity index 90% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_err.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_err.h index 1b0b9d4435..1b4820dc3d 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_err.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_err.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -65,7 +65,9 @@ extern "C" { #define BLE_ERROR_NOT_ENABLED (NRF_ERROR_STK_BASE_NUM+0x001) /**< @ref sd_ble_enable has not been called. */ #define BLE_ERROR_INVALID_CONN_HANDLE (NRF_ERROR_STK_BASE_NUM+0x002) /**< Invalid connection handle. */ #define BLE_ERROR_INVALID_ATTR_HANDLE (NRF_ERROR_STK_BASE_NUM+0x003) /**< Invalid attribute handle. */ -#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x004) /**< Invalid role. */ +#define BLE_ERROR_INVALID_ADV_HANDLE (NRF_ERROR_STK_BASE_NUM+0x004) /**< Invalid advertising handle. */ +#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x005) /**< Invalid role. */ +#define BLE_ERROR_BLOCKED_BY_OTHER_LINKS (NRF_ERROR_STK_BASE_NUM+0x006) /**< The attempt to change link settings failed due to the scheduling of other links. */ /** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gap.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gap.h similarity index 58% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gap.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gap.h index 13f7721c58..8b13816106 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gap.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gap.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -45,10 +45,13 @@ #ifndef BLE_GAP_H__ #define BLE_GAP_H__ - -#include "ble_types.h" -#include "ble_ranges.h" +#include #include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" #ifdef __cplusplus extern "C" { @@ -61,43 +64,45 @@ extern "C" { */ enum BLE_GAP_SVCS { - SD_BLE_GAP_ADDR_SET = BLE_GAP_SVC_BASE, /**< Set own Bluetooth Address. */ - SD_BLE_GAP_ADDR_GET, /**< Get own Bluetooth Address. */ - SD_BLE_GAP_WHITELIST_SET, /**< Set active whitelist. */ - SD_BLE_GAP_DEVICE_IDENTITIES_SET, /**< Set device identity list. */ - SD_BLE_GAP_PRIVACY_SET, /**< Set Privacy settings*/ - SD_BLE_GAP_PRIVACY_GET, /**< Get Privacy settings*/ - SD_BLE_GAP_ADV_DATA_SET, /**< Set Advertising Data. */ - SD_BLE_GAP_ADV_START, /**< Start Advertising. */ - SD_BLE_GAP_ADV_STOP, /**< Stop Advertising. */ - SD_BLE_GAP_CONN_PARAM_UPDATE, /**< Connection Parameter Update. */ - SD_BLE_GAP_DISCONNECT, /**< Disconnect. */ - SD_BLE_GAP_TX_POWER_SET, /**< Set TX Power. */ - SD_BLE_GAP_APPEARANCE_SET, /**< Set Appearance. */ - SD_BLE_GAP_APPEARANCE_GET, /**< Get Appearance. */ - SD_BLE_GAP_PPCP_SET, /**< Set PPCP. */ - SD_BLE_GAP_PPCP_GET, /**< Get PPCP. */ - SD_BLE_GAP_DEVICE_NAME_SET, /**< Set Device Name. */ - SD_BLE_GAP_DEVICE_NAME_GET, /**< Get Device Name. */ - SD_BLE_GAP_AUTHENTICATE, /**< Initiate Pairing/Bonding. */ - SD_BLE_GAP_SEC_PARAMS_REPLY, /**< Reply with Security Parameters. */ - SD_BLE_GAP_AUTH_KEY_REPLY, /**< Reply with an authentication key. */ - SD_BLE_GAP_LESC_DHKEY_REPLY, /**< Reply with an LE Secure Connections DHKey. */ - SD_BLE_GAP_KEYPRESS_NOTIFY, /**< Notify of a keypress during an authentication procedure. */ - SD_BLE_GAP_LESC_OOB_DATA_GET, /**< Get the local LE Secure Connections OOB data. */ - SD_BLE_GAP_LESC_OOB_DATA_SET, /**< Set the remote LE Secure Connections OOB data. */ - SD_BLE_GAP_ENCRYPT, /**< Initiate encryption procedure. */ - SD_BLE_GAP_SEC_INFO_REPLY, /**< Reply with Security Information. */ - SD_BLE_GAP_CONN_SEC_GET, /**< Obtain connection security level. */ - SD_BLE_GAP_RSSI_START, /**< Start reporting of changes in RSSI. */ - SD_BLE_GAP_RSSI_STOP, /**< Stop reporting of changes in RSSI. */ - SD_BLE_GAP_SCAN_START, /**< Start Scanning. */ - SD_BLE_GAP_SCAN_STOP, /**< Stop Scanning. */ - SD_BLE_GAP_CONNECT, /**< Connect. */ - SD_BLE_GAP_CONNECT_CANCEL, /**< Cancel ongoing connection procedure. */ - SD_BLE_GAP_RSSI_GET, /**< Get the last RSSI sample. */ - SD_BLE_GAP_PHY_UPDATE, /**< Initiate or respond to a PHY Update Procedure. */ - SD_BLE_GAP_DATA_LENGTH_UPDATE, /**< Initiate or respond to a Data Length Update Procedure. */ + SD_BLE_GAP_ADDR_SET = BLE_GAP_SVC_BASE, /**< Set own Bluetooth Address. */ + SD_BLE_GAP_ADDR_GET = BLE_GAP_SVC_BASE + 1, /**< Get own Bluetooth Address. */ + SD_BLE_GAP_WHITELIST_SET = BLE_GAP_SVC_BASE + 2, /**< Set active whitelist. */ + SD_BLE_GAP_DEVICE_IDENTITIES_SET = BLE_GAP_SVC_BASE + 3, /**< Set device identity list. */ + SD_BLE_GAP_PRIVACY_SET = BLE_GAP_SVC_BASE + 4, /**< Set Privacy settings*/ + SD_BLE_GAP_PRIVACY_GET = BLE_GAP_SVC_BASE + 5, /**< Get Privacy settings*/ + SD_BLE_GAP_ADV_SET_CONFIGURE = BLE_GAP_SVC_BASE + 6, /**< Configure an advertising set. */ + SD_BLE_GAP_ADV_START = BLE_GAP_SVC_BASE + 7, /**< Start Advertising. */ + SD_BLE_GAP_ADV_STOP = BLE_GAP_SVC_BASE + 8, /**< Stop Advertising. */ + SD_BLE_GAP_CONN_PARAM_UPDATE = BLE_GAP_SVC_BASE + 9, /**< Connection Parameter Update. */ + SD_BLE_GAP_DISCONNECT = BLE_GAP_SVC_BASE + 10, /**< Disconnect. */ + SD_BLE_GAP_TX_POWER_SET = BLE_GAP_SVC_BASE + 11, /**< Set TX Power. */ + SD_BLE_GAP_APPEARANCE_SET = BLE_GAP_SVC_BASE + 12, /**< Set Appearance. */ + SD_BLE_GAP_APPEARANCE_GET = BLE_GAP_SVC_BASE + 13, /**< Get Appearance. */ + SD_BLE_GAP_PPCP_SET = BLE_GAP_SVC_BASE + 14, /**< Set PPCP. */ + SD_BLE_GAP_PPCP_GET = BLE_GAP_SVC_BASE + 15, /**< Get PPCP. */ + SD_BLE_GAP_DEVICE_NAME_SET = BLE_GAP_SVC_BASE + 16, /**< Set Device Name. */ + SD_BLE_GAP_DEVICE_NAME_GET = BLE_GAP_SVC_BASE + 17, /**< Get Device Name. */ + SD_BLE_GAP_AUTHENTICATE = BLE_GAP_SVC_BASE + 18, /**< Initiate Pairing/Bonding. */ + SD_BLE_GAP_SEC_PARAMS_REPLY = BLE_GAP_SVC_BASE + 19, /**< Reply with Security Parameters. */ + SD_BLE_GAP_AUTH_KEY_REPLY = BLE_GAP_SVC_BASE + 20, /**< Reply with an authentication key. */ + SD_BLE_GAP_LESC_DHKEY_REPLY = BLE_GAP_SVC_BASE + 21, /**< Reply with an LE Secure Connections DHKey. */ + SD_BLE_GAP_KEYPRESS_NOTIFY = BLE_GAP_SVC_BASE + 22, /**< Notify of a keypress during an authentication procedure. */ + SD_BLE_GAP_LESC_OOB_DATA_GET = BLE_GAP_SVC_BASE + 23, /**< Get the local LE Secure Connections OOB data. */ + SD_BLE_GAP_LESC_OOB_DATA_SET = BLE_GAP_SVC_BASE + 24, /**< Set the remote LE Secure Connections OOB data. */ + SD_BLE_GAP_ENCRYPT = BLE_GAP_SVC_BASE + 25, /**< Initiate encryption procedure. */ + SD_BLE_GAP_SEC_INFO_REPLY = BLE_GAP_SVC_BASE + 26, /**< Reply with Security Information. */ + SD_BLE_GAP_CONN_SEC_GET = BLE_GAP_SVC_BASE + 27, /**< Obtain connection security level. */ + SD_BLE_GAP_RSSI_START = BLE_GAP_SVC_BASE + 28, /**< Start reporting of changes in RSSI. */ + SD_BLE_GAP_RSSI_STOP = BLE_GAP_SVC_BASE + 29, /**< Stop reporting of changes in RSSI. */ + SD_BLE_GAP_SCAN_START = BLE_GAP_SVC_BASE + 30, /**< Start Scanning. */ + SD_BLE_GAP_SCAN_STOP = BLE_GAP_SVC_BASE + 31, /**< Stop Scanning. */ + SD_BLE_GAP_CONNECT = BLE_GAP_SVC_BASE + 32, /**< Connect. */ + SD_BLE_GAP_CONNECT_CANCEL = BLE_GAP_SVC_BASE + 33, /**< Cancel ongoing connection procedure. */ + SD_BLE_GAP_RSSI_GET = BLE_GAP_SVC_BASE + 34, /**< Get the last RSSI sample. */ + SD_BLE_GAP_PHY_UPDATE = BLE_GAP_SVC_BASE + 35, /**< Initiate or respond to a PHY Update Procedure. */ + SD_BLE_GAP_DATA_LENGTH_UPDATE = BLE_GAP_SVC_BASE + 36, /**< Initiate or respond to a Data Length Update Procedure. */ + SD_BLE_GAP_QOS_CHANNEL_SURVEY_START = BLE_GAP_SVC_BASE + 37, /**< Start Quality of Service (QoS) channel survey module. */ + SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP = BLE_GAP_SVC_BASE + 38, /**< Stop Quality of Service (QoS) channel survey module. */ }; /**@brief GAP Event IDs. @@ -105,27 +110,29 @@ enum BLE_GAP_SVCS */ enum BLE_GAP_EVTS { - BLE_GAP_EVT_CONNECTED = BLE_GAP_EVT_BASE, /**< Connection established. \n See @ref ble_gap_evt_connected_t. */ - BLE_GAP_EVT_DISCONNECTED, /**< Disconnected from peer. \n See @ref ble_gap_evt_disconnected_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE, /**< Connection Parameters updated. \n See @ref ble_gap_evt_conn_param_update_t. */ - BLE_GAP_EVT_SEC_PARAMS_REQUEST, /**< Request to provide security parameters. \n Reply with @ref sd_ble_gap_sec_params_reply. \n See @ref ble_gap_evt_sec_params_request_t. */ - BLE_GAP_EVT_SEC_INFO_REQUEST, /**< Request to provide security information. \n Reply with @ref sd_ble_gap_sec_info_reply. \n See @ref ble_gap_evt_sec_info_request_t. */ - BLE_GAP_EVT_PASSKEY_DISPLAY, /**< Request to display a passkey to the user. \n In LESC Numeric Comparison, reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_passkey_display_t. */ - BLE_GAP_EVT_KEY_PRESSED, /**< Notification of a keypress on the remote device.\n See @ref ble_gap_evt_key_pressed_t */ - BLE_GAP_EVT_AUTH_KEY_REQUEST, /**< Request to provide an authentication key. \n Reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_auth_key_request_t. */ - BLE_GAP_EVT_LESC_DHKEY_REQUEST, /**< Request to calculate an LE Secure Connections DHKey. \n Reply with @ref sd_ble_gap_lesc_dhkey_reply. \n See @ref ble_gap_evt_lesc_dhkey_request_t */ - BLE_GAP_EVT_AUTH_STATUS, /**< Authentication procedure completed with status. \n See @ref ble_gap_evt_auth_status_t. */ - BLE_GAP_EVT_CONN_SEC_UPDATE, /**< Connection security updated. \n See @ref ble_gap_evt_conn_sec_update_t. */ - BLE_GAP_EVT_TIMEOUT, /**< Timeout expired. \n See @ref ble_gap_evt_timeout_t. */ - BLE_GAP_EVT_RSSI_CHANGED, /**< RSSI report. \n See @ref ble_gap_evt_rssi_changed_t. */ - BLE_GAP_EVT_ADV_REPORT, /**< Advertising report. \n See @ref ble_gap_evt_adv_report_t. */ - BLE_GAP_EVT_SEC_REQUEST, /**< Security Request. \n See @ref ble_gap_evt_sec_request_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, /**< Connection Parameter Update Request. \n Reply with @ref sd_ble_gap_conn_param_update. \n See @ref ble_gap_evt_conn_param_update_request_t. */ - BLE_GAP_EVT_SCAN_REQ_REPORT, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ - BLE_GAP_EVT_PHY_UPDATE_REQUEST, /**< PHY Update Request. \n Reply with @ref sd_ble_gap_phy_update. \n See @ref ble_gap_evt_phy_update_request_t. */ - BLE_GAP_EVT_PHY_UPDATE, /**< PHY Update Procedure is complete. \n See @ref ble_gap_evt_phy_update_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST, /**< Data Length Update Request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ + BLE_GAP_EVT_CONNECTED = BLE_GAP_EVT_BASE, + BLE_GAP_EVT_DISCONNECTED = BLE_GAP_EVT_BASE + 1, /**< Disconnected from peer. \n See @ref ble_gap_evt_disconnected_t. */ + BLE_GAP_EVT_CONN_PARAM_UPDATE = BLE_GAP_EVT_BASE + 2, /**< Connection Parameters updated. \n See @ref ble_gap_evt_conn_param_update_t. */ + BLE_GAP_EVT_SEC_PARAMS_REQUEST = BLE_GAP_EVT_BASE + 3, /**< Request to provide security parameters. \n Reply with @ref sd_ble_gap_sec_params_reply. \n See @ref ble_gap_evt_sec_params_request_t. */ + BLE_GAP_EVT_SEC_INFO_REQUEST = BLE_GAP_EVT_BASE + 4, /**< Request to provide security information. \n Reply with @ref sd_ble_gap_sec_info_reply. \n See @ref ble_gap_evt_sec_info_request_t. */ + BLE_GAP_EVT_PASSKEY_DISPLAY = BLE_GAP_EVT_BASE + 5, /**< Request to display a passkey to the user. \n In LESC Numeric Comparison, reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_passkey_display_t. */ + BLE_GAP_EVT_KEY_PRESSED = BLE_GAP_EVT_BASE + 6, /**< Notification of a keypress on the remote device.\n See @ref ble_gap_evt_key_pressed_t */ + BLE_GAP_EVT_AUTH_KEY_REQUEST = BLE_GAP_EVT_BASE + 7, /**< Request to provide an authentication key. \n Reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_auth_key_request_t. */ + BLE_GAP_EVT_LESC_DHKEY_REQUEST = BLE_GAP_EVT_BASE + 8, /**< Request to calculate an LE Secure Connections DHKey. \n Reply with @ref sd_ble_gap_lesc_dhkey_reply. \n See @ref ble_gap_evt_lesc_dhkey_request_t */ + BLE_GAP_EVT_AUTH_STATUS = BLE_GAP_EVT_BASE + 9, /**< Authentication procedure completed with status. \n See @ref ble_gap_evt_auth_status_t. */ + BLE_GAP_EVT_CONN_SEC_UPDATE = BLE_GAP_EVT_BASE + 10, /**< Connection security updated. \n See @ref ble_gap_evt_conn_sec_update_t. */ + BLE_GAP_EVT_TIMEOUT = BLE_GAP_EVT_BASE + 11, /**< Timeout expired. \n See @ref ble_gap_evt_timeout_t. */ + BLE_GAP_EVT_RSSI_CHANGED = BLE_GAP_EVT_BASE + 12, /**< RSSI report. \n See @ref ble_gap_evt_rssi_changed_t. */ + BLE_GAP_EVT_ADV_REPORT = BLE_GAP_EVT_BASE + 13, /**< Advertising report. \n See @ref ble_gap_evt_adv_report_t. */ + BLE_GAP_EVT_SEC_REQUEST = BLE_GAP_EVT_BASE + 14, /**< Security Request. \n See @ref ble_gap_evt_sec_request_t. */ + BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 15, /**< Connection Parameter Update Request. \n Reply with @ref sd_ble_gap_conn_param_update. \n See @ref ble_gap_evt_conn_param_update_request_t. */ + BLE_GAP_EVT_SCAN_REQ_REPORT = BLE_GAP_EVT_BASE + 16, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ + BLE_GAP_EVT_PHY_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 17, /**< PHY Update Request. \n Reply with @ref sd_ble_gap_phy_update. \n See @ref ble_gap_evt_phy_update_request_t. */ + BLE_GAP_EVT_PHY_UPDATE = BLE_GAP_EVT_BASE + 18, /**< PHY Update Procedure is complete. \n See @ref ble_gap_evt_phy_update_t. */ + BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 19, /**< Data Length Update Request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ + BLE_GAP_EVT_DATA_LENGTH_UPDATE = BLE_GAP_EVT_BASE + 20, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ + BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT = BLE_GAP_EVT_BASE + 21, /**< Channel survey report. \n See @ref ble_gap_evt_qos_channel_survey_report_t. */ + BLE_GAP_EVT_ADV_SET_TERMINATED = BLE_GAP_EVT_BASE + 22, /**< Advertising set terminated. \n See @ref ble_gap_evt_adv_set_terminated_t. */ }; /**@brief GAP Option IDs. @@ -133,13 +140,12 @@ enum BLE_GAP_EVTS */ enum BLE_GAP_OPTS { - BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ - BLE_GAP_OPT_LOCAL_CONN_LATENCY, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ - BLE_GAP_OPT_PASSKEY, /**< Set passkey. @ref ble_gap_opt_passkey_t */ - BLE_GAP_OPT_SCAN_REQ_REPORT, /**< Scan request report. @ref ble_gap_opt_scan_req_report_t */ - BLE_GAP_OPT_COMPAT_MODE_1, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */ - BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ - BLE_GAP_OPT_SLAVE_LATENCY_DISABLE, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ + BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ + BLE_GAP_OPT_LOCAL_CONN_LATENCY = BLE_GAP_OPT_BASE + 1, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ + BLE_GAP_OPT_PASSKEY = BLE_GAP_OPT_BASE + 2, /**< Set passkey. @ref ble_gap_opt_passkey_t */ + BLE_GAP_OPT_COMPAT_MODE_1 = BLE_GAP_OPT_BASE + 3, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */ + BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT = BLE_GAP_OPT_BASE + 4, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ + BLE_GAP_OPT_SLAVE_LATENCY_DISABLE = BLE_GAP_OPT_BASE + 5, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ }; /**@brief GAP Configuration IDs. @@ -148,8 +154,17 @@ enum BLE_GAP_OPTS */ enum BLE_GAP_CFGS { - BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ - BLE_GAP_CFG_DEVICE_NAME, /**< Device name configuration. */ + BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ + BLE_GAP_CFG_DEVICE_NAME = BLE_GAP_CFG_BASE + 1, /**< Device name configuration. */ +}; + +/**@brief GAP TX Power roles. + */ +enum BLE_GAP_TX_POWER_ROLES +{ + BLE_GAP_TX_POWER_ROLE_ADV = 1, /**< Advertiser role. */ + BLE_GAP_TX_POWER_ROLE_SCAN_INIT = 2, /**< Scanner and initiator role. */ + BLE_GAP_TX_POWER_ROLE_CONN = 3, /**< Connection role. */ }; /** @} */ @@ -169,7 +184,6 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_ROLES GAP Roles - * @note Not explicitly used in peripheral API, but will be relevant for central API. * @{ */ #define BLE_GAP_ROLE_INVALID 0x0 /**< Invalid Role. */ #define BLE_GAP_ROLE_PERIPH 0x1 /**< Peripheral Role. */ @@ -179,7 +193,6 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_TIMEOUT_SOURCES GAP Timeout sources * @{ */ -#define BLE_GAP_TIMEOUT_SRC_ADVERTISING 0x00 /**< Advertising timeout. */ #define BLE_GAP_TIMEOUT_SRC_SCAN 0x01 /**< Scanning timeout. */ #define BLE_GAP_TIMEOUT_SRC_CONN 0x02 /**< Connection timeout. */ #define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x03 /**< Authenticated payload timeout. */ @@ -188,10 +201,12 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_ADDR_TYPES GAP Address types * @{ */ -#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public address. */ -#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static address. */ +#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public (identity) address.*/ +#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static (identity) address. */ #define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE 0x02 /**< Random private resolvable address. */ #define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE 0x03 /**< Random private non-resolvable address. */ +#define BLE_GAP_ADDR_TYPE_ANONYMOUS 0x7F /**< An advertiser may advertise without its address. + This type of advertising is called anonymous. */ /**@} */ @@ -204,7 +219,6 @@ enum BLE_GAP_CFGS /** @brief BLE address length. */ #define BLE_GAP_ADDR_LEN (6) - /**@defgroup BLE_GAP_PRIVACY_MODES Privacy modes * @{ */ #define BLE_GAP_PRIVACY_MODE_OFF 0x00 /**< Device will send and accept its identity address for its own address. */ @@ -214,6 +228,31 @@ enum BLE_GAP_CFGS the peer IRK is exchanged, non-zero and added to the identity list. */ /**@} */ +/** @brief Invalid power level. */ +#define BLE_GAP_POWER_LEVEL_INVALID 127 + +/** @brief Advertising set handle not set. */ +#define BLE_GAP_ADV_SET_HANDLE_NOT_SET (0xFF) + +/** @brief The default number of advertising sets. */ +#define BLE_GAP_ADV_SET_COUNT_DEFAULT (1) + +/** @brief The maximum number of advertising sets supported by this SoftDevice. */ +#define BLE_GAP_ADV_SET_COUNT_MAX (1) + +/**@defgroup BLE_GAP_ADV_SET_DATA_SIZES Advertising data sizes. + * @{ */ +#define BLE_GAP_ADV_SET_DATA_SIZE_MAX (31) /**< Maximum data length for an advertising set. */ +/**@}. */ + +/** @brief Set ID not available in advertising report. */ +#define BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE 0xFF + +/**@defgroup BLE_GAP_EVT_ADV_SET_TERMINATED_REASON GAP Advertising Set Terminated reasons + * @{ */ +#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_TIMEOUT 0x01 /**< Timeout value reached. */ +#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_LIMIT_REACHED 0x02 /**< @ref ble_gap_adv_params_t::max_adv_evts was reached. */ +/**@} */ /**@defgroup BLE_GAP_AD_TYPE_DEFINITIONS GAP Advertising and Scan Response Data format * @note Found at https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm @@ -269,45 +308,111 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_ADV_INTERVALS GAP Advertising interval max and min * @{ */ -#define BLE_GAP_ADV_INTERVAL_MIN 0x0020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ -#define BLE_GAP_ADV_INTERVAL_MAX 0x4000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. */ +#define BLE_GAP_ADV_INTERVAL_MIN 0x000020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ +#define BLE_GAP_ADV_INTERVAL_MAX 0x004000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. + @note Support for values above @ref BLE_GAP_ADV_INTERVAL_MAX + is experimental. Values above 0xFFFFFF, i.e 10,485.759375 s + are not supported. */ /**@} */ /**@defgroup BLE_GAP_SCAN_INTERVALS GAP Scan interval max and min * @{ */ #define BLE_GAP_SCAN_INTERVAL_MIN 0x0004 /**< Minimum Scan interval in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_INTERVAL_MAX 0x4000 /**< Maximum Scan interval in 625 us units, i.e. 10.24 s. */ +#define BLE_GAP_SCAN_INTERVAL_MAX 0xFFFF /**< Maximum Scan interval in 625 us units, i.e. 40,959.375 s. */ /** @} */ /**@defgroup BLE_GAP_SCAN_WINDOW GAP Scan window max and min * @{ */ #define BLE_GAP_SCAN_WINDOW_MIN 0x0004 /**< Minimum Scan window in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_WINDOW_MAX 0x4000 /**< Maximum Scan window in 625 us units, i.e. 10.24 s. */ +#define BLE_GAP_SCAN_WINDOW_MAX 0xFFFF /**< Maximum Scan window in 625 us units, i.e. 40,959.375 s. */ /** @} */ /**@defgroup BLE_GAP_SCAN_TIMEOUT GAP Scan timeout max and min * @{ */ -#define BLE_GAP_SCAN_TIMEOUT_MIN 0x0001 /**< Minimum Scan timeout in seconds. */ -#define BLE_GAP_SCAN_TIMEOUT_MAX 0xFFFF /**< Maximum Scan timeout in seconds. */ +#define BLE_GAP_SCAN_TIMEOUT_MIN 0x0001 /**< Minimum Scan timeout in 10 ms units, i.e 10 ms. */ +#define BLE_GAP_SCAN_TIMEOUT_UNLIMITED 0x0000 /**< Continue to scan forever. */ /** @} */ - -/**@brief Maximum size of advertising data in octets. */ -#define BLE_GAP_ADV_MAX_SIZE (31) - +/**@defgroup BLE_GAP_SCAN_BUFFER_SIZE GAP Minimum scanner buffer size + * + * Scan buffers are used for storing advertising data received from an advertiser. + * If ble_gap_scan_params_t::extended is set to 0, @ref BLE_GAP_SCAN_BUFFER_MIN is the minimum scan buffer length. + * else the minimum scan buffer size is @ref BLE_GAP_SCAN_BUFFER_EXTENDED_MIN. + * @{ */ +#define BLE_GAP_SCAN_BUFFER_MIN (31) /**< Minimum data length for an + advertising set. */ +#define BLE_GAP_SCAN_BUFFER_MAX (31) /**< Maximum data length for an + advertising set. */ +#define BLE_GAP_SCAN_BUFFER_EXTENDED_MIN (255) /**< Minimum data length for an + extended advertising set. */ +#define BLE_GAP_SCAN_BUFFER_EXTENDED_MAX (1650) /**< Maximum data length for an + extended advertising set. + @note Extended scanning is only + supported as an experimental + feature in this SoftDevice. + The scanner will only receive + advertising data up to 31 bytes. */ +/** @} */ /**@defgroup BLE_GAP_ADV_TYPES GAP Advertising types + * + * Advertising types defined in Bluetooth Core Specification v5.0, Vol 6, Part B, Section 4.4.2. + * + * The maximum advertising data length is defined by @ref BLE_GAP_ADV_SET_DATA_SIZE_MAX. + * Note that some of the advertising types do not support advertising data. Non-scannable types do not support + * scan response data. + * * @{ */ -#define BLE_GAP_ADV_TYPE_ADV_IND 0x00 /**< Connectable undirected. */ -#define BLE_GAP_ADV_TYPE_ADV_DIRECT_IND 0x01 /**< Connectable directed. */ -#define BLE_GAP_ADV_TYPE_ADV_SCAN_IND 0x02 /**< Scannable undirected. */ -#define BLE_GAP_ADV_TYPE_ADV_NONCONN_IND 0x03 /**< Non connectable undirected. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED 0x01 /**< Connectable and scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE 0x02 /**< Connectable non-scannable directed advertising + events. Advertising interval is less that 3.75 ms. + Use this type for fast reconnections. + @note Advertising data is not supported. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED 0x03 /**< Connectable non-scannable directed advertising + events. + @note Advertising data is not supported. */ +#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x04 /**< Non-connectable scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x05 /**< Non-connectable non-scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED 0x06 /**< Connectable non-scannable undirected advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_DIRECTED 0x07 /**< Connectable non-scannable directed advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x08 /**< Non-connectable scannable undirected advertising + events using extended advertising PDUs. + @note Only scan response data is supported. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_DIRECTED 0x09 /**< Non-connectable scannable directed advertising + events using extended advertising PDUs. + @note Only scan response data is supported. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x0A /**< Non-connectable non-scannable undirected advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED 0x0B /**< Non-connectable non-scannable directed advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ /**@} */ - /**@defgroup BLE_GAP_ADV_FILTER_POLICIES GAP Advertising filter policies * @{ */ #define BLE_GAP_ADV_FP_ANY 0x00 /**< Allow scan requests and connect requests from any device. */ @@ -316,11 +421,34 @@ enum BLE_GAP_CFGS #define BLE_GAP_ADV_FP_FILTER_BOTH 0x03 /**< Filter both scan and connect requests with whitelist. */ /**@} */ - -/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values +/**@defgroup BLE_GAP_ADV_DATA_STATUS GAP Advertising data status * @{ */ -#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (180) /**< Maximum advertising time in limited discoverable mode (TGAP(lim_adv_timeout) = 180 s). */ -#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. */ +#define BLE_GAP_ADV_DATA_STATUS_COMPLETE 0x00 /**< All data in the advertising event have been received. */ +#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA 0x01 /**< More data to be received. */ +#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED 0x02 /**< Incomplete data. Buffer size insufficient to receive more. */ +#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MISSED 0x03 /**< Failed to receive the remaining data. */ +/**@} */ + +/**@defgroup BLE_GAP_SCAN_FILTER_POLICIES GAP Scanner filter policies + * @{ */ +#define BLE_GAP_SCAN_FP_ACCEPT_ALL 0x00 /**< Accept all advertising packets except directed advertising packets + not addressed to this device. */ +#define BLE_GAP_SCAN_FP_WHITELIST 0x01 /**< Accept advertising packets from devices in the whitelist except directed + packets not addressed to this device. */ +#define BLE_GAP_SCAN_FP_ALL_NOT_RESOLVED_DIRECTED 0x02 /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_ACCEPT_ALL. + In addition, accept directed advertising packets, where the advertiser's + address is a resolvable private address that cannot be resolved. */ +#define BLE_GAP_SCAN_FP_WHITELIST_NOT_RESOLVED_DIRECTED 0x03 /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_WHITELIST. + In addition, accept directed advertising packets, where the advertiser's + address is a resolvable private address that cannot be resolved. */ +/**@} */ + +/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values in 10 ms units + * @{ */ +#define BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX (128) /**< Maximum high duty advertising time in 10 ms units. Corresponds to 1.28 s. */ +#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (18000) /**< Maximum advertising time in 10 ms units corresponding to TGAP(lim_adv_timeout) = 180 s in limited discoverable mode. */ +#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. + For high duty cycle advertising, this corresponds to @ref BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX. */ /**@} */ @@ -425,6 +553,10 @@ enum BLE_GAP_CFGS #define BLE_GAP_PHY_1MBPS 0x01 /**< 1 Mbps PHY. */ #define BLE_GAP_PHY_2MBPS 0x02 /**< 2 Mbps PHY. */ #define BLE_GAP_PHY_CODED 0x04 /**< Coded PHY. */ +#define BLE_GAP_PHY_NOT_SET 0xFF /**< PHY is not configured. */ + +/**@brief Supported PHYs in connections, for scanning, and for advertising. */ +#define BLE_GAP_PHYS_SUPPORTED (BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS) /**< All PHYs except @ref BLE_GAP_PHY_CODED are supported. */ /**@} */ @@ -483,8 +615,8 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_EVENT_LENGTH GAP event length defines. * @{ */ -#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ -#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ +#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ +#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ /**@} */ @@ -494,8 +626,8 @@ enum BLE_GAP_CFGS #define BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT (3) /**< Default maximum number of connections concurrently acting as centrals. */ #define BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT (1) /**< Default number of SMP instances shared between all connections acting as centrals. */ #define BLE_GAP_ROLE_COUNT_COMBINED_MAX (20) /**< Maximum supported number of concurrent connections in the peripheral and central roles combined. */ -/**@} */ +/**@} */ /**@brief Automatic data length parameter. */ #define BLE_GAP_DATA_LENGTH_AUTO 0 @@ -510,19 +642,64 @@ enum BLE_GAP_CFGS * @{ */ #define BLE_GAP_SEC_MODE 0x00 /**< No key (may be used to reject). */ /**@} */ + +/**@brief The total number of channels in Bluetooth Low Energy. */ +#define BLE_GAP_CHANNEL_COUNT (40) + +/**@defgroup BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS Quality of Service (QoS) Channel survey interval defines + * @{ */ +#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS (0) /**< Continuous channel survey. */ +#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MIN_US (7500) /**< Minimum channel survey interval in microseconds (7.5 ms). */ +#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MAX_US (4000000) /**< Maximum channel survey interval in microseconds (4 s). */ + /**@} */ + /** @} */ /**@addtogroup BLE_GAP_STRUCTURES Structures * @{ */ +/**@brief Advertising event properties. */ +typedef struct +{ + uint8_t type; /**< Advertising type. See @ref BLE_GAP_ADV_TYPES. */ + uint8_t anonymous : 1; /**< Omit advertiser's address from all PDUs. + @note Anonymous advertising is only available for + @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED and + @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED. */ + uint8_t include_tx_power : 1; /**< Include TxPower set by @ref sd_ble_gap_tx_power_set in the extended header + of the advertising PDU. + @note TxPower can only be added to the extended header when @ref type is an extended advertising type. */ +} ble_gap_adv_properties_t; + + +/**@brief Advertising report type. */ +typedef struct +{ + uint16_t connectable : 1; /**< Connectable advertising event type. */ + uint16_t scannable : 1; /**< Scannable advertising event type. */ + uint16_t directed : 1; /**< Directed advertising event type. */ + uint16_t scan_response : 1; /**< Received a scan response. */ + uint16_t extended_pdu : 1; /**< Received an extended advertising set. */ + uint16_t status : 2; /**< Data status. See @ref BLE_GAP_ADV_DATA_STATUS. */ + uint16_t reserved : 9; /**< Reserved for future use. */ +} ble_gap_adv_report_type_t; + +/**@brief Advertising Auxiliary Pointer. */ +typedef struct +{ + uint16_t aux_offset; /**< Time offset from the beginning of advertising packet to the auxiliary packet in 100 us units. */ + uint8_t aux_phy; /**< Indicates the PHY on which the auxiliary advertising packet is sent. See @ref BLE_GAP_PHYS. */ +} ble_gap_aux_pointer_t; + /**@brief Bluetooth Low Energy address. */ typedef struct { uint8_t addr_id_peer : 1; /**< Only valid for peer addresses. Reference to peer in device identities list (as set with @ref sd_ble_gap_device_identities_set) when peer is using privacy. */ uint8_t addr_type : 7; /**< See @ref BLE_GAP_ADDR_TYPES. */ - uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format. */ + uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format. + addr is not used if addr_type is @ref BLE_GAP_ADDR_TYPE_ANONYMOUS. */ } ble_gap_addr_t; @@ -578,44 +755,146 @@ typedef struct } ble_gap_irk_t; -/**@brief Channel mask for RF channels used in advertising. */ -typedef struct -{ - uint8_t ch_37_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 37 */ - uint8_t ch_38_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 38 */ - uint8_t ch_39_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 39 */ -} ble_gap_adv_ch_mask_t; +/**@brief Channel mask (40 bits). + * Every channel is represented with a bit positioned as per channel index defined in Bluetooth Core Specification v5.0, + * Vol 6, Part B, Section 1.4.1. The LSB contained in array element 0 represents channel index 0, and bit 39 represents + * channel index 39. If a bit is set to 1, the channel is not used. + */ +typedef uint8_t ble_gap_ch_mask_t[5]; /**@brief GAP advertising parameters. */ typedef struct { - uint8_t type; /**< See @ref BLE_GAP_ADV_TYPES. */ - ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. - - When privacy is enabled and the local device use @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, the device identity list is searched for a matching - entry. If the local IRK for that device identity is set, the local IRK for that device will be used to generate the advertiser address field in the advertise packet. - - If type is @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this must be set to the targeted initiator. If the initiator is in the device identity list, - the peer IRK for that device will be used to generate the initiator address field in the ADV_DIRECT_IND packet. */ - uint8_t fp; /**< Filter Policy, see @ref BLE_GAP_ADV_FILTER_POLICIES. */ - uint16_t interval; /**< Advertising interval between 0x0020 and 0x4000 in 0.625 ms units (20 ms to 10.24 s), see @ref BLE_GAP_ADV_INTERVALS. - - If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this parameter must be set to 0 for high duty cycle directed advertising. - - If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, set @ref BLE_GAP_ADV_INTERVAL_MIN <= interval <= @ref BLE_GAP_ADV_INTERVAL_MAX for low duty cycle advertising.*/ - uint16_t timeout; /**< Advertising timeout between 0x0001 and 0x3FFF in seconds, 0x0000 disables timeout. See also @ref BLE_GAP_ADV_TIMEOUT_VALUES. If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this parameter must be set to 0 for High duty cycle directed advertising. */ - ble_gap_adv_ch_mask_t channel_mask; /**< Advertising channel mask. See @ref ble_gap_adv_ch_mask_t. */ + ble_gap_adv_properties_t properties; /**< The properties of the advertising events. */ + ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. + @note ble_gap_addr_t::addr_type cannot be + @ref BLE_GAP_ADDR_TYPE_ANONYMOUS. + - When privacy is enabled and the local device uses + @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, + the device identity list is searched for a matching entry. If + the local IRK for that device identity is set, the local IRK + for that device will be used to generate the advertiser address + field in the advertising packet. + - If @ref ble_gap_adv_properties_t::type is directed, this must be + set to the targeted scanner or initiator. If the peer address is + in the device identity list, the peer IRK for that device will be + used to generate @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE + target addresses used in the advertising event PDUs. */ + uint32_t interval; /**< Advertising interval in 625 us units. @sa BLE_GAP_ADV_INTERVALS. + @note If @ref ble_gap_adv_properties_t::type is set to + @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE + advertising, this parameter is ignored. */ + uint16_t duration; /**< Advertising duration in 10 ms units. When timeout is reached, + an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. + @sa BLE_GAP_ADV_TIMEOUT_VALUES. */ + uint8_t max_adv_evts; /**< Maximum advertising events that shall be sent prior to disabling + advertising. Setting the value to 0 disables the limitation. When + the count of advertising events specified by this parameter + (if not 0) is reached, advertising will be automatically stopped + and an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised + @note If @ref ble_gap_adv_properties_t::type is set to + @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE, + this parameter is ignored. + @note Setting max_adv_evts to a values not equal to 0 is only supported + as an experimental feature in this SoftDevice. */ + ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary and secondary advertising channels. + At least one of the primary channels, that is channel index 37-39, must be used. + Masking away secondary advertising channels is not supported. */ + uint8_t filter_policy; /**< Filter Policy. @sa BLE_GAP_ADV_FILTER_POLICIES. */ + uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising channel packets + are transmitted. If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS + will be used. + The only supported value by this SoftDevice is @ref BLE_GAP_PHY_1MBPS. */ + uint8_t secondary_phy; /**< Indicates the PHY on which the secondary advertising channel packets + are transmitted. + If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS will be used. + Valid values are + @ref BLE_GAP_PHY_1MBPS and @ref BLE_GAP_PHY_2MBPS. @ref BLE_GAP_PHY_CODED + is not supported by this SoftDevice. + If @ref ble_gap_adv_properties_t::type is an extended advertising type + and connectable, this is the PHY that will be used to establish a + connection and send AUX_ADV_IND packets on. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ + uint8_t set_id:4; /**< The advertising set identifier distinguishes this advertising set from other + advertising sets transmitted by this and other devices. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ + uint8_t scan_req_notification:1; /**< Enable scan request notifications for this advertising set. When a + scan request is received and the scanner address is allowed + by the filter policy, @ref BLE_GAP_EVT_SCAN_REQ_REPORT is raised. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is a non-scannable + advertising type. */ } ble_gap_adv_params_t; +/**@brief GAP advertising data buffers. + * + * The application must provide the buffers for advertisement. The memory shall reside in application RAM, and + * shall never be modified while advertising. The data shall be kept alive until either: + * - @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. + * - @ref BLE_GAP_EVT_CONNECTED is raised with @ref ble_gap_evt_connected_t::adv_handle set to the corresponding + * advertising handle. + * - Advertising is stopped. + * - Advertising data is changed. + * To update advertising data while advertising, provide new buffers to @ref sd_ble_gap_adv_set_configure. */ +typedef struct +{ + ble_data_t adv_data; /**< Advertising data. + @note + Advertising data can only be specified for a @ref ble_gap_adv_properties_t::type + that is allowed to contain advertising data. */ + ble_data_t scan_rsp_data; /**< Scan response data. + @note + Scan response data can only be specified for a @ref ble_gap_adv_properties_t::type + that is scannable. */ +} ble_gap_adv_data_t; + + /**@brief GAP scanning parameters. */ typedef struct { - uint8_t active : 1; /**< If 1, perform active scanning (scan requests). */ - uint8_t use_whitelist : 1; /**< If 1, filter advertisers using current active whitelist. */ - uint8_t adv_dir_report : 1; /**< If 1, also report directed advertisements where the initiator field is set to a private resolvable address, - even if the address did not resolve to an entry in the device identity list. A report will be generated - even if the peer is not in the whitelist. */ - uint16_t interval; /**< Scan interval between 0x0004 and 0x4000 in 0.625 ms units (2.5 ms to 10.24 s). */ - uint16_t window; /**< Scan window between 0x0004 and 0x4000 in 0.625 ms units (2.5 ms to 10.24 s). */ - uint16_t timeout; /**< Scan timeout between 0x0001 and 0xFFFF in seconds, 0x0000 disables timeout. */ + uint8_t extended : 1; /**< If 1, the scanner will accept extended advertising packets. + If set to 0, the scanner will not receive advertising packets + on secondary advertising channels, and will not be able + to receive long advertising PDUs. + @note Extended scanning is only supported as an experimental feature in this + SoftDevice. */ + uint8_t report_incomplete_evts : 1; /**< If 1, events of type @ref ble_gap_evt_adv_report_t may have + @ref ble_gap_adv_report_type_t::status set to + @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. + This parameter is ignored when used with @ref sd_ble_gap_connect + @note This may be used to abort receiving more packets from an extended + advertising event, and is only available for extended + scanning, see @ref sd_ble_gap_scan_start. + @note This feature is not supported by this SoftDevice. */ + uint8_t active : 1; /**< If 1, perform active scanning by sending scan requests. + This parameter is ignored when used with @ref sd_ble_gap_connect. */ + uint8_t filter_policy : 2; /**< Scanning filter policy. @sa BLE_GAP_SCAN_FILTER_POLICIES. + @note Only @ref BLE_GAP_SCAN_FP_ACCEPT_ALL and + @ref BLE_GAP_SCAN_FP_WHITELIST are valid when used with + @ref sd_ble_gap_connect */ + uint8_t scan_phys; /**< Bitfield of PHYs to scan on. If set to @ref BLE_GAP_PHY_AUTO, + scan_phys will default to @ref BLE_GAP_PHY_1MBPS. + - If @ref ble_gap_scan_params_t::extended is set to 0, the only + supported PHY is @ref BLE_GAP_PHY_1MBPS. + - When used with @ref sd_ble_gap_scan_start, + the bitfield indicates the PHYs the scanner will use for scanning + on primary advertising channels. The scanner will accept + @ref BLE_GAP_PHYS_SUPPORTED as secondary advertising channel PHYs. + - When used with @ref sd_ble_gap_connect, the + bitfield indicates the PHYs on where a connection may be initiated. + If scan_phys contains @ref BLE_GAP_PHY_1MBPS and/or @ref BLE_GAP_PHY_2MBPS, + the primary scan PHY is @ref BLE_GAP_PHY_1MBPS. */ + uint16_t interval; /**< Scan interval in 625 us units. @sa BLE_GAP_SCAN_INTERVALS. */ + uint16_t window; /**< Scan window in 625 us units. @sa BLE_GAP_SCAN_WINDOW. */ + uint16_t timeout; /**< Scan timeout in 10 ms units. @sa BLE_GAP_SCAN_TIMEOUT. */ + ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary and secondary advertising channels. + At least one of the primary channels, that is channel index 37-39, must be + set to 0. + Masking away secondary channels is not supported. */ } ble_gap_scan_params_t; @@ -746,6 +1025,12 @@ typedef struct and the address is the device's identity address. */ uint8_t role; /**< BLE role for this connection, see @ref BLE_GAP_ROLES */ ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ + uint8_t adv_handle; /**< Advertising handle in which advertising has ended. + This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ + ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated + advertising set. The advertising buffers provided in + @ref sd_ble_gap_adv_set_configure are now released. + This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ } ble_gap_evt_connected_t; @@ -916,28 +1201,80 @@ typedef struct typedef struct { uint8_t src; /**< Source of timeout event, see @ref BLE_GAP_TIMEOUT_SOURCES. */ + union + { + ble_data_t adv_report_buffer; /**< If source is set to @ref BLE_GAP_TIMEOUT_SRC_SCAN, the released + scan buffer is contained in this field. */ + } params; /**< Event Parameters. */ } ble_gap_evt_timeout_t; /**@brief Event structure for @ref BLE_GAP_EVT_RSSI_CHANGED. */ typedef struct { - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ + int8_t rssi; /**< Received Signal Strength Indication in dBm. */ + uint8_t ch_index; /**< Data Channel Index on which the Signal Strength is measured (0-36). */ } ble_gap_evt_rssi_changed_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_ADV_REPORT. */ +/**@brief Event structure for @ref BLE_GAP_EVT_ADV_SET_TERMINATED */ typedef struct { - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 - and the address is the device's identity address. */ - ble_gap_addr_t direct_addr; /**< Set when the scanner is unable to resolve the private resolvable address of the initiator - field of a directed advertisement packet and the scanner has been enabled to report this in @ref ble_gap_scan_params_t::adv_dir_report. */ - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ - uint8_t scan_rsp : 1; /**< If 1, the report corresponds to a scan response and the type field may be ignored. */ - uint8_t type : 2; /**< See @ref BLE_GAP_ADV_TYPES. Only valid if the scan_rsp field is 0. */ - uint8_t dlen : 5; /**< Advertising or scan response data length. */ - uint8_t data[BLE_GAP_ADV_MAX_SIZE]; /**< Advertising or scan response data. */ + uint8_t reason; /**< Reason for why the advertising set terminated. See + @ref BLE_GAP_EVT_ADV_SET_TERMINATED_REASON. */ + uint8_t adv_handle; /**< Advertising handle in which advertising has ended. */ + uint8_t num_completed_adv_events; /**< If @ref ble_gap_adv_params_t::max_adv_evts was not set to 0, + this field indicates the number of completed advertising events. */ + ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated + advertising set. The advertising buffers provided in + @ref sd_ble_gap_adv_set_configure are now released. */ +} ble_gap_evt_adv_set_terminated_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_ADV_REPORT. + * + * @note If @ref ble_gap_adv_report_type_t::status is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, + * not all fields in the advertising report may be available. + * + * @note When ble_gap_adv_report_type_t::status is not set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, + * scanning will be paused. To continue scanning, call @ref sd_ble_gap_scan_start. + */ +typedef struct +{ + ble_gap_adv_report_type_t type; /**< Advertising report type. See @ref ble_gap_adv_report_type_t. */ + ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr is resolved: + @ref ble_gap_addr_t::addr_id_peer is set to 1 and the address is the + peer's identity address. */ + ble_gap_addr_t direct_addr; /**< Contains the target address of the advertising event if + @ref ble_gap_adv_report_type_t::directed is set to 1. If the + SoftDevice was able to resolve the address, + @ref ble_gap_addr_t::addr_id_peer is set to 1 and the direct_addr + contains the local identity address. If the target address of the + advertising event is @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE, + and the SoftDevice was unable to resolve it, the application may try + to resolve this address to find out if the advertising event was + directed to us. */ + uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising packet was received on. + See @ref BLE_GAP_PHYS. */ + uint8_t secondary_phy; /**< Indicates the PHY on which the secondary advertising packet was received on. + See @ref BLE_GAP_PHYS. This field is to 0 if no packets where received on + a secondary advertising channel. */ + int8_t tx_power; /**< TX Power reported by the advertiser in the last packet header received. + This field is set to @ref BLE_GAP_POWER_LEVEL_INVALID if the + last received packet did not contain the Tx Power field. + @note TX Power is only included in extended advertising packets. */ + int8_t rssi; /**< Received Signal Strength Indication in dBm of the last packet received. */ + uint8_t ch_index; /**< Channel Index on which the last advertising packet is received (0-39). */ + uint8_t set_id; /**< Set ID of the received advertising data. Set ID is not present + if set to @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */ + uint16_t data_id:12; /**< The advertising data ID of the received advertising data. Data ID + is not present if @ref ble_gap_evt_adv_report_t::set_id is set to + @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */ + ble_data_t data; /**< Received advertising or scan response data. If + @ref ble_gap_adv_report_type_t::status is not set to + @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the data buffer provided + in @ref sd_ble_gap_scan_start is now released. */ + ble_gap_aux_pointer_t aux_pointer; /**< The offset and PHY of the next advertising packet in this extended advertising + event. @note This field is only set if @ref ble_gap_adv_report_type_t::status + is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. */ } ble_gap_evt_adv_report_t; @@ -961,11 +1298,13 @@ typedef struct /**@brief Event structure for @ref BLE_GAP_EVT_SCAN_REQ_REPORT. */ typedef struct { + uint8_t adv_handle; /**< Advertising handle for the advertising set which received the Scan Request */ int8_t rssi; /**< Received Signal Strength Indication in dBm. */ ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 and the address is the device's identity address. */ } ble_gap_evt_scan_req_report_t; + /**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST. */ typedef struct { @@ -979,6 +1318,15 @@ typedef struct } ble_gap_evt_data_length_update_t; +/**@brief Event structure for @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT. */ +typedef struct +{ + int8_t channel_energy[BLE_GAP_CHANNEL_COUNT]; /**< The measured energy on the Bluetooth Low Energy + channels, in dBm, indexed by Channel Index. + If no measurement is available for the given channel, channel_energy is set to + @ref BLE_GAP_POWER_LEVEL_INVALID. */ +} ble_gap_evt_qos_channel_survey_report_t; + /**@brief GAP event structure. */ typedef struct { @@ -999,6 +1347,7 @@ typedef struct ble_gap_evt_timeout_t timeout; /**< Timeout Event Parameters. */ ble_gap_evt_rssi_changed_t rssi_changed; /**< RSSI Event Parameters. */ ble_gap_evt_adv_report_t adv_report; /**< Advertising Report Event Parameters. */ + ble_gap_evt_adv_set_terminated_t adv_set_terminated; /**< Advertising Set Terminated Event Parameters. */ ble_gap_evt_sec_request_t sec_request; /**< Security Request Event Parameters. */ ble_gap_evt_conn_param_update_request_t conn_param_update_request; /**< Connection Parameter Update Parameters. */ ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report Parameters. */ @@ -1006,6 +1355,7 @@ typedef struct ble_gap_evt_phy_update_t phy_update; /**< PHY Update Parameters. */ ble_gap_evt_data_length_update_request_t data_length_update_request; /**< Data Length Update Request Event Parameters. */ ble_gap_evt_data_length_update_t data_length_update; /**< Data Length Update Event Parameters. */ + ble_gap_evt_qos_channel_survey_report_t qos_channel_survey_report; /**< Quality of Service (QoS) Channel Survey Report Parameters. */ } params; /**< Event Parameters. */ } ble_gap_evt_t; @@ -1038,21 +1388,27 @@ typedef struct * large. The maximum supported sum of concurrent connections is * @ref BLE_GAP_ROLE_COUNT_COMBINED_MAX. * @retval ::NRF_ERROR_INVALID_PARAM central_sec_count is larger than central_role_count. + * @retval ::NRF_ERROR_RESOURCES The adv_set_count is too large. The maximum + * supported advertising handles is + * @ref BLE_GAP_ADV_SET_COUNT_MAX. */ typedef struct { + uint8_t adv_set_count; /**< Maximum number of advertising sets. Default value is @ref BLE_GAP_ADV_SET_COUNT_DEFAULT. */ uint8_t periph_role_count; /**< Maximum number of connections concurrently acting as a peripheral. Default value is @ref BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT. */ uint8_t central_role_count; /**< Maximum number of connections concurrently acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT. */ uint8_t central_sec_count; /**< Number of SMP instances shared between all connections acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT. */ + uint8_t qos_channel_survey_role_available:1; /**< If set, the Quality of Service (QoS) channel survey module is available to the + application using @ref sd_ble_gap_qos_channel_survey_start. */ } ble_gap_cfg_role_count_t; /** * @brief Device name and its properties, set with @ref sd_ble_cfg_set. * - * @note If the device name is not configured, the default device name will be @ref - * BLE_GAP_DEVNAME_DEFAULT, the maximum device name length will be @ref - * BLE_GAP_DEVNAME_DEFAULT_LEN, vloc will be set to @ref BLE_GATTS_VLOC_STACK and the device name + * @note If the device name is not configured, the default device name will be + * @ref BLE_GAP_DEVNAME_DEFAULT, the maximum device name length will be + * @ref BLE_GAP_DEVNAME_DEFAULT_LEN, vloc will be set to @ref BLE_GATTS_VLOC_STACK and the device name * will have no write access. * * @note If @ref max_len is more than @ref BLE_GAP_DEVNAME_DEFAULT_LEN and vloc is set to @ref BLE_GATTS_VLOC_STACK, @@ -1094,24 +1450,26 @@ typedef union /**@brief Channel Map option. - * Used with @ref sd_ble_opt_get to get the current channel map - * or @ref sd_ble_opt_set to set a new channel map. When setting the - * channel map, it applies to all current and future connections. When getting the - * current channel map, it applies to a single connection and the connection handle - * must be supplied. * - * @note Setting the channel map may take some time, depending on connection parameters. - * The time taken may be different for each connection and the get operation will - * return the previous channel map until the new one has taken effect. + * @details Used with @ref sd_ble_opt_get to get the current channel map + * or @ref sd_ble_opt_set to set a new channel map. When setting the + * channel map, it applies to all current and future connections. When getting the + * current channel map, it applies to a single connection and the connection handle + * must be supplied. * - * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. - * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. + * @note Setting the channel map may take some time, depending on connection parameters. + * The time taken may be different for each connection and the get operation will + * return the previous channel map until the new one has taken effect. + * + * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. + * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. * * @retval ::NRF_SUCCESS Get or set successful. + * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: + * - Less then two bits in @ref ch_map are set. + * - Bits for primary advertising channels (37-39) are set. * @retval ::NRF_ERROR_BUSY Channel map was set again before enough time had passed. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied for get. - * @retval ::NRF_ERROR_NOT_SUPPORTED Returned by sd_ble_opt_set in peripheral-only SoftDevices. * */ typedef struct @@ -1123,21 +1481,21 @@ typedef struct /**@brief Local connection latency option. * - * Local connection latency is a feature which enables the slave to improve - * current consumption by ignoring the slave latency set by the peer. The - * local connection latency can only be set to a multiple of the slave latency, - * and cannot be longer than half of the supervision timeout. + * @details Local connection latency is a feature which enables the slave to improve + * current consumption by ignoring the slave latency set by the peer. The + * local connection latency can only be set to a multiple of the slave latency, + * and cannot be longer than half of the supervision timeout. * - * Used with @ref sd_ble_opt_set to set the local connection latency. The - * @ref sd_ble_opt_get is not supported for this option, but the actual - * local connection latency (unless set to NULL) is set as a return parameter - * when setting the option. + * @details Used with @ref sd_ble_opt_set to set the local connection latency. The + * @ref sd_ble_opt_get is not supported for this option, but the actual + * local connection latency (unless set to NULL) is set as a return parameter + * when setting the option. * - * @note The latency set will be truncated down to the closest slave latency event - * multiple, or the nearest multiple before half of the supervision timeout. + * @note The latency set will be truncated down to the closest slave latency event + * multiple, or the nearest multiple before half of the supervision timeout. * - * @note The local connection latency is disabled by default, and needs to be enabled for new - * connections and whenever the connection is updated. + * @note The local connection latency is disabled by default, and needs to be enabled for new + * connections and whenever the connection is updated. * * @retval ::NRF_SUCCESS Set successfully. * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. @@ -1152,8 +1510,9 @@ typedef struct /**@brief Disable slave latency * - * Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. - * When disabled, the peripheral will ignore the slave_latency set by the central. + * @details Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection + * (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. When disabled, the + * peripheral will ignore the slave_latency set by the central. * * @note Shall only be called on peripheral links. * @@ -1169,13 +1528,13 @@ typedef struct /**@brief Passkey Option. * - * Structure containing the passkey to be used during pairing. This can be used with @ref - * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication - * instead of generating a random one. + * @details Structure containing the passkey to be used during pairing. This can be used with @ref + * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication + * instead of generating a random one. * - * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. + * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. * - * @note @ref sd_ble_opt_get is not supported for this option. + * @note @ref sd_ble_opt_get is not supported for this option. * */ typedef struct @@ -1184,35 +1543,17 @@ typedef struct } ble_gap_opt_passkey_t; -/**@brief Scan request report option. - * - * This can be used with @ref sd_ble_opt_set to make the SoftDevice send - * @ref BLE_GAP_EVT_SCAN_REQ_REPORT events. - * - * @note Due to the limited space reserved for scan request report events, - * not all received scan requests will be reported. - * - * @note If whitelisting is used, only whitelisted requests are reported. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_STATE When advertising is ongoing while the option is set. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable scan request reports. */ -} ble_gap_opt_scan_req_report_t; - /**@brief Compatibility mode 1 option. * - * This can be used with @ref sd_ble_opt_set to enable and disable - * compatibility mode 1. Compatibility mode 1 is disabled by default. + * @details This can be used with @ref sd_ble_opt_set to enable and disable + * compatibility mode 1. Compatibility mode 1 is disabled by default. * - * @note Compatibility mode 1 enables interoperability with devices that do not support a value of - * 0 for the WinOffset parameter in the Link Layer CONNECT_IND packet. This applies to a - * limited set of legacy peripheral devices from another vendor. Enabling this compatibility - * mode will only have an effect if the local device will act as a central device and - * initiate a connection to a peripheral device. In that case it may lead to the connection - * creation taking up to one connection interval longer to complete for all connections. + * @note Compatibility mode 1 enables interoperability with devices that do not support a value of + * 0 for the WinOffset parameter in the Link Layer CONNECT_IND packet. This applies to a + * limited set of legacy peripheral devices from another vendor. Enabling this compatibility + * mode will only have an effect if the local device will act as a central device and + * initiate a connection to a peripheral device. In that case it may lead to the connection + * creation taking up to one connection interval longer to complete for all connections. * * @retval ::NRF_SUCCESS Set successfully. * @retval ::NRF_ERROR_INVALID_STATE When connection creation is ongoing while mode 1 is set. @@ -1222,20 +1563,21 @@ typedef struct uint8_t enable : 1; /**< Enable compatibility mode 1.*/ } ble_gap_opt_compat_mode_1_t; + /**@brief Authenticated payload timeout option. * - * This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other - * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. + * @details This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other + * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. * - * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated - * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted - * link. + * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated + * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted + * link. * - * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance - * to reset the timer. In addition the stack will try to prioritize running of LE ping over other - * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects - * on other activities, it is recommended to use high timeout values. - * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). + * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance + * to reset the timer. In addition the stack will try to prioritize running of LE ping over other + * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects + * on other activities, it is recommended to use high timeout values. + * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). * * @retval ::NRF_SUCCESS Set successfully. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. auth_payload_timeout was outside of allowed range. @@ -1247,14 +1589,12 @@ typedef struct uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit, see @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT. */ } ble_gap_opt_auth_payload_timeout_t; - /**@brief Option structure for GAP options. */ typedef union { ble_gap_opt_ch_map_t ch_map; /**< Parameters for the Channel Map option. */ ble_gap_opt_local_conn_latency_t local_conn_latency; /**< Parameters for the Local connection latency option */ ble_gap_opt_passkey_t passkey; /**< Parameters for the Passkey option.*/ - ble_gap_opt_scan_req_report_t scan_req_report; /**< Parameters for the scan request report option.*/ ble_gap_opt_compat_mode_1_t compat_mode_1; /**< Parameters for the compatibility mode 1 option.*/ ble_gap_opt_auth_payload_timeout_t auth_payload_timeout; /**< Parameters for the authenticated payload timeout option.*/ ble_gap_opt_slave_latency_disable_t slave_latency_disable; /**< Parameters for the Disable slave latency option */ @@ -1404,37 +1744,51 @@ SVCALL(SD_BLE_GAP_PRIVACY_SET, uint32_t, sd_ble_gap_privacy_set(ble_gap_privacy_ SVCALL(SD_BLE_GAP_PRIVACY_GET, uint32_t, sd_ble_gap_privacy_get(ble_gap_privacy_params_t *p_privacy_params)); -/**@brief Set, clear or update advertising and scan response data. +/**@brief Configure an advertising set. Set, clear or update advertising and scan response data. * * @note The format of the advertising data will be checked by this call to ensure interoperability. * Limitations imposed by this API call to the data provided include having a flags data type in the scan response data and * duplicating the local name in the advertising data and scan response data. * - * @note To clear the advertising data and set it to a 0-length packet, simply provide a valid pointer (p_data/p_sr_data) with its corresponding - * length (dlen/srdlen) set to 0. - * - * @note The call will fail if p_data and p_sr_data are both NULL since this would have no effect. + * @note In order to update advertising data while advertising, new advertising buffers must be provided. * * @mscs * @mmsc{@ref BLE_GAP_ADV_MSC} * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * - * @param[in] p_data Raw data to be placed in advertising packet. If NULL, no changes are made to the current advertising packet data. - * @param[in] dlen Data length for p_data. Max size: @ref BLE_GAP_ADV_MAX_SIZE octets. Should be 0 if p_data is NULL, can be 0 if p_data is not NULL. - * @param[in] p_sr_data Raw data to be placed in scan response packet. If NULL, no changes are made to the current scan response packet data. - * @param[in] srdlen Data length for p_sr_data. Max size: @ref BLE_GAP_ADV_MAX_SIZE octets. Should be 0 if p_sr_data is NULL, can be 0 if p_data is not NULL. + * @param[in,out] p_adv_handle Provide a pointer to a handle containing @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to configure + * a new advertising set. On success, a new handle is then returned through the pointer. + * Provide a pointer to an existing advertising handle to configure an existing advertising set. + * @param[in] p_adv_data Advertising data. If set to NULL, no advertising data will be used. See @ref ble_gap_adv_data_t. + * @param[in] p_adv_params Advertising parameters. When this function is used to update advertising data while advertising, + * this parameter must be NULL. See @ref ble_gap_adv_params_t. * - * @retval ::NRF_SUCCESS Advertising data successfully updated or cleared. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, both p_data and p_sr_data cannot be NULL. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. - * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied, check the advertising data format specification. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data type. + * @retval ::NRF_SUCCESS Advertising set successfully configured. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: + * - Invalid advertising data configuration specified. See @ref ble_gap_adv_data_t. + * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. + * - Use of whitelist requested but whitelist has not been set, + * see @ref sd_ble_gap_whitelist_set. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR ble_gap_adv_params_t::p_peer_addr is invalid. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. + * - It is invalid to provide non-NULL advertising set parameters while advertising. + * - It is invalid to provide the same data buffers while advertising. To update + * advertising data, provide new advertising buffers. + * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE The provided advertising handle was not found. Use @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to + * configure a new advertising handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. + * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied. Check the advertising data format specification + * given in Bluetooth Specification Version 5.0, Volume 3, Part C, Chapter 11. + * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data length or advertising parameter configuration. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to configure a new advertising handle. Update an + * existing advertising handle instead. * @retval ::BLE_ERROR_GAP_UUID_LIST_MISMATCH Invalid UUID list supplied. */ -SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const *p_data, uint8_t dlen, uint8_t const *p_sr_data, uint8_t srdlen)); +SVCALL(SD_BLE_GAP_ADV_SET_CONFIGURE, uint32_t, sd_ble_gap_adv_set_configure(uint8_t *p_adv_handle, ble_gap_adv_data_t const *p_adv_data, ble_gap_adv_params_t const *p_adv_params)); /**@brief Start advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). @@ -1443,7 +1797,8 @@ SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const * * @events * @event{@ref BLE_GAP_EVT_CONNECTED, Generated after connection has been established through connectable advertising.} - * @event{@ref BLE_GAP_EVT_TIMEOUT, Advertisement has timed out.} + * @event{@ref BLE_GAP_EVT_ADV_SET_TERMINATED, Advertising set has terminated.} + * @event{@ref BLE_GAP_EVT_SCAN_REQ_REPORT, A scan request was received.} * @endevents * * @mscs @@ -1453,23 +1808,31 @@ SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * - * @param[in] p_adv_params Pointer to advertising parameters structure. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. If - * @ref ble_gap_adv_params_t::type is @ref BLE_GAP_ADV_TYPE_ADV_NONCONN_IND, - * this is ignored. + * @param[in] adv_handle Advertising handle to advertise on, received from @ref sd_ble_gap_adv_set_configure. + * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or + * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. For non-connectable + * advertising, this is ignored. * - * @retval ::NRF_SUCCESS The BLE stack has started advertising. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check the accepted ranges and limits. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Bluetooth address supplied. - * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Observer) and try again + * @retval ::NRF_SUCCESS The BLE stack has started advertising. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. adv_handle is not configured or already advertising. + * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. Configure a new adveriting handle with @ref sd_ble_gap_adv_set_configure. + * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: + * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. + * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. + * @retval ::NRF_ERROR_RESOURCES Either: + * - adv_handle is configured with connectable advertising, but the event_length parameter + * associated with conn_cfg_tag is too small to be able to establish a connection on + * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. + * - Not enough BLE role slots available. + Stop one or more currently active roles (Central, Peripheral, Broadcaster or Observer) and try again. + * - p_adv_params is configured with connectable advertising, but the event_length parameter + * associated with conn_cfg_tag is too small to be able to establish a connection on + * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. */ -SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(ble_gap_adv_params_t const *p_adv_params, uint8_t conn_cfg_tag)); +SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(uint8_t adv_handle, uint8_t conn_cfg_tag)); /**@brief Stop advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). @@ -1479,10 +1842,13 @@ SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(ble_gap_adv_params_t * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * + * @param[in] adv_handle The advertising handle that should stop advertising. + * * @retval ::NRF_SUCCESS The BLE stack has stopped advertising. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation (most probably not in advertising state). + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Invalid advertising handle. + * @retval ::NRF_ERROR_INVALID_STATE The advertising handle is not advertising. */ -SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(void)); +SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(uint8_t adv_handle)); @@ -1549,12 +1915,27 @@ SVCALL(SD_BLE_GAP_DISCONNECT, uint32_t, sd_ble_gap_disconnect(uint16_t conn_hand /**@brief Set the radio's transmit power. * - * @param[in] tx_power Radio transmit power in dBm (accepted values are -40, -20, -16, -12, -8, -4, 0, 3, and 4 dBm). + * @param[in] role The role to set the transmit power for, see @ref BLE_GAP_TX_POWER_ROLES for + * possible roles. + * @param[in] handle The handle parameter is interpreted depending on role: + * - If role is @ref BLE_GAP_TX_POWER_ROLE_CONN, this value is the specific connection handle. + * - If role is @ref BLE_GAP_TX_POWER_ROLE_ADV, the advertising set identified with the advertising handle, + * will use the specified transmit power, and include it in the advertising packet headers if + * @ref ble_gap_adv_properties_t::include_tx_power set. + * - For all other roles handle is ignored. + * @param[in] tx_power Radio transmit power in dBm (see note for accepted values). + * + * @note Supported tx_power values: -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +3dBm and +4dBm. + * @note The initiator will have the same transmit power as the scanner. + * @note When a connection is created it will inherit the transmit power from the initiator or + * advertiser leading to the connection. * * @retval ::NRF_SUCCESS Successfully changed the transmit power. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. */ -SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(int8_t tx_power)); +SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(uint8_t role, uint16_t handle, int8_t tx_power)); /**@brief Set GAP Appearance value. @@ -1775,6 +2156,7 @@ SVCALL(SD_BLE_GAP_SEC_PARAMS_REPLY, uint32_t, sd_ble_gap_sec_params_reply(uint16 */ SVCALL(SD_BLE_GAP_AUTH_KEY_REPLY, uint32_t, sd_ble_gap_auth_key_reply(uint16_t conn_handle, uint8_t key_type, uint8_t const *p_key)); + /**@brief Reply with an LE Secure connections DHKey. * * @details This function is only used to reply to a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. @@ -1808,6 +2190,7 @@ SVCALL(SD_BLE_GAP_AUTH_KEY_REPLY, uint32_t, sd_ble_gap_auth_key_reply(uint16_t c */ SVCALL(SD_BLE_GAP_LESC_DHKEY_REPLY, uint32_t, sd_ble_gap_lesc_dhkey_reply(uint16_t conn_handle, ble_gap_lesc_dhkey_t const *p_dhkey)); + /**@brief Notify the peer of a local keypress. * * @mscs @@ -1826,6 +2209,7 @@ SVCALL(SD_BLE_GAP_LESC_DHKEY_REPLY, uint32_t, sd_ble_gap_lesc_dhkey_reply(uint16 */ SVCALL(SD_BLE_GAP_KEYPRESS_NOTIFY, uint32_t, sd_ble_gap_keypress_notify(uint16_t conn_handle, uint8_t kp_not)); + /**@brief Generate a set of OOB data to send to a peer out of band. * * @note The @ref ble_gap_addr_t included in the OOB data returned will be the currently active one (or, if a connection has already been established, @@ -1836,7 +2220,7 @@ SVCALL(SD_BLE_GAP_KEYPRESS_NOTIFY, uint32_t, sd_ble_gap_keypress_notify(uint16_t * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} * @endmscs * - * @param[in] conn_handle Connection handle. Can be BLE_CONN_HANDLE_INVALID if a BLE connection has not been established yet. + * @param[in] conn_handle Connection handle. Can be @ref BLE_CONN_HANDLE_INVALID if a BLE connection has not been established yet. * @param[in] p_pk_own LE Secure Connections local P-256 Public Key. * @param[out] p_oobd_own The OOB data to be sent out of band to a peer. * @@ -1874,6 +2258,7 @@ SVCALL(SD_BLE_GAP_LESC_OOB_DATA_GET, uint32_t, sd_ble_gap_lesc_oob_data_get(uint */ SVCALL(SD_BLE_GAP_LESC_OOB_DATA_SET, uint32_t, sd_ble_gap_lesc_oob_data_set(uint16_t conn_handle, ble_gap_lesc_oob_data_t const *p_oobd_own, ble_gap_lesc_oob_data_t const *p_oobd_peer)); + /**@brief Initiate GAP Encryption procedure. * * @details In the central role, this function will initiate the encryption procedure using the encryption information provided. @@ -1958,7 +2343,7 @@ SVCALL(SD_BLE_GAP_CONN_SEC_GET, uint32_t, sd_ble_gap_conn_sec_get(uint16_t conn_ * @param[in] skip_count Number of RSSI samples with a change of threshold_dbm or more before sending a new @ref BLE_GAP_EVT_RSSI_CHANGED event. * * @retval ::NRF_SUCCESS Successfully activated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress. Invalid state to perform operation. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is already ongoing. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. */ SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_handle, uint8_t threshold_dbm, uint8_t skip_count)); @@ -1977,7 +2362,7 @@ SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_hand * @param[in] conn_handle Connection handle. * * @retval ::NRF_SUCCESS Successfully deactivated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. */ SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle)); @@ -1987,24 +2372,44 @@ SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle * * @ref sd_ble_gap_rssi_start must be called to start reporting RSSI before using this function. @ref NRF_ERROR_NOT_FOUND * will be returned until RSSI was sampled for the first time after calling @ref sd_ble_gap_rssi_start. - * * @mscs * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} * @endmscs * * @param[in] conn_handle Connection handle. * @param[out] p_rssi Pointer to the location where the RSSI measurement shall be stored. + * @param[out] p_ch_index Pointer to the location where Channel Index for the RSSI measurement shall be stored. * * @retval ::NRF_SUCCESS Successfully read the RSSI. * @retval ::NRF_ERROR_NOT_FOUND No sample is available. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing, or disconnection in progress. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. */ -SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi)); +SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi, uint8_t *p_ch_index)); -/**@brief Start scanning (GAP Discovery procedure, Observer Procedure). +/**@brief Start or continue scanning (GAP Discovery procedure, Observer Procedure). + * + * @note A call to this function will require the application to keep the memory pointed by + * p_adv_report_buffer alive until the buffer is released. The buffer is released when the scanner is stopped + * or when this function is called with another buffer. + * + * @note The scanner will automatically stop in the following cases: + * - @ref sd_ble_gap_scan_stop is called. + * - @ref sd_ble_gap_connect is called. + * - A @ref BLE_GAP_EVT_TIMEOUT with source set to @ref BLE_GAP_TIMEOUT_SRC_SCAN is received. + * - When a @ref BLE_GAP_EVT_ADV_REPORT event is received and @ref ble_gap_adv_report_type_t::status is not set to + * @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. In this case scanning is only paused to let the application + * access received data. The application must call this function to continue scanning, or call @ref sd_ble_gap_scan_stop + * to stop scanning. + * + * @note If a @ref BLE_GAP_EVT_ADV_REPORT event is received with @ref ble_gap_adv_report_type_t::status set to + * @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the scanner will continue scanning, and the application will + * receive more reports from this advertising event. The following reports will include the old and new received data. + * The application can stop the scanner from receiving more packets from this advertising event by calling this function. + * This might be useful when receiving data from extended advertising events where @ref ble_gap_evt_adv_report_t::aux_pointer + * is large. * * @events * @event{@ref BLE_GAP_EVT_ADV_REPORT, An advertising or scan response packet has been received.} @@ -2016,19 +2421,34 @@ SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * - * @param[in] p_scan_params Pointer to scan parameters structure. + * @param[in] p_scan_params Pointer to scan parameters structure. When this function is used to continue + * scanning, this parameter must be NULL. + * @param[in] p_adv_report_buffer Pointer to buffer used to store incoming advertising data. + * The memory pointed to should be kept alive until the scanning is stopped. + * See @ref BLE_GAP_SCAN_BUFFER_SIZE for minimum and maximum buffer size. + * If the scanner receives advertising data larger than can be stored in the buffer, + * a @ref BLE_GAP_EVT_ADV_REPORT will be raised with @ref ble_gap_adv_report_type_t::status + * set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED. * * @retval ::NRF_SUCCESS Successfully initiated scanning procedure. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - Scanning is already ongoing and p_scan_params was not NULL + * - Scanning is not running and p_scan_params was NULL. + * - The scanner has timed out when this function is called to continue scanning. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. See @ref ble_gap_scan_params_t. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported parameters supplied. See @ref ble_gap_scan_params_t. + * @retval ::NRF_ERROR_INVALID_LENGTH The provided buffer length is invalid. See @ref BLE_GAP_SCAN_BUFFER_MIN. * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. */ -SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params)); +SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params, ble_data_t const * p_adv_report_buffer)); /**@brief Stop scanning (GAP Discovery procedure, Observer Procedure). + * + * @note The buffer provided in @ref sd_ble_gap_scan_start is released. * * @mscs * @mmsc{@ref BLE_GAP_SCAN_MSC} @@ -2036,7 +2456,7 @@ SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_param * @endmscs * * @retval ::NRF_SUCCESS Successfully stopped scanning procedure. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation (most probably not in scanning state). + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Not in the scanning state. */ SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); @@ -2052,11 +2472,12 @@ SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC} * @endmscs * - * @param[in] p_peer_addr Pointer to peer address. If the use_whitelist bit is set in @ref ble_gap_scan_params_t, then this is ignored. + * @param[in] p_peer_addr Pointer to peer identity address. If @ref ble_gap_scan_params_t::filter_policy is set to use + * whitelist, then p_peer_addr is ignored. * @param[in] p_scan_params Pointer to scan parameters structure. * @param[in] p_conn_params Pointer to desired connection parameters. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. + * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or + * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. * * @retval ::NRF_SUCCESS Successfully initiated connection procedure. * @retval ::NRF_ERROR_INVALID_ADDR Invalid parameter(s) pointer supplied. @@ -2064,12 +2485,18 @@ SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); * - Invalid parameter(s) in p_scan_params or p_conn_params. * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. * - Peer address was not present in the device identity list, see @ref sd_ble_gap_device_identities_set. + * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. * @retval ::NRF_ERROR_INVALID_STATE The SoftDevice is in an invalid state to perform this operation. This may be due to an * existing locally initiated connect procedure, which must complete before initiating again. * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Peer address. * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again + * @retval ::NRF_ERROR_RESOURCES Either: + * - Not enough BLE role slots available. + * Stop one or more currently active roles (Central, Peripheral or Observer) and try again. + * - The event_length parameter associated with conn_cfg_tag is too small to be able to + * establish a connection on the selected @ref ble_gap_scan_params_t::scan_phys. + * Use @ref sd_ble_cfg_set to increase the event length. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. */ SVCALL(SD_BLE_GAP_CONNECT, uint32_t, sd_ble_gap_connect(ble_gap_addr_t const *p_peer_addr, ble_gap_scan_params_t const *p_scan_params, ble_gap_conn_params_t const *p_conn_params, uint8_t conn_cfg_tag)); @@ -2088,16 +2515,33 @@ SVCALL(SD_BLE_GAP_CONNECT_CANCEL, uint32_t, sd_ble_gap_connect_cancel(void)); /**@brief Initiate or respond to a PHY Update Procedure * - * @details This function is used to initiate or respond to a PHY Update Procedure. It will always generate a - * @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys - * is @ref BLE_GAP_PHY_AUTO, then the stack will select a PHY for the respective direction based on the peer's PHY preferences - * and the local stack configuration. If the peer does not support the PHY Update Procedure, then the - * resulting @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to + * @details This function is used to initiate or respond to a PHY Update Procedure. It will always + * generate a @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. + * If this function is used to initiate a PHY Update procedure and the only option + * provided in @ref ble_gap_phys_t::tx_phys and @ref ble_gap_phys_t::rx_phys is the + * currently active PHYs in the respective directions, the SoftDevice will generate a + * @ref BLE_GAP_EVT_PHY_UPDATE with the current PHYs set and will not initiate the + * procedure in the Link Layer. + * + * If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys is @ref BLE_GAP_PHY_AUTO, + * then the stack will select PHYs based on the peer's PHY preferences and the local link + * configuration. The PHY Update procedure will for this case result in a PHY combination + * that respects the time constraints configured with @ref sd_ble_cfg_set and the current + * link layer data length. + * + * When acting as a central, the SoftDevice will select the fastest common PHY in each direction. + * + * If the peer does not support the PHY Update Procedure, then the resulting + * @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to * @ref BLE_HCI_UNSUPPORTED_REMOTE_FEATURE. - * If the PHY procedure was rejected by the peer due to a procedure collision, the status will be - * @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION. - * If the peer responds to the PHY Update procedure with invalid parameters, the status will be @ref BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS. - * If the PHY procedure was rejected by the peer for a different reason, the status will contain the reason as specified by the peer. + * + * If the PHY procedure was rejected by the peer due to a procedure collision, the status + * will be @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or + * @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION. + * If the peer responds to the PHY Update procedure with invalid parameters, the status + * will be @ref BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS. + * If the PHY procedure was rejected by the peer for a different reason, the status will + * contain the reason as specified by the peer. * * @events * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update Procedure.} @@ -2114,17 +2558,16 @@ SVCALL(SD_BLE_GAP_CONNECT_CANCEL, uint32_t, sd_ble_gap_connect_cancel(void)); * @retval ::NRF_SUCCESS Successfully requested a PHY Update. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Unsupported PHYs supplied to the call. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported PHYs supplied to the call. * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. * @retval ::NRF_ERROR_BUSY Procedure is already in progress or not allowed at this time. Process pending events and wait for the pending procedure to complete and retry. * */ SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)); + /**@brief Initiate or respond to a Data Length Update Procedure. - * - * @note Only symmetric input parameters for the Data Length Update is supported. Only @ref - * BLE_GAP_DATA_LENGTH_AUTO for max_tx_time_us and max_rx_time_us is supported. * * @note If the application uses @ref BLE_GAP_DATA_LENGTH_AUTO for one or more members of * p_dl_params, the SoftDevice will choose the highest value supported in current @@ -2136,7 +2579,7 @@ SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_hand * the SoftDevice automatically decide the value for that member. * Set to NULL to use automatic values for all members. * @param[out] p_dl_limitation Pointer to limitation to be written when local device does not - * have enough resources to accommodate the requested Data Length + * have enough resources or does not support the requested Data Length * Update parameters. Ignored if NULL. * * @mscs @@ -2148,14 +2591,54 @@ SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_hand * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter supplied. * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED The requested parameters are not supported by the SoftDevice. - * @retval ::NRF_ERROR_RESOURCES The requested parameters can not be accommodated. Inspect - * p_dl_limitation so see where the limitation is. + * @retval ::NRF_ERROR_NOT_SUPPORTED The requested parameters are not supported by the SoftDevice. Inspect + * p_dl_limitation to see which parameter is not supported. + * @retval ::NRF_ERROR_RESOURCES The connection event length configured for this link is not sufficient for the requested parameters. + * Use @ref sd_ble_cfg_set with @ref BLE_CONN_CFG_GAP to increase the connection event length. + * Inspect p_dl_limitation to see where the limitation is. * @retval ::NRF_ERROR_BUSY Peer has already initiated a Data Length Update Procedure. Process the * pending @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST event to respond. */ SVCALL(SD_BLE_GAP_DATA_LENGTH_UPDATE, uint32_t, sd_ble_gap_data_length_update(uint16_t conn_handle, ble_gap_data_length_params_t const *p_dl_params, ble_gap_data_length_limitation_t *p_dl_limitation)); +/**@brief Start the Quality of Service (QoS) channel survey module. + * + * @details The channel survey module provides measurements of the energy levels on + * the Bluetooth Low Energy channels. When the module is enabled, @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT + * events will periodically report the measured energy levels for each channel. + * + * @note The measurements are scheduled with lower priority than other Bluetooth Low Energy roles, + * Radio Timeslot API events and Flash API events. + * + * @note The channel survey module will attempt to do measurements so that the average interval + * between measurements will be interval_us. However due to the channel survey module + * having the lowest priority of all roles and modules, this may not be possible. In that + * case fewer than expected channel survey reports may be given. + * + * @note In order to use the channel survey module, @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available + * must be set. This is done using @ref sd_ble_cfg_set. + * + * @param[in] interval_us Requested average interval for the measurements and reports. See + * @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS for valid ranges. If set + * to @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS, the channel + * survey role will be scheduled at every available opportunity. + * + * @retval ::NRF_SUCCESS The module is successfully started. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter supplied. interval_us is out of the + * allowed range. + * @retval ::NRF_ERROR_INVALID_STATE Trying to start the module when already running. + * @retval ::NRF_ERROR_RESOURCES The channel survey module is not available to the application. + * Set @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available using + * @ref sd_ble_cfg_set. + */ +SVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_START, uint32_t, sd_ble_gap_qos_channel_survey_start(uint32_t interval_us)); + +/**@brief Stop the Quality of Service (QoS) channel survey module. + * + * @retval ::NRF_SUCCESS The module is successfully stopped. + * @retval ::NRF_ERROR_INVALID_STATE Trying to stop the module when it is not running. + */ +SVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP, uint32_t, sd_ble_gap_qos_channel_survey_stop(void)); /** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gatt.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gatt.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gatt.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gatt.h index 4e054cf5c3..98a7a150bf 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gatt.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gatt.h @@ -45,8 +45,13 @@ #ifndef BLE_GATT_H__ #define BLE_GATT_H__ -#include "ble_types.h" +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" #include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" #ifdef __cplusplus extern "C" { @@ -179,7 +184,7 @@ extern "C" { /** * @brief BLE GATT connection configuration parameters, set with @ref sd_ble_cfg_set. * - * @retval NRF_ERROR_INVALID_PARAM att_mtu is smaller than @ref BLE_GATT_ATT_MTU_DEFAULT. + * @retval ::NRF_ERROR_INVALID_PARAM att_mtu is smaller than @ref BLE_GATT_ATT_MTU_DEFAULT. */ typedef struct { diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_gattc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gattc.h similarity index 93% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_gattc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gattc.h index ef7dde248f..7fb3920244 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_gattc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gattc.h @@ -49,7 +49,6 @@ #include "nrf.h" #include "nrf_svc.h" #include "nrf_error.h" -#include "ble_hci.h" #include "ble_ranges.h" #include "ble_types.h" #include "ble_err.h" @@ -374,7 +373,8 @@ typedef struct * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_BUSY GATT Client procedure already in progress or blocked because of a previous GATT procedure timeout. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_services_discover(uint16_t conn_handle, uint16_t start_handle, ble_uuid_t const *p_srvc_uuid)); @@ -400,7 +400,8 @@ SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_se * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_BUSY GATT Client procedure already in progress or blocked because of a previous GATT procedure timeout. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); @@ -428,7 +429,8 @@ SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY GATT Client procedure already in progress or blocked because of a previous GATT procedure timeout. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteristics_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); @@ -453,7 +455,8 @@ SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteris * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY GATT Client procedure already in progress or blocked because of a previous GATT procedure timeout. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); @@ -479,7 +482,8 @@ SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_dis * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY GATT Client procedure already in progress or blocked because of a previous GATT procedure timeout. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle, ble_uuid_t const *p_uuid, ble_gattc_handle_range_t const *p_handle_range)); @@ -505,7 +509,8 @@ SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_b * @retval ::NRF_SUCCESS Successfully started or resumed the Read (Long) procedure. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_BUSY GATT Client procedure already in progress or blocked because of a previous GATT procedure timeout. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint16_t handle, uint16_t offset)); @@ -530,7 +535,8 @@ SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY GATT Client procedure already in progress or blocked because of a previous GATT procedure timeout. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(uint16_t conn_handle, uint16_t const *p_handles, uint16_t handle_count)); @@ -574,11 +580,10 @@ SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(ui * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_BUSY For write with response, GATT Client procedure already in progress or blocked because of a previous GATT procedure timeout. - Wait for a @ref BLE_GATTC_EVT_WRITE_RSP event and retry. - For write without response it can only mean GATT procedure timeout. + * @retval ::NRF_ERROR_BUSY For write with response, procedure already in progress. Wait for a @ref BLE_GATTC_EVT_WRITE_RSP event and retry. * @retval ::NRF_ERROR_RESOURCES Too many writes without responses queued. * Wait for a @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event and retry. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, ble_gattc_write_params_t const *p_write_params)); @@ -596,6 +601,7 @@ SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, bl * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no Indication pending to be confirmed. * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_handle, uint16_t handle)); @@ -612,7 +618,8 @@ SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_ * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY GATT Client procedure already in progress or blocked because of a previous GATT procedure timeout. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * p_handle_range)); @@ -644,7 +651,8 @@ SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discove * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state or an ATT_MTU exchange was already requested once. * @retval ::NRF_ERROR_INVALID_PARAM Invalid Client RX MTU size supplied. - * @retval ::NRF_ERROR_BUSY GATT Client procedure already in progress or blocked because of a previous GATT procedure timeout. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, uint32_t, sd_ble_gattc_exchange_mtu_request(uint16_t conn_handle, uint16_t client_rx_mtu)); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_gatts.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gatts.h similarity index 96% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_gatts.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gatts.h index e21b7918a5..e437b6e076 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/ble_gatts.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_gatts.h @@ -289,7 +289,7 @@ typedef struct uint16_t handle; /**< Characteristic Value Handle. */ uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ uint16_t offset; /**< Offset within the attribute value. */ - uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after successful return. */ + uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after return. */ uint8_t const *p_data; /**< Actual data content, use NULL to use the current attribute value. */ } ble_gatts_hvx_params_t; @@ -549,8 +549,8 @@ SVCALL(SD_BLE_GATTS_VALUE_SET, uint32_t, sd_ble_gatts_value_set(uint16_t conn_ha /**@brief Get the value of a given attribute. * * @note If the attribute value is longer than the size of the supplied buffer, - * p_len will return the total attribute value length (excluding offset), - * and not the number of bytes actually returned in p_data. + * @ref ble_gatts_value_t::len will return the total attribute value length (excluding offset), + * and not the number of bytes actually returned in @ref ble_gatts_value_t::p_value. * The application may use this information to allocate a suitable buffer size. * * @note When retrieving system attribute values with this function, the connection handle @@ -579,7 +579,7 @@ SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_ha * @note The local attribute value may be updated even if an outgoing packet is not sent to the peer due to an error during execution. * The Attribute Table has been updated if one of the following error codes is returned: @ref NRF_ERROR_INVALID_STATE, @ref NRF_ERROR_BUSY, * @ref NRF_ERROR_FORBIDDEN, @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING and @ref NRF_ERROR_RESOURCES. - * The caller can check whether the value has been updated by looking at the contents of *(p_hvx_params->p_len). + * The caller can check whether the value has been updated by looking at the contents of *(@ref ble_gatts_hvx_params_t::p_len). * * @note Only one indication procedure can be ongoing per connection at a time. * If the application tries to indicate an attribute value while another indication procedure is ongoing, @@ -607,9 +607,12 @@ SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_ha * @mmsc{@ref BLE_GATTS_HVX_DISABLED_MSC} * @endmscs * - * @param[in] conn_handle Connection handle. - * @param[in] p_hvx_params Pointer to an HVx parameters structure. If the p_data member contains a non-NULL pointer the attribute value will be updated with - * the contents pointed by it before sending the notification or indication. + * @param[in] conn_handle Connection handle. + * @param[in,out] p_hvx_params Pointer to an HVx parameters structure. If @ref ble_gatts_hvx_params_t::p_data + * contains a non-NULL pointer the attribute value will be updated with the contents + * pointed by it before sending the notification or indication. If the attribute value + * is updated, @ref ble_gatts_hvx_params_t::p_len is updated by the SoftDevice to + * contain the number of actual bytes written, else it will be set to 0. * * @retval ::NRF_SUCCESS Successfully queued a notification or indication for transmission, and optionally updated the attribute value. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. @@ -624,12 +627,11 @@ SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_ha * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. * @retval ::NRF_ERROR_FORBIDDEN The connection's current security level is lower than the one required by the write permissions of the CCCD associated with this characteristic. * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_BUSY For @ref BLE_GATT_HVX_INDICATION, GATT Server procedure already in progress or blocked because of a previous GATT procedure timeout. - Wait for a @ref BLE_GATTS_EVT_HVC event and retry. - For @ref BLE_GATT_HVX_NOTIFICATION it can only mean GATT procedure timeout. + * @retval ::NRF_ERROR_BUSY For @ref BLE_GATT_HVX_INDICATION Procedure already in progress. Wait for a @ref BLE_GATTS_EVT_HVC event and retry. * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. * @retval ::NRF_ERROR_RESOURCES Too many notifications queued. * Wait for a @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event and retry. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t const *p_hvx_params)); @@ -663,8 +665,9 @@ SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_ga * - An ATT_MTU exchange is ongoing * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied, handles must be in the range populated by the application. - * @retval ::NRF_ERROR_BUSY GATT Server procedure already in progress or blocked because of a previous GATT procedure timeout. + * @retval ::NRF_ERROR_BUSY Procedure already in progress. * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle)); @@ -697,6 +700,7 @@ SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint * @retval ::NRF_ERROR_INVALID_PARAM Authorization op invalid, * handle supplied does not match requested handle, * or invalid data to be written provided by the application. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params)); @@ -826,7 +830,7 @@ SVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, b * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no ATT_MTU exchange request pending. * @retval ::NRF_ERROR_INVALID_PARAM Invalid Server RX MTU size supplied. - * @retval ::NRF_ERROR_BUSY GATT Blocked because of a previous GATT procedure timeout. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_EXCHANGE_MTU_REPLY, uint32_t, sd_ble_gatts_exchange_mtu_reply(uint16_t conn_handle, uint16_t server_rx_mtu)); /** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_hci.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_hci.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_hci.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_hci.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_l2cap.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_l2cap.h similarity index 91% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_l2cap.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_l2cap.h index 3b53ded092..eaeb4b7d28 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_l2cap.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_l2cap.h @@ -45,10 +45,12 @@ #ifndef BLE_L2CAP_H__ #define BLE_L2CAP_H__ -#include "ble_types.h" -#include "ble_ranges.h" -#include "ble_err.h" +#include #include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" #ifdef __cplusplus extern "C" { @@ -82,32 +84,32 @@ extern "C" { /**@brief L2CAP API SVC numbers. */ enum BLE_L2CAP_SVCS { - SD_BLE_L2CAP_CH_SETUP = BLE_L2CAP_SVC_BASE, /**< Set up an L2CAP channel. */ - SD_BLE_L2CAP_CH_RELEASE, /**< Release an L2CAP channel. */ - SD_BLE_L2CAP_CH_RX, /**< Receive an SDU on an L2CAP channel. */ - SD_BLE_L2CAP_CH_TX, /**< Transmit an SDU on an L2CAP channel. */ - SD_BLE_L2CAP_CH_FLOW_CONTROL, /**< Advanced SDU reception flow control. */ + SD_BLE_L2CAP_CH_SETUP = BLE_L2CAP_SVC_BASE + 0, /**< Set up an L2CAP channel. */ + SD_BLE_L2CAP_CH_RELEASE = BLE_L2CAP_SVC_BASE + 1, /**< Release an L2CAP channel. */ + SD_BLE_L2CAP_CH_RX = BLE_L2CAP_SVC_BASE + 2, /**< Receive an SDU on an L2CAP channel. */ + SD_BLE_L2CAP_CH_TX = BLE_L2CAP_SVC_BASE + 3, /**< Transmit an SDU on an L2CAP channel. */ + SD_BLE_L2CAP_CH_FLOW_CONTROL = BLE_L2CAP_SVC_BASE + 4, /**< Advanced SDU reception flow control. */ }; /**@brief L2CAP Event IDs. */ enum BLE_L2CAP_EVTS { - BLE_L2CAP_EVT_CH_SETUP_REQUEST = BLE_L2CAP_EVT_BASE, /**< L2CAP Channel Setup Request event. - \n See @ref ble_l2cap_evt_ch_setup_request_t. */ - BLE_L2CAP_EVT_CH_SETUP_REFUSED, /**< L2CAP Channel Setup Refused event. - \n See @ref ble_l2cap_evt_ch_setup_refused_t. */ - BLE_L2CAP_EVT_CH_SETUP, /**< L2CAP Channel Setup Completed event. - \n See @ref ble_l2cap_evt_ch_setup_t. */ - BLE_L2CAP_EVT_CH_RELEASED, /**< L2CAP Channel Released event. - \n No additional event structure applies. */ - BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED, /**< L2CAP Channel SDU data buffer released event. - \n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */ - BLE_L2CAP_EVT_CH_CREDIT, /**< L2CAP Channel Credit received. - \n See @ref ble_l2cap_evt_ch_credit_t. */ - BLE_L2CAP_EVT_CH_RX, /**< L2CAP Channel SDU received. - \n See @ref ble_l2cap_evt_ch_rx_t. */ - BLE_L2CAP_EVT_CH_TX, /**< L2CAP Channel SDU transmitted. - \n See @ref ble_l2cap_evt_ch_tx_t. */ + BLE_L2CAP_EVT_CH_SETUP_REQUEST = BLE_L2CAP_EVT_BASE + 0, /**< L2CAP Channel Setup Request event. + \n See @ref ble_l2cap_evt_ch_setup_request_t. */ + BLE_L2CAP_EVT_CH_SETUP_REFUSED = BLE_L2CAP_EVT_BASE + 1, /**< L2CAP Channel Setup Refused event. + \n See @ref ble_l2cap_evt_ch_setup_refused_t. */ + BLE_L2CAP_EVT_CH_SETUP = BLE_L2CAP_EVT_BASE + 2, /**< L2CAP Channel Setup Completed event. + \n See @ref ble_l2cap_evt_ch_setup_t. */ + BLE_L2CAP_EVT_CH_RELEASED = BLE_L2CAP_EVT_BASE + 3, /**< L2CAP Channel Released event. + \n No additional event structure applies. */ + BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED = BLE_L2CAP_EVT_BASE + 4, /**< L2CAP Channel SDU data buffer released event. + \n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */ + BLE_L2CAP_EVT_CH_CREDIT = BLE_L2CAP_EVT_BASE + 5, /**< L2CAP Channel Credit received. + \n See @ref ble_l2cap_evt_ch_credit_t. */ + BLE_L2CAP_EVT_CH_RX = BLE_L2CAP_EVT_BASE + 6, /**< L2CAP Channel SDU received. + \n See @ref ble_l2cap_evt_ch_rx_t. */ + BLE_L2CAP_EVT_CH_TX = BLE_L2CAP_EVT_BASE + 7, /**< L2CAP Channel SDU transmitted. + \n See @ref ble_l2cap_evt_ch_tx_t. */ }; /** @} */ @@ -472,8 +474,8 @@ SVCALL(SD_BLE_L2CAP_CH_TX, uint32_t, sd_ble_l2cap_ch_tx(uint16_t conn_handle, ui * available to the peer. If the value written by the SoftDevice is 0 when * credits parameter was set to 0, the peer will not be able to send more * data until more credits are provided by calling this function again with - * credits > 0. This parameter is ignored when local_cid is set to @ref - * BLE_L2CAP_CID_INVALID. + * credits > 0. This parameter is ignored when local_cid is set to + * @ref BLE_L2CAP_CID_INVALID. * * @note Application should take care when setting number of credits higher than default value. In * this case the application must make sure that the SoftDevice always has reception buffers diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_ranges.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_ranges.h similarity index 93% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_ranges.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_ranges.h index 5b9d891402..0935bca071 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/ble_ranges.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_ranges.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -67,15 +67,15 @@ extern "C" { #define BLE_SVC_LAST 0x6B /**< Common BLE SVC last. */ #define BLE_GAP_SVC_BASE 0x6C /**< GAP BLE SVC base. */ -#define BLE_GAP_SVC_LAST 0x93 /**< GAP BLE SVC last. */ +#define BLE_GAP_SVC_LAST 0x9A /**< GAP BLE SVC last. */ -#define BLE_GATTC_SVC_BASE 0x94 /**< GATTC BLE SVC base. */ -#define BLE_GATTC_SVC_LAST 0x9F /**< GATTC BLE SVC last. */ +#define BLE_GATTC_SVC_BASE 0x9B /**< GATTC BLE SVC base. */ +#define BLE_GATTC_SVC_LAST 0xA7 /**< GATTC BLE SVC last. */ -#define BLE_GATTS_SVC_BASE 0xA0 /**< GATTS BLE SVC base. */ -#define BLE_GATTS_SVC_LAST 0xAF /**< GATTS BLE SVC last. */ +#define BLE_GATTS_SVC_BASE 0xA8 /**< GATTS BLE SVC base. */ +#define BLE_GATTS_SVC_LAST 0xB7 /**< GATTS BLE SVC last. */ -#define BLE_L2CAP_SVC_BASE 0xB0 /**< L2CAP BLE SVC base. */ +#define BLE_L2CAP_SVC_BASE 0xB8 /**< L2CAP BLE SVC base. */ #define BLE_L2CAP_SVC_LAST 0xBF /**< L2CAP BLE SVC last. */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_types.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_types.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/ble_types.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/ble_types.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf52/nrf_mbr.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf52/nrf_mbr.h similarity index 75% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf52/nrf_mbr.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf52/nrf_mbr.h index c95bb8d4fd..cc5971c7a3 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf52/nrf_mbr.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf52/nrf_mbr.h @@ -81,13 +81,13 @@ enum NRF_MBR_SVCS /**@brief Possible values for ::sd_mbr_command_t.command */ enum NRF_MBR_COMMANDS { - SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see sd_mbr_command_copy_bl_t*/ + SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see ::sd_mbr_command_copy_bl_t*/ SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ - SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD*/ + SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD. Does not require any parameters in ::sd_mbr_command_t params.*/ SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ - SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset @see ::sd_mbr_command_vector_table_base_set_t*/ + SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset. @see ::sd_mbr_command_vector_table_base_set_t*/ SD_MBR_COMMAND_RESERVED, - SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address @see ::sd_mbr_command_irq_forward_address_set_t*/ + SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address. @see ::sd_mbr_command_irq_forward_address_set_t*/ }; /** @} */ @@ -96,6 +96,7 @@ enum NRF_MBR_COMMANDS * @{ */ /**@brief This command copies part of a new SoftDevice + * * The destination area is erased before copying. * If dst is in the middle of a flash page, that whole flash page will be erased. * If (dst+len) is in the middle of a flash page, that whole flash page will be erased. @@ -127,14 +128,16 @@ typedef struct /**@brief This command copies a new BootLoader. - * With this command, destination of BootLoader is always the address written in NRF_UICR->BOOTADDR. * - * Destination is erased by this function. - * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. + * With this command, destination of BootLoader is always the address written in + * NRF_UICR->BOOTADDR. * - * This function will use PROTENSET to protect the flash that is not intended to be written. + * Destination is erased by this function. + * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. * - * On success, this function will not return. It will start the new BootLoader from reset-vector as normal. + * This function will use PROTENSET to protect the flash that is not intended to be written. + * + * On success, this function will not return. It will start the new BootLoader from reset-vector as normal. * * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. * @retval ::NRF_ERROR_FORBIDDEN if NRF_UICR->BOOTADDR is not set. @@ -149,10 +152,12 @@ typedef struct /**@brief Change the address the MBR starts after a reset * - * Once this function has been called, this address is where the MBR will start to forward interrupts to after a reset. + * Once this function has been called, this address is where the MBR will start to forward + * interrupts to after a reset. * - * To restore default forwarding this function should be called with @param address set to 0. - * The MBR will then start forwarding to interrupts to the address in NFR_UICR->BOOTADDR or to the SoftDevice if the BOOTADDR is not set. + * To restore default forwarding this function should be called with @ref address set to 0. The + * MBR will then start forwarding interrupts to the address in NFR_UICR->BOOTADDR or to the + * SoftDevice if the BOOTADDR is not set. * * On success, this function will not return. It will reset the device. * @@ -166,6 +171,7 @@ typedef struct } sd_mbr_command_vector_table_base_set_t; /**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR + * * Unlike sd_mbr_command_vector_table_base_set_t, this function does not reset, and it does not * change where the MBR starts after reset. * @@ -176,9 +182,15 @@ typedef struct uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ } sd_mbr_command_irq_forward_address_set_t; +/**@brief Input structure containing data used when calling ::sd_mbr_command + * + * Depending on what command value that is set, the corresponding params value type must also be + * set. See @ref NRF_MBR_COMMANDS for command types and corresponding params value type. If command + * @ref SD_MBR_COMMAND_INIT_SD is set, it is not necessary to set any values under params. + */ typedef struct { - uint32_t command; /**< type of command to be issued see @ref NRF_MBR_COMMANDS. */ + uint32_t command; /**< Type of command to be issued. See @ref NRF_MBR_COMMANDS. */ union { sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ @@ -186,7 +198,7 @@ typedef struct sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ sd_mbr_command_irq_forward_address_set_t irq_forward_address_set; /**< Parameters for irq forward address set*/ - } params; + } params; /**< Command parameters. */ } sd_mbr_command_t; /** @} */ @@ -198,21 +210,22 @@ typedef struct * * Commands used when updating a SoftDevice and bootloader. * - * The SD_MBR_COMMAND_COPY_BL and SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires parameters to be - * retained by the MBR when resetting the IC. This is done in a separate flash page - * provided by the application. The UICR register UICR.NRFFW[1] must be set - * to an address corresponding to a page in the application flash space. This page will be cleared - * by the MBR and used to store the command before reset. When the UICR.NRFFW[1] field is set - * the page it refers to must not be used by the application. If the UICR.NRFFW[1] is set to - * 0xFFFFFFFF (the default) MBR commands which use flash will be unavailable and return - * NRF_ERROR_NO_MEM. + * The @ref SD_MBR_COMMAND_COPY_BL and @ref SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires + * parameters to be retained by the MBR when resetting the IC. This is done in a separate flash + * page provided by the application. The UICR register UICR.NRFFW[1] must be set to an address + * corresponding to a page in the application flash space. This page will be cleared by the MBR and + * used to store the command before reset. When the UICR.NRFFW[1] field is set the page it refers + * to must not be used by the application. If the UICR.NRFFW[1] is set to 0xFFFFFFFF (the default) + * MBR commands which use flash will be unavailable and return @ref NRF_ERROR_NO_MEM. * * @param[in] param Pointer to a struct describing the command. * - * @note For return values, see ::sd_mbr_command_copy_sd_t ::sd_mbr_command_copy_bl_t ::sd_mbr_command_compare_t ::sd_mbr_command_vector_table_base_set_t ::sd_mbr_command_irq_forward_address_set_t + * @note For return values, see ::sd_mbr_command_copy_sd_t, ::sd_mbr_command_copy_bl_t, + * ::sd_mbr_command_compare_t, ::sd_mbr_command_vector_table_base_set_t, + * ::sd_mbr_command_irq_forward_address_set_t * - * @retval NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF). - * @retval NRF_ERROR_INVALID_PARAM if an invalid command is given. + * @retval ::NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF). + * @retval ::NRF_ERROR_INVALID_PARAM if an invalid command is given. */ SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param)); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_ble.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_ble.h similarity index 94% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_ble.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_ble.h index 470577b8aa..9ebb41f538 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_ble.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_ble.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -49,8 +49,10 @@ #ifndef BLE_H__ #define BLE_H__ -#include "ble_ranges.h" -#include "ble_types.h" +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_err.h" #include "ble_gap.h" #include "ble_l2cap.h" #include "ble_gatt.h" @@ -86,8 +88,8 @@ enum BLE_COMMON_SVCS */ enum BLE_COMMON_EVTS { - BLE_EVT_USER_MEM_REQUEST = BLE_EVT_BASE, /**< User Memory request. @ref ble_evt_user_mem_request_t */ - BLE_EVT_USER_MEM_RELEASE, /**< User Memory release. @ref ble_evt_user_mem_release_t */ + BLE_EVT_USER_MEM_REQUEST = BLE_EVT_BASE + 0, /**< User Memory request. @ref ble_evt_user_mem_request_t */ + BLE_EVT_USER_MEM_RELEASE = BLE_EVT_BASE + 1, /**< User Memory release. @ref ble_evt_user_mem_release_t */ }; /**@brief BLE Connection Configuration IDs. @@ -96,11 +98,11 @@ enum BLE_COMMON_EVTS */ enum BLE_CONN_CFGS { - BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE, /**< BLE GAP specific connection configuration. */ - BLE_CONN_CFG_GATTC, /**< BLE GATTC specific connection configuration. */ - BLE_CONN_CFG_GATTS, /**< BLE GATTS specific connection configuration. */ - BLE_CONN_CFG_GATT, /**< BLE GATT specific connection configuration. */ - BLE_CONN_CFG_L2CAP, /**< BLE L2CAP specific connection configuration. */ + BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE + 0, /**< BLE GAP specific connection configuration. */ + BLE_CONN_CFG_GATTC = BLE_CONN_CFG_BASE + 1, /**< BLE GATTC specific connection configuration. */ + BLE_CONN_CFG_GATTS = BLE_CONN_CFG_BASE + 2, /**< BLE GATTS specific connection configuration. */ + BLE_CONN_CFG_GATT = BLE_CONN_CFG_BASE + 3, /**< BLE GATT specific connection configuration. */ + BLE_CONN_CFG_L2CAP = BLE_CONN_CFG_BASE + 4, /**< BLE L2CAP specific connection configuration. */ }; /**@brief BLE Common Configuration IDs. @@ -117,8 +119,8 @@ enum BLE_COMMON_CFGS */ enum BLE_COMMON_OPTS { - BLE_COMMON_OPT_PA_LNA = BLE_OPT_BASE, /**< PA and LNA options */ - BLE_COMMON_OPT_CONN_EVT_EXT, /**< Extended connection events option */ + BLE_COMMON_OPT_PA_LNA = BLE_OPT_BASE + 0, /**< PA and LNA options */ + BLE_COMMON_OPT_CONN_EVT_EXT = BLE_OPT_BASE + 1, /**< Extended connection events option */ }; /** @} */ @@ -138,13 +140,9 @@ enum BLE_COMMON_OPTS * @note The highest value used for @ref ble_gatt_conn_cfg_t::att_mtu in any connection configuration shall be used as a parameter. * If that value has not been configured for any connections then @ref BLE_GATT_ATT_MTU_DEFAULT must be used instead. */ -#define BLE_EVT_LEN_MAX(ATT_MTU) (BLE_MAX( \ - sizeof(ble_evt_t), \ - BLE_MAX( \ - offsetof(ble_evt_t, evt.gattc_evt.params.rel_disc_rsp.includes) + ((ATT_MTU) - 2) / 6 * sizeof(ble_gattc_include_t), \ - offsetof(ble_evt_t, evt.gattc_evt.params.attr_info_disc_rsp.info.attr_info16) + ((ATT_MTU) - 2) / 4 * sizeof(ble_gattc_attr_info16_t) \ - ) \ -)) +#define BLE_EVT_LEN_MAX(ATT_MTU) ( \ + offsetof(ble_evt_t, evt.gattc_evt.params.prim_srvc_disc_rsp.services) + ((ATT_MTU) - 1) / 4 * sizeof(ble_gattc_service_t) \ +) /** @defgroup BLE_USER_MEM_TYPES User Memory Types * @{ */ @@ -304,7 +302,10 @@ typedef union * In the case that no configurations has been set, or fewer connection configurations has been set than enabled connections, * the default connection configuration will be automatically added for the remaining connections. * When creating connections with the default configuration, @ref BLE_CONN_CFG_TAG_DEFAULT should be used in - * place of @ref ble_conn_cfg_t::conn_cfg_tag. See @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect()" + * place of @ref ble_conn_cfg_t::conn_cfg_tag. + * + * @sa sd_ble_gap_adv_start() + * @sa sd_ble_gap_connect() * * @mscs * @mmsc{@ref BLE_CONN_CFG} @@ -313,8 +314,9 @@ typedef union */ typedef struct { - uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() - calls to select this configuration when creating a connection. + uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the + @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() calls + to select this configuration when creating a connection. Must be different for all connection configurations added and not @ref BLE_CONN_CFG_TAG_DEFAULT. */ union { ble_gap_conn_cfg_t gap_conn_cfg; /**< GAP connection configuration, cfg_id is @ref BLE_CONN_CFG_GAP. */ @@ -482,7 +484,7 @@ SVCALL(SD_BLE_EVT_GET, uint32_t, sd_ble_evt_get(uint8_t *p_dest, uint16_t *p_len * the 16-bit uuid field in @ref ble_uuid_t. * * @note If a UUID is already present in the BLE stack's internal table, the corresponding index will be returned in - * p_uuid_type along with an NRF_SUCCESS error code. + * p_uuid_type along with an @ref NRF_SUCCESS error code. * * @param[in] p_vs_uuid Pointer to a 16-octet (128-bit) little endian Vendor Specific UUID disregarding * bytes 12 and 13. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_error.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_error.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_error.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_error.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_error_sdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_error_sdm.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_error_sdm.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_error_sdm.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_error_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_error_soc.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_error_soc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_error_soc.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_nvic.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_nvic.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_nvic.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_nvic.h index 40537b45a2..f5c7e8e028 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/headers/nrf_nvic.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_nvic.h @@ -57,7 +57,8 @@ #include #include "nrf.h" - +#include "nrf_svc.h" +#include "nrf_error.h" #include "nrf_error_soc.h" #ifdef __cplusplus @@ -85,7 +86,7 @@ extern "C" { | (1U << CCM_AAR_IRQn) \ | (1U << TEMP_IRQn) \ | (1U << __NRF_NVIC_NVMC_IRQn) \ - | (1U << (uint32_t)SWI5_EGU5_IRQn) \ + | (1U << (uint32_t)SWI5_IRQn) \ )) /**@brief Interrupts used by the SoftDevice, with IRQn in the range 32-63. */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_sd_def.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_sd_def.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_sd_def.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_sd_def.h index 0b4d221d6a..c9ab241872 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_sd_def.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_sd_def.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_sdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_sdm.h similarity index 95% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_sdm.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_sdm.h index c41d86d46b..8c48d93678 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_sdm.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_sdm.h @@ -47,10 +47,12 @@ #ifndef NRF_SDM_H__ #define NRF_SDM_H__ -#include "nrf_svc.h" +#include #include "nrf.h" -#include "nrf_soc.h" +#include "nrf_svc.h" +#include "nrf_error.h" #include "nrf_error_sdm.h" +#include "nrf_soc.h" #ifdef __cplusplus extern "C" { @@ -65,7 +67,7 @@ extern "C" { #endif /** @brief The major version for the SoftDevice binary distributed with this header file. */ -#define SD_MAJOR_VERSION (5) +#define SD_MAJOR_VERSION (6) /** @brief The minor version for the SoftDevice binary distributed with this header file. */ #define SD_MINOR_VERSION (0) @@ -132,8 +134,8 @@ the start of the SoftDevice (without MBR)*/ * the MBR (the usual case). */ #define SD_SIZE_GET(baseaddr) (*((uint32_t *) ((baseaddr) + SD_SIZE_OFFSET))) -/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use @ref - * MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual +/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use + * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual * case). */ #define SD_FWID_GET(baseaddr) (*((uint16_t *) ((baseaddr) + SD_FWID_OFFSET))) @@ -227,27 +229,27 @@ enum NRF_SD_SVCS typedef struct { uint8_t source; /**< LF oscillator clock source, see @ref NRF_CLOCK_LF_SRC. */ - uint8_t rc_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second - units (nRF51: 1-64, nRF52: 1-32). + uint8_t rc_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second + units (nRF52: 1-32). @note To avoid excessive clock drift, 0.5 degrees Celsius is the maximum temperature change allowed in one calibration timer interval. The interval should be selected to ensure this. - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. */ - uint8_t rc_temp_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: How often (in number of calibration + @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. */ + uint8_t rc_temp_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: How often (in number of calibration intervals) the RC oscillator shall be calibrated if the temperature hasn't changed. 0: Always calibrate even if the temperature hasn't changed. - 1: Only calibrate if the temperature has changed (nRF51 only). + 1: Only calibrate if the temperature has changed (legacy - nRF51 only). 2-33: Check the temperature and only calibrate if it has changed, however calibration will take place every rc_temp_ctiv intervals in any case. - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. + @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. @note For nRF52, the application must ensure calibration at least once every 8 seconds to ensure +/-500 ppm clock stability. The - recommended configuration for NRF_CLOCK_LF_SRC_RC on nRF52 is + recommended configuration for ::NRF_CLOCK_LF_SRC_RC on nRF52 is rc_ctiv=16 and rc_temp_ctiv=2. This will ensure calibration at least once every 8 seconds and for temperature changes of 0.5 degrees Celsius every 4 seconds. See the Product Specification @@ -269,7 +271,7 @@ typedef struct * @param[in] pc The program counter of the instruction that triggered the fault. * @param[in] info Optional additional information regarding the fault. Refer to each Fault identifier for details. * - * @note When id is set to NRF_FAULT_ID_APP_MEMACC, pc will contain the address of the instruction being executed at the time when + * @note When id is set to @ref NRF_FAULT_ID_APP_MEMACC, pc will contain the address of the instruction being executed at the time when * the fault is detected by the CPU. The CPU program counter may have advanced up to 2 instructions (no branching) after the one that triggered the fault. */ typedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info); @@ -306,6 +308,7 @@ typedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info); * @retval ::NRF_ERROR_INVALID_STATE SoftDevice is already enabled, and the clock source and fault handler cannot be updated. * @retval ::NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION SoftDevice interrupt is already enabled, or an enabled interrupt has an illegal priority level. * @retval ::NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN Unknown low frequency clock source selected. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid clock source configuration supplied in p_clock_lf_cfg. */ SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lf_cfg_t const * p_clock_lf_cfg, nrf_fault_handler_t fault_handler)); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_soc.h similarity index 87% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_soc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_soc.h index d7d3c801b8..2c4d958750 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_soc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_soc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, @@ -48,10 +48,9 @@ #define NRF_SOC_H__ #include -#include -#include "nrf_svc.h" #include "nrf.h" - +#include "nrf_svc.h" +#include "nrf_error.h" #include "nrf_error_soc.h" #ifdef __cplusplus @@ -63,7 +62,7 @@ extern "C" { /**@brief The number of the lowest SVC number reserved for the SoC library. */ #define SOC_SVC_BASE (0x20) /**< Base value for SVCs that are available when the SoftDevice is disabled. */ -#define SOC_SVC_BASE_NOT_AVAILABLE (0x2B) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ +#define SOC_SVC_BASE_NOT_AVAILABLE (0x2C) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ /**@brief Guaranteed time for application to process radio inactive notification. */ #define NRF_RADIO_NOTIFICATION_INACTIVE_GUARANTEED_TIME_US (62) @@ -81,11 +80,11 @@ extern "C" { #define SOC_ECB_CLEARTEXT_LENGTH (16) /**< ECB cleartext length. */ #define SOC_ECB_CIPHERTEXT_LENGTH (SOC_ECB_CLEARTEXT_LENGTH) /**< ECB ciphertext length. */ -#define SD_EVT_IRQn (SWI2_EGU2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ -#define SD_EVT_IRQHandler (SWI2_EGU2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. +#define SD_EVT_IRQn (SWI2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ +#define SD_EVT_IRQHandler (SWI2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. The default interrupt priority for this handler is set to 4 */ -#define RADIO_NOTIFICATION_IRQn (SWI1_EGU1_IRQn) /**< The radio notification IRQ number. */ -#define RADIO_NOTIFICATION_IRQHandler (SWI1_EGU1_IRQHandler) /**< The radio notification IRQ handler. +#define RADIO_NOTIFICATION_IRQn (SWI1_IRQn) /**< The radio notification IRQ number. */ +#define RADIO_NOTIFICATION_IRQHandler (SWI1_IRQHandler) /**< The radio notification IRQ handler. The default interrupt priority for this handler is set to 4 */ #define NRF_RADIO_LENGTH_MIN_US (100) /**< The shortest allowed radio timeslot, in microseconds. */ #define NRF_RADIO_LENGTH_MAX_US (100000) /**< The longest allowed radio timeslot, in microseconds. */ @@ -104,49 +103,50 @@ extern "C" { /**@brief The SVC numbers used by the SVC functions in the SoC library. */ enum NRF_SOC_SVCS { - SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, - SD_PPI_CHANNEL_ENABLE_SET, - SD_PPI_CHANNEL_ENABLE_CLR, - SD_PPI_CHANNEL_ASSIGN, - SD_PPI_GROUP_TASK_ENABLE, - SD_PPI_GROUP_TASK_DISABLE, - SD_PPI_GROUP_ASSIGN, - SD_PPI_GROUP_GET, - SD_FLASH_PAGE_ERASE, - SD_FLASH_WRITE, - SD_FLASH_PROTECT, - SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, - SD_MUTEX_ACQUIRE, - SD_MUTEX_RELEASE, - SD_RAND_APPLICATION_POOL_CAPACITY_GET, - SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, - SD_RAND_APPLICATION_VECTOR_GET, - SD_POWER_MODE_SET, - SD_POWER_SYSTEM_OFF, - SD_POWER_RESET_REASON_GET, - SD_POWER_RESET_REASON_CLR, - SD_POWER_POF_ENABLE, - SD_POWER_POF_THRESHOLD_SET, - SD_POWER_RAM_POWER_SET, - SD_POWER_RAM_POWER_CLR, - SD_POWER_RAM_POWER_GET, - SD_POWER_GPREGRET_SET, - SD_POWER_GPREGRET_CLR, - SD_POWER_GPREGRET_GET, - SD_POWER_DCDC_MODE_SET, - SD_APP_EVT_WAIT, - SD_CLOCK_HFCLK_REQUEST, - SD_CLOCK_HFCLK_RELEASE, - SD_CLOCK_HFCLK_IS_RUNNING, - SD_RADIO_NOTIFICATION_CFG_SET, - SD_ECB_BLOCK_ENCRYPT, - SD_ECB_BLOCKS_ENCRYPT, - SD_RADIO_SESSION_OPEN, - SD_RADIO_SESSION_CLOSE, - SD_RADIO_REQUEST, - SD_EVT_GET, - SD_TEMP_GET, - SVC_SOC_LAST + SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, + SD_PPI_CHANNEL_ENABLE_SET = SOC_SVC_BASE + 1, + SD_PPI_CHANNEL_ENABLE_CLR = SOC_SVC_BASE + 2, + SD_PPI_CHANNEL_ASSIGN = SOC_SVC_BASE + 3, + SD_PPI_GROUP_TASK_ENABLE = SOC_SVC_BASE + 4, + SD_PPI_GROUP_TASK_DISABLE = SOC_SVC_BASE + 5, + SD_PPI_GROUP_ASSIGN = SOC_SVC_BASE + 6, + SD_PPI_GROUP_GET = SOC_SVC_BASE + 7, + SD_FLASH_PAGE_ERASE = SOC_SVC_BASE + 8, + SD_FLASH_WRITE = SOC_SVC_BASE + 9, + SD_FLASH_PROTECT = SOC_SVC_BASE + 10, + SD_PROTECTED_REGISTER_WRITE = SOC_SVC_BASE + 11, + SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, + SD_MUTEX_ACQUIRE = SOC_SVC_BASE_NOT_AVAILABLE + 1, + SD_MUTEX_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 2, + SD_RAND_APPLICATION_POOL_CAPACITY_GET = SOC_SVC_BASE_NOT_AVAILABLE + 3, + SD_RAND_APPLICATION_BYTES_AVAILABLE_GET = SOC_SVC_BASE_NOT_AVAILABLE + 4, + SD_RAND_APPLICATION_VECTOR_GET = SOC_SVC_BASE_NOT_AVAILABLE + 5, + SD_POWER_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 6, + SD_POWER_SYSTEM_OFF = SOC_SVC_BASE_NOT_AVAILABLE + 7, + SD_POWER_RESET_REASON_GET = SOC_SVC_BASE_NOT_AVAILABLE + 8, + SD_POWER_RESET_REASON_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 9, + SD_POWER_POF_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 10, + SD_POWER_POF_THRESHOLD_SET = SOC_SVC_BASE_NOT_AVAILABLE + 11, + SD_POWER_RAM_POWER_SET = SOC_SVC_BASE_NOT_AVAILABLE + 13, + SD_POWER_RAM_POWER_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 14, + SD_POWER_RAM_POWER_GET = SOC_SVC_BASE_NOT_AVAILABLE + 15, + SD_POWER_GPREGRET_SET = SOC_SVC_BASE_NOT_AVAILABLE + 16, + SD_POWER_GPREGRET_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 17, + SD_POWER_GPREGRET_GET = SOC_SVC_BASE_NOT_AVAILABLE + 18, + SD_POWER_DCDC_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 19, + SD_APP_EVT_WAIT = SOC_SVC_BASE_NOT_AVAILABLE + 21, + SD_CLOCK_HFCLK_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 22, + SD_CLOCK_HFCLK_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 23, + SD_CLOCK_HFCLK_IS_RUNNING = SOC_SVC_BASE_NOT_AVAILABLE + 24, + SD_RADIO_NOTIFICATION_CFG_SET = SOC_SVC_BASE_NOT_AVAILABLE + 25, + SD_ECB_BLOCK_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 26, + SD_ECB_BLOCKS_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 27, + SD_RADIO_SESSION_OPEN = SOC_SVC_BASE_NOT_AVAILABLE + 28, + SD_RADIO_SESSION_CLOSE = SOC_SVC_BASE_NOT_AVAILABLE + 29, + SD_RADIO_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 30, + SD_EVT_GET = SOC_SVC_BASE_NOT_AVAILABLE + 31, + SD_TEMP_GET = SOC_SVC_BASE_NOT_AVAILABLE + 32, + SVC_SOC_LAST = SOC_SVC_BASE_NOT_AVAILABLE + 37 }; /**@brief Possible values of a ::nrf_mutex_t. */ @@ -182,6 +182,7 @@ enum NRF_POWER_THRESHOLDS }; + /**@brief DC/DC converter modes. */ enum NRF_POWER_DCDC_MODES { @@ -232,8 +233,8 @@ enum NRF_RADIO_SIGNAL_CALLBACK_ACTION NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current timeslot. Maximum execution time for this action: @ref NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US. - This action must be started at least @ref - NRF_RADIO_MIN_EXTENSION_MARGIN_US before + This action must be started at least + @ref NRF_RADIO_MIN_EXTENSION_MARGIN_US before the end of the timeslot. */ NRF_RADIO_SIGNAL_CALLBACK_ACTION_END, /**< End the current radio timeslot. */ NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END /**< Request a new radio timeslot and end the current timeslot. */ @@ -476,7 +477,9 @@ SVCALL(SD_POWER_SYSTEM_OFF, uint32_t, sd_power_system_off(void)); */ SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); -/**@brief Sets the power-fail threshold value. + +/**@brief Sets the power failure comparator threshold value. + * * * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDS. * @@ -485,6 +488,7 @@ SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); */ SVCALL(SD_POWER_POF_THRESHOLD_SET, uint32_t, sd_power_pof_threshold_set(uint8_t threshold)); + /**@brief Writes the NRF_POWER->RAM[index].POWERSET register. * * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERSET register to write to. @@ -539,9 +543,7 @@ SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_ */ SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret)); -/**@brief Sets the DCDC mode. - * - * Enable or disable the DCDC peripheral. +/**@brief Enable or disable the DC/DC regulator. * * @param[in] dcdc_mode The mode of the DCDC, see @ref NRF_POWER_DCDC_MODES. * @@ -550,6 +552,7 @@ SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_ */ SVCALL(SD_POWER_DCDC_MODE_SET, uint32_t, sd_power_dcdc_mode_set(uint8_t dcdc_mode)); + /**@brief Request the high frequency crystal oscillator. * * Will start the high frequency crystal oscillator, the startup time of the crystal varies @@ -791,6 +794,8 @@ SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp)); * and the command parameters). * - The data in the p_src buffer should not be modified before the @ref NRF_EVT_FLASH_OPERATION_SUCCESS * or the @ref NRF_EVT_FLASH_OPERATION_ERROR have been received if the SoftDevice is enabled. +* - This call will make the SoftDevice trigger a hardfault when the page is written, if it is +* protected. * * * @param[in] p_dst Pointer to start of flash location to be written. @@ -801,7 +806,7 @@ SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp)); * @retval ::NRF_ERROR_INVALID_ADDR Tried to write to a non existing flash address, or p_dst or p_src was unaligned. * @retval ::NRF_ERROR_BUSY The previous command has not yet completed. * @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or higher than the maximum allowed size. -* @retval ::NRF_ERROR_FORBIDDEN Tried to write to or read from protected location. +* @retval ::NRF_ERROR_FORBIDDEN Tried to write to an address outside the application flash area. * @retval ::NRF_SUCCESS The command was accepted. */ SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)); @@ -824,6 +829,8 @@ SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * they will not interfere with the flash access. This means that all interrupts will be blocked * for a predictable time (depending on the NVMC specification in the device's Product Specification * and the command parameters). +* - This call will make the SoftDevice trigger a hardfault when the page is erased, if it is +* protected. * * * @param[in] page_number Page number of the page to erase @@ -831,7 +838,7 @@ SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. * @retval ::NRF_ERROR_INVALID_ADDR Tried to erase to a non existing flash page. * @retval ::NRF_ERROR_BUSY The previous command has not yet completed. -* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a protected page. +* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a page outside the application flash area. * @retval ::NRF_SUCCESS The command was accepted. */ SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)); @@ -842,14 +849,19 @@ SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)) * Commands to set the flash protection configuration registers. This sets the CONFIGx registers of the BPROT peripheral. * + * @note Not all parameters are valid for all products. Some bits in each parameter may not be + * valid for your product. Please refer your Product Specification for more details. + * * @note To read the values read them directly. They are only write-protected. * + * @note It is possible to use @ref sd_protected_register_write instead of this function. + * * @param[in] block_cfg0 Value to be written to the configuration register. * @param[in] block_cfg1 Value to be written to the configuration register. * @param[in] block_cfg2 Value to be written to the configuration register. * @param[in] block_cfg3 Value to be written to the configuration register. * - * @retval ::NRF_ERROR_FORBIDDEN Tried to protect the SoftDevice. + * @retval ::NRF_ERROR_NOT_SUPPORTED Non-zero value supplied to one or more of the unsupported parameters. * @retval ::NRF_SUCCESS Values successfully written to configuration registers. */ SVCALL(SD_FLASH_PROTECT, uint32_t, sd_flash_protect(uint32_t block_cfg0, uint32_t block_cfg1, uint32_t block_cfg2, uint32_t block_cfg3)); @@ -921,6 +933,27 @@ SVCALL(SD_FLASH_PROTECT, uint32_t, sd_flash_protect(uint32_t block_cfg0, uint32_ */ SVCALL(SD_RADIO_REQUEST, uint32_t, sd_radio_request(nrf_radio_request_t const * p_request)); +/**@brief Write register protected by the SoftDevice + * + * This function writes to a register that is write-protected by the SoftDevice. Please refer to your + * SoftDevice Specification for more details about which registers that are protected by SoftDevice. + * This function can write to the following protected peripheral: + * - BPROT + * + * @note Protected registers may be read directly. + * @note Register that are write-once will return @ref NRF_SUCCESS on second set, even the value in + * the register has not changed. See the Product Specification for more details about register + * properties. + * + * @param[in] p_register Pointer to register to be written. + * @param[in] value Value to be written to the register. + * + * @retval ::NRF_ERROR_INVALID_ADDR This function can not write to the reguested register. + * @retval ::NRF_SUCCESS Value successfully written to register. + * + */ +SVCALL(SD_PROTECTED_REGISTER_WRITE, uint32_t, sd_protected_register_write(volatile uint32_t * p_register, uint32_t value)); + /**@} */ #ifdef __cplusplus diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_svc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_svc.h new file mode 100644 index 0000000000..292c692982 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_svc.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef NRF_SVC__ +#define NRF_SVC__ + +#include "stdint.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef SVCALL_AS_NORMAL_FUNCTION +#define SVCALL(number, return_type, signature) return_type signature +#else + +#ifndef SVCALL +#if defined (__CC_ARM) +#define SVCALL(number, return_type, signature) return_type __svc(number) signature +#elif defined (__GNUC__) +#ifdef __cplusplus +#define GCC_CAST_CPP (uint16_t) +#else +#define GCC_CAST_CPP +#endif +#define SVCALL(number, return_type, signature) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wreturn-type\"") \ + __attribute__((naked)) \ + __attribute__((unused)) \ + static return_type signature \ + { \ + __asm( \ + "svc %0\n" \ + "bx r14" : : "I" (GCC_CAST_CPP number) : "r0" \ + ); \ + } \ + _Pragma("GCC diagnostic pop") + +#elif defined (__ICCARM__) +#define PRAGMA(x) _Pragma(#x) +#define SVCALL(number, return_type, signature) \ +PRAGMA(swi_number = (number)) \ + __swi return_type signature; +#else +#define SVCALL(number, return_type, signature) return_type signature +#endif +#endif // SVCALL + +#endif // SVCALL_AS_NORMAL_FUNCTION + +#ifdef __cplusplus +} +#endif +#endif // NRF_SVC__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/hex/s132_nrf52_6.0.0_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/hex/s132_nrf52_6.0.0_licence-agreement.txt new file mode 100644 index 0000000000..a71adee7b9 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/hex/s132_nrf52_6.0.0_licence-agreement.txt @@ -0,0 +1,35 @@ +Copyright (c) 2007 - 2018, Nordic Semiconductor ASA +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form, except as embedded into a Nordic + Semiconductor ASA integrated circuit in a product or a software update for + such product, must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of Nordic Semiconductor ASA nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +4. This software, with or without modification, must only be used with a + Nordic Semiconductor ASA integrated circuit. + +5. Any software provided in binary form under this license must not be reverse + engineered, decompiled, modified and/or disassembled. + +THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/hex/s132_nrf52_6.0.0_softdevice.hex b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/hex/s132_nrf52_6.0.0_softdevice.hex new file mode 100644 index 0000000000..be148e3077 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/hex/s132_nrf52_6.0.0_softdevice.hex @@ -0,0 +1,9127 @@ +:020000040000FA +:10100000E0120020D1430200192F000043430200E8 +:10101000192F0000192F0000192F000000000000F8 +:101020000000000000000000000000002944020051 +:10103000192F000000000000192F0000192F0000D8 +:101040009144020097440200192F0000192F00005C +:10105000192F0000192F0000192F0000192F000070 +:101060009D440200192F0000192F0000A344020024 +:10107000192F0000A9440200AF440200B544020049 +:10108000192F0000192F0000192F0000192F000040 +:10109000192F0000192F0000192F0000192F000030 +:1010A000192F0000BB440200192F0000192F000067 +:1010B000192F0000192F0000192F0000192F000010 +:1010C000C1440200192F0000192F0000192F000041 +:1010D000192F0000192F0000192F0000192F0000F0 +:1010E000192F0000192F0000192F0000192F0000E0 +:1010F000192F0000192F0000192F0000192F0000D0 +:10110000192F0000192F000000F002F823F04DF90C +:101110000AA090E8000C82448344AAF10107DA4552 +:1011200001D123F042F9AFF2090EBAE80F0013F033 +:10113000010F18BFFB1A43F0010318479038020053 +:10114000B03802000A444FF0000C10F8013B13F0D5 +:10115000070408BF10F8014B1D1108BF10F8015B10 +:10116000641E05D010F8016B641E01F8016BF9D103 +:1011700013F0080F1EBF10F8014BAD1C0C1B09D15A +:101180006D1E58BF01F801CBFAD505E014F8016BCC +:1011900001F8016B6D1EF9D59142D6D3704700005E +:1011A0000023002400250026103A28BF78C1FBD870 +:1011B000520728BF30C148BF0B6070471FB500F011 +:1011C0003DF88DE80F001FBD1EF0040F0CBFEFF3BC +:1011D0000880EFF30980014A10470000752E0000D7 +:1011E0008269034981614FF001001044704700009B +:1011F000F511000001B41EB400B512F00FFE01B4E9 +:101200000198864601BC01B01EBD0000F0B4404606 +:10121000494652465B460FB402A0013001B506486C +:10122000004700BF01BC86460FBC804689469246F7 +:101230009B46F0BC704700000911000023F0B2B8D3 +:1012400070B51A4C054609202070A01C00F05FF80C +:101250005920A08029462046BDE8704008F05CB8BF +:1012600008F065B870B50C461149097829B1A0F1AC +:1012700060015E2908D3012013E0602804D06928AA +:1012800002D043F201000CE020CC0A4E94E80E009C +:1012900006EB8000A0F58050241FD0F8806E284611 +:1012A000B047206070BD012070470000080000209A +:1012B0001C0000202845020010B504460021012032 +:1012C00000F03DF800210B2000F039F8042119202E +:1012D00000F035F804210D2000F031F804210E2033 +:1012E00000F02DF804210F2000F029F80421C84354 +:1012F00000F025F80621162000F021F8062115201F +:1013000000F01DF82046FFF79BFF002010BDA8212C +:1013100001807047FFF7A4BF11487047104870471D +:10132000104A10B514680F4B0F4A08331A60FFF7C4 +:1013300099FF0C48001D046010BD704770474907B5 +:10134000090E002806DA00F00F0000F1E02080F816 +:10135000141D704700F1E02080F800147047000071 +:1013600003F900421005024001000001FE4800217F +:1013700001604160018170472DE9F743044692B056 +:101380009146406813F00EF840B1606813F013F80E +:1013900020B9607800F00300022801D0012000E0AD +:1013A0000020F14E3072484612F0B8FF18B11020FC +:1013B00015B0BDE8F0834946012001F018FF002870 +:1013C000F6D101258DF842504FF4C050ADF84000E1 +:1013D000002210A9284606F047FC0028E8D18DF825 +:1013E00042504FF428504FF00008ADF840004746F7 +:1013F0001C216846CDF81C8022F07BFF9DF81C0064 +:1014000008AA20F00F00401C20F0F00010308DF8EA +:101410001C0020788DF81D0061789DF81E0061F396 +:10142000420040F001008DF81E009DF800000AA95E +:1014300040F002008DF800002089ADF83000ADF8D2 +:101440003270608907AFADF834000B97606810AC5C +:101450000E900A94684606F0FCF90028A8D1BDF861 +:10146000200030808DF8425042F60120ADF8400057 +:101470009DF81E0008AA20F00600801C20F0010044 +:101480008DF81E000220ADF83000ADF8340013A82E +:101490000E900AA9684606F0DCF9002888D1BDF84C +:1014A00020007080311D484600F033F9002887D1B4 +:1014B0008DF8425042F6A620ADF840001C21684647 +:1014C000CDF81C8022F015FF9DF81C00ADF83450BB +:1014D00020F00F00401C20F0F00010308DF81C00B0 +:1014E0009DF81D0008AA20F0FF008DF81D009DF852 +:1014F0001E000AA920F0060040F00100801C8DF8B3 +:101500001E009DF800008DF8445040F002008DF858 +:101510000000CDE90A4711A80E90ADF8305068469A +:1015200006F097F9002899D1BDF82000F08000203E +:101530003EE73EB504460820ADF80000204612F014 +:10154000EDFE08B110203EBD2146012001F04FFE06 +:101550000028F8D12088ADF804006088ADF80600B6 +:10156000A088ADF80800E088ADF80A007E4801AB1D +:101570006A468088002106F071FDBDF80010082938 +:10158000E1D003203EBD1FB5044600200290082094 +:10159000ADF80800CDF80CD0204612F0BFFE10B117 +:1015A000102004B010BD704802AA81884FF6FF7069 +:1015B00006F096FF0028F4D1BDF80810082901D0E4 +:1015C0000320EEE7BDF800102180BDF80210618015 +:1015D000BDF80410A180BDF80610E180E1E701B577 +:1015E00082B00220ADF800005F4802AB6A46408836 +:1015F000002106F033FDBDF80010022900D00320C1 +:101600000EBD1CB5002100910221ADF80010019023 +:1016100012F0AAFE08B110201CBD53486A4641884A +:101620004FF6FF7006F05CFFBDF800100229F3D002 +:1016300003201CBDFEB54C4C06461546207A0F46CD +:10164000C00705D0084612F069FE18B11020FEBD93 +:101650000F20FEBDF82D01D90C20FEBD304612F042 +:101660005DFE18BB208801A905F03CFE0028F4D1DE +:1016700030788DF80500208801A906F0CEFC0028FE +:10168000EBD100909DF800009DF8051040F002009D +:101690008DF80000090703D040F008008DF8000025 +:1016A0002088694606F056FC0028D6D1ADF80850CF +:1016B00020883B4602AA002106F0D0FCBDF80810A5 +:1016C000A942CAD00320FEBD7CB50546002000908B +:1016D00001900888ADF800000C462846019512F0EC +:1016E00061FE18B9204612F03FFE08B110207CBD03 +:1016F00015B1BDF8000050B11B486A4601884FF68D +:10170000FF7006F0EDFEBDF8001021807CBD0C20BE +:101710007CBD30B593B0044600200D4600901421E6 +:1017200001A822F0E6FD1C2108A822F0E2FD9DF8A8 +:101730000000CDF808D020F00F00401C20F0F00091 +:1017400010308DF800009DF8010020F0FF008DF8AA +:1017500001009DF8200040F002008DF820000120DB +:101760008DF8460002E000000C02002042F6042042 +:10177000ADF8440011A801902088ADF83C006088C5 +:10178000ADF83E00A088ADF84000E088ADF842001A +:101790009DF8020006AA20F00600801C20F001003F +:1017A0008DF802000820ADF80C00ADF810000FA86D +:1017B000059001A908A806F04CF8002803D1BDF84F +:1017C00018002880002013B030BD0000F0B5007B69 +:1017D000059F1E4614460D46012800D0FFDF0C2051 +:1017E00030803A203880002C08D0287A032806D090 +:1017F000287B012800D0FFDF17206081F0BDA88979 +:10180000FBE72DE9F04786B0144691F80C900E9A4C +:101810000D46B9F1010F0BD01021007B2E8A8846AE +:10182000052807D0062833D0FFDF06B0BDE8F087D3 +:101830000221F2E7E8890C2100EB400001EB4000B7 +:10184000188033201080002CEFD0E88960810027B9 +:101850001AE00096688808F1020301AA696900F09D +:1018600084FF06EB0800801C07EB470186B204EBFF +:101870004102BDF8040090810DF1060140460E3290 +:1018800010F018FE7F1CBFB26089B842E1D8CCE7E7 +:1018900034201080E889B9F1010F11D0122148439A +:1018A0000E301880002CC0D0E88960814846B9F11C +:1018B000010F00D00220207300270DF1040A1FE061 +:1018C0000621ECE70096688808F1020301AA69691D +:1018D00000F04BFF06EB0800801C86B2B9F1010F47 +:1018E00012D007EBC70004EB4000BDF80410C18123 +:1018F00010220AF10201103022F05AFC7F1CBFB204 +:101900006089B842DED890E707EB470104EB41025B +:10191000BDF80400D0810AF102014046103210F0F7 +:10192000C9FDEBE72DE9F0470E4688B090F80CC0F2 +:1019300096F80C80378AF5890C20109902F10C0476 +:101940004FF0000ABCF1030F08D0BCF1040F3ED0E9 +:10195000BCF1070F7DD0FFDF08B067E705EB850C12 +:1019600000EB4C00188031200880002AF4D0A8F148 +:10197000060000F0FF09558125E0182101A822F09A +:10198000B8FC00977088434601AA716900F0EDFE2B +:10199000BDF804002080BDF80600E080BDF8080016 +:1019A0002081A21C0DF10A01484610F083FDB9F117 +:1019B000000F00D018B184F804A0A4F802A007EB2F +:1019C000080087B20A346D1EADB2D6D2C4E705EB6B +:1019D000850C00EB4C00188032200880002ABBD018 +:1019E000A8F1050000F0FF09558137E000977088E5 +:1019F000434601AA716900F0B8FE9DF80600BDF8E3 +:101A00000410E1802179420860F3000162F3410192 +:101A1000820862F38201C20862F3C301020962F321 +:101A20000411420962F34511820962F386112171A2 +:101A3000C0096071BDF80700208122460DF109013F +:101A4000484610F037FD18B184F802A0A4F800A0B1 +:101A500000E007E007EB080087B20A346D1EADB264 +:101A6000C4D279E7A8F1020084B205FB08F000F1C6 +:101A70000E0CA3F800C035230B80002AA6D0558198 +:101A80009481009783B270880E32716900F06DFE08 +:101A900062E72DE9F84F1E460A9D0C4681462AB1A1 +:101AA000607A00F58070D080E089108199F80C0090 +:101AB0000C274FF000084FF00E0A0D2873D2DFE814 +:101AC00000F09E070E1C28303846556A7373730069 +:101AD000214648460095FFF779FEBDE8F88F207B48 +:101AE0009146082802D0032800D0FFDF378030203D +:101AF0000AE000BFA9F80A80EFE7207B914604289E +:101B000000D0FFDF378031202880B9F1000FF1D1FC +:101B1000E3E7207B9146042800D0FFDF37803220A6 +:101B2000F2E7207B9146022800D0FFDF3780332088 +:101B3000EAE7207B1746022800D0FFDF3420A6F812 +:101B400000A02880002FC8D0A7F80A80C5E7207B16 +:101B50001746042800D0FFDF3520A6F800A0288013 +:101B6000002FBAD04046A7F80A8012E0207B174623 +:101B7000052802D0062800D0FFDF10203080362054 +:101B80002880002FA9D0E0897881A7F80E80B9F8C5 +:101B90000E00B881A1E7207B9146072800D0FFDF27 +:101BA00037803720B0E72AE04FF0120018804FF05E +:101BB00038001700288090D0E0897881A7F80E803F +:101BC000A7F8108099F80C000A2805D00B2809D036 +:101BD0000C280DD0FFDF80E7207B0A2800D0FFDF34 +:101BE00001200AE0207B0B2800D0FFDF042004E066 +:101BF000207B0C2800D0FFDF052038736DE7FFDF66 +:101C00006BE770B50C46054601F025FC20B1007865 +:101C1000222804D2082070BD43F2020070BD0521C5 +:101C200028460EF0C5FE206008B1002070BD0320DC +:101C300070BD30B44880087820F00F00C01C20F040 +:101C4000F000903001F8080B1DCA81E81D0030BC7F +:101C500007F0E3BB2DE9FF4784B0002782460297D7 +:101C600007989046894612300AF014F9401D20F07A +:101C70000306079828B907A95046FFF7C2FF0028B6 +:101C800054D1B9F1000F05D00798017B19BB052588 +:101C900004681BE098F80000092803D00D2812D032 +:101CA000FFDF46E0079903254868B0B3497B4288C7 +:101CB0007143914239D98AB2B3B2011D0EF0EBFCE7 +:101CC0000446078002E0079C042508340CB12088F4 +:101CD00010B1032D29D02CE00798012112300AF011 +:101CE0000BF9ADF80C00024602AB2946504608F04D +:101CF000F0F9070001D1A01C029007983A46123073 +:101D0000C8F80400A8F802A003A94046029B0AF004 +:101D100000F9D8B10A2817D200E006E0DFE800F0A9 +:101D200007091414100B0D141412132014E60020CC +:101D300012E6112010E608200EE643F203000BE63F +:101D4000072009E60D2007E6032005E6BDF80C0094 +:101D50002346CDE900702A465046079900F015FD4C +:101D600057B9032D08D10798B3B2417B406871433E +:101D70008AB2011D0EF0A3FCB9F1000FD7D007996C +:101D800081F80C90D3E72DE9FE4F91461A881C4646 +:101D90008A468046FAB102AB494608F09AF9050036 +:101DA00019D04046A61C27880EF046FF324607266B +:101DB00029463B4600960EF054FB20882346CDE989 +:101DC00000504A465146404600F0DFFC002020808B +:101DD0000120BDE8FE8F0020FBE710B586B01C4651 +:101DE000AAB104238DF800301388ADF8083052886A +:101DF000ADF80A208A788DF80E200988ADF80C100D +:101E000000236A462146FFF725FF06B010BD1020CB +:101E1000FBE770B50D4605210EF0CAFD040000D1A8 +:101E2000FFDF294604F11200BDE870400AF04DB80A +:101E30002DE9F8430D468046002607F0EBFA0446EC +:101E40002878102878D2DFE800F0773B345331311E +:101E5000123131310831313131312879001FC0B2AE +:101E6000022801D0102810D114BBFFDF35E004B9DF +:101E7000FFDF052140460EF09BFD007B032806D0C6 +:101E800004280BD0072828D0FFDF072655E0287943 +:101E9000801FC0B2022820D050B1F6E72879401F39 +:101EA000C0B2022819D0102817D0EEE704B9FFDF1E +:101EB00013E004B9FFDF287901280ED1172137E09C +:101EC000052140460EF074FD070000D1FFDF07F149 +:101ED0001201404609F0D6FF2CB12A462146404661 +:101EE000FFF7A7FE29E01321404602F0A7FD24E0FA +:101EF00004B9FFDF052140460EF05AFD060000D16F +:101F0000FFDF694606F1120009F0C6FF060000D0A7 +:101F1000FFDFA988172901D2172200E00A46BDF881 +:101F20000000824202D9014602E005E01729C5D32C +:101F3000404600F03AFCD0E7FFDF3046BDE8F883CA +:101F4000401D20F0030219B102FB01F0001D00E06A +:101F500000201044704713B5009848B1002468462B +:101F60000EF043FB002C02D1F74A009911601CBD12 +:101F700001240020F4E72DE9F0470C461546242102 +:101F8000204622F0B6F905B9FFDFA87860732888EB +:101F9000DFF8B4A3401D20F00301AF788946DAF8DA +:101FA00000000EF040FB060000D1FFDF4FF00008FC +:101FB0002660A6F8008077B109FB07F1091D0AD059 +:101FC000DAF800000EF02FFB060000D1FFDF66609C +:101FD000C6F8008001E0C4F80480298804F11200EA +:101FE000BDE8F04709F040BF2DE9F047804601F118 +:101FF00012000D46814609F04DFF401DD24F20F0E2 +:1020000003026E7B1446296838680EF037FB3EB138 +:1020100004FB06F2121D03D0696838680EF02EFB2F +:1020200005200EF06DFC044605200EF071FC201A10 +:10203000012802D138680EF0EBFA49464046BDE867 +:10204000F04709F026BF70B5054605210EF0B0FC3B +:10205000040000D1FFDF04F112012846BDE8704002 +:1020600009F010BF2DE9F04F91B04FF0000BADF823 +:1020700034B0ADF804B047880C46054692460521B9 +:1020800038460EF095FC060000D1FFDF24B1A78092 +:10209000A4F806B0A4F808B0297809220B20B2EB06 +:1020A000111F7DD12A7A04F1100138274FF00C0856 +:1020B0004FF001090391102A73D2DFE802F072F2A7 +:1020C000F1F07F08D2888D9F3DDBF3EEB6B6307B12 +:1020D000022800D0FFDFA88908EBC001ADF804108A +:1020E0003021ADF83410002C25D06081B5F80E9069 +:1020F00000271DE004EBC708317C88F80E10F18939 +:10210000A8F80C10CDF800906888042304AA296967 +:1021100000F02BFBBDF81010A8F8101009F1040016 +:10212000BDF812107F1C1FFA80F9A8F81210BFB278 +:102130006089B842DED80DE1307B022800D0FFDF95 +:10214000E98908EBC100ADF804003020ADF8340097 +:10215000287B0A90001FC0B20F90002CEBD0618149 +:10216000B5F81090002725E0CDF8009068886969DF +:1021700003AA0A9B00F0F9FA0A9804EBC70848443E +:102180001FFA80F908F10C0204A90F9810F092F9D7 +:1021900018B188F80EB0A8F80CB0BDF80C1001E02A +:1021A000D4E0CFE0A8F81010BDF80E107F1CA8F8FE +:1021B0001210BFB26089B842D6D8CBE00DA800900B +:1021C00001AB224629463046FFF71BFBC2E0307BBD +:1021D000082805D0FFDF03E0307B082800D0FFDFB0 +:1021E000E8891030ADF804003620ADF83400002C3A +:1021F0003FD0A9896181F189A18127E0307B09283D +:1022000000D0FFDFA88900F10C01ADF804103721E0 +:10221000ADF83410002C2CD06081E8890090AB8997 +:10222000688804F10C02296956E0E88939211030E8 +:1022300080B2ADF80400ADF83410002C74D0A98938 +:102240006181287A0E280AD002212173E989E1816F +:10225000288A0090EB8968886969039A3CE001212B +:10226000F3E70DA8009001AB224629463046FFF760 +:1022700059FB6FE0307B0A2800D0FFDF1220ADF859 +:102280000400ADF834704CB3A9896181A4F810B092 +:10229000A4F80EB084F80C905CE020E002E031E09D +:1022A00039E042E0307B0B2800D0FFDF288AADF810 +:1022B00034701230ADF8040084B104212173A9896F +:1022C0006181E989E181298A2182688A00902B8ACB +:1022D000688804F11202696900F047FA3AE0307B3D +:1022E0000C2800D0FFDF1220ADF80400ADF83470E8 +:1022F0003CB305212173A4F80AB0A4F80EB0A4F8E9 +:1023000010B027E00DA8009001AB224629463046C8 +:10231000FFF75CFA1EE00DA8009001AB22462946AB +:102320003046FFF7B6FB15E034E03B21ADF8040082 +:10233000ADF8341074B3A4F80690A4F808B084F88B +:102340000AB007E0FFDF05E010000020297A01292C +:1023500017D0FFDFBDF80400AAF800006CB1BDF88B +:1023600034002080BDF804006080BDF834003928B6 +:1023700003D03C2801D086F80CB011B00020BDE895 +:10238000F08F3C21ADF80400ADF8341014B1697A37 +:10239000A172DFE7AAF80000EFE72DE9F8435688BD +:1023A0000F4680461546052130460EF001FB04001D +:1023B00000D1FFDF123400943B46414630466A6844 +:1023C00009F0DBFEBAE570B50D4605210EF0F0FA16 +:1023D000040000D1FFDF294604F11200BDE870407F +:1023E00009F065BD70B50D4605210EF0E1FA040057 +:1023F00000D1FFDF294604F11200BDE8704009F06A +:1024000083BD70B5054605210EF0D2FA040000D157 +:10241000FFDF04F1080321462846BDE8704004228E +:10242000B1E470B5054605210EF0C2FA040000D1F2 +:10243000FFDF214628462368BDE870400522A2E45C +:1024400070B5064605210EF0B3FA040000D1FFDF97 +:1024500004F1120009F01EFD401D20F0030511E0FB +:10246000011D00880322431821463046FFF78BFCEC +:1024700000280BD0607BABB2684382B26068011D5C +:102480000EF053F9606841880029E9D170BD70B53C +:102490000E46054606F0BEFF040000D1FFDF012016 +:1024A000207266726580207820F00F00C01C20F03A +:1024B000F00030302070BDE8704006F0AEBF2DE96E +:1024C000F0438BB00D461446814606A9FFF799FBF1 +:1024D000002814D14FF6FF7601274FF420588CB115 +:1024E00003208DF800001020ADF8100007A805901B +:1024F00007AA204604A90FF0FCFF78B107200BB013 +:10250000BDE8F0830820ADF808508DF80E708DF806 +:102510000000ADF80A60ADF80C800CE00698A178D8 +:1025200001742188C1818DF80E70ADF80850ADF8A6 +:102530000C80ADF80A606A4602214846069BFFF708 +:1025400089FBDCE708B501228DF8022042F6020281 +:10255000ADF800200A4603236946FFF73EFC08BD9C +:1025600008B501228DF8022042F60302ADF80020E2 +:102570000A4604236946FFF730FC08BD00B587B062 +:1025800079B102228DF800200A88ADF80820498828 +:10259000ADF80A1000236A460521FFF75BFB07B080 +:1025A00000BD1020FBE709B1072316E407207047A0 +:1025B00070B588B00D461446064606A9FFF721FB04 +:1025C00000280ED17CB10620ADF808508DF800002F +:1025D000ADF80A40069B6A460821DC813046FFF7C9 +:1025E00039FB08B070BD05208DF80000ADF808502B +:1025F000F0E700B587B059B107238DF80030ADF88A +:102600000820039100236A460921FFF723FBC6E750 +:102610001020C4E770B588B00C460646002506A910 +:10262000FFF7EFFA0028DCD106980121123009F0FB +:1026300063FC9CB12178062921D2DFE801F0200556 +:1026400005160318801E80B2C01EE28880B20AB14F +:10265000A3681BB1824203D90C20C2E71020C0E757 +:10266000042904D0A08850B901E00620B9E7012967 +:1026700013D0022905D004291CD005292AD007200F +:10268000AFE709208DF800006088ADF80800E08809 +:10269000ADF80A00A068039023E00A208DF800003E +:1026A0006088ADF80800E088ADF80A00A0680A2547 +:1026B000039016E00B208DF800006088ADF808004C +:1026C000A088ADF80A00E088ADF80C00A0680B25E2 +:1026D000049006E00C208DF8000060788DF808006A +:1026E0000C256A4629463046069BFFF7B3FA78E781 +:1026F00000B587B00D228DF80020ADF8081000233A +:102700006A461946FFF7A6FA49E700B587B071B1E6 +:1027100002228DF800200A88ADF808204988ADF81B +:102720000A1000236A460621FFF794FA37E71020C3 +:1027300035E770B586B0064601200D46ADF80810A5 +:102740008DF80000014600236A463046FFF782FA02 +:10275000040008D12946304605F09AFC0021304695 +:1027600005F0B4FC204606B070BDF8B51C46154611 +:102770000E46069F0EF04EFA2346FF1DBCB23146B0 +:102780002A4600940DF039FEF8BD30B41146DDE95B +:1027900002423CB1032903D0002330BC08F022BB25 +:1027A0000123FAE71A8030BC704770B50C46054625 +:1027B000FFF72FFB2146284605F079FC2846BDE8A7 +:1027C0007040012105F082BC4FF0E0224FF400413F +:1027D0000020C2F88011204908702049900208604A +:1027E000704730B51C4D04462878A04218BF002C15 +:1027F00002D0002818BFFFDF2878A04208BF30BDF4 +:102800002C701749154A0020ECB1164DDFF858C05E +:10281000131F012C0DD0022C1CBFFFDF30BD086040 +:1028200003200860CCF800504FF4000010601860DE +:1028300030BD086002200860CCF800504FF04070B6 +:102840001060186030BD086008604FF06070106064 +:1028500030BD00B5FFDF00BD1800002008F50140C5 +:1028600000F500408C02002014F5004070B50B20EC +:1028700000F0B5F9082000F0B2F900210B2000F0BB +:10288000C4F90021082000F0C0F9EC4C0125656076 +:10289000A5600020C4F84001C4F84401C4F8480110 +:1028A0000B2000F0A7F9082000F0A4F90B2000F09D +:1028B0008BF9256070BD10B50B2000F090F9082051 +:1028C00000F08DF9DD48012141608160DC490A6832 +:1028D000002AFCD10021C0F84011C0F84411C0F812 +:1028E00048110B2000F086F9BDE81040082000F0E8 +:1028F00081B910B50B2000F07DF9BDE8104008202B +:1029000000F078B900B530B1012806D0022806D011 +:10291000FFDF002000BDCB4800BDCB4800BDCA484A +:10292000001D00BD70B5C9494FF000400860C84D9A +:10293000C00BC5F80803C74800240460C5F840412F +:102940000820C43500F04BF9C5F83C41C24804707A +:1029500070BD08B5B94A002128B1012811D002285C +:102960001CD0FFDF08BD4FF48030C2F80803C2F866 +:102970004803B3483C300160C2F84011BDE808404C +:10298000D0E74FF40030C2F80803C2F84803AC485F +:1029900040300160C2F84411AB480CE04FF4802095 +:1029A000C2F80803C2F84803A54844300160C2F8E1 +:1029B0004811A548001D0068009008BD70B5164676 +:1029C0000D460446022800D9FFDF00229B48012360 +:1029D00004F110018B4000EB8401C1F8405526B191 +:1029E000C1F84021C0F8043303E0C0F80833C1F84F +:1029F0004021C0F8443370BD2DE9F0411C46154616 +:102A000030B1012834D0022839D0FFDFBDE8F08191 +:102A1000891E002221F07F411046FFF7CFFF012CD5 +:102A200024D000208C4E8A4F012470703C6189496B +:102A300000203C3908600220091D086085490420F7 +:102A40003039086083483D350560C7F800420820EA +:102A500000F0D0F82004C7F80403082000F0B4F810 +:102A60007A49E007091F08603470CFE70120D9E7F1 +:102A7000012B02D00022012005E00122FBE7012BFF +:102A800004D000220220BDE8F04197E70122F9E7D7 +:102A90006B480068704770B500F0C7F8674C054692 +:102AA000D4F840010026012809D1D4F80803C00356 +:102AB00005D54FF48030C4F80803C4F84061D4F859 +:102AC000440101280CD1D4F80803800308D54FF441 +:102AD0000030C4F80803C4F84461012010F0CDFCB4 +:102AE000D4F8480101280CD1D4F80803400308D5D4 +:102AF0004FF48020C4F80803C4F84861022010F0A5 +:102B0000BCFC5648056070BD70B500F08EF8524DA3 +:102B10000446287858B1FFF705FF687820B10020F7 +:102B200085F8010010F0A9FC4C48046070BD03203A +:102B3000F8E74FF0E0214FF40010C1F800027047B1 +:102B4000152000F057B8424901200861082000F024 +:102B500051B83F494FF47C10C1F8080300200246E9 +:102B600001EB8003C3F84025C3F84021401CC0B2EC +:102B70000628F5D37047410A43F609525143C0F382 +:102B8000080010FB02F000F5807001EB5020704748 +:102B900010B5430B48F2376463431B0C5C020C60B6 +:102BA0002F4C03FB04002F4B4CF2F72443435B0DE7 +:102BB00013FB04F404EB402000F580704012107009 +:102BC00008681844086010BD00F01F020121914000 +:102BD0004009800000F1E020C0F80011704700F0CB +:102BE0001F02012191404009800000F1E020C0F85F +:102BF0008011704700F01F020121914040098000C0 +:102C000000F1E020C0F8801270474907090E002843 +:102C100006DA00F00F0000F1E02080F8141D704784 +:102C200000F1E02080F8001470470C48001F006895 +:102C30000A4A0D49121D11607047000000B00040A3 +:102C400004B500404081004044B1004008F5014017 +:102C500000800040408500403800002014050240FC +:102C6000F7C2FFFF6F0C0100010000010A4810B518 +:102C70000468094909480831086010F092FC0648C8 +:102C8000001D046010BD0649002008604FF0E021DF +:102C90000220C1F8800270471005024001000001C7 +:102CA000FC1F004010B50D2000F06FF8C4B26FF0AB +:102CB000040000F06AF8C0B2844200D0FFDF3A4955 +:102CC0000120086010BD70B50D2000F048F8374CA9 +:102CD0000020C4F800010125C4F804530D2000F0C1 +:102CE00049F825604FF0E0216014C1F8000170BD83 +:102CF00010B50D2000F033F82C480121416000216F +:102D0000C0F80011BDE810400D2000F033B828488D +:102D100010B5046826492748083108602349D1F8CE +:102D20000001012804D0FFDF2148001D046010BD10 +:102D30001D48001D00680022C0B2C1F8002110F03B +:102D4000E7FFF1E710B51948D0F800110029FBD0D2 +:102D5000FFF7DDFFBDE810400D2000F00BB800F0DC +:102D60001F02012191404009800000F1E020C0F8DD +:102D70008011704700F01F0201219140400980003E +:102D800000F1E020C0F880127047002806DA00F059 +:102D90000F0000F1E02090F8140D03E000F1E020B6 +:102DA00090F800044009704704D5004000D000406E +:102DB000100502400100000110B5202000F082F84B +:102DC000202000F08AF84A49202081F8000449496F +:102DD00000060860091D48480860FEF79DFA45494D +:102DE000C83108604548D0F8041341F00101C0F82B +:102DF0000413D0F8041341F08071C0F804133C4967 +:102E000001201C39C1F8000110BD10B5202000F0D0 +:102E100059F8384800210160001D0160354A481EFC +:102E2000E83A1060354AC2F80803324BC8331960DB +:102E3000C2F80001C2F8600131490860BDE81040E5 +:102E4000202000F04AB82B492E48EC390860704722 +:102E500028492C48E8390860704726480160001D61 +:102E6000521E0260704723490120E8390860BFF311 +:102E70004F8F704770B51F4A8069E83A2149116049 +:102E80001E49D1F8006100231F4D1D4A5C1E1EB172 +:102E9000A84206D300210FE0D1F8606186B1A842B4 +:102EA00009D2C1F80031C1F860311460BDE870404A +:102EB000202000F012B81168BDE8704021F040BA3F +:102EC000FFDF70BD00F01F0201219140400980002A +:102ED00000F1E020C0F88011704700F01F020121CE +:102EE00091404009800000F1E020C0F88012704756 +:102EF00020E000E000060240C41400200000024070 +:102F00000004024001000001006002000F4A126844 +:102F10000D498A420CD118470C4A12680A4B9A4252 +:102F200006D101B510F06EFFFFF78DFFBDE801403F +:102F3000074909680958084706480749054A064BE2 +:102F40007047000000000000BEBAFECAB0000020BA +:102F500004000020E0120020E012002070B50C46B2 +:102F6000054609F0A7FA21462846BDE870400AF058 +:102F70008CBB10B511F0B0FBFFF726FC11F04CFA3A +:102F8000BDE8104011F0FEBA0120810708607047CB +:102F9000012081074860704712480068C00700D0D0 +:102FA000012070470F48001F0068C00700D00120B3 +:102FB00070470C4808300068C00700D001207047F7 +:102FC000084810300068704706490C310A68D2037F +:102FD00006D5096801F00301814201D10120704743 +:102FE000002070470C0400407047704770477047DE +:102FF000704770477047704770470004050600002F +:103000002CFFFFFFDBE5B15100600200A800FFFFCD +:1030100084000000808D5B0016425791AD5F58BC64 +:103020008E702F5A0FAA100DBCD52BFD30B5FC4D5C +:103030000446062CA9780ED2DFE804F0030E0E0E2B +:103040000509FFDF08E0022906D0FFDF04E00329BD +:1030500002D0FFDF00E0FFDFAC7030BD30B50446CA +:103060001038EF4D07280CD2DFE800F0040C060CF6 +:103070000C0C0C00FFDF05E0287E112802D0FFDFDA +:1030800000E0FFDF2C7630BD2DE9F0410FF09CFB16 +:10309000044610F038FD201AC5B206200DF030FCB1 +:1030A000044606200DF034FC211ADD4C207E122847 +:1030B00018D000200F1807200DF022FC064607202C +:1030C0000DF026FC301A3918207E13280CD0002071 +:1030D0000144A078042809D000200844281AC0B26E +:1030E000BDE8F0810120E5E70120F1E70120F4E7E8 +:1030F000CB4810B590F825004108C94800F12600DA +:1031000005D00BF0B6FABDE8104005F0AFBF0BF0EC +:1031100089FAF8E730B50446A1F120000D460A28E7 +:103120004AD2DFE800F005070C1C2328353A3F445B +:10313000FFDF42E0207820283FD1FFDF3DE0B848A4 +:103140008178052939D0007E122836D020782428AD +:1031500033D0252831D023282FD0FFDF2DE0207851 +:1031600022282AD0232828D8FFDF26E0207822280A +:1031700023D0FFDF21E0207822281ED024281CD075 +:1031800026281AD0272818D0292816D0FFDF14E0C7 +:103190002078252811D0FFDF0FE0207825280CD0DB +:1031A000FFDF0AE02078252807D0FFDF05E0207840 +:1031B000282802D0FFDF00E0FFDF257030BD10B50A +:1031C000012803D0022805D0FFDF10BDBDE8104064 +:1031D00003202BE79248007E122800D0FFDF002159 +:1031E000052011F04FF8BDE81040112036E71FB55B +:1031F00004466A46002001F01FFEB4B1BDF802206B +:103200004FF6FF700621824201D1ADF80210BDF8E1 +:103210000420824201D1ADF80410BDF808108142AB +:1032200003D14FF44860ADF8080068460BF089FF01 +:1032300005F01CFF04B010BD70B514460D460646DF +:1032400011F06CF858B90DB1A54201D90C2070BD30 +:10325000002408E056F8240011F060F808B11020AE +:1032600070BD641CE4B2AC42F4D3002070BD2DE903 +:10327000F04105461F4690460E460024006811F0B6 +:103280009AF808B110202BE728680028A88802D0F7 +:10329000B84202D84FE00028F5D0092020E728687E +:1032A000025DB2B1611C475C152F2DD03BDC3AD2D8 +:1032B000DFE807F03912222228282A2A3131393949 +:1032C00039393939393939392200025D32BB641C48 +:1032D000A4B2A142F9D833E0022ADED1A21C805C5C +:1032E00088F80000072801D2400701D40A20F7E639 +:1032F000307840F0010015E0D043C00707E0012A14 +:1033000007D010E00620EBE61007A0F1805000285F +:10331000F5D01846E4E63078820701D50B20DFE6C9 +:1033200040F0020030702868005D084484B2A8882C +:10333000A04202D2B1E74FF4485381B2A142AED8C5 +:103340000020CDE610B5027843F202235408012292 +:10335000022C12D003DC3CB1012C16D106E0032C68 +:1033600010D07F2C11D112E0002011E080790324CD +:10337000B4EB901F09D10A700BE08079B2EB901F7B +:1033800003D1F8E780798009F5D0184610BDFF20F9 +:103390000870002010BD224991F82E2042B191F80A +:1033A0002F10022909D0032909D043F202207047C7 +:1033B00001461B48253001F092BD032100E00121A8 +:1033C00001700020704738B50C460546694601F08B +:1033D00086FD00280DD19DF80010207861F347008C +:1033E000207055F8010FC4F80100A888A4F8050062 +:1033F000002038BD38B51378B0B1022814D0FF28AA +:103400001BD008A46D46246800944C7905EB9414F5 +:10341000247864F34703137003280AD010E00000F7 +:10342000D80100200302FF0123F0FE0313700228DD +:10343000F2D1D8B240F0010005E043F0FE00107078 +:10344000107820F0010010700868C2F80100888828 +:10345000A2F8050038BD02210DF0AABA38B50C4615 +:103460000978222901D2082038BDADF800008DF876 +:10347000022068460BF044F905F0F8FD050003D181 +:1034800021212046FFF746FE284638BD1CB5002006 +:103490008DF80000CDF80100ADF80500FE4890F869 +:1034A0002E00022801D0012000E000208DF8070046 +:1034B00068460BF056FB002800D0FFDF1CBD002241 +:1034C0000A80437892B263F345120A8043785B081E +:1034D00063F386120A8000780C282BD2DFE800F014 +:1034E0002A06090E1116191C1F220C2742F0110082 +:1034F00009E042F01D0008800020704742F01100F2 +:1035000012E042F0100040F00200F4E742F0100038 +:10351000F1E742F00100EEE742F0010004E042F082 +:103520000200E8E742F0020040F00400E3E742F066 +:103530000400E0E7072070472DE9FF478AB0002527 +:10354000BDF82C6082461C4690468DF81C507007D2 +:1035500003D5606810F0E2FE68B9CF4F4FF0010963 +:1035600097F82E0058B197F82F00022807D160680D +:1035700010F021FF18B110200EB0BDE8F087300721 +:1035800002D5A089802816D8700705D4B8F1000F9D +:1035900002D097F8240070B1E07DC0F300108DF8E0 +:1035A0001B00617D072041B1012906D00229E3D02B +:1035B0000429E1D12CE00720DEE749468DF8179079 +:1035C000F00609D4A27D072032B1012A04D0022AD4 +:1035D00005D0042AD0D11BE08DF8191002E002209A +:1035E0008DF819008DF815806068B0B107A9FFF754 +:1035F000A9FE0028C0D19DF81C00FF280AD06068F1 +:1036000050F8011FCDF80F108088ADF8130008E0C6 +:103610000620B1E743F20220AEE7CDF80F50ADF837 +:103620001350E07B0028F3D1207C0028F0D1607C8F +:103630000028EDD1A07C0028EAD1E07CC006E7D1CB +:103640008DF800A0BDF82C00ADF80200A068019034 +:10365000A068029004F10F0001F035FC8DF80C0019 +:103660000DF10D00FFF797FE00B1FFDF9DF81C0084 +:103670008DF80E008DF816508DF81850E07D08A9D1 +:1036800000F00F008DF81A0068460BF036FF05F0C9 +:10369000EDFC71E7F0B59DB000228DF868208DF843 +:1036A00058208DF8602005468DF86C2012921392F8 +:1036B0001492159219B10FC912AC84E80F00764C20 +:1036C000A078052801D004280CD11298616888429E +:1036D00000D120B91498E168884203D110B10820C4 +:1036E0001DB0F0BD1F26334618AA1AA912A8FFF76D +:1036F000BEFD0028F4D133461BAA16A914A8FFF773 +:10370000B6FD0028ECD19DF85800C00701D00A2072 +:10371000E6E7A08A410708D4A17D31B19DF8601089 +:10372000890702D043F20120DAE79DF86010C9074B +:1037300009D0400707D4208818B144F2506188426C +:1037400001D90720CCE78DF8005003268DF80160E1 +:1037500001278DF80270BDF84C208DF8032001A8D8 +:10376000129920F025FD68460BF028FF05F07EFC3D +:103770000028B5D18DF824508DF825608DF826707D +:10378000BDF854208DF827200AA8149920F010FDC8 +:1037900009A80BF060FF05F069FC0028A0D112AD6C +:1037A000241D95E80F0084E80F00002098E770B50D +:1037B00086B00D46040005D010F0FDFD20B11020AC +:1037C00006B070BD0820FBE72078C107A98802D0A9 +:1037D000FF2902D303E01F2901D20920F0E7800767 +:1037E00061D4FFF751FC38B12078C0F3C101012941 +:1037F00004D0032902D005E01320E1E7264991F81F +:10380000241041B1C0074FF000054FF0010604D06D +:103810008DF80F6003E00720D2E78DF80F5068465F +:10382000FFF7B9FD00B1FFDF2078C0F3C1008DF8CC +:1038300001008DF80250607808B98DF80260607858 +:10384000C00705D09DF8020040F001008DF802008D +:103850006078800705D59DF8020040F002008DF8E1 +:1038600002006078400705D59DF8020040F0040092 +:103870008DF802002078C0F380008DF80300608886 +:10388000ADF80600A088ADF80A00207A58B9607A31 +:1038900048B9A07A38B901E0D8010020E07A10B91F +:1038A000207BC00601D006208AE704F1080001F061 +:1038B0000AFB8DF80E0068460BF087F905F0D6FB81 +:1038C00000288BD18DF810608DF81150ADF8125092 +:1038D000ADF8145004A80BF0FDF905F0C7FB002863 +:1038E0008BD1E08864280AD248B1012001F001FBA5 +:1038F000002891D12078C00705D0152004E064216C +:10390000B0FBF1F0F2E71320FFF7A8FB002057E728 +:103910002DE9FF470220FF4E8DF804000027708E2E +:10392000ADF80600B84643F202094CE001A80CF0DD +:10393000A6FF050006D0708EA8B3A6F83280ADF8B9 +:1039400006803EE0039CA07F01072DD504F12400F2 +:103950000090A28EBDF80800214604F1360301F064 +:1039600054FC050005D04D452AD0112D3CD0FFDF79 +:103970003AE0A07F20F00801E07F420862F3C7111F +:10398000A177810861F30000E07794F8210000F04E +:103990001F0084F820002078282826D129212046DD +:1039A000FFF7B8FB21E014E040070AD5BDF8080096 +:1039B00004F10E0101F0ABFA05000DD04D4510D118 +:1039C00000257F1CFFB202200CF09AFF401CB84279 +:1039D000ACD8052D11D008E0A07F20F00400A0771E +:1039E00003E0112D00D0FFDF0025BDF80600708632 +:1039F000052D04D0284604B0BFE5A6F8328000208B +:103A0000F9E770B50646FFF726FD054605F002FD0D +:103A1000040000D1FFDF6680207820F00F00801CBA +:103A200020F0F000203020700620207295F83E0033 +:103A30006072BDE8704005F0F0BC2DE9F04786B03B +:103A4000040000D1FFDF2078B24D20F00F00801C71 +:103A500020F0F0007030207060680178491F1B2949 +:103A600033D2DFE801F0FE32323255FD320EFDFD79 +:103A700042FC32323278FCFCFB323232FCFCFAF986 +:103A8000FC00C6883046FFF7E6FC0546304607F0E6 +:103A9000A7F8E0B16068007A85F83E002121284649 +:103AA000FFF738FB3046FEF7CEFA304603F016FE3D +:103AB0003146012010F0E6FBA87F20F01000A87727 +:103AC000FFF726FF002800D0FFDF06B055E520787D +:103AD00020F0F000203020700620207266806068A0 +:103AE000007A607205F099FCD8E7C5882846FFF790 +:103AF000B2FC00B9FFDF60680079012800D0FFDF69 +:103B00006068017A06B02846BDE8F04707F044BC7B +:103B1000C6883046FFF79FFC050000D1FFDF05F0A7 +:103B20007CFC606831460089288160684089688132 +:103B300060688089A881012010F0A4FB0020A8758E +:103B4000A87F00F003000228BFD1FFF7E1FE0028A4 +:103B5000BBD0FFDFB9E70079022811D000B1FFDF49 +:103B600005F05BFC6668B6F806A0307A361D0128C1 +:103B70000CD0687E814605F0E5F9070009D107E021 +:103B800006B00220BDE8F047FFF719BBE878F1E77F +:103B9000FFDF0022022150460CF001FF040000D19B +:103BA000FFDF22212046FFF7B5FA3079012800D047 +:103BB0000220A17F804668F30101A177308B20812C +:103BC000708B6081B08BA08184F822908DF8088082 +:103BD000B8680090F86801906A46032150460CF0DE +:103BE000DEFE00B9FFDFB888ADF81000B8788DF8B8 +:103BF000120004AA052150460CF0D1FE00B9FFDFE7 +:103C0000B888ADF80C00F8788DF80E0003AA0421EE +:103C100050460CF0C4FE00B9FFDF062106F1120089 +:103C200001F093F938B37079800700D5FFDF71791F +:103C3000E07D61F34700E075D6F80600A061708969 +:103C4000A083062106F10C0001F07FF9E8B195F898 +:103C500025004108607805E032E02AE047E03FE0D7 +:103C600021E035E061F347006070D5F82600C4F824 +:103C70000200688D12E0E07D20F0FE00801CE075FF +:103C8000D6F81200A061F08ADAE7607820F0FE0032 +:103C9000801C6070F068C4F80200308AE080404602 +:103CA000FFF78DFA11E706B02046BDE8F04701F0B6 +:103CB00035BD05F0B2FB15F8300F40F0020005E00D +:103CC00005F0ABFB15F8300F40F004002870FCE65F +:103CD000287E132809D01528E4D11620FFF7BEF955 +:103CE00006B0BDE8F04705F098BB1420F6E7A978C8 +:103CF000052909D00429D5D105F08FFB022006B093 +:103D0000BDE8F047FFF792B900790028CAD0E878FB +:103D100002E00000D801002001F0BCF805F07DFBB6 +:103D20000320ECE72DE9F05F054600784FF000082E +:103D30000009DFF820A891460C46464601287AD0B3 +:103D400001274FF0020C4FF6FF73022874D00728AA +:103D50000BD00A2871D0FFDFA9F8006014B1A4F8D5 +:103D6000008066800020BDE8F09F696804F10800CB +:103D70000A78172A70D010DC4FF0000B142A31D0CB +:103D800006DC052A6DD0092A0FD0102A7ED11FE04B +:103D9000152A7CD0162AF9D1F0E01B3A052A75D2F3 +:103DA000DFE802F009C5FDDAFC00C8884FF0120810 +:103DB0001026214675E14FF01C080A26D4B38888E6 +:103DC000A0806868807920726868C0796072C3E7F3 +:103DD0004FF01B0814266CB303202072686880889B +:103DE000A080B9E70A793C2AB6D00D1D4FF0100823 +:103DF0002C26FCB16988A180298B6182298B2182C4 +:103E0000698BA182A98BE1826B790246A91D1846B4 +:103E1000FFF7F0FA2879012810D084F80FC0FF20AE +:103E20002076C4F81CB0C4F820B0C4F824B0C4F89C +:103E300028B091E712E013E13BE135E1E7730AF1C5 +:103E4000040084F818B090E80E00DAF81000C4E915 +:103E50000930C4E907127FE7A8E002E0A9F8006092 +:103E600080E72C264FF01D08002CF7D00546A380D4 +:103E7000887B2A880F1D60F300022A80887B400817 +:103E800060F341022A80887B800801E0E6E0ADE033 +:103E900060F382022A80887BB91CC00860F3C302E9 +:103EA0002A80B87A0011401C60F3041202F07F00EF +:103EB00028807878AA1CFFF79DFA387D05F1090261 +:103EC00007F11501FFF796FA387B01F04DF82874D9 +:103ED000787B01F049F86874F87EA874787AE87401 +:103EE00097F83B002875B87B6875A5F816B0DAF826 +:103EF0001C00A861397ABAF82000884201D2014634 +:103F000010E0B87AC0F3411002280BD0012809D084 +:103F1000288820F060002880A1840A4607F11C014F +:103F2000A86998E0288820F060004030F3E7112667 +:103F30004FF02008002C91D0A380686804F10A0299 +:103F4000007920726868007B607269688B1D48790F +:103F50001946FFF74FFAFFE60A264FF02108002C1A +:103F6000E9D08888A0806868807920726868C07904 +:103F700060729AF8301021F004018BE00B264FF0AC +:103F80002208002CD7D0C888A080686800792072E9 +:103F90006868007A00F0E8FF607201E052E039E002 +:103FA0006868407A00F0E0FFA072D5E61C264FF06A +:103FB0002608002CBFD0A3806868407960726868CA +:103FC000007AA0720AF1040090E80E00DAF81000FE +:103FD000C4E90530C4E90312686800793C2803D0BD +:103FE00043287DD0FFDFB7E62772B5E610264FF0F5 +:103FF0002408002C9FD08888A08068688079208160 +:104000006868807A608168680089A08168688089B2 +:10401000E081A1E610264FF02308002C8BD0888881 +:10402000A0806868C08820816868008960816868AD +:104030004089A08168688089E0819AF8301021F079 +:10404000020127E030264FF02508002C88D0A380FD +:1040500069682822496820F0ABF87DE64A4677E097 +:10406000287A012803D0022817D0FFDF74E6102633 +:104070004FF01F08002C85D06888A080A889208177 +:10408000E8896081288AA081688AE0819AF83010E6 +:1040900021F001018AF830105EE64FF01208102678 +:1040A000688800F03FFF57E62846BDE8F05F01F062 +:1040B000BFBC287A07284DD2DFE800F04C38384AD8 +:1040C0004A4A040009264FF01108002C92D06F884C +:1040D0003846FFF7C0F990F822A0A780687A00E080 +:1040E0002DE02072042138460CF074FC052138467E +:1040F0000CF070FC002138460CF06CFC01213846B5 +:104100000CF068FC032138460CF064FC02213846B0 +:104110000CF060FC062138460CF05CFC07213846A8 +:104120000CF058FC504600F0B5FE15E614264FF092 +:104130001B08002C8AD0A380287A012802D084F89A +:1041400008C009E62772DAE90710C4E9031003E69C +:104150002146A9E7FFDFFFE570B5FE4D287E122856 +:1041600001D0082070BD0AF0C3FF04F07FFF0400F7 +:1041700002D1687E00F08EFE0021052010F082F84A +:10418000204670BD1CB5F348007E132801D20820DC +:104190001CBD00208DF8000068460AF09BFD04F06D +:1041A00065FF0028F4D10021052010F06BF81120E4 +:1041B000FEF754FF00201CBD70B5012805D005286E +:1041C00025D0062800D0FFDF70BD8DB22846FFF74E +:1041D00042F9040000D1FFDF20782128F4D005F057 +:1041E00019F968B1017821F00F01891C21F0F00163 +:1041F000103101700221017245800020A07528E075 +:1042000021462846BDE870401322FFF727B9D14860 +:10421000047EA4F1120005281FD2DFE800F0060397 +:1042200003030300FFF7AEFF01E0FFF795FF00284F +:10423000CAD105F0EFF80028C6D0017821F00F01AF +:10424000891C21F0F00120310170132C07D00221CC +:104250000172BDE8704005F0E0B8FFDF70BD0121DC +:10426000F6E72DE9F04116460C00804600D1FFDF4D +:10427000307820F00F00801C20F0F00010303070FB +:104280002078012804D0022818D0FFDFBDE8F08193 +:104290004046FFF7E0F8050000D1FFDF0320A875D6 +:1042A00005F0BBF894E80F00083686E80F00A9482F +:1042B00010F8301F41F001010170E7E74046FFF7B9 +:1042C000CAF8050000D1FFDFA1884FF6FF70002774 +:1042D000814202D1E288824203D0814201D1E0884A +:1042E00040B105F09AF894E80F00083686E80F0010 +:1042F000AF75CBE7A87D0128C8D1782300224146BD +:104300000FF016FF0220A875C0E738B505460C4629 +:10431000084610F003F818BB203D062D4AD2DFE80E +:1043200005F0031B373C4230002106200FF080FFD0 +:1043300008B1112038BDA01C0AF0AFFF04F096FEB2 +:10434000050038D100220823114606200FF0F0FEA8 +:10435000062830D0FFDF2EE0606810F023F808B1A7 +:10436000102038BD618820886A460BF05FFB04F09E +:104370007DFE05001FD16068E8B1BDF80010018026 +:1043800019E0A07800F0010120880BF085FB0EE019 +:10439000206801F0FBFD05460DE0207800F00100EB +:1043A0000AF033F903E0618820880BF0C4FA04F0C6 +:1043B0005DFEF0E70725284638BD70B505460C467A +:1043C00008460FF0D1FF08B1102070BD202D07D096 +:1043D000212D0DD0222D0BD0252D09D0072070BD09 +:1043E0002088A11C0AF006FABDE8704004F03EBE29 +:1043F000062070BD57482530704708B53421554810 +:104400001FF077FF0120FEF711FE1120FEF726FEB8 +:1044100050496846263104F093FF4E489DF800202D +:1044200010F8251F62F3470121F0010101700021FE +:1044300041724FF46171A0F8071002218172FEF7FA +:1044400057FE00B1FFDFFCF791FF01F032F908BD24 +:1044500010B50C46402120461FF029FFA07F20F018 +:104460000300A077202020700020A07584F823008E +:1044700010BD70472DE9FC4107460FF04FFF10B10A +:104480001020BDE8FC81334E06F12501D6F8250049 +:104490000090B6F82950ADF8045096F82B408DF8EE +:1044A00006403846FEF78FFF0028EAD1FEF720FECF +:1044B0000028E6D0009946F8251FB580B471E0E7E2 +:1044C00010B504460FF050FF08B1102010BD214870 +:1044D0002049224690F8250026314008FEF78AFF41 +:1044E000002010BDFEB50D4604004FF0000712D0AD +:1044F0000822FEF7A1FE002812D1002609E000BF25 +:1045000054F826006946FEF71DFF002808D1761CE6 +:10451000F6B2AE42F4D309F07CFF10B143F20320AF +:10452000FEBD0C4E86F8247024B300271EE000BFA9 +:1045300054F8270002A9FEF705FF00B1FFDF9DF840 +:1045400008008DF8000054F8270050F8011FCDF83E +:10455000011001E0D80100208088ADF80500684610 +:1045600009F0A1FF00B1FFDF7F1CFFB2AF42DFD334 +:1045700086F824500020FEBD2DE9F0478AB015468C +:10458000894604001ED00F4608222946FEF754FE35 +:10459000002810D1002613E054F826006946103098 +:1045A00000F09DFC002806D147B157F826000FF017 +:1045B000B5FE18B110200AB0BDE8F087761CF6B23F +:1045C000AE42E9D30026A5F101081BE006F1010A7D +:1045D0000AF0FF0712E000BF54F82600017C4A08E9 +:1045E00054F827100B7CB2EB530F05D10622113083 +:1045F00011311FF0B1FD58B17F1CFFB2AF42EBD3B8 +:104600000AF0FF064645E1DB4E4624B1012003E0F7 +:1046100043F20520CFE7002009F076FF10B909F03A +:1046200087FF10B143F20420C5E75CB300270DF10A +:10463000170825E054F827006946103000F04FFCB9 +:1046400000B1FFDF54F82700102250F8111FCDF8F9 +:1046500001108088ADF8050054F827100DF107000F +:104660001FF0A6FD96B156F82710102240461FF005 +:104670009FFD684609F0F0FE00B1FFDF7F1CFFB22E +:10468000AF42D7D3FEF702FF002094E7404601F087 +:1046900071FCEEE730B585B004460FF03FFE18B967 +:1046A00060680FF088FE10B1102005B030BD608842 +:1046B0004AF2B811884206D82078FB4D28B101286B +:1046C00006D0022804D00720EFE7FEF711FD18E01E +:1046D0006078022804D0032802D043F20220E4E7E5 +:1046E00085F82F00C1B200200090ADF80400022927 +:1046F0002CD0032927D0FFDF684609F0BAFF04F069 +:10470000B5FC0028D1D1606801F027FC207858B1B1 +:1047100001208DF800000DF1010001F02BFC68462E +:104720000BF018FA00B1FFDF207885F82E00FEF7B5 +:10473000ADFE608860B1A88580B209F0DDFE00B1F1 +:10474000FFDF0020B1E78DF80500D5E74020FAE74C +:104750004FF46170EFE710B504460FF005FE20B985 +:10476000606838B10FF01EFE08B1102010BD6068FF +:1047700001F000FCCC4830F82C1F6180C1786170DA +:1047800080782070002010BD2DE9F843144689463A +:1047900006460FF0E9FDA0B948460FF00CFE80B9BF +:1047A00020460FF008FE60B9BF4DA878012800D15F +:1047B0003CB13178FF2906D049B143F20400BDE88D +:1047C000F8831020FBE7012801D00420F7E74FF021 +:1047D0000008A4B3052811D004280FD0694620464C +:1047E000FEF76DFE0028EAD1207D48B1012809D0EE +:1047F000022809D0032809D00720E0E70820DEE7D7 +:10480000424604E0012202E0022200E003222346A5 +:10481000174600200099FEF78FFE0028CFD1A0890F +:104820002880A07BE875BDF80000A882AF75BDF8B0 +:104830000000000701D5A08988B1A08928804946D9 +:104840000020FEF727FF0028B9D1A87805280BD053 +:10485000042809D0287DC00703D0032002E080206F +:10486000ECE70220FEF7E2FB86F800800020A6E7D6 +:104870007CB58D4C05460E46A078022803D003284F +:1048800001D008207CBD15B143F204007CBD072097 +:104890000CF03EF810B9A078032806D0FEF7F4FB20 +:1048A00028B1A078032804D009E012207CBD132091 +:1048B0007CBD304600F0CDFA0028F9D1E670012029 +:1048C0008DF800008DF801008DF802502088ADF8B9 +:1048D0000400E07D8DF8060068460AF0EAFF04F067 +:1048E000C5FB0028E4D1A078032805D05FF00400C0 +:1048F000FEF79CFB00207CBDE07800F0BAFA0520B2 +:10490000F6E71CB510B143F204001CBD664CA0785C +:10491000042803D0052801D008201CBD00208DF8F4 +:10492000000001218DF801108DF8020068460AF0A0 +:10493000C0FF04F09BFB0028EFD1A078052805D02C +:104940005FF00200FEF772FB00201CBDE07800F073 +:10495000A1FA0320F6E72DE9FC4180460E46032527 +:1049600008460FF028FD002866D14046FEF773FD8B +:10497000040004D02078222804D2082081E543F2E4 +:1049800002007EE5A07F00F003073EB1012F0CD0AE +:1049900000203146FEF72BFC0500EFD1012F06D099 +:1049A000022F1AD0FFDF28466BE50120F1E7A07D3A +:1049B0003146022801D011B107E0112061E56846B7 +:1049C000FCF7E1FD0028D9D16946404606F0A7FC76 +:1049D0000500E8D10120A075E5E7A07D032804D1FA +:1049E000314890F83000C00701D02EB30EE026B158 +:1049F000A07F40071ED4002100E00121404606F0C0 +:104A0000AEFC0500CFD1A075002ECCD0314640467B +:104A100000F07DFA05461128C5D1A07F4107C2D418 +:104A2000316844F80E1F7168616040F00400207422 +:104A30000025B8E71125B6E7102022E570B50C4631 +:104A40000546FEF708FD010005D022462846BDE8D0 +:104A50007040FEF703BD43F2020070BD10B501289F +:104A600007D1114B9B78012B00D011B143F2040008 +:104A700010BD09F084FDBDE8104004F0F7BA012331 +:104A800000F012BA00231A46194600F00DBA70B5AC +:104A900006460C4608460FF041FC18B920680FF096 +:104AA00063FC18B1102070BDD8010020F74D2A7E9C +:104AB000112A04D0132A00D33EB10820F3E721467F +:104AC0003046FEF774FE60B1EDE70920132A0DD0E1 +:104AD000142A0BD0A188FF29E5D31520FEF7BEFAD2 +:104AE0000020D4E90012C5E90712DCE7A1881F29DC +:104AF000D9D31320F2E72DE9F047DFF8908307467A +:104B000090B098F818009A4615460C46132803D31F +:104B1000FFF738FB002822D120460FF0FFFBA0BB97 +:104B200028460FF0FBFB80BB20784FF00101C00747 +:104B30004FF0000602D08DF83A1001E08DF83A608F +:104B40002078C0F3C1008DF800006278072042B1E0 +:104B5000012A06D0022A02D0042A00D1062010B071 +:104B60002AE58DF809106088ADF80A00A088ADF834 +:104B7000100020788946C0F3C10001281FD0032807 +:104B80001DD038460FF0CAFB08B11020E7E738788F +:104B9000400808D0012809D0022807D0032805D0F2 +:104BA00043F20220DBE78DF8026001E08DF802900D +:104BB00057F8010FCDF80300B888ADF807000DF1E4 +:104BC0000100FEF7E8FB08B10320C8E72888ADF82C +:104BD00016006888ADF81C00A888ADF82200E888A7 +:104BE000ADF82800ADF82E60ADF8346068460AF0E4 +:104BF000BDF8E8B998F818004546112801D00820FA +:104C0000ADE706200BF084FE38B12078C0F3C10078 +:104C1000012804D0032802D004E012209FE795F871 +:104C2000240028B1FEF730FA022803D2132096E7B9 +:104C3000072094E7504600F00CF900288FD185F842 +:104C400019A068460AF051FA04F010FA002886D13B +:104C5000687E00F00EF9E08864280AD248B101208D +:104C600000F047F9040091D11220FEF7F7F9204631 +:104C700075E76421B0FBF1F0F2E770B50646154622 +:104C80000C4608460FF070FB18B928460FF06CFB75 +:104C900008B1102007E72A46214630460AF0A9FE4F +:104CA00004F0E4F90028F5D121787F29F2D105201C +:104CB000F9E67CB505460C4608460FF02FFB08B117 +:104CC00010207CBD2846FEF7C6FB20B100782228C4 +:104CD00004D208207CBD43F202007CBD6B4890F8F2 +:104CE0003000400701D511207CBD2178C80802D1D1 +:104CF0006078C20801D007207CBD890801D18008F6 +:104D000001D006207CBDADF8005020788DF802005F +:104D100060788DF803000220ADF80400684609F0C1 +:104D200042FF04F0A3F97CBD70B586B014460D4671 +:104D30000646FEF790FB28B10078222805D208200D +:104D400006B0B0E643F20200FAE728460FF033FB64 +:104D500020B944B120460FF025FB08B11020EFE741 +:104D600000202060A080494890F83000800701D5DD +:104D70001120E5E703A9304609F0BDFD18B100BFD9 +:104D800004F074F9DCE7ADF80060BDF81400ADF88C +:104D90000200BDF81600ADF80400BDF81000BDF823 +:104DA0001210ADF80600ADF808107DB1298809B1E0 +:104DB000ADF80610698809B1ADF80210A98809B1EB +:104DC000ADF80810E98809B1ADF80410DCB1BDF800 +:104DD0000610814201D9081A2080BDF80210BDF8E2 +:104DE0001400814201D9081A6080BDF80800BDF89E +:104DF0000410BDF816200144BDF812001044814291 +:104E000001D9081AA080684609F0AAFEB8E71CB5C7 +:104E10001F490968CDE90010684609F0AAFF04F0AF +:104E200025F91CBD1CB5002000900190684609F0D2 +:104E3000A0FF04F01BF91CBD108008885080488832 +:104E40009080C88810818888D0800020508190810F +:104E5000704710B5044604F075F830B1407830B1B1 +:104E6000204604F07EFB002010BD052010BD12205E +:104E700010BD10B504F066F8040000D1FFDF6078C3 +:104E800000B9FFDF6078401E607010BDD8010020BF +:104E90009C46020010B504F055F8040000D1FFDF75 +:104EA0006078401C6070F0E71CB5ADF800008DF82C +:104EB00002308DF803108DF8042068460AF05EFD7C +:104EC00004F0D4F81CBD0CB52DA2D2E90012CDE936 +:104ED00000120079694601EB501000780CBD027891 +:104EE000520804D0012A02D043F202207047FEF794 +:104EF00029BA10B548B183000022114605200FF0F1 +:104F000017F9052801D00320BFE70020BDE71FB532 +:104F10006A46FFF791FF68460AF04CF904F0A6F8DC +:104F200004B0B2E770B50C0006460DD0FEF793FA58 +:104F3000050000D1FFDFA6802889208128896081B3 +:104F40006889A081A889E081ADE510B500231A46E3 +:104F500003E0845C2343521CD2B28A42F9D30BB1E2 +:104F6000002092E7012090E700B530B1012803D07E +:104F7000022801D0FFDF002000BDFF2000BD00009F +:104F8000070605040302010010B504460FF0C6F938 +:104F900008B1102010BD2078C0F30210042807D8F3 +:104FA0006078072804D3A178102901D8814201D262 +:104FB000072010BDE078410706D421794A0703D4C1 +:104FC000000701D4080701D5062010BD002010BD40 +:104FD00010B513785C08837F64F3C7138377137865 +:104FE0009C08C37F64F30003C3771078C309487833 +:104FF00063F34100487013781C090B7864F347137E +:105000000B701378DB0863F3000048705078487128 +:1050100010BD10B5C4780B7864F300030B70C4782E +:10502000640864F341030B70C478A40864F382033A +:105030000B70C478E40864F3C3030B700379117830 +:1050400063F30001117003795B0863F34101117090 +:1050500003799B0863F3820111700079C00860F343 +:10506000C301117010BD70B514460D46064604F01C +:10507000D1F980B10178182221F00F01891C21F0AB +:10508000F001A03100F8081B21461FF0D6F8BDE85A +:10509000704004F0C2B929463046BDE87040132282 +:1050A000FEF7DCB92DE9F047064608A8894690E8E6 +:1050B00030041F469046142128461FF01AF900219B +:1050C000CAF80010B8F1000F03D0B9F1000F03D1F6 +:1050D00014E03878C00711D020680FF045F9C0BB44 +:1050E000B8F1000F07D12068123028602068143012 +:1050F00068602068A8602168CAF8001038788007C6 +:1051000024D560680FF04EF918BBB9F1000F21D01B +:10511000FFF770F90168C6F868118188A6F86C116C +:10512000807986F86E0101F002FDF94FEF60626848 +:1051300062B196F8680106F2691140081032FEF774 +:1051400059F91022394660681FF032F80020BDE896 +:10515000F08706E0606820B1E8606068C6F8640126 +:10516000F4E71020F3E730B5054608780C4620F048 +:105170000F00401C20F0F001103121700020607001 +:1051800095F8230030B104280FD0052811D0062847 +:1051900014D0FFDF20780121B1EB101F04D295F865 +:1051A000200000F01F00607030BD21F0F0002030C2 +:1051B00002E021F0F00030302070EBE721F0F00049 +:1051C0004030F9E7F0B591B0022715460C46064687 +:1051D0003A46ADF80870092103AB04F07AFF049059 +:1051E000002810D004208DF804008DF80170E03400 +:1051F000099605948DF818500AA968460DF0CAF86A +:1052000000B1FFDF012011B0F0BD10B588B00C4631 +:105210000A99ADF80000C3B11868CDF802005868CB +:10522000CDF80600ADF80A20102203A81EF0C0FF3A +:1052300068460AF062F803F019FF002803D1A17F45 +:1052400041F01001A17708B010BD0020CDF8020098 +:10525000E6E72DE9F84F0646808A0D4680B2824681 +:10526000FEF7F9F804463078DFF8A48200274FF003 +:105270000509A8F120080F2870D2DFE800F06FF2CE +:105280003708387D8CC8F1F0EFF35FF3F300A07FAF +:1052900000F00300022809D05FF0000080F0010157 +:1052A00050460BF085FB050003D101E00120F5E736 +:1052B000FFDF98F85C10C90702D0D8F860000BE057 +:1052C000032105F11D000EF004FDD5F81D009149E4 +:1052D000B0FBF1F201FB1200C5F81D0070686867B1 +:1052E000B068A8672078252800D0FFDFCAE0A07F3B +:1052F00000F00300022809D05FF0000080F00101F7 +:1053000050460BF055FB060003D101E00120F5E704 +:10531000FFDF3078810702D52178252904D040F0BD +:1053200001003070BDE8F88F02202870307F2871AE +:1053300006F11D002D36C5E90206F3E7A07F00F057 +:105340000300022808D0002080F0010150460BF035 +:105350002FFB040004D102E00120F5E7A7E1FFDF05 +:105360002078C10604D5072028703D346C60D9E749 +:1053700040F008002070D5E7E07F000700D5FFDF90 +:10538000307CB28800F0010301B05046BDE8F04F18 +:10539000092105F027BD04B9FFDF716821B1102292 +:1053A00004F124001EF004FF28212046FDF7B2FE80 +:1053B000A07F00F0030002280ED104F12400002396 +:1053C00000901A4621465046FFF71FFF112807D0CC +:1053D00029212046FDF79EFE307A84F82000A1E7BF +:1053E000A07F000700D5FFDF14F81E0F40F0080073 +:1053F0002070E782A761E761C109607861F341002D +:10540000014660F382016170307AE0708AE7A07F24 +:1054100000F00300022809D05FF0000080F00101D5 +:1054200050460BF0C5FA040003D101E00120F5E776 +:10543000FFDF022104F185000EF04BFC04202870F0 +:1054400004F5B4706860B4F88500288230481038DC +:105450007C346C61C5E9028064E703E024E15BE031 +:105460002DE015E0A07F00F00300022807D0002007 +:1054700080F0010150460BF09BFA18B901E00120C1 +:10548000F6E7FFDF324621465046BDE8F84FEAE531 +:1054900004B9FFDF20782128A1D93079012803D170 +:1054A000E07F40F00800E077324621465046FFF7A3 +:1054B000DAFD2046BDE8F84F2321FDF72BBE3279F7 +:1054C000AA8005F108030921504604F002FEE860B5 +:1054D00010B185F8009025E7A07F00F003000228B6 +:1054E00008D0002080F0010150460BF061FA040062 +:1054F00003D101E00120F5E7FFDF04F1620102239F +:105500001022081F0BF0DBF807703179417009E7B2 +:105510003802002040420F00A07F00F00300022864 +:1055200008D0002080F0010150460BF041FA050040 +:1055300003D101E00120F5E7FFDF95F8840000F0DA +:10554000030001287AD1A07F00F00307E07F10F06C +:10555000010602D0022F04D133E095F8A000C00765 +:105560002BD0D5F8601121B395F88320087C62F325 +:1055700087000874A17FCA09D5F8601162F3410061 +:105580000874D5F8601166F300000874AEB1D5F860 +:105590006001102204F1240188351EF009FE287EE6 +:1055A00040F001002876287820F0010005F88809ED +:1055B00000E016B1022F04D02DE095F88800C00756 +:1055C00027D0D5F85C1121B395F88320087C62F3CD +:1055D00087000874A17FCA09D5F85C1162F3410005 +:1055E0000874D5F85C1166F3000008748EB1D5F824 +:1055F0005C01102204F1240188351EF0D9FD2878C1 +:1056000040F0010005F8180B287820F0010005F89B +:10561000A009022F44D0002000EB400005EBC000A1 +:1056200090F88800800709D595F87C00D5F86421AA +:10563000400805F17D011032FDF7DCFE8DF8009089 +:1056400095F884006A4600F003008DF8010095F893 +:1056500088108DF8021095F8A0008DF803002146FF +:10566000504601F04DFA2078252805D0212807D092 +:10567000FFDF2078222803D922212046FDF74AFDAA +:10568000A07F00F0030002280CD0002080F0010170 +:1056900050460BF09FF900283FF44FAEFFDF41E684 +:1056A0000120B9E70120F1E7706847703AE6FFDFB3 +:1056B00038E670B5FE4C002584F85C5025660CF089 +:1056C00036FE04F11001204603F060FE84F83050ED +:1056D00070BD70B50D46FDF7BEFE040000D1FFDFC2 +:1056E0004FF4B87128461EF004FE04F1240028612E +:1056F000A07F00F00300022808D0012105F1E0009E +:105700000CF016FE002800D0FFDF70BD0221F5E787 +:105710000A46014602F1E0000CF02ABE70B50546CB +:10572000406886B001780A2906D00D2933D00E29A9 +:105730002FD0FFDF06B070BD86883046FDF78BFEA8 +:10574000040000D1FFDF20782128F3D028281BD1C6 +:10575000686802210E3001F0C8F9A8B16868082114 +:10576000801D01F0C2F978B104F1240130460AF03D +:10577000A2F803F07BFC00B1FFDF06B02046BDE8D5 +:1057800070402921FDF7C6BC06B0BDE8704003F0AB +:1057900044BE012101726868C6883046FDF75BFE91 +:1057A000040000D1FFDFA07F00F00301022902D135 +:1057B00020F01000A077207821280AD06868017AAC +:1057C00009B1007980B1A07F00F00300022862D007 +:1057D000FFDFA07F00F003000228ABD1FEF798F8AE +:1057E0000028A7D0FFDFA5E703F017FEA17F08067A +:1057F0002BD5E07FC00705D094F8200000F01F00F3 +:10580000102820D05FF0050084F823002078292894 +:105810001DD02428DDD1314604200EF033FD222195 +:105820002046FDF777FCA07F00F00300022830D06F +:105830005FF0000080F0010130460BF0CBF800284B +:10584000C7D0FFDFC5E70620DEE70420DCE701F074 +:105850000300022808D0002080F0010130460BF040 +:10586000A7F8050003D101E00120F5E7FFDF2521BE +:105870002046FDF74FFC03208DF80000694605F136 +:10588000E0000CF06CFD0228A3D00028A1D0FFDFBF +:105890009FE70120CEE703F0C0FD9AE72DE9F04332 +:1058A00087B09946164688460746FDF7D4FD0400A2 +:1058B0004BD02078222848D3232846D0E07F000709 +:1058C00043D4A07F00F00300022809D05FF000005D +:1058D00080F0010138460BF06BF8050002D00CE0B7 +:1058E0000120F5E7A07F00F00300022805D0012188 +:1058F000002238460BF053F805466946284601F069 +:1059000026F9009800B9FFDF45B10098E035056140 +:105910002078222806D0242804D007E0009900200F +:10592000086103E025212046FDF7F4FB00980121E2 +:1059300041704762868001A9C0E902890CF02AFD06 +:10594000022802D0002800D0FFDF07B0BDE8F083B6 +:1059500070B586B00546FDF77EFD017822291ED977 +:10596000807F00F00300022808D0002080F00101B1 +:1059700028460BF01DF804002FD101E00120F5E7C7 +:10598000FFDF2AE0B4F85E0004F1620630440178DB +:10599000427829B121462846FFF714FCB0B9C9E680 +:1059A000ADF804200921284602AB04F092FB0390D5 +:1059B0000028F4D005208DF80000694604F1E000CD +:1059C0000CF0CDFC022801D000B1FFDF0223102231 +:1059D000314604F15E000AF0A8FEB4F86000002829 +:1059E000D0D1A7E610B586B00446FDF734FD0178A6 +:1059F00022291BD9807F00F00300022808D0002054 +:105A000080F0010120460AF0D3FF040003D101E039 +:105A10000120F5E7FFDF06208DF80000694604F15C +:105A2000E0000CF09CFC002800D0FFDF06B010BDA9 +:105A30002DE9F05F05460C460027007890460109E5 +:105A40003E4604F1080BBA4602297DD0072902D050 +:105A50000A2909D146E0686801780A2905D00D298C +:105A600030D00E292ED0FFDFBCE114271C26002CDD +:105A70006BD08088A080FDF7EEFC5FEA000900D1C2 +:105A8000FFDF99F817005A46400809F11801FDF7A1 +:105A9000B1FC6868C0892082696851F8060FC4F8B3 +:105AA00012004868C4F81600A07E20F0060001E04D +:105AB0001802002040F00100A07699F81E0040F086 +:105AC00020014DE01A270A26002CD1D0C088A080E2 +:105AD000FDF7C1FC050000D1FFDF59462846FFF75E +:105AE00042FB7FE10CB1A88BA080287A0B287DD0E7 +:105AF00006DC01287BD0022808D0032804D135E039 +:105B00000D2875D00E2874D0FFDF6BE11E27092603 +:105B1000002CADD0A088FDF79EFC5FEA000900D103 +:105B2000FFDF287B00F003000128207A1BD020F043 +:105B300001002072297B890861F341002072297BD2 +:105B4000C90861F3820001E041E1F2E02072297BA3 +:105B5000090961F3C300207299F81E0040F040016A +:105B600089F81E103EE140F00100E2E713270D2600 +:105B7000002CAAD0A088FDF76EFC8146807F00F043 +:105B80000300022808D0002080F00101A0880AF05C +:105B90000FFF050003D101E00120F5E7FFDF99F8D1 +:105BA0001E0000F00302022A50D0686F817801F0D5 +:105BB00003010129217A4BD021F001012172837860 +:105BC0009B0863F3410121728378DB0863F3820150 +:105BD000217283781B0963F3C3012172037863F395 +:105BE00006112172437863F3C71103E061E0A9E075 +:105BF00090E0A1E0217284F809A0C178A172022A84 +:105C000029D00279E17A62F30001E1720279520847 +:105C100062F34101E1720279920862F38201E1725A +:105C20000279D20862F3C301E1724279217B62F307 +:105C3000000121734279520862F3410121734279D4 +:105C4000920862F382012173407928E0A86FADE7E2 +:105C500041F00101B2E74279E17A62F30001E172B9 +:105C60004279520862F34101E1724279920862F38B +:105C70008201E1724279D20862F3C301E1720279D2 +:105C8000217B62F3000121730279520862F3410122 +:105C900021730279920862F3820121730079C008AE +:105CA00060F3C301217399F80000232831D926211C +:105CB00040E018271026E4B3A088FDF7CCFB83460C +:105CC000807F00F00300022809D0002080F001014D +:105CD000A0880AF06DFE5FEA000903D101E001200F +:105CE000F4E7FFDFE868A06099F8000040F00401E5 +:105CF00089F8001099F80100800708D50120207369 +:105D00009BF8000023286DD92721584651E084F8DC +:105D10000CA067E015270F265CB1A088FDF79BFB60 +:105D2000814606225946E86808F059F90120A07317 +:105D3000A2E041E048463CE016270926E4B3287B70 +:105D400020724FE0287B19270E26ACB3C4F808A0B8 +:105D5000A4F80CA0012807D0022805D0032805D0FC +:105D6000042803D0FFDF0DE0207207E0697B0428E0 +:105D700001F00F0141F0800121721ED0607A20F005 +:105D800003006072A088FDF766FB054600782128B5 +:105D900028D0232800D0FFDFA87F00F003000228CE +:105DA00013D0002080F00101A0880AF013FE222108 +:105DB0002846FDF7AFF915E004E0607A20F0030013 +:105DC000401CDEE7A8F8006011E00120EAE70CB112 +:105DD0006888A080287A03282ED004280AD00528B5 +:105DE00050D0FFDFA8F800600CB12780668000204B +:105DF000BDE8F09F15270F26002CE3D0A088FDF703 +:105E00002AFB807F00F00300022809D05FF0000029 +:105E100080F00101A0880AF0CBFD050003D101E06C +:105E20000120F5E7FFDFD5F81D000622594608F0EE +:105E3000D6F884F80EA0D5E717270926002CC1D084 +:105E4000A088FDF708FB8146807F00F00300022850 +:105E500008D0002080F00101A0880AF0A9FD05000B +:105E600003D101E00120F5E7FFDF6878800701D565 +:105E7000022000E00120207299F800002328B1D907 +:105E8000272157E719270E26002C9BD0A088FDF765 +:105E9000E2FA5FEA000900D1FFDFC4F808A0A4F825 +:105EA0000CA084F808A0A07A40F00300A07299F832 +:105EB0001E10C90961F38200A07299F81F2099F899 +:105EC0001E1012EAD11F05D099F8201001F01F0111 +:105ED00010292BD020F00800A07299F81F10607ACA +:105EE00061F3C3006072697A01F003010129A2D154 +:105EF00040F00400607299F81E0000F003000228D0 +:105F0000E87A16D0217B60F300012173AA7A607BC6 +:105F100062F300006073EA7A520862F34101217370 +:105F2000A97A490861F3410060735BE740F008001B +:105F3000D2E7617B60F300016173AA7A207B62F390 +:105F400000002073EA7A520862F341016173A97A72 +:105F5000490861F34100207344E710B5FE4C30B1AD +:105F60000146102204F120001EF022F9012084F8DD +:105F7000300010BD10B5044600F0D9FDF6492046AA +:105F80001022BDE8104020311EF012B970B5F24D5C +:105F900006004FF0000413D00EF0C0F908B1102431 +:105FA0000CE00621304608F001F8411C05D02866B7 +:105FB0005FF0010085F85C0000E00724204670BD1A +:105FC0000020F7E7007810F00F0204D0012A05D076 +:105FD000022A0CD110E0000909D10AE000090128C9 +:105FE00007D0022805D0032803D0042801D00720B9 +:105FF00070470870002070470620704705282AD295 +:10600000DFE800F003070F171F00087820F0FF00FB +:106010001EE0087820F00F00401C20F0F000103047 +:1060200016E0087820F00F00401C20F0F00020302F +:106030000EE0087820F00F00401C20F0F000303017 +:1060400006E0087820F00F00401C20F0F0004030FF +:10605000087000207047072070472DE9F041804606 +:1060600088B00D46002708460EF0A5F9A8B94046AD +:10607000FDF7F1F9040003D02078222815D104E0BF +:1060800043F2020008B0BDE8F08145B9A07F4106A7 +:1060900003D500F00300022801D01020F2E7A07F12 +:1060A000C10601D4010702D50DB10820EAE7E17F5E +:1060B000090701D50D20E5E700F00300022805D10E +:1060C00025B12846FEF760FF0700DBD1A07F00F076 +:1060D0000300022808D0002080F0010140460AF0A9 +:1060E00067FC060002D00FE00120F5E7A07F00F07A +:1060F000030002280ED0002080F00101002240465B +:106100000AF04DFC060007D0A07F00F00300022833 +:1061100004D009E00120EFE70420B3E725B12A46C7 +:1061200031462046FEF754FF6946304600F00FFD29 +:10613000009800B9FFDF0099022006F1E0024870E4 +:10614000C1F824804A6100220A81A27F02F0030282 +:10615000022A1CD001200871287800F00102087E74 +:1061600062F3010008762A78520862F3820008760A +:106170002A78920862F3C30008762A78D20862F37C +:106180000410087624212046FCF7C4FF33E035B321 +:106190000871301D88613078400908777078C0F345 +:1061A00040004877287800F00102887F62F3010000 +:1061B0008877A27FD20962F382008877E27F62F358 +:1061C000C3008877727862F304108877A878C8775C +:1061D00001F1210228462031FEF71BFF03E00320D6 +:1061E00008710520087625212046FCF793FFA07F43 +:1061F00020F04000A07701A900980CF0CBF802280D +:1062000001D000B1FFDF38463CE72DE9FF4F534A8C +:106210000D4699B09A4607CA0BAB002783E80700E2 +:106220001998FDF718F9060006D03078262806D010 +:1062300008201DB0BDE8F08F43F20200F9E7B07FFF +:1062400000F00309B9F1020F03D00020284302D067 +:1062500006E00120FAE71B98FEF796FE0028E8D139 +:10626000B07F00F00300022801D11B9979BB0228FE +:1062700008D0002080F0010119980AF099FB040071 +:1062800003D101E00120F5E7FFDF852D28D007DCF1 +:10629000F5B1812D1ED0822D1ED0832D08D11DE099 +:1062A000862D1FD0882D1FD0892D1FD08A2D1FD05D +:1062B0000F2020710F281DD003F0ACF8E0B10120B1 +:1062C0008DF84000201D11902079B8B167E111E0F0 +:1062D0000020EEE70120ECE70220EAE70320E8E7F0 +:1062E0000520E6E70620E4E70820E2E70920E0E7EA +:1062F0000A20DEE707209CE711209AE7B9F1020F98 +:1063000003D0A56F03D1A06F02E0656FFAE7606F5D +:10631000804632D04FF0010000904FF00200019013 +:10632000214630461B9AFEF753FE1B98007800F07A +:106330000101A87861F30100A870B17FC90961F378 +:106340008200A870F17F61F3C300A870617861F3E7 +:106350000410A870207803E018020020A446020070 +:10636000400928706078C0F3400068701B988078FE +:10637000E87000206871287103E00220009001207D +:106380000190A87898F80210C0F3C000C1F3C001D2 +:1063900008405FEA000B2CD050460DF0BFFF90BBC9 +:1063A000DAF80C000DF0BAFF68BBDAF81C000DF04B +:1063B000B5FF40BBDAF80C00A060DAF81C00E06022 +:1063C00098F80100617800F0010041EA4000607037 +:1063D00098F80210C0B2C1F30011891E0840607025 +:1063E00000202077019906F1170002290CD0012125 +:1063F0000BE098F80110607801F00101FD2242EAFB +:1064000041010840E3E732E0002104EB81014861EB +:106410000099701C022901D0012100E0002104EB49 +:1064200081014861A87800F00300012858D198F84C +:10643000020000F00300012852D1B9F1020F04D08C +:106440002A1D691D1B98FEF7E4FD297998F80400C0 +:1064500001408DF83810687998F8052010408DF8C3 +:106460003C0001433CD050460DF058FF08B11020CD +:10647000DFE60AF110010491B9F1020F18D00846C5 +:106480005FF0000104F18C03CDE9000304F5AE7266 +:1064900002920EAB5A462046FEF704FE0028E7D1D2 +:1064A000B9F1020F08D0504608D14FF0010107E0C2 +:1064B00050464FF00101E5E70498F5E74FF0000181 +:1064C00004F1A403CDE9000304F5B072029281F057 +:1064D00001010FAB5A462046FEF7E4FD0028C7D164 +:1064E0006078800734D4A87898F80210C0F3800050 +:1064F000C1F3800108432BD0297898F800000BAA3B +:10650000B9F1020F06D032F811204300DA4002F050 +:1065100003070AE032F810204B00DA4012F00307BC +:1065200005D0012F0BD0022F0BD0032F07D0BBF1CA +:10653000000F0DD0012906D0042904D008E002275D +:10654000F5E70127F3E7012801D0042800D104274B +:10655000B07F40F08000B077F17F6BF30001F177FE +:10656000607881074FF003000CD5A071BBF1000FDC +:1065700015D100BF8DF85C0017AA3146199800F0BC +:10658000BFFA0CE00221022F18D0012F18D0042FDF +:1065900022D00020A071B07F20F08000B0772521AC +:1065A0003046FCF7B7FD10A904F1E0000BF0D7FE70 +:1065B00010B1022800D0FFDF00203AE6A171D9E730 +:1065C000A1710D2104F120001DF093FE207840F010 +:1065D000020020700420CDE70120A071DFE72DE943 +:1065E000F04387B09046894604460025FCF733FF08 +:1065F000060006D03078272806D0082007B0BDE86E +:10660000F08343F20200F9E7B07F00F003000228B4 +:1066100008D0002080F0010120460AF0C9F90400EA +:1066200003D101E00120F5E7FFDFA7795FEA090068 +:1066300005D0012821D0B9F1020F26D110E0B8F120 +:10664000000F22D1012F05D0022F05D0032F05D036 +:10665000FFDF2DE00C252BE0012529E0022527E0B6 +:1066600040460DF05BFEB0B9032F0ED1102241461B +:1066700004F11D001DF09CFD1AE0012F02D0022F35 +:1066800003D104E0B8F1000F12D00720B6E740466E +:106690000DF044FE08B11020B0E7102104F11D00F8 +:1066A0001DF005FE0621404607F080FCC4F81D00E1 +:1066B0002078252140F0020020703046FCF72AFDAA +:1066C0002078C10713D020F00100207002208DF83F +:1066D000000004F11D0002908DF804506946C3309B +:1066E0000BF03DFE022803D010B1FFDF00E025775C +:1066F000002083E730B587B00D460446FCF7ABFEBB +:10670000A0B1807F00F00300022812D05FF00000EB +:1067100080F0010120460AF04BF904000ED0284613 +:106720000DF0FCFD38B1102007B030BD43F202007F +:10673000FAE70120ECE72078400701D40820F3E7CE +:10674000294604F13D00202205461DF031FD207848 +:1067500040F01000207001070FD520F008002070D5 +:1067600007208DF80000694604F1E00001950BF068 +:10677000F6FD022801D000B1FFDF0020D4E770B59C +:106780000D460646FCF767FE18B10178272921D18E +:1067900002E043F2020070BD807F00F00300022897 +:1067A00008D0002080F0010130460AF001F9040011 +:1067B00003D101E00120F5E7FFDFA079022809D12C +:1067C0006078C00706D02A4621463046FEF7FAFC1C +:1067D00010B10FE0082070BDB4F860000E280BD295 +:1067E00004F1620102231022081F09F068FF012151 +:1067F00001704570002070BD112070BD70B5064657 +:1068000014460D4608460DF089FD18B920460DF0D6 +:10681000ABFD08B1102070BDA6F57F40FF380ED04B +:106820003046FCF718FE38B1417822464B08811CEF +:106830001846FCF7DFFD07E043F2020070BD20467A +:10684000FDF73EFE0028F9D11021E01D0DF041FAC0 +:10685000E21D294604F1170000F089F9002070BDFF +:106860002DE9F04104468AB01546884600270846BF +:106870000DF0A1FD18B928460DF09DFD18B11020AE +:106880000AB0BDE8F0812046FCF7E5FD060003D024 +:10689000307827281BD102E043F20200F0E7B07FF6 +:1068A00000F00300022809D05FF0000080F0010131 +:1068B00020460AF07DF8040003D101E00120F5E74D +:1068C000FFDF2078400702D56078800701D40820D8 +:1068D000D6E7B07F00F00300022803D0A06F03D1F9 +:1068E000A16F02E0606FFAE7616F407800B19DB17F +:1068F000487810B1B8F1000F0ED0ADB1EA1D06A86E +:10690000E16800F034F9102206A905F117001DF026 +:1069100023FC18B1042707E00720B1E71022E91D86 +:1069200004F12D001DF044FCB8F1000F06D0102238 +:1069300008F1070104F11D001DF03AFC2078252123 +:1069400040F0020020703046FCF7E4FB2078C107DD +:1069500015D020F00100207002208DF8000004F115 +:106960001D000290103003908DF804706946B3301A +:106970000BF0F5FC022803D010B1FFDF00E0277711 +:1069800000207DE7F8B515460E460746FCF763FD87 +:10699000040004D02078222804D00820F8BD43F257 +:1069A0000200F8BDA07F00F00300022802D043F2ED +:1069B0000500F8BD30460DF0B1FC18B928460DF0C1 +:1069C000ADFC08B11020F8BD00953288B31C2146FB +:1069D0003846FEF71AFC112815D00028F3D1297C7F +:1069E0004A08A17F62F3C711A177297CE27F61F396 +:1069F0000002E277297C890884F82010A17F21F029 +:106A00004001A177F8BDA17F0907FBD4D6F80200A9 +:106A1000C4F83600D6F80600C4F83A003088A086DC +:106A20001022294604F124001DF0C2FB287C4108F5 +:106A3000E07F61F34100E077297C61F38200E07739 +:106A4000287C800884F82100A07F40F00800A0770F +:106A50000020D3E770B50D4606460BB1072070BD88 +:106A6000FCF7F9FC040007D02078222802D3A07F8D +:106A7000800604D4082070BD43F2020070BDADB1A1 +:106A80002946304608F017FF02F0F0FA297C4A0840 +:106A9000A17F62F3C711A177297CE27F61F3000235 +:106AA000E277297C890884F8201004E0304608F059 +:106AB0002AFF02F0DBFAA17F21F02001A17770BD4F +:106AC00070B50D46FCF7C7FC040005D028460DF054 +:106AD0004BFC20B1102070BD43F2020070BD29466E +:106AE0002046FEF740FB002070BD04E010F8012BAB +:106AF0000AB100207047491E89B2F7D201207047C1 +:106B000070B51546064602F085FC040000D1FFDF93 +:106B1000207820F00F00801C20F0F0002030207042 +:106B200066802868A060BDE8704002F076BC10B5B1 +:106B3000134C94F83000002808D104F12001A1F191 +:106B400010000BF04EFC012084F8300010BD10B195 +:106B500090F8B9202AB10A4890F8350018B1002001 +:106B600003E0B83001E0064834300860704708B5EB +:106B70000023009313460A460AF015F908BD0000E9 +:106B80001802002018B18178012938D101E01020C5 +:106B90007047018842F60112881A914231D018DC00 +:106BA00042F60102A1EB020091422AD00CDC41B373 +:106BB000B1F5C05F25D06FF4C050081821D0A0F502 +:106BC0007060FF381BD11CE001281AD002280AD1BE +:106BD00017E0B0F5807F14D008DC012811D002281E +:106BE0000FD003280DD0FF2809D10AE0B0F5817F2E +:106BF00007D0A0F58070033803D0012801D0002011 +:106C000070470F2070470A281ED007DC18D2DFE833 +:106C100000F0191B1F1F171F231D1F21102815D03F +:106C200008DC0B2812D00C2810D00D2816D00F2805 +:106C300006D10DE011280BD084280BD087280FD067 +:106C400003207047002070470520704707207047D9 +:106C50000F20704704207047062070470C207047B3 +:106C600043F20200704738B50C46050041D0694632 +:106C7000FFF7A8F9002819D19DF80010607861F39A +:106C8000020060706946681CFFF79CF900280DD16E +:106C90009DF80010607861F3C5006070A978C1F3B9 +:106CA0004101012903D0022905D0072038BD2178F0 +:106CB00021F0200102E0217841F0200121704107FC +:106CC00004D0A978C90861F386106070607810F06C +:106CD000380F07D0A978090961F3C710607010F068 +:106CE000380F02D16078400603D5207840F040008C +:106CF0002070002038BD70B504460020088015467D +:106D00006068FFF7B0FF002816D12089A18988426A +:106D100011D860688078C0070AD0B1F5007F0AD822 +:106D200040F20120B1FBF0F200FB1210288007E0D6 +:106D3000B1F5FF7F01D90C2070BD01F2012129803E +:106D4000002070BD10B50478137864F3000313704D +:106D50000478640864F3410313700478A40864F3AE +:106D6000820313700478E40864F3C3031370047897 +:106D7000240964F3041313700478640964F345135D +:106D800013700078800960F38613137031B10878AE +:106D9000C10701D1800701D5012000E0002060F388 +:106DA000C713137010BD4278530702D002F00703D7 +:106DB00006E012F0380F02D0C2F3C20300E0012354 +:106DC0004A7863F302024A70407810F0380F02D01C +:106DD000C0F3C20005E0430702D000F0070000E066 +:106DE000012060F3C5024A7070472DE9F04F95B05D +:106DF0000D00824612D0122128461DF058FA4FF697 +:106E0000FF7B05AA0121584606F01BFF00242646F9 +:106E100037464FF420586FF4205972E0102015B017 +:106E2000BDE8F08F9DF81E0001280AD1BDF81C10A6 +:106E300041450BD011EB09000AD001280CD00228E3 +:106E40000CD0042C0ED0052C0FD10DE0012400E055 +:106E50000224BDF81A6008E0032406E00424BDF80B +:106E60001A7002E0052400E00624BDF81A1051450E +:106E700047D12C74BEB34FF0000810AA4FF0070A98 +:106E8000CDE90282CDE900A80DF13C091023CDF82F +:106E9000109042463146584606F086FF08BBBDF8C2 +:106EA0003C002A46C0B210A90BF004FBC8B9AE8161 +:106EB000CFB1CDE900A80DF1080C0AAE40468CE830 +:106EC0004102132300223946584606F06DFF40B9AF +:106ED000BDF83C00F11CC01EC0B22A1D0BF0EAFA3E +:106EE00010B103209BE70AE0BDF82900E881062CD9 +:106EF00005D19DF81E00A872BDF81C002881002055 +:106F00008DE705A806F0A9FE00288BD0FFF77BFED1 +:106F100085E72DE9F0471C46DDE90978DDF820908A +:106F200015460E00824600D1FFDF0CB1208818B153 +:106F3000D5B11120BDE8F087022D01D0012100E07C +:106F4000002106F1140005F06BFDA8F800000246D0 +:106F50003B462946504603F0BCF8C9F8000008B982 +:106F6000A41C3C600020E5E71320E3E7F0B41446DE +:106F7000DDE904528DB1002314B1022C09D101E0E6 +:106F8000012306E00D7CEE0703D025F00105012367 +:106F90000D742146F0BC03F025BF1A80F0BC704789 +:106FA0002DE9FE4F91461A881C468A468046FAB162 +:106FB00002AB494603F08DF8050019D04046A61CE7 +:106FC000278809F039FE3246072629463B460096B7 +:106FD00009F047FA20882346CDE900504A46514639 +:106FE0004046FFF7C3FF002020800120BDE8FE8F50 +:106FF0000020FBE72DE9F04786B09146DDE90E461B +:107000000F46824603AA05A904A8109D8DE8070033 +:107010009846324621465046FFF77BFF049909B156 +:10702000012200E000222A70002818D1F94A03AB9F +:107030001060059A009104F11400CDE901204A4640 +:107040003946504606F0A3F8A8B1092811D2DFE866 +:1070500000F005080510100A0C0C0E00002006B008 +:1070600068E71120FBE70720F9E70820F7E70D2084 +:10707000F5E70320F3E7BDF80C100498CDE9000113 +:107080004346324621465046FFF770FFE6E72DE9BA +:10709000F04389B00D46DDE9108781461C4616464F +:1070A000142103A81DF025F9012002218DF81010EC +:1070B0008DF80C008DF81170ADF8146064B1A278F1 +:1070C000D20709D08DF81600E088ADF81A00A08824 +:1070D000ADF81800A068079008A80095CDE9011048 +:1070E000424603A948466B68FFF784FF09B0BDE834 +:1070F000F083F0B58BB0002406460694079407276A +:10710000089405A80994019400970294CDE90340DE +:107110000D4610232246304606F046FE78B90AA8EE +:1071200006A9019400970294CDE90310BDF814302C +:1071300000222946304606F00DFC002801D0FFF75A +:1071400062FD0BB0F0BD06F0ADBA2DE9FC410C4676 +:107150008046002602F05EF9054620780D287DD293 +:10716000DFE800F0BC0713B325BD49496383AF9541 +:107170009B00A848006820B1417841F0100141709F +:10718000ADE0404602F076F9A9E00421404609F05E +:107190000FFC070000D1FFDF07F11401404605F0A6 +:1071A000D3FBA5BB13214046FDF748FC97E0042123 +:1071B000404609F0FDFB070000D1FFDFE088ADF895 +:1071C00000000020B8819DF80000010704D5C0062A +:1071D00002D5A088B88105E09DF8010040067ED563 +:1071E000A088F88105B9FFDF22462946404601F014 +:1071F00063FC022673E0E188ADF800109DF80110F1 +:1072000009060FD5072803D006280AD00AE024E093 +:107210000421404609F0CCFB060000D1FFDFA08826 +:10722000F0810226CDB9FFDF17E00421404609F0C6 +:10723000BFFB070000D1FFDF07F1140006F069FA79 +:1072400090F0010F02D1E079000648D5387C022683 +:1072500040F00200387405B9FFDF00E03EE022464E +:107260002946404601F028FC39E00421404609F057 +:107270009FFB017C002D01F00206C1F3400161710A +:10728000017C21F002010174E7D1FFDFE5E702266E +:107290000121404602F020F921E00421404609F096 +:1072A00087FB0546606800902089ADF80400012244 +:1072B0006946404602F031F9287C20F0020028742B +:1072C0000DE0002DC9D1FFDFC7E7022600214046AF +:1072D000FBF788F8002DC0D1FFDFBEE7FFDF3046A7 +:1072E000BDE8FC813EB50C0009D001466B4601AA01 +:1072F000002006F0DBFD20B1FFF785FC3EBD10202D +:107300003EBD00202080A0709DF8050002A900F07D +:107310000700FEF773FE50B99DF8080020709DF835 +:10732000050002A9C0F3C200FEF768FE08B1032001 +:107330003EBD9DF8080060709DF80500C109A07869 +:1073400061F30410A0709DF80510890961F3C30072 +:10735000A0709DF80410890601D5022100E00121EA +:1073600061F342009DF8001061F30000A07000205E +:107370003EBD70B5144606460D4651EA040005D0E0 +:1073800075B108460DF00EF878B901E0072070BD20 +:107390002946304606F0EBFD10B1BDE8704032E4FE +:1073A00054B120460CF0FEFF08B1102070BD2146FC +:1073B0003046BDE8704095E7002070BD2DE9FC5FC8 +:1073C0000C4690460546002701780822007A3E4682 +:1073D000B2EB111F7ED104F10A0100910A31821E25 +:1073E0004FF0020A04F1080B0191092A73D2DFE879 +:1073F00002F0ECDF05F427277AA9CD006888042184 +:1074000009F0D6FA060000D1FFDFB08920B152277B +:107410000726C2E07C02002051271026002C7DD0D8 +:107420006888A0800120A071A88900220099FFF738 +:10743000A0FF002873D1A8892081288AE081D1E0AB +:10744000B5F81290072824D1E87B000621D55127F2 +:1074500009F1140086B2002CE1D0A889002200991D +:10746000FFF787FF00285AD16888A08084F806A01B +:10747000A88920810120A073288A2082A4F8129074 +:10748000A88A009068884B46A969019A01F0F1FA30 +:10749000A8E0502709F1120086B2002C3ED0A8893E +:1074A00000225946FFF765FF002838D16888A08080 +:1074B000A889E080287A072813D002202073288A20 +:1074C000E081E87BC0096073A4F81090A88A00905E +:1074D000688801E083E080E04B4604F11202A9696C +:1074E000D4E70120EAE7B5F81290512709F114001A +:1074F00086B2002C66D06888042109F059FA8346C8 +:107500006888A080A88900220099FFF732FF002830 +:107510006ED184F806A0A889208101E052E067E0DE +:107520000420A073288A2082A4F81290A88A0090D0 +:1075300068884B46A969019A01F09BFAA989ABF8C2 +:107540000E104FE06888FBF786FF07466888042125 +:1075500009F02EFA064607B9FFDF06B9FFDF687BA0 +:10756000C00702D05127142601E0502712264CB341 +:107570006888A080502F06D084F806A0287B594642 +:1075800001F087FA2EE0287BA11DF9E7FE49A889C2 +:107590004989814205D1542706269CB16888A0807C +:1075A00020E053270BE06888A080A889E08019E0DC +:1075B0006888042109F0FCF900B9FFDF5527082687 +:1075C000002CF0D1A8F8006011E056270726002C07 +:1075D000F8D06888A080002013E0FFDF02E00128D7 +:1075E00008D0FFDFA8F800600CB12780668000207B +:1075F000BDE8FC9F57270726002CE3D06888A080B1 +:10760000687AA071EEE7401D20F0030009B1414304 +:10761000091D01EB4000704713B5DB4A00201071D3 +:10762000009848B10024684608F0DFFF002C02D122 +:10763000D64A009911601CBD01240020F4E770B502 +:107640000D46064686B014465C2128461CF051FEC5 +:1076500004B9FFDFA0786874A2782188284601F079 +:1076600042FA0020A881E881228805F11401304601 +:1076700005F04FF96A460121304606F0E2FA19E0BA +:107680009DF80300000715D5BDF806103046FFF73A +:1076900030FD9DF80300BDF8061040F010008DF895 +:1076A0000300BDF80300ADF81400FF233046059A2F +:1076B00006F028FC684606F0D0FA0028E0D006B0B4 +:1076C00070BD10B50C4601F1140005F059F90146E2 +:1076D000627C2046BDE8104001F03ABA70B505461C +:1076E000042109F065F9040000D1FFDF04F1140161 +:1076F0000C46284605F028F921462846BDE870408A +:1077000005F029B970B58AB00C460646FBF7A3FE12 +:10771000050014D02878222827D30CB1A08890B176 +:1077200001208DF80C0003208DF8100000208DF84A +:10773000110054B1A088ADF81800206807E043F2AA +:1077400002000AB070BD0920FBE7ADF818000590F3 +:107750000421304609F02CF9040000D1FFDF04F1C8 +:10776000140005F024F9000701D40820E9E701F02E +:1077700051FE60B108A802210094CDE9011095F8EE +:10778000232003A930466368FFF734FCD9E71120B2 +:10779000D7E72DE9F04FB2F802A0834689B015462D +:1077A00089465046FBF757FE07460421504609F02C +:1077B000FFF80026044605964FF002080696ADF83D +:1077C0001C6007B9FFDF04B9FFDF4146504603F0F4 +:1077D00070FE50B907AA06A905A88DE80700424621 +:1077E000214650466368FFF794FB674807AB066085 +:1077F000DDE9051204F11400CDF80090CDE9032075 +:10780000CDE9013197F82320594650466B6805F0C1 +:1078100017F906000AD0022E04D0032E14D0042E2D +:1078200000D0FFDF09B03046BDE8F08FBDF81C0086 +:107830000028F7D00599CDE9001042462146504670 +:107840006368FFF793FBEDE7687840F00800687025 +:10785000E8E72DE9F04F9BB004464FF000084A4896 +:10786000ADF85480ADF83080ADF85080A0F80880B5 +:10787000ADF81480ADF81880ADF82080ADF81C800C +:10788000007916460D464746012808D0022806D042 +:10789000032804D0042802D008201BB0C4E72046E7 +:1078A0000CF03CFDD0BB28460CF038FDB0BB606846 +:1078B0000CF081FD90BB606848B1608921898842E5 +:1078C00002D8B1F5007F01D90C20E6E780460BAA6B +:1078D00006A92846FFF70FFA0028DED168688078ED +:1078E000C0F34100022808D19DF8190010F0380FAC +:1078F00003D028690CF056FD80B905A92069FFF76F +:10790000B2F90028C9D1206950B1607880079DF88C +:10791000150000F0380002D5D0B301E011E0B8BB8B +:107920009DF8140080060ED59DF8150010F0380F54 +:1079300003D060680CF036FD18B960680CF03BFDB0 +:1079400008B11020A9E707A96069FFF78CF90028A2 +:10795000A3D1606940B19DF81D0000F00701012925 +:107960003FD110F0380F3CD008A9A069FFF77BF990 +:10797000002892D19DF81C00800632D49DF820008A +:1079800080062ED4A06904E07C02002014000020B0 +:1079900027E040B19DF8210000F00701012920D126 +:1079A00010F0380F1DD0E06818B10078C8B11C285D +:1079B00017D20EAA611C2046FFF7C4F90120B94670 +:1079C00060F30F27BA4607468DF84E0042F60300D3 +:1079D000ADF84C000DF13B0217A928680AF089FDAB +:1079E00008B1072059E79DF85C0016A9CDF8009072 +:1079F000C01CCDE9019100F0FF0B00230BF2012226 +:107A0000514613A806F060F8F0BBBDF85800099085 +:107A1000FE482A8929690092CDE901106B89BDF8D9 +:107A20002C202868069906F04FF801007ED12078B6 +:107A30004FF0020AC10601D480062BD5ADF80C9098 +:107A4000606950B907A906A8FFF7ADF99DF81D00B8 +:107A500020F00700401C8DF81D009DF81C008DF8DB +:107A60004E7040F0C8008DF81C0042F60210ADF8D0 +:107A70004C000CA903AACDF800A0CDE901210023F8 +:107A800040F2032213A800E01EE0079906F01CF85C +:107A900001004BD1DD484D4608385B460089ADF802 +:107AA00039000EA8CDE90290CDF80490CDF81090E1 +:107AB0004FF007090022CDF80090BDF858104FF69E +:107AC000FF7005F047FF10B1FFF79DF8E5E69DF860 +:107AD0003800000625D52946012060F30F218DF8D6 +:107AE0004E704FF42450ADF84C00ADF81050627851 +:107AF0009DF81000002362F300008DF810006278FA +:107B0000CDF800A0520862F341008DF8100004AADD +:107B1000CDE9012540F2032213A805F0D5FF0100AD +:107B200004D1606888B32069A8B900E086E005A99F +:107B300006A8FFF738F96078800706D49DF815008D +:107B400020F038008DF8150005E09DF8140040F095 +:107B500040008DF814008DF84E7042F60110ADF81B +:107B60004C00208940F20121B0FBF1F201FB12022E +:107B7000606814ABCDF80080CDE90103002313A8A1 +:107B8000059905F0A1FF010058D12078C00729D040 +:107B9000ADF80C50A06950B908A906A8FFF703F981 +:107BA0009DF8210020F00700401C8DF821009DF871 +:107BB00020008DF84E7040F040008DF8200042F615 +:107BC0000310ADF84C0015A903AACDF800A0CDE92B +:107BD0000121002340F2032213A8089905F074FF45 +:107BE00001002BD1E06868B32946012060F30F2122 +:107BF0008DF84E7042F60410ADF84C00E06800239A +:107C000002788DF8602040788DF86100E06818AA4D +:107C10004088ADF86200E06800798DF86400E068A3 +:107C2000C088ADF86500CDF80090CDE901254FF48E +:107C3000027213A805F048FF010003D0099800F074 +:107C4000B3FF2AE6714803210838017156B1008953 +:107C50003080BDF850007080BDF83000B080BDF8B5 +:107C60005400F080002018E670B501258AB0164651 +:107C70000B46012802D0022816D104E08DF80E50E0 +:107C80004FF4205003E08DF80E5042F60100ADF89D +:107C90000C005BB10024601C60F30F2404AA08A947 +:107CA00018460AF026FC18B107204AE5102048E5DE +:107CB00004A99DF820205548CDE90021801E02909E +:107CC0000023214603A802F2012205F0FDFE10B1B7 +:107CD000FEF799FF35E54D4808380EB1C18831806F +:107CE000057100202DE5F0B593B0074601268DF80B +:107CF0003E6041F60100ADF83C0012AA0FA93046E3 +:107D0000FFF7B2FF002848D1404C0025083CE7B3FC +:107D10001C2102A81CF0EDFA9DF808008DF83E60C9 +:107D200040F020008DF8080042F60520ADF83C0038 +:107D30000E959DF83A00119520F00600801C8DF8F4 +:107D40003A009DF838006A4620F0FF008DF83800B0 +:107D50009DF8390009A920F0FF008DF839000420B2 +:107D6000ADF82C00ADF830000EA80A9011A80D90C7 +:107D70000FA80990ADF82E5002A8FFF76AFD002861 +:107D80000BD1BDF80000608100E008E0BDF8040000 +:107D9000A081401CE0812571002013B0F0BD6581F9 +:107DA000A581BDF84800F4E72DE9F74F1749A0B0C9 +:107DB0000024083917940A79A146012A04D0022A1E +:107DC00002D0082023B02FE5CA88824201D00620C5 +:107DD000F8E721988A46824201D10720F2E7012084 +:107DE0002146ADF848004FF6FF7860F30F21ADF85B +:107DF0004A808DF86E0042F6020B06918DF87240B3 +:107E0000ADF86CB0ADF870401CA901E08402002010 +:107E10001391ADF8508012A805F043FF00252E46BF +:107E20002F460DAB072212A9404605F03DFF78B161 +:107E30000A285DD195B38EB3ADF86450ADF8666095 +:107E40009DF85E008DF8144019AC012864D06BE0F9 +:107E50009DF83A001FB3012859D1BDF83810594593 +:107E60001FD118A809A901940294CDE90310072095 +:107E70000090BDF8361010230022404605F094FF14 +:107E8000B0BBBDF86000042801D006284AD1BDF877 +:107E90002410219881423AD10F2093E73AE001283B +:107EA00035D1BDF83800B0F5205F03D042F60101AE +:107EB00088422CD1BAF80600BDF83610884201D1AC +:107EC000012700E0002705B19EB1219881421ED113 +:107ED00018A809AA01940294CDE903200720009074 +:107EE0000D4610230022404605F05EFF00B902E077 +:107EF0002DE04E460BE0BDF86000022801D01028AE +:107F000010D1C0B217AA09A90AF0D4FA50B9BDF825 +:107F1000369086E7052055E705A917A8221D0AF027 +:107F2000E8FA08B103204DE79DF814000023001D76 +:107F3000C2B28DF8142022980092CDE901401BA80E +:107F4000069905F0C1FD10B902228AF80420FEF757 +:107F50005AFE37E710B50B46401E88B084B205AA1A +:107F600000211846FEF7EEFE00200DF1080C06AACF +:107F700005A901908CE8070007200090012300224A +:107F800021464FF6FF7005F0E5FC0446BDF81800E9 +:107F9000012800D0FFDF2046FEF735FE08B010BDF7 +:107FA000F0B5FF4F044687B038790E46032804D059 +:107FB000042802D0082007B0F0BD04AA03A9204677 +:107FC000FEF799FE0500F6D160688078C0F34100A5 +:107FD00002280AD19DF80D0010F0380F05D0206955 +:107FE0000CF0E0F908B11020E5E7208905AA216925 +:107FF0008DE807006389BDF810202068039905F01B +:1080000063FD10B1FEF7FFFDD5E716B1BDF8140012 +:108010003080042038712846CDE7F8B50C000646BC +:108020000BD001464FF6FF7500236A46284605F03F +:108030003DFF20B1FEF7E7FDF8BD1020F8BD694611 +:108040002046FEF710FE0028F8D1A078314600F057 +:1080500001032846009A05F055FFEBE730B587B0DD +:10806000144600220DF1080C05AD01928CE82C009D +:10807000072200920A46014623884FF6FF7005F05A +:1080800069FCBDF814102180FEF7BDFD07B030BDBE +:1080900070B50D46042108F08BFC040000D1FFDF11 +:1080A000294604F11400BDE8704004F079BC70B5B5 +:1080B0000D46042108F07CFC040000D1FFDF2946B6 +:1080C00004F11400BDE8704004F08DBC70B50D469D +:1080D000042108F06DFC040000D1FFDF294604F103 +:1080E0001400BDE8704004F0A5BC70B5054604213D +:1080F00008F05EFC040000D1FFDF2146284623681B +:10810000BDE870400122FEF74BBF70B50646042162 +:1081100008F04EFC040000D1FFDF04F1140004F06D +:108120002FFC401D20F0030511E0011D00880022F6 +:10813000431821463046FEF733FF00280BD0607C01 +:10814000ABB2684382B2A068011D08F0EEFAA068E5 +:1081500041880029E9D170BD70B50546042108F0B9 +:1081600027FC040000D1FFDF214628466368BDE8F4 +:1081700070400222FEF714BF70B50E46054601F0AE +:1081800049F9040000D1FFDF01202072667265808A +:10819000207820F00F00001D20F0F000403020700B +:1081A000BDE8704001F039B910B50446012900D08E +:1081B000FFDF2046BDE810400121FAF713B92DE991 +:1081C000F04F97B04FF0000A0C008346ADF814A0B2 +:1081D000D04619D0E06830B1A068A8B10188ADF8E8 +:1081E0001410A0F800A05846FBF735F9070043F239 +:1081F000020961D0387822285CD30421584608F05F +:10820000D7FB050005D103E0102017B0BDE8F08FC3 +:10821000FFDF05F1140004F0B3FB401D20F003065E +:10822000A078012803D0022801D00720EDE721889B +:1082300007AA584605F005FD30BB07A805F00DFD5F +:1082400010BB07A805F009FD48B99DF826000128D4 +:1082500005D1BDF82400A0F52451023902D04FF415 +:108260005050D2E7E068B0B1CDE902A007200090FD +:1082700005AACDF804A00492A2882188BDF8143084 +:10828000584605F067FB10B1FEF7BDFCBDE7A168DD +:10829000BDF8140008809DF81F00C00602D543F207 +:1082A0000140B2E70B9838B1A1780078012905D0D8 +:1082B00080071AD40820A8E74846A6E7C007F9D0E7 +:1082C00002208DF83C00A8684FF00009A0B1697C3D +:1082D0004288714391420FD98AB2B3B2011D08F0AE +:1082E000DAF98046A0F800A006E003208DF83C00F3 +:1082F000D5F800804FF001099DF8200010F0380FEC +:1083000000D1FFDF9DF820002649C0F3C2000844D9 +:1083100097F8231010F8010C884201D90F2074E758 +:108320002088ADF8400014A90095CDE9019143469D +:1083300007220FA95846FEF75DFE002891D19DF84F +:10834000500050B9A078012807D1687CB3B27043BF +:1083500082B2A868011D08F0B2F9002055E770B597 +:10836000064615460C460846FEF70CFC002805D1CB +:108370002A4621463046BDE8704075E470BD13E5DD +:1083800070B51E4614460D000ED06CB1616859B12F +:1083900060B10349C988814208D0072070BD000040 +:1083A0007C020020FA2F00001020F7E72068FEF77B +:1083B000E9FB0028F2D1324621462846BDE870404C +:1083C000FFF747BA70B515460C0006D038B1FE4924 +:1083D0000989814203D00720E0E71020DEE720680A +:1083E000FEF7D0FB0028D9D129462046BDE87040D1 +:1083F000D6E570B5064686B00D46144610460BF01D +:10840000B3FFD0BB60680BF0D6FFB0BBA6F57F40D2 +:10841000FF3803D03046FBF71EF880B12846694686 +:10842000FEF7E3FC00280CD19DF810100F2008295E +:108430003CD2DFE801F008060606060A0A0843F205 +:10844000020006B0AAE70320FBE79DF8021001290D +:1084500008D1BDF80010B1F5C05FF2D06FF4C05282 +:10846000D142EED09DF8061001290DD1BDF80410BF +:10847000A1F52851062907D200E028E0DFE801F045 +:10848000030304030303DCE79DF80A1001290ED15E +:10849000BDF80810B1F5245FD3D0A1F524510239FD +:1084A000CFD00129CDD0022901D1CAE7FFDF606812 +:1084B00078B9002305AA2946304605F0F7FC10B12B +:1084C000FEF7A1FBBDE79DF81400800601D4102043 +:1084D000B7E76188224628466368FFF7BFFDB0E72B +:1084E0002DE9F043814687B08846144610460BF0CC +:1084F0003BFF18B1102007B0BDE8F083002306AAA7 +:108500004146484605F0D2FC18B100BFFEF77BFBA0 +:10851000F1E79DF81800C00602D543F20140EAE7F2 +:108520000025072705A8019500970295CDE903507E +:1085300062884FF6FF734146484605F035FC060059 +:1085400013D160680BF010FF60B960680195CDE948 +:10855000025000970495238862884146484605F0FA +:1085600023FC0646BDF8140020803046CEE739B122 +:10857000954B0A889B899A4202D843F203007047C0 +:108580001DE610B586B0904C0423ADF81430638915 +:1085900043B1A4898C4201D2914205D943F2030030 +:1085A00006B010BD0620FBE7ADF8101000210091C9 +:1085B0000191ADF8003002218DF8021005A9029159 +:1085C00004A90391ADF812206946FFF7F8FDE7E72B +:1085D0002DE9FC4781460E4608460BF09FFE88BBFE +:1085E0004846FAF738FF5FEA00080AD098F800001A +:1085F000222829D30421484608F0DAF9070005D1DA +:1086000003E043F20200BDE8FC87FFDF07F114003E +:1086100004F0CDF905463078012803D0022804D0B3 +:108620000720F0E7A8070FD502E015F01C0F0BD0CC +:10863000B079341DC00709D0E08838B1A0680BF0CC +:108640006DFE18B11020DEE70820DCE732782088C4 +:10865000002628B3A0F201130721112B18D20CD247 +:10866000DFE803F00B090D0B1D0B121D100B0B1D8A +:108670001D1D1D0B1D00022A11D10846C3E7012A4A +:10868000FBD00CE02A0700E0EA06002AF5DA06E053 +:10869000A0F5C0721F2A02D97D3A022AEDD8C6B2CF +:1086A00000F0B8FE50B198F82300CDE90006FA8931 +:1086B000234639464846FEF7EAFCA4E71120A2E724 +:1086C0002DE9F04F8BB01F4615460C468346002619 +:1086D000FAF7C1FE28B10078222805D208200BB095 +:1086E00094E543F20200FAE7B80801D00720F6E764 +:1086F000032F00D100274FF6FF79CCB1022D73D3A1 +:1087000020460BF058FE30B904EB0508A8F1010033 +:108710000BF051FE08B11020E1E7AD1EAAB22146D0 +:10872000484605F06DFC38F8021C88425CD1ADB2B9 +:108730002549B80702D58889401C00E001201FFAAE +:1087400080F8F80701D08F8900E04F4605AA41461E +:10875000584605F076FA4FF0070A4FF00009ACB31F +:10876000204608E0408810283ED8361D304486B2A6 +:10877000AE4239D2A01902884245F3D354E000BF7B +:108780009DF8170002074FD584B304EB0608361D89 +:10879000B8F80230B6B2102B26D89A19AA4223D8BC +:1087A000B8F8002091421FD1C00620D5CDE900A91C +:1087B0000DF1080C0AAAA11948468CE80700B8F880 +:1087C00000100022584603E07C0200202CE00BE061 +:1087D00005F0C0F810B1FEF716FA80E7B8F802000D +:1087E000BDF82810884202D00B2078E704E0B8F8E2 +:1087F0000200304486B206E0C00604D55846FEF7B3 +:1088000078FC002888D19DF81700BDF81A1020F0D8 +:1088100010008DF81700BDF81700ADF80000FF2319 +:108820005846009A05F06EFB05A805F016FA18B92F +:10883000BDF81A10B942A3D90421584608F0B8F877 +:10884000040000D1FFDFA2895AB1CDE900A94D464D +:10885000002321465846FEF71AFC0028BDD1A58109 +:108860003DE700203BE72DE9FF4F8BB01E46170088 +:108870000D464FF0000412D0B00802D007200FB010 +:10888000C4E4032E00D100265DB108460BF08AFD3A +:1088900028B93888691E08440BF084FD08B11020FF +:1088A000EDE7C74AB00701D5D18900E00121F00703 +:1088B0004FF6FF7802D0D089401E00E0404686B2D5 +:1088C00006AA0B9805F0BDF94FF000094FF0070B11 +:1088D0000DF1140A39E000BF9DF81B00000734D5E4 +:1088E000CDF80490CDF800B0CDF80890CDE9039A0A +:1088F000434600220B9805F057FA60BB05B3BDF85C +:1089000014103A8821442819091D8A4230D3BDF831 +:108910001E2020F8022BBDF8142020F8022BCDE9F0 +:1089200000B9CDE90290CDF810A0BDF81E10BDF839 +:10893000143000220B9805F037FA08B103209EE7A7 +:10894000BDF814002044001D84B206A805F085F986 +:1089500020B10A2806D0FEF756F990E7BDF81E10A0 +:10896000B142B9D934B17DB13888A11C884203D253 +:108970000C2084E7052082E722462946404605F080 +:108980003FFB014628190180A41C3C80002076E7AB +:1089900010B504460BF0E8FC08B1102010BD884863 +:1089A000C0892080002010BDF0B58BB00D46064672 +:1089B000142103A81BF09DFC01208DF80C008DF8FC +:1089C000100000208DF81100ADF814503046FAF771 +:1089D00042FD48B10078222812D30421304607F026 +:1089E000E7FF040005D103E043F202000BB0F0BD45 +:1089F000FFDF04F11400074603F0D9FF800601D41D +:108A00000820F3E7207C022140F00100207409A82F +:108A10000094CDE90110072203A930466368FEF7F0 +:108A2000E9FA20B1217C21F001012174DEE7294619 +:108A30003046F9F7C8FC08A9384603F0A7FF00B193 +:108A4000FFDFBDF82040172C01D2172000E02046A0 +:108A5000A84201D92C4602E0172C00D21724214647 +:108A60003046FFF724FB21463046F9F7D2F90020C3 +:108A7000BCE7F8B51C4615460E46069F08F0CAF836 +:108A80002346FF1DBCB231462A46009407F0B5FCD0 +:108A9000F8BD70B50C4605460E2120461BF007FCBC +:108AA000002020802DB1012D01D0FFDF76E40620CB +:108AB00000E00520A07171E410B5488008781346E5 +:108AC00020F00F00001D20F0F00080300C460870F0 +:108AD0001422194604F108001BF0AFFB00F09DFCC6 +:108AE0003748046010BD2DE9F047DFF8D890491DE4 +:108AF000064621F0030117460C46D9F8000007F09E +:108B000092FD050000D1FFDF4FF000083560A5F8A9 +:108B100000802146D9F8000007F085FD050000D14E +:108B2000FFDF7560A5F800807FB104FB07F1091D28 +:108B30000BD0D9F8000007F076FD040000D1FFDF6C +:108B4000B460C4F80080BDE8F087C6F80880FAE792 +:108B50002DE9F0411746491D21F00302194D064643 +:108B600001681446286807F089FD22467168286864 +:108B700007F084FD3FB104FB07F2121D03D0B1687A +:108B8000286807F07BFD042007F0BAFE04460420A5 +:108B900007F0BEFE201A012804D12868BDE8F04184 +:108BA00007F036BDBDE8F08110B50C4605F015F8AC +:108BB00000B1FFDF2046BDE81040FEF724B80000FA +:108BC0007C0200201400002038B50C468288817B8E +:108BD00019B14189914200D90A462280C188121DEB +:108BE00090B26A4606F092FFBDF80000032800D359 +:108BF0000320C1B2208800F0A3FF38BD38B50C4671 +:108C00008288817B19B10189914200D90A4622806C +:108C1000C188121D90B26A4606F078FFBDF80000C8 +:108C2000022800D30220C1B2208800F089FF401C36 +:108C3000C0B238BD2DE9FE4F0C46FD4981464022A9 +:108C4000D1E90201CDE9010109F1030020F003019E +:108C5000C91C21F0030100916846114607F0C5FCCC +:108C6000F44E002C02D1F44A00999160009901441D +:108C70000091357F05F1010504D1E8B209F0C0FB90 +:108C800000B1FFDF009800EB0510C01C20F00301CD +:108C900000915CB9707AB27A1044C2B200200870B8 +:108CA000308C80B204F021FE00B1FFDF0098316A01 +:108CB000084400902146684600F00DFF0098C01C53 +:108CC00020F003000090B37AF27A717A04B10020A8 +:108CD00007F081FD0099084400902146684600F0A5 +:108CE0003AFF00273D46B24696F801800CE0284640 +:108CF00000F0D4FE064681788088F9F721F9717872 +:108D00006D1C00FB0177EDB24545F0D10098C01C09 +:108D100020F00300009004B100203946F9F71BF958 +:108D200000990027084400903D469AF801800CE025 +:108D3000284600F0B3FE0646C1788088FEF763FC43 +:108D400071786D1C00FB0177EDB24545F0D10098BC +:108D5000C01C20F00300009004B100203946FEF74B +:108D60005BFC00994FF000080844009045469AF8D3 +:108D700001700EE0284600F091FE0646807B30B17F +:108D800006F1080001F0DDFE727800FB02886D1C20 +:108D9000EDB2BD42EED10098C01C20F0030000905F +:108DA00004B10020414601F0D0FE00990844009033 +:108DB0002146684600F049FE0098C01D20F00702D9 +:108DC00000922CBB9D490020FAF747F8FBF715FBF2 +:108DD000984801AA00211030F8F7CEFA00B1FFDF61 +:108DE0009AF81D00FEF77FFF00B1FFDF91484FF4B6 +:108DF000F67144301BF07DFA8E480421443080F82F +:108E0000E91180F8EA11062180F8EB1103210171C4 +:108E10000099A1EB0900BDE8FE8F70B5854C0646B0 +:108E20004434207804EB4015E078083590B9A01957 +:108E300090F8E80100280ED0A0780F2800D3FFDFBB +:108E4000202128461BF055FA687866F30200687006 +:108E50000120E070284670BD2DE9F04105460C4622 +:108E600000270078052190463E46B1EB101F00D048 +:108E7000FFDF287A50B101280ED0FFDFA8F800608C +:108E80000CB1278066800020BDE8F081012709260B +:108E900074B16888A08008E00227142644B168886D +:108EA000A0802869E060A88A2082287B2072E5E7FC +:108EB000A8F80060E7E710B55F4C6068C11D21F0BD +:108EC0000701814200D0FFDF5A48012100220170D2 +:108ED00042700172417203238372C1720273027481 +:108EE000052202831F224283417455A242610A2255 +:108EF000027741774FF4B06101626168416010BD53 +:108F000030B54D4C1568636810339D4202D2042081 +:108F1000136030BD474B5D785A6802EB0512107044 +:108F200051700320D080172090800120D070907065 +:108F3000002090735878401C587060681030606052 +:108F4000002030BD70B506463A480024457807E059 +:108F5000204600F0A3FD0178B14204D0641CE4B2C5 +:108F6000AC42F5D1002070BDF7B5074608780C4635 +:108F700010B3FFF7E7FF0546A7F12006202F06D024 +:108F8000052E19D2DFE806F00F2B2B151A0000F082 +:108F900090FD0DB1697800E00021401AA17880B2FF +:108FA0000844FF2808D8A07830B1A088022824D22D +:108FB00002E06088172820D20720FEBD207AE0B1A9 +:108FC00061881729F8D3A1881729F5D3A179002939 +:108FD000F2D0E1790029EFD0402804D9ECE7242F22 +:108FE0000BD1207A48B161884FF6FB70814202D8DC +:108FF000A188814201D90420FEBD65B9207802AA6A +:109000000121FFF77DFF0028F6D12078FFF79AFFB6 +:10901000050000D1FFDF052E25D2DFE806F003189A +:109020001B151E00A0786870A088E8801CE0000076 +:10903000B0460200980300201C0000200000002021 +:109040006E524635780000006088A8800CE0A07859 +:10905000A87009E0A078E87006E054F8020FA86054 +:109060006068E86000E0FFDF0020FEBD1A2835D010 +:109070000DDC132832D2DFE800F01B31203131271C +:109080002723252D313129313131312F0F0030285F +:1090900002D003DC1E2821D1072070473A38092866 +:1090A0001CD2DFE800F0151B0F1B1B1B1B1B07004E +:1090B0000020704743F20400704743F202007047FB +:1090C000042070470D2070470F207047082070471C +:1090D0001120704713207047062070470320704707 +:1090E00010B5007800F0010006F001FDBDE8104069 +:1090F000BCE70EB5017801F001018DF80010417850 +:1091000001F001018DF801100178C1F340018DF8E3 +:1091100002104178C1F340018DF8031001788908ED +:109120008DF80410417889088DF8051081788DF844 +:109130000610C1788DF8071000798DF80800684690 +:1091400005F0ACFAFFF792FF0EBD2DE9F84FDFF8FE +:10915000F883FE4C00261FE0012000F03FFD0120B7 +:10916000FFF75BFE054640214746D8F8080007F0A8 +:109170005AFA686000B9FFDF686805F03EF8A8B1E8 +:109180002846FAF75AFC284600F02EFD20B9402266 +:109190006968B86807F072FA94F9E9010428DBDA23 +:1091A000022007F0ADFB07460025A6E040226968D3 +:1091B000D8F8080007F062FAF2E7B8F80210404663 +:1091C000491C89B2A8F80210B94201D3002141809C +:1091D0000221B8F8020007F0EBFB002865D0B8F8D0 +:1091E0000200694606F0F1FBFFF740FF00B1FFDF28 +:1091F0009DF8000078B1B8F8020007F01DFD5FEAA5 +:10920000000900D1FFDF484606F08BFF18B1B8F81F +:10921000020002F03DF9B8F8020007F0FBFC5FEA3B +:10922000000900D1FFDF484606F073FFE8BB0321C9 +:10923000B8F8020007F0BCFB5FEA000B48D1FFDF83 +:1092400046E000BFDBF8100010B10078FF2849D0DD +:10925000022000F0C3FC0220FFF7DFFD82464846F3 +:1092600007F063F8CAF8040000B9FFDFDAF8040079 +:1092700007F02BF9002100900170B8F80210504659 +:10928000AAF8021001F00AFE484607F020F900B9DA +:10929000FFDF504600F0A8FC18B99AF8010000075B +:1092A00004D50099CBF8101012E024E0DBF8100090 +:1092B00038B10178491C11F0FF01017008D1FFDFBE +:1092C00006E000221146484600F0BDFB00B9FFDF72 +:1092D00094F9EA01022805DBB8F8020001F0A3FDC9 +:1092E0000028AFD194F9E901042804DB484607F0CF +:1092F00052F900B101266D1CEDB2BD4204D294F9C1 +:10930000EA010228BFF659AF002E7FF423AFBDE873 +:10931000F84F032000F062BC10B58B4CE060086889 +:109320002061AFF2D91002F012FD607010BD8748C5 +:1093300000214438017084480170854941607047BC +:1093400070B505464FF080500C46D0F8A410491C6B +:1093500005D1D0F8A810C9430904090C0BD050F866 +:10936000A01F01F001012970416821608068A08080 +:10937000287830B970BD062120460AF0AAFC0120E9 +:109380002870607940F0C000607170BD70B54FF01A +:1093900080540D46D4F88010491C0BD1D4F88410A9 +:1093A000491C07D1D4F88810491C03D1D4F88C107B +:1093B000491C0CD0D4F880100160D4F884104160AE +:1093C000D4F888108160D4F88C10C16002E01021BC +:1093D0000AF07FFCD4F89000401C0BD1D4F8940024 +:1093E000401C07D1D4F89800401C03D1D4F89C004D +:1093F000401C09D054F8900F286060686860A0682D +:10940000A860E068E86070BD2846BDE870401021A3 +:109410000AF05FBC4D480079FFE470B54B4CE07832 +:1094200030B3207804EB4010407A00F0070020446D +:1094300090F9E801002800DCFFDF2078002504EB2C +:109440004010407A00F00700011991F8E801401E31 +:1094500081F8E8012078401CC0B220700F2800D1AC +:109460002570A078401CA0700AF096FBE57070BDD6 +:10947000FFDF70BD3EB50546032107F099FA0446AB +:10948000284607F0C7FB054604B9FFDF206918B17D +:109490000078FF2800D1FFDF01AA6946284600F0C6 +:1094A000D2FA60B9FFDF0AE0002202A9284600F0E4 +:1094B000CAFA00B9FFDF9DF8080000B1FFDF9DF890 +:1094C0000000411E8DF80010EED2206901998842FB +:1094D00001D1002020613EBD70B50546A0F57F405A +:1094E0000C46FF3800D1FFDF012C01D0FFDF70BD3B +:1094F000FFF790FF040000D1FFDF207820F00F007D +:10950000401D20F0F0005030207065800020207257 +:1095100001202073BDE870407FE72DE9F041164639 +:109520000D460746FFF776FF040000D1FFDF2078E5 +:1095300020F00F00401D20F0F000503020706780B8 +:1095400001202072286805E01C000020DC030020B8 +:10955000C81400202061A888A0822673BDE8F041CD +:109560005BE77FB5FFF7EEFC040000D1FFDF02A947 +:109570002046FFF729FB054603A92046FFF73EFBDF +:109580008DF800508DF80100BDF80800001DADF801 +:109590000200BDF80C00001DADF80400E088ADF835 +:1095A0000600684606F08CFA002800D0FFDF7FBD79 +:1095B0002DE9F047DFF8FC930546002799F80000F5 +:1095C00010B10820BDE8F08728460AF0CDFE08B1AA +:1095D0001020F7E7F84C207808B9FFF76CFCA07A68 +:1095E000617A0844C6B200F064FAB04207D2301A79 +:1095F000C1B22A460020FFF783FC0700E2D1D9F868 +:1096000004004E46C01C20F00300C9F8040000F01E +:1096100040FB716800EB010801214046FFF70AFB9F +:10962000064629684044884202D8B6F5803F15D3E3 +:1096300028600020FFF786FC05000DD005F113001F +:10964000D9F8041020F003004E46884200D0FFDF16 +:109650006078401E607075600420B3E700214046CA +:10966000FFF7E8FA0446A64200D0FFDF04EB08014A +:10967000C9F8041029604FF6FF71A9F80210012102 +:1096800089F8001038469DE72DE9F0410446C948A5 +:1096900017460E46007810B10820BDE8F081084654 +:1096A0000AF03CFE08B11020F7E7C34D287808B94E +:1096B000FFF701FC601E1E2807D8012C22D130784C +:1096C000FE281FD828770020E7E7A4F120001F28F4 +:1096D00005D8E0B23A463146BDE8F04144E4A4F191 +:1096E00040001F2805D831462046BDE8F04100F073 +:1096F000A3BAA4F1A0001F2804D80020A02C03D0F6 +:10970000A12C06D00720C8E7317801F00101697764 +:10971000C3E731680922F82901D38B0701D010462D +:10972000BBE76B7C03F00303012B04D16B8BD733B6 +:109730009CB28C42F3D82962AFE72DE9F04781460D +:109740000E4608460AF010FE48B948460AF02AFEBE +:1097500028B909F1030020F00301494501D0102088 +:1097600030E795484FF0000A4430817869B141787C +:10977000804600EB411408343788324600212046E9 +:1097800000F040FA050004D027E0A6F800A005206C +:1097900018E7B9F1000F24D03088B84201D90C2560 +:1097A0001FE0607800F00705284600F017FA08EB84 +:1097B0000507324697F8E8014946401C87F8E8015A +:1097C000204607F5F47700F01DFA05463878401E6C +:1097D0003870032000F002FA2DB10C2D01D0A6F84C +:1097E00000A02846EEE66078724E00F007010129DD +:1097F00023D002290CD0032933D0FFDF98F80110C1 +:109800004046491CC9B288F801100F2934D035E010 +:10981000616821B1000702D46088FFF72BFE98F839 +:10982000EA014746012802D1707802F0AFFA97F9B1 +:10983000EA010428E2DBFFDFE0E7616819B14022BA +:10984000B06806F01BFF98F8E9014746032802D1EB +:10985000707802F09BFA97F9E9010428CEDBFFDF6C +:10986000CCE7C00602D56088FFF704FE98F9EB014B +:109870000628C3DBFFDFC1E780F801A08178491E1D +:109880008170617801F0070101EB080090F8E811A0 +:10989000491C80F8E811A4E770B50D4604460AF0AB +:1098A0003DFD18B928460AF05FFD08B1102070BDD3 +:1098B00029462046BDE8704008F0D9BD70B5044681 +:1098C00015460E4608460AF029FD18B928460AF042 +:1098D0004BFD08B1102070BD022C03D0102C01D01C +:1098E000092070BD2A463146204608F0E3FD0028D5 +:1098F000F7D0052070BD70B514460D4606460AF037 +:109900000DFD38B928460AF02FFD18B920460AF097 +:1099100049FD08B1102070BD22462946304608F0A6 +:10992000E8FD0028F7D0072070BD3EB504460AF0D8 +:109930001BFD08B110203EBD684604F00FFEFFF786 +:1099400095FB0028F7D19DF806002070BDF80800AF +:109950006080BDF80A00A08000203EBD70B50546BD +:109960000C4608460AF01EFD20B93CB120680AF0FA +:10997000FBFC08B1102070BDA08828B12146284604 +:10998000BDE87040FDF7BEBE092070BD70B504464D +:109990000D4608460AF0C2FC30B9601E1E2818D8D1 +:1099A00028460AF0BBFC08B1102070BD022C05D976 +:1099B000072070BD1C0000209803002004B9FFDFC1 +:1099C000F94800EB840050F8041C2846BDE87040BC +:1099D0000847A4F120001F2805D829462046BDE8E5 +:1099E0007040FAF792BCF02CE2D1A8680AF096FC1D +:1099F0000028D9D1284606F0CBF8BDE87040FFF723 +:109A000035BB70B504460D4608460AF0ADFC30B9CA +:109A1000601E1E280DD828460AF080FC08B11020D0 +:109A2000C7E7012C01D0022C01D10620C1E7072095 +:109A3000BFE7A4F120001F28F9D829462046BDE839 +:109A40007040FAF7BABC06F033BB38B50446D748C5 +:109A5000007B00F00105D9B9F9F78BFA0DB1226846 +:109A600000E00022D2484178C06804F06EFBD04884 +:109A70001030C0788DF8000010B1012802D004E049 +:109A8000012000E000208DF80000684604F0DFFDB2 +:109A9000002D02D020682830206038BD30B5C34D7D +:109AA00004466878A04200D8FFDF686800EB041025 +:109AB00030BD70B5BD4800252C46467807E02046ED +:109AC000FFF7ECFF4078641C2844C5B2E4B2B4420E +:109AD000F5D128466DE72DE9F0410C46064600F029 +:109AE00006F907463068C01C20F00302326014BB40 +:109AF000AE483B46082124300AF0EAFA002409E087 +:109B0000082C10D2DFE804F0060408080A04040652 +:109B1000A84804E0A84802E0A84800E0A8480AF0E5 +:109B2000F7FA054600E0FFDFA54200D0FFDF641C26 +:109B3000E4B2082CE4D3306800EB07103060ACE5E9 +:109B4000021D5143452900D245210844C01CB0FBE9 +:109B5000F2F0C0B270472DE9FC5F064693484FF023 +:109B600000088B464746444690F8019022E0204684 +:109B7000FFF794FF050000D1FFDF6878694638449D +:109B8000C7B22846FFF720F8824601A92846FFF70A +:109B900035F80346BDF804005246001D81B2BDF8F9 +:109BA0000000001D80B206F081FF6A78641C00FB93 +:109BB0000288E4B24C45DAD13068C01C20F00300C2 +:109BC0003060BBF1000F00D000204246394606F05D +:109BD0007BFF316808443060BDE8FC9F7349443125 +:109BE00008710020C870704770494431CA782AB1A2 +:109BF0000A7801EB42110831814201D001207047FF +:109C0000002070472DE9F04106460078154600F027 +:109C10000F0400201080601E0F46052800D3FFDFD0 +:109C200061482A46103000EB8400394650F8043C65 +:109C30003046BDE8F041184770B50C46402802D0C8 +:109C4000412806D120E0A07861780D18E1788142A2 +:109C500001D90720ADE62078012801D91320A8E614 +:109C6000FF2D08D808F0B0FD064609F04CFF301A69 +:109C7000801EA84201DA12209BE64C4821688160D0 +:109C800021790173002094E6BDE87040084600F099 +:109C90005EB82DE9F0470027DFF810A13E463D46AB +:109CA000B9463C469AF801800AE02046FFF7F6FEE6 +:109CB0004178807B0E4410FB0155641CE4B27F1C8C +:109CC0004445F2D109EB8700C6EBC60100EB8100E9 +:109CD0009AF8092000EB850101EBC2019AF80A20ED +:109CE0009AF80B0001EBC20101EB80006AE42DE958 +:109CF000F047DFF8B8900026344699F8090099F843 +:109D00000A2099F801700244D5B299F80B2010444A +:109D100000F0FF0808E02046FFF7C0FE817B407896 +:109D200011FB0066641CE4B2BC42F4D199F809004E +:109D300099F80A10284428444044401C01B10121EC +:109D400008448419FF2C00D9FFDFE0B23AE438B5AB +:109D50000446407800F00300012803D002280BD00D +:109D6000072038BD606858B10AF025FBD0B960689B +:109D70000AF018FB20B915E060680AF0CFFA88B93C +:109D800069462046FCF71EF90028EAD1607800F009 +:109D90000300022816D19DF8000098B160680AF00F +:109DA00001FB78B1102038BDB046020098030020B6 +:109DB0001C000020B941000017AC00005D2F00001E +:109DC000F32101006189F8290DD8208988420AD839 +:109DD000607800F003020A48012A06D1D731026AEE +:109DE00089B28A4201D20920DDE794E80E0000F131 +:109DF000100585E80E000AB9002101830020D2E792 +:109E0000980300202DE9F04107461446884608468D +:109E100001F01CFD064608EB88001C22796802EB65 +:109E2000C0000D18688C58B14146384601F016FD47 +:109E3000014678680078C200082305F120000CE094 +:109E4000E88CA8B14146384601F00FFD014678681C +:109E500008234078C20005F1240006F066FC38B102 +:109E6000062121726681D0E90010C4E9031009E0DF +:109E7000287809280BD00520207266816868E06088 +:109E8000002028702046BDE8F04101F0D5BC072035 +:109E900020726681F4E72DE9F04116460D4607462B +:109EA000406801EB85011C2202EBC10144182046E9 +:109EB00001F0FDFC40B10021708865F30F2160F3D3 +:109EC0001F4107200AF0DEF909202070324629469A +:109ED0003846BDE8F04195E72DE9F0410E460746CA +:109EE00000241C21F07816E004EB8403726801EB77 +:109EF000C303D25C6AB1FFF78DFA050000D1FFDF22 +:109F00006F802A4621463046FFF7C5FF0120BDE895 +:109F1000F081641CE4B2A042E6D80020F7E770B5F7 +:109F2000064600241C21C0780AE000BF04EB84032D +:109F3000726801EBC303D5182A782AB1641CE4B215 +:109F4000A042F3D8402070BD282128461AF0AFF96E +:109F5000706880892881204670BD70B50346002056 +:109F60001C25DC780DE000BF00EB80065A6805EB8D +:109F7000C6063244167816B1128A8A4204D0401CB2 +:109F8000C0B28442F0D8402070BDF0B50446002035 +:109F90001C26E5780EE000BF00EB8007636806EB47 +:109FA000C7073B441F788F4202D15B78934204D0AD +:109FB000401CC0B28542EFD84020F0BD0078032895 +:109FC00001D000207047012070470078022801D09E +:109FD00000207047012070470078072801D000203A +:109FE0007047012070472DE9F041064688461078F9 +:109FF000F1781546884200D3FFDF2C781C27641CBB +:10A00000F078E4B2A04201D8201AC4B204EB840173 +:10A01000706807EBC1010844017821B141468847C7 +:10A0200008B12C7073E72878A042E8D1402028704E +:10A030006DE770B514460B880122A240134207D188 +:10A0400013430B8001230A22011D06F038FB047024 +:10A0500070BD2DE9FF4F81B00878DDE90E7B9A468F +:10A0600091460E4640072CD4019806F0E5FD040009 +:10A0700000D1FFDF07F1040820461FFA88F105F040 +:10A0800024FF050000D1FFDF204629466A4606F07E +:10A090006EF90098A0F80370A0F805A0284606F015 +:10A0A00014FA017869F306016BF3C71101702046B9 +:10A0B0001FFA88F105F04CFF00B9FFDF019803F0AB +:10A0C000B9FF06EB0900017F491C017705B0BDE827 +:10A0D000F08F2DE9F84F0E469A4691460746032128 +:10A0E00006F066FC0446008DDFF8B485002518B143 +:10A0F00098F80000B0421ED1384606F09DFD0700DA +:10A1000000D1FFDF09F10401384689B205F0DDFE18 +:10A11000050010D0384629466A4606F028F900980E +:10A1200000210A460180817004F054F80098C01D97 +:10A13000CAF8000021E098F80000B04216D104F1FE +:10A14000260734F8341F012000FA06F911EA090F36 +:10A1500000D0FFDF2088012340EA090020800A2286 +:10A16000391D384606F0C6FA067006E0324604F19C +:10A17000340104F12600FFF75CFF0A2188F8001083 +:10A180002846BDE8F88FFEB514460D46064602ABDC +:10A190000C220621FFF79DFF002826D0029968783F +:10A1A00012220A70801C487008224A80A8702088F9 +:10A1B00088806088C880A0880881E0884881002461 +:10A1C0000C20CDE900040523062229463046FFF77E +:10A1D00040FF2146002266F31F41F023104609F09C +:10A1E000A7FF6878801C68700120FEBDFEB514468C +:10A1F0000D460622064602AB1146FFF76AFF00280D +:10A2000012D0029B132000211870A87858700220E9 +:10A2100058809C800620CDE900010246052329468E +:10A220003046FFF716FF0120FEBD2DE9FE430C4628 +:10A23000804644E002AB0E2207214046FFF749FF6B +:10A24000002841D060681C2267788678BF1C06EB26 +:10A25000860102EBC1014518029814210170477074 +:10A260000A214180698A0181E98A4181A988818026 +:10A27000A9898181304601F0E9FA02990523072274 +:10A28000C8806F700420287000250E20CDE90005DD +:10A2900021464046FFF7DDFE294666F30F2168F3AD +:10A2A0001F41F0230022072009F042FF6078FD499A +:10A2B000801C607062682046921CFFF794FE606804 +:10A2C00080784028B6D10120BDE8FE83FEB50D465A +:10A2D000064638E002AB0E2207213046FFF7F9FEB2 +:10A2E000002835D068681C23C17801EB810203EB9C +:10A2F000C2028418029815220270627842700A2203 +:10A300004280A2894281A2888281084601F09EFA99 +:10A31000014602988180618AC180E18A0181A0881A +:10A32000B8B10020207000210E20CDE900010523E6 +:10A33000072229463046FFF78CFE6A68DA4928462C +:10A34000D21CFFF750FE6868C0784028C2D10120B7 +:10A35000FEBD0620E6E72DE9FE430C46814644E0BB +:10A36000204601F08EFAD0B302AB082207214846FE +:10A37000FFF7AFFE0028A7D060681C226578067939 +:10A38000AD1C06EB860102EBC10147180298B7F835 +:10A39000108006210170457004214180304601F093 +:10A3A00055FA0146029805230722C180A0F80480CF +:10A3B0007D70082038700025CDE90005214648460B +:10A3C000FFF747FE294666F30F2169F31F41F0238B +:10A3D0000022072009F0ACFE6078801C6070626883 +:10A3E000B2492046121DFFF7FEFD60680179402941 +:10A3F000B6D1012068E72DE9F34F83B00E4680E027 +:10A40000304601F03EFA002875D071681C2091F8A2 +:10A41000068008EB880200EBC2000C18414630466B +:10A4200001F023FA0146A078C30070684078C200AA +:10A4300004F1240006F095F907468088E18B401A64 +:10A4400080B2002581B3AA46218B814200D80846FC +:10A450008146024602AB07210398FFF73AFE01004E +:10A4600028D0BAF1000F03D0029AB88802251080D4 +:10A470008B46E28B3968A9EB05001FFA80FA0A4483 +:10A480000398009206F0D8FBED1D009A59465346FA +:10A49000009505F0E6FFE08B504480B2E083B98878 +:10A4A000884209D1012508E0FFE7801C4FF0010A2E +:10A4B00080B2C9E7002009E60025CDE90095238A8E +:10A4C000072231460398FFF7C4FDE089401EE08172 +:10A4D0008DB1A078401CA0707068F178427811FBB3 +:10A4E00002F1CAB2816901230E3006F0E8F880F863 +:10A4F00000800020E08372686D493046921DFFF7AE +:10A5000072FD7068817940297FF47AAF0120DDE522 +:10A5100070B5064648680D4614468179402910D129 +:10A5200004EB84011C2202EBC101084401F0E0F9B4 +:10A53000002806D06868294684713046BDE870401E +:10A5400059E770BDFEB50C460746002645E020469B +:10A5500001F097F9D8B360681C22417901EB8101C1 +:10A5600002EBC1014518688900B9FFDF02AB082280 +:10A5700007213846FFF7ADFD002833D002996078F7 +:10A5800016220A70801C4870042048806068407958 +:10A5900001F05CF901460298052307228180698950 +:10A5A000C1800820CDE9000621463846FFF751FD5D +:10A5B0006078801C6070A88969890844B0F5803F84 +:10A5C00000D3FFDFA88969890844A8816E81626889 +:10A5D00038492046521DFFF706FD60684179402941 +:10A5E000B5D10120FEBD30B5438C458BC3F3C70404 +:10A5F000002345B1838B641EED1AC38A6D1E1D4472 +:10A6000095FBF3F3E4B22CB1008918B1A04200D855 +:10A61000204603444FF6FF70834200D30346138065 +:10A620000C7030BD2DE9FC41074616460D464868C2 +:10A6300002EB86011C2202EBC10144186A4601A903 +:10A640002046FFF7D0FFA089618901448AB2BDF896 +:10A650000010914212D0081A00D50020608168686D +:10A66000407940280AD1204601F038F9002805D069 +:10A670006868294646713846FFF764FFBDE8FC81EB +:10A680002DE9FE4F8946804615465088032106F085 +:10A690008FF98346B8F8020040280DD240200CE024 +:10A6A00030000020BD9F0000CB9F0000D99F00001C +:10A6B000F1B80000DDB80000403880B282460146A3 +:10A6C000584601F0DEF800287ED00AEB8A001C22F2 +:10A6D000DBF8041002EBC0000C18204601F0E7F88C +:10A6E000002877D1B8F80000E18A88423CD8A189D7 +:10A6F000D1B348456ED100265146584601F0AEF818 +:10A70000218C0F18608B48B9B9F1020F62D3B8F8E9 +:10A7100004006083618A884226D80226A9EB0600DD +:10A720001FFA80F9B888A28B801A002814DD4946E8 +:10A73000814500DA084683B2688869680291396801 +:10A740000A44CDE9003206F065FADDE90121F61D83 +:10A75000009B009605F051FEA18B01EB090080B231 +:10A76000A083618B884207D9688803B05246594656 +:10A77000BDE8F04F01F0D9B81FD14FF009002872A1 +:10A78000B8F802006881D7E90001C5E90401608BCF +:10A79000A881284601F050F85146584601F05EF86D +:10A7A0000146DBF8040008230078C20004F1200011 +:10A7B00005F0BBFF0020A0836083A0890AF0FF02A0 +:10A7C000401EA081688800E004E003B05946BDE85F +:10A7D000F04F27E7BDE8FE8F2DE9F041064615460C +:10A7E0000F461C46184609F099FD18B9206809F073 +:10A7F000BBFD08B1102015E47168688C0978B0EBD6 +:10A80000C10F01D313200DE43946304601F026F87C +:10A810000146706808230078C20005F1200005F0A9 +:10A820004EFFD4E90012C0E900120020E3E710B5A2 +:10A830000446032106F0BCF80146007800F003004E +:10A84000022805D02046BDE8104001F114029AE428 +:10A850008A8A2046BDE81040C8E470B5044603214A +:10A8600006F0A6F8054601462046FFF774FD0028CD +:10A8700016D029462046FFF765FE002810D029464D +:10A880002046FFF723FD00280AD029462046FFF77F +:10A89000CCFC002804D029462046BDE87040AAE53B +:10A8A00070BD2DE9F0410C4680461EE0E17842780B +:10A8B00011FB02F1CAB2816901230E3005F035FFA8 +:10A8C000077860681C22C179491EC17107EB8701B6 +:10A8D000606802EBC10146183946204600F0D1FFFE +:10A8E00018B1304600F0DCFF20B16068C179002962 +:10A8F000DCD180E7FEF78EFD050000D1FFDF0A20E6 +:10A900002872384600F0A2FF68813946204600F0E0 +:10A91000ACFF0146606808234078C20006F12400BD +:10A9200005F003FFD0E90010C5E90310A5F8028087 +:10A93000284600F081FFB07800B9FFDFB078401EF4 +:10A94000B07058E770B50C460546032106F030F8A4 +:10A9500001464068C2792244C2712846BDE8704071 +:10A960009FE72DE9FE4F8246507814460F464FF080 +:10A97000000800284FD0012807D0022822D0FFDF8E +:10A980002068B8606068F86024E702AB0E220821F6 +:10A990005046FFF79EFB0028F2D0029815210523B0 +:10A9A0000170217841700A214180C0F80480C0F80C +:10A9B0000880A0F80C80628882810E20CDE9000812 +:10A9C000082221E0A678304600F040FF054606EB5D +:10A9D00086012C22786802EBC1010822465A02AB9C +:10A9E00011465046FFF775FB0028C9D00298072191 +:10A9F0000170217841700421418008218580C68042 +:10AA0000CDE9001805230A4639465046FFF721FBD9 +:10AA100087F80880DEE6A678022516B1022E13D04C +:10AA2000FFDF2A1D914602AB08215046FFF751FB7C +:10AA30000028A5D002980121022E017021784170D2 +:10AA40004580868002D005E00625EAE7A188C1801E +:10AA5000E1880181CDE90098052308223946504656 +:10AA6000D4E710B50446032105F0A2FF014600F12A +:10AA700008022046BDE8104073E72DE9F05F0C4660 +:10AA800001281DD0957992F80480567905EB85014F +:10AA90001F2202EBC10121F0030B08EB060111FBA1 +:10AAA00005F14FF6FF7202EAC10909F1030115FB36 +:10AAB0000611F94F21F0031A40B101283DD124E0DD +:10AAC0006168E57891F800804E78DFE7594678684C +:10AAD00005F0A9FD606000B9FFDF5946606819F014 +:10AAE00008FCE5705146786805F09DFD6168486195 +:10AAF00000B9FFDF6068426902EB090181616068AB +:10AB000080F800806068467017E0606852464169CE +:10AB1000786805F0B3FD5A466168786805F0AEFDC7 +:10AB2000032005F0EDFE0446032005F0F1FE201A97 +:10AB3000012802D1786805F06BFD0BEB0A00BDE837 +:10AB4000F09F02460021022097E773B5D24D0A20FC +:10AB50002870009848B100244FEA0D0005F045FD2B +:10AB6000002C01D1009969607CBD01240020F5E72B +:10AB700070B50C4615463821204619F0BAFB01265F +:10AB800066700A2104F11C0019F0B3FB05B9FFDF60 +:10AB9000297A207861F301002070A879002817D065 +:10ABA0002A4621460020FFF768FF61684020887030 +:10ABB0006168C8706168087161684871616888710E +:10ABC0006168288808816168688848816068868132 +:10ABD00070BDC878002802D0002201204DE77047E0 +:10ABE00070B50546002165F31F41002009F04AFBBE +:10ABF0000321284605F0DCFE040000D1FFDF2146DA +:10AC00002846FFF769F9002804D0207840F01000AA +:10AC10002070012070BD2DE9FF4180460E460F0CCB +:10AC2000FEF7F8FB050007D06F800321384605F0DA +:10AC3000BFFE040008D106E004B03846BDE8F0418C +:10AC40001321F9F7FBBEFFDF5FEA080005D0B8F17A +:10AC5000070F18D0FFDFBDE8FF8120782A4620F0DB +:10AC6000080020700020ADF8020002208DF80000DE +:10AC70004FF6FF70ADF80400ADF80600694638469F +:10AC8000F9F7EFFAE7E7C6F3072101EB81021C238E +:10AC9000606803EBC202805C042803D008280AD055 +:10ACA000FFDFD8E7012000904FF440432A462046BA +:10ACB00000F004FECFE704B02A462046BDE8F0418C +:10ACC000FFF7E9B82DE9F05F0027B0F80A90904649 +:10ACD0000C4605463E46B9F1400F01D2402001E046 +:10ACE000A9F140001FFA80FA287AC01E08286BD20A +:10ACF000DFE800F00D04192058363C477227102673 +:10AD0000002C6CD0D5E90301C4E902015CE0702796 +:10AD10001226002C63D00A2205F10C0104F1080070 +:10AD200019F08BFA50E071270C26002C57D0E868F8 +:10AD3000A06049E0742710269CB3D5E90301C4E95B +:10AD400002016888032105F033FE8346FEF762FBAB +:10AD500002466888508051465846FFF753F833E062 +:10AD600075270A26ECB1A88920812DE076271426C4 +:10AD7000BCB105F10C0004F1080307C883E8070023 +:10AD800022E07727102664B1D5E90301C4E9020166 +:10AD90006888032105F00CFE01466888FFF781FDF5 +:10ADA00012E01CE073270826CCB16888032105F067 +:10ADB000FFFD01460078C00606D56888FFF78CF8CD +:10ADC00010B96888F8F71DFEA8F800602CB127803C +:10ADD000A4F8069066806888A0800020AFE6A8F8F6 +:10ADE0000060FAE72DE9FC410C461E4617468046F6 +:10ADF000032105F0DDFD05460A2C0AD2DFE804F048 +:10AE000005050505050509090907042303E00623CF +:10AE100001E0FFDF0023CDE90076224629464046C7 +:10AE2000FFF717F92AE438B50546A0F57F40FF384B +:10AE300030D0284605F0EEFE040000D1FFDF2046AA +:10AE400005F073FA002815D001466A46204605F041 +:10AE50008EFA00980321B0F80540284605F0A8FDB9 +:10AE60000546052C03D0402C05D2402404E0007A8E +:10AE700080B1002038BD403CA4B2214600F001FD65 +:10AE800040B1686804EB84013E2202EBC101405AE4 +:10AE90000028EFD0012038BD300000202DE9F04F10 +:10AEA000044689B0408805F0B5FE050000D1FFDFFB +:10AEB00006AA2846616800F0BDFC069D001F81B20D +:10AEC00035F8032F6B888A4205D1042B0AD0052B55 +:10AED0001DD0062B15D022462846FFF7D1FB09B01E +:10AEE000BDE8F08F16462D1D224629463046F7F75D +:10AEF00054FA0828F3D1224629463046FCF749FC8B +:10AF0000EDE76088291D6368FAF7C8FCE7E7174694 +:10AF10006088032105F04CFD4FF000088DF8048097 +:10AF20000646ADF80680042FD9D36A79002AD6D018 +:10AF300028794FF6FF794FF01C0A13282CD008DC33 +:10AF4000012878D0062847D0072875D0122874D158 +:10AF500006E0142872D0152871D016286DD1ACE106 +:10AF60000C2F6AD1307800F00301022965D140F03E +:10AF7000080030706879B07001208DF804002889CD +:10AF8000ADF808006889ADF80A00A889ADF80C0092 +:10AF9000E889ADF80E0019E0B07890429FD1307882 +:10AFA00001079CD5062F9AD120F0080030706088E8 +:10AFB000414660F31F41002009F064F902208DF83A +:10AFC0000400ADF808902889ADF80A006088224690 +:10AFD00001A9F9F746F982E7082F80D12F89B5F842 +:10AFE0000A90402F01D2402001E0A7F1400080B23A +:10AFF00080460146304600F044FC08B3716808EB17 +:10B0000088002C2202EBC000095A4945E3D1FE48D2 +:10B0100007AAD0E90210CDE9071068798DF81C0065 +:10B0200008F0FF058DF81E5060883146FFF799FC47 +:10B030002246294639E0B6E014E03CE039E0E6E09B +:10B04000F148D0E90010CDE907106879ADF820701B +:10B050008DF81C00ADF82290608807AA3146FFF7F2 +:10B0600080FC3CE7082FB6D16889B5F808804028F5 +:10B0700001D2402000E0403887B23946304600F027 +:10B0800000FC0028A7D007EB870271680AEBC2001A +:10B090000844028A42459ED1017808299BD1407814 +:10B0A0006979884297D1F9B222463046FEF7F3FE1D +:10B0B00015E70E2F07D0CDF81C80CDF820806879D9 +:10B0C0008DF81C00C8E76989EF898B46B5F80C90AC +:10B0D0003046FEF742FFABF14001402901D3092081 +:10B0E0004AE0B9F1170F01D3172F01D20B2043E02B +:10B0F00040280ED000EB800271680AEBC2000844C1 +:10B100000178012903D1407869798842A9D00A20C1 +:10B1100032E03046FEF703FF014640282BD001EB1A +:10B12000810372680AEBC30002EB0008012288F871 +:10B1300000206A7988F8012070682A894089B8421D +:10B1400000D938462D8A03232372A282E781208208 +:10B15000A4F80C906582084600F078FB6081A8F89E +:10B160001490A8F81870A8F80E50A8F810B020464F +:10B1700000F062FBB3E6042005212172A4F80A80E6 +:10B18000E08101212173A049D1E90421CDE9072102 +:10B1900069798DF81C10ADF81E00608807AA314649 +:10B1A000FFF7DFFBE3E7062FE4D3B078904215D139 +:10B1B0003078010712D520F00800307060884146D1 +:10B1C00060F31F41002009F05DF802208DF80400B3 +:10B1D0002889ADF80800ADF80A90F7E6042130465A +:10B1E000FEF7D3FE05464028C4D00220830300901A +:10B1F00022462946304600F061FB4146608865F3EF +:10B200000F2160F31F41072009F03CF867E60E2F7D +:10B21000B0D104213046FEF7B8FE81464028A9D0BF +:10B220004146608869F30F2160F31F41072009F050 +:10B2300029F8288A0790E88900907068AF894089CA +:10B24000B84200D938468346B5F80A802889059067 +:10B25000484600F0FBFA6081079840B10220079B46 +:10B26000009022464946304600F028FB37E6B8F108 +:10B27000170F1ED3172F1CD3042020720098608252 +:10B28000E781A4F810B0A4F80C8009EB890271687A +:10B290000AEBC2000D1800990598A5F81480A5F8CE +:10B2A00018B0E9812882204600F0C6FA06202870EE +:10B2B00015E601200B230090D3E7082FA6D129899A +:10B2C0003046FEF74AFE074640289FD007EB87022C +:10B2D00071680AEBC2000844804600F0E8FA0028D2 +:10B2E00094D16D89B8F80E002844B0F5803F05D39D +:10B2F00060883A46314600F018FBF0E5002D85D015 +:10B30000A8F80E0060883A463146FFF701F9082098 +:10B310002072384600F09AFA6081A58127E770B55F +:10B320000D460646032105F043FB040004D02078B7 +:10B33000000704D5112070BD43F2020070BD2A46FB +:10B3400021463046FEF71FFF18B92868606168681B +:10B35000A061207840F008002070002070BD70B51A +:10B360000D460646032105F023FB040004D0207897 +:10B37000000704D4082070BD43F2020070BD2A46C5 +:10B3800021463046FEF732FF00B9A582207820F032 +:10B3900008002070002070BD2DE9F04F0E4691B0DE +:10B3A0008046032105F004FB0446404605F044FCBA +:10B3B00007460020079008900990ADF830000A90E9 +:10B3C00002900390049004B9FFDF0DF1080917BB48 +:10B3D000FFDF20E038460BA9002204F069FE9DF84B +:10B3E0002C0000F07F050A2D00D3FFDF6019017FDC +:10B3F000491E01779DF82C0000060CD52A460CA9A1 +:10B4000007A8FEF716FE01E0D846020019F805105D +:10B41000491C09F80510761EF6B2DBD204F134009F +:10B42000FA4D04F1260BDFF8E8A304F12A07069091 +:10B4300010E05846069900F06AFA064628700A2875 +:10B4400000D3FFDF5AF8261040468847E08CC05DE5 +:10B45000B04202D0208D0028EBD10A202870EC4D9C +:10B460004E4628350EE00CA907A800F050FA044615 +:10B47000375D55F8240000B9FFDF55F82420394620 +:10B4800040469047BDF81E000028ECD111B027E5DA +:10B4900010B5032105F08CFA040000D1FFDF0A216A +:10B4A00004F11C0018F025FF207840F00400207003 +:10B4B00010BD10B50C46032105F07AFA2044007F38 +:10B4C000002800D0012010BD2DE9F84F894615460F +:10B4D0008246032105F06CFA070004D0284608F0E4 +:10B4E0001DFF40B903E043F20200BDE8F88F484673 +:10B4F00008F03AFF08B11020F7E7786828B16988AA +:10B500000089814201D90920EFE7B9F800001C2425 +:10B5100018B1402809D2402008E03846FEF7FFFC69 +:10B520008046402819D11320DFE7403880B280469A +:10B530000146384600F0A5F948B108EB8800796863 +:10B5400004EBC000085C012803D00820CDE70520EB +:10B55000CBE7FDF75FFF06000BD008EB88007968AA +:10B5600004EBC0000C18B9F8000020B1E88910B154 +:10B5700013E01120B9E72888172802D36888172814 +:10B5800001D20720B1E7686838B12B1D2246414639 +:10B590003846FFF721F90028A7D104F10C026946CB +:10B5A0002046FFF720F8288860826888E082B9F892 +:10B5B000000030B102202070E889A080E889A0B1A5 +:10B5C0002BE003202070A889A0807868817840292A +:10B5D00005D180F8028039465046FEF726FE4046E7 +:10B5E00000F034F9A9F8000021E07868218B408947 +:10B5F000884200D908462083A6F802A004203072B1 +:10B60000B9F800007081E0897082F181208B30826E +:10B61000A08AB081304600F00FF97868C1784029DF +:10B6200005D180F8038039465046FEF74FFE0020D2 +:10B630005BE770B50D460646032105F0B9F9040035 +:10B6400003D0402D04D2402503E043F2020070BD38 +:10B65000403DADB2294600F014F958B105EB850123 +:10B660001C22606802EBC101084400F020F918B107 +:10B67000082070BD052070BD2A462146304600F0E6 +:10B6800054F9002070BD2DE9F0410D461646804664 +:10B69000032105F08DF90446402D01D2402500E03C +:10B6A000403DADB28CB1294600F0EBF880B105EB1E +:10B6B00085011C22606802EBC1014718384600F082 +:10B6C000F6F838B10820BDE8F08143F20200FAE74D +:10B6D0000520F8E733463A4629462046FFF77CF82E +:10B6E0000028F0D1EAB221464046FEF79BFF002039 +:10B6F000E9E72DE9F0410D4616468046032105F0A5 +:10B7000057F90446402D01D2402500E0403DAFB23C +:10B7100024B1304608F002FE38B902E043F20200DC +:10B72000D1E7306808F0FAFD08B11020CBE73946C0 +:10B73000204600F0A6F860B107EB87011C22606884 +:10B7400002EBC1014518284600F0B1F818B10820F5 +:10B75000B9E70520B7E7B088A98A884201D90C204B +:10B76000B1E76168E88C4978B0EBC10F01D31320D1 +:10B77000A9E73946204600F078F8014660680823BA +:10B780004078C20005F1240004F099FFD6E90012C8 +:10B79000C0E90012FAB221464046FEF7B9FE002089 +:10B7A00091E72DE9F0470D461F469046814603215B +:10B7B00005F0FEF80446402D01D2402001E0A5F13D +:10B7C000400086B23CB14DB1384608F0EBFD50B1B7 +:10B7D0001020BDE8F08743F20200FAE76068C8B1C4 +:10B7E000A0F80C8024E03146204600F04AF888B1E9 +:10B7F00006EB86011C22606802EBC1014518284651 +:10B8000000F055F840B10820E3E7000030000020C8 +:10B81000F04602000520DCE7A5F80880F2B22146D8 +:10B820004846FEF7FFFE1FB1A889698908443880A1 +:10B830000020CEE704F09BBD017821F00F01491CE8 +:10B8400021F0F00110310170FDF7E7BD10B504469D +:10B85000402800D9FFDF4034A0B210BD40684269E3 +:10B860000078484302EBC0007047C2784068037814 +:10B8700012FB03F24378406901FB032100EBC10096 +:10B880007047C2788A4209D9406801EB81011C22C5 +:10B8900002EBC101405C08B10120704700207047F5 +:10B8A0000078062801D901207047002070470078F1 +:10B8B000062801D00120704700207047F0B401EB4A +:10B8C00081061C27446807EBC6063444049D052600 +:10B8D0002670E3802571F0BCFEF794BA10B541895B +:10B8E00011B1FFF7DDFF08B1002010BD012010BD30 +:10B8F00010B5C18C8278B1EBC20F04D9C18911B1E6 +:10B90000FFF7CEFF08B1002010BD012010BD10B51B +:10B910000C4601230A22011D04F007FF007821884C +:10B92000012282409143218010BDF0B402EB8205D8 +:10B930001C264C6806EBC505072363554B681C792C +:10B94000402C03D11A71F0BCFEF705BDF0BC704766 +:10B9500010B5EFF3108000F0010472B6EE484178A4 +:10B96000491C41704078012801D1F7F70DFB002CEC +:10B9700000D162B610BD70B5E74CE07848B901253A +:10B98000E570FFF7E5FFF7F707FB20B1002008F0AF +:10B990000AF9002070BD4FF080406571C0F8045373 +:10B9A000F7E770B5EFF3108000F0010572B6DA4CDE +:10B9B000607800B9FFDF6078401E6070607808B979 +:10B9C000F7F7E6FA002D00D162B670BDD24810B587 +:10B9D000C17821B100214171C170FFF7E2FF002061 +:10B9E00010BD10B50446F7F7D7FACB49C97808401F +:10B9F00000D001202060002010BD2DE9F05FDFF8AD +:10BA000018934278817889F80620002589F8071074 +:10BA1000064689F8085000782F4620B101280FD03B +:10BA200002280FD0FFDFF7F7C4FA98B1F7F7C8FA8A +:10BA3000A8420FD12846F7F7C7FA0028FAD047E006 +:10BA40000125F0E7FFF784FFF7F7A6FA0028FBD0FF +:10BA50000225E8E701208407E060C4F80471AF49DB +:10BA60000D600107D1F84412AC4AC1F342312432CF +:10BA70001160AA49343108604FF0020BC4F804B3D6 +:10BA8000A060DFF89CA2DAF80010C94341F300116E +:10BA900001F10108DAF8001041F01001CAF80010B5 +:10BAA00000E020BFD4F804010028FAD02846F7F7B8 +:10BAB0008BFA0028FAD0B8F1000F05D1DAF800109F +:10BAC00021F01001CAF80010C4F808B3C4F80471DA +:10BAD00099F807004C4670B1307860B9F7F75CFA16 +:10BAE000064608F0BDF96FF0004116B1C4E9031035 +:10BAF00001E0C4E9030115B12771BDE8F09F012001 +:10BB00002071BDE8F05F00F0ABB870B5050000D162 +:10BB1000FFDF4FF080424FF0FF30C2F808030021F2 +:10BB2000C2F80011C2F80411C2F80C11C2F81011C9 +:10BB3000794C6170F7F736FA10B10120E07060704F +:10BB40002846BDE8704058E72DE9F05F7548D0F809 +:10BB500000B0744A7449083211608406D4F80801B0 +:10BB600008B1012600E00026D4F8000110B14FF022 +:10BB7000010801E04FF00008D4F8040108B10127E2 +:10BB800000E00027D4F80C0100B101208246D4F86F +:10BB9000100108B1012100E00021894646EA0801B0 +:10BBA00027EA010020EA0A0030EA090000D0FFDF9E +:10BBB000002526B1C4F80851012007F0F4FF564EC5 +:10BBC000B8F1000F10D0C4F80051707918B1757138 +:10BBD000002007F0E8FF307830B10120534935707C +:10BBE000B07002220A6020610FB1C4F80451BAF1AA +:10BBF000000F0BD0C4F80C51B07800B9FFDF4B48F0 +:10BC00000560B57001206061FFF7CBFEB9F1000F50 +:10BC100005D0C4F81051307908B100F045F8414919 +:10BC2000091DC1F800B068E770B53B4DE87808B968 +:10BC3000F7F7AEF901208407A061A87858B100BFDA +:10BC4000D4F80C0120B90020F7F7BEF90028F7D18D +:10BC50000020C4F80C014FF0FF30C4F8080370BD99 +:10BC60002DE9F0411926B407C4F808630125A56140 +:10BC70000020C4F80001C4F80C01C4F81001F7F763 +:10BC80008BF9254F28B12949BD7002200860256134 +:10BC900000E03D70FFF75CFE2049B8792031086074 +:10BCA000C4F80463BDE8F0812DE9F0411A4C4FF06F +:10BCB00080470125E079F0B1012803D0217A401EA8 +:10BCC000814218DAF7F768F9064608F0C9F8E17911 +:10BCD000012902D9217A491C21720EB1216900E0A3 +:10BCE000E168411A022902DA11F1020F0EDC0EB1ED +:10BCF000206100E0E060FFF72BFEF7F74DF938B167 +:10BD00000A49022008603D61A57002E07D61C9E733 +:10BD1000257000202072C5E73C0000201805004077 +:10BD200010ED00E01005024001000001340C00405D +:10BD30004FF0E0214FF00070C1F88001C1F880029F +:10BD4000384B802283F80024C1F80001704700B509 +:10BD500002460420344903E001EBC0031B792BB1F8 +:10BD6000401EC0B2F8D2FFDFFF2000BD41F83020F6 +:10BD700001EBC00100224A718A7101220A7100BDE3 +:10BD8000294A002102EBC0000171704710B504463A +:10BD9000042800D3FFDF244800EBC40420790128E5 +:10BDA00000D0FFDF6079A179401CC0B2814200D091 +:10BDB00060714FF0E0214FF00070C1F8000210BD3B +:10BDC0002DE9F041194805681849194808310860FB +:10BDD0001448042690F80004134F4009154C042819 +:10BDE00018D0FFDF16E0217807EBC1000279012AA5 +:10BDF00008D1427983799A4204D04279827157F806 +:10BE0000310080472078401CC0B22070042801D344 +:10BE100000202070761EF6B2E5D20448001D0560B1 +:10BE2000BDE8F08119E000E0C805002010050240DF +:10BE30000100000150000020F8B51D46DDE906476D +:10BE40000E000AD004F0F8FE2346FF1DBCB23146B6 +:10BE50002A46009404F005FBF8BDD0192246194685 +:10BE600018F0A6F92046F8BD70B50D46044610211D +:10BE700018F01DFA258117206081A07B40F00A0090 +:10BE8000A07370BD4FF6FF720A800146022008F0D1 +:10BE9000F9B9704700897047827BD30701D19207B7 +:10BEA00003D4808908800020704705207047827B7A +:10BEB000920700D58181704701460020098841F62C +:10BEC000FE52114200D00120704700B50346807B2E +:10BED000C00701D0052000BD59811846FFF7ECFFCF +:10BEE000C00703D0987B40F004009873987B40F023 +:10BEF00001009873002000BD827B520700D509B174 +:10BF00004089704717207047827B61F3C3028273B8 +:10BF100070472DE9FC5F0E460446017896460120E5 +:10BF200000FA01F14DF6FF5201EA020962684FF68C +:10BF3000FF7B1188594502D10920BDE8FC9FB9F16A +:10BF4000000F05D041F6FE55294201D00120F4E74B +:10BF500041EA090111801D0014D04FF0000C85F852 +:10BF600000C023780521032267464FF0020A0E2BFA +:10BF700074D2DFE803F0F809252F4762697447900F +:10BF800092B3D0D70420D8E7616820898B7B9B07C8 +:10BF90007DD5172848D30B89834245D38989172932 +:10BFA00001D3814240D185F800A0A5F8010032807C +:10BFB000616888816068817B21F002018173C5E03E +:10BFC000042028702089A5F801006089A5F80300E5 +:10BFD0003180BBE0208A3188C01D1FFA80F84145BE +:10BFE00022D3062028702089A5F801006089A5F8D1 +:10BFF0000300A089A5F805000721208ACDE90001EA +:10C0000063693EE0082B10D0082028702089A5F82D +:10C0100001006089A5F8030031806A1D694604F1BA +:10C020000C0006F066FA10B15FE01020EDE73088F2 +:10C030009DF800100844308088E00A20287020898C +:10C04000A5F80100328045E00C2028702089A5F871 +:10C0500001006089A5F8030031803BE083E021897D +:10C06000338800EB41021FFA82F843453DD3B8F113 +:10C07000050F3AD30E222A700BEA4101CDE90010D8 +:10C08000E36860882A467146FFF7D6FE00E04DE07F +:10C09000A6F800805AE04020287060893188C01CD2 +:10C0A0001FFA80F8414520D32878714620F03F00E0 +:10C0B000123028702089A5F801006089CDE90002BE +:10C0C00060882A46E368FFF7B7FEA6F80080287864 +:10C0D00040063BD461682089888037E0A089328897 +:10C0E000401D1FFA80F8424501D204273EE0162089 +:10C0F00028702089A5F801006089A5F80300A089AF +:10C10000CDE9000160882A4671462369FFF794FE55 +:10C11000A6F80080DEE718202870207A6870A6F85C +:10C1200000A013E061680A88920401D405271DE08D +:10C13000C9882289914201D0062717E01E21297063 +:10C1400030806068018821F400510180B9F1000F4E +:10C150000CD0618878230022022007F0E9FF616893 +:10C160002078887007E0A6F800C00327606801887F +:10C1700021EA090101803846DFE62DE9FF4F85B04D +:10C180001746129C0D001E461CD03078C10703D004 +:10C1900000F03F00192801D9012100E000212046CC +:10C1A000FFF7AAFEA8420DD32088A0F57F41FF39F2 +:10C1B00008D03078410601D4000605D5082009B022 +:10C1C000BDE8F08F0720FAE700208DF800008DF819 +:10C1D000010030786B1E00F03F0C0121A81E4FF0CB +:10C1E000050A4FF002094FF0030B9AB2BCF1200F81 +:10C1F00075D2DFE80CF08B10745E7468748C749CDC +:10C2000074B674BB74C974D574E2747474F274F047 +:10C2100074EF74EE748B052D78D18DF80090A078B2 +:10C220008DF804007088ADF8060030798DF80100B3 +:10C23000707800F03F000C2829D00ADCA0F1020041 +:10C24000092863D2DFE800F0126215621A621D62EB +:10C250002000122824D004DC0E281BD01028DBD1AB +:10C260001BE016281FD01828D6D11FE020788007A1 +:10C2700001E020784007002848DAEFE02078000746 +:10C28000F9E72078C006F6E720788006F3E7207803 +:10C290004006F0E720780006EDE72088C005EAE7D1 +:10C2A00020884005E7E720880005E4E72088C004EF +:10C2B000E1E72078800729D5032D27D18DF800B03C +:10C2C000B6F8010082E0217849071FD5062D1DD35D +:10C2D00081B27078012803D0022817D102E0CAE0A9 +:10C2E000022000E0102004228DF8002072788DF8E2 +:10C2F0000420801CB1FBF0F2ADF8062092B242435C +:10C300008A4203D10397ADF80890A7E07AE020783D +:10C31000000777D598B282088DF800A0ADF8042008 +:10C32000B0EB820F6ED10297ADF8061096E021783F +:10C33000C90667D5022D65D381B206208DF80000AD +:10C34000707802285ED300BFB1FBF0F28DF80400D4 +:10C35000ADF8062092B242438A4253D1ADF808901C +:10C360007BE0207880064DD5072003E0207840064A +:10C370007FD508208DF80000A088ADF80400ADF846 +:10C380000620ADF8081068E02078000671D5092075 +:10C39000ADF804208DF80000ADF8061002975DE0BE +:10C3A0002188C90565D5022D63D381B20A208DF895 +:10C3B0000000707804285CD3C6E72088400558D573 +:10C3C000012D56D10B208DF80000A088ADF8040097 +:10C3D00044E021E026E016E0FFE72088000548D58C +:10C3E000052D46D30C208DF80000A088ADF8040080 +:10C3F000B6F803006D1FADF80850ADF80600ADF8B3 +:10C400000AA02AE035E02088C00432D5012D30D1C1 +:10C410000D208DF8000021E02088800429D4B6F892 +:10C420000100E080A07B000723D5032D21D33078C5 +:10C4300000F03F001B2818D00F208DF80000208846 +:10C4400040F40050A4F80000B6F80100ADF8040074 +:10C45000ED1EADF80650ADF808B003976946059893 +:10C46000F5F7E6FC050008D016E00E208DF8000078 +:10C47000EAE7072510E008250EE0307800F03F00DD +:10C480001B2809D01D2807D00220059907F0FAFEC5 +:10C49000208800F400502080A07B400708D520466B +:10C4A000FFF70AFDC00703D1A07B20F00400A073B2 +:10C4B000284684E61FB5022806D101208DF8000029 +:10C4C00088B26946F5F7B4FC1FBD0000F8B51D46FB +:10C4D000DDE906470E000AD004F0AEFB2346FF1D3F +:10C4E000BCB231462A46009403F0BBFFF8BDD01918 +:10C4F0002246194617F05CFE2046F8BD2DE9FF4F95 +:10C500008DB09B46DDE91B57DDF87CA00C46082B5F +:10C5100005D0E06901F002F950B11020D2E028887E +:10C52000092140F0100028808AF80010022617E048 +:10C53000E16901208871E2694FF420519180E1693D +:10C540008872E06942F601010181E069002181738E +:10C550002888112140F0200028808AF80010042645 +:10C5600038780A900A2038704FF0020904F1180058 +:10C570004D460C9001F095FBB04681E0BBF1100FE9 +:10C580000ED1022D0CD0A9EB0800801C80B2022134 +:10C59000CDE9001005AB52461E990D98FFF796FFA6 +:10C5A000BDF816101A98814203D9F74800790F9008 +:10C5B00004E003D10A9808B138702FE04FF002016F +:10C5C000CDE900190DF1160352461E990D98FFF79B +:10C5D0007DFF1D980088401B801B83B2C6F1FF00C1 +:10C5E000984200D203461E990BA8D9B15FF0000211 +:10C5F000DDF878C0CDE9032009EB060189B2CDE969 +:10C6000001C10F980090BDF8161000220D9801F09E +:10C61000CBFB387070B1C0B2832807D0BDF81600CC +:10C6200020833AE00AEB09018A19E1E7022011B000 +:10C63000BDE8F08FBDF82C00811901F0FF08022D34 +:10C640000DD09AF80120424506D1BDF82010814254 +:10C6500007D0B8F1FF0F04D09AF801801FE08AF8E4 +:10C660000180C94800680178052902D1BDF816107B +:10C67000818009EB08001FFA80F905EB080085B2FC +:10C68000DDE90C1005AB0F9A01F00EFB28B91D98DF +:10C690000088411B4145BFF671AF022D13D0BBF19D +:10C6A000100F0CD1A9EB0800801C81B20220CDE94B +:10C6B000000105AB52461E990D98FFF707FF1D9824 +:10C6C0000580002038700020B1E72DE9F8439C4632 +:10C6D000089E13460027B26B9AB3491F8CB2F18FA4 +:10C6E000A1F57F45FF3D05D05518AD882944891D2A +:10C6F0008DB200E000252919B6F83C80083141458B +:10C7000020D82A44BCF8011022F8021BBCF8031000 +:10C7100022F8021B984622F8024B914604F07AFA5E +:10C720004FF00C0C41464A462346CDF800C003F0BA +:10C7300064FEF587B16B00202944A41D21440880C4 +:10C7400003E001E0092700E083273846BDE8F883CD +:10C7500010B50B88848F9C420CD9846BE018048838 +:10C7600044B1848824F40044A41D23440B80106049 +:10C77000002010BD0A2010BD2DE9F0478AB0002529 +:10C78000904689468246ADF8185007274BE0059839 +:10C7900006888088000446D4A8F8006007A80195A0 +:10C7A00000970295CDE903504FF400730022314603 +:10C7B000504601F0F9FA04003CD1BDF81800ADF87C +:10C7C0002000059804888188B44216D10A0414D444 +:10C7D00001950295039521F400410097049541F4D9 +:10C7E000804342882146504601F0B4F804000BD142 +:10C7F0000598818841F40041818005AA08A948462E +:10C80000FFF7A6FF0400DCD000970598029501957C +:10C81000039504950188BDF81C300022504601F0B4 +:10C8200099F80A2C06D105AA06A94846FFF790FFF9 +:10C830000400ACD0ADF8185004E00598818821F4CC +:10C840000041818005AA06A94846FFF781FF00281C +:10C85000F3D00A2C03D020460AB0BDE8F0870020B0 +:10C86000FAE710B50C46896B86B051B10C218DF8F2 +:10C870000010A18FADF80810A16B01916946FAF77D +:10C8800064FC00204FF6FF71A063E187A08706B02B +:10C8900010BD2DE9F0410D460746896B0020069E2C +:10C8A0001446002911D0012B0FD1324629463846B3 +:10C8B000FFF762FF002808D1002C06D03246294637 +:10C8C0003846BDE8F04100F038BFBDE8F0812DE901 +:10C8D000FC411446DDE9087C0E46DDE90A15521DCF +:10C8E000BCF800E092B2964502D20720BDE8FC8178 +:10C8F000ACF8002017222A70A5F80160A5F80330D3 +:10C900000522CDE900423B462A46FFF7DFFD002025 +:10C91000ECE770B50C4615464821204617F0E9FCB7 +:10C9200004F1080044F81C0F00204FF6FF71E0618D +:10C9300061842084A5841720E08494F82A0040F0C4 +:10C940000A0084F82A0070BD4FF6FF720A80014683 +:10C95000032007F097BC30B585B00C460546FFF7BD +:10C9600080FFA18E284629B101218DF8001069466B +:10C97000FAF7EBFB0020E0622063606305B030BD96 +:10C98000B0F84000704700005400002090F84620A6 +:10C99000920703D4408808800020F3E70620F1E7DF +:10C9A00090F846209207EDD5A0F84410EAE701463A +:10C9B000002009880A0700D5012011F0F00F01D0EE +:10C9C00040F00200CA0501D540F004008A0501D5F7 +:10C9D00040F008004A0501D540F010000905D1D506 +:10C9E00040F02000CEE700B5034690F84600C007AF +:10C9F00001D0062000BDA3F842101846FFF7D7FF6C +:10CA000010F03E0F05D093F8460040F0040083F884 +:10CA1000460013F8460F40F001001870002000BDDA +:10CA200090F84620520700D511B1B0F84200A9E7AE +:10CA30001720A7E710F8462F61F3C3020270A1E7A1 +:10CA40002DE9FF4F9BB00E00DDE92B34DDE929789D +:10CA5000289D24D02878C10703D000F03F00192872 +:10CA600001D9012100E000212046FFF7D9FFB042A3 +:10CA700015D32878410600F03F010CD41E290CD0B4 +:10CA8000218811F47F6F0AD13A8842B1A1F57F4223 +:10CA9000FF3A04D001E0122901D1000602D504209A +:10CAA0001FB0C5E5F9491D984FF0000A08718DF8CF +:10CAB00018A08DF83CA00FAA0A60ADF81CA0ADF834 +:10CAC00050A02978994601F03F02701F5B1C04F1C9 +:10CAD000180C4FF0060E4FF0040BCDF858C01F2A6B +:10CAE0007ED2DFE802F07D7D107D267DAC7DF47D79 +:10CAF000F37DF27DF17DF47DF07D7D7DEF7DEE7D3A +:10CB00007D7D7D7DED0094F84610B5F80100890724 +:10CB100001D5032E02D08DF818B022E34FF4006146 +:10CB2000ADF85010608003218DF83C10ADF8400046 +:10CB3000D8E2052EEFD1B5F801002083ADF81C0036 +:10CB4000B5F80310618308B1884201D901207FE163 +:10CB50000020A07220814FF6FF702084169801F00B +:10CB6000A0F8052089F800000220029083460AAB55 +:10CB70001D9A16991B9801F097F890BB9DF82E000E +:10CB8000012804D0022089F80100102003E00120D0 +:10CB900089F8010002200590002203A90BA805F0E6 +:10CBA000A8FCE8BB9DF80C00059981423DD13A886C +:10CBB000801CA2EB0B01814237DB02990220CDE9F8 +:10CBC00000010DF12A034A4641461B98FFF77EFCFF +:10CBD00002980BF1020B801C80B217AA03A901E096 +:10CBE000A0E228E002900BA805F083FC02999DF8D2 +:10CBF0000C00CDE9000117AB4A4641461B98FFF7F0 +:10CC000065FC9DF80C100AAB0BEB01001FFA80FBD2 +:10CC100002981D9A084480B2029016991B9800E071 +:10CC200003E001F041F80028B6D0BBF1020F02D0BA +:10CC3000A7F800B053E20A208DF818004FE2002157 +:10CC40000391072EFFF467AFB5F801002083ADF81C +:10CC50001C00B5F80320628300283FF477AF9042B0 +:10CC60003FF674AF0120A072B5F8050020810020C6 +:10CC7000A073E06900F052FD78B9E1690120887184 +:10CC8000E2694FF420519180E1698872E06942F6CF +:10CC900001010181E06900218173F01F20841E9849 +:10CCA000606207206084169800F0FBFF072089F877 +:10CCB00000000120049002900020ADF82A0028E036 +:10CCC0001DE2A3E13AE1EAE016E2AEE086E049E0E7 +:10CCD0000298012814D0E0698079012803D1BDF8B9 +:10CCE0002800ADF80E00049803ABCDE900B04A4629 +:10CCF00041461B98FFF7EAFB0498001D80B20490A0 +:10CD0000BDF82A00ADF80C00ADF80E00059880B211 +:10CD100002900AAB1D9A16991B9800F0C5FF28B91E +:10CD200002983988001D05908142D1D202980128CD +:10CD300081D0E0698079012805D0BDF82810A1F5DF +:10CD40007F40FF3803D1BDF82800ADF80E000498ED +:10CD500003ABCDE900B04A4641461B98FFF7B6FB4E +:10CD60000298BBE1072E02D0152E7FF4D4AEB5F8A1 +:10CD700001102183ADF81C10B5F80320628300294F +:10CD80003FF4E4AE91423FF6E1AE0121A1724FF0D3 +:10CD9000000BA4F808B084F80EB0052E07D0C0B27E +:10CDA000691DE26905F086FB00287FF444AF4FF669 +:10CDB000FF70208401A906AA14A8CDF800B081E86C +:10CDC00085032878214600F03F031D9A1B98FFF742 +:10CDD00095FB8246208BADF81C0080E10120032EDC +:10CDE000C3D14021ADF85010B5F801102183ADF842 +:10CDF0001C100AAAB8F1000F00D00023CDE90203ED +:10CE000004921D98CDF80480009038880022401EBE +:10CE100083B21B9800F0C8FF8DF8180090BB0B2060 +:10CE200089F80000BDF8280037E04FF0010C052E0E +:10CE30009BD18020ADF85000B5F801102183B5F8E2 +:10CE400003002084ADF81C10B0F5007F03D9072043 +:10CE50008DF8180085E140F47C4222840CA8B8F1DA +:10CE6000000F00D00023CDE90330CDE9018C1D98DF +:10CE700000903888401E83B21B9800F095FF8DF813 +:10CE8000180028B18328A8D10220BDE0540000205A +:10CE90000D2189F80010BDF83000401C1EE1032E62 +:10CEA00004D248067FF537AE002017E1B5F801102F +:10CEB000ADF81C102878400602D58DF83CE002E061 +:10CEC00007208DF83C004FF000080320CDE9020850 +:10CED0001E9BCDF810801D980193A6F1030B0090C6 +:10CEE0001FFA8BF342461B9800F034FD8DF81800B2 +:10CEF0008DF83C80297849060DD52088C00506D5D7 +:10CF0000208BBDF81C10884201D1C4F82480404613 +:10CF10008DF81880E2E0832801D14FF0020A4FF427 +:10CF20008070ADF85000BDF81C002083A4F820B03C +:10CF30001E986062032060841321CCE0052EFFF46C +:10CF4000EAADB5F80110ADF81C10A28F62B3A2F5DE +:10CF50007F43FE3B28D008228DF83C204FF0000B89 +:10CF60000523CDE9023BDDF878C0CDF810B01D9A5D +:10CF700080B2CDF804C040F400430092B5F803201D +:10CF80001B9800F0E7FC8DF83CB04FF400718DF871 +:10CF90001800ADF85010832810D0F8B1A18FA1F57A +:10CFA0007F40FE3807D0DCE00B228DF83C204FF6A6 +:10CFB000FE72A287D2E7A4F83CB0D2E000942B46E0 +:10CFC00031461E9A1B98FFF780FB8DF8180008B1B8 +:10CFD00083284BD1BDF81C00208355E700942B46D5 +:10CFE00031461E9A1B98FFF770FB8DF81800E8BBBE +:10CFF000E18FA06B0844811D8DE8820343888288FD +:10D0000001881B98FFF763FC824668E095F8018071 +:10D01000022E70D15FEA080002D0B8F1010F6AD188 +:10D0200009208DF83C0007A800908DF84080434609 +:10D03000002221461B98FFF72CFC8DF842004FF090 +:10D04000000B8DF843B050B9B8F1010F12D0B8F110 +:10D05000000F04D1A18FA1F57F40FF380AD0A08F27 +:10D0600040B18DF83CB04FF4806000E037E0ADF89F +:10D0700050000DE00FA91B98FAF767F882468DF86B +:10D080003CB04FF48060ADF85000BAF1020F06D00A +:10D09000FC480068C07928B18DF8180027E0A4F892 +:10D0A000188044E0BAF1000F03D081208DF81800F9 +:10D0B0003DE007A800904346012221461B98FFF758 +:10D0C000E8FB8DF8180021461B98FFF7CAFB9DF876 +:10D0D000180020B9192189F80010012038809DF826 +:10D0E0003C0020B10FA91B98FAF72FF88246BAF13D +:10D0F000000F33D01BE018E08DF818E031E0207805 +:10D10000000712D5012E10D10A208DF83C00E088CE +:10D11000ADF8400003201B9907F0B4F80820ADF8E3 +:10D120005000C1E648067FF5F6AC4FF0040A2088AF +:10D13000BDF8501008432080BDF8500080050BD585 +:10D14000A18FA1F57F40FE3806D11E98E062289895 +:10D150002063A6864FF0030A5046A1E49DF818000C +:10D1600078B1012089F80000297889F80110BDF80C +:10D170001C10A9F802109DF8181089F80410052059 +:10D1800038802088BDF8501088432080E4E72DE9DE +:10D19000FF4F8846087895B0012181404FF2090081 +:10D1A000249C0140ADF820102088DDF88890A0F57F +:10D1B0007F424FF0000AFF3A06D039B1000705D58B +:10D1C000012019B0BDE8F08F0820FAE7239E4FF048 +:10D1D000000B0EA886F800B018995D460988ADF8D6 +:10D1E0003410A8498DF81CB0179A0A718DF838B020 +:10D1F000086098F8000001283BD0022809D00328D5 +:10D200006FD1307820F03F001D303070B8F8040046 +:10D21000E08098F800100320022904D1317821F031 +:10D220003F011B31317094F84610090759D505AB01 +:10D23000B9F1000F13D0002102AA82E80B000720E9 +:10D24000CDE90009BDF83400B8F80410C01E83B25F +:10D250000022159800F0A8FD0028D1D101E0F11CB2 +:10D26000EAE7B8F80400A6F80100BDF81400C01CF5 +:10D2700004E198F805108DF81C1098F804000128B6 +:10D2800006D04FF4007A02282CD00328B8D16CE1E4 +:10D290002188B8F8080011F40061ADF8201020D002 +:10D2A00017281CD3B4F84010814218D3B4F84410A6 +:10D2B000172901D3814212D1317821F03F01C91CD5 +:10D2C0003170A6F801000321ADF83410A4F8440031 +:10D2D00094F8460020F0020084F8460065E1052538 +:10D2E0007EE177E1208808F1080700F4FE60ADF8E0 +:10D2F000200010F0F00F1BD010F0C00F03D03888C2 +:10D30000228B9042EBD199B9B878C00710D0B96898 +:10D310000720CDE902B1CDF804B00090CDF810B0EF +:10D32000FB88BA883988159800F014FB0028D6D1FC +:10D330002398BDF82010401C80294ED006DC10290F +:10D340000DD020290BD0402987D124E0B1F5807F72 +:10D350006ED051457ED0B1F5806F97D1DEE0C80622 +:10D3600001D5082000E0102082460DA907AA05205B +:10D37000CDE902218DF83800ADF83CB0CDE9049636 +:10D3800008A93888CDE9000153460722214615989F +:10D39000FFF7B4F8A8E09DF81C2001214FF00A0A1D +:10D3A000002A9BD105ABB9F1000F00D00020CDE9D8 +:10D3B00002100720CDE90009BDF834000493401E97 +:10D3C00083B2218B0022159800F0EEFC8DF81C0032 +:10D3D0000B203070BDF8140020E09DF81C200121C6 +:10D3E0004FF00C0A002A22D113ABB9F1000F00D084 +:10D3F0000020CDE902100720CDE900090493BDF813 +:10D400003400228C401E83B2218B159800F0CCFC96 +:10D410008DF81C000D203070BDF84C00401CADF89C +:10D42000340005208DF83800208BADF83C00BCE0BE +:10D430003888218B88427FF452AF9DF81C004FF052 +:10D44000120A00281CD1606AA8B1B878C0073FF45E +:10D4500046AF00E018E0BA680720CDE902B2CDF887 +:10D4600004B00090CDF810B0FB88BA88159800F091 +:10D4700071FA8DF81C00132030700120ADF83400D3 +:10D4800093E00000540000203988208B8142D2D1E3 +:10D490009DF81C004FF0160A0028A06B08D0E0B3DE +:10D4A0004FF6FF7000215F46ADF808B0019027E00D +:10D4B00068B1B978C907BED1E18F0DAB0844821DB0 +:10D4C00003968DE80C0243888288018809E0B878C9 +:10D4D000C007BCD0BA680DAB03968DE80C02BB88C0 +:10D4E000FA881598FFF7F3F905005ED0072D72D082 +:10D4F00076E0019005AA02A92046FFF729F9014626 +:10D50000E28FBDF80800824201D00029F1D0E08FFF +:10D51000A16B084407800198E08746E09DF81C0055 +:10D520004FF0180A40B1208BC8B1388820832146BB +:10D530001598FFF796F938E004F118000090237E63 +:10D54000012221461598FFF7A4F98DF81C00002848 +:10D55000EDD1192030700120ADF83400E7E7052542 +:10D5600021461598FFF77DF93AE0208800F4007015 +:10D57000ADF8200050452DD1A08FA0F57F41FE3998 +:10D5800001D006252CE0D8F808004FF0160A48B163 +:10D59000A063B8F80C10A1874FF6FF71E187A0F8DF +:10D5A00000B002E04FF6FF70A087BDF8200030F415 +:10D5B0007F611AD0782300220320159906F0B8FD68 +:10D5C00098F8000020712088BDF8201008432080C2 +:10D5D0000EE000E007252088BDF820108843208059 +:10D5E000208810F47F6F1CD03AE02188814321808D +:10D5F0009DF8380020B10EA91598F9F7A6FD05464B +:10D600009DF81C000028EBD086F801A001203070A6 +:10D61000208B70809DF81C0030710520ADF834001F +:10D62000DEE7A18EE1B118980DAB0088ADF83400AB +:10D630002398CDE90304CDE90139206B0090E36A1A +:10D64000179A1598FFF7FCF9054601208DF8380068 +:10D650000EA91598F9F779FD00B10546A4F834B084 +:10D6600094F8460040070AD52046FFF7A0F910F0CD +:10D670003E0F04D114F8460F20F0040020701898D3 +:10D68000BDF83410018028469BE500B585B003281D +:10D6900006D102208DF8000088B26946F9F755FDE1 +:10D6A00005B000BD10B5384C0B782268012B02D0B4 +:10D6B000022B2AD111E013780BB1052B01D10423E1 +:10D6C000137023688A889A802268CB88D380226866 +:10D6D0000B891381498951810DE08B8893802268E1 +:10D6E000CB88D38022680B8913814B8953818B8926 +:10D6F0009381096911612168F9F727FD22680021EA +:10D700000228117003D0002800D0812010BD832092 +:10D7100010BD806B002800D001207047817801295E +:10D7200009D10088B0F5205F03D042F6010188429C +:10D7300001D10020704707207047F0B587B0002462 +:10D7400015460E460746ADF8144010E006980188CD +:10D750002980811DCDE902410721019404940091A3 +:10D76000838842880188384600F0F4F830B906AA68 +:10D7700005A93046FEF7ECFF0028E7D00A2800D1C3 +:10D78000002007B0F0BD00005400002010B58B78D9 +:10D7900083B102789A4205D10B885BB102E08B79A4 +:10D7A000091D4BB18B789A42F9D1B0F801300C8841 +:10D7B000A342F4D1002010BD812010BD072826D03F +:10D7C00012B1012A27D103E0497801F0070102E0F4 +:10D7D0004978C1F3C20105291DD2DFE801F0031821 +:10D7E000080C12000AB10320704702207047042879 +:10D7F0000DD250B10DE0052809D2801E022808D3B1 +:10D8000003E0062803D0032803D00520704700203A +:10D8100070470F20704781207047C0B282060BD43A +:10D82000000607D5FE48807A4143C01D01EBD000B9 +:10D8300080B27047084670470020704770B5138863 +:10D840000B800B781C0625D5F54CA47A844204D8AD +:10D8500043F010000870002070BD956800F00706C6 +:10D8600005EBD0052D78F54065F304130B701378A4 +:10D87000D17803F0030341EA032140F20123B1FB15 +:10D88000F3F503FB15119268E41D00FB012000EB8A +:10D89000D40070BD906870BD37B51446BDF8041053 +:10D8A00011809DF804100A061ED5C1F30013DC494F +:10D8B000A568897A814208D8FE2811D1C91DC908F6 +:10D8C0005A42284616F0EBFC0AE005EBD00100F0C6 +:10D8D0000702012508789540A84393401843087033 +:10D8E000207820F0100020703EBD2DE9F041074661 +:10D8F000C81C0E4620F00300B04202D08620BDE8CE +:10D90000F081C74D002034462E60AF802881AA7276 +:10D91000E8801AE0E988491CE980810614D4E1789E +:10D9200000F0030041EA002040F20121B0FBF1F2D7 +:10D9300001FB12012068FFF770FF2989084480B2BB +:10D940002881381A3044A0600C3420784107E1D493 +:10D950000020D4E72DE9FF4F89B01646DDE9168A8D +:10D960000F46994623F44045084600F00DFB04009D +:10D970000FD0099802F0E2FF0290207800060AD545 +:10D98000A748817A0298814205D887200DB0BDE86A +:10D99000F08F0120FAE7224601A90298FFF74EFF17 +:10D9A000834600208DF80C004046B8F1070F1AD0CE +:10D9B00001222146FFF702FF0028E7D12078400628 +:10D9C00011D502208DF80C00ADF81070BDF80400E0 +:10D9D000ADF81200ADF814601898ADF81650CDF8F7 +:10D9E0001CA0ADF818005FEA094004D500252E46BA +:10D9F000A84601270CE02178E07801F0030140EA15 +:10DA0000012040F20121B0FBF1F2804601FB1287B8 +:10DA10005FEA494009D5B84507D1A178207901F0DE +:10DA2000030140EA0120B04201D3BE4201D90720E0 +:10DA3000ACE7A8191FFA80F9B94501D90D20A5E76F +:10DA40009DF80C0028B103A90998F9F77CFB002880 +:10DA50009CD1B84507D1A0784FEA192161F30100A4 +:10DA6000A07084F804901A9800B10580199850EAC3 +:10DA70000A0027D0199830B10BEB06002A461999F5 +:10DA800016F096FB0EE00BEB06085746189E099819 +:10DA900003F0C0F82B46F61DB5B239464246009554 +:10DAA00002F0ABFC224601A90298FFF7C7FE9DF8E1 +:10DAB0000400224620F010008DF80400DDE901107A +:10DAC000FFF7EAFE002061E72DE9FF4FDFF85091F4 +:10DAD00082461746B9F80610D9F8000001EB41015B +:10DAE00000EB810440F20120B2FBF0F185B000FBB5 +:10DAF00011764D46DDF84C8031460698FFF78DFED5 +:10DB000029682A898B46611A0C3101441144AB887B +:10DB100089B28B4202D8842009B038E70699CDB289 +:10DB2000290603D5A90601D50620F5E7B9F806C0F0 +:10DB30000CF1010C1FFA8CFCA9F806C0149909B16C +:10DB4000A1F800C0A90602D5C4F8088007E0104477 +:10DB500080B2A9F80800191A01EB0B00A060224658 +:10DB6000FE200699FFF798FEE77026712078390AA3 +:10DB700061F30100320AA17840F0040062F3010170 +:10DB8000A17020709AF802006071BAF80000E0807D +:10DB900000262673280602D599F80A7000E00127AE +:10DBA000A80601D54FF000084D4600244FF00709A4 +:10DBB0000FE0CDE902680196CDF800900496E9885F +:10DBC0002046129B089AFFF7C5FE0028A4D1641CCA +:10DBD000E4B2BC42EDD300209EE72DE9F047804639 +:10DBE00000F0D2F9070005D0002644460C4D40F263 +:10DBF000012919E00120BDE8F087204600F0C4F9B2 +:10DC00000278C17802F0030241EA0222B2FBF9F382 +:10DC100009FB13210068FFF700FE304486B201E0E3 +:10DC2000E8050020641CA4B2E988601E8142E4DC9F +:10DC3000A8F10100E8802889801B28810020387025 +:10DC4000D9E710B5144631B1491E218002F076FEA5 +:10DC5000A070002010BD012010BD10B5D2490446AF +:10DC60000088CA88904201D30A2010BD096800EBE1 +:10DC7000400001EB80025079A072D0882081917819 +:10DC8000107901F0030140EA0120A081A078E11C95 +:10DC9000FFF7D4FD20612088401C2080E080002018 +:10DCA00010BD0121018270472DE9FF4F85B04FF66D +:10DCB000FF788246A3F8008048681F460D468078AA +:10DCC0008DF8060048680088ADF8040000208DF843 +:10DCD0000A00088A0C88A04200D304462C8241E046 +:10DCE000288A401C2882701D6968FFF74FFDB8BB69 +:10DCF0003988414501D1601E38806888A04236D3FA +:10DD0000B178307901F0030140EA012901A9701DC1 +:10DD1000FFF73CFD20BB298941452CD0002231462C +:10DD20000798FFF74BFDD8B92989494518D1E9680B +:10DD30000391B5F80AC0D6F808B05046CDF800C037 +:10DD400002F068FFDDF800C05A460CF1070C1FFA1C +:10DD50008CFC4B460399CDF800C002F018FB50B183 +:10DD6000641CA4B2204600F00FF90600B8D1641E6E +:10DD70002C820A20D0E67C807079B871F088B88057 +:10DD80003178F07801F0030140EA01207881A7F8AA +:10DD90000C90504602F0D2FD324607F10801FFF721 +:10DDA0004DFD38610020B7E62DE9FF4F87B0814671 +:10DDB0001C469246DDF860B0DDF85480089800F00B +:10DDC000E3F805000CD0484602F0B8FD29780906B2 +:10DDD00008D57549897A814204D887200BB0D6E5E9 +:10DDE0000120FBE7CAF309062A4601A9FFF726FD31 +:10DDF0000746149807281CD000222946FFF7DEFCAE +:10DE00000028EBD12878400613D501208DF80800B2 +:10DE10000898ADF80C00BDF80400ADF80E00ADF8A0 +:10DE20001060ADF8124002A94846F9F78CF90028B5 +:10DE3000D4D12978E87801F0030140EA0121AA78D9 +:10DE4000287902F0030240EA0220564507D0B1F5D6 +:10DE5000007F04D9611E814201DD0B20BEE78642AE +:10DE600001D90720BAE7801B85B2A54200D9254613 +:10DE7000BBF1000F01D0ABF80050179818B1B919D9 +:10DE80002A4616F095F9B8F1000F0DD03E444846E9 +:10DE90004446169F02F0D0FE2146FF1DBCB232461A +:10DEA0002B46009402F0DDFA002097E72DE9F041BF +:10DEB00007461D461646084600F066F804000BD0DB +:10DEC000384602F03BFD2178090607D53649897AA4 +:10DED000814203D8872012E5012010E52246314611 +:10DEE000FFF7ACFC65B12178E07801F0030140EA6E +:10DEF0000120B0F5007F01D8012000E0002028704B +:10DF00000020FCE42DE9F04107461D461646084670 +:10DF100000F03AF804000BD0384602F00FFD2178EB +:10DF2000090607D52049897A814203D88720E6E48B +:10DF30000120E4E422463146FFF7AEFCFF2D14D069 +:10DF40002178E07801F0030240EA022040F2012249 +:10DF5000B0FBF2F302FB130015B900F2012080B20E +:10DF6000E070000A60F3010121700020C7E410B5E1 +:10DF70000C4600F009F828B1C18821804079A070D2 +:10DF8000002010BD012010BD0749CA88824209D374 +:10DF900040B1096800EB40006FF00B0202EB80001B +:10DFA0000844704700207047E805002070B503461C +:10DFB000002002466FF02F050EE09C5CA4F13006B5 +:10DFC0000A2E02D34FF0FF3070BD00EB800005EB4E +:10DFD0004000521C2044D2B28A42EED370BD30B50C +:10DFE0000A240AE0B0FBF4F304FB13008D18303070 +:10DFF00005F8010C521E1846D2B2002AF2D130BDEB +:10E0000030B500234FF6FF7510E0040A44EA002003 +:10E0100084B2C85C6040C0F30314604005EA003479 +:10E020004440E0B25B1C84EA40109BB29342ECD3C4 +:10E0300030BD000010B582B0694601F0D1FD002866 +:10E0400018BFFFDF9DF80000002448B1019890F848 +:10E05000DD0028B1019880F8DD4001980AF0AFF9A1 +:10E06000F8488068A0F8D24002B010BD2DE9F04712 +:10E0700004460D46062002F043FC0646072002F047 +:10E080003FFC304400F0FF08002718EB050618BFDE +:10E090004FF000091DD02088401C80B22080B04283 +:10E0A00028BFA4F800902588454501D3B54209D37F +:10E0B0000621284602F07CFC20B90721284602F000 +:10E0C00077FC10B10020BDE8F087781CC7B2BE42D3 +:10E0D000E1D84FF6FF7020801220BDE8F08770B5C0 +:10E0E00082B007F073FB0DF0AFF9D74C4FF6FF7617 +:10E0F00000256683A683D5A12570D1E90001CDE96D +:10E10000000165706946A01C16F008FAA11C601C8D +:10E1100014F04CF825721B2060814FF4A471A1818A +:10E12000E08121820321A1740422E274A082E082B2 +:10E13000A4F13E00218305704680C6480570A4F115 +:10E1400010000570468002B070BDF8B5BD4D174691 +:10E150000E466860297007F0B3FA4FF6FF70ADF80D +:10E16000000000216846FFF781FFA0B90621BDF835 +:10E17000000002F02FFC04460721BDF8000002F069 +:10E1800029FC002C1CBF0028FFDF00216846FFF798 +:10E190006DFF0028EAD0FFF7A2FF287812F07CF884 +:10E1A0000FF0A0FC2978686813F013FF28780CF0B2 +:10E1B000ABFB30460AF00FF807F020FC29786868BE +:10E1C0000BF048FA3946287814F0ADFDBDE8F84068 +:10E1D0000DF03AB910B50124002A1CBF002010BD73 +:10E1E000002908BF022105D0012918BF002401D051 +:10E1F000204610BD0EF088FEFAE72DE9F04F8BB0F7 +:10E20000040008BFFFDF02218F4E06F11C00FFF75C +:10E210002DFF002818BFFFDFB6F81CA0062002F073 +:10E220006FFB0546072002F06BFB284400F0FF0857 +:10E2300008F1010000F0FF094FF0000BB78B4745D4 +:10E2400025D120460FF022F8002840F0CE8030780B +:10E25000002800F0CE8084F801B014202070C4F8AB +:10E2600004B0C4F808B0C4F80CB0C4F810B0C4F8D6 +:10E2700014B0C4F818B0C4F81CB00220C4F820B020 +:10E28000207186F800B00BB00120BDE8F08F4F453B +:10E2900020D1204607F04CFB00287DD007F02AFF54 +:10E2A000002859D02078172856D12079002853D03B +:10E2B000E088072102F07CFB050008BFFFDF28880B +:10E2C00007F017FAE088072102F084FB002818BF46 +:10E2D000FFDF8AE004A9384601F082FC00285BD108 +:10E2E0009DF8100048B107F07EFBB84254D021469B +:10E2F00038460BF0B8F880B377E00FF05AF8B84220 +:10E3000077D02146384613F085FD00286DD1059859 +:10E3100000F1580590F8D00018B9E87E08B1012046 +:10E3200000E00020079095F8370000281CBF95F802 +:10E33000380010F0020F1CD084F801B001202070CA +:10E3400084F804B0E78095F839002072688F608106 +:10E35000A88FA08185F837B047E0FFE7059800F166 +:10E36000580590F80C010028DBD1E87E0028D8D0B1 +:10E37000D5E7384602F060FC0290002808BFFFDFB6 +:10E38000029801F06FFE50B184F801B00F212170A6 +:10E39000E7802081012000E02BE0207125E0384655 +:10E3A00002F038FC0290002808BFFFDF079800B396 +:10E3B000029801F0AEFEE0B19DF8100038B9059862 +:10E3C000D0F8F8004188B94208BF80F800B038465C +:10E3D00007F08FF984F801B00C20207084F804B0A5 +:10E3E000E780287F207285F81BB00BB00120BDE8C4 +:10E3F000F08F022106F11C00FFF738FE18B9B08B30 +:10E4000050457FF41BAF0BB02046BDE8F04F14F031 +:10E41000D0BC10B512F08AFC042803D012F086FCA0 +:10E42000052802D10FF078FD28B90AF0A9F920B12A +:10E4300007F08AFC08B10C2010BD0DF051F8002047 +:10E4400010BD00005C00002032060020FFFFFFFF2F +:10E450001F0000006800002010B504460078002866 +:10E460001EBF0128122010BD12F060FC042806D047 +:10E4700012F05CFC052802D00AF082F928B10DF0F8 +:10E480007EF900281CBF0C2010BD2078002816BF84 +:10E4900002280020012004F11703E21D611CBDE8E1 +:10E4A00010400DF075B810B50446007800281EBF66 +:10E4B0000128122010BD12F039FC042803D012F0FC +:10E4C00035FC052802D10FF027FD28B90AF058F9CC +:10E4D00020B107F039FC08B10C2010BD20780028CD +:10E4E00016BF022800200120611C0CF0BFFF00288D +:10E4F00014BF0020072010BD10B50DF043F900280F +:10E5000014BF0020302010BD10B5044612F00EFCE0 +:10E51000042806D012F00AFC052802D00AF030F9CF +:10E5200008B10C2010BD20460DF026F9002010BDCA +:10E5300010B512F0FBFB042806D012F0F7FB0528FB +:10E5400002D00AF01DF928B10DF019F900281CBFFE +:10E550000C2010BD0DF075F8002010BDFF2181705A +:10E560004FF6FF718180FE4949680A7882718A8876 +:10E57000028149884181012141700020704710B516 +:10E58000002482B012F1080F16D00CDC12F1280F13 +:10E5900018BF12F1140F0FD012F1100F18BF12F1A3 +:10E5A0000C0F09D00EE012F1040F18BF002A03D09F +:10E5B000032A18BF042A05D1012807D0022809D050 +:10E5C00003280BD0122402B0204610BD104607F0DD +:10E5D0008CFDF8E710460FF03AFAF4E708461446C7 +:10E5E000694601F0FDFA002818BF0224EBD19DF81E +:10E5F0000000019880F857400024E4E710B5134666 +:10E6000001220DF0A6FF002010BD10B5044612F047 +:10E610008DFB052804BF0C2010BD204611F02AFEFA +:10E62000002010BD10B5044612F080FB042806D06F +:10E6300012F07CFB052802D00AF0A2F808B10C20E9 +:10E6400010BD2146002007F0C2F8002010BD10B513 +:10E65000044611F0B9FE50B10AF085F838B12078BF +:10E6600009F0DDFD20780FF090FC002010BD0C209B +:10E6700010BD10B5044612F059FB042806D012F064 +:10E6800055FB052802D00AF07BF808B10C2010BD1C +:10E690002146012007F09BF8002010BD38B5044644 +:10E6A0004FF6FF70ADF80000A079E179884213D0F1 +:10E6B00021791F299CBF61791F290DD8002211469D +:10E6C00014F030FF40B90022E079114614F02AFF1F +:10E6D00010B9207A072801D9122038BD0AF050F865 +:10E6E00060B912F023FB48B900216846FFF7BEFC71 +:10E6F00020B1204606F031F8002038BD0C2038BD8E +:10E7000070B504468078002582B01A2825D00EDC2A +:10E71000162844D2DFE800F04343434343214343F8 +:10E7200043434343434343434343432121212A2853 +:10E7300035D00BDCA0F11E000C2830D2DFE800F051 +:10E740002F2F2F2F2F2F2F2F2F2F2F0D3A38042819 +:10E7500025D2DFE800F0240224022088B0F5706F93 +:10E760001DD20126694601F03BFA00281EBF022097 +:10E7700002B070BD9DF80000002801980BBF00F1A9 +:10E78000F40100F5B87100F1F50300F271130246CF +:10E7900012D192F8D00092F8732052B903E002B07F +:10E7A0004FF0120070BD002818BF042801D008786F +:10E7B00068B102B00C2070BD92F80C0192F8732081 +:10E7C000002AF6D1002818BF0428F0D1F1E70E7016 +:10E7D000A07818709DF8000048B1019890F8DD000D +:10E7E00028B1019880F8DD50019809F0E8FD02B0E9 +:10E7F000002070BDF0B583B00C46694601F0F0F919 +:10E8000028B1204615F074FE03B00220F0BD019837 +:10E81000002700F1580500F1080600BF85F8407098 +:10E820003146204615F07AFE95F840000028F5D1D3 +:10E8300003B0F0BD2DE9F0410D4604460189808802 +:10E8400000230DF0BCFF696A814228BFBDE8F0815A +:10E85000401A401C4108A0884FF0000C401A80B2BA +:10E86000A08022896FF00E07511A8AB2228195F892 +:10E870005460618816F00C0F6FF00D0328D0B0F5CE +:10E88000747F38BF604606D35038C61700EB9660D9 +:10E8900003EBA01080B2814238BF0846608095F833 +:10E8A0005510E08811F00C0F1BD0B2F5747F09D31E +:10E8B000A2F15001CA1701EB926103EBA11100BF55 +:10E8C0001FFA81FC604528BF6046E080BDE8F0810A +:10E8D000022E1ABF03EBD00080B207EB9000DAD112 +:10E8E000D8E702291ABF03EBD2011FFA81FC07EB1C +:10E8F0009201E7D1E4E7F0B587B00C46054604A9DC +:10E9000001F06EF900281CBF07B0F0BD9DF81000A3 +:10E91000002814BF002201220599B1F84A30FB2BD0 +:10E9200028BFFB23B1F84CC0BCF1FB0F28BF4FF050 +:10E93000FB0C0C4FD7E90006BF68009001960297C8 +:10E94000ADF80230ADF806C06846FFF773FF65808A +:10E95000BDF80400E080BDF80800608104E000001C +:10E960005C00002040470200BDF80200A080BDF816 +:10E970000600208107B00020F0BD2DE9F04F89B0DE +:10E9800004460088694601F02BF95FEA00081CBFC5 +:10E9900009B0BDE8F08FB4F806C02289ACF11B01C4 +:10E9A0001220E12924BF09B0BDE8F08FB2F5A47FA1 +:10E9B0003CBF09B0BDE8F08F44F29025AA4284BF65 +:10E9C00009B0BDE8F08F00276388A188A3F11B067A +:10E9D000E12E24BF09B0BDE8F08FB1F5A47F2EBFB2 +:10E9E0008D4209B0BDE8F08F1120BCF1FB0F99BF3B +:10E9F00040F64806B24209B0BDE8F08FFB2B92BF4B +:10EA0000B14209B0BDE8F08F208806A901F0E8F80E +:10EA1000002818BFFFDF35D19DF8180000280CBF73 +:10EA2000012200220799B1F84A00FB2828BFFB20E9 +:10EA3000B1F84C30FB2B28BFFB23DFF858B7DBF8CD +:10EA400000C0DBF804A0DBF808B0CDF808C0CDF8B2 +:10EA50000CA0CDF810B0ADF80A00ADF80E3002A849 +:10EA6000FFF7E8FEBDF80C0060F31F45BDF810008D +:10EA700060F31F49BDF80A0060F30F05BDF80E00F2 +:10EA800060F30F0962881FFA89F1092091423CBFA7 +:10EA900009B0BDE8F08FA9B2E28891423CBF09B04D +:10EAA000BDE8F08F4FEA1941A288238901EB154197 +:10EAB0001A4491423CBF09B0BDE8F08F9DF80000B8 +:10EAC0004FF001090028019808D000F5CD7580F8B5 +:10EAD0009B91019890F8DE0148B307E000F582753C +:10EAE00080F80591019890F8280110B14FF03A088C +:10EAF00018E0E08868806088E8802089A880A08885 +:10EB00002881012228460199FFF794FEA888B04287 +:10EB100028BF40F64800A8802889B0421DD228812D +:10EB200085F800906F7009B04046BDE8F08FE0882E +:10EB300068806088E8802089A880A08828810022D9 +:10EB400028460199FFF776FEA888B04228BF40F614 +:10EB50004800A8802889B042E1D340F64800DEE7AB +:10EB60000BE710B5044612F0E1F8042806D012F0C5 +:10EB7000DDF8052802D009F003FE28B10CF0FFFDF6 +:10EB800000281CBF0C2010BD2078002816BF0228CA +:10EB900000200120E279611C0CF075FF002814BFF1 +:10EBA0000020022010BD817831F0070207BFC27833 +:10EBB00032F007031220704711F0040F0EBF12F05D +:10EBC000040F1120704701F023B810B504460178F6 +:10EBD000122084B0012918BF002904D002291EBFC9 +:10EBE000032904B010BD6178002918BF012904D0A1 +:10EBF00002291EBF032904B010BDE17B21B9A17811 +:10EC000001291CBF04B010BDA17831F005021CBF62 +:10EC100004B010BD11F0050F04BF04B010BD11F019 +:10EC2000040F1EBF112004B010BDE178E388628993 +:10EC300000291EBF012904B010BD042B2EBF042AD9 +:10EC400004B010BDA17B002904BF04B010BD07298A +:10EC500084BF04B010BD12F069F8042837D012F058 +:10EC600065F8052833D0A0788DF80800A0788DF8D5 +:10EC7000000060788DF8040020788DF80300A07BF8 +:10EC80008DF80500E07B002818BF01208DF80600F4 +:10EC9000A07810F0010F10D0E078012808BF022002 +:10ECA00003D000280CBF012000208DF80100E0886F +:10ECB000ADF80A006089ADF80C0002A811F091FBD4 +:10ECC000002804BF68460FF065F904B010BD04B019 +:10ECD0000C2010BD10B5044602781220012A0FD076 +:10ECE000002A18BF10BD012A26D012F01FF80528EF +:10ECF00004D011F0F6F9002808BF10BD0C2010BD9B +:10ED00006178002918BF012906D0022918BF10BD5B +:10ED1000A188002908BF10BD6388002B1CBFA188F3 +:10ED20000029E0D003EB83035B0001EB8101B3EB2F +:10ED3000012F28BF10BDD6E70FF01DF8002804BF33 +:10ED4000122010BD0FF02CF800200FF0D3F800288F +:10ED500018BF10BD60780FF0B1F8002818BF10BDC3 +:10ED6000A1886088BDE8104011F064BB002100F06C +:10ED7000B1BF017811F0010F02D0406813F0ECBF71 +:10ED800013F0B9BF2DE9F04F8FB00D460246AFF634 +:10ED90004411D1E90001CDE90B011146284600F0EC +:10EDA00099FF00281CBF0FB0BDE8F08F11F0BEFF27 +:10EDB00004280CD011F0BAFF052808D0F64F387897 +:10EDC00028B90EF0F6FAA0F57F41FF3903D00FB055 +:10EDD0000C20BDE8F08FF1480890F1480990F14807 +:10EDE0000A9008AA06210DA801F0B0FD040002BF98 +:10EDF00009200FB0BDE8F08F03210DF052F9B98A58 +:10EE0000A4F84A10FA8AA4F84C20F87C0090BB7C45 +:10EE1000208801F088FE002818BFFFDF208806F058 +:10EE200067FC268804F10E094FF0000B4FF00A0A28 +:10EE30000421484604F04DFF48460DF001FB062032 +:10EE400001F05EFD80461CE005A9062001F039FDB9 +:10EE500005A801F014FD5FEA000B10D1BDF8180001 +:10EE6000B04206D00798042249460E3015F074F9D6 +:10EE700070B105A801F003FD5FEA000BEED0A8F128 +:10EE80000108B8F1000F07DDBBF1000FDCD007E08F +:10EE900048460DF0DEFAF2E7BBF1000F08BFFFDFD6 +:10EEA000D9F800000CF07AFFBAF1010A01D000286D +:10EEB000BED0BDA004F1120600680190032101A894 +:10EEC00004F0DEFE002001A90A5C3254401CC0B2EE +:10EED0000328F9D3A88B6080688CA080288DE080FF +:10EEE000687A10F0010F18BF01217CD0388B0A46D8 +:10EEF00011F009FB0146A062204611F030FB4FF0F3 +:10EF0000000884F85E8084F85F80A878002816BF27 +:10EF10000228002001206076D5F80300C4F81A000A +:10EF2000B5F80700E0830BA904F1080015F0F6FA24 +:10EF30004FF0010984F80091B4F84C0004F5827692 +:10EF40004A46FB2828BFFB207989814238BF084602 +:10EF500094F855104FF4747A11F00C0F1CBF0AEBA3 +:10EF600080111FFA81FC72D0B989614538BF8C4687 +:10EF7000B4F84A10FB2928BFFB21FB898B4238BF1C +:10EF8000194694F854B01BF00C0F1CBF0AEB811308 +:10EF90009BB265D03F8A9F4238BF3B461B2918BFB2 +:10EFA000B3F5A47F65D0F080A6F808C07180B38067 +:10EFB00021463046FFF73EFCB08840F648018842C3 +:10EFC00028BF40F64800B0803089884228BF40F60C +:10EFD0004800308186F800908DF800800121684655 +:10EFE00004F04EFE00E02BE09DF8000000F0070169 +:10EFF000C0F3C1021144C0F3401008448DF8000072 +:10F00000401D207609283CBF08302076002120468C +:10F010000DF047F868780EF0B9FEA9782878EA1C58 +:10F020000EF087FE002808BF122650D00EF0B8FE62 +:10F03000A9782878EA1C0EF01BFF06001FD046E0D6 +:10F0400010F0020F14BF022100214FE7FFE7022951 +:10F0500007BF81003C31C10070311FFA81FC83E79A +:10F06000BBF1020F07BF8B003C33CB0070339BB268 +:10F0700090E71B2818BFBCF5A47F94D1ACE7012012 +:10F080000EF04CFE060022D1214603200EF028FF90 +:10F0900006001CD1687A8DF8000010F0010F05D031 +:10F0A0006889ADF80200288AADF80400684611F0BE +:10F0B00098F9064695F83A00002818BF01200EF08E +:10F0C00033FE26B9204611F026F9060009D0208823 +:10F0D00006F00FFB2088062101F07CFC002818BFF9 +:10F0E000FFDF30460FB0BDE8F08F0146002049E653 +:10F0F00038B5294C207870B911F018FE052805D0D4 +:10F100000EF057F9A0F57F41FF3904D0684611F0A1 +:10F11000CCF910B113E00C2038BD0098008806F03F +:10F12000E8FA00980621008801F054FC002818BF76 +:10F13000FFDF012020701D480078FCF727FE00202B +:10F1400038BD70B4B0F802C08188C3880289448990 +:10F150008089ACF1060640F67B45AE423CBF8E1F6F +:10F16000AE4214D28C4598BFB3F5FA7F3EBFA2F1F0 +:10F170000A0C0F4D15EB0C0509D25B1C5943B1EB82 +:10F18000820F04DA84429EBF002070BC704730209A +:10F1900070BC70474047020032060020F405002092 +:10F1A0006800002022060020112233005C000020AD +:10F1B00089F3FFFF2DE9F047B0F802C004468188CB +:10F1C000C388028947898689ACF1060940F67B48E5 +:10F1D00030200025C1453ABFA1F10609C145BDE86F +:10F1E000F0878C4598BFB3F5FA7F3DBFA2F10A0CBA +:10F1F000DFF8B48418EB0C08BDE8F0875B1C5943BA +:10F20000B1EB820FA8BFBDE8F087B74288BFBDE869 +:10F21000F0872088062101F0CBFB68B190F8D01070 +:10F2200090F8732042B9002918BF042904D0D0F8FF +:10F23000F8100A781AB106E00220BDE8F087D0F88D +:10F240004421127812B13A20BDE8F08705228A7174 +:10F25000D0F8F8100D81D0F8F820A1885181D0F8AD +:10F26000F820E1889181D0F8F8202189D181D0F867 +:10F27000F8100A894B899A429EBF8A79082A9A42D5 +:10F2800024BF1220BDE8F08722884A80D0F8F80019 +:10F29000022101700020BDE8F087F0B583B005467B +:10F2A0000DF0F2F8002802BF122003B0F0BD0026D6 +:10F2B000FE4F012429467C70B81C15F02FF97E7092 +:10F2C0006946062001F0FDFA002818BFFFDF6846F6 +:10F2D00001F0D5FA002808BFBDF804500AD1029801 +:10F2E00080F80041684601F0CAFA18B9BDF8040078 +:10F2F000A842F4D103B00020F0BD10B50446008848 +:10F30000062101F055FB68B190F8D01090F87320F9 +:10F3100042B9002918BF042904D0D0F8F8100A789F +:10F3200012B105E0022010BDD0F8442112780AB1D4 +:10F330003A2010BD90F8962012F0010F04BF0C2067 +:10F3400010BDD4F80220D4F806304A608B60D0F8A3 +:10F35000F81062898A81D0F8F810E268C1F80E20AE +:10F360002269C1F812206269C1F81620A269C1F8A9 +:10F370001A20D0F8F82003211170D0F8F800218865 +:10F380004180002010BDF8B515460E46044609F030 +:10F39000F7F900281CBF0C20F8BD20781223EF28B5 +:10F3A00073D86088ADF8000010F0100F4FF0000126 +:10F3B0000CD010F0010F00F002021BD0B2B110F01F +:10F3C000080F08BF10F0040F1ED01AE010F0080F4D +:10F3D0007ED110F0200F18BF10F0030F78D110F07D +:10F3E000010F18BF10F0020F72D10DE010F0040FE2 +:10F3F0000AD106E02AB110F0080F08BF10F0040F80 +:10F4000002D010F00F0F63D1608810F0080F09D1FF +:10F41000D4E901C2624528BFBCF1200F58D3B2F134 +:10F42000807F55D2227B002A52D0072A50D894F8E8 +:10F430000DC0BCF1000F18BFBCF1010F05D0BCF12D +:10F44000020F18BFBCF1030F42D110F0040F05D119 +:10F45000BCF1020F18BFBCF1030F07D1A27B002A39 +:10F4600018BF012A34D110F0040F08D1627D002AA0 +:10F4700018BF012A03D0022A18BF032A28D1E27D2F +:10F4800010F0100F02D0012A10D021E0012A18BF7D +:10F49000032A1DD110F0100F08D1627E012A1CBF73 +:10F4A000022A032A14D1A27E0F2A11D8E27E002A52 +:10F4B00018BF012A0CD1E27D1123032A08D010F0D5 +:10F4C000100F04BF627E032A02D010F0400F01D05B +:10F4D0001846F8BD3170A17555B9FF208DF80000B0 +:10F4E0006946002006F0EDFD6946002006F0D4FDD7 +:10F4F0002046BDE8F84006F004BD002243E72DE9B0 +:10F50000F0470446C0780F46122510B106F063FD9F +:10F5100050B1607804280AD094F8038094F80090E1 +:10F520006678B8F1FB0F12D92846BDE8F08709F0DC +:10F5300027F90028F8D006F0A6FD0028F4D106F03F +:10F540009AFA002804BFE0780028EDD1E4E71FB163 +:10F55000B8F11F0F23D9E7E706F08DFA28B1B8F10B +:10F560001F0F98BF032E07D0DEE7032E18BF042E0F +:10F5700002D0B8F1000FD7D009F002F9002818BF67 +:10F58000032E04D0042E1CBF0C20BDE8F087484693 +:10F5900006F069FA002804BF4220BDE8F087E07851 +:10F5A00061781F2898BF03291CBF1120BDE8F08790 +:10F5B000211D06F086FD0020BDE8F08700219EE7B2 +:10F5C0002DE9F0470446C0788846122710B106F0AE +:10F5D00098FD38B16578042D04D0E67894F8009051 +:10F5E000FB2E02D93846BDE8F087B8F1000F02D0F3 +:10F5F0001F2E21D9F6E706F03EFA20B11F2E98BF44 +:10F60000032D06D0EEE7032D18BF042D01D0002EE8 +:10F61000E8D009F0B5F8002818BF032D04D0042D58 +:10F620001CBF0C20BDE8F087484606F01CFA0028F5 +:10F6300004BF4220BDE8F087E07861781F2898BFBA +:10F6400003291CBF1120BDE8F087211D06F024FD11 +:10F650000020BDE8F0870021B2E72DE9F041044623 +:10F660004078422582B0012808D8A07806F0FBF93E +:10F6700020B120781225012804D0A0B102B028467C +:10F68000BDE8F08106F04BFD20B1A0880028F5D040 +:10F690008028F3D806F050FD90B160780028EDD0B6 +:10F6A0002078012810D003E089F3FFFF3206002004 +:10F6B00007F0EAFE044608F0DBFC002800F0EA80D0 +:10F6C00002B00C20BDE8F08106F046FB38B906F028 +:10F6D0001FFD002802BF122002B0BDE8F08109F032 +:10F6E0004FF80028ECD106F07EF9A0F57F41FF39F4 +:10F6F000E6D106F050FBA08842F2107100FB01F643 +:10F70000A079314606F078FC06F0F4FC18B300222C +:10F71000072101A801F01AF9040002BF092002B074 +:10F72000BDE8F081F6480321846020460CF072FBAE +:10F73000204607F0EBF8F34DA88AA4F84A00E88ABF +:10F74000A4F84C0006F097F968B1288B012108F065 +:10F7500013FEA0620FE03146002008F063FD002890 +:10F7600018BFFFDFA1E006F0E9FC2A8B0146104636 +:10F7700008F002FEA06201460022204607F087FE44 +:10F7800006F079F9002808BF06F0D8FCE87C009064 +:10F79000AB7CEA8AA98A208801F0C5F9002818BF45 +:10F7A000FFDF208805F0A4FF3146204608F03AFD2F +:10F7B000002818BFFFDF2146B4F84C00002204F5F2 +:10F7C000CD76FB2828BFFB206B89834238BF1846C3 +:10F7D00091F855304FF4747413F00C0F1CBF04EB08 +:10F7E00080131FFA83FC38D0AF89674528BF67466E +:10F7F000B1F84A30FB2B28BFFB23B5F80EC09C455F +:10F8000038BF634691F854C01CF00C0F1CBF04EBCA +:10F81000831C1FFA8CF829D02C8A444528BF444603 +:10F820001B2B18BFB4F5A47F2ED0F08037817380D6 +:10F83000B4803046FEF7FEFFB08840F648018842AB +:10F8400028BF40F64800B0803089884228BF40F683 +:10F85000480030810120307027E0022B07BF830071 +:10F860003C33C30070331FFA83FCBDE7BCF1020FC9 +:10F8700007BF4FEA830C0CF13C0C4FEAC30C0CF1B0 +:10F88000700C1FFA8CF8C7E71B2818BFB7F5A47FC8 +:10F89000CBD10AE04CB1208805F02BFF208807214E +:10F8A00001F098F8002818BFFFDF002002B0BDE883 +:10F8B000F0810021D1E610B50C46072101F078F85F +:10F8C000002804BF022010BD90F8731109B10C206C +:10F8D00010BD90F86510142912BF152990F8C011B9 +:10F8E0000029F4D12168C0F874116168C0F878115A +:10F8F000A168C0F87C11E168C0F88011012180F88E +:10F900007311002010BD10B5072101F051F8002837 +:10F9100004BF022010BD90F8731109B10C2010BD76 +:10F9200090F86510142918BF1529F7D1022180F825 +:10F930007311002010BDF0B50E464BF68032122137 +:10F9400083B0964217D8B6B1694600F049F900284D +:10F950001CBF03B0F0BD019800F15807841C258836 +:10F960003246294638460CF00FFA2088A842F6D1D4 +:10F9700003B00020F0BD03B00846F0BD10B582B062 +:10F9800004460088694600F02BF900281CBF02B02D +:10F9900010BD0198A37800F1580190F82C209A42EC +:10F9A00002BF0C2002B010BD7F220A728A720022B0 +:10F9B000CA72E17880F82D10217980F82E10A17894 +:10F9C00080F82C1002B0104610BD10B582B00C4665 +:10F9D000694600F005F900281CBF02B010BD01986F +:10F9E00090F87300002818BF0120207002B000209A +:10F9F00010BD30B583B00D461446694600F0F0F8EE +:10FA000000281CBF03B030BD019890F82C000128DD +:10FA10001EBF0C2003B030BD019890F86010297013 +:10FA200090F86100207003B0002030BD70B50D4625 +:10FA30001646072100F0BCFF002804BF022070BD5D +:10FA400083884FF0010CC28841880CEB430C65455C +:10FA50001AD342F2107C02FB0CF240F6C41C01FBEC +:10FA60000CF1B2FBF1F1491E8CB2B4F5FA7F88BFFC +:10FA70004FF4FA74A54238BF2C46621C591CB2FBE5 +:10FA8000F1F25143491E8BB290F8AC11002908BF26 +:10FA900003843380002070BD10B50C46072100F0B0 +:10FAA00087FF002804BF022010BD80F8DF40002C33 +:10FAB0001EBF90F8DD10002908F081FC002010BD69 +:10FAC000017800291CBF417800290ED041881B29EC +:10FAD00021BF81881B29C188022906D30A490268EF +:10FAE00040680A654865002070471220704710B5CD +:10FAF000044610F005FD204608F009FC002010BD6A +:10FB00005C00002032060020F40500202DE9F041C1 +:10FB100016460F46044601221146384610F0F3FC03 +:10FB200005460121384608F027FC854228BF2846B3 +:10FB30000123E100503189B2E631884206D901F152 +:10FB40009602401AB0FBF2F0401C83B233800020D2 +:10FB5000BDE8F08110B5044611F0E8F8042806D09D +:10FB600011F0E4F8052802D008F00AFE08B10C20D4 +:10FB700010BD601C0BF05DFF207800F0010006F066 +:10FB800005F9207800F001000EF005F9002010BD05 +:10FB900010B50446072000F0A5FE00281CBF0C206D +:10FBA00010BD207810F0010F11D0002260781146AE +:10FBB00013F0B8FC00281CBF122010BDA0680AF08A +:10FBC00048FA607861680AF04DFA002010BD002004 +:10FBD0000AF03FFA002108460AF044FA002010BD5E +:10FBE00070B50C460546062100F0E2FE606010B1DB +:10FBF0000020207070BD0721284600F0D9FE60600B +:10FC0000002804BF022070BD01202070002070BDBC +:10FC100010B582B0044600886946FFF7E1FF020094 +:10FC20001CBF02B010BDA088002818BF012804D056 +:10FC300002281EBF122002B010BDA178002908BF03 +:10FC40000321E078002808BF03204FF0000C9DF846 +:10FC500000400123002C019C06D084F8A531019CB2 +:10FC600094F8F241ECB124E084F80F31019C94F84F +:10FC700034413CB9019C94F80E411CB9019C94F8A4 +:10FC80007D400CB13A2208E0019C84F80E31019BC2 +:10FC900083F81011019981F81101019880F80FC1C2 +:10FCA00015E0019C94F8A4411CB9019C94F87D4096 +:10FCB0000CB13A2208E0019C84F8A431019B83F83E +:10FCC000A611019981F8A701019880F8A5C102B099 +:10FCD000104610BD427A12F0070F10D032F0070321 +:10FCE0000DD112F0040F01D011207047012A18BF66 +:10FCF000022AF9D190F83A301BB9012A01D012201A +:10FD000070472DE9F0074FF0000C12F0010F40F69C +:10FD1000774740F67B4337D069B14489B0F810C0CB +:10FD2000261F43F6FD75AE423CBFACF10406AE4261 +:10FD300026D2644524D3C68AB0F81CC0448C058DF5 +:10FD4000B0F82E90B0F83480A6F1060A9A453CBF70 +:10FD5000ACF1060A9A4513D2664598BFB4F5FA7F0E +:10FD60003CBFA5F10A06BE420AD2641C04FB0CFC8F +:10FD7000BCEB850F04DAC14598BF4FF0010C03D9E5 +:10FD8000BDE8F0073020704712F0020F22D000EBE0 +:10FD90004C02D68AB2F81CC0558C148DB2F82E8055 +:10FDA000928EA6F106094B4584BFACF106094B457E +:10FDB000E6D9664598BFB5F5FA7F3CBFA4F10A03C2 +:10FDC000BB42DDD26B1C03FB0CF3B3EB840FD7DA21 +:10FDD0009045D5D802782AB1012A13D0BDE8F007A2 +:10FDE000122070470029817808D0002918BF012906 +:10FDF00008D0022918BF032904D0EFE7002918BF53 +:10FE00000129EBD14078002818BF012803D002282F +:10FE100018BF0328E2D1BDE8F007002070470000BA +:10FE200030B5058825F4004421448CB24FF40041DC +:10FE300094420AD2121B92B21B339A4201D2A943B6 +:10FE400007E005F40041214303E0A21A92B2A9435E +:10FE50001143018030BD0844083050434A31084402 +:10FE600080B2704770B51D4616460B4604462946BB +:10FE70003046049AFFF7EFFF0646B34200D2FFDF99 +:10FE80002821204614F035FA4FF6FF70A082283E54 +:10FE9000B0B265776080B0F5004F00D9FFDF6188B0 +:10FEA00005F13C00814200D2FFDF60880835401B2D +:10FEB000343880B220801B2800D21B2020800020F4 +:10FEC000A07770BD8161886170472DE9F05F0D46B4 +:10FED000C188044600F12809008921F4004620F475 +:10FEE000004800F062FB10B10020BDE8F09F4FF029 +:10FEF000000A4FF0010BB0450CD9617FA8EB06005A +:10FF0000401A0838854219DC09EB060000210580FB +:10FF100041801AE06088617F801B471A083F0DD43A +:10FF20001B2F00DAFFDFBD4201DC294600E0B9B239 +:10FF3000681A0204120C04D0424502DD84F817A0AE +:10FF4000D2E709EB06000180428084F817B0CCE7C5 +:10FF500070B5044600F12802C088E37D20F400401B +:10FF60002BB110440288438813448B4201D20020F5 +:10FF700070BD00258A4202D30180458008E0891ABD +:10FF80000904090C418003D0A01D00F01EFB08E00D +:10FF9000637F00880833184481B26288A01DFFF790 +:10FFA0003FFFE575012070BD70B5034600F12804E0 +:10FFB000C588808820F400462644A84202D100204B +:10FFC000188270BD98893588A84206D3401B758871 +:10FFD0002D1A2044ADB2C01E05E02C1AA5B25C7FDC +:10FFE00020443044401D0C88AC4200D90D809C89CF +:10FFF00024B1002414700988198270BD0124F9E726 +:020000040001F9 +:1000000070B5044600F12801808820F400404518AE +:10001000208A002825D0A189084480B2A08129889F +:100020006A881144814200D2FFDF2888698800264F +:100030000844A189884212D1A069807F287169880B +:1000400019B1201D00F0C1FA08E0637F2888083349 +:10005000184481B26288201DFFF7E2FEA681268245 +:10006000012070BD2DE9F0414189878800260446B2 +:1000700000F12805B94218D004F10A0821F4004023 +:100080002844418819B1404600F09FFA08E0637F98 +:1000900000880833184481B262884046FFF7C0FEEA +:1000A000761C6189B6B2B942E8D13046BDE8F0812C +:1000B0002DE9F04104460B4627892830A68827F40D +:1000C0000041B4F80A8001440D46B74201D1002036 +:1000D000ECE70AB1481D106023B1627F691D184624 +:1000E00014F066F82E88698804F1080021B18A1995 +:1000F00096B200F06AFA06E0637F628808339919C5 +:1001000089B2FFF78DFE474501D1208960813046D5 +:10011000CCE78188C088814201D10120704700204E +:10012000704701898088814201D1012070470020F9 +:10013000704770B58588C38800F1280425F4004213 +:1001400023F4004114449D421AD08389058A5E1924 +:1001500025886388EC18A64214D313B18B4211D3BF +:100160000EE0437F08325C192244408892B2801A24 +:1001700080B22333984201D211B103E08A4201D107 +:10018000002070BD012070BD2DE9F0478846C18870 +:100190000446008921F4004604F1280720F40045B4 +:1001A00007EB060900F001FA002178BBB54204D93B +:1001B000627FA81B801A002503E06088627F801B95 +:1001C000801A083823D4E28962B1B9F80020B9F85E +:1001D00002303BB1E81A2177404518DBE08938440A +:1001E000801A09E0801A217740450ADB607FE189A7 +:1001F0000830304439440844C01EA4F81280BDE8D9 +:10020000F087454503DB01202077E7E7FFE76182C0 +:100210000020F4E72DE9F74F044600F12805C088D7 +:10022000884620F4004A608A05EB0A0608B140457A +:1002300002D20020BDE8FE8FE08978B13788B6F899 +:10024000029007EB0901884200D0FFDF207F4FF0CA +:10025000000B50EA090106D088B33BE00027A07FDD +:10026000B9463071F2E7E18959B1607F294408301D +:1002700050440844B4F81F1020F8031D94F82110CE +:100280008170E28907EB080002EB0801E181308010 +:10029000A6F802B002985F4650B1637F30880833F9 +:1002A000184481B26288A01DFFF7BAFDE78121E002 +:1002B000607FE18908305044294408442DE0FFE77D +:1002C000E089B4F81F102844C01B20F8031D94F8DF +:1002D0002110817009EB0800E28981B202EB08006D +:1002E000E081378071800298A0B1A01D00F06DF907 +:1002F000A4F80EB0A07F401CA077A07D08B1E088D4 +:10030000A08284F816B000BFA4F812B084F817B029 +:1003100001208FE7E0892844C01B30F8031DA4F8B2 +:100320001F10807884F82100EEE710B5818800F175 +:10033000280321F400442344848AC288A14212D0B5 +:10034000914210D0818971B9826972B11046FFF76C +:10035000E8FE50B91089283220F400401044197981 +:100360000079884201D1002010BD184610BD00F16F +:100370002803407F08300844C01E1060088808B970 +:10038000DB1E136008884988084480B270472DE955 +:10039000F04100F12806407F1C4608309046431883 +:1003A00008884D88069ADB1EA0B1C01C80B290421E +:1003B00014D9801AA04200DB204687B298183A462A +:1003C000414613F0C9FE002816D1E01B84B2B844A0 +:1003D000002005E0ED1CADB2F61EE8E7101A80B271 +:1003E0000119A94206D8304422464146BDE8F041F1 +:1003F00013F0B2BE4FF0FF3058E62DE9F04100F1A6 +:100400002804407F1E46083090464318002508887F +:100410004F88069ADB1E90B1C01C80B2904212D960 +:10042000801AB04200DB304685B299182A46404611 +:1004300013F0BEFE701B86B2A844002005E0FF1C2E +:10044000BFB2E41EEAE7101A80B28119B94206D899 +:1004500021183246404613F0ABFEA81985B2284653 +:1004600024E62DE9F04100F12804407F1E460830C3 +:1004700090464318002508884F88069ADB1E90B1E5 +:10048000C01C80B2904212D9801AB04200DB3046C4 +:1004900085B298182A46414613F08AFE701B86B230 +:1004A000A844002005E0FF1CBFB2E41EEAE7101AD2 +:1004B00080B28119B94206D820443246414613F031 +:1004C00077FEA81985B22846F0E5401D704710B5A3 +:1004D000044600F12801C288808820F400431944B2 +:1004E000904206D0A28922B9228A12B9A28A9042E9 +:1004F00001D1002010BD0888498831B1201D00F0CD +:1005000064F800202082012010BD637F62880833D8 +:10051000184481B2201DFFF783FCF2E70021C1815E +:1005200001774182C1758175704703881380C28944 +:1005300042B1C28822F4004300F128021A440A6042 +:10054000C08970470020704710B50446808AA0F526 +:100550007F41FF3900D0FFDFE088A082E08900B151 +:100560000120A07510BD4FF6FF71818200218175B9 +:10057000704710B50446808AA0F57F41FF3900D14D +:10058000FFDFA07D28B9A088A18A884201D1002080 +:1005900010BD012010BD8188828A914201D1807DE9 +:1005A00008B1002070470120704720F4004221F478 +:1005B00000439A4207D100F4004001F40041884210 +:1005C00001D0012070470020704730B504460088F4 +:1005D0000D4620F40040A84200D2FFDF21884FF4EE +:1005E000004088432843208030BD70B50C0005468C +:1005F00009D0082C00D2FFDF1DB1A1B2286800F09D +:1006000044F8201D70BD0DB100202860002070BD91 +:100610000021026803E093881268194489B2002A15 +:10062000F9D100F032B870B500260D46044608290D +:1006300000D2FFDF206808B91EE0044620688188E8 +:10064000A94202D001680029F7D181880646A94253 +:1006500001D100680DE005F1080293B20022994231 +:1006600009D32844491B0260818021680968216000 +:100670000160206000E00026304670BD00230B6062 +:100680008A8002680A600160704700234360021D8F +:10069000018102607047F0B50F4601884088154619 +:1006A0000C181E46AC4200D3641B3044A84200D94B +:1006B000FFDFA019A84200D9FFDF3819F0BD2DE9EE +:1006C000F041884606460188408815460C181F46AA +:1006D000AC4200D3641B3844A84200D9FFDFE019C4 +:1006E000A84200D9FFDF70883844708008EB04000E +:1006F000BDE8F0812DE9F041054600881E46174609 +:10070000841B8846BC4200D33C442C80688830441B +:10071000B84200D9FFDFA019B84200D9FFDF6888CE +:100720003044688008EB0400E2E72DE9F0410688D8 +:100730001D460446701980B2174688462080B8428C +:1007400001D3C01B20806088A84200D2FFDF70194F +:10075000B84200D9FFDF6088401B608008EB0600CC +:10076000C6E730B50D460188CC18944200D3A41AD0 +:100770004088984200D8FFDF281930BD2DE9F041AC +:10078000C84D04469046A8780E46A04200D8FFDF28 +:1007900005EB8607B86A50F8240000B1FFDFB8689F +:1007A000002816D0304600F044F90146B868FFF73B +:1007B0003AFF05000CD0B86A082E40F8245000D348 +:1007C000FFDFB9484246294650F826302046984770 +:1007D0002846BDE8F0812DE9F8431E468C19914664 +:1007E0000F460546FF2C00D9FFDFB14500D9FFDFDA +:1007F000E4B200954DB300208046E81C20F00300D1 +:10080000A84200D0FFDF4946DFF89892684689F891 +:10081000001089F8017089F8024089F8034089F8CE +:10082000044089F8054089F8066089F80770414658 +:1008300000F008F9002142460F464B460098C01CC4 +:1008400020F00300009012B10EE00120D4E703EB8A +:100850008106B062002005E0D6F828C04CF8207070 +:10086000401CC0B2A042F7D30098491C00EB8400A2 +:10087000C9B200900829E1D3401BBDE8F88310B548 +:10088000044603F071FD08B1102010BD2078854AA0 +:10089000618802EB800092780EE0836A53F8213081 +:1008A00043B14A1C6280A180806A50F82100A06098 +:1008B000002010BD491C89B28A42EED86180052013 +:1008C00010BD70B505460C46084603F04DFD08B155 +:1008D000102070BD082D01D3072070BD25700020A9 +:1008E000608070BD0EB56946FFF7EBFF00B1FFDF1A +:1008F0006846FFF7C4FF08B100200EBD01200EBD01 +:1009000010B50446082800D3FFDF6648005D10BD1F +:100910003EB5054600246946FFF7D3FF18B1FFDF57 +:1009200001E0641CE4B26846FFF7A9FF0028F8D094 +:100930002846FFF7E5FF001BC0B23EBD5949897844 +:10094000814201D9C0B27047FF2070472DE9F041C4 +:10095000544B062903D007291CD19D7900E00025BE +:1009600000244FF6FF7603EB810713F801C00AE07D +:100970006319D7F828E09BB25EF823E0BEF1000FC0 +:1009800004D0641CA4B2A445F2D8334603801846B0 +:10099000B34201D100201CE7BDE8F041EEE6A0F52E +:1009A0007F43FF3B01D0082901D300207047E5E6D3 +:1009B000A0F57F42FF3A0BD0082909D2394A937833 +:1009C000834205D902EB8101896A51F82000704702 +:1009D000002070472DE9F04104460D46A4F57F4103 +:1009E00043F20200FF3902D0082D01D30720F0E6C0 +:1009F0002C494FF000088A78A242F8D901EB85060D +:100A0000B26A52F82470002FF1D0274839462030BE +:100A100050F8252020469047B16A284641F82480A6 +:100A200000F007F802463946B068FFF727FE0020BD +:100A3000CFE61D49403131F810004FF6FC71C01C63 +:100A4000084070472DE9F843164E884605460024B5 +:100A50002868C01C20F0030028602046FFF7E9FF4B +:100A6000315D4843B8F1000F01D0002200E02A6850 +:100A70000146009232B100274FEA0D00FFF7B5FDA5 +:100A80001FB106E001270020F8E706EB8401009A79 +:100A90008A602968641C0844E4B22860082CD7D313 +:100AA000EBE60000500600204C47020070B50E46F1 +:100AB0001D46114600F0D4F804462946304600F0A1 +:100AC000D8F82044001D70BD2DE9F04190460D4638 +:100AD00004004FF0000610D00027E01C20F00300B7 +:100AE000A04200D0FFDFDDB141460020FFF77DFDD1 +:100AF0000C3000EB850617B112E00127EDE7614FDE +:100B000004F10C00A9003C602572606000EB8500D8 +:100B10002060606813F0EDFB41463868FFF765FD23 +:100B20003046BDE8F0812DE9FF4F564C804681B03C +:100B300020689A46934600B9FFDF2068027A424552 +:100B400003D9416851F8280020B143F2020005B0F2 +:100B5000BDE8F08F5146029800F082F886B2584600 +:100B60000E9900F086F885B27019001D87B22068D2 +:100B7000A14639460068FFF756FD04001FD0678084 +:100B800025802946201D0E9D07465A4601230095C3 +:100B9000FFF768F92088314638440123029ACDF8DE +:100BA00000A0FFF75FF92088C1193846FFF78AF9DE +:100BB000D9F800004168002041F82840C7E7042028 +:100BC000C5E770B52F4C0546206800B9FFDF2068E7 +:100BD000017AA9420ED9426852F8251051B100237A +:100BE00042F825304A880068FFF748FD2168002058 +:100BF0000A7A08E043F2020070BD4B6853F82030D7 +:100C000033B9401CC0B28242F7D80868FFF700FD34 +:100C1000002070BD70B51B4E05460024306800B939 +:100C2000FFDF3068017AA94204D9406850F82500F6 +:100C300000B1041D204670BD70B5124E054600245B +:100C4000306800B9FFDF3068017AA94206D94068F0 +:100C500050F8251011B131F8040B4418204670BD2E +:100C600010B50A460121FFF7F6F8C01C20F003007A +:100C700010BD10B50A460121FFF7EDF8C01C20F0A9 +:100C8000030010BD7000002070B50446C2F11005CD +:100C9000281913F08DFA15F0FF0108D0491EC9B2CA +:100CA000802060542046BDE8704013F000BB70BD4A +:100CB00030B505E05B1EDBB2CC5CD55C6C40C45447 +:100CC000002BF7D130BD10B5002409E00B78521E7F +:100CD00044EA430300F8013B11F8013BD2B2DC09BE +:100CE000002AF3D110BD2DE9F04389B01E46DDE99D +:100CF000107990460D00044622D002460846F94974 +:100D0000FDF77CFC102221463846FFF7DCFFE07B34 +:100D1000000606D5F34A3946102310320846FFF77D +:100D2000C7FF102239464846FFF7CDFFF87B000683 +:100D300006D5EC4A4946102310320846FFF7B8FFA3 +:100D40001021204613F0B3FA0DE0103EB6B208EBC6 +:100D50000601102322466846FFF7AAFF22462846CE +:100D60006946FDF74BFC102EEFD818D0F2B2414681 +:100D70006846FFF789FF10234A46694604A8FFF733 +:100D800097FF1023224604A96846FFF791FF2246E9 +:100D900028466946FDF732FC09B0BDE8F083102310 +:100DA0003A464146EAE770B59CB01E4605461346F2 +:100DB00020980C468DF80800202219460DF10900F4 +:100DC00013F0F6F9202221460DF1290013F0F0F975 +:100DD00017A913A8CDE90001412302AA31462846EC +:100DE000FFF781FF1CB070BD2DE9FF4F9FB014AE1F +:100DF000DDE92D5410AFBB49CDE900762023203129 +:100E00001AA8FFF770FF4FF000088DF808804FF028 +:100E100001098DF8099054F8010FCDF80A00A08857 +:100E2000ADF80E0014F8010C1022C0F340008DF84C +:100E3000100055F8010FCDF81100A888ADF8150085 +:100E400015F8010C2C99C0F340008DF8170006A886 +:100E5000824613F0ADF90AA883461022229913F0B6 +:100E6000A7F9A0483523083802AA40688DF83C80CD +:100E7000CDE900760E901AA91F98FFF734FF8DF880 +:100E800008808DF809902068CDF80A00A088ADF898 +:100E90000E0014F8010C1022C0F340008DF8100071 +:100EA0002868CDF81100A888ADF8150015F8010CD8 +:100EB0002C99C0F340008DF81700504613F078F9D4 +:100EC00058461022229913F073F9864835230838C2 +:100ED00002AA40688DF83C90CDE900760E901AA9E0 +:100EE0002098FFF700FF23B0BDE8F08FF0B59BB06E +:100EF0000C460546DDE922101E461746DDE9203284 +:100F0000D0F801C0CDF808C0B0F805C0ADF80CC0ED +:100F10000078C0F340008DF80E00D1F80100CDF844 +:100F20000F00B1F80500ADF8130008781946C0F3BA +:100F300040008DF815001088ADF8160090788DF8F7 +:100F400018000DF11900102213F032F90DF12900EB +:100F50001022314613F02CF90DF1390010223946D8 +:100F600013F026F917A913A8CDE90001412302AA1D +:100F700021462846FFF7B7FE1BB0F0BDF0B5A3B081 +:100F800017460D4604461E46102202A8289913F063 +:100F90000FF906A82022394613F00AF90EA82022DC +:100FA000294613F005F91EA91AA8CDE9000150231E +:100FB00002AA314616A8FFF796FE1698206023B0C5 +:100FC000F0BDF0B589B00446DDE90E070D4639786D +:100FD000109EC1F340018DF8001031789446C1F3A2 +:100FE00040018DF801101968CDF802109988ADF80C +:100FF000061099798DF808100168CDF809108188DC +:10100000ADF80D1080798DF80F0010236A46614607 +:1010100004A8FFF74DFE2246284604A9FDF7EEFA84 +:10102000D6F801000090B6F80500ADF80400D7F836 +:101030000100CDF80600B7F80500ADF80A00002061 +:10104000039010236A46214604A8FFF731FE22468A +:10105000284604A9FDF7D2FA09B0F0BD1FB51C68F7 +:1010600000945B68019313680293526803920246EE +:1010700008466946FDF7C2FA1FBD10B588B00446A0 +:10108000106804905068059000200690079008466C +:101090006A4604A9FDF7B2FABDF80000208008B046 +:1010A00010BD1FB51288ADF800201A88ADF80220D7 +:1010B0000022019202920392024608466946FDF719 +:1010C0009DFA1FBD7FB5074B14460546083B9A1C89 +:1010D0006846FFF7E6FF224669462846FFF7CDFF40 +:1010E0007FBD0000A447020070B5044600780E469C +:1010F000012813D0052802D0092813D10EE0A068DA +:1011000061690578042003F0BDF8052D0AD0782325 +:1011100000220420616903F00BF803E004206169F8 +:1011200003F0B0F831462046BDE8704001F086B8C3 +:1011300010B500F12D02C3799478411D64F00304C9 +:101140002340C371DB070DD04B79547923404B7199 +:101150000B79127913400B718278C9788A4200D9D1 +:10116000817010BD00224A710A71F5E741780129AA +:1011700000D00C21017070472DE9F04F93B04FF073 +:10118000000B0C690D468DF820B0097801260C2063 +:1011900017464FF00D084FF0110A4FF008091B29B0 +:1011A00075D2DFE811F01B00C30206031E035D03C6 +:1011B0007003A203B703F803190461049304A004A5 +:1011C000EC042A05340552055D05EE0531063406AA +:1011D00063067F06F9061D07E606EB0614B12078C4 +:1011E0001D282AD0D5F808805FEA08004FD00120DA +:1011F0008DF82000686A02220D908DF824200A20C4 +:101200008DF82500A8690A90A8880028EED098F8E3 +:10121000001091B10F2910D27ED2DFE801F07D13CA +:1012200049DEFEFDFCFBFAF938089CF8F7000228BD +:101230002DD124B120780C2801D00026EFE38DF8C1 +:101240002020CBE10420696A03F01CF8A888072855 +:10125000EED1204600F0EDFF022809D0204600F034 +:10126000E8FF032807D9204600F0E3FF072802D251 +:101270000120207004E0002CB8D020780128D7D1BC +:1012800098F80400C11F0A2902D30A2061E0C4E1D2 +:10129000A070D8F80010E162B8F80410218698F820 +:1012A000060084F83200012028700320207044E0FA +:1012B0000728BDD1002C99D020780D28B8D198F8F6 +:1012C000031094F82F20C1F3C000C2F3C0021042F3 +:1012D00001D0062000E00720890707D198F8051003 +:1012E0000142D2D198F806100142CED194F83120B3 +:1012F00098F8051020EA02021142C6D194F8322073 +:1013000098F8061090430142BFD198F80400C11F1D +:101310000A29BAD2617D00E006E281427ED8D8F87F +:1013200000106160B8F80410218198F80600A072DE +:10133000012028700E20207003208DF82000686A9C +:101340000D9004F12D000990601D0A900F300B9054 +:1013500022E12875FDE3412891D1204600F069FF84 +:10136000042802D1E078C00704D1204600F061FFD4 +:101370000F2884D1A88CD5F80C8080B24FF0400B98 +:10138000E669FFF747FC324641465B464E46CDF8DC +:101390000090FFF732F80B208DF82000686A0D905E +:1013A000E0690990002108A8FFF79EFE2078042834 +:1013B00006D0A07D58B1012809D003280AD049E3FE +:1013C00005202070032028708DF82060CDE184F87E +:1013D00000A032E712202070E9E11128BCD120469C +:1013E00000F027FF042802D1E078C00719D020467A +:1013F00000F01FFF062805D1E078C00711D1A07DBD +:1014000002280ED0204600F014FF08E0CAE081E078 +:101410006FE14EE121E101E1E7E017E0ADE11128E4 +:101420009AD1102208F1010104F13C0012F0C0FE33 +:10143000607801287ED012202070E078C00760D04C +:10144000A07D0028C8D00128C6D05AE0112890D12C +:10145000204600F0EEFE082804D0204600F0E9FE09 +:10146000132886D104F16C00102208F10101064610 +:1014700012F09EFE207808280DD014202070E1780C +:10148000C8070DD0A07D02280AD06278022A04D0B5 +:101490000328A1D035E00920F0E708B1012837D1B1 +:1014A000C80713D0A07D02281DD000200090D4E9E9 +:1014B000062133460EA8FFF776FC10220EA904F190 +:1014C0003C0012F049FEC8B1042042E7D4E90912F9 +:1014D000201D8DE8070004F12C0332460EA8616B35 +:1014E000FFF76FFDE9E7606BC1F34401491E006837 +:1014F000C84000F0010040F08000D7E720780928BC +:1015000006D185F800908DF8209033E32870ECE345 +:101510000920FBE711289AD1204600F08AFE0A280C +:1015200002D1E078C00704D1204600F082FE1528E1 +:101530008DD100E08DE104F13C00102208F10101A1 +:10154000064612F035FE20780A2816D016202070A4 +:10155000D4E90932606B611D8DE80F0004F15C0372 +:1015600004F16C0247310EA8FFF7C0FC10220EA94F +:10157000304612F0F1FD18B1F5E20B20207071E257 +:101580002046FFF7D5FDA078216A0A18C0F11001A6 +:10159000104612F08CFE23E3394608A8FFF7A4FD9D +:1015A00006463BE20228B6D1204600F042FE04285F +:1015B00004D3204600F03DFE082809D3204600F061 +:1015C00038FE0E2829D3204600F033FE122824D2FC +:1015D000A07D02289FD10E208DF82000686A0D9012 +:1015E00098F801008DF82400F0E3022893D12046FA +:1015F00000F01FFE002810D0204600F01AFE01283F +:10160000F9D0204600F015FE0C28F4D004208DF807 +:10161000240098F801008DF825005EE21128FCD125 +:10162000002CFAD020781728F7D16178606A022957 +:1016300011D0002101EB4101182606EBC101102257 +:10164000405808F1010112F0B3FD0420696A00F06E +:10165000E3FD2670F1E50121ECE70B28DDD1002C3C +:10166000DBD020781828D8D16078616A02281CD095 +:101670005FF0000000EB4002102000EBC2000958B0 +:10168000B8F8010008806078616A02280FD0002055 +:1016900000EB4002142000EBC2000958404650F80D +:1016A000032F0A604068486039E00120E2E701202A +:1016B000EEE71128B1D1002CAFD020781928ACD199 +:1016C0006178606A022912D05FF0000101EB4101EC +:1016D0001C2202EBC1011022405808F1010112F056 +:1016E00067FD0420696A00F097FD1A20B6E0012129 +:1016F000ECE7082891D1002C8FD020781A288CD1C3 +:10170000606A98F80120017862F347010170616A0C +:10171000D8F8022041F8012FB8F80600888004208C +:10172000696A00F079FD8EE2072012E63878012818 +:1017300094D1182204F11400796812F07EFDE0794A +:10174000C10894F82F0001EAD001E07861F30000AD +:10175000E070217D002974D12178032909D0C007C8 +:1017600025D0032028708DF82090686A0D904120C4 +:1017700004E3607DA178884201D90620E9E50226CC +:101780002671E179204621F0E001E171617A21F0D2 +:10179000F0016172A17A21F0F001A172FFF7C8FC9B +:1017A0002E708DF82090686A0D900720E6E20420E4 +:1017B000ACE6387805289DD18DF82000686A0D9038 +:1017C000B8680A900720ADF824000A988DF830B068 +:1017D0006168016021898180A17A81710420207073 +:1017E000F4E23978052985D18DF82010696A0D91C8 +:1017F000391D09AE0EC986E80E004121ADF824104E +:101800008DF830B01070A88CD7F80C8080B24026CC +:10181000A769FFF711FA41463A463346C846CDF864 +:101820000090FEF71EFE002108A8FFF75DFCE0789F +:1018300020F03E00801CE0702078052802D00F20A8 +:101840000CE049E1A07D20B1012802D0032802D09C +:1018500002E10720BFE584F80080EEE42070ECE4AC +:10186000102104F15C0002F034FA606BB0BBA07D83 +:1018700018B1012801D00520FDE006202870F748A6 +:101880006063A063BEE23878022894D1387908B149 +:101890002875B3E3A07D022802D0032805D022E0FA +:1018A000B8680028F5D060631CE06078012806D095 +:1018B000A07994F82E10012805D0E84806E0A17917 +:1018C00094F82E00F7E7B8680028E2D06063E0786B +:1018D000C00701D0012902D0E04803E003E0F86826 +:1018E0000028D6D0A063062010E68DF82090696A03 +:1018F0000D91E1784846C90709D06178022903D1E2 +:10190000A17D29B1012903D0A17D032900D00720A1 +:10191000287031E138780528BBD1207807281ED0FF +:1019200084F800A005208DF82000686A0D90B86842 +:101930000A90ADF824A08DF830B003210170E17851 +:10194000CA070FD0A27D022A1AD000210091D4E943 +:10195000061204F15C03401CFFF725FA67E384F8E4 +:101960000090DFE7D4E90923211D8DE80E0004F182 +:101970002C0304F15C02401C616BFFF722FB56E371 +:10198000626BC1F34401491E1268CA4002F00101B2 +:1019900041F08001DAE738780528BDD18DF82000C4 +:1019A000686A0D90B8680A90ADF824A08DF830B040 +:1019B000042100F8011B102204F15C0112F0F8FB75 +:1019C000002108A8FFF790FB2078092801D01320F8 +:1019D00044E70A2020709BE5E078C10742D0A17D52 +:1019E000012902D0022927D038E0617808A801290E +:1019F00016D004F16C010091D4E9061204F15C03E5 +:101A0000001DFFF7BBFA0A20287003268DF82080FE +:101A1000686A0D90002108A8FFF766FBDDE2C3E2CB +:101A200004F15C010091D4E9062104F16C03001D6E +:101A3000FFF7A4FA0026E9E7C0F3440114290DD208 +:101A40004FF0006101EBB0104FEAB060E0706078D9 +:101A5000012801D01020BEE40620FFE660780128AE +:101A60003FF4B7AC0A2051E5E178C90708D0A17D61 +:101A7000012903D10B20287004202FE028702DE0CD +:101A80000E2028706078616B012817D004F15C0388 +:101A900004F16C020EA8FFF7E1FA2046FFF748FBBD +:101AA000A0780EAEC0F11001304412F000FC062008 +:101AB0008DF82000686A09960D909AE004F16C0395 +:101AC00004F15C020EA8FFF7C9FAE9E739780229A8 +:101AD00003D139790029D1D029758FE28DF8200002 +:101AE000686A0D9058E538780728F6D1D4E90921BD +:101AF0006078012808D004F16C00CDE90002029161 +:101B000005D104F16C0304E004F15C00F5E704F195 +:101B10005C0304F14C007A680646216AFFF764F919 +:101B20006078012821D1A078216A0A18C0F110013B +:101B3000104612F0BCFBD4E90923606B04F12D01BF +:101B40008DE80F0004F15C0304F16C0231460EA82D +:101B500000E055E2FFF7CAF910220EA904F13C009B +:101B600012F0FAFA08B10B20AFE485F8008000BF4C +:101B70008DF82090686A0D908DF824A00CE53878D7 +:101B80000528AAD18DF82000686A0D90B8680A90DF +:101B9000ADF824A08DF830B080F80080617801297C +:101BA0001AD0D4E9093204F12D01A66B03920096F4 +:101BB000CDE9011304F16C0304F15C0204F14C0162 +:101BC000401CFFF793F9002108A8FFF78DFA607811 +:101BD000012805D0152041E6D4E90923611DE4E779 +:101BE0000E20287006208DF82000686ACDF824B0F9 +:101BF0000D90A0788DF82800CEE438780328C0D165 +:101C0000E079C00770D00F202870072066E7387889 +:101C100004286BD11422391D04F1140012F00DFBBD +:101C2000616A208CA1F80900616AA078C871E17925 +:101C3000626A01F003011172616A627A0A73616A71 +:101C4000A07A81F82400162060E485F800A08DF8C1 +:101C50002090696A50460D9190E00000A447020070 +:101C60003878052842D1B868A8616178606A02298D +:101C700001D0012100E0002101EB4101142606EB17 +:101C8000C1014058082102F024F86178606A0229F5 +:101C900001D0012100E0002101EB410106EBC1016F +:101CA000425802A8E169FFF70DFA6078626A0228DB +:101CB00001D0012000E0002000EB4001102000EBEB +:101CC000C1000223105802A90932FEF7F1FF626A2F +:101CD000FD4B0EA80932A169FFF7E3F96178606A4C +:101CE000022904D0012103E042E18BE0BDE00021A4 +:101CF00001EB4101182606EBC101A27840580EA95C +:101D000012F056FA6178606A022901D0012100E0E0 +:101D1000002101EB410106EBC1014058A1780844C4 +:101D2000C1F1100112F0C3FA05208DF82000686A95 +:101D30000D90A8690A90ADF824A08DF830B0062166 +:101D400001706278616A022A01D0012200E000225B +:101D500002EB420206EBC202401C8958102212F02C +:101D600027FA002108A8FFF7BFF91220C5F818B01C +:101D700028708DF82090686A0D900B208DF8240053 +:101D80000AE43878052870D18DF82000686A0D9033 +:101D9000B8680A900B20ADF824000A98072101705A +:101DA0006178626A022901D0012100E0002101EB83 +:101DB0004103102101EBC30151580988A0F801101B +:101DC0006178626A022902D0012101E02FE100213D +:101DD00001EB4103142101EBC30151580A6840F89B +:101DE000032F4968416059E01920287001208DF8BF +:101DF000300077E6162028708DF830B0002108A852 +:101E0000FFF772F9032617E114202870B0E638783E +:101E100005282AD18DF82000686A0D90B8680A90CC +:101E2000ADF824A08DF830B080F800906278616A37 +:101E30004E46022A01D0012200E0002202EB4202BB +:101E40001C2303EBC202401C8958102212F0B0F987 +:101E5000002108A8FFF748F9152028708DF82060A8 +:101E6000686A0D908DF824603CE680E0387805289B +:101E70007DD18DF82000686A0D90B8680A90ADF8A1 +:101E800024900921017061690978490841706169EC +:101E900051F8012FC0F802208988C18020781C28C1 +:101EA000A8D1A1E7E078C00702D04FF0060C01E00E +:101EB0004FF0070C607802280AD04FF0000000BFF6 +:101EC00000EB040101F1090105D04FF0010004E02D +:101ED0004FF00100F4E74FF000000B78204413EAC4 +:101EE0000C030B7010F8092F02EA0C02027004D1E7 +:101EF0004FF01B0C84F800C0D2B394F801C0BCF1C1 +:101F0000010F00D09BB990F800C0E0465FEACC7C9E +:101F100004D028F001060670102606E05FEA887CEF +:101F200005D528F00206067013262E70032694F8B5 +:101F300001C0BCF1020F00D092B991F800C05FEA75 +:101F4000CC7804D02CF001060E70172106E05FEA71 +:101F50008C7805D52CF002060E7019212170002610 +:101F60000078D0BBCAB3C3BB1C20207035E012E0A0 +:101F700002E03878062841D11A2019E42078012897 +:101F80003CD00C283AD02046FFF7F0F809208DF815 +:101F90002000686A0D9031E03878052805D00620C9 +:101FA000387003261820287046E005218DF820108F +:101FB000686A0D90B8680A900220ADF824000120EC +:101FC0008DF830000A980170297D4170394608A8C3 +:101FD000FFF78AF8064618202870012E0ED02BE055 +:101FE00001208DF82000686A0D9003208DF82400F0 +:101FF000287D8DF8250085F814B012E0287D80B189 +:102000001D202070172028708DF82090686A0D9090 +:1020100002208DF82400394608A8FFF765F8064627 +:102020000AE00CB1FE2020709DF8200020B10021B4 +:1020300008A8FFF759F810E413B03046BDE8F08F58 +:102040002DE9F04387B00C464E6900218DF804104D +:1020500001202578034602274FF007094FF0050CB1 +:1020600085B1012D53D0022D39D1FE2030708DF86D +:102070000030606A059003208DF80400207E8DF802 +:10208000050063E02179012925D002292DD00329FB +:1020900028D0042923D1B17D022920D131780D1F08 +:1020A000042D04D30A3D032D01D31D2917D1218905 +:1020B000022914D38DF80470237020899DF8041030 +:1020C00088421BD2082001E09C4702008DF80000E6 +:1020D000606A059057E070780128EBD0052007B0C2 +:1020E000BDE8F0831D203070E4E771780229F5D156 +:1020F00031780C29F3D18DF80490DDE7083402F82B +:1021000004CB94E80B0082E80B000320E7E7157886 +:10211000052DE4D18DF800C0656A05959568029596 +:102120008DF8101094F80480B8F1010F13D0B8F1B5 +:10213000020F2DD0B8F1030F1CD0B8F1040FCED18F +:10214000ADF804700E202870207E6870002168466B +:10215000FEF7CAFF0CE0ADF804700B202870207E5B +:10216000002100F01F0068706846FEF7BDFF377061 +:102170000020B4E7ADF804708DF8103085F800C089 +:10218000207E6870277011466846FEF7ADFFA6E70F +:10219000ADF804902B70207F6870607F00F0010024 +:1021A000A870A07F00F01F00E870E27F2A71C007CE +:1021B0001CD094F8200000F00700687194F821000A +:1021C00000F00700A87100216846FEF78DFF28681F +:1021D000F062A8883086A87986F83200A069407835 +:1021E00070752879B0700D203070C1E7A9716971E0 +:1021F000E9E700B587B004280CD101208DF8000074 +:102200008DF80400002005918DF805000146684610 +:10221000FEF76AFF07B000BD70B50C46054602F038 +:1022200031F821462846BDE870407823002201F0AD +:102230007FBF08B1007870470C20704770B50C0064 +:1022400005784FF000010CD021702146F3F701F81A +:1022500069482178405D884201D1032070BD022089 +:1022600070BDF2F7F6FF002070BD0279012A05D09B +:1022700000220A704B78012B02D003E00420704743 +:102280000A758A6102799300521C0271C1500320C1 +:102290007047F0B587B00F4605460124287905EB55 +:1022A000800050F8046C7078411E02290AD252490D +:1022B0003A46083901EB8000314650F8043C284684 +:1022C000984704460CB1012C11D12879401E10F01A +:1022D000FF00287101D00324E0E70A208DF80000F8 +:1022E000706A0590002101966846FFF7A7FF032C4E +:1022F000D4D007B02046F0BD70B515460A46044656 +:1023000029461046FFF7C5FF064674B12078FE281F +:102310000BD1207C30B100202870294604F10C003C +:10232000FFF7B7FF2046FEF721FF304670BD70472C +:1023300070B50E4604467C2111F0DBFF0225012E0C +:1023400003D0022E04D0052070BD0120607000E093 +:1023500065702046FEF70AFFA575002070BD28B104 +:10236000027C1AB10A4600F10C01C5E70120704752 +:1023700010B5044686B0042001F084FF2078FE28C2 +:1023800006D000208DF8000069462046FFF7E7FFE1 +:1023900006B010BD7CB50E4600218DF804104178C2 +:1023A000012903D0022903D0002405E0046900E0DC +:1023B00044690CB1217C89B16D4601462846FFF77E +:1023C00054FF032809D1324629462046FFF794FFDF +:1023D0009DF80410002900D004207CBD04F10C05F8 +:1023E000EBE730B40C460146034A204630BC034BB1 +:1023F0000C3AFEF756BE0000E04702009C47020080 +:1024000070B50D46040011D085B12101284611F0A8 +:102410004EFF10224E49284611F0CAFE4C480121B9 +:102420000838018044804560002070BD012070BDE7 +:1024300070B5474E00240546083E10E07068AA7B40 +:1024400000EB0410817B914208D1C17BEA7B914271 +:1024500004D10C22294611F07FFE30B1641C308873 +:102460008442EBDB4FF0FF3070BD204670BD70B58D +:102470000D46060006D02DB1FFF7DAFF002803DB7A +:10248000401C14E0102070BD314C083C208862884C +:10249000411C914201D9042070BD6168102201EBFA +:1024A0000010314611F084FE2088401C20802870E6 +:1024B000002070BD70B514460D0018D0BCB10021CD +:1024C000A170022802D0102811D105E0288870B12F +:1024D0000121A170108008E02846FFF7A9FF00281D +:1024E00005DB401CA070A8892080002070BD012061 +:1024F00070BD70B5054614460E000BD0002030703C +:10250000A878012808D005D91149A1F108010A8845 +:1025100090420AD9012070BD24B128782070288803 +:10252000000A5070022008700FE064B14968102260 +:1025300001EB00112046103911F03AFE2878207383 +:102540002888000A607310203070002070BD0000E1 +:102550007C0000202DE9F04190460C4607460025FE +:10256000FE48072F00EB881607D2DFE807F00707C1 +:10257000070704040400012500E0FFDF06F81470DB +:10258000002D13D0F548803000EB880191F827002A +:10259000202803D006EB4000447001E081F826407B +:1025A00006EB44022020507081F82740BDE8F081FE +:1025B000F0B51F4614460E460546202A00D1FFDF1F +:1025C000E649E648803100EB871C0CEB440001EB48 +:1025D0008702202E07D00CEB460140784B784870DC +:1025E000184620210AE092F82530407882F825002C +:1025F000F6E701460CEB410005704078A142F8D1A6 +:1026000092F82740202C03D00CEB4404637001E0C7 +:1026100082F826300CEB41042023637082F82710E7 +:10262000F0BD30B50D46CE4B44190022181A72EB9E +:10263000020100D2FFDFCB48854200DDFFDFC94841 +:102640004042854200DAFFDFC548401C844207DA79 +:10265000002C01DB204630BDC148401C201830BD95 +:10266000BF48C043FAE710B504460168407ABE4A45 +:1026700052F82020114450B10220084420F07F403D +:10268000F0F779FA94F90810BDE81040C9E7042082 +:10269000F3E72DE9F047B14E803696F82D50DFF87C +:1026A000BC9206EB850090F8264034E009EB8517D4 +:1026B0004FF0070817F81400012806D004282ED080 +:1026C00005282ED0062800D0FFDF01F0E3F80146F0 +:1026D00007EB4400427806EB850080F8262090F84E +:1026E0002720A24202D1202280F82720084601F0AC +:1026F000DCF82A4621460120FFF72CFF9B48414683 +:1027000000EB041002682046904796F82D5006EB27 +:10271000850090F82640202CC8D1BDE8F087022023 +:1027200000E003208046D0E710B58C4C2021803497 +:1027300084F8251084F8261084F82710002084F8E7 +:10274000280084F82D0084F82E10411EA16044F862 +:10275000100B2074607420736073A0738449E07759 +:1027600020750870487000217C4A103C02F8110066 +:10277000491CC9B22029F9D30120F0F7EAF800205A +:10278000F0F7E7F8012084F82200F9F7D1FA794848 +:10279000F9F7DDFA764CA41E20707748F9F7D7FADE +:1027A0006070BDE81040F0F761B810B5F0F783F83D +:1027B0006F4CA41E2078F9F7E3FA6078F9F7E0FA95 +:1027C000BDE8104001F09EB8202070472DE9F34F7E +:1027D000624E0025803606EB810A89B09AF8250002 +:1027E000202822D0691E02916049009501EB00105B +:1027F0008146D0E90112C0680391CDE90420B08B75 +:10280000ADF81C00B07F8DF81E009DF81500C8B112 +:102810000227554951F820400399E219114421F04B +:102820007F41019184B102210FE00120F0F791F87E +:102830000020F0F78EF8F0F75CF801F063F886F806 +:102840002F50A0E00427E4E700218DF8181002289B +:1028500001D0012820D10398391901440998081A98 +:102860009DF81C1020F07F4001B1022133318142DC +:102870000BD203208DF815000398C4F13201401AE1 +:1028800020F07F40322403900CE096F8240018B921 +:10289000F0F782FB00284CD0322C03D214B101F0A7 +:1028A00025F801E001F02EF8314A107818B393466C +:1028B0005278039B121B00219DF81840984601286E +:1028C0001AD0032818D000208DF81E00002A04DD3D +:1028D000981A039001208DF818009DF81C0000B193 +:1028E00002210398254A20F07F40039003AB09980A +:1028F00001F014F810B110E00120E5E79DF81D008B +:1029000018B99BF80000032812D08DF81C50CDF8A0 +:102910000C808DF818408DF81E509DF8180058B1A5 +:1029200003980123C11900221846F0F765F806E064 +:1029300000200BB0BDE8F08F0120F0F70AF899F9FC +:102940000C20012300200199F0F756F8012086F8A9 +:102950002F008AF828502022694611E098080020AC +:10296000FF7F841E0020A107F04702009806002088 +:102970008E000020DF3F010093260100FFFF3F0093 +:10298000F94811F05AFC0120D3E72DE9F05FDFF898 +:10299000D883064608EB860090F82550202D1FD0DE +:1029A000A8F180002C4600EB8617A0F50079DFF82F +:1029B000BCB305E0A24607EB4A004478202C0AD0BD +:1029C000F0F766F809EB04135A4601211B1D00F0CD +:1029D000A5FF0028EED0AC4202D0334652461EE09E +:1029E000E34808B1AFF30080F0F752F898F82F20D1 +:1029F0006AB1D8F80C20411C891A0902CA1701EBE8 +:102A000012610912002902DD0020BDE8F09F314665 +:102A1000FFF7DCFE08B10120F7E733462A46202104 +:102A20000420FFF7C5FDEFE72DE9F041CE4C256905 +:102A3000F0F72EF8401B0002C11700EB11600012E6 +:102A400000D4FFDF94F8220000B1FFDF012784F8F3 +:102A5000227094F82E00202800D1FFDF94F82E6019 +:102A6000202084F82E00002584F82F5084F8205070 +:102A700084F82150BF4825600078022833D003280D +:102A800031D000202077A068401C05D04FF0FF30E7 +:102A9000A0600120EFF75DFF0020EFF75AFFF0F78D +:102AA00058F8F0F750F8EFF724FF10F0D7FDB248D0 +:102AB000056005604FF0E0214FF40040B846C1F8D2 +:102AC0008002F0F7E0F894F82D703846FFF75DFFCC +:102AD0000028FAD0A448803800EB871010F81600C0 +:102AE000022802D006E00120CCE73A463146062013 +:102AF000FFF730FD84F8238004EB870090F8260070 +:102B0000202804D09B48801E4078F9F73FF9207FA9 +:102B1000002803D0F0F70DF82577657746E50146E4 +:102B2000914810B590F82D200024803800EB8210D9 +:102B300010F814302BB1641CE4B2202CF8D3202000 +:102B400010BD8E4800EB0410016021460120FFF704 +:102B500001FD204610BD10B5012801D0032800D189 +:102B600071B3814A92F82D307F4C0022803C04EBF7 +:102B7000831300BF13F812400CB1082010BD521C83 +:102B8000D2B2202AF6D37B4A48B1022807D00729BF +:102B900016D2DFE801F01506080A0C0E100000211D +:102BA0000AE01B2108E03A2106E0582104E07721E1 +:102BB00002E0962100E0B52151701070002010BD98 +:102BC000072010BD6B4810B54078EFF7D4FF80B2F6 +:102BD00010BD10B5202811D2634991F82D30A1F114 +:102BE000800202EB831414F810303BB191F82D30C1 +:102BF00002EB831212F81020012A01D0002010BD30 +:102C000091F82D2001460020FFF7A4FC012010BD03 +:102C100010B5EFF73DFFBDE81040EFF7ACBF2DE971 +:102C2000F0410E46504F01782025803F0C4607EBBF +:102C3000831303E0254603EB45046478944202D0F5 +:102C4000202CF7D108E0202C06D0A14206D103EBBE +:102C500041014978017007E00020A7E403EB44003C +:102C600003EB450140784870454F7EB127B1002104 +:102C700040F2DA30AFF300803078A04206D127B1BD +:102C8000002140F2DD30AFF30080357027B1002124 +:102C900040F2E230AFF30080012087E410B54268D3 +:102CA0000B689A1A1202D41702EB1462121216D48D +:102CB000497A91B1427A82B9324A006852F82110B9 +:102CC000126819441044001D891C081A0002C1171B +:102CD00000EB11600012322801DB012010BD002042 +:102CE00010BD2DE9F04781461F48244E00EB8100BE +:102CF000984690F825402020107006F50070154683 +:102D000000EB81170BE000BF06EB04104946001DE5 +:102D1000FFF7C4FF28B107EB44002C704478202C47 +:102D2000F2D1297888F8001013E000BF06EB0415F3 +:102D3000291D4846FFF7B2FF68B988F80040A97B13 +:102D400099F80A00814201D80020E6E407EB44002C +:102D50004478202CEAD10120DFE42DE9FC410E4625 +:102D600007460024054D18E018090020FFFF3F002A +:102D7000000000008E00002000F5004098060020B2 +:102D800000000000F04702009DF8000005EB001075 +:102D90008168384600F0D6FD01246B4601AA314611 +:102DA0003846FFF79EFF0028EED02046BDE8FC81A4 +:102DB00070B50446FF480125A54300EB841100EBE4 +:102DC0008510402211F0F4F9FB4E26B1002140F2AB +:102DD0005C40AFF30080F748803000EB850100EBEA +:102DE0008400D0F82500C1F8250026B100214FF459 +:102DF0008C60AFF30080284670BD2DE9FC4184460D +:102E0000EC481546089C00EB85170E4617F8140091 +:102E1000012803D0022801D00020C7E70B46E74A6B +:102E20000121604600F07AFDA8B101AB6A4629464F +:102E30003046FFF756FF70B1DE489DF804209DF83C +:102E40000010803000EB85068A4208D02B46052012 +:102E5000FFF7AEFB0BE02A462146042014E02029B0 +:102E600003D007EB4100407801E096F8250007EB1E +:102E7000440148709DF80000202809D007EB40006D +:102E800044702A4621460320FFF764FB01208DE7AA +:102E900006F8254F0120F070F3E7C94901EB001057 +:102EA000001DFFF7E0BB7CB51D46134604460E46E9 +:102EB00000F1080221461846EFF76AFE94F908006F +:102EC0000F2804DD1F3820722068401C206096B156 +:102ED0000220BC4951F82610461820686946801B1C +:102EE00020F07F40206094F908002844C01C1F286F +:102EF00003DA012009E00420EBE701AAEFF748FE1E +:102F00009DF8040010B10098401C009000992068C2 +:102F100031440844C01C20F07F4060607CBD2DE936 +:102F2000FE430C46064609786079907220799846EF +:102F30001546507241B19F48803090F82E102029DC +:102F40000AD00069401D0BE0D4E90223217903B0C7 +:102F50002846BDE8F043A6E79B484178701D084429 +:102F600020F07F47217900222846A368FFF79BFFC6 +:102F70003946284600F0E6FCD4E902322179684659 +:102F8000FFF791FF41462846019CFFF7E6FE2B46DE +:102F900022460021304600F0C1FC002803D1314612 +:102FA000284600F0CFFCBDE8FE832DE9FE4F8146A8 +:102FB00000F084FC30B1002799F8000020B1002017 +:102FC000BDE8FE8F0127F7E77A4D7B4C4FF0000AF2 +:102FD000803524B1002140F2D340AFF3008095F852 +:102FE0002D8085F823A0002624B100214FF49B609A +:102FF000AFF300801FB94046FFF7DAFE804624B1E8 +:1030000000214FF49C60AFF30080EFF741FD434691 +:103010006A464946FFF783FF24B1002140F2E640AB +:10302000AFF3008095F82E0020280CD02969009875 +:10303000401A0002C21700EB1260001203D5684666 +:1030400000F080FC012624B100214FF49E60AFF314 +:10305000008095F823000028BBD124B1002140F264 +:10306000F640AFF30080EFF713FD6B46534A0021A3 +:1030700000F054FC0028A3D027B941466846FFF76A +:103080006CFE064326B16846FFF7EDFAC9F8080062 +:1030900024B1002140F20950AFF3008001208FE7F6 +:1030A0002DE9FF5F8A46814600F008FC414C8034E0 +:1030B00010B39AF80000002710B1012800D0FFDFFC +:1030C0003D4D25B1002140F27F50AFF3008001203B +:1030D000A84600905FEA080604D0002140F287501D +:1030E000AFF30080009800F0E0FB94F82D50002032 +:1030F00084F8230067B119E094F82E0001272028F6 +:1031000000D1FFDF9AF800000028D9D0FFDFD7E711 +:103110002846FFF74DFE054626B1002140F29150AA +:10312000AFF3008094F823000028D3D126B100210A +:1031300040F29B50AFF30080EFF7AAFC83462B468A +:1031400001AA5146FFF7EBFE5FEA060804D0002112 +:1031500040F2A250AFF300803B462A4601A95846F0 +:10316000CDF80090FFF749FE064604EB850090F885 +:1031700028B0B8F1000F04D0002140F2A950AFF3FD +:10318000008000F087FB0090B8F1000F04D0002110 +:1031900040F2AF50AFF3008094F82300002899D19B +:1031A000B8F1000F04D0002140F2B750AFF3008017 +:1031B00003490BE09808002000000000FFFF3F00DB +:1031C00098060020F04702008E00002001EB091055 +:1031D0000DF1040C00F104009CE80E0080E80E00E4 +:1031E0004EB35FEA080604D0002140F2C450AFF3AA +:1031F00000803BEA070012D094F82E0020280ED160 +:1032000026B1002140F2C950AFF300802846FFF7F5 +:10321000BCFB20B99AF80000D8B3012849D0B8F116 +:10322000000F04D0002140F2E650AFF300802846A2 +:1032300000F029FB01265FEA080504D0002140F2D6 +:10324000EF50AFF30080009800F02FFB25B1002174 +:1032500040F2F350AFF300808EB194F82D0004EBF0 +:10326000800090F82600202809D025B1002140F2E6 +:10327000FA50AFF30080F9484078F8F787FD25B1A0 +:10328000002140F2FF50AFF3008004B03046BDE8AB +:10329000F09FFFE7B8F1000F04D0002140F2D150B9 +:1032A000AFF3008094F82D2049460420FFF752F92F +:1032B000C0E7002E3FF40EAF002140F2DC50AFF328 +:1032C000008007E72DE9F84FE54D814695F82D0080 +:1032D0004FF00008E34C4FF0010B474624B10021AA +:1032E00040F20D60AFF30080584600F0DEFA85F83A +:1032F000237024B1002140F21260AFF3008095F8F2 +:103300002D00FFF755FD064695F8230028B1002C47 +:10331000E4D000214FF4C3604BE024B1002140F21F +:103320001C60AFF30080CE48803800EB861111F8A6 +:103330001900032856D1334605EB830A4A469AF80A +:103340002500904201D1012000E0002000900AF108 +:1033500025000021FFF763FC01460098014203D0DD +:1033600001228AF82820AF77E1B324B1002140F28E +:103370002160AFF30080324649460120FFF7EAF8AA +:103380009AF828A024B1002140F22C60AFF300800D +:1033900000F080FA834624B1002140F23160AFF39F +:1033A000008095F8230038B1002C97D0002140F21E +:1033B0003560AFF3008091E7BAF1000F07D095F8C0 +:1033C0002E00202803D13046FFF7DFFAE0B124B108 +:1033D000002140F24960AFF30080304600F053FA1C +:1033E0004FF0010824B1002140F25260AFF3008099 +:1033F000584600F05AFA24B1002140F25660AFF36B +:1034000000804046BDE8F88F002CF1D0002140F24A +:103410004460AFF30080E6E70020EFF773BA0120C5 +:10342000EFF770BA8D48007870472DE9F0418C4C69 +:1034300094F82E0020281FD194F82D6004EB860705 +:1034400097F82550202D00D1FFDF8549803901EB09 +:10345000861000EB4500407807F8250F0120F87032 +:1034600084F82300294684F82E5032460220223464 +:10347000FFF770F8002020700FE42DE9F0417A4E3C +:10348000774C012538B1012821D0022879D00328B2 +:103490007DD0FFDFF0E700F029FAFFF7C6FF207EBE +:1034A00000B1FFDF84F821500020EFF752FAA16845 +:1034B000481C04D0012300221846EFF79DFA14F8A7 +:1034C0002E0F217806EB01110A68012154E0FFF765 +:1034D000ACFF0120EFF73DFA94F8210050B1A0684D +:1034E000401C07D014F82E0F217806EB01110A6852 +:1034F000062141E0207EDFF86481002708F1020800 +:10350000012803D002281ED0FFDFB5E7A777EFF729 +:1035100010FB98F80000032801D165772577607DBE +:10352000524951F8200094F8201051B948B161680F +:103530000123091A00221846EFF75EFA02202076CE +:103540009AE7277698E784F8205000F0CFF9A07F1B +:1035500050B198F8010061680123091A0022184649 +:10356000EFF74AFA257600E0277614F82E0F217837 +:1035700006EB01110A680021BDE8F041104700E0A8 +:1035800005E036480078BDE8F041F8F7FFBBFFF7EB +:103590004CFF14F82E0F217806EB01110A68052163 +:1035A000EAE710B52E4C94F82E00202800D1FFDF5A +:1035B00014F82E0F21782C4A02EB01110A68BDE89D +:1035C0001040042110477CB5254C054694F82E0088 +:1035D000202800D1FFDFA068401C00D0FFDF94F856 +:1035E0002E00214901AA01EB0010694690F90C0058 +:1035F0002844EFF7CDFA9DF904000F2801DD0120E2 +:1036000000E00020009908446168084420F07F41F0 +:10361000A16094F82100002807D002B00123BDE882 +:10362000704000221846EFF7E7B97CBD30B5104A6C +:103630000B1A541CB3EB940F1ED3451AB5EB940F21 +:103640001AD3934203D9101A43185B1C14E0954215 +:1036500010D9511A0844401C43420DE08C00002050 +:10366000180900200000000098060020F047020022 +:10367000FF7F841EFFDF0023184630BD0123002298 +:1036800001460220EFF7B8B90220EFF762B9EFF771 +:10369000FFB92DE9FC47B14C054694F82E002028CF +:1036A00000D1FFDF642D58D3AD4A0021521B71EBCE +:1036B000010052D394F82E20A0462046DFF8A492B1 +:1036C00090F82D7009EB0214D8F8000001AA2844E4 +:1036D0006946EFF75DFA9DF90400002802DD0098C5 +:1036E000401C0090A068009962684618B21A22F047 +:1036F0007F42B2F5800F30D208EB8702444692F841 +:103700002520202A0AD009EB02125268101A000262 +:10371000C21700EB1260001288421EDBA068401C3A +:1037200010D0EFF7B5F9A168081A0002C11700EB35 +:1037300011600012022810DD0120EFF70AF94FF0A6 +:10374000FF30A06020682844206026F07F40206180 +:10375000012084F82300BDE8FC870020FBE72DE969 +:10376000F0477E4C074694F82D00A4F1800606EB46 +:10377000801010F8170000B9FFDF94F82D50A04614 +:10378000794C24B1002140F66500AFF3008040F68B +:10379000710940F67A0A06EB851600BF16F8170085 +:1037A000012818D0042810D005280ED006280CD0E7 +:1037B0001CB100214846AFF3008020BF002CEDD0A3 +:1037C00000215046AFF30080E8E72A463946012041 +:1037D000FEF7C0FEF2E74FF0010A4FF00009454640 +:1037E00024B1002140F68100AFF30080504600F084 +:1037F0005CF885F8239024B1002140F68600AFF3F1 +:10380000008095F82D00FFF7D3FA064695F82300BF +:1038100028B1002CE4D0002140F68C001FE024B138 +:1038200000214FF40960AFF3008005EB860000F142 +:10383000270133463A462630FFF7F1F924B100213B +:1038400040F69400AFF3008000F024F8824695F82B +:10385000230038B1002CC3D0002140F69A00AFF30A +:103860000080BDE785F82D60012085F823005046D3 +:1038700000F01BF8002C04D0002140F6A700AFF3A5 +:103880000080BDE8F087354981F82D00012081F8DE +:103890002300704710B5354808B1AFF30080EFF34F +:1038A000108000F0010072B610BD10B5002804D1E0 +:1038B0002F4808B1AFF3008062B610BD2D480068F4 +:1038C000C005C00D10D0103840B2002806DA00F054 +:1038D0000F0000F1E02090F8140D03E000F1E0206B +:1038E00090F80004400970470820704710B51B4C41 +:1038F00094F82400002804D1F8F72AF8012084F86D +:10390000240010BD10B5154C94F82400002804D0F4 +:10391000F8F747F8002084F8240010BD10B51C68A3 +:103920005B68241A181A24F07F4420F07F40A142DB +:1039300006D8B4F5800F03D2904201D8012010BD03 +:10394000002010BDD0E90032D21A21F07F4311448B +:1039500021F07F41C0E900317047000018090020C4 +:10396000FF1FA107980600200000000000000000D3 +:103970000000000004ED00E02DE9F041044680075E +:103980004FF000054FF001060CD560480560066059 +:103990000FF0C6FC20B15E48016841F4806101600F +:1039A00024F00204E0044FF0FF3705D55948466083 +:1039B000C0F8087324F48054600003D556480560AD +:1039C00024F08044E0050FD55448C0F80052C0F8F8 +:1039D000087353490D60091D0D60514A04210C32D2 +:1039E0001160066124F48074A00409D54D48466036 +:1039F000C0F80052C0F808734B48056024F4005426 +:103A0000C4F38030C4F3C031884200D0FFDF14F427 +:103A1000404F14D045484660C0F80873444886605B +:103A2000C0F80052C0F8087342490D600A1D1660C4 +:103A30008660C0F808730D60166024F440442005C9 +:103A40000AD53D4846608660C0F80873C0F84873E0 +:103A50003A48056024F400640FF0DAFD3848044267 +:103A600000D0FFDFBDE8F08170B5202500221346AD +:103A700020FA02F1C90719D051B201F01F06012442 +:103A8000B4404E09B60006F1E026C6F88041C6F8FB +:103A90008042002906DA01F00F0101F1E02181F8EE +:103AA000143D03E001F1E02181F80034521CAA42E8 +:103AB000DED370BD70B5234C0D462060FFF75CFF70 +:103AC0002068FFF7D1FF2846F8F71FF80FF0FAF942 +:103AD00000F0AFF80FF09CFD0FF0E7FCF8F728F9C5 +:103AE000BDE870400FF09CBA10B5164C2068FFF787 +:103AF00043FF2068FFF7B8FF0FF08AFDF8F794F84E +:103B00000020206010BD0A2070470000FC1F00400C +:103B10003C17004000C0004004E501400080004028 +:103B20000485004000D0004004D5004000E0004083 +:103B300000F0004000F5004000B0004008B5004033 +:103B4000FEFF0FFD9000002070B526490A680AB3F9 +:103B50000022154601244B685B1C4B60092B00D3E7 +:103B60004D600E7904FA06F30E681E420FD0EFF393 +:103B7000108212F0010272B600D001220C689C4340 +:103B80000C6002B962B649680160002070BD521C29 +:103B9000092AE0D3052070BD4FF0E0214FF48000EA +:103BA000C1F800027047EFF3108111F0010F72B6F7 +:103BB0004FF0010202FA00F20A48036842EA0302E7 +:103BC000026000D162B6E7E706480021016041606B +:103BD00070470121814003480068084000D001205F +:103BE00070470000940000202DE9F04115460E4674 +:103BF0000446002700F0E7F8A84215D3002341202F +:103C00000FE000BF94F84220A25CF25494F84210F6 +:103C1000491CB1FBF0F200FB12115B1C84F842104E +:103C2000DBB2AB42EED3012700F0D9F83846BDE84D +:103C3000F081704910B5802081F800046E490020A1 +:103C400081F8420081F84100433181F8420081F857 +:103C50004100433181F8420081F8410067480FF08C +:103C60006DFB6648401C0FF069FBEFF71BF8BDE8E1 +:103C7000104000F0B4B8402070475F4800F0A3B88F +:103C80000A4601465C48AFE7402070475A48433037 +:103C900000F099B80A46014657484330A4E740214E +:103CA00001700020704710B504465348863000F07C +:103CB0008AF82070002010BD0A4601464E4810B513 +:103CC0008630FFF791FF08B1002010BD42F20700D7 +:103CD00010BD70B50C460546412900D9FFDF4848A4 +:103CE0000068103840B200F050F8C6B20D2000F065 +:103CF0004CF8C0B2864203D2FFDF01E0EFF722F8B2 +:103D0000224629463C48FFF76FFF0028F6D070BDD9 +:103D10002DE9F041394F002506463F1D57F8254053 +:103D2000204600F041F810B36D1CEDB2032DF5D321 +:103D30003148433000F038F8002825D02E4800F0F4 +:103D400033F8002820D02C48863000F02DF80028C9 +:103D50001AD0EEF7CDFF29480FF0F8FAB0F5005F62 +:103D600000D0FFDFBDE8F04124480FF005BB94F818 +:103D700041004121265414F8410F401CB0FBF1F2E0 +:103D800001FB12002070D3E751E7002806DA00F0AB +:103D90000F0000F1E02090F8140D03E000F1E020A6 +:103DA00090F800044009704710F8411F4122491C57 +:103DB000B1FBF2F302FB13114078814201D10120E3 +:103DC00070470020704710F8411F4078814201D3AE +:103DD000081A02E0C0F141000844C0B2704710B5B3 +:103DE00006480FF0B3FA002803D1BDE81040EEF703 +:103DF0006ABF10BD0DE000E0480900209C000020D3 +:103E000004ED00E070B5154D2878401CC4B2687808 +:103E1000844202D0EFF727F82C7070BD2DE9F041F5 +:103E20000E4C4FF0E02600BFEFF712F820BF40BF66 +:103E300020BF677820786070D6F80052EDF76EFAF0 +:103E4000854305D1D6F8040210B92078B842EBD0EA +:103E5000EEF7F9FF0020BDE8F0810000AC00002083 +:103E60002DE9F041012528034FF0E0210026C1F89B +:103E700080011E4CC4F800610C2000F02CF81C4896 +:103E800001680268C94341F3001142F01002026068 +:103E9000C4F804532560491C00E020BFD4F8002179 +:103EA000002AFAD019B9016821F010010160114807 +:103EB00007686560C4F80853C4F800610C2000F07E +:103EC0000AF83846BDE8F08110B50446FFF7C8FF90 +:103ED0002060002010BD00F01F0201219140400928 +:103EE000800000F1E020C0F88012704700C0004060 +:103EF00010ED00E008C500402DE9F047FF4C0646F4 +:103F0000FF21A06800EB061211702178FF2910D064 +:103F10004FF0080909EB011109EB06174158C05988 +:103F200000F0F4F9002807DDA168207801EB061104 +:103F300008702670BDE8F08794F8008045460DE0D3 +:103F4000A06809EB05114158C05900F0DFF90028BD +:103F500006DCA068A84600EB08100578FF2DEFD11D +:103F6000A06800EB061100EB08100D700670E1E789 +:103F7000F0B5E24B0446002001259A680C269B7898 +:103F80000CE000BF05EB0017D75DA74204D106EB9C +:103F90000017D7598F4204D0401CC0B28342F1D8D9 +:103FA000FF20F0BD70B5FFF772FBD44C08252278D6 +:103FB000A16805EB0212895800F0A8F9012808DD74 +:103FC0002178A06805EB01114058BDE87040FFF76B +:103FD00055BBFFF727FABDE87040F7F7D7BE2DE9CC +:103FE000F041C64C2578FFF752FBFF2D6ED04FF005 +:103FF0000808A26808EB0516915900F087F9022815 +:10400000A06801DD80595DE000EB051109782170A1 +:10401000022101EB0511425C5AB1521E42548159F2 +:1040200001F5800121F07F4181512846FFF764FFAF +:1040300034E00423012203EB051302EB051250F8D0 +:1040400003C0875CBCF1000F10D0BCF5007F10D915 +:10405000CCF3080250F806C00CEB423C2CF07F4C2D +:1040600040F806C0C3589A1A520A09E0FF21815449 +:104070000AE0825902EB4C3222F07F428251002248 +:1040800042542846FFF738FF0C21A06801EB0511C8 +:104090004158E06850F82720384690472078FF289C +:1040A00014D0FFF7F4FA2278A16808EB0212454613 +:1040B000895800F02BF9012893DD2178A06805EBE1 +:1040C00001114058BDE8F041FFF7D8BABDE8F081D2 +:1040D000F0B51D4614460E460746FF2B00D3FFDF02 +:1040E000A00700D0FFDF8548FF210022C0E902477A +:1040F000C57006710170427082701046012204E0A2 +:1041000002EB0013401CE154C0B2A842F8D3F0BD4A +:1041100070B57A4C064665782079854200D3FFDF7A +:10412000E06840F825606078401C6070284670BDEB +:104130002DE9FF5F1D468B460746FF24FFF7A7FAD0 +:10414000DFF8B891064699F80100B84200D8FFDFC1 +:1041500000214FF001084FF00C0A99F80220D9F81D +:1041600008000EE008EB0113C35CFF2B0ED0BB422E +:1041700005D10AEB011350F803C0DC450CD0491CF3 +:10418000C9B28A42EED8FF2C02D00DE00C46F6E709 +:1041900099F803108A4203D1FF2004B0BDE8F09FD4 +:1041A0001446521C89F8022008EB04110AEB041291 +:1041B000475440F802B00421029B0022012B01EB7E +:1041C00004110CD040F801204FF4007808234FF080 +:1041D000020C454513D9E905C90D02D002E045504E +:1041E000F2E7414606EB413203EB041322F07F4233 +:1041F000C250691A0CEB0412490A81540BE005B94C +:10420000012506EB453103EB041321F07F41C1503A +:104210000CEB0411425499F800502046FFF76CFE55 +:1042200099F80000A84201D0FFF7BCFE3846B4E779 +:1042300070B50C460546FFF72AFA06462146284681 +:10424000FFF796FE0446FF281AD02C4D082101EBFB +:104250000411A8684158304600F058F800F5805025 +:10426000C11700EBD14040130221AA6801EB0411F1 +:10427000515C09B100EB4120002800DC012070BD39 +:10428000002070BD2DE9F04788468146FFF770FE9B +:104290000746FF281BD0194D2E78A86831463446B2 +:1042A00005E0BC4206D0264600EB06121478FF2C2F +:1042B000F7D10CE0FF2C0AD0A6420CD100EB011084 +:1042C00000782870FF2804D0FFF76CFE03E0002080 +:1042D00030E6FFF7D9F941464846FFF7A9FF012329 +:1042E000A968024603EB0413FF20C854A878401EB7 +:1042F000B84200D1A87001EB041001E0140A0020BC +:1043000001EB061100780870104613E6081A000247 +:10431000C11700EB116000127047000070B5044631 +:10432000A0F500002D4EB0F1786F02D23444A4F510 +:1043300000042B48844201D2012500E0002500F052 +:1043400043F848B125B9B44204D32648006808E0D0 +:10435000012070BD002070BD002DF9D1B442F9D309 +:1043600021488442F6D2F3E710B50446A0F50000D8 +:10437000B0F1786F03D219480444A4F5000400F0AA +:1043800023F84FF0804130B11648006804E08C42B9 +:1043900004D2012003E014488442F8D2002080F0C7 +:1043A000010010BD10B520B1FFF7DEFF08B10120FC +:1043B00010BD002010BD10B520B1FFF7AFFF08B150 +:1043C000012010BD002010BD08480949006888423E +:1043D00001D101207047002070470000000000203C +:1043E000006002002000002008000020B000002033 +:1043F000BEBAFECA0548064A0168914201D10021B1 +:10440000016004490120086070470000B0000020EE +:10441000BEBAFECA40E50140534800210170417018 +:1044200010218170704770B5054616460C46022073 +:10443000EEF7D7F94C49012008704C49F01E08608E +:104440004B480560001F046070BD10B50220EEF7F8 +:10445000C8F945490120087046480021C0F80011FC +:10446000C0F80411C0F8081143494FF40000086077 +:1044700010BD3D480178C9B1404A4FF400011160B8 +:104480003C49D1F800310022002B1CBFD1F8043187 +:10449000002B02D0D1F8081111B14270102103E0B5 +:1044A0000121417036490968817002700020EEF7E1 +:1044B00098B92D480178002904BF407870472D48ED +:1044C000D0F80011002904BF02207047D0F8001175 +:1044D00000291CBFD0F80411002905D0D0F808012C +:1044E000002804BF01207047002070471E4800B517 +:1044F0000278204B4078C821491EC9B282B1D3F856 +:1045000000C1BCF1000F10D0D3F8000100281CBF7F +:10451000D3F8040100280BD0D3F8080150B107E00C +:10452000022802D0012805D002E00029E4D1FFDFF3 +:10453000002000BD012000BD0B480178002904BF08 +:10454000807870470B48D0F8001100291CBFD0F8C4 +:104550000411002902D0D0F8080108B110207047DA +:1045600007480068C0B27047B400002010F5004052 +:1045700008F5004000F0004004F5014008F5014056 +:1045800000F400404C48002101704170704770B544 +:10459000064614460D460120EEF723F9474806600B +:1045A000001D0460001D056070BD70B54249012505 +:1045B0000D7040EA0241424A41F080711160414C65 +:1045C0000026C4F80461404A4FF040711160002891 +:1045D00002BFC4F80052256070BD012818BFFFDF7C +:1045E000C4F8006225604FF000703849086070BD63 +:1045F0003148017879B1344A4FF040711160314946 +:10460000D1F804210021002A08BF417002D0304AAD +:104610001268427001700020EEF7E3B82648017876 +:10462000002904BF407870472648D0F804010028CC +:1046300008BF704726480068C0B27047002808BF0E +:10464000704730B51C480078002808BFFFDF1D48C0 +:10465000D0F80411002918BF30BD0224C0F804436B +:10466000DFF870C0DCF80010C1F30015DCF80010B2 +:1046700041F01001CCF80010D0F80411002904BF5B +:104680004FF400414FF0E02207D100BFC2F8801282 +:1046900020BFD0F80431002BF8D02DB9DCF8001081 +:1046A00021F01001CCF80010C0F8084330BD0549D6 +:1046B0000120886070470000B700002008F5004026 +:1046C00004F5004000F0004008F5014004F5014009 +:1046D00000F4004010ED00E010B5FF480024012177 +:1046E0004470047044728472C17280F82140846204 +:1046F000446314300FF004FFF849601E0860091D80 +:104700000860091D0C60091D0860091D0C60091D69 +:104710000860091D0860091D0860091D0860091D61 +:104720000860091D0860091D0860091D0860091D51 +:10473000086010BDEA48016801F00F01032904BFB9 +:1047400001207047006800F00F00042804BF022019 +:10475000704700B5FFDF012000BD30B4DE490268BC +:10476000DFF884C34A6142688A61007A08770A7D6B +:10477000DC4BACF1040401204AB10A7E00FA02F2DB +:104780001A608D7D002D0CBF2260CCF800204A7D80 +:10479000002A04BF30BC70474A7E90401860C97D33 +:1047A00000290CBF2060CCF8000030BC704730B549 +:1047B00000250446012904D002290CBF4FF0807562 +:1047C000FFDF45F4847040F48010C849086044F469 +:1047D0004030091D40F00070086030BD30B5002544 +:1047E0000446012904D002290CBF4FF08075FFDF79 +:1047F00045F4847040F48010BC49086044F44030B3 +:10480000091D40F000700860B948D0F80001002888 +:1048100018BFFFDF30BD2DE9F04102264FF0E02741 +:1048200001240025C7F88061B248056004600EF0DD +:1048300077FDB14918B1086840F4806008600868E5 +:1048400020F0770040F0880040F0004008600EF053 +:1048500051FD30B1A948016821F47F4141F4B051C4 +:1048600001600EF047FD9C4940B1A5484E770660B7 +:10487000A54AA4481060121FA4481060A44A40F240 +:104880005B601060121F40F203101060101F046084 +:10489000934A032010609F4A96201060487F0028AA +:1048A00014BF4FF4C0209C4840F440209B4A106045 +:1048B0009C4A9B481060121F9B481060C7F880629A +:1048C0008B4A1020C2F8040381F82D50BDE8F08116 +:1048D0009648016821F0010141F080710160704744 +:1048E0007D4A0368C2F802308088D0801172704718 +:1048F000794B10B51A7A8A4208D101460622981CD3 +:104900000FF02AFC002804BF012010BD002010BDBC +:10491000714890F8210070476F4A517010707047CD +:10492000F0B50546800000F1804000F580508B888E +:10493000C0F820360B78D1F8011043EA0121C0F805 +:10494000001605F10800012707FA00F6784C002A46 +:1049500004BF2068B04304D0012A18BFFFDF2068DD +:1049600030432060206807FA05F108432060F0BD5D +:104970000EF096BF584890F82E007047564890F8B1 +:10498000300070476B4AC178116000686A490002C4 +:1049900008607047252808BF02210ED0262808BFCE +:1049A0001A210AD0272808BF502106D00A2894BF10 +:1049B0000422062202EB4001C9B2604A116060493C +:1049C00008607047F0B4444B9D7A012D61D0022DF0 +:1049D0001CBFF0BC704793F815C0BCF1000F04BFBA +:1049E000F0BC70474FF47A7C012D564C564F57D08F +:1049F000DE7D5D7E002E18BF0126012908BF29211A +:104A00000CD0022A0CBF514C012A03D0042A0CBF3F +:104A10003C464F4C04F2E141B1FBFCF1491F084414 +:104A20004C4908604C490020C1F84C01280286F02E +:104A3000010140EA015040F00311187F820002F1A9 +:104A4000804202F5C042C2F81015444901EB8002D1 +:104A5000997EC80000F1804000F5F830C0F81425B8 +:104A6000DFF8FCC0C0F810C5D87EC30003F1804356 +:104A700003F5F833C3F814252B4AC3F81025012297 +:104A800002FA01F102FA00F0084336490860F0BC6E +:104A9000704793F814C0BCF1000FA3D1F0BC70476D +:104AA0009E7D1D7E002E18BF0126012965D0022A99 +:104AB00004BF2D4C4FF47A710CD0012A08BF4FF47B +:104AC000C86107D0042A07BF3C4640F69801274C2E +:104AD00040F6E44121444BE0240A0020000E00404F +:104AE00010150040180500500C050050141500402A +:104AF00000100040FC1F00403C17004040170040E1 +:104B000060150040448000409CF5014028110040A1 +:104B100038150040441500400000040408F5014029 +:104B200040800040A4F5014010110040741700407F +:104B300040160040241500401C1500400815004098 +:104B400054150040A2240200D0FB010004360200EC +:104B5000C0D401004C85004000800040006000404F +:104B60004C81004004F501406836020030D301005A +:104B700001F5FA71B1FBFCF150E7022A08BF4FF4CE +:104B80007A710AD0012A08BF4FF4C86105D0042AFF +:104B90000CBF40F6980140F6E44149F6FC6211442E +:104BA000E8E72DE9F047FC4E80460320154689468C +:104BB000C6F80002F94F787F002814BF4FF4C020D8 +:104BC000F748F849086048460EF0A5FE28460EF062 +:104BD00095FE0124B8F1000F03D0B8F1010F16D0F3 +:104BE00018E00EF087FB78B1EF490A684806022DFD +:104BF000D0F820030CBFC0F30660C0F3062022F4F7 +:104C0000FE4242EA00200860BC72346002E00220EA +:104C1000B8727460E548C464E54800682A464946AD +:104C2000BDE8F047CEE62DE9F0418846DA4907466F +:104C300003201546C1F80002D84C607F002814BF3D +:104C40004FF4C020D648D74E306040460EF063FE89 +:104C500028460EF053FE17B1012F1CD024E00EF0B1 +:104C600049FB78B1D04A11685006022DD0F82003D4 +:104C70000CBFC0F30660C0F3062021F4FE4141EAF8 +:104C8000002010600120A072606B40F4801060630F +:104C90004FF4801007E00220A072606B40F4001017 +:104CA00060634FF4001030602A464146BDE8F04191 +:104CB000002087E62DE9FF4FB74C8346002581B0E1 +:104CC00003208946C4F80002B44E707F002814BF48 +:104CD0004FF4C020B248B34F386003980EF01BFE6B +:104CE00004980EF00BFEDFF8CCA24FF00108BBF1E8 +:104CF000000F03D0BBF1010F35D046E00EF0FAFAF9 +:104D000080B1A94A0498116853060228D3F82003F9 +:104D10000CBFC0F30660C0F3062021F4FE4141EA57 +:104D200000201060CAF8004096F82D00012806D037 +:104D3000022818BFFFDF0CD086F80A8025E0DDE9E5 +:104D4000031396F82C2048460EF066FEB16A45180B +:104D5000F2E7DDE9031296F82C3048460EF0EAFD42 +:104D6000B16A4518E8E79448CAF8000096F82D00A3 +:104D7000DDE90313012896F82C20484624D00EF0D4 +:104D800095FEB16A45180220B0728C4805608D49C5 +:104D90008B480860706B40F400207063D4F8009278 +:104DA0004FF0100AC4F808A30026C4F80062864831 +:104DB0004FF4802BC0F800B0FF208DF80000C4F83D +:104DC0001061C4F810800AE00EF0F2FDB16A4518D7 +:104DD000D9E700BF9DF80000401E8DF800009DF847 +:104DE000000018B1D4F810010028F3D09DF800009D +:104DF000002808BFFFDFC4F80061C4F80C61C4F8E4 +:104E00001061C4F80461C4F81461C4F818610EF0AC +:104E100071FA002818BFC4F828616C480068009037 +:104E2000C4F80092C7F800B0C4F804A34FF40020FF +:104E300038605E48C0F84C805D480068A84228BFD2 +:104E4000FFDF2846DDE9031205B0BDE8F04FB9E504 +:104E50002DE9F84F504CD4F8000220F00B09D4F89B +:104E600004034FF0100AC0F30018C4F808A300268A +:104E7000C4F80062494D687F002814BF4FF4C02079 +:104E8000474840F4402150480160A97A0127012990 +:104E900002D0022903D014E0297D11B911E0697D07 +:104EA00079B1A97EEA7E07FA01F107FA02F211430D +:104EB0000160287F800000F1804000F5C040C0F80C +:104EC0001065FF208DF80000C4F81061276104E030 +:104ED0009DF80000401E8DF800009DF8000018B1FC +:104EE000D4F810010028F3D09DF80000002808BF76 +:104EF000FFDFC4F810610EF0FDF9002818BFC4F8F8 +:104F000028616E72AE72EF72C4F80092B8F1000FB1 +:104F100018BFC4F804A3BDE8F88F00682C4920F03E +:104F20007F40086070474FF0E0200221C0F88011F8 +:104F3000C0F8801270474FF0E0210220C1F8000154 +:104F4000704724490870704723490860704730B59E +:104F5000124C0546A06AA84228BFFFDF012020733B +:104F60002561607F40B1284420610B48D0F80012D1 +:104F700041F04001C0F800120C490020C1F8440182 +:104F8000164920690860606B064940F48000606340 +:104F90004FF48000086030BD00100040240A00205B +:104FA0000000040404F50140881500400080004022 +:104FB0004C850040ACF5014004100040488500409D +:104FC00048810040A8F5014008F501401811004053 +:104FD0003C150040B9000020041500404485004005 +:104FE00070B505460E460220FE4C2073FE4801684F +:104FF00001F00F01032908BF012207D0006800F06B +:105000000F0004280EBF0222FFDF012294F82D00BA +:1050100094F82C10012819D028460EF0A5FD206127 +:10502000607F48B1216908442061F048D0F800123F +:1050300041F04001C0F80012ED490020C1F84401E0 +:105040002169A06A0844EB49086070BD33462846D0 +:105050000EF053FDE3E7E8494FF480000860E148B3 +:10506000416B21F480014163002101737047C2004C +:1050700002F1804202F5F832E04BC2F81035C2F876 +:10508000141501218140DE480160D648426B11436E +:1050900041637047D64801214160C1600021C0F8DA +:1050A0004411D4480160CF488162704710B504466E +:1050B0000EF020F900281CBFCA484477D14804608C +:1050C000CA48D0F8001241F04001C0F8001210BDEB +:1050D000C64810B5D0F8001221F04001C0F8001207 +:1050E0000EF008F9C749002818BF0220086010BD5B +:1050F000BE48D0F8001221F01001C0F800120121C2 +:1051000081617047B9480021C0F81C11D0F8001225 +:1051100041F01001C0F800127047B44981B0D1F8D5 +:105120001C21012A1EBF002001B07047B64A126838 +:1051300002F07F02524202700020C1F81C01B34805 +:1051400000680090012001B0704730B50C000546A2 +:1051500008BFFFDF14F0010F1CBF012CFFDF002D83 +:105160000CBF012002209F4901284872CC729F4940 +:1051700004BFD1F8000240F0040007D0022807BFA6 +:10518000D1F8000240F00800FFDF30BDC1F8000296 +:1051900030BD2DE9F84FDFF8789299F80000042827 +:1051A00028BFFFDFDFF848A2DAF84C1192488D4C97 +:1051B00000274FF00108D1B1A17A012902D00229BC +:1051C00003D014E0217D11B911E0617D79B1A17E98 +:1051D000E27E08FA01F108FA02F211430160217F30 +:1051E000890001F1804101F5C041C1F81075824884 +:1051F000616B01606763217B002019B1DAF844110B +:10520000012900D00021A27A784E012A6ED0022A0C +:1052100074D000BFD6F8101101290CBF1021002155 +:1052200041EA00057B48016811F0FF0F03D0D6F872 +:105230001411012900D0002184F82E10006810F00C +:10524000FF0F03D0D6F81801012800D0002084F801 +:105250002F007148006884F83000FFF72AF9012810 +:1052600018BF002084F83100C6F80071C6F80C7130 +:10527000C6F81071C6F80471C6F81471C6F8187132 +:105280000EF038F8002818BFC6F828716348006887 +:1052900000905748C0F8447161480068DFF854A195 +:1052A0000090DAF800006062617F00291CBF401A9C +:1052B00060625C480068A0624B48016801F00F0121 +:1052C000032908BF012007D0006800F00F00042860 +:1052D0000EBF0220FFDF012084F82C00A07ADFF847 +:1052E00048B184F82D00022824D116E0D6F80C012C +:1052F000012814BF002008208CE7FFE7D6F80C0136 +:10530000012814BF00200220484A1268012A14BF55 +:1053100004220022104308437CE7607850B1DBF898 +:10532000001009780840217831EA000008BF84F8AD +:10533000208001D084F8207015F0020F07D099F872 +:1053400000103B4A4908606A52F82110884715F05E +:10535000010F18BF00210DD0364A99F80030A06A1D +:1053600052F82320904700BF99F8000010F0010F79 +:105370002AD10AE015F0020F18BF0121ECD115F077 +:10538000080F18BF0221E7D1EEE7DBF80000007834 +:1053900000F00F00072828BF84F8217014D2DBF832 +:1053A0000000062200F10901A01C0EF0D5FE40B954 +:1053B000207ADBF800100978B0EBD11F08BF01207C +:1053C00000D0002084F82100E17A002011F0020FC3 +:1053D0001CBF15F0020F15F0040F45D111F0100F8E +:1053E0002AE00000240A00201015004000100040B0 +:1053F000008000404485004008F501400411004051 +:1054000004F5014060150040481500401C110040A3 +:10541000B900002040160040101400401811004050 +:1054200044810040408500400415004000140040C5 +:1054300008480200504802001CBF94F82F20002AA0 +:1054400002D094F831207AB111F0080F1CBF94F803 +:105450002020002A08D111F0040F02D094F8211066 +:1054600011B115F0010F00D00120617A19B198B186 +:10547000FFF7EEFC1EE0607F002814BF4FF4C02150 +:105480007F4980480160D6F8000220F00300C6F88A +:10549000000284F80B800DE04FF0000B012913D0BF +:1054A000022918BFFFDF21D0A06A01225844002141 +:1054B000FFF788FA15F0010F2BD0734899F8001008 +:1054C00050F82100804745E0D6F8000220F00400A3 +:1054D000C6F80002677284F80B80012384F80A8002 +:1054E0001A46002196200EF025FA10E0D6F80002A8 +:1054F00020F00800C6F80002677284F80B800220D2 +:10550000A07201231A46002196200EF051FA83461C +:10551000CAE715F0020F08D05C4999F8002028EA84 +:10552000950051F82210884714E015F0080F06D0B6 +:10553000574899F8001050F8210080470AE015F00C +:10554000100F08BFFFDF05D0524899F8001050F83F +:1055500021008047A07A022818BFBDE8F88F207B81 +:10556000002808BFBDE8F88F4B49C1F844710228F4 +:1055700014D0012818BFFFDFA16A2069884298BFB4 +:10558000FFDF2069CAF80000606B444940F48000E6 +:1055900060634FF480000860BDE8F88F2169A06A5D +:1055A0000844EFE738B500253D4C002818BFC4F883 +:1055B0000052C4F80051C4F80C51C4F81051C4F89A +:1055C0000451C4F81451C4F818510DF093FE00288A +:1055D00018BFC4F8285133480068009038BD01282E +:1055E00004BF28207047022804BF1820704700B568 +:1055F000FFDF282000BD012804BF41F6A4707047DA +:10560000022804BF41F28830704700B5FFDF41F641 +:10561000A47000BD012804BF41F2D4707047022875 +:1056200004BF41F20400704700B5FFDF41F2D470BF +:1056300000BD012812BF02280020704700B5FFDF1F +:10564000002000BD16490820C1F800021648407F1E +:10565000002814BF4FF4C02009480A4908601449C3 +:1056600012480860091D13480860091D12480860A7 +:10567000091D1248086009494FF44020086070472E +:105680000000040408F50140104802002048020010 +:1056900030480200404802000080004004F501400C +:1056A0000010004018110040240A002000110040A2 +:1056B000A0F50140141000401C11004010100040E3 +:1056C00010B53F4822210EF0F2FD3D48017821F04F +:1056D00010010170012107F017FC3A49002081F800 +:1056E00022004FF6FF70888437490880488010BD3B +:1056F000704734498A8C824218BF7047002081F875 +:1057000022004FF6FF70888470472D490160704772 +:105710002D49088070472B498A8CA2F57F43FF3BB7 +:1057200003D0002101600846704791F822202549E6 +:10573000012A1ABF0160012000207047214901F1B0 +:10574000220091F82220012A04BF00207047012284 +:1057500002701D4800888884104670471A494880A6 +:1057600070471849184B8A8C5B889A4206D191F889 +:105770002220002A1EBF01600120704700207047D0 +:105780001048114A818C5288914209D14FF6FF711D +:10579000818410F8221F19B1002101700120704787 +:1057A000002070470748084A818C5288914205D1F1 +:1057B00090F8220000281CBF00207047012070478D +:1057C000820A00205C0A0020BA0000207047574A75 +:1057D000012340B1012818BF70471370086890601A +:1057E00088889081704753700868C2F802008888E2 +:1057F000D08070474D4A10B1012807D00EE0507894 +:1058000060B1D2F802000860D08804E0107828B1B6 +:105810009068086090898880012070470020704758 +:10582000424910B1012803D006E0487810B903E0DE +:10583000087808B1012070470020704730B58DB05E +:105840000C4605460D2104A80EF053FDE0788DF8B6 +:105850001F0020798DF81E0060798DF81D002868E2 +:10586000009068680190A8680290E8680390684614 +:105870000DF0C2FB20789DF82F1088420CD1607883 +:105880009DF82E10884207D1A0789DF82D108842EF +:1058900002BF01200DB030BD00200DB030BD30B5CD +:1058A0000C4605468DB04FF0030104F1030012B120 +:1058B000FEF7F0F901E0FEF70CFA60790D2120F017 +:1058C000C00040F04000607104A80EF012FDE078C6 +:1058D0008DF81F0020798DF81E0060798DF81D006D +:1058E0002868009068680190A8680290E8680390B2 +:1058F00068460DF081FB9DF82F0020709DF82E006A +:1059000060709DF82D00A0700DB030BD10B500295D +:1059100004464FF0060102D0FEF7BCF901E0FEF7A5 +:10592000D8F9607920F0C000607110BDBE00002081 +:1059300070B5F84E0446306890F800110025012932 +:1059400019D090F8FA10012924D090F8D01001292C +:105950002AD090F8F21001291CBF002070BD65709C +:1059600017212170D0F8F4106160B0F8F81021818F +:1059700080F8F25016E065701C212170D0F80111FA +:105980006160D0F80511A16090F80911217380F8C9 +:10599000005107E0657007212170D0F8FC106160AC +:1059A00080F8FA50012070BD65701421217000F15B +:1059B000D2012022201D0EF0FBFB01212172306854 +:1059C00080F8D050D448B0F8D420A0F8FC207268F9 +:1059D000537B80F8FE3080F8FA101088FBF71AF934 +:1059E000FAF7C1FDDEE7CB48006890F8D010002937 +:1059F00014BFB0F8D4004FF6FF70704770B5C54CB7 +:105A00002068002808BFFFDF0025206845700028B7 +:105A100008BFFFDF2068417800291CBFFFDF70BD91 +:105A20004FF486710EF065FC2068FF2101707F2124 +:105A300080F8361013214184282180F8CC100121F0 +:105A400080F8B81080F8BD50FFF742FBFEF711FD5B +:105A5000B24806F0E5FFB24806F0E2FFBDE870404C +:105A6000B04806F0DDBFAB490968097881420CBF38 +:105A7000012000207047A748006890F82200C0F37A +:105A8000001070472DE9F04FA248016891F82400FA +:105A9000B1F822C0C0F38002C0F340031A4400F002 +:105AA00001001044CCF300121AB3BCF1130F1BD049 +:105AB0000BDCBCF1100F02BF9B4931F81000BDE8B0 +:105AC000F08FBCF1120F0FD00AE0BCF1150F08BF28 +:105AD00096490AD0BCF11D0F04BF9548BDE8F08F70 +:105AE000FFDF0020BDE8F08F924931F81000BDE8DB +:105AF000F08F002491F8BA2091F8BB108E4E8F4F92 +:105B00001CF0030F4FF47A7B4FF0190A25464FF42F +:105B1000C8784FF4BF794FF018037DD01CF0010F07 +:105B20001BD0082904BF44464FF0400C0FD0042975 +:105B300004BF4C464FF0100C09D0022907BF05F1F5 +:105B400018044FF0040C05F128044FF0080C0CEB7E +:105B50004C0E0EEB0C1CA44417E0082904BFC446ED +:105B600040240CD0042904BFCC46102407D00229BD +:105B700007BF05F1180C042405F1280C082404EBD8 +:105B8000C40404EB44040CEB440C022A04BF6C4E26 +:105B90004FF47A740CD0012A08BF4FF4C86407D0C0 +:105BA000042A07BF674E40F698043E4640F6E44498 +:105BB000344404F2E734B4FBFBF4C0EB001606EB0C +:105BC000860604EB8604082A30D0042A29D0022A4B +:105BD00007BF05F11802042505F128024FF0190A44 +:105BE00018BF08251AFB052212FB0040082922D005 +:105BF000042925D0022904BF0421C03004D0282361 +:105C000003F5A87108440821C1EBC10101EB410172 +:105C100003EB4101084400E017E0604400F52674FE +:105C200018E04A464FF0140A1025DBE742464FF0D1 +:105C3000140A4025D6E74346402100F53D60E3E7DE +:105C40004B46102100F57C70DEE71CF0020F18BFF8 +:105C5000FFDF02D02046BDE8F08F022A04BF384E95 +:105C60004FF47A7C0CD0012A08BF4FF4C86C07D0DF +:105C7000042A07BF334E40F6980C3E4640F6E44CEB +:105C8000B4440CF2E73CBCFBFBFCC0EB001404EB9F +:105C900084040CEB840C082A04BF4FF0140A402241 +:105CA0000CD0042A29D0022A07BF05F118080422C3 +:105CB00005F128084FF0190A18BF08221AFB0282C2 +:105CC00012FB00C0082904BF4FF4A87340210AD07A +:105CD000042904BF4FF4A873102104D002290EBF79 +:105CE000042128230821C1EBC10101EB410103EB91 +:105CF0004101084400F5B274ACE7C8464FF0140AFD +:105D00001022DBE7034840F271210068806A4843B3 +:105D100070470000CC000020A40A0020B00B002037 +:105D2000D80B0020000C0020744802007C480200C0 +:105D3000F18913006C480200A224020030D3010054 +:105D400068360200D0FB0100F848006890F8350082 +:105D5000002818BF0120704710B5F54C207B0228A1 +:105D600018BF032808D1207D04F1150105F018FDA6 +:105D700008281CBF012010BD207B002816BF022868 +:105D800000200120BDE81040FFF74ABDE74909683F +:105D900081F8300070472DE9F047E44D2968087B11 +:105DA000002816BF02280020012048730E31FFF79B +:105DB00021FD2968087B022816BF03280122002242 +:105DC00081F82F20082081F82D00487B012600272C +:105DD00001F10E03012804BF5B7913F0C00F0AD054 +:105DE00001F10E03012804D1587900F0C0004028C9 +:105DF00001D0002000E0012081F82E00002A04BF1D +:105E000091F8220010F0040F06D0087D153105F03E +:105E1000C7FC296881F82D0028684760FCF7F8FE68 +:105E20002968C34C4FF00009886094F82D0005F0F4 +:105E3000D3FC804694F82F00002818BFB8F1000F5B +:105E400004D01021404606F050FB68B194F83000B1 +:105E500000281CBF94F82E0000281DD0607B04F1A0 +:105E60000E0101280ED012E066734A4604F10E01BD +:105E70004046FFF714FD94F82D1004F10E0005F0D4 +:105E8000A4FD09E0487900F0C000402831D039462F +:105E900004F10E00FFF73AFD2868C77690F822005B +:105EA00010F0040F08BFBDE8F087002794F82D001C +:105EB00005F09BFC040008BFBDE8F087102106F048 +:105EC00014FB002818BFBDE8F08728683A4600F1A7 +:105ED0001C01C6762046FFF7E2FC286800F11C0191 +:105EE000944806F0D4FDBDE8F0470121914806F042 +:105EF000E9BD05F0A3FD4A4604F10E01FFF7CFFC12 +:105F0000CAE778B58A490446884D407B08732968FA +:105F1000207808706088ADF8000080B200F00102BF +:105F2000C0F3400342EA4302C0F3800342EA830223 +:105F3000C0F3C00342EAC302C0F3001342EA0312F3 +:105F4000C0F3401342EA4312C0F3801042EA8010CB +:105F50004884E07D012808BF012603D0022814BF31 +:105F6000FFDF0226286880F8BA60607E012808BF3B +:105F7000012603D0022814BFFFDF0226286880F81C +:105F8000BB60217B80F82410418C1D290CBF0021AF +:105F900061688162617D80F83510A17B002916BFA0 +:105FA0000229002101210175D4F80F10C0F8151045 +:105FB000B4F81310A0F81910A17EB0F8CE2061F348 +:105FC0000302A0F8CE20E17E012918BF002180F84D +:105FD0003410002078BD55480068408CC0F3001193 +:105FE00019B110F0040F05D002E010F0020F01D03B +:105FF00000207047012070474C4A00231268C2F805 +:10600000C030B2F822C0BCF11D0F02BFC2F8C830C8 +:1060100082F8C4307047002908BFC2F8C8300AD0DF +:10602000936A40F2712C03FB0CF31944491EB1FB37 +:10603000F3F1C2F8C81082F8C400704703463B4829 +:1060400010B50168D1F8C820002A1ABFD1F8C0C025 +:10605000BCF1000F012405D09A4205D90124D01AC1 +:10606000C1F8C800204610BD91F82210002411F09C +:10607000010F1CBF406800884FF0430108BF00209B +:1060800001F009F9EEE72948006890F8B700002808 +:106090000CBF01200020704770B51F2834BF044694 +:1060A0001F240022214D286880F8B920224678302C +:1060B0000EF07EF82868012180F8974080F8B9102A +:1060C00070BD10B51F2828BF1F20C2B2174C002377 +:1060D000206880F8B83080F8B72098300EF068F863 +:1060E0002168012081F8B80010BD1049096881F8C5 +:1060F000BD0070470D48006890F8220000F00100D4 +:1061000070470A48006890F82200C0F340007047CA +:106110000648006890F82200C0F34010704703481A +:10612000006890F82200C0F3C0007047CC00002047 +:10613000A40A0020B00B002001207047F748006837 +:1061400090F8BB00704770B5FEF7A4FFFEF783FF21 +:10615000FEF77EFEFEF7E7FEF04C2068D0F8C01098 +:10616000491CC0F8C01090F83300002530B1FEF78C +:10617000AFFFFEF77EF9206880F833502068457045 +:1061800090F8C410F9B1D0F8C02091421BD8042077 +:1061900002F050FA206890F8220010F0010F0CD0A5 +:1061A00060684321008801F076F860680088FAF79B +:1061B00031FDBDE87040FAF7C7B9BDE87040432132 +:1061C000002001F068B8D0F8C81019B1D0F8C0208C +:1061D000914202D990F83700D8B1042002F02AFA8F +:1061E000206890F8220010F0010F0CD060683C216C +:1061F000008801F050F860680088FAF70BFDBDE8F0 +:106200007040FAF7A1B9BDE870403C21002001F0D0 +:1062100042B8BDE87040002002F00CBA2DE9F84FFA +:10622000BE4E8046174630688B464FF0000A458CBC +:1062300015F0030F10D015F0010F05F0020005D086 +:10624000002808BF4FF0010A06D004E0002818BF5C +:106250004FF0020A00D1FFDF4FF000094C4615F065 +:10626000010F05F002000BD070B915F0040F0BD030 +:1062700049F00800002F18BF40F0030440D090E020 +:1062800010B115F0040F0DD015F0070F10D015F058 +:10629000010F05F0020036D0002808BF15F0040FEA +:1062A00027D03DE0002F18BF49F0090479D134E030 +:1062B0002FB149F0080415F0200F14D071E03168B7 +:1062C00005F0200291F87700104308BF49F001045F +:1062D00067D049F0180415F0200F62D191F8BA1078 +:1062E00008295AD156E0316891F8BA10082951D1DD +:1062F00053E049F00800002F18BF40F0010450D1CE +:1063000040F010044DE0002818BF15F0040F07D02E +:10631000002F18BF49F00B0443D149F0180440E0A6 +:1063200015F0030F3CD115F0040F39D077B1316867 +:1063300049F0080091F8BA1008290CBF40F0020497 +:1063400020F0020415F0200F22D02AE0316805F079 +:10635000200291F87700104308BF49F0030420D0D1 +:1063600049F0180015F0200F09D000BF91F8BA10BD +:10637000082914BF40F0020420F0020411E091F853 +:10638000BA20082A14BF40F0010020F00100EDE718 +:10639000082902D024F0010403E044F0010400E0E5 +:1063A000FFDF15F0400F18BFFFDFA8F8009098F846 +:1063B0000000072120F0200088F80000404606F089 +:1063C00034FB5146404606F033FD2146404606F078 +:1063D00038FD14F0010F0CD03068062300F10E01D7 +:1063E0000022404606F00AFD3068417B404606F038 +:1063F0005CFB14F0020F1BD03068BBF1000F0BD018 +:1064000000F11C0106230122404606F0F7FC0121A1 +:10641000404606F057FB0BE000F115010623012270 +:10642000404606F0EBFC3068017D404606F04AFB32 +:1064300014F0040F18BFFFDF14F0080F17D0CDF8C9 +:1064400000903068BDF800100223B0F8CE000209B9 +:1064500062F30B01ADF800109DF80110032260F308 +:1064600007118DF801106946404606F0C7FC012F60 +:1064700016D1306890F8770090B1404606F0D4FC11 +:106480003368401CC0B293F87710C0F125008142F8 +:10649000B8BF084682B203F15801404606F0FFFC3F +:1064A0000020002818BFFFDF0020002818BFFFDFF2 +:1064B0000020002818BFFFDFBDE8F88F2DE9F84362 +:1064C000164C2068002808BFFFDF2068417811BB08 +:1064D0000178FF291FD0002780F83170877080F87D +:1064E00037703846FEF72DFDFEF795F9206890F9D4 +:1064F000BD00FEF73DFA0A48FEF744FA0948FEF7E8 +:106500000CFD206890F8240010F0010F0CD025201D +:10651000FEF740FA10E00C20BDE8F883CC00002024 +:10652000684802006548020010F0020F18BF2620DC +:1065300068D000BFFEF72EFA206890F8BA10252028 +:10654000FEF735F9206880F82C70FEF7F4FC20681F +:10655000002190F8BA200846FEF765FB0F210520C0 +:10656000FEF7DAF92068FF4D012690F82E10002979 +:1065700001BF90F82F10002990F8220010F0040FAE +:1065800070D0FCF745FB8046206841468068FDF7E7 +:106590004DF8F54990FBF1F901FB190041424046E5 +:1065A000FCF73FF80146206881604168494441603A +:1065B00005F0F3F801462068426891426DD8C0E9C1 +:1065C00001784FF0010895F82D0005F005F9814696 +:1065D00095F82F00002818BFB9F1000F04D0102142 +:1065E000484605F082FFA0B195F8300000281CBF96 +:1065F00095F82E00002824D0687B05F10E010128B3 +:1066000015D019E010F0040F14BF2720FFDF91D13F +:1066100092E732466E7305F10E014846FFF73FF9E7 +:1066200095F82D1005F10E0005F0CFF909E0487935 +:1066300000F0C000402816D0414605F10E00FFF7DB +:1066400065F9206890F8220010F0040F25D095F825 +:106650002D0005F0CAF85FEA00081ED0102105F0F1 +:1066600044FF40B119E005F0E9F9324605F10E01A9 +:10667000FFF715F9E5E72068324600F11C01C67600 +:106680004046FFF70CF9206800F11C01B74806F0FE +:10669000FEF90121B54806F015FA2068417B0E305D +:1066A000FEF71EF9206890F8B81079B390F8B7207B +:1066B00080F8772000F1980158300DF0BEFD206879 +:1066C00090F82210C1F30011E9B9B0F8CE00022110 +:1066D0000609ADF800606846FDF7DCFA28B1BDF8A0 +:1066E0000000C0F30B00B04204D1BDF80000401C14 +:1066F000ADF800002168BDF80000B1F8CE2060F3CD +:106700000F12A1F8CE20206880F8B870206890F8A9 +:10671000B91059B190F8972080F8572000F178010E +:1067200038300DF08AFD206880F8B9702068B0F824 +:10673000CE10D0F8C020090951FA82F190F8BC209F +:10674000DFF82CC2114463460022E1FB0C3212092F +:106750006FF0240302FB031180F8BC1090F82210A4 +:10676000824E90F81B80C1F3001106F12809002920 +:106770005DD03780317821F020013170408C1328B2 +:1067800037D01CDC10284DD0122846D0FFDF00BFC8 +:1067900005F10E01754806F06CF9697B734806F047 +:1067A00084F92068418C1D2918BF15297ED090F8E6 +:1067B000772000F15801304606F0ADF97EE015284B +:1067C00018BF1D28E2D10121304606F02EF930789D +:1067D000B8F1000F40F020003070206812D000F1B6 +:1067E0001C01304606F053F90121304606F06AF9E3 +:1067F000CEE70021304606F018F9307840F020004E +:106800003070C5E700F11501304606F040F9206808 +:10681000017D304606F056F9BAE70621304606F00B +:1068200004F9B5E70221304606F0FFF8B0E7002290 +:1068300041463046FFF7F2FC206890F877100029B7 +:1068400004BF408C10F0010F05D110F0020F08BFFB +:1068500010F0200F04D0012241464846FFF7DEFC2D +:10686000F07810F03F0F1CBF307910F0100F25D0DA +:10687000304606F0D8F82268014692F82400C0F3AA +:106880008003C0F3400C634400F00100034492F81D +:106890002C00C0F38002C0F3400C624400F0010001 +:1068A0001044181AC0B200F00AFD00E006E00090A3 +:1068B000032304226946304606F0A0FA206890F8C7 +:1068C0002200C0F30010B0B12A4E042130463780B8 +:1068D00006F0ABF805F10E01304606F0CAF8697B08 +:1068E000304606F0E2F8206800F1380190F85720B1 +:1068F000304606F034F904F0C5FF03211E4805F0C8 +:1069000054F8216881F83300002005E61B494860EF +:1069100070472DE9F843194C8046206890F83120E3 +:1069200032B1408C1D2808BFFFDFBDE8F8430AE400 +:10693000012639B390F8BC00FEF72CF8206890F8D7 +:10694000BB102520FDF733FF206801224FF496711C +:1069500090F8BB300020FEF7ADF90948FEF7F4FAD5 +:10696000206810E0A40A002040420F00B00B002075 +:1069700053E4B36E000C0020280C0020CC00002053 +:10698000D80B002005E04670867080F83160BDE8C5 +:10699000F883FE48FEF7D8FA2068002590F8241006 +:1069A00090F82C0021EA000212F0010F18BF012517 +:1069B0000ED111F0020F04D010F0020F08BF022513 +:1069C00006D011F0040F03D010F0040F08BF042507 +:1069D0000027B8F1000F5CD0012D1CD0022D08BF9C +:1069E00026201CD0042D14BFFFDF272017D02068DD +:1069F00090F8BA102520FDF7DAFE206890F82210F2 +:106A0000C1F3001171B1002201234FF496711046B9 +:106A1000FEF750F93DE02520FDF7BCFFE7E7FDF765 +:106A2000B9FFE4E790F8BA3001224FF496710020E4 +:106A3000FEF740F9D548C17811F03F0F1CBF00792F +:106A400010F0100F25D0D14805F0EDFF2368014666 +:106A500093F82420C2F38000C2F3400C604402F09B +:106A6000010200EB020C93F82C20C2F38000C2F369 +:106A70004003184402F001020244ACEB0200C0B231 +:106A800000F01DFC0090032304226946BF4806F075 +:106A9000B5F9206890F82C10294380F82C1090F854 +:106AA000242032EA010112D04670408C132821D0F4 +:106AB0001CDC102808BFBDE8F88312281AD000BFDC +:106AC000C0F30010002818BFFFDFBDE8F883418C39 +:106AD0001D2908BF80F82C70E6D0C1F300110029F1 +:106AE00014BF80F8316080F83170DDE7152818BFD9 +:106AF0001D28E5D1BDE8F84301210846FEF725BB76 +:106B0000A34810B50068417841B90078FF2805D046 +:106B100000210846FFF7FDFE002010BDFEF7BAFA7F +:106B2000FEF799FAFEF794F9FEF7FDF90C2010BD77 +:106B300097490120096881F837007047944909682E +:106B400081F83200704770B5002501F0E3FB0028A2 +:106B50007CD08F4C2068417800260122012905D085 +:106B6000022901D003297DD0FFDF70BD8178022684 +:106B700039B390F8220010F0030F67D08548FEF774 +:106B8000E3F920680122962190F8BB301046FEF709 +:106B900091F800219620FEF723FA2068467090F8BD +:106BA000330020B1FDF751FC4020FEF77FFA20684A +:106BB00090F83400002808BF70BDBDE87040FEF7B3 +:106BC000A1BA418CC1F300129AB1102929D090F8D2 +:106BD000330020B1FDF739FC4020FEF767FA6D481D +:106BE000FEF7B2F9206890F8221011F0040F1DD0C2 +:106BF00027E090F8242090F82C309A4211D190F898 +:106C00007700002808BF11F0010F05D111F0020F25 +:106C100008BF11F0200F52D0BDE870400121084696 +:106C200077E6BDE870400021012072E690F835005B +:106C3000012814BF0328102545F00E010020FEF79F +:106C400084FA206890F83400002801E037E009E079 +:106C500018BFFEF757FA00219620FEF7C1F9206809 +:106C6000467070BD817801B3418C11F0010F21D0C5 +:106C700080F8D02090F8D210B0F8D40000F00BFBD0 +:106C800060680088F9F7C6FFF9F75EFC2068467077 +:106C9000FEF700FAFEF7DFF9FEF7DAF8FEF743F940 +:106CA000BDE87040032001F0C5BC8178BDE87040AC +:106CB00001202EE611F0020F04BFFFDF70BDBDE81A +:106CC0007040FFF740BAFFF73EBA10B5304C20686D +:106CD00090F8341049B13630FEF71FFA18B9216820 +:106CE0007F2081F83600FEF703FA206890F8330021 +:106CF00018B1FEF7EDF9FDF7BCFB01F00BFBA8B1F5 +:106D0000206890F82210C1F3001179B14078022870 +:106D100018BFFFDF00210120FFF7FBFD206841784D +:106D200000291EBF40780128FFDF10BDBDE81040DC +:106D3000FFF709BA2DE9F047154F0E4603283A68C8 +:106D4000518C0BD092F8320001F0010410F10009CF +:106D500018BF4FF001094FF0010805E0C1F34004EE +:106D60004FF000094FF00208FDF704FE054634EA33 +:106D7000090008BFBDE8F0873868064C90F833007A +:106D800098B104F064FD3070014605E0B00B0020BE +:106D9000CC000020280C0020FF2806D0E01C04F0C6 +:106DA0004BFD307804F05EFD05432078C0F3801180 +:106DB0003868027D914209D100F115010622E01CDC +:106DC0000DF0CAF9002808BF012000D0002031785A +:106DD000FF2906D0C0B9386890F82D00884215D137 +:106DE00012E098B12078E11CC0F3801004F0D8FCC8 +:106DF000064604F03BFE38B1304604F0F6FC18B10C +:106E0000102105F072FB08B1012000E00020396874 +:106E100091F8221011F0040F01D0F0B11AE0CDB9B1 +:106E2000FE4890F83500002818BF404515D114F8E9 +:106E3000030B2146C0F3801004F0B2FC044604F0BA +:106E400015FE38B1204604F0D0FC18B1102105F031 +:106E50004CFB10B10120BDE8F0870020BDE8F087B1 +:106E60002DE9F04FEE4D804683B02868002740782A +:106E7000022818BFFFDF28687F2490F8341049B13A +:106E80003630FEF74AF9002804BF286880F83640FB +:106E9000FEF72EF9E34805F0E8FD0646B8F1000FCD +:106EA00000F0A381DF4805F079FF002800F09D8104 +:106EB000FDF72EFD002800F098813046D94EFF21C5 +:106EC000DFF864A34FF000084FF0030B4FF0010907 +:106ED000062880F0B981DFE800F0FDFDFD03FD8F9D +:106EE0008DF8001069460320FFF724FF002828686A +:106EF0007CD090F8341011B190F8001159B1286885 +:106F0000807801283ED0C948FEF71EF8286880F82E +:106F100001B000F06EB99DF8003080F80091017862 +:106F200080F80111FF2B10D000F20312511E1846F9 +:106F300004F064FC002808BFFFDF286890F8021105 +:106F400041F0020180F802110DE03178C1F38011A7 +:106F500080F80211B149D1F88721C0F80321B1F8B6 +:106F60008B11A0F80711286800F2091690F8360076 +:106F70007F2808BFFFDF286890F83610317080F84E +:106F80003640BCE7A94CDAF8049004F12806A4F8CE +:106F900000800721204605F048FD0021204605F02D +:106FA00047FF4946204605F04CFF0623002206F124 +:106FB0000901204605F022FF2868417B204605F0A4 +:106FC00074FD286800F1380190F85720204605F03C +:106FD00066FF2046FDF7B8FF28680122962190F849 +:106FE000BB300020FDF766FE90E7FFE780780028C1 +:106FF00040F0FD8000F0F9B88DF8081002A90520D6 +:10700000FFF798FE0028286800F0EA808278884917 +:10701000002A7DD0A1F11F066C6890F8BB90D6F8CD +:107020000F00C4F80E00B6F813006082707D207562 +:10703000B07D6075B6F81700E082B6F81900608080 +:10704000B6F81B00A080B6F81D00E08004F108002F +:107050000DF064FA96F8240000F01F00207696F8F0 +:107060002400400984F86C0184F8549084F8559009 +:10707000286890F8CC1084F8561090F8BD0084F879 +:1070800057009DF80810686800F079F9022001F0B7 +:10709000D1FAA6F12804DAF80090A4F800800821BB +:1070A000204605F0C2FC0021204605F0C1FE4946FD +:1070B000204605F0C6FE6946304605F0EFFC304636 +:1070C00005F009FD0146204605F0EFFC06230022ED +:1070D000694600E0B8E0204605F090FE694630467B +:1070E00005F0CEFC304605F0E9FC0146204605F0EF +:1070F000E9FC062301226946204605F07FFE204672 +:10710000FDF722FF28680122962190F8BB3000E0AD +:1071100006E00020FDF7CEFD286880F801B068E0A9 +:107120006C6832783F4E607BC2F34012104060734F +:10713000D6F80F00C4F80E00B6F813006082707D18 +:107140002075B07D6075B6F81700E082B6F81900BA +:107150006080B6F81B00A080B6F81D00E0804FF0FC +:10716000010A04F108000DF0D9F996F8240000F0A6 +:107170001F00207696F82400400984F86C0184F8FA +:1071800054A084F855A0286890F8CC1084F85610C4 +:1071900090F8BD0084F857009DF80810686800F06A +:1071A000EEF8286880F8D09090F8D210B0F8D400AB +:1071B00000F071F868680088F9F72CFDF9F7C4F958 +:1071C000286880F80180FDF765FFFDF744FFFDF7B3 +:1071D0003FFEFDF7A8FE012001F02CFA09E000BFF8 +:1071E00090F82200C0F3001008B1012701E0FEF77B +:1071F000AAFF286890F8330018B1FDF769FFFDF782 +:1072000038F91FB100210120FFF783FB286841787E +:1072100000291ABF4178012903B00BE0A40A00201D +:10722000CC000020280C002060480200000C002048 +:10723000470C002008BFBDE8F08F4078032818BF36 +:10724000FFDF03B0BDE8F08F286890F82200C0F39C +:1072500000100028CBD0C8E770B5864C06460D4616 +:107260002068807858B1FDF765FA216803463046FA +:1072700091F8BB202946BDE8704001F048BAFDF7FF +:1072800059FA21680346304691F8BA202946BDE8EC +:10729000704001F03CBA784A137882F8F530A2F8D1 +:1072A000F60082F8F410012082F8F20092F8C4008F +:1072B000002818BF92F8C00082F8F800704778B52F +:1072C00004466C4800230093006890F8BA20082A0E +:1072D00004BF4FF4C87240230DD0042A04BF4FF4FA +:1072E000BF72102307D0022A07BF03F1180204233C +:1072F00003F128020823491D01FB032690F8BC2056 +:107300009DF8001062F3050141F040058DF8005032 +:1073100090F8BB00012804BF9DF8020020F0E000B7 +:107320002AD0022818BFFFDF21D000BF25F080003F +:107330008DF80000C4EB041106FB04F001EB8101A1 +:1073400000EB81044D48844228BFFFDF4C48A0FB7E +:107350000410BDF80110000960F30C01ADF8011034 +:10736000BDF800009DF8021040EA014078BD9DF88C +:10737000020020F0E00020308DF80200D6E72DE971 +:10738000F0413C4D04460E46286890F8D000002895 +:1073900018BFFFDF0027286880F8D2702188A0F886 +:1073A000D4106188A0F8EA10A188A0F8EC10E18858 +:1073B000A0F8EE1094F86C1180F8F01090F82F10EF +:1073C00049B1427B00F10E01012A04D1497901F053 +:1073D000C001402935D090F8301041B1427B00F116 +:1073E0000E01012A04BF497911F0C00F29D0DE3007 +:1073F0000DF082F82348FF2E0078C0F380106076ED +:107400001D48D0F88711C4F81A10B0F88B01E0833A +:1074100028681ED0C0F8E410E18BA0F8E81000F155 +:10742000D802511E304604F0E9F9002808BFFFDFFA +:10743000286890F8D71041F0020180F8D710BDE815 +:10744000F081D0F80E10C0F8DE10418AA0F8E210EA +:10745000D0E7C0F8E470A0F8E870617E80F8D7103B +:10746000D4F81A10C0F8D810E18BA0F8DC10BDE8F1 +:10747000F0810000CC000020A40A0020C4BF03005B +:1074800089888888280C0020FE48406870472DE9CC +:10749000F0410F46064601461446012005F098F9D2 +:1074A000054696F85500FEF7A6F8014696F85500F1 +:1074B000022808BFF44807D0012808BFF34803D0CA +:1074C00004280CBFF248F34808444FF47A7100F2E4 +:1074D000E140B0FBF1F0718840F271225143C0EB02 +:1074E0004100001BA0F5597402F0B6FD002818BF3A +:1074F0001E3CAF4234BF28463846A04203D2AF42BA +:107500002CBF3C462C467462BDE8F0812DE9FF4F4C +:107510008FB0044690F855601C98994640EA0900DF +:10752000039094F86500002790460D280CBF0120B9 +:1075300000200990B9F1000F04BF94F80C01032852 +:107540002BD1099848B3B4F88E01404525D1D4F821 +:107550001401C4F80001608840F2E2414843C4F8D5 +:107560000401B4F85A01B4F8E6100844C4F808015C +:10757000204602F07BFDB4F89201E08294F890017D +:107580006075B4F894016080B4F89601A080B4F8F6 +:107590009801E080022084F80C01D4F864010C907A +:1075A000B4F8E6B0B4F85801D4F860A1D4F8541196 +:1075B0000691B9F1000F03D094F8201149B193E07E +:1075C00004F1E00107917431089104F5A075091DDB +:1075D00007E004F59A710791091D089104F5927569 +:1075E000091D0A91B4F85810A8EB0000A8EB01019E +:1075F00009B200B20091002805DAD4F850010690D3 +:1076000001200390084694F80C11002971D001293B +:1076100000F03782022900F05F81032918BFFFDFE5 +:1076200000F0728239460698FAF7FBFF08990126A6 +:1076300040F2712208600A98A0F8008000202870AB +:107640002E7108980068A8606188D4F8140151432D +:10765000C0EB41009049A0F54D70886149698142B5 +:1076600087BF07990860079801600798616A0068FA +:10767000084400F5D270E86002F0EEFC10B1E86852 +:107680001E30E8606E71B4F8D000A0EB080000B2C4 +:107690000028C4BF03206871099800281C9800F0D6 +:1076A000A682C0B1B4F8F81000290CBF0020B4F8CD +:1076B000FA00A4F8FA0094F8FC20401C50438842D9 +:1076C00009D26879401E002805DD6E71B4F8FA0011 +:1076D000401CA4F8FA00B9F1000F00F0AB8294F856 +:1076E0002001002800F0A28213B00220BDE8F08F34 +:1076F000FFE7BAF1000F08BFFFDF94F855106148AB +:1077000090F8280005F079F90C90E18A40F2712098 +:1077100041430C98002200EB41011098002806D04C +:1077200000FB01F15D48B1FBF0F000F10102C4F88B +:107730001021608840F2E24100FB01F210994FF005 +:10774000000006D0554801FB02F1B1FBF0F000F15A +:107750000100C4F8140186B221464FF00100D4F8AC +:1077600028B005F035F8074694F85500FDF743FFBB +:10777000014694F85500022808BF434807D0012865 +:1077800008BF424803D004280CBF41484148084480 +:1077900000F2E1414FF47A70B1FBF0F1608840F201 +:1077A00071225043C1EB4000801BA0F5597602F0D6 +:1077B00053FC002818BF1E3EBB4534BF3846584610 +:1077C000B04203D2BB452CBF5E463E46666294F88B +:1077D0005500FDF72EFF4FF47A7600F2E140B0FB42 +:1077E000F6F000EB0A0794F85500FDF722FF01467A +:1077F00094F85500022808BF234A07D0012808BF83 +:10780000224A03D004280CBF214A224A01EB020B72 +:10781000FDF7F1FE584400F2DB514FF47A70B1FBF2 +:10782000F0F1E08A40F2712242430C98D4F810B192 +:1078300000EB4200401AA0EB0B003844A0F12007F7 +:10784000607D40F2E24110FB01F0049094F8556035 +:107850003046FDF7D0FE0146022E08BF0A4807D089 +:10786000012E08BF094803D0042E0CBF0848094860 +:10787000084400F2E1414FF47A70B1FBF0F000EB04 +:107880004B010DE0500C002004360200A22402003F +:10789000D0FB0100C0D40100D400002040420F0002 +:1078A000049801EB000B3046FDF799FE584400F1B7 +:1078B0006201FD48416194F85500FDF7BAFE00F2FF +:1078C000E1414FF47A70B1FBF0F05044381AB0F552 +:1078D0003D7F38BFFFDFA5E6E08A40F27121D4F892 +:1078E0000421484302EB400210980021002806D0F2 +:1078F00000FB02F1ED48B1FBF0F000F10101C4F82A +:107900001011618840F2E24001FB00F210994FF043 +:10791000000006D0E54801FB02F1B1FBF0F000F1F8 +:107920000100C4F8140186B221464FF00100D4F8DA +:1079300028A004F04DFF074694F85500FDF75BFEC4 +:10794000014694F85500022808BFD94807D00128FD +:1079500008BFD84803D004280CBFD748D7480844EC +:1079600000F2E1414FF47A70B1FBF0F1608840F22F +:1079700071225043C1EB4000801BA0F5597602F004 +:107980006BFB002818BF1E3EBA4534BF3846504630 +:10799000B04203D2BA452CBF56463E466662BBF1A2 +:1079A000000F2ED11C9860B394F855603046FDF757 +:1079B00022FE022E08BFBE4907D0012E08BFBD49D6 +:1079C00003D0042E0CBFBC49BC49084400F2E1417D +:1079D0004FF47A70B1FBF0F0D4F81011E38A084448 +:1079E00040F27121D4F80421594302EB41010F1AEE +:1079F0003046FDF7F4FD0C99081A3844A0F1200731 +:107A00000AE0E18A40F27122D4F80401514300EB0C +:107A10004100D4F81011471AD4F80821D4F8001105 +:107A2000D4F8100101FB020B607D40F2E24110FB33 +:107A300001FA94F855603046FDF7DDFD0146022E4F +:107A400008BF9B4807D0012E08BF9A4803D0042ED8 +:107A50000CBF99489948084400F2E1414FF47A700C +:107A6000B1FBF0F000EB4B0082443046FDF7B7FD70 +:107A7000504400F160018C484161012084F80C0100 +:107A8000D0E5628840F27123D4F814115A43C1EB57 +:107A9000420202FB00F70098D4F800C10BEB000291 +:107AA000D4F80801D4F81031121A0CFB0030521E21 +:107AB00002FB010B607D40F2E24110FB01FA94F8F9 +:107AC00055000646FDF797FD0146022E08BF78488F +:107AD00007D0012E08BF774803D0042E0CBF76488C +:107AE0007648084400F2E1414FF47A70B1FBF0F0BF +:107AF00000EB4B0082443046FDF771FD504400F12D +:107B00006001694841618DE5628840F27123D4F8D3 +:107B100014115A43C1EB420101FB00F794F86400D1 +:107B200024281CBF94F8650024280BD1B4F88E01DA +:107B3000A8EB000000B2002804DB94F891010028B3 +:107B400018BF0646039850B3BBF1000F27D10C981D +:107B5000002814BFBAF1000FFFDF94F85500FDF7BD +:107B60004AFD022E08BF524907D0012E08BF5149D5 +:107B700003D0042E0CBF50495049084400F2E141A3 +:107B80004FF47A70B1FBF0F03F1A94F85500FDF70E +:107B900026FD01460C98401A3844A0F120070098B1 +:107BA000D4F81411584400FB01FA3046FDF723FDC8 +:107BB0000146022E08BF3E4807D0012E08BF3D48AF +:107BC00003D0042E0CBF3C483C48084400F2E1417D +:107BD0004FF47A70B1FBF0F000EB4A0A3046FDF743 +:107BE000FEFC504400F160012F4841611AE5002875 +:107BF0007FF458AD94F80C0100283FF46CAD618817 +:107C000040F27122D4F814015143C0EB41012846DF +:107C100004F08DFD0004000C3FF45DAD1D990029BA +:107C200018BF0880012013B0BDE8F08F94F85C0104 +:107C3000FBF748FB94F85C012946FBF731FA002872 +:107C40001CBF89F0010084F82101002013B0BDE8B9 +:107C5000F08F2DE9F04F1A4C074683B02078894603 +:107C6000114E00254FF00208032804BF207BB842C4 +:107C70007ED1606830612078032818BFFFDF0327BA +:107C8000B9F1080F7FD2DFE809F0041D2828237E10 +:107C90007E796562FEF712FC002818BFFFDFB7701F +:107CA00003B0BDE8F08F0000D400002040420F0078 +:107CB00004360200A2240200D0FB0100C0D401005F +:107CC000500C0020FEF71CFF002818BFFFDFE7E77D +:107CD00003B0BDE8F04FFDF75CBA2775257494F842 +:107CE0002C00012658B14FF47A71A069FAF799FC7B +:107CF000A061002104F1100004F019FD1AE0012137 +:107D00006846FBF7BDFF9DF8000042F210710002CB +:107D1000B0FBF1F201FB1205FDF7F4FF0544294623 +:107D2000A069FAF77EFCA061294604F1100004F076 +:107D3000FEFC461C208C411C0A293CBF3044208498 +:107D4000606830B1208C401C0A2828BF84F8158058 +:107D500000D267753046FEF771F90028A0D0607A2E +:107D600000289DD1207B04F11001FBF799F901E077 +:107D70000BE008E0002808BFFFDF91E7207BFAF75F +:107D800028FF25708CE7FFDF8AE7202F28BFFFDF61 +:107D9000DFF804A407213AF81700F8F709FE0400F9 +:107DA00008BFFFDF202F28BFFFDFFB48218830F806 +:107DB0001700884218BFFFDF01273461B9F1080FAF +:107DC00080F05481DFE809F0049EA6A6A1F0F0EF50 +:107DD000C4F86051F580C4F8645194F8210138B9B1 +:107DE000FAF716FFD4F82C11FBF720FC00281BDC57 +:107DF000B4F81E11B4F85800814206D1B4F8D4107A +:107E0000081AA4F8D600204605E0081AA4F8D600FF +:107E1000B4F81E112046A4F85810D4F84811C4F83C +:107E20002C11C0F850111DE0B4F81C11B4F8580022 +:107E3000091AA4F8D610B4F81C112046A4F858105A +:107E4000D4F82C11C4F84811C4F85011D4F83411E6 +:107E5000C4F8E010D4F83811C4F85411B4F83C1147 +:107E6000A4F8581101F0ACFFFAF7ACFE94F855A055 +:107E700081465046FDF7BFFBBAF1020F08BFC74964 +:107E800009D0BAF1010F08BFC54904D0BAF1040FF7 +:107E90000CBFC449C44908444FF47A7100F2E14070 +:107EA000B0FBF1F1D4F8140140F271220144608872 +:107EB0005043C1EB4000A0F1300AB9F1B70F98BFB1 +:107EC0004FF0B7092146012004F082FC4844AAEB98 +:107ED0000000A0F21939A2462146012004F078FCE6 +:107EE000DAF824109C30814288BF0D1AC6F80C9035 +:107EF0004D4538BFA946C6F8089084F8207186F829 +:107F00000280CDE602F0A3F801E0FDF742F984F823 +:107F10002071C5E6FAF77CFED4F8502101461046E0 +:107F2000FBF784FB48B1628840F27123D4F8141146 +:107F30005A43C1EB4201B0FBF1F094F865100D29F2 +:107F40000FD0B4F85820B4F81E1113189942AEBFE0 +:107F5000481C401C1044A4F81E0194F8220178B972 +:107F600005E0B4F81E01401CA4F81E0108E0B4F8B6 +:107F70001E01B4F8D410884204BF401CA4F81E01AE +:107F8000B4F85A01DFF82492401CA4F85A01B4F85E +:107F90008000B4F87E10401AB4F85810401E08440F +:107FA0001FFA80FB24E053E060E000BF96F80080F9 +:107FB000B8F10C0F28BFFFDF39F8188094F86CA1D6 +:107FC000BAF10C0F28BFFFDF39F81A000023404434 +:107FD00081B202A8CDE90050B4F81E212046FFF777 +:107FE00095FA00283FF45CAE012818BFFFDF27D0C8 +:107FF000B4F81E01ABEB000000B20028D6DA08206E +:1080000084F8740084F87370204601F02AFB84F829 +:108010000C5194F85C514FF6FF77202D00D3FFDF11 +:108020005D4820F8157094F85C01FAF7D2FD202025 +:1080300084F85C01307903B0BDE8F04FF3F7A6BED9 +:10804000B4F81E01BDF808100844A4F81E01CFE7DB +:1080500094F80C01042818BFFFDF84F80C5194F841 +:108060005C514FF6FF77202DDAD3D8E7FFDF17E614 +:1080700010B54F4C207850B101206072FEF75EFDC4 +:108080002078032805D0207A002808BF10BD0C20D6 +:1080900010BD207BFBF716F9207BFBF760FB207BF4 +:1080A000FAF797FD002808BFFFDF0020207010BD01 +:1080B0002DE9F04F3E4F83B0387801244FF000088F +:1080C00040B17C720120FEF739FD3878032818BFD3 +:1080D000387A0DD0DFF8DC9089F803406946072034 +:1080E000F8F7EFFB002818BFFFDF4FF6FF7440E002 +:1080F000387BFBF7E7F8387BFBF731FB387BFAF787 +:1081000068FD002808BFFFDF87F80080E2E70298DB +:1081100000281CBF90F80C1100292AD00088A0422A +:108120001CBFDFF874A04FF0200B4AD00721F8F7EE +:108130003FFC040008BFFFDF94F85C01FBF70FFB76 +:1081400084F80C8194F85C514FF6FF76202D28BFFF +:10815000FFDF2AF8156094F85C01FAF73AFD84F81D +:108160005CB169460720F8F7ACFB002818BFFFDFB9 +:1081700022E06846F8F783FB0028C8D021E0029887 +:1081800000281CBF90F80C11002915D00088A0F51C +:108190007F41FF39CAD114E0840C0020043602006C +:1081A000A2240200D0FB0100C0D4010084480200D8 +:1081B000500C0020D40000206846F8F760FB00282F +:1081C000DDD089F8038087F82C8087F80B8003B016 +:1081D0000020BDE8F08F70B50446FD4890F800041B +:1081E000FC4D400995F800144909884218BFFFDF8B +:1081F00095F8140D4009F84991F80014490988428E +:1082000018BFFFDFF549002001220C7188700A7049 +:108210004870C870F2490870BDE8704048E7EF49FF +:10822000087070472DE9F843ED4C064688462078E3 +:1082300000285CD1EB48FAF772FC2073202856D056 +:10824000032766602770002565722572AEB1012193 +:1082500006F1FC00FBF73DFD0620F8F751FB8146D7 +:108260000720F8F74DFB96F8FC104844B1FBF0F2FC +:1082700000FB1210401C86F8FC00FAF7A3FCDA4958 +:10828000091838BF40F2F65000F23D1086B2FDF7F3 +:10829000F9FBE061FDF736FD4FF0010950B384F8BA +:1082A0000A9001216846FBF7EBFC9DF8000042F2C2 +:1082B00010710002B0FBF1F201FB12000644FAF764 +:1082C000A7FC3146FAF7ADF9A061277567752574EB +:1082D000207B04F11001FAF7E3FE002808BFFFDF5E +:1082E00025840020FEF72AFC0020BDE8F8830C203E +:1082F000BDE8F883FAF78CFC3146FAF792F9A061F1 +:10830000A57284F82C90A8F226502063DDE7B349CB +:1083100048707047B24810B5417A0124002918BF4F +:10832000002409D190F82C1031B1416A006B8142D0 +:1083300084BF0024FEF7FCFB204610BD70B5A74C9F +:108340000546E088401CE080D4E902016278D5F857 +:108350006061002A1CBF324604F019FAA060864210 +:1083600008D895F80C01012804D0E078002804BF53 +:10837000012070BD002070BD70B50C4640F2E24196 +:1083800000FB01F52046FDF736F9022C08BF97499E +:1083900007D0012C08BF964903D0042C0CBF954987 +:1083A000954908444FF47A7100F2E140B0FBF1F0D6 +:1083B00000F54D7085428CBF281A002070BD2DE954 +:1083C000F04F83B04FF00009044680F8209190F8F8 +:1083D000DE00002807BF94F80C01032803B0BDE8B5 +:1083E000F08FFAF715FCD4F8502101461046FBF740 +:1083F0001DF90028DCBF03B0BDE8F08F628840F2B1 +:108400007123D4F814115A43C1EB4201B0FBF1F0CF +:10841000411CB4F858000144A4F81C11B4F8D4105D +:10842000B4F81C21891A09B20029DCBF03B0BDE8E9 +:10843000F08F012184F82211B4F88010B4F87E2066 +:108440006E4F891A491E084485B2DFF890A10DF1DC +:10845000080B25E09AF800600C2E28BFFFDF37F8E4 +:10846000166094F86C81B8F10C0F28BFFFDF37F865 +:108470001800CDE9009B3044B4F81C2181B20123DF +:108480002046FFF743F8002804BF03B0BDE8F08F93 +:1084900001280FD0022812BFFFDF03B0BDE8F08F24 +:1084A000B4F81C01281A00B20028BCBF03B0BDE814 +:1084B000F08FCFE7B4F81C01BDF808100844A4F809 +:1084C0001C01EDE72DE9F0430422002583B00629C5 +:1084D0007DD2DFE801F0074B03191951044680F8FB +:1084E0000C2107E004463D48C178002918BF84F8F4 +:1084F0000C210CD0FAF798FAA4F85A51B4F85800A5 +:10850000A4F81E0184F8225103B0BDE8F083067878 +:108510000C2E28BFFFDF394F94F80C0137F8166096 +:108520004FF00109032807D00128E3D194F86C81AA +:10853000B8F10C0F0AD308E0C4F80851C4F8005190 +:1085400094F86C81B8F10C0F00D3FFDF37F81800F6 +:10855000CDE90095304481B2B4F8D4200023204600 +:10856000FEF7D4FF002818BFFFDFC3E7032180F820 +:108570000C1103B0BDE8F0830546876AB0F814011A +:10858000294686B2012004F023F9044695F85500E7 +:10859000FDF731F895F85510022908BF134907D0A7 +:1085A000012908BF124903D004290CBF11491249FF +:1085B00008444FF47A7100F2E140B0FBF1F06988B1 +:1085C00040F271225143C0EB4100801B18E02DE0C6 +:1085D00001E000E00BE000E019E000E0D400002042 +:1085E000500C0020537C01000AFAFFFF0436020001 +:1085F000A2240200D0FB0100C0D401008448020084 +:10860000A0F5597601F028FD002818BF1E3EA742AC +:1086100034BF20463846B04228BF344602D2A74273 +:1086200028BF3C466C6203B0BDE8F083FFDF03B0B7 +:10863000BDE8F083F8B5894C0246874F0025616894 +:10864000606A052A48D2DFE802F0032F34373E0083 +:10865000A07A002660B101216846FBF71BFB9DF85C +:10866000000042F210710002B0FBF1F201FB1206B1 +:10867000FDF748FB8119A069F9F7D3FFA0612574C4 +:1086800003206075607A38B9207B04F11001FAF795 +:1086900007FD002808BFFFDF2584FAF7C5F9387900 +:1086A000BDE8F840F3F772BBBDE8F840002100F0E8 +:1086B0006DB8C1F86001F8BDD1F86001BDE8F840BF +:1086C000012100F063B884F82C50FAF7ADF938793D +:1086D000BDE8F840F3F75ABBFFDFF8BD70B55E4C5C +:1086E000A178022906BFE188002970BD2569C5F877 +:1086F000640195F85500FCF772FFD5F86411081A6B +:10870000A1680144A160E1680844E06070BD70B5F3 +:108710000546514890F802C0BCF1020F06BF00693F +:1087200000F5B0744E4C002904BF256070BD4FF4B5 +:108730007A7601290DD002291CBFFFDF70BD1046DB +:10874000FCF768FF00F2E140B0FBF6F0281A206069 +:1087500070BD1846FCF76DFF00F2E140B0FBF6F08B +:10876000281A206070BD3D48007800281CBF0020FA +:10877000704710B50720F8F7B5F880F0010010BD7C +:1087800036480078002818BF012070472DE9F047CF +:10879000324C82B0002584F82C50D4F8188084F82C +:1087A0002810E572814625700127277229466068E6 +:1087B00003F030FB6168C1F85081267B81F85C6171 +:1087C000C1F86091C1F85481B1F80080202E28BF13 +:1087D000FFDF244820F81680646884F80C51DFF825 +:1087E0007880A4F8585198F800600C2E28BFFFDF5D +:1087F000DFF8749039F816A094F86C610C2E28BF3D +:10880000FFDF39F816000023504481B200951A4664 +:1088100020460195FEF77AFE002818BFFFDFC4F856 +:108820000851C4F8005184F80C71A4F81E51A4F842 +:108830001C5184F82251B4F85800401EA4F8580086 +:10884000A4F85A51FAF7F0F898F8040002B0BDE81D +:10885000F047F3F79BBA0000D4000020500C002032 +:10886000740C0020840C00208448020070B5FE4C7B +:1088700021690A88A1F8FC2181F8FA0191F85400D5 +:10888000012808BF012503D0022814BFFFDF0225FD +:10889000206980F8FE5190F85500012808BF012595 +:1088A00003D0022814BFFFDF02252069012180F8D0 +:1088B000FF5180F8F811002180F8A4112079BDE85B +:1088C0007040F3F763BA2DE9F04FE74C83B0A0791D +:1088D00010F0010F04BF03B0BDE8F08FA0690123C1 +:1088E0000521C578206990F86520583003F0B5FE61 +:1088F00068B1A81E0A2806D2DFE800F009090505BC +:10890000090905050909A07840F00800A070A078C1 +:1089100000281CBF03B0BDE8F08FA06920274FF0EE +:10892000020890F80390B9F1000F1CBFB9F1010FD4 +:10893000B9F1160F1ED1206990F8640003F076FE9D +:10894000C0B1216991F864001F2813D0202808D0F5 +:10895000B9F1160F0CBFA77084F8028003B0BDE810 +:10896000F08F262081F86400B9F1160F1CBF2A2071 +:10897000FFF77CFF47F6FE7A012600254FF0280B13 +:10898000B9F10C0F00F049810BDCB9F10C0F80F04C +:108990005884DFE809F068412BD9F6F6F5F4F3F6D0 +:1089A000AAD0B9F1150F00F0518211DCB9F1110F05 +:1089B00000F0BE83B9F1120F00F0C981B9F1130FB5 +:1089C00000F0B881B9F1140F00F0D58100F039BC86 +:1089D000B9F1160F00F06C82B9F1180F00F0CE82D9 +:1089E000B9F1FF0F00F0268400F02BBC20690123B1 +:1089F000194690F86720583003F02FFE002840F009 +:108A00002284A06904F018FB216981F87201072013 +:108A100081F8670000F017BC20690123002190F85D +:108A20006520583003F019FE002800F0BA83A069D1 +:108A300004F0FFFA2169A1F88E01B1F85820801ADC +:108A400000B28245A8BF0028DCBF81F874B081F86D +:108A5000736040F3F88301F5C871A06904F0E4FA8B +:108A60000B2021693DE020690123002190F8652059 +:108A7000583003F0F2FD002800F09383A06904F061 +:108A8000AFFA002800F0DD83A0692269B0F80D106C +:108A9000A2F88E11B2F85830C91A09B28A45A8BF97 +:108AA0000029DCBF82F874B082F8736040F3CB8396 +:108AB000017982F89011B0F80510A2F8921104F033 +:108AC00082FA2169A1F89401A06904F07FFA216972 +:108AD000A1F89601A06904F080FA2169A1F8980133 +:108AE0000D2081F8650000F0AEBB20690123002154 +:108AF00090F86520583003F0B0FD002820690BD0B5 +:108B0000A0F88A5090F88C10491C80F88C10102125 +:108B100080F8651000F097BB90F8652001230521CF +:108B2000583003F09AFD00281CBF0820A07040F0C8 +:108B30008A8300F036BB206990F86510112908BFC0 +:108B4000122140F09C82E3E720690123002190F884 +:108B50006520583003F081FDA0B9206990F86520A8 +:108B6000122A0FD001230521583003F076FD00288A +:108B700018BF082000F0158300F097B9B7E0F6E2BF +:108B800036E05EE3206990F88E1031B9A0F88A5083 +:108B900090F88C10491C80F88C1000F1E801A06955 +:108BA00004F063FA206900F1C001A06904F068FADA +:108BB000206990F8C001002818BFFFDF20690188F4 +:108BC000A0F8C21100F5E271A06904F03CFA206936 +:108BD00000F5E671A06904F03EFA206980F8C061F2 +:108BE000142180F865102079F3F7D0F800F02BBB42 +:108BF000206990F86510172940F0418290F88C1098 +:108C0000491E49B280F88C100029B8BFFFDF1B2035 +:108C1000216981F8650000F016BB206990F86610A4 +:108C200011F0020F09D090F8642001230821583078 +:108C300003F013FD002800F0B482206990F8900042 +:108C400010F0020F18D1A06904F02EFA216981F802 +:108C50009100A069B0F80520A1F89220B0F80700B3 +:108C6000A1F8940002E00000F000002091F89000CC +:108C700040F0020081F89000206990F8901011F007 +:108C8000010F05D0206990F8641006291CD114E06A +:108C900090F8660010F0020F18BFFFDF206990F80F +:108CA000661041F0020180F86610A0F88A5090F832 +:108CB0008C10491C80F88C10E4E780F8645080F830 +:108CC00088502079F3F762F8206990F88C11042914 +:108CD00040F0B98280F88C512079F3F757F8206979 +:108CE00090F86410002940F0AE8200F01EBA2069AE +:108CF00090F8660010F0010F77D16946A06904F082 +:108D0000DAF99DF8000000F02501206980F896103E +:108D10009DF8011001F0410180F89710A0F88A50E9 +:108D200090F88C10491C80F88C1090F8661041F077 +:108D300001011CE020690123092190F864205830CA +:108D400003F08BFC002840F0248200F02ABA20694E +:108D500090F8661011F0040F40F02382A0F88A50BA +:108D600090F88C2041F00401521C80F88C2080F88F +:108D7000661000F068BA206990F8660010F0300FB5 +:108D800033D1A06904F0B4F9002800F05A822769B1 +:108D9000A06904F0A9F938872769A06904F0A0F94F +:108DA00078872769A06904F0A1F9B8872769A069C5 +:108DB00004F098F9F887A07910F0020F03D06069E9 +:108DC000C078142812D0206990F864101C290DD0A6 +:108DD00090F84E1001290CD090F89B11002904BF87 +:108DE00090F89A1100290CD003E05BE0206980F82C +:108DF0004E60206990F8661041F0100180F866100E +:108E00001AE090F8661041F0200180F866100288A0 +:108E1000A0F8E021028FA0F8E221428FA0F8E4211F +:108E2000828F00F5D671A0F8E621C08F888781F87F +:108E300032602079F2F7AAFF2069A0F88A5090F8F2 +:108E40008C10491C80F88C1000F0FDB920690123BA +:108E50000A2190F86420583003F0FFFB10B3A0699A +:108E600004F046F9A8B12669A06904F03DF93087FD +:108E70002669A06904F034F970872669A06904F0B6 +:108E800035F9B0872669A06904F02CF9F08701F064 +:108E9000EDFA206980F8885080F8645001F0B6FA45 +:108EA00000F0D1B9A07840F00100A07000F0CBB97B +:108EB000206901230B2190F86520583003F0CDFB89 +:108EC00010B1A77000F0BFB920690123002190F80C +:108ED0006520583003F0C1FB002800F06281206952 +:108EE00090F864002428ECD0A06904F01CF9002854 +:108EF00000F0A781206990F8961041F0040180F8F5 +:108F00009610A1694A7902F0070280F85120097988 +:108F100001F0070180F8501090F8A531002B04BF34 +:108F200090F8A431002B1CD190F855C000F15403E7 +:108F30008C4502BF1978914280F87D6011D000F510 +:108F4000D67180F8F2610288A0F8F42190F85020E0 +:108F500080F8F62190F8510081F84B002079F2F763 +:108F600015FF2069212180F86510A0F88A5090F83B +:108F70008C10491C80F88C1000F065B9206990F8BD +:108F80006410202914BF0027012790F865102229BA +:108F900008BF00F1650804D0002F18BF00F1640875 +:108FA0006DD090F8961041F0040180F89610A069F9 +:108FB00004F0DBF8F0B3D4F81890484604F0C9F890 +:108FC0000090484604F0C9F8814603F03CFC0100DB +:108FD00018D0206990F854208A4213D090F8A43118 +:108FE00023B190F8A63113EA090F4BD0002F04BF2C +:108FF00090F8513013EA090F01D18A4242D890F813 +:10900000A401B8B1DDF80090484603F01CFC78B12B +:10901000216991F8552082420AD091F8A40120B12B +:1090200091F8A70110EA090F2CD091F8A40108B11A +:109030006A4600E026E0A169206903F013FCE8B36A +:10904000A06904F090F82169A1F88E01B1F85820C8 +:10905000801A00B28245A8BF0028DCBF81F874B036 +:1090600081F8736052DD9DF8000081F890019DF851 +:10907000010081F89101242088F8000046E084F87E +:109080000280E0E0206990F8A40100281CBF1E20A7 +:10909000FFF7ECFBB7B1A0692169C07881F8CA007D +:1090A00006FA00F010F0807F08BFFFDF0A21206978 +:1090B00080F8641090F88800002800E014E008BFF1 +:1090C000FFDF0DE088F80050216991F88C00401E08 +:1090D00040B281F88C000028B8BFFFDF01F07BF9B7 +:1090E000206980F87D50AEE0206990F8A40120B19D +:1090F0000020FFF7BBFB88F80050206900F16501F4 +:1091000080F87D50884508BF80F86550206900F1DF +:109110006501884509D190F88C10491E49B280F844 +:109120008C100029B8BFFFDF8DE080F888508AE0FE +:10913000206990F8961041F0040180F89610A0691B +:1091400004F02FF816287ED1206990F864002028BA +:1091500002D0262805D076E0A06904F026F8FFF7B3 +:1091600085FB206980F8645080F888506BE02069A6 +:1091700090F864200E2A03D1A1690979122902D03E +:109180001C2A1AD10FE001230921583003F065FA97 +:1091900038B1206980F87C5080F8885080F864509D +:1091A00051E0A6704FE0A1690979142904BF80F845 +:1091B000645080F888503FF471AE202A03D1A16931 +:1091C0000979162914D0262A03D1A169097916290B +:1091D0000ED0A1690979172904BF90F86520222AC9 +:1091E00013D0E2691AB1FF2908BF80F886612AE02E +:1091F00080F8645080F8885090F86500212818BFE6 +:109200001A2020D0FFF732FB1DE080F8655090F85F +:109210008C10491E49B280F88C100029B8BFFFDFBE +:10922000206980F87D5090F8A401002818BF002024 +:1092300009D0E7E7E06900281CBF206980F8866153 +:1092400001D101F0C8F82069D0E92A12491C42F185 +:109250000002C0E92A1203B0BDE8F08F70B5FB4EE2 +:1092600005460C46306990F8CB00FE2818BFFFDF9A +:1092700032690020002C82F8CB501CBFA2F88A0073 +:1092800070BDA2F88400012082F8880070BD30B55E +:1092900085B005466846FCF73EFA002808BFFFDFA8 +:1092A000222100980BF003F80321009803F040FE00 +:1092B0000098017821F010010170294603F066FE44 +:1092C000E24C0D2D04BF0621009830D00BDCA5F137 +:1092D00002000B2819D2DFE800F0201863191926C4 +:1092E000187018192C00152D7BD008DC112D2DD0ED +:1092F000122D18BF132D09D0142D30D005E0162DD6 +:1093000046D0172D6BD0FF2D6AD0FFDFFCF716FA81 +:10931000002808BFFFDF05B030BD2069009990F834 +:10932000CC000871F2E72169009891F8CC10017126 +:10933000ECE7E26800981178017191884171090A9F +:1093400081715188C171090A0172DFE70321009818 +:1093500003F025FF0621009803F025FFD6E72069DA +:10936000B0F84410009803F0ABFE2069B0F8461046 +:10937000009803F0A9FE2069B0F84010009803F0AF +:10938000A7FE2069B0F84210009803F0A5FEBDE7E3 +:109390002069009A90F8A611117190F8A7014BE08E +:1093A000206900F1F001009803F06EFE206900F1E1 +:1093B000C401009803F072FEA8E7A549D1E90001B5 +:1093C000CDE90201206902A990F8960000F025007D +:1093D0008DF80800009803F09CFE97E701E019E083 +:1093E0002CE02069B0F84010009803F071FE20696D +:1093F000B0F84210009803F06FFE2069B0F84410F6 +:10940000009803F05DFE2069B0F84610009803F064 +:109410005BFE7BE7206990F8A41139B1009990F8C0 +:10942000A6210A7190F8A70148716FE7009A90F899 +:109430005410117190F85500507167E7206990F849 +:109440008721D0F88811009803F0AEFD5EE770B573 +:109450000C4605464FF4007120460AF04AFF25806D +:1094600070BDF7F7AEBB2DE9F0410D460746072169 +:10947000F7F79EFA040008BFBDE8F08194F8AC014C +:109480000026B8B16E700920287094F8AC0178B14C +:10949000268484F8AC61D4F8AE016860D4F8B201D7 +:1094A000A860B4F8B601A88194F8AC010028EFD107 +:1094B0002E7144E094F8B801002837D094F8B80130 +:1094C0000D2818D00E2818BFFFDF38D12088F7F7F5 +:1094D000A1FB0746F7F74DF8A0B96E700E20287073 +:1094E00094F8BA0128712088E88084F8B861384679 +:1094F000F7F739F823E02088F7F78CFB0746F7F7F2 +:1095000038F810B10020BDE8F0816E700D20287091 +:1095100094F8BA0128712088E88094F8BE01287276 +:1095200084F8B8613846F7F71EF808E094F8F001BF +:1095300040B16E701020287084F8F061AF80012077 +:10954000BDE8F08194F8C00190B16E700A202870D7 +:109550002088A880D4F8C401D4F8C811C5F8060042 +:10956000C5F80A10B4F8CC01E88184F8C061E6E7D8 +:1095700094F8CE0140B16E701A202870B4F8D00172 +:10958000A88084F8CE61DAE794F8EA0180B16E70C1 +:109590001B20287094F8EA010028D0D084F8EA61F2 +:1095A000D4F8EC01686094F8EA010028F6D1C6E727 +:1095B00094F8D2012F1DA0B16E701520287094F878 +:1095C000D201002818BF04F5EA75B8D084F8D2613A +:1095D000294638460AF099FF94F8D2010028F5D1BF +:1095E000ADE794F8DE0150B16E701D20287084F84C +:1095F000DE6104F5F07138460AF087FF9FE794F8C2 +:10960000F20138B11E20287084F8F261D4F8F40118 +:10961000686094E794F8F801002808BFBDE8F0817D +:109620006E701620287094F8F801002887D000BFCB +:1096300084F8F861D4F8FA016860B4F8FE01288172 +:1096400094F8F8010028F3D179E70000F000002039 +:109650009C480200FE4AD0600020D0611062117167 +:109660007047002180F8641080F8651080F8681059 +:1096700090F8DE1011B10221FEF724BF0321FEF79E +:1096800021BF2DE9F047F24C814686B020690D4696 +:109690000088F7F7D1FA070008BFFFDFA07828435A +:1096A000A070A0794FF0000510F0200F20691CBFBA +:1096B000A0F87E5080F8E45004D1B0F87E10491C28 +:1096C000A0F87E102069012690F86A1039B990F848 +:1096D000652001230621583002F0BFFF48B3E0881F +:1096E00010F4006F07D0206990F86A10002918BFA5 +:1096F000A0F876501DD12069B0F87610491C89B2C7 +:10970000A0F87610B0F878208A422CBF531A0023B4 +:10971000B4F808C00CF1050C634598BF80F87C6074 +:10972000914206D3A0F8765080F8F0612079F2F7E4 +:109730002DFBA0794FF0020A10F0600F11D02069C4 +:1097400090F8681011B1032906D00AE080F868602B +:109750000121FEF7B7FE04E080F868A00121FEF7C2 +:10976000B1FE206990F86810012905D1E18811F453 +:10977000807F18BF80F868A04FF00808B9F1000F8B +:1097800040F09981E28812F4007F18BFA0F8F850E9 +:1097900004D1B0F8F810491CA0F8F81012F0080F26 +:1097A00050D0A17800294DD190F8CB00FE2808BFF9 +:1097B000FFDFFE21206980F8CB1090F86510192991 +:1097C00007D0206990F864101F2911D027292AD0CA +:1097D0002FE080F88D5090F88C10491E49B280F827 +:1097E0008C100029B8BFFFDF206980F86550E8E7DA +:1097F00090F8650002F01AFF80B12069262101234C +:1098000080F8641090F865200B21583002F025FF95 +:10981000002804BF2A20FFF729F80AE02169202048 +:1098200081F8640005E080F8856180F8645080F874 +:109830008850206990F86710082904BF84F800A0B8 +:1098400080F8CBA0FFF73FF8A07910F0040F07D005 +:10985000A07828B9206990F86700072808BF26700B +:1098600000F038FCA07910F0100F09D0A07838B9BA +:10987000206990F865100B2904BF0C2180F8651051 +:10988000E07810F0080F11D020690123052190F82D +:109890006520583002F0E1FE28B184F8028020698A +:1098A00080F8B85102E0002001F0F2FAE0690028E7 +:1098B0005BD000950195029503950495206990F879 +:1098C0005500FBF798FE4FF47A7100F5FA70B0FB83 +:1098D000F1FA206990F85500FBF781FE5044ADF88D +:1098E000060020690188ADF80010B0F85810ADF8F6 +:1098F00004104188ADF8021090F8860130B1A069DB +:10990000C11C039103F0FEFA8DF81000206990F855 +:1099100085018DF80800E16968468847206980F86C +:10992000865180F885510399F9B190F88411E1B915 +:1099300090F86410272918D09DF81010039AA1B14F +:109940001378FF2B06D0072B02BF02295178FF297D +:1099500002D00AE01B2908D880F884610399C0F876 +:1099600088119DF8101080F8871100F0CCFD01F0EF +:1099700085FA0028206918BFA0F8D85004D1B0F8A3 +:10998000D810491CA0F8D81001F07BFA40B1216929 +:1099900091F8E40002289CBF401C81F8E40004D840 +:1099A000206990F8E400022806D92069A0F8D85070 +:1099B000A0F8DA5080F8E45020690123002190F8E3 +:1099C0006520583002F049FE20B9206990F8650002 +:1099D0000C285AD120690123002190F864205830C6 +:1099E00002F03BFEB0B320690123002190F867200C +:1099F000583002F032FE68B3206990F868100229EE +:109A000004BF90F8E40000283FD13846F6F781FB08 +:109A100000B3206990F8CB10FE2936D1B0F8D210EF +:109A2000012932D980F8DD60B0F88010B0F87E20CE +:109A30008B1E9A42AFBF0121891A491E89B2B0F824 +:109A4000D82023899A422EBF01229A1A521C02E082 +:109A5000F000002019E038BF92B2914288BF114651 +:109A6000012908BF80F8DD5090F869218AB1B0F86B +:109A7000DA20B0F86A0182422FBF0120801A401C10 +:109A800080B2814288BF014603E02069012180F84D +:109A9000DD502069B0F85820114489B2A0F8D410E4 +:109AA00090F86830002B18BF012B5DD0022B1CBF33 +:109AB000032BFFDF09D0E088C0F340200028206995 +:109AC00018BFA0F8E65059D151E090F86730082B44 +:109AD00021D0B0F87E10B0F8802000278B1C9A426D +:109AE00006D3511A891E0F043F0C1CBF791E8FB27A +:109AF00090F87C1051B190F864200123092158306E +:109B000002F0ABFD002808BF002729D0206990F89B +:109B10006A1089B908E0B0F87E30032B24D3B0F87E +:109B200080101144491C1FE090F865200123062194 +:109B3000583002F092FD78B121690020B1F8782008 +:109B4000B1F876108B1C9A4203D3501A801E18BFAE +:109B5000401EB84238BF87B2002F1CBF781E87B2A4 +:109B60002069B0F8D4103944A0F8D010A3E7B0F8B9 +:109B7000E610B0F8D6201144A0F8E610206990F85D +:109B8000701139B990F8672001231946583002F056 +:109B900064FD38B12069B0F88210B0F8D6201144C5 +:109BA000A0F88210206990F8883033B1B0F88410A2 +:109BB000B0F8D6201144A0F8841090F98C20002A27 +:109BC00006DDB0F88A10B0F8D6C06144A0F88A105B +:109BD0004FF03D0CB9F1000F18BF80F874C049D1A7 +:109BE0002178022911D0012908BF90F872113FD0C5 +:109BF000A17821B380F8736011F0140F18BF1E21F3 +:109C000009D000BF80F8741050E090F8CC100629FD +:109C100018BF16212CE011F0080F18BF80F874C08F +:109C200044D111F0200F18BF2321EBD111F0030F05 +:109C300008BFFFDF2A20216981F8740032E02BB1D0 +:109C4000B0F88410B0F88630994210D2002A05DDB1 +:109C5000B0F88A10B0F88620914208D2B0F882207D +:109C6000B0F880108A4208D390F870212AB12221DE +:109C700080F8741080F8736018E090F868203AB1AA +:109C8000B0F87E208A4228BF80F87480F2D209E0C2 +:109C9000B0F87E10062905D33E2180F8741080F8B4 +:109CA000736003E0206990F8731079B1206980F83F +:109CB000645080F8655080F8685090F8DE100029F4 +:109CC00014BF02210321FEF7FDFB02E00021FEF795 +:109CD000F9FB206980F8DE5006B0BDE8F047FBF7DD +:109CE0004FBDF84902468878CB78184313D108460F +:109CF00000694AB1897911F0080F03D090F8670024 +:109D0000082808D001207047B0F84810028E914210 +:109D100001D8FEF713BB0020704770B5E94C05462B +:109D20000E46E0882843E08015F0020F04D015F0BD +:109D3000010F18BFFFDF666115F0010F4FF0000241 +:109D40004FF001001AD0A661F178062902D00B2944 +:109D50000BD013E0216991F86530172B0ED1002349 +:109D6000C1E9283381F8690008E0216991F865307C +:109D7000112B04BF81F8692081F88E0015F0020FC5 +:109D800018D06169C978052902D00B290BD011E0E0 +:109D9000216991F86520152A0CD10022C1E92A22F7 +:109DA00081F86A0006E0206990F86510102908BF64 +:109DB00080F86A2015F0800F1CBF0820E07070BD8D +:109DC0002DE9F84FBF4C00254FF00108E580A57044 +:109DD000E5702570206168F30709074680F8DE808A +:109DE0000088F6F729FF5FEA000A08BFFFDF206955 +:109DF0000088FBF78DFC20690088FBF7AFFC206929 +:109E0000B0F8D21071B190F8CB10FE290FD190F8B4 +:109E1000701189B190F8672001231946583002F07B +:109E20001CFC88B1206990F8CB00FE2804D0206982 +:109E300090F8CB00FFF72BFA206990F8DF1000298B +:109E400018BF25811BD10FE02069A0F8825090F83F +:109E5000711180F8CC1000210220FFF7FFF9206972 +:109E600080F8DD500220E5E790F8AC1129B9018CAB +:109E70008288914288BF218101D881882181B0F8F0 +:109E8000D610491E8EB2B0F8D8103144A0F8D810C0 +:109E900090F8DC1000291CBFA0F8DA5080F8DC50E4 +:109EA00004D1B0F8DA103144A0F8DA10B0F87E101E +:109EB0003144A0F87E1090F86A1039B990F8652006 +:109EC00001230621583002F0C8FB28B12069B0F800 +:109ED00076103144A0F876102069B0F8D21001292C +:109EE0009CBF491CA0F8D210002E18BF80F8E45087 +:109EF00090F8DD10A1B1B0F8D800218988420FD2C6 +:109F00005046F6F706F958B1206990F8691139B151 +:109F1000B0F8DA10B0F86A01814228BF00F0B4FF4F +:109F2000206980F8DD5090F865100B2918BF0C29C6 +:109F300016D1B0F85820B0F88E31D21A12B2002AD9 +:109F40000EDBD0F89011816090F89411017302211A +:109F500001F060FF206980F8655080F898804AE041 +:109F6000242924D1B0F85810B0F88E21891A09B2EA +:109F700000291CDB90F8A42190F89011002908BF5B +:109F800090F8541080F8541090F89111002908BFEF +:109F900090F8551080F85510002A1CBF0020FEF7DD +:109FA00065FC206980F8655080F87D5023E090F8CA +:109FB0006410242918BF25291DD1B0F85810B0F815 +:109FC0008E21891A09B2002915DB90F89011002919 +:109FD00008BF90F8541080F8541090F8911100299F +:109FE00008BF90F8551080F855100020FEF73EFC91 +:109FF000206980F86450216901F15800B1F8D62039 +:10A0000002F02CF9206990F86911002918BFA0F816 +:10A01000DA502D4800902D4B2D4A3946484600F025 +:10A0200073FE216A00291CBF6078FBF720F82069C5 +:10A030000123052190F86520583002F00EFB00281E +:10A0400008BFBDE8F88FBDE8F84F00F066BC00F02F +:10A05000FBBE1C49C86170471A48C069002818BF78 +:10A0600001207047174A50701162704710B50446BE +:10A07000B0F894214388B0F89611B0F898019A424C +:10A0800001BFA3889942E38898420FD02388A4F89F +:10A09000B031A4F8B221A4F8B411A4F8B60101209B +:10A0A00084F8AC0107480079F1F770FE01212046E1 +:10A0B00001F0B0FE002084F86500032084F86800F9 +:10A0C00010BD0000F000002083960100E39C010019 +:10A0D0001B9D010070B5FE4CA07910F0020F08BF67 +:10A0E00070BDA078002818BF70BD6169F8482722AC +:10A0F000CB780E26002500690D2B78D00BDCA3F160 +:10A1000002030B2B1FD2DFE803F0201E808B9F2F52 +:10A110001E591E73D100152B00F02A810BDC112B68 +:10A1200065D0122B00F0F480132B00F0FF80142B6D +:10A1300000F00E8107E0162B00F03281172B00F0A3 +:10A140003F81FF2B35D0FFDF70BD90F867200123E2 +:10A150001946583002F081FA002818BF70BD082057 +:10A16000216981F8670070BD90F8643009790A2B85 +:10A1700001BF90F8CA308B4280F8645080F8885054 +:10A1800008BF70BD90F8663013F0080F0DD023F0B3 +:10A19000080180F8661090F88C10491E49B280F8CA +:10A1A0008C100029A8BF70BDCFE0FF291CBFFFDFC6 +:10A1B00070BD80F8642080F8845170BD90F866000E +:10A1C00010F0010F08BFFFDF216991F88C00401EDD +:10A1D00040B281F88C000028B8BFFFDF206990F8FA +:10A1E000661021F0010100BF80F8661070BD21E00B +:10A1F00090F86500102818BFFFDF0121206980F862 +:10A200008D10112180F8651070BD90F8650014283C +:10A2100018BFFFDF0121206980F88D101521F1E7BB +:10A2200090F86500152818BFFFDF1720216981F815 +:10A23000650070BD90F86500152818BFFFDF192074 +:10A24000216981F8650070BD90F865001B2818BF72 +:10A25000FFDF206980F88D5090F8B801002818BF02 +:10A26000FFDF206990F88E1049B180F88E50018888 +:10A27000A0F8BC1180F8BA5180F8B8610AE00188F2 +:10A28000A0F8BC1180F8BA51012180F8BE110D214F +:10A2900080F8B8110088F6F7BDFCF6F755F920797B +:10A2A000F1F774FD206980F8655070BD90F88C114D +:10A2B000042915D0206990F8661011F0020F08BF2C +:10A2C00070BD90F88C10491E49B280F88C1000299E +:10A2D000B8BFFFDF206990F8661021F0020183E724 +:10A2E00090F8642001230021583002F0B6F90028CC +:10A2F00008BFFFDF206990F8901011F0020F07BF30 +:10A30000062180F8641080F8885080F88C51D1E7DD +:10A3100090F8642001230021583002F09EF90028B3 +:10A3200008BFFFDF206980F8646070BD90F8661098 +:10A3300021F0040180F8661090F88C10491E49B293 +:10A3400080F88C100029A8BF70BDFFDF70BD00BF72 +:10A3500090F8642001230021583002F07EF9002893 +:10A3600008BFFFDF1C20216981F8640070BD00BFB9 +:10A3700090F8660000F03000102818BFFFDF206959 +:10A3800090F8661021F0100180F8661090F88C109B +:10A39000491E49B280F88C100029A8BF70BDD4E7CF +:10A3A00090F8642001230021583002F056F900286B +:10A3B00008BFFFDF1F20216981F8640070BD00BF66 +:10A3C00090F8650021281CBF0028FFDF22202169AA +:10A3D00081F8650070BD3E49086990F8662012F06A +:10A3E000080F1EBF01208870704742F0080280F8F5 +:10A3F00066208969C97880F8C9100021A0F88A1000 +:10A4000090F88C10491C80F88C10704710B5304CB7 +:10A4100005212069FEF756F8206990F84E100129B1 +:10A4200002BF022180F84E1010BD00F5D6710288DF +:10A43000A0F8D421028EA0F8D621828EA0F8D821CF +:10A44000028FB0F844309A4228BF1A46CA85828FDC +:10A45000B0F84600824238BF10460886012081F8D5 +:10A4600026002079BDE81040F1F790BC184830B4C0 +:10A47000006990F84E30B0F832C0C48EB0F8401089 +:10A48000428F022B28D08A4238BF11460186C28FE4 +:10A49000B0F842108A4238BF11468186028FB0F868 +:10A4A00044108A4238BF11464186828FB0F8461068 +:10A4B0008A4238BF1146C186418E614588BF8C46AD +:10A4C000A0F832C0C18EA14288BF0C46C48601E00C +:10A4D000F000002030BC7047038E9A4228BF1A4615 +:10A4E000C58F838E9D4238BF2B468A4238BF1146A6 +:10A4F0000186B0F842108B4228BF0B4683860021AC +:10A5000080F84E10CAE770B5FE4C206990F8CB1069 +:10A51000FE2906BFA178002970BD90F867200123AD +:10A520001946583002F099F8002818BF70BD20690C +:10A53000002590F8701159B1A0F8825090F871116F +:10A5400080F8CC10BDE8704000210220FEF786BEE6 +:10A5500090F8652001230421583002F07EF80600AF +:10A560000CD0D4F810C09CF86500102861D01428D5 +:10A5700065D015287BD01B287ED0BEE0216991F8DC +:10A58000660010F0010F05D0BDE8704001210920E0 +:10A59000FEF764BE10F0020F0BD001210C20FEF775 +:10A5A0005DFE206990F8901041F0010180F8901054 +:10A5B00070BD10F0040F05D0BDE8704001211320DC +:10A5C000FEF74CBE10F0080F09D091F8C90081F8D1 +:10A5D000CC00BDE8704001210720FEF73FBE10F01F +:10A5E000100F02D091F89B0120B191F8650021284D +:10A5F00073D179E091F89A0188B1B1F89C01A1F882 +:10A600004000B1F89E01A1F84200B1F8A001A1F804 +:10A610004400B1F8A201A1F8460081F89A51FFF771 +:10A6200025FFFFF7F3FEBDE8704001211520FEF77E +:10A6300015BEBDE8704001210B20FEF70FBEF9F7F3 +:10A6400025FB0C2838BF70BD08212069F030F9F7D0 +:10A6500021FB28B120690421C430F9F71BFB00B9A4 +:10A66000FFDFBDE8704001210420FEF7F7BD9CF834 +:10A67000730101280DD000E030E0022818BF70BD42 +:10A680009CF88E00D8B106208CF8CC000121022065 +:10A690001DE09CF8B801002818BF70BD0CF1B00394 +:10A6A00000220CF1E8010CF5BA7001F052FF012113 +:10A6B0000520FEF7D3FD206980F8735170BD9CF82A +:10A6C000960010F0040F14BF11200D200121FEF799 +:10A6D000C5FD206980F8735170BD0EE0BDE8704083 +:10A6E00001210620FEF7BABD91F87D00C0B991F8AE +:10A6F000A40110B191F8A50190B1206901230021B6 +:10A7000090F86420583001F0A8FFC8B120690123F7 +:10A71000042190F86520583001F09FFF30B10FE020 +:10A72000BDE8704001211720FEF798BD206990F820 +:10A730007C0028B1BDE8704000211220FEF78EBDDC +:10A74000206990F864200A2A2BD0002E18BF70BD13 +:10A7500001230021583001F080FF48B1206990F8B2 +:10A760008C11042904BF90F8900010F0030F22D040 +:10A7700020690123002190F86420583001F06DFF1A +:10A7800000287DD0206990F89A1111B190F89B11A2 +:10A79000E9B190F8A411002972D090F8A511E9B39D +:10A7A00092E090F8CA1080F8CC10BDE8704000210B +:10A7B0000720FEF753BD00210C20FEF74FFD206956 +:10A7C00090F8901041F0010180F8901070BDB0F841 +:10A7D0009C11A0F84010B0F89E11A0F84210B0F8FB +:10A7E000A011A0F84410B0F8A211A0F8461080F80B +:10A7F0009A5190F8660010F0200F13D0FFF736FE44 +:10A80000FFF704FE01211520FEF728FD206990F8CE +:10A81000661021F0200141F0100100E008E080F80E +:10A82000661070BDBDE8704000211420FEF716BD13 +:10A8300090F8652001230B21583001F00EFFF8B984 +:10A84000206990F85400012808BF012503D0022890 +:10A8500014BFFFDF0225206990F85500012808BFCA +:10A86000012603D0022814BFFFDF02262069012D34 +:10A8700090F8A61105D0022D08BF022903D00DE0E3 +:10A8800022E001290AD190F8A711012E04D0022E4E +:10A8900008BF02290BD001E0012908D090F86520FB +:10A8A00001230321583001F0D8FE68B903E00020ED +:10A8B000FDF7DCFF08E020690123022190F8652004 +:10A8C000583001F0CAFEB0B120690123002190F890 +:10A8D0006420583001F0C1FE002808BF70BD206917 +:10A8E00090F88401002808BF70BD0021BDE87040C9 +:10A8F000FF20FEF7B3BCBDE8704000211620FEF734 +:10A90000ADBC0000F000002030B5FB4C05462078BF +:10A91000002818BFFFDF657230BDF74901200872BB +:10A9200070472DE9F14FF54F39464E68304696F89D +:10A93000551001F042FF96F8551080B211F00C0F3F +:10A940006FF00D047FD0B0F5747F38BF002506D3BB +:10A950005038C11700EB916004EBA01085B2708EE7 +:10A96000A84238BF0546E648DFF88C93C9F82400B2 +:10A97000786800F15808834609F13400BBF832705A +:10A9800040689BF8551090F86AA0584601F015FFF2 +:10A990009BF8551080B211F00C0F5FD0B0F5747FAA +:10A9A00038BF002406D35038C21700EB926004EB86 +:10A9B000A01084B2A74238BF3C46BAF1000F1CBFBA +:10A9C000201D84B2E0B2F9F709FF98F812000028C0 +:10A9D0004FD008F15801CA4891E80E1000F50274F2 +:10A9E00084E80E10D8F86810C0F82112D8F86C105E +:10A9F000C0F8251200F58170FAF7A6FABF48007872 +:10AA000000280CBF0120002080F00101BD48017624 +:10AA1000D8E91412C0E90412A0F58372D9F8241001 +:10AA2000F9F7B5FD96F85500012808BF002204D0BB +:10AA300002281ABFFFDF00220122E9B20120F9F744 +:10AA4000B4FD1CE0FFE7022919BF04EBD00085B27A +:10AA50006FF00E0101EB900081D17FE7022919BF51 +:10AA600004EBD00084B26FF00E0202EB9000A1D193 +:10AA70009FE7D9F82400FAF767FAF9F7B9FD0098CB +:10AA800050B9012296F8553096211046FAF712F97E +:10AA900000219620FAF7A4FA96F82C00012808BFA6 +:10AAA000FAF730FB022089F80000BDE8F88F2DE9A5 +:10AAB000F04FDFF8488283B0414681464D68A1F1EE +:10AAC0001400009095F85D0005F158060127A1F1EA +:10AAD000340470B3012879D0022878D0032818BF35 +:10AAE000FFDF75D0206A0823017821F0080101708A +:10AAF000B27903EAC202114321F004010170F27934 +:10AB0000042303EA8202114321F01001017096F838 +:10AB100005B0E06AF5F70DFB8246FAF743FEBBF19C +:10AB2000020F7AD0BBF1010F78D0BBF1030F76D0C2 +:10AB30008AE0FFE700F0CAFB0146284601F03BFE31 +:10AB40001FFA80FB00F0C2FB10F00C0F6FF00D013C +:10AB50004FF0000A20D0BBF5747F38BF504607D3B2 +:10AB6000ABF15000C21700EB926001EBA01080B275 +:10AB7000298E814238BF0846ADF80800A5F8480084 +:10AB80000098FAF7EEFD90B1216AA77062694FF460 +:10AB90008060904703202CE0022819BF01EBDB0006 +:10ABA00080B26FF00E0000EB9B00E1D1DFE701AA5D +:10ABB00002A9E06AF5F7F8F9206210B196F83510AD +:10ABC00039B10098FAF7A1FD77718BE713E016E031 +:10ABD00026E09DF8041031B9A0F800A080F802A08A +:10ABE000012102F0A5F9BDF80810206A02F0DFFA91 +:10ABF0000220707176E70098FAF787FD72E7B5F8E2 +:10AC00004800ADF8000001AA6946E06AF5F7CCF902 +:10AC10002062002808BFFFDF64E708E00BE00EE0D9 +:10AC20000098FAF79EFD002808BFFFDF5AE730EAD8 +:10AC30000A0009D106E030EA0A0005D102E0BAF1C3 +:10AC4000000F01D0012100E00021206A027842EAD1 +:10AC500001110170717C00291CBF7179012933D069 +:10AC600006F15801264891E80E1000F5027A8AE8AC +:10AC70000E10B16EC0F82112F16EC0F8251200F569 +:10AC80008170FAF761F998F8000000280CBF0121E3 +:10AC900000211C480176D6E91212C0E90412A0F581 +:10ACA0008371226AF9F773FC95F85400012808BFF4 +:10ACB000002204D002281ABFFFDF00220122FB215C +:10ACC0000020F9F772FC03E0FAF73EF9F9F790FC7F +:10ACD000B9F1000F06D195F85430012296210020D9 +:10ACE000F9F7E8FF6771206A0188E18180782074B4 +:10ACF000277003B0BDE8F08F140100204801002048 +:10AD0000C80C0020D00E00202DE9F0471E46174643 +:10AD100081460C46FE4DDDF82080287828B9002FAA +:10AD20001CBF002EB8F1000F00D1FFDFC5F81C805A +:10AD3000C5E90576C5E90D9400272F72EF712F71D3 +:10AD4000EF706F71AF71AF70AF81F24E04F15808C0 +:10AD50002088F5F771FFE8622088F5F75BFF28632C +:10AD6000F9F759FD94F95700F9F702FE04F11200C2 +:10AD7000FAF7D3F804F10E00F9F704FE3078002852 +:10AD80000CBF03200120FAF7DCF898F81A00F9F755 +:10AD900001FEFAF7D0F83078002804BFFF2094F8BD +:10ADA000544023D098F81250B4F8328094F85510DB +:10ADB000204601F002FD94F8554080B214F00C0FCB +:10ADC0006FF00D012CD0B0F5747F06D35038C21748 +:10ADD00000EB926001EBA01087B24046B84528BF57 +:10ADE0003846002D1CBF001D80B2C0B22146F9F7C5 +:10ADF000F5FC3078F8B1706890F86801002818BF49 +:10AE0000F9F766FD224600210120F9F70CFF706872 +:10AE1000D0F8E000FAF79BF8BDE8F047012080E5A4 +:10AE2000022C19BF01EBD00087B26FF00E0101EBCD +:10AE30009000D2D1D0E7002122460846F9F7F3FE70 +:10AE4000BDE8F047012032E6B24800B50178343859 +:10AE5000007819B1022818BFFFDF00BD012818BF14 +:10AE6000FFDF00BDAA4810B50078022818BFFFDF39 +:10AE7000BDE8104000F080BA00F07EBAA4484079E6 +:10AE80007047A34800797047A14901208871704735 +:10AE90002DE9F04706009F489D4D406800F1580499 +:10AEA000686A90F8019018BF012E03D1296B08F051 +:10AEB00093FE6870687800274FF00108A0B1012860 +:10AEC0003CD0022860D003281CBFFFDFBDE8F0871C +:10AED000012E08BFBDE8F087286BF5F71FFB687AE5 +:10AEE000BDE8F047F0F752BF012E14D0A86A002841 +:10AEF00008BFFFDF6889C21CD5E9091009F058F9BD +:10AF0000A86A686201224946286BF5F783F9022E88 +:10AF100008BFBDE8F087D4E91401401C41F10001ED +:10AF2000C4E91401E079012801D1E77101E084F856 +:10AF30000780687ABDE8F047F0F728BF012E14D0EB +:10AF4000A86A002808BFFFDF6889C21CD5E909107C +:10AF500009F02EF9A86A686200224946286BF5F7C5 +:10AF600059F9022E08BFBDE8F087D4E91410491C36 +:10AF700040F10000C4E91410E07901280CBFE7712A +:10AF800084F80780BDE8F087012E06D0286BF5F71E +:10AF9000C5FA022E08BFBDE8F087D4E91410491C99 +:10AFA00040F10000C4E91410E0790128BFD1BCE7EA +:10AFB0002DE9F041574F3846A7F13404406800F1BD +:10AFC00058052078012818BFFFDFA878012648B16E +:10AFD0000021A970A6706269042090473878002883 +:10AFE00018BF2E71206A0321007831EA000004BFE7 +:10AFF000E878002805D1EE70216AA6706269022007 +:10B0000090470121002000F0D6F918B1BDE8F041C9 +:10B0100000F0B2B9BDE8F041002082E42DE9F14F23 +:10B020003C4E4FF000083046A6F1340540683178B8 +:10B0300000F1580A2878C146022818BFFFDFA88906 +:10B0400040F40070A88171683078FF2091F85410A6 +:10B05000F9F7C4FB009800289AF8120000F0FD8070 +:10B06000F9F7ECFAF9F7DAFA012788B99AF8120039 +:10B0700070B1686A417859B100789AF80710C0F346 +:10B08000C000884204D1EF70BDE8F84F00F074B9F9 +:10B09000686A41786981002908BFC5F8288003D013 +:10B0A000286BF5F771F8A862A88940F02000A88104 +:10B0B00085F804803078706800F1580B044690F8E9 +:10B0C0002C0001281AD1FAF713F85946204601F04E +:10B0D00080FA98B13078002870680CBF00F58A704B +:10B0E00000F5F570218841809BF8081001719BF8EC +:10B0F000091041710770687AF0F748FE686A9AF89B +:10B1000006100078C0F3800088423BD0307803E01E +:10B110001401002048010020706800F1580490F8E4 +:10B120005D0058B3022847D084F8058030780028A5 +:10B130001CBF2079002806D084F80480AF706A69AB +:10B14000414610209047E07890B184F80380FAF7E8 +:10B1500017FB002808BFFFDF0820AF706A690021D5 +:10B160009047D4E91202411C42F10000C4E91210D8 +:10B17000A07901280CBF84F80680A771A88940F443 +:10B180008070A881686A9AF807300178C1F3C0021C +:10B190009A424FD13278726801F0030102F15804EB +:10B1A000012918BF022932D003291CBFE87940F0D9 +:10B1B000040012D0E8713DE0E86AF4F721FF0028AE +:10B1C00008BFFFDFD4E91210491C40F10000C4E9B8 +:10B1D0001210687AF0F7DAFDA6E701F0C1FE90B12F +:10B1E000A770A989384641F40061A981696AAF70E6 +:10B1F0006A699047E079012803D100BF84F807808D +:10B2000018E0E77116E0E87940F01000D2E74078E6 +:10B21000F8B1A98941F40061A981A96A51B1FB285B +:10B22000F1D8287A002808BFB94603D080206A697F +:10B23000002190470120009900F0BDF8B0B1B9F1AC +:10B24000000F1CBF0020FFF723FEBDE8F84F00F001 +:10B2500093B8E0790128D4D1D0E7002818BFF9F7D6 +:10B2600026FAA88940F04000A881E3E7B9F1000F71 +:10B270001CBF0120FFF70CFE0020FFF718FCB9F1FE +:10B28000000F08BFBDE8F88F0220BDE8F84FFFE5CA +:10B2900070B50D4606466848674900784C6850B15D +:10B2A000F9F748FA034694F8542029463046BDE899 +:10B2B0007040FDF72CBAF9F73DFA034694F8542094 +:10B2C00029463046BDE8704005F00ABD5A4802786C +:10B2D0004168406801F1580C91F8643090F85400CE +:10B2E000242B1CBF9CF80DC0BCF1240F13D01F2BC6 +:10B2F00018BF202B24D0BCF1220F18BF7047002AA2 +:10B3000008BF704791F8A62191F85110114011F033 +:10B31000010F27D02EE04AB191F89011002908BF03 +:10B320007047012818BF012924D021E091F8F210BC +:10B33000002908BF7047012818BF01291AD017E05B +:10B34000BCF1220FDBD0002A08BF704791F8A6118C +:10B3500011F0010F0ED111F0020F08BF7047012844 +:10B3600008D005E011F0020F08BF7047012801D096 +:10B3700002207047012070472F4910B54C68F9F73B +:10B3800089FEF9F768FEF9F763FDF9F7CCFDF9F7E7 +:10B390002FF994F82C00012808BFF9F7A9FE274CD3 +:10B3A00000216269A0899047E269E179E0789047DD +:10B3B0000020207010BD70B5204C0546002908BF44 +:10B3C000012D05D12079401CC0B22071012831D84F +:10B3D000A1692846884700282CD0A179184839B19E +:10B3E000012D01BF41780029017811F0100F21D003 +:10B3F000E179F9B910490978002908BF012D05D074 +:10B4000000290CBF01210021294311D10D490978E0 +:10B4100011F0100F04BF007810F0100F0AD0A078C0 +:10B4200040B9A06A20B9608910B111F0100F01D0A5 +:10B43000002070BD012070BD4801002014010020D3 +:10B44000C80C00202201002010B540F2C311F748BB +:10B4500008F02DFFFF220821F54808F020FFF548ED +:10B46000002141704FF46171418010BD2DE9F04120 +:10B470000E46054600F046FBEC4C102816D004EBB7 +:10B48000C00191F84A0110F0010F1CBF0120BDE876 +:10B49000F081607808283CBF012081F84A011CD265 +:10B4A0006078401C60700120BDE8F0816078082859 +:10B4B00013D222780127501C207004EBC208306898 +:10B4C000C8F84401B088A8F84801102A28BFFFDF57 +:10B4D00088F8435188F84A71E2E70020BDE8F0811E +:10B4E000D2480178491E4BB2002BB8BF704770B4E8 +:10B4F0005FF0000500EBC30191F84A1111F0010F54 +:10B500003BD04278D9B2521E427000EBC10282F8A1 +:10B510004A5190F802C00022BCF1000F0BD98418E8 +:10B5200094F803618E4202D1102A26D103E0521C06 +:10B53000D2B29445F3D80278521ED2B202708A4237 +:10B540001BD000EBC20200EBC10CD2F84341CCF897 +:10B550004341D2F84721CCF84721847890F800C0C5 +:10B560000022002C09D9861896F8036166450AD195 +:10B57000102A1CBF024482F80311591E4BB2002B43 +:10B58000B8DA70BC7047521CD2B29442EBD8F4E7E0 +:10B590002DE9F05F1F4690460E46814600F0B2FA54 +:10B5A000A24D0446102830D0A878002100280ED9DA +:10B5B0006A1892F80331A34205D110291CBF12204A +:10B5C000BDE8F09F03E0491CC9B28842F0D80828C2 +:10B5D00034D2102C1CD0AE781022701CA87005EB51 +:10B5E000061909F10300414600F0A2FF09F18300AA +:10B5F0001022394600F09CFFA819002180F8034171 +:10B6000080F83B110846BDE8F09FA878082815D2BD +:10B610002C78CA46601C287005EBC4093068C9F84C +:10B620004401B0884FF0000BA9F84801102C28BF46 +:10B63000FFDF89F843A189F84AB1CCE70720BDE8CC +:10B64000F09F70B479488178491E4BB2002BBCBF83 +:10B6500070BC704703F0FF0C8178491ECAB282703B +:10B6600050FA83F191F8031194453ED000EB021596 +:10B6700000EB0C14D5F80360C4F80360D5F807603C +:10B68000C4F80760D5F80B60C4F80B60D5F80F60FC +:10B69000C4F80F60D5F88360C4F88360D5F887607C +:10B6A000C4F88760D5F88B60C4F88B60D5F88F50EC +:10B6B000C4F88F50851800EB0C0402EB420295F899 +:10B6C00003610CEB4C0C00EB420284F8036100EBCD +:10B6D0004C0CD2F80B61CCF80B61B2F80F21ACF82E +:10B6E0000F2195F83B2184F83B2100EBC10292F831 +:10B6F0004A2112F0010F33D190F802C00022BCF1B0 +:10B70000000F0BD9841894F803518D4202D1102AEE +:10B7100026D103E0521CD2B29445F3D80278521ECF +:10B72000D2B202708A421BD000EBC20200EBC10C05 +:10B73000D2F84341CCF84341D2F84721CCF8472115 +:10B74000847890F800C00022002C09D9851895F85B +:10B75000035165450BD1102A1CBF024482F8031126 +:10B76000591E4BB2002BBFF675AF70BC7047521C10 +:10B77000D2B29442EAD8F3E72E49487070472D4878 +:10B780004078704738B14AF2B811884203D8294945 +:10B790004880012070470020704726484088704745 +:10B7A00010B500F0AFF9102814D0204A014600204F +:10B7B00092F802C0BCF1000F0CD9131893F80331B2 +:10B7C0008B4203D1102818BF10BD03E0401CC0B24B +:10B7D0008445F2D8082010BD14498A78824286BF79 +:10B7E00001EB001083300020704710498A788242B4 +:10B7F00086BF01EB0010C01C002070470B4B93F874 +:10B8000002C084459CBF00207047184490F8030193 +:10B8100003EBC00090F843310B70D0F84411116075 +:10B82000B0F848019080012070470000F80E002019 +:10B830005A01002050010020FE4A114491F80321D2 +:10B84000FD490A7002684A6080880881704710B517 +:10B85000F8F74CFE002804BFFF2010BDBDE81040E3 +:10B86000F8F76ABEF3498A7882429CBF002070478D +:10B87000084490F8030101EBC00090F84A0100F081 +:10B88000010070472DE9F047EA4F0026B0463878AE +:10B89000002886BF4FF0080ADFF8A093BDE8F087C4 +:10B8A00007EBC80505F5A27195F8430100F02AF9E8 +:10B8B000102808BF544610D0B978002400290BD9AD +:10B8C0003A1992F80321824202D1102C05D103E0EB +:10B8D000621CD4B2A142F3D80824B878A04286BF33 +:10B8E00007EB0410C01C002095F84A1111F0010F5D +:10B8F00016D050B1082C04D2391991F83B11012906 +:10B9000003D0102100F0F1FD50B109F80640304697 +:10B91000731C95F8432105F5A271DEB2F9F700F822 +:10B9200008F1010000F0FF0838784045B8D8BDE8BC +:10B93000F0872DE9F041BF4C00263546A07800285D +:10B940008CBFBE4FBDE8F0816119C0B291F8038190 +:10B95000A84286BF04EB0510C01C002091F83B11E3 +:10B96000012903D0102100F0C0FD58B104EBC8003C +:10B97000BD5590F8432100F5A2713046731CDEB22C +:10B98000F8F7CEFF681CC5B2A078A842DCD8BDE8A5 +:10B99000F08110B5F8F7EEFF002804BF082010BDB5 +:10B9A000F8F7ECFFA549085C10BD0A46A24910B59E +:10B9B000497841B19F4B997829B10244D81CF8F7D6 +:10B9C00032FD012010BD002010BD9A4A01EB41015B +:10B9D00002EB41010268C1F80B218088A1F80F0138 +:10B9E00070472DE9F041934D07460024A8780028C0 +:10B9F00098BFBDE8F081C0B2A04213D905EB041096 +:10BA000010F183060ED01021304600F06EFD48B9CB +:10BA100004EB440005EB400000F20B113A463046BF +:10BA2000F9F73DFF601CC4B2A878A042E3D8BDE896 +:10BA3000F08101461022824800F07ABD80487047AC +:10BA400070B57C4D0446A878A04206D905EB0410D9 +:10BA50001021833000F049FD08B1002070BD04EBD7 +:10BA6000440005EB400000F20B1070BD71498A786C +:10BA7000824206D9084490F83B01002804BF012007 +:10BA80007047002070472DE9F0410E4607461546E5 +:10BA90000621304600F029FD664C98B1A17871B1BD +:10BAA00004F59D7011F0010F18BF00F8015FA17837 +:10BAB000490804D0457000F8025F491EFAD1012000 +:10BAC000BDE8F0813846314600F01CF8102816D049 +:10BAD000A3780021002B12D9621892F80321824228 +:10BAE00009D1102918BF082909D0601880F83B51E6 +:10BAF0000120BDE8F081491CC9B28B42ECD800207E +:10BB0000BDE8F0812DE9F0414A4D06460024287831 +:10BB10000F46002812D900BF05EBC40090F843116E +:10BB2000B14206D10622394600F5A27008F014FB96 +:10BB300038B1601CC4B22878A042EDD81020BDE80E +:10BB4000F0812046BDE8F0813A4910B44A7801EB13 +:10BB5000C003521E4A70002283F84A2191F802C0A5 +:10BB6000BCF1000F0DD98B1893F80341844204D126 +:10BB7000102A1CBF10BC704703E0521CD2B294457F +:10BB8000F1D80A78521ED2B20A70824204BF10BCA9 +:10BB9000704701EBC00301EBC202D2F843C1C3F806 +:10BBA00043C1D2F84721C3F847218C7891F800C0EF +:10BBB0000022002C9CBF10BC70478B1893F80331F7 +:10BBC000634506D1102A1CBF114481F8030110BC43 +:10BBD0007047521CD2B29442EFD810BC704770B478 +:10BBE00014490D188A78521ED3B28B7095F8032130 +:10BBF000984247D001EB031C01EB0014DCF8036012 +:10BC0000C4F80360DCF80760C4F80760DCF80B6078 +:10BC1000C4F80B60DCF80F60C4F80F60DCF88360D8 +:10BC2000C4F88360DCF88760C4F88760DCF88B6058 +:10BC300008E00000F80E0020500100205A0100200A +:10BC4000BB100020C4F88B60DCF88FC0C4F88FC034 +:10BC500001EB030C03EB43039CF8034100EB4000B2 +:10BC600001EB430385F8034101EB4000D3F80B419E +:10BC7000C0F80B41B3F80F31A0F80F319CF83B012D +:10BC800085F83B0101EBC20090F84A0110F0010F6A +:10BC90001CBF70BC704700208C78002C0DD90B188D +:10BCA00093F803C1944504D110281CBF70BC7047A1 +:10BCB00003E0401CC0B28442F1D80878401EC0B2F4 +:10BCC0000870904204BF70BC704701EBC20301EBE7 +:10BCD000C000D0F843C1C3F843C1D0F84701C3F84E +:10BCE00047018C780B780020002C9CBF70BC7047FB +:10BCF00001EB000C9CF803C19C4506D110281CBF29 +:10BD0000084480F8032170BC7047401CC0B28442D4 +:10BD1000EED870BC7047000010B50A7B02F01F021D +:10BD20000A73002202768B181B7A03F0010C5B0861 +:10BD300003F00104A4445B0803F00104A4445B087D +:10BD400003F00104A4445B0803F0010464444FEAD7 +:10BD5000530C0CF0010323444FEA5C0C0CF001047B +:10BD6000234403EB5C0300EB020C521C8CF81330F1 +:10BD700090F818C0D2B263440376052AD3D3D8B260 +:10BD8000252888BFFFDF10BD0023C383428401EB59 +:10BD9000C202521EB2FBF1F10184704770B46FF021 +:10BDA0001F02010C02EA90251F23A1F5AA40543876 +:10BDB0001CBFA1F5AA40B0F1550009D0A1F528504B +:10BDC000AA381EBFA1F52A40B0F1AA00012000D177 +:10BDD00000204FF0000C62464FEA0C048CEA01068A +:10BDE000F6431643B6F1FF3F11D005F001064FEAC6 +:10BDF0005C0C4CEAC63C03F0010652086D085B0877 +:10BE0000641C42EAC632162CE8D370BC704770BC82 +:10BE1000002070472DE9F04701270025044603293B +:10BE20000FD04FF4FA4200297CD0012900F006819E +:10BE3000022918BFBDE8F0870146BDE8F047583039 +:10BE40006AE704F158067821304608F052FAB571D5 +:10BE5000F57135737573F573357475717576B576DF +:10BE6000212086F83E00412086F83F00FE2086F81B +:10BE7000730084F82C50258484F8547084F855702D +:10BE8000282084F856001B20208760874FF4A47078 +:10BE9000E087A0871B20208660864FF4A470E08690 +:10BEA000A0861B20A4F84000A4F844004FF4A4701E +:10BEB000A4F84600A4F842001B20A4F84A00A4F805 +:10BEC0004C00A4F8480067734FF448606080A4F801 +:10BED000D050A4F8D250A4F8D450A4F8D650A4F866 +:10BEE000D850A4F8DA5084F8DD5084F8DF50A4F874 +:10BEF000E65084F8E450A4F8F850A4F8FA5084F816 +:10BF00009A5184F89B5184F8A45184F8A55184F87F +:10BF1000695184F8705184F8735184F88C51BDE8EC +:10BF2000F087FFE7A4F8E65084F8DE506088FE4909 +:10BF30000144B1FBF0F1A4F878104BF68031A4F87D +:10BF40007A10E388A4F87E50B4F882C0DB000CFBC2 +:10BF500000FCB3FBF0F39CFBF0FC5B1CA4F882C07C +:10BF60009BB203FB00FC04F15801A4F88030BCF53F +:10BF7000C84FC4BF5B1E0B85B2FBF0F2521CCA85D2 +:10BF800000F5802202F5EE32531EB3FBF0F20A8474 +:10BF9000CB8B03FB00F2B2FBF0F0C883214604F127 +:10BFA0005800FFF7B9FE07F0A5F9E8B3D4F80E1072 +:10BFB0006FF01F02080C02EA91281F26A0F5AA4183 +:10BFC00054391CBFA0F5AA41B1F155010AD0A0F522 +:10BFD0002851AA391EBFA0F52A41B1F1AA014FF09C +:10BFE000010901D14FF00009002211464FEA020C6D +:10BFF00082EA0003DB430B43B3F1FF3F1AD008F0A2 +:10C000000103520842EAC33206F0010349087608E8 +:10C010000CF1010C41EAC3314FEA5808BCF1160F8C +:10C02000E6D3B9F1000F00E000E003D084F86851D6 +:10C03000BDE8F08784F86871BDE8F087A4F8E650A1 +:10C04000B4F89401B4F89831B4F802C004F158017E +:10C05000A4F87E50B4F88240DB0004FB0CF4B3FB80 +:10C06000F0F394FBF0F45B1C4C859BB203FB00F4F3 +:10C070000B85B4F5C84FC4BF5B1E0B85B2FBF0F255 +:10C08000521CCA854A8C00EBC202521EB2FBF0F26F +:10C090000A84CA8B02FB0CF2B2FBF0F0C883BDE845 +:10C0A000F08770B50025044603290DD04FF4FA42FD +:10C0B000002963D001297DD0022918BF70BD014637 +:10C0C000BDE87040583027E604F158067821304624 +:10C0D00008F00FF9B571F57135737573F573357433 +:10C0E00075717576B576212086F83E00412086F878 +:10C0F0003F00FE2086F8730084F82C502584012030 +:10C1000084F8540084F85500282184F856101B2127 +:10C11000218761874FF4A471E187A1871B212186C4 +:10C1200061864FF4A471E186A1861B21A4F840101A +:10C13000A4F844104FF4A471A4F84610A4F84210D7 +:10C140001B21A4F84A10A4F84C10A4F848106073FE +:10C15000A4F8D850202084F8DA0084F8D050C4F82D +:10C16000D45084F8045184F8055184F80E5184F8B1 +:10C170000F5184F8F45084F8005170BD60886A490A +:10C180000144B1FBF0F1A4F878104BF68031A4F82B +:10C190007A10E388A4F87E50B4F882C0DB000CFB70 +:10C1A00000FC9CFBF0FCB3FBF0F304F15801A4F895 +:10C1B00082C000E022E05B1C9BB203FB00FCA4F801 +:10C1C0008030BCF5C84FC4BF5B1E0B85B2FBF0F2DC +:10C1D000521CCA8500F5802202F5EE32531EB3FBD5 +:10C1E000F0F20A84CB8B03FB00F2B2FBF0F0C883C1 +:10C1F000214604F15800BDE870408DE5D4F8F830D0 +:10C20000B4F802C004F158005989DB89A4F87E50C3 +:10C21000B4F88240DB0004FB0CF4B3FBF1F394FBB5 +:10C22000F1F45B1C44859BB203FB01F40385B4F578 +:10C23000C84FC4BF5B1E0385B2FBF1F2521CC2851E +:10C24000428C01EBC202521EB2FBF1F20284C28B9D +:10C2500002FB0CF2B2FBF1F1C18370BD2DE9F003DA +:10C26000047E0CB1252C03D9BDE8F00312207047E1 +:10C27000002A02BF0020BDE8F003704791F80DC00E +:10C280001F260123294D4FF00008BCF1000F77D085 +:10C29000BCF1010F1EBF1F20BDE8F0037047B0F8CE +:10C2A00000C00A7C8F7B91F80F907A404F7C87EA20 +:10C2B000090742EA072282EA0C0C00270CF0FF096A +:10C2C0004FEA1C2C99FAA9F99CFAACFC4FEA1969BF +:10C2D0004FEA1C6C49EA0C2C0CEB0C1C7F1C9444A0 +:10C2E000FFB21FFA8CFC032FE8D38CEA020C0F4F2D +:10C2F0000022ECFB057212096FF0240502FB05C257 +:10C30000D2B201EBD207427602F007053F7A03FA78 +:10C3100005F52F4218BF82767ED104FB0CF2120C79 +:10C32000521CD2B2002403E0FFDB050053E4B36EDD +:10C3300000EB040C9CF813C094453CBFA2EB0C022C +:10C34000D2B212D30D194FF0000C2D7A03FA0CF76C +:10C350003D421CBF521ED2B2002A6AD00CF1010C21 +:10C360000CF0FF0CBCF1080FF0D304F1010C0CF041 +:10C37000FF04052CD7D33046BDE8F0037047FFE734 +:10C3800090F819C00C7E474604FB02C2FA4C4FF0ED +:10C39000000CE2FB054C4FEA1C1C6FF024040CFB64 +:10C3A0000422D2B201EBD204427602F0070C247AC6 +:10C3B00003FA0CFC14EA0C0F1FBF82764046BDE85E +:10C3C000F003704790F818C0B2FBFCF40CFB142289 +:10C3D000521CD2B25FF0000400EB040C9CF813C0B6 +:10C3E00094453CBFA2EB0C02D2B212D30D194FF010 +:10C3F000000C2D7A03FA0CF815EA080F1CBF521E28 +:10C40000D2B27AB10CF1010C0CF0FF0CBCF1080FA8 +:10C41000F0D304F1010C00E00EE00CF0FF04052C59 +:10C42000DAD3A8E70CEBC40181763846BDE8F00307 +:10C4300070470CEBC40181764046BDE8F0037047BD +:10C44000CE4A016812681140CD4A1268114301605A +:10C45000704730B4CB49C94B00244FF0010C0A7827 +:10C46000521CD2B20A70202A08BF0C700D781A68CC +:10C470000CFA05F52A42F2D0097802680CFA01F1AB +:10C480005140016030BC7047017931F01F0113BF8A +:10C49000002000221146704710B4435C491C03F091 +:10C4A000010C5B0803F00104A4445B0803F00104E1 +:10C4B000A4445B0803F00104A4445B0803F00104F6 +:10C4C000A4445B0803F001045B08A44403F00104E6 +:10C4D000A4440CEB53031A44D2B20529DDDB012A34 +:10C4E0008CBF0120002010BC704730B40022A1F1A5 +:10C4F000010CBCF1000F11DD431E11F0010F08BF4C +:10C5000013F8012F5C785FEA6C0C07D013F8025F18 +:10C5100022435C782A43BCF1010CF7D1491E5CBF71 +:10C52000405C0243002A0CBF0120002030BC704751 +:10C53000130008BF704710B401EB030CD41A1CF8A9 +:10C5400001CC5B1E00F804C013F0FF03F4D110BC53 +:10C550007047F0B58DB0164610251C466A46AC46AD +:10C5600000EB0C03A5EB0C0713F8013CD355ACF121 +:10C57000010313F0FF0CF3D115461032102084464E +:10C580000B18ACEB000713F8013C401ED35510F01C +:10C59000FF00F5D1284606F02FFD86B1102005F1E9 +:10C5A000200201461318A1EB000C13F8013C401EB9 +:10C5B00004F80C3010F0FF00F4D10DB0F0BD089875 +:10C5C0002060099860600A98A0600B98E0600DB048 +:10C5D000F0BD38B505460C466846F8F79EFD0028C4 +:10C5E00008BF38BD9DF900202272A07E607294F9C8 +:10C5F0000A100020511A48BF494295F82D308B424D +:10C60000C8BF38BDFF2B08BF38BDE17A491CC9B28D +:10C61000E17295F82E30994203D8A17A7F2918BF8C +:10C6200038BDA2720020E072012038BD0C2818BF6E +:10C630000B2810D00D2818BF1F280CD0202818BF99 +:10C64000212808D0222818BF232804D024281EBF60 +:10C65000262800207047012070470C2963D2DFE8AC +:10C6600001F006090E13161B323C415C484E002AAD +:10C670005BD058E0072A18BF082A56D053E00C2A8E +:10C6800018BF0B2A51D04EE00D2A4ED04BE0A2F13C +:10C690000F000C2849D946E023B1A2F110000B2865 +:10C6A00043D940E0122A18BF112A3ED090F8360034 +:10C6B00020B1122A37D31A2A37D934E0162A32D3B6 +:10C6C0001A2A32D92FE0A2F10F0103292DD990F8AF +:10C6D000360008B31B2A28D925E0002B08BF042AFE +:10C6E00021D122E013B1062A1FD01CE0012A1AD161 +:10C6F0001BE01C2A1CBF1D2A1E2A16D013E01F2A6D +:10C7000018BF202A11D0212A18BF222A0DD0232A8F +:10C710001CBF242A262A08D005E013B10E2A04D013 +:10C7200001E0052A01D000207047012070472DE963 +:10C73000F04187680D4604462046F6F736FC98B16E +:10C7400015B33846A168F6F771FF00281CDD2844B0 +:10C75000401EB0FBF5F606FB05F13846F5F761FF24 +:10C76000A0603046BDE8F081F6F752FA40F233712E +:10C77000F5F757FFA060DFE753E4B36EA44802006B +:10C78000A8480200620100200020BDE8F08190422C +:10C7900028BF704770B50446101B642838BF64205A +:10C7A00025188D4205D8F6F774FF00281CBF2846CF +:10C7B00070BD204670BD808E7047C08E70470844A3 +:10C7C00018449830002A14BF0421002108447047FF +:10C7D00030B491F854300A8E13F00C0F4FF4747C7F +:10C7E0001CBF0CEB821292B21DD08B8E934238BFCD +:10C7F0001A464B8E91F8554014F00C0F1CBF0CEBF1 +:10C8000083139BB217D0C98E994238BF0B460028BC +:10C810000CBF01200020D1189831002818BF042037 +:10C82000084430BC7047022B07BF92003C32D20054 +:10C83000703292B2D9E7022C07BF9B003C33DB0079 +:10C8400070339BB2DFE710F0010F1CBF012070476F +:10C8500010F0020F1CBF0220704710F0040018BF38 +:10C86000082070472DE9F041054617468846012605 +:10C87000084600F06EFC0446404600F06EFC03469D +:10C8800010F0010F18BF012008D113F0020F18BFDC +:10C89000022003D113F0040018BF082014F0010F88 +:10C8A00018BF4FF0010C20D050EA0C0108BF002641 +:10C8B00013F0030F08BF002014F0030F08BF4FF060 +:10C8C000000C95F85410814208BF0020387095F88C +:10C8D0005510614508BF4FF0000C87F801C00028D3 +:10C8E00008BFBCF1000F1CD10DE014F0020F18BFFF +:10C8F0004FF0020CD8D114F0040F14BF4FF0080C05 +:10C900004FF0000CD0E7404600F02DFCB5F8581071 +:10C91000401A00B247F6FE71884201DC002800DCB4 +:10C9200000263046BDE8F08101281CBF0228002007 +:10C93000704718B4CBB2C1F3072CC1B2C0F30720C3 +:10C94000012B05D0022B08BFBCF1020F1BD002E067 +:10C95000BCF1010F17D0012904D0022908BF022819 +:10C9600011D001E001280ED001EA0C0161F30702A9 +:10C9700010EA030060F30F22D0B210F0020F18BFCC +:10C9800002200BD106E0084003EA0C01084060F3E6 +:10C990000702EFE710F0010018BF01208DF800003A +:10C9A000C2F3072010F0020F18BF022003D110F0CD +:10C9B000010018BF01208DF80100BDF8000018BC6F +:10C9C0007047162A10D12A220C2818BF0D280FD024 +:10C9D0004FF0230C1F280DD031B10878012818BF63 +:10C9E000002805D0162805D0002070470120704788 +:10C9F0001A70FBE783F800C0F8E7012902D002298A +:10CA000005D007E0002804BF40F2E240704740F63E +:10CA1000C410704700B5FFDF40F2E24000BD0000E7 +:10CA2000282107F044BC4078704730B505460078AF +:10CA300001F00F0220F00F0010432870092910D2D6 +:10CA4000DFE801F0050705070509050B0D000624C1 +:10CA500009E00C2407E0222405E0012403E00E2471 +:10CA600001E00024FFDF6C7030BD007800F00F00A3 +:10CA700070470A68C0F803208988A0F8071070473B +:10CA8000D0F803200A60B0F80700888070470A6871 +:10CA9000C0F809208988A0F80D107047D0F8092047 +:10CAA0000A60B0F80D00888070470278402322F0B9 +:10CAB000400203EA81111143017070470078C0F30E +:10CAC000801070470278802322F0800203EAC111AF +:10CAD0001143017070470078C0097047027802F076 +:10CAE0000F02072A16BF082AD0F80520D0F8032025 +:10CAF000C1F809200CBFB0F80920B0F80720A1F850 +:10CB00000D200A7822F080020A700078800942EA3B +:10CB1000C0100870704770B514460E4605461F2AAF +:10CB200088BFFFDF2246314605F1090007F040FBD0 +:10CB3000A01D687070BD70B544780E460546062C81 +:10CB400038BFFFDFA01F84B21F2C88BF1F242246DE +:10CB500005F10901304607F02BFB204670BD70B58A +:10CB600014460E4605461F2A88BFFFDF224631467F +:10CB700005F1090007F01CFBA01D687070BD70B5C1 +:10CB800044780E460546062C38BFFFDFA01F84B24E +:10CB90001F2C88BFFFDF224605F10901304607F050 +:10CBA00007FB204670BD0968C0F80F1070470A885F +:10CBB000A0F8132089784175704790F8242001F07F +:10CBC0001F0122F01F02114380F82410704707292B +:10CBD00088BF072190F82420E02322F0E00203EA36 +:10CBE0004111114380F8241070471F3007F096BCA4 +:10CBF00010B5044600F0E3FA002818BF204410BD29 +:10CC0000C17811F03F0F1BBF027912F0010F002213 +:10CC1000012211F03F0F1BBF037913F0020F002315 +:10CC200001231A4402EB4202530011F03F0F1BBFD5 +:10CC3000027912F0080F0022012203EB420311F0E7 +:10CC40003F0F1BBF027912F0040F00220122134490 +:10CC500011F03F0F1BBF027912F0200F00220122BA +:10CC600002EBC20203EB420311F03F0F1BBF02793C +:10CC700012F0100F0022012202EB42021A4411F0BE +:10CC80003F0F1BBF007910F0400F0020012010441F +:10CC900010F0FF0014BF012100210844C0B270470A +:10CCA00070B50278417802F00F02082A4DD2DFE811 +:10CCB00002F004080B4C4C4C0F14881F1F280AD993 +:10CCC00043E00C2907D040E0881F1F2803D93CE02F +:10CCD000881F1F2839D8012070BD4A1E242A34D845 +:10CCE0008446C07800258209032A09D000F03F0459 +:10CCF000601C884204D86046FFF782FFA04201D939 +:10CD0000284670BD9CF803004FF0010610F03F0F5D +:10CD10001EBF1CF10400007810F0100F13D0644601 +:10CD20000421604600F04BFA002818BF14EB000005 +:10CD3000E6D0017801F03F012529E1D28078022177 +:10CD4000B1EB501FDCD3304670BD002070BDC07801 +:10CD5000800970470178002201F00F030121042BA4 +:10CD60000BD0082B1CBF0020704743780E2B04BF4C +:10CD7000C3785FEA931C04D106E04078801F1F2827 +:10CD800000D911460846704713F03F0F1EBF0079C7 +:10CD900010F0010F10F0020FF4D1F2E710B4017897 +:10CDA00001F00F01032920D0052921D14478B0F8E2 +:10CDB0001910B0F81BC0B0F81730827D222C17D1A3 +:10CDC000062915D3B1F5486F98BFBCF5FA7F0FD28D +:10CDD00072B1082A98BF8A420AD28B429CBFB0F82F +:10CDE0001D00B0F5486F03D805E040780C2802D04C +:10CDF00010BC0020704710BC012070472DE9F041A5 +:10CE00001F4614460D00064608BFFFDF2146304688 +:10CE100000F0D5F9040008BFFFDF30193A46294673 +:10CE2000BDE8F04107F0C4B9C07800F03F0070479A +:10CE3000C02202EA8111C27802F03F021143C170A0 +:10CE40007047C9B201F00102C1F340031A4402EB7A +:10CE50004202C1F3800303EB4202C1F3C00302EBC1 +:10CE60004302C1F3001303EB43031A44C1F340131D +:10CE700003EBC30302EB4302C1F380131A4412F025 +:10CE8000FF0202D0521CD2B20171C37802F03F01FE +:10CE900003F0C0031943C170511C417070472DE964 +:10CEA000F0410546C078164600F03F04C4F1240066 +:10CEB0000F46B042B8BFFFDF281932463946001D81 +:10CEC00007F076F9A019401C6870BDE8F0812DE9E3 +:10CED000F04105464478C0780F4600F03F06002C2C +:10CEE00008BFFFDFA01B401E84B21F2C88BF1F2479 +:10CEF0002FB1A819011D2246384607F059F92046DE +:10CF0000BDE8F0814078704700B5027801F0030376 +:10CF100022F003021A430270012914BF02290021E2 +:10CF200004D0032916BFFFDF012100BD417000BD01 +:10CF300000B5027801F0030322F003021A430270E5 +:10CF4000012914BF0229002104D0032916BFFFDFE5 +:10CF5000012100BD417000BD007800F00300704762 +:10CF6000417889B1C0780E2818BF0F2803D0102847 +:10CF700018BF192802D3FB2904D905E0BF4A105C69 +:10CF8000884201D1012070470020704730B501244C +:10CF90000546C17019293CBFB848445C02D3FF293B +:10CFA00018BFFFDF6C7030BD70B515460E460446E5 +:10CFB0001B2A88BFFFDF65702A463146E01CBDE8AA +:10CFC000704007F0F5B8B0F807007047B0F80900F6 +:10CFD0007047C172090A01737047B0F80B007047BF +:10CFE00030B4B0F80720A64DB0F809C0B0F805304D +:10CFF0000179941F2D1998BFBCF5FA7F0ED269B143 +:10D00000082998BF914209D293429FBFB0F80B0004 +:10D01000B0F5486F012030BC98BF7047002030BC8D +:10D020007047001D07F07ABA021D0846114607F046 +:10D0300075BAB0F809007047007970470A68426015 +:10D0400049688160704742680A608068486070473C +:10D050000988818170478089088070470A68C0F814 +:10D060000E204968C0F812107047D0F80E200A60F0 +:10D07000D0F81200486070470968C0F81610704771 +:10D08000D0F81600086070470A68426049688160FD +:10D09000704742680A608068486070470968C160EC +:10D0A0007047C06808607047007970470A6842603E +:10D0B00049688160704742680A60806848607047CC +:10D0C0000171090A417170478171090AC171704784 +:10D0D0000172090A417270478172090AC172704770 +:10D0E00080887047C08870470089704740897047C2 +:10D0F00001891B2924BF4189B1F5A47F07D3818809 +:10D100001B2921BFC088B0F5A47F012070470020F3 +:10D1100070470A68426049688160704742680A60E7 +:10D12000806848607047017911F0070F1BBF407994 +:10D1300010F0070F002001207047017911F0070F50 +:10D140001BBF407910F0070F0020012070470171CC +:10D15000704700797047417170474079704781711D +:10D16000090AC1717047C088704746A282B0D2E9EF +:10D170000012CDE900120179407901F007026946F9 +:10D180001DF80220012A07D800F00700085C0128DA +:10D190009EBF012002B07047002002B070470171AD +:10D1A000704700797047417170474079704730B5DA +:10D1B0000C460546FB2988BFFFDF6C7030BDC37885 +:10D1C000024613F03F0008BF70470520127903F0B4 +:10D1D0003F0312F0010F36D0002914BF0B20704717 +:10D1E00012F0020F32D0012914BF801D704700BF1A +:10D1F00012F0040F2DD0022914BF401C704700BF4D +:10D2000012F0080F28D0032914BF801C704700BFFC +:10D2100012F0100F23D0042914BFC01C704700BFA8 +:10D2200012F0200F1ED005291ABF1230C0B270476D +:10D2300012F0400F19D006291ABF401CC0B2704727 +:10D24000072918D114E00029CAD114E00129CFD14F +:10D2500011E00229D4D10EE00329D9D10BE0042931 +:10D26000DED108E00529E3D105E00629E8D102E096 +:10D27000834288BF7047002070470000AC4802001E +:10D2800086F3FFFF00010102010202032DE9F041D4 +:10D29000FA4D0446284600216A78806801270E4628 +:10D2A00012B1012A1ED006E090F86620002A18BFAD +:10D2B0006F7000D001216A78C2EB421200EB42028B +:10D2C00092F82830194324D0667090F8D90002F102 +:10D2D0002A0170B12A22201D06F06AFF0420207066 +:10D2E00027710DE090F82820002A18BF6E70E1D158 +:10D2F000E1E73C22201D06F05BFF0520207027712E +:10D300006878A968C0EB401001EB400080F8286005 +:10D310001DE090F8A410E9B190F8D900012818BFD9 +:10D32000FFDFA868D0F8A5106160D0F8A910A1604F +:10D33000D0F8AD10E160D0F8B110216190F8B510CF +:10D340002175667013212170277180F8A460012077 +:10D35000BDE8F08190F82210012922D0017801293E +:10D360001CBF0020BDE8F081667014212170811C73 +:10D370002022201D06F01CFF2672A9680E70C048EE +:10D3800082888284D0F8C420527B80F8262080F8DE +:10D390002270D1F8C4000088F3F73CFCF3F7E3F8FF +:10D3A000D5E7667007212170416A616080F82260CC +:10D3B000CDE7B24880680178002914BF80884FF615 +:10D3C000FF7070472DE9F84F4FF000088946064678 +:10D3D0000127CDF80080FFF748FBBDF80010A74DEE +:10D3E00021F06004ADF8004008284FD2DFE800F0DB +:10D3F00004070D4E184E132C44F003000DE044F0CA +:10D400001500ADF80000474641E044F0100000BFB1 +:10D41000ADF800003BE044F0020040F01000F7E7F8 +:10D42000A86890F8E000052818BFFFDF44F01A0054 +:10D43000ADF80000A96891F8E710002914BF40F08A +:10D44000010020F00100E3E7A86890F8E01003294C +:10D450000AD090F8E010062958D090F8E00004288F +:10D4600018BFFFDF5FD012E03046FFF770FC0028E6 +:10D4700018BFFFDF0AD1F07810F03F0F1FBF3079DF +:10D4800010F0020F44F00400ADF800004746BDF86C +:10D4900000000090BDF80000C0F3C00BA868CBEB03 +:10D4A0004B1A00EB4A0090F82800002818BFBDE88E +:10D4B000F88F3046FFF7D9FA80467048806800EB55 +:10D4C0004A0190F8C90001F12A04012808BF01258A +:10D4D00003D0022814BFFFDF0225257300206073EC +:10D4E0006648806890F8E11084F83B10FF21A17332 +:10D4F0007F21E176BDF80010618190F8E0100429E9 +:10D500001CBF90F8E01006293AD044E044F00A012C +:10D51000ADF8001090F8FA00002814BF41F00400A4 +:10D5200021F0040074E73046FFF711FCD8B1012860 +:10D5300004BF44F00100ADF8000014D0022818BF69 +:10D54000FFDFA4D144F00200ADF80000A96891F813 +:10D55000FA10002914BF40F0040020F00400ADF8D8 +:10D560000000474693E7F07810F03F0F1FBF307977 +:10D5700010F0020FBDF8000040F0040087D047E72C +:10D5800090F8E200012808BF012503D0022814BF4B +:10D59000FFDF0225657304F10900384D00902878FB +:10D5A0007F2808BFFFDF2978009801707F2028704E +:10D5B0006FB1B8F1070F04F11C01304603D2FFF739 +:10D5C000BAFA207239E0FFF782FC207204E00020F2 +:10D5D0002072B8F1070F30D3B8F1070F0DD1A8684A +:10D5E00090F8F91001B3D0F8EA10C4F80210B0F8BE +:10D5F000EE10E18090F8F0006070A07A10F0040F57 +:10D600000ED0A86890F8FA10E9B190F8F7102175DB +:10D61000D0F8F110C4F81510B0F8F500A4F819000E +:10D62000B8F1070F38D098E0F07810F03F0F1ABF2C +:10D63000307910F0010FFF20DED0621CA11C3046B3 +:10D6400001F071FDD9E7B8F1070F1CBFB8F1010F68 +:10D65000FFDFB9F1000F08BFFFDF99F80000207568 +:10D66000B8F1010F03D0B8F1070F0BD075E004F14A +:10D6700015013046FFF712FA6FE000006401002048 +:10D68000CC10002001213046FFF7B2FA0168C4F83F +:10D6900015108088A4F81900F07810F03F0F1CBF17 +:10D6A000317911F0080F1AD0A86890F8E020042A08 +:10D6B00006D090F8E000032811D111F0100F0ED021 +:10D6C00003213046FFF794FA407803210009A07344 +:10D6D0003046FFF78DFA0088C0F30B002082F07807 +:10D6E00010F03F0F1CBF307910F0400F13D0FA48F4 +:10D6F000FFF72DFBA96891F8E020032A14D006213A +:10D700003046FFF775FA0078E076A86890F8E010E8 +:10D71000062922D118E0A86890F8FB10002918BF4C +:10D7200090F8F800F0D1F0E791F8C910042914BF7F +:10D7300008290028E3D1F07810F03F0F1CBF3079A2 +:10D7400010F0080FDBD1E0E790F8E9100909A173A8 +:10D75000B0F8E800C0F30B002082A968012001EBBB +:10D760004A0181F82800BBF1000F14BF06200520F4 +:10D77000BDE8F84F03F0F4B82DE9F041D74DAA68A1 +:10D7800092F8D930002B6ED07F27012611B109788D +:10D79000FE2914D0804692F82800002818BFBDE862 +:10D7A000F08102F12A044046FFF75FF900210828C2 +:10D7B00079D2DFE800F0515356787878595CC64C3E +:10D7C00092F8A400002818BFBDE8F08182F8A66096 +:10D7D00092F8DD0018B1F6F76CFE012829D020463A +:10D7E000FFF76CF90146A86880F8A71000F1A801BE +:10D7F0002046FFF745F92046FFF76DF90146A86876 +:10D8000080F8AE1000F1AF012046FFF747F9A86895 +:10D8100000F1B50428787F2808BFFFDF2878207042 +:10D820002F70A86880F8A460BDE8F041052003F0DF +:10D8300097B8F6F781FEA96801F1A802A731FDF7B4 +:10D84000DDFF002808BFFFDFA86890F8A71041F0AF +:10D85000020180F8A710CEE7A17209E0A67221723A +:10D860000CE0032001E021E00220A07200E0FFDFD5 +:10D8700004F10B014046FFF75EF92072621CA11C07 +:10D88000404601F050FC287809347F2808BFFFDFAC +:10D89000287820702F70A86880F82860BDE8F041D3 +:10D8A000052003F05DB82172BDE8F081BDE8F041CC +:10D8B00088E570B5894C0022A06890F8C910104620 +:10D8C00002F0A8FE002831D0F7F735FBA0688449A4 +:10D8D00090F8DF000D5C2846F7F75CF8A06880F848 +:10D8E000E15090F8C910082916BF04290F202520FF +:10D8F000F6F75DFFA068002190F8C9200120F7F736 +:10D9000050F97548F7F720FBA068D0F80001F7F749 +:10D910001EFBA06890F8C91080F8E21090F8C800CB +:10D92000032814BF0228012908D103E0BDE8704094 +:10D9300001F032BC08210020F7F707FCA06890F83E +:10D94000C91080F8E210F7F7DDFBA06890F8DD0061 +:10D9500020B1F6F77AFD4020F7F7A8FBA168032075 +:10D9600081F8E00070BD2DE9F0410F469046054674 +:10D970000321FFF73DF94078584C0209A06890F860 +:10D98000E91062F3071180F8E91003212846FFF738 +:10D990002FF90188A068B0F8E82061F30B02A0F825 +:10D9A000E82080F8E77090F8C910012905D090F8B8 +:10D9B000E000032808BFBDE8F081E8784FF00106D9 +:10D9C00010F03F0F1CBF287910F0400F09D006213E +:10D9D0002846FFF70DF90178A06880F8F81080F864 +:10D9E000FB60A06890F8E01003292AD0E97811F0D4 +:10D9F0003F0F1CBF297911F0010F08D000F1F00290 +:10DA0000911F284601F08FFBA06880F8F960E87844 +:10DA100010F03F0F1ABF287910F0020FBDE8F08117 +:10DA200001212846FFF7E4F8A1680268C1F8F12057 +:10DA30008088A1F8F50081F8F78081F8FA60BDE8E8 +:10DA4000F081022F18BF012FD0D1BDE8F08123490A +:10DA5000896881F80A01704770B5204DA86890F870 +:10DA6000E010022919BF90F8E010012900210C46AE +:10DA70001CBF0C2070BD00BFC1EB411200EB420285 +:10DA8000034682F82840491CC9B20229F4D3047025 +:10DA900080F8224093F8DD0030B1F7F719FBF6F774 +:10DAA000E8FCA86880F8DD40A868012180F8DC4027 +:10DAB00080F8C11080F8C84080F8DF40282180F845 +:10DAC0000B1180F80A41A0F8E34080F8E5400721F7 +:10DAD00080F8C010002070BDD81100206401002023 +:10DAE000D4480200F74810B58068002180F8E010A3 +:10DAF000012180F8E010FFF7AFFF002818BFFFDF1B +:10DB000010BD2DE9F047EF4C07460C26A06890F8B1 +:10DB1000E01001291FBF90F8E00002280C20BDE8AA +:10DB2000F087F6F778FEA06890F90A01F6F720FF73 +:10DB3000A06890F8C91080F8E21090F8C010012594 +:10DB4000002978D090F8C8004FF00009032802D0CF +:10DB5000022805D008E00521DB4801F0ADFB03E019 +:10DB60000321D94801F0A8FBA06890F8D81000293B +:10DB700004BF90F8DB00002843D0F5F749F80646CB +:10DB8000A0683146D0F8D400F5F750FDCF4990FB9E +:10DB9000F1F801FB180041423046F4F742FD01461E +:10DBA000A068C0F8D410D0F8D0104144C0F8D0100C +:10DBB000FDF7F3FD0146A068D0F8D020914220D8AF +:10DBC000C0E9349690F8DB0000281CBF0120FDF767 +:10DBD00008FF0121A06890F8DC20002A1CBF90F803 +:10DBE000D820002A0DD090F8B93000F1BA02012BEC +:10DBF00004D1527902F0C002402A14D0BA30F7F7AB +:10DC000085FEA06890F8B910BA30F6F769FE0F21CA +:10DC10000720F6F781FEA068002690F8E0100129A1 +:10DC200018D112E007E0FDF709FFA1682A46BA31D2 +:10DC3000F7F735FEE5E790F8E010022904BF80F819 +:10DC4000E0500C2006D1BDE8F08780F80451022195 +:10DC500080F8E010A06890F8C10088B1FDF769FE77 +:10DC600003219B48FDF7A1FE0146A06880F8DD1066 +:10DC7000C0F800719748F7F750F93046BDE8F087D3 +:10DC8000FDF700FEECE738B58E4CA06890F8E01088 +:10DC900002291CBF0C2038BD012180F80511A0F815 +:10DCA000081129208DF800006846F5F7F3FF30B120 +:10DCB000A0689DF8001090F80601884205D1A06880 +:10DCC00090F80601401C8DF80000A1689DF8000046 +:10DCD00081F806010220F7F734F97F48F6F752FE83 +:10DCE000A168DFF8F8C1002091F8C03091F8DF207A +:10DCF000521CACFB02546408A4EB8404224481F857 +:10DD0000DF2023FA02F212F0010F03D1401CC0B24F +:10DD10000328EBD3FFF7CDFD002038BD69498968A2 +:10DD200081F8C900002070476649896881F8DA00E7 +:10DD3000704710B5634CA36893F8B830022B14BF3A +:10DD4000032B00280BD100291ABF02290120002033 +:10DD50001146FDF725FD08281CBF012010BDA06855 +:10DD600090F8B800002816BF022800200120BDE866 +:10DD70001040F7F755BD5348806890F8B800002868 +:10DD800016BF022800200120F7F74ABD4D498968D7 +:10DD900081F8B80070474B49896881F8DC0070470A +:10DDA00070B5484CA16891F8B800002816BF022849 +:10DDB0000020012081F8B900BA31F7F71BFDA068F7 +:10DDC00090F8B810022916BF03290121002180F81C +:10DDD000DB1090F8B920002500F1BA03012A04BF36 +:10DDE0005B7913F0C00F0AD000F1BA03012A04D105 +:10DDF0005A7902F0C002402A01D0002200E001223C +:10DE000080F8D820002A04BF002970BDC0F8D05087 +:10DE1000F4F7FEFEA168C1F8D40091F8DB000028F9 +:10DE20001CBF0020FDF7DDFD0026A06890F8DC1087 +:10DE300000291ABF90F8D810002970BD90F8B920B9 +:10DE400000F1BA01012A04D1497901F0C001402949 +:10DE500005D02946BDE87040BA30F7F757BDFDF749 +:10DE6000EDFDA1683246BDE87040BA31F7F717BD45 +:10DE700070B5144D0C4600280CBF01230023A9687F +:10DE800081F8C13081F8CB004FF0080081F8CC0058 +:10DE90000CD1002C1ABF022C012000201146FDF7E6 +:10DEA0007FFCA968082881F8CC0001D0002070BD53 +:10DEB000022C14BF032C1220F8D170BD002818BF0B +:10DEC00011207047640100200012002040420F0022 +:10DED000D8110020D1480200D7480200ABAAAAAA54 +:10DEE0000328FE4A926808BFC2F8C41082F8C8002E +:10DEF0000020704710B5044602F018FF052809D02D +:10DF000002F014FF042805D0F448806880F8D94056 +:10DF1000002010BD0C2010BDF048816891F8C800A9 +:10DF2000032804D0012818BF022807D004E091F884 +:10DF3000CB00012808BF70470020704791F8CA0045 +:10DF4000012814BF03280120F6D1704710B5F7F758 +:10DF5000A1F8F7F780F8F6F77BFFF6F7E4FFDF4C60 +:10DF6000A06890F8DD0038B1F7F7B2F8F6F781FA5B +:10DF7000A168002081F8DD00A068012180F804116B +:10DF8000022180F8E010002010BDD449896881F892 +:10DF9000FC007047017801291CBF122070474278AD +:10DFA0000023032ACD49896808BFC1F8C43081F82D +:10DFB000C820012281F8C920C27881F8B8200279EE +:10DFC000002A16BF022A0123002381F8C13081F8FC +:10DFD000CA20427981F8C020807981F8DA000020D7 +:10DFE0007047BE488068704701F0D6B82DE9F84FF9 +:10DFF0004FF00008B948F7F790F8B84C4FF07F0A97 +:10E00000002808BF84F800A0F7F772F8B448FEF7BC +:10E010002CFDA070A16891F8E220012A18BFFFDF53 +:10E020000AD0A06890F8DD0018B1F7F751F8F6F7BC +:10E0300020FA4046BDE8F88FA94D0026A5F5867761 +:10E04000072836D291F8C10028B9F6F793FC0028CA +:10E0500008BF002600D00126A06890F8DD0080B13E +:10E06000FDF7F5FBA168FF2881F8DE000ED0014620 +:10E07000E81CFDF7E1FBA06890F8DE00FDF7F2FB7D +:10E080000643A06890F8DE00FF2817D1FDF781FC59 +:10E0900087F8DE0097F8C11081B108280ED12878E2 +:10E0A000E91CC0F38010FDF77BFB082818BF002691 +:10E0B00004E002BF91F8D90000280126A0784FF0B3 +:10E0C00000094FF0010B08281BD2DFE800F035AF44 +:10E0D000041A1A1A12F9002E00F06581A06890F84F +:10E0E000C800012818BF022840F05D81F6F7B0FE95 +:10E0F0007AE036B1A06890F8C800022806D001285E +:10E1000072D0F6F7A5FE4FF003088AE700217448A5 +:10E11000FFF732FBA0684FF00808C0F8E790C0F89E +:10E12000EB90C0F8EF90C0F8F390C0F8F79080F84B +:10E13000FB9080F8E79074E74FF00008002E00F0A5 +:10E140003281A26892F8C80002282DD001284BD055 +:10E1500003287FF466AFD2F8C400E978837E994241 +:10E160001BD12979C37E994217D16979037F9942DE +:10E1700013D1A979437F99420FD1E979837F9942DD +:10E180000BD1297AC37F994207D12978437EC1F305 +:10E190008011994208BF012100D0002192F8CB20C4 +:10E1A000012A26D0A9B3FBE000214D48FFF7E4FA8D +:10E1B000A06890F8051129B1491E11F0FF0180F8FF +:10E1C00005117CD1C0F8E790C0F8EB90C0F8EF9053 +:10E1D000C0F8F390C0F8F79080F8FB904FF0080873 +:10E1E00080F8E7B01DE7FFE700213D48FFF7C4FADC +:10E1F00019E0002965D100BF00F11A013848FEF787 +:10E200003FFC3748FEF75AFCA168D1F8C4104876A5 +:10E21000C6E0FFE797F8CC00082850D097F8DE104A +:10E2200081424ED0BFE04FF00308FAE6A06890F8B4 +:10E23000DB1000290CBF4FF0010B4FF0000B4FF02B +:10E240000008297805F10902C90907D0517901F0C0 +:10E25000C001402908BF4FF0010901D04FF000096B +:10E2600090F8C810032906D190F8C110002918BFF2 +:10E2700090F8CC0001D190F8DE00FDF7ADFA5FEA2E +:10E28000000A13D01021FEF730F9002818BF4FF014 +:10E29000010BB9F1000F04BFA06890F8B9A00DD030 +:10E2A00005F109015046F7F7C9FA8046A068B9F1AF +:10E2B000000F90F8B9A018BF4AF0020A02E072E01D +:10E2C0008CE06DE090F8C810032913D0F6F7C0FD7C +:10E2D000DEB3F6F71DFB50EA080003E064010020FE +:10E2E000D811002062D08DF800A06946FD48FFF7E4 +:10E2F00043FA98E7D0F8C400E978827E91421BD1B6 +:10E300002979C27E914217D16979027F914213D156 +:10E31000A979427F91420FD1E979827F91420BD155 +:10E32000297AC27F914207D12978407EC1F38011BA +:10E33000814208BF012500D0002597F8DE0008289B +:10E3400008D097F8CC10884200E02FE008BF4FF0CB +:10E35000010901D04FF00009B8F1000F05D1BBF160 +:10E36000000F04D0F6F7D4FA08B1012000E0002035 +:10E370004EB197F8CB10012903D021B955EA090114 +:10E3800001D0012100E0002108420CD0A06890F8E3 +:10E39000CB10012904BF002DD0F8C4003FF42CAFEE +:10E3A0004FF00A083DE6F6F753FD3CE7A06890F809 +:10E3B000CA00032818BF02287FF435AFB9F1000F57 +:10E3C0003FF431AFB8F1000F7FF42DAFC648694676 +:10E3D00040680090C348FFF7CFF924E7A06890F8A1 +:10E3E000DA0000283FF48DAEF6F732FDA06890F811 +:10E3F000D91000297FF417AFC0F8E790C0F8EB9070 +:10E40000C0F8EF90C0F8F390C0F8F79080F8FB9058 +:10E4100080F8F8A0B348FEF79AFCE8B301287CD056 +:10E4200002287FF400AFA0684FF0030890F8C800FE +:10E43000032814BF0020012036EA00003FF4F1ADAC +:10E44000A84D1820E97811F03F0F3FF4EAAD297983 +:10E4500088437FF4E6AD04212846FEF7C9FB064653 +:10E46000A06890F8E20002F0CCF80146304600F0D7 +:10E47000B5FE00283FF4D5AD002202212846FFF763 +:10E4800072FA2846FEF763FC0146A06880F8E610A1 +:10E490003188A0F8E31000E005E0B17880F8E510DD +:10E4A0004FF00408BDE5002E3FF4BDAEA06890F823 +:10E4B000C810012918BF02297FF4B5AE894DE9784B +:10E4C00011F03F0F1CBF297911F0020F05D011F098 +:10E4D000010F18BF4FF0010901D14FF000094FF0B3 +:10E4E0000008B9F1000F52D028780027C609012191 +:10E4F0002846FEF77DFB36B1407900F0C000402889 +:10E5000008BF012600D00026A06890F8C810032993 +:10E5100008D190F8C110002900E0AEE018BF90F8D3 +:10E52000CC0001D190F8DE00FDF756F95FEA000853 +:10E530000CD01021FDF7D9FF46B101212846FEF786 +:10E5400057FB01464046F7F779F90746A068002EC9 +:10E5500090F8B98018BF48F00208E87810F03F0F33 +:10E560001CBF287910F0020F0ED02846FEF7B3FA30 +:10E57000824601212846FEF73BFB5146F6F7B8F9E3 +:10E58000002818BF012000D1002038435FD0E87870 +:10E5900010F03F0F1EBF297911F0100F11F0080F76 +:10E5A00041D004212846FEF723FB0646A06890F8D8 +:10E5B000E20002F026F80146304600F00FFEA0B15E +:10E5C000424600212846FFF7CEF94648FEF7BFFB3A +:10E5D0000146A06880F8E6103188A0F8E310B17811 +:10E5E00080F8E5104FF004081BE5A06890F8E20001 +:10E5F00001287FF418AEE87810F03F0F1CBF28798F +:10E6000010F0010F3FF40FAEB9F1000F04D100215B +:10E610002846FEF7D7FE06E68DF8008069462846B4 +:10E62000FEF7D0FEFFE510F03F0F1CBF297911F077 +:10E63000100F7FF4F8AD10F03F0F1CBF287910F0D9 +:10E64000010F3FF4F0ADB9F1000FE5D1DFE7A068AD +:10E6500090F8CA00032818BF02287FF4E4AD002E0A +:10E660003FF4E1AD002F7FF4DEAD1F48694600683E +:10E6700000902846FEF7A6FED5E5002E3FF4D3AD68 +:10E68000184D1820E97811F03F0F3FF4CCAD2979EF +:10E6900088437FF4C8AD04212846FEF7A9FA064650 +:10E6A000A06890F8E20001F0ACFF0146304600F0AF +:10E6B00095FD00283FF4B7AD002201212846FFF761 +:10E6C00052F92846FEF743FB0146A06880F8E610A1 +:10E6D0003188A0F8E310B17880F8E5104FF0040815 +:10E6E0009FE40000D8110020C84802002DE9F04145 +:10E6F000FD4CA0680078002818BFFFDF0025A06847 +:10E7000001278570D0F8C4100A8882804A88428325 +:10E710008A888283C988C18380F82050F34990F8A1 +:10E72000DB20A1F59A764AB10A78C2F38013CA1C9D +:10E7300023B1527902F0C002402A33D090F8DC2095 +:10E7400042B111F8032BC2F380121AB1497911F0CA +:10E75000C00F27D00E3005F0CFFEA06890F8DD0086 +:10E7600018B1F5F7A6FE012824D0A068D0F8C4108F +:10E770004A7EC271D1F81A208260C98B81814561BD +:10E780000583A0680770D0F8C42090F80A1182F8B9 +:10E790005710D0F8C4000088F2F73CFABDE8F04109 +:10E7A000F1F7D2BED6F83711C0F80E10B6F83B110B +:10E7B0004182D2E7F5F7C0FEA16801F10802C91D48 +:10E7C000FDF71CF8002808BFFFDFA068C17941F001 +:10E7D0000201C171D6F80F114161B6F8131101831E +:10E7E000CFE72DE9F84FC04C0546FF21A068002770 +:10E7F0004FF0010980F8DE1090F8C800BA460128F1 +:10E8000018BF022802D0032818BFFFDF28004FF0EE +:10E81000040B4FF07F08B54EA6F1280500F04B81A0 +:10E820002846FEF73DFA28B92846FEF793FA002855 +:10E8300000F04181A06890F8E000082880F038815D +:10E84000DFE800F0FEFEFE04080CCF7BFFF7CEFBF6 +:10E8500000F0C5B800F093FD00F0C1B8A448FEF781 +:10E8600004F92071E878717A88421CD12879B17A4C +:10E87000884218D16879F17A884214D1A879317B1D +:10E88000884210D1E879717B88420CD1287AB17B1B +:10E89000884208D128783178C0F38010B0EBD11FBE +:10E8A00008BF012500D00025F6F7D2FA8E48F6F70A +:10E8B00034FC002808BF84F80080F6F719FC2079A2 +:10E8C000042840F04D81002D00F04A81CDF800A0D1 +:10E8D000A2688748694692F8D93053B3064692F841 +:10E8E0006600002840F03C8102F1680582F872B0B1 +:10E8F0006932A91C304600F016FC05F10B013046C8 +:10E90000FEF73DF9C0B228721F2884BF1F2028726D +:10E91000207809357F2808BFFFDF2078287084F829 +:10E920000080A06880F86690062002F019F800F0D8 +:10E9300017B9FEF747FD00F013B903276A48F6F749 +:10E94000ECFB002808BF84F80080F6F7D1FB68488C +:10E95000FEF78BF880466648FEF7F9F9B8F1080F24 +:10E9600008BF00283AD1E978032011F03F0F35D0D5 +:10E970002979884332D100215D48FEF739F9062212 +:10E9800006F1090105F0E8FB40BB5948FEF796F88F +:10E9900080465648FEF79FF880451FD10121544814 +:10E9A000FEF726F90622F11C05F0D6FBB0B9504857 +:10E9B000FEF791F880464D48FEF780F880450DD16E +:10E9C000F6F768FBF6F747FBF6F742FAF6F7ABFA0D +:10E9D0000227FFF78BFE042001F0C2FF38460746EE +:10E9E000B2E0F6F735FA4048F6F797FB002808BF83 +:10E9F00084F80080F6F77CFB3D48FEF736F80746C2 +:10EA00003B48FEF7A4F9072F08BF00284FD1E9784B +:10EA1000012011F03F0F4AD02979884347D10021C6 +:10EA20003348FEF7E5F8062206F1090105F094FBEC +:10EA300000283CD12E48FEF741F805462B4800E05F +:10EA400036E0FEF748F8854231D1A06890F804110D +:10EA500029B3B0F8082190F80611012A05D9520807 +:10EA6000A0F8082108BFA0F80891012914BF0029C7 +:10EA70000D21C943C1EBC10202EB011190F8052140 +:10EA8000D24302EB8203C3EB82121144B0F8082197 +:10EA9000890CB1FBF2F302FB131180F8051180F829 +:10EAA000049169461248CDF800A0FEF78BFC57E0B0 +:10EAB000FFDFBDE8F88FA06890F8E000082843D297 +:10EAC000DFE800F0424242041F2E3F350648F6F7C9 +:10EAD00024FB002808BF84F80080F6F709FBA06833 +:10EAE00090F8DD0050B105E0640100200012002024 +:10EAF000D8110020F6F7ECFAF5F7BBFCF6F7A8F909 +:10EB00002EE0FE48F6F709FB002808BF84F80080D5 +:10EB1000F6F7EEFAA06890F8DD000028EED0E2E704 +:10EB2000F648F6F7FAFA38B984F8008004E0F348BA +:10EB3000F6F7F3FA0028F7D0F6F7DAFAF6F788F9DD +:10EB40000EE000F02FFE0BE00C2F80F01982DFE8C2 +:10EB500007F006FDFC07FBFAFAFA0BF94FBBA8E732 +:10EB6000BDE8F84FFEF7A5BE00220121022001F00A +:10EB700051FD002800F04181E149A1F12800FDF795 +:10EB8000ADFFA068DE4E90F8B9103046FDF78DFF5E +:10EB9000A06800F1BA013046FDF76BFFA06890F85D +:10EBA000DB10C1B190F8C810032906D190F8C1104C +:10EBB000002918BF90F8CC0001D190F8DE00FCF7D6 +:10EBC0003FFF050007D001213046FDF76EFF2946C3 +:10EBD0003046FDF74EFFCA48F6F7B6F90121084660 +:10EBE000F6F7B3FAA168082081F8E000BDE8F88FD5 +:10EBF000A06890F8E21090F8E2100022032001F0E3 +:10EC000009FD00287ED0BF4F0A2087F8E0000120D0 +:10EC100001F0A6FE07F59A71A1F12800FDF75EFF4D +:10EC2000A06807F59A7890F8B9104046FDF73DFFC7 +:10EC3000A06800F1BA014046FDF71BFFA06890F8FC +:10EC4000DB10C9B190F8C810032906D190F8C110A3 +:10EC5000002918BF90F8CC0001D190F8DE00FCF735 +:10EC6000EFFE5FEA000907D001214046FDF71DFFD6 +:10EC700049464046FDF7FDFEA268A149D2F8C4000E +:10EC8000C08AC875000A0876D2F8C400407DB07505 +:10EC90000846F6F759F99A48D7F8C41020230278A5 +:10ECA000497B22F0200203EA411111430170D7F899 +:10ECB000C4002A78417BC2F340121140417397F897 +:10ECC0000B01D7F8C4106FE0A06890F8E21090F83C +:10ECD000E2100022052001F09DFC98B1894D0B2027 +:10ECE00085F8E000022001F03BFE05F59A71A1F1E4 +:10ECF0002800FDF7F3FEA06805F59A7790F8B910A3 +:10ED0000384600E079E0FDF7D0FEA06800F1BA01D6 +:10ED10003846FDF7AEFEA06890F8DB10F9B190F828 +:10ED2000C810032906D190F8C110002918BF90F827 +:10ED3000CC0001D190F8DE00FCF782FE5FEA00080B +:10ED40000DD004E034E01BE18EE085E07FE001219E +:10ED50003846FDF7AAFE41463846FDF78AFEA2680E +:10ED60006749D2F8C400C08AC875000A0876D2F88C +:10ED7000C400407DB0750846F6F7E6F8D5F8C40043 +:10ED800080F80D90A06890F8E230012296210020D2 +:10ED9000F5F790FF5A48017821F020010170A06832 +:10EDA000D5F8C41090F80B0181F85600BDE8F88F33 +:10EDB000A06890F8E21090F8E2100022042001F020 +:10EDC00029FCD0B14E49A1F12800FDF787FEA068CB +:10EDD0004B4E90F8B9103046FDF767FEA06800F181 +:10EDE000BA013046FDF745FEA06890F8DB10E9B1A6 +:10EDF00090F8C810032904D00AE0BDE8F84F00F0ED +:10EE0000CBB990F8C110002918BF90F8CC0001D1FF +:10EE100090F8DE00FCF714FE050007D00121304613 +:10EE2000FDF743FE29463046FDF723FE3448F6F74A +:10EE30008BF8A06890F8E230012296210020F5F7C7 +:10EE400039FFA168092081F8E000BDE8F88FA068CB +:10EE500080F8E090BDE8F88FA068022180F8049166 +:10EE600080F8E010BDE8F88FA56815F8E31F11F0F1 +:10EE7000800F0CBF1E204FF49670B5F80120C2F32E +:10EE80000C0212FB00F6C80908BF4FF01E0906D09D +:10EE9000002806BFFFDF4FF000094FF49679A878ED +:10EEA000400908BF012703D0012814BF002702270B +:10EEB000A06890F8E20001F0A4FBA6EB0008287817 +:10EEC00008EB0906C0F38010002808BF4FF4FA7A57 +:10EED00005D006BFFFDF4FF0000A4FF0320A0948A5 +:10EEE00090F8FC90B9F10C0F28BFFFDF0648074AE5 +:10EEF00030F819000AEB00010AE00000640100206C +:10EF000000120020CC100020DC4802003F420F001D +:10EF100001FB0620511CB0FBF1F000F120094E442A +:10EF2000F6F709F8287800F03F052846F5F732FD96 +:10EF3000A06880F8E15039462520F5F738FC012219 +:10EF4000A8EB09013B461046F5F7B4FEFE48F5F77D +:10EF5000FBFF00213046F6F743F8A06880F8E27026 +:10EF6000F6F7D0F8A06890F8DD0020B1F5F76DFA5B +:10EF70005020F6F79BF8A06880F8E0B0BDE8F88F65 +:10EF8000FFDFBDE8F88FF14810B5806890F8E00029 +:10EF90000C285FD2DFE800F05E5E5E5E5E5E5E5E65 +:10EFA0000613472DE848F5F7CFFFF6F7ABF8002139 +:10EFB0009620F6F715F8E5490520896830E0E24823 +:10EFC000F5F7C2FFE14CA06890F8E23001229621EB +:10EFD0001046F5F76FFEA06890F8E2000021962039 +:10EFE000F5F7FEFFF6F78EF8A168062081F8E0003D +:10EFF00010BDD548F5F7A8FFD44CA06890F8E230D2 +:10F00000012296211046F5F755FEA06890F8E2001F +:10F0100000219620F5F7E4FFF6F774F8A1680720C1 +:10F0200081F8E00010BDF6F735F8F6F714F8F5F7BB +:10F030000FFFF5F778FFC5480121806880F80411BB +:10F04000022180F8E010FFF751FBBDE810400320DB +:10F0500001F086BCFFDF10BD70B5BC4CA06890F815 +:10F06000E0007F25082828BF70BDDFE800F03F3FA3 +:10F070003F172304390AB548F6F74FF830B9257021 +:10F0800004E0B248F6F749F80028F8D0F6F730F86F +:10F09000F5F7DEFEBDE87040FEF70BBCAB48F6F7B7 +:10F0A0003CF8002808BF2570F6F722F8BDE870404C +:10F0B00000F072B8A548F6F730F8002808BF2570B0 +:10F0C000F6F716F8A06890F8DD0018B1F6F700F82A +:10F0D000F5F7CFF9F5F7BCFEBDE87040FEF7E9BBE8 +:10F0E00000F060FBBDE87040FEF7E3BB70BD70B59B +:10F0F000964C06460D46012909D0A06890F8E230EA +:10F1000090F8E2203046BDE8704001F0E9BDF5F727 +:10F1100011FBA16891F8E220034629463046BDE87C +:10F12000704001F0DDBD70B50646884814460D46B6 +:10F13000806890F8DD0018B1F5F7BBF901280ED012 +:10F140003046FDF7BBFC20703046FDF78EFC0728EB +:10F1500013D229463046BDE87040FDF791BCF5F763 +:10F16000EBF92A462146FCF749FB002808BFFFDFE0 +:10F17000207840F00200207070BD3046FDF775FC2D +:10F18000072818BF70BD00213046FDF731FD01682A +:10F1900029608088A88070BD10B5F5F77BFFF5F772 +:10F1A0005AFFF5F755FEF5F7BEFE684CA06890F8DB +:10F1B000DD0038B1F5F78CFFF5F75BF9A1680020A9 +:10F1C00081F8DD00A068012180F80411022180F897 +:10F1D000E010BDE81040002001F0C2BB2DE9F04175 +:10F1E000044680780222B2EB501F26D00D462178CB +:10F1F00011F0800F0CBF1E204FF49670B4F8012060 +:10F20000C2F30C0212FB00F6C80908BF1E2105D08C +:10F21000002806BFFFDF00214FF49671701BA27813 +:10F22000520908BF012703D0012A14BF0027022773 +:10F23000B0F5877F28BFAE4202D20020BDE8F08142 +:10F2400045182078C0F38010002808BF4FF4FA76E4 +:10F2500003D006BFFFDF002632263D4890F8FC4071 +:10F260000C2C28BFFFDF3B483B4A30F81400311814 +:10F2700001FB0520511CB0FBF1F020300544334860 +:10F28000806890F8E200F6F7B6F904463846F6F7DB +:10F29000B2F94FF47A7184423ABF001B00F2E730B2 +:10F2A000201AB0FBF1F034BF42192A1A3946BDE8E2 +:10F2B000F041012001F0AEB970B50D460446FDF7EE +:10F2C000AFFB032D55D0052D18BF70BD052120467D +:10F2D000FDF7ABFB1D4DA868D0F8C40000F10E018E +:10F2E0002046FDF760FCA868D0F8C40000F11201C8 +:10F2F0002046FDF75CFCA868D0F8C410497DA175D4 +:10F30000D0F8C410C98AE175090A2176D0F8C41072 +:10F3100049886176090AA176D0F8C4108988E17617 +:10F32000090A2177D0F8C410C9886177090AA17742 +:10F33000D0F8C40000F108012046FDF756FCA8688B +:10F34000D0F8C400017E09E0D8110020640100203B +:10F35000CC100020DC4802003F420F002046FDF7A1 +:10F360002CFCA86890F8FC102046BDE87040FDF722 +:10F370002EBC2046BDE870400321FDF756BB2DE9A9 +:10F38000F84FFD48F5F7C9FEFB4C002804BF7F206D +:10F390002070F5F7ADFEA06890F8D900002818BFDE +:10F3A000FFDFF648FDF761FBDFF8D083E0704FF038 +:10F3B000000998F803004D4610F03F0F1CBF98F865 +:10F3C000040010F0080F14D0EC48FDF7C0FC70B139 +:10F3D000012802D002280AD00BE098F8030010F0B0 +:10F3E0003F0F1CBF98F8040010F0010F01D04FF040 +:10F3F0000109A06890F8DD0018B1F5F769FEF5F78E +:10F4000038F898F803002E4637464FF0000A10F0FF +:10F410003F0F1CBF98F8040010F0020F43D0A06803 +:10F42000DFF858A3002690F8DB0000280CBF012766 +:10F4300000279AF800000121C5095046FDF7D8FBC6 +:10F4400035B1407900F0C000402808BF012500D048 +:10F450000025A06890F8C810032906D190F8C110C3 +:10F46000002918BF90F8CC0001D190F8DE00FCF71D +:10F47000B3F95FEA000B0FD01021FDF736F8002832 +:10F4800018BF012745B101215046FDF7B1FB0146E8 +:10F490005846F6F7D3F90646A068002D90F8B9A0B3 +:10F4A00018BF4AF0020AE0784FF0030B072875D125 +:10F4B000B248FDF74CFC002800F0F280012803D090 +:10F4C000022800F031819FE0009700270321AB481C +:10F4D000FDF78EFBB9F1000F7ED0A16891F8E7200F +:10F4E000012A79D1427891F8E9301209B2EB131F61 +:10F4F00072D10088B1F8E810C0F30B00C1F30B0122 +:10F50000884269D19D48FDF722FCA16891F8E62068 +:10F51000904261D191F8C800012818BF022802D09A +:10F5200003283CD0B9E0F5F793FC98F8030010F0FD +:10F530003F0F1CBF98F8040010F0020F17D08F4F38 +:10F540003846FDF7C8FA804601213846FDF750FBE2 +:10F550004146F5F7CDF9002818BF012030430BD004 +:10F560008DF800A069468548FDF72CFF14E00021C6 +:10F570008248FDF727FF0FE0A06890F8CA00032833 +:10F5800018BF022808D13DB136B97D486946806868 +:10F5900000907A48FDF716FF03277EE034E0002153 +:10F5A0007648FDF725FBA1680622D1F8C4101A3170 +:10F5B00004F0D2FD50B97148FDF780FAA168D1F886 +:10F5C000C410497E884208BF012500D0002598F864 +:10F5D000030010F03F0F00E05CE01CBF98F804004F +:10F5E00010F0020F01D0CEB127E0A06890F8CB1048 +:10F5F000012901D015B10CE05DB937E090F8DE10BB +:10F6000090F8CC00814204D0F5F722FC5846BDE8C2 +:10F61000F88FA06890F8E2000B273EE0009870B1E8 +:10F62000564E3046FDF757FA074601213046FDF7A2 +:10F63000DFFA3946F5F75CF908B1012200E0002253 +:10F64000A06890F8CB10012907D041B92DB990F8E6 +:10F65000DE3090F8CC00834201D1012000E0002090 +:10F66000024217D0012908BF002DD2D10021434802 +:10F67000FDF7BEFAA1680268D1F8C410C1F81A20DB +:10F680008088C8833D48FDF719FAA168D1F8C410F5 +:10F690004876BEE7F5F7DCFB03273846BDE8F88F70 +:10F6A000F5F7D6FB03213548FDF7A2FAB9F1000FB3 +:10F6B00036D0A16891F8E7206ABB427891F8E9302A +:10F6C0001209B2EB131F2BD10088B1F8E810C0F378 +:10F6D0000B00C1F30B01884222D12848FDF737FB0C +:10F6E000A16891F8E62090421AD191F8C80001284B +:10F6F00018BF022814D198F8030010F03F0F1CBF68 +:10F7000098F8040010F0020F06D08DF800A06946AA +:10F710001A48FDF757FE03E000211848FDF752FE96 +:10F720005846BDE8F88F00BFF5F792FBA06890F847 +:10F73000C80003281CD01148FDF709FBA16891F807 +:10F74000E620904214D198F80320092012F03F0FD0 +:10F750000ED098F8042090430AD1B9F1000F07D0D9 +:10F7600091F8C80002280DD000210448FDF72AFEB8 +:10F770000320BDE8F88F000064010020D8110020AC +:10F78000C848020091F8050128B1401E10F0FF00A2 +:10F7900081F80501ECD1524601212348FEF7E3F838 +:10F7A0000920E6E710B5F5F753FB2048F5F7B5FC5F +:10F7B0001E4C002804BF7F202070F5F799FCA0683C +:10F7C00090F8041119B1002180F8041110BDB0F8AF +:10F7D000082190F80611FF2A0AD24FF6FF7303EAB8 +:10F7E0004202A0F80821FF2A84BFFF22A0F80821C6 +:10F7F000012914BF00290D21C943C1EBC10202EB4D +:10F80000011290F80511C94301EB8103C3EB81118B +:10F810001144B0F80821890CB1FBF2F302FB13117B +:10F8200080F80511CFE70000D81100206401002006 +:10F830002DE9FF4F07460C46488881B040F2E2416F +:10F8400048430090E08A002600FB01FB94F8640026 +:10F8500091460D2818BF0C281FD024281EBF94F8ED +:10F86000650024284FF0000A17D0049818B1012130 +:10F87000204602F0B2FB94F8540094F8558094F8B6 +:10F88000D010054661B101296DD0022952D003295B +:10F8900018BFFFDF67D000F0D5B84FF0010AE4E7EA +:10F8A000B9F1000F08BFFFDFFD4EB068002808BFA8 +:10F8B000FFDF94F85410FB4890F82400FDF79DF802 +:10F8C000009094F85400F5F7A5FE00F2E7314FF4EC +:10F8D0007A79B1FBF9F1F24880680E1894F8540077 +:10F8E000F5F798FE014694F85400022804BFEE484C +:10F8F0004FF47A720DD0012804BFEC484FF4C8626F +:10F9000007D0042807BFEA4840F69802E94840F6C5 +:10F91000E4421044084400F2E731B1FBF9F10098E9 +:10F92000401A00EB0B01DE48406930440844061DD4 +:10F93000012015E0DA48A9F101018068084308BFF9 +:10F94000FFDFDD48B9F1000F006800EB0B0606D0C1 +:10F95000D348806800F22230B04288BFFFDF032026 +:10F9600084F8D0006DE094F86410009E24291EBF36 +:10F9700094F86520242A25294FD1B4F85810B4F8FA +:10F98000F020891A491C09B2002946DB94F8F210CC +:10F99000002942D00D4694F8F310002918BF88467C +:10F9A000022804BFC0494FF47A700DD0012804BF6B +:10F9B000BE494FF4C86007D0042807BFBC4940F6D1 +:10F9C0009800BC4940F6E4400144022D04BFB6480B +:10F9D0004FF47A720DD0012D04BFB4484FF4C862C1 +:10F9E00007D0042D07BFB24840F69802B14840F650 +:10F9F000E4421044814208D9081A00F5FA714FF424 +:10FA00007A70B1FBF0F0064407E0401A00F5FA7195 +:10FA10004FF47A70B1FBF0F0361AB9F1000F10D044 +:10FA2000DFF87C92D9F8080020B9B9F80200002864 +:10FA300018BFFFDFD9F8080000F22230B04288BFBB +:10FA4000FFDF06B9FFDF3146D4F8D400F2F7E9FD55 +:10FA5000C4F8D400B860002038704FF0010987F86E +:10FA60000490204602F0A6FBAAF10101084208BF5B +:10FA700087F8059006D094F8D00001280CBF02202A +:10FA8000032078714046D4F824B0F5F7B4FD014660 +:10FA9000022D04BF84484FF47A720DD0012D04BFAB +:10FAA00082484FF4C86207D0042D07BF804840F653 +:10FAB0009802804840F6E4421044084400F23F6156 +:10FAC0004FF47A70B1FBF0F0584400F5C970F8605B +:10FAD000049830EA0A0004BF05B0BDE8F08F314653 +:10FAE0003846FCF724FE85B2204602F063FBA842AC +:10FAF0000FD8054687F8059006FB05F1D4F8D40029 +:10FB0000F2F78FFDB86031463846FCF710FE284406 +:10FB100085B22946204602F060FAB868C4F8D400DD +:10FB200005B0BDE8F08F2DE9F0430446634885B089 +:10FB30000D4690F80004DFF88891400999F8001408 +:10FB40004909884218BFFFDFDFF85481002708F118 +:10FB50004406082D80F00E81DFE805F0046872721B +:10FB60006DFEFEB6202C28BFFFDF36F814000621FC +:10FB7000F0F71EFF050008BFFFDF202C28BFFFDFC6 +:10FB800036F814002988884218BFFFDF95F8D000A6 +:10FB9000002808BFFFDF284601F02EFFC8F80870D4 +:10FBA000A8F8027029460020C8F81470FCF710FE6F +:10FBB00000F19804686AA04225D995F85500F5F738 +:10FBC0001AFD014695F85400022804BF36484FF448 +:10FBD0007A720DD0012804BF34484FF4C86207D0B0 +:10FBE000042807BF324840F69802324840F6E44203 +:10FBF000104408444FF47A7100F23F60B0FBF1F119 +:10FC0000686A0844071B29460020C8F80C70FCF7F6 +:10FC1000DFFD698840F2E24251439830081AA0F2B1 +:10FC20002230C8F8100005B0BDE8F08305B0BDE88B +:10FC3000F04302F0ADB805B0BDE8F043F5F7A9BA5E +:10FC400099F8140D1F49400991F800144909884298 +:10FC500018BFFFDF202C28BFFFDF36F81400062175 +:10FC6000F0F7A6FE050008BFFFDF202C28BFFFDF4E +:10FC700036F814002988884218BFFFDF00220123CC +:10FC800029466846FFF7D4FD95F8DA006946F3F790 +:10FC900007FA002808BFFFDF05B0BDE8F0830000C9 +:10FCA000281200204412002068360200A22402001C +:10FCB000D0FB010030D301007401002001E000E01E +:10FCC0000BE000E019E000E0202C28BFFFDF36F851 +:10FCD00014000621F0F76CFE050008BFFFDF202CA2 +:10FCE00028BFFFDF36F814002988884218BFFFDFDD +:10FCF00095F8D000042818BFFFDF85F8D07095F87C +:10FD0000DA404FF6FF79202C28BFFFDF26F8149049 +:10FD100095F8DA00F2F75DFF002808BFFFDF20202A +:10FD200085F8DA00D5F8E000002804BFD5F8DC003B +:10FD3000C8F8180008D0D5E9391211448269114475 +:10FD40008161D5E93701C860D5F8DC0000281CBF07 +:10FD5000D5F8E010016100E00CE004D1D5F8E00036 +:10FD6000002818BF8761FE48007805B0BDE8F04361 +:10FD7000ECF70CB8FFDF05B0BDE8F0832DE9F05FCC +:10FD8000F84E07468B46F08B7568401CF083307840 +:10FD90004FF00008002808BFFFDF07D0DFF8C89346 +:10FDA00004282ED0052818BFFFDF5BD05846FEF789 +:10FDB00018F9040008BFFFDF29463069F2F731FC6B +:10FDC000B86087F800800120387194F8C9000228D3 +:10FDD00008BFE64807D0012808BFE54803D004283B +:10FDE0000CBFE448E4484FF47A7100F2E140B0FB04 +:10FDF000F1F0B168FA300844F860307804287DD119 +:10FE000083E0002AD2D0D6F810A0D9F8184034B335 +:10FE1000A146E468002CFBD1B9F1000F1FD099F87E +:10FE20000000002808BFFFDFD9F81410D9F804003B +:10FE300001445046F3F7FAFB002807DA291A491E55 +:10FE400091FBF5F101FB05042A4604E090FBF5F176 +:10FE500001FB15042A46944288BFFFDF00E04446B8 +:10FE60002546A3E7002AA1D0B569002D08BFFFDF12 +:10FE70000024D5F8E420D9F818002346611E58B1B3 +:10FE80008369934228BF994284BF194604460346BA +:10FE9000C0680028F4D104B91C46C5F8E040D0354C +:10FEA000002C04BFC5F80C80C9F8185005D0E068D4 +:10FEB000E560E860002818BF0561D5F81090C5F826 +:10FEC0001880B9F1000F0ED0D9F8180048B1D5F854 +:10FED00014A0504538BFFFDFD9F81800A0EB0A0086 +:10FEE000A861C9F81880002C08BFC6F8208009D086 +:10FEF0002078002808BFFFDF616900E00AE0606841 +:10FF00000844306240F6B83550E7F08B0A2838BF15 +:10FF1000032000D302207871F08B012807D93846DE +:10FF20007168FCF704FC0146F08B0844F083B86864 +:10FF30003061BDE8F09F2DE9F04107468F4884B05D +:10FF40000D4690F80004DFF83882400998F8001454 +:10FF50004909884218BFFFDF01200026082D814C87 +:10FF600080F0BB80DFE805F004718C8C87B9B9A5FF +:10FF700060732073607800281CBF04B0BDE8F08176 +:10FF800079488660466126733846FEF72AF80500F0 +:10FF900008BFFFDF95F8C900022804BF79494FF474 +:10FFA0007A720DD0012804BF71494FF4C86207D09E +:10FFB000042807BF6F4940F69802734940F6E442AF +:10FFC00011444FF47A7201F2E731B1FBF2F1A26809 +:10FFD0008C18F5F704FB024695F8C900082808BFFD +:10FFE000082127D004280CBF0221002322D0022898 +:10FFF0000CBF182128211944042816BF08280F23F4 +:020000040002F8 +:1000000025235B1D082808BF402007D0042808BF0F +:10001000102003D002280CBF0420082013FB00107E +:10002000801A201AFDF76DFD002818BFFFDF04B00D +:10003000BDE8F08101EB410101F12803082814BF5C +:1000400004284FF4A871D6D0D1E7617851B1207B54 +:10005000002808BFFDF77AFF667304B0BDE8F041E1 +:10006000F2F7E2BCA073FDF70EFE002818BFFFDF19 +:1000700004B0BDE8F08104B0BDE8F041F5F789B8FF +:1000800098F8140D4149400991F800144909884233 +:1000900018BFFFDF002239466846FFF76FFE69464A +:1000A0003846F2F7FDFF002808BFFFDF04B0BDE8C7 +:1000B000F0812078052818BFFFDF207F002808BFC7 +:1000C000FFDF26772670207DF2F783FD002808BF2A +:1000D000FFDF267504B0BDE8F081FFDF04B0BDE8A6 +:1000E000F0812DE9F0411F4C0026207804281FBF25 +:1000F000207805280C20BDE8F08101206070607B2D +:100100000025A8B1EFF3108010F0010F72B60CBFFC +:1001100000270127607B00281CBFA07B002805D09A +:10012000FDF714FF6573A573F2F77EFC2FB903E0AA +:10013000207DF3F7C7F800E062B6207DF3F70FFBF0 +:10014000207F28B125772078052818BFFFDF0C26EF +:1001500065702570207DF2F73CFD002818E0000056 +:1001600070010020441200202812002004360200F2 +:10017000A2240200D0FB0100C0D4010001E000E095 +:100180000BE000E06836020030D3010019E000E027 +:1001900008BFFFDF25753046BDE8F0812DE9F04F3F +:1001A000FD4883B00078002818BFFFF79AFF0120B0 +:1001B000DFF8E88388F8000069460620F0F781FB45 +:1001C000002818BFFFDF00274FF6FF7934E00298C0 +:1001D00000281CBF90F8D01000292DD00088484579 +:1001E0001CBFDFF8BCA34FF0200B3BD00621F0F77B +:1001F000DFFB040008BFFFDF94F8DA00F3F7AFFA83 +:1002000084F8D07094F8DA504FF6FF76202D28BF8E +:10021000FFDF2AF8156094F8DA00F2F7DAFC00281C +:1002200008BFFFDF84F8DAB069460620F0F749FB23 +:10023000002818BFFFDF10E06846F0F720FB002819 +:10024000C5D00FE0029800281CBF90F8D0100029FC +:1002500003D000884845C9D104E06846F0F70FFB99 +:100260000028EFD088F80070C8F8187003B000209C +:10027000BDE8F08F10B5CB4C60B101280CBF40F643 +:10028000C410FFDF06D0A06841F66A01884228BF8B +:10029000FFDF10BDA060F6E710B5DFF808C3BE4C65 +:1002A00000238CF80000237063702377237363733B +:1002B000A3732020A3612075A4F11C004370423079 +:1002C00010214FF6FF72428020F8042F491EFAD108 +:1002D000CCF80830DCF8080041F66A01884228BFF3 +:1002E000FFDFFFF75BFF40F6C41101206160F5F707 +:1002F00082F900F2E7314FF47A70B1FBF0F042F28C +:1003000010710844A0606168A1F21731884298BF5B +:100310000146A16010BDF0B59F4C054685B0207820 +:1003200000281EBF0C2005B0F0BD95F8546095F86C +:1003300055006F6AF5F75FF9022E04BF9A494FF432 +:100340007A720DD0012E04BF98494FF4C86207D0CD +:10035000042E07BF964940F69802964940F6E442BB +:10036000114408444FF47A7100F23F60B0FBF1F0A1 +:10037000384400F22230C5F8E400A56195F8D000B9 +:10038000002818BFFFDF0020844948610521217043 +:1003900060702077E0838848F2F7C1FB2075202841 +:1003A00008BFFFDFF2F734FC2061217D012268469F +:1003B000FFF7E4FC207D6946F2F772FE002808BFD3 +:1003C000FFDF002005B0F0BD7348007800281CBF97 +:1003D0000020704710B50620F0F784FA80F0010085 +:1003E00010BD70B56C4C05462078002818BFFFDFA3 +:1003F000287801281CBF112070BD698840F2712245 +:10040000AD88514301206160F5F7F5F800F2E7315E +:100410004FF47A70B1FBF0F040F2712105FB01005E +:10042000A0606168A1F21731884298BF01460020A0 +:10043000A16070BD10B584B008431EBF112004B088 +:1004400010BD554C207800281EBF0C2004B010BDF4 +:100450000020607004212170E0835748F2F75FFBB1 +:100460002075202808BFFFDF4C48806938B101465D +:10047000C0680028FBD111B1F2F7CAFB05E0F2F722 +:10048000C7FB40F6B831F2F7CCF82061217D01229C +:100490006846FFF773FC207D6946F2F701FE0028ED +:1004A00008BFFFDF002004B010BD70B53A4CA16951 +:1004B0000160FFF716FE002300BBA169D1F8E02020 +:1004C0005AB1D1E939C5AC449569AC44C2F818C0F9 +:1004D000D1E9372CCCF80C2005E0DFF8C0C0D1F80A +:1004E000DC20CCF81820D1F8DC20D1F8E010002A6C +:1004F00018BF116102D1002918BF8B61A36170BDC3 +:1005000026494870704770B540F2E24300FB03F59E +:1005100010460C46F5F76FF8022C04BF22494FF441 +:100520007A720DD0012C04BF20494FF4C86207D065 +:10053000042C07BF1E4940F698021E4940F6E442CB +:10054000114408444FF47A7100F23F60B0FBF1F0BF +:1005500000F2223085428CBF281A002070BD70B591 +:100560000D46064601460020FCF732F9044696F88F +:100570005500F5F740F8014696F85400022804BFEC +:10058000094A4FF47A7020D0012804BF074A4FF47B +:10059000C8601AD0042811E044120020281200205C +:1005A0006C1200207001002068360200A2240200B4 +:1005B000D0FB010030D3010037FF010007BFFC4A28 +:1005C00040F69800FB4A40F6E440104408444FF4DB +:1005D0007A7100F23F60B0FBF1F0718840F2712255 +:1005E0005143C0EB4100A0F22230A54234BF214666 +:1005F0002946814203D2A5422CBF2846204670627C +:1006000070BD10B5F4F7EBFFEB498A684968511AE1 +:10061000084410BD2DE9F74FE74A00231826D2F809 +:1006200008B028270BF198044FF004084FF0100988 +:100630004FF0080A4FF4C8724FF4BF754FF0400CEA +:1006400006287CD2DFE800F0034A21472465142005 +:10065000042912D0082909D02A20022911D010FB20 +:100660000A40002328211944441877E010FB0C406D +:100670004FEA0C034FF4A871F5E710FB09402E2355 +:10068000F8E710FB08401821EDE704F5317465E048 +:10069000082904BF4FF4BA6140200CD0042915D0BA +:1006A000022903BF03F15C01324604203A461CBF15 +:1006B00003F1B001082000EBC00000EB400002EBAA +:1006C00040000844204400F19C0447E02A4640F2E0 +:1006D0008E211020EFE704F5B0743FE0082908BF31 +:1006E00040200CD0042904BF2A46102007D002293C +:1006F00007BF03F11802042003F128020820C0EB11 +:10070000C00000EB400002EB4001029858440C1876 +:1007100024E0082904BF4FF4356140200CD004299F +:1007200016D0022903BF324603F1B401042003F5B9 +:10073000B0711CBF3A46082000EB400300E00CE01B +:1007400003EB001010440844204400F19C0405E031 +:100750002A4640F2EE311020EEE7FFDF974880682E +:10076000A0428CBF0120002003B0BDE8F08F10B57F +:10077000914C607828B1D4E90301A268FCF707F82E +:10078000E060D4E9020188429CBF2078002814BFB1 +:100790000020012010BD04222DE9F04F884E894F22 +:1007A000DFF80C82DFF80C9285B04FF47A7A0529D5 +:1007B00080F0D280DFE801F00A2B0331920080F84C +:1007C000D02005B0BDE8F04FF2F72EB904467A48C4 +:1007D0000078002818BF84F8D02004D005B0BDE808 +:1007E000F04FF2F721B90122002321466846FFF7B6 +:1007F0001FF894F8DA006946F2F752FC002808BFA7 +:10080000FFDFB4F85800401CA4F85800E6E70321C5 +:1008100080F8D01005B0BDE8F08F8346408840F2E4 +:10082000E241484368490860DBF8F800594600890E +:10083000ABF81600DBF8F80080798BF81500DBF8D0 +:10084000F8004089ABF80200DBF8F8008089ABF8CB +:100850000400DBF8F800C089ABF806000020DBF8E4 +:100860002850FBF7B5FF04469BF85500F4F7C3FE8C +:100870009BF85410022908BF4FF47A710DD001295A +:1008800004BF3E464FF4C86107D0042907BF46465F +:1008900040F698014E4640F6E4413144084400F2E7 +:1008A0003F60B0FBFAF1BBF8020040F27122504306 +:1008B000C1EB4000A0F22230A54234BF21462946B8 +:1008C000814203D2A5422CBF28462046CBF8240003 +:1008D00002208BF8D00005B0BDE8F08F83460146BA +:1008E000856A0020FBF774FF04469BF85500F4F777 +:1008F00082FE9BF85410022908BF4FF47A710DD084 +:10090000012904BF3E464FF4C86107D0042907BF40 +:10091000464640F698014E4640F6E44131440844CC +:1009200000F23F60B0FBFAF0BBF8021040F2712217 +:100930005143C0EB4100A0F22230A54234BF214612 +:100940002946814203D2A5422CBF28462046CBF837 +:10095000240005B0BDE8F08FFFDF05B0BDE8F08FE3 +:100960002DE9F043DFF864800024144D98F800105E +:1009700085B0072880F0AD81DFE800F0042A2AFC6A +:10098000FCFBFB00EC830846EBF700FA68780028D4 +:1009900040F05E81297D00226846FFF7EFF9287D4F +:1009A0006946F2F77DFB002808BFFFDF00F050B971 +:1009B000D0FB010030D30100281200204412002097 +:1009C00068360200A2240200740100207001002099 +:1009D00002280CBF01260026287DFDF702FB04003B +:1009E00008BFFFDF94F8E2103046FCF706F8DFF8A6 +:1009F000449301462869D9F80820002E024408BF14 +:100A00004FF4FC706ED094F8E20094F8E2000828ED +:100A10001EBF94F8E2000428002000F0B98000BF57 +:100A200094F8E230082B1ABF94F8E230042B4FF40C +:100A3000A87305D094F8E230022B0CBF18232823AA +:100A4000034494F8E200082808BF40200BD094F833 +:100A5000E200042808BF102005D094F8E200022824 +:100A60000CBF04200820C0EBC00C0CEB401003446A +:100A700094F8E20008281EBF94F8E2000428002041 +:100A800079D000BF94F8E2C0BCF1080F1ABF94F807 +:100A9000E2C0BCF1040F4FF4A87C08D094F8E2C087 +:100AA000BCF1020F0CBF4FF0180C4FF0280C84441F +:100AB00094F8E200082808BF40200BD094F8E20028 +:100AC000042808BF102005D094F8E20002280CBFCB +:100AD0000420082000EB400606EB00106044184498 +:100AE00000F59A7010440844061D94F8E200F4F7EB +:100AF00082FD94F8E210022908BF8F490BD094F8C8 +:100B0000E210012908BF8D4905D094F8E2100429AC +:100B10000CBF8B498B4994F8E220022A08BF4FF49E +:100B20007A720ED094F8E220012A08BF4FF4C8620E +:100B300007D094F8E220042A0CBF40F6980240F651 +:100B4000E442114408444FF47A7100F2E730B0FBFC +:100B5000F1F0A969301A40F2E2434A88D03102FB31 +:100B600003F6D9F818208A4208BF00272AD0296A3C +:100B700002E0A8E055E014E0F2F758FD002819DA89 +:100B8000311A4A1E92FBF6F202FB0607314616E0C6 +:100B900094F8E200082818BF022000EB400028303B +:100BA0003EE794F8E200082818BF022000EB40005E +:100BB000283067E790FBF6F202FB160731468F42BA +:100BC00088BFFFDFD8F80800874208D2A86940F242 +:100BD00071224188C1824A4307EB420705E040F297 +:100BE000E240B7FBF0F0A969C88294F8E210A86966 +:100BF00080F8541094F8E21080F8551005214175E2 +:100C0000C08A6FF41C71484307EB400040F6354141 +:100C1000C9F81400B0EB410F28BFFFDF05B0BDE8F5 +:100C2000F08304280CBF01260026EC830846EBF76E +:100C3000ADF80120287785F82460A8692969C0F8F3 +:100C4000D41080F8D0402978052918BFFFDF06D0DE +:100C5000F1F7EAFE6C73AC7305B0BDE8F0830028D1 +:100C600008BFFFDFA86990F8D000002818BFFFDF99 +:100C7000A86990F8DA00202818BFFFDF3248F1F7A2 +:100C80004EFFA9690646202881F8DA000F8828BFA0 +:100C9000FFDF2E4820F81670A86990F8DA002028A7 +:100CA00008BFFFDF002301226846A969FEF7C0FDE7 +:100CB000A869694690F8DA00F2F7F2F9002808BF4F +:100CC000FFDFAC61C4E705B00846BDE8F043EBF7D1 +:100CD0005DB8FFDF05B0BDE8F08316494860704796 +:100CE00070B5144D0446002904BFA86070BD4FF4D0 +:100CF0007A76012910D002291CBFFFDF70BD6888F9 +:100D0000401C68801046F4F785FC00F2E730B0FB29 +:100D1000F6F0201AA86070BD1846F4F78AFC00F2BD +:100D2000E730B0FBF6F0201AA86070BD08480078E4 +:100D3000704700002812002068360200A22402003A +:100D4000D0FB010030D3010027FB01006C12002012 +:100D500044120020F7490C28896881F8CB001ABF9B +:100D6000132818287047002211280FD0072808BF21 +:100D7000704715280AD001281ABF0028022870479A +:100D8000A1F88420012081F888007047A1F88A200A +:100D9000704770B5E74CA1680A88A1F83E2181F838 +:100DA0003C0191F85400012808BF012503D0022816 +:100DB00014BFFFDF0225A06880F8405190F855006D +:100DC000012808BF012503D0022814BFFFDF022538 +:100DD000A068012180F8415180F83A11002180F883 +:100DE0000E11E078BDE87040EAF7D0BFD14A012982 +:100DF00092681BD0002302290FD0032922D030B3E0 +:100E000001282FD0032818BF704792F864001328D8 +:100E10001CBF1628182805D1704792F8CB0000286F +:100E200008BF7047D2F8F8000370704792F8CB0003 +:100E3000012808BF704700BFD2F8FC000178491EA6 +:100E40000170704792F8CB000328EBD17047D2F8BD +:100E5000F800B2F858108288891A09B20029A8BF90 +:100E600003707047B2F85800B2F80211401A00B28D +:100E70000028E1DA70472DE9F041AE4C0026032747 +:100E8000D4F808C0012590B12069C0788CF8CA0058 +:100E900005FA00F010F4000F08BFFFDFA06880F82B +:100EA0006470A0F8846080F88850BDE8F081002369 +:100EB0009CF8652019460CF15800FBF7CEFB002882 +:100EC00004BF6570BDE8F0816078002818BFBDE8F8 +:100ED000F0812069C178A06880F8C91080F8657039 +:100EE000A0F88A6080F88C50BDE8F08170B5914C14 +:100EF00084B0207910F0010F04BF04B070BD2069E8 +:100F000000230521C578A06890F864205830FBF7CD +:100F1000A4FB002818BF062D09D020DC022D1CBF21 +:100F2000042D052D03D0607840F0080060706078D3 +:100F300000281CBF04B070BD2069C078801E162830 +:100F400080F00783DFE800F011FF89A7D52CFFFEB2 +:100F5000FF7FFDD2FFFFFFC5FCFBFAF9F8F50B2D73 +:100F60001CBF0D2D112DDED1E1E7A068002301216A +:100F700090F867205830FBF770FB002840F05C8346 +:100F80002069FCF759F8A16881F8F600072081F87C +:100F90006700002081F88C0081F8880000F04CBBCD +:100FA000A0680921002390F864205830FBF755FB16 +:100FB00018B120690079122812D0A0680A210023F4 +:100FC00090F864205830FBF748FB18B1206900798D +:100FD000142820D020690079162840F02D8324E0C1 +:100FE000A0680125002390F8642009215830FBF700 +:100FF00034FB002808BF657000F01E83607800286D +:1010000040F01A83A16881F87C0081F8880081F89B +:10101000640000F011BBA168002081F86400A1F811 +:10102000840081F8880000F035BAA06890F8641058 +:101030001F2940F00183002180F8641080F8881097 +:101040001A2000F0F7BAA06890F864100F2927D191 +:10105000002180F86910122137E0A06890F8641030 +:1010600013291DD1D0F8F81000884988814218BF93 +:10107000FFDFA068D0F8F80000F126012069FCF736 +:1010800008F8A06800F1C4012069FCF70AF81620EE +:10109000A16800F05BB9A26892F86400162802D03B +:1010A000022000F03BBAD2F8F80002F1B00300F1E0 +:1010B0001E0100220E30FBF74CFAA0680021C0E9A7 +:1010C0002811012180F86910182180F8641000F0BF +:1010D000B3BA2069FCF765F8032840F0AD822069B7 +:1010E000FCF763F801F0D0FB00F0A6BA20690079A4 +:1010F000F8E7A06890F864101A29D1D1002580F88B +:101100008D5080F88850D0F8F810008849888142C6 +:1011100018BFFFDFA068D0F8F8100D70D0F84411A8 +:101120000A78002A18BFFFDF7ED190F88E20DAB14E +:101130000AE03CE27C010020B6E181E125E1F1E03A +:1011400008E12BE09EE0A9E180F88E500288CA8079 +:10115000D0F844110D71D0F844210E211170D0F84F +:1011600044210188518010E00288CA80D0F84411DF +:101170000D71D0F8442101211172D0F844210D21C4 +:101180001170D0F84421018851800088EFF742FDAA +:10119000EFF7DAF9E078EAF7F9FDBEE0A06800239E +:1011A000194690F865205830FBF757FA50B9A068F7 +:1011B0000023082190F864205830FBF74EFA0028ED +:1011C00000F0FA816078002840F03682A06890F83C +:1011D000900010F0020F14D12069FBF765FFA168A1 +:1011E00081F891002069B0F80520A1F89220B0F8AC +:1011F0000700A1F8940091F8900040F0020081F8F7 +:101200009000A06890F8901011F0010F14D190F8A0 +:101210006520002319465830FBF71FFA002808BF45 +:10122000FFDF0121A06800E077E080F8651080F81A +:101230008C100021A0F88A10A06890F86410012991 +:1012400007D1002180F8641080F88810E078EAF770 +:101250009DFDA168D1F8F800098842888A4204BF40 +:101260000178042940F0E88100250570E078EAF76C +:101270008DFDA06890F86410002908BF80F88850A0 +:1012800000F0DAB9A0680023072190F864205830F4 +:10129000FBF7E3F9002800F08F816078002840F028 +:1012A000CB8102A92069FBF739FF9DF808000025D2 +:1012B00000F02501A06880F896109DF8091001F053 +:1012C000410180F8971080F88850D0F8F810008815 +:1012D0004988814218BFFFDFA068D0F8F8100D7070 +:1012E000D0F844110A78002A18BFFFDF15D1028810 +:1012F000CA80D0F844110D71D0F84411029A8A6066 +:10130000039ACA60D0F84421082111700188D0F8EE +:1013100044014180E078EAF739FDA06880F8645024 +:1013200000F08AB9A0680023092190F864205830A1 +:10133000FBF793F9002800F03F816078002840F027 +:101340007B81A16881F87C0081F8880081F86400C5 +:1013500000F072B9A0680023194690F86520583053 +:10136000FBF77BF9002800F027816078002840F027 +:101370006381A0680021A0F88A10012180F88C10F8 +:10138000022180F8651000F057B9A06800231946C3 +:1013900090F865205830FBF760F900287FD020696D +:1013A000FBF7A6FE002879D0A5682069FBF79CFE14 +:1013B0002887A5682069FBF793FE6887A5682069E0 +:1013C000FBF794FEA887A5682069FBF78BFEE887EA +:1013D000A06890F864101C2913BF90F84E100121EA +:1013E00080F84E10012907D090F80511002904BF9C +:1013F00090F80411002903D01E2180F8651017E031 +:101400001D2180F865100288A0F82A21028FA0F81B +:101410002C21428FA0F82E21828F00F58A71A0F82E +:101420003021C08FC88301200875E078EAF7AEFC50 +:10143000A0680021A0F88A10012180F88C10FBE040 +:10144000A06800230A2190F864205830FBF705F9C2 +:1014500018B32069FBF74CFEA8B1A5682069FBF71B +:1014600043FE2887A5682069FBF73AFE6887A568D0 +:101470002069FBF73BFEA887A5682069FBF732FED1 +:10148000E88700F0FEFEA168002081F8880081F85E +:10149000640000BF00F0C6FECEE000E059E06078D6 +:1014A00040F001006070C7E0A0680023194690F882 +:1014B00065205830FBF7D1F878B3A06890F8640045 +:1014C000232812BF2428607840F0200026D06846E8 +:1014D000F4F747F9002808BF002104D0009802A9BA +:1014E000C0788DF80800A06801AB162290F864005F +:1014F000FBF767FAA0B1A0689DF80420162180F8D8 +:10150000EC2080F8ED10192180F86510012180F899 +:101510008C100021A0F88A108EE04DE060708BE006 +:101520002069FBF700FEA0B12269107900F00701E5 +:10153000A06880F85010527902F0070280F851201C +:1015400090F80F31002B04BF90F80E31002B04D01F +:1015500022E00020FFF78FFC6EE090F855C000F10C +:1015600054038C4501BF19789142012180F87D1008 +:1015700012D00288A0F8362190F8502000F58A7128 +:1015800080F8382190F8510081F82500012081F879 +:101590002000E078EAF7FAFBA068212180F86510C6 +:1015A000012180F88C100021A0F88A1044E0A06886 +:1015B00090F864001F2801D00120AFE72069FBF7F5 +:1015C000BCFD88B32069A2680179407901F0070168 +:1015D00061F30705294600F0070060F30F210120A1 +:1015E00082F888000025A2F88450232082F8640045 +:1015F000566DD2F81001FBF79CF9F2B2C1B28A42E3 +:1016000007BFA16881F8F250A26882F8F210C6F311 +:101610000721C0F30720814219BFA16881F8F300B8 +:10162000A06880F8F35007E0FFE70120FFF723FCF4 +:101630005FF01E00FFF7ADFBA068D0E92A12491C3D +:1016400042F10002C0E92A1204B070BD2DE9F04752 +:10165000FE4D04464FF0000768780843687028790B +:1016600010F0200F2846806818BFA0F87E7004D1C3 +:10167000B0F87E10491CA0F87E1090F86A10012680 +:1016800039B990F86420002306215830FAF7E5FFB5 +:1016900058B3A88810F4006F07D0A86890F86A10B3 +:1016A000002918BFA0F876701FD1A868B0F876108E +:1016B000491C89B2A0F87610B0F878208A422CBF75 +:1016C000511A00218288521D8A4228BF80F87C600E +:1016D000B0F87610B0F87820914206D3A0F8767072 +:1016E00080F81A61E878EAF751FB287910F0600F6A +:1016F00008D0A86890F8681021B980F868600121C6 +:10170000FFF749F84FF00808002C56D168780028F8 +:1017100051D1287910F0040F0DD0A86890F864001A +:10172000032808BFFFDFA86890F86710072904BFE7 +:101730002E7080F8677001F0F7F8287910F0080F24 +:1017400019D06878B8B9A868002190F8CB00FFF7E5 +:101750004DFBA86890F8CB00FE2808BFFFDFFE21F4 +:10176000A86880F8CB1090F86710082903D10221EF +:10177000297080F86770FFF7B9FBA87810F0080FA0 +:1017800016D0A8680023052190F864205830FAF795 +:1017900064FF50B185F80180A868D0F8441108783A +:1017A0000D2808BF0020087002E00020F9F770FB48 +:1017B000A86800F0F2FF00F0AEFDA868A14600F1B5 +:1017C000580490F8F40030B9E27B00230121204650 +:1017D000FAF743FF10B1608D401C60853D21B9F1DF +:1017E000000F18D12878022808BF16200ED0012833 +:1017F00004BFA86890F8F60008D06878E8B110F047 +:10180000140F1CBF1E20207702D005E0207703E0D4 +:1018100010F0080F02D02177E67641E010F0030FB8 +:1018200003D02A202077E6763AE010F0200F08BF98 +:10183000FFDF23202077E67632E094F8300028B1ED +:10184000A08D411CA185E18D884213D294F834000B +:1018500028B1608E411C6186E18D88420AD2618D7B +:10186000208D814203D3AA6892F8F42012B9E28D48 +:10187000914203D322202077E67611E0217C31B11A +:10188000E18C814228BF84F81C80C5D206E0E08C40 +:10189000062803D33E202077E67601E0E07EA0B163 +:1018A0002773677327740221A868FEF774FFA8687E +:1018B00090F8CB10012904D1D0F8FC000178491E22 +:1018C0000170E878EAF762FA03E00021A868FEF701 +:1018D00062FFBDE8F047F3F753BF5C4A5178937855 +:1018E000194314D111460128896809D0107910F0E4 +:1018F000040F03D091F86700072808D00120704733 +:10190000B1F84800098E884201D8FEF730BF0020A8 +:10191000704770B54D4C06460D46A0883043A080F8 +:1019200016F0020F04D016F0010F18BFFFDFE560BC +:1019300016F0010F18BF256116F0020F10D0E878DD +:10194000062802D00B2837D00AE0A06890F864106F +:10195000182905D10021C0E92A11012180F86A1057 +:1019600016F0800F1CBF0820A07016F4806F08BF0F +:1019700070BDA268B2F8580091880844801DE978CB +:1019800080B2012908BFA2F8020107D0002904BFD4 +:10199000D2F8F810888001D0182915D0E9782846A7 +:1019A00001291CD009B3182918BF70BDB2F8F01076 +:1019B000BDE87040FBF7D3BBA06890F86410122913 +:1019C00008BF0021CCD1C9E792F8F210002902BF6C +:1019D00092F8F31000290020A2F8F000DEE7B2F838 +:1019E00002114172090AA97270BDD2F8F8108988F3 +:1019F0004173090AA97370BDF0B5144C85B0002677 +:101A0000A060A6806670A670054626700088F3F771 +:101A10007FFEA0680088F3F7A1FEB5F8D800A168A2 +:101A2000401C82B201F15800FAF718FC002818BFD8 +:101A3000FFDF95F8650024280ED1B5F85810B5F8E9 +:101A4000F000081A00B2002802E000007C0100202B +:101A5000A4BF6078002806D095F86400242818BF39 +:101A600025283BD119E0A06890F8F210002908BFA2 +:101A700090F8541080F8541090F8F310002908BF23 +:101A800090F8551080F855100020FFF782F985F87E +:101A90006560A16881F87D6020E0B5F85810B5F860 +:101AA000F000081A00B20028A4BF6078002815D101 +:101AB000A06890F8F210002908BF90F8541080F840 +:101AC000541090F8F310002908BF90F8551080F8D2 +:101AD00055100020FFF75DF985F86460A5F8D8601F +:101AE000A06890F8881039B1B0F88410B0F886205A +:101AF000914224BF05B0F0BD90F88C1039B1B0F818 +:101B00008A10B0F88620914224BF05B0F0BDB0F82D +:101B10008220B0F880108A4224BF05B0F0BD90F852 +:101B200068208AB3B0F87E208A4224BF05B0F0BD99 +:101B300090F8CB70FE2F00F012816846F3F7EBFDB2 +:101B4000002808BFFFDF2221009802F0B0FB03212C +:101B50000098FBF7EDF90098017821F01001017071 +:101B60003946FBF713FA192F71D2DFE807F0271F68 +:101B70001445D6D6D71971D6D7D763D6D6D6D6C9F7 +:101B8000D7D77B94ADD6B600B0F87E10062924BF17 +:101B900005B0F0BDCCE7A168009891F8F51003E01E +:101BA000A168009891F8CC100171B7E0A068D0F856 +:101BB000FC00411C0098FBF734FAAFE0A1680098E4 +:101BC000D1F8F82092790271D1F8F8201289427187 +:101BD000120A8271D1F8F8205289C271120A027277 +:101BE000D1F8F82092894272120A8272D1F8F81064 +:101BF000C989FBF7EEF991E0A068D0F8F800011D63 +:101C00000098FBF71BFAA068D0F8F80000F10C016F +:101C10000098FBF71DFAA068D0F8F80000F11E014B +:101C20000098FBF71BFAA06800F1C0010098FBF7D1 +:101C300023FA73E06269009811780171918841710B +:101C4000090A81715188C171090A017266E064E074 +:101C5000FD49D1E90001CDE9020102A90098FBF795 +:101C600025FA5BE0A068B0F844100098FBF728FA6A +:101C7000A068B0F846100098FBF726FAA068B0F804 +:101C800040100098FBF724FAA068B0F842100098C2 +:101C9000FBF722FA42E0A068B0F840100098FBF78A +:101CA00017FAA068B0F842100098FBF715FAA06880 +:101CB000B0F844100098FBF703FAA068B0F846109B +:101CC0000098FBF701FA29E0A168009891F810212B +:101CD000027191F81111417120E0A06890F8F300B1 +:101CE000FAF722FE01460098FBF735FAA06890F853 +:101CF000F200FAF719FE01460098FBF728FA0DE00A +:101D0000A06890F8ED100098FBF749FAA06890F8E9 +:101D1000EC100098FBF747FA00E0FFDFF3F70EFD49 +:101D2000002808BFFFDF0098C178012903D049B11E +:101D300018290FD013E0A168B1F802114172090A05 +:101D400081720CE0A168D1F8F81089884173090A02 +:101D5000817304E0A168B1F8F010FBF700FABB480A +:101D60000090BB4BBB4A29463046F8F7CDFFA06830 +:101D70000023052190F864205830FAF76EFC002803 +:101D800004BF05B0F0BD05B0BDE8F040F8F7C5BD33 +:101D9000B148806890F8881029B1B0F88410B0F884 +:101DA000862091421AD290F88C1029B1B0F88A108E +:101DB000B0F88620914211D2B0F88220B0F880109D +:101DC0008A420BD290F86820B0F87E0022B1884297 +:101DD00004D200BFF9F738B80628FBD3002001462B +:101DE00034E470B50C46064615464FF4A4712046FF +:101DF00002F07FFA2680002D08BFFFDF2868C4F8B4 +:101E0000F8006868C4F8FC00A868C4F8440170BD14 +:101E1000EEF7D7BE2DE9F0410D4607460621EEF755 +:101E2000C7FD040008BFBDE8F081D4F844110026C6 +:101E3000087858B14A8821888A4207D1092810D0E9 +:101E40000E281DD00D2832D008284CD094F81A0145 +:101E5000002857D06E701020287084F81A61AF8067 +:101E60003EE06E7009202870D4F844014168696032 +:101E70008168A9608089A881D4F8440106702FE0A8 +:101E80000846EEF7C7FE0746EEF773FBB0B96E7073 +:101E90000E202870D4F8440140686860D4F84401EA +:101EA00006703846EEF75FFB0120BDE8F08108467A +:101EB000EEF7B0FE0746EEF75CFB10B10020BDE880 +:101EC000F0816E700D202870D4F84401416869607B +:101ED00000892881D4F8440106703846EEF743FBA8 +:101EE0000120BDE8F0816E7008202870D4F844010C +:101EF00041688268C0686960AA60E860D4F84401FB +:101F00000670EDE794F81C01B0B16E7015202870D2 +:101F100094F81C010028E3D084F81C61D4F81E0159 +:101F20006860D4F82201A860B4F82601A88194F86A +:101F30001C010028F0D1D3E794F8280170B16E702D +:101F40001D20287084F82861D4F82A016860D4F82C +:101F50002E01A860B4F83201A881C1E794F83401D9 +:101F600040B16E701E20287084F83461D4F83601B8 +:101F70006860B5E794F8140180B16E701B2028707A +:101F800094F814010028ABD084F81461D4F8160139 +:101F9000686094F814010028F6D1A1E794F83A019A +:101FA000002808BFBDE8F0816E701620287094F8F4 +:101FB0003A01002894D000BF84F83A61D4F83C017B +:101FC0006860B4F84001288194F83A010028F3D100 +:101FD00086E7214A5061D17070472DE9F0470446E9 +:101FE000481E85B238BFBDE8F08704F10808012615 +:101FF000DFF864904FF0090A5FF00007B4F8D800EA +:10200000401CA4F8D800B4F87E00401CA4F87E0060 +:1020100094F86A0040B994F864200023062104F182 +:102020005800FAF71AFB30B3B4F87600401C80B2BF +:10203000A4F87600B4F8781081422CBF0A1A002266 +:10204000A3885B1D934209E0F44802004D1602008C +:10205000DB180200131902007C01002028BF84F85D +:102060007C60884207D3A4F8767084F81A6199F8E6 +:102070000300E9F78BFE94F8880020B1B4F88400DF +:10208000401CA4F8840094F88C0020B1B4F88A00B5 +:10209000401CA4F88A0094F8F40040B994F8672032 +:1020A0000023012104F15800FAF7D7FA20B1B4F85F +:1020B0008200401CA4F8820094F864000C2802D02E +:1020C0000D2820D067E0B4F85800411CB4F8020194 +:1020D000814260D1D4F8FC00411C404602F01EFA57 +:1020E00002212046F9F7DDFFD4F8FC000078002833 +:1020F00008BFFFDF0121FE20FEF778FE84F8647040 +:1021000084F8986047E0B4F85800411CD4F8F8000F +:10211000808881423FD1D4F844010178002918BF5A +:10212000FFDF22D12188C180D4F8F8004189D4F89A +:1021300044010181D4F8F8008189D4F84401418137 +:10214000D4F8F800C189D4F844018181D4F844015D +:102150000771D4F8440180F800A0D4F84401218824 +:10216000418099F80300E9F711FE01212046F9F7B3 +:1021700098FF03212046FEF70EFBD9F80800D0F89F +:10218000F8000078022818BFFFDF0221FE20FEF7CA +:102190002DFE84F86470B4F85800401C691EA4F841 +:1021A00058008DB2BFF42AAFBDE8F087F84AC2E903 +:1021B0000601704770B50446B0F87E0094F86810C8 +:1021C000002908BFC0F1020503D0B4F88010081A36 +:1021D000051F94F87C0040B194F864200023092185 +:1021E00004F15800FAF739FAA0B1B4F8766094F81F +:1021F0006A0058B994F864200023062104F15800BD +:10220000FAF72BFA002808BF284603D0B4F8780064 +:10221000801B001F8542C8BF0546002DD4BF00208B +:10222000A8B270BD042110B5D94CA068FEF7B3FA6E +:10223000A06890F84E10012902BF022180F84E10CC +:1022400010BD00F58A710288A0F81E21028EA0F848 +:102250002021828EA0F82221028FB0F844309A42C9 +:1022600028BF1A460A82828FB0F84600824238BFE1 +:102270001046488201200872E078BDE81040E9F776 +:1022800085BDC34830B4806890F84E30B0F832C095 +:10229000C48EB0F84010428F022B25D08A4238BF3E +:1022A00011460186C28FB0F842108A4238BF1146EB +:1022B0008186028FB0F844108A4238BF11464186A9 +:1022C000828FB0F846108A4238BF1146C186418ECF +:1022D000614588BF8C46A0F832C0C18EA14288BF3C +:1022E0000C46C48630BC7047038E9A4228BF1A46FB +:1022F000C58F838E9D4238BF2B468A4238BF114618 +:102300000186B0F842108B4228BF0B46838600211D +:1023100080F84E10CDE770B59D4CA06890F8CB10BA +:10232000FE2906BF6178002970BD90F86720002360 +:1023300001215830FAF791F9002818BF70BDA06844 +:1023400090F8F41021B1BDE870400220FEF702BD04 +:1023500090F86420002319465830FAF77EF940B10E +:10236000A06890F87C0020B1BDE870401220FEF714 +:10237000F1BCA068002590F86420122A1FD004DC6C +:10238000032A3FD0112A1FD003E0182A35D0232A70 +:1023900043D0002304215830FAF75FF9002818BF12 +:1023A00070BDD4F808C09CF8650019287CD03BDCCF +:1023B00001286BD0022879D003285DD038E0BDE831 +:1023C00070400B20FEF7C6BCF1F760FC0C2838BF4C +:1023D00070BDA0680821D0F8F8001E30F1F75AFC53 +:1023E00028B1A0680421C030F1F754FC00B9FFDF28 +:1023F000BDE870400320FEF7ADBCBDE8704006208C +:10240000FEF7A8BC90F8CA1080F8CC100720FEF7A1 +:10241000A1FCA06880F8645070BD1820FEF79AFCFB +:10242000A068A0F8845070BD1E2847D021286BD02A +:10243000DCF8F80001260178002973D04088BCF848 +:10244000001088426ED100239CF8642019460CF1DC +:102450005800FAF702F9002864D0A068D0F8F81004 +:10246000097802297ED003297DD004297CD0052952 +:1024700008BF082079D0C7E09CF8C9008CF8CC00D0 +:102480000720FEF767FCA06800F06DB90C20FEF78E +:1024900061FCA068A0F88A5090F8901041F001010A +:1024A00080F8901000F05FB96DE0FFE71320FEF7B1 +:1024B00051FCA068A0F88A5000F055B99CF80501BD +:1024C000002818BF70BD9CF8040188B1BCF8060153 +:1024D000ACF84000BCF80801ACF84200BCF80A01B6 +:1024E000ACF84400BCF80C01ACF846008CF8045180 +:1024F000FFF7C7FEFFF796FE1520FEF72BFCA0683E +:10250000A0F88A5000F02FB99CF87D0058B18CF8E3 +:10251000F2508CF8F3501820FEF71CFCA068A0F8CD +:102520008A5070BD70E09CF80F01002818BF70BD84 +:102530009CF80E01002808BF70BDDCE91416DCF819 +:102540001001FAF7F6F9F2B2C1B28A4207BFA168E8 +:1025500081F8F250A26882F8F210C6F30721C0F3A6 +:10256000072003E016E01BE03BE022E0814219BFB8 +:10257000A16881F8F300A06880F8F3501820BDE846 +:102580007040FEF7E7BB1120FEF7E4FBA068EAE02D +:102590007C01002090F86500FAF748F8A0BB08E03D +:1025A00090F8691041B190F86A00002808BFFFDF79 +:1025B0000A20FEF7CFFB27E0F1F768FB0C2823D3B6 +:1025C000A0680821D0F8F8001E30F1F763FB28B1AD +:1025D000A0680421C030F1F75DFB00B9FFDF0320E4 +:1025E000E7E790F8900010F0030F0DD10C20FEF7F4 +:1025F000B1FBA068A0F8845080F8886090F8901033 +:1026000041F0010180F89010A06890F8CB10FE29ED +:1026100018BF70BD90F86420002319465830FAF7AF +:102620001CF8002808BF70BDA06890F80011E9B33D +:10263000A1690978D1BB90F86500F9F7F7FFA8BB4D +:10264000A068B0F858100A2931D900F10801052214 +:10265000E06901F081FD0028A06804BF80F8005106 +:1026600070BDD0F8FC00017861B1411C0522E06921 +:1026700001F072FD002818BF70BDA068D0F8FC0002 +:10268000007830B9A068E169D0F8FC00401C01F086 +:1026900045FFA068D0F8FC000178491C01700120BA +:1026A000FEF758FBA06880F8005170BDFFE7A068F6 +:1026B00090F8041111B190F8051181B390F80E1142 +:1026C000002908BF70BD90F80F11002918BF70BD18 +:1026D00090F86500F9F7AAFF002818BF70BDA06840 +:1026E00090F85400012808BF012503D0022814BF28 +:1026F000FFDF0225A06890F85500012808BF0126D9 +:1027000003D0022814BFFFDF0226A168012D91F833 +:1027100010012BD0022D08BF022829D033E0FFE79B +:10272000B0F80611A0F84010B0F80811A0F8421057 +:10273000B0F80A11A0F84410B0F80C11A0F8461037 +:1027400080F8045190F865001D2804D0BDE8704061 +:102750001420FEF7FFBAFFF794FDFFF763FD152085 +:10276000FEF7F8FAA06880F8655070BD01280AD11C +:1027700091F81101012E04D0022E08BF022807D0C3 +:1027800001E0012804D0BDE870401620FEF7E2BA4F +:10279000BDE870400020FEF7FCBA70B5044690F822 +:1027A000640000250C2814D00D2818BF70BDB4F8A3 +:1027B0005800D4F8F810401C8988884218BF70BDB2 +:1027C000D4F84401FE4E0178002918BFFFDF45D13F +:1027D00022E0B4F85800B4F80211401C884218BF37 +:1027E00070BDD4F8FC00411C04F1080001F096FE15 +:1027F00002212046F9F755FCD4F8FC0000780028A7 +:1028000008BFFFDF0121FE20FEF7F0FA84F86450D4 +:10281000012084F8980070BD2188C180D4F8F800A8 +:10282000D4F8441140890881D4F8F800D4F8441150 +:1028300080894881D4F8F800D4F84411C08988818F +:10284000D4F844010571D4F8441109200870D4F873 +:10285000441120884880F078E9F798FA0121204651 +:10286000F9F71FFC03212046FDF795FFB068D0F86B +:10287000F8000078022818BFFFDF0221FE20FEF7D3 +:10288000B5FA84F8645070BD70B5CD4CA16891F86C +:102890006420162A11BF132A91F88E20002A62782C +:1028A0001BBF02206070002A70BD81F8C80000259F +:1028B00081F88D5081F88850D1F8F8000988408857 +:1028C000884218BFFFDFA068D0F8F800007803281E +:1028D00018BFFFDF0321FE20FEF788FAA068D0F8BA +:1028E00044110A78002A18BFFFDF19D10288CA8074 +:1028F000D0F8442190F8C8101171D0F844110D722D +:10290000D0F844210D211170D0F844210188518064 +:102910000088EEF77FF9EDF717FEE078E9F736FA71 +:10292000A06880F8645070BD10B5A54C207910F0F7 +:10293000020F08BF10BD6078002818BF10BDE06806 +:10294000C078192880F06981DFE800F05F4F0D8FB3 +:10295000F8F8A6223FF86F83B1F8F8F8F8F7E3E04B +:10296000F9F5F4F8F300A0680023012190F867203E +:102970005830F9F772FE002818BF10BD0821A06872 +:1029800080F86710002180F8881080F88C1010BD46 +:10299000A0680023194690F865205830F9F75DFECD +:1029A00018B1A168002081F88C00A06800231946A6 +:1029B00090F864205830F9F750FE002808BF10BD89 +:1029C0000020A16881F8880010BDA0680023194686 +:1029D00090F864205830F9F740FE002808BFFFDF68 +:1029E0000420A16881F8640010BDA0680023194686 +:1029F00090F864205830F9F730FE002808BFFFDF58 +:102A00000C20A16881F8640010BDA068002319465D +:102A100090F864205830F9F720FE002808BFFFDF47 +:102A20000D20A16881F8640010BDA068002319463C +:102A300090F864205830F9F710FE002808BFFFDF37 +:102A40000121A06880F88D105FF00F0180F86410FC +:102A500010BDA06890F86400122818BFFFDF0121A4 +:102A6000A06880F88E101121F0E7A06800231946B5 +:102A700090F864205830F9F7F0FD28B9A06890F874 +:102A80008E00002808BFFFDF0121A06880F88D10AC +:102A9000132180F8641010BDA06890F86400182815 +:102AA00018BFFFDF1A20A16881F8640010BDA0687C +:102AB000D0F8F81003884A889A4204BF097804299C +:102AC00019D190F86420002319465830F9F7C5FD54 +:102AD000002808BFFFDFA06890F8901011F0020FE7 +:102AE00004BF012180F8641005D0002180F888100F +:102AF000D0F8F8000170A0680023194690F865200E +:102B00005830F9F7AAFD002808BF10BD0020A168C1 +:102B100080E0A0680023194690F864205830F9F747 +:102B20009CFD002808BFFFDF0520A16881F8640034 +:102B300010BD30E01FE012E001E067E06DE0A0684A +:102B40000023194690F864205830F9F786FD0028D4 +:102B500008BFFFDF1C20A16881F86400E8E7A068D7 +:102B60000023194690F865205830F9F776FD0028C3 +:102B700008BFFFDFCAE7A0680023194690F8642069 +:102B80005830F9F76AFD002808BFFFDF1F20A16851 +:102B900081F86400CCE7A06890F8651021291DD069 +:102BA00090F86410232918BFFFDFC1D190F8F2100C +:102BB000002906BF90F8F3100029242102E000004C +:102BC0007C01002018BF80F864107FF4F9AE00216A +:102BD00080F864100846FEF7DCF8F1E690F8F21091 +:102BE000002907BF90F8F3100029242180F8651010 +:102BF0008CD1002180F8651080F87D1090F80E01CE +:102C000000281CBF0020FEF7C4F87FE7A168002061 +:102C100081F8650081F88C008AE7FFDF88E7000013 +:102C200070B58D4C0829207A63D2DFE801F0041AD0 +:102C30005A5A2662625A80B1F1F7EDFD012211461F +:102C40001046F1F7F0FFF2F7FDFC0020A072F1F75B +:102C5000A1FEBDE87040F2F76EB9BDE87040EFF735 +:102C6000E3BED4E90001EFF7DCFC2060A07A401C51 +:102C7000C0B2A07228281CD370BDA07A0025401EC7 +:102C8000C6B2E0683044F2F748FA10B9E1687F2034 +:102C90008855A07A272828BF01252846F2F782FC0C +:102CA000A07A282809D2401CC0B2A072282828BFC8 +:102CB00070BDBDE87040F1F76DBE207A00281CBFE2 +:102CC000012000F085F8F2F7C3F8F2F72CF90120A3 +:102CD000E07262480078E9F759F8BDE87040EFF714 +:102CE000A3BE002808BF70BD0020BDE8704000F002 +:102CF0006FB8FFDF70BD10B5574C207A002804BFB5 +:102D00000C2010BD00202072E072607AF0F7DAFA31 +:102D1000607AF0F724FD607AEFF75BFF00280CBFC4 +:102D20001F20002010BD002270B54B4C06460D46FA +:102D3000207A68B12272E272607AF0F7C3FA607AA0 +:102D4000F0F70DFD607AEFF744FF002808BFFFDFC2 +:102D50004248E560067070BD70B5050007D0A5F566 +:102D6000E8503F494C3881429CBF122070BD3A4C1C +:102D7000E068002804BF092070BD207A00281CBF2D +:102D80000C2070BD3748EFF7CAFE6072202804BFE0 +:102D90001F2070BDEFF73CFF2060002D1CBF2844B2 +:102DA0002060012065602072002000F011F80020F2 +:102DB00070BD2949CA7A002A04BF002070471F222B +:102DC000027000224270CB684360CA7201207047D3 +:102DD0002DE9F04184B00746EFF71AFF1E4D8046FB +:102DE000414668682C6800EB800046002046F0F7FA +:102DF0001DFCB04206DB6868811B4046EFF711FC02 +:102E00000446286040F2337621464046F0F70EFC37 +:102E1000B04204DA31464046EFF703FC0446002096 +:102E20008DF8000040F2E760039004208DF8050063 +:102E3000002F14BF012003208DF80400684602947F +:102E4000F0F7B3F8687A6946F0F72AF9002808BF66 +:102E5000FFDF04B0BDE8F081AC1200209C0100202F +:102E6000B5EB3C00212C02002DE9F0410C46124943 +:102E70000D68114A114908321160A0F12001312971 +:102E800001D301200CE0412810D040CC0C4F94E835 +:102E90000E0007EB8000241F50F8807C3046B847B6 +:102EA00020600548001D0560BDE8F0812046DEF782 +:102EB00097F9F5E706207047100502400100000170 +:102EC000FC48020010B5524800F038FA00B1FFDFAC +:102ED0004F48401C00F032FA002800D0FFDF10BD40 +:102EE0002DE9F14F4B4ED6F800B00127484800F0CD +:102EF0002DFADFF81C8128B95FF0000708F1010006 +:102F000000F03AFA444C00254FF0030901206060BC +:102F1000C4F80051C4F80451009931602060DFF812 +:102F2000FCA018E0DAF80000C00614D50E2000F06E +:102F300064F8EFF3108010F0010072B600D00120A9 +:102F4000C4F80493D4F8001119B9D4F8041101B9E4 +:102F500020BF00B962B6D4F8000118B9D4F8040152 +:102F60000028DFD0D4F804010028CFD137B1C6F84B +:102F700000B008F1010000F0E9F911E008F10100EA +:102F800000F0E4F90028B9D1C4F80893C4F804515A +:102F9000C4F800510E2000F030F81D4800F0ECF9A4 +:102FA0000020BDE8F88F2DE9F0438DB00D460646B0 +:102FB00000240DF110090DF1200817E004EB44077F +:102FC000102255F82710684601F0F2F805EB870744 +:102FD00010224846796801F0EBF86846FFF780FF59 +:102FE00010224146B86801F0E3F8641CB442E5DB06 +:102FF0000DB00020BDE8F08372E700F01F02012150 +:1030000091404009800000F1E020C0F88012704734 +:103010009D01002004E5004000E0004010ED00E0CC +:10302000AA4900200870704770B5A94D01232B6094 +:10303000A84B1C68002CFCD0002407E00E6806603A +:103040001E68002EFCD0001D091D641C9442F5D39F +:103050000020286018680028FCD070BD70B59B4E19 +:1030600004469D4D3078022800D0FFDFAC4200D3EB +:10307000FFDF71699948012903D847F23052944221 +:1030800001DD03224271491C7161291BC160934912 +:103090007078F0F705F8002800D1FFDF70BD70B53B +:1030A0008A4C0D466178884200D0FFDF8A4E082D99 +:1030B0004BD2DFE805F04A041E2D4A4A4A382078F0 +:1030C000022800D0FFDF03202070A078012801D063 +:1030D00020B108E0A06800F0B7FD04E004F10800AA +:1030E00007C8FFF7A1FF05202070BDE87040EFF78B +:1030F0009BBCEFF78DFD01466068F0F797FAB04290 +:1031000002D2616902290BD30320F0F74CFD12E0D3 +:10311000EFF77EFD01466068F0F788FAB042F3D21F +:10312000BDE870409AE7207802280AD0052806D02A +:10313000FFDF04202070BDE8704000F0BDB8022021 +:1031400000E00320F0F72FFDF3E7FFDF70BD70B55F +:103150000546EFF75DFD5D4C60602078012800D0EA +:10316000FFDF5E49012008700020087104208D6097 +:1031700048715948C860022020706078EFF790FFCE +:10318000002800D1FFDF70BD10B5504C207838B951 +:103190000220F0F71EFD18B90320F0F71AFD08B160 +:1031A000112010BD4E48EFF7BAFC6070202804D003 +:1031B000012020700020606110BD032010BD2DE9AA +:1031C000F041144600EB84070E4605463F1F00F011 +:1031D0004EFD4FF080521169484306EB8401091FF0 +:1031E000B14201D2012100E000211CB11269B4EB0F +:1031F000920F02D90920BDE8F0813A4A95420ED3D8 +:10320000AF420CD3854205D2874203D245EA06007D +:10321000800701D01020EEE7964200D309B10F20BD +:10322000E9E7314831490068884205D022463146F5 +:103230002846FFF7F9FE10E0FFF7A6FF0028DAD1D5 +:10324000224800218560C0E9036481704FF4A971B0 +:1032500004FB01F01830FFF77AFF0020CBE770B5D0 +:103260004FF08055044628691E49B1FBF0F08442B6 +:1032700001D20F2070BD00F0FAFCA04201D810204E +:1032800070BD194819490068884204D02869604314 +:1032900000F0DAFC0CE0FFF777FF0028F0D1296995 +:1032A0000A4861438160012181701148FFF74FFF97 +:1032B000002070BD00F024BF10B5044C6078EFF71B +:1032C00088FC00B9FFDF0020207010BDA0010020A5 +:1032D00004E5014000E40140105C0C00BC12002039 +:1032E0009F30020000600200B0000020BEBAFECA9B +:1032F0007C5E01004FF08050D0F83011062903D0D9 +:10330000D0F83011491C07D1D0F83411062905D363 +:10331000D0F83401401C01D00020704701207047D4 +:103320004FF08050D0F83011062905D1D0F8340183 +:10333000062801D30120704700207047002101704A +:10334000084670470146002008707047EFF310816F +:1033500001F0010172B60278012A01D0012200E0D9 +:1033600000220123037001B962B60AB10020704740 +:103370004FF400507047E9E7EFF3108111F0010FAF +:1033800072B64FF00002027000D162B600207047A2 +:10339000F2E700004C4909680160002070474A4983 +:1033A00008600020704701218A0720B1012804D05D +:1033B00042F204007047916700E0D1670020704737 +:1033C00042490120086042F20600704708B5042314 +:1033D0003E4A1907103230B1C1F80433106840F08A +:1033E000010010600BE0106820F001001060C1F8CF +:1033F00008330020C1F8080135480068009000201B +:1034000008BD011F0B2909D8304910310A6822F084 +:103410001E0242EA400008600020704742F20500A8 +:103420007047000100F18040C0F804190020704787 +:10343000000100F18040C0F8081900207047000129 +:1034400000F18040D0F80009086000207047012892 +:1034500001D9072070471F4A52F8200002680A432A +:10346000026000207047012801D907207047194ADF +:1034700052F8200002688A43026000207047012849 +:1034800001D907207047134A52F8200000680860ED +:1034900000207047020010494FF0000003D0012ABD +:1034A00001D0072070470A6070474FF0804100202C +:1034B000C1F808014FF0E020802180F800140121BC +:1034C000C0F80011704700000004004000050040F3 +:1034D00008010040C0490200780500406249634B82 +:1034E0000A6863499A42096801D1C1F31001016079 +:1034F000002070475C495D4B0A685D49091D9A428E +:1035000001D1C0F310000860002070475649574BA6 +:103510000A68574908319A4201D1C0F31000086087 +:103520000020704730B5504B504D1C6842F20803E4 +:10353000AC4202D0142802D203E0112801D318466D +:1035400030BDC3004B481844C0F81015C0F814250E +:10355000002030BD4449454B0A6842F209019A42B5 +:1035600002D0062802D203E0042801D3084670479F +:10357000404A012142F83010002070473A493B4B45 +:103580000A6842F209019A4202D0062802D203E0F8 +:10359000042801D308467047364A012102EBC000D7 +:1035A00041600020704770B52F4A304E314C15688D +:1035B00042F2090304EB8002B54204D0062804D28B +:1035C000C2F8001807E0042801D3184670BDC1F303 +:1035D0001000C2F80008002070BD70B5224A234ECA +:1035E000244C156842F2090304EB8002B54204D072 +:1035F000062804D2D2F8000807E0042801D31846B0 +:1036000070BDD2F80008C0F310000860002070BD43 +:10361000174910B50831184808601120154A0021D3 +:1036200002EBC003C3F81015C3F81415401C14288E +:10363000F6D3002006E0042804D302EB8003C3F88D +:10364000001807E002EB8003D3F80048C4F310042D +:10365000C3F80048401C0628EDD310BD04490648B5 +:103660000831086070470000B0000020BEBAFECAF2 +:1036700000F5014000F001400000FEFF7E4B1B689A +:1036800003B19847BFF34F8F7C4801687C4A01F42F +:10369000E06111430160BFF34F8FFEE710B5EFF318 +:1036A000108010F0010F72B601D0012400E0002458 +:1036B00000F0D9F850B1DDF72DFEEFF776F8F0F70E +:1036C00013FADFF7A2FB6F490020086004B962B665 +:1036D000002010BD70B50C460546EFF3108010F0C9 +:1036E000010F72B601D0012600E0002600F0BBF801 +:1036F00018B106B962B6082070BDDDF787FDDDF7A9 +:103700000DFE0246002043099B0003F1E02300F078 +:103710001F01D3F80031CB40D9071BD0202803D29A +:1037200022FA00F1C90722D141B2002906DA01F0DC +:103730000F0101F1E02191F8141D03E001F1E021F6 +:1037400091F800144909082911D281B101290ED03C +:1037500004290CD0401C6428D5D3DFF72DFB494940 +:10376000494808602046F0F7D9FD60B904E006B981 +:1037700062B641F2010070BD3F4804602DB1284699 +:10378000F0F719FE18B110242CE0404D19E028780C +:10379000022802D94FF4805424E0072400286878D6 +:1037A00001D0F8B908E0E8B120281BD8A878212872 +:1037B00018D8012816D001E0A87898B9E8780B2825 +:1037C00010D83349802081F8140DDDF7A7FD294674 +:1037D000F0F770F9EEF7A8FF00F07CFA2846DDF765 +:1037E0006BFD044606B962B61CB1FFF757FF2046D1 +:1037F00070BD002070BD10B5044600F034F800B173 +:1038000001202070002010BD224908600020704770 +:1038100070B50C4620490D681F49204E08310E60D6 +:10382000102807D011280CD012280FD0132811D03F +:10383000012013E0D4E90001FFF74CFF354620607A +:103840000DE0FFF72BFF0025206008E02068FFF760 +:10385000D2FF03E00F4920680860002020600E4876 +:10386000001D056070BD074807490068884201D106 +:103870000120704700207047B80100200CED00E0E7 +:103880000400FA05B0000020BEBAFECAC849020012 +:103890000BE000E0040000201005024001000001E0 +:1038A00000B5C44910F1080F08BFF82024D014DC7B +:1038B00010F1280F08BFD8201ED010F1140F08BF38 +:1038C000EC2019D010F1100F08BFF02014D010F127 +:1038D0000C0F08BFF4200FD00CE010F1040F08BF4C +:1038E000FC2009D0002818BF032805D0042804BFF5 +:1038F000086000BDFFDF00BD086000BD00B5AE4937 +:10390000012808BF032004D0022816BFFFDF0420CF +:1039100000BD086000BDA949002804BF086820F068 +:10392000010005D0012806BF086840F0010070477B +:103930000860704770B51E460546012924D0022A4A +:1039400004BF9F484FF47A710DD0012A04BF9D48EF +:103950004FF4C86107D0042A07BF9B4840F698017E +:103960009A4840F6E44144181846F1F744FE0444EE +:103970003046F1F75EFE20444FF47A7100F2712078 +:10398000B0FBF1F0281A70BD022A08BF4FF47A701C +:103990000AD0012A08BF4FF4C86005D0042A0CBF22 +:1039A00040F6980040F6E44049F608514418DBE739 +:1039B00070B514460546012908BF49F6CA660DD000 +:1039C000022B08BF824807D0012B08BF7D4803D0D7 +:1039D000042B0CBF7C487F4800F1FA061046F1F733 +:1039E00019FE012C08BF4FF47A710AD0022C08BFCF +:1039F0004FF4FA7105D0042C0CBF4FF4FA614FF468 +:103A0000FA51711A08444FF47A7100F28920B0FB20 +:103A1000F1F0281A801E70BD70B5144606460129C3 +:103A200030D0022B04BF66494FF47A700DD0012BC1 +:103A300004BF64494FF4C86007D0042B07BF624934 +:103A400040F69800614940F6E4400D181046F1F741 +:103A5000E1FD012C08BF4FF47A710AD0022C08BF97 +:103A60004FF4FA7105D0042C0CBF4FF4FA614FF4F7 +:103A7000FA51691A08444FF47A716438B0FBF1F0D6 +:103A8000301A70BD022B08BF4FF47A700AD0012B98 +:103A900008BF4FF4C86005D0042B0CBF40F6980057 +:103AA00040F6E44049F608514518CFE770B5164690 +:103AB0000446012908BF49F6CA650DD0022B08BF8C +:103AC000434807D0012B08BF3E4803D0042B0CBF4E +:103AD0003D48404800F1FA051046F1F78CFD0544D9 +:103AE0003046F1F7A6FD28444FF47A7100F2E14028 +:103AF000B0FBF1F0201A801E70BD2DE9F0410746A1 +:103B00001E460C4615461046082A16BF04284DF6D8 +:103B10008830F1F770FD07EB4701C1EBC71100EBEF +:103B2000C100012C08BF4FF47A710AD0022C08BFE3 +:103B30004FF4FA7105D0042C0CBF4FF4FA614FF426 +:103B4000FA5147182046F1F765FD381A4FF47A719B +:103B500000F60F60B0FBF1F42846F1F740FD204479 +:103B60003044401DBDE8F08170B5054614460E4650 +:103B70000846F1F740FD05EB4502C2EBC512C0EB6C +:103B8000C2053046F1F755FD2D1A2046082C16BF08 +:103B900004284DF68830F1F72EFD28444FF47A7151 +:103BA00000F6B730B0FBF1F52046F1F718FD2844D8 +:103BB000401D70BD0C15004010150040501600400F +:103BC00068360200A2240200D0FB010030D30100BD +:103BD00004360200C0D401002DE9FE430C468046A5 +:103BE000F9F7BAF9074698F80160204601A96A4634 +:103BF000ECF79BFC05000DD0012F02D00320BDE89F +:103C0000FE83204602AA0199ECF7B1FB0298B0F8B6 +:103C100003000AE0022F14D1042E12D3B8F80300D7 +:103C2000BDF80020011D914204D8001D80B2A919E1 +:103C3000814202D14FF00000E1E702D24FF00100D3 +:103C4000DDE74FF00200DAE70B4A022111600B4971 +:103C50000B68002BFCD0084B1B1D1860086800285F +:103C6000FCD00020106008680028FCD070474FF09E +:103C7000805040697047000004E5014000E40140C5 +:103C800002000B464FF00000014620D0012A04D06C +:103C9000022A04D0032A0DD103E0012002E0022011 +:103CA00015E00320072B05D2DFE803F00406080A1D +:103CB0000C0E100007207047012108E0022106E0E9 +:103CC000032104E0042102E0052100E00621EEF7D3 +:103CD00042BF0000F9480521817000210170417048 +:103CE0007047F7490A78012A05D0CA681044C860AD +:103CF0004038EFF768BC8A6810448860F8E700280D +:103D000019D00378EF49F04A13B1012B0ED011E01E +:103D10000379012B00D06BB943790BB1012B09D189 +:103D20008368643B8B4205D2C0680EE00379012BA7 +:103D300002D00BB10020704743790BB1012BF9D1B0 +:103D4000C368643B8B42F5D280689042F2D8012070 +:103D50007047DB4910B501220A700279A2B1002236 +:103D60000A71427992B104224A718268D34C52326C +:103D70008A60C0681434C8606060EEF749FFCF49BC +:103D800020600220887010BD0322E9E70322EBE7E0 +:103D900070B5044609B1012000E00320C84D0021A0 +:103DA0002970217901B100202871607968B104205F +:103DB000C24E6871A168F068EEF733FCA860E06855 +:103DC0005230E8600320B07070BD0320F0E72DE9A9 +:103DD000F04105460226EFF722FB006800B1FFDF45 +:103DE000B64C01273DB12878B0B1012805D0022892 +:103DF00010D0032813D027710CE06868C82807D3B7 +:103E0000EFF747FC20B16868FFF76BFF012603E07E +:103E1000002601E000F05CF93046BDE8F081207832 +:103E20000028F7D16868FFF76AFF0028E3D06868C8 +:103E3000017879B1A078042800D0FFDF01216868FB +:103E4000FFF7A6FF9E49E078EFF72AF90028E1D1B5 +:103E5000FFDFDFE7FFF77DFF6770DBE72DE9F04766 +:103E6000964C8846E178884200D0FFDFDFF84C921C +:103E700000250127924E09F11409B8F1080F75D2F7 +:103E8000DFE808F0040C28527A808D95A07803288A +:103E900002D0022800D0FFDFBDE8F087A078032819 +:103EA00002D0022800D0FFDF0420A0702571207806 +:103EB000002878D1FFF715FF3078012806D0B068C8 +:103EC000E06000F031F92061002060E0E078EEF77A +:103ED000E4FFF5E7A078032802D0022800D0FFDF36 +:103EE000207800286DD1A078032816D0EEF790FE38 +:103EF00001464F46D9F80000EFF798FB00280EDB8B +:103F0000796881420BDB081AF0606D49E078EFF7C1 +:103F1000C7F80028C0D1FFDFBEE7042028E0042056 +:103F2000EFF741FEA570B7E7A078032802D002287A +:103F300000D0FFDF207888BBA078032817D0EEF7E9 +:103F400067FE01464F46D9F80000EFF76FFB0028E7 +:103F5000E5DB79688142E2DB081AF0605849E078D5 +:103F6000EFF79EF8002897D1FFDF95E740E00520A6 +:103F7000EFF719FEA7708FE7A078042800D0FFDFC5 +:103F8000022004E0A078042800D0FFDF0120A1680F +:103F90008847FFF71CFF054630E004E011E0A078F9 +:103FA000042800D0FFDFBDE8F04700F091B8A0780A +:103FB000042804D0617809B1022800D0FFDF2078FE +:103FC00018B1BDE8F04700F08CB8207920B1062088 +:103FD000EFF7E9FD2571CDE7607838B13849E07831 +:103FE000EFF75EF800B9FFDF657055E70720BFE720 +:103FF000FFDF51E73DB1012D03D0FFDF022DF9D1E5 +:104000004AE70420C3E70320C1E770B5050004D0E8 +:104010002A4CA078052806D101E0102070BD0820A8 +:10402000EFF7D7FD08B1112070BD2848EEF777FDF6 +:10403000E070202803D00020A560A07070BD032090 +:1040400070BD1E4810B5017809B1112010BD8178EE +:10405000052906D0012906D029B1012101700020CF +:1040600010BD0F2010BD00F03CF8F8E770B5134C00 +:104070000546A07808B1012809D155B12846FFF7B7 +:104080003EFE40B1287840B1A078012809D00F2029 +:1040900070BD102070BD072070BD2846FFF759FE87 +:1040A00003E000212846FFF773FE0549E078EEF7AC +:1040B000F7FF00B9FFDF002070BD0000BC01002049 +:1040C000CC1200203D860100FF1FA1075D3E0200CB +:1040D0000A4810B5006900F01FF8BDE81040EEF77F +:1040E000A3BC064810B5C078EEF773FD00B9FFDF3A +:1040F0000820EFF758FDBDE81040EBE5BC010020BB +:1041000010B5134C2060201D016011481030026072 +:10411000001D0360002010BD0E490A6848F202131A +:104120009A4302430A6070470A4A116848F2021330 +:1041300001EA0300994311607047054B02465B4258 +:1041400010201344FC2B01D81160002070470000A0 +:1041500000060040C806024040EA010310B59B0774 +:104160000FD1042A0DD310C808C9121F9C42F8D0E1 +:1041700020BA19BA884201D9012010BD4FF0FF3092 +:1041800010BD1AB1D30703D0521C07E0002010BDA8 +:1041900010F8013B11F8014B1B1B07D110F8013B34 +:1041A00011F8014B1B1B01D1921EF1D1184610BD15 +:1041B000032A40F2308010F0030C00F0158011F853 +:1041C000013BBCF1020F624498BF11F801CB00F82B +:1041D000013B38BF11F8013BA2F1040298BF00F87F +:1041E00001CB38BF00F8013B11F0030300F025803C +:1041F000083AC0F0088051F8043B083A51F804CB63 +:10420000A0E80810F5E7121D5CBF51F8043B40F828 +:10421000043BAFF30080D20724BF11F8013B11F833 +:1042200001CB48BF11F8012B24BF00F8013B00F877 +:1042300001CB48BF00F8012B704710B5203AC0F001 +:104240000B80B1E81850203AA0E81850B1E8185097 +:10425000A0E81850BFF4F5AF5FEA027C24BFB1E8D4 +:104260001850A0E8185044BF18C918C0BDE8104045 +:104270005FEA827C24BF51F8043B40F8043B08BF4E +:104280007047D20728BF31F8023B48BF11F8012B15 +:1042900028BF20F8023B48BF00F8012B704702F00E +:1042A000FF0343EA032242EA024200F002B84FF061 +:1042B00000020429C0F0128010F0030C00F01B80F3 +:1042C000CCF1040CBCF1020F18BF00F8012BA8BF01 +:1042D00020F8022BA1EB0C0100F00DB85FEAC17CC5 +:1042E00024BF00F8012B00F8012B48BF00F8012B78 +:1042F00070474FF0000200B51346944696462039A9 +:1043000022BFA0E80C50A0E80C50B1F12001BFF48E +:10431000F7AF090728BFA0E80C5048BF0CC05DF8F4 +:1043200004EB890028BF40F8042B08BF704748BF42 +:1043300020F8022B11F0804F18BF00F8012B7047B6 +:10434000FEDF04207146084219D10699124A9142B3 +:1043500015DC069902394878DF2810D10878FE2844 +:1043600007D0FF280BD14FF001004FF000020B4B9C +:10437000184741F201000099019A084B1847084B71 +:10438000002B02D01B68DB6818474FF0FF307146E6 +:104390004FF00002014B1847006002007D3602001A +:1043A00004000020184819497047FFF7FBFFDCF7AD +:1043B00005FF00BD4FF4805015490968884203D1BC +:1043C000144A13605B68184700BD000020BFFDE77A +:1043D0004FF480500E490968884210D10E4B18687E +:1043E0004FF0FF318842F1D080F308884FF0202150 +:1043F000884204DD0948026803210A430260084834 +:10440000804708488047FFDFE0120020E0120020CC +:104410000000002004000020006002001409004099 +:10442000F5430100B543020004207146084202D062 +:10443000EFF3098101E0EFF3088188690238007821 +:10444000102813DB20280FDB2C280BDB0A4A12680C +:104450000A4B9A4203D1602804DB094A1047022024 +:1044600008607047074A1047074A1047074A126812 +:104470002C32126810470000B0000020BEBAFECAFD +:1044800021130000692E02001138020004000020F0 +:104490000D4B0E4908470E4B0C4908470D4B0B4975 +:1044A00008470D4B094908470C4B084908470C4B76 +:1044B000064908470B4B054908470B4B034908477A +:1044C0000A4B02490847000049BB00000D2F0000BD +:1044D0006D2C0000092B0000972A00000F2D000012 +:1044E0003D13000053280000C1BD0000C9110000A9 +:1044F00000210160017170470021016081807047D7 +:10450000002101604160017270470A684B680260D7 +:104510004360B1F808C0A0F808C070470A6802609C +:104520000B79037170470000B19500003B970000C4 +:1045300099980000BD980000F79800002B990000A2 +:104540005D9900008D990000039A00008996000093 +:10455000A7120000A712000075440000C14400002B +:10456000E5440000794500009546000057470000EB +:1045700089470000714800000349000057490000C6 +:104580003D4A00005D4A0000DF15000003160000F0 +:10459000331500008715000035160000C91600000D +:1045A0005B6000000B620000DF650000F566000044 +:1045B0007F670000FD6700006168000085690000FA +:1045C000556A0000C16A00007F4A0000854A000069 +:1045D0008F4A000085410000F74A00005941000061 +:1045E0007B4C0000B34C0000294D00000F4E000032 +:1045F000254E0000A7120000A7120000A71200001D +:10460000A7120000A7120000A7120000A7120000C6 +:10461000A7120000BF24000045250000612500000E +:104620007D2500000B270000A7250000B125000014 +:10463000F325000015260000F126000033270000B6 +:10464000A7120000A71200005F8300007F83000014 +:1046500081830000C5830000F3830000E184000033 +:104660006F85000083850000D1850000C1860000B1 +:10467000678800009189000073730000A989000019 +:10468000A7120000A7120000C9B4000033B6000052 +:1046900087B60000F3B60000A3B7000001000000D9 +:1046A00000000000100110013A0200001A02000090 +:1046B000F3900000E1900000FFFFFFFF0000FFFF0C +:1046C000C5AC0000253D000065200000BD73000062 +:1046D000598E0000000000000000020000000000F1 +:1046E00000020000000000000001000000000000C7 +:1046F0000B810000EB800000598100004124000084 +:1047000003240000232400002FA800005BA8000061 +:1047100063AA0000515900007981000000000000E8 +:10472000A98100008F2400000000000000000000AC +:104730000000000045A9000000000000E55900004D +:10474000000000004808000048080000D3560000A0 +:10475000D35600005144000071AB00003F760000CA +:10476000771F0000E31D02004F9401001157000065 +:104770001157000073440000D3AB0000C376000063 +:10478000E91F0000111E0200639401007001700116 +:10479000400038005C0024004801000200000300D3 +:1047A000656C746200000000000000000000000062 +:1047B0000000000087000000000000000000000072 +:1047C00000000000BE83605ADB0B376038A5F5AAF5 +:1047D0009183886C010000007911010041200100E3 +:1047E00000000001020603040500000007000000AD +:1047F00000000000060000000A0000003200000077 +:1048000073000000B4000000DD860100DB0C020034 +:10481000CB6C010065AE010059F0010065AE0100EE +:10482000616E01001DB00100E3E701001DB0010051 +:10483000476B0100B1AF010087EF0100B1AF01008C +:10484000C76C010079AE0100E9DF010079AE01001B +:104850005972010091B20100EFF0010091B2010024 +:104860000300000001555555D6BE898E0000C706CD +:10487000C70CC71200006B030F06B3080000B70493 +:10488000A708970CF401FA00960064004B00320070 +:104890001E0014000A000500020001000041000093 +:1048A00000000000AAAED7AB154120100C0802177B +:1048B0000D0101020909010106020918180301018D +:1048C0000909030305000000FE000000FE000000CF +:1048D000FE555555252627D6BE898E00F401FA00CF +:1048E000960064004B0032001E0014000A00050010 +:1048F000020001002541000000000000DD3402003C +:10490000F53402000D350200253502005535020050 +:104910007D350200A7350200DB3502005F32020060 +:10492000BF310200B53202003B4102003D330200BC +:104930004D330200793302009F3C0100A73C010087 +:10494000B93C0100A7330200C133020095330200D5 +:104950009F330200CD33020003340200B52E020063 +:1049600023340200313402003F3402004F3402008D +:10497000673402007F34020095340200B52E020035 +:104980000000000077B90000CDB90000E3B90000D5 +:10499000813C0200E12E0200A72F02000B40020022 +:1049A000434002006D400200493B0100C93E010046 +:1049B000B52E0200B52E0200B52E0200B52E020063 +:1049C0001C0500402005004000100200EC490200D8 +:1049D00008000020D001000044110000244A020019 +:1049E000D801002008110000A0110000011813C810 +:1049F000140250201A0102227C2720FB349B5F8086 +:104A00001280021A10138B091B2048041ACE0401CD +:104A1000200B50A40AAC01300912CB637F010B6854 +:044A2000CC10A00016 +:00000001FF diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/mbed_lib.json b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/mbed_lib.json similarity index 95% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/mbed_lib.json rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/mbed_lib.json index bb625ad33f..b6a26ff8c5 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_FULL/mbed_lib.json +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S132_OTA/mbed_lib.json @@ -34,7 +34,7 @@ "target_overrides": { "*": { "target.features_add": ["BLE"], - "target.bootloader_img": "hex/s132_nrf52_5.0.0_softdevice.hex" + "target.bootloader_img": "hex/s132_nrf52_6.0.0_softdevice.hex" } } } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52_6.0.0_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52_6.0.0_licence-agreement.txt new file mode 100644 index 0000000000..a71adee7b9 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52_6.0.0_licence-agreement.txt @@ -0,0 +1,35 @@ +Copyright (c) 2007 - 2018, Nordic Semiconductor ASA +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form, except as embedded into a Nordic + Semiconductor ASA integrated circuit in a product or a software update for + such product, must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of Nordic Semiconductor ASA nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +4. This software, with or without modification, must only be used with a + Nordic Semiconductor ASA integrated circuit. + +5. Any software provided in binary form under this license must not be reverse + engineered, decompiled, modified and/or disassembled. + +THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52_6.0.0_migration-document.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52_6.0.0_migration-document.pdf new file mode 100644 index 0000000000..1379ecd581 Binary files /dev/null and b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52_6.0.0_migration-document.pdf differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52_6.0.0_release-notes.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52_6.0.0_release-notes.pdf new file mode 100644 index 0000000000..3e592752a2 Binary files /dev/null and b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/doc/s140_nrf52_6.0.0_release-notes.pdf differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_err.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_err.h new file mode 100644 index 0000000000..1b4820dc3d --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_err.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_COMMON + @{ + @addtogroup nrf_error + @{ + @ingroup BLE_COMMON + @} + + @defgroup ble_err General error codes + @{ + + @brief General error code definitions for the BLE API. + + @ingroup BLE_COMMON +*/ +#ifndef NRF_BLE_ERR_H__ +#define NRF_BLE_ERR_H__ + +#include "nrf_error.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* @defgroup BLE_ERRORS Error Codes + * @{ */ +#define BLE_ERROR_NOT_ENABLED (NRF_ERROR_STK_BASE_NUM+0x001) /**< @ref sd_ble_enable has not been called. */ +#define BLE_ERROR_INVALID_CONN_HANDLE (NRF_ERROR_STK_BASE_NUM+0x002) /**< Invalid connection handle. */ +#define BLE_ERROR_INVALID_ATTR_HANDLE (NRF_ERROR_STK_BASE_NUM+0x003) /**< Invalid attribute handle. */ +#define BLE_ERROR_INVALID_ADV_HANDLE (NRF_ERROR_STK_BASE_NUM+0x004) /**< Invalid advertising handle. */ +#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x005) /**< Invalid role. */ +#define BLE_ERROR_BLOCKED_BY_OTHER_LINKS (NRF_ERROR_STK_BASE_NUM+0x006) /**< The attempt to change link settings failed due to the scheduling of other links. */ +/** @} */ + + +/** @defgroup BLE_ERROR_SUBRANGES Module specific error code subranges + * @brief Assignment of subranges for module specific error codes. + * @note For specific error codes, see ble_.h or ble_error_.h. + * @{ */ +#define NRF_L2CAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x100) /**< L2CAP specific errors. */ +#define NRF_GAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x200) /**< GAP specific errors. */ +#define NRF_GATTC_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x300) /**< GATT client specific errors. */ +#define NRF_GATTS_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x400) /**< GATT server specific errors. */ +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif + + +/** + @} + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gap.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gap.h similarity index 54% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gap.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gap.h index 339db01fd1..6e6cae2754 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gap.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gap.h @@ -1,37 +1,39 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @@ -43,10 +45,13 @@ #ifndef BLE_GAP_H__ #define BLE_GAP_H__ - -#include "ble_types.h" -#include "ble_ranges.h" +#include #include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" #ifdef __cplusplus extern "C" { @@ -59,43 +64,45 @@ extern "C" { */ enum BLE_GAP_SVCS { - SD_BLE_GAP_ADDR_SET = BLE_GAP_SVC_BASE, /**< Set own Bluetooth Address. */ - SD_BLE_GAP_ADDR_GET, /**< Get own Bluetooth Address. */ - SD_BLE_GAP_WHITELIST_SET, /**< Set active whitelist. */ - SD_BLE_GAP_DEVICE_IDENTITIES_SET, /**< Set device identity list. */ - SD_BLE_GAP_PRIVACY_SET, /**< Set Privacy settings*/ - SD_BLE_GAP_PRIVACY_GET, /**< Get Privacy settings*/ - SD_BLE_GAP_ADV_DATA_SET, /**< Set Advertising Data. */ - SD_BLE_GAP_ADV_START, /**< Start Advertising. */ - SD_BLE_GAP_ADV_STOP, /**< Stop Advertising. */ - SD_BLE_GAP_CONN_PARAM_UPDATE, /**< Connection Parameter Update. */ - SD_BLE_GAP_DISCONNECT, /**< Disconnect. */ - SD_BLE_GAP_TX_POWER_SET, /**< Set TX Power. */ - SD_BLE_GAP_APPEARANCE_SET, /**< Set Appearance. */ - SD_BLE_GAP_APPEARANCE_GET, /**< Get Appearance. */ - SD_BLE_GAP_PPCP_SET, /**< Set PPCP. */ - SD_BLE_GAP_PPCP_GET, /**< Get PPCP. */ - SD_BLE_GAP_DEVICE_NAME_SET, /**< Set Device Name. */ - SD_BLE_GAP_DEVICE_NAME_GET, /**< Get Device Name. */ - SD_BLE_GAP_AUTHENTICATE, /**< Initiate Pairing/Bonding. */ - SD_BLE_GAP_SEC_PARAMS_REPLY, /**< Reply with Security Parameters. */ - SD_BLE_GAP_AUTH_KEY_REPLY, /**< Reply with an authentication key. */ - SD_BLE_GAP_LESC_DHKEY_REPLY, /**< Reply with an LE Secure Connections DHKey. */ - SD_BLE_GAP_KEYPRESS_NOTIFY, /**< Notify of a keypress during an authentication procedure. */ - SD_BLE_GAP_LESC_OOB_DATA_GET, /**< Get the local LE Secure Connections OOB data. */ - SD_BLE_GAP_LESC_OOB_DATA_SET, /**< Set the remote LE Secure Connections OOB data. */ - SD_BLE_GAP_ENCRYPT, /**< Initiate encryption procedure. */ - SD_BLE_GAP_SEC_INFO_REPLY, /**< Reply with Security Information. */ - SD_BLE_GAP_CONN_SEC_GET, /**< Obtain connection security level. */ - SD_BLE_GAP_RSSI_START, /**< Start reporting of changes in RSSI. */ - SD_BLE_GAP_RSSI_STOP, /**< Stop reporting of changes in RSSI. */ - SD_BLE_GAP_SCAN_START, /**< Start Scanning. */ - SD_BLE_GAP_SCAN_STOP, /**< Stop Scanning. */ - SD_BLE_GAP_CONNECT, /**< Connect. */ - SD_BLE_GAP_CONNECT_CANCEL, /**< Cancel ongoing connection procedure. */ - SD_BLE_GAP_RSSI_GET, /**< Get the last RSSI sample. */ - SD_BLE_GAP_PHY_REQUEST, /**< Initiate PHY Update procedure. */ - SD_BLE_GAP_DATA_LENGTH_UPDATE, /**< Initiate or respond to a Data Length Update Procedure. */ + SD_BLE_GAP_ADDR_SET = BLE_GAP_SVC_BASE, /**< Set own Bluetooth Address. */ + SD_BLE_GAP_ADDR_GET = BLE_GAP_SVC_BASE + 1, /**< Get own Bluetooth Address. */ + SD_BLE_GAP_WHITELIST_SET = BLE_GAP_SVC_BASE + 2, /**< Set active whitelist. */ + SD_BLE_GAP_DEVICE_IDENTITIES_SET = BLE_GAP_SVC_BASE + 3, /**< Set device identity list. */ + SD_BLE_GAP_PRIVACY_SET = BLE_GAP_SVC_BASE + 4, /**< Set Privacy settings*/ + SD_BLE_GAP_PRIVACY_GET = BLE_GAP_SVC_BASE + 5, /**< Get Privacy settings*/ + SD_BLE_GAP_ADV_SET_CONFIGURE = BLE_GAP_SVC_BASE + 6, /**< Configure an advertising set. */ + SD_BLE_GAP_ADV_START = BLE_GAP_SVC_BASE + 7, /**< Start Advertising. */ + SD_BLE_GAP_ADV_STOP = BLE_GAP_SVC_BASE + 8, /**< Stop Advertising. */ + SD_BLE_GAP_CONN_PARAM_UPDATE = BLE_GAP_SVC_BASE + 9, /**< Connection Parameter Update. */ + SD_BLE_GAP_DISCONNECT = BLE_GAP_SVC_BASE + 10, /**< Disconnect. */ + SD_BLE_GAP_TX_POWER_SET = BLE_GAP_SVC_BASE + 11, /**< Set TX Power. */ + SD_BLE_GAP_APPEARANCE_SET = BLE_GAP_SVC_BASE + 12, /**< Set Appearance. */ + SD_BLE_GAP_APPEARANCE_GET = BLE_GAP_SVC_BASE + 13, /**< Get Appearance. */ + SD_BLE_GAP_PPCP_SET = BLE_GAP_SVC_BASE + 14, /**< Set PPCP. */ + SD_BLE_GAP_PPCP_GET = BLE_GAP_SVC_BASE + 15, /**< Get PPCP. */ + SD_BLE_GAP_DEVICE_NAME_SET = BLE_GAP_SVC_BASE + 16, /**< Set Device Name. */ + SD_BLE_GAP_DEVICE_NAME_GET = BLE_GAP_SVC_BASE + 17, /**< Get Device Name. */ + SD_BLE_GAP_AUTHENTICATE = BLE_GAP_SVC_BASE + 18, /**< Initiate Pairing/Bonding. */ + SD_BLE_GAP_SEC_PARAMS_REPLY = BLE_GAP_SVC_BASE + 19, /**< Reply with Security Parameters. */ + SD_BLE_GAP_AUTH_KEY_REPLY = BLE_GAP_SVC_BASE + 20, /**< Reply with an authentication key. */ + SD_BLE_GAP_LESC_DHKEY_REPLY = BLE_GAP_SVC_BASE + 21, /**< Reply with an LE Secure Connections DHKey. */ + SD_BLE_GAP_KEYPRESS_NOTIFY = BLE_GAP_SVC_BASE + 22, /**< Notify of a keypress during an authentication procedure. */ + SD_BLE_GAP_LESC_OOB_DATA_GET = BLE_GAP_SVC_BASE + 23, /**< Get the local LE Secure Connections OOB data. */ + SD_BLE_GAP_LESC_OOB_DATA_SET = BLE_GAP_SVC_BASE + 24, /**< Set the remote LE Secure Connections OOB data. */ + SD_BLE_GAP_ENCRYPT = BLE_GAP_SVC_BASE + 25, /**< Initiate encryption procedure. */ + SD_BLE_GAP_SEC_INFO_REPLY = BLE_GAP_SVC_BASE + 26, /**< Reply with Security Information. */ + SD_BLE_GAP_CONN_SEC_GET = BLE_GAP_SVC_BASE + 27, /**< Obtain connection security level. */ + SD_BLE_GAP_RSSI_START = BLE_GAP_SVC_BASE + 28, /**< Start reporting of changes in RSSI. */ + SD_BLE_GAP_RSSI_STOP = BLE_GAP_SVC_BASE + 29, /**< Stop reporting of changes in RSSI. */ + SD_BLE_GAP_SCAN_START = BLE_GAP_SVC_BASE + 30, /**< Start Scanning. */ + SD_BLE_GAP_SCAN_STOP = BLE_GAP_SVC_BASE + 31, /**< Stop Scanning. */ + SD_BLE_GAP_CONNECT = BLE_GAP_SVC_BASE + 32, /**< Connect. */ + SD_BLE_GAP_CONNECT_CANCEL = BLE_GAP_SVC_BASE + 33, /**< Cancel ongoing connection procedure. */ + SD_BLE_GAP_RSSI_GET = BLE_GAP_SVC_BASE + 34, /**< Get the last RSSI sample. */ + SD_BLE_GAP_PHY_UPDATE = BLE_GAP_SVC_BASE + 35, /**< Initiate or respond to a PHY Update Procedure. */ + SD_BLE_GAP_DATA_LENGTH_UPDATE = BLE_GAP_SVC_BASE + 36, /**< Initiate or respond to a Data Length Update Procedure. */ + SD_BLE_GAP_QOS_CHANNEL_SURVEY_START = BLE_GAP_SVC_BASE + 37, /**< Start Quality of Service (QoS) channel survey module. */ + SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP = BLE_GAP_SVC_BASE + 38, /**< Stop Quality of Service (QoS) channel survey module. */ }; /**@brief GAP Event IDs. @@ -103,26 +110,29 @@ enum BLE_GAP_SVCS */ enum BLE_GAP_EVTS { - BLE_GAP_EVT_CONNECTED = BLE_GAP_EVT_BASE, /**< Connection established. \n See @ref ble_gap_evt_connected_t. */ - BLE_GAP_EVT_DISCONNECTED, /**< Disconnected from peer. \n See @ref ble_gap_evt_disconnected_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE, /**< Connection Parameters updated. \n See @ref ble_gap_evt_conn_param_update_t. */ - BLE_GAP_EVT_SEC_PARAMS_REQUEST, /**< Request to provide security parameters. \n Reply with @ref sd_ble_gap_sec_params_reply. \n See @ref ble_gap_evt_sec_params_request_t. */ - BLE_GAP_EVT_SEC_INFO_REQUEST, /**< Request to provide security information. \n Reply with @ref sd_ble_gap_sec_info_reply. \n See @ref ble_gap_evt_sec_info_request_t. */ - BLE_GAP_EVT_PASSKEY_DISPLAY, /**< Request to display a passkey to the user. \n In LESC Numeric Comparison, reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_passkey_display_t. */ - BLE_GAP_EVT_KEY_PRESSED, /**< Notification of a keypress on the remote device.\n See @ref ble_gap_evt_key_pressed_t */ - BLE_GAP_EVT_AUTH_KEY_REQUEST, /**< Request to provide an authentication key. \n Reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_auth_key_request_t. */ - BLE_GAP_EVT_LESC_DHKEY_REQUEST, /**< Request to calculate an LE Secure Connections DHKey. \n Reply with @ref sd_ble_gap_lesc_dhkey_reply. \n See @ref ble_gap_evt_lesc_dhkey_request_t */ - BLE_GAP_EVT_AUTH_STATUS, /**< Authentication procedure completed with status. \n See @ref ble_gap_evt_auth_status_t. */ - BLE_GAP_EVT_CONN_SEC_UPDATE, /**< Connection security updated. \n See @ref ble_gap_evt_conn_sec_update_t. */ - BLE_GAP_EVT_TIMEOUT, /**< Timeout expired. \n See @ref ble_gap_evt_timeout_t. */ - BLE_GAP_EVT_RSSI_CHANGED, /**< RSSI report. \n See @ref ble_gap_evt_rssi_changed_t. */ - BLE_GAP_EVT_ADV_REPORT, /**< Advertising report. \n See @ref ble_gap_evt_adv_report_t. */ - BLE_GAP_EVT_SEC_REQUEST, /**< Security Request. \n See @ref ble_gap_evt_sec_request_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, /**< Connection Parameter Update Request. \n Reply with @ref sd_ble_gap_conn_param_update. \n See @ref ble_gap_evt_conn_param_update_request_t. */ - BLE_GAP_EVT_SCAN_REQ_REPORT, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ - BLE_GAP_EVT_PHY_UPDATE, /**< PHY have been updated \n See @ref ble_gap_evt_phy_update_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST, /**< Data Length Update request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ + BLE_GAP_EVT_CONNECTED = BLE_GAP_EVT_BASE, + BLE_GAP_EVT_DISCONNECTED = BLE_GAP_EVT_BASE + 1, /**< Disconnected from peer. \n See @ref ble_gap_evt_disconnected_t. */ + BLE_GAP_EVT_CONN_PARAM_UPDATE = BLE_GAP_EVT_BASE + 2, /**< Connection Parameters updated. \n See @ref ble_gap_evt_conn_param_update_t. */ + BLE_GAP_EVT_SEC_PARAMS_REQUEST = BLE_GAP_EVT_BASE + 3, /**< Request to provide security parameters. \n Reply with @ref sd_ble_gap_sec_params_reply. \n See @ref ble_gap_evt_sec_params_request_t. */ + BLE_GAP_EVT_SEC_INFO_REQUEST = BLE_GAP_EVT_BASE + 4, /**< Request to provide security information. \n Reply with @ref sd_ble_gap_sec_info_reply. \n See @ref ble_gap_evt_sec_info_request_t. */ + BLE_GAP_EVT_PASSKEY_DISPLAY = BLE_GAP_EVT_BASE + 5, /**< Request to display a passkey to the user. \n In LESC Numeric Comparison, reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_passkey_display_t. */ + BLE_GAP_EVT_KEY_PRESSED = BLE_GAP_EVT_BASE + 6, /**< Notification of a keypress on the remote device.\n See @ref ble_gap_evt_key_pressed_t */ + BLE_GAP_EVT_AUTH_KEY_REQUEST = BLE_GAP_EVT_BASE + 7, /**< Request to provide an authentication key. \n Reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_auth_key_request_t. */ + BLE_GAP_EVT_LESC_DHKEY_REQUEST = BLE_GAP_EVT_BASE + 8, /**< Request to calculate an LE Secure Connections DHKey. \n Reply with @ref sd_ble_gap_lesc_dhkey_reply. \n See @ref ble_gap_evt_lesc_dhkey_request_t */ + BLE_GAP_EVT_AUTH_STATUS = BLE_GAP_EVT_BASE + 9, /**< Authentication procedure completed with status. \n See @ref ble_gap_evt_auth_status_t. */ + BLE_GAP_EVT_CONN_SEC_UPDATE = BLE_GAP_EVT_BASE + 10, /**< Connection security updated. \n See @ref ble_gap_evt_conn_sec_update_t. */ + BLE_GAP_EVT_TIMEOUT = BLE_GAP_EVT_BASE + 11, /**< Timeout expired. \n See @ref ble_gap_evt_timeout_t. */ + BLE_GAP_EVT_RSSI_CHANGED = BLE_GAP_EVT_BASE + 12, /**< RSSI report. \n See @ref ble_gap_evt_rssi_changed_t. */ + BLE_GAP_EVT_ADV_REPORT = BLE_GAP_EVT_BASE + 13, /**< Advertising report. \n See @ref ble_gap_evt_adv_report_t. */ + BLE_GAP_EVT_SEC_REQUEST = BLE_GAP_EVT_BASE + 14, /**< Security Request. \n See @ref ble_gap_evt_sec_request_t. */ + BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 15, /**< Connection Parameter Update Request. \n Reply with @ref sd_ble_gap_conn_param_update. \n See @ref ble_gap_evt_conn_param_update_request_t. */ + BLE_GAP_EVT_SCAN_REQ_REPORT = BLE_GAP_EVT_BASE + 16, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ + BLE_GAP_EVT_PHY_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 17, /**< PHY Update Request. \n Reply with @ref sd_ble_gap_phy_update. \n See @ref ble_gap_evt_phy_update_request_t. */ + BLE_GAP_EVT_PHY_UPDATE = BLE_GAP_EVT_BASE + 18, /**< PHY Update Procedure is complete. \n See @ref ble_gap_evt_phy_update_t. */ + BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 19, /**< Data Length Update Request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ + BLE_GAP_EVT_DATA_LENGTH_UPDATE = BLE_GAP_EVT_BASE + 20, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ + BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT = BLE_GAP_EVT_BASE + 21, /**< Channel survey report. \n See @ref ble_gap_evt_qos_channel_survey_report_t. */ + BLE_GAP_EVT_ADV_SET_TERMINATED = BLE_GAP_EVT_BASE + 22, /**< Advertising set terminated. \n See @ref ble_gap_evt_adv_set_terminated_t. */ }; /**@brief GAP Option IDs. @@ -130,15 +140,12 @@ enum BLE_GAP_EVTS */ enum BLE_GAP_OPTS { - BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ - BLE_GAP_OPT_LOCAL_CONN_LATENCY, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ - BLE_GAP_OPT_PASSKEY, /**< Set passkey. @ref ble_gap_opt_passkey_t */ - BLE_GAP_OPT_SCAN_REQ_REPORT, /**< Scan request report. @ref ble_gap_opt_scan_req_report_t */ - BLE_GAP_OPT_COMPAT_MODE_1, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */ - BLE_GAP_OPT_COMPAT_MODE_2, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_2_t */ - BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ - BLE_GAP_OPT_PREFERRED_PHYS_SET, /**< Set the preferred PHYs for all new connections. @ref ble_gap_opt_preferred_phys_t */ - BLE_GAP_OPT_SLAVE_LATENCY_DISABLE, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ + BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ + BLE_GAP_OPT_LOCAL_CONN_LATENCY = BLE_GAP_OPT_BASE + 1, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ + BLE_GAP_OPT_PASSKEY = BLE_GAP_OPT_BASE + 2, /**< Set passkey. @ref ble_gap_opt_passkey_t */ + BLE_GAP_OPT_COMPAT_MODE_1 = BLE_GAP_OPT_BASE + 3, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */ + BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT = BLE_GAP_OPT_BASE + 4, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ + BLE_GAP_OPT_SLAVE_LATENCY_DISABLE = BLE_GAP_OPT_BASE + 5, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ }; /**@brief GAP Configuration IDs. @@ -147,8 +154,17 @@ enum BLE_GAP_OPTS */ enum BLE_GAP_CFGS { - BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ - BLE_GAP_CFG_DEVICE_NAME, /**< Device name configuration. */ + BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ + BLE_GAP_CFG_DEVICE_NAME = BLE_GAP_CFG_BASE + 1, /**< Device name configuration. */ +}; + +/**@brief GAP TX Power roles. + */ +enum BLE_GAP_TX_POWER_ROLES +{ + BLE_GAP_TX_POWER_ROLE_ADV = 1, /**< Advertiser role. */ + BLE_GAP_TX_POWER_ROLE_SCAN_INIT = 2, /**< Scanner and initiator role. */ + BLE_GAP_TX_POWER_ROLE_CONN = 3, /**< Connection role. */ }; /** @} */ @@ -168,7 +184,6 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_ROLES GAP Roles - * @note Not explicitly used in peripheral API, but will be relevant for central API. * @{ */ #define BLE_GAP_ROLE_INVALID 0x0 /**< Invalid Role. */ #define BLE_GAP_ROLE_PERIPH 0x1 /**< Peripheral Role. */ @@ -178,20 +193,20 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_TIMEOUT_SOURCES GAP Timeout sources * @{ */ -#define BLE_GAP_TIMEOUT_SRC_ADVERTISING 0x00 /**< Advertising timeout. */ -#define BLE_GAP_TIMEOUT_SRC_SECURITY_REQUEST 0x01 /**< Security request timeout. */ -#define BLE_GAP_TIMEOUT_SRC_SCAN 0x02 /**< Scanning timeout. */ -#define BLE_GAP_TIMEOUT_SRC_CONN 0x03 /**< Connection timeout. */ -#define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x04 /**< Authenticated payload timeout. */ +#define BLE_GAP_TIMEOUT_SRC_SCAN 0x01 /**< Scanning timeout. */ +#define BLE_GAP_TIMEOUT_SRC_CONN 0x02 /**< Connection timeout. */ +#define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x03 /**< Authenticated payload timeout. */ /**@} */ /**@defgroup BLE_GAP_ADDR_TYPES GAP Address types * @{ */ -#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public address. */ -#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static address. */ +#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public (identity) address.*/ +#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static (identity) address. */ #define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE 0x02 /**< Random private resolvable address. */ #define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE 0x03 /**< Random private non-resolvable address. */ +#define BLE_GAP_ADDR_TYPE_ANONYMOUS 0x7F /**< An advertiser may advertise without its address. + This type of advertising is called anonymous. */ /**@} */ @@ -204,13 +219,40 @@ enum BLE_GAP_CFGS /** @brief BLE address length. */ #define BLE_GAP_ADDR_LEN (6) - /**@defgroup BLE_GAP_PRIVACY_MODES Privacy modes * @{ */ #define BLE_GAP_PRIVACY_MODE_OFF 0x00 /**< Device will send and accept its identity address for its own address. */ #define BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY 0x01 /**< Device will send and accept only private addresses for its own address. */ +#define BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY 0x02 /**< Device will send and accept only private addresses for its own address, + and will not accept a peer using identity address as sender address when + the peer IRK is exchanged, non-zero and added to the identity list. */ /**@} */ +/** @brief Invalid power level. */ +#define BLE_GAP_POWER_LEVEL_INVALID 127 + +/** @brief Advertising set handle not set. */ +#define BLE_GAP_ADV_SET_HANDLE_NOT_SET (0xFF) + +/** @brief The default number of advertising sets. */ +#define BLE_GAP_ADV_SET_COUNT_DEFAULT (1) + +/** @brief The maximum number of advertising sets supported by this SoftDevice. */ +#define BLE_GAP_ADV_SET_COUNT_MAX (1) + +/**@defgroup BLE_GAP_ADV_SET_DATA_SIZES Advertising data sizes. + * @{ */ +#define BLE_GAP_ADV_SET_DATA_SIZE_MAX (31) /**< Maximum data length for an advertising set. */ +/**@}. */ + +/** @brief Set ID not available in advertising report. */ +#define BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE 0xFF + +/**@defgroup BLE_GAP_EVT_ADV_SET_TERMINATED_REASON GAP Advertising Set Terminated reasons + * @{ */ +#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_TIMEOUT 0x01 /**< Timeout value reached. */ +#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_LIMIT_REACHED 0x02 /**< @ref ble_gap_adv_params_t::max_adv_evts was reached. */ +/**@} */ /**@defgroup BLE_GAP_AD_TYPE_DEFINITIONS GAP Advertising and Scan Response Data format * @note Found at https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm @@ -266,46 +308,111 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_ADV_INTERVALS GAP Advertising interval max and min * @{ */ -#define BLE_GAP_ADV_INTERVAL_MIN 0x0020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ -#define BLE_GAP_ADV_NONCON_INTERVAL_MIN 0x00A0 /**< Minimum Advertising interval in 625 us units for non connectable mode, i.e. 100 ms. */ -#define BLE_GAP_ADV_INTERVAL_MAX 0x4000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. */ +#define BLE_GAP_ADV_INTERVAL_MIN 0x000020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ +#define BLE_GAP_ADV_INTERVAL_MAX 0x004000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. + @note Support for values above @ref BLE_GAP_ADV_INTERVAL_MAX + is experimental. Values above 0xFFFFFF, i.e 10,485.759375 s + are not supported. */ /**@} */ /**@defgroup BLE_GAP_SCAN_INTERVALS GAP Scan interval max and min * @{ */ #define BLE_GAP_SCAN_INTERVAL_MIN 0x0004 /**< Minimum Scan interval in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_INTERVAL_MAX 0x4000 /**< Maximum Scan interval in 625 us units, i.e. 10.24 s. */ +#define BLE_GAP_SCAN_INTERVAL_MAX 0xFFFF /**< Maximum Scan interval in 625 us units, i.e. 40,959.375 s. */ /** @} */ /**@defgroup BLE_GAP_SCAN_WINDOW GAP Scan window max and min * @{ */ #define BLE_GAP_SCAN_WINDOW_MIN 0x0004 /**< Minimum Scan window in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_WINDOW_MAX 0x4000 /**< Maximum Scan window in 625 us units, i.e. 10.24 s. */ +#define BLE_GAP_SCAN_WINDOW_MAX 0xFFFF /**< Maximum Scan window in 625 us units, i.e. 40,959.375 s. */ /** @} */ /**@defgroup BLE_GAP_SCAN_TIMEOUT GAP Scan timeout max and min * @{ */ -#define BLE_GAP_SCAN_TIMEOUT_MIN 0x0001 /**< Minimum Scan timeout in seconds. */ -#define BLE_GAP_SCAN_TIMEOUT_MAX 0xFFFF /**< Maximum Scan timeout in seconds. */ +#define BLE_GAP_SCAN_TIMEOUT_MIN 0x0001 /**< Minimum Scan timeout in 10 ms units, i.e 10 ms. */ +#define BLE_GAP_SCAN_TIMEOUT_UNLIMITED 0x0000 /**< Continue to scan forever. */ /** @} */ - -/**@brief Maximum size of advertising data in octets. */ -#define BLE_GAP_ADV_MAX_SIZE (31) - +/**@defgroup BLE_GAP_SCAN_BUFFER_SIZE GAP Minimum scanner buffer size + * + * Scan buffers are used for storing advertising data received from an advertiser. + * If ble_gap_scan_params_t::extended is set to 0, @ref BLE_GAP_SCAN_BUFFER_MIN is the minimum scan buffer length. + * else the minimum scan buffer size is @ref BLE_GAP_SCAN_BUFFER_EXTENDED_MIN. + * @{ */ +#define BLE_GAP_SCAN_BUFFER_MIN (31) /**< Minimum data length for an + advertising set. */ +#define BLE_GAP_SCAN_BUFFER_MAX (31) /**< Maximum data length for an + advertising set. */ +#define BLE_GAP_SCAN_BUFFER_EXTENDED_MIN (255) /**< Minimum data length for an + extended advertising set. */ +#define BLE_GAP_SCAN_BUFFER_EXTENDED_MAX (1650) /**< Maximum data length for an + extended advertising set. + @note Extended scanning is only + supported as an experimental + feature in this SoftDevice. + The scanner will only receive + advertising data up to 31 bytes. */ +/** @} */ /**@defgroup BLE_GAP_ADV_TYPES GAP Advertising types + * + * Advertising types defined in Bluetooth Core Specification v5.0, Vol 6, Part B, Section 4.4.2. + * + * The maximum advertising data length is defined by @ref BLE_GAP_ADV_SET_DATA_SIZE_MAX. + * Note that some of the advertising types do not support advertising data. Non-scannable types do not support + * scan response data. + * * @{ */ -#define BLE_GAP_ADV_TYPE_ADV_IND 0x00 /**< Connectable undirected. */ -#define BLE_GAP_ADV_TYPE_ADV_DIRECT_IND 0x01 /**< Connectable directed. */ -#define BLE_GAP_ADV_TYPE_ADV_SCAN_IND 0x02 /**< Scannable undirected. */ -#define BLE_GAP_ADV_TYPE_ADV_NONCONN_IND 0x03 /**< Non connectable undirected. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED 0x01 /**< Connectable and scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE 0x02 /**< Connectable non-scannable directed advertising + events. Advertising interval is less that 3.75 ms. + Use this type for fast reconnections. + @note Advertising data is not supported. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED 0x03 /**< Connectable non-scannable directed advertising + events. + @note Advertising data is not supported. */ +#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x04 /**< Non-connectable scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x05 /**< Non-connectable non-scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED 0x06 /**< Connectable non-scannable undirected advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_DIRECTED 0x07 /**< Connectable non-scannable directed advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x08 /**< Non-connectable scannable undirected advertising + events using extended advertising PDUs. + @note Only scan response data is supported. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_DIRECTED 0x09 /**< Non-connectable scannable directed advertising + events using extended advertising PDUs. + @note Only scan response data is supported. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x0A /**< Non-connectable non-scannable undirected advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED 0x0B /**< Non-connectable non-scannable directed advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ /**@} */ - /**@defgroup BLE_GAP_ADV_FILTER_POLICIES GAP Advertising filter policies * @{ */ #define BLE_GAP_ADV_FP_ANY 0x00 /**< Allow scan requests and connect requests from any device. */ @@ -314,11 +421,34 @@ enum BLE_GAP_CFGS #define BLE_GAP_ADV_FP_FILTER_BOTH 0x03 /**< Filter both scan and connect requests with whitelist. */ /**@} */ - -/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values +/**@defgroup BLE_GAP_ADV_DATA_STATUS GAP Advertising data status * @{ */ -#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (180) /**< Maximum advertising time in limited discoverable mode (TGAP(lim_adv_timeout) = 180 s). */ -#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. */ +#define BLE_GAP_ADV_DATA_STATUS_COMPLETE 0x00 /**< All data in the advertising event have been received. */ +#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA 0x01 /**< More data to be received. */ +#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED 0x02 /**< Incomplete data. Buffer size insufficient to receive more. */ +#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MISSED 0x03 /**< Failed to receive the remaining data. */ +/**@} */ + +/**@defgroup BLE_GAP_SCAN_FILTER_POLICIES GAP Scanner filter policies + * @{ */ +#define BLE_GAP_SCAN_FP_ACCEPT_ALL 0x00 /**< Accept all advertising packets except directed advertising packets + not addressed to this device. */ +#define BLE_GAP_SCAN_FP_WHITELIST 0x01 /**< Accept advertising packets from devices in the whitelist except directed + packets not addressed to this device. */ +#define BLE_GAP_SCAN_FP_ALL_NOT_RESOLVED_DIRECTED 0x02 /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_ACCEPT_ALL. + In addition, accept directed advertising packets, where the advertiser's + address is a resolvable private address that cannot be resolved. */ +#define BLE_GAP_SCAN_FP_WHITELIST_NOT_RESOLVED_DIRECTED 0x03 /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_WHITELIST. + In addition, accept directed advertising packets, where the advertiser's + address is a resolvable private address that cannot be resolved. */ +/**@} */ + +/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values in 10 ms units + * @{ */ +#define BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX (128) /**< Maximum high duty advertising time in 10 ms units. Corresponds to 1.28 s. */ +#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (18000) /**< Maximum advertising time in 10 ms units corresponding to TGAP(lim_adv_timeout) = 180 s in limited discoverable mode. */ +#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. + For high duty cycle advertising, this corresponds to @ref BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX. */ /**@} */ @@ -419,9 +549,18 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_PHYS GAP PHYs * @{ */ +#define BLE_GAP_PHY_AUTO 0x00 /**< Automatic PHY selection. Refer @ref sd_ble_gap_phy_update for more information.*/ #define BLE_GAP_PHY_1MBPS 0x01 /**< 1 Mbps PHY. */ #define BLE_GAP_PHY_2MBPS 0x02 /**< 2 Mbps PHY. */ #define BLE_GAP_PHY_CODED 0x04 /**< Coded PHY. */ +#define BLE_GAP_PHY_NOT_SET 0xFF /**< PHY is not configured. */ + +/**@brief Supported PHYs in connections, for scanning, and for advertising. */ +#define BLE_GAP_PHYS_SUPPORTED (BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS | BLE_GAP_PHY_CODED) /**< All PHYs are supported. + @note Coded PHY is only supported + as an experimental feature + in this SoftDevice. */ + /**@} */ /**@defgroup BLE_GAP_CONN_SEC_MODE_SET_MACROS GAP attribute security requirement setters @@ -479,8 +618,9 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_EVENT_LENGTH GAP event length defines. * @{ */ -#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ -#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ +#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ +#define BLE_GAP_EVENT_LENGTH_CODED_PHY_MIN (6) /**< The shortest event length in 1.25 ms units supporting LE Coded PHY. */ +#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ /**@} */ @@ -490,32 +630,80 @@ enum BLE_GAP_CFGS #define BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT (3) /**< Default maximum number of connections concurrently acting as centrals. */ #define BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT (1) /**< Default number of SMP instances shared between all connections acting as centrals. */ #define BLE_GAP_ROLE_COUNT_COMBINED_MAX (20) /**< Maximum supported number of concurrent connections in the peripheral and central roles combined. */ + /**@} */ - - - /**@brief Automatic data length parameter. */ #define BLE_GAP_DATA_LENGTH_AUTO 0 +/**@defgroup BLE_GAP_AUTH_PAYLOAD_TIMEOUT Authenticated payload timeout defines. + * @{ */ +#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX (48000) /**< Maximum authenticated payload timeout in 10 ms units, i.e. 8 minutes. */ +#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MIN (1) /**< Minimum authenticated payload timeout in 10 ms units, i.e. 10 ms. */ +/**@} */ /**@defgroup GAP_SEC_MODES GAP Security Modes * @{ */ #define BLE_GAP_SEC_MODE 0x00 /**< No key (may be used to reject). */ /**@} */ + +/**@brief The total number of channels in Bluetooth Low Energy. */ +#define BLE_GAP_CHANNEL_COUNT (40) + +/**@defgroup BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS Quality of Service (QoS) Channel survey interval defines + * @{ */ +#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS (0) /**< Continuous channel survey. */ +#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MIN_US (7500) /**< Minimum channel survey interval in microseconds (7.5 ms). */ +#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MAX_US (4000000) /**< Maximum channel survey interval in microseconds (4 s). */ + /**@} */ + /** @} */ /**@addtogroup BLE_GAP_STRUCTURES Structures * @{ */ +/**@brief Advertising event properties. */ +typedef struct +{ + uint8_t type; /**< Advertising type. See @ref BLE_GAP_ADV_TYPES. */ + uint8_t anonymous : 1; /**< Omit advertiser's address from all PDUs. + @note Anonymous advertising is only available for + @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED and + @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED. */ + uint8_t include_tx_power : 1; /**< Include TxPower set by @ref sd_ble_gap_tx_power_set in the extended header + of the advertising PDU. + @note TxPower can only be added to the extended header when @ref type is an extended advertising type. */ +} ble_gap_adv_properties_t; + + +/**@brief Advertising report type. */ +typedef struct +{ + uint16_t connectable : 1; /**< Connectable advertising event type. */ + uint16_t scannable : 1; /**< Scannable advertising event type. */ + uint16_t directed : 1; /**< Directed advertising event type. */ + uint16_t scan_response : 1; /**< Received a scan response. */ + uint16_t extended_pdu : 1; /**< Received an extended advertising set. */ + uint16_t status : 2; /**< Data status. See @ref BLE_GAP_ADV_DATA_STATUS. */ + uint16_t reserved : 9; /**< Reserved for future use. */ +} ble_gap_adv_report_type_t; + +/**@brief Advertising Auxiliary Pointer. */ +typedef struct +{ + uint16_t aux_offset; /**< Time offset from the beginning of advertising packet to the auxiliary packet in 100 us units. */ + uint8_t aux_phy; /**< Indicates the PHY on which the auxiliary advertising packet is sent. See @ref BLE_GAP_PHYS. */ +} ble_gap_aux_pointer_t; + /**@brief Bluetooth Low Energy address. */ typedef struct { uint8_t addr_id_peer : 1; /**< Only valid for peer addresses. Reference to peer in device identities list (as set with @ref sd_ble_gap_device_identities_set) when peer is using privacy. */ uint8_t addr_type : 7; /**< See @ref BLE_GAP_ADDR_TYPES. */ - uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format. */ + uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format. + addr is not used if addr_type is @ref BLE_GAP_ADDR_TYPE_ANONYMOUS. */ } ble_gap_addr_t; @@ -545,7 +733,7 @@ typedef struct * Security Mode 1 Level 1: No security is needed (aka open link).\n * Security Mode 1 Level 2: Encrypted link required, MITM protection not necessary.\n * Security Mode 1 Level 3: MITM protected encrypted link required.\n - * Security Mode 1 Level 4: LESC MITM protected encrypted link required.\n + * Security Mode 1 Level 4: LESC MITM protected encrypted link using a 128-bit strength encryption key required.\n * Security Mode 2 Level 1: Signing or encryption required, MITM protection not necessary.\n * Security Mode 2 Level 2: MITM protected signing required, unless link is MITM protected encrypted.\n */ @@ -571,48 +759,155 @@ typedef struct } ble_gap_irk_t; -/**@brief Channel mask for RF channels used in advertising. */ -typedef struct -{ - uint8_t ch_37_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 37 */ - uint8_t ch_38_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 38 */ - uint8_t ch_39_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 39 */ -} ble_gap_adv_ch_mask_t; +/**@brief Channel mask (40 bits). + * Every channel is represented with a bit positioned as per channel index defined in Bluetooth Core Specification v5.0, + * Vol 6, Part B, Section 1.4.1. The LSB contained in array element 0 represents channel index 0, and bit 39 represents + * channel index 39. If a bit is set to 1, the channel is not used. + */ +typedef uint8_t ble_gap_ch_mask_t[5]; /**@brief GAP advertising parameters. */ typedef struct { - uint8_t type; /**< See @ref BLE_GAP_ADV_TYPES. */ - ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. - - When privacy is enabled and the local device use @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, the device identity list is searched for a matching - entry. If the local IRK for that device identity is set, the local IRK for that device will be used to generate the advertiser address field in the advertise packet. - - If type is @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this must be set to the targeted initiator. If the initiator is in the device identity list, - the peer IRK for that device will be used to generate the initiator address field in the ADV_DIRECT_IND packet. */ - uint8_t fp; /**< Filter Policy, see @ref BLE_GAP_ADV_FILTER_POLICIES. */ - uint16_t interval; /**< Advertising interval between 0x0020 and 0x4000 in 0.625 ms units (20 ms to 10.24 s), see @ref BLE_GAP_ADV_INTERVALS. - - If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this parameter must be set to 0 for high duty cycle directed advertising. - - If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, set @ref BLE_GAP_ADV_INTERVAL_MIN <= interval <= @ref BLE_GAP_ADV_INTERVAL_MAX for low duty cycle advertising.*/ - uint16_t timeout; /**< Advertising timeout between 0x0001 and 0x3FFF in seconds, 0x0000 disables timeout. See also @ref BLE_GAP_ADV_TIMEOUT_VALUES. If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this parameter must be set to 0 for High duty cycle directed advertising. */ - ble_gap_adv_ch_mask_t channel_mask; /**< Advertising channel mask. See @ref ble_gap_adv_ch_mask_t. */ + ble_gap_adv_properties_t properties; /**< The properties of the advertising events. */ + ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. + @note ble_gap_addr_t::addr_type cannot be + @ref BLE_GAP_ADDR_TYPE_ANONYMOUS. + - When privacy is enabled and the local device uses + @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, + the device identity list is searched for a matching entry. If + the local IRK for that device identity is set, the local IRK + for that device will be used to generate the advertiser address + field in the advertising packet. + - If @ref ble_gap_adv_properties_t::type is directed, this must be + set to the targeted scanner or initiator. If the peer address is + in the device identity list, the peer IRK for that device will be + used to generate @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE + target addresses used in the advertising event PDUs. */ + uint32_t interval; /**< Advertising interval in 625 us units. @sa BLE_GAP_ADV_INTERVALS. + @note If @ref ble_gap_adv_properties_t::type is set to + @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE + advertising, this parameter is ignored. */ + uint16_t duration; /**< Advertising duration in 10 ms units. When timeout is reached, + an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. + @sa BLE_GAP_ADV_TIMEOUT_VALUES. */ + uint8_t max_adv_evts; /**< Maximum advertising events that shall be sent prior to disabling + advertising. Setting the value to 0 disables the limitation. When + the count of advertising events specified by this parameter + (if not 0) is reached, advertising will be automatically stopped + and an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised + @note If @ref ble_gap_adv_properties_t::type is set to + @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE, + this parameter is ignored. + @note Setting max_adv_evts to a values not equal to 0 is only supported + as an experimental feature in this SoftDevice. */ + ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary and secondary advertising channels. + At least one of the primary channels, that is channel index 37-39, must be used. + Masking away secondary advertising channels is not supported. */ + uint8_t filter_policy; /**< Filter Policy. @sa BLE_GAP_ADV_FILTER_POLICIES. */ + uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising channel packets + are transmitted. If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS + will be used. + Valid values are @ref BLE_GAP_PHY_1MBPS and @ref BLE_GAP_PHY_CODED. + @note The primary_phy shall indicate @ref BLE_GAP_PHY_1MBPS if + @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ + uint8_t secondary_phy; /**< Indicates the PHY on which the secondary advertising channel packets + are transmitted. + If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS will be used. + Valid values are + @ref BLE_GAP_PHY_1MBPS, @ref BLE_GAP_PHY_2MBPS, and @ref BLE_GAP_PHY_CODED. + If @ref ble_gap_adv_properties_t::type is an extended advertising type + and connectable, this is the PHY that will be used to establish a + connection and send AUX_ADV_IND packets on. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ + uint8_t set_id:4; /**< The advertising set identifier distinguishes this advertising set from other + advertising sets transmitted by this and other devices. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ + uint8_t scan_req_notification:1; /**< Enable scan request notifications for this advertising set. When a + scan request is received and the scanner address is allowed + by the filter policy, @ref BLE_GAP_EVT_SCAN_REQ_REPORT is raised. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is a non-scannable + advertising type. */ } ble_gap_adv_params_t; +/**@brief GAP advertising data buffers. + * + * The application must provide the buffers for advertisement. The memory shall reside in application RAM, and + * shall never be modified while advertising. The data shall be kept alive until either: + * - @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. + * - @ref BLE_GAP_EVT_CONNECTED is raised with @ref ble_gap_evt_connected_t::adv_handle set to the corresponding + * advertising handle. + * - Advertising is stopped. + * - Advertising data is changed. + * To update advertising data while advertising, provide new buffers to @ref sd_ble_gap_adv_set_configure. */ +typedef struct +{ + ble_data_t adv_data; /**< Advertising data. + @note + Advertising data can only be specified for a @ref ble_gap_adv_properties_t::type + that is allowed to contain advertising data. */ + ble_data_t scan_rsp_data; /**< Scan response data. + @note + Scan response data can only be specified for a @ref ble_gap_adv_properties_t::type + that is scannable. */ +} ble_gap_adv_data_t; + + /**@brief GAP scanning parameters. */ typedef struct { - uint8_t active : 1; /**< If 1, perform active scanning (scan requests). */ - uint8_t use_whitelist : 1; /**< If 1, filter advertisers using current active whitelist. */ - uint8_t adv_dir_report : 1; /**< If 1, also report directed advertisements where the initiator field is set to a private resolvable address, - even if the address did not resolve to an entry in the device identity list. A report will be generated - even if the peer is not in the whitelist. */ - uint16_t interval; /**< Scan interval between 0x0004 and 0x4000 in 0.625 ms units (2.5 ms to 10.24 s). */ - uint16_t window; /**< Scan window between 0x0004 and 0x4000 in 0.625 ms units (2.5 ms to 10.24 s). */ - uint16_t timeout; /**< Scan timeout between 0x0001 and 0xFFFF in seconds, 0x0000 disables timeout. */ + uint8_t extended : 1; /**< If 1, the scanner will accept extended advertising packets. + If set to 0, the scanner will not receive advertising packets + on secondary advertising channels, and will not be able + to receive long advertising PDUs. + @note Extended scanning is only supported as an experimental feature in this + SoftDevice. */ + uint8_t report_incomplete_evts : 1; /**< If 1, events of type @ref ble_gap_evt_adv_report_t may have + @ref ble_gap_adv_report_type_t::status set to + @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. + This parameter is ignored when used with @ref sd_ble_gap_connect + @note This may be used to abort receiving more packets from an extended + advertising event, and is only available for extended + scanning, see @ref sd_ble_gap_scan_start. + @note This feature is not supported by this SoftDevice. */ + uint8_t active : 1; /**< If 1, perform active scanning by sending scan requests. + This parameter is ignored when used with @ref sd_ble_gap_connect. */ + uint8_t filter_policy : 2; /**< Scanning filter policy. @sa BLE_GAP_SCAN_FILTER_POLICIES. + @note Only @ref BLE_GAP_SCAN_FP_ACCEPT_ALL and + @ref BLE_GAP_SCAN_FP_WHITELIST are valid when used with + @ref sd_ble_gap_connect */ + uint8_t scan_phys; /**< Bitfield of PHYs to scan on. If set to @ref BLE_GAP_PHY_AUTO, + scan_phys will default to @ref BLE_GAP_PHY_1MBPS. + - If @ref ble_gap_scan_params_t::extended is set to 0, the only + supported PHY is @ref BLE_GAP_PHY_1MBPS. + - When used with @ref sd_ble_gap_scan_start, + the bitfield indicates the PHYs the scanner will use for scanning + on primary advertising channels. The scanner will accept + @ref BLE_GAP_PHYS_SUPPORTED as secondary advertising channel PHYs. + - When used with @ref sd_ble_gap_connect, the + bitfield indicates the PHYs on where a connection may be initiated. + If scan_phys contains @ref BLE_GAP_PHY_1MBPS and/or @ref BLE_GAP_PHY_2MBPS, + the primary scan PHY is @ref BLE_GAP_PHY_1MBPS. + If scan_phys also contains @ref BLE_GAP_PHY_CODED, the primary scan + PHY will also contain @ref BLE_GAP_PHY_CODED. If the only scan PHY is + @ref BLE_GAP_PHY_CODED, the primary scan PHY is + @ref BLE_GAP_PHY_CODED only. */ + uint16_t interval; /**< Scan interval in 625 us units. @sa BLE_GAP_SCAN_INTERVALS. */ + uint16_t window; /**< Scan window in 625 us units. @sa BLE_GAP_SCAN_WINDOW. */ + uint16_t timeout; /**< Scan timeout in 10 ms units. @sa BLE_GAP_SCAN_TIMEOUT. */ + ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary and secondary advertising channels. + At least one of the primary channels, that is channel index 37-39, must be + set to 0. + Masking away secondary channels is not supported. */ } ble_gap_scan_params_t; -/**@brief Device Privacy. +/**@brief Privacy. * * The privacy feature provides a way for the device to avoid being tracked over a period of time. * The privacy feature, when enabled, hides the local device identity and replaces it with a private address @@ -622,6 +917,9 @@ typedef struct * With this key, a device can generate a random private address that can only be recognized by peers in possession of that key, * and devices can establish connections without revealing their real identities. * + * Both network privacy (@ref BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY) and device privacy (@ref BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY) + * are supported. + * * @note If the device IRK is updated, the new IRK becomes the one to be distributed in all * bonding procedures performed after @ref sd_ble_gap_privacy_set returns. * The IRK distributed during bonding procedure is the device IRK that is active when @ref sd_ble_gap_sec_params_reply is called. @@ -637,8 +935,8 @@ typedef struct } ble_gap_privacy_params_t; -/**@brief Physical Layer configuration - * @note tx_phys and rx_phys are bitfields, to indicate multiple preferred PHYs for each direction they can be ORed together. +/**@brief PHY preferences for TX and RX + * @note tx_phys and rx_phys are bit fields. Multiple bits can be set in them to indicate multiple preferred PHYs for each direction. * @code * p_gap_phys->tx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; * p_gap_phys->rx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; @@ -736,6 +1034,12 @@ typedef struct and the address is the device's identity address. */ uint8_t role; /**< BLE role for this connection, see @ref BLE_GAP_ROLES */ ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ + uint8_t adv_handle; /**< Advertising handle in which advertising has ended. + This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ + ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated + advertising set. The advertising buffers provided in + @ref sd_ble_gap_adv_set_configure are now released. + This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ } ble_gap_evt_connected_t; @@ -752,10 +1056,16 @@ typedef struct ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ } ble_gap_evt_conn_param_update_t; +/**@brief Event structure for @ref BLE_GAP_EVT_PHY_UPDATE_REQUEST. */ +typedef struct +{ + ble_gap_phys_t peer_preferred_phys; /**< The PHYs the peer prefers to use. */ +} ble_gap_evt_phy_update_request_t; + /**@brief Event Structure for @ref BLE_GAP_EVT_PHY_UPDATE. */ typedef struct { - uint8_t status; /**< Status of the procedure, see @ref BLE_HCI_STATUS_CODES */ + uint8_t status; /**< Status of the procedure, see @ref BLE_HCI_STATUS_CODES.*/ uint8_t tx_phy; /**< TX PHY for this connection, see @ref BLE_GAP_PHYS. */ uint8_t rx_phy; /**< RX PHY for this connection, see @ref BLE_GAP_PHYS. */ } ble_gap_evt_phy_update_t; @@ -881,6 +1191,7 @@ typedef struct uint8_t auth_status; /**< Authentication status, see @ref BLE_GAP_SEC_STATUS. */ uint8_t error_src : 2; /**< On error, source that caused the failure, see @ref BLE_GAP_SEC_STATUS_SOURCES. */ uint8_t bonded : 1; /**< Procedure resulted in a bond. */ + uint8_t lesc : 1; /**< Procedure resulted in a LE Secure Connection. */ ble_gap_sec_levels_t sm1_levels; /**< Levels supported in Security Mode 1. */ ble_gap_sec_levels_t sm2_levels; /**< Levels supported in Security Mode 2. */ ble_gap_sec_kdist_t kdist_own; /**< Bitmap stating which keys were exchanged (distributed) by the local device. If bonding with LE Secure Connections, the enc bit will be always set. */ @@ -899,28 +1210,82 @@ typedef struct typedef struct { uint8_t src; /**< Source of timeout event, see @ref BLE_GAP_TIMEOUT_SOURCES. */ + union + { + ble_data_t adv_report_buffer; /**< If source is set to @ref BLE_GAP_TIMEOUT_SRC_SCAN, the released + scan buffer is contained in this field. */ + } params; /**< Event Parameters. */ } ble_gap_evt_timeout_t; /**@brief Event structure for @ref BLE_GAP_EVT_RSSI_CHANGED. */ typedef struct { - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ + int8_t rssi; /**< Received Signal Strength Indication in dBm. + @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement. */ + uint8_t ch_index; /**< Data Channel Index on which the Signal Strength is measured (0-36). */ } ble_gap_evt_rssi_changed_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_ADV_REPORT. */ +/**@brief Event structure for @ref BLE_GAP_EVT_ADV_SET_TERMINATED */ typedef struct { - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 - and the address is the device's identity address. */ - ble_gap_addr_t direct_addr; /**< Set when the scanner is unable to resolve the private resolvable address of the initiator - field of a directed advertisement packet and the scanner has been enabled to report this in @ref ble_gap_scan_params_t::adv_dir_report. */ - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ - uint8_t scan_rsp : 1; /**< If 1, the report corresponds to a scan response and the type field may be ignored. */ - uint8_t type : 2; /**< See @ref BLE_GAP_ADV_TYPES. Only valid if the scan_rsp field is 0. */ - uint8_t dlen : 5; /**< Advertising or scan response data length. */ - uint8_t data[BLE_GAP_ADV_MAX_SIZE]; /**< Advertising or scan response data. */ + uint8_t reason; /**< Reason for why the advertising set terminated. See + @ref BLE_GAP_EVT_ADV_SET_TERMINATED_REASON. */ + uint8_t adv_handle; /**< Advertising handle in which advertising has ended. */ + uint8_t num_completed_adv_events; /**< If @ref ble_gap_adv_params_t::max_adv_evts was not set to 0, + this field indicates the number of completed advertising events. */ + ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated + advertising set. The advertising buffers provided in + @ref sd_ble_gap_adv_set_configure are now released. */ +} ble_gap_evt_adv_set_terminated_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_ADV_REPORT. + * + * @note If @ref ble_gap_adv_report_type_t::status is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, + * not all fields in the advertising report may be available. + * + * @note When ble_gap_adv_report_type_t::status is not set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, + * scanning will be paused. To continue scanning, call @ref sd_ble_gap_scan_start. + */ +typedef struct +{ + ble_gap_adv_report_type_t type; /**< Advertising report type. See @ref ble_gap_adv_report_type_t. */ + ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr is resolved: + @ref ble_gap_addr_t::addr_id_peer is set to 1 and the address is the + peer's identity address. */ + ble_gap_addr_t direct_addr; /**< Contains the target address of the advertising event if + @ref ble_gap_adv_report_type_t::directed is set to 1. If the + SoftDevice was able to resolve the address, + @ref ble_gap_addr_t::addr_id_peer is set to 1 and the direct_addr + contains the local identity address. If the target address of the + advertising event is @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE, + and the SoftDevice was unable to resolve it, the application may try + to resolve this address to find out if the advertising event was + directed to us. */ + uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising packet was received on. + See @ref BLE_GAP_PHYS. */ + uint8_t secondary_phy; /**< Indicates the PHY on which the secondary advertising packet was received on. + See @ref BLE_GAP_PHYS. This field is to 0 if no packets where received on + a secondary advertising channel. */ + int8_t tx_power; /**< TX Power reported by the advertiser in the last packet header received. + This field is set to @ref BLE_GAP_POWER_LEVEL_INVALID if the + last received packet did not contain the Tx Power field. + @note TX Power is only included in extended advertising packets. */ + int8_t rssi; /**< Received Signal Strength Indication in dBm of the last packet received. + @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement. */ + uint8_t ch_index; /**< Channel Index on which the last advertising packet is received (0-39). */ + uint8_t set_id; /**< Set ID of the received advertising data. Set ID is not present + if set to @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */ + uint16_t data_id:12; /**< The advertising data ID of the received advertising data. Data ID + is not present if @ref ble_gap_evt_adv_report_t::set_id is set to + @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */ + ble_data_t data; /**< Received advertising or scan response data. If + @ref ble_gap_adv_report_type_t::status is not set to + @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the data buffer provided + in @ref sd_ble_gap_scan_start is now released. */ + ble_gap_aux_pointer_t aux_pointer; /**< The offset and PHY of the next advertising packet in this extended advertising + event. @note This field is only set if @ref ble_gap_adv_report_type_t::status + is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. */ } ble_gap_evt_adv_report_t; @@ -944,11 +1309,14 @@ typedef struct /**@brief Event structure for @ref BLE_GAP_EVT_SCAN_REQ_REPORT. */ typedef struct { - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ + uint8_t adv_handle; /**< Advertising handle for the advertising set which received the Scan Request */ + int8_t rssi; /**< Received Signal Strength Indication in dBm. + @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement. */ ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 and the address is the device's identity address. */ } ble_gap_evt_scan_req_report_t; + /**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST. */ typedef struct { @@ -962,6 +1330,15 @@ typedef struct } ble_gap_evt_data_length_update_t; +/**@brief Event structure for @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT. */ +typedef struct +{ + int8_t channel_energy[BLE_GAP_CHANNEL_COUNT]; /**< The measured energy on the Bluetooth Low Energy + channels, in dBm, indexed by Channel Index. + If no measurement is available for the given channel, channel_energy is set to + @ref BLE_GAP_POWER_LEVEL_INVALID. */ +} ble_gap_evt_qos_channel_survey_report_t; + /**@brief GAP event structure. */ typedef struct { @@ -982,12 +1359,15 @@ typedef struct ble_gap_evt_timeout_t timeout; /**< Timeout Event Parameters. */ ble_gap_evt_rssi_changed_t rssi_changed; /**< RSSI Event Parameters. */ ble_gap_evt_adv_report_t adv_report; /**< Advertising Report Event Parameters. */ + ble_gap_evt_adv_set_terminated_t adv_set_terminated; /**< Advertising Set Terminated Event Parameters. */ ble_gap_evt_sec_request_t sec_request; /**< Security Request Event Parameters. */ ble_gap_evt_conn_param_update_request_t conn_param_update_request; /**< Connection Parameter Update Parameters. */ ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report Parameters. */ + ble_gap_evt_phy_update_request_t phy_update_request; /**< PHY Update Request Event Parameters. */ ble_gap_evt_phy_update_t phy_update; /**< PHY Update Parameters. */ ble_gap_evt_data_length_update_request_t data_length_update_request; /**< Data Length Update Request Event Parameters. */ ble_gap_evt_data_length_update_t data_length_update; /**< Data Length Update Event Parameters. */ + ble_gap_evt_qos_channel_survey_report_t qos_channel_survey_report; /**< Quality of Service (QoS) Channel Survey Report Parameters. */ } params; /**< Event Parameters. */ } ble_gap_evt_t; @@ -1020,21 +1400,27 @@ typedef struct * large. The maximum supported sum of concurrent connections is * @ref BLE_GAP_ROLE_COUNT_COMBINED_MAX. * @retval ::NRF_ERROR_INVALID_PARAM central_sec_count is larger than central_role_count. + * @retval ::NRF_ERROR_RESOURCES The adv_set_count is too large. The maximum + * supported advertising handles is + * @ref BLE_GAP_ADV_SET_COUNT_MAX. */ typedef struct { + uint8_t adv_set_count; /**< Maximum number of advertising sets. Default value is @ref BLE_GAP_ADV_SET_COUNT_DEFAULT. */ uint8_t periph_role_count; /**< Maximum number of connections concurrently acting as a peripheral. Default value is @ref BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT. */ uint8_t central_role_count; /**< Maximum number of connections concurrently acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT. */ uint8_t central_sec_count; /**< Number of SMP instances shared between all connections acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT. */ + uint8_t qos_channel_survey_role_available:1; /**< If set, the Quality of Service (QoS) channel survey module is available to the + application using @ref sd_ble_gap_qos_channel_survey_start. */ } ble_gap_cfg_role_count_t; /** * @brief Device name and its properties, set with @ref sd_ble_cfg_set. * - * @note If the device name is not configured, the default device name will be @ref - * BLE_GAP_DEVNAME_DEFAULT, the maximum device name length will be @ref - * BLE_GAP_DEVNAME_DEFAULT_LEN, vloc will be set to @ref BLE_GATTS_VLOC_STACK and the device name + * @note If the device name is not configured, the default device name will be + * @ref BLE_GAP_DEVNAME_DEFAULT, the maximum device name length will be + * @ref BLE_GAP_DEVNAME_DEFAULT_LEN, vloc will be set to @ref BLE_GATTS_VLOC_STACK and the device name * will have no write access. * * @note If @ref max_len is more than @ref BLE_GAP_DEVNAME_DEFAULT_LEN and vloc is set to @ref BLE_GATTS_VLOC_STACK, @@ -1076,24 +1462,26 @@ typedef union /**@brief Channel Map option. - * Used with @ref sd_ble_opt_get to get the current channel map - * or @ref sd_ble_opt_set to set a new channel map. When setting the - * channel map, it applies to all current and future connections. When getting the - * current channel map, it applies to a single connection and the connection handle - * must be supplied. * - * @note Setting the channel map may take some time, depending on connection parameters. - * The time taken may be different for each connection and the get operation will - * return the previous channel map until the new one has taken effect. + * @details Used with @ref sd_ble_opt_get to get the current channel map + * or @ref sd_ble_opt_set to set a new channel map. When setting the + * channel map, it applies to all current and future connections. When getting the + * current channel map, it applies to a single connection and the connection handle + * must be supplied. * - * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. - * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. + * @note Setting the channel map may take some time, depending on connection parameters. + * The time taken may be different for each connection and the get operation will + * return the previous channel map until the new one has taken effect. + * + * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. + * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. * * @retval ::NRF_SUCCESS Get or set successful. + * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: + * - Less then two bits in @ref ch_map are set. + * - Bits for primary advertising channels (37-39) are set. * @retval ::NRF_ERROR_BUSY Channel map was set again before enough time had passed. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied for get. - * @retval ::NRF_ERROR_NOT_SUPPORTED Returned by sd_ble_opt_set in peripheral-only SoftDevices. * */ typedef struct @@ -1105,21 +1493,21 @@ typedef struct /**@brief Local connection latency option. * - * Local connection latency is a feature which enables the slave to improve - * current consumption by ignoring the slave latency set by the peer. The - * local connection latency can only be set to a multiple of the slave latency, - * and cannot be longer than half of the supervision timeout. + * @details Local connection latency is a feature which enables the slave to improve + * current consumption by ignoring the slave latency set by the peer. The + * local connection latency can only be set to a multiple of the slave latency, + * and cannot be longer than half of the supervision timeout. * - * Used with @ref sd_ble_opt_set to set the local connection latency. The - * @ref sd_ble_opt_get is not supported for this option, but the actual - * local connection latency (unless set to NULL) is set as a return parameter - * when setting the option. + * @details Used with @ref sd_ble_opt_set to set the local connection latency. The + * @ref sd_ble_opt_get is not supported for this option, but the actual + * local connection latency (unless set to NULL) is set as a return parameter + * when setting the option. * - * @note The latency set will be truncated down to the closest slave latency event - * multiple, or the nearest multiple before half of the supervision timeout. + * @note The latency set will be truncated down to the closest slave latency event + * multiple, or the nearest multiple before half of the supervision timeout. * - * @note The local connection latency is disabled by default, and needs to be enabled for new - * connections and whenever the connection is updated. + * @note The local connection latency is disabled by default, and needs to be enabled for new + * connections and whenever the connection is updated. * * @retval ::NRF_SUCCESS Set successfully. * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. @@ -1134,8 +1522,9 @@ typedef struct /**@brief Disable slave latency * - * Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. - * When disabled, the peripheral will ignore the slave_latency set by the central. + * @details Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection + * (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. When disabled, the + * peripheral will ignore the slave_latency set by the central. * * @note Shall only be called on peripheral links. * @@ -1151,13 +1540,13 @@ typedef struct /**@brief Passkey Option. * - * Structure containing the passkey to be used during pairing. This can be used with @ref - * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication - * instead of generating a random one. + * @details Structure containing the passkey to be used during pairing. This can be used with @ref + * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication + * instead of generating a random one. * - * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. + * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. * - * @note @ref sd_ble_opt_get is not supported for this option. + * @note @ref sd_ble_opt_get is not supported for this option. * */ typedef struct @@ -1166,31 +1555,17 @@ typedef struct } ble_gap_opt_passkey_t; -/**@brief Scan request report option. - * - * This can be used with @ref sd_ble_opt_set to make the SoftDevice send - * @ref BLE_GAP_EVT_SCAN_REQ_REPORT events. - * - * @note Due to the limited space reserved for scan request report events, - * not all received scan requests will be reported. - * - * @note If whitelisting is used, only whitelisted requests are reported. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_STATE When advertising is ongoing while the option is set. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable scan request reports. */ -} ble_gap_opt_scan_req_report_t; - /**@brief Compatibility mode 1 option. * - * This can be used with @ref sd_ble_opt_set to enable and disable - * compatibility mode 1. Compatibility mode 1 is disabled by default. + * @details This can be used with @ref sd_ble_opt_set to enable and disable + * compatibility mode 1. Compatibility mode 1 is disabled by default. * - * @note Compatibility mode 1 enables interoperability with devices that do not support - * a value of 0 for the WinOffset parameter in the Link Layer CONNECT_REQ packet. + * @note Compatibility mode 1 enables interoperability with devices that do not support a value of + * 0 for the WinOffset parameter in the Link Layer CONNECT_IND packet. This applies to a + * limited set of legacy peripheral devices from another vendor. Enabling this compatibility + * mode will only have an effect if the local device will act as a central device and + * initiate a connection to a peripheral device. In that case it may lead to the connection + * creation taking up to one connection interval longer to complete for all connections. * * @retval ::NRF_SUCCESS Set successfully. * @retval ::NRF_ERROR_INVALID_STATE When connection creation is ongoing while mode 1 is set. @@ -1200,37 +1575,21 @@ typedef struct uint8_t enable : 1; /**< Enable compatibility mode 1.*/ } ble_gap_opt_compat_mode_1_t; -/**@brief Compatibility mode 2 option. - * - * This can be used with @ref sd_ble_opt_set to enable compatibility mode 2. - * Compatibility mode 2 is disabled by default. - * - * @note Compatibility mode 2 enables interoperability with devices that initiate Feature exchange - * and version exchange procedure in parallel. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_PARAM if enable bit is not set to 1. Currently only enabling is supported. - * @retval ::NRF_ERROR_INVALID_STATE When any role is running while mode 2 is set. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable compatibility mode 2.*/ -} ble_gap_opt_compat_mode_2_t; - /**@brief Authenticated payload timeout option. * - * This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other than the default of 8 minutes. + * @details This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other + * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. * - * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated - * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted - * link. + * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated + * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted + * link. * - * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance - * to reset the timer. In addition the stack will try to prioritize running of LE ping over other - * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects - * on other activities, it is recommended to use high timeout values. - * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). + * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance + * to reset the timer. In addition the stack will try to prioritize running of LE ping over other + * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects + * on other activities, it is recommended to use high timeout values. + * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). * * @retval ::NRF_SUCCESS Set successfully. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. auth_payload_timeout was outside of allowed range. @@ -1239,54 +1598,17 @@ typedef struct typedef struct { uint16_t conn_handle; /**< Connection Handle */ - uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit. Maximum is 48 000 (=480 000 ms =8 min). Minimum is 1 (=10 ms). */ + uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit, see @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT. */ } ble_gap_opt_auth_payload_timeout_t; -/**@brief Preferred PHY option - * - * @details This can be used with @ref sd_ble_opt_set to change the preferred PHYs. Before this function is called the PHYs - * for peer initiated PHY Update procedure is @ref BLE_GAP_PHY_1MBPS. If @ref ble_gap_opt_preferred_phys_t::tx_phys or - * @ref ble_gap_opt_preferred_phys_t::rx_phys is 0, then the stack will select PHYs based on the peer requirements on that specific direction. - * - * @note The preferred PHYs are only valid for newly created connections after this option is called. If the PHYs should be - * changed for an existing link the @ref sd_ble_gap_phy_request would have to be called, and that would try to update the - * PHYs for the given link. - * - * @note tx_phys and rx_phys are bitfields, to indicate multiple preferred PHYs for each direction they can be ORed together. - * @code - * tx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; - * rx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; - * @endcode - * - * @events - * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update if initiated by peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_PHY_REQUEST} - * @mmsc{@ref BLE_GAP_PERIPHERAL_PHY_REQUEST} - * @endmscs - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - */ -typedef struct -{ - uint8_t tx_phys; /**< Preferred transmit PHYs, see @ref BLE_GAP_PHYS. */ - uint8_t rx_phys; /**< Preferred receive PHYs, see @ref BLE_GAP_PHYS. */ -} ble_gap_opt_preferred_phys_t; - /**@brief Option structure for GAP options. */ typedef union { ble_gap_opt_ch_map_t ch_map; /**< Parameters for the Channel Map option. */ ble_gap_opt_local_conn_latency_t local_conn_latency; /**< Parameters for the Local connection latency option */ ble_gap_opt_passkey_t passkey; /**< Parameters for the Passkey option.*/ - ble_gap_opt_scan_req_report_t scan_req_report; /**< Parameters for the scan request report option.*/ ble_gap_opt_compat_mode_1_t compat_mode_1; /**< Parameters for the compatibility mode 1 option.*/ - ble_gap_opt_compat_mode_2_t compat_mode_2; /**< Parameters for the compatibility mode 2 option.*/ ble_gap_opt_auth_payload_timeout_t auth_payload_timeout; /**< Parameters for the authenticated payload timeout option.*/ - ble_gap_opt_preferred_phys_t preferred_phys; /**< Parameters for the preferred PHYs option. */ ble_gap_opt_slave_latency_disable_t slave_latency_disable; /**< Parameters for the Disable slave latency option */ } ble_gap_opt_t; /**@} */ @@ -1299,7 +1621,8 @@ typedef union * * The local Bluetooth identity address is the address that identifies this device to other peers. * The address type must be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC. - * The identity address cannot be changed while roles are running. + * + * @note The identity address cannot be changed while advertising, scanning or creating a connection. * * @note This address will be distributed to the peer during bonding. * If the address changes, the address stored in the peer device will not be valid and the ability to @@ -1319,7 +1642,8 @@ typedef union * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address. * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_STATE The identity address cannot be changed while the roles are running. + * @retval ::NRF_ERROR_INVALID_STATE The identity address cannot be changed while advertising, + * scanning or creating a connection. */ SVCALL(SD_BLE_GAP_ADDR_SET, uint32_t, sd_ble_gap_addr_set(ble_gap_addr_t const *p_addr)); @@ -1396,7 +1720,7 @@ SVCALL(SD_BLE_GAP_DEVICE_IDENTITIES_SET, uint32_t, sd_ble_gap_device_identities_ /**@brief Set privacy settings. * - * @note Privacy settings cannot be set while BLE roles are running. + * @note Privacy settings cannot be changed while advertising, scanning or creating a connection. * * @param[in] p_privacy_params Privacy settings. * @@ -1412,16 +1736,18 @@ SVCALL(SD_BLE_GAP_DEVICE_IDENTITIES_SET, uint32_t, sd_ble_gap_device_identities_ * @retval ::NRF_ERROR_INVALID_ADDR The pointer to privacy settings is NULL or invalid. * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. * @retval ::NRF_ERROR_INVALID_PARAM Out of range parameters are provided. - * @retval ::NRF_ERROR_INVALID_STATE Privacy settings cannot be changed while BLE roles using privacy are enabled. + * @retval ::NRF_ERROR_INVALID_STATE Privacy settings cannot be changed while advertising, scanning + * or creating a connection. */ SVCALL(SD_BLE_GAP_PRIVACY_SET, uint32_t, sd_ble_gap_privacy_set(ble_gap_privacy_params_t const *p_privacy_params)); /**@brief Get privacy settings. * - * @note The privacy settings returned include the current device irk as well. + * @note ::ble_gap_privacy_params_t::p_device_irk must be initialized to NULL or a valid address before this function is called. + * If it is initialized to a valid address, the address pointed to will contain the current device IRK on return. * - * @param[in] p_privacy_params Privacy settings. + * @param[in,out] p_privacy_params Privacy settings. * * @retval ::NRF_SUCCESS Privacy settings read. * @retval ::NRF_ERROR_INVALID_ADDR The pointer given for returning the privacy settings may be NULL or invalid. @@ -1430,50 +1756,61 @@ SVCALL(SD_BLE_GAP_PRIVACY_SET, uint32_t, sd_ble_gap_privacy_set(ble_gap_privacy_ SVCALL(SD_BLE_GAP_PRIVACY_GET, uint32_t, sd_ble_gap_privacy_get(ble_gap_privacy_params_t *p_privacy_params)); -/**@brief Set, clear or update advertising and scan response data. +/**@brief Configure an advertising set. Set, clear or update advertising and scan response data. * * @note The format of the advertising data will be checked by this call to ensure interoperability. * Limitations imposed by this API call to the data provided include having a flags data type in the scan response data and * duplicating the local name in the advertising data and scan response data. * - * @note To clear the advertising data and set it to a 0-length packet, simply provide a valid pointer (p_data/p_sr_data) with its corresponding - * length (dlen/srdlen) set to 0. - * - * @note The call will fail if p_data and p_sr_data are both NULL since this would have no effect. + * @note In order to update advertising data while advertising, new advertising buffers must be provided. * * @mscs * @mmsc{@ref BLE_GAP_ADV_MSC} * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * - * @param[in] p_data Raw data to be placed in advertising packet. If NULL, no changes are made to the current advertising packet data. - * @param[in] dlen Data length for p_data. Max size: @ref BLE_GAP_ADV_MAX_SIZE octets. Should be 0 if p_data is NULL, can be 0 if p_data is not NULL. - * @param[in] p_sr_data Raw data to be placed in scan response packet. If NULL, no changes are made to the current scan response packet data. - * @param[in] srdlen Data length for p_sr_data. Max size: @ref BLE_GAP_ADV_MAX_SIZE octets. Should be 0 if p_sr_data is NULL, can be 0 if p_data is not NULL. + * @param[in,out] p_adv_handle Provide a pointer to a handle containing @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to configure + * a new advertising set. On success, a new handle is then returned through the pointer. + * Provide a pointer to an existing advertising handle to configure an existing advertising set. + * @param[in] p_adv_data Advertising data. If set to NULL, no advertising data will be used. See @ref ble_gap_adv_data_t. + * @param[in] p_adv_params Advertising parameters. When this function is used to update advertising data while advertising, + * this parameter must be NULL. See @ref ble_gap_adv_params_t. * - * @retval ::NRF_SUCCESS Advertising data successfully updated or cleared. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, both p_data and p_sr_data cannot be NULL. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. - * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied, check the advertising data format specification. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data type. + * @retval ::NRF_SUCCESS Advertising set successfully configured. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: + * - Invalid advertising data configuration specified. See @ref ble_gap_adv_data_t. + * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. + * - Use of whitelist requested but whitelist has not been set, + * see @ref sd_ble_gap_whitelist_set. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR ble_gap_adv_params_t::p_peer_addr is invalid. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. + * - It is invalid to provide non-NULL advertising set parameters while advertising. + * - It is invalid to provide the same data buffers while advertising. To update + * advertising data, provide new advertising buffers. + * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE The provided advertising handle was not found. Use @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to + * configure a new advertising handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. + * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied. Check the advertising data format specification + * given in Bluetooth Specification Version 5.0, Volume 3, Part C, Chapter 11. + * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data length or advertising parameter configuration. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to configure a new advertising handle. Update an + * existing advertising handle instead. * @retval ::BLE_ERROR_GAP_UUID_LIST_MISMATCH Invalid UUID list supplied. */ -SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const *p_data, uint8_t dlen, uint8_t const *p_sr_data, uint8_t srdlen)); +SVCALL(SD_BLE_GAP_ADV_SET_CONFIGURE, uint32_t, sd_ble_gap_adv_set_configure(uint8_t *p_adv_handle, ble_gap_adv_data_t const *p_adv_data, ble_gap_adv_params_t const *p_adv_params)); /**@brief Start advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). * - * @note An application can start an advertising procedure for broadcasting purposes while a connection - * is active. After a @ref BLE_GAP_EVT_CONNECTED event is received, this function may therefore - * be called to start a broadcast advertising procedure. The advertising procedure - * cannot however be connectable (it must be of type @ref BLE_GAP_ADV_TYPE_ADV_SCAN_IND or - * @ref BLE_GAP_ADV_TYPE_ADV_NONCONN_IND). @note Only one advertiser may be active at any time. + * @note Only one advertiser may be active at any time. * * @events * @event{@ref BLE_GAP_EVT_CONNECTED, Generated after connection has been established through connectable advertising.} - * @event{@ref BLE_GAP_EVT_TIMEOUT, Advertisement has timed out.} + * @event{@ref BLE_GAP_EVT_ADV_SET_TERMINATED, Advertising set has terminated.} + * @event{@ref BLE_GAP_EVT_SCAN_REQ_REPORT, A scan request was received.} * @endevents * * @mscs @@ -1483,22 +1820,30 @@ SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * - * @param[in] p_adv_params Pointer to advertising parameters structure. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. + * @param[in] adv_handle Advertising handle to advertise on, received from @ref sd_ble_gap_adv_set_configure. + * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or + * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. For non-connectable + * advertising, this is ignored. * - * @retval ::NRF_SUCCESS The BLE stack has started advertising. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check the accepted ranges and limits. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Bluetooth address supplied. - * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Observer) and try again + * @retval ::NRF_SUCCESS The BLE stack has started advertising. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. adv_handle is not configured or already advertising. + * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. Configure a new adveriting handle with @ref sd_ble_gap_adv_set_configure. + * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: + * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. + * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. + * @retval ::NRF_ERROR_RESOURCES Either: + * - adv_handle is configured with connectable advertising, but the event_length parameter + * associated with conn_cfg_tag is too small to be able to establish a connection on + * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. + * - Not enough BLE role slots available. + Stop one or more currently active roles (Central, Peripheral, Broadcaster or Observer) and try again. + * - p_adv_params is configured with connectable advertising, but the event_length parameter + * associated with conn_cfg_tag is too small to be able to establish a connection on + * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. */ -SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(ble_gap_adv_params_t const *p_adv_params, uint8_t conn_cfg_tag)); +SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(uint8_t adv_handle, uint8_t conn_cfg_tag)); /**@brief Stop advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). @@ -1508,10 +1853,13 @@ SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(ble_gap_adv_params_t * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * + * @param[in] adv_handle The advertising handle that should stop advertising. + * * @retval ::NRF_SUCCESS The BLE stack has stopped advertising. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation (most probably not in advertising state). + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Invalid advertising handle. + * @retval ::NRF_ERROR_INVALID_STATE The advertising handle is not advertising. */ -SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(void)); +SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(uint8_t adv_handle)); @@ -1545,7 +1893,7 @@ SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(void)); * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_BUSY Procedure already in progress or not allowed at this time, process pending events and wait for pending procedures to complete and retry. + * @retval ::NRF_ERROR_BUSY Procedure already in progress, wait for pending procedures to complete and retry. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. */ @@ -1578,15 +1926,27 @@ SVCALL(SD_BLE_GAP_DISCONNECT, uint32_t, sd_ble_gap_disconnect(uint16_t conn_hand /**@brief Set the radio's transmit power. * - * @param[in] tx_power Radio transmit power in dBm (accepted values are -40, -20, -16, -12, -8, -4, 0, 2, 3, 4, 5, 6, 7, 8 and 9 dBm). + * @param[in] role The role to set the transmit power for, see @ref BLE_GAP_TX_POWER_ROLES for + * possible roles. + * @param[in] handle The handle parameter is interpreted depending on role: + * - If role is @ref BLE_GAP_TX_POWER_ROLE_CONN, this value is the specific connection handle. + * - If role is @ref BLE_GAP_TX_POWER_ROLE_ADV, the advertising set identified with the advertising handle, + * will use the specified transmit power, and include it in the advertising packet headers if + * @ref ble_gap_adv_properties_t::include_tx_power set. + * - For all other roles handle is ignored. + * @param[in] tx_power Radio transmit power in dBm (see note for accepted values). * - * @note The -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +2dBm, +3dBm, +4dBm, +5dBm, +6dBm, +7dBm, +8dBm and +9dBm settings are available on nRF52840 series ICs. - * @note The -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +3dBm and +4dBm settings are available on nRF52 series ICs. + * @note Supported tx_power values: -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +2dBm, +3dBm, +4dBm, +5dBm, +6dBm, +7dBm and +8dBm. + * @note The initiator will have the same transmit power as the scanner. + * @note When a connection is created it will inherit the transmit power from the initiator or + * advertiser leading to the connection. * * @retval ::NRF_SUCCESS Successfully changed the transmit power. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. */ -SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(int8_t tx_power)); +SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(uint8_t role, uint16_t handle, int8_t tx_power)); /**@brief Set GAP Appearance value. @@ -1707,7 +2067,6 @@ SVCALL(SD_BLE_GAP_DEVICE_NAME_GET, uint32_t, sd_ble_gap_device_name_get(uint8_t * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. * @retval ::NRF_ERROR_NO_MEM The maximum number of authentication procedures that can run in parallel for the given role is reached. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. @@ -1766,6 +2125,7 @@ SVCALL(SD_BLE_GAP_AUTHENTICATE, uint32_t, sd_ble_gap_authenticate(uint16_t conn_ * * @retval ::NRF_SUCCESS Successfully accepted security parameter from the application. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. @@ -1807,6 +2167,7 @@ SVCALL(SD_BLE_GAP_SEC_PARAMS_REPLY, uint32_t, sd_ble_gap_sec_params_reply(uint16 */ SVCALL(SD_BLE_GAP_AUTH_KEY_REPLY, uint32_t, sd_ble_gap_auth_key_reply(uint16_t conn_handle, uint8_t key_type, uint8_t const *p_key)); + /**@brief Reply with an LE Secure connections DHKey. * * @details This function is only used to reply to a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. @@ -1840,9 +2201,8 @@ SVCALL(SD_BLE_GAP_AUTH_KEY_REPLY, uint32_t, sd_ble_gap_auth_key_reply(uint16_t c */ SVCALL(SD_BLE_GAP_LESC_DHKEY_REPLY, uint32_t, sd_ble_gap_lesc_dhkey_reply(uint16_t conn_handle, ble_gap_lesc_dhkey_t const *p_dhkey)); + /**@brief Notify the peer of a local keypress. - * - * @details This function can only be used when an authentication procedure using LE Secure Connection is in progress. Calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. * * @mscs * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} @@ -1860,6 +2220,7 @@ SVCALL(SD_BLE_GAP_LESC_DHKEY_REPLY, uint32_t, sd_ble_gap_lesc_dhkey_reply(uint16 */ SVCALL(SD_BLE_GAP_KEYPRESS_NOTIFY, uint32_t, sd_ble_gap_keypress_notify(uint16_t conn_handle, uint8_t kp_not)); + /**@brief Generate a set of OOB data to send to a peer out of band. * * @note The @ref ble_gap_addr_t included in the OOB data returned will be the currently active one (or, if a connection has already been established, @@ -1870,7 +2231,7 @@ SVCALL(SD_BLE_GAP_KEYPRESS_NOTIFY, uint32_t, sd_ble_gap_keypress_notify(uint16_t * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} * @endmscs * - * @param[in] conn_handle Connection handle. Can be BLE_CONN_HANDLE_INVALID if a BLE connection has not been established yet. + * @param[in] conn_handle Connection handle. Can be @ref BLE_CONN_HANDLE_INVALID if a BLE connection has not been established yet. * @param[in] p_pk_own LE Secure Connections local P-256 Public Key. * @param[out] p_oobd_own The OOB data to be sent out of band to a peer. * @@ -1908,6 +2269,7 @@ SVCALL(SD_BLE_GAP_LESC_OOB_DATA_GET, uint32_t, sd_ble_gap_lesc_oob_data_get(uint */ SVCALL(SD_BLE_GAP_LESC_OOB_DATA_SET, uint32_t, sd_ble_gap_lesc_oob_data_set(uint16_t conn_handle, ble_gap_lesc_oob_data_t const *p_oobd_own, ble_gap_lesc_oob_data_t const *p_oobd_peer)); + /**@brief Initiate GAP Encryption procedure. * * @details In the central role, this function will initiate the encryption procedure using the encryption information provided. @@ -1992,7 +2354,7 @@ SVCALL(SD_BLE_GAP_CONN_SEC_GET, uint32_t, sd_ble_gap_conn_sec_get(uint16_t conn_ * @param[in] skip_count Number of RSSI samples with a change of threshold_dbm or more before sending a new @ref BLE_GAP_EVT_RSSI_CHANGED event. * * @retval ::NRF_SUCCESS Successfully activated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress. Invalid state to perform operation. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is already ongoing. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. */ SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_handle, uint8_t threshold_dbm, uint8_t skip_count)); @@ -2011,7 +2373,7 @@ SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_hand * @param[in] conn_handle Connection handle. * * @retval ::NRF_SUCCESS Successfully deactivated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. */ SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle)); @@ -2021,24 +2383,45 @@ SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle * * @ref sd_ble_gap_rssi_start must be called to start reporting RSSI before using this function. @ref NRF_ERROR_NOT_FOUND * will be returned until RSSI was sampled for the first time after calling @ref sd_ble_gap_rssi_start. - * + * @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement. * @mscs * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} * @endmscs * * @param[in] conn_handle Connection handle. * @param[out] p_rssi Pointer to the location where the RSSI measurement shall be stored. + * @param[out] p_ch_index Pointer to the location where Channel Index for the RSSI measurement shall be stored. * * @retval ::NRF_SUCCESS Successfully read the RSSI. * @retval ::NRF_ERROR_NOT_FOUND No sample is available. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing, or disconnection in progress. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. */ -SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi)); +SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi, uint8_t *p_ch_index)); -/**@brief Start scanning (GAP Discovery procedure, Observer Procedure). +/**@brief Start or continue scanning (GAP Discovery procedure, Observer Procedure). + * + * @note A call to this function will require the application to keep the memory pointed by + * p_adv_report_buffer alive until the buffer is released. The buffer is released when the scanner is stopped + * or when this function is called with another buffer. + * + * @note The scanner will automatically stop in the following cases: + * - @ref sd_ble_gap_scan_stop is called. + * - @ref sd_ble_gap_connect is called. + * - A @ref BLE_GAP_EVT_TIMEOUT with source set to @ref BLE_GAP_TIMEOUT_SRC_SCAN is received. + * - When a @ref BLE_GAP_EVT_ADV_REPORT event is received and @ref ble_gap_adv_report_type_t::status is not set to + * @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. In this case scanning is only paused to let the application + * access received data. The application must call this function to continue scanning, or call @ref sd_ble_gap_scan_stop + * to stop scanning. + * + * @note If a @ref BLE_GAP_EVT_ADV_REPORT event is received with @ref ble_gap_adv_report_type_t::status set to + * @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the scanner will continue scanning, and the application will + * receive more reports from this advertising event. The following reports will include the old and new received data. + * The application can stop the scanner from receiving more packets from this advertising event by calling this function. + * This might be useful when receiving data from extended advertising events where @ref ble_gap_evt_adv_report_t::aux_pointer + * is large. * * @events * @event{@ref BLE_GAP_EVT_ADV_REPORT, An advertising or scan response packet has been received.} @@ -2050,20 +2433,33 @@ SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * - * @param[in] p_scan_params Pointer to scan parameters structure. + * @param[in] p_scan_params Pointer to scan parameters structure. When this function is used to continue + * scanning, this parameter must be NULL. + * @param[in] p_adv_report_buffer Pointer to buffer used to store incoming advertising data. + * The memory pointed to should be kept alive until the scanning is stopped. + * See @ref BLE_GAP_SCAN_BUFFER_SIZE for minimum and maximum buffer size. + * If the scanner receives advertising data larger than can be stored in the buffer, + * a @ref BLE_GAP_EVT_ADV_REPORT will be raised with @ref ble_gap_adv_report_type_t::status + * set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED. * * @retval ::NRF_SUCCESS Successfully initiated scanning procedure. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - Scanning is already ongoing and p_scan_params was not NULL + * - Scanning is not running and p_scan_params was NULL. + * - The scanner has timed out when this function is called to continue scanning. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. See @ref ble_gap_scan_params_t. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported parameters supplied. See @ref ble_gap_scan_params_t. + * @retval ::NRF_ERROR_INVALID_LENGTH The provided buffer length is invalid. See @ref BLE_GAP_SCAN_BUFFER_MIN. * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again */ -SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params)); +SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params, ble_data_t const * p_adv_report_buffer)); /**@brief Stop scanning (GAP Discovery procedure, Observer Procedure). + * + * @note The buffer provided in @ref sd_ble_gap_scan_start is released. * * @mscs * @mmsc{@ref BLE_GAP_SCAN_MSC} @@ -2071,7 +2467,7 @@ SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_param * @endmscs * * @retval ::NRF_SUCCESS Successfully stopped scanning procedure. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation (most probably not in scanning state). + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Not in the scanning state. */ SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); @@ -2087,13 +2483,12 @@ SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC} * @endmscs * - * @param[in] p_peer_addr Pointer to peer address. If the use_whitelist bit is set in @ref ble_gap_scan_params_t, then this is ignored. - * If @ref ble_gap_addr_t::addr_id_peer is set then p_peer_addr must be present in the device identity list - * see @ref sd_ble_gap_device_identities_set. + * @param[in] p_peer_addr Pointer to peer identity address. If @ref ble_gap_scan_params_t::filter_policy is set to use + * whitelist, then p_peer_addr is ignored. * @param[in] p_scan_params Pointer to scan parameters structure. * @param[in] p_conn_params Pointer to desired connection parameters. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. + * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or + * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. * * @retval ::NRF_SUCCESS Successfully initiated connection procedure. * @retval ::NRF_ERROR_INVALID_ADDR Invalid parameter(s) pointer supplied. @@ -2101,14 +2496,17 @@ SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); * - Invalid parameter(s) in p_scan_params or p_conn_params. * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. * - Peer address was not present in the device identity list, see @ref sd_ble_gap_device_identities_set. + * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. * @retval ::NRF_ERROR_INVALID_STATE The SoftDevice is in an invalid state to perform this operation. This may be due to an * existing locally initiated connect procedure, which must complete before initiating again. * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Peer address. * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. If another connection is being established - * wait for the corresponding @ref BLE_GAP_EVT_CONNECTED event before calling again. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again + * @retval ::NRF_ERROR_RESOURCES Either: + * - Not enough BLE role slots available. + * Stop one or more currently active roles (Central, Peripheral or Observer) and try again. + * - The event_length parameter associated with conn_cfg_tag is too small to be able to + * establish a connection on the selected @ref ble_gap_scan_params_t::scan_phys. + * Use @ref sd_ble_cfg_set to increase the event length. */ SVCALL(SD_BLE_GAP_CONNECT, uint32_t, sd_ble_gap_connect(ble_gap_addr_t const *p_peer_addr, ble_gap_scan_params_t const *p_scan_params, ble_gap_conn_params_t const *p_conn_params, uint8_t conn_cfg_tag)); @@ -2125,27 +2523,47 @@ SVCALL(SD_BLE_GAP_CONNECT, uint32_t, sd_ble_gap_connect(ble_gap_addr_t const *p_ SVCALL(SD_BLE_GAP_CONNECT_CANCEL, uint32_t, sd_ble_gap_connect_cancel(void)); -/**@brief PHY Update Request +/**@brief Initiate or respond to a PHY Update Procedure * - * @details This function is used to request a new PHY configuration for a central or a peripheral connection. It will always generate a - * @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys - * is 0, then the stack will select PHYs based on the peer requirements on that specific direction. If the peer does not support - * the PHY Update procedure, then the resulting @ref BLE_GAP_EVT_PHY_UPDATE event will have a status different from - * @ref BLE_HCI_STATUS_CODE_SUCCESS. + * @details This function is used to initiate or respond to a PHY Update Procedure. It will always + * generate a @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. + * If this function is used to initiate a PHY Update procedure and the only option + * provided in @ref ble_gap_phys_t::tx_phys and @ref ble_gap_phys_t::rx_phys is the + * currently active PHYs in the respective directions, the SoftDevice will generate a + * @ref BLE_GAP_EVT_PHY_UPDATE with the current PHYs set and will not initiate the + * procedure in the Link Layer. * - * @note The requested PHYs does not have to be within the set of the preferred PHYs. + * If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys is @ref BLE_GAP_PHY_AUTO, + * then the stack will select PHYs based on the peer's PHY preferences and the local link + * configuration. The PHY Update procedure will for this case result in a PHY combination + * that respects the time constraints configured with @ref sd_ble_cfg_set and the current + * link layer data length. * - * @note If the @ref ble_gap_opt_preferred_phys_t have not been configured with @ref BLE_GAP_PHY_CODED, then this call might return - * @ref BLE_ERROR_BLOCKED_BY_OTHER_LINKS if there are multiple devices connected. + * When acting as a central, the SoftDevice will select the fastest common PHY in each direction. * + * If the peer does not support the PHY Update Procedure, then the resulting + * @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to + * @ref BLE_HCI_UNSUPPORTED_REMOTE_FEATURE. + * + * If the PHY procedure was rejected by the peer due to a procedure collision, the status + * will be @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or + * @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION. + * If the peer responds to the PHY Update procedure with invalid parameters, the status + * will be @ref BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS. + * If the PHY procedure was rejected by the peer for a different reason, the status will + * contain the reason as specified by the peer. + * + * @note @ref BLE_GAP_PHY_CODED is only supported as an experimental feature in this SoftDevice. + * When this function is used to reply to a PHY Update, depending on the peers preferences, + * @ref BLE_GAP_PHY_AUTO might result in the PHY to be changed to @ref BLE_GAP_PHY_CODED. * * @events - * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update procedure procedure.} + * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update Procedure.} * @endevents * * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_PHY_REQUEST} - * @mmsc{@ref BLE_GAP_PERIPHERAL_PHY_REQUEST} + * @mmsc{@ref BLE_GAP_CENTRAL_PHY_UPDATE} + * @mmsc{@ref BLE_GAP_PERIPHERAL_PHY_UPDATE} * @endmscs * * @param[in] conn_handle Connection handle to indicate the connection for which the PHY Update is requested. @@ -2154,18 +2572,18 @@ SVCALL(SD_BLE_GAP_CONNECT_CANCEL, uint32_t, sd_ble_gap_connect_cancel(void)); * @retval ::NRF_SUCCESS Successfully requested a PHY Update. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Unsupported PHYs supplied to the call. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_BLOCKED_BY_OTHER_LINKS Other connections may block the scheduling of the current link. + * @retval ::NRF_ERROR_RESOURCES The connection event length configured for this link is not sufficient for the combination of + * @ref ble_gap_phys_t::tx_phys, @ref ble_gap_phys_t::rx_phys, and @ref ble_gap_data_length_params_t. + * The connection event length is configured with @ref BLE_CONN_CFG_GAP using @ref sd_ble_cfg_set. * @retval ::NRF_ERROR_BUSY Procedure is already in progress or not allowed at this time. Process pending events and wait for the pending procedure to complete and retry. * */ -SVCALL(SD_BLE_GAP_PHY_REQUEST, uint32_t, sd_ble_gap_phy_request(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)); +SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)); + /**@brief Initiate or respond to a Data Length Update Procedure. - * - * @note Only symmetric input parameters for the Data Length Update is supported. Only @ref - * BLE_GAP_DATA_LENGTH_AUTO for max_tx_time_us and max_rx_time_us is supported. * * @note If the application uses @ref BLE_GAP_DATA_LENGTH_AUTO for one or more members of * p_dl_params, the SoftDevice will choose the highest value supported in current @@ -2177,7 +2595,7 @@ SVCALL(SD_BLE_GAP_PHY_REQUEST, uint32_t, sd_ble_gap_phy_request(uint16_t conn_ha * the SoftDevice automatically decide the value for that member. * Set to NULL to use automatic values for all members. * @param[out] p_dl_limitation Pointer to limitation to be written when local device does not - * have enough resources to accommodate the requested Data Length + * have enough resources or does not support the requested Data Length * Update parameters. Ignored if NULL. * * @mscs @@ -2189,14 +2607,54 @@ SVCALL(SD_BLE_GAP_PHY_REQUEST, uint32_t, sd_ble_gap_phy_request(uint16_t conn_ha * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter supplied. * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED The requested parameters are not supported by the SoftDevice. - * @retval ::NRF_ERROR_RESOURCES The requested parameters can not be accommodated. Inspect - * p_dl_limitation so see where the limitation is. + * @retval ::NRF_ERROR_NOT_SUPPORTED The requested parameters are not supported by the SoftDevice. Inspect + * p_dl_limitation to see which parameter is not supported. + * @retval ::NRF_ERROR_RESOURCES The connection event length configured for this link is not sufficient for the requested parameters. + * Use @ref sd_ble_cfg_set with @ref BLE_CONN_CFG_GAP to increase the connection event length. + * Inspect p_dl_limitation to see where the limitation is. * @retval ::NRF_ERROR_BUSY Peer has already initiated a Data Length Update Procedure. Process the * pending @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST event to respond. */ SVCALL(SD_BLE_GAP_DATA_LENGTH_UPDATE, uint32_t, sd_ble_gap_data_length_update(uint16_t conn_handle, ble_gap_data_length_params_t const *p_dl_params, ble_gap_data_length_limitation_t *p_dl_limitation)); +/**@brief Start the Quality of Service (QoS) channel survey module. + * + * @details The channel survey module provides measurements of the energy levels on + * the Bluetooth Low Energy channels. When the module is enabled, @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT + * events will periodically report the measured energy levels for each channel. + * + * @note The measurements are scheduled with lower priority than other Bluetooth Low Energy roles, + * Radio Timeslot API events and Flash API events. + * + * @note The channel survey module will attempt to do measurements so that the average interval + * between measurements will be interval_us. However due to the channel survey module + * having the lowest priority of all roles and modules, this may not be possible. In that + * case fewer than expected channel survey reports may be given. + * + * @note In order to use the channel survey module, @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available + * must be set. This is done using @ref sd_ble_cfg_set. + * + * @param[in] interval_us Requested average interval for the measurements and reports. See + * @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS for valid ranges. If set + * to @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS, the channel + * survey role will be scheduled at every available opportunity. + * + * @retval ::NRF_SUCCESS The module is successfully started. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter supplied. interval_us is out of the + * allowed range. + * @retval ::NRF_ERROR_INVALID_STATE Trying to start the module when already running. + * @retval ::NRF_ERROR_RESOURCES The channel survey module is not available to the application. + * Set @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available using + * @ref sd_ble_cfg_set. + */ +SVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_START, uint32_t, sd_ble_gap_qos_channel_survey_start(uint32_t interval_us)); + +/**@brief Stop the Quality of Service (QoS) channel survey module. + * + * @retval ::NRF_SUCCESS The module is successfully stopped. + * @retval ::NRF_ERROR_INVALID_STATE Trying to stop the module when it is not running. + */ +SVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP, uint32_t, sd_ble_gap_qos_channel_survey_stop(void)); /** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gatt.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gatt.h similarity index 83% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gatt.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gatt.h index f6e7ee8563..98a7a150bf 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gatt.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gatt.h @@ -1,37 +1,39 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @@ -43,8 +45,13 @@ #ifndef BLE_GATT_H__ #define BLE_GATT_H__ -#include "ble_types.h" +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" #include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" #ifdef __cplusplus extern "C" { @@ -177,7 +184,7 @@ extern "C" { /** * @brief BLE GATT connection configuration parameters, set with @ref sd_ble_cfg_set. * - * @retval NRF_ERROR_INVALID_PARAM att_mtu is smaller than @ref BLE_GATT_ATT_MTU_DEFAULT. + * @retval ::NRF_ERROR_INVALID_PARAM att_mtu is smaller than @ref BLE_GATT_ATT_MTU_DEFAULT. */ typedef struct { diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gattc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gattc.h similarity index 90% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gattc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gattc.h index b6a75ece77..7fb3920244 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gattc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gattc.h @@ -1,37 +1,39 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @@ -43,12 +45,14 @@ #ifndef BLE_GATTC_H__ #define BLE_GATTC_H__ -#include "ble_gatt.h" -#include "ble_types.h" -#include "ble_ranges.h" +#include +#include "nrf.h" #include "nrf_svc.h" #include "nrf_error.h" -#include "nrf.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" +#include "ble_gatt.h" #ifdef __cplusplus extern "C" { @@ -370,6 +374,7 @@ typedef struct * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_services_discover(uint16_t conn_handle, uint16_t start_handle, ble_uuid_t const *p_srvc_uuid)); @@ -396,6 +401,7 @@ SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_se * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); @@ -424,6 +430,7 @@ SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteristics_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); @@ -449,6 +456,7 @@ SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteris * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); @@ -475,6 +483,7 @@ SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_dis * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle, ble_uuid_t const *p_uuid, ble_gattc_handle_range_t const *p_handle_range)); @@ -501,6 +510,7 @@ SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_b * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint16_t handle, uint16_t offset)); @@ -526,6 +536,7 @@ SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(uint16_t conn_handle, uint16_t const *p_handles, uint16_t handle_count)); @@ -572,6 +583,7 @@ SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(ui * @retval ::NRF_ERROR_BUSY For write with response, procedure already in progress. Wait for a @ref BLE_GATTC_EVT_WRITE_RSP event and retry. * @retval ::NRF_ERROR_RESOURCES Too many writes without responses queued. * Wait for a @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event and retry. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, ble_gattc_write_params_t const *p_write_params)); @@ -589,6 +601,7 @@ SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, bl * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no Indication pending to be confirmed. * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_handle, uint16_t handle)); @@ -606,6 +619,7 @@ SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_ * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * p_handle_range)); @@ -638,6 +652,7 @@ SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discove * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state or an ATT_MTU exchange was already requested once. * @retval ::NRF_ERROR_INVALID_PARAM Invalid Client RX MTU size supplied. * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, uint32_t, sd_ble_gattc_exchange_mtu_request(uint16_t conn_handle, uint16_t client_rx_mtu)); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gatts.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gatts.h similarity index 92% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gatts.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gatts.h index 6bb24831d8..e437b6e076 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gatts.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gatts.h @@ -1,37 +1,39 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @@ -43,12 +45,15 @@ #ifndef BLE_GATTS_H__ #define BLE_GATTS_H__ -#include "ble_types.h" -#include "ble_ranges.h" -#include "ble_l2cap.h" -#include "ble_gap.h" -#include "ble_gatt.h" +#include #include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" +#include "ble_gatt.h" +#include "ble_gap.h" #ifdef __cplusplus extern "C" { @@ -284,7 +289,7 @@ typedef struct uint16_t handle; /**< Characteristic Value Handle. */ uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ uint16_t offset; /**< Offset within the attribute value. */ - uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after successful return. */ + uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after return. */ uint8_t const *p_data; /**< Actual data content, use NULL to use the current attribute value. */ } ble_gatts_hvx_params_t; @@ -544,8 +549,8 @@ SVCALL(SD_BLE_GATTS_VALUE_SET, uint32_t, sd_ble_gatts_value_set(uint16_t conn_ha /**@brief Get the value of a given attribute. * * @note If the attribute value is longer than the size of the supplied buffer, - * p_len will return the total attribute value length (excluding offset), - * and not the number of bytes actually returned in p_data. + * @ref ble_gatts_value_t::len will return the total attribute value length (excluding offset), + * and not the number of bytes actually returned in @ref ble_gatts_value_t::p_value. * The application may use this information to allocate a suitable buffer size. * * @note When retrieving system attribute values with this function, the connection handle @@ -574,7 +579,7 @@ SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_ha * @note The local attribute value may be updated even if an outgoing packet is not sent to the peer due to an error during execution. * The Attribute Table has been updated if one of the following error codes is returned: @ref NRF_ERROR_INVALID_STATE, @ref NRF_ERROR_BUSY, * @ref NRF_ERROR_FORBIDDEN, @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING and @ref NRF_ERROR_RESOURCES. - * The caller can check whether the value has been updated by looking at the contents of *(p_hvx_params->p_len). + * The caller can check whether the value has been updated by looking at the contents of *(@ref ble_gatts_hvx_params_t::p_len). * * @note Only one indication procedure can be ongoing per connection at a time. * If the application tries to indicate an attribute value while another indication procedure is ongoing, @@ -602,9 +607,12 @@ SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_ha * @mmsc{@ref BLE_GATTS_HVX_DISABLED_MSC} * @endmscs * - * @param[in] conn_handle Connection handle. - * @param[in] p_hvx_params Pointer to an HVx parameters structure. If the p_data member contains a non-NULL pointer the attribute value will be updated with - * the contents pointed by it before sending the notification or indication. + * @param[in] conn_handle Connection handle. + * @param[in,out] p_hvx_params Pointer to an HVx parameters structure. If @ref ble_gatts_hvx_params_t::p_data + * contains a non-NULL pointer the attribute value will be updated with the contents + * pointed by it before sending the notification or indication. If the attribute value + * is updated, @ref ble_gatts_hvx_params_t::p_len is updated by the SoftDevice to + * contain the number of actual bytes written, else it will be set to 0. * * @retval ::NRF_SUCCESS Successfully queued a notification or indication for transmission, and optionally updated the attribute value. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. @@ -623,6 +631,7 @@ SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_ha * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. * @retval ::NRF_ERROR_RESOURCES Too many notifications queued. * Wait for a @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event and retry. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t const *p_hvx_params)); @@ -658,6 +667,7 @@ SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_ga * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied, handles must be in the range populated by the application. * @retval ::NRF_ERROR_BUSY Procedure already in progress. * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle)); @@ -672,7 +682,7 @@ SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint * @mmsc{@ref BLE_GATTS_READ_REQ_AUTH_MSC} * @mmsc{@ref BLE_GATTS_WRITE_REQ_AUTH_MSC} * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_PEER_CANCEL_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} * @endmscs * * @param[in] conn_handle Connection handle. @@ -684,11 +694,13 @@ SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint * * @retval ::NRF_SUCCESS Successfully queued a response to the peer, and in the case of a write operation, Attribute Table updated. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no authorization request pending. * @retval ::NRF_ERROR_INVALID_PARAM Authorization op invalid, * handle supplied does not match requested handle, * or invalid data to be written provided by the application. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params)); @@ -810,7 +822,7 @@ SVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, b * @param[in] server_rx_mtu Server RX MTU size. * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration - used for this connection. + * used for this connection. * - The value must be equal to Client RX MTU size given in @ref sd_ble_gattc_exchange_mtu_request * if an ATT_MTU exchange has already been performed in the other direction. * @@ -818,6 +830,7 @@ SVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, b * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no ATT_MTU exchange request pending. * @retval ::NRF_ERROR_INVALID_PARAM Invalid Server RX MTU size supplied. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. */ SVCALL(SD_BLE_GATTS_EXCHANGE_MTU_REPLY, uint32_t, sd_ble_gatts_exchange_mtu_reply(uint16_t conn_handle, uint16_t server_rx_mtu)); /** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_hci.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_hci.h similarity index 66% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_hci.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_hci.h index 21293e8efc..f0dde9a03a 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_hci.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_hci.h @@ -1,37 +1,39 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @@ -88,9 +90,9 @@ extern "C" { /*0x20 Unsupported LMP Parameter Value 0x21 Role Change Not Allowed */ -#define BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT 0x22 /**< LMP Response Timeout. */ +#define BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT 0x22 /**< LMP Response Timeout. */ #define BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION 0x23 /**< LMP Error Transaction Collision/LL Procedure Collision. */ -#define BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED 0x24 /**< LMP PDU Not Allowed. */ +#define BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED 0x24 /**< LMP PDU Not Allowed. */ /*0x25 Encryption Mode Not Acceptable 0x26 Link Key Can Not be Changed 0x27 Requested QoS Not Supported @@ -104,7 +106,9 @@ extern "C" { 0x2D QoS Rejected 0x2E Channel Classification Not Supported 0x2F Insufficient Security -0x30 Parameter Out Of Mandatory Range +*/ +#define BLE_HCI_PARAMETER_OUT_OF_MANDATORY_RANGE 0x30 /**< Parameter Out Of Mandatory Range. */ +/* 0x31 Reserved 0x32 Role Switch Pending 0x33 Reserved diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_l2cap.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_l2cap.h new file mode 100644 index 0000000000..eaeb4b7d28 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_l2cap.h @@ -0,0 +1,506 @@ +/* + * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_L2CAP Logical Link Control and Adaptation Protocol (L2CAP) + @{ + @brief Definitions and prototypes for the L2CAP interface. + */ + +#ifndef BLE_L2CAP_H__ +#define BLE_L2CAP_H__ + +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/**@addtogroup BLE_L2CAP_TERMINOLOGY Terminology + * @{ + * @details + * + * L2CAP SDU + * - A data unit that the application can send/receive to/from a peer. + * + * L2CAP PDU + * - A data unit that is exchanged between local and remote L2CAP entities. + * It consists of L2CAP protocol control information and payload fields. + * The payload field can contain an L2CAP SDU or a part of an L2CAP SDU. + * + * L2CAP MTU + * - The maximum length of an L2CAP SDU. + * + * L2CAP MPS + * - The maximum length of an L2CAP PDU payload field. + * + * Credits + * - A value indicating the number of L2CAP PDUs that the receiver of the credit can send to the peer. + * @} */ + +/**@addtogroup BLE_L2CAP_ENUMERATIONS Enumerations + * @{ */ + +/**@brief L2CAP API SVC numbers. */ +enum BLE_L2CAP_SVCS +{ + SD_BLE_L2CAP_CH_SETUP = BLE_L2CAP_SVC_BASE + 0, /**< Set up an L2CAP channel. */ + SD_BLE_L2CAP_CH_RELEASE = BLE_L2CAP_SVC_BASE + 1, /**< Release an L2CAP channel. */ + SD_BLE_L2CAP_CH_RX = BLE_L2CAP_SVC_BASE + 2, /**< Receive an SDU on an L2CAP channel. */ + SD_BLE_L2CAP_CH_TX = BLE_L2CAP_SVC_BASE + 3, /**< Transmit an SDU on an L2CAP channel. */ + SD_BLE_L2CAP_CH_FLOW_CONTROL = BLE_L2CAP_SVC_BASE + 4, /**< Advanced SDU reception flow control. */ +}; + +/**@brief L2CAP Event IDs. */ +enum BLE_L2CAP_EVTS +{ + BLE_L2CAP_EVT_CH_SETUP_REQUEST = BLE_L2CAP_EVT_BASE + 0, /**< L2CAP Channel Setup Request event. + \n See @ref ble_l2cap_evt_ch_setup_request_t. */ + BLE_L2CAP_EVT_CH_SETUP_REFUSED = BLE_L2CAP_EVT_BASE + 1, /**< L2CAP Channel Setup Refused event. + \n See @ref ble_l2cap_evt_ch_setup_refused_t. */ + BLE_L2CAP_EVT_CH_SETUP = BLE_L2CAP_EVT_BASE + 2, /**< L2CAP Channel Setup Completed event. + \n See @ref ble_l2cap_evt_ch_setup_t. */ + BLE_L2CAP_EVT_CH_RELEASED = BLE_L2CAP_EVT_BASE + 3, /**< L2CAP Channel Released event. + \n No additional event structure applies. */ + BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED = BLE_L2CAP_EVT_BASE + 4, /**< L2CAP Channel SDU data buffer released event. + \n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */ + BLE_L2CAP_EVT_CH_CREDIT = BLE_L2CAP_EVT_BASE + 5, /**< L2CAP Channel Credit received. + \n See @ref ble_l2cap_evt_ch_credit_t. */ + BLE_L2CAP_EVT_CH_RX = BLE_L2CAP_EVT_BASE + 6, /**< L2CAP Channel SDU received. + \n See @ref ble_l2cap_evt_ch_rx_t. */ + BLE_L2CAP_EVT_CH_TX = BLE_L2CAP_EVT_BASE + 7, /**< L2CAP Channel SDU transmitted. + \n See @ref ble_l2cap_evt_ch_tx_t. */ +}; + +/** @} */ + +/**@addtogroup BLE_L2CAP_DEFINES Defines + * @{ */ + +/**@brief Maximum number of L2CAP channels per connection. */ +#define BLE_L2CAP_CH_COUNT_MAX (64) + +/**@brief Minimum L2CAP MTU, in bytes. */ +#define BLE_L2CAP_MTU_MIN (23) + +/**@brief Minimum L2CAP MPS, in bytes. */ +#define BLE_L2CAP_MPS_MIN (23) + +/**@brief Invalid CID. */ +#define BLE_L2CAP_CID_INVALID (0x0000) + +/**@brief Default number of credits for @ref sd_ble_l2cap_ch_flow_control. */ +#define BLE_L2CAP_CREDITS_DEFAULT (1) + +/**@defgroup BLE_L2CAP_CH_SETUP_REFUSED_SRCS L2CAP channel setup refused sources + * @{ */ +#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_LOCAL (0x01) /**< Local. */ +#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_REMOTE (0x02) /**< Remote. */ + /** @} */ + + /** @defgroup BLE_L2CAP_CH_STATUS_CODES L2CAP channel status codes + * @{ */ +#define BLE_L2CAP_CH_STATUS_CODE_SUCCESS (0x0000) /**< Success. */ +#define BLE_L2CAP_CH_STATUS_CODE_LE_PSM_NOT_SUPPORTED (0x0002) /**< LE_PSM not supported. */ +#define BLE_L2CAP_CH_STATUS_CODE_NO_RESOURCES (0x0004) /**< No resources available. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHENTICATION (0x0005) /**< Insufficient authentication. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHORIZATION (0x0006) /**< Insufficient authorization. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC_KEY_SIZE (0x0007) /**< Insufficient encryption key size. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC (0x0008) /**< Insufficient encryption. */ +#define BLE_L2CAP_CH_STATUS_CODE_INVALID_SCID (0x0009) /**< Invalid Source CID. */ +#define BLE_L2CAP_CH_STATUS_CODE_SCID_ALLOCATED (0x000A) /**< Source CID already allocated. */ +#define BLE_L2CAP_CH_STATUS_CODE_UNACCEPTABLE_PARAMS (0x000B) /**< Unacceptable parameters. */ +#define BLE_L2CAP_CH_STATUS_CODE_NOT_UNDERSTOOD (0x8000) /**< Command Reject received instead of LE Credit Based Connection Response. */ +#define BLE_L2CAP_CH_STATUS_CODE_TIMEOUT (0xC000) /**< Operation timed out. */ +/** @} */ + +/** @} */ + +/**@addtogroup BLE_L2CAP_STRUCTURES Structures + * @{ */ + +/** + * @brief BLE L2CAP connection configuration parameters, set with @ref sd_ble_cfg_set. + * + * @note These parameters are set per connection, so all L2CAP channels created on this connection + * will have the same parameters. + * + * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: + * - rx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. + * - tx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. + * - ch_count is greater than @ref BLE_L2CAP_CH_COUNT_MAX. + * @retval ::NRF_ERROR_NO_MEM rx_mps or tx_mps is set too high. + */ +typedef struct +{ + uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall + be able to receive on L2CAP channels on connections with this + configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ + uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall + be able to transmit on L2CAP channels on connections with this + configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ + uint8_t rx_queue_size; /**< Number of SDU data buffers that can be queued for reception per + L2CAP channel. The minimum value is one. */ + uint8_t tx_queue_size; /**< Number of SDU data buffers that can be queued for transmission + per L2CAP channel. The minimum value is one. */ + uint8_t ch_count; /**< Number of L2CAP channels the application can create per connection + with this configuration. The default value is zero, the maximum + value is @ref BLE_L2CAP_CH_COUNT_MAX. + @note if this parameter is set to zero, all other parameters in + @ref ble_l2cap_conn_cfg_t are ignored. */ +} ble_l2cap_conn_cfg_t; + +/**@brief L2CAP channel RX parameters. */ +typedef struct +{ + uint16_t rx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP shall be able to + receive on this L2CAP channel. + - Must be equal to or greater than @ref BLE_L2CAP_MTU_MIN. */ + uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall be + able to receive on this L2CAP channel. + - Must be equal to or greater than @ref BLE_L2CAP_MPS_MIN. + - Must be equal to or less than @ref ble_l2cap_conn_cfg_t::rx_mps. */ + ble_data_t sdu_buf; /**< SDU data buffer for reception. + - If @ref ble_data_t::p_data is non-NULL, initial credits are + issued to the peer. + - If @ref ble_data_t::p_data is NULL, no initial credits are + issued to the peer. */ +} ble_l2cap_ch_rx_params_t; + +/**@brief L2CAP channel setup parameters. */ +typedef struct +{ + ble_l2cap_ch_rx_params_t rx_params; /**< L2CAP channel RX parameters. */ + uint16_t le_psm; /**< LE Protocol/Service Multiplexer. Used when requesting + setup of an L2CAP channel, ignored otherwise. */ + uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES. + Used when replying to a setup request of an L2CAP + channel, ignored otherwise. */ +} ble_l2cap_ch_setup_params_t; + +/**@brief L2CAP channel TX parameters. */ +typedef struct +{ + uint16_t tx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP is able to + transmit on this L2CAP channel. */ + uint16_t peer_mps; /**< The maximum L2CAP PDU payload size, in bytes, that the peer is + able to receive on this L2CAP channel. */ + uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP is able + to transmit on this L2CAP channel. This is effective tx_mps, + selected by the SoftDevice as + MIN( @ref ble_l2cap_ch_tx_params_t::peer_mps, @ref ble_l2cap_conn_cfg_t::tx_mps ) */ + uint16_t credits; /**< Initial credits given by the peer. */ +} ble_l2cap_ch_tx_params_t; + +/**@brief L2CAP Channel Setup Request event. */ +typedef struct +{ + ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ + uint16_t le_psm; /**< LE Protocol/Service Multiplexer. */ +} ble_l2cap_evt_ch_setup_request_t; + +/**@brief L2CAP Channel Setup Refused event. */ +typedef struct +{ + uint8_t source; /**< Source, see @ref BLE_L2CAP_CH_SETUP_REFUSED_SRCS */ + uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES */ +} ble_l2cap_evt_ch_setup_refused_t; + +/**@brief L2CAP Channel Setup Completed event. */ +typedef struct +{ + ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ +} ble_l2cap_evt_ch_setup_t; + +/**@brief L2CAP Channel SDU Data Duffer Released event. */ +typedef struct +{ + ble_data_t sdu_buf; /**< Returned reception or transmission SDU data buffer. The SoftDevice + returns SDU data buffers supplied by the application, which have + not yet been returned previously via a @ref BLE_L2CAP_EVT_CH_RX or + @ref BLE_L2CAP_EVT_CH_TX event. */ +} ble_l2cap_evt_ch_sdu_buf_released_t; + +/**@brief L2CAP Channel Credit received event. */ +typedef struct +{ + uint16_t credits; /**< Additional credits given by the peer. */ +} ble_l2cap_evt_ch_credit_t; + +/**@brief L2CAP Channel received SDU event. */ +typedef struct +{ + uint16_t sdu_len; /**< Total SDU length, in bytes. */ + ble_data_t sdu_buf; /**< SDU data buffer. + @note If there is not enough space in the buffer + (sdu_buf.len < sdu_len) then the rest of the SDU will be + silently discarded by the SoftDevice. */ +} ble_l2cap_evt_ch_rx_t; + +/**@brief L2CAP Channel transmitted SDU event. */ +typedef struct +{ + ble_data_t sdu_buf; /**< SDU data buffer. */ +} ble_l2cap_evt_ch_tx_t; + +/**@brief L2CAP event structure. */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle on which the event occured. */ + uint16_t local_cid; /**< Local Channel ID of the L2CAP channel, or + @ref BLE_L2CAP_CID_INVALID if not present. */ + union + { + ble_l2cap_evt_ch_setup_request_t ch_setup_request; /**< L2CAP Channel Setup Request Event Parameters. */ + ble_l2cap_evt_ch_setup_refused_t ch_setup_refused; /**< L2CAP Channel Setup Refused Event Parameters. */ + ble_l2cap_evt_ch_setup_t ch_setup; /**< L2CAP Channel Setup Completed Event Parameters. */ + ble_l2cap_evt_ch_sdu_buf_released_t ch_sdu_buf_released;/**< L2CAP Channel SDU Data Buffer Released Event Parameters. */ + ble_l2cap_evt_ch_credit_t credit; /**< L2CAP Channel Credit Received Event Parameters. */ + ble_l2cap_evt_ch_rx_t rx; /**< L2CAP Channel SDU Received Event Parameters. */ + ble_l2cap_evt_ch_tx_t tx; /**< L2CAP Channel SDU Transmitted Event Parameters. */ + } params; /**< Event Parameters. */ +} ble_l2cap_evt_t; + +/** @} */ + +/**@addtogroup BLE_L2CAP_FUNCTIONS Functions + * @{ */ + +/**@brief Set up an L2CAP channel. + * + * @details This function is used to: + * - Request setup of an L2CAP channel: sends an LE Credit Based Connection Request packet to a peer. + * - Reply to a setup request of an L2CAP channel (if called in response to a + * @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST event): sends an LE Credit Based Connection + * Response packet to a peer. + * + * @note A call to this function will require the application to keep the SDU data buffer alive + * until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX or + * @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_SETUP, Setup successful.} + * @event{@ref BLE_L2CAP_EVT_CH_SETUP_REFUSED, Setup failed.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_SETUP_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in,out] p_local_cid Pointer to a uint16_t containing Local Channel ID of the L2CAP channel: + * - As input: @ref BLE_L2CAP_CID_INVALID when requesting setup of an L2CAP + * channel or local_cid provided in the @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST + * event when replying to a setup request of an L2CAP channel. + * - As output: local_cid for this channel. + * @param[in] p_params L2CAP channel parameters. + * + * @retval ::NRF_SUCCESS Successfully queued request or response for transmission. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_LENGTH Supplied higher rx_mps than has been configured on this link. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (L2CAP channel already set up). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + * @retval ::NRF_ERROR_RESOURCES The limit has been reached for available L2CAP channels, + * see @ref ble_l2cap_conn_cfg_t::ch_count. + */ +SVCALL(SD_BLE_L2CAP_CH_SETUP, uint32_t, sd_ble_l2cap_ch_setup(uint16_t conn_handle, uint16_t *p_local_cid, ble_l2cap_ch_setup_params_t const *p_params)); + +/**@brief Release an L2CAP channel. + * + * @details This sends a Disconnection Request packet to a peer. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_RELEASED, Release complete.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_RELEASE_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel. + * + * @retval ::NRF_SUCCESS Successfully queued request for transmission. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for the L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + */ +SVCALL(SD_BLE_L2CAP_CH_RELEASE, uint32_t, sd_ble_l2cap_ch_release(uint16_t conn_handle, uint16_t local_cid)); + +/**@brief Receive an SDU on an L2CAP channel. + * + * @details This may issue additional credits to the peer using an LE Flow Control Credit packet. + * + * @note A call to this function will require the application to keep the memory pointed by + * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX + * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. + * + * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::rx_queue_size SDU data buffers + * for reception per L2CAP channel. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_RX, The SDU is received.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_RX_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel. + * @param[in] p_sdu_buf Pointer to the SDU data buffer. + * + * @retval ::NRF_SUCCESS Buffer accepted. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for an L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + * @retval ::NRF_ERROR_RESOURCES Too many SDU data buffers supplied. Wait for a + * @ref BLE_L2CAP_EVT_CH_RX event and retry. + */ +SVCALL(SD_BLE_L2CAP_CH_RX, uint32_t, sd_ble_l2cap_ch_rx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); + +/**@brief Transmit an SDU on an L2CAP channel. + * + * @note A call to this function will require the application to keep the memory pointed by + * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_TX + * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. + * + * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::tx_queue_size SDUs for + * transmission per L2CAP channel. + * + * @note The application can keep track of the available credits for transmission by following + * the procedure below: + * - Store initial credits given by the peer in a variable. + * (Initial credits are provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) + * - Decrement the variable, which stores the currently available credits, by + * ceiling((@ref ble_data_t::len + 2) / tx_mps) when a call to this function returns + * @ref NRF_SUCCESS. (tx_mps is provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) + * - Increment the variable, which stores the currently available credits, by additional + * credits given by the peer in a @ref BLE_L2CAP_EVT_CH_CREDIT event. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_TX, The SDU is transmitted.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_TX_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel. + * @param[in] p_sdu_buf Pointer to the SDU data buffer. + * + * @retval ::NRF_SUCCESS Successfully queued L2CAP SDU for transmission. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for the L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + * @retval ::NRF_ERROR_DATA_SIZE Invalid SDU length supplied, must not be more than + * @ref ble_l2cap_ch_tx_params_t::tx_mtu provided in + * @ref BLE_L2CAP_EVT_CH_SETUP event. + * @retval ::NRF_ERROR_RESOURCES Too many SDUs queued for transmission. Wait for a + * @ref BLE_L2CAP_EVT_CH_TX event and retry. + */ +SVCALL(SD_BLE_L2CAP_CH_TX, uint32_t, sd_ble_l2cap_ch_tx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); + +/**@brief Advanced SDU reception flow control. + * + * @details Adjust the way the SoftDevice issues credits to the peer. + * This may issue additional credits to the peer using an LE Flow Control Credit packet. + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_FLOW_CONTROL_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel or @ref BLE_L2CAP_CID_INVALID to set + * the value that will be used for newly created channels. + * @param[in] credits Number of credits that the SoftDevice will make sure the peer has every + * time it starts using a new reception buffer. + * - @ref BLE_L2CAP_CREDITS_DEFAULT is the default value the SoftDevice will + * use if this function is not called. + * - If set to zero, the SoftDevice will stop issuing credits for new reception + * buffers the application provides or has provided. SDU reception that is + * currently ongoing will be allowed to complete. + * @param[out] p_credits NULL or pointer to a uint16_t. If a valid pointer is provided, it will be + * written by the SoftDevice with the number of credits that is or will be + * available to the peer. If the value written by the SoftDevice is 0 when + * credits parameter was set to 0, the peer will not be able to send more + * data until more credits are provided by calling this function again with + * credits > 0. This parameter is ignored when local_cid is set to + * @ref BLE_L2CAP_CID_INVALID. + * + * @note Application should take care when setting number of credits higher than default value. In + * this case the application must make sure that the SoftDevice always has reception buffers + * available (see @ref sd_ble_l2cap_ch_rx) for that channel. If the SoftDevice does not have + * such buffers available, packets may be NACKed on the Link Layer and all Bluetooth traffic + * on the connection handle may be stalled until the SoftDevice again has an available + * reception buffer. This applies even if the application has used this call to set the + * credits back to default, or zero. + * + * @retval ::NRF_SUCCESS Flow control parameters accepted. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for an L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + */ +SVCALL(SD_BLE_L2CAP_CH_FLOW_CONTROL, uint32_t, sd_ble_l2cap_ch_flow_control(uint16_t conn_handle, uint16_t local_cid, uint16_t credits, uint16_t *p_credits)); + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // BLE_L2CAP_H__ + +/** + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_ranges.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_ranges.h similarity index 66% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_ranges.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_ranges.h index f9c6af76b8..0935bca071 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_ranges.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_ranges.h @@ -1,37 +1,39 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @@ -65,15 +67,15 @@ extern "C" { #define BLE_SVC_LAST 0x6B /**< Common BLE SVC last. */ #define BLE_GAP_SVC_BASE 0x6C /**< GAP BLE SVC base. */ -#define BLE_GAP_SVC_LAST 0x93 /**< GAP BLE SVC last. */ +#define BLE_GAP_SVC_LAST 0x9A /**< GAP BLE SVC last. */ -#define BLE_GATTC_SVC_BASE 0x94 /**< GATTC BLE SVC base. */ -#define BLE_GATTC_SVC_LAST 0x9F /**< GATTC BLE SVC last. */ +#define BLE_GATTC_SVC_BASE 0x9B /**< GATTC BLE SVC base. */ +#define BLE_GATTC_SVC_LAST 0xA7 /**< GATTC BLE SVC last. */ -#define BLE_GATTS_SVC_BASE 0xA0 /**< GATTS BLE SVC base. */ -#define BLE_GATTS_SVC_LAST 0xAF /**< GATTS BLE SVC last. */ +#define BLE_GATTS_SVC_BASE 0xA8 /**< GATTS BLE SVC base. */ +#define BLE_GATTS_SVC_LAST 0xB7 /**< GATTS BLE SVC last. */ -#define BLE_L2CAP_SVC_BASE 0xB0 /**< L2CAP BLE SVC base. */ +#define BLE_L2CAP_SVC_BASE 0xB8 /**< L2CAP BLE SVC base. */ #define BLE_L2CAP_SVC_LAST 0xBF /**< L2CAP BLE SVC last. */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_types.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_types.h similarity index 82% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_types.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_types.h index e24be0b574..88c93180c8 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_types.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/ble_types.h @@ -1,37 +1,39 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @@ -86,6 +88,7 @@ extern "C" { #define BLE_UUID_GAP_CHARACTERISTIC_RECONN_ADDR 0x2A03 /**< Reconnection Address Characteristic. */ #define BLE_UUID_GAP_CHARACTERISTIC_PPCP 0x2A04 /**< Peripheral Preferred Connection Parameters Characteristic. */ #define BLE_UUID_GAP_CHARACTERISTIC_CAR 0x2AA6 /**< Central Address Resolution Characteristic. */ +#define BLE_UUID_GAP_CHARACTERISTIC_RPA_ONLY 0x2AC9 /**< Resolvable Private Address Only Characteristic. */ /** @} */ @@ -192,6 +195,13 @@ typedef struct uint8_t type; /**< UUID type, see @ref BLE_UUID_TYPES. If type is @ref BLE_UUID_TYPE_UNKNOWN, the value of uuid is undefined. */ } ble_uuid_t; +/**@brief Data structure. */ +typedef struct +{ + uint8_t *p_data; /**< Pointer to the data buffer provided to/from the application. */ + uint16_t len; /**< Length of the data buffer, in bytes. */ +} ble_data_t; + /** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf52/nrf_mbr.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf52/nrf_mbr.h new file mode 100644 index 0000000000..e0c80e278c --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf52/nrf_mbr.h @@ -0,0 +1,242 @@ +/* + * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @defgroup nrf_mbr_api Master Boot Record API + @{ + + @brief APIs for updating SoftDevice and BootLoader + +*/ + +#ifndef NRF_MBR_H__ +#define NRF_MBR_H__ + +#include "nrf_svc.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup NRF_MBR_DEFINES Defines + * @{ */ + +/**@brief MBR SVC Base number. */ +#define MBR_SVC_BASE (0x18) + +/**@brief Page size in words. */ +#define MBR_PAGE_SIZE_IN_WORDS (1024) + +/** @brief The size that must be reserved for the MBR when a SoftDevice is written to flash. +This is the offset where the first byte of the SoftDevice hex file is written.*/ +#define MBR_SIZE (0x1000) + +/** @} */ + +/** @addtogroup NRF_MBR_ENUMS Enumerations + * @{ */ + +/**@brief nRF Master Boot Record API SVC numbers. */ +enum NRF_MBR_SVCS +{ + SD_MBR_COMMAND = MBR_SVC_BASE, /**< ::sd_mbr_command */ +}; + +/**@brief Possible values for ::sd_mbr_command_t.command */ +enum NRF_MBR_COMMANDS +{ + SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see ::sd_mbr_command_copy_bl_t*/ + SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ + SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD. Does not require any parameters in ::sd_mbr_command_t params.*/ + SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ + SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset. @see ::sd_mbr_command_vector_table_base_set_t*/ + SD_MBR_COMMAND_RESERVED, + SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address. @see ::sd_mbr_command_irq_forward_address_set_t*/ +}; + +/** @} */ + +/** @addtogroup NRF_MBR_TYPES Types + * @{ */ + +/**@brief This command copies part of a new SoftDevice + * + * The destination area is erased before copying. + * If dst is in the middle of a flash page, that whole flash page will be erased. + * If (dst+len) is in the middle of a flash page, that whole flash page will be erased. + * + * The user of this function is responsible for setting the BPROT registers. + * + * @retval ::NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly. + * @retval ::NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying. + */ +typedef struct +{ + uint32_t *src; /**< Pointer to the source of data to be copied.*/ + uint32_t *dst; /**< Pointer to the destination where the content is to be copied.*/ + uint32_t len; /**< Number of 32 bit words to copy. Must be a multiple of @ref MBR_PAGE_SIZE_IN_WORDS words.*/ +} sd_mbr_command_copy_sd_t; + + +/**@brief This command works like memcmp, but takes the length in words. + * + * @retval ::NRF_SUCCESS indicates that the contents of both memory blocks are equal. + * @retval ::NRF_ERROR_NULL indicates that the contents of the memory blocks are not equal. + */ +typedef struct +{ + uint32_t *ptr1; /**< Pointer to block of memory. */ + uint32_t *ptr2; /**< Pointer to block of memory. */ + uint32_t len; /**< Number of 32 bit words to compare.*/ +} sd_mbr_command_compare_t; + + +/**@brief This command copies a new BootLoader. + * + * With this command, destination of BootLoader is always the address written in + * NRF_UICR->BOOTADDR. + * + * Destination is erased by this function. + * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. + * + * This function will use the flash protect peripheral (BPROT or ACL) to protect the flash that is + * not intended to be written. + * + * On success, this function will not return. It will start the new BootLoader from reset-vector as normal. + * + * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. + * @retval ::NRF_ERROR_FORBIDDEN if NRF_UICR->BOOTADDR is not set. + * @retval ::NRF_ERROR_INVALID_LENGTH if parameters attempts to read or write outside flash area. + * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) + */ +typedef struct +{ + uint32_t *bl_src; /**< Pointer to the source of the Bootloader to be be copied.*/ + uint32_t bl_len; /**< Number of 32 bit words to copy for BootLoader. */ +} sd_mbr_command_copy_bl_t; + +/**@brief Change the address the MBR starts after a reset + * + * Once this function has been called, this address is where the MBR will start to forward + * interrupts to after a reset. + * + * To restore default forwarding this function should be called with @ref address set to 0. The + * MBR will then start forwarding interrupts to the address in NFR_UICR->BOOTADDR or to the + * SoftDevice if the BOOTADDR is not set. + * + * On success, this function will not return. It will reset the device. + * + * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. + * @retval ::NRF_ERROR_INVALID_ADDR if parameter address is outside of the flash size. + * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) + */ +typedef struct +{ + uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ +} sd_mbr_command_vector_table_base_set_t; + +/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR + * + * Unlike sd_mbr_command_vector_table_base_set_t, this function does not reset, and it does not + * change where the MBR starts after reset. + * + * @retval ::NRF_SUCCESS + */ +typedef struct +{ + uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ +} sd_mbr_command_irq_forward_address_set_t; + +/**@brief Input structure containing data used when calling ::sd_mbr_command + * + * Depending on what command value that is set, the corresponding params value type must also be + * set. See @ref NRF_MBR_COMMANDS for command types and corresponding params value type. If command + * @ref SD_MBR_COMMAND_INIT_SD is set, it is not necessary to set any values under params. + */ +typedef struct +{ + uint32_t command; /**< Type of command to be issued. See @ref NRF_MBR_COMMANDS. */ + union + { + sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ + sd_mbr_command_compare_t compare; /**< Parameters for verify.*/ + sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ + sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ + sd_mbr_command_irq_forward_address_set_t irq_forward_address_set; /**< Parameters for irq forward address set*/ + } params; /**< Command parameters. */ +} sd_mbr_command_t; + +/** @} */ + +/** @addtogroup NRF_MBR_FUNCTIONS Functions + * @{ */ + +/**@brief Issue Master Boot Record commands + * + * Commands used when updating a SoftDevice and bootloader. + * + * The @ref SD_MBR_COMMAND_COPY_BL and @ref SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires + * parameters to be retained by the MBR when resetting the IC. This is done in a separate flash + * page provided by the application. The UICR register UICR.NRFFW[1] must be set to an address + * corresponding to a page in the application flash space. This page will be cleared by the MBR and + * used to store the command before reset. When the UICR.NRFFW[1] field is set the page it refers + * to must not be used by the application. If the UICR.NRFFW[1] is set to 0xFFFFFFFF (the default) + * MBR commands which use flash will be unavailable and return @ref NRF_ERROR_NO_MEM. + * + * @param[in] param Pointer to a struct describing the command. + * + * @note For return values, see ::sd_mbr_command_copy_sd_t, ::sd_mbr_command_copy_bl_t, + * ::sd_mbr_command_compare_t, ::sd_mbr_command_vector_table_base_set_t, + * ::sd_mbr_command_irq_forward_address_set_t + * + * @retval ::NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF). + * @retval ::NRF_ERROR_INVALID_PARAM if an invalid command is given. +*/ +SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param)); + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // NRF_MBR_H__ + +/** + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_ble.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_ble.h similarity index 85% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_ble.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_ble.h index c4835fa6ef..9ebb41f538 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_ble.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_ble.h @@ -1,37 +1,39 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @@ -47,8 +49,10 @@ #ifndef BLE_H__ #define BLE_H__ -#include "ble_ranges.h" -#include "ble_types.h" +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_err.h" #include "ble_gap.h" #include "ble_l2cap.h" #include "ble_gatt.h" @@ -84,8 +88,8 @@ enum BLE_COMMON_SVCS */ enum BLE_COMMON_EVTS { - BLE_EVT_USER_MEM_REQUEST = BLE_EVT_BASE, /**< User Memory request. @ref ble_evt_user_mem_request_t */ - BLE_EVT_USER_MEM_RELEASE, /**< User Memory release. @ref ble_evt_user_mem_release_t */ + BLE_EVT_USER_MEM_REQUEST = BLE_EVT_BASE + 0, /**< User Memory request. @ref ble_evt_user_mem_request_t */ + BLE_EVT_USER_MEM_RELEASE = BLE_EVT_BASE + 1, /**< User Memory release. @ref ble_evt_user_mem_release_t */ }; /**@brief BLE Connection Configuration IDs. @@ -94,10 +98,11 @@ enum BLE_COMMON_EVTS */ enum BLE_CONN_CFGS { - BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE, /**< BLE GAP specific connection configuration. */ - BLE_CONN_CFG_GATTC, /**< BLE GATTC specific connection configuration. */ - BLE_CONN_CFG_GATTS, /**< BLE GATTS specific connection configuration. */ - BLE_CONN_CFG_GATT, /**< BLE GATT specific connection configuration. */ + BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE + 0, /**< BLE GAP specific connection configuration. */ + BLE_CONN_CFG_GATTC = BLE_CONN_CFG_BASE + 1, /**< BLE GATTC specific connection configuration. */ + BLE_CONN_CFG_GATTS = BLE_CONN_CFG_BASE + 2, /**< BLE GATTS specific connection configuration. */ + BLE_CONN_CFG_GATT = BLE_CONN_CFG_BASE + 3, /**< BLE GATT specific connection configuration. */ + BLE_CONN_CFG_L2CAP = BLE_CONN_CFG_BASE + 4, /**< BLE L2CAP specific connection configuration. */ }; /**@brief BLE Common Configuration IDs. @@ -114,8 +119,8 @@ enum BLE_COMMON_CFGS */ enum BLE_COMMON_OPTS { - BLE_COMMON_OPT_PA_LNA = BLE_OPT_BASE, /**< PA and LNA options */ - BLE_COMMON_OPT_CONN_EVT_EXT, /**< Extended connection events option */ + BLE_COMMON_OPT_PA_LNA = BLE_OPT_BASE + 0, /**< PA and LNA options */ + BLE_COMMON_OPT_CONN_EVT_EXT = BLE_OPT_BASE + 1, /**< Extended connection events option */ }; /** @} */ @@ -135,13 +140,9 @@ enum BLE_COMMON_OPTS * @note The highest value used for @ref ble_gatt_conn_cfg_t::att_mtu in any connection configuration shall be used as a parameter. * If that value has not been configured for any connections then @ref BLE_GATT_ATT_MTU_DEFAULT must be used instead. */ -#define BLE_EVT_LEN_MAX(ATT_MTU) (BLE_MAX( \ - sizeof(ble_evt_t), \ - BLE_MAX( \ - offsetof(ble_evt_t, evt.gattc_evt.params.rel_disc_rsp.includes) + ((ATT_MTU) - 2) / 6 * sizeof(ble_gattc_include_t), \ - offsetof(ble_evt_t, evt.gattc_evt.params.attr_info_disc_rsp.info.attr_info16) + ((ATT_MTU) - 2) / 4 * sizeof(ble_gattc_attr_info16_t) \ - ) \ -)) +#define BLE_EVT_LEN_MAX(ATT_MTU) ( \ + offsetof(ble_evt_t, evt.gattc_evt.params.prim_srvc_disc_rsp.services) + ((ATT_MTU) - 1) / 4 * sizeof(ble_gattc_service_t) \ +) /** @defgroup BLE_USER_MEM_TYPES User Memory Types * @{ */ @@ -216,6 +217,7 @@ typedef struct ble_gap_evt_t gap_evt; /**< GAP originated event, evt_id in BLE_GAP_EVT_* series. */ ble_gattc_evt_t gattc_evt; /**< GATT client originated event, evt_id in BLE_GATTC_EVT* series. */ ble_gatts_evt_t gatts_evt; /**< GATT server originated event, evt_id in BLE_GATTS_EVT* series. */ + ble_l2cap_evt_t l2cap_evt; /**< L2CAP originated event, evt_id in BLE_L2CAP_EVT* series. */ } evt; /**< Event union. */ } ble_evt_t; @@ -225,7 +227,7 @@ typedef struct */ typedef struct { - uint8_t version_number; /**< Link Layer Version number for BT 4.1 spec is 7 (https://www.bluetooth.org/en-us/specification/assigned-numbers/link-layer). */ + uint8_t version_number; /**< Link Layer Version number. See https://www.bluetooth.org/en-us/specification/assigned-numbers/link-layer for assigned values. */ uint16_t company_id; /**< Company ID, Nordic Semiconductor's company ID is 89 (0x0059) (https://www.bluetooth.org/apps/content/Default.aspx?doc_id=49708). */ uint16_t subversion_number; /**< Link Layer Sub Version number, corresponds to the SoftDevice Config ID or Firmware ID (FWID). */ } ble_version_t; @@ -250,7 +252,6 @@ typedef struct * by the application and should be regarded as reserved as long as any PA/LNA toggling is enabled. * * @note @ref sd_ble_opt_get is not supported for this option. - * @note This feature is only supported for nRF52, on nRF51 @ref NRF_ERROR_NOT_SUPPORTED will always be returned. * @note Setting this option while the radio is in use (i.e. any of the roles are active) may have undefined consequences * and must be avoided by the application. */ @@ -301,7 +302,10 @@ typedef union * In the case that no configurations has been set, or fewer connection configurations has been set than enabled connections, * the default connection configuration will be automatically added for the remaining connections. * When creating connections with the default configuration, @ref BLE_CONN_CFG_TAG_DEFAULT should be used in - * place of @ref ble_conn_cfg_t::conn_cfg_tag. See @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect()" + * place of @ref ble_conn_cfg_t::conn_cfg_tag. + * + * @sa sd_ble_gap_adv_start() + * @sa sd_ble_gap_connect() * * @mscs * @mmsc{@ref BLE_CONN_CFG} @@ -310,14 +314,16 @@ typedef union */ typedef struct { - uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() - calls to select this configuration when creating a connection. + uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the + @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() calls + to select this configuration when creating a connection. Must be different for all connection configurations added and not @ref BLE_CONN_CFG_TAG_DEFAULT. */ union { ble_gap_conn_cfg_t gap_conn_cfg; /**< GAP connection configuration, cfg_id is @ref BLE_CONN_CFG_GAP. */ ble_gattc_conn_cfg_t gattc_conn_cfg; /**< GATTC connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTC. */ - ble_gatts_conn_cfg_t gatts_conn_cfg; /**< GATTS this connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTS. */ - ble_gatt_conn_cfg_t gatt_conn_cfg; /**< GATT this connection configuration, cfg_id is @ref BLE_CONN_CFG_GATT. */ + ble_gatts_conn_cfg_t gatts_conn_cfg; /**< GATTS connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTS. */ + ble_gatt_conn_cfg_t gatt_conn_cfg; /**< GATT connection configuration, cfg_id is @ref BLE_CONN_CFG_GATT. */ + ble_l2cap_conn_cfg_t l2cap_conn_cfg; /**< L2CAP connection configuration, cfg_id is @ref BLE_CONN_CFG_L2CAP. */ } params; /**< Connection configuration union. */ } ble_conn_cfg_t; @@ -478,7 +484,7 @@ SVCALL(SD_BLE_EVT_GET, uint32_t, sd_ble_evt_get(uint8_t *p_dest, uint16_t *p_len * the 16-bit uuid field in @ref ble_uuid_t. * * @note If a UUID is already present in the BLE stack's internal table, the corresponding index will be returned in - * p_uuid_type along with an NRF_SUCCESS error code. + * p_uuid_type along with an @ref NRF_SUCCESS error code. * * @param[in] p_vs_uuid Pointer to a 16-octet (128-bit) little endian Vendor Specific UUID disregarding * bytes 12 and 13. @@ -548,7 +554,7 @@ SVCALL(SD_BLE_VERSION_GET, uint32_t, sd_ble_version_get(ble_version_t *p_version * @param[in] p_block Pointer to a user memory block structure or NULL if memory is managed by the application. * * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_PEER_CANCEL_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} @@ -558,6 +564,7 @@ SVCALL(SD_BLE_VERSION_GET, uint32_t, sd_ble_version_get(ble_version_t *p_version * * @retval ::NRF_SUCCESS Successfully queued a response to the peer. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. * @retval ::NRF_ERROR_INVALID_LENGTH Invalid user memory block length supplied. * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection state or no user memory request pending. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error.h similarity index 60% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error.h index 43c091630b..6badee98e5 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error.h @@ -1,38 +1,41 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + /** @defgroup nrf_error SoftDevice Global Error Codes @{ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error_sdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error_sdm.h new file mode 100644 index 0000000000..530959b9d6 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error_sdm.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + /** + @addtogroup nrf_sdm_api + @{ + @defgroup nrf_sdm_error SoftDevice Manager Error Codes + @{ + + @brief Error definitions for the SDM API +*/ + +/* Header guard */ +#ifndef NRF_ERROR_SDM_H__ +#define NRF_ERROR_SDM_H__ + +#include "nrf_error.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN (NRF_ERROR_SDM_BASE_NUM + 0) ///< Unknown LFCLK source. +#define NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION (NRF_ERROR_SDM_BASE_NUM + 1) ///< Incorrect interrupt configuration (can be caused by using illegal priority levels, or having enabled SoftDevice interrupts). +#define NRF_ERROR_SDM_INCORRECT_CLENR0 (NRF_ERROR_SDM_BASE_NUM + 2) ///< Incorrect CLENR0 (can be caused by erroneous SoftDevice flashing). + +#ifdef __cplusplus +} +#endif +#endif // NRF_ERROR_SDM_H__ + +/** + @} + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error_soc.h new file mode 100644 index 0000000000..1e784b8db3 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_error_soc.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup nrf_soc_api + @{ + @defgroup nrf_soc_error SoC Library Error Codes + @{ + + @brief Error definitions for the SoC library + +*/ + +/* Header guard */ +#ifndef NRF_ERROR_SOC_H__ +#define NRF_ERROR_SOC_H__ + +#include "nrf_error.h" +#ifdef __cplusplus +extern "C" { +#endif + +/* Mutex Errors */ +#define NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN (NRF_ERROR_SOC_BASE_NUM + 0) ///< Mutex already taken + +/* NVIC errors */ +#define NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE (NRF_ERROR_SOC_BASE_NUM + 1) ///< NVIC interrupt not available +#define NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED (NRF_ERROR_SOC_BASE_NUM + 2) ///< NVIC interrupt priority not allowed +#define NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 3) ///< NVIC should not return + +/* Power errors */ +#define NRF_ERROR_SOC_POWER_MODE_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 4) ///< Power mode unknown +#define NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 5) ///< Power POF threshold unknown +#define NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 6) ///< Power off should not return + +/* Rand errors */ +#define NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES (NRF_ERROR_SOC_BASE_NUM + 7) ///< RAND not enough values + +/* PPI errors */ +#define NRF_ERROR_SOC_PPI_INVALID_CHANNEL (NRF_ERROR_SOC_BASE_NUM + 8) ///< Invalid PPI Channel +#define NRF_ERROR_SOC_PPI_INVALID_GROUP (NRF_ERROR_SOC_BASE_NUM + 9) ///< Invalid PPI Group + +#ifdef __cplusplus +} +#endif +#endif // NRF_ERROR_SOC_H__ +/** + @} + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_nvic.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_nvic.h similarity index 78% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_nvic.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_nvic.h index f4e3808071..c71a633c6b 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_nvic.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_nvic.h @@ -1,38 +1,41 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + /** * @defgroup nrf_nvic_api SoftDevice NVIC API * @{ @@ -54,7 +57,8 @@ #include #include "nrf.h" - +#include "nrf_svc.h" +#include "nrf_error.h" #include "nrf_error_soc.h" #ifdef __cplusplus @@ -69,49 +73,31 @@ extern "C" { #define __NRF_NVIC_NVMC_IRQn (30) /**< The peripheral ID of the NVMC. IRQ numbers are used to identify peripherals, but the NVMC doesn't have an IRQ number in the MDK. */ -#ifdef NRF51 - #define __NRF_NVIC_ISER_COUNT (1) /**< The number of ISER/ICER registers in the NVIC that are used. */ +#define __NRF_NVIC_ISER_COUNT (2) /**< The number of ISER/ICER registers in the NVIC that are used. */ - /**@brief Interrupts used by the SoftDevice. */ - #define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ - (1U << POWER_CLOCK_IRQn) \ - | (1U << RADIO_IRQn) \ - | (1U << RTC0_IRQn) \ - | (1U << TIMER0_IRQn) \ - | (1U << RNG_IRQn) \ - | (1U << ECB_IRQn) \ - | (1U << CCM_AAR_IRQn) \ - | (1U << TEMP_IRQn) \ - | (1U << __NRF_NVIC_NVMC_IRQn) \ - | (1U << (uint32_t)SWI5_IRQn) \ - )) +/**@brief Interrupts used by the SoftDevice, with IRQn in the range 0-31. */ +#define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ + (1U << POWER_CLOCK_IRQn) \ + | (1U << RADIO_IRQn) \ + | (1U << RTC0_IRQn) \ + | (1U << TIMER0_IRQn) \ + | (1U << RNG_IRQn) \ + | (1U << ECB_IRQn) \ + | (1U << CCM_AAR_IRQn) \ + | (1U << TEMP_IRQn) \ + | (1U << __NRF_NVIC_NVMC_IRQn) \ + | (1U << (uint32_t)SWI5_IRQn) \ + )) - /**@brief Interrupts available for to application. */ - #define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) -#endif +/**@brief Interrupts used by the SoftDevice, with IRQn in the range 32-63. */ +#define __NRF_NVIC_SD_IRQS_1 ((uint32_t)0) -#if defined(NRF52) || defined(NRF52840_XXAA) - #define __NRF_NVIC_ISER_COUNT (2) /**< The number of ISER/ICER registers in the NVIC that are used. */ +/**@brief Interrupts available for to application, with IRQn in the range 0-31. */ +#define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) - /**@brief Interrupts used by the SoftDevice. */ - #define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ - (1U << POWER_CLOCK_IRQn) \ - | (1U << RADIO_IRQn) \ - | (1U << RTC0_IRQn) \ - | (1U << TIMER0_IRQn) \ - | (1U << RNG_IRQn) \ - | (1U << ECB_IRQn) \ - | (1U << CCM_AAR_IRQn) \ - | (1U << TEMP_IRQn) \ - | (1U << __NRF_NVIC_NVMC_IRQn) \ - | (1U << (uint32_t)SWI5_EGU5_IRQn) \ - )) - #define __NRF_NVIC_SD_IRQS_1 ((uint32_t)0) +/**@brief Interrupts available for to application, with IRQn in the range 32-63. */ +#define __NRF_NVIC_APP_IRQS_1 (~__NRF_NVIC_SD_IRQS_1) - /**@brief Interrupts available for to application. */ - #define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) - #define __NRF_NVIC_APP_IRQS_1 (~__NRF_NVIC_SD_IRQS_1) -#endif /**@} */ /**@} */ @@ -307,12 +293,10 @@ __STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn) { return ((1UL<ICER[0] & __NRF_NVIC_APP_IRQS_0 ); NVIC->ICER[0] = __NRF_NVIC_APP_IRQS_0; - #if defined(NRF52) || defined(NRF52840_XXAA) nrf_nvic_state.__irq_masks[1] = ( NVIC->ICER[1] & __NRF_NVIC_APP_IRQS_1 ); NVIC->ICER[1] = __NRF_NVIC_APP_IRQS_1; - #endif *p_is_nested_critical_region = 0; } else @@ -493,9 +465,7 @@ __STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical { int was_masked = __sd_nvic_irq_disable(); NVIC->ISER[0] = nrf_nvic_state.__irq_masks[0]; - #if defined(NRF52) || defined(NRF52840_XXAA) NVIC->ISER[1] = nrf_nvic_state.__irq_masks[1]; - #endif nrf_nvic_state.__cr_flag = 0; if (!was_masked) { diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_sd_def.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_sd_def.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_sd_def.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_sd_def.h index 0b4d221d6a..c9ab241872 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S112/headers/nrf_sd_def.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_sd_def.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_sdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_sdm.h similarity index 61% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_sdm.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_sdm.h index 57ffe13358..8c48d93678 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_sdm.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_sdm.h @@ -1,38 +1,41 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + /** @defgroup nrf_sdm_api SoftDevice Manager API @{ @@ -44,10 +47,12 @@ #ifndef NRF_SDM_H__ #define NRF_SDM_H__ -#include "nrf_svc.h" +#include #include "nrf.h" -#include "nrf_soc.h" +#include "nrf_svc.h" +#include "nrf_error.h" #include "nrf_error_sdm.h" +#include "nrf_soc.h" #ifdef __cplusplus extern "C" { @@ -62,7 +67,7 @@ extern "C" { #endif /** @brief The major version for the SoftDevice binary distributed with this header file. */ -#define SD_MAJOR_VERSION (0) +#define SD_MAJOR_VERSION (6) /** @brief The minor version for the SoftDevice binary distributed with this header file. */ #define SD_MINOR_VERSION (0) @@ -80,6 +85,9 @@ extern "C" { /** @brief SoftDevice Manager SVC Base number. */ #define SDM_SVC_BASE 0x10 +/** @brief SoftDevice unique string size in bytes. */ +#define SD_UNIQUE_STR_SIZE 20 + /** @brief Invalid info field. Returned when an info field does not exist. */ #define SDM_INFO_FIELD_INVALID (0) @@ -111,6 +119,11 @@ the start of the SoftDevice (without MBR)*/ * the same format as @ref SD_VERSION, stored as an uint32_t. */ #define SD_VERSION_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x14) +/** @brief Defines the offset for the SoftDevice unique string relative to the SoftDevice base address. + * The SD_UNIQUE_STR is stored as an array of uint8_t. The size of array is @ref SD_UNIQUE_STR_SIZE. + */ +#define SD_UNIQUE_STR_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x18) + /** @brief Defines a macro for retrieving the actual SoftDevice Information Structure size value * from a given base address. Use @ref MBR_SIZE as the argument when the SoftDevice is * installed just above the MBR (the usual case). */ @@ -121,8 +134,8 @@ the start of the SoftDevice (without MBR)*/ * the MBR (the usual case). */ #define SD_SIZE_GET(baseaddr) (*((uint32_t *) ((baseaddr) + SD_SIZE_OFFSET))) -/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use @ref - * MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual +/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use + * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual * case). */ #define SD_FWID_GET(baseaddr) (*((uint16_t *) ((baseaddr) + SD_FWID_OFFSET))) @@ -132,12 +145,18 @@ the start of the SoftDevice (without MBR)*/ #define SD_ID_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_ID_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ ? (*((uint32_t *) ((baseaddr) + SD_ID_OFFSET))) : SDM_INFO_FIELD_INVALID) -/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use @ref - * MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual - * case). */ +/** @brief Defines a macro for retrieving the actual SoftDevice version from a given base address. + * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR + * (the usual case). */ #define SD_VERSION_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_VERSION_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ ? (*((uint32_t *) ((baseaddr) + SD_VERSION_OFFSET))) : SDM_INFO_FIELD_INVALID) +/** @brief Defines a macro for retrieving the address of SoftDevice unique str based on a given base address. + * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR + * (the usual case). */ +#define SD_UNIQUE_STR_ADDR_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_UNIQUE_STR_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ + ? (((uint8_t *) ((baseaddr) + SD_UNIQUE_STR_OFFSET))) : SDM_INFO_FIELD_INVALID) + /**@defgroup NRF_FAULT_ID_RANGES Fault ID ranges * @{ */ #define NRF_FAULT_ID_SD_RANGE_START 0x00000000 /**< SoftDevice ID range start. */ @@ -147,9 +166,11 @@ the start of the SoftDevice (without MBR)*/ /**@defgroup NRF_FAULT_IDS Fault ID types * @{ */ #define NRF_FAULT_ID_SD_ASSERT (NRF_FAULT_ID_SD_RANGE_START + 1) /**< SoftDevice assertion. The info parameter is reserved for future used. */ -#define NRF_FAULT_ID_APP_MEMACC (NRF_FAULT_ID_APP_RANGE_START + 1) /**< Application invalid memory access (nRF52 only). The info parameter will contain 0x00000000, in case of SoftDevice RAM - access violation. In case of SoftDevice peripheral register violation the info parameter will contain the sub-region number of PREGION[0], on whose address range the disallowed - write access caused the memory access fault. */ +#define NRF_FAULT_ID_APP_MEMACC (NRF_FAULT_ID_APP_RANGE_START + 1) /**< Application invalid memory access. The info parameter will contain 0x00000000, + in case of SoftDevice RAM access violation. In case of SoftDevice peripheral + register violation the info parameter will contain the sub-region number of + PREGION[0], on whose address range the disallowed write access caused the + memory access fault. */ /**@} */ /** @} */ @@ -172,21 +193,21 @@ enum NRF_SD_SVCS /** @addtogroup NRF_SDM_DEFINES Defines * @{ */ -/**@defgroup NRF_CLOCK_LF_XTAL_ACCURACY Clock accuracy +/**@defgroup NRF_CLOCK_LF_ACCURACY Clock accuracy * @{ */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_250_PPM (0) /**< Default: 250 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_500_PPM (1) /**< 500 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_150_PPM (2) /**< 150 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_100_PPM (3) /**< 100 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_75_PPM (4) /**< 75 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_50_PPM (5) /**< 50 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_30_PPM (6) /**< 30 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_20_PPM (7) /**< 20 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_10_PPM (8) /**< 10 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_5_PPM (9) /**< 5 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_2_PPM (10) /**< 2 ppm */ -#define NRF_CLOCK_LF_XTAL_ACCURACY_1_PPM (11) /**< 1 ppm */ +#define NRF_CLOCK_LF_ACCURACY_250_PPM (0) /**< Default: 250 ppm */ +#define NRF_CLOCK_LF_ACCURACY_500_PPM (1) /**< 500 ppm */ +#define NRF_CLOCK_LF_ACCURACY_150_PPM (2) /**< 150 ppm */ +#define NRF_CLOCK_LF_ACCURACY_100_PPM (3) /**< 100 ppm */ +#define NRF_CLOCK_LF_ACCURACY_75_PPM (4) /**< 75 ppm */ +#define NRF_CLOCK_LF_ACCURACY_50_PPM (5) /**< 50 ppm */ +#define NRF_CLOCK_LF_ACCURACY_30_PPM (6) /**< 30 ppm */ +#define NRF_CLOCK_LF_ACCURACY_20_PPM (7) /**< 20 ppm */ +#define NRF_CLOCK_LF_ACCURACY_10_PPM (8) /**< 10 ppm */ +#define NRF_CLOCK_LF_ACCURACY_5_PPM (9) /**< 5 ppm */ +#define NRF_CLOCK_LF_ACCURACY_2_PPM (10) /**< 2 ppm */ +#define NRF_CLOCK_LF_ACCURACY_1_PPM (11) /**< 1 ppm */ /** @} */ @@ -207,36 +228,34 @@ enum NRF_SD_SVCS /**@brief Type representing LFCLK oscillator source. */ typedef struct { - uint8_t source; /**< LF oscillator clock source, see @ref NRF_CLOCK_LF_SRC. */ - uint8_t rc_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second - units (nRF51: 1-64, nRF52: 1-32). - @note To avoid excessive clock drift, 0.5 degrees Celsius is the - maximum temperature change allowed in one calibration timer - interval. The interval should be selected to ensure this. + uint8_t source; /**< LF oscillator clock source, see @ref NRF_CLOCK_LF_SRC. */ + uint8_t rc_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second + units (nRF52: 1-32). + @note To avoid excessive clock drift, 0.5 degrees Celsius is the + maximum temperature change allowed in one calibration timer + interval. The interval should be selected to ensure this. - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. */ - uint8_t rc_temp_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: How often (in number of calibration - intervals) the RC oscillator shall be calibrated if the temperature - hasn't changed. - 0: Always calibrate even if the temperature hasn't changed. - 1: Only calibrate if the temperature has changed (nRF51 only). - 2-33: Check the temperature and only calibrate if it has changed, - however calibration will take place every rc_temp_ctiv - intervals in any case. + @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. */ + uint8_t rc_temp_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: How often (in number of calibration + intervals) the RC oscillator shall be calibrated if the temperature + hasn't changed. + 0: Always calibrate even if the temperature hasn't changed. + 1: Only calibrate if the temperature has changed (legacy - nRF51 only). + 2-33: Check the temperature and only calibrate if it has changed, + however calibration will take place every rc_temp_ctiv + intervals in any case. - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. + @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. - @note For nRF52, the application must ensure calibration at least once - every 8 seconds to ensure +/-250 ppm clock stability. The - recommended configuration for NRF_CLOCK_LF_SRC_RC on nRF52 is - rc_ctiv=16 and rc_temp_ctiv=2. This will ensure calibration at - least once every 8 seconds and for temperature changes of 0.5 - degrees Celsius every 4 seconds. See the Product Specification - for the nRF52 device being used for more information.*/ - uint8_t xtal_accuracy; /**< External crystal clock accuracy used in the LL to compute timing - windows, see @ref NRF_CLOCK_LF_XTAL_ACCURACY. - - @note For the NRF_CLOCK_LF_SRC_RC clock source this parameter is ignored. */ + @note For nRF52, the application must ensure calibration at least once + every 8 seconds to ensure +/-500 ppm clock stability. The + recommended configuration for ::NRF_CLOCK_LF_SRC_RC on nRF52 is + rc_ctiv=16 and rc_temp_ctiv=2. This will ensure calibration at + least once every 8 seconds and for temperature changes of 0.5 + degrees Celsius every 4 seconds. See the Product Specification + for the nRF52 device being used for more information.*/ + uint8_t accuracy; /**< External clock accuracy used in the LL to compute timing + windows, see @ref NRF_CLOCK_LF_ACCURACY.*/ } nrf_clock_lf_cfg_t; /**@brief Fault Handler type. @@ -252,7 +271,7 @@ typedef struct * @param[in] pc The program counter of the instruction that triggered the fault. * @param[in] info Optional additional information regarding the fault. Refer to each Fault identifier for details. * - * @note When id is set to NRF_FAULT_ID_APP_MEMACC, pc will contain the address of the instruction being executed at the time when + * @note When id is set to @ref NRF_FAULT_ID_APP_MEMACC, pc will contain the address of the instruction being executed at the time when * the fault is detected by the CPU. The CPU program counter may have advanced up to 2 instructions (no branching) after the one that triggered the fault. */ typedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info); @@ -289,6 +308,7 @@ typedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info); * @retval ::NRF_ERROR_INVALID_STATE SoftDevice is already enabled, and the clock source and fault handler cannot be updated. * @retval ::NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION SoftDevice interrupt is already enabled, or an enabled interrupt has an illegal priority level. * @retval ::NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN Unknown low frequency clock source selected. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid clock source configuration supplied in p_clock_lf_cfg. */ SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lf_cfg_t const * p_clock_lf_cfg, nrf_fault_handler_t fault_handler)); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_soc.h similarity index 73% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_soc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_soc.h index 875f9bb63f..3fa177281e 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_soc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_soc.h @@ -1,38 +1,41 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + /** * @defgroup nrf_soc_api SoC Library API * @{ @@ -45,10 +48,9 @@ #define NRF_SOC_H__ #include -#include -#include "nrf_svc.h" #include "nrf.h" - +#include "nrf_svc.h" +#include "nrf_error.h" #include "nrf_error_soc.h" #ifdef __cplusplus @@ -60,7 +62,7 @@ extern "C" { /**@brief The number of the lowest SVC number reserved for the SoC library. */ #define SOC_SVC_BASE (0x20) /**< Base value for SVCs that are available when the SoftDevice is disabled. */ -#define SOC_SVC_BASE_NOT_AVAILABLE (0x2B) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ +#define SOC_SVC_BASE_NOT_AVAILABLE (0x2C) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ /**@brief Guaranteed time for application to process radio inactive notification. */ #define NRF_RADIO_NOTIFICATION_INACTIVE_GUARANTEED_TIME_US (62) @@ -68,25 +70,22 @@ extern "C" { /**@brief The minimum allowed timeslot extension time. */ #define NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US (200) +/**@brief The maximum processing time to handle a timeslot extension. */ +#define NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US (17) + +/**@brief The latest time before the end of a timeslot the timeslot can be extended. */ +#define NRF_RADIO_MIN_EXTENSION_MARGIN_US (79) + #define SOC_ECB_KEY_LENGTH (16) /**< ECB key length. */ #define SOC_ECB_CLEARTEXT_LENGTH (16) /**< ECB cleartext length. */ #define SOC_ECB_CIPHERTEXT_LENGTH (SOC_ECB_CLEARTEXT_LENGTH) /**< ECB ciphertext length. */ -#ifdef NRF51 #define SD_EVT_IRQn (SWI2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ -#define SD_EVT_IRQHandler (SWI2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. */ +#define SD_EVT_IRQHandler (SWI2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. + The default interrupt priority for this handler is set to 4 */ #define RADIO_NOTIFICATION_IRQn (SWI1_IRQn) /**< The radio notification IRQ number. */ -#define RADIO_NOTIFICATION_IRQHandler (SWI1_IRQHandler) /**< The radio notification IRQ handler. */ -#endif -#if defined(NRF52) || defined(NRF52840_XXAA) -#define SD_EVT_IRQn (SWI2_EGU2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ -#define SD_EVT_IRQHandler (SWI2_EGU2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. +#define RADIO_NOTIFICATION_IRQHandler (SWI1_IRQHandler) /**< The radio notification IRQ handler. The default interrupt priority for this handler is set to 4 */ -#define RADIO_NOTIFICATION_IRQn (SWI1_EGU1_IRQn) /**< The radio notification IRQ number. */ -#define RADIO_NOTIFICATION_IRQHandler (SWI1_EGU1_IRQHandler) /**< The radio notification IRQ handler. - The default interrupt priority for this handler is set to 4 */ -#endif - #define NRF_RADIO_LENGTH_MIN_US (100) /**< The shortest allowed radio timeslot, in microseconds. */ #define NRF_RADIO_LENGTH_MAX_US (100000) /**< The longest allowed radio timeslot, in microseconds. */ @@ -104,49 +103,55 @@ extern "C" { /**@brief The SVC numbers used by the SVC functions in the SoC library. */ enum NRF_SOC_SVCS { - SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, - SD_PPI_CHANNEL_ENABLE_SET, - SD_PPI_CHANNEL_ENABLE_CLR, - SD_PPI_CHANNEL_ASSIGN, - SD_PPI_GROUP_TASK_ENABLE, - SD_PPI_GROUP_TASK_DISABLE, - SD_PPI_GROUP_ASSIGN, - SD_PPI_GROUP_GET, - SD_FLASH_PAGE_ERASE, - SD_FLASH_WRITE, - SD_FLASH_PROTECT, - SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, - SD_MUTEX_ACQUIRE, - SD_MUTEX_RELEASE, - SD_RAND_APPLICATION_POOL_CAPACITY_GET, - SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, - SD_RAND_APPLICATION_VECTOR_GET, - SD_POWER_MODE_SET, - SD_POWER_SYSTEM_OFF, - SD_POWER_RESET_REASON_GET, - SD_POWER_RESET_REASON_CLR, - SD_POWER_POF_ENABLE, - SD_POWER_POF_THRESHOLD_SET, - SD_POWER_RAM_POWER_SET, - SD_POWER_RAM_POWER_CLR, - SD_POWER_RAM_POWER_GET, - SD_POWER_GPREGRET_SET, - SD_POWER_GPREGRET_CLR, - SD_POWER_GPREGRET_GET, - SD_POWER_DCDC_MODE_SET, - SD_APP_EVT_WAIT, - SD_CLOCK_HFCLK_REQUEST, - SD_CLOCK_HFCLK_RELEASE, - SD_CLOCK_HFCLK_IS_RUNNING, - SD_RADIO_NOTIFICATION_CFG_SET, - SD_ECB_BLOCK_ENCRYPT, - SD_ECB_BLOCKS_ENCRYPT, - SD_RADIO_SESSION_OPEN, - SD_RADIO_SESSION_CLOSE, - SD_RADIO_REQUEST, - SD_EVT_GET, - SD_TEMP_GET, - SVC_SOC_LAST + SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, + SD_PPI_CHANNEL_ENABLE_SET = SOC_SVC_BASE + 1, + SD_PPI_CHANNEL_ENABLE_CLR = SOC_SVC_BASE + 2, + SD_PPI_CHANNEL_ASSIGN = SOC_SVC_BASE + 3, + SD_PPI_GROUP_TASK_ENABLE = SOC_SVC_BASE + 4, + SD_PPI_GROUP_TASK_DISABLE = SOC_SVC_BASE + 5, + SD_PPI_GROUP_ASSIGN = SOC_SVC_BASE + 6, + SD_PPI_GROUP_GET = SOC_SVC_BASE + 7, + SD_FLASH_PAGE_ERASE = SOC_SVC_BASE + 8, + SD_FLASH_WRITE = SOC_SVC_BASE + 9, + SD_PROTECTED_REGISTER_WRITE = SOC_SVC_BASE + 11, + SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, + SD_MUTEX_ACQUIRE = SOC_SVC_BASE_NOT_AVAILABLE + 1, + SD_MUTEX_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 2, + SD_RAND_APPLICATION_POOL_CAPACITY_GET = SOC_SVC_BASE_NOT_AVAILABLE + 3, + SD_RAND_APPLICATION_BYTES_AVAILABLE_GET = SOC_SVC_BASE_NOT_AVAILABLE + 4, + SD_RAND_APPLICATION_VECTOR_GET = SOC_SVC_BASE_NOT_AVAILABLE + 5, + SD_POWER_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 6, + SD_POWER_SYSTEM_OFF = SOC_SVC_BASE_NOT_AVAILABLE + 7, + SD_POWER_RESET_REASON_GET = SOC_SVC_BASE_NOT_AVAILABLE + 8, + SD_POWER_RESET_REASON_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 9, + SD_POWER_POF_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 10, + SD_POWER_POF_THRESHOLD_SET = SOC_SVC_BASE_NOT_AVAILABLE + 11, + SD_POWER_POF_THRESHOLDVDDH_SET = SOC_SVC_BASE_NOT_AVAILABLE + 12, + SD_POWER_RAM_POWER_SET = SOC_SVC_BASE_NOT_AVAILABLE + 13, + SD_POWER_RAM_POWER_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 14, + SD_POWER_RAM_POWER_GET = SOC_SVC_BASE_NOT_AVAILABLE + 15, + SD_POWER_GPREGRET_SET = SOC_SVC_BASE_NOT_AVAILABLE + 16, + SD_POWER_GPREGRET_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 17, + SD_POWER_GPREGRET_GET = SOC_SVC_BASE_NOT_AVAILABLE + 18, + SD_POWER_DCDC_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 19, + SD_POWER_DCDC0_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 20, + SD_APP_EVT_WAIT = SOC_SVC_BASE_NOT_AVAILABLE + 21, + SD_CLOCK_HFCLK_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 22, + SD_CLOCK_HFCLK_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 23, + SD_CLOCK_HFCLK_IS_RUNNING = SOC_SVC_BASE_NOT_AVAILABLE + 24, + SD_RADIO_NOTIFICATION_CFG_SET = SOC_SVC_BASE_NOT_AVAILABLE + 25, + SD_ECB_BLOCK_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 26, + SD_ECB_BLOCKS_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 27, + SD_RADIO_SESSION_OPEN = SOC_SVC_BASE_NOT_AVAILABLE + 28, + SD_RADIO_SESSION_CLOSE = SOC_SVC_BASE_NOT_AVAILABLE + 29, + SD_RADIO_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 30, + SD_EVT_GET = SOC_SVC_BASE_NOT_AVAILABLE + 31, + SD_TEMP_GET = SOC_SVC_BASE_NOT_AVAILABLE + 32, + SD_POWER_USBPWRRDY_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 33, + SD_POWER_USBDETECTED_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 34, + SD_POWER_USBREMOVED_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 35, + SD_POWER_USBREGSTATUS_GET = SOC_SVC_BASE_NOT_AVAILABLE + 36, + SVC_SOC_LAST = SOC_SVC_BASE_NOT_AVAILABLE + 37 }; /**@brief Possible values of a ::nrf_mutex_t. */ @@ -181,6 +186,27 @@ enum NRF_POWER_THRESHOLDS NRF_POWER_THRESHOLD_V28 /**< 2.8 Volts power failure threshold. */ }; +/**@brief Power failure thresholds for high voltage */ +enum NRF_POWER_THRESHOLDVDDHS +{ + NRF_POWER_THRESHOLDVDDH_V27, /**< 2.7 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V28, /**< 2.8 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V29, /**< 2.9 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V30, /**< 3.0 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V31, /**< 3.1 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V32, /**< 3.2 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V33, /**< 3.3 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V34, /**< 3.4 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V35, /**< 3.5 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V36, /**< 3.6 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V37, /**< 3.7 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V38, /**< 3.8 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V39, /**< 3.9 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V40, /**< 4.0 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V41, /**< 4.1 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V42 /**< 4.2 Volts power failure threshold. */ +}; + /**@brief DC/DC converter modes. */ enum NRF_POWER_DCDC_MODES @@ -229,7 +255,12 @@ enum NRF_RADIO_CALLBACK_SIGNAL_TYPE enum NRF_RADIO_SIGNAL_CALLBACK_ACTION { NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE, /**< Return without action. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current timeslot (maximum execution time for this action is when the extension succeeded). */ + NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current + timeslot. Maximum execution time for this action: + @ref NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US. + This action must be started at least + @ref NRF_RADIO_MIN_EXTENSION_MARGIN_US before + the end of the timeslot. */ NRF_RADIO_SIGNAL_CALLBACK_ACTION_END, /**< End the current radio timeslot. */ NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END /**< Request a new radio timeslot and end the current timeslot. */ }; @@ -277,6 +308,9 @@ enum NRF_SOC_EVTS NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN, /**< Event indicating that a radio timeslot signal callback handler return was invalid. */ NRF_EVT_RADIO_SESSION_IDLE, /**< Event indicating that a radio timeslot session is idle. */ NRF_EVT_RADIO_SESSION_CLOSED, /**< Event indicating that a radio timeslot session is closed. */ + NRF_EVT_POWER_USB_POWER_READY, /**< Event indicating that a USB 3.3 V supply is ready. */ + NRF_EVT_POWER_USB_DETECTED, /**< Event indicating that voltage supply is detected on VBUS. */ + NRF_EVT_POWER_USB_REMOVED, /**< Event indicating that voltage supply is removed from VBUS. */ NRF_EVT_NUMBER_OF_EVTS }; @@ -471,7 +505,52 @@ SVCALL(SD_POWER_SYSTEM_OFF, uint32_t, sd_power_system_off(void)); */ SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); -/**@brief Sets the power-fail threshold value. +/**@brief Enables or disables the USB power ready event. + * + * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_POWER_READY) when a USB 3.3 V supply is ready. + * The event can be retrieved with sd_evt_get(); + * + * @param[in] usbpwrrdy_enable True if the power ready event should be enabled, false if it should be disabled. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_USBPWRRDY_ENABLE, uint32_t, sd_power_usbpwrrdy_enable(uint8_t usbpwrrdy_enable)); + +/**@brief Enables or disables the power USB-detected event. + * + * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_DETECTED) when a voltage supply is detected on VBUS. + * The event can be retrieved with sd_evt_get(); + * + * @param[in] usbdetected_enable True if the power ready event should be enabled, false if it should be disabled. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_USBDETECTED_ENABLE, uint32_t, sd_power_usbdetected_enable(uint8_t usbdetected_enable)); + +/**@brief Enables or disables the power USB-removed event. + * + * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_REMOVED) when a voltage supply is removed from VBUS. + * The event can be retrieved with sd_evt_get(); + * + * @param[in] usbremoved_enable True if the power ready event should be enabled, false if it should be disabled. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_USBREMOVED_ENABLE, uint32_t, sd_power_usbremoved_enable(uint8_t usbremoved_enable)); + +/**@brief Get USB supply status register content. + * + * @param[out] usbregstatus The content of USBREGSTATUS register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_USBREGSTATUS_GET, uint32_t, sd_power_usbregstatus_get(uint32_t * usbregstatus)); + +/**@brief Sets the power failure comparator threshold value. + * + * @note: Power failure comparator threshold setting. This setting applies both for normal voltage + * mode (supply connected to both VDD and VDDH) and high voltage mode (supply connected to + * VDDH only). * * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDS. * @@ -480,6 +559,19 @@ SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); */ SVCALL(SD_POWER_POF_THRESHOLD_SET, uint32_t, sd_power_pof_threshold_set(uint8_t threshold)); +/**@brief Sets the power failure comparator threshold value for high voltage. + * + * @note: Power failure comparator threshold setting for high voltage mode (supply connected to + * VDDH only). This setting does not apply for normal voltage mode (supply connected to both + * VDD and VDDH). + * + * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDVDDHS. + * + * @retval ::NRF_SUCCESS The power failure threshold was set. + * @retval ::NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN The power failure threshold is unknown. + */ +SVCALL(SD_POWER_POF_THRESHOLDVDDH_SET, uint32_t, sd_power_pof_thresholdvddh_set(uint8_t threshold)); + /**@brief Writes the NRF_POWER->RAM[index].POWERSET register. * * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERSET register to write to. @@ -512,7 +604,6 @@ SVCALL(SD_POWER_RAM_POWER_GET, uint32_t, sd_power_ram_power_get(uint8_t index, u * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. * @param[in] gpregret_msk Bits to be set in the GPREGRET register. * - * @note nRF51 does only have one general purpose retained register, so gpregret_id must be 0 on nRF51. * @retval ::NRF_SUCCESS */ SVCALL(SD_POWER_GPREGRET_SET, uint32_t, sd_power_gpregret_set(uint32_t gpregret_id, uint32_t gpregret_msk)); @@ -522,7 +613,6 @@ SVCALL(SD_POWER_GPREGRET_SET, uint32_t, sd_power_gpregret_set(uint32_t gpregret_ * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. * @param[in] gpregret_msk Bits to be clear in the GPREGRET register. * - * @note nRF51 does only have one general purpose retained register, so gpregret_id must be 0 on nRF51. * @retval ::NRF_SUCCESS */ SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_id, uint32_t gpregret_msk)); @@ -532,14 +622,11 @@ SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_ * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. * @param[out] p_gpregret Contents of the GPREGRET register. * - * @note nRF51 does only have one general purpose retained register, so gpregret_id must be 0 on nRF51. * @retval ::NRF_SUCCESS */ SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret)); -/**@brief Sets the DCDC mode. - * - * Enable or disable the DCDC peripheral. +/**@brief Enable or disable the DC/DC regulator for the regulator stage 1 (REG1). * * @param[in] dcdc_mode The mode of the DCDC, see @ref NRF_POWER_DCDC_MODES. * @@ -548,6 +635,17 @@ SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_ */ SVCALL(SD_POWER_DCDC_MODE_SET, uint32_t, sd_power_dcdc_mode_set(uint8_t dcdc_mode)); +/**@brief Enable or disable the DC/DC regulator for the regulator stage 0 (REG0). + * + * For more details on the REG0 stage, please see product specification. + * + * @param[in] dcdc_mode The mode of the DCDC0, see @ref NRF_POWER_DCDC_MODES. + * + * @retval ::NRF_SUCCESS + * @retval ::NRF_ERROR_INVALID_PARAM The dcdc_mode is invalid. + */ +SVCALL(SD_POWER_DCDC0_MODE_SET, uint32_t, sd_power_dcdc0_mode_set(uint8_t dcdc_mode)); + /**@brief Request the high frequency crystal oscillator. * * Will start the high frequency crystal oscillator, the startup time of the crystal varies @@ -584,17 +682,20 @@ SVCALL(SD_CLOCK_HFCLK_IS_RUNNING, uint32_t, sd_clock_hfclk_is_running(uint32_t * /**@brief Waits for an application event. * - * An application event is either an application interrupt or a pended interrupt when the - * interrupt is disabled. When the interrupt is enabled it will be taken immediately since - * this function will wait in thread mode, then the execution will return in the application's - * main thread. When an interrupt is disabled and gets pended it will return to the application's - * main thread. The application must ensure that the pended flag is cleared using - * ::sd_nvic_ClearPendingIRQ in order to sleep using this function. This is only necessary for - * disabled interrupts, as the interrupt handler will clear the pending flag automatically for - * enabled interrupts. + * An application event is either an application interrupt or a pended interrupt when the interrupt + * is disabled. * - * In order to wake up from disabled interrupts, the SEVONPEND flag has to be set in the Cortex-M0 - * System Control Register (SCR). @sa CMSIS_SCB + * When the application waits for an application event by calling this function, an interrupt that + * is enabled will be taken immediately on pending since this function will wait in thread mode, + * then the execution will return in the application's main thread. + * + * In order to wake up from disabled interrupts, the SEVONPEND flag has to be set in the Cortex-M + * MCU's System Control Register (SCR), CMSIS_SCB. In that case, when a disabled interrupt gets + * pended, this function will return to the application's main thread. + * + * @note The application must ensure that the pended flag is cleared using ::sd_nvic_ClearPendingIRQ + * in order to sleep using this function. This is only necessary for disabled interrupts, as + * the interrupt handler will clear the pending flag automatically for enabled interrupts. * * @note If an application interrupt has happened since the last time sd_app_evt_wait was * called this function will return immediately and not go to sleep. This is to avoid race @@ -782,20 +883,23 @@ SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp)); * @note * - This call takes control over the radio and the CPU during flash erase and write to make sure that * they will not interfere with the flash access. This means that all interrupts will be blocked -* for a predictable time (depending on the NVMC specification in nRF51 Series Reference Manual +* for a predictable time (depending on the NVMC specification in the device's Product Specification * and the command parameters). * - The data in the p_src buffer should not be modified before the @ref NRF_EVT_FLASH_OPERATION_SUCCESS * or the @ref NRF_EVT_FLASH_OPERATION_ERROR have been received if the SoftDevice is enabled. +* - This call will make the SoftDevice trigger a hardfault when the page is written, if it is +* protected. * * * @param[in] p_dst Pointer to start of flash location to be written. * @param[in] p_src Pointer to buffer with data to be written. -* @param[in] size Number of 32-bit words to write. Maximum size is 256 32-bit words for nRF51 and 1024 for nRF52. +* @param[in] size Number of 32-bit words to write. Maximum size is the number of words in one +* flash page. See the device's Product Specification for details. * * @retval ::NRF_ERROR_INVALID_ADDR Tried to write to a non existing flash address, or p_dst or p_src was unaligned. * @retval ::NRF_ERROR_BUSY The previous command has not yet completed. * @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or higher than the maximum allowed size. -* @retval ::NRF_ERROR_FORBIDDEN Tried to write to or read from protected location. +* @retval ::NRF_ERROR_FORBIDDEN Tried to write to an address outside the application flash area. * @retval ::NRF_SUCCESS The command was accepted. */ SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)); @@ -816,8 +920,10 @@ SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * @note * - This call takes control over the radio and the CPU during flash erase and write to make sure that * they will not interfere with the flash access. This means that all interrupts will be blocked -* for a predictable time (depending on the NVMC specification in nRF51 Series Reference Manual +* for a predictable time (depending on the NVMC specification in the device's Product Specification * and the command parameters). +* - This call will make the SoftDevice trigger a hardfault when the page is erased, if it is +* protected. * * * @param[in] page_number Page number of the page to erase @@ -825,29 +931,12 @@ SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. * @retval ::NRF_ERROR_INVALID_ADDR Tried to erase to a non existing flash page. * @retval ::NRF_ERROR_BUSY The previous command has not yet completed. -* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a protected page. +* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a page outside the application flash area. * @retval ::NRF_SUCCESS The command was accepted. */ SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)); -/**@brief Flash Protection set - * - * Commands to set the flash protection configuration registers. - On nRF51 this sets the PROTENSETx registers of the MPU peripheral. - On nRF52 this sets the CONFIGx registers of the BPROT peripheral. - * - * @note To read the values read them directly. They are only write-protected. - * - * @param[in] block_cfg0 Value to be written to the configuration register. - * @param[in] block_cfg1 Value to be written to the configuration register. - * @param[in] block_cfg2 Value to be written to the configuration register (ignored on nRF51). - * @param[in] block_cfg3 Value to be written to the configuration register (ignored on nRF51). - * - * @retval ::NRF_ERROR_FORBIDDEN Tried to protect the SoftDevice. - * @retval ::NRF_SUCCESS Values successfully written to configuration registers. - */ -SVCALL(SD_FLASH_PROTECT, uint32_t, sd_flash_protect(uint32_t block_cfg0, uint32_t block_cfg1, uint32_t block_cfg2, uint32_t block_cfg3)); /**@brief Opens a session for radio timeslot requests. * @@ -916,6 +1005,27 @@ SVCALL(SD_FLASH_PROTECT, uint32_t, sd_flash_protect(uint32_t block_cfg0, uint32_ */ SVCALL(SD_RADIO_REQUEST, uint32_t, sd_radio_request(nrf_radio_request_t const * p_request)); +/**@brief Write register protected by the SoftDevice + * + * This function writes to a register that is write-protected by the SoftDevice. Please refer to your + * SoftDevice Specification for more details about which registers that are protected by SoftDevice. + * This function can write to the following protected peripheral: + * - ACL + * + * @note Protected registers may be read directly. + * @note Register that are write-once will return @ref NRF_SUCCESS on second set, even the value in + * the register has not changed. See the Product Specification for more details about register + * properties. + * + * @param[in] p_register Pointer to register to be written. + * @param[in] value Value to be written to the register. + * + * @retval ::NRF_ERROR_INVALID_ADDR This function can not write to the reguested register. + * @retval ::NRF_SUCCESS Value successfully written to register. + * + */ +SVCALL(SD_PROTECTED_REGISTER_WRITE, uint32_t, sd_protected_register_write(volatile uint32_t * p_register, uint32_t value)); + /**@} */ #ifdef __cplusplus diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_svc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_svc.h new file mode 100644 index 0000000000..292c692982 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/headers/nrf_svc.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef NRF_SVC__ +#define NRF_SVC__ + +#include "stdint.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef SVCALL_AS_NORMAL_FUNCTION +#define SVCALL(number, return_type, signature) return_type signature +#else + +#ifndef SVCALL +#if defined (__CC_ARM) +#define SVCALL(number, return_type, signature) return_type __svc(number) signature +#elif defined (__GNUC__) +#ifdef __cplusplus +#define GCC_CAST_CPP (uint16_t) +#else +#define GCC_CAST_CPP +#endif +#define SVCALL(number, return_type, signature) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wreturn-type\"") \ + __attribute__((naked)) \ + __attribute__((unused)) \ + static return_type signature \ + { \ + __asm( \ + "svc %0\n" \ + "bx r14" : : "I" (GCC_CAST_CPP number) : "r0" \ + ); \ + } \ + _Pragma("GCC diagnostic pop") + +#elif defined (__ICCARM__) +#define PRAGMA(x) _Pragma(#x) +#define SVCALL(number, return_type, signature) \ +PRAGMA(swi_number = (number)) \ + __swi return_type signature; +#else +#define SVCALL(number, return_type, signature) return_type signature +#endif +#endif // SVCALL + +#endif // SVCALL_AS_NORMAL_FUNCTION + +#ifdef __cplusplus +} +#endif +#endif // NRF_SVC__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/hex/s140_nrf52_6.0.0_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/hex/s140_nrf52_6.0.0_licence-agreement.txt new file mode 100644 index 0000000000..a71adee7b9 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/hex/s140_nrf52_6.0.0_licence-agreement.txt @@ -0,0 +1,35 @@ +Copyright (c) 2007 - 2018, Nordic Semiconductor ASA +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form, except as embedded into a Nordic + Semiconductor ASA integrated circuit in a product or a software update for + such product, must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of Nordic Semiconductor ASA nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +4. This software, with or without modification, must only be used with a + Nordic Semiconductor ASA integrated circuit. + +5. Any software provided in binary form under this license must not be reverse + engineered, decompiled, modified and/or disassembled. + +THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/hex/s140_nrf52_6.0.0_softdevice.hex b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/hex/s140_nrf52_6.0.0_softdevice.hex new file mode 100644 index 0000000000..0229a59955 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/hex/s140_nrf52_6.0.0_softdevice.hex @@ -0,0 +1,9443 @@ +:020000040000FA +:1000000000040020990900002D0600007909000075 +:1000100037060000410600004B060000000000000B +:10002000000000000000000000000000BD0900000A +:1000300055060000000000005F0600006906000091 +:10004000730600007D060000870600009106000090 +:100050009B060000A5060000AF060000B9060000E0 +:10006000C3060000CD060000D7060000E106000030 +:10007000EB060000F5060000FF060000090700007F +:10008000130700001D0700002707000031070000CC +:100090003B070000450700004F070000590700001C +:1000A000630700006D07000077070000810700006C +:1000B0008B070000950700009F070000A9070000BC +:1000C000B3070000BD070000C7070000D10700000C +:1000D000DB070000E5070000EF070000F90700005C +:1000E000030800000D0800001708000021080000A8 +:1000F0002B080000350800003F08000049080000F8 +:10010000530800001FB500F003F88DE80F001FBD75 +:1001100000F038BC70B50B46010B184400F6FF70B8 +:10012000040B4FF080500022090303692403406947 +:1001300043431D1B104600F0E9F929462046BDE85F +:10014000704000F0E3B9F0B54FF6FF734FF4B475AB +:100150001A466E1E12E0A94201D3344600E00C4656 +:10016000B1EB040130F8027B641E3B441A44F9D120 +:100170009CB204EB134394B204EB12420029EAD17F +:1001800098B200EB134002EB124140EA0140F0BD8F +:10019000C34992B00446D1E90001CDE91001FF2224 +:1001A0004021684600F094FB94E80F008DE80F00B2 +:1001B000684610A902E004C841F8042D8842FAD12B +:1001C00010216846FFF7BFFF1090AA208DF8440069 +:1001D00000F0FAF800F0DDF84FF01024A0691022CA +:1001E0006946803000F0DEF8A069082210A900F00E +:1001F000D9F800F0C2F870B504460068A94D072888 +:1002000069D2DFE800F033041929561E2500D4E92D +:10021000026564682946304600F0FDF82A4621460A +:10022000304600F0BFF8AA002146304600F024FB1B +:10023000002800D0032070BD00F0D6FB4FF48050A2 +:1002400007E0201D00F0C6F80028F4D100F0CCFB38 +:1002500060682860002070BD241D94E807009200AB +:1002600000F00AFB0028F6D00E2070BD00F0BEF8AA +:100270000028FAD1D4E9010100EB81034FF080504E +:10028000026945696A43934209D84FF010225369C5 +:1002900003EB81030169406941438B4201D9092085 +:1002A00070BD5069401C01D10F2070BD2046FFF782 +:1002B0006FFF00F09BF80028F7D1201D00F08AF8AE +:1002C0000028F2D160680028F0D100F07DF800F03D +:1002D00060F800F052F8072070BD10B50C461828E1 +:1002E00002D00120086010BD2068FFF784FF206065 +:1002F00010BD4FF01024A069401C05D0A569A66967 +:1003000080353079AA2808D06069401C2DD06069FA +:100310000068401C29D060692CE010212846FFF7B6 +:1003200012FF316881421CD1A16901F18002C03104 +:1003300005E030B108CA51F8040D984201D10120FE +:1003400000E000208A42F4D158B1286810B1042896 +:1003500003D0FEE7284600F070F85249686808604C +:1003600008E000F016F800F008F84FF4805001683B +:10037000491C01D000F012FBFEE7BFF34F8F4A4843 +:1003800001684A4A01F4E06111430160BFF34F8FF5 +:10039000FEE74FF010208169491C02D0806900F00F +:1003A0008CB870472DE9F04117460D4606460024EB +:1003B00006E03046296800F093F8641C2D1D361DB8 +:1003C000BC42F6D3BDE8F0814FF0102080694FF4B5 +:1003D00080519FE64FF080510A69496900684A439D +:1003E000824201D810207047002070474FF08050A3 +:1003F0000169406941434FF01020826902F5805243 +:10040000914201D2092070478069401C01D0002030 +:1004100070470420704770B50C4605464FF480665F +:1004200008E0284600F049F8B44205D3A4F58064FA +:1004300005F58055002CF4D170BD4168044609B122 +:10044000012600E000264FF010256869A26892009E +:1004500000F012FAF8B1A06881006869FFF75AFE4F +:10046000BEB16E694FF08050A56864680169426949 +:100470005143A1420DD9016940694143A94208D9BC +:1004800029463046FFF7C7FF2A4621463046FFF788 +:1004900089FFFFF772FFFFF797FFFFF77AFFF8E793 +:1004A0000C0A0000000000200CED00E00400FA053A +:1004B000144801680029FCD07047134A02211160DA +:1004C00010490B68002BFCD00F4B1B1D18600868EF +:1004D0000028FCD00020106008680028FCD070477D +:1004E000094B10B501221A60064A1468002CFCD092 +:1004F000016010680028FCD00020186010680028F7 +:10050000FCD010BD00E4014004E5014070B50C468C +:10051000054600F073F810B900F07EF828B12146C6 +:100520002846BDE8704000F007B821462846BDE8DF +:10053000704000F037B800007FB5002200920192B1 +:10054000029203920A0B000B6946012302440AE05F +:10055000440900F01F0651F8245003FA06F635430B +:1005600041F82450401C8242F2D80D490868009A94 +:1005700010430860081D0168019A1143016000F0F2 +:100580003DF800280AD0064910310868029A104345 +:100590000860091D0868039A104308607FBD0000C9 +:1005A0000006004030B50F4C002200BF04EB0213E0 +:1005B000D3F800582DB9D3F8045815B9D3F8085812 +:1005C0001DB1521C082AF1D330BD082AFCD204EB1D +:1005D0000212C2F80008C3F804180220C3F8080881 +:1005E00030BD000000E001404FF08050D0F83001F5 +:1005F000082801D000207047012070474FF080503C +:10060000D0F83011062905D0D0F83001401C01D0B7 +:1006100000207047012070474FF08050D0F8300123 +:100620000A2801D0002070470120704708208F4918 +:1006300009680958084710208C4909680958084773 +:1006400014208A4909680958084718208749096809 +:100650000958084730208549096809580847382053 +:1006600082490968095808473C20804909680958A7 +:10067000084740207D4909680958084744207B49BC +:1006800009680958084748207849096809580847FF +:100690004C20764909680958084750207349096871 +:1006A00009580847542071490968095808475820D3 +:1006B0006E490968095808475C206C49096809585F +:1006C0000847602069490968095808476420674954 +:1006D00009680958084768206449096809580847A3 +:1006E0006C20624909680958084770205F49096809 +:1006F0000958084774205D49096809580847782057 +:100700005A490968095808477C2058490968095816 +:1007100008478020554909680958084784205349EB +:100720000968095808478820504909680958084746 +:100730008C204E4909680958084790204B490968A0 +:1007400009580847942049490968095808479820DA +:1007500046490968095808479C20444909680958CE +:100760000847A0204149096809580847A4203F4983 +:10077000096809580847A8203C49096809580847EA +:10078000AC203A49096809580847B0203749096838 +:1007900009580847B4203549096809580847B8205E +:1007A0003249096809580847BC2030490968095886 +:1007B0000847C0202D49096809580847C4202B491B +:1007C000096809580847C82028490968095808478E +:1007D000CC202649096809580847D02023490968D0 +:1007E00009580847D4202149096809580847D820E2 +:1007F0001E49096809580847DC201C49096809583E +:100800000847E0201949096809580847E4201749B2 +:10081000096809580847E820144909680958084731 +:10082000EC201249096809580847F0200F49096867 +:1008300009580847F4200D49096809580847F82065 +:100840000A49096809580847FC20084909680958F5 +:1008500008475FF480700549096809580847000097 +:1008600003480449024A034B70470000000000207F +:10087000180A0000180A000040EA010310B59B079F +:100880000FD1042A0DD310C808C9121F9C42F8D0FA +:1008900020BA19BA884201D9012010BD4FF0FF30AB +:1008A00010BD1AB1D30703D0521C07E0002010BDC1 +:1008B00010F8013B11F8014B1B1B07D110F8013B4D +:1008C00011F8014B1B1B01D1921EF1D1184610BD2E +:1008D00002F0FF0343EA032242EA024200F005B8B5 +:1008E0007047704770474FF000020429C0F0128033 +:1008F00010F0030C00F01B80CCF1040CBCF1020FD3 +:1009000018BF00F8012BA8BF20F8022BA1EB0C01A7 +:1009100000F00DB85FEAC17C24BF00F8012B00F89D +:10092000012B48BF00F8012B70474FF0000200B5C3 +:10093000134694469646203922BFA0E80C50A0E802 +:100940000C50B1F12001BFF4F7AF090728BFA0E8B0 +:100950000C5048BF0CC05DF804EB890028BF40F87C +:10096000042B08BF704748BF20F8022B11F0804FBE +:1009700018BF00F8012B7047014B1B68DB68184754 +:100980000000002009480A497047FFF7FBFFFFF706 +:10099000B9FB00BD20BFFDE7064B1847064A1060B3 +:1009A000016881F30888406800470000180A0000C9 +:1009B000180A0000F3020000000000201EF0040FDF +:1009C0000CBFEFF30881EFF30981886902380078E2 +:1009D000182803D100E00000074A1047074A1268B0 +:1009E0002C3212681047000000B5054B1B68054A01 +:1009F0009B58984700BD0000DB020000000000206B +:100A0000080A0000040000000010000000000000C0 +:080A100000FFFFFF0090D0037E +:10100000E0120020754D0200192F0000E74C02008D +:10101000192F0000192F0000192F000000000000F8 +:10102000000000000000000000000000CD4D0200A4 +:10103000192F000000000000192F0000192F0000D8 +:10104000354E02003B4E0200192F0000192F000000 +:10105000192F0000192F0000192F0000192F000070 +:10106000414E0200192F0000192F0000474E0200C8 +:10107000192F00004D4E0200534E0200594E02003F +:10108000192F0000192F0000192F0000192F000040 +:10109000192F0000192F0000192F0000192F000030 +:1010A000192F00005F4E0200192F0000192F0000B9 +:1010B000192F0000192F0000192F0000192F000010 +:1010C000654E0200192F0000192F0000192F000093 +:1010D000192F0000192F0000192F0000192F0000F0 +:1010E000192F0000192F0000192F0000192F0000E0 +:1010F000192F0000192F0000192F0000192F0000D0 +:10110000192F0000192F000000F002F823F01FFE35 +:101110000AA090E8000C82448344AAF10107DA4552 +:1011200001D123F014FEAFF2090EBAE80F0013F05C +:10113000010F18BFFB1A43F00103184734420200A5 +:10114000544202000A444FF0000C10F8013B13F027 +:10115000070408BF10F8014B1D1108BF10F8015B10 +:10116000641E05D010F8016B641E01F8016BF9D103 +:1011700013F0080F1EBF10F8014BAD1C0C1B09D15A +:101180006D1E58BF01F801CBFAD505E014F8016BCC +:1011900001F8016B6D1EF9D59142D6D3704700005E +:1011A0000023002400250026103A28BF78C1FBD870 +:1011B000520728BF30C148BF0B6070471FB500F011 +:1011C0003DF88DE80F001FBD1EF0040F0CBFEFF3BC +:1011D0000880EFF30980014A10470000752E0000D7 +:1011E0008269034981614FF001001044704700009B +:1011F000F511000001B41EB400B512F061FF01B496 +:101200000198864601BC01B01EBD0000F0B4404606 +:10121000494652465B460FB402A0013001B506486C +:10122000004700BF01BC86460FBC804689469246F7 +:101230009B46F0BC704700000911000023F084BDFC +:1012400070B51A4C054609202070A01C00F05FF80C +:101250005920A08029462046BDE8704008F060B8BB +:1012600008F069B870B50C461149097829B1A0F1A8 +:1012700060015E2908D3012013E0602804D06928AA +:1012800002D043F201000CE020CC0A4E94E80E009C +:1012900006EB8000A0F58050241FD0F8806E284611 +:1012A000B047206070BD012070470000080000209A +:1012B0001C000020CC4E020010B504460021012085 +:1012C00000F03DF800210B2000F039F8042119202E +:1012D00000F035F804210D2000F031F804210E2033 +:1012E00000F02DF804210F2000F029F80421C84354 +:1012F00000F025F80621162000F021F8062115201F +:1013000000F01DF82046FFF79BFF002010BDA9212B +:1013100001807047FFF7A4BF11487047104870471D +:10132000104A10B514680F4B0F4A08331A60FFF7C4 +:1013300099FF0C48001D046010BD704770474907B5 +:10134000090E002806DA00F00F0000F1E02080F816 +:10135000141D704700F1E02080F800147047000071 +:1013600003F900421005024001000001FE4800217F +:1013700001604160018170472DE9F743044692B056 +:101380009146406813F060F940B1606813F065F968 +:1013900020B9607800F00300022801D0012000E0AD +:1013A0000020F14E3072484613F00AF918B11020AF +:1013B00015B0BDE8F0834946012001F018FF002870 +:1013C000F6D101258DF842504FF4C050ADF84000E1 +:1013D000002210A9284606F04BFC0028E8D18DF821 +:1013E00042504FF428504FF00008ADF840004746F7 +:1013F0001C216846CDF81C8023F04DFC9DF81C0094 +:1014000008AA20F00F00401C20F0F00010308DF8EA +:101410001C0020788DF81D0061789DF81E0061F396 +:10142000420040F001008DF81E009DF800000AA95E +:1014300040F002008DF800002089ADF83000ADF8D2 +:101440003270608907AFADF834000B97606810AC5C +:101450000E900A94684606F000FA0028A8D1BDF85C +:10146000200030808DF8425042F60120ADF8400057 +:101470009DF81E0008AA20F00600801C20F0010044 +:101480008DF81E000220ADF83000ADF8340013A82E +:101490000E900AA9684606F0E0F9002888D1BDF848 +:1014A00020007080311D484600F033F9002887D1B4 +:1014B0008DF8425042F6A620ADF840001C21684647 +:1014C000CDF81C8023F0E7FB9DF81C00ADF83450EC +:1014D00020F00F00401C20F0F00010308DF81C00B0 +:1014E0009DF81D0008AA20F0FF008DF81D009DF852 +:1014F0001E000AA920F0060040F00100801C8DF8B3 +:101500001E009DF800008DF8445040F002008DF858 +:101510000000CDE90A4711A80E90ADF8305068469A +:1015200006F09BF9002899D1BDF82000F08000203A +:101530003EE73EB504460820ADF80000204613F013 +:101540003FF808B110203EBD2146012001F04FFEBA +:101550000028F8D12088ADF804006088ADF80600B6 +:10156000A088ADF80800E088ADF80A007E4801AB1D +:101570006A468088002106F075FDBDF80010082934 +:10158000E1D003203EBD1FB5044600200290082094 +:10159000ADF80800CDF80CD0204613F011F810B1CA +:1015A000102004B010BD704802AA81884FF6FF7069 +:1015B00006F09AFF0028F4D1BDF80810082901D0E0 +:1015C0000320EEE7BDF800102180BDF80210618015 +:1015D000BDF80410A180BDF80610E180E1E701B577 +:1015E00082B00220ADF800005F4802AB6A46408836 +:1015F000002106F037FDBDF80010022900D00320BD +:101600000EBD1CB5002100910221ADF80010019023 +:1016100012F0FCFF08B110201CBD53486A464188F7 +:101620004FF6FF7006F060FFBDF800100229F3D0FE +:1016300003201CBDFEB54C4C06461546207A0F46CD +:10164000C00705D0084612F0BBFF18B11020FEBD40 +:101650000F20FEBDF82D01D90C20FEBD304612F042 +:10166000AFFF18BB208801A905F040FE0028F4D187 +:1016700030788DF80500208801A906F0D2FC0028FA +:10168000EBD100909DF800009DF8051040F002009D +:101690008DF80000090703D040F008008DF8000025 +:1016A0002088694606F05AFC0028D6D1ADF80850CB +:1016B00020883B4602AA002106F0D4FCBDF80810A1 +:1016C000A942CAD00320FEBD7CB50546002000908B +:1016D00001900888ADF800000C462846019512F0EC +:1016E000B3FF18B9204612F091FF08B110207CBD5D +:1016F00015B1BDF8000050B11B486A4601884FF68D +:10170000FF7006F0F1FEBDF8001021807CBD0C20BA +:101710007CBD30B593B0044600200D4600901421E6 +:1017200001A823F0B8FA1C2108A823F0B4FA9DF808 +:101730000000CDF808D020F00F00401C20F0F00091 +:1017400010308DF800009DF8010020F0FF008DF8AA +:1017500001009DF8200040F002008DF820000120DB +:101760008DF8460002E000000C02002042F6042042 +:10177000ADF8440011A801902088ADF83C006088C5 +:10178000ADF83E00A088ADF84000E088ADF842001A +:101790009DF8020006AA20F00600801C20F001003F +:1017A0008DF802000820ADF80C00ADF810000FA86D +:1017B000059001A908A806F050F8002803D1BDF84B +:1017C00018002880002013B030BD0000F0B5007B69 +:1017D000059F1E4614460D46012800D0FFDF0C2051 +:1017E00030803A203880002C08D0287A032806D090 +:1017F000287B012800D0FFDF17206081F0BDA88979 +:10180000FBE72DE9F04786B0144691F80C900E9A4C +:101810000D46B9F1010F0BD01021007B2E8A8846AE +:10182000052807D0062833D0FFDF06B0BDE8F087D3 +:101830000221F2E7E8890C2100EB400001EB4000B7 +:10184000188033201080002CEFD0E88960810027B9 +:101850001AE00096688808F1020301AA696900F09D +:1018600084FF06EB0800801C07EB470186B204EBFF +:101870004102BDF8040090810DF1060140460E3290 +:1018800010F074FF7F1CBFB26089B842E1D8CCE78A +:1018900034201080E889B9F1010F11D0122148439A +:1018A0000E301880002CC0D0E88960814846B9F11C +:1018B000010F00D00220207300270DF1040A1FE061 +:1018C0000621ECE70096688808F1020301AA69691D +:1018D00000F04BFF06EB0800801C86B2B9F1010F47 +:1018E00012D007EBC70004EB4000BDF80410C18123 +:1018F00010220AF10201103023F02CF97F1CBFB234 +:101900006089B842DED890E707EB470104EB41025B +:10191000BDF80400D0810AF102014046103210F0F7 +:1019200025FFEBE72DE9F0470E4688B090F80CC094 +:1019300096F80C80378AF5890C20109902F10C0476 +:101940004FF0000ABCF1030F08D0BCF1040F3ED0E9 +:10195000BCF1070F7DD0FFDF08B067E705EB850C12 +:1019600000EB4C00188031200880002AF4D0A8F148 +:10197000060000F0FF09558125E0182101A823F099 +:101980008AF900977088434601AA716900F0EDFE5C +:10199000BDF804002080BDF80600E080BDF8080016 +:1019A0002081A21C0DF10A01484610F0DFFEB9F1BA +:1019B000000F00D018B184F804A0A4F802A007EB2F +:1019C000080087B20A346D1EADB2D6D2C4E705EB6B +:1019D000850C00EB4C00188032200880002ABBD018 +:1019E000A8F1050000F0FF09558137E000977088E5 +:1019F000434601AA716900F0B8FE9DF80600BDF8E3 +:101A00000410E1802179420860F3000162F3410192 +:101A1000820862F38201C20862F3C301020962F321 +:101A20000411420962F34511820962F386112171A2 +:101A3000C0096071BDF80700208122460DF109013F +:101A4000484610F093FE18B184F802A0A4F800A054 +:101A500000E007E007EB080087B20A346D1EADB264 +:101A6000C4D279E7A8F1020084B205FB08F000F1C6 +:101A70000E0CA3F800C035230B80002AA6D0558198 +:101A80009481009783B270880E32716900F06DFE08 +:101A900062E72DE9F84F1E460A9D0C4681462AB1A1 +:101AA000607A00F58070D080E089108199F80C0090 +:101AB0000C274FF000084FF00E0A0D2873D2DFE814 +:101AC00000F09E070E1C28303846556A7373730069 +:101AD000214648460095FFF779FEBDE8F88F207B48 +:101AE0009146082802D0032800D0FFDF378030203D +:101AF0000AE000BFA9F80A80EFE7207B914604289E +:101B000000D0FFDF378031202880B9F1000FF1D1FC +:101B1000E3E7207B9146042800D0FFDF37803220A6 +:101B2000F2E7207B9146022800D0FFDF3780332088 +:101B3000EAE7207B1746022800D0FFDF3420A6F812 +:101B400000A02880002FC8D0A7F80A80C5E7207B16 +:101B50001746042800D0FFDF3520A6F800A0288013 +:101B6000002FBAD04046A7F80A8012E0207B174623 +:101B7000052802D0062800D0FFDF10203080362054 +:101B80002880002FA9D0E0897881A7F80E80B9F8C5 +:101B90000E00B881A1E7207B9146072800D0FFDF27 +:101BA00037803720B0E72AE04FF0120018804FF05E +:101BB00038001700288090D0E0897881A7F80E803F +:101BC000A7F8108099F80C000A2805D00B2809D036 +:101BD0000C280DD0FFDF80E7207B0A2800D0FFDF34 +:101BE00001200AE0207B0B2800D0FFDF042004E066 +:101BF000207B0C2800D0FFDF052038736DE7FFDF66 +:101C00006BE770B50C46054601F025FC20B1007865 +:101C1000222804D2082070BD43F2020070BD0521C5 +:101C200028460FF021F8206008B1002070BD032085 +:101C300070BD30B44880087820F00F00C01C20F040 +:101C4000F000903001F8080B1DCA81E81D0030BC7F +:101C500007F0E7BB2DE9FF4784B0002782460297D3 +:101C600007989046894612300AF048F9401D20F046 +:101C70000306079828B907A95046FFF7C2FF0028B6 +:101C800054D1B9F1000F05D00798017B19BB052588 +:101C900004681BE098F80000092803D00D2812D032 +:101CA000FFDF46E0079903254868B0B3497B4288C7 +:101CB0007143914239D98AB2B3B2011D0EF047FE89 +:101CC0000446078002E0079C042508340CB12088F4 +:101CD00010B1032D29D02CE00798012112300AF011 +:101CE0003FF9ADF80C00024602AB2946504608F019 +:101CF000F4F9070001D1A01C029007983A4612306F +:101D0000C8F80400A8F802A003A94046029B0AF004 +:101D100034F9D8B10A2817D200E006E0DFE800F075 +:101D200007091414100B0D141412132014E60020CC +:101D300012E6112010E608200EE643F203000BE63F +:101D4000072009E60D2007E6032005E6BDF80C0094 +:101D50002346CDE900702A465046079900F015FD4C +:101D600057B9032D08D10798B3B2417B406871433E +:101D70008AB2011D0EF0FFFDB9F1000FD7D007990F +:101D800081F80C90D3E72DE9FE4F91461A881C4646 +:101D90008A468046FAB102AB494608F09EF9050032 +:101DA00019D04046A61C27880FF0A2F83246072615 +:101DB00029463B4600960EF0B0FC20882346CDE92C +:101DC00000504A465146404600F0DFFC002020808B +:101DD0000120BDE8FE8F0020FBE710B586B01C4651 +:101DE000AAB104238DF800301388ADF8083052886A +:101DF000ADF80A208A788DF80E200988ADF80C100D +:101E000000236A462146FFF725FF06B010BD1020CB +:101E1000FBE770B50D4605210EF026FF040000D14A +:101E2000FFDF294604F11200BDE870400AF081B8D6 +:101E30002DE9F8430D468046002607F0EFFA0446E8 +:101E40002878102878D2DFE800F0773B345331311E +:101E5000123131310831313131312879001FC0B2AE +:101E6000022801D0102810D114BBFFDF35E004B9DF +:101E7000FFDF052140460EF0F7FE007B032806D069 +:101E800004280BD0072828D0FFDF072655E0287943 +:101E9000801FC0B2022820D050B1F6E72879401F39 +:101EA000C0B2022819D0102817D0EEE704B9FFDF1E +:101EB00013E004B9FFDF287901280ED1172137E09C +:101EC000052140460EF0D0FE070000D1FFDF07F1EC +:101ED000120140460AF00AF82CB12A462146404633 +:101EE000FFF7A7FE29E01321404602F0A9FD24E0F8 +:101EF00004B9FFDF052140460EF0B6FE060000D112 +:101F0000FFDF694606F1120009F0FAFF060000D073 +:101F1000FFDFA988172901D2172200E00A46BDF881 +:101F20000000824202D9014602E005E01729C5D32C +:101F3000404600F03AFCD0E7FFDF3046BDE8F883CA +:101F4000401D20F0030219B102FB01F0001D00E06A +:101F500000201044704713B5009848B1002468462B +:101F60000EF09FFC002C02D1F74A009911601CBDB5 +:101F700001240020F4E72DE9F0470C461546242102 +:101F8000204622F088FE05B9FFDFA8786073288814 +:101F9000DFF8B4A3401D20F00301AF788946DAF8DA +:101FA00000000EF09CFC060000D1FFDF4FF000089F +:101FB0002660A6F8008077B109FB07F1091D0AD059 +:101FC000DAF800000EF08BFC060000D1FFDF66603F +:101FD000C6F8008001E0C4F80480298804F11200EA +:101FE000BDE8F04709F074BF2DE9F047804601F1E4 +:101FF00012000D46814609F081FF401DD24F20F0AE +:1020000003026E7B1446296838680EF093FC3EB1DB +:1020100004FB06F2121D03D0696838680EF08AFCD2 +:1020200005200EF0C9FD044605200EF0CDFD201A56 +:10203000012802D138680EF047FC49464046BDE809 +:10204000F04709F05ABF70B5054605210EF00CFEA9 +:10205000040000D1FFDF04F112012846BDE8704002 +:1020600009F044BF2DE9F04F91B04FF0000BADF8EF +:1020700034B0ADF804B047880C46054692460521B9 +:1020800038460EF0F1FD060000D1FFDF24B1A78035 +:10209000A4F806B0A4F808B0297809220B20B2EB06 +:1020A000111F7DD12A7A04F1100138274FF00C0856 +:1020B0004FF001090391102A73D2DFE802F072F2A7 +:1020C000F1F07F08D2888D9F3DDBF3EEB6B6307B12 +:1020D000022800D0FFDFA88908EBC001ADF804108A +:1020E0003021ADF83410002C25D06081B5F80E9069 +:1020F00000271DE004EBC708317C88F80E10F18939 +:10210000A8F80C10CDF800906888042304AA296967 +:1021100000F02BFBBDF81010A8F8101009F1040016 +:10212000BDF812107F1C1FFA80F9A8F81210BFB278 +:102130006089B842DED80DE1307B022800D0FFDF95 +:10214000E98908EBC100ADF804003020ADF8340097 +:10215000287B0A90001FC0B20F90002CEBD0618149 +:10216000B5F81090002725E0CDF8009068886969DF +:1021700003AA0A9B00F0F9FA0A9804EBC70848443E +:102180001FFA80F908F10C0204A90F9810F0EEFA7A +:1021900018B188F80EB0A8F80CB0BDF80C1001E02A +:1021A000D4E0CFE0A8F81010BDF80E107F1CA8F8FE +:1021B0001210BFB26089B842D6D8CBE00DA800900B +:1021C00001AB224629463046FFF71BFBC2E0307BBD +:1021D000082805D0FFDF03E0307B082800D0FFDFB0 +:1021E000E8891030ADF804003620ADF83400002C3A +:1021F0003FD0A9896181F189A18127E0307B09283D +:1022000000D0FFDFA88900F10C01ADF804103721E0 +:10221000ADF83410002C2CD06081E8890090AB8997 +:10222000688804F10C02296956E0E88939211030E8 +:1022300080B2ADF80400ADF83410002C74D0A98938 +:102240006181287A0E280AD002212173E989E1816F +:10225000288A0090EB8968886969039A3CE001212B +:10226000F3E70DA8009001AB224629463046FFF760 +:1022700059FB6FE0307B0A2800D0FFDF1220ADF859 +:102280000400ADF834704CB3A9896181A4F810B092 +:10229000A4F80EB084F80C905CE020E002E031E09D +:1022A00039E042E0307B0B2800D0FFDF288AADF810 +:1022B00034701230ADF8040084B104212173A9896F +:1022C0006181E989E181298A2182688A00902B8ACB +:1022D000688804F11202696900F047FA3AE0307B3D +:1022E0000C2800D0FFDF1220ADF80400ADF83470E8 +:1022F0003CB305212173A4F80AB0A4F80EB0A4F8E9 +:1023000010B027E00DA8009001AB224629463046C8 +:10231000FFF75CFA1EE00DA8009001AB22462946AB +:102320003046FFF7B6FB15E034E03B21ADF8040082 +:10233000ADF8341074B3A4F80690A4F808B084F88B +:102340000AB007E0FFDF05E010000020297A01292C +:1023500017D0FFDFBDF80400AAF800006CB1BDF88B +:1023600034002080BDF804006080BDF834003928B6 +:1023700003D03C2801D086F80CB011B00020BDE895 +:10238000F08F3C21ADF80400ADF8341014B1697A37 +:10239000A172DFE7AAF80000EFE72DE9F8435688BD +:1023A0000F4680461546052130460EF05DFC0400C0 +:1023B00000D1FFDF123400943B46414630466A6844 +:1023C00009F00FFFBAE570B50D4605210EF04CFC83 +:1023D000040000D1FFDF294604F11200BDE870407F +:1023E00009F099BD70B50D4605210EF03DFC0400C5 +:1023F00000D1FFDF294604F11200BDE8704009F06A +:10240000B7BD70B5054605210EF02EFC040000D1C5 +:10241000FFDF04F1080321462846BDE8704004228E +:10242000B1E470B5054605210EF01EFC040000D194 +:10243000FFDF214628462368BDE870400522A2E45C +:1024400070B5064605210EF00FFC040000D1FFDF39 +:1024500004F1120009F052FD401D20F0030511E0C7 +:10246000011D00880322431821463046FFF78BFCEC +:1024700000280BD0607BABB2684382B26068011D5C +:102480000EF0AFFA606841880029E9D170BD70B5DF +:102490000E46054606F0C2FF040000D1FFDF012012 +:1024A000207266726580207820F00F00C01C20F03A +:1024B000F00030302070BDE8704006F0B2BF2DE96A +:1024C000F0438BB00D461446814606A9FFF799FBF1 +:1024D000002814D14FF6FF7601274FF420588CB115 +:1024E00003208DF800001020ADF8100007A805901B +:1024F00007AA204604A910F058F978B107200BB0BC +:10250000BDE8F0830820ADF808508DF80E708DF806 +:102510000000ADF80A60ADF80C800CE00698A178D8 +:1025200001742188C1818DF80E70ADF80850ADF8A6 +:102530000C80ADF80A606A4602214846069BFFF708 +:1025400089FBDCE708B501228DF8022042F6020281 +:10255000ADF800200A4603236946FFF73EFC08BD9C +:1025600008B501228DF8022042F60302ADF80020E2 +:102570000A4604236946FFF730FC08BD00B587B062 +:1025800079B102228DF800200A88ADF80820498828 +:10259000ADF80A1000236A460521FFF75BFB07B080 +:1025A00000BD1020FBE709B1072316E407207047A0 +:1025B00070B588B00D461446064606A9FFF721FB04 +:1025C00000280ED17CB10620ADF808508DF800002F +:1025D000ADF80A40069B6A460821DC813046FFF7C9 +:1025E00039FB08B070BD05208DF80000ADF808502B +:1025F000F0E700B587B059B107238DF80030ADF88A +:102600000820039100236A460921FFF723FBC6E750 +:102610001020C4E770B588B00C460646002506A910 +:10262000FFF7EFFA0028DCD106980121123009F0FB +:1026300097FC9CB12178062921D2DFE801F0200522 +:1026400005160318801E80B2C01EE28880B20AB14F +:10265000A3681BB1824203D90C20C2E71020C0E757 +:10266000042904D0A08850B901E00620B9E7012967 +:1026700013D0022905D004291CD005292AD007200F +:10268000AFE709208DF800006088ADF80800E08809 +:10269000ADF80A00A068039023E00A208DF800003E +:1026A0006088ADF80800E088ADF80A00A0680A2547 +:1026B000039016E00B208DF800006088ADF808004C +:1026C000A088ADF80A00E088ADF80C00A0680B25E2 +:1026D000049006E00C208DF8000060788DF808006A +:1026E0000C256A4629463046069BFFF7B3FA78E781 +:1026F00000B587B00D228DF80020ADF8081000233A +:102700006A461946FFF7A6FA49E700B587B071B1E6 +:1027100002228DF800200A88ADF808204988ADF81B +:102720000A1000236A460621FFF794FA37E71020C3 +:1027300035E770B586B0064601200D46ADF80810A5 +:102740008DF80000014600236A463046FFF782FA02 +:10275000040008D12946304605F09EFC0021304691 +:1027600005F0B8FC204606B070BDF8B51C4615460D +:102770000E46069F0EF0AAFB2346FF1DBCB2314653 +:102780002A4600940DF095FFF8BD30B41146DDE9FE +:1027900002423CB1032903D0002330BC08F026BB21 +:1027A0000123FAE71A8030BC704770B50C46054625 +:1027B000FFF72FFB2146284605F07DFC2846BDE8A3 +:1027C0007040012105F086BC4FF0E0224FF400413B +:1027D0000020C2F88011204908702049900208604A +:1027E000704730B51C4D04462878A04218BF002C15 +:1027F00002D0002818BFFFDF2878A04208BF30BDF4 +:102800002C701749154A0020ECB1164DDFF858C05E +:10281000131F012C0DD0022C1CBFFFDF30BD086040 +:1028200003200860CCF800504FF4000010601860DE +:1028300030BD086002200860CCF800504FF04070B6 +:102840001060186030BD086008604FF06070106064 +:1028500030BD00B5FFDF00BD1800002008F50140C5 +:1028600000F500408C02002014F5004070B50B20EC +:1028700000F0B5F9082000F0B2F900210B2000F0BB +:10288000C4F90021082000F0C0F9EC4C0125656076 +:10289000A5600020C4F84001C4F84401C4F8480110 +:1028A0000B2000F0A7F9082000F0A4F90B2000F09D +:1028B0008BF9256070BD10B50B2000F090F9082051 +:1028C00000F08DF9DD48012141608160DC490A6832 +:1028D000002AFCD10021C0F84011C0F84411C0F812 +:1028E00048110B2000F086F9BDE81040082000F0E8 +:1028F00081B910B50B2000F07DF9BDE8104008202B +:1029000000F078B900B530B1012806D0022806D011 +:10291000FFDF002000BDCB4800BDCB4800BDCA484A +:10292000001D00BD70B5C9494FF000400860C84D9A +:10293000C00BC5F80803C74800240460C5F840412F +:102940000820C43500F04BF9C5F83C41C24804707A +:1029500070BD08B5B94A002128B1012811D002285C +:102960001CD0FFDF08BD4FF48030C2F80803C2F866 +:102970004803B3483C300160C2F84011BDE808404C +:10298000D0E74FF40030C2F80803C2F84803AC485F +:1029900040300160C2F84411AB480CE04FF4802095 +:1029A000C2F80803C2F84803A54844300160C2F8E1 +:1029B0004811A548001D0068009008BD70B5164676 +:1029C0000D460446022800D9FFDF00229B48012360 +:1029D00004F110018B4000EB8401C1F8405526B191 +:1029E000C1F84021C0F8043303E0C0F80833C1F84F +:1029F0004021C0F8443370BD2DE9F0411C46154616 +:102A000030B1012834D0022839D0FFDFBDE8F08191 +:102A1000891E002221F07F411046FFF7CFFF012CD5 +:102A200024D000208C4E8A4F012470703C6189496B +:102A300000203C3908600220091D086085490420F7 +:102A40003039086083483D350560C7F800420820EA +:102A500000F0D0F82004C7F80403082000F0B4F810 +:102A60007A49E007091F08603470CFE70120D9E7F1 +:102A7000012B02D00022012005E00122FBE7012BFF +:102A800004D000220220BDE8F04197E70122F9E7D7 +:102A90006B480068704770B500F0C7F8674C054692 +:102AA000D4F840010026012809D1D4F80803C00356 +:102AB00005D54FF48030C4F80803C4F84061D4F859 +:102AC000440101280CD1D4F80803800308D54FF441 +:102AD0000030C4F80803C4F84461012010F029FE56 +:102AE000D4F8480101280CD1D4F80803400308D5D4 +:102AF0004FF48020C4F80803C4F84861022010F0A5 +:102B000018FE5648056070BD70B500F08EF8524D45 +:102B10000446287858B1FFF705FF687820B10020F7 +:102B200085F8010010F005FE4C48046070BD0320DC +:102B3000F8E74FF0E0214FF40010C1F800027047B1 +:102B4000152000F057B8424901200861082000F024 +:102B500051B83F494FF47C10C1F8080300200246E9 +:102B600001EB8003C3F84025C3F84021401CC0B2EC +:102B70000628F5D37047410A43F609525143C0F382 +:102B8000080010FB02F000F5807001EB5020704748 +:102B900010B5430B48F2376463431B0C5C020C60B6 +:102BA0002F4C03FB04002F4B4CF2F72443435B0DE7 +:102BB00013FB04F404EB402000F580704012107009 +:102BC00008681844086010BD00F01F020121914000 +:102BD0004009800000F1E020C0F80011704700F0CB +:102BE0001F02012191404009800000F1E020C0F85F +:102BF0008011704700F01F020121914040098000C0 +:102C000000F1E020C0F8801270474907090E002843 +:102C100006DA00F00F0000F1E02080F8141D704784 +:102C200000F1E02080F8001470470C48001F006895 +:102C30000A4A0D49121D11607047000000B00040A3 +:102C400004B500404081004044B1004008F5014017 +:102C500000800040408500403800002014050240FC +:102C6000F7C2FFFF6F0C0100010000010A4810B518 +:102C70000468094909480831086010F0EEFD06486B +:102C8000001D046010BD0649002008604FF0E021DF +:102C90000220C1F8800270471005024001000001C7 +:102CA000FC1F004010B50D2000F06FF8C4B26FF0AB +:102CB000040000F06AF8C0B2844200D0FFDF3A4955 +:102CC0000120086010BD70B50D2000F048F8374CA9 +:102CD0000020C4F800010125C4F804530D2000F0C1 +:102CE00049F825604FF0E0216014C1F8000170BD83 +:102CF00010B50D2000F033F82C480121416000216F +:102D0000C0F80011BDE810400D2000F033B828488D +:102D100010B5046826492748083108602349D1F8CE +:102D20000001012804D0FFDF2148001D046010BD10 +:102D30001D48001D00680022C0B2C1F8002111F03A +:102D400039F9F1E710B51948D0F800110029FBD086 +:102D5000FFF7DDFFBDE810400D2000F00BB800F0DC +:102D60001F02012191404009800000F1E020C0F8DD +:102D70008011704700F01F0201219140400980003E +:102D800000F1E020C0F880127047002806DA00F059 +:102D90000F0000F1E02090F8140D03E000F1E020B6 +:102DA00090F800044009704704D5004000D000406E +:102DB000100502400100000110B5202000F082F84B +:102DC000202000F08AF84A49202081F8000449496F +:102DD00000060860091D48480860FEF79DFA45494D +:102DE000C83108604548D0F8041341F00101C0F82B +:102DF0000413D0F8041341F08071C0F804133C4967 +:102E000001201C39C1F8000110BD10B5202000F0D0 +:102E100059F8384800210160001D0160354A481EFC +:102E2000E83A1060354AC2F80803324BC8331960DB +:102E3000C2F80001C2F8600131490860BDE81040E5 +:102E4000202000F04AB82B492E48EC390860704722 +:102E500028492C48E8390860704726480160001D61 +:102E6000521E0260704723490120E8390860BFF311 +:102E70004F8F704770B51F4A8069E83A2149116049 +:102E80001E49D1F8006100231F4D1D4A5C1E1EB172 +:102E9000A84206D300210FE0D1F8606186B1A842B4 +:102EA00009D2C1F80031C1F860311460BDE870404A +:102EB000202000F012B81168BDE8704021F012BF68 +:102EC000FFDF70BD00F01F0201219140400980002A +:102ED00000F1E020C0F88011704700F01F020121CE +:102EE00091404009800000F1E020C0F88012704756 +:102EF00020E000E000060240C41400200000024070 +:102F00000004024001000001006002000F4A126844 +:102F10000D498A420CD118470C4A12680A4B9A4252 +:102F200006D101B511F0C0F8FFF78DFFBDE80140F3 +:102F3000074909680958084706480749054A064BE2 +:102F40007047000000000000BEBAFECAB0000020BA +:102F500004000020E0120020E012002070B50C46B2 +:102F6000054609F0DBFA21462846BDE870400AF024 +:102F7000C0BB10B511F01EFDFFF726FC11F09EFB43 +:102F8000BDE8104011F050BC012081070860704777 +:102F9000012081074860704712480068C00700D0D0 +:102FA000012070470F48001F0068C00700D00120B3 +:102FB00070470C4808300068C00700D001207047F7 +:102FC000084810300068704706490C310A68D2037F +:102FD00006D5096801F00301814201D10120704743 +:102FE000002070470C0400407047704770477047DE +:102FF000704770477047704770470004050600002F +:103000002CFFFFFFDBE5B15100600200A900FFFFCC +:103010008C000000808D5B0016425791AD5F58BC5C +:103020008E702F5A0FAA100DBCD52BFD30B5FC4D5C +:103030000446062CA9780ED2DFE804F0030E0E0E2B +:103040000509FFDF08E0022906D0FFDF04E00329BD +:1030500002D0FFDF00E0FFDFAC7030BD30B50446CA +:103060001038EF4D07280CD2DFE800F0040C060CF6 +:103070000C0C0C00FFDF05E0287E112802D0FFDFDA +:1030800000E0FFDF2C7630BD2DE9F0410FF0F8FCB9 +:10309000044610F08CFE201AC5B206200DF08CFDFF +:1030A000044606200DF090FD211ADD4C207E1228EA +:1030B00018D000200F1807200DF07EFD06460720CF +:1030C0000DF082FD301A3918207E13280CD0002014 +:1030D0000144A078042809D000200844281AC0B26E +:1030E000BDE8F0810120E5E70120F1E70120F4E7E8 +:1030F000CB4810B590F825004108C94800F12600DA +:1031000005D00BF0EBFABDE8104005F0B3BF0BF0B3 +:10311000BEFAF8E730B50446A1F120000D460A28B2 +:103120004AD2DFE800F005070C1C2328353A3F445B +:10313000FFDF42E0207820283FD1FFDF3DE0B848A4 +:103140008178052939D0007E122836D020782428AD +:1031500033D0252831D023282FD0FFDF2DE0207851 +:1031600022282AD0232828D8FFDF26E0207822280A +:1031700023D0FFDF21E0207822281ED024281CD075 +:1031800026281AD0272818D0292816D0FFDF14E0C7 +:103190002078252811D0FFDF0FE0207825280CD0DB +:1031A000FFDF0AE02078252807D0FFDF05E0207840 +:1031B000282802D0FFDF00E0FFDF257030BD10B50A +:1031C000012803D0022805D0FFDF10BDBDE8104064 +:1031D00003202BE79248007E122800D0FFDF002159 +:1031E000052011F0A1F9BDE81040112036E71FB508 +:1031F00004466A46002001F01FFEB4B1BDF802206B +:103200004FF6FF700621824201D1ADF80210BDF8E1 +:103210000420824201D1ADF80410BDF808108142AB +:1032200003D14FF44860ADF8080068460CF06AF925 +:1032300005F020FF04B010BD70B514460D460646DB +:1032400011F0BEF958B90DB1A54201D90C2070BDDD +:10325000002408E056F8240011F0B2F908B110205B +:1032600070BD641CE4B2AC42F4D3002070BD2DE903 +:10327000F04105461F4690460E460024006811F0B6 +:10328000ECF908B110202BE728680028A88802D0A4 +:10329000B84202D84FE00028F5D0092020E728687E +:1032A000025DB2B1611C475C152F2DD03BDC3AD2D8 +:1032B000DFE807F03912222228282A2A3131393949 +:1032C00039393939393939392200025D32BB641C48 +:1032D000A4B2A142F9D833E0022ADED1A21C805C5C +:1032E00088F80000072801D2400701D40A20F7E639 +:1032F000307840F0010015E0D043C00707E0012A14 +:1033000007D010E00620EBE61007A0F1805000285F +:10331000F5D01846E4E63078820701D50B20DFE6C9 +:1033200040F0020030702868005D084484B2A8882C +:10333000A04202D2B1E74FF4485381B2A142AED8C5 +:103340000020CDE610B5027843F202235408012292 +:10335000022C12D003DC3CB1012C16D106E0032C68 +:1033600010D07F2C11D112E0002011E080790324CD +:10337000B4EB901F09D10A700BE08079B2EB901F7B +:1033800003D1F8E780798009F5D0184610BDFF20F9 +:103390000870002010BD224991F82E2042B191F80A +:1033A0002F10022909D0032909D043F202207047C7 +:1033B00001461B48253001F092BD032100E00121A8 +:1033C00001700020704738B50C460546694601F08B +:1033D00086FD00280DD19DF80010207861F347008C +:1033E000207055F8010FC4F80100A888A4F8050062 +:1033F000002038BD38B51378B0B1022814D0FF28AA +:103400001BD008A46D46246800944C7905EB9414F5 +:10341000247864F34703137003280AD010E00000F7 +:10342000D80100200302FF0123F0FE0313700228DD +:10343000F2D1D8B240F0010005E043F0FE00107078 +:10344000107820F0010010700868C2F80100888828 +:10345000A2F8050038BD02210DF006BC38B50C46B7 +:103460000978222901D2082038BDADF800008DF876 +:10347000022068460BF079F905F0FCFD050003D148 +:1034800021212046FFF746FE284638BD1CB5002006 +:103490008DF80000CDF80100ADF80500FE4890F869 +:1034A0002E00022801D0012000E000208DF8070046 +:1034B00068460BF092FB002800D0FFDF1CBD002205 +:1034C0000A80437892B263F345120A8043785B081E +:1034D00063F386120A8000780C282BD2DFE800F014 +:1034E0002A06090E1116191C1F220C2742F0110082 +:1034F00009E042F01D0008800020704742F01100F2 +:1035000012E042F0100040F00200F4E742F0100038 +:10351000F1E742F00100EEE742F0010004E042F082 +:103520000200E8E742F0020040F00400E3E742F066 +:103530000400E0E7072070472DE9FF478AB0002527 +:10354000BDF82C6082461C4691468DF81C507007D1 +:1035500003D5606811F034F868B9CF4F4FF0010817 +:1035600097F82E0058B197F82F00022807D160680D +:1035700011F073F818B110200EB0BDE8F0873007D5 +:1035800002D5A08980283DD8700705D4B9F1000F75 +:1035900002D097F8240098B3E07DC0F300108DF8B6 +:1035A0001B00627D072003215AB3012A2CD0022A76 +:1035B000E2D0042AE0D18DF81710F00627D4A27DBE +:1035C000072022B3012A22D0022A23D0042AD3D1F1 +:1035D0008DF819108DF81590606810B307A9FFF7E2 +:1035E000B1FE0028C8D19DF81C00FF2816D06068E5 +:1035F00050F8011FCDF80F108088ADF8130014E0CB +:1036000000E001E00720B7E78DF81780D5E78DF8D7 +:103610001980DFE702208DF81900DBE743F2022072 +:10362000AAE7CDF80F50ADF81350E07B40B9207CED +:1036300030B9607C20B9A07C10B9E07CC00601D014 +:10364000062099E78DF800A0BDF82C00ADF8020027 +:10365000A0680190A068029004F10F0001F033FC13 +:103660008DF80C000DF10D00FFF795FE00B1FFDFA6 +:103670009DF81C008DF80E008DF816508DF818502E +:10368000E07D08A900F00F008DF81A0068460CF0E4 +:10369000F8F805F0EFFC6FE7F0B59DB000228DF86B +:1036A00068208DF858208DF8602005468DF86C2034 +:1036B000129213921492159219B10FC912AC84E8A8 +:1036C0000F00754CA078052801D004280CD1129861 +:1036D0006168884200D120B91498E168884203D11A +:1036E00010B108201DB0F0BD1F26334618AA1AA934 +:1036F00012A8FFF7BCFD0028F4D133461BAA16A977 +:1037000014A8FFF7B4FD0028ECD19DF85800C007BD +:1037100001D00A20E6E7A08A410708D4A17D31B193 +:103720009DF86010890702D043F20120DAE79DF886 +:103730006010C90709D0400707D4208818B144F2A7 +:103740005061884201D90720CCE78DF8005003264C +:103750008DF8016001278DF80270BDF84C208DF8BE +:10376000032001A8129921F0F5F968460CF0F0F851 +:1037700005F080FC0028B5D18DF824508DF8256027 +:103780008DF82670BDF854208DF827200AA81499CA +:1037900021F0E0F909A80CF028F905F06BFC0028ED +:1037A000A0D112AD241D95E80F0084E80F00002081 +:1037B00098E770B586B00D46040005D010F04DFFB7 +:1037C00020B1102006B070BD0820FBE72078C107AB +:1037D000A98802D0FF2902D303E01F2901D20920C2 +:1037E000F0E7800761D4FFF74FFC38B12078C0F3D1 +:1037F000C101012904D0032902D005E01320E1E72B +:10380000254991F8241041B1C0074FF000054FF051 +:10381000010604D08DF80F6003E00720D2E78DF891 +:103820000F506846FFF7B7FD00B1FFDF2078C0F307 +:10383000C1008DF801008DF80250607808B98DF84C +:1038400002606078C00705D09DF8020040F00100DA +:103850008DF802006078800705D59DF8020040F0E1 +:1038600002008DF802006078400705D59DF802003F +:1038700040F004008DF802002078C0F380008DF83D +:1038800003006088ADF80600A088ADF80A00207A31 +:1038900058B9607A48B901E0D8010020A07A20B96F +:1038A000E07A10B9207BC00601D006208AE704F137 +:1038B000080001F008FB8DF80E0068460BF090FA46 +:1038C00005F0D8FB00288BD18DF810608DF81150D1 +:1038D000ADF81250ADF8145004A80BF0CBFA05F077 +:1038E000C9FB00288BD1E08864280AD248B10120A6 +:1038F00001F0FFFA002891D12078C00705D01520EB +:1039000004E06421B0FBF1F0F2E71320FFF7A6FB1F +:10391000002057E72DE9FF470220FF4E8DF80400F5 +:103920000027708EADF80600B84643F202094CE05D +:1039300001A80DF000F9050006D0708EA8B3A6F816 +:103940003280ADF806803EE0039CA07F01072DD5B4 +:1039500004F124000090A28EBDF80800214604F175 +:10396000360301F056FC050005D04D452AD0112D37 +:103970003CD0FFDF3AE0A07F20F00801E07F420862 +:1039800062F3C711A177810861F30000E07794F832 +:10399000210000F01F0084F820002078282826D17C +:1039A00029212046FFF7B6FB21E014E040070AD5A5 +:1039B000BDF8080004F10E0101F0A9FA05000DD0D0 +:1039C0004D4510D100257F1CFFB202200DF0F4F808 +:1039D000401CB842ACD8052D11D008E0A07F20F0E3 +:1039E0000400A07703E0112D00D0FFDF0025BDF813 +:1039F00006007086052D04D0284604B0BDE5A6F863 +:103A000032800020F9E770B50646FFF724FD054631 +:103A100005F004FD040000D1FFDF6680207820F06F +:103A20000F00801C20F0F000203020700620207253 +:103A300095F83E006072BDE8704005F0F2BC2DE9DB +:103A4000F04786B0040000D1FFDF2078B24D20F0AF +:103A50000F00801C20F0F00070302070606801784A +:103A6000491F1B2933D2DFE801F0FE32323255FD07 +:103A7000320EFDFD42FC32323278FCFCFB32323237 +:103A8000FCFCFAF9FC00C6883046FFF7E4FC05466A +:103A9000304607F0A9F8E0B16068007A85F83E008A +:103AA00021212846FFF736FB3046FEF7CCFA304698 +:103AB00003F018FE3146012010F036FDA87F20F0FB +:103AC0001000A877FFF726FF002800D0FFDF06B020 +:103AD00053E5207820F0F00020302070062020727E +:103AE00066806068007A607205F09BFCD8E7C58844 +:103AF0002846FFF7B0FC00B9FFDF606800790128B5 +:103B000000D0FFDF6068017A06B02846BDE8F047C4 +:103B100007F046BCC6883046FFF79DFC050000D183 +:103B2000FFDF05F07EFC606831460089288160680F +:103B30004089688160688089A881012010F0F4FCC8 +:103B40000020A875A87F00F003000228BFD1FFF76E +:103B5000E1FE0028BBD0FFDFB9E70079022811D0D1 +:103B600000B1FFDF05F05DFC6668B6F806A0307AAC +:103B7000361D01280CD0687E814605F0E7F9070064 +:103B800009D107E006B00220BDE8F047FFF717BBF8 +:103B9000E878F1E7FFDF0022022150460DF05BF8E4 +:103BA000040000D1FFDF22212046FFF7B3FA30796D +:103BB000012800D00220A17F804668F30101A1778F +:103BC000308B2081708B6081B08BA08184F8229033 +:103BD0008DF80880B8680090F86801906A46032163 +:103BE00050460DF038F800B9FFDFB888ADF8100086 +:103BF000B8788DF8120004AA052150460DF02BF874 +:103C000000B9FFDFB888ADF80C00F8788DF80E0029 +:103C100003AA042150460DF01EF800B9FFDF06216B +:103C200006F1120001F091F938B37079800700D5E0 +:103C3000FFDF7179E07D61F34700E075D6F806009B +:103C4000A0617089A083062106F10C0001F07DF9C6 +:103C5000E8B195F825004108607805E032E02AE0F7 +:103C600047E03FE021E035E061F347006070D5F8C0 +:103C70002600C4F80200688D12E0E07D20F0FE000E +:103C8000801CE075D6F81200A061F08ADAE760784F +:103C900020F0FE00801C6070F068C4F80200308ADA +:103CA000E0804046FFF78BFA11E706B02046BDE8FA +:103CB000F04701F037BD05F0B4FB15F8300F40F0C8 +:103CC000020005E005F0ADFB15F8300F40F00400F0 +:103CD0002870FCE6287E132809D01528E4D1162088 +:103CE000FFF7BCF906B0BDE8F04705F09ABB142019 +:103CF000F6E7A978052909D00429D5D105F091FB6B +:103D0000022006B0BDE8F047FFF790B9007900281F +:103D1000CAD0E87802E00000D801002001F0BAF82B +:103D200005F07FFB0320ECE72DE9F05F0546007806 +:103D30004FF000080009DFF820A891460C464646DF +:103D400001287AD001274FF0020C4FF6FF730228AA +:103D500074D007280BD00A2871D0FFDFA9F80060C3 +:103D600014B1A4F8008066800020BDE8F09F696867 +:103D700004F108000A78172A70D010DC4FF0000B0D +:103D8000142A31D006DC052A6DD0092A0FD0102A5A +:103D90007ED11FE0152A7CD0162AF9D1F0E01B3A1B +:103DA000052A75D2DFE802F009C5FDDAFC00C888F3 +:103DB0004FF012081026214675E14FF01C080A2624 +:103DC000D4B38888A0806868807920726868C079D8 +:103DD0006072C3E74FF01B0814266CB303202072F7 +:103DE00068688088A080B9E70A793C2AB6D00D1DA2 +:103DF0004FF010082C26FCB16988A180298B6182C4 +:103E0000298B2182698BA182A98BE1826B79024681 +:103E1000A91D1846FFF7EEFA2879012810D084F87A +:103E20000FC0FF202076C4F81CB0C4F820B0C4F83E +:103E300024B0C4F828B091E712E013E13BE135E18A +:103E4000E7730AF1040084F818B090E80E00DAF87D +:103E50001000C4E90930C4E907127FE7A8E002E0D6 +:103E6000A9F8006080E72C264FF01D08002CF7D041 +:103E70000546A380887B2A880F1D60F300022A80F4 +:103E8000887B400860F341022A80887B800801E03B +:103E9000E6E0ADE060F382022A80887BB91CC008AE +:103EA00060F3C3022A80B87A0011401C60F3041248 +:103EB00002F07F0028807878AA1CFFF79BFA387DF3 +:103EC00005F1090207F11501FFF794FA387B01F0BB +:103ED0004BF82874787B01F047F86874F87EA87472 +:103EE000787AE87497F83B002875B87B6875A5F870 +:103EF00016B0DAF81C00A861397ABAF820008842B6 +:103F000001D2014610E0B87AC0F3411002280BD06C +:103F1000012809D0288820F060002880A1840A4662 +:103F200007F11C01A86998E0288820F06000403063 +:103F3000F3E711264FF02008002C91D0A380686889 +:103F400004F10A02007920726868007B6072696877 +:103F50008B1D48791946FFF74DFAFFE60A264FF008 +:103F60002108002CE9D08888A080686880792072B8 +:103F70006868C07960729AF8301021F004018BE013 +:103F80000B264FF02208002CD7D0C888A080686884 +:103F9000007920726868007A00F0E6FF607201E044 +:103FA00052E039E06868407A00F0DEFFA072D5E6A2 +:103FB0001C264FF02608002CBFD0A38068684079EB +:103FC00060726868007AA0720AF1040090E80E003E +:103FD000DAF81000C4E90530C4E903126868007912 +:103FE0003C2803D043287DD0FFDFB7E62772B5E633 +:103FF00010264FF02408002C9FD08888A080686885 +:10400000807920816868807A608168680089A081F1 +:1040100068688089E081A1E610264FF02308002C13 +:104020008BD08888A0806868C088208168680089F3 +:10403000608168684089A08168688089E0819AF819 +:10404000301021F0020127E030264FF02508002C27 +:1040500088D0A38069682822496820F07BFD7DE62E +:104060004A4677E0287A012803D0022817D0FFDFDC +:1040700074E610264FF01F08002C85D06888A080B9 +:10408000A8892081E8896081288AA081688AE081E6 +:104090009AF8301021F001018AF830105EE64FF0F6 +:1040A00012081026688800F03DFF57E62846BDE854 +:1040B000F05F01F0C1BC287A07284DD2DFE800F09C +:1040C0004C38384A4A4A040009264FF01108002C9F +:1040D00092D06F883846FFF7BEF990F822A0A780EB +:1040E000687A00E02DE02072042138460CF0CEFD05 +:1040F000052138460CF0CAFD002138460CF0C6FDFB +:10410000012138460CF0C2FD032138460CF0BEFDFB +:10411000022138460CF0BAFD062138460CF0B6FDF7 +:10412000072138460CF0B2FD504600F0B3FE15E60C +:1041300014264FF01B08002C8AD0A380287A01286F +:1041400002D084F808C009E62772DAE90710C4E94A +:10415000031003E62146A9E7FFDFFFE570B5FE4D3A +:10416000287E122801D0082070BD0BF094F904F0CD +:1041700081FF040002D1687E00F08CFE0021052042 +:1041800010F0D2F9204670BD1CB5F348007E13280C +:1041900001D208201CBD00208DF8000068460AF0FE +:1041A00069FE04F067FF0028F4D10021052010F01B +:1041B000BBF91120FEF752FF00201CBD70B501288D +:1041C00005D0052825D0062800D0FFDF70BD8DB2B0 +:1041D0002846FFF740F9040000D1FFDF20782128AE +:1041E000F4D005F01BF968B1017821F00F01891CAA +:1041F00021F0F00110310170022101724580002090 +:10420000A07528E021462846BDE870401322FFF73C +:1042100025B9D148047EA4F1120005281FD2DFE899 +:1042200000F0060303030300FFF7AEFF01E0FFF712 +:1042300095FF0028CAD105F0F1F80028C6D0017812 +:1042400021F00F01891C21F0F00120310170132CA5 +:1042500007D002210172BDE8704005F0E2B8FFDF2F +:1042600070BD0121F6E72DE9F04116460C008046AD +:1042700000D1FFDF307820F00F00801C20F0F0002C +:10428000103030702078012804D0022818D0FFDFC9 +:10429000BDE8F0814046FFF7DEF8050000D1FFDF02 +:1042A0000320A87505F0BDF894E80F00083686E8ED +:1042B0000F00A94810F8301F41F001010170E7E735 +:1042C0004046FFF7C8F8050000D1FFDFA1884FF690 +:1042D000FF700027814202D1E288824203D08142EE +:1042E00001D1E08840B105F09CF894E80F00083651 +:1042F00086E80F00AF75CBE7A87D0128C8D17823E9 +:104300000022414610F066F80220A875C0E738B5D3 +:1043100005460C46084610F053F918BB203D062D03 +:104320004AD2DFE805F0031B373C4230002106206B +:1043300010F0D0F808B1112038BDA01C0BF07EF9A8 +:1043400004F098FE050038D100220823114606200B +:1043500010F040F8062830D0FFDF2EE0606810F043 +:1043600073F908B1102038BD618820886A460BF0C7 +:104370003BFD04F07FFE05001FD16068E8B1BDF889 +:104380000010018019E0A07800F0010120880BF0F6 +:1043900061FD0EE0206801F0FDFD05460DE020788E +:1043A00000F001000AF066F903E0618820880BF054 +:1043B000A0FC04F05FFEF0E70725284638BD70B585 +:1043C00005460C46084610F021F908B1102070BDD2 +:1043D000202D07D0212D0DD0222D0BD0252D09D039 +:1043E000072070BD2088A11C0AF039FABDE8704092 +:1043F00004F040BE062070BD57482530704708B510 +:104400003421554820F047FC0120FEF70FFE112013 +:10441000FEF724FE50496846263104F095FF4E48C9 +:104420009DF8002010F8251F62F3470121F00101DB +:104430000170002141724FF46171A0F80710022150 +:104440008172FEF755FE00B1FFDFFCF78FFF01F030 +:1044500034F908BD10B50C464021204620F0F9FB88 +:10446000A07F20F00300A077202020700020A075FE +:1044700084F8230010BD70472DE9FC41074610F079 +:104480009FF810B11020BDE8FC81334E06F12501E4 +:10449000D6F825000090B6F82950ADF8045096F8EB +:1044A0002B408DF806403846FEF78DFF0028EAD1F4 +:1044B000FEF71EFE0028E6D0009946F8251FB580BD +:1044C000B471E0E710B5044610F0A0F808B1102070 +:1044D00010BD21482049224690F825002631400889 +:1044E000FEF788FF002010BDFEB50D4604004FF01A +:1044F000000712D00822FEF79FFE002812D10026E6 +:1045000009E000BF54F826006946FEF71BFF0028AB +:1045100008D1761CF6B2AE42F4D309F0AEFF10B16A +:1045200043F20320FEBD0C4E86F8247024B300270E +:104530001EE000BF54F8270002A9FEF703FF00B1F8 +:10454000FFDF9DF808008DF8000054F8270050F8B0 +:10455000011FCDF8011001E0D80100208088ADF8DE +:104560000500684609F0D3FF00B1FFDF7F1CFFB2F2 +:10457000AF42DFD386F824500020FEBD2DE9F0477E +:104580008AB01546894604001ED00F4608222946E7 +:10459000FEF752FE002810D1002613E054F8260042 +:1045A0006946103000F09BFC002806D147B157F84F +:1045B000260010F005F818B110200AB0BDE8F08709 +:1045C000761CF6B2AE42E9D30026A5F101081BE045 +:1045D00006F1010A0AF0FF0712E000BF54F82600B6 +:1045E000017C4A0854F827100B7CB2EB530F05D11D +:1045F00006221130113120F081FA58B17F1CFFB230 +:10460000AF42EBD30AF0FF064645E1DB4E4624B14C +:10461000012003E043F20520CFE7002009F0A8FFC6 +:1046200010B909F0B9FF10B143F20420C5E75CB33B +:1046300000270DF1170825E054F8270069461030CF +:1046400000F04DFC00B1FFDF54F82700102250F8B5 +:10465000111FCDF801108088ADF8050054F827101F +:104660000DF1070020F076FA96B156F827101022C7 +:10467000404620F06FFA684609F022FF00B1FFDFE4 +:104680007F1CFFB2AF42D7D3FEF700FF002094E7B4 +:10469000404601F073FCEEE730B585B004460FF0FC +:1046A0008FFF18B960680FF0D8FF10B1102005B067 +:1046B00030BD60884AF2B811884206D82078FB4D98 +:1046C00028B1012806D0022804D00720EFE7FEF722 +:1046D0000FFD18E06078022804D0032802D043F2CE +:1046E0000220E4E785F82F00C1B200200090ADF869 +:1046F000040002292CD0032927D0FFDF684609F0E7 +:10470000EDFF04F0B7FC0028D1D1606801F029FC6E +:10471000207858B101208DF800000DF1010001F062 +:104720002DFC68460BF0F5FB00B1FFDF207885F823 +:104730002E00FEF7ABFE608860B1A88580B209F05C +:104740000FFF00B1FFDF0020B1E78DF80500D5E7CE +:104750004020FAE74FF46170EFE710B504460FF020 +:1047600055FF20B9606838B10FF06EFF08B1102016 +:1047700010BD606801F002FCCC4830F82C1F61804D +:10478000C178617080782070002010BD2DE9F84359 +:104790001446894606460FF039FFA0B948460FF087 +:1047A0005CFF80B920460FF058FF60B9BF4DA87874 +:1047B000012800D13CB13178FF2906D049B143F23C +:1047C0000400BDE8F8831020FBE7012801D0042095 +:1047D000F7E74FF00008A4B3052811D004280FD044 +:1047E00069462046FEF76BFE0028EAD1207D48B1DD +:1047F000012809D0022809D0032809D00720E0E7C2 +:104800000820DEE7424604E0012202E0022200E046 +:1048100003222346174600200099FEF78DFE00284C +:10482000CFD1A0892880A07BE875BDF80000A882C0 +:10483000AF75BDF80000000701D5A08988B1A08937 +:10484000288049460020FEF727FF0028B9D1A87824 +:1048500005280BD0042809D0287DC00703D00320E9 +:1048600002E08020ECE70220FEF7E0FB86F8008003 +:104870000020A6E77CB58D4C05460E46A0780228A0 +:1048800003D0032801D008207CBD15B143F20400F9 +:104890007CBD07200CF098F910B9A078032806D049 +:1048A000FEF7F2FB28B1A078032804D009E012201B +:1048B0007CBD13207CBD304600F0CBFA0028F9D136 +:1048C000E67001208DF800008DF801008DF802508F +:1048D0002088ADF80400E07D8DF8060068460BF0F6 +:1048E000C6F904F0C7FB0028E4D1A078032805D05E +:1048F0005FF00400FEF79AFB00207CBDE07800F03A +:10490000B8FA0520F6E71CB510B143F204001CBD4F +:10491000664CA078042803D0052801D008201CBDCF +:1049200000208DF8000001218DF801108DF80200A3 +:1049300068460BF09CF904F09DFB0028EFD1A078AD +:10494000052805D05FF00200FEF770FB00201CBDBB +:10495000E07800F09FFA0320F6E72DE9FC4180465D +:104960000E46032508460FF078FE002866D1404623 +:10497000FEF771FD040004D02078222804D208201C +:1049800081E543F202007EE5A07F00F003073EB11F +:10499000012F0CD000203146FEF729FC0500EFD195 +:1049A000012F06D0022F1AD0FFDF28466BE5012029 +:1049B000F1E7A07D3146022801D011B107E01120B6 +:1049C00061E56846FCF7DFFD0028D9D1694640461D +:1049D00006F0A9FC0500E8D10120A075E5E7A07D5F +:1049E000032804D1314890F83000C00701D02EB31D +:1049F0000EE026B1A07F40071ED4002100E0012177 +:104A0000404606F0B0FC0500CFD1A075002ECCD0FA +:104A10003146404600F07BFA05461128C5D1A07FFB +:104A20004107C2D4316844F80E1F7168616040F0DC +:104A3000040020740025B8E71125B6E7102022E510 +:104A400070B50C460546FEF706FD010005D022466E +:104A50002846BDE87040FEF701BD43F2020070BD7C +:104A600010B5012807D1114B9B78012B00D011B153 +:104A700043F2040010BD09F0B6FDBDE8104004F09B +:104A8000F9BA012300F010BA00231A46194600F0C3 +:104A90000BBA70B506460C4608460FF091FD18B9E2 +:104AA00020680FF0B3FD18B1102070BDD8010020B0 +:104AB000F64D2A7E112A04D0132A00D33EB10820D5 +:104AC000F3E721463046FEF774FE60B1EDE70920BA +:104AD000132A0DD0142A0BD0A188FF29E5D3152065 +:104AE000FEF7BCFA0020D4E90012C5E90712DCE7A2 +:104AF000A1881F29D9D31320F2E72DE9F047DFF869 +:104B00008C93804690B099F818009A4615460C464A +:104B1000132803D3FFF738FB002836D120460FF0C7 +:104B20004FFD88BB28460FF04BFD68BB20784FF047 +:104B30000107C0074FF0000602D08DF83A7001E07F +:104B40008DF83A602078C0F3C1008DF800006178DC +:104B50000720E1B101291AD0022916D0042914D165 +:104B600004208DF809006088ADF80A00A088ADF82F +:104B700010002078C0F3C100012825D0032823D0DD +:104B800040460FF01DFD28B1102010B016E58DF83D +:104B90000970E8E798F80000400808D0012809D01B +:104BA000022807D0032805D043F20220EDE78DF854 +:104BB000026001E08DF80270404650F8011FCDF808 +:104BC00003108088ADF807000DF10100FEF7E3FB4C +:104BD00008B10320D9E72888ADF816006888ADF839 +:104BE0001C00A888ADF82200E888ADF82800ADF8D0 +:104BF0002E60ADF8346068460AF057FAE8B999F8C3 +:104C000018004D46112801D00820BEE706200BF001 +:104C1000DBFF38B12078C0F3C100012804D003289D +:104C200002D004E01220B0E795F8240028B1FEF786 +:104C30002BFA022803D21320A7E70720A5E7504646 +:104C400000F007F90028A0D185F819A068460AF0FD +:104C50001FFC04F00FFA002897D1687E00F009F9D4 +:104C6000E08864280BD250B15FF0010000F041F9F8 +:104C700004008AD11220FEF7F1F9204685E764216D +:104C8000B0FBF1F0F2E770B5064615460C46084653 +:104C90000FF0BCFC18B928460FF0B8FC08B1102082 +:104CA00003E72A46214630460BF081F804F0E2F98A +:104CB0000028F5D121787F29F2D10520F5E67CB5D1 +:104CC00005460C4608460FF07BFC08B110207CBD61 +:104CD0002846FEF7C0FB20B10078222804D2082025 +:104CE0007CBD43F202007CBD684890F8300040076C +:104CF00001D511207CBD2078C00802D16078C008A1 +:104D000001D007207CBDADF8005020788DF802005E +:104D100060788DF803000220ADF8040068460AF0C0 +:104D200055F804F0A7F97CBD70B586B014460D4661 +:104D30000646FEF790FB28B10078222805D208200D +:104D400006B0B2E643F20200FAE728460FF085FC0F +:104D500020B944B120460FF077FC08B11020EFE7EE +:104D600000202060A080494890F83000800701D5DD +:104D70001120E5E703A9304609F0F7FD18B100BF9F +:104D800004F078F9DCE7ADF80060BDF81400ADF888 +:104D90000200BDF81600ADF80400BDF81000BDF823 +:104DA0001210ADF80600ADF808107DB1298809B1E0 +:104DB000ADF80610698809B1ADF80210A98809B1EB +:104DC000ADF80810E98809B1ADF80410DCB1BDF800 +:104DD0000610814201D9081A2080BDF80210BDF8E2 +:104DE0001400814201D9081A6080BDF80800BDF89E +:104DF0000410BDF816200144BDF812001044814291 +:104E000001D9081AA080684609F0E6FEB8E71CB58B +:104E10001F490968CDE9001068460AF048F904F016 +:104E200029F91CBD1CB500200090019068460AF0CD +:104E30003EF904F01FF91CBD108008885080488896 +:104E40009080C88810818888D0800020508190810F +:104E5000704710B5044604F079F830B1407830B1AD +:104E6000204604F082FB002010BD052010BD12205A +:104E700010BD10B504F06AF8040000D1FFDF6078BF +:104E800000B9FFDF6078401E607010BDD8010020BF +:104E90004050020010B504F059F8040000D1FFDFC3 +:104EA0006078401C607010BD1CB5ADF800008DF836 +:104EB00002308DF803108DF8042068460AF03CFF9C +:104EC00004F0D8F81CBD0CB52FA2D2E90012CDE930 +:104ED00000120079694601EB501000780CBD027891 +:104EE000520804D0012A02D043F202207047FEF794 +:104EF00029BA10B548B183000022114605200FF0F1 +:104F000069FA052801D0032010BD002010BD1FB58F +:104F10006A46FFF791FF68460AF01DFB04F0AAF805 +:104F200004B010BD70B50C0006460DD0FEF793FA24 +:104F3000050000D1FFDFA6802889208128896081B3 +:104F40006889A081A889E081AFE510B500231A46E1 +:104F500003E0845C2343521CD2B28A42F9D30BB1E2 +:104F6000002010BD012010BD00B540B1012805D0C2 +:104F7000022803D0032804D0FFDF002000BDFF205B +:104F800000BD042000BD0000070605040302010067 +:104F900010B504460FF014FB08B1102010BD2078A6 +:104FA000C0F30210042807D86078072804D3A1783A +:104FB000102901D8814201D2072010BDE0784107B5 +:104FC00006D421794A0703D4000701D4080701D584 +:104FD000062010BD002010BD10B513785C08837F3B +:104FE00064F3C713837713789C08C37F64F30003CB +:104FF000C3771078C309487863F341004870137889 +:105000001C090B7864F347130B701378DB0863F308 +:10501000000048705078487110BD10B5C4780B7806 +:1050200064F300030B70C478640864F341030B70ED +:10503000C478A40864F382030B70C478E40864F3B2 +:10504000C3030B700379117863F3000111700379C6 +:105050005B0863F34101117003799B0863F38201DC +:1050600011700079C00860F3C301117010BD70B5F4 +:1050700014460D46064604F0D1F980B10178182295 +:1050800021F00F01891C21F0F001A03100F8081B6C +:1050900021461FF0A4FDBDE8704004F0C2B92946C6 +:1050A0003046BDE870401322FEF7D8B92DE9F0472D +:1050B000064608A8894690E830041F469046142109 +:1050C00028461FF0E8FD0021CAF80010B8F1000FD3 +:1050D00003D0B9F1000F03D114E03878C00711D024 +:1050E00020680FF093FAC0BBB8F1000F07D1206819 +:1050F000123028602068143068602068A860216839 +:10510000CAF800103878800724D560680FF09CFA40 +:1051100018BBB9F1000F21D0FFF76EF90168C6F88E +:1051200068118188A6F86C11807986F86E0101F00B +:1051300002FDF94FEF60626862B196F8680106F20D +:10514000691140081032FEF755F91022394660689F +:105150001FF000FD0020BDE8F08706E0606820B188 +:10516000E8606068C6F86401F4E71020F3E730B542 +:10517000054608780C4620F00F00401C20F0F00196 +:10518000103121700020607095F8230030B10428A0 +:105190000FD0052811D0062814D0FFDF2078012178 +:1051A000B1EB101F04D295F8200000F01F006070D2 +:1051B00030BD21F0F000203002E021F0F00030306E +:1051C0002070EBE721F0F0004030F9E7F0B591B046 +:1051D000022715460C4606463A46ADF808700921E6 +:1051E00003AB04F07AFF0490002810D004208DF85F +:1051F00004008DF80170E034099605948DF818507C +:105200000AA968460DF022FA00B1FFDF012011B0B3 +:10521000F0BD10B588B00C460A99ADF80000C3B1D6 +:105220001868CDF802005868CDF80600ADF80A20DD +:10523000102203A81FF08EFC68460AF02FFA03F034 +:1052400019FF002803D1A17F41F01001A17708B018 +:1052500010BD0020CDF80200E6E72DE9F84F064624 +:10526000808A0D4680B28246FEF7F5F80446307813 +:10527000DFF8A48200274FF00509A8F120080F28C5 +:1052800070D2DFE800F06FF23708387D8CC8F1F09B +:10529000EFF35FF3F300A07F00F00300022809D0D2 +:1052A0005FF0000080F0010150460BF0DDFC0500CE +:1052B00003D101E00120F5E7FFDF98F85C10C90792 +:1052C00002D0D8F860000BE0032105F11D000EF0BC +:1052D00052FED5F81D009149B0FBF1F201FB12001E +:1052E000C5F81D0070686867B068A8672078252831 +:1052F00000D0FFDFCAE0A07F00F00300022809D041 +:105300005FF0000080F0010150460BF0ADFC06009C +:1053100003D101E00120F5E7FFDF3078810702D5F6 +:105320002178252904D040F001003070BDE8F88FC5 +:1053300002202870307F287106F11D002D36C5E946 +:105340000206F3E7A07F00F00300022808D0002047 +:1053500080F0010150460BF087FC040004D102E00C +:105360000120F5E7A7E1FFDF2078C10604D507207B +:1053700028703D346C60D9E740F008002070D5E714 +:10538000E07F000700D5FFDF307CB28800F001032A +:1053900001B05046BDE8F04F092105F027BD04B922 +:1053A000FFDF716821B1102204F124001FF0D2FB4D +:1053B00028212046FDF7AEFEA07F00F00300022862 +:1053C0000ED104F12400002300901A4621465046D5 +:1053D000FFF71FFF112807D029212046FDF79AFE6D +:1053E000307A84F82000A1E7A07F000700D5FFDF16 +:1053F00014F81E0F40F008002070E782A761E761F3 +:10540000C109607861F34100014660F38201617077 +:10541000307AE0708AE7A07F00F00300022809D00C +:105420005FF0000080F0010150460BF01DFC04000D +:1054300003D101E00120F5E7FFDF022104F185003F +:105440000EF099FD0420287004F5B4706860B4F87B +:1054500085002882304810387C346C61C5E90280B0 +:1054600064E703E024E15BE02DE015E0A07F00F0BD +:105470000300022807D0002080F0010150460BF005 +:10548000F3FB18B901E00120F6E7FFDF32462146C1 +:105490005046BDE8F84FEAE504B9FFDF207821283F +:1054A000A1D93079012803D1E07F40F00800E077EE +:1054B000324621465046FFF7DAFD2046BDE8F84F58 +:1054C0002321FDF727BE3279AA8005F108030921BF +:1054D000504604F002FEE86010B185F8009025E720 +:1054E000A07F00F00300022808D0002080F0010116 +:1054F00050460BF0B9FB040003D101E00120F5E7B1 +:10550000FFDF04F1620102231022081F0BF033FABF +:1055100007703179417009E73802002040420F00DE +:10552000A07F00F00300022808D0002080F00101D5 +:1055300050460BF099FB050003D101E00120F5E78F +:10554000FFDF95F8840000F0030001287AD1A07FE6 +:1055500000F00307E07F10F0010602D0022F04D113 +:1055600033E095F8A000C0072BD0D5F8601121B327 +:1055700095F88320087C62F387000874A17FCA092C +:10558000D5F8601162F341000874D5F8601166F334 +:1055900000000874AEB1D5F86001102204F12401B6 +:1055A00088351FF0D7FA287E40F001002876287849 +:1055B00020F0010005F8880900E016B1022F04D0A0 +:1055C0002DE095F88800C00727D0D5F85C1121B3ED +:1055D00095F88320087C62F387000874A17FCA09CC +:1055E000D5F85C1162F341000874D5F85C1166F3DC +:1055F000000008748EB1D5F85C01102204F124017A +:1056000088351FF0A7FA287840F0010005F8180B3C +:10561000287820F0010005F8A009022F44D00020CE +:1056200000EB400005EBC00090F88800800709D52A +:1056300095F87C00D5F86421400805F17D01103211 +:10564000FDF7D8FE8DF8009095F884006A4600F0CA +:1056500003008DF8010095F888108DF8021095F878 +:10566000A0008DF803002146504601F04DFA207845 +:10567000252805D0212807D0FFDF2078222803D94C +:1056800022212046FDF746FDA07F00F003000228FE +:105690000CD0002080F0010150460BF0F7FA0028F2 +:1056A0003FF44FAEFFDF41E60120B9E70120F1E70B +:1056B000706847703AE6FFDF38E670B5FE4C0025AB +:1056C00084F85C5025660CF08EFF04F11001204632 +:1056D00003F060FE84F8305070BD70B50D46FDF7E4 +:1056E000BAFE040000D1FFDF4FF4B87128461FF066 +:1056F000D2FA04F124002861A07F00F00300022800 +:1057000008D0012105F1E0000CF06EFF002800D068 +:10571000FFDF70BD0221F5E70A46014602F1E00015 +:105720000CF082BF70B50546406886B001780A2942 +:1057300006D00D2933D00E292FD0FFDF06B070BD63 +:1057400086883046FDF787FE040000D1FFDF207811 +:105750002128F3D028281BD1686802210E3001F0DF +:10576000C8F9A8B168680821801D01F0C2F978B1B4 +:1057700004F1240130460AF07CFA03F07BFC00B10E +:10578000FFDF06B02046BDE870402921FDF7C2BC0E +:1057900006B0BDE8704003F044BE012101726868A4 +:1057A000C6883046FDF757FE040000D1FFDFA07F1A +:1057B00000F00301022902D120F01000A077207828 +:1057C00021280AD06868017A09B1007980B1A07FE8 +:1057D00000F00300022862D0FFDFA07F00F003008A +:1057E0000228ABD1FEF796F80028A7D0FFDFA5E787 +:1057F00003F017FEA17F08062BD5E07FC00705D078 +:1058000094F8200000F01F00102820D05FF0050061 +:1058100084F82300207829281DD02428DDD13146A2 +:1058200004200EF081FE22212046FDF773FCA07FAC +:1058300000F00300022830D05FF0000080F001018A +:1058400030460BF023FA0028C7D0FFDFC5E706205B +:10585000DEE70420DCE701F00300022808D0002086 +:1058600080F0010130460BF0FFF9050003D101E0A3 +:105870000120F5E7FFDF25212046FDF74BFC032043 +:105880008DF80000694605F1E0000CF0C4FE022826 +:10589000A3D00028A1D0FFDF9FE70120CEE703F0CF +:1058A000C0FD9AE72DE9F04387B099461646884631 +:1058B0000746FDF7D0FD04004BD02078222848D3BE +:1058C000232846D0E07F000743D4A07F00F00300E8 +:1058D000022809D05FF0000080F0010138460BF08B +:1058E000C3F9050002D00CE00120F5E7A07F00F02D +:1058F0000300022805D00121002238460BF0ABF945 +:1059000005466946284601F026F9009800B9FFDFF0 +:1059100045B10098E03505612078222806D024287A +:1059200004D007E000990020086103E0252120460B +:10593000FDF7F0FB0098012141704762868001A9C4 +:10594000C0E902890CF082FE022802D0002800D0B3 +:10595000FFDF07B0BDE8F08370B586B00546FDF700 +:105960007AFD017822291ED9807F00F003000228E9 +:1059700008D0002080F0010128460BF075F90400E2 +:105980002FD101E00120F5E7FFDF2AE0B4F85E0047 +:1059900004F1620630440178427829B12146284654 +:1059A000FFF714FCB0B9C9E6ADF804200921284678 +:1059B00002AB04F092FB03900028F4D005208DF890 +:1059C0000000694604F1E0000CF025FE022801D039 +:1059D00000B1FFDF02231022314604F15E000BF01C +:1059E00000F8B4F860000028D0D1A7E610B586B062 +:1059F0000446FDF730FD017822291BD9807F00F095 +:105A00000300022808D0002080F0010120460BF09E +:105A10002BF9040003D101E00120F5E7FFDF0620A8 +:105A20008DF80000694604F1E0000CF0F4FD002858 +:105A300000D0FFDF06B010BD2DE9F05F05460C4633 +:105A400000270078904601093E4604F1080BBA464B +:105A500002297DD0072902D00A2909D146E06868C9 +:105A600001780A2905D00D2930D00E292ED0FFDF6C +:105A7000BCE114271C26002C6BD08088A080FDF789 +:105A8000EAFC5FEA000900D1FFDF99F817005A46E7 +:105A9000400809F11801FDF7ADFC6868C089208253 +:105AA000696851F8060FC4F812004868C4F8160077 +:105AB000A07E20F0060001E01802002040F0010066 +:105AC000A07699F81E0040F020014DE01A270A2622 +:105AD000002CD1D0C088A080FDF7BDFC050000D10E +:105AE000FFDF59462846FFF742FB7FE10CB1A88B48 +:105AF000A080287A0B287DD006DC01287BD00228E4 +:105B000008D0032804D135E00D2875D00E2874D0B4 +:105B1000FFDF6BE11E270926002CADD0A088FDF722 +:105B20009AFC5FEA000900D1FFDF287B00F0030048 +:105B30000128207A1BD020F001002072297B8908DF +:105B400061F341002072297BC90861F3820001E002 +:105B500041E1F2E02072297B090961F3C300207260 +:105B600099F81E0040F0400189F81E103EE140F017 +:105B70000100E2E713270D26002CAAD0A088FDF72C +:105B80006AFC8146807F00F00300022808D00020D4 +:105B900080F00101A0880BF067F8050003D101E057 +:105BA0000120F5E7FFDF99F81E0000F00302022A4A +:105BB00050D0686F817801F003010129217A4BD020 +:105BC00021F00101217283789B0863F34101217266 +:105BD0008378DB0863F38201217283781B0963F306 +:105BE000C3012172037863F306112172437863F3D2 +:105BF000C71103E061E0A9E090E0A1E0217284F820 +:105C000009A0C178A172022A29D00279E17A62F34F +:105C10000001E1720279520862F34101E1720279F6 +:105C2000920862F38201E1720279D20862F3C30141 +:105C3000E1724279217B62F30001217342795208BB +:105C400062F3410121734279920862F38201217368 +:105C5000407928E0A86FADE741F00101B2E7427951 +:105C6000E17A62F30001E1724279520862F3410184 +:105C7000E1724279920862F38201E1724279D208BC +:105C800062F3C301E1720279217B62F300012173A7 +:105C90000279520862F3410121730279920862F39A +:105CA000820121730079C00860F3C301217399F860 +:105CB0000000232831D9262140E018271026E4B31C +:105CC000A088FDF7C8FB8346807F00F00300022810 +:105CD00009D0002080F00101A0880AF0C5FF5FEA2A +:105CE000000903D101E00120F4E7FFDFE868A060CC +:105CF00099F8000040F0040189F8001099F80100BB +:105D0000800708D5012020739BF8000023286DD957 +:105D10002721584651E084F80CA067E015270F268C +:105D20005CB1A088FDF797FB814606225946E868DA +:105D300008F089F90120A073A2E041E048463CE068 +:105D400016270926E4B3287B20724FE0287B192709 +:105D50000E26ACB3C4F808A0A4F80CA0012807D004 +:105D6000022805D0032805D0042803D0FFDF0DE06A +:105D7000207207E0697B042801F00F0141F08001E7 +:105D800021721ED0607A20F003006072A088FDF7B7 +:105D900062FB05460078212828D0232800D0FFDFA9 +:105DA000A87F00F00300022813D0002080F001013A +:105DB000A0880AF06BFF22212846FDF7ABF915E019 +:105DC00004E0607A20F00300401CDEE7A8F80060E1 +:105DD00011E00120EAE70CB16888A080287A032846 +:105DE0002ED004280AD0052850D0FFDFA8F8006084 +:105DF0000CB1278066800020BDE8F09F15270F2694 +:105E0000002CE3D0A088FDF726FB807F00F0030084 +:105E1000022809D05FF0000080F00101A0880AF09C +:105E200023FF050003D101E00120F5E7FFDFD5F8EE +:105E30001D000622594608F006F984F80EA0D5E7A1 +:105E400017270926002CC1D0A088FDF704FB814646 +:105E5000807F00F00300022808D0002080F00101BC +:105E6000A0880AF001FF050003D101E00120F5E759 +:105E7000FFDF6878800701D5022000E00120207252 +:105E800099F800002328B1D9272157E719270E26B2 +:105E9000002C9BD0A088FDF7DEFA5FEA000900D154 +:105EA000FFDFC4F808A0A4F80CA084F808A0A07A2A +:105EB00040F00300A07299F81E10C90961F3820036 +:105EC000A07299F81F2099F81E1012EAD11F05D070 +:105ED00099F8201001F01F0110292BD020F00800A4 +:105EE000A07299F81F10607A61F3C3006072697A3A +:105EF00001F003010129A2D140F00400607299F879 +:105F00001E0000F003000228E87A16D0217B60F31F +:105F100000012173AA7A607B62F300006073EA7A61 +:105F2000520862F341012173A97A490861F34100E3 +:105F300060735BE740F00800D2E7617B60F300012B +:105F40006173AA7A207B62F300002073EA7A520818 +:105F500062F341016173A97A490861F3410020733A +:105F600044E710B5FE4C30B10146102204F1200088 +:105F70001EF0F0FD012084F8300010BD10B504467D +:105F800000F0D9FDF64920461022BDE8104020312E +:105F90001EF0E0BD70B5F24D06004FF0000413D0C6 +:105FA0000EF00EFB08B110240CE00621304608F07C +:105FB00031F8411C05D028665FF0010085F85C00CF +:105FC00000E00724204670BD0020F7E7007810F0BD +:105FD0000F0204D0012A05D0022A0CD110E00009DA +:105FE00009D10AE00009012807D0022805D00328BA +:105FF00003D0042801D007207047087000207047A4 +:106000000620704705282AD2DFE800F003070F17A3 +:106010001F00087820F0FF001EE0087820F00F0035 +:10602000401C20F0F000103016E0087820F00F003F +:10603000401C20F0F00020300EE0087820F00F0027 +:10604000401C20F0F000303006E0087820F00F000F +:10605000401C20F0F00040300870002070470720FE +:1060600070472DE9F041804688B00D46002708466C +:106070000EF0F3FAA8B94046FDF7EDF9040003D09D +:106080002078222815D104E043F2020008B0BDE8D0 +:10609000F08145B9A07F410603D500F00300022836 +:1060A00001D01020F2E7A07FC10601D4010702D57C +:1060B0000DB10820EAE7E17F090701D50D20E5E7EA +:1060C00000F00300022805D125B12846FEF760FF45 +:1060D0000700DBD1A07F00F00300022808D00020D9 +:1060E00080F0010140460AF0BFFD060002D00FE03B +:1060F0000120F5E7A07F00F0030002280ED0002069 +:1061000080F00101002240460AF0A5FD060007D0FC +:10611000A07F00F00300022804D009E00120EFE78F +:106120000420B3E725B12A4631462046FEF754FF46 +:106130006946304600F00FFD009800B9FFDF009976 +:10614000022006F1E0024870C1F824804A61002272 +:106150000A81A27F02F00302022A1CD001200871EA +:10616000287800F00102087E62F3010008762A78A0 +:10617000520862F3820008762A78920862F3C3001C +:1061800008762A78D20862F3041008762421204683 +:10619000FCF7C0FF33E035B30871301D88613078FB +:1061A000400908777078C0F340004877287800F0FD +:1061B0000102887F62F301008877A27FD20962F32F +:1061C00082008877E27F62F3C3008877727862F397 +:1061D00004108877A878C87701F121022846203179 +:1061E000FEF71BFF03E00320087105200876252138 +:1061F0002046FCF78FFFA07F20F04000A07701A988 +:1062000000980CF023FA022801D000B1FFDF3846D5 +:106210003CE72DE9FF4F534A0D4699B09A4607CA0D +:106220000BAB002783E807001998FDF714F9060067 +:1062300006D03078262806D008201DB0BDE8F08FA3 +:1062400043F20200F9E7B07F00F00309B9F1020F51 +:1062500003D00020284302D006E00120FAE71B9873 +:10626000FEF796FE0028E8D1B07F00F00300022878 +:1062700001D11B9979BB022808D0002080F00101D0 +:1062800019980AF0F1FC040003D101E00120F5E7C0 +:10629000FFDF852D28D007DCF5B1812D1ED0822DA2 +:1062A0001ED0832D08D11DE0862D1FD0882D1FD034 +:1062B000892D1FD08A2D1FD00F2020710F281DD0AF +:1062C00003F0ACF8E0B101208DF84000201D1190E2 +:1062D0002079B8B167E111E00020EEE70120ECE79A +:1062E0000220EAE70320E8E70520E6E70620E4E7E6 +:1062F0000820E2E70920E0E70A20DEE707209CE724 +:1063000011209AE7B9F1020F03D0A56F03D1A06F56 +:1063100002E0656FFAE7606F804632D04FF001000F +:1063200000904FF002000190214630461B9AFEF784 +:1063300053FE1B98007800F00101A87861F301007A +:10634000A870B17FC90961F38200A870F17F61F381 +:10635000C300A870617861F30410A870207803E08E +:106360001802002048500200400928706078C0F3ED +:10637000400068701B988078E87000206871287170 +:1063800003E00220009001200190A87898F8021004 +:10639000C0F3C000C1F3C00108405FEA000B2CD07D +:1063A00050460EF00DF990BBDAF80C000EF008F92B +:1063B00068BBDAF81C000EF003F940BBDAF80C00F9 +:1063C000A060DAF81C00E06098F80100617800F045 +:1063D000010041EA4000607098F80210C0B2C1F3B9 +:1063E0000011891E0840607000202077019906F195 +:1063F000170002290CD001210BE098F801106078F9 +:1064000001F00101FD2242EA41010840E3E732E0E8 +:10641000002104EB810148610099701C022901D020 +:10642000012100E0002104EB81014861A87800F01F +:106430000300012858D198F8020000F00300012859 +:1064400052D1B9F1020F04D02A1D691D1B98FEF725 +:10645000E4FD297998F8040001408DF83810687936 +:1064600098F8052010408DF83C0001433CD0504680 +:106470000EF0A6F808B11020DFE60AF11001049131 +:10648000B9F1020F18D008465FF0000104F18C0347 +:10649000CDE9000304F5AE7202920EAB5A462046D7 +:1064A000FEF704FE0028E7D1B9F1020F08D05046EC +:1064B00008D14FF0010107E050464FF00101E5E738 +:1064C0000498F5E74FF0000104F1A403CDE90003BF +:1064D00004F5B072029281F001010FAB5A462046DA +:1064E000FEF7E4FD0028C7D16078800734D4A8788F +:1064F00098F80210C0F38000C1F3800108432BD04C +:10650000297898F800000BAAB9F1020F06D032F8EA +:1065100011204300DA4002F003070AE032F81020AD +:106520004B00DA4012F0030705D0012F0BD0022FE9 +:106530000BD0032F07D0BBF1000F0DD0012906D0DF +:10654000042904D008E00227F5E70127F3E7012832 +:1065500001D0042800D10427B07F40F08000B0773C +:10656000F17F6BF30001F177607881074FF0030052 +:106570000CD5A071BBF1000F15D100BF8DF85C00E8 +:1065800017AA3146199800F0BFFA0CE00221022F39 +:1065900018D0012F18D0042F22D00020A071B07F76 +:1065A00020F08000B07725213046FCF7B3FD10A91C +:1065B00004F1E0000CF02FF810B1022800D0FFDF4A +:1065C00000203AE6A171D9E7A1710D2104F1200064 +:1065D0001EF061FB207840F0020020700420CDE71F +:1065E0000120A071DFE72DE9F04387B0904689468E +:1065F00004460025FCF72FFF060006D03078272838 +:1066000006D0082007B0BDE8F08343F20200F9E7A6 +:10661000B07F00F00300022808D0002080F00101C4 +:1066200020460AF021FB040003D101E00120F5E738 +:10663000FFDFA7795FEA090005D0012821D0B9F171 +:10664000020F26D110E0B8F1000F22D1012F05D0A2 +:10665000022F05D0032F05D0FFDF2DE00C252BE006 +:10666000012529E0022527E040460DF0A9FFB0B939 +:10667000032F0ED11022414604F11D001EF06AFACC +:106680001AE0012F02D0022F03D104E0B8F1000F6D +:1066900012D00720B6E740460DF092FF08B1102057 +:1066A000B0E7102104F11D001EF0D3FA0621404688 +:1066B00007F0B0FCC4F81D002078252140F002004E +:1066C00020703046FCF726FD2078C10713D020F05B +:1066D0000100207002208DF8000004F11D000290DE +:1066E0008DF804506946C3300BF095FF022803D0A3 +:1066F00010B1FFDF00E02577002083E730B587B0D9 +:106700000D460446FCF7A7FEA0B1807F00F0030011 +:10671000022812D05FF0000080F0010120460AF04C +:10672000A3FA04000ED028460DF04AFF38B110201D +:1067300007B030BD43F20200FAE70120ECE7207811 +:10674000400701D40820F3E7294604F13D00202248 +:1067500005461EF0FFF9207840F010002070010778 +:106760000FD520F00800207007208DF80000694642 +:1067700004F1E00001950BF04EFF022801D000B1BA +:10678000FFDF0020D4E770B50D460646FCF763FE38 +:1067900018B10178272921D102E043F2020070BD2F +:1067A000807F00F00300022808D0002080F0010163 +:1067B00030460AF059FA040003D101E00120F5E760 +:1067C000FFDFA079022809D16078C00706D02A46E9 +:1067D00021463046FEF7FAFC10B10FE0082070BDEC +:1067E000B4F860000E280BD204F1620102231022DB +:1067F000081F0AF0C0F8012101704570002070BD2B +:10680000112070BD70B5064614460D4608460DF0C1 +:10681000D7FE18B920460DF0F9FE08B1102070BD62 +:10682000A6F57F40FF380ED03046FCF714FE38B195 +:10683000417822464B08811C1846FCF7DBFD07E037 +:1068400043F2020070BD2046FDF73CFE0028F9D15E +:106850001021E01D0DF08FFBE21D294604F1170009 +:1068600000F089F9002070BD2DE9F04104468AB09E +:1068700015468846002708460DF0EFFE18B9284651 +:106880000DF0EBFE18B110200AB0BDE8F0812046F3 +:10689000FCF7E1FD060003D0307827281BD102E089 +:1068A00043F20200F0E7B07F00F00300022809D0B5 +:1068B0005FF0000080F0010120460AF0D5F90400E5 +:1068C00003D101E00120F5E7FFDF2078400702D582 +:1068D0006078800701D40820D6E7B07F00F003007D +:1068E000022803D0A06F03D1A16F02E0606FFAE726 +:1068F000616F407800B19DB1487810B1B8F1000FD8 +:106900000ED0ADB1EA1D06A8E16800F034F91022FE +:1069100006A905F117001EF0F1F818B1042707E0E9 +:106920000720B1E71022E91D04F12D001EF012F935 +:10693000B8F1000F06D0102208F1070104F11D0084 +:106940001EF008F92078252140F002002070304622 +:10695000FCF7E0FB2078C10715D020F00100207083 +:1069600002208DF8000004F11D0002901030039009 +:106970008DF804706946B3300BF04DFE022803D049 +:1069800010B1FFDF00E0277700207DE7F8B515465E +:106990000E460746FCF75FFD040004D0207822284D +:1069A00004D00820F8BD43F20200F8BDA07F00F03B +:1069B0000300022802D043F20500F8BD30460DF076 +:1069C000FFFD18B928460DF0FBFD08B11020F8BDF9 +:1069D00000953288B31C21463846FEF71AFC112870 +:1069E00015D00028F3D1297C4A08A17F62F3C71192 +:1069F000A177297CE27F61F30002E277297C890894 +:106A000084F82010A17F21F04001A177F8BDA17F7B +:106A10000907FBD4D6F80200C4F83600D6F8060001 +:106A2000C4F83A003088A0861022294604F12400D8 +:106A30001EF090F8287C4108E07F61F34100E07788 +:106A4000297C61F38200E077287C800884F82100AB +:106A5000A07F40F00800A0770020D3E770B50D4676 +:106A600006460BB1072070BDFCF7F5FC040007D00B +:106A70002078222802D3A07F800604D4082070BD8D +:106A800043F2020070BDADB12946304609F0F1F87D +:106A900002F0F0FA297C4A08A17F62F3C711A177BE +:106AA000297CE27F61F30002E277297C890884F87F +:106AB000201004E0304609F004F902F0DBFAA17F6F +:106AC00021F02001A17770BD70B50D46FCF7C3FC25 +:106AD000040005D028460DF099FD20B1102070BDAE +:106AE00043F2020070BD29462046FEF740FB00201D +:106AF00070BD04E010F8012B0AB100207047491E58 +:106B000089B2F7D20120704770B51546064602F0EB +:106B100085FC040000D1FFDF207820F00F00801CEE +:106B200020F0F0002030207066802868A060BDE86A +:106B3000704002F076BC10B5134C94F83000002879 +:106B400008D104F12001A1F110000BF0A6FD0120F5 +:106B500084F8300010BD10B190F8B9202AB10A486D +:106B600090F8350018B1002003E0B83001E0064885 +:106B700034300860704708B50023009313460A4676 +:106B80000AF06DFA08BD00001802002018B18178E3 +:106B9000012938D101E010207047018842F6011226 +:106BA000881A914231D018DC42F60102A1EB0200B2 +:106BB00091422AD00CDC41B3B1F5C05F25D06FF40F +:106BC000C050081821D0A0F57060FF381BD11CE020 +:106BD00001281AD002280AD117E0B0F5807F14D01E +:106BE00008DC012811D002280FD003280DD0FF287F +:106BF00009D10AE0B0F5817F07D0A0F58070033895 +:106C000003D0012801D0002070470F2070470A28C8 +:106C10001ED007DC18D2DFE800F0191B1F1F171F5A +:106C2000231D1F21102815D008DC0B2812D00C289A +:106C300010D00D2816D00F2806D10DE011280BD04A +:106C400084280BD087280FD003207047002070477E +:106C500005207047072070470F20704704207047B9 +:106C6000062070470C20704743F20200704738B589 +:106C70000C46050041D06946FFF7A8F9002819D154 +:106C80009DF80010607861F3020060706946681C2E +:106C9000FFF79CF900280DD19DF80010607861F392 +:106CA000C5006070A978C1F34101012903D0022910 +:106CB00005D0072038BD217821F0200102E021789D +:106CC00041F020012170410704D0A978C90861F37F +:106CD00086106070607810F0380F07D0A978090925 +:106CE00061F3C710607010F0380F02D16078400671 +:106CF00003D5207840F040002070002038BD70B5EA +:106D000004460020088015466068FFF7B0FF0028A1 +:106D100016D12089A189884211D860688078C0077F +:106D20000AD0B1F5007F0AD840F20120B1FBF0F2A1 +:106D300000FB1210288007E0B1F5FF7F01D90C207D +:106D400070BD01F201212980002070BD10B50478CA +:106D5000137864F3000313700478640864F3410348 +:106D600013700478A40864F3820313700478E408B1 +:106D700064F3C30313700478240964F304131370D9 +:106D80000478640964F3451313700078800960F394 +:106D90008613137031B10878C10701D1800701D57E +:106DA000012000E0002060F3C713137010BD42788B +:106DB000530702D002F0070306E012F0380F02D0AA +:106DC000C2F3C20300E001234A7863F302024A706F +:106DD000407810F0380F02D0C0F3C20005E043073E +:106DE00002D000F0070000E0012060F3C5024A7005 +:106DF00070472DE9F04F95B00D00824612D0122158 +:106E000028461DF026FF4FF6FF7B05AA01215846B4 +:106E100006F04BFF0024264637464FF420586FF407 +:106E2000205972E0102015B0BDE8F08F9DF81E00CB +:106E300001280AD1BDF81C1041450BD011EB090007 +:106E40000AD001280CD002280CD0042C0ED0052C1E +:106E50000FD10DE0012400E00224BDF81A6008E023 +:106E6000032406E00424BDF81A7002E0052400E0C3 +:106E70000624BDF81A10514547D12C74BEB34FF00B +:106E8000000810AA4FF0070ACDE90282CDE900A858 +:106E90000DF13C091023CDF810904246314658467A +:106EA00006F0B6FF08BBBDF83C002A46C0B210A9E8 +:106EB0000BF05CFCC8B9AE81CFB1CDE900A80DF1F3 +:106EC000080C0AAE40468CE84102132300223946E2 +:106ED000584606F09DFF40B9BDF83C00F11CC01EAD +:106EE000C0B22A1D0BF042FC10B103209BE70AE060 +:106EF000BDF82900E881062C05D19DF81E00A87276 +:106F0000BDF81C00288100208DE705A806F0D9FEF9 +:106F100000288BD0FFF77BFE85E72DE9F0471C4664 +:106F2000DDE90978DDF8209015460E00824600D193 +:106F3000FFDF0CB1208818B1D5B11120BDE8F08772 +:106F4000022D01D0012100E0002106F1140005F01E +:106F50009BFDA8F8000002463B462946504603F038 +:106F6000BCF8C9F8000008B9A41C3C600020E5E7A3 +:106F70001320E3E7F0B41446DDE904528DB1002399 +:106F800014B1022C09D101E0012306E00D7CEE07CB +:106F900003D025F0010501230D742146F0BC03F058 +:106FA00025BF1A80F0BC70472DE9FE4F91461A8824 +:106FB0001C468A468046FAB102AB494603F08DF87A +:106FC000050019D04046A61C278809F091FF3246DB +:106FD000072629463B46009609F09FFB208823465A +:106FE000CDE900504A4651464046FFF7C3FF002016 +:106FF00020800120BDE8FE8F0020FBE72DE9F0474F +:1070000086B09146DDE90E460F46824603AA05A9E1 +:1070100004A8109D8DE80700984632462146504648 +:10702000FFF77BFF049909B1012200E000222A70DA +:10703000002818D1F94A03AB1060059A009104F1B9 +:107040001400CDE901204A463946504606F0D3F8EF +:10705000A8B1092811D2DFE800F005080510100AD0 +:107060000C0C0E00002006B068E71120FBE707209B +:10707000F9E70820F7E70D20F5E70320F3E7BDF86F +:107080000C100498CDE90001434632462146504693 +:10709000FFF770FFE6E72DE9F04389B00D46DDE923 +:1070A000108781461C461646142103A81DF0F3FDE7 +:1070B000012002218DF810108DF80C008DF8117050 +:1070C000ADF8146064B1A278D20709D08DF816002B +:1070D000E088ADF81A00A088ADF81800A068079005 +:1070E00008A80095CDE90110424603A948466B68FF +:1070F000FFF784FF09B0BDE8F083F0B58BB0002442 +:107100000646069407940727089405A80994019455 +:1071100000970294CDE903400D46102322463046E5 +:1071200006F076FE78B90AA806A9019400970294A1 +:10713000CDE90310BDF8143000222946304606F090 +:107140003DFC002801D0FFF762FD0BB0F0BD06F05A +:10715000DDBA2DE9FC410C468046002602F05EF9BE +:10716000054620780D287DD2DFE800F0BC0713B378 +:1071700025BD49496383AF959B00A848006820B1AD +:10718000417841F010014170ADE0404602F076F9DF +:10719000A9E00421404609F067FD070000D1FFDFA8 +:1071A00007F11401404605F003FCA5BB132140463E +:1071B000FDF746FC97E00421404609F055FD070025 +:1071C00000D1FFDFE088ADF800000020B8819DF815 +:1071D0000000010704D5C00602D5A088B88105E0EB +:1071E0009DF8010040067ED5A088F88105B9FFDF33 +:1071F00022462946404601F063FC022673E0E188FE +:10720000ADF800109DF8011009060FD5072803D02E +:1072100006280AD00AE024E00421404609F024FDB3 +:10722000060000D1FFDFA088F0810226CDB9FFDF84 +:1072300017E00421404609F017FD070000D1FFDFE9 +:1072400007F1140006F099FA90F0010F02D1E079ED +:10725000000648D5387C022640F00200387405B993 +:10726000FFDF00E03EE022462946404601F028FCD0 +:1072700039E00421404609F0F7FC017C002D01F0C3 +:107280000206C1F340016171017C21F00201017429 +:10729000E7D1FFDFE5E702260121404602F020F9B1 +:1072A00021E00421404609F0DFFC054660680090BB +:1072B0002089ADF8040001226946404602F031F908 +:1072C000287C20F0020028740DE0002DC9D1FFDFDA +:1072D000C7E7022600214046FBF784F8002DC0D105 +:1072E000FFDFBEE7FFDF3046BDE8FC813EB50C00A6 +:1072F00009D001466B4601AA002006F00BFE20B122 +:10730000FFF785FC3EBD10203EBD00202080A07010 +:107310009DF8050002A900F00700FEF773FE50B9C2 +:107320009DF8080020709DF8050002A9C0F3C20076 +:10733000FEF768FE08B103203EBD9DF808006070AE +:107340009DF80500C109A07861F30410A0709DF8B4 +:107350000510890961F3C300A0709DF80410890627 +:1073600001D5022100E0012161F342009DF80010E7 +:1073700061F30000A07000203EBD70B514460646C3 +:107380000D4651EA040005D075B108460DF05CF9D0 +:1073900078B901E0072070BD2946304606F01BFE93 +:1073A00010B1BDE8704032E454B120460DF04CF904 +:1073B00008B1102070BD21463046BDE8704095E709 +:1073C000002070BD2DE9FC5F0C4690460546002765 +:1073D00001780822007A3E46B2EB111F7ED104F1FB +:1073E0000A0100910A31821E4FF0020A04F1080BD3 +:1073F0000191092A73D2DFE802F0ECDF05F42727B8 +:107400007AA9CD006888042109F02EFC060000D17D +:10741000FFDFB08920B152270726C2E07C0200209E +:1074200051271026002C7DD06888A0800120A071F3 +:10743000A88900220099FFF7A0FF002873D1A8892E +:107440002081288AE081D1E0B5F81290072824D164 +:10745000E87B000621D5512709F1140086B2002CE3 +:10746000E1D0A88900220099FFF787FF00285AD1B0 +:107470006888A08084F806A0A88920810120A073D4 +:10748000288A2082A4F81290A88A009068884B4627 +:10749000A969019A01F0F1FAA8E0502709F1120058 +:1074A00086B2002C3ED0A88900225946FFF765FF1E +:1074B000002838D16888A080A889E080287A072829 +:1074C00013D002202073288AE081E87BC009607312 +:1074D000A4F81090A88A0090688801E083E080E01A +:1074E0004B4604F11202A969D4E70120EAE7B5F896 +:1074F0001290512709F1140086B2002C66D06888DA +:10750000042109F0B1FB83466888A080A889002285 +:107510000099FFF732FF00286ED184F806A0A889F1 +:10752000208101E052E067E00420A073288A2082D5 +:10753000A4F81290A88A009068884B46A969019A1D +:1075400001F09BFAA989ABF80E104FE06888FBF7B1 +:1075500082FF07466888042109F086FB064607B9C2 +:10756000FFDF06B9FFDF687BC00702D05127142672 +:1075700001E0502712264CB36888A080502F06D017 +:1075800084F806A0287B594601F087FA2EE0287B74 +:10759000A11DF9E7FE49A8894989814205D15427EF +:1075A00006269CB16888A08020E053270BE06888FD +:1075B000A080A889E08019E06888042109F054FBC4 +:1075C00000B9FFDF55270826002CF0D1A8F800608D +:1075D00011E056270726002CF8D06888A0800020EC +:1075E00013E0FFDF02E0012808D0FFDFA8F8006009 +:1075F0000CB1278066800020BDE8FC9F5727072636 +:10760000002CE3D06888A080687AA071EEE7401D66 +:1076100020F0030009B14143091D01EB4000704710 +:1076200013B5DB4A00201071009848B10024684669 +:1076300009F037F9002C02D1D64A009911601CBD1F +:1076400001240020F4E770B50D46064686B01446C6 +:107650005C2128461DF01FFB04B9FFDFA078687489 +:10766000A2782188284601F042FA0020A881E8810A +:10767000228805F11401304605F07FF96A460121A0 +:10768000304606F012FB19E09DF80300000715D5FF +:10769000BDF806103046FFF730FD9DF80300BDF839 +:1076A000061040F010008DF80300BDF80300ADF89F +:1076B0001400FF233046059A06F058FC684606F091 +:1076C00000FB0028E0D006B070BD10B50C4601F1FB +:1076D000140005F089F90146627C2046BDE810409F +:1076E00001F03ABA70B50546042109F0BDFA04006C +:1076F00000D1FFDF04F114010C46284605F058F9CB +:1077000021462846BDE8704005F059B970B58AB0E9 +:107710000C460646FBF79FFE050014D02878222869 +:1077200027D30CB1A08890B101208DF80C00032064 +:107730008DF8100000208DF8110054B1A088ADF82C +:107740001800206807E043F202000AB070BD09206B +:10775000FBE7ADF8180005900421304609F084FAE3 +:10776000040000D1FFDF04F1140005F054F9000714 +:1077700001D40820E9E701F051FE60B108A8022118 +:107780000094CDE9011095F8232003A930466368E1 +:10779000FFF734FCD9E71120D7E72DE9F04FB2F815 +:1077A00002A0834689B0154689465046FBF753FE32 +:1077B00007460421504609F057FA0026044605966C +:1077C0004FF002080696ADF81C6007B9FFDF04B958 +:1077D000FFDF4146504603F070FE50B907AA06A9E4 +:1077E00005A88DE807004246214650466368FFF72A +:1077F00094FB674807AB0660DDE9051204F114004D +:10780000CDF80090CDE90320CDE9013197F8232090 +:10781000594650466B6805F047F906000AD0022E1B +:1078200004D0032E14D0042E00D0FFDF09B0304660 +:10783000BDE8F08FBDF81C000028F7D00599CDE910 +:1078400000104246214650466368FFF793FBEDE780 +:10785000687840F008006870E8E72DE9F04F9BB0C9 +:1078600004464FF000084A48ADF85480ADF8308027 +:10787000ADF85080A0F80880ADF81480ADF81880FD +:10788000ADF82080ADF81C80007916460D464746BD +:10789000012808D0022806D0032804D0042802D0EA +:1078A00008201BB0C4E720460CF08AFED0BB284657 +:1078B0000CF086FEB0BB60680CF0CFFE90BB606839 +:1078C00048B160892189884202D8B1F5007F01D989 +:1078D0000C20E6E780460BAA06A92846FFF70FFA18 +:1078E0000028DED168688078C0F34100022808D102 +:1078F0009DF8190010F0380F03D028690CF0A4FE91 +:1079000080B905A92069FFF7B2F90028C9D120691B +:1079100050B1607880079DF8150000F0380002D55E +:10792000D0B301E011E0B8BB9DF8140080060ED57D +:107930009DF8150010F0380F03D060680CF084FE3D +:1079400018B960680CF089FE08B11020A9E707A9F2 +:107950006069FFF78CF90028A3D1606940B19DF8F8 +:107960001D0000F0070101293FD110F0380F3CD075 +:1079700008A9A069FFF77BF9002892D19DF81C00A7 +:10798000800632D49DF8200080062ED4A06904E041 +:107990007C0200201400002027E040B19DF8210067 +:1079A00000F00701012920D110F0380F1DD0E06848 +:1079B00018B10078C8B11C2817D20EAA611C204645 +:1079C000FFF7C4F90120B94660F30F27BA4607460E +:1079D0008DF84E0042F60300ADF84C000DF13B026D +:1079E00017A928680AF0E1FE08B1072059E79DF8B9 +:1079F0005C0016A9CDF80090C01CCDE9019100F003 +:107A0000FF0B00230BF20122514613A806F090F859 +:107A1000F0BBBDF858000990FE482A8929690092F8 +:107A2000CDE901106B89BDF82C202868069906F075 +:107A30007FF801007ED120784FF0020AC10601D400 +:107A400080062BD5ADF80C90606950B907A906A83F +:107A5000FFF7ADF99DF81D0020F00700401C8DF8E0 +:107A60001D009DF81C008DF84E7040F0C8008DF888 +:107A70001C0042F60210ADF84C000CA903AACDF888 +:107A800000A0CDE90121002340F2032213A800E069 +:107A90001EE0079906F04CF801004BD1DD484D4639 +:107AA00008385B460089ADF839000EA8CDE9029090 +:107AB000CDF80490CDF810904FF007090022CDF8D2 +:107AC0000090BDF858104FF6FF7005F077FF10B129 +:107AD000FFF79DF8E5E69DF83800000625D5294614 +:107AE000012060F30F218DF84E704FF42450ADF853 +:107AF0004C00ADF8105062789DF81000002362F33E +:107B000000008DF810006278CDF800A0520862F3F2 +:107B100041008DF8100004AACDE9012540F20322AE +:107B200013A806F005F8010004D1606888B3206945 +:107B3000A8B900E086E005A906A8FFF738F9607843 +:107B4000800706D49DF8150020F038008DF8150048 +:107B500005E09DF8140040F040008DF814008DF809 +:107B60004E7042F60110ADF84C00208940F2012120 +:107B7000B0FBF1F201FB1202606814ABCDF800809B +:107B8000CDE90103002313A8059905F0D1FF0100F9 +:107B900058D12078C00729D0ADF80C50A06950B951 +:107BA00008A906A8FFF703F99DF8210020F00700B7 +:107BB000401C8DF821009DF820008DF84E7040F09B +:107BC00040008DF8200042F60310ADF84C0015A9D6 +:107BD00003AACDF800A0CDE90121002340F2032241 +:107BE00013A8089905F0A4FF01002BD1E06868B341 +:107BF0002946012060F30F218DF84E7042F60410E3 +:107C0000ADF84C00E068002302788DF860204078E1 +:107C10008DF86100E06818AA4088ADF86200E0685D +:107C200000798DF86400E068C088ADF86500CDF893 +:107C30000090CDE901254FF4027213A805F078FFFA +:107C4000010003D0099800F0B3FF2AE67148032130 +:107C50000838017156B100893080BDF8500070803D +:107C6000BDF83000B080BDF85400F080002018E668 +:107C700070B501258AB016460B46012802D00228AD +:107C800016D104E08DF80E504FF4205003E08DF82B +:107C90000E5042F60100ADF80C005BB10024601CF0 +:107CA00060F30F2404AA08A918460AF07EFD18B153 +:107CB00007204AE5102048E504A99DF820205548F2 +:107CC000CDE90021801E02900023214603A802F284 +:107CD000012205F02DFF10B1FEF799FF35E54D4863 +:107CE00008380EB1C1883180057100202DE5F0B54E +:107CF00093B0074601268DF83E6041F60100ADF8CD +:107D00003C0012AA0FA93046FFF7B2FF002848D165 +:107D1000404C0025083CE7B31C2102A81CF0BBFF27 +:107D20009DF808008DF83E6040F020008DF80800B6 +:107D300042F60520ADF83C000E959DF83A001195ED +:107D400020F00600801C8DF83A009DF838006A4645 +:107D500020F0FF008DF838009DF8390009A920F0C7 +:107D6000FF008DF839000420ADF82C00ADF830008C +:107D70000EA80A9011A80D900FA80990ADF82E50EA +:107D800002A8FFF76AFD00280BD1BDF80000608152 +:107D900000E008E0BDF80400A081401CE0812571EE +:107DA000002013B0F0BD6581A581BDF84800F4E75F +:107DB0002DE9F74F1749A0B00024083917940A7924 +:107DC000A146012A04D0022A02D0082023B02FE5C0 +:107DD000CA88824201D00620F8E721988A4682426A +:107DE00001D10720F2E701202146ADF848004FF607 +:107DF000FF7860F30F21ADF84A808DF86E0042F6EF +:107E0000020B06918DF87240ADF86CB0ADF8704081 +:107E10001CA901E0840200201391ADF8508012A843 +:107E200005F073FF00252E462F460DAB072212A941 +:107E3000404605F06DFF78B10A285DD195B38EB349 +:107E4000ADF86450ADF866609DF85E008DF81440A2 +:107E500019AC012864D06BE09DF83A001FB30128EB +:107E600059D1BDF8381059451FD118A809A9019456 +:107E70000294CDE9031007200090BDF836101023BE +:107E80000022404605F0C4FFB0BBBDF860000428E6 +:107E900001D006284AD1BDF82410219881423AD158 +:107EA0000F2093E73AE0012835D1BDF83800B0F54E +:107EB000205F03D042F6010188422CD1BAF80600B7 +:107EC000BDF83610884201D1012700E0002705B136 +:107ED0009EB1219881421ED118A809AA019402944A +:107EE000CDE90320072000900D46102300224046D4 +:107EF00005F08EFF00B902E02DE04E460BE0BDF824 +:107F00006000022801D0102810D1C0B217AA09A918 +:107F10000AF02CFC50B9BDF8369086E7052055E7ED +:107F200005A917A8221D0AF040FC08B103204DE75F +:107F30009DF814000023001DC2B28DF81420229871 +:107F40000092CDE901401BA8069905F0F1FD10B99A +:107F500002228AF80420FEF75AFE37E710B50B46D6 +:107F6000401E88B084B205AA00211846FEF7EEFE36 +:107F700000200DF1080C06AA05A901908CE8070065 +:107F8000072000900123002221464FF6FF7005F0E4 +:107F900015FD0446BDF81800012800D0FFDF20467B +:107FA000FEF735FE08B010BDF0B5FF4F044687B0B0 +:107FB00038790E46032804D0042802D0082007B0E0 +:107FC000F0BD04AA03A92046FEF799FE0500F6D1EC +:107FD00060688078C0F3410002280AD19DF80D0046 +:107FE00010F0380F05D020690CF02EFB08B11020DE +:107FF000E5E7208905AA21698DE807006389BDF8B6 +:1080000010202068039905F093FD10B1FEF7FFFDE5 +:10801000D5E716B1BDF81400308004203871284629 +:10802000CDE7F8B50C0006460BD001464FF6FF75BC +:1080300000236A46284605F06DFF20B1FEF7E7FDF4 +:10804000F8BD1020F8BD69462046FEF710FE002856 +:10805000F8D1A078314600F001032846009A05F0D7 +:1080600085FFEBE730B587B0144600220DF1080C10 +:1080700005AD01928CE82C00072200920A460146C9 +:1080800023884FF6FF7005F099FCBDF8141021808D +:10809000FEF7BDFD07B030BD70B50D46042108F0F8 +:1080A000E3FD040000D1FFDF294604F11400BDE820 +:1080B000704004F0A9BC70B50D46042108F0D4FD51 +:1080C000040000D1FFDF294604F11400BDE8704030 +:1080D00004F0BDBC70B50D46042108F0C5FD0400D8 +:1080E00000D1FFDF294604F11400BDE8704004F020 +:1080F000D5BC70B50546042108F0B6FD040000D1DA +:10810000FFDF214628462368BDE870400122FEF7C4 +:108110004BBF70B50646042108F0A6FD040000D14F +:10812000FFDF04F1140004F05FFC401D20F00305A4 +:1081300011E0011D00880022431821463046FEF759 +:1081400033FF00280BD0607CABB2684382B2A068DA +:10815000011D08F046FCA06841880029E9D170BDE6 +:1081600070B50546042108F07FFD040000D1FFDF53 +:10817000214628466368BDE870400222FEF714BF1E +:1081800070B50E46054601F049F9040000D1FFDF45 +:108190000120207266726580207820F00F00001D9B +:1081A00020F0F00040302070BDE8704001F039B997 +:1081B00010B50446012900D0FFDF2046BDE810407D +:1081C0000121FAF70FB92DE9F04F97B04FF0000AEF +:1081D0000C008346ADF814A0D04619D0E06830B149 +:1081E000A068A8B10188ADF81410A0F800A0584606 +:1081F000FBF731F9070043F2020961D038782228F1 +:108200005CD30421584608F02FFD050005D103E09A +:10821000102017B0BDE8F08FFFDF05F1140004F067 +:10822000E3FB401D20F00306A078012803D00228BC +:1082300001D00720EDE7218807AA584605F035FD53 +:1082400030BB07A805F03DFD10BB07A805F039FDC0 +:1082500048B99DF82600012805D1BDF82400A0F5F5 +:108260002451023902D04FF45050D2E7E068B0B147 +:10827000CDE902A00720009005AACDF804A0049241 +:10828000A2882188BDF81430584605F097FB10B13C +:10829000FEF7BDFCBDE7A168BDF8140008809DF89D +:1082A0001F00C00602D543F20140B2E70B9838B177 +:1082B000A1780078012905D080071AD40820A8E702 +:1082C0004846A6E7C007F9D002208DF83C00A86810 +:1082D0004FF00009A0B1697C4288714391420FD9E7 +:1082E0008AB2B3B2011D08F032FB8046A0F800A0AC +:1082F00006E003208DF83C00D5F800804FF001091E +:108300009DF8200010F0380F00D1FFDF9DF820000D +:108310002649C0F3C200084497F8231010F8010C56 +:10832000884201D90F2074E72088ADF8400014A9D5 +:108330000095CDE90191434607220FA95846FEF763 +:108340005DFE002891D19DF8500050B9A078012819 +:1083500007D1687CB3B2704382B2A868011D08F0EF +:108360000AFB002055E770B5064615460C46084640 +:10837000FEF70CFC002805D12A4621463046BDE810 +:10838000704075E470BD13E570B51E4614460D00CF +:108390000ED06CB1616859B160B10349C98881429E +:1083A00008D0072070BD00007C020020FA2F0000DA +:1083B0001020F7E72068FEF7E9FB0028F2D13246EB +:1083C00021462846BDE87040FFF747BA70B515460C +:1083D0000C0006D038B1FE490989814203D007203C +:1083E000E0E71020DEE72068FEF7D0FB0028D9D1B7 +:1083F00029462046BDE87040D6E570B5064686B0F1 +:108400000D46144610460CF001F9D0BB60680CF024 +:1084100024F9B0BBA6F57F40FF3803D03046FBF708 +:108420001AF880B128466946FEF7E3FC00280CD113 +:108430009DF810100F2008293CD2DFE801F0080653 +:108440000606060A0A0843F2020006B0AAE703205D +:10845000FBE79DF80210012908D1BDF80010B1F525 +:10846000C05FF2D06FF4C052D142EED09DF806103A +:1084700001290DD1BDF80410A1F52851062907D214 +:1084800000E028E0DFE801F0030304030303DCE776 +:108490009DF80A1001290ED1BDF80810B1F5245F2E +:1084A000D3D0A1F524510239CFD00129CDD0022952 +:1084B00001D1CAE7FFDF606878B9002305AA294621 +:1084C000304605F027FD10B1FEF7A1FBBDE79DF892 +:1084D0001400800601D41020B7E7618822462846A0 +:1084E0006368FFF7BFFDB0E72DE9F043814687B031 +:1084F0008846144610460CF089F818B1102007B0D1 +:10850000BDE8F083002306AA4146484605F002FD77 +:1085100018B100BFFEF77BFBF1E79DF81800C0061D +:1085200002D543F20140EAE70025072705A8019597 +:1085300000970295CDE9035062884FF6FF734146DC +:10854000484605F065FC060013D160680CF05EF843 +:1085500060B960680195CDE90250009704952388C1 +:1085600062884146484605F053FC0646BDF81400B3 +:1085700020803046CEE739B1954B0A889B899A42D4 +:1085800002D843F2030070471DE610B586B0904C48 +:108590000423ADF81430638943B1A4898C4201D21D +:1085A000914205D943F2030006B010BD0620FBE757 +:1085B000ADF81010002100910191ADF800300221BA +:1085C0008DF8021005A9029104A90391ADF81220BB +:1085D0006946FFF7F8FDE7E72DE9FC4781460E46BF +:1085E00008460BF0EDFF88BB4846FAF734FF5FEA18 +:1085F00000080AD098F80000222829D30421484610 +:1086000008F032FB070005D103E043F20200BDE8A9 +:10861000FC87FFDF07F1140004F0FDF90546307810 +:10862000012803D0022804D00720F0E7A8070FD5BF +:1086300002E015F01C0F0BD0B079341DC00709D033 +:10864000E08838B1A0680BF0BBFF18B11020DEE75E +:108650000820DCE732782088002628B3A0F2011336 +:108660000721112B18D20CD2DFE803F00B090D0BF8 +:108670001D0B121D100B0B1D1D1D1D0B1D00022AB5 +:1086800011D10846C3E7012AFBD00CE02A0700E01D +:10869000EA06002AF5DA06E0A0F5C0721F2A02D920 +:1086A0007D3A022AEDD8C6B200F0B8FE50B198F873 +:1086B0002300CDE90006FA89234639464846FEF7ED +:1086C000EAFCA4E71120A2E72DE9F04F8BB01F468A +:1086D00015460C4683460026FAF7BDFE28B1007801 +:1086E000222805D208200BB094E543F20200FAE7F5 +:1086F000B80801D00720F6E7032F00D100274FF676 +:10870000FF79CCB1022D73D320460BF0A6FF30B910 +:1087100004EB0508A8F101000BF09FFF08B1102041 +:10872000E1E7AD1EAAB22146484605F09DFC38F8A7 +:10873000021C88425CD1ADB22549B80702D58889B0 +:10874000401C00E001201FFA80F8F80701D08F8953 +:1087500000E04F4605AA4146584605F0A6FA4FF0FC +:10876000070A4FF00009ACB3204608E04088102803 +:108770003ED8361D304486B2AE4239D2A0190288A6 +:108780004245F3D354E000BF9DF8170002074FD5D0 +:1087900084B304EB0608361DB8F80230B6B2102BCD +:1087A00026D89A19AA4223D8B8F8002091421FD19E +:1087B000C00620D5CDE900A90DF1080C0AAAA1191F +:1087C00048468CE80700B8F800100022584603E03D +:1087D0007C0200202CE00BE005F0F0F810B1FEF771 +:1087E00016FA80E7B8F80200BDF82810884202D0D7 +:1087F0000B2078E704E0B8F80200304486B206E0C7 +:10880000C00604D55846FEF778FC002888D19DF8AC +:108810001700BDF81A1020F010008DF81700BDF8F1 +:108820001700ADF80000FF235846009A05F09EFBA4 +:1088300005A805F046FA18B9BDF81A10B942A3D92F +:108840000421584608F010FA040000D1FFDFA28985 +:108850005AB1CDE900A94D46002321465846FEF7FE +:108860001AFC0028BDD1A5813DE700203BE72DE99A +:10887000FF4F8BB01E4617000D464FF0000412D07C +:10888000B00802D007200FB0C4E4032E00D10026A8 +:108890005DB108460BF0D8FE28B93888691E084437 +:1088A0000BF0D2FE08B11020EDE7C74AB00701D5A2 +:1088B000D18900E00121F0074FF6FF7802D0D0897E +:1088C000401E00E0404686B206AA0B9805F0EDF97E +:1088D0004FF000094FF0070B0DF1140A39E000BF0B +:1088E0009DF81B00000734D5CDF80490CDF800B0FA +:1088F000CDF80890CDE9039A434600220B9805F085 +:1089000087FA60BB05B3BDF814103A8821442819D2 +:10891000091D8A4230D3BDF81E2020F8022BBDF875 +:10892000142020F8022BCDE900B9CDE90290CDF852 +:1089300010A0BDF81E10BDF8143000220B9805F0F1 +:1089400067FA08B103209EE7BDF814002044001D1B +:1089500084B206A805F0B5F920B10A2806D0FEF7C2 +:1089600056F990E7BDF81E10B142B9D934B17DB1C6 +:108970003888A11C884203D20C2084E7052082E7B6 +:1089800022462946404605F06FFB01462819018022 +:10899000A41C3C80002076E710B504460BF036FEA0 +:1089A00008B1102010BD8848C0892080002010BD6B +:1089B000F0B58BB00D460646142103A81CF06BF9E8 +:1089C00001208DF80C008DF8100000208DF81100AA +:1089D000ADF814503046FAF73EFD48B10078222831 +:1089E00012D30421304608F03FF9040005D103E01A +:1089F00043F202000BB0F0BDFFDF04F114000746A4 +:108A000004F009F8800601D40820F3E7207C022155 +:108A100040F00100207409A80094CDE9011007225C +:108A200003A930466368FEF7E9FA20B1217C21F002 +:108A300001012174DEE729463046F9F7C4FC08A994 +:108A4000384603F0D7FF00B1FFDFBDF82040172CF8 +:108A500001D2172000E02046A84201D92C4602E0AE +:108A6000172C00D2172421463046FFF724FB21465D +:108A70003046F9F7CEF90020BCE7F8B51C4615469C +:108A80000E46069F08F022FA2346FF1DBCB231466F +:108A90002A46009407F00DFEF8BD70B50C46054659 +:108AA0000E2120461CF0D5F8002020802DB1012D8C +:108AB00001D0FFDF76E4062000E00520A07171E41C +:108AC00010B548800878134620F00F00001D20F0F4 +:108AD000F00080300C4608701422194604F108009A +:108AE0001CF07DF800F09DFC3748046010BD2DE9B6 +:108AF000F047DFF8D890491D064621F003011746DC +:108B00000C46D9F8000007F0EAFE050000D1FFDFAF +:108B10004FF000083560A5F800802146D9F8000024 +:108B200007F0DDFE050000D1FFDF7560A5F80080CD +:108B30007FB104FB07F1091D0BD0D9F8000007F045 +:108B4000CEFE040000D1FFDFB460C4F80080BDE8B1 +:108B5000F087C6F80880FAE72DE9F0411746491D6D +:108B600021F00302194D064601681446286807F0F3 +:108B7000E1FE22467168286807F0DCFE3FB104FB85 +:108B800007F2121D03D0B168286807F0D3FE042055 +:108B900008F012F80446042008F016F8201A0128FC +:108BA00004D12868BDE8F04107F08EBEBDE8F08131 +:108BB00010B50C4605F045F800B1FFDF2046BDE8D2 +:108BC0001040FEF724B800007C02002014000020B2 +:108BD00038B50C468288817B19B14189914200D910 +:108BE0000A462280C188121D90B26A4607F06DF9CC +:108BF000BDF80000032800D30320C1B2208800F094 +:108C0000A3FF38BD38B50C468288817B19B1018934 +:108C1000914200D90A462280C188121D90B26A464C +:108C200007F053F9BDF80000022800D30220C1B2BA +:108C3000208800F089FF401CC0B238BD2DE9FE4FEE +:108C40000C46FD4981464022D1E90201CDE90101EE +:108C500009F1030020F00301C91C21F00301009178 +:108C60006846114607F01DFEF44E002C02D1F44A6E +:108C700000999160009901440091357F05F101054B +:108C800004D1E8B209F018FD00B1FFDF009800EB55 +:108C90000510C01C20F0030100915CB9707AB27A13 +:108CA0001044C2B200200870308C80B204F051FE33 +:108CB00000B1FFDF0098316A084400902146684601 +:108CC00000F00DFF0098C01C20F003000090B37A64 +:108CD000F27A717A04B1002007F0D9FE00990844B5 +:108CE00000902146684600F03AFF00273D46B24614 +:108CF00096F801800CE0284600F0D4FE0646817804 +:108D00008088F9F71DF971786D1C00FB0177EDB2D1 +:108D10004545F0D10098C01C20F00300009004B13C +:108D200000203946F9F717F9009900270844009008 +:108D30003D469AF801800CE0284600F0B3FE064656 +:108D4000C1788088FEF763FC71786D1C00FB0177A9 +:108D5000EDB24545F0D10098C01C20F00300009012 +:108D600004B100203946FEF75BFC00994FF0000883 +:108D70000844009045469AF801700EE0284600F03D +:108D800091FE0646807B30B106F1080001F0DDFE61 +:108D9000727800FB02886D1CEDB2BD42EED10098E6 +:108DA000C01C20F00300009004B10020414601F0F7 +:108DB000D0FE0099084400902146684600F049FE24 +:108DC0000098C01D20F0070200922CBB9D49002096 +:108DD000FAF743F8FBF713FB984801AA002110307B +:108DE000F8F7CAFA00B1FFDF9AF81D00FEF77FFF1F +:108DF00000B1FFDF91484FF4F67144301BF04BFF98 +:108E00008E480421443080F8E91180F8EA110621E7 +:108E100080F8EB11032101710099A1EB0900BDE875 +:108E2000FE8F70B5854C06464434207804EB40151F +:108E3000E078083590B9A01990F8E80100280ED024 +:108E4000A0780F2800D3FFDF202128461BF023FF46 +:108E5000687866F3020068700120E070284670BDF3 +:108E60002DE9F04105460C46002700780521904683 +:108E70003E46B1EB101F00D0FFDF287A50B1012829 +:108E80000ED0FFDFA8F800600CB1278066800020BC +:108E9000BDE8F0810127092674B16888A08008E048 +:108EA0000227142644B16888A0802869E060A88A57 +:108EB0002082287B2072E5E7A8F80060E7E710B57C +:108EC0005F4C6068C11D21F00701814200D0FFDFC7 +:108ED0005A4801210022017042700172417203233D +:108EE0008372C17202730274052202831F224283BD +:108EF000417455A242610A22027741774FF4B06172 +:108F000001626168416010BD30B54D4C1568636801 +:108F100010339D4202D20420136030BD474B5D7870 +:108F20005A6802EB0512107051700320D080172090 +:108F300090800120D0709070002090735878401C71 +:108F40005870606810306060002030BD70B5064613 +:108F50003A480024457807E0204600F0A3FD017858 +:108F6000B14204D0641CE4B2AC42F5D1002070BD23 +:108F7000F7B5074608780C4610B3FFF7E7FF05463C +:108F8000A7F12006202F06D0052E19D2DFE806F023 +:108F90000F2B2B151A0000F090FD0DB1697800E041 +:108FA0000021401AA17880B20844FF2808D8A07890 +:108FB00030B1A088022824D202E06088172820D28D +:108FC0000720FEBD207AE0B161881729F8D3A18877 +:108FD0001729F5D3A1790029F2D0E1790029EFD042 +:108FE000402804D9ECE7242F0BD1207A48B16188BE +:108FF0004FF6FB70814202D8A188814201D904203A +:10900000FEBD65B9207802AA0121FFF77DFF002887 +:10901000F6D12078FFF79AFF050000D1FFDF052E7B +:1090200025D2DFE806F003181B151E00A078687033 +:10903000A088E8801CE00000545002009803002043 +:109040001C000020000000206E5246357800000011 +:109050006088A8800CE0A078A87009E0A078E8708B +:1090600006E054F8020FA8606068E86000E0FFDFE7 +:109070000020FEBD1A2835D00DDC132832D2DFE8DF +:1090800000F01B31203131272723252D31312931A3 +:109090003131312F0F00302802D003DC1E2821D1BE +:1090A000072070473A3809281CD2DFE800F0151B6A +:1090B0000F1B1B1B1B1B07000020704743F2040003 +:1090C000704743F202007047042070470D2070473C +:1090D0000F207047082070471120704713207047F9 +:1090E000062070470320704710B5007800F001009B +:1090F00006F0E2FEBDE81040BCE70EB5017801F0D5 +:1091000001018DF80010417801F001018DF8011086 +:109110000178C1F340018DF802104178C1F340019C +:109120008DF80310017889088DF8041041788908BA +:109130008DF8051081788DF80610C1788DF807102C +:1091400000798DF80800684605F0DDFAFFF792FF18 +:109150000EBD2DE9F84FDFF8F883FE4C00261FE026 +:10916000012000F03FFD0120FFF75BFE0546402196 +:109170004746D8F8080007F0B2FB686000B9FFDF87 +:10918000686805F06EF8A8B12846FAF758FC28463A +:1091900000F02EFD20B940226968B86807F0CAFBCC +:1091A00094F9E9010428DBDA022007F005FD0746FF +:1091B0000025A6E040226968D8F8080007F0BAFB4D +:1091C000F2E7B8F802104046491C89B2A8F802102C +:1091D000B94201D3002141800221B8F8020007F012 +:1091E00043FD002865D0B8F80200694606F0CBFDC3 +:1091F000FFF740FF00B1FFDF9DF8000078B1B8F83D +:10920000020007F075FE5FEA000900D1FFDF484663 +:1092100007F0E3F818B1B8F8020002F03DF9B8F829 +:10922000020007F053FE5FEA000900D1FFDF484665 +:1092300007F0CBF8E8BB0321B8F8020007F014FDF3 +:109240005FEA000B48D1FFDF46E000BFDBF810000B +:1092500010B10078FF2849D0022000F0C3FC0220A2 +:10926000FFF7DFFD8246484607F0BBF9CAF8040065 +:1092700000B9FFDFDAF8040007F083FA002100905C +:109280000170B8F802105046AAF8021001F00AFE68 +:10929000484607F078FA00B9FFDF504600F0A8FC16 +:1092A00018B99AF80100000704D50099CBF81010FE +:1092B00012E024E0DBF8100038B10178491C11F00D +:1092C000FF01017008D1FFDF06E000221146484689 +:1092D00000F0BDFB00B9FFDF94F9EA01022805DBCD +:1092E000B8F8020001F0A3FD0028AFD194F9E9011C +:1092F000042804DB484607F0AAFA00B101266D1CD9 +:10930000EDB2BD4204D294F9EA010228BFF659AF8A +:10931000002E7FF423AFBDE8F84F032000F062BCBD +:1093200010B58B4CE06008682061AFF2D91002F0F4 +:1093300042FD607010BD87480021443801708448A8 +:10934000017085494160704770B505464FF0805007 +:109350000C46D0F8A410491C05D1D0F8A810C94378 +:109360000904090C0BD050F8A01F01F0010129706D +:10937000416821608068A080287830B970BD0621DE +:1093800020460AF0F8FD01202870607940F0C00006 +:10939000607170BD70B54FF080540D46D4F88010E8 +:1093A000491C0BD1D4F88410491C07D1D4F888107B +:1093B000491C03D1D4F88C10491C0CD0D4F880106F +:1093C0000160D4F884104160D4F888108160D4F82A +:1093D0008C10C16002E010210AF0CDFDD4F890009D +:1093E000401C0BD1D4F89400401C07D1D4F898004D +:1093F000401C03D1D4F89C00401C09D054F8900FB5 +:10940000286060686860A068A860E068E86070BD77 +:109410002846BDE8704010210AF0ADBD4D480079E6 +:10942000FFE470B54B4CE07830B3207804EB40108B +:10943000407A00F00700204490F9E801002800DCA1 +:10944000FFDF2078002504EB4010407A00F0070091 +:10945000011991F8E801401E81F8E8012078401CCC +:10946000C0B220700F2800D12570A078401CA070D9 +:109470000AF0E4FCE57070BDFFDF70BD3EB5054647 +:10948000032107F0F1FB0446284607F01FFD0546BF +:1094900004B9FFDF206918B10078FF2800D1FFDF91 +:1094A00001AA6946284600F0D2FA60B9FFDF0AE057 +:1094B000002202A9284600F0CAFA00B9FFDF9DF891 +:1094C000080000B1FFDF9DF80000411E8DF800107C +:1094D000EED220690199884201D1002020613EBD71 +:1094E00070B50546A0F57F400C46FF3800D1FFDF80 +:1094F000012C01D0FFDF70BDFFF790FF040000D109 +:10950000FFDF207820F00F00401D20F0F0005030E9 +:10951000207065800020207201202073BDE870401B +:109520007FE72DE9F04116460D460746FFF776FF27 +:10953000040000D1FFDF207820F00F00401D20F054 +:10954000F00050302070678001202072286805E00C +:109550001C000020DC030020C81400202061A88823 +:10956000A0822673BDE8F0415BE77FB5FFF7EEFC14 +:10957000040000D1FFDF02A92046FFF729FB0546C2 +:1095800003A92046FFF73EFB8DF800508DF801003F +:10959000BDF80800001DADF80200BDF80C00001D6C +:1095A000ADF80400E088ADF80600684606F066FCF9 +:1095B000002800D0FFDF7FBD2DE9F047DFF8FC93E6 +:1095C0000546002799F8000010B10820BDE8F08793 +:1095D00028460BF01BF808B11020F7E7F84C20786C +:1095E00008B9FFF76CFCA07A617A0844C6B200F0B3 +:1095F00064FAB04207D2301AC1B22A460020FFF7FF +:1096000083FC0700E2D1D9F804004E46C01C20F0CC +:109610000300C9F8040000F040FB716800EB01088A +:1096200001214046FFF70AFB06462968404488426C +:1096300002D8B6F5803F15D328600020FFF786FCDE +:1096400005000DD005F11300D9F8041020F0030037 +:109650004E46884200D0FFDF6078401E6070756023 +:109660000420B3E700214046FFF7E8FA0446A6428B +:1096700000D0FFDF04EB0801C9F8041029604FF6A1 +:10968000FF71A9F80210012189F8001038469DE702 +:109690002DE9F0410446C94817460E46007810B13E +:1096A0000820BDE8F08108460AF08AFF08B11020C2 +:1096B000F7E7C34D287808B9FFF701FC601E1E28A4 +:1096C00007D8012C22D13078FE281FD82877002017 +:1096D000E7E7A4F120001F2805D8E0B23A4631465A +:1096E000BDE8F04144E4A4F140001F2805D831460C +:1096F0002046BDE8F04100F0A3BAA4F1A0001F2865 +:1097000004D80020A02C03D0A12C06D00720C8E745 +:10971000317801F001016977C3E731680922F8293E +:1097200001D38B0701D01046BBE76B7C03F003032A +:10973000012B04D16B8BD7339CB28C42F3D82962B6 +:10974000AFE72DE9F04781460E4608460AF05EFF76 +:1097500048B948460AF078FF28B909F1030020F01B +:109760000301494501D0102030E795484FF0000A29 +:109770004430817869B14178804600EB4114083467 +:10978000378832460021204600F040FA050004D018 +:1097900027E0A6F800A0052018E7B9F1000F24D0B3 +:1097A0003088B84201D90C251FE0607800F0070529 +:1097B000284600F017FA08EB0507324697F8E8014B +:1097C0004946401C87F8E801204607F5F47700F089 +:1097D0001DFA05463878401E3870032000F002FA62 +:1097E0002DB10C2D01D0A6F800A02846EEE6607839 +:1097F000724E00F00701012923D002290CD0032961 +:1098000033D0FFDF98F801104046491CC9B288F8F0 +:1098100001100F2934D035E0616821B1000702D46E +:109820006088FFF72BFE98F8EA014746012802D12D +:10983000707802F0DFFA97F9EA010428E2DBFFDF33 +:10984000E0E7616819B14022B06807F073F898F852 +:10985000E9014746032802D1707802F0CBFA97F964 +:10986000E9010428CEDBFFDFCCE7C00602D5608823 +:10987000FFF704FE98F9EB010628C3DBFFDFC1E721 +:1098800080F801A08178491E8170617801F007019C +:1098900001EB080090F8E811491C80F8E811A4E7F2 +:1098A00070B50D4604460AF08BFE18B928460AF03A +:1098B000ADFE08B1102070BD29462046BDE87040BD +:1098C00008F031BF70B5044615460E4608460AF04A +:1098D00077FE18B928460AF099FE08B1102070BD2D +:1098E000022C03D0102C01D0092070BD2A4631462D +:1098F000204608F03BFF0028F7D0052070BD70B56A +:1099000014460D4606460AF05BFE38B928460AF0B2 +:109910007DFE18B920460AF097FE08B1102070BDF0 +:1099200022462946304608F040FF0028F7D007209D +:1099300070BD3EB504460AF069FE08B110203EBD78 +:10994000684604F03FFEFFF795FB0028F7D19DF82D +:1099500006002070BDF808006080BDF80A00A080F5 +:1099600000203EBD70B505460C4608460AF06CFE68 +:1099700020B93CB120680AF049FE08B1102070BD42 +:10998000A08828B121462846BDE87040FDF7BEBE3C +:10999000092070BD70B504460D4608460AF010FE59 +:1099A00030B9601E1E2818D828460AF009FE08B1F2 +:1099B000102070BD022C05D9072070BD1C000020AE +:1099C0009803002004B9FFDFF94800EB840050F849 +:1099D000041C2846BDE870400847A4F120001F2859 +:1099E00005D829462046BDE87040FAF790BCF02C17 +:1099F000E2D1A8680AF0E4FD0028D9D1284606F093 +:109A0000A6FABDE87040FFF735BB70B504460D46B9 +:109A100008460AF0FBFD30B9601E1E280DD8284606 +:109A20000AF0CEFD08B11020C7E7012C01D0022CAE +:109A300001D10620C1E70720BFE7A4F120001F28BD +:109A4000F9D829462046BDE87040FAF7B8BC06F0C0 +:109A50008BBC38B50446D748007B00F00105D9B966 +:109A6000F9F787FA0DB1226800E00022D248417868 +:109A7000C06804F09EFBD0481030C0788DF800001C +:109A800010B1012802D004E0012000E000208DF890 +:109A90000000684604F010FE002D02D02068283037 +:109AA000206038BD30B5C34D04466878A04200D868 +:109AB000FFDF686800EB041030BD70B5BD480025BD +:109AC0002C46467807E02046FFF7ECFF4078641C00 +:109AD0002844C5B2E4B2B442F5D128466DE72DE979 +:109AE000F0410C46064600F006F907463068C01CF7 +:109AF00020F00302326014BBAE483B4608212430FC +:109B00000AF038FC002409E0082C10D2DFE804F049 +:109B1000060408080A040406A84804E0A84802E06D +:109B2000A84800E0A8480AF045FC054600E0FFDF31 +:109B3000A54200D0FFDF641CE4B2082CE4D33068F7 +:109B400000EB07103060ACE5021D5143452900D2FF +:109B500045210844C01CB0FBF2F0C0B270472DE9AB +:109B6000FC5F064693484FF000088B464746444644 +:109B700090F8019022E02046FFF794FF050000D105 +:109B8000FFDF687869463844C7B22846FFF720F8F7 +:109B9000824601A92846FFF735F80346BDF80400C0 +:109BA0005246001D81B2BDF80000001D80B207F0D2 +:109BB000D9F86A78641C00FB0288E4B24C45DAD11B +:109BC0003068C01C20F003003060BBF1000F00D0F3 +:109BD00000204246394607F0D3F831680844306027 +:109BE000BDE8FC9F7349443108710020C87070477C +:109BF00070494431CA782AB10A7801EB4211083120 +:109C0000814201D001207047002070472DE9F041CA +:109C100006460078154600F00F0400201080601EF4 +:109C20000F46052800D3FFDF61482A46103000EBBD +:109C30008400394650F8043C3046BDE8F0411847EE +:109C400070B50C46402802D0412806D120E0A0780B +:109C500061780D18E178814201D90720ADE62078BE +:109C6000012801D91320A8E6FF2D08D808F008FF25 +:109C700006460AF09CF8301A801EA84201DA12202B +:109C80009BE64C482168816021790173002094E6AD +:109C9000BDE87040084600F05EB82DE9F0470027A7 +:109CA000DFF810A13E463D46B9463C469AF8018091 +:109CB0000AE02046FFF7F6FE4178807B0E4410FB59 +:109CC0000155641CE4B27F1C4445F2D109EB8700C6 +:109CD000C6EBC60100EB81009AF8092000EB850174 +:109CE00001EBC2019AF80A209AF80B0001EBC201BD +:109CF00001EB80006AE42DE9F047DFF8B890002618 +:109D0000344699F8090099F80A2099F8017002443C +:109D1000D5B299F80B20104400F0FF0808E0204667 +:109D2000FFF7C0FE817B407811FB0066641CE4B243 +:109D3000BC42F4D199F8090099F80A102844284443 +:109D40004044401C01B1012108448419FF2C00D972 +:109D5000FFDFE0B23AE438B50446407800F0030093 +:109D6000012803D002280BD0072038BD606858B105 +:109D70000AF073FCD0B960680AF066FC20B915E0FF +:109D800060680AF01DFC88B969462046FCF71EF998 +:109D90000028EAD1607800F00300022816D19DF86F +:109DA000000098B160680AF04FFC78B1102038BD0F +:109DB00054500200980300201C000020BD41000008 +:109DC0001FAC00005D2F0000AB2401006189F82961 +:109DD0000DD8208988420AD8607800F003020A482A +:109DE000012A06D1D731026A89B28A4201D20920FA +:109DF000DDE794E80E0000F1100585E80E000AB9D1 +:109E0000002101830020D2E7980300202DE9F041D2 +:109E1000074614468846084601F01CFD064608EB36 +:109E200088001C22796802EBC0000D18688C58B1BC +:109E30004146384601F016FD014678680078C200B8 +:109E4000082305F120000CE0E88CA8B14146384613 +:109E500001F00FFD0146786808234078C20005F143 +:109E6000240006F0BEFD38B1062121726681D0E9DA +:109E70000010C4E9031009E0287809280BD0052058 +:109E8000207266816868E060002028702046BDE886 +:109E9000F04101F0D5BC072020726681F4E72DE97E +:109EA000F04116460D460746406801EB85011C222D +:109EB00002EBC1014418204601F0FDFC40B1002135 +:109EC000708865F30F2160F31F4107200AF02CFB17 +:109ED00009202070324629463846BDE8F04195E712 +:109EE0002DE9F0410E46074600241C21F07816E0CB +:109EF00004EB8403726801EBC303D25C6AB1FFF721 +:109F00008DFA050000D1FFDF6F802A4621463046DA +:109F1000FFF7C5FF0120BDE8F081641CE4B2A04258 +:109F2000E6D80020F7E770B5064600241C21C0786B +:109F30000AE000BF04EB8403726801EBC303D51889 +:109F40002A782AB1641CE4B2A042F3D8402070BD44 +:109F5000282128461AF07DFE7068808928812046D5 +:109F600070BD70B5034600201C25DC780DE000BFF5 +:109F700000EB80065A6805EBC6063244167816B127 +:109F8000128A8A4204D0401CC0B28442F0D84020D9 +:109F900070BDF0B5044600201C26E5780EE000BF39 +:109FA00000EB8007636806EBC7073B441F788F42CE +:109FB00002D15B78934204D0401CC0B28542EFD8F6 +:109FC0004020F0BD0078032801D000207047012018 +:109FD00070470078022801D00020704701207047A8 +:109FE0000078072801D000207047012070472DE934 +:109FF000F041064688461078F1781546884200D32D +:10A00000FFDF2C781C27641CF078E4B2A04201D852 +:10A01000201AC4B204EB8401706807EBC101084444 +:10A02000017821B14146884708B12C7073E7287840 +:10A03000A042E8D1402028706DE770B514460B8827 +:10A040000122A240134207D113430B8001230A22AD +:10A05000011D06F090FC047070BD2DE9FF4F81B02A +:10A060000878DDE90E7B9A4691460E4640072CD4CF +:10A07000019806F03DFF040000D1FFDF07F104085E +:10A0800020461FFA88F106F07CF8050000D1FFDFBA +:10A09000204629466A4606F0C6FA0098A0F80370E2 +:10A0A000A0F805A0284606F06CFB017869F30601CC +:10A0B0006BF3C711017020461FFA88F106F0A4F86F +:10A0C00000B9FFDF019803F0E9FF06EB0900017F0B +:10A0D000491C017705B0BDE8F08F2DE9F84F0E4619 +:10A0E0009A4691460746032106F0BEFD0446008DC0 +:10A0F000DFF8B485002518B198F80000B0421ED1F1 +:10A10000384606F0F5FE070000D1FFDF09F1040133 +:10A11000384689B206F035F8050010D03846294691 +:10A120006A4606F080FA009800210A460180817094 +:10A1300004F084F80098C01DCAF8000021E098F8E7 +:10A140000000B04216D104F1260734F8341F012074 +:10A1500000FA06F911EA090F00D0FFDF2088012379 +:10A1600040EA090020800A22391D384606F01EFC0C +:10A17000067006E0324604F1340104F12600FFF7D0 +:10A180005CFF0A2188F800102846BDE8F88FFEB56C +:10A1900014460D46064602AB0C220621FFF79DFF32 +:10A1A000002826D00299687812220A70801C487014 +:10A1B00008224A80A870208888806088C880A0888B +:10A1C0000881E088488100240C20CDE900040523A3 +:10A1D000062229463046FFF740FF2146002266F35B +:10A1E0001F41F02310460AF0F5F86878801C68706B +:10A1F0000120FEBDFEB514460D460622064602AB02 +:10A200001146FFF76AFF002812D0029B132000219D +:10A210001870A8785870022058809C800620CDE9DC +:10A2200000010246052329463046FFF716FF0120AC +:10A23000FEBD2DE9FE430C46804644E002AB0E22F3 +:10A2400007214046FFF749FF002841D060681C22E3 +:10A2500067788678BF1C06EB860102EBC1014518C2 +:10A2600002981421017047700A214180698A018196 +:10A27000E98A4181A9888180A9898181304601F0DC +:10A28000E9FA029905230722C8806F70042028701C +:10A2900000250E20CDE9000521464046FFF7DDFEF2 +:10A2A000294666F30F2168F31F41F023002207209F +:10A2B0000AF090F86078FD49801C60706268204662 +:10A2C000921CFFF794FE606880784028B6D1012088 +:10A2D000BDE8FE83FEB50D46064638E002AB0E2211 +:10A2E00007213046FFF7F9FE002835D068681C23A7 +:10A2F000C17801EB810203EBC20284180298152297 +:10A300000270627842700A224280A2894281A28849 +:10A310008281084601F09EFA014602988180618A96 +:10A32000C180E18A0181A088B8B10020207000219D +:10A330000E20CDE900010523072229463046FFF70C +:10A340008CFE6A68DA492846D21CFFF750FE68681E +:10A35000C0784028C2D10120FEBD0620E6E72DE9E5 +:10A36000FE430C46814644E0204601F08EFAD0B30D +:10A3700002AB082207214846FFF7AFFE0028A7D00E +:10A3800060681C2265780679AD1C06EB860102EB3D +:10A39000C10147180298B7F8108006210170457076 +:10A3A00004214180304601F055FA01460298052308 +:10A3B0000722C180A0F804807D7008203870002535 +:10A3C000CDE9000521464846FFF747FE294666F3DA +:10A3D0000F2169F31F41F0230022072009F0FAFF43 +:10A3E0006078801C60706268B2492046121DFFF7D9 +:10A3F000FEFD606801794029B6D1012068E72DE9AA +:10A40000F34F83B00E4680E0304601F03EFA00285C +:10A4100075D071681C2091F8068008EB880200EB6B +:10A42000C2000C184146304601F023FA0146A078DC +:10A43000C30070684078C20004F1240006F0EDFA11 +:10A4400007468088E18B401A80B2002581B3AA4676 +:10A45000218B814200D808468146024602AB072183 +:10A460000398FFF73AFE010028D0BAF1000F03D09D +:10A47000029AB888022510808B46E28B3968A9EBD6 +:10A4800005001FFA80FA0A440398009206F030FD96 +:10A49000ED1D009A59465346009506F03EF9E08BB3 +:10A4A000504480B2E083B988884209D1012508E090 +:10A4B000FFE7801C4FF0010A80B2C9E7002009E6DF +:10A4C0000025CDE90095238A072231460398FFF73E +:10A4D000C4FDE089401EE0818DB1A078401CA070D1 +:10A4E0007068F178427811FB02F1CAB281690123E8 +:10A4F0000E3006F040FA80F800800020E083726899 +:10A500006D493046921DFFF772FD706881794029D0 +:10A510007FF47AAF0120DDE570B5064648680D4648 +:10A5200014468179402910D104EB84011C2202EBEE +:10A53000C101084401F0E0F9002806D06868294606 +:10A5400084713046BDE8704059E770BDFEB50C46D9 +:10A550000746002645E0204601F097F9D8B3606829 +:10A560001C22417901EB810102EBC1014518688988 +:10A5700000B9FFDF02AB082207213846FFF7ADFD27 +:10A58000002833D00299607816220A70801C487027 +:10A59000042048806068407901F05CF90146029827 +:10A5A0000523072281806989C1800820CDE9000642 +:10A5B00021463846FFF751FD6078801C6070A889FD +:10A5C00069890844B0F5803F00D3FFDFA889698915 +:10A5D0000844A8816E81626838492046521DFFF701 +:10A5E00006FD606841794029B5D10120FEBD30B536 +:10A5F000438C458BC3F3C704002345B1838B641E92 +:10A60000ED1AC38A6D1E1D4495FBF3F3E4B22CB121 +:10A61000008918B1A04200D8204603444FF6FF70CD +:10A62000834200D3034613800C7030BD2DE9FC41FA +:10A63000074616460D46486802EB86011C2202EBCF +:10A64000C10144186A4601A92046FFF7D0FFA0893E +:10A65000618901448AB2BDF80010914212D0081AF3 +:10A6600000D5002060816868407940280AD12046E2 +:10A6700001F038F9002805D0686829464671384647 +:10A68000FFF764FFBDE8FC812DE9FE4F8946804657 +:10A6900015465088032106F0E7FA8346B8F8020011 +:10A6A00040280DD240200CE030000020C59F000063 +:10A6B000D39F0000E19F0000F9B80000E5B800005A +:10A6C000403880B282460146584601F0DEF8002844 +:10A6D0007ED00AEB8A001C22DBF8041002EBC000DB +:10A6E0000C18204601F0E7F8002877D1B8F80000F0 +:10A6F000E18A88423CD8A189D1B348456ED1002671 +:10A700005146584601F0AEF8218C0F18608B48B9BD +:10A71000B9F1020F62D3B8F804006083618A8842FD +:10A7200026D80226A9EB06001FFA80F9B888A28B6A +:10A73000801A002814DD4946814500DA084683B2B4 +:10A7400068886968029139680A44CDE9003206F0E8 +:10A75000BDFBDDE90121F61D009B009605F0A9FF78 +:10A76000A18B01EB090080B2A083618B884207D9DD +:10A77000688803B052465946BDE8F04F01F0D9B899 +:10A780001FD14FF009002872B8F802006881D7E99C +:10A790000001C5E90401608BA881284601F050F84A +:10A7A0005146584601F05EF80146DBF804000823E4 +:10A7B0000078C20004F1200006F013F90020A08305 +:10A7C0006083A0890AF0FF02401EA081688800E033 +:10A7D00004E003B05946BDE8F04F27E7BDE8FE8F1F +:10A7E0002DE9F041064615460F461C46184609F06D +:10A7F000E7FE18B9206809F009FF08B1102015E438 +:10A800007168688C0978B0EBC10F01D313200DE497 +:10A810003946304601F026F8014670680823007872 +:10A82000C20005F1200006F0A6F8D4E90012C0E944 +:10A8300000120020E3E710B50446032106F014FAE5 +:10A840000146007800F00300022805D02046BDE84C +:10A85000104001F114029AE48A8A2046BDE81040B3 +:10A86000C8E470B50446032106F0FEF9054601462A +:10A870002046FFF774FD002816D029462046FFF732 +:10A8800065FE002810D029462046FFF723FD00284A +:10A890000AD029462046FFF7CCFC002804D02946E0 +:10A8A0002046BDE87040AAE570BD2DE9F0410C4698 +:10A8B00080461EE0E178427811FB02F1CAB281695C +:10A8C00001230E3006F08DF8077860681C22C179EC +:10A8D000491EC17107EB8701606802EBC101461890 +:10A8E0003946204600F0D1FF18B1304600F0DCFFB9 +:10A8F00020B16068C1790029DCD180E7FEF78EFDC8 +:10A90000050000D1FFDF0A202872384600F0A2FFC0 +:10A9100068813946204600F0ACFF01466068082394 +:10A920004078C20006F1240006F05BF8D0E9001080 +:10A93000C5E90310A5F80280284600F081FFB07831 +:10A9400000B9FFDFB078401EB07058E770B50C4614 +:10A950000546032106F088F901464068C279224481 +:10A96000C2712846BDE870409FE72DE9FE4F824640 +:10A97000507814460F464FF0000800284FD00128A9 +:10A9800007D0022822D0FFDF2068B8606068F86036 +:10A9900024E702AB0E2208215046FFF79EFB002859 +:10A9A000F2D00298152105230170217841700A2107 +:10A9B0004180C0F80480C0F80880A0F80C8062884C +:10A9C00082810E20CDE90008082221E0A6783046D9 +:10A9D00000F040FF054606EB86012C22786802EB6A +:10A9E000C1010822465A02AB11465046FFF775FBDB +:10A9F0000028C9D0029807210170217841700421F4 +:10AA0000418008218580C680CDE9001805230A46CB +:10AA100039465046FFF721FB87F80880DEE6A67826 +:10AA2000022516B1022E13D0FFDF2A1D914602AB7C +:10AA300008215046FFF751FB0028A5D002980121BC +:10AA4000022E0170217841704580868002D005E099 +:10AA50000625EAE7A188C180E1880181CDE9009857 +:10AA60000523082239465046D4E710B50446032191 +:10AA700006F0FAF8014600F108022046BDE8104051 +:10AA800073E72DE9F05F0C4601281DD0957992F807 +:10AA90000480567905EB85011F2202EBC10121F0EC +:10AAA000030B08EB060111FB05F14FF6FF7202EAFA +:10AAB000C10909F1030115FB0611F94F21F0031A31 +:10AAC00040B101283DD124E06168E57891F800802B +:10AAD0004E78DFE75946786805F001FF606000B9FD +:10AAE000FFDF594660681AF0D6F8E570514678687D +:10AAF00005F0F5FE6168486100B9FFDF60684269F2 +:10AB000002EB09018161606880F80080606846702E +:10AB100017E0606852464169786805F00BFF5A46B5 +:10AB20006168786805F006FF032006F045F80446E2 +:10AB3000032006F049F8201A012802D1786805F0B0 +:10AB4000C3FE0BEB0A00BDE8F09F02460021022085 +:10AB500097E773B5D24D0A202870009848B10024B9 +:10AB60004FEA0D0005F09DFE002C01D100996960AF +:10AB70007CBD01240020F5E770B50C461546382150 +:10AB800020461AF088F8012666700A2104F11C009C +:10AB90001AF081F805B9FFDF297A207861F3010006 +:10ABA0002070A879002817D02A4621460020FFF7F8 +:10ABB00068FF6168402088706168C87061680871CA +:10ABC0006168487161688871616828880881616876 +:10ABD000688848816068868170BDC878002802D086 +:10ABE000002201204DE7704770B50546002165F34E +:10ABF0001F41002009F098FC0321284606F034F894 +:10AC0000040000D1FFDF21462846FFF769F900283C +:10AC100004D0207840F010002070012070BD2DE994 +:10AC2000FF4180460E460F0CFEF7F8FB050007D0EB +:10AC30006F800321384606F017F8040008D106E0BB +:10AC400004B03846BDE8F0411321F9F7F9BEFFDF43 +:10AC50005FEA080005D0B8F1070F18D0FFDFBDE8A4 +:10AC6000FF8120782A4620F0080020700020ADF8EF +:10AC7000020002208DF800004FF6FF70ADF80400CE +:10AC8000ADF8060069463846F9F7EDFAE7E7C6F38E +:10AC9000072101EB81021C23606803EBC202805C88 +:10ACA000042803D008280AD0FFDFD8E7012000904D +:10ACB0004FF440432A46204600F004FECFE704B09C +:10ACC0002A462046BDE8F041FFF7E9B82DE9F05FDC +:10ACD0000027B0F80A9090460C4605463E46B9F16A +:10ACE000400F01D2402001E0A9F140001FFA80FA94 +:10ACF000287AC01E08286BD2DFE800F00D04192066 +:10AD000058363C4772271026002C6CD0D5E9030139 +:10AD1000C4E902015CE070271226002C63D00A22ED +:10AD200005F10C0104F1080019F059FF50E07127FA +:10AD30000C26002C57D0E868A06049E07427102644 +:10AD40009CB3D5E90301C4E902016888032105F039 +:10AD50008BFF8346FEF762FB0246688850805146AF +:10AD60005846FFF753F833E075270A26ECB1A88957 +:10AD700020812DE076271426BCB105F10C0004F1EA +:10AD8000080307C883E8070022E07727102664B18C +:10AD9000D5E90301C4E902016888032105F064FFD5 +:10ADA00001466888FFF781FD12E01CE07327082642 +:10ADB000CCB16888032105F057FF01460078C00632 +:10ADC00006D56888FFF78CF810B96888F8F71BFE7D +:10ADD000A8F800602CB12780A4F8069066806888E7 +:10ADE000A0800020AFE6A8F80060FAE72DE9FC415A +:10ADF0000C461E4617468046032105F035FF0546E2 +:10AE00000A2C0AD2DFE804F0050505050505090945 +:10AE10000907042303E0062301E0FFDF0023CDE957 +:10AE20000076224629464046FFF717F92AE438B54E +:10AE30000546A0F57F40FF3830D0284606F046F89A +:10AE4000040000D1FFDF204605F0CBFB002815D021 +:10AE500001466A46204605F0E6FB00980321B0F85B +:10AE60000540284605F000FF0546052C03D0402C80 +:10AE700005D2402404E0007A80B1002038BD403C77 +:10AE8000A4B2214600F001FD40B1686804EB8401E2 +:10AE90003E2202EBC101405A0028EFD0012038BD0C +:10AEA000300000202DE9F04F044689B0408806F0BC +:10AEB0000DF8050000D1FFDF06AA2846616800F002 +:10AEC000BDFC069D001F81B235F8032F6B888A42B6 +:10AED00005D1042B0AD0052B1DD0062B15D02246F8 +:10AEE0002846FFF7D1FB09B0BDE8F08F16462D1DAF +:10AEF000224629463046F7F750FA0828F3D1224671 +:10AF000029463046FCF749FCEDE76088291D636857 +:10AF1000FAF7C8FCE7E717466088032105F0A4FEAE +:10AF20004FF000088DF804800646ADF80680042F27 +:10AF3000D9D36A79002AD6D028794FF6FF794FF015 +:10AF40001C0A13282CD008DC012878D0062847D00A +:10AF5000072875D0122874D106E0142872D015285D +:10AF600071D016286DD1ACE10C2F6AD1307800F089 +:10AF70000301022965D140F0080030706879B07093 +:10AF800001208DF804002889ADF808006889ADF823 +:10AF90000A00A889ADF80C00E889ADF80E0019E0A8 +:10AFA000B07890429FD1307801079CD5062F9AD176 +:10AFB00020F0080030706088414660F31F41002097 +:10AFC00009F0B2FA02208DF80400ADF80890288943 +:10AFD000ADF80A006088224601A9F9F744F982E732 +:10AFE000082F80D12F89B5F80A90402F01D2402038 +:10AFF00001E0A7F1400080B280460146304600F0F3 +:10B0000044FC08B3716808EB88002C2202EBC000F6 +:10B01000095A4945E3D1FE4807AAD0E90210CDE913 +:10B02000071068798DF81C0008F0FF058DF81E5098 +:10B0300060883146FFF799FC2246294639E0B6E0A0 +:10B0400014E03CE039E0E6E0F148D0E90010CDE959 +:10B0500007106879ADF820708DF81C00ADF82290CB +:10B06000608807AA3146FFF780FC3CE7082FB6D17D +:10B070006889B5F80880402801D2402000E04038B7 +:10B0800087B23946304600F000FC0028A7D007EB15 +:10B09000870271680AEBC2000844028A42459ED1C9 +:10B0A000017808299BD140786979884297D1F9B213 +:10B0B00022463046FEF7F3FE15E70E2F07D0CDF8F7 +:10B0C0001C80CDF8208068798DF81C00C8E769895C +:10B0D000EF898B46B5F80C903046FEF742FFABF196 +:10B0E0004001402901D309204AE0B9F1170F01D3EB +:10B0F000172F01D20B2043E040280ED000EB800236 +:10B1000071680AEBC20008440178012903D1407834 +:10B1100069798842A9D00A2032E03046FEF703FF61 +:10B12000014640282BD001EB810372680AEBC30073 +:10B1300002EB0008012288F800206A7988F80120D3 +:10B1400070682A894089B84200D938462D8A03237D +:10B150002372A282E7812082A4F80C9065820846BF +:10B1600000F078FB6081A8F81490A8F81870A8F88F +:10B170000E50A8F810B0204600F062FBB3E60420A1 +:10B1800005212172A4F80A80E08101212173A049E0 +:10B19000D1E90421CDE9072169798DF81C10ADF8BA +:10B1A0001E00608807AA3146FFF7DFFBE3E7062FA2 +:10B1B000E4D3B078904215D13078010712D520F051 +:10B1C000080030706088414660F31F41002009F09C +:10B1D000ABF902208DF804002889ADF80800ADF81D +:10B1E0000A90F7E604213046FEF7D3FE05464028D4 +:10B1F000C4D002208303009022462946304600F046 +:10B2000061FB4146608865F30F2160F31F41072011 +:10B2100009F08AF967E60E2FB0D104213046FEF717 +:10B22000B8FE81464028A9D04146608869F30F21C5 +:10B2300060F31F41072009F077F9288A0790E88911 +:10B2400000907068AF894089B84200D9384683467B +:10B25000B5F80A8028890590484600F0FBFA60811D +:10B26000079840B10220079B00902246494630468D +:10B2700000F028FB37E6B8F1170F1ED3172F1CD3A9 +:10B280000420207200986082E781A4F810B0A4F82E +:10B290000C8009EB890271680AEBC2000D18009955 +:10B2A0000598A5F81480A5F818B0E98128822046F1 +:10B2B00000F0C6FA0620287015E601200B23009046 +:10B2C000D3E7082FA6D129893046FEF74AFE074664 +:10B2D00040289FD007EB870271680AEBC200084440 +:10B2E000804600F0E8FA002894D16D89B8F80E0085 +:10B2F0002844B0F5803F05D360883A46314600F0D7 +:10B3000018FBF0E5002D85D0A8F80E0060883A46BD +:10B310003146FFF701F908202072384600F09AFA0A +:10B320006081A58127E770B50D460646032105F02B +:10B330009BFC040004D02078000704D5112070BDC8 +:10B3400043F2020070BD2A4621463046FEF71FFF39 +:10B3500018B9286860616868A061207840F008002A +:10B360002070002070BD70B50D460646032105F023 +:10B370007BFC040004D02078000704D4082070BDB2 +:10B3800043F2020070BD2A4621463046FEF732FFE6 +:10B3900000B9A582207820F008002070002070BD40 +:10B3A0002DE9F04F0E4691B08046032105F05CFC7C +:10B3B0000446404605F09CFD074600200790089093 +:10B3C0000990ADF830000A9002900390049004B9FF +:10B3D000FFDF0DF1080917BBFFDF20E038460BA99E +:10B3E000002204F0C1FF9DF82C0000F07F050A2D1B +:10B3F00000D3FFDF6019017F491E01779DF82C0003 +:10B4000000060CD52A460CA907A8FEF716FE01E097 +:10B410007C50020019F80510491C09F80510761E29 +:10B42000F6B2DBD204F13400FA4D04F1260BDFF85A +:10B43000E8A304F12A07069010E05846069900F0A8 +:10B440006AFA064628700A2800D3FFDF5AF8261049 +:10B4500040468847E08CC05DB04202D0208D002875 +:10B46000EBD10A202870EC4D4E4628350EE00CA991 +:10B4700007A800F050FA0446375D55F8240000B9DB +:10B48000FFDF55F82420394640469047BDF81E009E +:10B490000028ECD111B027E510B5032105F0E4FB3D +:10B4A000040000D1FFDF0A2104F11C0019F0F3FBB6 +:10B4B000207840F00400207010BD10B50C46032128 +:10B4C00005F0D2FB2044007F002800D0012010BDF1 +:10B4D0002DE9F84F894615468246032105F0C4FB45 +:10B4E000070004D0284609F06BF840B903E043F2A6 +:10B4F0000200BDE8F88F484609F088F808B110202E +:10B50000F7E7786828B169880089814201D9092064 +:10B51000EFE7B9F800001C2418B1402809D24020F8 +:10B5200008E03846FEF7FFFC8046402819D113207A +:10B53000DFE7403880B280460146384600F0A5F982 +:10B5400048B108EB8800796804EBC000085C01286A +:10B5500003D00820CDE70520CBE7FDF75FFF06000D +:10B560000BD008EB8800796804EBC0000C18B9F820 +:10B57000000020B1E88910B113E01120B9E7288854 +:10B58000172802D36888172801D20720B1E7686816 +:10B5900038B12B1D224641463846FFF721F90028D5 +:10B5A000A7D104F10C0269462046FFF720F828884D +:10B5B00060826888E082B9F8000030B10220207013 +:10B5C000E889A080E889A0B12BE003202070A88939 +:10B5D000A08078688178402905D180F802803946BA +:10B5E0005046FEF726FE404600F034F9A9F8000068 +:10B5F00021E07868218B4089884200D90846208361 +:10B60000A6F802A004203072B9F800007081E08929 +:10B610007082F181208B3082A08AB081304600F0A8 +:10B620000FF97868C178402905D180F80380394640 +:10B630005046FEF74FFE00205BE770B50D4606460C +:10B64000032105F011FB040003D0402D04D2402556 +:10B6500003E043F2020070BD403DADB2294600F068 +:10B6600014F958B105EB85011C22606802EBC10199 +:10B67000084400F020F918B1082070BD052070BD05 +:10B680002A462146304600F054F9002070BD2DE9CD +:10B69000F0410D4616468046032105F0E5FA0446C2 +:10B6A000402D01D2402500E0403DADB28CB129468D +:10B6B00000F0EBF880B105EB85011C22606802EB1D +:10B6C000C1014718384600F0F6F838B10820BDE847 +:10B6D000F08143F20200FAE70520F8E733463A46E4 +:10B6E00029462046FFF77CF80028F0D1EAB221462F +:10B6F0004046FEF79BFF0020E9E72DE9F0410D46AB +:10B7000016468046032105F0AFFA0446402D01D2CB +:10B71000402500E0403DAFB224B1304608F050FF74 +:10B7200038B902E043F20200D1E7306808F048FF80 +:10B7300008B11020CBE73946204600F0A6F860B1EA +:10B7400007EB87011C22606802EBC10145182846FF +:10B7500000F0B1F818B10820B9E70520B7E7B088C4 +:10B76000A98A884201D90C20B1E76168E88C497840 +:10B77000B0EBC10F01D31320A9E73946204600F0F2 +:10B7800078F80146606808234078C20005F124007B +:10B7900005F0F1F8D6E90012C0E90012FAB221462C +:10B7A0004046FEF7B9FE002091E72DE9F0470D462F +:10B7B0001F4690468146032105F056FA0446402D67 +:10B7C00001D2402001E0A5F1400086B23CB14DB16C +:10B7D000384608F039FF50B11020BDE8F08743F239 +:10B7E0000200FAE76068C8B1A0F80C8024E0314696 +:10B7F000204600F04AF888B106EB86011C226068FA +:10B8000002EBC1014518284600F055F840B1082068 +:10B81000E3E7000030000020945002000520DCE740 +:10B82000A5F80880F2B221464846FEF7FFFE1FB198 +:10B83000A8896989084438800020CEE704F0F3BE67 +:10B84000017821F00F01491C21F0F0011031017045 +:10B85000FDF7E7BD10B50446402800D9FFDF4034AE +:10B86000A0B210BD406842690078484302EBC000B6 +:10B870007047C2784068037812FB03F2437840694E +:10B8800001FB032100EBC1007047C2788A4209D94D +:10B89000406801EB81011C2202EBC101405C08B150 +:10B8A00001207047002070470078062801D9012048 +:10B8B0007047002070470078062801D001207047AB +:10B8C00000207047F0B401EB81061C27446807EBA9 +:10B8D000C6063444049D05262670E3802571F0BC1D +:10B8E000FEF794BA10B5418911B1FFF7DDFF08B139 +:10B8F000002010BD012010BD10B5C18C8278B1EBC5 +:10B90000C20F04D9C18911B1FFF7CEFF08B10020E1 +:10B9100010BD012010BD10B50C4601230A22011DE7 +:10B9200005F05FF800782188012282409143218050 +:10B9300010BDF0B402EB82051C264C6806EBC50571 +:10B94000072363554B681C79402C03D11A71F0BC56 +:10B95000FEF705BDF0BC704710B5EFF3108000F0A6 +:10B96000010472B6F7484178491C417040780128BB +:10B9700001D1F7F709FB002C00D162B610BD70B5FC +:10B98000F04CE07848B90125E570FFF7E5FFF7F7DF +:10B9900003FB20B1002008F058FA002070BD4FF0E2 +:10B9A00080406571C0F80453F7E770B5EFF310807D +:10B9B00000F0010572B6E34C607800B9FFDF6078F3 +:10B9C000401E6070607808B9F7F7E2FA002D00D1E8 +:10B9D00062B670BDDB4810B5C17821B1002141715C +:10B9E000C170FFF7E2FF002010BD10B50446F7F765 +:10B9F000D3FAD449C978084000D001202060002043 +:10BA000010BD2DE9F05FDFF83C934278817889F82A +:10BA10000620002589F80710064689F808500078A6 +:10BA20002F4620B101280FD002280FD0FFDFF7F7F3 +:10BA3000C0FA98B1F7F7C4FAA8420FD12846F7F731 +:10BA4000C3FA0028FAD047E00125F0E7FFF784FFAA +:10BA5000F7F7A2FA0028FBD00225E8E701208407C7 +:10BA6000E060C4F80471B8490D600107D1F84412D0 +:10BA7000B54AC1F3423124321160B3493431086010 +:10BA80004FF0020BC4F804B3A060DFF8C0A2DAF8EC +:10BA90000010C94341F3001101F10108DAF8001068 +:10BAA00041F01001CAF8001000E020BFD4F80401F2 +:10BAB0000028FAD02846F7F787FA0028FAD0B8F11C +:10BAC000000F05D1DAF8001021F01001CAF80010BB +:10BAD000C4F808B3C4F8047199F807004C4670B173 +:10BAE000307860B9F7F758FA064608F00BFB6FF0AC +:10BAF000004116B1C4E9031001E0C4E9030115B126 +:10BB00002771BDE8F09F01202071BDE8F05F00F0D3 +:10BB1000D9B870B5050000D1FFDF4FF080424FF07B +:10BB2000FF30C2F808030021C2F80011C2F8041166 +:10BB3000C2F80C11C2F81011824C6170F7F732FA9A +:10BB400010B10120E07060702846BDE8704058E7F1 +:10BB50002DE9FE4F7E4800687D4A7E49083211601B +:10BB60008C070290D4F8080108B1012600E00026F5 +:10BB7000D4F8240100B101208146D4F81C0100B1A1 +:10BB800001208346D4F8200100B101200190D4F8AF +:10BB9000000110B14FF0010801E04FF00008D4F8A7 +:10BBA000040108B1012700E00027D4F80C0100B11E +:10BBB00001200090D4F8100108B1012100E000211B +:10BBC0008A4646EA080127EA01000099884320EAEC +:10BBD0000A0020EA090030EA0B0000D0FFDF002550 +:10BBE00026B1C4F80851012008F02FF9B9F1000F6F +:10BBF00004D0C4F82451092008F027F9BBF1000F44 +:10BC000004D0C4F81C510A2008F01FF9019820B193 +:10BC1000C4F820510B2008F018F9DFF83C91494E88 +:10BC20004FF0010BB8F1000F11D0C4F8005170793A +:10BC300018B17571002008F008F9307838B1357006 +:10BC400086F802B00222C9F80020C4F810B00FB183 +:10BC5000C4F80451009858B1C4F80C51B07800B938 +:10BC6000FFDFC9F80050B570C4F814B0FFF79DFEAF +:10BC7000BAF1000F05D0C4F81051307908B100F0C6 +:10BC800045F833490298091D0860BDE8FE8F70B57C +:10BC90002C4DE87808B9F7F77BF901208407A061FB +:10BCA000A87850B1D4F80C0120B90020F7F78CF92E +:10BCB0000028F7D10020C4F80C014FF0FF30C4F881 +:10BCC000080370BD2DE9F0411926B407C4F80863D4 +:10BCD0000125A5610020C4F80001C4F80C01C4F8D6 +:10BCE0001001F7F759F9174F28B11B49BD70022011 +:10BCF0000860256100E03D70FFF72EFE1249B8791B +:10BD000020310860C4F80463BDE8F0812DE9F041FA +:10BD10000C4C4FF080470125E07940B3012803D057 +:10BD2000217A401E814224DAF7F736F9064608F0F8 +:10BD3000E9F9E179012902D9217A491C21726EB110 +:10BD400021690CE03C0000201805004010ED00E0E7 +:10BD50001005024001000001340C0040E168411A66 +:10BD6000022902DA11F1020F0EDC0EB1206100E0AF +:10BD7000E060FFF7F1FDF7F70FF938B10549022050 +:10BD800008603D61A57002E07D61BDE7257000207F +:10BD90002072B9E7340C00404FF0E0214FF0007002 +:10BDA000C1F88001C1F88002384B802283F800245A +:10BDB000C1F80001704700B502460420344903E091 +:10BDC00001EBC0031B792BB1401EC0B2F8D2FFDFDC +:10BDD000FF2000BD41F8302001EBC00100224A7174 +:10BDE0008A7101220A7100BD294A002102EBC000BC +:10BDF0000171704710B50446042800D3FFDF2448C2 +:10BE000000EBC4042079012800D0FFDF6079A1791C +:10BE1000401CC0B2814200D060714FF0E0214FF071 +:10BE20000070C1F8000210BD2DE9F0411948056805 +:10BE300018491948083108601448042690F800048D +:10BE4000134F4009154C042818D0FFDF16E0217865 +:10BE500007EBC1000279012A08D1427983799A421D +:10BE600004D04279827157F8310080472078401C15 +:10BE7000C0B22070042801D300202070761EF6B2D4 +:10BE8000E5D20448001D0560BDE8F08119E000E03E +:10BE9000C8050020100502400100000150000020EC +:10BEA000F8B51D46DDE906470E000AD005F020F87A +:10BEB0002346FF1DBCB231462A46009404F02DFCF7 +:10BEC000F8BDD0192246194618F044FE2046F8BDA8 +:10BED00070B50D460446102118F0BBFE25811720D1 +:10BEE0006081A07B40F00A00A07370BD4FF6FF7226 +:10BEF0000A800146022008F017BB7047008970478E +:10BF0000827BD30701D1920703D480890880002067 +:10BF1000704705207047827B920700D5818170476A +:10BF200001460020098841F6FE52114200D001204E +:10BF3000704700B50346807BC00701D0052000BDD7 +:10BF400059811846FFF7ECFFC00703D0987B40F0FB +:10BF500004009873987B40F001009873002000BDA6 +:10BF6000827B520700D509B140897047172070477E +:10BF7000827B61F3C302827370472DE9FC5F0E463A +:10BF8000044601789646012000FA01F14DF6FF5271 +:10BF900001EA020962684FF6FF7B1188594502D118 +:10BFA0000920BDE8FC9FB9F1000F05D041F6FE5510 +:10BFB000294201D00120F4E741EA090111801D0066 +:10BFC00014D04FF0000C85F800C02378052103221F +:10BFD00067464FF0020A0E2B74D2DFE803F0F8092F +:10BFE000252F47626974479092B3D0D70420D8E7D1 +:10BFF000616820898B7B9B077DD5172848D30B89E7 +:10C00000834245D38989172901D3814240D185F8DC +:10C0100000A0A5F801003280616888816068817B9A +:10C0200021F002018173C5E0042028702089A5F861 +:10C0300001006089A5F803003180BBE0208A3188C7 +:10C04000C01D1FFA80F8414522D3062028702089A0 +:10C05000A5F801006089A5F80300A089A5F80500EE +:10C060000721208ACDE9000163693EE0082B10D04A +:10C07000082028702089A5F801006089A5F8030030 +:10C0800031806A1D694604F10C0006F08EFB10B188 +:10C090005FE01020EDE730889DF800100844308004 +:10C0A00088E00A2028702089A5F80100328045E048 +:10C0B0000C2028702089A5F801006089A5F80300EC +:10C0C00031803BE083E02189338800EB41021FFA95 +:10C0D00082F843453DD3B8F1050F3AD30E222A70BA +:10C0E0000BEA4101CDE90010E36860882A467146F9 +:10C0F000FFF7D6FE00E04DE0A6F800805AE04020B1 +:10C10000287060893188C01C1FFA80F8414520D30F +:10C110002878714620F03F00123028702089A5F859 +:10C1200001006089CDE9000260882A46E368FFF7D4 +:10C13000B7FEA6F80080287840063BD461682089C5 +:10C14000888037E0A0893288401D1FFA80F8424578 +:10C1500001D204273EE0162028702089A5F80100AE +:10C160006089A5F80300A089CDE9000160882A460E +:10C1700071462369FFF794FEA6F80080DEE71820D9 +:10C180002870207A6870A6F800A013E061680A8819 +:10C19000920401D405271DE0C9882289914201D06B +:10C1A000062717E01E21297030806068018821F47D +:10C1B00000510180B9F1000F0CD061887823002272 +:10C1C000022008F007F961682078887007E0A6F877 +:10C1D00000C003276068018821EA09010180384610 +:10C1E000DFE62DE9FF4F85B01746129C0D001E4675 +:10C1F0001CD03078C10703D000F03F00192801D9C6 +:10C20000012100E000212046FFF7AAFEA8420DD33D +:10C210002088A0F57F41FF3908D03078410601D44D +:10C22000000605D5082009B0BDE8F08F0720FAE721 +:10C2300000208DF800008DF8010030786B1E00F0B2 +:10C240003F0C0121A81E4FF0050A4FF002094FF0E4 +:10C25000030B9AB2BCF1200F75D2DFE80CF08B1003 +:10C26000745E7468748C749C74B674BB74C974D531 +:10C2700074E2747474F274F074EF74EE748B052DC0 +:10C2800078D18DF80090A0788DF804007088ADF812 +:10C29000060030798DF80100707800F03F000C281E +:10C2A00029D00ADCA0F10200092863D2DFE800F0FF +:10C2B000126215621A621D622000122824D004DC6A +:10C2C0000E281BD01028DBD11BE016281FD0182801 +:10C2D000D6D11FE02078800701E0207840070028B1 +:10C2E00048DAEFE020780007F9E72078C006F6E7A3 +:10C2F00020788006F3E720784006F0E720780006F3 +:10C30000EDE72088C005EAE720884005E7E72088B8 +:10C310000005E4E72088C004E1E72078800729D5FC +:10C32000032D27D18DF800B0B6F8010082E0217806 +:10C3300049071FD5062D1DD381B27078012803D07F +:10C34000022817D102E0CAE0022000E010200422F7 +:10C350008DF8002072788DF80420801CB1FBF0F27B +:10C36000ADF8062092B242438A4203D10397ADF85A +:10C370000890A7E07AE02078000777D598B2820885 +:10C380008DF800A0ADF80420B0EB820F6ED10297BB +:10C39000ADF8061096E02178C90667D5022D65D361 +:10C3A00081B206208DF80000707802285ED300BFAD +:10C3B000B1FBF0F28DF80400ADF8062092B24243D2 +:10C3C0008A4253D1ADF808907BE0207880064DD5A5 +:10C3D000072003E0207840067FD508208DF8000074 +:10C3E000A088ADF80400ADF80620ADF8081068E0AC +:10C3F0002078000671D50920ADF804208DF80000E2 +:10C40000ADF8061002975DE02188C90565D5022DBB +:10C4100063D381B20A208DF80000707804285CD3C1 +:10C42000C6E72088400558D5012D56D10B208DF840 +:10C430000000A088ADF8040044E021E026E016E00A +:10C44000FFE72088000548D5052D46D30C208DF840 +:10C450000000A088ADF80400B6F803006D1FADF829 +:10C460000850ADF80600ADF80AA02AE035E02088B3 +:10C47000C00432D5012D30D10D208DF8000021E00F +:10C480002088800429D4B6F80100E080A07B000752 +:10C4900023D5032D21D3307800F03F001B2818D07E +:10C4A0000F208DF80000208840F40050A4F8000010 +:10C4B000B6F80100ADF80400ED1EADF80650ADF879 +:10C4C00008B0039769460598F5F7B2FC050008D057 +:10C4D00016E00E208DF80000EAE7072510E0082599 +:10C4E0000EE0307800F03F001B2809D01D2807D04F +:10C4F0000220059908F018F8208800F400502080E8 +:10C50000A07B400708D52046FFF70AFDC00703D1EE +:10C51000A07B20F00400A073284684E61FB5022803 +:10C5200006D101208DF8000088B26946F5F780FC3D +:10C530001FBD0000F8B51D46DDE906470E000AD014 +:10C5400004F0D6FC2346FF1DBCB231462A460094B7 +:10C5500004F0E3F8F8BDD0192246194618F0FAFAAB +:10C560002046F8BD2DE9FF4F8DB09B46DDE91B57F6 +:10C57000DDF87CA00C46082B05D0E06901F002F93B +:10C5800050B11020D2E02888092140F01000288006 +:10C590008AF80010022617E0E16901208871E2693B +:10C5A0004FF420519180E1698872E06942F60101FF +:10C5B0000181E069002181732888112140F0200069 +:10C5C00028808AF80010042638780A900A203870EB +:10C5D0004FF0020904F118004D460C9001F095FB54 +:10C5E000B04681E0BBF1100F0ED1022D0CD0A9EBAB +:10C5F0000800801C80B20221CDE9001005AB524634 +:10C600001E990D98FFF796FFBDF816101A988142F3 +:10C6100003D9F74800790F9004E003D10A9808B1D4 +:10C6200038702FE04FF00201CDE900190DF116032B +:10C6300052461E990D98FFF77DFF1D980088401BFC +:10C64000801B83B2C6F1FF00984200D203461E99B8 +:10C650000BA8D9B15FF00002DDF878C0CDE9032066 +:10C6600009EB060189B2CDE901C10F980090BDF830 +:10C67000161000220D9801F0CBFB387070B1C0B2DB +:10C68000832807D0BDF8160020833AE00AEB0901A1 +:10C690008A19E1E7022011B0BDE8F08FBDF82C0047 +:10C6A000811901F0FF08022D0DD09AF801204245B2 +:10C6B00006D1BDF82010814207D0B8F1FF0F04D099 +:10C6C0009AF801801FE08AF80180C9480068017863 +:10C6D000052902D1BDF81610818009EB08001FFA68 +:10C6E00080F905EB080085B2DDE90C1005AB0F9A67 +:10C6F00001F00EFB28B91D980088411B4145BFF68B +:10C7000071AF022D13D0BBF1100F0CD1A9EB0800B3 +:10C71000801C81B20220CDE9000105AB52461E9972 +:10C720000D98FFF707FF1D98058000203870002046 +:10C73000B1E72DE9F8439C46089E13460027B26BEB +:10C740009AB3491F8CB2F18FA1F57F45FF3D05D00B +:10C750005518AD882944891D8DB200E0002529199E +:10C76000B6F83C800831414520D82A44BCF8011075 +:10C7700022F8021BBCF8031022F8021B984622F88C +:10C78000024B914604F0A2FB4FF00C0C41464A4686 +:10C790002346CDF800C003F08CFFF587B16B002075 +:10C7A0002944A41D2144088003E001E0092700E09A +:10C7B00083273846BDE8F88310B50B88848F9C42E8 +:10C7C0000CD9846BE018048844B1848824F40044B4 +:10C7D000A41D23440B801060002010BD0A2010BD52 +:10C7E0002DE9F0478AB00025904689468246ADF88B +:10C7F000185007274BE0059806888088000446D427 +:10C80000A8F8006007A8019500970295CDE90350AC +:10C810004FF4007300223146504601F0F9FA04004B +:10C820003CD1BDF81800ADF8200005980488818837 +:10C83000B44216D10A0414D401950295039521F44B +:10C8400000410097049541F48043428821465046B8 +:10C8500001F0B4F804000BD10598818841F400413F +:10C86000818005AA08A94846FFF7A6FF0400DCD08E +:10C870000097059802950195039504950188BDF8E8 +:10C880001C300022504601F099F80A2C06D105AA66 +:10C8900006A94846FFF790FF0400ACD0ADF8185049 +:10C8A00004E00598818821F40041818005AA06A949 +:10C8B0004846FFF781FF0028F3D00A2C03D020461A +:10C8C0000AB0BDE8F0870020FAE710B50C46896B86 +:10C8D00086B051B10C218DF80010A18FADF8081071 +:10C8E000A16B01916946FAF734FC00204FF6FF7105 +:10C8F000A063E187A08706B010BD2DE9F0410D4689 +:10C900000746896B0020069E1446002911D0012B92 +:10C910000FD1324629463846FFF762FF002808D17A +:10C92000002C06D0324629463846BDE8F04100F0DA +:10C9300038BFBDE8F0812DE9FC411446DDE9087CF3 +:10C940000E46DDE90A15521DBCF800E092B296458C +:10C9500002D20720BDE8FC81ACF8002017222A7023 +:10C96000A5F80160A5F803300522CDE900423B4659 +:10C970002A46FFF7DFFD0020ECE770B50C461546B0 +:10C980004821204618F087F904F1080044F81C0FEC +:10C9900000204FF6FF71E06161842084A584172098 +:10C9A000E08494F82A0040F00A0084F82A0070BD60 +:10C9B0004FF6FF720A800146032007F0B5BD30B57F +:10C9C00085B00C460546FFF780FFA18E284629B1A9 +:10C9D00001218DF800106946FAF7BBFB0020E062E8 +:10C9E0002063606305B030BDB0F8400070470000C0 +:10C9F0005400002090F84620920703D44088088015 +:10CA00000020F3E70620F1E790F846209207EDD5E5 +:10CA1000A0F84410EAE70146002009880A0700D57B +:10CA2000012011F0F00F01D040F00200CA0501D53D +:10CA300040F004008A0501D540F008004A0501D500 +:10CA400040F010000905D1D540F02000CEE700B538 +:10CA5000034690F84600C00701D0062000BDA3F8A9 +:10CA600042101846FFF7D7FF10F03E0F05D093F89D +:10CA7000460040F0040083F8460013F8460F40F0EB +:10CA800001001870002000BD90F84620520700D524 +:10CA900011B1B0F84200A9E71720A7E710F8462F18 +:10CAA00061F3C3020270A1E72DE9FF4F9BB00E00B6 +:10CAB000DDE92B34DDE92978289D24D02878C107C9 +:10CAC00003D000F03F00192801D9012100E0002126 +:10CAD0002046FFF7D9FFB04215D32878410600F071 +:10CAE0003F010CD41E290CD0218811F47F6F0AD18C +:10CAF0003A8842B1A1F57F42FF3A04D001E0122901 +:10CB000001D1000602D504201FB0C5E5F9491D98E2 +:10CB10004FF0000A08718DF818A08DF83CA00FAAFC +:10CB20000A60ADF81CA0ADF850A02978994601F034 +:10CB30003F02701F5B1C04F1180C4FF0060E4FF003 +:10CB4000040BCDF858C01F2A7ED2DFE802F07D7DAD +:10CB5000107D267DAC7DF47DF37DF27DF17DF47D4D +:10CB6000F07D7D7DEF7DEE7D7D7D7D7DED0094F81A +:10CB70004610B5F80100890701D5032E02D08DF8C3 +:10CB800018B022E34FF40061ADF85010608003212B +:10CB90008DF83C10ADF84000D8E2052EEFD1B5F885 +:10CBA00001002083ADF81C00B5F80310618308B1C3 +:10CBB000884201D901207FE10020A07220814FF638 +:10CBC000FF702084169801F0A0F8052089F8000075 +:10CBD0000220029083460AAB1D9A16991B9801F019 +:10CBE00097F890BB9DF82E00012804D0022089F808 +:10CBF0000100102003E0012089F8010002200590C7 +:10CC0000002203A90BA805F0D0FDE8BB9DF80C009D +:10CC1000059981423DD13A88801CA2EB0B018142EB +:10CC200037DB02990220CDE900010DF12A034A46C3 +:10CC300041461B98FFF77EFC02980BF1020B801C0B +:10CC400080B217AA03A901E0A0E228E002900BA895 +:10CC500005F0ABFD02999DF80C00CDE9000117AB82 +:10CC60004A4641461B98FFF765FC9DF80C100AAB3D +:10CC70000BEB01001FFA80FB02981D9A084480B25A +:10CC8000029016991B9800E003E001F041F800289B +:10CC9000B6D0BBF1020F02D0A7F800B053E20A20D1 +:10CCA0008DF818004FE200210391072EFFF467AFC3 +:10CCB000B5F801002083ADF81C00B5F803206283AD +:10CCC00000283FF477AF90423FF674AF0120A07286 +:10CCD000B5F8050020810020A073E06900F052FD46 +:10CCE00078B9E16901208871E2694FF4205191809F +:10CCF000E1698872E06942F601010181E069002181 +:10CD00008173F01F20841E9860620720608416984B +:10CD100000F0FBFF072089F800000120049002903A +:10CD20000020ADF82A0028E01DE2A3E13AE1EAE0A4 +:10CD300016E2AEE086E049E00298012814D0E069EE +:10CD40008079012803D1BDF82800ADF80E000498C1 +:10CD500003ABCDE900B04A4641461B98FFF7EAFB1A +:10CD60000498001D80B20490BDF82A00ADF80C00B4 +:10CD7000ADF80E00059880B202900AAB1D9A169984 +:10CD80001B9800F0C5FF28B902983988001D05904E +:10CD90008142D1D20298012881D0E06980790128AE +:10CDA00005D0BDF82810A1F57F40FF3803D1BDF8AC +:10CDB0002800ADF80E00049803ABCDE900B04A4658 +:10CDC00041461B98FFF7B6FB0298BBE1072E02D045 +:10CDD000152E7FF4D4AEB5F801102183ADF81C10E8 +:10CDE000B5F80320628300293FF4E4AE91423FF698 +:10CDF000E1AE0121A1724FF0000BA4F808B084F855 +:10CE00000EB0052E07D0C0B2691DE26905F0AEFC78 +:10CE100000287FF444AF4FF6FF70208401A906AAD2 +:10CE200014A8CDF800B081E885032878214600F0E9 +:10CE30003F031D9A1B98FFF795FB8246208BADF8A8 +:10CE40001C0080E10120032EC3D14021ADF8501019 +:10CE5000B5F801102183ADF81C100AAAB8F1000F33 +:10CE600000D00023CDE9020304921D98CDF8048080 +:10CE7000009038880022401E83B21B9800F0C8FF43 +:10CE80008DF8180090BB0B2089F80000BDF8280031 +:10CE900037E04FF0010C052E9BD18020ADF85000FB +:10CEA000B5F801102183B5F803002084ADF81C10FB +:10CEB000B0F5007F03D907208DF8180085E140F414 +:10CEC0007C4222840CA8B8F1000F00D00023CDE9E9 +:10CED0000330CDE9018C1D9800903888401E83B244 +:10CEE0001B9800F095FF8DF8180028B18328A8D171 +:10CEF0000220BDE0540000200D2189F80010BDF88B +:10CF00003000401C1EE1032E04D248067FF537AEE8 +:10CF1000002017E1B5F80110ADF81C102878400684 +:10CF200002D58DF83CE002E007208DF83C004FF080 +:10CF300000080320CDE902081E9BCDF810801D9843 +:10CF40000193A6F1030B00901FFA8BF342461B9846 +:10CF500000F034FD8DF818008DF83C8029784906E2 +:10CF60000DD52088C00506D5208BBDF81C10884241 +:10CF700001D1C4F8248040468DF81880E2E083286F +:10CF800001D14FF0020A4FF48070ADF85000BDF8A7 +:10CF90001C002083A4F820B01E98606203206084E7 +:10CFA0001321CCE0052EFFF4EAADB5F80110ADF881 +:10CFB0001C10A28F62B3A2F57F43FE3B28D008224B +:10CFC0008DF83C204FF0000B0523CDE9023BDDF846 +:10CFD00078C0CDF810B01D9A80B2CDF804C040F4EE +:10CFE00000430092B5F803201B9800F0E7FC8DF891 +:10CFF0003CB04FF400718DF81800ADF85010832844 +:10D0000010D0F8B1A18FA1F57F40FE3807D0DCE049 +:10D010000B228DF83C204FF6FE72A287D2E7A4F8CF +:10D020003CB0D2E000942B4631461E9A1B98FFF785 +:10D0300080FB8DF8180008B183284BD1BDF81C0087 +:10D04000208355E700942B4631461E9A1B98FFF724 +:10D0500070FB8DF81800E8BBE18FA06B0844811DC0 +:10D060008DE882034388828801881B98FFF763FC60 +:10D07000824668E095F80180022E70D15FEA0800D0 +:10D0800002D0B8F1010F6AD109208DF83C0007A841 +:10D0900000908DF840804346002221461B98FFF700 +:10D0A0002CFC8DF842004FF0000B8DF843B050B9C6 +:10D0B000B8F1010F12D0B8F1000F04D1A18FA1F582 +:10D0C0007F40FF380AD0A08F40B18DF83CB04FF4BC +:10D0D000806000E037E0ADF850000DE00FA91B982C +:10D0E000FAF737F882468DF83CB04FF48060ADF81F +:10D0F0005000BAF1020F06D0FC480068C07928B190 +:10D100008DF8180027E0A4F8188044E0BAF1000F69 +:10D1100003D081208DF818003DE007A80090434619 +:10D12000012221461B98FFF7E8FB8DF818002146E5 +:10D130001B98FFF7CAFB9DF8180020B9192189F840 +:10D140000010012038809DF83C0020B10FA91B98E9 +:10D15000F9F7FFFF8246BAF1000F33D01BE018E069 +:10D160008DF818E031E02078000712D5012E10D19B +:10D170000A208DF83C00E088ADF8400003201B99A0 +:10D1800007F0D2F90820ADF85000C1E648067FF557 +:10D19000F6AC4FF0040A2088BDF8501008432080F8 +:10D1A000BDF8500080050BD5A18FA1F57F40FE385A +:10D1B00006D11E98E06228982063A6864FF0030AE5 +:10D1C0005046A1E49DF8180078B1012089F80000CC +:10D1D000297889F80110BDF81C10A9F802109DF8F3 +:10D1E000181089F80410052038802088BDF85010E8 +:10D1F00088432080E4E72DE9FF4F8846087895B002 +:10D20000012181404FF20900249C0140ADF820101B +:10D210002088DDF88890A0F57F424FF0000AFF3AA1 +:10D2200006D039B1000705D5012019B0BDE8F08F4F +:10D230000820FAE7239E4FF0000B0EA886F800B0F6 +:10D2400018995D460988ADF83410A8498DF81CB0CE +:10D25000179A0A718DF838B0086098F80000012814 +:10D260003BD0022809D003286FD1307820F03F004E +:10D270001D303070B8F80400E08098F800100320EA +:10D28000022904D1317821F03F011B31317094F82B +:10D290004610090759D505ABB9F1000F13D000218D +:10D2A00002AA82E80B000720CDE90009BDF834008E +:10D2B000B8F80410C01E83B20022159800F0A8FD33 +:10D2C0000028D1D101E0F11CEAE7B8F80400A6F883 +:10D2D0000100BDF81400C01C04E198F805108DF899 +:10D2E0001C1098F80400012806D04FF4007A022898 +:10D2F0002CD00328B8D16CE12188B8F8080011F4CB +:10D300000061ADF8201020D017281CD3B4F84010CD +:10D31000814218D3B4F84410172901D3814212D1A5 +:10D32000317821F03F01C91C3170A6F801000321BA +:10D33000ADF83410A4F8440094F8460020F0020040 +:10D3400084F8460065E105257EE177E1208808F153 +:10D35000080700F4FE60ADF8200010F0F00F1BD0BD +:10D3600010F0C00F03D03888228B9042EBD199B9CE +:10D37000B878C00710D0B9680720CDE902B1CDF860 +:10D3800004B00090CDF810B0FB88BA8839881598A1 +:10D3900000F014FB0028D6D12398BDF82010401CC3 +:10D3A00080294ED006DC10290DD020290BD0402931 +:10D3B00087D124E0B1F5807F6ED051457ED0B1F5A4 +:10D3C000806F97D1DEE0C80601D5082000E010206C +:10D3D00082460DA907AA0520CDE902218DF8380063 +:10D3E000ADF83CB0CDE9049608A93888CDE9000134 +:10D3F0005346072221461598FFF7B4F8A8E09DF898 +:10D400001C2001214FF00A0A002A9BD105ABB9F17B +:10D41000000F00D00020CDE902100720CDE900095F +:10D42000BDF834000493401E83B2218B002215986E +:10D4300000F0EEFC8DF81C000B203070BDF81400DD +:10D4400020E09DF81C2001214FF00C0A002A22D177 +:10D4500013ABB9F1000F00D00020CDE90210072076 +:10D46000CDE900090493BDF83400228C401E83B23C +:10D47000218B159800F0CCFC8DF81C000D2030702D +:10D48000BDF84C00401CADF8340005208DF8380084 +:10D49000208BADF83C00BCE03888218B88427FF4BB +:10D4A00052AF9DF81C004FF0120A00281CD1606A90 +:10D4B000A8B1B878C0073FF446AF00E018E0BA68FA +:10D4C0000720CDE902B2CDF804B00090CDF810B03D +:10D4D000FB88BA88159800F071FA8DF81C001320AB +:10D4E00030700120ADF8340093E0000054000020BB +:10D4F0003988208B8142D2D19DF81C004FF0160A4A +:10D500000028A06B08D0E0B34FF6FF7000215F4603 +:10D51000ADF808B0019027E068B1B978C907BED16D +:10D52000E18F0DAB0844821D03968DE80C02438801 +:10D530008288018809E0B878C007BCD0BA680DAB12 +:10D5400003968DE80C02BB88FA881598FFF7F3F96B +:10D5500005005ED0072D72D076E0019005AA02A9E1 +:10D560002046FFF729F90146E28FBDF80800824204 +:10D5700001D00029F1D0E08FA16B08440780019809 +:10D58000E08746E09DF81C004FF0180A40B1208B60 +:10D59000C8B13888208321461598FFF796F938E0FE +:10D5A00004F118000090237E012221461598FFF710 +:10D5B000A4F98DF81C000028EDD11920307001204D +:10D5C000ADF83400E7E7052521461598FFF77DF90A +:10D5D0003AE0208800F40070ADF8200050452DD1CD +:10D5E000A08FA0F57F41FE3901D006252CE0D8F8A8 +:10D5F00008004FF0160A48B1A063B8F80C10A187D4 +:10D600004FF6FF71E187A0F800B002E04FF6FF701F +:10D61000A087BDF8200030F47F611AD07823002263 +:10D620000320159906F0D6FE98F800002071208896 +:10D63000BDF82010084320800EE000E00725208878 +:10D64000BDF8201088432080208810F47F6F1CD004 +:10D650003AE02188814321809DF8380020B10EA94D +:10D660001598F9F776FD05469DF81C000028EBD0CB +:10D6700086F801A001203070208B70809DF81C007E +:10D6800030710520ADF83400DEE7A18EE1B11898C5 +:10D690000DAB0088ADF834002398CDE90304CDE943 +:10D6A0000139206B0090E36A179A1598FFF7FCF98F +:10D6B000054601208DF838000EA91598F9F749FDA7 +:10D6C00000B10546A4F834B094F8460040070AD5E6 +:10D6D0002046FFF7A0F910F03E0F04D114F8460FD2 +:10D6E00020F0040020701898BDF8341001802846FE +:10D6F0009BE500B585B0032806D102208DF8000017 +:10D7000088B26946F9F725FD05B000BD10B5384C63 +:10D710000B782268012B02D0022B2AD111E013785A +:10D720000BB1052B01D10423137023688A889A80DA +:10D730002268CB88D38022680B8913814989518163 +:10D740000DE08B8893802268CB88D38022680B8978 +:10D7500013814B8953818B899381096911612168F8 +:10D76000F9F7F7FC226800210228117003D0002885 +:10D7700000D0812010BD832010BD806B002800D018 +:10D78000012070478178012909D10088B0F5205F18 +:10D7900003D042F60101884201D1002070470720E2 +:10D7A0007047F0B587B0002415460E460746ADF821 +:10D7B000144010E0069801882980811DCDE90241BE +:10D7C0000721019404940091838842880188384697 +:10D7D00000F0F4F830B906AA05A93046FEF7ECFFD0 +:10D7E0000028E7D00A2800D1002007B0F0BD0000D3 +:10D7F0005400002010B58B7883B102789A4205D18D +:10D800000B885BB102E08B79091D4BB18B789A4292 +:10D81000F9D1B0F801300C88A342F4D1002010BD3A +:10D82000812010BD072826D012B1012A27D103E09C +:10D83000497801F0070102E04978C1F3C2010529E6 +:10D840001DD2DFE801F00318080C12000AB1032012 +:10D8500070470220704704280DD250B10DE0052812 +:10D8600009D2801E022808D303E0062803D003282B +:10D8700003D005207047002070470F20704781209B +:10D880007047C0B282060BD4000607D5FE48807AE6 +:10D890004143C01D01EBD00080B27047084670477D +:10D8A0000020704770B513880B800B781C0625D5B7 +:10D8B000F54CA47A844204D843F01000087000208C +:10D8C00070BD956800F0070605EBD0052D78F54092 +:10D8D00065F304130B701378D17803F0030341EA66 +:10D8E000032140F20123B1FBF3F503FB151192680C +:10D8F000E41D00FB012000EBD40070BD906870BDFA +:10D9000037B51446BDF8041011809DF804100A06BE +:10D910001ED5C1F30013DC49A568897A814208D875 +:10D92000FE2811D1C91DC9085A42284617F089F9A5 +:10D930000AE005EBD00100F00702012508789540C8 +:10D94000A843934018430870207820F010002070FE +:10D950003EBD2DE9F0410746C81C0E4620F00300ED +:10D96000B04202D08620BDE8F081C74D0020344689 +:10D970002E60AF802881AA72E8801AE0E988491CED +:10D98000E980810614D4E17800F0030041EA002028 +:10D9900040F20121B0FBF1F201FB12012068FFF718 +:10D9A00070FF2989084480B22881381A3044A06069 +:10D9B0000C3420784107E1D40020D4E72DE9FF4F53 +:10D9C00089B01646DDE9168A0F46994623F440458C +:10D9D000084600F00DFB04000FD0099803F00AF987 +:10D9E0000290207800060AD5A748817A02988142E1 +:10D9F00005D887200DB0BDE8F08F0120FAE7224658 +:10DA000001A90298FFF74EFF834600208DF80C0015 +:10DA10004046B8F1070F1AD001222146FFF702FF56 +:10DA20000028E7D12078400611D502208DF80C009F +:10DA3000ADF81070BDF80400ADF81200ADF8146038 +:10DA40001898ADF81650CDF81CA0ADF818005FEA94 +:10DA5000094004D500252E46A84601270CE0217870 +:10DA6000E07801F0030140EA012040F20121B0FB1F +:10DA7000F1F2804601FB12875FEA494009D5B845BB +:10DA800007D1A178207901F0030140EA0120B042DA +:10DA900001D3BE4201D90720ACE7A8191FFA80F9CB +:10DAA000B94501D90D20A5E79DF80C0028B103A9BF +:10DAB0000998F9F74CFB00289CD1B84507D1A0780C +:10DAC0004FEA192161F30100A07084F804901A98BC +:10DAD00000B10580199850EA0A0027D0199830B192 +:10DAE0000BEB06002A46199917F034F80EE00BEB01 +:10DAF00006085746189E099803F0E8F92B46F61DCC +:10DB0000B5B239464246009502F0D3FD224601A93E +:10DB10000298FFF7C7FE9DF80400224620F010008F +:10DB20008DF80400DDE90110FFF7EAFE002061E74F +:10DB30002DE9FF4FDFF8509182461746B9F80610DD +:10DB4000D9F8000001EB410100EB810440F2012013 +:10DB5000B2FBF0F185B000FB11764D46DDF84C804C +:10DB600031460698FFF78DFE29682A898B46611A8F +:10DB70000C3101441144AB8889B28B4202D8842015 +:10DB800009B038E70699CDB2290603D5A90601D513 +:10DB90000620F5E7B9F806C00CF1010C1FFA8CFC61 +:10DBA000A9F806C0149909B1A1F800C0A90602D5C8 +:10DBB000C4F8088007E0104480B2A9F80800191AD8 +:10DBC00001EB0B00A0602246FE200699FFF798FEAD +:10DBD000E77026712078390A61F30100320AA178D2 +:10DBE00040F0040062F30101A17020709AF8020075 +:10DBF0006071BAF80000E08000262673280602D57E +:10DC000099F80A7000E00127A80601D54FF0000836 +:10DC10004D4600244FF007090FE0CDE90268019658 +:10DC2000CDF800900496E9882046129B089AFFF7E9 +:10DC3000C5FE0028A4D1641CE4B2BC42EDD3002090 +:10DC40009EE72DE9F047804600F0D2F9070005D0A5 +:10DC5000002644460C4D40F2012919E00120BDE8A0 +:10DC6000F087204600F0C4F90278C17802F0030280 +:10DC700041EA0222B2FBF9F309FB13210068FFF726 +:10DC800000FE304486B201E0E8050020641CA4B226 +:10DC9000E988601E8142E4DCA8F10100E88028895F +:10DCA000801B288100203870D9E710B5144631B1A7 +:10DCB000491E218002F09EFFA070002010BD0120AF +:10DCC00010BD10B5D24904460088CA88904201D3DD +:10DCD0000A2010BD096800EB400001EB800250797A +:10DCE000A072D08820819178107901F0030140EA78 +:10DCF0000120A081A078E11CFFF7D4FD20612088DD +:10DD0000401C2080E080002010BD0121018270476E +:10DD10002DE9FF4F85B04FF6FF788246A3F80080CB +:10DD200048681F460D4680788DF8060048680088D0 +:10DD3000ADF8040000208DF80A00088A0C88A04283 +:10DD400000D304462C8241E0288A401C2882701DA2 +:10DD50006968FFF74FFDB8BB3988414501D1601EA6 +:10DD600038806888A04236D3B178307901F0030159 +:10DD700040EA012901A9701DFFF73CFD20BB29895C +:10DD800041452CD0002231460798FFF74BFDD8B90A +:10DD90002989494518D1E9680391B5F80AC0D6F830 +:10DDA00008B05046CDF800C003F090F8DDF800C090 +:10DDB0005A460CF1070C1FFA8CFC4B460399CDF820 +:10DDC00000C002F040FC50B1641CA4B2204600F038 +:10DDD0000FF90600B8D1641E2C820A20D0E67C80A0 +:10DDE0007079B871F088B8803178F07801F003016B +:10DDF00040EA01207881A7F80C90504602F0FAFE24 +:10DE0000324607F10801FFF74DFD38610020B7E603 +:10DE10002DE9FF4F87B081461C469246DDF860B081 +:10DE2000DDF85480089800F0E3F805000CD048466F +:10DE300002F0E0FE2978090608D57549897A814201 +:10DE400004D887200BB0D6E50120FBE7CAF309060A +:10DE50002A4601A9FFF726FD0746149807281CD07B +:10DE600000222946FFF7DEFC0028EBD12878400687 +:10DE700013D501208DF808000898ADF80C00BDF806 +:10DE80000400ADF80E00ADF81060ADF8124002A924 +:10DE90004846F9F75CF90028D4D12978E87801F0F0 +:10DEA000030140EA0121AA78287902F0030240EA3E +:10DEB0000220564507D0B1F5007F04D9611E81428A +:10DEC00001DD0B20BEE7864201D90720BAE7801B9F +:10DED00085B2A54200D92546BBF1000F01D0ABF8B1 +:10DEE0000050179818B1B9192A4616F033FEB8F148 +:10DEF000000F0DD03E4448464446169F02F0F8FFFE +:10DF00002146FF1DBCB232462B46009402F005FCB0 +:10DF1000002097E72DE9F04107461D4616460846C2 +:10DF200000F066F804000BD0384602F063FE21785A +:10DF3000090607D53649897A814203D8872012E538 +:10DF4000012010E522463146FFF7ACFC65B121788F +:10DF5000E07801F0030140EA0120B0F5007F01D82C +:10DF6000012000E0002028700020FCE42DE9F041B1 +:10DF700007461D461646084600F03AF804000BD046 +:10DF8000384602F037FE2178090607D52049897AFC +:10DF9000814203D88720E6E40120E4E422463146AA +:10DFA000FFF7AEFCFF2D14D02178E07801F00302DA +:10DFB00040EA022040F20122B0FBF2F302FB130020 +:10DFC00015B900F2012080B2E070000A60F301018F +:10DFD00021700020C7E410B50C4600F009F828B104 +:10DFE000C18821804079A070002010BD012010BDA3 +:10DFF0000749CA88824209D340B1096800EB400052 +:10E000006FF00B0202EB800008447047002070475D +:10E01000E805002070B50346002002466FF02F058A +:10E020000EE09C5CA4F130060A2E02D34FF0FF30C4 +:10E0300070BD00EB800005EB4000521C2044D2B2C2 +:10E040008A42EED370BD30B50A240AE0B0FBF4F387 +:10E0500004FB13008D18303005F8010C521E1846D1 +:10E06000D2B2002AF2D130BD30B500234FF6FF7591 +:10E0700010E0040A44EA002084B2C85C6040C0F3A7 +:10E080000314604005EA00344440E0B25B1C84EABB +:10E0900040109BB29342ECD330BD000010B582B06B +:10E0A000694601F07CFF002818BFFFDF9DF80000E3 +:10E0B000002448B1019890F8DD0028B1019880F85B +:10E0C000DD4001980AF0F1FAF8488068A0F8D240E3 +:10E0D00002B010BD2DE9F04704460D46062002F0BF +:10E0E0006BFD0646072002F067FD304400F0FF0894 +:10E0F000002718EB050618BF4FF000091DD0208837 +:10E10000401C80B22080B04228BFA4F8009025882F +:10E11000454501D3B54209D30621284602F0A4FDA6 +:10E1200020B90721284602F09FFD10B10020BDE86C +:10E13000F087781CC7B2BE42E1D84FF6FF7020804E +:10E140001220BDE8F08770B582B007F057FC0DF0E3 +:10E150007FFBD74C4FF6FF7600256683A683D5A1BB +:10E160002570D1E90001CDE9000165706946A01C68 +:10E1700016F0A6FEA11C601C14F073FC25721B2077 +:10E1800060814FF4A471A181E08121820321A174F7 +:10E190000422E274A082E082A4F13E002183057093 +:10E1A0004680C6480570A4F110000570468002B094 +:10E1B00070BDF8B5BD4D17460E466860297007F072 +:10E1C00097FB4FF6FF70ADF8000000216846FFF79F +:10E1D00081FFA0B90621BDF8000002F057FD0446FA +:10E1E0000721BDF8000002F051FD002C1CBF0028E3 +:10E1F000FFDF00216846FFF76DFF0028EAD0FFF738 +:10E20000A2FF287812F03CFC10F034F829786868F6 +:10E2100014F039FB28780CF01FFD30460AF051F954 +:10E2200007F004FD297868680BF094FB39462878DC +:10E2300015F0F5F9BDE8F8400DF00ABB10B5012462 +:10E24000002A1CBF002010BD002908BF022105D0F4 +:10E25000012918BF002401D0204610BD0FF02EF96F +:10E26000FAE72DE9F04F8BB0040008BFFFDF022171 +:10E270008F4E06F11C00FFF72DFF002818BFFFDFAF +:10E28000B6F81CA0062002F097FC0546072002F015 +:10E2900093FC284400F0FF0808F1010000F0FF099A +:10E2A0004FF0000BB78B474525D120460FF0C8FA39 +:10E2B000002840F0CE803078002800F0CE8084F82E +:10E2C00001B014202070C4F804B0C4F808B0C4F839 +:10E2D0000CB0C4F810B0C4F814B0C4F818B0C4F846 +:10E2E0001CB00220C4F820B0207186F800B00BB03A +:10E2F0000120BDE8F08F4F4520D1204607F030FCCB +:10E3000000287DD008F032F8002859D0207817284E +:10E3100056D12079002853D0E088072102F0A4FCD0 +:10E32000050008BFFFDF288807F0FBFAE088072117 +:10E3300002F0ACFC002818BFFFDF8AE004A93846D1 +:10E3400001F02DFE00285BD19DF8100048B107F0C8 +:10E3500062FCB84254D0214638460BF004FA80B330 +:10E3600077E00FF000FBB84277D02146384614F032 +:10E37000ABF900286DD1059800F1580590F8D00050 +:10E3800018B9E87E08B1012000E00020079095F858 +:10E39000370000281CBF95F8380010F0020F1CD081 +:10E3A00084F801B00120207084F804B0E78095F86B +:10E3B00039002072688F6081A88FA08185F837B0FE +:10E3C00047E0FFE7059800F1580590F80C01002898 +:10E3D000DBD1E87E0028D8D0D5E7384602F088FDAA +:10E3E0000290002808BFFFDF029801F097FF50B1AC +:10E3F00084F801B00F212170E7802081012000E026 +:10E400002BE0207125E0384602F060FD02900028E4 +:10E4100008BFFFDF079800B3029801F0D6FFE0B114 +:10E420009DF8100038B90598D0F8F8004188B94235 +:10E4300008BF80F800B0384607F073FA84F801B0DE +:10E440000C20207084F804B0E780287F207285F8C3 +:10E450001BB00BB00120BDE8F08F022106F11C00BB +:10E46000FFF738FE18B9B08B50457FF41BAF0BB0E7 +:10E470002046BDE8F04F15F018B910B513F08CF830 +:10E48000042803D013F088F8052802D110F00FF902 +:10E4900028B90AF0EBFA20B107F08AFD08B10C2088 +:10E4A00010BD0DF021FA002010BD00005C0000201E +:10E4B00032060020FFFFFFFF1F0000006800002061 +:10E4C00010B50446007800281EBF0128122010BD98 +:10E4D00013F062F8042806D013F05EF8052802D085 +:10E4E0000AF0C4FA28B10DF04EFB00281CBF0C2026 +:10E4F00010BD2078002816BF02280020012004F15A +:10E500001703E21D611CBDE810400DF045BA10B5BF +:10E510000446007800281EBF0128122010BD13F009 +:10E520003BF8042803D013F037F8052802D110F087 +:10E53000BEF828B90AF09AFA20B107F039FD08B1FF +:10E540000C2010BD2078002816BF022800200120D2 +:10E55000611C0DF08FF9002814BF0020072010BDAA +:10E5600010B50DF013FB002814BF0020302010BDA3 +:10E5700010B5044613F010F8042806D013F00CF878 +:10E58000052802D00AF072FA08B10C2010BD20460E +:10E590000DF0F6FA002010BD10B512F0FDFF0428B2 +:10E5A00006D012F0F9FF052802D00AF05FFA28B170 +:10E5B0000DF0E9FA00281CBF0C2010BD0DF045FA43 +:10E5C000002010BDFF2181704FF6FF718180FE4950 +:10E5D00049680A7882718A880281498841810121CB +:10E5E00041700020704710B5002482B0022A18D074 +:10E5F00014DC12F10C0F14D008DC12F1280F1CBF30 +:10E6000012F1140F12F1100F11D10AE012F1080FDC +:10E610001CBF12F1040F002A09D102E0D31E052B02 +:10E6200005D8012807D0022809D003280BD01224CE +:10E6300002B0204610BD104607F093FEF8E71046E2 +:10E640000FF0D4FDF4E708461446694601F0A7FC34 +:10E65000002818BF0224EBD19DF80000019880F833 +:10E6600057400024E4E710B5134601220EF029F9C3 +:10E67000002010BD10B5044612F08EFF052804BF1F +:10E680000C2010BD204612F0E9F9002010BD10B595 +:10E69000044612F081FF042806D012F07DFF052801 +:10E6A00002D00AF0E3F908B10C2010BD2146002089 +:10E6B00007F0A5F9002010BD10B5044612F078FA55 +:10E6C00050B10AF0C6F938B1207809F01EFF207861 +:10E6D00010F026F8002010BD0C2010BD10B5044627 +:10E6E00012F05AFF042806D012F056FF052802D077 +:10E6F0000AF0BCF908B10C2010BD2146012007F03A +:10E700007EF9002010BD38B504464FF6FF70ADF815 +:10E710000000A079E179884213D021791F299CBF9C +:10E7200061791F290DD80022114615F0B1FB40B9BF +:10E730000022E079114615F0ABFB10B9207A0728CA +:10E7400001D9122038BD0AF091F960B912F024FF06 +:10E7500048B900216846FFF7BDFC20B1204606F00D +:10E760007CF9002038BD0C2038BD70B50446807897 +:10E77000002582B01A2825D00EDC162844D2DFE806 +:10E7800000F0434343434321434343434343434311 +:10E7900043434343432121212A2835D00BDCA0F1F8 +:10E7A0001E000C2830D2DFE800F02F2F2F2F2F2F44 +:10E7B0002F2F2F2F2F0D3A38042825D2DFE800F015 +:10E7C000240224022088B0F5706F1DD2012669460C +:10E7D00001F0E5FB00281EBF022002B070BD9DF8CD +:10E7E0000000002801980BBF00F1F40100F5B8719A +:10E7F00000F1F50300F27113024612D192F8D00035 +:10E8000092F8732052B903E002B04FF0120070BDCD +:10E81000002818BF042801D0087868B102B00C2085 +:10E8200070BD92F80C0192F87320002AF6D10028EE +:10E8300018BF0428F0D1F1E70E70A07818709DF889 +:10E84000000048B1019890F8DD0028B1019880F8E7 +:10E85000DD50019809F029FF02B0002070BDF0B52D +:10E8600083B00C46694601F09AFB28B1204616F0A9 +:10E8700011FB03B00220F0BD0198002700F15805FC +:10E8800000F1080685F840703146204616F018FB66 +:10E8900095F840000028F5D103B0F0BD2DE9F04116 +:10E8A000044691F8550091F856300D4610F00C0FC3 +:10E8B0004FF0000608BF00232189A0880EF068F9F8 +:10E8C000696A814228BFBDE8F081401A401C4108B6 +:10E8D000A0886FF00E07401A80B2A08022896FF0E6 +:10E8E0000D0C511A8BB2238195F85410628811F0E7 +:10E8F0000C0F28D0B0F5747F38BF304606D350389F +:10E90000C11700EB91600CEBA01080B2824238BFBF +:10E910001046608095F85510E08811F00C0F1BD060 +:10E92000B3F5747F38BF324607D3A3F15001CA173D +:10E9300001EB92610CEBA1118AB2904228BF104604 +:10E94000E080BDE8F08102291ABF0CEBD00080B254 +:10E9500007EB9000DAD1D8E702291ABF0CEBD301FC +:10E960008AB207EB9301E8D1E6E7F0B587B00C4631 +:10E97000054604A901F013FB00281CBF07B0F0BD39 +:10E980009DF81000002814BF002201220599B1F85B +:10E990004A30FB2B28BFFB23B1F84CC0BCF1FB0F66 +:10E9A00028BF4FF0FB0C094FD7E90006BF68009065 +:10E9B00001960297ADF80230ADF806C06846FFF741 +:10E9C0006DFF658004E000005C000020E450020060 +:10E9D000BDF80400E080BDF808006081BDF80200C9 +:10E9E000A080BDF80600208107B00020F0BD2DE911 +:10E9F000F04788B004460088694601F0D0FA070065 +:10EA00001CBF08B0BDE8F087B4F806C02289ACF19D +:10EA10001B011220E12924BF08B0BDE8F087B2F540 +:10EA2000A47F3CBF08B0BDE8F08744F29025AA421D +:10EA300084BF08B0BDE8F08700266388A188A3F1F1 +:10EA40001B08B8F1E10F24BF08B0BDE8F087B1F5AD +:10EA5000A47F27BF8846454508B0BDE8F087112050 +:10EA6000BCF1FB0F92BFB2F5296F08B0BDE8F0878B +:10EA7000FB2B92BFB1F5296F08B0BDE8F087208865 +:10EA800006A901F08CFA002818BFFFDF35D19DF8E8 +:10EA9000180000280CBF012200220799B1F84A0093 +:10EAA000FB2828BFFB20B1F84C30FB2B28BFFB23F1 +:10EAB000DFF834AADAF800C0DAF80490DAF808A02F +:10EAC000CDF808C0CDF80C90CDF810A0ADF80A0034 +:10EAD000ADF80E3002A8FFF7E1FEBDF80C0060F3C0 +:10EAE0001F45BDF8100060F31F48BDF80A0060F331 +:10EAF0000F05BDF80E0060F30F0862881FFA88F159 +:10EB0000092091423CBF08B0BDE8F087A9B2E28875 +:10EB100091423CBF08B0BDE8F0874FEA1841A28897 +:10EB2000238901EB15411A4491423CBF08B0BDE86E +:10EB3000F0879DF800004FF001090028019840F689 +:10EB4000480808D000F5CD7580F89B91019890F8A1 +:10EB5000DE0140B307E000F5827580F80591019869 +:10EB600090F8280108B13A2718E0E08868806088AA +:10EB7000E8802089A880A088288101222846019960 +:10EB8000FFF78CFEA888404528BF40F64800A880C3 +:10EB9000288940451DD2288185F800906E7008B004 +:10EBA0003846BDE8F087E08868806088E880208982 +:10EBB000A880A0882881002228460199FFF76EFED0 +:10EBC000A888404528BF40F64800A88028894045CD +:10EBD000E1D340F64800DEE709E710B5044612F03D +:10EBE000DBFC042806D012F0D7FC052802D009F07F +:10EBF0003DFF28B10CF0C7FF00281CBF0C2010BD42 +:10EC00002078002816BF022800200120E279611C2C +:10EC10000DF03DF9002814BF0020022010BD2DE9A1 +:10EC2000F04383B006460088694601F0B8F9070052 +:10EC30001CBF03B0BDE8F083B088002818BF0128CE +:10EC400005D002281EBF122003B0BDE8F083E946BC +:10EC5000B17800290CBF07250D46F07800280CBFBD +:10EC60000724044615F0040F16BF002900210121D6 +:10EC700014F0040F16BF00280020012001424FF0BD +:10EC800009080AD001221146484601F0A0F90028DF +:10EC900038D003B04046BDE8F08381B100220121A5 +:10ECA000484601F094F90028F3D114F0040F29D05C +:10ECB00001221146484601F08AF918B343E080B1B9 +:10ECC00001220021484601F082F90028E1D115F027 +:10ECD000040F17D001221146484601F078F988B197 +:10ECE00025E015F0040F04F0040023D0C0B1012288 +:10ECF0001146484601F06BF900281CBF25F00405B9 +:10ED000024F0040400219DF800200120002A019A2B +:10ED10001CD082F8A501019A92F8F221BAB33FE023 +:10ED200000220121484601F052F90028EAD025F0DE +:10ED30000405E7E70028E5D001220021484601F05C +:10ED400046F90028DED024F00404DBE782F80F0146 +:10ED5000019A92F834213AB9019A92F80E211AB91F +:10ED6000019A92F87D200AB13A270CE0019A82F8C4 +:10ED70000E01019880F81051019880F81141019A14 +:10ED8000B088A2F81201019880F80F111AE0FFE78D +:10ED9000019A92F8A4211AB9019A92F87D200AB139 +:10EDA0003A270CE0019A82F8A401019880F8A65154 +:10EDB000019880F8A741019AB088A2F8A8010198AB +:10EDC00080F8A51103B03846BDE8F083817831F0B2 +:10EDD000070107BFC17831F00701122070471EE715 +:10EDE00002781221012A18BF002A05D0022A18BF72 +:10EDF000032A01D0084670474278002A18BF012A2A +:10EE000003D0022A18BF032AF4D1C27B12B9827838 +:10EE1000012AEFD1837833F00502EBD113F0050F0F +:10EE2000E8D030B4C278C488B0F80AC0002A18BF4D +:10EE3000012A04D1042C28BFBCF1040F02D230BC3B +:10EE400008467047052B07D0827B002AF7D0072A97 +:10EE5000F5D830BC01F0D6B80279B0F808C0838983 +:10EE6000002A18BF012AEAD1BCF1040F28BF042BE5 +:10EE7000E5D3E9E710B5044602781220012A0FD045 +:10EE8000002A18BF10BD012A26D012F085FB0528E4 +:10EE900004D011F01AFD002808BF10BD0C2010BDD1 +:10EEA0006178002918BF012906D0022918BF10BDBA +:10EEB000A188002908BF10BD6388002B1CBFA18852 +:10EEC0000029E0D003EB83035B0001EB8101B3EB8E +:10EED000012F28BF10BDD6E70FF015FB002804BF97 +:10EEE000122010BD0FF035FB00200FF0CEFB0028E4 +:10EEF00018BF10BD60780FF0BAFB002818BF10BD16 +:10EF0000A1886088BDE8104011F0A0BE427A12F0DE +:10EF1000070F0FD032F007030CD1012A18BF022AC5 +:10EF200003D0042A1CBF1120704790F83A301BB957 +:10EF3000012A01D0122070472DE9F00F4FF0000C8C +:10EF400012F0010F40F6774640F67B4337D069B1A7 +:10EF50004489B0F810C0271F43F6FD75AF423CBF8F +:10EF6000ACF10407AF4226D2644524D3C78AB0F877 +:10EF70001CC0458C048DB0F82E80B0F83490A7F1F9 +:10EF8000060A9A453CBFACF1060A9A4513D267457A +:10EF900098BFB5F5FA7F3CBFA4F10A07B7420AD281 +:10EFA0006D1C05FB0CFCBCEB840F04DAC84598BF54 +:10EFB0004FF0010C03D9BDE8F00F3020704712F07C +:10EFC000020F27D000EB4C04B4F81690A58BB4F8D0 +:10EFD0002280278DB4F82EA0A48EA9F1060B5B45E4 +:10EFE00084BFA5F1060B5B45E5D9A94598BFB8F5E7 +:10EFF000FA7F3CBFA7F10A09B145DCD208F101084C +:10F0000008FB05F5B5EB870FD5DAA24598BF0CF1E3 +:10F01000010CD0D812F0040F22D000EB4C02D78A9A +:10F02000B2F81CC0558C148DB2F82E80928EA7F1C8 +:10F0300006094B4584BFACF106094B45BBD9674572 +:10F0400098BFB5F5FA7F3CBFA4F10A03B342B2D230 +:10F050006B1C03FB0CF3B3EB840FACDA9045AAD81E +:10F0600002782AB1012A13D0BDE8F00F12207047B0 +:10F070000029817808D0002918BF012908D0022969 +:10F0800018BF032904D0EFE7002918BF0129EBD1ED +:10F090004078002818BF012803D0022818BF032891 +:10F0A000E2D1BDE8F00F0020704700212EE7017883 +:10F0B00011F0010F02D0406814F0CABA14F097BAE8 +:10F0C0002DE9F04F91B00D460246AFF61841D1E957 +:10F0D0000001CDE90E0111462846FFF717FF060093 +:10F0E0001CBF11B0BDE8F08F12F056FA04280CD006 +:10F0F00012F052FA052808D0FC4F387828B90EF0E3 +:10F1000032FCA0F57F41FF3903D011B00C20BDE8DF +:10F11000F08FF7480B90F7480C90F7480D900BAA2A +:10F12000062110A801F06EFD040002BF092011B0F5 +:10F13000BDE8F08F03210DF02EF9EC48818AA4F888 +:10F140004A10C28AA4F84C20C37C0093837C208898 +:10F1500001F045FE002818BFFFDF208806F0E0FB25 +:10F16000278804F10E094FF0000B4FF00A0A042122 +:10F17000484604F000FF48460DF0DFFA062001F093 +:10F180001BFD80461DE005A9062001F0F6FC05A840 +:10F1900001F0D1FC5FEA000B11D100BFBDF81800EF +:10F1A000B84206D00798042249460E3015F0A6FC56 +:10F1B00070B105A801F0BFFC5FEA000BEED0A8F12A +:10F1C0000108B8F1000F07DDBBF1000FDBD007E04D +:10F1D00048460DF0BBFAF2E7BBF1000F08BFFFDFB6 +:10F1E000D9F800000DF0CDFABAF1010A01D00028DB +:10F1F000BDD0C2A004F1120700680190032101A84C +:10F2000004F090FE002001A90A5C3A54401CC0B2F0 +:10F210000328F9D3A88B6080688CA080288DE080BB +:10F22000687A10F0040F18BF08277CD0DFF8BC8282 +:10F230003A461146B8F8180011F071FD0146A06277 +:10F24000204611F0AFFD17F00C0F09D001231A462C +:10F25000214600200DF0A5FC616A884288BF09267E +:10F260004FF0000984F85E9084F85F90A878002839 +:10F2700016BF0228002001206076D5F80300C4F8EC +:10F280001A00B5F80700E0830EA904F1080015F094 +:10F2900017FE4FF0010A84F800A1CDF81CA0B4F8C5 +:10F2A0004C0004F58277FB2828BFFB20B8F80A1031 +:10F2B000814238BF084694F855104FF4747C11F021 +:10F2C0000C0F1CBF0CEB80118AB26BD0B8F80C107D +:10F2D000914238BF0A46B4F84A10FB2928BFFB21E7 +:10F2E000B8F80E308B4238BF194694F854B01BF072 +:10F2F0000C0F1CBF0CEB81139BB25BD0B8F810C095 +:10F300009C4538BF63461B2918BFB3F5A47F5AD06C +:10F31000F8803A817980BB8021463846079AFFF70A +:10F32000BDFAB88800E031E040F64801884228BFC5 +:10F3300040F64800B8803889884228BF40F6480027 +:10F34000388187F800A000BF8DF800900121684641 +:10F3500004F0E8FD9DF8000000F00701C0F3C102D1 +:10F360001144C0F3401008448DF80000401D207681 +:10F3700009283CBF08302076002120460DF00BF80C +:10F3800068780FF0CBF8002E74D122E010F0010F56 +:10F3900018BF01277FF44AAF10F0020F14BF0227F5 +:10F3A000002743E7022907BF81003C31C1007031CB +:10F3B0008AB28BE7BBF1020F07BF8B003C33CB0057 +:10F3C00070339BB29AE71B2818BFB2F5A47F9FD178 +:10F3D000BAE7A9782878EA1C0FF073F8002808BF6C +:10F3E000122647D00FF0B5F8A9782878EA1C0FF05C +:10F3F00018F906003ED1687A10F0040F14BF0820F7 +:10F4000001200FF053F8060034D1214603200FF0FD +:10F4100032F906002ED1697A8DF80010697A11F060 +:10F42000010F06D06889ADF80200288AADF8040003 +:10F430000120697A11F0020F18BF401C11F0040F6F +:10F4400007D005EB40004189ADF80610008AADF801 +:10F450000800684611F0B9FB064695F83A00002806 +:10F4600018BF01200FF028F826B9204611F047FBFD +:10F47000060009D0208806F054FA2088062101F001 +:10F4800005FC002818BFFFDF304611B0BDE8F08F43 +:10F490000146002014E638B5144C207870B912F0FB +:10F4A0007BF8052805D00EF05EFAA0F57F41FF3904 +:10F4B00004D0684611F005FC10B113E00C2038BDF3 +:10F4C0000098008806F02DFA00980621008801F0C7 +:10F4D000DDFB002818BFFFDF0120207008480078FE +:10F4E000FCF788FC002038BDE45002003206002002 +:10F4F000F4050020680000202206002011223300BD +:10F500005C00002070B4B0F802C08188C388028912 +:10F5100044898089ACF1060640F67B45AE423CBF8B +:10F520008E1FAE4214D28C4598BFB3F5FA7F3EBF12 +:10F53000A2F10A0CFE4D15EB0C0509D25B1C5943D8 +:10F54000B1EB820F04DA84429EBF002070BC70478A +:10F55000302070BC70472DE9F047B0F802C0044677 +:10F560008188C388028947898689ACF1060940F6FB +:10F570007B4830200025C1453ABFA1F10609C145AD +:10F58000BDE8F0878C4598BFB3F5FA7F3DBFA2F187 +:10F590000A0CDFF89C8318EB0C08BDE8F0875B1CB5 +:10F5A0005943B1EB820FA8BFBDE8F087B74288BFCF +:10F5B000BDE8F0872088062101F056FB68B190F87D +:10F5C000D01090F8732042B9002918BF042904D044 +:10F5D000D0F8F8100A781AB106E00220BDE8F087EA +:10F5E000D0F84421127812B13A20BDE8F087052204 +:10F5F0008A71D0F8F8100D81D0F8F820A1885181D7 +:10F60000D0F8F820E1889181D0F8F8202189D181C3 +:10F61000D0F8F8100A894B899A429EBF8A79082A45 +:10F620009A4224BF1220BDE8F08722884A80D0F891 +:10F63000F800022101700020BDE8F087F0B583B02A +:10F6400005460DF0D9F8002802BF122003B0F0BD26 +:10F650000026B84F012429467C70B81C15F030FCF8 +:10F660007E706946062001F088FA002818BFFFDF87 +:10F67000684601F060FA002808BFBDF804500AD1BE +:10F68000029880F80041684601F055FA18B9BDF8B3 +:10F690000400A842F4D103B00020F0BD10B5044628 +:10F6A0000088062101F0E0FA68B190F8D01090F8D7 +:10F6B000732042B9002918BF042904D0D0F8F810EB +:10F6C0000A7812B105E0022010BDD0F8442112786A +:10F6D0000AB13A2010BD90F8962012F0010F04BF35 +:10F6E0000C2010BDD4F80220D4F806304A608B609C +:10F6F000D0F8F81062898A81D0F8F810E268C1F871 +:10F700000E202269C1F812206269C1F81620A26990 +:10F71000C1F81A20D0F8F82003211170D0F8F800B1 +:10F7200021884180002010BDF8B516460F460446DA +:10F7300009F09CF900281CBF0C20F8BD207812238A +:10F74000EF2801D91846F8BD6088ADF8000010F028 +:10F75000100F4FF000050CD010F0010F00F0020167 +:10F760001BD0B1B110F0080F08BF10F0040F1ED06D +:10F770001AE010F0080FE5D110F0200F18BF10F0BC +:10F78000030FDFD110F0010F18BF10F0020FD9D115 +:10F790000DE010F0040F0AD106E029B110F0080FB7 +:10F7A00008BF10F0040F02D010F00F0FCAD1B4F848 +:10F7B00002C01CF0080F08D1D4E90110884228BF0C +:10F7C0002029BFD3B0F1807FBCD2207B0028B9D0E4 +:10F7D0000728B7D8607B002818BF012803D002286B +:10F7E00018BF0328AED11CF0040F03D1022818BFA4 +:10F7F000032807D1A07B002818BF0128A2D11CF044 +:10F80000040F08D1607D002818BF012803D002280A +:10F8100018BF032896D1E07D1CF0100F02D00128FC +:10F8200011D08FE7012818BF03288BD11CF0100FCF +:10F8300009D1607E01281CBF0228032882D1A07E46 +:10F840000F283FF67FAFE07E002818BF01287FF425 +:10F8500079AF1CF0400F1CBF1120F8BD3D70A5759D +:10F8600056B9FF208DF800006946002006F065FDBE +:10F870006946002006F04CFD2046BDE8F84006F041 +:10F8800074BC002250E72DE9F0470446C0780F46CB +:10F89000122510B106F0DBFC50B1607804280AD0C4 +:10F8A00094F8038094F800906678B8F1FB0F12D9B1 +:10F8B0002846BDE8F08709F0D9F80028F8D006F00E +:10F8C0001EFD0028F4D106F0EEF9002804BFE07810 +:10F8D0000028EDD1E4E71FB1B8F11F0F23D9E7E706 +:10F8E00006F0E1F928B1B8F11F0F98BF032E07D039 +:10F8F000DEE7032E18BF042E02D0B8F1000FD7D0D8 +:10F9000009F0B4F8002818BF032E04D0042E1CBF41 +:10F910000C20BDE8F087484606F0BDF9002804BF7A +:10F920004220BDE8F087E07861781F2804E00000FD +:10F9300089F3FFFF3206002098BF03291CBF112066 +:10F94000BDE8F087211D06F0F8FC0020BDE8F08737 +:10F95000002198E72DE9F0470446C0788846122731 +:10F9600010B106F00AFD38B16578042D04D0E678B0 +:10F9700094F80090FB2E02D93846BDE8F087B8F124 +:10F98000000F02D01F2E21D9F6E706F08CF920B126 +:10F990001F2E98BF032D06D0EEE7032D18BF042DB0 +:10F9A00001D0002EE8D009F061F8002818BF032D1F +:10F9B00004D0042D1CBF0C20BDE8F087484606F09B +:10F9C0006AF9002804BF4220BDE8F087E07861783A +:10F9D0001F2898BF03291CBF1120BDE8F087211DF7 +:10F9E00006F096FC0020BDE8F0870021B2E72DE983 +:10F9F000F04304464078422583B0012808D8A07817 +:10FA000006F049F920B120781225012804D0A0B1D0 +:10FA100003B02846BDE8F08306F0C3FC20B1A088FF +:10FA20000028F5D08028F3D806F0C2FC68B16078D1 +:10FA30000028EDD0207801280BD007F077FE04468F +:10FA400008F08CFC002800F0038103B00C20BDE816 +:10FA5000F08306F0B5FA38B906F09CFC002802BF26 +:10FA6000122003B0BDE8F08309F000F80028ECD1C3 +:10FA700006F0D1F8A0F57F41FF39E6D106F0BFFAD4 +:10FA8000A08842F2107100FB01F6A079314606F021 +:10FA9000EFFB06F06BFCF8B10022072101A801F092 +:10FAA000B1F8040049D0FE480321846020460CF0E0 +:10FAB00079FB204607F067F8FA4DA88AA4F84A00B7 +:10FAC000E88AA4F84C0006F0EEF870B1288B01210A +:10FAD00008F0C8FDA06210E03146002008F018FDD3 +:10FAE000002818BFFFDF00F0BEB806F063FC2A8BC9 +:10FAF0000146104608F0B6FDA062014600222046ED +:10FB000007F017FE06F0CFF84FF00108C8B906F06D +:10FB100051FC10F00C0F14D001231A462146184650 +:10FB20000DF03FF8616A88420BD90721BDF8040047 +:10FB300001F0ACF8002818BFFFDF092003B0BDE8D2 +:10FB4000F083E87C0090AB7CEA8AA98A208801F0E7 +:10FB500046F9002818BFFFDF208805F0E1FE314696 +:10FB6000204608F0D5FC002818BFFFDF2146B4F876 +:10FB70004C00002204F5CD76FB2828BFFB206B89C2 +:10FB8000834238BF184691F855304FF4747413F01F +:10FB90000C0F1CBF04EB80131FFA83FC3BD000BF8B +:10FBA000B5F80C90E14528BFE146B1F84A30FB2B8F +:10FBB00028BFFB23B5F80EC09C4538BF634691F8BB +:10FBC00054C01CF00C0F1CBF04EB831C1FFA8CF7F5 +:10FBD0002AD02C8ABC4228BF3C461B2B18BFB4F548 +:10FBE000A47F2FD0F080A6F808907380B4803046B0 +:10FBF000FEF754FEB08840F64801884228BF40F620 +:10FC00004800B0803089884228BF40F648003081E3 +:10FC100086F8008027E0022B07BF83003C33C30037 +:10FC200070331FFA83FCBBE7BCF1020F07BF4FEA3A +:10FC3000830C0CF13C0C4FEAC30C0CF1700C1FFA56 +:10FC40008CF7C6E71B2818BFB9F5A47FCAD10AE014 +:10FC50004CB1208805F065FE2088072101F016F8D8 +:10FC6000002818BFFFDF002003B0BDE8F0830021AB +:10FC7000BDE610B50C46072100F0F6FF002804BFD2 +:10FC8000022010BD90F8731109B10C2010BD90F83E +:10FC90006510142912BF152990F8C0110029F4D15C +:10FCA0002168C0F874116168C0F87811A168C0F8C3 +:10FCB0007C11E168C0F88011012180F873110020E7 +:10FCC00010BD10B5072100F0CFFF002804BF0220AF +:10FCD00010BD90F8731109B10C2010BD90F865109B +:10FCE000142918BF1529F7D1022180F873110020BB +:10FCF00010BDF0B50E464BF68032122183B096420D +:10FD000017D8B6B1694600F04AF900281CBF03B005 +:10FD1000F0BD019800F15807841C25883246294619 +:10FD200038460CF035FA2088A842F6D103B00020FE +:10FD3000F0BD03B00846F0BD10B582B0044600889F +:10FD4000694600F02CF900281CBF02B010BD0198D4 +:10FD5000A37800F1580190F82C209A4202BF0C20A1 +:10FD600002B010BD7F220A728A720022CA72E17844 +:10FD700080F82D10217980F82E10A17880F82C10B1 +:10FD800002B0104610BD10B582B00C46694600F0B6 +:10FD900006F900281CBF02B010BD019890F873004E +:10FDA000002818BF0120207002B0002010BD30B51F +:10FDB00083B00D461446694600F0F1F800281CBFD8 +:10FDC00003B030BD019890F82C0001281EBF0C2014 +:10FDD00003B030BD019890F86010297090F8610070 +:10FDE000207003B0002030BD70B50D4616460721C7 +:10FDF00000F03AFF002804BF022070BD83884FF056 +:10FE0000010CC28841880CEB430C65451AD342F2C1 +:10FE1000107C02FB0CF240F6C41C01FB0CF1B2FB9F +:10FE2000F1F1491E8CB2B4F5FA7F88BF4FF4FA7431 +:10FE3000A54238BF2C46621C591CB2FBF1F251435B +:10FE4000491E8BB290F8AC11002908BF038433809F +:10FE5000002070BD10B50C46072100F005FF0028FA +:10FE600004BF022010BD80F8DF40002C1EBF90F8B8 +:10FE7000DD10002908F019FC002010BD01780029D0 +:10FE80001CBF4178002915D041881B2921BF8188DA +:10FE90001B29C18802290DD302680349406805E087 +:10FEA0005C00002032060020F40500200A65486549 +:10FEB000002070471220704710B5044610F02CFF48 +:10FEC000204608F09AFB002010BD2DE9F0411646AF +:10FED0000F46044601221146384610F020FF054621 +:10FEE0000121384608F0BEFB854228BF2846012381 +:10FEF000E100503189B2E631884206D901F196021B +:10FF0000401AB0FBF2F0401C83B233800020BDE801 +:10FF1000F08110B5044611F03FFB042806D011F023 +:10FF20003BFB052802D008F0A1FD08B10C2010BD54 +:10FF3000601C0BF082FF207800F0010006F05AF8F8 +:10FF4000207800F001000EF0FFFA002010BD10B57F +:10FF50000446072000F022FE00281CBF0C2010BD24 +:10FF6000207810F0010F11D000226078114613F0B4 +:10FF70008FFF00281CBF122010BDA0680AF0E9F90D +:10FF8000607861680AF0EEF9002010BD00200AF0E8 +:10FF9000E0F9002108460AF0E5F9002010BD70B52F +:10FFA0000C460546062100F05FFE606010B100209F +:10FFB000207070BD0721284600F056FE60600028C2 +:10FFC00004BF022070BD01202070002070BD10B55C +:10FFD00004468C46007813466168624638B10120B9 +:10FFE0000CF0DFFD6168496A884209D906E000200B +:10FFF0000CF0D7FD6168496A884201D9012010BD23 +:020000040001F9 +:10000000002010BD10B586B0044611F0C5FA0428D2 +:1000100041D011F0C1FA05283DD0A0788DF8080034 +:10002000A0788DF8000060788DF8040020788DF8B5 +:100030000300A07B8DF80500E07B002818BF01209D +:100040008DF80600A07810F0010F27D0E078012885 +:1000500008BF022003D000280CBF012000208DF82B +:100060000100E088ADF80A006089ADF80C00A078C6 +:1000700010F0040F26D02079012808BF022003D0F9 +:1000800000280CBF012000208DF802002089ADF867 +:100090000E00A08914E006B00C2010BD10F0040F73 +:1000A00010D0E078012808BF022003D000280CBF40 +:1000B000012000208DF80200E088ADF80E00608974 +:1000C000ADF8100002A810F080FD002804BF6846BB +:1000D0000EF02BFB06B010BD30B5058825F40044AA +:1000E00021448CB24FF4004194420AD2121B92B2C6 +:1000F0001B339A4201D2A94307E005F40041214392 +:1001000003E0A21A92B2A9431143018030BD084412 +:10011000083050434A31084480B2704770B51D46DC +:1001200016460B46044629463046049AFFF7EFFF71 +:100130000646B34200D2FFDF2821204614F0ABFD73 +:100140004FF6FF70A082283EB0B265776080B0F5B0 +:10015000004F00D9FFDF618805F13C00814200D2E9 +:10016000FFDF60880835401B343880B220801B28B0 +:1001700000D21B2020800020A07770BD81618861A3 +:1001800070472DE9F05F0D46C188044600F128094B +:10019000008921F4004620F4004800F062FB10B111 +:1001A0000020BDE8F09F4FF0000A4FF0010BB04572 +:1001B0000CD9617FA8EB0600401A0838854219DC8B +:1001C00009EB06000021058041801AE06088617F0C +:1001D000801B471A083F0DD41B2F00DAFFDFBD42FA +:1001E00001DC294600E0B9B2681A0204120C04D0FE +:1001F000424502DD84F817A0D2E709EB0600018032 +:10020000428084F817B0CCE770B5044600F12802AC +:10021000C088E37D20F400402BB11044028843885D +:1002200013448B4201D2002070BD00258A4202D3C4 +:100230000180458008E0891A0904090C418003D037 +:10024000A01D00F01EFB08E0637F008808331844FF +:1002500081B26288A01DFFF73FFFE575012070BDE8 +:1002600070B5034600F12804C588808820F4004654 +:100270002644A84202D10020188270BD9889358892 +:10028000A84206D3401B75882D1A2044ADB2C01E6B +:1002900005E02C1AA5B25C7F20443044401D0C8838 +:1002A000AC4200D90D809C8924B1002414700988C7 +:1002B000198270BD0124F9E770B5044600F12801E8 +:1002C000808820F400404518208A002825D0A18984 +:1002D000084480B2A08129886A881144814200D2F2 +:1002E000FFDF2888698800260844A189884212D146 +:1002F000A069807F2871698819B1201D00F0C1FABA +:1003000008E0637F28880833184481B26288201D82 +:10031000FFF7E2FEA6812682012070BD2DE9F041A3 +:10032000418987880026044600F12805B94218D083 +:1003300004F10A0821F400402844418819B14046DC +:1003400000F09FFA08E0637F00880833184481B208 +:1003500062884046FFF7C0FE761C6189B6B2B9429A +:10036000E8D13046BDE8F0812DE9F04104460B4666 +:1003700027892830A68827F40041B4F80A80014470 +:100380000D46B74201D10020ECE70AB1481D1060CC +:1003900023B1627F691D184614F0DCFB2E88698842 +:1003A00004F1080021B18A1996B200F06AFA06E059 +:1003B000637F62880833991989B2FFF78DFE47453C +:1003C00001D1208960813046CCE78188C088814294 +:1003D00001D1012070470020704701898088814247 +:1003E00001D1012070470020704770B58588C3880F +:1003F00000F1280425F4004223F4004114449D42F6 +:100400001AD08389058A5E1925886388EC18A6426C +:1004100014D313B18B4211D30EE0437F08325C1921 +:100420002244408892B2801A80B22333984201D28B +:1004300011B103E08A4201D1002070BD012070BDDE +:100440002DE9F0478846C1880446008921F400461A +:1004500004F1280720F4004507EB060900F001FA33 +:10046000002178BBB54204D9627FA81B801A002501 +:1004700003E06088627F801B801A083823D4E289F9 +:1004800062B1B9F80020B9F802303BB1E81A21771F +:10049000404518DBE0893844801A09E0801A21774A +:1004A00040450ADB607FE189083030443944084424 +:1004B000C01EA4F81280BDE8F087454503DB01208B +:1004C0002077E7E7FFE761820020F4E72DE9F74FA7 +:1004D000044600F12805C088884620F4004A608A56 +:1004E00005EB0A0608B1404502D20020BDE8FE8FA8 +:1004F000E08978B13788B6F8029007EB09018842A5 +:1005000000D0FFDF207F4FF0000B50EA090106D03A +:1005100088B33BE00027A07FB9463071F2E7E1895C +:1005200059B1607F2944083050440844B4F81F1082 +:1005300020F8031D94F821108170E28907EB080070 +:1005400002EB0801E1813080A6F802B002985F4614 +:1005500050B1637F30880833184481B26288A01D8F +:10056000FFF7BAFDE78121E0607FE1890830504460 +:10057000294408442DE0FFE7E089B4F81F1028441F +:10058000C01B20F8031D94F82110817009EB0800AE +:10059000E28981B202EB0800E08137807180029825 +:1005A000A0B1A01D00F06DF9A4F80EB0A07F401C12 +:1005B000A077A07D08B1E088A08284F816B000BFC3 +:1005C000A4F812B084F817B001208FE7E08928441E +:1005D000C01B30F8031DA4F81F10807884F8210098 +:1005E000EEE710B5818800F1280321F4004423448C +:1005F000848AC288A14212D0914210D0818971B9F7 +:10060000826972B11046FFF7E8FE50B910892832AE +:1006100020F40040104419790079884201D100206B +:1006200010BD184610BD00F12803407F0830084473 +:10063000C01E1060088808B9DB1E1360088849884E +:10064000084480B270472DE9F04100F12806407F50 +:100650001C4608309046431808884D88069ADB1ED1 +:10066000A0B1C01C80B2904214D9801AA04200DB15 +:10067000204687B298183A46414614F03FFA0028BF +:1006800016D1E01B84B2B844002005E0ED1CADB2E9 +:10069000F61EE8E7101A80B20119A94206D83044C4 +:1006A00022464146BDE8F04114F028BA4FF0FF3031 +:1006B00058E62DE9F04100F12804407F1E4608303D +:1006C00090464318002508884F88069ADB1E90B193 +:1006D000C01C80B2904212D9801AB04200DB304672 +:1006E00085B299182A46404614F034FA701B86B237 +:1006F000A844002005E0FF1CBFB2E41EEAE7101A80 +:1007000080B28119B94206D821183246404614F009 +:1007100021FAA81985B2284624E62DE9F04100F116 +:100720002804407F1E46083090464318002508885C +:100730004F88069ADB1E90B1C01C80B2904212D93D +:10074000801AB04200DB304685B298182A464146EE +:1007500014F000FA701B86B2A844002005E0FF1CCC +:10076000BFB2E41EEAE7101A80B28119B94206D876 +:1007700020443246414614F0EDF9A81985B22846C6 +:10078000F0E5401D704710B5044600F12801C2880D +:10079000808820F400431944904206D0A28922B9EF +:1007A000228A12B9A28A904201D1002010BD088885 +:1007B000498831B1201D00F064F80020208201201A +:1007C00010BD637F62880833184481B2201DFFF793 +:1007D00083FCF2E70021C18101774182C1758175F7 +:1007E000704703881380C28942B1C28822F4004353 +:1007F00000F128021A440A60C0897047002070473F +:1008000010B50446808AA0F57F41FF3900D0FFDF94 +:10081000E088A082E08900B10120A07510BD4FF6EC +:10082000FF71818200218175704710B50446808A6E +:10083000A0F57F41FF3900D1FFDFA07D28B9A08856 +:10084000A18A884201D1002010BD012010BD8188FD +:10085000828A914201D1807D08B100207047012039 +:10086000704720F4004221F400439A4207D100F47B +:10087000004001F40041884201D00120704700206F +:10088000704730B5044600880D4620F40040A84269 +:1008900000D2FFDF21884FF40040884328432080A6 +:1008A00030BD70B50C00054609D0082C00D2FFDF22 +:1008B0001DB1A1B2286800F044F8201D70BD0DB133 +:1008C00000202860002070BD0021026803E09388AA +:1008D0001268194489B2002AF9D100F032B870B513 +:1008E00000260D460446082900D2FFDF206808B91B +:1008F0001EE0044620688188A94202D001680029D0 +:10090000F7D181880646A94201D100680DE005F1C2 +:10091000080293B20022994209D32844491B02607D +:1009200081802168096821600160206000E0002664 +:10093000304670BD00230B608A8002680A60016047 +:10094000704700234360021D018102607047F0B5CB +:100950000F460188408815460C181E46AC4200D34D +:10096000641B3044A84200D9FFDFA019A84200D977 +:10097000FFDF3819F0BD2DE9F041884606460188B1 +:10098000408815460C181F46AC4200D3641B3844FF +:10099000A84200D9FFDFE019A84200D9FFDF708824 +:1009A0003844708008EB0400BDE8F0812DE9F04187 +:1009B000054600881E461746841B8846BC4200D365 +:1009C0003C442C8068883044B84200D9FFDFA0192D +:1009D000B84200D9FFDF68883044688008EB040023 +:1009E000E2E72DE9F04106881D460446701980B201 +:1009F000174688462080B84201D3C01B20806088FB +:100A0000A84200D2FFDF7019B84200D9FFDF60882A +:100A1000401B608008EB0600C6E730B50D46018834 +:100A2000CC18944200D3A41A4088984200D8FFDF23 +:100A3000281930BD2DE9F041C84D04469046A878EC +:100A40000E46A04200D8FFDF05EB8607B86A50F8D3 +:100A5000240000B1FFDFB868002816D0304600F04F +:100A600044F90146B868FFF73AFF05000CD0B86AB0 +:100A7000082E40F8245000D3FFDFB94842462946EB +:100A800050F82630204698472846BDE8F0812DE9E9 +:100A9000F8431E468C1991460F460546FF2C00D997 +:100AA000FFDFB14500D9FFDFE4B200954DB3002070 +:100AB0008046E81C20F00300A84200D0FFDF494632 +:100AC000DFF89892684689F8001089F8017089F873 +:100AD000024089F8034089F8044089F8054089F804 +:100AE000066089F80770414600F008F90021424687 +:100AF0000F464B460098C01C20F00300009012B136 +:100B00000EE00120D4E703EB8106B062002005E08F +:100B1000D6F828C04CF82070401CC0B2A042F7D3D1 +:100B20000098491C00EB8400C9B200900829E1D369 +:100B3000401BBDE8F88310B5044603F067FD08B11B +:100B4000102010BD2078854A618802EB80009278E1 +:100B50000EE0836A53F8213043B14A1C6280A180C1 +:100B6000806A50F82100A060002010BD491C89B2A5 +:100B70008A42EED86180052010BD70B505460C464E +:100B8000084603F043FD08B1102070BD082D01D3C5 +:100B9000072070BD25700020608070BD0EB56946CD +:100BA000FFF7EBFF00B1FFDF6846FFF7C4FF08B1B6 +:100BB00000200EBD01200EBD10B50446082800D34C +:100BC000FFDF6648005D10BD3EB50546002469465E +:100BD000FFF7D3FF18B1FFDF01E0641CE4B2684601 +:100BE000FFF7A9FF0028F8D02846FFF7E5FF001B14 +:100BF000C0B23EBD59498978814201D9C0B270471F +:100C0000FF2070472DE9F041544B062903D00729F6 +:100C10001CD19D7900E0002500244FF6FF7603EB00 +:100C2000810713F801C00AE06319D7F828E09BB2E6 +:100C30005EF823E0BEF1000F04D0641CA4B2A4450A +:100C4000F2D8334603801846B34201D100201CE796 +:100C5000BDE8F041EEE6A0F57F43FF3B01D0082957 +:100C600001D300207047E5E6A0F57F42FF3A0BD0A4 +:100C7000082909D2394A9378834205D902EB8101C8 +:100C8000896A51F820007047002070472DE9F04133 +:100C900004460D46A4F57F4143F20200FF3902D01D +:100CA000082D01D30720F0E62C494FF000088A7880 +:100CB000A242F8D901EB8506B26A52F82470002FDF +:100CC000F1D027483946203050F82520204690475B +:100CD000B16A284641F8248000F007F802463946F8 +:100CE000B068FFF727FE0020CFE61D49403131F8FC +:100CF00010004FF6FC71C01C084070472DE9F84306 +:100D0000164E8846054600242868C01C20F00300C3 +:100D100028602046FFF7E9FF315D4843B8F1000F36 +:100D200001D0002200E02A680146009232B100277B +:100D30004FEA0D00FFF7B5FD1FB106E001270020C7 +:100D4000F8E706EB8401009A8A602968641C08446D +:100D5000E4B22860082CD7D3EBE600005006002050 +:100D6000F050020070B50E461D46114600F0D4F852 +:100D700004462946304600F0D8F82044001D70BDD6 +:100D80002DE9F04190460D4604004FF0000610D0CA +:100D90000027E01C20F00300A04200D0FFDFDDB1FF +:100DA00041460020FFF77DFD0C3000EB850617B1B2 +:100DB00012E00127EDE7614F04F10C00A9003C604F +:100DC0002572606000EB85002060606813F063FFAF +:100DD00041463868FFF765FD3046BDE8F0812DE9F2 +:100DE000FF4F564C804681B020689A46934600B922 +:100DF000FFDF2068027A424503D9416851F8280094 +:100E000020B143F2020005B0BDE8F08F51460298D0 +:100E100000F082F886B258460E9900F086F885B246 +:100E20007019001D87B22068A14639460068FFF797 +:100E300056FD04001FD0678025802946201D0E9D89 +:100E400007465A4601230095FFF768F92088314686 +:100E500038440123029ACDF800A0FFF75FF92088FB +:100E6000C1193846FFF78AF9D9F800004168002017 +:100E700041F82840C7E70420C5E770B52F4C054668 +:100E8000206800B9FFDF2068017AA9420ED94268C4 +:100E900052F8251051B1002342F825304A880068E5 +:100EA000FFF748FD216800200A7A08E043F20200BB +:100EB00070BD4B6853F8203033B9401CC0B2824239 +:100EC000F7D80868FFF700FD002070BD70B51B4E15 +:100ED00005460024306800B9FFDF3068017AA94276 +:100EE00004D9406850F8250000B1041D204670BDAB +:100EF00070B5124E05460024306800B9FFDF306837 +:100F0000017AA94206D9406850F8251011B131F88C +:100F1000040B4418204670BD10B50A460121FFF7A6 +:100F2000F6F8C01C20F0030010BD10B50A460121E0 +:100F3000FFF7EDF8C01C20F0030010BD700000208A +:100F400070B50446C2F11005281913F003FE15F020 +:100F5000FF0108D0491EC9B2802060542046BDE878 +:100F6000704013F076BE70BD30B505E05B1EDBB29D +:100F7000CC5CD55C6C40C454002BF7D130BD10B5AF +:100F8000002409E00B78521E44EA430300F8013BB9 +:100F900011F8013BD2B2DC09002AF3D110BD2DE9D2 +:100FA000F04389B01E46DDE9107990460D000446F5 +:100FB00022D002460846F949FDF755FB102221468A +:100FC0003846FFF7DCFFE07B000606D5F34A3946DA +:100FD000102310320846FFF7C7FF10223946484653 +:100FE000FFF7CDFFF87B000606D5EC4A49461023F3 +:100FF00010320846FFF7B8FF1021204613F029FEF3 +:101000000DE0103EB6B208EB0601102322466846FA +:10101000FFF7AAFF224628466946FDF724FB102E5B +:10102000EFD818D0F2B241466846FFF789FF102387 +:101030004A46694604A8FFF797FF1023224604A9F1 +:101040006846FFF791FF224628466946FDF70BFBED +:1010500009B0BDE8F08310233A464146EAE770B58F +:101060009CB01E460546134620980C468DF8080095 +:10107000202219460DF1090013F06CFD20222146B3 +:101080000DF1290013F066FD17A913A8CDE90001A1 +:10109000412302AA31462846FFF781FF1CB070BDEC +:1010A0002DE9FF4F9FB014AEDDE92D5410AFBB49C1 +:1010B000CDE90076202320311AA8FFF770FF4FF00A +:1010C00000088DF808804FF001098DF8099054F858 +:1010D000010FCDF80A00A088ADF80E0014F8010C3D +:1010E0001022C0F340008DF8100055F8010FCDF824 +:1010F0001100A888ADF8150015F8010C2C99C0F363 +:1011000040008DF8170006A8824613F023FD0AA8B8 +:1011100083461022229913F01DFDA048352308387C +:1011200002AA40688DF83C80CDE900760E901AA99D +:101130001F98FFF734FF8DF808808DF8099020681C +:10114000CDF80A00A088ADF80E0014F8010C1022AA +:10115000C0F340008DF810002868CDF81100A88871 +:10116000ADF8150015F8010C2C99C0F340008DF86E +:101170001700504613F0EEFC58461022229913F047 +:10118000E9FC86483523083802AA40688DF83C906F +:10119000CDE900760E901AA92098FFF700FF23B042 +:1011A000BDE8F08FF0B59BB00C460546DDE9221096 +:1011B0001E461746DDE92032D0F801C0CDF808C040 +:1011C000B0F805C0ADF80CC00078C0F340008DF851 +:1011D0000E00D1F80100CDF80F00B1F80500ADF810 +:1011E000130008781946C0F340008DF815001088E8 +:1011F000ADF8160090788DF818000DF11900102246 +:1012000013F0A8FC0DF129001022314613F0A2FCC6 +:101210000DF139001022394613F09CFC17A913A8D0 +:10122000CDE90001412302AA21462846FFF7B7FE77 +:101230001BB0F0BDF0B5A3B017460D4604461E46E0 +:10124000102202A8289913F085FC06A8202239460E +:1012500013F080FC0EA82022294613F07BFC1EA967 +:101260001AA8CDE90001502302AA314616A8FFF7BB +:1012700096FE1698206023B0F0BDF0B589B0044604 +:10128000DDE90E070D463978109EC1F340018DF857 +:10129000001031789446C1F340018DF801101968AF +:1012A000CDF802109988ADF8061099798DF80810DC +:1012B0000168CDF809108188ADF80D1080798DF89E +:1012C0000F0010236A46614604A8FFF74DFE224630 +:1012D000284604A9FDF7C7F9D6F801000090B6F832 +:1012E0000500ADF80400D7F80100CDF80600B7F806 +:1012F0000500ADF80A000020039010236A4621463D +:1013000004A8FFF731FE2246284604A9FDF7ABF9F1 +:1013100009B0F0BD1FB51C6800945B6801931368A9 +:10132000029352680392024608466946FDF79BF90C +:101330001FBD10B588B00446106804905068059031 +:1013400000200690079008466A4604A9FDF78BF92D +:10135000BDF80000208008B010BD1FB51288ADF8A0 +:1013600000201A88ADF80220002201920292039216 +:10137000024608466946FDF776F91FBD7FB5074B63 +:1013800014460546083B9A1C6846FFF7E6FF2246CE +:1013900069462846FFF7CDFF7FBD00004851020097 +:1013A00070B5044600780E46012813D0052802D0F7 +:1013B000092813D10EE0A06861690578042003F0C4 +:1013C000B3F8052D0AD0782300220420616903F0C8 +:1013D00001F803E00420616903F0A6F831462046D5 +:1013E000BDE8704001F086B810B500F12D02C37958 +:1013F0009478411D64F003042340C371DB070DD0D2 +:101400004B79547923404B710B79127913400B714E +:101410008278C9788A4200D9817010BD00224A7151 +:101420000A71F5E74178012900D00C21017070475D +:101430002DE9F04F93B04FF0000B0C690D468DF87D +:1014400020B0097801260C2017464FF00D084FF008 +:10145000110A4FF008091B2975D2DFE811F01B00B3 +:10146000C30206031E035D037003A203B703F80360 +:10147000190461049304A004EC042A053405520500 +:101480005D05EE053106340663067F06F9061D0785 +:10149000E606EB0614B120781D282AD0D5F808807E +:1014A0005FEA08004FD001208DF82000686A022210 +:1014B0000D908DF824200A208DF82500A8690A9047 +:1014C000A8880028EED098F8001091B10F2910D20A +:1014D0007ED2DFE801F07D1349DEFEFDFCFBFAF968 +:1014E00038089CF8F70002282DD124B120780C2868 +:1014F00001D00026EFE38DF82020CBE10420696ABB +:1015000003F012F8A8880728EED1204600F0EDFF7E +:10151000022809D0204600F0E8FF032807D920461A +:1015200000F0E3FF072802D20120207004E0002C25 +:10153000B8D020780128D7D198F80400C11F0A2913 +:1015400002D30A2061E0C4E1A070D8F80010E16283 +:10155000B8F80410218698F8060084F832000120BB +:1015600028700320207044E00728BDD1002C99D0BA +:1015700020780D28B8D198F8031094F82F20C1F3E3 +:10158000C000C2F3C002104201D0062000E00720D4 +:10159000890707D198F805100142D2D198F80610B2 +:1015A0000142CED194F8312098F8051020EA0202C9 +:1015B0001142C6D194F8322098F8061090430142A7 +:1015C000BFD198F80400C11F0A29BAD2617D00E09A +:1015D00006E281427ED8D8F800106160B8F80410A5 +:1015E000218198F80600A072012028700E2020703A +:1015F00003208DF82000686A0D9004F12D000990F9 +:10160000601D0A900F300B9022E12875FDE3412800 +:1016100091D1204600F069FF042802D1E078C0078C +:1016200004D1204600F061FF0F2884D1A88CD5F8A2 +:101630000C8080B24FF0400BE669FFF747FC324662 +:1016400041465B464E46CDF80090FFF732F80B203E +:101650008DF82000686A0D90E0690990002108A8C3 +:10166000FFF79EFE2078042806D0A07D58B10128FF +:1016700009D003280AD049E30520207003202870F0 +:101680008DF82060CDE184F800A032E712202070B0 +:10169000E9E11128BCD1204600F027FF042802D13F +:1016A000E078C00719D0204600F01FFF062805D1BA +:1016B000E078C00711D1A07D02280ED0204600F0AE +:1016C00014FF08E0CAE081E06FE14EE121E101E1B1 +:1016D000E7E017E0ADE111289AD1102208F10101ED +:1016E00004F13C0013F036FA607801287ED0122015 +:1016F0002070E078C00760D0A07D0028C8D0012805 +:10170000C6D05AE0112890D1204600F0EEFE0828FD +:1017100004D0204600F0E9FE132886D104F16C00C5 +:10172000102208F10101064613F014FA2078082867 +:101730000DD014202070E178C8070DD0A07D0228BC +:101740000AD06278022A04D00328A1D035E009200B +:10175000F0E708B1012837D1C80713D0A07D0228CF +:101760001DD000200090D4E9062133460EA8FFF7D3 +:1017700076FC10220EA904F13C0013F0BFF9C8B1A9 +:10178000042042E7D4E90912201D8DE8070004F186 +:101790002C0332460EA8616BFFF76FFDE9E7606B23 +:1017A000C1F34401491E0068C84000F0010040F048 +:1017B0008000D7E72078092806D185F800908DF8B9 +:1017C000209033E32870ECE30920FBE711289AD13D +:1017D000204600F08AFE0A2802D1E078C00704D132 +:1017E000204600F082FE15288DD100E08DE104F145 +:1017F0003C00102208F10101064613F0ABF92078F5 +:101800000A2816D016202070D4E90932606B611DB9 +:101810008DE80F0004F15C0304F16C0247310EA85F +:10182000FFF7C0FC10220EA9304613F067F918B17B +:10183000F5E20B20207071E22046FFF7D5FDA0787D +:10184000216A0A18C0F11001104613F002FA23E3CE +:10185000394608A8FFF7A4FD06463BE20228B6D1A8 +:10186000204600F042FE042804D3204600F03DFE4E +:10187000082809D3204600F038FE0E2829D3204638 +:1018800000F033FE122824D2A07D02289FD10E2022 +:101890008DF82000686A0D9098F801008DF82400FA +:1018A000F0E3022893D1204600F01FFE002810D05C +:1018B000204600F01AFE0128F9D0204600F015FE5F +:1018C0000C28F4D004208DF8240098F801008DF83D +:1018D00025005EE21128FCD1002CFAD020781728D0 +:1018E000F7D16178606A022911D0002101EB410132 +:1018F000182606EBC1011022405808F1010113F02F +:1019000029F90420696A00F0E3FD2670F1E5012160 +:10191000ECE70B28DDD1002CDBD020781828D8D1BB +:101920006078616A02281CD05FF0000000EB400282 +:10193000102000EBC2000958B8F801000880607858 +:10194000616A02280FD0002000EB4002142000EB57 +:10195000C2000958404650F8032F0A6040684860AA +:1019600039E00120E2E70120EEE71128B1D1002C97 +:10197000AFD020781928ACD16178606A022912D0E2 +:101980005FF0000101EB41011C2202EBC1011022BA +:10199000405808F1010113F0DDF80420696A00F0F5 +:1019A00097FD1A20B6E00121ECE7082891D1002C20 +:1019B0008FD020781A288CD1606A98F8012001789D +:1019C00062F347010170616AD8F8022041F8012FE3 +:1019D000B8F8060088800420696A00F079FD8EE27C +:1019E000072012E63878012894D1182204F1140057 +:1019F000796813F0F4F8E079C10894F82F0001EA4F +:101A0000D001E07861F30000E070217D002974D1FD +:101A10002178032909D0C00725D0032028708DF82C +:101A20002090686A0D90412004E3607DA17888428F +:101A300001D90620E9E502262671E179204621F048 +:101A4000E001E171617A21F0F0016172A17A21F087 +:101A5000F001A172FFF7C8FC2E708DF82090686A23 +:101A60000D900720E6E20420ACE6387805289DD1E9 +:101A70008DF82000686A0D90B8680A900720ADF8CC +:101A800024000A988DF830B0616801602189818056 +:101A9000A17A817104202070F4E23978052985D17A +:101AA0008DF82010696A0D91391D09AE0EC986E8BE +:101AB0000E004121ADF824108DF830B01070A88CC4 +:101AC000D7F80C8080B24026A769FFF711FA41468B +:101AD0003A463346C846CDF80090FEF71EFE002178 +:101AE00008A8FFF75DFCE07820F03E00801CE07065 +:101AF0002078052802D00F200CE049E1A07D20B11C +:101B0000012802D0032802D002E10720BFE584F8B3 +:101B10000080EEE42070ECE4102104F15C0002F09F +:101B20002AFA606BB0BBA07D18B1012801D0052056 +:101B3000FDE006202870F7486063A063BEE23878B5 +:101B4000022894D1387908B12875B3E3A07D022822 +:101B500002D0032805D022E0B8680028F5D06063E1 +:101B60001CE06078012806D0A07994F82E10012896 +:101B700005D0E84806E0A17994F82E00F7E7B868A8 +:101B80000028E2D06063E078C00701D0012902D0CC +:101B9000E04803E003E0F8680028D6D0A063062000 +:101BA00010E68DF82090696A0D91E1784846C907E2 +:101BB00009D06178022903D1A17D29B1012903D07F +:101BC000A17D032900D00720287031E1387805284D +:101BD000BBD1207807281ED084F800A005208DF8FE +:101BE0002000686A0D90B8680A90ADF824A08DF8BE +:101BF00030B003210170E178CA070FD0A27D022A1C +:101C00001AD000210091D4E9061204F15C03401CB3 +:101C1000FFF725FA67E384F80090DFE7D4E90923AA +:101C2000211D8DE80E0004F12C0304F15C02401C20 +:101C3000616BFFF722FB56E3626BC1F34401491E5F +:101C40001268CA4002F0010141F08001DAE73878F9 +:101C50000528BDD18DF82000686A0D90B8680A90FB +:101C6000ADF824A08DF830B0042100F8011B10223B +:101C700004F15C0112F06EFF002108A8FFF790FB51 +:101C80002078092801D0132044E70A2020709BE522 +:101C9000E078C10742D0A17D012902D0022927D0D6 +:101CA00038E0617808A8012916D004F16C01009190 +:101CB000D4E9061204F15C03001DFFF7BBFA0A2009 +:101CC000287003268DF82080686A0D90002108A8EE +:101CD000FFF766FBDDE2C3E204F15C010091D4E9A9 +:101CE000062104F16C03001DFFF7A4FA0026E9E7C2 +:101CF000C0F3440114290DD24FF0006101EBB01084 +:101D00004FEAB060E0706078012801D01020BEE496 +:101D10000620FFE6607801283FF4B7AC0A2051E5C1 +:101D2000E178C90708D0A17D012903D10B202870D3 +:101D300004202FE028702DE00E2028706078616B61 +:101D4000012817D004F15C0304F16C020EA8FFF720 +:101D5000E1FA2046FFF748FBA0780EAEC0F1100173 +:101D6000304412F076FF06208DF82000686A09964C +:101D70000D909AE004F16C0304F15C020EA8FFF7E9 +:101D8000C9FAE9E73978022903D139790029D1D094 +:101D900029758FE28DF82000686A0D9058E5387833 +:101DA0000728F6D1D4E909216078012808D004F188 +:101DB0006C00CDE90002029105D104F16C0304E04E +:101DC00004F15C00F5E704F15C0304F14C007A686F +:101DD0000646216AFFF764F96078012821D1A078CE +:101DE000216A0A18C0F11001104612F032FFD4E93E +:101DF0000923606B04F12D018DE80F0004F15C03F1 +:101E000004F16C0231460EA800E055E2FFF7CAF972 +:101E100010220EA904F13C0012F070FE08B10B2054 +:101E2000AFE485F8008000BF8DF82090686A0D90BF +:101E30008DF824A00CE538780528AAD18DF820006B +:101E4000686A0D90B8680A90ADF824A08DF830B09B +:101E500080F80080617801291AD0D4E9093204F1B0 +:101E60002D01A66B03920096CDE9011304F16C03DA +:101E700004F15C0204F14C01401CFFF793F90021CE +:101E800008A8FFF78DFA6078012805D0152041E6F3 +:101E9000D4E90923611DE4E70E20287006208DF89F +:101EA0002000686ACDF824B00D90A0788DF8280045 +:101EB000CEE438780328C0D1E079C00770D00F2075 +:101EC0002870072066E7387804286BD11422391D62 +:101ED00004F1140012F083FE616A208CA1F809005D +:101EE000616AA078C871E179626A01F00301117238 +:101EF000616A627A0A73616AA07A81F82400162006 +:101F000060E485F800A08DF82090696A50460D9134 +:101F100090E00000485102003878052842D1B868A6 +:101F2000A8616178606A022901D0012100E00021E6 +:101F300001EB4101142606EBC1014058082102F0D3 +:101F40001AF86178606A022901D0012100E00021BD +:101F500001EB410106EBC101425802A8E169FFF71C +:101F60000DFA6078626A022801D0012000E00020AA +:101F700000EB4001102000EBC1000223105802A921 +:101F80000932FEF7F1FF626AFD4B0EA80932A16922 +:101F9000FFF7E3F96178606A022904D0012103E0C8 +:101FA00042E18BE0BDE0002101EB4101182606EB88 +:101FB000C101A27840580EA912F0CCFD6178606A88 +:101FC000022901D0012100E0002101EB410106EBD3 +:101FD000C1014058A1780844C1F1100112F039FE46 +:101FE00005208DF82000686A0D90A8690A90ADF868 +:101FF00024A08DF830B0062101706278616A022A4F +:1020000001D0012200E0002202EB420206EBC202F4 +:10201000401C8958102212F09DFD002108A8FFF7EE +:10202000BFF91220C5F818B028708DF82090686AA2 +:102030000D900B208DF824000AE43878052870D123 +:102040008DF82000686A0D90B8680A900B20ADF8F2 +:1020500024000A98072101706178626A022901D080 +:10206000012100E0002101EB4103102101EBC3013C +:1020700051580988A0F801106178626A022902D0DB +:10208000012101E02FE1002101EB4103142101EBCB +:10209000C30151580A6840F8032F4968416059E06C +:1020A0001920287001208DF8300077E6162028705E +:1020B0008DF830B0002108A8FFF772F9032617E168 +:1020C00014202870B0E6387805282AD18DF8200031 +:1020D000686A0D90B8680A90ADF824A08DF830B009 +:1020E00080F800906278616A4E46022A01D001228F +:1020F00000E0002202EB42021C2303EBC202401C60 +:102100008958102212F026FD002108A8FFF748F98F +:10211000152028708DF82060686A0D908DF8246075 +:102120003CE680E0387805287DD18DF82000686A8B +:102130000D90B8680A90ADF824900921017061698A +:10214000097849084170616951F8012FC0F80220EF +:102150008988C18020781C28A8D1A1E7E078C00731 +:1021600002D04FF0060C01E04FF0070C6078022817 +:102170000AD04FF0000000BF00EB040101F109019B +:1021800005D04FF0010004E04FF00100F4E74FF0FC +:1021900000000B78204413EA0C030B7010F8092F91 +:1021A00002EA0C02027004D14FF01B0C84F800C04C +:1021B000D2B394F801C0BCF1010F00D09BB990F8E4 +:1021C00000C0E0465FEACC7C04D028F0010606702F +:1021D000102606E05FEA887C05D528F00206067026 +:1021E00013262E70032694F801C0BCF1020F00D014 +:1021F00092B991F800C05FEACC7804D02CF00106C7 +:102200000E70172106E05FEA8C7805D52CF00206E7 +:102210000E701921217000260078D0BBCAB3C3BB51 +:102220001C20207035E012E002E03878062841D109 +:102230001A2019E4207801283CD00C283AD02046F6 +:10224000FFF7F0F809208DF82000686A0D9031E062 +:102250003878052805D00620387003261820287005 +:1022600046E005218DF82010686A0D90B8680A9044 +:102270000220ADF8240001208DF830000A9801708A +:10228000297D4170394608A8FFF78AF806461820CC +:102290002870012E0ED02BE001208DF82000686AF6 +:1022A0000D9003208DF82400287D8DF8250085F8F9 +:1022B00014B012E0287D80B11D20207017202870F6 +:1022C0008DF82090686A0D9002208DF82400394620 +:1022D00008A8FFF765F806460AE00CB1FE2020705A +:1022E0009DF8200020B1002108A8FFF759F810E45C +:1022F00013B03046BDE8F08F2DE9F04387B00C46AF +:102300004E6900218DF8041001202578034602272C +:102310004FF007094FF0050C85B1012D53D0022D68 +:1023200039D1FE2030708DF80030606A05900320AE +:102330008DF80400207E8DF8050063E021790129E5 +:1023400025D002292DD0032928D0042923D1B17DFD +:10235000022920D131780D1F042D04D30A3D032D0D +:1023600001D31D2917D12189022914D38DF80470B6 +:10237000237020899DF8041088421BD2082001E0B8 +:10238000405102008DF80000606A059057E07078B7 +:102390000128EBD0052007B0BDE8F0831D20307088 +:1023A000E4E771780229F5D131780C29F3D18DF861 +:1023B0000490DDE7083402F804CB94E80B0082E8CF +:1023C0000B000320E7E71578052DE4D18DF800C058 +:1023D000656A0595956802958DF8101094F804804B +:1023E000B8F1010F13D0B8F1020F2DD0B8F1030FDF +:1023F0001CD0B8F1040FCED1ADF804700E202870B7 +:10240000207E687000216846FEF7CAFF0CE0ADF838 +:1024100004700B202870207E002100F01F006870DF +:102420006846FEF7BDFF37700020B4E7ADF80470D2 +:102430008DF8103085F800C0207E68702770114636 +:102440006846FEF7ADFFA6E7ADF804902B70207F3D +:102450006870607F00F00100A870A07F00F01F008E +:10246000E870E27F2A71C0071CD094F8200000F0C9 +:102470000700687194F8210000F00700A87100219E +:102480006846FEF78DFF2868F062A8883086A87934 +:1024900086F83200A069407870752879B0700D20F8 +:1024A0003070C1E7A9716971E9E700B587B0042808 +:1024B0000CD101208DF800008DF80400002005915A +:1024C0008DF8050001466846FEF76AFF07B000BDBB +:1024D00070B50C46054602F027F821462846BDE8AF +:1024E00070407823002201F075BF08B10078704772 +:1024F0000C20704770B50C0005784FF000010CD02F +:1025000021702146F2F7A9FE69482178405D884292 +:1025100001D1032070BD022070BDF2F79EFE0020A5 +:1025200070BD0279012A05D000220A704B78012B78 +:1025300002D003E0042070470A758A610279930093 +:10254000521C0271C15003207047F0B587B00F468E +:1025500005460124287905EB800050F8046C70785A +:10256000411E02290AD252493A46083901EB80003D +:10257000314650F8043C2846984704460CB1012CDB +:1025800011D12879401E10F0FF00287101D00324DA +:10259000E0E70A208DF80000706A0590002101969E +:1025A0006846FFF7A7FF032CD4D007B02046F0BD44 +:1025B00070B515460A46044629461046FFF7C5FF82 +:1025C000064674B12078FE280BD1207C30B1002063 +:1025D0002870294604F10C00FFF7B7FF2046FEF7EC +:1025E00021FF304670BD704770B50E4604467C2111 +:1025F00012F051FB0225012E03D0022E04D005203B +:1026000070BD0120607000E065702046FEF70AFF93 +:10261000A575002070BD28B1027C1AB10A4600F1F0 +:102620000C01C5E70120704710B5044686B00420B0 +:1026300001F07AFF2078FE2806D000208DF80000F7 +:1026400069462046FFF7E7FF06B010BD7CB50E4691 +:1026500000218DF804104178012903D0022903D00C +:10266000002405E0046900E044690CB1217C89B1D3 +:102670006D4601462846FFF754FF032809D132462C +:1026800029462046FFF794FF9DF80410002900D04A +:1026900004207CBD04F10C05EBE730B40C46014688 +:1026A000034A204630BC034B0C3AFEF756BE0000EE +:1026B000845102004051020070B50D46040011D053 +:1026C00085B12101284612F0C4FA10224E4928464D +:1026D00012F040FA4C4801210838018044804560DE +:1026E000002070BD012070BD70B5474E0024054626 +:1026F000083E10E07068AA7B00EB0410817B9142D9 +:1027000008D1C17BEA7B914204D10C22294612F008 +:10271000F5F930B1641C30888442EBDB4FF0FF30B8 +:1027200070BD204670BD70B50D46060006D02DB1B7 +:10273000FFF7DAFF002803DB401C14E0102070BD17 +:10274000314C083C20886288411C914201D9042008 +:1027500070BD6168102201EB0010314612F0FAF9E9 +:102760002088401C20802870002070BD70B5144661 +:102770000D0018D0BCB10021A170022802D0102891 +:1027800011D105E0288870B10121A170108008E006 +:102790002846FFF7A9FF002805DB401CA070A88988 +:1027A0002080002070BD012070BD70B50546144624 +:1027B0000E000BD000203070A878012808D005D971 +:1027C0001149A1F108010A8890420AD9012070BD7F +:1027D00024B1287820702888000A507002200870E0 +:1027E0000FE064B14968102201EB00112046103956 +:1027F00012F0B0F9287820732888000A607310203E +:102800003070002070BD00007C0000202DE9F041F8 +:1028100090460C4607460025FE48072F00EB881619 +:1028200007D2DFE807F007070707040404000125C3 +:1028300000E0FFDF06F81470002D13D0F54880305B +:1028400000EB880191F82700202803D006EB400018 +:10285000447001E081F8264006EB440220205070CD +:1028600081F82740BDE8F081F0B51F4614460E46BA +:102870000546202A00D1FFDFE649E648803100EB1B +:10288000871C0CEB440001EB8702202E07D00CEBD9 +:10289000460140784B784870184620210AE092F8AB +:1028A0002530407882F82500F6E701460CEB410020 +:1028B00005704078A142F8D192F82740202C03D02F +:1028C0000CEB4404637001E082F826300CEB410409 +:1028D0002023637082F82710F0BD30B50D46CE4B33 +:1028E00044190022181A72EB020100D2FFDFCB4814 +:1028F000854200DDFFDFC9484042854200DAFFDF44 +:10290000C548401C844207DA002C01DB204630BD5C +:10291000C148401C201830BDBF48C043FAE710B57D +:1029200004460168407ABE4A52F82020114450B152 +:102930000220084420F07F40F0F71DF994F90810B8 +:10294000BDE81040C9E70420F3E72DE9F047B14E98 +:10295000803696F82D50DFF8BC9206EB850090F893 +:10296000264034E009EB85174FF0070817F81400EC +:10297000012806D004282ED005282ED0062800D005 +:10298000FFDF01F0E3F8014607EB4400427806EB75 +:10299000850080F8262090F82720A24202D120222C +:1029A00080F82720084601F0DCF82A46214601205D +:1029B000FFF72CFF9B48414600EB041002682046BD +:1029C000904796F82D5006EB850090F82640202C75 +:1029D000C8D1BDE8F087022000E003208046D0E7A0 +:1029E00010B58C4C2021803484F8251084F82610F2 +:1029F00084F82710002084F8280084F82D0084F83B +:102A00002E10411EA16044F8100B207460742073D6 +:102A10006073A0738449E0772075087048700021C6 +:102A20007C4A103C02F81100491CC9B22029F9D394 +:102A30000120EFF78EFF0020EFF78BFF012084F8D5 +:102A40002200F9F7A9F97948F9F7B5F9764CA41EEF +:102A500020707748F9F7AFF96070BDE81040EFF7E4 +:102A600005BF10B5EFF727FF6F4CA41E2078F9F7CC +:102A7000BBF96078F9F7B8F9BDE8104001F09EB8ED +:102A8000202070472DE9F34F624E0025803606EB7B +:102A9000810A89B09AF82500202822D0691E029167 +:102AA0006049009501EB00108146D0E90112C06831 +:102AB0000391CDE90420B08BADF81C00B07F8DF8F8 +:102AC0001E009DF81500C8B10227554951F8204055 +:102AD0000399E219114421F07F41019184B102214F +:102AE0000FE00120EFF735FF0020EFF732FFEFF79F +:102AF00000FF01F063F886F82F50A0E00427E4E718 +:102B000000218DF81810022801D0012820D1039847 +:102B1000391901440998081A9DF81C1020F07F40CB +:102B200001B10221333181420BD203208DF815000F +:102B30000398C4F13201401A20F07F403224039000 +:102B40000CE096F8240018B9F0F726FA00284CD0CB +:102B5000322C03D214B101F025F801E001F02EF877 +:102B6000314A107818B393465278039B121B002108 +:102B70009DF81840984601281AD0032818D0002044 +:102B80008DF81E00002A04DD981A039001208DF8AC +:102B900018009DF81C0000B102210398254A20F07E +:102BA0007F40039003AB099801F014F810B110E0D6 +:102BB0000120E5E79DF81D0018B99BF800000328E7 +:102BC00012D08DF81C50CDF80C808DF818408DF87F +:102BD0001E509DF8180058B103980123C119002216 +:102BE0001846EFF709FF06E000200BB0BDE8F08FB4 +:102BF0000120EFF7AEFE99F90C2001230020019986 +:102C0000EFF7FAFE012086F82F008AF828502022DC +:102C1000694611E098080020FF7F841E0020A1076C +:102C200094510200980600208E000020834201008B +:102C30004B290100FFFF3F00F94811F0D0FF0120B0 +:102C4000D3E72DE9F05FDFF8D883064608EB86006E +:102C500090F82550202D1FD0A8F180002C4600EBC5 +:102C60008617A0F50079DFF8BCB305E0A24607EBB4 +:102C70004A004478202C0AD0EFF70AFF09EB04132E +:102C80005A4601211B1D00F0A5FF0028EED0AC42E2 +:102C900002D0334652461EE0E34808B1AFF300804D +:102CA000EFF7F6FE98F82F206AB1D8F80C20411CF7 +:102CB000891A0902CA1701EB12610912002902DD03 +:102CC0000020BDE8F09F3146FFF7DCFE08B101208F +:102CD000F7E733462A4620210420FFF7C5FDEFE73A +:102CE0002DE9F041CE4C2569EFF7D2FE401B0002E2 +:102CF000C11700EB1160001200D4FFDF94F822002E +:102D000000B1FFDF012784F8227094F82E002028FC +:102D100000D1FFDF94F82E60202084F82E000025DB +:102D200084F82F5084F8205084F82150BF48256043 +:102D30000078022833D0032831D000202077A06803 +:102D4000401C05D04FF0FF30A0600120EFF701FEDE +:102D50000020EFF7FEFDEFF7FCFEEFF7F4FEEFF7D4 +:102D6000C8FD11F031F9B248056005604FF0E0216F +:102D70004FF40040B846C1F88002EFF784FF94F8A2 +:102D80002D703846FFF75DFF0028FAD0A448803840 +:102D900000EB871010F81600022802D006E0012090 +:102DA000CCE73A4631460620FFF730FD84F8238011 +:102DB00004EB870090F82600202804D09B48801E52 +:102DC0004078F9F717F8207F002803D0EFF7B1FE1D +:102DD0002577657746E50146914810B590F82D2096 +:102DE0000024803800EB821010F814302BB1641CE2 +:102DF000E4B2202CF8D3202010BD8E4800EB041044 +:102E0000016021460120FFF701FD204610BD10B5ED +:102E1000012801D0032800D171B3814A92F82D30E6 +:102E20007F4C0022803C04EB831300BF13F8124058 +:102E30000CB1082010BD521CD2B2202AF6D37B4A16 +:102E400048B1022807D0072916D2DFE801F015069D +:102E5000080A0C0E100000210AE01B2108E03A21AC +:102E600006E0582104E0772102E0962100E0B52138 +:102E700051701070002010BD072010BD6B4810B5B8 +:102E80004078EFF778FE80B210BD10B5202811D23F +:102E9000634991F82D30A1F1800202EB831414F8FC +:102EA00010303BB191F82D3002EB831212F8102054 +:102EB000012A01D0002010BD91F82D2001460020EC +:102EC000FFF7A4FC012010BD10B5EFF7E1FDBDE850 +:102ED0001040EFF750BE2DE9F0410E46504F0178FB +:102EE0002025803F0C4607EB831303E0254603EBC8 +:102EF00045046478944202D0202CF7D108E0202CBD +:102F000006D0A14206D103EB41014978017007E0E8 +:102F10000020A7E403EB440003EB45014078487030 +:102F2000454F7EB127B1002140F2DA30AFF3008087 +:102F30003078A04206D127B1002140F2DD30AFF356 +:102F40000080357027B1002140F2E230AFF30080FD +:102F5000012087E410B542680B689A1A1202D41750 +:102F600002EB1462121216D4497A91B1427A82B9F4 +:102F7000324A006852F82110126819441044001DAA +:102F8000891C081A0002C11700EB116000123228D8 +:102F900001DB012010BD002010BD2DE9F047814666 +:102FA0001F48244E00EB8100984690F825402020D1 +:102FB000107006F50070154600EB81170BE000BF9E +:102FC00006EB04104946001DFFF7C4FF28B107EBCC +:102FD00044002C704478202CF2D1297888F8001015 +:102FE00013E000BF06EB0415291D4846FFF7B2FFAA +:102FF00068B988F80040A97B99F80A00814201D895 +:103000000020E6E407EB44004478202CEAD10120BC +:10301000DFE42DE9FC410E4607460024054D18E08B +:1030200018090020FFFF3F00000000008E00002074 +:1030300000F50040980600200000000094510200B6 +:103040009DF8000005EB00108168384600F0D6FDC1 +:1030500001246B4601AA31463846FFF79EFF00283F +:10306000EED02046BDE8FC8170B50446FF4801253E +:10307000A54300EB841100EB8510402211F06AFD9E +:10308000FB4E26B1002140F25C40AFF30080F748D0 +:10309000803000EB850100EB8400D0F82500C1F8FA +:1030A000250026B100214FF48C60AFF30080284644 +:1030B00070BD2DE9FC418446EC481546089C00EBA8 +:1030C00085170E4617F81400012803D0022801D0F6 +:1030D0000020C7E70B46E74A0121604600F07AFD71 +:1030E000A8B101AB6A4629463046FFF756FF70B1DA +:1030F000DE489DF804209DF80010803000EB850626 +:103100008A4208D02B460520FFF7AEFB0BE02A468B +:103110002146042014E0202903D007EB4100407829 +:1031200001E096F8250007EB440148709DF8000087 +:10313000202809D007EB400044702A46214603208E +:10314000FFF764FB01208DE706F8254F0120F070A2 +:10315000F3E7C94901EB0010001DFFF7E0BB7CB5A8 +:103160001D46134604460E4600F108022146184645 +:10317000EFF70EFD94F908000F2804DD1F382072C8 +:103180002068401C206096B10220BC4951F82610EE +:10319000461820686946801B20F07F40206094F923 +:1031A00008002844C01C1F2803DA012009E004207D +:1031B000EBE701AAEFF7ECFC9DF8040010B10098D2 +:1031C000401C00900099206831440844C01C20F045 +:1031D0007F4060607CBD2DE9FE430C4606460978C1 +:1031E00060799072207998461546507241B19F4897 +:1031F000803090F82E1020290AD00069401D0BE085 +:10320000D4E90223217903B02846BDE8F043A6E7BC +:103210009B484178701D084420F07F4721790022A7 +:103220002846A368FFF79BFF3946284600F0E6FCD6 +:10323000D4E9023221796846FFF791FF41462846DA +:10324000019CFFF7E6FE2B4622460021304600F0A7 +:10325000C1FC002803D13146284600F0CFFCBDE870 +:10326000FE832DE9FE4F814600F084FC30B100273B +:1032700099F8000020B10020BDE8FE8F0127F7E794 +:103280007A4D7B4C4FF0000A803524B1002140F28A +:10329000D340AFF3008095F82D8085F823A0002659 +:1032A00024B100214FF49B60AFF300801FB940466A +:1032B000FFF7DAFE804624B100214FF49C60AFF3A3 +:1032C0000080EFF7E5FB43466A464946FFF783FF78 +:1032D00024B1002140F2E640AFF3008095F82E00C3 +:1032E00020280CD029690098401A0002C21700EB70 +:1032F0001260001203D5684600F080FC012624B15C +:1033000000214FF49E60AFF3008095F82300002861 +:10331000BBD124B1002140F2F640AFF30080EFF7BB +:10332000B7FB6B46534A002100F054FC0028A3D0A1 +:1033300027B941466846FFF76CFE064326B168464A +:10334000FFF7EDFAC9F8080024B1002140F2095056 +:10335000AFF3008001208FE72DE9FF5F8A468146A9 +:1033600000F008FC414C803410B39AF800000027AC +:1033700010B1012800D0FFDF3D4D25B1002140F202 +:103380007F50AFF300800120A84600905FEA080656 +:1033900004D0002140F28750AFF30080009800F085 +:1033A000E0FB94F82D50002084F8230067B119E069 +:1033B00094F82E000127202800D1FFDF9AF80000A2 +:1033C0000028D9D0FFDFD7E72846FFF74DFE054696 +:1033D00026B1002140F29150AFF3008094F8230011 +:1033E0000028D3D126B1002140F29B50AFF30080DA +:1033F000EFF74EFB83462B4601AA5146FFF7EBFE43 +:103400005FEA060804D0002140F2A250AFF300802A +:103410003B462A4601A95846CDF80090FFF749FEE1 +:10342000064604EB850090F828B0B8F1000F04D0F0 +:10343000002140F2A950AFF3008000F087FB00901C +:10344000B8F1000F04D0002140F2AF50AFF300807C +:1034500094F82300002899D1B8F1000F04D000217E +:1034600040F2B750AFF3008003490BE0980800200A +:1034700000000000FFFF3F0098060020945102006A +:103480008E00002001EB09100DF1040C00F1040086 +:103490009CE80E0080E80E004EB35FEA080604D0F8 +:1034A000002140F2C450AFF300803BEA070012D085 +:1034B00094F82E0020280ED126B1002140F2C950E8 +:1034C000AFF300802846FFF7BCFB20B99AF8000054 +:1034D000D8B3012849D0B8F1000F04D0002140F240 +:1034E000E650AFF30080284600F029FB01265FEA92 +:1034F000080504D0002140F2EF50AFF3008000989F +:1035000000F02FFB25B1002140F2F350AFF3008013 +:103510008EB194F82D0004EB800090F8260020284E +:1035200009D025B1002140F2FA50AFF30080F948EC +:103530004078F8F75FFC25B1002140F2FF50AFF36F +:10354000008004B03046BDE8F09FFFE7B8F1000FFF +:1035500004D0002140F2D150AFF3008094F82D2028 +:1035600049460420FFF752F9C0E7002E3FF40EAFA2 +:10357000002140F2DC50AFF3008007E72DE9F84F5F +:10358000E54D814695F82D004FF00008E34C4FF0D3 +:10359000010B474624B1002140F20D60AFF30080DB +:1035A000584600F0DEFA85F8237024B1002140F27D +:1035B0001260AFF3008095F82D00FFF755FD064629 +:1035C00095F8230028B1002CE4D000214FF4C3600B +:1035D0004BE024B1002140F21C60AFF30080CE48E4 +:1035E000803800EB861111F81900032856D13346B4 +:1035F00005EB830A4A469AF82500904201D1012042 +:1036000000E0002000900AF125000021FFF763FC94 +:1036100001460098014203D001228AF82820AF77A2 +:10362000E1B324B1002140F22160AFF300803246C3 +:1036300049460120FFF7EAF89AF828A024B10021B2 +:1036400040F22C60AFF3008000F080FA834624B192 +:10365000002140F23160AFF3008095F8230038B1CB +:10366000002C97D0002140F23560AFF3008091E745 +:10367000BAF1000F07D095F82E00202803D130466C +:10368000FFF7DFFAE0B124B1002140F24960AFF367 +:103690000080304600F053FA4FF0010824B10021B9 +:1036A00040F25260AFF30080584600F05AFA24B15D +:1036B000002140F25660AFF300804046BDE8F88F2D +:1036C000002CF1D0002140F24460AFF30080E6E727 +:1036D0000020EFF717B90120EFF714B98D480078F3 +:1036E00070472DE9F0418C4C94F82E0020281FD112 +:1036F00094F82D6004EB860797F82550202D00D113 +:10370000FFDF8549803901EB861000EB45004078EA +:1037100007F8250F0120F87084F82300294684F863 +:103720002E50324602202234FFF770F8002020701D +:103730000FE42DE9F0417A4E774C012538B101288C +:1037400021D0022879D003287DD0FFDFF0E700F0F8 +:1037500029FAFFF7C6FF207E00B1FFDF84F8215071 +:103760000020EFF7F6F8A168481C04D001230022DE +:103770001846EFF741F914F82E0F217806EB0111E6 +:103780000A68012154E0FFF7ACFF0120EFF7E1F8F0 +:1037900094F8210050B1A068401C07D014F82E0FF7 +:1037A000217806EB01110A68062141E0207EDFF84E +:1037B0006481002708F10208012803D002281ED0E6 +:1037C000FFDFB5E7A777EFF7B4F998F80000032813 +:1037D00001D165772577607D524951F8200094F832 +:1037E000201051B948B161680123091A0022184616 +:1037F000EFF702F9022020769AE7277698E784F817 +:10380000205000F0CFF9A07F50B198F80100616816 +:103810000123091A00221846EFF7EEF8257600E09A +:10382000277614F82E0F217806EB01110A68002183 +:10383000BDE8F041104700E005E036480078BDE8FB +:10384000F041F8F7D7BAFFF74CFF14F82E0F2178A4 +:1038500006EB01110A680521EAE710B52E4C94F831 +:103860002E00202800D1FFDF14F82E0F21782C4ADB +:1038700002EB01110A68BDE81040042110477CB535 +:10388000254C054694F82E00202800D1FFDFA068C3 +:10389000401C00D0FFDF94F82E00214901AA01EB63 +:1038A0000010694690F90C002844EFF771F99DF972 +:1038B00004000F2801DD012000E0002000990844E9 +:1038C0006168084420F07F41A16094F8210000283D +:1038D00007D002B00123BDE8704000221846EFF780 +:1038E0008BB87CBD30B5104A0B1A541CB3EB940F47 +:1038F0001ED3451AB5EB940F1AD3934203D9101A6D +:1039000043185B1C14E0954210D9511A0844401C1E +:1039100043420DE08C000020180900200000000048 +:103920009806002094510200FF7F841EFFDF0023D1 +:10393000184630BD0123002201460220EFF75CB893 +:103940000220EFF706B8EFF7A3B82DE9FC47B14C1A +:10395000054694F82E00202800D1FFDF642D58D3AF +:10396000AD4A0021521B71EB010052D394F82E2076 +:10397000A0462046DFF8A49290F82D7009EB0214BF +:10398000D8F8000001AA28446946EFF701F99DF92B +:103990000400002802DD0098401C0090A0680099F7 +:1039A00062684618B21A22F07F42B2F5800F30D218 +:1039B00008EB8702444692F82520202A0AD009EB1A +:1039C00002125268101A0002C21700EB12600012B5 +:1039D00088421EDBA068401C10D0EFF759F8A168A0 +:1039E000081A0002C11700EB11600012022810DD56 +:1039F0000120EEF7AEFF4FF0FF30A06020682844B2 +:103A0000206026F07F402061012084F82300BDE87B +:103A1000FC870020FBE72DE9F0477E4C074694F831 +:103A20002D00A4F1800606EB801010F8170000B9F5 +:103A3000FFDF94F82D50A046794C24B1002140F6C8 +:103A40006500AFF3008040F6710940F67A0A06EB94 +:103A5000851600BF16F81700012818D0042810D0CA +:103A600005280ED006280CD01CB100214846AFF323 +:103A7000008020BF002CEDD000215046AFF3008025 +:103A8000E8E72A4639460120FEF7C0FEF2E74FF08C +:103A9000010A4FF00009454624B1002140F681009B +:103AA000AFF30080504600F05CF885F8239024B115 +:103AB000002140F68600AFF3008095F82D00FFF757 +:103AC000D3FA064695F8230028B1002CE4D0002153 +:103AD00040F68C001FE024B100214FF40960AFF3E1 +:103AE000008005EB860000F1270133463A46263078 +:103AF000FFF7F1F924B1002140F69400AFF3008004 +:103B000000F024F8824695F8230038B1002CC3D089 +:103B1000002140F69A00AFF30080BDE785F82D60E4 +:103B2000012085F82300504600F01BF8002C04D03B +:103B3000002140F6A700AFF30080BDE8F0873549CB +:103B400081F82D00012081F82300704710B5354819 +:103B500008B1AFF30080EFF3108000F0010072B6FF +:103B600010BD10B5002804D12F4808B1AFF3008074 +:103B700062B610BD2D480068C005C00D10D01038C9 +:103B800040B2002806DA00F00F0000F1E02090F8C3 +:103B9000140D03E000F1E02090F8000440097047A4 +:103BA0000820704710B51B4C94F82400002804D15D +:103BB000F7F7D2FE012084F8240010BD10B5154C93 +:103BC00094F82400002804D0F7F7EFFE002084F8D2 +:103BD000240010BD10B51C685B68241A181A24F064 +:103BE0007F4420F07F40A14206D8B4F5800F03D275 +:103BF000904201D8012010BD002010BDD0E9003254 +:103C0000D21A21F07F43114421F07F41C0E90031F5 +:103C10007047000018090020FF1FA1079806002028 +:103C200000000000000000000000000004ED00E0C3 +:103C30002DE9F041044680074FF000054FF00106E2 +:103C400004D55C480560066024F00204E0044FF0EF +:103C5000FF3705D558484660C0F8087324F48054EF +:103C6000600003D55548056024F08044E0050FD579 +:103C70005348C0F80052C0F8087352490D60091D3E +:103C80000D60504A04210C321160066124F48074E6 +:103C9000A00409D54C484660C0F80052C0F808732B +:103CA0004A48056024F40054C4F38030C4F3C031A2 +:103CB000884200D0FFDF14F4404F14D044484660DF +:103CC000C0F8087343488660C0F80052C0F8087313 +:103CD00041490D600A1D16608660C0F808730D60CA +:103CE000166024F4404420050AD53C4846608660AE +:103CF000C0F80873C0F848733948056024F40064BC +:103D000010F03CF93748044200D0FFDFBDE8F081F5 +:103D100070B520250022134620FA02F1C90719D0F8 +:103D200051B201F01F060124B4404E09B60006F15D +:103D3000E026C6F88041C6F88042002906DA01F084 +:103D40000F0101F1E02181F8143D03E001F1E021D0 +:103D500081F80034521CAA42DED370BD70B5224CEB +:103D60000D462060FFF764FF2068FFF7D1FF28466B +:103D7000F7F7CFFE0FF022FD00F0ADF810F0FEF8DF +:103D800010F041F8F8F708F8BDE870400FF0C4BD36 +:103D900010B5154C2068FFF74BFF2068FFF7B8FF00 +:103DA00010F0ECF8F7F773FF0020206010BD0A2038 +:103DB00070470000FC1F004000C0004004E50140C7 +:103DC000008000400485004000D0004004D5004041 +:103DD00000E0004000F0004000F5004000B000406E +:103DE00008B50040FEFF0FFD9000002070B5264989 +:103DF0000A680AB30022154601244B685B1C4B601D +:103E00000C2B00D34D600E7904FA06F30E681E42A7 +:103E10000FD0EFF3108212F0010272B600D001222F +:103E20000C689C430C6002B962B6496801600020CE +:103E300070BD521C0C2AE0D3052070BD4FF0E0216C +:103E40004FF48000C1F800027047EFF3108111F0C9 +:103E5000010F72B64FF0010202FA00F20A4803683D +:103E600042EA0302026000D162B6E7E70648002199 +:103E700001604160704701218140034800680840AB +:103E800000D0012070470000940000202DE9F0418F +:103E900015460E460446002700F0E7F8A84215D361 +:103EA000002341200FE000BF94F84220A25CF254AE +:103EB00094F84210491CB1FBF0F200FB12115B1C9C +:103EC00084F84210DBB2AB42EED3012700F0D9F800 +:103ED0003846BDE8F081704910B5802081F80004B3 +:103EE0006E49002081F8420081F84100433181F899 +:103EF000420081F84100433181F8420081F84100DD +:103F000067480FF071FE6648401C0FF06DFEEEF73B +:103F1000C9FEBDE8104000F0B4B8402070475F48CB +:103F200000F0A3B80A4601465C48AFE7402070475E +:103F30005A48433000F099B80A4601465748433082 +:103F4000A4E7402101700020704710B50446534893 +:103F5000863000F08AF82070002010BD0A46014625 +:103F60004E4810B58630FFF791FF08B1002010BD14 +:103F700042F2070010BD70B50C460546412900D934 +:103F8000FFDF48480068103840B200F050F8C6B271 +:103F90000D2000F04CF8C0B2864203D2FFDF01E0F2 +:103FA000EEF7D0FE224629463C48FFF76FFF002877 +:103FB000F6D070BD2DE9F041394F002506463F1D72 +:103FC00057F82540204600F041F810B36D1CEDB2C3 +:103FD000032DF5D33148433000F038F8002825D0C0 +:103FE0002E4800F033F8002820D02C48863000F00E +:103FF0002DF800281AD0EEF77BFE29480FF0FCFDC3 +:10400000B0F5005F00D0FFDFBDE8F04124480FF0BD +:1040100009BE94F841004121265414F8410F401C78 +:10402000B0FBF1F201FB12002070D3E751E700284A +:1040300006DA00F00F0000F1E02090F8140D03E024 +:1040400000F1E02090F800044009704710F8411F8B +:104050004122491CB1FBF2F302FB1311407881426B +:1040600001D1012070470020704710F8411F4078AF +:10407000814201D3081A02E0C0F141000844C0B2F5 +:10408000704710B506480FF0B7FD002803D1BDE812 +:104090001040EEF718BE10BD0DE000E0480900200A +:1040A0009C00002004ED00E070B5154D2878401C00 +:1040B000C4B26878844202D0EEF7D5FE2C7070BD91 +:1040C0002DE9F0410E4C4FF0E02600BFEEF7C0FEA8 +:1040D00020BF40BF20BF677820786070D6F80052BC +:1040E000EDF71CF9854305D1D6F8040210B9207804 +:1040F000B842EBD0EEF7A7FE0020BDE8F08100004B +:10410000AC0000202DE9F041012528034FF0E0210B +:104110000026C1F880011E4CC4F800610C2000F09C +:104120002CF81C4801680268C94341F3001142F0B1 +:1041300010020260C4F804532560491C00E020BF4F +:10414000D4F80021002AFAD019B9016821F0100131 +:104150000160114807686560C4F80853C4F800613D +:104160000C2000F00AF83846BDE8F08110B504468E +:10417000FFF7C8FF2060002010BD00F01F020121E2 +:1041800091404009800000F1E020C0F880127047A3 +:1041900000C0004010ED00E008C500402DE9F047E8 +:1041A000FF4C0646FF21A06800EB06121170217833 +:1041B000FF2910D04FF0080909EB011109EB061790 +:1041C0004158C05900F0F4F9002807DDA1682078B3 +:1041D00001EB061108702670BDE8F08794F80080A6 +:1041E00045460DE0A06809EB05114158C05900F0A3 +:1041F000DFF9002806DCA068A84600EB0810057867 +:10420000FF2DEFD1A06800EB061100EB08100D7038 +:104210000670E1E7F0B5E24B0446002001259A68FC +:104220000C269B780CE000BF05EB0017D75DA7427A +:1042300004D106EB0017D7598F4204D0401CC0B2FE +:104240008342F1D8FF20F0BD70B5FFF77CFBD44C62 +:1042500008252278A16805EB0212895800F0A8F918 +:10426000012808DD2178A06805EB01114058BDE860 +:104270007040FFF75FBBFFF731FABDE87040F7F71A +:10428000B9BD2DE9F041C64C2578FFF75CFBFF2D49 +:104290006ED04FF00808A26808EB0516915900F09F +:1042A00087F90228A06801DD80595DE000EB051167 +:1042B00009782170022101EB0511425C5AB1521EAE +:1042C0004254815901F5800121F07F4181512846F6 +:1042D000FFF764FF34E00423012203EB051302EB34 +:1042E000051250F803C0875CBCF1000F10D0BCF57C +:1042F000007F10D9CCF3080250F806C00CEB423C0A +:104300002CF07F4C40F806C0C3589A1A520A09E0B4 +:10431000FF2181540AE0825902EB4C3222F07F42A5 +:104320008251002242542846FFF738FF0C21A06832 +:1043300001EB05114158E06850F8272038469047B6 +:104340002078FF2814D0FFF7FEFA2278A16808EB46 +:1043500002124546895800F02BF9012893DD217897 +:10436000A06805EB01114058BDE8F041FFF7E2BA43 +:10437000BDE8F081F0B51D4614460E460746FF2BFA +:1043800000D3FFDFA00700D0FFDF8548FF21002218 +:10439000C0E90247C5700671017042708270104614 +:1043A000012204E002EB0013401CE154C0B2A84219 +:1043B000F8D3F0BD70B57A4C064665782079854211 +:1043C00000D3FFDFE06840F825606078401C607033 +:1043D000284670BD2DE9FF5F1D468B460746FF242A +:1043E000FFF7B1FADFF8B891064699F80100B84234 +:1043F00000D8FFDF00214FF001084FF00C0A99F8B8 +:104400000220D9F808000EE008EB0113C35CFF2B73 +:104410000ED0BB4205D10AEB011350F803C0DC45B6 +:104420000CD0491CC9B28A42EED8FF2C02D00DE054 +:104430000C46F6E799F803108A4203D1FF2004B036 +:10444000BDE8F09F1446521C89F8022008EB0411C5 +:104450000AEB0412475440F802B00421029B0022E8 +:10446000012B01EB04110CD040F801204FF400782F +:1044700008234FF0020C454513D9E905C90D02D0B8 +:1044800002E04550F2E7414606EB413203EB0413EC +:1044900022F07F42C250691A0CEB0412490A81547F +:1044A0000BE005B9012506EB453103EB041321F0C0 +:1044B0007F41C1500CEB0411425499F80050204642 +:1044C000FFF76CFE99F80000A84201D0FFF7BCFE90 +:1044D0003846B4E770B50C460546FFF734FA064691 +:1044E00021462846FFF796FE0446FF281AD02C4D99 +:1044F000082101EB0411A8684158304600F058F833 +:1045000000F58050C11700EBD14040130221AA688A +:1045100001EB0411515C09B100EB4120002800DCE3 +:10452000012070BD002070BD2DE9F047884681460E +:10453000FFF770FE0746FF281BD0194D2E78A8689C +:104540003146344605E0BC4206D0264600EB061252 +:104550001478FF2CF7D10CE0FF2C0AD0A6420CD126 +:1045600000EB011000782870FF2804D0FFF76CFEE4 +:1045700003E0002030E6FFF7E3F941464846FFF745 +:10458000A9FF0123A968024603EB0413FF20C854C6 +:10459000A878401EB84200D1A87001EB041001E0D9 +:1045A000140A002001EB061100780870104613E68B +:1045B000081A0002C11700EB1160001270470000DA +:1045C00070B50446A0F500002D4EB0F1786F02D210 +:1045D0003444A4F500042B48844201D2012500E0B4 +:1045E000002500F043F848B125B9B44204D3264869 +:1045F000006808E0012070BD002070BD002DF9D1D9 +:10460000B442F9D321488442F6D2F3E710B5044608 +:10461000A0F50000B0F1786F03D219480444A4F566 +:10462000000400F023F84FF0804130B116480068D4 +:1046300004E08C4204D2012003E014488442F8D202 +:10464000002080F0010010BD10B520B1FFF7DEFFA3 +:1046500008B1012010BD002010BD10B520B1FFF73A +:10466000AFFF08B1012010BD002010BD0848094966 +:104670000068884201D10120704700207047000087 +:104680000000002000600200200000200800002040 +:10469000B0000020BEBAFECA0548064A0168914231 +:1046A00001D1002101600449012008607047000029 +:1046B000B0000020BEBAFECA40E5014053480021C8 +:1046C0000170417010218170704770B50546164623 +:1046D0000C460220EEF785F84C49012008704C4941 +:1046E000F01E08604B480560001F046070BD10B5E7 +:1046F0000220EEF776F8454901200870464800216F +:10470000C0F80011C0F80411C0F8081143494FF473 +:104710000000086010BD3D480178C9B1404A4FF41F +:10472000000111603C49D1F800310022002B1CBF70 +:10473000D1F80431002B02D0D1F8081111B1427028 +:10474000102103E00121417036490968817002702F +:104750000020EEF746B82D480178002904BF4078C4 +:1047600070472D48D0F80011002904BF022070477F +:10477000D0F8001100291CBFD0F80411002905D081 +:10478000D0F80801002804BF0120704700207047BE +:104790001E4800B50278204B4078C821491EC9B296 +:1047A00082B1D3F800C1BCF1000F10D0D3F80001E2 +:1047B00000281CBFD3F8040100280BD0D3F808014F +:1047C00050B107E0022802D0012805D002E00029FC +:1047D000E4D1FFDF002000BD012000BD0B480178BF +:1047E000002904BF807870470B48D0F800110029D9 +:1047F0001CBFD0F80411002902D0D0F8080108B17C +:104800001020704707480068C0B27047B40000200D +:1048100010F5004008F5004000F0004004F50140AC +:1048200008F5014000F40040524800210170417039 +:10483000704770B5064614460D460120EDF7D1FFCE +:104840004D480660001D0460001D05604B490020B6 +:10485000C1F850014A49032008604B4949480860A3 +:10486000091D4A48086070BD70B5424B012540EAF9 +:1048700002421D70464B42F080721A60454A116038 +:10488000454C0026C4F80461454A4449116000289B +:1048900002BFC4F80052256070BD012818BFFFDFB9 +:1048A000C4F80062256040493E48086070BD314848 +:1048B000017871B13A4A394911603749D1F8042178 +:1048C0000021002A08BF417002D0384A12684270A5 +:1048D00001700020EDF785BF26480178002904BF4C +:1048E000407870472C48D0F80401002808BF704772 +:1048F0002E480068C0B27047002808BF704730B526 +:104900001C480078002808BFFFDF2348D0F80411B6 +:10491000002918BF30BD0224C0F80443DFF890C05E +:10492000DCF80010C1F30015DCF8001041F01001B4 +:10493000CCF80010D0F80411002904BF4FF4004156 +:104940004FF0E02207D100BFC2F8801220BFD0F89C +:104950000431002BF8D02DB9DCF8001021F0100143 +:10496000CCF80010C0F8084330BD0B490120886026 +:1049700070470000B700002008F50040001000401C +:104980001CF500405011004098F501400CF000402B +:1049900004F5004018F5004000F00040000002035C +:1049A00008F501400000020204F5014000F4004057 +:1049B00010ED00E010B5FF480024012144700470A0 +:1049C00044728472C17280F821408462446314305E +:1049D00010F068FAF849601E0860091D0860091D9A +:1049E0000C60091D0860091D0C60091D0860091D87 +:1049F0000860091D0860091D0860091D0860091D7F +:104A00000860091D0860091D0860091D086010BDC7 +:104A1000EA48016801F00F01032904BF0120704733 +:104A2000016801F00F01042904BF022070470168EA +:104A300001F00F01052904D0006800F00F000628DE +:104A400007D1DF48006810F0060F0CBF08200420D3 +:104A5000704700B5FFDF012000BD30B4D5490268C2 +:104A6000DFF864C34A6142688A61007A08770A7D88 +:104A7000D44BACF1040401204AB10A7E00FA02F2E0 +:104A80001A608D7D002D0CBF2260CCF800204A7D7D +:104A9000002A04BF30BC70474A7E90401860C97D30 +:104AA00000290CBF2060CCF8000030BC704730B546 +:104AB0000024054601290AD0022908BF4FF080745E +:104AC00005D0042916BF08294FF0C744FFDF44F47E +:104AD000847040F48010BD49086045F44030091DE1 +:104AE00040F00070086030BD30B500240546012953 +:104AF0000AD0022908BF4FF0807405D0042916BFE0 +:104B000008294FF0C744FFDF44F4847040F480105C +:104B1000AE49086045F44030091D40F0007008605F +:104B2000AB48D0F80001002818BFFFDF30BD0221DC +:104B300010B44FF0E02301200022C3F88011DFF809 +:104B400094C2CCF80020CCF80000DFF88CC2DCF86E +:104B5000004024F07044CCF80040A04C40F25B6C64 +:104B6000C4F800C0241F40F2031CC4F800C0A4F124 +:104B7000040CCCF80000DFF844C20320CCF800009D +:104B8000DFF85CC29620CCF80000DFF85CC29548E4 +:104B9000CCF80000DFF858C29448CCF80000ACF123 +:104BA000040C9448CCF80000C3F880128849102007 +:104BB000C1F804037F4880F82D2010BC70477D4A5F +:104BC0000368C2F802308088D08011727047794B38 +:104BD00010B51A7A8A4208D101460622981C0FF0B5 +:104BE0008DFF002804BF012010BD002010BD7148BA +:104BF00090F8210070476F4A517010707047F0B5FF +:104C00000546800000F1804000F580508B88C0F898 +:104C100020360B78D1F8011043EA0121C0F80016C4 +:104C200005F10800012707FA00F6734C002A04BFBB +:104C30002068B04304D0012A18BFFFDF206830434A +:104C40002060206807FA05F108432060F0BD0FF0EE +:104C5000DDBA584890F82E007047564890F830005A +:104C60007047664AC17811600068654900020860B3 +:104C70007047252808BF02210ED0262808BF1A2118 +:104C80000AD0272808BF502106D00A2894BF042242 +:104C9000062202EB4001C9B25A4A11605A49086023 +:104CA0007047F0B4434B9D7A012D62D0022D1CBF9A +:104CB000F0BC704793F815C0BCF1000F04BFF0BC06 +:104CC000704700BF514C524F4FF47A7C012D57D0A2 +:104CD000DE7D5D7E002E18BF0126012908BF292137 +:104CE0000CD0022A0CBF4B4C012A03D0042A0CBF63 +:104CF0003C46494C04F2E141B1FBFCF1491F084438 +:104D00004649086046490020C1F84C01280286F057 +:104D1000010140EA015040F00311187F820002F1C6 +:104D2000804202F5C042C2F810153E4901EB8002F4 +:104D3000997EC80000F1804000F5F830C0F81425D5 +:104D4000DFF8E4C0C0F810C5D87EC30003F180438B +:104D500003F5F833C3F81425264AC3F810250122B9 +:104D600002FA01F102FA00F0084330490860F0BC91 +:104D7000704793F814C0BCF1000FA3D1F0BC70478A +:104D80009E7D1D7E002E18BF012601295DD0022ABE +:104D900004BF274C4FF47A7151D0012A08BF4FF459 +:104DA000C8614CD0042A06BF3C4640F69801214C0D +:104DB00042E00000240A0020000E004010150040D0 +:104DC00014140040180500500C0500501415004044 +:104DD00000100040FC1F00407817004038150040CC +:104DE0004415004000000C0408F5014040800040DC +:104DF000A4F5014010110040401600402415004069 +:104E00001C1500400815004054150040A224020063 +:104E1000D0FB010004360200C0D401004C850040E4 +:104E200000800040006000404C81004004F50140DB +:104E30006836020030D3010018BF40F6E441214437 +:104E400001F5FA71B1FBFCF158E7022A08BF4FF4F3 +:104E50007A710AD0012A08BF4FF4C86105D0042A2C +:104E60000CBF40F6980140F6E44149F6FC6211445B +:104E7000E8E72DE9F047FC4D0446032090468946BB +:104E8000C5F80002FA49F948086048460FF011FADF +:104E900040460FF0F9F9F74F0126002C04BFBE720F +:104EA0002E6007D0012C05D140460FF051FB0220A7 +:104EB000B8726E60F048C664F048006842464946E1 +:104EC000BDE8F047EDE62DE9F0410F46E64905461D +:104ED00003201646C1F80002E54CE448206038463D +:104EE0000FF0E7F930460FF0CFF930460FF030FB06 +:104EF000E04815B1012D09D011E001218172416B0B +:104F000041F4801141634FF4801007E00221817267 +:104F1000416B41F4001141634FF4001020603246B0 +:104F20003946BDE8F0410020BBE62DE9FF4FCE4CED +:104F30008246002581B003208946C4F80002CC4F88 +:104F4000CA48386003980FF0B4F904980FF09CF940 +:104F5000DFF82CB3C74E4FF00108BAF1000F03D0B1 +:104F6000BAF1010F21D035E0CBF8004096F82D00C2 +:104F7000012806D0022818BFFFDF0CD086F80A806F +:104F800028E0DDE9031396F82C2048460FF012FACA +:104F9000B16A4518F2E7DDE9031296F82C3048466D +:104FA0000FF096F9B16A4518E8E704980FF0D0FAC7 +:104FB000B448CBF8000096F82D00DDE90313012872 +:104FC00096F82C20484624D00FF03EFAB16A4518D6 +:104FD0000220B072AC480560AD49AC480860706B07 +:104FE00040F400207063D4F800924FF0100AC4F827 +:104FF00008A30026C4F80062A6484FF4802BC0F82E +:1050000000B0FF208DF80000C4F81061C4F81080D3 +:1050100009E00FF09BF9B16A4518D9E79DF8000047 +:10502000401E8DF800009DF8000018B1D4F8100162 +:105030000028F3D09DF80000002808BFFFDFC4F867 +:105040000061C4F80C61C4F81061C4F80461C4F8CC +:105050001461C4F81861904800680090C4F8009288 +:10506000C7F800B0C4F804A34FF4002038608248A9 +:10507000C0F84C8081480068A84228BFFFDF28465E +:10508000DDE9031205B0BDE8F04F0AE62DE9F84767 +:10509000754CD4F8000220F00B09D4F804034FF04B +:1050A000100AC0F30018C4F808A30026C4F8006270 +:1050B00078497A4808606F4D0127A87A012802D004 +:1050C000022803D014E0287D10B911E0687D78B182 +:1050D000A87EEA7E07FA00F007FA02F210430860A1 +:1050E000287F800000F1804000F5C040C0F81065C6 +:1050F000FF208DF80000C4F81061276105E000BFB3 +:105100009DF80000401E8DF800009DF8000018B1C9 +:10511000D4F810010028F3D09DF80000002808BF43 +:10512000FFDFC4F810616E72AE72EF72C4F80092C5 +:10513000B8F1000F18BFC4F804A3BDE8F8870068F1 +:10514000574920F07F40086070474FF0E02002216F +:10515000C0F88011C0F8801270474FF0E0210220A3 +:10516000C1F8000170474F49087070474E49086008 +:10517000704730B53F4C0546A06AA84228BFFFDF04 +:105180000120207300203C492561C1F844014748B3 +:105190000560606B40F480006063C80134490860BA +:1051A00030BD70B5334C0546414A0220207310686B +:1051B0000E4600F00F00032808BF012213D010682C +:1051C00000F00F00042808BF02220CD0106800F085 +:1051D0000F0005281BD0106800F00F0006281CBF28 +:1051E000FFDF012213D094F82D0094F82C10012831 +:1051F00015D028460FF086F91F4920610020C1F81C +:1052000044012169A06A08442849086070BD294802 +:10521000006810F0060F0CBF08220422E3E73346B3 +:1052200028460FF038F9E7E71A494FF48000086084 +:105230001048416B21F480014163002101737047E4 +:10524000C20002F1804202F5F8321B4BC2F8103561 +:10525000C2F8141501218140054801600548426BE0 +:105260001143416370470000001000400000040437 +:1052700004F50140240A0020008000404C850040D5 +:10528000ACF50140041000404885004048810040D2 +:10529000A8F5014008F501401811004000000C0479 +:1052A0003C150040B9000020041500404485004032 +:1052B000101500401414004004110040FB48012167 +:1052C0004160C1600021C0F84411F9480160F9480B +:1052D00081627047F8490860F848D0F8001241F040 +:1052E0004001C0F800127047F448D0F8001221F0D5 +:1052F0004001C0F80012F049002008607047EF48F4 +:10530000D0F8001221F01001C0F8001201218161D3 +:105310007047EA480021C0F81C11D0F8001241F093 +:105320001001C0F800127047E44981B0D1F81C2187 +:10533000012A1EBF002001B07047E14A126802F046 +:105340007F02524202700020C1F81C01DD48006853 +:105350000090012001B0704730B50C00054608BF31 +:10536000FFDF14F0010F1CBF012CFFDF002D0CBF6D +:1053700001200220CF4901284872CC72CF4904BFD6 +:10538000D1F8000240F0040007D0022807BFD1F88E +:10539000000240F00800FFDF30BDC1F8000230BD60 +:1053A0002DE9F84FDFF8209399F80000042828BF72 +:1053B000FFDFDFF8F8A2DAF84C11C448BD4C002634 +:1053C0004FF00108D1B1A17A012902D0022903D0FE +:1053D00014E0217D11B911E0617D79B1A17EE27EF9 +:1053E00008FA01F108FA02F211430160217F8900F5 +:1053F00001F1804101F5C041C1F81065B348616B0E +:1054000001606663217B002019B1DAF8441101299B +:1054100000D00021A27AA94D012A71D0022A76D0AB +:10542000D5F8101101290CBF1021002141EA000715 +:10543000A748016811F0FF0F03D0D5F81411012916 +:1054400000D0002184F82E10006810F0FF0F03D068 +:10545000D5F81801012800D0002084F82F009D48BD +:10546000006884F83000FFF776F9012818BF0020A3 +:1054700084F83100C5F80061C5F80C61C5F8106109 +:10548000C5F80461C5F81461C5F818619248006850 +:1054900000908648C0F8446190480068DFF810A288 +:1054A0000090DAF800006062AAF104000068A062CF +:1054B0008B48016801F00F01032908BF012013D0B8 +:1054C000016801F00F01042908BF02200CD0016817 +:1054D00001F00F01052929D0006800F00F0006280F +:1054E0001CBFFFDF012021D084F82C00A07ADFF858 +:1054F000F4B184F82D0002282DD11FE000E006E071 +:10550000D5F80C01012814BF0020082088E7D5F841 +:105510000C01012814BF00200220734A1268012ADE +:1055200014BF042200221043084379E76F48006843 +:1055300010F0060F0CBF08200420D5E7607850B1AA +:10554000DBF8001009780840217831EA000008BF34 +:1055500084F8208001D084F8206017F0020F07D073 +:1055600099F80010624A4908606A52F82110884789 +:1055700017F0010F18BF00210CD05E4A99F80030D7 +:10558000A06A52F82320904799F8000010F0010F0C +:105590002AD10AE017F0020F18BF0121EDD117F050 +:1055A000080F18BF0221E8D1EEE7DBF80000007811 +:1055B00000F00F00072828BF84F8216014D2DBF820 +:1055C0000000062200F10901A01C0FF097FA40B973 +:1055D000207ADBF800100978B0EBD11F08BF01205A +:1055E00000D0002084F82100E17A002011F0020FA1 +:1055F0001CBF17F0020F17F0040F19D111F0100F94 +:105600001CBF94F82F20002A02D094F831207AB1E0 +:1056100011F0080F1CBF94F82020002A08D111F0C7 +:10562000040F02D094F8211011B117F0010F00D02F +:105630000120617A19B170B1FFF728FD19E0234804 +:105640002D490160D5F8000220F00300C5F80002E2 +:1056500084F80B800DE04FF0000B012913D00229D4 +:1056600018BFFFDF4CD0A06A012258440021FFF789 +:1056700018FB17F0010F56D0204899F8001050F889 +:105680002100804770E0D5F8000220F00400C5F842 +:105690000002667284F80B80012384F80A801A469F +:1056A000002196200EF014FE3BE000000080004038 +:1056B00044850040240A002060150040001000408E +:1056C000481500401C110040B900002008F50140B9 +:1056D0004016004010140040181100404481004062 +:1056E0001015004004150040001400401414004040 +:1056F000AC510200F451020000000404B451020055 +:10570000D5F8000220F00800C5F80002667284F89F +:105710000B800220A07201231A46002196200EF071 +:1057200015FE83469FE717F0020F08D0624999F8EB +:10573000002028EA970051F82210884714E017F05B +:10574000080F06D05D4899F8001050F821008047F6 +:105750000AE017F0100F08BFFFDF05D0584899F88E +:10576000001050F821008047A07A022818BFBDE839 +:10577000F88F207B002808BFBDE8F88F5149C1F899 +:105780004461022814D0012818BFFFDFA16A2069F4 +:10579000884298BFFFDF2069CAF80000606B4A4961 +:1057A00040F4800060634FF480000860BDE8F88F2B +:1057B0002169A06A0844EFE70021444A81B000282B +:1057C00018BFC2F80012C2F80011C2F80C11C2F8DA +:1057D0001011C2F80411C2F81411C2F818113C4893 +:1057E0000068009001B07047012804BF282070476E +:1057F000022804BF18207047042812BF08284FF45D +:10580000A870704700B5FFDF282000BD012804BF45 +:1058100041F6A4707047022804BF41F288307047F7 +:10582000042804BF45F63C207047082804BF47F20F +:10583000AC10704700B5FFDF41F6A47000BD012831 +:1058400004BF41F2D4707047022804BF41F2040043 +:105850007047042812BF082842F6A000704700B520 +:10586000FFDF41F2D47000BD012812BF02280020E2 +:105870007047042812BF08284FF4C870704700B55D +:10588000FFDF002000BD11490820C1F800021249C5 +:1058900010480860124911480860091D1148086045 +:1058A000091D11480860091D1048086006494FF499 +:1058B0004020086070470000C4510200D45102002B +:1058C000E45102000080004004F501400010004057 +:1058D000181100400000040408F5014000110040C8 +:1058E000A0F50140141000401C11004010100040B1 +:1058F00010B53F4822210FF0ACF93D48017821F066 +:1059000010010170012107F0D9FD3A49002081F80A +:1059100022004FF6FF70888437490880488010BD08 +:10592000704734498A8C824218BF7047002081F842 +:1059300022004FF6FF70888470472D490160704740 +:105940002D49088070472B498A8CA2F57F43FF3B85 +:1059500003D0002101600846704791F822202549B4 +:10596000012A1ABF0160012000207047214901F17E +:10597000220091F82220012A04BF00207047012252 +:1059800002701D4800888884104670471A49488074 +:1059900070471849184B8A8C5B889A4206D191F857 +:1059A0002220002A1EBF016001207047002070479E +:1059B0001048114A818C5288914209D14FF6FF71EB +:1059C000818410F8221F19B1002101700120704755 +:1059D000002070470748084A818C5288914205D1BF +:1059E00090F8220000281CBF00207047012070475B +:1059F000820A00205C0A0020BA0000207047574A43 +:105A0000012340B1012818BF7047137008689060E7 +:105A100088889081704753700868C2F802008888AF +:105A2000D08070474D4A10B1012807D00EE0507861 +:105A300060B1D2F802000860D08804E0107828B184 +:105A40009068086090898880012070470020704726 +:105A5000424910B1012803D006E0487810B903E0AC +:105A6000087808B1012070470020704730B58DB02C +:105A70000C4605460D2104A80FF00DF9E0788DF8CD +:105A80001F0020798DF81E0060798DF81D002868B0 +:105A9000009068680190A8680290E86803906846E2 +:105AA0000DF026FF20789DF82F1088420CD16078E9 +:105AB0009DF82E10884207D1A0789DF82D108842BD +:105AC00002BF01200DB030BD00200DB030BD30B59B +:105AD0000C4605468DB04FF0030104F1030012B1EE +:105AE000FEF72AFA01E0FEF746FA60790D2120F070 +:105AF000C00040F04000607104A80FF0CCF8E078DE +:105B00008DF81F0020798DF81E0060798DF81D003A +:105B10002868009068680190A8680290E86803907F +:105B200068460DF0E5FE9DF82F0020709DF82E00D0 +:105B300060709DF82D00A0700DB030BD10B500292B +:105B400004464FF0060102D0FEF7F6F901E0FEF739 +:105B500012FA607920F0C000607110BDBE00002014 +:105B600070B5FF4E0446306890F8001100250129F9 +:105B700019D090F8FA10012924D090F8D0100129FA +:105B80002AD090F8F21001291CBF002070BD65706A +:105B900017212170D0F8F4106160B0F8F81021815D +:105BA00080F8F25016E065701C212170D0F80111C8 +:105BB0006160D0F80511A16090F80911217380F897 +:105BC000005107E0657007212170D0F8FC1061607A +:105BD00080F8FA50012070BD65701421217000F129 +:105BE000D2012022201D0EF0B5FF01212172306864 +:105BF00080F8D050DB48B0F8D420A0F8FC207268C0 +:105C0000537B80F8FE3080F8FA101088FBF75EF9BD +:105C1000FAF705FEDEE7D248006890F8D0100029B8 +:105C200014BFB0F8D4004FF6FF70704770B5CC4C7D +:105C30002068002808BFFFDF002520684570002885 +:105C400008BFFFDF2068417800291CBFFFDF70BD5F +:105C50004FF486710FF01FF82068FF2101707F213B +:105C600080F8361013214184282180F8CC100121BE +:105C700080F8B81080F8BD50FFF736FBFEF74BFDFB +:105C8000B94807F0A7F9B94807F0A4F9BDE8704092 +:105C9000B74807F09FB9B2490968097881420CBF3B +:105CA000012000207047AE48006890F82200C0F341 +:105CB000001070472DE9F04FA948D0F800C09CF8BB +:105CC0002400C0F38001C0F34002114400F0010041 +:105CD0000B18BCF822000025C0F3001139B31328BB +:105CE0001DD009DC102802BFA24830F81300BDE81F +:105CF000F08F122813D006E0152808D01D2804BF05 +:105D00009D48BDE8F08FFFDF2846BDE8F08F9B4936 +:105D1000002031F8131013FB0010BDE8F08F9849F4 +:105D2000002031F8131013FB0010BDE8F08F0024A1 +:105D30009CF8BA209CF8BB10924EDFF84CA2DFF81A +:105D40004CB210F0030F4FF4C8774FF4BF784FF404 +:105D5000A8797CD010F0010F17D0082904BF3C4669 +:105D600040200CD0042904BF4446102007D002294B +:105D700007BF05F11804042005F12804082000EBF2 +:105D8000400E0EEB0010204417E0082904BF3846EF +:105D900040240CD0042904BF4046102407D0022917 +:105DA00007BF05F11800042405F12800082404EBBE +:105DB000C40404EB440400EB44009CF8CCC0022A69 +:105DC00008BF4FF47A740DD0012A04BF56464FF431 +:105DD000C86407D0042A07BF5E4640F698046C4E9C +:105DE00040F6E444344404F2E7364FF47A74B6FBE8 +:105DF000F4F4C3EB031606EB860604EB8604082ACC +:105E000052D0042A4BD0022A0CBF05F1180605F126 +:105E100028064FF019020CBF4FF0040A4FF0080A91 +:105E200012FB0A6212FB0342082908BF40230BD071 +:105E3000042908BF102307D0022907BF4FF0180913 +:105E400004234FF028090823C3EBC30300E030E02C +:105E500003EB430309EB43031A4411F00C0F08BF93 +:105E60004FF0000C6244082908BF40210CD00429DF +:105E700004BF4746102107D0022907BF05F11807C4 +:105E8000042105F128070821C1EBC10101EB410103 +:105E900007EB41011144084400F526740EE0464624 +:105EA00014224FF0100ABBE73E4614224FF0400A7E +:105EB000B6E710F0020F18BFFFDF02D02046BDE8A2 +:105EC000F08F022A08BF4FF47A700DD0012A04BF68 +:105ED00056464FF4C86007D0042A07BF5E4640F616 +:105EE00098002B4E40F6E440304400F2E73C4FF47B +:105EF0007A70BCFBF0F0C3EB031C0CEB8C0C00EBDA +:105F00008C0C082A04BF142040220CD0042A44D050 +:105F1000022A0CBF05F1180705F128074FF01900F8 +:105F20000CBF0422082210FB027010FB03C00829DA +:105F300008BF40210BD0042908BF102107D0022937 +:105F400007BF4FF0180904214FF028090821C1EBC1 +:105F5000C10101EB410109EB410108441AE00000D5 +:105F6000CC000020A40A0020B00B0020D80B002099 +:105F7000000C002018520200F18913002052020088 +:105F80001052020068360200A2240200D0FB010079 +:105F900030D3010000F5B27490E714204746102278 +:105FA000C1E7F94840F271210068806A48437047B0 +:105FB000F548006890F83500002818BF01207047A8 +:105FC00010B5F24C207B022818BF032808D1207D91 +:105FD00004F1150105F0E8FD08281CBF012010BDE3 +:105FE000207B002816BF022800200120BDE81040B9 +:105FF000FFF72EBDE449096881F8300070472DE9AC +:10600000F047E14D2968087B002816BF02280020D0 +:10601000012048730E31FFF705FD2968087B02282F +:1060200016BF03280122002281F82F20082081F8C2 +:106030002D00487B0126002701F10E03012804BF33 +:106040005B7913F0C00F0AD001F10E03012804D1CF +:10605000587900F0C000402801D0002000E0012065 +:1060600081F82E00002A04BF91F8220010F0040FDE +:1060700006D0087D153105F097FD296881F82D00BF +:1060800028684760FCF720FF2968C04C4FF00009E2 +:10609000886094F82D0005F0A3FD804694F82F0049 +:1060A000002818BFB8F1000F04D01021404606F0B8 +:1060B000D4FB68B194F8300000281CBF94F82E007F +:1060C00000281DD0607B04F10E0101280ED012E0E3 +:1060D00066734A4604F10E014046FFF7F8FC94F857 +:1060E0002D1004F10E0005F074FE09E0487900F06F +:1060F000C000402831D0394604F10E00FFF71EFDE4 +:106100002868C77690F8220010F0040F08BFBDE899 +:10611000F087002794F82D0005F06BFD040008BF00 +:10612000BDE8F087102106F098FB002818BFBDE8F5 +:10613000F08728683A4600F11C01C6762046FFF732 +:10614000C6FC286800F11C01914806F07AFFBDE802 +:10615000F04701218E4806F08FBF05F073FE4A46D6 +:1061600004F10E01FFF7B3FCCAE778B5874904468E +:10617000854D407B08732968207808706088ADF8E9 +:10618000000080B200F00102C0F3400342EA430283 +:10619000C0F3800342EA8302C0F3C00342EAC302B1 +:1061A000C0F3001342EA0312C0F3401342EA431261 +:1061B000C0F3801042EA80104884E07D012808BFC7 +:1061C000012607D0022808BF022603D0032814BFE7 +:1061D000FFDF0826286880F8BA60607E012808BFC3 +:1061E000012607D0022808BF022603D0032814BFC7 +:1061F000FFDF0826286880F8BB60217B80F8241028 +:10620000418C1D290CBF002161688162617D80F88D +:106210003510A17B002916BF02290021012101753B +:10622000D4F80F10C0F81510B4F81310A0F8191016 +:10623000A17EB0F8CE2061F30302A0F8CE20E17E6B +:10624000012918BF002180F83410002078BD4E4885 +:106250000068408CC0F3001119B110F0040F05D094 +:1062600002E010F0020F01D00020704701207047BB +:10627000454A00231268C2F8C030B2F822C0BCF10F +:106280001D0F02BFC2F8C83082F8C4307047002921 +:1062900008BFC2F8C8300AD0936A40F2712C03FBE1 +:1062A0000CF31944491EB1FBF3F1C2F8C81082F88F +:1062B000C40070470346344810B50168D1F8C820BF +:1062C000002A1ABFD1F8C0C0BCF1000F012405D0CC +:1062D0009A4205D90124D01AC1F8C800204610BD41 +:1062E00091F82210002411F0010F1CBF40680088B3 +:1062F0004FF0430108BF002001F017F9EEE72248F4 +:10630000006890F8B70000280CBF012000207047FB +:1063100070B51F2834BF04461F2400221A4D286878 +:1063200080F8B920224678300EF014FC286801214C +:1063300080F8974080F8B91070BD10B51F2828BFAD +:106340001F20C2B2104C0023206880F8B83080F8BB +:10635000B72098300EF0FEFB2168012081F8B800CC +:1063600010BD0949096881F8BD00704706480068FA +:1063700090F8220000F0010070470348006890F890 +:106380002200C0F340007047CC000020A40A002087 +:10639000B00B0020FE48006890F82200C0F34010C7 +:1063A0007047FB48006890F82200C0F3C0007047B7 +:1063B00001207047F648006890F8BB00704770B540 +:1063C000FEF77CFFFEF730FFFEF760FEFEF7BDFE36 +:1063D000EF4C2068D0F8C010491CC0F8C01090F8ED +:1063E0003300002530B1FEF77FFFFEF794F92068F7 +:1063F00080F833502068457090F8C410F9B1D0F897 +:10640000C02091421BD8042002F08AFA206890F83C +:10641000220010F0010F0CD060684321008801F0C9 +:1064200084F860680088FAF751FDBDE87040FAF71B +:10643000E7B9BDE870404321002001F076B8D0F8FC +:10644000C81019B1D0F8C020914202D990F8370095 +:10645000D8B1042002F064FA206890F8220010F00D +:10646000010F0CD060683C21008801F05EF8606884 +:106470000088FAF72BFDBDE87040FAF7C1B9BDE816 +:1064800070403C21002001F050B8BDE87040002071 +:1064900002F046BA2DE9F84FBD4E804617463068E7 +:1064A0008B464FF0000A458C15F0030F10D015F005 +:1064B000010F05F0020005D0002808BF4FF0010AC7 +:1064C00006D004E0002818BF4FF0020A00D1FFDF19 +:1064D0004FF000094C4615F0010F05F002000BD0FB +:1064E00070B915F0040F0BD049F00800002F18BF49 +:1064F00040F0030440D090E010B115F0040F0DD02F +:1065000015F0070F10D015F0010F05F0020036D07E +:10651000002808BF15F0040F27D03DE0002F18BF5A +:1065200049F0090479D134E02FB149F0080415F09D +:10653000200F14D071E0316805F0200291F8770047 +:10654000104308BF49F0010467D049F0180415F062 +:10655000200F62D191F8BA1008295AD156E031685B +:1065600091F8BA10082951D153E049F00800002FE2 +:1065700018BF40F0010450D140F010044DE0002855 +:1065800018BF15F0040F07D0002F18BF49F00B04F7 +:1065900043D149F0180440E015F0030F3CD115F049 +:1065A000040F39D077B1316849F0080091F8BA107A +:1065B00008290CBF40F0020420F0020415F0200F5F +:1065C00022D02AE0316805F0200291F877001043CC +:1065D00008BF49F0030420D049F0180015F0200F3F +:1065E00009D000BF91F8BA10082914BF40F0020486 +:1065F00020F0020411E091F8BA20082A14BF40F0FC +:10660000010020F00100EDE7082902D024F0010488 +:1066100003E044F0010400E0FFDF15F0400F18BF75 +:10662000FFDFA8F8009098F80000072120F0200074 +:1066300088F80000404606F0D2FC5146404606F07D +:10664000D1FE2146404606F0D6FE14F0010F0CD0D4 +:106650003068062300F10E010022404606F0A8FE35 +:106660003068417B404606F0FAFC14F0020F1BD064 +:106670003068BBF1000F0BD000F11C010623012292 +:10668000404606F095FE0121404606F0F5FC0BE081 +:1066900000F1150106230122404606F089FE30680C +:1066A000017D404606F0E8FC14F0040F18BFFFDF40 +:1066B00014F0080F17D0CDF800903068BDF8001026 +:1066C0000223B0F8CE00020962F30B01ADF800100E +:1066D0009DF80110032260F307118DF8011069463F +:1066E000404606F065FE012F16D1306890F877001D +:1066F00090B1404606F072FE3368401CC0B293F879 +:106700007710C0F125008142B8BF084682B203F17C +:106710005801404606F09DFE0020002818BFFFDF0C +:106720000020002818BFFFDF0020002818BFFFDF6F +:10673000BDE8F88F2DE9F843154C2068002808BF04 +:10674000FFDF2068417811BB0178FF2926D00027A0 +:1067500080F83170877080F837703846FEF703FD97 +:10676000FEF7E5F9206890F9BD00FEF770FA0948D8 +:10677000FEF777FA0848FEF7E2FC206890F824005C +:1067800010F0010F0DD02520FEF773FA10E005E0A0 +:10679000CC0000200C520200095202000C20BDE87F +:1067A000F88310F0020F18BF262067D0FEF761FAB9 +:1067B000206890F8BA102520FEF779F9206880F853 +:1067C0002C70FEF7CAFC2068002190F8BA20084619 +:1067D000FEF779FB0F210520FEF70DFA2068FF4D2B +:1067E000012690F82E10002901BF90F82F100029E3 +:1067F00090F8220010F0040F70D0FCF765FB804683 +:10680000206841468068FDF76DF8F54990FBF1F985 +:1068100001FB190041424046FCF75FF80146206841 +:10682000816041684944416005F0BBF90146206838 +:10683000426891426DD8C0E901784FF0010895F89F +:106840002D0005F0CDF9814695F82F00002818BFDE +:10685000B9F1000F04D01021484605F0FEFFA0B1A9 +:1068600095F8300000281CBF95F82E00002824D091 +:10687000687B05F10E01012815D019E010F0040F16 +:1068800014BF2720FFDF91D192E732466E7305F1E6 +:106890000E014846FFF71BF995F82D1005F10E0083 +:1068A00005F097FA09E0487900F0C000402816D0BA +:1068B000414605F10E00FFF741F9206890F82200EB +:1068C00010F0040F25D095F82D0005F092F95FEA3D +:1068D00000081ED0102105F0C0FF40B119E005F0FE +:1068E000B1FA324605F10E01FFF7F1F8E5E720684D +:1068F000324600F11C01C6764046FFF7E8F82068F2 +:1069000000F11C01B74806F09CFB0121B54806F0D8 +:10691000B3FB2068417B0E30FEF751F9206890F8F8 +:10692000B81079B390F8B72080F8772000F198017B +:1069300058300EF054F9206890F82210C1F300117D +:10694000E9B9B0F8CE0002210609ADF8006068464A +:10695000FDF7F2FA28B1BDF80000C0F30B00B04219 +:1069600004D1BDF80000401CADF800002168BDF85E +:106970000000B1F8CE2060F30F12A1F8CE202068FD +:1069800080F8B870206890F8B91059B190F8972045 +:1069900080F8572000F1780138300EF020F9206897 +:1069A00080F8B9702068B0F8CE10D0F8C02009097E +:1069B00051FA82F190F8BC20DFF82CC211446346F2 +:1069C0000022E1FB0C3212096FF0240302FB0311D9 +:1069D00080F8BC1090F82210824E90F81B80C1F312 +:1069E000001106F1280900295DD03780317821F0A7 +:1069F00020013170408C132837D01CDC10284DD07A +:106A0000122846D0FFDF00BF05F10E01754806F0E1 +:106A10000AFB697B734806F022FB2068418C1D2924 +:106A200018BF15297ED090F8772000F15801304624 +:106A300006F04BFB7EE0152818BF1D28E2D101218E +:106A4000304606F0CCFA3078B8F1000F40F0200064 +:106A50003070206812D000F11C01304606F0F1FAC7 +:106A60000121304606F008FBCEE70021304606F053 +:106A7000B6FA307840F020003070C5E700F115011B +:106A8000304606F0DEFA2068017D304606F0F4FA62 +:106A9000BAE70621304606F0A2FAB5E702213046F1 +:106AA00006F09DFAB0E7002241463046FFF7F2FCBF +:106AB000206890F87710002904BF408C10F0010F77 +:106AC00005D110F0020F08BF10F0200F04D00122F2 +:106AD00041464846FFF7DEFCF07810F03F0F1CBF40 +:106AE000307910F0100F25D0304606F076FA226883 +:106AF000014692F82400C0F38003C0F3400C6344C5 +:106B000000F00100034492F82C00C0F38002C0F3AF +:106B1000400C624400F001001044181AC0B200F0AA +:106B200018FD00E006E00090032304226946304689 +:106B300006F03EFC206890F82200C0F30010B0B1CF +:106B40002A4E04213046378006F049FA05F10E013D +:106B5000304606F068FA697B304606F080FA206815 +:106B600000F1380190F85720304606F0D2FA05F0CF +:106B70008DF803211E4805F01CF9216881F83300C7 +:106B80000020BDE8F8831B49486070472DE9F843B1 +:106B9000184C8046206890F8312032B1408C1D2876 +:106BA00008BFFFDFBDE8F84309E4012631B390F8E0 +:106BB000BC00FEF75EF8206890F8BB102520FDF7BA +:106BC00076FF206801224FF4967190F8BB300020C8 +:106BD000FEF7ABF90848FEF7C9FA10E0A40A002056 +:106BE00040420F00B00B002053E4B36E000C0020B5 +:106BF000280C0020CC000020D80B002006E02068E4 +:106C00004670867080F83160BDE8F883F948FEF779 +:106C1000ADFA2068002590F8241090F82C0021EAA5 +:106C2000000212F0010F18BF01250ED111F0020F62 +:106C300004D010F0020F08BF022506D011F0040F97 +:106C400003D010F0040F08BF04250027B8F1000F8F +:106C50005CD0012D1CD0022D08BF26201CD0042D95 +:106C600014BFFFDF272017D0206890F8BA10252026 +:106C7000FDF71DFF206890F82210C1F3001171B1DB +:106C8000002201234FF496711046FEF74EF93DE0C5 +:106C90002520FDF7EEFFE7E7FDF7EBFFE4E790F8CF +:106CA000BA3001224FF496710020FEF73EF9D14828 +:106CB000C17811F03F0F1CBF007910F0100F25D0E4 +:106CC000CC4806F08AF92368014693F82420C2F3E1 +:106CD0008000C2F3400C604402F0010200EB020CA1 +:106CE00093F82C20C2F38000C2F34003184402F052 +:106CF00001020244ACEB0200C0B200F02AFC00909A +:106D0000032304226946BB4806F052FB206890F832 +:106D10002C10294380F82C1090F8242032EA01012D +:106D200011D04670408C132820D01BDC102808BFDF +:106D3000BDE8F883122819D0C0F30010002818BF4E +:106D4000FFDFBDE8F883418C1D2908BF80F82C7057 +:106D5000E7D0C1F30011002914BF80F8316080F83A +:106D60003170DEE7152818BF1D28E5D1BDE8F843CE +:106D700001210846FEF7F0BA9F4810B50068417837 +:106D800041B90078FF2805D000210846FFF7FEFE34 +:106D9000002010BDFEF792FAFEF746FAFEF776F9EC +:106DA000FEF7D3F90C2010BD93490120096881F842 +:106DB000370070479049096881F83200704770B514 +:106DC000002601F01DFC002800F0C4808A4C2068D9 +:106DD000417801220025012905D0022901D003298B +:106DE00070D0FFDF70BD81780225B1B390F822002A +:106DF00010F0030F67D08148FEF7B8F92068012230 +:106E0000962190F8BB301046FEF78FF8216891F874 +:106E1000BB0091F8CC1010F00C0F08BF0021962099 +:106E2000FEF7BFF92068457090F8330058B1FDF7C0 +:106E30005EFC206890F8BB0010F00C0F0CBF4020E7 +:106E40004520FEF747FA206890F83400002808BF74 +:106E500070BDBDE87040FEF75CBA418CC1F3001212 +:106E60009AB1102929D090F8330020B1FDF73FFCEA +:106E70004020FEF72FFA6148FEF778F9206890F875 +:106E8000221011F0040F1FD029E090F8242090F870 +:106E90002C309A4211D190F87700002808BF11F0E9 +:106EA000010F05D111F0020F08BF11F0200F51D0D2 +:106EB000BDE870400121084668E6BDE87040002149 +:106EC000012063E619E045E090F83500012814BF81 +:106ED0000328102646F00E010020FEF73DFA206838 +:106EE00090F83400002818BFFEF713FA002196200E +:106EF000FEF757F92068457070BD817801B3418C69 +:106F000011F0010F21D080F8D02090F8D210B0F805 +:106F1000D40000F00AFB60680088F9F7D7FFF9F7A2 +:106F20006FFC20684570FEF7C9F9FEF77DF9FEF7A2 +:106F3000ADF8FEF70AF9BDE87040032001F0F0BC9F +:106F40008178BDE87040012020E611F0020F04BFF7 +:106F5000FFDF70BDBDE87040FFF731BAFFF72FBA11 +:106F600010B5254C206890F8341049B13630FEF742 +:106F7000DBF918B921687F2081F83600FEF7BFF9E8 +:106F8000206890F8330018B1FEF7AEF9FDF7C3FBA7 +:106F900001F036FBA8B1206890F82210C1F300116F +:106FA00079B14078022818BFFFDF00210120FFF7E8 +:106FB000EDFD2068417800291EBF40780128FFDFE1 +:106FC00010BDBDE81040FFF7FAB92DE9F0470A4FB0 +:106FD0000E4603283A68518C12D092F8320001F024 +:106FE000010410F1000918BF4FF001094FF001082A +:106FF0000CE00000B00B0020CC000020280C00208A +:10700000C1F340044FF000094FF00208FDF721FEE4 +:10701000054634EA090008BFBDE8F0873868FF4C30 +:1070200090F8330060B104F016FE30700146FF287E +:1070300006D0E01C04F004FE307804F017FE05438F +:107040002078C0F380113868027D914209D100F1A7 +:1070500015010622E01C0DF051FD002808BF01209B +:1070600000D000203178FF2906D0C0B9386890F8E8 +:107070002D00884215D112E098B12078E11CC0F3B0 +:10708000801004F091FD064604F0F4FE38B130465D +:1070900004F0AFFD18B1102105F0DFFB08B10120AD +:1070A00000E00020396891F8221011F0040F01D09F +:1070B000F0B11AE0CDB9DA4890F83500002818BFD1 +:1070C000404515D114F8030B2146C0F3801004F09D +:1070D0006BFD044604F0CEFE38B1204604F089FD75 +:1070E00018B1102105F0B9FB10B10120BDE8F087FF +:1070F0000020BDE8F0872DE9F04FCA4D804683B0EF +:10710000286800274078022818BFFFDF28687F24FE +:1071100090F8341049B13630FEF706F9002804BF64 +:10712000286880F83640FEF7EAF8BC4805F077FF9B +:107130000646B8F1000F00F0B081B84806F008F933 +:10714000002800F0AA81FDF752FD002800F0A5817B +:107150003046B24EFF21DFF8D0A24FF000084FF0CA +:10716000030B4FF00109062880F0B881DFE800F03A +:10717000FEFEFE03FE8F8DF8001069460320FFF728 +:1071800024FF002828687CD090F8341011B190F8C2 +:10719000001159B12868807801283ED0A348FDF736 +:1071A000E5FF286880F801B000F07BB99DF8003059 +:1071B00080F80091017880F80111FF2B10D000F2C7 +:1071C0000312511E184604F01DFD002808BFFFDF02 +:1071D000286890F8021141F0020180F802110DE0D8 +:1071E0003178C1F3801180F802118D49D1F88721DF +:1071F000C0F80321B1F88B11A0F80711286800F23C +:10720000091690F836007F2808BFFFDF286890F83D +:107210003610317080F83640BCE7844CDAF80490C0 +:1072200004F12806A4F800800721204605F0D7FEC7 +:107230000021204606F0D6F84946204606F0DBF845 +:107240000623002206F10901204606F0B1F828685D +:10725000417B204605F003FF286800F1380190F8D3 +:107260005720204606F0F5F82046FDF77FFF2868F6 +:107270000122962190F8BB300020FDF756FE90E7E2 +:10728000FFE78078002840F00A8100F006B98DF809 +:10729000081002A90520FFF798FE0028286800F0D2 +:1072A000F78082786249002A7ED0A1F11F066C68BF +:1072B00090F8BB90D6F80F00C4F80E00B6F8130093 +:1072C0006082707D2075B07D6075B6F81700E08231 +:1072D000B6F819006080B6F81B00A080B6F81D0053 +:1072E000E08004F108000DF0EBFD96F8240000F0BA +:1072F0001F00207696F82400400984F86C0184F879 +:10730000549084F85590286890F8CC1084F8561062 +:1073100090F8BD0084F857009DF80810686800F0E8 +:1073200081F9022001F0FCFAA6F12804DAF80090B5 +:10733000A4F800800821204605F051FE00212046D7 +:1073400006F050F84946204606F055F869463046A2 +:1073500005F07EFE304605F098FE0146204605F019 +:107360007EFE062300226946204600E0B6E006F0D5 +:107370001FF86946304605F05DFE304605F078FEA0 +:107380000146204605F078FE062301226946204684 +:1073900006F00EF82046FDF7E9FE28680122962146 +:1073A00090F8BB30002000E005E0FDF7BEFD286846 +:1073B00080F801B075E06C683278184E607BC2F3DB +:1073C000401210406073D6F80F00C4F80E00B6F8F3 +:1073D00013006082707D2075B07D6075B6F817006F +:1073E000E082B6F819006080B6F81B00A080B6F8FD +:1073F0001D00E0804FF0010A04F108000DF060FD6F +:1074000096F8240000F01F00207696F8240040092A +:1074100084F86C0184F854A00CE00000280C0020D3 +:10742000A40A0020CC00002004520200000C00201E +:10743000470C002084F855A0286890F8CC1084F8F8 +:10744000561090F8BD0084F857009DF80810686841 +:1074500000F0E8F8286880F8D09090F8D210B0F8E2 +:10746000D40000F062F868680088F9F72FFDF9F79A +:10747000C7F9286880F80180FDF720FFFDF7D4FEEA +:10748000FDF704FEFDF761FE012001F049FA08E076 +:1074900090F82200C0F3001008B1012701E0FEF7C8 +:1074A0008EFF286890F8330018B1FDF71DFFFDF737 +:1074B00032F91FB100210120FFF768FB28684178ED +:1074C000002919BF4178012903B0BDE8F08F407849 +:1074D000032818BFFFDF03B0BDE8F08F286890F8DD +:1074E0002200C0F300100028D9D0D6E770B58A4C2E +:1074F00006460D462068807858B1FDF789FA216864 +:107500000346304691F8BB202946BDE8704001F0A3 +:1075100074BAFDF77DFA21680346304691F8BA2027 +:107520002946BDE8704001F068BA7C4A137882F8B9 +:10753000F530A2F8F60082F8F410012082F8F2008B +:1075400092F8C400002818BF92F8C00082F8F80032 +:10755000704778B50446704800230093006890F89F +:10756000BA20082A04BF4FF4C87240230DD0042A61 +:1075700004BF4FF4BF72102307D0022A07BF03F1E4 +:107580001802042303F128020823491D01FB0326E6 +:1075900090F8BC209DF8001062F3050141F0400511 +:1075A0008DF8005090F8BB00012826D002282BD07F +:1075B000082818BFFFDF2DD025F080008DF80000CF +:1075C000C4EB041106FB04F001EB810100EB810424 +:1075D0005348844228BFFFDF5248A0FB0410BDF887 +:1075E0000110000960F30C01ADF80110BDF80000B6 +:1075F0009DF8021040EA014078BD9DF8020020F09D +:10760000E0008DF80200D7E79DF8020020F0E000CE +:10761000203004E09DF8020020F0E00040308DF8BA +:107620000200C9E72DE9F0413B4D04460E462868AB +:1076300090F8D000002818BFFFDF0027286880F8E6 +:10764000D2702188A0F8D4106188A0F8EA10A1882F +:10765000A0F8EC10E188A0F8EE1094F86C1180F816 +:10766000F01090F82F1049B1427B00F10E01012A71 +:1076700004D1497901F0C001402935D090F830108B +:1076800041B1427B00F10E01012A04BF497911F09A +:10769000C00F29D0DE300DF001FC2348FF2E00780A +:1076A000C0F3801060761D48D0F88711C4F81A1016 +:1076B000B0F88B01E08328681ED0C0F8E410E18B9D +:1076C000A0F8E81000F1D802511E304604F09AFAF2 +:1076D000002808BFFFDF286890F8D71041F00201AA +:1076E00080F8D710BDE8F081D0F80E10C0F8DE1099 +:1076F000418AA0F8E210D0E7C0F8E470A0F8E87082 +:10770000617E80F8D710D4F81A10C0F8D810E18B39 +:10771000A0F8DC10BDE8F081CC000020A40A002015 +:10772000C4BF030089888888280C0020FE48406870 +:1077300070472DE9F0410F460646014614460120E8 +:1077400005F082FA054696F85500FEF75FF8014607 +:1077500096F85500022808BFF44807D0012808BF52 +:10776000F34803D004280CBFF248F34808444FF410 +:107770007A7100F2E140B0FBF1F0718840F27122C1 +:107780005143C0EB4100001BA0F5597402F0E4FD29 +:10779000002818BF1E3CAF4234BF28463846A042DE +:1077A00003D2AF422CBF3C462C467462BDE8F08148 +:1077B0002DE9FF4F8FB0044690F855601C9899460C +:1077C00040EA0900019094F86500002790460D28D2 +:1077D0000CBF012000200990B9F1000F04BF94F8FC +:1077E0000C0103282BD1099848B3B4F88E01404509 +:1077F00025D1D4F81401C4F80001608840F2E241B8 +:107800004843C4F80401B4F85A11B4F8E600084437 +:10781000C4F80801204602F0A9FDB4F89201E08204 +:1078200094F890016075B4F894016080B4F8960102 +:10783000A080B4F89801E080022084F80C01D4F80C +:1078400064010C90B4F8E6A0B4F85801D4F860B123 +:10785000D4F854110891B9F1000F03D094F8201115 +:1078600049B193E004F1E001059174310A9104F506 +:10787000A075091D07E004F59A710591091D0A918B +:1078800004F59275091D0B91B4F85810A8EB00008F +:10789000A8EB010109B200B20391002805DAD4F87F +:1078A0005001089001200190084694F80C1100291D +:1078B00071D0012900F04482022900F0658103297A +:1078C00018BFFFDF00F0848239460898FBF705F8FF +:1078D0000A99012640F2712208600B98A0F80080F6 +:1078E000002028702E710A980068A8606188D4F87A +:1078F00014015143C0EB41009049A0F54D708861DF +:107900004969814287BF059908600598016005981B +:10791000616A0068084400F5D270E86002F01CFD5E +:1079200010B1E8681E30E8606E71B4F8D000A0EBCA +:10793000080000B20028C4BF03206871099800281D +:107940001C9800F0C282C0B1B4F8F81000290CBF36 +:107950000020B4F8FA00A4F8FA0094F8FC20401CC7 +:107960005043884209D26879401E002805DD6E71B7 +:10797000B4F8FA00401CA4F8FA00B9F1000F00F0C6 +:10798000C78294F82001002800F0BE8213B00220C4 +:10799000BDE8F08FFFE7BBF1000F08BFFFDF94F8F1 +:1079A0005510614890F8280005F0FBFA0790E08A2E +:1079B00040F271214143079800EB410210980021E9 +:1079C000002806D000FB02F15D48B1FBF0F000F1A9 +:1079D0000101C4F81011608840F2E24100FB01F29D +:1079E00010994FF0000006D0554801FB02F1B1FBA1 +:1079F000F0F000F10100C4F8140186B221464FF006 +:107A00000100D4F828A005F01FF9074694F85500A6 +:107A1000FDF7FCFE014694F85500022808BF4348D4 +:107A200007D0012808BF424803D004280CBF4148B2 +:107A30004148084400F2E1414FF47A70B1FBF0F1A3 +:107A4000608840F271225043C1EB4000801BA0F5DA +:107A5000597602F081FC002818BF1E3EBA4534BF9B +:107A600038465046B04203D2BA452CBF56463E4631 +:107A7000666294F85500FDF7F7FE4FF47A7600F24F +:107A8000E140B0FBF6F000EB0B0794F85500FDF772 +:107A9000EBFE024694F85500022808BF234907D0A0 +:107AA000012808BF224903D004280CBF21492249DC +:107AB00002EB010AFDF7AAFE504400F2DB514FF43D +:107AC0007A70B1FBF0F0E18A40F271224A430799E3 +:107AD000D4F810A101EB4201081AA0EB0A003844C7 +:107AE000A0F12007607D40F2E24110FB01F0079019 +:107AF00094F8556016F00C0F18BF4DF6883103D17D +:107B00003046FDF783FE0146022E08BF074807D026 +:107B1000012E08BF064803D0042E0CBF05480648B6 +:107B2000084400F2E1410DE0500C00200436020050 +:107B3000A2240200D0FB0100C0D40100D400002028 +:107B400040420F004FF47A70B1FBF0F000EB4A01B5 +:107B5000079801EB000A3046FDF746FE504400F15D +:107B60006201FD48416194F85500FDF77DFE00F289 +:107B7000E1414FF47A70B1FBF0F05844381AB0F597 +:107B80003D7F38BFFFDF9FE6E28A40F27121D4F8E3 +:107B90000401514300EB410210980021002806D057 +:107BA00000FB02F1ED48B1FBF0F000F10101C4F877 +:107BB0001011618840F2E24001FB00F210994FF091 +:107BC000000006D0E54801FB02F1B1FBF0F000F146 +:107BD0000100C4F8140186B221464FF00100D4F828 +:107BE00028B005F031F8074694F85500FDF70EFE71 +:107BF000014694F85500022808BFD94807D001284B +:107C000008BFD84803D004280CBFD748D748084439 +:107C100000F2E1414FF47A70B1FBF0F0618840F27C +:107C200071225143C0EB4100801BA0F5597602F050 +:107C300093FB002818BF1E3EBB4534BF384658464C +:107C4000B04203D2BB452CBF5E463E466662BAF1E7 +:107C5000000F2FD11C9868B394F855603046FDF79B +:107C6000D5FD0146022E08BFBD4807D0012E08BF32 +:107C7000BC4803D0042E0CBFBB48BC48084400F2EB +:107C8000E1414FF47A70B1FBF0F0D4F81011E38ABF +:107C9000014440F27122D4F804015A4300EB42003F +:107CA000471A3046FDF7A0FD0C99081A3844A0F198 +:107CB00020070AE0E28A40F27121D4F8040151431E +:107CC00000EB4101D4F810010F1AD4F80821D4F8C0 +:107CD0001011D4F8000100FB021B607D40F2E2416C +:107CE00010FB01FA94F8556016F00C0F18BF4DF612 +:107CF000883103D13046FDF789FD0146022E08BFC9 +:107D0000974807D0012E08BF964803D0042E0CBF19 +:107D100095489648084400F2E1414FF47A70B1FB6F +:107D2000F0F000EB4B0082443046FDF75DFD50441F +:107D300000F1600188484161012084F80C01C3E52D +:107D4000618840F271235943D4F81421D4F800C15A +:107D5000C2EB410101FB00F70398D4F8081150442D +:107D6000401AD4F81031401E0CFB013100FB021BFD +:107D7000607D40F2E24110FB01FA94F8556016F084 +:107D80000C0F18BF4DF6883103D13046FDF73EFD8C +:107D90000146022E08BF724807D0012E08BF714865 +:107DA00003D0042E0CBF70487048084400F2E14133 +:107DB0004FF47A70B1FBF0F000EB4B008244304698 +:107DC000FDF712FD504400F16001634841617BE51D +:107DD000628840F27123D4F814115A43C1EB420176 +:107DE00001FB00F794F8640024281CBF94F8650098 +:107DF00024280BD1B4F88E01A8EB000000B20028B3 +:107E000004DB94F89101002818BF0646019870B36E +:107E1000BAF1000F2BD10C98002814BFBBF1000F52 +:107E2000FFDF94F8550010F00C0F14BF4DF68830AA +:107E3000FDF7ECFC022E08BF494907D0012E08BF10 +:107E4000484903D0042E0CBF47494849084400F272 +:107E5000E1414FF47A70B1FBF0F03F1A94F855000D +:107E6000FDF7C2FC0C99081A3844A0F120070398CA +:107E7000D4F81411504400FB01FA16F00C0F18BF8F +:107E80004DF6883103D13046FDF7C0FC0146022E85 +:107E900008BF334807D0012E08BF324803D0042E54 +:107EA0000CBF31483148084400F2E1414FF47A7088 +:107EB000B1FBF0F000EB4A0A3046FDF795FC504468 +:107EC00000F1600124484161FEE400287FF43CADEC +:107ED00094F80C0100283FF450AD618840F2712203 +:107EE000D4F814015143C0EB4101284604F0D7FDFA +:107EF0000004000C3FF441AD1D99002918BF088013 +:107F0000012013B0BDE8F08F94F85C01FBF736FB5D +:107F100094F85C012946FBF71FFA00281CBF89F082 +:107F2000010084F82101002013B0BDE8F08F2DE995 +:107F3000F04F0F4C074683B020788946064E002547 +:107F40004FF00208032804BF207BB8427DD160684F +:107F50003061207803280DE0D400002040420F005B +:107F600004360200A2240200D0FB0100C0D40100AC +:107F7000500C002018BFFFDF0327B9F1080F78D29B +:107F8000DFE809F0040E1B1B167777726562FEF7B7 +:107F9000D1FB002818BFFFDFB77003B0BDE8F08F3A +:107FA000FEF7EAFE002818BFFFDF03B0BDE8F08F40 +:107FB00003B0BDE8F04FFDF7F3B92775257494F8C9 +:107FC0002C00012658B14FF47A71A069FAF785FCAC +:107FD000A061002104F1100004F061FD1AE001210C +:107FE0006846FBF79FFF9DF8000042F21071000207 +:107FF000B0FBF1F201FB1205FDF7D3FF0544294662 +:10800000A069FAF76AFCA061294604F1100004F0A7 +:1080100046FD461C208C411C0A293CBF304420846C +:10802000606830B1208C401C0A2828BF84F8158075 +:1080300000D267753046FEF73DF9002804BF03B053 +:10804000BDE8F08F607A002801E014E011E01CBF69 +:1080500003B0BDE8F08F207B04F11001FBF77CF941 +:10806000002808BFFFDFA0E7207BFAF70EFF25708E +:108070009BE7FFDF99E7202F28BFFFDFDFF804A48D +:1080800007213AF81700F8F7EFFD040008BFFFDFFB +:10809000202F28BFFFDFFB48218830F817008842D7 +:1080A00018BFFFDF01273461B9F1080F80F0548158 +:1080B000DFE809F0049EA6A6A1F0F0EFC4F8605135 +:1080C000F580C4F8645194F8210138B9FAF7FCFE40 +:1080D000D4F82C11FBF706FC00281BDCB4F81E11A9 +:1080E000B4F85800814206D1B4F8D410081AA4F8A4 +:1080F000D600204605E0081AA4F8D600B4F81E11F0 +:108100002046A4F85810D4F84811C4F82C11C0F82F +:1081100050111DE0B4F81C11B4F85800091AA4F865 +:10812000D610B4F81C112046A4F85810D4F82C111D +:10813000C4F84811C4F85011D4F83411C4F8E01050 +:10814000D4F83811C4F85411B4F83C11A4F85811FB +:1081500001F0B6FFFAF792FE94F855A0814650461A +:10816000FDF754FBBAF1020F08BFC74909D0BAF1B5 +:10817000010F08BFC54904D0BAF1040F0CBFC449B0 +:10818000C44908444FF47A7100F2E140B0FBF1F1C8 +:10819000D4F8140140F27122014460885043C1EBCD +:1081A0004000A0F1300AB9F1B70F98BF4FF0B709FE +:1081B0002146012004F048FD4844AAEB0000A0F24B +:1081C0001939A2462146012004F03EFDDAF82410B8 +:1081D0009C30814288BF0D1AC6F80C904D4538BFBF +:1081E000A946C6F8089084F8207186F80280DCE67B +:1081F00002F0ADF801E0FDF7D3F884F82071D4E681 +:10820000FAF762FED4F8502101461046FBF76AFBEC +:1082100048B1628840F27123D4F814115A43C1EB7B +:108220004201B0FBF1F094F865100D290FD0B4F8BD +:108230005820B4F81E1113189942AEBF481C401CB8 +:108240001044A4F81E0194F8220178B905E0B4F8AE +:108250001E01401CA4F81E0108E0B4F81E01B4F889 +:10826000D410884204BF401CA4F81E01B4F85A017F +:10827000DFF82492401CA4F85A01B4F88000B4F846 +:108280007E10401AB4F85810401E08441FFA80FBB4 +:1082900024E053E060E000BF96F80080B8F10C0FD6 +:1082A00028BFFFDF39F8188094F86CA1BAF10C0FE1 +:1082B00028BFFFDF39F81A000023404481B202A82A +:1082C000CDE90050B4F81E212046FFF771FA0028CE +:1082D0003FF46BAE012818BFFFDF27D0B4F81E01B2 +:1082E000ABEB000000B20028D6DA082084F8740056 +:1082F00084F87370204601F034FB84F80C5194F834 +:108300005C514FF6FF77202D00D3FFDF5D4820F84A +:10831000157094F85C01FAF7B8FD202084F85C0130 +:10832000307903B0BDE8F04FF3F764BDB4F81E0137 +:10833000BDF808100844A4F81E01CFE794F80C011A +:10834000042818BFFFDF84F80C5194F85C514FF6F5 +:10835000FF77202DDAD3D8E7FFDF26E610B54F4CA4 +:10836000207850B101206072FEF724FD20780328A8 +:1083700005D0207A002808BF10BD0C2010BD207B3E +:10838000FBF7FCF8207BFBF746FB207BFAF77DFD33 +:10839000002808BFFFDF0020207010BD2DE9F04F3E +:1083A0003E4F83B0387801244FF0000840B17C7212 +:1083B0000120FEF7FFFC3878032818BF387A0DD06B +:1083C000DFF8DC9089F8034069460720F8F7D5FB11 +:1083D000002818BFFFDF4FF6FF7440E0387BFBF743 +:1083E000CDF8387BFBF717FB387BFAF74EFD0028FA +:1083F00008BFFFDF87F80080E2E7029800281CBF73 +:1084000090F80C1100292AD00088A0421CBFDFF888 +:1084100074A04FF0200B4AD00721F8F725FC040088 +:1084200008BFFFDF94F85C01FBF7F5FA84F80C81D4 +:1084300094F85C514FF6FF76202D28BFFFDF2AF815 +:10844000156094F85C01FAF720FD84F85CB1694688 +:108450000720F8F792FB002818BFFFDF22E06846EC +:10846000F8F769FB0028C8D021E0029800281CBF5B +:1084700090F80C11002915D00088A0F57F41FF3934 +:10848000CAD114E0840C002004360200A2240200A9 +:10849000D0FB0100C0D4010028520200500C002083 +:1084A000D40000206846F8F746FB0028DDD089F8A4 +:1084B000038087F82C8087F80B8003B00020BDE88C +:1084C000F08F70B50446FD4890F80004FC4D40095B +:1084D00095F800144909884218BFFFDF95F8140D7C +:1084E0004009F84991F800144909884218BFFFDF94 +:1084F000F549002001220C7188700A704870C8701C +:10850000F2490870BDE8704048E7EF4908707047CD +:108510002DE9F843ED4C06468846207800285CD1CA +:10852000EB48FAF758FC2073202856D003276660E2 +:108530002770002565722572AEB1012106F1FC009D +:10854000FBF719FD0620F8F737FB81460720F8F7FF +:1085500033FB96F8FC104844B1FBF0F200FB12101C +:10856000401C86F8FC00FAF789FCDA49091838BF84 +:1085700040F2F65000F23D1086B2FDF79BFBE06141 +:10858000FDF70FFD4FF0010950B384F80A90012167 +:108590006846FBF7C7FC9DF8000042F2107100022C +:1085A000B0FBF1F201FB12000644FAF78DFC3146F4 +:1085B000FAF793F9A061277567752574207B04F19C +:1085C0001001FAF7C9FE002808BFFFDF258400204C +:1085D000FEF7F0FB0020BDE8F8830C20BDE8F8832F +:1085E000FAF772FC3146FAF778F9A061A57284F8BF +:1085F0002C90A8F226502063DDE7B34948707047FD +:10860000B24810B5417A0124002918BF002409D1CD +:1086100090F82C1031B1416A006B814284BF002474 +:10862000FEF7C2FB204610BD70B5A74C0546E0889A +:10863000401CE080D4E902016278D5F86061002A2C +:108640001CBF324604F053FAA060864208D895F861 +:108650000C01012804D0E078002804BF012070BD7F +:10866000002070BD70B50C4640F2E24100FB01F500 +:108670002046FDF7CBF8022C08BF974907D0012C04 +:1086800008BF964903D0042C0CBF9549954908446E +:108690004FF47A7100F2E140B0FBF1F000F54D705B +:1086A00085428CBF281A002070BD2DE9F04F83B0A1 +:1086B0004FF00009044680F8209190F8DE00002871 +:1086C00007BF94F80C01032803B0BDE8F08FFAF758 +:1086D000FBFBD4F8502101461046FBF703F90028B4 +:1086E000DCBF03B0BDE8F08F628840F27123D4F89C +:1086F00014115A43C1EB4201B0FBF1F0411CB4F834 +:1087000058000144A4F81C11B4F8D410B4F81C218A +:10871000891A09B20029DCBF03B0BDE8F08F01213E +:1087200084F82211B4F88010B4F87E206E4F891AB4 +:10873000491E084485B2DFF890A10DF1080B25E031 +:108740009AF800600C2E28BFFFDF37F8166094F807 +:108750006C81B8F10C0F28BFFFDF37F81800CDE9A6 +:10876000009B3044B4F81C2181B201232046FFF75E +:108770001FF8002804BF03B0BDE8F08F01280FD018 +:10878000022812BFFFDF03B0BDE8F08FB4F81C0170 +:10879000281A00B20028BCBF03B0BDE8F08FCFE7B5 +:1087A000B4F81C01BDF808100844A4F81C01EDE75A +:1087B0002DE9F0430422002583B006297DD2DFE8AD +:1087C00001F0074B03191951044680F80C2107E00A +:1087D00004463D48C178002918BF84F80C210CD00C +:1087E000FAF77EFAA4F85A51B4F85800A4F81E011A +:1087F00084F8225103B0BDE8F08306780C2E28BF20 +:10880000FFDF394F94F80C0137F816604FF001097B +:10881000032807D00128E3D194F86C81B8F10C0F3C +:108820000AD308E0C4F80851C4F8005194F86C81E8 +:10883000B8F10C0F00D3FFDF37F81800CDE9009531 +:10884000304481B2B4F8D42000232046FEF7B0FFB4 +:10885000002818BFFFDFC3E7032180F80C1103B025 +:10886000BDE8F0830546876AB0F81401294686B250 +:10887000012004F0E9F9044695F85500FCF7C6FF1D +:1088800095F85510022908BF134907D0012908BFE0 +:10889000124903D004290CBF1149124908444FF46E +:1088A0007A7100F2E140B0FBF1F0698840F2712288 +:1088B0005143C0EB4100801B18E02DE001E000E0D7 +:1088C0000BE000E019E000E0D4000020500C002094 +:1088D0002F7F01000AFAFFFF04360200A2240200E3 +:1088E000D0FB0100C0D4010028520200A0F5597647 +:1088F00001F032FD002818BF1E3EA74234BF2046BB +:108900003846B04228BF344602D2A74228BF3C4670 +:108910006C6203B0BDE8F083FFDF03B0BDE8F08315 +:10892000F8B5894C0246874F00256168606A052AC0 +:1089300048D2DFE802F0032F34373E00A07A002649 +:1089400060B101216846FBF7F7FA9DF8000042F29A +:1089500010710002B0FBF1F201FB1206FDF721FBE2 +:108960008119A069F9F7B9FFA0612574032060752A +:10897000607A38B9207B04F11001FAF7EDFC002889 +:1089800008BFFFDF2584FAF7ABF93879BDE8F84076 +:10899000F3F730BABDE8F840002100F06DB8C1F837 +:1089A0006001F8BDD1F86001BDE8F840012100F098 +:1089B00063B884F82C50FAF793F93879BDE8F84099 +:1089C000F3F718BAFFDFF8BD70B55E4CA178022945 +:1089D00006BFE188002970BD2569C5F8640195F8D6 +:1089E0005500FCF701FFD5F86411081AA16801448D +:1089F000A160E1680844E06070BD70B5054651486B +:108A000090F802C0BCF1020F06BF006900F5B07417 +:108A10004E4C002904BF256070BD4FF47A760129C1 +:108A20000DD002291CBFFFDF70BD1046FCF707FF09 +:108A300000F2E140B0FBF6F0281A206070BD184645 +:108A4000FCF712FF00F2E140B0FBF6F0281A2060BC +:108A500070BD3D48007800281CBF0020704710B54D +:108A60000720F8F79BF880F0010010BD3648007829 +:108A7000002818BF012070472DE9F047324C82B022 +:108A8000002584F82C50D4F8188084F82810E5725A +:108A900081462570012727722946606803F082FB12 +:108AA0006168C1F85081267B81F85C61C1F86091F2 +:108AB000C1F85481B1F80080202E28BFFFDF244880 +:108AC00020F81680646884F80C51DFF87880A4F8E8 +:108AD000585198F800600C2E28BFFFDFDFF8749023 +:108AE00039F816A094F86C610C2E28BFFFDF39F816 +:108AF00016000023504481B200951A462046019585 +:108B0000FEF756FE002818BFFFDFC4F80851C4F86E +:108B1000005184F80C71A4F81E51A4F81C5184F87B +:108B20002251B4F85800401EA4F85800A4F85A5135 +:108B3000FAF7D6F898F8040002B0BDE8F047F3F76A +:108B400059B90000D4000020500C0020740C002003 +:108B5000840C00202852020070B5FE4C21690A885E +:108B6000A1F8FC2181F8FA0191F85400012808BF0E +:108B7000012508D0022808BF022504D0042816BF0A +:108B800008280325FFDF206980F8FE5190F8550082 +:108B9000012808BF012508D0022808BF022504D0FB +:108BA000042816BF08280325FFDF2069012180F86B +:108BB000FF5180F8F811002180F8A4112079BDE858 +:108BC0007040F3F717B92DE9F04FE24C83B0A0796C +:108BD00010F0010F04BF03B0BDE8F08FA0690123BE +:108BE0000521C578206990F86520583003F0EDFE26 +:108BF00068B1A81E0A2806D2DFE800F009090505B9 +:108C0000090905050909A07840F00800A070A078BE +:108C100000281CBF03B0BDE8F08FA0694FF0200909 +:108C20004FF00208C778002F1CBF012F162F1DD14F +:108C3000206990F8640003F0B1FEB8B1216991F8A1 +:108C400064001F2812D0202808D0162F0CBF84F8EB +:108C5000029084F8028003B0BDE8F08F262081F8EE +:108C60006400162F1CBF2A20FFF776FF47F6FE7A16 +:108C7000012600254FF0280B0C2F00F03B8109DC6A +:108C800080F05F84DFE807F05A3923CCFDFDFCFB60 +:108C9000FAFD9CC3152F00F046820DDC112F00F069 +:108CA000C783122F00F0C081132F00F0B081142F62 +:108CB00000F0CE8100F045BC162F00F06782182F1F +:108CC00000F0CC82FF2F00F0358400F03ABC206920 +:108CD0000123194690F86720583003F076FE0028EB +:108CE00040F03184A06904F081FC216981F87201AF +:108CF000072081F8670000F026BC206901230021CD +:108D000090F86520583003F060FE002800F0C98319 +:108D1000A06904F068FC2169A1F88E01B1F858201F +:108D2000801A00B28245A8BF002843DD01F5C87152 +:108D3000A06904F053FC0B20216937E0206901236E +:108D4000002190F86520583003F03FFE002800F025 +:108D5000A883A06904F01EFC002800F0F283A0693B +:108D60002169B0F80D20A1F88E21B1F85830D21A3F +:108D700012B29245A8BF002A1CDD027981F8902129 +:108D8000B0F80520A1F8922104F0F7FB2169A1F8C1 +:108D90009401A06904F0F4FB2169A1F89601A0698F +:108DA00004F0F5FB2169A1F898010D2081F8650018 +:108DB00000F0C9BB81F874B081F8736000F0C3BBE8 +:108DC00020690123002190F86520583003F0FDFD53 +:108DD000002820690CD0A0F88A5090F88C10491C0B +:108DE00080F88C105FF0100180F8651000F0ABBBCC +:108DF00090F8652001230521583003F0E6FD002896 +:108E00001CBF0820A07040F09E8300F04ABB206980 +:108E100090F86510112908BF122140F0A082E3E705 +:108E200020690123002190F86520583003F0CDFD22 +:108E300080B9206990F86520122A0BD00123052102 +:108E4000583003F0C2FD002818BF082000F0298325 +:108E500000F099B9206990F88E1031B9A0F88A50C5 +:108E600090F88C10491C80F88C1000F1E801A06982 +:108E700004F0D5FB206900F1C00103E0A4E0F6E2B4 +:108E800023E05EE3A06904F0D5FB206990F8C001FF +:108E9000002818BFFFDF20690188A0F8C21100F583 +:108EA000E271A06904F0A9FB206900F5E671A069F0 +:108EB00004F0ABFB206980F8C061142180F86510D4 +:108EC0002079F2F797FF00F03EBB206990F865101B +:108ED000172940F0448290F88C10491E49B280F85E +:108EE0008C100029B8BFFFDF1B20216981F86500C5 +:108EF00000F029BB206990F8661011F0020F09D02C +:108F000090F8642001230821583003F05EFD00280A +:108F100000F0C782206990F8900010F0020F14D181 +:108F2000A06904F09BFB216981F89100A069B0F869 +:108F30000520A1F89220B0F80700A1F8940091F85C +:108F4000900040F0020081F89000206990F89010A5 +:108F500002E00000F000002011F0010F05D02069B0 +:108F600090F8641006291CD114E090F8660010F007 +:108F7000020F18BFFFDF206990F8661041F0020170 +:108F800080F86610A0F88A5090F88C10491C80F880 +:108F90008C10E4E780F8645080F888502079F2F76C +:108FA00029FF206990F88C11042940F0CC8280F8C8 +:108FB0008C512079F2F71EFF206990F86410002987 +:108FC00040F0C18200F031BA206990F8660010F0DC +:108FD000010F77D16946A06904F047FB9DF80000B6 +:108FE00000F02501206980F896109DF8011001F02D +:108FF000410180F89710A0F88A5090F88C10491C15 +:1090000080F88C1090F8661041F001011CE0206996 +:109010000123092190F86420583003F0D6FC002881 +:1090200040F0378200F03DBA206990F8661011F0E8 +:10903000040F40F03682A0F88A5090F88C2041F05E +:109040000401521C80F88C2080F8661000F07BBA76 +:10905000206990F8660010F0300F33D1A06904F059 +:1090600021FB002800F06D822769A06904F016FB3F +:1090700038872769A06904F00DFB78872769A06904 +:1090800004F00EFBB8872769A06904F005FBF88798 +:10909000A07910F0020F03D06069C078142812D0B4 +:1090A000206990F864101C290DD090F84E10012909 +:1090B0000CD090F89B11002904BF90F89A11002958 +:1090C0000CD003E05CE0206980F84E60206990F8E5 +:1090D000661041F0100180F866101AE090F86610F2 +:1090E00041F0200180F866100288A0F8E021028F8C +:1090F000A0F8E221428FA0F8E421828F00F5D6711A +:10910000A0F8E621C08F888781F832602079F2F7D5 +:1091100071FE2069A0F88A5090F88C10491C80F8E4 +:109120008C1000F010BA206901230A2190F8642005 +:10913000583003F04AFC18B3A06904F0B3FAA8B1A0 +:109140002669A06904F0AAFA30872669A06904F0AC +:10915000A1FA70872669A06904F0A2FAB08726698F +:10916000A06904F099FAF08701F000FB206980F80B +:10917000885080F8645000BF01F0C8FA00F0E3B9ED +:10918000A07840F00100A07000F0DDB92069012353 +:109190000B2190F86520583003F017FC20B100BF78 +:1091A00084F8029000F0CFB920690123002190F8E3 +:1091B0006520583003F009FC002800F07281206916 +:1091C00090F864002428EBD0A06904F086FA002807 +:1091D00000F0B781206990F8961041F0040180F802 +:1091E0009610A1694A7902F0070280F851200979A6 +:1091F00001F0070180F8501090F8A531002B04BF52 +:1092000090F8A431002B1CD190F855C000F1540304 +:109210008C4502BF1978914280F87D6011D000F52D +:10922000D67180F8F2610288A0F8F42190F85020FD +:1092300080F8F62190F8510081F84B002079F2F780 +:10924000D9FD2069212180F86510A0F88A5090F896 +:109250008C10491C80F88C1000F075B9206990F8CA +:109260006410202914BF0027012790F865102229D7 +:1092700008BF00F1650804D0002F18BF00F1640892 +:109280006DD090F8961041F0040180F89610A06916 +:1092900004F045FAF0B3D4F81890484604F033FAD5 +:1092A0000090484604F033FA814603F042FD010085 +:1092B00018D0206990F854208A4213D090F8A43135 +:1092C00023B190F8A63113EA090F4BD0002F04BF49 +:1092D00090F8513013EA090F01D18A4242D890F830 +:1092E000A401B8B1DDF80090484603F022FD78B142 +:1092F000216991F8552082420AD091F8A40120B149 +:1093000091F8A70110EA090F2CD091F8A40108B137 +:109310006A4600E026E0A169206903F019FDE8B380 +:10932000A06904F0FAF92169A1F88E01B1F858207A +:10933000801A00B28245A8BF0028DCBF81F874B053 +:1093400081F873605CDD9DF8000081F890019DF864 +:10935000010081F89101242088F8000050E084F891 +:109360000280F0E0206990F8A40100281CBF1E20B4 +:10937000FFF7F2FBB7B1A0692169C07881F8CA0094 +:1093800006FA00F010F0807F08BFFFDF0A21206995 +:1093900080F8641090F88800002800E014E008BF0E +:1093A000FFDF0DE088F80050206990F88C10491E0E +:1093B00049B280F88C100029B8BFFFDF01F08BF9AB +:1093C000206980F87D50BEE0226992F8A40170B156 +:1093D000B2F8583092F85410B2F8A80102F5C772EA +:1093E00003F0A8FDD8B12169252081F86400206927 +:1093F00000F1650180F87D50884508BF80F8655010 +:10940000206900F1650188450FD190F88C10491E44 +:1094100049B280F88C100029B8BFFFDF93E000202C +:10942000FFF79AFB88F80050E1E780F888508AE05F +:10943000206990F8961041F0040180F89610A06918 +:1094400004F089F916287ED1206990F8640020285C +:1094500002D0262805D076E0A06904F080F9FFF755 +:109460007BFB206980F8645080F888506BE02069AD +:1094700090F864200E2A03D1A1690979122902D03B +:109480001C2A1AD10FE001230921583003F09DFA5C +:1094900038B1206980F87C5080F8885080F864509A +:1094A00051E0A6704FE0A1690979142904BF80F842 +:1094B000645080F888503FF45FAE202A03D1A16940 +:1094C0000979162914D0262A03D1A1690979162908 +:1094D0000ED0A1690979172904BF90F86520222AC6 +:1094E00013D0E2691AB1FF2908BF80F886612AE02B +:1094F00080F8645080F8885090F86500212818BFE3 +:109500001A2020D0FFF728FB1DE080F8655090F866 +:109510008C10491E49B280F88C100029B8BFFFDFBB +:10952000206980F87D5090F8A401002818BF002021 +:1095300009D0E7E7E06900281CBF206980F8866150 +:1095400001D101F0C8F82069D0E92A12491C42F182 +:109550000002C0E92A1203B0BDE8F08F70B5FB4EDF +:1095600005460C46306990F8CB00FE2818BFFFDF97 +:1095700032690020002C82F8CB501CBFA2F88A0070 +:1095800070BDA2F88400012082F8880070BD30B55B +:1095900085B005466846FCF7D6F9002808BFFFDF0E +:1095A000222100980BF055FB0321009803F09AFF4D +:1095B0000098017821F010010170294603F0C0FFE6 +:1095C000E24C0D2D04BF0621009830D00BDCA5F134 +:1095D00002000B2819D2DFE800F0201863191926C1 +:1095E000187018192C00152D7BD008DC112D2DD0EA +:1095F000122D18BF132D09D0142D30D005E0162DD3 +:1096000046D0172D6BD0FF2D6AD0FFDFFCF7AEF9E7 +:10961000002808BFFFDF05B030BD2069009990F831 +:10962000CC000871F2E72169009891F8CC10017123 +:10963000ECE7E26800981178017191884171090A9C +:1096400081715188C171090A0172DFE70321009815 +:1096500004F07FF80621009804F07FF8D6E720692F +:10966000B0F84410009804F005F82069B0F84610EE +:10967000009804F003F82069B0F84010009804F056 +:1096800001F82069B0F84210009803F0FFFFBDE731 +:109690002069009A90F8A611117190F8A7014BE08B +:1096A000206900F1F001009803F0C8FF206900F183 +:1096B000C401009803F0CCFFA8E7A549D1E9000157 +:1096C000CDE90201206902A990F8960000F025007A +:1096D0008DF80800009803F0F6FF97E701E019E025 +:1096E0002CE02069B0F84010009803F0CBFF20690F +:1096F000B0F84210009803F0C9FF2069B0F8441098 +:10970000009803F0B7FF2069B0F84610009803F006 +:10971000B5FF7BE7206990F8A41139B1009990F862 +:10972000A6210A7190F8A70148716FE7009A90F896 +:109730005410117190F85500507167E7206990F846 +:109740008721D0F88811009803F008FF5EE770B514 +:109750000C4605464FF4007120460BF09CFA25801C +:1097600070BDF7F78ABB2DE9F0410D46074607218A +:10977000F7F77AFA040008BFBDE8F08194F8AC016D +:109780000026B8B16E700920287094F8AC0178B149 +:10979000268484F8AC61D4F8AE016860D4F8B201D4 +:1097A000A860B4F8B601A88194F8AC010028EFD104 +:1097B0002E7144E094F8B801002837D094F8B8012D +:1097C0000D2818D00E2818BFFFDF38D12088F7F7F2 +:1097D0007DFB0746F7F729F8A0B96E700E202870B8 +:1097E00094F8BA0128712088E88084F8B861384676 +:1097F000F7F715F823E02088F7F768FB0746F7F737 +:1098000014F810B10020BDE8F0816E700D202870B2 +:1098100094F8BA0128712088E88094F8BE01287273 +:1098200084F8B8613846F6F7FAFF08E094F8F001DA +:1098300040B16E701020287084F8F061AF80012074 +:10984000BDE8F08194F8C00190B16E700A202870D4 +:109850002088A880D4F8C401D4F8C811C5F806003F +:10986000C5F80A10B4F8CC01E88184F8C061E6E7D5 +:1098700094F8CE0140B16E701A202870B4F8D0016F +:10988000A88084F8CE61DAE794F8EA0180B16E70BE +:109890001B20287094F8EA010028D0D084F8EA61EF +:1098A000D4F8EC01686094F8EA010028F6D1C6E724 +:1098B00094F8D2012F1DA0B16E701520287094F875 +:1098C000D201002818BF04F5EA75B8D084F8D26137 +:1098D000294638460BF0EBFA94F8D2010028F5D16E +:1098E000ADE794F8DE0150B16E701D20287084F849 +:1098F000DE6104F5F07138460BF0D9FA9FE794F871 +:10990000F20138B11E20287084F8F261D4F8F40115 +:10991000686094E794F8F801002808BFBDE8F0817A +:109920006E701620287094F8F801002887D000BFC8 +:1099300084F8F861D4F8FA016860B4F8FE0128816F +:1099400094F8F8010028F3D179E70000F000002036 +:1099500040520200FE4AD0600020D06110621171B6 +:109960007047002180F8641080F8651080F8681056 +:1099700090F8DE1011B10221FEF71ABF0321FEF7A5 +:1099800017BF2DE9F047F24C814686B020690D469D +:109990000088F7F7ADFA070008BFFFDFA07828437B +:1099A000A070A0794FF0000510F0200F20691CBFB7 +:1099B000A0F87E5080F8E45004D1B0F87E10491C25 +:1099C000A0F87E102069012690F86A1039B990F845 +:1099D000652001230621583002F0F7FF48B3E088E4 +:1099E00010F4006F07D0206990F86A10002918BFA2 +:1099F000A0F876501DD12069B0F87610491C89B2C4 +:109A0000A0F87610B0F878208A422CBF531A0023B1 +:109A1000B4F808C00CF1050C634598BF80F87C6071 +:109A2000914206D3A0F8765080F8F0612079F2F7E1 +:109A3000E1F9A0794FF0020A10F0600F11D020690F +:109A400090F8681011B1032906D00AE080F8686028 +:109A50000121FEF7ADFE04E080F868A00121FEF7C9 +:109A6000A7FE206990F86810012905D1E18811F45A +:109A7000807F18BF80F868A04FF00808B9F1000F88 +:109A800040F09981E28812F4007F18BFA0F8F850E6 +:109A900004D1B0F8F810491CA0F8F81012F0080F23 +:109AA00050D0A17800294DD190F8CB00FE2808BFF6 +:109AB000FFDFFE21206980F8CB1090F8651019298E +:109AC00007D0206990F864101F2911D027292AD0C7 +:109AD0002FE080F88D5090F88C10491E49B280F824 +:109AE0008C100029B8BFFFDF206980F86550E8E7D7 +:109AF00090F8650002F052FF80B120692621012311 +:109B000080F8641090F865200B21583002F05DFF5A +:109B1000002804BF2A20FFF71FF80AE0216920204F +:109B200081F8640005E080F8856180F8645080F871 +:109B30008850206990F86710082904BF84F800A0B5 +:109B400080F8CBA0FFF73FF8A07910F0040F07D002 +:109B5000A07828B9206990F86700072808BF267008 +:109B600000F038FCA07910F0100F09D0A07838B9B7 +:109B7000206990F865100B2904BF0C2180F865104E +:109B8000E07810F0080F11D020690123052190F82A +:109B90006520583002F019FF28B184F8028020694E +:109BA00080F8B85102E0002001F02AFBE0690028AB +:109BB0005BD000950195029503950495206990F876 +:109BC0005500FBF723FE4FF47A7100F5FA70B0FBF5 +:109BD000F1FA206990F85500FBF706FE5044ADF805 +:109BE000060020690188ADF80010B0F85810ADF8F3 +:109BF00004104188ADF8021090F8860130B1A069D8 +:109C0000C11C039103F058FC8DF81000206990F8F6 +:109C100085018DF80800E16968468847206980F869 +:109C2000865180F885510399F9B190F88411E1B912 +:109C300090F86410272918D09DF81010039AA1B14C +:109C40001378FF2B06D0072B02BF02295178FF297A +:109C500002D00AE01B2908D880F884610399C0F873 +:109C600088119DF8101080F8871100F0CCFD01F0EC +:109C7000BDFA0028206918BFA0F8D85004D1B0F868 +:109C8000D810491CA0F8D81001F0B3FA40B12169EE +:109C900091F8E40002289CBF401C81F8E40004D83D +:109CA000206990F8E400022806D92069A0F8D8506D +:109CB000A0F8DA5080F8E45020690123002190F8E0 +:109CC0006520583002F081FE20B9206990F86500C7 +:109CD0000C285AD120690123002190F864205830C3 +:109CE00002F073FEB0B320690123002190F86720D1 +:109CF000583002F06AFE68B3206990F868100229B3 +:109D000004BF90F8E40000283FD13846F6F75DFB29 +:109D100000B3206990F8CB10FE2936D1B0F8D210EC +:109D2000012932D980F8DD60B0F88010B0F87E20CB +:109D30008B1E9A42AFBF0121891A491E89B2B0F821 +:109D4000D82023899A422EBF01229A1A521C02E07F +:109D5000F000002019E038BF92B2914288BF11464E +:109D6000012908BF80F8DD5090F868218AB1B0F869 +:109D7000DA20B0F86A0182422FBF0120801A401C0D +:109D800080B2814288BF014603E02069012180F84A +:109D9000DD502069B0F85820114489B2A0F8D410E1 +:109DA00090F86830002B18BF012B5DD0022B1CBF30 +:109DB000032BFFDF09D0E088C0F340200028206992 +:109DC00018BFA0F8E65059D151E090F86730082B41 +:109DD00021D0B0F87E10B0F8802000278B1C9A426A +:109DE00006D3511A891E0F043F0C1CBF791E8FB277 +:109DF00090F87C1051B190F864200123092158306B +:109E000002F0E3FD002808BF002729D0206990F860 +:109E10006A1089B908E0B0F87E30032B24D3B0F87B +:109E200080101144491C1FE090F865200123062191 +:109E3000583002F0CAFD78B121690020B1F87820CD +:109E4000B1F876108B1C9A4203D3501A801E18BFAB +:109E5000401EB84238BF87B2002F1CBF781E87B2A1 +:109E60002069B0F8D4103944A0F8D010A3E7B0F8B6 +:109E7000E610B0F8D6201144A0F8E610206990F85A +:109E8000701139B990F8672001231946583002F053 +:109E90009CFD38B12069B0F88210B0F8D62011448A +:109EA000A0F88210206990F8883033B1B0F884109F +:109EB000B0F8D6201144A0F8841090F98C20002A24 +:109EC00006DDB0F88A10B0F8D6C06144A0F88A1058 +:109ED0004FF03D0CB9F1000F18BF80F874C049D1A4 +:109EE0002178022911D0012908BF90F872113FD0C2 +:109EF000A17821B380F8736011F0140F18BF1E21F0 +:109F000009D000BF80F8741050E090F8CC100629FA +:109F100018BF16212CE011F0080F18BF80F874C08C +:109F200044D111F0200F18BF2321EBD111F0030F02 +:109F300008BFFFDF2A20216981F8740032E02BB1CD +:109F4000B0F88410B0F88630994210D2002A05DDAE +:109F5000B0F88A10B0F88620914208D2B0F882207A +:109F6000B0F880108A4208D390F870212AB12221DB +:109F700080F8741080F8736018E090F868203AB1A7 +:109F8000B0F87E208A4228BF80F87480F2D209E0BF +:109F9000B0F87E10062905D33E2180F8741080F8B1 +:109FA000736003E0206990F8731079B1206980F83C +:109FB000645080F8655080F8685090F8DE100029F1 +:109FC00014BF02210321FEF7F3FB02E00021FEF79C +:109FD000EFFB206980F8DE5006B0BDE8F047FBF7E4 +:109FE000E7BCF84902468878CB78184313D1084675 +:109FF00000694AB1897911F0080F03D090F8670021 +:10A00000082808D001207047B0F84810028E91420D +:10A0100001D8FEF709BB0020704770B5E94C054632 +:10A020000E46E0882843E08015F0020F04D015F0BA +:10A03000010F18BFFFDF666115F0010F4FF000023E +:10A040004FF001001AD0A661F178062902D00B2941 +:10A050000BD013E0216991F86530172B0ED1002346 +:10A06000C1E9283381F8690008E0216991F8653079 +:10A07000112B04BF81F8692081F88E0015F0020FC2 +:10A0800018D06169C978052902D00B290BD011E0DD +:10A09000216991F86520152A0CD10022C1E92A22F4 +:10A0A00081F86A0006E0206990F86510102908BF61 +:10A0B00080F86A2015F0800F1CBF0820E07070BD8A +:10A0C0002DE9F84FBF4C00254FF00108E580A57041 +:10A0D000E5702570206168F30709074680F8DE8087 +:10A0E0000088F6F705FF5FEA000A08BFFFDF206976 +:10A0F0000088FBF725FC20690088FBF747FC2069F6 +:10A10000B0F8D21071B190F8CB10FE290FD190F8B1 +:10A11000701189B190F8672001231946583002F078 +:10A1200054FC88B1206990F8CB00FE2804D0206947 +:10A1300090F8CB00FFF72BFA206990F8DF10002988 +:10A1400018BF25811BD10FE02069A0F8825090F83C +:10A15000711180F8CC1000210220FFF7FFF920696F +:10A1600080F8DD500220E5E790F8AC1129B9018CA8 +:10A170008288914288BF218101D881882181B0F8ED +:10A18000D610491E8EB2B0F8D8103144A0F8D810BD +:10A1900090F8DC1000291CBFA0F8DA5080F8DC50E1 +:10A1A00004D1B0F8DA103144A0F8DA10B0F87E101B +:10A1B0003144A0F87E1090F86A1039B990F8652003 +:10A1C00001230621583002F000FC28B12069B0F8C4 +:10A1D00076103144A0F876102069B0F8D210012929 +:10A1E0009CBF491CA0F8D210002E18BF80F8E45084 +:10A1F00090F8DD10A1B1B0F8D800218988420FD2C3 +:10A200005046F6F7E2F858B1206990F8681139B174 +:10A21000B0F8DA10B0F86A01814228BF00F0ECFF14 +:10A22000206980F8DD5090F865100B2918BF0C29C3 +:10A2300016D1B0F85820B0F88E31D21A12B2002AD6 +:10A240000EDBD0F89011816090F894110173022117 +:10A2500001F0A8FF206980F8655080F898804AE0F6 +:10A26000242924D1B0F85810B0F88E21891A09B2E7 +:10A2700000291CDB90F8A42190F89011002908BF58 +:10A2800090F8541080F8541090F89111002908BFEC +:10A2900090F8551080F85510002A1CBF0020FEF7DA +:10A2A0005BFC206980F8655080F87D5023E090F8D1 +:10A2B0006410242918BF25291DD1B0F85810B0F812 +:10A2C0008E21891A09B2002915DB90F89011002916 +:10A2D00008BF90F8541080F8541090F8911100299C +:10A2E00008BF90F8551080F855100020FEF734FC98 +:10A2F000206980F86450216901F15800B1F8D62036 +:10A3000002F026F9206990F86811002918BFA0F81A +:10A31000DA502D4800902D4B2D4A3946484600F022 +:10A32000B3FE216A00291CBF6078FAF789FF206913 +:10A330000123052190F86520583002F046FB0028E3 +:10A3400008BFBDE8F88FBDE8F84F00F08EBC00F004 +:10A3500033BF1C49C86170471A48C069002818BF3C +:10A3600001207047174A50701162704710B50446BB +:10A37000B0F894214388B0F89611B0F898019A4249 +:10A3800001BFA3889942E38898420FD02388A4F89C +:10A39000B031A4F8B221A4F8B411A4F8B601012098 +:10A3A00084F8AC0107480079F1F724FD012120462B +:10A3B00001F0F8FE002084F86500032084F86800AE +:10A3C00010BD0000F000002083990100E39F010010 +:10A3D0001BA0010070B5FE4CA07910F0020F08BF61 +:10A3E00070BDA078002818BF70BD6169F8482722A9 +:10A3F000CB780E26002500690D2B78D00BDCA3F15D +:10A4000002030B2B1FD2DFE803F0201E808B9F2F4F +:10A410001E591E73D100152B00F02A810BDC112B65 +:10A4200065D0122B00F0F480132B00F0FF80142B6A +:10A4300000F00E8107E0162B00F03281172B00F0A0 +:10A440003F81FF2B35D0FFDF70BD90F867200123DF +:10A450001946583002F0B9FA002818BF70BD08201C +:10A46000216981F8670070BD90F8643009790A2B82 +:10A4700001BF90F8CA308B4280F8645080F8885051 +:10A4800008BF70BD90F8663013F0080F0DD023F0B0 +:10A49000080180F8661090F88C10491E49B280F8C7 +:10A4A0008C100029A8BF70BDCFE0FF291CBFFFDFC3 +:10A4B00070BD80F8642080F8845170BD90F866000B +:10A4C00010F0010F08BFFFDF216991F88C00401EDA +:10A4D00040B281F88C000028B8BFFFDF206990F8F7 +:10A4E000661021F0010100BF80F8661070BD21E008 +:10A4F00090F86500102818BFFFDF0121206980F85F +:10A500008D10112180F8651070BD90F86500142839 +:10A5100018BFFFDF0121206980F88D101521F1E7B8 +:10A5200090F86500152818BFFFDF1720216981F812 +:10A53000650070BD90F86500152818BFFFDF192071 +:10A54000216981F8650070BD90F865001B2818BF6F +:10A55000FFDF206980F88D5090F8B801002818BFFF +:10A56000FFDF206990F88E1049B180F88E50018885 +:10A57000A0F8BC1180F8BA5180F8B8610AE00188EF +:10A58000A0F8BC1180F8BA51012180F8BE110D214C +:10A5900080F8B8110088F6F799FCF6F731F92079C0 +:10A5A000F1F728FC206980F8655070BD90F88C1197 +:10A5B000042915D0206990F8661011F0020F08BF29 +:10A5C00070BD90F88C10491E49B280F88C1000299B +:10A5D000B8BFFFDF206990F8661021F0020183E721 +:10A5E00090F8642001230021583002F0EEF9002891 +:10A5F00008BFFFDF206990F8901011F0020F07BF2D +:10A60000062180F8641080F8885080F88C51D1E7DA +:10A6100090F8642001230021583002F0D6F9002878 +:10A6200008BFFFDF206980F8646070BD90F8661095 +:10A6300021F0040180F8661090F88C10491E49B290 +:10A6400080F88C100029A8BF70BDFFDF70BD00BF6F +:10A6500090F8642001230021583002F0B6F9002858 +:10A6600008BFFFDF1C20216981F8640070BD00BFB6 +:10A6700090F8660000F03000102818BFFFDF206956 +:10A6800090F8661021F0100180F8661090F88C1098 +:10A69000491E49B280F88C100029A8BF70BDD4E7CC +:10A6A00090F8642001230021583002F08EF9002830 +:10A6B00008BFFFDF1F20216981F8640070BD00BF63 +:10A6C00090F8650021281CBF0028FFDF22202169A7 +:10A6D00081F8650070BD3E49086990F8662012F067 +:10A6E000080F1EBF01208870704742F0080280F8F2 +:10A6F00066208969C97880F8C9100021A0F88A10FD +:10A7000090F88C10491C80F88C10704710B5304CB4 +:10A7100005212069FEF74CF8206990F84E100129B8 +:10A7200002BF022180F84E1010BD00F5D6710288DC +:10A73000A0F8D421028EA0F8D621828EA0F8D821CC +:10A74000028FB0F844309A4228BF1A46CA85828FD9 +:10A75000B0F84600824238BF10460886012081F8D2 +:10A7600026002079BDE81040F1F744BB184830B40A +:10A77000006990F84E30B0F832C0C48EB0F8401086 +:10A78000428F022B28D08A4238BF11460186C28FE1 +:10A79000B0F842108A4238BF11468186028FB0F865 +:10A7A00044108A4238BF11464186828FB0F8461065 +:10A7B0008A4238BF1146C186418E614588BF8C46AA +:10A7C000A0F832C0C18EA14288BF0C46C48601E009 +:10A7D000F000002030BC7047038E9A4228BF1A4612 +:10A7E000C58F838E9D4238BF2B468A4238BF1146A3 +:10A7F0000186B0F842108B4228BF0B4683860021A9 +:10A8000080F84E10CAE770B5FD4C206990F8CB1067 +:10A81000FE2906BFA178002970BD90F867200123AA +:10A820001946583002F0D1F8002818BF70BD2069D1 +:10A83000002590F8701159B1A0F8825090F871116C +:10A8400080F8CC10BDE8704000210220FEF786BEE3 +:10A8500090F8652001230421583002F0B6F8060074 +:10A860000CD0D4F810C09CF86500102861D01428D2 +:10A8700065D015287BD01B287ED0BEE0216991F8D9 +:10A88000660010F0010F05D0BDE8704001210920DD +:10A89000FEF764BE10F0020F0BD001210C20FEF772 +:10A8A0005DFE206990F8901041F0010180F8901051 +:10A8B00070BD10F0040F05D0BDE8704001211320D9 +:10A8C000FEF74CBE10F0080F09D091F8C90081F8CE +:10A8D000CC00BDE8704001210720FEF73FBE10F01C +:10A8E000100F02D091F89B0120B191F8650021284A +:10A8F00073D179E091F89A0188B1B1F89C01A1F87F +:10A900004000B1F89E01A1F84200B1F8A001A1F801 +:10A910004400B1F8A201A1F8460081F89A51FFF76E +:10A9200025FFFFF7F3FEBDE8704001211520FEF77B +:10A9300015BEBDE8704001210B20FEF70FBEF9F7F0 +:10A94000F7FA0C2838BF70BD08212069F030F9F7FC +:10A95000F3FA28B120690421C430F9F7EDFA00B9FF +:10A96000FFDFBDE8704001210420FEF7F7BD9CF831 +:10A97000730101280DD000E030E0022818BF70BD3F +:10A980009CF88E00D8B106208CF8CC000121022062 +:10A990001DE09CF8B801002818BF70BD0CF1B00391 +:10A9A00000220CF1E8010CF5BA7001F08AFF0121D8 +:10A9B0000520FEF7D3FD206980F8735170BD9CF827 +:10A9C000960010F0040F14BF11200D200121FEF796 +:10A9D000C5FD206980F8735170BD0EE0BDE8704080 +:10A9E00001210620FEF7BABD91F87D00C0B991F8AB +:10A9F000A40110B191F8A50190B1206901230021B3 +:10AA000090F86420583001F0E0FFC8B120690123BC +:10AA1000042190F86520583001F0D7FF30B10FE0E5 +:10AA2000BDE8704001211720FEF798BD206990F81D +:10AA30007C0028B1BDE8704000211220FEF78EBDD9 +:10AA4000206990F864200A2A2BD0002E18BF70BD10 +:10AA500001230021583001F0B8FF48B1206990F877 +:10AA60008C11042904BF90F8900010F0030F22D03D +:10AA700020690123002190F86420583001F0A5FFDF +:10AA800000287DD0206990F89A1111B190F89B119F +:10AA9000E9B190F8A411002972D090F8A511E9B39A +:10AAA000BDE090F8CA1080F8CC10BDE870400021DD +:10AAB0000720FEF753BD00210C20FEF74FFD206953 +:10AAC00090F8901041F0010180F8901070BDB0F83E +:10AAD0009C11A0F84010B0F89E11A0F84210B0F8F8 +:10AAE000A011A0F84410B0F8A211A0F8461080F808 +:10AAF0009A5190F8660010F0200F13D0FFF736FE41 +:10AB0000FFF704FE01211520FEF728FD206990F8CB +:10AB1000661021F0200141F0100100E008E080F80B +:10AB2000661070BDBDE8704000211420FEF716BD10 +:10AB300090F8652001230B21583001F046FFF8B949 +:10AB4000206990F85400012808BF012508D0022888 +:10AB500008BF022504D0042816BF08280325FFDFFC +:10AB6000206990F85500012808BF01260BD0022863 +:10AB700008BF022607D0042814BF0828032600E0D7 +:10AB80004DE018BFFFDFD4F810C0012D9CF8A601DE +:10AB900006D0022D07D0032D08BF042805D014E0ED +:10ABA000012812D101E002280FD19CF8A701012E43 +:10ABB00006D0022E07D0032E08BF04280FD004E0D1 +:10ABC000012802D10BE0022809D09CF8652001235E +:10ABD00003210CF1580001F0F8FE00BB16E0BCF8B0 +:10ABE00058309CF85410BCF8A8010CF5C77202F05C +:10ABF000A1F938B12169252081F8640070BD0000F9 +:10AC0000F00000200020FDF7A7FF08E020690123E5 +:10AC1000022190F86520583001F0D7FEB0B12069CC +:10AC20000123002190F86420583001F0CEFE002866 +:10AC300008BF70BD206990F88401002808BF70BD6E +:10AC40000021BDE87040FF20FEF788BCBDE87040E1 +:10AC500000211620FEF782BC30B5FB4C054620785B +:10AC6000002818BFFFDF657230BDF7490120087268 +:10AC700070472DE9F14FF54F39464D68284695F854 +:10AC8000551001F048FF95F8551080B211F00C0FE7 +:10AC90006FF00D0B7DD0B0F5747F38BF002006D368 +:10ACA0005038C11700EB91600BEBA01080B26E8E94 +:10ACB000864228BF0646E648DFF88C93C9F8240090 +:10ACC000786800F15808044609F13400678E40683E +:10ACD00094F8551090F86AA0204601F01CFF94F8F3 +:10ACE000551080B211F00C0F69D0B0F5747F38BFE9 +:10ACF000002406D35038C21700EB92600BEBA01073 +:10AD000084B2A74238BF3C46BAF1000F1CBF201DD9 +:10AD100084B2E0B2F9F7E8FE98F81200002859D0A2 +:10AD200008F15801CA4891E80E1000F5027484E851 +:10AD30000E10D8F86810C0F82112D8F86C10C0F8BE +:10AD4000251200F58170FAF711FAC0480078002842 +:10AD50000CBF0120002080F00101BE480176D8E937 +:10AD60001412C0E90412A0F58372D9F82410F9F77F +:10AD700060FD95F85500012808BF00220ED002287A +:10AD800008BF01220AD0042808BF032206D00828E1 +:10AD900000E008E01ABFFFDF00220222F1B201202A +:10ADA000F9F762FD1CE0022919BF0BEBD00080B25D +:10ADB0006FF00E0101EB90007FF479AF76E7022986 +:10ADC00019BF0BEBD00084B26FF00E0202EB9000C3 +:10ADD00097D195E7D9F82400FAF7C8F9F9F767FD94 +:10ADE000009850B195F82C00012808BFFAF791FAA5 +:10ADF000022089F80000BDE8F88F012295F855304F +:10AE000096211046FAF791F895F8550095F85610E6 +:10AE100010F00C0F08BF00219620FAF7C2F9E1E705 +:10AE20002DE9F04FDFF8248283B0414681464D681A +:10AE3000A1F11400009095F85D0005F15806012776 +:10AE4000A1F1340470B3012878D0022877D0032808 +:10AE500018BFFFDF74D0206A0823017821F00801B1 +:10AE60000170B27903EAC202114321F004010170BA +:10AE7000F279042303EA8202114321F010010170E8 +:10AE800096F805B0E06AF5F7B0FA8246FAF7A2FD47 +:10AE9000BBF1020F79D0BBF1010F77D0BBF1030FEB +:10AEA00075D089E000F0CAFB0146284601F044FE57 +:10AEB0001FFA80FB00F0C2FB10F00C0F6FF00D01C9 +:10AEC0004FF0000A20D0BBF5747F38BF504607D33F +:10AED000ABF15000C21700EB926001EBA01080B202 +:10AEE000298E814238BF0846ADF80800A5F8480011 +:10AEF0000098FAF74EFD90B1216AA77062694FF48D +:10AF00008060904703202CE0022819BF01EBDB0092 +:10AF100080B26FF00E0000EB9B00E1D1DFE701AAE9 +:10AF200002A9E06AF5F79CF9206210B196F8351095 +:10AF300039B10098FAF701FD77718CE713E016E05C +:10AF400026E09DF8041031B9A0F800A080F802A016 +:10AF5000012102F0C7FABDF80810206A02F001FCD6 +:10AF60000220707177E70098FAF7E7FC73E7B5F80D +:10AF70004800ADF8000001AA6946E06AF5F770F9EB +:10AF80002062002808BFFFDF65E708E00BE00EE065 +:10AF90000098FAF7FEFC002808BFFFDF5BE730EA05 +:10AFA0000A0009D106E030EA0A0005D102E0BAF150 +:10AFB000000F01D0012100E00021206A027842EA5E +:10AFC00001110170717C00291CBF7179012943D0E6 +:10AFD00006F158011E4891E80E1000F5027A8AE841 +:10AFE0000E10B16EC0F82112F16EC0F8251200F5F6 +:10AFF0008170FAF7BBF898F8000000280CBF012117 +:10B00000002114480176D6E91212C0E90412A0F515 +:10B010008371226AF9F70DFC95F85400012808BFE6 +:10B0200000220CD0022808BF012208D0042808BF43 +:10B03000032204D008281ABFFFDF00220222FB21CE +:10B040000020F9F711FC0BE014010020480100205A +:10B05000C80C0020D00E0020FAF788F8F9F727FC7A +:10B06000B9F1000F06D195F8543001229621002045 +:10B07000F9F75BFF6771206A0188E18180782074AD +:10B08000277003B0BDE8F08F2DE9F0471C46174646 +:10B0900081460D46FE4EDDF82080307828B9002F1D +:10B0A0001CBF002CB8F1000F00D1FFDFC6F81C80D8 +:10B0B000C6E90574C6E90D9500243472F471347143 +:10B0C000F4707471B471B470B481F24F05F1580822 +:10B0D0002888F5F70DFFF0622888F5F7F7FE306352 +:10B0E000F9F725FD95F95700F9F7B1FD05F11200C3 +:10B0F000FAF725F805F10E00F9F7B3FD38780028C6 +:10B100000CBF03200120FAF72EF898F81A00F9F77F +:10B11000B0FDFAF722F83878002804BFFF2095F830 +:10B12000545023D098F81260B5F8328095F8551035 +:10B13000284601F0F0FC95F8555080B215F00C0F40 +:10B140006FF00D0126D0B0F5747F06D35038C217CA +:10B1500000EB926001EBA01084B24046A04528BFEE +:10B160002046002E1CBF001D80B2C0B22946F9F750 +:10B17000BBFC38782A464FF00001B0B10120F9F746 +:10B18000A2FE7868D0F8E000F9F7F3FFBDE8F047D9 +:10B1900001206EE5022D19BF01EBD00084B26FF0E3 +:10B1A0000E0101EB9000D8D1D6E70020F9F78BFE15 +:10B1B000BDE8F047012033E6B64800B501783438E1 +:10B1C000007819B1022818BFFFDF00BD012818BFA1 +:10B1D000FFDF00BDAE4810B50078022818BFFFDFC2 +:10B1E000BDE8104000F0CCBA00F0CABAA8484079D7 +:10B1F0007047A74800797047A549012088717047BA +:10B200002DE9F0470600A348A14D406800F158041D +:10B21000686A90F8019018BF012E03D1296B09F0DC +:10B22000BBF96870687800274FF00108A0B10128C9 +:10B230003CD0022860D003281CBFFFDFBDE8F087A8 +:10B24000012E08BFBDE8F087286BF5F7C3FA687ACE +:10B25000BDE8F047F0F7CEBD012E14D0A86A002853 +:10B2600008BFFFDF6889C21CD5E9091009F072FC2C +:10B27000A86A686201224946286BF5F727F9022E71 +:10B2800008BFBDE8F087D4E91401401C41F100017A +:10B29000C4E91401E079012801D1E77101E084F8E3 +:10B2A0000780687ABDE8F047F0F7A4BD012E14D0FE +:10B2B000A86A002808BFFFDF6889C21CD5E9091009 +:10B2C00009F048FCA86A686200224946286BF5F735 +:10B2D000FDF8022E08BFBDE8F087D4E91410491C20 +:10B2E00040F10000C4E91410E07901280CBFE771B7 +:10B2F00084F80780BDE8F087012E06D0286BF5F7AB +:10B3000069FA022E08BFBDE8F087D4E91410491C81 +:10B3100040F10000C4E91410E0790128BFD1BCE776 +:10B320002DE9F0415B4F3846A7F13404406800F145 +:10B3300058052078012818BFFFDFA878012648B1FA +:10B340000021A970A670626904209047387800280F +:10B3500018BF2E71206A0321007831EA000004BF73 +:10B36000E878002805D1EE70216AA6706269022093 +:10B3700090470121002000F022FA18B1BDE8F04109 +:10B3800000F0FEB9BDE8F041002072E42DE9F14F74 +:10B39000404E4FF000083046A6F134054068317841 +:10B3A00000F1580A2878C146022818BFFFDFA88993 +:10B3B00040F40070A88171683078FF2091F8541033 +:10B3C000F9F792FB009800289AF8120000F0FD802F +:10B3D000F9F792FAF9F780FA012788B99AF812007A +:10B3E00070B1686A417859B100789AF80710C0F3D3 +:10B3F000C000884204D1EF70BDE8F84F00F0C0B93A +:10B40000686A41786981002908BFC5F8288003D09F +:10B41000286BF5F715F8A862A88940F02000A881EC +:10B4200085F804803078706800F1580B044690F875 +:10B430002C0001281AD1F9F762FF5946204601F085 +:10B4400080FA98B13078002870680CBF00F58A70D7 +:10B4500000F5F570218841809BF8081001719BF878 +:10B46000091041710770687AF0F7C4FC686A9AF8AD +:10B4700006100078C0F3800088423BD030787068B6 +:10B4800000F1580490F85D0080B302284CD003E02E +:10B49000140100204801002084F80580307800283D +:10B4A0001CBF2079002806D084F80480AF706A6938 +:10B4B000414610209047E07890B184F80380FAF775 +:10B4C00077FA002808BFFFDF0820AF706A69002103 +:10B4D0009047D4E91202411C42F10000C4E9121065 +:10B4E000A07901280CBF84F80680A771A88940F4D0 +:10B4F0008070A881686A9AF807300178C1F3C002A9 +:10B500009A424FD13278726801F0030102F1580477 +:10B51000012918BF022932D003291CBFE87940F065 +:10B52000040012D0E8713DE0E86AF4F7C5FE002897 +:10B5300008BFFFDFD4E91210491C40F10000C4E944 +:10B540001210687AF0F756FCA1E701F0E3FF90B122 +:10B55000A770A989384641F40061A981696AAF7072 +:10B560006A699047E079012803D100BF84F8078019 +:10B5700018E0E77116E0E87940F01000D2E7407873 +:10B58000F8B1A98941F40061A981A96A51B1FB28E8 +:10B59000F1D8287A002808BFB94603D080206A690C +:10B5A000002190470120009900F009F9B0B1B9F1EC +:10B5B000000F1CBF0020FFF723FEBDE8F84F00F08E +:10B5C000DFB8E0790128D4D1D0E7002818BFF9F717 +:10B5D000CCF9A88940F04000A881E3E7B9F1000F59 +:10B5E0001CBF0120FFF70CFE0020FFF719FCB9F18A +:10B5F000000F08BFBDE8F88F0220BDE8F84FFFE557 +:10B6000070B50D4606468E488D4900784C6850B19D +:10B61000F9F7FEF9034694F8542029463046BDE870 +:10B620007040FDF7EAB9F9F7F3F9034694F85420AE +:10B6300029463046BDE8704005F088BF804830B4E8 +:10B6400090F800C04268406802F1580192F86450D6 +:10B6500090F85400242D1CBF4B7B242B24D00821B0 +:10B6600001241F2D18BF202D47D0222B1CBF30BC1A +:10B67000704700BFBCF1000F04BF30BC704792F8A8 +:10B68000A63192F851201A4012F0040F5FD008281A +:10B6900018BF04286ED0082918BF04296AD00128D1 +:10B6A00018BF012969D062E0BCF1000F12D092F8F6 +:10B6B0009011002904BF30BC7047082818BF042827 +:10B6C00058D0082918BF042954D0012818BF0129CF +:10B6D00053D04CE092F8F210002904BF30BC704700 +:10B6E000082818BF042845D0082918BF042941D0CC +:10B6F000012818BF012940D039E0222BBAD0BCF173 +:10B70000000F04BF30BC704792F8A62112F0040F5E +:10B710000CD0082818BF04282CD0082918BF0429E9 +:10B7200028D0012818BF012927D020E012F0010FEE +:10B7300018BF2146EDD112F0020F04BF30BC704794 +:10B74000082818BF042815D0012816D00FE012F0E1 +:10B75000010F18BF21469AD112F0020F04BF30BC6E +:10B760007047082818BF042804D0012805D030BC31 +:10B770000220704730BC0820704730BC0120704761 +:10B780002F4910B54C68F9F799FDF9F74DFDF9F718 +:10B790007DFCF9F7DAFCF9F78AF894F82C00012817 +:10B7A00008BFF9F7ACFD274C00216269A0899047DA +:10B7B000E269E179E07890470020207010BD70B513 +:10B7C000204C0546002908BF012D05D12079401CD9 +:10B7D000C0B22071012831D8A169284688470028C5 +:10B7E0002CD0A179184839B1012D01BF4178002929 +:10B7F000017811F0100F21D0E179F9B910490978D9 +:10B80000002908BF012D05D000290CBF012100210E +:10B81000294311D10D49097811F0100F04BF0078A8 +:10B8200010F0100F0AD0A07840B9A06A20B9608942 +:10B8300010B111F0100F01D0002070BD012070BDBB +:10B840004801002014010020C80C00202201002023 +:10B8500010B540F2C311F74809F0FBF9FF220821A7 +:10B86000F54809F0EEF9F548002141704FF4617197 +:10B87000418010BD2DE9F0410E46054600F046FB23 +:10B88000EC4C102816D004EBC00191F84A0110F0DE +:10B89000010F1CBF0120BDE8F081607808283CBF83 +:10B8A000012081F84A011CD26078401C60700120A0 +:10B8B000BDE8F0816078082813D222780127501C57 +:10B8C000207004EBC2083068C8F84401B088A8F8BA +:10B8D0004801102A28BFFFDF88F8435188F84A71D1 +:10B8E000E2E70020BDE8F081D2480178491E4BB262 +:10B8F000002BB8BF704770B45FF0000500EBC301C8 +:10B9000091F84A1111F0010F3BD04278D9B2521E82 +:10B91000427000EBC10282F84A5190F802C0002246 +:10B92000BCF1000F0BD9841894F803618E4202D148 +:10B93000102A26D103E0521CD2B29445F3D80278E3 +:10B94000521ED2B202708A421BD000EBC20200EB40 +:10B95000C10CD2F84341CCF84341D2F84721CCF88E +:10B960004721847890F800C00022002C09D986185D +:10B9700096F8036166450AD1102A1CBF024482F87A +:10B980000311591E4BB2002BB8DA70BC7047521C21 +:10B99000D2B29442EBD8F4E72DE9F05F1F4690460F +:10B9A0000E46814600F0B2FAA24D0446102830D06F +:10B9B000A878002100280ED96A1892F80331A34212 +:10B9C00005D110291CBF1220BDE8F09F03E0491CDF +:10B9D000C9B28842F0D8082834D2102C1CD0AE78D6 +:10B9E0001022701CA87005EB061909F103004146EE +:10B9F00000F056FF09F183001022394600F050FF95 +:10BA0000A819002180F8034180F83B110846BDE8E1 +:10BA1000F09FA878082815D22C78CA46601C287098 +:10BA200005EBC4093068C9F84401B0884FF0000B39 +:10BA3000A9F84801102C28BFFFDF89F843A189F835 +:10BA40004AB1CCE70720BDE8F09F70B4794881780F +:10BA5000491E4BB2002BBCBF70BC704703F0FF0CFB +:10BA60008178491ECAB2827050FA83F191F80311AD +:10BA700094453ED000EB021500EB0C14D5F80360A2 +:10BA8000C4F80360D5F80760C4F80760D5F80B6008 +:10BA9000C4F80B60D5F80F60C4F80F60D5F8836068 +:10BAA000C4F88360D5F88760C4F88760D5F88B60E8 +:10BAB000C4F88B60D5F88F50C4F88F50851800EB10 +:10BAC0000C0402EB420295F803610CEB4C0C00EB0A +:10BAD000420284F8036100EB4C0CD2F80B61CCF805 +:10BAE0000B61B2F80F21ACF80F2195F83B2184F8D7 +:10BAF0003B2100EBC10292F84A2112F0010F33D131 +:10BB000090F802C00022BCF1000F0BD9841894F801 +:10BB100003518D4202D1102A26D103E0521CD2B229 +:10BB20009445F3D80278521ED2B202708A421BD0DA +:10BB300000EBC20200EBC10CD2F84341CCF8434108 +:10BB4000D2F84721CCF84721847890F800C0002231 +:10BB5000002C09D9851895F8035165450BD1102A99 +:10BB60001CBF024482F80311591E4BB2002BBFF6D2 +:10BB700075AF70BC7047521CD2B29442EAD8F3E75A +:10BB80002E49487070472D484078704738B14AF2C6 +:10BB9000B811884203D82949488001207047002005 +:10BBA000704726484088704710B500F0AFF910285C +:10BBB00014D0204A0146002092F802C0BCF1000FC8 +:10BBC0000CD9131893F803318B4203D1102818BFF6 +:10BBD00010BD03E0401CC0B28445F2D8082010BD5F +:10BBE00014498A78824286BF01EB0010833000201E +:10BBF000704710498A78824286BF01EB0010C01C52 +:10BC0000002070470B4B93F802C084459CBF002076 +:10BC10007047184490F8030103EBC00090F84331DB +:10BC20000B70D0F844111160B0F8480190800120E9 +:10BC300070470000F80E00205A010020500100203B +:10BC4000FE4A114491F80321FD490A7002684A60D6 +:10BC500080880881704710B5F8F79AFD002804BF66 +:10BC6000FF2010BDBDE81040F8F7B8BDF3498A7851 +:10BC700082429CBF00207047084490F8030101EB0A +:10BC8000C00090F84A0100F0010070472DE9F0472C +:10BC9000EA4F0026B0463878002886BF4FF0080AE1 +:10BCA000DFF8A093BDE8F08707EBC80505F5A271A2 +:10BCB00095F8430100F02AF9102808BF544610D027 +:10BCC000B978002400290BD93A1992F8032182424D +:10BCD00002D1102C05D103E0621CD4B2A142F3D8EA +:10BCE0000824B878A04286BF07EB0410C01C0020CF +:10BCF00095F84A1111F0010F16D050B1082C04D25A +:10BD0000391991F83B11012903D0102100F0A5FD4C +:10BD100050B109F806403046731C95F8432105F5EB +:10BD2000A271DEB2F8F76BFF08F1010000F0FF0826 +:10BD300038784045B8D8BDE8F0872DE9F041BF4CD0 +:10BD400000263546A07800288CBFBE4FBDE8F081A4 +:10BD50006119C0B291F80381A84286BF04EB0510B7 +:10BD6000C01C002091F83B11012903D0102100F0E4 +:10BD700074FD58B104EBC800BD5590F8432100F59F +:10BD8000A2713046731CDEB2F8F739FF681CC5B2E9 +:10BD9000A078A842DCD8BDE8F08110B5F8F759FFCB +:10BDA000002804BF082010BDF8F757FFA549085C1C +:10BDB00010BD0A46A24910B5497841B19F4B997808 +:10BDC00029B10244D81CF8F780FC012010BD0020E6 +:10BDD00010BD9A4A01EB410102EB41010268C1F832 +:10BDE0000B218088A1F80F0170472DE9F041934D98 +:10BDF00007460024A878002898BFBDE8F081C0B2AB +:10BE0000A04213D905EB041010F183060ED01021C7 +:10BE1000304600F022FD48B904EB440005EB400039 +:10BE200000F20B113A463046F9F751FE601CC4B2DD +:10BE3000A878A042E3D8BDE8F081014610228248EC +:10BE400000F02EBD8048704770B57C4D0446A87840 +:10BE5000A04206D905EB04101021833000F0FDFC50 +:10BE600008B1002070BD04EB440005EB400000F277 +:10BE70000B1070BD71498A78824206D9084490F847 +:10BE80003B01002804BF01207047002070472DE9C6 +:10BE9000F0410E46074615460621304600F0DDFC0F +:10BEA000664C98B1A17871B104F59D7011F0010F45 +:10BEB00018BF00F8015FA178490804D0457000F868 +:10BEC000025F491EFAD10120BDE8F08138463146B3 +:10BED00000F01CF8102816D0A3780021002B12D9EE +:10BEE000621892F80321824209D1102918BF08294B +:10BEF00009D0601880F83B510120BDE8F081491C51 +:10BF0000C9B28B42ECD80020BDE8F0812DE9F041A8 +:10BF10004A4D0646002428780F46002812D900BF53 +:10BF200005EBC40090F84311B14206D10622394610 +:10BF300000F5A27008F0E2FD38B1601CC4B22878A8 +:10BF4000A042EDD81020BDE8F0812046BDE8F08188 +:10BF50003A4910B44A7801EBC003521E4A700022DD +:10BF600083F84A2191F802C0BCF1000F0DD98B185B +:10BF700093F80341844204D1102A1CBF10BC7047BF +:10BF800003E0521CD2B29445F1D80A78521ED2B2C4 +:10BF90000A70824204BF10BC704701EBC00301EB82 +:10BFA000C202D2F843C1C3F843C1D2F84721C3F853 +:10BFB00047218C7891F800C00022002C9CBF10BC57 +:10BFC00070478B1893F80331634506D1102A1CBFC4 +:10BFD000114481F8030110BC7047521CD2B2944244 +:10BFE000EFD810BC704770B414490D188A78521EEF +:10BFF000D3B28B7095F80321984247D001EB031C14 +:10C0000001EB0014DCF80360C4F80360DCF807609F +:10C01000C4F80760DCF80B60C4F80B60DCF80F6054 +:10C02000C4F80F60DCF88360C4F88360DCF88760D4 +:10C03000C4F88760DCF88B6008E00000F80E002090 +:10C04000500100205A010020BB100020C4F88B6072 +:10C05000DCF88FC0C4F88FC001EB030C03EB430383 +:10C060009CF8034100EB400001EB430385F80341DA +:10C0700001EB4000D3F80B41C0F80B41B3F80F318E +:10C08000A0F80F319CF83B0185F83B0101EBC200A1 +:10C0900090F84A0110F0010F1CBF70BC70470020DF +:10C0A0008C78002C0DD90B1893F803C1944504D15A +:10C0B00010281CBF70BC704703E0401CC0B2844213 +:10C0C000F1D80878401EC0B20870904204BF70BC1E +:10C0D000704701EBC20301EBC000D0F843C1C3F8C5 +:10C0E00043C1D0F84701C3F847018C780B78002092 +:10C0F000002C9CBF70BC704701EB000C9CF803C186 +:10C100009C4506D110281CBF084480F8032170BC50 +:10C110007047401CC0B28442EED870BC704700002B +:10C1200010B50A7B02F01F020A73002202768B18F8 +:10C130001B7A03F0010C5B0803F00104A4445B08C4 +:10C1400003F00104A4445B0803F00104A4445B0869 +:10C1500003F0010464444FEA530C0CF00103234440 +:10C160004FEA5C0C0CF00104234403EB5C0300EB8E +:10C17000020C521C8CF8133090F818C0D2B26344F1 +:10C180000376052AD3D3D8B2252888BFFFDF10BD98 +:10C190000023C383428401EBC202521EB2FBF1F1C1 +:10C1A0000184704770B50025044603290DD04FF473 +:10C1B000FA4200297BD0012978D0022918BF70BD2E +:10C1C0000146BDE870405830AAE704F158067821CE +:10C1D000304608F060FDB571F57135737573F57310 +:10C1E000357475717576B576212086F83E0041204C +:10C1F00086F83F00FE2086F8730084F82C502584D2 +:10C20000012084F8540084F85500282184F8561041 +:10C210001B21218761874FF4A471E187A1871B212E +:10C22000218661864FF4A471E186A1861B21A4F8C2 +:10C230004010A4F844104FF4A471A4F84610A4F8D8 +:10C2400042101B21A4F84A10A4F84C10A4F848107E +:10C2500060734FF448606080A4F8D050A4F8D250C6 +:10C26000A4F8D450A4F8D650A4F8D850A4F8DA50C2 +:10C2700084F8DD5084F8DF50A4F8E65084F8E450E8 +:10C28000A4F8F850A4F8FA5084F89A5184F89B5115 +:10C2900084F8A45184F8A55184F8685184F8705149 +:10C2A00084F8735184F88C5170BD00E041E0A4F82B +:10C2B000E65084F8DE506088FE490144B1FBF0F19D +:10C2C000A4F878104BF68031A4F87A10E388A4F82B +:10C2D0007E50B4F882C0DB000CFB00FCB3FBF0F333 +:10C2E0009CFBF0FC5B1CA4F882C09BB203FB00FC2F +:10C2F00004F15801A4F88030BCF5C84FC4BF5B1EE0 +:10C300000B85B2FBF0F2521CCA8500F5802202F5C3 +:10C31000EE32531EB3FBF0F20A84CB8B03FB00F228 +:10C32000B2FBF0F0C883214604F15800BDE870402C +:10C33000F6E6A4F8E650B4F89411B4F89831B4F8DD +:10C3400002C004F15800A4F87E50B4F88240DB002B +:10C3500004FB0CF4B3FBF1F394FBF1F45B1C448598 +:10C360009BB203FB01F40385B4F5C84FC4BF5B1E49 +:10C370000385B2FBF1F2521CC285428C01EBC20272 +:10C38000521EB2FBF1F20284C28B02FB0CF2B2FB32 +:10C39000F1F1C18370BD70B50025044603290DD0AD +:10C3A0004FF4FA42002963D001297DD0022918BF39 +:10C3B00070BD0146BDE870405830B1E604F1580642 +:10C3C0007821304608F067FCB571F57135737573E7 +:10C3D000F573357475717576B576212086F83E0053 +:10C3E000412086F83F00FE2086F8730084F82C5028 +:10C3F0002584012084F8540084F85500282184F80D +:10C4000056101B21218761874FF4A471E187A18712 +:10C410001B21218661864FF4A471E186A1861B2130 +:10C42000A4F84010A4F844104FF4A471A4F84610E6 +:10C43000A4F842101B21A4F84A10A4F84C10A4F848 +:10C4400048106073A4F8D850202084F8DA0084F8EB +:10C45000D050C4F8D45084F8045184F8055184F8BD +:10C460000E5184F80F5184F8F45084F8005170BDD7 +:10C47000608890490144B1FBF0F1A4F878104BF6C4 +:10C480008031A4F87A10E388A4F87E50B4F882C012 +:10C49000DB000CFB00FC9CFBF0FCB3FBF0F304F1B5 +:10C4A0005801A4F882C000E022E05B1C9BB203FBB1 +:10C4B00000FCA4F88030BCF5C84FC4BF5B1E0B85E0 +:10C4C000B2FBF0F2521CCA8500F5802202F5EE3272 +:10C4D000531EB3FBF0F20A84CB8B03FB00F2B2FBDA +:10C4E000F0F0C883214604F15800BDE8704017E61B +:10C4F000D4F8F830B4F802C004F158005989DB8947 +:10C50000A4F87E50B4F88240DB0004FB0CF4B3FBCB +:10C51000F1F394FBF1F45B1C44859BB203FB01F443 +:10C520000385B4F5C84FC4BF5B1E0385B2FBF1F2AF +:10C53000521CC285428C01EBC202521EB2FBF1F2C8 +:10C540000284C28B02FB0CF2B2FBF1F1C18370BD1D +:10C550002DE9F003047E0CB1252C03D9BDE8F003CE +:10C5600012207047002A02BF0020BDE8F003704788 +:10C5700091F80DC01F2601234F4D4FF00008BCF16C +:10C58000000F73D0BCF1010F1EBF1F20BDE8F003E8 +:10C590007047B0F800C00A7C8F7B91F80F907A400A +:10C5A0004F7C87EA090742EA072282EA0C0C00273F +:10C5B0000CF0FF094FEA1C2C99FAA9F99CFAACFC83 +:10C5C0004FEA19694FEA1C6C49EA0C2C0CEB0C1C65 +:10C5D0007F1C9444FFB21FFA8CFC032FE8D38CEA33 +:10C5E000020C354F0022ECFB057212096FF0240596 +:10C5F00002FB05C2D2B201EBD207427602F0070578 +:10C600003F7A03FA05F52F4218BF82767ED104FBEC +:10C610000CF2120C521CD2B25FF0000400EB040CBE +:10C620009CF813C094453CBFA2EB0C02D2B212D3CB +:10C630000D194FF0000C2D7A03FA0CF73D421CBF88 +:10C64000521ED2B2002A71D00CF1010C0CF0FF0C7A +:10C65000BCF1080FF0D304F1010C0CF0FF04052C21 +:10C66000DCD33046BDE8F0037047FFE790F819C00F +:10C670000C7E474604FB02C20F4C4FF0000CE2FB5D +:10C68000054C4FEA1C1C6FF024040CFB0422D2B2B0 +:10C6900001EBD204427602F0070C247A03FA0CFC78 +:10C6A00014EA0C0F1FBF82764046BDE8F0037047C6 +:10C6B00004E00000FFDB050053E4B36E90F818C0FF +:10C6C000B2FBFCF40CFB1422521CD2B25FF000044B +:10C6D00000EB040C9CF813C094453CBFA2EB0C0289 +:10C6E000D2B212D30D194FF0000C2D7A03FA0CF8C8 +:10C6F00015EA080F1CBF521ED2B27AB10CF1010C20 +:10C700000CF0FF0CBCF1080FF0D300E011E004F1D5 +:10C71000010C0CF0FF04052CDAD3A2E70CEBC401EA +:10C7200081763846BDE8F0037047FFE70CEBC401A3 +:10C7300081764046BDE8F0037047FC4A0168126804 +:10C740001140FB4A126811430160704730B4F94947 +:10C75000F64B00244FF0010C0A78521CD2B20A703A +:10C76000202A08BF0C700D781A680CFA05F52A42C9 +:10C77000F2D0097802680CFA01F15140016030BC36 +:10C78000704770B46FF01F02010C02EA90251F235E +:10C79000A1F5AA4054381CBFA1F5AA40B0F155003C +:10C7A00009D0A1F52850AA381EBFA1F52A40B0F142 +:10C7B000AA00012000D100204FF0000C6246644620 +:10C7C0008CEA0106F6431643B6F1FF3F11D005F09F +:10C7D00001064FEA5C0C4CEAC63C03F00106520825 +:10C7E0006D085B08641C42EAC632162CE8D370BCA4 +:10C7F000704770BC00207047017931F01F0113BFF2 +:10C80000002000221146704710B4435C491C03F01D +:10C81000010C5B0803F00104A4445B0803F001046D +:10C82000A4445B0803F00104A4445B0803F0010482 +:10C83000A4445B0803F001045B08A44403F0010472 +:10C84000A4440CEB53031A44D2B20529DDDB012AC0 +:10C850008CBF0120002010BC704730B40022A1F131 +:10C86000010CBCF1000F11DD431E11F0010F08BFD8 +:10C8700013F8012F5C785FEA6C0C07D013F8025FA5 +:10C8800022435C782A43BCF1010CF7D1491E5CBFFE +:10C89000405C0243002A0CBF0120002030BC7047DE +:10C8A000130008BF704710B401EB030CD41A1CF836 +:10C8B00001CC5B1E00F804C013F0FF03F4D110BCE0 +:10C8C0007047F0B58DB0164610251C466A46AC463A +:10C8D00000EB0C03A5EB0C0713F8013CD355ACF1AE +:10C8E000010313F0FF0CF3D11546103210208446DB +:10C8F0000B18ACEB000713F8013C401ED35510F0A9 +:10C90000FF00F5D1284606F0F3FF86B1102005F1AF +:10C91000200201461318A1EB000C13F8013C401E45 +:10C9200004F80C3010F0FF00F4D10DB0F0BD089801 +:10C930002060099860600A98A0600B98E0600DB0D4 +:10C94000F0BD38B505460C466846F8F7EDFC002802 +:10C9500008BF38BD9DF900202272A07E607294F954 +:10C960000A100020511A48BF494295F82D308B42D9 +:10C97000C8BF38BDFF2B08BF38BDE17A491CC9B21A +:10C98000E17295F82E30994203D8A17A7F2918BF19 +:10C9900038BDA2720020E072012038BD0C2818BFFB +:10C9A0000B2810D00D2818BF1F280CD0202818BF26 +:10C9B000212808D0222818BF232804D024281EBFED +:10C9C000262800207047012070470C2963D2DFE839 +:10C9D00001F006090E13161B323C415C484E002A3A +:10C9E0005BD058E0072A18BF082A56D053E00C2A1B +:10C9F00018BF0B2A51D04EE00D2A4ED04BE0A2F1C9 +:10CA00000F000C2849D946E023B1A2F110000B28F1 +:10CA100043D940E0122A18BF112A3ED090F83600C0 +:10CA200020B1122A37D31A2A37D934E0162A32D342 +:10CA30001A2A32D92FE0A2F10F0103292DD990F83B +:10CA4000360008B31B2A28D925E0002B08BF042A8A +:10CA500021D122E013B1062A1FD01CE0012A1AD1ED +:10CA60001BE01C2A1CBF1D2A1E2A16D013E01F2AF9 +:10CA700018BF202A11D0212A18BF222A0DD0232A1C +:10CA80001CBF242A262A08D005E013B10E2A04D0A0 +:10CA900001E0052A01D000207047012070472DE9F0 +:10CAA000F04187680D4604462046F6F7DAFB98B158 +:10CAB000D5B13846A168F6F715FF002814DD2844E3 +:10CAC000401EB0FBF5F606FB05F13846F5F705FF0D +:10CAD000A0603046BDE8F081F6F7F6F940F2337118 +:10CAE000F5F7FBFEA060DFE70020BDE8F081904293 +:10CAF00028BF704770B50446101B642838BF6420F7 +:10CB000025188D4205D8F6F720FF00281CBF2846BF +:10CB100070BD204670BDC08E11F00C0F08BF70476D +:10CB2000B0F5296F38BF4FF42960704748520200B2 +:10CB30004C520200620100200246808E11F00C0F60 +:10CB400008BF704792F85530D18E13F00C0F04D007 +:10CB5000B1F5296F38BF4FF42961538840F2E24C98 +:10CB600003FB0CF3528E4FF4747C0CEB821C8C454F +:10CB70009CBF910101F57471591AA1F59671884213 +:10CB800028BF0846B0F5296F38BF4FF429607047B9 +:10CB9000084418449830002A14BF04210021084496 +:10CBA0007047F0B4002A14BF08220122002B14BFE2 +:10CBB0000824012412F00C0F8B8ECA8E25D091F818 +:10CBC0005550944615F00C0F04D0BCF5296F38BFB2 +:10CBD0004FF4296C4D8840F2E2466E434D8E4FF47F +:10CBE000747707EB851767459CBF4FEA851C0CF5EA +:10CBF000747CA6EB0C0CACF5967C634528BF6346B1 +:10CC0000B3F5296F38BF4FF4296314F00C0F04D02B +:10CC1000B2F5296F38BF4FF429621FFA83FC002850 +:10CC20000CBF0123002391F8560014F00C0F08BF2D +:10CC300000200CEB020108449830002B14BF0421A3 +:10CC400000210844F0BC70472DE9F00391F854200E +:10CC50000B8E12F00C0F4FF474771CBF07EB83138D +:10CC60009CB255D012F00C0F8B8ECA8E4D8E91F85F +:10CC700055C021D016461CF00C0F04D0B6F5296F14 +:10CC800038BF4FF42966B1F8028040F2E24908FB50 +:10CC900009F807EB8519B14502D8AE0106F574769F +:10CCA000A8EB0606A6F59676B34228BF3346B3F541 +:10CCB000296F38BF4FF42963A34228BF23469CB293 +:10CCC0001CF00C0F1CBF07EB85139BB228D000BFD4 +:10CCD0001CF00C0F04D0B2F5296F38BF4FF4296255 +:10CCE0009A4228BF1A4600280CBF0123002391F85E +:10CCF00056001CF00C0F08BF0020A1180844983003 +:10CD0000002B14BF042100210844BDE8F003704744 +:10CD1000022A07BF9B003C33DB0070339CB2A1E7C3 +:10CD2000BCF1020F07BFAB003C33EB0070339BB28A +:10CD3000CEE710F0010F1CBF0120704710F0020F6A +:10CD40001CBF0220704710F0040018BF0820704775 +:10CD50002DE9F0470446174689464FF0010808467A +:10CD600000F0D1FC0546484600F0D1FC10F0010F60 +:10CD700018BF012625D000BF15F0010F18BF0123F1 +:10CD80002AD000BF56EA030108BF4FF0000810F098 +:10CD9000070F08BF002615F0070F08BF002394F8FF +:10CDA0005400B0420CBF00203046387094F8551043 +:10CDB000994208BF00237B70002808BF002B25D1B3 +:10CDC00015E010F0020F18BF0226D5D110F0040FA5 +:10CDD00014BF08260026CFE715F0020F18BF022364 +:10CDE000D0D115F0040F14BF08230023CAE748462A +:10CDF00000F093FCB4F85810401A00B247F6FE71E8 +:10CE0000884201DC002801DC4FF0000816B1082E32 +:10CE10000CD018E094F85400012818BF022812D052 +:10CE200004281EBF0828FFDF032D0CD194F8A401AD +:10CE300048B1B4F8A801012894F8540006D0082895 +:10CE400001D0082038704046BDE8F087042818BF9C +:10CE50000420F7D1F5E7012814BF0228704710F02D +:10CE60000C0018BF0420704738B4CBB2C1F3072CB4 +:10CE7000C1B2C0F30724012B07D0022B09D0042B29 +:10CE800008BFBCF1040F2DD006E0BCF1010F03D1A7 +:10CE900028E0BCF1020F25D0012906D0022907D0D5 +:10CEA000042908BF042C1DD004E0012C02D119E094 +:10CEB000022C17D001EA0C0161F3070204EA030116 +:10CEC00061F30F22D1B211F0020F18BF022310D06C +:10CED000C2F307218DF8003011F0020F18BF0221B4 +:10CEE0001BD111E0214003EA0C03194061F3070252 +:10CEF000E6E711F0010F18BF0123E9D111F0040F8B +:10CF000014BF08230023E3E711F0010F18BF01212C +:10CF100003D111F0040118BF08218DF80110082B6E +:10CF200001BF000C012804208DF80000BDF80000AE +:10CF300038BC70474FF0000C082902D0042909D0F2 +:10CF400011E001280FD10420907082F803C01380F3 +:10CF500001207047012806D00820907082F803C095 +:10CF600013800120704700207047162A10D12A2212 +:10CF70000C2818BF0D280FD04FF0230C1F280DD000 +:10CF800031B10878012818BF002805D0162805D02F +:10CF900000207047012070471A70FBE783F800C03B +:10CFA000F8E7012908D002290BD0042912BF08296B +:10CFB00040F6A660704707E0002804BF40F2E24058 +:10CFC000704740F6C410704700B5FFDF40F2E24002 +:10CFD00000BD0000282107F03CBE4078704730B506 +:10CFE0000546007801F00F0220F00F001043287072 +:10CFF000092910D2DFE801F0050705070509050B2F +:10D000000D00062409E00C2407E0222405E0012499 +:10D0100003E00E2401E00024FFDF6C7030BD0078D7 +:10D0200000F00F0070470A68C0F803208988A0F854 +:10D0300007107047D0F803200A60B0F80700888016 +:10D0400070470A68C0F809208988A0F80D10704759 +:10D05000D0F809200A60B0F80D0088807047027887 +:10D06000402322F0400203EA81111143017070470E +:10D070000078C0F3801070470278802322F080028D +:10D0800003EAC1111143017070470078C00970476D +:10D09000027802F00F02072A16BF082AD0F80520EE +:10D0A000D0F80320C1F809200CBFB0F80920B0F86F +:10D0B0000720A1F80D200A7822F080020A7000787B +:10D0C000800942EAC0100870704770B514460E46D9 +:10D0D00005461F2A88BFFFDF2246314605F10900B9 +:10D0E00007F038FDA01D687070BD70B544780E461D +:10D0F0000546062C38BFFFDFA01F84B21F2C88BF57 +:10D100001F24224605F10901304607F023FD204681 +:10D1100070BD70B514460E4605461F2A88BFFFDF56 +:10D120002246314605F1090007F014FDA01D687084 +:10D1300070BD70B544780E460546062C38BFFFDF3B +:10D14000A01F84B21F2C88BFFFDF224605F1090112 +:10D15000304607F0FFFC204670BD0968C0F80F108C +:10D1600070470A88A0F8132089784175704790F8B5 +:10D17000242001F01F0122F01F02114380F8241027 +:10D180007047072988BF072190F82420E02322F068 +:10D19000E00203EA4111114380F8241070471F3068 +:10D1A00007F08EBE10B5044600F0E3FA002818BF61 +:10D1B000204410BDC17811F03F0F1BBF027912F05F +:10D1C000010F0022012211F03F0F1BBF037913F062 +:10D1D000020F002301231A4402EB4202530011F014 +:10D1E0003F0F1BBF027912F0080F0022012203EB50 +:10D1F000420311F03F0F1BBF027912F0040F00220F +:10D200000122134411F03F0F1BBF027912F0200FCF +:10D210000022012202EBC20203EB420311F03F0F96 +:10D220001BBF027912F0100F0022012202EB420212 +:10D230001A4411F03F0F1BBF007910F0400F00207F +:10D240000120104410F0FF0014BF01210021084408 +:10D25000C0B2704770B50278417802F00F02082A18 +:10D260004DD2DFE802F004080B4C4C4C0F14881F21 +:10D270001F280AD943E00C2907D040E0881F1F2847 +:10D2800003D93CE0881F1F2839D8012070BD4A1EF1 +:10D29000242A34D88446C07800258209032A09D07C +:10D2A00000F03F04601C884204D86046FFF782FF0C +:10D2B000A04201D9284670BD9CF803004FF001063A +:10D2C00010F03F0F1EBF1CF10400007810F0100F8B +:10D2D00013D064460421604600F04BFA002818BFC2 +:10D2E00014EB0000E6D0017801F03F012529E1D2DE +:10D2F00080780221B1EB501FDCD3304670BD002096 +:10D3000070BDC078800970470178002201F00F03DA +:10D310000121042B0BD0082B1CBF00207047437841 +:10D320000E2B04BFC3785FEA931C04D106E040785B +:10D33000801F1F2800D911460846704713F03F0F81 +:10D340001EBF007910F0010F10F0020FF4D1F2E7C8 +:10D3500010B4017801F00F01032920D0052921D153 +:10D360004478B0F81910B0F81BC0B0F81730827DBF +:10D37000222C17D1062915D3B1F5486F98BFBCF5FB +:10D38000FA7F0FD272B1082A98BF8A420AD28B4222 +:10D390009CBFB0F81D00B0F5486F03D805E0407899 +:10D3A0000C2802D010BC0020704710BC0120704730 +:10D3B0002DE9F0411F4614460D00064608BFFFDF69 +:10D3C0002146304600F0D5F9040008BFFFDF3019D0 +:10D3D0003A462946BDE8F04107F0BCBBC07800F0F2 +:10D3E0003F007047C02202EA8111C27802F03F027A +:10D3F0001143C1707047C9B201F00102C1F340038B +:10D400001A4402EB4202C1F3800303EB4202C1F370 +:10D41000C00302EB4302C1F3001303EB43031A44BE +:10D42000C1F3401303EBC30302EB4302C1F38013C8 +:10D430001A4412F0FF0202D0521CD2B20171C3781A +:10D4400002F03F0103F0C0031943C170511C417049 +:10D4500070472DE9F0410546C078164600F03F04BC +:10D46000C4F124000F46B042B8BFFFDF281932468E +:10D470003946001D07F06EFBA019401C6870BDE81E +:10D48000F0812DE9F04105464478C0780F4600F060 +:10D490003F06002C08BFFFDFA01B401E84B21F2CDC +:10D4A00088BF1F242FB1A819011D2246384607F056 +:10D4B00051FB2046BDE8F0814078704700B5027806 +:10D4C00001F0030322F003021A430270012914BF82 +:10D4D0000229002104D0032916BFFFDF012100BD6E +:10D4E000417000BD00B5027801F0030322F0030291 +:10D4F0001A430270012914BF0229002104D0032914 +:10D5000016BFFFDF012100BD417000BD007800F0B3 +:10D5100003007047417889B1C0780E2818BF0F28E2 +:10D5200003D0102818BF192802D3FB2904D905E01D +:10D53000BF4A105C884201D101207047002070472B +:10D5400030B501240546C17019293CBFB848445C78 +:10D5500002D3FF2918BFFFDF6C7030BD70B51546D0 +:10D560000E4604461B2A88BFFFDF65702A463146F7 +:10D57000E01CBDE8704007F0EDBAB0F80700704756 +:10D58000B0F809007047C172090A01737047B0F81A +:10D590000B00704730B4B0F80720A64DB0F809C0B2 +:10D5A000B0F805300179941F2D1998BFBCF5FA7FAA +:10D5B0000ED269B1082998BF914209D293429FBF08 +:10D5C000B0F80B00B0F5486F012030BC98BF704731 +:10D5D000002030BC7047001D07F072BC021D0846D9 +:10D5E000114607F06DBCB0F809007047007970472C +:10D5F0000A68426049688160704742680A608068D2 +:10D600004860704709888181704780890880704729 +:10D610000A68C0F80E204968C0F812107047D0F8A8 +:10D620000E200A60D0F81200486070470968C0F800 +:10D6300016107047D0F81600086070470A684260FC +:10D6400049688160704742680A6080684860704736 +:10D650000968C1607047C06808607047007970470A +:10D660000A68426049688160704742680A60806861 +:10D67000486070470171090A417170478171090A58 +:10D68000C17170470172090A417270478172090ABB +:10D69000C172704780887047C088704700897047A2 +:10D6A0004089704701891B2924BF4189B1F5A47FB6 +:10D6B00007D381881B2921BFC088B0F5A47F012032 +:10D6C0007047002070470A6842604968816070476F +:10D6D00042680A60806848607047017911F0070F5E +:10D6E0001BBF407910F0070F00200120704701791F +:10D6F00011F0070F1BBF407910F0070F0020012029 +:10D7000070470171704700797047417170474079E7 +:10D7100070478171090AC1717047C088704746A27D +:10D7200082B0D2E90012CDE900120179407901F00E +:10D73000070269461DF80220012A07D800F00700F9 +:10D74000085C01289EBF012002B07047002002B093 +:10D750007047017170470079704741717047407997 +:10D76000704730B50C460546FB2988BFFFDF6C705B +:10D7700030BDC378024613F03F0008BF7047052054 +:10D78000127903F03F0312F0010F36D0002914BFC5 +:10D790000B20704712F0020F32D0012914BF801DF8 +:10D7A000704700BF12F0040F2DD0022914BF401C97 +:10D7B000704700BF12F0080F28D0032914BF801C47 +:10D7C000704700BF12F0100F23D0042914BFC01CF3 +:10D7D000704700BF12F0200F1ED005291ABF12306B +:10D7E000C0B2704712F0400F19D006291ABF401C72 +:10D7F000C0B27047072918D114E00029CAD114E03B +:10D800000129CFD111E00229D4D10EE00329D9D1C9 +:10D810000BE00429DED108E00529E3D105E0062963 +:10D82000E8D102E0834288BF7047002070470000C3 +:10D830005052020086F3FFFF0001010201020203C1 +:10D840002DE9F041FC4D0446284600216A788068A5 +:10D8500001270E4612B1012A1ED006E090F866207C +:10D86000002A18BF6F7000D001216A78C2EB421203 +:10D8700000EB420292F82830194324D0667090F8E9 +:10D88000D90002F12A0170B12A22201D07F062F9A5 +:10D890000420207027710DE090F82820002A18BF7E +:10D8A0006E70E1D1E1E73C22201D07F053F905201D +:10D8B000207027716878A968C0EB401001EB400028 +:10D8C00080F828601DE090F8A410E9B190F8D90024 +:10D8D000012818BFFFDFA868D0F8A5106160D0F854 +:10D8E000A910A160D0F8AD10E160D0F8B1102161AD +:10D8F00090F8B5102175667013212170277180F89A +:10D90000A4600120BDE8F08190F82210012922D006 +:10D91000017801291CBF0020BDE8F0816670142148 +:10D920002170811C2022201D07F014F92672A9689D +:10D930000E70C24882888284D0F8C420527B80F85E +:10D94000262080F82270D1F8C4000088F3F7BEFAD0 +:10D95000F2F765FFD5E7667007212170416A6160C3 +:10D9600080F82260CDE7B44880680178002914BFB0 +:10D9700080884FF6FF7070472DE9F84F4FF0000890 +:10D98000894606460127CDF80080FFF748FBBDF821 +:10D990000010A94D21F06004ADF8004008284FD2D6 +:10D9A000DFE800F004070D4E184E132C44F003007E +:10D9B0000DE044F01500ADF80000474641E044F0AA +:10D9C000100000BFADF800003BE044F0020040F062 +:10D9D0001000F7E7A86890F8E000052818BFFFDFFF +:10D9E00044F01A00ADF80000A96891F8E71000298A +:10D9F00014BF40F0010020F00100E3E7A86890F8B0 +:10DA0000E01003290AD090F8E01006295DD090F8C4 +:10DA1000E000042818BFFFDF64D012E03046FFF7B3 +:10DA200070FC002818BFFFDF0AD1F07810F03F0F1C +:10DA30001FBF307910F0020F44F00400ADF8000071 +:10DA40004746BDF800000090BDF80000C0F3C00BD1 +:10DA5000A868CBEB4B1A00EB4A0090F8280000288E +:10DA600018BFBDE8F88F3046FFF7D9FA80467248F4 +:10DA7000806800EB4A0190F8C90001F12A040128EE +:10DA800008BF012508D0022808BF022504D00428B9 +:10DA900016BF08280325FFDF257300206073664842 +:10DAA000806890F8E11084F83B10FF21A1737F217A +:10DAB000E176BDF80010618190F8E01004291CBFE8 +:10DAC00090F8E01006293AD049E044F00A01ADF898 +:10DAD000001090F8FA00002814BF41F0040021F073 +:10DAE00004006FE73046FFF70CFCD8B1012804BFF3 +:10DAF00044F00100ADF8000014D0022818BFFFDF89 +:10DB00009FD144F00200ADF80000A96891F8FA1026 +:10DB1000002914BF40F0040020F00400ADF800001C +:10DB200047468EE7F07810F03F0F1FBF307910F0B6 +:10DB3000020FBDF8000040F0040082D042E790F8E8 +:10DB4000E200012808BF012508D0022808BF0225ED +:10DB500004D0042816BF08280325FFDF657304F1ED +:10DB600009000090344D28787F2808BFFFDF29780E +:10DB7000009801707F2028706FB1B8F1070F04F191 +:10DB80001C01304603D2FFF7B0FA207239E0FFF7EC +:10DB900078FC207204E000202072B8F1070F30D327 +:10DBA000B8F1070F0DD1A86890F8F91001B3D0F8BB +:10DBB000EA10C4F80210B0F8EE10E18090F8F0001E +:10DBC0006070A07A10F0040F0ED0A86890F8FA10D8 +:10DBD000E9B190F8F7102175D0F8F110C4F81510DC +:10DBE000B0F8F500A4F81900B8F1070F38D098E0A4 +:10DBF000F07810F03F0F1ABF307910F0010FFF20BE +:10DC0000DED0621CA11C304601F0E4FCD9E7B8F17B +:10DC1000070F1CBFB8F1010FFFDFB9F1000F08BFFC +:10DC2000FFDF99F800002075B8F1010F08D0B8F1B6 +:10DC3000070F0BD075E0000064010020CC1000201D +:10DC400004F115013046FFF703FA6AE0012130467E +:10DC5000FFF7A8FA0168C4F815108088A4F8190025 +:10DC6000F07810F03F0F1CBF317911F0080F1AD077 +:10DC7000A86890F8E020042A06D090F8E000032875 +:10DC800011D111F0100F0ED003213046FFF78AFAA0 +:10DC9000407803210009A0733046FFF783FA00881B +:10DCA000C0F30B002082F07810F03F0F1CBF3079DA +:10DCB00010F0400F13D0FE48FFF723FBA96891F83E +:10DCC000E020032A14D006213046FFF76BFA0078D3 +:10DCD000E076A86890F8E010062922D118E0A8683C +:10DCE00090F8FB10002918BF90F8F800F0D1F0E789 +:10DCF00091F8C910042914BF08290028E3D1F0784D +:10DD000010F03F0F1CBF307910F0080FDBD1E0E7B7 +:10DD100090F8E9100909A173B0F8E800C0F30B000E +:10DD20002082A968012001EB4A0181F82800BBF19B +:10DD3000000F14BF06200520BDE8F84F03F02CBAF1 +:10DD40002DE9F041DB4DAA6892F8D930002B6ED056 +:10DD50007F27012611B10978FE2914D0804692F858 +:10DD60002800002818BFBDE8F08102F12A044046CF +:10DD7000FFF755F90021082879D2DFE800F0515368 +:10DD800056787878595CCA4C92F8A400002818BFDD +:10DD9000BDE8F08182F8A66092F8DD0018B1F6F7D0 +:10DDA000DAFC012829D02046FFF762F90146A8686D +:10DDB00080F8A71000F1A8012046FFF73BF92046A4 +:10DDC000FFF763F90146A86880F8AE1000F1AF01D3 +:10DDD0002046FFF73DF9A86800F1B50428787F28B0 +:10DDE00008BFFFDF287820702F70A86880F8A46033 +:10DDF000BDE8F041052003F0CFB9F6F7EFFCA968C4 +:10DE000001F1A802A731FDF7FDFE002808BFFFDFE2 +:10DE1000A86890F8A71041F0020180F8A710CEE79B +:10DE2000A17209E0A67221720CE0032001E021E05A +:10DE30000220A07200E0FFDF04F10B014046FFF773 +:10DE400054F92072621CA11C404601F0C3FB2878E3 +:10DE500009347F2808BFFFDF287820702F70A8685A +:10DE600080F82860BDE8F041052003F095B92172E3 +:10DE7000BDE8F081BDE8F0417EE570B58D4C002233 +:10DE8000A06890F8C910104602F0D4FF002831D0E5 +:10DE9000F7F763F9A068884990F8DF000D5C284621 +:10DEA000F6F7E7FEA06880F8E15090F8C91008295D +:10DEB00016BF04290F202520F6F7F9FDA0680021E0 +:10DEC00090F8C9200120F6F7D4FF7948F7F74EF90A +:10DED000A068D0F80001F7F74CF9A06890F8C910D5 +:10DEE00080F8E21090F8C800032814BF0228012926 +:10DEF00008D103E0BDE8704001F0A5BB0821002077 +:10DF0000F7F72AFAA06890F8C91080F8E210F7F73E +:10DF100000FAA06890F8C95090F8DD0040B1F6F71B +:10DF2000E6FB15F00C0F0CBF40205520F7F7D2F997 +:10DF3000A168032081F8E00070BD2DE9F0410F4693 +:10DF4000904605460321FFF72DF94078594C020908 +:10DF5000A06890F8E91062F3071180F8E910032136 +:10DF60002846FFF71FF90188A068B0F8E82061F3A0 +:10DF70000B02A0F8E82080F8E77090F8C91001299A +:10DF800005D090F8E000032808BFBDE8F081E878EC +:10DF90004FF0010610F03F0F1CBF287910F0400F22 +:10DFA00009D006212846FFF7FDF80178A06880F81F +:10DFB000F81080F8FB60A06890F8E01003292AD0E0 +:10DFC000E97811F03F0F1CBF297911F0010F08D03B +:10DFD00000F1F002911F284601F0FCFAA06880F8D9 +:10DFE000F960E87810F03F0F1ABF287910F0020F9F +:10DFF000BDE8F08101212846FFF7D4F8A168026846 +:10E00000C1F8F1208088A1F8F50081F8F78081F847 +:10E01000FA60BDE8F081022F18BF012FD0D1BDE812 +:10E02000F0812DE9F84F0446C07810F03F0F1CBF77 +:10E03000207910F0020F05D010F0010F18BF4FF03B +:10E04000010901D14FF0000900271A4DB9F1000F65 +:10E050005BD020780026C70901212046FFF7A2F8EF +:10E060003FB1407900F0C000402808BF4FF00108E0 +:10E0700001D04FF00008A86890F8C810032906D115 +:10E0800090F8C110002918BF90F8CC0001D190F889 +:10E09000DE00FDF7A5FD070015D01021FEF7DDFB22 +:10E0A000B8F1000F0FD001212046FFF77BF805E003 +:10E0B000D811002064010020785202000146384641 +:10E0C000F7F7D4FC0646A868B8F1000F90F8B970CD +:10E0D00018BF47F00207E07810F03F0F1CBF20790F +:10E0E00010F0020F0ED02046FEF7CFFF824601212E +:10E0F0002046FFF757F85146F6F769FD002818BF8C +:10E10000012000D1002030435BD0E07810F03F0FB9 +:10E110001EBF217911F0100F11F0080F3FD004211C +:10E120002046FFF73FF80646A86890F8E20002F0A4 +:10E1300078FE0146304601F0A8FAA0B13A46002127 +:10E140002046FFF7FAFEF848FFF7DBF80146A8681B +:10E1500080F8E6103188A0F8E310B17880F8E51077 +:10E160000120BDE8F88FA86890F8E20001283AD1B4 +:10E17000E07810F03F0F1CBF207910F0010F32D073 +:10E18000B9F1000F04D100212046FFF7F5FB2AE08A +:10E190008DF8007069462046FFF7EEFB23E010F093 +:10E1A0003F0F1CBF217911F0100F1CD110F03F0F51 +:10E1B0001CBF207910F0010F15D0B9F1000FE7D185 +:10E1C000E1E7A86890F8CA00032818BF02280AD11E +:10E1D000B8F1000F07D036B9D448694600680090FE +:10E1E0002046FFF7C9FB0020BDE8F88FD0498968B9 +:10E1F00081F80A01704770B5CD4DA86890F8E0101D +:10E20000022919BF90F8E010012900210C461CBF1B +:10E210000C2070BDC1EB411200EB4202034682F8B4 +:10E220002840491CC9B20229F4D3047080F8224066 +:10E2300093F8DD0030B1F7F757F8F6F76CFAA868F5 +:10E2400080F8DD40A868012180F8DC4080F8C1102A +:10E2500080F8C84080F8DF40282180F80B1180F852 +:10E260000A41A0F8E34080F8E540072180F8C0109B +:10E27000002070BDAE4810B58068002180F8E01025 +:10E28000012180F8E010FFF7B6FF002818BFFFDF7C +:10E2900010BD2DE9F047A64C07460C26A06890F863 +:10E2A000E01001291FBF90F8E00002280C20BDE813 +:10E2B000F087F6F73CFCA06890F90A01F6F7C7FC76 +:10E2C000A06890F8C91080F8E21090F8C0100125FD +:10E2D000002978D090F8C8004FF00009032802D038 +:10E2E000022805D008E00521924801F03AFA03E03F +:10E2F0000321904801F035FAA06890F8D810002961 +:10E3000004BF90F8DB00002843D0F4F7DDFD06469B +:10E31000A0683146D0F8D400F5F7E4FA864990FBBE +:10E32000F1F801FB180041423046F4F7D6FA0146F5 +:10E33000A068C0F8D410D0F8D0104144C0F8D01074 +:10E34000FDF72FFC0146A068D0F8D020914220D8DC +:10E35000C0E9349690F8DB0000281CBF0120FDF7CF +:10E3600044FD0121A06890F8DC20002A1CBF90F831 +:10E37000D820002A0DD090F8B93000F1BA02012B54 +:10E3800004D1527902F0C002402A14D0BA30F7F713 +:10E39000D5FBA06890F8B910BA30F6F710FC0F2141 +:10E3A0000720F6F728FCA068002690F8E010012965 +:10E3B00018D112E007E0FDF745FDA1682A46BA3101 +:10E3C000F7F785FBE5E790F8E010022904BF80F835 +:10E3D000E0500C2006D1BDE8F08780F804510221FE +:10E3E00080F8E010A06890F8C10088B1FDF7A5FCA6 +:10E3F00003214D48FDF7DDFC0146A06880F8DD10E3 +:10E40000C0F800714D48F6F79AFE3046BDE8F08737 +:10E41000FDF73CFCECE738B5454CA06890F8E010FF +:10E4200002291CBF0C2038BD012180F80511A0F87D +:10E43000081129208DF800006846F5F77DFD30B100 +:10E44000A0689DF8001090F80601884205D1A068E8 +:10E4500090F80601401C8DF80000A1689DF80000AE +:10E4600081F806010220F6F77EFE3548F6F7F9FB43 +:10E47000A168DFF8D0C0002091F8C03091F8DF200B +:10E48000521CACFB02546408A4EB8404224481F8BF +:10E49000DF2023FA02F212F0010F03D1401CC0B2B8 +:10E4A0000328EBD3FFF7E9FC002038BD2049896839 +:10E4B00081F8C900002070471D49896881F8DA0099 +:10E4C000704710B51A4CA36893F8B830022B14BFEC +:10E4D000032B00280BD100291ABF0229012000209C +:10E4E0001146FDF761FB08281CBF012010BDA06884 +:10E4F00090F8B800002816BF022800200120BDE8CF +:10E500001040F7F7A5BA0A48806890F8B8000028CC +:10E5100016BF022800200120F7F79ABA044989683B +:10E5200081F8B80070470000D81100206C5202003A +:10E53000640100200012002040420F0075520200CA +:10E540007B520200ABAAAAAAF749896881F8DC00CD +:10E55000704770B5F44CA16891F8B800002816BF58 +:10E5600002280020012081F8B900BA31F7F75AFAE1 +:10E57000A06890F8B810022916BF032901210021D4 +:10E5800080F8DB1090F8B920002500F1BA03012AC9 +:10E5900004BF5B7913F0C00F0AD000F1BA03012A5F +:10E5A00004D15A7902F0C002402A01D0002200E0D2 +:10E5B000012280F8D820002A04BF002970BDC0F8CD +:10E5C000D050F4F781FCA168C1F8D40091F8DB00C9 +:10E5D00000281CBF0020FDF708FC0026A06890F86A +:10E5E000DC1000291ABF90F8D810002970BD90F8EF +:10E5F000B92000F1BA01012A04D1497901F0C00122 +:10E60000402905D02946BDE87040BA30F7F796BAE0 +:10E61000FDF718FCA1683246BDE87040BA31F7F743 +:10E6200056BA70B5C04D0C4600280CBF012300231C +:10E63000A96881F8C13081F8CB004FF0080081F85B +:10E64000CC000CD1002C1ABF022C01200020114656 +:10E65000FDF7AAFAA968082881F8CC0001D00020AB +:10E6600070BD022C14BF032C1220F8D170BD0028FD +:10E6700018BF112070470328AB4A926808BFC2F840 +:10E68000C41082F8C8000020704710B5044602F09C +:10E6900083FF052809D002F07FFF042805D0A24897 +:10E6A000806880F8D940002010BD0C2010BD9E4825 +:10E6B000816891F8C800032804D0012818BF0228F7 +:10E6C00007D004E091F8CB00012808BF7047002074 +:10E6D000704791F8CA00012814BF03280120F6D121 +:10E6E000704710B5F6F7EAFDF6F79EFDF6F7CEFC9B +:10E6F000F6F72BFD8C4CA06890F8DD0038B1F6F7EA +:10E70000F3FDF6F708F8A168002081F8DD00A068A5 +:10E71000012180F80411022180F8E010002010BDD2 +:10E720008149896881F8FC0070477F4902788968CF +:10E73000012A06D0042A24D0052A0CBF1120122059 +:10E74000704742780023032A08BFC1F8C43081F81B +:10E75000C820012281F8C920C27881F8B820027946 +:10E76000002A16BF022A0123002381F8C13081F854 +:10E77000CA20427981F8C020807981F8DA0000202F +:10E78000704782780023032A08BFC1F8C43081F89B +:10E79000C8200822DEE764488068704700F053BF55 +:10E7A0002DE9F84F00256048F6F7BEFD5E4C4FF0AE +:10E7B0007F0A002808BF84F800A0F6F7A0FD5B4898 +:10E7C000FEF72DFCA0700146A06890F8E2204FF003 +:10E7D00003084FF000094FF0010B012A10D0042A62 +:10E7E0001CBF082AFFDF00F05782A06890F8DD0008 +:10E7F00018B1F6F779FDF5F78EFF2846BDE8F88FDA +:10E800004A4D0026A5F58677072936D290F8C10033 +:10E8100028B9F6F71EFA002808BF002600D0012606 +:10E82000A06890F8DD0080B1FDF715FAA168FF2817 +:10E8300081F8DE0001460DD0E81CFDF701FAA06862 +:10E8400090F8DE00FDF712FA0643A06890F8DE00AB +:10E85000FF2817D1FDF7A1FA87F8DE0097F8C1105D +:10E8600081B108280ED12878E91CC0F38010FDF78B +:10E870009BF9082818BF002604E002BF90F8D900D1 +:10E8800000280126A07808283CD2DFE800F03FB934 +:10E89000043B3B3B17FD36B1A06890F8C800012847 +:10E8A00018BF022803D0F6F7F1FB45469DE7F6F7BF +:10E8B000EDFB00211D48FFF743FAF6E716B3A06809 +:10E8C00090F8C800022802D0012815D01AE00021D3 +:10E8D0001648FFF735FAA0680825C0F8E790C0F899 +:10E8E000EB90C0F8EF90C0F8F390C0F8F79080F884 +:10E8F000FB9080F8E79078E700210C48FFF720FABA +:10E9000000F040B9F6F7C2FB03256EE70020002EA9 +:10E9100071D0A26892F8C810022909D0012925D027 +:10E92000032928D06AE0000064010020D8110020EB +:10E930000021FE48FFF704FAA16891F8050128B10B +:10E94000401E10F0FF0081F8050154D1C1F8E79096 +:10E95000C1F8EB90C1F8EF90C1F8F390C1F8F790CF +:10E9600081F8FB90082081F8E7B047E00021EF48EC +:10E97000FFF7E6F941E0D2F8C400E978837E9942D6 +:10E980001BD12979C37E994217D16979037F9942B6 +:10E9900013D1A979437F99420FD1E979837F9942B5 +:10E9A0000BD1297AC37F994207D12978437EC1F3DD +:10E9B0008011994208BF012100D0002192F8CB209C +:10E9C000012A01D079B10CE059B900F11A01D748F8 +:10E9D000FEF730FBD548FEF74BFBA168D1F8C41019 +:10E9E00048760A200AE097F8CC00082803D097F868 +:10E9F000DE108142F5D0F6F749FB03200546F4E628 +:10EA0000A06890F8DB1000290CBF4FF0010B4FF00D +:10EA1000000B4FF000082978CA0905F1090107D059 +:10EA2000497901F0C001402908BF4FF0010901D028 +:10EA30004FF0000990F8C810032906D190F8C110D2 +:10EA4000002918BF90F8CC0001D190F8DE00FDF746 +:10EA5000C7F85FEA000A13D01021FDF7FEFE002878 +:10EA600018BF4FF0010BB9F1000F04BFA06890F878 +:10EA7000B9A00FD005F109015046F6F7F7FF80461F +:10EA8000A06890F8B9A000E093E0B9F1000F18BFBA +:10EA90004AF0020A90F8C81003290ED0F6F7F6FAE9 +:10EAA000F6B3F6F7A4F850EA08006DD08DF800A090 +:10EAB00069469E48FFF744F964E0D0F8C400E9785D +:10EAC000827E91421BD12979C27E914217D1697908 +:10EAD000027F914213D1A979427F91420FD1E97906 +:10EAE000827F91420BD1297AC27F914207D1297846 +:10EAF000407EC1F38011814208BF012500D000256E +:10EB000097F8DE00082806D097F8CC10884208BF96 +:10EB10004FF0010901D04FF00009B8F1000F00E0FB +:10EB200032E005D1BBF1000F04D0F6F760F808B170 +:10EB3000012100E000214EB197F8CB00012803D05D +:10EB400020B955EA090001D0012000E0002001426F +:10EB500016D0A06890F8CB10012908BF002D0DD168 +:10EB6000D0F8C40000F11A017048FEF763FA6F484C +:10EB7000FEF77EFAA168D1F8C41048760A2534E67B +:10EB8000F6F784FA032530E6A06890F8CA00032857 +:10EB900018BF0228F6D1B9F1000FF3D0B8F1000F79 +:10EBA000F0D163486946406800906048FFF7C8F8B4 +:10EBB000E8E7A06890F8DA0000283FF4A3AEF6F783 +:10EBC00065FAA06890F8D9100029DBD1C0F8E79069 +:10EBD000C0F8EB90C0F8EF90C0F8F390C0F8F79051 +:10EBE00080F8FB9080F8F8A05048FEF78AFB50B3FD +:10EBF000012836D00228C5D1A068032590F8C800A6 +:10EC0000032814BF0020012036EA00003FF4EDADD8 +:10EC1000464E1820F17811F03F0F3FF4E6AD317900 +:10EC200088437FF4E2AD04213046FEF7BBFA074685 +:10EC3000A06890F8E20002F0F4F80146384600F0CF +:10EC400024FDE8BBD1E5002E9CD0A06890F8C80058 +:10EC5000012818BF022895D13448FFF7E2F980BB9C +:10EC600090E7002E8ED0314D1820E97811F03F0F3B +:10EC700088D02979884385D104212846FEF792FA65 +:10EC80000646A06890F8E20002F0CBF80146304654 +:10EC900000F0FBFC98BB75E707297FF433AEC0F8A2 +:10ECA000E790C0F8EB90C0F8EF90C0F8F390C0F890 +:10ECB000F79080F8FB90012680F8F8A01B4801E04F +:10ECC0007FE01AE0FEF71DFB38B1012818D00228BA +:10ECD0004DD0F6F7DBF9454687E5F6F7D7F9A0689A +:10ECE00090F8C800012818BF02287FF44BAF0F48E6 +:10ECF000FFF797F900283FF445AF042575E522E0BA +:10ED0000F6F7C4F9094D1820E97811F03F0F3FF4E8 +:10ED100039AF297988437FF435AF04212846FEF7BF +:10ED200041FA0646A06890F8E20003E0D8110020FE +:10ED30006C52020002F075F80146304600F0A5FC66 +:10ED400000283FF41FAF002201212846FFF7F5F805 +:10ED5000F748FEF7D6FA0146A06880F8E610318839 +:10ED6000A0F8E310B17880F8E51004253DE503250F +:10ED7000F6F78CF9A06890F8C800032814BF0020AB +:10ED8000012036EA00003FF430ADE94E1820F1785A +:10ED900011F03F0F3FF429AD317988437FF425AD61 +:10EDA00004213046FEF7FEF90746A06890F8E2001D +:10EDB00002F037F80146384600F067FC00283FF4BF +:10EDC00014AD002202213046FFF7B7F8D848FEF70D +:10EDD00098FA0146A06880F8E6103988A0F8E31098 +:10EDE000B97880F8E5100425FFE42DE9F041D14C15 +:10EDF000A0680078002818BFFFDF0025A068012761 +:10EE00008570D0F8C4100A8882804A8842838A8834 +:10EE10008283C988C18380F82050C74990F8DB20DD +:10EE2000A1F59A764AB10A78C2F38013CA1C23B1BD +:10EE3000527902F0C002402A33D090F8DC2042B16F +:10EE400011F8032BC2F380121AB1497911F0C00FE7 +:10EE500027D00E3006F022F8A06890F8DD0018B137 +:10EE6000F5F779FC012824D0A068D0F8C4104A7EB8 +:10EE7000C271D1F81A208260C98B818145610583F6 +:10EE8000A0680770D0F8C42090F80A1182F85710D3 +:10EE9000D0F8C4000088F2F719F8BDE8F041F1F7A6 +:10EEA000AFBCD6F83711C0F80E10B6F83B1141824E +:10EEB000D2E7F5F793FCA16801F10802C91DFCF740 +:10EEC000A1FE002808BFFFDFA068C17941F0020160 +:10EED000C171D6F80F114161B6F813110183CFE764 +:10EEE0002DE9F047934C0746FF21A0680025012635 +:10EEF00080F8DE1090F8C800012818BF022802D060 +:10EF0000032818BFFFDF5FB18948FEF7A3F918B9DE +:10EF10008748FEF7F9F918B100F07BFC05463FE0A1 +:10EF2000A06890F8E0007F27082839D2DFE800F0D9 +:10EF3000383838041725352B7E48F6F7F5F90028C0 +:10EF400008BF2770F6F7DBF9A06890F8DD0018B16C +:10EF5000F6F7CAF9F5F7DFFBF6F798F82BE07548F6 +:10EF6000F6F7E2F9002808BF2770F6F7C8F9A0689D +:10EF700090F8DD000028EFD0EAE76E48F6F7D4F904 +:10EF800030B9277004E06B48F6F7CEF90028F8D0C6 +:10EF9000F6F7B5F9F6F77AF80DE000F03DFE0AE075 +:10EFA0000C2D80F02B82DFE805F04CFCFB06FAF913 +:10EFB000F9F90AF84ECBBDE8F047FEF75EBF002234 +:10EFC0000121022001F036FF002800F05B815A4940 +:10EFD000A1F12800FEF75CF8A068574E90F8B91030 +:10EFE0003046FEF73CF8A06800F1BA013046FEF763 +:10EFF0001AF8A06890F8DB10C1B190F8C810032986 +:10F0000006D190F8C110002918BF90F8CC0001D1AA +:10F0100090F8DE00FCF718FF050007D0012130460C +:10F02000FEF71DF829463046FDF7FDFF4248F6F78A +:10F030009DF801210846F6F78FF9A168082081F8AC +:10F04000E000BDE8F087A06890F8E21090F80B218E +:10F0500011F00C0F08BF002290F8E210032001F01D +:10F06000E9FE002800F00E81344D0A2085F8E0000A +:10F07000012002F091F805F59A71A1F12800FEF740 +:10F0800007F8A06805F59A7790F8B9103846FDF7AB +:10F09000E6FFA06800F1BA013846FDF7C4FFA0689A +:10F0A00090F8DB10C1B190F8C810032906D190F890 +:10F0B000C110002918BF90F8CC0001D190F8DE00F3 +:10F0C000FCF7C2FE060007D001213846FDF7C7FF56 +:10F0D00031463846FDF7A7FFA2681749D2F8C400A9 +:10F0E000C08AC875000A0876D2F8C400407D8875C9 +:10F0F0000846F6F73BF8D5F8C4100F4820234A7BA2 +:10F10000017803EA421221F0200111430170084AFC +:10F11000D5F8C4001278417BC2F34012114041730C +:10F12000D5F8C41095F80B0181F85600BDE8F087BA +:10F13000D81100206401002000120020CC10002013 +:10F14000A06890F8E21090F80B2111F00C0F08BFA6 +:10F15000002290F8E210052001F06CFE00287CD01F +:10F16000FE4D0B2085F8E000022002F015F805F5B1 +:10F170009A71A1F12800FDF78BFFA06805F59A7838 +:10F1800090F8B9104046FDF76AFFA06800F1BA0197 +:10F190004046FDF748FFA06804E047E02EE1A5E007 +:10F1A0009DE098E090F8DB10C1B190F8C8100329F9 +:10F1B00006D190F8C110002918BF90F8CC0001D1F9 +:10F1C00090F8DE00FCF740FE070007D00121404622 +:10F1D000FDF745FF39464046FDF725FFA068E04AA8 +:10F1E000D0F8C410C98AD175090A1176D0F8C400C4 +:10F1F0001146407D88750846F5F7B8FFD5F8C4007C +:10F200004673A06890F8E230012296210020F5F7BD +:10F210008CFED348017821F020010170A068D5F858 +:10F22000C41090F80B0181F856007FE7A06890F8B1 +:10F23000E21090F80B2111F00C0F08BF002290F89B +:10F24000E210042001F0F6FD38B1C549A1F1280013 +:10F25000FDF71EFFC24EA06800E013E090F8B91061 +:10F260003046FDF7FCFEA06800F1BA013046FDF71C +:10F27000DAFEA06890F8DB10E9B190F8C810032915 +:10F2800004D00AE0BDE8F04700F0DDB990F8C11005 +:10F29000002918BF90F8CC0001D190F8DE00FCF7EF +:10F2A000D3FD050007D001213046FDF7D8FE2946E1 +:10F2B0003046FDF7B8FEAA48F5F758FFA06890F869 +:10F2C000E230012296210020F5F72FFEA1680920E7 +:10F2D00081F8E0002AE7A06880F8E06026E7A068EF +:10F2E000022180F8046180F8E0101FE7A66816F894 +:10F2F000E31F11F0800F0CBF1E204FF49670B6F87C +:10F300000120C2F30C0212FB00F7C80908BF4FF03E +:10F310001E0906D0002806BFFFDF4FF000094FF49A +:10F320009679B078400908BF012507D0012808BFA9 +:10F33000022503D0022814BF00250825A06890F8F4 +:10F34000E20001F06EFDA7EB0008307808EB09073A +:10F35000C0F38010002808BF4FF4FA7A05D006BF2A +:10F36000FFDF4FF0000A4FF0320A7C4890F8FC9023 +:10F37000B9F10C0F28BFFFDF7A487B4A30F819003B +:10F380000AEB000101FB0720511CB0FBF1F000F17A +:10F3900020094F44F5F7E1FE307800F03F06304693 +:10F3A000F5F767FCA06880F8E16029462520F5F7AD +:10F3B0007EFB0122A8EB09012B461046F5F7B5FDAF +:10F3C0006A48F5F7D3FE00213846F5F7EAFEA06853 +:10F3D00080F8E250F5F79DFFA06890F8DD0040B19D +:10F3E000F5F785F915F00C0F0CBF50205520F5F7F7 +:10F3F00071FFA168042081F8E00097E6FFDF95E641 +:10F400005B4810B5806890F8E0000C286BD2DFE80C +:10F4100000F06A6A6A6A6A6A6A6A0615533453486F +:10F42000F5F7A4FEF5F775FF514C00219620F5F78E +:10F43000B8FEA168052081F8E00010BD4B48F5F743 +:10F4400095FE4B4CA06890F8E230012296211046C0 +:10F45000F5F76BFDA16891F8E20091F80B1110F03F +:10F460000C0F08BF00219620F5F79BFEF5F751FF22 +:10F47000A168062081F8E00010BD3C48F5F776FE53 +:10F480003B4CA06890F8E230012296211046F5F737 +:10F490004CFDA16891F8E20091F80B1110F00C0FEF +:10F4A00008BF00219620F5F77CFEF5F732FFA16832 +:10F4B000072081F8E00010BDF5F700FFF5F7B4FE76 +:10F4C000F5F7E4FDF5F741FE29480121806880F851 +:10F4D0000411022180F8E010FFF787FCBDE810401E +:10F4E000032001F059BEFFDF10BD70B5204CA068AD +:10F4F00090F8E0007F25082828BF70BDDFE800F005 +:10F500004D4D4D172304470A1948F5F70DFF30B943 +:10F51000257004E01648F5F707FF0028F8D0F5F746 +:10F52000EEFEF5F7B3FDBDE87040FEF7A6BC10484F +:10F53000F5F7FAFE002808BF2570F5F7E0FEBDE8F4 +:10F54000704000F080B80A48F5F7EEFE002808BFCA +:10F550002570F5F7D4FEA0680CE00000CC10002068 +:10F5600000120020805202003F420F00D8110020FC +:10F570006401002090F8DD0018B1F5F7B5FEF5F74D +:10F58000CAF8F5F783FDBDE87040FEF776BC00F0E1 +:10F5900043FBBDE87040FEF770BC70BD70B5F84C21 +:10F5A00006460D46012909D0A06890F8E23090F88F +:10F5B000E2203046BDE8704001F0C8BFF5F728FAF8 +:10F5C000A16891F8E220034629463046BDE8704024 +:10F5D00001F0BCBF70B50646E94814460D46806888 +:10F5E00090F8DD0018B1F5F7B6F801280ED03046D6 +:10F5F000FDF73EFD20703046FDF711FD072813D2C0 +:10F6000029463046BDE87040FDF714BDF5F7E6F831 +:10F610002A462146FCF7F6FA002808BFFFDF2078CB +:10F6200040F00200207070BD3046FDF7F8FC07285E +:10F6300018BF70BD00213046FDF7B4FD0168296098 +:10F640008088A88070BD10B5F5F738FEF5F7ECFDA1 +:10F65000F5F71CFDF5F779FDC94CA06890F8DD00C1 +:10F6600038B1F5F741FEF5F756F8A168002081F8AA +:10F67000DD00A068012180F80411022180F8E0106B +:10F68000BDE81040002001F087BD2DE9F0410D4696 +:10F690000178044611F0800F0CBF1E204FF49670C5 +:10F6A000B4F80120C2F30C0212FB00F6C80908BF2F +:10F6B0001E2105D0002806BFFFDF00214FF4967100 +:10F6C000701BA278520908BF012707D0012A08BF82 +:10F6D000022703D0022A14BF00270827B0F5877F2E +:10F6E0002EBFAE420020BDE8F08145182078C0F35F +:10F6F0008010002808BF4FF4FA7603D006BFFFDF62 +:10F70000002632269F4890F8FC400C2C28BFFFDFD3 +:10F710009D489E4A30F81400311801FB0520511C09 +:10F72000B0FBF1F0203005449548806890F8E20085 +:10F73000F6F76CF804463846F6F768F84FF47A7135 +:10F7400084423ABF001B00F2E730201AB0FBF1F010 +:10F7500034BF42192A1A3946BDE8F041012001F0B0 +:10F7600069BB70B50D460446FDF734FC032D4AD045 +:10F77000052D18BF70BD05212046FDF730FC804DDA +:10F78000A868D0F8C40000F10E012046FDF7E5FCA2 +:10F79000A868D0F8C40000F112012046FDF7E1FC92 +:10F7A000A868D0F8C410497DA175D0F8C410C98AE2 +:10F7B000E175090A2176D0F8C41049886176090AF2 +:10F7C000A176D0F8C4108988E176090A2177D0F8AB +:10F7D000C410C9886177090AA177D0F8C40000F184 +:10F7E00008012046FDF7DBFCA868D0F8C400017EC4 +:10F7F0002046FDF7BCFCA86890F8FC102046BDE848 +:10F800007040FDF7BEBC2046BDE870400321FDF707 +:10F81000E6BB2DE9F04FDFF8688183B04FF0000AB6 +:10F82000D8F8080090F8E000594E01274FF003097E +:10F8300055464FF07F0BA6F12804082880F0E78199 +:10F84000DFE800F0FEFEFE0407B3FDFCFEF7A8FFB4 +:10F85000A8E04B48F5F768FD002808BF88F800B01D +:10F86000F5F74DFDD8F8080090F8D900002818BF2A +:10F87000FFDF4848FDF7D3FB88F80300E078002657 +:10F8800010F03F0F1CBF207910F0080F11D0414835 +:10F89000FDF737FD60B1012802D0022808D008E04A +:10F8A000E07810F03F0F1CBF207910F0010F00D05E +:10F8B00001260296D8F8080090F8DD0018B1F5F797 +:10F8C00013FDF4F728FFE1782A460020134611F0D3 +:10F8D0003F0F1ABF217911F0020F2F4647D0D8F8F9 +:10F8E0000800DFF8B0A0002590F8DB0000280CBF6E +:10F8F000012600269AF800000121C4095046FDF7B0 +:10F9000051FC34B1407900F0C000402808BF012408 +:10F9100000D00024D8F8080090F8C810032906D1B8 +:10F9200090F8C110002918BF90F8CC0001D190F8D0 +:10F93000DE00FCF755F95FEA000B0FD01021FCF751 +:10F940008CFF002818BF012644B101215046FDF765 +:10F9500029FC01465846F6F789F80546D8F808000C +:10F960002200334690F8B90018BF40F0020098F822 +:10F970000310072910D0F5F789FBCA4600F048B9F3 +:10F9800064010020CC100020805202003F420F0092 +:10F9900000120020D8110020CDE900072946029866 +:10F9A00000F07BF9824600F033B9FC48FDF737FBE5 +:10F9B00088F80400E078717A88421CD12079B17A05 +:10F9C000884218D16079F17A884214D1A079317BCC +:10F9D000884210D1E079717B88420CD1207AB17BCA +:10F9E000884208D120783178C0F38010B0EBD11F65 +:10F9F00008BF012400D00024F5F748FBE848F5F7DC +:10FA000093FC002808BF88F800B0F5F778FC98F858 +:10FA1000040004283BD1B4B30095D8F80820DF488F +:10FA2000694692F8D9307BB3054692F8660050BB20 +:10FA3000042002F1680482F8720002E029E07DE00F +:10FA4000E5E06932A11C2846FFF7C4FD04F10B0173 +:10FA50002846FDF76EFBC0B220721F2884BF1F200E +:10FA6000207298F8000009347F2808BFFFDF98F85B +:10FA70000000207088F800B0D8F8080080F86670A0 +:10FA8000062001F089FB02E0FFE7FDF775FFCA469B +:10FA9000BEE04FF0030AC248F5F746FC002808BF55 +:10FAA00088F800B0F5F72BFCBC48FDF7B8FA05461E +:10FAB000BA48FDF726FC082D08BF00287ED1E17862 +:10FAC000032011F03F0F79D02179884376D10021AE +:10FAD000B248FDF767FB062206F1090105F00EF8B2 +:10FAE00000286BD1AD48FDF7C3FA0446AD48FDF7D9 +:10FAF000CCFA844262D10121A848FDF753FB0622CB +:10FB0000F11C04F0FBFF002858D1A448FDF7BDFA12 +:10FB10000446A448FDF7ACFA844279D1F5F7CEFB50 +:10FB2000F5F782FBF5F7B2FAF5F70FFB4FF0020A93 +:10FB3000FFF75BF9042001F02FFB69E04FF0030AA7 +:10FB4000F5F7A4FA9648F5F7EFFB002808BF88F808 +:10FB500000B0F5F7D4FB9148FDF761FA81468F4874 +:10FB6000FDF7CFFBB9F1070F08BF002850D1E178AE +:10FB7000012011F03F0F4BD02179884348D100215B +:10FB80008648FDF70FFB062206F1090104F0B6FFD7 +:10FB9000A0B98248FDF76CFA04468248FDF775FA71 +:10FBA000844235D1D8F8080090F8041139B3B0F880 +:10FBB000082190F80611012A07D900E028E0520830 +:10FBC000A0F8082108BFA0F80871012914BF002976 +:10FBD0000D21C943C1EBC10202EB011190F80521CF +:10FBE000D24302EB8203C3EB82121144B0F8082126 +:10FBF000890CB1FBF2F302FB131180F8051180F8B8 +:10FC00000471694665480095FDF7B6FE00E0FFDF28 +:10FC100003B05046BDE8F08F10B5F5F737FA6048ED +:10FC2000F5F782FB5E4C002804BF7F202070F5F7BB +:10FC300066FBA06890F8041119B1002180F8041146 +:10FC400010BDB0F8082190F80611FF2A0AD24FF62D +:10FC5000FF7303EA4202A0F80821FF2A84BFFF22B3 +:10FC6000A0F80821012914BF00290D21C943C1EBC7 +:10FC7000C10202EB011290F80511C94301EB8103A7 +:10FC8000C3EB81111144B0F80821890CB1FBF2F3E8 +:10FC900002FB131180F80511CFE72DE9F84F8346D9 +:10FCA0009946924688463D480A9FFDF72AFB3B4EFF +:10FCB0003B4D002800F03C81012803D0022800F0D1 +:10FCC0007781BAE0002403213448FDF76BFABBF1D9 +:10FCD000000F6BD0A96891F8E720012A66D142781D +:10FCE00091F8E9301209B2EB131F5FD10088B1F827 +:10FCF000E810C0F30B00C1F30B01884256D127482E +:10FD0000FDF7FFFAA96891F8E62090424ED191F8EC +:10FD1000C800012818BF022802D0032847D0AEE04F +:10FD2000F5F7B4F9F07810F03F0F1CBF307910F000 +:10FD3000020F18D0194C2046FDF7A7F906460121FD +:10FD40002046FDF72FFA3146F4F741FF002818BF8F +:10FD5000012050EA08000BD08DF8007069460F486A +:10FD6000FDF70AFE18E000210C48FDF705FE13E040 +:10FD7000A86890F8CA00032818BF02280CD1BAF16D +:10FD8000000F09D0B8F1000F06D107486946806816 +:10FD900000900248FDF7F0FD032470E0D811002028 +:10FDA00064010020001200206C52020064E0002177 +:10FDB0009848FDF7F7F9A9680622D1F8C4101A315E +:10FDC00004F09CFE50B99348FDF752F9A968D1F8A8 +:10FDD000C410497E884208BF012400D00024F07876 +:10FDE00010F03F0F1CBF307910F0020F03D0B8F1B4 +:10FDF000000F47D056E0A86890F8CB10012901D039 +:10FE0000ACB11FE0F4B900218248FDF7CBF9A96835 +:10FE10000268D1F8C410C1F81A208088C8837D48D0 +:10FE2000FDF726F9A968D1F8C41048760AE090F8E1 +:10FE3000DE1090F8CC00814204D0F5F727F90320BA +:10FE4000BDE8F88FA86890F8E21011F00C0F11D0FF +:10FE500090F8E21011F00C0F0ED00123D0F8C4106E +:10FE60001A460020FCF79DFEA968D1F8C410496A23 +:10FE7000884201D80B2402E0F5F708F90324204654 +:10FE8000BDE8F88FB9F1000F0ED0624E3046FDF795 +:10FE9000FCF8074601213046FDF784F93946F4F7AE +:10FEA00096FE08B1012200E00022A96891F8CB007B +:10FEB000012807D040B92CB991F8DE3091F8CC1068 +:10FEC0008B4201D1012100E000210A42D4D0012857 +:10FED00008BF002C12D100214E48FDF763F9A96834 +:10FEE0000268D1F8C410C1F81A208088C883494834 +:10FEF000FDF7BEF8A968D1F8C4104876A86890F854 +:10FF0000E21011F00C0FB5D090F8E21011F00C0FC8 +:10FF1000B2D00123D0F8C4101A460020FCF741FEED +:10FF2000A968D1F8C410496A8842A5D8A2E700BFE1 +:10FF3000F5F7ACF803213748FDF734F9BBF1000FB2 +:10FF40005DD0A96891F8E7205ABB427891F8E93072 +:10FF50001209B2EB131F52D10088B1F8E810C0F3B8 +:10FF60000B00C1F30B01884249D12A48FDF7C9F9BA +:10FF7000A96891F8E620904241D191F8C800012883 +:10FF800018BF02283BD1F07810F03F0F1CBF30792A +:10FF900010F0020F06D08DF8007069461D48FDF77D +:10FFA000EBFC2CE000211B48FDF7E6FC27E000BF3E +:10FFB000F5F76CF8A86890F8C80003281FD015481A +:10FFC000FDF79FF9A96891F8E620904217D1F278E1 +:10FFD000092012F03F0F12D0327990430FD1BBF1BC +:10FFE000000F0CD091F8C8000228DBD191F8050170 +:10FFF00040B1401E10F0FF0081F8050102D003203F +:020000040002F8 +:10000000BDE8F88F3A4601210248FDF796FF092026 +:10001000BDE8F88FD81100202DE9FF4F07460C46A8 +:10002000488881B040F2E24148430090E08A0026CF +:1000300000FB01FB94F8640091460D2818BF0C28C2 +:100040001FD024281EBF94F8650024284FF0000A12 +:1000500017D0049818B10121204602F018FC94F83A +:10006000540094F8558094F8D010054661B10129E8 +:100070006DD0022952D0032918BFFFDF67D000F0EE +:10008000D5B84FF0010AE4E7B9F1000F08BFFFDF70 +:10009000FD4EB068002808BFFFDF94F85410FB48FD +:1000A00090F82400FCF77DFF009094F85400F5F7D9 +:1000B000C6FB00F2E7314FF47A79B1FBF9F1F2486F +:1000C00080680E1894F85400F5F7B9FB014694F8CF +:1000D0005400022804BFEE484FF47A720DD0012874 +:1000E00004BFEC484FF4C86207D0042807BFEA48B1 +:1000F00040F69802E94840F6E4421044084400F211 +:10010000E731B1FBF9F10098401A00EB0B01DE4832 +:10011000406930440844061D012015E0DA48A9F181 +:1001200001018068084308BFFFDFDD48B9F1000F17 +:10013000006800EB0B0606D0D348806800F222303E +:10014000B04288BFFFDF032084F8D0006DE094F850 +:100150006410009E24291EBF94F86520242A2529B6 +:100160004FD1B4F85810B4F8F020891A491C09B2DC +:10017000002946DB94F8F210002942D00D4694F88D +:10018000F310002918BF8846022804BFC0494FF465 +:100190007A700DD0012804BFBE494FF4C86007D063 +:1001A000042807BFBC4940F69800BC4940F6E4402B +:1001B0000144022D04BFB6484FF47A720DD0012DD0 +:1001C00004BFB4484FF4C86207D0042D07BFB2483B +:1001D00040F69802B14840F6E4421044814208D902 +:1001E000081A00F5FA714FF47A70B1FBF0F006448A +:1001F00007E0401A00F5FA714FF47A70B1FBF0F0A5 +:10020000361AB9F1000F10D0DFF87C92D9F8080047 +:1002100020B9B9F80200002818BFFFDFD9F808009C +:1002200000F22230B04288BFFFDF06B9FFDF31465F +:10023000D4F8D400F2F751FBC4F8D400B860002021 +:1002400038704FF0010987F80490204602F00DFC49 +:10025000AAF10101084208BF87F8059006D094F87A +:10026000D00001280CBF0220032078714046D4F84A +:1002700024B0F5F7CBFA0146022D04BF84484FF4B1 +:100280007A720DD0012D04BF82484FF4C86207D0A6 +:10029000042D07BF804840F69802804840F6E442AB +:1002A0001044084400F23F614FF47A70B1FBF0F063 +:1002B000584400F5C970F860049830EA0A0004BF99 +:1002C00005B0BDE8F08F31463846FCF7E8FB85B253 +:1002D000204602F0CAFBA8420FD8054687F80590D1 +:1002E00006FB05F1D4F8D400F2F7F7FAB86031460E +:1002F0003846FCF7D4FB284485B22946204602F054 +:10030000C6FAB868C4F8D40005B0BDE8F08F2DE98E +:10031000F0430446634885B00D4690F80004DFF8CA +:100320008891400999F800144909884218BFFFDFF5 +:10033000DFF85481002708F14406082D80F00E8173 +:10034000DFE805F0046872726DFEFEB6202C28BF4F +:10035000FFDF36F814000621F0F786FC050008BF21 +:10036000FFDF202C28BFFFDF36F8140029888842E1 +:1003700018BFFFDF95F8D000002808BFFFDF284630 +:1003800001F089FFC8F80870A8F80270294600201B +:10039000C8F81470FCF758FC00F19804686AA04291 +:1003A00025D995F85500F5F731FA014695F854002E +:1003B000022804BF36484FF47A720DD0012804BFDA +:1003C00034484FF4C86207D0042807BF324840F6CB +:1003D0009802324840F6E442104408444FF47A71DF +:1003E00000F23F60B0FBF1F1686A0844071B294640 +:1003F0000020C8F80C70FCF727FC698840F2E24244 +:1004000051439830081AA0F22230C8F8100005B005 +:10041000BDE8F08305B0BDE8F04302F013B905B0C4 +:10042000BDE8F043F4F7BCBF99F8140D1F4940092B +:1004300091F800144909884218BFFFDF202C28BF1B +:10044000FFDF36F814000621F0F70EFC050008BFA8 +:10045000FFDF202C28BFFFDF36F8140029888842F0 +:1004600018BFFFDF0022012329466846FFF7D4FDAD +:1004700095F8DA006946F2F76FFF002808BFFFDF42 +:1004800005B0BDE8F08300002812002044120020CF +:1004900068360200A2240200D0FB010030D3010024 +:1004A0007401002001E000E00BE000E019E000E052 +:1004B000202C28BFFFDF36F814000621F0F7D4FB0C +:1004C000050008BFFFDF202C28BFFFDF36F814002F +:1004D0002988884218BFFFDF95F8D000042818BF8C +:1004E000FFDF85F8D07095F8DA404FF6FF79202CC1 +:1004F00028BFFFDF26F8149095F8DA00F2F7C5FC64 +:10050000002808BFFFDF202085F8DA00D5F8E000DA +:10051000002804BFD5F8DC00C8F8180008D0D5E9D9 +:1005200039121144826911448161D5E93701C860EB +:10053000D5F8DC0000281CBFD5F8E010016100E010 +:100540000CE004D1D5F8E000002818BF8761FE4810 +:10055000007805B0BDE8F043EBF74CBCFFDF05B019 +:10056000BDE8F0832DE9F05FF84E07468B46F08B2F +:100570007568401CF08330784FF00008002808BFF1 +:10058000FFDF07D0DFF8C89304282ED0052818BF56 +:10059000FFDF5BD05846FEF7FEF8040008BFFFDF20 +:1005A00029463069F2F799F9B86087F80080012090 +:1005B000387194F8C900022808BFE64807D001281E +:1005C00008BFE54803D004280CBFE448E4484FF4D2 +:1005D0007A7100F2E140B0FBF1F0B168FA30084402 +:1005E000F860307804287DD183E0002AD2D0D6F894 +:1005F00010A0D9F8184034B3A146E468002CFBD110 +:10060000B9F1000F1FD099F80000002808BFFFDFE4 +:10061000D9F81410D9F8040001445046F3F762F9F0 +:10062000002807DA291A491E91FBF5F101FB0504A0 +:100630002A4604E090FBF5F101FB15042A4694429A +:1006400088BFFFDF00E044462546A3E7002AA1D08B +:10065000B569002D08BFFFDF0024D5F8E420D9F8E4 +:1006600018002346611E58B18369934228BF9942FE +:1006700084BF194604460346C0680028F4D104B973 +:100680001C46C5F8E040D035002C04BFC5F80C80EE +:10069000C9F8185005D0E068E560E860002818BF88 +:1006A0000561D5F81090C5F81880B9F1000F0ED08B +:1006B000D9F8180048B1D5F814A0504538BFFFDF6D +:1006C000D9F81800A0EB0A00A861C9F81880002C1E +:1006D00008BFC6F8208009D02078002808BFFFDFB7 +:1006E000616900E00AE060680844306240F6B835AD +:1006F00050E7F08B0A2838BF032000D3022078711E +:10070000F08B012807D938467168FCF7C8F9014613 +:10071000F08B0844F083B8683061BDE8F09F2DE9A4 +:10072000F04107468F4884B00D4690F80004DFF88A +:100730003882400998F800144909884218BFFFDF41 +:1007400001200026082D814C80F0BB80DFE805F0F9 +:1007500004718C8C87B9B9A5607320736078002808 +:100760001CBF04B0BDE8F0817948866046612673FD +:100770003846FEF710F8050008BFFFDF95F8C900FE +:10078000022804BF79494FF47A720DD0012804BFC2 +:1007900071494FF4C86207D0042807BF6F4940F67B +:1007A0009802734940F6E44211444FF47A7201F220 +:1007B000E731B1FBF2F1A2688C18F5F715F80246A3 +:1007C00095F8C900082808BF082127D004280CBFC5 +:1007D0000221002322D002280CBF1821282119440D +:1007E000042816BF08280F2325235B1D082808BFEF +:1007F000402007D0042808BF102003D002280CBFD7 +:100800000420082013FB0010801A201AFDF741FD78 +:10081000002818BFFFDF04B0BDE8F08101EB410103 +:1008200001F12803082814BF04284FF4A871D6D07A +:10083000D1E7617851B1207B002808BFFDF751FF57 +:10084000667304B0BDE8F041F2F74ABAA073FDF751 +:10085000E2FD002818BFFFDF04B0BDE8F08104B05E +:10086000BDE8F041F4F79CBD98F8140D41494009EA +:1008700091F800144909884218BFFFDF0022394669 +:100880006846FFF76FFE69463846F2F765FD0028B7 +:1008900008BFFFDF04B0BDE8F0812078052818BF4D +:1008A000FFDF207F002808BFFFDF26772670207D2E +:1008B000F2F7EBFA002808BFFFDF267504B0BDE8A9 +:1008C000F081FFDF04B0BDE8F0812DE9F0411F4C5D +:1008D0000026207804281FBF207805280C20BDE8BA +:1008E000F08101206070607B0025A8B1EFF31080DB +:1008F00010F0010F72B60CBF00270127607B0028A3 +:100900001CBFA07B002805D0FDF7EBFE6573A57327 +:10091000F2F7E6F92FB903E0207DF2F72FFE00E0B1 +:1009200062B6207DF3F777F8207F28B1257720780D +:10093000052818BFFFDF0C2665702570207DF2F7B3 +:10094000A4FA002818E000007001002044120020E2 +:100950002812002004360200A2240200D0FB01006D +:10096000C0D4010001E000E00BE000E068360200C6 +:1009700030D3010019E000E008BFFFDF25753046E5 +:10098000BDE8F0812DE9F04FFB4883B000780028E6 +:1009900018BFFFF79AFF0120DFF8E08388F8000016 +:1009A00069460620F0F7E9F8002818BFFFDF0027A6 +:1009B0004FF6FF7934E0029800281CBF90F8D01061 +:1009C00000292DD0008848451CBFDFF8B4A34FF0A4 +:1009D000200B3BD00621F0F747F9040008BFFFDFEA +:1009E00094F8DA00F3F717F884F8D07094F8DA5036 +:1009F0004FF6FF76202D28BFFFDF2AF8156094F808 +:100A0000DA00F2F742FA002808BFFFDF84F8DAB014 +:100A100069460620F0F7B1F8002818BFFFDF10E0A4 +:100A20006846F0F788F80028C5D00FE00298002843 +:100A30001CBF90F8D010002903D000884845C9D1C8 +:100A400004E06846F0F777F80028EFD088F80070E7 +:100A5000C8F8187003B00020BDE8F08F10B5C94C7D +:100A600060B101280CBF40F6C410FFDF06D0A068BB +:100A700041F66A01884228BFFFDF10BDA060F6E79B +:100A800010B5DFF800C3BC4C00238CF800002370C5 +:100A90006370237723736373A3732020A36120758E +:100AA000A4F11C004370423010214FF6FF724280C7 +:100AB00020F8042F491EFAD1CCF80830DCF80800E1 +:100AC00041F66A01884228BFFFDFFFF75BFF40F66F +:100AD000C41101206160F4F799FE00F2E7314FF490 +:100AE0007A70B1FBF0F042F210710844A0606168C6 +:100AF000A1F21731884298BF0146A16010BDF0B540 +:100B00009D4C054685B0207800281EBF0C2005B0FE +:100B1000F0BD95F8546095F855006F6AF4F776FECD +:100B2000022E04BF98494FF47A720DD0012E04BFF3 +:100B300096494FF4C86207D0042E07BF944940F687 +:100B40009802944940F6E442114408444FF47A7103 +:100B500000F23F60B0FBF1F0384400F22230C5F8FB +:100B6000E400A56195F8D000002818BFFFDF002041 +:100B7000824948610521217060702077E0838648B2 +:100B8000F2F729F92075202808BFFFDFF2F79CF95A +:100B90002061217D01226846FFF7E4FC207D694643 +:100BA000F2F7DAFB002808BFFFDF002005B0F0BD38 +:100BB0007148007800281CBF0020704710B506203F +:100BC000EFF7ECFF80F0010010BD70B56A4C0546F0 +:100BD0002078002818BFFFDF2878012832D00428A9 +:100BE0001CBF112070BDE8882E89082540F27121B4 +:100BF000484360602846F4F709FE4FF47A7100F22A +:100C0000E730B0FBF1F040F2712206FB0200A06079 +:100C1000022D08BF614A07D0012D08BF5B4A03D0EF +:100C2000042D0CBF5A4A5E4A02F2E142B2FBF1F1D6 +:100C30006268511AA1F28A21884298BF01460020B9 +:100C4000A16070BD6888AE880125CFE710B584B07B +:100C500008431EBF112004B010BD474C2078002867 +:100C60001EBF0C2004B010BD002060700421217054 +:100C7000E0834948F2F7AFF82075202808BFFFDF6E +:100C80003E48806938B10146C0680028FBD111B1E7 +:100C9000F2F71AF905E0F2F717F940F6B831F1F773 +:100CA0001CFE2061217D01226846FFF75BFC207D50 +:100CB0006946F2F751FB002808BFFFDF002004B0AF +:100CC00010BD70B52C4CA1690160FFF7FEFD00233B +:100CD00000BBA169D1F8E0205AB1D1E939C5AC44D3 +:100CE0009569AC44C2F818C0D1E9372CCCF80C2077 +:100CF00005E0DFF888C0D1F8DC20CCF81820D1F866 +:100D0000DC20D1F8E010002A18BF116102D10029BF +:100D100018BF8B61A36170BD18494870704770B5EA +:100D200040F2E24300FB03F510460C46F4F76EFD7B +:100D3000022C04BF14494FF47A720DD0012C04BF69 +:100D400012494FF4C86207D0042C07BF104940F67F +:100D50009802104940F6E442114408444FF47A7175 +:100D600000F23F60B0FBF1F000F2223085428CBF10 +:100D7000281A002070BD0000441200202812002014 +:100D80006C1200207001002068360200A2240200CC +:100D9000D0FB010030D301001F070200043602001F +:100DA000C0D4010070B50D46064601460020FBF791 +:100DB0004BFF044696F85500F4F728FD014696F8D7 +:100DC0005400022804BFFB4A4FF47A700DD001286A +:100DD00004BFF94A4FF4C86007D0042807BFF74A98 +:100DE00040F69800F64A40F6E440104408444FF4B8 +:100DF0007A7100F23F60B0FBF1F0718840F271222D +:100E00005143C0EB4100A0F22230A54234BF21463D +:100E10002946814203D2A5422CBF28462046706253 +:100E200070BD10B5F4F7E0FCE6498A684968511ACC +:100E3000084410BD2DE9F04FE24B04252827D3F8D4 +:100E400008B04FF010080BF198044FF008094FF06C +:100E5000000C4FF4C8734FF4BF764FF0400A0628D9 +:100E60007CD2DFE800F00351214E246C14200429C9 +:100E700011D0082908D02A20022910D010FB0940DF +:100E800000252821294458E0554610FB054000BFA5 +:100E90004FF4A871F6E710FB08402E25F8E710FB89 +:100EA000054065461821EDE704F5317473E0D0B2D2 +:100EB00011F00C0F08BF0020082904BF00F5BA612B +:100EC00040200ED0042917D002290CBF0CF15C0180 +:100ED0000CF1B001014407BF0CF1180304203B469C +:100EE000082000EBC00000EB400003EB400008448A +:100EF000204400F19C044EE000F28E213346102085 +:100F0000EFE704F5B07446E0082908BF40200CD094 +:100F1000042904BF3346102007D0022907BF0CF173 +:100F2000180304200CF128030820C0EBC00000EBDC +:100F3000400003EB40000BEB020144182BE0D0B261 +:100F400011F00C0F08BF0020082904BF00F535611F +:100F5000402010D0042918D0022900E01AE00CBF6C +:100F60000CF1B4010CF5B071014407BF0CF118038A +:100F700004203B46082000EB400202EB001018441E +:100F80000844204400F19C0405E000F2EE313346B1 +:100F90001020F0E7FFDF8C488068A0428CBF012062 +:100FA0000020BDE8F08F10B5864C607828B1D4E9F8 +:100FB0000301A268FBF79BFDE060D4E902018842CF +:100FC0009CBF2078002814BF0020012010BD0422FF +:100FD0002DE9F04F774E784FDFF8E081DFF8E091B0 +:100FE00085B04FF47A7A052980F0D280DFE801F0ED +:100FF0000A2B0331920080F8D02005B0BDE8F04FF5 +:10100000F1F76EBE04466F480078002818BF84F8D8 +:10101000D02004D005B0BDE8F04FF1F761BE012249 +:10102000002321466846FEF7F7FF94F8DA00694688 +:10103000F2F792F9002808BFFFDFB4F85800401C0F +:10104000A4F85800E6E7032180F8D01005B0BDE809 +:10105000F08F8346408840F2E24148435B49086094 +:10106000DBF8F80059460089ABF81600DBF8F80009 +:1010700080798BF81500DBF8F8004089ABF80200A6 +:10108000DBF8F8008089ABF80400DBF8F800C089D1 +:10109000ABF806000020DBF82850FBF7D5FD04462E +:1010A0009BF85500F4F7B2FB9BF85410022908BFD7 +:1010B0004FF47A710DD0012904BF3E464FF4C86148 +:1010C00007D0042907BF464640F698014E4640F631 +:1010D000E4413144084400F23F60B0FBFAF1BBF850 +:1010E000020040F271225043C1EB4000A0F22230D6 +:1010F000A54234BF21462946814203D2A5422CBFD6 +:1011000028462046CBF8240002208BF8D00005B0FA +:10111000BDE8F08F83460146856A0020FBF794FD09 +:1011200004469BF85500F4F771FB9BF85410022914 +:1011300008BF4FF47A710DD0012904BF3E464FF429 +:10114000C86107D0042907BF464640F698014E46BD +:1011500040F6E4413144084400F23F60B0FBFAF04D +:10116000BBF8021040F271225143C0EB4100A0F2E3 +:101170002230A54234BF21462946814203D2A542EE +:101180002CBF28462046CBF8240005B0BDE8F08FE0 +:10119000FFDF05B0BDE8F08F2DE9F043DFF83080C8 +:1011A0000126002498F80010074D85B0072880F02C +:1011B000C6810FE068360200A2240200D0FB0100C5 +:1011C00030D30100281200204412002074010020B6 +:1011D00070010020DFE800F0041A1AFCFCFBFB00A1 +:1011E000EC830846EAF706FE6878002840F066813E +:1011F000297D00226846FFF7B5F9287D6946F2F798 +:10120000ABF8002808BFFFDF00F058B902280CBF78 +:1012100001260026287DFDF7BEFA040008BFFFDF87 +:1012200094F8E2103046FBF7BCFEDFF874930146F9 +:101230002869D9F80820002E024408BF4FF4FC703A +:101240007DD094F8E20094F80B3110F00C0F08BF39 +:10125000002394F8E20008281EBF94F8E200042856 +:101260004FF0000C00F0C68094F8E20008281ABF86 +:1012700094F8E20004284FF4A87005D094F8E20036 +:1012800002280CBF18202820844494F8E200082883 +:1012900008BF40200BD094F8E200042808BF1020BB +:1012A00005D094F8E20002280CBF04200820C0EB0F +:1012B000C00606EB4010604494F8E2C0BCF1080F91 +:1012C0001EBF94F8E2C0BCF1040F00267ED000BF20 +:1012D00094F8E2C0BCF1080F1ABF94F8E2C0BCF168 +:1012E000040F4FF4A87C08D094F8E2C0BCF1020FC0 +:1012F0000CBF4FF0180C4FF0280C664494F8E2C075 +:10130000BCF1080F08BF4FF0400C10D094F8E2C0B9 +:10131000BCF1040F08BF4FF0100C08D094F8E2C0E5 +:10132000BCF1020F0CBF4FF0040C4FF0080C0CEB9B +:101330004C0707EB0C1CB4446044184400E001E087 +:1013400000F59A7010440844061D94F8E200F4F782 +:101350005DFA024694F8E200022808BF91480BD0DB +:1013600094F8E200012808BF8F4805D094F8E20005 +:1013700004280CBF8D488E4894F8E210022908BF5B +:101380004FF47A710ED094F8E210012908BF4FF49F +:10139000C86107D094F8E21004290CBF40F6980108 +:1013A00040F6E441084410444FF47A7100F2E7300B +:1013B000B0FBF1F0A96940F2E243301A4A88D0311B +:1013C00002FB03F7D9F818208A4202E01CE0B0E0E3 +:1013D0005DE008BF00262BD0296AF2F783FA0028C7 +:1013E0001EDA391A4A1E92FBF7F202FB070639464B +:1013F0001BE000BF94F8E200082818BF022000EBB1 +:10140000400000F1280C2FE794F8E2C0BCF1080F6F +:1014100018BF4FF0020C0CEB4C0C0CF1280657E7F0 +:1014200090FBF7F202FB170639468E4288BFFFDFBA +:10143000D8F80800864208D2A86940F27122418893 +:10144000C1824A4306EB420605E040F2E240B6FBA9 +:10145000F0F0A969C88294F8E210A86980F85410E5 +:1014600094F8E21080F8551005214175C08A6FF498 +:101470001C71484306EB400040F63541C9F81400A2 +:10148000B0EB410F28BFFFDF05B0BDE8F0830428B3 +:101490000CBF01270027EC830846EAF7ABFC2E7748 +:1014A00085F82470A8692969C0F8D41080F8D04064 +:1014B0002978052918BFFFDF07D000BFF1F710FC1E +:1014C0006C73AC7305B0BDE8F083002808BFFFDF84 +:1014D000A86990F8D000002818BFFFDFA86990F82D +:1014E000DA00202818BFFFDF3248F1F774FCA96941 +:1014F0000646202881F8DA000F8828BFFFDF2E4833 +:1015000020F81670A86990F8DA00202808BFFFDFDD +:10151000002301226846A969FEF77EFDA869694695 +:1015200090F8DA00F1F718FF002808BFFFDFAC6180 +:10153000C4E705B00846BDE8F043EAF75BBCFFDF4F +:1015400005B0BDE8F08316494860704770B5144D8A +:101550000446002904BFA86070BD4FF47A760129C3 +:1015600010D002291CBFFFDF70BD6888401C688056 +:101570001046F4F764F900F2E730B0FBF6F0201AF9 +:10158000A86070BD1846F4F76FF900F2E730B0FBC1 +:10159000F6F0201AA86070BD084800787047000077 +:1015A0002812002068360200A2240200D0FB0100AD +:1015B00030D301000F0302006C12002044120020FF +:1015C000FB490C28896881F8CB001ABF132818281A +:1015D0007047002211280FD0072808BF7047152830 +:1015E0000AD001281ABF002802287047A1F88420D9 +:1015F000012081F888007047A1F88A20704770B5F3 +:10160000EB4CA1680A88A1F83E2181F83C0191F8D1 +:101610005400012808BF012508D0022808BF022570 +:1016200004D0042816BF08280325FFDFA06880F82F +:10163000405190F85500012808BF012508D0022824 +:1016400008BF022504D0042816BF08280325FFDFA1 +:10165000A068012180F8415180F83A11002180F8FA +:101660000E11E078BDE87040EAF7C4BBD04A01290A +:1016700092681BD0002302290FD0032922D030B357 +:1016800001282FD0032818BF704792F86400132850 +:101690001CBF1628182805D1704792F8CB000028E7 +:1016A00008BF7047D2F8F8000370704792F8CB007B +:1016B000012808BF704700BFD2F8FC000178491E1E +:1016C0000170704792F8CB000328EBD17047D2F835 +:1016D000F800B2F858108288891A09B20029A8BF08 +:1016E00003707047B2F85800B2F80211401A00B205 +:1016F0000028E1DA70472DE9F041AD4C00260327C0 +:10170000D4F808C0012590B12069C0788CF8CA00CF +:1017100005FA00F010F4000F08BFFFDFA06880F8A2 +:101720006470A0F8846080F88850BDE8F0810023E0 +:101730009CF8652019460CF15800FBF746F9002883 +:1017400004BF6570BDE8F0816078002818BFBDE86F +:10175000F0812069C178A06880F8C91080F86570B0 +:10176000A0F88A6080F88C50BDE8F08170B5904C8C +:1017700084B0207910F0010F04BF04B070BD20695F +:1017800000230521C578A06890F864205830FBF745 +:101790001CF9002818BF062D09D020DC022D1CBF23 +:1017A000042D052D03D0607840F00800607060784B +:1017B00000281CBF04B070BD2069C078801E1628A8 +:1017C00080F00783DFE800F011FE89A7D52CFEFD2D +:1017D000FE7FFCD2FEFEFEC5FBFAF9F8F7F60B2DF4 +:1017E0001CBF0D2D112DDED1E1E7A06800230121E2 +:1017F00090F867205830FBF7E8F8002840F05C8349 +:101800002069FBF7F3FEA16881F8F600072081F854 +:101810006700002081F88C0081F8880000F04CBB44 +:10182000A0680921002390F864205830FBF7CDF818 +:1018300018B120690079122812D0A0680A2100236B +:1018400090F864205830FBF7C0F818B1206900798F +:10185000142820D020690079162840F02D8324E038 +:10186000A0680125002390F8642009215830FBF777 +:10187000ACF8002808BF657000F01E83607800286F +:1018800040F01A83A16881F87C0081F8880081F813 +:10189000640000F011BBA168002081F86400A1F889 +:1018A000840081F8880000F035BAA06890F86410D0 +:1018B0001F2940F00183002180F8641080F888100F +:1018C0001A2000F0F7BAA06890F864100F2927D109 +:1018D000002180F86910122137E0A06890F86410A8 +:1018E00013291DD1D0F8F81000884988814218BF0B +:1018F000FFDFA068D0F8F80000F126012069FBF7AF +:10190000A2FEA06800F1C4012069FBF7A4FE162026 +:10191000A16800F05BB9A26892F86400162802D0B2 +:10192000022000F03BBAD2F8F80002F1B00300F157 +:101930001E0100220E30FAF7C4FFA0680021C0E9A2 +:101940002811012180F86910182180F8641000F036 +:10195000B3BA2069FBF7FFFE032840F0AD8220698F +:10196000FBF7FDFE01F00FFC00F0A6BA206900793C +:10197000F8E7A06890F864101A29D1D1002580F802 +:101980008D5080F88850D0F8F8100088498881423E +:1019900018BFFFDFA068D0F8F8100D70D0F8441120 +:1019A0000A78002A18BFFFDF7ED190F88E200AE067 +:1019B0007C0100203BE2B7E182E126E1F2E009E1AF +:1019C0002CE09FE0AAE17AB180F88E500288CA80AC +:1019D000D0F844110D71D0F844210E211170D0F8C7 +:1019E00044210188518010E00288CA80D0F8441157 +:1019F0000D71D0F8442101211172D0F844210D213C +:101A00001170D0F84421018851800088EFF75EFA08 +:101A1000EEF7F6FEE078EAF7EDF9BEE0A068002305 +:101A2000194690F865205830FAF7CFFF50B9A068F2 +:101A30000023082190F864205830FAF7C6FF0028E8 +:101A400000F0FA816078002840F03682A06890F8B3 +:101A5000900010F0020F14D12069FBF7FFFDA16880 +:101A600081F891002069B0F80520A1F89220B0F823 +:101A70000700A1F8940091F8900040F0020081F86E +:101A80009000A06890F8901011F0010F14D190F818 +:101A90006520002319465830FAF797FF002808BF41 +:101AA000FFDF0121A06800E077E080F8651080F892 +:101AB0008C100021A0F88A10A06890F86410012909 +:101AC00007D1002180F8641080F88810E078EAF7E8 +:101AD00091F9A168D1F8F800098842888A4204BFC8 +:101AE0000178042940F0E88100250570E078EAF7E4 +:101AF00081F9A06890F86410002908BF80F8885028 +:101B000000F0DAB9A0680023072190F8642058306B +:101B1000FAF75BFF002800F08F816078002840F022 +:101B2000CB8102A92069FBF7D3FD9DF808000025B1 +:101B300000F02501A06880F896109DF8091001F0CA +:101B4000410180F8971080F88850D0F8F81000888C +:101B50004988814218BFFFDFA068D0F8F8100D70E7 +:101B6000D0F844110A78002A18BFFFDF15D1028887 +:101B7000CA80D0F844110D71D0F84411029A8A60DD +:101B8000039ACA60D0F84421082111700188D0F866 +:101B900044014180E078EAF72DF9A06880F86450AC +:101BA00000F08AB9A0680023092190F86420583019 +:101BB000FAF70BFF002800F03F816078002840F022 +:101BC0007B81A16881F87C0081F8880081F864003D +:101BD00000F072B9A0680023194690F865205830CB +:101BE000FAF7F3FE002800F027816078002840F023 +:101BF0006381A0680021A0F88A10012180F88C1070 +:101C0000022180F8651000F057B9A068002319463A +:101C100090F865205830FAF7D8FE00287FD0206968 +:101C2000FBF740FD002879D0A5682069FBF736FD59 +:101C30002887A5682069FBF72DFD6887A5682069BE +:101C4000FBF72EFDA887A5682069FBF725FDE8872F +:101C5000A06890F864101C2913BF90F84E10012161 +:101C600080F84E10012907D090F80511002904BF13 +:101C700090F80411002903D01E2180F8651017E0A8 +:101C80001D2180F865100288A0F82A21028FA0F893 +:101C90002C21428FA0F82E21828F00F58A71A0F8A6 +:101CA0003021C08FC88301200875E078EAF7A2F8D8 +:101CB000A0680021A0F88A10012180F88C10FBE0B8 +:101CC000A06800230A2190F864205830FAF77DFEBE +:101CD00018B32069FBF7E6FCA8B1A5682069FBF7FB +:101CE000DDFC2887A5682069FBF7D4FC6887A56818 +:101CF0002069FBF7D5FCA887A5682069FBF7CCFC19 +:101D0000E88700F019FFA168002081F8880081F8B9 +:101D1000640000BF00F0E1FECEE000E059E0607832 +:101D200040F001006070C7E0A0680023194690F8F9 +:101D300065205830FAF749FE78B3A06890F864003F +:101D4000232812BF2428607840F0200026D068465F +:101D5000F3F71FFE002808BF002104D0009802A955 +:101D6000C0788DF80800A06801AB162290F86400D6 +:101D7000FBF7FBF8A0B1A0689DF80420162180F8BD +:101D8000EC2080F8ED10192180F86510012180F811 +:101D90008C100021A0F88A108EE04DE060708BE07E +:101DA0002069FBF79AFCA0B12269107900F00701C5 +:101DB000A06880F85010527902F0070280F8512094 +:101DC00090F80F31002B04BF90F80E31002B04D097 +:101DD00022E00020FFF78FFC6EE090F855C000F184 +:101DE00054038C4501BF19789142012180F87D1080 +:101DF00012D00288A0F8362190F8502000F58A71A0 +:101E000080F8382190F8510081F82500012081F8F0 +:101E10002000E078E9F7EEFFA068212180F8651046 +:101E2000012180F88C100021A0F88A1044E0A068FD +:101E300090F864001F2801D00120AFE72069FBF76C +:101E400056FC88B32069A2680179407901F0070146 +:101E500061F30705294600F0070060F30F21012018 +:101E600082F888000025A2F88450232082F86400BC +:101E7000566DD2F81001FAF7F7FFF2B2C1B28A42FA +:101E800007BFA16881F8F250A26882F8F210C6F389 +:101E90000721C0F30720814219BFA16881F8F30030 +:101EA000A06880F8F35007E0FFE70120FFF723FC6C +:101EB0005FF01E00FFF7A3FBA068D0E92A12491CBF +:101EC00042F10002C0E92A1204B070BD2DE9F047CA +:101ED000FE4D04464FF00007687808436870287983 +:101EE00010F0200F2846806818BFA0F87E7004D13B +:101EF000B0F87E10491CA0F87E1090F86A100126F8 +:101F000039B990F86420002306215830FAF75DFDB6 +:101F100058B3A88810F4006F07D0A86890F86A102A +:101F2000002918BFA0F876701FD1A868B0F8761005 +:101F3000491C89B2A0F87610B0F878208A422CBFEC +:101F4000511A00218288521D8A4228BF80F87C6085 +:101F5000B0F87610B0F87820914206D3A0F87670E9 +:101F600080F81A61E878E9F745FF287910F0600FEA +:101F700008D0A86890F8681021B980F8686001213D +:101F8000FFF725F84FF00808002C56D16878002894 +:101F900051D1287910F0040F0DD0A86890F8640092 +:101FA000032808BFFFDFA86890F86710072904BF5F +:101FB0002E7080F8677001F036F9287910F0080F5C +:101FC00019D06878B8B9A868002190F8CB00FFF75D +:101FD0004DFBA86890F8CB00FE2808BFFFDFFE216C +:101FE000A86880F8CB1090F86710082903D1022167 +:101FF000297080F86770FFF7B9FBA87810F0080F18 +:1020000016D0A8680023052190F864205830FAF70C +:10201000DCFC50B185F80180A868D0F8441108783C +:102020000D2808BF0020087002E00020F9F7E8F84A +:10203000A86801F031F800F0C9FDA868A14600F1D8 +:10204000580490F8F40030B9E27B002301212046C7 +:10205000FAF7BBFC10B1608D401C60853D21B9F1E1 +:10206000000F18D12878022808BF16200ED00128AA +:1020700004BFA86890F8F60008D06878E8B110F0BE +:10208000140F1CBF1E20207702D005E0207703E04C +:1020900010F0080F02D02177E67641E010F0030F30 +:1020A00003D02A202077E6763AE010F0200F08BF10 +:1020B000FFDF23202077E67632E094F8300028B165 +:1020C000A08D411CA185E18D884213D294F8340083 +:1020D00028B1608E411C6186E18D88420AD2618DF3 +:1020E000208D814203D3AA6892F8F42012B9E28DC0 +:1020F000914203D322202077E67611E0217C31B192 +:10210000E18C814228BF84F81C80C5D206E0E08CB7 +:10211000062803D33E202077E67601E0E07EA0B1DA +:102120002773677327740221A868FEF750FFA86819 +:1021300090F8CB10012904D1D0F8FC000178491E99 +:102140000170E878E9F756FE03E00021A868FEF781 +:102150003EFFBDE8F047F3F72BBC5C4A517893781B +:10216000194314D111460128896809D0107910F05B +:10217000040F03D091F86700072808D001207047AA +:10218000B1F84800098E884201D8FEF70CBF002044 +:10219000704770B54D4C06460D46A0883043A08070 +:1021A00016F0020F04D016F0010F18BFFFDFE56034 +:1021B00016F0010F18BF256116F0020F4FF0000254 +:1021C0004FF0010117D0E878062802D00B280BD079 +:1021D00011E0A06890F86420182A0CD10022C0E910 +:1021E0002A2280F86A1006E0A06890F8641012298C +:1021F00008BF80F86A2016F0800F1CBF0820A0706E +:1022000016F4806F08BF70BDA268B2F858009188BC +:102210000844801DE97880B2012908BFA2F80201B4 +:102220001ED0002904BFD2F8F810888018D01829D1 +:1022300016D192F8F210002904BF92F8F330002B67 +:102240000BD011F00C0F1EBF92F8543013F00C0F8E +:10225000994203D092F8F31001B90020A2F8F000DF +:10226000E9782846012909D071B1182918BF70BD35 +:10227000B2F8F010BDE87040FBF74BBAB2F80211AB +:102280004172090AA97270BDD2F8F81089884173A9 +:10229000090AA97370BDF0B50C4C85B00026A0608A +:1022A000A6806670A670054626700088F3F748FB86 +:1022B000A0680088F3F76AFBB5F8D800A168401C55 +:1022C00082B201F15800FAF743F901E07C010020E5 +:1022D000002818BFFFDF95F8650024280AD1B5F85B +:1022E0005810B5F8F000081A00B20028A4BF6078B2 +:1022F000002806D095F86400242818BF25283BD173 +:1023000019E0A06890F8F210002908BF90F8541066 +:1023100080F8541090F8F310002908BF90F8551079 +:1023200080F855100020FFF76AF985F86560A1680C +:1023300081F87D6020E0B5F85810B5F8F000081A73 +:1023400000B20028A4BF6078002815D1A06890F8DA +:10235000F210002908BF90F8541080F8541090F83B +:10236000F310002908BF90F8551080F85510002090 +:10237000FFF745F985F86460A5F8D860A06890F883 +:10238000881039B1B0F88410B0F88620914224BF8B +:1023900005B0F0BD90F88C1039B1B0F88A10B0F8E3 +:1023A0008620914224BF05B0F0BDB0F88220B0F87D +:1023B00080108A4224BF05B0F0BD90F8682092B327 +:1023C000B0F87E208A4224BF05B0F0BD90F8CB70F3 +:1023D000FE2F00F01E816846F3F7B5FA002808BF0B +:1023E000FFDF2221009802F034FC03210098FBF764 +:1023F00079F80098017821F0100101703946FBF757 +:102400009FF8192F80F0E380DFE807F028201446BA +:10241000E1E1E21A71E1E2E264E1E1E1E1D4E2E268 +:102420007B94ADE1B600B0F87E10062924BF05B05C +:10243000F0BDCBE7A068009990F8F5000871C7E0FF +:10244000A168009891F8CC100171C1E0A068D0F8A3 +:10245000FC00411C0098FBF7BEF8B9E0A1680098A9 +:10246000D1F8F82092790271D1F8F82012894271DE +:10247000120A8271D1F8F8205289C271120A0272CE +:10248000D1F8F82092894272120A8272D1F8F810BB +:10249000C989FBF778F89BE0A068D0F8F800011D27 +:1024A0000098FBF7A5F8A068D0F8F80000F10C013F +:1024B0000098FBF7A7F8A068D0F8F80000F11E011B +:1024C0000098FBF7A5F8A06800F1C0010098FBF7A1 +:1024D000ADF87DE0626900981178017191884171D1 +:1024E000090A81715188C171090A017270E0FE49BF +:1024F000D1E90001CDE9020102A90098FBF7B0F88B +:1025000066E0A068B0F844100098FBF7B3F8A06844 +:10251000B0F846100098FBF7B1F8A068B0F840108A +:102520000098FBF7AFF8A068B0F842100098FBF7EE +:10253000ADF84DE0A068B0F840100098FBF7A2F8A5 +:10254000A068B0F842100098FBF7A0F8A068B0F8B7 +:1025500044100098FBF78EF8A068B0F84610009879 +:10256000FBF78CF834E0A068009990F810210A710C +:1025700090F8110148712BE0A06890F8F300FAF789 +:102580006AFC01460098FBF7C0F8A16891F8F200D8 +:1025900010F00C0F1CBF91F8541011F00C0F02D06A +:1025A000884218BF0020FAF756FC01460098FBF756 +:1025B000A8F80DE0A06890F8ED100098FBF7C9F8B6 +:1025C000A06890F8EC100098FBF7C7F800E0FFDF78 +:1025D000F3F7CCF9002808BFFFDF0098C178012984 +:1025E00003D049B118290FD013E0A168B1F8021146 +:1025F0004172090A81720CE0A168D1F8F81089884B +:102600004173090A817304E0A168B1F8F010FBF787 +:1026100080F8B6480090B64BB64A29463046F8F7DF +:1026200033FDA0680023052190F864205830FAF7A4 +:10263000CCF9002804BF05B0F0BD05B0BDE8F040FE +:10264000F8F713BBAC48806890F8881029B1B0F84F +:102650008410B0F8862091421AD290F88C1029B1DB +:10266000B0F88A10B0F88620914211D2B0F88220DA +:10267000B0F880108A420BD290F86820B0F87E0043 +:1026800022B1884204D200BFF8F796BD0628FBD3DA +:10269000002001461AE470B50C46064615464FF474 +:1026A000A471204602F0F7FA2680002D08BFFFDF54 +:1026B0002868C4F8F8006868C4F8FC00A868C4F882 +:1026C000440170BDEEF7D9BB2DE9F0410D46074638 +:1026D0000621EEF7C9FA040008BFBDE8F081D4F87E +:1026E00044110026087858B14A8821888A4207D1C7 +:1026F000092810D00E281DD00D2832D008284CD023 +:1027000094F81A01002857D06E701020287084F8B1 +:102710001A61AF803EE06E7009202870D4F8440141 +:10272000416869608168A9608089A881D4F8440102 +:1027300006702FE00846EEF7C9FB0746EEF775F87E +:10274000B0B96E700E202870D4F8440140686860FB +:10275000D4F8440106703846EEF761F80120BDE870 +:10276000F0810846EEF7B2FB0746EEF75EF810B1CF +:102770000020BDE8F0816E700D202870D4F844016F +:102780004168696000892881D4F8440106703846A0 +:10279000EEF745F80120BDE8F0816E700820287042 +:1027A000D4F8440141688268C0686960AA60E86042 +:1027B000D4F844010670EDE794F81C01B0B16E70D6 +:1027C0001520287094F81C010028E3D084F81C61BF +:1027D000D4F81E016860D4F82201A860B4F826017C +:1027E000A88194F81C010028F0D1D3E794F82801BF +:1027F00070B16E701D20287084F82861D4F82A0109 +:102800006860D4F82E01A860B4F83201A881C1E74D +:1028100094F8340140B16E701E20287084F8346141 +:10282000D4F836016860B5E794F8140180B16E7091 +:102830001B20287094F814010028ABD084F8146190 +:10284000D4F81601686094F814010028F6D1A1E7C5 +:1028500094F83A01002808BFBDE8F0816E70162098 +:10286000287094F83A01002894D000BF84F83A61A7 +:10287000D4F83C016860B4F84001288194F83A012A +:102880000028F3D186E71C4A5061D17070472DE9CA +:10289000F0470446481E85B238BFBDE8F08704F112 +:1028A00008080126DFF850904FF0090A5FF0000792 +:1028B000B4F8D800401CA4F8D800B4F87E00401C3E +:1028C000A4F87E0094F86A0040B994F864200023CC +:1028D000062104F15800FAF778F838B3B4F8760016 +:1028E000401C80B20AE0000098520200CD1E020097 +:1028F0005B210200932102007C010020A4F87600F5 +:10290000B4F8781081422CBF0A1A0022A3885B1DFC +:10291000934228BF84F87C60884207D3A4F876707D +:1029200084F81A6199F80300E9F764FA94F88800CA +:1029300020B1B4F88400401CA4F8840094F88C0002 +:1029400020B1B4F88A00401CA4F88A0094F8F4007E +:1029500040B994F867200023012104F15800FAF7E8 +:1029600034F820B1B4F88200401CA4F8820094F836 +:1029700064000C2802D00D2820D067E0B4F858007D +:10298000411CB4F80201814260D1D4F8FC00411C22 +:10299000404602F095FA02212046F9F7FCFCD4F8F3 +:1029A000FC000078002808BFFFDF0121FE20FEF7B1 +:1029B0005DFE84F8647084F8986047E0B4F85800CD +:1029C000411CD4F8F800808881423FD1D4F84401FA +:1029D0000178002918BFFFDF22D12188C180D4F8F7 +:1029E000F8004189D4F844010181D4F8F8008189C4 +:1029F000D4F844014181D4F8F800C189D4F84401E5 +:102A00008181D4F844010771D4F8440180F800A012 +:102A1000D4F844012188418099F80300E9F7EAF9E4 +:102A200001212046F9F7B7FC03212046FEF7CFFA33 +:102A3000D9F80800D0F8F8000078022818BFFFDFA6 +:102A40000221FE20FEF712FE84F86470B4F85800EC +:102A5000401C691EA4F858008DB2BFF429AFBDE830 +:102A6000F087F94AC2E90601704770B50446B0F82C +:102A70007E0094F86810002908BFC0F1020503D059 +:102A8000B4F88010081A051F94F87C0040B194F83F +:102A900064200023092104F15800F9F796FFA0B142 +:102AA000B4F8766094F86A0058B994F8642000236A +:102AB000062104F15800F9F788FF002808BF2846CE +:102AC00003D0B4F87800801B001F8542C8BF0546BC +:102AD000002DD4BF0020A8B270BD042110B5DA4C7F +:102AE000A068FEF774FAA06890F84E10012902BFA2 +:102AF000022180F84E1010BD00F58A710288A0F8FE +:102B00001E21028EA0F82021828EA0F82221028FA1 +:102B1000B0F844309A4228BF1A460A82828FB0F831 +:102B20004600824238BF1046488201200872E07891 +:102B3000BDE81040E9F75EB9C34830B4806890F84A +:102B40004E30B0F832C0C48EB0F84010428F022B25 +:102B500025D08A4238BF11460186C28FB0F8421094 +:102B60008A4238BF11468186028FB0F844108A42EB +:102B700038BF11464186828FB0F846108A4238BF6E +:102B80001146C186418E614588BF8C46A0F832C08F +:102B9000C18EA14288BF0C46C48630BC7047038EEC +:102BA0009A4228BF1A46C58F838E9D4238BF2B4656 +:102BB0008A4238BF11460186B0F842108B4228BFC6 +:102BC0000B468386002180F84E10CDE770B59E4CF1 +:102BD000A06890F8CB10FE2906BF6178002970BD6F +:102BE00090F86720002301215830F9F7EEFE002805 +:102BF00018BF70BDA06890F8F41021B1BDE8704016 +:102C00000220FEF7DDBC90F86420002319465830FE +:102C1000F9F7DBFE40B1A06890F87C0020B1BDE878 +:102C200070401220FEF7CCBCA068002590F864200C +:102C3000122A1FD004DC032A3FD0112A1FD003E040 +:102C4000182A35D0232A43D0002304215830F9F71D +:102C5000BCFE002818BF70BDD4F808C09CF8650001 +:102C600019286ED03BDC01286ED002287AD00328C8 +:102C70005DD038E0BDE870400B20FEF7A1BCF1F755 +:102C800057F90C2838BF70BDA0680821D0F8F800AB +:102C90001E30F1F751F928B1A0680421C030F1F7D6 +:102CA0004BF900B9FFDFBDE870400320FEF788BC98 +:102CB000BDE870400620FEF783BC90F8CA1080F88B +:102CC000CC100720FEF77CFCA06880F8645070BD33 +:102CD0001820FEF775FCA068A0F8845070BD1E286F +:102CE00048D021286CD0DCF8F800012601780029B2 +:102CF00074D04088BCF8001088426FD100239CF843 +:102D0000642019460CF15800F9F75FFE002865D0E1 +:102D1000A068D0F8F810097802297DD003297CD06A +:102D200004297BD0052908BF082078D0C8E09CF88A +:102D3000C9008CF8CC000720FEF742FCA06800F028 +:102D40007AB97CE000E00DE00C20FEF739FCA068C9 +:102D5000A0F88A5090F8901041F0010180F890108E +:102D600000F069B91320FEF72BFCA068A0F88A5088 +:102D700000F061B99CF80501002818BF70BD9CF8EF +:102D8000040188B1BCF80601ACF84000BCF80801A9 +:102D9000ACF84200BCF80A01ACF84400BCF80C01E5 +:102DA000ACF846008CF80451FFF7C6FEFFF795FE1D +:102DB0001520FEF705FCA068A0F88A5000F03BB98A +:102DC0009CF87D0058B18CF8F2508CF8F350182024 +:102DD000FEF7F6FBA068A0F88A5070BD70E09CF882 +:102DE0000F01002818BF70BD9CF80E01002808BF15 +:102DF00070BDDCE91416DCF81001FAF735F8F2B210 +:102E0000C1B28A4207BFA16881F8F250A26882F875 +:102E1000F210C6F3072103E018E01DE03DE024E0D6 +:102E2000C0F30720814219BFA16881F8F300A068B0 +:102E300080F8F3501820BDE87040FEF7C1BB1120A8 +:102E4000FEF7BEFBA068F6E07C01002090F865006C +:102E5000F9F7A4FDA0BB08E090F8691041B190F823 +:102E60006A00002808BFFFDF0A20FEF7A9FB27E061 +:102E7000F1F75EF80C2823D3A0680821D0F8F800F9 +:102E80001E30F1F759F828B1A0680421C030F1F7DD +:102E900053F800B9FFDF0320E7E790F8900010F047 +:102EA000030F0DD10C20FEF78BFBA168A1F8845015 +:102EB00081F8886091F8900040F0010081F890005E +:102EC000A06890F8CB10FE2918BF70BD90F8642060 +:102ED000002319465830F9F778FD002808BF70BD67 +:102EE000A06890F80011E9B3A1690978D1BB90F806 +:102EF0006500F9F753FDA8BBA068B0F858100A297F +:102F000031D900F108010522E06901F0F7FD002840 +:102F1000A06804BF80F8005170BDD0F8FC000178B3 +:102F200061B1411C0522E06901F0E8FD002818BFED +:102F300070BDA068D0F8FC00007830B9A068E169E5 +:102F4000D0F8FC00401C01F0BBFFA068D0F8FC00EA +:102F50000178491C01700120FEF732FBA06880F85F +:102F6000005170BDFFE7A06890F8041111B190F80E +:102F70000511E1B390F80E11002908BF70BD90F85B +:102F80000F11002918BF70BD90F86500F9F706FD14 +:102F9000002818BF70BDA06890F85400012808BF31 +:102FA000012508D0022808BF022504D0042816BF36 +:102FB00008280325FFDFA06890F85500012808BF06 +:102FC000012608D0022808BF022604D0042816BF14 +:102FD00008280326FFDFA268012D92F810012DD0EA +:102FE000022D2ED0032D08BF04282CD03BE0FFE794 +:102FF000B0F80611A0F84010B0F80811A0F842107F +:10300000B0F80A11A0F84410B0F80C11A0F846105E +:1030100080F8045190F865001D2804D0BDE8704088 +:103020001420FEF7CDBAFFF787FDFFF756FD1520F8 +:10303000FEF7C6FAA06880F8655070BD012812D16D +:1030400001E002280FD192F81101012E06D0022EC4 +:1030500007D0032E08BF04280AD004E0012802D1BB +:1030600006E0022804D0BDE870401620FEF7A8BA9A +:10307000B2F8583092F85410B2F81201F032F9F761 +:1030800059FF20B1A168252081F8640070BDBDE81A +:1030900070400020FEF7B3BA70B5044690F86400A3 +:1030A00000250C2814D00D2818BF70BDB4F85800A6 +:1030B000D4F8F810401C8988884218BF70BDD4F835 +:1030C0004401FF4E0178002918BFFFDF45D122E0FF +:1030D000B4F85800B4F80211401C884218BF70BD03 +:1030E000D4F8FC00411C04F1080001F0E9FE0221C3 +:1030F0002046F9F750F9D4F8FC000078002808BF02 +:10310000FFDF0121FE20FEF7B1FA84F864500120B0 +:1031100084F8980070BD2188C180D4F8F800D4F8F4 +:10312000441140890881D4F8F800D4F8441180890A +:103130004881D4F8F800D4F84411C0898881D4F8C3 +:1031400044010571D4F8441109200870D4F84411E1 +:1031500020884880F078E8F74DFE01212046F9F7F5 +:103160001AF903212046FDF732FFB068D0F8F800C5 +:103170000078022818BFFFDF0221FE20FEF776FA52 +:1031800084F8645070BD70B5CD4CA16891F864208E +:10319000162A11BF132A91F88E20002A62781BBFCD +:1031A00002206070002A70BD81F8C800002581F8F7 +:1031B0008D5081F88850D1F8F800098840888842FD +:1031C00018BFFFDFA068D0F8F8000078032818BF08 +:1031D000FFDF0321FE20FEF749FAA068D0F8441172 +:1031E0000A78002A18BFFFDF19D10288CA80D0F8F8 +:1031F000442190F8C8101171D0F844110D72D0F824 +:1032000044210D211170D0F844210188518000889B +:10321000EDF75CFEEDF7F4FAE078E8F7EBFDA06877 +:1032200080F8645070BD10B5A54C207910F0020FE5 +:1032300008BF10BD6078002818BF10BDE068C078D6 +:10324000192880F06781DFE800F05F4F0D8EF7F7F7 +:10325000A5223FF76F82B0F7F7F7F7F6E2DFF8F451 +:10326000F3F7F200A0680023012190F8672058309E +:10327000F9F7ABFB002818BF10BD0821A06880F843 +:103280006710002180F8881080F88C1010BDA068AD +:103290000023194690F865205830F9F796FB18B1CD +:1032A000A168002081F88C00A0680023194690F8DE +:1032B00064205830F9F789FB002808BF10BD0020B2 +:1032C000A16881F8880010BDA0680023194690F815 +:1032D00064205830F9F779FB002808BFFFDF04208D +:1032E000A16881F8640010BDA0680023194690F819 +:1032F00064205830F9F769FB002808BFFFDF0C2075 +:10330000A16881F8640010BDA0680023194690F8F8 +:1033100064205830F9F759FB002808BFFFDF0D2063 +:10332000A16881F8640010BDA0680023194690F8D8 +:1033300064205830F9F749FB002808BFFFDF01215E +:10334000A06880F88D100F2180F8641010BDA0686F +:1033500090F86400122818BFFFDF0121A06880F8F0 +:103360008E101121F0E7A0680023194690F8642020 +:103370005830F9F72AFB28B9A06890F88E00002889 +:1033800008BFFFDF0121A06880F88D10132180F8AD +:10339000641010BDA06890F86400182818BFFFDF03 +:1033A0001A20A16881F8640010BDA068D0F8F81058 +:1033B00003884A889A4204BF0978042919D190F8F1 +:1033C0006420002319465830F9F7FFFA002808BF97 +:1033D000FFDFA06890F8901011F0020F04BF0121E8 +:1033E00080F8641005D0002180F88810D0F8F8002B +:1033F0000170A0680023194690F865205830F9F74D +:10340000E4FA002808BF10BD0020A1687FE0A06892 +:103410000023194690F864205830F9F7D6FA0028AE +:1034200008BFFFDF0520A16881F8640010BD30E00F +:103430001FE012E001E066E06CE0A068002319469E +:1034400090F864205830F9F7C0FA002808BFFFDF71 +:103450001C20A16881F86400E8E7A06800231946F1 +:1034600090F865205830F9F7B0FA002808BFFFDF60 +:10347000CAE7A0680023194690F864205830F9F78D +:10348000A4FA002808BFFFDF1F20A16881F86400AC +:10349000CCE7A06890F8651021291CD090F8641042 +:1034A000232918BFFFDFC1D190F8F210002907BF10 +:1034B00090F8F3100029242180F8641002E0000045 +:1034C0007C0100207FF4FBAE002180F864100846E8 +:1034D000FEF795F8F3E690F8F210002907BF90F890 +:1034E000F3100029242180F865108DD1002180F887 +:1034F000651080F87D1090F80E0100281CBF002098 +:10350000FEF77DF880E7A168002081F8650081F86A +:103510008C008BE7FFDF89E770B58D4C0829207A96 +:1035200063D2DFE801F0041A5A5A2662625A80B167 +:10353000F1F7FDFA012211461046F1F7C4FCF2F74B +:10354000A2F90020A072F1F794FBBDE87040F1F7FA +:1035500004BEBDE87040EFF7C3BBD4E90001EFF74C +:10356000BCF92060A07A401CC0B2A07228281CD3ED +:1035700070BDA07A0025401EC6B2E0683044F1F765 +:10358000D3FE10B9E1687F208855A07A272828BF8C +:1035900001252846F2F710F9A07A282809D2401C04 +:1035A000C0B2A072282828BF70BDBDE87040F1F7F6 +:1035B00060BB207A00281CBF012000F085F8F1F7DD +:1035C00065FDF1F7C2FD0120E07262480078E8F77E +:1035D00011FCBDE87040EFF783BB002808BF70BD49 +:1035E0000020BDE8704000F06FB8FFDF70BD10B57F +:1035F000574C207A002804BF0C2010BD00202072F8 +:10360000E072607AEFF7BAFF607AF0F704FA607A56 +:10361000EFF73BFC00280CBF1F20002010BD00224C +:1036200070B54B4C06460D46207A68B12272E272A4 +:10363000607AEFF7A3FF607AF0F7EDF9607AEFF7C1 +:1036400024FC002808BFFFDF4248E560067070BD1B +:1036500070B5050007D0A5F5E8503F494C388142C8 +:103660009CBF122070BD3A4CE068002804BF0920BE +:1036700070BD207A00281CBF0C2070BD3748EFF7C2 +:10368000AAFB6072202804BF1F2070BDEFF71CFC4E +:103690002060002D1CBF284420600120656020723E +:1036A000002000F011F8002070BD2949CA7A002AD4 +:1036B00004BF002070471F22027000224270CB68B6 +:1036C0004360CA72012070472DE9F04184B007467B +:1036D000EFF7FAFB1E4D8046414668682C6800EB08 +:1036E000800046002046F0F7FDF8B04206DB68682F +:1036F000811B4046EFF7F1F80446286040F233762C +:1037000021464046F0F7EEF8B04204DA3146404632 +:10371000EFF7E3F8044600208DF8000040F2E76080 +:10372000039004208DF80500002F14BF0120032012 +:103730008DF8040068460294EFF793FD687A6946B5 +:10374000EFF70AFE002808BFFFDF04B0BDE8F081F4 +:10375000AC1200209C010020B5EB3C0019350200A2 +:103760002DE9F0410C4612490D68114A1149083201 +:103770001160A0F12001312901D301200CE0412882 +:1037800010D040CC0C4F94E80E0007EB8000241FB3 +:1037900050F8807C3046B84720600548001D056021 +:1037A000BDE8F0812046DDF71BFDF5E706207047F8 +:1037B0001005024001000001A052020010B552485D +:1037C00000F012FA00B1FFDF4F48401C00F00CFA85 +:1037D000002800D0FFDF10BD2DE9F14F4B4ED6F889 +:1037E00000B00127484800F007FADFF81C8128B92B +:1037F0005FF0000708F1010000F014FA444C0025C6 +:103800004FF0030901206060C4F80051C4F804516E +:10381000009931602060DFF8FCA018E0DAF80000C1 +:10382000C00614D50E2000F064F8EFF3108010F0FD +:10383000010072B600D00120C4F80493D4F800113E +:1038400019B9D4F8041101B920BF00B962B6D4F88F +:10385000000118B9D4F804010028DFD0D4F804011D +:103860000028CFD137B1C6F800B008F1010000F050 +:10387000C3F911E008F1010000F0BEF90028B9D148 +:10388000C4F80893C4F80451C4F800510E2000F0A5 +:1038900030F81D4800F0C6F90020BDE8F88F2DE98A +:1038A000F0438DB00D46064600240DF110090DF1D0 +:1038B000200817E004EB4407102255F8271068464B +:1038C00001F048F905EB870710224846796801F0B6 +:1038D00041F96846FFF780FF10224146B86801F0C1 +:1038E00039F9641CB442E5DB0DB00020BDE8F0837B +:1038F00072E700F01F02012191404009800000F1B1 +:10390000E020C0F8801270479D01002004E50040CF +:1039100000E0004010ED00E0A94900200870704769 +:1039200070B5A84D01232B60A74B1C68002CFCD060 +:10393000002407E00E6806601E68002EFCD0001D03 +:10394000091D641C9442F5D30020286018680028E3 +:10395000FCD070BD70B59A4E04469C4D307802285C +:1039600000D0FFDFAC4200D3FFDF71699848012926 +:1039700003D847F23052944201DD03224271491CC0 +:103980007161291BC16092497078EFF7E5FC00284E +:1039900000D1FFDF70BD70B5894C0D46617888425B +:1039A00000D0FFDF894E082D4BD2DFE805F04A0436 +:1039B0001E2D4A4A4A382078022800D0FFDF032013 +:1039C0002070A078012801D020B108E0A06800F0A4 +:1039D0001BFE04E004F1080007C8FFF7A1FF052063 +:1039E0002070BDE87040EFF77BB9EFF76DFA014644 +:1039F0006068EFF777FFB04202D2616902290BD30A +:103A00000320F0F722FA12E0EFF75EFA0146606851 +:103A1000EFF768FFB042F3D2BDE870409AE7207834 +:103A200002280AD0052806D0FFDF04202070BDE858 +:103A3000704000F0BBB8022000E00320F0F705FA68 +:103A4000F3E7FFDF70BD70B50546EFF73DFA5C4C5C +:103A500060602078012800D0FFDF5D4901200870F8 +:103A60000020087104208D6048715848C860022009 +:103A700020706078EFF770FC002800D1FFDF70BD88 +:103A800010B54F4C207838B90220F0F7F4F918B986 +:103A90000320F0F7F0F908B1112010BD4D48EFF701 +:103AA0009AF96070202804D0012020700020606105 +:103AB00010BD032010BD2DE9F041144600EB840732 +:103AC0000E4605463F1F00F0B2FD4FF080521169CF +:103AD000484306EB8401091FB14201D2012100E0F5 +:103AE00000211CB11269B4EB920F02D90920BDE884 +:103AF000F081394A95420ED3AF420CD3854205D2AC +:103B0000874203D245EA0600800701D01020EEE785 +:103B1000964200D309B10F20E9E7304830490068E8 +:103B2000884205D0224631462846FFF7F9FE10E0CC +:103B3000FFF7A6FF0028DAD1214800218560C0E9FF +:103B4000036481704FF4A97104FB01F01830FFF792 +:103B50007AFF0020CBE770B54FF080550446286906 +:103B60001D49B1FBF0F0844201D20F2070BD00F07E +:103B70005EFDA04201D8102070BD184818490068A9 +:103B8000884204D02869604300F03EFD0CE0FFF756 +:103B900077FF0028F0D1296909486143816001213C +:103BA00081701048FFF74FFF002070BD10B5044C26 +:103BB0006078EFF76AF900B9FFDF0020207010BDD0 +:103BC000A001002004E5014000E40140105C0C006D +:103BD000BC1200209739020000600200B0000020F3 +:103BE000BEBAFECA7C5E0100002101700846704723 +:103BF0000146002008707047EFF3108101F00101C9 +:103C000072B60278012A01D0012200E000220123CD +:103C1000037001B962B60AB1002070474FF400503A +:103C20007047E9E7EFF3108111F0010F72B64FF022 +:103C30000002027000D162B600207047F2E7000077 +:103C40007B490968016000207047794908600020BD +:103C5000704701218A0720B1012804D042F20400F4 +:103C60007047916700E0D1670020704771490120DB +:103C7000086042F20600704708B504236D4A190730 +:103C8000103230B1C1F80433106840F00100106008 +:103C90000BE0106820F001001060C1F8083300202C +:103CA000C1F80801644800680090002008BD011FA9 +:103CB0000B2909D85F4910310A6822F01E0242EA36 +:103CC000400008600020704742F2050070470F284E +:103CD00009D8584910310A6822F4706242EA00207B +:103CE00008600020704742F205007047000100F1B3 +:103CF0008040C0F8041900207047000100F18040A6 +:103D0000C0F8081900207047000100F18040D0F889 +:103D10000009086000207047012801D9072070477A +:103D2000464A52F8200002680A43026000207047A9 +:103D3000012801D907207047404A52F82000026844 +:103D40008A43026000207047012801D9072070478C +:103D50003A4A52F8200000680860002070470200CC +:103D600037494FF0000003D0012A01D007207047E7 +:103D70000A607047020033494FF0000003D0012A67 +:103D800001D0072070470A60704708B54FF40072F1 +:103D9000510510B1C1F8042308E0C1F80823002040 +:103DA000C1F8240124481C3000680090002008BDA0 +:103DB00008B58022D10510B1C1F8042308E0C1F88C +:103DC00008230020C1F81C011B4814300068009033 +:103DD000002008BD08B54FF48072910510B1C1F8FC +:103DE000042308E0C1F808230020C1F8200112488C +:103DF000183000680090002008BD0D49383109686E +:103E00000160002070474FF080410020C1F8080198 +:103E1000C1F82401C1F81C01C1F820014FF0E020D5 +:103E2000802180F800140121C0F8001170470000C3 +:103E300000040040000500400801004064530200F7 +:103E400078050040800500406249634B0A68634979 +:103E50009A42096801D1C1F3100101600020704746 +:103E60005C495D4B0A685D49091D9A4201D1C0F366 +:103E700010000860002070475649574B0A685749A0 +:103E800008319A4201D1C0F3100008600020704749 +:103E900030B5504B504D1C6842F20803AC4202D082 +:103EA000142802D203E0112801D3184630BDC30004 +:103EB0004B481844C0F81015C0F81425002030BD38 +:103EC0004449454B0A6842F209019A4202D0062849 +:103ED00002D203E0042801D308467047404A01217A +:103EE00042F83010002070473A493B4B0A6842F2D2 +:103EF00009019A4202D0062802D203E0042801D325 +:103F000008467047364A012102EBC000416000209C +:103F1000704770B52F4A304E314C156842F2090394 +:103F200004EB8002B54204D0062804D2C2F800187F +:103F300007E0042801D3184670BDC1F31000C2F891 +:103F40000008002070BD70B5224A234E244C15682D +:103F500042F2090304EB8002B54204D0062804D2E1 +:103F6000D2F8000807E0042801D3184670BDD2F843 +:103F70000008C0F310000860002070BD174910B59C +:103F80000831184808601120154A002102EBC003CF +:103F9000C3F81015C3F81415401C1428F6D30020DC +:103FA00006E0042804D302EB8003C3F8001807E0FE +:103FB00002EB8003D3F80048C4F31004C3F80048B0 +:103FC000401C0628EDD310BD04490648083108609E +:103FD00070470000B0000020BEBAFECA00F50140E4 +:103FE00000F001400000FEFF7E4B1B6803B19847C4 +:103FF000BFF34F8F7C4801687C4A01F4E0611143B4 +:104000000160BFF34F8FFEE710B5EFF3108010F0A3 +:10401000010F72B601D0012400E0002400F0D9F8AD +:1040200050B1DDF777F9EEF71CFDEFF7B1FEDEF7E3 +:10403000ECFE6F490020086004B962B6002010BD94 +:1040400070B50C460546EFF3108010F0010F72B604 +:1040500001D0012600E0002600F0BBF818B106B937 +:1040600062B6082070BDDDF7D1F8DDF757F90246DA +:10407000002043099B0003F1E02300F01F01D3F867 +:104080000031CB40D9071BD0202803D222FA00F1FF +:10409000C90722D141B2002906DA01F00F0101F16E +:1040A000E02191F8141D03E001F1E02191F80014E2 +:1040B0004909082911D281B101290ED004290CD057 +:1040C000401C6428D5D3DEF777FE4949494808608B +:1040D0002046F0F775FA60B904E006B962B641F21D +:1040E000010070BD3F4804602DB12846F0F7B5FAD5 +:1040F00018B110242CE0404D19E02878022802D98C +:104100004FF4805424E007240028687801D0F8B9DF +:1041100008E0E8B120281BD8A878212818D8012861 +:1041200016D001E0A87898B9E8780B2810D8334960 +:10413000802081F8140DDDF7F1F82946EFF70EFE27 +:10414000EEF74EFC00F0A6FA2846DDF7B5F8044677 +:1041500006B962B61CB1FFF757FF204670BD0020BC +:1041600070BD10B5044600F034F800B10120207095 +:10417000002010BD224908600020704770B50C4631 +:1041800020490D681F49204E08310E60102807D0C5 +:1041900011280CD012280FD0132811D0012013E0C1 +:1041A000D4E90001FFF74CFF354620600DE0FFF732 +:1041B0002BFF0025206008E02068FFF7D2FF03E016 +:1041C0000F4920680860002020600E48001D05602F +:1041D00070BD074807490068884201D10120704737 +:1041E00000207047B80100200CED00E00400FA0543 +:1041F000B0000020BEBAFECA6C5302000BE000E023 +:1042000004000020100502400100000100B5D8495B +:1042100002282DD021DC10F10C0F08BFF42027D08C +:104220000FDC10F1280F08BFD82021D010F1140F97 +:1042300008BFEC201CD010F1100F08BFF02017D0E1 +:1042400020E010F1080F08BFF82011D010F1040F82 +:104250000CBFFC2000280BD014E0C01E062811D291 +:10426000DFE800F00E0C0A080503082000E0072034 +:10427000086000BD0620FBE70520F9E70420F7E70A +:104280000320F5E7FFDF00BD00B5BA49012808BFEC +:1042900003200CD0022808BF042008D0042808BF3F +:1042A000062004D0082816BFFFDF052000BD0860E7 +:1042B00000BDB149002804BF086820F0010005D006 +:1042C000012806BF086840F0010070470860704789 +:1042D00070B51E460546012924D0022A04BFA7480E +:1042E0004FF47A710DD0012A04BFA5484FF4C8617C +:1042F00007D0042A07BFA34840F69801A24840F619 +:10430000E44144181846F1F781FA04443046F1F7C5 +:10431000ABFA20444FF47A7100F27120B0FBF1F057 +:10432000281A70BD022A08BF4FF47A700AD0012AF9 +:1043300008BF4FF4C86005D0042A0CBF40F69800AF +:1043400040F6E44049F608514418DBE770B51446DE +:104350000546012908BF49F6CA660DD0022B08BFE1 +:104360008A4807D0012B08BF854803D0042B0CBF17 +:104370008448874800F1FA061046F1F760FA012CEC +:1043800008BF4FF47A710AD0022C08BF4FF4FA71BB +:1043900005D0042C0CBF4FF4FA614FF4FA51711A96 +:1043A00008444FF47A7100F28920B0FBF1F0281A2A +:1043B000801E70BD70B514460646012930D0022B10 +:1043C00004BF6E494FF47A700DD0012B04BF6C49C5 +:1043D0004FF4C86007D0042B07BF6A4940F6980025 +:1043E000694940F6E4400D181046F1F728FA012C0F +:1043F00008BF4FF47A710AD0022C08BF4FF4FA714B +:1044000005D0042C0CBF4FF4FA614FF4FA51691A2D +:1044100008444FF47A716438B0FBF1F0301A70BD83 +:10442000022B08BF4FF47A700AD0012B08BF4FF45B +:10443000C86005D0042B0CBF40F6980040F6E4405D +:1044400049F608514518CFE770B5164604460129CC +:1044500008BF49F6CA650DD0022B08BF4B4807D0EC +:10446000012B08BF464803D0042B0CBF45484848E1 +:1044700000F1FA051046F1F7C9F905443046F1F7A5 +:10448000F3F928444FF47A7100F2E140B0FBF1F007 +:10449000201A801E70BD2DE9F04107461E460C46CD +:1044A00015461046082A16BF04284DF68830F1F745 +:1044B000ADF907EB4701C1EBC71100EBC100012CBF +:1044C00008BF4FF47A710AD0022C08BF4FF4FA717A +:1044D00005D0042C0CBF4FF4FA614FF4FA51471881 +:1044E0002046F1F7ACF9381A4FF47A7100F60F60F4 +:1044F000B0FBF1F42846F1F777F920443044401D31 +:10450000BDE8F08170B5054614460E460846F1F741 +:104510007DF905EB4502C2EBC512C0EBC205304682 +:10452000F1F7A2F92D1A2046082C16BF04284DF6E3 +:104530008830F1F76BF928444FF47A7100F6B73000 +:10454000B0FBF1F52046F1F74FF92844401D70BD4E +:104550001049082818BF0428086803BF20F46C50CD +:1045600040F4444040F0004020F0004008607047B4 +:104570000C1500401015004050160040683602002F +:10458000A2240200D0FB010030D301000436020057 +:10459000C0D40100401700402DE9FE430C46804680 +:1045A000F8F7B4FF074698F80160204601A96A466B +:1045B000ECF717F905000DD0012F02D00320BDE85C +:1045C000FE83204602AA0199ECF72DF80298B0F874 +:1045D00003000AE0022F14D1042E12D3B8F803000E +:1045E000BDF80020011D914204D8001D80B2A91918 +:1045F000814202D14FF00000E1E702D24FF001000A +:10460000DDE74FF00200DAE70B4A022111600B49A7 +:104610000B68002BFCD0084B1B1D18600868002895 +:10462000FCD00020106008680028FCD070474FF0D4 +:10463000805040697047000004E5014000E40140FB +:1046400002000B464FF00000014620D0012A04D0A2 +:10465000022A04D0032A0DD103E0012002E0022047 +:1046600015E00320072B05D2DFE803F00406080A53 +:104670000C0E100007207047012108E0022106E01F +:10468000032104E0042102E0052100E00621EEF709 +:10469000BEBB0000F9480521817000210170417006 +:1046A0007047F7490A78012A05D0CA681044C860E3 +:1046B0004038EFF7E4B88A6810448860F8E70028CB +:1046C00019D00378EF49F04A13B1012B0ED011E055 +:1046D0000379012B00D06BB943790BB1012B09D1C0 +:1046E0008368643B8B4205D2C0680EE00379012BDE +:1046F00002D00BB10020704743790BB1012BF9D1E7 +:10470000C368643B8B42F5D280689042F2D80120A6 +:104710007047DB4910B501220A700279A2B100226C +:104720000A71427992B104224A718268D34C5232A2 +:104730008A60C0681434C8606060EEF7C5FBCF497A +:1047400020600220887010BD0322E9E70322EBE716 +:1047500070B5044609B1012000E00320C84D0021D6 +:104760002970217901B100202871607968B1042095 +:10477000C24E6871A168F068EEF7AFF8A860E06813 +:104780005230E8600320B07070BD0320F0E72DE9DF +:10479000F04105460226EEF79EFF006800B1FFDFFC +:1047A000B64C01273DB12878B0B1012805D00228C8 +:1047B00010D0032813D027710CE06868C82807D3ED +:1047C000EFF7C3F820B16868FFF76BFF012603E03D +:1047D000002601E000F05CF93046BDE8F081207869 +:1047E0000028F7D16868FFF76AFF0028E3D06868FF +:1047F000017879B1A078042800D0FFDF0121686832 +:10480000FFF7A6FF9E49E078EEF7A6FD0028E1D16C +:10481000FFDFDFE7FFF77DFF6770DBE72DE9F0479C +:10482000964C8846E178884200D0FFDFDFF84C9252 +:1048300000250127924E09F11409B8F1080F75D22D +:10484000DFE808F0040C28527A808D95A0780328C0 +:1048500002D0022800D0FFDFBDE8F087A07803284F +:1048600002D0022800D0FFDF0420A070257120783C +:10487000002878D1FFF715FF3078012806D0B068FE +:10488000E06000F025F92061002060E0E078EEF7BC +:1048900060FCF5E7A078032802D0022800D0FFDFF3 +:1048A000207800286DD1A078032816D0EEF70CFBF5 +:1048B00001464F46D9F80000EFF714F800280EDB48 +:1048C000796881420BDB081AF0606D49E078EEF7F9 +:1048D00043FD0028C0D1FFDFBEE7042028E004200C +:1048E000EFF7B3FAA570B7E7A078032802D0022843 +:1048F00000D0FFDF207888BBA078032817D0EEF720 +:10490000E3FA01464F46D9F80000EEF7EBFF002826 +:10491000E5DB79688142E2DB081AF0605849E0780B +:10492000EEF71AFD002897D1FFDF95E740E005205C +:10493000EFF78BFAA7708FE7A078042800D0FFDF8D +:10494000022004E0A078042800D0FFDF0120A16845 +:104950008847FFF71CFF054630E004E011E0A0782F +:10496000042800D0FFDFBDE8F04700F091B8A07840 +:10497000042804D0617809B1022800D0FFDF207834 +:1049800018B1BDE8F04700F08CB8207920B10620BE +:10499000EFF75BFA2571CDE7607838B13849E078F8 +:1049A000EEF7DAFC00B9FFDF657055E70720BFE7D7 +:1049B000FFDF51E73DB1012D03D0FFDF022DF9D11B +:1049C0004AE70420C3E70320C1E770B5050004D01F +:1049D0002A4CA078052806D101E0102070BD0820DF +:1049E000EFF749FA08B1112070BD2848EEF7F3F946 +:1049F000E070202803D00020A560A07070BD0320C7 +:104A000070BD1E4810B5017809B1112010BD817824 +:104A1000052906D0012906D029B101210170002005 +:104A200010BD0F2010BD00F03CF8F8E770B5134C36 +:104A30000546A07808B1012809D155B12846FFF7ED +:104A40003EFE40B1287840B1A078012809D00F205F +:104A500070BD102070BD072070BD2846FFF759FEBD +:104A600003E000212846FFF773FE0549E078EEF7E2 +:104A700073FC00B9FFDF002070BD0000BC01002006 +:104A8000CC1200203D860100FF1FA1071D48020037 +:104A90000A4810B5006900F013F8BDE81040EEF7C1 +:104AA0001FB9064810B5C078EEF7EFF900B9FFDF7F +:104AB0000820EFF7CAF9BDE81040EBE5BC01002083 +:104AC0000C490A6848F202139A4302430A6070478D +:104AD000084A116848F2021301EA03009943116081 +:104AE00070470246044B10201344FC2B01D8116080 +:104AF00000207047C80602400018FEBF40EA0103CC +:104B000010B59B070FD1042A0DD310C808C9121F76 +:104B10009C42F8D020BA19BA884201D9012010BDB0 +:104B20004FF0FF3010BD1AB1D30703D0521C07E07D +:104B3000002010BD10F8013B11F8014B1B1B07D1E1 +:104B400010F8013B11F8014B1B1B01D1921EF1D152 +:104B5000184610BD032A40F2308010F0030C00F01C +:104B6000158011F8013BBCF1020F624498BF11F8A7 +:104B700001CB00F8013B38BF11F8013BA2F1040260 +:104B800098BF00F801CB38BF00F8013B11F00303D8 +:104B900000F02580083AC0F0088051F8043B083A3C +:104BA00051F804CBA0E80810F5E7121D5CBF51F8DE +:104BB000043B40F8043BAFF30080D20724BF11F858 +:104BC000013B11F801CB48BF11F8012B24BF00F8BD +:104BD000013B00F801CB48BF00F8012B704710B52E +:104BE000203AC0F00B80B1E81850203AA0E81850E5 +:104BF000B1E81850A0E81850BFF4F5AF5FEA027CA6 +:104C000024BFB1E81850A0E8185044BF18C918C014 +:104C1000BDE810405FEA827C24BF51F8043B40F8B5 +:104C2000043B08BF7047D20728BF31F8023B48BF9A +:104C300011F8012B28BF20F8023B48BF00F8012BD8 +:104C4000704702F0FF0343EA032242EA024200F007 +:104C500002B84FF000020429C0F0128010F0030CDB +:104C600000F01B80CCF1040CBCF1020F18BF00F85F +:104C7000012BA8BF20F8022BA1EB0C0100F00DB80E +:104C80005FEAC17C24BF00F8012B00F8012B48BF6C +:104C900000F8012B70474FF0000200B51346944610 +:104CA0009646203922BFA0E80C50A0E80C50B1F184 +:104CB0002001BFF4F7AF090728BFA0E80C5048BF98 +:104CC0000CC05DF804EB890028BF40F8042B08BF36 +:104CD000704748BF20F8022B11F0804F18BF00F832 +:104CE000012B7047FEDF04207146084219D1069956 +:104CF000124A914215DC069902394878DF2810D112 +:104D00000878FE2807D0FF280BD14FF001004FF0A4 +:104D100000020B4B184741F201000099019A084B21 +:104D20001847084B002B02D01B68DB6818474FF070 +:104D3000FF3071464FF00002014B1847006002003F +:104D4000E93F020004000020184819497047FFF7A6 +:104D5000FBFFDCF733FA00BD4FF4805015490968BA +:104D6000884203D1144A13605B68184700BD0000F5 +:104D700020BFFDE74FF480500E490968884210D1EA +:104D80000E4B18684FF0FF318842F1D080F308884D +:104D90004FF02021884204DD0948026803210A43BC +:104DA00002600848804708488047FFDFE012002083 +:104DB000E01200200000002004000020006002003B +:104DC0001409004099460100594D02000420714623 +:104DD000084202D0EFF3098101E0EFF3088188690E +:104DE00002380078102813DB20280FDB2C280BDB7F +:104DF0000A4A12680A4B9A4203D1602804DB094A26 +:104E00001047022008607047074A1047074A1047BA +:104E1000074A12682C32126810470000B0000020C8 +:104E2000BEBAFECA21130000613702007D410200B4 +:104E3000040000200D4B0E4908470E4B0C49084753 +:104E40000D4B0B4908470D4B094908470C4B0849C6 +:104E500008470C4B064908470B4B054908470B4BC5 +:104E6000034908470A4B02490847000051BB0000AC +:104E70000D2F00006D2C0000092B0000972A000068 +:104E80000F2D00003D1300005328000029BE000034 +:104E9000C91100000021016001717047002101600B +:104EA00081807047002101604160017270470A688B +:104EB0004B6802604360B1F808C0A0F808C07047B2 +:104EC0000A6802600B79037170470000B995000011 +:104ED00043970000A1980000C5980000FF980000CB +:104EE0003399000065990000959900000B9A000025 +:104EF00091960000A7120000A7120000794400005C +:104F0000C5440000E94400007D45000099460000CA +:104F10005B4700008D47000075480000074900000E +:104F20005B490000414A0000614A0000DF150000B3 +:104F30000316000033150000871500003516000029 +:104F4000C91600006360000013620000E7650000FE +:104F5000FD660000876700000568000069680000C2 +:104F60008D6900005D6A0000C96A0000834A000084 +:104F7000894A0000934A000089410000FB4A000072 +:104F80005D410000874C0000BF4C0000294D00002F +:104F90000F4E0000254E0000A7120000A7120000CF +:104FA000A7120000A7120000A7120000A71200001D +:104FB000A7120000A7120000BF2400004525000032 +:104FC000612500007D2500000B270000A7250000BB +:104FD000B1250000F325000015260000F126000091 +:104FE00033270000A7120000A7120000678300000B +:104FF0008783000089830000CD830000FB830000CD +:10500000E9840000778500008B850000D9850000C9 +:10501000C98600006F880000998900007B7300003A +:10502000B1890000A7120000A7120000D1B400004F +:105030003BB600008FB60000FBB60000ABB7000027 +:105040000100000000000000100110013A02000001 +:105050001A020000FB900000E9900000FFFFFFFF34 +:105060000000FFFFCDAC0000293D000065200000DE +:10507000C5730000618E0000000000000000020007 +:10508000000000000002000000000000000100001D +:105090000000000013810000F38000006181000027 +:1050A00041240000032400002324000037A800004E +:1050B00063A800006BAA000059590000818100001C +:1050C00000000000B18100008F24000000000000FB +:1050D00000000000000000004DA9000000000000DA +:1050E000ED59000000000000900A0000900A000046 +:1050F000DB560000DB5600005544000079AB000091 +:1051000047760000771F0000972602004F970100A6 +:10511000195700001957000077440000DBAB00006E +:10512000CB760000E91F0000C5260200639701004E +:1051300070017001400038005C002400480100024A +:1051400000000300656C74620000000000000000B5 +:1051500000000000000000008700000000000000C8 +:105160000000000000000000BE83605ADB0B3760C7 +:1051700038A5F5AA9183886C010000003114010064 +:10518000F9220100000000010206030405000000EE +:105190000700000000000000060000000A000000F8 +:1051A0003200000073000000B4000000C989010053 +:1051B00047150200616F0100D5B10100EBF4010059 +:1051C000D5B10100F77001008DB30100E1EE0100DF +:1051D0008DB30100BF6D010021B3010001F4010096 +:1051E00021B301005D6F0100E9B101009DE70100FD +:1051F000E9B10100ED74010001B601009DF5010067 +:1052000001B601000300000001555555D6BE898E38 +:105210000000C706C70CC71200006B030F06B308D7 +:105220000000B704A708970CF401FA009600640088 +:105230004B0032001E0014000A00050002000100AD +:105240000041000000000000AAAED7AB15412010BD +:105250000C0802170D0101020909010106020918D3 +:10526000180301010909030305000000FE00000006 +:10527000FE000000FE555555252627D6BE898E0016 +:10528000F401FA00960064004B0032001E00140086 +:105290000A00050002000100254100000000000096 +:1052A000493E0200613E0200793E0200913E02004A +:1052B000C13E0200E93E0200133F0200473F0200E8 +:1052C000573B0200B73A0200AD370200E34A020042 +:1052D000E93B0200F93B0200253C0200433F01008C +:1052E0004B3F01005D3F0100533C02006D3C02005A +:1052F000413C02004B3C0200793C0200AF3C020002 +:10530000CF3C0200ED3C0200FB3C0200093D0200E4 +:10531000193D0200313D0200493D02005F3D02009F +:10532000753D0200000000007FB90000D5B9000003 +:10533000EBB9000041460200D93702009F38020055 +:10534000CB490200034A02002D4A0200ED3D010054 +:105350006D4101008B3D0200B13D0200D53D0200D0 +:10536000FB3D02001C05004020050040001002002B +:105370009053020008000020D001000044110000FA +:10538000C8530200D801002008110000A01100003D +:10539000011813C8140250201A0102227C2720FB96 +:1053A000349B5F801280021A10138B091B20480463 +:1053B0001ACE0401200B50A40AAC01300912CB63B1 +:0853C0007F010B68CC10A00076 +:00000001FF diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/mbed_lib.json b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/mbed_lib.json similarity index 81% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/mbed_lib.json rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/mbed_lib.json index 7189ece9f9..a755cee09d 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/mbed_lib.json +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_FULL/mbed_lib.json @@ -5,7 +5,7 @@ "S140", "BLE_STACK_SUPPORT_REQD", "NRF_SDH_CLOCK_LF_XTAL_ACCURACY=7", - "NRF_SD_BLE_API_VERSION=5", + "NRF_SD_BLE_API_VERSION=6", "NRF_SDH_ENABLED=1", "NRF_SDH_BLE_ENABLED=1", "PEER_MANAGER_ENABLED=1", @@ -25,16 +25,14 @@ "NRF_SDH_BLE_STACK_OBSERVER_PRIO=0", "NRF_SDH_SOC_STACK_OBSERVER_PRIO=0", "FDS_BACKEND=2", - "SWI_DISABLE1", - "SWI_DISABLE2", - "SWI_DISABLE3", - "SWI_DISABLE4", - "SWI_DISABLE5" + "SWI_DISABLE1=1" ], "target_overrides": { "*": { "target.features_add": ["BLE"], - "target.bootloader_img": "hex/s140_nrf52840_5.0.0-2.alpha_softdevice.hex" + "target.bootloader_img": "hex/s140_nrf52_6.0.0_softdevice.hex", + "target.mbed_ram_start": "0x200032F8", + "target.mbed_ram_size": "0x3CD08" } } } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/headers/nrf_mbr.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/headers/nrf_mbr.h new file mode 100644 index 0000000000..e0c80e278c --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/headers/nrf_mbr.h @@ -0,0 +1,242 @@ +/* + * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @defgroup nrf_mbr_api Master Boot Record API + @{ + + @brief APIs for updating SoftDevice and BootLoader + +*/ + +#ifndef NRF_MBR_H__ +#define NRF_MBR_H__ + +#include "nrf_svc.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup NRF_MBR_DEFINES Defines + * @{ */ + +/**@brief MBR SVC Base number. */ +#define MBR_SVC_BASE (0x18) + +/**@brief Page size in words. */ +#define MBR_PAGE_SIZE_IN_WORDS (1024) + +/** @brief The size that must be reserved for the MBR when a SoftDevice is written to flash. +This is the offset where the first byte of the SoftDevice hex file is written.*/ +#define MBR_SIZE (0x1000) + +/** @} */ + +/** @addtogroup NRF_MBR_ENUMS Enumerations + * @{ */ + +/**@brief nRF Master Boot Record API SVC numbers. */ +enum NRF_MBR_SVCS +{ + SD_MBR_COMMAND = MBR_SVC_BASE, /**< ::sd_mbr_command */ +}; + +/**@brief Possible values for ::sd_mbr_command_t.command */ +enum NRF_MBR_COMMANDS +{ + SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see ::sd_mbr_command_copy_bl_t*/ + SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ + SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD. Does not require any parameters in ::sd_mbr_command_t params.*/ + SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ + SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset. @see ::sd_mbr_command_vector_table_base_set_t*/ + SD_MBR_COMMAND_RESERVED, + SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address. @see ::sd_mbr_command_irq_forward_address_set_t*/ +}; + +/** @} */ + +/** @addtogroup NRF_MBR_TYPES Types + * @{ */ + +/**@brief This command copies part of a new SoftDevice + * + * The destination area is erased before copying. + * If dst is in the middle of a flash page, that whole flash page will be erased. + * If (dst+len) is in the middle of a flash page, that whole flash page will be erased. + * + * The user of this function is responsible for setting the BPROT registers. + * + * @retval ::NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly. + * @retval ::NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying. + */ +typedef struct +{ + uint32_t *src; /**< Pointer to the source of data to be copied.*/ + uint32_t *dst; /**< Pointer to the destination where the content is to be copied.*/ + uint32_t len; /**< Number of 32 bit words to copy. Must be a multiple of @ref MBR_PAGE_SIZE_IN_WORDS words.*/ +} sd_mbr_command_copy_sd_t; + + +/**@brief This command works like memcmp, but takes the length in words. + * + * @retval ::NRF_SUCCESS indicates that the contents of both memory blocks are equal. + * @retval ::NRF_ERROR_NULL indicates that the contents of the memory blocks are not equal. + */ +typedef struct +{ + uint32_t *ptr1; /**< Pointer to block of memory. */ + uint32_t *ptr2; /**< Pointer to block of memory. */ + uint32_t len; /**< Number of 32 bit words to compare.*/ +} sd_mbr_command_compare_t; + + +/**@brief This command copies a new BootLoader. + * + * With this command, destination of BootLoader is always the address written in + * NRF_UICR->BOOTADDR. + * + * Destination is erased by this function. + * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. + * + * This function will use the flash protect peripheral (BPROT or ACL) to protect the flash that is + * not intended to be written. + * + * On success, this function will not return. It will start the new BootLoader from reset-vector as normal. + * + * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. + * @retval ::NRF_ERROR_FORBIDDEN if NRF_UICR->BOOTADDR is not set. + * @retval ::NRF_ERROR_INVALID_LENGTH if parameters attempts to read or write outside flash area. + * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) + */ +typedef struct +{ + uint32_t *bl_src; /**< Pointer to the source of the Bootloader to be be copied.*/ + uint32_t bl_len; /**< Number of 32 bit words to copy for BootLoader. */ +} sd_mbr_command_copy_bl_t; + +/**@brief Change the address the MBR starts after a reset + * + * Once this function has been called, this address is where the MBR will start to forward + * interrupts to after a reset. + * + * To restore default forwarding this function should be called with @ref address set to 0. The + * MBR will then start forwarding interrupts to the address in NFR_UICR->BOOTADDR or to the + * SoftDevice if the BOOTADDR is not set. + * + * On success, this function will not return. It will reset the device. + * + * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. + * @retval ::NRF_ERROR_INVALID_ADDR if parameter address is outside of the flash size. + * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) + */ +typedef struct +{ + uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ +} sd_mbr_command_vector_table_base_set_t; + +/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR + * + * Unlike sd_mbr_command_vector_table_base_set_t, this function does not reset, and it does not + * change where the MBR starts after reset. + * + * @retval ::NRF_SUCCESS + */ +typedef struct +{ + uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ +} sd_mbr_command_irq_forward_address_set_t; + +/**@brief Input structure containing data used when calling ::sd_mbr_command + * + * Depending on what command value that is set, the corresponding params value type must also be + * set. See @ref NRF_MBR_COMMANDS for command types and corresponding params value type. If command + * @ref SD_MBR_COMMAND_INIT_SD is set, it is not necessary to set any values under params. + */ +typedef struct +{ + uint32_t command; /**< Type of command to be issued. See @ref NRF_MBR_COMMANDS. */ + union + { + sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ + sd_mbr_command_compare_t compare; /**< Parameters for verify.*/ + sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ + sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ + sd_mbr_command_irq_forward_address_set_t irq_forward_address_set; /**< Parameters for irq forward address set*/ + } params; /**< Command parameters. */ +} sd_mbr_command_t; + +/** @} */ + +/** @addtogroup NRF_MBR_FUNCTIONS Functions + * @{ */ + +/**@brief Issue Master Boot Record commands + * + * Commands used when updating a SoftDevice and bootloader. + * + * The @ref SD_MBR_COMMAND_COPY_BL and @ref SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires + * parameters to be retained by the MBR when resetting the IC. This is done in a separate flash + * page provided by the application. The UICR register UICR.NRFFW[1] must be set to an address + * corresponding to a page in the application flash space. This page will be cleared by the MBR and + * used to store the command before reset. When the UICR.NRFFW[1] field is set the page it refers + * to must not be used by the application. If the UICR.NRFFW[1] is set to 0xFFFFFFFF (the default) + * MBR commands which use flash will be unavailable and return @ref NRF_ERROR_NO_MEM. + * + * @param[in] param Pointer to a struct describing the command. + * + * @note For return values, see ::sd_mbr_command_copy_sd_t, ::sd_mbr_command_copy_bl_t, + * ::sd_mbr_command_compare_t, ::sd_mbr_command_vector_table_base_set_t, + * ::sd_mbr_command_irq_forward_address_set_t + * + * @retval ::NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF). + * @retval ::NRF_ERROR_INVALID_PARAM if an invalid command is given. +*/ +SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param)); + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // NRF_MBR_H__ + +/** + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/headers/nrf_svc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/headers/nrf_svc.h new file mode 100644 index 0000000000..292c692982 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/headers/nrf_svc.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef NRF_SVC__ +#define NRF_SVC__ + +#include "stdint.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef SVCALL_AS_NORMAL_FUNCTION +#define SVCALL(number, return_type, signature) return_type signature +#else + +#ifndef SVCALL +#if defined (__CC_ARM) +#define SVCALL(number, return_type, signature) return_type __svc(number) signature +#elif defined (__GNUC__) +#ifdef __cplusplus +#define GCC_CAST_CPP (uint16_t) +#else +#define GCC_CAST_CPP +#endif +#define SVCALL(number, return_type, signature) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wreturn-type\"") \ + __attribute__((naked)) \ + __attribute__((unused)) \ + static return_type signature \ + { \ + __asm( \ + "svc %0\n" \ + "bx r14" : : "I" (GCC_CAST_CPP number) : "r0" \ + ); \ + } \ + _Pragma("GCC diagnostic pop") + +#elif defined (__ICCARM__) +#define PRAGMA(x) _Pragma(#x) +#define SVCALL(number, return_type, signature) \ +PRAGMA(swi_number = (number)) \ + __swi return_type signature; +#else +#define SVCALL(number, return_type, signature) return_type signature +#endif +#endif // SVCALL + +#endif // SVCALL_AS_NORMAL_FUNCTION + +#ifdef __cplusplus +} +#endif +#endif // NRF_SVC__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/hex/mbr_nrf52_2.3.0_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/hex/mbr_nrf52_2.3.0_licence-agreement.txt new file mode 100644 index 0000000000..a71adee7b9 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/hex/mbr_nrf52_2.3.0_licence-agreement.txt @@ -0,0 +1,35 @@ +Copyright (c) 2007 - 2018, Nordic Semiconductor ASA +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form, except as embedded into a Nordic + Semiconductor ASA integrated circuit in a product or a software update for + such product, must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of Nordic Semiconductor ASA nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +4. This software, with or without modification, must only be used with a + Nordic Semiconductor ASA integrated circuit. + +5. Any software provided in binary form under this license must not be reverse + engineered, decompiled, modified and/or disassembled. + +THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/hex/mbr_nrf52_2.3.0_mbr.hex b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/hex/mbr_nrf52_2.3.0_mbr.hex new file mode 100644 index 0000000000..56225a4a9d --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/hex/mbr_nrf52_2.3.0_mbr.hex @@ -0,0 +1,165 @@ +:020000040000FA +:1000000000040020990900002D0600007909000075 +:1000100037060000410600004B060000000000000B +:10002000000000000000000000000000BD0900000A +:1000300055060000000000005F0600006906000091 +:10004000730600007D060000870600009106000090 +:100050009B060000A5060000AF060000B9060000E0 +:10006000C3060000CD060000D7060000E106000030 +:10007000EB060000F5060000FF060000090700007F +:10008000130700001D0700002707000031070000CC +:100090003B070000450700004F070000590700001C +:1000A000630700006D07000077070000810700006C +:1000B0008B070000950700009F070000A9070000BC +:1000C000B3070000BD070000C7070000D10700000C +:1000D000DB070000E5070000EF070000F90700005C +:1000E000030800000D0800001708000021080000A8 +:1000F0002B080000350800003F08000049080000F8 +:10010000530800001FB500F003F88DE80F001FBD75 +:1001100000F038BC70B50B46010B184400F6FF70B8 +:10012000040B4FF080500022090303692403406947 +:1001300043431D1B104600F0E9F929462046BDE85F +:10014000704000F0E3B9F0B54FF6FF734FF4B475AB +:100150001A466E1E12E0A94201D3344600E00C4656 +:10016000B1EB040130F8027B641E3B441A44F9D120 +:100170009CB204EB134394B204EB12420029EAD17F +:1001800098B200EB134002EB124140EA0140F0BD8F +:10019000C34992B00446D1E90001CDE91001FF2224 +:1001A0004021684600F094FB94E80F008DE80F00B2 +:1001B000684610A902E004C841F8042D8842FAD12B +:1001C00010216846FFF7BFFF1090AA208DF8440069 +:1001D00000F0FAF800F0DDF84FF01024A0691022CA +:1001E0006946803000F0DEF8A069082210A900F00E +:1001F000D9F800F0C2F870B504460068A94D072888 +:1002000069D2DFE800F033041929561E2500D4E92D +:10021000026564682946304600F0FDF82A4621460A +:10022000304600F0BFF8AA002146304600F024FB1B +:10023000002800D0032070BD00F0D6FB4FF48050A2 +:1002400007E0201D00F0C6F80028F4D100F0CCFB38 +:1002500060682860002070BD241D94E807009200AB +:1002600000F00AFB0028F6D00E2070BD00F0BEF8AA +:100270000028FAD1D4E9010100EB81034FF080504E +:10028000026945696A43934209D84FF010225369C5 +:1002900003EB81030169406941438B4201D9092085 +:1002A00070BD5069401C01D10F2070BD2046FFF782 +:1002B0006FFF00F09BF80028F7D1201D00F08AF8AE +:1002C0000028F2D160680028F0D100F07DF800F03D +:1002D00060F800F052F8072070BD10B50C461828E1 +:1002E00002D00120086010BD2068FFF784FF206065 +:1002F00010BD4FF01024A069401C05D0A569A66967 +:1003000080353079AA2808D06069401C2DD06069FA +:100310000068401C29D060692CE010212846FFF7B6 +:1003200012FF316881421CD1A16901F18002C03104 +:1003300005E030B108CA51F8040D984201D10120FE +:1003400000E000208A42F4D158B1286810B1042896 +:1003500003D0FEE7284600F070F85249686808604C +:1003600008E000F016F800F008F84FF4805001683B +:10037000491C01D000F012FBFEE7BFF34F8F4A4843 +:1003800001684A4A01F4E06111430160BFF34F8FF5 +:10039000FEE74FF010208169491C02D0806900F00F +:1003A0008CB870472DE9F04117460D4606460024EB +:1003B00006E03046296800F093F8641C2D1D361DB8 +:1003C000BC42F6D3BDE8F0814FF0102080694FF4B5 +:1003D00080519FE64FF080510A69496900684A439D +:1003E000824201D810207047002070474FF08050A3 +:1003F0000169406941434FF01020826902F5805243 +:10040000914201D2092070478069401C01D0002030 +:1004100070470420704770B50C4605464FF480665F +:1004200008E0284600F049F8B44205D3A4F58064FA +:1004300005F58055002CF4D170BD4168044609B122 +:10044000012600E000264FF010256869A26892009E +:1004500000F012FAF8B1A06881006869FFF75AFE4F +:10046000BEB16E694FF08050A56864680169426949 +:100470005143A1420DD9016940694143A94208D9BC +:1004800029463046FFF7C7FF2A4621463046FFF788 +:1004900089FFFFF772FFFFF797FFFFF77AFFF8E793 +:1004A0000C0A0000000000200CED00E00400FA053A +:1004B000144801680029FCD07047134A02211160DA +:1004C00010490B68002BFCD00F4B1B1D18600868EF +:1004D0000028FCD00020106008680028FCD070477D +:1004E000094B10B501221A60064A1468002CFCD092 +:1004F000016010680028FCD00020186010680028F7 +:10050000FCD010BD00E4014004E5014070B50C468C +:10051000054600F073F810B900F07EF828B12146C6 +:100520002846BDE8704000F007B821462846BDE8DF +:10053000704000F037B800007FB5002200920192B1 +:10054000029203920A0B000B6946012302440AE05F +:10055000440900F01F0651F8245003FA06F635430B +:1005600041F82450401C8242F2D80D490868009A94 +:1005700010430860081D0168019A1143016000F0F2 +:100580003DF800280AD0064910310868029A104345 +:100590000860091D0868039A104308607FBD0000C9 +:1005A0000006004030B50F4C002200BF04EB0213E0 +:1005B000D3F800582DB9D3F8045815B9D3F8085812 +:1005C0001DB1521C082AF1D330BD082AFCD204EB1D +:1005D0000212C2F80008C3F804180220C3F8080881 +:1005E00030BD000000E001404FF08050D0F83001F5 +:1005F000082801D000207047012070474FF080503C +:10060000D0F83011062905D0D0F83001401C01D0B7 +:1006100000207047012070474FF08050D0F8300123 +:100620000A2801D0002070470120704708208F4918 +:1006300009680958084710208C4909680958084773 +:1006400014208A4909680958084718208749096809 +:100650000958084730208549096809580847382053 +:1006600082490968095808473C20804909680958A7 +:10067000084740207D4909680958084744207B49BC +:1006800009680958084748207849096809580847FF +:100690004C20764909680958084750207349096871 +:1006A00009580847542071490968095808475820D3 +:1006B0006E490968095808475C206C49096809585F +:1006C0000847602069490968095808476420674954 +:1006D00009680958084768206449096809580847A3 +:1006E0006C20624909680958084770205F49096809 +:1006F0000958084774205D49096809580847782057 +:100700005A490968095808477C2058490968095816 +:1007100008478020554909680958084784205349EB +:100720000968095808478820504909680958084746 +:100730008C204E4909680958084790204B490968A0 +:1007400009580847942049490968095808479820DA +:1007500046490968095808479C20444909680958CE +:100760000847A0204149096809580847A4203F4983 +:10077000096809580847A8203C49096809580847EA +:10078000AC203A49096809580847B0203749096838 +:1007900009580847B4203549096809580847B8205E +:1007A0003249096809580847BC2030490968095886 +:1007B0000847C0202D49096809580847C4202B491B +:1007C000096809580847C82028490968095808478E +:1007D000CC202649096809580847D02023490968D0 +:1007E00009580847D4202149096809580847D820E2 +:1007F0001E49096809580847DC201C49096809583E +:100800000847E0201949096809580847E4201749B2 +:10081000096809580847E820144909680958084731 +:10082000EC201249096809580847F0200F49096867 +:1008300009580847F4200D49096809580847F82065 +:100840000A49096809580847FC20084909680958F5 +:1008500008475FF480700549096809580847000097 +:1008600003480449024A034B70470000000000207F +:10087000180A0000180A000040EA010310B59B079F +:100880000FD1042A0DD310C808C9121F9C42F8D0FA +:1008900020BA19BA884201D9012010BD4FF0FF30AB +:1008A00010BD1AB1D30703D0521C07E0002010BDC1 +:1008B00010F8013B11F8014B1B1B07D110F8013B4D +:1008C00011F8014B1B1B01D1921EF1D1184610BD2E +:1008D00002F0FF0343EA032242EA024200F005B8B5 +:1008E0007047704770474FF000020429C0F0128033 +:1008F00010F0030C00F01B80CCF1040CBCF1020FD3 +:1009000018BF00F8012BA8BF20F8022BA1EB0C01A7 +:1009100000F00DB85FEAC17C24BF00F8012B00F89D +:10092000012B48BF00F8012B70474FF0000200B5C3 +:10093000134694469646203922BFA0E80C50A0E802 +:100940000C50B1F12001BFF4F7AF090728BFA0E8B0 +:100950000C5048BF0CC05DF804EB890028BF40F87C +:10096000042B08BF704748BF20F8022B11F0804FBE +:1009700018BF00F8012B7047014B1B68DB68184754 +:100980000000002009480A497047FFF7FBFFFFF706 +:10099000B9FB00BD20BFFDE7064B1847064A1060B3 +:1009A000016881F30888406800470000180A0000C9 +:1009B000180A0000F3020000000000201EF0040FDF +:1009C0000CBFEFF30881EFF30981886902380078E2 +:1009D000182803D100E00000074A1047074A1268B0 +:1009E0002C3212681047000000B5054B1B68054A01 +:1009F0009B58984700BD0000DB020000000000206B +:100A0000080A0000040000000010000000000000C0 +:080A100000FFFFFF0090D0037E +:040000050000099955 +:00000001FF diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/libraries/fstorage/nrf_fstorage_nvmc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/libraries/fstorage/nrf_fstorage_nvmc.c similarity index 94% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/libraries/fstorage/nrf_fstorage_nvmc.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/libraries/fstorage/nrf_fstorage_nvmc.c index b7c1ac01f6..14b1859c93 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/libraries/fstorage/nrf_fstorage_nvmc.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/libraries/fstorage/nrf_fstorage_nvmc.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -69,6 +69,7 @@ static nrf_atomic_flag_t m_flash_operation_ongoing; /* Send event to the event handler. */ static void event_send(nrf_fstorage_t const * p_fs, nrf_fstorage_evt_id_t evt_id, + void const * p_src, uint32_t addr, uint32_t len, void * p_param) @@ -84,6 +85,7 @@ static void event_send(nrf_fstorage_t const * p_fs, .result = NRF_SUCCESS, .id = evt_id, .addr = addr, + .p_src = p_src, .len = len, .p_param = p_param, }; @@ -139,7 +141,7 @@ static ret_code_t write(nrf_fstorage_t const * p_fs, /* Clear the flag before sending the event, to allow API calls in the event context. */ (void) nrf_atomic_flag_clear(&m_flash_operation_ongoing); - event_send(p_fs, NRF_FSTORAGE_EVT_WRITE_RESULT, dest, len, p_param); + event_send(p_fs, NRF_FSTORAGE_EVT_WRITE_RESULT, p_src, dest, len, p_param); return NRF_SUCCESS; } @@ -166,7 +168,7 @@ static ret_code_t erase(nrf_fstorage_t const * p_fs, /* Clear the flag before sending the event, to allow API calls in the event context. */ (void) nrf_atomic_flag_clear(&m_flash_operation_ongoing); - event_send(p_fs, NRF_FSTORAGE_EVT_ERASE_RESULT, page_addr, len, p_param); + event_send(p_fs, NRF_FSTORAGE_EVT_ERASE_RESULT, NULL, page_addr, len, p_param); return NRF_SUCCESS; } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/libraries/fstorage/nrf_fstorage_nvmc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/libraries/fstorage/nrf_fstorage_nvmc.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/libraries/fstorage/nrf_fstorage_nvmc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/libraries/fstorage/nrf_fstorage_nvmc.h index be3477556c..bacd7457e0 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/libraries/fstorage/nrf_fstorage_nvmc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/libraries/fstorage/nrf_fstorage_nvmc.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/mbed_lib.json b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/mbed_lib.json similarity index 53% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/mbed_lib.json rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/mbed_lib.json index ad2b10536e..f599d4a7e1 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_MBR/mbed_lib.json +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/mbed_lib.json @@ -2,7 +2,7 @@ "name": "softdevice_mbr", "target_overrides": { "*": { - "target.bootloader_img": "hex/s140_nrf52840_5.0.0-2.alpha_mbr.hex" + "target.bootloader_img": "hex/mbr_nrf52_2.3.0_mbr.hex" } } } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_error.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_error.h similarity index 95% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_error.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_error.h index 6ae2c9b52a..c673beb10d 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_error.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_error.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -38,6 +38,16 @@ * */ /* Header guard */ + +#ifndef SOFTDEVICE_PRESENT + +/** + @defgroup nrf_error Global Error Codes + @{ + + @brief Global Error definitions +*/ + #ifndef NRF_ERROR_H__ #define NRF_ERROR_H__ @@ -45,8 +55,6 @@ extern "C" { #endif -/// @cond Make doxygen skip this file - /** @defgroup NRF_ERRORS_BASE Error Codes Base number definitions * @{ */ #define NRF_ERROR_BASE_NUM (0x0) ///< Global error base @@ -74,14 +82,14 @@ extern "C" { #define NRF_ERROR_INVALID_ADDR (NRF_ERROR_BASE_NUM + 16) ///< Bad Memory Address #define NRF_ERROR_BUSY (NRF_ERROR_BASE_NUM + 17) ///< Busy - #ifdef __cplusplus } #endif #endif // NRF_ERROR_H__ -/// @endcond /** @} */ + +#endif // SOFTDEVICE_PRESENT diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_nvic.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_nvic.c similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_nvic.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_nvic.c index 45803bf61a..8fa8b2beb9 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_nvic.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_nvic.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_nvic.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_nvic.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_nvic.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_nvic.h index 3ab15d66d1..58dd0274eb 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_nvic.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_nvic.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_sdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_sdm.h new file mode 100644 index 0000000000..ec3f150fc6 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_sdm.h @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#ifndef NRF_SDM_H__ +#define NRF_SDM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +#define NRF_FAULT_ID_SD_RANGE_START 0x00000000 /**< SoftDevice ID range start. */ +#define NRF_FAULT_ID_APP_RANGE_START 0x00001000 /**< Application ID range start. */ + +#ifdef __cplusplus +} +#endif +#endif // NRF_SDM_H__ + + diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_soc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_soc.c similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_soc.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_soc.c index 8b273d74bf..da25fbbd32 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_soc.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_soc.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_soc.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_soc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_soc.h index 3119ada366..c1c9d04416 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_MBR/nrf_soc_nosd/nrf_soc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_MBR/nrf_soc_nosd/nrf_soc.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52_6.0.0_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52_6.0.0_licence-agreement.txt new file mode 100644 index 0000000000..a71adee7b9 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52_6.0.0_licence-agreement.txt @@ -0,0 +1,35 @@ +Copyright (c) 2007 - 2018, Nordic Semiconductor ASA +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form, except as embedded into a Nordic + Semiconductor ASA integrated circuit in a product or a software update for + such product, must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of Nordic Semiconductor ASA nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +4. This software, with or without modification, must only be used with a + Nordic Semiconductor ASA integrated circuit. + +5. Any software provided in binary form under this license must not be reverse + engineered, decompiled, modified and/or disassembled. + +THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52_6.0.0_migration-document.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52_6.0.0_migration-document.pdf new file mode 100644 index 0000000000..1379ecd581 Binary files /dev/null and b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52_6.0.0_migration-document.pdf differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52_6.0.0_release-notes.pdf b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52_6.0.0_release-notes.pdf new file mode 100644 index 0000000000..3e592752a2 Binary files /dev/null and b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/doc/s140_nrf52_6.0.0_release-notes.pdf differ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_err.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_err.h new file mode 100644 index 0000000000..1b4820dc3d --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_err.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_COMMON + @{ + @addtogroup nrf_error + @{ + @ingroup BLE_COMMON + @} + + @defgroup ble_err General error codes + @{ + + @brief General error code definitions for the BLE API. + + @ingroup BLE_COMMON +*/ +#ifndef NRF_BLE_ERR_H__ +#define NRF_BLE_ERR_H__ + +#include "nrf_error.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* @defgroup BLE_ERRORS Error Codes + * @{ */ +#define BLE_ERROR_NOT_ENABLED (NRF_ERROR_STK_BASE_NUM+0x001) /**< @ref sd_ble_enable has not been called. */ +#define BLE_ERROR_INVALID_CONN_HANDLE (NRF_ERROR_STK_BASE_NUM+0x002) /**< Invalid connection handle. */ +#define BLE_ERROR_INVALID_ATTR_HANDLE (NRF_ERROR_STK_BASE_NUM+0x003) /**< Invalid attribute handle. */ +#define BLE_ERROR_INVALID_ADV_HANDLE (NRF_ERROR_STK_BASE_NUM+0x004) /**< Invalid advertising handle. */ +#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x005) /**< Invalid role. */ +#define BLE_ERROR_BLOCKED_BY_OTHER_LINKS (NRF_ERROR_STK_BASE_NUM+0x006) /**< The attempt to change link settings failed due to the scheduling of other links. */ +/** @} */ + + +/** @defgroup BLE_ERROR_SUBRANGES Module specific error code subranges + * @brief Assignment of subranges for module specific error codes. + * @note For specific error codes, see ble_.h or ble_error_.h. + * @{ */ +#define NRF_L2CAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x100) /**< L2CAP specific errors. */ +#define NRF_GAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x200) /**< GAP specific errors. */ +#define NRF_GATTC_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x300) /**< GATT client specific errors. */ +#define NRF_GATTS_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x400) /**< GATT server specific errors. */ +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif + + +/** + @} + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gap.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gap.h similarity index 54% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gap.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gap.h index 339db01fd1..6e6cae2754 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_gap.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gap.h @@ -1,37 +1,39 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @@ -43,10 +45,13 @@ #ifndef BLE_GAP_H__ #define BLE_GAP_H__ - -#include "ble_types.h" -#include "ble_ranges.h" +#include #include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" #ifdef __cplusplus extern "C" { @@ -59,43 +64,45 @@ extern "C" { */ enum BLE_GAP_SVCS { - SD_BLE_GAP_ADDR_SET = BLE_GAP_SVC_BASE, /**< Set own Bluetooth Address. */ - SD_BLE_GAP_ADDR_GET, /**< Get own Bluetooth Address. */ - SD_BLE_GAP_WHITELIST_SET, /**< Set active whitelist. */ - SD_BLE_GAP_DEVICE_IDENTITIES_SET, /**< Set device identity list. */ - SD_BLE_GAP_PRIVACY_SET, /**< Set Privacy settings*/ - SD_BLE_GAP_PRIVACY_GET, /**< Get Privacy settings*/ - SD_BLE_GAP_ADV_DATA_SET, /**< Set Advertising Data. */ - SD_BLE_GAP_ADV_START, /**< Start Advertising. */ - SD_BLE_GAP_ADV_STOP, /**< Stop Advertising. */ - SD_BLE_GAP_CONN_PARAM_UPDATE, /**< Connection Parameter Update. */ - SD_BLE_GAP_DISCONNECT, /**< Disconnect. */ - SD_BLE_GAP_TX_POWER_SET, /**< Set TX Power. */ - SD_BLE_GAP_APPEARANCE_SET, /**< Set Appearance. */ - SD_BLE_GAP_APPEARANCE_GET, /**< Get Appearance. */ - SD_BLE_GAP_PPCP_SET, /**< Set PPCP. */ - SD_BLE_GAP_PPCP_GET, /**< Get PPCP. */ - SD_BLE_GAP_DEVICE_NAME_SET, /**< Set Device Name. */ - SD_BLE_GAP_DEVICE_NAME_GET, /**< Get Device Name. */ - SD_BLE_GAP_AUTHENTICATE, /**< Initiate Pairing/Bonding. */ - SD_BLE_GAP_SEC_PARAMS_REPLY, /**< Reply with Security Parameters. */ - SD_BLE_GAP_AUTH_KEY_REPLY, /**< Reply with an authentication key. */ - SD_BLE_GAP_LESC_DHKEY_REPLY, /**< Reply with an LE Secure Connections DHKey. */ - SD_BLE_GAP_KEYPRESS_NOTIFY, /**< Notify of a keypress during an authentication procedure. */ - SD_BLE_GAP_LESC_OOB_DATA_GET, /**< Get the local LE Secure Connections OOB data. */ - SD_BLE_GAP_LESC_OOB_DATA_SET, /**< Set the remote LE Secure Connections OOB data. */ - SD_BLE_GAP_ENCRYPT, /**< Initiate encryption procedure. */ - SD_BLE_GAP_SEC_INFO_REPLY, /**< Reply with Security Information. */ - SD_BLE_GAP_CONN_SEC_GET, /**< Obtain connection security level. */ - SD_BLE_GAP_RSSI_START, /**< Start reporting of changes in RSSI. */ - SD_BLE_GAP_RSSI_STOP, /**< Stop reporting of changes in RSSI. */ - SD_BLE_GAP_SCAN_START, /**< Start Scanning. */ - SD_BLE_GAP_SCAN_STOP, /**< Stop Scanning. */ - SD_BLE_GAP_CONNECT, /**< Connect. */ - SD_BLE_GAP_CONNECT_CANCEL, /**< Cancel ongoing connection procedure. */ - SD_BLE_GAP_RSSI_GET, /**< Get the last RSSI sample. */ - SD_BLE_GAP_PHY_REQUEST, /**< Initiate PHY Update procedure. */ - SD_BLE_GAP_DATA_LENGTH_UPDATE, /**< Initiate or respond to a Data Length Update Procedure. */ + SD_BLE_GAP_ADDR_SET = BLE_GAP_SVC_BASE, /**< Set own Bluetooth Address. */ + SD_BLE_GAP_ADDR_GET = BLE_GAP_SVC_BASE + 1, /**< Get own Bluetooth Address. */ + SD_BLE_GAP_WHITELIST_SET = BLE_GAP_SVC_BASE + 2, /**< Set active whitelist. */ + SD_BLE_GAP_DEVICE_IDENTITIES_SET = BLE_GAP_SVC_BASE + 3, /**< Set device identity list. */ + SD_BLE_GAP_PRIVACY_SET = BLE_GAP_SVC_BASE + 4, /**< Set Privacy settings*/ + SD_BLE_GAP_PRIVACY_GET = BLE_GAP_SVC_BASE + 5, /**< Get Privacy settings*/ + SD_BLE_GAP_ADV_SET_CONFIGURE = BLE_GAP_SVC_BASE + 6, /**< Configure an advertising set. */ + SD_BLE_GAP_ADV_START = BLE_GAP_SVC_BASE + 7, /**< Start Advertising. */ + SD_BLE_GAP_ADV_STOP = BLE_GAP_SVC_BASE + 8, /**< Stop Advertising. */ + SD_BLE_GAP_CONN_PARAM_UPDATE = BLE_GAP_SVC_BASE + 9, /**< Connection Parameter Update. */ + SD_BLE_GAP_DISCONNECT = BLE_GAP_SVC_BASE + 10, /**< Disconnect. */ + SD_BLE_GAP_TX_POWER_SET = BLE_GAP_SVC_BASE + 11, /**< Set TX Power. */ + SD_BLE_GAP_APPEARANCE_SET = BLE_GAP_SVC_BASE + 12, /**< Set Appearance. */ + SD_BLE_GAP_APPEARANCE_GET = BLE_GAP_SVC_BASE + 13, /**< Get Appearance. */ + SD_BLE_GAP_PPCP_SET = BLE_GAP_SVC_BASE + 14, /**< Set PPCP. */ + SD_BLE_GAP_PPCP_GET = BLE_GAP_SVC_BASE + 15, /**< Get PPCP. */ + SD_BLE_GAP_DEVICE_NAME_SET = BLE_GAP_SVC_BASE + 16, /**< Set Device Name. */ + SD_BLE_GAP_DEVICE_NAME_GET = BLE_GAP_SVC_BASE + 17, /**< Get Device Name. */ + SD_BLE_GAP_AUTHENTICATE = BLE_GAP_SVC_BASE + 18, /**< Initiate Pairing/Bonding. */ + SD_BLE_GAP_SEC_PARAMS_REPLY = BLE_GAP_SVC_BASE + 19, /**< Reply with Security Parameters. */ + SD_BLE_GAP_AUTH_KEY_REPLY = BLE_GAP_SVC_BASE + 20, /**< Reply with an authentication key. */ + SD_BLE_GAP_LESC_DHKEY_REPLY = BLE_GAP_SVC_BASE + 21, /**< Reply with an LE Secure Connections DHKey. */ + SD_BLE_GAP_KEYPRESS_NOTIFY = BLE_GAP_SVC_BASE + 22, /**< Notify of a keypress during an authentication procedure. */ + SD_BLE_GAP_LESC_OOB_DATA_GET = BLE_GAP_SVC_BASE + 23, /**< Get the local LE Secure Connections OOB data. */ + SD_BLE_GAP_LESC_OOB_DATA_SET = BLE_GAP_SVC_BASE + 24, /**< Set the remote LE Secure Connections OOB data. */ + SD_BLE_GAP_ENCRYPT = BLE_GAP_SVC_BASE + 25, /**< Initiate encryption procedure. */ + SD_BLE_GAP_SEC_INFO_REPLY = BLE_GAP_SVC_BASE + 26, /**< Reply with Security Information. */ + SD_BLE_GAP_CONN_SEC_GET = BLE_GAP_SVC_BASE + 27, /**< Obtain connection security level. */ + SD_BLE_GAP_RSSI_START = BLE_GAP_SVC_BASE + 28, /**< Start reporting of changes in RSSI. */ + SD_BLE_GAP_RSSI_STOP = BLE_GAP_SVC_BASE + 29, /**< Stop reporting of changes in RSSI. */ + SD_BLE_GAP_SCAN_START = BLE_GAP_SVC_BASE + 30, /**< Start Scanning. */ + SD_BLE_GAP_SCAN_STOP = BLE_GAP_SVC_BASE + 31, /**< Stop Scanning. */ + SD_BLE_GAP_CONNECT = BLE_GAP_SVC_BASE + 32, /**< Connect. */ + SD_BLE_GAP_CONNECT_CANCEL = BLE_GAP_SVC_BASE + 33, /**< Cancel ongoing connection procedure. */ + SD_BLE_GAP_RSSI_GET = BLE_GAP_SVC_BASE + 34, /**< Get the last RSSI sample. */ + SD_BLE_GAP_PHY_UPDATE = BLE_GAP_SVC_BASE + 35, /**< Initiate or respond to a PHY Update Procedure. */ + SD_BLE_GAP_DATA_LENGTH_UPDATE = BLE_GAP_SVC_BASE + 36, /**< Initiate or respond to a Data Length Update Procedure. */ + SD_BLE_GAP_QOS_CHANNEL_SURVEY_START = BLE_GAP_SVC_BASE + 37, /**< Start Quality of Service (QoS) channel survey module. */ + SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP = BLE_GAP_SVC_BASE + 38, /**< Stop Quality of Service (QoS) channel survey module. */ }; /**@brief GAP Event IDs. @@ -103,26 +110,29 @@ enum BLE_GAP_SVCS */ enum BLE_GAP_EVTS { - BLE_GAP_EVT_CONNECTED = BLE_GAP_EVT_BASE, /**< Connection established. \n See @ref ble_gap_evt_connected_t. */ - BLE_GAP_EVT_DISCONNECTED, /**< Disconnected from peer. \n See @ref ble_gap_evt_disconnected_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE, /**< Connection Parameters updated. \n See @ref ble_gap_evt_conn_param_update_t. */ - BLE_GAP_EVT_SEC_PARAMS_REQUEST, /**< Request to provide security parameters. \n Reply with @ref sd_ble_gap_sec_params_reply. \n See @ref ble_gap_evt_sec_params_request_t. */ - BLE_GAP_EVT_SEC_INFO_REQUEST, /**< Request to provide security information. \n Reply with @ref sd_ble_gap_sec_info_reply. \n See @ref ble_gap_evt_sec_info_request_t. */ - BLE_GAP_EVT_PASSKEY_DISPLAY, /**< Request to display a passkey to the user. \n In LESC Numeric Comparison, reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_passkey_display_t. */ - BLE_GAP_EVT_KEY_PRESSED, /**< Notification of a keypress on the remote device.\n See @ref ble_gap_evt_key_pressed_t */ - BLE_GAP_EVT_AUTH_KEY_REQUEST, /**< Request to provide an authentication key. \n Reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_auth_key_request_t. */ - BLE_GAP_EVT_LESC_DHKEY_REQUEST, /**< Request to calculate an LE Secure Connections DHKey. \n Reply with @ref sd_ble_gap_lesc_dhkey_reply. \n See @ref ble_gap_evt_lesc_dhkey_request_t */ - BLE_GAP_EVT_AUTH_STATUS, /**< Authentication procedure completed with status. \n See @ref ble_gap_evt_auth_status_t. */ - BLE_GAP_EVT_CONN_SEC_UPDATE, /**< Connection security updated. \n See @ref ble_gap_evt_conn_sec_update_t. */ - BLE_GAP_EVT_TIMEOUT, /**< Timeout expired. \n See @ref ble_gap_evt_timeout_t. */ - BLE_GAP_EVT_RSSI_CHANGED, /**< RSSI report. \n See @ref ble_gap_evt_rssi_changed_t. */ - BLE_GAP_EVT_ADV_REPORT, /**< Advertising report. \n See @ref ble_gap_evt_adv_report_t. */ - BLE_GAP_EVT_SEC_REQUEST, /**< Security Request. \n See @ref ble_gap_evt_sec_request_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, /**< Connection Parameter Update Request. \n Reply with @ref sd_ble_gap_conn_param_update. \n See @ref ble_gap_evt_conn_param_update_request_t. */ - BLE_GAP_EVT_SCAN_REQ_REPORT, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ - BLE_GAP_EVT_PHY_UPDATE, /**< PHY have been updated \n See @ref ble_gap_evt_phy_update_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST, /**< Data Length Update request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ + BLE_GAP_EVT_CONNECTED = BLE_GAP_EVT_BASE, + BLE_GAP_EVT_DISCONNECTED = BLE_GAP_EVT_BASE + 1, /**< Disconnected from peer. \n See @ref ble_gap_evt_disconnected_t. */ + BLE_GAP_EVT_CONN_PARAM_UPDATE = BLE_GAP_EVT_BASE + 2, /**< Connection Parameters updated. \n See @ref ble_gap_evt_conn_param_update_t. */ + BLE_GAP_EVT_SEC_PARAMS_REQUEST = BLE_GAP_EVT_BASE + 3, /**< Request to provide security parameters. \n Reply with @ref sd_ble_gap_sec_params_reply. \n See @ref ble_gap_evt_sec_params_request_t. */ + BLE_GAP_EVT_SEC_INFO_REQUEST = BLE_GAP_EVT_BASE + 4, /**< Request to provide security information. \n Reply with @ref sd_ble_gap_sec_info_reply. \n See @ref ble_gap_evt_sec_info_request_t. */ + BLE_GAP_EVT_PASSKEY_DISPLAY = BLE_GAP_EVT_BASE + 5, /**< Request to display a passkey to the user. \n In LESC Numeric Comparison, reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_passkey_display_t. */ + BLE_GAP_EVT_KEY_PRESSED = BLE_GAP_EVT_BASE + 6, /**< Notification of a keypress on the remote device.\n See @ref ble_gap_evt_key_pressed_t */ + BLE_GAP_EVT_AUTH_KEY_REQUEST = BLE_GAP_EVT_BASE + 7, /**< Request to provide an authentication key. \n Reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_auth_key_request_t. */ + BLE_GAP_EVT_LESC_DHKEY_REQUEST = BLE_GAP_EVT_BASE + 8, /**< Request to calculate an LE Secure Connections DHKey. \n Reply with @ref sd_ble_gap_lesc_dhkey_reply. \n See @ref ble_gap_evt_lesc_dhkey_request_t */ + BLE_GAP_EVT_AUTH_STATUS = BLE_GAP_EVT_BASE + 9, /**< Authentication procedure completed with status. \n See @ref ble_gap_evt_auth_status_t. */ + BLE_GAP_EVT_CONN_SEC_UPDATE = BLE_GAP_EVT_BASE + 10, /**< Connection security updated. \n See @ref ble_gap_evt_conn_sec_update_t. */ + BLE_GAP_EVT_TIMEOUT = BLE_GAP_EVT_BASE + 11, /**< Timeout expired. \n See @ref ble_gap_evt_timeout_t. */ + BLE_GAP_EVT_RSSI_CHANGED = BLE_GAP_EVT_BASE + 12, /**< RSSI report. \n See @ref ble_gap_evt_rssi_changed_t. */ + BLE_GAP_EVT_ADV_REPORT = BLE_GAP_EVT_BASE + 13, /**< Advertising report. \n See @ref ble_gap_evt_adv_report_t. */ + BLE_GAP_EVT_SEC_REQUEST = BLE_GAP_EVT_BASE + 14, /**< Security Request. \n See @ref ble_gap_evt_sec_request_t. */ + BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 15, /**< Connection Parameter Update Request. \n Reply with @ref sd_ble_gap_conn_param_update. \n See @ref ble_gap_evt_conn_param_update_request_t. */ + BLE_GAP_EVT_SCAN_REQ_REPORT = BLE_GAP_EVT_BASE + 16, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ + BLE_GAP_EVT_PHY_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 17, /**< PHY Update Request. \n Reply with @ref sd_ble_gap_phy_update. \n See @ref ble_gap_evt_phy_update_request_t. */ + BLE_GAP_EVT_PHY_UPDATE = BLE_GAP_EVT_BASE + 18, /**< PHY Update Procedure is complete. \n See @ref ble_gap_evt_phy_update_t. */ + BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 19, /**< Data Length Update Request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ + BLE_GAP_EVT_DATA_LENGTH_UPDATE = BLE_GAP_EVT_BASE + 20, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ + BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT = BLE_GAP_EVT_BASE + 21, /**< Channel survey report. \n See @ref ble_gap_evt_qos_channel_survey_report_t. */ + BLE_GAP_EVT_ADV_SET_TERMINATED = BLE_GAP_EVT_BASE + 22, /**< Advertising set terminated. \n See @ref ble_gap_evt_adv_set_terminated_t. */ }; /**@brief GAP Option IDs. @@ -130,15 +140,12 @@ enum BLE_GAP_EVTS */ enum BLE_GAP_OPTS { - BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ - BLE_GAP_OPT_LOCAL_CONN_LATENCY, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ - BLE_GAP_OPT_PASSKEY, /**< Set passkey. @ref ble_gap_opt_passkey_t */ - BLE_GAP_OPT_SCAN_REQ_REPORT, /**< Scan request report. @ref ble_gap_opt_scan_req_report_t */ - BLE_GAP_OPT_COMPAT_MODE_1, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */ - BLE_GAP_OPT_COMPAT_MODE_2, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_2_t */ - BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ - BLE_GAP_OPT_PREFERRED_PHYS_SET, /**< Set the preferred PHYs for all new connections. @ref ble_gap_opt_preferred_phys_t */ - BLE_GAP_OPT_SLAVE_LATENCY_DISABLE, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ + BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ + BLE_GAP_OPT_LOCAL_CONN_LATENCY = BLE_GAP_OPT_BASE + 1, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ + BLE_GAP_OPT_PASSKEY = BLE_GAP_OPT_BASE + 2, /**< Set passkey. @ref ble_gap_opt_passkey_t */ + BLE_GAP_OPT_COMPAT_MODE_1 = BLE_GAP_OPT_BASE + 3, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */ + BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT = BLE_GAP_OPT_BASE + 4, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ + BLE_GAP_OPT_SLAVE_LATENCY_DISABLE = BLE_GAP_OPT_BASE + 5, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ }; /**@brief GAP Configuration IDs. @@ -147,8 +154,17 @@ enum BLE_GAP_OPTS */ enum BLE_GAP_CFGS { - BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ - BLE_GAP_CFG_DEVICE_NAME, /**< Device name configuration. */ + BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ + BLE_GAP_CFG_DEVICE_NAME = BLE_GAP_CFG_BASE + 1, /**< Device name configuration. */ +}; + +/**@brief GAP TX Power roles. + */ +enum BLE_GAP_TX_POWER_ROLES +{ + BLE_GAP_TX_POWER_ROLE_ADV = 1, /**< Advertiser role. */ + BLE_GAP_TX_POWER_ROLE_SCAN_INIT = 2, /**< Scanner and initiator role. */ + BLE_GAP_TX_POWER_ROLE_CONN = 3, /**< Connection role. */ }; /** @} */ @@ -168,7 +184,6 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_ROLES GAP Roles - * @note Not explicitly used in peripheral API, but will be relevant for central API. * @{ */ #define BLE_GAP_ROLE_INVALID 0x0 /**< Invalid Role. */ #define BLE_GAP_ROLE_PERIPH 0x1 /**< Peripheral Role. */ @@ -178,20 +193,20 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_TIMEOUT_SOURCES GAP Timeout sources * @{ */ -#define BLE_GAP_TIMEOUT_SRC_ADVERTISING 0x00 /**< Advertising timeout. */ -#define BLE_GAP_TIMEOUT_SRC_SECURITY_REQUEST 0x01 /**< Security request timeout. */ -#define BLE_GAP_TIMEOUT_SRC_SCAN 0x02 /**< Scanning timeout. */ -#define BLE_GAP_TIMEOUT_SRC_CONN 0x03 /**< Connection timeout. */ -#define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x04 /**< Authenticated payload timeout. */ +#define BLE_GAP_TIMEOUT_SRC_SCAN 0x01 /**< Scanning timeout. */ +#define BLE_GAP_TIMEOUT_SRC_CONN 0x02 /**< Connection timeout. */ +#define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x03 /**< Authenticated payload timeout. */ /**@} */ /**@defgroup BLE_GAP_ADDR_TYPES GAP Address types * @{ */ -#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public address. */ -#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static address. */ +#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public (identity) address.*/ +#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static (identity) address. */ #define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE 0x02 /**< Random private resolvable address. */ #define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE 0x03 /**< Random private non-resolvable address. */ +#define BLE_GAP_ADDR_TYPE_ANONYMOUS 0x7F /**< An advertiser may advertise without its address. + This type of advertising is called anonymous. */ /**@} */ @@ -204,13 +219,40 @@ enum BLE_GAP_CFGS /** @brief BLE address length. */ #define BLE_GAP_ADDR_LEN (6) - /**@defgroup BLE_GAP_PRIVACY_MODES Privacy modes * @{ */ #define BLE_GAP_PRIVACY_MODE_OFF 0x00 /**< Device will send and accept its identity address for its own address. */ #define BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY 0x01 /**< Device will send and accept only private addresses for its own address. */ +#define BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY 0x02 /**< Device will send and accept only private addresses for its own address, + and will not accept a peer using identity address as sender address when + the peer IRK is exchanged, non-zero and added to the identity list. */ /**@} */ +/** @brief Invalid power level. */ +#define BLE_GAP_POWER_LEVEL_INVALID 127 + +/** @brief Advertising set handle not set. */ +#define BLE_GAP_ADV_SET_HANDLE_NOT_SET (0xFF) + +/** @brief The default number of advertising sets. */ +#define BLE_GAP_ADV_SET_COUNT_DEFAULT (1) + +/** @brief The maximum number of advertising sets supported by this SoftDevice. */ +#define BLE_GAP_ADV_SET_COUNT_MAX (1) + +/**@defgroup BLE_GAP_ADV_SET_DATA_SIZES Advertising data sizes. + * @{ */ +#define BLE_GAP_ADV_SET_DATA_SIZE_MAX (31) /**< Maximum data length for an advertising set. */ +/**@}. */ + +/** @brief Set ID not available in advertising report. */ +#define BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE 0xFF + +/**@defgroup BLE_GAP_EVT_ADV_SET_TERMINATED_REASON GAP Advertising Set Terminated reasons + * @{ */ +#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_TIMEOUT 0x01 /**< Timeout value reached. */ +#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_LIMIT_REACHED 0x02 /**< @ref ble_gap_adv_params_t::max_adv_evts was reached. */ +/**@} */ /**@defgroup BLE_GAP_AD_TYPE_DEFINITIONS GAP Advertising and Scan Response Data format * @note Found at https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm @@ -266,46 +308,111 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_ADV_INTERVALS GAP Advertising interval max and min * @{ */ -#define BLE_GAP_ADV_INTERVAL_MIN 0x0020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ -#define BLE_GAP_ADV_NONCON_INTERVAL_MIN 0x00A0 /**< Minimum Advertising interval in 625 us units for non connectable mode, i.e. 100 ms. */ -#define BLE_GAP_ADV_INTERVAL_MAX 0x4000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. */ +#define BLE_GAP_ADV_INTERVAL_MIN 0x000020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ +#define BLE_GAP_ADV_INTERVAL_MAX 0x004000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. + @note Support for values above @ref BLE_GAP_ADV_INTERVAL_MAX + is experimental. Values above 0xFFFFFF, i.e 10,485.759375 s + are not supported. */ /**@} */ /**@defgroup BLE_GAP_SCAN_INTERVALS GAP Scan interval max and min * @{ */ #define BLE_GAP_SCAN_INTERVAL_MIN 0x0004 /**< Minimum Scan interval in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_INTERVAL_MAX 0x4000 /**< Maximum Scan interval in 625 us units, i.e. 10.24 s. */ +#define BLE_GAP_SCAN_INTERVAL_MAX 0xFFFF /**< Maximum Scan interval in 625 us units, i.e. 40,959.375 s. */ /** @} */ /**@defgroup BLE_GAP_SCAN_WINDOW GAP Scan window max and min * @{ */ #define BLE_GAP_SCAN_WINDOW_MIN 0x0004 /**< Minimum Scan window in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_WINDOW_MAX 0x4000 /**< Maximum Scan window in 625 us units, i.e. 10.24 s. */ +#define BLE_GAP_SCAN_WINDOW_MAX 0xFFFF /**< Maximum Scan window in 625 us units, i.e. 40,959.375 s. */ /** @} */ /**@defgroup BLE_GAP_SCAN_TIMEOUT GAP Scan timeout max and min * @{ */ -#define BLE_GAP_SCAN_TIMEOUT_MIN 0x0001 /**< Minimum Scan timeout in seconds. */ -#define BLE_GAP_SCAN_TIMEOUT_MAX 0xFFFF /**< Maximum Scan timeout in seconds. */ +#define BLE_GAP_SCAN_TIMEOUT_MIN 0x0001 /**< Minimum Scan timeout in 10 ms units, i.e 10 ms. */ +#define BLE_GAP_SCAN_TIMEOUT_UNLIMITED 0x0000 /**< Continue to scan forever. */ /** @} */ - -/**@brief Maximum size of advertising data in octets. */ -#define BLE_GAP_ADV_MAX_SIZE (31) - +/**@defgroup BLE_GAP_SCAN_BUFFER_SIZE GAP Minimum scanner buffer size + * + * Scan buffers are used for storing advertising data received from an advertiser. + * If ble_gap_scan_params_t::extended is set to 0, @ref BLE_GAP_SCAN_BUFFER_MIN is the minimum scan buffer length. + * else the minimum scan buffer size is @ref BLE_GAP_SCAN_BUFFER_EXTENDED_MIN. + * @{ */ +#define BLE_GAP_SCAN_BUFFER_MIN (31) /**< Minimum data length for an + advertising set. */ +#define BLE_GAP_SCAN_BUFFER_MAX (31) /**< Maximum data length for an + advertising set. */ +#define BLE_GAP_SCAN_BUFFER_EXTENDED_MIN (255) /**< Minimum data length for an + extended advertising set. */ +#define BLE_GAP_SCAN_BUFFER_EXTENDED_MAX (1650) /**< Maximum data length for an + extended advertising set. + @note Extended scanning is only + supported as an experimental + feature in this SoftDevice. + The scanner will only receive + advertising data up to 31 bytes. */ +/** @} */ /**@defgroup BLE_GAP_ADV_TYPES GAP Advertising types + * + * Advertising types defined in Bluetooth Core Specification v5.0, Vol 6, Part B, Section 4.4.2. + * + * The maximum advertising data length is defined by @ref BLE_GAP_ADV_SET_DATA_SIZE_MAX. + * Note that some of the advertising types do not support advertising data. Non-scannable types do not support + * scan response data. + * * @{ */ -#define BLE_GAP_ADV_TYPE_ADV_IND 0x00 /**< Connectable undirected. */ -#define BLE_GAP_ADV_TYPE_ADV_DIRECT_IND 0x01 /**< Connectable directed. */ -#define BLE_GAP_ADV_TYPE_ADV_SCAN_IND 0x02 /**< Scannable undirected. */ -#define BLE_GAP_ADV_TYPE_ADV_NONCONN_IND 0x03 /**< Non connectable undirected. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED 0x01 /**< Connectable and scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE 0x02 /**< Connectable non-scannable directed advertising + events. Advertising interval is less that 3.75 ms. + Use this type for fast reconnections. + @note Advertising data is not supported. */ +#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED 0x03 /**< Connectable non-scannable directed advertising + events. + @note Advertising data is not supported. */ +#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x04 /**< Non-connectable scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x05 /**< Non-connectable non-scannable undirected + advertising events. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED 0x06 /**< Connectable non-scannable undirected advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_DIRECTED 0x07 /**< Connectable non-scannable directed advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_UNDIRECTED 0x08 /**< Non-connectable scannable undirected advertising + events using extended advertising PDUs. + @note Only scan response data is supported. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_DIRECTED 0x09 /**< Non-connectable scannable directed advertising + events using extended advertising PDUs. + @note Only scan response data is supported. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED 0x0A /**< Non-connectable non-scannable undirected advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ +#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED 0x0B /**< Non-connectable non-scannable directed advertising + events using extended advertising PDUs. + @note Extended advertising types are only + supported as experimental features in this + SoftDevice. */ /**@} */ - /**@defgroup BLE_GAP_ADV_FILTER_POLICIES GAP Advertising filter policies * @{ */ #define BLE_GAP_ADV_FP_ANY 0x00 /**< Allow scan requests and connect requests from any device. */ @@ -314,11 +421,34 @@ enum BLE_GAP_CFGS #define BLE_GAP_ADV_FP_FILTER_BOTH 0x03 /**< Filter both scan and connect requests with whitelist. */ /**@} */ - -/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values +/**@defgroup BLE_GAP_ADV_DATA_STATUS GAP Advertising data status * @{ */ -#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (180) /**< Maximum advertising time in limited discoverable mode (TGAP(lim_adv_timeout) = 180 s). */ -#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. */ +#define BLE_GAP_ADV_DATA_STATUS_COMPLETE 0x00 /**< All data in the advertising event have been received. */ +#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA 0x01 /**< More data to be received. */ +#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED 0x02 /**< Incomplete data. Buffer size insufficient to receive more. */ +#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MISSED 0x03 /**< Failed to receive the remaining data. */ +/**@} */ + +/**@defgroup BLE_GAP_SCAN_FILTER_POLICIES GAP Scanner filter policies + * @{ */ +#define BLE_GAP_SCAN_FP_ACCEPT_ALL 0x00 /**< Accept all advertising packets except directed advertising packets + not addressed to this device. */ +#define BLE_GAP_SCAN_FP_WHITELIST 0x01 /**< Accept advertising packets from devices in the whitelist except directed + packets not addressed to this device. */ +#define BLE_GAP_SCAN_FP_ALL_NOT_RESOLVED_DIRECTED 0x02 /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_ACCEPT_ALL. + In addition, accept directed advertising packets, where the advertiser's + address is a resolvable private address that cannot be resolved. */ +#define BLE_GAP_SCAN_FP_WHITELIST_NOT_RESOLVED_DIRECTED 0x03 /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_WHITELIST. + In addition, accept directed advertising packets, where the advertiser's + address is a resolvable private address that cannot be resolved. */ +/**@} */ + +/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values in 10 ms units + * @{ */ +#define BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX (128) /**< Maximum high duty advertising time in 10 ms units. Corresponds to 1.28 s. */ +#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (18000) /**< Maximum advertising time in 10 ms units corresponding to TGAP(lim_adv_timeout) = 180 s in limited discoverable mode. */ +#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. + For high duty cycle advertising, this corresponds to @ref BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX. */ /**@} */ @@ -419,9 +549,18 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_PHYS GAP PHYs * @{ */ +#define BLE_GAP_PHY_AUTO 0x00 /**< Automatic PHY selection. Refer @ref sd_ble_gap_phy_update for more information.*/ #define BLE_GAP_PHY_1MBPS 0x01 /**< 1 Mbps PHY. */ #define BLE_GAP_PHY_2MBPS 0x02 /**< 2 Mbps PHY. */ #define BLE_GAP_PHY_CODED 0x04 /**< Coded PHY. */ +#define BLE_GAP_PHY_NOT_SET 0xFF /**< PHY is not configured. */ + +/**@brief Supported PHYs in connections, for scanning, and for advertising. */ +#define BLE_GAP_PHYS_SUPPORTED (BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS | BLE_GAP_PHY_CODED) /**< All PHYs are supported. + @note Coded PHY is only supported + as an experimental feature + in this SoftDevice. */ + /**@} */ /**@defgroup BLE_GAP_CONN_SEC_MODE_SET_MACROS GAP attribute security requirement setters @@ -479,8 +618,9 @@ enum BLE_GAP_CFGS /**@defgroup BLE_GAP_EVENT_LENGTH GAP event length defines. * @{ */ -#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ -#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ +#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ +#define BLE_GAP_EVENT_LENGTH_CODED_PHY_MIN (6) /**< The shortest event length in 1.25 ms units supporting LE Coded PHY. */ +#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ /**@} */ @@ -490,32 +630,80 @@ enum BLE_GAP_CFGS #define BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT (3) /**< Default maximum number of connections concurrently acting as centrals. */ #define BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT (1) /**< Default number of SMP instances shared between all connections acting as centrals. */ #define BLE_GAP_ROLE_COUNT_COMBINED_MAX (20) /**< Maximum supported number of concurrent connections in the peripheral and central roles combined. */ + /**@} */ - - - /**@brief Automatic data length parameter. */ #define BLE_GAP_DATA_LENGTH_AUTO 0 +/**@defgroup BLE_GAP_AUTH_PAYLOAD_TIMEOUT Authenticated payload timeout defines. + * @{ */ +#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX (48000) /**< Maximum authenticated payload timeout in 10 ms units, i.e. 8 minutes. */ +#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MIN (1) /**< Minimum authenticated payload timeout in 10 ms units, i.e. 10 ms. */ +/**@} */ /**@defgroup GAP_SEC_MODES GAP Security Modes * @{ */ #define BLE_GAP_SEC_MODE 0x00 /**< No key (may be used to reject). */ /**@} */ + +/**@brief The total number of channels in Bluetooth Low Energy. */ +#define BLE_GAP_CHANNEL_COUNT (40) + +/**@defgroup BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS Quality of Service (QoS) Channel survey interval defines + * @{ */ +#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS (0) /**< Continuous channel survey. */ +#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MIN_US (7500) /**< Minimum channel survey interval in microseconds (7.5 ms). */ +#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MAX_US (4000000) /**< Maximum channel survey interval in microseconds (4 s). */ + /**@} */ + /** @} */ /**@addtogroup BLE_GAP_STRUCTURES Structures * @{ */ +/**@brief Advertising event properties. */ +typedef struct +{ + uint8_t type; /**< Advertising type. See @ref BLE_GAP_ADV_TYPES. */ + uint8_t anonymous : 1; /**< Omit advertiser's address from all PDUs. + @note Anonymous advertising is only available for + @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED and + @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED. */ + uint8_t include_tx_power : 1; /**< Include TxPower set by @ref sd_ble_gap_tx_power_set in the extended header + of the advertising PDU. + @note TxPower can only be added to the extended header when @ref type is an extended advertising type. */ +} ble_gap_adv_properties_t; + + +/**@brief Advertising report type. */ +typedef struct +{ + uint16_t connectable : 1; /**< Connectable advertising event type. */ + uint16_t scannable : 1; /**< Scannable advertising event type. */ + uint16_t directed : 1; /**< Directed advertising event type. */ + uint16_t scan_response : 1; /**< Received a scan response. */ + uint16_t extended_pdu : 1; /**< Received an extended advertising set. */ + uint16_t status : 2; /**< Data status. See @ref BLE_GAP_ADV_DATA_STATUS. */ + uint16_t reserved : 9; /**< Reserved for future use. */ +} ble_gap_adv_report_type_t; + +/**@brief Advertising Auxiliary Pointer. */ +typedef struct +{ + uint16_t aux_offset; /**< Time offset from the beginning of advertising packet to the auxiliary packet in 100 us units. */ + uint8_t aux_phy; /**< Indicates the PHY on which the auxiliary advertising packet is sent. See @ref BLE_GAP_PHYS. */ +} ble_gap_aux_pointer_t; + /**@brief Bluetooth Low Energy address. */ typedef struct { uint8_t addr_id_peer : 1; /**< Only valid for peer addresses. Reference to peer in device identities list (as set with @ref sd_ble_gap_device_identities_set) when peer is using privacy. */ uint8_t addr_type : 7; /**< See @ref BLE_GAP_ADDR_TYPES. */ - uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format. */ + uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format. + addr is not used if addr_type is @ref BLE_GAP_ADDR_TYPE_ANONYMOUS. */ } ble_gap_addr_t; @@ -545,7 +733,7 @@ typedef struct * Security Mode 1 Level 1: No security is needed (aka open link).\n * Security Mode 1 Level 2: Encrypted link required, MITM protection not necessary.\n * Security Mode 1 Level 3: MITM protected encrypted link required.\n - * Security Mode 1 Level 4: LESC MITM protected encrypted link required.\n + * Security Mode 1 Level 4: LESC MITM protected encrypted link using a 128-bit strength encryption key required.\n * Security Mode 2 Level 1: Signing or encryption required, MITM protection not necessary.\n * Security Mode 2 Level 2: MITM protected signing required, unless link is MITM protected encrypted.\n */ @@ -571,48 +759,155 @@ typedef struct } ble_gap_irk_t; -/**@brief Channel mask for RF channels used in advertising. */ -typedef struct -{ - uint8_t ch_37_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 37 */ - uint8_t ch_38_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 38 */ - uint8_t ch_39_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 39 */ -} ble_gap_adv_ch_mask_t; +/**@brief Channel mask (40 bits). + * Every channel is represented with a bit positioned as per channel index defined in Bluetooth Core Specification v5.0, + * Vol 6, Part B, Section 1.4.1. The LSB contained in array element 0 represents channel index 0, and bit 39 represents + * channel index 39. If a bit is set to 1, the channel is not used. + */ +typedef uint8_t ble_gap_ch_mask_t[5]; /**@brief GAP advertising parameters. */ typedef struct { - uint8_t type; /**< See @ref BLE_GAP_ADV_TYPES. */ - ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. - - When privacy is enabled and the local device use @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, the device identity list is searched for a matching - entry. If the local IRK for that device identity is set, the local IRK for that device will be used to generate the advertiser address field in the advertise packet. - - If type is @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this must be set to the targeted initiator. If the initiator is in the device identity list, - the peer IRK for that device will be used to generate the initiator address field in the ADV_DIRECT_IND packet. */ - uint8_t fp; /**< Filter Policy, see @ref BLE_GAP_ADV_FILTER_POLICIES. */ - uint16_t interval; /**< Advertising interval between 0x0020 and 0x4000 in 0.625 ms units (20 ms to 10.24 s), see @ref BLE_GAP_ADV_INTERVALS. - - If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this parameter must be set to 0 for high duty cycle directed advertising. - - If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, set @ref BLE_GAP_ADV_INTERVAL_MIN <= interval <= @ref BLE_GAP_ADV_INTERVAL_MAX for low duty cycle advertising.*/ - uint16_t timeout; /**< Advertising timeout between 0x0001 and 0x3FFF in seconds, 0x0000 disables timeout. See also @ref BLE_GAP_ADV_TIMEOUT_VALUES. If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this parameter must be set to 0 for High duty cycle directed advertising. */ - ble_gap_adv_ch_mask_t channel_mask; /**< Advertising channel mask. See @ref ble_gap_adv_ch_mask_t. */ + ble_gap_adv_properties_t properties; /**< The properties of the advertising events. */ + ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. + @note ble_gap_addr_t::addr_type cannot be + @ref BLE_GAP_ADDR_TYPE_ANONYMOUS. + - When privacy is enabled and the local device uses + @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, + the device identity list is searched for a matching entry. If + the local IRK for that device identity is set, the local IRK + for that device will be used to generate the advertiser address + field in the advertising packet. + - If @ref ble_gap_adv_properties_t::type is directed, this must be + set to the targeted scanner or initiator. If the peer address is + in the device identity list, the peer IRK for that device will be + used to generate @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE + target addresses used in the advertising event PDUs. */ + uint32_t interval; /**< Advertising interval in 625 us units. @sa BLE_GAP_ADV_INTERVALS. + @note If @ref ble_gap_adv_properties_t::type is set to + @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE + advertising, this parameter is ignored. */ + uint16_t duration; /**< Advertising duration in 10 ms units. When timeout is reached, + an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. + @sa BLE_GAP_ADV_TIMEOUT_VALUES. */ + uint8_t max_adv_evts; /**< Maximum advertising events that shall be sent prior to disabling + advertising. Setting the value to 0 disables the limitation. When + the count of advertising events specified by this parameter + (if not 0) is reached, advertising will be automatically stopped + and an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised + @note If @ref ble_gap_adv_properties_t::type is set to + @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE, + this parameter is ignored. + @note Setting max_adv_evts to a values not equal to 0 is only supported + as an experimental feature in this SoftDevice. */ + ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary and secondary advertising channels. + At least one of the primary channels, that is channel index 37-39, must be used. + Masking away secondary advertising channels is not supported. */ + uint8_t filter_policy; /**< Filter Policy. @sa BLE_GAP_ADV_FILTER_POLICIES. */ + uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising channel packets + are transmitted. If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS + will be used. + Valid values are @ref BLE_GAP_PHY_1MBPS and @ref BLE_GAP_PHY_CODED. + @note The primary_phy shall indicate @ref BLE_GAP_PHY_1MBPS if + @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ + uint8_t secondary_phy; /**< Indicates the PHY on which the secondary advertising channel packets + are transmitted. + If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS will be used. + Valid values are + @ref BLE_GAP_PHY_1MBPS, @ref BLE_GAP_PHY_2MBPS, and @ref BLE_GAP_PHY_CODED. + If @ref ble_gap_adv_properties_t::type is an extended advertising type + and connectable, this is the PHY that will be used to establish a + connection and send AUX_ADV_IND packets on. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ + uint8_t set_id:4; /**< The advertising set identifier distinguishes this advertising set from other + advertising sets transmitted by this and other devices. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is not an extended advertising type. */ + uint8_t scan_req_notification:1; /**< Enable scan request notifications for this advertising set. When a + scan request is received and the scanner address is allowed + by the filter policy, @ref BLE_GAP_EVT_SCAN_REQ_REPORT is raised. + @note This parameter will be ignored when + @ref ble_gap_adv_properties_t::type is a non-scannable + advertising type. */ } ble_gap_adv_params_t; +/**@brief GAP advertising data buffers. + * + * The application must provide the buffers for advertisement. The memory shall reside in application RAM, and + * shall never be modified while advertising. The data shall be kept alive until either: + * - @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised. + * - @ref BLE_GAP_EVT_CONNECTED is raised with @ref ble_gap_evt_connected_t::adv_handle set to the corresponding + * advertising handle. + * - Advertising is stopped. + * - Advertising data is changed. + * To update advertising data while advertising, provide new buffers to @ref sd_ble_gap_adv_set_configure. */ +typedef struct +{ + ble_data_t adv_data; /**< Advertising data. + @note + Advertising data can only be specified for a @ref ble_gap_adv_properties_t::type + that is allowed to contain advertising data. */ + ble_data_t scan_rsp_data; /**< Scan response data. + @note + Scan response data can only be specified for a @ref ble_gap_adv_properties_t::type + that is scannable. */ +} ble_gap_adv_data_t; + + /**@brief GAP scanning parameters. */ typedef struct { - uint8_t active : 1; /**< If 1, perform active scanning (scan requests). */ - uint8_t use_whitelist : 1; /**< If 1, filter advertisers using current active whitelist. */ - uint8_t adv_dir_report : 1; /**< If 1, also report directed advertisements where the initiator field is set to a private resolvable address, - even if the address did not resolve to an entry in the device identity list. A report will be generated - even if the peer is not in the whitelist. */ - uint16_t interval; /**< Scan interval between 0x0004 and 0x4000 in 0.625 ms units (2.5 ms to 10.24 s). */ - uint16_t window; /**< Scan window between 0x0004 and 0x4000 in 0.625 ms units (2.5 ms to 10.24 s). */ - uint16_t timeout; /**< Scan timeout between 0x0001 and 0xFFFF in seconds, 0x0000 disables timeout. */ + uint8_t extended : 1; /**< If 1, the scanner will accept extended advertising packets. + If set to 0, the scanner will not receive advertising packets + on secondary advertising channels, and will not be able + to receive long advertising PDUs. + @note Extended scanning is only supported as an experimental feature in this + SoftDevice. */ + uint8_t report_incomplete_evts : 1; /**< If 1, events of type @ref ble_gap_evt_adv_report_t may have + @ref ble_gap_adv_report_type_t::status set to + @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. + This parameter is ignored when used with @ref sd_ble_gap_connect + @note This may be used to abort receiving more packets from an extended + advertising event, and is only available for extended + scanning, see @ref sd_ble_gap_scan_start. + @note This feature is not supported by this SoftDevice. */ + uint8_t active : 1; /**< If 1, perform active scanning by sending scan requests. + This parameter is ignored when used with @ref sd_ble_gap_connect. */ + uint8_t filter_policy : 2; /**< Scanning filter policy. @sa BLE_GAP_SCAN_FILTER_POLICIES. + @note Only @ref BLE_GAP_SCAN_FP_ACCEPT_ALL and + @ref BLE_GAP_SCAN_FP_WHITELIST are valid when used with + @ref sd_ble_gap_connect */ + uint8_t scan_phys; /**< Bitfield of PHYs to scan on. If set to @ref BLE_GAP_PHY_AUTO, + scan_phys will default to @ref BLE_GAP_PHY_1MBPS. + - If @ref ble_gap_scan_params_t::extended is set to 0, the only + supported PHY is @ref BLE_GAP_PHY_1MBPS. + - When used with @ref sd_ble_gap_scan_start, + the bitfield indicates the PHYs the scanner will use for scanning + on primary advertising channels. The scanner will accept + @ref BLE_GAP_PHYS_SUPPORTED as secondary advertising channel PHYs. + - When used with @ref sd_ble_gap_connect, the + bitfield indicates the PHYs on where a connection may be initiated. + If scan_phys contains @ref BLE_GAP_PHY_1MBPS and/or @ref BLE_GAP_PHY_2MBPS, + the primary scan PHY is @ref BLE_GAP_PHY_1MBPS. + If scan_phys also contains @ref BLE_GAP_PHY_CODED, the primary scan + PHY will also contain @ref BLE_GAP_PHY_CODED. If the only scan PHY is + @ref BLE_GAP_PHY_CODED, the primary scan PHY is + @ref BLE_GAP_PHY_CODED only. */ + uint16_t interval; /**< Scan interval in 625 us units. @sa BLE_GAP_SCAN_INTERVALS. */ + uint16_t window; /**< Scan window in 625 us units. @sa BLE_GAP_SCAN_WINDOW. */ + uint16_t timeout; /**< Scan timeout in 10 ms units. @sa BLE_GAP_SCAN_TIMEOUT. */ + ble_gap_ch_mask_t channel_mask; /**< Channel mask for primary and secondary advertising channels. + At least one of the primary channels, that is channel index 37-39, must be + set to 0. + Masking away secondary channels is not supported. */ } ble_gap_scan_params_t; -/**@brief Device Privacy. +/**@brief Privacy. * * The privacy feature provides a way for the device to avoid being tracked over a period of time. * The privacy feature, when enabled, hides the local device identity and replaces it with a private address @@ -622,6 +917,9 @@ typedef struct * With this key, a device can generate a random private address that can only be recognized by peers in possession of that key, * and devices can establish connections without revealing their real identities. * + * Both network privacy (@ref BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY) and device privacy (@ref BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY) + * are supported. + * * @note If the device IRK is updated, the new IRK becomes the one to be distributed in all * bonding procedures performed after @ref sd_ble_gap_privacy_set returns. * The IRK distributed during bonding procedure is the device IRK that is active when @ref sd_ble_gap_sec_params_reply is called. @@ -637,8 +935,8 @@ typedef struct } ble_gap_privacy_params_t; -/**@brief Physical Layer configuration - * @note tx_phys and rx_phys are bitfields, to indicate multiple preferred PHYs for each direction they can be ORed together. +/**@brief PHY preferences for TX and RX + * @note tx_phys and rx_phys are bit fields. Multiple bits can be set in them to indicate multiple preferred PHYs for each direction. * @code * p_gap_phys->tx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; * p_gap_phys->rx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; @@ -736,6 +1034,12 @@ typedef struct and the address is the device's identity address. */ uint8_t role; /**< BLE role for this connection, see @ref BLE_GAP_ROLES */ ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ + uint8_t adv_handle; /**< Advertising handle in which advertising has ended. + This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ + ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated + advertising set. The advertising buffers provided in + @ref sd_ble_gap_adv_set_configure are now released. + This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */ } ble_gap_evt_connected_t; @@ -752,10 +1056,16 @@ typedef struct ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ } ble_gap_evt_conn_param_update_t; +/**@brief Event structure for @ref BLE_GAP_EVT_PHY_UPDATE_REQUEST. */ +typedef struct +{ + ble_gap_phys_t peer_preferred_phys; /**< The PHYs the peer prefers to use. */ +} ble_gap_evt_phy_update_request_t; + /**@brief Event Structure for @ref BLE_GAP_EVT_PHY_UPDATE. */ typedef struct { - uint8_t status; /**< Status of the procedure, see @ref BLE_HCI_STATUS_CODES */ + uint8_t status; /**< Status of the procedure, see @ref BLE_HCI_STATUS_CODES.*/ uint8_t tx_phy; /**< TX PHY for this connection, see @ref BLE_GAP_PHYS. */ uint8_t rx_phy; /**< RX PHY for this connection, see @ref BLE_GAP_PHYS. */ } ble_gap_evt_phy_update_t; @@ -881,6 +1191,7 @@ typedef struct uint8_t auth_status; /**< Authentication status, see @ref BLE_GAP_SEC_STATUS. */ uint8_t error_src : 2; /**< On error, source that caused the failure, see @ref BLE_GAP_SEC_STATUS_SOURCES. */ uint8_t bonded : 1; /**< Procedure resulted in a bond. */ + uint8_t lesc : 1; /**< Procedure resulted in a LE Secure Connection. */ ble_gap_sec_levels_t sm1_levels; /**< Levels supported in Security Mode 1. */ ble_gap_sec_levels_t sm2_levels; /**< Levels supported in Security Mode 2. */ ble_gap_sec_kdist_t kdist_own; /**< Bitmap stating which keys were exchanged (distributed) by the local device. If bonding with LE Secure Connections, the enc bit will be always set. */ @@ -899,28 +1210,82 @@ typedef struct typedef struct { uint8_t src; /**< Source of timeout event, see @ref BLE_GAP_TIMEOUT_SOURCES. */ + union + { + ble_data_t adv_report_buffer; /**< If source is set to @ref BLE_GAP_TIMEOUT_SRC_SCAN, the released + scan buffer is contained in this field. */ + } params; /**< Event Parameters. */ } ble_gap_evt_timeout_t; /**@brief Event structure for @ref BLE_GAP_EVT_RSSI_CHANGED. */ typedef struct { - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ + int8_t rssi; /**< Received Signal Strength Indication in dBm. + @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement. */ + uint8_t ch_index; /**< Data Channel Index on which the Signal Strength is measured (0-36). */ } ble_gap_evt_rssi_changed_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_ADV_REPORT. */ +/**@brief Event structure for @ref BLE_GAP_EVT_ADV_SET_TERMINATED */ typedef struct { - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 - and the address is the device's identity address. */ - ble_gap_addr_t direct_addr; /**< Set when the scanner is unable to resolve the private resolvable address of the initiator - field of a directed advertisement packet and the scanner has been enabled to report this in @ref ble_gap_scan_params_t::adv_dir_report. */ - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ - uint8_t scan_rsp : 1; /**< If 1, the report corresponds to a scan response and the type field may be ignored. */ - uint8_t type : 2; /**< See @ref BLE_GAP_ADV_TYPES. Only valid if the scan_rsp field is 0. */ - uint8_t dlen : 5; /**< Advertising or scan response data length. */ - uint8_t data[BLE_GAP_ADV_MAX_SIZE]; /**< Advertising or scan response data. */ + uint8_t reason; /**< Reason for why the advertising set terminated. See + @ref BLE_GAP_EVT_ADV_SET_TERMINATED_REASON. */ + uint8_t adv_handle; /**< Advertising handle in which advertising has ended. */ + uint8_t num_completed_adv_events; /**< If @ref ble_gap_adv_params_t::max_adv_evts was not set to 0, + this field indicates the number of completed advertising events. */ + ble_gap_adv_data_t adv_data; /**< Advertising buffers corresponding to the terminated + advertising set. The advertising buffers provided in + @ref sd_ble_gap_adv_set_configure are now released. */ +} ble_gap_evt_adv_set_terminated_t; + +/**@brief Event structure for @ref BLE_GAP_EVT_ADV_REPORT. + * + * @note If @ref ble_gap_adv_report_type_t::status is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, + * not all fields in the advertising report may be available. + * + * @note When ble_gap_adv_report_type_t::status is not set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, + * scanning will be paused. To continue scanning, call @ref sd_ble_gap_scan_start. + */ +typedef struct +{ + ble_gap_adv_report_type_t type; /**< Advertising report type. See @ref ble_gap_adv_report_type_t. */ + ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr is resolved: + @ref ble_gap_addr_t::addr_id_peer is set to 1 and the address is the + peer's identity address. */ + ble_gap_addr_t direct_addr; /**< Contains the target address of the advertising event if + @ref ble_gap_adv_report_type_t::directed is set to 1. If the + SoftDevice was able to resolve the address, + @ref ble_gap_addr_t::addr_id_peer is set to 1 and the direct_addr + contains the local identity address. If the target address of the + advertising event is @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE, + and the SoftDevice was unable to resolve it, the application may try + to resolve this address to find out if the advertising event was + directed to us. */ + uint8_t primary_phy; /**< Indicates the PHY on which the primary advertising packet was received on. + See @ref BLE_GAP_PHYS. */ + uint8_t secondary_phy; /**< Indicates the PHY on which the secondary advertising packet was received on. + See @ref BLE_GAP_PHYS. This field is to 0 if no packets where received on + a secondary advertising channel. */ + int8_t tx_power; /**< TX Power reported by the advertiser in the last packet header received. + This field is set to @ref BLE_GAP_POWER_LEVEL_INVALID if the + last received packet did not contain the Tx Power field. + @note TX Power is only included in extended advertising packets. */ + int8_t rssi; /**< Received Signal Strength Indication in dBm of the last packet received. + @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement. */ + uint8_t ch_index; /**< Channel Index on which the last advertising packet is received (0-39). */ + uint8_t set_id; /**< Set ID of the received advertising data. Set ID is not present + if set to @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */ + uint16_t data_id:12; /**< The advertising data ID of the received advertising data. Data ID + is not present if @ref ble_gap_evt_adv_report_t::set_id is set to + @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */ + ble_data_t data; /**< Received advertising or scan response data. If + @ref ble_gap_adv_report_type_t::status is not set to + @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the data buffer provided + in @ref sd_ble_gap_scan_start is now released. */ + ble_gap_aux_pointer_t aux_pointer; /**< The offset and PHY of the next advertising packet in this extended advertising + event. @note This field is only set if @ref ble_gap_adv_report_type_t::status + is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. */ } ble_gap_evt_adv_report_t; @@ -944,11 +1309,14 @@ typedef struct /**@brief Event structure for @ref BLE_GAP_EVT_SCAN_REQ_REPORT. */ typedef struct { - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ + uint8_t adv_handle; /**< Advertising handle for the advertising set which received the Scan Request */ + int8_t rssi; /**< Received Signal Strength Indication in dBm. + @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement. */ ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 and the address is the device's identity address. */ } ble_gap_evt_scan_req_report_t; + /**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST. */ typedef struct { @@ -962,6 +1330,15 @@ typedef struct } ble_gap_evt_data_length_update_t; +/**@brief Event structure for @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT. */ +typedef struct +{ + int8_t channel_energy[BLE_GAP_CHANNEL_COUNT]; /**< The measured energy on the Bluetooth Low Energy + channels, in dBm, indexed by Channel Index. + If no measurement is available for the given channel, channel_energy is set to + @ref BLE_GAP_POWER_LEVEL_INVALID. */ +} ble_gap_evt_qos_channel_survey_report_t; + /**@brief GAP event structure. */ typedef struct { @@ -982,12 +1359,15 @@ typedef struct ble_gap_evt_timeout_t timeout; /**< Timeout Event Parameters. */ ble_gap_evt_rssi_changed_t rssi_changed; /**< RSSI Event Parameters. */ ble_gap_evt_adv_report_t adv_report; /**< Advertising Report Event Parameters. */ + ble_gap_evt_adv_set_terminated_t adv_set_terminated; /**< Advertising Set Terminated Event Parameters. */ ble_gap_evt_sec_request_t sec_request; /**< Security Request Event Parameters. */ ble_gap_evt_conn_param_update_request_t conn_param_update_request; /**< Connection Parameter Update Parameters. */ ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report Parameters. */ + ble_gap_evt_phy_update_request_t phy_update_request; /**< PHY Update Request Event Parameters. */ ble_gap_evt_phy_update_t phy_update; /**< PHY Update Parameters. */ ble_gap_evt_data_length_update_request_t data_length_update_request; /**< Data Length Update Request Event Parameters. */ ble_gap_evt_data_length_update_t data_length_update; /**< Data Length Update Event Parameters. */ + ble_gap_evt_qos_channel_survey_report_t qos_channel_survey_report; /**< Quality of Service (QoS) Channel Survey Report Parameters. */ } params; /**< Event Parameters. */ } ble_gap_evt_t; @@ -1020,21 +1400,27 @@ typedef struct * large. The maximum supported sum of concurrent connections is * @ref BLE_GAP_ROLE_COUNT_COMBINED_MAX. * @retval ::NRF_ERROR_INVALID_PARAM central_sec_count is larger than central_role_count. + * @retval ::NRF_ERROR_RESOURCES The adv_set_count is too large. The maximum + * supported advertising handles is + * @ref BLE_GAP_ADV_SET_COUNT_MAX. */ typedef struct { + uint8_t adv_set_count; /**< Maximum number of advertising sets. Default value is @ref BLE_GAP_ADV_SET_COUNT_DEFAULT. */ uint8_t periph_role_count; /**< Maximum number of connections concurrently acting as a peripheral. Default value is @ref BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT. */ uint8_t central_role_count; /**< Maximum number of connections concurrently acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT. */ uint8_t central_sec_count; /**< Number of SMP instances shared between all connections acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT. */ + uint8_t qos_channel_survey_role_available:1; /**< If set, the Quality of Service (QoS) channel survey module is available to the + application using @ref sd_ble_gap_qos_channel_survey_start. */ } ble_gap_cfg_role_count_t; /** * @brief Device name and its properties, set with @ref sd_ble_cfg_set. * - * @note If the device name is not configured, the default device name will be @ref - * BLE_GAP_DEVNAME_DEFAULT, the maximum device name length will be @ref - * BLE_GAP_DEVNAME_DEFAULT_LEN, vloc will be set to @ref BLE_GATTS_VLOC_STACK and the device name + * @note If the device name is not configured, the default device name will be + * @ref BLE_GAP_DEVNAME_DEFAULT, the maximum device name length will be + * @ref BLE_GAP_DEVNAME_DEFAULT_LEN, vloc will be set to @ref BLE_GATTS_VLOC_STACK and the device name * will have no write access. * * @note If @ref max_len is more than @ref BLE_GAP_DEVNAME_DEFAULT_LEN and vloc is set to @ref BLE_GATTS_VLOC_STACK, @@ -1076,24 +1462,26 @@ typedef union /**@brief Channel Map option. - * Used with @ref sd_ble_opt_get to get the current channel map - * or @ref sd_ble_opt_set to set a new channel map. When setting the - * channel map, it applies to all current and future connections. When getting the - * current channel map, it applies to a single connection and the connection handle - * must be supplied. * - * @note Setting the channel map may take some time, depending on connection parameters. - * The time taken may be different for each connection and the get operation will - * return the previous channel map until the new one has taken effect. + * @details Used with @ref sd_ble_opt_get to get the current channel map + * or @ref sd_ble_opt_set to set a new channel map. When setting the + * channel map, it applies to all current and future connections. When getting the + * current channel map, it applies to a single connection and the connection handle + * must be supplied. * - * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. - * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. + * @note Setting the channel map may take some time, depending on connection parameters. + * The time taken may be different for each connection and the get operation will + * return the previous channel map until the new one has taken effect. + * + * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. + * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. * * @retval ::NRF_SUCCESS Get or set successful. + * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: + * - Less then two bits in @ref ch_map are set. + * - Bits for primary advertising channels (37-39) are set. * @retval ::NRF_ERROR_BUSY Channel map was set again before enough time had passed. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied for get. - * @retval ::NRF_ERROR_NOT_SUPPORTED Returned by sd_ble_opt_set in peripheral-only SoftDevices. * */ typedef struct @@ -1105,21 +1493,21 @@ typedef struct /**@brief Local connection latency option. * - * Local connection latency is a feature which enables the slave to improve - * current consumption by ignoring the slave latency set by the peer. The - * local connection latency can only be set to a multiple of the slave latency, - * and cannot be longer than half of the supervision timeout. + * @details Local connection latency is a feature which enables the slave to improve + * current consumption by ignoring the slave latency set by the peer. The + * local connection latency can only be set to a multiple of the slave latency, + * and cannot be longer than half of the supervision timeout. * - * Used with @ref sd_ble_opt_set to set the local connection latency. The - * @ref sd_ble_opt_get is not supported for this option, but the actual - * local connection latency (unless set to NULL) is set as a return parameter - * when setting the option. + * @details Used with @ref sd_ble_opt_set to set the local connection latency. The + * @ref sd_ble_opt_get is not supported for this option, but the actual + * local connection latency (unless set to NULL) is set as a return parameter + * when setting the option. * - * @note The latency set will be truncated down to the closest slave latency event - * multiple, or the nearest multiple before half of the supervision timeout. + * @note The latency set will be truncated down to the closest slave latency event + * multiple, or the nearest multiple before half of the supervision timeout. * - * @note The local connection latency is disabled by default, and needs to be enabled for new - * connections and whenever the connection is updated. + * @note The local connection latency is disabled by default, and needs to be enabled for new + * connections and whenever the connection is updated. * * @retval ::NRF_SUCCESS Set successfully. * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. @@ -1134,8 +1522,9 @@ typedef struct /**@brief Disable slave latency * - * Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. - * When disabled, the peripheral will ignore the slave_latency set by the central. + * @details Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection + * (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. When disabled, the + * peripheral will ignore the slave_latency set by the central. * * @note Shall only be called on peripheral links. * @@ -1151,13 +1540,13 @@ typedef struct /**@brief Passkey Option. * - * Structure containing the passkey to be used during pairing. This can be used with @ref - * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication - * instead of generating a random one. + * @details Structure containing the passkey to be used during pairing. This can be used with @ref + * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication + * instead of generating a random one. * - * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. + * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. * - * @note @ref sd_ble_opt_get is not supported for this option. + * @note @ref sd_ble_opt_get is not supported for this option. * */ typedef struct @@ -1166,31 +1555,17 @@ typedef struct } ble_gap_opt_passkey_t; -/**@brief Scan request report option. - * - * This can be used with @ref sd_ble_opt_set to make the SoftDevice send - * @ref BLE_GAP_EVT_SCAN_REQ_REPORT events. - * - * @note Due to the limited space reserved for scan request report events, - * not all received scan requests will be reported. - * - * @note If whitelisting is used, only whitelisted requests are reported. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_STATE When advertising is ongoing while the option is set. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable scan request reports. */ -} ble_gap_opt_scan_req_report_t; - /**@brief Compatibility mode 1 option. * - * This can be used with @ref sd_ble_opt_set to enable and disable - * compatibility mode 1. Compatibility mode 1 is disabled by default. + * @details This can be used with @ref sd_ble_opt_set to enable and disable + * compatibility mode 1. Compatibility mode 1 is disabled by default. * - * @note Compatibility mode 1 enables interoperability with devices that do not support - * a value of 0 for the WinOffset parameter in the Link Layer CONNECT_REQ packet. + * @note Compatibility mode 1 enables interoperability with devices that do not support a value of + * 0 for the WinOffset parameter in the Link Layer CONNECT_IND packet. This applies to a + * limited set of legacy peripheral devices from another vendor. Enabling this compatibility + * mode will only have an effect if the local device will act as a central device and + * initiate a connection to a peripheral device. In that case it may lead to the connection + * creation taking up to one connection interval longer to complete for all connections. * * @retval ::NRF_SUCCESS Set successfully. * @retval ::NRF_ERROR_INVALID_STATE When connection creation is ongoing while mode 1 is set. @@ -1200,37 +1575,21 @@ typedef struct uint8_t enable : 1; /**< Enable compatibility mode 1.*/ } ble_gap_opt_compat_mode_1_t; -/**@brief Compatibility mode 2 option. - * - * This can be used with @ref sd_ble_opt_set to enable compatibility mode 2. - * Compatibility mode 2 is disabled by default. - * - * @note Compatibility mode 2 enables interoperability with devices that initiate Feature exchange - * and version exchange procedure in parallel. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_PARAM if enable bit is not set to 1. Currently only enabling is supported. - * @retval ::NRF_ERROR_INVALID_STATE When any role is running while mode 2 is set. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable compatibility mode 2.*/ -} ble_gap_opt_compat_mode_2_t; - /**@brief Authenticated payload timeout option. * - * This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other than the default of 8 minutes. + * @details This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other + * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. * - * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated - * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted - * link. + * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated + * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted + * link. * - * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance - * to reset the timer. In addition the stack will try to prioritize running of LE ping over other - * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects - * on other activities, it is recommended to use high timeout values. - * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). + * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance + * to reset the timer. In addition the stack will try to prioritize running of LE ping over other + * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects + * on other activities, it is recommended to use high timeout values. + * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). * * @retval ::NRF_SUCCESS Set successfully. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. auth_payload_timeout was outside of allowed range. @@ -1239,54 +1598,17 @@ typedef struct typedef struct { uint16_t conn_handle; /**< Connection Handle */ - uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit. Maximum is 48 000 (=480 000 ms =8 min). Minimum is 1 (=10 ms). */ + uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit, see @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT. */ } ble_gap_opt_auth_payload_timeout_t; -/**@brief Preferred PHY option - * - * @details This can be used with @ref sd_ble_opt_set to change the preferred PHYs. Before this function is called the PHYs - * for peer initiated PHY Update procedure is @ref BLE_GAP_PHY_1MBPS. If @ref ble_gap_opt_preferred_phys_t::tx_phys or - * @ref ble_gap_opt_preferred_phys_t::rx_phys is 0, then the stack will select PHYs based on the peer requirements on that specific direction. - * - * @note The preferred PHYs are only valid for newly created connections after this option is called. If the PHYs should be - * changed for an existing link the @ref sd_ble_gap_phy_request would have to be called, and that would try to update the - * PHYs for the given link. - * - * @note tx_phys and rx_phys are bitfields, to indicate multiple preferred PHYs for each direction they can be ORed together. - * @code - * tx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; - * rx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; - * @endcode - * - * @events - * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update if initiated by peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_PHY_REQUEST} - * @mmsc{@ref BLE_GAP_PERIPHERAL_PHY_REQUEST} - * @endmscs - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - */ -typedef struct -{ - uint8_t tx_phys; /**< Preferred transmit PHYs, see @ref BLE_GAP_PHYS. */ - uint8_t rx_phys; /**< Preferred receive PHYs, see @ref BLE_GAP_PHYS. */ -} ble_gap_opt_preferred_phys_t; - /**@brief Option structure for GAP options. */ typedef union { ble_gap_opt_ch_map_t ch_map; /**< Parameters for the Channel Map option. */ ble_gap_opt_local_conn_latency_t local_conn_latency; /**< Parameters for the Local connection latency option */ ble_gap_opt_passkey_t passkey; /**< Parameters for the Passkey option.*/ - ble_gap_opt_scan_req_report_t scan_req_report; /**< Parameters for the scan request report option.*/ ble_gap_opt_compat_mode_1_t compat_mode_1; /**< Parameters for the compatibility mode 1 option.*/ - ble_gap_opt_compat_mode_2_t compat_mode_2; /**< Parameters for the compatibility mode 2 option.*/ ble_gap_opt_auth_payload_timeout_t auth_payload_timeout; /**< Parameters for the authenticated payload timeout option.*/ - ble_gap_opt_preferred_phys_t preferred_phys; /**< Parameters for the preferred PHYs option. */ ble_gap_opt_slave_latency_disable_t slave_latency_disable; /**< Parameters for the Disable slave latency option */ } ble_gap_opt_t; /**@} */ @@ -1299,7 +1621,8 @@ typedef union * * The local Bluetooth identity address is the address that identifies this device to other peers. * The address type must be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC. - * The identity address cannot be changed while roles are running. + * + * @note The identity address cannot be changed while advertising, scanning or creating a connection. * * @note This address will be distributed to the peer during bonding. * If the address changes, the address stored in the peer device will not be valid and the ability to @@ -1319,7 +1642,8 @@ typedef union * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address. * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_STATE The identity address cannot be changed while the roles are running. + * @retval ::NRF_ERROR_INVALID_STATE The identity address cannot be changed while advertising, + * scanning or creating a connection. */ SVCALL(SD_BLE_GAP_ADDR_SET, uint32_t, sd_ble_gap_addr_set(ble_gap_addr_t const *p_addr)); @@ -1396,7 +1720,7 @@ SVCALL(SD_BLE_GAP_DEVICE_IDENTITIES_SET, uint32_t, sd_ble_gap_device_identities_ /**@brief Set privacy settings. * - * @note Privacy settings cannot be set while BLE roles are running. + * @note Privacy settings cannot be changed while advertising, scanning or creating a connection. * * @param[in] p_privacy_params Privacy settings. * @@ -1412,16 +1736,18 @@ SVCALL(SD_BLE_GAP_DEVICE_IDENTITIES_SET, uint32_t, sd_ble_gap_device_identities_ * @retval ::NRF_ERROR_INVALID_ADDR The pointer to privacy settings is NULL or invalid. * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. * @retval ::NRF_ERROR_INVALID_PARAM Out of range parameters are provided. - * @retval ::NRF_ERROR_INVALID_STATE Privacy settings cannot be changed while BLE roles using privacy are enabled. + * @retval ::NRF_ERROR_INVALID_STATE Privacy settings cannot be changed while advertising, scanning + * or creating a connection. */ SVCALL(SD_BLE_GAP_PRIVACY_SET, uint32_t, sd_ble_gap_privacy_set(ble_gap_privacy_params_t const *p_privacy_params)); /**@brief Get privacy settings. * - * @note The privacy settings returned include the current device irk as well. + * @note ::ble_gap_privacy_params_t::p_device_irk must be initialized to NULL or a valid address before this function is called. + * If it is initialized to a valid address, the address pointed to will contain the current device IRK on return. * - * @param[in] p_privacy_params Privacy settings. + * @param[in,out] p_privacy_params Privacy settings. * * @retval ::NRF_SUCCESS Privacy settings read. * @retval ::NRF_ERROR_INVALID_ADDR The pointer given for returning the privacy settings may be NULL or invalid. @@ -1430,50 +1756,61 @@ SVCALL(SD_BLE_GAP_PRIVACY_SET, uint32_t, sd_ble_gap_privacy_set(ble_gap_privacy_ SVCALL(SD_BLE_GAP_PRIVACY_GET, uint32_t, sd_ble_gap_privacy_get(ble_gap_privacy_params_t *p_privacy_params)); -/**@brief Set, clear or update advertising and scan response data. +/**@brief Configure an advertising set. Set, clear or update advertising and scan response data. * * @note The format of the advertising data will be checked by this call to ensure interoperability. * Limitations imposed by this API call to the data provided include having a flags data type in the scan response data and * duplicating the local name in the advertising data and scan response data. * - * @note To clear the advertising data and set it to a 0-length packet, simply provide a valid pointer (p_data/p_sr_data) with its corresponding - * length (dlen/srdlen) set to 0. - * - * @note The call will fail if p_data and p_sr_data are both NULL since this would have no effect. + * @note In order to update advertising data while advertising, new advertising buffers must be provided. * * @mscs * @mmsc{@ref BLE_GAP_ADV_MSC} * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * - * @param[in] p_data Raw data to be placed in advertising packet. If NULL, no changes are made to the current advertising packet data. - * @param[in] dlen Data length for p_data. Max size: @ref BLE_GAP_ADV_MAX_SIZE octets. Should be 0 if p_data is NULL, can be 0 if p_data is not NULL. - * @param[in] p_sr_data Raw data to be placed in scan response packet. If NULL, no changes are made to the current scan response packet data. - * @param[in] srdlen Data length for p_sr_data. Max size: @ref BLE_GAP_ADV_MAX_SIZE octets. Should be 0 if p_sr_data is NULL, can be 0 if p_data is not NULL. + * @param[in,out] p_adv_handle Provide a pointer to a handle containing @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to configure + * a new advertising set. On success, a new handle is then returned through the pointer. + * Provide a pointer to an existing advertising handle to configure an existing advertising set. + * @param[in] p_adv_data Advertising data. If set to NULL, no advertising data will be used. See @ref ble_gap_adv_data_t. + * @param[in] p_adv_params Advertising parameters. When this function is used to update advertising data while advertising, + * this parameter must be NULL. See @ref ble_gap_adv_params_t. * - * @retval ::NRF_SUCCESS Advertising data successfully updated or cleared. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, both p_data and p_sr_data cannot be NULL. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. - * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied, check the advertising data format specification. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data type. + * @retval ::NRF_SUCCESS Advertising set successfully configured. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: + * - Invalid advertising data configuration specified. See @ref ble_gap_adv_data_t. + * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. + * - Use of whitelist requested but whitelist has not been set, + * see @ref sd_ble_gap_whitelist_set. + * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR ble_gap_adv_params_t::p_peer_addr is invalid. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. + * - It is invalid to provide non-NULL advertising set parameters while advertising. + * - It is invalid to provide the same data buffers while advertising. To update + * advertising data, provide new advertising buffers. + * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE The provided advertising handle was not found. Use @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to + * configure a new advertising handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. + * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied. Check the advertising data format specification + * given in Bluetooth Specification Version 5.0, Volume 3, Part C, Chapter 11. + * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data length or advertising parameter configuration. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to configure a new advertising handle. Update an + * existing advertising handle instead. * @retval ::BLE_ERROR_GAP_UUID_LIST_MISMATCH Invalid UUID list supplied. */ -SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const *p_data, uint8_t dlen, uint8_t const *p_sr_data, uint8_t srdlen)); +SVCALL(SD_BLE_GAP_ADV_SET_CONFIGURE, uint32_t, sd_ble_gap_adv_set_configure(uint8_t *p_adv_handle, ble_gap_adv_data_t const *p_adv_data, ble_gap_adv_params_t const *p_adv_params)); /**@brief Start advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). * - * @note An application can start an advertising procedure for broadcasting purposes while a connection - * is active. After a @ref BLE_GAP_EVT_CONNECTED event is received, this function may therefore - * be called to start a broadcast advertising procedure. The advertising procedure - * cannot however be connectable (it must be of type @ref BLE_GAP_ADV_TYPE_ADV_SCAN_IND or - * @ref BLE_GAP_ADV_TYPE_ADV_NONCONN_IND). @note Only one advertiser may be active at any time. + * @note Only one advertiser may be active at any time. * * @events * @event{@ref BLE_GAP_EVT_CONNECTED, Generated after connection has been established through connectable advertising.} - * @event{@ref BLE_GAP_EVT_TIMEOUT, Advertisement has timed out.} + * @event{@ref BLE_GAP_EVT_ADV_SET_TERMINATED, Advertising set has terminated.} + * @event{@ref BLE_GAP_EVT_SCAN_REQ_REPORT, A scan request was received.} * @endevents * * @mscs @@ -1483,22 +1820,30 @@ SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * - * @param[in] p_adv_params Pointer to advertising parameters structure. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. + * @param[in] adv_handle Advertising handle to advertise on, received from @ref sd_ble_gap_adv_set_configure. + * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or + * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. For non-connectable + * advertising, this is ignored. * - * @retval ::NRF_SUCCESS The BLE stack has started advertising. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check the accepted ranges and limits. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Bluetooth address supplied. - * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Observer) and try again + * @retval ::NRF_SUCCESS The BLE stack has started advertising. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. adv_handle is not configured or already advertising. + * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. Configure a new adveriting handle with @ref sd_ble_gap_adv_set_configure. + * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied: + * - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t. + * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. + * @retval ::NRF_ERROR_RESOURCES Either: + * - adv_handle is configured with connectable advertising, but the event_length parameter + * associated with conn_cfg_tag is too small to be able to establish a connection on + * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. + * - Not enough BLE role slots available. + Stop one or more currently active roles (Central, Peripheral, Broadcaster or Observer) and try again. + * - p_adv_params is configured with connectable advertising, but the event_length parameter + * associated with conn_cfg_tag is too small to be able to establish a connection on + * the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length. */ -SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(ble_gap_adv_params_t const *p_adv_params, uint8_t conn_cfg_tag)); +SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(uint8_t adv_handle, uint8_t conn_cfg_tag)); /**@brief Stop advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). @@ -1508,10 +1853,13 @@ SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(ble_gap_adv_params_t * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * + * @param[in] adv_handle The advertising handle that should stop advertising. + * * @retval ::NRF_SUCCESS The BLE stack has stopped advertising. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation (most probably not in advertising state). + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Invalid advertising handle. + * @retval ::NRF_ERROR_INVALID_STATE The advertising handle is not advertising. */ -SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(void)); +SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(uint8_t adv_handle)); @@ -1545,7 +1893,7 @@ SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(void)); * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_BUSY Procedure already in progress or not allowed at this time, process pending events and wait for pending procedures to complete and retry. + * @retval ::NRF_ERROR_BUSY Procedure already in progress, wait for pending procedures to complete and retry. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. */ @@ -1578,15 +1926,27 @@ SVCALL(SD_BLE_GAP_DISCONNECT, uint32_t, sd_ble_gap_disconnect(uint16_t conn_hand /**@brief Set the radio's transmit power. * - * @param[in] tx_power Radio transmit power in dBm (accepted values are -40, -20, -16, -12, -8, -4, 0, 2, 3, 4, 5, 6, 7, 8 and 9 dBm). + * @param[in] role The role to set the transmit power for, see @ref BLE_GAP_TX_POWER_ROLES for + * possible roles. + * @param[in] handle The handle parameter is interpreted depending on role: + * - If role is @ref BLE_GAP_TX_POWER_ROLE_CONN, this value is the specific connection handle. + * - If role is @ref BLE_GAP_TX_POWER_ROLE_ADV, the advertising set identified with the advertising handle, + * will use the specified transmit power, and include it in the advertising packet headers if + * @ref ble_gap_adv_properties_t::include_tx_power set. + * - For all other roles handle is ignored. + * @param[in] tx_power Radio transmit power in dBm (see note for accepted values). * - * @note The -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +2dBm, +3dBm, +4dBm, +5dBm, +6dBm, +7dBm, +8dBm and +9dBm settings are available on nRF52840 series ICs. - * @note The -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +3dBm and +4dBm settings are available on nRF52 series ICs. + * @note Supported tx_power values: -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +2dBm, +3dBm, +4dBm, +5dBm, +6dBm, +7dBm and +8dBm. + * @note The initiator will have the same transmit power as the scanner. + * @note When a connection is created it will inherit the transmit power from the initiator or + * advertiser leading to the connection. * * @retval ::NRF_SUCCESS Successfully changed the transmit power. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. */ -SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(int8_t tx_power)); +SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(uint8_t role, uint16_t handle, int8_t tx_power)); /**@brief Set GAP Appearance value. @@ -1707,7 +2067,6 @@ SVCALL(SD_BLE_GAP_DEVICE_NAME_GET, uint32_t, sd_ble_gap_device_name_get(uint8_t * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. * @retval ::NRF_ERROR_NO_MEM The maximum number of authentication procedures that can run in parallel for the given role is reached. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. @@ -1766,6 +2125,7 @@ SVCALL(SD_BLE_GAP_AUTHENTICATE, uint32_t, sd_ble_gap_authenticate(uint16_t conn_ * * @retval ::NRF_SUCCESS Successfully accepted security parameter from the application. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. @@ -1807,6 +2167,7 @@ SVCALL(SD_BLE_GAP_SEC_PARAMS_REPLY, uint32_t, sd_ble_gap_sec_params_reply(uint16 */ SVCALL(SD_BLE_GAP_AUTH_KEY_REPLY, uint32_t, sd_ble_gap_auth_key_reply(uint16_t conn_handle, uint8_t key_type, uint8_t const *p_key)); + /**@brief Reply with an LE Secure connections DHKey. * * @details This function is only used to reply to a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. @@ -1840,9 +2201,8 @@ SVCALL(SD_BLE_GAP_AUTH_KEY_REPLY, uint32_t, sd_ble_gap_auth_key_reply(uint16_t c */ SVCALL(SD_BLE_GAP_LESC_DHKEY_REPLY, uint32_t, sd_ble_gap_lesc_dhkey_reply(uint16_t conn_handle, ble_gap_lesc_dhkey_t const *p_dhkey)); + /**@brief Notify the peer of a local keypress. - * - * @details This function can only be used when an authentication procedure using LE Secure Connection is in progress. Calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. * * @mscs * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} @@ -1860,6 +2220,7 @@ SVCALL(SD_BLE_GAP_LESC_DHKEY_REPLY, uint32_t, sd_ble_gap_lesc_dhkey_reply(uint16 */ SVCALL(SD_BLE_GAP_KEYPRESS_NOTIFY, uint32_t, sd_ble_gap_keypress_notify(uint16_t conn_handle, uint8_t kp_not)); + /**@brief Generate a set of OOB data to send to a peer out of band. * * @note The @ref ble_gap_addr_t included in the OOB data returned will be the currently active one (or, if a connection has already been established, @@ -1870,7 +2231,7 @@ SVCALL(SD_BLE_GAP_KEYPRESS_NOTIFY, uint32_t, sd_ble_gap_keypress_notify(uint16_t * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} * @endmscs * - * @param[in] conn_handle Connection handle. Can be BLE_CONN_HANDLE_INVALID if a BLE connection has not been established yet. + * @param[in] conn_handle Connection handle. Can be @ref BLE_CONN_HANDLE_INVALID if a BLE connection has not been established yet. * @param[in] p_pk_own LE Secure Connections local P-256 Public Key. * @param[out] p_oobd_own The OOB data to be sent out of band to a peer. * @@ -1908,6 +2269,7 @@ SVCALL(SD_BLE_GAP_LESC_OOB_DATA_GET, uint32_t, sd_ble_gap_lesc_oob_data_get(uint */ SVCALL(SD_BLE_GAP_LESC_OOB_DATA_SET, uint32_t, sd_ble_gap_lesc_oob_data_set(uint16_t conn_handle, ble_gap_lesc_oob_data_t const *p_oobd_own, ble_gap_lesc_oob_data_t const *p_oobd_peer)); + /**@brief Initiate GAP Encryption procedure. * * @details In the central role, this function will initiate the encryption procedure using the encryption information provided. @@ -1992,7 +2354,7 @@ SVCALL(SD_BLE_GAP_CONN_SEC_GET, uint32_t, sd_ble_gap_conn_sec_get(uint16_t conn_ * @param[in] skip_count Number of RSSI samples with a change of threshold_dbm or more before sending a new @ref BLE_GAP_EVT_RSSI_CHANGED event. * * @retval ::NRF_SUCCESS Successfully activated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress. Invalid state to perform operation. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is already ongoing. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. */ SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_handle, uint8_t threshold_dbm, uint8_t skip_count)); @@ -2011,7 +2373,7 @@ SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_hand * @param[in] conn_handle Connection handle. * * @retval ::NRF_SUCCESS Successfully deactivated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. */ SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle)); @@ -2021,24 +2383,45 @@ SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle * * @ref sd_ble_gap_rssi_start must be called to start reporting RSSI before using this function. @ref NRF_ERROR_NOT_FOUND * will be returned until RSSI was sampled for the first time after calling @ref sd_ble_gap_rssi_start. - * + * @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement. * @mscs * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} * @endmscs * * @param[in] conn_handle Connection handle. * @param[out] p_rssi Pointer to the location where the RSSI measurement shall be stored. + * @param[out] p_ch_index Pointer to the location where Channel Index for the RSSI measurement shall be stored. * * @retval ::NRF_SUCCESS Successfully read the RSSI. * @retval ::NRF_ERROR_NOT_FOUND No sample is available. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing, or disconnection in progress. + * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing. */ -SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi)); +SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi, uint8_t *p_ch_index)); -/**@brief Start scanning (GAP Discovery procedure, Observer Procedure). +/**@brief Start or continue scanning (GAP Discovery procedure, Observer Procedure). + * + * @note A call to this function will require the application to keep the memory pointed by + * p_adv_report_buffer alive until the buffer is released. The buffer is released when the scanner is stopped + * or when this function is called with another buffer. + * + * @note The scanner will automatically stop in the following cases: + * - @ref sd_ble_gap_scan_stop is called. + * - @ref sd_ble_gap_connect is called. + * - A @ref BLE_GAP_EVT_TIMEOUT with source set to @ref BLE_GAP_TIMEOUT_SRC_SCAN is received. + * - When a @ref BLE_GAP_EVT_ADV_REPORT event is received and @ref ble_gap_adv_report_type_t::status is not set to + * @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. In this case scanning is only paused to let the application + * access received data. The application must call this function to continue scanning, or call @ref sd_ble_gap_scan_stop + * to stop scanning. + * + * @note If a @ref BLE_GAP_EVT_ADV_REPORT event is received with @ref ble_gap_adv_report_type_t::status set to + * @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the scanner will continue scanning, and the application will + * receive more reports from this advertising event. The following reports will include the old and new received data. + * The application can stop the scanner from receiving more packets from this advertising event by calling this function. + * This might be useful when receiving data from extended advertising events where @ref ble_gap_evt_adv_report_t::aux_pointer + * is large. * * @events * @event{@ref BLE_GAP_EVT_ADV_REPORT, An advertising or scan response packet has been received.} @@ -2050,20 +2433,33 @@ SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} * @endmscs * - * @param[in] p_scan_params Pointer to scan parameters structure. + * @param[in] p_scan_params Pointer to scan parameters structure. When this function is used to continue + * scanning, this parameter must be NULL. + * @param[in] p_adv_report_buffer Pointer to buffer used to store incoming advertising data. + * The memory pointed to should be kept alive until the scanning is stopped. + * See @ref BLE_GAP_SCAN_BUFFER_SIZE for minimum and maximum buffer size. + * If the scanner receives advertising data larger than can be stored in the buffer, + * a @ref BLE_GAP_EVT_ADV_REPORT will be raised with @ref ble_gap_adv_report_type_t::status + * set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED. * * @retval ::NRF_SUCCESS Successfully initiated scanning procedure. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either: + * - Scanning is already ongoing and p_scan_params was not NULL + * - Scanning is not running and p_scan_params was NULL. + * - The scanner has timed out when this function is called to continue scanning. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. See @ref ble_gap_scan_params_t. + * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported parameters supplied. See @ref ble_gap_scan_params_t. + * @retval ::NRF_ERROR_INVALID_LENGTH The provided buffer length is invalid. See @ref BLE_GAP_SCAN_BUFFER_MIN. * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again */ -SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params)); +SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params, ble_data_t const * p_adv_report_buffer)); /**@brief Stop scanning (GAP Discovery procedure, Observer Procedure). + * + * @note The buffer provided in @ref sd_ble_gap_scan_start is released. * * @mscs * @mmsc{@ref BLE_GAP_SCAN_MSC} @@ -2071,7 +2467,7 @@ SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_param * @endmscs * * @retval ::NRF_SUCCESS Successfully stopped scanning procedure. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation (most probably not in scanning state). + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Not in the scanning state. */ SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); @@ -2087,13 +2483,12 @@ SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC} * @endmscs * - * @param[in] p_peer_addr Pointer to peer address. If the use_whitelist bit is set in @ref ble_gap_scan_params_t, then this is ignored. - * If @ref ble_gap_addr_t::addr_id_peer is set then p_peer_addr must be present in the device identity list - * see @ref sd_ble_gap_device_identities_set. + * @param[in] p_peer_addr Pointer to peer identity address. If @ref ble_gap_scan_params_t::filter_policy is set to use + * whitelist, then p_peer_addr is ignored. * @param[in] p_scan_params Pointer to scan parameters structure. * @param[in] p_conn_params Pointer to desired connection parameters. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. + * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or + * @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. * * @retval ::NRF_SUCCESS Successfully initiated connection procedure. * @retval ::NRF_ERROR_INVALID_ADDR Invalid parameter(s) pointer supplied. @@ -2101,14 +2496,17 @@ SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); * - Invalid parameter(s) in p_scan_params or p_conn_params. * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. * - Peer address was not present in the device identity list, see @ref sd_ble_gap_device_identities_set. + * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found. * @retval ::NRF_ERROR_INVALID_STATE The SoftDevice is in an invalid state to perform this operation. This may be due to an * existing locally initiated connect procedure, which must complete before initiating again. * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Peer address. * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. If another connection is being established - * wait for the corresponding @ref BLE_GAP_EVT_CONNECTED event before calling again. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again + * @retval ::NRF_ERROR_RESOURCES Either: + * - Not enough BLE role slots available. + * Stop one or more currently active roles (Central, Peripheral or Observer) and try again. + * - The event_length parameter associated with conn_cfg_tag is too small to be able to + * establish a connection on the selected @ref ble_gap_scan_params_t::scan_phys. + * Use @ref sd_ble_cfg_set to increase the event length. */ SVCALL(SD_BLE_GAP_CONNECT, uint32_t, sd_ble_gap_connect(ble_gap_addr_t const *p_peer_addr, ble_gap_scan_params_t const *p_scan_params, ble_gap_conn_params_t const *p_conn_params, uint8_t conn_cfg_tag)); @@ -2125,27 +2523,47 @@ SVCALL(SD_BLE_GAP_CONNECT, uint32_t, sd_ble_gap_connect(ble_gap_addr_t const *p_ SVCALL(SD_BLE_GAP_CONNECT_CANCEL, uint32_t, sd_ble_gap_connect_cancel(void)); -/**@brief PHY Update Request +/**@brief Initiate or respond to a PHY Update Procedure * - * @details This function is used to request a new PHY configuration for a central or a peripheral connection. It will always generate a - * @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys - * is 0, then the stack will select PHYs based on the peer requirements on that specific direction. If the peer does not support - * the PHY Update procedure, then the resulting @ref BLE_GAP_EVT_PHY_UPDATE event will have a status different from - * @ref BLE_HCI_STATUS_CODE_SUCCESS. + * @details This function is used to initiate or respond to a PHY Update Procedure. It will always + * generate a @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. + * If this function is used to initiate a PHY Update procedure and the only option + * provided in @ref ble_gap_phys_t::tx_phys and @ref ble_gap_phys_t::rx_phys is the + * currently active PHYs in the respective directions, the SoftDevice will generate a + * @ref BLE_GAP_EVT_PHY_UPDATE with the current PHYs set and will not initiate the + * procedure in the Link Layer. * - * @note The requested PHYs does not have to be within the set of the preferred PHYs. + * If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys is @ref BLE_GAP_PHY_AUTO, + * then the stack will select PHYs based on the peer's PHY preferences and the local link + * configuration. The PHY Update procedure will for this case result in a PHY combination + * that respects the time constraints configured with @ref sd_ble_cfg_set and the current + * link layer data length. * - * @note If the @ref ble_gap_opt_preferred_phys_t have not been configured with @ref BLE_GAP_PHY_CODED, then this call might return - * @ref BLE_ERROR_BLOCKED_BY_OTHER_LINKS if there are multiple devices connected. + * When acting as a central, the SoftDevice will select the fastest common PHY in each direction. * + * If the peer does not support the PHY Update Procedure, then the resulting + * @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to + * @ref BLE_HCI_UNSUPPORTED_REMOTE_FEATURE. + * + * If the PHY procedure was rejected by the peer due to a procedure collision, the status + * will be @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or + * @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION. + * If the peer responds to the PHY Update procedure with invalid parameters, the status + * will be @ref BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS. + * If the PHY procedure was rejected by the peer for a different reason, the status will + * contain the reason as specified by the peer. + * + * @note @ref BLE_GAP_PHY_CODED is only supported as an experimental feature in this SoftDevice. + * When this function is used to reply to a PHY Update, depending on the peers preferences, + * @ref BLE_GAP_PHY_AUTO might result in the PHY to be changed to @ref BLE_GAP_PHY_CODED. * * @events - * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update procedure procedure.} + * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update Procedure.} * @endevents * * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_PHY_REQUEST} - * @mmsc{@ref BLE_GAP_PERIPHERAL_PHY_REQUEST} + * @mmsc{@ref BLE_GAP_CENTRAL_PHY_UPDATE} + * @mmsc{@ref BLE_GAP_PERIPHERAL_PHY_UPDATE} * @endmscs * * @param[in] conn_handle Connection handle to indicate the connection for which the PHY Update is requested. @@ -2154,18 +2572,18 @@ SVCALL(SD_BLE_GAP_CONNECT_CANCEL, uint32_t, sd_ble_gap_connect_cancel(void)); * @retval ::NRF_SUCCESS Successfully requested a PHY Update. * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Unsupported PHYs supplied to the call. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_BLOCKED_BY_OTHER_LINKS Other connections may block the scheduling of the current link. + * @retval ::NRF_ERROR_RESOURCES The connection event length configured for this link is not sufficient for the combination of + * @ref ble_gap_phys_t::tx_phys, @ref ble_gap_phys_t::rx_phys, and @ref ble_gap_data_length_params_t. + * The connection event length is configured with @ref BLE_CONN_CFG_GAP using @ref sd_ble_cfg_set. * @retval ::NRF_ERROR_BUSY Procedure is already in progress or not allowed at this time. Process pending events and wait for the pending procedure to complete and retry. * */ -SVCALL(SD_BLE_GAP_PHY_REQUEST, uint32_t, sd_ble_gap_phy_request(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)); +SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)); + /**@brief Initiate or respond to a Data Length Update Procedure. - * - * @note Only symmetric input parameters for the Data Length Update is supported. Only @ref - * BLE_GAP_DATA_LENGTH_AUTO for max_tx_time_us and max_rx_time_us is supported. * * @note If the application uses @ref BLE_GAP_DATA_LENGTH_AUTO for one or more members of * p_dl_params, the SoftDevice will choose the highest value supported in current @@ -2177,7 +2595,7 @@ SVCALL(SD_BLE_GAP_PHY_REQUEST, uint32_t, sd_ble_gap_phy_request(uint16_t conn_ha * the SoftDevice automatically decide the value for that member. * Set to NULL to use automatic values for all members. * @param[out] p_dl_limitation Pointer to limitation to be written when local device does not - * have enough resources to accommodate the requested Data Length + * have enough resources or does not support the requested Data Length * Update parameters. Ignored if NULL. * * @mscs @@ -2189,14 +2607,54 @@ SVCALL(SD_BLE_GAP_PHY_REQUEST, uint32_t, sd_ble_gap_phy_request(uint16_t conn_ha * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter supplied. * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED The requested parameters are not supported by the SoftDevice. - * @retval ::NRF_ERROR_RESOURCES The requested parameters can not be accommodated. Inspect - * p_dl_limitation so see where the limitation is. + * @retval ::NRF_ERROR_NOT_SUPPORTED The requested parameters are not supported by the SoftDevice. Inspect + * p_dl_limitation to see which parameter is not supported. + * @retval ::NRF_ERROR_RESOURCES The connection event length configured for this link is not sufficient for the requested parameters. + * Use @ref sd_ble_cfg_set with @ref BLE_CONN_CFG_GAP to increase the connection event length. + * Inspect p_dl_limitation to see where the limitation is. * @retval ::NRF_ERROR_BUSY Peer has already initiated a Data Length Update Procedure. Process the * pending @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST event to respond. */ SVCALL(SD_BLE_GAP_DATA_LENGTH_UPDATE, uint32_t, sd_ble_gap_data_length_update(uint16_t conn_handle, ble_gap_data_length_params_t const *p_dl_params, ble_gap_data_length_limitation_t *p_dl_limitation)); +/**@brief Start the Quality of Service (QoS) channel survey module. + * + * @details The channel survey module provides measurements of the energy levels on + * the Bluetooth Low Energy channels. When the module is enabled, @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT + * events will periodically report the measured energy levels for each channel. + * + * @note The measurements are scheduled with lower priority than other Bluetooth Low Energy roles, + * Radio Timeslot API events and Flash API events. + * + * @note The channel survey module will attempt to do measurements so that the average interval + * between measurements will be interval_us. However due to the channel survey module + * having the lowest priority of all roles and modules, this may not be possible. In that + * case fewer than expected channel survey reports may be given. + * + * @note In order to use the channel survey module, @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available + * must be set. This is done using @ref sd_ble_cfg_set. + * + * @param[in] interval_us Requested average interval for the measurements and reports. See + * @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS for valid ranges. If set + * to @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS, the channel + * survey role will be scheduled at every available opportunity. + * + * @retval ::NRF_SUCCESS The module is successfully started. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter supplied. interval_us is out of the + * allowed range. + * @retval ::NRF_ERROR_INVALID_STATE Trying to start the module when already running. + * @retval ::NRF_ERROR_RESOURCES The channel survey module is not available to the application. + * Set @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available using + * @ref sd_ble_cfg_set. + */ +SVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_START, uint32_t, sd_ble_gap_qos_channel_survey_start(uint32_t interval_us)); + +/**@brief Stop the Quality of Service (QoS) channel survey module. + * + * @retval ::NRF_SUCCESS The module is successfully stopped. + * @retval ::NRF_ERROR_INVALID_STATE Trying to stop the module when it is not running. + */ +SVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP, uint32_t, sd_ble_gap_qos_channel_survey_stop(void)); /** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gatt.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gatt.h similarity index 83% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gatt.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gatt.h index f6e7ee8563..98a7a150bf 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gatt.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gatt.h @@ -1,37 +1,39 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @@ -43,8 +45,13 @@ #ifndef BLE_GATT_H__ #define BLE_GATT_H__ -#include "ble_types.h" +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" #include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" #ifdef __cplusplus extern "C" { @@ -177,7 +184,7 @@ extern "C" { /** * @brief BLE GATT connection configuration parameters, set with @ref sd_ble_cfg_set. * - * @retval NRF_ERROR_INVALID_PARAM att_mtu is smaller than @ref BLE_GATT_ATT_MTU_DEFAULT. + * @retval ::NRF_ERROR_INVALID_PARAM att_mtu is smaller than @ref BLE_GATT_ATT_MTU_DEFAULT. */ typedef struct { diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gattc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gattc.h new file mode 100644 index 0000000000..7fb3920244 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gattc.h @@ -0,0 +1,715 @@ +/* + * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_GATTC Generic Attribute Profile (GATT) Client + @{ + @brief Definitions and prototypes for the GATT Client interface. + */ + +#ifndef BLE_GATTC_H__ +#define BLE_GATTC_H__ + +#include +#include "nrf.h" +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" +#include "ble_gatt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup BLE_GATTC_ENUMERATIONS Enumerations + * @{ */ + +/**@brief GATTC API SVC numbers. */ +enum BLE_GATTC_SVCS +{ + SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER = BLE_GATTC_SVC_BASE, /**< Primary Service Discovery. */ + SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, /**< Relationship Discovery. */ + SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, /**< Characteristic Discovery. */ + SD_BLE_GATTC_DESCRIPTORS_DISCOVER, /**< Characteristic Descriptor Discovery. */ + SD_BLE_GATTC_ATTR_INFO_DISCOVER, /**< Attribute Information Discovery. */ + SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, /**< Read Characteristic Value by UUID. */ + SD_BLE_GATTC_READ, /**< Generic read. */ + SD_BLE_GATTC_CHAR_VALUES_READ, /**< Read multiple Characteristic Values. */ + SD_BLE_GATTC_WRITE, /**< Generic write. */ + SD_BLE_GATTC_HV_CONFIRM, /**< Handle Value Confirmation. */ + SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. */ +}; + +/** + * @brief GATT Client Event IDs. + */ +enum BLE_GATTC_EVTS +{ + BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP = BLE_GATTC_EVT_BASE, /**< Primary Service Discovery Response event. \n See @ref ble_gattc_evt_prim_srvc_disc_rsp_t. */ + BLE_GATTC_EVT_REL_DISC_RSP, /**< Relationship Discovery Response event. \n See @ref ble_gattc_evt_rel_disc_rsp_t. */ + BLE_GATTC_EVT_CHAR_DISC_RSP, /**< Characteristic Discovery Response event. \n See @ref ble_gattc_evt_char_disc_rsp_t. */ + BLE_GATTC_EVT_DESC_DISC_RSP, /**< Descriptor Discovery Response event. \n See @ref ble_gattc_evt_desc_disc_rsp_t. */ + BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, /**< Attribute Information Response event. \n See @ref ble_gattc_evt_attr_info_disc_rsp_t. */ + BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP, /**< Read By UUID Response event. \n See @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t. */ + BLE_GATTC_EVT_READ_RSP, /**< Read Response event. \n See @ref ble_gattc_evt_read_rsp_t. */ + BLE_GATTC_EVT_CHAR_VALS_READ_RSP, /**< Read multiple Response event. \n See @ref ble_gattc_evt_char_vals_read_rsp_t. */ + BLE_GATTC_EVT_WRITE_RSP, /**< Write Response event. \n See @ref ble_gattc_evt_write_rsp_t. */ + BLE_GATTC_EVT_HVX, /**< Handle Value Notification or Indication event. \n Confirm indication with @ref sd_ble_gattc_hv_confirm. \n See @ref ble_gattc_evt_hvx_t. */ + BLE_GATTC_EVT_EXCHANGE_MTU_RSP, /**< Exchange MTU Response event. \n See @ref ble_gattc_evt_exchange_mtu_rsp_t. */ + BLE_GATTC_EVT_TIMEOUT, /**< Timeout event. \n See @ref ble_gattc_evt_timeout_t. */ + BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE /**< Write without Response transmission complete. \n See @ref ble_gattc_evt_write_cmd_tx_complete_t. */ +}; + +/** @} */ + +/** @addtogroup BLE_GATTC_DEFINES Defines + * @{ */ + +/** @defgroup BLE_ERRORS_GATTC SVC return values specific to GATTC + * @{ */ +#define BLE_ERROR_GATTC_PROC_NOT_PERMITTED (NRF_GATTC_ERR_BASE + 0x000) /**< Procedure not Permitted. */ +/** @} */ + +/** @defgroup BLE_GATTC_ATTR_INFO_FORMAT Attribute Information Formats + * @{ */ +#define BLE_GATTC_ATTR_INFO_FORMAT_16BIT 1 /**< 16-bit Attribute Information Format. */ +#define BLE_GATTC_ATTR_INFO_FORMAT_128BIT 2 /**< 128-bit Attribute Information Format. */ +/** @} */ + +/** @defgroup BLE_GATTC_DEFAULTS GATT Client defaults + * @{ */ +#define BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Write without Response that can be queued for transmission. */ +/** @} */ + +/** @} */ + +/** @addtogroup BLE_GATTC_STRUCTURES Structures + * @{ */ + +/** + * @brief BLE GATTC connection configuration parameters, set with @ref sd_ble_cfg_set. + */ +typedef struct +{ + uint8_t write_cmd_tx_queue_size; /**< The guaranteed minimum number of Write without Response that can be queued for transmission. + The default value is @ref BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT */ +} ble_gattc_conn_cfg_t; + +/**@brief Operation Handle Range. */ +typedef struct +{ + uint16_t start_handle; /**< Start Handle. */ + uint16_t end_handle; /**< End Handle. */ +} ble_gattc_handle_range_t; + + +/**@brief GATT service. */ +typedef struct +{ + ble_uuid_t uuid; /**< Service UUID. */ + ble_gattc_handle_range_t handle_range; /**< Service Handle Range. */ +} ble_gattc_service_t; + + +/**@brief GATT include. */ +typedef struct +{ + uint16_t handle; /**< Include Handle. */ + ble_gattc_service_t included_srvc; /**< Handle of the included service. */ +} ble_gattc_include_t; + + +/**@brief GATT characteristic. */ +typedef struct +{ + ble_uuid_t uuid; /**< Characteristic UUID. */ + ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ + uint8_t char_ext_props : 1; /**< Extended properties present. */ + uint16_t handle_decl; /**< Handle of the Characteristic Declaration. */ + uint16_t handle_value; /**< Handle of the Characteristic Value. */ +} ble_gattc_char_t; + + +/**@brief GATT descriptor. */ +typedef struct +{ + uint16_t handle; /**< Descriptor Handle. */ + ble_uuid_t uuid; /**< Descriptor UUID. */ +} ble_gattc_desc_t; + + +/**@brief Write Parameters. */ +typedef struct +{ + uint8_t write_op; /**< Write Operation to be performed, see @ref BLE_GATT_WRITE_OPS. */ + uint8_t flags; /**< Flags, see @ref BLE_GATT_EXEC_WRITE_FLAGS. */ + uint16_t handle; /**< Handle to the attribute to be written. */ + uint16_t offset; /**< Offset in bytes. @note For WRITE_CMD and WRITE_REQ, offset must be 0. */ + uint16_t len; /**< Length of data in bytes. */ + uint8_t const *p_value; /**< Pointer to the value data. */ +} ble_gattc_write_params_t; + +/**@brief Attribute Information for 16-bit Attribute UUID. */ +typedef struct +{ + uint16_t handle; /**< Attribute handle. */ + ble_uuid_t uuid; /**< 16-bit Attribute UUID. */ +} ble_gattc_attr_info16_t; + +/**@brief Attribute Information for 128-bit Attribute UUID. */ +typedef struct +{ + uint16_t handle; /**< Attribute handle. */ + ble_uuid128_t uuid; /**< 128-bit Attribute UUID. */ +} ble_gattc_attr_info128_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP. */ +typedef struct +{ + uint16_t count; /**< Service count. */ + ble_gattc_service_t services[1]; /**< Service data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_prim_srvc_disc_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_REL_DISC_RSP. */ +typedef struct +{ + uint16_t count; /**< Include count. */ + ble_gattc_include_t includes[1]; /**< Include data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_rel_disc_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_DISC_RSP. */ +typedef struct +{ + uint16_t count; /**< Characteristic count. */ + ble_gattc_char_t chars[1]; /**< Characteristic data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_char_disc_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_DESC_DISC_RSP. */ +typedef struct +{ + uint16_t count; /**< Descriptor count. */ + ble_gattc_desc_t descs[1]; /**< Descriptor data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_desc_disc_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP. */ +typedef struct +{ + uint16_t count; /**< Attribute count. */ + uint8_t format; /**< Attribute information format, see @ref BLE_GATTC_ATTR_INFO_FORMAT. */ + union { + ble_gattc_attr_info16_t attr_info16[1]; /**< Attribute information for 16-bit Attribute UUID. + @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ + ble_gattc_attr_info128_t attr_info128[1]; /**< Attribute information for 128-bit Attribute UUID. + @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ + } info; /**< Attribute information union. */ +} ble_gattc_evt_attr_info_disc_rsp_t; + +/**@brief GATT read by UUID handle value pair. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ + uint8_t *p_value; /**< Pointer to the Attribute Value, length is available in @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t::value_len. */ +} ble_gattc_handle_value_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP. */ +typedef struct +{ + uint16_t count; /**< Handle-Value Pair Count. */ + uint16_t value_len; /**< Length of the value in Handle-Value(s) list. */ + uint8_t handle_value[1]; /**< Handle-Value(s) list. To iterate through the list use @ref sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter. + @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_char_val_by_uuid_read_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_READ_RSP. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ + uint16_t offset; /**< Offset of the attribute data. */ + uint16_t len; /**< Attribute data length. */ + uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_read_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP. */ +typedef struct +{ + uint16_t len; /**< Concatenated Attribute values length. */ + uint8_t values[1]; /**< Attribute values. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_char_vals_read_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_RSP. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ + uint8_t write_op; /**< Type of write operation, see @ref BLE_GATT_WRITE_OPS. */ + uint16_t offset; /**< Data offset. */ + uint16_t len; /**< Data length. */ + uint8_t data[1]; /**< Data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_write_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_HVX. */ +typedef struct +{ + uint16_t handle; /**< Handle to which the HVx operation applies. */ + uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ + uint16_t len; /**< Attribute data length. */ + uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gattc_evt_hvx_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. */ +typedef struct +{ + uint16_t server_rx_mtu; /**< Server RX MTU size. */ +} ble_gattc_evt_exchange_mtu_rsp_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_TIMEOUT. */ +typedef struct +{ + uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ +} ble_gattc_evt_timeout_t; + +/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE. */ +typedef struct +{ + uint8_t count; /**< Number of write without response transmissions completed. */ +} ble_gattc_evt_write_cmd_tx_complete_t; + +/**@brief GATTC event structure. */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle on which event occurred. */ + uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ + uint16_t error_handle; /**< In case of error: The handle causing the error. In all other cases @ref BLE_GATT_HANDLE_INVALID. */ + union + { + ble_gattc_evt_prim_srvc_disc_rsp_t prim_srvc_disc_rsp; /**< Primary Service Discovery Response Event Parameters. */ + ble_gattc_evt_rel_disc_rsp_t rel_disc_rsp; /**< Relationship Discovery Response Event Parameters. */ + ble_gattc_evt_char_disc_rsp_t char_disc_rsp; /**< Characteristic Discovery Response Event Parameters. */ + ble_gattc_evt_desc_disc_rsp_t desc_disc_rsp; /**< Descriptor Discovery Response Event Parameters. */ + ble_gattc_evt_char_val_by_uuid_read_rsp_t char_val_by_uuid_read_rsp; /**< Characteristic Value Read by UUID Response Event Parameters. */ + ble_gattc_evt_read_rsp_t read_rsp; /**< Read Response Event Parameters. */ + ble_gattc_evt_char_vals_read_rsp_t char_vals_read_rsp; /**< Characteristic Values Read Response Event Parameters. */ + ble_gattc_evt_write_rsp_t write_rsp; /**< Write Response Event Parameters. */ + ble_gattc_evt_hvx_t hvx; /**< Handle Value Notification/Indication Event Parameters. */ + ble_gattc_evt_exchange_mtu_rsp_t exchange_mtu_rsp; /**< Exchange MTU Response Event Parameters. */ + ble_gattc_evt_timeout_t timeout; /**< Timeout Event Parameters. */ + ble_gattc_evt_attr_info_disc_rsp_t attr_info_disc_rsp; /**< Attribute Information Discovery Event Parameters. */ + ble_gattc_evt_write_cmd_tx_complete_t write_cmd_tx_complete; /**< Write without Response transmission complete Event Parameters. */ + } params; /**< Event Parameters. @note Only valid if @ref gatt_status == @ref BLE_GATT_STATUS_SUCCESS. */ +} ble_gattc_evt_t; +/** @} */ + +/** @addtogroup BLE_GATTC_FUNCTIONS Functions + * @{ */ + +/**@brief Initiate or continue a GATT Primary Service Discovery procedure. + * + * @details This function initiates or resumes a Primary Service discovery procedure, starting from the supplied handle. + * If the last service has not been reached, this function must be called again with an updated start handle value to continue the search. + * + * @note If any of the discovered services have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with + * type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event. + * + * @events + * @event{@ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_PRIM_SRVC_DISC_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] start_handle Handle to start searching from. + * @param[in] p_srvc_uuid Pointer to the service UUID to be found. If it is NULL, all primary services will be returned. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Primary Service Discovery procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_services_discover(uint16_t conn_handle, uint16_t start_handle, ble_uuid_t const *p_srvc_uuid)); + + +/**@brief Initiate or continue a GATT Relationship Discovery procedure. + * + * @details This function initiates or resumes the Find Included Services sub-procedure. If the last included service has not been reached, + * this must be called again with an updated handle range to continue the search. + * + * @events + * @event{@ref BLE_GATTC_EVT_REL_DISC_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_REL_DISC_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Relationship Discovery procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); + + +/**@brief Initiate or continue a GATT Characteristic Discovery procedure. + * + * @details This function initiates or resumes a Characteristic discovery procedure. If the last Characteristic has not been reached, + * this must be called again with an updated handle range to continue the discovery. + * + * @note If any of the discovered characteristics have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with + * type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event. + * + * @events + * @event{@ref BLE_GATTC_EVT_CHAR_DISC_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_CHAR_DISC_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Characteristic Discovery procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteristics_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); + + +/**@brief Initiate or continue a GATT Characteristic Descriptor Discovery procedure. + * + * @details This function initiates or resumes a Characteristic Descriptor discovery procedure. If the last Descriptor has not been reached, + * this must be called again with an updated handle range to continue the discovery. + * + * @events + * @event{@ref BLE_GATTC_EVT_DESC_DISC_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_DESC_DISC_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_handle_range A pointer to the range of handles of the Characteristic to perform this procedure on. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Descriptor Discovery procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); + + +/**@brief Initiate or continue a GATT Read using Characteristic UUID procedure. + * + * @details This function initiates or resumes a Read using Characteristic UUID procedure. If the last Characteristic has not been reached, + * this must be called again with an updated handle range to continue the discovery. + * + * @events + * @event{@ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_READ_UUID_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_uuid Pointer to a Characteristic value UUID to read. + * @param[in] p_handle_range A pointer to the range of handles to perform this procedure on. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Read using Characteristic UUID procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle, ble_uuid_t const *p_uuid, ble_gattc_handle_range_t const *p_handle_range)); + + +/**@brief Initiate or continue a GATT Read (Long) Characteristic or Descriptor procedure. + * + * @details This function initiates or resumes a GATT Read (Long) Characteristic or Descriptor procedure. If the Characteristic or Descriptor + * to be read is longer than ATT_MTU - 1, this function must be called multiple times with appropriate offset to read the + * complete value. + * + * @events + * @event{@ref BLE_GATTC_EVT_READ_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_VALUE_READ_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] handle The handle of the attribute to be read. + * @param[in] offset Offset into the attribute value to be read. + * + * @retval ::NRF_SUCCESS Successfully started or resumed the Read (Long) procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint16_t handle, uint16_t offset)); + + +/**@brief Initiate a GATT Read Multiple Characteristic Values procedure. + * + * @details This function initiates a GATT Read Multiple Characteristic Values procedure. + * + * @events + * @event{@ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_READ_MULT_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_handles A pointer to the handle(s) of the attribute(s) to be read. + * @param[in] handle_count The number of handles in p_handles. + * + * @retval ::NRF_SUCCESS Successfully started the Read Multiple Characteristic Values procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(uint16_t conn_handle, uint16_t const *p_handles, uint16_t handle_count)); + + +/**@brief Perform a Write (Characteristic Value or Descriptor, with or without response, signed or not, long or reliable) procedure. + * + * @details This function can perform all write procedures described in GATT. + * + * @note Only one write with response procedure can be ongoing per connection at a time. + * If the application tries to write with response while another write with response procedure is ongoing, + * the function call will return @ref NRF_ERROR_BUSY. + * A @ref BLE_GATTC_EVT_WRITE_RSP event will be issued as soon as the write response arrives from the peer. + * + * @note The number of Write without Response that can be queued is configured by @ref ble_gattc_conn_cfg_t::write_cmd_tx_queue_size + * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. + * A @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event will be issued as soon as the transmission of the write without response is complete. + * + * @note The application can keep track of the available queue element count for writes without responses by following the procedure below: + * - Store initial queue element count in a variable. + * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. + * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event. + * + * @events + * @event{@ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE, Write without response transmission complete.} + * @event{@ref BLE_GATTC_EVT_WRITE_RSP, Write response received from the peer.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_VALUE_WRITE_WITHOUT_RESP_MSC} + * @mmsc{@ref BLE_GATTC_VALUE_WRITE_MSC} + * @mmsc{@ref BLE_GATTC_VALUE_LONG_WRITE_MSC} + * @mmsc{@ref BLE_GATTC_VALUE_RELIABLE_WRITE_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_write_params A pointer to a write parameters structure. + * + * @retval ::NRF_SUCCESS Successfully started the Write procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. + * @retval ::NRF_ERROR_BUSY For write with response, procedure already in progress. Wait for a @ref BLE_GATTC_EVT_WRITE_RSP event and retry. + * @retval ::NRF_ERROR_RESOURCES Too many writes without responses queued. + * Wait for a @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event and retry. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, ble_gattc_write_params_t const *p_write_params)); + + +/**@brief Send a Handle Value Confirmation to the GATT Server. + * + * @mscs + * @mmsc{@ref BLE_GATTC_HVI_MSC} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] handle The handle of the attribute in the indication. + * + * @retval ::NRF_SUCCESS Successfully queued the Handle Value Confirmation for transmission. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no Indication pending to be confirmed. + * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_handle, uint16_t handle)); + +/**@brief Discovers information about a range of attributes on a GATT server. + * + * @events + * @event{@ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, Generated when information about a range of attributes has been received.} + * @endevents + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] p_handle_range The range of handles to request information about. + * + * @retval ::NRF_SUCCESS Successfully started an attribute information discovery procedure. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * p_handle_range)); + +/**@brief Start an ATT_MTU exchange by sending an Exchange MTU Request to the server. + * + * @details The SoftDevice sets ATT_MTU to the minimum of: + * - The Client RX MTU value, and + * - The Server RX MTU value from @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. + * + * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. + * + * @events + * @event{@ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTC_MTU_EXCHANGE} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] client_rx_mtu Client RX MTU size. + * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. + * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration + used for this connection. + * - The value must be equal to Server RX MTU size given in @ref sd_ble_gatts_exchange_mtu_reply + * if an ATT_MTU exchange has already been performed in the other direction. + * + * @retval ::NRF_SUCCESS Successfully sent request to the server. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state or an ATT_MTU exchange was already requested once. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid Client RX MTU size supplied. + * @retval ::NRF_ERROR_BUSY Client procedure already in progress. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, uint32_t, sd_ble_gattc_exchange_mtu_request(uint16_t conn_handle, uint16_t client_rx_mtu)); + +/**@brief Iterate through Handle-Value(s) list in @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. + * + * @param[in] p_gattc_evt Pointer to event buffer containing @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. + * @note If the buffer contains different event, behavior is undefined. + * @param[in,out] p_iter Iterator, points to @ref ble_gattc_handle_value_t structure that will be filled in with + * the next Handle-Value pair in each iteration. If the function returns other than + * @ref NRF_SUCCESS, it will not be changed. + * - To start iteration, initialize the structure to zero. + * - To continue, pass the value from previous iteration. + * + * \code + * ble_gattc_handle_value_t iter; + * memset(&iter, 0, sizeof(ble_gattc_handle_value_t)); + * while (sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(&ble_evt.evt.gattc_evt, &iter) == NRF_SUCCESS) + * { + * app_handle = iter.handle; + * memcpy(app_value, iter.p_value, ble_evt.evt.gattc_evt.params.char_val_by_uuid_read_rsp.value_len); + * } + * \endcode + * + * @retval ::NRF_SUCCESS Successfully retrieved the next Handle-Value pair. + * @retval ::NRF_ERROR_NOT_FOUND No more Handle-Value pairs available in the list. + */ +__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter); + +/** @} */ + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION + +__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter) +{ + uint32_t value_len = p_gattc_evt->params.char_val_by_uuid_read_rsp.value_len; + uint8_t *p_first = p_gattc_evt->params.char_val_by_uuid_read_rsp.handle_value; + uint8_t *p_next = p_iter->p_value ? p_iter->p_value + value_len : p_first; + + if ((p_next - p_first) / (sizeof(uint16_t) + value_len) < p_gattc_evt->params.char_val_by_uuid_read_rsp.count) + { + p_iter->handle = (uint16_t)p_next[1] << 8 | p_next[0]; + p_iter->p_value = p_next + sizeof(uint16_t); + return NRF_SUCCESS; + } + else + { + return NRF_ERROR_NOT_FOUND; + } +} + +#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ + +#ifdef __cplusplus +} +#endif +#endif /* BLE_GATTC_H__ */ + +/** + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gatts.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gatts.h new file mode 100644 index 0000000000..e437b6e076 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_gatts.h @@ -0,0 +1,845 @@ +/* + * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_GATTS Generic Attribute Profile (GATT) Server + @{ + @brief Definitions and prototypes for the GATTS interface. + */ + +#ifndef BLE_GATTS_H__ +#define BLE_GATTS_H__ + +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_hci.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" +#include "ble_gatt.h" +#include "ble_gap.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup BLE_GATTS_ENUMERATIONS Enumerations + * @{ */ + +/** + * @brief GATTS API SVC numbers. + */ +enum BLE_GATTS_SVCS +{ + SD_BLE_GATTS_SERVICE_ADD = BLE_GATTS_SVC_BASE, /**< Add a service. */ + SD_BLE_GATTS_INCLUDE_ADD, /**< Add an included service. */ + SD_BLE_GATTS_CHARACTERISTIC_ADD, /**< Add a characteristic. */ + SD_BLE_GATTS_DESCRIPTOR_ADD, /**< Add a generic attribute. */ + SD_BLE_GATTS_VALUE_SET, /**< Set an attribute value. */ + SD_BLE_GATTS_VALUE_GET, /**< Get an attribute value. */ + SD_BLE_GATTS_HVX, /**< Handle Value Notification or Indication. */ + SD_BLE_GATTS_SERVICE_CHANGED, /**< Perform a Service Changed Indication to one or more peers. */ + SD_BLE_GATTS_RW_AUTHORIZE_REPLY, /**< Reply to an authorization request for a read or write operation on one or more attributes. */ + SD_BLE_GATTS_SYS_ATTR_SET, /**< Set the persistent system attributes for a connection. */ + SD_BLE_GATTS_SYS_ATTR_GET, /**< Retrieve the persistent system attributes. */ + SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, /**< Retrieve the first valid user handle. */ + SD_BLE_GATTS_ATTR_GET, /**< Retrieve the UUID and/or metadata of an attribute. */ + SD_BLE_GATTS_EXCHANGE_MTU_REPLY /**< Reply to Exchange MTU Request. */ +}; + +/** + * @brief GATT Server Event IDs. + */ +enum BLE_GATTS_EVTS +{ + BLE_GATTS_EVT_WRITE = BLE_GATTS_EVT_BASE, /**< Write operation performed. \n See @ref ble_gatts_evt_write_t. */ + BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST, /**< Read/Write Authorization request. \n Reply with @ref sd_ble_gatts_rw_authorize_reply. \n See @ref ble_gatts_evt_rw_authorize_request_t. */ + BLE_GATTS_EVT_SYS_ATTR_MISSING, /**< A persistent system attribute access is pending. \n Respond with @ref sd_ble_gatts_sys_attr_set. \n See @ref ble_gatts_evt_sys_attr_missing_t. */ + BLE_GATTS_EVT_HVC, /**< Handle Value Confirmation. \n See @ref ble_gatts_evt_hvc_t. */ + BLE_GATTS_EVT_SC_CONFIRM, /**< Service Changed Confirmation. \n No additional event structure applies. */ + BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. \n Reply with @ref sd_ble_gatts_exchange_mtu_reply. \n See @ref ble_gatts_evt_exchange_mtu_request_t. */ + BLE_GATTS_EVT_TIMEOUT, /**< Peer failed to respond to an ATT request in time. \n See @ref ble_gatts_evt_timeout_t. */ + BLE_GATTS_EVT_HVN_TX_COMPLETE /**< Handle Value Notification transmission complete. \n See @ref ble_gatts_evt_hvn_tx_complete_t. */ +}; + +/**@brief GATTS Configuration IDs. + * + * IDs that uniquely identify a GATTS configuration. + */ +enum BLE_GATTS_CFGS +{ + BLE_GATTS_CFG_SERVICE_CHANGED = BLE_GATTS_CFG_BASE, /**< Service changed configuration. */ + BLE_GATTS_CFG_ATTR_TAB_SIZE, /**< Attribute table size configuration. */ +}; + +/** @} */ + +/** @addtogroup BLE_GATTS_DEFINES Defines + * @{ */ + +/** @defgroup BLE_ERRORS_GATTS SVC return values specific to GATTS + * @{ */ +#define BLE_ERROR_GATTS_INVALID_ATTR_TYPE (NRF_GATTS_ERR_BASE + 0x000) /**< Invalid attribute type. */ +#define BLE_ERROR_GATTS_SYS_ATTR_MISSING (NRF_GATTS_ERR_BASE + 0x001) /**< System Attributes missing. */ +/** @} */ + +/** @defgroup BLE_GATTS_ATTR_LENS_MAX Maximum attribute lengths + * @{ */ +#define BLE_GATTS_FIX_ATTR_LEN_MAX (510) /**< Maximum length for fixed length Attribute Values. */ +#define BLE_GATTS_VAR_ATTR_LEN_MAX (512) /**< Maximum length for variable length Attribute Values. */ +/** @} */ + +/** @defgroup BLE_GATTS_SRVC_TYPES GATT Server Service Types + * @{ */ +#define BLE_GATTS_SRVC_TYPE_INVALID 0x00 /**< Invalid Service Type. */ +#define BLE_GATTS_SRVC_TYPE_PRIMARY 0x01 /**< Primary Service. */ +#define BLE_GATTS_SRVC_TYPE_SECONDARY 0x02 /**< Secondary Type. */ +/** @} */ + + +/** @defgroup BLE_GATTS_ATTR_TYPES GATT Server Attribute Types + * @{ */ +#define BLE_GATTS_ATTR_TYPE_INVALID 0x00 /**< Invalid Attribute Type. */ +#define BLE_GATTS_ATTR_TYPE_PRIM_SRVC_DECL 0x01 /**< Primary Service Declaration. */ +#define BLE_GATTS_ATTR_TYPE_SEC_SRVC_DECL 0x02 /**< Secondary Service Declaration. */ +#define BLE_GATTS_ATTR_TYPE_INC_DECL 0x03 /**< Include Declaration. */ +#define BLE_GATTS_ATTR_TYPE_CHAR_DECL 0x04 /**< Characteristic Declaration. */ +#define BLE_GATTS_ATTR_TYPE_CHAR_VAL 0x05 /**< Characteristic Value. */ +#define BLE_GATTS_ATTR_TYPE_DESC 0x06 /**< Descriptor. */ +#define BLE_GATTS_ATTR_TYPE_OTHER 0x07 /**< Other, non-GATT specific type. */ +/** @} */ + + +/** @defgroup BLE_GATTS_OPS GATT Server Operations + * @{ */ +#define BLE_GATTS_OP_INVALID 0x00 /**< Invalid Operation. */ +#define BLE_GATTS_OP_WRITE_REQ 0x01 /**< Write Request. */ +#define BLE_GATTS_OP_WRITE_CMD 0x02 /**< Write Command. */ +#define BLE_GATTS_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */ +#define BLE_GATTS_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */ +#define BLE_GATTS_OP_EXEC_WRITE_REQ_CANCEL 0x05 /**< Execute Write Request: Cancel all prepared writes. */ +#define BLE_GATTS_OP_EXEC_WRITE_REQ_NOW 0x06 /**< Execute Write Request: Immediately execute all prepared writes. */ +/** @} */ + +/** @defgroup BLE_GATTS_VLOCS GATT Value Locations + * @{ */ +#define BLE_GATTS_VLOC_INVALID 0x00 /**< Invalid Location. */ +#define BLE_GATTS_VLOC_STACK 0x01 /**< Attribute Value is located in stack memory, no user memory is required. */ +#define BLE_GATTS_VLOC_USER 0x02 /**< Attribute Value is located in user memory. This requires the user to maintain a valid buffer through the lifetime of the attribute, since the stack + will read and write directly to the memory using the pointer provided in the APIs. There are no alignment requirements for the buffer. */ +/** @} */ + +/** @defgroup BLE_GATTS_AUTHORIZE_TYPES GATT Server Authorization Types + * @{ */ +#define BLE_GATTS_AUTHORIZE_TYPE_INVALID 0x00 /**< Invalid Type. */ +#define BLE_GATTS_AUTHORIZE_TYPE_READ 0x01 /**< Authorize a Read Operation. */ +#define BLE_GATTS_AUTHORIZE_TYPE_WRITE 0x02 /**< Authorize a Write Request Operation. */ +/** @} */ + +/** @defgroup BLE_GATTS_SYS_ATTR_FLAGS System Attribute Flags + * @{ */ +#define BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS (1 << 0) /**< Restrict system attributes to system services only. */ +#define BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS (1 << 1) /**< Restrict system attributes to user services only. */ +/** @} */ + +/** @defgroup BLE_GATTS_SERVICE_CHANGED Service Changed Inclusion Values + * @{ + */ +#define BLE_GATTS_SERVICE_CHANGED_DEFAULT (1) /**< Default is to include the Service Changed characteristic in the Attribute Table. */ +/** @} */ + +/** @defgroup BLE_GATTS_ATTR_TAB_SIZE Attribute Table size + * @{ + */ +#define BLE_GATTS_ATTR_TAB_SIZE_MIN (248) /**< Minimum Attribute Table size */ +#define BLE_GATTS_ATTR_TAB_SIZE_DEFAULT (1408) /**< Default Attribute Table size. */ +/** @} */ + +/** @defgroup BLE_GATTS_DEFAULTS GATT Server defaults + * @{ + */ +#define BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Handle Value Notifications that can be queued for transmission. */ +/** @} */ + +/** @} */ + +/** @addtogroup BLE_GATTS_STRUCTURES Structures + * @{ */ + +/** + * @brief BLE GATTS connection configuration parameters, set with @ref sd_ble_cfg_set. + */ +typedef struct +{ + uint8_t hvn_tx_queue_size; /**< Minimum guaranteed number of Handle Value Notifications that can be queued for transmission. + The default value is @ref BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT */ +} ble_gatts_conn_cfg_t; + +/**@brief Attribute metadata. */ +typedef struct +{ + ble_gap_conn_sec_mode_t read_perm; /**< Read permissions. */ + ble_gap_conn_sec_mode_t write_perm; /**< Write permissions. */ + uint8_t vlen :1; /**< Variable length attribute. */ + uint8_t vloc :2; /**< Value location, see @ref BLE_GATTS_VLOCS.*/ + uint8_t rd_auth :1; /**< Read authorization and value will be requested from the application on every read operation. */ + uint8_t wr_auth :1; /**< Write authorization will be requested from the application on every Write Request operation (but not Write Command). */ +} ble_gatts_attr_md_t; + + +/**@brief GATT Attribute. */ +typedef struct +{ + ble_uuid_t const *p_uuid; /**< Pointer to the attribute UUID. */ + ble_gatts_attr_md_t const *p_attr_md; /**< Pointer to the attribute metadata structure. */ + uint16_t init_len; /**< Initial attribute value length in bytes. */ + uint16_t init_offs; /**< Initial attribute value offset in bytes. If different from zero, the first init_offs bytes of the attribute value will be left uninitialized. */ + uint16_t max_len; /**< Maximum attribute value length in bytes, see @ref BLE_GATTS_ATTR_LENS_MAX for maximum values. */ + uint8_t *p_value; /**< Pointer to the attribute data. Please note that if the @ref BLE_GATTS_VLOC_USER value location is selected in the attribute metadata, this will have to point to a buffer + that remains valid through the lifetime of the attribute. This excludes usage of automatic variables that may go out of scope or any other temporary location. + The stack may access that memory directly without the application's knowledge. For writable characteristics, this value must not be a location in flash memory.*/ +} ble_gatts_attr_t; + +/**@brief GATT Attribute Value. */ +typedef struct +{ + uint16_t len; /**< Length in bytes to be written or read. Length in bytes written or read after successful return.*/ + uint16_t offset; /**< Attribute value offset. */ + uint8_t *p_value; /**< Pointer to where value is stored or will be stored. + If value is stored in user memory, only the attribute length is updated when p_value == NULL. + Set to NULL when reading to obtain the complete length of the attribute value */ +} ble_gatts_value_t; + + +/**@brief GATT Characteristic Presentation Format. */ +typedef struct +{ + uint8_t format; /**< Format of the value, see @ref BLE_GATT_CPF_FORMATS. */ + int8_t exponent; /**< Exponent for integer data types. */ + uint16_t unit; /**< Unit from Bluetooth Assigned Numbers. */ + uint8_t name_space; /**< Namespace from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ + uint16_t desc; /**< Namespace description from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ +} ble_gatts_char_pf_t; + + +/**@brief GATT Characteristic metadata. */ +typedef struct +{ + ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ + ble_gatt_char_ext_props_t char_ext_props; /**< Characteristic Extended Properties. */ + uint8_t const *p_char_user_desc; /**< Pointer to a UTF-8 encoded string (non-NULL terminated), NULL if the descriptor is not required. */ + uint16_t char_user_desc_max_size; /**< The maximum size in bytes of the user description descriptor. */ + uint16_t char_user_desc_size; /**< The size of the user description, must be smaller or equal to char_user_desc_max_size. */ + ble_gatts_char_pf_t const *p_char_pf; /**< Pointer to a presentation format structure or NULL if the CPF descriptor is not required. */ + ble_gatts_attr_md_t const *p_user_desc_md; /**< Attribute metadata for the User Description descriptor, or NULL for default values. */ + ble_gatts_attr_md_t const *p_cccd_md; /**< Attribute metadata for the Client Characteristic Configuration Descriptor, or NULL for default values. */ + ble_gatts_attr_md_t const *p_sccd_md; /**< Attribute metadata for the Server Characteristic Configuration Descriptor, or NULL for default values. */ +} ble_gatts_char_md_t; + + +/**@brief GATT Characteristic Definition Handles. */ +typedef struct +{ + uint16_t value_handle; /**< Handle to the characteristic value. */ + uint16_t user_desc_handle; /**< Handle to the User Description descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ + uint16_t cccd_handle; /**< Handle to the Client Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ + uint16_t sccd_handle; /**< Handle to the Server Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ +} ble_gatts_char_handles_t; + + +/**@brief GATT HVx parameters. */ +typedef struct +{ + uint16_t handle; /**< Characteristic Value Handle. */ + uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ + uint16_t offset; /**< Offset within the attribute value. */ + uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after return. */ + uint8_t const *p_data; /**< Actual data content, use NULL to use the current attribute value. */ +} ble_gatts_hvx_params_t; + +/**@brief GATT Authorization parameters. */ +typedef struct +{ + uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ + uint8_t update : 1; /**< If set, data supplied in p_data will be used to update the attribute value. + Please note that for @ref BLE_GATTS_AUTHORIZE_TYPE_WRITE operations this bit must always be set, + as the data to be written needs to be stored and later provided by the application. */ + uint16_t offset; /**< Offset of the attribute value being updated. */ + uint16_t len; /**< Length in bytes of the value in p_data pointer, see @ref BLE_GATTS_ATTR_LENS_MAX. */ + uint8_t const *p_data; /**< Pointer to new value used to update the attribute value. */ +} ble_gatts_authorize_params_t; + +/**@brief GATT Read or Write Authorize Reply parameters. */ +typedef struct +{ + uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ + union { + ble_gatts_authorize_params_t read; /**< Read authorization parameters. */ + ble_gatts_authorize_params_t write; /**< Write authorization parameters. */ + } params; /**< Reply Parameters. */ +} ble_gatts_rw_authorize_reply_params_t; + +/**@brief Service Changed Inclusion configuration parameters, set with @ref sd_ble_cfg_set. */ +typedef struct +{ + uint8_t service_changed : 1; /**< If 1, include the Service Changed characteristic in the Attribute Table. Default is @ref BLE_GATTS_SERVICE_CHANGED_DEFAULT. */ +} ble_gatts_cfg_service_changed_t; + +/**@brief Attribute table size configuration parameters, set with @ref sd_ble_cfg_set. + * + * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true: + * - The specified Attribute Table size is too small. + * The minimum acceptable size is defined by @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. + * - The specified Attribute Table size is not a multiple of 4. + */ +typedef struct +{ + uint32_t attr_tab_size; /**< Attribute table size. Default is @ref BLE_GATTS_ATTR_TAB_SIZE_DEFAULT, minimum is @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. */ +} ble_gatts_cfg_attr_tab_size_t; + +/**@brief Config structure for GATTS configurations. */ +typedef union +{ + ble_gatts_cfg_service_changed_t service_changed; /**< Include service changed characteristic, cfg_id is @ref BLE_GATTS_CFG_SERVICE_CHANGED. */ + ble_gatts_cfg_attr_tab_size_t attr_tab_size; /**< Attribute table size, cfg_id is @ref BLE_GATTS_CFG_ATTR_TAB_SIZE. */ +} ble_gatts_cfg_t; + + +/**@brief Event structure for @ref BLE_GATTS_EVT_WRITE. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ + ble_uuid_t uuid; /**< Attribute UUID. */ + uint8_t op; /**< Type of write operation, see @ref BLE_GATTS_OPS. */ + uint8_t auth_required; /**< Writing operation deferred due to authorization requirement. Application may use @ref sd_ble_gatts_value_set to finalize the writing operation. */ + uint16_t offset; /**< Offset for the write operation. */ + uint16_t len; /**< Length of the received data. */ + uint8_t data[1]; /**< Received data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. + See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ +} ble_gatts_evt_write_t; + +/**@brief Event substructure for authorized read requests, see @ref ble_gatts_evt_rw_authorize_request_t. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ + ble_uuid_t uuid; /**< Attribute UUID. */ + uint16_t offset; /**< Offset for the read operation. */ +} ble_gatts_evt_read_t; + +/**@brief Event structure for @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST. */ +typedef struct +{ + uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ + union { + ble_gatts_evt_read_t read; /**< Attribute Read Parameters. */ + ble_gatts_evt_write_t write; /**< Attribute Write Parameters. */ + } request; /**< Request Parameters. */ +} ble_gatts_evt_rw_authorize_request_t; + +/**@brief Event structure for @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. */ +typedef struct +{ + uint8_t hint; /**< Hint (currently unused). */ +} ble_gatts_evt_sys_attr_missing_t; + + +/**@brief Event structure for @ref BLE_GATTS_EVT_HVC. */ +typedef struct +{ + uint16_t handle; /**< Attribute Handle. */ +} ble_gatts_evt_hvc_t; + +/**@brief Event structure for @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST. */ +typedef struct +{ + uint16_t client_rx_mtu; /**< Client RX MTU size. */ +} ble_gatts_evt_exchange_mtu_request_t; + +/**@brief Event structure for @ref BLE_GATTS_EVT_TIMEOUT. */ +typedef struct +{ + uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ +} ble_gatts_evt_timeout_t; + +/**@brief Event structure for @ref BLE_GATTS_EVT_HVN_TX_COMPLETE. */ +typedef struct +{ + uint8_t count; /**< Number of notification transmissions completed. */ +} ble_gatts_evt_hvn_tx_complete_t; + +/**@brief GATTS event structure. */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle on which the event occurred. */ + union + { + ble_gatts_evt_write_t write; /**< Write Event Parameters. */ + ble_gatts_evt_rw_authorize_request_t authorize_request; /**< Read or Write Authorize Request Parameters. */ + ble_gatts_evt_sys_attr_missing_t sys_attr_missing; /**< System attributes missing. */ + ble_gatts_evt_hvc_t hvc; /**< Handle Value Confirmation Event Parameters. */ + ble_gatts_evt_exchange_mtu_request_t exchange_mtu_request; /**< Exchange MTU Request Event Parameters. */ + ble_gatts_evt_timeout_t timeout; /**< Timeout Event. */ + ble_gatts_evt_hvn_tx_complete_t hvn_tx_complete; /**< Handle Value Notification transmission complete Event Parameters. */ + } params; /**< Event Parameters. */ +} ble_gatts_evt_t; + +/** @} */ + +/** @addtogroup BLE_GATTS_FUNCTIONS Functions + * @{ */ + +/**@brief Add a service declaration to the Attribute Table. + * + * @note Secondary Services are only relevant in the context of the entity that references them, it is therefore forbidden to + * add a secondary service declaration that is not referenced by another service later in the Attribute Table. + * + * @mscs + * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} + * @endmscs + * + * @param[in] type Toggles between primary and secondary services, see @ref BLE_GATTS_SRVC_TYPES. + * @param[in] p_uuid Pointer to service UUID. + * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. + * + * @retval ::NRF_SUCCESS Successfully added a service declaration. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, Vendor Specific UUIDs need to be present in the table. + * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + */ +SVCALL(SD_BLE_GATTS_SERVICE_ADD, uint32_t, sd_ble_gatts_service_add(uint8_t type, ble_uuid_t const *p_uuid, uint16_t *p_handle)); + + +/**@brief Add an include declaration to the Attribute Table. + * + * @note It is currently only possible to add an include declaration to the last added service (i.e. only sequential population is supported at this time). + * + * @note The included service must already be present in the Attribute Table prior to this call. + * + * @mscs + * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} + * @endmscs + * + * @param[in] service_handle Handle of the service where the included service is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. + * @param[in] inc_srvc_handle Handle of the included service. + * @param[out] p_include_handle Pointer to a 16-bit word where the assigned handle will be stored. + * + * @retval ::NRF_SUCCESS Successfully added an include declaration. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, handle values need to match previously added services. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. + * @retval ::NRF_ERROR_NOT_SUPPORTED Feature is not supported, service_handle must be that of the last added service. + * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, self inclusions are not allowed. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. + */ +SVCALL(SD_BLE_GATTS_INCLUDE_ADD, uint32_t, sd_ble_gatts_include_add(uint16_t service_handle, uint16_t inc_srvc_handle, uint16_t *p_include_handle)); + + +/**@brief Add a characteristic declaration, a characteristic value declaration and optional characteristic descriptor declarations to the Attribute Table. + * + * @note It is currently only possible to add a characteristic to the last added service (i.e. only sequential population is supported at this time). + * + * @note Several restrictions apply to the parameters, such as matching permissions between the user description descriptor and the writable auxiliaries bits, + * readable (no security) and writable (selectable) CCCDs and SCCDs and valid presentation format values. + * + * @note If no metadata is provided for the optional descriptors, their permissions will be derived from the characteristic permissions. + * + * @mscs + * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} + * @endmscs + * + * @param[in] service_handle Handle of the service where the characteristic is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. + * @param[in] p_char_md Characteristic metadata. + * @param[in] p_attr_char_value Pointer to the attribute structure corresponding to the characteristic value. + * @param[out] p_handles Pointer to the structure where the assigned handles will be stored. + * + * @retval ::NRF_SUCCESS Successfully added a characteristic. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, service handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a service context is required. + * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. + */ +SVCALL(SD_BLE_GATTS_CHARACTERISTIC_ADD, uint32_t, sd_ble_gatts_characteristic_add(uint16_t service_handle, ble_gatts_char_md_t const *p_char_md, ble_gatts_attr_t const *p_attr_char_value, ble_gatts_char_handles_t *p_handles)); + + +/**@brief Add a descriptor to the Attribute Table. + * + * @note It is currently only possible to add a descriptor to the last added characteristic (i.e. only sequential population is supported at this time). + * + * @mscs + * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} + * @endmscs + * + * @param[in] char_handle Handle of the characteristic where the descriptor is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. + * @param[in] p_attr Pointer to the attribute structure. + * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. + * + * @retval ::NRF_SUCCESS Successfully added a descriptor. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, characteristic handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. + * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a characteristic context is required. + * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. + */ +SVCALL(SD_BLE_GATTS_DESCRIPTOR_ADD, uint32_t, sd_ble_gatts_descriptor_add(uint16_t char_handle, ble_gatts_attr_t const *p_attr, uint16_t *p_handle)); + +/**@brief Set the value of a given attribute. + * + * @note Values other than system attributes can be set at any time, regardless of whether any active connections exist. + * + * @mscs + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. + * @param[in] handle Attribute handle. + * @param[in,out] p_value Attribute value information. + * + * @retval ::NRF_SUCCESS Successfully set the value of the attribute. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. + * @retval ::NRF_ERROR_FORBIDDEN Forbidden handle supplied, certain attributes are not modifiable by the application. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. + */ +SVCALL(SD_BLE_GATTS_VALUE_SET, uint32_t, sd_ble_gatts_value_set(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); + +/**@brief Get the value of a given attribute. + * + * @note If the attribute value is longer than the size of the supplied buffer, + * @ref ble_gatts_value_t::len will return the total attribute value length (excluding offset), + * and not the number of bytes actually returned in @ref ble_gatts_value_t::p_value. + * The application may use this information to allocate a suitable buffer size. + * + * @note When retrieving system attribute values with this function, the connection handle + * may refer to an already disconnected connection. Refer to the documentation of + * @ref sd_ble_gatts_sys_attr_get for further information. + * + * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. + * @param[in] handle Attribute handle. + * @param[in,out] p_value Attribute value information. + * + * @retval ::NRF_SUCCESS Successfully retrieved the value of the attribute. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid attribute offset supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. + * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. + */ +SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); + +/**@brief Notify or Indicate an attribute value. + * + * @details This function checks for the relevant Client Characteristic Configuration descriptor value to verify that the relevant operation + * (notification or indication) has been enabled by the client. It is also able to update the attribute value before issuing the PDU, so that + * the application can atomically perform a value update and a server initiated transaction with a single API call. + * + * @note The local attribute value may be updated even if an outgoing packet is not sent to the peer due to an error during execution. + * The Attribute Table has been updated if one of the following error codes is returned: @ref NRF_ERROR_INVALID_STATE, @ref NRF_ERROR_BUSY, + * @ref NRF_ERROR_FORBIDDEN, @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING and @ref NRF_ERROR_RESOURCES. + * The caller can check whether the value has been updated by looking at the contents of *(@ref ble_gatts_hvx_params_t::p_len). + * + * @note Only one indication procedure can be ongoing per connection at a time. + * If the application tries to indicate an attribute value while another indication procedure is ongoing, + * the function call will return @ref NRF_ERROR_BUSY. + * A @ref BLE_GATTS_EVT_HVC event will be issued as soon as the confirmation arrives from the peer. + * + * @note The number of Handle Value Notifications that can be queued is configured by @ref ble_gatts_conn_cfg_t::hvn_tx_queue_size + * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. + * A @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event will be issued as soon as the transmission of the notification is complete. + * + * @note The application can keep track of the available queue element count for notifications by following the procedure below: + * - Store initial queue element count in a variable. + * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. + * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event. + * + * @events + * @event{@ref BLE_GATTS_EVT_HVN_TX_COMPLETE, Notification transmission complete.} + * @event{@ref BLE_GATTS_EVT_HVC, Confirmation received from the peer.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} + * @mmsc{@ref BLE_GATTS_HVN_MSC} + * @mmsc{@ref BLE_GATTS_HVI_MSC} + * @mmsc{@ref BLE_GATTS_HVX_DISABLED_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in,out] p_hvx_params Pointer to an HVx parameters structure. If @ref ble_gatts_hvx_params_t::p_data + * contains a non-NULL pointer the attribute value will be updated with the contents + * pointed by it before sending the notification or indication. If the attribute value + * is updated, @ref ble_gatts_hvx_params_t::p_len is updated by the SoftDevice to + * contain the number of actual bytes written, else it will be set to 0. + * + * @retval ::NRF_SUCCESS Successfully queued a notification or indication for transmission, and optionally updated the attribute value. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: + * - Invalid Connection State + * - Notifications and/or indications not enabled in the CCCD + * - An ATT_MTU exchange is ongoing + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied. Only attributes added directly by the application are available to notify and indicate. + * @retval ::BLE_ERROR_GATTS_INVALID_ATTR_TYPE Invalid attribute type(s) supplied, only characteristic values may be notified and indicated. + * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. + * @retval ::NRF_ERROR_FORBIDDEN The connection's current security level is lower than the one required by the write permissions of the CCCD associated with this characteristic. + * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. + * @retval ::NRF_ERROR_BUSY For @ref BLE_GATT_HVX_INDICATION Procedure already in progress. Wait for a @ref BLE_GATTS_EVT_HVC event and retry. + * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. + * @retval ::NRF_ERROR_RESOURCES Too many notifications queued. + * Wait for a @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event and retry. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t const *p_hvx_params)); + +/**@brief Indicate the Service Changed attribute value. + * + * @details This call will send a Handle Value Indication to one or more peers connected to inform them that the Attribute + * Table layout has changed. As soon as the peer has confirmed the indication, a @ref BLE_GATTS_EVT_SC_CONFIRM event will + * be issued. + * + * @note Some of the restrictions and limitations that apply to @ref sd_ble_gatts_hvx also apply here. + * + * @events + * @event{@ref BLE_GATTS_EVT_SC_CONFIRM, Confirmation of attribute table change received from peer.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_GATTS_SC_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] start_handle Start of affected attribute handle range. + * @param[in] end_handle End of affected attribute handle range. + * + * @retval ::NRF_SUCCESS Successfully queued the Service Changed indication for transmission. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_NOT_SUPPORTED Service Changed not enabled at initialization. See @ref + * sd_ble_cfg_set and @ref ble_gatts_cfg_service_changed_t. + * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: + * - Invalid Connection State + * - Notifications and/or indications not enabled in the CCCD + * - An ATT_MTU exchange is ongoing + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied, handles must be in the range populated by the application. + * @retval ::NRF_ERROR_BUSY Procedure already in progress. + * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle)); + +/**@brief Respond to a Read/Write authorization request. + * + * @note This call should only be used as a response to a @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event issued to the application. + * + * @mscs + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} + * @mmsc{@ref BLE_GATTS_READ_REQ_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_WRITE_REQ_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_rw_authorize_reply_params Pointer to a structure with the attribute provided by the application. + * + * @note @ref ble_gatts_authorize_params_t::p_data is ignored when this function is used to respond + * to a @ref BLE_GATTS_AUTHORIZE_TYPE_READ event if @ref ble_gatts_authorize_params_t::update + * is set to 0. + * + * @retval ::NRF_SUCCESS Successfully queued a response to the peer, and in the case of a write operation, Attribute Table updated. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no authorization request pending. + * @retval ::NRF_ERROR_INVALID_PARAM Authorization op invalid, + * handle supplied does not match requested handle, + * or invalid data to be written provided by the application. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params)); + + +/**@brief Update persistent system attribute information. + * + * @details Supply information about persistent system attributes to the stack, + * previously obtained using @ref sd_ble_gatts_sys_attr_get. + * This call is only allowed for active connections, and is usually + * made immediately after a connection is established with an known bonded device, + * often as a response to a @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. + * + * p_sysattrs may point directly to the application's stored copy of the system attributes + * obtained using @ref sd_ble_gatts_sys_attr_get. + * If the pointer is NULL, the system attribute info is initialized, assuming that + * the application does not have any previously saved system attribute data for this device. + * + * @note The state of persistent system attributes is reset upon connection establishment and then remembered for its duration. + * + * @note If this call returns with an error code different from @ref NRF_SUCCESS, the storage of persistent system attributes may have been completed only partially. + * This means that the state of the attribute table is undefined, and the application should either provide a new set of attributes using this same call or + * reset the SoftDevice to return to a known state. + * + * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be modified. + * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be modified. + * + * @mscs + * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} + * @mmsc{@ref BLE_GATTS_SYS_ATTRS_UNK_PEER_MSC} + * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle. + * @param[in] p_sys_attr_data Pointer to a saved copy of system attributes supplied to the stack, or NULL. + * @param[in] len Size of data pointed by p_sys_attr_data, in octets. + * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS + * + * @retval ::NRF_SUCCESS Successfully set the system attribute information. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. + * @retval ::NRF_ERROR_INVALID_DATA Invalid data supplied, the data should be exactly the same as retrieved with @ref sd_ble_gatts_sys_attr_get. + * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. + */ +SVCALL(SD_BLE_GATTS_SYS_ATTR_SET, uint32_t, sd_ble_gatts_sys_attr_set(uint16_t conn_handle, uint8_t const *p_sys_attr_data, uint16_t len, uint32_t flags)); + + +/**@brief Retrieve persistent system attribute information from the stack. + * + * @details This call is used to retrieve information about values to be stored persistently by the application + * during the lifetime of a connection or after it has been terminated. When a new connection is established with the same bonded device, + * the system attribute information retrieved with this function should be restored using using @ref sd_ble_gatts_sys_attr_set. + * If retrieved after disconnection, the data should be read before a new connection established. The connection handle for + * the previous, now disconnected, connection will remain valid until a new one is created to allow this API call to refer to it. + * Connection handles belonging to active connections can be used as well, but care should be taken since the system attributes + * may be written to at any time by the peer during a connection's lifetime. + * + * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be returned. + * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be returned. + * + * @mscs + * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} + * @endmscs + * + * @param[in] conn_handle Connection handle of the recently terminated connection. + * @param[out] p_sys_attr_data Pointer to a buffer where updated information about system attributes will be filled in. The format of the data is described + * in @ref BLE_GATTS_SYS_ATTRS_FORMAT. NULL can be provided to obtain the length of the data. + * @param[in,out] p_len Size of application buffer if p_sys_attr_data is not NULL. Unconditionally updated to actual length of system attribute data. + * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS + * + * @retval ::NRF_SUCCESS Successfully retrieved the system attribute information. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. + * @retval ::NRF_ERROR_DATA_SIZE The system attribute information did not fit into the provided buffer. + * @retval ::NRF_ERROR_NOT_FOUND No system attributes found. + */ +SVCALL(SD_BLE_GATTS_SYS_ATTR_GET, uint32_t, sd_ble_gatts_sys_attr_get(uint16_t conn_handle, uint8_t *p_sys_attr_data, uint16_t *p_len, uint32_t flags)); + + +/**@brief Retrieve the first valid user attribute handle. + * + * @param[out] p_handle Pointer to an integer where the handle will be stored. + * + * @retval ::NRF_SUCCESS Successfully retrieved the handle. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + */ +SVCALL(SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, uint32_t, sd_ble_gatts_initial_user_handle_get(uint16_t *p_handle)); + +/**@brief Retrieve the attribute UUID and/or metadata. + * + * @param[in] handle Attribute handle + * @param[out] p_uuid UUID of the attribute. Use NULL to omit this field. + * @param[out] p_md Metadata of the attribute. Use NULL to omit this field. + * + * @retval ::NRF_SUCCESS Successfully retrieved the attribute metadata, + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. Returned when both @c p_uuid and @c p_md are NULL. + * @retval ::NRF_ERROR_NOT_FOUND Attribute was not found. + */ +SVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, ble_uuid_t * p_uuid, ble_gatts_attr_md_t * p_md)); + +/**@brief Reply to an ATT_MTU exchange request by sending an Exchange MTU Response to the client. + * + * @details This function is only used to reply to a @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST event. + * + * @details The SoftDevice sets ATT_MTU to the minimum of: + * - The Client RX MTU value from @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, and + * - The Server RX MTU value. + * + * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. + * + * @mscs + * @mmsc{@ref BLE_GATTS_MTU_EXCHANGE} + * @endmscs + * + * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. + * @param[in] server_rx_mtu Server RX MTU size. + * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. + * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration + * used for this connection. + * - The value must be equal to Client RX MTU size given in @ref sd_ble_gattc_exchange_mtu_request + * if an ATT_MTU exchange has already been performed in the other direction. + * + * @retval ::NRF_SUCCESS Successfully sent response to the client. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no ATT_MTU exchange request pending. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid Server RX MTU size supplied. + * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection. + */ +SVCALL(SD_BLE_GATTS_EXCHANGE_MTU_REPLY, uint32_t, sd_ble_gatts_exchange_mtu_reply(uint16_t conn_handle, uint16_t server_rx_mtu)); +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // BLE_GATTS_H__ + +/** + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_hci.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_hci.h similarity index 66% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_hci.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_hci.h index 21293e8efc..f0dde9a03a 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/ble_hci.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_hci.h @@ -1,37 +1,39 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @@ -88,9 +90,9 @@ extern "C" { /*0x20 Unsupported LMP Parameter Value 0x21 Role Change Not Allowed */ -#define BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT 0x22 /**< LMP Response Timeout. */ +#define BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT 0x22 /**< LMP Response Timeout. */ #define BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION 0x23 /**< LMP Error Transaction Collision/LL Procedure Collision. */ -#define BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED 0x24 /**< LMP PDU Not Allowed. */ +#define BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED 0x24 /**< LMP PDU Not Allowed. */ /*0x25 Encryption Mode Not Acceptable 0x26 Link Key Can Not be Changed 0x27 Requested QoS Not Supported @@ -104,7 +106,9 @@ extern "C" { 0x2D QoS Rejected 0x2E Channel Classification Not Supported 0x2F Insufficient Security -0x30 Parameter Out Of Mandatory Range +*/ +#define BLE_HCI_PARAMETER_OUT_OF_MANDATORY_RANGE 0x30 /**< Parameter Out Of Mandatory Range. */ +/* 0x31 Reserved 0x32 Role Switch Pending 0x33 Reserved diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_l2cap.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_l2cap.h new file mode 100644 index 0000000000..eaeb4b7d28 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_l2cap.h @@ -0,0 +1,506 @@ +/* + * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_L2CAP Logical Link Control and Adaptation Protocol (L2CAP) + @{ + @brief Definitions and prototypes for the L2CAP interface. + */ + +#ifndef BLE_L2CAP_H__ +#define BLE_L2CAP_H__ + +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_ranges.h" +#include "ble_types.h" +#include "ble_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/**@addtogroup BLE_L2CAP_TERMINOLOGY Terminology + * @{ + * @details + * + * L2CAP SDU + * - A data unit that the application can send/receive to/from a peer. + * + * L2CAP PDU + * - A data unit that is exchanged between local and remote L2CAP entities. + * It consists of L2CAP protocol control information and payload fields. + * The payload field can contain an L2CAP SDU or a part of an L2CAP SDU. + * + * L2CAP MTU + * - The maximum length of an L2CAP SDU. + * + * L2CAP MPS + * - The maximum length of an L2CAP PDU payload field. + * + * Credits + * - A value indicating the number of L2CAP PDUs that the receiver of the credit can send to the peer. + * @} */ + +/**@addtogroup BLE_L2CAP_ENUMERATIONS Enumerations + * @{ */ + +/**@brief L2CAP API SVC numbers. */ +enum BLE_L2CAP_SVCS +{ + SD_BLE_L2CAP_CH_SETUP = BLE_L2CAP_SVC_BASE + 0, /**< Set up an L2CAP channel. */ + SD_BLE_L2CAP_CH_RELEASE = BLE_L2CAP_SVC_BASE + 1, /**< Release an L2CAP channel. */ + SD_BLE_L2CAP_CH_RX = BLE_L2CAP_SVC_BASE + 2, /**< Receive an SDU on an L2CAP channel. */ + SD_BLE_L2CAP_CH_TX = BLE_L2CAP_SVC_BASE + 3, /**< Transmit an SDU on an L2CAP channel. */ + SD_BLE_L2CAP_CH_FLOW_CONTROL = BLE_L2CAP_SVC_BASE + 4, /**< Advanced SDU reception flow control. */ +}; + +/**@brief L2CAP Event IDs. */ +enum BLE_L2CAP_EVTS +{ + BLE_L2CAP_EVT_CH_SETUP_REQUEST = BLE_L2CAP_EVT_BASE + 0, /**< L2CAP Channel Setup Request event. + \n See @ref ble_l2cap_evt_ch_setup_request_t. */ + BLE_L2CAP_EVT_CH_SETUP_REFUSED = BLE_L2CAP_EVT_BASE + 1, /**< L2CAP Channel Setup Refused event. + \n See @ref ble_l2cap_evt_ch_setup_refused_t. */ + BLE_L2CAP_EVT_CH_SETUP = BLE_L2CAP_EVT_BASE + 2, /**< L2CAP Channel Setup Completed event. + \n See @ref ble_l2cap_evt_ch_setup_t. */ + BLE_L2CAP_EVT_CH_RELEASED = BLE_L2CAP_EVT_BASE + 3, /**< L2CAP Channel Released event. + \n No additional event structure applies. */ + BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED = BLE_L2CAP_EVT_BASE + 4, /**< L2CAP Channel SDU data buffer released event. + \n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */ + BLE_L2CAP_EVT_CH_CREDIT = BLE_L2CAP_EVT_BASE + 5, /**< L2CAP Channel Credit received. + \n See @ref ble_l2cap_evt_ch_credit_t. */ + BLE_L2CAP_EVT_CH_RX = BLE_L2CAP_EVT_BASE + 6, /**< L2CAP Channel SDU received. + \n See @ref ble_l2cap_evt_ch_rx_t. */ + BLE_L2CAP_EVT_CH_TX = BLE_L2CAP_EVT_BASE + 7, /**< L2CAP Channel SDU transmitted. + \n See @ref ble_l2cap_evt_ch_tx_t. */ +}; + +/** @} */ + +/**@addtogroup BLE_L2CAP_DEFINES Defines + * @{ */ + +/**@brief Maximum number of L2CAP channels per connection. */ +#define BLE_L2CAP_CH_COUNT_MAX (64) + +/**@brief Minimum L2CAP MTU, in bytes. */ +#define BLE_L2CAP_MTU_MIN (23) + +/**@brief Minimum L2CAP MPS, in bytes. */ +#define BLE_L2CAP_MPS_MIN (23) + +/**@brief Invalid CID. */ +#define BLE_L2CAP_CID_INVALID (0x0000) + +/**@brief Default number of credits for @ref sd_ble_l2cap_ch_flow_control. */ +#define BLE_L2CAP_CREDITS_DEFAULT (1) + +/**@defgroup BLE_L2CAP_CH_SETUP_REFUSED_SRCS L2CAP channel setup refused sources + * @{ */ +#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_LOCAL (0x01) /**< Local. */ +#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_REMOTE (0x02) /**< Remote. */ + /** @} */ + + /** @defgroup BLE_L2CAP_CH_STATUS_CODES L2CAP channel status codes + * @{ */ +#define BLE_L2CAP_CH_STATUS_CODE_SUCCESS (0x0000) /**< Success. */ +#define BLE_L2CAP_CH_STATUS_CODE_LE_PSM_NOT_SUPPORTED (0x0002) /**< LE_PSM not supported. */ +#define BLE_L2CAP_CH_STATUS_CODE_NO_RESOURCES (0x0004) /**< No resources available. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHENTICATION (0x0005) /**< Insufficient authentication. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHORIZATION (0x0006) /**< Insufficient authorization. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC_KEY_SIZE (0x0007) /**< Insufficient encryption key size. */ +#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC (0x0008) /**< Insufficient encryption. */ +#define BLE_L2CAP_CH_STATUS_CODE_INVALID_SCID (0x0009) /**< Invalid Source CID. */ +#define BLE_L2CAP_CH_STATUS_CODE_SCID_ALLOCATED (0x000A) /**< Source CID already allocated. */ +#define BLE_L2CAP_CH_STATUS_CODE_UNACCEPTABLE_PARAMS (0x000B) /**< Unacceptable parameters. */ +#define BLE_L2CAP_CH_STATUS_CODE_NOT_UNDERSTOOD (0x8000) /**< Command Reject received instead of LE Credit Based Connection Response. */ +#define BLE_L2CAP_CH_STATUS_CODE_TIMEOUT (0xC000) /**< Operation timed out. */ +/** @} */ + +/** @} */ + +/**@addtogroup BLE_L2CAP_STRUCTURES Structures + * @{ */ + +/** + * @brief BLE L2CAP connection configuration parameters, set with @ref sd_ble_cfg_set. + * + * @note These parameters are set per connection, so all L2CAP channels created on this connection + * will have the same parameters. + * + * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: + * - rx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. + * - tx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. + * - ch_count is greater than @ref BLE_L2CAP_CH_COUNT_MAX. + * @retval ::NRF_ERROR_NO_MEM rx_mps or tx_mps is set too high. + */ +typedef struct +{ + uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall + be able to receive on L2CAP channels on connections with this + configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ + uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall + be able to transmit on L2CAP channels on connections with this + configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ + uint8_t rx_queue_size; /**< Number of SDU data buffers that can be queued for reception per + L2CAP channel. The minimum value is one. */ + uint8_t tx_queue_size; /**< Number of SDU data buffers that can be queued for transmission + per L2CAP channel. The minimum value is one. */ + uint8_t ch_count; /**< Number of L2CAP channels the application can create per connection + with this configuration. The default value is zero, the maximum + value is @ref BLE_L2CAP_CH_COUNT_MAX. + @note if this parameter is set to zero, all other parameters in + @ref ble_l2cap_conn_cfg_t are ignored. */ +} ble_l2cap_conn_cfg_t; + +/**@brief L2CAP channel RX parameters. */ +typedef struct +{ + uint16_t rx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP shall be able to + receive on this L2CAP channel. + - Must be equal to or greater than @ref BLE_L2CAP_MTU_MIN. */ + uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall be + able to receive on this L2CAP channel. + - Must be equal to or greater than @ref BLE_L2CAP_MPS_MIN. + - Must be equal to or less than @ref ble_l2cap_conn_cfg_t::rx_mps. */ + ble_data_t sdu_buf; /**< SDU data buffer for reception. + - If @ref ble_data_t::p_data is non-NULL, initial credits are + issued to the peer. + - If @ref ble_data_t::p_data is NULL, no initial credits are + issued to the peer. */ +} ble_l2cap_ch_rx_params_t; + +/**@brief L2CAP channel setup parameters. */ +typedef struct +{ + ble_l2cap_ch_rx_params_t rx_params; /**< L2CAP channel RX parameters. */ + uint16_t le_psm; /**< LE Protocol/Service Multiplexer. Used when requesting + setup of an L2CAP channel, ignored otherwise. */ + uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES. + Used when replying to a setup request of an L2CAP + channel, ignored otherwise. */ +} ble_l2cap_ch_setup_params_t; + +/**@brief L2CAP channel TX parameters. */ +typedef struct +{ + uint16_t tx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP is able to + transmit on this L2CAP channel. */ + uint16_t peer_mps; /**< The maximum L2CAP PDU payload size, in bytes, that the peer is + able to receive on this L2CAP channel. */ + uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP is able + to transmit on this L2CAP channel. This is effective tx_mps, + selected by the SoftDevice as + MIN( @ref ble_l2cap_ch_tx_params_t::peer_mps, @ref ble_l2cap_conn_cfg_t::tx_mps ) */ + uint16_t credits; /**< Initial credits given by the peer. */ +} ble_l2cap_ch_tx_params_t; + +/**@brief L2CAP Channel Setup Request event. */ +typedef struct +{ + ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ + uint16_t le_psm; /**< LE Protocol/Service Multiplexer. */ +} ble_l2cap_evt_ch_setup_request_t; + +/**@brief L2CAP Channel Setup Refused event. */ +typedef struct +{ + uint8_t source; /**< Source, see @ref BLE_L2CAP_CH_SETUP_REFUSED_SRCS */ + uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES */ +} ble_l2cap_evt_ch_setup_refused_t; + +/**@brief L2CAP Channel Setup Completed event. */ +typedef struct +{ + ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ +} ble_l2cap_evt_ch_setup_t; + +/**@brief L2CAP Channel SDU Data Duffer Released event. */ +typedef struct +{ + ble_data_t sdu_buf; /**< Returned reception or transmission SDU data buffer. The SoftDevice + returns SDU data buffers supplied by the application, which have + not yet been returned previously via a @ref BLE_L2CAP_EVT_CH_RX or + @ref BLE_L2CAP_EVT_CH_TX event. */ +} ble_l2cap_evt_ch_sdu_buf_released_t; + +/**@brief L2CAP Channel Credit received event. */ +typedef struct +{ + uint16_t credits; /**< Additional credits given by the peer. */ +} ble_l2cap_evt_ch_credit_t; + +/**@brief L2CAP Channel received SDU event. */ +typedef struct +{ + uint16_t sdu_len; /**< Total SDU length, in bytes. */ + ble_data_t sdu_buf; /**< SDU data buffer. + @note If there is not enough space in the buffer + (sdu_buf.len < sdu_len) then the rest of the SDU will be + silently discarded by the SoftDevice. */ +} ble_l2cap_evt_ch_rx_t; + +/**@brief L2CAP Channel transmitted SDU event. */ +typedef struct +{ + ble_data_t sdu_buf; /**< SDU data buffer. */ +} ble_l2cap_evt_ch_tx_t; + +/**@brief L2CAP event structure. */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle on which the event occured. */ + uint16_t local_cid; /**< Local Channel ID of the L2CAP channel, or + @ref BLE_L2CAP_CID_INVALID if not present. */ + union + { + ble_l2cap_evt_ch_setup_request_t ch_setup_request; /**< L2CAP Channel Setup Request Event Parameters. */ + ble_l2cap_evt_ch_setup_refused_t ch_setup_refused; /**< L2CAP Channel Setup Refused Event Parameters. */ + ble_l2cap_evt_ch_setup_t ch_setup; /**< L2CAP Channel Setup Completed Event Parameters. */ + ble_l2cap_evt_ch_sdu_buf_released_t ch_sdu_buf_released;/**< L2CAP Channel SDU Data Buffer Released Event Parameters. */ + ble_l2cap_evt_ch_credit_t credit; /**< L2CAP Channel Credit Received Event Parameters. */ + ble_l2cap_evt_ch_rx_t rx; /**< L2CAP Channel SDU Received Event Parameters. */ + ble_l2cap_evt_ch_tx_t tx; /**< L2CAP Channel SDU Transmitted Event Parameters. */ + } params; /**< Event Parameters. */ +} ble_l2cap_evt_t; + +/** @} */ + +/**@addtogroup BLE_L2CAP_FUNCTIONS Functions + * @{ */ + +/**@brief Set up an L2CAP channel. + * + * @details This function is used to: + * - Request setup of an L2CAP channel: sends an LE Credit Based Connection Request packet to a peer. + * - Reply to a setup request of an L2CAP channel (if called in response to a + * @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST event): sends an LE Credit Based Connection + * Response packet to a peer. + * + * @note A call to this function will require the application to keep the SDU data buffer alive + * until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX or + * @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_SETUP, Setup successful.} + * @event{@ref BLE_L2CAP_EVT_CH_SETUP_REFUSED, Setup failed.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_SETUP_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in,out] p_local_cid Pointer to a uint16_t containing Local Channel ID of the L2CAP channel: + * - As input: @ref BLE_L2CAP_CID_INVALID when requesting setup of an L2CAP + * channel or local_cid provided in the @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST + * event when replying to a setup request of an L2CAP channel. + * - As output: local_cid for this channel. + * @param[in] p_params L2CAP channel parameters. + * + * @retval ::NRF_SUCCESS Successfully queued request or response for transmission. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. + * @retval ::NRF_ERROR_INVALID_LENGTH Supplied higher rx_mps than has been configured on this link. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (L2CAP channel already set up). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + * @retval ::NRF_ERROR_RESOURCES The limit has been reached for available L2CAP channels, + * see @ref ble_l2cap_conn_cfg_t::ch_count. + */ +SVCALL(SD_BLE_L2CAP_CH_SETUP, uint32_t, sd_ble_l2cap_ch_setup(uint16_t conn_handle, uint16_t *p_local_cid, ble_l2cap_ch_setup_params_t const *p_params)); + +/**@brief Release an L2CAP channel. + * + * @details This sends a Disconnection Request packet to a peer. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_RELEASED, Release complete.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_RELEASE_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel. + * + * @retval ::NRF_SUCCESS Successfully queued request for transmission. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for the L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + */ +SVCALL(SD_BLE_L2CAP_CH_RELEASE, uint32_t, sd_ble_l2cap_ch_release(uint16_t conn_handle, uint16_t local_cid)); + +/**@brief Receive an SDU on an L2CAP channel. + * + * @details This may issue additional credits to the peer using an LE Flow Control Credit packet. + * + * @note A call to this function will require the application to keep the memory pointed by + * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX + * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. + * + * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::rx_queue_size SDU data buffers + * for reception per L2CAP channel. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_RX, The SDU is received.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_RX_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel. + * @param[in] p_sdu_buf Pointer to the SDU data buffer. + * + * @retval ::NRF_SUCCESS Buffer accepted. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for an L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + * @retval ::NRF_ERROR_RESOURCES Too many SDU data buffers supplied. Wait for a + * @ref BLE_L2CAP_EVT_CH_RX event and retry. + */ +SVCALL(SD_BLE_L2CAP_CH_RX, uint32_t, sd_ble_l2cap_ch_rx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); + +/**@brief Transmit an SDU on an L2CAP channel. + * + * @note A call to this function will require the application to keep the memory pointed by + * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_TX + * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. + * + * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::tx_queue_size SDUs for + * transmission per L2CAP channel. + * + * @note The application can keep track of the available credits for transmission by following + * the procedure below: + * - Store initial credits given by the peer in a variable. + * (Initial credits are provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) + * - Decrement the variable, which stores the currently available credits, by + * ceiling((@ref ble_data_t::len + 2) / tx_mps) when a call to this function returns + * @ref NRF_SUCCESS. (tx_mps is provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) + * - Increment the variable, which stores the currently available credits, by additional + * credits given by the peer in a @ref BLE_L2CAP_EVT_CH_CREDIT event. + * + * @events + * @event{@ref BLE_L2CAP_EVT_CH_TX, The SDU is transmitted.} + * @endevents + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_TX_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel. + * @param[in] p_sdu_buf Pointer to the SDU data buffer. + * + * @retval ::NRF_SUCCESS Successfully queued L2CAP SDU for transmission. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for the L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + * @retval ::NRF_ERROR_DATA_SIZE Invalid SDU length supplied, must not be more than + * @ref ble_l2cap_ch_tx_params_t::tx_mtu provided in + * @ref BLE_L2CAP_EVT_CH_SETUP event. + * @retval ::NRF_ERROR_RESOURCES Too many SDUs queued for transmission. Wait for a + * @ref BLE_L2CAP_EVT_CH_TX event and retry. + */ +SVCALL(SD_BLE_L2CAP_CH_TX, uint32_t, sd_ble_l2cap_ch_tx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); + +/**@brief Advanced SDU reception flow control. + * + * @details Adjust the way the SoftDevice issues credits to the peer. + * This may issue additional credits to the peer using an LE Flow Control Credit packet. + * + * @mscs + * @mmsc{@ref BLE_L2CAP_CH_FLOW_CONTROL_MSC} + * @endmscs + * + * @param[in] conn_handle Connection Handle. + * @param[in] local_cid Local Channel ID of the L2CAP channel or @ref BLE_L2CAP_CID_INVALID to set + * the value that will be used for newly created channels. + * @param[in] credits Number of credits that the SoftDevice will make sure the peer has every + * time it starts using a new reception buffer. + * - @ref BLE_L2CAP_CREDITS_DEFAULT is the default value the SoftDevice will + * use if this function is not called. + * - If set to zero, the SoftDevice will stop issuing credits for new reception + * buffers the application provides or has provided. SDU reception that is + * currently ongoing will be allowed to complete. + * @param[out] p_credits NULL or pointer to a uint16_t. If a valid pointer is provided, it will be + * written by the SoftDevice with the number of credits that is or will be + * available to the peer. If the value written by the SoftDevice is 0 when + * credits parameter was set to 0, the peer will not be able to send more + * data until more credits are provided by calling this function again with + * credits > 0. This parameter is ignored when local_cid is set to + * @ref BLE_L2CAP_CID_INVALID. + * + * @note Application should take care when setting number of credits higher than default value. In + * this case the application must make sure that the SoftDevice always has reception buffers + * available (see @ref sd_ble_l2cap_ch_rx) for that channel. If the SoftDevice does not have + * such buffers available, packets may be NACKed on the Link Layer and all Bluetooth traffic + * on the connection handle may be stalled until the SoftDevice again has an available + * reception buffer. This applies even if the application has used this call to set the + * credits back to default, or zero. + * + * @retval ::NRF_SUCCESS Flow control parameters accepted. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is + * in progress for an L2CAP channel). + * @retval ::NRF_ERROR_NOT_FOUND CID not found. + */ +SVCALL(SD_BLE_L2CAP_CH_FLOW_CONTROL, uint32_t, sd_ble_l2cap_ch_flow_control(uint16_t conn_handle, uint16_t local_cid, uint16_t credits, uint16_t *p_credits)); + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // BLE_L2CAP_H__ + +/** + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_ranges.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_ranges.h new file mode 100644 index 0000000000..0935bca071 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_ranges.h @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_COMMON + @{ + @defgroup ble_ranges Module specific SVC, event and option number subranges + @{ + + @brief Definition of SVC, event and option number subranges for each API module. + + @note + SVCs, event and option numbers are split into subranges for each API module. + Each module receives its entire allocated range of SVC calls, whether implemented or not, + but return BLE_ERROR_NOT_SUPPORTED for unimplemented or undefined calls in its range. + + Note that the symbols BLE__SVC_LAST is the end of the allocated SVC range, + rather than the last SVC function call actually defined and implemented. + + Specific SVC, event and option values are defined in each module's ble_.h file, + which defines names of each individual SVC code based on the range start value. +*/ + +#ifndef BLE_RANGES_H__ +#define BLE_RANGES_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define BLE_SVC_BASE 0x60 /**< Common BLE SVC base. */ +#define BLE_SVC_LAST 0x6B /**< Common BLE SVC last. */ + +#define BLE_GAP_SVC_BASE 0x6C /**< GAP BLE SVC base. */ +#define BLE_GAP_SVC_LAST 0x9A /**< GAP BLE SVC last. */ + +#define BLE_GATTC_SVC_BASE 0x9B /**< GATTC BLE SVC base. */ +#define BLE_GATTC_SVC_LAST 0xA7 /**< GATTC BLE SVC last. */ + +#define BLE_GATTS_SVC_BASE 0xA8 /**< GATTS BLE SVC base. */ +#define BLE_GATTS_SVC_LAST 0xB7 /**< GATTS BLE SVC last. */ + +#define BLE_L2CAP_SVC_BASE 0xB8 /**< L2CAP BLE SVC base. */ +#define BLE_L2CAP_SVC_LAST 0xBF /**< L2CAP BLE SVC last. */ + + +#define BLE_EVT_INVALID 0x00 /**< Invalid BLE Event. */ + +#define BLE_EVT_BASE 0x01 /**< Common BLE Event base. */ +#define BLE_EVT_LAST 0x0F /**< Common BLE Event last. */ + +#define BLE_GAP_EVT_BASE 0x10 /**< GAP BLE Event base. */ +#define BLE_GAP_EVT_LAST 0x2F /**< GAP BLE Event last. */ + +#define BLE_GATTC_EVT_BASE 0x30 /**< GATTC BLE Event base. */ +#define BLE_GATTC_EVT_LAST 0x4F /**< GATTC BLE Event last. */ + +#define BLE_GATTS_EVT_BASE 0x50 /**< GATTS BLE Event base. */ +#define BLE_GATTS_EVT_LAST 0x6F /**< GATTS BLE Event last. */ + +#define BLE_L2CAP_EVT_BASE 0x70 /**< L2CAP BLE Event base. */ +#define BLE_L2CAP_EVT_LAST 0x8F /**< L2CAP BLE Event last. */ + + +#define BLE_OPT_INVALID 0x00 /**< Invalid BLE Option. */ + +#define BLE_OPT_BASE 0x01 /**< Common BLE Option base. */ +#define BLE_OPT_LAST 0x1F /**< Common BLE Option last. */ + +#define BLE_GAP_OPT_BASE 0x20 /**< GAP BLE Option base. */ +#define BLE_GAP_OPT_LAST 0x3F /**< GAP BLE Option last. */ + +#define BLE_GATT_OPT_BASE 0x40 /**< GATT BLE Option base. */ +#define BLE_GATT_OPT_LAST 0x5F /**< GATT BLE Option last. */ + +#define BLE_GATTC_OPT_BASE 0x60 /**< GATTC BLE Option base. */ +#define BLE_GATTC_OPT_LAST 0x7F /**< GATTC BLE Option last. */ + +#define BLE_GATTS_OPT_BASE 0x80 /**< GATTS BLE Option base. */ +#define BLE_GATTS_OPT_LAST 0x9F /**< GATTS BLE Option last. */ + +#define BLE_L2CAP_OPT_BASE 0xA0 /**< L2CAP BLE Option base. */ +#define BLE_L2CAP_OPT_LAST 0xBF /**< L2CAP BLE Option last. */ + + +#define BLE_CFG_INVALID 0x00 /**< Invalid BLE configuration. */ + +#define BLE_CFG_BASE 0x01 /**< Common BLE configuration base. */ +#define BLE_CFG_LAST 0x1F /**< Common BLE configuration last. */ + +#define BLE_CONN_CFG_BASE 0x20 /**< BLE connection configuration base. */ +#define BLE_CONN_CFG_LAST 0x3F /**< BLE connection configuration last. */ + +#define BLE_GAP_CFG_BASE 0x40 /**< GAP BLE configuration base. */ +#define BLE_GAP_CFG_LAST 0x5F /**< GAP BLE configuration last. */ + +#define BLE_GATT_CFG_BASE 0x60 /**< GATT BLE configuration base. */ +#define BLE_GATT_CFG_LAST 0x7F /**< GATT BLE configuration last. */ + +#define BLE_GATTC_CFG_BASE 0x80 /**< GATTC BLE configuration base. */ +#define BLE_GATTC_CFG_LAST 0x9F /**< GATTC BLE configuration last. */ + +#define BLE_GATTS_CFG_BASE 0xA0 /**< GATTS BLE configuration base. */ +#define BLE_GATTS_CFG_LAST 0xBF /**< GATTS BLE configuration last. */ + +#define BLE_L2CAP_CFG_BASE 0xC0 /**< L2CAP BLE configuration base. */ +#define BLE_L2CAP_CFG_LAST 0xDF /**< L2CAP BLE configuration last. */ + + + + + +#ifdef __cplusplus +} +#endif +#endif /* BLE_RANGES_H__ */ + +/** + @} + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_types.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_types.h similarity index 82% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_types.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_types.h index e24be0b574..88c93180c8 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_FULL/headers/ble_types.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/ble_types.h @@ -1,37 +1,39 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @@ -86,6 +88,7 @@ extern "C" { #define BLE_UUID_GAP_CHARACTERISTIC_RECONN_ADDR 0x2A03 /**< Reconnection Address Characteristic. */ #define BLE_UUID_GAP_CHARACTERISTIC_PPCP 0x2A04 /**< Peripheral Preferred Connection Parameters Characteristic. */ #define BLE_UUID_GAP_CHARACTERISTIC_CAR 0x2AA6 /**< Central Address Resolution Characteristic. */ +#define BLE_UUID_GAP_CHARACTERISTIC_RPA_ONLY 0x2AC9 /**< Resolvable Private Address Only Characteristic. */ /** @} */ @@ -192,6 +195,13 @@ typedef struct uint8_t type; /**< UUID type, see @ref BLE_UUID_TYPES. If type is @ref BLE_UUID_TYPE_UNKNOWN, the value of uuid is undefined. */ } ble_uuid_t; +/**@brief Data structure. */ +typedef struct +{ + uint8_t *p_data; /**< Pointer to the data buffer provided to/from the application. */ + uint16_t len; /**< Length of the data buffer, in bytes. */ +} ble_data_t; + /** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf52/nrf_mbr.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf52/nrf_mbr.h new file mode 100644 index 0000000000..e0c80e278c --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf52/nrf_mbr.h @@ -0,0 +1,242 @@ +/* + * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @defgroup nrf_mbr_api Master Boot Record API + @{ + + @brief APIs for updating SoftDevice and BootLoader + +*/ + +#ifndef NRF_MBR_H__ +#define NRF_MBR_H__ + +#include "nrf_svc.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup NRF_MBR_DEFINES Defines + * @{ */ + +/**@brief MBR SVC Base number. */ +#define MBR_SVC_BASE (0x18) + +/**@brief Page size in words. */ +#define MBR_PAGE_SIZE_IN_WORDS (1024) + +/** @brief The size that must be reserved for the MBR when a SoftDevice is written to flash. +This is the offset where the first byte of the SoftDevice hex file is written.*/ +#define MBR_SIZE (0x1000) + +/** @} */ + +/** @addtogroup NRF_MBR_ENUMS Enumerations + * @{ */ + +/**@brief nRF Master Boot Record API SVC numbers. */ +enum NRF_MBR_SVCS +{ + SD_MBR_COMMAND = MBR_SVC_BASE, /**< ::sd_mbr_command */ +}; + +/**@brief Possible values for ::sd_mbr_command_t.command */ +enum NRF_MBR_COMMANDS +{ + SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see ::sd_mbr_command_copy_bl_t*/ + SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ + SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD. Does not require any parameters in ::sd_mbr_command_t params.*/ + SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ + SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset. @see ::sd_mbr_command_vector_table_base_set_t*/ + SD_MBR_COMMAND_RESERVED, + SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address. @see ::sd_mbr_command_irq_forward_address_set_t*/ +}; + +/** @} */ + +/** @addtogroup NRF_MBR_TYPES Types + * @{ */ + +/**@brief This command copies part of a new SoftDevice + * + * The destination area is erased before copying. + * If dst is in the middle of a flash page, that whole flash page will be erased. + * If (dst+len) is in the middle of a flash page, that whole flash page will be erased. + * + * The user of this function is responsible for setting the BPROT registers. + * + * @retval ::NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly. + * @retval ::NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying. + */ +typedef struct +{ + uint32_t *src; /**< Pointer to the source of data to be copied.*/ + uint32_t *dst; /**< Pointer to the destination where the content is to be copied.*/ + uint32_t len; /**< Number of 32 bit words to copy. Must be a multiple of @ref MBR_PAGE_SIZE_IN_WORDS words.*/ +} sd_mbr_command_copy_sd_t; + + +/**@brief This command works like memcmp, but takes the length in words. + * + * @retval ::NRF_SUCCESS indicates that the contents of both memory blocks are equal. + * @retval ::NRF_ERROR_NULL indicates that the contents of the memory blocks are not equal. + */ +typedef struct +{ + uint32_t *ptr1; /**< Pointer to block of memory. */ + uint32_t *ptr2; /**< Pointer to block of memory. */ + uint32_t len; /**< Number of 32 bit words to compare.*/ +} sd_mbr_command_compare_t; + + +/**@brief This command copies a new BootLoader. + * + * With this command, destination of BootLoader is always the address written in + * NRF_UICR->BOOTADDR. + * + * Destination is erased by this function. + * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. + * + * This function will use the flash protect peripheral (BPROT or ACL) to protect the flash that is + * not intended to be written. + * + * On success, this function will not return. It will start the new BootLoader from reset-vector as normal. + * + * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. + * @retval ::NRF_ERROR_FORBIDDEN if NRF_UICR->BOOTADDR is not set. + * @retval ::NRF_ERROR_INVALID_LENGTH if parameters attempts to read or write outside flash area. + * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) + */ +typedef struct +{ + uint32_t *bl_src; /**< Pointer to the source of the Bootloader to be be copied.*/ + uint32_t bl_len; /**< Number of 32 bit words to copy for BootLoader. */ +} sd_mbr_command_copy_bl_t; + +/**@brief Change the address the MBR starts after a reset + * + * Once this function has been called, this address is where the MBR will start to forward + * interrupts to after a reset. + * + * To restore default forwarding this function should be called with @ref address set to 0. The + * MBR will then start forwarding interrupts to the address in NFR_UICR->BOOTADDR or to the + * SoftDevice if the BOOTADDR is not set. + * + * On success, this function will not return. It will reset the device. + * + * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. + * @retval ::NRF_ERROR_INVALID_ADDR if parameter address is outside of the flash size. + * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) + */ +typedef struct +{ + uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ +} sd_mbr_command_vector_table_base_set_t; + +/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR + * + * Unlike sd_mbr_command_vector_table_base_set_t, this function does not reset, and it does not + * change where the MBR starts after reset. + * + * @retval ::NRF_SUCCESS + */ +typedef struct +{ + uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ +} sd_mbr_command_irq_forward_address_set_t; + +/**@brief Input structure containing data used when calling ::sd_mbr_command + * + * Depending on what command value that is set, the corresponding params value type must also be + * set. See @ref NRF_MBR_COMMANDS for command types and corresponding params value type. If command + * @ref SD_MBR_COMMAND_INIT_SD is set, it is not necessary to set any values under params. + */ +typedef struct +{ + uint32_t command; /**< Type of command to be issued. See @ref NRF_MBR_COMMANDS. */ + union + { + sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ + sd_mbr_command_compare_t compare; /**< Parameters for verify.*/ + sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ + sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ + sd_mbr_command_irq_forward_address_set_t irq_forward_address_set; /**< Parameters for irq forward address set*/ + } params; /**< Command parameters. */ +} sd_mbr_command_t; + +/** @} */ + +/** @addtogroup NRF_MBR_FUNCTIONS Functions + * @{ */ + +/**@brief Issue Master Boot Record commands + * + * Commands used when updating a SoftDevice and bootloader. + * + * The @ref SD_MBR_COMMAND_COPY_BL and @ref SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires + * parameters to be retained by the MBR when resetting the IC. This is done in a separate flash + * page provided by the application. The UICR register UICR.NRFFW[1] must be set to an address + * corresponding to a page in the application flash space. This page will be cleared by the MBR and + * used to store the command before reset. When the UICR.NRFFW[1] field is set the page it refers + * to must not be used by the application. If the UICR.NRFFW[1] is set to 0xFFFFFFFF (the default) + * MBR commands which use flash will be unavailable and return @ref NRF_ERROR_NO_MEM. + * + * @param[in] param Pointer to a struct describing the command. + * + * @note For return values, see ::sd_mbr_command_copy_sd_t, ::sd_mbr_command_copy_bl_t, + * ::sd_mbr_command_compare_t, ::sd_mbr_command_vector_table_base_set_t, + * ::sd_mbr_command_irq_forward_address_set_t + * + * @retval ::NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF). + * @retval ::NRF_ERROR_INVALID_PARAM if an invalid command is given. +*/ +SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param)); + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // NRF_MBR_H__ + +/** + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_ble.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_ble.h new file mode 100644 index 0000000000..9ebb41f538 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_ble.h @@ -0,0 +1,622 @@ +/* + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup BLE_COMMON BLE SoftDevice Common + @{ + @defgroup ble_api Events, type definitions and API calls + @{ + + @brief Module independent events, type definitions and API calls for the BLE SoftDevice. + + */ + +#ifndef BLE_H__ +#define BLE_H__ + +#include +#include "nrf_svc.h" +#include "nrf_error.h" +#include "ble_err.h" +#include "ble_gap.h" +#include "ble_l2cap.h" +#include "ble_gatt.h" +#include "ble_gattc.h" +#include "ble_gatts.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup BLE_COMMON_ENUMERATIONS Enumerations + * @{ */ + +/** + * @brief Common API SVC numbers. + */ +enum BLE_COMMON_SVCS +{ + SD_BLE_ENABLE = BLE_SVC_BASE, /**< Enable and initialize the BLE stack */ + SD_BLE_EVT_GET, /**< Get an event from the pending events queue. */ + SD_BLE_UUID_VS_ADD, /**< Add a Vendor Specific UUID. */ + SD_BLE_UUID_DECODE, /**< Decode UUID bytes. */ + SD_BLE_UUID_ENCODE, /**< Encode UUID bytes. */ + SD_BLE_VERSION_GET, /**< Get the local version information (company ID, Link Layer Version, Link Layer Subversion). */ + SD_BLE_USER_MEM_REPLY, /**< User Memory Reply. */ + SD_BLE_OPT_SET, /**< Set a BLE option. */ + SD_BLE_OPT_GET, /**< Get a BLE option. */ + SD_BLE_CFG_SET, /**< Add a configuration to the BLE stack. */ +}; + +/** + * @brief BLE Module Independent Event IDs. + */ +enum BLE_COMMON_EVTS +{ + BLE_EVT_USER_MEM_REQUEST = BLE_EVT_BASE + 0, /**< User Memory request. @ref ble_evt_user_mem_request_t */ + BLE_EVT_USER_MEM_RELEASE = BLE_EVT_BASE + 1, /**< User Memory release. @ref ble_evt_user_mem_release_t */ +}; + +/**@brief BLE Connection Configuration IDs. + * + * IDs that uniquely identify a connection configuration. + */ +enum BLE_CONN_CFGS +{ + BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE + 0, /**< BLE GAP specific connection configuration. */ + BLE_CONN_CFG_GATTC = BLE_CONN_CFG_BASE + 1, /**< BLE GATTC specific connection configuration. */ + BLE_CONN_CFG_GATTS = BLE_CONN_CFG_BASE + 2, /**< BLE GATTS specific connection configuration. */ + BLE_CONN_CFG_GATT = BLE_CONN_CFG_BASE + 3, /**< BLE GATT specific connection configuration. */ + BLE_CONN_CFG_L2CAP = BLE_CONN_CFG_BASE + 4, /**< BLE L2CAP specific connection configuration. */ +}; + +/**@brief BLE Common Configuration IDs. + * + * IDs that uniquely identify a common configuration. + */ +enum BLE_COMMON_CFGS +{ + BLE_COMMON_CFG_VS_UUID = BLE_CFG_BASE, /**< Vendor specific UUID configuration */ +}; + +/**@brief Common Option IDs. + * IDs that uniquely identify a common option. + */ +enum BLE_COMMON_OPTS +{ + BLE_COMMON_OPT_PA_LNA = BLE_OPT_BASE + 0, /**< PA and LNA options */ + BLE_COMMON_OPT_CONN_EVT_EXT = BLE_OPT_BASE + 1, /**< Extended connection events option */ +}; + +/** @} */ + +/** @addtogroup BLE_COMMON_DEFINES Defines + * @{ */ + +/** @brief Required pointer alignment for BLE Events. +*/ +#define BLE_EVT_PTR_ALIGNMENT 4 + +/** @brief Leaves the maximum of the two arguments. +*/ +#define BLE_MAX(a, b) ((a) < (b) ? (b) : (a)) + +/** @brief Maximum possible length for BLE Events. + * @note The highest value used for @ref ble_gatt_conn_cfg_t::att_mtu in any connection configuration shall be used as a parameter. + * If that value has not been configured for any connections then @ref BLE_GATT_ATT_MTU_DEFAULT must be used instead. +*/ +#define BLE_EVT_LEN_MAX(ATT_MTU) ( \ + offsetof(ble_evt_t, evt.gattc_evt.params.prim_srvc_disc_rsp.services) + ((ATT_MTU) - 1) / 4 * sizeof(ble_gattc_service_t) \ +) + +/** @defgroup BLE_USER_MEM_TYPES User Memory Types + * @{ */ +#define BLE_USER_MEM_TYPE_INVALID 0x00 /**< Invalid User Memory Types. */ +#define BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES 0x01 /**< User Memory for GATTS queued writes. */ +/** @} */ + +/** @defgroup BLE_UUID_VS_COUNTS Vendor Specific UUID counts + * @{ + */ +#define BLE_UUID_VS_COUNT_DEFAULT 10 /**< Default VS UUID count. */ +#define BLE_UUID_VS_COUNT_MAX 254 /**< Maximum VS UUID count. */ +/** @} */ + +/** @defgroup BLE_COMMON_CFG_DEFAULTS Configuration defaults. + * @{ + */ +#define BLE_CONN_CFG_TAG_DEFAULT 0 /**< Default configuration tag, SoftDevice default connection configuration. */ + +/** @} */ + +/** @} */ + +/** @addtogroup BLE_COMMON_STRUCTURES Structures + * @{ */ + +/**@brief User Memory Block. */ +typedef struct +{ + uint8_t *p_mem; /**< Pointer to the start of the user memory block. */ + uint16_t len; /**< Length in bytes of the user memory block. */ +} ble_user_mem_block_t; + +/**@brief Event structure for @ref BLE_EVT_USER_MEM_REQUEST. */ +typedef struct +{ + uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ +} ble_evt_user_mem_request_t; + +/**@brief Event structure for @ref BLE_EVT_USER_MEM_RELEASE. */ +typedef struct +{ + uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ + ble_user_mem_block_t mem_block; /**< User memory block */ +} ble_evt_user_mem_release_t; + +/**@brief Event structure for events not associated with a specific function module. */ +typedef struct +{ + uint16_t conn_handle; /**< Connection Handle on which this event occurred. */ + union + { + ble_evt_user_mem_request_t user_mem_request; /**< User Memory Request Event Parameters. */ + ble_evt_user_mem_release_t user_mem_release; /**< User Memory Release Event Parameters. */ + } params; /**< Event parameter union. */ +} ble_common_evt_t; + +/**@brief BLE Event header. */ +typedef struct +{ + uint16_t evt_id; /**< Value from a BLE__EVT series. */ + uint16_t evt_len; /**< Length in octets including this header. */ +} ble_evt_hdr_t; + +/**@brief Common BLE Event type, wrapping the module specific event reports. */ +typedef struct +{ + ble_evt_hdr_t header; /**< Event header. */ + union + { + ble_common_evt_t common_evt; /**< Common Event, evt_id in BLE_EVT_* series. */ + ble_gap_evt_t gap_evt; /**< GAP originated event, evt_id in BLE_GAP_EVT_* series. */ + ble_gattc_evt_t gattc_evt; /**< GATT client originated event, evt_id in BLE_GATTC_EVT* series. */ + ble_gatts_evt_t gatts_evt; /**< GATT server originated event, evt_id in BLE_GATTS_EVT* series. */ + ble_l2cap_evt_t l2cap_evt; /**< L2CAP originated event, evt_id in BLE_L2CAP_EVT* series. */ + } evt; /**< Event union. */ +} ble_evt_t; + + +/** + * @brief Version Information. + */ +typedef struct +{ + uint8_t version_number; /**< Link Layer Version number. See https://www.bluetooth.org/en-us/specification/assigned-numbers/link-layer for assigned values. */ + uint16_t company_id; /**< Company ID, Nordic Semiconductor's company ID is 89 (0x0059) (https://www.bluetooth.org/apps/content/Default.aspx?doc_id=49708). */ + uint16_t subversion_number; /**< Link Layer Sub Version number, corresponds to the SoftDevice Config ID or Firmware ID (FWID). */ +} ble_version_t; + +/** + * @brief Configuration parameters for the PA and LNA. + */ +typedef struct +{ + uint8_t enable :1; /**< Enable toggling for this amplifier */ + uint8_t active_high :1; /**< Set the pin to be active high */ + uint8_t gpio_pin :6; /**< The GPIO pin to toggle for this amplifier */ +} ble_pa_lna_cfg_t; + +/** + * @brief PA & LNA GPIO toggle configuration + * + * This option configures the SoftDevice to toggle pins when the radio is active for use with a power amplifier and/or + * a low noise amplifier. + * + * Toggling the pins is achieved by using two PPI channels and a GPIOTE channel. The hardware channel IDs are provided + * by the application and should be regarded as reserved as long as any PA/LNA toggling is enabled. + * + * @note @ref sd_ble_opt_get is not supported for this option. + * @note Setting this option while the radio is in use (i.e. any of the roles are active) may have undefined consequences + * and must be avoided by the application. + */ +typedef struct +{ + ble_pa_lna_cfg_t pa_cfg; /**< Power Amplifier configuration */ + ble_pa_lna_cfg_t lna_cfg; /**< Low Noise Amplifier configuration */ + + uint8_t ppi_ch_id_set; /**< PPI channel used for radio pin setting */ + uint8_t ppi_ch_id_clr; /**< PPI channel used for radio pin clearing */ + uint8_t gpiote_ch_id; /**< GPIOTE channel used for radio pin toggling */ +} ble_common_opt_pa_lna_t; + +/** + * @brief Configuration of extended BLE connection events. + * + * When enabled the SoftDevice will dynamically extend the connection event when possible. + * + * The connection event length is controlled by the connection configuration as set by @ref ble_gap_conn_cfg_t::event_length. + * The connection event can be extended if there is time to send another packet pair before the start of the next connection interval, + * and if there are no conflicts with other BLE roles requesting radio time. + * + * @note @ref sd_ble_opt_get is not supported for this option. + */ +typedef struct +{ + uint8_t enable : 1; /**< Enable extended BLE connection events, disabled by default. */ +} ble_common_opt_conn_evt_ext_t; + +/**@brief Option structure for common options. */ +typedef union +{ + ble_common_opt_pa_lna_t pa_lna; /**< Parameters for controlling PA and LNA pin toggling. */ + ble_common_opt_conn_evt_ext_t conn_evt_ext; /**< Parameters for enabling extended connection events. */ +} ble_common_opt_t; + +/**@brief Common BLE Option type, wrapping the module specific options. */ +typedef union +{ + ble_common_opt_t common_opt; /**< COMMON options, opt_id in @ref BLE_COMMON_OPTS series. */ + ble_gap_opt_t gap_opt; /**< GAP option, opt_id in @ref BLE_GAP_OPTS series. */ +} ble_opt_t; + +/**@brief BLE connection configuration type, wrapping the module specific configurations, set with + * @ref sd_ble_cfg_set. + * + * @note Connection configurations don't have to be set. + * In the case that no configurations has been set, or fewer connection configurations has been set than enabled connections, + * the default connection configuration will be automatically added for the remaining connections. + * When creating connections with the default configuration, @ref BLE_CONN_CFG_TAG_DEFAULT should be used in + * place of @ref ble_conn_cfg_t::conn_cfg_tag. + * + * @sa sd_ble_gap_adv_start() + * @sa sd_ble_gap_connect() + * + * @mscs + * @mmsc{@ref BLE_CONN_CFG} + * @endmscs + + */ +typedef struct +{ + uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the + @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() calls + to select this configuration when creating a connection. + Must be different for all connection configurations added and not @ref BLE_CONN_CFG_TAG_DEFAULT. */ + union { + ble_gap_conn_cfg_t gap_conn_cfg; /**< GAP connection configuration, cfg_id is @ref BLE_CONN_CFG_GAP. */ + ble_gattc_conn_cfg_t gattc_conn_cfg; /**< GATTC connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTC. */ + ble_gatts_conn_cfg_t gatts_conn_cfg; /**< GATTS connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTS. */ + ble_gatt_conn_cfg_t gatt_conn_cfg; /**< GATT connection configuration, cfg_id is @ref BLE_CONN_CFG_GATT. */ + ble_l2cap_conn_cfg_t l2cap_conn_cfg; /**< L2CAP connection configuration, cfg_id is @ref BLE_CONN_CFG_L2CAP. */ + } params; /**< Connection configuration union. */ +} ble_conn_cfg_t; + +/** + * @brief Configuration of Vendor Specific UUIDs, set with @ref sd_ble_cfg_set. + * + * @retval ::NRF_ERROR_INVALID_PARAM Too many UUIDs configured. + */ +typedef struct +{ + uint8_t vs_uuid_count; /**< Number of 128-bit Vendor Specific UUID bases to allocate memory for. + Default value is @ref BLE_UUID_VS_COUNT_DEFAULT. Maximum value is + @ref BLE_UUID_VS_COUNT_MAX. */ +} ble_common_cfg_vs_uuid_t; + +/**@brief Common BLE Configuration type, wrapping the common configurations. */ +typedef union +{ + ble_common_cfg_vs_uuid_t vs_uuid_cfg; /**< Vendor specific UUID configuration, cfg_id is @ref BLE_COMMON_CFG_VS_UUID. */ +} ble_common_cfg_t; + +/**@brief BLE Configuration type, wrapping the module specific configurations. */ +typedef union +{ + ble_conn_cfg_t conn_cfg; /**< Connection specific configurations, cfg_id in @ref BLE_CONN_CFGS series. */ + ble_common_cfg_t common_cfg; /**< Global common configurations, cfg_id in @ref BLE_COMMON_CFGS series. */ + ble_gap_cfg_t gap_cfg; /**< Global GAP configurations, cfg_id in @ref BLE_GAP_CFGS series. */ + ble_gatts_cfg_t gatts_cfg; /**< Global GATTS configuration, cfg_id in @ref BLE_GATTS_CFGS series. */ +} ble_cfg_t; + +/** @} */ + +/** @addtogroup BLE_COMMON_FUNCTIONS Functions + * @{ */ + +/**@brief Enable the BLE stack + * + * @param[in, out] p_app_ram_base Pointer to a variable containing the start address of the + * application RAM region (APP_RAM_BASE). On return, this will + * contain the minimum start address of the application RAM region + * required by the SoftDevice for this configuration. + * + * @note The memory requirement for a specific configuration will not increase between SoftDevices + * with the same major version number. + * + * @note The value of *p_app_ram_base when the app has done no custom configuration of the + * SoftDevice, i.e. the app has not called @ref sd_ble_cfg_set before @ref sd_ble_enable, can + * be found in the release notes. + * + * @note At runtime the IC's RAM is split into 2 regions: The SoftDevice RAM region is located + * between 0x20000000 and APP_RAM_BASE-1 and the application's RAM region is located between + * APP_RAM_BASE and the start of the call stack. + * + * @details This call initializes the BLE stack, no BLE related function other than @ref + * sd_ble_cfg_set can be called before this one. + * + * @mscs + * @mmsc{@ref BLE_COMMON_ENABLE} + * @endmscs + * + * @retval ::NRF_SUCCESS The BLE stack has been initialized successfully. + * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized and cannot be reinitialized. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. + * @retval ::NRF_ERROR_NO_MEM The amount of memory assigned to the SoftDevice by *p_app_ram_base is not + * large enough to fit this configuration's memory requirement. Check *p_app_ram_base + * and set the start address of the application RAM region accordingly. + */ +SVCALL(SD_BLE_ENABLE, uint32_t, sd_ble_enable(uint32_t * p_app_ram_base)); + +/**@brief Add configurations for the BLE stack + * + * @param[in] cfg_id Config ID, see @ref BLE_CONN_CFGS, @ref BLE_COMMON_CFGS, @ref + * BLE_GAP_CFGS or @ref BLE_GATTS_CFGS. + * @param[in] p_cfg Pointer to a ble_cfg_t structure containing the configuration value. + * @param[in] app_ram_base The start address of the application RAM region (APP_RAM_BASE). + * See @ref sd_ble_enable for details about APP_RAM_BASE. + * + * @note The memory requirement for a specific configuration will not increase between SoftDevices + * with the same major version number. + * + * @note If a configuration is set more than once, the last one set is the one that takes effect on + * @ref sd_ble_enable. + * + * @note Any part of the BLE stack that is NOT configured with @ref sd_ble_cfg_set will have default + * configuration. + * + * @note @ref sd_ble_cfg_set may be called at any time when the SoftDevice is enabled (see @ref + * sd_softdevice_enable) while the BLE part of the SoftDevice is not enabled (see @ref + * sd_ble_enable). + * + * @note Error codes for the configurations are described in the configuration structs. + * + * @mscs + * @mmsc{@ref BLE_COMMON_ENABLE} + * @endmscs + * + * @retval ::NRF_SUCCESS The configuration has been added successfully. + * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid cfg_id supplied. + * @retval ::NRF_ERROR_NO_MEM The amount of memory assigned to the SoftDevice by app_ram_base is not + * large enough to fit this configuration's memory requirement. + */ +SVCALL(SD_BLE_CFG_SET, uint32_t, sd_ble_cfg_set(uint32_t cfg_id, ble_cfg_t const * p_cfg, uint32_t app_ram_base)); + +/**@brief Get an event from the pending events queue. + * + * @param[out] p_dest Pointer to buffer to be filled in with an event, or NULL to retrieve the event length. + * This buffer must be aligned to the extend defined by @ref BLE_EVT_PTR_ALIGNMENT. + * The buffer should be interpreted as a @ref ble_evt_t struct. + * @param[in, out] p_len Pointer the length of the buffer, on return it is filled with the event length. + * + * @details This call allows the application to pull a BLE event from the BLE stack. The application is signaled that + * an event is available from the BLE stack by the triggering of the SD_EVT_IRQn interrupt. + * The application is free to choose whether to call this function from thread mode (main context) or directly from the + * Interrupt Service Routine that maps to SD_EVT_IRQn. In any case however, and because the BLE stack runs at a higher + * priority than the application, this function should be called in a loop (until @ref NRF_ERROR_NOT_FOUND is returned) + * every time SD_EVT_IRQn is raised to ensure that all available events are pulled from the BLE stack. Failure to do so + * could potentially leave events in the internal queue without the application being aware of this fact. + * + * Sizing the p_dest buffer is equally important, since the application needs to provide all the memory necessary for the event to + * be copied into application memory. If the buffer provided is not large enough to fit the entire contents of the event, + * @ref NRF_ERROR_DATA_SIZE will be returned and the application can then call again with a larger buffer size. + * The maximum possible event length is defined by @ref BLE_EVT_LEN_MAX. The application may also "peek" the event length + * by providing p_dest as a NULL pointer and inspecting the value of *p_len upon return: + * + * \code + * uint16_t len; + * errcode = sd_ble_evt_get(NULL, &len); + * \endcode + * + * @mscs + * @mmsc{@ref BLE_COMMON_IRQ_EVT_MSC} + * @mmsc{@ref BLE_COMMON_THREAD_EVT_MSC} + * @endmscs + * + * @retval ::NRF_SUCCESS Event pulled and stored into the supplied buffer. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. + * @retval ::NRF_ERROR_NOT_FOUND No events ready to be pulled. + * @retval ::NRF_ERROR_DATA_SIZE Event ready but could not fit into the supplied buffer. + */ +SVCALL(SD_BLE_EVT_GET, uint32_t, sd_ble_evt_get(uint8_t *p_dest, uint16_t *p_len)); + + +/**@brief Add a Vendor Specific base UUID. + * + * @details This call enables the application to add a vendor specific base UUID to the BLE stack's table, for later + * use with all other modules and APIs. This then allows the application to use the shorter, 24-bit @ref ble_uuid_t + * format when dealing with both 16-bit and 128-bit UUIDs without having to check for lengths and having split code + * paths. This is accomplished by extending the grouping mechanism that the Bluetooth SIG standard base UUID uses + * for all other 128-bit UUIDs. The type field in the @ref ble_uuid_t structure is an index (relative to + * @ref BLE_UUID_TYPE_VENDOR_BEGIN) to the table populated by multiple calls to this function, and the UUID field + * in the same structure contains the 2 bytes at indexes 12 and 13. The number of possible 128-bit UUIDs available to + * the application is therefore the number of Vendor Specific UUIDs added with the help of this function times 65536, + * although restricted to modifying bytes 12 and 13 for each of the entries in the supplied array. + * + * @note Bytes 12 and 13 of the provided UUID will not be used internally, since those are always replaced by + * the 16-bit uuid field in @ref ble_uuid_t. + * + * @note If a UUID is already present in the BLE stack's internal table, the corresponding index will be returned in + * p_uuid_type along with an @ref NRF_SUCCESS error code. + * + * @param[in] p_vs_uuid Pointer to a 16-octet (128-bit) little endian Vendor Specific UUID disregarding + * bytes 12 and 13. + * @param[out] p_uuid_type Pointer to a uint8_t where the type field in @ref ble_uuid_t corresponding to this UUID will be stored. + * + * @retval ::NRF_SUCCESS Successfully added the Vendor Specific UUID. + * @retval ::NRF_ERROR_INVALID_ADDR If p_vs_uuid or p_uuid_type is NULL or invalid. + * @retval ::NRF_ERROR_NO_MEM If there are no more free slots for VS UUIDs. + */ +SVCALL(SD_BLE_UUID_VS_ADD, uint32_t, sd_ble_uuid_vs_add(ble_uuid128_t const *p_vs_uuid, uint8_t *p_uuid_type)); + + +/** @brief Decode little endian raw UUID bytes (16-bit or 128-bit) into a 24 bit @ref ble_uuid_t structure. + * + * @details The raw UUID bytes excluding bytes 12 and 13 (i.e. bytes 0-11 and 14-15) of p_uuid_le are compared + * to the corresponding ones in each entry of the table of vendor specific UUIDs populated with @ref sd_ble_uuid_vs_add + * to look for a match. If there is such a match, bytes 12 and 13 are returned as p_uuid->uuid and the index + * relative to @ref BLE_UUID_TYPE_VENDOR_BEGIN as p_uuid->type. + * + * @note If the UUID length supplied is 2, then the type set by this call will always be @ref BLE_UUID_TYPE_BLE. + * + * @param[in] uuid_le_len Length in bytes of the buffer pointed to by p_uuid_le (must be 2 or 16 bytes). + * @param[in] p_uuid_le Pointer pointing to little endian raw UUID bytes. + * @param[out] p_uuid Pointer to a @ref ble_uuid_t structure to be filled in. + * + * @retval ::NRF_SUCCESS Successfully decoded into the @ref ble_uuid_t structure. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_LENGTH Invalid UUID length. + * @retval ::NRF_ERROR_NOT_FOUND For a 128-bit UUID, no match in the populated table of UUIDs. + */ +SVCALL(SD_BLE_UUID_DECODE, uint32_t, sd_ble_uuid_decode(uint8_t uuid_le_len, uint8_t const *p_uuid_le, ble_uuid_t *p_uuid)); + + +/** @brief Encode a @ref ble_uuid_t structure into little endian raw UUID bytes (16-bit or 128-bit). + * + * @note The pointer to the destination buffer p_uuid_le may be NULL, in which case only the validity and size of p_uuid is computed. + * + * @param[in] p_uuid Pointer to a @ref ble_uuid_t structure that will be encoded into bytes. + * @param[out] p_uuid_le_len Pointer to a uint8_t that will be filled with the encoded length (2 or 16 bytes). + * @param[out] p_uuid_le Pointer to a buffer where the little endian raw UUID bytes (2 or 16) will be stored. + * + * @retval ::NRF_SUCCESS Successfully encoded into the buffer. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid UUID type. + */ +SVCALL(SD_BLE_UUID_ENCODE, uint32_t, sd_ble_uuid_encode(ble_uuid_t const *p_uuid, uint8_t *p_uuid_le_len, uint8_t *p_uuid_le)); + + +/**@brief Get Version Information. + * + * @details This call allows the application to get the BLE stack version information. + * + * @param[out] p_version Pointer to a ble_version_t structure to be filled in. + * + * @retval ::NRF_SUCCESS Version information stored successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY The BLE stack is busy (typically doing a locally-initiated disconnection procedure). + */ +SVCALL(SD_BLE_VERSION_GET, uint32_t, sd_ble_version_get(ble_version_t *p_version)); + + +/**@brief Provide a user memory block. + * + * @note This call can only be used as a response to a @ref BLE_EVT_USER_MEM_REQUEST event issued to the application. + * + * @param[in] conn_handle Connection handle. + * @param[in] p_block Pointer to a user memory block structure or NULL if memory is managed by the application. + * + * @mscs + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_NOAUTH_MSC} + * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} + * @endmscs + * + * @retval ::NRF_SUCCESS Successfully queued a response to the peer. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_LENGTH Invalid user memory block length supplied. + * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection state or no user memory request pending. + */ +SVCALL(SD_BLE_USER_MEM_REPLY, uint32_t, sd_ble_user_mem_reply(uint16_t conn_handle, ble_user_mem_block_t const *p_block)); + +/**@brief Set a BLE option. + * + * @details This call allows the application to set the value of an option. + * + * @mscs + * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC} + * @endmscs + * + * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS. + * @param[in] p_opt Pointer to a ble_opt_t structure containing the option value. + * + * @retval ::NRF_SUCCESS Option set successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. + * @retval ::NRF_ERROR_INVALID_STATE Unable to set the parameter at this time. + * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. + */ +SVCALL(SD_BLE_OPT_SET, uint32_t, sd_ble_opt_set(uint32_t opt_id, ble_opt_t const *p_opt)); + + +/**@brief Get a BLE option. + * + * @details This call allows the application to retrieve the value of an option. + * + * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS. + * @param[out] p_opt Pointer to a ble_opt_t structure to be filled in. + * + * @retval ::NRF_SUCCESS Option retrieved successfully. + * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. + * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. + * @retval ::NRF_ERROR_INVALID_STATE Unable to retrieve the parameter at this time. + * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. + * @retval ::NRF_ERROR_NOT_SUPPORTED This option is not supported. + * + */ +SVCALL(SD_BLE_OPT_GET, uint32_t, sd_ble_opt_get(uint32_t opt_id, ble_opt_t *p_opt)); + +/** @} */ +#ifdef __cplusplus +} +#endif +#endif /* BLE_H__ */ + +/** + @} + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error.h similarity index 60% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error.h index 43c091630b..6badee98e5 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error.h @@ -1,38 +1,41 @@ /* - * Copyright (c) Nordic Semiconductor ASA + * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. * - * 2. Redistributions in binary form must reproduce the above copyright notice, this - * list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. * - * 3. Neither the name of Nordic Semiconductor ASA nor the names of other - * contributors to this software may be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. * - * 4. This software must only be used in a processor manufactured by Nordic - * Semiconductor ASA, or in a processor manufactured by a third party that - * is used in combination with a processor manufactured by Nordic Semiconductor. + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + /** @defgroup nrf_error SoftDevice Global Error Codes @{ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error_sdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error_sdm.h new file mode 100644 index 0000000000..530959b9d6 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error_sdm.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + /** + @addtogroup nrf_sdm_api + @{ + @defgroup nrf_sdm_error SoftDevice Manager Error Codes + @{ + + @brief Error definitions for the SDM API +*/ + +/* Header guard */ +#ifndef NRF_ERROR_SDM_H__ +#define NRF_ERROR_SDM_H__ + +#include "nrf_error.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN (NRF_ERROR_SDM_BASE_NUM + 0) ///< Unknown LFCLK source. +#define NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION (NRF_ERROR_SDM_BASE_NUM + 1) ///< Incorrect interrupt configuration (can be caused by using illegal priority levels, or having enabled SoftDevice interrupts). +#define NRF_ERROR_SDM_INCORRECT_CLENR0 (NRF_ERROR_SDM_BASE_NUM + 2) ///< Incorrect CLENR0 (can be caused by erroneous SoftDevice flashing). + +#ifdef __cplusplus +} +#endif +#endif // NRF_ERROR_SDM_H__ + +/** + @} + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error_soc.h new file mode 100644 index 0000000000..1e784b8db3 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_error_soc.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @addtogroup nrf_soc_api + @{ + @defgroup nrf_soc_error SoC Library Error Codes + @{ + + @brief Error definitions for the SoC library + +*/ + +/* Header guard */ +#ifndef NRF_ERROR_SOC_H__ +#define NRF_ERROR_SOC_H__ + +#include "nrf_error.h" +#ifdef __cplusplus +extern "C" { +#endif + +/* Mutex Errors */ +#define NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN (NRF_ERROR_SOC_BASE_NUM + 0) ///< Mutex already taken + +/* NVIC errors */ +#define NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE (NRF_ERROR_SOC_BASE_NUM + 1) ///< NVIC interrupt not available +#define NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED (NRF_ERROR_SOC_BASE_NUM + 2) ///< NVIC interrupt priority not allowed +#define NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 3) ///< NVIC should not return + +/* Power errors */ +#define NRF_ERROR_SOC_POWER_MODE_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 4) ///< Power mode unknown +#define NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 5) ///< Power POF threshold unknown +#define NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 6) ///< Power off should not return + +/* Rand errors */ +#define NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES (NRF_ERROR_SOC_BASE_NUM + 7) ///< RAND not enough values + +/* PPI errors */ +#define NRF_ERROR_SOC_PPI_INVALID_CHANNEL (NRF_ERROR_SOC_BASE_NUM + 8) ///< Invalid PPI Channel +#define NRF_ERROR_SOC_PPI_INVALID_GROUP (NRF_ERROR_SOC_BASE_NUM + 9) ///< Invalid PPI Group + +#ifdef __cplusplus +} +#endif +#endif // NRF_ERROR_SOC_H__ +/** + @} + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_nvic.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_nvic.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_nvic.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_nvic.h index 40537b45a2..f5c7e8e028 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/headers/nrf_nvic.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_nvic.h @@ -57,7 +57,8 @@ #include #include "nrf.h" - +#include "nrf_svc.h" +#include "nrf_error.h" #include "nrf_error_soc.h" #ifdef __cplusplus @@ -85,7 +86,7 @@ extern "C" { | (1U << CCM_AAR_IRQn) \ | (1U << TEMP_IRQn) \ | (1U << __NRF_NVIC_NVMC_IRQn) \ - | (1U << (uint32_t)SWI5_EGU5_IRQn) \ + | (1U << (uint32_t)SWI5_IRQn) \ )) /**@brief Interrupts used by the SoftDevice, with IRQn in the range 32-63. */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_sd_def.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_sd_def.h new file mode 100644 index 0000000000..c9ab241872 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_sd_def.h @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#ifndef NRF_SD_DEF_H__ +#define NRF_SD_DEF_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define SD_PPI_CHANNELS_USED 0xFFFE0000uL /**< PPI channels utilized by SotfDevice (not available to the application). */ +#define SD_PPI_GROUPS_USED 0x0000000CuL /**< PPI groups utilized by SoftDevice (not available to the application). */ +#define SD_TIMERS_USED 0x00000001uL /**< Timers used by SoftDevice. */ +#define SD_SWI_USED 0x0000003CuL /**< Software interrupts used by SoftDevice */ + + +#ifdef __cplusplus +} +#endif + +#endif /* NRF_SD_DEF_H__ */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_sdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_sdm.h new file mode 100644 index 0000000000..8c48d93678 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_sdm.h @@ -0,0 +1,358 @@ +/* + * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + @defgroup nrf_sdm_api SoftDevice Manager API + @{ + + @brief APIs for SoftDevice management. + +*/ + +#ifndef NRF_SDM_H__ +#define NRF_SDM_H__ + +#include +#include "nrf.h" +#include "nrf_svc.h" +#include "nrf_error.h" +#include "nrf_error_sdm.h" +#include "nrf_soc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @addtogroup NRF_SDM_DEFINES Defines + * @{ */ +#ifdef NRFSOC_DOXYGEN +/// Declared in nrf_mbr.h +#define MBR_SIZE 0 +#warning test +#endif + +/** @brief The major version for the SoftDevice binary distributed with this header file. */ +#define SD_MAJOR_VERSION (6) + +/** @brief The minor version for the SoftDevice binary distributed with this header file. */ +#define SD_MINOR_VERSION (0) + +/** @brief The bugfix version for the SoftDevice binary distributed with this header file. */ +#define SD_BUGFIX_VERSION (0) + +/** @brief The full version number for the SoftDevice binary this header file was distributed + * with, as a decimal number in the form Mmmmbbb, where: + * - M is major version (one or more digits) + * - mmm is minor version (three digits) + * - bbb is bugfix version (three digits). */ +#define SD_VERSION (SD_MAJOR_VERSION * 1000000 + SD_MINOR_VERSION * 1000 + SD_BUGFIX_VERSION) + +/** @brief SoftDevice Manager SVC Base number. */ +#define SDM_SVC_BASE 0x10 + +/** @brief SoftDevice unique string size in bytes. */ +#define SD_UNIQUE_STR_SIZE 20 + +/** @brief Invalid info field. Returned when an info field does not exist. */ +#define SDM_INFO_FIELD_INVALID (0) + +/** @brief Defines the SoftDevice Information Structure location (address) as an offset from +the start of the SoftDevice (without MBR)*/ +#define SOFTDEVICE_INFO_STRUCT_OFFSET (0x2000) + +/** @brief Defines the absolute SoftDevice Information Structure location (address) when the + * SoftDevice is installed just above the MBR (the usual case). */ +#define SOFTDEVICE_INFO_STRUCT_ADDRESS (SOFTDEVICE_INFO_STRUCT_OFFSET + MBR_SIZE) + +/** @brief Defines the offset for the SoftDevice Information Structure size value relative to the + * SoftDevice base address. The size value is of type uint8_t. */ +#define SD_INFO_STRUCT_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET) + +/** @brief Defines the offset for the SoftDevice size value relative to the SoftDevice base address. + * The size value is of type uint32_t. */ +#define SD_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x08) + +/** @brief Defines the offset for FWID value relative to the SoftDevice base address. The FWID value + * is of type uint16_t. */ +#define SD_FWID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x0C) + +/** @brief Defines the offset for the SoftDevice ID relative to the SoftDevice base address. The ID + * is of type uint32_t. */ +#define SD_ID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x10) + +/** @brief Defines the offset for the SoftDevice version relative to the SoftDevice base address in + * the same format as @ref SD_VERSION, stored as an uint32_t. */ +#define SD_VERSION_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x14) + +/** @brief Defines the offset for the SoftDevice unique string relative to the SoftDevice base address. + * The SD_UNIQUE_STR is stored as an array of uint8_t. The size of array is @ref SD_UNIQUE_STR_SIZE. + */ +#define SD_UNIQUE_STR_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x18) + +/** @brief Defines a macro for retrieving the actual SoftDevice Information Structure size value + * from a given base address. Use @ref MBR_SIZE as the argument when the SoftDevice is + * installed just above the MBR (the usual case). */ +#define SD_INFO_STRUCT_SIZE_GET(baseaddr) (*((uint8_t *) ((baseaddr) + SD_INFO_STRUCT_SIZE_OFFSET))) + +/** @brief Defines a macro for retrieving the actual SoftDevice size value from a given base + * address. Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above + * the MBR (the usual case). */ +#define SD_SIZE_GET(baseaddr) (*((uint32_t *) ((baseaddr) + SD_SIZE_OFFSET))) + +/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use + * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual + * case). */ +#define SD_FWID_GET(baseaddr) (*((uint16_t *) ((baseaddr) + SD_FWID_OFFSET))) + +/** @brief Defines a macro for retrieving the actual SoftDevice ID from a given base address. Use + * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the + * usual case). */ +#define SD_ID_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_ID_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ + ? (*((uint32_t *) ((baseaddr) + SD_ID_OFFSET))) : SDM_INFO_FIELD_INVALID) + +/** @brief Defines a macro for retrieving the actual SoftDevice version from a given base address. + * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR + * (the usual case). */ +#define SD_VERSION_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_VERSION_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ + ? (*((uint32_t *) ((baseaddr) + SD_VERSION_OFFSET))) : SDM_INFO_FIELD_INVALID) + +/** @brief Defines a macro for retrieving the address of SoftDevice unique str based on a given base address. + * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR + * (the usual case). */ +#define SD_UNIQUE_STR_ADDR_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_UNIQUE_STR_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ + ? (((uint8_t *) ((baseaddr) + SD_UNIQUE_STR_OFFSET))) : SDM_INFO_FIELD_INVALID) + +/**@defgroup NRF_FAULT_ID_RANGES Fault ID ranges + * @{ */ +#define NRF_FAULT_ID_SD_RANGE_START 0x00000000 /**< SoftDevice ID range start. */ +#define NRF_FAULT_ID_APP_RANGE_START 0x00001000 /**< Application ID range start. */ +/**@} */ + +/**@defgroup NRF_FAULT_IDS Fault ID types + * @{ */ +#define NRF_FAULT_ID_SD_ASSERT (NRF_FAULT_ID_SD_RANGE_START + 1) /**< SoftDevice assertion. The info parameter is reserved for future used. */ +#define NRF_FAULT_ID_APP_MEMACC (NRF_FAULT_ID_APP_RANGE_START + 1) /**< Application invalid memory access. The info parameter will contain 0x00000000, + in case of SoftDevice RAM access violation. In case of SoftDevice peripheral + register violation the info parameter will contain the sub-region number of + PREGION[0], on whose address range the disallowed write access caused the + memory access fault. */ +/**@} */ + +/** @} */ + +/** @addtogroup NRF_SDM_ENUMS Enumerations + * @{ */ + +/**@brief nRF SoftDevice Manager API SVC numbers. */ +enum NRF_SD_SVCS +{ + SD_SOFTDEVICE_ENABLE = SDM_SVC_BASE, /**< ::sd_softdevice_enable */ + SD_SOFTDEVICE_DISABLE, /**< ::sd_softdevice_disable */ + SD_SOFTDEVICE_IS_ENABLED, /**< ::sd_softdevice_is_enabled */ + SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, /**< ::sd_softdevice_vector_table_base_set */ + SVC_SDM_LAST /**< Placeholder for last SDM SVC */ +}; + +/** @} */ + +/** @addtogroup NRF_SDM_DEFINES Defines + * @{ */ + +/**@defgroup NRF_CLOCK_LF_ACCURACY Clock accuracy + * @{ */ + +#define NRF_CLOCK_LF_ACCURACY_250_PPM (0) /**< Default: 250 ppm */ +#define NRF_CLOCK_LF_ACCURACY_500_PPM (1) /**< 500 ppm */ +#define NRF_CLOCK_LF_ACCURACY_150_PPM (2) /**< 150 ppm */ +#define NRF_CLOCK_LF_ACCURACY_100_PPM (3) /**< 100 ppm */ +#define NRF_CLOCK_LF_ACCURACY_75_PPM (4) /**< 75 ppm */ +#define NRF_CLOCK_LF_ACCURACY_50_PPM (5) /**< 50 ppm */ +#define NRF_CLOCK_LF_ACCURACY_30_PPM (6) /**< 30 ppm */ +#define NRF_CLOCK_LF_ACCURACY_20_PPM (7) /**< 20 ppm */ +#define NRF_CLOCK_LF_ACCURACY_10_PPM (8) /**< 10 ppm */ +#define NRF_CLOCK_LF_ACCURACY_5_PPM (9) /**< 5 ppm */ +#define NRF_CLOCK_LF_ACCURACY_2_PPM (10) /**< 2 ppm */ +#define NRF_CLOCK_LF_ACCURACY_1_PPM (11) /**< 1 ppm */ + +/** @} */ + +/**@defgroup NRF_CLOCK_LF_SRC Possible LFCLK oscillator sources + * @{ */ + +#define NRF_CLOCK_LF_SRC_RC (0) /**< LFCLK RC oscillator. */ +#define NRF_CLOCK_LF_SRC_XTAL (1) /**< LFCLK crystal oscillator. */ +#define NRF_CLOCK_LF_SRC_SYNTH (2) /**< LFCLK Synthesized from HFCLK. */ + +/** @} */ + +/** @} */ + +/** @addtogroup NRF_SDM_TYPES Types + * @{ */ + +/**@brief Type representing LFCLK oscillator source. */ +typedef struct +{ + uint8_t source; /**< LF oscillator clock source, see @ref NRF_CLOCK_LF_SRC. */ + uint8_t rc_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second + units (nRF52: 1-32). + @note To avoid excessive clock drift, 0.5 degrees Celsius is the + maximum temperature change allowed in one calibration timer + interval. The interval should be selected to ensure this. + + @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. */ + uint8_t rc_temp_ctiv; /**< Only for ::NRF_CLOCK_LF_SRC_RC: How often (in number of calibration + intervals) the RC oscillator shall be calibrated if the temperature + hasn't changed. + 0: Always calibrate even if the temperature hasn't changed. + 1: Only calibrate if the temperature has changed (legacy - nRF51 only). + 2-33: Check the temperature and only calibrate if it has changed, + however calibration will take place every rc_temp_ctiv + intervals in any case. + + @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC. + + @note For nRF52, the application must ensure calibration at least once + every 8 seconds to ensure +/-500 ppm clock stability. The + recommended configuration for ::NRF_CLOCK_LF_SRC_RC on nRF52 is + rc_ctiv=16 and rc_temp_ctiv=2. This will ensure calibration at + least once every 8 seconds and for temperature changes of 0.5 + degrees Celsius every 4 seconds. See the Product Specification + for the nRF52 device being used for more information.*/ + uint8_t accuracy; /**< External clock accuracy used in the LL to compute timing + windows, see @ref NRF_CLOCK_LF_ACCURACY.*/ +} nrf_clock_lf_cfg_t; + +/**@brief Fault Handler type. + * + * When certain unrecoverable errors occur within the application or SoftDevice the fault handler will be called back. + * The protocol stack will be in an undefined state when this happens and the only way to recover will be to + * perform a reset, using e.g. CMSIS NVIC_SystemReset(). + * If the application returns from the fault handler the SoftDevice will call NVIC_SystemReset(). + * + * @note This callback is executed in HardFault context, thus SVC functions cannot be called from the fault callback. + * + * @param[in] id Fault identifier. See @ref NRF_FAULT_IDS. + * @param[in] pc The program counter of the instruction that triggered the fault. + * @param[in] info Optional additional information regarding the fault. Refer to each Fault identifier for details. + * + * @note When id is set to @ref NRF_FAULT_ID_APP_MEMACC, pc will contain the address of the instruction being executed at the time when + * the fault is detected by the CPU. The CPU program counter may have advanced up to 2 instructions (no branching) after the one that triggered the fault. + */ +typedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info); + +/** @} */ + +/** @addtogroup NRF_SDM_FUNCTIONS Functions + * @{ */ + +/**@brief Enables the SoftDevice and by extension the protocol stack. + * + * @note Some care must be taken if a low frequency clock source is already running when calling this function: + * If the LF clock has a different source then the one currently running, it will be stopped. Then, the new + * clock source will be started. + * + * @note This function has no effect when returning with an error. + * + * @post If return code is ::NRF_SUCCESS + * - SoC library and protocol stack APIs are made available. + * - A portion of RAM will be unavailable (see relevant SDS documentation). + * - Some peripherals will be unavailable or available only through the SoC API (see relevant SDS documentation). + * - Interrupts will not arrive from protected peripherals or interrupts. + * - nrf_nvic_ functions must be used instead of CMSIS NVIC_ functions for reliable usage of the SoftDevice. + * - Interrupt latency may be affected by the SoftDevice (see relevant SDS documentation). + * - Chosen low frequency clock source will be running. + * + * @param p_clock_lf_cfg Low frequency clock source and accuracy. + If NULL the clock will be configured as an RC source with rc_ctiv = 16 and .rc_temp_ctiv = 2 + In the case of XTAL source, the PPM accuracy of the chosen clock source must be greater than or equal to the actual characteristics of your XTAL clock. + * @param fault_handler Callback to be invoked in case of fault, cannot be NULL. + * + * @retval ::NRF_SUCCESS + * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. + * @retval ::NRF_ERROR_INVALID_STATE SoftDevice is already enabled, and the clock source and fault handler cannot be updated. + * @retval ::NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION SoftDevice interrupt is already enabled, or an enabled interrupt has an illegal priority level. + * @retval ::NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN Unknown low frequency clock source selected. + * @retval ::NRF_ERROR_INVALID_PARAM Invalid clock source configuration supplied in p_clock_lf_cfg. + */ +SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lf_cfg_t const * p_clock_lf_cfg, nrf_fault_handler_t fault_handler)); + + +/**@brief Disables the SoftDevice and by extension the protocol stack. + * + * Idempotent function to disable the SoftDevice. + * + * @post SoC library and protocol stack APIs are made unavailable. + * @post All interrupts that was protected by the SoftDevice will be disabled and initialized to priority 0 (highest). + * @post All peripherals used by the SoftDevice will be reset to default values. + * @post All of RAM become available. + * @post All interrupts are forwarded to the application. + * @post LFCLK source chosen in ::sd_softdevice_enable will be left running. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_SOFTDEVICE_DISABLE, uint32_t, sd_softdevice_disable(void)); + +/**@brief Check if the SoftDevice is enabled. + * + * @param[out] p_softdevice_enabled If the SoftDevice is enabled: 1 else 0. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_SOFTDEVICE_IS_ENABLED, uint32_t, sd_softdevice_is_enabled(uint8_t * p_softdevice_enabled)); + +/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the SoftDevice + * + * This function is only intended to be called when a bootloader is enabled. + * + * @param[in] address The base address of the interrupt vector table for forwarded interrupts. + + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, uint32_t, sd_softdevice_vector_table_base_set(uint32_t address)); + +/** @} */ + +#ifdef __cplusplus +} +#endif +#endif // NRF_SDM_H__ + +/** + @} +*/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_soc.h new file mode 100644 index 0000000000..3fa177281e --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_soc.h @@ -0,0 +1,1036 @@ +/* + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @defgroup nrf_soc_api SoC Library API + * @{ + * + * @brief APIs for the SoC library. + * + */ + +#ifndef NRF_SOC_H__ +#define NRF_SOC_H__ + +#include +#include "nrf.h" +#include "nrf_svc.h" +#include "nrf_error.h" +#include "nrf_error_soc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/**@addtogroup NRF_SOC_DEFINES Defines + * @{ */ + +/**@brief The number of the lowest SVC number reserved for the SoC library. */ +#define SOC_SVC_BASE (0x20) /**< Base value for SVCs that are available when the SoftDevice is disabled. */ +#define SOC_SVC_BASE_NOT_AVAILABLE (0x2C) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ + +/**@brief Guaranteed time for application to process radio inactive notification. */ +#define NRF_RADIO_NOTIFICATION_INACTIVE_GUARANTEED_TIME_US (62) + +/**@brief The minimum allowed timeslot extension time. */ +#define NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US (200) + +/**@brief The maximum processing time to handle a timeslot extension. */ +#define NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US (17) + +/**@brief The latest time before the end of a timeslot the timeslot can be extended. */ +#define NRF_RADIO_MIN_EXTENSION_MARGIN_US (79) + +#define SOC_ECB_KEY_LENGTH (16) /**< ECB key length. */ +#define SOC_ECB_CLEARTEXT_LENGTH (16) /**< ECB cleartext length. */ +#define SOC_ECB_CIPHERTEXT_LENGTH (SOC_ECB_CLEARTEXT_LENGTH) /**< ECB ciphertext length. */ + +#define SD_EVT_IRQn (SWI2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ +#define SD_EVT_IRQHandler (SWI2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. + The default interrupt priority for this handler is set to 4 */ +#define RADIO_NOTIFICATION_IRQn (SWI1_IRQn) /**< The radio notification IRQ number. */ +#define RADIO_NOTIFICATION_IRQHandler (SWI1_IRQHandler) /**< The radio notification IRQ handler. + The default interrupt priority for this handler is set to 4 */ +#define NRF_RADIO_LENGTH_MIN_US (100) /**< The shortest allowed radio timeslot, in microseconds. */ +#define NRF_RADIO_LENGTH_MAX_US (100000) /**< The longest allowed radio timeslot, in microseconds. */ + +#define NRF_RADIO_DISTANCE_MAX_US (128000000UL - 1UL) /**< The longest timeslot distance, in microseconds, allowed for the distance parameter (see @ref nrf_radio_request_normal_t) in the request. */ + +#define NRF_RADIO_EARLIEST_TIMEOUT_MAX_US (128000000UL - 1UL) /**< The longest timeout, in microseconds, allowed when requesting the earliest possible timeslot. */ + +#define NRF_RADIO_START_JITTER_US (2) /**< The maximum jitter in @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START relative to the requested start time. */ + +/**@} */ + +/**@addtogroup NRF_SOC_ENUMS Enumerations + * @{ */ + +/**@brief The SVC numbers used by the SVC functions in the SoC library. */ +enum NRF_SOC_SVCS +{ + SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, + SD_PPI_CHANNEL_ENABLE_SET = SOC_SVC_BASE + 1, + SD_PPI_CHANNEL_ENABLE_CLR = SOC_SVC_BASE + 2, + SD_PPI_CHANNEL_ASSIGN = SOC_SVC_BASE + 3, + SD_PPI_GROUP_TASK_ENABLE = SOC_SVC_BASE + 4, + SD_PPI_GROUP_TASK_DISABLE = SOC_SVC_BASE + 5, + SD_PPI_GROUP_ASSIGN = SOC_SVC_BASE + 6, + SD_PPI_GROUP_GET = SOC_SVC_BASE + 7, + SD_FLASH_PAGE_ERASE = SOC_SVC_BASE + 8, + SD_FLASH_WRITE = SOC_SVC_BASE + 9, + SD_PROTECTED_REGISTER_WRITE = SOC_SVC_BASE + 11, + SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, + SD_MUTEX_ACQUIRE = SOC_SVC_BASE_NOT_AVAILABLE + 1, + SD_MUTEX_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 2, + SD_RAND_APPLICATION_POOL_CAPACITY_GET = SOC_SVC_BASE_NOT_AVAILABLE + 3, + SD_RAND_APPLICATION_BYTES_AVAILABLE_GET = SOC_SVC_BASE_NOT_AVAILABLE + 4, + SD_RAND_APPLICATION_VECTOR_GET = SOC_SVC_BASE_NOT_AVAILABLE + 5, + SD_POWER_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 6, + SD_POWER_SYSTEM_OFF = SOC_SVC_BASE_NOT_AVAILABLE + 7, + SD_POWER_RESET_REASON_GET = SOC_SVC_BASE_NOT_AVAILABLE + 8, + SD_POWER_RESET_REASON_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 9, + SD_POWER_POF_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 10, + SD_POWER_POF_THRESHOLD_SET = SOC_SVC_BASE_NOT_AVAILABLE + 11, + SD_POWER_POF_THRESHOLDVDDH_SET = SOC_SVC_BASE_NOT_AVAILABLE + 12, + SD_POWER_RAM_POWER_SET = SOC_SVC_BASE_NOT_AVAILABLE + 13, + SD_POWER_RAM_POWER_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 14, + SD_POWER_RAM_POWER_GET = SOC_SVC_BASE_NOT_AVAILABLE + 15, + SD_POWER_GPREGRET_SET = SOC_SVC_BASE_NOT_AVAILABLE + 16, + SD_POWER_GPREGRET_CLR = SOC_SVC_BASE_NOT_AVAILABLE + 17, + SD_POWER_GPREGRET_GET = SOC_SVC_BASE_NOT_AVAILABLE + 18, + SD_POWER_DCDC_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 19, + SD_POWER_DCDC0_MODE_SET = SOC_SVC_BASE_NOT_AVAILABLE + 20, + SD_APP_EVT_WAIT = SOC_SVC_BASE_NOT_AVAILABLE + 21, + SD_CLOCK_HFCLK_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 22, + SD_CLOCK_HFCLK_RELEASE = SOC_SVC_BASE_NOT_AVAILABLE + 23, + SD_CLOCK_HFCLK_IS_RUNNING = SOC_SVC_BASE_NOT_AVAILABLE + 24, + SD_RADIO_NOTIFICATION_CFG_SET = SOC_SVC_BASE_NOT_AVAILABLE + 25, + SD_ECB_BLOCK_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 26, + SD_ECB_BLOCKS_ENCRYPT = SOC_SVC_BASE_NOT_AVAILABLE + 27, + SD_RADIO_SESSION_OPEN = SOC_SVC_BASE_NOT_AVAILABLE + 28, + SD_RADIO_SESSION_CLOSE = SOC_SVC_BASE_NOT_AVAILABLE + 29, + SD_RADIO_REQUEST = SOC_SVC_BASE_NOT_AVAILABLE + 30, + SD_EVT_GET = SOC_SVC_BASE_NOT_AVAILABLE + 31, + SD_TEMP_GET = SOC_SVC_BASE_NOT_AVAILABLE + 32, + SD_POWER_USBPWRRDY_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 33, + SD_POWER_USBDETECTED_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 34, + SD_POWER_USBREMOVED_ENABLE = SOC_SVC_BASE_NOT_AVAILABLE + 35, + SD_POWER_USBREGSTATUS_GET = SOC_SVC_BASE_NOT_AVAILABLE + 36, + SVC_SOC_LAST = SOC_SVC_BASE_NOT_AVAILABLE + 37 +}; + +/**@brief Possible values of a ::nrf_mutex_t. */ +enum NRF_MUTEX_VALUES +{ + NRF_MUTEX_FREE, + NRF_MUTEX_TAKEN +}; + +/**@brief Power modes. */ +enum NRF_POWER_MODES +{ + NRF_POWER_MODE_CONSTLAT, /**< Constant latency mode. See power management in the reference manual. */ + NRF_POWER_MODE_LOWPWR /**< Low power mode. See power management in the reference manual. */ +}; + + +/**@brief Power failure thresholds */ +enum NRF_POWER_THRESHOLDS +{ + NRF_POWER_THRESHOLD_V17 = 4UL, /**< 1.7 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V18, /**< 1.8 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V19, /**< 1.9 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V20, /**< 2.0 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V21, /**< 2.1 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V22, /**< 2.2 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V23, /**< 2.3 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V24, /**< 2.4 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V25, /**< 2.5 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V26, /**< 2.6 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V27, /**< 2.7 Volts power failure threshold. */ + NRF_POWER_THRESHOLD_V28 /**< 2.8 Volts power failure threshold. */ +}; + +/**@brief Power failure thresholds for high voltage */ +enum NRF_POWER_THRESHOLDVDDHS +{ + NRF_POWER_THRESHOLDVDDH_V27, /**< 2.7 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V28, /**< 2.8 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V29, /**< 2.9 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V30, /**< 3.0 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V31, /**< 3.1 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V32, /**< 3.2 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V33, /**< 3.3 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V34, /**< 3.4 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V35, /**< 3.5 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V36, /**< 3.6 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V37, /**< 3.7 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V38, /**< 3.8 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V39, /**< 3.9 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V40, /**< 4.0 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V41, /**< 4.1 Volts power failure threshold. */ + NRF_POWER_THRESHOLDVDDH_V42 /**< 4.2 Volts power failure threshold. */ +}; + + +/**@brief DC/DC converter modes. */ +enum NRF_POWER_DCDC_MODES +{ + NRF_POWER_DCDC_DISABLE, /**< The DCDC is disabled. */ + NRF_POWER_DCDC_ENABLE /**< The DCDC is enabled. */ +}; + +/**@brief Radio notification distances. */ +enum NRF_RADIO_NOTIFICATION_DISTANCES +{ + NRF_RADIO_NOTIFICATION_DISTANCE_NONE = 0, /**< The event does not have a notification. */ + NRF_RADIO_NOTIFICATION_DISTANCE_800US, /**< The distance from the active notification to start of radio activity. */ + NRF_RADIO_NOTIFICATION_DISTANCE_1740US, /**< The distance from the active notification to start of radio activity. */ + NRF_RADIO_NOTIFICATION_DISTANCE_2680US, /**< The distance from the active notification to start of radio activity. */ + NRF_RADIO_NOTIFICATION_DISTANCE_3620US, /**< The distance from the active notification to start of radio activity. */ + NRF_RADIO_NOTIFICATION_DISTANCE_4560US, /**< The distance from the active notification to start of radio activity. */ + NRF_RADIO_NOTIFICATION_DISTANCE_5500US /**< The distance from the active notification to start of radio activity. */ +}; + + +/**@brief Radio notification types. */ +enum NRF_RADIO_NOTIFICATION_TYPES +{ + NRF_RADIO_NOTIFICATION_TYPE_NONE = 0, /**< The event does not have a radio notification signal. */ + NRF_RADIO_NOTIFICATION_TYPE_INT_ON_ACTIVE, /**< Using interrupt for notification when the radio will be enabled. */ + NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE, /**< Using interrupt for notification when the radio has been disabled. */ + NRF_RADIO_NOTIFICATION_TYPE_INT_ON_BOTH, /**< Using interrupt for notification both when the radio will be enabled and disabled. */ +}; + +/**@brief The Radio signal callback types. */ +enum NRF_RADIO_CALLBACK_SIGNAL_TYPE +{ + NRF_RADIO_CALLBACK_SIGNAL_TYPE_START, /**< This signal indicates the start of the radio timeslot. */ + NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0, /**< This signal indicates the NRF_TIMER0 interrupt. */ + NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO, /**< This signal indicates the NRF_RADIO interrupt. */ + NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_FAILED, /**< This signal indicates extend action failed. */ + NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_SUCCEEDED /**< This signal indicates extend action succeeded. */ +}; + +/**@brief The actions requested by the signal callback. + * + * This code gives the SOC instructions about what action to take when the signal callback has + * returned. + */ +enum NRF_RADIO_SIGNAL_CALLBACK_ACTION +{ + NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE, /**< Return without action. */ + NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current + timeslot. Maximum execution time for this action: + @ref NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US. + This action must be started at least + @ref NRF_RADIO_MIN_EXTENSION_MARGIN_US before + the end of the timeslot. */ + NRF_RADIO_SIGNAL_CALLBACK_ACTION_END, /**< End the current radio timeslot. */ + NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END /**< Request a new radio timeslot and end the current timeslot. */ +}; + +/**@brief Radio timeslot high frequency clock source configuration. */ +enum NRF_RADIO_HFCLK_CFG +{ + NRF_RADIO_HFCLK_CFG_XTAL_GUARANTEED, /**< The SoftDevice will guarantee that the high frequency clock source is the + external crystal for the whole duration of the timeslot. This should be the + preferred option for events that use the radio or require high timing accuracy. + @note The SoftDevice will automatically turn on and off the external crystal, + at the beginning and end of the timeslot, respectively. The crystal may also + intentionally be left running after the timeslot, in cases where it is needed + by the SoftDevice shortly after the end of the timeslot. */ + NRF_RADIO_HFCLK_CFG_NO_GUARANTEE /**< This configuration allows for earlier and tighter scheduling of timeslots. + The RC oscillator may be the clock source in part or for the whole duration of the timeslot. + The RC oscillator's accuracy must therefore be taken into consideration. + @note If the application will use the radio peripheral in timeslots with this configuration, + it must make sure that the crystal is running and stable before starting the radio. */ +}; + +/**@brief Radio timeslot priorities. */ +enum NRF_RADIO_PRIORITY +{ + NRF_RADIO_PRIORITY_HIGH, /**< High (equal priority as the normal connection priority of the SoftDevice stack(s)). */ + NRF_RADIO_PRIORITY_NORMAL, /**< Normal (equal priority as the priority of secondary activities of the SoftDevice stack(s)). */ +}; + +/**@brief Radio timeslot request type. */ +enum NRF_RADIO_REQUEST_TYPE +{ + NRF_RADIO_REQ_TYPE_EARLIEST, /**< Request radio timeslot as early as possible. This should always be used for the first request in a session. */ + NRF_RADIO_REQ_TYPE_NORMAL /**< Normal radio timeslot request. */ +}; + +/**@brief SoC Events. */ +enum NRF_SOC_EVTS +{ + NRF_EVT_HFCLKSTARTED, /**< Event indicating that the HFCLK has started. */ + NRF_EVT_POWER_FAILURE_WARNING, /**< Event indicating that a power failure warning has occurred. */ + NRF_EVT_FLASH_OPERATION_SUCCESS, /**< Event indicating that the ongoing flash operation has completed successfully. */ + NRF_EVT_FLASH_OPERATION_ERROR, /**< Event indicating that the ongoing flash operation has timed out with an error. */ + NRF_EVT_RADIO_BLOCKED, /**< Event indicating that a radio timeslot was blocked. */ + NRF_EVT_RADIO_CANCELED, /**< Event indicating that a radio timeslot was canceled by SoftDevice. */ + NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN, /**< Event indicating that a radio timeslot signal callback handler return was invalid. */ + NRF_EVT_RADIO_SESSION_IDLE, /**< Event indicating that a radio timeslot session is idle. */ + NRF_EVT_RADIO_SESSION_CLOSED, /**< Event indicating that a radio timeslot session is closed. */ + NRF_EVT_POWER_USB_POWER_READY, /**< Event indicating that a USB 3.3 V supply is ready. */ + NRF_EVT_POWER_USB_DETECTED, /**< Event indicating that voltage supply is detected on VBUS. */ + NRF_EVT_POWER_USB_REMOVED, /**< Event indicating that voltage supply is removed from VBUS. */ + NRF_EVT_NUMBER_OF_EVTS +}; + +/**@} */ + + +/**@addtogroup NRF_SOC_STRUCTURES Structures + * @{ */ + +/**@brief Represents a mutex for use with the nrf_mutex functions. + * @note Accessing the value directly is not safe, use the mutex functions! + */ +typedef volatile uint8_t nrf_mutex_t; + +/**@brief Parameters for a request for a timeslot as early as possible. */ +typedef struct +{ + uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ + uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ + uint32_t length_us; /**< The radio timeslot length (in the range 100 to 100,000] microseconds). */ + uint32_t timeout_us; /**< Longest acceptable delay until the start of the requested timeslot (up to @ref NRF_RADIO_EARLIEST_TIMEOUT_MAX_US microseconds). */ +} nrf_radio_request_earliest_t; + +/**@brief Parameters for a normal radio timeslot request. */ +typedef struct +{ + uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ + uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ + uint32_t distance_us; /**< Distance from the start of the previous radio timeslot (up to @ref NRF_RADIO_DISTANCE_MAX_US microseconds). */ + uint32_t length_us; /**< The radio timeslot length (in the range [100..100,000] microseconds). */ +} nrf_radio_request_normal_t; + +/**@brief Radio timeslot request parameters. */ +typedef struct +{ + uint8_t request_type; /**< Type of request, see @ref NRF_RADIO_REQUEST_TYPE. */ + union + { + nrf_radio_request_earliest_t earliest; /**< Parameters for requesting a radio timeslot as early as possible. */ + nrf_radio_request_normal_t normal; /**< Parameters for requesting a normal radio timeslot. */ + } params; /**< Parameter union. */ +} nrf_radio_request_t; + +/**@brief Return parameters of the radio timeslot signal callback. */ +typedef struct +{ + uint8_t callback_action; /**< The action requested by the application when returning from the signal callback, see @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION. */ + union + { + struct + { + nrf_radio_request_t * p_next; /**< The request parameters for the next radio timeslot. */ + } request; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END. */ + struct + { + uint32_t length_us; /**< Requested extension of the radio timeslot duration (microseconds) (for minimum time see @ref NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US). */ + } extend; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND. */ + } params; /**< Parameter union. */ +} nrf_radio_signal_callback_return_param_t; + +/**@brief The radio timeslot signal callback type. + * + * @note In case of invalid return parameters, the radio timeslot will automatically end + * immediately after returning from the signal callback and the + * @ref NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN event will be sent. + * @note The returned struct pointer must remain valid after the signal callback + * function returns. For instance, this means that it must not point to a stack variable. + * + * @param[in] signal_type Type of signal, see @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE. + * + * @return Pointer to structure containing action requested by the application. + */ +typedef nrf_radio_signal_callback_return_param_t * (*nrf_radio_signal_callback_t) (uint8_t signal_type); + +/**@brief AES ECB parameter typedefs */ +typedef uint8_t soc_ecb_key_t[SOC_ECB_KEY_LENGTH]; /**< Encryption key type. */ +typedef uint8_t soc_ecb_cleartext_t[SOC_ECB_CLEARTEXT_LENGTH]; /**< Cleartext data type. */ +typedef uint8_t soc_ecb_ciphertext_t[SOC_ECB_CIPHERTEXT_LENGTH]; /**< Ciphertext data type. */ + +/**@brief AES ECB data structure */ +typedef struct +{ + soc_ecb_key_t key; /**< Encryption key. */ + soc_ecb_cleartext_t cleartext; /**< Cleartext data. */ + soc_ecb_ciphertext_t ciphertext; /**< Ciphertext data. */ +} nrf_ecb_hal_data_t; + +/**@brief AES ECB block. Used to provide multiple blocks in a single call + to @ref sd_ecb_blocks_encrypt.*/ +typedef struct +{ + soc_ecb_key_t const * p_key; /**< Pointer to the Encryption key. */ + soc_ecb_cleartext_t const * p_cleartext; /**< Pointer to the Cleartext data. */ + soc_ecb_ciphertext_t * p_ciphertext; /**< Pointer to the Ciphertext data. */ +} nrf_ecb_hal_data_block_t; + +/**@} */ + +/**@addtogroup NRF_SOC_FUNCTIONS Functions + * @{ */ + +/**@brief Initialize a mutex. + * + * @param[in] p_mutex Pointer to the mutex to initialize. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_MUTEX_NEW, uint32_t, sd_mutex_new(nrf_mutex_t * p_mutex)); + +/**@brief Attempt to acquire a mutex. + * + * @param[in] p_mutex Pointer to the mutex to acquire. + * + * @retval ::NRF_SUCCESS The mutex was successfully acquired. + * @retval ::NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN The mutex could not be acquired. + */ +SVCALL(SD_MUTEX_ACQUIRE, uint32_t, sd_mutex_acquire(nrf_mutex_t * p_mutex)); + +/**@brief Release a mutex. + * + * @param[in] p_mutex Pointer to the mutex to release. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_MUTEX_RELEASE, uint32_t, sd_mutex_release(nrf_mutex_t * p_mutex)); + +/**@brief Query the capacity of the application random pool. + * + * @param[out] p_pool_capacity The capacity of the pool. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_RAND_APPLICATION_POOL_CAPACITY_GET, uint32_t, sd_rand_application_pool_capacity_get(uint8_t * p_pool_capacity)); + +/**@brief Get number of random bytes available to the application. + * + * @param[out] p_bytes_available The number of bytes currently available in the pool. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, uint32_t, sd_rand_application_bytes_available_get(uint8_t * p_bytes_available)); + +/**@brief Get random bytes from the application pool. + * + * @param[out] p_buff Pointer to unit8_t buffer for storing the bytes. + * @param[in] length Number of bytes to take from pool and place in p_buff. + * + * @retval ::NRF_SUCCESS The requested bytes were written to p_buff. + * @retval ::NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES No bytes were written to the buffer, because there were not enough bytes available. +*/ +SVCALL(SD_RAND_APPLICATION_VECTOR_GET, uint32_t, sd_rand_application_vector_get(uint8_t * p_buff, uint8_t length)); + +/**@brief Gets the reset reason register. + * + * @param[out] p_reset_reason Contents of the NRF_POWER->RESETREAS register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_RESET_REASON_GET, uint32_t, sd_power_reset_reason_get(uint32_t * p_reset_reason)); + +/**@brief Clears the bits of the reset reason register. + * + * @param[in] reset_reason_clr_msk Contains the bits to clear from the reset reason register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_RESET_REASON_CLR, uint32_t, sd_power_reset_reason_clr(uint32_t reset_reason_clr_msk)); + +/**@brief Sets the power mode when in CPU sleep. + * + * @param[in] power_mode The power mode to use when in CPU sleep, see @ref NRF_POWER_MODES. @sa sd_app_evt_wait + * + * @retval ::NRF_SUCCESS The power mode was set. + * @retval ::NRF_ERROR_SOC_POWER_MODE_UNKNOWN The power mode was unknown. + */ +SVCALL(SD_POWER_MODE_SET, uint32_t, sd_power_mode_set(uint8_t power_mode)); + +/**@brief Puts the chip in System OFF mode. + * + * @retval ::NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN + */ +SVCALL(SD_POWER_SYSTEM_OFF, uint32_t, sd_power_system_off(void)); + +/**@brief Enables or disables the power-fail comparator. + * + * Enabling this will give a SoftDevice event (NRF_EVT_POWER_FAILURE_WARNING) when the power failure warning occurs. + * The event can be retrieved with sd_evt_get(); + * + * @param[in] pof_enable True if the power-fail comparator should be enabled, false if it should be disabled. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); + +/**@brief Enables or disables the USB power ready event. + * + * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_POWER_READY) when a USB 3.3 V supply is ready. + * The event can be retrieved with sd_evt_get(); + * + * @param[in] usbpwrrdy_enable True if the power ready event should be enabled, false if it should be disabled. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_USBPWRRDY_ENABLE, uint32_t, sd_power_usbpwrrdy_enable(uint8_t usbpwrrdy_enable)); + +/**@brief Enables or disables the power USB-detected event. + * + * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_DETECTED) when a voltage supply is detected on VBUS. + * The event can be retrieved with sd_evt_get(); + * + * @param[in] usbdetected_enable True if the power ready event should be enabled, false if it should be disabled. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_USBDETECTED_ENABLE, uint32_t, sd_power_usbdetected_enable(uint8_t usbdetected_enable)); + +/**@brief Enables or disables the power USB-removed event. + * + * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_REMOVED) when a voltage supply is removed from VBUS. + * The event can be retrieved with sd_evt_get(); + * + * @param[in] usbremoved_enable True if the power ready event should be enabled, false if it should be disabled. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_USBREMOVED_ENABLE, uint32_t, sd_power_usbremoved_enable(uint8_t usbremoved_enable)); + +/**@brief Get USB supply status register content. + * + * @param[out] usbregstatus The content of USBREGSTATUS register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_USBREGSTATUS_GET, uint32_t, sd_power_usbregstatus_get(uint32_t * usbregstatus)); + +/**@brief Sets the power failure comparator threshold value. + * + * @note: Power failure comparator threshold setting. This setting applies both for normal voltage + * mode (supply connected to both VDD and VDDH) and high voltage mode (supply connected to + * VDDH only). + * + * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDS. + * + * @retval ::NRF_SUCCESS The power failure threshold was set. + * @retval ::NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN The power failure threshold is unknown. + */ +SVCALL(SD_POWER_POF_THRESHOLD_SET, uint32_t, sd_power_pof_threshold_set(uint8_t threshold)); + +/**@brief Sets the power failure comparator threshold value for high voltage. + * + * @note: Power failure comparator threshold setting for high voltage mode (supply connected to + * VDDH only). This setting does not apply for normal voltage mode (supply connected to both + * VDD and VDDH). + * + * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDVDDHS. + * + * @retval ::NRF_SUCCESS The power failure threshold was set. + * @retval ::NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN The power failure threshold is unknown. + */ +SVCALL(SD_POWER_POF_THRESHOLDVDDH_SET, uint32_t, sd_power_pof_thresholdvddh_set(uint8_t threshold)); + +/**@brief Writes the NRF_POWER->RAM[index].POWERSET register. + * + * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERSET register to write to. + * @param[in] ram_powerset Contains the word to write to the NRF_POWER->RAM[index].POWERSET register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_RAM_POWER_SET, uint32_t, sd_power_ram_power_set(uint8_t index, uint32_t ram_powerset)); + +/**@brief Writes the NRF_POWER->RAM[index].POWERCLR register. + * + * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERCLR register to write to. + * @param[in] ram_powerclr Contains the word to write to the NRF_POWER->RAM[index].POWERCLR register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_RAM_POWER_CLR, uint32_t, sd_power_ram_power_clr(uint8_t index, uint32_t ram_powerclr)); + +/**@brief Get contents of NRF_POWER->RAM[index].POWER register, indicates power status of RAM[index] blocks. + * + * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWER register to read from. + * @param[out] p_ram_power Content of NRF_POWER->RAM[index].POWER register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_RAM_POWER_GET, uint32_t, sd_power_ram_power_get(uint8_t index, uint32_t * p_ram_power)); + +/**@brief Set bits in the general purpose retention registers (NRF_POWER->GPREGRET*). + * + * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. + * @param[in] gpregret_msk Bits to be set in the GPREGRET register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_GPREGRET_SET, uint32_t, sd_power_gpregret_set(uint32_t gpregret_id, uint32_t gpregret_msk)); + +/**@brief Clear bits in the general purpose retention registers (NRF_POWER->GPREGRET*). + * + * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. + * @param[in] gpregret_msk Bits to be clear in the GPREGRET register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_id, uint32_t gpregret_msk)); + +/**@brief Get contents of the general purpose retention registers (NRF_POWER->GPREGRET*). + * + * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. + * @param[out] p_gpregret Contents of the GPREGRET register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret)); + +/**@brief Enable or disable the DC/DC regulator for the regulator stage 1 (REG1). + * + * @param[in] dcdc_mode The mode of the DCDC, see @ref NRF_POWER_DCDC_MODES. + * + * @retval ::NRF_SUCCESS + * @retval ::NRF_ERROR_INVALID_PARAM The DCDC mode is invalid. + */ +SVCALL(SD_POWER_DCDC_MODE_SET, uint32_t, sd_power_dcdc_mode_set(uint8_t dcdc_mode)); + +/**@brief Enable or disable the DC/DC regulator for the regulator stage 0 (REG0). + * + * For more details on the REG0 stage, please see product specification. + * + * @param[in] dcdc_mode The mode of the DCDC0, see @ref NRF_POWER_DCDC_MODES. + * + * @retval ::NRF_SUCCESS + * @retval ::NRF_ERROR_INVALID_PARAM The dcdc_mode is invalid. + */ +SVCALL(SD_POWER_DCDC0_MODE_SET, uint32_t, sd_power_dcdc0_mode_set(uint8_t dcdc_mode)); + +/**@brief Request the high frequency crystal oscillator. + * + * Will start the high frequency crystal oscillator, the startup time of the crystal varies + * and the ::sd_clock_hfclk_is_running function can be polled to check if it has started. + * + * @see sd_clock_hfclk_is_running + * @see sd_clock_hfclk_release + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_CLOCK_HFCLK_REQUEST, uint32_t, sd_clock_hfclk_request(void)); + +/**@brief Releases the high frequency crystal oscillator. + * + * Will stop the high frequency crystal oscillator, this happens immediately. + * + * @see sd_clock_hfclk_is_running + * @see sd_clock_hfclk_request + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_CLOCK_HFCLK_RELEASE, uint32_t, sd_clock_hfclk_release(void)); + +/**@brief Checks if the high frequency crystal oscillator is running. + * + * @see sd_clock_hfclk_request + * @see sd_clock_hfclk_release + * + * @param[out] p_is_running 1 if the external crystal oscillator is running, 0 if not. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_CLOCK_HFCLK_IS_RUNNING, uint32_t, sd_clock_hfclk_is_running(uint32_t * p_is_running)); + +/**@brief Waits for an application event. + * + * An application event is either an application interrupt or a pended interrupt when the interrupt + * is disabled. + * + * When the application waits for an application event by calling this function, an interrupt that + * is enabled will be taken immediately on pending since this function will wait in thread mode, + * then the execution will return in the application's main thread. + * + * In order to wake up from disabled interrupts, the SEVONPEND flag has to be set in the Cortex-M + * MCU's System Control Register (SCR), CMSIS_SCB. In that case, when a disabled interrupt gets + * pended, this function will return to the application's main thread. + * + * @note The application must ensure that the pended flag is cleared using ::sd_nvic_ClearPendingIRQ + * in order to sleep using this function. This is only necessary for disabled interrupts, as + * the interrupt handler will clear the pending flag automatically for enabled interrupts. + * + * @note If an application interrupt has happened since the last time sd_app_evt_wait was + * called this function will return immediately and not go to sleep. This is to avoid race + * conditions that can occur when a flag is updated in the interrupt handler and processed + * in the main loop. + * + * @post An application interrupt has happened or a interrupt pending flag is set. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_APP_EVT_WAIT, uint32_t, sd_app_evt_wait(void)); + +/**@brief Get PPI channel enable register contents. + * + * @param[out] p_channel_enable The contents of the PPI CHEN register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_CHANNEL_ENABLE_GET, uint32_t, sd_ppi_channel_enable_get(uint32_t * p_channel_enable)); + +/**@brief Set PPI channel enable register. + * + * @param[in] channel_enable_set_msk Mask containing the bits to set in the PPI CHEN register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_CHANNEL_ENABLE_SET, uint32_t, sd_ppi_channel_enable_set(uint32_t channel_enable_set_msk)); + +/**@brief Clear PPI channel enable register. + * + * @param[in] channel_enable_clr_msk Mask containing the bits to clear in the PPI CHEN register. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_CHANNEL_ENABLE_CLR, uint32_t, sd_ppi_channel_enable_clr(uint32_t channel_enable_clr_msk)); + +/**@brief Assign endpoints to a PPI channel. + * + * @param[in] channel_num Number of the PPI channel to assign. + * @param[in] evt_endpoint Event endpoint of the PPI channel. + * @param[in] task_endpoint Task endpoint of the PPI channel. + * + * @retval ::NRF_ERROR_SOC_PPI_INVALID_CHANNEL The channel number is invalid. + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_CHANNEL_ASSIGN, uint32_t, sd_ppi_channel_assign(uint8_t channel_num, const volatile void * evt_endpoint, const volatile void * task_endpoint)); + +/**@brief Task to enable a channel group. + * + * @param[in] group_num Number of the channel group. + * + * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_GROUP_TASK_ENABLE, uint32_t, sd_ppi_group_task_enable(uint8_t group_num)); + +/**@brief Task to disable a channel group. + * + * @param[in] group_num Number of the PPI group. + * + * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_GROUP_TASK_DISABLE, uint32_t, sd_ppi_group_task_disable(uint8_t group_num)); + +/**@brief Assign PPI channels to a channel group. + * + * @param[in] group_num Number of the channel group. + * @param[in] channel_msk Mask of the channels to assign to the group. + * + * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_GROUP_ASSIGN, uint32_t, sd_ppi_group_assign(uint8_t group_num, uint32_t channel_msk)); + +/**@brief Gets the PPI channels of a channel group. + * + * @param[in] group_num Number of the channel group. + * @param[out] p_channel_msk Mask of the channels assigned to the group. + * + * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_PPI_GROUP_GET, uint32_t, sd_ppi_group_get(uint8_t group_num, uint32_t * p_channel_msk)); + +/**@brief Configures the Radio Notification signal. + * + * @note + * - The notification signal latency depends on the interrupt priority settings of SWI used + * for notification signal. + * - To ensure that the radio notification signal behaves in a consistent way, the radio + * notifications must be configured when there is no protocol stack or other SoftDevice + * activity in progress. It is recommended that the radio notification signal is + * configured directly after the SoftDevice has been enabled. + * - In the period between the ACTIVE signal and the start of the Radio Event, the SoftDevice + * will interrupt the application to do Radio Event preparation. + * - Using the Radio Notification feature may limit the bandwidth, as the SoftDevice may have + * to shorten the connection events to have time for the Radio Notification signals. + * + * @param[in] type Type of notification signal, see @ref NRF_RADIO_NOTIFICATION_TYPES. + * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE shall be used to turn off radio + * notification. Using @ref NRF_RADIO_NOTIFICATION_DISTANCE_NONE is + * recommended (but not required) to be used with + * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE. + * + * @param[in] distance Distance between the notification signal and start of radio activity, see @ref NRF_RADIO_NOTIFICATION_DISTANCES. + * This parameter is ignored when @ref NRF_RADIO_NOTIFICATION_TYPE_NONE or + * @ref NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE is used. + * + * @retval ::NRF_ERROR_INVALID_PARAM The group number is invalid. + * @retval ::NRF_ERROR_INVALID_STATE A protocol stack or other SoftDevice is running. Stop all + * running activities and retry. + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_RADIO_NOTIFICATION_CFG_SET, uint32_t, sd_radio_notification_cfg_set(uint8_t type, uint8_t distance)); + +/**@brief Encrypts a block according to the specified parameters. + * + * 128-bit AES encryption. + * + * @note: + * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while + * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application + * main or low interrupt level. + * + * @param[in, out] p_ecb_data Pointer to the ECB parameters' struct (two input + * parameters and one output parameter). + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_ECB_BLOCK_ENCRYPT, uint32_t, sd_ecb_block_encrypt(nrf_ecb_hal_data_t * p_ecb_data)); + +/**@brief Encrypts multiple data blocks provided as an array of data block structures. + * + * @details: Performs 128-bit AES encryption on multiple data blocks + * + * @note: + * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while + * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application + * main or low interrupt level. + * + * @param[in] block_count Count of blocks in the p_data_blocks array. + * @param[in,out] p_data_blocks Pointer to the first entry in a contiguous array of + * @ref nrf_ecb_hal_data_block_t structures. + * + * @retval ::NRF_SUCCESS + */ +SVCALL(SD_ECB_BLOCKS_ENCRYPT, uint32_t, sd_ecb_blocks_encrypt(uint8_t block_count, nrf_ecb_hal_data_block_t * p_data_blocks)); + +/**@brief Gets any pending events generated by the SoC API. + * + * The application should keep calling this function to get events, until ::NRF_ERROR_NOT_FOUND is returned. + * + * @param[out] p_evt_id Set to one of the values in @ref NRF_SOC_EVTS, if any events are pending. + * + * @retval ::NRF_SUCCESS An event was pending. The event id is written in the p_evt_id parameter. + * @retval ::NRF_ERROR_NOT_FOUND No pending events. + */ +SVCALL(SD_EVT_GET, uint32_t, sd_evt_get(uint32_t * p_evt_id)); + +/**@brief Get the temperature measured on the chip + * + * This function will block until the temperature measurement is done. + * It takes around 50 us from call to return. + * + * @param[out] p_temp Result of temperature measurement. Die temperature in 0.25 degrees Celsius. + * + * @retval ::NRF_SUCCESS A temperature measurement was done, and the temperature was written to temp + */ +SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp)); + +/**@brief Flash Write +* +* Commands to write a buffer to flash +* +* If the SoftDevice is enabled: +* This call initiates the flash access command, and its completion will be communicated to the +* application with exactly one of the following events: +* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. +* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. +* +* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the + * write has been completed +* +* @note +* - This call takes control over the radio and the CPU during flash erase and write to make sure that +* they will not interfere with the flash access. This means that all interrupts will be blocked +* for a predictable time (depending on the NVMC specification in the device's Product Specification +* and the command parameters). +* - The data in the p_src buffer should not be modified before the @ref NRF_EVT_FLASH_OPERATION_SUCCESS +* or the @ref NRF_EVT_FLASH_OPERATION_ERROR have been received if the SoftDevice is enabled. +* - This call will make the SoftDevice trigger a hardfault when the page is written, if it is +* protected. +* +* +* @param[in] p_dst Pointer to start of flash location to be written. +* @param[in] p_src Pointer to buffer with data to be written. +* @param[in] size Number of 32-bit words to write. Maximum size is the number of words in one +* flash page. See the device's Product Specification for details. +* +* @retval ::NRF_ERROR_INVALID_ADDR Tried to write to a non existing flash address, or p_dst or p_src was unaligned. +* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. +* @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or higher than the maximum allowed size. +* @retval ::NRF_ERROR_FORBIDDEN Tried to write to an address outside the application flash area. +* @retval ::NRF_SUCCESS The command was accepted. +*/ +SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)); + + +/**@brief Flash Erase page +* +* Commands to erase a flash page +* If the SoftDevice is enabled: +* This call initiates the flash access command, and its completion will be communicated to the +* application with exactly one of the following events: +* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. +* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. +* +* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the +* erase has been completed +* +* @note +* - This call takes control over the radio and the CPU during flash erase and write to make sure that +* they will not interfere with the flash access. This means that all interrupts will be blocked +* for a predictable time (depending on the NVMC specification in the device's Product Specification +* and the command parameters). +* - This call will make the SoftDevice trigger a hardfault when the page is erased, if it is +* protected. +* +* +* @param[in] page_number Page number of the page to erase +* +* @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. +* @retval ::NRF_ERROR_INVALID_ADDR Tried to erase to a non existing flash page. +* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. +* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a page outside the application flash area. +* @retval ::NRF_SUCCESS The command was accepted. +*/ +SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)); + + + +/**@brief Opens a session for radio timeslot requests. + * + * @note Only one session can be open at a time. + * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) will be called when the radio timeslot + * starts. From this point the NRF_RADIO and NRF_TIMER0 peripherals can be freely accessed + * by the application. + * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0) is called whenever the NRF_TIMER0 + * interrupt occurs. + * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO) is called whenever the NRF_RADIO + * interrupt occurs. + * @note p_radio_signal_callback() will be called at ARM interrupt priority level 0. This + * implies that none of the sd_* API calls can be used from p_radio_signal_callback(). + * + * @param[in] p_radio_signal_callback The signal callback. + * + * @retval ::NRF_ERROR_INVALID_ADDR p_radio_signal_callback is an invalid function pointer. + * @retval ::NRF_ERROR_BUSY If session cannot be opened. + * @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. + * @retval ::NRF_SUCCESS Otherwise. + */ + SVCALL(SD_RADIO_SESSION_OPEN, uint32_t, sd_radio_session_open(nrf_radio_signal_callback_t p_radio_signal_callback)); + +/**@brief Closes a session for radio timeslot requests. + * + * @note Any current radio timeslot will be finished before the session is closed. + * @note If a radio timeslot is scheduled when the session is closed, it will be canceled. + * @note The application cannot consider the session closed until the @ref NRF_EVT_RADIO_SESSION_CLOSED + * event is received. + * + * @retval ::NRF_ERROR_FORBIDDEN If session not opened. + * @retval ::NRF_ERROR_BUSY If session is currently being closed. + * @retval ::NRF_SUCCESS Otherwise. + */ + SVCALL(SD_RADIO_SESSION_CLOSE, uint32_t, sd_radio_session_close(void)); + +/**@brief Requests a radio timeslot. + * + * @note The request type is determined by p_request->request_type, and can be one of @ref NRF_RADIO_REQ_TYPE_EARLIEST + * and @ref NRF_RADIO_REQ_TYPE_NORMAL. The first request in a session must always be of type @ref NRF_RADIO_REQ_TYPE_EARLIEST. + * @note For a normal request (@ref NRF_RADIO_REQ_TYPE_NORMAL), the start time of a radio timeslot is specified by + * p_request->distance_us and is given relative to the start of the previous timeslot. + * @note A too small p_request->distance_us will lead to a @ref NRF_EVT_RADIO_BLOCKED event. + * @note Timeslots scheduled too close will lead to a @ref NRF_EVT_RADIO_BLOCKED event. + * @note See the SoftDevice Specification for more on radio timeslot scheduling, distances and lengths. + * @note If an opportunity for the first radio timeslot is not found before 100 ms after the call to this + * function, it is not scheduled, and instead a @ref NRF_EVT_RADIO_BLOCKED event is sent. + * The application may then try to schedule the first radio timeslot again. + * @note Successful requests will result in nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START). + * Unsuccessful requests will result in a @ref NRF_EVT_RADIO_BLOCKED event, see @ref NRF_SOC_EVTS. + * @note The jitter in the start time of the radio timeslots is +/- @ref NRF_RADIO_START_JITTER_US us. + * @note The nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) call has a latency relative to the + * specified radio timeslot start, but this does not affect the actual start time of the timeslot. + * @note NRF_TIMER0 is reset at the start of the radio timeslot, and is clocked at 1MHz from the high frequency + * (16 MHz) clock source. If p_request->hfclk_force_xtal is true, the high frequency clock is + * guaranteed to be clocked from the external crystal. + * @note The SoftDevice will neither access the NRF_RADIO peripheral nor the NRF_TIMER0 peripheral + * during the radio timeslot. + * + * @param[in] p_request Pointer to the request parameters. + * + * @retval ::NRF_ERROR_FORBIDDEN If session not opened or the session is not IDLE. + * @retval ::NRF_ERROR_INVALID_ADDR If the p_request pointer is invalid. + * @retval ::NRF_ERROR_INVALID_PARAM If the parameters of p_request are not valid. + * @retval ::NRF_SUCCESS Otherwise. + */ + SVCALL(SD_RADIO_REQUEST, uint32_t, sd_radio_request(nrf_radio_request_t const * p_request)); + +/**@brief Write register protected by the SoftDevice + * + * This function writes to a register that is write-protected by the SoftDevice. Please refer to your + * SoftDevice Specification for more details about which registers that are protected by SoftDevice. + * This function can write to the following protected peripheral: + * - ACL + * + * @note Protected registers may be read directly. + * @note Register that are write-once will return @ref NRF_SUCCESS on second set, even the value in + * the register has not changed. See the Product Specification for more details about register + * properties. + * + * @param[in] p_register Pointer to register to be written. + * @param[in] value Value to be written to the register. + * + * @retval ::NRF_ERROR_INVALID_ADDR This function can not write to the reguested register. + * @retval ::NRF_SUCCESS Value successfully written to register. + * + */ +SVCALL(SD_PROTECTED_REGISTER_WRITE, uint32_t, sd_protected_register_write(volatile uint32_t * p_register, uint32_t value)); + +/**@} */ + +#ifdef __cplusplus +} +#endif +#endif // NRF_SOC_H__ + +/**@} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_svc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_svc.h new file mode 100644 index 0000000000..292c692982 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/headers/nrf_svc.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef NRF_SVC__ +#define NRF_SVC__ + +#include "stdint.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef SVCALL_AS_NORMAL_FUNCTION +#define SVCALL(number, return_type, signature) return_type signature +#else + +#ifndef SVCALL +#if defined (__CC_ARM) +#define SVCALL(number, return_type, signature) return_type __svc(number) signature +#elif defined (__GNUC__) +#ifdef __cplusplus +#define GCC_CAST_CPP (uint16_t) +#else +#define GCC_CAST_CPP +#endif +#define SVCALL(number, return_type, signature) \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wreturn-type\"") \ + __attribute__((naked)) \ + __attribute__((unused)) \ + static return_type signature \ + { \ + __asm( \ + "svc %0\n" \ + "bx r14" : : "I" (GCC_CAST_CPP number) : "r0" \ + ); \ + } \ + _Pragma("GCC diagnostic pop") + +#elif defined (__ICCARM__) +#define PRAGMA(x) _Pragma(#x) +#define SVCALL(number, return_type, signature) \ +PRAGMA(swi_number = (number)) \ + __swi return_type signature; +#else +#define SVCALL(number, return_type, signature) return_type signature +#endif +#endif // SVCALL + +#endif // SVCALL_AS_NORMAL_FUNCTION + +#ifdef __cplusplus +} +#endif +#endif // NRF_SVC__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/hex/s140_nrf52_6.0.0_licence-agreement.txt b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/hex/s140_nrf52_6.0.0_licence-agreement.txt new file mode 100644 index 0000000000..a71adee7b9 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/hex/s140_nrf52_6.0.0_licence-agreement.txt @@ -0,0 +1,35 @@ +Copyright (c) 2007 - 2018, Nordic Semiconductor ASA +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form, except as embedded into a Nordic + Semiconductor ASA integrated circuit in a product or a software update for + such product, must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of Nordic Semiconductor ASA nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +4. This software, with or without modification, must only be used with a + Nordic Semiconductor ASA integrated circuit. + +5. Any software provided in binary form under this license must not be reverse + engineered, decompiled, modified and/or disassembled. + +THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/hex/s140_nrf52_6.0.0_softdevice.hex b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/hex/s140_nrf52_6.0.0_softdevice.hex new file mode 100644 index 0000000000..53327ec7fa --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/hex/s140_nrf52_6.0.0_softdevice.hex @@ -0,0 +1,9281 @@ +:020000040000FA +:10100000E0120020754D0200192F0000E74C02008D +:10101000192F0000192F0000192F000000000000F8 +:10102000000000000000000000000000CD4D0200A4 +:10103000192F000000000000192F0000192F0000D8 +:10104000354E02003B4E0200192F0000192F000000 +:10105000192F0000192F0000192F0000192F000070 +:10106000414E0200192F0000192F0000474E0200C8 +:10107000192F00004D4E0200534E0200594E02003F +:10108000192F0000192F0000192F0000192F000040 +:10109000192F0000192F0000192F0000192F000030 +:1010A000192F00005F4E0200192F0000192F0000B9 +:1010B000192F0000192F0000192F0000192F000010 +:1010C000654E0200192F0000192F0000192F000093 +:1010D000192F0000192F0000192F0000192F0000F0 +:1010E000192F0000192F0000192F0000192F0000E0 +:1010F000192F0000192F0000192F0000192F0000D0 +:10110000192F0000192F000000F002F823F01FFE35 +:101110000AA090E8000C82448344AAF10107DA4552 +:1011200001D123F014FEAFF2090EBAE80F0013F05C +:10113000010F18BFFB1A43F00103184734420200A5 +:10114000544202000A444FF0000C10F8013B13F027 +:10115000070408BF10F8014B1D1108BF10F8015B10 +:10116000641E05D010F8016B641E01F8016BF9D103 +:1011700013F0080F1EBF10F8014BAD1C0C1B09D15A +:101180006D1E58BF01F801CBFAD505E014F8016BCC +:1011900001F8016B6D1EF9D59142D6D3704700005E +:1011A0000023002400250026103A28BF78C1FBD870 +:1011B000520728BF30C148BF0B6070471FB500F011 +:1011C0003DF88DE80F001FBD1EF0040F0CBFEFF3BC +:1011D0000880EFF30980014A10470000752E0000D7 +:1011E0008269034981614FF001001044704700009B +:1011F000F511000001B41EB400B512F061FF01B496 +:101200000198864601BC01B01EBD0000F0B4404606 +:10121000494652465B460FB402A0013001B506486C +:10122000004700BF01BC86460FBC804689469246F7 +:101230009B46F0BC704700000911000023F084BDFC +:1012400070B51A4C054609202070A01C00F05FF80C +:101250005920A08029462046BDE8704008F060B8BB +:1012600008F069B870B50C461149097829B1A0F1A8 +:1012700060015E2908D3012013E0602804D06928AA +:1012800002D043F201000CE020CC0A4E94E80E009C +:1012900006EB8000A0F58050241FD0F8806E284611 +:1012A000B047206070BD012070470000080000209A +:1012B0001C000020CC4E020010B504460021012085 +:1012C00000F03DF800210B2000F039F8042119202E +:1012D00000F035F804210D2000F031F804210E2033 +:1012E00000F02DF804210F2000F029F80421C84354 +:1012F00000F025F80621162000F021F8062115201F +:1013000000F01DF82046FFF79BFF002010BDA9212B +:1013100001807047FFF7A4BF11487047104870471D +:10132000104A10B514680F4B0F4A08331A60FFF7C4 +:1013300099FF0C48001D046010BD704770474907B5 +:10134000090E002806DA00F00F0000F1E02080F816 +:10135000141D704700F1E02080F800147047000071 +:1013600003F900421005024001000001FE4800217F +:1013700001604160018170472DE9F743044692B056 +:101380009146406813F060F940B1606813F065F968 +:1013900020B9607800F00300022801D0012000E0AD +:1013A0000020F14E3072484613F00AF918B11020AF +:1013B00015B0BDE8F0834946012001F018FF002870 +:1013C000F6D101258DF842504FF4C050ADF84000E1 +:1013D000002210A9284606F04BFC0028E8D18DF821 +:1013E00042504FF428504FF00008ADF840004746F7 +:1013F0001C216846CDF81C8023F04DFC9DF81C0094 +:1014000008AA20F00F00401C20F0F00010308DF8EA +:101410001C0020788DF81D0061789DF81E0061F396 +:10142000420040F001008DF81E009DF800000AA95E +:1014300040F002008DF800002089ADF83000ADF8D2 +:101440003270608907AFADF834000B97606810AC5C +:101450000E900A94684606F000FA0028A8D1BDF85C +:10146000200030808DF8425042F60120ADF8400057 +:101470009DF81E0008AA20F00600801C20F0010044 +:101480008DF81E000220ADF83000ADF8340013A82E +:101490000E900AA9684606F0E0F9002888D1BDF848 +:1014A00020007080311D484600F033F9002887D1B4 +:1014B0008DF8425042F6A620ADF840001C21684647 +:1014C000CDF81C8023F0E7FB9DF81C00ADF83450EC +:1014D00020F00F00401C20F0F00010308DF81C00B0 +:1014E0009DF81D0008AA20F0FF008DF81D009DF852 +:1014F0001E000AA920F0060040F00100801C8DF8B3 +:101500001E009DF800008DF8445040F002008DF858 +:101510000000CDE90A4711A80E90ADF8305068469A +:1015200006F09BF9002899D1BDF82000F08000203A +:101530003EE73EB504460820ADF80000204613F013 +:101540003FF808B110203EBD2146012001F04FFEBA +:101550000028F8D12088ADF804006088ADF80600B6 +:10156000A088ADF80800E088ADF80A007E4801AB1D +:101570006A468088002106F075FDBDF80010082934 +:10158000E1D003203EBD1FB5044600200290082094 +:10159000ADF80800CDF80CD0204613F011F810B1CA +:1015A000102004B010BD704802AA81884FF6FF7069 +:1015B00006F09AFF0028F4D1BDF80810082901D0E0 +:1015C0000320EEE7BDF800102180BDF80210618015 +:1015D000BDF80410A180BDF80610E180E1E701B577 +:1015E00082B00220ADF800005F4802AB6A46408836 +:1015F000002106F037FDBDF80010022900D00320BD +:101600000EBD1CB5002100910221ADF80010019023 +:1016100012F0FCFF08B110201CBD53486A464188F7 +:101620004FF6FF7006F060FFBDF800100229F3D0FE +:1016300003201CBDFEB54C4C06461546207A0F46CD +:10164000C00705D0084612F0BBFF18B11020FEBD40 +:101650000F20FEBDF82D01D90C20FEBD304612F042 +:10166000AFFF18BB208801A905F040FE0028F4D187 +:1016700030788DF80500208801A906F0D2FC0028FA +:10168000EBD100909DF800009DF8051040F002009D +:101690008DF80000090703D040F008008DF8000025 +:1016A0002088694606F05AFC0028D6D1ADF80850CB +:1016B00020883B4602AA002106F0D4FCBDF80810A1 +:1016C000A942CAD00320FEBD7CB50546002000908B +:1016D00001900888ADF800000C462846019512F0EC +:1016E000B3FF18B9204612F091FF08B110207CBD5D +:1016F00015B1BDF8000050B11B486A4601884FF68D +:10170000FF7006F0F1FEBDF8001021807CBD0C20BA +:101710007CBD30B593B0044600200D4600901421E6 +:1017200001A823F0B8FA1C2108A823F0B4FA9DF808 +:101730000000CDF808D020F00F00401C20F0F00091 +:1017400010308DF800009DF8010020F0FF008DF8AA +:1017500001009DF8200040F002008DF820000120DB +:101760008DF8460002E000000C02002042F6042042 +:10177000ADF8440011A801902088ADF83C006088C5 +:10178000ADF83E00A088ADF84000E088ADF842001A +:101790009DF8020006AA20F00600801C20F001003F +:1017A0008DF802000820ADF80C00ADF810000FA86D +:1017B000059001A908A806F050F8002803D1BDF84B +:1017C00018002880002013B030BD0000F0B5007B69 +:1017D000059F1E4614460D46012800D0FFDF0C2051 +:1017E00030803A203880002C08D0287A032806D090 +:1017F000287B012800D0FFDF17206081F0BDA88979 +:10180000FBE72DE9F04786B0144691F80C900E9A4C +:101810000D46B9F1010F0BD01021007B2E8A8846AE +:10182000052807D0062833D0FFDF06B0BDE8F087D3 +:101830000221F2E7E8890C2100EB400001EB4000B7 +:10184000188033201080002CEFD0E88960810027B9 +:101850001AE00096688808F1020301AA696900F09D +:1018600084FF06EB0800801C07EB470186B204EBFF +:101870004102BDF8040090810DF1060140460E3290 +:1018800010F074FF7F1CBFB26089B842E1D8CCE78A +:1018900034201080E889B9F1010F11D0122148439A +:1018A0000E301880002CC0D0E88960814846B9F11C +:1018B000010F00D00220207300270DF1040A1FE061 +:1018C0000621ECE70096688808F1020301AA69691D +:1018D00000F04BFF06EB0800801C86B2B9F1010F47 +:1018E00012D007EBC70004EB4000BDF80410C18123 +:1018F00010220AF10201103023F02CF97F1CBFB234 +:101900006089B842DED890E707EB470104EB41025B +:10191000BDF80400D0810AF102014046103210F0F7 +:1019200025FFEBE72DE9F0470E4688B090F80CC094 +:1019300096F80C80378AF5890C20109902F10C0476 +:101940004FF0000ABCF1030F08D0BCF1040F3ED0E9 +:10195000BCF1070F7DD0FFDF08B067E705EB850C12 +:1019600000EB4C00188031200880002AF4D0A8F148 +:10197000060000F0FF09558125E0182101A823F099 +:101980008AF900977088434601AA716900F0EDFE5C +:10199000BDF804002080BDF80600E080BDF8080016 +:1019A0002081A21C0DF10A01484610F0DFFEB9F1BA +:1019B000000F00D018B184F804A0A4F802A007EB2F +:1019C000080087B20A346D1EADB2D6D2C4E705EB6B +:1019D000850C00EB4C00188032200880002ABBD018 +:1019E000A8F1050000F0FF09558137E000977088E5 +:1019F000434601AA716900F0B8FE9DF80600BDF8E3 +:101A00000410E1802179420860F3000162F3410192 +:101A1000820862F38201C20862F3C301020962F321 +:101A20000411420962F34511820962F386112171A2 +:101A3000C0096071BDF80700208122460DF109013F +:101A4000484610F093FE18B184F802A0A4F800A054 +:101A500000E007E007EB080087B20A346D1EADB264 +:101A6000C4D279E7A8F1020084B205FB08F000F1C6 +:101A70000E0CA3F800C035230B80002AA6D0558198 +:101A80009481009783B270880E32716900F06DFE08 +:101A900062E72DE9F84F1E460A9D0C4681462AB1A1 +:101AA000607A00F58070D080E089108199F80C0090 +:101AB0000C274FF000084FF00E0A0D2873D2DFE814 +:101AC00000F09E070E1C28303846556A7373730069 +:101AD000214648460095FFF779FEBDE8F88F207B48 +:101AE0009146082802D0032800D0FFDF378030203D +:101AF0000AE000BFA9F80A80EFE7207B914604289E +:101B000000D0FFDF378031202880B9F1000FF1D1FC +:101B1000E3E7207B9146042800D0FFDF37803220A6 +:101B2000F2E7207B9146022800D0FFDF3780332088 +:101B3000EAE7207B1746022800D0FFDF3420A6F812 +:101B400000A02880002FC8D0A7F80A80C5E7207B16 +:101B50001746042800D0FFDF3520A6F800A0288013 +:101B6000002FBAD04046A7F80A8012E0207B174623 +:101B7000052802D0062800D0FFDF10203080362054 +:101B80002880002FA9D0E0897881A7F80E80B9F8C5 +:101B90000E00B881A1E7207B9146072800D0FFDF27 +:101BA00037803720B0E72AE04FF0120018804FF05E +:101BB00038001700288090D0E0897881A7F80E803F +:101BC000A7F8108099F80C000A2805D00B2809D036 +:101BD0000C280DD0FFDF80E7207B0A2800D0FFDF34 +:101BE00001200AE0207B0B2800D0FFDF042004E066 +:101BF000207B0C2800D0FFDF052038736DE7FFDF66 +:101C00006BE770B50C46054601F025FC20B1007865 +:101C1000222804D2082070BD43F2020070BD0521C5 +:101C200028460FF021F8206008B1002070BD032085 +:101C300070BD30B44880087820F00F00C01C20F040 +:101C4000F000903001F8080B1DCA81E81D0030BC7F +:101C500007F0E7BB2DE9FF4784B0002782460297D3 +:101C600007989046894612300AF048F9401D20F046 +:101C70000306079828B907A95046FFF7C2FF0028B6 +:101C800054D1B9F1000F05D00798017B19BB052588 +:101C900004681BE098F80000092803D00D2812D032 +:101CA000FFDF46E0079903254868B0B3497B4288C7 +:101CB0007143914239D98AB2B3B2011D0EF047FE89 +:101CC0000446078002E0079C042508340CB12088F4 +:101CD00010B1032D29D02CE00798012112300AF011 +:101CE0003FF9ADF80C00024602AB2946504608F019 +:101CF000F4F9070001D1A01C029007983A4612306F +:101D0000C8F80400A8F802A003A94046029B0AF004 +:101D100034F9D8B10A2817D200E006E0DFE800F075 +:101D200007091414100B0D141412132014E60020CC +:101D300012E6112010E608200EE643F203000BE63F +:101D4000072009E60D2007E6032005E6BDF80C0094 +:101D50002346CDE900702A465046079900F015FD4C +:101D600057B9032D08D10798B3B2417B406871433E +:101D70008AB2011D0EF0FFFDB9F1000FD7D007990F +:101D800081F80C90D3E72DE9FE4F91461A881C4646 +:101D90008A468046FAB102AB494608F09EF9050032 +:101DA00019D04046A61C27880FF0A2F83246072615 +:101DB00029463B4600960EF0B0FC20882346CDE92C +:101DC00000504A465146404600F0DFFC002020808B +:101DD0000120BDE8FE8F0020FBE710B586B01C4651 +:101DE000AAB104238DF800301388ADF8083052886A +:101DF000ADF80A208A788DF80E200988ADF80C100D +:101E000000236A462146FFF725FF06B010BD1020CB +:101E1000FBE770B50D4605210EF026FF040000D14A +:101E2000FFDF294604F11200BDE870400AF081B8D6 +:101E30002DE9F8430D468046002607F0EFFA0446E8 +:101E40002878102878D2DFE800F0773B345331311E +:101E5000123131310831313131312879001FC0B2AE +:101E6000022801D0102810D114BBFFDF35E004B9DF +:101E7000FFDF052140460EF0F7FE007B032806D069 +:101E800004280BD0072828D0FFDF072655E0287943 +:101E9000801FC0B2022820D050B1F6E72879401F39 +:101EA000C0B2022819D0102817D0EEE704B9FFDF1E +:101EB00013E004B9FFDF287901280ED1172137E09C +:101EC000052140460EF0D0FE070000D1FFDF07F1EC +:101ED000120140460AF00AF82CB12A462146404633 +:101EE000FFF7A7FE29E01321404602F0A9FD24E0F8 +:101EF00004B9FFDF052140460EF0B6FE060000D112 +:101F0000FFDF694606F1120009F0FAFF060000D073 +:101F1000FFDFA988172901D2172200E00A46BDF881 +:101F20000000824202D9014602E005E01729C5D32C +:101F3000404600F03AFCD0E7FFDF3046BDE8F883CA +:101F4000401D20F0030219B102FB01F0001D00E06A +:101F500000201044704713B5009848B1002468462B +:101F60000EF09FFC002C02D1F74A009911601CBDB5 +:101F700001240020F4E72DE9F0470C461546242102 +:101F8000204622F088FE05B9FFDFA8786073288814 +:101F9000DFF8B4A3401D20F00301AF788946DAF8DA +:101FA00000000EF09CFC060000D1FFDF4FF000089F +:101FB0002660A6F8008077B109FB07F1091D0AD059 +:101FC000DAF800000EF08BFC060000D1FFDF66603F +:101FD000C6F8008001E0C4F80480298804F11200EA +:101FE000BDE8F04709F074BF2DE9F047804601F1E4 +:101FF00012000D46814609F081FF401DD24F20F0AE +:1020000003026E7B1446296838680EF093FC3EB1DB +:1020100004FB06F2121D03D0696838680EF08AFCD2 +:1020200005200EF0C9FD044605200EF0CDFD201A56 +:10203000012802D138680EF047FC49464046BDE809 +:10204000F04709F05ABF70B5054605210EF00CFEA9 +:10205000040000D1FFDF04F112012846BDE8704002 +:1020600009F044BF2DE9F04F91B04FF0000BADF8EF +:1020700034B0ADF804B047880C46054692460521B9 +:1020800038460EF0F1FD060000D1FFDF24B1A78035 +:10209000A4F806B0A4F808B0297809220B20B2EB06 +:1020A000111F7DD12A7A04F1100138274FF00C0856 +:1020B0004FF001090391102A73D2DFE802F072F2A7 +:1020C000F1F07F08D2888D9F3DDBF3EEB6B6307B12 +:1020D000022800D0FFDFA88908EBC001ADF804108A +:1020E0003021ADF83410002C25D06081B5F80E9069 +:1020F00000271DE004EBC708317C88F80E10F18939 +:10210000A8F80C10CDF800906888042304AA296967 +:1021100000F02BFBBDF81010A8F8101009F1040016 +:10212000BDF812107F1C1FFA80F9A8F81210BFB278 +:102130006089B842DED80DE1307B022800D0FFDF95 +:10214000E98908EBC100ADF804003020ADF8340097 +:10215000287B0A90001FC0B20F90002CEBD0618149 +:10216000B5F81090002725E0CDF8009068886969DF +:1021700003AA0A9B00F0F9FA0A9804EBC70848443E +:102180001FFA80F908F10C0204A90F9810F0EEFA7A +:1021900018B188F80EB0A8F80CB0BDF80C1001E02A +:1021A000D4E0CFE0A8F81010BDF80E107F1CA8F8FE +:1021B0001210BFB26089B842D6D8CBE00DA800900B +:1021C00001AB224629463046FFF71BFBC2E0307BBD +:1021D000082805D0FFDF03E0307B082800D0FFDFB0 +:1021E000E8891030ADF804003620ADF83400002C3A +:1021F0003FD0A9896181F189A18127E0307B09283D +:1022000000D0FFDFA88900F10C01ADF804103721E0 +:10221000ADF83410002C2CD06081E8890090AB8997 +:10222000688804F10C02296956E0E88939211030E8 +:1022300080B2ADF80400ADF83410002C74D0A98938 +:102240006181287A0E280AD002212173E989E1816F +:10225000288A0090EB8968886969039A3CE001212B +:10226000F3E70DA8009001AB224629463046FFF760 +:1022700059FB6FE0307B0A2800D0FFDF1220ADF859 +:102280000400ADF834704CB3A9896181A4F810B092 +:10229000A4F80EB084F80C905CE020E002E031E09D +:1022A00039E042E0307B0B2800D0FFDF288AADF810 +:1022B00034701230ADF8040084B104212173A9896F +:1022C0006181E989E181298A2182688A00902B8ACB +:1022D000688804F11202696900F047FA3AE0307B3D +:1022E0000C2800D0FFDF1220ADF80400ADF83470E8 +:1022F0003CB305212173A4F80AB0A4F80EB0A4F8E9 +:1023000010B027E00DA8009001AB224629463046C8 +:10231000FFF75CFA1EE00DA8009001AB22462946AB +:102320003046FFF7B6FB15E034E03B21ADF8040082 +:10233000ADF8341074B3A4F80690A4F808B084F88B +:102340000AB007E0FFDF05E010000020297A01292C +:1023500017D0FFDFBDF80400AAF800006CB1BDF88B +:1023600034002080BDF804006080BDF834003928B6 +:1023700003D03C2801D086F80CB011B00020BDE895 +:10238000F08F3C21ADF80400ADF8341014B1697A37 +:10239000A172DFE7AAF80000EFE72DE9F8435688BD +:1023A0000F4680461546052130460EF05DFC0400C0 +:1023B00000D1FFDF123400943B46414630466A6844 +:1023C00009F00FFFBAE570B50D4605210EF04CFC83 +:1023D000040000D1FFDF294604F11200BDE870407F +:1023E00009F099BD70B50D4605210EF03DFC0400C5 +:1023F00000D1FFDF294604F11200BDE8704009F06A +:10240000B7BD70B5054605210EF02EFC040000D1C5 +:10241000FFDF04F1080321462846BDE8704004228E +:10242000B1E470B5054605210EF01EFC040000D194 +:10243000FFDF214628462368BDE870400522A2E45C +:1024400070B5064605210EF00FFC040000D1FFDF39 +:1024500004F1120009F052FD401D20F0030511E0C7 +:10246000011D00880322431821463046FFF78BFCEC +:1024700000280BD0607BABB2684382B26068011D5C +:102480000EF0AFFA606841880029E9D170BD70B5DF +:102490000E46054606F0C2FF040000D1FFDF012012 +:1024A000207266726580207820F00F00C01C20F03A +:1024B000F00030302070BDE8704006F0B2BF2DE96A +:1024C000F0438BB00D461446814606A9FFF799FBF1 +:1024D000002814D14FF6FF7601274FF420588CB115 +:1024E00003208DF800001020ADF8100007A805901B +:1024F00007AA204604A910F058F978B107200BB0BC +:10250000BDE8F0830820ADF808508DF80E708DF806 +:102510000000ADF80A60ADF80C800CE00698A178D8 +:1025200001742188C1818DF80E70ADF80850ADF8A6 +:102530000C80ADF80A606A4602214846069BFFF708 +:1025400089FBDCE708B501228DF8022042F6020281 +:10255000ADF800200A4603236946FFF73EFC08BD9C +:1025600008B501228DF8022042F60302ADF80020E2 +:102570000A4604236946FFF730FC08BD00B587B062 +:1025800079B102228DF800200A88ADF80820498828 +:10259000ADF80A1000236A460521FFF75BFB07B080 +:1025A00000BD1020FBE709B1072316E407207047A0 +:1025B00070B588B00D461446064606A9FFF721FB04 +:1025C00000280ED17CB10620ADF808508DF800002F +:1025D000ADF80A40069B6A460821DC813046FFF7C9 +:1025E00039FB08B070BD05208DF80000ADF808502B +:1025F000F0E700B587B059B107238DF80030ADF88A +:102600000820039100236A460921FFF723FBC6E750 +:102610001020C4E770B588B00C460646002506A910 +:10262000FFF7EFFA0028DCD106980121123009F0FB +:1026300097FC9CB12178062921D2DFE801F0200522 +:1026400005160318801E80B2C01EE28880B20AB14F +:10265000A3681BB1824203D90C20C2E71020C0E757 +:10266000042904D0A08850B901E00620B9E7012967 +:1026700013D0022905D004291CD005292AD007200F +:10268000AFE709208DF800006088ADF80800E08809 +:10269000ADF80A00A068039023E00A208DF800003E +:1026A0006088ADF80800E088ADF80A00A0680A2547 +:1026B000039016E00B208DF800006088ADF808004C +:1026C000A088ADF80A00E088ADF80C00A0680B25E2 +:1026D000049006E00C208DF8000060788DF808006A +:1026E0000C256A4629463046069BFFF7B3FA78E781 +:1026F00000B587B00D228DF80020ADF8081000233A +:102700006A461946FFF7A6FA49E700B587B071B1E6 +:1027100002228DF800200A88ADF808204988ADF81B +:102720000A1000236A460621FFF794FA37E71020C3 +:1027300035E770B586B0064601200D46ADF80810A5 +:102740008DF80000014600236A463046FFF782FA02 +:10275000040008D12946304605F09EFC0021304691 +:1027600005F0B8FC204606B070BDF8B51C4615460D +:102770000E46069F0EF0AAFB2346FF1DBCB2314653 +:102780002A4600940DF095FFF8BD30B41146DDE9FE +:1027900002423CB1032903D0002330BC08F026BB21 +:1027A0000123FAE71A8030BC704770B50C46054625 +:1027B000FFF72FFB2146284605F07DFC2846BDE8A3 +:1027C0007040012105F086BC4FF0E0224FF400413B +:1027D0000020C2F88011204908702049900208604A +:1027E000704730B51C4D04462878A04218BF002C15 +:1027F00002D0002818BFFFDF2878A04208BF30BDF4 +:102800002C701749154A0020ECB1164DDFF858C05E +:10281000131F012C0DD0022C1CBFFFDF30BD086040 +:1028200003200860CCF800504FF4000010601860DE +:1028300030BD086002200860CCF800504FF04070B6 +:102840001060186030BD086008604FF06070106064 +:1028500030BD00B5FFDF00BD1800002008F50140C5 +:1028600000F500408C02002014F5004070B50B20EC +:1028700000F0B5F9082000F0B2F900210B2000F0BB +:10288000C4F90021082000F0C0F9EC4C0125656076 +:10289000A5600020C4F84001C4F84401C4F8480110 +:1028A0000B2000F0A7F9082000F0A4F90B2000F09D +:1028B0008BF9256070BD10B50B2000F090F9082051 +:1028C00000F08DF9DD48012141608160DC490A6832 +:1028D000002AFCD10021C0F84011C0F84411C0F812 +:1028E00048110B2000F086F9BDE81040082000F0E8 +:1028F00081B910B50B2000F07DF9BDE8104008202B +:1029000000F078B900B530B1012806D0022806D011 +:10291000FFDF002000BDCB4800BDCB4800BDCA484A +:10292000001D00BD70B5C9494FF000400860C84D9A +:10293000C00BC5F80803C74800240460C5F840412F +:102940000820C43500F04BF9C5F83C41C24804707A +:1029500070BD08B5B94A002128B1012811D002285C +:102960001CD0FFDF08BD4FF48030C2F80803C2F866 +:102970004803B3483C300160C2F84011BDE808404C +:10298000D0E74FF40030C2F80803C2F84803AC485F +:1029900040300160C2F84411AB480CE04FF4802095 +:1029A000C2F80803C2F84803A54844300160C2F8E1 +:1029B0004811A548001D0068009008BD70B5164676 +:1029C0000D460446022800D9FFDF00229B48012360 +:1029D00004F110018B4000EB8401C1F8405526B191 +:1029E000C1F84021C0F8043303E0C0F80833C1F84F +:1029F0004021C0F8443370BD2DE9F0411C46154616 +:102A000030B1012834D0022839D0FFDFBDE8F08191 +:102A1000891E002221F07F411046FFF7CFFF012CD5 +:102A200024D000208C4E8A4F012470703C6189496B +:102A300000203C3908600220091D086085490420F7 +:102A40003039086083483D350560C7F800420820EA +:102A500000F0D0F82004C7F80403082000F0B4F810 +:102A60007A49E007091F08603470CFE70120D9E7F1 +:102A7000012B02D00022012005E00122FBE7012BFF +:102A800004D000220220BDE8F04197E70122F9E7D7 +:102A90006B480068704770B500F0C7F8674C054692 +:102AA000D4F840010026012809D1D4F80803C00356 +:102AB00005D54FF48030C4F80803C4F84061D4F859 +:102AC000440101280CD1D4F80803800308D54FF441 +:102AD0000030C4F80803C4F84461012010F029FE56 +:102AE000D4F8480101280CD1D4F80803400308D5D4 +:102AF0004FF48020C4F80803C4F84861022010F0A5 +:102B000018FE5648056070BD70B500F08EF8524D45 +:102B10000446287858B1FFF705FF687820B10020F7 +:102B200085F8010010F005FE4C48046070BD0320DC +:102B3000F8E74FF0E0214FF40010C1F800027047B1 +:102B4000152000F057B8424901200861082000F024 +:102B500051B83F494FF47C10C1F8080300200246E9 +:102B600001EB8003C3F84025C3F84021401CC0B2EC +:102B70000628F5D37047410A43F609525143C0F382 +:102B8000080010FB02F000F5807001EB5020704748 +:102B900010B5430B48F2376463431B0C5C020C60B6 +:102BA0002F4C03FB04002F4B4CF2F72443435B0DE7 +:102BB00013FB04F404EB402000F580704012107009 +:102BC00008681844086010BD00F01F020121914000 +:102BD0004009800000F1E020C0F80011704700F0CB +:102BE0001F02012191404009800000F1E020C0F85F +:102BF0008011704700F01F020121914040098000C0 +:102C000000F1E020C0F8801270474907090E002843 +:102C100006DA00F00F0000F1E02080F8141D704784 +:102C200000F1E02080F8001470470C48001F006895 +:102C30000A4A0D49121D11607047000000B00040A3 +:102C400004B500404081004044B1004008F5014017 +:102C500000800040408500403800002014050240FC +:102C6000F7C2FFFF6F0C0100010000010A4810B518 +:102C70000468094909480831086010F0EEFD06486B +:102C8000001D046010BD0649002008604FF0E021DF +:102C90000220C1F8800270471005024001000001C7 +:102CA000FC1F004010B50D2000F06FF8C4B26FF0AB +:102CB000040000F06AF8C0B2844200D0FFDF3A4955 +:102CC0000120086010BD70B50D2000F048F8374CA9 +:102CD0000020C4F800010125C4F804530D2000F0C1 +:102CE00049F825604FF0E0216014C1F8000170BD83 +:102CF00010B50D2000F033F82C480121416000216F +:102D0000C0F80011BDE810400D2000F033B828488D +:102D100010B5046826492748083108602349D1F8CE +:102D20000001012804D0FFDF2148001D046010BD10 +:102D30001D48001D00680022C0B2C1F8002111F03A +:102D400039F9F1E710B51948D0F800110029FBD086 +:102D5000FFF7DDFFBDE810400D2000F00BB800F0DC +:102D60001F02012191404009800000F1E020C0F8DD +:102D70008011704700F01F0201219140400980003E +:102D800000F1E020C0F880127047002806DA00F059 +:102D90000F0000F1E02090F8140D03E000F1E020B6 +:102DA00090F800044009704704D5004000D000406E +:102DB000100502400100000110B5202000F082F84B +:102DC000202000F08AF84A49202081F8000449496F +:102DD00000060860091D48480860FEF79DFA45494D +:102DE000C83108604548D0F8041341F00101C0F82B +:102DF0000413D0F8041341F08071C0F804133C4967 +:102E000001201C39C1F8000110BD10B5202000F0D0 +:102E100059F8384800210160001D0160354A481EFC +:102E2000E83A1060354AC2F80803324BC8331960DB +:102E3000C2F80001C2F8600131490860BDE81040E5 +:102E4000202000F04AB82B492E48EC390860704722 +:102E500028492C48E8390860704726480160001D61 +:102E6000521E0260704723490120E8390860BFF311 +:102E70004F8F704770B51F4A8069E83A2149116049 +:102E80001E49D1F8006100231F4D1D4A5C1E1EB172 +:102E9000A84206D300210FE0D1F8606186B1A842B4 +:102EA00009D2C1F80031C1F860311460BDE870404A +:102EB000202000F012B81168BDE8704021F012BF68 +:102EC000FFDF70BD00F01F0201219140400980002A +:102ED00000F1E020C0F88011704700F01F020121CE +:102EE00091404009800000F1E020C0F88012704756 +:102EF00020E000E000060240C41400200000024070 +:102F00000004024001000001006002000F4A126844 +:102F10000D498A420CD118470C4A12680A4B9A4252 +:102F200006D101B511F0C0F8FFF78DFFBDE80140F3 +:102F3000074909680958084706480749054A064BE2 +:102F40007047000000000000BEBAFECAB0000020BA +:102F500004000020E0120020E012002070B50C46B2 +:102F6000054609F0DBFA21462846BDE870400AF024 +:102F7000C0BB10B511F01EFDFFF726FC11F09EFB43 +:102F8000BDE8104011F050BC012081070860704777 +:102F9000012081074860704712480068C00700D0D0 +:102FA000012070470F48001F0068C00700D00120B3 +:102FB00070470C4808300068C00700D001207047F7 +:102FC000084810300068704706490C310A68D2037F +:102FD00006D5096801F00301814201D10120704743 +:102FE000002070470C0400407047704770477047DE +:102FF000704770477047704770470004050600002F +:103000002CFFFFFFDBE5B15100600200A900FFFFCC +:103010008C000000808D5B0016425791AD5F58BC5C +:103020008E702F5A0FAA100DBCD52BFD30B5FC4D5C +:103030000446062CA9780ED2DFE804F0030E0E0E2B +:103040000509FFDF08E0022906D0FFDF04E00329BD +:1030500002D0FFDF00E0FFDFAC7030BD30B50446CA +:103060001038EF4D07280CD2DFE800F0040C060CF6 +:103070000C0C0C00FFDF05E0287E112802D0FFDFDA +:1030800000E0FFDF2C7630BD2DE9F0410FF0F8FCB9 +:10309000044610F08CFE201AC5B206200DF08CFDFF +:1030A000044606200DF090FD211ADD4C207E1228EA +:1030B00018D000200F1807200DF07EFD06460720CF +:1030C0000DF082FD301A3918207E13280CD0002014 +:1030D0000144A078042809D000200844281AC0B26E +:1030E000BDE8F0810120E5E70120F1E70120F4E7E8 +:1030F000CB4810B590F825004108C94800F12600DA +:1031000005D00BF0EBFABDE8104005F0B3BF0BF0B3 +:10311000BEFAF8E730B50446A1F120000D460A28B2 +:103120004AD2DFE800F005070C1C2328353A3F445B +:10313000FFDF42E0207820283FD1FFDF3DE0B848A4 +:103140008178052939D0007E122836D020782428AD +:1031500033D0252831D023282FD0FFDF2DE0207851 +:1031600022282AD0232828D8FFDF26E0207822280A +:1031700023D0FFDF21E0207822281ED024281CD075 +:1031800026281AD0272818D0292816D0FFDF14E0C7 +:103190002078252811D0FFDF0FE0207825280CD0DB +:1031A000FFDF0AE02078252807D0FFDF05E0207840 +:1031B000282802D0FFDF00E0FFDF257030BD10B50A +:1031C000012803D0022805D0FFDF10BDBDE8104064 +:1031D00003202BE79248007E122800D0FFDF002159 +:1031E000052011F0A1F9BDE81040112036E71FB508 +:1031F00004466A46002001F01FFEB4B1BDF802206B +:103200004FF6FF700621824201D1ADF80210BDF8E1 +:103210000420824201D1ADF80410BDF808108142AB +:1032200003D14FF44860ADF8080068460CF06AF925 +:1032300005F020FF04B010BD70B514460D460646DB +:1032400011F0BEF958B90DB1A54201D90C2070BDDD +:10325000002408E056F8240011F0B2F908B110205B +:1032600070BD641CE4B2AC42F4D3002070BD2DE903 +:10327000F04105461F4690460E460024006811F0B6 +:10328000ECF908B110202BE728680028A88802D0A4 +:10329000B84202D84FE00028F5D0092020E728687E +:1032A000025DB2B1611C475C152F2DD03BDC3AD2D8 +:1032B000DFE807F03912222228282A2A3131393949 +:1032C00039393939393939392200025D32BB641C48 +:1032D000A4B2A142F9D833E0022ADED1A21C805C5C +:1032E00088F80000072801D2400701D40A20F7E639 +:1032F000307840F0010015E0D043C00707E0012A14 +:1033000007D010E00620EBE61007A0F1805000285F +:10331000F5D01846E4E63078820701D50B20DFE6C9 +:1033200040F0020030702868005D084484B2A8882C +:10333000A04202D2B1E74FF4485381B2A142AED8C5 +:103340000020CDE610B5027843F202235408012292 +:10335000022C12D003DC3CB1012C16D106E0032C68 +:1033600010D07F2C11D112E0002011E080790324CD +:10337000B4EB901F09D10A700BE08079B2EB901F7B +:1033800003D1F8E780798009F5D0184610BDFF20F9 +:103390000870002010BD224991F82E2042B191F80A +:1033A0002F10022909D0032909D043F202207047C7 +:1033B00001461B48253001F092BD032100E00121A8 +:1033C00001700020704738B50C460546694601F08B +:1033D00086FD00280DD19DF80010207861F347008C +:1033E000207055F8010FC4F80100A888A4F8050062 +:1033F000002038BD38B51378B0B1022814D0FF28AA +:103400001BD008A46D46246800944C7905EB9414F5 +:10341000247864F34703137003280AD010E00000F7 +:10342000D80100200302FF0123F0FE0313700228DD +:10343000F2D1D8B240F0010005E043F0FE00107078 +:10344000107820F0010010700868C2F80100888828 +:10345000A2F8050038BD02210DF006BC38B50C46B7 +:103460000978222901D2082038BDADF800008DF876 +:10347000022068460BF079F905F0FCFD050003D148 +:1034800021212046FFF746FE284638BD1CB5002006 +:103490008DF80000CDF80100ADF80500FE4890F869 +:1034A0002E00022801D0012000E000208DF8070046 +:1034B00068460BF092FB002800D0FFDF1CBD002205 +:1034C0000A80437892B263F345120A8043785B081E +:1034D00063F386120A8000780C282BD2DFE800F014 +:1034E0002A06090E1116191C1F220C2742F0110082 +:1034F00009E042F01D0008800020704742F01100F2 +:1035000012E042F0100040F00200F4E742F0100038 +:10351000F1E742F00100EEE742F0010004E042F082 +:103520000200E8E742F0020040F00400E3E742F066 +:103530000400E0E7072070472DE9FF478AB0002527 +:10354000BDF82C6082461C4691468DF81C507007D1 +:1035500003D5606811F034F868B9CF4F4FF0010817 +:1035600097F82E0058B197F82F00022807D160680D +:1035700011F073F818B110200EB0BDE8F0873007D5 +:1035800002D5A08980283DD8700705D4B9F1000F75 +:1035900002D097F8240098B3E07DC0F300108DF8B6 +:1035A0001B00627D072003215AB3012A2CD0022A76 +:1035B000E2D0042AE0D18DF81710F00627D4A27DBE +:1035C000072022B3012A22D0022A23D0042AD3D1F1 +:1035D0008DF819108DF81590606810B307A9FFF7E2 +:1035E000B1FE0028C8D19DF81C00FF2816D06068E5 +:1035F00050F8011FCDF80F108088ADF8130014E0CB +:1036000000E001E00720B7E78DF81780D5E78DF8D7 +:103610001980DFE702208DF81900DBE743F2022072 +:10362000AAE7CDF80F50ADF81350E07B40B9207CED +:1036300030B9607C20B9A07C10B9E07CC00601D014 +:10364000062099E78DF800A0BDF82C00ADF8020027 +:10365000A0680190A068029004F10F0001F033FC13 +:103660008DF80C000DF10D00FFF795FE00B1FFDFA6 +:103670009DF81C008DF80E008DF816508DF818502E +:10368000E07D08A900F00F008DF81A0068460CF0E4 +:10369000F8F805F0EFFC6FE7F0B59DB000228DF86B +:1036A00068208DF858208DF8602005468DF86C2034 +:1036B000129213921492159219B10FC912AC84E8A8 +:1036C0000F00754CA078052801D004280CD1129861 +:1036D0006168884200D120B91498E168884203D11A +:1036E00010B108201DB0F0BD1F26334618AA1AA934 +:1036F00012A8FFF7BCFD0028F4D133461BAA16A977 +:1037000014A8FFF7B4FD0028ECD19DF85800C007BD +:1037100001D00A20E6E7A08A410708D4A17D31B193 +:103720009DF86010890702D043F20120DAE79DF886 +:103730006010C90709D0400707D4208818B144F2A7 +:103740005061884201D90720CCE78DF8005003264C +:103750008DF8016001278DF80270BDF84C208DF8BE +:10376000032001A8129921F0F5F968460CF0F0F851 +:1037700005F080FC0028B5D18DF824508DF8256027 +:103780008DF82670BDF854208DF827200AA81499CA +:1037900021F0E0F909A80CF028F905F06BFC0028ED +:1037A000A0D112AD241D95E80F0084E80F00002081 +:1037B00098E770B586B00D46040005D010F04DFFB7 +:1037C00020B1102006B070BD0820FBE72078C107AB +:1037D000A98802D0FF2902D303E01F2901D20920C2 +:1037E000F0E7800761D4FFF74FFC38B12078C0F3D1 +:1037F000C101012904D0032902D005E01320E1E72B +:10380000254991F8241041B1C0074FF000054FF051 +:10381000010604D08DF80F6003E00720D2E78DF891 +:103820000F506846FFF7B7FD00B1FFDF2078C0F307 +:10383000C1008DF801008DF80250607808B98DF84C +:1038400002606078C00705D09DF8020040F00100DA +:103850008DF802006078800705D59DF8020040F0E1 +:1038600002008DF802006078400705D59DF802003F +:1038700040F004008DF802002078C0F380008DF83D +:1038800003006088ADF80600A088ADF80A00207A31 +:1038900058B9607A48B901E0D8010020A07A20B96F +:1038A000E07A10B9207BC00601D006208AE704F137 +:1038B000080001F008FB8DF80E0068460BF090FA46 +:1038C00005F0D8FB00288BD18DF810608DF81150D1 +:1038D000ADF81250ADF8145004A80BF0CBFA05F077 +:1038E000C9FB00288BD1E08864280AD248B10120A6 +:1038F00001F0FFFA002891D12078C00705D01520EB +:1039000004E06421B0FBF1F0F2E71320FFF7A6FB1F +:10391000002057E72DE9FF470220FF4E8DF80400F5 +:103920000027708EADF80600B84643F202094CE05D +:1039300001A80DF000F9050006D0708EA8B3A6F816 +:103940003280ADF806803EE0039CA07F01072DD5B4 +:1039500004F124000090A28EBDF80800214604F175 +:10396000360301F056FC050005D04D452AD0112D37 +:103970003CD0FFDF3AE0A07F20F00801E07F420862 +:1039800062F3C711A177810861F30000E07794F832 +:10399000210000F01F0084F820002078282826D17C +:1039A00029212046FFF7B6FB21E014E040070AD5A5 +:1039B000BDF8080004F10E0101F0A9FA05000DD0D0 +:1039C0004D4510D100257F1CFFB202200DF0F4F808 +:1039D000401CB842ACD8052D11D008E0A07F20F0E3 +:1039E0000400A07703E0112D00D0FFDF0025BDF813 +:1039F00006007086052D04D0284604B0BDE5A6F863 +:103A000032800020F9E770B50646FFF724FD054631 +:103A100005F004FD040000D1FFDF6680207820F06F +:103A20000F00801C20F0F000203020700620207253 +:103A300095F83E006072BDE8704005F0F2BC2DE9DB +:103A4000F04786B0040000D1FFDF2078B24D20F0AF +:103A50000F00801C20F0F00070302070606801784A +:103A6000491F1B2933D2DFE801F0FE32323255FD07 +:103A7000320EFDFD42FC32323278FCFCFB32323237 +:103A8000FCFCFAF9FC00C6883046FFF7E4FC05466A +:103A9000304607F0A9F8E0B16068007A85F83E008A +:103AA00021212846FFF736FB3046FEF7CCFA304698 +:103AB00003F018FE3146012010F036FDA87F20F0FB +:103AC0001000A877FFF726FF002800D0FFDF06B020 +:103AD00053E5207820F0F00020302070062020727E +:103AE00066806068007A607205F09BFCD8E7C58844 +:103AF0002846FFF7B0FC00B9FFDF606800790128B5 +:103B000000D0FFDF6068017A06B02846BDE8F047C4 +:103B100007F046BCC6883046FFF79DFC050000D183 +:103B2000FFDF05F07EFC606831460089288160680F +:103B30004089688160688089A881012010F0F4FCC8 +:103B40000020A875A87F00F003000228BFD1FFF76E +:103B5000E1FE0028BBD0FFDFB9E70079022811D0D1 +:103B600000B1FFDF05F05DFC6668B6F806A0307AAC +:103B7000361D01280CD0687E814605F0E7F9070064 +:103B800009D107E006B00220BDE8F047FFF717BBF8 +:103B9000E878F1E7FFDF0022022150460DF05BF8E4 +:103BA000040000D1FFDF22212046FFF7B3FA30796D +:103BB000012800D00220A17F804668F30101A1778F +:103BC000308B2081708B6081B08BA08184F8229033 +:103BD0008DF80880B8680090F86801906A46032163 +:103BE00050460DF038F800B9FFDFB888ADF8100086 +:103BF000B8788DF8120004AA052150460DF02BF874 +:103C000000B9FFDFB888ADF80C00F8788DF80E0029 +:103C100003AA042150460DF01EF800B9FFDF06216B +:103C200006F1120001F091F938B37079800700D5E0 +:103C3000FFDF7179E07D61F34700E075D6F806009B +:103C4000A0617089A083062106F10C0001F07DF9C6 +:103C5000E8B195F825004108607805E032E02AE0F7 +:103C600047E03FE021E035E061F347006070D5F8C0 +:103C70002600C4F80200688D12E0E07D20F0FE000E +:103C8000801CE075D6F81200A061F08ADAE760784F +:103C900020F0FE00801C6070F068C4F80200308ADA +:103CA000E0804046FFF78BFA11E706B02046BDE8FA +:103CB000F04701F037BD05F0B4FB15F8300F40F0C8 +:103CC000020005E005F0ADFB15F8300F40F00400F0 +:103CD0002870FCE6287E132809D01528E4D1162088 +:103CE000FFF7BCF906B0BDE8F04705F09ABB142019 +:103CF000F6E7A978052909D00429D5D105F091FB6B +:103D0000022006B0BDE8F047FFF790B9007900281F +:103D1000CAD0E87802E00000D801002001F0BAF82B +:103D200005F07FFB0320ECE72DE9F05F0546007806 +:103D30004FF000080009DFF820A891460C464646DF +:103D400001287AD001274FF0020C4FF6FF730228AA +:103D500074D007280BD00A2871D0FFDFA9F80060C3 +:103D600014B1A4F8008066800020BDE8F09F696867 +:103D700004F108000A78172A70D010DC4FF0000B0D +:103D8000142A31D006DC052A6DD0092A0FD0102A5A +:103D90007ED11FE0152A7CD0162AF9D1F0E01B3A1B +:103DA000052A75D2DFE802F009C5FDDAFC00C888F3 +:103DB0004FF012081026214675E14FF01C080A2624 +:103DC000D4B38888A0806868807920726868C079D8 +:103DD0006072C3E74FF01B0814266CB303202072F7 +:103DE00068688088A080B9E70A793C2AB6D00D1DA2 +:103DF0004FF010082C26FCB16988A180298B6182C4 +:103E0000298B2182698BA182A98BE1826B79024681 +:103E1000A91D1846FFF7EEFA2879012810D084F87A +:103E20000FC0FF202076C4F81CB0C4F820B0C4F83E +:103E300024B0C4F828B091E712E013E13BE135E18A +:103E4000E7730AF1040084F818B090E80E00DAF87D +:103E50001000C4E90930C4E907127FE7A8E002E0D6 +:103E6000A9F8006080E72C264FF01D08002CF7D041 +:103E70000546A380887B2A880F1D60F300022A80F4 +:103E8000887B400860F341022A80887B800801E03B +:103E9000E6E0ADE060F382022A80887BB91CC008AE +:103EA00060F3C3022A80B87A0011401C60F3041248 +:103EB00002F07F0028807878AA1CFFF79BFA387DF3 +:103EC00005F1090207F11501FFF794FA387B01F0BB +:103ED0004BF82874787B01F047F86874F87EA87472 +:103EE000787AE87497F83B002875B87B6875A5F870 +:103EF00016B0DAF81C00A861397ABAF820008842B6 +:103F000001D2014610E0B87AC0F3411002280BD06C +:103F1000012809D0288820F060002880A1840A4662 +:103F200007F11C01A86998E0288820F06000403063 +:103F3000F3E711264FF02008002C91D0A380686889 +:103F400004F10A02007920726868007B6072696877 +:103F50008B1D48791946FFF74DFAFFE60A264FF008 +:103F60002108002CE9D08888A080686880792072B8 +:103F70006868C07960729AF8301021F004018BE013 +:103F80000B264FF02208002CD7D0C888A080686884 +:103F9000007920726868007A00F0E6FF607201E044 +:103FA00052E039E06868407A00F0DEFFA072D5E6A2 +:103FB0001C264FF02608002CBFD0A38068684079EB +:103FC00060726868007AA0720AF1040090E80E003E +:103FD000DAF81000C4E90530C4E903126868007912 +:103FE0003C2803D043287DD0FFDFB7E62772B5E633 +:103FF00010264FF02408002C9FD08888A080686885 +:10400000807920816868807A608168680089A081F1 +:1040100068688089E081A1E610264FF02308002C13 +:104020008BD08888A0806868C088208168680089F3 +:10403000608168684089A08168688089E0819AF819 +:10404000301021F0020127E030264FF02508002C27 +:1040500088D0A38069682822496820F07BFD7DE62E +:104060004A4677E0287A012803D0022817D0FFDFDC +:1040700074E610264FF01F08002C85D06888A080B9 +:10408000A8892081E8896081288AA081688AE081E6 +:104090009AF8301021F001018AF830105EE64FF0F6 +:1040A00012081026688800F03DFF57E62846BDE854 +:1040B000F05F01F0C1BC287A07284DD2DFE800F09C +:1040C0004C38384A4A4A040009264FF01108002C9F +:1040D00092D06F883846FFF7BEF990F822A0A780EB +:1040E000687A00E02DE02072042138460CF0CEFD05 +:1040F000052138460CF0CAFD002138460CF0C6FDFB +:10410000012138460CF0C2FD032138460CF0BEFDFB +:10411000022138460CF0BAFD062138460CF0B6FDF7 +:10412000072138460CF0B2FD504600F0B3FE15E60C +:1041300014264FF01B08002C8AD0A380287A01286F +:1041400002D084F808C009E62772DAE90710C4E94A +:10415000031003E62146A9E7FFDFFFE570B5FE4D3A +:10416000287E122801D0082070BD0BF094F904F0CD +:1041700081FF040002D1687E00F08CFE0021052042 +:1041800010F0D2F9204670BD1CB5F348007E13280C +:1041900001D208201CBD00208DF8000068460AF0FE +:1041A00069FE04F067FF0028F4D10021052010F01B +:1041B000BBF91120FEF752FF00201CBD70B501288D +:1041C00005D0052825D0062800D0FFDF70BD8DB2B0 +:1041D0002846FFF740F9040000D1FFDF20782128AE +:1041E000F4D005F01BF968B1017821F00F01891CAA +:1041F00021F0F00110310170022101724580002090 +:10420000A07528E021462846BDE870401322FFF73C +:1042100025B9D148047EA4F1120005281FD2DFE899 +:1042200000F0060303030300FFF7AEFF01E0FFF712 +:1042300095FF0028CAD105F0F1F80028C6D0017812 +:1042400021F00F01891C21F0F00120310170132CA5 +:1042500007D002210172BDE8704005F0E2B8FFDF2F +:1042600070BD0121F6E72DE9F04116460C008046AD +:1042700000D1FFDF307820F00F00801C20F0F0002C +:10428000103030702078012804D0022818D0FFDFC9 +:10429000BDE8F0814046FFF7DEF8050000D1FFDF02 +:1042A0000320A87505F0BDF894E80F00083686E8ED +:1042B0000F00A94810F8301F41F001010170E7E735 +:1042C0004046FFF7C8F8050000D1FFDFA1884FF690 +:1042D000FF700027814202D1E288824203D08142EE +:1042E00001D1E08840B105F09CF894E80F00083651 +:1042F00086E80F00AF75CBE7A87D0128C8D17823E9 +:104300000022414610F066F80220A875C0E738B5D3 +:1043100005460C46084610F053F918BB203D062D03 +:104320004AD2DFE805F0031B373C4230002106206B +:1043300010F0D0F808B1112038BDA01C0BF07EF9A8 +:1043400004F098FE050038D100220823114606200B +:1043500010F040F8062830D0FFDF2EE0606810F043 +:1043600073F908B1102038BD618820886A460BF0C7 +:104370003BFD04F07FFE05001FD16068E8B1BDF889 +:104380000010018019E0A07800F0010120880BF0F6 +:1043900061FD0EE0206801F0FDFD05460DE020788E +:1043A00000F001000AF066F903E0618820880BF054 +:1043B000A0FC04F05FFEF0E70725284638BD70B585 +:1043C00005460C46084610F021F908B1102070BDD2 +:1043D000202D07D0212D0DD0222D0BD0252D09D039 +:1043E000072070BD2088A11C0AF039FABDE8704092 +:1043F00004F040BE062070BD57482530704708B510 +:104400003421554820F047FC0120FEF70FFE112013 +:10441000FEF724FE50496846263104F095FF4E48C9 +:104420009DF8002010F8251F62F3470121F00101DB +:104430000170002141724FF46171A0F80710022150 +:104440008172FEF755FE00B1FFDFFCF78FFF01F030 +:1044500034F908BD10B50C464021204620F0F9FB88 +:10446000A07F20F00300A077202020700020A075FE +:1044700084F8230010BD70472DE9FC41074610F079 +:104480009FF810B11020BDE8FC81334E06F12501E4 +:10449000D6F825000090B6F82950ADF8045096F8EB +:1044A0002B408DF806403846FEF78DFF0028EAD1F4 +:1044B000FEF71EFE0028E6D0009946F8251FB580BD +:1044C000B471E0E710B5044610F0A0F808B1102070 +:1044D00010BD21482049224690F825002631400889 +:1044E000FEF788FF002010BDFEB50D4604004FF01A +:1044F000000712D00822FEF79FFE002812D10026E6 +:1045000009E000BF54F826006946FEF71BFF0028AB +:1045100008D1761CF6B2AE42F4D309F0AEFF10B16A +:1045200043F20320FEBD0C4E86F8247024B300270E +:104530001EE000BF54F8270002A9FEF703FF00B1F8 +:10454000FFDF9DF808008DF8000054F8270050F8B0 +:10455000011FCDF8011001E0D80100208088ADF8DE +:104560000500684609F0D3FF00B1FFDF7F1CFFB2F2 +:10457000AF42DFD386F824500020FEBD2DE9F0477E +:104580008AB01546894604001ED00F4608222946E7 +:10459000FEF752FE002810D1002613E054F8260042 +:1045A0006946103000F09BFC002806D147B157F84F +:1045B000260010F005F818B110200AB0BDE8F08709 +:1045C000761CF6B2AE42E9D30026A5F101081BE045 +:1045D00006F1010A0AF0FF0712E000BF54F82600B6 +:1045E000017C4A0854F827100B7CB2EB530F05D11D +:1045F00006221130113120F081FA58B17F1CFFB230 +:10460000AF42EBD30AF0FF064645E1DB4E4624B14C +:10461000012003E043F20520CFE7002009F0A8FFC6 +:1046200010B909F0B9FF10B143F20420C5E75CB33B +:1046300000270DF1170825E054F8270069461030CF +:1046400000F04DFC00B1FFDF54F82700102250F8B5 +:10465000111FCDF801108088ADF8050054F827101F +:104660000DF1070020F076FA96B156F827101022C7 +:10467000404620F06FFA684609F022FF00B1FFDFE4 +:104680007F1CFFB2AF42D7D3FEF700FF002094E7B4 +:10469000404601F073FCEEE730B585B004460FF0FC +:1046A0008FFF18B960680FF0D8FF10B1102005B067 +:1046B00030BD60884AF2B811884206D82078FB4D98 +:1046C00028B1012806D0022804D00720EFE7FEF722 +:1046D0000FFD18E06078022804D0032802D043F2CE +:1046E0000220E4E785F82F00C1B200200090ADF869 +:1046F000040002292CD0032927D0FFDF684609F0E7 +:10470000EDFF04F0B7FC0028D1D1606801F029FC6E +:10471000207858B101208DF800000DF1010001F062 +:104720002DFC68460BF0F5FB00B1FFDF207885F823 +:104730002E00FEF7ABFE608860B1A88580B209F05C +:104740000FFF00B1FFDF0020B1E78DF80500D5E7CE +:104750004020FAE74FF46170EFE710B504460FF020 +:1047600055FF20B9606838B10FF06EFF08B1102016 +:1047700010BD606801F002FCCC4830F82C1F61804D +:10478000C178617080782070002010BD2DE9F84359 +:104790001446894606460FF039FFA0B948460FF087 +:1047A0005CFF80B920460FF058FF60B9BF4DA87874 +:1047B000012800D13CB13178FF2906D049B143F23C +:1047C0000400BDE8F8831020FBE7012801D0042095 +:1047D000F7E74FF00008A4B3052811D004280FD044 +:1047E00069462046FEF76BFE0028EAD1207D48B1DD +:1047F000012809D0022809D0032809D00720E0E7C2 +:104800000820DEE7424604E0012202E0022200E046 +:1048100003222346174600200099FEF78DFE00284C +:10482000CFD1A0892880A07BE875BDF80000A882C0 +:10483000AF75BDF80000000701D5A08988B1A08937 +:10484000288049460020FEF727FF0028B9D1A87824 +:1048500005280BD0042809D0287DC00703D00320E9 +:1048600002E08020ECE70220FEF7E0FB86F8008003 +:104870000020A6E77CB58D4C05460E46A0780228A0 +:1048800003D0032801D008207CBD15B143F20400F9 +:104890007CBD07200CF098F910B9A078032806D049 +:1048A000FEF7F2FB28B1A078032804D009E012201B +:1048B0007CBD13207CBD304600F0CBFA0028F9D136 +:1048C000E67001208DF800008DF801008DF802508F +:1048D0002088ADF80400E07D8DF8060068460BF0F6 +:1048E000C6F904F0C7FB0028E4D1A078032805D05E +:1048F0005FF00400FEF79AFB00207CBDE07800F03A +:10490000B8FA0520F6E71CB510B143F204001CBD4F +:10491000664CA078042803D0052801D008201CBDCF +:1049200000208DF8000001218DF801108DF80200A3 +:1049300068460BF09CF904F09DFB0028EFD1A078AD +:10494000052805D05FF00200FEF770FB00201CBDBB +:10495000E07800F09FFA0320F6E72DE9FC4180465D +:104960000E46032508460FF078FE002866D1404623 +:10497000FEF771FD040004D02078222804D208201C +:1049800081E543F202007EE5A07F00F003073EB11F +:10499000012F0CD000203146FEF729FC0500EFD195 +:1049A000012F06D0022F1AD0FFDF28466BE5012029 +:1049B000F1E7A07D3146022801D011B107E01120B6 +:1049C00061E56846FCF7DFFD0028D9D1694640461D +:1049D00006F0A9FC0500E8D10120A075E5E7A07D5F +:1049E000032804D1314890F83000C00701D02EB31D +:1049F0000EE026B1A07F40071ED4002100E0012177 +:104A0000404606F0B0FC0500CFD1A075002ECCD0FA +:104A10003146404600F07BFA05461128C5D1A07FFB +:104A20004107C2D4316844F80E1F7168616040F0DC +:104A3000040020740025B8E71125B6E7102022E510 +:104A400070B50C460546FEF706FD010005D022466E +:104A50002846BDE87040FEF701BD43F2020070BD7C +:104A600010B5012807D1114B9B78012B00D011B153 +:104A700043F2040010BD09F0B6FDBDE8104004F09B +:104A8000F9BA012300F010BA00231A46194600F0C3 +:104A90000BBA70B506460C4608460FF091FD18B9E2 +:104AA00020680FF0B3FD18B1102070BDD8010020B0 +:104AB000F64D2A7E112A04D0132A00D33EB10820D5 +:104AC000F3E721463046FEF774FE60B1EDE70920BA +:104AD000132A0DD0142A0BD0A188FF29E5D3152065 +:104AE000FEF7BCFA0020D4E90012C5E90712DCE7A2 +:104AF000A1881F29D9D31320F2E72DE9F047DFF869 +:104B00008C93804690B099F818009A4615460C464A +:104B1000132803D3FFF738FB002836D120460FF0C7 +:104B20004FFD88BB28460FF04BFD68BB20784FF047 +:104B30000107C0074FF0000602D08DF83A7001E07F +:104B40008DF83A602078C0F3C1008DF800006178DC +:104B50000720E1B101291AD0022916D0042914D165 +:104B600004208DF809006088ADF80A00A088ADF82F +:104B700010002078C0F3C100012825D0032823D0DD +:104B800040460FF01DFD28B1102010B016E58DF83D +:104B90000970E8E798F80000400808D0012809D01B +:104BA000022807D0032805D043F20220EDE78DF854 +:104BB000026001E08DF80270404650F8011FCDF808 +:104BC00003108088ADF807000DF10100FEF7E3FB4C +:104BD00008B10320D9E72888ADF816006888ADF839 +:104BE0001C00A888ADF82200E888ADF82800ADF8D0 +:104BF0002E60ADF8346068460AF057FAE8B999F8C3 +:104C000018004D46112801D00820BEE706200BF001 +:104C1000DBFF38B12078C0F3C100012804D003289D +:104C200002D004E01220B0E795F8240028B1FEF786 +:104C30002BFA022803D21320A7E70720A5E7504646 +:104C400000F007F90028A0D185F819A068460AF0FD +:104C50001FFC04F00FFA002897D1687E00F009F9D4 +:104C6000E08864280BD250B15FF0010000F041F9F8 +:104C700004008AD11220FEF7F1F9204685E764216D +:104C8000B0FBF1F0F2E770B5064615460C46084653 +:104C90000FF0BCFC18B928460FF0B8FC08B1102082 +:104CA00003E72A46214630460BF081F804F0E2F98A +:104CB0000028F5D121787F29F2D10520F5E67CB5D1 +:104CC00005460C4608460FF07BFC08B110207CBD61 +:104CD0002846FEF7C0FB20B10078222804D2082025 +:104CE0007CBD43F202007CBD684890F8300040076C +:104CF00001D511207CBD2078C00802D16078C008A1 +:104D000001D007207CBDADF8005020788DF802005E +:104D100060788DF803000220ADF8040068460AF0C0 +:104D200055F804F0A7F97CBD70B586B014460D4661 +:104D30000646FEF790FB28B10078222805D208200D +:104D400006B0B2E643F20200FAE728460FF085FC0F +:104D500020B944B120460FF077FC08B11020EFE7EE +:104D600000202060A080494890F83000800701D5DD +:104D70001120E5E703A9304609F0F7FD18B100BF9F +:104D800004F078F9DCE7ADF80060BDF81400ADF888 +:104D90000200BDF81600ADF80400BDF81000BDF823 +:104DA0001210ADF80600ADF808107DB1298809B1E0 +:104DB000ADF80610698809B1ADF80210A98809B1EB +:104DC000ADF80810E98809B1ADF80410DCB1BDF800 +:104DD0000610814201D9081A2080BDF80210BDF8E2 +:104DE0001400814201D9081A6080BDF80800BDF89E +:104DF0000410BDF816200144BDF812001044814291 +:104E000001D9081AA080684609F0E6FEB8E71CB58B +:104E10001F490968CDE9001068460AF048F904F016 +:104E200029F91CBD1CB500200090019068460AF0CD +:104E30003EF904F01FF91CBD108008885080488896 +:104E40009080C88810818888D0800020508190810F +:104E5000704710B5044604F079F830B1407830B1AD +:104E6000204604F082FB002010BD052010BD12205A +:104E700010BD10B504F06AF8040000D1FFDF6078BF +:104E800000B9FFDF6078401E607010BDD8010020BF +:104E90004050020010B504F059F8040000D1FFDFC3 +:104EA0006078401C607010BD1CB5ADF800008DF836 +:104EB00002308DF803108DF8042068460AF03CFF9C +:104EC00004F0D8F81CBD0CB52FA2D2E90012CDE930 +:104ED00000120079694601EB501000780CBD027891 +:104EE000520804D0012A02D043F202207047FEF794 +:104EF00029BA10B548B183000022114605200FF0F1 +:104F000069FA052801D0032010BD002010BD1FB58F +:104F10006A46FFF791FF68460AF01DFB04F0AAF805 +:104F200004B010BD70B50C0006460DD0FEF793FA24 +:104F3000050000D1FFDFA6802889208128896081B3 +:104F40006889A081A889E081AFE510B500231A46E1 +:104F500003E0845C2343521CD2B28A42F9D30BB1E2 +:104F6000002010BD012010BD00B540B1012805D0C2 +:104F7000022803D0032804D0FFDF002000BDFF205B +:104F800000BD042000BD0000070605040302010067 +:104F900010B504460FF014FB08B1102010BD2078A6 +:104FA000C0F30210042807D86078072804D3A1783A +:104FB000102901D8814201D2072010BDE0784107B5 +:104FC00006D421794A0703D4000701D4080701D584 +:104FD000062010BD002010BD10B513785C08837F3B +:104FE00064F3C713837713789C08C37F64F30003CB +:104FF000C3771078C309487863F341004870137889 +:105000001C090B7864F347130B701378DB0863F308 +:10501000000048705078487110BD10B5C4780B7806 +:1050200064F300030B70C478640864F341030B70ED +:10503000C478A40864F382030B70C478E40864F3B2 +:10504000C3030B700379117863F3000111700379C6 +:105050005B0863F34101117003799B0863F38201DC +:1050600011700079C00860F3C301117010BD70B5F4 +:1050700014460D46064604F0D1F980B10178182295 +:1050800021F00F01891C21F0F001A03100F8081B6C +:1050900021461FF0A4FDBDE8704004F0C2B92946C6 +:1050A0003046BDE870401322FEF7D8B92DE9F0472D +:1050B000064608A8894690E830041F469046142109 +:1050C00028461FF0E8FD0021CAF80010B8F1000FD3 +:1050D00003D0B9F1000F03D114E03878C00711D024 +:1050E00020680FF093FAC0BBB8F1000F07D1206819 +:1050F000123028602068143068602068A860216839 +:10510000CAF800103878800724D560680FF09CFA40 +:1051100018BBB9F1000F21D0FFF76EF90168C6F88E +:1051200068118188A6F86C11807986F86E0101F00B +:1051300002FDF94FEF60626862B196F8680106F20D +:10514000691140081032FEF755F91022394660689F +:105150001FF000FD0020BDE8F08706E0606820B188 +:10516000E8606068C6F86401F4E71020F3E730B542 +:10517000054608780C4620F00F00401C20F0F00196 +:10518000103121700020607095F8230030B10428A0 +:105190000FD0052811D0062814D0FFDF2078012178 +:1051A000B1EB101F04D295F8200000F01F006070D2 +:1051B00030BD21F0F000203002E021F0F00030306E +:1051C0002070EBE721F0F0004030F9E7F0B591B046 +:1051D000022715460C4606463A46ADF808700921E6 +:1051E00003AB04F07AFF0490002810D004208DF85F +:1051F00004008DF80170E034099605948DF818507C +:105200000AA968460DF022FA00B1FFDF012011B0B3 +:10521000F0BD10B588B00C460A99ADF80000C3B1D6 +:105220001868CDF802005868CDF80600ADF80A20DD +:10523000102203A81FF08EFC68460AF02FFA03F034 +:1052400019FF002803D1A17F41F01001A17708B018 +:1052500010BD0020CDF80200E6E72DE9F84F064624 +:10526000808A0D4680B28246FEF7F5F80446307813 +:10527000DFF8A48200274FF00509A8F120080F28C5 +:1052800070D2DFE800F06FF23708387D8CC8F1F09B +:10529000EFF35FF3F300A07F00F00300022809D0D2 +:1052A0005FF0000080F0010150460BF0DDFC0500CE +:1052B00003D101E00120F5E7FFDF98F85C10C90792 +:1052C00002D0D8F860000BE0032105F11D000EF0BC +:1052D00052FED5F81D009149B0FBF1F201FB12001E +:1052E000C5F81D0070686867B068A8672078252831 +:1052F00000D0FFDFCAE0A07F00F00300022809D041 +:105300005FF0000080F0010150460BF0ADFC06009C +:1053100003D101E00120F5E7FFDF3078810702D5F6 +:105320002178252904D040F001003070BDE8F88FC5 +:1053300002202870307F287106F11D002D36C5E946 +:105340000206F3E7A07F00F00300022808D0002047 +:1053500080F0010150460BF087FC040004D102E00C +:105360000120F5E7A7E1FFDF2078C10604D507207B +:1053700028703D346C60D9E740F008002070D5E714 +:10538000E07F000700D5FFDF307CB28800F001032A +:1053900001B05046BDE8F04F092105F027BD04B922 +:1053A000FFDF716821B1102204F124001FF0D2FB4D +:1053B00028212046FDF7AEFEA07F00F00300022862 +:1053C0000ED104F12400002300901A4621465046D5 +:1053D000FFF71FFF112807D029212046FDF79AFE6D +:1053E000307A84F82000A1E7A07F000700D5FFDF16 +:1053F00014F81E0F40F008002070E782A761E761F3 +:10540000C109607861F34100014660F38201617077 +:10541000307AE0708AE7A07F00F00300022809D00C +:105420005FF0000080F0010150460BF01DFC04000D +:1054300003D101E00120F5E7FFDF022104F185003F +:105440000EF099FD0420287004F5B4706860B4F87B +:1054500085002882304810387C346C61C5E90280B0 +:1054600064E703E024E15BE02DE015E0A07F00F0BD +:105470000300022807D0002080F0010150460BF005 +:10548000F3FB18B901E00120F6E7FFDF32462146C1 +:105490005046BDE8F84FEAE504B9FFDF207821283F +:1054A000A1D93079012803D1E07F40F00800E077EE +:1054B000324621465046FFF7DAFD2046BDE8F84F58 +:1054C0002321FDF727BE3279AA8005F108030921BF +:1054D000504604F002FEE86010B185F8009025E720 +:1054E000A07F00F00300022808D0002080F0010116 +:1054F00050460BF0B9FB040003D101E00120F5E7B1 +:10550000FFDF04F1620102231022081F0BF033FABF +:1055100007703179417009E73802002040420F00DE +:10552000A07F00F00300022808D0002080F00101D5 +:1055300050460BF099FB050003D101E00120F5E78F +:10554000FFDF95F8840000F0030001287AD1A07FE6 +:1055500000F00307E07F10F0010602D0022F04D113 +:1055600033E095F8A000C0072BD0D5F8601121B327 +:1055700095F88320087C62F387000874A17FCA092C +:10558000D5F8601162F341000874D5F8601166F334 +:1055900000000874AEB1D5F86001102204F12401B6 +:1055A00088351FF0D7FA287E40F001002876287849 +:1055B00020F0010005F8880900E016B1022F04D0A0 +:1055C0002DE095F88800C00727D0D5F85C1121B3ED +:1055D00095F88320087C62F387000874A17FCA09CC +:1055E000D5F85C1162F341000874D5F85C1166F3DC +:1055F000000008748EB1D5F85C01102204F124017A +:1056000088351FF0A7FA287840F0010005F8180B3C +:10561000287820F0010005F8A009022F44D00020CE +:1056200000EB400005EBC00090F88800800709D52A +:1056300095F87C00D5F86421400805F17D01103211 +:10564000FDF7D8FE8DF8009095F884006A4600F0CA +:1056500003008DF8010095F888108DF8021095F878 +:10566000A0008DF803002146504601F04DFA207845 +:10567000252805D0212807D0FFDF2078222803D94C +:1056800022212046FDF746FDA07F00F003000228FE +:105690000CD0002080F0010150460BF0F7FA0028F2 +:1056A0003FF44FAEFFDF41E60120B9E70120F1E70B +:1056B000706847703AE6FFDF38E670B5FE4C0025AB +:1056C00084F85C5025660CF08EFF04F11001204632 +:1056D00003F060FE84F8305070BD70B50D46FDF7E4 +:1056E000BAFE040000D1FFDF4FF4B87128461FF066 +:1056F000D2FA04F124002861A07F00F00300022800 +:1057000008D0012105F1E0000CF06EFF002800D068 +:10571000FFDF70BD0221F5E70A46014602F1E00015 +:105720000CF082BF70B50546406886B001780A2942 +:1057300006D00D2933D00E292FD0FFDF06B070BD63 +:1057400086883046FDF787FE040000D1FFDF207811 +:105750002128F3D028281BD1686802210E3001F0DF +:10576000C8F9A8B168680821801D01F0C2F978B1B4 +:1057700004F1240130460AF07CFA03F07BFC00B10E +:10578000FFDF06B02046BDE870402921FDF7C2BC0E +:1057900006B0BDE8704003F044BE012101726868A4 +:1057A000C6883046FDF757FE040000D1FFDFA07F1A +:1057B00000F00301022902D120F01000A077207828 +:1057C00021280AD06868017A09B1007980B1A07FE8 +:1057D00000F00300022862D0FFDFA07F00F003008A +:1057E0000228ABD1FEF796F80028A7D0FFDFA5E787 +:1057F00003F017FEA17F08062BD5E07FC00705D078 +:1058000094F8200000F01F00102820D05FF0050061 +:1058100084F82300207829281DD02428DDD13146A2 +:1058200004200EF081FE22212046FDF773FCA07FAC +:1058300000F00300022830D05FF0000080F001018A +:1058400030460BF023FA0028C7D0FFDFC5E706205B +:10585000DEE70420DCE701F00300022808D0002086 +:1058600080F0010130460BF0FFF9050003D101E0A3 +:105870000120F5E7FFDF25212046FDF74BFC032043 +:105880008DF80000694605F1E0000CF0C4FE022826 +:10589000A3D00028A1D0FFDF9FE70120CEE703F0CF +:1058A000C0FD9AE72DE9F04387B099461646884631 +:1058B0000746FDF7D0FD04004BD02078222848D3BE +:1058C000232846D0E07F000743D4A07F00F00300E8 +:1058D000022809D05FF0000080F0010138460BF08B +:1058E000C3F9050002D00CE00120F5E7A07F00F02D +:1058F0000300022805D00121002238460BF0ABF945 +:1059000005466946284601F026F9009800B9FFDFF0 +:1059100045B10098E03505612078222806D024287A +:1059200004D007E000990020086103E0252120460B +:10593000FDF7F0FB0098012141704762868001A9C4 +:10594000C0E902890CF082FE022802D0002800D0B3 +:10595000FFDF07B0BDE8F08370B586B00546FDF700 +:105960007AFD017822291ED9807F00F003000228E9 +:1059700008D0002080F0010128460BF075F90400E2 +:105980002FD101E00120F5E7FFDF2AE0B4F85E0047 +:1059900004F1620630440178427829B12146284654 +:1059A000FFF714FCB0B9C9E6ADF804200921284678 +:1059B00002AB04F092FB03900028F4D005208DF890 +:1059C0000000694604F1E0000CF025FE022801D039 +:1059D00000B1FFDF02231022314604F15E000BF01C +:1059E00000F8B4F860000028D0D1A7E610B586B062 +:1059F0000446FDF730FD017822291BD9807F00F095 +:105A00000300022808D0002080F0010120460BF09E +:105A10002BF9040003D101E00120F5E7FFDF0620A8 +:105A20008DF80000694604F1E0000CF0F4FD002858 +:105A300000D0FFDF06B010BD2DE9F05F05460C4633 +:105A400000270078904601093E4604F1080BBA464B +:105A500002297DD0072902D00A2909D146E06868C9 +:105A600001780A2905D00D2930D00E292ED0FFDF6C +:105A7000BCE114271C26002C6BD08088A080FDF789 +:105A8000EAFC5FEA000900D1FFDF99F817005A46E7 +:105A9000400809F11801FDF7ADFC6868C089208253 +:105AA000696851F8060FC4F812004868C4F8160077 +:105AB000A07E20F0060001E01802002040F0010066 +:105AC000A07699F81E0040F020014DE01A270A2622 +:105AD000002CD1D0C088A080FDF7BDFC050000D10E +:105AE000FFDF59462846FFF742FB7FE10CB1A88B48 +:105AF000A080287A0B287DD006DC01287BD00228E4 +:105B000008D0032804D135E00D2875D00E2874D0B4 +:105B1000FFDF6BE11E270926002CADD0A088FDF722 +:105B20009AFC5FEA000900D1FFDF287B00F0030048 +:105B30000128207A1BD020F001002072297B8908DF +:105B400061F341002072297BC90861F3820001E002 +:105B500041E1F2E02072297B090961F3C300207260 +:105B600099F81E0040F0400189F81E103EE140F017 +:105B70000100E2E713270D26002CAAD0A088FDF72C +:105B80006AFC8146807F00F00300022808D00020D4 +:105B900080F00101A0880BF067F8050003D101E057 +:105BA0000120F5E7FFDF99F81E0000F00302022A4A +:105BB00050D0686F817801F003010129217A4BD020 +:105BC00021F00101217283789B0863F34101217266 +:105BD0008378DB0863F38201217283781B0963F306 +:105BE000C3012172037863F306112172437863F3D2 +:105BF000C71103E061E0A9E090E0A1E0217284F820 +:105C000009A0C178A172022A29D00279E17A62F34F +:105C10000001E1720279520862F34101E1720279F6 +:105C2000920862F38201E1720279D20862F3C30141 +:105C3000E1724279217B62F30001217342795208BB +:105C400062F3410121734279920862F38201217368 +:105C5000407928E0A86FADE741F00101B2E7427951 +:105C6000E17A62F30001E1724279520862F3410184 +:105C7000E1724279920862F38201E1724279D208BC +:105C800062F3C301E1720279217B62F300012173A7 +:105C90000279520862F3410121730279920862F39A +:105CA000820121730079C00860F3C301217399F860 +:105CB0000000232831D9262140E018271026E4B31C +:105CC000A088FDF7C8FB8346807F00F00300022810 +:105CD00009D0002080F00101A0880AF0C5FF5FEA2A +:105CE000000903D101E00120F4E7FFDFE868A060CC +:105CF00099F8000040F0040189F8001099F80100BB +:105D0000800708D5012020739BF8000023286DD957 +:105D10002721584651E084F80CA067E015270F268C +:105D20005CB1A088FDF797FB814606225946E868DA +:105D300008F089F90120A073A2E041E048463CE068 +:105D400016270926E4B3287B20724FE0287B192709 +:105D50000E26ACB3C4F808A0A4F80CA0012807D004 +:105D6000022805D0032805D0042803D0FFDF0DE06A +:105D7000207207E0697B042801F00F0141F08001E7 +:105D800021721ED0607A20F003006072A088FDF7B7 +:105D900062FB05460078212828D0232800D0FFDFA9 +:105DA000A87F00F00300022813D0002080F001013A +:105DB000A0880AF06BFF22212846FDF7ABF915E019 +:105DC00004E0607A20F00300401CDEE7A8F80060E1 +:105DD00011E00120EAE70CB16888A080287A032846 +:105DE0002ED004280AD0052850D0FFDFA8F8006084 +:105DF0000CB1278066800020BDE8F09F15270F2694 +:105E0000002CE3D0A088FDF726FB807F00F0030084 +:105E1000022809D05FF0000080F00101A0880AF09C +:105E200023FF050003D101E00120F5E7FFDFD5F8EE +:105E30001D000622594608F006F984F80EA0D5E7A1 +:105E400017270926002CC1D0A088FDF704FB814646 +:105E5000807F00F00300022808D0002080F00101BC +:105E6000A0880AF001FF050003D101E00120F5E759 +:105E7000FFDF6878800701D5022000E00120207252 +:105E800099F800002328B1D9272157E719270E26B2 +:105E9000002C9BD0A088FDF7DEFA5FEA000900D154 +:105EA000FFDFC4F808A0A4F80CA084F808A0A07A2A +:105EB00040F00300A07299F81E10C90961F3820036 +:105EC000A07299F81F2099F81E1012EAD11F05D070 +:105ED00099F8201001F01F0110292BD020F00800A4 +:105EE000A07299F81F10607A61F3C3006072697A3A +:105EF00001F003010129A2D140F00400607299F879 +:105F00001E0000F003000228E87A16D0217B60F31F +:105F100000012173AA7A607B62F300006073EA7A61 +:105F2000520862F341012173A97A490861F34100E3 +:105F300060735BE740F00800D2E7617B60F300012B +:105F40006173AA7A207B62F300002073EA7A520818 +:105F500062F341016173A97A490861F3410020733A +:105F600044E710B5FE4C30B10146102204F1200088 +:105F70001EF0F0FD012084F8300010BD10B504467D +:105F800000F0D9FDF64920461022BDE8104020312E +:105F90001EF0E0BD70B5F24D06004FF0000413D0C6 +:105FA0000EF00EFB08B110240CE00621304608F07C +:105FB00031F8411C05D028665FF0010085F85C00CF +:105FC00000E00724204670BD0020F7E7007810F0BD +:105FD0000F0204D0012A05D0022A0CD110E00009DA +:105FE00009D10AE00009012807D0022805D00328BA +:105FF00003D0042801D007207047087000207047A4 +:106000000620704705282AD2DFE800F003070F17A3 +:106010001F00087820F0FF001EE0087820F00F0035 +:10602000401C20F0F000103016E0087820F00F003F +:10603000401C20F0F00020300EE0087820F00F0027 +:10604000401C20F0F000303006E0087820F00F000F +:10605000401C20F0F00040300870002070470720FE +:1060600070472DE9F041804688B00D46002708466C +:106070000EF0F3FAA8B94046FDF7EDF9040003D09D +:106080002078222815D104E043F2020008B0BDE8D0 +:10609000F08145B9A07F410603D500F00300022836 +:1060A00001D01020F2E7A07FC10601D4010702D57C +:1060B0000DB10820EAE7E17F090701D50D20E5E7EA +:1060C00000F00300022805D125B12846FEF760FF45 +:1060D0000700DBD1A07F00F00300022808D00020D9 +:1060E00080F0010140460AF0BFFD060002D00FE03B +:1060F0000120F5E7A07F00F0030002280ED0002069 +:1061000080F00101002240460AF0A5FD060007D0FC +:10611000A07F00F00300022804D009E00120EFE78F +:106120000420B3E725B12A4631462046FEF754FF46 +:106130006946304600F00FFD009800B9FFDF009976 +:10614000022006F1E0024870C1F824804A61002272 +:106150000A81A27F02F00302022A1CD001200871EA +:10616000287800F00102087E62F3010008762A78A0 +:10617000520862F3820008762A78920862F3C3001C +:1061800008762A78D20862F3041008762421204683 +:10619000FCF7C0FF33E035B30871301D88613078FB +:1061A000400908777078C0F340004877287800F0FD +:1061B0000102887F62F301008877A27FD20962F32F +:1061C00082008877E27F62F3C3008877727862F397 +:1061D00004108877A878C87701F121022846203179 +:1061E000FEF71BFF03E00320087105200876252138 +:1061F0002046FCF78FFFA07F20F04000A07701A988 +:1062000000980CF023FA022801D000B1FFDF3846D5 +:106210003CE72DE9FF4F534A0D4699B09A4607CA0D +:106220000BAB002783E807001998FDF714F9060067 +:1062300006D03078262806D008201DB0BDE8F08FA3 +:1062400043F20200F9E7B07F00F00309B9F1020F51 +:1062500003D00020284302D006E00120FAE71B9873 +:10626000FEF796FE0028E8D1B07F00F00300022878 +:1062700001D11B9979BB022808D0002080F00101D0 +:1062800019980AF0F1FC040003D101E00120F5E7C0 +:10629000FFDF852D28D007DCF5B1812D1ED0822DA2 +:1062A0001ED0832D08D11DE0862D1FD0882D1FD034 +:1062B000892D1FD08A2D1FD00F2020710F281DD0AF +:1062C00003F0ACF8E0B101208DF84000201D1190E2 +:1062D0002079B8B167E111E00020EEE70120ECE79A +:1062E0000220EAE70320E8E70520E6E70620E4E7E6 +:1062F0000820E2E70920E0E70A20DEE707209CE724 +:1063000011209AE7B9F1020F03D0A56F03D1A06F56 +:1063100002E0656FFAE7606F804632D04FF001000F +:1063200000904FF002000190214630461B9AFEF784 +:1063300053FE1B98007800F00101A87861F301007A +:10634000A870B17FC90961F38200A870F17F61F381 +:10635000C300A870617861F30410A870207803E08E +:106360001802002048500200400928706078C0F3ED +:10637000400068701B988078E87000206871287170 +:1063800003E00220009001200190A87898F8021004 +:10639000C0F3C000C1F3C00108405FEA000B2CD07D +:1063A00050460EF00DF990BBDAF80C000EF008F92B +:1063B00068BBDAF81C000EF003F940BBDAF80C00F9 +:1063C000A060DAF81C00E06098F80100617800F045 +:1063D000010041EA4000607098F80210C0B2C1F3B9 +:1063E0000011891E0840607000202077019906F195 +:1063F000170002290CD001210BE098F801106078F9 +:1064000001F00101FD2242EA41010840E3E732E0E8 +:10641000002104EB810148610099701C022901D020 +:10642000012100E0002104EB81014861A87800F01F +:106430000300012858D198F8020000F00300012859 +:1064400052D1B9F1020F04D02A1D691D1B98FEF725 +:10645000E4FD297998F8040001408DF83810687936 +:1064600098F8052010408DF83C0001433CD0504680 +:106470000EF0A6F808B11020DFE60AF11001049131 +:10648000B9F1020F18D008465FF0000104F18C0347 +:10649000CDE9000304F5AE7202920EAB5A462046D7 +:1064A000FEF704FE0028E7D1B9F1020F08D05046EC +:1064B00008D14FF0010107E050464FF00101E5E738 +:1064C0000498F5E74FF0000104F1A403CDE90003BF +:1064D00004F5B072029281F001010FAB5A462046DA +:1064E000FEF7E4FD0028C7D16078800734D4A8788F +:1064F00098F80210C0F38000C1F3800108432BD04C +:10650000297898F800000BAAB9F1020F06D032F8EA +:1065100011204300DA4002F003070AE032F81020AD +:106520004B00DA4012F0030705D0012F0BD0022FE9 +:106530000BD0032F07D0BBF1000F0DD0012906D0DF +:10654000042904D008E00227F5E70127F3E7012832 +:1065500001D0042800D10427B07F40F08000B0773C +:10656000F17F6BF30001F177607881074FF0030052 +:106570000CD5A071BBF1000F15D100BF8DF85C00E8 +:1065800017AA3146199800F0BFFA0CE00221022F39 +:1065900018D0012F18D0042F22D00020A071B07F76 +:1065A00020F08000B07725213046FCF7B3FD10A91C +:1065B00004F1E0000CF02FF810B1022800D0FFDF4A +:1065C00000203AE6A171D9E7A1710D2104F1200064 +:1065D0001EF061FB207840F0020020700420CDE71F +:1065E0000120A071DFE72DE9F04387B0904689468E +:1065F00004460025FCF72FFF060006D03078272838 +:1066000006D0082007B0BDE8F08343F20200F9E7A6 +:10661000B07F00F00300022808D0002080F00101C4 +:1066200020460AF021FB040003D101E00120F5E738 +:10663000FFDFA7795FEA090005D0012821D0B9F171 +:10664000020F26D110E0B8F1000F22D1012F05D0A2 +:10665000022F05D0032F05D0FFDF2DE00C252BE006 +:10666000012529E0022527E040460DF0A9FFB0B939 +:10667000032F0ED11022414604F11D001EF06AFACC +:106680001AE0012F02D0022F03D104E0B8F1000F6D +:1066900012D00720B6E740460DF092FF08B1102057 +:1066A000B0E7102104F11D001EF0D3FA0621404688 +:1066B00007F0B0FCC4F81D002078252140F002004E +:1066C00020703046FCF726FD2078C10713D020F05B +:1066D0000100207002208DF8000004F11D000290DE +:1066E0008DF804506946C3300BF095FF022803D0A3 +:1066F00010B1FFDF00E02577002083E730B587B0D9 +:106700000D460446FCF7A7FEA0B1807F00F0030011 +:10671000022812D05FF0000080F0010120460AF04C +:10672000A3FA04000ED028460DF04AFF38B110201D +:1067300007B030BD43F20200FAE70120ECE7207811 +:10674000400701D40820F3E7294604F13D00202248 +:1067500005461EF0FFF9207840F010002070010778 +:106760000FD520F00800207007208DF80000694642 +:1067700004F1E00001950BF04EFF022801D000B1BA +:10678000FFDF0020D4E770B50D460646FCF763FE38 +:1067900018B10178272921D102E043F2020070BD2F +:1067A000807F00F00300022808D0002080F0010163 +:1067B00030460AF059FA040003D101E00120F5E760 +:1067C000FFDFA079022809D16078C00706D02A46E9 +:1067D00021463046FEF7FAFC10B10FE0082070BDEC +:1067E000B4F860000E280BD204F1620102231022DB +:1067F000081F0AF0C0F8012101704570002070BD2B +:10680000112070BD70B5064614460D4608460DF0C1 +:10681000D7FE18B920460DF0F9FE08B1102070BD62 +:10682000A6F57F40FF380ED03046FCF714FE38B195 +:10683000417822464B08811C1846FCF7DBFD07E037 +:1068400043F2020070BD2046FDF73CFE0028F9D15E +:106850001021E01D0DF08FFBE21D294604F1170009 +:1068600000F089F9002070BD2DE9F04104468AB09E +:1068700015468846002708460DF0EFFE18B9284651 +:106880000DF0EBFE18B110200AB0BDE8F0812046F3 +:10689000FCF7E1FD060003D0307827281BD102E089 +:1068A00043F20200F0E7B07F00F00300022809D0B5 +:1068B0005FF0000080F0010120460AF0D5F90400E5 +:1068C00003D101E00120F5E7FFDF2078400702D582 +:1068D0006078800701D40820D6E7B07F00F003007D +:1068E000022803D0A06F03D1A16F02E0606FFAE726 +:1068F000616F407800B19DB1487810B1B8F1000FD8 +:106900000ED0ADB1EA1D06A8E16800F034F91022FE +:1069100006A905F117001EF0F1F818B1042707E0E9 +:106920000720B1E71022E91D04F12D001EF012F935 +:10693000B8F1000F06D0102208F1070104F11D0084 +:106940001EF008F92078252140F002002070304622 +:10695000FCF7E0FB2078C10715D020F00100207083 +:1069600002208DF8000004F11D0002901030039009 +:106970008DF804706946B3300BF04DFE022803D049 +:1069800010B1FFDF00E0277700207DE7F8B515465E +:106990000E460746FCF75FFD040004D0207822284D +:1069A00004D00820F8BD43F20200F8BDA07F00F03B +:1069B0000300022802D043F20500F8BD30460DF076 +:1069C000FFFD18B928460DF0FBFD08B11020F8BDF9 +:1069D00000953288B31C21463846FEF71AFC112870 +:1069E00015D00028F3D1297C4A08A17F62F3C71192 +:1069F000A177297CE27F61F30002E277297C890894 +:106A000084F82010A17F21F04001A177F8BDA17F7B +:106A10000907FBD4D6F80200C4F83600D6F8060001 +:106A2000C4F83A003088A0861022294604F12400D8 +:106A30001EF090F8287C4108E07F61F34100E07788 +:106A4000297C61F38200E077287C800884F82100AB +:106A5000A07F40F00800A0770020D3E770B50D4676 +:106A600006460BB1072070BDFCF7F5FC040007D00B +:106A70002078222802D3A07F800604D4082070BD8D +:106A800043F2020070BDADB12946304609F0F1F87D +:106A900002F0F0FA297C4A08A17F62F3C711A177BE +:106AA000297CE27F61F30002E277297C890884F87F +:106AB000201004E0304609F004F902F0DBFAA17F6F +:106AC00021F02001A17770BD70B50D46FCF7C3FC25 +:106AD000040005D028460DF099FD20B1102070BDAE +:106AE00043F2020070BD29462046FEF740FB00201D +:106AF00070BD04E010F8012B0AB100207047491E58 +:106B000089B2F7D20120704770B51546064602F0EB +:106B100085FC040000D1FFDF207820F00F00801CEE +:106B200020F0F0002030207066802868A060BDE86A +:106B3000704002F076BC10B5134C94F83000002879 +:106B400008D104F12001A1F110000BF0A6FD0120F5 +:106B500084F8300010BD10B190F8B9202AB10A486D +:106B600090F8350018B1002003E0B83001E0064885 +:106B700034300860704708B50023009313460A4676 +:106B80000AF06DFA08BD00001802002018B18178E3 +:106B9000012938D101E010207047018842F6011226 +:106BA000881A914231D018DC42F60102A1EB0200B2 +:106BB00091422AD00CDC41B3B1F5C05F25D06FF40F +:106BC000C050081821D0A0F57060FF381BD11CE020 +:106BD00001281AD002280AD117E0B0F5807F14D01E +:106BE00008DC012811D002280FD003280DD0FF287F +:106BF00009D10AE0B0F5817F07D0A0F58070033895 +:106C000003D0012801D0002070470F2070470A28C8 +:106C10001ED007DC18D2DFE800F0191B1F1F171F5A +:106C2000231D1F21102815D008DC0B2812D00C289A +:106C300010D00D2816D00F2806D10DE011280BD04A +:106C400084280BD087280FD003207047002070477E +:106C500005207047072070470F20704704207047B9 +:106C6000062070470C20704743F20200704738B589 +:106C70000C46050041D06946FFF7A8F9002819D154 +:106C80009DF80010607861F3020060706946681C2E +:106C9000FFF79CF900280DD19DF80010607861F392 +:106CA000C5006070A978C1F34101012903D0022910 +:106CB00005D0072038BD217821F0200102E021789D +:106CC00041F020012170410704D0A978C90861F37F +:106CD00086106070607810F0380F07D0A978090925 +:106CE00061F3C710607010F0380F02D16078400671 +:106CF00003D5207840F040002070002038BD70B5EA +:106D000004460020088015466068FFF7B0FF0028A1 +:106D100016D12089A189884211D860688078C0077F +:106D20000AD0B1F5007F0AD840F20120B1FBF0F2A1 +:106D300000FB1210288007E0B1F5FF7F01D90C207D +:106D400070BD01F201212980002070BD10B50478CA +:106D5000137864F3000313700478640864F3410348 +:106D600013700478A40864F3820313700478E408B1 +:106D700064F3C30313700478240964F304131370D9 +:106D80000478640964F3451313700078800960F394 +:106D90008613137031B10878C10701D1800701D57E +:106DA000012000E0002060F3C713137010BD42788B +:106DB000530702D002F0070306E012F0380F02D0AA +:106DC000C2F3C20300E001234A7863F302024A706F +:106DD000407810F0380F02D0C0F3C20005E043073E +:106DE00002D000F0070000E0012060F3C5024A7005 +:106DF00070472DE9F04F95B00D00824612D0122158 +:106E000028461DF026FF4FF6FF7B05AA01215846B4 +:106E100006F04BFF0024264637464FF420586FF407 +:106E2000205972E0102015B0BDE8F08F9DF81E00CB +:106E300001280AD1BDF81C1041450BD011EB090007 +:106E40000AD001280CD002280CD0042C0ED0052C1E +:106E50000FD10DE0012400E00224BDF81A6008E023 +:106E6000032406E00424BDF81A7002E0052400E0C3 +:106E70000624BDF81A10514547D12C74BEB34FF00B +:106E8000000810AA4FF0070ACDE90282CDE900A858 +:106E90000DF13C091023CDF810904246314658467A +:106EA00006F0B6FF08BBBDF83C002A46C0B210A9E8 +:106EB0000BF05CFCC8B9AE81CFB1CDE900A80DF1F3 +:106EC000080C0AAE40468CE84102132300223946E2 +:106ED000584606F09DFF40B9BDF83C00F11CC01EAD +:106EE000C0B22A1D0BF042FC10B103209BE70AE060 +:106EF000BDF82900E881062C05D19DF81E00A87276 +:106F0000BDF81C00288100208DE705A806F0D9FEF9 +:106F100000288BD0FFF77BFE85E72DE9F0471C4664 +:106F2000DDE90978DDF8209015460E00824600D193 +:106F3000FFDF0CB1208818B1D5B11120BDE8F08772 +:106F4000022D01D0012100E0002106F1140005F01E +:106F50009BFDA8F8000002463B462946504603F038 +:106F6000BCF8C9F8000008B9A41C3C600020E5E7A3 +:106F70001320E3E7F0B41446DDE904528DB1002399 +:106F800014B1022C09D101E0012306E00D7CEE07CB +:106F900003D025F0010501230D742146F0BC03F058 +:106FA00025BF1A80F0BC70472DE9FE4F91461A8824 +:106FB0001C468A468046FAB102AB494603F08DF87A +:106FC000050019D04046A61C278809F091FF3246DB +:106FD000072629463B46009609F09FFB208823465A +:106FE000CDE900504A4651464046FFF7C3FF002016 +:106FF00020800120BDE8FE8F0020FBE72DE9F0474F +:1070000086B09146DDE90E460F46824603AA05A9E1 +:1070100004A8109D8DE80700984632462146504648 +:10702000FFF77BFF049909B1012200E000222A70DA +:10703000002818D1F94A03AB1060059A009104F1B9 +:107040001400CDE901204A463946504606F0D3F8EF +:10705000A8B1092811D2DFE800F005080510100AD0 +:107060000C0C0E00002006B068E71120FBE707209B +:10707000F9E70820F7E70D20F5E70320F3E7BDF86F +:107080000C100498CDE90001434632462146504693 +:10709000FFF770FFE6E72DE9F04389B00D46DDE923 +:1070A000108781461C461646142103A81DF0F3FDE7 +:1070B000012002218DF810108DF80C008DF8117050 +:1070C000ADF8146064B1A278D20709D08DF816002B +:1070D000E088ADF81A00A088ADF81800A068079005 +:1070E00008A80095CDE90110424603A948466B68FF +:1070F000FFF784FF09B0BDE8F083F0B58BB0002442 +:107100000646069407940727089405A80994019455 +:1071100000970294CDE903400D46102322463046E5 +:1071200006F076FE78B90AA806A9019400970294A1 +:10713000CDE90310BDF8143000222946304606F090 +:107140003DFC002801D0FFF762FD0BB0F0BD06F05A +:10715000DDBA2DE9FC410C468046002602F05EF9BE +:10716000054620780D287DD2DFE800F0BC0713B378 +:1071700025BD49496383AF959B00A848006820B1AD +:10718000417841F010014170ADE0404602F076F9DF +:10719000A9E00421404609F067FD070000D1FFDFA8 +:1071A00007F11401404605F003FCA5BB132140463E +:1071B000FDF746FC97E00421404609F055FD070025 +:1071C00000D1FFDFE088ADF800000020B8819DF815 +:1071D0000000010704D5C00602D5A088B88105E0EB +:1071E0009DF8010040067ED5A088F88105B9FFDF33 +:1071F00022462946404601F063FC022673E0E188FE +:10720000ADF800109DF8011009060FD5072803D02E +:1072100006280AD00AE024E00421404609F024FDB3 +:10722000060000D1FFDFA088F0810226CDB9FFDF84 +:1072300017E00421404609F017FD070000D1FFDFE9 +:1072400007F1140006F099FA90F0010F02D1E079ED +:10725000000648D5387C022640F00200387405B993 +:10726000FFDF00E03EE022462946404601F028FCD0 +:1072700039E00421404609F0F7FC017C002D01F0C3 +:107280000206C1F340016171017C21F00201017429 +:10729000E7D1FFDFE5E702260121404602F020F9B1 +:1072A00021E00421404609F0DFFC054660680090BB +:1072B0002089ADF8040001226946404602F031F908 +:1072C000287C20F0020028740DE0002DC9D1FFDFDA +:1072D000C7E7022600214046FBF784F8002DC0D105 +:1072E000FFDFBEE7FFDF3046BDE8FC813EB50C00A6 +:1072F00009D001466B4601AA002006F00BFE20B122 +:10730000FFF785FC3EBD10203EBD00202080A07010 +:107310009DF8050002A900F00700FEF773FE50B9C2 +:107320009DF8080020709DF8050002A9C0F3C20076 +:10733000FEF768FE08B103203EBD9DF808006070AE +:107340009DF80500C109A07861F30410A0709DF8B4 +:107350000510890961F3C300A0709DF80410890627 +:1073600001D5022100E0012161F342009DF80010E7 +:1073700061F30000A07000203EBD70B514460646C3 +:107380000D4651EA040005D075B108460DF05CF9D0 +:1073900078B901E0072070BD2946304606F01BFE93 +:1073A00010B1BDE8704032E454B120460DF04CF904 +:1073B00008B1102070BD21463046BDE8704095E709 +:1073C000002070BD2DE9FC5F0C4690460546002765 +:1073D00001780822007A3E46B2EB111F7ED104F1FB +:1073E0000A0100910A31821E4FF0020A04F1080BD3 +:1073F0000191092A73D2DFE802F0ECDF05F42727B8 +:107400007AA9CD006888042109F02EFC060000D17D +:10741000FFDFB08920B152270726C2E07C0200209E +:1074200051271026002C7DD06888A0800120A071F3 +:10743000A88900220099FFF7A0FF002873D1A8892E +:107440002081288AE081D1E0B5F81290072824D164 +:10745000E87B000621D5512709F1140086B2002CE3 +:10746000E1D0A88900220099FFF787FF00285AD1B0 +:107470006888A08084F806A0A88920810120A073D4 +:10748000288A2082A4F81290A88A009068884B4627 +:10749000A969019A01F0F1FAA8E0502709F1120058 +:1074A00086B2002C3ED0A88900225946FFF765FF1E +:1074B000002838D16888A080A889E080287A072829 +:1074C00013D002202073288AE081E87BC009607312 +:1074D000A4F81090A88A0090688801E083E080E01A +:1074E0004B4604F11202A969D4E70120EAE7B5F896 +:1074F0001290512709F1140086B2002C66D06888DA +:10750000042109F0B1FB83466888A080A889002285 +:107510000099FFF732FF00286ED184F806A0A889F1 +:10752000208101E052E067E00420A073288A2082D5 +:10753000A4F81290A88A009068884B46A969019A1D +:1075400001F09BFAA989ABF80E104FE06888FBF7B1 +:1075500082FF07466888042109F086FB064607B9C2 +:10756000FFDF06B9FFDF687BC00702D05127142672 +:1075700001E0502712264CB36888A080502F06D017 +:1075800084F806A0287B594601F087FA2EE0287B74 +:10759000A11DF9E7FE49A8894989814205D15427EF +:1075A00006269CB16888A08020E053270BE06888FD +:1075B000A080A889E08019E06888042109F054FBC4 +:1075C00000B9FFDF55270826002CF0D1A8F800608D +:1075D00011E056270726002CF8D06888A0800020EC +:1075E00013E0FFDF02E0012808D0FFDFA8F8006009 +:1075F0000CB1278066800020BDE8FC9F5727072636 +:10760000002CE3D06888A080687AA071EEE7401D66 +:1076100020F0030009B14143091D01EB4000704710 +:1076200013B5DB4A00201071009848B10024684669 +:1076300009F037F9002C02D1D64A009911601CBD1F +:1076400001240020F4E770B50D46064686B01446C6 +:107650005C2128461DF01FFB04B9FFDFA078687489 +:10766000A2782188284601F042FA0020A881E8810A +:10767000228805F11401304605F07FF96A460121A0 +:10768000304606F012FB19E09DF80300000715D5FF +:10769000BDF806103046FFF730FD9DF80300BDF839 +:1076A000061040F010008DF80300BDF80300ADF89F +:1076B0001400FF233046059A06F058FC684606F091 +:1076C00000FB0028E0D006B070BD10B50C4601F1FB +:1076D000140005F089F90146627C2046BDE810409F +:1076E00001F03ABA70B50546042109F0BDFA04006C +:1076F00000D1FFDF04F114010C46284605F058F9CB +:1077000021462846BDE8704005F059B970B58AB0E9 +:107710000C460646FBF79FFE050014D02878222869 +:1077200027D30CB1A08890B101208DF80C00032064 +:107730008DF8100000208DF8110054B1A088ADF82C +:107740001800206807E043F202000AB070BD09206B +:10775000FBE7ADF8180005900421304609F084FAE3 +:10776000040000D1FFDF04F1140005F054F9000714 +:1077700001D40820E9E701F051FE60B108A8022118 +:107780000094CDE9011095F8232003A930466368E1 +:10779000FFF734FCD9E71120D7E72DE9F04FB2F815 +:1077A00002A0834689B0154689465046FBF753FE32 +:1077B00007460421504609F057FA0026044605966C +:1077C0004FF002080696ADF81C6007B9FFDF04B958 +:1077D000FFDF4146504603F070FE50B907AA06A9E4 +:1077E00005A88DE807004246214650466368FFF72A +:1077F00094FB674807AB0660DDE9051204F114004D +:10780000CDF80090CDE90320CDE9013197F8232090 +:10781000594650466B6805F047F906000AD0022E1B +:1078200004D0032E14D0042E00D0FFDF09B0304660 +:10783000BDE8F08FBDF81C000028F7D00599CDE910 +:1078400000104246214650466368FFF793FBEDE780 +:10785000687840F008006870E8E72DE9F04F9BB0C9 +:1078600004464FF000084A48ADF85480ADF8308027 +:10787000ADF85080A0F80880ADF81480ADF81880FD +:10788000ADF82080ADF81C80007916460D464746BD +:10789000012808D0022806D0032804D0042802D0EA +:1078A00008201BB0C4E720460CF08AFED0BB284657 +:1078B0000CF086FEB0BB60680CF0CFFE90BB606839 +:1078C00048B160892189884202D8B1F5007F01D989 +:1078D0000C20E6E780460BAA06A92846FFF70FFA18 +:1078E0000028DED168688078C0F34100022808D102 +:1078F0009DF8190010F0380F03D028690CF0A4FE91 +:1079000080B905A92069FFF7B2F90028C9D120691B +:1079100050B1607880079DF8150000F0380002D55E +:10792000D0B301E011E0B8BB9DF8140080060ED57D +:107930009DF8150010F0380F03D060680CF084FE3D +:1079400018B960680CF089FE08B11020A9E707A9F2 +:107950006069FFF78CF90028A3D1606940B19DF8F8 +:107960001D0000F0070101293FD110F0380F3CD075 +:1079700008A9A069FFF77BF9002892D19DF81C00A7 +:10798000800632D49DF8200080062ED4A06904E041 +:107990007C0200201400002027E040B19DF8210067 +:1079A00000F00701012920D110F0380F1DD0E06848 +:1079B00018B10078C8B11C2817D20EAA611C204645 +:1079C000FFF7C4F90120B94660F30F27BA4607460E +:1079D0008DF84E0042F60300ADF84C000DF13B026D +:1079E00017A928680AF0E1FE08B1072059E79DF8B9 +:1079F0005C0016A9CDF80090C01CCDE9019100F003 +:107A0000FF0B00230BF20122514613A806F090F859 +:107A1000F0BBBDF858000990FE482A8929690092F8 +:107A2000CDE901106B89BDF82C202868069906F075 +:107A30007FF801007ED120784FF0020AC10601D400 +:107A400080062BD5ADF80C90606950B907A906A83F +:107A5000FFF7ADF99DF81D0020F00700401C8DF8E0 +:107A60001D009DF81C008DF84E7040F0C8008DF888 +:107A70001C0042F60210ADF84C000CA903AACDF888 +:107A800000A0CDE90121002340F2032213A800E069 +:107A90001EE0079906F04CF801004BD1DD484D4639 +:107AA00008385B460089ADF839000EA8CDE9029090 +:107AB000CDF80490CDF810904FF007090022CDF8D2 +:107AC0000090BDF858104FF6FF7005F077FF10B129 +:107AD000FFF79DF8E5E69DF83800000625D5294614 +:107AE000012060F30F218DF84E704FF42450ADF853 +:107AF0004C00ADF8105062789DF81000002362F33E +:107B000000008DF810006278CDF800A0520862F3F2 +:107B100041008DF8100004AACDE9012540F20322AE +:107B200013A806F005F8010004D1606888B3206945 +:107B3000A8B900E086E005A906A8FFF738F9607843 +:107B4000800706D49DF8150020F038008DF8150048 +:107B500005E09DF8140040F040008DF814008DF809 +:107B60004E7042F60110ADF84C00208940F2012120 +:107B7000B0FBF1F201FB1202606814ABCDF800809B +:107B8000CDE90103002313A8059905F0D1FF0100F9 +:107B900058D12078C00729D0ADF80C50A06950B951 +:107BA00008A906A8FFF703F99DF8210020F00700B7 +:107BB000401C8DF821009DF820008DF84E7040F09B +:107BC00040008DF8200042F60310ADF84C0015A9D6 +:107BD00003AACDF800A0CDE90121002340F2032241 +:107BE00013A8089905F0A4FF01002BD1E06868B341 +:107BF0002946012060F30F218DF84E7042F60410E3 +:107C0000ADF84C00E068002302788DF860204078E1 +:107C10008DF86100E06818AA4088ADF86200E0685D +:107C200000798DF86400E068C088ADF86500CDF893 +:107C30000090CDE901254FF4027213A805F078FFFA +:107C4000010003D0099800F0B3FF2AE67148032130 +:107C50000838017156B100893080BDF8500070803D +:107C6000BDF83000B080BDF85400F080002018E668 +:107C700070B501258AB016460B46012802D00228AD +:107C800016D104E08DF80E504FF4205003E08DF82B +:107C90000E5042F60100ADF80C005BB10024601CF0 +:107CA00060F30F2404AA08A918460AF07EFD18B153 +:107CB00007204AE5102048E504A99DF820205548F2 +:107CC000CDE90021801E02900023214603A802F284 +:107CD000012205F02DFF10B1FEF799FF35E54D4863 +:107CE00008380EB1C1883180057100202DE5F0B54E +:107CF00093B0074601268DF83E6041F60100ADF8CD +:107D00003C0012AA0FA93046FFF7B2FF002848D165 +:107D1000404C0025083CE7B31C2102A81CF0BBFF27 +:107D20009DF808008DF83E6040F020008DF80800B6 +:107D300042F60520ADF83C000E959DF83A001195ED +:107D400020F00600801C8DF83A009DF838006A4645 +:107D500020F0FF008DF838009DF8390009A920F0C7 +:107D6000FF008DF839000420ADF82C00ADF830008C +:107D70000EA80A9011A80D900FA80990ADF82E50EA +:107D800002A8FFF76AFD00280BD1BDF80000608152 +:107D900000E008E0BDF80400A081401CE0812571EE +:107DA000002013B0F0BD6581A581BDF84800F4E75F +:107DB0002DE9F74F1749A0B00024083917940A7924 +:107DC000A146012A04D0022A02D0082023B02FE5C0 +:107DD000CA88824201D00620F8E721988A4682426A +:107DE00001D10720F2E701202146ADF848004FF607 +:107DF000FF7860F30F21ADF84A808DF86E0042F6EF +:107E0000020B06918DF87240ADF86CB0ADF8704081 +:107E10001CA901E0840200201391ADF8508012A843 +:107E200005F073FF00252E462F460DAB072212A941 +:107E3000404605F06DFF78B10A285DD195B38EB349 +:107E4000ADF86450ADF866609DF85E008DF81440A2 +:107E500019AC012864D06BE09DF83A001FB30128EB +:107E600059D1BDF8381059451FD118A809A9019456 +:107E70000294CDE9031007200090BDF836101023BE +:107E80000022404605F0C4FFB0BBBDF860000428E6 +:107E900001D006284AD1BDF82410219881423AD158 +:107EA0000F2093E73AE0012835D1BDF83800B0F54E +:107EB000205F03D042F6010188422CD1BAF80600B7 +:107EC000BDF83610884201D1012700E0002705B136 +:107ED0009EB1219881421ED118A809AA019402944A +:107EE000CDE90320072000900D46102300224046D4 +:107EF00005F08EFF00B902E02DE04E460BE0BDF824 +:107F00006000022801D0102810D1C0B217AA09A918 +:107F10000AF02CFC50B9BDF8369086E7052055E7ED +:107F200005A917A8221D0AF040FC08B103204DE75F +:107F30009DF814000023001DC2B28DF81420229871 +:107F40000092CDE901401BA8069905F0F1FD10B99A +:107F500002228AF80420FEF75AFE37E710B50B46D6 +:107F6000401E88B084B205AA00211846FEF7EEFE36 +:107F700000200DF1080C06AA05A901908CE8070065 +:107F8000072000900123002221464FF6FF7005F0E4 +:107F900015FD0446BDF81800012800D0FFDF20467B +:107FA000FEF735FE08B010BDF0B5FF4F044687B0B0 +:107FB00038790E46032804D0042802D0082007B0E0 +:107FC000F0BD04AA03A92046FEF799FE0500F6D1EC +:107FD00060688078C0F3410002280AD19DF80D0046 +:107FE00010F0380F05D020690CF02EFB08B11020DE +:107FF000E5E7208905AA21698DE807006389BDF8B6 +:1080000010202068039905F093FD10B1FEF7FFFDE5 +:10801000D5E716B1BDF81400308004203871284629 +:10802000CDE7F8B50C0006460BD001464FF6FF75BC +:1080300000236A46284605F06DFF20B1FEF7E7FDF4 +:10804000F8BD1020F8BD69462046FEF710FE002856 +:10805000F8D1A078314600F001032846009A05F0D7 +:1080600085FFEBE730B587B0144600220DF1080C10 +:1080700005AD01928CE82C00072200920A460146C9 +:1080800023884FF6FF7005F099FCBDF8141021808D +:10809000FEF7BDFD07B030BD70B50D46042108F0F8 +:1080A000E3FD040000D1FFDF294604F11400BDE820 +:1080B000704004F0A9BC70B50D46042108F0D4FD51 +:1080C000040000D1FFDF294604F11400BDE8704030 +:1080D00004F0BDBC70B50D46042108F0C5FD0400D8 +:1080E00000D1FFDF294604F11400BDE8704004F020 +:1080F000D5BC70B50546042108F0B6FD040000D1DA +:10810000FFDF214628462368BDE870400122FEF7C4 +:108110004BBF70B50646042108F0A6FD040000D14F +:10812000FFDF04F1140004F05FFC401D20F00305A4 +:1081300011E0011D00880022431821463046FEF759 +:1081400033FF00280BD0607CABB2684382B2A068DA +:10815000011D08F046FCA06841880029E9D170BDE6 +:1081600070B50546042108F07FFD040000D1FFDF53 +:10817000214628466368BDE870400222FEF714BF1E +:1081800070B50E46054601F049F9040000D1FFDF45 +:108190000120207266726580207820F00F00001D9B +:1081A00020F0F00040302070BDE8704001F039B997 +:1081B00010B50446012900D0FFDF2046BDE810407D +:1081C0000121FAF70FB92DE9F04F97B04FF0000AEF +:1081D0000C008346ADF814A0D04619D0E06830B149 +:1081E000A068A8B10188ADF81410A0F800A0584606 +:1081F000FBF731F9070043F2020961D038782228F1 +:108200005CD30421584608F02FFD050005D103E09A +:10821000102017B0BDE8F08FFFDF05F1140004F067 +:10822000E3FB401D20F00306A078012803D00228BC +:1082300001D00720EDE7218807AA584605F035FD53 +:1082400030BB07A805F03DFD10BB07A805F039FDC0 +:1082500048B99DF82600012805D1BDF82400A0F5F5 +:108260002451023902D04FF45050D2E7E068B0B147 +:10827000CDE902A00720009005AACDF804A0049241 +:10828000A2882188BDF81430584605F097FB10B13C +:10829000FEF7BDFCBDE7A168BDF8140008809DF89D +:1082A0001F00C00602D543F20140B2E70B9838B177 +:1082B000A1780078012905D080071AD40820A8E702 +:1082C0004846A6E7C007F9D002208DF83C00A86810 +:1082D0004FF00009A0B1697C4288714391420FD9E7 +:1082E0008AB2B3B2011D08F032FB8046A0F800A0AC +:1082F00006E003208DF83C00D5F800804FF001091E +:108300009DF8200010F0380F00D1FFDF9DF820000D +:108310002649C0F3C200084497F8231010F8010C56 +:10832000884201D90F2074E72088ADF8400014A9D5 +:108330000095CDE90191434607220FA95846FEF763 +:108340005DFE002891D19DF8500050B9A078012819 +:1083500007D1687CB3B2704382B2A868011D08F0EF +:108360000AFB002055E770B5064615460C46084640 +:10837000FEF70CFC002805D12A4621463046BDE810 +:10838000704075E470BD13E570B51E4614460D00CF +:108390000ED06CB1616859B160B10349C98881429E +:1083A00008D0072070BD00007C020020FA2F0000DA +:1083B0001020F7E72068FEF7E9FB0028F2D13246EB +:1083C00021462846BDE87040FFF747BA70B515460C +:1083D0000C0006D038B1FE490989814203D007203C +:1083E000E0E71020DEE72068FEF7D0FB0028D9D1B7 +:1083F00029462046BDE87040D6E570B5064686B0F1 +:108400000D46144610460CF001F9D0BB60680CF024 +:1084100024F9B0BBA6F57F40FF3803D03046FBF708 +:108420001AF880B128466946FEF7E3FC00280CD113 +:108430009DF810100F2008293CD2DFE801F0080653 +:108440000606060A0A0843F2020006B0AAE703205D +:10845000FBE79DF80210012908D1BDF80010B1F525 +:10846000C05FF2D06FF4C052D142EED09DF806103A +:1084700001290DD1BDF80410A1F52851062907D214 +:1084800000E028E0DFE801F0030304030303DCE776 +:108490009DF80A1001290ED1BDF80810B1F5245F2E +:1084A000D3D0A1F524510239CFD00129CDD0022952 +:1084B00001D1CAE7FFDF606878B9002305AA294621 +:1084C000304605F027FD10B1FEF7A1FBBDE79DF892 +:1084D0001400800601D41020B7E7618822462846A0 +:1084E0006368FFF7BFFDB0E72DE9F043814687B031 +:1084F0008846144610460CF089F818B1102007B0D1 +:10850000BDE8F083002306AA4146484605F002FD77 +:1085100018B100BFFEF77BFBF1E79DF81800C0061D +:1085200002D543F20140EAE70025072705A8019597 +:1085300000970295CDE9035062884FF6FF734146DC +:10854000484605F065FC060013D160680CF05EF843 +:1085500060B960680195CDE90250009704952388C1 +:1085600062884146484605F053FC0646BDF81400B3 +:1085700020803046CEE739B1954B0A889B899A42D4 +:1085800002D843F2030070471DE610B586B0904C48 +:108590000423ADF81430638943B1A4898C4201D21D +:1085A000914205D943F2030006B010BD0620FBE757 +:1085B000ADF81010002100910191ADF800300221BA +:1085C0008DF8021005A9029104A90391ADF81220BB +:1085D0006946FFF7F8FDE7E72DE9FC4781460E46BF +:1085E00008460BF0EDFF88BB4846FAF734FF5FEA18 +:1085F00000080AD098F80000222829D30421484610 +:1086000008F032FB070005D103E043F20200BDE8A9 +:10861000FC87FFDF07F1140004F0FDF90546307810 +:10862000012803D0022804D00720F0E7A8070FD5BF +:1086300002E015F01C0F0BD0B079341DC00709D033 +:10864000E08838B1A0680BF0BBFF18B11020DEE75E +:108650000820DCE732782088002628B3A0F2011336 +:108660000721112B18D20CD2DFE803F00B090D0BF8 +:108670001D0B121D100B0B1D1D1D1D0B1D00022AB5 +:1086800011D10846C3E7012AFBD00CE02A0700E01D +:10869000EA06002AF5DA06E0A0F5C0721F2A02D920 +:1086A0007D3A022AEDD8C6B200F0B8FE50B198F873 +:1086B0002300CDE90006FA89234639464846FEF7ED +:1086C000EAFCA4E71120A2E72DE9F04F8BB01F468A +:1086D00015460C4683460026FAF7BDFE28B1007801 +:1086E000222805D208200BB094E543F20200FAE7F5 +:1086F000B80801D00720F6E7032F00D100274FF676 +:10870000FF79CCB1022D73D320460BF0A6FF30B910 +:1087100004EB0508A8F101000BF09FFF08B1102041 +:10872000E1E7AD1EAAB22146484605F09DFC38F8A7 +:10873000021C88425CD1ADB22549B80702D58889B0 +:10874000401C00E001201FFA80F8F80701D08F8953 +:1087500000E04F4605AA4146584605F0A6FA4FF0FC +:10876000070A4FF00009ACB3204608E04088102803 +:108770003ED8361D304486B2AE4239D2A0190288A6 +:108780004245F3D354E000BF9DF8170002074FD5D0 +:1087900084B304EB0608361DB8F80230B6B2102BCD +:1087A00026D89A19AA4223D8B8F8002091421FD19E +:1087B000C00620D5CDE900A90DF1080C0AAAA1191F +:1087C00048468CE80700B8F800100022584603E03D +:1087D0007C0200202CE00BE005F0F0F810B1FEF771 +:1087E00016FA80E7B8F80200BDF82810884202D0D7 +:1087F0000B2078E704E0B8F80200304486B206E0C7 +:10880000C00604D55846FEF778FC002888D19DF8AC +:108810001700BDF81A1020F010008DF81700BDF8F1 +:108820001700ADF80000FF235846009A05F09EFBA4 +:1088300005A805F046FA18B9BDF81A10B942A3D92F +:108840000421584608F010FA040000D1FFDFA28985 +:108850005AB1CDE900A94D46002321465846FEF7FE +:108860001AFC0028BDD1A5813DE700203BE72DE99A +:10887000FF4F8BB01E4617000D464FF0000412D07C +:10888000B00802D007200FB0C4E4032E00D10026A8 +:108890005DB108460BF0D8FE28B93888691E084437 +:1088A0000BF0D2FE08B11020EDE7C74AB00701D5A2 +:1088B000D18900E00121F0074FF6FF7802D0D0897E +:1088C000401E00E0404686B206AA0B9805F0EDF97E +:1088D0004FF000094FF0070B0DF1140A39E000BF0B +:1088E0009DF81B00000734D5CDF80490CDF800B0FA +:1088F000CDF80890CDE9039A434600220B9805F085 +:1089000087FA60BB05B3BDF814103A8821442819D2 +:10891000091D8A4230D3BDF81E2020F8022BBDF875 +:10892000142020F8022BCDE900B9CDE90290CDF852 +:1089300010A0BDF81E10BDF8143000220B9805F0F1 +:1089400067FA08B103209EE7BDF814002044001D1B +:1089500084B206A805F0B5F920B10A2806D0FEF7C2 +:1089600056F990E7BDF81E10B142B9D934B17DB1C6 +:108970003888A11C884203D20C2084E7052082E7B6 +:1089800022462946404605F06FFB01462819018022 +:10899000A41C3C80002076E710B504460BF036FEA0 +:1089A00008B1102010BD8848C0892080002010BD6B +:1089B000F0B58BB00D460646142103A81CF06BF9E8 +:1089C00001208DF80C008DF8100000208DF81100AA +:1089D000ADF814503046FAF73EFD48B10078222831 +:1089E00012D30421304608F03FF9040005D103E01A +:1089F00043F202000BB0F0BDFFDF04F114000746A4 +:108A000004F009F8800601D40820F3E7207C022155 +:108A100040F00100207409A80094CDE9011007225C +:108A200003A930466368FEF7E9FA20B1217C21F002 +:108A300001012174DEE729463046F9F7C4FC08A994 +:108A4000384603F0D7FF00B1FFDFBDF82040172CF8 +:108A500001D2172000E02046A84201D92C4602E0AE +:108A6000172C00D2172421463046FFF724FB21465D +:108A70003046F9F7CEF90020BCE7F8B51C4615469C +:108A80000E46069F08F022FA2346FF1DBCB231466F +:108A90002A46009407F00DFEF8BD70B50C46054659 +:108AA0000E2120461CF0D5F8002020802DB1012D8C +:108AB00001D0FFDF76E4062000E00520A07171E41C +:108AC00010B548800878134620F00F00001D20F0F4 +:108AD000F00080300C4608701422194604F108009A +:108AE0001CF07DF800F09DFC3748046010BD2DE9B6 +:108AF000F047DFF8D890491D064621F003011746DC +:108B00000C46D9F8000007F0EAFE050000D1FFDFAF +:108B10004FF000083560A5F800802146D9F8000024 +:108B200007F0DDFE050000D1FFDF7560A5F80080CD +:108B30007FB104FB07F1091D0BD0D9F8000007F045 +:108B4000CEFE040000D1FFDFB460C4F80080BDE8B1 +:108B5000F087C6F80880FAE72DE9F0411746491D6D +:108B600021F00302194D064601681446286807F0F3 +:108B7000E1FE22467168286807F0DCFE3FB104FB85 +:108B800007F2121D03D0B168286807F0D3FE042055 +:108B900008F012F80446042008F016F8201A0128FC +:108BA00004D12868BDE8F04107F08EBEBDE8F08131 +:108BB00010B50C4605F045F800B1FFDF2046BDE8D2 +:108BC0001040FEF724B800007C02002014000020B2 +:108BD00038B50C468288817B19B14189914200D910 +:108BE0000A462280C188121D90B26A4607F06DF9CC +:108BF000BDF80000032800D30320C1B2208800F094 +:108C0000A3FF38BD38B50C468288817B19B1018934 +:108C1000914200D90A462280C188121D90B26A464C +:108C200007F053F9BDF80000022800D30220C1B2BA +:108C3000208800F089FF401CC0B238BD2DE9FE4FEE +:108C40000C46FD4981464022D1E90201CDE90101EE +:108C500009F1030020F00301C91C21F00301009178 +:108C60006846114607F01DFEF44E002C02D1F44A6E +:108C700000999160009901440091357F05F101054B +:108C800004D1E8B209F018FD00B1FFDF009800EB55 +:108C90000510C01C20F0030100915CB9707AB27A13 +:108CA0001044C2B200200870308C80B204F051FE33 +:108CB00000B1FFDF0098316A084400902146684601 +:108CC00000F00DFF0098C01C20F003000090B37A64 +:108CD000F27A717A04B1002007F0D9FE00990844B5 +:108CE00000902146684600F03AFF00273D46B24614 +:108CF00096F801800CE0284600F0D4FE0646817804 +:108D00008088F9F71DF971786D1C00FB0177EDB2D1 +:108D10004545F0D10098C01C20F00300009004B13C +:108D200000203946F9F717F9009900270844009008 +:108D30003D469AF801800CE0284600F0B3FE064656 +:108D4000C1788088FEF763FC71786D1C00FB0177A9 +:108D5000EDB24545F0D10098C01C20F00300009012 +:108D600004B100203946FEF75BFC00994FF0000883 +:108D70000844009045469AF801700EE0284600F03D +:108D800091FE0646807B30B106F1080001F0DDFE61 +:108D9000727800FB02886D1CEDB2BD42EED10098E6 +:108DA000C01C20F00300009004B10020414601F0F7 +:108DB000D0FE0099084400902146684600F049FE24 +:108DC0000098C01D20F0070200922CBB9D49002096 +:108DD000FAF743F8FBF713FB984801AA002110307B +:108DE000F8F7CAFA00B1FFDF9AF81D00FEF77FFF1F +:108DF00000B1FFDF91484FF4F67144301BF04BFF98 +:108E00008E480421443080F8E91180F8EA110621E7 +:108E100080F8EB11032101710099A1EB0900BDE875 +:108E2000FE8F70B5854C06464434207804EB40151F +:108E3000E078083590B9A01990F8E80100280ED024 +:108E4000A0780F2800D3FFDF202128461BF023FF46 +:108E5000687866F3020068700120E070284670BDF3 +:108E60002DE9F04105460C46002700780521904683 +:108E70003E46B1EB101F00D0FFDF287A50B1012829 +:108E80000ED0FFDFA8F800600CB1278066800020BC +:108E9000BDE8F0810127092674B16888A08008E048 +:108EA0000227142644B16888A0802869E060A88A57 +:108EB0002082287B2072E5E7A8F80060E7E710B57C +:108EC0005F4C6068C11D21F00701814200D0FFDFC7 +:108ED0005A4801210022017042700172417203233D +:108EE0008372C17202730274052202831F224283BD +:108EF000417455A242610A22027741774FF4B06172 +:108F000001626168416010BD30B54D4C1568636801 +:108F100010339D4202D20420136030BD474B5D7870 +:108F20005A6802EB0512107051700320D080172090 +:108F300090800120D0709070002090735878401C71 +:108F40005870606810306060002030BD70B5064613 +:108F50003A480024457807E0204600F0A3FD017858 +:108F6000B14204D0641CE4B2AC42F5D1002070BD23 +:108F7000F7B5074608780C4610B3FFF7E7FF05463C +:108F8000A7F12006202F06D0052E19D2DFE806F023 +:108F90000F2B2B151A0000F090FD0DB1697800E041 +:108FA0000021401AA17880B20844FF2808D8A07890 +:108FB00030B1A088022824D202E06088172820D28D +:108FC0000720FEBD207AE0B161881729F8D3A18877 +:108FD0001729F5D3A1790029F2D0E1790029EFD042 +:108FE000402804D9ECE7242F0BD1207A48B16188BE +:108FF0004FF6FB70814202D8A188814201D904203A +:10900000FEBD65B9207802AA0121FFF77DFF002887 +:10901000F6D12078FFF79AFF050000D1FFDF052E7B +:1090200025D2DFE806F003181B151E00A078687033 +:10903000A088E8801CE00000545002009803002043 +:109040001C000020000000206E5246357800000011 +:109050006088A8800CE0A078A87009E0A078E8708B +:1090600006E054F8020FA8606068E86000E0FFDFE7 +:109070000020FEBD1A2835D00DDC132832D2DFE8DF +:1090800000F01B31203131272723252D31312931A3 +:109090003131312F0F00302802D003DC1E2821D1BE +:1090A000072070473A3809281CD2DFE800F0151B6A +:1090B0000F1B1B1B1B1B07000020704743F2040003 +:1090C000704743F202007047042070470D2070473C +:1090D0000F207047082070471120704713207047F9 +:1090E000062070470320704710B5007800F001009B +:1090F00006F0E2FEBDE81040BCE70EB5017801F0D5 +:1091000001018DF80010417801F001018DF8011086 +:109110000178C1F340018DF802104178C1F340019C +:109120008DF80310017889088DF8041041788908BA +:109130008DF8051081788DF80610C1788DF807102C +:1091400000798DF80800684605F0DDFAFFF792FF18 +:109150000EBD2DE9F84FDFF8F883FE4C00261FE026 +:10916000012000F03FFD0120FFF75BFE0546402196 +:109170004746D8F8080007F0B2FB686000B9FFDF87 +:10918000686805F06EF8A8B12846FAF758FC28463A +:1091900000F02EFD20B940226968B86807F0CAFBCC +:1091A00094F9E9010428DBDA022007F005FD0746FF +:1091B0000025A6E040226968D8F8080007F0BAFB4D +:1091C000F2E7B8F802104046491C89B2A8F802102C +:1091D000B94201D3002141800221B8F8020007F012 +:1091E00043FD002865D0B8F80200694606F0CBFDC3 +:1091F000FFF740FF00B1FFDF9DF8000078B1B8F83D +:10920000020007F075FE5FEA000900D1FFDF484663 +:1092100007F0E3F818B1B8F8020002F03DF9B8F829 +:10922000020007F053FE5FEA000900D1FFDF484665 +:1092300007F0CBF8E8BB0321B8F8020007F014FDF3 +:109240005FEA000B48D1FFDF46E000BFDBF810000B +:1092500010B10078FF2849D0022000F0C3FC0220A2 +:10926000FFF7DFFD8246484607F0BBF9CAF8040065 +:1092700000B9FFDFDAF8040007F083FA002100905C +:109280000170B8F802105046AAF8021001F00AFE68 +:10929000484607F078FA00B9FFDF504600F0A8FC16 +:1092A00018B99AF80100000704D50099CBF81010FE +:1092B00012E024E0DBF8100038B10178491C11F00D +:1092C000FF01017008D1FFDF06E000221146484689 +:1092D00000F0BDFB00B9FFDF94F9EA01022805DBCD +:1092E000B8F8020001F0A3FD0028AFD194F9E9011C +:1092F000042804DB484607F0AAFA00B101266D1CD9 +:10930000EDB2BD4204D294F9EA010228BFF659AF8A +:10931000002E7FF423AFBDE8F84F032000F062BCBD +:1093200010B58B4CE06008682061AFF2D91002F0F4 +:1093300042FD607010BD87480021443801708448A8 +:10934000017085494160704770B505464FF0805007 +:109350000C46D0F8A410491C05D1D0F8A810C94378 +:109360000904090C0BD050F8A01F01F0010129706D +:10937000416821608068A080287830B970BD0621DE +:1093800020460AF0F8FD01202870607940F0C00006 +:10939000607170BD70B54FF080540D46D4F88010E8 +:1093A000491C0BD1D4F88410491C07D1D4F888107B +:1093B000491C03D1D4F88C10491C0CD0D4F880106F +:1093C0000160D4F884104160D4F888108160D4F82A +:1093D0008C10C16002E010210AF0CDFDD4F890009D +:1093E000401C0BD1D4F89400401C07D1D4F898004D +:1093F000401C03D1D4F89C00401C09D054F8900FB5 +:10940000286060686860A068A860E068E86070BD77 +:109410002846BDE8704010210AF0ADBD4D480079E6 +:10942000FFE470B54B4CE07830B3207804EB40108B +:10943000407A00F00700204490F9E801002800DCA1 +:10944000FFDF2078002504EB4010407A00F0070091 +:10945000011991F8E801401E81F8E8012078401CCC +:10946000C0B220700F2800D12570A078401CA070D9 +:109470000AF0E4FCE57070BDFFDF70BD3EB5054647 +:10948000032107F0F1FB0446284607F01FFD0546BF +:1094900004B9FFDF206918B10078FF2800D1FFDF91 +:1094A00001AA6946284600F0D2FA60B9FFDF0AE057 +:1094B000002202A9284600F0CAFA00B9FFDF9DF891 +:1094C000080000B1FFDF9DF80000411E8DF800107C +:1094D000EED220690199884201D1002020613EBD71 +:1094E00070B50546A0F57F400C46FF3800D1FFDF80 +:1094F000012C01D0FFDF70BDFFF790FF040000D109 +:10950000FFDF207820F00F00401D20F0F0005030E9 +:10951000207065800020207201202073BDE870401B +:109520007FE72DE9F04116460D460746FFF776FF27 +:10953000040000D1FFDF207820F00F00401D20F054 +:10954000F00050302070678001202072286805E00C +:109550001C000020DC030020C81400202061A88823 +:10956000A0822673BDE8F0415BE77FB5FFF7EEFC14 +:10957000040000D1FFDF02A92046FFF729FB0546C2 +:1095800003A92046FFF73EFB8DF800508DF801003F +:10959000BDF80800001DADF80200BDF80C00001D6C +:1095A000ADF80400E088ADF80600684606F066FCF9 +:1095B000002800D0FFDF7FBD2DE9F047DFF8FC93E6 +:1095C0000546002799F8000010B10820BDE8F08793 +:1095D00028460BF01BF808B11020F7E7F84C20786C +:1095E00008B9FFF76CFCA07A617A0844C6B200F0B3 +:1095F00064FAB04207D2301AC1B22A460020FFF7FF +:1096000083FC0700E2D1D9F804004E46C01C20F0CC +:109610000300C9F8040000F040FB716800EB01088A +:1096200001214046FFF70AFB06462968404488426C +:1096300002D8B6F5803F15D328600020FFF786FCDE +:1096400005000DD005F11300D9F8041020F0030037 +:109650004E46884200D0FFDF6078401E6070756023 +:109660000420B3E700214046FFF7E8FA0446A6428B +:1096700000D0FFDF04EB0801C9F8041029604FF6A1 +:10968000FF71A9F80210012189F8001038469DE702 +:109690002DE9F0410446C94817460E46007810B13E +:1096A0000820BDE8F08108460AF08AFF08B11020C2 +:1096B000F7E7C34D287808B9FFF701FC601E1E28A4 +:1096C00007D8012C22D13078FE281FD82877002017 +:1096D000E7E7A4F120001F2805D8E0B23A4631465A +:1096E000BDE8F04144E4A4F140001F2805D831460C +:1096F0002046BDE8F04100F0A3BAA4F1A0001F2865 +:1097000004D80020A02C03D0A12C06D00720C8E745 +:10971000317801F001016977C3E731680922F8293E +:1097200001D38B0701D01046BBE76B7C03F003032A +:10973000012B04D16B8BD7339CB28C42F3D82962B6 +:10974000AFE72DE9F04781460E4608460AF05EFF76 +:1097500048B948460AF078FF28B909F1030020F01B +:109760000301494501D0102030E795484FF0000A29 +:109770004430817869B14178804600EB4114083467 +:10978000378832460021204600F040FA050004D018 +:1097900027E0A6F800A0052018E7B9F1000F24D0B3 +:1097A0003088B84201D90C251FE0607800F0070529 +:1097B000284600F017FA08EB0507324697F8E8014B +:1097C0004946401C87F8E801204607F5F47700F089 +:1097D0001DFA05463878401E3870032000F002FA62 +:1097E0002DB10C2D01D0A6F800A02846EEE6607839 +:1097F000724E00F00701012923D002290CD0032961 +:1098000033D0FFDF98F801104046491CC9B288F8F0 +:1098100001100F2934D035E0616821B1000702D46E +:109820006088FFF72BFE98F8EA014746012802D12D +:10983000707802F0DFFA97F9EA010428E2DBFFDF33 +:10984000E0E7616819B14022B06807F073F898F852 +:10985000E9014746032802D1707802F0CBFA97F964 +:10986000E9010428CEDBFFDFCCE7C00602D5608823 +:10987000FFF704FE98F9EB010628C3DBFFDFC1E721 +:1098800080F801A08178491E8170617801F007019C +:1098900001EB080090F8E811491C80F8E811A4E7F2 +:1098A00070B50D4604460AF08BFE18B928460AF03A +:1098B000ADFE08B1102070BD29462046BDE87040BD +:1098C00008F031BF70B5044615460E4608460AF04A +:1098D00077FE18B928460AF099FE08B1102070BD2D +:1098E000022C03D0102C01D0092070BD2A4631462D +:1098F000204608F03BFF0028F7D0052070BD70B56A +:1099000014460D4606460AF05BFE38B928460AF0B2 +:109910007DFE18B920460AF097FE08B1102070BDF0 +:1099200022462946304608F040FF0028F7D007209D +:1099300070BD3EB504460AF069FE08B110203EBD78 +:10994000684604F03FFEFFF795FB0028F7D19DF82D +:1099500006002070BDF808006080BDF80A00A080F5 +:1099600000203EBD70B505460C4608460AF06CFE68 +:1099700020B93CB120680AF049FE08B1102070BD42 +:10998000A08828B121462846BDE87040FDF7BEBE3C +:10999000092070BD70B504460D4608460AF010FE59 +:1099A00030B9601E1E2818D828460AF009FE08B1F2 +:1099B000102070BD022C05D9072070BD1C000020AE +:1099C0009803002004B9FFDFF94800EB840050F849 +:1099D000041C2846BDE870400847A4F120001F2859 +:1099E00005D829462046BDE87040FAF790BCF02C17 +:1099F000E2D1A8680AF0E4FD0028D9D1284606F093 +:109A0000A6FABDE87040FFF735BB70B504460D46B9 +:109A100008460AF0FBFD30B9601E1E280DD8284606 +:109A20000AF0CEFD08B11020C7E7012C01D0022CAE +:109A300001D10620C1E70720BFE7A4F120001F28BD +:109A4000F9D829462046BDE87040FAF7B8BC06F0C0 +:109A50008BBC38B50446D748007B00F00105D9B966 +:109A6000F9F787FA0DB1226800E00022D248417868 +:109A7000C06804F09EFBD0481030C0788DF800001C +:109A800010B1012802D004E0012000E000208DF890 +:109A90000000684604F010FE002D02D02068283037 +:109AA000206038BD30B5C34D04466878A04200D868 +:109AB000FFDF686800EB041030BD70B5BD480025BD +:109AC0002C46467807E02046FFF7ECFF4078641C00 +:109AD0002844C5B2E4B2B442F5D128466DE72DE979 +:109AE000F0410C46064600F006F907463068C01CF7 +:109AF00020F00302326014BBAE483B4608212430FC +:109B00000AF038FC002409E0082C10D2DFE804F049 +:109B1000060408080A040406A84804E0A84802E06D +:109B2000A84800E0A8480AF045FC054600E0FFDF31 +:109B3000A54200D0FFDF641CE4B2082CE4D33068F7 +:109B400000EB07103060ACE5021D5143452900D2FF +:109B500045210844C01CB0FBF2F0C0B270472DE9AB +:109B6000FC5F064693484FF000088B464746444644 +:109B700090F8019022E02046FFF794FF050000D105 +:109B8000FFDF687869463844C7B22846FFF720F8F7 +:109B9000824601A92846FFF735F80346BDF80400C0 +:109BA0005246001D81B2BDF80000001D80B207F0D2 +:109BB000D9F86A78641C00FB0288E4B24C45DAD11B +:109BC0003068C01C20F003003060BBF1000F00D0F3 +:109BD00000204246394607F0D3F831680844306027 +:109BE000BDE8FC9F7349443108710020C87070477C +:109BF00070494431CA782AB10A7801EB4211083120 +:109C0000814201D001207047002070472DE9F041CA +:109C100006460078154600F00F0400201080601EF4 +:109C20000F46052800D3FFDF61482A46103000EBBD +:109C30008400394650F8043C3046BDE8F0411847EE +:109C400070B50C46402802D0412806D120E0A0780B +:109C500061780D18E178814201D90720ADE62078BE +:109C6000012801D91320A8E6FF2D08D808F008FF25 +:109C700006460AF09CF8301A801EA84201DA12202B +:109C80009BE64C482168816021790173002094E6AD +:109C9000BDE87040084600F05EB82DE9F0470027A7 +:109CA000DFF810A13E463D46B9463C469AF8018091 +:109CB0000AE02046FFF7F6FE4178807B0E4410FB59 +:109CC0000155641CE4B27F1C4445F2D109EB8700C6 +:109CD000C6EBC60100EB81009AF8092000EB850174 +:109CE00001EBC2019AF80A209AF80B0001EBC201BD +:109CF00001EB80006AE42DE9F047DFF8B890002618 +:109D0000344699F8090099F80A2099F8017002443C +:109D1000D5B299F80B20104400F0FF0808E0204667 +:109D2000FFF7C0FE817B407811FB0066641CE4B243 +:109D3000BC42F4D199F8090099F80A102844284443 +:109D40004044401C01B1012108448419FF2C00D972 +:109D5000FFDFE0B23AE438B50446407800F0030093 +:109D6000012803D002280BD0072038BD606858B105 +:109D70000AF073FCD0B960680AF066FC20B915E0FF +:109D800060680AF01DFC88B969462046FCF71EF998 +:109D90000028EAD1607800F00300022816D19DF86F +:109DA000000098B160680AF04FFC78B1102038BD0F +:109DB00054500200980300201C000020BD41000008 +:109DC0001FAC00005D2F0000AB2401006189F82961 +:109DD0000DD8208988420AD8607800F003020A482A +:109DE000012A06D1D731026A89B28A4201D20920FA +:109DF000DDE794E80E0000F1100585E80E000AB9D1 +:109E0000002101830020D2E7980300202DE9F041D2 +:109E1000074614468846084601F01CFD064608EB36 +:109E200088001C22796802EBC0000D18688C58B1BC +:109E30004146384601F016FD014678680078C200B8 +:109E4000082305F120000CE0E88CA8B14146384613 +:109E500001F00FFD0146786808234078C20005F143 +:109E6000240006F0BEFD38B1062121726681D0E9DA +:109E70000010C4E9031009E0287809280BD0052058 +:109E8000207266816868E060002028702046BDE886 +:109E9000F04101F0D5BC072020726681F4E72DE97E +:109EA000F04116460D460746406801EB85011C222D +:109EB00002EBC1014418204601F0FDFC40B1002135 +:109EC000708865F30F2160F31F4107200AF02CFB17 +:109ED00009202070324629463846BDE8F04195E712 +:109EE0002DE9F0410E46074600241C21F07816E0CB +:109EF00004EB8403726801EBC303D25C6AB1FFF721 +:109F00008DFA050000D1FFDF6F802A4621463046DA +:109F1000FFF7C5FF0120BDE8F081641CE4B2A04258 +:109F2000E6D80020F7E770B5064600241C21C0786B +:109F30000AE000BF04EB8403726801EBC303D51889 +:109F40002A782AB1641CE4B2A042F3D8402070BD44 +:109F5000282128461AF07DFE7068808928812046D5 +:109F600070BD70B5034600201C25DC780DE000BFF5 +:109F700000EB80065A6805EBC6063244167816B127 +:109F8000128A8A4204D0401CC0B28442F0D84020D9 +:109F900070BDF0B5044600201C26E5780EE000BF39 +:109FA00000EB8007636806EBC7073B441F788F42CE +:109FB00002D15B78934204D0401CC0B28542EFD8F6 +:109FC0004020F0BD0078032801D000207047012018 +:109FD00070470078022801D00020704701207047A8 +:109FE0000078072801D000207047012070472DE934 +:109FF000F041064688461078F1781546884200D32D +:10A00000FFDF2C781C27641CF078E4B2A04201D852 +:10A01000201AC4B204EB8401706807EBC101084444 +:10A02000017821B14146884708B12C7073E7287840 +:10A03000A042E8D1402028706DE770B514460B8827 +:10A040000122A240134207D113430B8001230A22AD +:10A05000011D06F090FC047070BD2DE9FF4F81B02A +:10A060000878DDE90E7B9A4691460E4640072CD4CF +:10A07000019806F03DFF040000D1FFDF07F104085E +:10A0800020461FFA88F106F07CF8050000D1FFDFBA +:10A09000204629466A4606F0C6FA0098A0F80370E2 +:10A0A000A0F805A0284606F06CFB017869F30601CC +:10A0B0006BF3C711017020461FFA88F106F0A4F86F +:10A0C00000B9FFDF019803F0E9FF06EB0900017F0B +:10A0D000491C017705B0BDE8F08F2DE9F84F0E4619 +:10A0E0009A4691460746032106F0BEFD0446008DC0 +:10A0F000DFF8B485002518B198F80000B0421ED1F1 +:10A10000384606F0F5FE070000D1FFDF09F1040133 +:10A11000384689B206F035F8050010D03846294691 +:10A120006A4606F080FA009800210A460180817094 +:10A1300004F084F80098C01DCAF8000021E098F8E7 +:10A140000000B04216D104F1260734F8341F012074 +:10A1500000FA06F911EA090F00D0FFDF2088012379 +:10A1600040EA090020800A22391D384606F01EFC0C +:10A17000067006E0324604F1340104F12600FFF7D0 +:10A180005CFF0A2188F800102846BDE8F88FFEB56C +:10A1900014460D46064602AB0C220621FFF79DFF32 +:10A1A000002826D00299687812220A70801C487014 +:10A1B00008224A80A870208888806088C880A0888B +:10A1C0000881E088488100240C20CDE900040523A3 +:10A1D000062229463046FFF740FF2146002266F35B +:10A1E0001F41F02310460AF0F5F86878801C68706B +:10A1F0000120FEBDFEB514460D460622064602AB02 +:10A200001146FFF76AFF002812D0029B132000219D +:10A210001870A8785870022058809C800620CDE9DC +:10A2200000010246052329463046FFF716FF0120AC +:10A23000FEBD2DE9FE430C46804644E002AB0E22F3 +:10A2400007214046FFF749FF002841D060681C22E3 +:10A2500067788678BF1C06EB860102EBC1014518C2 +:10A2600002981421017047700A214180698A018196 +:10A27000E98A4181A9888180A9898181304601F0DC +:10A28000E9FA029905230722C8806F70042028701C +:10A2900000250E20CDE9000521464046FFF7DDFEF2 +:10A2A000294666F30F2168F31F41F023002207209F +:10A2B0000AF090F86078FD49801C60706268204662 +:10A2C000921CFFF794FE606880784028B6D1012088 +:10A2D000BDE8FE83FEB50D46064638E002AB0E2211 +:10A2E00007213046FFF7F9FE002835D068681C23A7 +:10A2F000C17801EB810203EBC20284180298152297 +:10A300000270627842700A224280A2894281A28849 +:10A310008281084601F09EFA014602988180618A96 +:10A32000C180E18A0181A088B8B10020207000219D +:10A330000E20CDE900010523072229463046FFF70C +:10A340008CFE6A68DA492846D21CFFF750FE68681E +:10A35000C0784028C2D10120FEBD0620E6E72DE9E5 +:10A36000FE430C46814644E0204601F08EFAD0B30D +:10A3700002AB082207214846FFF7AFFE0028A7D00E +:10A3800060681C2265780679AD1C06EB860102EB3D +:10A39000C10147180298B7F8108006210170457076 +:10A3A00004214180304601F055FA01460298052308 +:10A3B0000722C180A0F804807D7008203870002535 +:10A3C000CDE9000521464846FFF747FE294666F3DA +:10A3D0000F2169F31F41F0230022072009F0FAFF43 +:10A3E0006078801C60706268B2492046121DFFF7D9 +:10A3F000FEFD606801794029B6D1012068E72DE9AA +:10A40000F34F83B00E4680E0304601F03EFA00285C +:10A4100075D071681C2091F8068008EB880200EB6B +:10A42000C2000C184146304601F023FA0146A078DC +:10A43000C30070684078C20004F1240006F0EDFA11 +:10A4400007468088E18B401A80B2002581B3AA4676 +:10A45000218B814200D808468146024602AB072183 +:10A460000398FFF73AFE010028D0BAF1000F03D09D +:10A47000029AB888022510808B46E28B3968A9EBD6 +:10A4800005001FFA80FA0A440398009206F030FD96 +:10A49000ED1D009A59465346009506F03EF9E08BB3 +:10A4A000504480B2E083B988884209D1012508E090 +:10A4B000FFE7801C4FF0010A80B2C9E7002009E6DF +:10A4C0000025CDE90095238A072231460398FFF73E +:10A4D000C4FDE089401EE0818DB1A078401CA070D1 +:10A4E0007068F178427811FB02F1CAB281690123E8 +:10A4F0000E3006F040FA80F800800020E083726899 +:10A500006D493046921DFFF772FD706881794029D0 +:10A510007FF47AAF0120DDE570B5064648680D4648 +:10A5200014468179402910D104EB84011C2202EBEE +:10A53000C101084401F0E0F9002806D06868294606 +:10A5400084713046BDE8704059E770BDFEB50C46D9 +:10A550000746002645E0204601F097F9D8B3606829 +:10A560001C22417901EB810102EBC1014518688988 +:10A5700000B9FFDF02AB082207213846FFF7ADFD27 +:10A58000002833D00299607816220A70801C487027 +:10A59000042048806068407901F05CF90146029827 +:10A5A0000523072281806989C1800820CDE9000642 +:10A5B00021463846FFF751FD6078801C6070A889FD +:10A5C00069890844B0F5803F00D3FFDFA889698915 +:10A5D0000844A8816E81626838492046521DFFF701 +:10A5E00006FD606841794029B5D10120FEBD30B536 +:10A5F000438C458BC3F3C704002345B1838B641E92 +:10A60000ED1AC38A6D1E1D4495FBF3F3E4B22CB121 +:10A61000008918B1A04200D8204603444FF6FF70CD +:10A62000834200D3034613800C7030BD2DE9FC41FA +:10A63000074616460D46486802EB86011C2202EBCF +:10A64000C10144186A4601A92046FFF7D0FFA0893E +:10A65000618901448AB2BDF80010914212D0081AF3 +:10A6600000D5002060816868407940280AD12046E2 +:10A6700001F038F9002805D0686829464671384647 +:10A68000FFF764FFBDE8FC812DE9FE4F8946804657 +:10A6900015465088032106F0E7FA8346B8F8020011 +:10A6A00040280DD240200CE030000020C59F000063 +:10A6B000D39F0000E19F0000F9B80000E5B800005A +:10A6C000403880B282460146584601F0DEF8002844 +:10A6D0007ED00AEB8A001C22DBF8041002EBC000DB +:10A6E0000C18204601F0E7F8002877D1B8F80000F0 +:10A6F000E18A88423CD8A189D1B348456ED1002671 +:10A700005146584601F0AEF8218C0F18608B48B9BD +:10A71000B9F1020F62D3B8F804006083618A8842FD +:10A7200026D80226A9EB06001FFA80F9B888A28B6A +:10A73000801A002814DD4946814500DA084683B2B4 +:10A7400068886968029139680A44CDE9003206F0E8 +:10A75000BDFBDDE90121F61D009B009605F0A9FF78 +:10A76000A18B01EB090080B2A083618B884207D9DD +:10A77000688803B052465946BDE8F04F01F0D9B899 +:10A780001FD14FF009002872B8F802006881D7E99C +:10A790000001C5E90401608BA881284601F050F84A +:10A7A0005146584601F05EF80146DBF804000823E4 +:10A7B0000078C20004F1200006F013F90020A08305 +:10A7C0006083A0890AF0FF02401EA081688800E033 +:10A7D00004E003B05946BDE8F04F27E7BDE8FE8F1F +:10A7E0002DE9F041064615460F461C46184609F06D +:10A7F000E7FE18B9206809F009FF08B1102015E438 +:10A800007168688C0978B0EBC10F01D313200DE497 +:10A810003946304601F026F8014670680823007872 +:10A82000C20005F1200006F0A6F8D4E90012C0E944 +:10A8300000120020E3E710B50446032106F014FAE5 +:10A840000146007800F00300022805D02046BDE84C +:10A85000104001F114029AE48A8A2046BDE81040B3 +:10A86000C8E470B50446032106F0FEF9054601462A +:10A870002046FFF774FD002816D029462046FFF732 +:10A8800065FE002810D029462046FFF723FD00284A +:10A890000AD029462046FFF7CCFC002804D02946E0 +:10A8A0002046BDE87040AAE570BD2DE9F0410C4698 +:10A8B00080461EE0E178427811FB02F1CAB281695C +:10A8C00001230E3006F08DF8077860681C22C179EC +:10A8D000491EC17107EB8701606802EBC101461890 +:10A8E0003946204600F0D1FF18B1304600F0DCFFB9 +:10A8F00020B16068C1790029DCD180E7FEF78EFDC8 +:10A90000050000D1FFDF0A202872384600F0A2FFC0 +:10A9100068813946204600F0ACFF01466068082394 +:10A920004078C20006F1240006F05BF8D0E9001080 +:10A93000C5E90310A5F80280284600F081FFB07831 +:10A9400000B9FFDFB078401EB07058E770B50C4614 +:10A950000546032106F088F901464068C279224481 +:10A96000C2712846BDE870409FE72DE9FE4F824640 +:10A97000507814460F464FF0000800284FD00128A9 +:10A9800007D0022822D0FFDF2068B8606068F86036 +:10A9900024E702AB0E2208215046FFF79EFB002859 +:10A9A000F2D00298152105230170217841700A2107 +:10A9B0004180C0F80480C0F80880A0F80C8062884C +:10A9C00082810E20CDE90008082221E0A6783046D9 +:10A9D00000F040FF054606EB86012C22786802EB6A +:10A9E000C1010822465A02AB11465046FFF775FBDB +:10A9F0000028C9D0029807210170217841700421F4 +:10AA0000418008218580C680CDE9001805230A46CB +:10AA100039465046FFF721FB87F80880DEE6A67826 +:10AA2000022516B1022E13D0FFDF2A1D914602AB7C +:10AA300008215046FFF751FB0028A5D002980121BC +:10AA4000022E0170217841704580868002D005E099 +:10AA50000625EAE7A188C180E1880181CDE9009857 +:10AA60000523082239465046D4E710B50446032191 +:10AA700006F0FAF8014600F108022046BDE8104051 +:10AA800073E72DE9F05F0C4601281DD0957992F807 +:10AA90000480567905EB85011F2202EBC10121F0EC +:10AAA000030B08EB060111FB05F14FF6FF7202EAFA +:10AAB000C10909F1030115FB0611F94F21F0031A31 +:10AAC00040B101283DD124E06168E57891F800802B +:10AAD0004E78DFE75946786805F001FF606000B9FD +:10AAE000FFDF594660681AF0D6F8E570514678687D +:10AAF00005F0F5FE6168486100B9FFDF60684269F2 +:10AB000002EB09018161606880F80080606846702E +:10AB100017E0606852464169786805F00BFF5A46B5 +:10AB20006168786805F006FF032006F045F80446E2 +:10AB3000032006F049F8201A012802D1786805F0B0 +:10AB4000C3FE0BEB0A00BDE8F09F02460021022085 +:10AB500097E773B5D24D0A202870009848B10024B9 +:10AB60004FEA0D0005F09DFE002C01D100996960AF +:10AB70007CBD01240020F5E770B50C461546382150 +:10AB800020461AF088F8012666700A2104F11C009C +:10AB90001AF081F805B9FFDF297A207861F3010006 +:10ABA0002070A879002817D02A4621460020FFF7F8 +:10ABB00068FF6168402088706168C87061680871CA +:10ABC0006168487161688871616828880881616876 +:10ABD000688848816068868170BDC878002802D086 +:10ABE000002201204DE7704770B50546002165F34E +:10ABF0001F41002009F098FC0321284606F034F894 +:10AC0000040000D1FFDF21462846FFF769F900283C +:10AC100004D0207840F010002070012070BD2DE994 +:10AC2000FF4180460E460F0CFEF7F8FB050007D0EB +:10AC30006F800321384606F017F8040008D106E0BB +:10AC400004B03846BDE8F0411321F9F7F9BEFFDF43 +:10AC50005FEA080005D0B8F1070F18D0FFDFBDE8A4 +:10AC6000FF8120782A4620F0080020700020ADF8EF +:10AC7000020002208DF800004FF6FF70ADF80400CE +:10AC8000ADF8060069463846F9F7EDFAE7E7C6F38E +:10AC9000072101EB81021C23606803EBC202805C88 +:10ACA000042803D008280AD0FFDFD8E7012000904D +:10ACB0004FF440432A46204600F004FECFE704B09C +:10ACC0002A462046BDE8F041FFF7E9B82DE9F05FDC +:10ACD0000027B0F80A9090460C4605463E46B9F16A +:10ACE000400F01D2402001E0A9F140001FFA80FA94 +:10ACF000287AC01E08286BD2DFE800F00D04192066 +:10AD000058363C4772271026002C6CD0D5E9030139 +:10AD1000C4E902015CE070271226002C63D00A22ED +:10AD200005F10C0104F1080019F059FF50E07127FA +:10AD30000C26002C57D0E868A06049E07427102644 +:10AD40009CB3D5E90301C4E902016888032105F039 +:10AD50008BFF8346FEF762FB0246688850805146AF +:10AD60005846FFF753F833E075270A26ECB1A88957 +:10AD700020812DE076271426BCB105F10C0004F1EA +:10AD8000080307C883E8070022E07727102664B18C +:10AD9000D5E90301C4E902016888032105F064FFD5 +:10ADA00001466888FFF781FD12E01CE07327082642 +:10ADB000CCB16888032105F057FF01460078C00632 +:10ADC00006D56888FFF78CF810B96888F8F71BFE7D +:10ADD000A8F800602CB12780A4F8069066806888E7 +:10ADE000A0800020AFE6A8F80060FAE72DE9FC415A +:10ADF0000C461E4617468046032105F035FF0546E2 +:10AE00000A2C0AD2DFE804F0050505050505090945 +:10AE10000907042303E0062301E0FFDF0023CDE957 +:10AE20000076224629464046FFF717F92AE438B54E +:10AE30000546A0F57F40FF3830D0284606F046F89A +:10AE4000040000D1FFDF204605F0CBFB002815D021 +:10AE500001466A46204605F0E6FB00980321B0F85B +:10AE60000540284605F000FF0546052C03D0402C80 +:10AE700005D2402404E0007A80B1002038BD403C77 +:10AE8000A4B2214600F001FD40B1686804EB8401E2 +:10AE90003E2202EBC101405A0028EFD0012038BD0C +:10AEA000300000202DE9F04F044689B0408806F0BC +:10AEB0000DF8050000D1FFDF06AA2846616800F002 +:10AEC000BDFC069D001F81B235F8032F6B888A42B6 +:10AED00005D1042B0AD0052B1DD0062B15D02246F8 +:10AEE0002846FFF7D1FB09B0BDE8F08F16462D1DAF +:10AEF000224629463046F7F750FA0828F3D1224671 +:10AF000029463046FCF749FCEDE76088291D636857 +:10AF1000FAF7C8FCE7E717466088032105F0A4FEAE +:10AF20004FF000088DF804800646ADF80680042F27 +:10AF3000D9D36A79002AD6D028794FF6FF794FF015 +:10AF40001C0A13282CD008DC012878D0062847D00A +:10AF5000072875D0122874D106E0142872D015285D +:10AF600071D016286DD1ACE10C2F6AD1307800F089 +:10AF70000301022965D140F0080030706879B07093 +:10AF800001208DF804002889ADF808006889ADF823 +:10AF90000A00A889ADF80C00E889ADF80E0019E0A8 +:10AFA000B07890429FD1307801079CD5062F9AD176 +:10AFB00020F0080030706088414660F31F41002097 +:10AFC00009F0B2FA02208DF80400ADF80890288943 +:10AFD000ADF80A006088224601A9F9F744F982E732 +:10AFE000082F80D12F89B5F80A90402F01D2402038 +:10AFF00001E0A7F1400080B280460146304600F0F3 +:10B0000044FC08B3716808EB88002C2202EBC000F6 +:10B01000095A4945E3D1FE4807AAD0E90210CDE913 +:10B02000071068798DF81C0008F0FF058DF81E5098 +:10B0300060883146FFF799FC2246294639E0B6E0A0 +:10B0400014E03CE039E0E6E0F148D0E90010CDE959 +:10B0500007106879ADF820708DF81C00ADF82290CB +:10B06000608807AA3146FFF780FC3CE7082FB6D17D +:10B070006889B5F80880402801D2402000E04038B7 +:10B0800087B23946304600F000FC0028A7D007EB15 +:10B09000870271680AEBC2000844028A42459ED1C9 +:10B0A000017808299BD140786979884297D1F9B213 +:10B0B00022463046FEF7F3FE15E70E2F07D0CDF8F7 +:10B0C0001C80CDF8208068798DF81C00C8E769895C +:10B0D000EF898B46B5F80C903046FEF742FFABF196 +:10B0E0004001402901D309204AE0B9F1170F01D3EB +:10B0F000172F01D20B2043E040280ED000EB800236 +:10B1000071680AEBC20008440178012903D1407834 +:10B1100069798842A9D00A2032E03046FEF703FF61 +:10B12000014640282BD001EB810372680AEBC30073 +:10B1300002EB0008012288F800206A7988F80120D3 +:10B1400070682A894089B84200D938462D8A03237D +:10B150002372A282E7812082A4F80C9065820846BF +:10B1600000F078FB6081A8F81490A8F81870A8F88F +:10B170000E50A8F810B0204600F062FBB3E60420A1 +:10B1800005212172A4F80A80E08101212173A049E0 +:10B19000D1E90421CDE9072169798DF81C10ADF8BA +:10B1A0001E00608807AA3146FFF7DFFBE3E7062FA2 +:10B1B000E4D3B078904215D13078010712D520F051 +:10B1C000080030706088414660F31F41002009F09C +:10B1D000ABF902208DF804002889ADF80800ADF81D +:10B1E0000A90F7E604213046FEF7D3FE05464028D4 +:10B1F000C4D002208303009022462946304600F046 +:10B2000061FB4146608865F30F2160F31F41072011 +:10B2100009F08AF967E60E2FB0D104213046FEF717 +:10B22000B8FE81464028A9D04146608869F30F21C5 +:10B2300060F31F41072009F077F9288A0790E88911 +:10B2400000907068AF894089B84200D9384683467B +:10B25000B5F80A8028890590484600F0FBFA60811D +:10B26000079840B10220079B00902246494630468D +:10B2700000F028FB37E6B8F1170F1ED3172F1CD3A9 +:10B280000420207200986082E781A4F810B0A4F82E +:10B290000C8009EB890271680AEBC2000D18009955 +:10B2A0000598A5F81480A5F818B0E98128822046F1 +:10B2B00000F0C6FA0620287015E601200B23009046 +:10B2C000D3E7082FA6D129893046FEF74AFE074664 +:10B2D00040289FD007EB870271680AEBC200084440 +:10B2E000804600F0E8FA002894D16D89B8F80E0085 +:10B2F0002844B0F5803F05D360883A46314600F0D7 +:10B3000018FBF0E5002D85D0A8F80E0060883A46BD +:10B310003146FFF701F908202072384600F09AFA0A +:10B320006081A58127E770B50D460646032105F02B +:10B330009BFC040004D02078000704D5112070BDC8 +:10B3400043F2020070BD2A4621463046FEF71FFF39 +:10B3500018B9286860616868A061207840F008002A +:10B360002070002070BD70B50D460646032105F023 +:10B370007BFC040004D02078000704D4082070BDB2 +:10B3800043F2020070BD2A4621463046FEF732FFE6 +:10B3900000B9A582207820F008002070002070BD40 +:10B3A0002DE9F04F0E4691B08046032105F05CFC7C +:10B3B0000446404605F09CFD074600200790089093 +:10B3C0000990ADF830000A9002900390049004B9FF +:10B3D000FFDF0DF1080917BBFFDF20E038460BA99E +:10B3E000002204F0C1FF9DF82C0000F07F050A2D1B +:10B3F00000D3FFDF6019017F491E01779DF82C0003 +:10B4000000060CD52A460CA907A8FEF716FE01E097 +:10B410007C50020019F80510491C09F80510761E29 +:10B42000F6B2DBD204F13400FA4D04F1260BDFF85A +:10B43000E8A304F12A07069010E05846069900F0A8 +:10B440006AFA064628700A2800D3FFDF5AF8261049 +:10B4500040468847E08CC05DB04202D0208D002875 +:10B46000EBD10A202870EC4D4E4628350EE00CA991 +:10B4700007A800F050FA0446375D55F8240000B9DB +:10B48000FFDF55F82420394640469047BDF81E009E +:10B490000028ECD111B027E510B5032105F0E4FB3D +:10B4A000040000D1FFDF0A2104F11C0019F0F3FBB6 +:10B4B000207840F00400207010BD10B50C46032128 +:10B4C00005F0D2FB2044007F002800D0012010BDF1 +:10B4D0002DE9F84F894615468246032105F0C4FB45 +:10B4E000070004D0284609F06BF840B903E043F2A6 +:10B4F0000200BDE8F88F484609F088F808B110202E +:10B50000F7E7786828B169880089814201D9092064 +:10B51000EFE7B9F800001C2418B1402809D24020F8 +:10B5200008E03846FEF7FFFC8046402819D113207A +:10B53000DFE7403880B280460146384600F0A5F982 +:10B5400048B108EB8800796804EBC000085C01286A +:10B5500003D00820CDE70520CBE7FDF75FFF06000D +:10B560000BD008EB8800796804EBC0000C18B9F820 +:10B57000000020B1E88910B113E01120B9E7288854 +:10B58000172802D36888172801D20720B1E7686816 +:10B5900038B12B1D224641463846FFF721F90028D5 +:10B5A000A7D104F10C0269462046FFF720F828884D +:10B5B00060826888E082B9F8000030B10220207013 +:10B5C000E889A080E889A0B12BE003202070A88939 +:10B5D000A08078688178402905D180F802803946BA +:10B5E0005046FEF726FE404600F034F9A9F8000068 +:10B5F00021E07868218B4089884200D90846208361 +:10B60000A6F802A004203072B9F800007081E08929 +:10B610007082F181208B3082A08AB081304600F0A8 +:10B620000FF97868C178402905D180F80380394640 +:10B630005046FEF74FFE00205BE770B50D4606460C +:10B64000032105F011FB040003D0402D04D2402556 +:10B6500003E043F2020070BD403DADB2294600F068 +:10B6600014F958B105EB85011C22606802EBC10199 +:10B67000084400F020F918B1082070BD052070BD05 +:10B680002A462146304600F054F9002070BD2DE9CD +:10B69000F0410D4616468046032105F0E5FA0446C2 +:10B6A000402D01D2402500E0403DADB28CB129468D +:10B6B00000F0EBF880B105EB85011C22606802EB1D +:10B6C000C1014718384600F0F6F838B10820BDE847 +:10B6D000F08143F20200FAE70520F8E733463A46E4 +:10B6E00029462046FFF77CF80028F0D1EAB221462F +:10B6F0004046FEF79BFF0020E9E72DE9F0410D46AB +:10B7000016468046032105F0AFFA0446402D01D2CB +:10B71000402500E0403DAFB224B1304608F050FF74 +:10B7200038B902E043F20200D1E7306808F048FF80 +:10B7300008B11020CBE73946204600F0A6F860B1EA +:10B7400007EB87011C22606802EBC10145182846FF +:10B7500000F0B1F818B10820B9E70520B7E7B088C4 +:10B76000A98A884201D90C20B1E76168E88C497840 +:10B77000B0EBC10F01D31320A9E73946204600F0F2 +:10B7800078F80146606808234078C20005F124007B +:10B7900005F0F1F8D6E90012C0E90012FAB221462C +:10B7A0004046FEF7B9FE002091E72DE9F0470D462F +:10B7B0001F4690468146032105F056FA0446402D67 +:10B7C00001D2402001E0A5F1400086B23CB14DB16C +:10B7D000384608F039FF50B11020BDE8F08743F239 +:10B7E0000200FAE76068C8B1A0F80C8024E0314696 +:10B7F000204600F04AF888B106EB86011C226068FA +:10B8000002EBC1014518284600F055F840B1082068 +:10B81000E3E7000030000020945002000520DCE740 +:10B82000A5F80880F2B221464846FEF7FFFE1FB198 +:10B83000A8896989084438800020CEE704F0F3BE67 +:10B84000017821F00F01491C21F0F0011031017045 +:10B85000FDF7E7BD10B50446402800D9FFDF4034AE +:10B86000A0B210BD406842690078484302EBC000B6 +:10B870007047C2784068037812FB03F2437840694E +:10B8800001FB032100EBC1007047C2788A4209D94D +:10B89000406801EB81011C2202EBC101405C08B150 +:10B8A00001207047002070470078062801D9012048 +:10B8B0007047002070470078062801D001207047AB +:10B8C00000207047F0B401EB81061C27446807EBA9 +:10B8D000C6063444049D05262670E3802571F0BC1D +:10B8E000FEF794BA10B5418911B1FFF7DDFF08B139 +:10B8F000002010BD012010BD10B5C18C8278B1EBC5 +:10B90000C20F04D9C18911B1FFF7CEFF08B10020E1 +:10B9100010BD012010BD10B50C4601230A22011DE7 +:10B9200005F05FF800782188012282409143218050 +:10B9300010BDF0B402EB82051C264C6806EBC50571 +:10B94000072363554B681C79402C03D11A71F0BC56 +:10B95000FEF705BDF0BC704710B5EFF3108000F0A6 +:10B96000010472B6F7484178491C417040780128BB +:10B9700001D1F7F709FB002C00D162B610BD70B5FC +:10B98000F04CE07848B90125E570FFF7E5FFF7F7DF +:10B9900003FB20B1002008F058FA002070BD4FF0E2 +:10B9A00080406571C0F80453F7E770B5EFF310807D +:10B9B00000F0010572B6E34C607800B9FFDF6078F3 +:10B9C000401E6070607808B9F7F7E2FA002D00D1E8 +:10B9D00062B670BDDB4810B5C17821B1002141715C +:10B9E000C170FFF7E2FF002010BD10B50446F7F765 +:10B9F000D3FAD449C978084000D001202060002043 +:10BA000010BD2DE9F05FDFF83C934278817889F82A +:10BA10000620002589F80710064689F808500078A6 +:10BA20002F4620B101280FD002280FD0FFDFF7F7F3 +:10BA3000C0FA98B1F7F7C4FAA8420FD12846F7F731 +:10BA4000C3FA0028FAD047E00125F0E7FFF784FFAA +:10BA5000F7F7A2FA0028FBD00225E8E701208407C7 +:10BA6000E060C4F80471B8490D600107D1F84412D0 +:10BA7000B54AC1F3423124321160B3493431086010 +:10BA80004FF0020BC4F804B3A060DFF8C0A2DAF8EC +:10BA90000010C94341F3001101F10108DAF8001068 +:10BAA00041F01001CAF8001000E020BFD4F80401F2 +:10BAB0000028FAD02846F7F787FA0028FAD0B8F11C +:10BAC000000F05D1DAF8001021F01001CAF80010BB +:10BAD000C4F808B3C4F8047199F807004C4670B173 +:10BAE000307860B9F7F758FA064608F00BFB6FF0AC +:10BAF000004116B1C4E9031001E0C4E9030115B126 +:10BB00002771BDE8F09F01202071BDE8F05F00F0D3 +:10BB1000D9B870B5050000D1FFDF4FF080424FF07B +:10BB2000FF30C2F808030021C2F80011C2F8041166 +:10BB3000C2F80C11C2F81011824C6170F7F732FA9A +:10BB400010B10120E07060702846BDE8704058E7F1 +:10BB50002DE9FE4F7E4800687D4A7E49083211601B +:10BB60008C070290D4F8080108B1012600E00026F5 +:10BB7000D4F8240100B101208146D4F81C0100B1A1 +:10BB800001208346D4F8200100B101200190D4F8AF +:10BB9000000110B14FF0010801E04FF00008D4F8A7 +:10BBA000040108B1012700E00027D4F80C0100B11E +:10BBB00001200090D4F8100108B1012100E000211B +:10BBC0008A4646EA080127EA01000099884320EAEC +:10BBD0000A0020EA090030EA0B0000D0FFDF002550 +:10BBE00026B1C4F80851012008F02FF9B9F1000F6F +:10BBF00004D0C4F82451092008F027F9BBF1000F44 +:10BC000004D0C4F81C510A2008F01FF9019820B193 +:10BC1000C4F820510B2008F018F9DFF83C91494E88 +:10BC20004FF0010BB8F1000F11D0C4F8005170793A +:10BC300018B17571002008F008F9307838B1357006 +:10BC400086F802B00222C9F80020C4F810B00FB183 +:10BC5000C4F80451009858B1C4F80C51B07800B938 +:10BC6000FFDFC9F80050B570C4F814B0FFF79DFEAF +:10BC7000BAF1000F05D0C4F81051307908B100F0C6 +:10BC800045F833490298091D0860BDE8FE8F70B57C +:10BC90002C4DE87808B9F7F77BF901208407A061FB +:10BCA000A87850B1D4F80C0120B90020F7F78CF92E +:10BCB0000028F7D10020C4F80C014FF0FF30C4F881 +:10BCC000080370BD2DE9F0411926B407C4F80863D4 +:10BCD0000125A5610020C4F80001C4F80C01C4F8D6 +:10BCE0001001F7F759F9174F28B11B49BD70022011 +:10BCF0000860256100E03D70FFF72EFE1249B8791B +:10BD000020310860C4F80463BDE8F0812DE9F041FA +:10BD10000C4C4FF080470125E07940B3012803D057 +:10BD2000217A401E814224DAF7F736F9064608F0F8 +:10BD3000E9F9E179012902D9217A491C21726EB110 +:10BD400021690CE03C0000201805004010ED00E0E7 +:10BD50001005024001000001340C0040E168411A66 +:10BD6000022902DA11F1020F0EDC0EB1206100E0AF +:10BD7000E060FFF7F1FDF7F70FF938B10549022050 +:10BD800008603D61A57002E07D61BDE7257000207F +:10BD90002072B9E7340C00404FF0E0214FF0007002 +:10BDA000C1F88001C1F88002384B802283F800245A +:10BDB000C1F80001704700B502460420344903E091 +:10BDC00001EBC0031B792BB1401EC0B2F8D2FFDFDC +:10BDD000FF2000BD41F8302001EBC00100224A7174 +:10BDE0008A7101220A7100BD294A002102EBC000BC +:10BDF0000171704710B50446042800D3FFDF2448C2 +:10BE000000EBC4042079012800D0FFDF6079A1791C +:10BE1000401CC0B2814200D060714FF0E0214FF071 +:10BE20000070C1F8000210BD2DE9F0411948056805 +:10BE300018491948083108601448042690F800048D +:10BE4000134F4009154C042818D0FFDF16E0217865 +:10BE500007EBC1000279012A08D1427983799A421D +:10BE600004D04279827157F8310080472078401C15 +:10BE7000C0B22070042801D300202070761EF6B2D4 +:10BE8000E5D20448001D0560BDE8F08119E000E03E +:10BE9000C8050020100502400100000150000020EC +:10BEA000F8B51D46DDE906470E000AD005F020F87A +:10BEB0002346FF1DBCB231462A46009404F02DFCF7 +:10BEC000F8BDD0192246194618F044FE2046F8BDA8 +:10BED00070B50D460446102118F0BBFE25811720D1 +:10BEE0006081A07B40F00A00A07370BD4FF6FF7226 +:10BEF0000A800146022008F017BB7047008970478E +:10BF0000827BD30701D1920703D480890880002067 +:10BF1000704705207047827B920700D5818170476A +:10BF200001460020098841F6FE52114200D001204E +:10BF3000704700B50346807BC00701D0052000BDD7 +:10BF400059811846FFF7ECFFC00703D0987B40F0FB +:10BF500004009873987B40F001009873002000BDA6 +:10BF6000827B520700D509B140897047172070477E +:10BF7000827B61F3C302827370472DE9FC5F0E463A +:10BF8000044601789646012000FA01F14DF6FF5271 +:10BF900001EA020962684FF6FF7B1188594502D118 +:10BFA0000920BDE8FC9FB9F1000F05D041F6FE5510 +:10BFB000294201D00120F4E741EA090111801D0066 +:10BFC00014D04FF0000C85F800C02378052103221F +:10BFD00067464FF0020A0E2B74D2DFE803F0F8092F +:10BFE000252F47626974479092B3D0D70420D8E7D1 +:10BFF000616820898B7B9B077DD5172848D30B89E7 +:10C00000834245D38989172901D3814240D185F8DC +:10C0100000A0A5F801003280616888816068817B9A +:10C0200021F002018173C5E0042028702089A5F861 +:10C0300001006089A5F803003180BBE0208A3188C7 +:10C04000C01D1FFA80F8414522D3062028702089A0 +:10C05000A5F801006089A5F80300A089A5F80500EE +:10C060000721208ACDE9000163693EE0082B10D04A +:10C07000082028702089A5F801006089A5F8030030 +:10C0800031806A1D694604F10C0006F08EFB10B188 +:10C090005FE01020EDE730889DF800100844308004 +:10C0A00088E00A2028702089A5F80100328045E048 +:10C0B0000C2028702089A5F801006089A5F80300EC +:10C0C00031803BE083E02189338800EB41021FFA95 +:10C0D00082F843453DD3B8F1050F3AD30E222A70BA +:10C0E0000BEA4101CDE90010E36860882A467146F9 +:10C0F000FFF7D6FE00E04DE0A6F800805AE04020B1 +:10C10000287060893188C01C1FFA80F8414520D30F +:10C110002878714620F03F00123028702089A5F859 +:10C1200001006089CDE9000260882A46E368FFF7D4 +:10C13000B7FEA6F80080287840063BD461682089C5 +:10C14000888037E0A0893288401D1FFA80F8424578 +:10C1500001D204273EE0162028702089A5F80100AE +:10C160006089A5F80300A089CDE9000160882A460E +:10C1700071462369FFF794FEA6F80080DEE71820D9 +:10C180002870207A6870A6F800A013E061680A8819 +:10C19000920401D405271DE0C9882289914201D06B +:10C1A000062717E01E21297030806068018821F47D +:10C1B00000510180B9F1000F0CD061887823002272 +:10C1C000022008F007F961682078887007E0A6F877 +:10C1D00000C003276068018821EA09010180384610 +:10C1E000DFE62DE9FF4F85B01746129C0D001E4675 +:10C1F0001CD03078C10703D000F03F00192801D9C6 +:10C20000012100E000212046FFF7AAFEA8420DD33D +:10C210002088A0F57F41FF3908D03078410601D44D +:10C22000000605D5082009B0BDE8F08F0720FAE721 +:10C2300000208DF800008DF8010030786B1E00F0B2 +:10C240003F0C0121A81E4FF0050A4FF002094FF0E4 +:10C25000030B9AB2BCF1200F75D2DFE80CF08B1003 +:10C26000745E7468748C749C74B674BB74C974D531 +:10C2700074E2747474F274F074EF74EE748B052DC0 +:10C2800078D18DF80090A0788DF804007088ADF812 +:10C29000060030798DF80100707800F03F000C281E +:10C2A00029D00ADCA0F10200092863D2DFE800F0FF +:10C2B000126215621A621D622000122824D004DC6A +:10C2C0000E281BD01028DBD11BE016281FD0182801 +:10C2D000D6D11FE02078800701E0207840070028B1 +:10C2E00048DAEFE020780007F9E72078C006F6E7A3 +:10C2F00020788006F3E720784006F0E720780006F3 +:10C30000EDE72088C005EAE720884005E7E72088B8 +:10C310000005E4E72088C004E1E72078800729D5FC +:10C32000032D27D18DF800B0B6F8010082E0217806 +:10C3300049071FD5062D1DD381B27078012803D07F +:10C34000022817D102E0CAE0022000E010200422F7 +:10C350008DF8002072788DF80420801CB1FBF0F27B +:10C36000ADF8062092B242438A4203D10397ADF85A +:10C370000890A7E07AE02078000777D598B2820885 +:10C380008DF800A0ADF80420B0EB820F6ED10297BB +:10C39000ADF8061096E02178C90667D5022D65D361 +:10C3A00081B206208DF80000707802285ED300BFAD +:10C3B000B1FBF0F28DF80400ADF8062092B24243D2 +:10C3C0008A4253D1ADF808907BE0207880064DD5A5 +:10C3D000072003E0207840067FD508208DF8000074 +:10C3E000A088ADF80400ADF80620ADF8081068E0AC +:10C3F0002078000671D50920ADF804208DF80000E2 +:10C40000ADF8061002975DE02188C90565D5022DBB +:10C4100063D381B20A208DF80000707804285CD3C1 +:10C42000C6E72088400558D5012D56D10B208DF840 +:10C430000000A088ADF8040044E021E026E016E00A +:10C44000FFE72088000548D5052D46D30C208DF840 +:10C450000000A088ADF80400B6F803006D1FADF829 +:10C460000850ADF80600ADF80AA02AE035E02088B3 +:10C47000C00432D5012D30D10D208DF8000021E00F +:10C480002088800429D4B6F80100E080A07B000752 +:10C4900023D5032D21D3307800F03F001B2818D07E +:10C4A0000F208DF80000208840F40050A4F8000010 +:10C4B000B6F80100ADF80400ED1EADF80650ADF879 +:10C4C00008B0039769460598F5F7B2FC050008D057 +:10C4D00016E00E208DF80000EAE7072510E0082599 +:10C4E0000EE0307800F03F001B2809D01D2807D04F +:10C4F0000220059908F018F8208800F400502080E8 +:10C50000A07B400708D52046FFF70AFDC00703D1EE +:10C51000A07B20F00400A073284684E61FB5022803 +:10C5200006D101208DF8000088B26946F5F780FC3D +:10C530001FBD0000F8B51D46DDE906470E000AD014 +:10C5400004F0D6FC2346FF1DBCB231462A460094B7 +:10C5500004F0E3F8F8BDD0192246194618F0FAFAAB +:10C560002046F8BD2DE9FF4F8DB09B46DDE91B57F6 +:10C57000DDF87CA00C46082B05D0E06901F002F93B +:10C5800050B11020D2E02888092140F01000288006 +:10C590008AF80010022617E0E16901208871E2693B +:10C5A0004FF420519180E1698872E06942F60101FF +:10C5B0000181E069002181732888112140F0200069 +:10C5C00028808AF80010042638780A900A203870EB +:10C5D0004FF0020904F118004D460C9001F095FB54 +:10C5E000B04681E0BBF1100F0ED1022D0CD0A9EBAB +:10C5F0000800801C80B20221CDE9001005AB524634 +:10C600001E990D98FFF796FFBDF816101A988142F3 +:10C6100003D9F74800790F9004E003D10A9808B1D4 +:10C6200038702FE04FF00201CDE900190DF116032B +:10C6300052461E990D98FFF77DFF1D980088401BFC +:10C64000801B83B2C6F1FF00984200D203461E99B8 +:10C650000BA8D9B15FF00002DDF878C0CDE9032066 +:10C6600009EB060189B2CDE901C10F980090BDF830 +:10C67000161000220D9801F0CBFB387070B1C0B2DB +:10C68000832807D0BDF8160020833AE00AEB0901A1 +:10C690008A19E1E7022011B0BDE8F08FBDF82C0047 +:10C6A000811901F0FF08022D0DD09AF801204245B2 +:10C6B00006D1BDF82010814207D0B8F1FF0F04D099 +:10C6C0009AF801801FE08AF80180C9480068017863 +:10C6D000052902D1BDF81610818009EB08001FFA68 +:10C6E00080F905EB080085B2DDE90C1005AB0F9A67 +:10C6F00001F00EFB28B91D980088411B4145BFF68B +:10C7000071AF022D13D0BBF1100F0CD1A9EB0800B3 +:10C71000801C81B20220CDE9000105AB52461E9972 +:10C720000D98FFF707FF1D98058000203870002046 +:10C73000B1E72DE9F8439C46089E13460027B26BEB +:10C740009AB3491F8CB2F18FA1F57F45FF3D05D00B +:10C750005518AD882944891D8DB200E0002529199E +:10C76000B6F83C800831414520D82A44BCF8011075 +:10C7700022F8021BBCF8031022F8021B984622F88C +:10C78000024B914604F0A2FB4FF00C0C41464A4686 +:10C790002346CDF800C003F08CFFF587B16B002075 +:10C7A0002944A41D2144088003E001E0092700E09A +:10C7B00083273846BDE8F88310B50B88848F9C42E8 +:10C7C0000CD9846BE018048844B1848824F40044B4 +:10C7D000A41D23440B801060002010BD0A2010BD52 +:10C7E0002DE9F0478AB00025904689468246ADF88B +:10C7F000185007274BE0059806888088000446D427 +:10C80000A8F8006007A8019500970295CDE90350AC +:10C810004FF4007300223146504601F0F9FA04004B +:10C820003CD1BDF81800ADF8200005980488818837 +:10C83000B44216D10A0414D401950295039521F44B +:10C8400000410097049541F48043428821465046B8 +:10C8500001F0B4F804000BD10598818841F400413F +:10C86000818005AA08A94846FFF7A6FF0400DCD08E +:10C870000097059802950195039504950188BDF8E8 +:10C880001C300022504601F099F80A2C06D105AA66 +:10C8900006A94846FFF790FF0400ACD0ADF8185049 +:10C8A00004E00598818821F40041818005AA06A949 +:10C8B0004846FFF781FF0028F3D00A2C03D020461A +:10C8C0000AB0BDE8F0870020FAE710B50C46896B86 +:10C8D00086B051B10C218DF80010A18FADF8081071 +:10C8E000A16B01916946FAF734FC00204FF6FF7105 +:10C8F000A063E187A08706B010BD2DE9F0410D4689 +:10C900000746896B0020069E1446002911D0012B92 +:10C910000FD1324629463846FFF762FF002808D17A +:10C92000002C06D0324629463846BDE8F04100F0DA +:10C9300038BFBDE8F0812DE9FC411446DDE9087CF3 +:10C940000E46DDE90A15521DBCF800E092B296458C +:10C9500002D20720BDE8FC81ACF8002017222A7023 +:10C96000A5F80160A5F803300522CDE900423B4659 +:10C970002A46FFF7DFFD0020ECE770B50C461546B0 +:10C980004821204618F087F904F1080044F81C0FEC +:10C9900000204FF6FF71E06161842084A584172098 +:10C9A000E08494F82A0040F00A0084F82A0070BD60 +:10C9B0004FF6FF720A800146032007F0B5BD30B57F +:10C9C00085B00C460546FFF780FFA18E284629B1A9 +:10C9D00001218DF800106946FAF7BBFB0020E062E8 +:10C9E0002063606305B030BDB0F8400070470000C0 +:10C9F0005400002090F84620920703D44088088015 +:10CA00000020F3E70620F1E790F846209207EDD5E5 +:10CA1000A0F84410EAE70146002009880A0700D57B +:10CA2000012011F0F00F01D040F00200CA0501D53D +:10CA300040F004008A0501D540F008004A0501D500 +:10CA400040F010000905D1D540F02000CEE700B538 +:10CA5000034690F84600C00701D0062000BDA3F8A9 +:10CA600042101846FFF7D7FF10F03E0F05D093F89D +:10CA7000460040F0040083F8460013F8460F40F0EB +:10CA800001001870002000BD90F84620520700D524 +:10CA900011B1B0F84200A9E71720A7E710F8462F18 +:10CAA00061F3C3020270A1E72DE9FF4F9BB00E00B6 +:10CAB000DDE92B34DDE92978289D24D02878C107C9 +:10CAC00003D000F03F00192801D9012100E0002126 +:10CAD0002046FFF7D9FFB04215D32878410600F071 +:10CAE0003F010CD41E290CD0218811F47F6F0AD18C +:10CAF0003A8842B1A1F57F42FF3A04D001E0122901 +:10CB000001D1000602D504201FB0C5E5F9491D98E2 +:10CB10004FF0000A08718DF818A08DF83CA00FAAFC +:10CB20000A60ADF81CA0ADF850A02978994601F034 +:10CB30003F02701F5B1C04F1180C4FF0060E4FF003 +:10CB4000040BCDF858C01F2A7ED2DFE802F07D7DAD +:10CB5000107D267DAC7DF47DF37DF27DF17DF47D4D +:10CB6000F07D7D7DEF7DEE7D7D7D7D7DED0094F81A +:10CB70004610B5F80100890701D5032E02D08DF8C3 +:10CB800018B022E34FF40061ADF85010608003212B +:10CB90008DF83C10ADF84000D8E2052EEFD1B5F885 +:10CBA00001002083ADF81C00B5F80310618308B1C3 +:10CBB000884201D901207FE10020A07220814FF638 +:10CBC000FF702084169801F0A0F8052089F8000075 +:10CBD0000220029083460AAB1D9A16991B9801F019 +:10CBE00097F890BB9DF82E00012804D0022089F808 +:10CBF0000100102003E0012089F8010002200590C7 +:10CC0000002203A90BA805F0D0FDE8BB9DF80C009D +:10CC1000059981423DD13A88801CA2EB0B018142EB +:10CC200037DB02990220CDE900010DF12A034A46C3 +:10CC300041461B98FFF77EFC02980BF1020B801C0B +:10CC400080B217AA03A901E0A0E228E002900BA895 +:10CC500005F0ABFD02999DF80C00CDE9000117AB82 +:10CC60004A4641461B98FFF765FC9DF80C100AAB3D +:10CC70000BEB01001FFA80FB02981D9A084480B25A +:10CC8000029016991B9800E003E001F041F800289B +:10CC9000B6D0BBF1020F02D0A7F800B053E20A20D1 +:10CCA0008DF818004FE200210391072EFFF467AFC3 +:10CCB000B5F801002083ADF81C00B5F803206283AD +:10CCC00000283FF477AF90423FF674AF0120A07286 +:10CCD000B5F8050020810020A073E06900F052FD46 +:10CCE00078B9E16901208871E2694FF4205191809F +:10CCF000E1698872E06942F601010181E069002181 +:10CD00008173F01F20841E9860620720608416984B +:10CD100000F0FBFF072089F800000120049002903A +:10CD20000020ADF82A0028E01DE2A3E13AE1EAE0A4 +:10CD300016E2AEE086E049E00298012814D0E069EE +:10CD40008079012803D1BDF82800ADF80E000498C1 +:10CD500003ABCDE900B04A4641461B98FFF7EAFB1A +:10CD60000498001D80B20490BDF82A00ADF80C00B4 +:10CD7000ADF80E00059880B202900AAB1D9A169984 +:10CD80001B9800F0C5FF28B902983988001D05904E +:10CD90008142D1D20298012881D0E06980790128AE +:10CDA00005D0BDF82810A1F57F40FF3803D1BDF8AC +:10CDB0002800ADF80E00049803ABCDE900B04A4658 +:10CDC00041461B98FFF7B6FB0298BBE1072E02D045 +:10CDD000152E7FF4D4AEB5F801102183ADF81C10E8 +:10CDE000B5F80320628300293FF4E4AE91423FF698 +:10CDF000E1AE0121A1724FF0000BA4F808B084F855 +:10CE00000EB0052E07D0C0B2691DE26905F0AEFC78 +:10CE100000287FF444AF4FF6FF70208401A906AAD2 +:10CE200014A8CDF800B081E885032878214600F0E9 +:10CE30003F031D9A1B98FFF795FB8246208BADF8A8 +:10CE40001C0080E10120032EC3D14021ADF8501019 +:10CE5000B5F801102183ADF81C100AAAB8F1000F33 +:10CE600000D00023CDE9020304921D98CDF8048080 +:10CE7000009038880022401E83B21B9800F0C8FF43 +:10CE80008DF8180090BB0B2089F80000BDF8280031 +:10CE900037E04FF0010C052E9BD18020ADF85000FB +:10CEA000B5F801102183B5F803002084ADF81C10FB +:10CEB000B0F5007F03D907208DF8180085E140F414 +:10CEC0007C4222840CA8B8F1000F00D00023CDE9E9 +:10CED0000330CDE9018C1D9800903888401E83B244 +:10CEE0001B9800F095FF8DF8180028B18328A8D171 +:10CEF0000220BDE0540000200D2189F80010BDF88B +:10CF00003000401C1EE1032E04D248067FF537AEE8 +:10CF1000002017E1B5F80110ADF81C102878400684 +:10CF200002D58DF83CE002E007208DF83C004FF080 +:10CF300000080320CDE902081E9BCDF810801D9843 +:10CF40000193A6F1030B00901FFA8BF342461B9846 +:10CF500000F034FD8DF818008DF83C8029784906E2 +:10CF60000DD52088C00506D5208BBDF81C10884241 +:10CF700001D1C4F8248040468DF81880E2E083286F +:10CF800001D14FF0020A4FF48070ADF85000BDF8A7 +:10CF90001C002083A4F820B01E98606203206084E7 +:10CFA0001321CCE0052EFFF4EAADB5F80110ADF881 +:10CFB0001C10A28F62B3A2F57F43FE3B28D008224B +:10CFC0008DF83C204FF0000B0523CDE9023BDDF846 +:10CFD00078C0CDF810B01D9A80B2CDF804C040F4EE +:10CFE00000430092B5F803201B9800F0E7FC8DF891 +:10CFF0003CB04FF400718DF81800ADF85010832844 +:10D0000010D0F8B1A18FA1F57F40FE3807D0DCE049 +:10D010000B228DF83C204FF6FE72A287D2E7A4F8CF +:10D020003CB0D2E000942B4631461E9A1B98FFF785 +:10D0300080FB8DF8180008B183284BD1BDF81C0087 +:10D04000208355E700942B4631461E9A1B98FFF724 +:10D0500070FB8DF81800E8BBE18FA06B0844811DC0 +:10D060008DE882034388828801881B98FFF763FC60 +:10D07000824668E095F80180022E70D15FEA0800D0 +:10D0800002D0B8F1010F6AD109208DF83C0007A841 +:10D0900000908DF840804346002221461B98FFF700 +:10D0A0002CFC8DF842004FF0000B8DF843B050B9C6 +:10D0B000B8F1010F12D0B8F1000F04D1A18FA1F582 +:10D0C0007F40FF380AD0A08F40B18DF83CB04FF4BC +:10D0D000806000E037E0ADF850000DE00FA91B982C +:10D0E000FAF737F882468DF83CB04FF48060ADF81F +:10D0F0005000BAF1020F06D0FC480068C07928B190 +:10D100008DF8180027E0A4F8188044E0BAF1000F69 +:10D1100003D081208DF818003DE007A80090434619 +:10D12000012221461B98FFF7E8FB8DF818002146E5 +:10D130001B98FFF7CAFB9DF8180020B9192189F840 +:10D140000010012038809DF83C0020B10FA91B98E9 +:10D15000F9F7FFFF8246BAF1000F33D01BE018E069 +:10D160008DF818E031E02078000712D5012E10D19B +:10D170000A208DF83C00E088ADF8400003201B99A0 +:10D1800007F0D2F90820ADF85000C1E648067FF557 +:10D19000F6AC4FF0040A2088BDF8501008432080F8 +:10D1A000BDF8500080050BD5A18FA1F57F40FE385A +:10D1B00006D11E98E06228982063A6864FF0030AE5 +:10D1C0005046A1E49DF8180078B1012089F80000CC +:10D1D000297889F80110BDF81C10A9F802109DF8F3 +:10D1E000181089F80410052038802088BDF85010E8 +:10D1F00088432080E4E72DE9FF4F8846087895B002 +:10D20000012181404FF20900249C0140ADF820101B +:10D210002088DDF88890A0F57F424FF0000AFF3AA1 +:10D2200006D039B1000705D5012019B0BDE8F08F4F +:10D230000820FAE7239E4FF0000B0EA886F800B0F6 +:10D2400018995D460988ADF83410A8498DF81CB0CE +:10D25000179A0A718DF838B0086098F80000012814 +:10D260003BD0022809D003286FD1307820F03F004E +:10D270001D303070B8F80400E08098F800100320EA +:10D28000022904D1317821F03F011B31317094F82B +:10D290004610090759D505ABB9F1000F13D000218D +:10D2A00002AA82E80B000720CDE90009BDF834008E +:10D2B000B8F80410C01E83B20022159800F0A8FD33 +:10D2C0000028D1D101E0F11CEAE7B8F80400A6F883 +:10D2D0000100BDF81400C01C04E198F805108DF899 +:10D2E0001C1098F80400012806D04FF4007A022898 +:10D2F0002CD00328B8D16CE12188B8F8080011F4CB +:10D300000061ADF8201020D017281CD3B4F84010CD +:10D31000814218D3B4F84410172901D3814212D1A5 +:10D32000317821F03F01C91C3170A6F801000321BA +:10D33000ADF83410A4F8440094F8460020F0020040 +:10D3400084F8460065E105257EE177E1208808F153 +:10D35000080700F4FE60ADF8200010F0F00F1BD0BD +:10D3600010F0C00F03D03888228B9042EBD199B9CE +:10D37000B878C00710D0B9680720CDE902B1CDF860 +:10D3800004B00090CDF810B0FB88BA8839881598A1 +:10D3900000F014FB0028D6D12398BDF82010401CC3 +:10D3A00080294ED006DC10290DD020290BD0402931 +:10D3B00087D124E0B1F5807F6ED051457ED0B1F5A4 +:10D3C000806F97D1DEE0C80601D5082000E010206C +:10D3D00082460DA907AA0520CDE902218DF8380063 +:10D3E000ADF83CB0CDE9049608A93888CDE9000134 +:10D3F0005346072221461598FFF7B4F8A8E09DF898 +:10D400001C2001214FF00A0A002A9BD105ABB9F17B +:10D41000000F00D00020CDE902100720CDE900095F +:10D42000BDF834000493401E83B2218B002215986E +:10D4300000F0EEFC8DF81C000B203070BDF81400DD +:10D4400020E09DF81C2001214FF00C0A002A22D177 +:10D4500013ABB9F1000F00D00020CDE90210072076 +:10D46000CDE900090493BDF83400228C401E83B23C +:10D47000218B159800F0CCFC8DF81C000D2030702D +:10D48000BDF84C00401CADF8340005208DF8380084 +:10D49000208BADF83C00BCE03888218B88427FF4BB +:10D4A00052AF9DF81C004FF0120A00281CD1606A90 +:10D4B000A8B1B878C0073FF446AF00E018E0BA68FA +:10D4C0000720CDE902B2CDF804B00090CDF810B03D +:10D4D000FB88BA88159800F071FA8DF81C001320AB +:10D4E00030700120ADF8340093E0000054000020BB +:10D4F0003988208B8142D2D19DF81C004FF0160A4A +:10D500000028A06B08D0E0B34FF6FF7000215F4603 +:10D51000ADF808B0019027E068B1B978C907BED16D +:10D52000E18F0DAB0844821D03968DE80C02438801 +:10D530008288018809E0B878C007BCD0BA680DAB12 +:10D5400003968DE80C02BB88FA881598FFF7F3F96B +:10D5500005005ED0072D72D076E0019005AA02A9E1 +:10D560002046FFF729F90146E28FBDF80800824204 +:10D5700001D00029F1D0E08FA16B08440780019809 +:10D58000E08746E09DF81C004FF0180A40B1208B60 +:10D59000C8B13888208321461598FFF796F938E0FE +:10D5A00004F118000090237E012221461598FFF710 +:10D5B000A4F98DF81C000028EDD11920307001204D +:10D5C000ADF83400E7E7052521461598FFF77DF90A +:10D5D0003AE0208800F40070ADF8200050452DD1CD +:10D5E000A08FA0F57F41FE3901D006252CE0D8F8A8 +:10D5F00008004FF0160A48B1A063B8F80C10A187D4 +:10D600004FF6FF71E187A0F800B002E04FF6FF701F +:10D61000A087BDF8200030F47F611AD07823002263 +:10D620000320159906F0D6FE98F800002071208896 +:10D63000BDF82010084320800EE000E00725208878 +:10D64000BDF8201088432080208810F47F6F1CD004 +:10D650003AE02188814321809DF8380020B10EA94D +:10D660001598F9F776FD05469DF81C000028EBD0CB +:10D6700086F801A001203070208B70809DF81C007E +:10D6800030710520ADF83400DEE7A18EE1B11898C5 +:10D690000DAB0088ADF834002398CDE90304CDE943 +:10D6A0000139206B0090E36A179A1598FFF7FCF98F +:10D6B000054601208DF838000EA91598F9F749FDA7 +:10D6C00000B10546A4F834B094F8460040070AD5E6 +:10D6D0002046FFF7A0F910F03E0F04D114F8460FD2 +:10D6E00020F0040020701898BDF8341001802846FE +:10D6F0009BE500B585B0032806D102208DF8000017 +:10D7000088B26946F9F725FD05B000BD10B5384C63 +:10D710000B782268012B02D0022B2AD111E013785A +:10D720000BB1052B01D10423137023688A889A80DA +:10D730002268CB88D38022680B8913814989518163 +:10D740000DE08B8893802268CB88D38022680B8978 +:10D7500013814B8953818B899381096911612168F8 +:10D76000F9F7F7FC226800210228117003D0002885 +:10D7700000D0812010BD832010BD806B002800D018 +:10D78000012070478178012909D10088B0F5205F18 +:10D7900003D042F60101884201D1002070470720E2 +:10D7A0007047F0B587B0002415460E460746ADF821 +:10D7B000144010E0069801882980811DCDE90241BE +:10D7C0000721019404940091838842880188384697 +:10D7D00000F0F4F830B906AA05A93046FEF7ECFFD0 +:10D7E0000028E7D00A2800D1002007B0F0BD0000D3 +:10D7F0005400002010B58B7883B102789A4205D18D +:10D800000B885BB102E08B79091D4BB18B789A4292 +:10D81000F9D1B0F801300C88A342F4D1002010BD3A +:10D82000812010BD072826D012B1012A27D103E09C +:10D83000497801F0070102E04978C1F3C2010529E6 +:10D840001DD2DFE801F00318080C12000AB1032012 +:10D8500070470220704704280DD250B10DE0052812 +:10D8600009D2801E022808D303E0062803D003282B +:10D8700003D005207047002070470F20704781209B +:10D880007047C0B282060BD4000607D5FE48807AE6 +:10D890004143C01D01EBD00080B27047084670477D +:10D8A0000020704770B513880B800B781C0625D5B7 +:10D8B000F54CA47A844204D843F01000087000208C +:10D8C00070BD956800F0070605EBD0052D78F54092 +:10D8D00065F304130B701378D17803F0030341EA66 +:10D8E000032140F20123B1FBF3F503FB151192680C +:10D8F000E41D00FB012000EBD40070BD906870BDFA +:10D9000037B51446BDF8041011809DF804100A06BE +:10D910001ED5C1F30013DC49A568897A814208D875 +:10D92000FE2811D1C91DC9085A42284617F089F9A5 +:10D930000AE005EBD00100F00702012508789540C8 +:10D94000A843934018430870207820F010002070FE +:10D950003EBD2DE9F0410746C81C0E4620F00300ED +:10D96000B04202D08620BDE8F081C74D0020344689 +:10D970002E60AF802881AA72E8801AE0E988491CED +:10D98000E980810614D4E17800F0030041EA002028 +:10D9900040F20121B0FBF1F201FB12012068FFF718 +:10D9A00070FF2989084480B22881381A3044A06069 +:10D9B0000C3420784107E1D40020D4E72DE9FF4F53 +:10D9C00089B01646DDE9168A0F46994623F440458C +:10D9D000084600F00DFB04000FD0099803F00AF987 +:10D9E0000290207800060AD5A748817A02988142E1 +:10D9F00005D887200DB0BDE8F08F0120FAE7224658 +:10DA000001A90298FFF74EFF834600208DF80C0015 +:10DA10004046B8F1070F1AD001222146FFF702FF56 +:10DA20000028E7D12078400611D502208DF80C009F +:10DA3000ADF81070BDF80400ADF81200ADF8146038 +:10DA40001898ADF81650CDF81CA0ADF818005FEA94 +:10DA5000094004D500252E46A84601270CE0217870 +:10DA6000E07801F0030140EA012040F20121B0FB1F +:10DA7000F1F2804601FB12875FEA494009D5B845BB +:10DA800007D1A178207901F0030140EA0120B042DA +:10DA900001D3BE4201D90720ACE7A8191FFA80F9CB +:10DAA000B94501D90D20A5E79DF80C0028B103A9BF +:10DAB0000998F9F74CFB00289CD1B84507D1A0780C +:10DAC0004FEA192161F30100A07084F804901A98BC +:10DAD00000B10580199850EA0A0027D0199830B192 +:10DAE0000BEB06002A46199917F034F80EE00BEB01 +:10DAF00006085746189E099803F0E8F92B46F61DCC +:10DB0000B5B239464246009502F0D3FD224601A93E +:10DB10000298FFF7C7FE9DF80400224620F010008F +:10DB20008DF80400DDE90110FFF7EAFE002061E74F +:10DB30002DE9FF4FDFF8509182461746B9F80610DD +:10DB4000D9F8000001EB410100EB810440F2012013 +:10DB5000B2FBF0F185B000FB11764D46DDF84C804C +:10DB600031460698FFF78DFE29682A898B46611A8F +:10DB70000C3101441144AB8889B28B4202D8842015 +:10DB800009B038E70699CDB2290603D5A90601D513 +:10DB90000620F5E7B9F806C00CF1010C1FFA8CFC61 +:10DBA000A9F806C0149909B1A1F800C0A90602D5C8 +:10DBB000C4F8088007E0104480B2A9F80800191AD8 +:10DBC00001EB0B00A0602246FE200699FFF798FEAD +:10DBD000E77026712078390A61F30100320AA178D2 +:10DBE00040F0040062F30101A17020709AF8020075 +:10DBF0006071BAF80000E08000262673280602D57E +:10DC000099F80A7000E00127A80601D54FF0000836 +:10DC10004D4600244FF007090FE0CDE90268019658 +:10DC2000CDF800900496E9882046129B089AFFF7E9 +:10DC3000C5FE0028A4D1641CE4B2BC42EDD3002090 +:10DC40009EE72DE9F047804600F0D2F9070005D0A5 +:10DC5000002644460C4D40F2012919E00120BDE8A0 +:10DC6000F087204600F0C4F90278C17802F0030280 +:10DC700041EA0222B2FBF9F309FB13210068FFF726 +:10DC800000FE304486B201E0E8050020641CA4B226 +:10DC9000E988601E8142E4DCA8F10100E88028895F +:10DCA000801B288100203870D9E710B5144631B1A7 +:10DCB000491E218002F09EFFA070002010BD0120AF +:10DCC00010BD10B5D24904460088CA88904201D3DD +:10DCD0000A2010BD096800EB400001EB800250797A +:10DCE000A072D08820819178107901F0030140EA78 +:10DCF0000120A081A078E11CFFF7D4FD20612088DD +:10DD0000401C2080E080002010BD0121018270476E +:10DD10002DE9FF4F85B04FF6FF788246A3F80080CB +:10DD200048681F460D4680788DF8060048680088D0 +:10DD3000ADF8040000208DF80A00088A0C88A04283 +:10DD400000D304462C8241E0288A401C2882701DA2 +:10DD50006968FFF74FFDB8BB3988414501D1601EA6 +:10DD600038806888A04236D3B178307901F0030159 +:10DD700040EA012901A9701DFFF73CFD20BB29895C +:10DD800041452CD0002231460798FFF74BFDD8B90A +:10DD90002989494518D1E9680391B5F80AC0D6F830 +:10DDA00008B05046CDF800C003F090F8DDF800C090 +:10DDB0005A460CF1070C1FFA8CFC4B460399CDF820 +:10DDC00000C002F040FC50B1641CA4B2204600F038 +:10DDD0000FF90600B8D1641E2C820A20D0E67C80A0 +:10DDE0007079B871F088B8803178F07801F003016B +:10DDF00040EA01207881A7F80C90504602F0FAFE24 +:10DE0000324607F10801FFF74DFD38610020B7E603 +:10DE10002DE9FF4F87B081461C469246DDF860B081 +:10DE2000DDF85480089800F0E3F805000CD048466F +:10DE300002F0E0FE2978090608D57549897A814201 +:10DE400004D887200BB0D6E50120FBE7CAF309060A +:10DE50002A4601A9FFF726FD0746149807281CD07B +:10DE600000222946FFF7DEFC0028EBD12878400687 +:10DE700013D501208DF808000898ADF80C00BDF806 +:10DE80000400ADF80E00ADF81060ADF8124002A924 +:10DE90004846F9F75CF90028D4D12978E87801F0F0 +:10DEA000030140EA0121AA78287902F0030240EA3E +:10DEB0000220564507D0B1F5007F04D9611E81428A +:10DEC00001DD0B20BEE7864201D90720BAE7801B9F +:10DED00085B2A54200D92546BBF1000F01D0ABF8B1 +:10DEE0000050179818B1B9192A4616F033FEB8F148 +:10DEF000000F0DD03E4448464446169F02F0F8FFFE +:10DF00002146FF1DBCB232462B46009402F005FCB0 +:10DF1000002097E72DE9F04107461D4616460846C2 +:10DF200000F066F804000BD0384602F063FE21785A +:10DF3000090607D53649897A814203D8872012E538 +:10DF4000012010E522463146FFF7ACFC65B121788F +:10DF5000E07801F0030140EA0120B0F5007F01D82C +:10DF6000012000E0002028700020FCE42DE9F041B1 +:10DF700007461D461646084600F03AF804000BD046 +:10DF8000384602F037FE2178090607D52049897AFC +:10DF9000814203D88720E6E40120E4E422463146AA +:10DFA000FFF7AEFCFF2D14D02178E07801F00302DA +:10DFB00040EA022040F20122B0FBF2F302FB130020 +:10DFC00015B900F2012080B2E070000A60F301018F +:10DFD00021700020C7E410B50C4600F009F828B104 +:10DFE000C18821804079A070002010BD012010BDA3 +:10DFF0000749CA88824209D340B1096800EB400052 +:10E000006FF00B0202EB800008447047002070475D +:10E01000E805002070B50346002002466FF02F058A +:10E020000EE09C5CA4F130060A2E02D34FF0FF30C4 +:10E0300070BD00EB800005EB4000521C2044D2B2C2 +:10E040008A42EED370BD30B50A240AE0B0FBF4F387 +:10E0500004FB13008D18303005F8010C521E1846D1 +:10E06000D2B2002AF2D130BD30B500234FF6FF7591 +:10E0700010E0040A44EA002084B2C85C6040C0F3A7 +:10E080000314604005EA00344440E0B25B1C84EABB +:10E0900040109BB29342ECD330BD000010B582B06B +:10E0A000694601F07CFF002818BFFFDF9DF80000E3 +:10E0B000002448B1019890F8DD0028B1019880F85B +:10E0C000DD4001980AF0F1FAF8488068A0F8D240E3 +:10E0D00002B010BD2DE9F04704460D46062002F0BF +:10E0E0006BFD0646072002F067FD304400F0FF0894 +:10E0F000002718EB050618BF4FF000091DD0208837 +:10E10000401C80B22080B04228BFA4F8009025882F +:10E11000454501D3B54209D30621284602F0A4FDA6 +:10E1200020B90721284602F09FFD10B10020BDE86C +:10E13000F087781CC7B2BE42E1D84FF6FF7020804E +:10E140001220BDE8F08770B582B007F057FC0DF0E3 +:10E150007FFBD74C4FF6FF7600256683A683D5A1BB +:10E160002570D1E90001CDE9000165706946A01C68 +:10E1700016F0A6FEA11C601C14F073FC25721B2077 +:10E1800060814FF4A471A181E08121820321A174F7 +:10E190000422E274A082E082A4F13E002183057093 +:10E1A0004680C6480570A4F110000570468002B094 +:10E1B00070BDF8B5BD4D17460E466860297007F072 +:10E1C00097FB4FF6FF70ADF8000000216846FFF79F +:10E1D00081FFA0B90621BDF8000002F057FD0446FA +:10E1E0000721BDF8000002F051FD002C1CBF0028E3 +:10E1F000FFDF00216846FFF76DFF0028EAD0FFF738 +:10E20000A2FF287812F03CFC10F034F829786868F6 +:10E2100014F039FB28780CF01FFD30460AF051F954 +:10E2200007F004FD297868680BF094FB39462878DC +:10E2300015F0F5F9BDE8F8400DF00ABB10B5012462 +:10E24000002A1CBF002010BD002908BF022105D0F4 +:10E25000012918BF002401D0204610BD0FF02EF96F +:10E26000FAE72DE9F04F8BB0040008BFFFDF022171 +:10E270008F4E06F11C00FFF72DFF002818BFFFDFAF +:10E28000B6F81CA0062002F097FC0546072002F015 +:10E2900093FC284400F0FF0808F1010000F0FF099A +:10E2A0004FF0000BB78B474525D120460FF0C8FA39 +:10E2B000002840F0CE803078002800F0CE8084F82E +:10E2C00001B014202070C4F804B0C4F808B0C4F839 +:10E2D0000CB0C4F810B0C4F814B0C4F818B0C4F846 +:10E2E0001CB00220C4F820B0207186F800B00BB03A +:10E2F0000120BDE8F08F4F4520D1204607F030FCCB +:10E3000000287DD008F032F8002859D0207817284E +:10E3100056D12079002853D0E088072102F0A4FCD0 +:10E32000050008BFFFDF288807F0FBFAE088072117 +:10E3300002F0ACFC002818BFFFDF8AE004A93846D1 +:10E3400001F02DFE00285BD19DF8100048B107F0C8 +:10E3500062FCB84254D0214638460BF004FA80B330 +:10E3600077E00FF000FBB84277D02146384614F032 +:10E37000ABF900286DD1059800F1580590F8D00050 +:10E3800018B9E87E08B1012000E00020079095F858 +:10E39000370000281CBF95F8380010F0020F1CD081 +:10E3A00084F801B00120207084F804B0E78095F86B +:10E3B00039002072688F6081A88FA08185F837B0FE +:10E3C00047E0FFE7059800F1580590F80C01002898 +:10E3D000DBD1E87E0028D8D0D5E7384602F088FDAA +:10E3E0000290002808BFFFDF029801F097FF50B1AC +:10E3F00084F801B00F212170E7802081012000E026 +:10E400002BE0207125E0384602F060FD02900028E4 +:10E4100008BFFFDF079800B3029801F0D6FFE0B114 +:10E420009DF8100038B90598D0F8F8004188B94235 +:10E4300008BF80F800B0384607F073FA84F801B0DE +:10E440000C20207084F804B0E780287F207285F8C3 +:10E450001BB00BB00120BDE8F08F022106F11C00BB +:10E46000FFF738FE18B9B08B50457FF41BAF0BB0E7 +:10E470002046BDE8F04F15F018B910B513F08CF830 +:10E48000042803D013F088F8052802D110F00FF902 +:10E4900028B90AF0EBFA20B107F08AFD08B10C2088 +:10E4A00010BD0DF021FA002010BD00005C0000201E +:10E4B00032060020FFFFFFFF1F0000006800002061 +:10E4C00010B50446007800281EBF0128122010BD98 +:10E4D00013F062F8042806D013F05EF8052802D085 +:10E4E0000AF0C4FA28B10DF04EFB00281CBF0C2026 +:10E4F00010BD2078002816BF02280020012004F15A +:10E500001703E21D611CBDE810400DF045BA10B5BF +:10E510000446007800281EBF0128122010BD13F009 +:10E520003BF8042803D013F037F8052802D110F087 +:10E53000BEF828B90AF09AFA20B107F039FD08B1FF +:10E540000C2010BD2078002816BF022800200120D2 +:10E55000611C0DF08FF9002814BF0020072010BDAA +:10E5600010B50DF013FB002814BF0020302010BDA3 +:10E5700010B5044613F010F8042806D013F00CF878 +:10E58000052802D00AF072FA08B10C2010BD20460E +:10E590000DF0F6FA002010BD10B512F0FDFF0428B2 +:10E5A00006D012F0F9FF052802D00AF05FFA28B170 +:10E5B0000DF0E9FA00281CBF0C2010BD0DF045FA43 +:10E5C000002010BDFF2181704FF6FF718180FE4950 +:10E5D00049680A7882718A880281498841810121CB +:10E5E00041700020704710B5002482B0022A18D074 +:10E5F00014DC12F10C0F14D008DC12F1280F1CBF30 +:10E6000012F1140F12F1100F11D10AE012F1080FDC +:10E610001CBF12F1040F002A09D102E0D31E052B02 +:10E6200005D8012807D0022809D003280BD01224CE +:10E6300002B0204610BD104607F093FEF8E71046E2 +:10E640000FF0D4FDF4E708461446694601F0A7FC34 +:10E65000002818BF0224EBD19DF80000019880F833 +:10E6600057400024E4E710B5134601220EF029F9C3 +:10E67000002010BD10B5044612F08EFF052804BF1F +:10E680000C2010BD204612F0E9F9002010BD10B595 +:10E69000044612F081FF042806D012F07DFF052801 +:10E6A00002D00AF0E3F908B10C2010BD2146002089 +:10E6B00007F0A5F9002010BD10B5044612F078FA55 +:10E6C00050B10AF0C6F938B1207809F01EFF207861 +:10E6D00010F026F8002010BD0C2010BD10B5044627 +:10E6E00012F05AFF042806D012F056FF052802D077 +:10E6F0000AF0BCF908B10C2010BD2146012007F03A +:10E700007EF9002010BD38B504464FF6FF70ADF815 +:10E710000000A079E179884213D021791F299CBF9C +:10E7200061791F290DD80022114615F0B1FB40B9BF +:10E730000022E079114615F0ABFB10B9207A0728CA +:10E7400001D9122038BD0AF091F960B912F024FF06 +:10E7500048B900216846FFF7BDFC20B1204606F00D +:10E760007CF9002038BD0C2038BD70B50446807897 +:10E77000002582B01A2825D00EDC162844D2DFE806 +:10E7800000F0434343434321434343434343434311 +:10E7900043434343432121212A2835D00BDCA0F1F8 +:10E7A0001E000C2830D2DFE800F02F2F2F2F2F2F44 +:10E7B0002F2F2F2F2F0D3A38042825D2DFE800F015 +:10E7C000240224022088B0F5706F1DD2012669460C +:10E7D00001F0E5FB00281EBF022002B070BD9DF8CD +:10E7E0000000002801980BBF00F1F40100F5B8719A +:10E7F00000F1F50300F27113024612D192F8D00035 +:10E8000092F8732052B903E002B04FF0120070BDCD +:10E81000002818BF042801D0087868B102B00C2085 +:10E8200070BD92F80C0192F87320002AF6D10028EE +:10E8300018BF0428F0D1F1E70E70A07818709DF889 +:10E84000000048B1019890F8DD0028B1019880F8E7 +:10E85000DD50019809F029FF02B0002070BDF0B52D +:10E8600083B00C46694601F09AFB28B1204616F0A9 +:10E8700011FB03B00220F0BD0198002700F15805FC +:10E8800000F1080685F840703146204616F018FB66 +:10E8900095F840000028F5D103B0F0BD2DE9F04116 +:10E8A000044691F8550091F856300D4610F00C0FC3 +:10E8B0004FF0000608BF00232189A0880EF068F9F8 +:10E8C000696A814228BFBDE8F081401A401C4108B6 +:10E8D000A0886FF00E07401A80B2A08022896FF0E6 +:10E8E0000D0C511A8BB2238195F85410628811F0E7 +:10E8F0000C0F28D0B0F5747F38BF304606D350389F +:10E90000C11700EB91600CEBA01080B2824238BFBF +:10E910001046608095F85510E08811F00C0F1BD060 +:10E92000B3F5747F38BF324607D3A3F15001CA173D +:10E9300001EB92610CEBA1118AB2904228BF104604 +:10E94000E080BDE8F08102291ABF0CEBD00080B254 +:10E9500007EB9000DAD1D8E702291ABF0CEBD301FC +:10E960008AB207EB9301E8D1E6E7F0B587B00C4631 +:10E97000054604A901F013FB00281CBF07B0F0BD39 +:10E980009DF81000002814BF002201220599B1F85B +:10E990004A30FB2B28BFFB23B1F84CC0BCF1FB0F66 +:10E9A00028BF4FF0FB0C094FD7E90006BF68009065 +:10E9B00001960297ADF80230ADF806C06846FFF741 +:10E9C0006DFF658004E000005C000020E450020060 +:10E9D000BDF80400E080BDF808006081BDF80200C9 +:10E9E000A080BDF80600208107B00020F0BD2DE911 +:10E9F000F04788B004460088694601F0D0FA070065 +:10EA00001CBF08B0BDE8F087B4F806C02289ACF19D +:10EA10001B011220E12924BF08B0BDE8F087B2F540 +:10EA2000A47F3CBF08B0BDE8F08744F29025AA421D +:10EA300084BF08B0BDE8F08700266388A188A3F1F1 +:10EA40001B08B8F1E10F24BF08B0BDE8F087B1F5AD +:10EA5000A47F27BF8846454508B0BDE8F087112050 +:10EA6000BCF1FB0F92BFB2F5296F08B0BDE8F0878B +:10EA7000FB2B92BFB1F5296F08B0BDE8F087208865 +:10EA800006A901F08CFA002818BFFFDF35D19DF8E8 +:10EA9000180000280CBF012200220799B1F84A0093 +:10EAA000FB2828BFFB20B1F84C30FB2B28BFFB23F1 +:10EAB000DFF834AADAF800C0DAF80490DAF808A02F +:10EAC000CDF808C0CDF80C90CDF810A0ADF80A0034 +:10EAD000ADF80E3002A8FFF7E1FEBDF80C0060F3C0 +:10EAE0001F45BDF8100060F31F48BDF80A0060F331 +:10EAF0000F05BDF80E0060F30F0862881FFA88F159 +:10EB0000092091423CBF08B0BDE8F087A9B2E28875 +:10EB100091423CBF08B0BDE8F0874FEA1841A28897 +:10EB2000238901EB15411A4491423CBF08B0BDE86E +:10EB3000F0879DF800004FF001090028019840F689 +:10EB4000480808D000F5CD7580F89B91019890F8A1 +:10EB5000DE0140B307E000F5827580F80591019869 +:10EB600090F8280108B13A2718E0E08868806088AA +:10EB7000E8802089A880A088288101222846019960 +:10EB8000FFF78CFEA888404528BF40F64800A880C3 +:10EB9000288940451DD2288185F800906E7008B004 +:10EBA0003846BDE8F087E08868806088E880208982 +:10EBB000A880A0882881002228460199FFF76EFED0 +:10EBC000A888404528BF40F64800A88028894045CD +:10EBD000E1D340F64800DEE709E710B5044612F03D +:10EBE000DBFC042806D012F0D7FC052802D009F07F +:10EBF0003DFF28B10CF0C7FF00281CBF0C2010BD42 +:10EC00002078002816BF022800200120E279611C2C +:10EC10000DF03DF9002814BF0020022010BD2DE9A1 +:10EC2000F04383B006460088694601F0B8F9070052 +:10EC30001CBF03B0BDE8F083B088002818BF0128CE +:10EC400005D002281EBF122003B0BDE8F083E946BC +:10EC5000B17800290CBF07250D46F07800280CBFBD +:10EC60000724044615F0040F16BF002900210121D6 +:10EC700014F0040F16BF00280020012001424FF0BD +:10EC800009080AD001221146484601F0A0F90028DF +:10EC900038D003B04046BDE8F08381B100220121A5 +:10ECA000484601F094F90028F3D114F0040F29D05C +:10ECB00001221146484601F08AF918B343E080B1B9 +:10ECC00001220021484601F082F90028E1D115F027 +:10ECD000040F17D001221146484601F078F988B197 +:10ECE00025E015F0040F04F0040023D0C0B1012288 +:10ECF0001146484601F06BF900281CBF25F00405B9 +:10ED000024F0040400219DF800200120002A019A2B +:10ED10001CD082F8A501019A92F8F221BAB33FE023 +:10ED200000220121484601F052F90028EAD025F0DE +:10ED30000405E7E70028E5D001220021484601F05C +:10ED400046F90028DED024F00404DBE782F80F0146 +:10ED5000019A92F834213AB9019A92F80E211AB91F +:10ED6000019A92F87D200AB13A270CE0019A82F8C4 +:10ED70000E01019880F81051019880F81141019A14 +:10ED8000B088A2F81201019880F80F111AE0FFE78D +:10ED9000019A92F8A4211AB9019A92F87D200AB139 +:10EDA0003A270CE0019A82F8A401019880F8A65154 +:10EDB000019880F8A741019AB088A2F8A8010198AB +:10EDC00080F8A51103B03846BDE8F083817831F0B2 +:10EDD000070107BFC17831F00701122070471EE715 +:10EDE00002781221012A18BF002A05D0022A18BF72 +:10EDF000032A01D0084670474278002A18BF012A2A +:10EE000003D0022A18BF032AF4D1C27B12B9827838 +:10EE1000012AEFD1837833F00502EBD113F0050F0F +:10EE2000E8D030B4C278C488B0F80AC0002A18BF4D +:10EE3000012A04D1042C28BFBCF1040F02D230BC3B +:10EE400008467047052B07D0827B002AF7D0072A97 +:10EE5000F5D830BC01F0D6B80279B0F808C0838983 +:10EE6000002A18BF012AEAD1BCF1040F28BF042BE5 +:10EE7000E5D3E9E710B5044602781220012A0FD045 +:10EE8000002A18BF10BD012A26D012F085FB0528E4 +:10EE900004D011F01AFD002808BF10BD0C2010BDD1 +:10EEA0006178002918BF012906D0022918BF10BDBA +:10EEB000A188002908BF10BD6388002B1CBFA18852 +:10EEC0000029E0D003EB83035B0001EB8101B3EB8E +:10EED000012F28BF10BDD6E70FF015FB002804BF97 +:10EEE000122010BD0FF035FB00200FF0CEFB0028E4 +:10EEF00018BF10BD60780FF0BAFB002818BF10BD16 +:10EF0000A1886088BDE8104011F0A0BE427A12F0DE +:10EF1000070F0FD032F007030CD1012A18BF022AC5 +:10EF200003D0042A1CBF1120704790F83A301BB957 +:10EF3000012A01D0122070472DE9F00F4FF0000C8C +:10EF400012F0010F40F6774640F67B4337D069B1A7 +:10EF50004489B0F810C0271F43F6FD75AF423CBF8F +:10EF6000ACF10407AF4226D2644524D3C78AB0F877 +:10EF70001CC0458C048DB0F82E80B0F83490A7F1F9 +:10EF8000060A9A453CBFACF1060A9A4513D267457A +:10EF900098BFB5F5FA7F3CBFA4F10A07B7420AD281 +:10EFA0006D1C05FB0CFCBCEB840F04DAC84598BF54 +:10EFB0004FF0010C03D9BDE8F00F3020704712F07C +:10EFC000020F27D000EB4C04B4F81690A58BB4F8D0 +:10EFD0002280278DB4F82EA0A48EA9F1060B5B45E4 +:10EFE00084BFA5F1060B5B45E5D9A94598BFB8F5E7 +:10EFF000FA7F3CBFA7F10A09B145DCD208F101084C +:10F0000008FB05F5B5EB870FD5DAA24598BF0CF1E3 +:10F01000010CD0D812F0040F22D000EB4C02D78A9A +:10F02000B2F81CC0558C148DB2F82E80928EA7F1C8 +:10F0300006094B4584BFACF106094B45BBD9674572 +:10F0400098BFB5F5FA7F3CBFA4F10A03B342B2D230 +:10F050006B1C03FB0CF3B3EB840FACDA9045AAD81E +:10F0600002782AB1012A13D0BDE8F00F12207047B0 +:10F070000029817808D0002918BF012908D0022969 +:10F0800018BF032904D0EFE7002918BF0129EBD1ED +:10F090004078002818BF012803D0022818BF032891 +:10F0A000E2D1BDE8F00F0020704700212EE7017883 +:10F0B00011F0010F02D0406814F0CABA14F097BAE8 +:10F0C0002DE9F04F91B00D460246AFF61841D1E957 +:10F0D0000001CDE90E0111462846FFF717FF060093 +:10F0E0001CBF11B0BDE8F08F12F056FA04280CD006 +:10F0F00012F052FA052808D0FC4F387828B90EF0E3 +:10F1000032FCA0F57F41FF3903D011B00C20BDE8DF +:10F11000F08FF7480B90F7480C90F7480D900BAA2A +:10F12000062110A801F06EFD040002BF092011B0F5 +:10F13000BDE8F08F03210DF02EF9EC48818AA4F888 +:10F140004A10C28AA4F84C20C37C0093837C208898 +:10F1500001F045FE002818BFFFDF208806F0E0FB25 +:10F16000278804F10E094FF0000B4FF00A0A042122 +:10F17000484604F000FF48460DF0DFFA062001F093 +:10F180001BFD80461DE005A9062001F0F6FC05A840 +:10F1900001F0D1FC5FEA000B11D100BFBDF81800EF +:10F1A000B84206D00798042249460E3015F0A6FC56 +:10F1B00070B105A801F0BFFC5FEA000BEED0A8F12A +:10F1C0000108B8F1000F07DDBBF1000FDBD007E04D +:10F1D00048460DF0BBFAF2E7BBF1000F08BFFFDFB6 +:10F1E000D9F800000DF0CDFABAF1010A01D00028DB +:10F1F000BDD0C2A004F1120700680190032101A84C +:10F2000004F090FE002001A90A5C3A54401CC0B2F0 +:10F210000328F9D3A88B6080688CA080288DE080BB +:10F22000687A10F0040F18BF08277CD0DFF8BC8282 +:10F230003A461146B8F8180011F071FD0146A06277 +:10F24000204611F0AFFD17F00C0F09D001231A462C +:10F25000214600200DF0A5FC616A884288BF09267E +:10F260004FF0000984F85E9084F85F90A878002839 +:10F2700016BF0228002001206076D5F80300C4F8EC +:10F280001A00B5F80700E0830EA904F1080015F094 +:10F2900017FE4FF0010A84F800A1CDF81CA0B4F8C5 +:10F2A0004C0004F58277FB2828BFFB20B8F80A1031 +:10F2B000814238BF084694F855104FF4747C11F021 +:10F2C0000C0F1CBF0CEB80118AB26BD0B8F80C107D +:10F2D000914238BF0A46B4F84A10FB2928BFFB21E7 +:10F2E000B8F80E308B4238BF194694F854B01BF072 +:10F2F0000C0F1CBF0CEB81139BB25BD0B8F810C095 +:10F300009C4538BF63461B2918BFB3F5A47F5AD06C +:10F31000F8803A817980BB8021463846079AFFF70A +:10F32000BDFAB88800E031E040F64801884228BFC5 +:10F3300040F64800B8803889884228BF40F6480027 +:10F34000388187F800A000BF8DF800900121684641 +:10F3500004F0E8FD9DF8000000F00701C0F3C102D1 +:10F360001144C0F3401008448DF80000401D207681 +:10F3700009283CBF08302076002120460DF00BF80C +:10F3800068780FF0CBF8002E74D122E010F0010F56 +:10F3900018BF01277FF44AAF10F0020F14BF0227F5 +:10F3A000002743E7022907BF81003C31C1007031CB +:10F3B0008AB28BE7BBF1020F07BF8B003C33CB0057 +:10F3C00070339BB29AE71B2818BFB2F5A47F9FD178 +:10F3D000BAE7A9782878EA1C0FF073F8002808BF6C +:10F3E000122647D00FF0B5F8A9782878EA1C0FF05C +:10F3F00018F906003ED1687A10F0040F14BF0820F7 +:10F4000001200FF053F8060034D1214603200FF0FD +:10F4100032F906002ED1697A8DF80010697A11F060 +:10F42000010F06D06889ADF80200288AADF8040003 +:10F430000120697A11F0020F18BF401C11F0040F6F +:10F4400007D005EB40004189ADF80610008AADF801 +:10F450000800684611F0B9FB064695F83A00002806 +:10F4600018BF01200FF028F826B9204611F047FBFD +:10F47000060009D0208806F054FA2088062101F001 +:10F4800005FC002818BFFFDF304611B0BDE8F08F43 +:10F490000146002014E638B5144C207870B912F0FB +:10F4A0007BF8052805D00EF05EFAA0F57F41FF3904 +:10F4B00004D0684611F005FC10B113E00C2038BDF3 +:10F4C0000098008806F02DFA00980621008801F0C7 +:10F4D000DDFB002818BFFFDF0120207008480078FE +:10F4E000FCF788FC002038BDE45002003206002002 +:10F4F000F4050020680000202206002011223300BD +:10F500005C00002070B4B0F802C08188C388028912 +:10F5100044898089ACF1060640F67B45AE423CBF8B +:10F520008E1FAE4214D28C4598BFB3F5FA7F3EBF12 +:10F53000A2F10A0CFE4D15EB0C0509D25B1C5943D8 +:10F54000B1EB820F04DA84429EBF002070BC70478A +:10F55000302070BC70472DE9F047B0F802C0044677 +:10F560008188C388028947898689ACF1060940F6FB +:10F570007B4830200025C1453ABFA1F10609C145AD +:10F58000BDE8F0878C4598BFB3F5FA7F3DBFA2F187 +:10F590000A0CDFF89C8318EB0C08BDE8F0875B1CB5 +:10F5A0005943B1EB820FA8BFBDE8F087B74288BFCF +:10F5B000BDE8F0872088062101F056FB68B190F87D +:10F5C000D01090F8732042B9002918BF042904D044 +:10F5D000D0F8F8100A781AB106E00220BDE8F087EA +:10F5E000D0F84421127812B13A20BDE8F087052204 +:10F5F0008A71D0F8F8100D81D0F8F820A1885181D7 +:10F60000D0F8F820E1889181D0F8F8202189D181C3 +:10F61000D0F8F8100A894B899A429EBF8A79082A45 +:10F620009A4224BF1220BDE8F08722884A80D0F891 +:10F63000F800022101700020BDE8F087F0B583B02A +:10F6400005460DF0D9F8002802BF122003B0F0BD26 +:10F650000026B84F012429467C70B81C15F030FCF8 +:10F660007E706946062001F088FA002818BFFFDF87 +:10F67000684601F060FA002808BFBDF804500AD1BE +:10F68000029880F80041684601F055FA18B9BDF8B3 +:10F690000400A842F4D103B00020F0BD10B5044628 +:10F6A0000088062101F0E0FA68B190F8D01090F8D7 +:10F6B000732042B9002918BF042904D0D0F8F810EB +:10F6C0000A7812B105E0022010BDD0F8442112786A +:10F6D0000AB13A2010BD90F8962012F0010F04BF35 +:10F6E0000C2010BDD4F80220D4F806304A608B609C +:10F6F000D0F8F81062898A81D0F8F810E268C1F871 +:10F700000E202269C1F812206269C1F81620A26990 +:10F71000C1F81A20D0F8F82003211170D0F8F800B1 +:10F7200021884180002010BDF8B516460F460446DA +:10F7300009F09CF900281CBF0C20F8BD207812238A +:10F74000EF2801D91846F8BD6088ADF8000010F028 +:10F75000100F4FF000050CD010F0010F00F0020167 +:10F760001BD0B1B110F0080F08BF10F0040F1ED06D +:10F770001AE010F0080FE5D110F0200F18BF10F0BC +:10F78000030FDFD110F0010F18BF10F0020FD9D115 +:10F790000DE010F0040F0AD106E029B110F0080FB7 +:10F7A00008BF10F0040F02D010F00F0FCAD1B4F848 +:10F7B00002C01CF0080F08D1D4E90110884228BF0C +:10F7C0002029BFD3B0F1807FBCD2207B0028B9D0E4 +:10F7D0000728B7D8607B002818BF012803D002286B +:10F7E00018BF0328AED11CF0040F03D1022818BFA4 +:10F7F000032807D1A07B002818BF0128A2D11CF044 +:10F80000040F08D1607D002818BF012803D002280A +:10F8100018BF032896D1E07D1CF0100F02D00128FC +:10F8200011D08FE7012818BF03288BD11CF0100FCF +:10F8300009D1607E01281CBF0228032882D1A07E46 +:10F840000F283FF67FAFE07E002818BF01287FF425 +:10F8500079AF1CF0400F1CBF1120F8BD3D70A5759D +:10F8600056B9FF208DF800006946002006F065FDBE +:10F870006946002006F04CFD2046BDE8F84006F041 +:10F8800074BC002250E72DE9F0470446C0780F46CB +:10F89000122510B106F0DBFC50B1607804280AD0C4 +:10F8A00094F8038094F800906678B8F1FB0F12D9B1 +:10F8B0002846BDE8F08709F0D9F80028F8D006F00E +:10F8C0001EFD0028F4D106F0EEF9002804BFE07810 +:10F8D0000028EDD1E4E71FB1B8F11F0F23D9E7E706 +:10F8E00006F0E1F928B1B8F11F0F98BF032E07D039 +:10F8F000DEE7032E18BF042E02D0B8F1000FD7D0D8 +:10F9000009F0B4F8002818BF032E04D0042E1CBF41 +:10F910000C20BDE8F087484606F0BDF9002804BF7A +:10F920004220BDE8F087E07861781F2804E00000FD +:10F9300089F3FFFF3206002098BF03291CBF112066 +:10F94000BDE8F087211D06F0F8FC0020BDE8F08737 +:10F95000002198E72DE9F0470446C0788846122731 +:10F9600010B106F00AFD38B16578042D04D0E678B0 +:10F9700094F80090FB2E02D93846BDE8F087B8F124 +:10F98000000F02D01F2E21D9F6E706F08CF920B126 +:10F990001F2E98BF032D06D0EEE7032D18BF042DB0 +:10F9A00001D0002EE8D009F061F8002818BF032D1F +:10F9B00004D0042D1CBF0C20BDE8F087484606F09B +:10F9C0006AF9002804BF4220BDE8F087E07861783A +:10F9D0001F2898BF03291CBF1120BDE8F087211DF7 +:10F9E00006F096FC0020BDE8F0870021B2E72DE983 +:10F9F000F04304464078422583B0012808D8A07817 +:10FA000006F049F920B120781225012804D0A0B1D0 +:10FA100003B02846BDE8F08306F0C3FC20B1A088FF +:10FA20000028F5D08028F3D806F0C2FC68B16078D1 +:10FA30000028EDD0207801280BD007F077FE04468F +:10FA400008F08CFC002800F0038103B00C20BDE816 +:10FA5000F08306F0B5FA38B906F09CFC002802BF26 +:10FA6000122003B0BDE8F08309F000F80028ECD1C3 +:10FA700006F0D1F8A0F57F41FF39E6D106F0BFFAD4 +:10FA8000A08842F2107100FB01F6A079314606F021 +:10FA9000EFFB06F06BFCF8B10022072101A801F092 +:10FAA000B1F8040049D0FE480321846020460CF0E0 +:10FAB00079FB204607F067F8FA4DA88AA4F84A00B7 +:10FAC000E88AA4F84C0006F0EEF870B1288B01210A +:10FAD00008F0C8FDA06210E03146002008F018FDD3 +:10FAE000002818BFFFDF00F0BEB806F063FC2A8BC9 +:10FAF0000146104608F0B6FDA062014600222046ED +:10FB000007F017FE06F0CFF84FF00108C8B906F06D +:10FB100051FC10F00C0F14D001231A462146184650 +:10FB20000DF03FF8616A88420BD90721BDF8040047 +:10FB300001F0ACF8002818BFFFDF092003B0BDE8D2 +:10FB4000F083E87C0090AB7CEA8AA98A208801F0E7 +:10FB500046F9002818BFFFDF208805F0E1FE314696 +:10FB6000204608F0D5FC002818BFFFDF2146B4F876 +:10FB70004C00002204F5CD76FB2828BFFB206B89C2 +:10FB8000834238BF184691F855304FF4747413F01F +:10FB90000C0F1CBF04EB80131FFA83FC3BD000BF8B +:10FBA000B5F80C90E14528BFE146B1F84A30FB2B8F +:10FBB00028BFFB23B5F80EC09C4538BF634691F8BB +:10FBC00054C01CF00C0F1CBF04EB831C1FFA8CF7F5 +:10FBD0002AD02C8ABC4228BF3C461B2B18BFB4F548 +:10FBE000A47F2FD0F080A6F808907380B4803046B0 +:10FBF000FEF754FEB08840F64801884228BF40F620 +:10FC00004800B0803089884228BF40F648003081E3 +:10FC100086F8008027E0022B07BF83003C33C30037 +:10FC200070331FFA83FCBBE7BCF1020F07BF4FEA3A +:10FC3000830C0CF13C0C4FEAC30C0CF1700C1FFA56 +:10FC40008CF7C6E71B2818BFB9F5A47FCAD10AE014 +:10FC50004CB1208805F065FE2088072101F016F8D8 +:10FC6000002818BFFFDF002003B0BDE8F0830021AB +:10FC7000BDE610B50C46072100F0F6FF002804BFD2 +:10FC8000022010BD90F8731109B10C2010BD90F83E +:10FC90006510142912BF152990F8C0110029F4D15C +:10FCA0002168C0F874116168C0F87811A168C0F8C3 +:10FCB0007C11E168C0F88011012180F873110020E7 +:10FCC00010BD10B5072100F0CFFF002804BF0220AF +:10FCD00010BD90F8731109B10C2010BD90F865109B +:10FCE000142918BF1529F7D1022180F873110020BB +:10FCF00010BDF0B50E464BF68032122183B096420D +:10FD000017D8B6B1694600F04AF900281CBF03B005 +:10FD1000F0BD019800F15807841C25883246294619 +:10FD200038460CF035FA2088A842F6D103B00020FE +:10FD3000F0BD03B00846F0BD10B582B0044600889F +:10FD4000694600F02CF900281CBF02B010BD0198D4 +:10FD5000A37800F1580190F82C209A4202BF0C20A1 +:10FD600002B010BD7F220A728A720022CA72E17844 +:10FD700080F82D10217980F82E10A17880F82C10B1 +:10FD800002B0104610BD10B582B00C46694600F0B6 +:10FD900006F900281CBF02B010BD019890F873004E +:10FDA000002818BF0120207002B0002010BD30B51F +:10FDB00083B00D461446694600F0F1F800281CBFD8 +:10FDC00003B030BD019890F82C0001281EBF0C2014 +:10FDD00003B030BD019890F86010297090F8610070 +:10FDE000207003B0002030BD70B50D4616460721C7 +:10FDF00000F03AFF002804BF022070BD83884FF056 +:10FE0000010CC28841880CEB430C65451AD342F2C1 +:10FE1000107C02FB0CF240F6C41C01FB0CF1B2FB9F +:10FE2000F1F1491E8CB2B4F5FA7F88BF4FF4FA7431 +:10FE3000A54238BF2C46621C591CB2FBF1F251435B +:10FE4000491E8BB290F8AC11002908BF038433809F +:10FE5000002070BD10B50C46072100F005FF0028FA +:10FE600004BF022010BD80F8DF40002C1EBF90F8B8 +:10FE7000DD10002908F019FC002010BD01780029D0 +:10FE80001CBF4178002915D041881B2921BF8188DA +:10FE90001B29C18802290DD302680349406805E087 +:10FEA0005C00002032060020F40500200A65486549 +:10FEB000002070471220704710B5044610F02CFF48 +:10FEC000204608F09AFB002010BD2DE9F0411646AF +:10FED0000F46044601221146384610F020FF054621 +:10FEE0000121384608F0BEFB854228BF2846012381 +:10FEF000E100503189B2E631884206D901F196021B +:10FF0000401AB0FBF2F0401C83B233800020BDE801 +:10FF1000F08110B5044611F03FFB042806D011F023 +:10FF20003BFB052802D008F0A1FD08B10C2010BD54 +:10FF3000601C0BF082FF207800F0010006F05AF8F8 +:10FF4000207800F001000EF0FFFA002010BD10B57F +:10FF50000446072000F022FE00281CBF0C2010BD24 +:10FF6000207810F0010F11D000226078114613F0B4 +:10FF70008FFF00281CBF122010BDA0680AF0E9F90D +:10FF8000607861680AF0EEF9002010BD00200AF0E8 +:10FF9000E0F9002108460AF0E5F9002010BD70B52F +:10FFA0000C460546062100F05FFE606010B100209F +:10FFB000207070BD0721284600F056FE60600028C2 +:10FFC00004BF022070BD01202070002070BD10B55C +:10FFD00004468C46007813466168624638B10120B9 +:10FFE0000CF0DFFD6168496A884209D906E000200B +:10FFF0000CF0D7FD6168496A884201D9012010BD23 +:020000040001F9 +:10000000002010BD10B586B0044611F0C5FA0428D2 +:1000100041D011F0C1FA05283DD0A0788DF8080034 +:10002000A0788DF8000060788DF8040020788DF8B5 +:100030000300A07B8DF80500E07B002818BF01209D +:100040008DF80600A07810F0010F27D0E078012885 +:1000500008BF022003D000280CBF012000208DF82B +:100060000100E088ADF80A006089ADF80C00A078C6 +:1000700010F0040F26D02079012808BF022003D0F9 +:1000800000280CBF012000208DF802002089ADF867 +:100090000E00A08914E006B00C2010BD10F0040F73 +:1000A00010D0E078012808BF022003D000280CBF40 +:1000B000012000208DF80200E088ADF80E00608974 +:1000C000ADF8100002A810F080FD002804BF6846BB +:1000D0000EF02BFB06B010BD30B5058825F40044AA +:1000E00021448CB24FF4004194420AD2121B92B2C6 +:1000F0001B339A4201D2A94307E005F40041214392 +:1001000003E0A21A92B2A9431143018030BD084412 +:10011000083050434A31084480B2704770B51D46DC +:1001200016460B46044629463046049AFFF7EFFF71 +:100130000646B34200D2FFDF2821204614F0ABFD73 +:100140004FF6FF70A082283EB0B265776080B0F5B0 +:10015000004F00D9FFDF618805F13C00814200D2E9 +:10016000FFDF60880835401B343880B220801B28B0 +:1001700000D21B2020800020A07770BD81618861A3 +:1001800070472DE9F05F0D46C188044600F128094B +:10019000008921F4004620F4004800F062FB10B111 +:1001A0000020BDE8F09F4FF0000A4FF0010BB04572 +:1001B0000CD9617FA8EB0600401A0838854219DC8B +:1001C00009EB06000021058041801AE06088617F0C +:1001D000801B471A083F0DD41B2F00DAFFDFBD42FA +:1001E00001DC294600E0B9B2681A0204120C04D0FE +:1001F000424502DD84F817A0D2E709EB0600018032 +:10020000428084F817B0CCE770B5044600F12802AC +:10021000C088E37D20F400402BB11044028843885D +:1002200013448B4201D2002070BD00258A4202D3C4 +:100230000180458008E0891A0904090C418003D037 +:10024000A01D00F01EFB08E0637F008808331844FF +:1002500081B26288A01DFFF73FFFE575012070BDE8 +:1002600070B5034600F12804C588808820F4004654 +:100270002644A84202D10020188270BD9889358892 +:10028000A84206D3401B75882D1A2044ADB2C01E6B +:1002900005E02C1AA5B25C7F20443044401D0C8838 +:1002A000AC4200D90D809C8924B1002414700988C7 +:1002B000198270BD0124F9E770B5044600F12801E8 +:1002C000808820F400404518208A002825D0A18984 +:1002D000084480B2A08129886A881144814200D2F2 +:1002E000FFDF2888698800260844A189884212D146 +:1002F000A069807F2871698819B1201D00F0C1FABA +:1003000008E0637F28880833184481B26288201D82 +:10031000FFF7E2FEA6812682012070BD2DE9F041A3 +:10032000418987880026044600F12805B94218D083 +:1003300004F10A0821F400402844418819B14046DC +:1003400000F09FFA08E0637F00880833184481B208 +:1003500062884046FFF7C0FE761C6189B6B2B9429A +:10036000E8D13046BDE8F0812DE9F04104460B4666 +:1003700027892830A68827F40041B4F80A80014470 +:100380000D46B74201D10020ECE70AB1481D1060CC +:1003900023B1627F691D184614F0DCFB2E88698842 +:1003A00004F1080021B18A1996B200F06AFA06E059 +:1003B000637F62880833991989B2FFF78DFE47453C +:1003C00001D1208960813046CCE78188C088814294 +:1003D00001D1012070470020704701898088814247 +:1003E00001D1012070470020704770B58588C3880F +:1003F00000F1280425F4004223F4004114449D42F6 +:100400001AD08389058A5E1925886388EC18A6426C +:1004100014D313B18B4211D30EE0437F08325C1921 +:100420002244408892B2801A80B22333984201D28B +:1004300011B103E08A4201D1002070BD012070BDDE +:100440002DE9F0478846C1880446008921F400461A +:1004500004F1280720F4004507EB060900F001FA33 +:10046000002178BBB54204D9627FA81B801A002501 +:1004700003E06088627F801B801A083823D4E289F9 +:1004800062B1B9F80020B9F802303BB1E81A21771F +:10049000404518DBE0893844801A09E0801A21774A +:1004A00040450ADB607FE189083030443944084424 +:1004B000C01EA4F81280BDE8F087454503DB01208B +:1004C0002077E7E7FFE761820020F4E72DE9F74FA7 +:1004D000044600F12805C088884620F4004A608A56 +:1004E00005EB0A0608B1404502D20020BDE8FE8FA8 +:1004F000E08978B13788B6F8029007EB09018842A5 +:1005000000D0FFDF207F4FF0000B50EA090106D03A +:1005100088B33BE00027A07FB9463071F2E7E1895C +:1005200059B1607F2944083050440844B4F81F1082 +:1005300020F8031D94F821108170E28907EB080070 +:1005400002EB0801E1813080A6F802B002985F4614 +:1005500050B1637F30880833184481B26288A01D8F +:10056000FFF7BAFDE78121E0607FE1890830504460 +:10057000294408442DE0FFE7E089B4F81F1028441F +:10058000C01B20F8031D94F82110817009EB0800AE +:10059000E28981B202EB0800E08137807180029825 +:1005A000A0B1A01D00F06DF9A4F80EB0A07F401C12 +:1005B000A077A07D08B1E088A08284F816B000BFC3 +:1005C000A4F812B084F817B001208FE7E08928441E +:1005D000C01B30F8031DA4F81F10807884F8210098 +:1005E000EEE710B5818800F1280321F4004423448C +:1005F000848AC288A14212D0914210D0818971B9F7 +:10060000826972B11046FFF7E8FE50B910892832AE +:1006100020F40040104419790079884201D100206B +:1006200010BD184610BD00F12803407F0830084473 +:10063000C01E1060088808B9DB1E1360088849884E +:10064000084480B270472DE9F04100F12806407F50 +:100650001C4608309046431808884D88069ADB1ED1 +:10066000A0B1C01C80B2904214D9801AA04200DB15 +:10067000204687B298183A46414614F03FFA0028BF +:1006800016D1E01B84B2B844002005E0ED1CADB2E9 +:10069000F61EE8E7101A80B20119A94206D83044C4 +:1006A00022464146BDE8F04114F028BA4FF0FF3031 +:1006B00058E62DE9F04100F12804407F1E4608303D +:1006C00090464318002508884F88069ADB1E90B193 +:1006D000C01C80B2904212D9801AB04200DB304672 +:1006E00085B299182A46404614F034FA701B86B237 +:1006F000A844002005E0FF1CBFB2E41EEAE7101A80 +:1007000080B28119B94206D821183246404614F009 +:1007100021FAA81985B2284624E62DE9F04100F116 +:100720002804407F1E46083090464318002508885C +:100730004F88069ADB1E90B1C01C80B2904212D93D +:10074000801AB04200DB304685B298182A464146EE +:1007500014F000FA701B86B2A844002005E0FF1CCC +:10076000BFB2E41EEAE7101A80B28119B94206D876 +:1007700020443246414614F0EDF9A81985B22846C6 +:10078000F0E5401D704710B5044600F12801C2880D +:10079000808820F400431944904206D0A28922B9EF +:1007A000228A12B9A28A904201D1002010BD088885 +:1007B000498831B1201D00F064F80020208201201A +:1007C00010BD637F62880833184481B2201DFFF793 +:1007D00083FCF2E70021C18101774182C1758175F7 +:1007E000704703881380C28942B1C28822F4004353 +:1007F00000F128021A440A60C0897047002070473F +:1008000010B50446808AA0F57F41FF3900D0FFDF94 +:10081000E088A082E08900B10120A07510BD4FF6EC +:10082000FF71818200218175704710B50446808A6E +:10083000A0F57F41FF3900D1FFDFA07D28B9A08856 +:10084000A18A884201D1002010BD012010BD8188FD +:10085000828A914201D1807D08B100207047012039 +:10086000704720F4004221F400439A4207D100F47B +:10087000004001F40041884201D00120704700206F +:10088000704730B5044600880D4620F40040A84269 +:1008900000D2FFDF21884FF40040884328432080A6 +:1008A00030BD70B50C00054609D0082C00D2FFDF22 +:1008B0001DB1A1B2286800F044F8201D70BD0DB133 +:1008C00000202860002070BD0021026803E09388AA +:1008D0001268194489B2002AF9D100F032B870B513 +:1008E00000260D460446082900D2FFDF206808B91B +:1008F0001EE0044620688188A94202D001680029D0 +:10090000F7D181880646A94201D100680DE005F1C2 +:10091000080293B20022994209D32844491B02607D +:1009200081802168096821600160206000E0002664 +:10093000304670BD00230B608A8002680A60016047 +:10094000704700234360021D018102607047F0B5CB +:100950000F460188408815460C181E46AC4200D34D +:10096000641B3044A84200D9FFDFA019A84200D977 +:10097000FFDF3819F0BD2DE9F041884606460188B1 +:10098000408815460C181F46AC4200D3641B3844FF +:10099000A84200D9FFDFE019A84200D9FFDF708824 +:1009A0003844708008EB0400BDE8F0812DE9F04187 +:1009B000054600881E461746841B8846BC4200D365 +:1009C0003C442C8068883044B84200D9FFDFA0192D +:1009D000B84200D9FFDF68883044688008EB040023 +:1009E000E2E72DE9F04106881D460446701980B201 +:1009F000174688462080B84201D3C01B20806088FB +:100A0000A84200D2FFDF7019B84200D9FFDF60882A +:100A1000401B608008EB0600C6E730B50D46018834 +:100A2000CC18944200D3A41A4088984200D8FFDF23 +:100A3000281930BD2DE9F041C84D04469046A878EC +:100A40000E46A04200D8FFDF05EB8607B86A50F8D3 +:100A5000240000B1FFDFB868002816D0304600F04F +:100A600044F90146B868FFF73AFF05000CD0B86AB0 +:100A7000082E40F8245000D3FFDFB94842462946EB +:100A800050F82630204698472846BDE8F0812DE9E9 +:100A9000F8431E468C1991460F460546FF2C00D997 +:100AA000FFDFB14500D9FFDFE4B200954DB3002070 +:100AB0008046E81C20F00300A84200D0FFDF494632 +:100AC000DFF89892684689F8001089F8017089F873 +:100AD000024089F8034089F8044089F8054089F804 +:100AE000066089F80770414600F008F90021424687 +:100AF0000F464B460098C01C20F00300009012B136 +:100B00000EE00120D4E703EB8106B062002005E08F +:100B1000D6F828C04CF82070401CC0B2A042F7D3D1 +:100B20000098491C00EB8400C9B200900829E1D369 +:100B3000401BBDE8F88310B5044603F067FD08B11B +:100B4000102010BD2078854A618802EB80009278E1 +:100B50000EE0836A53F8213043B14A1C6280A180C1 +:100B6000806A50F82100A060002010BD491C89B2A5 +:100B70008A42EED86180052010BD70B505460C464E +:100B8000084603F043FD08B1102070BD082D01D3C5 +:100B9000072070BD25700020608070BD0EB56946CD +:100BA000FFF7EBFF00B1FFDF6846FFF7C4FF08B1B6 +:100BB00000200EBD01200EBD10B50446082800D34C +:100BC000FFDF6648005D10BD3EB50546002469465E +:100BD000FFF7D3FF18B1FFDF01E0641CE4B2684601 +:100BE000FFF7A9FF0028F8D02846FFF7E5FF001B14 +:100BF000C0B23EBD59498978814201D9C0B270471F +:100C0000FF2070472DE9F041544B062903D00729F6 +:100C10001CD19D7900E0002500244FF6FF7603EB00 +:100C2000810713F801C00AE06319D7F828E09BB2E6 +:100C30005EF823E0BEF1000F04D0641CA4B2A4450A +:100C4000F2D8334603801846B34201D100201CE796 +:100C5000BDE8F041EEE6A0F57F43FF3B01D0082957 +:100C600001D300207047E5E6A0F57F42FF3A0BD0A4 +:100C7000082909D2394A9378834205D902EB8101C8 +:100C8000896A51F820007047002070472DE9F04133 +:100C900004460D46A4F57F4143F20200FF3902D01D +:100CA000082D01D30720F0E62C494FF000088A7880 +:100CB000A242F8D901EB8506B26A52F82470002FDF +:100CC000F1D027483946203050F82520204690475B +:100CD000B16A284641F8248000F007F802463946F8 +:100CE000B068FFF727FE0020CFE61D49403131F8FC +:100CF00010004FF6FC71C01C084070472DE9F84306 +:100D0000164E8846054600242868C01C20F00300C3 +:100D100028602046FFF7E9FF315D4843B8F1000F36 +:100D200001D0002200E02A680146009232B100277B +:100D30004FEA0D00FFF7B5FD1FB106E001270020C7 +:100D4000F8E706EB8401009A8A602968641C08446D +:100D5000E4B22860082CD7D3EBE600005006002050 +:100D6000F050020070B50E461D46114600F0D4F852 +:100D700004462946304600F0D8F82044001D70BDD6 +:100D80002DE9F04190460D4604004FF0000610D0CA +:100D90000027E01C20F00300A04200D0FFDFDDB1FF +:100DA00041460020FFF77DFD0C3000EB850617B1B2 +:100DB00012E00127EDE7614F04F10C00A9003C604F +:100DC0002572606000EB85002060606813F063FFAF +:100DD00041463868FFF765FD3046BDE8F0812DE9F2 +:100DE000FF4F564C804681B020689A46934600B922 +:100DF000FFDF2068027A424503D9416851F8280094 +:100E000020B143F2020005B0BDE8F08F51460298D0 +:100E100000F082F886B258460E9900F086F885B246 +:100E20007019001D87B22068A14639460068FFF797 +:100E300056FD04001FD0678025802946201D0E9D89 +:100E400007465A4601230095FFF768F92088314686 +:100E500038440123029ACDF800A0FFF75FF92088FB +:100E6000C1193846FFF78AF9D9F800004168002017 +:100E700041F82840C7E70420C5E770B52F4C054668 +:100E8000206800B9FFDF2068017AA9420ED94268C4 +:100E900052F8251051B1002342F825304A880068E5 +:100EA000FFF748FD216800200A7A08E043F20200BB +:100EB00070BD4B6853F8203033B9401CC0B2824239 +:100EC000F7D80868FFF700FD002070BD70B51B4E15 +:100ED00005460024306800B9FFDF3068017AA94276 +:100EE00004D9406850F8250000B1041D204670BDAB +:100EF00070B5124E05460024306800B9FFDF306837 +:100F0000017AA94206D9406850F8251011B131F88C +:100F1000040B4418204670BD10B50A460121FFF7A6 +:100F2000F6F8C01C20F0030010BD10B50A460121E0 +:100F3000FFF7EDF8C01C20F0030010BD700000208A +:100F400070B50446C2F11005281913F003FE15F020 +:100F5000FF0108D0491EC9B2802060542046BDE878 +:100F6000704013F076BE70BD30B505E05B1EDBB29D +:100F7000CC5CD55C6C40C454002BF7D130BD10B5AF +:100F8000002409E00B78521E44EA430300F8013BB9 +:100F900011F8013BD2B2DC09002AF3D110BD2DE9D2 +:100FA000F04389B01E46DDE9107990460D000446F5 +:100FB00022D002460846F949FDF755FB102221468A +:100FC0003846FFF7DCFFE07B000606D5F34A3946DA +:100FD000102310320846FFF7C7FF10223946484653 +:100FE000FFF7CDFFF87B000606D5EC4A49461023F3 +:100FF00010320846FFF7B8FF1021204613F029FEF3 +:101000000DE0103EB6B208EB0601102322466846FA +:10101000FFF7AAFF224628466946FDF724FB102E5B +:10102000EFD818D0F2B241466846FFF789FF102387 +:101030004A46694604A8FFF797FF1023224604A9F1 +:101040006846FFF791FF224628466946FDF70BFBED +:1010500009B0BDE8F08310233A464146EAE770B58F +:101060009CB01E460546134620980C468DF8080095 +:10107000202219460DF1090013F06CFD20222146B3 +:101080000DF1290013F066FD17A913A8CDE90001A1 +:10109000412302AA31462846FFF781FF1CB070BDEC +:1010A0002DE9FF4F9FB014AEDDE92D5410AFBB49C1 +:1010B000CDE90076202320311AA8FFF770FF4FF00A +:1010C00000088DF808804FF001098DF8099054F858 +:1010D000010FCDF80A00A088ADF80E0014F8010C3D +:1010E0001022C0F340008DF8100055F8010FCDF824 +:1010F0001100A888ADF8150015F8010C2C99C0F363 +:1011000040008DF8170006A8824613F023FD0AA8B8 +:1011100083461022229913F01DFDA048352308387C +:1011200002AA40688DF83C80CDE900760E901AA99D +:101130001F98FFF734FF8DF808808DF8099020681C +:10114000CDF80A00A088ADF80E0014F8010C1022AA +:10115000C0F340008DF810002868CDF81100A88871 +:10116000ADF8150015F8010C2C99C0F340008DF86E +:101170001700504613F0EEFC58461022229913F047 +:10118000E9FC86483523083802AA40688DF83C906F +:10119000CDE900760E901AA92098FFF700FF23B042 +:1011A000BDE8F08FF0B59BB00C460546DDE9221096 +:1011B0001E461746DDE92032D0F801C0CDF808C040 +:1011C000B0F805C0ADF80CC00078C0F340008DF851 +:1011D0000E00D1F80100CDF80F00B1F80500ADF810 +:1011E000130008781946C0F340008DF815001088E8 +:1011F000ADF8160090788DF818000DF11900102246 +:1012000013F0A8FC0DF129001022314613F0A2FCC6 +:101210000DF139001022394613F09CFC17A913A8D0 +:10122000CDE90001412302AA21462846FFF7B7FE77 +:101230001BB0F0BDF0B5A3B017460D4604461E46E0 +:10124000102202A8289913F085FC06A8202239460E +:1012500013F080FC0EA82022294613F07BFC1EA967 +:101260001AA8CDE90001502302AA314616A8FFF7BB +:1012700096FE1698206023B0F0BDF0B589B0044604 +:10128000DDE90E070D463978109EC1F340018DF857 +:10129000001031789446C1F340018DF801101968AF +:1012A000CDF802109988ADF8061099798DF80810DC +:1012B0000168CDF809108188ADF80D1080798DF89E +:1012C0000F0010236A46614604A8FFF74DFE224630 +:1012D000284604A9FDF7C7F9D6F801000090B6F832 +:1012E0000500ADF80400D7F80100CDF80600B7F806 +:1012F0000500ADF80A000020039010236A4621463D +:1013000004A8FFF731FE2246284604A9FDF7ABF9F1 +:1013100009B0F0BD1FB51C6800945B6801931368A9 +:10132000029352680392024608466946FDF79BF90C +:101330001FBD10B588B00446106804905068059031 +:1013400000200690079008466A4604A9FDF78BF92D +:10135000BDF80000208008B010BD1FB51288ADF8A0 +:1013600000201A88ADF80220002201920292039216 +:10137000024608466946FDF776F91FBD7FB5074B63 +:1013800014460546083B9A1C6846FFF7E6FF2246CE +:1013900069462846FFF7CDFF7FBD00004851020097 +:1013A00070B5044600780E46012813D0052802D0F7 +:1013B000092813D10EE0A06861690578042003F0C4 +:1013C000B3F8052D0AD0782300220420616903F0C8 +:1013D00001F803E00420616903F0A6F831462046D5 +:1013E000BDE8704001F086B810B500F12D02C37958 +:1013F0009478411D64F003042340C371DB070DD0D2 +:101400004B79547923404B710B79127913400B714E +:101410008278C9788A4200D9817010BD00224A7151 +:101420000A71F5E74178012900D00C21017070475D +:101430002DE9F04F93B04FF0000B0C690D468DF87D +:1014400020B0097801260C2017464FF00D084FF008 +:10145000110A4FF008091B2975D2DFE811F01B00B3 +:10146000C30206031E035D037003A203B703F80360 +:10147000190461049304A004EC042A053405520500 +:101480005D05EE053106340663067F06F9061D0785 +:10149000E606EB0614B120781D282AD0D5F808807E +:1014A0005FEA08004FD001208DF82000686A022210 +:1014B0000D908DF824200A208DF82500A8690A9047 +:1014C000A8880028EED098F8001091B10F2910D20A +:1014D0007ED2DFE801F07D1349DEFEFDFCFBFAF968 +:1014E00038089CF8F70002282DD124B120780C2868 +:1014F00001D00026EFE38DF82020CBE10420696ABB +:1015000003F012F8A8880728EED1204600F0EDFF7E +:10151000022809D0204600F0E8FF032807D920461A +:1015200000F0E3FF072802D20120207004E0002C25 +:10153000B8D020780128D7D198F80400C11F0A2913 +:1015400002D30A2061E0C4E1A070D8F80010E16283 +:10155000B8F80410218698F8060084F832000120BB +:1015600028700320207044E00728BDD1002C99D0BA +:1015700020780D28B8D198F8031094F82F20C1F3E3 +:10158000C000C2F3C002104201D0062000E00720D4 +:10159000890707D198F805100142D2D198F80610B2 +:1015A0000142CED194F8312098F8051020EA0202C9 +:1015B0001142C6D194F8322098F8061090430142A7 +:1015C000BFD198F80400C11F0A29BAD2617D00E09A +:1015D00006E281427ED8D8F800106160B8F80410A5 +:1015E000218198F80600A072012028700E2020703A +:1015F00003208DF82000686A0D9004F12D000990F9 +:10160000601D0A900F300B9022E12875FDE3412800 +:1016100091D1204600F069FF042802D1E078C0078C +:1016200004D1204600F061FF0F2884D1A88CD5F8A2 +:101630000C8080B24FF0400BE669FFF747FC324662 +:1016400041465B464E46CDF80090FFF732F80B203E +:101650008DF82000686A0D90E0690990002108A8C3 +:10166000FFF79EFE2078042806D0A07D58B10128FF +:1016700009D003280AD049E30520207003202870F0 +:101680008DF82060CDE184F800A032E712202070B0 +:10169000E9E11128BCD1204600F027FF042802D13F +:1016A000E078C00719D0204600F01FFF062805D1BA +:1016B000E078C00711D1A07D02280ED0204600F0AE +:1016C00014FF08E0CAE081E06FE14EE121E101E1B1 +:1016D000E7E017E0ADE111289AD1102208F10101ED +:1016E00004F13C0013F036FA607801287ED0122015 +:1016F0002070E078C00760D0A07D0028C8D0012805 +:10170000C6D05AE0112890D1204600F0EEFE0828FD +:1017100004D0204600F0E9FE132886D104F16C00C5 +:10172000102208F10101064613F014FA2078082867 +:101730000DD014202070E178C8070DD0A07D0228BC +:101740000AD06278022A04D00328A1D035E009200B +:10175000F0E708B1012837D1C80713D0A07D0228CF +:101760001DD000200090D4E9062133460EA8FFF7D3 +:1017700076FC10220EA904F13C0013F0BFF9C8B1A9 +:10178000042042E7D4E90912201D8DE8070004F186 +:101790002C0332460EA8616BFFF76FFDE9E7606B23 +:1017A000C1F34401491E0068C84000F0010040F048 +:1017B0008000D7E72078092806D185F800908DF8B9 +:1017C000209033E32870ECE30920FBE711289AD13D +:1017D000204600F08AFE0A2802D1E078C00704D132 +:1017E000204600F082FE15288DD100E08DE104F145 +:1017F0003C00102208F10101064613F0ABF92078F5 +:101800000A2816D016202070D4E90932606B611DB9 +:101810008DE80F0004F15C0304F16C0247310EA85F +:10182000FFF7C0FC10220EA9304613F067F918B17B +:10183000F5E20B20207071E22046FFF7D5FDA0787D +:10184000216A0A18C0F11001104613F002FA23E3CE +:10185000394608A8FFF7A4FD06463BE20228B6D1A8 +:10186000204600F042FE042804D3204600F03DFE4E +:10187000082809D3204600F038FE0E2829D3204638 +:1018800000F033FE122824D2A07D02289FD10E2022 +:101890008DF82000686A0D9098F801008DF82400FA +:1018A000F0E3022893D1204600F01FFE002810D05C +:1018B000204600F01AFE0128F9D0204600F015FE5F +:1018C0000C28F4D004208DF8240098F801008DF83D +:1018D00025005EE21128FCD1002CFAD020781728D0 +:1018E000F7D16178606A022911D0002101EB410132 +:1018F000182606EBC1011022405808F1010113F02F +:1019000029F90420696A00F0E3FD2670F1E5012160 +:10191000ECE70B28DDD1002CDBD020781828D8D1BB +:101920006078616A02281CD05FF0000000EB400282 +:10193000102000EBC2000958B8F801000880607858 +:10194000616A02280FD0002000EB4002142000EB57 +:10195000C2000958404650F8032F0A6040684860AA +:1019600039E00120E2E70120EEE71128B1D1002C97 +:10197000AFD020781928ACD16178606A022912D0E2 +:101980005FF0000101EB41011C2202EBC1011022BA +:10199000405808F1010113F0DDF80420696A00F0F5 +:1019A00097FD1A20B6E00121ECE7082891D1002C20 +:1019B0008FD020781A288CD1606A98F8012001789D +:1019C00062F347010170616AD8F8022041F8012FE3 +:1019D000B8F8060088800420696A00F079FD8EE27C +:1019E000072012E63878012894D1182204F1140057 +:1019F000796813F0F4F8E079C10894F82F0001EA4F +:101A0000D001E07861F30000E070217D002974D1FD +:101A10002178032909D0C00725D0032028708DF82C +:101A20002090686A0D90412004E3607DA17888428F +:101A300001D90620E9E502262671E179204621F048 +:101A4000E001E171617A21F0F0016172A17A21F087 +:101A5000F001A172FFF7C8FC2E708DF82090686A23 +:101A60000D900720E6E20420ACE6387805289DD1E9 +:101A70008DF82000686A0D90B8680A900720ADF8CC +:101A800024000A988DF830B0616801602189818056 +:101A9000A17A817104202070F4E23978052985D17A +:101AA0008DF82010696A0D91391D09AE0EC986E8BE +:101AB0000E004121ADF824108DF830B01070A88CC4 +:101AC000D7F80C8080B24026A769FFF711FA41468B +:101AD0003A463346C846CDF80090FEF71EFE002178 +:101AE00008A8FFF75DFCE07820F03E00801CE07065 +:101AF0002078052802D00F200CE049E1A07D20B11C +:101B0000012802D0032802D002E10720BFE584F8B3 +:101B10000080EEE42070ECE4102104F15C0002F09F +:101B20002AFA606BB0BBA07D18B1012801D0052056 +:101B3000FDE006202870F7486063A063BEE23878B5 +:101B4000022894D1387908B12875B3E3A07D022822 +:101B500002D0032805D022E0B8680028F5D06063E1 +:101B60001CE06078012806D0A07994F82E10012896 +:101B700005D0E84806E0A17994F82E00F7E7B868A8 +:101B80000028E2D06063E078C00701D0012902D0CC +:101B9000E04803E003E0F8680028D6D0A063062000 +:101BA00010E68DF82090696A0D91E1784846C907E2 +:101BB00009D06178022903D1A17D29B1012903D07F +:101BC000A17D032900D00720287031E1387805284D +:101BD000BBD1207807281ED084F800A005208DF8FE +:101BE0002000686A0D90B8680A90ADF824A08DF8BE +:101BF00030B003210170E178CA070FD0A27D022A1C +:101C00001AD000210091D4E9061204F15C03401CB3 +:101C1000FFF725FA67E384F80090DFE7D4E90923AA +:101C2000211D8DE80E0004F12C0304F15C02401C20 +:101C3000616BFFF722FB56E3626BC1F34401491E5F +:101C40001268CA4002F0010141F08001DAE73878F9 +:101C50000528BDD18DF82000686A0D90B8680A90FB +:101C6000ADF824A08DF830B0042100F8011B10223B +:101C700004F15C0112F06EFF002108A8FFF790FB51 +:101C80002078092801D0132044E70A2020709BE522 +:101C9000E078C10742D0A17D012902D0022927D0D6 +:101CA00038E0617808A8012916D004F16C01009190 +:101CB000D4E9061204F15C03001DFFF7BBFA0A2009 +:101CC000287003268DF82080686A0D90002108A8EE +:101CD000FFF766FBDDE2C3E204F15C010091D4E9A9 +:101CE000062104F16C03001DFFF7A4FA0026E9E7C2 +:101CF000C0F3440114290DD24FF0006101EBB01084 +:101D00004FEAB060E0706078012801D01020BEE496 +:101D10000620FFE6607801283FF4B7AC0A2051E5C1 +:101D2000E178C90708D0A17D012903D10B202870D3 +:101D300004202FE028702DE00E2028706078616B61 +:101D4000012817D004F15C0304F16C020EA8FFF720 +:101D5000E1FA2046FFF748FBA0780EAEC0F1100173 +:101D6000304412F076FF06208DF82000686A09964C +:101D70000D909AE004F16C0304F15C020EA8FFF7E9 +:101D8000C9FAE9E73978022903D139790029D1D094 +:101D900029758FE28DF82000686A0D9058E5387833 +:101DA0000728F6D1D4E909216078012808D004F188 +:101DB0006C00CDE90002029105D104F16C0304E04E +:101DC00004F15C00F5E704F15C0304F14C007A686F +:101DD0000646216AFFF764F96078012821D1A078CE +:101DE000216A0A18C0F11001104612F032FFD4E93E +:101DF0000923606B04F12D018DE80F0004F15C03F1 +:101E000004F16C0231460EA800E055E2FFF7CAF972 +:101E100010220EA904F13C0012F070FE08B10B2054 +:101E2000AFE485F8008000BF8DF82090686A0D90BF +:101E30008DF824A00CE538780528AAD18DF820006B +:101E4000686A0D90B8680A90ADF824A08DF830B09B +:101E500080F80080617801291AD0D4E9093204F1B0 +:101E60002D01A66B03920096CDE9011304F16C03DA +:101E700004F15C0204F14C01401CFFF793F90021CE +:101E800008A8FFF78DFA6078012805D0152041E6F3 +:101E9000D4E90923611DE4E70E20287006208DF89F +:101EA0002000686ACDF824B00D90A0788DF8280045 +:101EB000CEE438780328C0D1E079C00770D00F2075 +:101EC0002870072066E7387804286BD11422391D62 +:101ED00004F1140012F083FE616A208CA1F809005D +:101EE000616AA078C871E179626A01F00301117238 +:101EF000616A627A0A73616AA07A81F82400162006 +:101F000060E485F800A08DF82090696A50460D9134 +:101F100090E00000485102003878052842D1B868A6 +:101F2000A8616178606A022901D0012100E00021E6 +:101F300001EB4101142606EBC1014058082102F0D3 +:101F40001AF86178606A022901D0012100E00021BD +:101F500001EB410106EBC101425802A8E169FFF71C +:101F60000DFA6078626A022801D0012000E00020AA +:101F700000EB4001102000EBC1000223105802A921 +:101F80000932FEF7F1FF626AFD4B0EA80932A16922 +:101F9000FFF7E3F96178606A022904D0012103E0C8 +:101FA00042E18BE0BDE0002101EB4101182606EB88 +:101FB000C101A27840580EA912F0CCFD6178606A88 +:101FC000022901D0012100E0002101EB410106EBD3 +:101FD000C1014058A1780844C1F1100112F039FE46 +:101FE00005208DF82000686A0D90A8690A90ADF868 +:101FF00024A08DF830B0062101706278616A022A4F +:1020000001D0012200E0002202EB420206EBC202F4 +:10201000401C8958102212F09DFD002108A8FFF7EE +:10202000BFF91220C5F818B028708DF82090686AA2 +:102030000D900B208DF824000AE43878052870D123 +:102040008DF82000686A0D90B8680A900B20ADF8F2 +:1020500024000A98072101706178626A022901D080 +:10206000012100E0002101EB4103102101EBC3013C +:1020700051580988A0F801106178626A022902D0DB +:10208000012101E02FE1002101EB4103142101EBCB +:10209000C30151580A6840F8032F4968416059E06C +:1020A0001920287001208DF8300077E6162028705E +:1020B0008DF830B0002108A8FFF772F9032617E168 +:1020C00014202870B0E6387805282AD18DF8200031 +:1020D000686A0D90B8680A90ADF824A08DF830B009 +:1020E00080F800906278616A4E46022A01D001228F +:1020F00000E0002202EB42021C2303EBC202401C60 +:102100008958102212F026FD002108A8FFF748F98F +:10211000152028708DF82060686A0D908DF8246075 +:102120003CE680E0387805287DD18DF82000686A8B +:102130000D90B8680A90ADF824900921017061698A +:10214000097849084170616951F8012FC0F80220EF +:102150008988C18020781C28A8D1A1E7E078C00731 +:1021600002D04FF0060C01E04FF0070C6078022817 +:102170000AD04FF0000000BF00EB040101F109019B +:1021800005D04FF0010004E04FF00100F4E74FF0FC +:1021900000000B78204413EA0C030B7010F8092F91 +:1021A00002EA0C02027004D14FF01B0C84F800C04C +:1021B000D2B394F801C0BCF1010F00D09BB990F8E4 +:1021C00000C0E0465FEACC7C04D028F0010606702F +:1021D000102606E05FEA887C05D528F00206067026 +:1021E00013262E70032694F801C0BCF1020F00D014 +:1021F00092B991F800C05FEACC7804D02CF00106C7 +:102200000E70172106E05FEA8C7805D52CF00206E7 +:102210000E701921217000260078D0BBCAB3C3BB51 +:102220001C20207035E012E002E03878062841D109 +:102230001A2019E4207801283CD00C283AD02046F6 +:10224000FFF7F0F809208DF82000686A0D9031E062 +:102250003878052805D00620387003261820287005 +:1022600046E005218DF82010686A0D90B8680A9044 +:102270000220ADF8240001208DF830000A9801708A +:10228000297D4170394608A8FFF78AF806461820CC +:102290002870012E0ED02BE001208DF82000686AF6 +:1022A0000D9003208DF82400287D8DF8250085F8F9 +:1022B00014B012E0287D80B11D20207017202870F6 +:1022C0008DF82090686A0D9002208DF82400394620 +:1022D00008A8FFF765F806460AE00CB1FE2020705A +:1022E0009DF8200020B1002108A8FFF759F810E45C +:1022F00013B03046BDE8F08F2DE9F04387B00C46AF +:102300004E6900218DF8041001202578034602272C +:102310004FF007094FF0050C85B1012D53D0022D68 +:1023200039D1FE2030708DF80030606A05900320AE +:102330008DF80400207E8DF8050063E021790129E5 +:1023400025D002292DD0032928D0042923D1B17DFD +:10235000022920D131780D1F042D04D30A3D032D0D +:1023600001D31D2917D12189022914D38DF80470B6 +:10237000237020899DF8041088421BD2082001E0B8 +:10238000405102008DF80000606A059057E07078B7 +:102390000128EBD0052007B0BDE8F0831D20307088 +:1023A000E4E771780229F5D131780C29F3D18DF861 +:1023B0000490DDE7083402F804CB94E80B0082E8CF +:1023C0000B000320E7E71578052DE4D18DF800C058 +:1023D000656A0595956802958DF8101094F804804B +:1023E000B8F1010F13D0B8F1020F2DD0B8F1030FDF +:1023F0001CD0B8F1040FCED1ADF804700E202870B7 +:10240000207E687000216846FEF7CAFF0CE0ADF838 +:1024100004700B202870207E002100F01F006870DF +:102420006846FEF7BDFF37700020B4E7ADF80470D2 +:102430008DF8103085F800C0207E68702770114636 +:102440006846FEF7ADFFA6E7ADF804902B70207F3D +:102450006870607F00F00100A870A07F00F01F008E +:10246000E870E27F2A71C0071CD094F8200000F0C9 +:102470000700687194F8210000F00700A87100219E +:102480006846FEF78DFF2868F062A8883086A87934 +:1024900086F83200A069407870752879B0700D20F8 +:1024A0003070C1E7A9716971E9E700B587B0042808 +:1024B0000CD101208DF800008DF80400002005915A +:1024C0008DF8050001466846FEF76AFF07B000BDBB +:1024D00070B50C46054602F027F821462846BDE8AF +:1024E00070407823002201F075BF08B10078704772 +:1024F0000C20704770B50C0005784FF000010CD02F +:1025000021702146F2F7A9FE69482178405D884292 +:1025100001D1032070BD022070BDF2F79EFE0020A5 +:1025200070BD0279012A05D000220A704B78012B78 +:1025300002D003E0042070470A758A610279930093 +:10254000521C0271C15003207047F0B587B00F468E +:1025500005460124287905EB800050F8046C70785A +:10256000411E02290AD252493A46083901EB80003D +:10257000314650F8043C2846984704460CB1012CDB +:1025800011D12879401E10F0FF00287101D00324DA +:10259000E0E70A208DF80000706A0590002101969E +:1025A0006846FFF7A7FF032CD4D007B02046F0BD44 +:1025B00070B515460A46044629461046FFF7C5FF82 +:1025C000064674B12078FE280BD1207C30B1002063 +:1025D0002870294604F10C00FFF7B7FF2046FEF7EC +:1025E00021FF304670BD704770B50E4604467C2111 +:1025F00012F051FB0225012E03D0022E04D005203B +:1026000070BD0120607000E065702046FEF70AFF93 +:10261000A575002070BD28B1027C1AB10A4600F1F0 +:102620000C01C5E70120704710B5044686B00420B0 +:1026300001F07AFF2078FE2806D000208DF80000F7 +:1026400069462046FFF7E7FF06B010BD7CB50E4691 +:1026500000218DF804104178012903D0022903D00C +:10266000002405E0046900E044690CB1217C89B1D3 +:102670006D4601462846FFF754FF032809D132462C +:1026800029462046FFF794FF9DF80410002900D04A +:1026900004207CBD04F10C05EBE730B40C46014688 +:1026A000034A204630BC034B0C3AFEF756BE0000EE +:1026B000845102004051020070B50D46040011D053 +:1026C00085B12101284612F0C4FA10224E4928464D +:1026D00012F040FA4C4801210838018044804560DE +:1026E000002070BD012070BD70B5474E0024054626 +:1026F000083E10E07068AA7B00EB0410817B9142D9 +:1027000008D1C17BEA7B914204D10C22294612F008 +:10271000F5F930B1641C30888442EBDB4FF0FF30B8 +:1027200070BD204670BD70B50D46060006D02DB1B7 +:10273000FFF7DAFF002803DB401C14E0102070BD17 +:10274000314C083C20886288411C914201D9042008 +:1027500070BD6168102201EB0010314612F0FAF9E9 +:102760002088401C20802870002070BD70B5144661 +:102770000D0018D0BCB10021A170022802D0102891 +:1027800011D105E0288870B10121A170108008E006 +:102790002846FFF7A9FF002805DB401CA070A88988 +:1027A0002080002070BD012070BD70B50546144624 +:1027B0000E000BD000203070A878012808D005D971 +:1027C0001149A1F108010A8890420AD9012070BD7F +:1027D00024B1287820702888000A507002200870E0 +:1027E0000FE064B14968102201EB00112046103956 +:1027F00012F0B0F9287820732888000A607310203E +:102800003070002070BD00007C0000202DE9F041F8 +:1028100090460C4607460025FE48072F00EB881619 +:1028200007D2DFE807F007070707040404000125C3 +:1028300000E0FFDF06F81470002D13D0F54880305B +:1028400000EB880191F82700202803D006EB400018 +:10285000447001E081F8264006EB440220205070CD +:1028600081F82740BDE8F081F0B51F4614460E46BA +:102870000546202A00D1FFDFE649E648803100EB1B +:10288000871C0CEB440001EB8702202E07D00CEBD9 +:10289000460140784B784870184620210AE092F8AB +:1028A0002530407882F82500F6E701460CEB410020 +:1028B00005704078A142F8D192F82740202C03D02F +:1028C0000CEB4404637001E082F826300CEB410409 +:1028D0002023637082F82710F0BD30B50D46CE4B33 +:1028E00044190022181A72EB020100D2FFDFCB4814 +:1028F000854200DDFFDFC9484042854200DAFFDF44 +:10290000C548401C844207DA002C01DB204630BD5C +:10291000C148401C201830BDBF48C043FAE710B57D +:1029200004460168407ABE4A52F82020114450B152 +:102930000220084420F07F40F0F71DF994F90810B8 +:10294000BDE81040C9E70420F3E72DE9F047B14E98 +:10295000803696F82D50DFF8BC9206EB850090F893 +:10296000264034E009EB85174FF0070817F81400EC +:10297000012806D004282ED005282ED0062800D005 +:10298000FFDF01F0E3F8014607EB4400427806EB75 +:10299000850080F8262090F82720A24202D120222C +:1029A00080F82720084601F0DCF82A46214601205D +:1029B000FFF72CFF9B48414600EB041002682046BD +:1029C000904796F82D5006EB850090F82640202C75 +:1029D000C8D1BDE8F087022000E003208046D0E7A0 +:1029E00010B58C4C2021803484F8251084F82610F2 +:1029F00084F82710002084F8280084F82D0084F83B +:102A00002E10411EA16044F8100B207460742073D6 +:102A10006073A0738449E0772075087048700021C6 +:102A20007C4A103C02F81100491CC9B22029F9D394 +:102A30000120EFF78EFF0020EFF78BFF012084F8D5 +:102A40002200F9F7A9F97948F9F7B5F9764CA41EEF +:102A500020707748F9F7AFF96070BDE81040EFF7E4 +:102A600005BF10B5EFF727FF6F4CA41E2078F9F7CC +:102A7000BBF96078F9F7B8F9BDE8104001F09EB8ED +:102A8000202070472DE9F34F624E0025803606EB7B +:102A9000810A89B09AF82500202822D0691E029167 +:102AA0006049009501EB00108146D0E90112C06831 +:102AB0000391CDE90420B08BADF81C00B07F8DF8F8 +:102AC0001E009DF81500C8B10227554951F8204055 +:102AD0000399E219114421F07F41019184B102214F +:102AE0000FE00120EFF735FF0020EFF732FFEFF79F +:102AF00000FF01F063F886F82F50A0E00427E4E718 +:102B000000218DF81810022801D0012820D1039847 +:102B1000391901440998081A9DF81C1020F07F40CB +:102B200001B10221333181420BD203208DF815000F +:102B30000398C4F13201401A20F07F403224039000 +:102B40000CE096F8240018B9F0F726FA00284CD0CB +:102B5000322C03D214B101F025F801E001F02EF877 +:102B6000314A107818B393465278039B121B002108 +:102B70009DF81840984601281AD0032818D0002044 +:102B80008DF81E00002A04DD981A039001208DF8AC +:102B900018009DF81C0000B102210398254A20F07E +:102BA0007F40039003AB099801F014F810B110E0D6 +:102BB0000120E5E79DF81D0018B99BF800000328E7 +:102BC00012D08DF81C50CDF80C808DF818408DF87F +:102BD0001E509DF8180058B103980123C119002216 +:102BE0001846EFF709FF06E000200BB0BDE8F08FB4 +:102BF0000120EFF7AEFE99F90C2001230020019986 +:102C0000EFF7FAFE012086F82F008AF828502022DC +:102C1000694611E098080020FF7F841E0020A1076C +:102C200094510200980600208E000020834201008B +:102C30004B290100FFFF3F00F94811F0D0FF0120B0 +:102C4000D3E72DE9F05FDFF8D883064608EB86006E +:102C500090F82550202D1FD0A8F180002C4600EBC5 +:102C60008617A0F50079DFF8BCB305E0A24607EBB4 +:102C70004A004478202C0AD0EFF70AFF09EB04132E +:102C80005A4601211B1D00F0A5FF0028EED0AC42E2 +:102C900002D0334652461EE0E34808B1AFF300804D +:102CA000EFF7F6FE98F82F206AB1D8F80C20411CF7 +:102CB000891A0902CA1701EB12610912002902DD03 +:102CC0000020BDE8F09F3146FFF7DCFE08B101208F +:102CD000F7E733462A4620210420FFF7C5FDEFE73A +:102CE0002DE9F041CE4C2569EFF7D2FE401B0002E2 +:102CF000C11700EB1160001200D4FFDF94F822002E +:102D000000B1FFDF012784F8227094F82E002028FC +:102D100000D1FFDF94F82E60202084F82E000025DB +:102D200084F82F5084F8205084F82150BF48256043 +:102D30000078022833D0032831D000202077A06803 +:102D4000401C05D04FF0FF30A0600120EFF701FEDE +:102D50000020EFF7FEFDEFF7FCFEEFF7F4FEEFF7D4 +:102D6000C8FD11F031F9B248056005604FF0E0216F +:102D70004FF40040B846C1F88002EFF784FF94F8A2 +:102D80002D703846FFF75DFF0028FAD0A448803840 +:102D900000EB871010F81600022802D006E0012090 +:102DA000CCE73A4631460620FFF730FD84F8238011 +:102DB00004EB870090F82600202804D09B48801E52 +:102DC0004078F9F717F8207F002803D0EFF7B1FE1D +:102DD0002577657746E50146914810B590F82D2096 +:102DE0000024803800EB821010F814302BB1641CE2 +:102DF000E4B2202CF8D3202010BD8E4800EB041044 +:102E0000016021460120FFF701FD204610BD10B5ED +:102E1000012801D0032800D171B3814A92F82D30E6 +:102E20007F4C0022803C04EB831300BF13F8124058 +:102E30000CB1082010BD521CD2B2202AF6D37B4A16 +:102E400048B1022807D0072916D2DFE801F015069D +:102E5000080A0C0E100000210AE01B2108E03A21AC +:102E600006E0582104E0772102E0962100E0B52138 +:102E700051701070002010BD072010BD6B4810B5B8 +:102E80004078EFF778FE80B210BD10B5202811D23F +:102E9000634991F82D30A1F1800202EB831414F8FC +:102EA00010303BB191F82D3002EB831212F8102054 +:102EB000012A01D0002010BD91F82D2001460020EC +:102EC000FFF7A4FC012010BD10B5EFF7E1FDBDE850 +:102ED0001040EFF750BE2DE9F0410E46504F0178FB +:102EE0002025803F0C4607EB831303E0254603EBC8 +:102EF00045046478944202D0202CF7D108E0202CBD +:102F000006D0A14206D103EB41014978017007E0E8 +:102F10000020A7E403EB440003EB45014078487030 +:102F2000454F7EB127B1002140F2DA30AFF3008087 +:102F30003078A04206D127B1002140F2DD30AFF356 +:102F40000080357027B1002140F2E230AFF30080FD +:102F5000012087E410B542680B689A1A1202D41750 +:102F600002EB1462121216D4497A91B1427A82B9F4 +:102F7000324A006852F82110126819441044001DAA +:102F8000891C081A0002C11700EB116000123228D8 +:102F900001DB012010BD002010BD2DE9F047814666 +:102FA0001F48244E00EB8100984690F825402020D1 +:102FB000107006F50070154600EB81170BE000BF9E +:102FC00006EB04104946001DFFF7C4FF28B107EBCC +:102FD00044002C704478202CF2D1297888F8001015 +:102FE00013E000BF06EB0415291D4846FFF7B2FFAA +:102FF00068B988F80040A97B99F80A00814201D895 +:103000000020E6E407EB44004478202CEAD10120BC +:10301000DFE42DE9FC410E4607460024054D18E08B +:1030200018090020FFFF3F00000000008E00002074 +:1030300000F50040980600200000000094510200B6 +:103040009DF8000005EB00108168384600F0D6FDC1 +:1030500001246B4601AA31463846FFF79EFF00283F +:10306000EED02046BDE8FC8170B50446FF4801253E +:10307000A54300EB841100EB8510402211F06AFD9E +:10308000FB4E26B1002140F25C40AFF30080F748D0 +:10309000803000EB850100EB8400D0F82500C1F8FA +:1030A000250026B100214FF48C60AFF30080284644 +:1030B00070BD2DE9FC418446EC481546089C00EBA8 +:1030C00085170E4617F81400012803D0022801D0F6 +:1030D0000020C7E70B46E74A0121604600F07AFD71 +:1030E000A8B101AB6A4629463046FFF756FF70B1DA +:1030F000DE489DF804209DF80010803000EB850626 +:103100008A4208D02B460520FFF7AEFB0BE02A468B +:103110002146042014E0202903D007EB4100407829 +:1031200001E096F8250007EB440148709DF8000087 +:10313000202809D007EB400044702A46214603208E +:10314000FFF764FB01208DE706F8254F0120F070A2 +:10315000F3E7C94901EB0010001DFFF7E0BB7CB5A8 +:103160001D46134604460E4600F108022146184645 +:10317000EFF70EFD94F908000F2804DD1F382072C8 +:103180002068401C206096B10220BC4951F82610EE +:10319000461820686946801B20F07F40206094F923 +:1031A00008002844C01C1F2803DA012009E004207D +:1031B000EBE701AAEFF7ECFC9DF8040010B10098D2 +:1031C000401C00900099206831440844C01C20F045 +:1031D0007F4060607CBD2DE9FE430C4606460978C1 +:1031E00060799072207998461546507241B19F4897 +:1031F000803090F82E1020290AD00069401D0BE085 +:10320000D4E90223217903B02846BDE8F043A6E7BC +:103210009B484178701D084420F07F4721790022A7 +:103220002846A368FFF79BFF3946284600F0E6FCD6 +:10323000D4E9023221796846FFF791FF41462846DA +:10324000019CFFF7E6FE2B4622460021304600F0A7 +:10325000C1FC002803D13146284600F0CFFCBDE870 +:10326000FE832DE9FE4F814600F084FC30B100273B +:1032700099F8000020B10020BDE8FE8F0127F7E794 +:103280007A4D7B4C4FF0000A803524B1002140F28A +:10329000D340AFF3008095F82D8085F823A0002659 +:1032A00024B100214FF49B60AFF300801FB940466A +:1032B000FFF7DAFE804624B100214FF49C60AFF3A3 +:1032C0000080EFF7E5FB43466A464946FFF783FF78 +:1032D00024B1002140F2E640AFF3008095F82E00C3 +:1032E00020280CD029690098401A0002C21700EB70 +:1032F0001260001203D5684600F080FC012624B15C +:1033000000214FF49E60AFF3008095F82300002861 +:10331000BBD124B1002140F2F640AFF30080EFF7BB +:10332000B7FB6B46534A002100F054FC0028A3D0A1 +:1033300027B941466846FFF76CFE064326B168464A +:10334000FFF7EDFAC9F8080024B1002140F2095056 +:10335000AFF3008001208FE72DE9FF5F8A468146A9 +:1033600000F008FC414C803410B39AF800000027AC +:1033700010B1012800D0FFDF3D4D25B1002140F202 +:103380007F50AFF300800120A84600905FEA080656 +:1033900004D0002140F28750AFF30080009800F085 +:1033A000E0FB94F82D50002084F8230067B119E069 +:1033B00094F82E000127202800D1FFDF9AF80000A2 +:1033C0000028D9D0FFDFD7E72846FFF74DFE054696 +:1033D00026B1002140F29150AFF3008094F8230011 +:1033E0000028D3D126B1002140F29B50AFF30080DA +:1033F000EFF74EFB83462B4601AA5146FFF7EBFE43 +:103400005FEA060804D0002140F2A250AFF300802A +:103410003B462A4601A95846CDF80090FFF749FEE1 +:10342000064604EB850090F828B0B8F1000F04D0F0 +:10343000002140F2A950AFF3008000F087FB00901C +:10344000B8F1000F04D0002140F2AF50AFF300807C +:1034500094F82300002899D1B8F1000F04D000217E +:1034600040F2B750AFF3008003490BE0980800200A +:1034700000000000FFFF3F0098060020945102006A +:103480008E00002001EB09100DF1040C00F1040086 +:103490009CE80E0080E80E004EB35FEA080604D0F8 +:1034A000002140F2C450AFF300803BEA070012D085 +:1034B00094F82E0020280ED126B1002140F2C950E8 +:1034C000AFF300802846FFF7BCFB20B99AF8000054 +:1034D000D8B3012849D0B8F1000F04D0002140F240 +:1034E000E650AFF30080284600F029FB01265FEA92 +:1034F000080504D0002140F2EF50AFF3008000989F +:1035000000F02FFB25B1002140F2F350AFF3008013 +:103510008EB194F82D0004EB800090F8260020284E +:1035200009D025B1002140F2FA50AFF30080F948EC +:103530004078F8F75FFC25B1002140F2FF50AFF36F +:10354000008004B03046BDE8F09FFFE7B8F1000FFF +:1035500004D0002140F2D150AFF3008094F82D2028 +:1035600049460420FFF752F9C0E7002E3FF40EAFA2 +:10357000002140F2DC50AFF3008007E72DE9F84F5F +:10358000E54D814695F82D004FF00008E34C4FF0D3 +:10359000010B474624B1002140F20D60AFF30080DB +:1035A000584600F0DEFA85F8237024B1002140F27D +:1035B0001260AFF3008095F82D00FFF755FD064629 +:1035C00095F8230028B1002CE4D000214FF4C3600B +:1035D0004BE024B1002140F21C60AFF30080CE48E4 +:1035E000803800EB861111F81900032856D13346B4 +:1035F00005EB830A4A469AF82500904201D1012042 +:1036000000E0002000900AF125000021FFF763FC94 +:1036100001460098014203D001228AF82820AF77A2 +:10362000E1B324B1002140F22160AFF300803246C3 +:1036300049460120FFF7EAF89AF828A024B10021B2 +:1036400040F22C60AFF3008000F080FA834624B192 +:10365000002140F23160AFF3008095F8230038B1CB +:10366000002C97D0002140F23560AFF3008091E745 +:10367000BAF1000F07D095F82E00202803D130466C +:10368000FFF7DFFAE0B124B1002140F24960AFF367 +:103690000080304600F053FA4FF0010824B10021B9 +:1036A00040F25260AFF30080584600F05AFA24B15D +:1036B000002140F25660AFF300804046BDE8F88F2D +:1036C000002CF1D0002140F24460AFF30080E6E727 +:1036D0000020EFF717B90120EFF714B98D480078F3 +:1036E00070472DE9F0418C4C94F82E0020281FD112 +:1036F00094F82D6004EB860797F82550202D00D113 +:10370000FFDF8549803901EB861000EB45004078EA +:1037100007F8250F0120F87084F82300294684F863 +:103720002E50324602202234FFF770F8002020701D +:103730000FE42DE9F0417A4E774C012538B101288C +:1037400021D0022879D003287DD0FFDFF0E700F0F8 +:1037500029FAFFF7C6FF207E00B1FFDF84F8215071 +:103760000020EFF7F6F8A168481C04D001230022DE +:103770001846EFF741F914F82E0F217806EB0111E6 +:103780000A68012154E0FFF7ACFF0120EFF7E1F8F0 +:1037900094F8210050B1A068401C07D014F82E0FF7 +:1037A000217806EB01110A68062141E0207EDFF84E +:1037B0006481002708F10208012803D002281ED0E6 +:1037C000FFDFB5E7A777EFF7B4F998F80000032813 +:1037D00001D165772577607D524951F8200094F832 +:1037E000201051B948B161680123091A0022184616 +:1037F000EFF702F9022020769AE7277698E784F817 +:10380000205000F0CFF9A07F50B198F80100616816 +:103810000123091A00221846EFF7EEF8257600E09A +:10382000277614F82E0F217806EB01110A68002183 +:10383000BDE8F041104700E005E036480078BDE8FB +:10384000F041F8F7D7BAFFF74CFF14F82E0F2178A4 +:1038500006EB01110A680521EAE710B52E4C94F831 +:103860002E00202800D1FFDF14F82E0F21782C4ADB +:1038700002EB01110A68BDE81040042110477CB535 +:10388000254C054694F82E00202800D1FFDFA068C3 +:10389000401C00D0FFDF94F82E00214901AA01EB63 +:1038A0000010694690F90C002844EFF771F99DF972 +:1038B00004000F2801DD012000E0002000990844E9 +:1038C0006168084420F07F41A16094F8210000283D +:1038D00007D002B00123BDE8704000221846EFF780 +:1038E0008BB87CBD30B5104A0B1A541CB3EB940F47 +:1038F0001ED3451AB5EB940F1AD3934203D9101A6D +:1039000043185B1C14E0954210D9511A0844401C1E +:1039100043420DE08C000020180900200000000048 +:103920009806002094510200FF7F841EFFDF0023D1 +:10393000184630BD0123002201460220EFF75CB893 +:103940000220EFF706B8EFF7A3B82DE9FC47B14C1A +:10395000054694F82E00202800D1FFDF642D58D3AF +:10396000AD4A0021521B71EB010052D394F82E2076 +:10397000A0462046DFF8A49290F82D7009EB0214BF +:10398000D8F8000001AA28446946EFF701F99DF92B +:103990000400002802DD0098401C0090A0680099F7 +:1039A00062684618B21A22F07F42B2F5800F30D218 +:1039B00008EB8702444692F82520202A0AD009EB1A +:1039C00002125268101A0002C21700EB12600012B5 +:1039D00088421EDBA068401C10D0EFF759F8A168A0 +:1039E000081A0002C11700EB11600012022810DD56 +:1039F0000120EEF7AEFF4FF0FF30A06020682844B2 +:103A0000206026F07F402061012084F82300BDE87B +:103A1000FC870020FBE72DE9F0477E4C074694F831 +:103A20002D00A4F1800606EB801010F8170000B9F5 +:103A3000FFDF94F82D50A046794C24B1002140F6C8 +:103A40006500AFF3008040F6710940F67A0A06EB94 +:103A5000851600BF16F81700012818D0042810D0CA +:103A600005280ED006280CD01CB100214846AFF323 +:103A7000008020BF002CEDD000215046AFF3008025 +:103A8000E8E72A4639460120FEF7C0FEF2E74FF08C +:103A9000010A4FF00009454624B1002140F681009B +:103AA000AFF30080504600F05CF885F8239024B115 +:103AB000002140F68600AFF3008095F82D00FFF757 +:103AC000D3FA064695F8230028B1002CE4D0002153 +:103AD00040F68C001FE024B100214FF40960AFF3E1 +:103AE000008005EB860000F1270133463A46263078 +:103AF000FFF7F1F924B1002140F69400AFF3008004 +:103B000000F024F8824695F8230038B1002CC3D089 +:103B1000002140F69A00AFF30080BDE785F82D60E4 +:103B2000012085F82300504600F01BF8002C04D03B +:103B3000002140F6A700AFF30080BDE8F0873549CB +:103B400081F82D00012081F82300704710B5354819 +:103B500008B1AFF30080EFF3108000F0010072B6FF +:103B600010BD10B5002804D12F4808B1AFF3008074 +:103B700062B610BD2D480068C005C00D10D01038C9 +:103B800040B2002806DA00F00F0000F1E02090F8C3 +:103B9000140D03E000F1E02090F8000440097047A4 +:103BA0000820704710B51B4C94F82400002804D15D +:103BB000F7F7D2FE012084F8240010BD10B5154C93 +:103BC00094F82400002804D0F7F7EFFE002084F8D2 +:103BD000240010BD10B51C685B68241A181A24F064 +:103BE0007F4420F07F40A14206D8B4F5800F03D275 +:103BF000904201D8012010BD002010BDD0E9003254 +:103C0000D21A21F07F43114421F07F41C0E90031F5 +:103C10007047000018090020FF1FA1079806002028 +:103C200000000000000000000000000004ED00E0C3 +:103C30002DE9F041044680074FF000054FF00106E2 +:103C400004D55C480560066024F00204E0044FF0EF +:103C5000FF3705D558484660C0F8087324F48054EF +:103C6000600003D55548056024F08044E0050FD579 +:103C70005348C0F80052C0F8087352490D60091D3E +:103C80000D60504A04210C321160066124F48074E6 +:103C9000A00409D54C484660C0F80052C0F808732B +:103CA0004A48056024F40054C4F38030C4F3C031A2 +:103CB000884200D0FFDF14F4404F14D044484660DF +:103CC000C0F8087343488660C0F80052C0F8087313 +:103CD00041490D600A1D16608660C0F808730D60CA +:103CE000166024F4404420050AD53C4846608660AE +:103CF000C0F80873C0F848733948056024F40064BC +:103D000010F03CF93748044200D0FFDFBDE8F081F5 +:103D100070B520250022134620FA02F1C90719D0F8 +:103D200051B201F01F060124B4404E09B60006F15D +:103D3000E026C6F88041C6F88042002906DA01F084 +:103D40000F0101F1E02181F8143D03E001F1E021D0 +:103D500081F80034521CAA42DED370BD70B5224CEB +:103D60000D462060FFF764FF2068FFF7D1FF28466B +:103D7000F7F7CFFE0FF022FD00F0ADF810F0FEF8DF +:103D800010F041F8F8F708F8BDE870400FF0C4BD36 +:103D900010B5154C2068FFF74BFF2068FFF7B8FF00 +:103DA00010F0ECF8F7F773FF0020206010BD0A2038 +:103DB00070470000FC1F004000C0004004E50140C7 +:103DC000008000400485004000D0004004D5004041 +:103DD00000E0004000F0004000F5004000B000406E +:103DE00008B50040FEFF0FFD9000002070B5264989 +:103DF0000A680AB30022154601244B685B1C4B601D +:103E00000C2B00D34D600E7904FA06F30E681E42A7 +:103E10000FD0EFF3108212F0010272B600D001222F +:103E20000C689C430C6002B962B6496801600020CE +:103E300070BD521C0C2AE0D3052070BD4FF0E0216C +:103E40004FF48000C1F800027047EFF3108111F0C9 +:103E5000010F72B64FF0010202FA00F20A4803683D +:103E600042EA0302026000D162B6E7E70648002199 +:103E700001604160704701218140034800680840AB +:103E800000D0012070470000940000202DE9F0418F +:103E900015460E460446002700F0E7F8A84215D361 +:103EA000002341200FE000BF94F84220A25CF254AE +:103EB00094F84210491CB1FBF0F200FB12115B1C9C +:103EC00084F84210DBB2AB42EED3012700F0D9F800 +:103ED0003846BDE8F081704910B5802081F80004B3 +:103EE0006E49002081F8420081F84100433181F899 +:103EF000420081F84100433181F8420081F84100DD +:103F000067480FF071FE6648401C0FF06DFEEEF73B +:103F1000C9FEBDE8104000F0B4B8402070475F48CB +:103F200000F0A3B80A4601465C48AFE7402070475E +:103F30005A48433000F099B80A4601465748433082 +:103F4000A4E7402101700020704710B50446534893 +:103F5000863000F08AF82070002010BD0A46014625 +:103F60004E4810B58630FFF791FF08B1002010BD14 +:103F700042F2070010BD70B50C460546412900D934 +:103F8000FFDF48480068103840B200F050F8C6B271 +:103F90000D2000F04CF8C0B2864203D2FFDF01E0F2 +:103FA000EEF7D0FE224629463C48FFF76FFF002877 +:103FB000F6D070BD2DE9F041394F002506463F1D72 +:103FC00057F82540204600F041F810B36D1CEDB2C3 +:103FD000032DF5D33148433000F038F8002825D0C0 +:103FE0002E4800F033F8002820D02C48863000F00E +:103FF0002DF800281AD0EEF77BFE29480FF0FCFDC3 +:10400000B0F5005F00D0FFDFBDE8F04124480FF0BD +:1040100009BE94F841004121265414F8410F401C78 +:10402000B0FBF1F201FB12002070D3E751E700284A +:1040300006DA00F00F0000F1E02090F8140D03E024 +:1040400000F1E02090F800044009704710F8411F8B +:104050004122491CB1FBF2F302FB1311407881426B +:1040600001D1012070470020704710F8411F4078AF +:10407000814201D3081A02E0C0F141000844C0B2F5 +:10408000704710B506480FF0B7FD002803D1BDE812 +:104090001040EEF718BE10BD0DE000E0480900200A +:1040A0009C00002004ED00E070B5154D2878401C00 +:1040B000C4B26878844202D0EEF7D5FE2C7070BD91 +:1040C0002DE9F0410E4C4FF0E02600BFEEF7C0FEA8 +:1040D00020BF40BF20BF677820786070D6F80052BC +:1040E000EDF71CF9854305D1D6F8040210B9207804 +:1040F000B842EBD0EEF7A7FE0020BDE8F08100004B +:10410000AC0000202DE9F041012528034FF0E0210B +:104110000026C1F880011E4CC4F800610C2000F09C +:104120002CF81C4801680268C94341F3001142F0B1 +:1041300010020260C4F804532560491C00E020BF4F +:10414000D4F80021002AFAD019B9016821F0100131 +:104150000160114807686560C4F80853C4F800613D +:104160000C2000F00AF83846BDE8F08110B504468E +:10417000FFF7C8FF2060002010BD00F01F020121E2 +:1041800091404009800000F1E020C0F880127047A3 +:1041900000C0004010ED00E008C500402DE9F047E8 +:1041A000FF4C0646FF21A06800EB06121170217833 +:1041B000FF2910D04FF0080909EB011109EB061790 +:1041C0004158C05900F0F4F9002807DDA1682078B3 +:1041D00001EB061108702670BDE8F08794F80080A6 +:1041E00045460DE0A06809EB05114158C05900F0A3 +:1041F000DFF9002806DCA068A84600EB0810057867 +:10420000FF2DEFD1A06800EB061100EB08100D7038 +:104210000670E1E7F0B5E24B0446002001259A68FC +:104220000C269B780CE000BF05EB0017D75DA7427A +:1042300004D106EB0017D7598F4204D0401CC0B2FE +:104240008342F1D8FF20F0BD70B5FFF77CFBD44C62 +:1042500008252278A16805EB0212895800F0A8F918 +:10426000012808DD2178A06805EB01114058BDE860 +:104270007040FFF75FBBFFF731FABDE87040F7F71A +:10428000B9BD2DE9F041C64C2578FFF75CFBFF2D49 +:104290006ED04FF00808A26808EB0516915900F09F +:1042A00087F90228A06801DD80595DE000EB051167 +:1042B00009782170022101EB0511425C5AB1521EAE +:1042C0004254815901F5800121F07F4181512846F6 +:1042D000FFF764FF34E00423012203EB051302EB34 +:1042E000051250F803C0875CBCF1000F10D0BCF57C +:1042F000007F10D9CCF3080250F806C00CEB423C0A +:104300002CF07F4C40F806C0C3589A1A520A09E0B4 +:10431000FF2181540AE0825902EB4C3222F07F42A5 +:104320008251002242542846FFF738FF0C21A06832 +:1043300001EB05114158E06850F8272038469047B6 +:104340002078FF2814D0FFF7FEFA2278A16808EB46 +:1043500002124546895800F02BF9012893DD217897 +:10436000A06805EB01114058BDE8F041FFF7E2BA43 +:10437000BDE8F081F0B51D4614460E460746FF2BFA +:1043800000D3FFDFA00700D0FFDF8548FF21002218 +:10439000C0E90247C5700671017042708270104614 +:1043A000012204E002EB0013401CE154C0B2A84219 +:1043B000F8D3F0BD70B57A4C064665782079854211 +:1043C00000D3FFDFE06840F825606078401C607033 +:1043D000284670BD2DE9FF5F1D468B460746FF242A +:1043E000FFF7B1FADFF8B891064699F80100B84234 +:1043F00000D8FFDF00214FF001084FF00C0A99F8B8 +:104400000220D9F808000EE008EB0113C35CFF2B73 +:104410000ED0BB4205D10AEB011350F803C0DC45B6 +:104420000CD0491CC9B28A42EED8FF2C02D00DE054 +:104430000C46F6E799F803108A4203D1FF2004B036 +:10444000BDE8F09F1446521C89F8022008EB0411C5 +:104450000AEB0412475440F802B00421029B0022E8 +:10446000012B01EB04110CD040F801204FF400782F +:1044700008234FF0020C454513D9E905C90D02D0B8 +:1044800002E04550F2E7414606EB413203EB0413EC +:1044900022F07F42C250691A0CEB0412490A81547F +:1044A0000BE005B9012506EB453103EB041321F0C0 +:1044B0007F41C1500CEB0411425499F80050204642 +:1044C000FFF76CFE99F80000A84201D0FFF7BCFE90 +:1044D0003846B4E770B50C460546FFF734FA064691 +:1044E00021462846FFF796FE0446FF281AD02C4D99 +:1044F000082101EB0411A8684158304600F058F833 +:1045000000F58050C11700EBD14040130221AA688A +:1045100001EB0411515C09B100EB4120002800DCE3 +:10452000012070BD002070BD2DE9F047884681460E +:10453000FFF770FE0746FF281BD0194D2E78A8689C +:104540003146344605E0BC4206D0264600EB061252 +:104550001478FF2CF7D10CE0FF2C0AD0A6420CD126 +:1045600000EB011000782870FF2804D0FFF76CFEE4 +:1045700003E0002030E6FFF7E3F941464846FFF745 +:10458000A9FF0123A968024603EB0413FF20C854C6 +:10459000A878401EB84200D1A87001EB041001E0D9 +:1045A000140A002001EB061100780870104613E68B +:1045B000081A0002C11700EB1160001270470000DA +:1045C00070B50446A0F500002D4EB0F1786F02D210 +:1045D0003444A4F500042B48844201D2012500E0B4 +:1045E000002500F043F848B125B9B44204D3264869 +:1045F000006808E0012070BD002070BD002DF9D1D9 +:10460000B442F9D321488442F6D2F3E710B5044608 +:10461000A0F50000B0F1786F03D219480444A4F566 +:10462000000400F023F84FF0804130B116480068D4 +:1046300004E08C4204D2012003E014488442F8D202 +:10464000002080F0010010BD10B520B1FFF7DEFFA3 +:1046500008B1012010BD002010BD10B520B1FFF73A +:10466000AFFF08B1012010BD002010BD0848094966 +:104670000068884201D10120704700207047000087 +:104680000000002000600200200000200800002040 +:10469000B0000020BEBAFECA0548064A0168914231 +:1046A00001D1002101600449012008607047000029 +:1046B000B0000020BEBAFECA40E5014053480021C8 +:1046C0000170417010218170704770B50546164623 +:1046D0000C460220EEF785F84C49012008704C4941 +:1046E000F01E08604B480560001F046070BD10B5E7 +:1046F0000220EEF776F8454901200870464800216F +:10470000C0F80011C0F80411C0F8081143494FF473 +:104710000000086010BD3D480178C9B1404A4FF41F +:10472000000111603C49D1F800310022002B1CBF70 +:10473000D1F80431002B02D0D1F8081111B1427028 +:10474000102103E00121417036490968817002702F +:104750000020EEF746B82D480178002904BF4078C4 +:1047600070472D48D0F80011002904BF022070477F +:10477000D0F8001100291CBFD0F80411002905D081 +:10478000D0F80801002804BF0120704700207047BE +:104790001E4800B50278204B4078C821491EC9B296 +:1047A00082B1D3F800C1BCF1000F10D0D3F80001E2 +:1047B00000281CBFD3F8040100280BD0D3F808014F +:1047C00050B107E0022802D0012805D002E00029FC +:1047D000E4D1FFDF002000BD012000BD0B480178BF +:1047E000002904BF807870470B48D0F800110029D9 +:1047F0001CBFD0F80411002902D0D0F8080108B17C +:104800001020704707480068C0B27047B40000200D +:1048100010F5004008F5004000F0004004F50140AC +:1048200008F5014000F40040524800210170417039 +:10483000704770B5064614460D460120EDF7D1FFCE +:104840004D480660001D0460001D05604B490020B6 +:10485000C1F850014A49032008604B4949480860A3 +:10486000091D4A48086070BD70B5424B012540EAF9 +:1048700002421D70464B42F080721A60454A116038 +:10488000454C0026C4F80461454A4449116000289B +:1048900002BFC4F80052256070BD012818BFFFDFB9 +:1048A000C4F80062256040493E48086070BD314848 +:1048B000017871B13A4A394911603749D1F8042178 +:1048C0000021002A08BF417002D0384A12684270A5 +:1048D00001700020EDF785BF26480178002904BF4C +:1048E000407870472C48D0F80401002808BF704772 +:1048F0002E480068C0B27047002808BF704730B526 +:104900001C480078002808BFFFDF2348D0F80411B6 +:10491000002918BF30BD0224C0F80443DFF890C05E +:10492000DCF80010C1F30015DCF8001041F01001B4 +:10493000CCF80010D0F80411002904BF4FF4004156 +:104940004FF0E02207D100BFC2F8801220BFD0F89C +:104950000431002BF8D02DB9DCF8001021F0100143 +:10496000CCF80010C0F8084330BD0B490120886026 +:1049700070470000B700002008F50040001000401C +:104980001CF500405011004098F501400CF000402B +:1049900004F5004018F5004000F00040000002035C +:1049A00008F501400000020204F5014000F4004057 +:1049B00010ED00E010B5FF480024012144700470A0 +:1049C00044728472C17280F821408462446314305E +:1049D00010F068FAF849601E0860091D0860091D9A +:1049E0000C60091D0860091D0C60091D0860091D87 +:1049F0000860091D0860091D0860091D0860091D7F +:104A00000860091D0860091D0860091D086010BDC7 +:104A1000EA48016801F00F01032904BF0120704733 +:104A2000016801F00F01042904BF022070470168EA +:104A300001F00F01052904D0006800F00F000628DE +:104A400007D1DF48006810F0060F0CBF08200420D3 +:104A5000704700B5FFDF012000BD30B4D5490268C2 +:104A6000DFF864C34A6142688A61007A08770A7D88 +:104A7000D44BACF1040401204AB10A7E00FA02F2E0 +:104A80001A608D7D002D0CBF2260CCF800204A7D7D +:104A9000002A04BF30BC70474A7E90401860C97D30 +:104AA00000290CBF2060CCF8000030BC704730B546 +:104AB0000024054601290AD0022908BF4FF080745E +:104AC00005D0042916BF08294FF0C744FFDF44F47E +:104AD000847040F48010BD49086045F44030091DE1 +:104AE00040F00070086030BD30B500240546012953 +:104AF0000AD0022908BF4FF0807405D0042916BFE0 +:104B000008294FF0C744FFDF44F4847040F480105C +:104B1000AE49086045F44030091D40F0007008605F +:104B2000AB48D0F80001002818BFFFDF30BD0221DC +:104B300010B44FF0E02301200022C3F88011DFF809 +:104B400094C2CCF80020CCF80000DFF88CC2DCF86E +:104B5000004024F07044CCF80040A04C40F25B6C64 +:104B6000C4F800C0241F40F2031CC4F800C0A4F124 +:104B7000040CCCF80000DFF844C20320CCF800009D +:104B8000DFF85CC29620CCF80000DFF85CC29548E4 +:104B9000CCF80000DFF858C29448CCF80000ACF123 +:104BA000040C9448CCF80000C3F880128849102007 +:104BB000C1F804037F4880F82D2010BC70477D4A5F +:104BC0000368C2F802308088D08011727047794B38 +:104BD00010B51A7A8A4208D101460622981C0FF0B5 +:104BE0008DFF002804BF012010BD002010BD7148BA +:104BF00090F8210070476F4A517010707047F0B5FF +:104C00000546800000F1804000F580508B88C0F898 +:104C100020360B78D1F8011043EA0121C0F80016C4 +:104C200005F10800012707FA00F6734C002A04BFBB +:104C30002068B04304D0012A18BFFFDF206830434A +:104C40002060206807FA05F108432060F0BD0FF0EE +:104C5000DDBA584890F82E007047564890F830005A +:104C60007047664AC17811600068654900020860B3 +:104C70007047252808BF02210ED0262808BF1A2118 +:104C80000AD0272808BF502106D00A2894BF042242 +:104C9000062202EB4001C9B25A4A11605A49086023 +:104CA0007047F0B4434B9D7A012D62D0022D1CBF9A +:104CB000F0BC704793F815C0BCF1000F04BFF0BC06 +:104CC000704700BF514C524F4FF47A7C012D57D0A2 +:104CD000DE7D5D7E002E18BF0126012908BF292137 +:104CE0000CD0022A0CBF4B4C012A03D0042A0CBF63 +:104CF0003C46494C04F2E141B1FBFCF1491F084438 +:104D00004649086046490020C1F84C01280286F057 +:104D1000010140EA015040F00311187F820002F1C6 +:104D2000804202F5C042C2F810153E4901EB8002F4 +:104D3000997EC80000F1804000F5F830C0F81425D5 +:104D4000DFF8E4C0C0F810C5D87EC30003F180438B +:104D500003F5F833C3F81425264AC3F810250122B9 +:104D600002FA01F102FA00F0084330490860F0BC91 +:104D7000704793F814C0BCF1000FA3D1F0BC70478A +:104D80009E7D1D7E002E18BF012601295DD0022ABE +:104D900004BF274C4FF47A7151D0012A08BF4FF459 +:104DA000C8614CD0042A06BF3C4640F69801214C0D +:104DB00042E00000240A0020000E004010150040D0 +:104DC00014140040180500500C0500501415004044 +:104DD00000100040FC1F00407817004038150040CC +:104DE0004415004000000C0408F5014040800040DC +:104DF000A4F5014010110040401600402415004069 +:104E00001C1500400815004054150040A224020063 +:104E1000D0FB010004360200C0D401004C850040E4 +:104E200000800040006000404C81004004F50140DB +:104E30006836020030D3010018BF40F6E441214437 +:104E400001F5FA71B1FBFCF158E7022A08BF4FF4F3 +:104E50007A710AD0012A08BF4FF4C86105D0042A2C +:104E60000CBF40F6980140F6E44149F6FC6211445B +:104E7000E8E72DE9F047FC4D0446032090468946BB +:104E8000C5F80002FA49F948086048460FF011FADF +:104E900040460FF0F9F9F74F0126002C04BFBE720F +:104EA0002E6007D0012C05D140460FF051FB0220A7 +:104EB000B8726E60F048C664F048006842464946E1 +:104EC000BDE8F047EDE62DE9F0410F46E64905461D +:104ED00003201646C1F80002E54CE448206038463D +:104EE0000FF0E7F930460FF0CFF930460FF030FB06 +:104EF000E04815B1012D09D011E001218172416B0B +:104F000041F4801141634FF4801007E00221817267 +:104F1000416B41F4001141634FF4001020603246B0 +:104F20003946BDE8F0410020BBE62DE9FF4FCE4CED +:104F30008246002581B003208946C4F80002CC4F88 +:104F4000CA48386003980FF0B4F904980FF09CF940 +:104F5000DFF82CB3C74E4FF00108BAF1000F03D0B1 +:104F6000BAF1010F21D035E0CBF8004096F82D00C2 +:104F7000012806D0022818BFFFDF0CD086F80A806F +:104F800028E0DDE9031396F82C2048460FF012FACA +:104F9000B16A4518F2E7DDE9031296F82C3048466D +:104FA0000FF096F9B16A4518E8E704980FF0D0FAC7 +:104FB000B448CBF8000096F82D00DDE90313012872 +:104FC00096F82C20484624D00FF03EFAB16A4518D6 +:104FD0000220B072AC480560AD49AC480860706B07 +:104FE00040F400207063D4F800924FF0100AC4F827 +:104FF00008A30026C4F80062A6484FF4802BC0F82E +:1050000000B0FF208DF80000C4F81061C4F81080D3 +:1050100009E00FF09BF9B16A4518D9E79DF8000047 +:10502000401E8DF800009DF8000018B1D4F8100162 +:105030000028F3D09DF80000002808BFFFDFC4F867 +:105040000061C4F80C61C4F81061C4F80461C4F8CC +:105050001461C4F81861904800680090C4F8009288 +:10506000C7F800B0C4F804A34FF4002038608248A9 +:10507000C0F84C8081480068A84228BFFFDF28465E +:10508000DDE9031205B0BDE8F04F0AE62DE9F84767 +:10509000754CD4F8000220F00B09D4F804034FF04B +:1050A000100AC0F30018C4F808A30026C4F8006270 +:1050B00078497A4808606F4D0127A87A012802D004 +:1050C000022803D014E0287D10B911E0687D78B182 +:1050D000A87EEA7E07FA00F007FA02F210430860A1 +:1050E000287F800000F1804000F5C040C0F81065C6 +:1050F000FF208DF80000C4F81061276105E000BFB3 +:105100009DF80000401E8DF800009DF8000018B1C9 +:10511000D4F810010028F3D09DF80000002808BF43 +:10512000FFDFC4F810616E72AE72EF72C4F80092C5 +:10513000B8F1000F18BFC4F804A3BDE8F8870068F1 +:10514000574920F07F40086070474FF0E02002216F +:10515000C0F88011C0F8801270474FF0E0210220A3 +:10516000C1F8000170474F49087070474E49086008 +:10517000704730B53F4C0546A06AA84228BFFFDF04 +:105180000120207300203C492561C1F844014748B3 +:105190000560606B40F480006063C80134490860BA +:1051A00030BD70B5334C0546414A0220207310686B +:1051B0000E4600F00F00032808BF012213D010682C +:1051C00000F00F00042808BF02220CD0106800F085 +:1051D0000F0005281BD0106800F00F0006281CBF28 +:1051E000FFDF012213D094F82D0094F82C10012831 +:1051F00015D028460FF086F91F4920610020C1F81C +:1052000044012169A06A08442849086070BD294802 +:10521000006810F0060F0CBF08220422E3E73346B3 +:1052200028460FF038F9E7E71A494FF48000086084 +:105230001048416B21F480014163002101737047E4 +:10524000C20002F1804202F5F8321B4BC2F8103561 +:10525000C2F8141501218140054801600548426BE0 +:105260001143416370470000001000400000040437 +:1052700004F50140240A0020008000404C850040D5 +:10528000ACF50140041000404885004048810040D2 +:10529000A8F5014008F501401811004000000C0479 +:1052A0003C150040B9000020041500404485004032 +:1052B000101500401414004004110040FB48012167 +:1052C0004160C1600021C0F84411F9480160F9480B +:1052D00081627047F8490860F848D0F8001241F040 +:1052E0004001C0F800127047F448D0F8001221F0D5 +:1052F0004001C0F80012F049002008607047EF48F4 +:10530000D0F8001221F01001C0F8001201218161D3 +:105310007047EA480021C0F81C11D0F8001241F093 +:105320001001C0F800127047E44981B0D1F81C2187 +:10533000012A1EBF002001B07047E14A126802F046 +:105340007F02524202700020C1F81C01DD48006853 +:105350000090012001B0704730B50C00054608BF31 +:10536000FFDF14F0010F1CBF012CFFDF002D0CBF6D +:1053700001200220CF4901284872CC72CF4904BFD6 +:10538000D1F8000240F0040007D0022807BFD1F88E +:10539000000240F00800FFDF30BDC1F8000230BD60 +:1053A0002DE9F84FDFF8209399F80000042828BF72 +:1053B000FFDFDFF8F8A2DAF84C11C448BD4C002634 +:1053C0004FF00108D1B1A17A012902D0022903D0FE +:1053D00014E0217D11B911E0617D79B1A17EE27EF9 +:1053E00008FA01F108FA02F211430160217F8900F5 +:1053F00001F1804101F5C041C1F81065B348616B0E +:1054000001606663217B002019B1DAF8441101299B +:1054100000D00021A27AA94D012A71D0022A76D0AB +:10542000D5F8101101290CBF1021002141EA000715 +:10543000A748016811F0FF0F03D0D5F81411012916 +:1054400000D0002184F82E10006810F0FF0F03D068 +:10545000D5F81801012800D0002084F82F009D48BD +:10546000006884F83000FFF776F9012818BF0020A3 +:1054700084F83100C5F80061C5F80C61C5F8106109 +:10548000C5F80461C5F81461C5F818619248006850 +:1054900000908648C0F8446190480068DFF810A288 +:1054A0000090DAF800006062AAF104000068A062CF +:1054B0008B48016801F00F01032908BF012013D0B8 +:1054C000016801F00F01042908BF02200CD0016817 +:1054D00001F00F01052929D0006800F00F0006280F +:1054E0001CBFFFDF012021D084F82C00A07ADFF858 +:1054F000F4B184F82D0002282DD11FE000E006E071 +:10550000D5F80C01012814BF0020082088E7D5F841 +:105510000C01012814BF00200220734A1268012ADE +:1055200014BF042200221043084379E76F48006843 +:1055300010F0060F0CBF08200420D5E7607850B1AA +:10554000DBF8001009780840217831EA000008BF34 +:1055500084F8208001D084F8206017F0020F07D073 +:1055600099F80010624A4908606A52F82110884789 +:1055700017F0010F18BF00210CD05E4A99F80030D7 +:10558000A06A52F82320904799F8000010F0010F0C +:105590002AD10AE017F0020F18BF0121EDD117F050 +:1055A000080F18BF0221E8D1EEE7DBF80000007811 +:1055B00000F00F00072828BF84F8216014D2DBF820 +:1055C0000000062200F10901A01C0FF097FA40B973 +:1055D000207ADBF800100978B0EBD11F08BF01205A +:1055E00000D0002084F82100E17A002011F0020FA1 +:1055F0001CBF17F0020F17F0040F19D111F0100F94 +:105600001CBF94F82F20002A02D094F831207AB1E0 +:1056100011F0080F1CBF94F82020002A08D111F0C7 +:10562000040F02D094F8211011B117F0010F00D02F +:105630000120617A19B170B1FFF728FD19E0234804 +:105640002D490160D5F8000220F00300C5F80002E2 +:1056500084F80B800DE04FF0000B012913D00229D4 +:1056600018BFFFDF4CD0A06A012258440021FFF789 +:1056700018FB17F0010F56D0204899F8001050F889 +:105680002100804770E0D5F8000220F00400C5F842 +:105690000002667284F80B80012384F80A801A469F +:1056A000002196200EF014FE3BE000000080004038 +:1056B00044850040240A002060150040001000408E +:1056C000481500401C110040B900002008F50140B9 +:1056D0004016004010140040181100404481004062 +:1056E0001015004004150040001400401414004040 +:1056F000AC510200F451020000000404B451020055 +:10570000D5F8000220F00800C5F80002667284F89F +:105710000B800220A07201231A46002196200EF071 +:1057200015FE83469FE717F0020F08D0624999F8EB +:10573000002028EA970051F82210884714E017F05B +:10574000080F06D05D4899F8001050F821008047F6 +:105750000AE017F0100F08BFFFDF05D0584899F88E +:10576000001050F821008047A07A022818BFBDE839 +:10577000F88F207B002808BFBDE8F88F5149C1F899 +:105780004461022814D0012818BFFFDFA16A2069F4 +:10579000884298BFFFDF2069CAF80000606B4A4961 +:1057A00040F4800060634FF480000860BDE8F88F2B +:1057B0002169A06A0844EFE70021444A81B000282B +:1057C00018BFC2F80012C2F80011C2F80C11C2F8DA +:1057D0001011C2F80411C2F81411C2F818113C4893 +:1057E0000068009001B07047012804BF282070476E +:1057F000022804BF18207047042812BF08284FF45D +:10580000A870704700B5FFDF282000BD012804BF45 +:1058100041F6A4707047022804BF41F288307047F7 +:10582000042804BF45F63C207047082804BF47F20F +:10583000AC10704700B5FFDF41F6A47000BD012831 +:1058400004BF41F2D4707047022804BF41F2040043 +:105850007047042812BF082842F6A000704700B520 +:10586000FFDF41F2D47000BD012812BF02280020E2 +:105870007047042812BF08284FF4C870704700B55D +:10588000FFDF002000BD11490820C1F800021249C5 +:1058900010480860124911480860091D1148086045 +:1058A000091D11480860091D1048086006494FF499 +:1058B0004020086070470000C4510200D45102002B +:1058C000E45102000080004004F501400010004057 +:1058D000181100400000040408F5014000110040C8 +:1058E000A0F50140141000401C11004010100040B1 +:1058F00010B53F4822210FF0ACF93D48017821F066 +:1059000010010170012107F0D9FD3A49002081F80A +:1059100022004FF6FF70888437490880488010BD08 +:10592000704734498A8C824218BF7047002081F842 +:1059300022004FF6FF70888470472D490160704740 +:105940002D49088070472B498A8CA2F57F43FF3B85 +:1059500003D0002101600846704791F822202549B4 +:10596000012A1ABF0160012000207047214901F17E +:10597000220091F82220012A04BF00207047012252 +:1059800002701D4800888884104670471A49488074 +:1059900070471849184B8A8C5B889A4206D191F857 +:1059A0002220002A1EBF016001207047002070479E +:1059B0001048114A818C5288914209D14FF6FF71EB +:1059C000818410F8221F19B1002101700120704755 +:1059D000002070470748084A818C5288914205D1BF +:1059E00090F8220000281CBF00207047012070475B +:1059F000820A00205C0A0020BA0000207047574A43 +:105A0000012340B1012818BF7047137008689060E7 +:105A100088889081704753700868C2F802008888AF +:105A2000D08070474D4A10B1012807D00EE0507861 +:105A300060B1D2F802000860D08804E0107828B184 +:105A40009068086090898880012070470020704726 +:105A5000424910B1012803D006E0487810B903E0AC +:105A6000087808B1012070470020704730B58DB02C +:105A70000C4605460D2104A80FF00DF9E0788DF8CD +:105A80001F0020798DF81E0060798DF81D002868B0 +:105A9000009068680190A8680290E86803906846E2 +:105AA0000DF026FF20789DF82F1088420CD16078E9 +:105AB0009DF82E10884207D1A0789DF82D108842BD +:105AC00002BF01200DB030BD00200DB030BD30B59B +:105AD0000C4605468DB04FF0030104F1030012B1EE +:105AE000FEF72AFA01E0FEF746FA60790D2120F070 +:105AF000C00040F04000607104A80FF0CCF8E078DE +:105B00008DF81F0020798DF81E0060798DF81D003A +:105B10002868009068680190A8680290E86803907F +:105B200068460DF0E5FE9DF82F0020709DF82E00D0 +:105B300060709DF82D00A0700DB030BD10B500292B +:105B400004464FF0060102D0FEF7F6F901E0FEF739 +:105B500012FA607920F0C000607110BDBE00002014 +:105B600070B5FF4E0446306890F8001100250129F9 +:105B700019D090F8FA10012924D090F8D0100129FA +:105B80002AD090F8F21001291CBF002070BD65706A +:105B900017212170D0F8F4106160B0F8F81021815D +:105BA00080F8F25016E065701C212170D0F80111C8 +:105BB0006160D0F80511A16090F80911217380F897 +:105BC000005107E0657007212170D0F8FC1061607A +:105BD00080F8FA50012070BD65701421217000F129 +:105BE000D2012022201D0EF0B5FF01212172306864 +:105BF00080F8D050DB48B0F8D420A0F8FC207268C0 +:105C0000537B80F8FE3080F8FA101088FBF75EF9BD +:105C1000FAF705FEDEE7D248006890F8D0100029B8 +:105C200014BFB0F8D4004FF6FF70704770B5CC4C7D +:105C30002068002808BFFFDF002520684570002885 +:105C400008BFFFDF2068417800291CBFFFDF70BD5F +:105C50004FF486710FF01FF82068FF2101707F213B +:105C600080F8361013214184282180F8CC100121BE +:105C700080F8B81080F8BD50FFF736FBFEF74BFDFB +:105C8000B94807F0A7F9B94807F0A4F9BDE8704092 +:105C9000B74807F09FB9B2490968097881420CBF3B +:105CA000012000207047AE48006890F82200C0F341 +:105CB000001070472DE9F04FA948D0F800C09CF8BB +:105CC0002400C0F38001C0F34002114400F0010041 +:105CD0000B18BCF822000025C0F3001139B31328BB +:105CE0001DD009DC102802BFA24830F81300BDE81F +:105CF000F08F122813D006E0152808D01D2804BF05 +:105D00009D48BDE8F08FFFDF2846BDE8F08F9B4936 +:105D1000002031F8131013FB0010BDE8F08F9849F4 +:105D2000002031F8131013FB0010BDE8F08F0024A1 +:105D30009CF8BA209CF8BB10924EDFF84CA2DFF81A +:105D40004CB210F0030F4FF4C8774FF4BF784FF404 +:105D5000A8797CD010F0010F17D0082904BF3C4669 +:105D600040200CD0042904BF4446102007D002294B +:105D700007BF05F11804042005F12804082000EBF2 +:105D8000400E0EEB0010204417E0082904BF3846EF +:105D900040240CD0042904BF4046102407D0022917 +:105DA00007BF05F11800042405F12800082404EBBE +:105DB000C40404EB440400EB44009CF8CCC0022A69 +:105DC00008BF4FF47A740DD0012A04BF56464FF431 +:105DD000C86407D0042A07BF5E4640F698046C4E9C +:105DE00040F6E444344404F2E7364FF47A74B6FBE8 +:105DF000F4F4C3EB031606EB860604EB8604082ACC +:105E000052D0042A4BD0022A0CBF05F1180605F126 +:105E100028064FF019020CBF4FF0040A4FF0080A91 +:105E200012FB0A6212FB0342082908BF40230BD071 +:105E3000042908BF102307D0022907BF4FF0180913 +:105E400004234FF028090823C3EBC30300E030E02C +:105E500003EB430309EB43031A4411F00C0F08BF93 +:105E60004FF0000C6244082908BF40210CD00429DF +:105E700004BF4746102107D0022907BF05F11807C4 +:105E8000042105F128070821C1EBC10101EB410103 +:105E900007EB41011144084400F526740EE0464624 +:105EA00014224FF0100ABBE73E4614224FF0400A7E +:105EB000B6E710F0020F18BFFFDF02D02046BDE8A2 +:105EC000F08F022A08BF4FF47A700DD0012A04BF68 +:105ED00056464FF4C86007D0042A07BF5E4640F616 +:105EE00098002B4E40F6E440304400F2E73C4FF47B +:105EF0007A70BCFBF0F0C3EB031C0CEB8C0C00EBDA +:105F00008C0C082A04BF142040220CD0042A44D050 +:105F1000022A0CBF05F1180705F128074FF01900F8 +:105F20000CBF0422082210FB027010FB03C00829DA +:105F300008BF40210BD0042908BF102107D0022937 +:105F400007BF4FF0180904214FF028090821C1EBC1 +:105F5000C10101EB410109EB410108441AE00000D5 +:105F6000CC000020A40A0020B00B0020D80B002099 +:105F7000000C002018520200F18913002052020088 +:105F80001052020068360200A2240200D0FB010079 +:105F900030D3010000F5B27490E714204746102278 +:105FA000C1E7F94840F271210068806A48437047B0 +:105FB000F548006890F83500002818BF01207047A8 +:105FC00010B5F24C207B022818BF032808D1207D91 +:105FD00004F1150105F0E8FD08281CBF012010BDE3 +:105FE000207B002816BF022800200120BDE81040B9 +:105FF000FFF72EBDE449096881F8300070472DE9AC +:10600000F047E14D2968087B002816BF02280020D0 +:10601000012048730E31FFF705FD2968087B02282F +:1060200016BF03280122002281F82F20082081F8C2 +:106030002D00487B0126002701F10E03012804BF33 +:106040005B7913F0C00F0AD001F10E03012804D1CF +:10605000587900F0C000402801D0002000E0012065 +:1060600081F82E00002A04BF91F8220010F0040FDE +:1060700006D0087D153105F097FD296881F82D00BF +:1060800028684760FCF720FF2968C04C4FF00009E2 +:10609000886094F82D0005F0A3FD804694F82F0049 +:1060A000002818BFB8F1000F04D01021404606F0B8 +:1060B000D4FB68B194F8300000281CBF94F82E007F +:1060C00000281DD0607B04F10E0101280ED012E0E3 +:1060D00066734A4604F10E014046FFF7F8FC94F857 +:1060E0002D1004F10E0005F074FE09E0487900F06F +:1060F000C000402831D0394604F10E00FFF71EFDE4 +:106100002868C77690F8220010F0040F08BFBDE899 +:10611000F087002794F82D0005F06BFD040008BF00 +:10612000BDE8F087102106F098FB002818BFBDE8F5 +:10613000F08728683A4600F11C01C6762046FFF732 +:10614000C6FC286800F11C01914806F07AFFBDE802 +:10615000F04701218E4806F08FBF05F073FE4A46D6 +:1061600004F10E01FFF7B3FCCAE778B5874904468E +:10617000854D407B08732968207808706088ADF8E9 +:10618000000080B200F00102C0F3400342EA430283 +:10619000C0F3800342EA8302C0F3C00342EAC302B1 +:1061A000C0F3001342EA0312C0F3401342EA431261 +:1061B000C0F3801042EA80104884E07D012808BFC7 +:1061C000012607D0022808BF022603D0032814BFE7 +:1061D000FFDF0826286880F8BA60607E012808BFC3 +:1061E000012607D0022808BF022603D0032814BFC7 +:1061F000FFDF0826286880F8BB60217B80F8241028 +:10620000418C1D290CBF002161688162617D80F88D +:106210003510A17B002916BF02290021012101753B +:10622000D4F80F10C0F81510B4F81310A0F8191016 +:10623000A17EB0F8CE2061F30302A0F8CE20E17E6B +:10624000012918BF002180F83410002078BD4E4885 +:106250000068408CC0F3001119B110F0040F05D094 +:1062600002E010F0020F01D00020704701207047BB +:10627000454A00231268C2F8C030B2F822C0BCF10F +:106280001D0F02BFC2F8C83082F8C4307047002921 +:1062900008BFC2F8C8300AD0936A40F2712C03FBE1 +:1062A0000CF31944491EB1FBF3F1C2F8C81082F88F +:1062B000C40070470346344810B50168D1F8C820BF +:1062C000002A1ABFD1F8C0C0BCF1000F012405D0CC +:1062D0009A4205D90124D01AC1F8C800204610BD41 +:1062E00091F82210002411F0010F1CBF40680088B3 +:1062F0004FF0430108BF002001F017F9EEE72248F4 +:10630000006890F8B70000280CBF012000207047FB +:1063100070B51F2834BF04461F2400221A4D286878 +:1063200080F8B920224678300EF014FC286801214C +:1063300080F8974080F8B91070BD10B51F2828BFAD +:106340001F20C2B2104C0023206880F8B83080F8BB +:10635000B72098300EF0FEFB2168012081F8B800CC +:1063600010BD0949096881F8BD00704706480068FA +:1063700090F8220000F0010070470348006890F890 +:106380002200C0F340007047CC000020A40A002087 +:10639000B00B0020FE48006890F82200C0F34010C7 +:1063A0007047FB48006890F82200C0F3C0007047B7 +:1063B00001207047F648006890F8BB00704770B540 +:1063C000FEF77CFFFEF730FFFEF760FEFEF7BDFE36 +:1063D000EF4C2068D0F8C010491CC0F8C01090F8ED +:1063E0003300002530B1FEF77FFFFEF794F92068F7 +:1063F00080F833502068457090F8C410F9B1D0F897 +:10640000C02091421BD8042002F08AFA206890F83C +:10641000220010F0010F0CD060684321008801F0C9 +:1064200084F860680088FAF751FDBDE87040FAF71B +:10643000E7B9BDE870404321002001F076B8D0F8FC +:10644000C81019B1D0F8C020914202D990F8370095 +:10645000D8B1042002F064FA206890F8220010F00D +:10646000010F0CD060683C21008801F05EF8606884 +:106470000088FAF72BFDBDE87040FAF7C1B9BDE816 +:1064800070403C21002001F050B8BDE87040002071 +:1064900002F046BA2DE9F84FBD4E804617463068E7 +:1064A0008B464FF0000A458C15F0030F10D015F005 +:1064B000010F05F0020005D0002808BF4FF0010AC7 +:1064C00006D004E0002818BF4FF0020A00D1FFDF19 +:1064D0004FF000094C4615F0010F05F002000BD0FB +:1064E00070B915F0040F0BD049F00800002F18BF49 +:1064F00040F0030440D090E010B115F0040F0DD02F +:1065000015F0070F10D015F0010F05F0020036D07E +:10651000002808BF15F0040F27D03DE0002F18BF5A +:1065200049F0090479D134E02FB149F0080415F09D +:10653000200F14D071E0316805F0200291F8770047 +:10654000104308BF49F0010467D049F0180415F062 +:10655000200F62D191F8BA1008295AD156E031685B +:1065600091F8BA10082951D153E049F00800002FE2 +:1065700018BF40F0010450D140F010044DE0002855 +:1065800018BF15F0040F07D0002F18BF49F00B04F7 +:1065900043D149F0180440E015F0030F3CD115F049 +:1065A000040F39D077B1316849F0080091F8BA107A +:1065B00008290CBF40F0020420F0020415F0200F5F +:1065C00022D02AE0316805F0200291F877001043CC +:1065D00008BF49F0030420D049F0180015F0200F3F +:1065E00009D000BF91F8BA10082914BF40F0020486 +:1065F00020F0020411E091F8BA20082A14BF40F0FC +:10660000010020F00100EDE7082902D024F0010488 +:1066100003E044F0010400E0FFDF15F0400F18BF75 +:10662000FFDFA8F8009098F80000072120F0200074 +:1066300088F80000404606F0D2FC5146404606F07D +:10664000D1FE2146404606F0D6FE14F0010F0CD0D4 +:106650003068062300F10E010022404606F0A8FE35 +:106660003068417B404606F0FAFC14F0020F1BD064 +:106670003068BBF1000F0BD000F11C010623012292 +:10668000404606F095FE0121404606F0F5FC0BE081 +:1066900000F1150106230122404606F089FE30680C +:1066A000017D404606F0E8FC14F0040F18BFFFDF40 +:1066B00014F0080F17D0CDF800903068BDF8001026 +:1066C0000223B0F8CE00020962F30B01ADF800100E +:1066D0009DF80110032260F307118DF8011069463F +:1066E000404606F065FE012F16D1306890F877001D +:1066F00090B1404606F072FE3368401CC0B293F879 +:106700007710C0F125008142B8BF084682B203F17C +:106710005801404606F09DFE0020002818BFFFDF0C +:106720000020002818BFFFDF0020002818BFFFDF6F +:10673000BDE8F88F2DE9F843154C2068002808BF04 +:10674000FFDF2068417811BB0178FF2926D00027A0 +:1067500080F83170877080F837703846FEF703FD97 +:10676000FEF7E5F9206890F9BD00FEF770FA0948D8 +:10677000FEF777FA0848FEF7E2FC206890F824005C +:1067800010F0010F0DD02520FEF773FA10E005E0A0 +:10679000CC0000200C520200095202000C20BDE87F +:1067A000F88310F0020F18BF262067D0FEF761FAB9 +:1067B000206890F8BA102520FEF779F9206880F853 +:1067C0002C70FEF7CAFC2068002190F8BA20084619 +:1067D000FEF779FB0F210520FEF70DFA2068FF4D2B +:1067E000012690F82E10002901BF90F82F100029E3 +:1067F00090F8220010F0040F70D0FCF765FB804683 +:10680000206841468068FDF76DF8F54990FBF1F985 +:1068100001FB190041424046FCF75FF80146206841 +:10682000816041684944416005F0BBF90146206838 +:10683000426891426DD8C0E901784FF0010895F89F +:106840002D0005F0CDF9814695F82F00002818BFDE +:10685000B9F1000F04D01021484605F0FEFFA0B1A9 +:1068600095F8300000281CBF95F82E00002824D091 +:10687000687B05F10E01012815D019E010F0040F16 +:1068800014BF2720FFDF91D192E732466E7305F1E6 +:106890000E014846FFF71BF995F82D1005F10E0083 +:1068A00005F097FA09E0487900F0C000402816D0BA +:1068B000414605F10E00FFF741F9206890F82200EB +:1068C00010F0040F25D095F82D0005F092F95FEA3D +:1068D00000081ED0102105F0C0FF40B119E005F0FE +:1068E000B1FA324605F10E01FFF7F1F8E5E720684D +:1068F000324600F11C01C6764046FFF7E8F82068F2 +:1069000000F11C01B74806F09CFB0121B54806F0D8 +:10691000B3FB2068417B0E30FEF751F9206890F8F8 +:10692000B81079B390F8B72080F8772000F198017B +:1069300058300EF054F9206890F82210C1F300117D +:10694000E9B9B0F8CE0002210609ADF8006068464A +:10695000FDF7F2FA28B1BDF80000C0F30B00B04219 +:1069600004D1BDF80000401CADF800002168BDF85E +:106970000000B1F8CE2060F30F12A1F8CE202068FD +:1069800080F8B870206890F8B91059B190F8972045 +:1069900080F8572000F1780138300EF020F9206897 +:1069A00080F8B9702068B0F8CE10D0F8C02009097E +:1069B00051FA82F190F8BC20DFF82CC211446346F2 +:1069C0000022E1FB0C3212096FF0240302FB0311D9 +:1069D00080F8BC1090F82210824E90F81B80C1F312 +:1069E000001106F1280900295DD03780317821F0A7 +:1069F00020013170408C132837D01CDC10284DD07A +:106A0000122846D0FFDF00BF05F10E01754806F0E1 +:106A10000AFB697B734806F022FB2068418C1D2924 +:106A200018BF15297ED090F8772000F15801304624 +:106A300006F04BFB7EE0152818BF1D28E2D101218E +:106A4000304606F0CCFA3078B8F1000F40F0200064 +:106A50003070206812D000F11C01304606F0F1FAC7 +:106A60000121304606F008FBCEE70021304606F053 +:106A7000B6FA307840F020003070C5E700F115011B +:106A8000304606F0DEFA2068017D304606F0F4FA62 +:106A9000BAE70621304606F0A2FAB5E702213046F1 +:106AA00006F09DFAB0E7002241463046FFF7F2FCBF +:106AB000206890F87710002904BF408C10F0010F77 +:106AC00005D110F0020F08BF10F0200F04D00122F2 +:106AD00041464846FFF7DEFCF07810F03F0F1CBF40 +:106AE000307910F0100F25D0304606F076FA226883 +:106AF000014692F82400C0F38003C0F3400C6344C5 +:106B000000F00100034492F82C00C0F38002C0F3AF +:106B1000400C624400F001001044181AC0B200F0AA +:106B200018FD00E006E00090032304226946304689 +:106B300006F03EFC206890F82200C0F30010B0B1CF +:106B40002A4E04213046378006F049FA05F10E013D +:106B5000304606F068FA697B304606F080FA206815 +:106B600000F1380190F85720304606F0D2FA05F0CF +:106B70008DF803211E4805F01CF9216881F83300C7 +:106B80000020BDE8F8831B49486070472DE9F843B1 +:106B9000184C8046206890F8312032B1408C1D2876 +:106BA00008BFFFDFBDE8F84309E4012631B390F8E0 +:106BB000BC00FEF75EF8206890F8BB102520FDF7BA +:106BC00076FF206801224FF4967190F8BB300020C8 +:106BD000FEF7ABF90848FEF7C9FA10E0A40A002056 +:106BE00040420F00B00B002053E4B36E000C0020B5 +:106BF000280C0020CC000020D80B002006E02068E4 +:106C00004670867080F83160BDE8F883F948FEF779 +:106C1000ADFA2068002590F8241090F82C0021EAA5 +:106C2000000212F0010F18BF01250ED111F0020F62 +:106C300004D010F0020F08BF022506D011F0040F97 +:106C400003D010F0040F08BF04250027B8F1000F8F +:106C50005CD0012D1CD0022D08BF26201CD0042D95 +:106C600014BFFFDF272017D0206890F8BA10252026 +:106C7000FDF71DFF206890F82210C1F3001171B1DB +:106C8000002201234FF496711046FEF74EF93DE0C5 +:106C90002520FDF7EEFFE7E7FDF7EBFFE4E790F8CF +:106CA000BA3001224FF496710020FEF73EF9D14828 +:106CB000C17811F03F0F1CBF007910F0100F25D0E4 +:106CC000CC4806F08AF92368014693F82420C2F3E1 +:106CD0008000C2F3400C604402F0010200EB020CA1 +:106CE00093F82C20C2F38000C2F34003184402F052 +:106CF00001020244ACEB0200C0B200F02AFC00909A +:106D0000032304226946BB4806F052FB206890F832 +:106D10002C10294380F82C1090F8242032EA01012D +:106D200011D04670408C132820D01BDC102808BFDF +:106D3000BDE8F883122819D0C0F30010002818BF4E +:106D4000FFDFBDE8F883418C1D2908BF80F82C7057 +:106D5000E7D0C1F30011002914BF80F8316080F83A +:106D60003170DEE7152818BF1D28E5D1BDE8F843CE +:106D700001210846FEF7F0BA9F4810B50068417837 +:106D800041B90078FF2805D000210846FFF7FEFE34 +:106D9000002010BDFEF792FAFEF746FAFEF776F9EC +:106DA000FEF7D3F90C2010BD93490120096881F842 +:106DB000370070479049096881F83200704770B514 +:106DC000002601F01DFC002800F0C4808A4C2068D9 +:106DD000417801220025012905D0022901D003298B +:106DE00070D0FFDF70BD81780225B1B390F822002A +:106DF00010F0030F67D08148FEF7B8F92068012230 +:106E0000962190F8BB301046FEF78FF8216891F874 +:106E1000BB0091F8CC1010F00C0F08BF0021962099 +:106E2000FEF7BFF92068457090F8330058B1FDF7C0 +:106E30005EFC206890F8BB0010F00C0F0CBF4020E7 +:106E40004520FEF747FA206890F83400002808BF74 +:106E500070BDBDE87040FEF75CBA418CC1F3001212 +:106E60009AB1102929D090F8330020B1FDF73FFCEA +:106E70004020FEF72FFA6148FEF778F9206890F875 +:106E8000221011F0040F1FD029E090F8242090F870 +:106E90002C309A4211D190F87700002808BF11F0E9 +:106EA000010F05D111F0020F08BF11F0200F51D0D2 +:106EB000BDE870400121084668E6BDE87040002149 +:106EC000012063E619E045E090F83500012814BF81 +:106ED0000328102646F00E010020FEF73DFA206838 +:106EE00090F83400002818BFFEF713FA002196200E +:106EF000FEF757F92068457070BD817801B3418C69 +:106F000011F0010F21D080F8D02090F8D210B0F805 +:106F1000D40000F00AFB60680088F9F7D7FFF9F7A2 +:106F20006FFC20684570FEF7C9F9FEF77DF9FEF7A2 +:106F3000ADF8FEF70AF9BDE87040032001F0F0BC9F +:106F40008178BDE87040012020E611F0020F04BFF7 +:106F5000FFDF70BDBDE87040FFF731BAFFF72FBA11 +:106F600010B5254C206890F8341049B13630FEF742 +:106F7000DBF918B921687F2081F83600FEF7BFF9E8 +:106F8000206890F8330018B1FEF7AEF9FDF7C3FBA7 +:106F900001F036FBA8B1206890F82210C1F300116F +:106FA00079B14078022818BFFFDF00210120FFF7E8 +:106FB000EDFD2068417800291EBF40780128FFDFE1 +:106FC00010BDBDE81040FFF7FAB92DE9F0470A4FB0 +:106FD0000E4603283A68518C12D092F8320001F024 +:106FE000010410F1000918BF4FF001094FF001082A +:106FF0000CE00000B00B0020CC000020280C00208A +:10700000C1F340044FF000094FF00208FDF721FEE4 +:10701000054634EA090008BFBDE8F0873868FF4C30 +:1070200090F8330060B104F016FE30700146FF287E +:1070300006D0E01C04F004FE307804F017FE05438F +:107040002078C0F380113868027D914209D100F1A7 +:1070500015010622E01C0DF051FD002808BF01209B +:1070600000D000203178FF2906D0C0B9386890F8E8 +:107070002D00884215D112E098B12078E11CC0F3B0 +:10708000801004F091FD064604F0F4FE38B130465D +:1070900004F0AFFD18B1102105F0DFFB08B10120AD +:1070A00000E00020396891F8221011F0040F01D09F +:1070B000F0B11AE0CDB9DA4890F83500002818BFD1 +:1070C000404515D114F8030B2146C0F3801004F09D +:1070D0006BFD044604F0CEFE38B1204604F089FD75 +:1070E00018B1102105F0B9FB10B10120BDE8F087FF +:1070F0000020BDE8F0872DE9F04FCA4D804683B0EF +:10710000286800274078022818BFFFDF28687F24FE +:1071100090F8341049B13630FEF706F9002804BF64 +:10712000286880F83640FEF7EAF8BC4805F077FF9B +:107130000646B8F1000F00F0B081B84806F008F933 +:10714000002800F0AA81FDF752FD002800F0A5817B +:107150003046B24EFF21DFF8D0A24FF000084FF0CA +:10716000030B4FF00109062880F0B881DFE800F03A +:10717000FEFEFE03FE8F8DF8001069460320FFF728 +:1071800024FF002828687CD090F8341011B190F8C2 +:10719000001159B12868807801283ED0A348FDF736 +:1071A000E5FF286880F801B000F07BB99DF8003059 +:1071B00080F80091017880F80111FF2B10D000F2C7 +:1071C0000312511E184604F01DFD002808BFFFDF02 +:1071D000286890F8021141F0020180F802110DE0D8 +:1071E0003178C1F3801180F802118D49D1F88721DF +:1071F000C0F80321B1F88B11A0F80711286800F23C +:10720000091690F836007F2808BFFFDF286890F83D +:107210003610317080F83640BCE7844CDAF80490C0 +:1072200004F12806A4F800800721204605F0D7FEC7 +:107230000021204606F0D6F84946204606F0DBF845 +:107240000623002206F10901204606F0B1F828685D +:10725000417B204605F003FF286800F1380190F8D3 +:107260005720204606F0F5F82046FDF77FFF2868F6 +:107270000122962190F8BB300020FDF756FE90E7E2 +:10728000FFE78078002840F00A8100F006B98DF809 +:10729000081002A90520FFF798FE0028286800F0D2 +:1072A000F78082786249002A7ED0A1F11F066C68BF +:1072B00090F8BB90D6F80F00C4F80E00B6F8130093 +:1072C0006082707D2075B07D6075B6F81700E08231 +:1072D000B6F819006080B6F81B00A080B6F81D0053 +:1072E000E08004F108000DF0EBFD96F8240000F0BA +:1072F0001F00207696F82400400984F86C0184F879 +:10730000549084F85590286890F8CC1084F8561062 +:1073100090F8BD0084F857009DF80810686800F0E8 +:1073200081F9022001F0FCFAA6F12804DAF80090B5 +:10733000A4F800800821204605F051FE00212046D7 +:1073400006F050F84946204606F055F869463046A2 +:1073500005F07EFE304605F098FE0146204605F019 +:107360007EFE062300226946204600E0B6E006F0D5 +:107370001FF86946304605F05DFE304605F078FEA0 +:107380000146204605F078FE062301226946204684 +:1073900006F00EF82046FDF7E9FE28680122962146 +:1073A00090F8BB30002000E005E0FDF7BEFD286846 +:1073B00080F801B075E06C683278184E607BC2F3DB +:1073C000401210406073D6F80F00C4F80E00B6F8F3 +:1073D00013006082707D2075B07D6075B6F817006F +:1073E000E082B6F819006080B6F81B00A080B6F8FD +:1073F0001D00E0804FF0010A04F108000DF060FD6F +:1074000096F8240000F01F00207696F8240040092A +:1074100084F86C0184F854A00CE00000280C0020D3 +:10742000A40A0020CC00002004520200000C00201E +:10743000470C002084F855A0286890F8CC1084F8F8 +:10744000561090F8BD0084F857009DF80810686841 +:1074500000F0E8F8286880F8D09090F8D210B0F8E2 +:10746000D40000F062F868680088F9F72FFDF9F79A +:10747000C7F9286880F80180FDF720FFFDF7D4FEEA +:10748000FDF704FEFDF761FE012001F049FA08E076 +:1074900090F82200C0F3001008B1012701E0FEF7C8 +:1074A0008EFF286890F8330018B1FDF71DFFFDF737 +:1074B00032F91FB100210120FFF768FB28684178ED +:1074C000002919BF4178012903B0BDE8F08F407849 +:1074D000032818BFFFDF03B0BDE8F08F286890F8DD +:1074E0002200C0F300100028D9D0D6E770B58A4C2E +:1074F00006460D462068807858B1FDF789FA216864 +:107500000346304691F8BB202946BDE8704001F0A3 +:1075100074BAFDF77DFA21680346304691F8BA2027 +:107520002946BDE8704001F068BA7C4A137882F8B9 +:10753000F530A2F8F60082F8F410012082F8F2008B +:1075400092F8C400002818BF92F8C00082F8F80032 +:10755000704778B50446704800230093006890F89F +:10756000BA20082A04BF4FF4C87240230DD0042A61 +:1075700004BF4FF4BF72102307D0022A07BF03F1E4 +:107580001802042303F128020823491D01FB0326E6 +:1075900090F8BC209DF8001062F3050141F0400511 +:1075A0008DF8005090F8BB00012826D002282BD07F +:1075B000082818BFFFDF2DD025F080008DF80000CF +:1075C000C4EB041106FB04F001EB810100EB810424 +:1075D0005348844228BFFFDF5248A0FB0410BDF887 +:1075E0000110000960F30C01ADF80110BDF80000B6 +:1075F0009DF8021040EA014078BD9DF8020020F09D +:10760000E0008DF80200D7E79DF8020020F0E000CE +:10761000203004E09DF8020020F0E00040308DF8BA +:107620000200C9E72DE9F0413B4D04460E462868AB +:1076300090F8D000002818BFFFDF0027286880F8E6 +:10764000D2702188A0F8D4106188A0F8EA10A1882F +:10765000A0F8EC10E188A0F8EE1094F86C1180F816 +:10766000F01090F82F1049B1427B00F10E01012A71 +:1076700004D1497901F0C001402935D090F830108B +:1076800041B1427B00F10E01012A04BF497911F09A +:10769000C00F29D0DE300DF001FC2348FF2E00780A +:1076A000C0F3801060761D48D0F88711C4F81A1016 +:1076B000B0F88B01E08328681ED0C0F8E410E18B9D +:1076C000A0F8E81000F1D802511E304604F09AFAF2 +:1076D000002808BFFFDF286890F8D71041F00201AA +:1076E00080F8D710BDE8F081D0F80E10C0F8DE1099 +:1076F000418AA0F8E210D0E7C0F8E470A0F8E87082 +:10770000617E80F8D710D4F81A10C0F8D810E18B39 +:10771000A0F8DC10BDE8F081CC000020A40A002015 +:10772000C4BF030089888888280C0020FE48406870 +:1077300070472DE9F0410F460646014614460120E8 +:1077400005F082FA054696F85500FEF75FF8014607 +:1077500096F85500022808BFF44807D0012808BF52 +:10776000F34803D004280CBFF248F34808444FF410 +:107770007A7100F2E140B0FBF1F0718840F27122C1 +:107780005143C0EB4100001BA0F5597402F0E4FD29 +:10779000002818BF1E3CAF4234BF28463846A042DE +:1077A00003D2AF422CBF3C462C467462BDE8F08148 +:1077B0002DE9FF4F8FB0044690F855601C9899460C +:1077C00040EA0900019094F86500002790460D28D2 +:1077D0000CBF012000200990B9F1000F04BF94F8FC +:1077E0000C0103282BD1099848B3B4F88E01404509 +:1077F00025D1D4F81401C4F80001608840F2E241B8 +:107800004843C4F80401B4F85A11B4F8E600084437 +:10781000C4F80801204602F0A9FDB4F89201E08204 +:1078200094F890016075B4F894016080B4F8960102 +:10783000A080B4F89801E080022084F80C01D4F80C +:1078400064010C90B4F8E6A0B4F85801D4F860B123 +:10785000D4F854110891B9F1000F03D094F8201115 +:1078600049B193E004F1E001059174310A9104F506 +:10787000A075091D07E004F59A710591091D0A918B +:1078800004F59275091D0B91B4F85810A8EB00008F +:10789000A8EB010109B200B20391002805DAD4F87F +:1078A0005001089001200190084694F80C1100291D +:1078B00071D0012900F04482022900F0658103297A +:1078C00018BFFFDF00F0848239460898FBF705F8FF +:1078D0000A99012640F2712208600B98A0F80080F6 +:1078E000002028702E710A980068A8606188D4F87A +:1078F00014015143C0EB41009049A0F54D708861DF +:107900004969814287BF059908600598016005981B +:10791000616A0068084400F5D270E86002F01CFD5E +:1079200010B1E8681E30E8606E71B4F8D000A0EBCA +:10793000080000B20028C4BF03206871099800281D +:107940001C9800F0C282C0B1B4F8F81000290CBF36 +:107950000020B4F8FA00A4F8FA0094F8FC20401CC7 +:107960005043884209D26879401E002805DD6E71B7 +:10797000B4F8FA00401CA4F8FA00B9F1000F00F0C6 +:10798000C78294F82001002800F0BE8213B00220C4 +:10799000BDE8F08FFFE7BBF1000F08BFFFDF94F8F1 +:1079A0005510614890F8280005F0FBFA0790E08A2E +:1079B00040F271214143079800EB410210980021E9 +:1079C000002806D000FB02F15D48B1FBF0F000F1A9 +:1079D0000101C4F81011608840F2E24100FB01F29D +:1079E00010994FF0000006D0554801FB02F1B1FBA1 +:1079F000F0F000F10100C4F8140186B221464FF006 +:107A00000100D4F828A005F01FF9074694F85500A6 +:107A1000FDF7FCFE014694F85500022808BF4348D4 +:107A200007D0012808BF424803D004280CBF4148B2 +:107A30004148084400F2E1414FF47A70B1FBF0F1A3 +:107A4000608840F271225043C1EB4000801BA0F5DA +:107A5000597602F081FC002818BF1E3EBA4534BF9B +:107A600038465046B04203D2BA452CBF56463E4631 +:107A7000666294F85500FDF7F7FE4FF47A7600F24F +:107A8000E140B0FBF6F000EB0B0794F85500FDF772 +:107A9000EBFE024694F85500022808BF234907D0A0 +:107AA000012808BF224903D004280CBF21492249DC +:107AB00002EB010AFDF7AAFE504400F2DB514FF43D +:107AC0007A70B1FBF0F0E18A40F271224A430799E3 +:107AD000D4F810A101EB4201081AA0EB0A003844C7 +:107AE000A0F12007607D40F2E24110FB01F0079019 +:107AF00094F8556016F00C0F18BF4DF6883103D17D +:107B00003046FDF783FE0146022E08BF074807D026 +:107B1000012E08BF064803D0042E0CBF05480648B6 +:107B2000084400F2E1410DE0500C00200436020050 +:107B3000A2240200D0FB0100C0D40100D400002028 +:107B400040420F004FF47A70B1FBF0F000EB4A01B5 +:107B5000079801EB000A3046FDF746FE504400F15D +:107B60006201FD48416194F85500FDF77DFE00F289 +:107B7000E1414FF47A70B1FBF0F05844381AB0F597 +:107B80003D7F38BFFFDF9FE6E28A40F27121D4F8E3 +:107B90000401514300EB410210980021002806D057 +:107BA00000FB02F1ED48B1FBF0F000F10101C4F877 +:107BB0001011618840F2E24001FB00F210994FF091 +:107BC000000006D0E54801FB02F1B1FBF0F000F146 +:107BD0000100C4F8140186B221464FF00100D4F828 +:107BE00028B005F031F8074694F85500FDF70EFE71 +:107BF000014694F85500022808BFD94807D001284B +:107C000008BFD84803D004280CBFD748D748084439 +:107C100000F2E1414FF47A70B1FBF0F0618840F27C +:107C200071225143C0EB4100801BA0F5597602F050 +:107C300093FB002818BF1E3EBB4534BF384658464C +:107C4000B04203D2BB452CBF5E463E466662BAF1E7 +:107C5000000F2FD11C9868B394F855603046FDF79B +:107C6000D5FD0146022E08BFBD4807D0012E08BF32 +:107C7000BC4803D0042E0CBFBB48BC48084400F2EB +:107C8000E1414FF47A70B1FBF0F0D4F81011E38ABF +:107C9000014440F27122D4F804015A4300EB42003F +:107CA000471A3046FDF7A0FD0C99081A3844A0F198 +:107CB00020070AE0E28A40F27121D4F8040151431E +:107CC00000EB4101D4F810010F1AD4F80821D4F8C0 +:107CD0001011D4F8000100FB021B607D40F2E2416C +:107CE00010FB01FA94F8556016F00C0F18BF4DF612 +:107CF000883103D13046FDF789FD0146022E08BFC9 +:107D0000974807D0012E08BF964803D0042E0CBF19 +:107D100095489648084400F2E1414FF47A70B1FB6F +:107D2000F0F000EB4B0082443046FDF75DFD50441F +:107D300000F1600188484161012084F80C01C3E52D +:107D4000618840F271235943D4F81421D4F800C15A +:107D5000C2EB410101FB00F70398D4F8081150442D +:107D6000401AD4F81031401E0CFB013100FB021BFD +:107D7000607D40F2E24110FB01FA94F8556016F084 +:107D80000C0F18BF4DF6883103D13046FDF73EFD8C +:107D90000146022E08BF724807D0012E08BF714865 +:107DA00003D0042E0CBF70487048084400F2E14133 +:107DB0004FF47A70B1FBF0F000EB4B008244304698 +:107DC000FDF712FD504400F16001634841617BE51D +:107DD000628840F27123D4F814115A43C1EB420176 +:107DE00001FB00F794F8640024281CBF94F8650098 +:107DF00024280BD1B4F88E01A8EB000000B20028B3 +:107E000004DB94F89101002818BF0646019870B36E +:107E1000BAF1000F2BD10C98002814BFBBF1000F52 +:107E2000FFDF94F8550010F00C0F14BF4DF68830AA +:107E3000FDF7ECFC022E08BF494907D0012E08BF10 +:107E4000484903D0042E0CBF47494849084400F272 +:107E5000E1414FF47A70B1FBF0F03F1A94F855000D +:107E6000FDF7C2FC0C99081A3844A0F120070398CA +:107E7000D4F81411504400FB01FA16F00C0F18BF8F +:107E80004DF6883103D13046FDF7C0FC0146022E85 +:107E900008BF334807D0012E08BF324803D0042E54 +:107EA0000CBF31483148084400F2E1414FF47A7088 +:107EB000B1FBF0F000EB4A0A3046FDF795FC504468 +:107EC00000F1600124484161FEE400287FF43CADEC +:107ED00094F80C0100283FF450AD618840F2712203 +:107EE000D4F814015143C0EB4101284604F0D7FDFA +:107EF0000004000C3FF441AD1D99002918BF088013 +:107F0000012013B0BDE8F08F94F85C01FBF736FB5D +:107F100094F85C012946FBF71FFA00281CBF89F082 +:107F2000010084F82101002013B0BDE8F08F2DE995 +:107F3000F04F0F4C074683B020788946064E002547 +:107F40004FF00208032804BF207BB8427DD160684F +:107F50003061207803280DE0D400002040420F005B +:107F600004360200A2240200D0FB0100C0D40100AC +:107F7000500C002018BFFFDF0327B9F1080F78D29B +:107F8000DFE809F0040E1B1B167777726562FEF7B7 +:107F9000D1FB002818BFFFDFB77003B0BDE8F08F3A +:107FA000FEF7EAFE002818BFFFDF03B0BDE8F08F40 +:107FB00003B0BDE8F04FFDF7F3B92775257494F8C9 +:107FC0002C00012658B14FF47A71A069FAF785FCAC +:107FD000A061002104F1100004F061FD1AE001210C +:107FE0006846FBF79FFF9DF8000042F21071000207 +:107FF000B0FBF1F201FB1205FDF7D3FF0544294662 +:10800000A069FAF76AFCA061294604F1100004F0A7 +:1080100046FD461C208C411C0A293CBF304420846C +:10802000606830B1208C401C0A2828BF84F8158075 +:1080300000D267753046FEF73DF9002804BF03B053 +:10804000BDE8F08F607A002801E014E011E01CBF69 +:1080500003B0BDE8F08F207B04F11001FBF77CF941 +:10806000002808BFFFDFA0E7207BFAF70EFF25708E +:108070009BE7FFDF99E7202F28BFFFDFDFF804A48D +:1080800007213AF81700F8F7EFFD040008BFFFDFFB +:10809000202F28BFFFDFFB48218830F817008842D7 +:1080A00018BFFFDF01273461B9F1080F80F0548158 +:1080B000DFE809F0049EA6A6A1F0F0EFC4F8605135 +:1080C000F580C4F8645194F8210138B9FAF7FCFE40 +:1080D000D4F82C11FBF706FC00281BDCB4F81E11A9 +:1080E000B4F85800814206D1B4F8D410081AA4F8A4 +:1080F000D600204605E0081AA4F8D600B4F81E11F0 +:108100002046A4F85810D4F84811C4F82C11C0F82F +:1081100050111DE0B4F81C11B4F85800091AA4F865 +:10812000D610B4F81C112046A4F85810D4F82C111D +:10813000C4F84811C4F85011D4F83411C4F8E01050 +:10814000D4F83811C4F85411B4F83C11A4F85811FB +:1081500001F0B6FFFAF792FE94F855A0814650461A +:10816000FDF754FBBAF1020F08BFC74909D0BAF1B5 +:10817000010F08BFC54904D0BAF1040F0CBFC449B0 +:10818000C44908444FF47A7100F2E140B0FBF1F1C8 +:10819000D4F8140140F27122014460885043C1EBCD +:1081A0004000A0F1300AB9F1B70F98BF4FF0B709FE +:1081B0002146012004F048FD4844AAEB0000A0F24B +:1081C0001939A2462146012004F03EFDDAF82410B8 +:1081D0009C30814288BF0D1AC6F80C904D4538BFBF +:1081E000A946C6F8089084F8207186F80280DCE67B +:1081F00002F0ADF801E0FDF7D3F884F82071D4E681 +:10820000FAF762FED4F8502101461046FBF76AFBEC +:1082100048B1628840F27123D4F814115A43C1EB7B +:108220004201B0FBF1F094F865100D290FD0B4F8BD +:108230005820B4F81E1113189942AEBF481C401CB8 +:108240001044A4F81E0194F8220178B905E0B4F8AE +:108250001E01401CA4F81E0108E0B4F81E01B4F889 +:10826000D410884204BF401CA4F81E01B4F85A017F +:10827000DFF82492401CA4F85A01B4F88000B4F846 +:108280007E10401AB4F85810401E08441FFA80FBB4 +:1082900024E053E060E000BF96F80080B8F10C0FD6 +:1082A00028BFFFDF39F8188094F86CA1BAF10C0FE1 +:1082B00028BFFFDF39F81A000023404481B202A82A +:1082C000CDE90050B4F81E212046FFF771FA0028CE +:1082D0003FF46BAE012818BFFFDF27D0B4F81E01B2 +:1082E000ABEB000000B20028D6DA082084F8740056 +:1082F00084F87370204601F034FB84F80C5194F834 +:108300005C514FF6FF77202D00D3FFDF5D4820F84A +:10831000157094F85C01FAF7B8FD202084F85C0130 +:10832000307903B0BDE8F04FF3F764BDB4F81E0137 +:10833000BDF808100844A4F81E01CFE794F80C011A +:10834000042818BFFFDF84F80C5194F85C514FF6F5 +:10835000FF77202DDAD3D8E7FFDF26E610B54F4CA4 +:10836000207850B101206072FEF724FD20780328A8 +:1083700005D0207A002808BF10BD0C2010BD207B3E +:10838000FBF7FCF8207BFBF746FB207BFAF77DFD33 +:10839000002808BFFFDF0020207010BD2DE9F04F3E +:1083A0003E4F83B0387801244FF0000840B17C7212 +:1083B0000120FEF7FFFC3878032818BF387A0DD06B +:1083C000DFF8DC9089F8034069460720F8F7D5FB11 +:1083D000002818BFFFDF4FF6FF7440E0387BFBF743 +:1083E000CDF8387BFBF717FB387BFAF74EFD0028FA +:1083F00008BFFFDF87F80080E2E7029800281CBF73 +:1084000090F80C1100292AD00088A0421CBFDFF888 +:1084100074A04FF0200B4AD00721F8F725FC040088 +:1084200008BFFFDF94F85C01FBF7F5FA84F80C81D4 +:1084300094F85C514FF6FF76202D28BFFFDF2AF815 +:10844000156094F85C01FAF720FD84F85CB1694688 +:108450000720F8F792FB002818BFFFDF22E06846EC +:10846000F8F769FB0028C8D021E0029800281CBF5B +:1084700090F80C11002915D00088A0F57F41FF3934 +:10848000CAD114E0840C002004360200A2240200A9 +:10849000D0FB0100C0D4010028520200500C002083 +:1084A000D40000206846F8F746FB0028DDD089F8A4 +:1084B000038087F82C8087F80B8003B00020BDE88C +:1084C000F08F70B50446FD4890F80004FC4D40095B +:1084D00095F800144909884218BFFFDF95F8140D7C +:1084E0004009F84991F800144909884218BFFFDF94 +:1084F000F549002001220C7188700A704870C8701C +:10850000F2490870BDE8704048E7EF4908707047CD +:108510002DE9F843ED4C06468846207800285CD1CA +:10852000EB48FAF758FC2073202856D003276660E2 +:108530002770002565722572AEB1012106F1FC009D +:10854000FBF719FD0620F8F737FB81460720F8F7FF +:1085500033FB96F8FC104844B1FBF0F200FB12101C +:10856000401C86F8FC00FAF789FCDA49091838BF84 +:1085700040F2F65000F23D1086B2FDF79BFBE06141 +:10858000FDF70FFD4FF0010950B384F80A90012167 +:108590006846FBF7C7FC9DF8000042F2107100022C +:1085A000B0FBF1F201FB12000644FAF78DFC3146F4 +:1085B000FAF793F9A061277567752574207B04F19C +:1085C0001001FAF7C9FE002808BFFFDF258400204C +:1085D000FEF7F0FB0020BDE8F8830C20BDE8F8832F +:1085E000FAF772FC3146FAF778F9A061A57284F8BF +:1085F0002C90A8F226502063DDE7B34948707047FD +:10860000B24810B5417A0124002918BF002409D1CD +:1086100090F82C1031B1416A006B814284BF002474 +:10862000FEF7C2FB204610BD70B5A74C0546E0889A +:10863000401CE080D4E902016278D5F86061002A2C +:108640001CBF324604F053FAA060864208D895F861 +:108650000C01012804D0E078002804BF012070BD7F +:10866000002070BD70B50C4640F2E24100FB01F500 +:108670002046FDF7CBF8022C08BF974907D0012C04 +:1086800008BF964903D0042C0CBF9549954908446E +:108690004FF47A7100F2E140B0FBF1F000F54D705B +:1086A00085428CBF281A002070BD2DE9F04F83B0A1 +:1086B0004FF00009044680F8209190F8DE00002871 +:1086C00007BF94F80C01032803B0BDE8F08FFAF758 +:1086D000FBFBD4F8502101461046FBF703F90028B4 +:1086E000DCBF03B0BDE8F08F628840F27123D4F89C +:1086F00014115A43C1EB4201B0FBF1F0411CB4F834 +:1087000058000144A4F81C11B4F8D410B4F81C218A +:10871000891A09B20029DCBF03B0BDE8F08F01213E +:1087200084F82211B4F88010B4F87E206E4F891AB4 +:10873000491E084485B2DFF890A10DF1080B25E031 +:108740009AF800600C2E28BFFFDF37F8166094F807 +:108750006C81B8F10C0F28BFFFDF37F81800CDE9A6 +:10876000009B3044B4F81C2181B201232046FFF75E +:108770001FF8002804BF03B0BDE8F08F01280FD018 +:10878000022812BFFFDF03B0BDE8F08FB4F81C0170 +:10879000281A00B20028BCBF03B0BDE8F08FCFE7B5 +:1087A000B4F81C01BDF808100844A4F81C01EDE75A +:1087B0002DE9F0430422002583B006297DD2DFE8AD +:1087C00001F0074B03191951044680F80C2107E00A +:1087D00004463D48C178002918BF84F80C210CD00C +:1087E000FAF77EFAA4F85A51B4F85800A4F81E011A +:1087F00084F8225103B0BDE8F08306780C2E28BF20 +:10880000FFDF394F94F80C0137F816604FF001097B +:10881000032807D00128E3D194F86C81B8F10C0F3C +:108820000AD308E0C4F80851C4F8005194F86C81E8 +:10883000B8F10C0F00D3FFDF37F81800CDE9009531 +:10884000304481B2B4F8D42000232046FEF7B0FFB4 +:10885000002818BFFFDFC3E7032180F80C1103B025 +:10886000BDE8F0830546876AB0F81401294686B250 +:10887000012004F0E9F9044695F85500FCF7C6FF1D +:1088800095F85510022908BF134907D0012908BFE0 +:10889000124903D004290CBF1149124908444FF46E +:1088A0007A7100F2E140B0FBF1F0698840F2712288 +:1088B0005143C0EB4100801B18E02DE001E000E0D7 +:1088C0000BE000E019E000E0D4000020500C002094 +:1088D0002F7F01000AFAFFFF04360200A2240200E3 +:1088E000D0FB0100C0D4010028520200A0F5597647 +:1088F00001F032FD002818BF1E3EA74234BF2046BB +:108900003846B04228BF344602D2A74228BF3C4670 +:108910006C6203B0BDE8F083FFDF03B0BDE8F08315 +:10892000F8B5894C0246874F00256168606A052AC0 +:1089300048D2DFE802F0032F34373E00A07A002649 +:1089400060B101216846FBF7F7FA9DF8000042F29A +:1089500010710002B0FBF1F201FB1206FDF721FBE2 +:108960008119A069F9F7B9FFA0612574032060752A +:10897000607A38B9207B04F11001FAF7EDFC002889 +:1089800008BFFFDF2584FAF7ABF93879BDE8F84076 +:10899000F3F730BABDE8F840002100F06DB8C1F837 +:1089A0006001F8BDD1F86001BDE8F840012100F098 +:1089B00063B884F82C50FAF793F93879BDE8F84099 +:1089C000F3F718BAFFDFF8BD70B55E4CA178022945 +:1089D00006BFE188002970BD2569C5F8640195F8D6 +:1089E0005500FCF701FFD5F86411081AA16801448D +:1089F000A160E1680844E06070BD70B5054651486B +:108A000090F802C0BCF1020F06BF006900F5B07417 +:108A10004E4C002904BF256070BD4FF47A760129C1 +:108A20000DD002291CBFFFDF70BD1046FCF707FF09 +:108A300000F2E140B0FBF6F0281A206070BD184645 +:108A4000FCF712FF00F2E140B0FBF6F0281A2060BC +:108A500070BD3D48007800281CBF0020704710B54D +:108A60000720F8F79BF880F0010010BD3648007829 +:108A7000002818BF012070472DE9F047324C82B022 +:108A8000002584F82C50D4F8188084F82810E5725A +:108A900081462570012727722946606803F082FB12 +:108AA0006168C1F85081267B81F85C61C1F86091F2 +:108AB000C1F85481B1F80080202E28BFFFDF244880 +:108AC00020F81680646884F80C51DFF87880A4F8E8 +:108AD000585198F800600C2E28BFFFDFDFF8749023 +:108AE00039F816A094F86C610C2E28BFFFDF39F816 +:108AF00016000023504481B200951A462046019585 +:108B0000FEF756FE002818BFFFDFC4F80851C4F86E +:108B1000005184F80C71A4F81E51A4F81C5184F87B +:108B20002251B4F85800401EA4F85800A4F85A5135 +:108B3000FAF7D6F898F8040002B0BDE8F047F3F76A +:108B400059B90000D4000020500C0020740C002003 +:108B5000840C00202852020070B5FE4C21690A885E +:108B6000A1F8FC2181F8FA0191F85400012808BF0E +:108B7000012508D0022808BF022504D0042816BF0A +:108B800008280325FFDF206980F8FE5190F8550082 +:108B9000012808BF012508D0022808BF022504D0FB +:108BA000042816BF08280325FFDF2069012180F86B +:108BB000FF5180F8F811002180F8A4112079BDE858 +:108BC0007040F3F717B92DE9F04FE24C83B0A0796C +:108BD00010F0010F04BF03B0BDE8F08FA0690123BE +:108BE0000521C578206990F86520583003F0EDFE26 +:108BF00068B1A81E0A2806D2DFE800F009090505B9 +:108C0000090905050909A07840F00800A070A078BE +:108C100000281CBF03B0BDE8F08FA0694FF0200909 +:108C20004FF00208C778002F1CBF012F162F1DD14F +:108C3000206990F8640003F0B1FEB8B1216991F8A1 +:108C400064001F2812D0202808D0162F0CBF84F8EB +:108C5000029084F8028003B0BDE8F08F262081F8EE +:108C60006400162F1CBF2A20FFF776FF47F6FE7A16 +:108C7000012600254FF0280B0C2F00F03B8109DC6A +:108C800080F05F84DFE807F05A3923CCFDFDFCFB60 +:108C9000FAFD9CC3152F00F046820DDC112F00F069 +:108CA000C783122F00F0C081132F00F0B081142F62 +:108CB00000F0CE8100F045BC162F00F06782182F1F +:108CC00000F0CC82FF2F00F0358400F03ABC206920 +:108CD0000123194690F86720583003F076FE0028EB +:108CE00040F03184A06904F081FC216981F87201AF +:108CF000072081F8670000F026BC206901230021CD +:108D000090F86520583003F060FE002800F0C98319 +:108D1000A06904F068FC2169A1F88E01B1F858201F +:108D2000801A00B28245A8BF002843DD01F5C87152 +:108D3000A06904F053FC0B20216937E0206901236E +:108D4000002190F86520583003F03FFE002800F025 +:108D5000A883A06904F01EFC002800F0F283A0693B +:108D60002169B0F80D20A1F88E21B1F85830D21A3F +:108D700012B29245A8BF002A1CDD027981F8902129 +:108D8000B0F80520A1F8922104F0F7FB2169A1F8C1 +:108D90009401A06904F0F4FB2169A1F89601A0698F +:108DA00004F0F5FB2169A1F898010D2081F8650018 +:108DB00000F0C9BB81F874B081F8736000F0C3BBE8 +:108DC00020690123002190F86520583003F0FDFD53 +:108DD000002820690CD0A0F88A5090F88C10491C0B +:108DE00080F88C105FF0100180F8651000F0ABBBCC +:108DF00090F8652001230521583003F0E6FD002896 +:108E00001CBF0820A07040F09E8300F04ABB206980 +:108E100090F86510112908BF122140F0A082E3E705 +:108E200020690123002190F86520583003F0CDFD22 +:108E300080B9206990F86520122A0BD00123052102 +:108E4000583003F0C2FD002818BF082000F0298325 +:108E500000F099B9206990F88E1031B9A0F88A50C5 +:108E600090F88C10491C80F88C1000F1E801A06982 +:108E700004F0D5FB206900F1C00103E0A4E0F6E2B4 +:108E800023E05EE3A06904F0D5FB206990F8C001FF +:108E9000002818BFFFDF20690188A0F8C21100F583 +:108EA000E271A06904F0A9FB206900F5E671A069F0 +:108EB00004F0ABFB206980F8C061142180F86510D4 +:108EC0002079F2F797FF00F03EBB206990F865101B +:108ED000172940F0448290F88C10491E49B280F85E +:108EE0008C100029B8BFFFDF1B20216981F86500C5 +:108EF00000F029BB206990F8661011F0020F09D02C +:108F000090F8642001230821583003F05EFD00280A +:108F100000F0C782206990F8900010F0020F14D181 +:108F2000A06904F09BFB216981F89100A069B0F869 +:108F30000520A1F89220B0F80700A1F8940091F85C +:108F4000900040F0020081F89000206990F89010A5 +:108F500002E00000F000002011F0010F05D02069B0 +:108F600090F8641006291CD114E090F8660010F007 +:108F7000020F18BFFFDF206990F8661041F0020170 +:108F800080F86610A0F88A5090F88C10491C80F880 +:108F90008C10E4E780F8645080F888502079F2F76C +:108FA00029FF206990F88C11042940F0CC8280F8C8 +:108FB0008C512079F2F71EFF206990F86410002987 +:108FC00040F0C18200F031BA206990F8660010F0DC +:108FD000010F77D16946A06904F047FB9DF80000B6 +:108FE00000F02501206980F896109DF8011001F02D +:108FF000410180F89710A0F88A5090F88C10491C15 +:1090000080F88C1090F8661041F001011CE0206996 +:109010000123092190F86420583003F0D6FC002881 +:1090200040F0378200F03DBA206990F8661011F0E8 +:10903000040F40F03682A0F88A5090F88C2041F05E +:109040000401521C80F88C2080F8661000F07BBA76 +:10905000206990F8660010F0300F33D1A06904F059 +:1090600021FB002800F06D822769A06904F016FB3F +:1090700038872769A06904F00DFB78872769A06904 +:1090800004F00EFBB8872769A06904F005FBF88798 +:10909000A07910F0020F03D06069C078142812D0B4 +:1090A000206990F864101C290DD090F84E10012909 +:1090B0000CD090F89B11002904BF90F89A11002958 +:1090C0000CD003E05CE0206980F84E60206990F8E5 +:1090D000661041F0100180F866101AE090F86610F2 +:1090E00041F0200180F866100288A0F8E021028F8C +:1090F000A0F8E221428FA0F8E421828F00F5D6711A +:10910000A0F8E621C08F888781F832602079F2F7D5 +:1091100071FE2069A0F88A5090F88C10491C80F8E4 +:109120008C1000F010BA206901230A2190F8642005 +:10913000583003F04AFC18B3A06904F0B3FAA8B1A0 +:109140002669A06904F0AAFA30872669A06904F0AC +:10915000A1FA70872669A06904F0A2FAB08726698F +:10916000A06904F099FAF08701F000FB206980F80B +:10917000885080F8645000BF01F0C8FA00F0E3B9ED +:10918000A07840F00100A07000F0DDB92069012353 +:109190000B2190F86520583003F017FC20B100BF78 +:1091A00084F8029000F0CFB920690123002190F8E3 +:1091B0006520583003F009FC002800F07281206916 +:1091C00090F864002428EBD0A06904F086FA002807 +:1091D00000F0B781206990F8961041F0040180F802 +:1091E0009610A1694A7902F0070280F851200979A6 +:1091F00001F0070180F8501090F8A531002B04BF52 +:1092000090F8A431002B1CD190F855C000F1540304 +:109210008C4502BF1978914280F87D6011D000F52D +:10922000D67180F8F2610288A0F8F42190F85020FD +:1092300080F8F62190F8510081F84B002079F2F780 +:10924000D9FD2069212180F86510A0F88A5090F896 +:109250008C10491C80F88C1000F075B9206990F8CA +:109260006410202914BF0027012790F865102229D7 +:1092700008BF00F1650804D0002F18BF00F1640892 +:109280006DD090F8961041F0040180F89610A06916 +:1092900004F045FAF0B3D4F81890484604F033FAD5 +:1092A0000090484604F033FA814603F042FD010085 +:1092B00018D0206990F854208A4213D090F8A43135 +:1092C00023B190F8A63113EA090F4BD0002F04BF49 +:1092D00090F8513013EA090F01D18A4242D890F830 +:1092E000A401B8B1DDF80090484603F022FD78B142 +:1092F000216991F8552082420AD091F8A40120B149 +:1093000091F8A70110EA090F2CD091F8A40108B137 +:109310006A4600E026E0A169206903F019FDE8B380 +:10932000A06904F0FAF92169A1F88E01B1F858207A +:10933000801A00B28245A8BF0028DCBF81F874B053 +:1093400081F873605CDD9DF8000081F890019DF864 +:10935000010081F89101242088F8000050E084F891 +:109360000280F0E0206990F8A40100281CBF1E20B4 +:10937000FFF7F2FBB7B1A0692169C07881F8CA0094 +:1093800006FA00F010F0807F08BFFFDF0A21206995 +:1093900080F8641090F88800002800E014E008BF0E +:1093A000FFDF0DE088F80050206990F88C10491E0E +:1093B00049B280F88C100029B8BFFFDF01F08BF9AB +:1093C000206980F87D50BEE0226992F8A40170B156 +:1093D000B2F8583092F85410B2F8A80102F5C772EA +:1093E00003F0A8FDD8B12169252081F86400206927 +:1093F00000F1650180F87D50884508BF80F8655010 +:10940000206900F1650188450FD190F88C10491E44 +:1094100049B280F88C100029B8BFFFDF93E000202C +:10942000FFF79AFB88F80050E1E780F888508AE05F +:10943000206990F8961041F0040180F89610A06918 +:1094400004F089F916287ED1206990F8640020285C +:1094500002D0262805D076E0A06904F080F9FFF755 +:109460007BFB206980F8645080F888506BE02069AD +:1094700090F864200E2A03D1A1690979122902D03B +:109480001C2A1AD10FE001230921583003F09DFA5C +:1094900038B1206980F87C5080F8885080F864509A +:1094A00051E0A6704FE0A1690979142904BF80F842 +:1094B000645080F888503FF45FAE202A03D1A16940 +:1094C0000979162914D0262A03D1A1690979162908 +:1094D0000ED0A1690979172904BF90F86520222AC6 +:1094E00013D0E2691AB1FF2908BF80F886612AE02B +:1094F00080F8645080F8885090F86500212818BFE3 +:109500001A2020D0FFF728FB1DE080F8655090F866 +:109510008C10491E49B280F88C100029B8BFFFDFBB +:10952000206980F87D5090F8A401002818BF002021 +:1095300009D0E7E7E06900281CBF206980F8866150 +:1095400001D101F0C8F82069D0E92A12491C42F182 +:109550000002C0E92A1203B0BDE8F08F70B5FB4EDF +:1095600005460C46306990F8CB00FE2818BFFFDF97 +:1095700032690020002C82F8CB501CBFA2F88A0070 +:1095800070BDA2F88400012082F8880070BD30B55B +:1095900085B005466846FCF7D6F9002808BFFFDF0E +:1095A000222100980BF055FB0321009803F09AFF4D +:1095B0000098017821F010010170294603F0C0FFE6 +:1095C000E24C0D2D04BF0621009830D00BDCA5F134 +:1095D00002000B2819D2DFE800F0201863191926C1 +:1095E000187018192C00152D7BD008DC112D2DD0EA +:1095F000122D18BF132D09D0142D30D005E0162DD3 +:1096000046D0172D6BD0FF2D6AD0FFDFFCF7AEF9E7 +:10961000002808BFFFDF05B030BD2069009990F831 +:10962000CC000871F2E72169009891F8CC10017123 +:10963000ECE7E26800981178017191884171090A9C +:1096400081715188C171090A0172DFE70321009815 +:1096500004F07FF80621009804F07FF8D6E720692F +:10966000B0F84410009804F005F82069B0F84610EE +:10967000009804F003F82069B0F84010009804F056 +:1096800001F82069B0F84210009803F0FFFFBDE731 +:109690002069009A90F8A611117190F8A7014BE08B +:1096A000206900F1F001009803F0C8FF206900F183 +:1096B000C401009803F0CCFFA8E7A549D1E9000157 +:1096C000CDE90201206902A990F8960000F025007A +:1096D0008DF80800009803F0F6FF97E701E019E025 +:1096E0002CE02069B0F84010009803F0CBFF20690F +:1096F000B0F84210009803F0C9FF2069B0F8441098 +:10970000009803F0B7FF2069B0F84610009803F006 +:10971000B5FF7BE7206990F8A41139B1009990F862 +:10972000A6210A7190F8A70148716FE7009A90F896 +:109730005410117190F85500507167E7206990F846 +:109740008721D0F88811009803F008FF5EE770B514 +:109750000C4605464FF4007120460BF09CFA25801C +:1097600070BDF7F78ABB2DE9F0410D46074607218A +:10977000F7F77AFA040008BFBDE8F08194F8AC016D +:109780000026B8B16E700920287094F8AC0178B149 +:10979000268484F8AC61D4F8AE016860D4F8B201D4 +:1097A000A860B4F8B601A88194F8AC010028EFD104 +:1097B0002E7144E094F8B801002837D094F8B8012D +:1097C0000D2818D00E2818BFFFDF38D12088F7F7F2 +:1097D0007DFB0746F7F729F8A0B96E700E202870B8 +:1097E00094F8BA0128712088E88084F8B861384676 +:1097F000F7F715F823E02088F7F768FB0746F7F737 +:1098000014F810B10020BDE8F0816E700D202870B2 +:1098100094F8BA0128712088E88094F8BE01287273 +:1098200084F8B8613846F6F7FAFF08E094F8F001DA +:1098300040B16E701020287084F8F061AF80012074 +:10984000BDE8F08194F8C00190B16E700A202870D4 +:109850002088A880D4F8C401D4F8C811C5F806003F +:10986000C5F80A10B4F8CC01E88184F8C061E6E7D5 +:1098700094F8CE0140B16E701A202870B4F8D0016F +:10988000A88084F8CE61DAE794F8EA0180B16E70BE +:109890001B20287094F8EA010028D0D084F8EA61EF +:1098A000D4F8EC01686094F8EA010028F6D1C6E724 +:1098B00094F8D2012F1DA0B16E701520287094F875 +:1098C000D201002818BF04F5EA75B8D084F8D26137 +:1098D000294638460BF0EBFA94F8D2010028F5D16E +:1098E000ADE794F8DE0150B16E701D20287084F849 +:1098F000DE6104F5F07138460BF0D9FA9FE794F871 +:10990000F20138B11E20287084F8F261D4F8F40115 +:10991000686094E794F8F801002808BFBDE8F0817A +:109920006E701620287094F8F801002887D000BFC8 +:1099300084F8F861D4F8FA016860B4F8FE0128816F +:1099400094F8F8010028F3D179E70000F000002036 +:1099500040520200FE4AD0600020D06110621171B6 +:109960007047002180F8641080F8651080F8681056 +:1099700090F8DE1011B10221FEF71ABF0321FEF7A5 +:1099800017BF2DE9F047F24C814686B020690D469D +:109990000088F7F7ADFA070008BFFFDFA07828437B +:1099A000A070A0794FF0000510F0200F20691CBFB7 +:1099B000A0F87E5080F8E45004D1B0F87E10491C25 +:1099C000A0F87E102069012690F86A1039B990F845 +:1099D000652001230621583002F0F7FF48B3E088E4 +:1099E00010F4006F07D0206990F86A10002918BFA2 +:1099F000A0F876501DD12069B0F87610491C89B2C4 +:109A0000A0F87610B0F878208A422CBF531A0023B1 +:109A1000B4F808C00CF1050C634598BF80F87C6071 +:109A2000914206D3A0F8765080F8F0612079F2F7E1 +:109A3000E1F9A0794FF0020A10F0600F11D020690F +:109A400090F8681011B1032906D00AE080F8686028 +:109A50000121FEF7ADFE04E080F868A00121FEF7C9 +:109A6000A7FE206990F86810012905D1E18811F45A +:109A7000807F18BF80F868A04FF00808B9F1000F88 +:109A800040F09981E28812F4007F18BFA0F8F850E6 +:109A900004D1B0F8F810491CA0F8F81012F0080F23 +:109AA00050D0A17800294DD190F8CB00FE2808BFF6 +:109AB000FFDFFE21206980F8CB1090F8651019298E +:109AC00007D0206990F864101F2911D027292AD0C7 +:109AD0002FE080F88D5090F88C10491E49B280F824 +:109AE0008C100029B8BFFFDF206980F86550E8E7D7 +:109AF00090F8650002F052FF80B120692621012311 +:109B000080F8641090F865200B21583002F05DFF5A +:109B1000002804BF2A20FFF71FF80AE0216920204F +:109B200081F8640005E080F8856180F8645080F871 +:109B30008850206990F86710082904BF84F800A0B5 +:109B400080F8CBA0FFF73FF8A07910F0040F07D002 +:109B5000A07828B9206990F86700072808BF267008 +:109B600000F038FCA07910F0100F09D0A07838B9B7 +:109B7000206990F865100B2904BF0C2180F865104E +:109B8000E07810F0080F11D020690123052190F82A +:109B90006520583002F019FF28B184F8028020694E +:109BA00080F8B85102E0002001F02AFBE0690028AB +:109BB0005BD000950195029503950495206990F876 +:109BC0005500FBF723FE4FF47A7100F5FA70B0FBF5 +:109BD000F1FA206990F85500FBF706FE5044ADF805 +:109BE000060020690188ADF80010B0F85810ADF8F3 +:109BF00004104188ADF8021090F8860130B1A069D8 +:109C0000C11C039103F058FC8DF81000206990F8F6 +:109C100085018DF80800E16968468847206980F869 +:109C2000865180F885510399F9B190F88411E1B912 +:109C300090F86410272918D09DF81010039AA1B14C +:109C40001378FF2B06D0072B02BF02295178FF297A +:109C500002D00AE01B2908D880F884610399C0F873 +:109C600088119DF8101080F8871100F0CCFD01F0EC +:109C7000BDFA0028206918BFA0F8D85004D1B0F868 +:109C8000D810491CA0F8D81001F0B3FA40B12169EE +:109C900091F8E40002289CBF401C81F8E40004D83D +:109CA000206990F8E400022806D92069A0F8D8506D +:109CB000A0F8DA5080F8E45020690123002190F8E0 +:109CC0006520583002F081FE20B9206990F86500C7 +:109CD0000C285AD120690123002190F864205830C3 +:109CE00002F073FEB0B320690123002190F86720D1 +:109CF000583002F06AFE68B3206990F868100229B3 +:109D000004BF90F8E40000283FD13846F6F75DFB29 +:109D100000B3206990F8CB10FE2936D1B0F8D210EC +:109D2000012932D980F8DD60B0F88010B0F87E20CB +:109D30008B1E9A42AFBF0121891A491E89B2B0F821 +:109D4000D82023899A422EBF01229A1A521C02E07F +:109D5000F000002019E038BF92B2914288BF11464E +:109D6000012908BF80F8DD5090F868218AB1B0F869 +:109D7000DA20B0F86A0182422FBF0120801A401C0D +:109D800080B2814288BF014603E02069012180F84A +:109D9000DD502069B0F85820114489B2A0F8D410E1 +:109DA00090F86830002B18BF012B5DD0022B1CBF30 +:109DB000032BFFDF09D0E088C0F340200028206992 +:109DC00018BFA0F8E65059D151E090F86730082B41 +:109DD00021D0B0F87E10B0F8802000278B1C9A426A +:109DE00006D3511A891E0F043F0C1CBF791E8FB277 +:109DF00090F87C1051B190F864200123092158306B +:109E000002F0E3FD002808BF002729D0206990F860 +:109E10006A1089B908E0B0F87E30032B24D3B0F87B +:109E200080101144491C1FE090F865200123062191 +:109E3000583002F0CAFD78B121690020B1F87820CD +:109E4000B1F876108B1C9A4203D3501A801E18BFAB +:109E5000401EB84238BF87B2002F1CBF781E87B2A1 +:109E60002069B0F8D4103944A0F8D010A3E7B0F8B6 +:109E7000E610B0F8D6201144A0F8E610206990F85A +:109E8000701139B990F8672001231946583002F053 +:109E90009CFD38B12069B0F88210B0F8D62011448A +:109EA000A0F88210206990F8883033B1B0F884109F +:109EB000B0F8D6201144A0F8841090F98C20002A24 +:109EC00006DDB0F88A10B0F8D6C06144A0F88A1058 +:109ED0004FF03D0CB9F1000F18BF80F874C049D1A4 +:109EE0002178022911D0012908BF90F872113FD0C2 +:109EF000A17821B380F8736011F0140F18BF1E21F0 +:109F000009D000BF80F8741050E090F8CC100629FA +:109F100018BF16212CE011F0080F18BF80F874C08C +:109F200044D111F0200F18BF2321EBD111F0030F02 +:109F300008BFFFDF2A20216981F8740032E02BB1CD +:109F4000B0F88410B0F88630994210D2002A05DDAE +:109F5000B0F88A10B0F88620914208D2B0F882207A +:109F6000B0F880108A4208D390F870212AB12221DB +:109F700080F8741080F8736018E090F868203AB1A7 +:109F8000B0F87E208A4228BF80F87480F2D209E0BF +:109F9000B0F87E10062905D33E2180F8741080F8B1 +:109FA000736003E0206990F8731079B1206980F83C +:109FB000645080F8655080F8685090F8DE100029F1 +:109FC00014BF02210321FEF7F3FB02E00021FEF79C +:109FD000EFFB206980F8DE5006B0BDE8F047FBF7E4 +:109FE000E7BCF84902468878CB78184313D1084675 +:109FF00000694AB1897911F0080F03D090F8670021 +:10A00000082808D001207047B0F84810028E91420D +:10A0100001D8FEF709BB0020704770B5E94C054632 +:10A020000E46E0882843E08015F0020F04D015F0BA +:10A03000010F18BFFFDF666115F0010F4FF000023E +:10A040004FF001001AD0A661F178062902D00B2941 +:10A050000BD013E0216991F86530172B0ED1002346 +:10A06000C1E9283381F8690008E0216991F8653079 +:10A07000112B04BF81F8692081F88E0015F0020FC2 +:10A0800018D06169C978052902D00B290BD011E0DD +:10A09000216991F86520152A0CD10022C1E92A22F4 +:10A0A00081F86A0006E0206990F86510102908BF61 +:10A0B00080F86A2015F0800F1CBF0820E07070BD8A +:10A0C0002DE9F84FBF4C00254FF00108E580A57041 +:10A0D000E5702570206168F30709074680F8DE8087 +:10A0E0000088F6F705FF5FEA000A08BFFFDF206976 +:10A0F0000088FBF725FC20690088FBF747FC2069F6 +:10A10000B0F8D21071B190F8CB10FE290FD190F8B1 +:10A11000701189B190F8672001231946583002F078 +:10A1200054FC88B1206990F8CB00FE2804D0206947 +:10A1300090F8CB00FFF72BFA206990F8DF10002988 +:10A1400018BF25811BD10FE02069A0F8825090F83C +:10A15000711180F8CC1000210220FFF7FFF920696F +:10A1600080F8DD500220E5E790F8AC1129B9018CA8 +:10A170008288914288BF218101D881882181B0F8ED +:10A18000D610491E8EB2B0F8D8103144A0F8D810BD +:10A1900090F8DC1000291CBFA0F8DA5080F8DC50E1 +:10A1A00004D1B0F8DA103144A0F8DA10B0F87E101B +:10A1B0003144A0F87E1090F86A1039B990F8652003 +:10A1C00001230621583002F000FC28B12069B0F8C4 +:10A1D00076103144A0F876102069B0F8D210012929 +:10A1E0009CBF491CA0F8D210002E18BF80F8E45084 +:10A1F00090F8DD10A1B1B0F8D800218988420FD2C3 +:10A200005046F6F7E2F858B1206990F8681139B174 +:10A21000B0F8DA10B0F86A01814228BF00F0ECFF14 +:10A22000206980F8DD5090F865100B2918BF0C29C3 +:10A2300016D1B0F85820B0F88E31D21A12B2002AD6 +:10A240000EDBD0F89011816090F894110173022117 +:10A2500001F0A8FF206980F8655080F898804AE0F6 +:10A26000242924D1B0F85810B0F88E21891A09B2E7 +:10A2700000291CDB90F8A42190F89011002908BF58 +:10A2800090F8541080F8541090F89111002908BFEC +:10A2900090F8551080F85510002A1CBF0020FEF7DA +:10A2A0005BFC206980F8655080F87D5023E090F8D1 +:10A2B0006410242918BF25291DD1B0F85810B0F812 +:10A2C0008E21891A09B2002915DB90F89011002916 +:10A2D00008BF90F8541080F8541090F8911100299C +:10A2E00008BF90F8551080F855100020FEF734FC98 +:10A2F000206980F86450216901F15800B1F8D62036 +:10A3000002F026F9206990F86811002918BFA0F81A +:10A31000DA502D4800902D4B2D4A3946484600F022 +:10A32000B3FE216A00291CBF6078FAF789FF206913 +:10A330000123052190F86520583002F046FB0028E3 +:10A3400008BFBDE8F88FBDE8F84F00F08EBC00F004 +:10A3500033BF1C49C86170471A48C069002818BF3C +:10A3600001207047174A50701162704710B50446BB +:10A37000B0F894214388B0F89611B0F898019A4249 +:10A3800001BFA3889942E38898420FD02388A4F89C +:10A39000B031A4F8B221A4F8B411A4F8B601012098 +:10A3A00084F8AC0107480079F1F724FD012120462B +:10A3B00001F0F8FE002084F86500032084F86800AE +:10A3C00010BD0000F000002083990100E39F010010 +:10A3D0001BA0010070B5FE4CA07910F0020F08BF61 +:10A3E00070BDA078002818BF70BD6169F8482722A9 +:10A3F000CB780E26002500690D2B78D00BDCA3F15D +:10A4000002030B2B1FD2DFE803F0201E808B9F2F4F +:10A410001E591E73D100152B00F02A810BDC112B65 +:10A4200065D0122B00F0F480132B00F0FF80142B6A +:10A4300000F00E8107E0162B00F03281172B00F0A0 +:10A440003F81FF2B35D0FFDF70BD90F867200123DF +:10A450001946583002F0B9FA002818BF70BD08201C +:10A46000216981F8670070BD90F8643009790A2B82 +:10A4700001BF90F8CA308B4280F8645080F8885051 +:10A4800008BF70BD90F8663013F0080F0DD023F0B0 +:10A49000080180F8661090F88C10491E49B280F8C7 +:10A4A0008C100029A8BF70BDCFE0FF291CBFFFDFC3 +:10A4B00070BD80F8642080F8845170BD90F866000B +:10A4C00010F0010F08BFFFDF216991F88C00401EDA +:10A4D00040B281F88C000028B8BFFFDF206990F8F7 +:10A4E000661021F0010100BF80F8661070BD21E008 +:10A4F00090F86500102818BFFFDF0121206980F85F +:10A500008D10112180F8651070BD90F86500142839 +:10A5100018BFFFDF0121206980F88D101521F1E7B8 +:10A5200090F86500152818BFFFDF1720216981F812 +:10A53000650070BD90F86500152818BFFFDF192071 +:10A54000216981F8650070BD90F865001B2818BF6F +:10A55000FFDF206980F88D5090F8B801002818BFFF +:10A56000FFDF206990F88E1049B180F88E50018885 +:10A57000A0F8BC1180F8BA5180F8B8610AE00188EF +:10A58000A0F8BC1180F8BA51012180F8BE110D214C +:10A5900080F8B8110088F6F799FCF6F731F92079C0 +:10A5A000F1F728FC206980F8655070BD90F88C1197 +:10A5B000042915D0206990F8661011F0020F08BF29 +:10A5C00070BD90F88C10491E49B280F88C1000299B +:10A5D000B8BFFFDF206990F8661021F0020183E721 +:10A5E00090F8642001230021583002F0EEF9002891 +:10A5F00008BFFFDF206990F8901011F0020F07BF2D +:10A60000062180F8641080F8885080F88C51D1E7DA +:10A6100090F8642001230021583002F0D6F9002878 +:10A6200008BFFFDF206980F8646070BD90F8661095 +:10A6300021F0040180F8661090F88C10491E49B290 +:10A6400080F88C100029A8BF70BDFFDF70BD00BF6F +:10A6500090F8642001230021583002F0B6F9002858 +:10A6600008BFFFDF1C20216981F8640070BD00BFB6 +:10A6700090F8660000F03000102818BFFFDF206956 +:10A6800090F8661021F0100180F8661090F88C1098 +:10A69000491E49B280F88C100029A8BF70BDD4E7CC +:10A6A00090F8642001230021583002F08EF9002830 +:10A6B00008BFFFDF1F20216981F8640070BD00BF63 +:10A6C00090F8650021281CBF0028FFDF22202169A7 +:10A6D00081F8650070BD3E49086990F8662012F067 +:10A6E000080F1EBF01208870704742F0080280F8F2 +:10A6F00066208969C97880F8C9100021A0F88A10FD +:10A7000090F88C10491C80F88C10704710B5304CB4 +:10A7100005212069FEF74CF8206990F84E100129B8 +:10A7200002BF022180F84E1010BD00F5D6710288DC +:10A73000A0F8D421028EA0F8D621828EA0F8D821CC +:10A74000028FB0F844309A4228BF1A46CA85828FD9 +:10A75000B0F84600824238BF10460886012081F8D2 +:10A7600026002079BDE81040F1F744BB184830B40A +:10A77000006990F84E30B0F832C0C48EB0F8401086 +:10A78000428F022B28D08A4238BF11460186C28FE1 +:10A79000B0F842108A4238BF11468186028FB0F865 +:10A7A00044108A4238BF11464186828FB0F8461065 +:10A7B0008A4238BF1146C186418E614588BF8C46AA +:10A7C000A0F832C0C18EA14288BF0C46C48601E009 +:10A7D000F000002030BC7047038E9A4228BF1A4612 +:10A7E000C58F838E9D4238BF2B468A4238BF1146A3 +:10A7F0000186B0F842108B4228BF0B4683860021A9 +:10A8000080F84E10CAE770B5FD4C206990F8CB1067 +:10A81000FE2906BFA178002970BD90F867200123AA +:10A820001946583002F0D1F8002818BF70BD2069D1 +:10A83000002590F8701159B1A0F8825090F871116C +:10A8400080F8CC10BDE8704000210220FEF786BEE3 +:10A8500090F8652001230421583002F0B6F8060074 +:10A860000CD0D4F810C09CF86500102861D01428D2 +:10A8700065D015287BD01B287ED0BEE0216991F8D9 +:10A88000660010F0010F05D0BDE8704001210920DD +:10A89000FEF764BE10F0020F0BD001210C20FEF772 +:10A8A0005DFE206990F8901041F0010180F8901051 +:10A8B00070BD10F0040F05D0BDE8704001211320D9 +:10A8C000FEF74CBE10F0080F09D091F8C90081F8CE +:10A8D000CC00BDE8704001210720FEF73FBE10F01C +:10A8E000100F02D091F89B0120B191F8650021284A +:10A8F00073D179E091F89A0188B1B1F89C01A1F87F +:10A900004000B1F89E01A1F84200B1F8A001A1F801 +:10A910004400B1F8A201A1F8460081F89A51FFF76E +:10A9200025FFFFF7F3FEBDE8704001211520FEF77B +:10A9300015BEBDE8704001210B20FEF70FBEF9F7F0 +:10A94000F7FA0C2838BF70BD08212069F030F9F7FC +:10A95000F3FA28B120690421C430F9F7EDFA00B9FF +:10A96000FFDFBDE8704001210420FEF7F7BD9CF831 +:10A97000730101280DD000E030E0022818BF70BD3F +:10A980009CF88E00D8B106208CF8CC000121022062 +:10A990001DE09CF8B801002818BF70BD0CF1B00391 +:10A9A00000220CF1E8010CF5BA7001F08AFF0121D8 +:10A9B0000520FEF7D3FD206980F8735170BD9CF827 +:10A9C000960010F0040F14BF11200D200121FEF796 +:10A9D000C5FD206980F8735170BD0EE0BDE8704080 +:10A9E00001210620FEF7BABD91F87D00C0B991F8AB +:10A9F000A40110B191F8A50190B1206901230021B3 +:10AA000090F86420583001F0E0FFC8B120690123BC +:10AA1000042190F86520583001F0D7FF30B10FE0E5 +:10AA2000BDE8704001211720FEF798BD206990F81D +:10AA30007C0028B1BDE8704000211220FEF78EBDD9 +:10AA4000206990F864200A2A2BD0002E18BF70BD10 +:10AA500001230021583001F0B8FF48B1206990F877 +:10AA60008C11042904BF90F8900010F0030F22D03D +:10AA700020690123002190F86420583001F0A5FFDF +:10AA800000287DD0206990F89A1111B190F89B119F +:10AA9000E9B190F8A411002972D090F8A511E9B39A +:10AAA000BDE090F8CA1080F8CC10BDE870400021DD +:10AAB0000720FEF753BD00210C20FEF74FFD206953 +:10AAC00090F8901041F0010180F8901070BDB0F83E +:10AAD0009C11A0F84010B0F89E11A0F84210B0F8F8 +:10AAE000A011A0F84410B0F8A211A0F8461080F808 +:10AAF0009A5190F8660010F0200F13D0FFF736FE41 +:10AB0000FFF704FE01211520FEF728FD206990F8CB +:10AB1000661021F0200141F0100100E008E080F80B +:10AB2000661070BDBDE8704000211420FEF716BD10 +:10AB300090F8652001230B21583001F046FFF8B949 +:10AB4000206990F85400012808BF012508D0022888 +:10AB500008BF022504D0042816BF08280325FFDFFC +:10AB6000206990F85500012808BF01260BD0022863 +:10AB700008BF022607D0042814BF0828032600E0D7 +:10AB80004DE018BFFFDFD4F810C0012D9CF8A601DE +:10AB900006D0022D07D0032D08BF042805D014E0ED +:10ABA000012812D101E002280FD19CF8A701012E43 +:10ABB00006D0022E07D0032E08BF04280FD004E0D1 +:10ABC000012802D10BE0022809D09CF8652001235E +:10ABD00003210CF1580001F0F8FE00BB16E0BCF8B0 +:10ABE00058309CF85410BCF8A8010CF5C77202F05C +:10ABF000A1F938B12169252081F8640070BD0000F9 +:10AC0000F00000200020FDF7A7FF08E020690123E5 +:10AC1000022190F86520583001F0D7FEB0B12069CC +:10AC20000123002190F86420583001F0CEFE002866 +:10AC300008BF70BD206990F88401002808BF70BD6E +:10AC40000021BDE87040FF20FEF788BCBDE87040E1 +:10AC500000211620FEF782BC30B5FB4C054620785B +:10AC6000002818BFFFDF657230BDF7490120087268 +:10AC700070472DE9F14FF54F39464D68284695F854 +:10AC8000551001F048FF95F8551080B211F00C0FE7 +:10AC90006FF00D0B7DD0B0F5747F38BF002006D368 +:10ACA0005038C11700EB91600BEBA01080B26E8E94 +:10ACB000864228BF0646E648DFF88C93C9F8240090 +:10ACC000786800F15808044609F13400678E40683E +:10ACD00094F8551090F86AA0204601F01CFF94F8F3 +:10ACE000551080B211F00C0F69D0B0F5747F38BFE9 +:10ACF000002406D35038C21700EB92600BEBA01073 +:10AD000084B2A74238BF3C46BAF1000F1CBF201DD9 +:10AD100084B2E0B2F9F7E8FE98F81200002859D0A2 +:10AD200008F15801CA4891E80E1000F5027484E851 +:10AD30000E10D8F86810C0F82112D8F86C10C0F8BE +:10AD4000251200F58170FAF711FAC0480078002842 +:10AD50000CBF0120002080F00101BE480176D8E937 +:10AD60001412C0E90412A0F58372D9F82410F9F77F +:10AD700060FD95F85500012808BF00220ED002287A +:10AD800008BF01220AD0042808BF032206D00828E1 +:10AD900000E008E01ABFFFDF00220222F1B201202A +:10ADA000F9F762FD1CE0022919BF0BEBD00080B25D +:10ADB0006FF00E0101EB90007FF479AF76E7022986 +:10ADC00019BF0BEBD00084B26FF00E0202EB9000C3 +:10ADD00097D195E7D9F82400FAF7C8F9F9F767FD94 +:10ADE000009850B195F82C00012808BFFAF791FAA5 +:10ADF000022089F80000BDE8F88F012295F855304F +:10AE000096211046FAF791F895F8550095F85610E6 +:10AE100010F00C0F08BF00219620FAF7C2F9E1E705 +:10AE20002DE9F04FDFF8248283B0414681464D681A +:10AE3000A1F11400009095F85D0005F15806012776 +:10AE4000A1F1340470B3012878D0022877D0032808 +:10AE500018BFFFDF74D0206A0823017821F00801B1 +:10AE60000170B27903EAC202114321F004010170BA +:10AE7000F279042303EA8202114321F010010170E8 +:10AE800096F805B0E06AF5F7B0FA8246FAF7A2FD47 +:10AE9000BBF1020F79D0BBF1010F77D0BBF1030FEB +:10AEA00075D089E000F0CAFB0146284601F044FE57 +:10AEB0001FFA80FB00F0C2FB10F00C0F6FF00D01C9 +:10AEC0004FF0000A20D0BBF5747F38BF504607D33F +:10AED000ABF15000C21700EB926001EBA01080B202 +:10AEE000298E814238BF0846ADF80800A5F8480011 +:10AEF0000098FAF74EFD90B1216AA77062694FF48D +:10AF00008060904703202CE0022819BF01EBDB0092 +:10AF100080B26FF00E0000EB9B00E1D1DFE701AAE9 +:10AF200002A9E06AF5F79CF9206210B196F8351095 +:10AF300039B10098FAF701FD77718CE713E016E05C +:10AF400026E09DF8041031B9A0F800A080F802A016 +:10AF5000012102F0C7FABDF80810206A02F001FCD6 +:10AF60000220707177E70098FAF7E7FC73E7B5F80D +:10AF70004800ADF8000001AA6946E06AF5F770F9EB +:10AF80002062002808BFFFDF65E708E00BE00EE065 +:10AF90000098FAF7FEFC002808BFFFDF5BE730EA05 +:10AFA0000A0009D106E030EA0A0005D102E0BAF150 +:10AFB000000F01D0012100E00021206A027842EA5E +:10AFC00001110170717C00291CBF7179012943D0E6 +:10AFD00006F158011E4891E80E1000F5027A8AE841 +:10AFE0000E10B16EC0F82112F16EC0F8251200F5F6 +:10AFF0008170FAF7BBF898F8000000280CBF012117 +:10B00000002114480176D6E91212C0E90412A0F515 +:10B010008371226AF9F70DFC95F85400012808BFE6 +:10B0200000220CD0022808BF012208D0042808BF43 +:10B03000032204D008281ABFFFDF00220222FB21CE +:10B040000020F9F711FC0BE014010020480100205A +:10B05000C80C0020D00E0020FAF788F8F9F727FC7A +:10B06000B9F1000F06D195F8543001229621002045 +:10B07000F9F75BFF6771206A0188E18180782074AD +:10B08000277003B0BDE8F08F2DE9F0471C46174646 +:10B0900081460D46FE4EDDF82080307828B9002F1D +:10B0A0001CBF002CB8F1000F00D1FFDFC6F81C80D8 +:10B0B000C6E90574C6E90D9500243472F471347143 +:10B0C000F4707471B471B470B481F24F05F1580822 +:10B0D0002888F5F70DFFF0622888F5F7F7FE306352 +:10B0E000F9F725FD95F95700F9F7B1FD05F11200C3 +:10B0F000FAF725F805F10E00F9F7B3FD38780028C6 +:10B100000CBF03200120FAF72EF898F81A00F9F77F +:10B11000B0FDFAF722F83878002804BFFF2095F830 +:10B12000545023D098F81260B5F8328095F8551035 +:10B13000284601F0F0FC95F8555080B215F00C0F40 +:10B140006FF00D0126D0B0F5747F06D35038C217CA +:10B1500000EB926001EBA01084B24046A04528BFEE +:10B160002046002E1CBF001D80B2C0B22946F9F750 +:10B17000BBFC38782A464FF00001B0B10120F9F746 +:10B18000A2FE7868D0F8E000F9F7F3FFBDE8F047D9 +:10B1900001206EE5022D19BF01EBD00084B26FF0E3 +:10B1A0000E0101EB9000D8D1D6E70020F9F78BFE15 +:10B1B000BDE8F047012033E6B64800B501783438E1 +:10B1C000007819B1022818BFFFDF00BD012818BFA1 +:10B1D000FFDF00BDAE4810B50078022818BFFFDFC2 +:10B1E000BDE8104000F0CCBA00F0CABAA8484079D7 +:10B1F0007047A74800797047A549012088717047BA +:10B200002DE9F0470600A348A14D406800F158041D +:10B21000686A90F8019018BF012E03D1296B09F0DC +:10B22000BBF96870687800274FF00108A0B10128C9 +:10B230003CD0022860D003281CBFFFDFBDE8F087A8 +:10B24000012E08BFBDE8F087286BF5F7C3FA687ACE +:10B25000BDE8F047F0F7CEBD012E14D0A86A002853 +:10B2600008BFFFDF6889C21CD5E9091009F072FC2C +:10B27000A86A686201224946286BF5F727F9022E71 +:10B2800008BFBDE8F087D4E91401401C41F100017A +:10B29000C4E91401E079012801D1E77101E084F8E3 +:10B2A0000780687ABDE8F047F0F7A4BD012E14D0FE +:10B2B000A86A002808BFFFDF6889C21CD5E9091009 +:10B2C00009F048FCA86A686200224946286BF5F735 +:10B2D000FDF8022E08BFBDE8F087D4E91410491C20 +:10B2E00040F10000C4E91410E07901280CBFE771B7 +:10B2F00084F80780BDE8F087012E06D0286BF5F7AB +:10B3000069FA022E08BFBDE8F087D4E91410491C81 +:10B3100040F10000C4E91410E0790128BFD1BCE776 +:10B320002DE9F0415B4F3846A7F13404406800F145 +:10B3300058052078012818BFFFDFA878012648B1FA +:10B340000021A970A670626904209047387800280F +:10B3500018BF2E71206A0321007831EA000004BF73 +:10B36000E878002805D1EE70216AA6706269022093 +:10B3700090470121002000F022FA18B1BDE8F04109 +:10B3800000F0FEB9BDE8F041002072E42DE9F14F74 +:10B39000404E4FF000083046A6F134054068317841 +:10B3A00000F1580A2878C146022818BFFFDFA88993 +:10B3B00040F40070A88171683078FF2091F8541033 +:10B3C000F9F792FB009800289AF8120000F0FD802F +:10B3D000F9F792FAF9F780FA012788B99AF812007A +:10B3E00070B1686A417859B100789AF80710C0F3D3 +:10B3F000C000884204D1EF70BDE8F84F00F0C0B93A +:10B40000686A41786981002908BFC5F8288003D09F +:10B41000286BF5F715F8A862A88940F02000A881EC +:10B4200085F804803078706800F1580B044690F875 +:10B430002C0001281AD1F9F762FF5946204601F085 +:10B4400080FA98B13078002870680CBF00F58A70D7 +:10B4500000F5F570218841809BF8081001719BF878 +:10B46000091041710770687AF0F7C4FC686A9AF8AD +:10B4700006100078C0F3800088423BD030787068B6 +:10B4800000F1580490F85D0080B302284CD003E02E +:10B49000140100204801002084F80580307800283D +:10B4A0001CBF2079002806D084F80480AF706A6938 +:10B4B000414610209047E07890B184F80380FAF775 +:10B4C00077FA002808BFFFDF0820AF706A69002103 +:10B4D0009047D4E91202411C42F10000C4E9121065 +:10B4E000A07901280CBF84F80680A771A88940F4D0 +:10B4F0008070A881686A9AF807300178C1F3C002A9 +:10B500009A424FD13278726801F0030102F1580477 +:10B51000012918BF022932D003291CBFE87940F065 +:10B52000040012D0E8713DE0E86AF4F7C5FE002897 +:10B5300008BFFFDFD4E91210491C40F10000C4E944 +:10B540001210687AF0F756FCA1E701F0E3FF90B122 +:10B55000A770A989384641F40061A981696AAF7072 +:10B560006A699047E079012803D100BF84F8078019 +:10B5700018E0E77116E0E87940F01000D2E7407873 +:10B58000F8B1A98941F40061A981A96A51B1FB28E8 +:10B59000F1D8287A002808BFB94603D080206A690C +:10B5A000002190470120009900F009F9B0B1B9F1EC +:10B5B000000F1CBF0020FFF723FEBDE8F84F00F08E +:10B5C000DFB8E0790128D4D1D0E7002818BFF9F717 +:10B5D000CCF9A88940F04000A881E3E7B9F1000F59 +:10B5E0001CBF0120FFF70CFE0020FFF719FCB9F18A +:10B5F000000F08BFBDE8F88F0220BDE8F84FFFE557 +:10B6000070B50D4606468E488D4900784C6850B19D +:10B61000F9F7FEF9034694F8542029463046BDE870 +:10B620007040FDF7EAB9F9F7F3F9034694F85420AE +:10B6300029463046BDE8704005F088BF804830B4E8 +:10B6400090F800C04268406802F1580192F86450D6 +:10B6500090F85400242D1CBF4B7B242B24D00821B0 +:10B6600001241F2D18BF202D47D0222B1CBF30BC1A +:10B67000704700BFBCF1000F04BF30BC704792F8A8 +:10B68000A63192F851201A4012F0040F5FD008281A +:10B6900018BF04286ED0082918BF04296AD00128D1 +:10B6A00018BF012969D062E0BCF1000F12D092F8F6 +:10B6B0009011002904BF30BC7047082818BF042827 +:10B6C00058D0082918BF042954D0012818BF0129CF +:10B6D00053D04CE092F8F210002904BF30BC704700 +:10B6E000082818BF042845D0082918BF042941D0CC +:10B6F000012818BF012940D039E0222BBAD0BCF173 +:10B70000000F04BF30BC704792F8A62112F0040F5E +:10B710000CD0082818BF04282CD0082918BF0429E9 +:10B7200028D0012818BF012927D020E012F0010FEE +:10B7300018BF2146EDD112F0020F04BF30BC704794 +:10B74000082818BF042815D0012816D00FE012F0E1 +:10B75000010F18BF21469AD112F0020F04BF30BC6E +:10B760007047082818BF042804D0012805D030BC31 +:10B770000220704730BC0820704730BC0120704761 +:10B780002F4910B54C68F9F799FDF9F74DFDF9F718 +:10B790007DFCF9F7DAFCF9F78AF894F82C00012817 +:10B7A00008BFF9F7ACFD274C00216269A0899047DA +:10B7B000E269E179E07890470020207010BD70B513 +:10B7C000204C0546002908BF012D05D12079401CD9 +:10B7D000C0B22071012831D8A169284688470028C5 +:10B7E0002CD0A179184839B1012D01BF4178002929 +:10B7F000017811F0100F21D0E179F9B910490978D9 +:10B80000002908BF012D05D000290CBF012100210E +:10B81000294311D10D49097811F0100F04BF0078A8 +:10B8200010F0100F0AD0A07840B9A06A20B9608942 +:10B8300010B111F0100F01D0002070BD012070BDBB +:10B840004801002014010020C80C00202201002023 +:10B8500010B540F2C311F74809F0FBF9FF220821A7 +:10B86000F54809F0EEF9F548002141704FF4617197 +:10B87000418010BD2DE9F0410E46054600F046FB23 +:10B88000EC4C102816D004EBC00191F84A0110F0DE +:10B89000010F1CBF0120BDE8F081607808283CBF83 +:10B8A000012081F84A011CD26078401C60700120A0 +:10B8B000BDE8F0816078082813D222780127501C57 +:10B8C000207004EBC2083068C8F84401B088A8F8BA +:10B8D0004801102A28BFFFDF88F8435188F84A71D1 +:10B8E000E2E70020BDE8F081D2480178491E4BB262 +:10B8F000002BB8BF704770B45FF0000500EBC301C8 +:10B9000091F84A1111F0010F3BD04278D9B2521E82 +:10B91000427000EBC10282F84A5190F802C0002246 +:10B92000BCF1000F0BD9841894F803618E4202D148 +:10B93000102A26D103E0521CD2B29445F3D80278E3 +:10B94000521ED2B202708A421BD000EBC20200EB40 +:10B95000C10CD2F84341CCF84341D2F84721CCF88E +:10B960004721847890F800C00022002C09D986185D +:10B9700096F8036166450AD1102A1CBF024482F87A +:10B980000311591E4BB2002BB8DA70BC7047521C21 +:10B99000D2B29442EBD8F4E72DE9F05F1F4690460F +:10B9A0000E46814600F0B2FAA24D0446102830D06F +:10B9B000A878002100280ED96A1892F80331A34212 +:10B9C00005D110291CBF1220BDE8F09F03E0491CDF +:10B9D000C9B28842F0D8082834D2102C1CD0AE78D6 +:10B9E0001022701CA87005EB061909F103004146EE +:10B9F00000F056FF09F183001022394600F050FF95 +:10BA0000A819002180F8034180F83B110846BDE8E1 +:10BA1000F09FA878082815D22C78CA46601C287098 +:10BA200005EBC4093068C9F84401B0884FF0000B39 +:10BA3000A9F84801102C28BFFFDF89F843A189F835 +:10BA40004AB1CCE70720BDE8F09F70B4794881780F +:10BA5000491E4BB2002BBCBF70BC704703F0FF0CFB +:10BA60008178491ECAB2827050FA83F191F80311AD +:10BA700094453ED000EB021500EB0C14D5F80360A2 +:10BA8000C4F80360D5F80760C4F80760D5F80B6008 +:10BA9000C4F80B60D5F80F60C4F80F60D5F8836068 +:10BAA000C4F88360D5F88760C4F88760D5F88B60E8 +:10BAB000C4F88B60D5F88F50C4F88F50851800EB10 +:10BAC0000C0402EB420295F803610CEB4C0C00EB0A +:10BAD000420284F8036100EB4C0CD2F80B61CCF805 +:10BAE0000B61B2F80F21ACF80F2195F83B2184F8D7 +:10BAF0003B2100EBC10292F84A2112F0010F33D131 +:10BB000090F802C00022BCF1000F0BD9841894F801 +:10BB100003518D4202D1102A26D103E0521CD2B229 +:10BB20009445F3D80278521ED2B202708A421BD0DA +:10BB300000EBC20200EBC10CD2F84341CCF8434108 +:10BB4000D2F84721CCF84721847890F800C0002231 +:10BB5000002C09D9851895F8035165450BD1102A99 +:10BB60001CBF024482F80311591E4BB2002BBFF6D2 +:10BB700075AF70BC7047521CD2B29442EAD8F3E75A +:10BB80002E49487070472D484078704738B14AF2C6 +:10BB9000B811884203D82949488001207047002005 +:10BBA000704726484088704710B500F0AFF910285C +:10BBB00014D0204A0146002092F802C0BCF1000FC8 +:10BBC0000CD9131893F803318B4203D1102818BFF6 +:10BBD00010BD03E0401CC0B28445F2D8082010BD5F +:10BBE00014498A78824286BF01EB0010833000201E +:10BBF000704710498A78824286BF01EB0010C01C52 +:10BC0000002070470B4B93F802C084459CBF002076 +:10BC10007047184490F8030103EBC00090F84331DB +:10BC20000B70D0F844111160B0F8480190800120E9 +:10BC300070470000F80E00205A010020500100203B +:10BC4000FE4A114491F80321FD490A7002684A60D6 +:10BC500080880881704710B5F8F79AFD002804BF66 +:10BC6000FF2010BDBDE81040F8F7B8BDF3498A7851 +:10BC700082429CBF00207047084490F8030101EB0A +:10BC8000C00090F84A0100F0010070472DE9F0472C +:10BC9000EA4F0026B0463878002886BF4FF0080AE1 +:10BCA000DFF8A093BDE8F08707EBC80505F5A271A2 +:10BCB00095F8430100F02AF9102808BF544610D027 +:10BCC000B978002400290BD93A1992F8032182424D +:10BCD00002D1102C05D103E0621CD4B2A142F3D8EA +:10BCE0000824B878A04286BF07EB0410C01C0020CF +:10BCF00095F84A1111F0010F16D050B1082C04D25A +:10BD0000391991F83B11012903D0102100F0A5FD4C +:10BD100050B109F806403046731C95F8432105F5EB +:10BD2000A271DEB2F8F76BFF08F1010000F0FF0826 +:10BD300038784045B8D8BDE8F0872DE9F041BF4CD0 +:10BD400000263546A07800288CBFBE4FBDE8F081A4 +:10BD50006119C0B291F80381A84286BF04EB0510B7 +:10BD6000C01C002091F83B11012903D0102100F0E4 +:10BD700074FD58B104EBC800BD5590F8432100F59F +:10BD8000A2713046731CDEB2F8F739FF681CC5B2E9 +:10BD9000A078A842DCD8BDE8F08110B5F8F759FFCB +:10BDA000002804BF082010BDF8F757FFA549085C1C +:10BDB00010BD0A46A24910B5497841B19F4B997808 +:10BDC00029B10244D81CF8F780FC012010BD0020E6 +:10BDD00010BD9A4A01EB410102EB41010268C1F832 +:10BDE0000B218088A1F80F0170472DE9F041934D98 +:10BDF00007460024A878002898BFBDE8F081C0B2AB +:10BE0000A04213D905EB041010F183060ED01021C7 +:10BE1000304600F022FD48B904EB440005EB400039 +:10BE200000F20B113A463046F9F751FE601CC4B2DD +:10BE3000A878A042E3D8BDE8F081014610228248EC +:10BE400000F02EBD8048704770B57C4D0446A87840 +:10BE5000A04206D905EB04101021833000F0FDFC50 +:10BE600008B1002070BD04EB440005EB400000F277 +:10BE70000B1070BD71498A78824206D9084490F847 +:10BE80003B01002804BF01207047002070472DE9C6 +:10BE9000F0410E46074615460621304600F0DDFC0F +:10BEA000664C98B1A17871B104F59D7011F0010F45 +:10BEB00018BF00F8015FA178490804D0457000F868 +:10BEC000025F491EFAD10120BDE8F08138463146B3 +:10BED00000F01CF8102816D0A3780021002B12D9EE +:10BEE000621892F80321824209D1102918BF08294B +:10BEF00009D0601880F83B510120BDE8F081491C51 +:10BF0000C9B28B42ECD80020BDE8F0812DE9F041A8 +:10BF10004A4D0646002428780F46002812D900BF53 +:10BF200005EBC40090F84311B14206D10622394610 +:10BF300000F5A27008F0E2FD38B1601CC4B22878A8 +:10BF4000A042EDD81020BDE8F0812046BDE8F08188 +:10BF50003A4910B44A7801EBC003521E4A700022DD +:10BF600083F84A2191F802C0BCF1000F0DD98B185B +:10BF700093F80341844204D1102A1CBF10BC7047BF +:10BF800003E0521CD2B29445F1D80A78521ED2B2C4 +:10BF90000A70824204BF10BC704701EBC00301EB82 +:10BFA000C202D2F843C1C3F843C1D2F84721C3F853 +:10BFB00047218C7891F800C00022002C9CBF10BC57 +:10BFC00070478B1893F80331634506D1102A1CBFC4 +:10BFD000114481F8030110BC7047521CD2B2944244 +:10BFE000EFD810BC704770B414490D188A78521EEF +:10BFF000D3B28B7095F80321984247D001EB031C14 +:10C0000001EB0014DCF80360C4F80360DCF807609F +:10C01000C4F80760DCF80B60C4F80B60DCF80F6054 +:10C02000C4F80F60DCF88360C4F88360DCF88760D4 +:10C03000C4F88760DCF88B6008E00000F80E002090 +:10C04000500100205A010020BB100020C4F88B6072 +:10C05000DCF88FC0C4F88FC001EB030C03EB430383 +:10C060009CF8034100EB400001EB430385F80341DA +:10C0700001EB4000D3F80B41C0F80B41B3F80F318E +:10C08000A0F80F319CF83B0185F83B0101EBC200A1 +:10C0900090F84A0110F0010F1CBF70BC70470020DF +:10C0A0008C78002C0DD90B1893F803C1944504D15A +:10C0B00010281CBF70BC704703E0401CC0B2844213 +:10C0C000F1D80878401EC0B20870904204BF70BC1E +:10C0D000704701EBC20301EBC000D0F843C1C3F8C5 +:10C0E00043C1D0F84701C3F847018C780B78002092 +:10C0F000002C9CBF70BC704701EB000C9CF803C186 +:10C100009C4506D110281CBF084480F8032170BC50 +:10C110007047401CC0B28442EED870BC704700002B +:10C1200010B50A7B02F01F020A73002202768B18F8 +:10C130001B7A03F0010C5B0803F00104A4445B08C4 +:10C1400003F00104A4445B0803F00104A4445B0869 +:10C1500003F0010464444FEA530C0CF00103234440 +:10C160004FEA5C0C0CF00104234403EB5C0300EB8E +:10C17000020C521C8CF8133090F818C0D2B26344F1 +:10C180000376052AD3D3D8B2252888BFFFDF10BD98 +:10C190000023C383428401EBC202521EB2FBF1F1C1 +:10C1A0000184704770B50025044603290DD04FF473 +:10C1B000FA4200297BD0012978D0022918BF70BD2E +:10C1C0000146BDE870405830AAE704F158067821CE +:10C1D000304608F060FDB571F57135737573F57310 +:10C1E000357475717576B576212086F83E0041204C +:10C1F00086F83F00FE2086F8730084F82C502584D2 +:10C20000012084F8540084F85500282184F8561041 +:10C210001B21218761874FF4A471E187A1871B212E +:10C22000218661864FF4A471E186A1861B21A4F8C2 +:10C230004010A4F844104FF4A471A4F84610A4F8D8 +:10C2400042101B21A4F84A10A4F84C10A4F848107E +:10C2500060734FF448606080A4F8D050A4F8D250C6 +:10C26000A4F8D450A4F8D650A4F8D850A4F8DA50C2 +:10C2700084F8DD5084F8DF50A4F8E65084F8E450E8 +:10C28000A4F8F850A4F8FA5084F89A5184F89B5115 +:10C2900084F8A45184F8A55184F8685184F8705149 +:10C2A00084F8735184F88C5170BD00E041E0A4F82B +:10C2B000E65084F8DE506088FE490144B1FBF0F19D +:10C2C000A4F878104BF68031A4F87A10E388A4F82B +:10C2D0007E50B4F882C0DB000CFB00FCB3FBF0F333 +:10C2E0009CFBF0FC5B1CA4F882C09BB203FB00FC2F +:10C2F00004F15801A4F88030BCF5C84FC4BF5B1EE0 +:10C300000B85B2FBF0F2521CCA8500F5802202F5C3 +:10C31000EE32531EB3FBF0F20A84CB8B03FB00F228 +:10C32000B2FBF0F0C883214604F15800BDE870402C +:10C33000F6E6A4F8E650B4F89411B4F89831B4F8DD +:10C3400002C004F15800A4F87E50B4F88240DB002B +:10C3500004FB0CF4B3FBF1F394FBF1F45B1C448598 +:10C360009BB203FB01F40385B4F5C84FC4BF5B1E49 +:10C370000385B2FBF1F2521CC285428C01EBC20272 +:10C38000521EB2FBF1F20284C28B02FB0CF2B2FB32 +:10C39000F1F1C18370BD70B50025044603290DD0AD +:10C3A0004FF4FA42002963D001297DD0022918BF39 +:10C3B00070BD0146BDE870405830B1E604F1580642 +:10C3C0007821304608F067FCB571F57135737573E7 +:10C3D000F573357475717576B576212086F83E0053 +:10C3E000412086F83F00FE2086F8730084F82C5028 +:10C3F0002584012084F8540084F85500282184F80D +:10C4000056101B21218761874FF4A471E187A18712 +:10C410001B21218661864FF4A471E186A1861B2130 +:10C42000A4F84010A4F844104FF4A471A4F84610E6 +:10C43000A4F842101B21A4F84A10A4F84C10A4F848 +:10C4400048106073A4F8D850202084F8DA0084F8EB +:10C45000D050C4F8D45084F8045184F8055184F8BD +:10C460000E5184F80F5184F8F45084F8005170BDD7 +:10C47000608890490144B1FBF0F1A4F878104BF6C4 +:10C480008031A4F87A10E388A4F87E50B4F882C012 +:10C49000DB000CFB00FC9CFBF0FCB3FBF0F304F1B5 +:10C4A0005801A4F882C000E022E05B1C9BB203FBB1 +:10C4B00000FCA4F88030BCF5C84FC4BF5B1E0B85E0 +:10C4C000B2FBF0F2521CCA8500F5802202F5EE3272 +:10C4D000531EB3FBF0F20A84CB8B03FB00F2B2FBDA +:10C4E000F0F0C883214604F15800BDE8704017E61B +:10C4F000D4F8F830B4F802C004F158005989DB8947 +:10C50000A4F87E50B4F88240DB0004FB0CF4B3FBCB +:10C51000F1F394FBF1F45B1C44859BB203FB01F443 +:10C520000385B4F5C84FC4BF5B1E0385B2FBF1F2AF +:10C53000521CC285428C01EBC202521EB2FBF1F2C8 +:10C540000284C28B02FB0CF2B2FBF1F1C18370BD1D +:10C550002DE9F003047E0CB1252C03D9BDE8F003CE +:10C5600012207047002A02BF0020BDE8F003704788 +:10C5700091F80DC01F2601234F4D4FF00008BCF16C +:10C58000000F73D0BCF1010F1EBF1F20BDE8F003E8 +:10C590007047B0F800C00A7C8F7B91F80F907A400A +:10C5A0004F7C87EA090742EA072282EA0C0C00273F +:10C5B0000CF0FF094FEA1C2C99FAA9F99CFAACFC83 +:10C5C0004FEA19694FEA1C6C49EA0C2C0CEB0C1C65 +:10C5D0007F1C9444FFB21FFA8CFC032FE8D38CEA33 +:10C5E000020C354F0022ECFB057212096FF0240596 +:10C5F00002FB05C2D2B201EBD207427602F0070578 +:10C600003F7A03FA05F52F4218BF82767ED104FBEC +:10C610000CF2120C521CD2B25FF0000400EB040CBE +:10C620009CF813C094453CBFA2EB0C02D2B212D3CB +:10C630000D194FF0000C2D7A03FA0CF73D421CBF88 +:10C64000521ED2B2002A71D00CF1010C0CF0FF0C7A +:10C65000BCF1080FF0D304F1010C0CF0FF04052C21 +:10C66000DCD33046BDE8F0037047FFE790F819C00F +:10C670000C7E474604FB02C20F4C4FF0000CE2FB5D +:10C68000054C4FEA1C1C6FF024040CFB0422D2B2B0 +:10C6900001EBD204427602F0070C247A03FA0CFC78 +:10C6A00014EA0C0F1FBF82764046BDE8F0037047C6 +:10C6B00004E00000FFDB050053E4B36E90F818C0FF +:10C6C000B2FBFCF40CFB1422521CD2B25FF000044B +:10C6D00000EB040C9CF813C094453CBFA2EB0C0289 +:10C6E000D2B212D30D194FF0000C2D7A03FA0CF8C8 +:10C6F00015EA080F1CBF521ED2B27AB10CF1010C20 +:10C700000CF0FF0CBCF1080FF0D300E011E004F1D5 +:10C71000010C0CF0FF04052CDAD3A2E70CEBC401EA +:10C7200081763846BDE8F0037047FFE70CEBC401A3 +:10C7300081764046BDE8F0037047FC4A0168126804 +:10C740001140FB4A126811430160704730B4F94947 +:10C75000F64B00244FF0010C0A78521CD2B20A703A +:10C76000202A08BF0C700D781A680CFA05F52A42C9 +:10C77000F2D0097802680CFA01F15140016030BC36 +:10C78000704770B46FF01F02010C02EA90251F235E +:10C79000A1F5AA4054381CBFA1F5AA40B0F155003C +:10C7A00009D0A1F52850AA381EBFA1F52A40B0F142 +:10C7B000AA00012000D100204FF0000C6246644620 +:10C7C0008CEA0106F6431643B6F1FF3F11D005F09F +:10C7D00001064FEA5C0C4CEAC63C03F00106520825 +:10C7E0006D085B08641C42EAC632162CE8D370BCA4 +:10C7F000704770BC00207047017931F01F0113BFF2 +:10C80000002000221146704710B4435C491C03F01D +:10C81000010C5B0803F00104A4445B0803F001046D +:10C82000A4445B0803F00104A4445B0803F0010482 +:10C83000A4445B0803F001045B08A44403F0010472 +:10C84000A4440CEB53031A44D2B20529DDDB012AC0 +:10C850008CBF0120002010BC704730B40022A1F131 +:10C86000010CBCF1000F11DD431E11F0010F08BFD8 +:10C8700013F8012F5C785FEA6C0C07D013F8025FA5 +:10C8800022435C782A43BCF1010CF7D1491E5CBFFE +:10C89000405C0243002A0CBF0120002030BC7047DE +:10C8A000130008BF704710B401EB030CD41A1CF836 +:10C8B00001CC5B1E00F804C013F0FF03F4D110BCE0 +:10C8C0007047F0B58DB0164610251C466A46AC463A +:10C8D00000EB0C03A5EB0C0713F8013CD355ACF1AE +:10C8E000010313F0FF0CF3D11546103210208446DB +:10C8F0000B18ACEB000713F8013C401ED35510F0A9 +:10C90000FF00F5D1284606F0F3FF86B1102005F1AF +:10C91000200201461318A1EB000C13F8013C401E45 +:10C9200004F80C3010F0FF00F4D10DB0F0BD089801 +:10C930002060099860600A98A0600B98E0600DB0D4 +:10C94000F0BD38B505460C466846F8F7EDFC002802 +:10C9500008BF38BD9DF900202272A07E607294F954 +:10C960000A100020511A48BF494295F82D308B42D9 +:10C97000C8BF38BDFF2B08BF38BDE17A491CC9B21A +:10C98000E17295F82E30994203D8A17A7F2918BF19 +:10C9900038BDA2720020E072012038BD0C2818BFFB +:10C9A0000B2810D00D2818BF1F280CD0202818BF26 +:10C9B000212808D0222818BF232804D024281EBFED +:10C9C000262800207047012070470C2963D2DFE839 +:10C9D00001F006090E13161B323C415C484E002A3A +:10C9E0005BD058E0072A18BF082A56D053E00C2A1B +:10C9F00018BF0B2A51D04EE00D2A4ED04BE0A2F1C9 +:10CA00000F000C2849D946E023B1A2F110000B28F1 +:10CA100043D940E0122A18BF112A3ED090F83600C0 +:10CA200020B1122A37D31A2A37D934E0162A32D342 +:10CA30001A2A32D92FE0A2F10F0103292DD990F83B +:10CA4000360008B31B2A28D925E0002B08BF042A8A +:10CA500021D122E013B1062A1FD01CE0012A1AD1ED +:10CA60001BE01C2A1CBF1D2A1E2A16D013E01F2AF9 +:10CA700018BF202A11D0212A18BF222A0DD0232A1C +:10CA80001CBF242A262A08D005E013B10E2A04D0A0 +:10CA900001E0052A01D000207047012070472DE9F0 +:10CAA000F04187680D4604462046F6F7DAFB98B158 +:10CAB000D5B13846A168F6F715FF002814DD2844E3 +:10CAC000401EB0FBF5F606FB05F13846F5F705FF0D +:10CAD000A0603046BDE8F081F6F7F6F940F2337118 +:10CAE000F5F7FBFEA060DFE70020BDE8F081904293 +:10CAF00028BF704770B50446101B642838BF6420F7 +:10CB000025188D4205D8F6F720FF00281CBF2846BF +:10CB100070BD204670BDC08E11F00C0F08BF70476D +:10CB2000B0F5296F38BF4FF42960704748520200B2 +:10CB30004C520200620100200246808E11F00C0F60 +:10CB400008BF704792F85530D18E13F00C0F04D007 +:10CB5000B1F5296F38BF4FF42961538840F2E24C98 +:10CB600003FB0CF3528E4FF4747C0CEB821C8C454F +:10CB70009CBF910101F57471591AA1F59671884213 +:10CB800028BF0846B0F5296F38BF4FF429607047B9 +:10CB9000084418449830002A14BF04210021084496 +:10CBA0007047F0B4002A14BF08220122002B14BFE2 +:10CBB0000824012412F00C0F8B8ECA8E25D091F818 +:10CBC0005550944615F00C0F04D0BCF5296F38BFB2 +:10CBD0004FF4296C4D8840F2E2466E434D8E4FF47F +:10CBE000747707EB851767459CBF4FEA851C0CF5EA +:10CBF000747CA6EB0C0CACF5967C634528BF6346B1 +:10CC0000B3F5296F38BF4FF4296314F00C0F04D02B +:10CC1000B2F5296F38BF4FF429621FFA83FC002850 +:10CC20000CBF0123002391F8560014F00C0F08BF2D +:10CC300000200CEB020108449830002B14BF0421A3 +:10CC400000210844F0BC70472DE9F00391F854200E +:10CC50000B8E12F00C0F4FF474771CBF07EB83138D +:10CC60009CB255D012F00C0F8B8ECA8E4D8E91F85F +:10CC700055C021D016461CF00C0F04D0B6F5296F14 +:10CC800038BF4FF42966B1F8028040F2E24908FB50 +:10CC900009F807EB8519B14502D8AE0106F574769F +:10CCA000A8EB0606A6F59676B34228BF3346B3F541 +:10CCB000296F38BF4FF42963A34228BF23469CB293 +:10CCC0001CF00C0F1CBF07EB85139BB228D000BFD4 +:10CCD0001CF00C0F04D0B2F5296F38BF4FF4296255 +:10CCE0009A4228BF1A4600280CBF0123002391F85E +:10CCF00056001CF00C0F08BF0020A1180844983003 +:10CD0000002B14BF042100210844BDE8F003704744 +:10CD1000022A07BF9B003C33DB0070339CB2A1E7C3 +:10CD2000BCF1020F07BFAB003C33EB0070339BB28A +:10CD3000CEE710F0010F1CBF0120704710F0020F6A +:10CD40001CBF0220704710F0040018BF0820704775 +:10CD50002DE9F0470446174689464FF0010808467A +:10CD600000F0D1FC0546484600F0D1FC10F0010F60 +:10CD700018BF012625D000BF15F0010F18BF0123F1 +:10CD80002AD000BF56EA030108BF4FF0000810F098 +:10CD9000070F08BF002615F0070F08BF002394F8FF +:10CDA0005400B0420CBF00203046387094F8551043 +:10CDB000994208BF00237B70002808BF002B25D1B3 +:10CDC00015E010F0020F18BF0226D5D110F0040FA5 +:10CDD00014BF08260026CFE715F0020F18BF022364 +:10CDE000D0D115F0040F14BF08230023CAE748462A +:10CDF00000F093FCB4F85810401A00B247F6FE71E8 +:10CE0000884201DC002801DC4FF0000816B1082E32 +:10CE10000CD018E094F85400012818BF022812D052 +:10CE200004281EBF0828FFDF032D0CD194F8A401AD +:10CE300048B1B4F8A801012894F8540006D0082895 +:10CE400001D0082038704046BDE8F087042818BF9C +:10CE50000420F7D1F5E7012814BF0228704710F02D +:10CE60000C0018BF0420704738B4CBB2C1F3072CB4 +:10CE7000C1B2C0F30724012B07D0022B09D0042B29 +:10CE800008BFBCF1040F2DD006E0BCF1010F03D1A7 +:10CE900028E0BCF1020F25D0012906D0022907D0D5 +:10CEA000042908BF042C1DD004E0012C02D119E094 +:10CEB000022C17D001EA0C0161F3070204EA030116 +:10CEC00061F30F22D1B211F0020F18BF022310D06C +:10CED000C2F307218DF8003011F0020F18BF0221B4 +:10CEE0001BD111E0214003EA0C03194061F3070252 +:10CEF000E6E711F0010F18BF0123E9D111F0040F8B +:10CF000014BF08230023E3E711F0010F18BF01212C +:10CF100003D111F0040118BF08218DF80110082B6E +:10CF200001BF000C012804208DF80000BDF80000AE +:10CF300038BC70474FF0000C082902D0042909D0F2 +:10CF400011E001280FD10420907082F803C01380F3 +:10CF500001207047012806D00820907082F803C095 +:10CF600013800120704700207047162A10D12A2212 +:10CF70000C2818BF0D280FD04FF0230C1F280DD000 +:10CF800031B10878012818BF002805D0162805D02F +:10CF900000207047012070471A70FBE783F800C03B +:10CFA000F8E7012908D002290BD0042912BF08296B +:10CFB00040F6A660704707E0002804BF40F2E24058 +:10CFC000704740F6C410704700B5FFDF40F2E24002 +:10CFD00000BD0000282107F03CBE4078704730B506 +:10CFE0000546007801F00F0220F00F001043287072 +:10CFF000092910D2DFE801F0050705070509050B2F +:10D000000D00062409E00C2407E0222405E0012499 +:10D0100003E00E2401E00024FFDF6C7030BD0078D7 +:10D0200000F00F0070470A68C0F803208988A0F854 +:10D0300007107047D0F803200A60B0F80700888016 +:10D0400070470A68C0F809208988A0F80D10704759 +:10D05000D0F809200A60B0F80D0088807047027887 +:10D06000402322F0400203EA81111143017070470E +:10D070000078C0F3801070470278802322F080028D +:10D0800003EAC1111143017070470078C00970476D +:10D09000027802F00F02072A16BF082AD0F80520EE +:10D0A000D0F80320C1F809200CBFB0F80920B0F86F +:10D0B0000720A1F80D200A7822F080020A7000787B +:10D0C000800942EAC0100870704770B514460E46D9 +:10D0D00005461F2A88BFFFDF2246314605F10900B9 +:10D0E00007F038FDA01D687070BD70B544780E461D +:10D0F0000546062C38BFFFDFA01F84B21F2C88BF57 +:10D100001F24224605F10901304607F023FD204681 +:10D1100070BD70B514460E4605461F2A88BFFFDF56 +:10D120002246314605F1090007F014FDA01D687084 +:10D1300070BD70B544780E460546062C38BFFFDF3B +:10D14000A01F84B21F2C88BFFFDF224605F1090112 +:10D15000304607F0FFFC204670BD0968C0F80F108C +:10D1600070470A88A0F8132089784175704790F8B5 +:10D17000242001F01F0122F01F02114380F8241027 +:10D180007047072988BF072190F82420E02322F068 +:10D19000E00203EA4111114380F8241070471F3068 +:10D1A00007F08EBE10B5044600F0E3FA002818BF61 +:10D1B000204410BDC17811F03F0F1BBF027912F05F +:10D1C000010F0022012211F03F0F1BBF037913F062 +:10D1D000020F002301231A4402EB4202530011F014 +:10D1E0003F0F1BBF027912F0080F0022012203EB50 +:10D1F000420311F03F0F1BBF027912F0040F00220F +:10D200000122134411F03F0F1BBF027912F0200FCF +:10D210000022012202EBC20203EB420311F03F0F96 +:10D220001BBF027912F0100F0022012202EB420212 +:10D230001A4411F03F0F1BBF007910F0400F00207F +:10D240000120104410F0FF0014BF01210021084408 +:10D25000C0B2704770B50278417802F00F02082A18 +:10D260004DD2DFE802F004080B4C4C4C0F14881F21 +:10D270001F280AD943E00C2907D040E0881F1F2847 +:10D2800003D93CE0881F1F2839D8012070BD4A1EF1 +:10D29000242A34D88446C07800258209032A09D07C +:10D2A00000F03F04601C884204D86046FFF782FF0C +:10D2B000A04201D9284670BD9CF803004FF001063A +:10D2C00010F03F0F1EBF1CF10400007810F0100F8B +:10D2D00013D064460421604600F04BFA002818BFC2 +:10D2E00014EB0000E6D0017801F03F012529E1D2DE +:10D2F00080780221B1EB501FDCD3304670BD002096 +:10D3000070BDC078800970470178002201F00F03DA +:10D310000121042B0BD0082B1CBF00207047437841 +:10D320000E2B04BFC3785FEA931C04D106E040785B +:10D33000801F1F2800D911460846704713F03F0F81 +:10D340001EBF007910F0010F10F0020FF4D1F2E7C8 +:10D3500010B4017801F00F01032920D0052921D153 +:10D360004478B0F81910B0F81BC0B0F81730827DBF +:10D37000222C17D1062915D3B1F5486F98BFBCF5FB +:10D38000FA7F0FD272B1082A98BF8A420AD28B4222 +:10D390009CBFB0F81D00B0F5486F03D805E0407899 +:10D3A0000C2802D010BC0020704710BC0120704730 +:10D3B0002DE9F0411F4614460D00064608BFFFDF69 +:10D3C0002146304600F0D5F9040008BFFFDF3019D0 +:10D3D0003A462946BDE8F04107F0BCBBC07800F0F2 +:10D3E0003F007047C02202EA8111C27802F03F027A +:10D3F0001143C1707047C9B201F00102C1F340038B +:10D400001A4402EB4202C1F3800303EB4202C1F370 +:10D41000C00302EB4302C1F3001303EB43031A44BE +:10D42000C1F3401303EBC30302EB4302C1F38013C8 +:10D430001A4412F0FF0202D0521CD2B20171C3781A +:10D4400002F03F0103F0C0031943C170511C417049 +:10D4500070472DE9F0410546C078164600F03F04BC +:10D46000C4F124000F46B042B8BFFFDF281932468E +:10D470003946001D07F06EFBA019401C6870BDE81E +:10D48000F0812DE9F04105464478C0780F4600F060 +:10D490003F06002C08BFFFDFA01B401E84B21F2CDC +:10D4A00088BF1F242FB1A819011D2246384607F056 +:10D4B00051FB2046BDE8F0814078704700B5027806 +:10D4C00001F0030322F003021A430270012914BF82 +:10D4D0000229002104D0032916BFFFDF012100BD6E +:10D4E000417000BD00B5027801F0030322F0030291 +:10D4F0001A430270012914BF0229002104D0032914 +:10D5000016BFFFDF012100BD417000BD007800F0B3 +:10D5100003007047417889B1C0780E2818BF0F28E2 +:10D5200003D0102818BF192802D3FB2904D905E01D +:10D53000BF4A105C884201D101207047002070472B +:10D5400030B501240546C17019293CBFB848445C78 +:10D5500002D3FF2918BFFFDF6C7030BD70B51546D0 +:10D560000E4604461B2A88BFFFDF65702A463146F7 +:10D57000E01CBDE8704007F0EDBAB0F80700704756 +:10D58000B0F809007047C172090A01737047B0F81A +:10D590000B00704730B4B0F80720A64DB0F809C0B2 +:10D5A000B0F805300179941F2D1998BFBCF5FA7FAA +:10D5B0000ED269B1082998BF914209D293429FBF08 +:10D5C000B0F80B00B0F5486F012030BC98BF704731 +:10D5D000002030BC7047001D07F072BC021D0846D9 +:10D5E000114607F06DBCB0F809007047007970472C +:10D5F0000A68426049688160704742680A608068D2 +:10D600004860704709888181704780890880704729 +:10D610000A68C0F80E204968C0F812107047D0F8A8 +:10D620000E200A60D0F81200486070470968C0F800 +:10D6300016107047D0F81600086070470A684260FC +:10D6400049688160704742680A6080684860704736 +:10D650000968C1607047C06808607047007970470A +:10D660000A68426049688160704742680A60806861 +:10D67000486070470171090A417170478171090A58 +:10D68000C17170470172090A417270478172090ABB +:10D69000C172704780887047C088704700897047A2 +:10D6A0004089704701891B2924BF4189B1F5A47FB6 +:10D6B00007D381881B2921BFC088B0F5A47F012032 +:10D6C0007047002070470A6842604968816070476F +:10D6D00042680A60806848607047017911F0070F5E +:10D6E0001BBF407910F0070F00200120704701791F +:10D6F00011F0070F1BBF407910F0070F0020012029 +:10D7000070470171704700797047417170474079E7 +:10D7100070478171090AC1717047C088704746A27D +:10D7200082B0D2E90012CDE900120179407901F00E +:10D73000070269461DF80220012A07D800F00700F9 +:10D74000085C01289EBF012002B07047002002B093 +:10D750007047017170470079704741717047407997 +:10D76000704730B50C460546FB2988BFFFDF6C705B +:10D7700030BDC378024613F03F0008BF7047052054 +:10D78000127903F03F0312F0010F36D0002914BFC5 +:10D790000B20704712F0020F32D0012914BF801DF8 +:10D7A000704700BF12F0040F2DD0022914BF401C97 +:10D7B000704700BF12F0080F28D0032914BF801C47 +:10D7C000704700BF12F0100F23D0042914BFC01CF3 +:10D7D000704700BF12F0200F1ED005291ABF12306B +:10D7E000C0B2704712F0400F19D006291ABF401C72 +:10D7F000C0B27047072918D114E00029CAD114E03B +:10D800000129CFD111E00229D4D10EE00329D9D1C9 +:10D810000BE00429DED108E00529E3D105E0062963 +:10D82000E8D102E0834288BF7047002070470000C3 +:10D830005052020086F3FFFF0001010201020203C1 +:10D840002DE9F041FC4D0446284600216A788068A5 +:10D8500001270E4612B1012A1ED006E090F866207C +:10D86000002A18BF6F7000D001216A78C2EB421203 +:10D8700000EB420292F82830194324D0667090F8E9 +:10D88000D90002F12A0170B12A22201D07F062F9A5 +:10D890000420207027710DE090F82820002A18BF7E +:10D8A0006E70E1D1E1E73C22201D07F053F905201D +:10D8B000207027716878A968C0EB401001EB400028 +:10D8C00080F828601DE090F8A410E9B190F8D90024 +:10D8D000012818BFFFDFA868D0F8A5106160D0F854 +:10D8E000A910A160D0F8AD10E160D0F8B1102161AD +:10D8F00090F8B5102175667013212170277180F89A +:10D90000A4600120BDE8F08190F82210012922D006 +:10D91000017801291CBF0020BDE8F0816670142148 +:10D920002170811C2022201D07F014F92672A9689D +:10D930000E70C24882888284D0F8C420527B80F85E +:10D94000262080F82270D1F8C4000088F3F7BEFAD0 +:10D95000F2F765FFD5E7667007212170416A6160C3 +:10D9600080F82260CDE7B44880680178002914BFB0 +:10D9700080884FF6FF7070472DE9F84F4FF0000890 +:10D98000894606460127CDF80080FFF748FBBDF821 +:10D990000010A94D21F06004ADF8004008284FD2D6 +:10D9A000DFE800F004070D4E184E132C44F003007E +:10D9B0000DE044F01500ADF80000474641E044F0AA +:10D9C000100000BFADF800003BE044F0020040F062 +:10D9D0001000F7E7A86890F8E000052818BFFFDFFF +:10D9E00044F01A00ADF80000A96891F8E71000298A +:10D9F00014BF40F0010020F00100E3E7A86890F8B0 +:10DA0000E01003290AD090F8E01006295DD090F8C4 +:10DA1000E000042818BFFFDF64D012E03046FFF7B3 +:10DA200070FC002818BFFFDF0AD1F07810F03F0F1C +:10DA30001FBF307910F0020F44F00400ADF8000071 +:10DA40004746BDF800000090BDF80000C0F3C00BD1 +:10DA5000A868CBEB4B1A00EB4A0090F8280000288E +:10DA600018BFBDE8F88F3046FFF7D9FA80467248F4 +:10DA7000806800EB4A0190F8C90001F12A040128EE +:10DA800008BF012508D0022808BF022504D00428B9 +:10DA900016BF08280325FFDF257300206073664842 +:10DAA000806890F8E11084F83B10FF21A1737F217A +:10DAB000E176BDF80010618190F8E01004291CBFE8 +:10DAC00090F8E01006293AD049E044F00A01ADF898 +:10DAD000001090F8FA00002814BF41F0040021F073 +:10DAE00004006FE73046FFF70CFCD8B1012804BFF3 +:10DAF00044F00100ADF8000014D0022818BFFFDF89 +:10DB00009FD144F00200ADF80000A96891F8FA1026 +:10DB1000002914BF40F0040020F00400ADF800001C +:10DB200047468EE7F07810F03F0F1FBF307910F0B6 +:10DB3000020FBDF8000040F0040082D042E790F8E8 +:10DB4000E200012808BF012508D0022808BF0225ED +:10DB500004D0042816BF08280325FFDF657304F1ED +:10DB600009000090344D28787F2808BFFFDF29780E +:10DB7000009801707F2028706FB1B8F1070F04F191 +:10DB80001C01304603D2FFF7B0FA207239E0FFF7EC +:10DB900078FC207204E000202072B8F1070F30D327 +:10DBA000B8F1070F0DD1A86890F8F91001B3D0F8BB +:10DBB000EA10C4F80210B0F8EE10E18090F8F0001E +:10DBC0006070A07A10F0040F0ED0A86890F8FA10D8 +:10DBD000E9B190F8F7102175D0F8F110C4F81510DC +:10DBE000B0F8F500A4F81900B8F1070F38D098E0A4 +:10DBF000F07810F03F0F1ABF307910F0010FFF20BE +:10DC0000DED0621CA11C304601F0E4FCD9E7B8F17B +:10DC1000070F1CBFB8F1010FFFDFB9F1000F08BFFC +:10DC2000FFDF99F800002075B8F1010F08D0B8F1B6 +:10DC3000070F0BD075E0000064010020CC1000201D +:10DC400004F115013046FFF703FA6AE0012130467E +:10DC5000FFF7A8FA0168C4F815108088A4F8190025 +:10DC6000F07810F03F0F1CBF317911F0080F1AD077 +:10DC7000A86890F8E020042A06D090F8E000032875 +:10DC800011D111F0100F0ED003213046FFF78AFAA0 +:10DC9000407803210009A0733046FFF783FA00881B +:10DCA000C0F30B002082F07810F03F0F1CBF3079DA +:10DCB00010F0400F13D0FE48FFF723FBA96891F83E +:10DCC000E020032A14D006213046FFF76BFA0078D3 +:10DCD000E076A86890F8E010062922D118E0A8683C +:10DCE00090F8FB10002918BF90F8F800F0D1F0E789 +:10DCF00091F8C910042914BF08290028E3D1F0784D +:10DD000010F03F0F1CBF307910F0080FDBD1E0E7B7 +:10DD100090F8E9100909A173B0F8E800C0F30B000E +:10DD20002082A968012001EB4A0181F82800BBF19B +:10DD3000000F14BF06200520BDE8F84F03F02CBAF1 +:10DD40002DE9F041DB4DAA6892F8D930002B6ED056 +:10DD50007F27012611B10978FE2914D0804692F858 +:10DD60002800002818BFBDE8F08102F12A044046CF +:10DD7000FFF755F90021082879D2DFE800F0515368 +:10DD800056787878595CCA4C92F8A400002818BFDD +:10DD9000BDE8F08182F8A66092F8DD0018B1F6F7D0 +:10DDA000DAFC012829D02046FFF762F90146A8686D +:10DDB00080F8A71000F1A8012046FFF73BF92046A4 +:10DDC000FFF763F90146A86880F8AE1000F1AF01D3 +:10DDD0002046FFF73DF9A86800F1B50428787F28B0 +:10DDE00008BFFFDF287820702F70A86880F8A46033 +:10DDF000BDE8F041052003F0CFB9F6F7EFFCA968C4 +:10DE000001F1A802A731FDF7FDFE002808BFFFDFE2 +:10DE1000A86890F8A71041F0020180F8A710CEE79B +:10DE2000A17209E0A67221720CE0032001E021E05A +:10DE30000220A07200E0FFDF04F10B014046FFF773 +:10DE400054F92072621CA11C404601F0C3FB2878E3 +:10DE500009347F2808BFFFDF287820702F70A8685A +:10DE600080F82860BDE8F041052003F095B92172E3 +:10DE7000BDE8F081BDE8F0417EE570B58D4C002233 +:10DE8000A06890F8C910104602F0D4FF002831D0E5 +:10DE9000F7F763F9A068884990F8DF000D5C284621 +:10DEA000F6F7E7FEA06880F8E15090F8C91008295D +:10DEB00016BF04290F202520F6F7F9FDA0680021E0 +:10DEC00090F8C9200120F6F7D4FF7948F7F74EF90A +:10DED000A068D0F80001F7F74CF9A06890F8C910D5 +:10DEE00080F8E21090F8C800032814BF0228012926 +:10DEF00008D103E0BDE8704001F0A5BB0821002077 +:10DF0000F7F72AFAA06890F8C91080F8E210F7F73E +:10DF100000FAA06890F8C95090F8DD0040B1F6F71B +:10DF2000E6FB15F00C0F0CBF40205520F7F7D2F997 +:10DF3000A168032081F8E00070BD2DE9F0410F4693 +:10DF4000904605460321FFF72DF94078594C020908 +:10DF5000A06890F8E91062F3071180F8E910032136 +:10DF60002846FFF71FF90188A068B0F8E82061F3A0 +:10DF70000B02A0F8E82080F8E77090F8C91001299A +:10DF800005D090F8E000032808BFBDE8F081E878EC +:10DF90004FF0010610F03F0F1CBF287910F0400F22 +:10DFA00009D006212846FFF7FDF80178A06880F81F +:10DFB000F81080F8FB60A06890F8E01003292AD0E0 +:10DFC000E97811F03F0F1CBF297911F0010F08D03B +:10DFD00000F1F002911F284601F0FCFAA06880F8D9 +:10DFE000F960E87810F03F0F1ABF287910F0020F9F +:10DFF000BDE8F08101212846FFF7D4F8A168026846 +:10E00000C1F8F1208088A1F8F50081F8F78081F847 +:10E01000FA60BDE8F081022F18BF012FD0D1BDE812 +:10E02000F0812DE9F84F0446C07810F03F0F1CBF77 +:10E03000207910F0020F05D010F0010F18BF4FF03B +:10E04000010901D14FF0000900271A4DB9F1000F65 +:10E050005BD020780026C70901212046FFF7A2F8EF +:10E060003FB1407900F0C000402808BF4FF00108E0 +:10E0700001D04FF00008A86890F8C810032906D115 +:10E0800090F8C110002918BF90F8CC0001D190F889 +:10E09000DE00FDF7A5FD070015D01021FEF7DDFB22 +:10E0A000B8F1000F0FD001212046FFF77BF805E003 +:10E0B000D811002064010020785202000146384641 +:10E0C000F7F7D4FC0646A868B8F1000F90F8B970CD +:10E0D00018BF47F00207E07810F03F0F1CBF20790F +:10E0E00010F0020F0ED02046FEF7CFFF824601212E +:10E0F0002046FFF757F85146F6F769FD002818BF8C +:10E10000012000D1002030435BD0E07810F03F0FB9 +:10E110001EBF217911F0100F11F0080F3FD004211C +:10E120002046FFF73FF80646A86890F8E20002F0A4 +:10E1300078FE0146304601F0A8FAA0B13A46002127 +:10E140002046FFF7FAFEF848FFF7DBF80146A8681B +:10E1500080F8E6103188A0F8E310B17880F8E51077 +:10E160000120BDE8F88FA86890F8E20001283AD1B4 +:10E17000E07810F03F0F1CBF207910F0010F32D073 +:10E18000B9F1000F04D100212046FFF7F5FB2AE08A +:10E190008DF8007069462046FFF7EEFB23E010F093 +:10E1A0003F0F1CBF217911F0100F1CD110F03F0F51 +:10E1B0001CBF207910F0010F15D0B9F1000FE7D185 +:10E1C000E1E7A86890F8CA00032818BF02280AD11E +:10E1D000B8F1000F07D036B9D448694600680090FE +:10E1E0002046FFF7C9FB0020BDE8F88FD0498968B9 +:10E1F00081F80A01704770B5CD4DA86890F8E0101D +:10E20000022919BF90F8E010012900210C461CBF1B +:10E210000C2070BDC1EB411200EB4202034682F8B4 +:10E220002840491CC9B20229F4D3047080F8224066 +:10E2300093F8DD0030B1F7F757F8F6F76CFAA868F5 +:10E2400080F8DD40A868012180F8DC4080F8C1102A +:10E2500080F8C84080F8DF40282180F80B1180F852 +:10E260000A41A0F8E34080F8E540072180F8C0109B +:10E27000002070BDAE4810B58068002180F8E01025 +:10E28000012180F8E010FFF7B6FF002818BFFFDF7C +:10E2900010BD2DE9F047A64C07460C26A06890F863 +:10E2A000E01001291FBF90F8E00002280C20BDE813 +:10E2B000F087F6F73CFCA06890F90A01F6F7C7FC76 +:10E2C000A06890F8C91080F8E21090F8C0100125FD +:10E2D000002978D090F8C8004FF00009032802D038 +:10E2E000022805D008E00521924801F03AFA03E03F +:10E2F0000321904801F035FAA06890F8D810002961 +:10E3000004BF90F8DB00002843D0F4F7DDFD06469B +:10E31000A0683146D0F8D400F5F7E4FA864990FBBE +:10E32000F1F801FB180041423046F4F7D6FA0146F5 +:10E33000A068C0F8D410D0F8D0104144C0F8D01074 +:10E34000FDF72FFC0146A068D0F8D020914220D8DC +:10E35000C0E9349690F8DB0000281CBF0120FDF7CF +:10E3600044FD0121A06890F8DC20002A1CBF90F831 +:10E37000D820002A0DD090F8B93000F1BA02012B54 +:10E3800004D1527902F0C002402A14D0BA30F7F713 +:10E39000D5FBA06890F8B910BA30F6F710FC0F2141 +:10E3A0000720F6F728FCA068002690F8E010012965 +:10E3B00018D112E007E0FDF745FDA1682A46BA3101 +:10E3C000F7F785FBE5E790F8E010022904BF80F835 +:10E3D000E0500C2006D1BDE8F08780F804510221FE +:10E3E00080F8E010A06890F8C10088B1FDF7A5FCA6 +:10E3F00003214D48FDF7DDFC0146A06880F8DD10E3 +:10E40000C0F800714D48F6F79AFE3046BDE8F08737 +:10E41000FDF73CFCECE738B5454CA06890F8E010FF +:10E4200002291CBF0C2038BD012180F80511A0F87D +:10E43000081129208DF800006846F5F77DFD30B100 +:10E44000A0689DF8001090F80601884205D1A068E8 +:10E4500090F80601401C8DF80000A1689DF80000AE +:10E4600081F806010220F6F77EFE3548F6F7F9FB43 +:10E47000A168DFF8D0C0002091F8C03091F8DF200B +:10E48000521CACFB02546408A4EB8404224481F8BF +:10E49000DF2023FA02F212F0010F03D1401CC0B2B8 +:10E4A0000328EBD3FFF7E9FC002038BD2049896839 +:10E4B00081F8C900002070471D49896881F8DA0099 +:10E4C000704710B51A4CA36893F8B830022B14BFEC +:10E4D000032B00280BD100291ABF0229012000209C +:10E4E0001146FDF761FB08281CBF012010BDA06884 +:10E4F00090F8B800002816BF022800200120BDE8CF +:10E500001040F7F7A5BA0A48806890F8B8000028CC +:10E5100016BF022800200120F7F79ABA044989683B +:10E5200081F8B80070470000D81100206C5202003A +:10E53000640100200012002040420F0075520200CA +:10E540007B520200ABAAAAAAF749896881F8DC00CD +:10E55000704770B5F44CA16891F8B800002816BF58 +:10E5600002280020012081F8B900BA31F7F75AFAE1 +:10E57000A06890F8B810022916BF032901210021D4 +:10E5800080F8DB1090F8B920002500F1BA03012AC9 +:10E5900004BF5B7913F0C00F0AD000F1BA03012A5F +:10E5A00004D15A7902F0C002402A01D0002200E0D2 +:10E5B000012280F8D820002A04BF002970BDC0F8CD +:10E5C000D050F4F781FCA168C1F8D40091F8DB00C9 +:10E5D00000281CBF0020FDF708FC0026A06890F86A +:10E5E000DC1000291ABF90F8D810002970BD90F8EF +:10E5F000B92000F1BA01012A04D1497901F0C00122 +:10E60000402905D02946BDE87040BA30F7F796BAE0 +:10E61000FDF718FCA1683246BDE87040BA31F7F743 +:10E6200056BA70B5C04D0C4600280CBF012300231C +:10E63000A96881F8C13081F8CB004FF0080081F85B +:10E64000CC000CD1002C1ABF022C01200020114656 +:10E65000FDF7AAFAA968082881F8CC0001D00020AB +:10E6600070BD022C14BF032C1220F8D170BD0028FD +:10E6700018BF112070470328AB4A926808BFC2F840 +:10E68000C41082F8C8000020704710B5044602F09C +:10E6900083FF052809D002F07FFF042805D0A24897 +:10E6A000806880F8D940002010BD0C2010BD9E4825 +:10E6B000816891F8C800032804D0012818BF0228F7 +:10E6C00007D004E091F8CB00012808BF7047002074 +:10E6D000704791F8CA00012814BF03280120F6D121 +:10E6E000704710B5F6F7EAFDF6F79EFDF6F7CEFC9B +:10E6F000F6F72BFD8C4CA06890F8DD0038B1F6F7EA +:10E70000F3FDF6F708F8A168002081F8DD00A068A5 +:10E71000012180F80411022180F8E010002010BDD2 +:10E720008149896881F8FC0070477F4902788968CF +:10E73000012A06D0042A24D0052A0CBF1120122059 +:10E74000704742780023032A08BFC1F8C43081F81B +:10E75000C820012281F8C920C27881F8B820027946 +:10E76000002A16BF022A0123002381F8C13081F854 +:10E77000CA20427981F8C020807981F8DA0000202F +:10E78000704782780023032A08BFC1F8C43081F89B +:10E79000C8200822DEE764488068704700F053BF55 +:10E7A0002DE9F84F00256048F6F7BEFD5E4C4FF0AE +:10E7B0007F0A002808BF84F800A0F6F7A0FD5B4898 +:10E7C000FEF72DFCA0700146A06890F8E2204FF003 +:10E7D00003084FF000094FF0010B012A10D0042A62 +:10E7E0001CBF082AFFDF00F05782A06890F8DD0008 +:10E7F00018B1F6F779FDF5F78EFF2846BDE8F88FDA +:10E800004A4D0026A5F58677072936D290F8C10033 +:10E8100028B9F6F71EFA002808BF002600D0012606 +:10E82000A06890F8DD0080B1FDF715FAA168FF2817 +:10E8300081F8DE0001460DD0E81CFDF701FAA06862 +:10E8400090F8DE00FDF712FA0643A06890F8DE00AB +:10E85000FF2817D1FDF7A1FA87F8DE0097F8C1105D +:10E8600081B108280ED12878E91CC0F38010FDF78B +:10E870009BF9082818BF002604E002BF90F8D900D1 +:10E8800000280126A07808283CD2DFE800F03FB934 +:10E89000043B3B3B17FD36B1A06890F8C800012847 +:10E8A00018BF022803D0F6F7F1FB45469DE7F6F7BF +:10E8B000EDFB00211D48FFF743FAF6E716B3A06809 +:10E8C00090F8C800022802D0012815D01AE00021D3 +:10E8D0001648FFF735FAA0680825C0F8E790C0F899 +:10E8E000EB90C0F8EF90C0F8F390C0F8F79080F884 +:10E8F000FB9080F8E79078E700210C48FFF720FABA +:10E9000000F040B9F6F7C2FB03256EE70020002EA9 +:10E9100071D0A26892F8C810022909D0012925D027 +:10E92000032928D06AE0000064010020D8110020EB +:10E930000021FE48FFF704FAA16891F8050128B10B +:10E94000401E10F0FF0081F8050154D1C1F8E79096 +:10E95000C1F8EB90C1F8EF90C1F8F390C1F8F790CF +:10E9600081F8FB90082081F8E7B047E00021EF48EC +:10E97000FFF7E6F941E0D2F8C400E978837E9942D6 +:10E980001BD12979C37E994217D16979037F9942B6 +:10E9900013D1A979437F99420FD1E979837F9942B5 +:10E9A0000BD1297AC37F994207D12978437EC1F3DD +:10E9B0008011994208BF012100D0002192F8CB209C +:10E9C000012A01D079B10CE059B900F11A01D748F8 +:10E9D000FEF730FBD548FEF74BFBA168D1F8C41019 +:10E9E00048760A200AE097F8CC00082803D097F868 +:10E9F000DE108142F5D0F6F749FB03200546F4E628 +:10EA0000A06890F8DB1000290CBF4FF0010B4FF00D +:10EA1000000B4FF000082978CA0905F1090107D059 +:10EA2000497901F0C001402908BF4FF0010901D028 +:10EA30004FF0000990F8C810032906D190F8C110D2 +:10EA4000002918BF90F8CC0001D190F8DE00FDF746 +:10EA5000C7F85FEA000A13D01021FDF7FEFE002878 +:10EA600018BF4FF0010BB9F1000F04BFA06890F878 +:10EA7000B9A00FD005F109015046F6F7F7FF80461F +:10EA8000A06890F8B9A000E093E0B9F1000F18BFBA +:10EA90004AF0020A90F8C81003290ED0F6F7F6FAE9 +:10EAA000F6B3F6F7A4F850EA08006DD08DF800A090 +:10EAB00069469E48FFF744F964E0D0F8C400E9785D +:10EAC000827E91421BD12979C27E914217D1697908 +:10EAD000027F914213D1A979427F91420FD1E97906 +:10EAE000827F91420BD1297AC27F914207D1297846 +:10EAF000407EC1F38011814208BF012500D000256E +:10EB000097F8DE00082806D097F8CC10884208BF96 +:10EB10004FF0010901D04FF00009B8F1000F00E0FB +:10EB200032E005D1BBF1000F04D0F6F760F808B170 +:10EB3000012100E000214EB197F8CB00012803D05D +:10EB400020B955EA090001D0012000E0002001426F +:10EB500016D0A06890F8CB10012908BF002D0DD168 +:10EB6000D0F8C40000F11A017048FEF763FA6F484C +:10EB7000FEF77EFAA168D1F8C41048760A2534E67B +:10EB8000F6F784FA032530E6A06890F8CA00032857 +:10EB900018BF0228F6D1B9F1000FF3D0B8F1000F79 +:10EBA000F0D163486946406800906048FFF7C8F8B4 +:10EBB000E8E7A06890F8DA0000283FF4A3AEF6F783 +:10EBC00065FAA06890F8D9100029DBD1C0F8E79069 +:10EBD000C0F8EB90C0F8EF90C0F8F390C0F8F79051 +:10EBE00080F8FB9080F8F8A05048FEF78AFB50B3FD +:10EBF000012836D00228C5D1A068032590F8C800A6 +:10EC0000032814BF0020012036EA00003FF4EDADD8 +:10EC1000464E1820F17811F03F0F3FF4E6AD317900 +:10EC200088437FF4E2AD04213046FEF7BBFA074685 +:10EC3000A06890F8E20002F0F4F80146384600F0CF +:10EC400024FDE8BBD1E5002E9CD0A06890F8C80058 +:10EC5000012818BF022895D13448FFF7E2F980BB9C +:10EC600090E7002E8ED0314D1820E97811F03F0F3B +:10EC700088D02979884385D104212846FEF792FA65 +:10EC80000646A06890F8E20002F0CBF80146304654 +:10EC900000F0FBFC98BB75E707297FF433AEC0F8A2 +:10ECA000E790C0F8EB90C0F8EF90C0F8F390C0F890 +:10ECB000F79080F8FB90012680F8F8A01B4801E04F +:10ECC0007FE01AE0FEF71DFB38B1012818D00228BA +:10ECD0004DD0F6F7DBF9454687E5F6F7D7F9A0689A +:10ECE00090F8C800012818BF02287FF44BAF0F48E6 +:10ECF000FFF797F900283FF445AF042575E522E0BA +:10ED0000F6F7C4F9094D1820E97811F03F0F3FF4E8 +:10ED100039AF297988437FF435AF04212846FEF7BF +:10ED200041FA0646A06890F8E20003E0D8110020FE +:10ED30006C52020002F075F80146304600F0A5FC66 +:10ED400000283FF41FAF002201212846FFF7F5F805 +:10ED5000F748FEF7D6FA0146A06880F8E610318839 +:10ED6000A0F8E310B17880F8E51004253DE503250F +:10ED7000F6F78CF9A06890F8C800032814BF0020AB +:10ED8000012036EA00003FF430ADE94E1820F1785A +:10ED900011F03F0F3FF429AD317988437FF425AD61 +:10EDA00004213046FEF7FEF90746A06890F8E2001D +:10EDB00002F037F80146384600F067FC00283FF4BF +:10EDC00014AD002202213046FFF7B7F8D848FEF70D +:10EDD00098FA0146A06880F8E6103988A0F8E31098 +:10EDE000B97880F8E5100425FFE42DE9F041D14C15 +:10EDF000A0680078002818BFFFDF0025A068012761 +:10EE00008570D0F8C4100A8882804A8842838A8834 +:10EE10008283C988C18380F82050C74990F8DB20DD +:10EE2000A1F59A764AB10A78C2F38013CA1C23B1BD +:10EE3000527902F0C002402A33D090F8DC2042B16F +:10EE400011F8032BC2F380121AB1497911F0C00FE7 +:10EE500027D00E3006F022F8A06890F8DD0018B137 +:10EE6000F5F779FC012824D0A068D0F8C4104A7EB8 +:10EE7000C271D1F81A208260C98B818145610583F6 +:10EE8000A0680770D0F8C42090F80A1182F85710D3 +:10EE9000D0F8C4000088F2F719F8BDE8F041F1F7A6 +:10EEA000AFBCD6F83711C0F80E10B6F83B1141824E +:10EEB000D2E7F5F793FCA16801F10802C91DFCF740 +:10EEC000A1FE002808BFFFDFA068C17941F0020160 +:10EED000C171D6F80F114161B6F813110183CFE764 +:10EEE0002DE9F047934C0746FF21A0680025012635 +:10EEF00080F8DE1090F8C800012818BF022802D060 +:10EF0000032818BFFFDF5FB18948FEF7A3F918B9DE +:10EF10008748FEF7F9F918B100F07BFC05463FE0A1 +:10EF2000A06890F8E0007F27082839D2DFE800F0D9 +:10EF3000383838041725352B7E48F6F7F5F90028C0 +:10EF400008BF2770F6F7DBF9A06890F8DD0018B16C +:10EF5000F6F7CAF9F5F7DFFBF6F798F82BE07548F6 +:10EF6000F6F7E2F9002808BF2770F6F7C8F9A0689D +:10EF700090F8DD000028EFD0EAE76E48F6F7D4F904 +:10EF800030B9277004E06B48F6F7CEF90028F8D0C6 +:10EF9000F6F7B5F9F6F77AF80DE000F03DFE0AE075 +:10EFA0000C2D80F02B82DFE805F04CFCFB06FAF913 +:10EFB000F9F90AF84ECBBDE8F047FEF75EBF002234 +:10EFC0000121022001F036FF002800F05B815A4940 +:10EFD000A1F12800FEF75CF8A068574E90F8B91030 +:10EFE0003046FEF73CF8A06800F1BA013046FEF763 +:10EFF0001AF8A06890F8DB10C1B190F8C810032986 +:10F0000006D190F8C110002918BF90F8CC0001D1AA +:10F0100090F8DE00FCF718FF050007D0012130460C +:10F02000FEF71DF829463046FDF7FDFF4248F6F78A +:10F030009DF801210846F6F78FF9A168082081F8AC +:10F04000E000BDE8F087A06890F8E21090F80B218E +:10F0500011F00C0F08BF002290F8E210032001F01D +:10F06000E9FE002800F00E81344D0A2085F8E0000A +:10F07000012002F091F805F59A71A1F12800FEF740 +:10F0800007F8A06805F59A7790F8B9103846FDF7AB +:10F09000E6FFA06800F1BA013846FDF7C4FFA0689A +:10F0A00090F8DB10C1B190F8C810032906D190F890 +:10F0B000C110002918BF90F8CC0001D190F8DE00F3 +:10F0C000FCF7C2FE060007D001213846FDF7C7FF56 +:10F0D00031463846FDF7A7FFA2681749D2F8C400A9 +:10F0E000C08AC875000A0876D2F8C400407D8875C9 +:10F0F0000846F6F73BF8D5F8C4100F4820234A7BA2 +:10F10000017803EA421221F0200111430170084AFC +:10F11000D5F8C4001278417BC2F34012114041730C +:10F12000D5F8C41095F80B0181F85600BDE8F087BA +:10F13000D81100206401002000120020CC10002013 +:10F14000A06890F8E21090F80B2111F00C0F08BFA6 +:10F15000002290F8E210052001F06CFE00287CD01F +:10F16000FE4D0B2085F8E000022002F015F805F5B1 +:10F170009A71A1F12800FDF78BFFA06805F59A7838 +:10F1800090F8B9104046FDF76AFFA06800F1BA0197 +:10F190004046FDF748FFA06804E047E02EE1A5E007 +:10F1A0009DE098E090F8DB10C1B190F8C8100329F9 +:10F1B00006D190F8C110002918BF90F8CC0001D1F9 +:10F1C00090F8DE00FCF740FE070007D00121404622 +:10F1D000FDF745FF39464046FDF725FFA068E04AA8 +:10F1E000D0F8C410C98AD175090A1176D0F8C400C4 +:10F1F0001146407D88750846F5F7B8FFD5F8C4007C +:10F200004673A06890F8E230012296210020F5F7BD +:10F210008CFED348017821F020010170A068D5F858 +:10F22000C41090F80B0181F856007FE7A06890F8B1 +:10F23000E21090F80B2111F00C0F08BF002290F89B +:10F24000E210042001F0F6FD38B1C549A1F1280013 +:10F25000FDF71EFFC24EA06800E013E090F8B91061 +:10F260003046FDF7FCFEA06800F1BA013046FDF71C +:10F27000DAFEA06890F8DB10E9B190F8C810032915 +:10F2800004D00AE0BDE8F04700F0DDB990F8C11005 +:10F29000002918BF90F8CC0001D190F8DE00FCF7EF +:10F2A000D3FD050007D001213046FDF7D8FE2946E1 +:10F2B0003046FDF7B8FEAA48F5F758FFA06890F869 +:10F2C000E230012296210020F5F72FFEA1680920E7 +:10F2D00081F8E0002AE7A06880F8E06026E7A068EF +:10F2E000022180F8046180F8E0101FE7A66816F894 +:10F2F000E31F11F0800F0CBF1E204FF49670B6F87C +:10F300000120C2F30C0212FB00F7C80908BF4FF03E +:10F310001E0906D0002806BFFFDF4FF000094FF49A +:10F320009679B078400908BF012507D0012808BFA9 +:10F33000022503D0022814BF00250825A06890F8F4 +:10F34000E20001F06EFDA7EB0008307808EB09073A +:10F35000C0F38010002808BF4FF4FA7A05D006BF2A +:10F36000FFDF4FF0000A4FF0320A7C4890F8FC9023 +:10F37000B9F10C0F28BFFFDF7A487B4A30F819003B +:10F380000AEB000101FB0720511CB0FBF1F000F17A +:10F3900020094F44F5F7E1FE307800F03F06304693 +:10F3A000F5F767FCA06880F8E16029462520F5F7AD +:10F3B0007EFB0122A8EB09012B461046F5F7B5FDAF +:10F3C0006A48F5F7D3FE00213846F5F7EAFEA06853 +:10F3D00080F8E250F5F79DFFA06890F8DD0040B19D +:10F3E000F5F785F915F00C0F0CBF50205520F5F7F7 +:10F3F00071FFA168042081F8E00097E6FFDF95E641 +:10F400005B4810B5806890F8E0000C286BD2DFE80C +:10F4100000F06A6A6A6A6A6A6A6A0615533453486F +:10F42000F5F7A4FEF5F775FF514C00219620F5F78E +:10F43000B8FEA168052081F8E00010BD4B48F5F743 +:10F4400095FE4B4CA06890F8E230012296211046C0 +:10F45000F5F76BFDA16891F8E20091F80B1110F03F +:10F460000C0F08BF00219620F5F79BFEF5F751FF22 +:10F47000A168062081F8E00010BD3C48F5F776FE53 +:10F480003B4CA06890F8E230012296211046F5F737 +:10F490004CFDA16891F8E20091F80B1110F00C0FEF +:10F4A00008BF00219620F5F77CFEF5F732FFA16832 +:10F4B000072081F8E00010BDF5F700FFF5F7B4FE76 +:10F4C000F5F7E4FDF5F741FE29480121806880F851 +:10F4D0000411022180F8E010FFF787FCBDE810401E +:10F4E000032001F059BEFFDF10BD70B5204CA068AD +:10F4F00090F8E0007F25082828BF70BDDFE800F005 +:10F500004D4D4D172304470A1948F5F70DFF30B943 +:10F51000257004E01648F5F707FF0028F8D0F5F746 +:10F52000EEFEF5F7B3FDBDE87040FEF7A6BC10484F +:10F53000F5F7FAFE002808BF2570F5F7E0FEBDE8F4 +:10F54000704000F080B80A48F5F7EEFE002808BFCA +:10F550002570F5F7D4FEA0680CE00000CC10002068 +:10F5600000120020805202003F420F00D8110020FC +:10F570006401002090F8DD0018B1F5F7B5FEF5F74D +:10F58000CAF8F5F783FDBDE87040FEF776BC00F0E1 +:10F5900043FBBDE87040FEF770BC70BD70B5F84C21 +:10F5A00006460D46012909D0A06890F8E23090F88F +:10F5B000E2203046BDE8704001F0C8BFF5F728FAF8 +:10F5C000A16891F8E220034629463046BDE8704024 +:10F5D00001F0BCBF70B50646E94814460D46806888 +:10F5E00090F8DD0018B1F5F7B6F801280ED03046D6 +:10F5F000FDF73EFD20703046FDF711FD072813D2C0 +:10F6000029463046BDE87040FDF714BDF5F7E6F831 +:10F610002A462146FCF7F6FA002808BFFFDF2078CB +:10F6200040F00200207070BD3046FDF7F8FC07285E +:10F6300018BF70BD00213046FDF7B4FD0168296098 +:10F640008088A88070BD10B5F5F738FEF5F7ECFDA1 +:10F65000F5F71CFDF5F779FDC94CA06890F8DD00C1 +:10F6600038B1F5F741FEF5F756F8A168002081F8AA +:10F67000DD00A068012180F80411022180F8E0106B +:10F68000BDE81040002001F087BD2DE9F0410D4696 +:10F690000178044611F0800F0CBF1E204FF49670C5 +:10F6A000B4F80120C2F30C0212FB00F6C80908BF2F +:10F6B0001E2105D0002806BFFFDF00214FF4967100 +:10F6C000701BA278520908BF012707D0012A08BF82 +:10F6D000022703D0022A14BF00270827B0F5877F2E +:10F6E0002EBFAE420020BDE8F08145182078C0F35F +:10F6F0008010002808BF4FF4FA7603D006BFFFDF62 +:10F70000002632269F4890F8FC400C2C28BFFFDFD3 +:10F710009D489E4A30F81400311801FB0520511C09 +:10F72000B0FBF1F0203005449548806890F8E20085 +:10F73000F6F76CF804463846F6F768F84FF47A7135 +:10F7400084423ABF001B00F2E730201AB0FBF1F010 +:10F7500034BF42192A1A3946BDE8F041012001F0B0 +:10F7600069BB70B50D460446FDF734FC032D4AD045 +:10F77000052D18BF70BD05212046FDF730FC804DDA +:10F78000A868D0F8C40000F10E012046FDF7E5FCA2 +:10F79000A868D0F8C40000F112012046FDF7E1FC92 +:10F7A000A868D0F8C410497DA175D0F8C410C98AE2 +:10F7B000E175090A2176D0F8C41049886176090AF2 +:10F7C000A176D0F8C4108988E176090A2177D0F8AB +:10F7D000C410C9886177090AA177D0F8C40000F184 +:10F7E00008012046FDF7DBFCA868D0F8C400017EC4 +:10F7F0002046FDF7BCFCA86890F8FC102046BDE848 +:10F800007040FDF7BEBC2046BDE870400321FDF707 +:10F81000E6BB2DE9F04FDFF8688183B04FF0000AB6 +:10F82000D8F8080090F8E000594E01274FF003097E +:10F8300055464FF07F0BA6F12804082880F0E78199 +:10F84000DFE800F0FEFEFE0407B3FDFCFEF7A8FFB4 +:10F85000A8E04B48F5F768FD002808BF88F800B01D +:10F86000F5F74DFDD8F8080090F8D900002818BF2A +:10F87000FFDF4848FDF7D3FB88F80300E078002657 +:10F8800010F03F0F1CBF207910F0080F11D0414835 +:10F89000FDF737FD60B1012802D0022808D008E04A +:10F8A000E07810F03F0F1CBF207910F0010F00D05E +:10F8B00001260296D8F8080090F8DD0018B1F5F797 +:10F8C00013FDF4F728FFE1782A460020134611F0D3 +:10F8D0003F0F1ABF217911F0020F2F4647D0D8F8F9 +:10F8E0000800DFF8B0A0002590F8DB0000280CBF6E +:10F8F000012600269AF800000121C4095046FDF7B0 +:10F9000051FC34B1407900F0C000402808BF012408 +:10F9100000D00024D8F8080090F8C810032906D1B8 +:10F9200090F8C110002918BF90F8CC0001D190F8D0 +:10F93000DE00FCF755F95FEA000B0FD01021FCF751 +:10F940008CFF002818BF012644B101215046FDF765 +:10F9500029FC01465846F6F789F80546D8F808000C +:10F960002200334690F8B90018BF40F0020098F822 +:10F970000310072910D0F5F789FBCA4600F048B9F3 +:10F9800064010020CC100020805202003F420F0092 +:10F9900000120020D8110020CDE900072946029866 +:10F9A00000F07BF9824600F033B9FC48FDF737FBE5 +:10F9B00088F80400E078717A88421CD12079B17A05 +:10F9C000884218D16079F17A884214D1A079317BCC +:10F9D000884210D1E079717B88420CD1207AB17BCA +:10F9E000884208D120783178C0F38010B0EBD11F65 +:10F9F00008BF012400D00024F5F748FBE848F5F7DC +:10FA000093FC002808BF88F800B0F5F778FC98F858 +:10FA1000040004283BD1B4B30095D8F80820DF488F +:10FA2000694692F8D9307BB3054692F8660050BB20 +:10FA3000042002F1680482F8720002E029E07DE00F +:10FA4000E5E06932A11C2846FFF7C4FD04F10B0173 +:10FA50002846FDF76EFBC0B220721F2884BF1F200E +:10FA6000207298F8000009347F2808BFFFDF98F85B +:10FA70000000207088F800B0D8F8080080F86670A0 +:10FA8000062001F089FB02E0FFE7FDF775FFCA469B +:10FA9000BEE04FF0030AC248F5F746FC002808BF55 +:10FAA00088F800B0F5F72BFCBC48FDF7B8FA05461E +:10FAB000BA48FDF726FC082D08BF00287ED1E17862 +:10FAC000032011F03F0F79D02179884376D10021AE +:10FAD000B248FDF767FB062206F1090105F00EF8B2 +:10FAE00000286BD1AD48FDF7C3FA0446AD48FDF7D9 +:10FAF000CCFA844262D10121A848FDF753FB0622CB +:10FB0000F11C04F0FBFF002858D1A448FDF7BDFA12 +:10FB10000446A448FDF7ACFA844279D1F5F7CEFB50 +:10FB2000F5F782FBF5F7B2FAF5F70FFB4FF0020A93 +:10FB3000FFF75BF9042001F02FFB69E04FF0030AA7 +:10FB4000F5F7A4FA9648F5F7EFFB002808BF88F808 +:10FB500000B0F5F7D4FB9148FDF761FA81468F4874 +:10FB6000FDF7CFFBB9F1070F08BF002850D1E178AE +:10FB7000012011F03F0F4BD02179884348D100215B +:10FB80008648FDF70FFB062206F1090104F0B6FFD7 +:10FB9000A0B98248FDF76CFA04468248FDF775FA71 +:10FBA000844235D1D8F8080090F8041139B3B0F880 +:10FBB000082190F80611012A07D900E028E0520830 +:10FBC000A0F8082108BFA0F80871012914BF002976 +:10FBD0000D21C943C1EBC10202EB011190F80521CF +:10FBE000D24302EB8203C3EB82121144B0F8082126 +:10FBF000890CB1FBF2F302FB131180F8051180F8B8 +:10FC00000471694665480095FDF7B6FE00E0FFDF28 +:10FC100003B05046BDE8F08F10B5F5F737FA6048ED +:10FC2000F5F782FB5E4C002804BF7F202070F5F7BB +:10FC300066FBA06890F8041119B1002180F8041146 +:10FC400010BDB0F8082190F80611FF2A0AD24FF62D +:10FC5000FF7303EA4202A0F80821FF2A84BFFF22B3 +:10FC6000A0F80821012914BF00290D21C943C1EBC7 +:10FC7000C10202EB011290F80511C94301EB8103A7 +:10FC8000C3EB81111144B0F80821890CB1FBF2F3E8 +:10FC900002FB131180F80511CFE72DE9F84F8346D9 +:10FCA0009946924688463D480A9FFDF72AFB3B4EFF +:10FCB0003B4D002800F03C81012803D0022800F0D1 +:10FCC0007781BAE0002403213448FDF76BFABBF1D9 +:10FCD000000F6BD0A96891F8E720012A66D142781D +:10FCE00091F8E9301209B2EB131F5FD10088B1F827 +:10FCF000E810C0F30B00C1F30B01884256D127482E +:10FD0000FDF7FFFAA96891F8E62090424ED191F8EC +:10FD1000C800012818BF022802D0032847D0AEE04F +:10FD2000F5F7B4F9F07810F03F0F1CBF307910F000 +:10FD3000020F18D0194C2046FDF7A7F906460121FD +:10FD40002046FDF72FFA3146F4F741FF002818BF8F +:10FD5000012050EA08000BD08DF8007069460F486A +:10FD6000FDF70AFE18E000210C48FDF705FE13E040 +:10FD7000A86890F8CA00032818BF02280CD1BAF16D +:10FD8000000F09D0B8F1000F06D107486946806816 +:10FD900000900248FDF7F0FD032470E0D811002028 +:10FDA00064010020001200206C52020064E0002177 +:10FDB0009848FDF7F7F9A9680622D1F8C4101A315E +:10FDC00004F09CFE50B99348FDF752F9A968D1F8A8 +:10FDD000C410497E884208BF012400D00024F07876 +:10FDE00010F03F0F1CBF307910F0020F03D0B8F1B4 +:10FDF000000F47D056E0A86890F8CB10012901D039 +:10FE0000ACB11FE0F4B900218248FDF7CBF9A96835 +:10FE10000268D1F8C410C1F81A208088C8837D48D0 +:10FE2000FDF726F9A968D1F8C41048760AE090F8E1 +:10FE3000DE1090F8CC00814204D0F5F727F90320BA +:10FE4000BDE8F88FA86890F8E21011F00C0F11D0FF +:10FE500090F8E21011F00C0F0ED00123D0F8C4106E +:10FE60001A460020FCF79DFEA968D1F8C410496A23 +:10FE7000884201D80B2402E0F5F708F90324204654 +:10FE8000BDE8F88FB9F1000F0ED0624E3046FDF795 +:10FE9000FCF8074601213046FDF784F93946F4F7AE +:10FEA00096FE08B1012200E00022A96891F8CB007B +:10FEB000012807D040B92CB991F8DE3091F8CC1068 +:10FEC0008B4201D1012100E000210A42D4D0012857 +:10FED00008BF002C12D100214E48FDF763F9A96834 +:10FEE0000268D1F8C410C1F81A208088C883494834 +:10FEF000FDF7BEF8A968D1F8C4104876A86890F854 +:10FF0000E21011F00C0FB5D090F8E21011F00C0FC8 +:10FF1000B2D00123D0F8C4101A460020FCF741FEED +:10FF2000A968D1F8C410496A8842A5D8A2E700BFE1 +:10FF3000F5F7ACF803213748FDF734F9BBF1000FB2 +:10FF40005DD0A96891F8E7205ABB427891F8E93072 +:10FF50001209B2EB131F52D10088B1F8E810C0F3B8 +:10FF60000B00C1F30B01884249D12A48FDF7C9F9BA +:10FF7000A96891F8E620904241D191F8C800012883 +:10FF800018BF02283BD1F07810F03F0F1CBF30792A +:10FF900010F0020F06D08DF8007069461D48FDF77D +:10FFA000EBFC2CE000211B48FDF7E6FC27E000BF3E +:10FFB000F5F76CF8A86890F8C80003281FD015481A +:10FFC000FDF79FF9A96891F8E620904217D1F278E1 +:10FFD000092012F03F0F12D0327990430FD1BBF1BC +:10FFE000000F0CD091F8C8000228DBD191F8050170 +:10FFF00040B1401E10F0FF0081F8050102D003203F +:020000040002F8 +:10000000BDE8F88F3A4601210248FDF796FF092026 +:10001000BDE8F88FD81100202DE9FF4F07460C46A8 +:10002000488881B040F2E24148430090E08A0026CF +:1000300000FB01FB94F8640091460D2818BF0C28C2 +:100040001FD024281EBF94F8650024284FF0000A12 +:1000500017D0049818B10121204602F018FC94F83A +:10006000540094F8558094F8D010054661B10129E8 +:100070006DD0022952D0032918BFFFDF67D000F0EE +:10008000D5B84FF0010AE4E7B9F1000F08BFFFDF70 +:10009000FD4EB068002808BFFFDF94F85410FB48FD +:1000A00090F82400FCF77DFF009094F85400F5F7D9 +:1000B000C6FB00F2E7314FF47A79B1FBF9F1F2486F +:1000C00080680E1894F85400F5F7B9FB014694F8CF +:1000D0005400022804BFEE484FF47A720DD0012874 +:1000E00004BFEC484FF4C86207D0042807BFEA48B1 +:1000F00040F69802E94840F6E4421044084400F211 +:10010000E731B1FBF9F10098401A00EB0B01DE4832 +:10011000406930440844061D012015E0DA48A9F181 +:1001200001018068084308BFFFDFDD48B9F1000F17 +:10013000006800EB0B0606D0D348806800F222303E +:10014000B04288BFFFDF032084F8D0006DE094F850 +:100150006410009E24291EBF94F86520242A2529B6 +:100160004FD1B4F85810B4F8F020891A491C09B2DC +:10017000002946DB94F8F210002942D00D4694F88D +:10018000F310002918BF8846022804BFC0494FF465 +:100190007A700DD0012804BFBE494FF4C86007D063 +:1001A000042807BFBC4940F69800BC4940F6E4402B +:1001B0000144022D04BFB6484FF47A720DD0012DD0 +:1001C00004BFB4484FF4C86207D0042D07BFB2483B +:1001D00040F69802B14840F6E4421044814208D902 +:1001E000081A00F5FA714FF47A70B1FBF0F006448A +:1001F00007E0401A00F5FA714FF47A70B1FBF0F0A5 +:10020000361AB9F1000F10D0DFF87C92D9F8080047 +:1002100020B9B9F80200002818BFFFDFD9F808009C +:1002200000F22230B04288BFFFDF06B9FFDF31465F +:10023000D4F8D400F2F751FBC4F8D400B860002021 +:1002400038704FF0010987F80490204602F00DFC49 +:10025000AAF10101084208BF87F8059006D094F87A +:10026000D00001280CBF0220032078714046D4F84A +:1002700024B0F5F7CBFA0146022D04BF84484FF4B1 +:100280007A720DD0012D04BF82484FF4C86207D0A6 +:10029000042D07BF804840F69802804840F6E442AB +:1002A0001044084400F23F614FF47A70B1FBF0F063 +:1002B000584400F5C970F860049830EA0A0004BF99 +:1002C00005B0BDE8F08F31463846FCF7E8FB85B253 +:1002D000204602F0CAFBA8420FD8054687F80590D1 +:1002E00006FB05F1D4F8D400F2F7F7FAB86031460E +:1002F0003846FCF7D4FB284485B22946204602F054 +:10030000C6FAB868C4F8D40005B0BDE8F08F2DE98E +:10031000F0430446634885B00D4690F80004DFF8CA +:100320008891400999F800144909884218BFFFDFF5 +:10033000DFF85481002708F14406082D80F00E8173 +:10034000DFE805F0046872726DFEFEB6202C28BF4F +:10035000FFDF36F814000621F0F786FC050008BF21 +:10036000FFDF202C28BFFFDF36F8140029888842E1 +:1003700018BFFFDF95F8D000002808BFFFDF284630 +:1003800001F089FFC8F80870A8F80270294600201B +:10039000C8F81470FCF758FC00F19804686AA04291 +:1003A00025D995F85500F5F731FA014695F854002E +:1003B000022804BF36484FF47A720DD0012804BFDA +:1003C00034484FF4C86207D0042807BF324840F6CB +:1003D0009802324840F6E442104408444FF47A71DF +:1003E00000F23F60B0FBF1F1686A0844071B294640 +:1003F0000020C8F80C70FCF727FC698840F2E24244 +:1004000051439830081AA0F22230C8F8100005B005 +:10041000BDE8F08305B0BDE8F04302F013B905B0C4 +:10042000BDE8F043F4F7BCBF99F8140D1F4940092B +:1004300091F800144909884218BFFFDF202C28BF1B +:10044000FFDF36F814000621F0F70EFC050008BFA8 +:10045000FFDF202C28BFFFDF36F8140029888842F0 +:1004600018BFFFDF0022012329466846FFF7D4FDAD +:1004700095F8DA006946F2F76FFF002808BFFFDF42 +:1004800005B0BDE8F08300002812002044120020CF +:1004900068360200A2240200D0FB010030D3010024 +:1004A0007401002001E000E00BE000E019E000E052 +:1004B000202C28BFFFDF36F814000621F0F7D4FB0C +:1004C000050008BFFFDF202C28BFFFDF36F814002F +:1004D0002988884218BFFFDF95F8D000042818BF8C +:1004E000FFDF85F8D07095F8DA404FF6FF79202CC1 +:1004F00028BFFFDF26F8149095F8DA00F2F7C5FC64 +:10050000002808BFFFDF202085F8DA00D5F8E000DA +:10051000002804BFD5F8DC00C8F8180008D0D5E9D9 +:1005200039121144826911448161D5E93701C860EB +:10053000D5F8DC0000281CBFD5F8E010016100E010 +:100540000CE004D1D5F8E000002818BF8761FE4810 +:10055000007805B0BDE8F043EBF74CBCFFDF05B019 +:10056000BDE8F0832DE9F05FF84E07468B46F08B2F +:100570007568401CF08330784FF00008002808BFF1 +:10058000FFDF07D0DFF8C89304282ED0052818BF56 +:10059000FFDF5BD05846FEF7FEF8040008BFFFDF20 +:1005A00029463069F2F799F9B86087F80080012090 +:1005B000387194F8C900022808BFE64807D001281E +:1005C00008BFE54803D004280CBFE448E4484FF4D2 +:1005D0007A7100F2E140B0FBF1F0B168FA30084402 +:1005E000F860307804287DD183E0002AD2D0D6F894 +:1005F00010A0D9F8184034B3A146E468002CFBD110 +:10060000B9F1000F1FD099F80000002808BFFFDFE4 +:10061000D9F81410D9F8040001445046F3F762F9F0 +:10062000002807DA291A491E91FBF5F101FB0504A0 +:100630002A4604E090FBF5F101FB15042A4694429A +:1006400088BFFFDF00E044462546A3E7002AA1D08B +:10065000B569002D08BFFFDF0024D5F8E420D9F8E4 +:1006600018002346611E58B18369934228BF9942FE +:1006700084BF194604460346C0680028F4D104B973 +:100680001C46C5F8E040D035002C04BFC5F80C80EE +:10069000C9F8185005D0E068E560E860002818BF88 +:1006A0000561D5F81090C5F81880B9F1000F0ED08B +:1006B000D9F8180048B1D5F814A0504538BFFFDF6D +:1006C000D9F81800A0EB0A00A861C9F81880002C1E +:1006D00008BFC6F8208009D02078002808BFFFDFB7 +:1006E000616900E00AE060680844306240F6B835AD +:1006F00050E7F08B0A2838BF032000D3022078711E +:10070000F08B012807D938467168FCF7C8F9014613 +:10071000F08B0844F083B8683061BDE8F09F2DE9A4 +:10072000F04107468F4884B00D4690F80004DFF88A +:100730003882400998F800144909884218BFFFDF41 +:1007400001200026082D814C80F0BB80DFE805F0F9 +:1007500004718C8C87B9B9A5607320736078002808 +:100760001CBF04B0BDE8F0817948866046612673FD +:100770003846FEF710F8050008BFFFDF95F8C900FE +:10078000022804BF79494FF47A720DD0012804BFC2 +:1007900071494FF4C86207D0042807BF6F4940F67B +:1007A0009802734940F6E44211444FF47A7201F220 +:1007B000E731B1FBF2F1A2688C18F5F715F80246A3 +:1007C00095F8C900082808BF082127D004280CBFC5 +:1007D0000221002322D002280CBF1821282119440D +:1007E000042816BF08280F2325235B1D082808BFEF +:1007F000402007D0042808BF102003D002280CBFD7 +:100800000420082013FB0010801A201AFDF741FD78 +:10081000002818BFFFDF04B0BDE8F08101EB410103 +:1008200001F12803082814BF04284FF4A871D6D07A +:10083000D1E7617851B1207B002808BFFDF751FF57 +:10084000667304B0BDE8F041F2F74ABAA073FDF751 +:10085000E2FD002818BFFFDF04B0BDE8F08104B05E +:10086000BDE8F041F4F79CBD98F8140D41494009EA +:1008700091F800144909884218BFFFDF0022394669 +:100880006846FFF76FFE69463846F2F765FD0028B7 +:1008900008BFFFDF04B0BDE8F0812078052818BF4D +:1008A000FFDF207F002808BFFFDF26772670207D2E +:1008B000F2F7EBFA002808BFFFDF267504B0BDE8A9 +:1008C000F081FFDF04B0BDE8F0812DE9F0411F4C5D +:1008D0000026207804281FBF207805280C20BDE8BA +:1008E000F08101206070607B0025A8B1EFF31080DB +:1008F00010F0010F72B60CBF00270127607B0028A3 +:100900001CBFA07B002805D0FDF7EBFE6573A57327 +:10091000F2F7E6F92FB903E0207DF2F72FFE00E0B1 +:1009200062B6207DF3F777F8207F28B1257720780D +:10093000052818BFFFDF0C2665702570207DF2F7B3 +:10094000A4FA002818E000007001002044120020E2 +:100950002812002004360200A2240200D0FB01006D +:10096000C0D4010001E000E00BE000E068360200C6 +:1009700030D3010019E000E008BFFFDF25753046E5 +:10098000BDE8F0812DE9F04FFB4883B000780028E6 +:1009900018BFFFF79AFF0120DFF8E08388F8000016 +:1009A00069460620F0F7E9F8002818BFFFDF0027A6 +:1009B0004FF6FF7934E0029800281CBF90F8D01061 +:1009C00000292DD0008848451CBFDFF8B4A34FF0A4 +:1009D000200B3BD00621F0F747F9040008BFFFDFEA +:1009E00094F8DA00F3F717F884F8D07094F8DA5036 +:1009F0004FF6FF76202D28BFFFDF2AF8156094F808 +:100A0000DA00F2F742FA002808BFFFDF84F8DAB014 +:100A100069460620F0F7B1F8002818BFFFDF10E0A4 +:100A20006846F0F788F80028C5D00FE00298002843 +:100A30001CBF90F8D010002903D000884845C9D1C8 +:100A400004E06846F0F777F80028EFD088F80070E7 +:100A5000C8F8187003B00020BDE8F08F10B5C94C7D +:100A600060B101280CBF40F6C410FFDF06D0A068BB +:100A700041F66A01884228BFFFDF10BDA060F6E79B +:100A800010B5DFF800C3BC4C00238CF800002370C5 +:100A90006370237723736373A3732020A36120758E +:100AA000A4F11C004370423010214FF6FF724280C7 +:100AB00020F8042F491EFAD1CCF80830DCF80800E1 +:100AC00041F66A01884228BFFFDFFFF75BFF40F66F +:100AD000C41101206160F4F799FE00F2E7314FF490 +:100AE0007A70B1FBF0F042F210710844A0606168C6 +:100AF000A1F21731884298BF0146A16010BDF0B540 +:100B00009D4C054685B0207800281EBF0C2005B0FE +:100B1000F0BD95F8546095F855006F6AF4F776FECD +:100B2000022E04BF98494FF47A720DD0012E04BFF3 +:100B300096494FF4C86207D0042E07BF944940F687 +:100B40009802944940F6E442114408444FF47A7103 +:100B500000F23F60B0FBF1F0384400F22230C5F8FB +:100B6000E400A56195F8D000002818BFFFDF002041 +:100B7000824948610521217060702077E0838648B2 +:100B8000F2F729F92075202808BFFFDFF2F79CF95A +:100B90002061217D01226846FFF7E4FC207D694643 +:100BA000F2F7DAFB002808BFFFDF002005B0F0BD38 +:100BB0007148007800281CBF0020704710B506203F +:100BC000EFF7ECFF80F0010010BD70B56A4C0546F0 +:100BD0002078002818BFFFDF2878012832D00428A9 +:100BE0001CBF112070BDE8882E89082540F27121B4 +:100BF000484360602846F4F709FE4FF47A7100F22A +:100C0000E730B0FBF1F040F2712206FB0200A06079 +:100C1000022D08BF614A07D0012D08BF5B4A03D0EF +:100C2000042D0CBF5A4A5E4A02F2E142B2FBF1F1D6 +:100C30006268511AA1F28A21884298BF01460020B9 +:100C4000A16070BD6888AE880125CFE710B584B07B +:100C500008431EBF112004B010BD474C2078002867 +:100C60001EBF0C2004B010BD002060700421217054 +:100C7000E0834948F2F7AFF82075202808BFFFDF6E +:100C80003E48806938B10146C0680028FBD111B1E7 +:100C9000F2F71AF905E0F2F717F940F6B831F1F773 +:100CA0001CFE2061217D01226846FFF75BFC207D50 +:100CB0006946F2F751FB002808BFFFDF002004B0AF +:100CC00010BD70B52C4CA1690160FFF7FEFD00233B +:100CD00000BBA169D1F8E0205AB1D1E939C5AC44D3 +:100CE0009569AC44C2F818C0D1E9372CCCF80C2077 +:100CF00005E0DFF888C0D1F8DC20CCF81820D1F866 +:100D0000DC20D1F8E010002A18BF116102D10029BF +:100D100018BF8B61A36170BD18494870704770B5EA +:100D200040F2E24300FB03F510460C46F4F76EFD7B +:100D3000022C04BF14494FF47A720DD0012C04BF69 +:100D400012494FF4C86207D0042C07BF104940F67F +:100D50009802104940F6E442114408444FF47A7175 +:100D600000F23F60B0FBF1F000F2223085428CBF10 +:100D7000281A002070BD0000441200202812002014 +:100D80006C1200207001002068360200A2240200CC +:100D9000D0FB010030D301001F070200043602001F +:100DA000C0D4010070B50D46064601460020FBF791 +:100DB0004BFF044696F85500F4F728FD014696F8D7 +:100DC0005400022804BFFB4A4FF47A700DD001286A +:100DD00004BFF94A4FF4C86007D0042807BFF74A98 +:100DE00040F69800F64A40F6E440104408444FF4B8 +:100DF0007A7100F23F60B0FBF1F0718840F271222D +:100E00005143C0EB4100A0F22230A54234BF21463D +:100E10002946814203D2A5422CBF28462046706253 +:100E200070BD10B5F4F7E0FCE6498A684968511ACC +:100E3000084410BD2DE9F04FE24B04252827D3F8D4 +:100E400008B04FF010080BF198044FF008094FF06C +:100E5000000C4FF4C8734FF4BF764FF0400A0628D9 +:100E60007CD2DFE800F00351214E246C14200429C9 +:100E700011D0082908D02A20022910D010FB0940DF +:100E800000252821294458E0554610FB054000BFA5 +:100E90004FF4A871F6E710FB08402E25F8E710FB89 +:100EA000054065461821EDE704F5317473E0D0B2D2 +:100EB00011F00C0F08BF0020082904BF00F5BA612B +:100EC00040200ED0042917D002290CBF0CF15C0180 +:100ED0000CF1B001014407BF0CF1180304203B469C +:100EE000082000EBC00000EB400003EB400008448A +:100EF000204400F19C044EE000F28E213346102085 +:100F0000EFE704F5B07446E0082908BF40200CD094 +:100F1000042904BF3346102007D0022907BF0CF173 +:100F2000180304200CF128030820C0EBC00000EBDC +:100F3000400003EB40000BEB020144182BE0D0B261 +:100F400011F00C0F08BF0020082904BF00F535611F +:100F5000402010D0042918D0022900E01AE00CBF6C +:100F60000CF1B4010CF5B071014407BF0CF118038A +:100F700004203B46082000EB400202EB001018441E +:100F80000844204400F19C0405E000F2EE313346B1 +:100F90001020F0E7FFDF8C488068A0428CBF012062 +:100FA0000020BDE8F08F10B5864C607828B1D4E9F8 +:100FB0000301A268FBF79BFDE060D4E902018842CF +:100FC0009CBF2078002814BF0020012010BD0422FF +:100FD0002DE9F04F774E784FDFF8E081DFF8E091B0 +:100FE00085B04FF47A7A052980F0D280DFE801F0ED +:100FF0000A2B0331920080F8D02005B0BDE8F04FF5 +:10100000F1F76EBE04466F480078002818BF84F8D8 +:10101000D02004D005B0BDE8F04FF1F761BE012249 +:10102000002321466846FEF7F7FF94F8DA00694688 +:10103000F2F792F9002808BFFFDFB4F85800401C0F +:10104000A4F85800E6E7032180F8D01005B0BDE809 +:10105000F08F8346408840F2E24148435B49086094 +:10106000DBF8F80059460089ABF81600DBF8F80009 +:1010700080798BF81500DBF8F8004089ABF80200A6 +:10108000DBF8F8008089ABF80400DBF8F800C089D1 +:10109000ABF806000020DBF82850FBF7D5FD04462E +:1010A0009BF85500F4F7B2FB9BF85410022908BFD7 +:1010B0004FF47A710DD0012904BF3E464FF4C86148 +:1010C00007D0042907BF464640F698014E4640F631 +:1010D000E4413144084400F23F60B0FBFAF1BBF850 +:1010E000020040F271225043C1EB4000A0F22230D6 +:1010F000A54234BF21462946814203D2A5422CBFD6 +:1011000028462046CBF8240002208BF8D00005B0FA +:10111000BDE8F08F83460146856A0020FBF794FD09 +:1011200004469BF85500F4F771FB9BF85410022914 +:1011300008BF4FF47A710DD0012904BF3E464FF429 +:10114000C86107D0042907BF464640F698014E46BD +:1011500040F6E4413144084400F23F60B0FBFAF04D +:10116000BBF8021040F271225143C0EB4100A0F2E3 +:101170002230A54234BF21462946814203D2A542EE +:101180002CBF28462046CBF8240005B0BDE8F08FE0 +:10119000FFDF05B0BDE8F08F2DE9F043DFF83080C8 +:1011A0000126002498F80010074D85B0072880F02C +:1011B000C6810FE068360200A2240200D0FB0100C5 +:1011C00030D30100281200204412002074010020B6 +:1011D00070010020DFE800F0041A1AFCFCFBFB00A1 +:1011E000EC830846EAF706FE6878002840F066813E +:1011F000297D00226846FFF7B5F9287D6946F2F798 +:10120000ABF8002808BFFFDF00F058B902280CBF78 +:1012100001260026287DFDF7BEFA040008BFFFDF87 +:1012200094F8E2103046FBF7BCFEDFF874930146F9 +:101230002869D9F80820002E024408BF4FF4FC703A +:101240007DD094F8E20094F80B3110F00C0F08BF39 +:10125000002394F8E20008281EBF94F8E200042856 +:101260004FF0000C00F0C68094F8E20008281ABF86 +:1012700094F8E20004284FF4A87005D094F8E20036 +:1012800002280CBF18202820844494F8E200082883 +:1012900008BF40200BD094F8E200042808BF1020BB +:1012A00005D094F8E20002280CBF04200820C0EB0F +:1012B000C00606EB4010604494F8E2C0BCF1080F91 +:1012C0001EBF94F8E2C0BCF1040F00267ED000BF20 +:1012D00094F8E2C0BCF1080F1ABF94F8E2C0BCF168 +:1012E000040F4FF4A87C08D094F8E2C0BCF1020FC0 +:1012F0000CBF4FF0180C4FF0280C664494F8E2C075 +:10130000BCF1080F08BF4FF0400C10D094F8E2C0B9 +:10131000BCF1040F08BF4FF0100C08D094F8E2C0E5 +:10132000BCF1020F0CBF4FF0040C4FF0080C0CEB9B +:101330004C0707EB0C1CB4446044184400E001E087 +:1013400000F59A7010440844061D94F8E200F4F782 +:101350005DFA024694F8E200022808BF91480BD0DB +:1013600094F8E200012808BF8F4805D094F8E20005 +:1013700004280CBF8D488E4894F8E210022908BF5B +:101380004FF47A710ED094F8E210012908BF4FF49F +:10139000C86107D094F8E21004290CBF40F6980108 +:1013A00040F6E441084410444FF47A7100F2E7300B +:1013B000B0FBF1F0A96940F2E243301A4A88D0311B +:1013C00002FB03F7D9F818208A4202E01CE0B0E0E3 +:1013D0005DE008BF00262BD0296AF2F783FA0028C7 +:1013E0001EDA391A4A1E92FBF7F202FB070639464B +:1013F0001BE000BF94F8E200082818BF022000EBB1 +:10140000400000F1280C2FE794F8E2C0BCF1080F6F +:1014100018BF4FF0020C0CEB4C0C0CF1280657E7F0 +:1014200090FBF7F202FB170639468E4288BFFFDFBA +:10143000D8F80800864208D2A86940F27122418893 +:10144000C1824A4306EB420605E040F2E240B6FBA9 +:10145000F0F0A969C88294F8E210A86980F85410E5 +:1014600094F8E21080F8551005214175C08A6FF498 +:101470001C71484306EB400040F63541C9F81400A2 +:10148000B0EB410F28BFFFDF05B0BDE8F0830428B3 +:101490000CBF01270027EC830846EAF7ABFC2E7748 +:1014A00085F82470A8692969C0F8D41080F8D04064 +:1014B0002978052918BFFFDF07D000BFF1F710FC1E +:1014C0006C73AC7305B0BDE8F083002808BFFFDF84 +:1014D000A86990F8D000002818BFFFDFA86990F82D +:1014E000DA00202818BFFFDF3248F1F774FCA96941 +:1014F0000646202881F8DA000F8828BFFFDF2E4833 +:1015000020F81670A86990F8DA00202808BFFFDFDD +:10151000002301226846A969FEF77EFDA869694695 +:1015200090F8DA00F1F718FF002808BFFFDFAC6180 +:10153000C4E705B00846BDE8F043EAF75BBCFFDF4F +:1015400005B0BDE8F08316494860704770B5144D8A +:101550000446002904BFA86070BD4FF47A760129C3 +:1015600010D002291CBFFFDF70BD6888401C688056 +:101570001046F4F764F900F2E730B0FBF6F0201AF9 +:10158000A86070BD1846F4F76FF900F2E730B0FBC1 +:10159000F6F0201AA86070BD084800787047000077 +:1015A0002812002068360200A2240200D0FB0100AD +:1015B00030D301000F0302006C12002044120020FF +:1015C000FB490C28896881F8CB001ABF132818281A +:1015D0007047002211280FD0072808BF7047152830 +:1015E0000AD001281ABF002802287047A1F88420D9 +:1015F000012081F888007047A1F88A20704770B5F3 +:10160000EB4CA1680A88A1F83E2181F83C0191F8D1 +:101610005400012808BF012508D0022808BF022570 +:1016200004D0042816BF08280325FFDFA06880F82F +:10163000405190F85500012808BF012508D0022824 +:1016400008BF022504D0042816BF08280325FFDFA1 +:10165000A068012180F8415180F83A11002180F8FA +:101660000E11E078BDE87040EAF7C4BBD04A01290A +:1016700092681BD0002302290FD0032922D030B357 +:1016800001282FD0032818BF704792F86400132850 +:101690001CBF1628182805D1704792F8CB000028E7 +:1016A00008BF7047D2F8F8000370704792F8CB007B +:1016B000012808BF704700BFD2F8FC000178491E1E +:1016C0000170704792F8CB000328EBD17047D2F835 +:1016D000F800B2F858108288891A09B20029A8BF08 +:1016E00003707047B2F85800B2F80211401A00B205 +:1016F0000028E1DA70472DE9F041AD4C00260327C0 +:10170000D4F808C0012590B12069C0788CF8CA00CF +:1017100005FA00F010F4000F08BFFFDFA06880F8A2 +:101720006470A0F8846080F88850BDE8F0810023E0 +:101730009CF8652019460CF15800FBF746F9002883 +:1017400004BF6570BDE8F0816078002818BFBDE86F +:10175000F0812069C178A06880F8C91080F86570B0 +:10176000A0F88A6080F88C50BDE8F08170B5904C8C +:1017700084B0207910F0010F04BF04B070BD20695F +:1017800000230521C578A06890F864205830FBF745 +:101790001CF9002818BF062D09D020DC022D1CBF23 +:1017A000042D052D03D0607840F00800607060784B +:1017B00000281CBF04B070BD2069C078801E1628A8 +:1017C00080F00783DFE800F011FE89A7D52CFEFD2D +:1017D000FE7FFCD2FEFEFEC5FBFAF9F8F7F60B2DF4 +:1017E0001CBF0D2D112DDED1E1E7A06800230121E2 +:1017F00090F867205830FBF7E8F8002840F05C8349 +:101800002069FBF7F3FEA16881F8F600072081F854 +:101810006700002081F88C0081F8880000F04CBB44 +:10182000A0680921002390F864205830FBF7CDF818 +:1018300018B120690079122812D0A0680A2100236B +:1018400090F864205830FBF7C0F818B1206900798F +:10185000142820D020690079162840F02D8324E038 +:10186000A0680125002390F8642009215830FBF777 +:10187000ACF8002808BF657000F01E83607800286F +:1018800040F01A83A16881F87C0081F8880081F813 +:10189000640000F011BBA168002081F86400A1F889 +:1018A000840081F8880000F035BAA06890F86410D0 +:1018B0001F2940F00183002180F8641080F888100F +:1018C0001A2000F0F7BAA06890F864100F2927D109 +:1018D000002180F86910122137E0A06890F86410A8 +:1018E00013291DD1D0F8F81000884988814218BF0B +:1018F000FFDFA068D0F8F80000F126012069FBF7AF +:10190000A2FEA06800F1C4012069FBF7A4FE162026 +:10191000A16800F05BB9A26892F86400162802D0B2 +:10192000022000F03BBAD2F8F80002F1B00300F157 +:101930001E0100220E30FAF7C4FFA0680021C0E9A2 +:101940002811012180F86910182180F8641000F036 +:10195000B3BA2069FBF7FFFE032840F0AD8220698F +:10196000FBF7FDFE01F00FFC00F0A6BA206900793C +:10197000F8E7A06890F864101A29D1D1002580F802 +:101980008D5080F88850D0F8F8100088498881423E +:1019900018BFFFDFA068D0F8F8100D70D0F8441120 +:1019A0000A78002A18BFFFDF7ED190F88E200AE067 +:1019B0007C0100203BE2B7E182E126E1F2E009E1AF +:1019C0002CE09FE0AAE17AB180F88E500288CA80AC +:1019D000D0F844110D71D0F844210E211170D0F8C7 +:1019E00044210188518010E00288CA80D0F8441157 +:1019F0000D71D0F8442101211172D0F844210D213C +:101A00001170D0F84421018851800088EFF75EFA08 +:101A1000EEF7F6FEE078EAF7EDF9BEE0A068002305 +:101A2000194690F865205830FAF7CFFF50B9A068F2 +:101A30000023082190F864205830FAF7C6FF0028E8 +:101A400000F0FA816078002840F03682A06890F8B3 +:101A5000900010F0020F14D12069FBF7FFFDA16880 +:101A600081F891002069B0F80520A1F89220B0F823 +:101A70000700A1F8940091F8900040F0020081F86E +:101A80009000A06890F8901011F0010F14D190F818 +:101A90006520002319465830FAF797FF002808BF41 +:101AA000FFDF0121A06800E077E080F8651080F892 +:101AB0008C100021A0F88A10A06890F86410012909 +:101AC00007D1002180F8641080F88810E078EAF7E8 +:101AD00091F9A168D1F8F800098842888A4204BFC8 +:101AE0000178042940F0E88100250570E078EAF7E4 +:101AF00081F9A06890F86410002908BF80F8885028 +:101B000000F0DAB9A0680023072190F8642058306B +:101B1000FAF75BFF002800F08F816078002840F022 +:101B2000CB8102A92069FBF7D3FD9DF808000025B1 +:101B300000F02501A06880F896109DF8091001F0CA +:101B4000410180F8971080F88850D0F8F81000888C +:101B50004988814218BFFFDFA068D0F8F8100D70E7 +:101B6000D0F844110A78002A18BFFFDF15D1028887 +:101B7000CA80D0F844110D71D0F84411029A8A60DD +:101B8000039ACA60D0F84421082111700188D0F866 +:101B900044014180E078EAF72DF9A06880F86450AC +:101BA00000F08AB9A0680023092190F86420583019 +:101BB000FAF70BFF002800F03F816078002840F022 +:101BC0007B81A16881F87C0081F8880081F864003D +:101BD00000F072B9A0680023194690F865205830CB +:101BE000FAF7F3FE002800F027816078002840F023 +:101BF0006381A0680021A0F88A10012180F88C1070 +:101C0000022180F8651000F057B9A068002319463A +:101C100090F865205830FAF7D8FE00287FD0206968 +:101C2000FBF740FD002879D0A5682069FBF736FD59 +:101C30002887A5682069FBF72DFD6887A5682069BE +:101C4000FBF72EFDA887A5682069FBF725FDE8872F +:101C5000A06890F864101C2913BF90F84E10012161 +:101C600080F84E10012907D090F80511002904BF13 +:101C700090F80411002903D01E2180F8651017E0A8 +:101C80001D2180F865100288A0F82A21028FA0F893 +:101C90002C21428FA0F82E21828F00F58A71A0F8A6 +:101CA0003021C08FC88301200875E078EAF7A2F8D8 +:101CB000A0680021A0F88A10012180F88C10FBE0B8 +:101CC000A06800230A2190F864205830FAF77DFEBE +:101CD00018B32069FBF7E6FCA8B1A5682069FBF7FB +:101CE000DDFC2887A5682069FBF7D4FC6887A56818 +:101CF0002069FBF7D5FCA887A5682069FBF7CCFC19 +:101D0000E88700F019FFA168002081F8880081F8B9 +:101D1000640000BF00F0E1FECEE000E059E0607832 +:101D200040F001006070C7E0A0680023194690F8F9 +:101D300065205830FAF749FE78B3A06890F864003F +:101D4000232812BF2428607840F0200026D068465F +:101D5000F3F71FFE002808BF002104D0009802A955 +:101D6000C0788DF80800A06801AB162290F86400D6 +:101D7000FBF7FBF8A0B1A0689DF80420162180F8BD +:101D8000EC2080F8ED10192180F86510012180F811 +:101D90008C100021A0F88A108EE04DE060708BE07E +:101DA0002069FBF79AFCA0B12269107900F00701C5 +:101DB000A06880F85010527902F0070280F8512094 +:101DC00090F80F31002B04BF90F80E31002B04D097 +:101DD00022E00020FFF78FFC6EE090F855C000F184 +:101DE00054038C4501BF19789142012180F87D1080 +:101DF00012D00288A0F8362190F8502000F58A71A0 +:101E000080F8382190F8510081F82500012081F8F0 +:101E10002000E078E9F7EEFFA068212180F8651046 +:101E2000012180F88C100021A0F88A1044E0A068FD +:101E300090F864001F2801D00120AFE72069FBF76C +:101E400056FC88B32069A2680179407901F0070146 +:101E500061F30705294600F0070060F30F21012018 +:101E600082F888000025A2F88450232082F86400BC +:101E7000566DD2F81001FAF7F7FFF2B2C1B28A42FA +:101E800007BFA16881F8F250A26882F8F210C6F389 +:101E90000721C0F30720814219BFA16881F8F30030 +:101EA000A06880F8F35007E0FFE70120FFF723FC6C +:101EB0005FF01E00FFF7A3FBA068D0E92A12491CBF +:101EC00042F10002C0E92A1204B070BD2DE9F047CA +:101ED000FE4D04464FF00007687808436870287983 +:101EE00010F0200F2846806818BFA0F87E7004D13B +:101EF000B0F87E10491CA0F87E1090F86A100126F8 +:101F000039B990F86420002306215830FAF75DFDB6 +:101F100058B3A88810F4006F07D0A86890F86A102A +:101F2000002918BFA0F876701FD1A868B0F8761005 +:101F3000491C89B2A0F87610B0F878208A422CBFEC +:101F4000511A00218288521D8A4228BF80F87C6085 +:101F5000B0F87610B0F87820914206D3A0F87670E9 +:101F600080F81A61E878E9F745FF287910F0600FEA +:101F700008D0A86890F8681021B980F8686001213D +:101F8000FFF725F84FF00808002C56D16878002894 +:101F900051D1287910F0040F0DD0A86890F8640092 +:101FA000032808BFFFDFA86890F86710072904BF5F +:101FB0002E7080F8677001F036F9287910F0080F5C +:101FC00019D06878B8B9A868002190F8CB00FFF75D +:101FD0004DFBA86890F8CB00FE2808BFFFDFFE216C +:101FE000A86880F8CB1090F86710082903D1022167 +:101FF000297080F86770FFF7B9FBA87810F0080F18 +:1020000016D0A8680023052190F864205830FAF70C +:10201000DCFC50B185F80180A868D0F8441108783C +:102020000D2808BF0020087002E00020F9F7E8F84A +:10203000A86801F031F800F0C9FDA868A14600F1D8 +:10204000580490F8F40030B9E27B002301212046C7 +:10205000FAF7BBFC10B1608D401C60853D21B9F1E1 +:10206000000F18D12878022808BF16200ED00128AA +:1020700004BFA86890F8F60008D06878E8B110F0BE +:10208000140F1CBF1E20207702D005E0207703E04C +:1020900010F0080F02D02177E67641E010F0030F30 +:1020A00003D02A202077E6763AE010F0200F08BF10 +:1020B000FFDF23202077E67632E094F8300028B165 +:1020C000A08D411CA185E18D884213D294F8340083 +:1020D00028B1608E411C6186E18D88420AD2618DF3 +:1020E000208D814203D3AA6892F8F42012B9E28DC0 +:1020F000914203D322202077E67611E0217C31B192 +:10210000E18C814228BF84F81C80C5D206E0E08CB7 +:10211000062803D33E202077E67601E0E07EA0B1DA +:102120002773677327740221A868FEF750FFA86819 +:1021300090F8CB10012904D1D0F8FC000178491E99 +:102140000170E878E9F756FE03E00021A868FEF781 +:102150003EFFBDE8F047F3F72BBC5C4A517893781B +:10216000194314D111460128896809D0107910F05B +:10217000040F03D091F86700072808D001207047AA +:10218000B1F84800098E884201D8FEF70CBF002044 +:10219000704770B54D4C06460D46A0883043A08070 +:1021A00016F0020F04D016F0010F18BFFFDFE56034 +:1021B00016F0010F18BF256116F0020F4FF0000254 +:1021C0004FF0010117D0E878062802D00B280BD079 +:1021D00011E0A06890F86420182A0CD10022C0E910 +:1021E0002A2280F86A1006E0A06890F8641012298C +:1021F00008BF80F86A2016F0800F1CBF0820A0706E +:1022000016F4806F08BF70BDA268B2F858009188BC +:102210000844801DE97880B2012908BFA2F80201B4 +:102220001ED0002904BFD2F8F810888018D01829D1 +:1022300016D192F8F210002904BF92F8F330002B67 +:102240000BD011F00C0F1EBF92F8543013F00C0F8E +:10225000994203D092F8F31001B90020A2F8F000DF +:10226000E9782846012909D071B1182918BF70BD35 +:10227000B2F8F010BDE87040FBF74BBAB2F80211AB +:102280004172090AA97270BDD2F8F81089884173A9 +:10229000090AA97370BDF0B50C4C85B00026A0608A +:1022A000A6806670A670054626700088F3F748FB86 +:1022B000A0680088F3F76AFBB5F8D800A168401C55 +:1022C00082B201F15800FAF743F901E07C010020E5 +:1022D000002818BFFFDF95F8650024280AD1B5F85B +:1022E0005810B5F8F000081A00B20028A4BF6078B2 +:1022F000002806D095F86400242818BF25283BD173 +:1023000019E0A06890F8F210002908BF90F8541066 +:1023100080F8541090F8F310002908BF90F8551079 +:1023200080F855100020FFF76AF985F86560A1680C +:1023300081F87D6020E0B5F85810B5F8F000081A73 +:1023400000B20028A4BF6078002815D1A06890F8DA +:10235000F210002908BF90F8541080F8541090F83B +:10236000F310002908BF90F8551080F85510002090 +:10237000FFF745F985F86460A5F8D860A06890F883 +:10238000881039B1B0F88410B0F88620914224BF8B +:1023900005B0F0BD90F88C1039B1B0F88A10B0F8E3 +:1023A0008620914224BF05B0F0BDB0F88220B0F87D +:1023B00080108A4224BF05B0F0BD90F8682092B327 +:1023C000B0F87E208A4224BF05B0F0BD90F8CB70F3 +:1023D000FE2F00F01E816846F3F7B5FA002808BF0B +:1023E000FFDF2221009802F034FC03210098FBF764 +:1023F00079F80098017821F0100101703946FBF757 +:102400009FF8192F80F0E380DFE807F028201446BA +:10241000E1E1E21A71E1E2E264E1E1E1E1D4E2E268 +:102420007B94ADE1B600B0F87E10062924BF05B05C +:10243000F0BDCBE7A068009990F8F5000871C7E0FF +:10244000A168009891F8CC100171C1E0A068D0F8A3 +:10245000FC00411C0098FBF7BEF8B9E0A1680098A9 +:10246000D1F8F82092790271D1F8F82012894271DE +:10247000120A8271D1F8F8205289C271120A0272CE +:10248000D1F8F82092894272120A8272D1F8F810BB +:10249000C989FBF778F89BE0A068D0F8F800011D27 +:1024A0000098FBF7A5F8A068D0F8F80000F10C013F +:1024B0000098FBF7A7F8A068D0F8F80000F11E011B +:1024C0000098FBF7A5F8A06800F1C0010098FBF7A1 +:1024D000ADF87DE0626900981178017191884171D1 +:1024E000090A81715188C171090A017270E0FE49BF +:1024F000D1E90001CDE9020102A90098FBF7B0F88B +:1025000066E0A068B0F844100098FBF7B3F8A06844 +:10251000B0F846100098FBF7B1F8A068B0F840108A +:102520000098FBF7AFF8A068B0F842100098FBF7EE +:10253000ADF84DE0A068B0F840100098FBF7A2F8A5 +:10254000A068B0F842100098FBF7A0F8A068B0F8B7 +:1025500044100098FBF78EF8A068B0F84610009879 +:10256000FBF78CF834E0A068009990F810210A710C +:1025700090F8110148712BE0A06890F8F300FAF789 +:102580006AFC01460098FBF7C0F8A16891F8F200D8 +:1025900010F00C0F1CBF91F8541011F00C0F02D06A +:1025A000884218BF0020FAF756FC01460098FBF756 +:1025B000A8F80DE0A06890F8ED100098FBF7C9F8B6 +:1025C000A06890F8EC100098FBF7C7F800E0FFDF78 +:1025D000F3F7CCF9002808BFFFDF0098C178012984 +:1025E00003D049B118290FD013E0A168B1F8021146 +:1025F0004172090A81720CE0A168D1F8F81089884B +:102600004173090A817304E0A168B1F8F010FBF787 +:1026100080F8B6480090B64BB64A29463046F8F7DF +:1026200033FDA0680023052190F864205830FAF7A4 +:10263000CCF9002804BF05B0F0BD05B0BDE8F040FE +:10264000F8F713BBAC48806890F8881029B1B0F84F +:102650008410B0F8862091421AD290F88C1029B1DB +:10266000B0F88A10B0F88620914211D2B0F88220DA +:10267000B0F880108A420BD290F86820B0F87E0043 +:1026800022B1884204D200BFF8F796BD0628FBD3DA +:10269000002001461AE470B50C46064615464FF474 +:1026A000A471204602F0F7FA2680002D08BFFFDF54 +:1026B0002868C4F8F8006868C4F8FC00A868C4F882 +:1026C000440170BDEEF7D9BB2DE9F0410D46074638 +:1026D0000621EEF7C9FA040008BFBDE8F081D4F87E +:1026E00044110026087858B14A8821888A4207D1C7 +:1026F000092810D00E281DD00D2832D008284CD023 +:1027000094F81A01002857D06E701020287084F8B1 +:102710001A61AF803EE06E7009202870D4F8440141 +:10272000416869608168A9608089A881D4F8440102 +:1027300006702FE00846EEF7C9FB0746EEF775F87E +:10274000B0B96E700E202870D4F8440140686860FB +:10275000D4F8440106703846EEF761F80120BDE870 +:10276000F0810846EEF7B2FB0746EEF75EF810B1CF +:102770000020BDE8F0816E700D202870D4F844016F +:102780004168696000892881D4F8440106703846A0 +:10279000EEF745F80120BDE8F0816E700820287042 +:1027A000D4F8440141688268C0686960AA60E86042 +:1027B000D4F844010670EDE794F81C01B0B16E70D6 +:1027C0001520287094F81C010028E3D084F81C61BF +:1027D000D4F81E016860D4F82201A860B4F826017C +:1027E000A88194F81C010028F0D1D3E794F82801BF +:1027F00070B16E701D20287084F82861D4F82A0109 +:102800006860D4F82E01A860B4F83201A881C1E74D +:1028100094F8340140B16E701E20287084F8346141 +:10282000D4F836016860B5E794F8140180B16E7091 +:102830001B20287094F814010028ABD084F8146190 +:10284000D4F81601686094F814010028F6D1A1E7C5 +:1028500094F83A01002808BFBDE8F0816E70162098 +:10286000287094F83A01002894D000BF84F83A61A7 +:10287000D4F83C016860B4F84001288194F83A012A +:102880000028F3D186E71C4A5061D17070472DE9CA +:10289000F0470446481E85B238BFBDE8F08704F112 +:1028A00008080126DFF850904FF0090A5FF0000792 +:1028B000B4F8D800401CA4F8D800B4F87E00401C3E +:1028C000A4F87E0094F86A0040B994F864200023CC +:1028D000062104F15800FAF778F838B3B4F8760016 +:1028E000401C80B20AE0000098520200CD1E020097 +:1028F0005B210200932102007C010020A4F87600F5 +:10290000B4F8781081422CBF0A1A0022A3885B1DFC +:10291000934228BF84F87C60884207D3A4F876707D +:1029200084F81A6199F80300E9F764FA94F88800CA +:1029300020B1B4F88400401CA4F8840094F88C0002 +:1029400020B1B4F88A00401CA4F88A0094F8F4007E +:1029500040B994F867200023012104F15800FAF7E8 +:1029600034F820B1B4F88200401CA4F8820094F836 +:1029700064000C2802D00D2820D067E0B4F858007D +:10298000411CB4F80201814260D1D4F8FC00411C22 +:10299000404602F095FA02212046F9F7FCFCD4F8F3 +:1029A000FC000078002808BFFFDF0121FE20FEF7B1 +:1029B0005DFE84F8647084F8986047E0B4F85800CD +:1029C000411CD4F8F800808881423FD1D4F84401FA +:1029D0000178002918BFFFDF22D12188C180D4F8F7 +:1029E000F8004189D4F844010181D4F8F8008189C4 +:1029F000D4F844014181D4F8F800C189D4F84401E5 +:102A00008181D4F844010771D4F8440180F800A012 +:102A1000D4F844012188418099F80300E9F7EAF9E4 +:102A200001212046F9F7B7FC03212046FEF7CFFA33 +:102A3000D9F80800D0F8F8000078022818BFFFDFA6 +:102A40000221FE20FEF712FE84F86470B4F85800EC +:102A5000401C691EA4F858008DB2BFF429AFBDE830 +:102A6000F087F94AC2E90601704770B50446B0F82C +:102A70007E0094F86810002908BFC0F1020503D059 +:102A8000B4F88010081A051F94F87C0040B194F83F +:102A900064200023092104F15800F9F796FFA0B142 +:102AA000B4F8766094F86A0058B994F8642000236A +:102AB000062104F15800F9F788FF002808BF2846CE +:102AC00003D0B4F87800801B001F8542C8BF0546BC +:102AD000002DD4BF0020A8B270BD042110B5DA4C7F +:102AE000A068FEF774FAA06890F84E10012902BFA2 +:102AF000022180F84E1010BD00F58A710288A0F8FE +:102B00001E21028EA0F82021828EA0F82221028FA1 +:102B1000B0F844309A4228BF1A460A82828FB0F831 +:102B20004600824238BF1046488201200872E07891 +:102B3000BDE81040E9F75EB9C34830B4806890F84A +:102B40004E30B0F832C0C48EB0F84010428F022B25 +:102B500025D08A4238BF11460186C28FB0F8421094 +:102B60008A4238BF11468186028FB0F844108A42EB +:102B700038BF11464186828FB0F846108A4238BF6E +:102B80001146C186418E614588BF8C46A0F832C08F +:102B9000C18EA14288BF0C46C48630BC7047038EEC +:102BA0009A4228BF1A46C58F838E9D4238BF2B4656 +:102BB0008A4238BF11460186B0F842108B4228BFC6 +:102BC0000B468386002180F84E10CDE770B59E4CF1 +:102BD000A06890F8CB10FE2906BF6178002970BD6F +:102BE00090F86720002301215830F9F7EEFE002805 +:102BF00018BF70BDA06890F8F41021B1BDE8704016 +:102C00000220FEF7DDBC90F86420002319465830FE +:102C1000F9F7DBFE40B1A06890F87C0020B1BDE878 +:102C200070401220FEF7CCBCA068002590F864200C +:102C3000122A1FD004DC032A3FD0112A1FD003E040 +:102C4000182A35D0232A43D0002304215830F9F71D +:102C5000BCFE002818BF70BDD4F808C09CF8650001 +:102C600019286ED03BDC01286ED002287AD00328C8 +:102C70005DD038E0BDE870400B20FEF7A1BCF1F755 +:102C800057F90C2838BF70BDA0680821D0F8F800AB +:102C90001E30F1F751F928B1A0680421C030F1F7D6 +:102CA0004BF900B9FFDFBDE870400320FEF788BC98 +:102CB000BDE870400620FEF783BC90F8CA1080F88B +:102CC000CC100720FEF77CFCA06880F8645070BD33 +:102CD0001820FEF775FCA068A0F8845070BD1E286F +:102CE00048D021286CD0DCF8F800012601780029B2 +:102CF00074D04088BCF8001088426FD100239CF843 +:102D0000642019460CF15800F9F75FFE002865D0E1 +:102D1000A068D0F8F810097802297DD003297CD06A +:102D200004297BD0052908BF082078D0C8E09CF88A +:102D3000C9008CF8CC000720FEF742FCA06800F028 +:102D40007AB97CE000E00DE00C20FEF739FCA068C9 +:102D5000A0F88A5090F8901041F0010180F890108E +:102D600000F069B91320FEF72BFCA068A0F88A5088 +:102D700000F061B99CF80501002818BF70BD9CF8EF +:102D8000040188B1BCF80601ACF84000BCF80801A9 +:102D9000ACF84200BCF80A01ACF84400BCF80C01E5 +:102DA000ACF846008CF80451FFF7C6FEFFF795FE1D +:102DB0001520FEF705FCA068A0F88A5000F03BB98A +:102DC0009CF87D0058B18CF8F2508CF8F350182024 +:102DD000FEF7F6FBA068A0F88A5070BD70E09CF882 +:102DE0000F01002818BF70BD9CF80E01002808BF15 +:102DF00070BDDCE91416DCF81001FAF735F8F2B210 +:102E0000C1B28A4207BFA16881F8F250A26882F875 +:102E1000F210C6F3072103E018E01DE03DE024E0D6 +:102E2000C0F30720814219BFA16881F8F300A068B0 +:102E300080F8F3501820BDE87040FEF7C1BB1120A8 +:102E4000FEF7BEFBA068F6E07C01002090F865006C +:102E5000F9F7A4FDA0BB08E090F8691041B190F823 +:102E60006A00002808BFFFDF0A20FEF7A9FB27E061 +:102E7000F1F75EF80C2823D3A0680821D0F8F800F9 +:102E80001E30F1F759F828B1A0680421C030F1F7DD +:102E900053F800B9FFDF0320E7E790F8900010F047 +:102EA000030F0DD10C20FEF78BFBA168A1F8845015 +:102EB00081F8886091F8900040F0010081F890005E +:102EC000A06890F8CB10FE2918BF70BD90F8642060 +:102ED000002319465830F9F778FD002808BF70BD67 +:102EE000A06890F80011E9B3A1690978D1BB90F806 +:102EF0006500F9F753FDA8BBA068B0F858100A297F +:102F000031D900F108010522E06901F0F7FD002840 +:102F1000A06804BF80F8005170BDD0F8FC000178B3 +:102F200061B1411C0522E06901F0E8FD002818BFED +:102F300070BDA068D0F8FC00007830B9A068E169E5 +:102F4000D0F8FC00401C01F0BBFFA068D0F8FC00EA +:102F50000178491C01700120FEF732FBA06880F85F +:102F6000005170BDFFE7A06890F8041111B190F80E +:102F70000511E1B390F80E11002908BF70BD90F85B +:102F80000F11002918BF70BD90F86500F9F706FD14 +:102F9000002818BF70BDA06890F85400012808BF31 +:102FA000012508D0022808BF022504D0042816BF36 +:102FB00008280325FFDFA06890F85500012808BF06 +:102FC000012608D0022808BF022604D0042816BF14 +:102FD00008280326FFDFA268012D92F810012DD0EA +:102FE000022D2ED0032D08BF04282CD03BE0FFE794 +:102FF000B0F80611A0F84010B0F80811A0F842107F +:10300000B0F80A11A0F84410B0F80C11A0F846105E +:1030100080F8045190F865001D2804D0BDE8704088 +:103020001420FEF7CDBAFFF787FDFFF756FD1520F8 +:10303000FEF7C6FAA06880F8655070BD012812D16D +:1030400001E002280FD192F81101012E06D0022EC4 +:1030500007D0032E08BF04280AD004E0012802D1BB +:1030600006E0022804D0BDE870401620FEF7A8BA9A +:10307000B2F8583092F85410B2F81201F032F9F761 +:1030800059FF20B1A168252081F8640070BDBDE81A +:1030900070400020FEF7B3BA70B5044690F86400A3 +:1030A00000250C2814D00D2818BF70BDB4F85800A6 +:1030B000D4F8F810401C8988884218BF70BDD4F835 +:1030C0004401FF4E0178002918BFFFDF45D122E0FF +:1030D000B4F85800B4F80211401C884218BF70BD03 +:1030E000D4F8FC00411C04F1080001F0E9FE0221C3 +:1030F0002046F9F750F9D4F8FC000078002808BF02 +:10310000FFDF0121FE20FEF7B1FA84F864500120B0 +:1031100084F8980070BD2188C180D4F8F800D4F8F4 +:10312000441140890881D4F8F800D4F8441180890A +:103130004881D4F8F800D4F84411C0898881D4F8C3 +:1031400044010571D4F8441109200870D4F84411E1 +:1031500020884880F078E8F74DFE01212046F9F7F5 +:103160001AF903212046FDF732FFB068D0F8F800C5 +:103170000078022818BFFFDF0221FE20FEF776FA52 +:1031800084F8645070BD70B5CD4CA16891F864208E +:10319000162A11BF132A91F88E20002A62781BBFCD +:1031A00002206070002A70BD81F8C800002581F8F7 +:1031B0008D5081F88850D1F8F800098840888842FD +:1031C00018BFFFDFA068D0F8F8000078032818BF08 +:1031D000FFDF0321FE20FEF749FAA068D0F8441172 +:1031E0000A78002A18BFFFDF19D10288CA80D0F8F8 +:1031F000442190F8C8101171D0F844110D72D0F824 +:1032000044210D211170D0F844210188518000889B +:10321000EDF75CFEEDF7F4FAE078E8F7EBFDA06877 +:1032200080F8645070BD10B5A54C207910F0020FE5 +:1032300008BF10BD6078002818BF10BDE068C078D6 +:10324000192880F06781DFE800F05F4F0D8EF7F7F7 +:10325000A5223FF76F82B0F7F7F7F7F6E2DFF8F451 +:10326000F3F7F200A0680023012190F8672058309E +:10327000F9F7ABFB002818BF10BD0821A06880F843 +:103280006710002180F8881080F88C1010BDA068AD +:103290000023194690F865205830F9F796FB18B1CD +:1032A000A168002081F88C00A0680023194690F8DE +:1032B00064205830F9F789FB002808BF10BD0020B2 +:1032C000A16881F8880010BDA0680023194690F815 +:1032D00064205830F9F779FB002808BFFFDF04208D +:1032E000A16881F8640010BDA0680023194690F819 +:1032F00064205830F9F769FB002808BFFFDF0C2075 +:10330000A16881F8640010BDA0680023194690F8F8 +:1033100064205830F9F759FB002808BFFFDF0D2063 +:10332000A16881F8640010BDA0680023194690F8D8 +:1033300064205830F9F749FB002808BFFFDF01215E +:10334000A06880F88D100F2180F8641010BDA0686F +:1033500090F86400122818BFFFDF0121A06880F8F0 +:103360008E101121F0E7A0680023194690F8642020 +:103370005830F9F72AFB28B9A06890F88E00002889 +:1033800008BFFFDF0121A06880F88D10132180F8AD +:10339000641010BDA06890F86400182818BFFFDF03 +:1033A0001A20A16881F8640010BDA068D0F8F81058 +:1033B00003884A889A4204BF0978042919D190F8F1 +:1033C0006420002319465830F9F7FFFA002808BF97 +:1033D000FFDFA06890F8901011F0020F04BF0121E8 +:1033E00080F8641005D0002180F88810D0F8F8002B +:1033F0000170A0680023194690F865205830F9F74D +:10340000E4FA002808BF10BD0020A1687FE0A06892 +:103410000023194690F864205830F9F7D6FA0028AE +:1034200008BFFFDF0520A16881F8640010BD30E00F +:103430001FE012E001E066E06CE0A068002319469E +:1034400090F864205830F9F7C0FA002808BFFFDF71 +:103450001C20A16881F86400E8E7A06800231946F1 +:1034600090F865205830F9F7B0FA002808BFFFDF60 +:10347000CAE7A0680023194690F864205830F9F78D +:10348000A4FA002808BFFFDF1F20A16881F86400AC +:10349000CCE7A06890F8651021291CD090F8641042 +:1034A000232918BFFFDFC1D190F8F210002907BF10 +:1034B00090F8F3100029242180F8641002E0000045 +:1034C0007C0100207FF4FBAE002180F864100846E8 +:1034D000FEF795F8F3E690F8F210002907BF90F890 +:1034E000F3100029242180F865108DD1002180F887 +:1034F000651080F87D1090F80E0100281CBF002098 +:10350000FEF77DF880E7A168002081F8650081F86A +:103510008C008BE7FFDF89E770B58D4C0829207A96 +:1035200063D2DFE801F0041A5A5A2662625A80B167 +:10353000F1F7FDFA012211461046F1F7C4FCF2F74B +:10354000A2F90020A072F1F794FBBDE87040F1F7FA +:1035500004BEBDE87040EFF7C3BBD4E90001EFF74C +:10356000BCF92060A07A401CC0B2A07228281CD3ED +:1035700070BDA07A0025401EC6B2E0683044F1F765 +:10358000D3FE10B9E1687F208855A07A272828BF8C +:1035900001252846F2F710F9A07A282809D2401C04 +:1035A000C0B2A072282828BF70BDBDE87040F1F7F6 +:1035B00060BB207A00281CBF012000F085F8F1F7DD +:1035C00065FDF1F7C2FD0120E07262480078E8F77E +:1035D00011FCBDE87040EFF783BB002808BF70BD49 +:1035E0000020BDE8704000F06FB8FFDF70BD10B57F +:1035F000574C207A002804BF0C2010BD00202072F8 +:10360000E072607AEFF7BAFF607AF0F704FA607A56 +:10361000EFF73BFC00280CBF1F20002010BD00224C +:1036200070B54B4C06460D46207A68B12272E272A4 +:10363000607AEFF7A3FF607AF0F7EDF9607AEFF7C1 +:1036400024FC002808BFFFDF4248E560067070BD1B +:1036500070B5050007D0A5F5E8503F494C388142C8 +:103660009CBF122070BD3A4CE068002804BF0920BE +:1036700070BD207A00281CBF0C2070BD3748EFF7C2 +:10368000AAFB6072202804BF1F2070BDEFF71CFC4E +:103690002060002D1CBF284420600120656020723E +:1036A000002000F011F8002070BD2949CA7A002AD4 +:1036B00004BF002070471F22027000224270CB68B6 +:1036C0004360CA72012070472DE9F04184B007467B +:1036D000EFF7FAFB1E4D8046414668682C6800EB08 +:1036E000800046002046F0F7FDF8B04206DB68682F +:1036F000811B4046EFF7F1F80446286040F233762C +:1037000021464046F0F7EEF8B04204DA3146404632 +:10371000EFF7E3F8044600208DF8000040F2E76080 +:10372000039004208DF80500002F14BF0120032012 +:103730008DF8040068460294EFF793FD687A6946B5 +:10374000EFF70AFE002808BFFFDF04B0BDE8F081F4 +:10375000AC1200209C010020B5EB3C0019350200A2 +:103760002DE9F0410C4612490D68114A1149083201 +:103770001160A0F12001312901D301200CE0412882 +:1037800010D040CC0C4F94E80E0007EB8000241FB3 +:1037900050F8807C3046B84720600548001D056021 +:1037A000BDE8F0812046DDF71BFDF5E706207047F8 +:1037B0001005024001000001A052020010B552485D +:1037C00000F012FA00B1FFDF4F48401C00F00CFA85 +:1037D000002800D0FFDF10BD2DE9F14F4B4ED6F889 +:1037E00000B00127484800F007FADFF81C8128B92B +:1037F0005FF0000708F1010000F014FA444C0025C6 +:103800004FF0030901206060C4F80051C4F804516E +:10381000009931602060DFF8FCA018E0DAF80000C1 +:10382000C00614D50E2000F064F8EFF3108010F0FD +:10383000010072B600D00120C4F80493D4F800113E +:1038400019B9D4F8041101B920BF00B962B6D4F88F +:10385000000118B9D4F804010028DFD0D4F804011D +:103860000028CFD137B1C6F800B008F1010000F050 +:10387000C3F911E008F1010000F0BEF90028B9D148 +:10388000C4F80893C4F80451C4F800510E2000F0A5 +:1038900030F81D4800F0C6F90020BDE8F88F2DE98A +:1038A000F0438DB00D46064600240DF110090DF1D0 +:1038B000200817E004EB4407102255F8271068464B +:1038C00001F048F905EB870710224846796801F0B6 +:1038D00041F96846FFF780FF10224146B86801F0C1 +:1038E00039F9641CB442E5DB0DB00020BDE8F0837B +:1038F00072E700F01F02012191404009800000F1B1 +:10390000E020C0F8801270479D01002004E50040CF +:1039100000E0004010ED00E0A94900200870704769 +:1039200070B5A84D01232B60A74B1C68002CFCD060 +:10393000002407E00E6806601E68002EFCD0001D03 +:10394000091D641C9442F5D30020286018680028E3 +:10395000FCD070BD70B59A4E04469C4D307802285C +:1039600000D0FFDFAC4200D3FFDF71699848012926 +:1039700003D847F23052944201DD03224271491CC0 +:103980007161291BC16092497078EFF7E5FC00284E +:1039900000D1FFDF70BD70B5894C0D46617888425B +:1039A00000D0FFDF894E082D4BD2DFE805F04A0436 +:1039B0001E2D4A4A4A382078022800D0FFDF032013 +:1039C0002070A078012801D020B108E0A06800F0A4 +:1039D0001BFE04E004F1080007C8FFF7A1FF052063 +:1039E0002070BDE87040EFF77BB9EFF76DFA014644 +:1039F0006068EFF777FFB04202D2616902290BD30A +:103A00000320F0F722FA12E0EFF75EFA0146606851 +:103A1000EFF768FFB042F3D2BDE870409AE7207834 +:103A200002280AD0052806D0FFDF04202070BDE858 +:103A3000704000F0BBB8022000E00320F0F705FA68 +:103A4000F3E7FFDF70BD70B50546EFF73DFA5C4C5C +:103A500060602078012800D0FFDF5D4901200870F8 +:103A60000020087104208D6048715848C860022009 +:103A700020706078EFF770FC002800D1FFDF70BD88 +:103A800010B54F4C207838B90220F0F7F4F918B986 +:103A90000320F0F7F0F908B1112010BD4D48EFF701 +:103AA0009AF96070202804D0012020700020606105 +:103AB00010BD032010BD2DE9F041144600EB840732 +:103AC0000E4605463F1F00F0B2FD4FF080521169CF +:103AD000484306EB8401091FB14201D2012100E0F5 +:103AE00000211CB11269B4EB920F02D90920BDE884 +:103AF000F081394A95420ED3AF420CD3854205D2AC +:103B0000874203D245EA0600800701D01020EEE785 +:103B1000964200D309B10F20E9E7304830490068E8 +:103B2000884205D0224631462846FFF7F9FE10E0CC +:103B3000FFF7A6FF0028DAD1214800218560C0E9FF +:103B4000036481704FF4A97104FB01F01830FFF792 +:103B50007AFF0020CBE770B54FF080550446286906 +:103B60001D49B1FBF0F0844201D20F2070BD00F07E +:103B70005EFDA04201D8102070BD184818490068A9 +:103B8000884204D02869604300F03EFD0CE0FFF756 +:103B900077FF0028F0D1296909486143816001213C +:103BA00081701048FFF74FFF002070BD10B5044C26 +:103BB0006078EFF76AF900B9FFDF0020207010BDD0 +:103BC000A001002004E5014000E40140105C0C006D +:103BD000BC1200209739020000600200B0000020F3 +:103BE000BEBAFECA7C5E0100002101700846704723 +:103BF0000146002008707047EFF3108101F00101C9 +:103C000072B60278012A01D0012200E000220123CD +:103C1000037001B962B60AB1002070474FF400503A +:103C20007047E9E7EFF3108111F0010F72B64FF022 +:103C30000002027000D162B600207047F2E7000077 +:103C40007B490968016000207047794908600020BD +:103C5000704701218A0720B1012804D042F20400F4 +:103C60007047916700E0D1670020704771490120DB +:103C7000086042F20600704708B504236D4A190730 +:103C8000103230B1C1F80433106840F00100106008 +:103C90000BE0106820F001001060C1F8083300202C +:103CA000C1F80801644800680090002008BD011FA9 +:103CB0000B2909D85F4910310A6822F01E0242EA36 +:103CC000400008600020704742F2050070470F284E +:103CD00009D8584910310A6822F4706242EA00207B +:103CE00008600020704742F205007047000100F1B3 +:103CF0008040C0F8041900207047000100F18040A6 +:103D0000C0F8081900207047000100F18040D0F889 +:103D10000009086000207047012801D9072070477A +:103D2000464A52F8200002680A43026000207047A9 +:103D3000012801D907207047404A52F82000026844 +:103D40008A43026000207047012801D9072070478C +:103D50003A4A52F8200000680860002070470200CC +:103D600037494FF0000003D0012A01D007207047E7 +:103D70000A607047020033494FF0000003D0012A67 +:103D800001D0072070470A60704708B54FF40072F1 +:103D9000510510B1C1F8042308E0C1F80823002040 +:103DA000C1F8240124481C3000680090002008BDA0 +:103DB00008B58022D10510B1C1F8042308E0C1F88C +:103DC00008230020C1F81C011B4814300068009033 +:103DD000002008BD08B54FF48072910510B1C1F8FC +:103DE000042308E0C1F808230020C1F8200112488C +:103DF000183000680090002008BD0D49383109686E +:103E00000160002070474FF080410020C1F8080198 +:103E1000C1F82401C1F81C01C1F820014FF0E020D5 +:103E2000802180F800140121C0F8001170470000C3 +:103E300000040040000500400801004064530200F7 +:103E400078050040800500406249634B0A68634979 +:103E50009A42096801D1C1F3100101600020704746 +:103E60005C495D4B0A685D49091D9A4201D1C0F366 +:103E700010000860002070475649574B0A685749A0 +:103E800008319A4201D1C0F3100008600020704749 +:103E900030B5504B504D1C6842F20803AC4202D082 +:103EA000142802D203E0112801D3184630BDC30004 +:103EB0004B481844C0F81015C0F81425002030BD38 +:103EC0004449454B0A6842F209019A4202D0062849 +:103ED00002D203E0042801D308467047404A01217A +:103EE00042F83010002070473A493B4B0A6842F2D2 +:103EF00009019A4202D0062802D203E0042801D325 +:103F000008467047364A012102EBC000416000209C +:103F1000704770B52F4A304E314C156842F2090394 +:103F200004EB8002B54204D0062804D2C2F800187F +:103F300007E0042801D3184670BDC1F31000C2F891 +:103F40000008002070BD70B5224A234E244C15682D +:103F500042F2090304EB8002B54204D0062804D2E1 +:103F6000D2F8000807E0042801D3184670BDD2F843 +:103F70000008C0F310000860002070BD174910B59C +:103F80000831184808601120154A002102EBC003CF +:103F9000C3F81015C3F81415401C1428F6D30020DC +:103FA00006E0042804D302EB8003C3F8001807E0FE +:103FB00002EB8003D3F80048C4F31004C3F80048B0 +:103FC000401C0628EDD310BD04490648083108609E +:103FD00070470000B0000020BEBAFECA00F50140E4 +:103FE00000F001400000FEFF7E4B1B6803B19847C4 +:103FF000BFF34F8F7C4801687C4A01F4E0611143B4 +:104000000160BFF34F8FFEE710B5EFF3108010F0A3 +:10401000010F72B601D0012400E0002400F0D9F8AD +:1040200050B1DDF777F9EEF71CFDEFF7B1FEDEF7E3 +:10403000ECFE6F490020086004B962B6002010BD94 +:1040400070B50C460546EFF3108010F0010F72B604 +:1040500001D0012600E0002600F0BBF818B106B937 +:1040600062B6082070BDDDF7D1F8DDF757F90246DA +:10407000002043099B0003F1E02300F01F01D3F867 +:104080000031CB40D9071BD0202803D222FA00F1FF +:10409000C90722D141B2002906DA01F00F0101F16E +:1040A000E02191F8141D03E001F1E02191F80014E2 +:1040B0004909082911D281B101290ED004290CD057 +:1040C000401C6428D5D3DEF777FE4949494808608B +:1040D0002046F0F775FA60B904E006B962B641F21D +:1040E000010070BD3F4804602DB12846F0F7B5FAD5 +:1040F00018B110242CE0404D19E02878022802D98C +:104100004FF4805424E007240028687801D0F8B9DF +:1041100008E0E8B120281BD8A878212818D8012861 +:1041200016D001E0A87898B9E8780B2810D8334960 +:10413000802081F8140DDDF7F1F82946EFF70EFE27 +:10414000EEF74EFC00F0A6FA2846DDF7B5F8044677 +:1041500006B962B61CB1FFF757FF204670BD0020BC +:1041600070BD10B5044600F034F800B10120207095 +:10417000002010BD224908600020704770B50C4631 +:1041800020490D681F49204E08310E60102807D0C5 +:1041900011280CD012280FD0132811D0012013E0C1 +:1041A000D4E90001FFF74CFF354620600DE0FFF732 +:1041B0002BFF0025206008E02068FFF7D2FF03E016 +:1041C0000F4920680860002020600E48001D05602F +:1041D00070BD074807490068884201D10120704737 +:1041E00000207047B80100200CED00E00400FA0543 +:1041F000B0000020BEBAFECA6C5302000BE000E023 +:1042000004000020100502400100000100B5D8495B +:1042100002282DD021DC10F10C0F08BFF42027D08C +:104220000FDC10F1280F08BFD82021D010F1140F97 +:1042300008BFEC201CD010F1100F08BFF02017D0E1 +:1042400020E010F1080F08BFF82011D010F1040F82 +:104250000CBFFC2000280BD014E0C01E062811D291 +:10426000DFE800F00E0C0A080503082000E0072034 +:10427000086000BD0620FBE70520F9E70420F7E70A +:104280000320F5E7FFDF00BD00B5BA49012808BFEC +:1042900003200CD0022808BF042008D0042808BF3F +:1042A000062004D0082816BFFFDF052000BD0860E7 +:1042B00000BDB149002804BF086820F0010005D006 +:1042C000012806BF086840F0010070470860704789 +:1042D00070B51E460546012924D0022A04BFA7480E +:1042E0004FF47A710DD0012A04BFA5484FF4C8617C +:1042F00007D0042A07BFA34840F69801A24840F619 +:10430000E44144181846F1F781FA04443046F1F7C5 +:10431000ABFA20444FF47A7100F27120B0FBF1F057 +:10432000281A70BD022A08BF4FF47A700AD0012AF9 +:1043300008BF4FF4C86005D0042A0CBF40F69800AF +:1043400040F6E44049F608514418DBE770B51446DE +:104350000546012908BF49F6CA660DD0022B08BFE1 +:104360008A4807D0012B08BF854803D0042B0CBF17 +:104370008448874800F1FA061046F1F760FA012CEC +:1043800008BF4FF47A710AD0022C08BF4FF4FA71BB +:1043900005D0042C0CBF4FF4FA614FF4FA51711A96 +:1043A00008444FF47A7100F28920B0FBF1F0281A2A +:1043B000801E70BD70B514460646012930D0022B10 +:1043C00004BF6E494FF47A700DD0012B04BF6C49C5 +:1043D0004FF4C86007D0042B07BF6A4940F6980025 +:1043E000694940F6E4400D181046F1F728FA012C0F +:1043F00008BF4FF47A710AD0022C08BF4FF4FA714B +:1044000005D0042C0CBF4FF4FA614FF4FA51691A2D +:1044100008444FF47A716438B0FBF1F0301A70BD83 +:10442000022B08BF4FF47A700AD0012B08BF4FF45B +:10443000C86005D0042B0CBF40F6980040F6E4405D +:1044400049F608514518CFE770B5164604460129CC +:1044500008BF49F6CA650DD0022B08BF4B4807D0EC +:10446000012B08BF464803D0042B0CBF45484848E1 +:1044700000F1FA051046F1F7C9F905443046F1F7A5 +:10448000F3F928444FF47A7100F2E140B0FBF1F007 +:10449000201A801E70BD2DE9F04107461E460C46CD +:1044A00015461046082A16BF04284DF68830F1F745 +:1044B000ADF907EB4701C1EBC71100EBC100012CBF +:1044C00008BF4FF47A710AD0022C08BF4FF4FA717A +:1044D00005D0042C0CBF4FF4FA614FF4FA51471881 +:1044E0002046F1F7ACF9381A4FF47A7100F60F60F4 +:1044F000B0FBF1F42846F1F777F920443044401D31 +:10450000BDE8F08170B5054614460E460846F1F741 +:104510007DF905EB4502C2EBC512C0EBC205304682 +:10452000F1F7A2F92D1A2046082C16BF04284DF6E3 +:104530008830F1F76BF928444FF47A7100F6B73000 +:10454000B0FBF1F52046F1F74FF92844401D70BD4E +:104550001049082818BF0428086803BF20F46C50CD +:1045600040F4444040F0004020F0004008607047B4 +:104570000C1500401015004050160040683602002F +:10458000A2240200D0FB010030D301000436020057 +:10459000C0D40100401700402DE9FE430C46804680 +:1045A000F8F7B4FF074698F80160204601A96A466B +:1045B000ECF717F905000DD0012F02D00320BDE85C +:1045C000FE83204602AA0199ECF72DF80298B0F874 +:1045D00003000AE0022F14D1042E12D3B8F803000E +:1045E000BDF80020011D914204D8001D80B2A91918 +:1045F000814202D14FF00000E1E702D24FF001000A +:10460000DDE74FF00200DAE70B4A022111600B49A7 +:104610000B68002BFCD0084B1B1D18600868002895 +:10462000FCD00020106008680028FCD070474FF0D4 +:10463000805040697047000004E5014000E40140FB +:1046400002000B464FF00000014620D0012A04D0A2 +:10465000022A04D0032A0DD103E0012002E0022047 +:1046600015E00320072B05D2DFE803F00406080A53 +:104670000C0E100007207047012108E0022106E01F +:10468000032104E0042102E0052100E00621EEF709 +:10469000BEBB0000F9480521817000210170417006 +:1046A0007047F7490A78012A05D0CA681044C860E3 +:1046B0004038EFF7E4B88A6810448860F8E70028CB +:1046C00019D00378EF49F04A13B1012B0ED011E055 +:1046D0000379012B00D06BB943790BB1012B09D1C0 +:1046E0008368643B8B4205D2C0680EE00379012BDE +:1046F00002D00BB10020704743790BB1012BF9D1E7 +:10470000C368643B8B42F5D280689042F2D80120A6 +:104710007047DB4910B501220A700279A2B100226C +:104720000A71427992B104224A718268D34C5232A2 +:104730008A60C0681434C8606060EEF7C5FBCF497A +:1047400020600220887010BD0322E9E70322EBE716 +:1047500070B5044609B1012000E00320C84D0021D6 +:104760002970217901B100202871607968B1042095 +:10477000C24E6871A168F068EEF7AFF8A860E06813 +:104780005230E8600320B07070BD0320F0E72DE9DF +:10479000F04105460226EEF79EFF006800B1FFDFFC +:1047A000B64C01273DB12878B0B1012805D00228C8 +:1047B00010D0032813D027710CE06868C82807D3ED +:1047C000EFF7C3F820B16868FFF76BFF012603E03D +:1047D000002601E000F05CF93046BDE8F081207869 +:1047E0000028F7D16868FFF76AFF0028E3D06868FF +:1047F000017879B1A078042800D0FFDF0121686832 +:10480000FFF7A6FF9E49E078EEF7A6FD0028E1D16C +:10481000FFDFDFE7FFF77DFF6770DBE72DE9F0479C +:10482000964C8846E178884200D0FFDFDFF84C9252 +:1048300000250127924E09F11409B8F1080F75D22D +:10484000DFE808F0040C28527A808D95A0780328C0 +:1048500002D0022800D0FFDFBDE8F087A07803284F +:1048600002D0022800D0FFDF0420A070257120783C +:10487000002878D1FFF715FF3078012806D0B068FE +:10488000E06000F025F92061002060E0E078EEF7BC +:1048900060FCF5E7A078032802D0022800D0FFDFF3 +:1048A000207800286DD1A078032816D0EEF70CFBF5 +:1048B00001464F46D9F80000EFF714F800280EDB48 +:1048C000796881420BDB081AF0606D49E078EEF7F9 +:1048D00043FD0028C0D1FFDFBEE7042028E004200C +:1048E000EFF7B3FAA570B7E7A078032802D0022843 +:1048F00000D0FFDF207888BBA078032817D0EEF720 +:10490000E3FA01464F46D9F80000EEF7EBFF002826 +:10491000E5DB79688142E2DB081AF0605849E0780B +:10492000EEF71AFD002897D1FFDF95E740E005205C +:10493000EFF78BFAA7708FE7A078042800D0FFDF8D +:10494000022004E0A078042800D0FFDF0120A16845 +:104950008847FFF71CFF054630E004E011E0A0782F +:10496000042800D0FFDFBDE8F04700F091B8A07840 +:10497000042804D0617809B1022800D0FFDF207834 +:1049800018B1BDE8F04700F08CB8207920B10620BE +:10499000EFF75BFA2571CDE7607838B13849E078F8 +:1049A000EEF7DAFC00B9FFDF657055E70720BFE7D7 +:1049B000FFDF51E73DB1012D03D0FFDF022DF9D11B +:1049C0004AE70420C3E70320C1E770B5050004D01F +:1049D0002A4CA078052806D101E0102070BD0820DF +:1049E000EFF749FA08B1112070BD2848EEF7F3F946 +:1049F000E070202803D00020A560A07070BD0320C7 +:104A000070BD1E4810B5017809B1112010BD817824 +:104A1000052906D0012906D029B101210170002005 +:104A200010BD0F2010BD00F03CF8F8E770B5134C36 +:104A30000546A07808B1012809D155B12846FFF7ED +:104A40003EFE40B1287840B1A078012809D00F205F +:104A500070BD102070BD072070BD2846FFF759FEBD +:104A600003E000212846FFF773FE0549E078EEF7E2 +:104A700073FC00B9FFDF002070BD0000BC01002006 +:104A8000CC1200203D860100FF1FA1071D48020037 +:104A90000A4810B5006900F013F8BDE81040EEF7C1 +:104AA0001FB9064810B5C078EEF7EFF900B9FFDF7F +:104AB0000820EFF7CAF9BDE81040EBE5BC01002083 +:104AC0000C490A6848F202139A4302430A6070478D +:104AD000084A116848F2021301EA03009943116081 +:104AE00070470246044B10201344FC2B01D8116080 +:104AF00000207047C80602400018FEBF40EA0103CC +:104B000010B59B070FD1042A0DD310C808C9121F76 +:104B10009C42F8D020BA19BA884201D9012010BDB0 +:104B20004FF0FF3010BD1AB1D30703D0521C07E07D +:104B3000002010BD10F8013B11F8014B1B1B07D1E1 +:104B400010F8013B11F8014B1B1B01D1921EF1D152 +:104B5000184610BD032A40F2308010F0030C00F01C +:104B6000158011F8013BBCF1020F624498BF11F8A7 +:104B700001CB00F8013B38BF11F8013BA2F1040260 +:104B800098BF00F801CB38BF00F8013B11F00303D8 +:104B900000F02580083AC0F0088051F8043B083A3C +:104BA00051F804CBA0E80810F5E7121D5CBF51F8DE +:104BB000043B40F8043BAFF30080D20724BF11F858 +:104BC000013B11F801CB48BF11F8012B24BF00F8BD +:104BD000013B00F801CB48BF00F8012B704710B52E +:104BE000203AC0F00B80B1E81850203AA0E81850E5 +:104BF000B1E81850A0E81850BFF4F5AF5FEA027CA6 +:104C000024BFB1E81850A0E8185044BF18C918C014 +:104C1000BDE810405FEA827C24BF51F8043B40F8B5 +:104C2000043B08BF7047D20728BF31F8023B48BF9A +:104C300011F8012B28BF20F8023B48BF00F8012BD8 +:104C4000704702F0FF0343EA032242EA024200F007 +:104C500002B84FF000020429C0F0128010F0030CDB +:104C600000F01B80CCF1040CBCF1020F18BF00F85F +:104C7000012BA8BF20F8022BA1EB0C0100F00DB80E +:104C80005FEAC17C24BF00F8012B00F8012B48BF6C +:104C900000F8012B70474FF0000200B51346944610 +:104CA0009646203922BFA0E80C50A0E80C50B1F184 +:104CB0002001BFF4F7AF090728BFA0E80C5048BF98 +:104CC0000CC05DF804EB890028BF40F8042B08BF36 +:104CD000704748BF20F8022B11F0804F18BF00F832 +:104CE000012B7047FEDF04207146084219D1069956 +:104CF000124A914215DC069902394878DF2810D112 +:104D00000878FE2807D0FF280BD14FF001004FF0A4 +:104D100000020B4B184741F201000099019A084B21 +:104D20001847084B002B02D01B68DB6818474FF070 +:104D3000FF3071464FF00002014B1847006002003F +:104D4000E93F020004000020184819497047FFF7A6 +:104D5000FBFFDCF733FA00BD4FF4805015490968BA +:104D6000884203D1144A13605B68184700BD0000F5 +:104D700020BFFDE74FF480500E490968884210D1EA +:104D80000E4B18684FF0FF318842F1D080F308884D +:104D90004FF02021884204DD0948026803210A43BC +:104DA00002600848804708488047FFDFE012002083 +:104DB000E01200200000002004000020006002003B +:104DC0001409004099460100594D02000420714623 +:104DD000084202D0EFF3098101E0EFF3088188690E +:104DE00002380078102813DB20280FDB2C280BDB7F +:104DF0000A4A12680A4B9A4203D1602804DB094A26 +:104E00001047022008607047074A1047074A1047BA +:104E1000074A12682C32126810470000B0000020C8 +:104E2000BEBAFECA21130000613702007D410200B4 +:104E3000040000200D4B0E4908470E4B0C49084753 +:104E40000D4B0B4908470D4B094908470C4B0849C6 +:104E500008470C4B064908470B4B054908470B4BC5 +:104E6000034908470A4B02490847000051BB0000AC +:104E70000D2F00006D2C0000092B0000972A000068 +:104E80000F2D00003D1300005328000029BE000034 +:104E9000C91100000021016001717047002101600B +:104EA00081807047002101604160017270470A688B +:104EB0004B6802604360B1F808C0A0F808C07047B2 +:104EC0000A6802600B79037170470000B995000011 +:104ED00043970000A1980000C5980000FF980000CB +:104EE0003399000065990000959900000B9A000025 +:104EF00091960000A7120000A7120000794400005C +:104F0000C5440000E94400007D45000099460000CA +:104F10005B4700008D47000075480000074900000E +:104F20005B490000414A0000614A0000DF150000B3 +:104F30000316000033150000871500003516000029 +:104F4000C91600006360000013620000E7650000FE +:104F5000FD660000876700000568000069680000C2 +:104F60008D6900005D6A0000C96A0000834A000084 +:104F7000894A0000934A000089410000FB4A000072 +:104F80005D410000874C0000BF4C0000294D00002F +:104F90000F4E0000254E0000A7120000A7120000CF +:104FA000A7120000A7120000A7120000A71200001D +:104FB000A7120000A7120000BF2400004525000032 +:104FC000612500007D2500000B270000A7250000BB +:104FD000B1250000F325000015260000F126000091 +:104FE00033270000A7120000A7120000678300000B +:104FF0008783000089830000CD830000FB830000CD +:10500000E9840000778500008B850000D9850000C9 +:10501000C98600006F880000998900007B7300003A +:10502000B1890000A7120000A7120000D1B400004F +:105030003BB600008FB60000FBB60000ABB7000027 +:105040000100000000000000100110013A02000001 +:105050001A020000FB900000E9900000FFFFFFFF34 +:105060000000FFFFCDAC0000293D000065200000DE +:10507000C5730000618E0000000000000000020007 +:10508000000000000002000000000000000100001D +:105090000000000013810000F38000006181000027 +:1050A00041240000032400002324000037A800004E +:1050B00063A800006BAA000059590000818100001C +:1050C00000000000B18100008F24000000000000FB +:1050D00000000000000000004DA9000000000000DA +:1050E000ED59000000000000900A0000900A000046 +:1050F000DB560000DB5600005544000079AB000091 +:1051000047760000771F0000972602004F970100A6 +:10511000195700001957000077440000DBAB00006E +:10512000CB760000E91F0000C5260200639701004E +:1051300070017001400038005C002400480100024A +:1051400000000300656C74620000000000000000B5 +:1051500000000000000000008700000000000000C8 +:105160000000000000000000BE83605ADB0B3760C7 +:1051700038A5F5AA9183886C010000003114010064 +:10518000F9220100000000010206030405000000EE +:105190000700000000000000060000000A000000F8 +:1051A0003200000073000000B4000000C989010053 +:1051B00047150200616F0100D5B10100EBF4010059 +:1051C000D5B10100F77001008DB30100E1EE0100DF +:1051D0008DB30100BF6D010021B3010001F4010096 +:1051E00021B301005D6F0100E9B101009DE70100FD +:1051F000E9B10100ED74010001B601009DF5010067 +:1052000001B601000300000001555555D6BE898E38 +:105210000000C706C70CC71200006B030F06B308D7 +:105220000000B704A708970CF401FA009600640088 +:105230004B0032001E0014000A00050002000100AD +:105240000041000000000000AAAED7AB15412010BD +:105250000C0802170D0101020909010106020918D3 +:10526000180301010909030305000000FE00000006 +:10527000FE000000FE555555252627D6BE898E0016 +:10528000F401FA00960064004B0032001E00140086 +:105290000A00050002000100254100000000000096 +:1052A000493E0200613E0200793E0200913E02004A +:1052B000C13E0200E93E0200133F0200473F0200E8 +:1052C000573B0200B73A0200AD370200E34A020042 +:1052D000E93B0200F93B0200253C0200433F01008C +:1052E0004B3F01005D3F0100533C02006D3C02005A +:1052F000413C02004B3C0200793C0200AF3C020002 +:10530000CF3C0200ED3C0200FB3C0200093D0200E4 +:10531000193D0200313D0200493D02005F3D02009F +:10532000753D0200000000007FB90000D5B9000003 +:10533000EBB9000041460200D93702009F38020055 +:10534000CB490200034A02002D4A0200ED3D010054 +:105350006D4101008B3D0200B13D0200D53D0200D0 +:10536000FB3D02001C05004020050040001002002B +:105370009053020008000020D001000044110000FA +:10538000C8530200D801002008110000A01100003D +:10539000011813C8140250201A0102227C2720FB96 +:1053A000349B5F801280021A10138B091B20480463 +:1053B0001ACE0401200B50A40AAC01300912CB63B1 +:0853C0007F010B68CC10A00076 +:00000001FF diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/mbed_lib.json b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/mbed_lib.json similarity index 84% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/mbed_lib.json rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/mbed_lib.json index bb625ad33f..8f3a1bd52f 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_S132_OTA/mbed_lib.json +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/TARGET_SOFTDEVICE_S140_OTA/mbed_lib.json @@ -2,7 +2,7 @@ "name": "softdevice", "macros": [ "SOFTDEVICE_PRESENT=1", - "S132", + "S140", "BLE_STACK_SUPPORT_REQD", "NRF_SDH_CLOCK_LF_XTAL_ACCURACY=7", "NRF_SD_BLE_API_VERSION=5", @@ -25,16 +25,12 @@ "NRF_SDH_BLE_STACK_OBSERVER_PRIO=0", "NRF_SDH_SOC_STACK_OBSERVER_PRIO=0", "FDS_BACKEND=2", - "SWI_DISABLE1", - "SWI_DISABLE2", - "SWI_DISABLE3", - "SWI_DISABLE4", - "SWI_DISABLE5" + "SWI_DISABLE1=1" ], "target_overrides": { "*": { "target.features_add": ["BLE"], - "target.bootloader_img": "hex/s132_nrf52_5.0.0_softdevice.hex" + "target.bootloader_img": "hex/s140_nrf52_6.0.0_softdevice.hex" } } } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/README.md b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/README.md similarity index 87% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/README.md rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/README.md index 0c6f23f19b..d1fbd84ee1 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/README.md +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/README.md @@ -7,7 +7,8 @@ components/libraries Only essential folders have been copied over. Removed: - * block_dev/ + * atomic_flags / + * block_dev / * bootloader/ * bsp/ * button/ @@ -18,7 +19,7 @@ Removed: * csense/ * csense_drv/ * ecc/ - * eddystone/ + * experimental_libuarte/ * experimental_mpu/ * experimental_ringbuf/ * experimental_stack_guard/ @@ -42,10 +43,9 @@ Removed: * simple_timer/ * slip/ * sortlist/ - * spi_mngr/ + * stack_info * svc/ * timer/ - * twi/ - * twi_mngr/ + * twi_sensor/ * uart/ * usbd/ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic/nrf_atomic.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic/nrf_atomic.c similarity index 60% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic/nrf_atomic.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic/nrf_atomic.c index 32ae3462fe..8d1609f4eb 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic/nrf_atomic.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic/nrf_atomic.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2018 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,22 +37,7 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/**@file - * - * @defgroup nrf_atomic Atomic operations API - * @ingroup nrf_atfifo - * @{ - * - * @brief @tagAPI52 This module implements C11 stdatomic.h simplified API. - At this point only Cortex-M3/M4 cores are supported (LDREX/STREX instructions). - * Atomic types are limited to @ref nrf_atomic_u32_t and @ref nrf_atomic_flag_t. - */ - -#ifndef NRF_ATOMIC_H__ -#define NRF_ATOMIC_H__ - -#include "sdk_common.h" - +#include "nrf_atomic.h" #ifndef NRF_ATOMIC_USE_BUILD_IN #if (defined(__GNUC__) && defined(WIN32)) @@ -68,33 +53,12 @@ #include "app_util_platform.h" #endif -/** - * @brief Atomic 32 bit unsigned type - * */ -typedef volatile uint32_t nrf_atomic_u32_t; - -/** - * @brief Atomic 1 bit flag type (technically 32 bit) - * */ -typedef volatile uint32_t nrf_atomic_flag_t; #if (NRF_ATOMIC_USE_BUILD_IN == 0) && defined(STREX_LDREX_PRESENT) #include "nrf_atomic_internal.h" #endif -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Stores value to an atomic object - * - * @param[in] p_data Atomic memory pointer - * @param[in] value Value to store - * - * @return Old value stored into atomic object - * */ -static inline uint32_t nrf_atomic_u32_fetch_store(nrf_atomic_u32_t * p_data, uint32_t value) +uint32_t nrf_atomic_u32_fetch_store(nrf_atomic_u32_t * p_data, uint32_t value) { #if NRF_ATOMIC_USE_BUILD_IN return __atomic_exchange_n(p_data, value, __ATOMIC_SEQ_CST); @@ -116,15 +80,7 @@ static inline uint32_t nrf_atomic_u32_fetch_store(nrf_atomic_u32_t * p_data, uin #endif //NRF_ATOMIC_USE_BUILD_IN } -/** - * @brief Stores value to an atomic object - * - * @param[in] p_data Atomic memory pointer - * @param[in] value Value to store - * - * @return New value stored into atomic object - * */ -static inline uint32_t nrf_atomic_u32_store(nrf_atomic_u32_t * p_data, uint32_t value) +uint32_t nrf_atomic_u32_store(nrf_atomic_u32_t * p_data, uint32_t value) { #if NRF_ATOMIC_USE_BUILD_IN __atomic_store_n(p_data, value, __ATOMIC_SEQ_CST); @@ -146,15 +102,7 @@ static inline uint32_t nrf_atomic_u32_store(nrf_atomic_u32_t * p_data, uint32_t #endif //NRF_ATOMIC_USE_BUILD_IN } -/** - * @brief Logical OR operation on an atomic object - * - * @param[in] p_data Atomic memory pointer - * @param[in] value Value of second operand OR operation - * - * @return Old value stored into atomic object - * */ -static inline uint32_t nrf_atomic_u32_fetch_or(nrf_atomic_u32_t * p_data, uint32_t value) +uint32_t nrf_atomic_u32_fetch_or(nrf_atomic_u32_t * p_data, uint32_t value) { #if NRF_ATOMIC_USE_BUILD_IN return __atomic_fetch_or(p_data, value, __ATOMIC_SEQ_CST); @@ -175,15 +123,7 @@ static inline uint32_t nrf_atomic_u32_fetch_or(nrf_atomic_u32_t * p_data, uint32 #endif //NRF_ATOMIC_USE_BUILD_IN } -/** - * @brief Logical OR operation on an atomic object - * - * @param[in] p_data Atomic memory pointer - * @param[in] value Value of second operand OR operation - * - * @return New value stored into atomic object - * */ -static inline uint32_t nrf_atomic_u32_or(nrf_atomic_u32_t * p_data, uint32_t value) +uint32_t nrf_atomic_u32_or(nrf_atomic_u32_t * p_data, uint32_t value) { #if NRF_ATOMIC_USE_BUILD_IN return __atomic_or_fetch(p_data, value, __ATOMIC_SEQ_CST); @@ -204,15 +144,7 @@ static inline uint32_t nrf_atomic_u32_or(nrf_atomic_u32_t * p_data, uint32_t val #endif //NRF_ATOMIC_USE_BUILD_IN } -/** - * @brief Logical AND operation on an atomic object - * - * @param[in] p_data Atomic memory pointer - * @param[in] value Value of second operand AND operation - * - * @return Old value stored into atomic object - * */ -static inline uint32_t nrf_atomic_u32_fetch_and(nrf_atomic_u32_t * p_data, uint32_t value) +uint32_t nrf_atomic_u32_fetch_and(nrf_atomic_u32_t * p_data, uint32_t value) { #if NRF_ATOMIC_USE_BUILD_IN return __atomic_fetch_and(p_data, value, __ATOMIC_SEQ_CST); @@ -233,15 +165,7 @@ static inline uint32_t nrf_atomic_u32_fetch_and(nrf_atomic_u32_t * p_data, uint3 #endif //NRF_ATOMIC_USE_BUILD_IN } -/** - * @brief Logical AND operation on an atomic object - * - * @param[in] p_data Atomic memory pointer - * @param[in] value Value of second operand AND operation - * - * @return New value stored into atomic object - * */ -static inline uint32_t nrf_atomic_u32_and(nrf_atomic_u32_t * p_data, uint32_t value) +uint32_t nrf_atomic_u32_and(nrf_atomic_u32_t * p_data, uint32_t value) { #if NRF_ATOMIC_USE_BUILD_IN return __atomic_and_fetch(p_data, value, __ATOMIC_SEQ_CST); @@ -262,15 +186,7 @@ static inline uint32_t nrf_atomic_u32_and(nrf_atomic_u32_t * p_data, uint32_t va #endif //NRF_ATOMIC_USE_BUILD_IN } -/** - * @brief Logical XOR operation on an atomic object - * - * @param[in] p_data Atomic memory pointer - * @param[in] value Value of second operand XOR operation - * - * @return Old value stored into atomic object - * */ -static inline uint32_t nrf_atomic_u32_fetch_xor(nrf_atomic_u32_t * p_data, uint32_t value) +uint32_t nrf_atomic_u32_fetch_xor(nrf_atomic_u32_t * p_data, uint32_t value) { #if NRF_ATOMIC_USE_BUILD_IN return __atomic_fetch_xor(p_data, value, __ATOMIC_SEQ_CST); @@ -291,15 +207,7 @@ static inline uint32_t nrf_atomic_u32_fetch_xor(nrf_atomic_u32_t * p_data, uint3 #endif //NRF_ATOMIC_USE_BUILD_IN } -/** - * @brief Logical XOR operation on an atomic object - * - * @param[in] p_data Atomic memory pointer - * @param[in] value Value of second operand XOR operation - * - * @return New value stored into atomic object - * */ -static inline uint32_t nrf_atomic_u32_xor(nrf_atomic_u32_t * p_data, uint32_t value) +uint32_t nrf_atomic_u32_xor(nrf_atomic_u32_t * p_data, uint32_t value) { #if NRF_ATOMIC_USE_BUILD_IN return __atomic_xor_fetch(p_data, value, __ATOMIC_SEQ_CST); @@ -320,15 +228,7 @@ static inline uint32_t nrf_atomic_u32_xor(nrf_atomic_u32_t * p_data, uint32_t va #endif //NRF_ATOMIC_USE_BUILD_IN } -/** - * @brief Arithmetic ADD operation on an atomic object - * - * @param[in] p_data Atomic memory pointer - * @param[in] value Value of second operand ADD operation - * - * @return Old value stored into atomic object - * */ -static inline uint32_t nrf_atomic_u32_fetch_add(nrf_atomic_u32_t * p_data, uint32_t value) +uint32_t nrf_atomic_u32_fetch_add(nrf_atomic_u32_t * p_data, uint32_t value) { #if NRF_ATOMIC_USE_BUILD_IN return __atomic_fetch_add(p_data, value, __ATOMIC_SEQ_CST); @@ -349,15 +249,7 @@ static inline uint32_t nrf_atomic_u32_fetch_add(nrf_atomic_u32_t * p_data, uint3 #endif //NRF_ATOMIC_USE_BUILD_IN } -/** - * @brief Arithmetic ADD operation on an atomic object - * - * @param[in] p_data Atomic memory pointer - * @param[in] value Value of second operand ADD operation - * - * @return New value stored into atomic object - * */ -static inline uint32_t nrf_atomic_u32_add(nrf_atomic_u32_t * p_data, uint32_t value) +uint32_t nrf_atomic_u32_add(nrf_atomic_u32_t * p_data, uint32_t value) { #if NRF_ATOMIC_USE_BUILD_IN return __atomic_add_fetch(p_data, value, __ATOMIC_SEQ_CST); @@ -378,15 +270,7 @@ static inline uint32_t nrf_atomic_u32_add(nrf_atomic_u32_t * p_data, uint32_t va #endif //NRF_ATOMIC_USE_BUILD_IN } -/** - * @brief Arithmetic SUB operation on an atomic object - * - * @param[in] p_data Atomic memory pointer - * @param[in] value Value of second operand SUB operation - * - * @return Old value stored into atomic object - * */ -static inline uint32_t nrf_atomic_u32_fetch_sub(nrf_atomic_u32_t * p_data, uint32_t value) +uint32_t nrf_atomic_u32_fetch_sub(nrf_atomic_u32_t * p_data, uint32_t value) { #if NRF_ATOMIC_USE_BUILD_IN return __atomic_fetch_sub(p_data, value, __ATOMIC_SEQ_CST); @@ -407,15 +291,7 @@ static inline uint32_t nrf_atomic_u32_fetch_sub(nrf_atomic_u32_t * p_data, uint3 #endif //NRF_ATOMIC_USE_BUILD_IN } -/** - * @brief Arithmetic SUB operation on an atomic object - * - * @param[in] p_data Atomic memory pointer - * @param[in] value Value of second operand SUB operation - * - * @return New value stored into atomic object - * */ -static inline uint32_t nrf_atomic_u32_sub(nrf_atomic_u32_t * p_data, uint32_t value) +uint32_t nrf_atomic_u32_sub(nrf_atomic_u32_t * p_data, uint32_t value) { #if NRF_ATOMIC_USE_BUILD_IN return __atomic_sub_fetch(p_data, value, __ATOMIC_SEQ_CST); @@ -436,60 +312,136 @@ static inline uint32_t nrf_atomic_u32_sub(nrf_atomic_u32_t * p_data, uint32_t va #endif //NRF_ATOMIC_USE_BUILD_IN } -/**************************************************************************************************/ +bool nrf_atomic_u32_cmp_exch(nrf_atomic_u32_t * p_data, + uint32_t * p_expected, + uint32_t desired) +{ +#if NRF_ATOMIC_USE_BUILD_IN + return __atomic_compare_exchange(p_data, + p_expected, + &desired, + 1, + __ATOMIC_SEQ_CST, + __ATOMIC_SEQ_CST); +#elif defined(STREX_LDREX_PRESENT) + return nrf_atomic_internal_cmp_exch(p_data, p_expected, desired); +#else + CRITICAL_REGION_ENTER(); + if(*p_data == *p_expected) + { + *p_data = desired; + return true; + } + else + { + *p_expected = *p_data; + return false; + } + CRITICAL_REGION_EXIT(); +#endif +} -/** - * @brief Logic one bit flag set operation on an atomic object - * - * @param[in] p_data Atomic flag memory pointer - * - * @return Old flag value - * */ -static inline uint32_t nrf_atomic_flag_set_fetch(nrf_atomic_flag_t * p_data) +uint32_t nrf_atomic_u32_fetch_sub_hs(nrf_atomic_u32_t * p_data, uint32_t value) +{ +#if NRF_ATOMIC_USE_BUILD_IN + uint32_t expected = *p_data; + uint32_t new_val; + bool success; + + do + { + if (expected >= value) + { + new_val = expected - value; + } + else + { + new_val = expected; + } + success = __atomic_compare_exchange(p_data, + &expected, + &new_val, + 1, + __ATOMIC_SEQ_CST, + __ATOMIC_SEQ_CST); + } while(!success); + return expected; +#elif defined(STREX_LDREX_PRESENT) + uint32_t old_val; + uint32_t new_val; + + NRF_ATOMIC_OP(sub_hs, old_val, new_val, p_data, value); + UNUSED_PARAMETER(old_val); + UNUSED_PARAMETER(new_val); + return old_val; +#else + CRITICAL_REGION_ENTER(); + uint32_t old_val = *p_data; + *p_data -= value; + CRITICAL_REGION_EXIT(); + return old_val; +#endif //NRF_ATOMIC_USE_BUILD_IN +} + +uint32_t nrf_atomic_u32_sub_hs(nrf_atomic_u32_t * p_data, uint32_t value) +{ +#if NRF_ATOMIC_USE_BUILD_IN + uint32_t expected = *p_data; + uint32_t new_val; + bool success; + + do + { + if (expected >= value) + { + new_val = expected - value; + } + else + { + new_val = expected; + } + success = __atomic_compare_exchange(p_data, + &expected, + &new_val, + 1, + __ATOMIC_SEQ_CST, + __ATOMIC_SEQ_CST); + } while(!success); + return new_val; +#elif defined(STREX_LDREX_PRESENT) + uint32_t old_val; + uint32_t new_val; + + NRF_ATOMIC_OP(sub_hs, old_val, new_val, p_data, value); + UNUSED_PARAMETER(old_val); + UNUSED_PARAMETER(new_val); + return new_val; +#else + CRITICAL_REGION_ENTER(); + *p_data -= value; + uint32_t new_value = *p_data; + CRITICAL_REGION_EXIT(); + return new_value; +#endif //NRF_ATOMIC_USE_BUILD_IN +} + +uint32_t nrf_atomic_flag_set_fetch(nrf_atomic_flag_t * p_data) { return nrf_atomic_u32_fetch_or(p_data, 1); } -/** - * @brief Logic one bit flag set operation on an atomic object - * - * @param[in] p_data Atomic flag memory pointer - * - * @return New flag value - * */ -static inline uint32_t nrf_atomic_flag_set(nrf_atomic_flag_t * p_data) +uint32_t nrf_atomic_flag_set(nrf_atomic_flag_t * p_data) { return nrf_atomic_u32_or(p_data, 1); } -/** - * @brief Logic one bit flag clear operation on an atomic object - * - * @param[in] p_data Atomic flag memory pointer - * - * @return Old flag value - * */ -static inline uint32_t nrf_atomic_flag_clear_fetch(nrf_atomic_flag_t * p_data) +uint32_t nrf_atomic_flag_clear_fetch(nrf_atomic_flag_t * p_data) { return nrf_atomic_u32_fetch_and(p_data, 0); } -/** - * @brief Logic one bit flag clear operation on an atomic object - * - * @param[in] p_data Atomic flag memory pointer - * - * @return New flag value - * */ -static inline uint32_t nrf_atomic_flag_clear(nrf_atomic_flag_t * p_data) +uint32_t nrf_atomic_flag_clear(nrf_atomic_flag_t * p_data) { return nrf_atomic_u32_and(p_data, 0); } -#ifdef __cplusplus -} -#endif - -#endif /* NRF_ATOMIC_H__ */ - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic/nrf_atomic.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic/nrf_atomic.h new file mode 100644 index 0000000000..6a11eee37e --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic/nrf_atomic.h @@ -0,0 +1,274 @@ +/** + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +/**@file + * + * @defgroup nrf_atomic Atomic operations API + * @ingroup app_common + * @{ + * + * @brief @tagAPI52 This module implements C11 stdatomic.h simplified API. + At this point only Cortex-M3/M4 cores are supported (LDREX/STREX instructions). + * Atomic types are limited to @ref nrf_atomic_u32_t and @ref nrf_atomic_flag_t. + */ + +#ifndef NRF_ATOMIC_H__ +#define NRF_ATOMIC_H__ + +#include "sdk_common.h" + +/** + * @brief Atomic 32 bit unsigned type + * */ +typedef volatile uint32_t nrf_atomic_u32_t; + +/** + * @brief Atomic 1 bit flag type (technically 32 bit) + * */ +typedef volatile uint32_t nrf_atomic_flag_t; + + + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Stores value to an atomic object + * + * @param[in] p_data Atomic memory pointer + * @param[in] value Value to store + * + * @return Old value stored into atomic object + * */ +uint32_t nrf_atomic_u32_fetch_store(nrf_atomic_u32_t * p_data, uint32_t value); + +/** + * @brief Stores value to an atomic object + * + * @param[in] p_data Atomic memory pointer + * @param[in] value Value to store + * + * @return New value stored into atomic object + * */ +uint32_t nrf_atomic_u32_store(nrf_atomic_u32_t * p_data, uint32_t value); + +/** + * @brief Logical OR operation on an atomic object + * + * @param[in] p_data Atomic memory pointer + * @param[in] value Value of second operand OR operation + * + * @return Old value stored into atomic object + * */ +uint32_t nrf_atomic_u32_fetch_or(nrf_atomic_u32_t * p_data, uint32_t value); + +/** + * @brief Logical OR operation on an atomic object + * + * @param[in] p_data Atomic memory pointer + * @param[in] value Value of second operand OR operation + * + * @return New value stored into atomic object + * */ +uint32_t nrf_atomic_u32_or(nrf_atomic_u32_t * p_data, uint32_t value); + +/** + * @brief Logical AND operation on an atomic object + * + * @param[in] p_data Atomic memory pointer + * @param[in] value Value of second operand AND operation + * + * @return Old value stored into atomic object + * */ +uint32_t nrf_atomic_u32_fetch_and(nrf_atomic_u32_t * p_data, uint32_t value); + +/** + * @brief Logical AND operation on an atomic object + * + * @param[in] p_data Atomic memory pointer + * @param[in] value Value of second operand AND operation + * + * @return New value stored into atomic object + * */ +uint32_t nrf_atomic_u32_and(nrf_atomic_u32_t * p_data, uint32_t value); + +/** + * @brief Logical XOR operation on an atomic object + * + * @param[in] p_data Atomic memory pointer + * @param[in] value Value of second operand XOR operation + * + * @return Old value stored into atomic object + * */ +uint32_t nrf_atomic_u32_fetch_xor(nrf_atomic_u32_t * p_data, uint32_t value); + +/** + * @brief Logical XOR operation on an atomic object + * + * @param[in] p_data Atomic memory pointer + * @param[in] value Value of second operand XOR operation + * + * @return New value stored into atomic object + * */ +uint32_t nrf_atomic_u32_xor(nrf_atomic_u32_t * p_data, uint32_t value); + +/** + * @brief Arithmetic ADD operation on an atomic object + * + * @param[in] p_data Atomic memory pointer + * @param[in] value Value of second operand ADD operation + * + * @return Old value stored into atomic object + * */ +uint32_t nrf_atomic_u32_fetch_add(nrf_atomic_u32_t * p_data, uint32_t value); + +/** + * @brief Arithmetic ADD operation on an atomic object + * + * @param[in] p_data Atomic memory pointer + * @param[in] value Value of second operand ADD operation + * + * @return New value stored into atomic object + * */ +uint32_t nrf_atomic_u32_add(nrf_atomic_u32_t * p_data, uint32_t value); + +/** + * @brief Arithmetic SUB operation on an atomic object + * + * @param[in] p_data Atomic memory pointer + * @param[in] value Value of second operand SUB operation + * + * @return Old value stored into atomic object + * */ +uint32_t nrf_atomic_u32_fetch_sub(nrf_atomic_u32_t * p_data, uint32_t value); + +/** + * @brief Arithmetic SUB operation on an atomic object + * + * @param[in] p_data Atomic memory pointer + * @param[in] value Value of second operand SUB operation + * + * @return New value stored into atomic object + * */ +uint32_t nrf_atomic_u32_sub(nrf_atomic_u32_t * p_data, uint32_t value); + +/** + * @brief If value at pointer is equal to expected value, changes value at pointer to desired + * + * Atomically compares the value pointed to by p_data with the value pointed to by p_expected, + * and if those are equal, replaces the former with desired. Otherwise, loads the actual value + * pointed to by p_data into *p_expected. + * + * @param p_data Atomic memory pointer to test and modify. + * @param p_expected Pointer to test value. + * @param desired Value to be stored to atomic memory. + * + * @retval true *p_data was equal to *p_expected + * @retval false *p_data was not equal to *p_expected + */ +bool nrf_atomic_u32_cmp_exch(nrf_atomic_u32_t * p_data, + uint32_t * p_expected, + uint32_t desired); + +/** + * @brief Arithmetic SUB operation on an atomic object performed if object >= value. + * + * @param[in] p_data Atomic memory pointer + * @param[in] value Value of second operand SUB operation + * + * @return Old value stored into atomic object + * */ +uint32_t nrf_atomic_u32_fetch_sub_hs(nrf_atomic_u32_t * p_data, uint32_t value); + +/** + * @brief Arithmetic SUB operation on an atomic object performed if object >= value. + * + * @param[in] p_data Atomic memory pointer + * @param[in] value Value of second operand SUB operation + * + * @return New value stored into atomic object + * */ +uint32_t nrf_atomic_u32_sub_hs(nrf_atomic_u32_t * p_data, uint32_t value); + +/**************************************************************************************************/ + +/** + * @brief Logic one bit flag set operation on an atomic object + * + * @param[in] p_data Atomic flag memory pointer + * + * @return Old flag value + * */ +uint32_t nrf_atomic_flag_set_fetch(nrf_atomic_flag_t * p_data); + +/** + * @brief Logic one bit flag set operation on an atomic object + * + * @param[in] p_data Atomic flag memory pointer + * + * @return New flag value + * */ +uint32_t nrf_atomic_flag_set(nrf_atomic_flag_t * p_data); + +/** + * @brief Logic one bit flag clear operation on an atomic object + * + * @param[in] p_data Atomic flag memory pointer + * + * @return Old flag value + * */ +uint32_t nrf_atomic_flag_clear_fetch(nrf_atomic_flag_t * p_data); + +/** + * @brief Logic one bit flag clear operation on an atomic object + * + * @param[in] p_data Atomic flag memory pointer + * + * @return New flag value + * */ +uint32_t nrf_atomic_flag_clear(nrf_atomic_flag_t * p_data); + +#ifdef __cplusplus +} +#endif + +#endif /* NRF_ATOMIC_H__ */ + +/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic/nrf_atomic_internal.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic/nrf_atomic_internal.h similarity index 71% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic/nrf_atomic_internal.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic/nrf_atomic_internal.h index ada00c6710..534f1b7499 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic/nrf_atomic_internal.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic/nrf_atomic_internal.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -181,6 +181,70 @@ loop_sub bx lr } +static __asm bool nrf_atomic_internal_cmp_exch(nrf_atomic_u32_t * p_data, + uint32_t * p_expected, + uint32_t value) +{ +#define RET_REG r0 +#define P_EXPC r1 +#define VALUE r2 +#define STR_RES r3 +#define P_DATA r4 +#define EXPC_VAL r5 +#define ACT_VAL r6 + + push {r4-r6} + mov P_DATA, r0 + mov RET_REG, #0 + +loop_cmp_exch + ldrex ACT_VAL, [P_DATA] + ldr EXPC_VAL, [P_EXPC] + cmp ACT_VAL, EXPC_VAL + ittee eq + strexeq STR_RES, VALUE, [P_DATA] + moveq RET_REG, #1 + strexne STR_RES, ACT_VAL, [P_DATA] + strne ACT_VAL, [P_EXPC] + cmp STR_RES, #0 + itt ne + movne RET_REG, #0 + bne loop_cmp_exch + + pop {r4-r6} + bx lr + +#undef RET_REG +#undef P_EXPC +#undef VALUE +#undef STR_RES +#undef P_DATA +#undef EXPC_VAL +#undef ACT_VAL +} + +static __asm uint32_t nrf_atomic_internal_sub_hs(nrf_atomic_u32_t * p_ptr, + uint32_t value, + uint32_t * p_new) +{ + push {r4, r5} + mov r4, r0 + +loop_sub_ge + ldrex r0, [r4] + cmp r0, r1 + ite hs + subhs r5, r0, r1 + movlo r5, r0 + strex r3, r5, [r4] + cmp r3, #0 + bne loop_sub_ge + + str r5, [r2] + pop {r4, r5} + bx lr +} + #define NRF_ATOMIC_OP(asm_op, old_val, new_val, ptr, value) \ old_val = nrf_atomic_internal_##asm_op(ptr, value, &new_val) @@ -220,6 +284,51 @@ loop_sub #define NRF_ATOMIC_OP_eor(new_val, old_val, value) "eor %["#new_val"], %["#old_val"], %["#value"]\n" #define NRF_ATOMIC_OP_add(new_val, old_val, value) "add %["#new_val"], %["#old_val"], %["#value"]\n" #define NRF_ATOMIC_OP_sub(new_val, old_val, value) "sub %["#new_val"], %["#old_val"], %["#value"]\n" +#define NRF_ATOMIC_OP_sub_hs(new_val, old_val, value) \ + "cmp %["#old_val"], %["#value"]\n " \ + "ite hs\n" \ + "subhs %["#new_val"], %["#old_val"], %["#value"]\n" \ + "movlo %["#new_val"], %["#old_val"]\n" + +static inline bool nrf_atomic_internal_cmp_exch(nrf_atomic_u32_t * p_data, + uint32_t * p_expected, + uint32_t value) +{ + bool res = false; + uint32_t str_res = 0; + uint32_t act_val = 0; + uint32_t exp_val = 0; + UNUSED_VARIABLE(str_res); + UNUSED_VARIABLE(act_val); + UNUSED_VARIABLE(exp_val); + __ASM volatile( + "1: ldrex %[act_val], [%[ptr]]\n" + " ldr %[exp_val], [%[expc]]\n" + " cmp %[act_val], %[exp_val]\n" + " ittee eq\n" + " strexeq %[str_res], %[value], [%[ptr]]\n" + " moveq %[res], #1\n" + " strexne %[str_res], %[act_val], [%[ptr]]\n" + " strne %[act_val], [%[expc]]\n" + " cmp %[str_res], #0\n" + " itt ne\n" + " movne %[res], #0\n" + " bne.n 1b" + : + [res] "=&r" (res), + [exp_val] "=&r" (exp_val), + [act_val] "=&r" (act_val), + [str_res] "=&r" (str_res) + : + "0" (res), + "1" (exp_val), + "2" (act_val), + [expc] "r" (p_expected), + [ptr] "r" (p_data), + [value] "r" (value) + : "cc"); + return res; +} #else #error "Unsupported compiler" diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic/nrf_atomic_sanity_check.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic/nrf_atomic_sanity_check.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic/nrf_atomic_sanity_check.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic/nrf_atomic_sanity_check.h index f07006cf7c..bbc302cd7e 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic/nrf_atomic_sanity_check.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic/nrf_atomic_sanity_check.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic_fifo/nrf_atfifo.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic_fifo/nrf_atfifo.c similarity index 70% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic_fifo/nrf_atfifo.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic_fifo/nrf_atfifo.c index 179fbfc8de..5d7a8ff278 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic_fifo/nrf_atfifo.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic_fifo/nrf_atfifo.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -39,10 +39,21 @@ */ #include +#include +#include #include "app_util.h" #include "nrf_atfifo.h" #include "nrf_atfifo_internal.h" +#if NRF_ATFIFO_CONFIG_LOG_ENABLED + #define NRF_LOG_LEVEL NRF_ATFIFO_CONFIG_LOG_LEVEL + #define NRF_LOG_INIT_FILTER_LEVEL NRF_ATFIFO_CONFIG_LOG_INIT_FILTER_LEVEL + #define NRF_LOG_INFO_COLOR NRF_ATFIFO_CONFIG_INFO_COLOR + #define NRF_LOG_DEBUG_COLOR NRF_ATFIFO_CONFIG_DEBUG_COLOR +#else + #define NRF_LOG_LEVEL 0 +#endif // NRF_ATFIFO_CONFIG_LOG_ENABLED +#include "nrf_log.h" /* Unions testing */ STATIC_ASSERT(sizeof(nrf_atfifo_postag_t) == sizeof(uint32_t)); @@ -52,10 +63,12 @@ ret_code_t nrf_atfifo_init(nrf_atfifo_t * const p_fifo, void * p_buf, uint16_t b { if (NULL == p_buf) { + NRF_LOG_INST_ERROR(p_fifo->p_log, "Initialization failed. p_buf == NULL"); return NRF_ERROR_NULL; } if (0 != (buf_size % item_size)) { + NRF_LOG_INST_ERROR(p_fifo->p_log, "Initialization failed. Buf_size not multiple of item_size"); return NRF_ERROR_INVALID_LENGTH; } @@ -65,6 +78,7 @@ ret_code_t nrf_atfifo_init(nrf_atfifo_t * const p_fifo, void * p_buf, uint16_t b p_fifo->buf_size = buf_size; p_fifo->item_size = item_size; + NRF_LOG_INST_INFO(p_fifo->p_log, "Initialized."); return NRF_SUCCESS; } @@ -72,6 +86,7 @@ ret_code_t nrf_atfifo_init(nrf_atfifo_t * const p_fifo, void * p_buf, uint16_t b ret_code_t nrf_atfifo_clear(nrf_atfifo_t * const p_fifo) { bool released = nrf_atfifo_space_clear(p_fifo); + NRF_LOG_INST_INFO(p_fifo->p_log, "Cleared result:%s", released ? "success" : "busy"); return released ? NRF_SUCCESS : NRF_ERROR_BUSY; } @@ -83,6 +98,7 @@ ret_code_t nrf_atfifo_alloc_put(nrf_atfifo_t * const p_fifo, void const * p_var, void * p_data = nrf_atfifo_item_alloc(p_fifo, &context); if (NULL == p_data) { + NRF_LOG_INST_WARNING(p_fifo->p_log, "Copying in element (0x%08X) failed - no space.", p_var); return NRF_ERROR_NO_MEM; } @@ -93,6 +109,7 @@ ret_code_t nrf_atfifo_alloc_put(nrf_atfifo_t * const p_fifo, void const * p_var, { *p_visible = visible; } + NRF_LOG_INST_DEBUG(p_fifo->p_log, "Element (0x%08X) copied in.", p_var); return NRF_SUCCESS; } @@ -101,8 +118,11 @@ void * nrf_atfifo_item_alloc(nrf_atfifo_t * const p_fifo, nrf_atfifo_item_put_t { if (nrf_atfifo_wspace_req(p_fifo, &(p_context->last_tail))) { - return ((uint8_t*)(p_fifo->p_buf)) + p_context->last_tail.pos.wr; + void * p_item = ((uint8_t*)(p_fifo->p_buf)) + p_context->last_tail.pos.wr; + NRF_LOG_INST_DEBUG(p_fifo->p_log, "Allocated element (0x%08X).", p_item); + return p_item; } + NRF_LOG_INST_WARNING(p_fifo->p_log, "Allocation failed - no space."); return NULL; } @@ -111,9 +131,11 @@ bool nrf_atfifo_item_put(nrf_atfifo_t * const p_fifo, nrf_atfifo_item_put_t * p_ { if ((p_context->last_tail.pos.wr) == (p_context->last_tail.pos.rd)) { + NRF_LOG_INST_DEBUG(p_fifo->p_log, "Put (uninterrupted)"); nrf_atfifo_wspace_close(p_fifo); return true; } + NRF_LOG_INST_DEBUG(p_fifo->p_log, "Put (interrupted!)"); return false; } @@ -125,6 +147,7 @@ ret_code_t nrf_atfifo_get_free(nrf_atfifo_t * const p_fifo, void * const p_var, void const * p_s = nrf_atfifo_item_get(p_fifo, &context); if (NULL == p_s) { + NRF_LOG_INST_WARNING(p_fifo->p_log, "Copying out failed - no item in the FIFO."); return NRF_ERROR_NOT_FOUND; } @@ -135,6 +158,7 @@ ret_code_t nrf_atfifo_get_free(nrf_atfifo_t * const p_fifo, void * const p_var, { *p_released = released; } + NRF_LOG_INST_DEBUG(p_fifo->p_log, "Element (0x%08X) copied out.", p_var); return NRF_SUCCESS; } @@ -143,8 +167,11 @@ void * nrf_atfifo_item_get(nrf_atfifo_t * const p_fifo, nrf_atfifo_item_get_t * { if (nrf_atfifo_rspace_req(p_fifo, &(p_context->last_head))) { - return ((uint8_t*)(p_fifo->p_buf)) + p_context->last_head.pos.rd; + void * p_item = ((uint8_t*)(p_fifo->p_buf)) + p_context->last_head.pos.rd; + NRF_LOG_INST_DEBUG(p_fifo->p_log, "Get element: 0x%08X", p_item); + return p_item; } + NRF_LOG_INST_WARNING(p_fifo->p_log, "Get failed - no item in the FIFO."); return NULL; } @@ -153,8 +180,10 @@ bool nrf_atfifo_item_free(nrf_atfifo_t * const p_fifo, nrf_atfifo_item_get_t * p { if ((p_context->last_head.pos.wr) == (p_context->last_head.pos.rd)) { + NRF_LOG_INST_DEBUG(p_fifo->p_log, "Free (uninterrupted)"); nrf_atfifo_rspace_close(p_fifo); return true; } + NRF_LOG_INST_DEBUG(p_fifo->p_log, "Free (interrupted)"); return false; } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic_fifo/nrf_atfifo.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic_fifo/nrf_atfifo.h similarity index 89% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic_fifo/nrf_atfifo.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic_fifo/nrf_atfifo.h index 2472d458b5..37cfc7635f 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic_fifo/nrf_atfifo.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic_fifo/nrf_atfifo.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -41,9 +41,12 @@ #define NRF_ATFIFO_H__ #include +#include +#include "sdk_config.h" #include "nordic_common.h" #include "nrf_assert.h" - +#include "sdk_errors.h" +#include "nrf_log_instance.h" #ifdef __cplusplus extern "C" { #endif @@ -133,11 +136,12 @@ typedef union nrf_atfifo_postag_u */ typedef struct nrf_atfifo_s { - void * p_buf; //!< Pointer to the data buffer - nrf_atfifo_postag_t tail; //!< Read and write tail position tag - nrf_atfifo_postag_t head; //!< Read and write head position tag - uint16_t buf_size; //!< FIFO size in number of bytes (has to be divisible by @c item_size) - uint16_t item_size; //!< Size of a single FIFO item + void * p_buf; //!< Pointer to the data buffer + nrf_atfifo_postag_t tail; //!< Read and write tail position tag + nrf_atfifo_postag_t head; //!< Read and write head position tag + uint16_t buf_size; //!< FIFO size in number of bytes (has to be divisible by @c item_size) + uint16_t item_size; //!< Size of a single FIFO item + NRF_LOG_INSTANCE_PTR_DECLARE(p_log) //!< Pointer to instance of the logger object (Conditionally compiled). }nrf_atfifo_t; /** @@ -163,6 +167,10 @@ typedef struct nrf_atfifo_rcontext_s }nrf_atfifo_item_get_t; +/** @brief Name of the module used for logger messaging. + */ +#define NRF_ATFIFO_LOG_NAME atfifo + /** * @defgroup nrf_atfifo_instmacros FIFO instance macros * @@ -227,9 +235,18 @@ typedef struct nrf_atfifo_rcontext_s * @param[in] item_cnt Capacity of the created FIFO in maximum number of items that may be stored. * The phisical size of the buffer will be 1 element bigger. */ - #define NRF_ATFIFO_DEF(fifo_id, storage_type, item_cnt) \ - static storage_type NRF_ATFIFO_BUF_NAME(fifo_id)[(item_cnt)+1]; \ - static nrf_atfifo_t NRF_ATFIFO_INST_NAME(fifo_id); \ + #define NRF_ATFIFO_DEF(fifo_id, storage_type, item_cnt) \ + static storage_type NRF_ATFIFO_BUF_NAME(fifo_id)[(item_cnt)+1]; \ + NRF_LOG_INSTANCE_REGISTER(NRF_ATFIFO_LOG_NAME, fifo_id, \ + NRF_ATFIFO_CONFIG_INFO_COLOR, \ + NRF_ATFIFO_CONFIG_DEBUG_COLOR, \ + NRF_ATFIFO_CONFIG_LOG_INIT_FILTER_LEVEL, \ + NRF_ATFIFO_CONFIG_LOG_ENABLED ? \ + NRF_ATFIFO_CONFIG_LOG_LEVEL : NRF_LOG_SEVERITY_NONE); \ + static nrf_atfifo_t NRF_ATFIFO_INST_NAME(fifo_id) = { \ + .p_buf = NULL, \ + NRF_LOG_INSTANCE_PTR_INIT(p_log, NRF_ATFIFO_LOG_NAME, fifo_id) \ + }; \ static nrf_atfifo_t * const fifo_id = &NRF_ATFIFO_INST_NAME(fifo_id) /** diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic_fifo/nrf_atfifo_internal.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic_fifo/nrf_atfifo_internal.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic_fifo/nrf_atfifo_internal.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic_fifo/nrf_atfifo_internal.h index 477b91ff2f..d8623521fb 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/atomic_fifo/nrf_atfifo_internal.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/atomic_fifo/nrf_atfifo_internal.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -64,8 +64,9 @@ * Make sure that rd and wr pos in a tag are aligned like expected * Changing this would require changes inside assembly code! */ -STATIC_ASSERT(offsetof(nrf_atfifo_postag_pos_t, wr) == 0); -STATIC_ASSERT(offsetof(nrf_atfifo_postag_pos_t, rd) == 2); +// Mbed - saving for later... we run armcc in a gcc mode and this is causigg a problem +// STATIC_ASSERT(offsetof(nrf_atfifo_postag_pos_t, wr) == 0); +// STATIC_ASSERT(offsetof(nrf_atfifo_postag_pos_t, rd) == 2); /** * @brief Atomically reserve space for a new write. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/balloc/nrf_balloc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/balloc/nrf_balloc.c similarity index 72% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/balloc/nrf_balloc.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/balloc/nrf_balloc.c index b2eb43d091..d228f32e0e 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/balloc/nrf_balloc.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/balloc/nrf_balloc.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -40,19 +40,20 @@ #include "sdk_common.h" #if NRF_MODULE_ENABLED(NRF_BALLOC) +#include "nrf_section.h" #include "nrf_balloc.h" #include "app_util_platform.h" -#define NRF_LOG_MODULE_NAME balloc + #if NRF_BALLOC_CONFIG_LOG_ENABLED - #define NRF_LOG_LEVEL NRF_BALLOC_CONFIG_LOG_LEVEL - #define NRF_LOG_INFO_COLOR NRF_BALLOC_CONFIG_INFO_COLOR - #define NRF_LOG_DEBUG_COLOR NRF_BALLOC_CONFIG_DEBUG_COLOR + #define NRF_LOG_LEVEL NRF_BALLOC_CONFIG_LOG_LEVEL + #define NRF_LOG_INITIAL_LEVEL NRF_BALLOC_CONFIG_INITIAL_LOG_LEVEL + #define NRF_LOG_INFO_COLOR NRF_BALLOC_CONFIG_INFO_COLOR + #define NRF_LOG_DEBUG_COLOR NRF_BALLOC_CONFIG_DEBUG_COLOR #else #define NRF_LOG_LEVEL 0 #endif // NRF_BALLOC_CONFIG_LOG_ENABLED #include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); #define HEAD_GUARD_FILL 0xBAADF00D /**< Magic number used to mark head guard.*/ #define TAIL_GUARD_FILL 0xBAADCAFE /**< Magic number used to mark tail guard.*/ @@ -66,8 +67,61 @@ NRF_LOG_MODULE_REGISTER(); #define POOL_MARKER "0x%08X" #endif -#if NRF_BALLOC_CONFIG_DEBUG_ENABLED +NRF_SECTION_DEF(nrf_balloc, nrf_balloc_t); +#if NRF_BALLOC_CLI_CMDS +#include "nrf_cli.h" + +static void nrf_balloc_status(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + UNUSED_PARAMETER(argv); + + if (nrf_cli_help_requested(p_cli)) + { + nrf_cli_help_print(p_cli, NULL, 0); + return; + } + + if (argc > 1) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "Bad argument count"); + return; + } + + uint32_t num_of_instances = NRF_SECTION_ITEM_COUNT(nrf_balloc, nrf_balloc_t); + uint32_t i; + + for (i = 0; i < num_of_instances; i++) + { + const nrf_balloc_t * p_instance = NRF_SECTION_ITEM_GET(nrf_balloc, nrf_balloc_t, i); + + uint32_t element_size = NRF_BALLOC_ELEMENT_SIZE(p_instance); + uint32_t dbg_addon = p_instance->block_size - element_size; + uint32_t pool_size = p_instance->p_stack_limit - p_instance->p_stack_base; + uint32_t max_util = nrf_balloc_max_utilization_get(p_instance); + uint32_t util = nrf_balloc_utilization_get(p_instance); + const char * p_name = p_instance->p_name; + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, + "%s\r\n\t- Element size:\t%d + %d bytes of debug information\r\n" + "\t- Usage:\t%u%% (%u out of %u elements)\r\n" + "\t- Maximum:\t%u%% (%u out of %u elements)\r\n\r\n", + p_name, element_size, dbg_addon, + 100ul * util/pool_size, util,pool_size, + 100ul * max_util/pool_size, max_util,pool_size); + + } +} +// Register "balloc" command and its subcommands in CLI. +NRF_CLI_CREATE_STATIC_SUBCMD_SET(nrf_balloc_commands) +{ + NRF_CLI_CMD(status, NULL, "Print status of balloc instances.", nrf_balloc_status), + NRF_CLI_SUBCMD_SET_END +}; + +NRF_CLI_CMD_REGISTER(balloc, &nrf_balloc_commands, "Commands for BALLOC management", nrf_balloc_status); +#endif //NRF_BALLOC_CLI_CMDS + +#if NRF_BALLOC_CONFIG_DEBUG_ENABLED /**@brief Validate block memory, prepare block guards, and calculate pointer to the element. * * @param[in] p_pool Pointer to the memory pool. @@ -92,8 +146,9 @@ __STATIC_INLINE void * nrf_balloc_block_unwrap(nrf_balloc_t const * p_pool, void { if (*ptr != FREE_MEM_FILL) { - NRF_LOG_ERROR("Detected free memory corruption at 0x%08X (0x%08X != 0x%08X, pool: '" POOL_MARKER "')", - ptr, *ptr, FREE_MEM_FILL, POOL_ID(p_pool)); + NRF_LOG_INST_ERROR(p_pool->p_log, + "Detected free memory corruption at 0x%08X (0x%08X != 0x%08X)", + ptr, *ptr, FREE_MEM_FILL); APP_ERROR_CHECK_BOOL(false); } } @@ -134,8 +189,9 @@ __STATIC_INLINE void * nrf_balloc_element_wrap(nrf_balloc_t const * p_pool, void { if (*ptr != HEAD_GUARD_FILL) { - NRF_LOG_ERROR("Detected Head Guard corruption at 0x%08X (0x%08X != 0x%08X, pool: '" POOL_MARKER "')", - ptr, *ptr, HEAD_GUARD_FILL, POOL_ID(p_pool)); + NRF_LOG_INST_ERROR(p_pool->p_log, + "Detected Head Guard corruption at 0x%08X (0x%08X != 0x%08X)", + ptr, *ptr, HEAD_GUARD_FILL); APP_ERROR_CHECK_BOOL(false); } } @@ -144,8 +200,9 @@ __STATIC_INLINE void * nrf_balloc_element_wrap(nrf_balloc_t const * p_pool, void { if (*ptr != TAIL_GUARD_FILL) { - NRF_LOG_ERROR("Detected Tail Guard corruption at 0x%08X (0x%08X != 0x%08X, pool: '" POOL_MARKER "')", - ptr, *ptr, TAIL_GUARD_FILL, POOL_ID(p_pool)); + NRF_LOG_INST_ERROR(p_pool->p_log, + "Detected Tail Guard corruption at 0x%08X (0x%08X != 0x%08X)", + ptr, *ptr, TAIL_GUARD_FILL); APP_ERROR_CHECK_BOOL(false); } } @@ -214,11 +271,10 @@ ret_code_t nrf_balloc_init(nrf_balloc_t const * p_pool) } #endif - NRF_LOG_INFO("Pool '" POOL_MARKER "' initialized (size: %u x %u = %u bytes)", - POOL_ID(p_pool), - pool_size, - p_pool->block_size, - pool_size * p_pool->block_size); + NRF_LOG_INST_INFO(p_pool->p_log, "Initialized (size: %u x %u = %u bytes)", + pool_size, + p_pool->block_size, + pool_size * p_pool->block_size); p_pool->p_cb->p_stack_pointer = p_pool->p_stack_base; while (pool_size--) @@ -261,8 +317,7 @@ void * nrf_balloc_alloc(nrf_balloc_t const * p_pool) } #endif - NRF_LOG_DEBUG("nrf_balloc_alloc(pool: '" POOL_MARKER "', element: 0x%08X)", - POOL_ID(p_pool), p_block); + NRF_LOG_INST_DEBUG(p_pool->p_log, "Allocating element: 0x%08X", p_block); return p_block; } @@ -272,8 +327,7 @@ void nrf_balloc_free(nrf_balloc_t const * p_pool, void * p_element) ASSERT(p_pool != NULL); ASSERT(p_element != NULL) - NRF_LOG_DEBUG("nrf_balloc_free(pool: '" POOL_MARKER "', element: 0x%08X)", - POOL_ID(p_pool), p_element); + NRF_LOG_INST_DEBUG(p_pool->p_log, "Freeing element: 0x%08X", p_element); #if NRF_BALLOC_CONFIG_DEBUG_ENABLED void * p_block = nrf_balloc_element_wrap(p_pool, p_element); @@ -287,16 +341,17 @@ void nrf_balloc_free(nrf_balloc_t const * p_pool, void * p_element) // Check if the element belongs to this pool. if ((p_block < p_pool->p_memory_begin) || (p_block >= p_memory_end)) { - NRF_LOG_ERROR("Attempted to free element that does belong to the pool (pool: '" POOL_MARKER "', element: 0x%08X)", - POOL_ID(p_pool), p_element); + NRF_LOG_INST_ERROR(p_pool->p_log, + "Attempted to free element (0x%08X) that does not belong to the pool.", + p_element); APP_ERROR_CHECK_BOOL(false); } // Check if the pointer is valid. if ((((size_t)(p_block) - (size_t)(p_pool->p_memory_begin)) % p_pool->block_size) != 0) { - NRF_LOG_ERROR("Atempted to free corrupted element address (pool: '" POOL_MARKER "', element: 0x%08X)", - POOL_ID(p_pool), p_element); + NRF_LOG_INST_ERROR(p_pool->p_log, + "Attempted to free corrupted element address (0x%08X).", p_element); APP_ERROR_CHECK_BOOL(false); } } @@ -313,8 +368,9 @@ void nrf_balloc_free(nrf_balloc_t const * p_pool, void * p_element) // Check for allocated/free ballance. if (p_pool->p_cb->p_stack_pointer >= p_pool->p_stack_limit) { - NRF_LOG_ERROR("Attempted to free an element while the pool is full (pool: '" POOL_MARKER "', element: 0x%08X)", - POOL_ID(p_pool), p_element); + NRF_LOG_INST_ERROR(p_pool->p_log, + "Attempted to free an element (0x%08X) while the pool is full.", + p_element); APP_ERROR_CHECK_BOOL(false); } } @@ -326,8 +382,8 @@ void nrf_balloc_free(nrf_balloc_t const * p_pool, void * p_element) { if (nrf_balloc_idx2block(p_pool, *p_idx) == p_block) { - NRF_LOG_ERROR("Attempted to double-free an element (pool: '" POOL_MARKER "', element: 0x%08X)", - POOL_ID(p_pool), p_element); + NRF_LOG_INST_ERROR(p_pool->p_log, "Attempted to double-free an element (0x%08X).", + p_element); APP_ERROR_CHECK_BOOL(false); } } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/balloc/nrf_balloc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/balloc/nrf_balloc.h similarity index 88% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/balloc/nrf_balloc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/balloc/nrf_balloc.h index 20c2c35e3b..0f781a685b 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/balloc/nrf_balloc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/balloc/nrf_balloc.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -56,6 +56,19 @@ extern "C" { #include "sdk_config.h" #include "app_util_platform.h" #include "app_util.h" +#include "nrf_log_instance.h" +#include "nrf_section.h" + +/** @brief Name of the module used for logger messaging. + */ +#define NRF_BALLOC_LOG_NAME balloc + +#if NRF_BALLOC_CONFIG_DEBUG_ENABLED || NRF_BALLOC_CLI_CMDS +#define NRF_BALLOC_HAS_NAME 1 +#else +#define NRF_BALLOC_HAS_NAME 0 +#endif + /**@defgroup NRF_BALLOC_DEBUG Macros for preparing debug flags for block allocator module. * @{ */ #define NRF_BALLOC_DEBUG_HEAD_GUARD_WORDS_SET(words) (((words) & 0xFF) << 0) @@ -107,9 +120,11 @@ typedef struct /**< * Memory is used as a heap for blocks. */ - -#if NRF_BALLOC_CONFIG_DEBUG_ENABLED + NRF_LOG_INSTANCE_PTR_DECLARE(p_log) //!< Pointer to instance of the logger object (Conditionally compiled). +#if NRF_BALLOC_HAS_NAME const char * p_name; //!< Pointer to string with pool name. +#endif +#if NRF_BALLOC_CONFIG_DEBUG_ENABLED uint32_t debug_flags; //!< Debugging settings. /**< * Debug flag should be created by @ref NRF_BALLOC_DEBUG. @@ -157,10 +172,14 @@ typedef struct #endif // NRF_BALLOC_CONFIG_DEBUG_ENABLED #if NRF_BALLOC_CONFIG_DEBUG_ENABLED -#define __NRF_BALLOC_ASSIGN_POOL_NAME(_name) .p_name = STRINGIFY(_name), #define __NRF_BALLOC_ASSIGN_DEBUG_FLAGS(_debug_flags) .debug_flags = (_debug_flags), #else #define __NRF_BALLOC_ASSIGN_DEBUG_FLAGS(_debug_flags) +#endif + +#if NRF_BALLOC_HAS_NAME +#define __NRF_BALLOC_ASSIGN_POOL_NAME(_name) .p_name = STRINGIFY(_name), +#else #define __NRF_BALLOC_ASSIGN_POOL_NAME(_name) #endif @@ -180,7 +199,13 @@ typedef struct static uint32_t CONCAT_2(_name,_nrf_balloc_pool_mem) \ [NRF_BALLOC_BLOCK_SIZE(_element_size, _debug_flags) * (_pool_size) / sizeof(uint32_t)]; \ static nrf_balloc_cb_t CONCAT_2(_name,_nrf_balloc_cb); \ - static const nrf_balloc_t _name = \ + NRF_LOG_INSTANCE_REGISTER(NRF_BALLOC_LOG_NAME, _name, \ + NRF_BALLOC_CONFIG_INFO_COLOR, \ + NRF_BALLOC_CONFIG_DEBUG_COLOR, \ + NRF_BALLOC_CONFIG_INITIAL_LOG_LEVEL, \ + NRF_BALLOC_CONFIG_LOG_ENABLED ? \ + NRF_BALLOC_CONFIG_LOG_LEVEL : NRF_LOG_SEVERITY_NONE); \ + NRF_SECTION_ITEM_REGISTER(nrf_balloc, const nrf_balloc_t _name) = \ { \ .p_cb = &CONCAT_2(_name,_nrf_balloc_cb), \ .p_stack_base = CONCAT_2(_name,_nrf_balloc_pool_stack), \ @@ -188,6 +213,7 @@ typedef struct .p_memory_begin = CONCAT_2(_name,_nrf_balloc_pool_mem), \ .block_size = NRF_BALLOC_BLOCK_SIZE(_element_size, _debug_flags), \ \ + NRF_LOG_INSTANCE_PTR_INIT(p_log, NRF_BALLOC_LOG_NAME, _name) \ __NRF_BALLOC_ASSIGN_POOL_NAME(_name) \ __NRF_BALLOC_ASSIGN_DEBUG_FLAGS(_debug_flags) \ } @@ -200,7 +226,7 @@ typedef struct * @param[in] _element_size Size of one element. * @param[in] _pool_size Size of the pool. */ -#define NRF_BALLOC_DEF(_name, _element_size, _pool_size) \ +#define NRF_BALLOC_DEF(_name, _element_size, _pool_size) \ NRF_BALLOC_DBG_DEF(_name, _element_size, _pool_size, NRF_BALLOC_DEFAULT_DEBUG_FLAGS) /**@brief Create a block allocator interface. @@ -301,6 +327,22 @@ __STATIC_INLINE uint8_t nrf_balloc_max_utilization_get(nrf_balloc_t const * p_po } #endif //SUPPRESS_INLINE_IMPLEMENTATION +/**@brief Function for getting current memory pool utilization. + * + * @param[in] p_pool Pointer to the memory pool instance. + * + * @return Maximum number of elements allocated from the pool. + */ +__STATIC_INLINE uint8_t nrf_balloc_utilization_get(nrf_balloc_t const * p_pool); + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION +__STATIC_INLINE uint8_t nrf_balloc_utilization_get(nrf_balloc_t const * p_pool) +{ + ASSERT(p_pool != NULL); + return (p_pool->p_stack_limit - p_pool->p_cb->p_stack_pointer); +} +#endif //SUPPRESS_INLINE_IMPLEMENTATION + #ifdef __cplusplus } #endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/delay/nrf_delay.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/delay/nrf_delay.h new file mode 100644 index 0000000000..2a6faf2dc4 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/delay/nrf_delay.h @@ -0,0 +1,80 @@ +/** + * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _NRF_DELAY_H +#define _NRF_DELAY_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Function for delaying execution for a number of microseconds. + * + * @param us_time Number of microseconds to wait. + */ +#define nrf_delay_us(us_time) NRFX_DELAY_US(us_time) + + +/** + * @brief Function for delaying execution for a number of milliseconds. + * + * @param ms_time Number of milliseconds to wait. + */ + +__STATIC_INLINE void nrf_delay_ms(uint32_t ms_time) +{ + if (ms_time == 0) + { + return; + } + + do { + nrf_delay_us(1000); + } while (--ms_time); +} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log.h similarity index 62% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log.h index 967bc1a28a..d709d23f71 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -71,6 +71,12 @@ extern "C" { #define NRF_LOG_LEVEL NRF_LOG_DEFAULT_LEVEL #endif +/** @brief Initial severity if filtering is enabled. + */ +#ifndef NRF_LOG_INITIAL_LEVEL + #define NRF_LOG_INITIAL_LEVEL NRF_LOG_LEVEL +#endif + #include "nrf_log_internal.h" @@ -107,14 +113,54 @@ extern "C" { #define NRF_LOG_INFO(...) NRF_LOG_INTERNAL_INFO( __VA_ARGS__) #define NRF_LOG_DEBUG(...) NRF_LOG_INTERNAL_DEBUG( __VA_ARGS__) +/** @def NRF_LOG_INST_ERROR + * @brief Macro for logging error messages for a given module instance. It takes a printf-like, formatted + * string with up to seven arguments. + * + * @param p_inst Pointer to the instance with logging support. + * + * @details This macro is compiled only if @ref NRF_LOG_LEVEL includes error logs. + */ + +/** @def NRF_LOG_INST_WARNING + * @brief Macro for logging error messages for a given module instance. It takes a printf-like, formatted + * string with up to seven arguments. + * + * @param p_inst Pointer to the instance with logging support. + * + * @details This macro is compiled only if @ref NRF_LOG_LEVEL includes error logs. + */ + +/** @def NRF_LOG_INST_INFO + * @brief Macro for logging error messages for a given module instance. It takes a printf-like, formatted + * string with up to seven arguments. + * + * @param p_inst Pointer to the instance with logging support. + * + * @details This macro is compiled only if @ref NRF_LOG_LEVEL includes error logs. + */ + +/** @def NRF_LOG_INST_DEBUG + * @brief Macro for logging error messages for given module instance. It takes a printf-like, formatted + * string with up to seven arguments. + * + * @param p_inst Pointer to the instance with logging support. + * + * @details This macro is compiled only if @ref NRF_LOG_LEVEL includes error logs. + */ +#define NRF_LOG_INST_ERROR(p_inst,...) NRF_LOG_INTERNAL_INST_ERROR(p_inst,__VA_ARGS__) +#define NRF_LOG_INST_WARNING(p_inst,...) NRF_LOG_INTERNAL_INST_WARNING(p_inst,__VA_ARGS__) +#define NRF_LOG_INST_INFO(p_inst,...) NRF_LOG_INTERNAL_INST_INFO(p_inst, __VA_ARGS__) +#define NRF_LOG_INST_DEBUG(p_inst,...) NRF_LOG_INTERNAL_INST_DEBUG(p_inst, __VA_ARGS__) + /** - * @brief A macro for logging a formatted string without any prefix or timestamp. + * @brief Macro for logging a formatted string without any prefix or timestamp. */ #define NRF_LOG_RAW_INFO(...) NRF_LOG_INTERNAL_RAW_INFO( __VA_ARGS__) /** @def NRF_LOG_HEXDUMP_ERROR * @brief Macro for logging raw bytes. - * @details It is compiled in only if @ref NRF_LOG_LEVEL includes error logs. + * @details This macro is compiled only if @ref NRF_LOG_LEVEL includes error logs. * * @param p_data Pointer to data. * @param len Data length in bytes. @@ -145,20 +191,51 @@ extern "C" { #define NRF_LOG_HEXDUMP_INFO(p_data, len) NRF_LOG_INTERNAL_HEXDUMP_INFO(p_data, len) #define NRF_LOG_HEXDUMP_DEBUG(p_data, len) NRF_LOG_INTERNAL_HEXDUMP_DEBUG(p_data, len) +/** @def NRF_LOG_HEXDUMP_INST_ERROR + * @brief Macro for logging raw bytes for a specific module instance. + * @details This macro is compiled only if @ref NRF_LOG_LEVEL includes error logs. + * + * @param p_inst Pointer to the instance with logging support. + * @param p_data Pointer to data. + * @param len Data length in bytes. + */ +/** @def NRF_LOG_HEXDUMP_INST_WARNING + * @brief Macro for logging raw bytes for a specific module instance. + * @details This macro is compiled only if @ref NRF_LOG_LEVEL includes error logs. + * + * @param p_inst Pointer to the instance with logging support. + * @param p_data Pointer to data. + * @param len Data length in bytes. + */ +/** @def NRF_LOG_HEXDUMP_INST_INFO + * @brief Macro for logging raw bytes for a specific module instance. + * @details This macro is compiled only if @ref NRF_LOG_LEVEL includes error logs. + * + * @param p_inst Pointer to the instance with logging support. + * @param p_data Pointer to data. + * @param len Data length in bytes. + */ +/** @def NRF_LOG_HEXDUMP_INST_DEBUG + * @brief Macro for logging raw bytes for a specific module instance. + * @details This macro is compiled only if @ref NRF_LOG_LEVEL includes error logs. + * + * @param p_inst Pointer to the instance with logging support. + * @param p_data Pointer to data. + * @param len Data length in bytes. + */ +#define NRF_LOG_HEXDUMP_INST_ERROR(p_inst, p_data, len) NRF_LOG_INTERNAL_HEXDUMP_INST_ERROR(p_inst, p_data, len) +#define NRF_LOG_HEXDUMP_INST_WARNING(p_inst, p_data, len) NRF_LOG_INTERNAL_HEXDUMP_INST_WARNING(p_inst, p_data, len) +#define NRF_LOG_HEXDUMP_INST_INFO(p_inst, p_data, len) NRF_LOG_INTERNAL_HEXDUMP_INST_INFO(p_inst, p_data, len) +#define NRF_LOG_HEXDUMP_INST_DEBUG(p_inst, p_data, len) NRF_LOG_INTERNAL_HEXDUMP_INST_DEBUG(p_inst, p_data, len) + /** * @brief Macro for logging hexdump without any prefix or timestamp. */ #define NRF_LOG_RAW_HEXDUMP_INFO(p_data, len) NRF_LOG_INTERNAL_RAW_HEXDUMP_INFO(p_data, len) -/** - * @brief A macro for blocking reading from bidirectional backend used for logging. - * - * Macro call is blocking and returns when single byte is received. - */ -#define NRF_LOG_GETCHAR() NRF_LOG_INTERNAL_GETCHAR() /** - * @brief A macro for copying a string to internal logger buffer if logs are deferred. + * @brief Macro for copying a string to internal logger buffer if logs are deferred. * * @param _str String. */ @@ -182,7 +259,7 @@ uint32_t nrf_log_push(char * const p_str); /** * @brief Macro to be used in a formatted string to a pass float number to the log. * - * Macro should be used in formatted string instead of the %f specifier together with + * Use this macro in a formatted string instead of the %f specifier together with * @ref NRF_LOG_FLOAT macro. * Example: NRF_LOG_INFO("My float number" NRF_LOG_FLOAT_MARKER "\r\n", NRF_LOG_FLOAT(f))) */ @@ -197,33 +274,13 @@ uint32_t nrf_log_push(char * const p_str); : (int32_t)(val) - (val))*100) - /** - * @def NRF_LOG_MODULE_REGISTER * @brief Macro for registering an independent module. + * + * Registration creates set of dynamic (RAM) and constant variables associated with the module. */ -#if NRF_LOG_ENABLED +#define NRF_LOG_MODULE_REGISTER() NRF_LOG_INTERNAL_MODULE_REGISTER() -#ifdef UNIT_TEST -#define _CONST -#define COMPILED_LOG_LEVEL 4 -#else -#define _CONST const -#define COMPILED_LOG_LEVEL NRF_LOG_LEVEL -#endif -#define NRF_LOG_MODULE_REGISTER() \ - NRF_SECTION_ITEM_REGISTER(NRF_LOG_CONST_SECTION_NAME(NRF_LOG_MODULE_NAME), \ - _CONST nrf_log_module_const_data_t NRF_LOG_MODULE_DATA_CONST) = { \ - .p_module_name = STRINGIFY(NRF_LOG_MODULE_NAME), \ - .info_color_id = NRF_LOG_INFO_COLOR, \ - .debug_color_id = NRF_LOG_DEBUG_COLOR, \ - .compiled_lvl = COMPILED_LOG_LEVEL, \ - }; \ - NRF_SECTION_ITEM_REGISTER(NRF_LOG_DYNAMIC_SECTION_NAME(NRF_LOG_MODULE_NAME), \ - nrf_log_module_dynamic_data_t NRF_LOG_MODULE_DATA_DYNAMIC) -#else -#define NRF_LOG_MODULE_REGISTER() /*lint -save -e19*/ /*lint -restore*/ -#endif #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_backend_flash.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_backend_flash.h new file mode 100644 index 0000000000..c93ae35410 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_backend_flash.h @@ -0,0 +1,129 @@ +/** + * Copyright (c) 2018 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + + /**@file + * + * @defgroup nrf_log_backend_flash Flash logger backend + * @{ + * @ingroup nrf_log + * @brief Flash logger backend. + */ + +#ifndef NRF_LOG_BACKEND_FLASH_H +#define NRF_LOG_BACKEND_FLASH_H + +#include "nrf_log_backend_interface.h" +#include "nrf_fstorage.h" +#include "nrf_log_internal.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @brief Flashlog logger backend API. */ +extern const nrf_log_backend_api_t nrf_log_backend_flashlog_api; + +/** @brief Crashlog logger backend API. */ +extern const nrf_log_backend_api_t nrf_log_backend_crashlog_api; + +/** @brief Flashlog logger backend structure. */ +typedef struct { + nrf_log_backend_t backend; +} nrf_log_backend_flashlog_t; + +/** @brief Crashlog logger backend structure. */ +typedef struct { + nrf_log_backend_t backend; +} nrf_log_backend_crashlog_t; + +/** @brief Macro for creating an instance of the flashlog logger backend. */ +#define NRF_LOG_BACKEND_FLASHLOG_DEF(name) \ + static nrf_log_backend_flashlog_t name = { \ + .backend = {.p_api = &nrf_log_backend_flashlog_api}, \ + } + +/** @brief Macro for creating an instance of the crashlog logger backend. */ +#define NRF_LOG_BACKEND_CRASHLOG_DEF(name) \ + static nrf_log_backend_crashlog_t name = { \ + .backend = {.p_api = &nrf_log_backend_crashlog_api}, \ + } + +/** + * @brief Function for initializing the flash logger backend. + * + * Flash logger backend consists of two logical backends: flashlog and crashlog. Since both + * backends write to the same flash area, the initialization is common. + * + * @param p_fs_api fstorage API to be used. + * + * @return NRF_SUCCESS or error code returned by @ref nrf_fstorage_init. + */ +ret_code_t nrf_log_backend_flash_init(nrf_fstorage_api_t const * p_fs_api); + +/** + * @brief Function for getting a log entry stored in flash. + * + * Log messages stored in flash can be read one by one starting from the oldest one. + * + * @param[in, out] p_token Token reused between consecutive readings of log entries. + * Token must be set to 0 to read the first entry. + * @param[out] pp_header Pointer to the entry header. + * @param[out] pp_data Pointer to the data part of the entry (arguments or data in case of hexdump). + * + * @retval NRF_SUCCESS Entry was successfully read. + * @retval NRF_ERROR_NOT_SUPPORTED fstorage API does not support direct reading. + * @retval NRF_ERROR_NOT_FOUND Entry not found. Last entry was already reached or area is empty. + */ +ret_code_t nrf_log_backend_flash_next_entry_get(uint32_t * p_token, + nrf_log_header_t * * pp_header, + uint8_t * * pp_data); + +/** + * @brief Function for erasing flash area dedicated for the flash logger backend. + */ +ret_code_t nrf_log_backend_flash_erase(void); + +#ifdef __cplusplus +} +#endif + +#endif //NRF_LOG_BACKEND_UART_H + +/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_backend_interface.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_backend_interface.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_backend_interface.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_backend_interface.h index e5b965f44d..9d1af51f9a 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_backend_interface.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_backend_interface.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -117,6 +117,8 @@ __STATIC_INLINE void nrf_log_backend_panic_set(nrf_log_backend_t const * p_backe /** * @brief Function for flushing backend. * + * On flushing request backend should release log message(s). + * * @param[in] p_backend Pointer to the backend instance. */ __STATIC_INLINE void nrf_log_backend_flush(nrf_log_backend_t const * p_backend); @@ -179,7 +181,7 @@ __STATIC_INLINE void nrf_log_backend_panic_set(nrf_log_backend_t const * p_backe __STATIC_INLINE void nrf_log_backend_flush(nrf_log_backend_t const * p_backend) { - p_backend->p_api->panic_set(p_backend); + p_backend->p_api->flush(p_backend); } __STATIC_INLINE void nrf_log_backend_id_set(nrf_log_backend_t * p_backend, uint8_t id) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_backend_rtt.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_backend_rtt.h similarity index 95% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_backend_rtt.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_backend_rtt.h index 66eeeb6545..efa1032fd6 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_backend_rtt.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_backend_rtt.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -51,6 +51,10 @@ #include "nrf_log_backend_interface.h" +#ifdef __cplusplus +extern "C" { +#endif + extern const nrf_log_backend_api_t nrf_log_backend_rtt_api; typedef struct { @@ -68,6 +72,11 @@ typedef struct { } void nrf_log_backend_rtt_init(void); + +#ifdef __cplusplus +} +#endif + #endif //NRF_LOG_BACKEND_RTT_H /** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_backend_uart.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_backend_uart.h similarity index 95% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_backend_uart.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_backend_uart.h index 4f9ce12900..2743e291f5 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_backend_uart.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_backend_uart.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -51,6 +51,10 @@ #include "nrf_log_backend_interface.h" +#ifdef __cplusplus +extern "C" { +#endif + extern const nrf_log_backend_api_t nrf_log_backend_uart_api; typedef struct { @@ -63,6 +67,11 @@ typedef struct { } void nrf_log_backend_uart_init(void); + +#ifdef __cplusplus +} +#endif + #endif //NRF_LOG_BACKEND_UART_H /** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_ctrl.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_ctrl.h similarity index 91% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_ctrl.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_ctrl.h index 0fbce415fd..828f1f716d 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_ctrl.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_ctrl.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -54,21 +54,13 @@ #include "sdk_errors.h" #include #include +#include "nrf_log_types.h" #include "nrf_log_ctrl_internal.h" #include "nrf_log_backend_interface.h" #ifdef __cplusplus extern "C" { #endif -typedef enum -{ - NRF_LOG_SEVERITY_NONE, - NRF_LOG_SEVERITY_ERROR, - NRF_LOG_SEVERITY_WARNING, - NRF_LOG_SEVERITY_INFO, - NRF_LOG_SEVERITY_DEBUG, -} nrf_log_severity_t; - /** * @brief Timestamp function prototype. * @@ -78,14 +70,14 @@ typedef uint32_t (*nrf_log_timestamp_func_t)(void); /**@brief Macro for initializing the logs. * - * @note If timestamps are disabled in the configuration, then the provided pointer - * can be NULL. Otherwise, it is expected that timestamp_getter is not NULL. - * - * @param timestamp_func Function that returns the timestamp. + * Macro has one or two parameters. First parameter (obligatory) is the timestamp function (@ref nrf_log_timestamp_func_t). + * Additionally, as the second parameter timestamp frequency in Hz can be provided. If not provided then default + * frequency is used (@ref NRF_LOG_TIMESTAMP_DEFAULT_FREQUENCY). Frequency is used to format timestamp prefix if + * @ref NRF_LOG_STR_FORMATTER_TIMESTAMP_FORMAT_ENABLED is set. * * @return NRF_SUCCESS after successful initialization, otherwise an error code. */ -#define NRF_LOG_INIT(timestamp_func) NRF_LOG_INTERNAL_INIT(timestamp_func) +#define NRF_LOG_INIT(...) NRF_LOG_INTERNAL_INIT(__VA_ARGS__) /**@brief Macro for processing a single log entry from a queue of deferred logs. @@ -123,11 +115,12 @@ typedef uint32_t (*nrf_log_timestamp_func_t)(void); * Instead, frontend and user backend should be verbosely initialized. * * @param timestamp_func Function for getting a 32-bit timestamp. + * @param timestamp_freq Frequency of the timestamp. * * @return Error status. * */ -ret_code_t nrf_log_init(nrf_log_timestamp_func_t timestamp_func); +ret_code_t nrf_log_init(nrf_log_timestamp_func_t timestamp_func, uint32_t timestamp_freq); /** * @brief Function for adding new backend interface to the logger. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_default_backends.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_default_backends.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_default_backends.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_default_backends.h index 982f3b1b5e..8ad3da4500 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_default_backends.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_default_backends.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_instance.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_instance.h new file mode 100644 index 0000000000..a4ba83da2d --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_instance.h @@ -0,0 +1,135 @@ +/** + * Copyright (c) 2018 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#ifndef NRF_LOG_INSTANCE_H +#define NRF_LOG_INSTANCE_H + +#include "sdk_config.h" +#include "nrf_section.h" +#include "nrf_log_types.h" +#include +/* + * For GCC, sections are sorted in the group by the linker. For IAR and KEIL, it is assumed that linker will sort + * dynamic and const section in the same order (but in different locations). Proper message formatting + * is based on that assumption. + */ +#if defined(__GNUC__) +#define NRF_LOG_DYNAMIC_SECTION_NAME(_module_name) CONCAT_2(log_dynamic_data_,_module_name) +#define NRF_LOG_CONST_SECTION_NAME(_module_name) CONCAT_2(log_const_data_,_module_name) +#else +#define NRF_LOG_DYNAMIC_SECTION_NAME(_module_name) log_dynamic_data +#define NRF_LOG_CONST_SECTION_NAME(_module_name) log_const_data +#endif + +#define NRF_LOG_ITEM_DATA(_name) CONCAT_3(m_nrf_log_,_name,_logs_data) +#define NRF_LOG_ITEM_DATA_DYNAMIC(_name) CONCAT_2(NRF_LOG_ITEM_DATA(_name),_dynamic) +#define NRF_LOG_ITEM_DATA_CONST(_name) CONCAT_2(NRF_LOG_ITEM_DATA(_name),_const) + +#ifdef UNIT_TEST +#define _CONST +#else +#define _CONST const +#endif + +#if NRF_LOG_FILTERS_ENABLED +#define NRF_LOG_DYNAMIC_STRUCT_NAME nrf_log_module_dynamic_data_t +#else +#define NRF_LOG_DYNAMIC_STRUCT_NAME nrf_log_module_reduced_dynamic_data_t +#endif + +#define NRF_LOG_INTERNAL_ITEM_REGISTER( \ + _name, _str_name, _info_color, _debug_color, _initial_lvl, _compiled_lvl) \ + NRF_SECTION_ITEM_REGISTER(NRF_LOG_CONST_SECTION_NAME(_name), \ + _CONST nrf_log_module_const_data_t NRF_LOG_ITEM_DATA_CONST(_name)) = { \ + .p_module_name = _str_name, \ + .info_color_id = (_info_color), \ + .debug_color_id = (_debug_color), \ + .compiled_lvl = (nrf_log_severity_t)(_compiled_lvl), \ + .initial_lvl = (nrf_log_severity_t)(_initial_lvl), \ + }; \ + NRF_SECTION_ITEM_REGISTER(NRF_LOG_DYNAMIC_SECTION_NAME(_name), \ + NRF_LOG_DYNAMIC_STRUCT_NAME NRF_LOG_ITEM_DATA_DYNAMIC(_name)) + +/**@file + * + * @defgroup nrf_log_instance Macros for logging on instance level + * @{ + * @ingroup nrf_log + * + * @brief Macros for logging on instance level + */ + +/** @def NRF_LOG_INSTANCE_PTR_DECLARE + * @brief Macro for declaring a logger instance pointer in the module stucture. + */ + +/** @def NRF_LOG_INSTANCE_REGISTER + * @brief Macro for creating an independent module instance. + * + * Module instance provides filtering of logs on instance level instead of module level. + */ + +/** @def NRF_LOG_INSTANCE_PTR_INIT + * @brief Macro for initializing a pointer to the logger instance. + */ + + + /** @} */ +#if NRF_LOG_ENABLED +#define NRF_LOG_INSTANCE_PTR_DECLARE(_p_name) NRF_LOG_DYNAMIC_STRUCT_NAME * _p_name; + +#define NRF_LOG_INSTANCE_REGISTER( \ + _module_name, _inst_name, _info_color, _debug_color, _initial_lvl, _compiled_lvl) \ + NRF_LOG_INTERNAL_ITEM_REGISTER(CONCAT_3(_module_name,_,_inst_name), \ + STRINGIFY(_module_name._inst_name), \ + _info_color, \ + _debug_color, \ + _initial_lvl, \ + _compiled_lvl) + +#define NRF_LOG_INSTANCE_PTR_INIT(_p_name, _module_name, _inst_name) \ + ._p_name = &NRF_LOG_ITEM_DATA_DYNAMIC(CONCAT_3(_module_name,_,_inst_name)), + +#else +#define NRF_LOG_INSTANCE_PTR_DECLARE(_p_name) +#define NRF_LOG_INSTANCE_REGISTER(_module_name, _inst_name, info_color, debug_color, _initial_lvl, compiled_lvl) +#define NRF_LOG_INSTANCE_PTR_INIT(_p_name, _module_name, _inst_name) +#endif + +#endif //NRF_LOG_INSTANCE_H diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_str_formatter.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_str_formatter.h similarity index 89% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_str_formatter.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_str_formatter.h index 134812d4cc..b651183289 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/nrf_log_str_formatter.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_str_formatter.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,6 +37,14 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ + +/**@file + * + * @defgroup nrf_log_str_formatter String formatter for the logger messages + * @{ + * @ingroup nrf_log + */ + #ifndef NRF_LOG_STR_FORMATTER_H #define NRF_LOG_STR_FORMATTER_H @@ -44,15 +52,20 @@ #include "nrf_fprintf.h" #include "nrf_log_ctrl.h" +#ifdef __cplusplus +extern "C" { +#endif + typedef struct { uint32_t timestamp; uint16_t module_id; + uint16_t dropped; nrf_log_severity_t severity; - bool raw; uint8_t use_colors; } nrf_log_str_formatter_entry_params_t; + void nrf_log_std_entry_process(char const * p_str, uint32_t const * p_args, uint32_t nargs, @@ -64,4 +77,10 @@ void nrf_log_hexdump_entry_process(uint8_t * p_data, nrf_log_str_formatter_entry_params_t * p_params, nrf_fprintf_ctx_t * p_ctx); +void nrf_log_str_formatter_timestamp_freq_set(uint32_t freq); +#ifdef __cplusplus +} +#endif + #endif //NRF_LOG_STR_FORMATTER_H +/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_types.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_types.h new file mode 100644 index 0000000000..2ae08d3034 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/nrf_log_types.h @@ -0,0 +1,97 @@ +/** + * Copyright (c) 2018 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#ifndef NRF_LOG_TYPES_H +#define NRF_LOG_TYPES_H + +#include + +/** + * @brief Logger severity levels. + */ +typedef enum +{ + NRF_LOG_SEVERITY_NONE, + NRF_LOG_SEVERITY_ERROR, + NRF_LOG_SEVERITY_WARNING, + NRF_LOG_SEVERITY_INFO, + NRF_LOG_SEVERITY_DEBUG, + NRF_LOG_SEVERITY_INFO_RAW, /* Artificial level to pass information about skipping string postprocessing.*/ +} nrf_log_severity_t; + +/** + * @brief Structure holding dynamic data associated with a module or instance if filtering is enabled (@ref NRF_LOG_FILTERS_ENABLED). + * + * See @ref NRF_LOG_MODULE_REGISTER and @ref NRF_LOG_INSTANCE_REGISTER. + */ +typedef struct +{ + uint16_t module_id; ///< Module ID assigned during initialization. + uint16_t order_idx; ///< Ordered index of the module (used for auto-completion). + uint32_t filter; ///< Current highest severity level accepted (redundant to @ref nrf_log_module_dynamic_data_t::filter_lvls, used for optimization) + uint32_t filter_lvls; ///< Current severity levels for each backend (3 bits per backend). +} nrf_log_module_dynamic_data_t; + +/** + * @brief Structure holding dynamic data associated with a module or instance if filtering is disabled (@ref NRF_LOG_FILTERS_ENABLED). + * + * See @ref NRF_LOG_MODULE_REGISTER and @ref NRF_LOG_INSTANCE_REGISTER. + */ +typedef struct +{ + uint16_t module_id; ///< Module ID assigned during initialization. + uint16_t padding; ///< Padding to fit in word. +} nrf_log_module_reduced_dynamic_data_t; + + +/** + * @brief Structure holding constant data associated with a module or instance. + * + * See @ref NRF_LOG_MODULE_REGISTER and @ref NRF_LOG_INSTANCE_REGISTER. + */ +typedef struct +{ + const char * p_module_name; ///< Module or instance name. + uint8_t info_color_id; ///< Color code of info messages. + uint8_t debug_color_id; ///< Color code of debug messages. + nrf_log_severity_t compiled_lvl; ///< Compiled highest severity level. + nrf_log_severity_t initial_lvl; ///< Severity level for given module or instance set on backend initialization. +} nrf_log_module_const_data_t; + +#endif //NRF_LOG_TYPES_H diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_backend_flash.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_backend_flash.c new file mode 100644 index 0000000000..0efd5d8527 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_backend_flash.c @@ -0,0 +1,739 @@ +/** + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#include "sdk_common.h" +#if NRF_MODULE_ENABLED(NRF_LOG) && NRF_MODULE_ENABLED(NRF_LOG_BACKEND_FLASH) +#include "nrf_log_backend_flash.h" +#include "nrf_log_str_formatter.h" +#include "nrf_fstorage_nvmc.h" +#include "nrf_log.h" +#include "nrf_atomic.h" +#include "nrf_queue.h" +#include "app_error.h" +#include + +#if (NRF_LOG_BACKEND_FLASHLOG_ENABLED == 0) && (NRF_LOG_BACKEND_CRASHLOG_ENABLED == 0) +#error "No flash backend enabled." +#endif + +/** @brief Maximum logger message payload (arguments or data in hexdump) which can be stored. */ +#define FLASH_LOG_MAX_PAYLOAD_SIZE (NRF_LOG_BACKEND_FLASH_SER_BUFFER_SIZE - sizeof(nrf_log_header_t)) + +/** @brief Size of serialization buffer in words. */ +#define FLASH_LOG_SER_BUFFER_WORDS (NRF_LOG_BACKEND_FLASH_SER_BUFFER_SIZE/sizeof(uint32_t)) + +/** @brief Length of logger header. */ +#define LOG_HEADER_LEN (sizeof(nrf_log_header_t)) + +/** @brief Length of logger header given in 32 bit words. */ +#define LOG_HEADER_LEN_WORDS (LOG_HEADER_LEN/sizeof(uint32_t)) + +/** @brief Maximum possible length of standard log message. */ +#define STD_LOG_MSG_MAX_LEN (LOG_HEADER_LEN + NRF_LOG_MAX_NUM_OF_ARGS*sizeof(uint32_t)) + +/* Buffer must be multiple of 4. */ +STATIC_ASSERT((NRF_LOG_BACKEND_FLASH_SER_BUFFER_SIZE % sizeof(uint32_t)) == 0); + +/* Buffer must fit standard log message. */ +STATIC_ASSERT(NRF_LOG_BACKEND_FLASH_SER_BUFFER_SIZE >= STD_LOG_MSG_MAX_LEN); + +/** @brief Flash page size in bytes. */ +#define CODE_PAGE_SIZE 4096 + +/** @brief Start address of the area dedicated for flash log. */ +#define FLASH_LOG_START_ADDR (NRF_LOG_BACKEND_FLASH_START_PAGE * CODE_PAGE_SIZE) + +/** @brief End address of the area dedicated for flash log. */ +#define FLASH_LOG_END_ADDR (FLASH_LOG_START_ADDR + (NRF_LOG_BACKEND_PAGES * CODE_PAGE_SIZE) - 1) + +/** @brief Size of the area dedicated for flash log. */ +#define FLASH_LOG_SIZE (NRF_LOG_BACKEND_PAGES * CODE_PAGE_SIZE) + +/** @brief Start address determined in runtime. + * + * If configuration indicates that flash log should be placed after application. + * */ +#if defined ( __CC_ARM ) +#define RUNTIME_START_ADDR \ + _Pragma("diag_suppress 170") \ + ((NRF_LOG_BACKEND_FLASH_START_PAGE == 0) ? \ + (CODE_PAGE_SIZE*CEIL_DIV((uint32_t)CODE_END, CODE_PAGE_SIZE)) : FLASH_LOG_START_ADDR) \ + _Pragma("diag_default 170") +#else +#define RUNTIME_START_ADDR ((NRF_LOG_BACKEND_FLASH_START_PAGE == 0) ? \ + (CODE_PAGE_SIZE*CEIL_DIV((uint32_t)CODE_END, CODE_PAGE_SIZE)) : FLASH_LOG_START_ADDR) +#endif +static void fstorage_evt_handler(nrf_fstorage_evt_t * p_evt); + +/** @brief Message queue for run time flash log. */ +#if NRF_LOG_BACKEND_FLASHLOG_ENABLED +NRF_QUEUE_DEF(nrf_log_entry_t *, + m_flashlog_queue, + NRF_LOG_BACKEND_FLASHLOG_QUEUE_SIZE, + NRF_QUEUE_MODE_NO_OVERFLOW); +static const nrf_queue_t * mp_flashlog_queue = &m_flashlog_queue; +#else +static const nrf_queue_t * mp_flashlog_queue = NULL; +#endif + + +/** @brief Message FIFO for crash log. */ +#if NRF_LOG_BACKEND_CRASHLOG_ENABLED +NRF_QUEUE_DEF(nrf_log_entry_t *, + m_crashlog_queue, + NRF_LOG_BACKEND_CRASHLOG_FIFO_SIZE, + NRF_QUEUE_MODE_NO_OVERFLOW); +static const nrf_queue_t * mp_crashlog_queue = &m_crashlog_queue; +#else +static const nrf_queue_t * mp_crashlog_queue = NULL; +#endif + + +/** @brief Fstorage instance used for flash log. */ +NRF_FSTORAGE_DEF(nrf_fstorage_t m_log_flash_fstorage) = +{ + /* Set a handler for fstorage events. */ + .evt_handler = fstorage_evt_handler, + .start_addr = FLASH_LOG_START_ADDR, + .end_addr = FLASH_LOG_END_ADDR, +}; + +/** @brief Flash log state. */ +typedef enum +{ + LOG_BACKEND_FLASH_ACTIVE, /**< Flash backend is active. */ + LOG_BACKEND_FLASH_INACTIVE, /**< Flash backend is inactive. All incoming requests are skipped. */ + LOG_BACKEND_FLASH_IN_PANIC, /**< Flash backend is in panic mode. Incoming messages are written to flash in synchronous mode. */ +} log_backend_flash_state_t; + +static log_backend_flash_state_t m_state; /**< Flash logger backend state. */ +static nrf_atomic_flag_t m_busy_flag; /**< Flag indicating if module performs flash writing. */ +static uint32_t m_flash_buf[FLASH_LOG_SER_BUFFER_WORDS]; /**< Buffer used for serializing messages. */ +static uint32_t m_curr_addr; /**< Address of free spot in the storage area. */ +static size_t m_curr_len; /**< Length of current message being written. */ +static uint32_t m_dropped; /**< Number of dropped messages. */ + +/** @brief Log message string injected when entering panic mode. */ +static const char crashlog_str[] = "-----------CRASHLOG------------\r\n"; + +/** @brief Function saturates input to maximum possible length and rounds up value to be multiple + * of word size. + * + * @param length Length value. + * + * @return Modified input length. + */ +static uint32_t saturate_align_length(uint32_t length) +{ + length = (length > FLASH_LOG_MAX_PAYLOAD_SIZE) ? FLASH_LOG_MAX_PAYLOAD_SIZE : length; //saturate + length = CEIL_DIV(length, sizeof(uint32_t))*sizeof(uint32_t); + return length; +} + + +/** + * @brief Function for copying logger message to the buffer. + * + * @param[in] p_msg Logger message. + * @param[out] p_buf Output buffer where serialized message is placed. + * @param[in,out] p_len Buffer size as input, length of prepared data as output. + * + * @return True if message fits into the buffer, false otherwise + */ +static bool msg_to_buf(nrf_log_entry_t * p_msg, uint8_t * p_buf, size_t * p_len) +{ + uint32_t data_len; + nrf_log_header_t header = {0}; + uint32_t memobj_offset = HEADER_SIZE*sizeof(uint32_t); + + nrf_memobj_read(p_msg, &header, HEADER_SIZE*sizeof(uint32_t), 0); + + memcpy(p_buf, &header, sizeof(nrf_log_header_t)); + p_buf += sizeof(nrf_log_header_t); + + switch (header.base.generic.type) + { + case HEADER_TYPE_STD: + { + data_len = header.base.std.nargs * sizeof(uint32_t); + break; + } + case HEADER_TYPE_HEXDUMP: + { + data_len = saturate_align_length(header.base.hexdump.len); + break; + } + default: + *p_len = 0; + return false; + } + nrf_memobj_read(p_msg, p_buf, data_len, memobj_offset); + + if (*p_len >= sizeof(nrf_log_header_t) + data_len) + { + *p_len = sizeof(nrf_log_header_t) + data_len; + return true; + } + else + { + return false; + } +} + +/** + * @brief Function for getting logger message stored in flash. + * + * @param[in] p_buf Pointer to the location where message is stored. + * @param[out] pp_header Pointer to the log message header. + * @param[out] pp_data Pointer to the log message data (arguments or data in case of hexdump). + * + * @return True if message was successfully fetched, false otherwise. + */ +static bool msg_from_buf(uint32_t * p_buf, + nrf_log_header_t * * pp_header, + uint8_t * * pp_data, + uint32_t * p_len) +{ + *pp_header = (nrf_log_header_t *)p_buf; + *pp_data = (uint8_t *)&p_buf[LOG_HEADER_LEN_WORDS]; + + uint32_t data_len; + + switch ((*pp_header)->base.generic.type) + { + case HEADER_TYPE_STD: + { + data_len = ((*pp_header)->base.std.nargs)*sizeof(uint32_t); + break; + } + case HEADER_TYPE_HEXDUMP: + { + + data_len = saturate_align_length((*pp_header)->base.hexdump.len); + break; + } + default: + return false; + } + + *p_len = LOG_HEADER_LEN + data_len; + return true; +} + +/** + * @brief Function for processing log message queue. + * + * If writing to flash is synchronous then function drains the queue and writes all messages to flash. + * If writing to flash is asynchronous then function starts single write operation. In asynchronous mode + * function is called when new message is put into the queue from from flash operation callback. + * + * Function detects the situation that flash module reports attempt to write outside dedicated area. + * In that case flash backend stops writing any new messages. + * + * @param p_queue Queue will log messages + * @param fstorage_blocking If true it indicates that flash operations are blocking, event handler is not used. + */ +static void log_msg_queue_process(nrf_queue_t const * p_queue, bool fstorage_blocking) +{ + nrf_log_entry_t * p_msg; + bool busy = false; + while (nrf_queue_pop(p_queue, &p_msg) == NRF_SUCCESS) + { + ret_code_t err_code; + + m_curr_len = sizeof(m_flash_buf); + if (!msg_to_buf(p_msg, (uint8_t *)m_flash_buf, &m_curr_len)) + { + continue; + } + + err_code = nrf_fstorage_write(&m_log_flash_fstorage, m_curr_addr, m_flash_buf, m_curr_len, p_msg); + + if (err_code == NRF_SUCCESS) + { + if (fstorage_blocking) + { + m_curr_addr += m_curr_len; + + nrf_memobj_put(p_msg); + } + else + { + busy = true; + break; + } + } + else if (!fstorage_blocking && (err_code == NRF_ERROR_NO_MEM)) + { + // fstorage queue got full. Drop entry. + nrf_memobj_put(p_msg); + m_dropped++; + break; + } + else if (err_code == NRF_ERROR_INVALID_ADDR) + { + // Trying to write outside the area, flash log is full. Skip any new writes. + nrf_memobj_put(p_msg); + m_state = LOG_BACKEND_FLASH_INACTIVE; + } + else + { + ASSERT(false); + } + } + + if (!busy) + { + UNUSED_RETURN_VALUE(nrf_atomic_flag_clear(&m_busy_flag)); + } +} + +static void queue_element_drop(nrf_queue_t const * p_queue) +{ + nrf_log_entry_t * p_msg; + if (nrf_queue_pop(p_queue, &p_msg) == NRF_SUCCESS) + { + m_dropped++; + nrf_memobj_put(p_msg); + } +} + +static void fstorage_evt_handler(nrf_fstorage_evt_t * p_evt) +{ + if (m_state == LOG_BACKEND_FLASH_ACTIVE) + { + switch (p_evt->id) + { + case NRF_FSTORAGE_EVT_WRITE_RESULT: + { + if (p_evt->result == NRF_SUCCESS) + { + m_curr_addr += m_curr_len; + m_curr_len = 0; + log_msg_queue_process(mp_flashlog_queue, false); + } + else + { + m_dropped++; + } + + if (p_evt->p_param) + { + nrf_memobj_put((nrf_log_entry_t *)p_evt->p_param); + } + break; + } + default: + break; + } + } + else if ((m_state == LOG_BACKEND_FLASH_INACTIVE) && + (p_evt->id == NRF_FSTORAGE_EVT_ERASE_RESULT) && + (p_evt->addr == RUNTIME_START_ADDR)) + { + m_state = LOG_BACKEND_FLASH_ACTIVE; + } +} + +/** + * @brief Function for enqueueing new message. + * + * If queue is full then the oldest message is freed. + * + * @param p_queue Queue. + * @param p_msg Message. + * + * @return Number of dropped messages + */ +static uint32_t message_enqueue(nrf_queue_t const * p_queue, nrf_log_entry_t * p_msg) +{ + uint32_t dropped = 0; + + //flag was set, busy so enqueue message + while (nrf_queue_push(p_queue, &p_msg) != NRF_SUCCESS) + { + + nrf_log_entry_t * p_old_msg; + if (nrf_queue_pop(p_queue, &p_old_msg) == NRF_SUCCESS) + { + nrf_memobj_put(p_old_msg); + dropped++; + } + } + + return dropped; +} + + +void nrf_log_backend_flashlog_put(nrf_log_backend_t const * p_backend, + nrf_log_entry_t * p_msg) +{ + if (m_state == LOG_BACKEND_FLASH_ACTIVE) + { + nrf_memobj_get(p_msg); + + m_dropped += message_enqueue(mp_flashlog_queue, p_msg); + + if (nrf_atomic_flag_set_fetch(&m_busy_flag) == 0) + { + log_msg_queue_process(mp_flashlog_queue, false); + } + } +} + + +void nrf_log_backend_crashlog_put(nrf_log_backend_t const * p_backend, + nrf_log_entry_t * p_msg) +{ + if (m_state != LOG_BACKEND_FLASH_INACTIVE) + { + nrf_memobj_get(p_msg); + + UNUSED_RETURN_VALUE(message_enqueue(mp_crashlog_queue, p_msg)); + } + + if (m_state == LOG_BACKEND_FLASH_IN_PANIC) + { + log_msg_queue_process(mp_crashlog_queue, true); + } +} + +void nrf_log_backend_flashlog_flush(nrf_log_backend_t const * p_backend) +{ + queue_element_drop(mp_flashlog_queue); +} + +void nrf_log_backend_crashlog_flush(nrf_log_backend_t const * p_backend) +{ + queue_element_drop(mp_crashlog_queue); +} + +void nrf_log_backend_flashlog_panic_set(nrf_log_backend_t const * p_backend) +{ + /* Empty */ +} + +/** + * @brief Function for injecting log message which will indicate start of crash log. + */ +static void crashlog_marker_inject(void) +{ + nrf_log_header_t crashlog_marker_hdr = { + .base = { + .std = { + .type = HEADER_TYPE_STD, + .severity = NRF_LOG_SEVERITY_INFO_RAW, + .nargs = 0, + .addr = (uint32_t)crashlog_str & STD_ADDR_MASK + } + }, + .module_id = 0, + .timestamp = 0, + }; + m_flash_buf[0] = crashlog_marker_hdr.base.raw; + m_flash_buf[1] = crashlog_marker_hdr.module_id; + m_flash_buf[2] = crashlog_marker_hdr.timestamp; + (void)nrf_fstorage_write(&m_log_flash_fstorage, m_curr_addr, m_flash_buf, LOG_HEADER_LEN, NULL); + m_curr_addr += LOG_HEADER_LEN; +} + + +void nrf_log_backend_crashlog_panic_set(nrf_log_backend_t const * p_backend) +{ + if (nrf_fstorage_init(&m_log_flash_fstorage, &nrf_fstorage_nvmc, NULL) == NRF_SUCCESS) + { + m_state = LOG_BACKEND_FLASH_IN_PANIC; + + /* In case of Softdevice MWU may protect access to NVMC. */ + NVIC_DisableIRQ(MWU_IRQn); + + log_msg_queue_process(mp_flashlog_queue, true); + + crashlog_marker_inject(); + + log_msg_queue_process(mp_crashlog_queue, true); + } + else + { + m_state = LOG_BACKEND_FLASH_INACTIVE; + } +} + +/** + * @brief Function for determining first empty location in area dedicated for flash logger backend. + */ +static uint32_t empty_addr_get(void) +{ + uint32_t token = 0; + nrf_log_header_t * p_dummy_header; + uint8_t * p_dummy_data; + + while(nrf_log_backend_flash_next_entry_get(&token, &p_dummy_header, &p_dummy_data) == NRF_SUCCESS) + { + + } + + return token; +} + + +ret_code_t nrf_log_backend_flash_init(nrf_fstorage_api_t const * p_fs_api) +{ + ret_code_t err_code; + + + uint32_t start_addr = RUNTIME_START_ADDR; + uint32_t end_addr = start_addr + FLASH_LOG_SIZE - 1; + + m_log_flash_fstorage.start_addr = start_addr; + m_log_flash_fstorage.end_addr = end_addr; + + err_code = nrf_fstorage_init(&m_log_flash_fstorage, p_fs_api, NULL); + if (err_code != NRF_SUCCESS) + { + return err_code; + } + + m_curr_addr = empty_addr_get(); + m_state = LOG_BACKEND_FLASH_ACTIVE; + + return err_code; +} + + +ret_code_t nrf_log_backend_flash_next_entry_get(uint32_t * p_token, + nrf_log_header_t * * pp_header, + uint8_t * * pp_data) +{ + uint32_t * p_addr = p_token; + uint32_t len; + + *p_addr = (*p_addr == 0) ? RUNTIME_START_ADDR : *p_addr; + + if (nrf_fstorage_rmap(&m_log_flash_fstorage, *p_addr) == NULL) + { + //Supports only memories which can be mapped for reading. + return NRF_ERROR_NOT_SUPPORTED; + } + + if (msg_from_buf((uint32_t *)*p_addr, pp_header, pp_data, &len)) + { + *p_addr += len; + return NRF_SUCCESS; + } + else + { + return NRF_ERROR_NOT_FOUND; + } +} + + +ret_code_t nrf_log_backend_flash_erase(void) +{ + ret_code_t err_code; + + m_state = LOG_BACKEND_FLASH_INACTIVE; + err_code = nrf_fstorage_erase(&m_log_flash_fstorage, RUNTIME_START_ADDR, NRF_LOG_BACKEND_PAGES, NULL); + + m_curr_addr = RUNTIME_START_ADDR; + + return err_code; +} + +#if NRF_LOG_BACKEND_FLASHLOG_ENABLED +const nrf_log_backend_api_t nrf_log_backend_flashlog_api = { + .put = nrf_log_backend_flashlog_put, + .flush = nrf_log_backend_flashlog_flush, + .panic_set = nrf_log_backend_flashlog_panic_set, +}; +#endif + +#if NRF_LOG_BACKEND_CRASHLOG_ENABLED +const nrf_log_backend_api_t nrf_log_backend_crashlog_api = { + .put = nrf_log_backend_crashlog_put, + .flush = nrf_log_backend_crashlog_flush, + .panic_set = nrf_log_backend_crashlog_panic_set, +}; +#endif + +#if NRF_LOG_BACKEND_FLASH_CLI_CMDS +#include "nrf_cli.h" + +static uint8_t m_buffer[64]; +static nrf_cli_t const * mp_cli; + +static void cli_tx(void const * p_context, char const * p_buffer, size_t len); + +static nrf_fprintf_ctx_t m_fprintf_ctx = +{ + .p_io_buffer = (char *)m_buffer, + .io_buffer_size = sizeof(m_buffer)-1, + .io_buffer_cnt = 0, + .auto_flush = true, + .p_user_ctx = &mp_cli, + .fwrite = cli_tx +}; + + +static void flashlog_clear_cmd(nrf_cli_t const * p_cli, size_t argc, char ** argv) +{ + if (nrf_cli_help_requested(p_cli)) + { + nrf_cli_help_print(p_cli, NULL, 0); + } + + UNUSED_RETURN_VALUE(nrf_log_backend_flash_erase()); +} + +#include "nrf_delay.h" +static void cli_tx(void const * p_context, char const * p_buffer, size_t len) +{ + nrf_cli_t * * pp_cli = (nrf_cli_t * *)p_context; + char * p_strbuf = (char *)&p_buffer[len]; + *p_strbuf = '\0'; + nrf_cli_fprintf((nrf_cli_t const *)*pp_cli, NRF_CLI_DEFAULT, p_buffer); + // nrf_delay_ms(10); +} + + +static void entry_process(nrf_cli_t const * p_cli, nrf_log_header_t * p_header, uint8_t * p_data) +{ + mp_cli = p_cli; + + nrf_log_str_formatter_entry_params_t params = + { + .timestamp = p_header->timestamp, + .module_id = p_header->module_id, + .use_colors = 0, + }; + + switch (p_header->base.generic.type) + { + case HEADER_TYPE_STD: + { + params.severity = (nrf_log_severity_t)p_header->base.std.severity; + nrf_log_std_entry_process((const char *)((uint32_t)p_header->base.std.addr), + (uint32_t *)p_data, + p_header->base.std.nargs, + ¶ms, + &m_fprintf_ctx); + break; + } + case HEADER_TYPE_HEXDUMP: + { + params.severity = (nrf_log_severity_t)p_header->base.hexdump.severity; + + nrf_log_hexdump_entry_process(p_data, + p_header->base.hexdump.len, + ¶ms, + &m_fprintf_ctx); + break; + } + default: + ASSERT(0); + } + +} + + +static void flashlog_read_cmd(nrf_cli_t const * p_cli, size_t argc, char ** argv) +{ + if (nrf_cli_help_requested(p_cli)) + { + nrf_cli_help_print(p_cli, NULL, 0); + } + + uint32_t token = 0; + uint8_t * p_data = NULL; + bool empty = true; + nrf_log_header_t * p_header; + + while (1) + { + if (nrf_log_backend_flash_next_entry_get(&token, &p_header, &p_data) == NRF_SUCCESS) + { + entry_process(p_cli, p_header, p_data); + empty = false; + } + else + { + break; + } + } + + if (empty) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "Flash log empty\r\n"); + } +} + + +static void flashlog_status_cmd(nrf_cli_t const * p_cli, size_t argc, char ** argv) +{ + if (nrf_cli_help_requested(p_cli)) + { + nrf_cli_help_print(p_cli, NULL, 0); + } + + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "Flash log status:\r\n"); + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "\t\t- Location (address: 0x%08X, length: %d)\r\n", + RUNTIME_START_ADDR, FLASH_LOG_SIZE); + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "\t\t- Current usage:%d%% (%d of %d bytes used)\r\n", + 100ul * (m_curr_addr - RUNTIME_START_ADDR)/FLASH_LOG_SIZE, + m_curr_addr - RUNTIME_START_ADDR, + FLASH_LOG_SIZE); + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "\t\t- Dropped logs: %d\r\n", m_dropped); + + +} + + +NRF_CLI_CREATE_STATIC_SUBCMD_SET(m_flashlog_cmd) +{ + NRF_CLI_CMD(clear, NULL, "Remove logs", flashlog_clear_cmd), + NRF_CLI_CMD(read, NULL, "Read stored logs", flashlog_read_cmd), + NRF_CLI_CMD(status, NULL, "Flash log status", flashlog_status_cmd), + NRF_CLI_SUBCMD_SET_END +}; + +NRF_CLI_CMD_REGISTER(flashlog, &m_flashlog_cmd, "Commands for reading logs stored in non-volatile memory", NULL); + +#endif //NRF_LOG_BACKEND_FLASH_CLI_CMDS + +#endif //NRF_MODULE_ENABLED(NRF_LOG) && NRF_MODULE_ENABLED(NRF_LOG_BACKEND_FLASH) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_backend_rtt.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_backend_rtt.c similarity index 71% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_backend_rtt.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_backend_rtt.c index 03c32ca670..1ff3a26f14 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_backend_rtt.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_backend_rtt.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -43,9 +43,12 @@ #include "nrf_log_backend_serial.h" #include "nrf_log_str_formatter.h" #include "nrf_log_internal.h" +#include "nrf_delay.h" #include #include +static bool m_host_present; + static uint8_t m_string_buff[NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE]; void nrf_log_backend_rtt_init(void) @@ -59,7 +62,7 @@ static void serial_tx(void const * p_context, char const * buffer, size_t len) { uint32_t idx = 0; uint32_t processed; - uint32_t watchdog_counter = 10; + uint32_t watchdog_counter = NRF_LOG_BACKEND_RTT_TX_RETRY_CNT; do { processed = SEGGER_RTT_WriteNoLock(0, &buffer[idx], len); @@ -67,13 +70,32 @@ static void serial_tx(void const * p_context, char const * buffer, size_t len) len -= processed; if (processed == 0) { - // If RTT is not connected then ensure that logger does not block - watchdog_counter--; - if (watchdog_counter == 0) + /* There are two possible reasons for not writing any data to RTT: + * - The host is not connected and not reading the data. + * - The buffer got full and will be read by the host. + * These two situations are distinguished using the following algorithm. + * At the begining, the module assumes that the host is active, + * so when no data is read, it busy waits and retries. + * If, after retrying, the host reads the data, the module assumes that the host is active. + * If it fails, the module assumes that the host is inactive and stores that information. On next + * call, only one attempt takes place. The host is marked as active if the attempt is successful. + */ + if (!m_host_present) { break; } + else + { + nrf_delay_ms(NRF_LOG_BACKEND_RTT_TX_RETRY_DELAY_MS); + watchdog_counter--; + if (watchdog_counter == 0) + { + m_host_present = false; + break; + } + } } + m_host_present = true; } while (len); } } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_backend_serial.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_backend_serial.c similarity index 96% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_backend_serial.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_backend_serial.c index 194b9a7b5b..7db00744e4 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_backend_serial.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_backend_serial.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -69,6 +69,7 @@ void nrf_log_backend_serial_put(nrf_log_backend_t const * p_backend, params.timestamp = header.timestamp; params.module_id = header.module_id; + params.dropped = header.dropped; params.use_colors = NRF_LOG_USES_COLORS; /*lint -save -e438*/ @@ -76,7 +77,6 @@ void nrf_log_backend_serial_put(nrf_log_backend_t const * p_backend, { char const * p_log_str = (char const *)((uint32_t)header.base.std.addr); params.severity = (nrf_log_severity_t)header.base.std.severity; - params.raw = header.base.std.raw; uint32_t nargs = header.base.std.nargs; uint32_t args[NRF_LOG_MAX_NUM_OF_ARGS]; @@ -94,7 +94,6 @@ void nrf_log_backend_serial_put(nrf_log_backend_t const * p_backend, { uint32_t data_len = header.base.hexdump.len; params.severity = (nrf_log_severity_t)header.base.hexdump.severity; - params.raw = header.base.hexdump.raw; uint8_t data_buf[8]; uint32_t chunk_len; do diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_backend_serial.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_backend_serial.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_backend_serial.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_backend_serial.h index 583bc72945..22d26f5fdc 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_backend_serial.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_backend_serial.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_backend_uart.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_backend_uart.c similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_backend_uart.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_backend_uart.c index f81018c0da..76dad8a604 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_backend_uart.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_backend_uart.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_ctrl_internal.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_ctrl_internal.h similarity index 92% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_ctrl_internal.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_ctrl_internal.h index fbe36cb967..ba8a574b5b 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_ctrl_internal.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_ctrl_internal.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -48,9 +48,9 @@ #include "sdk_common.h" #if NRF_MODULE_ENABLED(NRF_LOG) - -#define NRF_LOG_INTERNAL_INIT(timestamp_func) \ - nrf_log_init(timestamp_func) +#define NRF_LOG_INTERNAL_INIT(...) \ + nrf_log_init(GET_VA_ARG_1(__VA_ARGS__), \ + GET_VA_ARG_1(GET_ARGS_AFTER_1(__VA_ARGS__, NRF_LOG_TIMESTAMP_DEFAULT_FREQUENCY))) #define NRF_LOG_INTERNAL_PROCESS() nrf_log_frontend_dequeue() #define NRF_LOG_INTERNAL_FLUSH() \ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_default_backends.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_default_backends.c similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_default_backends.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_default_backends.c index 039bf64590..c844f2e880 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_default_backends.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_default_backends.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_frontend.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_frontend.c similarity index 79% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_frontend.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_frontend.c index 459dc3e0b4..4e657024f4 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_frontend.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_frontend.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -44,6 +44,7 @@ #include "nrf_log.h" #include "nrf_log_internal.h" #include "nrf_log_ctrl.h" +#include "nrf_log_str_formatter.h" #include "nrf_section.h" #include "nrf_memobj.h" #include "nrf_atomic.h" @@ -58,7 +59,7 @@ STATIC_ASSERT(IS_POWER_OF_TWO(NRF_LOG_BUFSIZE)); #warning "NRF_LOG_BUFSIZE too small, significant number of logs may be lost." #endif -NRF_MEMOBJ_POOL_DEF(mempool, NRF_LOG_MSGPOOL_ELEMENT_SIZE, NRF_LOG_MSGPOOL_ELEMENT_COUNT); +NRF_MEMOBJ_POOL_DEF(log_mempool, NRF_LOG_MSGPOOL_ELEMENT_SIZE, NRF_LOG_MSGPOOL_ELEMENT_COUNT); #define NRF_LOG_BACKENDS_FULL 0xFF #define NRF_LOG_FILTER_BITS_PER_BACKEND 3 @@ -83,29 +84,31 @@ typedef struct nrf_log_backend_t * p_backend_head; nrf_atomic_flag_t log_skipping; nrf_atomic_flag_t log_skipped; + nrf_atomic_u32_t log_dropped_cnt; bool autoflush; } log_data_t; static log_data_t m_log_data; -static const char * m_overflow_info = "Overflow"; + /*lint -save -esym(526,log_const_data*) -esym(526,log_dynamic_data*)*/ -NRF_SECTION_DEF(log_dynamic_data, nrf_log_module_dynamic_data_t); +NRF_SECTION_DEF(log_dynamic_data, NRF_LOG_DYNAMIC_STRUCT_NAME); NRF_SECTION_DEF(log_const_data, nrf_log_module_const_data_t); /*lint -restore*/ NRF_LOG_MODULE_REGISTER(); // Helper macros for section variables. -#define NRF_LOG_DYNAMIC_SECTION_VARS_GET(i) NRF_SECTION_ITEM_GET(log_dynamic_data, nrf_log_module_dynamic_data_t, (i)) +#define NRF_LOG_DYNAMIC_SECTION_VARS_GET(i) NRF_SECTION_ITEM_GET(log_dynamic_data, NRF_LOG_DYNAMIC_STRUCT_NAME, (i)) #define NRF_LOG_CONST_SECTION_VARS_GET(i) NRF_SECTION_ITEM_GET(log_const_data, nrf_log_module_const_data_t, (i)) #define NRF_LOG_CONST_SECTION_VARS_COUNT NRF_SECTION_ITEM_COUNT(log_const_data, nrf_log_module_const_data_t) #define PUSHED_HEADER_FILL(P_HDR, OFFSET, LENGTH) \ + (P_HDR)->base.raw = 0; \ (P_HDR)->base.pushed.type = HEADER_TYPE_PUSHED; \ (P_HDR)->base.pushed.offset = OFFSET; \ (P_HDR)->base.pushed.len = LENGTH -ret_code_t nrf_log_init(nrf_log_timestamp_func_t timestamp_func) +ret_code_t nrf_log_init(nrf_log_timestamp_func_t timestamp_func, uint32_t timestamp_freq) { if (NRF_LOG_USES_TIMESTAMP && (timestamp_func == NULL)) { @@ -120,10 +123,11 @@ ret_code_t nrf_log_init(nrf_log_timestamp_func_t timestamp_func) m_log_data.autoflush = NRF_LOG_DEFERRED ? false : true; if (NRF_LOG_USES_TIMESTAMP) { + nrf_log_str_formatter_timestamp_freq_set(timestamp_freq); m_log_data.timestamp_func = timestamp_func; } - ret_code_t err_code = nrf_memobj_pool_init(&mempool); + ret_code_t err_code = nrf_memobj_pool_init(&log_mempool); if (err_code != NRF_SUCCESS) { return err_code; @@ -152,7 +156,8 @@ ret_code_t nrf_log_init(nrf_log_timestamp_func_t timestamp_func) } } - nrf_log_module_dynamic_data_t * p_module_ddata = NRF_LOG_DYNAMIC_SECTION_VARS_GET(i); + nrf_log_module_dynamic_data_t * p_module_ddata = + (nrf_log_module_dynamic_data_t *)NRF_LOG_DYNAMIC_SECTION_VARS_GET(i); p_module_ddata->filter = 0; p_module_ddata->module_id = i; p_module_ddata->order_idx = idx; @@ -162,7 +167,8 @@ ret_code_t nrf_log_init(nrf_log_timestamp_func_t timestamp_func) { for(i = 0; i < modules_cnt; i++) { - nrf_log_module_dynamic_data_t * p_module_ddata = NRF_LOG_DYNAMIC_SECTION_VARS_GET(i); + nrf_log_module_reduced_dynamic_data_t * p_module_ddata = + (nrf_log_module_reduced_dynamic_data_t *)NRF_LOG_DYNAMIC_SECTION_VARS_GET(i); p_module_ddata->module_id = i; } } @@ -183,7 +189,8 @@ static ret_code_t module_idx_get(uint32_t * p_idx, bool ordered_idx) uint32_t i; for (i = 0; i < module_cnt; i++) { - nrf_log_module_dynamic_data_t * p_module_data = NRF_LOG_DYNAMIC_SECTION_VARS_GET(i); + nrf_log_module_dynamic_data_t * p_module_data = + (nrf_log_module_dynamic_data_t *)NRF_LOG_DYNAMIC_SECTION_VARS_GET(i); if (p_module_data->order_idx == *p_idx) { *p_idx = i; @@ -257,13 +264,21 @@ void nrf_log_module_filter_set(uint32_t backend_id, uint32_t module_id, nrf_log_ { if (NRF_LOG_FILTERS_ENABLED) { - nrf_log_module_dynamic_data_t * p_module_filter = NRF_LOG_DYNAMIC_SECTION_VARS_GET(module_id); + nrf_log_module_dynamic_data_t * p_module_filter = + (nrf_log_module_dynamic_data_t *)NRF_LOG_DYNAMIC_SECTION_VARS_GET(module_id); p_module_filter->filter_lvls &= ~(NRF_LOG_LEVEL_MASK << (NRF_LOG_LEVEL_BITS * backend_id)); p_module_filter->filter_lvls |= (severity & NRF_LOG_LEVEL_MASK) << (NRF_LOG_LEVEL_BITS * backend_id); p_module_filter->filter = higher_lvl_get(p_module_filter->filter_lvls); } } +static nrf_log_severity_t nrf_log_module_init_filter_get(uint32_t module_id) +{ + nrf_log_module_const_data_t * p_module_data = + NRF_LOG_CONST_SECTION_VARS_GET(module_id); + return NRF_LOG_FILTERS_ENABLED ? p_module_data->initial_lvl : p_module_data->compiled_lvl; +} + nrf_log_severity_t nrf_log_module_filter_get(uint32_t backend_id, uint32_t module_id, bool ordered_idx, @@ -275,7 +290,7 @@ nrf_log_severity_t nrf_log_module_filter_get(uint32_t backend_id, if (module_idx_get(&module_id, ordered_idx) == NRF_SUCCESS) { nrf_log_module_dynamic_data_t * p_module_filter = - NRF_LOG_DYNAMIC_SECTION_VARS_GET(module_id); + (nrf_log_module_dynamic_data_t *)NRF_LOG_DYNAMIC_SECTION_VARS_GET(module_id); severity = (nrf_log_severity_t)((p_module_filter->filter_lvls >> (NRF_LOG_LEVEL_BITS * backend_id)) & NRF_LOG_LEVEL_MASK); } @@ -291,14 +306,47 @@ nrf_log_severity_t nrf_log_module_filter_get(uint32_t backend_id, } return severity; } - +/** + * Function examines current header and omits pushed strings and packets which are in progress. + */ +static bool invalid_packets_pushed_str_omit(nrf_log_header_t const * p_header, uint32_t * p_rd_idx) +{ + bool ret = false; + if ((p_header->base.generic.type == HEADER_TYPE_PUSHED) || (p_header->base.generic.in_progress == 1)) + { + if (p_header->base.generic.in_progress == 1) + { + switch (p_header->base.generic.type) + { + case HEADER_TYPE_STD: + *p_rd_idx += (HEADER_SIZE + p_header->base.std.nargs); + break; + case HEADER_TYPE_HEXDUMP: + *p_rd_idx += (HEADER_SIZE + p_header->base.hexdump.len); + break; + default: + ASSERT(0); + break; + } + } + else + { + *p_rd_idx += + (PUSHED_HEADER_SIZE + p_header->base.pushed.len + p_header->base.pushed.offset); + } + ret = true; + } + return ret; +} /** * @brief Skips the oldest, not pushed logs to make space for new logs. * @details This function moves forward read index to prepare space for new logs. */ -static void log_skip(void) +static uint32_t log_skip(void) { + uint16_t dropped = 0; + (void)nrf_atomic_flag_set(&m_log_data.log_skipped); (void)nrf_atomic_flag_set(&m_log_data.log_skipping); @@ -308,12 +356,17 @@ static void log_skip(void) nrf_log_header_t header; // Skip any string that is pushed to the circular buffer. - while (p_header->base.generic.type == HEADER_TYPE_PUSHED) - { - rd_idx += PUSHED_HEADER_SIZE; - rd_idx += (p_header->base.pushed.len + p_header->base.pushed.offset); - p_header = (nrf_log_header_t *)&m_log_data.buffer[rd_idx & mask]; - } + do { + if (invalid_packets_pushed_str_omit(p_header, &rd_idx)) + { + //something was omitted. Point to new header and try again. + p_header = (nrf_log_header_t *)&m_log_data.buffer[rd_idx & mask]; + } + else + { + break; + } + } while (true); uint32_t i; for (i = 0; i < HEADER_SIZE; i++) @@ -324,9 +377,11 @@ static void log_skip(void) switch (header.base.generic.type) { case HEADER_TYPE_HEXDUMP: + dropped = header.dropped; rd_idx += CEIL_DIV(header.base.hexdump.len, sizeof(uint32_t)); break; case HEADER_TYPE_STD: + dropped = header.dropped; rd_idx += header.base.std.nargs; break; default: @@ -340,6 +395,19 @@ static void log_skip(void) { m_log_data.rd_idx = rd_idx; } + + return (uint32_t)dropped; +} + +/** + * @brief Function for getting number of dropped logs. Dropped counter is reset after reading. + * + * @return Number of dropped logs saturated to 16 bits. + */ +static inline uint32_t dropped_sat16_get(void) +{ + uint32_t dropped = nrf_atomic_u32_fetch_store(&m_log_data.log_dropped_cnt, 0); + return __USAT(dropped, 16); //Saturate to 16 bits } @@ -352,21 +420,22 @@ static inline void std_header_set(uint32_t severity_mid, //Prepare header - in reverse order to ensure that packet type is validated (set to STD as last action) - uint16_t module_id = severity_mid >> NRF_LOG_MODULE_ID_POS; + uint32_t module_id = severity_mid >> NRF_LOG_MODULE_ID_POS; + uint32_t dropped = dropped_sat16_get(); ASSERT(module_id < nrf_log_module_cnt_get()); - m_log_data.buffer[(wr_idx + 1) & mask] = module_id; + m_log_data.buffer[(wr_idx + 1) & mask] = module_id | (dropped << 16); if (NRF_LOG_USES_TIMESTAMP) { m_log_data.buffer[(wr_idx + 2) & mask] = m_log_data.timestamp_func(); } - nrf_log_header_t * p_header = (nrf_log_header_t *)&m_log_data.buffer[wr_idx & mask]; - p_header->base.std.raw = (severity_mid & NRF_LOG_RAW) ? 1 : 0; - p_header->base.std.severity = severity_mid & NRF_LOG_LEVEL_MASK; - p_header->base.std.nargs = nargs; - p_header->base.std.addr = ((uint32_t)(p_str) & STD_ADDR_MASK); - p_header->base.std.type = HEADER_TYPE_STD; + nrf_log_header_t * p_header = (nrf_log_header_t *)&m_log_data.buffer[wr_idx & mask]; + p_header->base.std.severity = severity_mid & NRF_LOG_LEVEL_MASK; + p_header->base.std.nargs = nargs; + p_header->base.std.addr = ((uint32_t)(p_str) & STD_ADDR_MASK); + p_header->base.std.type = HEADER_TYPE_STD; + p_header->base.std.in_progress = 0; } /** @@ -380,45 +449,53 @@ static inline void std_header_set(uint32_t severity_mid, * @return True if successful allocation, false otherwise. * */ -static inline bool buf_prealloc(uint32_t content_len, uint32_t * p_wr_idx) +static inline bool buf_prealloc(uint32_t content_len, uint32_t * p_wr_idx, bool std) { uint32_t req_len = content_len + HEADER_SIZE; - uint32_t ovflw_tag_size = HEADER_SIZE; bool ret = true; CRITICAL_REGION_ENTER(); *p_wr_idx = m_log_data.wr_idx; uint32_t available_words = (m_log_data.mask + 1) - (m_log_data.wr_idx - m_log_data.rd_idx); - uint32_t required_words = req_len + ovflw_tag_size; // room for current entry and overflow - while (required_words > available_words) + while (req_len > available_words) { + UNUSED_RETURN_VALUE(nrf_atomic_u32_add(&m_log_data.log_dropped_cnt, 1)); if (NRF_LOG_ALLOW_OVERFLOW) { - log_skip(); + uint32_t dropped_in_skip = log_skip(); + UNUSED_RETURN_VALUE(nrf_atomic_u32_add(&m_log_data.log_dropped_cnt, dropped_in_skip)); available_words = (m_log_data.mask + 1) - (m_log_data.wr_idx - m_log_data.rd_idx); } else { - if (available_words >= HEADER_SIZE) - { - // Overflow entry is injected - std_header_set(NRF_LOG_LEVEL_WARNING, m_overflow_info, 0, m_log_data.wr_idx, m_log_data.mask); - req_len = HEADER_SIZE; - } - else - { - // No more room for any logs. - req_len = 0; - } ret = false; break; } - } - /* Mark header as invalid.*/ - nrf_log_generic_header_t * p_header = (nrf_log_generic_header_t *)&m_log_data.buffer[m_log_data.wr_idx & m_log_data.mask]; - p_header->type = HEADER_TYPE_INVALID; - m_log_data.wr_idx += req_len; + if (ret) + { + nrf_log_main_header_t invalid_header; + invalid_header.raw = 0; + + if (std) + { + invalid_header.std.type = HEADER_TYPE_STD; + invalid_header.std.in_progress = 1; + invalid_header.std.nargs = content_len; + } + else + { + invalid_header.hexdump.type = HEADER_TYPE_HEXDUMP; + invalid_header.hexdump.in_progress = 1; + invalid_header.hexdump.len = content_len; + } + + nrf_log_main_header_t * p_header = (nrf_log_main_header_t *)&m_log_data.buffer[m_log_data.wr_idx & m_log_data.mask]; + + p_header->raw = invalid_header.raw; + + m_log_data.wr_idx += req_len; + } CRITICAL_REGION_EXIT(); return ret; @@ -443,6 +520,8 @@ static inline uint32_t * cont_buf_prealloc(uint32_t len32, uint32_t * p_offset, uint32_t * p_wr_idx) { + //allocation algorithm relies on that assumption + STATIC_ASSERT(PUSHED_HEADER_SIZE == 1); uint32_t * p_buf = NULL; len32 += PUSHED_HEADER_SIZE; // Increment because 32bit header is needed to be stored. @@ -451,26 +530,25 @@ static inline uint32_t * cont_buf_prealloc(uint32_t len32, *p_wr_idx = m_log_data.wr_idx; uint32_t available_words = (m_log_data.mask + 1) - (m_log_data.wr_idx - m_log_data.rd_idx); - if (len32 <= available_words) + uint32_t tail_words = (m_log_data.mask + 1) - (m_log_data.wr_idx & m_log_data.mask); + + //available space is continuous + uint32_t curr_pos_available = (available_words <= tail_words) ? available_words : tail_words; + uint32_t start_pos_available = (available_words <= tail_words) ? 0 : (available_words - tail_words); + + if ((len32 <= curr_pos_available) || + ((len32 - PUSHED_HEADER_SIZE) <= start_pos_available)) { - // buffer will fit as is - p_buf = &m_log_data.buffer[(m_log_data.wr_idx + 1) & m_log_data.mask]; - m_log_data.wr_idx += len32; - *p_offset = 0; - } - else if (len32 < (m_log_data.rd_idx & m_log_data.mask)) - { - // wraping to the begining of the buffer - m_log_data.wr_idx += (len32 + available_words - 1); - *p_offset = available_words - 1; - p_buf = m_log_data.buffer; - } - available_words = (m_log_data.mask + 1) - (m_log_data.wr_idx - m_log_data.rd_idx); - // If there is no more room for even overflow tag indicate failed allocation. - if (available_words < HEADER_SIZE) - { - p_buf = NULL; + // buffer will fit in the tail or in the begining + // non zero offset is set if string is put at the beginning of the buffer + *p_offset = (len32 <= curr_pos_available) ? 0 : (tail_words - PUSHED_HEADER_SIZE); + uint32_t str_start_idx = + (m_log_data.wr_idx + PUSHED_HEADER_SIZE + *p_offset) & m_log_data.mask; + p_buf = &m_log_data.buffer[str_start_idx]; + // index is incremented by payload and offset + m_log_data.wr_idx += (len32 + *p_offset); } + CRITICAL_REGION_EXIT(); return p_buf; @@ -504,7 +582,7 @@ static inline void std_n(uint32_t severity_mid, char const * const p_str, uint32 uint32_t mask = m_log_data.mask; uint32_t wr_idx; - if (buf_prealloc(nargs, &wr_idx)) + if (buf_prealloc(nargs, &wr_idx, true)) { // Proceed only if buffer was successfully preallocated. @@ -605,7 +683,7 @@ void nrf_log_frontend_hexdump(uint32_t severity_mid, uint32_t mask = m_log_data.mask; uint32_t wr_idx; - if (buf_prealloc(CEIL_DIV(length, sizeof(uint32_t)), &wr_idx)) + if (buf_prealloc(CEIL_DIV(length, sizeof(uint32_t)), &wr_idx, false)) { uint32_t header_wr_idx = wr_idx; wr_idx += HEADER_SIZE; @@ -618,8 +696,7 @@ void nrf_log_frontend_hexdump(uint32_t severity_mid, else { memcpy(&m_log_data.buffer[wr_idx & mask], p_data, space0); - length -= space0; - memcpy(&m_log_data.buffer[0], &((uint8_t *)p_data)[space0], length); + memcpy(&m_log_data.buffer[0], &((uint8_t *)p_data)[space0], length - space0); } //Prepare header - in reverse order to ensure that packet type is validated (set to HEXDUMP as last action) @@ -628,14 +705,16 @@ void nrf_log_frontend_hexdump(uint32_t severity_mid, m_log_data.buffer[(header_wr_idx + 2) & mask] = m_log_data.timestamp_func(); } - m_log_data.buffer[(header_wr_idx + 1) & mask] = severity_mid >> NRF_LOG_MODULE_ID_POS; + uint32_t module_id = severity_mid >> NRF_LOG_MODULE_ID_POS; + uint32_t dropped = dropped_sat16_get(); + m_log_data.buffer[(header_wr_idx + 1) & mask] = module_id | (dropped << 16); //Header prepare nrf_log_header_t * p_header = (nrf_log_header_t *)&m_log_data.buffer[header_wr_idx & mask]; - p_header->base.hexdump.raw = (severity_mid & NRF_LOG_RAW) ? 1 : 0; - p_header->base.hexdump.severity = severity_mid & NRF_LOG_LEVEL_MASK; - p_header->base.hexdump.offset = 0; - p_header->base.hexdump.len = length; - p_header->base.hexdump.type = HEADER_TYPE_HEXDUMP; + p_header->base.hexdump.severity = severity_mid & NRF_LOG_LEVEL_MASK; + p_header->base.hexdump.offset = 0; + p_header->base.hexdump.len = length; + p_header->base.hexdump.type = HEADER_TYPE_HEXDUMP; + p_header->base.hexdump.in_progress = 0; @@ -653,9 +732,9 @@ bool buffer_is_empty(void) return (m_log_data.rd_idx == m_log_data.wr_idx); } - bool nrf_log_frontend_dequeue(void) { + if (buffer_is_empty()) { return false; @@ -672,12 +751,23 @@ bool nrf_log_frontend_dequeue(void) uint32_t severity = 0; // Skip any string that is pushed to the circular buffer. - while (p_header->base.generic.type == HEADER_TYPE_PUSHED) - { - rd_idx += PUSHED_HEADER_SIZE; - rd_idx += (p_header->base.pushed.len + p_header->base.pushed.offset); - p_header = (nrf_log_header_t *)&m_log_data.buffer[rd_idx & mask]; - } + do { + if (invalid_packets_pushed_str_omit(p_header, &rd_idx)) + { + //Check if end of data is not reached. + if (rd_idx >= m_log_data.wr_idx) + { + m_log_data.rd_idx = m_log_data.wr_idx; + return false; + } + //something was omitted. Point to new header and try again. + p_header = (nrf_log_header_t *)&m_log_data.buffer[rd_idx & mask]; + } + else + { + break; + } + } while (true); uint32_t i; for (i = 0; i < HEADER_SIZE; i++) @@ -692,7 +782,7 @@ bool nrf_log_frontend_dequeue(void) header.base.hexdump.len = data_len; uint32_t msg_buf_size8 = sizeof(uint32_t)*HEADER_SIZE + data_len; severity = header.base.hexdump.severity; - p_msg_buf = nrf_memobj_alloc(&mempool, msg_buf_size8); + p_msg_buf = nrf_memobj_alloc(&log_mempool, msg_buf_size8); if (p_msg_buf) { @@ -732,7 +822,7 @@ bool nrf_log_frontend_dequeue(void) uint32_t msg_buf_size32 = HEADER_SIZE + header.base.std.nargs; severity = header.base.std.severity; - p_msg_buf = nrf_memobj_alloc(&mempool, msg_buf_size32*sizeof(uint32_t)); + p_msg_buf = nrf_memobj_alloc(&log_mempool, msg_buf_size32*sizeof(uint32_t)); if (p_msg_buf) { @@ -748,13 +838,6 @@ bool nrf_log_frontend_dequeue(void) } } } - else if (header.base.generic.type == HEADER_TYPE_INVALID && (m_log_data.log_skipped == 0)) - { - //invalid type can only occur if log entry was interrupted by log_process. It is likly final flush - // and finding invalid type means that last entry in the buffer was reached (the one that was interrupted). - // Stop processing immediately. - return false; - } else { //Do nothing. In case of log overflow buffer can contain corrupted data. @@ -779,9 +862,13 @@ bool nrf_log_frontend_dequeue(void) if (NRF_LOG_FILTERS_ENABLED) { uint8_t backend_id = nrf_log_backend_id_get(p_backend); - uint32_t filter_lvls = NRF_LOG_DYNAMIC_SECTION_VARS_GET(header.module_id)->filter_lvls; + nrf_log_module_dynamic_data_t * p_module_filter = + (nrf_log_module_dynamic_data_t *)NRF_LOG_DYNAMIC_SECTION_VARS_GET(header.module_id); + uint32_t filter_lvls = p_module_filter->filter_lvls; uint32_t backend_lvl = (filter_lvls >> (backend_id*NRF_LOG_LEVEL_BITS)) & NRF_LOG_LEVEL_MASK; + //Degrade INFO_RAW level to INFO. + severity = (severity == NRF_LOG_SEVERITY_INFO_RAW) ? NRF_LOG_SEVERITY_INFO : severity; if (backend_lvl >= severity) { entry_accepted = true; @@ -795,7 +882,7 @@ bool nrf_log_frontend_dequeue(void) } if (entry_accepted) { - nrf_log_backend_put(p_backend, p_msg_buf); + nrf_log_backend_put(p_backend, p_msg_buf); } p_backend = p_backend->p_next; } @@ -821,6 +908,18 @@ bool nrf_log_frontend_dequeue(void) } } } + else + { + //Could not allocate memobj - backends are not freeing them on time. + nrf_log_backend_t * p_backend = m_log_data.p_backend_head; + //Flush all backends + while (p_backend) + { + nrf_log_backend_flush(p_backend); + p_backend = p_backend->p_next; + } + NRF_LOG_WARNING("Backends flushed"); + } return buffer_is_empty() ? false : true; } @@ -877,7 +976,7 @@ int32_t nrf_log_backend_add(nrf_log_backend_t * p_backend, nrf_log_severity_t se uint32_t i; for (i = 0; i < nrf_log_module_cnt_get(); i++) { - nrf_log_severity_t buildin_lvl = nrf_log_module_filter_get(id, i, false, false); + nrf_log_severity_t buildin_lvl = nrf_log_module_init_filter_get(i); nrf_log_severity_t actual_severity = MIN(buildin_lvl, severity); nrf_log_module_filter_set(nrf_log_backend_id_get(p_backend), i, actual_severity); } @@ -947,14 +1046,14 @@ static void log_status(nrf_cli_t const * p_cli, size_t argc, char **argv) { nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "Logs are halted!\r\n"); } - nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "%-24s | current | buildin \r\n", "module_name"); - nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "------------------------------------------\r\n"); + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "%-40s | current | built-in \r\n", "module_name"); + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "----------------------------------------------------------\r\n"); for (i = 0; i < modules_cnt; i++) { nrf_log_severity_t module_dynamic_lvl = nrf_log_module_filter_get(backend_id, i, true, true); nrf_log_severity_t module_compiled_lvl = nrf_log_module_filter_get(backend_id, i, true, false); nrf_log_severity_t actual_compiled_lvl = MIN(module_compiled_lvl, (nrf_log_severity_t)NRF_LOG_DEFAULT_LEVEL); - nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "%-24s | %-7s | %s%s\r\n", + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, "%-40s | %-7s | %s%s\r\n", nrf_log_module_name_get(i, true), m_severity_lvls[module_dynamic_lvl], m_severity_lvls[actual_compiled_lvl], diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_internal.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_internal.h similarity index 64% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_internal.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_internal.h index 3cf7b0600c..7c5246f9f8 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_internal.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_internal.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -45,6 +45,8 @@ #include "app_util.h" #include #include +#include "nrf_log_instance.h" +#include "nrf_log_types.h" #ifndef NRF_LOG_ERROR_COLOR #define NRF_LOG_ERROR_COLOR NRF_LOG_COLOR_DEFAULT @@ -87,49 +89,30 @@ #define NRF_LOG_MODULE_NAME app #endif -#define NRF_LOG_LEVEL_ERROR 1UL -#define NRF_LOG_LEVEL_WARNING 2UL -#define NRF_LOG_LEVEL_INFO 3UL -#define NRF_LOG_LEVEL_DEBUG 4UL -#define NRF_LOG_LEVEL_INTERNAL 5UL #define NRF_LOG_LEVEL_BITS 3 #define NRF_LOG_LEVEL_MASK ((1UL << NRF_LOG_LEVEL_BITS) - 1) -#define NRF_LOG_RAW_POS 4U -#define NRF_LOG_RAW (1UL << NRF_LOG_RAW_POS) #define NRF_LOG_MODULE_ID_BITS 16 #define NRF_LOG_MODULE_ID_POS 16 -#define NRF_LOG_LEVEL_INFO_RAW (NRF_LOG_RAW | NRF_LOG_LEVEL_INFO) + #define NRF_LOG_MAX_NUM_OF_ARGS 6 -/* - * For GCC sections are sorted in the group by the linker. For IAR and KEIL it is assumed that linker will sort - * dynamic and const section in the same order (but in different locations). Proper message formatting - * is based on that assumption. - */ -#if defined(__GNUC__) -#define NRF_LOG_DYNAMIC_SECTION_NAME(_module_name) CONCAT_2(log_dynamic_data_,_module_name) -#define NRF_LOG_CONST_SECTION_NAME(_module_name) CONCAT_2(log_const_data_,_module_name) -#else -#define NRF_LOG_DYNAMIC_SECTION_NAME(_module_name) log_dynamic_data -#define NRF_LOG_CONST_SECTION_NAME(_module_name) log_const_data -#endif - -#define NRF_LOG_MODULE_DATA CONCAT_3(m_nrf_log_,NRF_LOG_MODULE_NAME,_logs_data) -#define NRF_LOG_MODULE_DATA_DYNAMIC CONCAT_2(NRF_LOG_MODULE_DATA,_dynamic) -#define NRF_LOG_MODULE_DATA_CONST CONCAT_2(NRF_LOG_MODULE_DATA,_const) #if NRF_LOG_FILTERS_ENABLED && NRF_LOG_ENABLED - #define NRF_LOG_FILTER NRF_LOG_MODULE_DATA_DYNAMIC.filter + #define NRF_LOG_FILTER NRF_LOG_ITEM_DATA_DYNAMIC(NRF_LOG_MODULE_NAME).filter + #define NRF_LOG_INST_FILTER(p_inst) (p_inst)->filter #else #undef NRF_LOG_FILTER - #define NRF_LOG_FILTER NRF_LOG_LEVEL_DEBUG + #define NRF_LOG_FILTER NRF_LOG_SEVERITY_DEBUG + #define NRF_LOG_INST_FILTER(p_inst) NRF_LOG_SEVERITY_DEBUG #endif #if NRF_LOG_ENABLED -#define NRF_LOG_MODULE_ID NRF_LOG_MODULE_DATA_DYNAMIC.module_id +#define NRF_LOG_MODULE_ID NRF_LOG_ITEM_DATA_DYNAMIC(NRF_LOG_MODULE_NAME).module_id +#define NRF_LOG_INST_ID(p_inst) (p_inst)->module_id #else -#define NRF_LOG_MODULE_ID 0 +#define NRF_LOG_MODULE_ID 0 +#define NRF_LOG_INST_ID(p_inst) 0 #endif @@ -175,9 +158,10 @@ (void)(_type); (void)(_str); (void)(_arg0); (void)(_arg1); (void)(_arg2); (void)(_arg3); (void)(_arg4) #define LOG_INTERNAL_6(_type, _str, _arg0, _arg1, _arg2, _arg3, _arg4, _arg5) \ (void)(_type); (void)(_str); (void)(_arg0); (void)(_arg1); (void)(_arg2); (void)(_arg3); (void)(_arg4); (void)(_arg5) -#endif //NRF_LOG_ENABLED && (NRF_LOG_DEFAULT_LEVEL >= NRF_LOG_LEVEL_ERROR) +#endif //NRF_LOG_ENABLED #define LOG_SEVERITY_MOD_ID(severity) ((severity) | NRF_LOG_MODULE_ID << NRF_LOG_MODULE_ID_POS) +#define LOG_SEVERITY_INST_ID(severity,p_inst) ((severity) | NRF_LOG_INST_ID(p_inst) << NRF_LOG_MODULE_ID_POS) #if NRF_LOG_ENABLED #define LOG_HEXDUMP(_severity, _p_data, _length) \ @@ -187,132 +171,125 @@ (void)(_severity); (void)(_p_data); (void)_length #endif -#define NRF_LOG_INTERNAL_ERROR(...) \ - if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= NRF_LOG_LEVEL_ERROR) && \ - (NRF_LOG_LEVEL_ERROR <= NRF_LOG_DEFAULT_LEVEL)) \ - { \ - if (NRF_LOG_FILTER >= NRF_LOG_LEVEL_ERROR) \ - { \ - LOG_INTERNAL(LOG_SEVERITY_MOD_ID(NRF_LOG_LEVEL_ERROR), __VA_ARGS__); \ - } \ - } -#define NRF_LOG_INTERNAL_HEXDUMP_ERROR(p_data, len) \ - if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= NRF_LOG_LEVEL_ERROR) && \ - (NRF_LOG_LEVEL_ERROR <= NRF_LOG_DEFAULT_LEVEL)) \ - { \ - if (NRF_LOG_FILTER >= NRF_LOG_LEVEL_ERROR) \ - { \ - LOG_HEXDUMP(LOG_SEVERITY_MOD_ID(NRF_LOG_LEVEL_ERROR), \ - (p_data), (len)); \ - } \ +#define NRF_LOG_INTERNAL_INST(level, level_id, p_inst, ...) \ + if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= level) && \ + (level <= NRF_LOG_DEFAULT_LEVEL)) \ + { \ + if (NRF_LOG_INST_FILTER(p_inst) >= level) \ + { \ + LOG_INTERNAL(LOG_SEVERITY_INST_ID(level_id, p_inst), __VA_ARGS__); \ + } \ } -#define NRF_LOG_INTERNAL_WARNING(...) \ - if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= NRF_LOG_LEVEL_WARNING) && \ - (NRF_LOG_LEVEL_WARNING <= NRF_LOG_DEFAULT_LEVEL)) \ - { \ - if (NRF_LOG_FILTER >= NRF_LOG_LEVEL_WARNING) \ - { \ - LOG_INTERNAL(LOG_SEVERITY_MOD_ID(NRF_LOG_LEVEL_WARNING), __VA_ARGS__); \ - } \ +#define NRF_LOG_INTERNAL_MODULE(level, level_id, ...) \ + if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= level) && \ + (level <= NRF_LOG_DEFAULT_LEVEL)) \ + { \ + if (NRF_LOG_FILTER >= level) \ + { \ + LOG_INTERNAL(LOG_SEVERITY_MOD_ID(level_id), __VA_ARGS__); \ + } \ } -#define NRF_LOG_INTERNAL_HEXDUMP_WARNING(p_data, len) \ - if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= NRF_LOG_LEVEL_WARNING) && \ - (NRF_LOG_LEVEL_WARNING <= NRF_LOG_DEFAULT_LEVEL)) \ + +#define NRF_LOG_INTERNAL_HEXDUMP_INST(level, level_id, p_inst, p_data, len) \ + if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= level) && \ + (level <= NRF_LOG_DEFAULT_LEVEL)) \ { \ - if (NRF_LOG_FILTER >= NRF_LOG_LEVEL_WARNING) \ + if (NRF_LOG_INST_FILTER(p_inst) >= level) \ { \ - LOG_HEXDUMP(LOG_SEVERITY_MOD_ID(NRF_LOG_LEVEL_WARNING, \ + LOG_HEXDUMP(LOG_SEVERITY_INST_ID(level_id, p_inst), \ (p_data), (len)); \ } \ } -#define NRF_LOG_INTERNAL_INFO(...) \ - if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= NRF_LOG_LEVEL_INFO) && \ - (NRF_LOG_LEVEL_INFO <= NRF_LOG_DEFAULT_LEVEL)) \ +#define NRF_LOG_INTERNAL_HEXDUMP_MODULE(level, level_id, p_data, len) \ + if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= level) && \ + (level <= NRF_LOG_DEFAULT_LEVEL)) \ { \ - if (NRF_LOG_FILTER >= NRF_LOG_LEVEL_INFO) \ + if (NRF_LOG_FILTER >= level) \ { \ - LOG_INTERNAL(LOG_SEVERITY_MOD_ID(NRF_LOG_LEVEL_INFO), __VA_ARGS__); \ - } \ - } - -#define NRF_LOG_INTERNAL_RAW_INFO(...) \ - if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= NRF_LOG_LEVEL_INFO) && \ - (NRF_LOG_LEVEL_INFO <= NRF_LOG_DEFAULT_LEVEL)) \ - { \ - if (NRF_LOG_FILTER >= NRF_LOG_LEVEL_INFO) \ - { \ - LOG_INTERNAL(LOG_SEVERITY_MOD_ID(NRF_LOG_LEVEL_INFO | NRF_LOG_RAW), \ - __VA_ARGS__); \ - } \ - } - -#define NRF_LOG_INTERNAL_HEXDUMP_INFO(p_data, len) \ - if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= NRF_LOG_LEVEL_INFO) && \ - (NRF_LOG_LEVEL_INFO <= NRF_LOG_DEFAULT_LEVEL)) \ - { \ - if (NRF_LOG_FILTER >= NRF_LOG_LEVEL_INFO) \ - { \ - LOG_HEXDUMP(LOG_SEVERITY_MOD_ID(NRF_LOG_LEVEL_INFO), \ + LOG_HEXDUMP(LOG_SEVERITY_MOD_ID(level_id), \ (p_data), (len)); \ } \ } -#define NRF_LOG_INTERNAL_RAW_HEXDUMP_INFO(p_data, len) \ - if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= NRF_LOG_LEVEL_INFO) && \ - (NRF_LOG_LEVEL_INFO <= NRF_LOG_DEFAULT_LEVEL)) \ - { \ - if (NRF_LOG_FILTER >= NRF_LOG_LEVEL_INFO) \ - { \ - LOG_HEXDUMP(LOG_SEVERITY_MOD_ID(NRF_LOG_LEVEL_INFO_RAW), \ - (p_data), (len)); \ - } \ - } +#define NRF_LOG_INTERNAL_INST_ERROR(p_inst, ...) \ + NRF_LOG_INTERNAL_INST(NRF_LOG_SEVERITY_ERROR, NRF_LOG_SEVERITY_ERROR, p_inst, __VA_ARGS__) -#define NRF_LOG_INTERNAL_DEBUG(...) \ - if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= NRF_LOG_LEVEL_DEBUG) && \ - (NRF_LOG_LEVEL_DEBUG <= NRF_LOG_DEFAULT_LEVEL)) \ - { \ - if (NRF_LOG_FILTER >= NRF_LOG_LEVEL_DEBUG) \ - { \ - LOG_INTERNAL(LOG_SEVERITY_MOD_ID(NRF_LOG_LEVEL_DEBUG), __VA_ARGS__); \ - } \ - } -#define NRF_LOG_INTERNAL_HEXDUMP_DEBUG(p_data, len) \ - if (NRF_LOG_ENABLED && (NRF_LOG_LEVEL >= NRF_LOG_LEVEL_DEBUG) && \ - (NRF_LOG_LEVEL_DEBUG <= NRF_LOG_DEFAULT_LEVEL)) \ - { \ - if (NRF_LOG_FILTER >= NRF_LOG_LEVEL_DEBUG) \ - { \ - LOG_HEXDUMP(LOG_SEVERITY_MOD_ID(NRF_LOG_LEVEL_DEBUG), \ - (p_data), (len)); \ - } \ - } +#define NRF_LOG_INTERNAL_ERROR(...) \ + NRF_LOG_INTERNAL_MODULE(NRF_LOG_SEVERITY_ERROR, NRF_LOG_SEVERITY_ERROR,__VA_ARGS__) -#if NRF_MODULE_ENABLED(NRF_LOG) -#define NRF_LOG_INTERNAL_GETCHAR() nrf_log_getchar() +#define NRF_LOG_INTERNAL_HEXDUMP_INST_ERROR(p_inst, p_data, len) \ + NRF_LOG_INTERNAL_HEXDUMP_INST(NRF_LOG_SEVERITY_ERROR, NRF_LOG_SEVERITY_ERROR, p_inst, p_data, len) + +#define NRF_LOG_INTERNAL_HEXDUMP_ERROR(p_data, len) \ + NRF_LOG_INTERNAL_HEXDUMP_MODULE(NRF_LOG_SEVERITY_ERROR, NRF_LOG_SEVERITY_ERROR, p_data, len) + +#define NRF_LOG_INTERNAL_INST_WARNING(p_inst, ...) \ + NRF_LOG_INTERNAL_INST(NRF_LOG_SEVERITY_WARNING, NRF_LOG_SEVERITY_WARNING, p_inst, __VA_ARGS__) + +#define NRF_LOG_INTERNAL_WARNING(...) \ + NRF_LOG_INTERNAL_MODULE(NRF_LOG_SEVERITY_WARNING, NRF_LOG_SEVERITY_WARNING,__VA_ARGS__) + +#define NRF_LOG_INTERNAL_HEXDUMP_INST_WARNING(p_inst, p_data, len) \ + NRF_LOG_INTERNAL_HEXDUMP_INST(NRF_LOG_SEVERITY_WARNING, NRF_LOG_SEVERITY_WARNING, p_inst, p_data, len) + +#define NRF_LOG_INTERNAL_HEXDUMP_WARNING(p_data, len) \ + NRF_LOG_INTERNAL_HEXDUMP_(NRF_LOG_SEVERITY_WARNING, NRF_LOG_SEVERITY_WARNING, p_data, len) + +#define NRF_LOG_INTERNAL_INST_INFO(p_inst, ...) \ + NRF_LOG_INTERNAL_INST(NRF_LOG_SEVERITY_INFO, NRF_LOG_SEVERITY_INFO, p_inst, __VA_ARGS__) + +#define NRF_LOG_INTERNAL_INFO(...) \ + NRF_LOG_INTERNAL_MODULE(NRF_LOG_SEVERITY_INFO, NRF_LOG_SEVERITY_INFO, __VA_ARGS__) + +#define NRF_LOG_INTERNAL_HEXDUMP_INST_INFO(p_inst, p_data, len) \ + NRF_LOG_INTERNAL_HEXDUMP_INST(NRF_LOG_SEVERITY_INFO, NRF_LOG_SEVERITY_INFO, p_inst, p_data, len) + +#define NRF_LOG_INTERNAL_HEXDUMP_INFO(p_data, len) \ + NRF_LOG_INTERNAL_HEXDUMP_MODULE(NRF_LOG_SEVERITY_INFO, NRF_LOG_SEVERITY_INFO, p_data, len) + +#define NRF_LOG_INTERNAL_RAW_INFO(...) \ + NRF_LOG_INTERNAL_MODULE(NRF_LOG_SEVERITY_INFO, NRF_LOG_SEVERITY_INFO_RAW, __VA_ARGS__) + +#define NRF_LOG_INTERNAL_RAW_HEXDUMP_INFO(p_data, len) \ + NRF_LOG_INTERNAL_HEXDUMP_MODULE(NRF_LOG_SEVERITY_INFO, NRF_LOG_SEVERITY_INFO_RAW, p_data, len) + +#define NRF_LOG_INTERNAL_INST_DEBUG(p_inst, ...) \ + NRF_LOG_INTERNAL_INST(NRF_LOG_SEVERITY_DEBUG, NRF_LOG_SEVERITY_DEBUG, p_inst, __VA_ARGS__) + +#define NRF_LOG_INTERNAL_DEBUG(...) \ + NRF_LOG_INTERNAL_MODULE(NRF_LOG_SEVERITY_DEBUG, NRF_LOG_SEVERITY_DEBUG, __VA_ARGS__) + +#define NRF_LOG_INTERNAL_HEXDUMP_INST_DEBUG(p_inst, p_data, len) \ + NRF_LOG_INTERNAL_HEXDUMP_INST(NRF_LOG_SEVERITY_DEBUG, NRF_LOG_SEVERITY_DEBUG, p_inst, p_data, len) + +#define NRF_LOG_INTERNAL_HEXDUMP_DEBUG(p_data, len) \ + NRF_LOG_INTERNAL_HEXDUMP_MODULE(NRF_LOG_SEVERITY_DEBUG, NRF_LOG_SEVERITY_DEBUG, p_data, len) + + +#if NRF_LOG_ENABLED + +#ifdef UNIT_TEST +#define COMPILED_LOG_LEVEL 4 #else -#define NRF_LOG_INTERNAL_GETCHAR() (void) +#define COMPILED_LOG_LEVEL NRF_LOG_LEVEL #endif -typedef struct -{ - uint16_t module_id; - uint16_t order_idx; - uint32_t filter; - uint32_t filter_lvls; -} nrf_log_module_dynamic_data_t; -typedef struct -{ - const char * p_module_name; - uint8_t info_color_id; - uint8_t debug_color_id; - uint8_t compiled_lvl; -} nrf_log_module_const_data_t; +#define NRF_LOG_INTERNAL_MODULE_REGISTER() \ + NRF_LOG_INTERNAL_ITEM_REGISTER(NRF_LOG_MODULE_NAME, \ + STRINGIFY(NRF_LOG_MODULE_NAME), \ + NRF_LOG_INFO_COLOR, \ + NRF_LOG_DEBUG_COLOR, \ + NRF_LOG_INITIAL_LEVEL, \ + COMPILED_LOG_LEVEL) -extern nrf_log_module_dynamic_data_t NRF_LOG_MODULE_DATA_DYNAMIC; +#else +#define NRF_LOG_INTERNAL_MODULE_REGISTER() /*lint -save -e19*/ /*lint -restore*/ +#endif + +extern NRF_LOG_DYNAMIC_STRUCT_NAME NRF_LOG_ITEM_DATA_DYNAMIC(NRF_LOG_MODULE_NAME); /** * Set of macros for encoding and decoding header for log entries. @@ -385,14 +362,14 @@ extern nrf_log_module_dynamic_data_t NRF_LOG_MODULE_DATA_DYNAMIC; typedef struct { uint32_t type : 2; - uint32_t raw : 1; + uint32_t in_progress: 1; uint32_t data : 29; } nrf_log_generic_header_t; typedef struct { uint32_t type : 2; - uint32_t raw : 1; + uint32_t in_progress: 1; uint32_t severity : 3; uint32_t nargs : 4; uint32_t addr : 22; @@ -401,7 +378,7 @@ typedef struct typedef struct { uint32_t type : 2; - uint32_t raw : 1; + uint32_t in_progress: 1; uint32_t severity : 3; uint32_t offset : 10; uint32_t reserved : 6; @@ -417,16 +394,20 @@ typedef struct uint32_t len : 10; } nrf_log_pushed_header_t; +typedef union +{ + nrf_log_generic_header_t generic; + nrf_log_std_header_t std; + nrf_log_hexdump_header_t hexdump; + nrf_log_pushed_header_t pushed; + uint32_t raw; +} nrf_log_main_header_t; + typedef struct { - union { - nrf_log_generic_header_t generic; - nrf_log_std_header_t std; - nrf_log_hexdump_header_t hexdump; - nrf_log_pushed_header_t pushed; - uint32_t raw; - } base; - uint32_t module_id; + nrf_log_main_header_t base; + uint16_t module_id; + uint16_t dropped; uint32_t timestamp; } nrf_log_header_t; diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_str_formatter.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_str_formatter.c similarity index 79% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_str_formatter.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_str_formatter.c index accdf224fc..fa548f34d7 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_log/src/nrf_log_str_formatter.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_log/src/nrf_log_str_formatter.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -75,21 +75,54 @@ static const char * m_colors[] = { NRF_LOG_COLOR_CODE_WHITE, }; +static uint32_t m_freq; +static uint32_t m_timestamp_div; + +static void timestamp_print(nrf_fprintf_ctx_t * p_ctx, uint32_t timestamp) +{ + if (NRF_LOG_USES_TIMESTAMP) + { + if (NRF_LOG_STR_FORMATTER_TIMESTAMP_FORMAT_ENABLED) + { + timestamp /= m_timestamp_div; + uint32_t seconds = timestamp/m_freq; + uint32_t hours = seconds/3600; + seconds -= hours * 3600; + uint32_t mins = seconds/60; + seconds -= mins * 60; + + uint32_t reminder = timestamp % m_freq; + uint32_t ms = (reminder * 1000)/m_freq; + uint32_t us = (1000*(1000*reminder - (ms * m_freq)))/m_freq; + + nrf_fprintf(p_ctx, "[%02d:%02d:%02d.%03d,%03d] ", hours, mins, seconds, ms, us); + } + else + { + nrf_fprintf(p_ctx, "[%08lu] ", timestamp); + } + } +} static void prefix_process(nrf_log_str_formatter_entry_params_t * p_params, nrf_fprintf_ctx_t * p_ctx) { - if (!(p_params->raw)) + if (p_params->dropped) + { + nrf_fprintf(p_ctx, + "%sLogs dropped (%d)%s\r\n", + NRF_LOG_COLOR_CODE_RED, + p_params->dropped, + NRF_LOG_COLOR_CODE_DEFAULT); + } + + if (!(p_params->severity == NRF_LOG_SEVERITY_INFO_RAW)) { if (p_params->use_colors) { nrf_fprintf(p_ctx, "%s", m_colors[nrf_log_color_id_get( p_params->module_id, p_params->severity)]); } - - if (NRF_LOG_USES_TIMESTAMP) - { - nrf_fprintf(p_ctx, "[%08lu] ", p_params->timestamp); - } + timestamp_print(p_ctx, p_params->timestamp); nrf_fprintf(p_ctx, "<%s> %s: ", severity_names[p_params->severity], nrf_log_module_name_get(p_params->module_id, false)); @@ -100,7 +133,7 @@ static void postfix_process(nrf_log_str_formatter_entry_params_t * p_params, nrf_fprintf_ctx_t * p_ctx, bool newline) { - if (!p_params->raw) + if (!(p_params->severity == NRF_LOG_SEVERITY_INFO_RAW)) { if (p_params->use_colors) { @@ -206,4 +239,18 @@ void nrf_log_hexdump_entry_process(uint8_t * p_data, p_ctx->auto_flush = auto_flush; } + +void nrf_log_str_formatter_timestamp_freq_set(uint32_t freq) +{ + m_timestamp_div = 1; + /* There is no point to have frequency higher than 1MHz (ns are not printed) and too high + * frequency leads to overflows in calculations. + */ + while (freq > 1000000) + { + freq /= 2; + m_timestamp_div *= 2; + } + m_freq = freq; +} #endif //NRF_LOG_ENABLED diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_memobj/nrf_memobj.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_memobj/nrf_memobj.c similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_memobj/nrf_memobj.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_memobj/nrf_memobj.c index 4d7deef085..44b44fc232 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_memobj/nrf_memobj.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_memobj/nrf_memobj.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_memobj/nrf_memobj.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_memobj/nrf_memobj.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_memobj/nrf_memobj.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_memobj/nrf_memobj.h index d3188d3bcf..06740db103 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_memobj/nrf_memobj.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_memobj/nrf_memobj.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_section_vars/nrf_section.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_section_vars/nrf_section.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_section_vars/nrf_section.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_section_vars/nrf_section.h index 83753e7ea6..7f0e3bee4f 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_section_vars/nrf_section.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_section_vars/nrf_section.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_section_vars/nrf_section_iter.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_section_vars/nrf_section_iter.c similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_section_vars/nrf_section_iter.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_section_vars/nrf_section_iter.c index e54535cc69..288315e5d2 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_section_vars/nrf_section_iter.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_section_vars/nrf_section_iter.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_section_vars/nrf_section_iter.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_section_vars/nrf_section_iter.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_section_vars/nrf_section_iter.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_section_vars/nrf_section_iter.h index 60cf0f6669..c03ed6cc62 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/experimental_section_vars/nrf_section_iter.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/experimental_section_vars/nrf_section_iter.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/fds/fds.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/fds/fds.c similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/fds/fds.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/fds/fds.c index 995af78fa8..99ddc66931 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/fds/fds.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/fds/fds.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -326,10 +326,19 @@ static void page_scan(uint32_t const * p_addr, } -static void page_offsets_update(fds_page_t * const p_page, uint16_t length_words) +static void page_offsets_update(fds_page_t * const p_page, fds_op_t const * p_op) { - p_page->write_offset += (FDS_HEADER_SIZE + length_words); - p_page->words_reserved -= (FDS_HEADER_SIZE + length_words); + // If the first part of the header has been written correctly, update the offset as normal. + // Even if the record has not been written completely, fds is still able to continue normal + // operation. Incomplete records will be deleted the next time garbage collection is run. + // If we failed at the very beginning of the write operation, restore the offset + // to the previous value so that no holes will be left in the flash. + if (p_op->write.step > FDS_OP_WRITE_RECORD_ID) + { + p_page->write_offset += (FDS_HEADER_SIZE + p_op->write.header.length_words); + } + + p_page->words_reserved -= (FDS_HEADER_SIZE + p_op->write.header.length_words); } @@ -1207,7 +1216,7 @@ static ret_code_t write_execute(uint32_t prev_ret, fds_op_t * const p_op) if (prev_ret != NRF_SUCCESS) { // The previous operation has timed out, update offsets. - page_offsets_update(p_page, p_op->write.header.length_words); + page_offsets_update(p_page, p_op); return FDS_ERR_OPERATION_TIMEOUT; } @@ -1277,7 +1286,7 @@ static ret_code_t write_execute(uint32_t prev_ret, fds_op_t * const p_op) if (ret != FDS_OP_EXECUTING) { // There won't be another callback for this operation, so update the page offset now. - page_offsets_update(p_page, p_op->write.header.length_words); + page_offsets_update(p_page, p_op); } return ret; @@ -1436,23 +1445,15 @@ static void queue_process(ret_code_t result) // - free the operation buffer // - execute any other queued operations - fds_evt_t evt; - memset(&evt, 0x00, sizeof(evt)); - - if (result == FDS_OP_COMPLETED) + fds_evt_t evt = { - evt.result = FDS_SUCCESS; - result = NRF_SUCCESS; - } - else - { - // The operation failed for one of the following reasons: + // The operation might have failed for one of the following reasons: // FDS_ERR_BUSY - flash subsystem can't accept the operation // FDS_ERR_OPERATION_TIMEOUT - flash subsystem timed out // FDS_ERR_CRC_CHECK_FAILED - a CRC check failed // FDS_ERR_NOT_FOUND - no record found (delete/update) - evt.result = result; - } + .result = (result == FDS_OP_COMPLETED) ? FDS_SUCCESS : result, + }; event_prepare(m_p_cur_op, &evt); event_send(&evt); @@ -1461,6 +1462,10 @@ static void queue_process(ret_code_t result) // will fetch a new one from the queue next time it is run. m_p_cur_op = NULL; + // The result of the operation must be reset upon re-entering the loop to ensure + // the next operation won't be affected by eventual errors in previous operations. + result = NRF_SUCCESS; + // Free the queue element used by the current operation. queue_free(&m_iget_ctx); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/fds/fds.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/fds/fds.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/fds/fds.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/fds/fds.h index 3d5986b497..09d1eea08f 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/fds/fds.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/fds/fds.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -196,7 +196,7 @@ typedef enum } fds_evt_id_t; -ANON_UNIONS_ENABLE +ANON_UNIONS_ENABLE; /**@brief An FDS event. */ typedef struct @@ -221,7 +221,7 @@ typedef struct }; } fds_evt_t; -ANON_UNIONS_DISABLE +ANON_UNIONS_DISABLE; /**@brief File system statistics. */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/fds/fds_internal_defs.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/fds/fds_internal_defs.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/fds/fds_internal_defs.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/fds/fds_internal_defs.h index 0d490cac86..7502b43750 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/fds/fds_internal_defs.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/fds/fds_internal_defs.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -80,9 +80,9 @@ extern "C" { #define NRF_FSTORAGE_SD 2 // The size of a physical page, in 4-byte words. -#if defined(NRF51) +#if defined(NRF51) #define FDS_PHY_PAGE_SIZE (256) - #elif defined(NRF52_SERIES) +#else #define FDS_PHY_PAGE_SIZE (1024) #endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/fstorage/nrf_fstorage.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/fstorage/nrf_fstorage.c similarity index 59% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/fstorage/nrf_fstorage.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/fstorage/nrf_fstorage.c index b0d013a6ec..d96abce6c1 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/fstorage/nrf_fstorage.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/fstorage/nrf_fstorage.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -45,24 +45,45 @@ #include #include #include "sdk_errors.h" +#include "sdk_macros.h" #include "nrf_section.h" +#define NRF_LOG_MODULE_NAME nrf_fstorage +#include "nrf_log.h" +NRF_LOG_MODULE_REGISTER(); + /* Create the section "fs_data". */ NRF_SECTION_DEF(fs_data, nrf_fstorage_t); -static bool addr_within_bounds(nrf_fstorage_t const * p_fs, uint32_t addr, uint32_t len); + +/**@brief Macro to handle user input validation. + * + * If @p _cond evaluates to true, does nothing. Otherwise, + * if the NRF_FSTORAGE_PARAM_CHECK_DISABLED is not set, logs an error message and returns @p _err. + * If the NRF_FSTORAGE_PARAM_CHECK_DISABLED is set, behaves like the @ref ASSERT macro. + * + * Parameter checking implemented using this macro can be optionally turned off for release code. + * Only disable runtime parameter checks if size if a major concern. + * + * @param _cond The condition to be evaluated. + * @param _err The error code to be returned. + */ +#define NRF_FSTORAGE_PARAM_CHECK(_cond, _err) \ + NRF_PARAM_CHECK(NRF_FSTORAGE, _cond, _err, NRF_LOG_ERROR) + + static bool addr_is_aligned32(uint32_t addr); +static bool addr_is_page_aligned(nrf_fstorage_t const * p_fs, uint32_t addr); +static bool addr_is_within_bounds(nrf_fstorage_t const * p_fs, uint32_t addr, uint32_t len); ret_code_t nrf_fstorage_init(nrf_fstorage_t * p_fs, nrf_fstorage_api_t * p_api, void * p_param) { - if ((p_fs == NULL) || (p_api == NULL)) - { - return NRF_ERROR_NULL; - } + NRF_FSTORAGE_PARAM_CHECK(p_fs, NRF_ERROR_NULL); + NRF_FSTORAGE_PARAM_CHECK(p_api, NRF_ERROR_NULL); p_fs->p_api = p_api; @@ -75,15 +96,8 @@ ret_code_t nrf_fstorage_uninit(nrf_fstorage_t * p_fs, { ret_code_t rc; - if (p_fs == NULL) - { - return NRF_ERROR_NULL; - } - - if (p_fs->p_api == NULL) - { - return NRF_ERROR_INVALID_STATE; - } + NRF_FSTORAGE_PARAM_CHECK(p_fs, NRF_ERROR_NULL); + NRF_FSTORAGE_PARAM_CHECK(p_fs->p_api, NRF_ERROR_INVALID_STATE); rc = (p_fs->p_api)->uninit(p_fs, p_param); @@ -100,27 +114,14 @@ ret_code_t nrf_fstorage_read(nrf_fstorage_t const * p_fs, void * p_dest, uint32_t len) { - if ((p_fs == NULL) || (p_dest == NULL)) - { - return NRF_ERROR_NULL; - } - - if (p_fs->p_api == NULL) - { - return NRF_ERROR_INVALID_STATE; - } - - if (len == 0) - { - return NRF_ERROR_INVALID_LENGTH; - } + NRF_FSTORAGE_PARAM_CHECK(p_fs, NRF_ERROR_NULL); + NRF_FSTORAGE_PARAM_CHECK(p_dest, NRF_ERROR_NULL); + NRF_FSTORAGE_PARAM_CHECK(p_fs->p_api, NRF_ERROR_INVALID_STATE); + NRF_FSTORAGE_PARAM_CHECK(len, NRF_ERROR_INVALID_LENGTH); /* Source addres must be word-aligned. */ - if ( !addr_is_aligned32(src) - || !addr_within_bounds(p_fs, src, len)) - { - return NRF_ERROR_INVALID_ADDR; - } + NRF_FSTORAGE_PARAM_CHECK(addr_is_aligned32(src), NRF_ERROR_INVALID_ADDR); + NRF_FSTORAGE_PARAM_CHECK(addr_is_within_bounds(p_fs, src, len), NRF_ERROR_INVALID_ADDR); return (p_fs->p_api)->read(p_fs, src, p_dest, len); } @@ -132,29 +133,18 @@ ret_code_t nrf_fstorage_write(nrf_fstorage_t const * p_fs, uint32_t len, void * p_context) { - if ((p_fs == NULL) || (p_src == NULL)) - { - return NRF_ERROR_NULL; - } - - if (p_fs->p_api == NULL) - { - return NRF_ERROR_INVALID_STATE; - } + NRF_FSTORAGE_PARAM_CHECK(p_fs, NRF_ERROR_NULL); + NRF_FSTORAGE_PARAM_CHECK(p_src, NRF_ERROR_NULL); + NRF_FSTORAGE_PARAM_CHECK(p_fs->p_api, NRF_ERROR_INVALID_STATE); + NRF_FSTORAGE_PARAM_CHECK(len, NRF_ERROR_INVALID_LENGTH); /* Length must be a multiple of the program unit. */ - if ((len == 0) || ((len % p_fs->p_flash_info->program_unit) != 0)) - { - return NRF_ERROR_INVALID_LENGTH; - } + NRF_FSTORAGE_PARAM_CHECK(!(len % p_fs->p_flash_info->program_unit), NRF_ERROR_INVALID_LENGTH); /* Source and destination addresses must be word-aligned. */ - if ( !addr_is_aligned32(dest) - || !addr_is_aligned32((uint32_t)p_src) - || !addr_within_bounds(p_fs, dest, len)) - { - return NRF_ERROR_INVALID_ADDR; - } + NRF_FSTORAGE_PARAM_CHECK(addr_is_aligned32(dest), NRF_ERROR_INVALID_ADDR); + NRF_FSTORAGE_PARAM_CHECK(addr_is_aligned32((uint32_t)p_src), NRF_ERROR_INVALID_ADDR); + NRF_FSTORAGE_PARAM_CHECK(addr_is_within_bounds(p_fs, dest, len), NRF_ERROR_INVALID_ADDR); return (p_fs->p_api)->write(p_fs, dest, p_src, len, p_context); } @@ -165,27 +155,17 @@ ret_code_t nrf_fstorage_erase(nrf_fstorage_t const * p_fs, uint32_t len, void * p_context) { - if (p_fs == NULL) - { - return NRF_ERROR_NULL; - } - - if (p_fs->p_api == NULL) - { - return NRF_ERROR_INVALID_STATE; - } - - if (len == 0) - { - return NRF_ERROR_INVALID_LENGTH; - } + NRF_FSTORAGE_PARAM_CHECK(p_fs, NRF_ERROR_NULL); + NRF_FSTORAGE_PARAM_CHECK(p_fs->p_api, NRF_ERROR_INVALID_STATE); + NRF_FSTORAGE_PARAM_CHECK(len, NRF_ERROR_INVALID_LENGTH); /* Address must be aligned to a page boundary. */ - if ( ((page_addr & (p_fs->p_flash_info->erase_unit - 1)) != 0) - || !addr_within_bounds(p_fs, page_addr, (len * p_fs->p_flash_info->erase_unit))) - { - return NRF_ERROR_INVALID_ADDR; - } + NRF_FSTORAGE_PARAM_CHECK(addr_is_page_aligned(p_fs, page_addr), NRF_ERROR_INVALID_ADDR); + + NRF_FSTORAGE_PARAM_CHECK( + addr_is_within_bounds(p_fs, page_addr, (len * p_fs->p_flash_info->erase_unit)), + NRF_ERROR_INVALID_ADDR + ); return (p_fs->p_api)->erase(p_fs, page_addr, len, p_context); } @@ -193,7 +173,7 @@ ret_code_t nrf_fstorage_erase(nrf_fstorage_t const * p_fs, uint8_t const * nrf_fstorage_rmap(nrf_fstorage_t const * p_fs, uint32_t addr) { - if (p_fs == NULL) + if ((p_fs == NULL) || (p_fs->p_api == NULL)) { return NULL; } @@ -204,7 +184,7 @@ uint8_t const * nrf_fstorage_rmap(nrf_fstorage_t const * p_fs, uint32_t addr) uint8_t * nrf_fstorage_wmap(nrf_fstorage_t const * p_fs, uint32_t addr) { - if (p_fs == NULL) + if ((p_fs == NULL) || (p_fs->p_api == NULL)) { return NULL; } @@ -221,7 +201,7 @@ bool nrf_fstorage_is_busy(nrf_fstorage_t const * p_fs) { for (uint32_t i = 0; i < NRF_FSTORAGE_INSTANCE_CNT; i++) { - p_fs = NRF_FSTORAGE_INSTANCE_GET(i); /* cannot be NULL. */ + p_fs = NRF_FSTORAGE_INSTANCE_GET(i); /* cannot be NULL. */ if (p_fs->p_api != NULL) { /* p_api->is_busy() cannot be NULL. */ @@ -239,12 +219,12 @@ bool nrf_fstorage_is_busy(nrf_fstorage_t const * p_fs) } -static bool addr_within_bounds(nrf_fstorage_t const * p_fs, - uint32_t addr, - uint32_t len) +static bool addr_is_within_bounds(nrf_fstorage_t const * p_fs, + uint32_t addr, + uint32_t len) { - return ((addr >= p_fs->start_addr) && - (addr + len - 1 <= p_fs->end_addr)); + return ( (addr >= p_fs->start_addr) + && (addr + len - 1 <= p_fs->end_addr)); } @@ -254,4 +234,11 @@ static bool addr_is_aligned32(uint32_t addr) } +static bool addr_is_page_aligned(nrf_fstorage_t const * p_fs, + uint32_t addr) +{ + return (addr & (p_fs->p_flash_info->erase_unit - 1)) == 0; +} + + #endif // NRF_FSTORAGE_ENABLED diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/fstorage/nrf_fstorage.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/fstorage/nrf_fstorage.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/fstorage/nrf_fstorage.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/fstorage/nrf_fstorage.h index 118753f479..b67895010a 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/fstorage/nrf_fstorage.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/fstorage/nrf_fstorage.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -99,6 +99,7 @@ typedef struct nrf_fstorage_evt_id_t id; //!< The event ID. ret_code_t result; //!< Result of the operation. uint32_t addr; //!< Address at which the operation was performed. + void const * p_src; //!< Buffer written to flash. uint32_t len; //!< Length of the operation. void * p_param; //!< User-defined parameter passed to the event handler. } nrf_fstorage_evt_t; diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/queue/nrf_queue.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/queue/nrf_queue.c similarity index 79% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/queue/nrf_queue.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/queue/nrf_queue.c index 62b7a8ba5a..9afc16ca8a 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/queue/nrf_queue.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/queue/nrf_queue.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -42,6 +42,71 @@ #include "nrf_queue.h" #include "app_util_platform.h" +#if NRF_QUEUE_CONFIG_LOG_ENABLED + #define NRF_LOG_LEVEL NRF_QUEUE_CONFIG_LOG_LEVEL + #define NRF_LOG_INIT_FILTER_LEVEL NRF_QUEUE_CONFIG_LOG_INIT_FILTER_LEVEL + #define NRF_LOG_INFO_COLOR NRF_QUEUE_CONFIG_INFO_COLOR + #define NRF_LOG_DEBUG_COLOR NRF_QUEUE_CONFIG_DEBUG_COLOR +#else + #define NRF_LOG_LEVEL 0 +#endif // NRF_QUEUE_CONFIG_LOG_ENABLED +#include "nrf_log.h" + +NRF_SECTION_DEF(nrf_queue, nrf_queue_t); + +#if NRF_QUEUE_CLI_CMDS +#include "nrf_cli.h" + +static void nrf_queue_status(nrf_cli_t const * p_cli, size_t argc, char **argv) +{ + UNUSED_PARAMETER(argv); + + if (nrf_cli_help_requested(p_cli)) + { + nrf_cli_help_print(p_cli, NULL, 0); + return; + } + + if (argc > 1) + { + nrf_cli_fprintf(p_cli, NRF_CLI_ERROR, "Bad argument count"); + return; + } + + uint32_t num_of_instances = NRF_SECTION_ITEM_COUNT(nrf_queue, nrf_queue_t); + uint32_t i; + + for (i = 0; i < num_of_instances; i++) + { + const nrf_queue_t * p_instance = NRF_SECTION_ITEM_GET(nrf_queue, nrf_queue_t, i); + + uint32_t element_size = p_instance->element_size; + uint32_t size = p_instance->size; + uint32_t max_util = nrf_queue_max_utilization_get(p_instance); + uint32_t util = nrf_queue_utilization_get(p_instance); + const char * p_name = p_instance->p_name; + nrf_cli_fprintf(p_cli, NRF_CLI_NORMAL, + "%s\r\n\t- Element size:\t%d\r\n" + "\t- Usage:\t%u%% (%u out of %u elements)\r\n" + "\t- Maximum:\t%u%% (%u out of %u elements)\r\n" + "\t- Mode:\t\t%s\r\n\r\n", + p_name, element_size, + 100ul * util/size, util,size, + 100ul * max_util/size, max_util,size, + (p_instance->mode == NRF_QUEUE_MODE_OVERFLOW) ? "Overflow" : "No overflow"); + + } +} +// Register "queue" command and its subcommands in CLI. +NRF_CLI_CREATE_STATIC_SUBCMD_SET(nrf_queue_commands) +{ + NRF_CLI_CMD(status, NULL, "Print status of queue instances.", nrf_queue_status), + NRF_CLI_SUBCMD_SET_END +}; + +NRF_CLI_CMD_REGISTER(queue, &nrf_queue_commands, "Commands for BALLOC management", nrf_queue_status); +#endif //NRF_QUEUE_CLI_CMDS + /**@brief Get next element index. * * @param[in] p_queue Pointer to the queue instance. @@ -95,6 +160,7 @@ ret_code_t nrf_queue_push(nrf_queue_t const * p_queue, void const * p_element) if (is_full) { // Overwrite the oldest element. + NRF_LOG_INST_WARNING(p_queue->p_log, "Queue full. Overwriting oldest element."); p_queue->p_cb->front = nrf_queue_next_idx(p_queue, p_queue->p_cb->front); } @@ -138,6 +204,7 @@ ret_code_t nrf_queue_push(nrf_queue_t const * p_queue, void const * p_element) CRITICAL_REGION_EXIT(); + NRF_LOG_INST_DEBUG(p_queue->p_log, "pushed element 0x%08X, status:%d", p_element, status); return status; } @@ -195,7 +262,8 @@ ret_code_t nrf_queue_generic_pop(nrf_queue_t const * p_queue, } CRITICAL_REGION_EXIT(); - + NRF_LOG_INST_DEBUG(p_queue->p_log, "%s element 0x%08X, status:%d", + just_peek ? "peeked" : "popped", p_element, status); return status; } @@ -279,6 +347,8 @@ ret_code_t nrf_queue_write(nrf_queue_t const * p_queue, CRITICAL_REGION_EXIT(); + NRF_LOG_INST_DEBUG(p_queue->p_log, "Write %d elements (start address: 0x%08X), status:%d", + element_count, p_data, status); return status; } @@ -290,6 +360,8 @@ size_t nrf_queue_in(nrf_queue_t const * p_queue, ASSERT(p_queue != NULL); ASSERT(p_data != NULL); + size_t req_element_count = element_count; + if (element_count == 0) { return 0; @@ -311,6 +383,9 @@ size_t nrf_queue_in(nrf_queue_t const * p_queue, CRITICAL_REGION_EXIT(); + NRF_LOG_INST_DEBUG(p_queue->p_log, "Put in %d elements (start address: 0x%08X), requested :%d", + element_count, p_data, req_element_count); + return element_count; } @@ -382,6 +457,8 @@ ret_code_t nrf_queue_read(nrf_queue_t const * p_queue, CRITICAL_REGION_EXIT(); + NRF_LOG_INST_DEBUG(p_queue->p_log, "Read %d elements (start address: 0x%08X), status :%d", + element_count, p_data, status); return status; } @@ -392,6 +469,8 @@ size_t nrf_queue_out(nrf_queue_t const * p_queue, ASSERT(p_queue != NULL); ASSERT(p_data != NULL); + size_t req_element_count = element_count; + if (element_count == 0) { return 0; @@ -406,6 +485,8 @@ size_t nrf_queue_out(nrf_queue_t const * p_queue, CRITICAL_REGION_EXIT(); + NRF_LOG_INST_DEBUG(p_queue->p_log, "Out %d elements (start address: 0x%08X), requested :%d", + element_count, p_data, req_element_count); return element_count; } @@ -418,6 +499,8 @@ void nrf_queue_reset(nrf_queue_t const * p_queue) memset(p_queue->p_cb, 0, sizeof(nrf_queue_cb_t)); CRITICAL_REGION_EXIT(); + + NRF_LOG_INST_DEBUG(p_queue->p_log, "Reset"); } size_t nrf_queue_utilization_get(nrf_queue_t const * p_queue) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/queue/nrf_queue.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/queue/nrf_queue.h similarity index 90% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/queue/nrf_queue.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/queue/nrf_queue.h index c5884f85d5..1ba2a9272b 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/queue/nrf_queue.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/queue/nrf_queue.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -54,11 +54,17 @@ #include "sdk_errors.h" #include "app_util.h" #include "app_util_platform.h" +#include "nrf_log_instance.h" +#include "nrf_section.h" #ifdef __cplusplus extern "C" { #endif +/** @brief Name of the module used for logger messaging. + */ +#define NRF_QUEUE_LOG_NAME queue + /**@brief Queue control block. */ typedef struct { @@ -77,13 +83,22 @@ typedef enum /**@brief Instance of the queue. */ typedef struct { - nrf_queue_cb_t * p_cb; //!< Pointer to the instance control block. - void * p_buffer; //!< Pointer to the memory that is used as storage. - size_t size; //!< Size of the queue. - size_t element_size; //!< Size of one element. - nrf_queue_mode_t mode; //!< Mode of the queue. + nrf_queue_cb_t * p_cb; //!< Pointer to the instance control block. + void * p_buffer; //!< Pointer to the memory that is used as storage. + size_t size; //!< Size of the queue. + size_t element_size; //!< Size of one element. + nrf_queue_mode_t mode; //!< Mode of the queue. +#if NRF_QUEUE_CLI_CMDS + const char * p_name; //!< Pointer to string with queue name. +#endif + NRF_LOG_INSTANCE_PTR_DECLARE(p_log) //!< Pointer to instance of the logger object (Conditionally compiled). } nrf_queue_t; +#if NRF_QUEUE_CLI_CMDS +#define __NRF_QUEUE_ASSIGN_POOL_NAME(_name) .p_name = STRINGIFY(_name), +#else +#define __NRF_QUEUE_ASSIGN_POOL_NAME(_name) +#endif /**@brief Create a queue instance. * * @note This macro reserves memory for the given queue instance. @@ -93,16 +108,24 @@ typedef struct * @param[in] _size Size of the queue. * @param[in] _mode Mode of the queue. */ -#define NRF_QUEUE_DEF(_type, _name, _size, _mode) \ - static _type CONCAT_2(_name, _nrf_queue_buffer[(_size) + 1]); \ - static nrf_queue_cb_t CONCAT_2(_name, _nrf_queue_cb); \ - static const nrf_queue_t _name = \ - { \ - .p_cb = &CONCAT_2(_name, _nrf_queue_cb), \ - .p_buffer = CONCAT_2(_name,_nrf_queue_buffer), \ - .size = (_size), \ - .element_size = sizeof(_type), \ - .mode = _mode, \ +#define NRF_QUEUE_DEF(_type, _name, _size, _mode) \ + static _type CONCAT_2(_name, _nrf_queue_buffer[(_size) + 1]); \ + static nrf_queue_cb_t CONCAT_2(_name, _nrf_queue_cb); \ + NRF_LOG_INSTANCE_REGISTER(NRF_QUEUE_LOG_NAME, _name, \ + NRF_QUEUE_CONFIG_INFO_COLOR, \ + NRF_QUEUE_CONFIG_DEBUG_COLOR, \ + NRF_QUEUE_CONFIG_LOG_INIT_FILTER_LEVEL, \ + NRF_QUEUE_CONFIG_LOG_ENABLED ? \ + NRF_QUEUE_CONFIG_LOG_LEVEL : NRF_LOG_SEVERITY_NONE); \ + NRF_SECTION_ITEM_REGISTER(nrf_queue, const nrf_queue_t _name) = \ + { \ + .p_cb = &CONCAT_2(_name, _nrf_queue_cb), \ + .p_buffer = CONCAT_2(_name,_nrf_queue_buffer), \ + .size = (_size), \ + .element_size = sizeof(_type), \ + .mode = _mode, \ + __NRF_QUEUE_ASSIGN_POOL_NAME(_name) \ + NRF_LOG_INSTANCE_PTR_INIT(p_log, NRF_QUEUE_LOG_NAME, _name) \ } /**@brief Declare a queue interface. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/spi_mngr/nrf_spi_mngr.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/spi_mngr/nrf_spi_mngr.c new file mode 100644 index 0000000000..b66dfbb3d3 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/spi_mngr/nrf_spi_mngr.c @@ -0,0 +1,348 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#include "sdk_common.h" + +#if NRF_MODULE_ENABLED(NRF_SPI_MNGR) +#include "nrf_spi_mngr.h" +#include "nrf_assert.h" +#include "app_util_platform.h" + +typedef volatile struct +{ + bool transaction_in_progress; + uint8_t transaction_result; +} nrf_spi_mngr_cb_data_t; + +static ret_code_t start_transfer(nrf_spi_mngr_t const * p_nrf_spi_mngr) +{ + ASSERT(p_nrf_spi_mngr != NULL); + + // use a local variable to avoid using two volatile variables in one + // expression + uint8_t curr_transfer_idx = p_nrf_spi_mngr->p_nrf_spi_mngr_cb->current_transfer_idx; + nrf_spi_mngr_transfer_t const * p_transfer = + &p_nrf_spi_mngr->p_nrf_spi_mngr_cb->p_current_transaction->p_transfers[curr_transfer_idx]; + + return nrf_drv_spi_transfer(&p_nrf_spi_mngr->spi, + p_transfer->p_tx_data, p_transfer->tx_length, + p_transfer->p_rx_data, p_transfer->rx_length); +} + + +static void transaction_begin_signal(nrf_spi_mngr_t const * p_nrf_spi_mngr) +{ + ASSERT(p_nrf_spi_mngr != NULL); + + nrf_spi_mngr_transaction_t const * p_current_transaction = + p_nrf_spi_mngr->p_nrf_spi_mngr_cb->p_current_transaction; + + + if (p_current_transaction->begin_callback != NULL) + { + void * p_user_data = p_current_transaction->p_user_data; + p_current_transaction->begin_callback(p_user_data); + } +} + + +static void transaction_end_signal(nrf_spi_mngr_t const * p_nrf_spi_mngr, + ret_code_t result) +{ + ASSERT(p_nrf_spi_mngr != NULL); + + nrf_spi_mngr_transaction_t const * p_current_transaction = + p_nrf_spi_mngr->p_nrf_spi_mngr_cb->p_current_transaction; + + if (p_current_transaction->end_callback != NULL) + { + void * p_user_data = p_current_transaction->p_user_data; + p_current_transaction->end_callback(result, p_user_data); + } +} + + +static void spi_event_handler(nrf_drv_spi_evt_t const * p_event, + void * p_context); + + +// This function starts pending transaction if there is no current one or +// when 'switch_transaction' parameter is set to true. It is important to +// switch to new transaction without setting 'p_nrf_spi_mngr->p_curr_transaction' +// to NULL in between, since this pointer is used to check idle status - see +// 'nrf_spi_mngr_is_idle()'. +static void start_pending_transaction(nrf_spi_mngr_t const * p_nrf_spi_mngr, + bool switch_transaction) +{ + ASSERT(p_nrf_spi_mngr != NULL); + + while (1) + { + bool start_transaction = false; + nrf_spi_mngr_cb_t * p_cb = p_nrf_spi_mngr->p_nrf_spi_mngr_cb; + + CRITICAL_REGION_ENTER(); + if (switch_transaction || nrf_spi_mngr_is_idle(p_nrf_spi_mngr)) + { + if (nrf_queue_pop(p_nrf_spi_mngr->p_queue, + (void *)(&p_cb->p_current_transaction)) + == NRF_SUCCESS) + { + start_transaction = true; + } + else + { + p_cb->p_current_transaction = NULL; + } + } + CRITICAL_REGION_EXIT(); + + if (!start_transaction) + { + return; + } + + nrf_drv_spi_config_t const * p_instance_cfg; + if (p_cb->p_current_transaction->p_required_spi_cfg == NULL) + { + p_instance_cfg = &p_cb->default_configuration; + } + else + { + p_instance_cfg = p_cb->p_current_transaction->p_required_spi_cfg; + } + + ret_code_t result; + + if (memcmp(p_cb->p_current_configuration, p_instance_cfg, sizeof(*p_instance_cfg)) != 0) + { + nrf_drv_spi_uninit(&p_nrf_spi_mngr->spi); + result = nrf_drv_spi_init(&p_nrf_spi_mngr->spi, + p_instance_cfg, + spi_event_handler, + (void *)p_nrf_spi_mngr); + ASSERT(result == NRF_SUCCESS); + p_cb->p_current_configuration = p_instance_cfg; + } + + // Try to start first transfer for this new transaction. + p_cb->current_transfer_idx = 0; + + // Execute user code if available before starting transaction + transaction_begin_signal(p_nrf_spi_mngr); + result = start_transfer(p_nrf_spi_mngr); + + // If transaction started successfully there is nothing more to do here now. + if (result == NRF_SUCCESS) + { + return; + } + + // Transfer failed to start - notify user that this transaction + // cannot be started and try with next one (in next iteration of + // the loop). + transaction_end_signal(p_nrf_spi_mngr, result); + + switch_transaction = true; + } +} + + +// This function shall be called to handle SPI events. It shall be mainly used by SPI IRQ for +// finished tranfer. +static void spi_event_handler(nrf_drv_spi_evt_t const * p_event, + void * p_context) +{ + ASSERT(p_event != NULL); + ASSERT(p_context != NULL); + + ret_code_t result; + nrf_spi_mngr_cb_t * p_cb = ((nrf_spi_mngr_t const *)p_context)->p_nrf_spi_mngr_cb; + + // This callback should be called only during transaction. + ASSERT(p_cb->p_current_transaction != NULL); + + if (p_event->type == NRF_DRV_SPI_EVENT_DONE) + { + result = NRF_SUCCESS; + + // Transfer finished successfully. If there is another one to be + // performed in the current transaction, start it now. + // use a local variable to avoid using two volatile variables in one + // expression + uint8_t curr_transfer_idx = p_cb->current_transfer_idx; + ++curr_transfer_idx; + if (curr_transfer_idx < p_cb->p_current_transaction->number_of_transfers) + { + p_cb->current_transfer_idx = curr_transfer_idx; + + result = start_transfer(((nrf_spi_mngr_t const *)p_context)); + + if (result == NRF_SUCCESS) + { + // The current transaction is running and its next transfer + // has been successfully started. There is nothing more to do. + return; + } + // if the next transfer could not be started due to some error + // we finish the transaction with this error code as the result + } + } + else + { + result = NRF_ERROR_INTERNAL; + } + + // The current transaction has been completed or interrupted by some error. + // Notify the user and start next one (if there is any). + transaction_end_signal(((nrf_spi_mngr_t const *)p_context), result); + // we switch transactions here ('p_nrf_spi_mngr->p_current_transaction' is set + // to NULL only if there is nothing more to do) in order to not generate + // spurious idle status (even for a moment) + start_pending_transaction(((nrf_spi_mngr_t const *)p_context), true); +} + + +ret_code_t nrf_spi_mngr_init(nrf_spi_mngr_t const * p_nrf_spi_mngr, + nrf_drv_spi_config_t const * p_default_spi_config) +{ + ASSERT(p_nrf_spi_mngr != NULL); + ASSERT(p_nrf_spi_mngr->p_queue != NULL); + ASSERT(p_nrf_spi_mngr->p_queue->size > 0); + ASSERT(p_default_spi_config != NULL); + + ret_code_t err_code; + + err_code = nrf_drv_spi_init(&p_nrf_spi_mngr->spi, + p_default_spi_config, + spi_event_handler, + (void *)p_nrf_spi_mngr); + + if (err_code == NRF_SUCCESS) + { + nrf_spi_mngr_cb_t * p_cb = p_nrf_spi_mngr->p_nrf_spi_mngr_cb; + + p_cb->p_current_transaction = NULL; + p_cb->default_configuration = *p_default_spi_config; + p_cb->p_current_configuration = &p_cb->default_configuration; + } + + return err_code; +} + + +void nrf_spi_mngr_uninit(nrf_spi_mngr_t const * p_nrf_spi_mngr) +{ + ASSERT(p_nrf_spi_mngr != NULL); + + nrf_drv_spi_uninit(&p_nrf_spi_mngr->spi); + + p_nrf_spi_mngr->p_nrf_spi_mngr_cb->p_current_transaction = NULL; +} + + +ret_code_t nrf_spi_mngr_schedule(nrf_spi_mngr_t const * p_nrf_spi_mngr, + nrf_spi_mngr_transaction_t const * p_transaction) +{ + ASSERT(p_nrf_spi_mngr != NULL); + ASSERT(p_transaction != NULL); + ASSERT(p_transaction->p_transfers != NULL); + ASSERT(p_transaction->number_of_transfers != 0); + + ret_code_t result = nrf_queue_push(p_nrf_spi_mngr->p_queue, (void *)(&p_transaction)); + if (result == NRF_SUCCESS) + { + // New transaction has been successfully added to queue, + // so if we are currently idle it's time to start the job. + start_pending_transaction(p_nrf_spi_mngr, false); + } + + return result; +} + + +static void spi_internal_transaction_cb(ret_code_t result, void * p_user_data) +{ + nrf_spi_mngr_cb_data_t * p_cb_data = (nrf_spi_mngr_cb_data_t *)p_user_data; + + p_cb_data->transaction_result = result; + p_cb_data->transaction_in_progress = false; +} + +ret_code_t nrf_spi_mngr_perform(nrf_spi_mngr_t const * p_nrf_spi_mngr, + nrf_drv_spi_config_t const * p_config, + nrf_spi_mngr_transfer_t const * p_transfers, + uint8_t number_of_transfers, + void (* user_function)(void)) +{ + ASSERT(p_nrf_spi_mngr != NULL); + ASSERT(p_transfers != NULL); + ASSERT(number_of_transfers != 0); + + nrf_spi_mngr_cb_data_t cb_data = + { + .transaction_in_progress = true + }; + + nrf_spi_mngr_transaction_t internal_transaction = + { + .begin_callback = NULL, + .end_callback = spi_internal_transaction_cb, + .p_user_data = (void *)&cb_data, + .p_transfers = p_transfers, + .number_of_transfers = number_of_transfers, + .p_required_spi_cfg = p_config + }; + + ret_code_t result = nrf_spi_mngr_schedule(p_nrf_spi_mngr, &internal_transaction); + VERIFY_SUCCESS(result); + + while (cb_data.transaction_in_progress) + { + if (user_function) + { + user_function(); + } + } + + return cb_data.transaction_result; +} + +#endif //NRF_MODULE_ENABLED(NRF_SPI_MNGR) + diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/spi_mngr/nrf_spi_mngr.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/spi_mngr/nrf_spi_mngr.h new file mode 100644 index 0000000000..434c950359 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/spi_mngr/nrf_spi_mngr.h @@ -0,0 +1,310 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#ifndef NRF_SPI_MNGR_H__ +#define NRF_SPI_MNGR_H__ + +#include +#include "nrf_drv_spi.h" +#include "sdk_errors.h" +#include "nrf_queue.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*lint -save -e491*/ +#ifndef NRF_SPI_MNGR_BUFFERS_IN_RAM + #define NRF_SPI_MNGR_BUFFERS_IN_RAM defined(SPIM_PRESENT) +#endif + +#if NRF_SPI_MNGR_BUFFERS_IN_RAM + #define NRF_SPI_MNGR_BUFFER_LOC_IND +#else + #define NRF_SPI_MNGR_BUFFER_LOC_IND const +#endif +/*lint -restore*/ + +/** + * @defgroup nrf_spi_mngr SPI transaction manager + * @{ + * @ingroup app_common + * + * @brief Module for scheduling SPI transactions. + */ + + +/** + * @brief Macro for creating a simple SPI transfer. + * + * @param[in] _p_tx_data Pointer to the data to be sent. + * @param[in] _tx_length Number of bytes to send. + * @param[in] _p_rx_data Pointer to a buffer for received data. + * @param[in] _rx_length Number of bytes to receive. + */ +#define NRF_SPI_MNGR_TRANSFER(_p_tx_data, _tx_length, _p_rx_data, _rx_length) \ +{ \ + .p_tx_data = (uint8_t const *)_p_tx_data, \ + .tx_length = (uint8_t) _tx_length, \ + .p_rx_data = (uint8_t *) _p_rx_data, \ + .rx_length = (uint8_t) _rx_length, \ +} + + +/** + * @brief SPI transaction end callback prototype. + * + * @param result Result of operation (NRF_SUCCESS on success, + * otherwise a relevant error code). + * @param[in] p_user_data Pointer to user data defined in transaction + * descriptor. + */ +typedef void (* nrf_spi_mngr_callback_end_t)(ret_code_t result, void * p_user_data); + +/** + * @brief SPI transaction begin callback prototype. + * + * @param[in] p_user_data Pointer to user data defined in transaction + * descriptor. + */ +typedef void (* nrf_spi_mngr_callback_begin_t)(void * p_user_data); + + +/** + * @brief SPI transfer descriptor. + */ +typedef struct +{ + uint8_t const * p_tx_data; ///< Pointer to the data to be sent. + uint8_t tx_length; ///< Number of bytes to send. + uint8_t * p_rx_data; ///< Pointer to a buffer for received data. + uint8_t rx_length; ///< Number of bytes to receive. +} nrf_spi_mngr_transfer_t; + + +/** + * @brief SPI transaction descriptor. + */ +typedef struct +{ + nrf_spi_mngr_callback_begin_t begin_callback; + ///< User-specified function to be called before the transaction is started. + + nrf_spi_mngr_callback_end_t end_callback; + ///< User-specified function to be called after the transaction is finished. + + void * p_user_data; + ///< Pointer to user data to be passed to the end_callback. + + nrf_spi_mngr_transfer_t const * p_transfers; + ///< Pointer to the array of transfers that make up the transaction. + + uint8_t number_of_transfers; + ///< Number of transfers that make up the transaction. + + nrf_drv_spi_config_t const * p_required_spi_cfg; + ///< Pointer to instance hardware configuration. +} nrf_spi_mngr_transaction_t; + + +/** + * @brief SPI instance control block. + */ +typedef struct +{ + nrf_spi_mngr_transaction_t const * volatile p_current_transaction; + ///< Currently realized transaction. + + nrf_drv_spi_config_t default_configuration; + ///< Default hardware configuration. + + nrf_drv_spi_config_t const * p_current_configuration; + ///< Pointer to current hardware configuration. + + uint8_t volatile current_transfer_idx; + ///< Index of currently performed transfer (within current transaction). +} nrf_spi_mngr_cb_t; + + +/** + * @brief SPI transaction manager instance. + */ +typedef struct +{ + nrf_spi_mngr_cb_t * p_nrf_spi_mngr_cb; + ///< Control block of instance. + + nrf_queue_t const * p_queue; + ///< Transaction queue. + + nrf_drv_spi_t spi; + ///< Pointer to SPI master driver instance. +} nrf_spi_mngr_t; + + +/** + * @brief Macro for simplifying the defining of an SPI transaction manager + * instance. + * + * This macro allocates a static buffer for the transaction queue. + * Therefore, it should be used in only one place in the code for a given + * instance. + * + * @note The queue size is the maximum number of pending transactions + * not counting the one that is currently realized. This means that + * for an empty queue with size of for example 4 elements, it is + * possible to schedule up to 5 transactions. + * + * @param[in] _nrf_spi_mngr_name Name of instance to be created. + * @param[in] _queue_size Size of the transaction queue (maximum number + * of pending transactions). + * @param[in] _spi_idx Index of hardware SPI instance to be used. + */ +#define NRF_SPI_MNGR_DEF(_nrf_spi_mngr_name, _queue_size, _spi_idx) \ + NRF_QUEUE_DEF(nrf_spi_mngr_transaction_t const *, \ + _nrf_spi_mngr_name##_queue, \ + (_queue_size), \ + NRF_QUEUE_MODE_NO_OVERFLOW); \ + static nrf_spi_mngr_cb_t CONCAT_2(_nrf_spi_mngr_name, _cb); \ + static const nrf_spi_mngr_t _nrf_spi_mngr_name = \ + { \ + .p_nrf_spi_mngr_cb = &CONCAT_2(_nrf_spi_mngr_name, _cb), \ + .p_queue = &_nrf_spi_mngr_name##_queue, \ + .spi = NRF_DRV_SPI_INSTANCE(_spi_idx) \ + } + + + /** + * @brief Function for initializing an SPI transaction manager instance. + * + * @param[in] p_nrf_spi_mngr Pointer to the instance to be initialized. + * @param[in] p_default_spi_config Pointer to the SPI driver configuration. This configuration + * will be used whenever the scheduled transaction will have + * p_spi_config set to NULL value. + * + * @return Values returned by the @ref nrf_drv_spi_init function. + */ +ret_code_t nrf_spi_mngr_init(nrf_spi_mngr_t const * p_nrf_spi_mngr, + nrf_drv_spi_config_t const * p_default_spi_config); + + +/** + * @brief Function for uninitializing an SPI transaction manager instance. + * + * @param[in] p_nrf_spi_mngr Pointer to the instance to be uninitialized. + */ +void nrf_spi_mngr_uninit(nrf_spi_mngr_t const * p_nrf_spi_mngr); + + +/** + * @brief Function for scheduling an SPI transaction. + * + * The transaction is enqueued and started as soon as the SPI bus is + * available, thus when all previously scheduled transactions have been + * finished (possibly immediately). + * + * @note If @ref nrf_spi_mngr_transaction_t::p_required_spi_cfg + * is set to a non-NULL value the module will compare it with + * @ref nrf_spi_mngr_cb_t::p_current_configuration and reinitialize hardware + * SPI instance with new parameters if any differences are found. + * If @ref nrf_spi_mngr_transaction_t::p_required_spi_cfg is set to NULL then + * it will treat it as it would be set to @ref nrf_spi_mngr_cb_t::default_configuration. + * + * @param[in] p_nrf_spi_mngr Pointer to the SPI transaction manager instance. + * @param[in] p_transaction Pointer to the descriptor of the transaction to be + * scheduled. + * + * @retval NRF_SUCCESS If the transaction has been successfully scheduled. + * @retval NRF_ERROR_NO_MEM If the queue is full (Only if queue in + * @ref NRF_QUEUE_MODE_NO_OVERFLOW). + */ +ret_code_t nrf_spi_mngr_schedule(nrf_spi_mngr_t const * p_nrf_spi_mngr, + nrf_spi_mngr_transaction_t const * p_transaction); + + +/** + * @brief Function for scheduling a transaction and waiting until it is finished. + * + * This function schedules a transaction that consists of one or more transfers + * and waits until it is finished. + * + * @param[in] p_nrf_spi_mngr Pointer to the SPI transaction manager instance. + * @param[in] p_config Required SPI configuration. + * @param[in] p_transfers Pointer to an array of transfers to be performed. + * @param number_of_transfers Number of transfers to be performed. + * @param user_function User-specified function to be called while + * waiting. NULL if such functionality + * is not needed. + * + * @retval NRF_SUCCESS If the transfers have been successfully realized. + * @retval NRF_ERROR_BUSY If some transfers are already being performed. + * @retval - Other error codes mean that the transaction has failed + * with the error reported by @ref nrf_drv_spi_transfer(). + */ +ret_code_t nrf_spi_mngr_perform(nrf_spi_mngr_t const * p_nrf_spi_mngr, + nrf_drv_spi_config_t const * p_config, + nrf_spi_mngr_transfer_t const * p_transfers, + uint8_t number_of_transfers, + void (* user_function)(void)); + + +/** + * @brief Function for getting the current state of an SPI transaction manager + * instance. + * + * @param[in] p_nrf_spi_mngr Pointer to the SPI transaction manager instance. + * + * @retval true If all scheduled transactions have been finished. + * @retval false Otherwise. + */ +__STATIC_INLINE bool nrf_spi_mngr_is_idle(nrf_spi_mngr_t const * p_nrf_spi_mngr) +{ + return (p_nrf_spi_mngr->p_nrf_spi_mngr_cb->p_current_transaction == NULL); +} + +/** + *@} + **/ +//typedef int p_current_transaction; + +#ifdef __cplusplus +} +#endif + +#endif // NRF_SPI_MNGR_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/strerror/nrf_strerror.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/strerror/nrf_strerror.c similarity index 87% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/strerror/nrf_strerror.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/strerror/nrf_strerror.c index 09e3fb0f20..81a514dce7 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/strerror/nrf_strerror.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/strerror/nrf_strerror.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -24,7 +24,7 @@ * * 5. Any software provided in binary form under this license must not be reverse * engineered, decompiled, modified and/or disassembled. - * + * * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -41,6 +41,9 @@ #include "sdk_common.h" #if NRF_MODULE_ENABLED(NRF_STRERROR) #include "nrf_strerror.h" +#include "sdk_errors.h" + +// #define NRF_ERROR_MODULE_NOT_INITIALZED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0000) /** * @brief Macro for adding an entity to the description array. @@ -93,9 +96,15 @@ static nrf_strerror_desc_t const nrf_strerror_array[] = NRF_STRERROR_ENTITY(NRF_ERROR_FORBIDDEN), NRF_STRERROR_ENTITY(NRF_ERROR_INVALID_ADDR), NRF_STRERROR_ENTITY(NRF_ERROR_BUSY), +#ifdef NRF_ERROR_CONN_COUNT + NRF_STRERROR_ENTITY(NRF_ERROR_CONN_COUNT), +#endif +#ifdef NRF_ERROR_RESOURCES + NRF_STRERROR_ENTITY(NRF_ERROR_RESOURCES), +#endif /* SDK Common errors */ - NRF_STRERROR_ENTITY(NRF_ERROR_MODULE_NOT_INITIALZED), + NRF_STRERROR_ENTITY(NRF_ERROR_MODULE_NOT_INITIALIZED), NRF_STRERROR_ENTITY(NRF_ERROR_MUTEX_INIT_FAILED), NRF_STRERROR_ENTITY(NRF_ERROR_MUTEX_LOCK_FAILED), NRF_STRERROR_ENTITY(NRF_ERROR_MUTEX_UNLOCK_FAILED), @@ -104,11 +113,18 @@ static nrf_strerror_desc_t const nrf_strerror_array[] = NRF_STRERROR_ENTITY(NRF_ERROR_STORAGE_FULL), NRF_STRERROR_ENTITY(NRF_ERROR_API_NOT_IMPLEMENTED), NRF_STRERROR_ENTITY(NRF_ERROR_FEATURE_NOT_ENABLED), + NRF_STRERROR_ENTITY(NRF_ERROR_IO_PENDING), /* TWI error codes */ NRF_STRERROR_ENTITY(NRF_ERROR_DRV_TWI_ERR_OVERRUN), NRF_STRERROR_ENTITY(NRF_ERROR_DRV_TWI_ERR_ANACK), - NRF_STRERROR_ENTITY(NRF_ERROR_DRV_TWI_ERR_DNACK) + NRF_STRERROR_ENTITY(NRF_ERROR_DRV_TWI_ERR_DNACK), + + /* IPSP error codes */ + NRF_STRERROR_ENTITY(NRF_ERROR_BLE_IPSP_RX_PKT_TRUNCATED), + NRF_STRERROR_ENTITY(NRF_ERROR_BLE_IPSP_CHANNEL_ALREADY_EXISTS), + NRF_STRERROR_ENTITY(NRF_ERROR_BLE_IPSP_LINK_DISCONNECTED), + NRF_STRERROR_ENTITY(NRF_ERROR_BLE_IPSP_PEER_REJECTED) }; diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/strerror/nrf_strerror.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/strerror/nrf_strerror.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/strerror/nrf_strerror.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/strerror/nrf_strerror.h index f0de77d844..1a6542bcbf 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/strerror/nrf_strerror.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/strerror/nrf_strerror.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/twi_mngr/nrf_twi_mngr.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/twi_mngr/nrf_twi_mngr.c new file mode 100644 index 0000000000..56a14e5fc0 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/twi_mngr/nrf_twi_mngr.c @@ -0,0 +1,366 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#include "sdk_common.h" +#if NRF_MODULE_ENABLED(NRF_TWI_MNGR) +#include "nrf_twi_mngr.h" +#include "nrf_assert.h" +#include "app_util_platform.h" + +typedef volatile struct +{ + bool transaction_in_progress; + uint8_t transaction_result; +} nrf_twi_mngr_cb_data_t; + + +static ret_code_t start_transfer(nrf_twi_mngr_t const * p_nrf_twi_mngr) +{ + ASSERT(p_nrf_twi_mngr != NULL); + + // Pointer for cleaner code. + nrf_twi_mngr_cb_t * p_cb = p_nrf_twi_mngr->p_nrf_twi_mngr_cb; + + // [use a local variable to avoid using two volatile variables in one + // expression] + uint8_t current_transfer_idx = p_cb->current_transfer_idx; + nrf_twi_mngr_transfer_t const * p_transfer = + &p_cb->p_current_transaction->p_transfers[current_transfer_idx]; + uint8_t address = NRF_TWI_MNGR_OP_ADDRESS(p_transfer->operation); + + nrf_drv_twi_xfer_desc_t xfer_desc; + uint32_t flags; + + xfer_desc.address = address; + xfer_desc.p_primary_buf = p_transfer->p_data; + xfer_desc.primary_length = p_transfer->length; + + /* If it is possible try to bind two transfers together. They can be combined if: + * - there is no stop condition after current transfer. + * - current transfer is TX. + * - there is at least one more transfer in the transaction. + * - address of next transfer is the same as current transfer. + */ + if ((p_transfer->flags & NRF_TWI_MNGR_NO_STOP) && + !NRF_TWI_MNGR_IS_READ_OP(p_transfer->operation) && + // Adding 1 to check if next transfer is from the same transaction. + ((current_transfer_idx + 1) < p_cb->p_current_transaction->number_of_transfers) && + (NRF_TWI_MNGR_OP_ADDRESS(p_transfer->operation) == + NRF_TWI_MNGR_OP_ADDRESS(p_cb->p_current_transaction-> + p_transfers[current_transfer_idx + 1].operation))) + { + nrf_twi_mngr_transfer_t const * p_second_transfer = + &p_cb->p_current_transaction->p_transfers[current_transfer_idx + 1]; + xfer_desc.p_secondary_buf = p_second_transfer->p_data; + xfer_desc.secondary_length = p_second_transfer->length; + xfer_desc.type = NRF_TWI_MNGR_IS_READ_OP(p_second_transfer->operation) ? + NRF_DRV_TWI_XFER_TXRX : NRF_DRV_TWI_XFER_TXTX; + flags = (p_second_transfer->flags & NRF_TWI_MNGR_NO_STOP) ? NRF_DRV_TWI_FLAG_TX_NO_STOP : 0; + p_cb->current_transfer_idx++; + } + else + { + xfer_desc.type = NRF_TWI_MNGR_IS_READ_OP(p_transfer->operation) ? NRF_DRV_TWI_XFER_RX : + NRF_DRV_TWI_XFER_TX; + xfer_desc.p_secondary_buf = NULL; + xfer_desc.secondary_length = 0; + flags = (p_transfer->flags & NRF_TWI_MNGR_NO_STOP) ? NRF_DRV_TWI_FLAG_TX_NO_STOP : 0; + } + + return nrf_drv_twi_xfer(&p_nrf_twi_mngr->twi, &xfer_desc, flags); +} + + +static void transaction_end_signal(nrf_twi_mngr_t const * p_nrf_twi_mngr, + ret_code_t result) +{ + ASSERT(p_nrf_twi_mngr != NULL); + + if (p_nrf_twi_mngr->p_nrf_twi_mngr_cb->p_current_transaction->callback) + { + // [use a local variable to avoid using two volatile variables in one + // expression] + void * p_user_data = p_nrf_twi_mngr->p_nrf_twi_mngr_cb->p_current_transaction->p_user_data; + p_nrf_twi_mngr->p_nrf_twi_mngr_cb->p_current_transaction->callback(result, p_user_data); + } +} + +static void twi_event_handler(nrf_drv_twi_evt_t const * p_event, + void * p_context); + +// This function starts pending transaction if there is no current one or +// when 'switch_transaction' parameter is set to true. It is important to +// switch to new transaction without setting 'p_nrf_twi_mngr->p_current_transaction' +// to NULL in between, since this pointer is used to check idle status - see +// 'nrf_twi_mngr_is_idle()'. +static void start_pending_transaction(nrf_twi_mngr_t const * p_nrf_twi_mngr, + bool switch_transaction) +{ + ASSERT(p_nrf_twi_mngr != NULL); + + // Pointer for cleaner code. + nrf_twi_mngr_cb_t * p_cb = p_nrf_twi_mngr->p_nrf_twi_mngr_cb; + + for (;;) + { + bool start_transaction = false; + + CRITICAL_REGION_ENTER(); + if (switch_transaction || nrf_twi_mngr_is_idle(p_nrf_twi_mngr)) + { + if (nrf_queue_pop(p_nrf_twi_mngr->p_queue, (void *)(&p_cb->p_current_transaction)) + == NRF_SUCCESS) + { + start_transaction = true; + } + else + { + p_cb->p_current_transaction = NULL; + } + } + CRITICAL_REGION_EXIT(); + + if (!start_transaction) + { + return; + } + else + { + ret_code_t result; + + nrf_drv_twi_config_t const * p_instance_cfg = + p_cb->p_current_transaction->p_required_twi_cfg == NULL ? + &p_cb->default_configuration : + p_cb->p_current_transaction->p_required_twi_cfg; + + if (memcmp(p_cb->p_current_configuration, p_instance_cfg, sizeof(*p_instance_cfg)) != 0) + { + ret_code_t err_code; + nrf_drv_twi_uninit(&p_nrf_twi_mngr->twi); + err_code = nrf_drv_twi_init(&p_nrf_twi_mngr->twi, + p_instance_cfg, + twi_event_handler, + (void *)p_nrf_twi_mngr); + ASSERT(err_code == NRF_SUCCESS); + nrf_drv_twi_enable(&p_nrf_twi_mngr->twi); + UNUSED_VARIABLE(err_code); + p_cb->p_current_configuration = p_instance_cfg; + } + + // Try to start first transfer for this new transaction. + p_cb->current_transfer_idx = 0; + result = start_transfer(p_nrf_twi_mngr); + + // If transaction started successfully there is nothing more to do here now. + if (result == NRF_SUCCESS) + { + return; + } + + // Transfer failed to start - notify user that this transaction + // cannot be started and try with next one (in next iteration of + // the loop). + transaction_end_signal(p_nrf_twi_mngr, result); + + switch_transaction = true; + } + } +} + + +static void twi_event_handler(nrf_drv_twi_evt_t const * p_event, + void * p_context) +{ + ASSERT(p_event != NULL); + + nrf_twi_mngr_t * p_nrf_twi_mngr = (nrf_twi_mngr_t *)p_context; + ret_code_t result; + + // This callback should be called only during transaction. + ASSERT(p_nrf_twi_mngr->p_nrf_twi_mngr_cb->p_current_transaction != NULL); + + if (p_event->type == NRF_DRV_TWI_EVT_DONE) + { + result = NRF_SUCCESS; + + // Transfer finished successfully. If there is another one to be + // performed in the current transaction, start it now. + // [use a local variable to avoid using two volatile variables in one + // expression] + uint8_t current_transfer_idx = p_nrf_twi_mngr->p_nrf_twi_mngr_cb->current_transfer_idx; + ++current_transfer_idx; + if (current_transfer_idx < + p_nrf_twi_mngr->p_nrf_twi_mngr_cb->p_current_transaction->number_of_transfers) + { + p_nrf_twi_mngr->p_nrf_twi_mngr_cb->current_transfer_idx = current_transfer_idx; + + result = start_transfer(p_nrf_twi_mngr); + + if (result == NRF_SUCCESS) + { + // The current transaction goes on and we've successfully + // started its next transfer -> there is nothing more to do. + return; + } + + // [if the next transfer could not be started due to some error + // we finish the transaction with this error code as the result] + } + } + else + { + result = NRF_ERROR_INTERNAL; + } + + // The current transaction has been completed or interrupted by some error. + // Notify the user and start next one (if there is any). + transaction_end_signal(p_nrf_twi_mngr, result); + // [we switch transactions here ('p_nrf_twi_mngr->p_current_transaction' is set + // to NULL only if there is nothing more to do) in order to not generate + // spurious idle status (even for a moment)] + start_pending_transaction(p_nrf_twi_mngr, true); +} + + +ret_code_t nrf_twi_mngr_init(nrf_twi_mngr_t const * p_nrf_twi_mngr, + nrf_drv_twi_config_t const * p_default_twi_config) +{ + ASSERT(p_nrf_twi_mngr != NULL); + ASSERT(p_nrf_twi_mngr->p_queue != NULL); + ASSERT(p_nrf_twi_mngr->p_queue->size > 0); + ASSERT(p_default_twi_config != NULL); + + ret_code_t err_code; + + err_code = nrf_drv_twi_init(&p_nrf_twi_mngr->twi, + p_default_twi_config, + twi_event_handler, + (void *)p_nrf_twi_mngr); + VERIFY_SUCCESS(err_code); + + nrf_drv_twi_enable(&p_nrf_twi_mngr->twi); + + p_nrf_twi_mngr->p_nrf_twi_mngr_cb->p_current_transaction = NULL; + p_nrf_twi_mngr->p_nrf_twi_mngr_cb->default_configuration = *p_default_twi_config; + p_nrf_twi_mngr->p_nrf_twi_mngr_cb->p_current_configuration = + &p_nrf_twi_mngr->p_nrf_twi_mngr_cb->default_configuration; + + return NRF_SUCCESS; +} + + +void nrf_twi_mngr_uninit(nrf_twi_mngr_t const * p_nrf_twi_mngr) +{ + ASSERT(p_nrf_twi_mngr != NULL); + + nrf_drv_twi_uninit(&p_nrf_twi_mngr->twi); + + p_nrf_twi_mngr->p_nrf_twi_mngr_cb->p_current_transaction = NULL; +} + + +ret_code_t nrf_twi_mngr_schedule(nrf_twi_mngr_t const * p_nrf_twi_mngr, + nrf_twi_mngr_transaction_t const * p_transaction) +{ + ASSERT(p_nrf_twi_mngr != NULL); + ASSERT(p_transaction != NULL); + ASSERT(p_transaction->p_transfers != NULL); + ASSERT(p_transaction->number_of_transfers != 0); + + ret_code_t result = NRF_SUCCESS; + + result = nrf_queue_push(p_nrf_twi_mngr->p_queue, (void *)(&p_transaction)); + if (result == NRF_SUCCESS) + { + // New transaction has been successfully added to queue, + // so if we are currently idle it's time to start the job. + start_pending_transaction(p_nrf_twi_mngr, false); + } + + return result; +} + + +static void internal_transaction_cb(ret_code_t result, void * p_user_data) +{ + nrf_twi_mngr_cb_data_t *p_cb_data = (nrf_twi_mngr_cb_data_t *)p_user_data; + + p_cb_data->transaction_result = result; + p_cb_data->transaction_in_progress = false; +} + + +ret_code_t nrf_twi_mngr_perform(nrf_twi_mngr_t const * p_nrf_twi_mngr, + nrf_drv_twi_config_t const * p_config, + nrf_twi_mngr_transfer_t const * p_transfers, + uint8_t number_of_transfers, + void (* user_function)(void)) +{ + ASSERT(p_nrf_twi_mngr != NULL); + ASSERT(p_transfers != NULL); + ASSERT(number_of_transfers != 0); + + nrf_twi_mngr_cb_data_t cb_data = + { + .transaction_in_progress = true + }; + + nrf_twi_mngr_transaction_t internal_transaction = + { + .callback = internal_transaction_cb, + .p_user_data = (void *)&cb_data, + .p_transfers = p_transfers, + .number_of_transfers = number_of_transfers, + .p_required_twi_cfg = p_config + }; + + ret_code_t result = nrf_twi_mngr_schedule(p_nrf_twi_mngr, &internal_transaction); + VERIFY_SUCCESS(result); + + while (cb_data.transaction_in_progress) + { + if (user_function) + { + user_function(); + } + } + + return cb_data.transaction_result; +} +#endif //NRF_MODULE_ENABLED(NRF_TWI_MNGR) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/twi_mngr/nrf_twi_mngr.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/twi_mngr/nrf_twi_mngr.h new file mode 100644 index 0000000000..a63803a7f7 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/twi_mngr/nrf_twi_mngr.h @@ -0,0 +1,342 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#ifndef NRF_TWI_MNGR_H__ +#define NRF_TWI_MNGR_H__ + +#include +#include "nrf_drv_twi.h" +#include "sdk_errors.h" +#include "nrf_queue.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrf_twi_mngr TWI transaction manager + * @{ + * @ingroup app_common + * + * @brief Module for scheduling TWI transactions. + */ + +//If TWIM is present buffers can only be in RAM +/*lint -save -e491*/ + +/** + * @brief Macro checking if buffers should be stored in RAM. + */ +#ifndef NRF_TWI_MNGR_BUFFERS_IN_RAM + #define NRF_TWI_MNGR_BUFFERS_IN_RAM defined(TWIM_PRESENT) +#endif + +/** + * @brief Modifier used in array declaration for TWI Manager. + * + * @note For TWI peripheral array can be const, for TWIM array has to be located in RAM. + */ +#if NRF_TWI_MNGR_BUFFERS_IN_RAM + #define NRF_TWI_MNGR_BUFFER_LOC_IND +#else + #define NRF_TWI_MNGR_BUFFER_LOC_IND const +#endif +/*lint -restore*/ + +/** + * @brief Flag indicating that a given transfer should not be ended + * with a stop condition. + * + * Use this flag when a stop condition is undesirable between two transfers, + * for example, when the first transfer is a write that sets an address in the slave + * device and the second one is a read that fetches certain data using this + * address. In this case, the second transfer should follow directly after the + * first transfer, with a repeated start condition instead of a stop and then + * a new start condition. + */ +#define NRF_TWI_MNGR_NO_STOP 0x01 + +/** + * @brief Macro for creating a write transfer. + * + * @param[in] address Slave address. + * @param[in] p_data Pointer to the data to be sent. + * @param[in] length Number of bytes to transfer. + * @param[in] flags Transfer flags (see @ref NRF_TWI_MNGR_NO_STOP). + */ +#define NRF_TWI_MNGR_WRITE(address, p_data, length, flags) \ + NRF_TWI_MNGR_TRANSFER(NRF_TWI_MNGR_WRITE_OP(address), p_data, length, flags) + +/** + * @brief Macro for creating a read transfer. + * + * @param address Slave address. + * @param[in] p_data Pointer to the buffer where received data should be placed. + * @param length Number of bytes to transfer. + * @param flags Transfer flags (see @ref NRF_TWI_MNGR_NO_STOP). + */ +#define NRF_TWI_MNGR_READ(address, p_data, length, flags) \ + NRF_TWI_MNGR_TRANSFER(NRF_TWI_MNGR_READ_OP(address), p_data, length, flags) + +/** + * @brief Helper macro, should not be used directly. + */ +#define NRF_TWI_MNGR_TRANSFER(_operation, _p_data, _length, _flags) \ +{ \ + .p_data = (uint8_t *)(_p_data), \ + .length = _length, \ + .operation = _operation, \ + .flags = _flags \ +} +/** + * @brief Helper macro, should not be used directly. + */ +#define NRF_TWI_MNGR_WRITE_OP(address) (((address) << 1) | 0) +/** + * @brief Helper macro, should not be used directly. + */ +#define NRF_TWI_MNGR_READ_OP(address) (((address) << 1) | 1) +/** + * @brief Helper macro, should not be used directly. + */ +#define NRF_TWI_MNGR_IS_READ_OP(operation) ((operation) & 1) +/** + * @brief Helper macro, should not be used directly. + */ +#define NRF_TWI_MNGR_OP_ADDRESS(operation) ((operation) >> 1) + +/** + * @brief TWI transaction callback prototype. + * + * @param result Result of operation (NRF_SUCCESS on success, + * otherwise a relevant error code). + * @param[in] p_user_data Pointer to user data defined in transaction + * descriptor. + */ +typedef void (* nrf_twi_mngr_callback_t)(ret_code_t result, void * p_user_data); + +/** + * @brief TWI transfer descriptor. + */ +typedef struct { + uint8_t * p_data; ///< Pointer to the buffer holding the data. + uint8_t length; ///< Number of bytes to transfer. + uint8_t operation; ///< Device address combined with transfer direction. + uint8_t flags; ///< Transfer flags (see @ref NRF_TWI_MNGR_NO_STOP). +} nrf_twi_mngr_transfer_t; + +/** + * @brief TWI transaction descriptor. + */ +typedef struct { + nrf_twi_mngr_callback_t callback; + ///< User-specified function to be called after the transaction is finished. + + void * p_user_data; + ///< Pointer to user data to be passed to the callback. + + nrf_twi_mngr_transfer_t const * p_transfers; + ///< Pointer to the array of transfers that make up the transaction. + + uint8_t number_of_transfers; + ///< Number of transfers that make up the transaction. + + nrf_drv_twi_config_t const * p_required_twi_cfg; + ///< Pointer to instance hardware configuration. +} nrf_twi_mngr_transaction_t; + +/** + * @brief TWI instance control block. + */ +typedef struct { + nrf_twi_mngr_transaction_t const * volatile p_current_transaction; + ///< Currently realized transaction. + + nrf_drv_twi_config_t default_configuration; + ///< Default hardware configuration. + + nrf_drv_twi_config_t const * p_current_configuration; + ///< Pointer to current hardware configuration. + + uint8_t volatile current_transfer_idx; + ///< Index of currently performed transfer (within current transaction). +} nrf_twi_mngr_cb_t; + +/** + * @brief TWI transaction manager instance. + */ +typedef struct { + nrf_twi_mngr_cb_t * p_nrf_twi_mngr_cb; + ///< Control block of instance. + + nrf_queue_t const * p_queue; + ///< Transaction queue. + + nrf_drv_twi_t twi; + ///< Pointer to TWI master driver instance. +} nrf_twi_mngr_t; + +/** + * @brief Macro that simplifies defining a TWI transaction manager + * instance. + * + * This macro allocates a static buffer for the transaction queue. + * Therefore, it should be used in only one place in the code for a given + * instance. + * + * @note The queue size is the maximum number of pending transactions + * not counting the one that is currently realized. This means that + * for an empty queue with size of, for example, 4 elements, it is + * possible to schedule up to 5 transactions. + * + * @param[in] _nrf_twi_mngr_name Name of instance to be created. + * @param[in] _queue_size Size of the transaction queue (maximum number + * of pending transactions). + * @param[in] _twi_idx Index of hardware TWI instance to be used. + */ +#define NRF_TWI_MNGR_DEF(_nrf_twi_mngr_name, _queue_size, _twi_idx) \ + NRF_QUEUE_DEF(nrf_twi_mngr_transaction_t const *, \ + _nrf_twi_mngr_name##_queue, \ + (_queue_size), \ + NRF_QUEUE_MODE_NO_OVERFLOW); \ + static nrf_twi_mngr_cb_t CONCAT_2(_nrf_twi_mngr_name, _cb); \ + static const nrf_twi_mngr_t _nrf_twi_mngr_name = \ + { \ + .p_nrf_twi_mngr_cb = &CONCAT_2(_nrf_twi_mngr_name, _cb), \ + .p_queue = &_nrf_twi_mngr_name##_queue, \ + .twi = NRF_DRV_TWI_INSTANCE(_twi_idx) \ + } + +/** + * @brief Function for initializing a TWI transaction manager instance. + * + * @param[in] p_nrf_twi_mngr Pointer to the instance to be initialized. + * @param[in] p_default_twi_config Pointer to the TWI master driver configuration. This configuration + * will be used whenever the scheduled transaction will have + * p_twi_configuration set to NULL value. + * + * @return Values returned by the @ref nrf_drv_twi_init function. + */ +ret_code_t nrf_twi_mngr_init(nrf_twi_mngr_t const * p_nrf_twi_mngr, + nrf_drv_twi_config_t const * p_default_twi_config); + +/** + * @brief Function for uninitializing a TWI transaction manager instance. + * + * @param[in] p_nrf_twi_mngr Pointer to the instance to be uninitialized. + */ +void nrf_twi_mngr_uninit(nrf_twi_mngr_t const * p_nrf_twi_mngr); + +/** + * @brief Function for scheduling a TWI transaction. + * + * The transaction is enqueued and started as soon as the TWI bus is + * available, thus when all previously scheduled transactions have been + * finished (possibly immediately). + * + * @note If @ref nrf_twi_mngr_transaction_t::p_required_twi_cfg + * is set to a non-NULL value the module will compare it with + * @ref nrf_twi_mngr_cb_t::p_current_configuration and reinitialize hardware + * TWI instance with new parameters if any differences are found. + * If @ref nrf_twi_mngr_transaction_t::p_required_twi_cfg is set to NULL then + * it will treat it as it would be set to @ref nrf_twi_mngr_cb_t::default_configuration. + * + * @param[in] p_nrf_twi_mngr Pointer to the TWI transaction manager instance. + * @param[in] p_transaction Pointer to the descriptor of the transaction to be + * scheduled. + * + * @retval NRF_SUCCESS If the transaction has been successfully scheduled. + * @retval NRF_ERROR_NO_MEM If the queue is full (Only if queue in + * @ref NRF_QUEUE_MODE_NO_OVERFLOW). + */ +ret_code_t nrf_twi_mngr_schedule(nrf_twi_mngr_t const * p_nrf_twi_mngr, + nrf_twi_mngr_transaction_t const * p_transaction); + +/** + * @brief Function for scheduling a transaction and waiting until it is finished. + * + * This function schedules a transaction that consists of one or more transfers + * and waits until it is finished. + * + * @param[in] p_nrf_twi_mngr Pointer to the TWI transaction manager instance. + * @param[in] p_config Required TWI configuration. + * @param[in] p_transfers Pointer to an array of transfers to be performed. + * @param number_of_transfers Number of transfers to be performed. + * @param user_function User-specified function to be called while + * waiting. NULL if such functionality + * is not needed. + * + * @retval NRF_SUCCESS If the transfers have been successfully realized. + * @retval NRF_ERROR_BUSY If some transfers are already being performed. + * @retval - Other error codes mean that the transaction has ended + * with the error that is specified in the error code. + */ +ret_code_t nrf_twi_mngr_perform(nrf_twi_mngr_t const * p_nrf_twi_mngr, + nrf_drv_twi_config_t const * p_config, + nrf_twi_mngr_transfer_t const * p_transfers, + uint8_t number_of_transfers, + void (* user_function)(void)); + +/** + * @brief Function for getting the current state of a TWI transaction manager + * instance. + * + * @param[in] p_nrf_twi_mngr Pointer to the TWI transaction manager instance. + * + * @retval true If all scheduled transactions have been finished. + * @retval false Otherwise. + */ +__STATIC_INLINE bool nrf_twi_mngr_is_idle(nrf_twi_mngr_t const * p_nrf_twi_mngr); + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION +__STATIC_INLINE bool nrf_twi_mngr_is_idle(nrf_twi_mngr_t const * p_nrf_twi_mngr) +{ + return (p_nrf_twi_mngr->p_nrf_twi_mngr_cb->p_current_transaction == NULL); +} +#endif //SUPPRESS_INLINE_IMPLEMENTATION +/** + *@} + **/ + + +#ifdef __cplusplus +} +#endif + +#endif // NRF_TWI_MNGR_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_error.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error.c similarity index 90% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_error.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error.c index e50e57d223..88b38e513e 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_error.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -51,6 +51,7 @@ #include "app_error.h" #include "nordic_common.h" #include "sdk_errors.h" + /**@brief Function for error handling, which is called when an error has occurred. * * @warning This handler is an example only and does not fit a final product. You need to analyze @@ -60,22 +61,6 @@ * @param[in] line_num Line number where the handler is called. * @param[in] p_file_name Pointer to the file name. */ - -/*lint -save -e14 */ -void app_error_handler(ret_code_t error_code, uint32_t line_num, const uint8_t * p_file_name) -{ - error_info_t error_info = - { - .line_num = line_num, - .p_file_name = p_file_name, - .err_code = error_code, - }; - app_error_fault_handler(NRF_FAULT_ID_SDK_ERROR, 0, (uint32_t)(&error_info)); - - UNUSED_VARIABLE(error_info); -} - -/*lint -save -e14 */ void app_error_handler_bare(ret_code_t error_code) { error_info_t error_info = @@ -90,7 +75,6 @@ void app_error_handler_bare(ret_code_t error_code) UNUSED_VARIABLE(error_info); } - void app_error_save_and_stop(uint32_t id, uint32_t pc, uint32_t info) { /* static error variables - in order to prevent removal by optimizers */ @@ -139,5 +123,3 @@ void app_error_save_and_stop(uint32_t id, uint32_t pc, uint32_t info) __enable_irq(); } - -/*lint -restore */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_error.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error.h similarity index 79% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_error.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error.h index c8c3758660..b831f7b723 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_error.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2013 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -67,19 +67,19 @@ extern "C" { #endif -#define NRF_FAULT_ID_SDK_RANGE_START 0x00004000 /**< The start of the range of error IDs defined in the SDK. */ +#define NRF_FAULT_ID_SDK_RANGE_START (0x00004000) /**< The start of the range of error IDs defined in the SDK. */ /**@defgroup APP_ERROR_FAULT_IDS Fault ID types * @{ */ -#define NRF_FAULT_ID_SDK_ERROR NRF_FAULT_ID_SDK_RANGE_START + 1 /**< An error stemming from a call to @ref APP_ERROR_CHECK or @ref APP_ERROR_CHECK_BOOL. The info parameter is a pointer to an @ref error_info_t variable. */ -#define NRF_FAULT_ID_SDK_ASSERT NRF_FAULT_ID_SDK_RANGE_START + 2 /**< An error stemming from a call to ASSERT (nrf_assert.h). The info parameter is a pointer to an @ref assert_info_t variable. */ +#define NRF_FAULT_ID_SDK_ERROR (NRF_FAULT_ID_SDK_RANGE_START + 1) /**< An error stemming from a call to @ref APP_ERROR_CHECK or @ref APP_ERROR_CHECK_BOOL. The info parameter is a pointer to an @ref error_info_t variable. */ +#define NRF_FAULT_ID_SDK_ASSERT (NRF_FAULT_ID_SDK_RANGE_START + 2) /**< An error stemming from a call to ASSERT (nrf_assert.h). The info parameter is a pointer to an @ref assert_info_t variable. */ /**@} */ /**@brief Structure containing info about an error of the type @ref NRF_FAULT_ID_SDK_ERROR. */ typedef struct { - uint16_t line_num; /**< The line number where the error occurred. */ + uint32_t line_num; /**< The line number where the error occurred. */ uint8_t const * p_file_name; /**< The file in which the error occurred. */ uint32_t err_code; /**< The error code representing the error that occurred. */ } error_info_t; @@ -92,6 +92,16 @@ typedef struct uint8_t const * p_file_name; /**< The file in which the error occurred. */ } assert_info_t; +/**@brief Defines required by app_error_handler assembler intructions. + */ +#define APP_ERROR_ERROR_INFO_OFFSET_LINE_NUM (offsetof(error_info_t, line_num)) +#define APP_ERROR_ERROR_INFO_OFFSET_P_FILE_NAME (offsetof(error_info_t, p_file_name)) +#define APP_ERROR_ERROR_INFO_OFFSET_ERR_CODE (offsetof(error_info_t, err_code)) +#define APP_ERROR_ERROR_INFO_SIZE (sizeof(error_info_t)) +#define APP_ERROR_ERROR_INFO_SIZE_ALIGNED_8BYTE \ + ALIGN_NUM(APP_ERROR_ERROR_INFO_SIZE, sizeof(uint64_t)) + + /**@brief Function for error handling, which is called when an error has occurred. * * @param[in] error_code Error code supplied to the handler. @@ -116,6 +126,16 @@ void app_error_handler_bare(ret_code_t error_code); */ void app_error_save_and_stop(uint32_t id, uint32_t pc, uint32_t info); +/**@brief Function for logging details of error and flushing logs. + * + * @param[in] id Fault identifier. See @ref NRF_FAULT_IDS. + * @param[in] pc The program counter of the instruction that triggered the fault, or 0 if + * unavailable. + * @param[in] info Optional additional information regarding the fault. Refer to each fault + * identifier for details. + */ +void app_error_log_handle(uint32_t id, uint32_t pc, uint32_t info); + /**@brief Macro for calling error handler function. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error_handler_gcc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error_handler_gcc.c new file mode 100644 index 0000000000..5391672c80 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error_handler_gcc.c @@ -0,0 +1,105 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#include "sdk_common.h" +#include "compiler_abstraction.h" +#include "app_error.h" + +// only compile this if we are using GCC +#if defined (__GNUC__) && !defined (__ARMCC_VERSION) + +#if defined (__CORTEX_M) && (__CORTEX_M == 0x04) +void app_error_handler(ret_code_t error_code, uint32_t line_num, const uint8_t * p_file_name) __attribute__(( naked )); + +void app_error_handler(ret_code_t error_code, uint32_t line_num, const uint8_t * p_file_name) +{ + __ASM volatile( + + "push {lr} \n" + + /* reserve space on stack for error_info_t struct - preserve 8byte stack aligment */ + "sub sp, sp, %0 \n" + + /* prepare error_info_t struct */ + "str r0, [sp, %1] \n" + "str r1, [sp, %3] \n" + "str r2, [sp, %2] \n" + + /* prepare arguments and call function: app_error_fault_handler */ + "ldr r0, =%4 \n" + "mov r1, lr \n" + "mov r2, sp \n" + "bl %5 \n" + + /* release stack */ + "add sp, sp, %0 \n" + + "pop {pc} \n" + ".ltorg \n" + + : /* Outputs */ + : /* Inputs */ + "I" (APP_ERROR_ERROR_INFO_SIZE_ALIGNED_8BYTE), + "I" (APP_ERROR_ERROR_INFO_OFFSET_ERR_CODE), + "I" (APP_ERROR_ERROR_INFO_OFFSET_P_FILE_NAME), + "I" (APP_ERROR_ERROR_INFO_OFFSET_LINE_NUM), + "X" (NRF_FAULT_ID_SDK_ERROR), + "X" (app_error_fault_handler) + : /* Clobbers */ + "r0", "r1", "r2" + ); +} +#elif defined(__CORTEX_M) && (__CORTEX_M == 0x00) +/* NRF51 implementation is currently not supporting PC readout */ +void app_error_handler(ret_code_t error_code, uint32_t line_num, const uint8_t * p_file_name) +{ + error_info_t error_info = { + .line_num = line_num, + .p_file_name = p_file_name, + .err_code = error_code, + }; + app_error_fault_handler(NRF_FAULT_ID_SDK_ERROR, 0, (uint32_t)(&error_info)); + + UNUSED_VARIABLE(error_info); +} +#else +#error Architecture not supported +#endif + +#endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error_handler_iar.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error_handler_iar.c new file mode 100644 index 0000000000..cfdd5bff10 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error_handler_iar.c @@ -0,0 +1,105 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#include "sdk_common.h" +#include "compiler_abstraction.h" +#include "app_error.h" + +// Build this only if compiling with IAR! +#if defined ( __ICCARM__ ) + +#if defined (__CORTEX_M) && (__CORTEX_M == 0x04) +void app_error_handler(ret_code_t error_code, uint32_t line_num, const uint8_t * p_file_name) +{ + __ASM volatile( + "push {lr} \n" + /* reserve space on stack for error_info_t struct */ + "sub sp, sp, %0 \n" + + /* prepare error_info_t struct */ + "str r0, [sp, %1] \n" + "str r1, [sp, %3] \n" + "str r2, [sp, %2] \n" + + /* prepare arguments and call function: app_error_fault_handler */ + "ldr.n r0, 1f \n" + "mov r1, LR \n" + "mov r2, sp \n" + + /* call app_error_fault_handler */ + "bl %c5 \n" + + /* release stack */ + "add sp, sp, %0 \n" + "pop {pc} \n" + + "DATA \n" + "1: \n" + " DC32 %c4 \n" + + : /* Outputs */ + : /* Inputs */ + "i" (APP_ERROR_ERROR_INFO_SIZE_ALIGNED_8BYTE), + "i" (APP_ERROR_ERROR_INFO_OFFSET_ERR_CODE), + "i" (APP_ERROR_ERROR_INFO_OFFSET_P_FILE_NAME), + "i" (APP_ERROR_ERROR_INFO_OFFSET_LINE_NUM), + "i" (NRF_FAULT_ID_SDK_ERROR), + "i" (app_error_fault_handler) + : /* CLobbers */ + "r0", "r1", "r2" + ); +} +#elif defined(__CORTEX_M) && (__CORTEX_M == 0x00) +/* NRF51 implementation is currently not supporting PC readout */ +void app_error_handler(ret_code_t error_code, uint32_t line_num, const uint8_t * p_file_name) +{ + error_info_t error_info = { + .line_num = line_num, + .p_file_name = p_file_name, + .err_code = error_code, + }; + app_error_fault_handler(NRF_FAULT_ID_SDK_ERROR, 0, (uint32_t)(&error_info)); + + UNUSED_VARIABLE(error_info); +} +#else +#error Architecture not supported +#endif +#endif + diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/sdio/sdio.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error_handler_keil.c similarity index 55% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/sdio/sdio.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error_handler_keil.c index e52e7e9872..760465ecdf 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/sdio/sdio.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error_handler_keil.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2009 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,69 +37,60 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -#ifndef SDIO_H -#define SDIO_H -/*lint ++flb "Enter library region" */ -#include -#include +#include "sdk_common.h" +#include "compiler_abstraction.h" +#include "app_error.h" -#ifdef __cplusplus -extern "C" { -#endif +// make sure we are using armcc! +#if defined (__CC_ARM) -/** @file -* @brief 2-wire serial interface driver (compatible with ADNS2080 mouse sensor driver) -* -* -* @defgroup nrf_drivers_sdio SDIO driver -* @{ -* @ingroup nrf_drivers -* @brief 2-wire serial interface driver. -*/ +#if defined (__CORTEX_M) && (__CORTEX_M == 0x04) +__ASM void app_error_handler(ret_code_t error_code, uint32_t line_num, const uint8_t * p_file_name) +{ + PRESERVE8 {TRUE} + THUMB -/** - * @brief Function for initializing 2-wire serial interface and trying to handle stuck slaves. - * - */ -void sdio_init(void); + push {lr} -/** - * @brief Function for reading a byte over 2-wire serial interface. - * - * Developer needs to implement this function in a way that suits the hardware. - * @param address Register address to read from - * @return Byte read - */ -uint8_t sdio_read_byte(uint8_t address); + /* reserve space on stack for error_info_t struct - preserve 8byte stack aligment */ + sub sp, sp, #__cpp(APP_ERROR_ERROR_INFO_SIZE_ALIGNED_8BYTE) -/** - * @brief Function for reading several bytes over 2-wire serial interface using burst mode. - * - * Developer needs to implement this function in a way that suits the hardware. - * @param target_buffer Buffer location to store read bytes to - * @param target_buffer_size Bytes allocated for target_buffer - */ -void sdio_read_burst(uint8_t *target_buffer, uint8_t target_buffer_size); + /* prepare error_info_t struct */ + str r0, [sp, #__cpp(APP_ERROR_ERROR_INFO_OFFSET_ERR_CODE)] + str r1, [sp, #__cpp(APP_ERROR_ERROR_INFO_OFFSET_LINE_NUM)] + str r2, [sp, #__cpp(APP_ERROR_ERROR_INFO_OFFSET_P_FILE_NAME)] -/** - * @brief Function for writing a byte over 2-wire serial interface. - * - * Developer needs to implement this function in a way that suits the hardware. - * @param address Register address to write to - * @param data_byte Data byte to write - */ -void sdio_write_byte(uint8_t address, uint8_t data_byte); + /* prepare arguments and call function: app_error_fault_handler */ + mov r0, #__cpp(NRF_FAULT_ID_SDK_ERROR) + mov r1, lr + mov r2, sp -/** - *@} - **/ + /* call function */ + bl __cpp(app_error_fault_handler) -/*lint --flb "Leave library region" */ + /* release stack */ + add sp, sp, #__cpp(APP_ERROR_ERROR_INFO_SIZE_ALIGNED_8BYTE) -#ifdef __cplusplus + pop {pc} } +#elif defined(__CORTEX_M) && (__CORTEX_M == 0x00) +/* NRF51 implementation is currently not supporting PC readout */ +void app_error_handler(ret_code_t error_code, uint32_t line_num, const uint8_t * p_file_name) +{ + error_info_t error_info = { + .line_num = line_num, + .p_file_name = p_file_name, + .err_code = error_code, + }; + app_error_fault_handler(NRF_FAULT_ID_SDK_ERROR, 0, (uint32_t)(&error_info)); + + UNUSED_VARIABLE(error_info); +} +#else +#error Architecture not supported #endif #endif + diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_error_weak.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error_weak.c similarity index 93% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_error_weak.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error_weak.c index f00b36f716..0e0130ac50 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_error_weak.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error_weak.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -48,13 +48,13 @@ #endif /*lint -save -e14 */ - /** * Function is implemented as weak so that it can be overwritten by custom application error handler * when needed. */ __WEAK void app_error_fault_handler(uint32_t id, uint32_t pc, uint32_t info) { + __disable_irq(); NRF_LOG_FINAL_FLUSH(); #ifndef DEBUG @@ -81,11 +81,13 @@ __WEAK void app_error_fault_handler(uint32_t id, uint32_t pc, uint32_t info) case NRF_FAULT_ID_SDK_ERROR: { error_info_t * p_info = (error_info_t *)info; - NRF_LOG_ERROR("ERROR %u [%s] at %s:%u", + NRF_LOG_ERROR("ERROR %u [%s] at %s:%u\r\nPC at: 0x%08x", p_info->err_code, nrf_strerror_get(p_info->err_code), p_info->p_file_name, - p_info->line_num); + p_info->line_num, + pc); + NRF_LOG_ERROR("End of error report"); break; } default: @@ -104,6 +106,4 @@ __WEAK void app_error_fault_handler(uint32_t id, uint32_t pc, uint32_t info) app_error_save_and_stop(id, pc, info); #endif // DEBUG } - /*lint -restore */ - diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_error_weak.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error_weak.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_error_weak.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error_weak.h index fa49dc3f01..fd1a5021b3 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_error_weak.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_error_weak.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -40,6 +40,8 @@ #ifndef APP_ERROR_WEAK_H__ #define APP_ERROR_WEAK_H__ +#include + #ifdef __cplusplus extern "C" { #endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_util.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_util.h similarity index 91% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_util.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_util.h index a8ffba29fe..e046c0d24e 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_util.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_util.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -59,25 +59,75 @@ #ifdef __cplusplus extern "C" { #endif +/** + * @cond (NODOX) + */ +/*lint -save -e27 -e10 -e19 */ +#if defined (__LINT__) +#define STACK_BASE 0x1F000 // Arbitrary value. +#define STACK_TOP 0x20000 // Arbitrary value. -//lint -save -e27 -e10 -e19 -#if defined ( __CC_ARM ) && !defined (__LINT__) +#elif defined ( __CC_ARM ) extern char STACK$$Base; extern char STACK$$Length; #define STACK_BASE &STACK$$Base #define STACK_TOP ((void*)((uint32_t)STACK_BASE + (uint32_t)&STACK$$Length)) + #elif defined ( __ICCARM__ ) extern char CSTACK$$Base; extern char CSTACK$$Length; #define STACK_BASE &CSTACK$$Base #define STACK_TOP ((void*)((uint32_t)STACK_BASE + (uint32_t)&CSTACK$$Length)) + #elif defined ( __GNUC__ ) extern uint32_t __StackTop; extern uint32_t __StackLimit; #define STACK_BASE &__StackLimit #define STACK_TOP &__StackTop #endif -//lint -restore + +/* These macros are valid only when absolute placement is used for the application + * image. The macros are not compile time symbols. They cannot be used as a + * constant expression, for example, inside a static assert or linker script + * at-placement. */ +#if defined (__LINT__) +#define CODE_START (0) // Arbitrary value. +#define CODE_END (0x1000) // Arbitrary value. +#define CODE_SIZE (0x1000) // Arbitrary value. + +#elif defined ( __CC_ARM ) +extern char Load$$LR$$LR_IROM1$$Base; +extern char Load$$LR$$LR_IROM1$$Length; +extern uint32_t Load$$LR$$LR_IROM1$$Limit[]; +#define CODE_START ((uint32_t)&Load$$LR$$LR_IROM1$$Base) +#define CODE_END ((uint32_t)&Load$$LR$$LR_IROM1$$Limit) +#define CODE_SIZE ((uint32_t)&Load$$LR$$LR_IROM1$$Length) + +#elif defined ( __ICCARM__ ) +extern void * __vector_table; +extern char RO_END$$Base; +#define CODE_START ((uint32_t)&__vector_table) +#define CODE_END ((uint32_t)&RO_END$$Base) +#define CODE_SIZE (CODE_END - CODE_START) + +#elif defined(__SES_ARM) +extern uint32_t * _vectors; +extern uint32_t __FLASH_segment_used_end__; +#define CODE_START ((uint32_t)&_vectors) +#define CODE_END ((uint32_t)&__FLASH_segment_used_end__) +#define CODE_SIZE (CODE_END - CODE_START) + +#elif defined ( __GNUC__ ) +extern uint32_t __isr_vector; +extern uint32_t __etext; +#define CODE_START ((uint32_t)&__isr_vector) +#define CODE_END ((uint32_t)&__etext) +#define CODE_SIZE (CODE_END - CODE_START) +#endif +/** @} + * @endcond + */ +/* lint -restore */ enum { @@ -86,6 +136,44 @@ enum UNIT_10_MS = 10000 /**< Number of microseconds in 10 milliseconds. */ }; +/** + * @brief Counts number of bits required for the given value + * + * The macro technically searches for the highest bit set. + * For value 0 it returns 0. + * + * @param val Value to be processed + * + * @return Number of bits required for the given value + */ +//lint -emacro(572,VBITS) +#define VBITS(val) VBITS_32(val) + +/** + * @def VBITS_1 + * @brief Internal macro used by @ref VBITS */ +/** + * @def VBITS_2 + * @brief Internal macro used by @ref VBITS */ +/** + * @def VBITS_4 + * @brief Internal macro used by @ref VBITS */ +/** + * @def VBITS_8 + * @brief Internal macro used by @ref VBITS */ +/** + * @def VBITS_16 + * @brief Internal macro used by @ref VBITS */ +/** + * @def VBITS_32 + * @brief Internal macro used by @ref VBITS */ +#define VBITS_1( v) ((((v) & (0x0001U << 0)) != 0) ? 1U : 0U) +#define VBITS_2( v) ((((v) & (0x0001U << 1)) != 0) ? VBITS_1 ((v) >> 1) + 1 : VBITS_1 (v)) +#define VBITS_4( v) ((((v) & (0x0003U << 2)) != 0) ? VBITS_2 ((v) >> 2) + 2 : VBITS_2 (v)) +#define VBITS_8( v) ((((v) & (0x000fU << 4)) != 0) ? VBITS_4 ((v) >> 4) + 4 : VBITS_4 (v)) +#define VBITS_16(v) ((((v) & (0x00ffU << 8)) != 0) ? VBITS_8 ((v) >> 8) + 8 : VBITS_8 (v)) +#define VBITS_32(v) ((((v) & (0xffffU << 16)) != 0) ? VBITS_16((v) >> 16) + 16 : VBITS_16(v)) + /*Segger embedded studio originally has offsetof macro which cannot be used in macros (like STATIC_ASSERT). This redefinition is to allow using that. */ @@ -114,14 +202,16 @@ enum #ifndef __LINT__ -#ifdef __GNUC__ -#define STATIC_ASSERT_SIMPLE(EXPR) _Static_assert(EXPR, "unspecified message") -#define STATIC_ASSERT_MSG(EXPR, MSG) _Static_assert(EXPR, MSG) -#endif - +// need an if/elif as _CC_ARM wil define __GNUC__ #ifdef __CC_ARM #define STATIC_ASSERT_SIMPLE(EXPR) extern char (*_do_assert(void)) [sizeof(char[1 - 2*!(EXPR)])] #define STATIC_ASSERT_MSG(EXPR, MSG) extern char (*_do_assert(void)) [sizeof(char[1 - 2*!(EXPR)])] +//#endif + +//#ifdef __CC_ARM +#elif __GNUC__ +#define STATIC_ASSERT_SIMPLE(EXPR) _Static_assert(EXPR, "unspecified message") +#define STATIC_ASSERT_MSG(EXPR, MSG) _Static_assert(EXPR, MSG) #endif #ifdef __ICCARM__ @@ -297,7 +387,7 @@ typedef struct * * @return The aligned (increased) @p number. */ -#define ALIGN_NUM(alignment, number) ((number - 1) + alignment - ((number - 1) % alignment)) +#define ALIGN_NUM(alignment, number) (((number) - 1) + (alignment) - (((number) - 1) % (alignment))) /**@brief Macro for getting first of 2 parameters. * @@ -861,6 +951,23 @@ static __INLINE uint8_t uint32_encode(uint32_t value, uint8_t * p_encoded_data) return sizeof(uint32_t); } +/**@brief Function for encoding a uint40 value. + * + * @param[in] value Value to be encoded. + * @param[out] p_encoded_data Buffer where the encoded data is to be written. + * + * @return Number of bytes written. + */ +static __INLINE uint8_t uint40_encode(uint64_t value, uint8_t * p_encoded_data) +{ + p_encoded_data[0] = (uint8_t) ((value & 0x00000000FF) >> 0); + p_encoded_data[1] = (uint8_t) ((value & 0x000000FF00) >> 8); + p_encoded_data[2] = (uint8_t) ((value & 0x0000FF0000) >> 16); + p_encoded_data[3] = (uint8_t) ((value & 0x00FF000000) >> 24); + p_encoded_data[4] = (uint8_t) ((value & 0xFF00000000) >> 32); + return 5; +} + /**@brief Function for encoding a uint48 value. * * @param[in] value Value to be encoded. @@ -960,6 +1067,8 @@ static __INLINE uint8_t uint16_big_encode(uint16_t value, uint8_t * p_encoded_da return sizeof(uint16_t); } +/*lint -esym(526, __rev) */ +/*lint -esym(628, __rev) */ /**@brief Function for encoding a uint32 value in big-endian format. * * @param[in] value Value to be encoded. @@ -973,6 +1082,21 @@ static __INLINE uint8_t uint32_big_encode(uint32_t value, uint8_t * p_encoded_da return sizeof(uint32_t); } +/**@brief Function for decoding a uint40 value. + * + * @param[in] p_encoded_data Buffer where the encoded data is stored. + * + * @return Decoded value. (uint64_t) + */ +static __INLINE uint64_t uint40_decode(const uint8_t * p_encoded_data) +{ + return ( (((uint64_t)((uint8_t *)p_encoded_data)[0]) << 0) | + (((uint64_t)((uint8_t *)p_encoded_data)[1]) << 8) | + (((uint64_t)((uint8_t *)p_encoded_data)[2]) << 16) | + (((uint64_t)((uint8_t *)p_encoded_data)[3]) << 24) | + (((uint64_t)((uint8_t *)p_encoded_data)[4]) << 32 )); +} + /**@brief Function for decoding a uint48 value. * * @param[in] p_encoded_data Buffer where the encoded data is stored. @@ -1052,6 +1176,7 @@ static __INLINE bool is_word_aligned(void const* p) return (((uintptr_t)p & 0x03) == 0); } +/*lint -e{568, 685} */ /** * @brief Function for checking if provided address is located in stack space. * @@ -1072,7 +1197,6 @@ static __INLINE bool is_address_from_stack(void * ptr) } } - #ifdef __cplusplus } #endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_util_bds.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_util_bds.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_util_bds.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_util_bds.h index e88069322f..24ae12fc99 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_util_bds.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_util_bds.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_util_platform.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_util_platform.c similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_util_platform.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_util_platform.c index 740d42233b..71690d0fdc 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_util_platform.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_util_platform.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_util_platform.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_util_platform.h similarity index 86% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_util_platform.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_util_platform.h index 141c3394bc..ceb892d375 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/app_util_platform.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/app_util_platform.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -122,7 +122,7 @@ typedef enum /**@brief Macro for setting a breakpoint. */ #if defined(__GNUC__) -#define NRF_BREAKPOINT __builtin_trap() +#define NRF_BREAKPOINT __asm__("BKPT 0"); #else #define NRF_BREAKPOINT __BKPT(0) #endif @@ -146,15 +146,27 @@ typedef enum #endif // __CORTEX_M == 0x04 #if defined ( __CC_ARM ) -#define PACKED(TYPE) __packed TYPE #define PACKED_STRUCT PACKED(struct) #elif defined ( __GNUC__ ) -#define PACKED __attribute__((packed)) #define PACKED_STRUCT struct PACKED #elif defined (__ICCARM__) #define PACKED_STRUCT __packed struct #endif +#if defined ( __CC_ARM ) +#define PRAGMA_OPTIMIZATION_FORCE_START _Pragma ("push") \ + _Pragma ("O3") +#define PRAGMA_OPTIMIZATION_FORCE_END _Pragma ("pop") +#elif defined ( __GNUC__ ) +#define PRAGMA_OPTIMIZATION_FORCE_START _Pragma("GCC push_options") \ + _Pragma ("GCC optimize (\"Os\")") +#define PRAGMA_OPTIMIZATION_FORCE_END _Pragma ("GCC pop_options") +#elif defined (__ICCARM__) +#define PRAGMA_OPTIMIZATION_FORCE_START _Pragma ("optimize=high z") +#define PRAGMA_OPTIMIZATION_FORCE_END +#endif + + void app_util_critical_region_enter (uint8_t *p_nested); void app_util_critical_region_exit (uint8_t nested); @@ -197,12 +209,14 @@ void app_util_critical_region_exit (uint8_t nested); /**@brief Macro to enable anonymous unions from a certain point in the code. */ #if defined(__CC_ARM) - #define ANON_UNIONS_ENABLE _Pragma("push") \ - _Pragma("anon_unions") + #define ANON_UNIONS_ENABLE _Pragma("push") \ + _Pragma("anon_unions") \ + struct semicolon_swallower #elif defined(__ICCARM__) - #define ANON_UNIONS_ENABLE _Pragma("language=extended") + #define ANON_UNIONS_ENABLE _Pragma("language=extended") \ + struct semicolon_swallower #else - #define ANON_UNIONS_ENABLE + #define ANON_UNIONS_ENABLE struct semicolon_swallower // No action will be taken. // For GCC anonymous unions are enabled by default. #endif @@ -211,12 +225,13 @@ void app_util_critical_region_exit (uint8_t nested); * @note Call only after first calling @ref ANON_UNIONS_ENABLE. */ #if defined(__CC_ARM) - #define ANON_UNIONS_DISABLE _Pragma("pop") + #define ANON_UNIONS_DISABLE _Pragma("pop") \ + struct semicolon_swallower #elif defined(__ICCARM__) - #define ANON_UNIONS_DISABLE + #define ANON_UNIONS_DISABLE struct semicolon_swallower // for IAR leave anonymous unions enabled #else - #define ANON_UNIONS_DISABLE + #define ANON_UNIONS_DISABLE struct semicolon_swallower // No action will be taken. // For GCC anonymous unions are enabled by default. #endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/nordic_common.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/nordic_common.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/nordic_common.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/nordic_common.h index e7f63b1290..1492acffb1 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/nordic_common.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/nordic_common.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2008 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2008 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -73,9 +73,13 @@ extern "C" { * without evaluating its value. */ //lint -emacro(491,NRF_MODULE_ENABLED) // Suppers warning 491 "non-standard use of 'defined' preprocessor operator" +#ifdef NRF_MODULE_ENABLE_ALL +#warning "Do not use NRF_MODULE_ENABLE_ALL for real builds." +#define NRF_MODULE_ENABLED(module) 1 +#else #define NRF_MODULE_ENABLED(module) \ ((defined(module ## _ENABLED) && (module ## _ENABLED)) ? 1 : 0) - +#endif /** The upper 8 bits of a 32 bit value */ //lint -emacro(572,MSB_32) // Suppress warning 572 "Excessive shift value" #define MSB_32(a) (((a) & 0xFF000000) >> 24) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/nrf_assert.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/nrf_assert.c similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/nrf_assert.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/nrf_assert.c index 6255ba920c..6678e22e18 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/nrf_assert.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/nrf_assert.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2006 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2006 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/nrf_assert.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/nrf_assert.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/nrf_assert.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/nrf_assert.h index 2ec647c87b..f078910409 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/nrf_assert.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/nrf_assert.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2006 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2006 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -46,7 +46,6 @@ #include #include "nrf.h" -#include "app_error.h" #ifdef __cplusplus extern "C" { diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/nrf_bitmask.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/nrf_bitmask.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/nrf_bitmask.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/nrf_bitmask.h index 72f531f1a7..be2eac52b3 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/nrf_bitmask.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/nrf_bitmask.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2006 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2006 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_peripherals.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_alloca.h similarity index 57% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_peripherals.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_alloca.h index a1cdd3b4d8..2266dd3ba2 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_peripherals.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_alloca.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,37 +37,49 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -#ifndef NRF_PERIPHERALS_H -#define NRF_PERIPHERALS_H +/** @file sdk_alloca.h + * + * @brief Defines alloca() function. + * + * @details This file defines alloca() function. This can be done directly or by including system + * header files. Not all platforms support alloca(). In this case no error will be shown, but + * SDK_ALLOCA_DEFINED will be set to 0. + */ -/*lint ++flb "Enter library region */ +#ifndef SDK_ALLOCA_H__ +#define SDK_ALLOCA_H__ -#ifdef NRF51422 -#include "nrf51422_peripherals.h" -#endif -#ifdef NRF51802 -#include "nrf51802_peripherals.h" -#endif - -#ifdef NRF51822 -#include "nrf51822_peripherals.h" -#endif - -#ifdef NRF52810_XXAA -#include "nrf52810_peripherals.h" -#endif - -#ifdef NRF52832_XXAA -#include "nrf52832_peripherals.h" -#endif - -#ifdef NRF52840_XXAA -#include "nrf52840_peripherals.h" +#if defined(__SDK_DOXYGEN__) + /** @brief Set to one it alloca() function is available on this platform and it is correctly defined + * by this header file. + */ + #define SDK_ALLOCA_DEFINED 1 +#elif defined(__GNUC__) + #if defined(__SES_ARM) + // SES does not have definition of alloca(), but it have working GCC's __builtin_alloca(). + #if !defined(alloca) + #define alloca(size) __builtin_alloca((size)) + #endif + #else + // alloca() can be defined in on some platforms, but if not then try standard header file. + #include + #if !defined(alloca) + #include + #endif + #endif + #define SDK_ALLOCA_DEFINED 1 +#elif defined(__IAR_SYSTEMS_ICC__) + // IAR does not support alloca() function. + #define SDK_ALLOCA_DEFINED 0 +#else + // All other supported compilers have alloca() definition in header file. + #include + #define SDK_ALLOCA_DEFINED 1 #endif -/*lint --flb "Leave library region" */ +/*lint -"d__builtin_alloca=(void*)" */ -#endif /* NRF_PERIPHERALS_H */ +#endif // NRF_ALLOCA_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_common.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_common.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_common.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_common.h index 54ef51c4f1..6f65d03321 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_common.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_common.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2013 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_errors.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_errors.h similarity index 84% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_errors.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_errors.h index 96920fc617..7b5dea5ae1 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_errors.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_errors.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2013 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -71,7 +71,6 @@ #include #include "nrf_error.h" -#include "sdk_config.h" #ifdef __cplusplus extern "C" { @@ -89,10 +88,11 @@ extern "C" { * @defgroup sdk_module_codes Codes reserved as identification for module where the error occurred. * @{ */ -#define NRF_ERROR_MEMORY_MANAGER_ERR_BASE (0x8100) -#define NRF_ERROR_PERIPH_DRIVERS_ERR_BASE (0x8200) -#define NRF_ERROR_GAZELLE_ERR_BASE (0x8300) -#define NRF_ERROR_BLE_IPSP_ERR_BASE (0x8400) +#define NRF_ERROR_MEMORY_MANAGER_ERR_BASE (0x8100) /**< Base address for Memory Manager related errors. */ +#define NRF_ERROR_PERIPH_DRIVERS_ERR_BASE (0x8200) /**< Base address for Peripheral drivers related errors. */ +#define NRF_ERROR_GAZELLE_ERR_BASE (0x8300) /**< Base address for Gazelle related errors. */ +#define NRF_ERROR_BLE_IPSP_ERR_BASE (0x8400) /**< Base address for BLE IPSP related errors. */ +#define NRF_ERROR_CRYPTO_ERR_BASE (0x8500) /**< Base address for crypto related errors. */ /** @} */ @@ -109,15 +109,16 @@ extern "C" { * @defgroup sdk_common_errors Codes reserved as identification for common errors. * @{ */ -#define NRF_ERROR_MODULE_NOT_INITIALZED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0000) -#define NRF_ERROR_MUTEX_INIT_FAILED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0001) -#define NRF_ERROR_MUTEX_LOCK_FAILED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0002) -#define NRF_ERROR_MUTEX_UNLOCK_FAILED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0003) -#define NRF_ERROR_MUTEX_COND_INIT_FAILED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0004) -#define NRF_ERROR_MODULE_ALREADY_INITIALIZED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0005) -#define NRF_ERROR_STORAGE_FULL (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0006) -#define NRF_ERROR_API_NOT_IMPLEMENTED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0010) -#define NRF_ERROR_FEATURE_NOT_ENABLED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0011) +#define NRF_ERROR_MODULE_NOT_INITIALIZED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0000) ///< Module not initialized +#define NRF_ERROR_MUTEX_INIT_FAILED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0001) ///< Mutex initialization failed +#define NRF_ERROR_MUTEX_LOCK_FAILED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0002) ///< Mutex lock failed +#define NRF_ERROR_MUTEX_UNLOCK_FAILED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0003) ///< Mutex unlock failed +#define NRF_ERROR_MUTEX_COND_INIT_FAILED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0004) ///< Mutex conditional initialization failed +#define NRF_ERROR_MODULE_ALREADY_INITIALIZED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0005) ///< Module already initialized +#define NRF_ERROR_STORAGE_FULL (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0006) ///< Storage full +#define NRF_ERROR_API_NOT_IMPLEMENTED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0010) ///< API not implemented +#define NRF_ERROR_FEATURE_NOT_ENABLED (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0011) ///< Feature not enabled +#define NRF_ERROR_IO_PENDING (NRF_ERROR_SDK_COMMON_ERROR_BASE + 0x0012) ///< Input/Output pending /** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_macros.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_macros.h similarity index 64% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_macros.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_macros.h index 01dcdf5d4c..c33c66eff0 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_macros.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_macros.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2013 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -49,11 +49,51 @@ #ifndef SDK_MACROS_H__ #define SDK_MACROS_H__ +#include "nrf_assert.h" + #ifdef __cplusplus extern "C" { #endif +/**@brief Macro for parameter checking. + * + * If @p _cond evaluates to true, does nothing. Otherwise, + * if @p _module ## _PARAM_CHECK_DISABLED is @e not set (default), prints an error message + * if @p _printfn is provided, and returns from the calling function context with code @p _err. + * If @p _module ## _PARAM_CHECK_DISABLED is set, behaves like the ASSERT macro. + * + * Parameter checking implemented using this macro can be optionally turned off for release code. + * Only disable runtime parameter checks if size if a major concern. + * + * @param _module The module name. + * @param _cond The condition to be evaluated. + * @param _err The error to be returned. + * @param _printfn A printf-compatible function used to log the error. + * Leave empty if no logging is needed. + * + * @hideinitializer + */ +/*lint -esym(666, NRF_PARAM_CHECK*) : Expression with side effects passed to macro */ +#define NRF_PARAM_CHECK(_module, _cond, _err, _printfn) \ + do \ + { \ + if ((_cond)) \ + { \ + /* Do nothing. */ \ + } \ + else if (!(_module ## _PARAM_CHECK_DISABLED)) \ + { \ + _printfn("%s check failed in %s() with value 0x%x.", #_cond, __func__, _err); \ + return (_err); \ + } \ + else \ + { \ + ASSERT((_cond)); \ + } \ + } while (0); + + /**@brief Macro for verifying statement to be true. It will cause the exterior function to return * err_code if the statement is not true. * @@ -109,15 +149,19 @@ do \ /**@brief Macro for verifying that a function returned NRF_SUCCESS. It will cause the exterior - * function to return err_code if the err_code is not @ref NRF_SUCCESS. + * function to return error code of statement if it is not @ref NRF_SUCCESS. * - * @param[in] err_code The error code to check. + * @param[in] statement Statement to check against NRF_SUCCESS. */ -#ifdef DISABLE_PARAM_CHECK -#define VERIFY_SUCCESS() -#else -#define VERIFY_SUCCESS(err_code) VERIFY_TRUE((err_code) == NRF_SUCCESS, (err_code)) -#endif /* DISABLE_PARAM_CHECK */ +#define VERIFY_SUCCESS(statement) \ +do \ +{ \ + uint32_t _err_code = (uint32_t) (statement); \ + if (_err_code != NRF_SUCCESS) \ + { \ + return _err_code; \ + } \ +} while(0) /**@brief Macro for verifying that a function returned NRF_SUCCESS. It will cause the exterior @@ -125,11 +169,7 @@ do \ * * @param[in] err_code The error code to check. */ -#ifdef DISABLE_PARAM_CHECK -#define VERIFY_SUCCESS_VOID() -#else #define VERIFY_SUCCESS_VOID(err_code) VERIFY_TRUE_VOID((err_code) == NRF_SUCCESS) -#endif /* DISABLE_PARAM_CHECK */ /**@brief Macro for verifying that the module is initialized. It will cause the exterior function to @@ -138,11 +178,7 @@ do \ * @note MODULE_INITIALIZED must be defined in each module using this macro. MODULE_INITIALIZED * should be true if the module is initialized, false if not. */ -#ifdef DISABLE_PARAM_CHECK -#define VERIFY_MODULE_INITIALIZED() -#else #define VERIFY_MODULE_INITIALIZED() VERIFY_TRUE((MODULE_INITIALIZED), NRF_ERROR_INVALID_STATE) -#endif /* DISABLE_PARAM_CHECK */ /**@brief Macro for verifying that the module is initialized. It will cause the exterior function to @@ -151,11 +187,7 @@ do \ * @note MODULE_INITIALIZED must be defined in each module using this macro. MODULE_INITIALIZED * should be true if the module is initialized, false if not. */ -#ifdef DISABLE_PARAM_CHECK -#define VERIFY_MODULE_INITIALIZED_VOID() -#else #define VERIFY_MODULE_INITIALIZED_VOID() VERIFY_TRUE_VOID((MODULE_INITIALIZED)) -#endif /* DISABLE_PARAM_CHECK */ /**@brief Macro for verifying that the module is initialized. It will cause the exterior function to @@ -163,11 +195,7 @@ do \ * * @param[in] param The variable to check if is NULL. */ -#ifdef DISABLE_PARAM_CHECK -#define VERIFY_PARAM_NOT_NULL() -#else #define VERIFY_PARAM_NOT_NULL(param) VERIFY_FALSE(((param) == NULL), NRF_ERROR_NULL) -#endif /* DISABLE_PARAM_CHECK */ /**@brief Macro for verifying that the module is initialized. It will cause the exterior function to @@ -175,11 +203,7 @@ do \ * * @param[in] param The variable to check if is NULL. */ -#ifdef DISABLE_PARAM_CHECK -#define VERIFY_PARAM_NOT_NULL_VOID() -#else #define VERIFY_PARAM_NOT_NULL_VOID(param) VERIFY_FALSE_VOID(((param) == NULL)) -#endif /* DISABLE_PARAM_CHECK */ /** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_mapped_flags.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_mapped_flags.c similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_mapped_flags.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_mapped_flags.c index 1a99ac382f..df5c09a98c 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_mapped_flags.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_mapped_flags.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_mapped_flags.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_mapped_flags.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_mapped_flags.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_mapped_flags.h index 1f9033909a..2432c88aed 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_mapped_flags.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_mapped_flags.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_os.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_os.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_os.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_os.h index c1660070b9..6aeb3d4f6f 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_os.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_os.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2013 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_resources.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_resources.h similarity index 93% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_resources.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_resources.h index 91d2af1294..eaef717f9d 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/libraries/util/sdk_resources.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/components/libraries/util/sdk_resources.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -41,14 +41,14 @@ * @brief Definition file for resource usage by SoftDevice, ESB and Gazell. */ -#ifndef APP_RESOURCES_H__ -#define APP_RESOURCES_H__ +#ifndef SDK_RESOURCES_H__ +#define SDK_RESOURCES_H__ #ifdef __cplusplus extern "C" { #endif -#ifdef SOFTDEVICE_PRESENT +#if defined(SOFTDEVICE_PRESENT) || defined (BLE_STACK_SUPPORT_REQD) || defined (ANT_STACK_SUPPORT_REQD) #include "nrf_sd_def.h" #else #define SD_PPI_RESTRICTED 0uL /**< 1 if PPI peripheral is restricted, 0 otherwise. */ @@ -83,4 +83,4 @@ extern "C" { } #endif -#endif // APP_RESOURCES_H__ +#endif // SDK_RESOURCES_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/ble_flash/ble_flash.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/legacy/ble_flash/ble_flash.c similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/ble_flash/ble_flash.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/legacy/ble_flash/ble_flash.c diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/ble_flash/ble_flash.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/legacy/ble_flash/ble_flash.h similarity index 100% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/ble_flash/ble_flash.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/legacy/ble_flash/ble_flash.h diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/rng/nrf_drv_rng.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/legacy/nrf_drv_rng.c similarity index 75% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/rng/nrf_drv_rng.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/legacy/nrf_drv_rng.c index 8f02e76ab4..a3aed4bf86 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/rng/nrf_drv_rng.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/legacy/nrf_drv_rng.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -43,7 +43,6 @@ #include #include #include "nrf_drv_rng.h" -#include "nrf_drv_common.h" #include "nordic_common.h" #include "app_util_platform.h" #include "nrf_assert.h" @@ -65,12 +64,9 @@ #include "nrf_log.h" NRF_LOG_MODULE_REGISTER(); -/* Validate configuration */ -INTERRUPT_PRIORITY_VALIDATION(RNG_CONFIG_IRQ_PRIORITY); - typedef struct { - nrf_drv_state_t state; + nrfx_drv_state_t state; nrf_drv_rng_config_t config; } nrf_drv_rng_cb_t; @@ -79,11 +75,8 @@ NRF_QUEUE_DEF(uint8_t, m_rand_pool, RNG_CONFIG_POOL_SIZE, NRF_QUEUE_MODE_OVERFLO static const nrf_drv_rng_config_t m_default_config = NRF_DRV_RNG_DEFAULT_CONFIG; #ifdef SOFTDEVICE_PRESENT -#ifdef S132 #define SD_RAND_POOL_SIZE (64) -#else - #define SD_RAND_POOL_SIZE (32) -#endif + STATIC_ASSERT(RNG_CONFIG_POOL_SIZE == SD_RAND_POOL_SIZE); #define NRF_DRV_RNG_LOCK() CRITICAL_REGION_ENTER() @@ -96,47 +89,28 @@ static const nrf_drv_rng_config_t m_default_config = NRF_DRV_RNG_DEFAULT_CONFIG; #endif // SOFTDEVICE_PRESENT -/** - * @brief Function for starting generation. - */ -static void nrf_drv_rng_start(void) +static void nrfx_rng_handler(uint8_t rng_val) { - ASSERT(!NRF_DRV_RNG_SD_IS_ENABLED()); - - nrf_rng_event_clear(NRF_RNG_EVENT_VALRDY); - nrf_rng_int_enable(NRF_RNG_INT_VALRDY_MASK); - nrf_rng_task_trigger(NRF_RNG_TASK_START); -} - -/** - * @brief Function for stoping generation. - */ -static void nrf_drv_rng_stop(void) -{ - ASSERT(!NRF_DRV_RNG_SD_IS_ENABLED()); - - nrf_rng_int_disable(NRF_RNG_INT_VALRDY_MASK); - nrf_rng_task_trigger(NRF_RNG_TASK_STOP); -} - -/** - * @brief Function for setting up RNG hardware. - */ -static void nrf_drv_rng_setup(void) -{ - ASSERT(!NRF_DRV_RNG_SD_IS_ENABLED()); - - if (m_rng_cb.config.error_correction) + NRF_DRV_RNG_LOCK(); + if (!NRF_DRV_RNG_SD_IS_ENABLED()) { - nrf_rng_error_correction_enable(); + UNUSED_RETURN_VALUE(nrf_queue_push(&m_rand_pool, &rng_val)); + + if (nrf_queue_is_full(&m_rand_pool)) + { + nrfx_rng_stop(); + } + + NRF_LOG_DEBUG("Event: NRF_RNG_EVENT_VALRDY."); } - nrf_rng_shorts_disable(NRF_RNG_SHORT_VALRDY_STOP_MASK); - nrf_drv_common_irq_enable(RNG_IRQn, m_rng_cb.config.interrupt_priority); + NRF_DRV_RNG_RELEASE(); + } ret_code_t nrf_drv_rng_init(nrf_drv_rng_config_t const * p_config) { - if (m_rng_cb.state != NRF_DRV_STATE_UNINITIALIZED) + ret_code_t err_code = NRF_SUCCESS; + if (m_rng_cb.state != NRFX_DRV_STATE_UNINITIALIZED) { return NRF_ERROR_MODULE_ALREADY_INITIALIZED; } @@ -151,39 +125,42 @@ ret_code_t nrf_drv_rng_init(nrf_drv_rng_config_t const * p_config) if (!NRF_DRV_RNG_SD_IS_ENABLED()) { - nrf_drv_rng_setup(); - nrf_drv_rng_start(); + err_code = nrfx_rng_init(&m_rng_cb.config, nrfx_rng_handler); + if (err_code != NRF_SUCCESS) + { + return err_code; + } + nrfx_rng_start(); } + m_rng_cb.state = NRFX_DRV_STATE_INITIALIZED; NRF_DRV_RNG_RELEASE(); - m_rng_cb.state = NRF_DRV_STATE_INITIALIZED; - - return NRF_SUCCESS; + return err_code; } void nrf_drv_rng_uninit(void) { - ASSERT(m_rng_cb.state == NRF_DRV_STATE_INITIALIZED); + ASSERT(m_rng_cb.state == NRFX_DRV_STATE_INITIALIZED); NRF_DRV_RNG_LOCK(); if (!NRF_DRV_RNG_SD_IS_ENABLED()) { - nrf_drv_rng_stop(); - nrf_drv_common_irq_disable(RNG_IRQn); + nrfx_rng_stop(); + nrfx_rng_uninit(); } NRF_DRV_RNG_RELEASE(); nrf_queue_reset(&m_rand_pool); - m_rng_cb.state = NRF_DRV_STATE_UNINITIALIZED; + m_rng_cb.state = NRFX_DRV_STATE_UNINITIALIZED; NRF_LOG_INFO("Uninitialized."); } void nrf_drv_rng_bytes_available(uint8_t * p_bytes_available) { - ASSERT(m_rng_cb.state == NRF_DRV_STATE_INITIALIZED); + ASSERT(m_rng_cb.state == NRFX_DRV_STATE_INITIALIZED); #ifdef SOFTDEVICE_PRESENT if (NRF_DRV_RNG_SD_IS_ENABLED()) @@ -203,7 +180,7 @@ void nrf_drv_rng_bytes_available(uint8_t * p_bytes_available) ret_code_t nrf_drv_rng_rand(uint8_t * p_buff, uint8_t length) { ret_code_t err_code = NRF_SUCCESS; - ASSERT(m_rng_cb.state == NRF_DRV_STATE_INITIALIZED); + ASSERT(m_rng_cb.state == NRFX_DRV_STATE_INITIALIZED); #ifdef SOFTDEVICE_PRESENT do { @@ -214,7 +191,7 @@ ret_code_t nrf_drv_rng_rand(uint8_t * p_buff, uint8_t length) #endif // SOFTDEVICE_PRESENT { err_code = nrf_queue_read(&m_rand_pool, p_buff, (uint32_t)length); - nrf_drv_rng_start(); + nrfx_rng_start(); } #ifdef SOFTDEVICE_PRESENT NRF_DRV_RNG_RELEASE(); @@ -244,7 +221,7 @@ ret_code_t nrf_drv_rng_rand(uint8_t * p_buff, uint8_t length) void nrf_drv_rng_block_rand(uint8_t * p_buff, uint32_t length) { - ASSERT(m_rng_cb.state == NRF_DRV_STATE_INITIALIZED); + ASSERT(m_rng_cb.state == NRFX_DRV_STATE_INITIALIZED); while (length) { @@ -269,15 +246,23 @@ static void sd_state_evt_handler(nrf_sdh_state_evt_t state, void * p_context) switch (state) { case NRF_SDH_EVT_STATE_ENABLE_PREPARE: - NVIC_DisableIRQ(RNG_IRQn); + if (m_rng_cb.state == NRFX_DRV_STATE_INITIALIZED) + { + nrfx_rng_stop(); + nrfx_rng_uninit(); + } break; case NRF_SDH_EVT_STATE_DISABLED: NRF_DRV_RNG_LOCK(); - if (m_rng_cb.state == NRF_DRV_STATE_INITIALIZED) + if (m_rng_cb.state == NRFX_DRV_STATE_INITIALIZED) { - nrf_drv_rng_setup(); - nrf_drv_rng_start(); + ret_code_t err_code = nrfx_rng_init(&m_rng_cb.config, nrfx_rng_handler); + if (err_code != NRF_SUCCESS) + { + ASSERT(false); + } + nrfx_rng_start(); } NRF_DRV_RNG_RELEASE(); break; @@ -295,27 +280,4 @@ NRF_SDH_STATE_OBSERVER(m_sd_state_observer, RNG_CONFIG_STATE_OBSERVER_PRIO) = #endif // SOFTDEVICE_PRESENT -void RNG_IRQHandler(void) -{ - NRF_DRV_RNG_LOCK(); - if ( - !NRF_DRV_RNG_SD_IS_ENABLED() && - nrf_rng_event_get(NRF_RNG_EVENT_VALRDY) && - nrf_rng_int_get(NRF_RNG_INT_VALRDY_MASK)) - { - nrf_rng_event_clear(NRF_RNG_EVENT_VALRDY); - - uint8_t new_value = nrf_rng_random_value_get(); - UNUSED_RETURN_VALUE(nrf_queue_push(&m_rand_pool, &new_value)); - - if (nrf_queue_is_full(&m_rand_pool)) - { - nrf_drv_rng_stop(); - } - - NRF_LOG_DEBUG("Event: NRF_RNG_EVENT_VALRDY."); - } - NRF_DRV_RNG_RELEASE(); -} - #endif // NRF_MODULE_ENABLED(RNG) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/rng/nrf_drv_rng.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/legacy/nrf_drv_rng.h similarity index 76% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/rng/nrf_drv_rng.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/legacy/nrf_drv_rng.h index 7d242d3049..3a4b306225 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/rng/nrf_drv_rng.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/legacy/nrf_drv_rng.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,47 +37,29 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ + #ifndef NRF_DRV_RNG_H__ #define NRF_DRV_RNG_H__ -#include -#include - -#include "nrf_rng.h" -#include "sdk_errors.h" -#include "sdk_config.h" -#include "nrf_drv_common.h" +#include #ifdef __cplusplus extern "C" { #endif /** - * @addtogroup nrf_rng RNG HAL and driver - * @ingroup nrf_drivers - * @brief Random number generator (RNG) APIs. - * @details The RNG HAL provides basic APIs for accessing the registers of the random number - * generator. The RNG driver provides APIs on a higher level. - * - * @defgroup nrf_drv_rng RNG driver + * @defgroup nrf_drv_rng RNG driver - legacy layer * @{ - * @ingroup nrf_rng - * @brief Driver for managing the random number generator (RNG). + * @ingroup nrf_rng + * + * @brief Layer providing compatibility with the former API. */ -/**@brief Struct for RNG configuration. */ -typedef struct -{ - bool error_correction : 1; /**< Error correction flag. */ - uint8_t interrupt_priority; /**< interrupt priority */ -} nrf_drv_rng_config_t; +/** @brief Type definition for forwarding the new implementation. */ +typedef nrfx_rng_config_t nrf_drv_rng_config_t; -/**@brief RNG default configuration. */ -#define NRF_DRV_RNG_DEFAULT_CONFIG \ - { \ - .error_correction = RNG_CONFIG_ERROR_CORRECTION, \ - .interrupt_priority = RNG_CONFIG_IRQ_PRIORITY, \ - } +/** @brief Macro for forwarding the new implementation. */ +#define NRF_DRV_RNG_DEFAULT_CONFIG NRFX_RNG_DEFAULT_CONFIG /** * @brief Function for initializing the nrf_drv_rng module. @@ -124,9 +106,7 @@ ret_code_t nrf_drv_rng_rand(uint8_t * p_buff, uint8_t length); */ void nrf_drv_rng_block_rand(uint8_t * p_buff, uint32_t length); -/** - *@} - **/ +/** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/sdio/config/sdio_config.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/nrfx_config.h similarity index 88% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/sdio/config/sdio_config.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/nrfx_config.h index f59e553c3d..72577ef2fc 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/sdio/config/sdio_config.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/nrfx_config.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,19 +37,11 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -#ifndef SDIO_CONFIG_H -#define SDIO_CONFIG_H -#ifdef __cplusplus -extern "C" { -#endif +#ifndef NRFX_CONFIG_H__ +#define NRFX_CONFIG_H__ -#define SDIO_CONFIG_CLOCK_PIN_NUMBER 24 -#define SDIO_CONFIG_DATA_PIN_NUMBER 25 +// TODO - temporary redirection +#include - -#ifdef __cplusplus -} -#endif - -#endif +#endif // NRFX_CONFIG_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/nrfx_glue.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/nrfx_glue.h new file mode 100644 index 0000000000..8b1ad38aeb --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/nrfx_glue.h @@ -0,0 +1,267 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_GLUE_H__ +#define NRFX_GLUE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_glue nrfx_glue.h + * @{ + * @ingroup nrfx + * + * @brief This file contains macros that should be implemented according to + * the needs of the host environment into which @em nrfx is integrated. + */ + +//#include +#include + +//------------------------------------------------------------------------------ + +#include +/** + * @brief Macro for placing a runtime assertion. + * + * @param expression Expression to evaluate. + */ +#define NRFX_ASSERT(expression) ASSERT(expression) + +#include +/** + * @brief Macro for placing a compile time assertion. + * + * @param expression Expression to evaluate. + */ +#define NRFX_STATIC_ASSERT(expression) STATIC_ASSERT(expression) + +//------------------------------------------------------------------------------ + +#ifdef NRF51 +#ifdef SOFTDEVICE_PRESENT +#define INTERRUPT_PRIORITY_IS_VALID(pri) (((pri) == 1) || ((pri) == 3)) +#else +#define INTERRUPT_PRIORITY_IS_VALID(pri) ((pri) < 4) +#endif //SOFTDEVICE_PRESENT +#else +#ifdef SOFTDEVICE_PRESENT +#define INTERRUPT_PRIORITY_IS_VALID(pri) ((((pri) > 1) && ((pri) < 4)) || \ + (((pri) > 4) && ((pri) < 8))) +#else +#define INTERRUPT_PRIORITY_IS_VALID(pri) ((pri) < 8) +#endif //SOFTDEVICE_PRESENT +#endif //NRF52 + +/** + * @brief Macro for setting the priority of a specific IRQ. + * + * @param irq_number IRQ number. + * @param priority Priority to set. + */ +#define NRFX_IRQ_PRIORITY_SET(irq_number, priority) \ + _NRFX_IRQ_PRIORITY_SET(irq_number, priority) +static inline void _NRFX_IRQ_PRIORITY_SET(IRQn_Type irq_number, + uint8_t priority) +{ + ASSERT(INTERRUPT_PRIORITY_IS_VALID(priority)); + NVIC_SetPriority(irq_number, priority); +} + +/** + * @brief Macro for enabling a specific IRQ. + * + * @param irq_number IRQ number. + */ +#define NRFX_IRQ_ENABLE(irq_number) _NRFX_IRQ_ENABLE(irq_number) +static inline void _NRFX_IRQ_ENABLE(IRQn_Type irq_number) +{ + NVIC_ClearPendingIRQ(irq_number); + NVIC_EnableIRQ(irq_number); +} + +/** + * @brief Macro for checking if a specific IRQ is enabled. + * + * @param irq_number IRQ number. + * + * @retval true If the IRQ is enabled. + * @retval false Otherwise. + */ +#define NRFX_IRQ_IS_ENABLED(irq_number) _NRFX_IRQ_IS_ENABLED(irq_number) +static inline bool _NRFX_IRQ_IS_ENABLED(IRQn_Type irq_number) +{ + return 0 != (NVIC->ISER[irq_number / 32] & (1UL << (irq_number % 32))); +} + +/** + * @brief Macro for disabling a specific IRQ. + * + * @param irq_number IRQ number. + */ +#define NRFX_IRQ_DISABLE(irq_number) _NRFX_IRQ_DISABLE(irq_number) +static inline void _NRFX_IRQ_DISABLE(IRQn_Type irq_number) +{ + NVIC_DisableIRQ(irq_number); +} + +/** + * @brief Macro for setting a specific IRQ as pending. + * + * @param irq_number IRQ number. + */ +#define NRFX_IRQ_PENDING_SET(irq_number) _NRFX_IRQ_PENDING_SET(irq_number) +static inline void _NRFX_IRQ_PENDING_SET(IRQn_Type irq_number) +{ + NVIC_SetPendingIRQ(irq_number); +} + +/** + * @brief Macro for clearing the pending status of a specific IRQ. + * + * @param irq_number IRQ number. + */ +#define NRFX_IRQ_PENDING_CLEAR(irq_number) _NRFX_IRQ_PENDING_CLEAR(irq_number) +static inline void _NRFX_IRQ_PENDING_CLEAR(IRQn_Type irq_number) +{ + NVIC_ClearPendingIRQ(irq_number); +} + +/** + * @brief Macro for checking the pending status of a specific IRQ. + * + * @retval true If the IRQ is pending. + * @retval false Otherwise. + */ +#define NRFX_IRQ_IS_PENDING(irq_number) _NRFX_IRQ_IS_PENDING(irq_number) +static inline bool _NRFX_IRQ_IS_PENDING(IRQn_Type irq_number) +{ + return (NVIC_GetPendingIRQ(irq_number) == 1); +} + +#include +#include +/** + * @brief Macro for entering into a critical section. + */ +#define NRFX_CRITICAL_SECTION_ENTER() CRITICAL_REGION_ENTER() + +/** + * @brief Macro for exiting from a critical section. + */ +#define NRFX_CRITICAL_SECTION_EXIT() CRITICAL_REGION_EXIT() + +//------------------------------------------------------------------------------ + +/** + * @brief When set to a non-zero value, this macro specifies that + * @ref nrfx_coredep_delay_us uses a precise DWT-based solution. + * A compilation error is generated if the DWT unit is not present + * in the SoC used. + */ +#define NRFX_DELAY_DWT_BASED 0 + +#include + +#define NRFX_DELAY_US(us_time) nrfx_coredep_delay_us(us_time) + +//------------------------------------------------------------------------------ + +#include +/** + * @brief When set to a non-zero value, this macro specifies that the + * @ref nrfx_error_codes and the @ref ret_code_t type itself are defined + * in a customized way and the default definitions from @c + * should not be used. + */ +#define NRFX_CUSTOM_ERROR_CODES 1 + +typedef ret_code_t nrfx_err_t; + +#define NRFX_SUCCESS NRF_SUCCESS +#define NRFX_ERROR_INTERNAL NRF_ERROR_INTERNAL +#define NRFX_ERROR_NO_MEM NRF_ERROR_NO_MEM +#define NRFX_ERROR_NOT_SUPPORTED NRF_ERROR_NOT_SUPPORTED +#define NRFX_ERROR_INVALID_PARAM NRF_ERROR_INVALID_PARAM +#define NRFX_ERROR_INVALID_STATE NRF_ERROR_INVALID_STATE +#define NRFX_ERROR_INVALID_LENGTH NRF_ERROR_INVALID_LENGTH +#define NRFX_ERROR_TIMEOUT NRF_ERROR_TIMEOUT +#define NRFX_ERROR_FORBIDDEN NRF_ERROR_FORBIDDEN +#define NRFX_ERROR_NULL NRF_ERROR_NULL +#define NRFX_ERROR_INVALID_ADDR NRF_ERROR_INVALID_ADDR +#define NRFX_ERROR_BUSY NRF_ERROR_BUSY +#define NRFX_ERROR_ALREADY_INITIALIZED NRF_ERROR_MODULE_ALREADY_INITIALIZED + +#define NRFX_ERROR_DRV_TWI_ERR_OVERRUN NRF_ERROR_DRV_TWI_ERR_OVERRUN +#define NRFX_ERROR_DRV_TWI_ERR_ANACK NRF_ERROR_DRV_TWI_ERR_ANACK +#define NRFX_ERROR_DRV_TWI_ERR_DNACK NRF_ERROR_DRV_TWI_ERR_DNACK + +//------------------------------------------------------------------------------ + +#include +/** + * @brief Bitmask defining PPI channels reserved to be used outside of nrfx. + */ +#define NRFX_PPI_CHANNELS_USED NRF_PPI_CHANNELS_USED + +/** + * @brief Bitmask defining PPI groups reserved to be used outside of nrfx. + */ +#define NRFX_PPI_GROUPS_USED NRF_PPI_GROUPS_USED + +/** + * @brief Bitmask defining SWI instances reserved to be used outside of nrfx. + */ +#define NRFX_SWI_USED NRF_SWI_USED + +/** + * @brief Bitmask defining TIMER instances reserved to be used outside of nrfx. + */ +#define NRFX_TIMERS_USED NRF_TIMERS_USED + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_GLUE_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/nrfx_log.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/nrfx_log.h new file mode 100644 index 0000000000..4c2546ef33 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/integration/nrfx/nrfx_log.h @@ -0,0 +1,152 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_LOG_H__ +#define NRFX_LOG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(NRFX_LOG_MODULE) +#define NRF_LOG_MODULE_NAME NRFX_LOG_MODULE + +#define NRFX_CONFIG_ENTRY(x) CONCAT_3(NRFX_, NRFX_LOG_MODULE, x) + +#if NRFX_CHECK(NRFX_CONFIG_ENTRY(_CONFIG_LOG_ENABLED)) +#define NRF_LOG_LEVEL NRFX_CONFIG_ENTRY(_CONFIG_LOG_LEVEL) +#define NRF_LOG_INFO_COLOR NRFX_CONFIG_ENTRY(_CONFIG_INFO_COLOR) +#define NRF_LOG_DEBUG_COLOR NRFX_CONFIG_ENTRY(_CONFIG_DEBUG_COLOR) +#else +#define NRF_LOG_LEVEL 0 +#endif +#endif // defined(NRFX_LOG_MODULE) + +#include + +#if defined(NRFX_LOG_MODULE) +NRF_LOG_MODULE_REGISTER(); +#endif + +#define TEST_MACRO_INFO(...) NRF_LOG_INFO(__VA_ARGS__) +/** + * @defgroup nrfx_log nrfx_log.h + * @{ + * @ingroup nrfx + * + * @brief This file contains macros that should be implemented according to + * the needs of the host environment into which @em nrfx is integrated. + */ + +/** + * @brief Macro for logging a message with the severity level ERROR. + */ +#define NRFX_LOG_ERROR(...) NRF_LOG_ERROR(__VA_ARGS__) + +/** + * @brief Macro for logging a message with the severity level WARNING. + */ +#define NRFX_LOG_WARNING(...) NRF_LOG_WARNING(__VA_ARGS__) + +/** + * @brief Macro for logging a message with the severity level INFO. + */ +#define NRFX_LOG_INFO(...) TEST_MACRO_INFO(__VA_ARGS__) + +/** + * @brief Macro for logging a message with the severity level DEBUG. + */ +#define NRFX_LOG_DEBUG(...) NRF_LOG_DEBUG(__VA_ARGS__) + + +/** + * @brief Macro for logging a memory dump with the severity level ERROR. + * + * @param[in] p_memory Pointer to the memory region to be dumped. + * @param[in] length Length of the memory region in bytes. + */ +#define NRFX_LOG_HEXDUMP_ERROR(p_memory, length) \ + NRF_LOG_HEXDUMP_ERROR(p_memory, length) + +/** + * @brief Macro for logging a memory dump with the severity level WARNING. + * + * @param[in] p_memory Pointer to the memory region to be dumped. + * @param[in] length Length of the memory region in bytes. + */ +#define NRFX_LOG_HEXDUMP_WARNING(p_memory, length) \ + NRF_LOG_HEXDUMP_WARNING(p_memory, length) + +/** + * @brief Macro for logging a memory dump with the severity level INFO. + * + * @param[in] p_memory Pointer to the memory region to be dumped. + * @param[in] length Length of the memory region in bytes. + */ +#define NRFX_LOG_HEXDUMP_INFO(p_memory, length) \ + NRF_LOG_HEXDUMP_INFO(p_memory, length) + +/** + * @brief Macro for logging a memory dump with the severity level DEBUG. + * + * @param[in] p_memory Pointer to the memory region to be dumped. + * @param[in] length Length of the memory region in bytes. + */ +#define NRFX_LOG_HEXDUMP_DEBUG(p_memory, length) \ + NRF_LOG_HEXDUMP_DEBUG(p_memory, length) + + +/** + * @brief Macro for getting the textual representation of a given error code. + * + * @param[in] error_code Error code. + * + * @return String containing the textual representation of the error code. + */ +#define NRFX_LOG_ERROR_STRING_GET(error_code) \ + NRF_LOG_ERROR_STRING_GET(error_code) + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_LOG_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrf_bitmask.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrf_bitmask.h new file mode 100644 index 0000000000..8f2ac3626d --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrf_bitmask.h @@ -0,0 +1,156 @@ +/** + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRF_BITMASK_H +#define NRF_BITMASK_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrf_bitmask Bitmask module + * @{ + * @ingroup nrfx + * @brief Bitmask managing module. + */ + +#define BITMASK_BYTE_GET(abs_bit) ((abs_bit)/8) +#define BITMASK_RELBIT_GET(abs_bit) ((abs_bit) & 0x00000007) + +/** + * Function for checking if bit in the multi-byte bit mask is set. + * + * @param bit Bit index. + * @param p_mask A pointer to mask with bit fields. + * + * @return 0 if bit is not set, positive value otherwise. + */ +__STATIC_INLINE uint32_t nrf_bitmask_bit_is_set(uint32_t bit, void const * p_mask) +{ + uint8_t const * p_mask8 = (uint8_t const *)p_mask; + uint32_t byte_idx = BITMASK_BYTE_GET(bit); + bit = BITMASK_RELBIT_GET(bit); + return (1 << bit) & p_mask8[byte_idx]; +} + +/** + * Function for setting a bit in the multi-byte bit mask. + * + * @param bit Bit index. + * @param p_mask A pointer to mask with bit fields. + */ +__STATIC_INLINE void nrf_bitmask_bit_set(uint32_t bit, void * p_mask) +{ + uint8_t * p_mask8 = (uint8_t *)p_mask; + uint32_t byte_idx = BITMASK_BYTE_GET(bit); + bit = BITMASK_RELBIT_GET(bit); + p_mask8[byte_idx] |= (1 << bit); +} + +/** + * Function for clearing a bit in the multi-byte bit mask. + * + * @param bit Bit index. + * @param p_mask A pointer to mask with bit fields. + */ +__STATIC_INLINE void nrf_bitmask_bit_clear(uint32_t bit, void * p_mask) +{ + uint8_t * p_mask8 = (uint8_t *)p_mask; + uint32_t byte_idx = BITMASK_BYTE_GET(bit); + bit = BITMASK_RELBIT_GET(bit); + p_mask8[byte_idx] &= ~(1 << bit); +} + +/** + * Function for performing bitwise OR operation on two multi-byte bit masks. + * + * @param p_mask1 A pointer to the first bit mask. + * @param p_mask2 A pointer to the second bit mask. + * @param p_out_mask A pointer to the output bit mask. + * @param length Length of output mask in bytes. + */ +__STATIC_INLINE void nrf_bitmask_masks_or(void const * p_mask1, + void const * p_mask2, + void * p_out_mask, + uint32_t length) +{ + uint8_t const * p_mask8_1 = (uint8_t const *)p_mask1; + uint8_t const * p_mask8_2 = (uint8_t const *)p_mask2; + uint8_t * p_mask8_out = (uint8_t *)p_out_mask; + uint32_t i; + for (i = 0; i < length; i++) + { + p_mask8_out[i] = p_mask8_1[i] | p_mask8_2[i]; + } +} + +/** + * Function for performing bitwise AND operation on two multi-byte bit masks. + * + * @param p_mask1 A pointer to the first bit mask. + * @param p_mask2 A pointer to the second bit mask. + * @param p_out_mask A pointer to the output bit mask. + * @param length Length of output mask in bytes. + */ +__STATIC_INLINE void nrf_bitmask_masks_and(void const * p_mask1, + void const * p_mask2, + void * p_out_mask, + uint32_t length) +{ + uint8_t const * p_mask8_1 = (uint8_t const *)p_mask1; + uint8_t const * p_mask8_2 = (uint8_t const *)p_mask2; + uint8_t * p_mask8_out = (uint8_t *)p_out_mask; + uint32_t i; + for (i = 0; i < length; i++) + { + p_mask8_out[i] = p_mask8_1[i] & p_mask8_2[i]; + } +} + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRF_BITMASK_H diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_adc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_adc.h new file mode 100644 index 0000000000..e28d52aaad --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_adc.h @@ -0,0 +1,281 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_ADC_H__ +#define NRFX_ADC_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_adc ADC driver + * @{ + * @ingroup nrf_adc + * @brief Analog-to-Digital Converter (ADC) peripheral driver. + */ + +/** + * @brief Driver event types. + */ +typedef enum +{ + NRFX_ADC_EVT_DONE, ///< Event generated when the buffer is filled with samples. + NRFX_ADC_EVT_SAMPLE, ///< Event generated when the requested channel is sampled. +} nrfx_adc_evt_type_t; + +/** + * @brief Analog-to-digital converter driver DONE event. + */ +typedef struct +{ + nrf_adc_value_t * p_buffer; ///< Pointer to the buffer with converted samples. + uint16_t size; ///< Number of samples in the buffer. +} nrfx_adc_done_evt_t; + +/** + * @brief Analog-to-digital converter driver SAMPLE event. + */ +typedef struct +{ + nrf_adc_value_t sample; ///< Converted sample. +} nrfx_adc_sample_evt_t; + +/** + * @brief Analog-to-digital converter driver event. + */ +typedef struct +{ + nrfx_adc_evt_type_t type; ///< Event type. + union + { + nrfx_adc_done_evt_t done; ///< Data for DONE event. + nrfx_adc_sample_evt_t sample; ///< Data for SAMPLE event. + } data; +} nrfx_adc_evt_t; + +/**@brief Macro for initializing the ADC channel with the default configuration. */ +#define NRFX_ADC_DEFAULT_CHANNEL(analog_input) \ + { \ + NULL, \ + { \ + .resolution = NRF_ADC_CONFIG_RES_10BIT, \ + .scaling = NRF_ADC_CONFIG_SCALING_INPUT_FULL_SCALE, \ + .reference = NRF_ADC_CONFIG_REF_VBG, \ + .input = (analog_input), \ + .extref = NRF_ADC_CONFIG_EXTREFSEL_NONE \ + } \ + } + +// Forward declaration of the nrfx_adc_channel_t type. +typedef struct nrfx_adc_channel_s nrfx_adc_channel_t; + +/** + * @brief ADC channel. + * + * This structure is defined by the user and used by the driver. Therefore, it should + * not be defined on the stack as a local variable. + */ +struct nrfx_adc_channel_s +{ + nrfx_adc_channel_t * p_next; ///< Pointer to the next enabled channel (for internal use). + nrf_adc_config_t config; ///< ADC configuration for the current channel. +}; + +/** + * @brief ADC configuration. + */ +typedef struct +{ + uint8_t interrupt_priority; ///< Priority of ADC interrupt. +} nrfx_adc_config_t; + +/** @brief ADC default configuration. */ +#define NRFX_ADC_DEFAULT_CONFIG \ +{ \ + .interrupt_priority = NRFX_ADC_CONFIG_IRQ_PRIORITY \ +} + +/** + * @brief User event handler prototype. + * + * This function is called when the requested number of samples has been processed. + * + * @param p_event Event. + */ +typedef void (*nrfx_adc_event_handler_t)(nrfx_adc_evt_t const * p_event); + +/** + * @brief Function for initializing the ADC. + * + * If a valid event handler is provided, the driver is initialized in non-blocking mode. + * If event_handler is NULL, the driver works in blocking mode. + * + * @param[in] p_config Pointer to the structure with initial configuration. + * @param[in] event_handler Event handler provided by the user. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the driver is already initialized. + */ +nrfx_err_t nrfx_adc_init(nrfx_adc_config_t const * p_config, + nrfx_adc_event_handler_t event_handler); + +/** + * @brief Function for uninitializing the ADC. + * + * This function stops all ongoing conversions and disables all channels. + */ +void nrfx_adc_uninit(void); + +/** + * @brief Function for enabling an ADC channel. + * + * This function configures and enables the channel. When @ref nrfx_adc_buffer_convert is + * called, all channels that have been enabled with this function are sampled. + * + * @note The channel instance variable @p p_channel is used by the driver as an item + * in a list. Therefore, it cannot be an automatic variable that is located on the stack. + */ +void nrfx_adc_channel_enable(nrfx_adc_channel_t * const p_channel); + +/** + * @brief Function for disabling an ADC channel. + */ +void nrfx_adc_channel_disable(nrfx_adc_channel_t * const p_channel); + +/** + * @brief Function for starting ADC sampling. + * + * This function triggers single ADC sampling. If more than one channel is enabled, the driver + * emulates scanning and all channels are sampled in the order they were enabled. + */ +void nrfx_adc_sample(void); + +/** + * @brief Function for executing a single ADC conversion. + * + * This function selects the desired input and starts a single conversion. If a valid pointer + * is provided for the result, the function blocks until the conversion is completed. Otherwise, the + * function returns when the conversion is started, and the result is provided in an event (driver + * must be initialized in non-blocking mode, otherwise an assertion will fail). The function will + * fail if ADC is busy. The channel does not need to be enabled to perform a single conversion. + * + * @param[in] p_channel Channel. + * @param[out] p_value Pointer to the location where the result should be placed. Unless NULL is + * provided, the function is blocking. + * + * @retval NRFX_SUCCESS If conversion was successful. + * @retval NRFX_ERROR_BUSY If the ADC driver is busy. + */ +nrfx_err_t nrfx_adc_sample_convert(nrfx_adc_channel_t const * const p_channel, + nrf_adc_value_t * p_value); + +/** + * @brief Function for converting data to the buffer. + * + * If the driver is initialized in non-blocking mode, this function returns when the first + * conversion is set up. When the buffer is filled, the application is notified by the event + * handler. If the driver is initialized in blocking mode, the function returns when the buffer is + * filled. + * + * Conversion is done on all enabled channels, but it is not triggered by this + * function. This function will prepare the ADC for sampling and then + * wait for the SAMPLE task. Sampling can be triggered manually by the @ref + * nrfx_adc_sample function or by PPI using the @ref NRF_ADC_TASK_START task. + * + * @note If more than one channel is enabled, the function emulates scanning, and + * a single START task will trigger conversion on all enabled channels. For example: + * If 3 channels are enabled and the user requests 6 samples, the completion event + * handler will be called after 2 START tasks. + * + * @note The application must adjust the sampling frequency. The maximum frequency + * depends on the sampling timer and the maximum latency of the ADC interrupt. If + * an interrupt is not handled before the next sampling is triggered, the sample + * will be lost. + * + * @param[in] buffer Result buffer. + * @param[in] size Buffer size in samples. + * + * @retval NRFX_SUCCESS If conversion was successful. + * @retval NRFX_ERROR_BUSY If the driver is busy. + */ +nrfx_err_t nrfx_adc_buffer_convert(nrf_adc_value_t * buffer, uint16_t size); + +/** + * @brief Function for retrieving the ADC state. + * + * @retval true If the ADC is busy. + * @retval false If the ADC is ready. + */ +bool nrfx_adc_is_busy(void); + +/** + * @brief Function for getting the address of the ADC START task. + * + * This function is used to get the address of the START task, which can be used to trigger ADC + * conversion. + * + * @return Start task address. + */ +__STATIC_INLINE uint32_t nrfx_adc_start_task_get(void); + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION + +__STATIC_INLINE uint32_t nrfx_adc_start_task_get(void) +{ + return nrf_adc_task_address_get(NRF_ADC_TASK_START); +} + +#endif + + +void nrfx_adc_irq_handler(void); + + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_ADC_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_clock.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_clock.h new file mode 100644 index 0000000000..8a5e184af2 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_clock.h @@ -0,0 +1,223 @@ +/** + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_CLOCK_H__ +#define NRFX_CLOCK_H__ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_clock CLOCK driver + * @{ + * @ingroup nrf_clock + * @brief CLOCK peripheral driver. + */ + +/** + * @brief Clock events. + */ +typedef enum +{ + NRFX_CLOCK_EVT_HFCLK_STARTED, ///< HFCLK has been started. + NRFX_CLOCK_EVT_LFCLK_STARTED, ///< LFCLK has been started. + NRFX_CLOCK_EVT_CTTO, ///< Calibration timeout. + NRFX_CLOCK_EVT_CAL_DONE ///< Calibration has been done. +} nrfx_clock_evt_type_t; + +/** + * @brief Clock event handler. + * + * @param[in] event Event. + */ +typedef void (*nrfx_clock_event_handler_t)(nrfx_clock_evt_type_t event); + +/** + * @brief Function for initializing internal structures in the nrfx_clock module. + * + * After initialization, the module is in power off state (clocks are not started). + * + * @param[in] event_handler Event handler provided by the user. + * Must not be NULL. + * + * @retval NRFX_SUCCESS If the procedure was successful. + * @retval NRFX_ERROR_ALREADY_INITIALIZED If the driver was already initialized. + */ +nrfx_err_t nrfx_clock_init(nrfx_clock_event_handler_t event_handler); + +/** + * @brief Function for enabling interrupts in the clock module. + */ +void nrfx_clock_enable(void); + +/** + * @brief Function for disabling interrupts in the clock module. + */ +void nrfx_clock_disable(void); + +/** + * @brief Function for uninitializing the clock module. + */ +void nrfx_clock_uninit(void); + +/** + * @brief Function for starting the LFCLK. + */ +void nrfx_clock_lfclk_start(void); + +/** + * @brief Function for stoping the LFCLK. + */ +void nrfx_clock_lfclk_stop(void); + +/** + * @brief Function for checking the LFCLK state. + * + * @retval true If the LFCLK is running. + * @retval false If the LFCLK is not running. + */ +__STATIC_INLINE bool nrfx_clock_lfclk_is_running(void); + +/** + * @brief Function for starting the high-accuracy source HFCLK. + */ +void nrfx_clock_hfclk_start(void); + +/** + * @brief Function for stoping external high-accuracy source HFCLK. + */ +void nrfx_clock_hfclk_stop(void); + +/** + * @brief Function for checking the HFCLK state. + * + * @retval true If the HFCLK is running (XTAL source). + * @retval false If the HFCLK is not running. + */ +__STATIC_INLINE bool nrfx_clock_hfclk_is_running(void); + +/** + * @brief Function for starting calibration of internal LFCLK. + * + * This function starts the calibration process. The process cannot be aborted. LFCLK and HFCLK + * must be running before this function is called. + * + * @retval NRFX_SUCCESS If the procedure was successful. + * @retval NRFX_ERROR_INVALID_STATE If the low-frequency of high-frequency clock is off. + * @retval NRFX_ERROR_BUSY If calibration is in progress. + */ +nrfx_err_t nrfx_clock_calibration_start(void); + +/** + * @brief Function for checking if calibration is in progress. + * + * This function indicates that the system is in calibration phase. + * + * @retval NRFX_SUCCESS If the procedure was successful. + * @retval NRFX_ERROR_BUSY If calibration is in progress. + */ +nrfx_err_t nrfx_clock_is_calibrating(void); + +/** + * @brief Function for starting calibration timer. + * @param interval Time after which the CTTO event and interrupt will be generated (in 0.25 s units). + */ +void nrfx_clock_calibration_timer_start(uint8_t interval); + +/** + * @brief Function for stoping calibration timer. + */ +void nrfx_clock_calibration_timer_stop(void); + +/**@brief Function for returning a requested task address for the clock driver module. + * + * @param[in] task One of the peripheral tasks. + * + * @return Task address. + */ +__STATIC_INLINE uint32_t nrfx_clock_ppi_task_addr(nrf_clock_task_t task); + +/**@brief Function for returning a requested event address for the clock driver module. + * + * @param[in] event One of the peripheral events. + * + * @return Event address. + */ +__STATIC_INLINE uint32_t nrfx_clock_ppi_event_addr(nrf_clock_event_t event); + + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION +__STATIC_INLINE uint32_t nrfx_clock_ppi_task_addr(nrf_clock_task_t task) +{ + return nrf_clock_task_address_get(task); +} + +__STATIC_INLINE uint32_t nrfx_clock_ppi_event_addr(nrf_clock_event_t event) +{ + return nrf_clock_event_address_get(event); +} + +__STATIC_INLINE bool nrfx_clock_hfclk_is_running(void) +{ + return nrf_clock_hf_is_running(NRF_CLOCK_HFCLK_HIGH_ACCURACY); +} + +__STATIC_INLINE bool nrfx_clock_lfclk_is_running(void) +{ + return nrf_clock_lf_is_running(); +} +#endif //SUPPRESS_INLINE_IMPLEMENTATION + + +void nrfx_clock_irq_handler(void); + + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_CLOCK_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_comp.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_comp.h new file mode 100644 index 0000000000..8b4ee4400a --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_comp.h @@ -0,0 +1,247 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_COMP_H__ +#define NRFX_COMP_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_comp COMP driver + * @{ + * @ingroup nrf_comp + * @brief Comparator (COMP) peripheral driver. + */ + +/** + * @brief Macro to convert the threshold voltage to an integer value + * (needed by the COMP_TH register). + * + * @param[in] vol Voltage to be changed to COMP_TH register value. This value + * must not be smaller than reference voltage divided by 64. + * @param[in] ref Reference voltage. + */ +#define NRFX_VOLTAGE_THRESHOLD_TO_INT(vol, ref) \ + (uint8_t)(((vol) > ((ref) / 64)) ? (NRFX_ROUNDED_DIV((vol) * 64,(ref)) - 1) : 0) + +/** + * @brief COMP event handler function type. + * @param[in] event COMP event. + */ +typedef void (* nrfx_comp_event_handler_t)(nrf_comp_event_t event); + +/** @brief COMP shortcut masks. */ +typedef enum +{ + NRFX_COMP_SHORT_STOP_AFTER_CROSS_EVT = COMP_SHORTS_CROSS_STOP_Msk, /*!< Shortcut between the CROSS event and the STOP task. */ + NRFX_COMP_SHORT_STOP_AFTER_UP_EVT = COMP_SHORTS_UP_STOP_Msk, /*!< Shortcut between the UP event and the STOP task. */ + NRFX_COMP_SHORT_STOP_AFTER_DOWN_EVT = COMP_SHORTS_DOWN_STOP_Msk /*!< Shortcut between the DOWN event and the STOP task. */ +} nrfx_comp_short_mask_t; + +/** @brief COMP events masks. */ +typedef enum +{ + NRFX_COMP_EVT_EN_CROSS_MASK = COMP_INTENSET_CROSS_Msk, /*!< CROSS event (generated after VIN+ == VIN-). */ + NRFX_COMP_EVT_EN_UP_MASK = COMP_INTENSET_UP_Msk, /*!< UP event (generated when VIN+ crosses VIN- while increasing). */ + NRFX_COMP_EVT_EN_DOWN_MASK = COMP_INTENSET_DOWN_Msk, /*!< DOWN event (generated when VIN+ crosses VIN- while decreasing). */ + NRFX_COMP_EVT_EN_READY_MASK = COMP_INTENSET_READY_Msk /*!< READY event (generated when the module is ready). */ +} nrfx_comp_evt_en_mask_t; + +/** @brief COMP configuration. */ +typedef struct +{ + nrf_comp_ref_t reference; /**< Reference selection. */ + nrf_comp_ext_ref_t ext_ref; /**< External analog reference selection. */ + nrf_comp_main_mode_t main_mode; /**< Main operation mode. */ + nrf_comp_th_t threshold; /**< Structure holding THDOWN and THUP values needed by the COMP_TH register. */ + nrf_comp_sp_mode_t speed_mode; /**< Speed and power mode. */ + nrf_comp_hyst_t hyst; /**< Comparator hysteresis.*/ +#if defined (COMP_ISOURCE_ISOURCE_Msk) || defined (__NRFX_DOXYGEN__) + nrf_isource_t isource; /**< Current source selected on analog input. */ +#endif + nrf_comp_input_t input; /**< Input to be monitored. */ + uint8_t interrupt_priority; /**< Interrupt priority. */ +} nrfx_comp_config_t; + +/** @brief COMP threshold default configuration. */ +#define NRFX_COMP_CONFIG_TH \ +{ \ + .th_down = NRFX_VOLTAGE_THRESHOLD_TO_INT(0.5, 1.8), \ + .th_up = NRFX_VOLTAGE_THRESHOLD_TO_INT(1.5, 1.8) \ +} + +/** @brief COMP driver default configuration including the COMP HAL configuration. */ +#if defined (COMP_ISOURCE_ISOURCE_Msk) || defined (__NRFX_DOXYGEN__) +#define NRFX_COMP_DEFAULT_CONFIG(_input) \ +{ \ + .reference = (nrf_comp_ref_t)NRFX_COMP_CONFIG_REF, \ + .main_mode = (nrf_comp_main_mode_t)NRFX_COMP_CONFIG_MAIN_MODE, \ + .threshold = NRFX_COMP_CONFIG_TH, \ + .speed_mode = (nrf_comp_sp_mode_t)NRFX_COMP_CONFIG_SPEED_MODE, \ + .hyst = (nrf_comp_hyst_t)NRFX_COMP_CONFIG_HYST, \ + .isource = (nrf_isource_t)NRFX_COMP_CONFIG_ISOURCE, \ + .input = (nrf_comp_input_t)_input, \ + .interrupt_priority = NRFX_COMP_CONFIG_IRQ_PRIORITY \ +} +#else +#define NRFX_COMP_DEFAULT_CONFIG(_input) \ +{ \ + .reference = (nrf_comp_ref_t)NRFX_COMP_CONFIG_REF, \ + .main_mode = (nrf_comp_main_mode_t)NRFX_COMP_CONFIG_MAIN_MODE, \ + .threshold = NRFX_COMP_CONFIG_TH, \ + .speed_mode = (nrf_comp_sp_mode_t)NRFX_COMP_CONFIG_SPEED_MODE, \ + .hyst = (nrf_comp_hyst_t)NRFX_COMP_CONFIG_HYST, \ + .input = (nrf_comp_input_t)_input, \ + .interrupt_priority = NRFX_COMP_CONFIG_IRQ_PRIORITY \ +} +#endif + +/** + * @brief Function for initializing the COMP driver. + * + * This function initializes the COMP driver, but does not enable the peripheral or any interrupts. + * To start the driver, call the function @ref nrfx_comp_start() after initialization. + * + * @param[in] p_config Pointer to the structure with initial configuration. + * @param[in] event_handler Event handler provided by the user. + * Must not be NULL. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the driver has already been initialized. + * @retval NRFX_ERROR_BUSY If the LPCOMP peripheral is already in use. + * This is possible only if @ref nrfx_prs module + * is enabled. + */ +nrfx_err_t nrfx_comp_init(nrfx_comp_config_t const * p_config, + nrfx_comp_event_handler_t event_handler); + + +/** + * @brief Function for uninitializing the COMP driver. + * + * This function uninitializes the COMP driver. The COMP peripheral and + * its interrupts are disabled, and local variables are cleaned. After this call, you must + * initialize the driver again by calling nrfx_comp_init() if you want to use it. + * + * @sa nrfx_comp_stop() + */ +void nrfx_comp_uninit(void); + +/** + * @brief Function for setting the analog input. + * + * @param[in] psel COMP analog pin selection. + */ +void nrfx_comp_pin_select(nrf_comp_input_t psel); + +/** + * @brief Function for starting the COMP peripheral and interrupts. + * + * Before calling this function, the driver must be initialized. This function + * enables the COMP peripheral and its interrupts. + * + * @param[in] comp_evt_en_mask Mask of events to be enabled. This parameter should be built as + * 'or' of elements from @ref nrfx_comp_evt_en_mask_t. + * @param[in] comp_shorts_mask Mask of shorts to be enabled. This parameter should be built as + * 'or' of elements from @ref nrfx_comp_short_mask_t. + * + * @sa nrfx_comp_init() + * + */ +void nrfx_comp_start(uint32_t comp_evt_en_mask, uint32_t comp_shorts_mask); + +/**@brief Function for stopping the COMP peripheral. + * + * Before calling this function, the driver must be enabled. This function disables the COMP + * peripheral and its interrupts. + * + * @sa nrfx_comp_uninit() + * + */ +void nrfx_comp_stop(void); + +/** + * @brief Function for copying the current state of the comparator result to the RESULT register. + * + * @retval 0 If the input voltage is below the threshold (VIN+ < VIN-). + * @retval 1 If the input voltage is above the threshold (VIN+ > VIN-). + */ +uint32_t nrfx_comp_sample(void); + +/** + * @brief Function for getting the address of a COMP task. + * + * @param[in] task COMP task. + * + * @return Address of the given COMP task. + */ +__STATIC_INLINE uint32_t nrfx_comp_task_address_get(nrf_comp_task_t task) +{ + return (uint32_t)nrf_comp_task_address_get(task); +} + +/** + * @brief Function for getting the address of a COMP event. + * + * @param[in] event COMP event. + * + * @return Address of the given COMP event. + */ +__STATIC_INLINE uint32_t nrfx_comp_event_address_get(nrf_comp_event_t event) +{ + return (uint32_t)nrf_comp_event_address_get(event); +} + + +void nrfx_comp_irq_handler(void); + + +/** @} **/ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_COMP_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_gpiote.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_gpiote.h new file mode 100644 index 0000000000..ee79e6d94f --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_gpiote.h @@ -0,0 +1,423 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_GPIOTE_H__ +#define NRFX_GPIOTE_H__ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_gpiote GPIOTE driver + * @{ + * @ingroup nrf_gpiote + * @brief GPIOTE peripheral driver. + */ + +/**@brief Input pin configuration. */ +typedef struct +{ + nrf_gpiote_polarity_t sense; /**< Transition that triggers interrupt. */ + nrf_gpio_pin_pull_t pull; /**< Pulling mode. */ + bool is_watcher : 1; /**< True when the input pin is tracking an output pin. */ + bool hi_accuracy : 1; /**< True when high accuracy (IN_EVENT) is used. */ + bool skip_gpio_setup : 1; /**< Do not change GPIO configuration */ +} nrfx_gpiote_in_config_t; + +/**@brief Macro for configuring a pin to use a GPIO IN or PORT EVENT to detect low-to-high transition. + * @details Set hi_accu to true to use IN_EVENT. */ +#define NRFX_GPIOTE_CONFIG_IN_SENSE_LOTOHI(hi_accu) \ + { \ + .is_watcher = false, \ + .hi_accuracy = hi_accu, \ + .pull = NRF_GPIO_PIN_NOPULL, \ + .sense = NRF_GPIOTE_POLARITY_LOTOHI, \ + } + +/**@brief Macro for configuring a pin to use a GPIO IN or PORT EVENT to detect high-to-low transition. + * @details Set hi_accu to true to use IN_EVENT. */ +#define NRFX_GPIOTE_CONFIG_IN_SENSE_HITOLO(hi_accu) \ + { \ + .is_watcher = false, \ + .hi_accuracy = hi_accu, \ + .pull = NRF_GPIO_PIN_NOPULL, \ + .sense = NRF_GPIOTE_POLARITY_HITOLO, \ + } + +/**@brief Macro for configuring a pin to use a GPIO IN or PORT EVENT to detect any change on the pin. + * @details Set hi_accu to true to use IN_EVENT.*/ +#define NRFX_GPIOTE_CONFIG_IN_SENSE_TOGGLE(hi_accu) \ + { \ + .is_watcher = false, \ + .hi_accuracy = hi_accu, \ + .pull = NRF_GPIO_PIN_NOPULL, \ + .sense = NRF_GPIOTE_POLARITY_TOGGLE, \ + } + +/**@brief Macro for configuring a pin to use a GPIO IN or PORT EVENT to detect low-to-high transition. + * @details Set hi_accu to true to use IN_EVENT. + * @note This macro prepares configuration that skips GPIO setup. */ +#define NRFX_GPIOTE_RAW_CONFIG_IN_SENSE_LOTOHI(hi_accu) \ + { \ + .is_watcher = false, \ + .hi_accuracy = hi_accu, \ + .pull = NRF_GPIO_PIN_NOPULL, \ + .sense = NRF_GPIOTE_POLARITY_LOTOHI, \ + .skip_gpio_setup = true, \ + } + +/**@brief Macro for configuring a pin to use a GPIO IN or PORT EVENT to detect high-to-low transition. + * @details Set hi_accu to true to use IN_EVENT. + * @note This macro prepares configuration that skips GPIO setup. */ +#define NRFX_GPIOTE_RAW_CONFIG_IN_SENSE_HITOLO(hi_accu) \ + { \ + .is_watcher = false, \ + .hi_accuracy = hi_accu, \ + .pull = NRF_GPIO_PIN_NOPULL, \ + .sense = NRF_GPIOTE_POLARITY_HITOLO, \ + .skip_gpio_setup = true, \ + } + +/**@brief Macro for configuring a pin to use a GPIO IN or PORT EVENT to detect any change on the pin. + * @details Set hi_accu to true to use IN_EVENT. + * @note This macro prepares configuration that skips GPIO setup. */ +#define NRFX_GPIOTE_RAW_CONFIG_IN_SENSE_TOGGLE(hi_accu) \ + { \ + .is_watcher = false, \ + .hi_accuracy = hi_accu, \ + .pull = NRF_GPIO_PIN_NOPULL, \ + .sense = NRF_GPIOTE_POLARITY_TOGGLE, \ + .skip_gpio_setup = true, \ + } + + +/**@brief Output pin configuration. */ +typedef struct +{ + nrf_gpiote_polarity_t action; /**< Configuration of the pin task. */ + nrf_gpiote_outinit_t init_state; /**< Initial state of the output pin. */ + bool task_pin; /**< True if the pin is controlled by a GPIOTE task. */ +} nrfx_gpiote_out_config_t; + +/**@brief Macro for configuring a pin to use as output. GPIOTE is not used for the pin. */ +#define NRFX_GPIOTE_CONFIG_OUT_SIMPLE(init_high) \ + { \ + .init_state = init_high ? NRF_GPIOTE_INITIAL_VALUE_HIGH : NRF_GPIOTE_INITIAL_VALUE_LOW, \ + .task_pin = false, \ + } + +/**@brief Macro for configuring a pin to use the GPIO OUT TASK to change the state from high to low. + * @details The task will clear the pin. Therefore, the pin is set initially. */ +#define NRFX_GPIOTE_CONFIG_OUT_TASK_LOW \ + { \ + .init_state = NRF_GPIOTE_INITIAL_VALUE_HIGH, \ + .task_pin = true, \ + .action = NRF_GPIOTE_POLARITY_HITOLO, \ + } + +/**@brief Macro for configuring a pin to use the GPIO OUT TASK to change the state from low to high. + * @details The task will set the pin. Therefore, the pin is cleared initially. */ +#define NRFX_GPIOTE_CONFIG_OUT_TASK_HIGH \ + { \ + .init_state = NRF_GPIOTE_INITIAL_VALUE_LOW, \ + .task_pin = true, \ + .action = NRF_GPIOTE_POLARITY_LOTOHI, \ + } + +/**@brief Macro for configuring a pin to use the GPIO OUT TASK to toggle the pin state. + * @details The initial pin state must be provided. */ +#define NRFX_GPIOTE_CONFIG_OUT_TASK_TOGGLE(init_high) \ + { \ + .init_state = init_high ? NRF_GPIOTE_INITIAL_VALUE_HIGH : NRF_GPIOTE_INITIAL_VALUE_LOW, \ + .task_pin = true, \ + .action = NRF_GPIOTE_POLARITY_TOGGLE, \ + } + +/** @brief Pin. */ +typedef uint32_t nrfx_gpiote_pin_t; + +/** + * @brief Pin event handler prototype. + * + * @param pin Pin that triggered this event. + * @param action Action that lead to triggering this event. + */ +typedef void (*nrfx_gpiote_evt_handler_t)(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action); + +/** + * @brief Function for initializing the GPIOTE module. + * + * @details Only static configuration is supported to prevent the shared + * resource being customized by the initiator. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the driver was already initialized. + */ +nrfx_err_t nrfx_gpiote_init(void); + +/** + * @brief Function for checking if the GPIOTE module is initialized. + * + * @details The GPIOTE module is a shared module. Therefore, you should check if + * the module is already initialized and skip initialization if it is. + * + * @retval true If the module is already initialized. + * @retval false If the module is not initialized. + */ +bool nrfx_gpiote_is_init(void); + +/** + * @brief Function for uninitializing the GPIOTE module. + */ +void nrfx_gpiote_uninit(void); + +/** + * @brief Function for initializing a GPIOTE output pin. + * @details The output pin can be controlled by the CPU or by PPI. The initial + * configuration specifies which mode is used. If PPI mode is used, the driver + * attempts to allocate one of the available GPIOTE channels. If no channel is + * available, an error is returned. + * + * @param[in] pin Pin. + * @param[in] p_config Initial configuration. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the driver is not initialized or the pin is already used. + * @retval NRFX_ERROR_NO_MEM If no GPIOTE channel is available. + */ +nrfx_err_t nrfx_gpiote_out_init(nrfx_gpiote_pin_t pin, + nrfx_gpiote_out_config_t const * p_config); + +/** + * @brief Function for uninitializing a GPIOTE output pin. + * @details The driver frees the GPIOTE channel if the output pin was using one. + * + * @param[in] pin Pin. + */ +void nrfx_gpiote_out_uninit(nrfx_gpiote_pin_t pin); + +/** + * @brief Function for setting a GPIOTE output pin. + * + * @param[in] pin Pin. + */ +void nrfx_gpiote_out_set(nrfx_gpiote_pin_t pin); + +/** + * @brief Function for clearing a GPIOTE output pin. + * + * @param[in] pin Pin. + */ +void nrfx_gpiote_out_clear(nrfx_gpiote_pin_t pin); + +/** + * @brief Function for toggling a GPIOTE output pin. + * + * @param[in] pin Pin. + */ +void nrfx_gpiote_out_toggle(nrfx_gpiote_pin_t pin); + +/** + * @brief Function for enabling a GPIOTE output pin task. + * + * @param[in] pin Pin. + */ +void nrfx_gpiote_out_task_enable(nrfx_gpiote_pin_t pin); + +/** + * @brief Function for disabling a GPIOTE output pin task. + * + * @param[in] pin Pin. + */ +void nrfx_gpiote_out_task_disable(nrfx_gpiote_pin_t pin); + +/** + * @brief Function for getting the address of a configurable GPIOTE task. + * + * @param[in] pin Pin. + * + * @return Address of OUT task. + */ +uint32_t nrfx_gpiote_out_task_addr_get(nrfx_gpiote_pin_t pin); + +#if defined(GPIOTE_FEATURE_SET_PRESENT) || defined(__NRFX_DOXYGEN__) +/** + * @brief Function for getting the address of a configurable GPIOTE task. + * + * @param[in] pin Pin. + * + * @return Address of SET task. + */ +uint32_t nrfx_gpiote_set_task_addr_get(nrfx_gpiote_pin_t pin); +#endif // defined(GPIOTE_FEATURE_SET_PRESENT) || defined(__NRFX_DOXYGEN__) + +#if defined(GPIOTE_FEATURE_CLR_PRESENT) || defined(__NRFX_DOXYGEN__) +/** + * @brief Function for getting the address of a configurable GPIOTE task. + * + * @param[in] pin Pin. + * + * @return Address of CLR task. + */ +uint32_t nrfx_gpiote_clr_task_addr_get(nrfx_gpiote_pin_t pin); +#endif // defined(GPIOTE_FEATURE_CLR_PRESENT) || defined(__NRFX_DOXYGEN__) + +/** + * @brief Function for initializing a GPIOTE input pin. + * @details The input pin can act in two ways: + * - lower accuracy but low power (high frequency clock not needed) + * - higher accuracy (high frequency clock required) + * + * The initial configuration specifies which mode is used. + * If high-accuracy mode is used, the driver attempts to allocate one + * of the available GPIOTE channels. If no channel is + * available, an error is returned. + * In low accuracy mode SENSE feature is used. In this case only one active pin + * can be detected at a time. It can be worked around by setting all of the used + * low accuracy pins to toggle mode. + * For more information about SENSE functionality, refer to Product Specification. + * + * @param[in] pin Pin. + * @param[in] p_config Initial configuration. + * @param[in] evt_handler User function to be called when the configured transition occurs. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the driver is not initialized or the pin is already used. + * @retval NRFX_ERROR_NO_MEM If no GPIOTE channel is available. + */ +nrfx_err_t nrfx_gpiote_in_init(nrfx_gpiote_pin_t pin, + nrfx_gpiote_in_config_t const * p_config, + nrfx_gpiote_evt_handler_t evt_handler); + +/** + * @brief Function for uninitializing a GPIOTE input pin. + * @details The driver frees the GPIOTE channel if the input pin was using one. + * + * @param[in] pin Pin. + */ +void nrfx_gpiote_in_uninit(nrfx_gpiote_pin_t pin); + +/** + * @brief Function for enabling sensing of a GPIOTE input pin. + * + * @details If the input pin is configured as high-accuracy pin, the function + * enables an IN_EVENT. Otherwise, the function enables the GPIO sense mechanism. + * Note that a PORT event is shared between multiple pins, therefore the + * interrupt is always enabled. + * + * @param[in] pin Pin. + * @param[in] int_enable True to enable the interrupt. Always valid for a high-accuracy pin. + */ +void nrfx_gpiote_in_event_enable(nrfx_gpiote_pin_t pin, bool int_enable); + +/** + * @brief Function for disabling a GPIOTE input pin. + * + * @param[in] pin Pin. + */ +void nrfx_gpiote_in_event_disable(nrfx_gpiote_pin_t pin); + +/** + * @brief Function for checking if a GPIOTE input pin is set. + * + * @param[in] pin Pin. + * + * @retval true If the input pin is set. + * @retval false If the input pin is not set. + */ +bool nrfx_gpiote_in_is_set(nrfx_gpiote_pin_t pin); + +/** + * @brief Function for getting the address of a GPIOTE input pin event. + * @details If the pin is configured to use low-accuracy mode, the address of the PORT event is returned. + * + * @param[in] pin Pin. + */ +uint32_t nrfx_gpiote_in_event_addr_get(nrfx_gpiote_pin_t pin); + +/** + * @brief Function for forcing a specific state on the pin configured as task. + * + * @param[in] pin Pin. + * @param[in] state Pin state. + */ +void nrfx_gpiote_out_task_force(nrfx_gpiote_pin_t pin, uint8_t state); + +/** + * @brief Function for triggering the task OUT manually. + * + * @param[in] pin Pin. + */ +void nrfx_gpiote_out_task_trigger(nrfx_gpiote_pin_t pin); + +#if defined(GPIOTE_FEATURE_SET_PRESENT) || defined(__NRFX_DOXYGEN__) +/** + * @brief Function for triggering the task SET manually. + * + * @param[in] pin Pin. + */ +void nrfx_gpiote_set_task_trigger(nrfx_gpiote_pin_t pin); +#endif // defined(GPIOTE_FEATURE_SET_PRESENT) || defined(__NRFX_DOXYGEN__) + +#if defined(GPIOTE_FEATURE_CLR_PRESENT) || defined(__NRFX_DOXYGEN__) +/** + * @brief Function for triggering the task CLR manually. + * + * @param[in] pin Pin. + */ +void nrfx_gpiote_clr_task_trigger(nrfx_gpiote_pin_t pin); +#endif // defined(GPIOTE_FEATURE_CLR_PRESENT) || defined(__NRFX_DOXYGEN__) + + +void nrfx_gpiote_irq_handler(void); + + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_GPIOTE_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_i2s.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_i2s.h new file mode 100644 index 0000000000..f64fa210cf --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_i2s.h @@ -0,0 +1,254 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_I2S_H__ +#define NRFX_I2S_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_i2s I2S driver + * @{ + * @ingroup nrf_i2s + * @brief Inter-IC Sound (I2S) peripheral driver. + */ + + +/** + * @brief This value can be provided instead of a pin number for the signals + * SDOUT, SDIN, and MCK to specify that a given signal is not used + * and therefore does not need to be connected to a pin. + */ +#define NRFX_I2S_PIN_NOT_USED 0xFF + +/** @brief I2S driver configuration structure. */ +typedef struct +{ + uint8_t sck_pin; ///< SCK pin number. + uint8_t lrck_pin; ///< LRCK pin number. + uint8_t mck_pin; ///< MCK pin number. + /**< Optional. Use @ref NRFX_I2S_PIN_NOT_USED + * if this signal is not needed. */ + uint8_t sdout_pin; ///< SDOUT pin number. + /**< Optional. Use @ref NRFX_I2S_PIN_NOT_USED + * if this signal is not needed. */ + uint8_t sdin_pin; ///< SDIN pin number. + /**< Optional. Use @ref NRFX_I2S_PIN_NOT_USED + * if this signal is not needed. */ + uint8_t irq_priority; ///< Interrupt priority. + + nrf_i2s_mode_t mode; ///< Mode of operation. + nrf_i2s_format_t format; ///< Frame format. + nrf_i2s_align_t alignment; ///< Alignment of sample within a frame. + nrf_i2s_swidth_t sample_width; ///< Sample width. + nrf_i2s_channels_t channels; ///< Enabled channels. + nrf_i2s_mck_t mck_setup; ///< Master clock setup. + nrf_i2s_ratio_t ratio; ///< MCK/LRCK ratio. +} nrfx_i2s_config_t; + +/** @brief I2S driver buffers structure. */ +typedef struct +{ + uint32_t * p_rx_buffer; + uint32_t const * p_tx_buffer; +} nrfx_i2s_buffers_t; + +/** + * @brief I2S driver default configuration. + */ +#define NRFX_I2S_DEFAULT_CONFIG \ +{ \ + .sck_pin = NRFX_I2S_CONFIG_SCK_PIN, \ + .lrck_pin = NRFX_I2S_CONFIG_LRCK_PIN, \ + .mck_pin = NRFX_I2S_CONFIG_MCK_PIN, \ + .sdout_pin = NRFX_I2S_CONFIG_SDOUT_PIN, \ + .sdin_pin = NRFX_I2S_CONFIG_SDIN_PIN, \ + .irq_priority = NRFX_I2S_CONFIG_IRQ_PRIORITY, \ + .mode = (nrf_i2s_mode_t)NRFX_I2S_CONFIG_MASTER, \ + .format = (nrf_i2s_format_t)NRFX_I2S_CONFIG_FORMAT, \ + .alignment = (nrf_i2s_align_t)NRFX_I2S_CONFIG_ALIGN, \ + .sample_width = (nrf_i2s_swidth_t)NRFX_I2S_CONFIG_SWIDTH, \ + .channels = (nrf_i2s_channels_t)NRFX_I2S_CONFIG_CHANNELS, \ + .mck_setup = (nrf_i2s_mck_t)NRFX_I2S_CONFIG_MCK_SETUP, \ + .ratio = (nrf_i2s_ratio_t)NRFX_I2S_CONFIG_RATIO, \ +} + + +#define NRFX_I2S_STATUS_NEXT_BUFFERS_NEEDED (1UL << 0) + /**< The application should provide buffers that are to be used in the next + * part of the transfer. A call to @ref nrfx_i2s_next_buffers_set should + * be done before the currently used buffers are completely processed + * (i.e. the time remaining for supplying the next buffers depends on + * the used size of the buffers). */ + +/** + * @brief I2S driver data handler type. + * + * A data handling function of this type must be specified during initialization + * of the driver. The driver will call this function when it finishes using + * buffers passed to it by the application, and when it needs to be provided + * with buffers for the next part of the transfer. + * + * @note The @c p_released pointer passed to this function is temporary and + * will be invalid after the function returns, hence it cannot be stored + * and used later. If needed, the pointed content (i.e. buffers pointers) + * should be copied instead. + * + * @param[in] p_released Pointer to a structure with pointers to buffers + * passed previously to the driver that will no longer + * be access by it (they can be now safely released or + * used for another purpose, in particular for a next + * part of the transfer). + * This pointer will be NULL if the application did not + * supply the buffers for the next part of the transfer + * (via a call to @ref nrfx_i2s_next_buffers_set) since + * the previous time the data handler signaled such need. + * This means that data corruption occurred (the previous + * buffers are used for the second time) and no buffers + * can be released at the moment. + * Both pointers in this structure are NULL when the + * handler is called for the first time after a transfer + * is started, because no data has been transferred yet + * at this point. In all successive calls the pointers + * specify what has been sent (TX) and what has been + * received (RX) in the part of transfer that has just + * been completed (provided that a given direction is + * enabled, see @ref nrfx_i2s_start). + * @param[in] status Bit field describing the current status of the transfer. + * It can be 0 or a combination of the following flags: + * - @ref NRFX_I2S_STATUS_NEXT_BUFFERS_NEEDED + */ +typedef void (* nrfx_i2s_data_handler_t)(nrfx_i2s_buffers_t const * p_released, + uint32_t status); + + +/** + * @brief Function for initializing the I2S driver. + * + * @param[in] p_config Pointer to the structure with initial configuration. + * @param[in] handler Data handler provided by the user. Must not be NULL. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the driver was already initialized. + * @retval NRFX_ERROR_INVALID_PARAM If the requested combination of configuration + * options is not allowed by the I2S peripheral. + */ +nrfx_err_t nrfx_i2s_init(nrfx_i2s_config_t const * p_config, + nrfx_i2s_data_handler_t handler); + +/** @brief Function for uninitializing the I2S driver. */ +void nrfx_i2s_uninit(void); + +/** + * @brief Function for starting the continuous I2S transfer. + * + * The I2S data transfer can be performed in one of three modes: RX (reception) + * only, TX (transmission) only, or in both directions simultaneously. + * The mode is selected by specifying a proper buffer for a given direction + * in the call to this function or by passing NULL instead if this direction + * should be disabled. + * + * The length of the buffer (which is a common value for RX and TX if both + * directions are enabled) is specified in 32-bit words. One 32-bit memory + * word can either contain four 8-bit samples, two 16-bit samples, or one + * right-aligned 24-bit sample sign-extended to a 32-bit value. + * For a detailed memory mapping for different supported configurations, + * see the @linkProductSpecification52. + * + * @note Peripherals using EasyDMA (including I2S) require the transfer buffers + * to be placed in the Data RAM region. If this condition is not met, + * this function will fail with the error code NRFX_ERROR_INVALID_ADDR. + * + * @param[in] p_initial_buffers Pointer to a structure specifying the buffers + * to be used in the initial part of the transfer + * (buffers for all consecutive parts are provided + * through the data handler). + * @param[in] buffer_size Size of the buffers (in 32-bit words). + * Must not be 0. + * @param[in] flags Transfer options (0 for default settings). + * Currently, no additional flags are available. + * + * @retval NRFX_SUCCESS If the operation was successful. + * @retval NRFX_ERROR_INVALID_STATE If a transfer was already started or + * the driver has not been initialized. + * @retval NRFX_ERROR_INVALID_ADDR If the provided buffers are not placed + * in the Data RAM region. + */ +nrfx_err_t nrfx_i2s_start(nrfx_i2s_buffers_t const * p_initial_buffers, + uint16_t buffer_size, + uint8_t flags); + +/** + * @brief Function for supplying the buffers to be used in the next part of + * the transfer. + * + * The application should call this function when the data handler receives + * @ref NRFX_I2S_STATUS_NEXT_BUFFERS_NEEDED in the @c status parameter. + * The call can be done immediately from the data handler function or later, + * but it has to be done before the I2S peripheral finishes processing the + * buffers supplied previously. Otherwise, data corruption will occur. + * + * @sa nrfx_i2s_data_handler_t + * + * @retval NRFX_SUCCESS If the operation was successful. + * @retval NRFX_ERROR_INVALID_STATE If the buffers were already supplied or + * the peripheral is currently being stopped. + */ +nrfx_err_t nrfx_i2s_next_buffers_set(nrfx_i2s_buffers_t const * p_buffers); + +/** @brief Function for stopping the I2S transfer. */ +void nrfx_i2s_stop(void); + +/** @} */ + + +void nrfx_i2s_irq_handler(void); + + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_I2S_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/lpcomp/nrf_drv_lpcomp.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_lpcomp.h similarity index 50% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/lpcomp/nrf_drv_lpcomp.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_lpcomp.h index 7cd1852873..f6744a332a 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/lpcomp/nrf_drv_lpcomp.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_lpcomp.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,60 +37,55 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -#ifndef NRF_DRV_LPCOMP_H__ -#define NRF_DRV_LPCOMP_H__ -#include "nrf_lpcomp.h" -#include "sdk_errors.h" -#include "nrf_drv_common.h" -#include "sdk_config.h" +#ifndef NRFX_LPCOMP_H__ +#define NRFX_LPCOMP_H__ + +#include +#include #ifdef __cplusplus extern "C" { #endif /** - * @addtogroup nrf_lpcomp LPCOMP HAL and driver - * @ingroup nrf_drivers - * @brief Low Power Comparator (LPCOMP) APIs. - * @details The LPCOMP HAL provides basic APIs for accessing the registers of Low Power Comparator. - * The LPCOMP driver provides APIs on a higher level. - * - * @defgroup nrf_drv_lpcomp LPCOMP driver + * @defgroup nrfx_lpcomp LPCOMP driver * @{ * @ingroup nrf_lpcomp - * @brief Low Power Comparator (LPCOMP) driver. + * @brief Low Power Comparator (LPCOMP) peripheral driver. */ -/**@brief LPCOMP event handler function type. +/** + * @brief LPCOMP event handler function type. * @param[in] event LPCOMP event. */ -typedef void (* lpcomp_events_handler_t)(nrf_lpcomp_event_t event); +typedef void (* nrfx_lpcomp_event_handler_t)(nrf_lpcomp_event_t event); -/**@brief LPCOMP configuration. - */ +/** @brief LPCOMP configuration. */ typedef struct { - nrf_lpcomp_config_t hal; /**< LPCOMP HAL configuration. */ - nrf_lpcomp_input_t input; /**< Input to be monitored. */ - uint8_t interrupt_priority; /**< LPCOMP interrupt priority. */ -} nrf_drv_lpcomp_config_t; + nrf_lpcomp_config_t hal; /**< LPCOMP HAL configuration. */ + nrf_lpcomp_input_t input; /**< Input to be monitored. */ + uint8_t interrupt_priority; /**< LPCOMP interrupt priority. */ +} nrfx_lpcomp_config_t; /** @brief LPCOMP driver default configuration including the LPCOMP HAL configuration. */ #ifdef NRF52_SERIES -#define NRF_DRV_LPCOMP_DEFAULT_CONFIG \ - { \ - .hal = {(nrf_lpcomp_ref_t)LPCOMP_CONFIG_REFERENCE , (nrf_lpcomp_detect_t)LPCOMP_CONFIG_DETECTION, \ - (nrf_lpcomp_hysteresis_t)LPCOMP_CONFIG_HYST}, \ - .input = (nrf_lpcomp_input_t)LPCOMP_CONFIG_INPUT, \ - .interrupt_priority = LPCOMP_CONFIG_IRQ_PRIORITY \ +#define NRFX_LPCOMP_DEFAULT_CONFIG \ + { \ + .hal = { (nrf_lpcomp_ref_t)NRFX_LPCOMP_CONFIG_REFERENCE , \ + (nrf_lpcomp_detect_t)NRFX_LPCOMP_CONFIG_DETECTION, \ + (nrf_lpcomp_hysteresis_t)NRFX_LPCOMP_CONFIG_HYST }, \ + .input = (nrf_lpcomp_input_t)NRFX_LPCOMP_CONFIG_INPUT, \ + .interrupt_priority = NRFX_LPCOMP_CONFIG_IRQ_PRIORITY \ } #else -#define NRF_DRV_LPCOMP_DEFAULT_CONFIG \ - { \ - .hal = {(nrf_lpcomp_ref_t)LPCOMP_CONFIG_REFERENCE , (nrf_lpcomp_detect_t)LPCOMP_CONFIG_DETECTION}, \ - .input = (nrf_lpcomp_input_t)LPCOMP_CONFIG_INPUT, \ - .interrupt_priority = LPCOMP_CONFIG_IRQ_PRIORITY \ +#define NRFX_LPCOMP_DEFAULT_CONFIG \ + { \ + .hal = { (nrf_lpcomp_ref_t)NRFX_LPCOMP_CONFIG_REFERENCE , \ + (nrf_lpcomp_detect_t)NRFX_LPCOMP_CONFIG_DETECTION }, \ + .input = (nrf_lpcomp_input_t)NRFX_LPCOMP_CONFIG_INPUT, \ + .interrupt_priority = NRFX_LPCOMP_CONFIG_IRQ_PRIORITY \ } #endif @@ -98,56 +93,58 @@ typedef struct * @brief Function for initializing the LPCOMP driver. * * This function initializes the LPCOMP driver, but does not enable the peripheral or any interrupts. - * To start the driver, call the function nrf_drv_lpcomp_enable() after initialization. + * To start the driver, call the function nrfx_lpcomp_enable() after initialization. * - * If no configuration structure is provided, the driver is initialized with the default settings. + * @param[in] p_config Pointer to the structure with initial configuration. + * @param[in] event_handler Event handler provided by the user. + * Must not be NULL. * - * @param[in] p_config Initial configuration. If NULL, the default configuration is used. - * @param[in] events_handler Handler function. - * @retval NRF_ERROR_INVALID_PARAM If the configuration is invalid. - * @retval NRF_ERROR_INVALID_STATE If the driver has already been initialized. + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the driver has already been initialized. + * @retval NRFX_ERROR_BUSY If the COMP peripheral is already in use. + * This is possible only if @ref nrfx_prs module + * is enabled. */ -ret_code_t nrf_drv_lpcomp_init(const nrf_drv_lpcomp_config_t * p_config, - lpcomp_events_handler_t events_handler); - +nrfx_err_t nrfx_lpcomp_init(nrfx_lpcomp_config_t const * p_config, + nrfx_lpcomp_event_handler_t event_handler); /** * @brief Function for uninitializing the LCOMP driver. * * This function uninitializes the LPCOMP driver. The LPCOMP peripheral and * its interrupts are disabled, and local variables are cleaned. After this call, you must - * initialize the driver again by calling nrf_drv_lpcomp_init() if you want to use it. + * initialize the driver again by calling nrfx_lpcomp_init() if you want to use it. * - * @sa nrf_drv_lpcomp_disable() - * @sa nrf_drv_lpcomp_init() + * @sa nrfx_lpcomp_disable() + * @sa nrfx_lpcomp_init() */ -void nrf_drv_lpcomp_uninit(void); +void nrfx_lpcomp_uninit(void); /**@brief Function for enabling the LPCOMP peripheral and interrupts. * * Before calling this function, the driver must be initialized. This function * enables the LPCOMP peripheral and its interrupts. * - * @sa nrf_drv_lpcomp_disable() + * @sa nrfx_lpcomp_disable() */ -void nrf_drv_lpcomp_enable(void); +void nrfx_lpcomp_enable(void); /**@brief Function for disabling the LPCOMP peripheral. * * Before calling this function, the driver must be initialized. This function disables the LPCOMP * peripheral and its interrupts. * - * @sa nrf_drv_lpcomp_enable() + * @sa nrfx_lpcomp_enable() */ -void nrf_drv_lpcomp_disable(void); +void nrfx_lpcomp_disable(void); -/** - *@} - **/ +void nrfx_lpcomp_irq_handler(void); + +/** @} **/ #ifdef __cplusplus } #endif - #endif /* NRF_DRV_LPCOMP_H__ */ +#endif // NRFX_LPCOMP_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/pdm/nrf_drv_pdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_pdm.h similarity index 54% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/pdm/nrf_drv_pdm.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_pdm.h index 7e718857a6..f2201c97fd 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/pdm/nrf_drv_pdm.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_pdm.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,35 +37,26 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @addtogroup nrf_pdm PDM HAL and driver - * @ingroup nrf_drivers - * @brief @tagAPI52 Pulse density modulation (PDM) interface APIs. - * - * The PDM HAL provides basic APIs for accessing the registers of the PDM interface peripheral. - * The PDM driver provides APIs on a higher level. - * - * @defgroup nrf_drv_pdm PDM driver - * @{ - * @ingroup nrf_pdm - * - * @brief @tagAPI52 Pulse density modulation (PDM) interface driver. - */ +#ifndef NRFX_PDM_H__ +#define NRFX_PDM_H__ -#ifndef NRF_DRV_PDM_H__ -#define NRF_DRV_PDM_H__ - -#include "sdk_config.h" -#include "nrf_pdm.h" -#include "sdk_errors.h" +#include +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrfx_pdm PDM driver + * @{ + * @ingroup nrf_pdm + * @brief Pulse Density Modulation (PDM) peripheral driver. + */ -#define NRF_PDM_MAX_BUFFER_SIZE 32767 + +#define NRFX_PDM_MAX_BUFFER_SIZE 32767 /** @@ -73,19 +64,19 @@ extern "C" { */ typedef enum { - PDM_NO_ERROR = 0, - PDM_ERROR_OVERFLOW = 1 -} nrf_drv_pdm_error_t; + NRFX_PDM_NO_ERROR = 0, + NRFX_PDM_ERROR_OVERFLOW = 1 +} nrfx_pdm_error_t; /** * @brief PDM event structure. */ typedef struct { - bool buffer_requested; ///< Buffer request flag. - int16_t * buffer_released; ///< Pointer to the released buffer. Can be NULL. - nrf_drv_pdm_error_t error; ///< Error type. -} nrf_drv_pdm_evt_t; + bool buffer_requested; ///< Buffer request flag. + int16_t * buffer_released; ///< Pointer to the released buffer. Can be NULL. + nrfx_pdm_error_t error; ///< Error type. +} nrfx_pdm_evt_t; /** * @brief PDM interface driver configuration structure. @@ -100,61 +91,57 @@ typedef struct nrf_pdm_gain_t gain_l; ///< Left channel gain. nrf_pdm_gain_t gain_r; ///< Right channel gain. uint8_t interrupt_priority; ///< Interrupt priority. -} nrf_drv_pdm_config_t; - +} nrfx_pdm_config_t; /** - * @brief Macro for setting @ref nrf_drv_pdm_config_t to default settings + * @brief Macro for setting @ref nrfx_pdm_config_t to default settings * in single ended mode. * - * @param PIN_CLK CLK output pin. - * @param PIN_DIN DIN input pin. + * @param _pin_clk CLK output pin. + * @param _pin_din DIN input pin. */ -#define NRF_DRV_PDM_DEFAULT_CONFIG(PIN_CLK, PIN_DIN) \ -{ \ - .mode = (nrf_pdm_mode_t)PDM_CONFIG_MODE, \ - .edge = (nrf_pdm_edge_t)PDM_CONFIG_EDGE, \ - .pin_clk = PIN_CLK, \ - .pin_din = PIN_DIN, \ - .clock_freq = (nrf_pdm_freq_t)PDM_CONFIG_CLOCK_FREQ, \ - .gain_l = NRF_PDM_GAIN_DEFAULT, \ - .gain_r = NRF_PDM_GAIN_DEFAULT, \ - .interrupt_priority = PDM_CONFIG_IRQ_PRIORITY \ +#define NRFX_PDM_DEFAULT_CONFIG(_pin_clk, _pin_din) \ +{ \ + .mode = (nrf_pdm_mode_t)NRFX_PDM_CONFIG_MODE, \ + .edge = (nrf_pdm_edge_t)NRFX_PDM_CONFIG_EDGE, \ + .pin_clk = _pin_clk, \ + .pin_din = _pin_din, \ + .clock_freq = (nrf_pdm_freq_t)NRFX_PDM_CONFIG_CLOCK_FREQ, \ + .gain_l = NRF_PDM_GAIN_DEFAULT, \ + .gain_r = NRF_PDM_GAIN_DEFAULT, \ + .interrupt_priority = NRFX_PDM_CONFIG_IRQ_PRIORITY \ } - /** - * @brief Handler for PDM interface ready events. + * @brief Handler for PDM interface ready events. * - * This event handler is called on buffer request, error or when a buffer is full - * and ready to be processed. + * This event handler is called on a buffer request, an error or when a buffer + * is full and ready to be processed. * - * @param[in] evt Pointer to the PDM event structure. + * @param[in] p_evt Pointer to the PDM event structure. */ -typedef void (*nrf_drv_pdm_event_handler_t)(nrf_drv_pdm_evt_t const * const evt); +typedef void (*nrfx_pdm_event_handler_t)(nrfx_pdm_evt_t const * const p_evt); /** * @brief Function for initializing the PDM interface. * - * @param[in] p_config Pointer to a configuration structure. Cannot be NULL. + * @param[in] p_config Pointer to the structure with initial configuration. * @param[in] event_handler Event handler provided by the user. Cannot be NULL. * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the driver is already initialized. - * @retval NRF_ERROR_INVALID_PARAM If invalid parameters were specified. + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the driver is already initialized. + * @retval NRFX_ERROR_INVALID_PARAM If invalid configuration was specified. */ -ret_code_t nrf_drv_pdm_init(nrf_drv_pdm_config_t const * p_config, - nrf_drv_pdm_event_handler_t event_handler); - +nrfx_err_t nrfx_pdm_init(nrfx_pdm_config_t const * p_config, + nrfx_pdm_event_handler_t event_handler); /** * @brief Function for uninitializing the PDM interface. * * This function stops PDM sampling, if it is in progress. */ -void nrf_drv_pdm_uninit(void); - +void nrfx_pdm_uninit(void); /** * @brief Function for getting the address of a PDM interface task. @@ -163,32 +150,29 @@ void nrf_drv_pdm_uninit(void); * * @return Task address. */ -__STATIC_INLINE uint32_t nrf_drv_pdm_task_address_get(nrf_pdm_task_t task) +__STATIC_INLINE uint32_t nrfx_pdm_task_address_get(nrf_pdm_task_t task) { return nrf_pdm_task_address_get(task); } - /** * @brief Function for getting the state of the PDM interface. * - * @retval TRUE If the PDM interface is enabled. - * @retval FALSE If the PDM interface is disabled. + * @retval true If the PDM interface is enabled. + * @retval false If the PDM interface is disabled. */ -__STATIC_INLINE bool nrf_drv_pdm_enable_check() +__STATIC_INLINE bool nrfx_pdm_enable_check(void) { return nrf_pdm_enable_check(); } - /** * @brief Function for starting PDM sampling. * - * @retval NRF_SUCCESS If sampling was started successfully or was already in progress. - * @retval NRF_ERROR_BUSY If a previous start/stop operation is in progress. + * @retval NRFX_SUCCESS If sampling was started successfully or was already in progress. + * @retval NRFX_ERROR_BUSY If a previous start/stop operation is in progress. */ -ret_code_t nrf_drv_pdm_start(void); - +nrfx_err_t nrfx_pdm_start(void); /** * @brief Function for stopping PDM sampling. @@ -197,10 +181,10 @@ ret_code_t nrf_drv_pdm_start(void); * the current frame. * The event handler function might be called once more after calling this function. * - * @retval NRF_SUCCESS If sampling was stopped successfully or was already stopped before. - * @retval NRF_ERROR_BUSY If a previous start/stop operation is in progress. + * @retval NRFX_SUCCESS If sampling was stopped successfully or was already stopped before. + * @retval NRFX_ERROR_BUSY If a previous start/stop operation is in progress. */ -ret_code_t nrf_drv_pdm_stop(void); +nrfx_err_t nrfx_pdm_stop(void); /** * @brief Function for supplying the sample buffer. @@ -210,17 +194,21 @@ ret_code_t nrf_drv_pdm_stop(void); * @param[in] buffer Pointer to the receive buffer. Cannot be NULL. * @param[in] buffer_length Length of the receive buffer in 16-bit words. * - * @retval NRF_SUCCESS If the buffer was applied successfully. - * @retval NRF_ERROR_BUSY If the buffer was already supplied or the peripheral is currently being stopped. - * @retval NRF_ERROR_INVALID_STATE If the driver was not initialized. - * @retval NRF_ERROR_INVALID_PARAM If invalid parameters were provided. + * @retval NRFX_SUCCESS If the buffer was applied successfully. + * @retval NRFX_ERROR_BUSY If the buffer was already supplied or the peripheral is currently being stopped. + * @retval NRFX_ERROR_INVALID_STATE If the driver was not initialized. + * @retval NRFX_ERROR_INVALID_PARAM If invalid parameters were provided. */ -ret_code_t nrf_drv_pdm_buffer_set(int16_t * buffer, uint16_t buffer_length); +nrfx_err_t nrfx_pdm_buffer_set(int16_t * buffer, uint16_t buffer_length); + + +void nrfx_pdm_irq_handler(void); + + +/** @} */ #ifdef __cplusplus } #endif -#endif // NRF_DRV_PDM_H__ - -/** @} */ +#endif // NRFX_PDM_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_power.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_power.h new file mode 100644 index 0000000000..c7bac84d37 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_power.h @@ -0,0 +1,382 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_POWER_H__ +#define NRFX_POWER_H__ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_power POWER driver + * @{ + * @ingroup nrf_power + * @brief POWER peripheral driver. + */ + +/** + * @brief Power mode possible configurations + */ +typedef enum +{ + NRFX_POWER_MODE_CONSTLAT, /**< Constant latency mode */ + NRFX_POWER_MODE_LOWPWR /**< Low power mode */ +}nrfx_power_mode_t; + +#if NRF_POWER_HAS_SLEEPEVT || defined(__NRFX_DOXYGEN__) +/** + * @brief Events from power system + */ +typedef enum +{ + NRFX_POWER_SLEEP_EVT_ENTER, /**< CPU entered WFI/WFE sleep + * + * Keep in mind that if this interrupt is enabled, + * it means that CPU was waken up just after WFI by this interrupt. + */ + NRFX_POWER_SLEEP_EVT_EXIT /**< CPU exited WFI/WFE sleep */ +}nrfx_power_sleep_evt_t; +#endif /* NRF_POWER_HAS_SLEEPEVT */ + +#if NRF_POWER_HAS_USBREG || defined(__NRFX_DOXYGEN__) +/** + * @brief Events from USB power system + */ +typedef enum +{ + NRFX_POWER_USB_EVT_DETECTED, /**< USB power detected on the connector (plugged in). */ + NRFX_POWER_USB_EVT_REMOVED, /**< USB power removed from the connector. */ + NRFX_POWER_USB_EVT_READY /**< USB power regulator ready. */ +}nrfx_power_usb_evt_t; + +/** + * @brief USB power state + * + * The single enumerator that holds all data about current state of USB + * related POWER. + * + * Organized this way that higher power state has higher numeric value + */ +typedef enum +{ + NRFX_POWER_USB_STATE_DISCONNECTED, /**< No power on USB lines detected */ + NRFX_POWER_USB_STATE_CONNECTED, /**< The USB power is detected, but USB power regulator is not ready */ + NRFX_POWER_USB_STATE_READY /**< From the power point of view USB is ready for working */ +}nrfx_power_usb_state_t; +#endif /* NRF_POWER_HAS_USBREG */ + +/** + * @name Callback types + * + * Defined types of callback functions + * @{ + */ +/** + * @brief Event handler for power failure warning + */ +typedef void (*nrfx_power_pofwarn_event_handler_t)(void); + +#if NRF_POWER_HAS_SLEEPEVT || defined(__NRFX_DOXYGEN__) +/** + * @brief Event handler for entering/exiting sleep + * + * @param event Event type + */ +typedef void (*nrfx_power_sleep_event_handler_t)(nrfx_power_sleep_evt_t event); +#endif + +#if NRF_POWER_HAS_USBREG || defined(__NRFX_DOXYGEN__) +/** + * @brief Event handler for USB related power events + * + * @param event Event type + */ +typedef void (*nrfx_power_usb_event_handler_t)(nrfx_power_usb_evt_t event); +#endif +/** @} */ + +/** + * @brief General power configuration + * + * Parameters required to initialize power driver. + */ +typedef struct +{ + /** + * @brief Enable main DCDC regulator + * + * This bit only informs the driver that elements for DCDC regulator + * are installed and regulator can be used. + * The regulator would be enabled or disabled automatically + * by the hardware, basing on current power requirement. + */ + bool dcdcen:1; + +#if NRF_POWER_HAS_VDDH || defined(__NRFX_DOXYGEN__) + /** + * @brief Enable HV DCDC regulator + * + * This bit only informs the driver that elements for DCDC regulator + * are installed and regulator can be used. + * The regulator would be enabled or disabled automatically + * by the hardware, basing on current power requirement. + */ + bool dcdcenhv: 1; +#endif +}nrfx_power_config_t; + +/** + * @brief The configuration for power failure comparator + * + * Configuration used to enable and configure power failure comparator + */ +typedef struct +{ + nrfx_power_pofwarn_event_handler_t handler; //!< Event handler + nrf_power_pof_thr_t thr; //!< Threshold for power failure detection +#if NRF_POWER_HAS_VDDH || defined(__NRFX_DOXYGEN__) + nrf_power_pof_thrvddh_t thrvddh; //!< Threshold for power failure detection on VDDH pin +#endif +}nrfx_power_pofwarn_config_t; + +#if NRF_POWER_HAS_SLEEPEVT || defined(__NRFX_DOXYGEN__) +/** + * @brief The configuration of sleep event processing + * + * Configuration used to enable and configure sleep event handling + */ +typedef struct +{ + nrfx_power_sleep_event_handler_t handler; //!< Event handler + bool en_enter:1; //!< Enable event on sleep entering + bool en_exit :1; //!< Enable event on sleep exiting +}nrfx_power_sleepevt_config_t; +#endif + +#if NRF_POWER_HAS_USBREG || defined(__NRFX_DOXYGEN__) +/** + * @brief The configuration of USB related power events + * + * Configuration used to enable and configure USB power event handling + */ +typedef struct +{ + nrfx_power_usb_event_handler_t handler; //!< Event processing +}nrfx_power_usbevt_config_t; +#endif /* NRF_POWER_HAS_USBREG */ + +/** + * @brief Function for getting the handler of the power failure comparator. + * @return Handler of the power failure comparator. + */ +nrfx_power_pofwarn_event_handler_t nrfx_power_pof_handler_get(void); + +#if NRF_POWER_HAS_USBREG || defined(__NRFX_DOXYGEN__) +/** + * @brief Function for getting the handler of the USB power. + * @return Handler of the USB power. + */ +nrfx_power_usb_event_handler_t nrfx_power_usb_handler_get(void); +#endif + +/** + * @brief Initialize power module driver + * + * Enabled power module driver would process all the interrupts from power system. + * + * @param[in] p_config Pointer to the structure with initial configuration. + * + * @retval NRFX_SUCCESS Successfully initialized. + * @retval NRFX_ERROR_ALREADY_INITIALIZED Module was already initialized. + */ +nrfx_err_t nrfx_power_init(nrfx_power_config_t const * p_config); + +/** + * @brief Unintialize power module driver + * + * Disables all the interrupt handling in the module. + * + * @sa nrfx_power_init + */ +void nrfx_power_uninit(void); + +/** + * @brief Initialize power failure comparator + * + * Configures the power failure comparator. This function does not setup and enable it. + * Those steps can be done with functions @ref nrfx_power_pof_enable and @ref nrfx_power_pof_disable + * or with Softdevice API (when Softdevice is using). + * + * @param[in] p_config Configuration with values and event handler. + * If event handler is set to NULL, interrupt would be disabled. + */ +void nrfx_power_pof_init(nrfx_power_pofwarn_config_t const * p_config); + +/** + * @brief Enable power failure comparator + * Sets and enables interrupt of the power failure comparator. This functions cannot be using + * when Softdevice is enabled. If event handler set in init function is set to NULL, interrupt + * would be disabled. + * + * @param[in] p_config Configuration with values and event handler. + */ +void nrfx_power_pof_enable(nrfx_power_pofwarn_config_t const * p_config); + +/** + * @brief Disable the power failure comparator + * + * Disables the power failure comparator interrupt. + */ +void nrfx_power_pof_disable(void); + +/** + * @brief Clear the power failure comparator settings + * + * Clears the settings of the power failure comparator. + */ +void nrfx_power_pof_uninit(void); + +#if NRF_POWER_HAS_SLEEPEVT || defined(__NRFX_DOXYGEN__) +/** + * @brief Initialize sleep entering and exiting events processing + * + * Configures and setups the sleep event processing. + * + * @param[in] p_config Configuration with values and event handler. + * + * @sa nrfx_power_sleepevt_uninit + * + */ +void nrfx_power_sleepevt_init(nrfx_power_sleepevt_config_t const * p_config); + +/** + * @brief Enable sleep entering and exiting events processing + * + * @param[in] p_config Configuration with values and event handler. + */ +void nrfx_power_sleepevt_enable(nrfx_power_sleepevt_config_t const * p_config); + +/** + * @brief Disable sleep entering and exiting events processing + */ +void nrfx_power_sleepevt_disable(void); + +/** + * @brief Uninitialize sleep entering and exiting events processing + * + * @sa nrfx_power_sleepevt_init + */ +void nrfx_power_sleepevt_uninit(void); +#endif /* NRF_POWER_HAS_SLEEPEVT */ + +#if NRF_POWER_HAS_USBREG || defined(__NRFX_DOXYGEN__) +/** + * @brief Initialize USB power event processing + * + * Configures and setups the USB power event processing. + * + * @param[in] p_config Configuration with values and event handler. + * + * @sa nrfx_power_usbevt_uninit + */ +void nrfx_power_usbevt_init(nrfx_power_usbevt_config_t const * p_config); + +/** + * @brief Enable USB power event processing + */ +void nrfx_power_usbevt_enable(void); + +/** + * @brief Disable USB power event processing + */ +void nrfx_power_usbevt_disable(void); + +/** + * @brief Uninitalize USB power event processing + * + * @sa nrfx_power_usbevt_init + */ +void nrfx_power_usbevt_uninit(void); + +/** + * @brief Get the status of USB power + * + * @return Current USB power status + */ +__STATIC_INLINE nrfx_power_usb_state_t nrfx_power_usbstatus_get(void); + +#endif /* NRF_POWER_HAS_USBREG */ + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION + +#if NRF_POWER_HAS_USBREG +__STATIC_INLINE nrfx_power_usb_state_t nrfx_power_usbstatus_get(void) +{ + uint32_t status = nrf_power_usbregstatus_get(); + if(0 == (status & NRF_POWER_USBREGSTATUS_VBUSDETECT_MASK)) + { + return NRFX_POWER_USB_STATE_DISCONNECTED; + } + if(0 == (status & NRF_POWER_USBREGSTATUS_OUTPUTRDY_MASK)) + { + return NRFX_POWER_USB_STATE_CONNECTED; + } + return NRFX_POWER_USB_STATE_READY; +} +#endif /* NRF_POWER_HAS_USBREG */ + +#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ + + +void nrfx_power_irq_handler(void); + + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* NRFX_POWER_H__ */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_power_clock.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_power_clock.h new file mode 100644 index 0000000000..c63dbcf473 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_power_clock.h @@ -0,0 +1,90 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_POWER_CLOCK_H__ +#define NRFX_POWER_CLOCK_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +__STATIC_INLINE void nrfx_power_clock_irq_init(void); + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION +__STATIC_INLINE void nrfx_power_clock_irq_init(void) +{ + uint8_t priority; +#if NRFX_CHECK(NRFX_POWER_ENABLED) && NRFX_CHECK(NRFX_CLOCK_ENABLED) + #if NRFX_POWER_CONFIG_IRQ_PRIORITY != NRFX_CLOCK_CONFIG_IRQ_PRIORITY + #error "IRQ priority for POWER and CLOCK have to be the same. Check ." + #endif + priority = NRFX_POWER_CONFIG_IRQ_PRIORITY; +#elif NRFX_CHECK(NRFX_POWER_ENABLED) + priority = NRFX_POWER_CONFIG_IRQ_PRIORITY; +#elif NRFX_CHECK(NRFX_CLOCK_ENABLED) + priority = NRFX_CLOCK_CONFIG_IRQ_PRIORITY; +#endif + + if (!NRFX_IRQ_IS_ENABLED(POWER_CLOCK_IRQn)) + { + NRFX_IRQ_PRIORITY_SET(POWER_CLOCK_IRQn, priority); + NRFX_IRQ_ENABLE(POWER_CLOCK_IRQn); + } +} +#endif // SUPPRESS_INLINE_IMPLEMENTATION + + +#if NRFX_CHECK(NRFX_POWER_ENABLED) && NRFX_CHECK(NRFX_CLOCK_ENABLED) +void nrfx_power_clock_irq_handler(void); +#elif NRFX_CHECK(NRFX_POWER_ENABLED) +#define nrfx_power_irq_handler nrfx_power_clock_irq_handler +#elif NRFX_CHECK(NRFX_CLOCK_ENABLED) +#define nrfx_clock_irq_handler nrfx_power_clock_irq_handler +#endif + + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_POWER_CLOCK_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_ppi.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_ppi.h new file mode 100644 index 0000000000..f7b9b24d42 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_ppi.h @@ -0,0 +1,327 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_PPI_H__ +#define NRFX_PPI_H__ + +#include +#include + +/** + * @defgroup nrfx_ppi PPI allocator + * @{ + * @ingroup nrf_ppi + * @brief Programmable Peripheral Interconnect (PPI) allocator. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef NRFX_PPI_CHANNELS_USED +#define NRFX_PPI_CHANNELS_USED 0 +#endif + +#ifndef NRFX_PPI_GROUPS_USED +#define NRFX_PPI_GROUPS_USED 0 +#endif + +#if PPI_CH_NUM > 16 +#define NRFX_PPI_ALL_APP_CHANNELS_MASK ((uint32_t)0xFFFFFFFFuL & ~(NRFX_PPI_CHANNELS_USED)) /**< All PPI channels available to the application. */ +#define NRFX_PPI_PROG_APP_CHANNELS_MASK ((uint32_t)0x000FFFFFuL & ~(NRFX_PPI_CHANNELS_USED)) /**< Programmable PPI channels available to the application. */ +#else +#define NRFX_PPI_ALL_APP_CHANNELS_MASK ((uint32_t)0xFFF0FFFFuL & ~(NRFX_PPI_CHANNELS_USED)) /**< All PPI channels available to the application. */ +#define NRFX_PPI_PROG_APP_CHANNELS_MASK ((uint32_t)0x0000FFFFuL & ~(NRFX_PPI_CHANNELS_USED)) /**< Programmable PPI channels available to the application. */ +#endif + +#define NRFX_PPI_ALL_APP_GROUPS_MASK (((1uL << PPI_GROUP_NUM) - 1) & ~(NRFX_PPI_GROUPS_USED)) /**< All PPI groups available to the application. */ + +/** + * @brief Function for uninitializing the PPI module. + * + * This function disables all channels and clears the channel groups. + */ +void nrfx_ppi_free_all(void); + +/** + * @brief Function for allocating a PPI channel. + * @details This function allocates the first unused PPI channel. + * + * @param[out] p_channel Pointer to the PPI channel that has been allocated. + * + * @retval NRFX_SUCCESS If the channel was successfully allocated. + * @retval NRFX_ERROR_NO_MEM If there is no available channel to be used. + */ +nrfx_err_t nrfx_ppi_channel_alloc(nrf_ppi_channel_t * p_channel); + +/** + * @brief Function for freeing a PPI channel. + * @details This function also disables the chosen channel. + * + * @param[in] channel PPI channel to be freed. + * + * @retval NRFX_SUCCESS If the channel was successfully freed. + * @retval NRFX_ERROR_INVALID_PARAM If the channel is not user-configurable. + */ +nrfx_err_t nrfx_ppi_channel_free(nrf_ppi_channel_t channel); + +/** + * @brief Function for assigning task and event endpoints to the PPI channel. + * + * @param[in] channel PPI channel to be assigned endpoints. + * @param[in] eep Event endpoint address. + * @param[in] tep Task endpoint address. + * + * @retval NRFX_SUCCESS If the channel was successfully assigned. + * @retval NRFX_ERROR_INVALID_STATE If the channel is not allocated for the user. + * @retval NRFX_ERROR_INVALID_PARAM If the channel is not user-configurable. + */ +nrfx_err_t nrfx_ppi_channel_assign(nrf_ppi_channel_t channel, uint32_t eep, uint32_t tep); + +/** + * @brief Function for assigning or clearing fork endpoint to the PPI channel. + * + * @param[in] channel PPI channel to be assigned endpoints. + * @param[in] fork_tep Fork task endpoint address or 0 to clear. + * + * @retval NRFX_SUCCESS If the channel was successfully assigned. + * @retval NRFX_ERROR_INVALID_STATE If the channel is not allocated for the user. + * @retval NRFX_ERROR_INVALID_PARAM If the channel is not user-configurable. + * @retval NRFX_ERROR_NOT_SUPPORTED If function is not supported. + */ +nrfx_err_t nrfx_ppi_channel_fork_assign(nrf_ppi_channel_t channel, uint32_t fork_tep); + +/** + * @brief Function for enabling a PPI channel. + * + * @param[in] channel PPI channel to be enabled. + * + * @retval NRFX_SUCCESS If the channel was successfully enabled. + * @retval NRFX_ERROR_INVALID_STATE If the user-configurable channel is not allocated. + * @retval NRFX_ERROR_INVALID_PARAM If the channel cannot be enabled by the user. + */ +nrfx_err_t nrfx_ppi_channel_enable(nrf_ppi_channel_t channel); + +/** + * @brief Function for disabling a PPI channel. + * + * @param[in] channel PPI channel to be disabled. + * + * @retval NRFX_SUCCESS If the channel was successfully disabled. + * @retval NRFX_ERROR_INVALID_STATE If the user-configurable channel is not allocated. + * @retval NRFX_ERROR_INVALID_PARAM If the channel cannot be disabled by the user. + */ +nrfx_err_t nrfx_ppi_channel_disable(nrf_ppi_channel_t channel); + +/** + * @brief Function for allocating a PPI channel group. + * @details This function allocates the first unused PPI group. + * + * @param[out] p_group Pointer to the PPI channel group that has been allocated. + * + * @retval NRFX_SUCCESS If the channel group was successfully allocated. + * @retval NRFX_ERROR_NO_MEM If there is no available channel group to be used. + */ +nrfx_err_t nrfx_ppi_group_alloc(nrf_ppi_channel_group_t * p_group); + +/** + * @brief Function for freeing a PPI channel group. + * @details This function also disables the chosen group. + * + * @param[in] group PPI channel group to be freed. + * + * @retval NRFX_SUCCESS If the channel group was successfully freed. + * @retval NRFX_ERROR_INVALID_PARAM If the channel group is not user-configurable. + */ +nrfx_err_t nrfx_ppi_group_free(nrf_ppi_channel_group_t group); + +/** + * @brief Compute a channel mask for NRF_PPI registers. + * + * @param[in] channel Channel number to transform to a mask. + * + * @retval Channel mask. + */ +__STATIC_INLINE uint32_t nrfx_ppi_channel_to_mask(nrf_ppi_channel_t channel) +{ + return (1uL << (uint32_t) channel); +} + +/** + * @brief Function for including multiple PPI channels in a channel group. + * + * @param[in] channel_mask PPI channels to be added. + * @param[in] group Channel group in which to include the channels. + * + * @retval NRFX_SUCCESS If the channels was successfully included. + * @retval NRFX_ERROR_INVALID_PARAM If group is not an application group or channels are not an + * application channels. + * @retval NRFX_ERROR_INVALID_STATE If group is not an allocated group. + */ +nrfx_err_t nrfx_ppi_channels_include_in_group(uint32_t channel_mask, + nrf_ppi_channel_group_t group); + +/** + * @brief Function for including a PPI channel in a channel group. + * + * @param[in] channel PPI channel to be added. + * @param[in] group Channel group in which to include the channel. + * + * @retval NRFX_SUCCESS If the channel was successfully included. + * @retval NRFX_ERROR_INVALID_PARAM If group is not an application group or channel is not an + * application channel. + * @retval NRFX_ERROR_INVALID_STATE If group is not an allocated group. + */ +__STATIC_INLINE nrfx_err_t nrfx_ppi_channel_include_in_group(nrf_ppi_channel_t channel, + nrf_ppi_channel_group_t group) +{ + return nrfx_ppi_channels_include_in_group(nrfx_ppi_channel_to_mask(channel), group); +} + +/** + * @brief Function for removing multiple PPI channels from a channel group. + * + * @param[in] channel_mask PPI channels to be removed. + * @param[in] group Channel group from which to remove the channels. + * + * @retval NRFX_SUCCESS If the channel was successfully removed. + * @retval NRFX_ERROR_INVALID_PARAM If group is not an application group or channels are not an + * application channels. + * @retval NRFX_ERROR_INVALID_STATE If group is not an allocated group. + */ +nrfx_err_t nrfx_ppi_channels_remove_from_group(uint32_t channel_mask, + nrf_ppi_channel_group_t group); + +/** + * @brief Function for removing a PPI channel from a channel group. + * + * @param[in] channel PPI channel to be removed. + * @param[in] group Channel group from which to remove the channel. + * + * @retval NRFX_SUCCESS If the channel was successfully removed. + * @retval NRFX_ERROR_INVALID_PARAM If group is not an application group or channel is not an + * application channel. + * @retval NRFX_ERROR_INVALID_STATE If group is not an allocated group. + */ +__STATIC_INLINE nrfx_err_t nrfx_ppi_channel_remove_from_group(nrf_ppi_channel_t channel, + nrf_ppi_channel_group_t group) +{ + return nrfx_ppi_channels_remove_from_group(nrfx_ppi_channel_to_mask(channel), group); +} + +/** + * @brief Function for clearing a PPI channel group. + * + * @param[in] group Channel group to be cleared. + * + * @retval NRFX_SUCCESS If the group was successfully cleared. + * @retval NRFX_ERROR_INVALID_PARAM If group is not an application group. + * @retval NRFX_ERROR_INVALID_STATE If group is not an allocated group. + */ +__STATIC_INLINE nrfx_err_t nrfx_ppi_group_clear(nrf_ppi_channel_group_t group) +{ + return nrfx_ppi_channels_remove_from_group(NRFX_PPI_ALL_APP_CHANNELS_MASK, group); +} + +/** + * @brief Function for enabling a PPI channel group. + * + * @param[in] group Channel group to be enabled. + * + * @retval NRFX_SUCCESS If the group was successfully enabled. + * @retval NRFX_ERROR_INVALID_PARAM If group is not an application group. + * @retval NRFX_ERROR_INVALID_STATE If group is not an allocated group. + */ +nrfx_err_t nrfx_ppi_group_enable(nrf_ppi_channel_group_t group); + +/** + * @brief Function for disabling a PPI channel group. + * + * @param[in] group Channel group to be disabled. + * + * @retval NRFX_SUCCESS If the group was successfully disabled. + * @retval NRFX_ERROR_INVALID_PARAM If group is not an application group. + * @retval NRFX_ERROR_INVALID_STATE If group is not an allocated group. + */ +nrfx_err_t nrfx_ppi_group_disable(nrf_ppi_channel_group_t group); + +/** + * @brief Function for getting the address of a PPI task. + * + * @param[in] task Task. + * + * @retval Task address. + */ +__STATIC_INLINE uint32_t nrfx_ppi_task_addr_get(nrf_ppi_task_t task) +{ + return (uint32_t) nrf_ppi_task_address_get(task); +} + +/** + * @brief Function for getting the address of a PPI group enable task. + * + * @param[in] group PPI channel group + * + * @retval Task address. + */ +__STATIC_INLINE uint32_t nrfx_ppi_task_addr_group_enable_get(nrf_ppi_channel_group_t group) +{ + return (uint32_t) nrf_ppi_task_group_enable_address_get(group); +} + +/** + * @brief Function for getting the address of a PPI group enable task. + * + * @param[in] group PPI channel group + * + * @retval Task address. + */ +__STATIC_INLINE uint32_t nrfx_ppi_task_addr_group_disable_get(nrf_ppi_channel_group_t group) +{ + return (uint32_t) nrf_ppi_task_group_disable_address_get(group); +} + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_PPI_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_pwm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_pwm.h new file mode 100644 index 0000000000..c4c15dd49e --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_pwm.h @@ -0,0 +1,497 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_PWM_H__ +#define NRFX_PWM_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_pwm PWM driver + * @{ + * @ingroup nrf_pwm + * @brief Pulse Width Modulation (PWM) peripheral driver. + */ + +/** + * @brief PWM driver instance data structure. + */ +typedef struct +{ + NRF_PWM_Type * p_registers; ///< Pointer to the structure with PWM peripheral instance registers. + uint8_t drv_inst_idx; ///< Driver instance index. +} nrfx_pwm_t; + +/** + * @brief Macro for creating a PWM driver instance. + */ +#define NRFX_PWM_INSTANCE(id) \ +{ \ + .p_registers = NRFX_CONCAT_2(NRF_PWM, id), \ + .drv_inst_idx = NRFX_CONCAT_3(NRFX_PWM, id, _INST_IDX), \ +} + +enum { +#if NRFX_CHECK(NRFX_PWM0_ENABLED) + NRFX_PWM0_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_PWM1_ENABLED) + NRFX_PWM1_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_PWM2_ENABLED) + NRFX_PWM2_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_PWM3_ENABLED) + NRFX_PWM3_INST_IDX, +#endif + NRFX_PWM_ENABLED_COUNT +}; + +/** + * @brief This value can be provided instead of a pin number for any channel + * to specify that its output is not used and therefore does not need + * to be connected to a pin. + */ +#define NRFX_PWM_PIN_NOT_USED 0xFF + +/** + * @brief This value can be added to a pin number to inverse its polarity + * (set idle state = 1). + */ +#define NRFX_PWM_PIN_INVERTED 0x80 + +/** + * @brief PWM driver configuration structure. + */ +typedef struct +{ + uint8_t output_pins[NRF_PWM_CHANNEL_COUNT]; ///< Pin numbers for individual output channels (optional). + /**< Use @ref NRFX_PWM_PIN_NOT_USED + * if a given output channel is not needed. */ + uint8_t irq_priority; ///< Interrupt priority. + nrf_pwm_clk_t base_clock; ///< Base clock frequency. + nrf_pwm_mode_t count_mode; ///< Operating mode of the pulse generator counter. + uint16_t top_value; ///< Value up to which the pulse generator counter counts. + nrf_pwm_dec_load_t load_mode; ///< Mode of loading sequence data from RAM. + nrf_pwm_dec_step_t step_mode; ///< Mode of advancing the active sequence. +} nrfx_pwm_config_t; + +/** + * @brief PWM driver default configuration. + */ +#define NRFX_PWM_DEFAULT_CONFIG \ +{ \ + .output_pins = { NRFX_PWM_DEFAULT_CONFIG_OUT0_PIN, \ + NRFX_PWM_DEFAULT_CONFIG_OUT1_PIN, \ + NRFX_PWM_DEFAULT_CONFIG_OUT2_PIN, \ + NRFX_PWM_DEFAULT_CONFIG_OUT3_PIN }, \ + .irq_priority = NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY, \ + .base_clock = (nrf_pwm_clk_t)NRFX_PWM_DEFAULT_CONFIG_BASE_CLOCK, \ + .count_mode = (nrf_pwm_mode_t)NRFX_PWM_DEFAULT_CONFIG_COUNT_MODE, \ + .top_value = NRFX_PWM_DEFAULT_CONFIG_TOP_VALUE, \ + .load_mode = (nrf_pwm_dec_load_t)NRFX_PWM_DEFAULT_CONFIG_LOAD_MODE, \ + .step_mode = (nrf_pwm_dec_step_t)NRFX_PWM_DEFAULT_CONFIG_STEP_MODE, \ +} + + +/** + * @brief PWM flags providing additional playback options. + */ +typedef enum +{ + NRFX_PWM_FLAG_STOP = 0x01, /**< When the requested playback is finished, + the peripheral should be stopped. + @note The STOP task is triggered when + the last value of the final sequence is + loaded from RAM, and the peripheral stops + at the end of the current PWM period. + For sequences with configured repeating + of duty cycle values, this might result in + less than the requested number of repeats + of the last value. */ + NRFX_PWM_FLAG_LOOP = 0x02, /**< When the requested playback is finished, + it should be started from the beginning. + This flag is ignored if used together + with @ref NRFX_PWM_FLAG_STOP. + @note The playback restart is done via a + shortcut configured in the PWM peripheral. + This shortcut triggers the proper starting + task when the final value of previous + playback is read from RAM and applied to + the pulse generator counter. + When this mechanism is used together with + the @ref NRF_PWM_STEP_TRIGGERED mode, + the playback restart will occur right + after switching to the final value (this + final value will be played only once). */ + NRFX_PWM_FLAG_SIGNAL_END_SEQ0 = 0x04, /**< The event handler should be + called when the last value + from sequence 0 is loaded. */ + NRFX_PWM_FLAG_SIGNAL_END_SEQ1 = 0x08, /**< The event handler should be + called when the last value + from sequence 1 is loaded. */ + NRFX_PWM_FLAG_NO_EVT_FINISHED = 0x10, /**< The playback finished event + (enabled by default) should be + suppressed. */ + NRFX_PWM_FLAG_START_VIA_TASK = 0x80, /**< The playback should not be + started directly by the called + function. Instead, the function + should only prepare it and + return the address of the task + to be triggered to start the + playback. */ +} nrfx_pwm_flag_t; + + +/** + * @brief PWM driver event type. + */ +typedef enum +{ + NRFX_PWM_EVT_FINISHED, ///< Sequence playback finished. + NRFX_PWM_EVT_END_SEQ0, /**< End of sequence 0 reached. Its data can be + safely modified now. */ + NRFX_PWM_EVT_END_SEQ1, /**< End of sequence 1 reached. Its data can be + safely modified now. */ + NRFX_PWM_EVT_STOPPED, ///< The PWM peripheral has been stopped. +} nrfx_pwm_evt_type_t; + +/** + * @brief PWM driver event handler type. + */ +typedef void (* nrfx_pwm_handler_t)(nrfx_pwm_evt_type_t event_type); + + +/** + * @brief Function for initializing the PWM driver. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_config Pointer to the structure with initial configuration. + * + * @param[in] handler Event handler provided by the user. If NULL is passed + * instead, event notifications are not done and PWM + * interrupts are disabled. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the driver was already initialized. + */ +nrfx_err_t nrfx_pwm_init(nrfx_pwm_t const * const p_instance, + nrfx_pwm_config_t const * p_config, + nrfx_pwm_handler_t handler); + +/** + * @brief Function for uninitializing the PWM driver. + * + * If any sequence playback is in progress, it is stopped immediately. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_pwm_uninit(nrfx_pwm_t const * const p_instance); + +/** + * @brief Function for starting a single sequence playback. + * + * To take advantage of the looping mechanism in the PWM peripheral, both + * sequences must be used (single sequence can be played back only once by + * the peripheral). Therefore, the provided sequence is internally set and + * played back as both sequence 0 and sequence 1. Consequently, if end of + * sequence notifications are required, events for both sequences should be + * used (that means that both the @ref NRFX_PWM_FLAG_SIGNAL_END_SEQ0 flag + * and the @ref NRFX_PWM_FLAG_SIGNAL_END_SEQ1 flag should be specified and + * the @ref NRFX_PWM_EVT_END_SEQ0 event and the @ref NRFX_PWM_EVT_END_SEQ1 + * event should be handled in the same way). + * + * Use the @ref NRFX_PWM_FLAG_START_VIA_TASK flag if you want the playback + * to be only prepared by this function, and you want to start it later by + * triggering a task (using PPI for instance). The function will then return + * the address of the task to be triggered. + * + * @note The array containing the duty cycle values for the specified sequence + * must be in RAM and cannot be allocated on stack. + * For detailed information, see @ref nrf_pwm_sequence_t. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_sequence Sequence to be played back. + * @param[in] playback_count Number of playbacks to be performed (must not be 0). + * @param[in] flags Additional options. Pass any combination of + * @ref nrfx_pwm_flag_t "playback flags", or 0 + * for default settings. + * + * @return Address of the task to be triggered to start the playback if the @ref + * NRFX_PWM_FLAG_START_VIA_TASK flag was used, 0 otherwise. + */ +uint32_t nrfx_pwm_simple_playback(nrfx_pwm_t const * const p_instance, + nrf_pwm_sequence_t const * p_sequence, + uint16_t playback_count, + uint32_t flags); + +/** + * @brief Function for starting a two-sequence playback. + * + * Use the @ref NRFX_PWM_FLAG_START_VIA_TASK flag if you want the playback + * to be only prepared by this function, and you want to start it later by + * triggering a task (using PPI for instance). The function will then return + * the address of the task to be triggered. + * + * @note The array containing the duty cycle values for the specified sequence + * must be in RAM and cannot be allocated on stack. + * For detailed information, see @ref nrf_pwm_sequence_t. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_sequence_0 First sequence to be played back. + * @param[in] p_sequence_1 Second sequence to be played back. + * @param[in] playback_count Number of playbacks to be performed (must not be 0). + * @param[in] flags Additional options. Pass any combination of + * @ref nrfx_pwm_flag_t "playback flags", or 0 + * for default settings. + * + * @return Address of the task to be triggered to start the playback if the @ref + * NRFX_PWM_FLAG_START_VIA_TASK flag was used, 0 otherwise. + */ +uint32_t nrfx_pwm_complex_playback(nrfx_pwm_t const * const p_instance, + nrf_pwm_sequence_t const * p_sequence_0, + nrf_pwm_sequence_t const * p_sequence_1, + uint16_t playback_count, + uint32_t flags); + +/** + * @brief Function for advancing the active sequence. + * + * This function only applies to @ref NRF_PWM_STEP_TRIGGERED mode. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +__STATIC_INLINE void nrfx_pwm_step(nrfx_pwm_t const * const p_instance); + +/** + * @brief Function for stopping the sequence playback. + * + * The playback is stopped at the end of the current PWM period. + * This means that if the active sequence is configured to repeat each duty + * cycle value for a certain number of PWM periods, the last played value + * might appear on the output less times than requested. + * + * @note This function can be instructed to wait until the playback is stopped + * (by setting @p wait_until_stopped to true). Note that, depending on + * the length of the PMW period, this might take a significant amount of + * time. Alternatively, the @ref nrfx_pwm_is_stopped function can be + * used to poll the status, or the @ref NRFX_PWM_EVT_STOPPED event can + * be used to get the notification when the playback is stopped, provided + * the event handler is defined. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] wait_until_stopped If true, the function will not return until + * the playback is stopped. + * + * @retval true If the PWM peripheral is stopped. + * @retval false If the PWM peripheral is not stopped. + */ +bool nrfx_pwm_stop(nrfx_pwm_t const * const p_instance, + bool wait_until_stopped); + +/** + * @brief Function for checking the status of the PWM peripheral. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @retval true If the PWM peripheral is stopped. + * @retval false If the PWM peripheral is not stopped. + */ +bool nrfx_pwm_is_stopped(nrfx_pwm_t const * const p_instance); + +/** + * @brief Function for updating the sequence data during playback. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] seq_id Identifier of the sequence (0 or 1). + * @param[in] p_sequence Pointer to the new sequence definition. + */ +__STATIC_INLINE void nrfx_pwm_sequence_update( + nrfx_pwm_t const * const p_instance, + uint8_t seq_id, + nrf_pwm_sequence_t const * p_sequence); + +/** + * @brief Function for updating the pointer to the duty cycle values + * in the specified sequence during playback. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] seq_id Identifier of the sequence (0 or 1). + * @param[in] values New pointer to the duty cycle values. + */ +__STATIC_INLINE void nrfx_pwm_sequence_values_update(nrfx_pwm_t const * const p_instance, + uint8_t seq_id, + nrf_pwm_values_t values); + +/** + * @brief Function for updating the number of duty cycle values + * in the specified sequence during playback. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] seq_id Identifier of the sequence (0 or 1). + * @param[in] length New number of the duty cycle values. + */ +__STATIC_INLINE void nrfx_pwm_sequence_length_update(nrfx_pwm_t const * const p_instance, + uint8_t seq_id, + uint16_t length); + +/** + * @brief Function for updating the number of repeats for duty cycle values + * in specified sequence during playback. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] seq_id Identifier of the sequence (0 or 1). + * @param[in] repeats New number of repeats. + */ +__STATIC_INLINE void nrfx_pwm_sequence_repeats_update(nrfx_pwm_t const * const p_instance, + uint8_t seq_id, + uint32_t repeats); + +/** + * @brief Function for updating the additional delay after the specified + * sequence during playback. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] seq_id Identifier of the sequence (0 or 1). + * @param[in] end_delay New end delay value (in PWM periods). + */ +__STATIC_INLINE void nrfx_pwm_sequence_end_delay_update(nrfx_pwm_t const * const p_instance, + uint8_t seq_id, + uint32_t end_delay); + +/** + * @brief Function for returning the address of a specified PWM task that can + * be used in PPI module. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] task Requested task. + * + * @return Task address. + */ +__STATIC_INLINE uint32_t nrfx_pwm_task_address_get(nrfx_pwm_t const * const p_instance, + nrf_pwm_task_t task); + +/**@brief Function for returning the address of a specified PWM event that can + * be used in PPI module. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] event Requested event. + * + * @return Event address. + */ +__STATIC_INLINE uint32_t nrfx_pwm_event_address_get(nrfx_pwm_t const * const p_instance, + nrf_pwm_event_t event); + + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION + +__STATIC_INLINE void nrfx_pwm_step(nrfx_pwm_t const * const p_instance) +{ + nrf_pwm_task_trigger(p_instance->p_registers, NRF_PWM_TASK_NEXTSTEP); +} + +__STATIC_INLINE void nrfx_pwm_sequence_update(nrfx_pwm_t const * const p_instance, + uint8_t seq_id, + nrf_pwm_sequence_t const * p_sequence) +{ + nrf_pwm_sequence_set(p_instance->p_registers, seq_id, p_sequence); +} + +__STATIC_INLINE void nrfx_pwm_sequence_values_update(nrfx_pwm_t const * const p_instance, + uint8_t seq_id, + nrf_pwm_values_t values) +{ + nrf_pwm_seq_ptr_set(p_instance->p_registers, seq_id, values.p_raw); +} + +__STATIC_INLINE void nrfx_pwm_sequence_length_update(nrfx_pwm_t const * const p_instance, + uint8_t seq_id, + uint16_t length) +{ + nrf_pwm_seq_cnt_set(p_instance->p_registers, seq_id, length); +} + +__STATIC_INLINE void nrfx_pwm_sequence_repeats_update(nrfx_pwm_t const * const p_instance, + uint8_t seq_id, + uint32_t repeats) +{ + nrf_pwm_seq_refresh_set(p_instance->p_registers, seq_id, repeats); +} + +__STATIC_INLINE void nrfx_pwm_sequence_end_delay_update(nrfx_pwm_t const * const p_instance, + uint8_t seq_id, + uint32_t end_delay) +{ + nrf_pwm_seq_end_delay_set(p_instance->p_registers, seq_id, end_delay); +} + +__STATIC_INLINE uint32_t nrfx_pwm_task_address_get(nrfx_pwm_t const * const p_instance, + nrf_pwm_task_t task) +{ + return nrf_pwm_task_address_get(p_instance->p_registers, task); +} + +__STATIC_INLINE uint32_t nrfx_pwm_event_address_get(nrfx_pwm_t const * const p_instance, + nrf_pwm_event_t event) +{ + return nrf_pwm_event_address_get(p_instance->p_registers, event); +} + +#endif // SUPPRESS_INLINE_IMPLEMENTATION + + +void nrfx_pwm_0_irq_handler(void); +void nrfx_pwm_1_irq_handler(void); +void nrfx_pwm_2_irq_handler(void); +void nrfx_pwm_3_irq_handler(void); + + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_PWM_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_qdec.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_qdec.h new file mode 100644 index 0000000000..9f636d5b97 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_qdec.h @@ -0,0 +1,186 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_QDEC_H__ +#define NRFX_QDEC_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_qdec QDEC driver + * @{ + * @ingroup nrf_qdec + * @brief Quadrature Decoder (QDEC) peripheral driver. + */ + +/**@brief QDEC configuration structure.*/ +typedef struct +{ + nrf_qdec_reportper_t reportper; /**< Report period in samples. */ + nrf_qdec_sampleper_t sampleper; /**< Sampling period in microseconds. */ + uint32_t psela; /**< Pin number for A input. */ + uint32_t pselb; /**< Pin number for B input. */ + uint32_t pselled; /**< Pin number for LED output. */ + uint32_t ledpre; /**< Time (in microseconds) how long LED is switched on before sampling. */ + nrf_qdec_ledpol_t ledpol; /**< Active LED polarity. */ + bool dbfen; /**< State of debouncing filter. */ + bool sample_inten; /**< Enabling sample ready interrupt. */ + uint8_t interrupt_priority; /**< QDEC interrupt priority. */ +} nrfx_qdec_config_t; + +/**@brief QDEC default configuration. */ +#define NRFX_QDEC_DEFAULT_CONFIG \ + { \ + .reportper = (nrf_qdec_reportper_t)NRFX_QDEC_CONFIG_REPORTPER, \ + .sampleper = (nrf_qdec_sampleper_t)NRFX_QDEC_CONFIG_SAMPLEPER, \ + .psela = NRFX_QDEC_CONFIG_PIO_A, \ + .pselb = NRFX_QDEC_CONFIG_PIO_B, \ + .pselled = NRFX_QDEC_CONFIG_PIO_LED, \ + .ledpre = NRFX_QDEC_CONFIG_LEDPRE, \ + .ledpol = (nrf_qdec_ledpol_t)NRFX_QDEC_CONFIG_LEDPOL, \ + .interrupt_priority = NRFX_QDEC_CONFIG_IRQ_PRIORITY, \ + .dbfen = NRFX_QDEC_CONFIG_DBFEN, \ + .sample_inten = NRFX_QDEC_CONFIG_SAMPLE_INTEN \ + } + +/**@brief QDEC sample event data.*/ +typedef struct +{ + int8_t value; /**< Sample value. */ +} nrfx_qdec_sample_data_evt_t; + +/**@brief QDEC report event data.*/ +typedef struct +{ + int16_t acc; /**< Accumulated transitions. */ + uint16_t accdbl; /**< Accumulated double transitions. */ +} nrfx_qdec_report_data_evt_t; + +/**@brief QDEC event handler structure. */ +typedef struct +{ + nrf_qdec_event_t type; + union + { + nrfx_qdec_sample_data_evt_t sample; /**< Sample event data. */ + nrfx_qdec_report_data_evt_t report; /**< Report event data. */ + } data; +} nrfx_qdec_event_t; + +/**@brief QDEC event handler. + * @param[in] event QDEC event structure. + */ +typedef void (*nrfx_qdec_event_handler_t)(nrfx_qdec_event_t event); + +/**@brief Function for initializing QDEC. + * + * @param[in] p_config Pointer to the structure with initial configuration. + * @param[in] event_handler Event handler provided by the user. + * Must not be NULL. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If QDEC was already initialized. + */ +nrfx_err_t nrfx_qdec_init(nrfx_qdec_config_t const * p_config, + nrfx_qdec_event_handler_t event_handler); + +/**@brief Function for uninitializing QDEC. + * @note Function asserts if module is uninitialized. + */ +void nrfx_qdec_uninit(void); + +/**@brief Function for enabling QDEC. + * @note Function asserts if module is uninitialized or enabled. + */ +void nrfx_qdec_enable(void); + +/**@brief Function for disabling QDEC. + * @note Function asserts if module is uninitialized or disabled. + */ +void nrfx_qdec_disable(void); + +/**@brief Function for reading accumulated transitions QDEC. + * @note Function asserts if module is not enabled. + * @note Accumulators are cleared after reading. + * + * @param[out] p_acc Pointer to store accumulated transitions. + * @param[out] p_accdbl Pointer to store accumulated double transitions. + */ +void nrfx_qdec_accumulators_read(int16_t * p_acc, int16_t * p_accdbl); + +/** + * @brief Function for returning the address of a specific QDEC task. + * + * @param task QDEC task. + * + * @return Task address. + */ +__STATIC_INLINE uint32_t nrfx_qdec_task_address_get(nrf_qdec_task_t task) +{ + return (uint32_t)nrf_qdec_task_address_get(task); +} + +/** + * @brief Function for returning the address of a specific QDEC event. + * + * @param event QDEC event. + * + * @return Event address. + */ +__STATIC_INLINE uint32_t nrfx_qdec_event_address_get(nrf_qdec_event_t event) +{ + return (uint32_t)nrf_qdec_event_address_get(event); +} + + +void nrfx_qdec_irq_handler(void); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_QDEC_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/qspi/nrf_drv_qspi.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_qspi.h similarity index 56% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/qspi/nrf_drv_qspi.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_qspi.h index 1301cacf71..1b5791ecb0 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/qspi/nrf_drv_qspi.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_qspi.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,107 +37,78 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/**@file - * @addtogroup nrf_qspi QSPI HAL and driver - * @ingroup nrf_drivers - * @brief @tagAPI52840 Quad serial peripheral interface (QSPI) APIs. - * - * @defgroup nrf_drv_qspi QSPI driver - * @{ - * @ingroup nrf_qspi - * @brief @tagAPI52840 Quad serial peripheral interface (QSPI) driver. - */ -#ifndef NRF_DRV_QSPI_H__ -#define NRF_DRV_QSPI_H__ +#ifndef NRFX_QSPI_H__ +#define NRFX_QSPI_H__ -#include "nordic_common.h" -#include "sdk_config.h" -#include "nrf_qspi.h" -#include "sdk_errors.h" -#include "boards.h" +#include +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrfx_qspi QSPI driver + * @{ + * @ingroup nrf_qspi + * @brief Quad Serial Peripheral Interface (QSPI) peripheral driver. + */ + /** * @brief QSPI driver instance configuration structure. */ typedef struct { + uint32_t xip_offset; /**< Address offset into the external memory for Execute in Place operation. */ nrf_qspi_pins_t pins; /**< Pins configuration structure. */ nrf_qspi_prot_conf_t prot_if; /**< Protocol layer interface configuration structure. */ nrf_qspi_phy_conf_t phy_if; /**< Physical layer interface configuration structure. */ uint8_t irq_priority; /**< Interrupt priority. */ -} nrf_drv_qspi_config_t; +} nrfx_qspi_config_t; -#if QSPI_PIN_SCK == NRF_QSPI_PIN_NOT_CONNECTED - #undef QSPI_PIN_SCK - #define QSPI_PIN_SCK BSP_QSPI_SCK_PIN -#endif -#if QSPI_PIN_CSN == NRF_QSPI_PIN_NOT_CONNECTED - #undef QSPI_PIN_CSN - #define QSPI_PIN_CSN BSP_QSPI_CSN_PIN -#endif -#if QSPI_PIN_IO0 == NRF_QSPI_PIN_NOT_CONNECTED - #undef QSPI_PIN_IO0 - #define QSPI_PIN_IO0 BSP_QSPI_IO0_PIN -#endif -#if QSPI_PIN_IO1 == NRF_QSPI_PIN_NOT_CONNECTED - #undef QSPI_PIN_IO1 - #define QSPI_PIN_IO1 BSP_QSPI_IO1_PIN -#endif -#if QSPI_PIN_IO2 == NRF_QSPI_PIN_NOT_CONNECTED - #undef QSPI_PIN_IO2 - #define QSPI_PIN_IO2 BSP_QSPI_IO2_PIN -#endif -#if QSPI_PIN_IO3 == NRF_QSPI_PIN_NOT_CONNECTED - #undef QSPI_PIN_IO3 - #define QSPI_PIN_IO3 BSP_QSPI_IO3_PIN -#endif /** * @brief QSPI instance default configuration. */ -#define NRF_DRV_QSPI_DEFAULT_CONFIG \ +#define NRFX_QSPI_DEFAULT_CONFIG \ { \ + .xip_offset = NRFX_QSPI_CONFIG_XIP_OFFSET, \ .pins = { \ - .sck_pin = QSPI_PIN_SCK, \ - .csn_pin = QSPI_PIN_CSN, \ - .io0_pin = QSPI_PIN_IO0, \ - .io1_pin = QSPI_PIN_IO1, \ - .io2_pin = QSPI_PIN_IO2, \ - .io3_pin = QSPI_PIN_IO3, \ + .sck_pin = NRFX_QSPI_PIN_SCK, \ + .csn_pin = NRFX_QSPI_PIN_CSN, \ + .io0_pin = NRFX_QSPI_PIN_IO0, \ + .io1_pin = NRFX_QSPI_PIN_IO1, \ + .io2_pin = NRFX_QSPI_PIN_IO2, \ + .io3_pin = NRFX_QSPI_PIN_IO3, \ }, \ - .irq_priority = (uint8_t)QSPI_CONFIG_IRQ_PRIORITY, \ + .irq_priority = (uint8_t)NRFX_QSPI_CONFIG_IRQ_PRIORITY, \ .prot_if = { \ - .readoc = (nrf_qspi_readoc_t) QSPI_CONFIG_READOC, \ - .writeoc = (nrf_qspi_writeoc_t) QSPI_CONFIG_WRITEOC, \ - .addrmode = (nrf_qspi_addrmode_t) QSPI_CONFIG_ADDRMODE, \ - .dpmconfig = false, \ + .readoc = (nrf_qspi_readoc_t)NRFX_QSPI_CONFIG_READOC, \ + .writeoc = (nrf_qspi_writeoc_t)NRFX_QSPI_CONFIG_WRITEOC, \ + .addrmode = (nrf_qspi_addrmode_t)NRFX_QSPI_CONFIG_ADDRMODE, \ + .dpmconfig = false, \ }, \ .phy_if = { \ - .sck_freq = (nrf_qspi_frequency_t) QSPI_CONFIG_FREQUENCY, \ - .sck_delay = (uint8_t) QSPI_CONFIG_SCK_DELAY, \ - .spi_mode = (nrf_qspi_spi_mode_t) QSPI_CONFIG_MODE, \ - .dpmen = false \ - } \ + .sck_freq = (nrf_qspi_frequency_t)NRFX_QSPI_CONFIG_FREQUENCY, \ + .sck_delay = (uint8_t)NRFX_QSPI_CONFIG_SCK_DELAY, \ + .spi_mode = (nrf_qspi_spi_mode_t)NRFX_QSPI_CONFIG_MODE, \ + .dpmen = false \ + }, \ } - /** * @brief QSPI custom instruction helper with default configuration. */ -#define NRF_DRV_QSPI_DEFAULT_CINSTR(opc, len) \ -{ \ - .opcode = (opc), \ - .length = (len), \ - .io2_level = false, \ - .io3_level = false, \ - .wipwait = false, \ - .wren = false, \ - .lfen = false, \ - .lfstop = false \ +#define NRFX_QSPI_DEFAULT_CINSTR(opc, len) \ +{ \ + .opcode = (opc), \ + .length = (len), \ + .io2_level = false, \ + .io3_level = false, \ + .wipwait = false, \ + .wren = false, \ + .lfen = false, \ + .lfstop = false \ } /** @@ -146,35 +117,47 @@ typedef struct */ typedef enum { - NRF_DRV_QSPI_EVENT_DONE, /**< Transfer done. */ -} nrf_drv_qspi_evt_t; + NRFX_QSPI_EVENT_DONE, /**< Transfer done. */ +} nrfx_qspi_evt_t; /** * @brief QSPI driver event handler type. */ -typedef void (*nrf_drv_qspi_handler_t)(nrf_drv_qspi_evt_t event, void * p_context); +typedef void (*nrfx_qspi_handler_t)(nrfx_qspi_evt_t event, void * p_context); /** * @brief Function for initializing the QSPI driver instance. * - * @param[in] p_config Pointer to the structure with the initial configuration. + * This function configures the peripheral and its interrupts and activates it. During the + * activation process, the internal clocks are started and the QSPI peripheral tries to read + * the status byte to read the busy bit. Reading the status byte is done in a simple poll and wait + * mechanism. + * If the busy bit is 1, this indicates issues with the external memory device. As a result, + * @ref nrfx_qspi_init returns NRFX_ERROR_TIMEOUT. + * + * In case of issues: + * - Check the connection. + * - Make sure that the memory device does not perform other operations like erasing or writing. + * - Check if there is a short circuit. + * + * @param[in] p_config Pointer to the structure with initial configuration. * @param[in] handler Event handler provided by the user. If NULL, transfers * will be performed in blocking mode. * @param[in] p_context Pointer to context. Use in interrupt handler. * - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the driver was already initialized. - * @retval NRF_ERROR_INVALID_PARAM If the pin configuration was incorrect. + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_TIMEOUT If the peripheral cannot connect with external memory. + * @retval NRFX_ERROR_INVALID_STATE If the driver was already initialized. + * @retval NRFX_ERROR_INVALID_PARAM If the pin configuration was incorrect. */ -ret_code_t nrf_drv_qspi_init(nrf_drv_qspi_config_t const * p_config, - nrf_drv_qspi_handler_t handler, - void * p_context); +nrfx_err_t nrfx_qspi_init(nrfx_qspi_config_t const * p_config, + nrfx_qspi_handler_t handler, + void * p_context); /** * @brief Function for uninitializing the QSPI driver instance. */ -void nrf_drv_qspi_uninit(void); +void nrfx_qspi_uninit(void); /** * @brief Function for reading data from QSPI memory. @@ -190,14 +173,14 @@ void nrf_drv_qspi_uninit(void); * @param[in] rx_buffer_length Size of the data to read. * @param[in] src_address Address in memory to read from. * - * @retval NRF_SUCCESS If the operation was successful (blocking mode) or operation - * was commissioned (handler mode). - * @retval NRF_ERROR_BUSY If the driver currently handles another operation. - * @retval NRF_ERROR_INVALID_ADDR If the provided buffer is not placed in the Data RAM region. + * @retval NRFX_SUCCESS If the operation was successful (blocking mode) or operation + * was commissioned (handler mode). + * @retval NRFX_ERROR_BUSY If the driver currently handles another operation. + * @retval NRFX_ERROR_INVALID_ADDR If the provided buffer is not placed in the Data RAM region. */ -ret_code_t nrf_drv_qspi_read(void * p_rx_buffer, - size_t rx_buffer_length, - uint32_t src_address); +nrfx_err_t nrfx_qspi_read(void * p_rx_buffer, + size_t rx_buffer_length, + uint32_t src_address); /** * @brief Function for writing data to QSPI memory. @@ -208,7 +191,7 @@ ret_code_t nrf_drv_qspi_read(void * p_rx_buffer, * until operation data is still being sent. * - interrupt mode (with handler) - event emission occurs after the last operation * and sending of operation data are finished. - * To manually control operation execution in the memory device, use @ref nrf_drv_qspi_mem_busy_check + * To manually control operation execution in the memory device, use @ref nrfx_qspi_mem_busy_check * after executing the write function. * Remember that an incoming event signalizes only that data was sent to the memory device and the periheral * before the write operation checked if memory was busy. @@ -217,14 +200,14 @@ ret_code_t nrf_drv_qspi_read(void * p_rx_buffer, * @param[in] tx_buffer_length Size of the data to write. * @param[in] dst_address Address in memory to write to. * - * @retval NRF_SUCCESS If the operation was successful (blocking mode) or operation - * was commissioned (handler mode). - * @retval NRF_ERROR_BUSY If the driver currently handles other operation. - * @retval NRF_ERROR_INVALID_ADDR If the provided buffer is not placed in the Data RAM region. + * @retval NRFX_SUCCESS If the operation was successful (blocking mode) or operation + * was commissioned (handler mode). + * @retval NRFX_ERROR_BUSY If the driver currently handles other operation. + * @retval NRFX_ERROR_INVALID_ADDR If the provided buffer is not placed in the Data RAM region. */ -ret_code_t nrf_drv_qspi_write(void const * p_tx_buffer, - size_t tx_buffer_length, - uint32_t dst_address); +nrfx_err_t nrfx_qspi_write(void const * p_tx_buffer, + size_t tx_buffer_length, + uint32_t dst_address); /** * @brief Function for starting erasing of one memory block - 4KB, 64KB, or the whole chip. @@ -235,7 +218,7 @@ ret_code_t nrf_drv_qspi_write(void const * p_tx_buffer, * until operation data is still being sent. * - interrupt mode (with handler) - event emission occurs after the last operation * and sending of operation data are finished. - * To manually control operation execution in the memory device, use @ref nrf_drv_qspi_mem_busy_check + * To manually control operation execution in the memory device, use @ref nrfx_qspi_mem_busy_check * after executing the erase function. * Remember that an incoming event signalizes only that data was sent to the memory device and the periheral * before the erase operation checked if memory was busy. @@ -244,30 +227,30 @@ ret_code_t nrf_drv_qspi_write(void const * p_tx_buffer, * @param[in] start_address Memory address to start erasing. If chip erase is performed, address * field is ommited. * - * @retval NRF_SUCCESS If the operation was successful (blocking mode) or operation - * was commissioned (handler mode). - * @retval NRF_ERROR_BUSY If the driver currently handles another operation. + * @retval NRFX_SUCCESS If the operation was successful (blocking mode) or operation + * was commissioned (handler mode). + * @retval NRFX_ERROR_BUSY If the driver currently handles another operation. */ -ret_code_t nrf_drv_qspi_erase(nrf_qspi_erase_len_t length, - uint32_t start_address); +nrfx_err_t nrfx_qspi_erase(nrf_qspi_erase_len_t length, + uint32_t start_address); /** * @brief Function for starting an erase operation of the whole chip. * - * @retval NRF_SUCCESS If the operation was successful (blocking mode) or operation - * was commissioned (handler mode). - * @retval NRF_ERROR_BUSY If the driver currently handles another operation. + * @retval NRFX_SUCCESS If the operation was successful (blocking mode) or operation + * was commissioned (handler mode). + * @retval NRFX_ERROR_BUSY If the driver currently handles another operation. */ -ret_code_t nrf_drv_qspi_chip_erase(void); +nrfx_err_t nrfx_qspi_chip_erase(void); /** * @brief Function for getting the current driver status and status byte of memory device with * testing WIP (write in progress) bit. * - * @retval NRF_SUCCESS If the driver and memory are ready to handle a new operation. - * @retval NRF_ERROR_BUSY If the driver or memory currently handle another operation. + * @retval NRFX_SUCCESS If the driver and memory are ready to handle a new operation. + * @retval NRFX_ERROR_BUSY If the driver or memory currently handle another operation. */ -ret_code_t nrf_drv_qspi_mem_busy_check(void); +nrfx_err_t nrfx_qspi_mem_busy_check(void); /** * @brief Function for sending operation code, sending data, and receiving data from the memory device. @@ -275,18 +258,18 @@ ret_code_t nrf_drv_qspi_mem_busy_check(void); * Use this function to transfer configuration data to memory and to receive data from memory. * Pointers can be addresses from flash memory. * This function is a synchronous function and should be used only if necessary. - * See more: @ref hardware_driver_qspi. * * @param[in] p_config Pointer to the structure with opcode and transfer configuration. * @param[in] p_tx_buffer Pointer to the array with data to send. Can be NULL if only opcode is transmitted. * @param[out] p_rx_buffer Pointer to the array for data to receive. Can be NULL if there is nothing to receive. * - * @retval NRF_SUCCESS If the operation was successful. - * @retval NRF_ERROR_BUSY If the driver currently handles other operation. + * @retval NRFX_SUCCESS If the operation was successful. + * @retval NRFX_ERROR_TIMEOUT If the external memory is busy or there are connection issues. + * @retval NRFX_ERROR_BUSY If the driver currently handles other operation. */ -ret_code_t nrf_drv_qspi_cinstr_xfer(nrf_qspi_cinstr_conf_t const * p_config, - void const * p_tx_buffer, - void * p_rx_buffer); +nrfx_err_t nrfx_qspi_cinstr_xfer(nrf_qspi_cinstr_conf_t const * p_config, + void const * p_tx_buffer, + void * p_rx_buffer); /** * @brief Function for sending operation code and data to the memory device with simpler configuration. * @@ -297,17 +280,20 @@ ret_code_t nrf_drv_qspi_cinstr_xfer(nrf_qspi_cinstr_conf_t const * p_config, * @param[in] length Length of the data to send and opcode. See @ref nrf_qspi_cinstr_len_t. * @param[in] p_tx_buffer Pointer to input data array. * - * @retval NRF_SUCCESS If the operation was successful. - * @retval NRF_ERROR_BUSY If the driver currently handles another operation. + * @retval NRFX_SUCCESS If the operation was successful. + * @retval NRFX_ERROR_BUSY If the driver currently handles another operation. */ -ret_code_t nrf_drv_qspi_cinstr_quick_send(uint8_t opcode, - nrf_qspi_cinstr_len_t length, - void const * p_tx_buffer); +nrfx_err_t nrfx_qspi_cinstr_quick_send(uint8_t opcode, + nrf_qspi_cinstr_len_t length, + void const * p_tx_buffer); + + +void nrfx_qspi_irq_handler(void); + +/** @} */ #ifdef __cplusplus } #endif -#endif // NRF_DRV_QSPI_H__ - -/** @} */ +#endif // NRFX_QSPI_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_rng.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_rng.h new file mode 100644 index 0000000000..431f872f1d --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_rng.h @@ -0,0 +1,126 @@ +/** + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#ifndef NRFX_RNG_H__ +#define NRFX_RNG_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_rng RNG driver + * @{ + * @ingroup nrf_rng + * @brief Random Number Generator (RNG) peripheral driver. + */ + +/** + * @brief Struct for RNG configuration. + */ +typedef struct +{ + bool error_correction : 1; /**< Error correction flag. */ + uint8_t interrupt_priority; /**< interrupt priority */ +} nrfx_rng_config_t; + +/** + * @brief RNG default configuration. + * Basic usage: + * @code + * nrfx_rng_config_t config = NRFX_RNG_DEFAULT_CONFIG; + * if (nrfx_rng_init(&config, handler) + * { ... + * @endcode + */ +#define NRFX_RNG_DEFAULT_CONFIG \ + { \ + .error_correction = NRFX_RNG_CONFIG_ERROR_CORRECTION, \ + .interrupt_priority = NRFX_RNG_CONFIG_IRQ_PRIORITY, \ + } + +/** + * @brief RNG driver event handler type. + */ +typedef void (* nrfx_rng_evt_handler_t)(uint8_t rng_data); + +/** + * @brief Function for initializing the nrfx_rng module. + * + * @param[in] p_config Pointer to the structure with initial configuration. + * @param[in] handler Event handler provided by the user. Must not be NULL. + * + * @retval NRFX_SUCCESS Driver was successfully initialized. + * @retval NRFX_ERROR_ALREADY_INITIALIZED Driver was already initialized. + */ +nrfx_err_t nrfx_rng_init(nrfx_rng_config_t const * p_config, nrfx_rng_evt_handler_t handler); + +/** + * @brief Function for starting the random value generation. + * + * Function enables interrupts in perihperal and start them. + */ +void nrfx_rng_start(void); + +/** + * @brief Function for stoping the random value generation. + * + * Function disables interrupts in perihperal and stop generation of new random values. + */ +void nrfx_rng_stop(void); + +/** + * @brief Function for uninitializing the nrfx_rng module. + */ +void nrfx_rng_uninit(void); + + +void nrfx_rng_irq_handler(void); + + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_RNG_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/rtc/nrf_drv_rtc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_rtc.h similarity index 59% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/rtc/nrf_drv_rtc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_rtc.h index 8e55c765bf..aec1b7debb 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/rtc/nrf_drv_rtc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_rtc.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,49 +37,37 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -#ifndef NRF_DRV_RTC_H -#define NRF_DRV_RTC_H +#ifndef NRFX_RTC_H__ +#define NRFX_RTC_H__ -#include "sdk_config.h" -#include "nordic_common.h" -#include "nrf_drv_common.h" -#include "nrf_rtc.h" -#include "sdk_errors.h" +#include +#include #ifdef __cplusplus extern "C" { #endif /** - * @addtogroup nrf_rtc RTC HAL and driver - * @ingroup nrf_drivers - * @brief Real timer counter (RTC) APIs. - * @details The RTC HAL provides basic APIs for accessing the registers of the real time counter (RTC). - * The RTC driver provides APIs on a higher level. - * - * @defgroup nrf_drv_rtc RTC driver + * @defgroup nrfx_rtc RTC driver * @{ * @ingroup nrf_rtc - * @brief Real timer counter (RTC) driver. + * @brief Real Timer Counter (RTC) peripheral driver. */ /**@brief Macro to convert microseconds into ticks. */ -#define RTC_US_TO_TICKS(us,freq) (((us) * (freq)) / 1000000U) +#define NRFX_RTC_US_TO_TICKS(us,freq) (((us) * (freq)) / 1000000U) -/** - * @enum nrf_drv_rtc_int_type_t - * @brief RTC driver interrupt types. - */ +/**@brief RTC driver interrupt types. */ typedef enum { - NRF_DRV_RTC_INT_COMPARE0 = 0, /**< Interrupt from COMPARE0 event. */ - NRF_DRV_RTC_INT_COMPARE1 = 1, /**< Interrupt from COMPARE1 event. */ - NRF_DRV_RTC_INT_COMPARE2 = 2, /**< Interrupt from COMPARE2 event. */ - NRF_DRV_RTC_INT_COMPARE3 = 3, /**< Interrupt from COMPARE3 event. */ - NRF_DRV_RTC_INT_TICK = 4, /**< Interrupt from TICK event. */ - NRF_DRV_RTC_INT_OVERFLOW = 5 /**< Interrupt from OVERFLOW event. */ -} nrf_drv_rtc_int_type_t; + NRFX_RTC_INT_COMPARE0 = 0, /**< Interrupt from COMPARE0 event. */ + NRFX_RTC_INT_COMPARE1 = 1, /**< Interrupt from COMPARE1 event. */ + NRFX_RTC_INT_COMPARE2 = 2, /**< Interrupt from COMPARE2 event. */ + NRFX_RTC_INT_COMPARE3 = 3, /**< Interrupt from COMPARE3 event. */ + NRFX_RTC_INT_TICK = 4, /**< Interrupt from TICK event. */ + NRFX_RTC_INT_OVERFLOW = 5 /**< Interrupt from OVERFLOW event. */ +} nrfx_rtc_int_type_t; /**@brief RTC driver instance structure. */ typedef struct @@ -88,21 +76,30 @@ typedef struct IRQn_Type irq; /**< Instance IRQ ID. */ uint8_t instance_id; /**< Instance index. */ uint8_t cc_channel_count; /**< Number of capture/compare channels. */ -} nrf_drv_rtc_t; - -#define RTC0_INSTANCE_INDEX 0 -#define RTC1_INSTANCE_INDEX RTC0_INSTANCE_INDEX+RTC0_ENABLED -#define RTC2_INSTANCE_INDEX RTC1_INSTANCE_INDEX+RTC1_ENABLED +} nrfx_rtc_t; /**@brief Macro for creating RTC driver instance.*/ -#define NRF_DRV_RTC_INSTANCE(id) \ -{ \ - .p_reg = CONCAT_2(NRF_RTC, id), \ - .irq = CONCAT_3(RTC, id, _IRQn), \ - .instance_id = CONCAT_3(RTC, id, _INSTANCE_INDEX),\ - .cc_channel_count = NRF_RTC_CC_CHANNEL_COUNT(id), \ +#define NRFX_RTC_INSTANCE(id) \ +{ \ + .p_reg = NRFX_CONCAT_2(NRF_RTC, id), \ + .irq = NRFX_CONCAT_3(RTC, id, _IRQn), \ + .instance_id = NRFX_CONCAT_3(NRFX_RTC, id, _INST_IDX), \ + .cc_channel_count = NRF_RTC_CC_CHANNEL_COUNT(id), \ } +enum { +#if NRFX_CHECK(NRFX_RTC0_ENABLED) + NRFX_RTC0_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_RTC1_ENABLED) + NRFX_RTC1_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_RTC2_ENABLED) + NRFX_RTC2_INST_IDX, +#endif + NRFX_RTC_ENABLED_COUNT +}; + /**@brief RTC driver instance configuration structure. */ typedef struct { @@ -110,35 +107,36 @@ typedef struct uint8_t interrupt_priority; /**< Interrupt priority. */ uint8_t tick_latency; /**< Maximum length of interrupt handler in ticks (max 7.7 ms). */ bool reliable; /**< Reliable mode flag. */ -} nrf_drv_rtc_config_t; +} nrfx_rtc_config_t; /**@brief RTC instance default configuration. */ -#define NRF_DRV_RTC_DEFAULT_CONFIG \ -{ \ - .prescaler = RTC_FREQ_TO_PRESCALER(RTC_DEFAULT_CONFIG_FREQUENCY), \ - .interrupt_priority = RTC_DEFAULT_CONFIG_IRQ_PRIORITY, \ - .reliable = RTC_DEFAULT_CONFIG_RELIABLE, \ - .tick_latency = RTC_US_TO_TICKS(NRF_MAXIMUM_LATENCY_US, RTC_DEFAULT_CONFIG_FREQUENCY), \ +#define NRFX_RTC_DEFAULT_CONFIG \ +{ \ + .prescaler = RTC_FREQ_TO_PRESCALER(NRFX_RTC_DEFAULT_CONFIG_FREQUENCY), \ + .interrupt_priority = NRFX_RTC_DEFAULT_CONFIG_IRQ_PRIORITY, \ + .reliable = NRFX_RTC_DEFAULT_CONFIG_RELIABLE, \ + .tick_latency = NRFX_RTC_US_TO_TICKS(NRFX_RTC_MAXIMUM_LATENCY_US, \ + NRFX_RTC_DEFAULT_CONFIG_FREQUENCY), \ } /**@brief RTC driver instance handler type. */ -typedef void (*nrf_drv_rtc_handler_t)(nrf_drv_rtc_int_type_t int_type); +typedef void (*nrfx_rtc_handler_t)(nrfx_rtc_int_type_t int_type); /**@brief Function for initializing the RTC driver instance. * * After initialization, the instance is in power off state. * - * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_config Initial configuration. - * @param[in] handler User's event handler. + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_config Pointer to the structure with initial configuration. + * @param[in] handler Event handler provided by the user. + * Must not be NULL. * - * @retval NRF_SUCCESS If successfully initialized. - * @retval NRF_ERROR_INVALID_PARAM If no handler was provided. - * @retval NRF_ERROR_INVALID_STATE If the instance is already initialized. + * @retval NRFX_SUCCESS If successfully initialized. + * @retval NRFX_ERROR_INVALID_STATE If the instance is already initialized. */ -ret_code_t nrf_drv_rtc_init(nrf_drv_rtc_t const * const p_instance, - nrf_drv_rtc_config_t const * p_config, - nrf_drv_rtc_handler_t handler); +nrfx_err_t nrfx_rtc_init(nrfx_rtc_t const * const p_instance, + nrfx_rtc_config_t const * p_config, + nrfx_rtc_handler_t handler); /**@brief Function for uninitializing the RTC driver instance. * @@ -147,7 +145,7 @@ ret_code_t nrf_drv_rtc_init(nrf_drv_rtc_t const * const p_instance, * * @param[in] p_instance Pointer to the driver instance structure. */ -void nrf_drv_rtc_uninit(nrf_drv_rtc_t const * const p_instance); +void nrfx_rtc_uninit(nrfx_rtc_t const * const p_instance); /**@brief Function for enabling the RTC driver instance. * @@ -155,7 +153,7 @@ void nrf_drv_rtc_uninit(nrf_drv_rtc_t const * const p_instance); * * @param[in] p_instance Pointer to the driver instance structure. */ -void nrf_drv_rtc_enable(nrf_drv_rtc_t const * const p_instance); +void nrfx_rtc_enable(nrfx_rtc_t const * const p_instance); /**@brief Function for disabling the RTC driver instance. * @@ -163,7 +161,7 @@ void nrf_drv_rtc_enable(nrf_drv_rtc_t const * const p_instance); * * @param[in] p_instance Pointer to the driver instance structure. */ -void nrf_drv_rtc_disable(nrf_drv_rtc_t const * const p_instance); +void nrfx_rtc_disable(nrfx_rtc_t const * const p_instance); /**@brief Function for setting a compare channel. * @@ -185,14 +183,14 @@ void nrf_drv_rtc_disable(nrf_drv_rtc_t const * const p_instance); * @param[in] val Absolute value to be set in the compare register. * @param[in] enable_irq True to enable the interrupt. False to disable the interrupt. * - * @retval NRF_SUCCESS If the procedure was successful. - * @retval NRF_ERROR_TIMEOUT If the compare was not set because the request value is behind the current counter - * value. This error can only be reported if RTCn_CONFIG_RELIABLE = 1. + * @retval NRFX_SUCCESS If the procedure was successful. + * @retval NRFX_ERROR_TIMEOUT If the compare was not set because the request value is behind the current counter + * value. This error can only be reported if RTCn_CONFIG_RELIABLE = 1. */ -ret_code_t nrf_drv_rtc_cc_set(nrf_drv_rtc_t const * const p_instance, - uint32_t channel, - uint32_t val, - bool enable_irq); +nrfx_err_t nrfx_rtc_cc_set(nrfx_rtc_t const * const p_instance, + uint32_t channel, + uint32_t val, + bool enable_irq); /**@brief Function for disabling a channel. * @@ -202,10 +200,10 @@ ret_code_t nrf_drv_rtc_cc_set(nrf_drv_rtc_t const * const p_instance, * @param[in] p_instance Pointer to the driver instance structure. * @param[in] channel One of the instance's channels. * - * @retval NRF_SUCCESS If the procedure was successful. - * @retval NRF_ERROR_TIMEOUT If an interrupt was pending on the requested channel. + * @retval NRFX_SUCCESS If the procedure was successful. + * @retval NRFX_ERROR_TIMEOUT If an interrupt was pending on the requested channel. */ -ret_code_t nrf_drv_rtc_cc_disable(nrf_drv_rtc_t const * const p_instance, uint32_t channel); +nrfx_err_t nrfx_rtc_cc_disable(nrfx_rtc_t const * const p_instance, uint32_t channel); /**@brief Function for enabling tick. * @@ -215,7 +213,7 @@ ret_code_t nrf_drv_rtc_cc_disable(nrf_drv_rtc_t const * const p_instance, uint32 * @param[in] p_instance Pointer to the driver instance structure. * @param[in] enable_irq True to enable the interrupt. False to disable the interrupt. */ -void nrf_drv_rtc_tick_enable(nrf_drv_rtc_t const * const p_instance, bool enable_irq); +void nrfx_rtc_tick_enable(nrfx_rtc_t const * const p_instance, bool enable_irq); /**@brief Function for disabling tick. * @@ -223,7 +221,7 @@ void nrf_drv_rtc_tick_enable(nrf_drv_rtc_t const * const p_instance, bool enable * * @param[in] p_instance Pointer to the driver instance structure. */ -void nrf_drv_rtc_tick_disable(nrf_drv_rtc_t const * const p_instance); +void nrfx_rtc_tick_disable(nrfx_rtc_t const * const p_instance); /**@brief Function for enabling overflow. * @@ -233,7 +231,7 @@ void nrf_drv_rtc_tick_disable(nrf_drv_rtc_t const * const p_instance); * @param[in] p_instance Pointer to the driver instance structure. * @param[in] enable_irq True to enable the interrupt. False to disable the interrupt. */ -void nrf_drv_rtc_overflow_enable(nrf_drv_rtc_t const * const p_instance, bool enable_irq); +void nrfx_rtc_overflow_enable(nrfx_rtc_t const * const p_instance, bool enable_irq); /**@brief Function for disabling overflow. * @@ -241,35 +239,36 @@ void nrf_drv_rtc_overflow_enable(nrf_drv_rtc_t const * const p_instance, bool en * * @param[in] p_instance Pointer to the driver instance structure. */ -void nrf_drv_rtc_overflow_disable(nrf_drv_rtc_t const * const p_instance); +void nrfx_rtc_overflow_disable(nrfx_rtc_t const * const p_instance); /**@brief Function for getting the maximum relative ticks value that can be set in the compare channel. * - * When a SoftDevice is used, it occupies the highest level interrupt, so that the application code can be - * interrupted at any moment for a certain period of time. If Reliable mode is enabled, the provided - * maximum latency is taken into account and the return value is smaller than the RTC counter - * resolution. If Reliable mode is disabled, the return value equals the counter resolution. + * When a stack (for example SoftDevice) is used and it occupies high priority interrupts, + * the application code can be interrupted at any moment for a certain period of time. + * If Reliable mode is enabled, the provided maximum latency is taken into account + * and the return value is smaller than the RTC counter resolution. + * If Reliable mode is disabled, the return value equals the counter resolution. * * @param[in] p_instance Pointer to the driver instance structure. * * @retval ticks Maximum ticks value. */ -uint32_t nrf_drv_rtc_max_ticks_get(nrf_drv_rtc_t const * const p_instance); +uint32_t nrfx_rtc_max_ticks_get(nrfx_rtc_t const * const p_instance); /**@brief Function for disabling all instance interrupts. * * @param[in] p_instance Pointer to the driver instance structure. * @param[in] p_mask Pointer to the location where the mask is filled. */ -__STATIC_INLINE void nrf_drv_rtc_int_disable(nrf_drv_rtc_t const * const p_instance, - uint32_t * p_mask); +__STATIC_INLINE void nrfx_rtc_int_disable(nrfx_rtc_t const * const p_instance, + uint32_t * p_mask); /**@brief Function for enabling instance interrupts. * * @param[in] p_instance Pointer to the driver instance structure. * @param[in] mask Mask of interrupts to enable. */ -__STATIC_INLINE void nrf_drv_rtc_int_enable(nrf_drv_rtc_t const * const p_instance, uint32_t mask); +__STATIC_INLINE void nrfx_rtc_int_enable(nrfx_rtc_t const * const p_instance, uint32_t mask); /**@brief Function for retrieving the current counter value. * @@ -279,7 +278,7 @@ __STATIC_INLINE void nrf_drv_rtc_int_enable(nrf_drv_rtc_t const * const p_instan * * @retval value Counter value. */ -__STATIC_INLINE uint32_t nrf_drv_rtc_counter_get(nrf_drv_rtc_t const * const p_instance); +__STATIC_INLINE uint32_t nrfx_rtc_counter_get(nrfx_rtc_t const * const p_instance); /**@brief Function for clearing the counter value. * @@ -287,7 +286,7 @@ __STATIC_INLINE uint32_t nrf_drv_rtc_counter_get(nrf_drv_rtc_t const * const p_i * * @param[in] p_instance Pointer to the driver instance structure. */ -__STATIC_INLINE void nrf_drv_rtc_counter_clear(nrf_drv_rtc_t const * const p_instance); +__STATIC_INLINE void nrfx_rtc_counter_clear(nrfx_rtc_t const * const p_instance); /**@brief Function for returning a requested task address for the RTC driver instance. * @@ -298,8 +297,8 @@ __STATIC_INLINE void nrf_drv_rtc_counter_clear(nrf_drv_rtc_t const * const p_ins * * @retval Address of task register. */ -__STATIC_INLINE uint32_t nrf_drv_rtc_task_address_get(nrf_drv_rtc_t const * const p_instance, - nrf_rtc_task_t task); +__STATIC_INLINE uint32_t nrfx_rtc_task_address_get(nrfx_rtc_t const * const p_instance, + nrf_rtc_task_t task); /**@brief Function for returning a requested event address for the RTC driver instance. * @@ -310,12 +309,13 @@ __STATIC_INLINE uint32_t nrf_drv_rtc_task_address_get(nrf_drv_rtc_t const * cons * * @retval Address of event register. */ -__STATIC_INLINE uint32_t nrf_drv_rtc_event_address_get(nrf_drv_rtc_t const * const p_instance, - nrf_rtc_event_t event); +__STATIC_INLINE uint32_t nrfx_rtc_event_address_get(nrfx_rtc_t const * const p_instance, + nrf_rtc_event_t event); + #ifndef SUPPRESS_INLINE_IMPLEMENTATION -__STATIC_INLINE void nrf_drv_rtc_int_disable(nrf_drv_rtc_t const * const p_instance, - uint32_t * p_mask) +__STATIC_INLINE void nrfx_rtc_int_disable(nrfx_rtc_t const * const p_instance, + uint32_t * p_mask) { *p_mask = nrf_rtc_int_get(p_instance->p_reg); nrf_rtc_int_disable(p_instance->p_reg, NRF_RTC_INT_TICK_MASK | @@ -326,40 +326,44 @@ __STATIC_INLINE void nrf_drv_rtc_int_disable(nrf_drv_rtc_t const * const p_insta NRF_RTC_INT_COMPARE3_MASK); } -__STATIC_INLINE void nrf_drv_rtc_int_enable(nrf_drv_rtc_t const * const p_instance, uint32_t mask) +__STATIC_INLINE void nrfx_rtc_int_enable(nrfx_rtc_t const * const p_instance, uint32_t mask) { nrf_rtc_int_enable(p_instance->p_reg, mask); } -__STATIC_INLINE uint32_t nrf_drv_rtc_counter_get(nrf_drv_rtc_t const * const p_instance) +__STATIC_INLINE uint32_t nrfx_rtc_counter_get(nrfx_rtc_t const * const p_instance) { return nrf_rtc_counter_get(p_instance->p_reg); } -__STATIC_INLINE void nrf_drv_rtc_counter_clear(nrf_drv_rtc_t const * const p_instance) +__STATIC_INLINE void nrfx_rtc_counter_clear(nrfx_rtc_t const * const p_instance) { - nrf_rtc_task_trigger(p_instance->p_reg,NRF_RTC_TASK_CLEAR); + nrf_rtc_task_trigger(p_instance->p_reg, NRF_RTC_TASK_CLEAR); } -__STATIC_INLINE uint32_t nrf_drv_rtc_task_address_get(nrf_drv_rtc_t const * const p_instance, - nrf_rtc_task_t task) +__STATIC_INLINE uint32_t nrfx_rtc_task_address_get(nrfx_rtc_t const * const p_instance, + nrf_rtc_task_t task) { return nrf_rtc_task_address_get(p_instance->p_reg, task); } -__STATIC_INLINE uint32_t nrf_drv_rtc_event_address_get(nrf_drv_rtc_t const * const p_instance, - nrf_rtc_event_t event) +__STATIC_INLINE uint32_t nrfx_rtc_event_address_get(nrfx_rtc_t const * const p_instance, + nrf_rtc_event_t event) { return nrf_rtc_event_address_get(p_instance->p_reg, event); } -#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ +#endif // SUPPRESS_INLINE_IMPLEMENTATION -/** - *@} - **/ + +void nrfx_rtc_0_irq_handler(void); +void nrfx_rtc_1_irq_handler(void); +void nrfx_rtc_2_irq_handler(void); + + +/** @} */ #ifdef __cplusplus } #endif -#endif /* NRF_DRV_RTC_H */ +#endif // NRFX_RTC_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_saadc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_saadc.h new file mode 100644 index 0000000000..76532d4da3 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_saadc.h @@ -0,0 +1,326 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_SAADC_H__ +#define NRFX_SAADC_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_saadc SAADC driver + * @{ + * @ingroup nrf_saadc + * @brief Successive Approximation Analog-to-Digital Converter (SAADC) peripheral driver. + */ + +/** + * @brief Value that should be set as high limit to disable limit detection. + */ +#define NRFX_SAADC_LIMITH_DISABLED (2047) +/** + * @brief Value that should be set as low limit to disable limit detection. + */ +#define NRFX_SAADC_LIMITL_DISABLED (-2048) + +/** + * @brief Macro for setting @ref nrfx_saadc_config_t to default settings. + */ +#define NRFX_SAADC_DEFAULT_CONFIG \ +{ \ + .resolution = (nrf_saadc_resolution_t)NRFX_SAADC_CONFIG_RESOLUTION, \ + .oversample = (nrf_saadc_oversample_t)NRFX_SAADC_CONFIG_OVERSAMPLE, \ + .interrupt_priority = NRFX_SAADC_CONFIG_IRQ_PRIORITY, \ + .low_power_mode = NRFX_SAADC_CONFIG_LP_MODE \ +} + +/** + * @brief Macro for setting @ref nrf_saadc_channel_config_t to default settings + * in single ended mode. + * + * @param PIN_P Analog input. + */ +#define NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(PIN_P) \ +{ \ + .resistor_p = NRF_SAADC_RESISTOR_DISABLED, \ + .resistor_n = NRF_SAADC_RESISTOR_DISABLED, \ + .gain = NRF_SAADC_GAIN1_6, \ + .reference = NRF_SAADC_REFERENCE_INTERNAL, \ + .acq_time = NRF_SAADC_ACQTIME_10US, \ + .mode = NRF_SAADC_MODE_SINGLE_ENDED, \ + .burst = NRF_SAADC_BURST_DISABLED, \ + .pin_p = (nrf_saadc_input_t)(PIN_P), \ + .pin_n = NRF_SAADC_INPUT_DISABLED \ +} + +/** + * @brief Macro for setting @ref nrf_saadc_channel_config_t to default settings + * in differential mode. + * + * @param PIN_P Positive analog input. + * @param PIN_N Negative analog input. + */ +#define NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_DIFFERENTIAL(PIN_P, PIN_N) \ +{ \ + .resistor_p = NRF_SAADC_RESISTOR_DISABLED, \ + .resistor_n = NRF_SAADC_RESISTOR_DISABLED, \ + .gain = NRF_SAADC_GAIN1_6, \ + .reference = NRF_SAADC_REFERENCE_INTERNAL, \ + .acq_time = NRF_SAADC_ACQTIME_10US, \ + .mode = NRF_SAADC_MODE_DIFFERENTIAL, \ + .pin_p = (nrf_saadc_input_t)(PIN_P), \ + .pin_n = (nrf_saadc_input_t)(PIN_N) \ +} + +/** + * @brief Analog-to-digital converter driver configuration structure. + */ +typedef struct +{ + nrf_saadc_resolution_t resolution; ///< Resolution configuration. + nrf_saadc_oversample_t oversample; ///< Oversampling configuration. + uint8_t interrupt_priority; ///< Interrupt priority. + bool low_power_mode; ///< Indicates if low power mode is active. +} nrfx_saadc_config_t; + +/** + * @brief Driver event types. + */ +typedef enum +{ + NRFX_SAADC_EVT_DONE, ///< Event generated when the buffer is filled with samples. + NRFX_SAADC_EVT_LIMIT, ///< Event generated after one of the limits is reached. + NRFX_SAADC_EVT_CALIBRATEDONE ///< Event generated when the calibration is complete. +} nrfx_saadc_evt_type_t; + +/** + * @brief Analog-to-digital converter driver done event data. + */ +typedef struct +{ + nrf_saadc_value_t * p_buffer; ///< Pointer to buffer with converted samples. + uint16_t size; ///< Number of samples in the buffer. +} nrfx_saadc_done_evt_t; + +/** + * @brief Analog-to-digital converter driver limit event data. + */ +typedef struct +{ + uint8_t channel; ///< Channel on which the limit was detected. + nrf_saadc_limit_t limit_type; ///< Type of limit detected. +} nrfx_saadc_limit_evt_t; + +/** + * @brief Analog-to-digital converter driver event structure. + */ +typedef struct +{ + nrfx_saadc_evt_type_t type; ///< Event type. + union + { + nrfx_saadc_done_evt_t done; ///< Data for @ref NRFX_SAADC_EVT_DONE event. + nrfx_saadc_limit_evt_t limit; ///< Data for @ref NRFX_SAADC_EVT_LIMIT event. + } data; +} nrfx_saadc_evt_t; + +/** + * @brief ADC event handler. + * + * @param[in] p_event Pointer to an ADC event. The event structure is allocated on + * the stack, so it is valid only within the context of + * the event handler. + */ +typedef void (* nrfx_saadc_event_handler_t)(nrfx_saadc_evt_t const * p_event); + +/** + * @brief Function for initializing the SAADC. + * + * @param[in] p_config Pointer to the structure with initial configuration. + * @param[in] event_handler Event handler provided by the user. + * Must not be NULL. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the driver is already initialized. + */ +nrfx_err_t nrfx_saadc_init(nrfx_saadc_config_t const * p_config, + nrfx_saadc_event_handler_t event_handler); + +/** + * @brief Function for uninitializing the SAADC. + * + * This function stops all ongoing conversions and disables all channels. + */ +void nrfx_saadc_uninit(void); + + +/** + * @brief Function for getting the address of a SAMPLE SAADC task. + * + * @return Task address. + */ +uint32_t nrfx_saadc_sample_task_get(void); + +/** + * @brief Function for initializing an SAADC channel. + * + * This function configures and enables the channel. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the ADC was not initialized. + * @retval NRFX_ERROR_NO_MEM If the specified channel was already allocated. + */ +nrfx_err_t nrfx_saadc_channel_init(uint8_t channel, + nrf_saadc_channel_config_t const * const p_config); + + +/** + * @brief Function for uninitializing an SAADC channel. + * + * @retval NRFX_SUCCESS If uninitialization was successful. + * @retval NRFX_ERROR_BUSY If the ADC is busy. + */ +nrfx_err_t nrfx_saadc_channel_uninit(uint8_t channel); + +/** + * @brief Function for starting SAADC sampling. + * + * @retval NRFX_SUCCESS If ADC sampling was triggered. + * @retval NRFX_ERROR_INVALID_STATE If ADC is in idle state. + */ +nrfx_err_t nrfx_saadc_sample(void); + +/** + * @brief Blocking function for executing a single ADC conversion. + * + * This function selects the desired input, starts a single conversion, + * waits for it to finish, and returns the result. + * + * The function will fail if ADC is busy. + * + * @param[in] channel Channel. + * @param[out] p_value Pointer to the location where the result should be placed. + * + * @retval NRFX_SUCCESS If conversion was successful. + * @retval NRFX_ERROR_BUSY If the ADC driver is busy. + */ +nrfx_err_t nrfx_saadc_sample_convert(uint8_t channel, nrf_saadc_value_t * p_value); + +/** + * @brief Function for issuing conversion of data to the buffer. + * + * This function is non-blocking. The application is notified about filling the buffer by the event + * handler. Conversion will be done on all enabled channels. If the ADC is in idle state, the + * function will set up Easy DMA for the conversion. The ADC will be ready for sampling and wait for + * the SAMPLE task. It can be triggered manually by the @ref nrfx_saadc_sample function or by PPI + * using the @ref NRF_SAADC_TASK_SAMPLE task. If one buffer is already set and the conversion is + * ongoing, calling this function will result in queuing the given buffer. The driver will start + * filling the issued buffer when the first one is completed. If the function is called again before + * the first buffer is filled or calibration is in progress, it will return with error. + * + * @param[in] buffer Result buffer. + * @param[in] size Buffer size in words. + * + * @retval NRFX_SUCCESS If conversion was successful. + * @retval NRFX_ERROR_BUSY If the driver already has two buffers set or calibration is in progress. + */ +nrfx_err_t nrfx_saadc_buffer_convert(nrf_saadc_value_t * buffer, uint16_t size); + +/** + * @brief Function for triggering the ADC offset calibration. + * + * This function is non-blocking. The application is notified about completion by the event handler. + * Calibration will also trigger DONE and RESULTDONE events. + * + * The function will fail if ADC is busy or calibration is already in progress. + * + * @retval NRFX_SUCCESS If calibration was started successfully. + * @retval NRFX_ERROR_BUSY If the ADC driver is busy. + */ +nrfx_err_t nrfx_saadc_calibrate_offset(void); + +/** + * @brief Function for retrieving the SAADC state. + * + * @retval true If the ADC is busy. + * @retval false If the ADC is ready. + */ +bool nrfx_saadc_is_busy(void); + +/** + * @brief Function for aborting ongoing and buffered conversions. + * @note @ref NRFX_SAADC_EVT_DONE event will be generated if there is a conversion in progress. + * Event will contain number of words in the sample buffer. + */ +void nrfx_saadc_abort(void); + +/** + * @brief Function for setting the SAADC channel limits. + * When limits are enabled and the result exceeds the defined bounds, the limit handler + * function is called. + * + * @param[in] channel SAADC channel number. + * @param[in] limit_low Lower limit (valid values from @ref NRFX_SAADC_LIMITL_DISABLED to + * @ref NRFX_SAADC_LIMITH_DISABLED). Conversion results below this value will + * trigger the handler function. Set to @ref NRFX_SAADC_LIMITL_DISABLED + * to disable this limit. + * @param[in] limit_high Upper limit (valid values from @ref NRFX_SAADC_LIMITL_DISABLED to + * @ref NRFX_SAADC_LIMITH_DISABLED). Conversion results above this value will + * trigger the handler function. Set to @ref NRFX_SAADC_LIMITH_DISABLED + * to disable this limit. + */ +void nrfx_saadc_limits_set(uint8_t channel, int16_t limit_low, int16_t limit_high); + + +void nrfx_saadc_irq_handler(void); + + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_SAADC_H__ + diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_spi.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_spi.h new file mode 100644 index 0000000000..edd10bcbd3 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_spi.h @@ -0,0 +1,273 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_SPI_H__ +#define NRFX_SPI_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_spi SPI driver + * @{ + * @ingroup nrf_spi + * @brief SPI peripheral driver. + */ + +/** + * @brief SPI master driver instance data structure. + */ +typedef struct +{ + NRF_SPI_Type * p_reg; ///< Pointer to a structure with SPI registers. + uint8_t drv_inst_idx; ///< Driver instance index. +} nrfx_spi_t; + +enum { +#if NRFX_CHECK(NRFX_SPI0_ENABLED) + NRFX_SPI0_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_SPI1_ENABLED) + NRFX_SPI1_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_SPI2_ENABLED) + NRFX_SPI2_INST_IDX, +#endif + NRFX_SPI_ENABLED_COUNT +}; + +/** + * @brief Macro for creating an SPI master driver instance. + */ +#define NRFX_SPI_INSTANCE(id) \ +{ \ + .p_reg = NRFX_CONCAT_2(NRF_SPI, id), \ + .drv_inst_idx = NRFX_CONCAT_3(NRFX_SPI, id, _INST_IDX), \ +} + +/** + * @brief This value can be provided instead of a pin number for signals MOSI, + * MISO, and Slave Select to specify that the given signal is not used and + * therefore does not need to be connected to a pin. + */ +#define NRFX_SPI_PIN_NOT_USED 0xFF + +/** + * @brief SPI master driver instance configuration structure. + */ +typedef struct +{ + uint8_t sck_pin; ///< SCK pin number. + uint8_t mosi_pin; ///< MOSI pin number (optional). + /**< Set to @ref NRFX_SPI_PIN_NOT_USED + * if this signal is not needed. */ + uint8_t miso_pin; ///< MISO pin number (optional). + /**< Set to @ref NRFX_SPI_PIN_NOT_USED + * if this signal is not needed. */ + uint8_t ss_pin; ///< Slave Select pin number (optional). + /**< Set to @ref NRFX_SPI_PIN_NOT_USED + * if this signal is not needed. The driver + * supports only active low for this signal. + * If the signal should be active high, + * it must be controlled externally. */ + uint8_t irq_priority; ///< Interrupt priority. + uint8_t orc; ///< Over-run character. + /**< This character is used when all bytes from the TX buffer are sent, + but the transfer continues due to RX. */ + nrf_spi_frequency_t frequency; ///< SPI frequency. + nrf_spi_mode_t mode; ///< SPI mode. + nrf_spi_bit_order_t bit_order; ///< SPI bit order. +} nrfx_spi_config_t; + +/** + * @brief SPI master instance default configuration. + */ +#define NRFX_SPI_DEFAULT_CONFIG \ +{ \ + .sck_pin = NRFX_SPI_PIN_NOT_USED, \ + .mosi_pin = NRFX_SPI_PIN_NOT_USED, \ + .miso_pin = NRFX_SPI_PIN_NOT_USED, \ + .ss_pin = NRFX_SPI_PIN_NOT_USED, \ + .irq_priority = NRFX_SPI_DEFAULT_CONFIG_IRQ_PRIORITY, \ + .orc = 0xFF, \ + .frequency = NRF_SPI_FREQ_4M, \ + .mode = NRF_SPI_MODE_0, \ + .bit_order = NRF_SPI_BIT_ORDER_MSB_FIRST, \ +} + +/** + * @brief Single transfer descriptor structure. + */ +typedef struct +{ + uint8_t const * p_tx_buffer; ///< Pointer to TX buffer. + size_t tx_length; ///< TX buffer length. + uint8_t * p_rx_buffer; ///< Pointer to RX buffer. + size_t rx_length; ///< RX buffer length. +} nrfx_spi_xfer_desc_t; + +/** + * @brief Macro for setting up single transfer descriptor. + * + * This macro is for internal use only. + */ +#define NRFX_SPI_SINGLE_XFER(p_tx, tx_len, p_rx, rx_len) \ + { \ + .p_tx_buffer = (uint8_t const *)(p_tx), \ + .tx_length = (tx_len), \ + .p_rx_buffer = (p_rx), \ + .rx_length = (rx_len), \ + } + +/** + * @brief Macro for setting duplex TX RX transfer. + */ +#define NRFX_SPI_XFER_TRX(p_tx_buf, tx_length, p_rx_buf, rx_length) \ + NRFX_SPI_SINGLE_XFER(p_tx_buf, tx_length, p_rx_buf, rx_length) + +/** + * @brief Macro for setting TX transfer. + */ +#define NRFX_SPI_XFER_TX(p_buf, length) \ + NRFX_SPI_SINGLE_XFER(p_buf, length, NULL, 0) + +/** + * @brief Macro for setting RX transfer. + */ +#define NRFX_SPI_XFER_RX(p_buf, length) \ + NRFX_SPI_SINGLE_XFER(NULL, 0, p_buf, length) + +/** + * @brief SPI master driver event types, passed to the handler routine provided + * during initialization. + */ +typedef enum +{ + NRFX_SPI_EVENT_DONE, ///< Transfer done. +} nrfx_spi_evt_type_t; + +typedef struct +{ + nrfx_spi_evt_type_t type; ///< Event type. + nrfx_spi_xfer_desc_t xfer_desc; ///< Transfer details. +} nrfx_spi_evt_t; + +/** + * @brief SPI master driver event handler type. + */ +typedef void (* nrfx_spi_evt_handler_t)(nrfx_spi_evt_t const * p_event, + void * p_context); + +/** + * @brief Function for initializing the SPI master driver instance. + * + * This function configures and enables the specified peripheral. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_config Pointer to the structure with initial configuration. + * + * @param handler Event handler provided by the user. If NULL, transfers + * will be performed in blocking mode. + * @param p_context Context passed to event handler. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the driver was already initialized. + * @retval NRFX_ERROR_BUSY If some other peripheral with the same + * instance ID is already in use. This is + * possible only if @ref nrfx_prs module + * is enabled. + */ +nrfx_err_t nrfx_spi_init(nrfx_spi_t const * const p_instance, + nrfx_spi_config_t const * p_config, + nrfx_spi_evt_handler_t handler, + void * p_context); + +/** + * @brief Function for uninitializing the SPI master driver instance. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_spi_uninit(nrfx_spi_t const * const p_instance); + +/** + * @brief Function for starting the SPI data transfer. + * + * If an event handler was provided in the @ref nrfx_spi_init call, this function + * returns immediately and the handler is called when the transfer is done. + * Otherwise, the transfer is performed in blocking mode, which means that this function + * returns when the transfer is finished. + * + * @param p_instance Pointer to the driver instance structure. + * @param p_xfer_desc Pointer to the transfer descriptor. + * @param flags Transfer options (0 for default settings). + * Currently, no additional flags are available. + * + * @retval NRFX_SUCCESS If the procedure was successful. + * @retval NRFX_ERROR_BUSY If the driver is not ready for a new transfer. + * @retval NRFX_ERROR_NOT_SUPPORTED If the provided parameters are not supported. + */ +nrfx_err_t nrfx_spi_xfer(nrfx_spi_t const * const p_instance, + nrfx_spi_xfer_desc_t const * p_xfer_desc, + uint32_t flags); + +/** + * @brief Function for aborting ongoing transfer. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_spi_abort(nrfx_spi_t const * p_instance); + + +void nrfx_spi_0_irq_handler(void); +void nrfx_spi_1_irq_handler(void); +void nrfx_spi_2_irq_handler(void); + + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_SPI_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_spim.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_spim.h new file mode 100644 index 0000000000..3490f11023 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_spim.h @@ -0,0 +1,396 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_SPIM_H__ +#define NRFX_SPIM_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_spim SPIM driver + * @{ + * @ingroup nrf_spim + * @brief SPIM peripheral driver. + */ + +/** + * @brief SPIM master driver instance data structure. + */ +typedef struct +{ + NRF_SPIM_Type * p_reg; ///< Pointer to a structure with SPIM registers. + uint8_t drv_inst_idx; ///< Driver instance index. +} nrfx_spim_t; + +enum { +#if NRFX_CHECK(NRFX_SPIM0_ENABLED) + NRFX_SPIM0_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_SPIM1_ENABLED) + NRFX_SPIM1_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_SPIM2_ENABLED) + NRFX_SPIM2_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_SPIM3_ENABLED) + NRFX_SPIM3_INST_IDX, +#endif + NRFX_SPIM_ENABLED_COUNT +}; + +/** + * @brief Macro for creating an SPIM master driver instance. + */ +#define NRFX_SPIM_INSTANCE(id) \ +{ \ + .p_reg = NRFX_CONCAT_2(NRF_SPIM, id), \ + .drv_inst_idx = NRFX_CONCAT_3(NRFX_SPIM, id, _INST_IDX), \ +} + +/** + * @brief This value can be provided instead of a pin number for signals MOSI, + * MISO, and Slave Select to specify that the given signal is not used and + * therefore does not need to be connected to a pin. + */ +#define NRFX_SPIM_PIN_NOT_USED 0xFF + +/** + * @brief SPIM master driver instance configuration structure. + */ +typedef struct +{ + uint8_t sck_pin; ///< SCK pin number. + uint8_t mosi_pin; ///< MOSI pin number (optional). + /**< Set to @ref NRFX_SPIM_PIN_NOT_USED + * if this signal is not needed. */ + uint8_t miso_pin; ///< MISO pin number (optional). + /**< Set to @ref NRFX_SPIM_PIN_NOT_USED + * if this signal is not needed. */ + uint8_t ss_pin; ///< Slave Select pin number (optional). + /**< Set to @ref NRFX_SPIM_PIN_NOT_USED + * if this signal is not needed. */ + bool ss_active_high; ///< Polarity of the Slave Select pin during transmission. + uint8_t irq_priority; ///< Interrupt priority. + uint8_t orc; ///< Over-run character. + /**< This character is used when all bytes from the TX buffer are sent, + but the transfer continues due to RX. */ + nrf_spim_frequency_t frequency; ///< SPI frequency. + nrf_spim_mode_t mode; ///< SPI mode. + nrf_spim_bit_order_t bit_order; ///< SPI bit order. +#if NRFX_CHECK(NRFX_SPIM_EXTENDED_ENABLED) || defined(__NRFX_DOXYGEN__) + uint8_t dcx_pin; ///< D/CX pin number (optional). + uint8_t rx_delay; ///< Sample delay for input serial data on MISO. + /**< The value specifies the delay, in number of 64 MHz clock cycles + * (15.625 ns), from the the sampling edge of SCK (leading edge for + * CONFIG.CPHA = 0, trailing edge for CONFIG.CPHA = 1) until + * the input serial data is sampled.*/ + bool use_hw_ss; ///< Indication to use software or hardware controlled Slave Select pin. + uint8_t ss_duration; ///< Slave Select duration before and after transmission. + /**< Minimum duration between the edge of CSN and the edge of SCK and minimum + * duration of CSN must stay inactive between transactions. + * The value is specified in number of 64 MHz clock cycles (15.625 ns). + * Supported only for hardware controlled Slave Select.*/ +#endif +} nrfx_spim_config_t; + +#if NRFX_CHECK(NRFX_SPIM_EXTENDED_ENABLED) || defined(__NRFX_DOXYGEN__) +/** + * @brief SPIM master instance extended default configuration. + */ + #define NRFX_SPIM_DEFAULT_EXTENDED_CONFIG \ + .dcx_pin = NRFX_SPIM_PIN_NOT_USED, \ + .rx_delay = 0x00, \ + .ss_duration = 0x00, \ + .use_hw_ss = false, +#else + #define NRFX_SPIM_DEFAULT_EXTENDED_CONFIG +#endif + +/** + * @brief SPIM master instance default configuration. + */ +#define NRFX_SPIM_DEFAULT_CONFIG \ +{ \ + .sck_pin = NRFX_SPIM_PIN_NOT_USED, \ + .mosi_pin = NRFX_SPIM_PIN_NOT_USED, \ + .miso_pin = NRFX_SPIM_PIN_NOT_USED, \ + .ss_pin = NRFX_SPIM_PIN_NOT_USED, \ + .ss_active_high = false, \ + .irq_priority = NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY, \ + .orc = 0xFF, \ + .frequency = NRF_SPIM_FREQ_4M, \ + .mode = NRF_SPIM_MODE_0, \ + .bit_order = NRF_SPIM_BIT_ORDER_MSB_FIRST, \ + NRFX_SPIM_DEFAULT_EXTENDED_CONFIG \ +} + +#define NRFX_SPIM_FLAG_TX_POSTINC (1UL << 0) /**< TX buffer address incremented after transfer. */ +#define NRFX_SPIM_FLAG_RX_POSTINC (1UL << 1) /**< RX buffer address incremented after transfer. */ +#define NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER (1UL << 2) /**< Interrupt after each transfer is suppressed, and the event handler is not called. */ +#define NRFX_SPIM_FLAG_HOLD_XFER (1UL << 3) /**< Set up the transfer but do not start it. */ +#define NRFX_SPIM_FLAG_REPEATED_XFER (1UL << 4) /**< Flag indicating that the transfer will be executed multiple times. */ + +/** + * @brief Single transfer descriptor structure. + */ +typedef struct +{ + uint8_t const * p_tx_buffer; ///< Pointer to TX buffer. + size_t tx_length; ///< TX buffer length. + uint8_t * p_rx_buffer; ///< Pointer to RX buffer. + size_t rx_length; ///< RX buffer length. +} nrfx_spim_xfer_desc_t; + +/** + * @brief Macro for setting up single transfer descriptor. + * + * This macro is for internal use only. + */ +#define NRFX_SPIM_SINGLE_XFER(p_tx, tx_len, p_rx, rx_len) \ + { \ + .p_tx_buffer = (uint8_t const *)(p_tx), \ + .tx_length = (tx_len), \ + .p_rx_buffer = (p_rx), \ + .rx_length = (rx_len), \ + } + +/** + * @brief Macro for setting duplex TX RX transfer. + */ +#define NRFX_SPIM_XFER_TRX(p_tx_buf, tx_length, p_rx_buf, rx_length) \ + NRFX_SPIM_SINGLE_XFER(p_tx_buf, tx_length, p_rx_buf, rx_length) + +/** + * @brief Macro for setting TX transfer. + */ +#define NRFX_SPIM_XFER_TX(p_buf, length) \ + NRFX_SPIM_SINGLE_XFER(p_buf, length, NULL, 0) + +/** + * @brief Macro for setting RX transfer. + */ +#define NRFX_SPIM_XFER_RX(p_buf, length) \ + NRFX_SPIM_SINGLE_XFER(NULL, 0, p_buf, length) + +/** + * @brief SPIM master driver event types, passed to the handler routine provided + * during initialization. + */ +typedef enum +{ + NRFX_SPIM_EVENT_DONE, ///< Transfer done. +} nrfx_spim_evt_type_t; + +typedef struct +{ + nrfx_spim_evt_type_t type; ///< Event type. + nrfx_spim_xfer_desc_t xfer_desc; ///< Transfer details. +} nrfx_spim_evt_t; + +/** + * @brief SPIM master driver event handler type. + */ +typedef void (* nrfx_spim_evt_handler_t)(nrfx_spim_evt_t const * p_event, + void * p_context); + +/** + * @brief Function for initializing the SPI master driver instance. + * + * This function configures and enables the specified peripheral. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_config Pointer to the structure with initial configuration. + * + * @param handler Event handler provided by the user. If NULL, transfers + * will be performed in blocking mode. + * @param p_context Context passed to event handler. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the driver was already initialized. + * @retval NRFX_ERROR_BUSY If some other peripheral with the same + * instance ID is already in use. This is + * possible only if @ref nrfx_prs module + * is enabled. + * @retval NRFX_ERROR_NOT_SUPPORTED If requested configuration is not supported + * by the SPIM instance. + */ +nrfx_err_t nrfx_spim_init(nrfx_spim_t const * const p_instance, + nrfx_spim_config_t const * p_config, + nrfx_spim_evt_handler_t handler, + void * p_context); + +/** + * @brief Function for uninitializing the SPI master driver instance. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_spim_uninit(nrfx_spim_t const * const p_instance); + +/** + * @brief Function for starting the SPI data transfer. + * + * Additional options are provided using the @c flags parameter: + * + * - @ref NRFX_SPIM_FLAG_TX_POSTINC and @ref NRFX_SPIM_FLAG_RX_POSTINC: + * Post-incrementation of buffer addresses. Supported only by SPIM. + * - @ref NRFX_SPIM_FLAG_HOLD_XFER: Driver is not starting the transfer. Use this + * flag if the transfer is triggered externally by PPI. Supported only by SPIM. Use + * @ref nrfx_spim_start_task_get to get the address of the start task. + * - @ref NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER: No user event handler after transfer + * completion. This also means no interrupt at the end of the transfer. Supported only by SPIM. + * If @ref NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER is used, the driver does not set the instance into + * busy state, so you must ensure that the next transfers are set up when SPIM is not active. + * @ref nrfx_spim_end_event_get function can be used to detect end of transfer. Option can be used + * together with @ref NRFX_SPIM_FLAG_REPEATED_XFER to prepare a sequence of SPI transfers + * without interruptions. + * - @ref NRFX_SPIM_FLAG_REPEATED_XFER: Prepare for repeated transfers. You can set + * up a number of transfers that will be triggered externally (for example by PPI). An example is + * a TXRX transfer with the options @ref NRFX_SPIM_FLAG_RX_POSTINC, + * @ref NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER, and @ref NRFX_SPIM_FLAG_REPEATED_XFER. After the + * transfer is set up, a set of transfers can be triggered by PPI that will read, for example, + * the same register of an external component and put it into a RAM buffer without any interrupts. + * @ref nrfx_spim_end_event_get can be used to get the address of the END event, which can be + * used to count the number of transfers. If @ref NRFX_SPIM_FLAG_REPEATED_XFER is used, + * the driver does not set the instance into busy state, so you must ensure that the next + * transfers are set up when SPIM is not active. Supported only by SPIM. + * + * @note Peripherals using EasyDMA (including SPIM) require the transfer buffers + * to be placed in the Data RAM region. If this condition is not met, + * this function will fail with the error code NRFX_ERROR_INVALID_ADDR. + * + * @param p_instance Pointer to the driver instance structure. + * @param p_xfer_desc Pointer to the transfer descriptor. + * @param flags Transfer options (0 for default settings). + * + * @retval NRFX_SUCCESS If the procedure was successful. + * @retval NRFX_ERROR_BUSY If the driver is not ready for a new transfer. + * @retval NRFX_ERROR_NOT_SUPPORTED If the provided parameters are not supported. + * @retval NRFX_ERROR_INVALID_ADDR If the provided buffers are not placed in the Data + * RAM region. + */ +nrfx_err_t nrfx_spim_xfer(nrfx_spim_t const * const p_instance, + nrfx_spim_xfer_desc_t const * p_xfer_desc, + uint32_t flags); + +#if NRFX_CHECK(NRFX_SPIM_EXTENDED_ENABLED) || defined(__NRFX_DOXYGEN__) +/** + * @brief Function for starting the SPI data transfer with DCX control. + * + * See @ref nrfx_spim_xfer for description of additional options of transfer + * provided by the @c flags parameter. + * + * @note Peripherals that use EasyDMA (including SPIM) require the transfer buffers + * to be placed in the Data RAM region. If this condition is not met, + * this function will fail with the error code NRFX_ERROR_INVALID_ADDR. + * + * @param p_instance Pointer to the driver instance structure. + * @param p_xfer_desc Pointer to the transfer descriptor. + * @param flags Transfer options (0 for default settings). + * @param cmd_length Length of the command bytes preceding the data + * bytes. The DCX line will be low during transmission + * of command bytes and high during transmission of data bytes. + * Maximum value available for dividing the transmitted bytes + * into command bytes and data bytes is @ref NRF_SPIM_DCX_CNT_ALL_CMD - 1. + * The @ref NRF_SPIM_DCX_CNT_ALL_CMD value passed as the + * @c cmd_length parameter causes all transmitted bytes + * to be marked as command bytes. + * + * @retval NRFX_SUCCESS If the procedure was successful. + * @retval NRFX_ERROR_BUSY If the driver is not ready for a new transfer. + * @retval NRFX_ERROR_NOT_SUPPORTED If the provided parameters are not supported. + * @retval NRFX_ERROR_INVALID_ADDR If the provided buffers are not placed in the Data + * RAM region. + */ +nrfx_err_t nrfx_spim_xfer_dcx(nrfx_spim_t const * const p_instance, + nrfx_spim_xfer_desc_t const * p_xfer_desc, + uint32_t flags, + uint8_t cmd_length); +#endif + +/** + * @brief Function for returning the address of a SPIM start task. + * + * This function should be used if @ref nrfx_spim_xfer was called with the flag @ref NRFX_SPIM_FLAG_HOLD_XFER. + * In that case, the transfer is not started by the driver, but it must be started externally by PPI. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @return Start task address. + */ +uint32_t nrfx_spim_start_task_get(nrfx_spim_t const * p_instance); + +/** + * @brief Function for returning the address of a END SPIM event. + * + * The END event can be used to detect the end of a transfer + * if the @ref NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER option is used. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @return END event address. + */ +uint32_t nrfx_spim_end_event_get(nrfx_spim_t const * p_instance); + +/** + * @brief Function for aborting ongoing transfer. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_spim_abort(nrfx_spim_t const * p_instance); + + +void nrfx_spim_0_irq_handler(void); +void nrfx_spim_1_irq_handler(void); +void nrfx_spim_2_irq_handler(void); +void nrfx_spim_3_irq_handler(void); + + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_SPIM_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_spis.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_spis.h new file mode 100644 index 0000000000..b16b29f06c --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_spis.h @@ -0,0 +1,250 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_SPIS_H__ +#define NRFX_SPIS_H__ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_spis SPI slave driver + * @{ + * @ingroup nrf_spis + * @brief SPI Slave peripheral driver. + */ + +/** @brief SPI slave driver instance data structure. */ +typedef struct +{ + NRF_SPIS_Type * p_reg; //!< Pointer to a structure with SPIS registers. + uint8_t drv_inst_idx; //!< Driver instance index. +} nrfx_spis_t; + +enum { +#if NRFX_CHECK(NRFX_SPIS0_ENABLED) + NRFX_SPIS0_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_SPIS1_ENABLED) + NRFX_SPIS1_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_SPIS2_ENABLED) + NRFX_SPIS2_INST_IDX, +#endif + NRFX_SPIS_ENABLED_COUNT +}; + +/** @brief Macro for creating an SPI slave driver instance. */ +#define NRFX_SPIS_INSTANCE(id) \ +{ \ + .p_reg = NRFX_CONCAT_2(NRF_SPIS, id), \ + .drv_inst_idx = NRFX_CONCAT_3(NRFX_SPIS, id, _INST_IDX), \ +} + +/** + * @brief This value can be provided instead of a pin number for the signals MOSI + * and MISO to specify that the given signal is not used and therefore + * does not need to be connected to a pin. + */ +#define NRFX_SPIS_PIN_NOT_USED 0xFF + +/** @brief Default pull-up configuration of the SPI CS. */ +#define NRFX_SPIS_DEFAULT_CSN_PULLUP NRF_GPIO_PIN_NOPULL +/** @brief Default drive configuration of the SPI MISO. */ +#define NRFX_SPIS_DEFAULT_MISO_DRIVE NRF_GPIO_PIN_S0S1 + +/** @brief SPI slave driver event types. */ +typedef enum +{ + NRFX_SPIS_BUFFERS_SET_DONE, //!< Memory buffer set event. Memory buffers have been set successfully to the SPI slave device, and SPI transaction can be done. + NRFX_SPIS_XFER_DONE, //!< SPI transaction event. SPI transaction has been completed. + NRFX_SPIS_EVT_TYPE_MAX //!< Enumeration upper bound. +} nrfx_spis_evt_type_t; + +/** @brief SPI slave driver event structure. */ +typedef struct +{ + nrfx_spis_evt_type_t evt_type; //!< Type of the event. + size_t rx_amount; //!< Number of bytes received in the last transaction. This parameter is only valid for @ref NRFX_SPIS_XFER_DONE events. + size_t tx_amount; //!< Number of bytes transmitted in the last transaction. This parameter is only valid for @ref NRFX_SPIS_XFER_DONE events. +} nrfx_spis_evt_t; + +/** @brief SPI slave instance default configuration. */ +#define NRFX_SPIS_DEFAULT_CONFIG \ +{ \ + .sck_pin = NRFX_SPIS_PIN_NOT_USED, \ + .mosi_pin = NRFX_SPIS_PIN_NOT_USED, \ + .miso_pin = NRFX_SPIS_PIN_NOT_USED, \ + .csn_pin = NRFX_SPIS_PIN_NOT_USED, \ + .mode = NRF_SPIS_MODE_0, \ + .bit_order = NRF_SPIS_BIT_ORDER_MSB_FIRST, \ + .csn_pullup = NRFX_SPIS_DEFAULT_CSN_PULLUP, \ + .miso_drive = NRFX_SPIS_DEFAULT_MISO_DRIVE, \ + .def = NRFX_SPIS_DEFAULT_DEF, \ + .orc = NRFX_SPIS_DEFAULT_ORC, \ + .irq_priority = NRFX_SPIS_DEFAULT_CONFIG_IRQ_PRIORITY, \ +} + +/** @brief SPI peripheral device configuration data. */ +typedef struct +{ + uint32_t miso_pin; //!< SPI MISO pin (optional). + /**< Set @ref NRFX_SPIS_PIN_NOT_USED + * if this signal is not needed. */ + uint32_t mosi_pin; //!< SPI MOSI pin (optional). + /**< Set @ref NRFX_SPIS_PIN_NOT_USED + * if this signal is not needed. */ + uint32_t sck_pin; //!< SPI SCK pin. + uint32_t csn_pin; //!< SPI CSN pin. + nrf_spis_mode_t mode; //!< SPI mode. + nrf_spis_bit_order_t bit_order; //!< SPI transaction bit order. + nrf_gpio_pin_pull_t csn_pullup; //!< CSN pin pull-up configuration. + nrf_gpio_pin_drive_t miso_drive; //!< MISO pin drive configuration. + uint8_t def; //!< Character clocked out in case of an ignored transaction. + uint8_t orc; //!< Character clocked out after an over-read of the transmit buffer. + uint8_t irq_priority; //!< Interrupt priority. +} nrfx_spis_config_t; + + +/** + * @brief SPI slave driver event handler type. + * + * @param[in] p_event Pointer to the event structure. The structure is + * allocated on the stack so it is valid only until + * the event handler returns. + * @param[in] p_context Context set on initialization. + */ +typedef void (*nrfx_spis_event_handler_t)(nrfx_spis_evt_t const * p_event, + void * p_context); + +/** + * @brief Function for initializing the SPI slave driver instance. + * + * @note When the nRF52 Anomaly 109 workaround for SPIS is enabled, this function + * initializes the GPIOTE driver as well, and uses one of GPIOTE channels + * to detect falling edges on CSN pin. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_config Pointer to the structure with initial configuration. + * @param[in] event_handler Function to be called by the SPI slave driver upon event. + * Must not be NULL. + * @param[in] p_context Context passed to the event handler. + * + * @retval NRFX_SUCCESS If the initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the instance is already initialized. + * @retval NRFX_ERROR_INVALID_PARAM If an invalid parameter is supplied. + * @retval NRFX_ERROR_BUSY If some other peripheral with the same + * instance ID is already in use. This is + * possible only if @ref nrfx_prs module + * is enabled. + * @retval NRFX_ERROR_INTERNAL GPIOTE channel for detecting falling edges + * on CSN pin cannot be initialized. Possible + * only when using nRF52 Anomaly 109 workaround. + */ +nrfx_err_t nrfx_spis_init(nrfx_spis_t const * const p_instance, + nrfx_spis_config_t const * p_config, + nrfx_spis_event_handler_t event_handler, + void * p_context); + +/** + * @brief Function for uninitializing the SPI slave driver instance. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_spis_uninit(nrfx_spis_t const * const p_instance); + +/** + * @brief Function for preparing the SPI slave instance for a single SPI transaction. + * + * This function prepares the SPI slave device to be ready for a single SPI transaction. It configures + * the SPI slave device to use the memory supplied with the function call in SPI transactions. + * + * When either the memory buffer configuration or the SPI transaction has been + * completed, the event callback function will be called with the appropriate event + * @ref nrfx_spis_evt_type_t. Note that the callback function can be called before returning from + * this function, because it is called from the SPI slave interrupt context. + * + * @note This function can be called from the callback function context. + * + * @note Client applications must call this function after every @ref NRFX_SPIS_XFER_DONE event if + * the SPI slave driver should be prepared for a possible new SPI transaction. + * + * @note Peripherals using EasyDMA (including SPIS) require the transfer buffers + * to be placed in the Data RAM region. If this condition is not met, + * this function will fail with the error code NRFX_ERROR_INVALID_ADDR. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_tx_buffer Pointer to the TX buffer. Can be NULL when the buffer length is zero. + * @param[in] p_rx_buffer Pointer to the RX buffer. Can be NULL when the buffer length is zero. + * @param[in] tx_buffer_length Length of the TX buffer in bytes. + * @param[in] rx_buffer_length Length of the RX buffer in bytes. + * + * @retval NRFX_SUCCESS If the operation was successful. + * @retval NRFX_ERROR_INVALID_STATE If the operation failed because the SPI slave device is in an incorrect state. + * @retval NRFX_ERROR_INVALID_ADDR If the provided buffers are not placed in the Data + * RAM region. + * @retval NRFX_ERROR_INVALID_LENGTH If provided lengths exceed the EasyDMA limits for the peripheral. + * @retval NRFX_ERROR_INTERNAL If the operation failed because of an internal error. + */ +nrfx_err_t nrfx_spis_buffers_set(nrfx_spis_t const * const p_instance, + uint8_t const * p_tx_buffer, + size_t tx_buffer_length, + uint8_t * p_rx_buffer, + size_t rx_buffer_length); + + +void nrfx_spis_0_irq_handler(void); +void nrfx_spis_1_irq_handler(void); +void nrfx_spis_2_irq_handler(void); + + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_SPIS_H__ + diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_swi.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_swi.h new file mode 100644 index 0000000000..92416aef13 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_swi.h @@ -0,0 +1,222 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_SWI_H__ +#define NRFX_SWI_H__ + +#include + +#if NRFX_CHECK(NRFX_EGU_ENABLED) +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_swi SWI driver + * @{ + * @ingroup nrf_swi_egu + * + * @brief Driver for managing software interrupts (SWI). + */ + +/** @brief SWI instance. */ +typedef uint8_t nrfx_swi_t; + +/** + * @brief SWI user flags. + * + * User flags are set during the SWI trigger and passed to the callback function as an argument. + */ +typedef uint16_t nrfx_swi_flags_t; + +/** @brief Unallocated instance value. */ +#define NRFX_SWI_UNALLOCATED ((nrfx_swi_t)0xFFuL) + +/** @brief Default SWI priority. */ +#define NRFX_SWI_DEFAULT_PRIORITY APP_IRQ_PRIORITY_LOWEST + +/** + * @brief SWI handler function. + * + * @param swi SWI instance. + * @param flags User flags. + */ +typedef void (*nrfx_swi_handler_t)(nrfx_swi_t swi, nrfx_swi_flags_t flags); + + +/** + * @brief Function for allocating the first unused SWI instance and setting a handler. + * + * @param[out] p_swi Points to a place where the allocated SWI instance + * number is to be stored. + * @param[in] event_handler Event handler function. + * If NULL, no interrupt will be enabled. + * It can be NULL only if the EGU driver is enabled. + * For classic SWI, it must be a valid handler pointer. + * @param[in] irq_priority Interrupt priority. + * + * @retval NRFX_SUCCESS If the SWI was successfully allocated. + * @retval NRFX_ERROR_NO_MEM If there is no available SWI to be used. + */ +nrfx_err_t nrfx_swi_alloc(nrfx_swi_t * p_swi, + nrfx_swi_handler_t event_handler, + uint32_t irq_priority); + +/** + * @brief Function for freeing a previously allocated SWI. + * + * @param[in,out] p_swi SWI instance to free. The value is changed to + * @ref NRFX_SWI_UNALLOCATED on success. + */ +void nrfx_swi_free(nrfx_swi_t * p_swi); + +/** @brief Function for freeing all allocated SWIs. */ +void nrfx_swi_all_free(void); + +/** + * @brief Function for triggering the SWI. + * + * @param[in] swi SWI to trigger. + * @param[in] flag_number Number of user flag to trigger. + */ +void nrfx_swi_trigger(nrfx_swi_t swi, + uint8_t flag_number); + +/** + * @brief Function for checking if the specified SWI is currently allocated. + * + * @param[in] swi SWI instance. + * + * @retval true If the SWI instance is allocated. + * @retval false Otherwise. + */ +bool nrfx_swi_is_allocated(nrfx_swi_t swi); + +#if NRFX_CHECK(NRFX_EGU_ENABLED) || defined(__NRFX_DOXYGEN__) + +/** + * @brief Function for returning the base address of the EGU peripheral + * associated with the specified SWI instance. + * + * @param[in] swi SWI instance. + * + * @returns EGU base address or NULL if the specified SWI instance number + * is too high. + */ +__STATIC_INLINE NRF_EGU_Type * nrfx_swi_egu_instance_get(nrfx_swi_t swi) +{ +#if (EGU_COUNT < SWI_COUNT) + if (swi >= EGU_COUNT) + { + return NULL; + } +#endif + uint32_t offset = ((uint32_t)swi) * (NRF_EGU1_BASE - NRF_EGU0_BASE); + return (NRF_EGU_Type *)(NRF_EGU0_BASE + offset); +} + +/** + * @brief Function for returning the EGU trigger task address. + * + * @param[in] swi SWI instance. + * @param[in] channel Number of the EGU channel. + * + * @returns Address of EGU trigger task. + */ +__STATIC_INLINE uint32_t nrfx_swi_task_trigger_address_get(nrfx_swi_t swi, + uint8_t channel) +{ + NRFX_ASSERT(nrfx_swi_is_allocated(swi)); + + NRF_EGU_Type * p_egu = nrfx_swi_egu_instance_get(swi); +#if (EGU_COUNT < SWI_COUNT) + if (p_egu == NULL) + { + return 0; + } +#endif + + return (uint32_t)nrf_egu_task_trigger_address_get(p_egu, channel); +} + +/** + * @brief Function for returning the EGU triggered event address. + * + * @param[in] swi SWI instance. + * @param[in] channel Number of the EGU channel. + * + * @returns Address of EGU triggered event. + */ +__STATIC_INLINE uint32_t nrfx_swi_event_triggered_address_get(nrfx_swi_t swi, + uint8_t channel) +{ + NRFX_ASSERT(nrfx_swi_is_allocated(swi)); + + NRF_EGU_Type * p_egu = nrfx_swi_egu_instance_get(swi); +#if (EGU_COUNT < SWI_COUNT) + if (p_egu == NULL) + { + return 0; + } +#endif + + return (uint32_t)nrf_egu_event_triggered_address_get(p_egu, channel); +} + +#endif // NRFX_CHECK(NRFX_EGU_ENABLED) || defined(__NRFX_DOXYGEN__) + + +void nrfx_swi_0_irq_handler(void); +void nrfx_swi_1_irq_handler(void); +void nrfx_swi_2_irq_handler(void); +void nrfx_swi_3_irq_handler(void); +void nrfx_swi_4_irq_handler(void); +void nrfx_swi_5_irq_handler(void); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_SWI_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/systick/nrf_drv_systick.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_systick.h similarity index 76% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/systick/nrf_drv_systick.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_systick.h index 34492af2a1..1629074464 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/systick/nrf_drv_systick.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_systick.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,87 +37,85 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -#ifndef NRF_DRV_SYSTICK_H__ -#define NRF_DRV_SYSTICK_H__ -#include -#include +#ifndef NRFX_SYSTICK_H__ +#define NRFX_SYSTICK_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /** - * @addtogroup nrf_systick SysTick HAL and driver - * @ingroup nrf_drivers - * @brief System Timer (SysTick) APIs - * - * The SysTick HAL provides basic APIs for accessing the registers of the system timer (SysTick). - * The SysTick driver provides APIs on a higher level. - */ - -/** - * @defgroup nrf_drv_systick SysTick driver + * @defgroup nrfx_systick ARM(R) SysTick driver * @{ * @ingroup nrf_systick * - * This library configures SysTick as a free-running timer. + * @brief ARM(R) SysTick driver. + * + * This driver configures ARM(R) SysTick as a free-running timer. * This timer is used to generate delays and pool for timeouts. * Only relatively short timeouts are supported. * The SysTick works on 64MHz and is 24-bits wide. * It means that it overflows around 4 times per second and around 250 ms * would be the highest supported time in the library. * But it would be really hard to detect if overflow was generated without - * using interrupts. For safely we would limit the maximum delay range by half. + * using interrupts. For safety we would limit the maximum delay range by half. */ /** * @brief The value type that holds the SysTick state * * This variable is used to count the requested timeout. - * @sa nrf_drv_systick_get + * @sa nrfx_systick_get */ typedef struct { uint32_t time; //!< Registered time value -}nrf_drv_systick_state_t; +} nrfx_systick_state_t; /** * @brief Configure and start the timer * * Function configures SysTick as a free-running timer without interrupt. */ -void nrf_drv_systick_init(void); +void nrfx_systick_init(void); /** * @brief Get current SysTick state * * Function gets current state of the SysTick timer. - * It can be used to check time-out by @ref nrf_drv_systick_test. + * It can be used to check time-out by @ref nrfx_systick_test. * * @param[out] p_state The pointer to the state variable to be filled */ -void nrf_drv_systick_get(nrf_drv_systick_state_t * p_state); +void nrfx_systick_get(nrfx_systick_state_t * p_state); /** * @brief Test if specified time is up in relation to remembered state * - * @param[in] p_state Remembered state set by @ref nrf_drv_systick_get + * @param[in] p_state Remembered state set by @ref nrfx_systick_get * @param[in] us Required time-out. * * @retval true If current time is higher than specified state plus given time-out. * @retval false If current time is lower than specified state plus given time-out */ -bool nrf_drv_systick_test(nrf_drv_systick_state_t const * p_state, uint32_t us); +bool nrfx_systick_test(nrfx_systick_state_t const * p_state, uint32_t us); /** * @brief Blocking delay in CPU ticks * * @param[in] ticks Number of CPU ticks to delay. */ -void nrf_drv_systick_delay_ticks(uint32_t ticks); +void nrfx_systick_delay_ticks(uint32_t ticks); /** * @brief Blocking delay in us * * @param[in] us Number of microseconds to delay. */ -void nrf_drv_systick_delay_us(uint32_t us); +void nrfx_systick_delay_us(uint32_t us); /** * @brief Blocking delay in ms @@ -126,8 +124,12 @@ void nrf_drv_systick_delay_us(uint32_t us); * * @param[in] ms Number of milliseconds to delay. */ -void nrf_drv_systick_delay_ms(uint32_t ms); - +void nrfx_systick_delay_ms(uint32_t ms); /** @} */ -#endif /* NRF_DRV_SYSTICK_H__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* NRFX_SYSTICK_H__ */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/timer/nrf_drv_timer.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_timer.h similarity index 54% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/timer/nrf_drv_timer.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_timer.h index 8d8cba0543..b493f239ec 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/timer/nrf_drv_timer.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_timer.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,32 +37,24 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/**@file - * @addtogroup nrf_timer Timer HAL and driver - * @ingroup nrf_drivers - * @brief Timer APIs. - * @details The timer HAL provides basic APIs for accessing the registers - * of the timer. The timer driver provides APIs on a higher level. - * - * @defgroup nrf_drv_timer Timer driver - * @{ - * @ingroup nrf_timer - * @brief Multi-instance timer driver. - */ -#ifndef NRF_DRV_TIMER_H__ -#define NRF_DRV_TIMER_H__ +#ifndef NRFX_TIMER_H__ +#define NRFX_TIMER_H__ -#include "nordic_common.h" -#include "sdk_config.h" -#include "nrf_timer.h" -#include "sdk_errors.h" -#include "nrf_assert.h" +#include +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrfx_timer Timer driver + * @{ + * @ingroup nrf_timer + * @brief TIMER peripheral driver. + */ + /** * @brief Timer driver instance data structure. */ @@ -71,26 +63,37 @@ typedef struct NRF_TIMER_Type * p_reg; ///< Pointer to the structure with TIMER peripheral instance registers. uint8_t instance_id; ///< Driver instance index. uint8_t cc_channel_count; ///< Number of capture/compare channels. -} nrf_drv_timer_t; - -#define ENABLED_TIMER_COUNT (TIMER0_ENABLED+TIMER1_ENABLED+TIMER2_ENABLED+TIMER3_ENABLED+TIMER4_ENABLED) - -#define TIMER0_INSTANCE_INDEX 0 -#define TIMER1_INSTANCE_INDEX TIMER0_INSTANCE_INDEX+TIMER0_ENABLED -#define TIMER2_INSTANCE_INDEX TIMER1_INSTANCE_INDEX+TIMER1_ENABLED -#define TIMER3_INSTANCE_INDEX TIMER2_INSTANCE_INDEX+TIMER2_ENABLED -#define TIMER4_INSTANCE_INDEX TIMER3_INSTANCE_INDEX+TIMER3_ENABLED +} nrfx_timer_t; /** * @brief Macro for creating a timer driver instance. */ -#define NRF_DRV_TIMER_INSTANCE(id) \ -{ \ - .p_reg = CONCAT_2(NRF_TIMER, id), \ - .instance_id = CONCAT_3(TIMER, id, _INSTANCE_INDEX), \ - .cc_channel_count = NRF_TIMER_CC_CHANNEL_COUNT(id), \ +#define NRFX_TIMER_INSTANCE(id) \ +{ \ + .p_reg = NRFX_CONCAT_2(NRF_TIMER, id), \ + .instance_id = NRFX_CONCAT_3(NRFX_TIMER, id, _INST_IDX), \ + .cc_channel_count = NRF_TIMER_CC_CHANNEL_COUNT(id), \ } +enum { +#if NRFX_CHECK(NRFX_TIMER0_ENABLED) + NRFX_TIMER0_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_TIMER1_ENABLED) + NRFX_TIMER1_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_TIMER2_ENABLED) + NRFX_TIMER2_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_TIMER3_ENABLED) + NRFX_TIMER3_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_TIMER4_ENABLED) + NRFX_TIMER4_INST_IDX, +#endif + NRFX_TIMER_ENABLED_COUNT +}; + /** * @brief Timer driver instance configuration structure. */ @@ -101,18 +104,18 @@ typedef struct nrf_timer_bit_width_t bit_width; ///< Bit width. uint8_t interrupt_priority; ///< Interrupt priority. void * p_context; ///< Context passed to interrupt handler. -} nrf_drv_timer_config_t; +} nrfx_timer_config_t; /** * @brief Timer driver instance default configuration. */ -#define NRF_DRV_TIMER_DEFAULT_CONFIG \ -{ \ - .frequency = (nrf_timer_frequency_t)TIMER_DEFAULT_CONFIG_FREQUENCY,\ - .mode = (nrf_timer_mode_t)TIMER_DEFAULT_CONFIG_MODE, \ - .bit_width = (nrf_timer_bit_width_t)TIMER_DEFAULT_CONFIG_BIT_WIDTH,\ - .interrupt_priority = TIMER_DEFAULT_CONFIG_IRQ_PRIORITY, \ - .p_context = NULL \ +#define NRFX_TIMER_DEFAULT_CONFIG \ +{ \ + .frequency = (nrf_timer_frequency_t)NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY,\ + .mode = (nrf_timer_mode_t)NRFX_TIMER_DEFAULT_CONFIG_MODE, \ + .bit_width = (nrf_timer_bit_width_t)NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH,\ + .interrupt_priority = NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY, \ + .p_context = NULL \ } /** @@ -124,38 +127,37 @@ typedef struct * additional information to the handler function, for * example, the timer ID. */ -typedef void (* nrf_timer_event_handler_t)(nrf_timer_event_t event_type, - void * p_context); +typedef void (* nrfx_timer_event_handler_t)(nrf_timer_event_t event_type, + void * p_context); /** * @brief Function for initializing the timer. * * @param[in] p_instance Pointer to the driver instance structure. - * @param[in] p_config Initial configuration. Must not be NULL. + * @param[in] p_config Pointer to the structure with initial configuration. * @param[in] timer_event_handler Event handler provided by the user. * Must not be NULL. * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the instance is already initialized. - * @retval NRF_ERROR_INVALID_PARAM If no handler was provided. + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the instance is already initialized. */ -ret_code_t nrf_drv_timer_init(nrf_drv_timer_t const * const p_instance, - nrf_drv_timer_config_t const * p_config, - nrf_timer_event_handler_t timer_event_handler); +nrfx_err_t nrfx_timer_init(nrfx_timer_t const * const p_instance, + nrfx_timer_config_t const * p_config, + nrfx_timer_event_handler_t timer_event_handler); /** * @brief Function for uninitializing the timer. * * @param[in] p_instance Pointer to the driver instance structure. */ -void nrf_drv_timer_uninit(nrf_drv_timer_t const * const p_instance); +void nrfx_timer_uninit(nrfx_timer_t const * const p_instance); /** * @brief Function for turning on the timer. * * @param[in] p_instance Pointer to the driver instance structure. */ -void nrf_drv_timer_enable(nrf_drv_timer_t const * const p_instance); +void nrfx_timer_enable(nrfx_timer_t const * const p_instance); /** * @brief Function for turning off the timer. @@ -165,35 +167,44 @@ void nrf_drv_timer_enable(nrf_drv_timer_t const * const p_instance); * * @param[in] p_instance Pointer to the driver instance structure. */ -void nrf_drv_timer_disable(nrf_drv_timer_t const * const p_instance); +void nrfx_timer_disable(nrfx_timer_t const * const p_instance); + +/** + * @brief Function for checking the timer state. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @return True if timer is enabled, false otherwise. + */ +bool nrfx_timer_is_enabled(nrfx_timer_t const * const p_instance); /** * @brief Function for pausing the timer. * * @param[in] p_instance Pointer to the driver instance structure. */ -void nrf_drv_timer_pause(nrf_drv_timer_t const * const p_instance); +void nrfx_timer_pause(nrfx_timer_t const * const p_instance); /** * @brief Function for resuming the timer. * * @param[in] p_instance Pointer to the driver instance structure. */ -void nrf_drv_timer_resume(nrf_drv_timer_t const * const p_instance); +void nrfx_timer_resume(nrfx_timer_t const * const p_instance); /** * @brief Function for clearing the timer. * * @param[in] p_instance Pointer to the driver instance structure. */ -void nrf_drv_timer_clear(nrf_drv_timer_t const * const p_instance); +void nrfx_timer_clear(nrfx_timer_t const * const p_instance); /** * @brief Function for incrementing the timer. * * @param[in] p_instance Pointer to the driver instance structure. */ -void nrf_drv_timer_increment(nrf_drv_timer_t const * const p_instance); +void nrfx_timer_increment(nrfx_timer_t const * const p_instance); /** * @brief Function for returning the address of a specific timer task. @@ -203,9 +214,8 @@ void nrf_drv_timer_increment(nrf_drv_timer_t const * const p_instance); * * @return Task address. */ -__STATIC_INLINE uint32_t nrf_drv_timer_task_address_get( - nrf_drv_timer_t const * const p_instance, - nrf_timer_task_t timer_task); +__STATIC_INLINE uint32_t nrfx_timer_task_address_get(nrfx_timer_t const * const p_instance, + nrf_timer_task_t timer_task); /** * @brief Function for returning the address of a specific timer capture task. @@ -215,9 +225,8 @@ __STATIC_INLINE uint32_t nrf_drv_timer_task_address_get( * * @return Task address. */ -__STATIC_INLINE uint32_t nrf_drv_timer_capture_task_address_get( - nrf_drv_timer_t const * const p_instance, - uint32_t channel); +__STATIC_INLINE uint32_t nrfx_timer_capture_task_address_get(nrfx_timer_t const * const p_instance, + uint32_t channel); /** * @brief Function for returning the address of a specific timer event. @@ -227,9 +236,8 @@ __STATIC_INLINE uint32_t nrf_drv_timer_capture_task_address_get( * * @return Event address. */ -__STATIC_INLINE uint32_t nrf_drv_timer_event_address_get( - nrf_drv_timer_t const * const p_instance, - nrf_timer_event_t timer_event); +__STATIC_INLINE uint32_t nrfx_timer_event_address_get(nrfx_timer_t const * const p_instance, + nrf_timer_event_t timer_event); /** * @brief Function for returning the address of a specific timer compare event. @@ -239,9 +247,8 @@ __STATIC_INLINE uint32_t nrf_drv_timer_event_address_get( * * @return Event address. */ -__STATIC_INLINE uint32_t nrf_drv_timer_compare_event_address_get( - nrf_drv_timer_t const * const p_instance, - uint32_t channel); +__STATIC_INLINE uint32_t nrfx_timer_compare_event_address_get(nrfx_timer_t const * const p_instance, + uint32_t channel); /** * @brief Function for capturing the timer value. @@ -251,8 +258,8 @@ __STATIC_INLINE uint32_t nrf_drv_timer_compare_event_address_get( * * @return Captured value. */ -uint32_t nrf_drv_timer_capture(nrf_drv_timer_t const * const p_instance, - nrf_timer_cc_channel_t cc_channel); +uint32_t nrfx_timer_capture(nrfx_timer_t const * const p_instance, + nrf_timer_cc_channel_t cc_channel); /** * @brief Function for returning the capture value from a specific channel. @@ -264,9 +271,8 @@ uint32_t nrf_drv_timer_capture(nrf_drv_timer_t const * const p_instance, * * @return Captured value. */ -__STATIC_INLINE uint32_t nrf_drv_timer_capture_get( - nrf_drv_timer_t const * const p_instance, - nrf_timer_cc_channel_t cc_channel); +__STATIC_INLINE uint32_t nrfx_timer_capture_get(nrfx_timer_t const * const p_instance, + nrf_timer_cc_channel_t cc_channel); /** * @brief Function for setting the timer channel in compare mode. @@ -276,10 +282,10 @@ __STATIC_INLINE uint32_t nrf_drv_timer_capture_get( * @param[in] cc_value Compare value. * @param[in] enable_int Enable or disable the interrupt for the compare channel. */ -void nrf_drv_timer_compare(nrf_drv_timer_t const * const p_instance, - nrf_timer_cc_channel_t cc_channel, - uint32_t cc_value, - bool enable_int); +void nrfx_timer_compare(nrfx_timer_t const * const p_instance, + nrf_timer_cc_channel_t cc_channel, + uint32_t cc_value, + bool enable_int); /** * @brief Function for setting the timer channel in extended compare mode. @@ -292,11 +298,11 @@ void nrf_drv_timer_compare(nrf_drv_timer_t const * const p_instance, * @param[in] enable_int Enable or disable the interrupt for the compare * channel. */ -void nrf_drv_timer_extended_compare(nrf_drv_timer_t const * const p_instance, - nrf_timer_cc_channel_t cc_channel, - uint32_t cc_value, - nrf_timer_short_mask_t timer_short_mask, - bool enable_int); +void nrfx_timer_extended_compare(nrfx_timer_t const * const p_instance, + nrf_timer_cc_channel_t cc_channel, + uint32_t cc_value, + nrf_timer_short_mask_t timer_short_mask, + bool enable_int); /** * @brief Function for converting time in microseconds to timer ticks. @@ -306,9 +312,8 @@ void nrf_drv_timer_extended_compare(nrf_drv_timer_t const * const p_instance, * * @return Number of ticks. */ -__STATIC_INLINE uint32_t nrf_drv_timer_us_to_ticks( - nrf_drv_timer_t const * const p_instance, - uint32_t time_us); +__STATIC_INLINE uint32_t nrfx_timer_us_to_ticks(nrfx_timer_t const * const p_instance, + uint32_t time_us); /** * @brief Function for converting time in milliseconds to timer ticks. @@ -318,9 +323,8 @@ __STATIC_INLINE uint32_t nrf_drv_timer_us_to_ticks( * * @return Number of ticks. */ -__STATIC_INLINE uint32_t nrf_drv_timer_ms_to_ticks( - nrf_drv_timer_t const * const p_instance, - uint32_t time_ms); +__STATIC_INLINE uint32_t nrfx_timer_ms_to_ticks(nrfx_timer_t const * const p_instance, + uint32_t time_ms); /** * @brief Function for enabling timer compare interrupt. @@ -328,8 +332,8 @@ __STATIC_INLINE uint32_t nrf_drv_timer_ms_to_ticks( * @param[in] p_instance Pointer to the driver instance structure. * @param[in] channel Compare channel. */ -void nrf_drv_timer_compare_int_enable(nrf_drv_timer_t const * const p_instance, - uint32_t channel); +void nrfx_timer_compare_int_enable(nrfx_timer_t const * const p_instance, + uint32_t channel); /** * @brief Function for disabling timer compare interrupt. @@ -337,74 +341,73 @@ void nrf_drv_timer_compare_int_enable(nrf_drv_timer_t const * const p_instance, * @param[in] p_instance Pointer to the driver instance structure. * @param[in] channel Compare channel. */ -void nrf_drv_timer_compare_int_disable(nrf_drv_timer_t const * const p_instance, - uint32_t channel); +void nrfx_timer_compare_int_disable(nrfx_timer_t const * const p_instance, + uint32_t channel); #ifndef SUPPRESS_INLINE_IMPLEMENTATION -__STATIC_INLINE uint32_t nrf_drv_timer_task_address_get( - nrf_drv_timer_t const * const p_instance, - nrf_timer_task_t timer_task) +__STATIC_INLINE uint32_t nrfx_timer_task_address_get(nrfx_timer_t const * const p_instance, + nrf_timer_task_t timer_task) { return (uint32_t)nrf_timer_task_address_get(p_instance->p_reg, timer_task); } -__STATIC_INLINE uint32_t nrf_drv_timer_capture_task_address_get( - nrf_drv_timer_t const * const p_instance, - uint32_t channel) +__STATIC_INLINE uint32_t nrfx_timer_capture_task_address_get(nrfx_timer_t const * const p_instance, + uint32_t channel) { - ASSERT(channel < p_instance->cc_channel_count); + NRFX_ASSERT(channel < p_instance->cc_channel_count); return (uint32_t)nrf_timer_task_address_get(p_instance->p_reg, nrf_timer_capture_task_get(channel)); } -__STATIC_INLINE uint32_t nrf_drv_timer_event_address_get( - nrf_drv_timer_t const * const p_instance, - nrf_timer_event_t timer_event) +__STATIC_INLINE uint32_t nrfx_timer_event_address_get(nrfx_timer_t const * const p_instance, + nrf_timer_event_t timer_event) { return (uint32_t)nrf_timer_event_address_get(p_instance->p_reg, timer_event); } -__STATIC_INLINE uint32_t nrf_drv_timer_compare_event_address_get( - nrf_drv_timer_t const * const p_instance, - uint32_t channel) +__STATIC_INLINE uint32_t nrfx_timer_compare_event_address_get(nrfx_timer_t const * const p_instance, + uint32_t channel) { - ASSERT(channel < p_instance->cc_channel_count); + NRFX_ASSERT(channel < p_instance->cc_channel_count); return (uint32_t)nrf_timer_event_address_get(p_instance->p_reg, nrf_timer_compare_event_get(channel)); } -__STATIC_INLINE uint32_t nrf_drv_timer_capture_get( - nrf_drv_timer_t const * const p_instance, - nrf_timer_cc_channel_t cc_channel) +__STATIC_INLINE uint32_t nrfx_timer_capture_get(nrfx_timer_t const * const p_instance, + nrf_timer_cc_channel_t cc_channel) { return nrf_timer_cc_read(p_instance->p_reg, cc_channel); } -__STATIC_INLINE uint32_t nrf_drv_timer_us_to_ticks( - nrf_drv_timer_t const * const p_instance, - uint32_t timer_us) +__STATIC_INLINE uint32_t nrfx_timer_us_to_ticks(nrfx_timer_t const * const p_instance, + uint32_t timer_us) { - return nrf_timer_us_to_ticks(timer_us, - nrf_timer_frequency_get(p_instance->p_reg)); + return nrf_timer_us_to_ticks(timer_us, nrf_timer_frequency_get(p_instance->p_reg)); } -__STATIC_INLINE uint32_t nrf_drv_timer_ms_to_ticks( - nrf_drv_timer_t const * const p_instance, - uint32_t timer_ms) +__STATIC_INLINE uint32_t nrfx_timer_ms_to_ticks(nrfx_timer_t const * const p_instance, + uint32_t timer_ms) { - return nrf_timer_ms_to_ticks(timer_ms, - nrf_timer_frequency_get(p_instance->p_reg)); + return nrf_timer_ms_to_ticks(timer_ms, nrf_timer_frequency_get(p_instance->p_reg)); } #endif // SUPPRESS_INLINE_IMPLEMENTATION +void nrfx_timer_0_irq_handler(void); +void nrfx_timer_1_irq_handler(void); +void nrfx_timer_2_irq_handler(void); +void nrfx_timer_3_irq_handler(void); +void nrfx_timer_4_irq_handler(void); + + +/** @} */ + #ifdef __cplusplus } #endif -#endif // NRF_DRV_TIMER_H__ +#endif // NRFX_TIMER_H__ -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_twi.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_twi.h new file mode 100644 index 0000000000..c5b85908d4 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_twi.h @@ -0,0 +1,368 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_TWI_H__ +#define NRFX_TWI_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_twi TWI driver + * @{ + * @ingroup nrf_twi + * @brief TWI peripheral driver. + */ + +/** + * @brief Structure for the TWI master driver instance. + */ +typedef struct +{ + NRF_TWI_Type * p_twi; ///< Pointer to a structure with TWI registers. + uint8_t drv_inst_idx; ///< Driver instance index. +} nrfx_twi_t; + +/** + * @brief Macro for creating a TWI master driver instance. + */ +#define NRFX_TWI_INSTANCE(id) \ +{ \ + .p_twi = NRFX_CONCAT_2(NRF_TWI, id), \ + .drv_inst_idx = NRFX_CONCAT_3(NRFX_TWI, id, _INST_IDX), \ +} + +enum { +#if NRFX_CHECK(NRFX_TWI0_ENABLED) + NRFX_TWI0_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_TWI1_ENABLED) + NRFX_TWI1_INST_IDX, +#endif + NRFX_TWI_ENABLED_COUNT +}; + +/** + * @brief Structure for the TWI master driver instance configuration. + */ +typedef struct +{ + uint32_t scl; ///< SCL pin number. + uint32_t sda; ///< SDA pin number. + nrf_twi_frequency_t frequency; ///< TWI frequency. + uint8_t interrupt_priority; ///< Interrupt priority. + bool hold_bus_uninit; ///< Hold pull up state on gpio pins after uninit. +} nrfx_twi_config_t; + +/** + * @brief TWI master driver instance default configuration. + */ +#define NRFX_TWI_DEFAULT_CONFIG \ +{ \ + .frequency = (nrf_twi_frequency_t)NRFX_TWI_DEFAULT_CONFIG_FREQUENCY, \ + .scl = 31, \ + .sda = 31, \ + .interrupt_priority = NRFX_TWI_DEFAULT_CONFIG_IRQ_PRIORITY, \ + .hold_bus_uninit = NRFX_TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT, \ +} + +#define NRFX_TWI_FLAG_NO_XFER_EVT_HANDLER (1UL << 2) /**< Interrupt after each transfer is suppressed, and the event handler is not called. */ +#define NRFX_TWI_FLAG_TX_NO_STOP (1UL << 5) /**< Flag indicating that the TX transfer will not end with a stop condition. */ + +/** + * @brief TWI master driver event types. + */ +typedef enum +{ + NRFX_TWI_EVT_DONE, ///< Transfer completed event. + NRFX_TWI_EVT_ADDRESS_NACK, ///< Error event: NACK received after sending the address. + NRFX_TWI_EVT_DATA_NACK ///< Error event: NACK received after sending a data byte. +} nrfx_twi_evt_type_t; + +/** + * @brief TWI master driver transfer types. + */ +typedef enum +{ + NRFX_TWI_XFER_TX, ///< TX transfer. + NRFX_TWI_XFER_RX, ///< RX transfer. + NRFX_TWI_XFER_TXRX, ///< TX transfer followed by RX transfer with repeated start. + NRFX_TWI_XFER_TXTX ///< TX transfer followed by TX transfer with repeated start. +} nrfx_twi_xfer_type_t; + +/** + * @brief Structure for a TWI transfer descriptor. + */ +typedef struct +{ + nrfx_twi_xfer_type_t type; ///< Type of transfer. + uint8_t address; ///< Slave address. + size_t primary_length; ///< Number of bytes transferred. + size_t secondary_length; ///< Number of bytes transferred. + uint8_t * p_primary_buf; ///< Pointer to transferred data. + uint8_t * p_secondary_buf; ///< Pointer to transferred data. +} nrfx_twi_xfer_desc_t; + + +/**@brief Macro for setting the TX transfer descriptor. */ +#define NRFX_TWI_XFER_DESC_TX(addr, p_data, length) \ + { \ + .type = NRFX_TWI_XFER_TX, \ + .address = addr, \ + .primary_length = length, \ + .p_primary_buf = p_data, \ + } + +/**@brief Macro for setting the RX transfer descriptor. */ +#define NRFX_TWI_XFER_DESC_RX(addr, p_data, length) \ + { \ + .type = NRFX_TWI_XFER_RX, \ + .address = addr, \ + .primary_length = length, \ + .p_primary_buf = p_data, \ + } + +/**@brief Macro for setting the TXRX transfer descriptor. */ +#define NRFX_TWI_XFER_DESC_TXRX(addr, p_tx, tx_len, p_rx, rx_len) \ + { \ + .type = NRFX_TWI_XFER_TXRX, \ + .address = addr, \ + .primary_length = tx_len, \ + .secondary_length = rx_len, \ + .p_primary_buf = p_tx, \ + .p_secondary_buf = p_rx, \ + } + +/**@brief Macro for setting the TXTX transfer descriptor. */ +#define NRFX_TWI_XFER_DESC_TXTX(addr, p_tx, tx_len, p_tx2, tx_len2) \ + { \ + .type = NRFX_TWI_XFER_TXTX, \ + .address = addr, \ + .primary_length = tx_len, \ + .secondary_length = tx_len2, \ + .p_primary_buf = p_tx, \ + .p_secondary_buf = p_tx2, \ + } + +/** + * @brief Structure for a TWI event. + */ +typedef struct +{ + nrfx_twi_evt_type_t type; ///< Event type. + nrfx_twi_xfer_desc_t xfer_desc; ///< Transfer details. +} nrfx_twi_evt_t; + +/** + * @brief TWI event handler prototype. + */ +typedef void (* nrfx_twi_evt_handler_t)(nrfx_twi_evt_t const * p_event, + void * p_context); + +/** + * @brief Function for initializing the TWI driver instance. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_config Pointer to the structure with initial configuration. + * @param[in] event_handler Event handler provided by the user. If NULL, blocking mode is enabled. + * @param[in] p_context Context passed to event handler. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the driver is in invalid state. + * @retval NRFX_ERROR_BUSY If some other peripheral with the same + * instance ID is already in use. This is + * possible only if @ref nrfx_prs module + * is enabled. + */ +nrfx_err_t nrfx_twi_init(nrfx_twi_t const * p_instance, + nrfx_twi_config_t const * p_config, + nrfx_twi_evt_handler_t event_handler, + void * p_context); + +/** + * @brief Function for uninitializing the TWI instance. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_twi_uninit(nrfx_twi_t const * p_instance); + +/** + * @brief Function for enabling the TWI instance. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_twi_enable(nrfx_twi_t const * p_instance); + +/** + * @brief Function for disabling the TWI instance. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_twi_disable(nrfx_twi_t const * p_instance); + +/** + * @brief Function for sending data to a TWI slave. + * + * The transmission will be stopped when an error occurs. If a transfer is ongoing, + * the function returns the error code @ref NRFX_ERROR_BUSY. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] address Address of a specific slave device (only 7 LSB). + * @param[in] p_data Pointer to a transmit buffer. + * @param[in] length Number of bytes to send. + * @param[in] no_stop If set, the stop condition is not generated on the bus + * after the transfer has completed successfully (allowing + * for a repeated start in the next transfer). + * + * @retval NRFX_SUCCESS If the procedure was successful. + * @retval NRFX_ERROR_BUSY If the driver is not ready for a new transfer. + * @retval NRFX_ERROR_INTERNAL If an error was detected by hardware. + * @retval NRFX_ERROR_DRV_TWI_ERR_ANACK If NACK received after sending the address in polling mode. + * @retval NRFX_ERROR_DRV_TWI_ERR_DNACK If NACK received after sending a data byte in polling mode. + */ +nrfx_err_t nrfx_twi_tx(nrfx_twi_t const * p_instance, + uint8_t address, + uint8_t const * p_data, + size_t length, + bool no_stop); + +/** + * @brief Function for reading data from a TWI slave. + * + * The transmission will be stopped when an error occurs. If a transfer is ongoing, + * the function returns the error code @ref NRFX_ERROR_BUSY. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] address Address of a specific slave device (only 7 LSB). + * @param[in] p_data Pointer to a receive buffer. + * @param[in] length Number of bytes to be received. + * + * @retval NRFX_SUCCESS If the procedure was successful. + * @retval NRFX_ERROR_BUSY If the driver is not ready for a new transfer. + * @retval NRFX_ERROR_INTERNAL If an error was detected by hardware. + * @retval NRFX_ERROR_DRV_TWI_ERR_OVERRUN If the unread data was replaced by new data + * @retval NRFX_ERROR_DRV_TWI_ERR_ANACK If NACK received after sending the address in polling mode. + * @retval NRFX_ERROR_DRV_TWI_ERR_DNACK If NACK received after sending a data byte in polling mode. + */ +nrfx_err_t nrfx_twi_rx(nrfx_twi_t const * p_instance, + uint8_t address, + uint8_t * p_data, + size_t length); + +/** + * @brief Function for preparing a TWI transfer. + * + * The following transfer types can be configured (@ref nrfx_twi_xfer_desc_t::type): + * - @ref NRFX_TWI_XFER_TXRX: Write operation followed by a read operation (without STOP condition in between). + * - @ref NRFX_TWI_XFER_TXTX: Write operation followed by a write operation (without STOP condition in between). + * - @ref NRFX_TWI_XFER_TX: Write operation (with or without STOP condition). + * - @ref NRFX_TWI_XFER_RX: Read operation (with STOP condition). + * + * @note TXRX and TXTX transfers are supported only in non-blocking mode. + * + * Additional options are provided using the flags parameter: + * - @ref NRFX_TWI_FLAG_NO_XFER_EVT_HANDLER: No user event handler after transfer completion. In most cases, this also means no interrupt at the end of the transfer. + * - @ref NRFX_TWI_FLAG_TX_NO_STOP: No stop condition after TX transfer. + * + * @note + * Some flag combinations are invalid: + * - @ref NRFX_TWI_FLAG_TX_NO_STOP with @ref nrfx_twi_xfer_desc_t::type different than @ref NRFX_TWI_XFER_TX + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_xfer_desc Pointer to the transfer descriptor. + * @param[in] flags Transfer options (0 for default settings). + * + * @retval NRFX_SUCCESS If the procedure was successful. + * @retval NRFX_ERROR_BUSY If the driver is not ready for a new transfer. + * @retval NRFX_ERROR_NOT_SUPPORTED If the provided parameters are not supported. + * @retval NRFX_ERROR_INTERNAL If an error was detected by hardware. + * @retval NRFX_ERROR_DRV_TWI_ERR_OVERRUN If the unread data was replaced by new data (TXRX and RX) + * @retval NRFX_ERROR_DRV_TWI_ERR_ANACK If NACK received after sending the address. + * @retval NRFX_ERROR_DRV_TWI_ERR_DNACK If NACK received after sending a data byte. + */ +nrfx_err_t nrfx_twi_xfer(nrfx_twi_t const * p_instance, + nrfx_twi_xfer_desc_t const * p_xfer_desc, + uint32_t flags); + +/** + * @brief Function for checking the TWI driver state. + * + * @param[in] p_instance TWI instance. + * + * @retval true If the TWI driver is currently busy performing a transfer. + * @retval false If the TWI driver is ready for a new transfer. + */ +bool nrfx_twi_is_busy(nrfx_twi_t const * p_instance); + +/** + * @brief Function for getting the transferred data count. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @return Data count. + */ +size_t nrfx_twi_data_count_get(nrfx_twi_t const * const p_instance); + +/** + * @brief Function for returning the address of a STOPPED TWI event. + * + * A STOPPED event can be used to detect the end of a transfer if the @ref NRFX_TWI_FLAG_NO_XFER_EVT_HANDLER + * option is used. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @return STOPPED event address. + */ +uint32_t nrfx_twi_stopped_event_get(nrfx_twi_t const * p_instance); + +void nrfx_twi_0_irq_handler(void); +void nrfx_twi_1_irq_handler(void); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_TWI_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_twim.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_twim.h new file mode 100644 index 0000000000..0b1be22fe8 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_twim.h @@ -0,0 +1,408 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_TWIM_H__ +#define NRFX_TWIM_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_twim TWIM driver + * @{ + * @ingroup nrf_twim + * @brief TWIM peripheral driver. + */ + +/** + * @brief Structure for the TWI master driver instance. + */ +typedef struct +{ + NRF_TWIM_Type * p_twim; ///< Pointer to a structure with TWIM registers. + uint8_t drv_inst_idx; ///< Driver instance index. +} nrfx_twim_t; + +/** + * @brief Macro for creating a TWI master driver instance. + */ +#define NRFX_TWIM_INSTANCE(id) \ +{ \ + .p_twim = NRFX_CONCAT_2(NRF_TWIM, id), \ + .drv_inst_idx = NRFX_CONCAT_3(NRFX_TWIM, id, _INST_IDX), \ +} + +enum { +#if NRFX_CHECK(NRFX_TWIM0_ENABLED) + NRFX_TWIM0_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_TWIM1_ENABLED) + NRFX_TWIM1_INST_IDX, +#endif + NRFX_TWIM_ENABLED_COUNT +}; + +/** + * @brief Structure for the TWI master driver instance configuration. + */ +typedef struct +{ + uint32_t scl; ///< SCL pin number. + uint32_t sda; ///< SDA pin number. + nrf_twim_frequency_t frequency; ///< TWIM frequency. + uint8_t interrupt_priority; ///< Interrupt priority. + bool hold_bus_uninit; ///< Hold pull up state on gpio pins after uninit. +} nrfx_twim_config_t; + +/** + * @brief TWI master driver instance default configuration. + */ +#define NRFX_TWIM_DEFAULT_CONFIG \ +{ \ + .frequency = (nrf_twim_frequency_t)NRFX_TWIM_DEFAULT_CONFIG_FREQUENCY, \ + .scl = 31, \ + .sda = 31, \ + .interrupt_priority = NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY, \ + .hold_bus_uninit = NRFX_TWIM_DEFAULT_CONFIG_HOLD_BUS_UNINIT, \ +} + +#define NRFX_TWIM_FLAG_TX_POSTINC (1UL << 0) /**< TX buffer address incremented after transfer. */ +#define NRFX_TWIM_FLAG_RX_POSTINC (1UL << 1) /**< RX buffer address incremented after transfer. */ +#define NRFX_TWIM_FLAG_NO_XFER_EVT_HANDLER (1UL << 2) /**< Interrupt after each transfer is suppressed, and the event handler is not called. */ +#define NRFX_TWIM_FLAG_HOLD_XFER (1UL << 3) /**< Set up the transfer but do not start it. */ +#define NRFX_TWIM_FLAG_REPEATED_XFER (1UL << 4) /**< Flag indicating that the transfer will be executed multiple times. */ +#define NRFX_TWIM_FLAG_TX_NO_STOP (1UL << 5) /**< Flag indicating that the TX transfer will not end with a stop condition. */ + +/** + * @brief TWI master driver event types. + */ +typedef enum +{ + NRFX_TWIM_EVT_DONE, ///< Transfer completed event. + NRFX_TWIM_EVT_ADDRESS_NACK, ///< Error event: NACK received after sending the address. + NRFX_TWIM_EVT_DATA_NACK ///< Error event: NACK received after sending a data byte. +} nrfx_twim_evt_type_t; + +/** + * @brief TWI master driver transfer types. + */ +typedef enum +{ + NRFX_TWIM_XFER_TX, ///< TX transfer. + NRFX_TWIM_XFER_RX, ///< RX transfer. + NRFX_TWIM_XFER_TXRX, ///< TX transfer followed by RX transfer with repeated start. + NRFX_TWIM_XFER_TXTX ///< TX transfer followed by TX transfer with repeated start. +} nrfx_twim_xfer_type_t; + +/** + * @brief Structure for a TWI transfer descriptor. + */ +typedef struct +{ + nrfx_twim_xfer_type_t type; ///< Type of transfer. + uint8_t address; ///< Slave address. + size_t primary_length; ///< Number of bytes transferred. + size_t secondary_length; ///< Number of bytes transferred. + uint8_t * p_primary_buf; ///< Pointer to transferred data. + uint8_t * p_secondary_buf; ///< Pointer to transferred data. +} nrfx_twim_xfer_desc_t; + + +/**@brief Macro for setting the TX transfer descriptor. */ +#define NRFX_TWIM_XFER_DESC_TX(addr, p_data, length) \ + { \ + .type = NRFX_TWIM_XFER_TX, \ + .address = addr, \ + .primary_length = length, \ + .p_primary_buf = p_data, \ + } + +/**@brief Macro for setting the RX transfer descriptor. */ +#define NRFX_TWIM_XFER_DESC_RX(addr, p_data, length) \ + { \ + .type = NRFX_TWIM_XFER_RX, \ + .address = addr, \ + .primary_length = length, \ + .p_primary_buf = p_data, \ + } + +/**@brief Macro for setting the TXRX transfer descriptor. */ +#define NRFX_TWIM_XFER_DESC_TXRX(addr, p_tx, tx_len, p_rx, rx_len) \ + { \ + .type = NRFX_TWIM_XFER_TXRX, \ + .address = addr, \ + .primary_length = tx_len, \ + .secondary_length = rx_len, \ + .p_primary_buf = p_tx, \ + .p_secondary_buf = p_rx, \ + } + +/**@brief Macro for setting the TXTX transfer descriptor. */ +#define NRFX_TWIM_XFER_DESC_TXTX(addr, p_tx, tx_len, p_tx2, tx_len2) \ + { \ + .type = NRFX_TWIM_XFER_TXTX, \ + .address = addr, \ + .primary_length = tx_len, \ + .secondary_length = tx_len2, \ + .p_primary_buf = p_tx, \ + .p_secondary_buf = p_tx2, \ + } + +/** + * @brief Structure for a TWI event. + */ +typedef struct +{ + nrfx_twim_evt_type_t type; ///< Event type. + nrfx_twim_xfer_desc_t xfer_desc; ///< Transfer details. +} nrfx_twim_evt_t; + +/** + * @brief TWI event handler prototype. + */ +typedef void (* nrfx_twim_evt_handler_t)(nrfx_twim_evt_t const * p_event, + void * p_context); + +/** + * @brief Function for initializing the TWI driver instance. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_config Pointer to the structure with initial configuration. + * @param[in] event_handler Event handler provided by the user. If NULL, blocking mode is enabled. + * @param[in] p_context Context passed to event handler. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the driver is in invalid state. + * @retval NRFX_ERROR_BUSY If some other peripheral with the same + * instance ID is already in use. This is + * possible only if @ref nrfx_prs module + * is enabled. + */ +nrfx_err_t nrfx_twim_init(nrfx_twim_t const * p_instance, + nrfx_twim_config_t const * p_config, + nrfx_twim_evt_handler_t event_handler, + void * p_context); + +/** + * @brief Function for uninitializing the TWI instance. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_twim_uninit(nrfx_twim_t const * p_instance); + +/** + * @brief Function for enabling the TWI instance. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_twim_enable(nrfx_twim_t const * p_instance); + +/** + * @brief Function for disabling the TWI instance. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_twim_disable(nrfx_twim_t const * p_instance); + +/** + * @brief Function for sending data to a TWI slave. + * + * The transmission will be stopped when an error occurs. If a transfer is ongoing, + * the function returns the error code @ref NRFX_ERROR_BUSY. + * + * @note Peripherals using EasyDMA (including TWIM) require the transfer buffers + * to be placed in the Data RAM region. If this condition is not met, + * this function will fail with the error code NRFX_ERROR_INVALID_ADDR. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] address Address of a specific slave device (only 7 LSB). + * @param[in] p_data Pointer to a transmit buffer. + * @param[in] length Number of bytes to send. Maximum possible length is + * dependent on the used SoC (see the MAXCNT register + * description in the Product Specification). The driver + * checks it with assertion. + * @param[in] no_stop If set, the stop condition is not generated on the bus + * after the transfer has completed successfully (allowing + * for a repeated start in the next transfer). + * + * @retval NRFX_SUCCESS If the procedure was successful. + * @retval NRFX_ERROR_BUSY If the driver is not ready for a new transfer. + * @retval NRFX_ERROR_INTERNAL If an error was detected by hardware. + * @retval NRFX_ERROR_INVALID_ADDR If the provided buffer is not placed in the Data RAM region. + * @retval NRFX_ERROR_DRV_TWI_ERR_ANACK If NACK received after sending the address in polling mode. + * @retval NRFX_ERROR_DRV_TWI_ERR_DNACK If NACK received after sending a data byte in polling mode. + */ +nrfx_err_t nrfx_twim_tx(nrfx_twim_t const * p_instance, + uint8_t address, + uint8_t const * p_data, + size_t length, + bool no_stop); + +/** + * @brief Function for reading data from a TWI slave. + * + * The transmission will be stopped when an error occurs. If a transfer is ongoing, + * the function returns the error code @ref NRFX_ERROR_BUSY. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] address Address of a specific slave device (only 7 LSB). + * @param[in] p_data Pointer to a receive buffer. + * @param[in] length Number of bytes to be received. Maximum possible length + * is dependent on the used SoC (see the MAXCNT register + * description in the Product Specification). The driver + * checks it with assertion. + * + * @retval NRFX_SUCCESS If the procedure was successful. + * @retval NRFX_ERROR_BUSY If the driver is not ready for a new transfer. + * @retval NRFX_ERROR_INTERNAL If an error was detected by hardware. + * @retval NRFX_ERROR_DRV_TWI_ERR_ANACK If NACK received after sending the address in polling mode. + * @retval NRFX_ERROR_DRV_TWI_ERR_DNACK If NACK received after sending a data byte in polling mode. + */ +nrfx_err_t nrfx_twim_rx(nrfx_twim_t const * p_instance, + uint8_t address, + uint8_t * p_data, + size_t length); + +/** + * @brief Function for preparing a TWI transfer. + * + * The following transfer types can be configured (@ref nrfx_twim_xfer_desc_t::type): + * - @ref NRFX_TWIM_XFER_TXRX: Write operation followed by a read operation (without STOP condition in between). + * - @ref NRFX_TWIM_XFER_TXTX: Write operation followed by a write operation (without STOP condition in between). + * - @ref NRFX_TWIM_XFER_TX: Write operation (with or without STOP condition). + * - @ref NRFX_TWIM_XFER_RX: Read operation (with STOP condition). + * + * @note TXRX and TXTX transfers are supported only in non-blocking mode. + * + * Additional options are provided using the flags parameter: + * - @ref NRFX_TWIM_FLAG_TX_POSTINC and @ref NRFX_TWIM_FLAG_RX_POSTINC: Post-incrementation of buffer addresses. Supported only by TWIM. + * - @ref NRFX_TWIM_FLAG_NO_XFER_EVT_HANDLER: No user event handler after transfer completion. In most cases, this also means no interrupt at the end of the transfer. + * - @ref NRFX_TWIM_FLAG_HOLD_XFER: Driver is not starting the transfer. Use this flag if the transfer is triggered externally by PPI. Supported only by TWIM. + * Use @ref nrfx_twim_start_task_get to get the address of the start task. + * - @ref NRFX_TWIM_FLAG_REPEATED_XFER: Prepare for repeated transfers. You can set up a number of transfers that will be triggered externally (for example by PPI). + * An example is a TXRX transfer with the options @ref NRFX_TWIM_FLAG_RX_POSTINC, @ref NRFX_TWIM_FLAG_NO_XFER_EVT_HANDLER, and @ref NRFX_TWIM_FLAG_REPEATED_XFER. + * After the transfer is set up, a set of transfers can be triggered by PPI that will read, for example, the same register of an + * external component and put it into a RAM buffer without any interrupts. @ref nrfx_twim_stopped_event_get can be used to get the + * address of the STOPPED event, which can be used to count the number of transfers. If @ref NRFX_TWIM_FLAG_REPEATED_XFER is used, + * the driver does not set the driver instance into busy state, so you must ensure that the next transfers are set up + * when TWIM is not active. Supported only by TWIM. + * - @ref NRFX_TWIM_FLAG_TX_NO_STOP: No stop condition after TX transfer. + * + * @note + * Some flag combinations are invalid: + * - @ref NRFX_TWIM_FLAG_TX_NO_STOP with @ref nrfx_twim_xfer_desc_t::type different than @ref NRFX_TWIM_XFER_TX + * - @ref NRFX_TWIM_FLAG_REPEATED_XFER with @ref nrfx_twim_xfer_desc_t::type set to @ref NRFX_TWIM_XFER_TXTX + * + * If @ref nrfx_twim_xfer_desc_t::type is set to @ref NRFX_TWIM_XFER_TX and the @ref NRFX_TWIM_FLAG_TX_NO_STOP and @ref NRFX_TWIM_FLAG_REPEATED_XFER + * flags are set, two tasks must be used to trigger a transfer: TASKS_RESUME followed by TASKS_STARTTX. If no stop condition is generated, + * TWIM is in SUSPENDED state. Therefore, it must be resumed before the transfer can be started. + * + * @note Peripherals using EasyDMA (including TWIM) require the transfer buffers + * to be placed in the Data RAM region. If this condition is not met, + * this function will fail with the error code NRFX_ERROR_INVALID_ADDR. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_xfer_desc Pointer to the transfer descriptor. + * @param[in] flags Transfer options (0 for default settings). + * + * @retval NRFX_SUCCESS If the procedure was successful. + * @retval NRFX_ERROR_BUSY If the driver is not ready for a new transfer. + * @retval NRFX_ERROR_NOT_SUPPORTED If the provided parameters are not supported. + * @retval NRFX_ERROR_INTERNAL If an error was detected by hardware. + * @retval NRFX_ERROR_INVALID_ADDR If the provided buffers are not placed in the Data RAM region. + * @retval NRFX_ERROR_DRV_TWI_ERR_ANACK If NACK received after sending the address. + * @retval NRFX_ERROR_DRV_TWI_ERR_DNACK If NACK received after sending a data byte. + */ +nrfx_err_t nrfx_twim_xfer(nrfx_twim_t const * p_instance, + nrfx_twim_xfer_desc_t const * p_xfer_desc, + uint32_t flags); + +/** + * @brief Function for checking the TWI driver state. + * + * @param[in] p_instance TWI instance. + * + * @retval true If the TWI driver is currently busy performing a transfer. + * @retval false If the TWI driver is ready for a new transfer. + */ +bool nrfx_twim_is_busy(nrfx_twim_t const * p_instance); + + +/** + * @brief Function for returning the address of a TWIM start task. + * + * This function should be used if @ref nrfx_twim_xfer was called with the flag @ref NRFX_TWIM_FLAG_HOLD_XFER. + * In that case, the transfer is not started by the driver, but it must be started externally by PPI. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] xfer_type Transfer type used in the last call of the @ref nrfx_twim_xfer function. + * + * @return Start task address (TX or RX) depending on the value of xfer_type. + */ +uint32_t nrfx_twim_start_task_get(nrfx_twim_t const * p_instance, nrfx_twim_xfer_type_t xfer_type); + +/** + * @brief Function for returning the address of a STOPPED TWIM event. + * + * A STOPPED event can be used to detect the end of a transfer if the @ref NRFX_TWIM_FLAG_NO_XFER_EVT_HANDLER + * option is used. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @return STOPPED event address. + */ +uint32_t nrfx_twim_stopped_event_get(nrfx_twim_t const * p_instance); + + +void nrfx_twim_0_irq_handler(void); +void nrfx_twim_1_irq_handler(void); + + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_TWIM_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_twis.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_twis.h new file mode 100644 index 0000000000..56308680fc --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_twis.h @@ -0,0 +1,405 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_TWIS_H__ +#define NRFX_TWIS_H__ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_twis TWIS driver + * @{ + * @ingroup nrf_twis + * @brief Two Wire Slave interface (TWIS) peripheral driver. + */ + +/** + * @brief TWIS driver instance data structure. + */ +typedef struct +{ + NRF_TWIS_Type * p_reg; ///< Pointer to a structure with TWIS registers. + uint8_t drv_inst_idx; ///< Driver instance index. +} nrfx_twis_t; + +enum { +#if NRFX_CHECK(NRFX_TWIS0_ENABLED) + NRFX_TWIS0_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_TWIS1_ENABLED) + NRFX_TWIS1_INST_IDX, +#endif + NRFX_TWIS_ENABLED_COUNT +}; + +/** + * @brief Macro for creating a TWIS driver instance. + */ +#define NRFX_TWIS_INSTANCE(id) \ +{ \ + .p_reg = NRFX_CONCAT_2(NRF_TWIS, id), \ + .drv_inst_idx = NRFX_CONCAT_3(NRFX_TWIS, id, _INST_IDX), \ +} + +/** + * @brief Event callback function event definitions. + */ +typedef enum +{ + NRFX_TWIS_EVT_READ_REQ, ///< Read request detected. + /**< If there is no buffer prepared, buf_req flag in the even will be set. + Call then @ref nrfx_twis_tx_prepare to give parameters for buffer. + */ + NRFX_TWIS_EVT_READ_DONE, ///< Read request has finished - free any data. + NRFX_TWIS_EVT_READ_ERROR, ///< Read request finished with error. + NRFX_TWIS_EVT_WRITE_REQ, ///< Write request detected. + /**< If there is no buffer prepared, buf_req flag in the even will be set. + Call then @ref nrfx_twis_rx_prepare to give parameters for buffer. + */ + NRFX_TWIS_EVT_WRITE_DONE, ///< Write request has finished - process data. + NRFX_TWIS_EVT_WRITE_ERROR, ///< Write request finished with error. + NRFX_TWIS_EVT_GENERAL_ERROR ///< Error that happens not inside WRITE or READ transaction. +} nrfx_twis_evt_type_t; + +/** + * @brief Possible error sources. + * + * This is flag enum - values from this enum can be connected using logical or operator. + * @note + * We could use directly @ref nrf_twis_error_t. Error type enum is redefined here because + * of possible future extension (eg. supporting timeouts and synchronous mode). + */ +typedef enum +{ + NRFX_TWIS_ERROR_OVERFLOW = NRF_TWIS_ERROR_OVERFLOW, /**< RX buffer overflow detected, and prevented. */ + NRFX_TWIS_ERROR_DATA_NACK = NRF_TWIS_ERROR_DATA_NACK, /**< NACK sent after receiving a data byte. */ + NRFX_TWIS_ERROR_OVERREAD = NRF_TWIS_ERROR_OVERREAD, /**< TX buffer over-read detected, and prevented. */ + NRFX_TWIS_ERROR_UNEXPECTED_EVENT = 1 << 8 /**< Unexpected event detected by state machine. */ +} nrfx_twis_error_t; + +/** + * @brief TWIS driver event structure. + */ +typedef struct +{ + nrfx_twis_evt_type_t type; ///< Event type. + union + { + bool buf_req; ///< Flag for @ref NRFX_TWIS_EVT_READ_REQ and @ref NRFX_TWIS_EVT_WRITE_REQ. + /**< Information if transmission buffer requires to be prepared. */ + uint32_t tx_amount; ///< Data for @ref NRFX_TWIS_EVT_READ_DONE. + uint32_t rx_amount; ///< Data for @ref NRFX_TWIS_EVT_WRITE_DONE. + uint32_t error; ///< Data for @ref NRFX_TWIS_EVT_GENERAL_ERROR. + } data; +} nrfx_twis_evt_t; + +/** + * @brief TWI slave event callback function type. + * + * @param[in] p_event Event information structure. + */ +typedef void (*nrfx_twis_event_handler_t)(nrfx_twis_evt_t const * p_event); + +/** + * @brief Structure for TWIS configuration. + */ +typedef struct +{ + uint32_t addr[2]; //!< Set addresses that this slave should respond. Set 0 to disable. + uint32_t scl; //!< SCL pin number. + uint32_t sda; //!< SDA pin number. + nrf_gpio_pin_pull_t scl_pull; //!< SCL pin pull. + nrf_gpio_pin_pull_t sda_pull; //!< SDA pin pull. + uint8_t interrupt_priority; //!< The priority of interrupt for the module to set. +} nrfx_twis_config_t; + +/** + * @brief Generate default configuration for TWIS driver instance. + */ +#define NRFX_TWIS_DEFAULT_CONFIG \ +{ \ + .addr = { NRFX_TWIS_DEFAULT_CONFIG_ADDR0, \ + NRFX_TWIS_DEFAULT_CONFIG_ADDR1 }, \ + .scl = 31, \ + .scl_pull = (nrf_gpio_pin_pull_t)NRFX_TWIS_DEFAULT_CONFIG_SCL_PULL, \ + .sda = 31, \ + .sda_pull = (nrf_gpio_pin_pull_t)NRFX_TWIS_DEFAULT_CONFIG_SDA_PULL, \ + .interrupt_priority = NRFX_TWIS_DEFAULT_CONFIG_IRQ_PRIORITY \ +} + +/** + * @brief Function for initializing the TWIS driver instance. + * + * Function initializes and enables TWIS driver. + * @attention After driver initialization enable it by @ref nrfx_twis_enable. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @attention @em p_instance has to be global object. + * It would be used by interrupts so make it sure that object + * would not be destroyed when function is leaving. + * @param[in] p_config Pointer to the structure with initial configuration. + * @param[in] event_handler Event handler provided by the user. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If the driver is already initialized. + * @retval NRFX_ERROR_BUSY If some other peripheral with the same + * instance ID is already in use. This is + * possible only if NRFX_PRS_ENABLED + * is set to a value other than zero. + */ +nrfx_err_t nrfx_twis_init(nrfx_twis_t const * p_instance, + nrfx_twis_config_t const * p_config, + nrfx_twis_event_handler_t event_handler); + +/** + * @brief Function for uninitializing the TWIS driver instance. + * + * Function initializes the peripheral and resets all registers to default values. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @note + * It is safe to call nrfx_twis_uninit even before initialization. + * Actually @ref nrfx_twis_init function calls this function to + * make sure that TWIS state is known. + * @note + * If TWIS driver was in uninitialized state before calling this function, + * selected pins would not be reset to default configuration. + */ +void nrfx_twis_uninit(nrfx_twis_t const * p_instance); + +/** + * @brief Enable TWIS instance. + * + * This function enables TWIS instance. + * Function defined if there is needs for dynamically enabling and disabling the peripheral. + * Use @ref nrfx_twis_enable and @ref nrfx_twis_disable functions. + * They do not change any configuration registers. + * + * @param p_instance Pointer to the driver instance structure. + */ +void nrfx_twis_enable(nrfx_twis_t const * p_instance); + +/** + * @brief Disable TWIS instance. + * + * Disabling TWIS instance gives possibility to turn off the TWIS while + * holding configuration done by @ref nrfx_twis_init. + * + * @param p_instance Pointer to the driver instance structure. + */ +void nrfx_twis_disable(nrfx_twis_t const * p_instance); + +/** + * @brief Get and clear last error flags. + * + * Function gets information about errors. + * This is also the only possibility to exit from error substate of the internal state machine. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @return Error flags defined in @ref nrfx_twis_error_t. + * @attention + * This function clears error state and flags. + */ +uint32_t nrfx_twis_error_get_and_clear(nrfx_twis_t const * p_instance); + + +/** + * @brief Prepare data for sending. + * + * This function should be used in response for @ref NRFX_TWIS_EVT_READ_REQ event. + * + * @note Peripherals using EasyDMA (including TWIS) require the transfer buffers + * to be placed in the Data RAM region. If this condition is not met, + * this function will fail with the error code NRFX_ERROR_INVALID_ADDR. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_buf Transmission buffer. + * @attention Transmission buffer has to be placed in RAM. + * @param size Maximum number of bytes that master may read from buffer given. + * + * @retval NRFX_SUCCESS Preparation finished properly. + * @retval NRFX_ERROR_INVALID_ADDR Given @em p_buf is not placed inside the RAM. + * @retval NRFX_ERROR_INVALID_LENGTH Wrong value in @em size parameter. + * @retval NRFX_ERROR_INVALID_STATE Module not initialized or not enabled. + */ +nrfx_err_t nrfx_twis_tx_prepare(nrfx_twis_t const * p_instance, + void const * p_buf, + size_t size); + +/** + * @brief Get number of transmitted bytes. + * + * Function returns number of bytes sent. + * This function may be called after @ref NRFX_TWIS_EVT_READ_DONE or @ref NRFX_TWIS_EVT_READ_ERROR events. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @return Number of bytes sent. + */ +__STATIC_INLINE size_t nrfx_twis_tx_amount(nrfx_twis_t const * p_instance); + +/** + * @brief Prepare data for receiving + * + * This function should be used in response for @ref NRFX_TWIS_EVT_WRITE_REQ event. + * + * @note Peripherals using EasyDMA (including TWIS) require the transfer buffers + * to be placed in the Data RAM region. If this condition is not met, + * this function will fail with the error code NRFX_ERROR_INVALID_ADDR. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_buf Buffer that would be filled with received data. + * @attention Receiving buffer has to be placed in RAM. + * @param size Size of the buffer (maximum amount of data to receive). + * + * @retval NRFX_SUCCESS Preparation finished properly. + * @retval NRFX_ERROR_INVALID_ADDR Given @em p_buf is not placed inside the RAM. + * @retval NRFX_ERROR_INVALID_LENGTH Wrong value in @em size parameter. + * @retval NRFX_ERROR_INVALID_STATE Module not initialized or not enabled. + */ +nrfx_err_t nrfx_twis_rx_prepare(nrfx_twis_t const * p_instance, + void * p_buf, + size_t size); + +/** + * @brief Get number of received bytes. + * + * Function returns number of bytes received. + * This function may be called after @ref NRFX_TWIS_EVT_WRITE_DONE or @ref NRFX_TWIS_EVT_WRITE_ERROR events. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @return Number of bytes received. + */ +__STATIC_INLINE size_t nrfx_twis_rx_amount(nrfx_twis_t const * p_instance); + +/** + * @brief Function checks if driver is busy right now. + * + * Actual driver substate is tested. + * If driver is in any other state than IDLE or ERROR this function returns true. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @retval true Driver is in state other than ERROR or IDLE. + * @retval false There is no transmission pending. + */ +bool nrfx_twis_is_busy(nrfx_twis_t const * p_instance); + +/** + * @brief Function checks if driver is waiting for tx buffer. + * + * If this function returns true, it means that driver is stalled expecting + * of the @ref nrfx_twis_tx_prepare function call. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @retval true Driver waits for @ref nrfx_twis_tx_prepare. + * @retval false Driver is not in the state where it waits for preparing tx buffer. + */ +bool nrfx_twis_is_waiting_tx_buff(nrfx_twis_t const * p_instance); + +/** + * @brief Function checks if driver is waiting for rx buffer. + * + * If this function returns true, it means that driver is staled expecting + * of the @ref nrfx_twis_rx_prepare function call. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @retval true Driver waits for @ref nrfx_twis_rx_prepare. + * @retval false Driver is not in the state where it waits for preparing rx buffer. + */ +bool nrfx_twis_is_waiting_rx_buff(nrfx_twis_t const * p_instance); + +/** + * @brief Check if driver is sending data. + * + * If this function returns true, it means that there is ongoing output transmission. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @retval true There is ongoing output transmission. + * @retval false Driver is in other state. + */ +bool nrfx_twis_is_pending_tx(nrfx_twis_t const * p_instance); + +/** + * @brief Check if driver is receiving data. + * + * If this function returns true, it means that there is ongoing input transmission. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @retval true There is ongoing input transmission. + * @retval false Driver is in other state. + */ +bool nrfx_twis_is_pending_rx(nrfx_twis_t const * p_instance); + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION +__STATIC_INLINE size_t nrfx_twis_tx_amount(nrfx_twis_t const * p_instance) +{ + return nrf_twis_tx_amount_get(p_instance->p_reg); +} + +__STATIC_INLINE size_t nrfx_twis_rx_amount(nrfx_twis_t const * p_instance) +{ + return nrf_twis_rx_amount_get(p_instance->p_reg); +} +#endif // SUPPRESS_INLINE_IMPLEMENTATION + + +void nrfx_twis_0_irq_handler(void); +void nrfx_twis_1_irq_handler(void); + + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_TWIS_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_uart.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_uart.h new file mode 100644 index 0000000000..d55beb7247 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_uart.h @@ -0,0 +1,365 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_UART_H__ +#define NRFX_UART_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_uart UART driver + * @{ + * @ingroup nrf_uart + * @brief UART peripheral driver. + */ + +/** + * @brief UART driver instance data structure. + */ +typedef struct +{ + NRF_UART_Type * p_reg; ///< Pointer to a structure with UART registers. + uint8_t drv_inst_idx; ///< Driver instance index. +} nrfx_uart_t; + +enum { +#if NRFX_CHECK(NRFX_UART0_ENABLED) + NRFX_UART0_INST_IDX, +#endif + NRFX_UART_ENABLED_COUNT +}; + +/** + * @brief Macro for creating a UART driver instance. + */ +#define NRFX_UART_INSTANCE(id) \ +{ \ + .p_reg = NRFX_CONCAT_2(NRF_UART, id), \ + .drv_inst_idx = NRFX_CONCAT_3(NRFX_UART, id, _INST_IDX), \ +} + +/** + * @brief Types of UART driver events. + */ +typedef enum +{ + NRFX_UART_EVT_TX_DONE, ///< Requested TX transfer completed. + NRFX_UART_EVT_RX_DONE, ///< Requested RX transfer completed. + NRFX_UART_EVT_ERROR, ///< Error reported by UART peripheral. +} nrfx_uart_evt_type_t; + +/** + * @brief Structure for UART configuration. + */ +typedef struct +{ + uint32_t pseltxd; ///< TXD pin number. + uint32_t pselrxd; ///< RXD pin number. + uint32_t pselcts; ///< CTS pin number. + uint32_t pselrts; ///< RTS pin number. + void * p_context; ///< Context passed to interrupt handler. + nrf_uart_hwfc_t hwfc; ///< Flow control configuration. + nrf_uart_parity_t parity; ///< Parity configuration. + nrf_uart_baudrate_t baudrate; ///< Baudrate. + uint8_t interrupt_priority; ///< Interrupt priority. +} nrfx_uart_config_t; + +/** + * @brief UART default configuration. + */ +#define NRFX_UART_DEFAULT_CONFIG \ +{ \ + .pseltxd = NRF_UART_PSEL_DISCONNECTED, \ + .pselrxd = NRF_UART_PSEL_DISCONNECTED, \ + .pselcts = NRF_UART_PSEL_DISCONNECTED, \ + .pselrts = NRF_UART_PSEL_DISCONNECTED, \ + .p_context = NULL, \ + .hwfc = (nrf_uart_hwfc_t)NRFX_UART_DEFAULT_CONFIG_HWFC, \ + .parity = (nrf_uart_parity_t)NRFX_UART_DEFAULT_CONFIG_PARITY, \ + .baudrate = (nrf_uart_baudrate_t)NRFX_UART_DEFAULT_CONFIG_BAUDRATE, \ + .interrupt_priority = NRFX_UART_DEFAULT_CONFIG_IRQ_PRIORITY, \ +} + +/** + * @brief Structure for UART transfer completion event. + */ +typedef struct +{ + uint8_t * p_data; ///< Pointer to memory used for transfer. + uint32_t bytes; ///< Number of bytes transfered. +} nrfx_uart_xfer_evt_t; + +/** + * @brief Structure for UART error event. + */ +typedef struct +{ + nrfx_uart_xfer_evt_t rxtx; ///< Transfer details includes number of bytes transferred. + uint32_t error_mask; ///< Mask of error flags that generated the event. +} nrfx_uart_error_evt_t; + +/** + * @brief Structure for UART event. + */ +typedef struct +{ + nrfx_uart_evt_type_t type; ///< Event type. + union + { + nrfx_uart_xfer_evt_t rxtx; ///< Data provided for transfer completion events. + nrfx_uart_error_evt_t error; ///< Data provided for error event. + } data; +} nrfx_uart_event_t; + +/** + * @brief UART interrupt event handler. + * + * @param[in] p_event Pointer to event structure. Event is allocated on the stack so it is available + * only within the context of the event handler. + * @param[in] p_context Context passed to interrupt handler, set on initialization. + */ +typedef void (*nrfx_uart_event_handler_t)(nrfx_uart_event_t const * p_event, + void * p_context); + +/** + * @brief Function for initializing the UART driver. + * + * This function configures and enables UART. After this function GPIO pins are controlled by UART. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_config Pointer to the structure with initial configuration. + * @param[in] event_handler Event handler provided by the user. If not provided driver works in + * blocking mode. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If driver is already initialized. + * @retval NRFX_ERROR_BUSY If some other peripheral with the same + * instance ID is already in use. This is + * possible only if @ref nrfx_prs module + * is enabled. + */ +nrfx_err_t nrfx_uart_init(nrfx_uart_t const * p_instance, + nrfx_uart_config_t const * p_config, + nrfx_uart_event_handler_t event_handler); + +/** + * @brief Function for uninitializing the UART driver. + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_uart_uninit(nrfx_uart_t const * p_instance); + +/** + * @brief Function for getting the address of a specific UART task. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] task Task. + * + * @return Task address. + */ +__STATIC_INLINE uint32_t nrfx_uart_task_address_get(nrfx_uart_t const * p_instance, + nrf_uart_task_t task); + +/** + * @brief Function for getting the address of a specific UART event. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] event Event. + * + * @return Event address. + */ +__STATIC_INLINE uint32_t nrfx_uart_event_address_get(nrfx_uart_t const * p_instance, + nrf_uart_event_t event); + +/** + * @brief Function for sending data over UART. + * + * If an event handler was provided in nrfx_uart_init() call, this function + * returns immediately and the handler is called when the transfer is done. + * Otherwise, the transfer is performed in blocking mode, i.e. this function + * returns when the transfer is finished. Blocking mode is not using interrupt + * so there is no context switching inside the function. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_data Pointer to data. + * @param[in] length Number of bytes to send. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_BUSY If driver is already transferring. + * @retval NRFX_ERROR_FORBIDDEN If the transfer was aborted from a different context + * (blocking mode only). + */ +nrfx_err_t nrfx_uart_tx(nrfx_uart_t const * p_instance, + uint8_t const * p_data, + size_t length); + +/** + * @brief Function for checking if UART is currently transmitting. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @retval true If UART is transmitting. + * @retval false If UART is not transmitting. + */ +bool nrfx_uart_tx_in_progress(nrfx_uart_t const * p_instance); + +/** + * @brief Function for aborting any ongoing transmission. + * @note @ref NRFX_UART_EVT_TX_DONE event will be generated in non-blocking mode. + * It will contain number of bytes sent until abort was called. The event + * handler will be called from the function context. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_uart_tx_abort(nrfx_uart_t const * p_instance); + +/** + * @brief Function for receiving data over UART. + * + * If an event handler was provided in the nrfx_uart_init() call, this function + * returns immediately and the handler is called when the transfer is done. + * Otherwise, the transfer is performed in blocking mode, i.e. this function + * returns when the transfer is finished. Blocking mode is not using interrupt so + * there is no context switching inside the function. + * The receive buffer pointer is double buffered in non-blocking mode. The secondary + * buffer can be set immediately after starting the transfer and will be filled + * when the primary buffer is full. The double buffering feature allows + * receiving data continuously. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_data Pointer to data. + * @param[in] length Number of bytes to receive. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_BUSY If the driver is already receiving + * (and the secondary buffer has already been set + * in non-blocking mode). + * @retval NRFX_ERROR_FORBIDDEN If the transfer was aborted from a different context + * (blocking mode only, also see @ref nrfx_uart_rx_disable). + * @retval NRFX_ERROR_INTERNAL If UART peripheral reported an error. + */ +nrfx_err_t nrfx_uart_rx(nrfx_uart_t const * p_instance, + uint8_t * p_data, + size_t length); + + + +/** + * @brief Function for testing the receiver state in blocking mode. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @retval true If the receiver has at least one byte of data to get. + * @retval false If the receiver is empty. + */ +bool nrfx_uart_rx_ready(nrfx_uart_t const * p_instance); + +/** + * @brief Function for enabling the receiver. + * + * UART has a 6-byte-long RX FIFO and it is used to store incoming data. If a user does not call the + * UART receive function before the FIFO is filled, an overrun error will appear. The receiver must be + * explicitly closed by the user @sa nrfx_uart_rx_disable. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_uart_rx_enable(nrfx_uart_t const * p_instance); + +/** + * @brief Function for disabling the receiver. + * + * This function must be called to close the receiver after it has been explicitly enabled by + * @sa nrfx_uart_rx_enable. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_uart_rx_disable(nrfx_uart_t const * p_instance); + +/** + * @brief Function for aborting any ongoing reception. + * @note @ref NRFX_UART_EVT_TX_DONE event will be generated in non-blocking mode. + * It will contain number of bytes received until abort was called. The event + * handler will be called from the UART interrupt context. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_uart_rx_abort(nrfx_uart_t const * p_instance); + +/** + * @brief Function for reading error source mask. Mask contains values from @ref nrf_uart_error_mask_t. + * @note Function should be used in blocking mode only. In case of non-blocking mode, an error event is + * generated. Function clears error sources after reading. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @retval Mask of reported errors. + */ +uint32_t nrfx_uart_errorsrc_get(nrfx_uart_t const * p_instance); + + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION +__STATIC_INLINE uint32_t nrfx_uart_task_address_get(nrfx_uart_t const * p_instance, + nrf_uart_task_t task) +{ + return nrf_uart_task_address_get(p_instance->p_reg, task); +} + +__STATIC_INLINE uint32_t nrfx_uart_event_address_get(nrfx_uart_t const * p_instance, + nrf_uart_event_t event) +{ + return nrf_uart_event_address_get(p_instance->p_reg, event); +} +#endif // SUPPRESS_INLINE_IMPLEMENTATION + + +void nrfx_uart_0_irq_handler(void); + + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_UART_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_uarte.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_uarte.h new file mode 100644 index 0000000000..e5deec0b53 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_uarte.h @@ -0,0 +1,363 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_UARTE_H__ +#define NRFX_UARTE_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_uarte UARTE driver + * @{ + * @ingroup nrf_uarte + * @brief UARTE peripheral driver. + */ + +/** + * @brief Structure for the UARTE driver instance. + */ +typedef struct +{ + NRF_UARTE_Type * p_reg; ///< Pointer to a structure with UARTE registers. + uint8_t drv_inst_idx; ///< Driver instance index. +} nrfx_uarte_t; + +enum { +#if NRFX_CHECK(NRFX_UARTE0_ENABLED) + NRFX_UARTE0_INST_IDX, +#endif +#if NRFX_CHECK(NRFX_UARTE1_ENABLED) + NRFX_UARTE1_INST_IDX, +#endif + NRFX_UARTE_ENABLED_COUNT +}; + +/** + * @brief Macro for creating a UARTE driver instance. + */ +#define NRFX_UARTE_INSTANCE(id) \ +{ \ + .p_reg = NRFX_CONCAT_2(NRF_UARTE, id), \ + .drv_inst_idx = NRFX_CONCAT_3(NRFX_UARTE, id, _INST_IDX), \ +} + +/** + * @brief Types of UARTE driver events. + */ +typedef enum +{ + NRFX_UARTE_EVT_TX_DONE, ///< Requested TX transfer completed. + NRFX_UARTE_EVT_RX_DONE, ///< Requested RX transfer completed. + NRFX_UARTE_EVT_ERROR, ///< Error reported by UART peripheral. +} nrfx_uarte_evt_type_t; + +/** + * @brief Structure for UARTE configuration. + */ +typedef struct +{ + uint32_t pseltxd; ///< TXD pin number. + uint32_t pselrxd; ///< RXD pin number. + uint32_t pselcts; ///< CTS pin number. + uint32_t pselrts; ///< RTS pin number. + void * p_context; ///< Context passed to interrupt handler. + nrf_uarte_hwfc_t hwfc; ///< Flow control configuration. + nrf_uarte_parity_t parity; ///< Parity configuration. + nrf_uarte_baudrate_t baudrate; ///< Baudrate. + uint8_t interrupt_priority; ///< Interrupt priority. +} nrfx_uarte_config_t; + +/** + * @brief UARTE default configuration. + */ +#define NRFX_UARTE_DEFAULT_CONFIG \ +{ \ + .pseltxd = NRF_UARTE_PSEL_DISCONNECTED, \ + .pselrxd = NRF_UARTE_PSEL_DISCONNECTED, \ + .pselcts = NRF_UARTE_PSEL_DISCONNECTED, \ + .pselrts = NRF_UARTE_PSEL_DISCONNECTED, \ + .p_context = NULL, \ + .hwfc = (nrf_uarte_hwfc_t)NRFX_UARTE_DEFAULT_CONFIG_HWFC, \ + .parity = (nrf_uarte_parity_t)NRFX_UARTE_DEFAULT_CONFIG_PARITY, \ + .baudrate = (nrf_uarte_baudrate_t)NRFX_UARTE_DEFAULT_CONFIG_BAUDRATE, \ + .interrupt_priority = NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY, \ +} + +/** + * @brief Structure for UARTE transfer completion event. + */ +typedef struct +{ + uint8_t * p_data; ///< Pointer to memory used for transfer. + uint8_t bytes; ///< Number of bytes transfered. +} nrfx_uarte_xfer_evt_t; + +/** + * @brief Structure for UARTE error event. + */ +typedef struct +{ + nrfx_uarte_xfer_evt_t rxtx; ///< Transfer details includes number of bytes transferred. + uint32_t error_mask; ///< Mask of error flags that generated the event. +} nrfx_uarte_error_evt_t; + +/** + * @brief Structure for UARTE event. + */ +typedef struct +{ + nrfx_uarte_evt_type_t type; ///< Event type. + union + { + nrfx_uarte_xfer_evt_t rxtx; ///< Data provided for transfer completion events. + nrfx_uarte_error_evt_t error; ///< Data provided for error event. + } data; +} nrfx_uarte_event_t; + +/** + * @brief UARTE interrupt event handler. + * + * @param[in] p_event Pointer to event structure. Event is allocated on the stack so it is available + * only within the context of the event handler. + * @param[in] p_context Context passed to interrupt handler, set on initialization. + */ +typedef void (*nrfx_uarte_event_handler_t)(nrfx_uarte_event_t const * p_event, + void * p_context); + +/** + * @brief Function for initializing the UARTE driver. + * + * This function configures and enables UARTE. After this function GPIO pins are controlled by UARTE. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_config Pointer to the structure with initial configuration. + * @param[in] event_handler Event handler provided by the user. If not provided driver works in + * blocking mode. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_INVALID_STATE If driver is already initialized. + * @retval NRFX_ERROR_BUSY If some other peripheral with the same + * instance ID is already in use. This is + * possible only if @ref nrfx_prs module + * is enabled. + */ +nrfx_err_t nrfx_uarte_init(nrfx_uarte_t const * p_instance, + nrfx_uarte_config_t const * p_config, + nrfx_uarte_event_handler_t event_handler); + +/** + * @brief Function for uninitializing the UARTE driver. + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_uarte_uninit(nrfx_uarte_t const * p_instance); + +/** + * @brief Function for getting the address of a specific UARTE task. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] task Task. + * + * @return Task address. + */ +__STATIC_INLINE uint32_t nrfx_uarte_task_address_get(nrfx_uarte_t const * p_instance, + nrf_uarte_task_t task); + +/** + * @brief Function for getting the address of a specific UARTE event. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] event Event. + * + * @return Event address. + */ +__STATIC_INLINE uint32_t nrfx_uarte_event_address_get(nrfx_uarte_t const * p_instance, + nrf_uarte_event_t event); + +/** + * @brief Function for sending data over UARTE. + * + * If an event handler was provided in nrfx_uarte_init() call, this function + * returns immediately and the handler is called when the transfer is done. + * Otherwise, the transfer is performed in blocking mode, i.e. this function + * returns when the transfer is finished. Blocking mode is not using interrupt + * so there is no context switching inside the function. + * + * @note Peripherals using EasyDMA (including UARTE) require the transfer buffers + * to be placed in the Data RAM region. If this condition is not met, + * this function will fail with the error code NRFX_ERROR_INVALID_ADDR. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_data Pointer to data. + * @param[in] length Number of bytes to send. Maximum possible length is + * dependent on the used SoC (see the MAXCNT register + * description in the Product Specification). The driver + * checks it with assertion. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_BUSY If driver is already transferring. + * @retval NRFX_ERROR_FORBIDDEN If the transfer was aborted from a different context + * (blocking mode only). + * @retval NRFX_ERROR_INVALID_ADDR If p_data does not point to RAM buffer. + */ +nrfx_err_t nrfx_uarte_tx(nrfx_uarte_t const * p_instance, + uint8_t const * p_data, + size_t length); + +/** + * @brief Function for checking if UARTE is currently transmitting. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @retval true If UARTE is transmitting. + * @retval false If UARTE is not transmitting. + */ +bool nrfx_uarte_tx_in_progress(nrfx_uarte_t const * p_instance); + +/** + * @brief Function for aborting any ongoing transmission. + * @note @ref NRFX_UARTE_EVT_TX_DONE event will be generated in non-blocking mode. + * It will contain number of bytes sent until abort was called. The event + * handler will be called from UARTE interrupt context. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_uarte_tx_abort(nrfx_uarte_t const * p_instance); + +/** + * @brief Function for receiving data over UARTE. + * + * If an event handler was provided in the nrfx_uarte_init() call, this function + * returns immediately and the handler is called when the transfer is done. + * Otherwise, the transfer is performed in blocking mode, i.e. this function + * returns when the transfer is finished. Blocking mode is not using interrupt so + * there is no context switching inside the function. + * The receive buffer pointer is double buffered in non-blocking mode. The secondary + * buffer can be set immediately after starting the transfer and will be filled + * when the primary buffer is full. The double buffering feature allows + * receiving data continuously. + * + * @note Peripherals using EasyDMA (including UARTE) require the transfer buffers + * to be placed in the Data RAM region. If this condition is not met, + * this function will fail with the error code NRFX_ERROR_INVALID_ADDR. + * + * @param[in] p_instance Pointer to the driver instance structure. + * @param[in] p_data Pointer to data. + * @param[in] length Number of bytes to receive. Maximum possible length is + * dependent on the used SoC (see the MAXCNT register + * description in the Product Specification). The driver + * checks it with assertion. + * + * @retval NRFX_SUCCESS If initialization was successful. + * @retval NRFX_ERROR_BUSY If the driver is already receiving + * (and the secondary buffer has already been set + * in non-blocking mode). + * @retval NRFX_ERROR_FORBIDDEN If the transfer was aborted from a different context + * (blocking mode only). + * @retval NRFX_ERROR_INTERNAL If UARTE peripheral reported an error. + * @retval NRFX_ERROR_INVALID_ADDR If p_data does not point to RAM buffer. + */ +nrfx_err_t nrfx_uarte_rx(nrfx_uarte_t const * p_instance, + uint8_t * p_data, + size_t length); + + + +/** + * @brief Function for testing the receiver state in blocking mode. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @retval true If the receiver has at least one byte of data to get. + * @retval false If the receiver is empty. + */ +bool nrfx_uarte_rx_ready(nrfx_uarte_t const * p_instance); + +/** + * @brief Function for aborting any ongoing reception. + * @note @ref NRFX_UARTE_EVT_RX_DONE event will be generated in non-blocking mode. + * It will contain number of bytes received until abort was called. The event + * handler will be called from UARTE interrupt context. + * + * @param[in] p_instance Pointer to the driver instance structure. + */ +void nrfx_uarte_rx_abort(nrfx_uarte_t const * p_instance); + +/** + * @brief Function for reading error source mask. Mask contains values from @ref nrf_uarte_error_mask_t. + * @note Function should be used in blocking mode only. In case of non-blocking mode, an error event is + * generated. Function clears error sources after reading. + * + * @param[in] p_instance Pointer to the driver instance structure. + * + * @retval Mask of reported errors. + */ +uint32_t nrfx_uarte_errorsrc_get(nrfx_uarte_t const * p_instance); + + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION +__STATIC_INLINE uint32_t nrfx_uarte_task_address_get(nrfx_uarte_t const * p_instance, + nrf_uarte_task_t task) +{ + return nrf_uarte_task_address_get(p_instance->p_reg, task); +} + +__STATIC_INLINE uint32_t nrfx_uarte_event_address_get(nrfx_uarte_t const * p_instance, + nrf_uarte_event_t event) +{ + return nrf_uarte_event_address_get(p_instance->p_reg, event); +} +#endif // SUPPRESS_INLINE_IMPLEMENTATION + + +void nrfx_uarte_0_irq_handler(void); +void nrfx_uarte_1_irq_handler(void); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_UARTE_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/wdt/nrf_drv_wdt.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_wdt.h similarity index 65% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/wdt/nrf_drv_wdt.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_wdt.h index 4fdd1d9cbb..be98a3853a 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/wdt/nrf_drv_wdt.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/include/nrfx_wdt.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,75 +37,66 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/**@file - * @addtogroup nrf_wdt WDT HAL and driver - * @ingroup nrf_drivers - * @brief Watchdog timer (WDT) APIs. - * @details The WDT HAL provides basic APIs for accessing the registers of the watchdog timer. - * The WDT driver provides APIs on a higher level. - * @defgroup nrf_drv_wdt WDT driver - * @{ - * @ingroup nrf_wdt - * - * @brief Driver for managing the watchdog timer (WDT). - */ -#ifndef NRF_DRV_WDT_H__ -#define NRF_DRV_WDT_H__ +#ifndef NRFX_WDT_H__ +#define NRFX_WDT_H__ -#include -#include -#include "sdk_errors.h" -#include "nrf_wdt.h" -#include "sdk_config.h" +#include +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrfx_wdt WDT driver + * @{ + * @ingroup nrf_wdt + * @brief Watchdog Timer (WDT) peripheral driver. + */ + /**@brief Struct for WDT initialization. */ typedef struct { nrf_wdt_behaviour_t behaviour; /**< WDT behaviour when CPU in sleep/halt mode. */ uint32_t reload_value; /**< WDT reload value in ms. */ uint8_t interrupt_priority; /**< WDT interrupt priority */ -} nrf_drv_wdt_config_t; +} nrfx_wdt_config_t; /**@brief WDT event handler function type. */ -typedef void (*nrf_wdt_event_handler_t)(void); +typedef void (*nrfx_wdt_event_handler_t)(void); /**@brief WDT channel id type. */ -typedef nrf_wdt_rr_register_t nrf_drv_wdt_channel_id; +typedef nrf_wdt_rr_register_t nrfx_wdt_channel_id; -#define NRF_DRV_WDT_DEAFULT_CONFIG \ - { \ - .behaviour = (nrf_wdt_behaviour_t)WDT_CONFIG_BEHAVIOUR, \ - .reload_value = WDT_CONFIG_RELOAD_VALUE, \ - .interrupt_priority = WDT_CONFIG_IRQ_PRIORITY, \ +#define NRFX_WDT_DEAFULT_CONFIG \ + { \ + .behaviour = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \ + .reload_value = NRFX_WDT_CONFIG_RELOAD_VALUE, \ + .interrupt_priority = NRFX_WDT_CONFIG_IRQ_PRIORITY, \ } /** * @brief This function initializes watchdog. * - * @param[in] p_config Initial configuration. Default configuration used if NULL. - * @param[in] wdt_event_handler specifies event handler provided by user. + * @param[in] p_config Pointer to the structure with initial configuration. + * @param[in] wdt_event_handler Event handler provided by the user. + * Must not be NULL. * - * @note Function asserts if wdt_event_handler is NULL. - * - * @return NRF_SUCCESS on success, otherwise an error code. + * @return NRFX_SUCCESS on success, otherwise an error code. */ -ret_code_t nrf_drv_wdt_init(nrf_drv_wdt_config_t const * p_config, - nrf_wdt_event_handler_t wdt_event_handler); +nrfx_err_t nrfx_wdt_init(nrfx_wdt_config_t const * p_config, + nrfx_wdt_event_handler_t wdt_event_handler); /** * @brief This function allocate watchdog channel. * - * @note This function can not be called after nrf_drv_wdt_start(void). + * @note This function can not be called after nrfx_wdt_start(void). * * @param[out] p_channel_id ID of granted channel. * - * @return NRF_SUCCESS on success, otherwise an error code. + * @return NRFX_SUCCESS on success, otherwise an error code. */ -ret_code_t nrf_drv_wdt_channel_alloc(nrf_drv_wdt_channel_id * p_channel_id); +nrfx_err_t nrfx_wdt_channel_alloc(nrfx_wdt_channel_id * p_channel_id); /** * @brief This function starts watchdog. @@ -113,21 +104,21 @@ ret_code_t nrf_drv_wdt_channel_alloc(nrf_drv_wdt_channel_id * p_channel_id); * @note After calling this function the watchdog is started, so the user needs to feed all allocated * watchdog channels to avoid reset. At least one watchdog channel has to be allocated. */ -void nrf_drv_wdt_enable(void); +void nrfx_wdt_enable(void); /** * @brief This function feeds the watchdog. * * @details Function feeds all allocated watchdog channels. */ -void nrf_drv_wdt_feed(void); +void nrfx_wdt_feed(void); /** * @brief This function feeds the invidual watchdog channel. * * @param[in] channel_id ID of watchdog channel. */ -void nrf_drv_wdt_channel_feed(nrf_drv_wdt_channel_id channel_id); +void nrfx_wdt_channel_feed(nrfx_wdt_channel_id channel_id); /**@brief Function for returning a requested task address for the wdt driver module. * @@ -135,7 +126,7 @@ void nrf_drv_wdt_channel_feed(nrf_drv_wdt_channel_id channel_id); * * @retval Task address. */ -__STATIC_INLINE uint32_t nrf_drv_wdt_ppi_task_addr(nrf_wdt_task_t task) +__STATIC_INLINE uint32_t nrfx_wdt_ppi_task_addr(nrf_wdt_task_t task) { return nrf_wdt_task_address_get(task); } @@ -146,15 +137,20 @@ __STATIC_INLINE uint32_t nrf_drv_wdt_ppi_task_addr(nrf_wdt_task_t task) * * @retval Event address */ -__STATIC_INLINE uint32_t nrf_drv_wdt_ppi_event_addr(nrf_wdt_event_t event) +__STATIC_INLINE uint32_t nrfx_wdt_ppi_event_addr(nrf_wdt_event_t event) { return nrf_wdt_event_address_get(event); } + +void nrfx_wdt_irq_handler(void); + + +/** @} */ + #ifdef __cplusplus } #endif #endif -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/nrfx_common.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/nrfx_common.h new file mode 100644 index 0000000000..3204f7ca1a --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/nrfx_common.h @@ -0,0 +1,269 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_COMMON_H__ +#define NRFX_COMMON_H__ + +#include +#include +#include + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_common Common module + * @{ + * @ingroup nrfx + * @brief Common module. + */ + +/** + * @brief Macro for checking if the specified identifier is defined and it has + * a non-zero value. + * + * Normally, preprocessors treat all undefined identifiers as having the value + * zero. However, some tools, like static code analyzers, may issue a warning + * when such identifier is evaluated. This macro gives the possibility to suppress + * such warnings only in places where this macro is used for evaluation, not in + * the whole analyzed code. + */ +#define NRFX_CHECK(module_enabled) (module_enabled) + +/** + * @brief Macro for concatenating two tokens in macro expansion. + * + * @note This macro is expanded in two steps so that tokens given as macros + * themselves are fully expanded before they are merged. + * + * @param p1 First token. + * @param p2 Second token. + * + * @return The two tokens merged into one, unless they cannot together form + * a valid token (in such case, the preprocessor issues a warning and + * does not perform the concatenation). + * + * @sa NRFX_CONCAT_3 + */ +#define NRFX_CONCAT_2(p1, p2) NRFX_CONCAT_2_(p1, p2) +/** + * @brief Internal macro used by @ref NRFX_CONCAT_2 to perform the expansion + * in two steps. + */ +#define NRFX_CONCAT_2_(p1, p2) p1 ## p2 + +/** + * @brief Macro for concatenating three tokens in macro expansion. + * + * @note This macro is expanded in two steps so that tokens given as macros + * themselves are fully expanded before they are merged. + * + * @param p1 First token. + * @param p2 Second token. + * @param p3 Third token. + * + * @return The three tokens merged into one, unless they cannot together form + * a valid token (in such case, the preprocessor issues a warning and + * does not perform the concatenation). + * + * @sa NRFX_CONCAT_2 + */ +#define NRFX_CONCAT_3(p1, p2, p3) NRFX_CONCAT_3_(p1, p2, p3) +/** + * @brief Internal macro used by @ref NRFX_CONCAT_3 to perform the expansion + * in two steps. + */ +#define NRFX_CONCAT_3_(p1, p2, p3) p1 ## p2 ## p3 + +/**@brief Macro for performing rounded integer division (as opposed to + * truncating the result). + * + * @param a Numerator. + * @param b Denominator. + * + * @return Rounded (integer) result of dividing @c a by @c b. + */ +#define NRFX_ROUNDED_DIV(a, b) (((a) + ((b) / 2)) / (b)) + +/**@brief Macro for checking if given lengths of EasyDMA transfers do not exceed + * the limit of the specified peripheral. + * + * @param peripheral Peripheral to check the lengths against. + * @param length1 First length to be checked. + * @param length2 Second length to be checked (pass 0 if not needed). + * + * @return + */ +#define NRFX_EASYDMA_LENGTH_VALIDATE(peripheral, length1, length2) \ + (((length1) < (1U << NRFX_CONCAT_2(peripheral, _EASYDMA_MAXCNT_SIZE))) && \ + ((length2) < (1U << NRFX_CONCAT_2(peripheral, _EASYDMA_MAXCNT_SIZE)))) + +/**@brief Macro for waiting until condition is met. + * + * @param[in] condition Condition to meet. + * @param[in] attempts Maximum number of condition checks. Must not be 0. + * @param[in] delay_us Delay between consecutive checks, in microseconds. + * @param[out] result Boolean variable to store the result of the wait process. + * Set to true if the condition is met or false otherwise. + */ +#define NRFX_WAIT_FOR(condition, attempts, delay_us, result) \ +do { \ + result = false; \ + uint32_t remaining_attempts = (attempts); \ + do { \ + if (condition) \ + { \ + result = true; \ + break; \ + } \ + NRFX_DELAY_US(delay_us); \ + } while (--remaining_attempts); \ +} while(0) + +/** + * @brief IRQ handler type. + */ +typedef void (* nrfx_irq_handler_t)(void); + +/** + * @brief Driver state. + */ +typedef enum +{ + NRFX_DRV_STATE_UNINITIALIZED, ///< Uninitialized. + NRFX_DRV_STATE_INITIALIZED, ///< Initialized but powered off. + NRFX_DRV_STATE_POWERED_ON, ///< Initialized and powered on. +} nrfx_drv_state_t; + + +/** + * @brief Function for checking if an object is placed in the Data RAM region. + * + * Several peripherals (the ones using EasyDMA) require the transfer buffers + * to be placed in the Data RAM region. This function can be used to check if + * this condition is met. + * + * @param[in] p_object Pointer to an object whose location is to be checked. + * + * @retval true If the pointed object is located in the Data RAM region. + * @retval false Otherwise. + */ +__STATIC_INLINE bool nrfx_is_in_ram(void const * p_object); + +/** + * @brief Function for getting the interrupt number for a specific peripheral. + * + * @param[in] p_reg Peripheral base pointer. + * + * @return Interrupt number associated with the pointed peripheral. + */ +__STATIC_INLINE IRQn_Type nrfx_get_irq_number(void const * p_reg); + +/** + * @brief Function for converting an INTEN register bit position to the + * corresponding event identifier. + * + * The event identifier is the offset between the event register address and + * the peripheral base address, and is equal (thus, can be directly cast) to + * the corresponding value of the enumerated type from HAL (nrf_*_event_t). + + * @param bit INTEN register bit position. + * + * @return Event identifier. + * + * @sa nrfx_event_to_bitpos + */ +__STATIC_INLINE uint32_t nrfx_bitpos_to_event(uint32_t bit); + +/** + * @brief Function for converting an event identifier to the corresponding + * INTEN register bit position. + * + * The event identifier is the offset between the event register address and + * the peripheral base address, and is equal (thus, can be directly cast) to + * the corresponding value of the enumerated type from HAL (nrf_*_event_t). + * + * @param event Event identifier. + * + * @return INTEN register bit position. + * + * @sa nrfx_bitpos_to_event + */ +__STATIC_INLINE uint32_t nrfx_event_to_bitpos(uint32_t event); + + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION + +__STATIC_INLINE bool nrfx_is_in_ram(void const * p_object) +{ + return ((((uint32_t)p_object) & 0xE0000000u) == 0x20000000u); +} + +__STATIC_INLINE IRQn_Type nrfx_get_irq_number(void const * p_reg) +{ + uint8_t irq_number = (uint8_t)(((uint32_t)p_reg) >> 12u); + return (IRQn_Type)irq_number; +} + +__STATIC_INLINE uint32_t nrfx_bitpos_to_event(uint32_t bit) +{ + static const uint32_t event_reg_offset = 0x100u; + return event_reg_offset + (bit * sizeof(uint32_t)); +} + +__STATIC_INLINE uint32_t nrfx_event_to_bitpos(uint32_t event) +{ + static const uint32_t event_reg_offset = 0x100u; + return (event - event_reg_offset) / sizeof(uint32_t); +} + +#endif + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_COMMON_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/nrfx_errors.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/nrfx_errors.h new file mode 100644 index 0000000000..f900be8110 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/nrfx_errors.h @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_ERRORS_H__ +#define NRFX_ERRORS_H__ + +#if !NRFX_CHECK(NRFX_CUSTOM_ERROR_CODES) + +/** + * @defgroup nrfx_error_codes Global Error Codes + * @{ + * @ingroup nrfx + * + * @brief Global error codes definitions. + */ + +#define NRFX_ERROR_BASE_NUM 0x0BAD0000 +#define NRFX_ERROR_DRIVERS_BASE_NUM (NRFX_ERROR_BASE_NUM + 0x10000) + +/** @brief Enumerated type for error codes. */ +typedef enum { + NRFX_SUCCESS = (NRFX_ERROR_BASE_NUM + 0), ///< Operation performed successfully. + NRFX_ERROR_INTERNAL = (NRFX_ERROR_BASE_NUM + 1), ///< Internal error. + NRFX_ERROR_NO_MEM = (NRFX_ERROR_BASE_NUM + 2), ///< No memory for operation. + NRFX_ERROR_NOT_SUPPORTED = (NRFX_ERROR_BASE_NUM + 3), ///< Not supported. + NRFX_ERROR_INVALID_PARAM = (NRFX_ERROR_BASE_NUM + 4), ///< Invalid parameter. + NRFX_ERROR_INVALID_STATE = (NRFX_ERROR_BASE_NUM + 5), ///< Invalid state, operation disallowed in this state. + NRFX_ERROR_INVALID_LENGTH = (NRFX_ERROR_BASE_NUM + 6), ///< Invalid length. + NRFX_ERROR_TIMEOUT = (NRFX_ERROR_BASE_NUM + 7), ///< Operation timed out. + NRFX_ERROR_FORBIDDEN = (NRFX_ERROR_BASE_NUM + 8), ///< Operation is forbidden. + NRFX_ERROR_NULL = (NRFX_ERROR_BASE_NUM + 9), ///< Null pointer. + NRFX_ERROR_INVALID_ADDR = (NRFX_ERROR_BASE_NUM + 10), ///< Bad memory address. + NRFX_ERROR_BUSY = (NRFX_ERROR_BASE_NUM + 11), ///< Busy. + NRFX_ERROR_ALREADY_INITIALIZED = (NRFX_ERROR_BASE_NUM + 12), ///< Module already initialized. + + NRFX_ERROR_DRV_TWI_ERR_OVERRUN = (NRFX_ERROR_DRIVERS_BASE_NUM + 0), ///< TWI error: Overrun. + NRFX_ERROR_DRV_TWI_ERR_ANACK = (NRFX_ERROR_DRIVERS_BASE_NUM + 1), ///< TWI error: Address not acknowledged. + NRFX_ERROR_DRV_TWI_ERR_DNACK = (NRFX_ERROR_DRIVERS_BASE_NUM + 2) ///< TWI error: Data not acknowledged. +} nrfx_err_t; + +/** @} */ + +#endif // !NRFX_CHECK(NRFX_CUSTOM_ERROR_CODES) + +#endif // NRFX_ERRORS_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_adc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_adc.c new file mode 100644 index 0000000000..cbe51facda --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_adc.c @@ -0,0 +1,324 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_ADC_ENABLED) + +#include + +#define NRFX_LOG_MODULE ADC +#include + +#define EVT_TO_STR(event) (event == NRF_ADC_EVENT_END ? "NRF_ADC_EVENT_END" : "UNKNOWN EVENT") + +typedef struct +{ + nrfx_adc_event_handler_t event_handler; + nrfx_adc_channel_t * p_head; + nrfx_adc_channel_t * p_current_conv; + nrf_adc_value_t * p_buffer; + uint16_t size; + uint16_t idx; + nrfx_drv_state_t state; +} adc_cb_t; + +static adc_cb_t m_cb; + +nrfx_err_t nrfx_adc_init(nrfx_adc_config_t const * p_config, + nrfx_adc_event_handler_t event_handler) +{ + NRFX_ASSERT(p_config); + nrfx_err_t err_code; + + if (m_cb.state != NRFX_DRV_STATE_UNINITIALIZED) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + nrf_adc_event_clear(NRF_ADC_EVENT_END); + if (event_handler) + { + NRFX_IRQ_PRIORITY_SET(ADC_IRQn, p_config->interrupt_priority); + NRFX_IRQ_ENABLE(ADC_IRQn); + } + m_cb.event_handler = event_handler; + m_cb.state = NRFX_DRV_STATE_INITIALIZED; + + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +void nrfx_adc_uninit(void) +{ + m_cb.p_head = NULL; + NRFX_IRQ_DISABLE(ADC_IRQn); + nrf_adc_int_disable(NRF_ADC_INT_END_MASK); + nrf_adc_task_trigger(NRF_ADC_TASK_STOP); + + m_cb.state = NRFX_DRV_STATE_UNINITIALIZED; +} + +void nrfx_adc_channel_enable(nrfx_adc_channel_t * const p_channel) +{ + NRFX_ASSERT(!nrfx_adc_is_busy()); + + p_channel->p_next = NULL; + if (m_cb.p_head == NULL) + { + m_cb.p_head = p_channel; + } + else + { + nrfx_adc_channel_t * p_curr_channel = m_cb.p_head; + while (p_curr_channel->p_next != NULL) + { + NRFX_ASSERT(p_channel != p_curr_channel); + p_curr_channel = p_curr_channel->p_next; + } + p_curr_channel->p_next = p_channel; + } + + NRFX_LOG_INFO("Enabled."); +} + +void nrfx_adc_channel_disable(nrfx_adc_channel_t * const p_channel) +{ + NRFX_ASSERT(m_cb.p_head); + NRFX_ASSERT(!nrfx_adc_is_busy()); + + nrfx_adc_channel_t * p_curr_channel = m_cb.p_head; + nrfx_adc_channel_t * p_prev_channel = NULL; + while (p_curr_channel != p_channel) + { + p_prev_channel = p_curr_channel; + p_curr_channel = p_curr_channel->p_next; + NRFX_ASSERT(p_curr_channel != NULL); + } + if (p_prev_channel) + { + p_prev_channel->p_next = p_curr_channel->p_next; + } + else + { + m_cb.p_head = p_curr_channel->p_next; + } + + NRFX_LOG_INFO("Disabled."); +} + +void nrfx_adc_sample(void) +{ + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(!nrf_adc_busy_check()); + nrf_adc_task_trigger(NRF_ADC_TASK_START); +} + +nrfx_err_t nrfx_adc_sample_convert(nrfx_adc_channel_t const * const p_channel, + nrf_adc_value_t * p_value) +{ + nrfx_err_t err_code; + + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); + if (m_cb.state == NRFX_DRV_STATE_POWERED_ON) + { + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + else + { + m_cb.state = NRFX_DRV_STATE_POWERED_ON; + + nrf_adc_init(&p_channel->config); + nrf_adc_enable(); + nrf_adc_int_disable(NRF_ADC_INT_END_MASK); + nrf_adc_task_trigger(NRF_ADC_TASK_START); + if (p_value) + { + while (!nrf_adc_event_check(NRF_ADC_EVENT_END)) {} + nrf_adc_event_clear(NRF_ADC_EVENT_END); + *p_value = (nrf_adc_value_t)nrf_adc_result_get(); + nrf_adc_disable(); + + m_cb.state = NRFX_DRV_STATE_INITIALIZED; + } + else + { + NRFX_ASSERT(m_cb.event_handler); + m_cb.p_buffer = NULL; + nrf_adc_int_enable(NRF_ADC_INT_END_MASK); + } + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } +} + +static bool adc_sample_process() +{ + nrf_adc_event_clear(NRF_ADC_EVENT_END); + nrf_adc_disable(); + m_cb.p_buffer[m_cb.idx] = (nrf_adc_value_t)nrf_adc_result_get(); + m_cb.idx++; + if (m_cb.idx < m_cb.size) + { + bool task_trigger = false; + if (m_cb.p_current_conv->p_next == NULL) + { + m_cb.p_current_conv = m_cb.p_head; + } + else + { + m_cb.p_current_conv = m_cb.p_current_conv->p_next; + task_trigger = true; + } + nrf_adc_init(&m_cb.p_current_conv->config); + nrf_adc_enable(); + if (task_trigger) + { + nrf_adc_task_trigger(NRF_ADC_TASK_START); + } + return false; + } + else + { + return true; + } +} + +nrfx_err_t nrfx_adc_buffer_convert(nrf_adc_value_t * buffer, uint16_t size) +{ + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); + + nrfx_err_t err_code; + + NRFX_LOG_INFO("Number of samples requested to convert: %d.", size); + + if (m_cb.state == NRFX_DRV_STATE_POWERED_ON) + { + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + else + { + m_cb.state = NRFX_DRV_STATE_POWERED_ON; + m_cb.p_current_conv = m_cb.p_head; + m_cb.size = size; + m_cb.idx = 0; + m_cb.p_buffer = buffer; + nrf_adc_init(&m_cb.p_current_conv->config); + nrf_adc_event_clear(NRF_ADC_EVENT_END); + nrf_adc_enable(); + if (m_cb.event_handler) + { + nrf_adc_int_enable(NRF_ADC_INT_END_MASK); + } + else + { + while (1) + { + while (!nrf_adc_event_check(NRF_ADC_EVENT_END)){} + + if (adc_sample_process()) + { + m_cb.state = NRFX_DRV_STATE_INITIALIZED; + break; + } + } + } + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } +} + +bool nrfx_adc_is_busy(void) +{ + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); + return (m_cb.state == NRFX_DRV_STATE_POWERED_ON) ? true : false; +} + +void nrfx_adc_irq_handler(void) +{ + if (m_cb.p_buffer == NULL) + { + nrf_adc_event_clear(NRF_ADC_EVENT_END); + NRFX_LOG_DEBUG("Event: %s.",NRFX_LOG_ERROR_STRING_GET(NRF_ADC_EVENT_END)); + nrf_adc_int_disable(NRF_ADC_INT_END_MASK); + nrf_adc_disable(); + nrfx_adc_evt_t evt; + evt.type = NRFX_ADC_EVT_SAMPLE; + evt.data.sample.sample = (nrf_adc_value_t)nrf_adc_result_get(); + NRFX_LOG_DEBUG("ADC data:"); + NRFX_LOG_HEXDUMP_DEBUG((uint8_t *)(&evt.data.sample.sample), sizeof(nrf_adc_value_t)); + m_cb.state = NRFX_DRV_STATE_INITIALIZED; + m_cb.event_handler(&evt); + } + else if (adc_sample_process()) + { + NRFX_LOG_DEBUG("Event: %s.", NRFX_LOG_ERROR_STRING_GET(NRF_ADC_EVENT_END)); + nrf_adc_int_disable(NRF_ADC_INT_END_MASK); + nrfx_adc_evt_t evt; + evt.type = NRFX_ADC_EVT_DONE; + evt.data.done.p_buffer = m_cb.p_buffer; + evt.data.done.size = m_cb.size; + m_cb.state = NRFX_DRV_STATE_INITIALIZED; + NRFX_LOG_DEBUG("ADC data:"); + NRFX_LOG_HEXDUMP_DEBUG((uint8_t *)m_cb.p_buffer, m_cb.size * sizeof(nrf_adc_value_t)); + m_cb.event_handler(&evt); + } +} + +#endif // NRFX_CHECK(NRFX_ADC_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_clock.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_clock.c new file mode 100644 index 0000000000..8e1d14e9a0 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_clock.c @@ -0,0 +1,381 @@ +/** + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_CLOCK_ENABLED) + +#include + +#define NRFX_LOG_MODULE CLOCK +#include + +#if NRFX_CHECK(NRFX_POWER_ENABLED) +extern bool nrfx_power_irq_enabled; +#endif + +#define EVT_TO_STR(event) \ + (event == NRF_CLOCK_EVENT_HFCLKSTARTED ? "NRF_CLOCK_EVENT_HFCLKSTARTED" : \ + (event == NRF_CLOCK_EVENT_LFCLKSTARTED ? "NRF_CLOCK_EVENT_LFCLKSTARTED" : \ + (event == NRF_CLOCK_EVENT_DONE ? "NRF_CLOCK_EVENT_DONE" : \ + (event == NRF_CLOCK_EVENT_CTTO ? "NRF_CLOCK_EVENT_CTTO" : \ + "UNKNOWN EVENT")))) + + +/*lint -save -e652 */ +#define NRF_CLOCK_LFCLK_RC CLOCK_LFCLKSRC_SRC_RC +#define NRF_CLOCK_LFCLK_Xtal CLOCK_LFCLKSRC_SRC_Xtal +#define NRF_CLOCK_LFCLK_Synth CLOCK_LFCLKSRC_SRC_Synth +/*lint -restore */ + +#if (NRFX_CLOCK_CONFIG_LF_SRC == NRF_CLOCK_LFCLK_RC) +#define CALIBRATION_SUPPORT 1 +#else +#define CALIBRATION_SUPPORT 0 +#endif + +#if defined(NRF52810_XXAA) || \ + defined(NRF52832_XXAA) || defined(NRF52832_XXAB) || \ + defined(NRF52840_XXAA) +// Enable workaround for nRF52 anomaly 192 (LFRC oscillator frequency is wrong +// after calibration, exceeding 500 ppm). +#define USE_WORKAROUND_FOR_ANOMALY_192 + +// Enable workaround for nRF52 anomaly 201 (EVENTS_HFCLKSTARTED might be generated twice). +#define USE_WORKAROUND_FOR_ANOMALY_201 +#endif + +typedef enum +{ + CAL_STATE_IDLE, + CAL_STATE_CAL +} nrfx_clock_cal_state_t; + +/**@brief CLOCK control block. */ +typedef struct +{ + nrfx_clock_event_handler_t event_handler; + bool module_initialized; /*< Indicate the state of module */ +#if defined(USE_WORKAROUND_FOR_ANOMALY_201) + bool hfclk_started; /*< Anomaly 201 workaround. */ +#endif + +#if CALIBRATION_SUPPORT + volatile nrfx_clock_cal_state_t cal_state; +#endif // CALIBRATION_SUPPORT +} nrfx_clock_cb_t; + +static nrfx_clock_cb_t m_clock_cb; + +/** + * This variable is used to check whether common POWER_CLOCK common interrupt + * should be disabled or not if @ref nrfx_power tries to disable the interrupt. + */ +#if NRFX_CHECK(NRFX_POWER_ENABLED) +bool nrfx_clock_irq_enabled; +#endif + +#if defined(NRF52832_XXAA) || defined(NRF52832_XXAB) + +// ANOMALY 132 - LFCLK needs to avoid frame from 66us to 138us after LFCLK stop. This solution +// applies delay of 138us before starting LFCLK. +#define ANOMALY_132_REQ_DELAY_US 138UL + +// nRF52832 is clocked with 64MHz. +#define ANOMALY_132_NRF52832_FREQ_MHZ 64UL + +// Convert time to cycles. +#define ANOMALY_132_DELAY_CYCLES (ANOMALY_132_REQ_DELAY_US * ANOMALY_132_NRF52832_FREQ_MHZ) + +/** + * @brief Function for applying delay of 138us before starting LFCLK. + */ +static void nrfx_clock_anomaly_132(void) +{ + uint32_t cyccnt_inital; + uint32_t core_debug; + uint32_t dwt_ctrl; + + // Preserve DEMCR register to do not influence into its configuration. Enable the trace and + // debug blocks. It is required to read and write data to DWT block. + core_debug = CoreDebug->DEMCR; + CoreDebug->DEMCR = core_debug | CoreDebug_DEMCR_TRCENA_Msk; + + // Preserve CTRL register in DWT block to do not influence into its configuration. Make sure + // that cycle counter is enabled. + dwt_ctrl = DWT->CTRL; + DWT->CTRL = dwt_ctrl | DWT_CTRL_CYCCNTENA_Msk; + + // Store start value of cycle counter. + cyccnt_inital = DWT->CYCCNT; + + // Delay required time. + while ((DWT->CYCCNT - cyccnt_inital) < ANOMALY_132_DELAY_CYCLES) + {} + + // Restore preserved registers. + DWT->CTRL = dwt_ctrl; + CoreDebug->DEMCR = core_debug; +} + +#endif // defined(NRF52832_XXAA) || defined(NRF52832_XXAB) + +nrfx_err_t nrfx_clock_init(nrfx_clock_event_handler_t event_handler) +{ + NRFX_ASSERT(event_handler); + + nrfx_err_t err_code = NRFX_SUCCESS; + if (m_clock_cb.module_initialized) + { + err_code = NRFX_ERROR_ALREADY_INITIALIZED; + } + else + { +#if CALIBRATION_SUPPORT + m_clock_cb.cal_state = CAL_STATE_IDLE; +#endif + m_clock_cb.event_handler = event_handler; + m_clock_cb.module_initialized = true; +#if defined(USE_WORKAROUND_FOR_ANOMALY_201) + m_clock_cb.hfclk_started = false; +#endif + } + + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +void nrfx_clock_enable(void) +{ + NRFX_ASSERT(m_clock_cb.module_initialized); + nrfx_power_clock_irq_init(); + nrf_clock_lf_src_set((nrf_clock_lfclk_t)NRFX_CLOCK_CONFIG_LF_SRC); + +#if NRFX_CHECK(NRFX_POWER_ENABLED) + nrfx_clock_irq_enabled = true; +#endif + + NRFX_LOG_INFO("Module enabled."); +} + +void nrfx_clock_disable(void) +{ + NRFX_ASSERT(m_clock_cb.module_initialized); +#if NRFX_CHECK(NRFX_POWER_ENABLED) + NRFX_ASSERT(nrfx_clock_irq_enabled); + if (!nrfx_power_irq_enabled) +#endif + { + NRFX_IRQ_DISABLE(POWER_CLOCK_IRQn); + } + nrf_clock_int_disable(CLOCK_INTENSET_HFCLKSTARTED_Msk | + CLOCK_INTENSET_LFCLKSTARTED_Msk | + CLOCK_INTENSET_DONE_Msk | + CLOCK_INTENSET_CTTO_Msk); +#if NRFX_CHECK(NRFX_POWER_ENABLED) + nrfx_clock_irq_enabled = false; +#endif + NRFX_LOG_INFO("Module disabled."); +} + +void nrfx_clock_uninit(void) +{ + NRFX_ASSERT(m_clock_cb.module_initialized); + nrfx_clock_lfclk_stop(); + nrfx_clock_hfclk_stop(); + m_clock_cb.module_initialized = false; + NRFX_LOG_INFO("Uninitialized."); +} + +void nrfx_clock_lfclk_start(void) +{ + NRFX_ASSERT(m_clock_cb.module_initialized); + nrf_clock_event_clear(NRF_CLOCK_EVENT_LFCLKSTARTED); + nrf_clock_int_enable(NRF_CLOCK_INT_LF_STARTED_MASK); + +#if defined(NRF52832_XXAA) || defined(NRF52832_XXAB) + nrfx_clock_anomaly_132(); +#endif + + nrf_clock_task_trigger(NRF_CLOCK_TASK_LFCLKSTART); +} + +void nrfx_clock_lfclk_stop(void) +{ + NRFX_ASSERT(m_clock_cb.module_initialized); + nrf_clock_task_trigger(NRF_CLOCK_TASK_LFCLKSTOP); + while (nrf_clock_lf_is_running()) + {} +} + +void nrfx_clock_hfclk_start(void) +{ + NRFX_ASSERT(m_clock_cb.module_initialized); + nrf_clock_event_clear(NRF_CLOCK_EVENT_HFCLKSTARTED); + nrf_clock_int_enable(NRF_CLOCK_INT_HF_STARTED_MASK); + nrf_clock_task_trigger(NRF_CLOCK_TASK_HFCLKSTART); +} + +void nrfx_clock_hfclk_stop(void) +{ + NRFX_ASSERT(m_clock_cb.module_initialized); + nrf_clock_task_trigger(NRF_CLOCK_TASK_HFCLKSTOP); + while (nrf_clock_hf_is_running(NRF_CLOCK_HFCLK_HIGH_ACCURACY)) + {} +#if defined(USE_WORKAROUND_FOR_ANOMALY_201) + m_clock_cb.hfclk_started = false; +#endif +} + +nrfx_err_t nrfx_clock_calibration_start(void) +{ + nrfx_err_t err_code = NRFX_SUCCESS; +#if CALIBRATION_SUPPORT + if (nrfx_clock_hfclk_is_running() == false) + { + return NRFX_ERROR_INVALID_STATE; + } + + if (nrfx_clock_lfclk_is_running() == false) + { + return NRFX_ERROR_INVALID_STATE; + } + + if (m_clock_cb.cal_state == CAL_STATE_IDLE) + { + nrf_clock_event_clear(NRF_CLOCK_EVENT_DONE); + nrf_clock_int_enable(NRF_CLOCK_INT_DONE_MASK); + m_clock_cb.cal_state = CAL_STATE_CAL; +#if defined(USE_WORKAROUND_FOR_ANOMALY_192) + *(volatile uint32_t *)0x40000C34 = 0x00000002; +#endif + nrf_clock_task_trigger(NRF_CLOCK_TASK_CAL); + } + else + { + err_code = NRFX_ERROR_BUSY; + } +#endif // CALIBRATION_SUPPORT + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +nrfx_err_t nrfx_clock_is_calibrating(void) +{ +#if CALIBRATION_SUPPORT + if (m_clock_cb.cal_state == CAL_STATE_CAL) + { + return NRFX_ERROR_BUSY; + } +#endif + return NRFX_SUCCESS; +} + +void nrfx_clock_calibration_timer_start(uint8_t interval) +{ + nrf_clock_cal_timer_timeout_set(interval); + nrf_clock_event_clear(NRF_CLOCK_EVENT_CTTO); + nrf_clock_int_enable(NRF_CLOCK_INT_CTTO_MASK); + nrf_clock_task_trigger(NRF_CLOCK_TASK_CTSTART); +} + +void nrfx_clock_calibration_timer_stop(void) +{ + nrf_clock_int_disable(NRF_CLOCK_INT_CTTO_MASK); + nrf_clock_task_trigger(NRF_CLOCK_TASK_CTSTOP); +} + +void nrfx_clock_irq_handler(void) +{ + if (nrf_clock_event_check(NRF_CLOCK_EVENT_HFCLKSTARTED)) + { + nrf_clock_event_clear(NRF_CLOCK_EVENT_HFCLKSTARTED); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_CLOCK_EVENT_HFCLKSTARTED)); + nrf_clock_int_disable(NRF_CLOCK_INT_HF_STARTED_MASK); + +#if defined(USE_WORKAROUND_FOR_ANOMALY_201) + if (!m_clock_cb.hfclk_started) + { + m_clock_cb.hfclk_started = true; + m_clock_cb.event_handler(NRFX_CLOCK_EVT_HFCLK_STARTED); + } +#else + m_clock_cb.event_handler(NRFX_CLOCK_EVT_HFCLK_STARTED); +#endif + } + if (nrf_clock_event_check(NRF_CLOCK_EVENT_LFCLKSTARTED)) + { + nrf_clock_event_clear(NRF_CLOCK_EVENT_LFCLKSTARTED); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_CLOCK_EVENT_LFCLKSTARTED)); + nrf_clock_int_disable(NRF_CLOCK_INT_LF_STARTED_MASK); + + m_clock_cb.event_handler(NRFX_CLOCK_EVT_LFCLK_STARTED); + } +#if CALIBRATION_SUPPORT + if (nrf_clock_event_check(NRF_CLOCK_EVENT_CTTO)) + { + nrf_clock_event_clear(NRF_CLOCK_EVENT_CTTO); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_CLOCK_EVENT_CTTO)); + nrf_clock_int_disable(NRF_CLOCK_INT_CTTO_MASK); + + m_clock_cb.event_handler(NRFX_CLOCK_EVT_CTTO); + } + + if (nrf_clock_event_check(NRF_CLOCK_EVENT_DONE)) + { +#if defined(USE_WORKAROUND_FOR_ANOMALY_192) + *(volatile uint32_t *)0x40000C34 = 0x00000000; +#endif + nrf_clock_event_clear(NRF_CLOCK_EVENT_DONE); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_CLOCK_EVENT_DONE)); + nrf_clock_int_disable(NRF_CLOCK_INT_DONE_MASK); + m_clock_cb.cal_state = CAL_STATE_IDLE; + m_clock_cb.event_handler(NRFX_CLOCK_EVT_CAL_DONE); + } +#endif // CALIBRATION_SUPPORT +} + +#undef NRF_CLOCK_LFCLK_RC +#undef NRF_CLOCK_LFCLK_Xtal +#undef NRF_CLOCK_LFCLK_Synth + +#endif // NRFX_CHECK(NRFX_CLOCK_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_comp.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_comp.c new file mode 100644 index 0000000000..63572d5ca2 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_comp.c @@ -0,0 +1,211 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_COMP_ENABLED) + +#include +#include "prs/nrfx_prs.h" + +#define NRFX_LOG_MODULE COMP +#include + +#define EVT_TO_STR(event) \ + (event == NRF_COMP_EVENT_READY ? "NRF_COMP_EVENT_READY" : \ + (event == NRF_COMP_EVENT_DOWN ? "NRF_COMP_EVENT_DOWN" : \ + (event == NRF_COMP_EVENT_UP ? "NRF_COMP_EVENT_UP" : \ + (event == NRF_COMP_EVENT_CROSS ? "NRF_COMP_EVENT_CROSS" : \ + "UNKNOWN ERROR")))) + + +static nrfx_comp_event_handler_t m_comp_event_handler = NULL; +static nrfx_drv_state_t m_state = NRFX_DRV_STATE_UNINITIALIZED; + +static void comp_execute_handler(nrf_comp_event_t event, uint32_t event_mask) +{ + if (nrf_comp_event_check(event) && nrf_comp_int_enable_check(event_mask)) + { + nrf_comp_event_clear(event); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(event)); + + m_comp_event_handler(event); + } +} + +void nrfx_comp_irq_handler(void) +{ + comp_execute_handler(NRF_COMP_EVENT_READY, COMP_INTENSET_READY_Msk); + comp_execute_handler(NRF_COMP_EVENT_DOWN, COMP_INTENSET_DOWN_Msk); + comp_execute_handler(NRF_COMP_EVENT_UP, COMP_INTENSET_UP_Msk); + comp_execute_handler(NRF_COMP_EVENT_CROSS, COMP_INTENSET_CROSS_Msk); +} + + +nrfx_err_t nrfx_comp_init(nrfx_comp_config_t const * p_config, + nrfx_comp_event_handler_t event_handler) +{ + NRFX_ASSERT(p_config); + NRFX_ASSERT(event_handler); + nrfx_err_t err_code; + + if (m_state != NRFX_DRV_STATE_UNINITIALIZED) + { // COMP driver is already initialized + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + m_comp_event_handler = event_handler; + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + if (nrfx_prs_acquire(NRF_COMP, nrfx_comp_irq_handler) != NRFX_SUCCESS) + { + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } +#endif + + nrf_comp_task_trigger(NRF_COMP_TASK_STOP); + nrf_comp_enable(); + + // Clear events to be sure there are no leftovers. + nrf_comp_event_clear(NRF_COMP_EVENT_READY); + nrf_comp_event_clear(NRF_COMP_EVENT_DOWN); + nrf_comp_event_clear(NRF_COMP_EVENT_UP); + nrf_comp_event_clear(NRF_COMP_EVENT_CROSS); + + nrf_comp_ref_set(p_config->reference); + + //If external source is chosen, write to appropriate register. + if (p_config->reference == COMP_REFSEL_REFSEL_ARef) + { + nrf_comp_ext_ref_set(p_config->ext_ref); + } + + nrf_comp_th_set(p_config->threshold); + nrf_comp_main_mode_set(p_config->main_mode); + nrf_comp_speed_mode_set(p_config->speed_mode); + nrf_comp_hysteresis_set(p_config->hyst); +#if defined (COMP_ISOURCE_ISOURCE_Msk) + nrf_comp_isource_set(p_config->isource); +#endif + nrf_comp_shorts_disable(NRFX_COMP_SHORT_STOP_AFTER_CROSS_EVT | + NRFX_COMP_SHORT_STOP_AFTER_UP_EVT | + NRFX_COMP_SHORT_STOP_AFTER_DOWN_EVT); + nrf_comp_int_disable(COMP_INTENCLR_CROSS_Msk | + COMP_INTENCLR_UP_Msk | + COMP_INTENCLR_DOWN_Msk | + COMP_INTENCLR_READY_Msk); + + nrf_comp_input_select(p_config->input); + + NRFX_IRQ_PRIORITY_SET(COMP_LPCOMP_IRQn, p_config->interrupt_priority); + NRFX_IRQ_ENABLE(COMP_LPCOMP_IRQn); + + m_state = NRFX_DRV_STATE_INITIALIZED; + + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +void nrfx_comp_uninit(void) +{ + NRFX_ASSERT(m_state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_IRQ_DISABLE(COMP_LPCOMP_IRQn); + nrf_comp_disable(); +#if NRFX_CHECK(NRFX_PRS_ENABLED) + nrfx_prs_release(NRF_COMP); +#endif + m_state = NRFX_DRV_STATE_UNINITIALIZED; + m_comp_event_handler = NULL; + NRFX_LOG_INFO("Uninitialized."); +} + +void nrfx_comp_pin_select(nrf_comp_input_t psel) +{ + bool comp_enable_state = nrf_comp_enable_check(); + nrf_comp_task_trigger(NRF_COMP_TASK_STOP); + if (m_state == NRFX_DRV_STATE_POWERED_ON) + { + m_state = NRFX_DRV_STATE_INITIALIZED; + } + nrf_comp_disable(); + nrf_comp_input_select(psel); + if (comp_enable_state == true) + { + nrf_comp_enable(); + } +} + +void nrfx_comp_start(uint32_t comp_int_mask, uint32_t comp_shorts_mask) +{ + NRFX_ASSERT(m_state == NRFX_DRV_STATE_INITIALIZED); + nrf_comp_int_enable(comp_int_mask); + nrf_comp_shorts_enable(comp_shorts_mask); + nrf_comp_task_trigger(NRF_COMP_TASK_START); + m_state = NRFX_DRV_STATE_POWERED_ON; + NRFX_LOG_INFO("Enabled."); +} + +void nrfx_comp_stop(void) +{ + NRFX_ASSERT(m_state == NRFX_DRV_STATE_POWERED_ON); + nrf_comp_shorts_disable(UINT32_MAX); + nrf_comp_int_disable(UINT32_MAX); + nrf_comp_task_trigger(NRF_COMP_TASK_STOP); + m_state = NRFX_DRV_STATE_INITIALIZED; + NRFX_LOG_INFO("Disabled."); +} + +uint32_t nrfx_comp_sample() +{ + NRFX_ASSERT(m_state == NRFX_DRV_STATE_POWERED_ON); + nrf_comp_task_trigger(NRF_COMP_TASK_SAMPLE); + return nrf_comp_result_get(); +} + +#endif // NRFX_CHECK(NRFX_COMP_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/gpiote/nrf_drv_gpiote.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_gpiote.c similarity index 62% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/gpiote/nrf_drv_gpiote.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_gpiote.c index 4fde3f1445..8412b60ad6 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/gpiote/nrf_drv_gpiote.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_gpiote.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,31 +37,19 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(GPIOTE) -#include "nrf_drv_gpiote.h" -#include "nrf_drv_common.h" -#include "app_util_platform.h" -#include "nrf_assert.h" +#include + +#if NRFX_CHECK(NRFX_GPIOTE_ENABLED) + +#include #include "nrf_bitmask.h" #include -#define NRF_LOG_MODULE_NAME gpiote +#define NRFX_LOG_MODULE GPIOTE +#include -#if GPIOTE_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL GPIOTE_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR GPIOTE_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR GPIOTE_CONFIG_DEBUG_COLOR -#else // GPIOTE_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL 0 -#endif // GPIOTE_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); -/* Validate configuration */ -INTERRUPT_PRIORITY_VALIDATION(GPIOTE_CONFIG_IRQ_PRIORITY); - -#define FORBIDDEN_HANDLER_ADDRESS ((nrf_drv_gpiote_evt_handler_t)UINT32_MAX) +#define FORBIDDEN_HANDLER_ADDRESS ((nrfx_gpiote_evt_handler_t)UINT32_MAX) #define PIN_NOT_USED (-1) #define PIN_USED (-2) #define NO_CHANNELS (-1) @@ -84,7 +72,7 @@ INTERRUPT_PRIORITY_VALIDATION(GPIOTE_CONFIG_IRQ_PRIORITY); #define TE_OUT_IDX_TO_TASK_ADDR(idx) (nrf_gpiote_tasks_t)((uint32_t)NRF_GPIOTE_TASKS_OUT_0 + \ (sizeof(uint32_t) * (idx))) -#if defined(GPIOTE_FEATURE_SET_PRESENT) || defined(__SDK_DOXYGEN__) +#if defined(GPIOTE_FEATURE_SET_PRESENT) || defined(__NRFX_DOXYGEN__) /** * @brief Macro for converting task-event index of SET task to an address of a task register. * @@ -93,9 +81,9 @@ INTERRUPT_PRIORITY_VALIDATION(GPIOTE_CONFIG_IRQ_PRIORITY); #define TE_SET_IDX_TO_TASK_ADDR(idx) (nrf_gpiote_tasks_t)((uint32_t)NRF_GPIOTE_TASKS_SET_0 + \ (sizeof(uint32_t) * (idx))) -#endif // defined(GPIOTE_FEATURE_SET_PRESENT) || defined(__SDK_DOXYGEN__) +#endif // defined(GPIOTE_FEATURE_SET_PRESENT) || defined(__NRFX_DOXYGEN__) -#if defined(GPIOTE_FEATURE_CLR_PRESENT) || defined(__SDK_DOXYGEN__) +#if defined(GPIOTE_FEATURE_CLR_PRESENT) || defined(__NRFX_DOXYGEN__) /** * @brief Macro for converting task-event index of CLR task to an address of a task register. * @@ -104,15 +92,16 @@ INTERRUPT_PRIORITY_VALIDATION(GPIOTE_CONFIG_IRQ_PRIORITY); #define TE_CLR_IDX_TO_TASK_ADDR(idx) (nrf_gpiote_tasks_t)((uint32_t)NRF_GPIOTE_TASKS_CLR_0 + \ (sizeof(uint32_t) * (idx))) -#endif // defined(GPIOTE_FEATURE_CLR_PRESENT) || defined(__SDK_DOXYGEN__) +#endif // defined(GPIOTE_FEATURE_CLR_PRESENT) || defined(__NRFX_DOXYGEN__) -/*lint -save -e661*/ +/*lint -save -e571*/ /* Suppress "Warning 571: Suspicious cast" */ typedef struct { - nrf_drv_gpiote_evt_handler_t handlers[GPIOTE_CH_NUM + GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS]; - int8_t pin_assignments[NUMBER_OF_PINS]; - int8_t port_handlers_pins[GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS]; - nrf_drv_state_t state; + nrfx_gpiote_evt_handler_t handlers[GPIOTE_CH_NUM + NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS]; + int8_t pin_assignments[NUMBER_OF_PINS]; + int8_t port_handlers_pins[NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS]; + uint8_t configured_pins[((NUMBER_OF_PINS)+7) / 8]; + nrfx_drv_state_t state; } gpiote_control_block_t; static gpiote_control_block_t m_cb; @@ -131,8 +120,8 @@ __STATIC_INLINE bool pin_in_use_as_non_task_out(uint32_t pin) __STATIC_INLINE bool pin_in_use_by_te(uint32_t pin) { - return (m_cb.pin_assignments[pin] >= 0 && m_cb.pin_assignments[pin] < - GPIOTE_CH_NUM) ? true : false; + return (m_cb.pin_assignments[pin] >= 0 && m_cb.pin_assignments[pin] < GPIOTE_CH_NUM) ? + true : false; } @@ -148,10 +137,10 @@ __STATIC_INLINE bool pin_in_use_by_gpiote(uint32_t pin) } -__STATIC_INLINE void pin_in_use_by_te_set(uint32_t pin, - uint32_t channel_id, - nrf_drv_gpiote_evt_handler_t handler, - bool is_channel) +__STATIC_INLINE void pin_in_use_by_te_set(uint32_t pin, + uint32_t channel_id, + nrfx_gpiote_evt_handler_t handler, + bool is_channel) { m_cb.pin_assignments[pin] = channel_id; m_cb.handlers[channel_id] = handler; @@ -174,26 +163,41 @@ __STATIC_INLINE void pin_in_use_clear(uint32_t pin) } +__STATIC_INLINE void pin_configured_set(uint32_t pin) +{ + nrf_bitmask_bit_set(pin, m_cb.configured_pins); +} + +__STATIC_INLINE void pin_configured_clear(uint32_t pin) +{ + nrf_bitmask_bit_clear(pin, m_cb.configured_pins); +} + +__STATIC_INLINE bool pin_configured_check(uint32_t pin) +{ + return 0 != nrf_bitmask_bit_is_set(pin, m_cb.configured_pins); +} + __STATIC_INLINE int8_t channel_port_get(uint32_t pin) { return m_cb.pin_assignments[pin]; } -__STATIC_INLINE nrf_drv_gpiote_evt_handler_t channel_handler_get(uint32_t channel) +__STATIC_INLINE nrfx_gpiote_evt_handler_t channel_handler_get(uint32_t channel) { return m_cb.handlers[channel]; } -static int8_t channel_port_alloc(uint32_t pin, nrf_drv_gpiote_evt_handler_t handler, bool channel) +static int8_t channel_port_alloc(uint32_t pin, nrfx_gpiote_evt_handler_t handler, bool channel) { int8_t channel_id = NO_CHANNELS; uint32_t i; uint32_t start_idx = channel ? 0 : GPIOTE_CH_NUM; uint32_t end_idx = - channel ? GPIOTE_CH_NUM : (GPIOTE_CH_NUM + GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS); + channel ? GPIOTE_CH_NUM : (GPIOTE_CH_NUM + NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS); // critical section @@ -221,16 +225,16 @@ static void channel_free(uint8_t channel_id) } -ret_code_t nrf_drv_gpiote_init(void) +nrfx_err_t nrfx_gpiote_init(void) { - ret_code_t err_code; + nrfx_err_t err_code; - if (m_cb.state != NRF_DRV_STATE_UNINITIALIZED) + if (m_cb.state != NRFX_DRV_STATE_UNINITIALIZED) { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } @@ -241,32 +245,34 @@ ret_code_t nrf_drv_gpiote_init(void) pin_in_use_clear(i); } - for (i = 0; i < (GPIOTE_CH_NUM + GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS); i++) + for (i = 0; i < (GPIOTE_CH_NUM + NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS); i++) { channel_free(i); } - nrf_drv_common_irq_enable(GPIOTE_IRQn, GPIOTE_CONFIG_IRQ_PRIORITY); + memset(m_cb.configured_pins, 0, sizeof(m_cb.configured_pins)); + + NRFX_IRQ_PRIORITY_SET(GPIOTE_IRQn, NRFX_GPIOTE_CONFIG_IRQ_PRIORITY); + NRFX_IRQ_ENABLE(GPIOTE_IRQn); nrf_gpiote_event_clear(NRF_GPIOTE_EVENTS_PORT); nrf_gpiote_int_enable(GPIOTE_INTENSET_PORT_Msk); - m_cb.state = NRF_DRV_STATE_INITIALIZED; + m_cb.state = NRFX_DRV_STATE_INITIALIZED; - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } -bool nrf_drv_gpiote_is_init(void) +bool nrfx_gpiote_is_init(void) { - return (m_cb.state != NRF_DRV_STATE_UNINITIALIZED) ? true : false; + return (m_cb.state != NRFX_DRV_STATE_UNINITIALIZED) ? true : false; } -void nrf_drv_gpiote_uninit(void) +void nrfx_gpiote_uninit(void) { - ASSERT(m_cb.state != NRF_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); uint32_t i; @@ -274,33 +280,33 @@ void nrf_drv_gpiote_uninit(void) { if (pin_in_use_as_non_task_out(i)) { - nrf_drv_gpiote_out_uninit(i); + nrfx_gpiote_out_uninit(i); } else if ( pin_in_use_by_gpiote(i)) { /* Disable gpiote_in is having the same effect on out pin as gpiote_out_uninit on * so it can be called on all pins used by GPIOTE. */ - nrf_drv_gpiote_in_uninit(i); + nrfx_gpiote_in_uninit(i); } } - m_cb.state = NRF_DRV_STATE_UNINITIALIZED; - NRF_LOG_INFO("Uninitialized."); + m_cb.state = NRFX_DRV_STATE_UNINITIALIZED; + NRFX_LOG_INFO("Uninitialized."); } -ret_code_t nrf_drv_gpiote_out_init(nrf_drv_gpiote_pin_t pin, - nrf_drv_gpiote_out_config_t const * p_config) +nrfx_err_t nrfx_gpiote_out_init(nrfx_gpiote_pin_t pin, + nrfx_gpiote_out_config_t const * p_config) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(m_cb.state == NRF_DRV_STATE_INITIALIZED); - ASSERT(p_config); + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(m_cb.state == NRFX_DRV_STATE_INITIALIZED); + NRFX_ASSERT(p_config); - ret_code_t err_code = NRF_SUCCESS; + nrfx_err_t err_code = NRFX_SUCCESS; if (pin_in_use(pin)) { - err_code = NRF_ERROR_INVALID_STATE; + err_code = NRFX_ERROR_INVALID_STATE; } else { @@ -310,11 +316,14 @@ ret_code_t nrf_drv_gpiote_out_init(nrf_drv_gpiote_pin_t pin, if (channel != NO_CHANNELS) { - nrf_gpiote_task_configure(channel, pin, p_config->action, p_config->init_state); + nrf_gpiote_task_configure((uint32_t)channel, + pin, + p_config->action, + p_config->init_state); } else { - err_code = NRF_ERROR_NO_MEM; + err_code = NRFX_ERROR_NO_MEM; } } else @@ -322,7 +331,7 @@ ret_code_t nrf_drv_gpiote_out_init(nrf_drv_gpiote_pin_t pin, pin_in_use_set(pin); } - if (err_code == NRF_SUCCESS) + if (err_code == NRFX_SUCCESS) { if (p_config->init_state == NRF_GPIOTE_INITIAL_VALUE_HIGH) { @@ -334,98 +343,102 @@ ret_code_t nrf_drv_gpiote_out_init(nrf_drv_gpiote_pin_t pin, } nrf_gpio_cfg_output(pin); + pin_configured_set(pin); } } - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } -void nrf_drv_gpiote_out_uninit(nrf_drv_gpiote_pin_t pin) +void nrfx_gpiote_out_uninit(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use(pin)); + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use(pin)); if (pin_in_use_by_te(pin)) { channel_free((uint8_t)channel_port_get(pin)); - nrf_gpiote_te_default(channel_port_get(pin)); + nrf_gpiote_te_default((uint32_t)channel_port_get(pin)); } pin_in_use_clear(pin); - nrf_gpio_cfg_default(pin); + if (pin_configured_check(pin)) + { + nrf_gpio_cfg_default(pin); + pin_configured_clear(pin); + } } -void nrf_drv_gpiote_out_set(nrf_drv_gpiote_pin_t pin) +void nrfx_gpiote_out_set(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use(pin)); - ASSERT(!pin_in_use_by_te(pin)) + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use(pin)); + NRFX_ASSERT(!pin_in_use_by_te(pin)); nrf_gpio_pin_set(pin); } -void nrf_drv_gpiote_out_clear(nrf_drv_gpiote_pin_t pin) +void nrfx_gpiote_out_clear(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use(pin)); - ASSERT(!pin_in_use_by_te(pin)) + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use(pin)); + NRFX_ASSERT(!pin_in_use_by_te(pin)); nrf_gpio_pin_clear(pin); } -void nrf_drv_gpiote_out_toggle(nrf_drv_gpiote_pin_t pin) +void nrfx_gpiote_out_toggle(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use(pin)); - ASSERT(!pin_in_use_by_te(pin)) + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use(pin)); + NRFX_ASSERT(!pin_in_use_by_te(pin)); nrf_gpio_pin_toggle(pin); } -void nrf_drv_gpiote_out_task_enable(nrf_drv_gpiote_pin_t pin) +void nrfx_gpiote_out_task_enable(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use(pin)); - ASSERT(pin_in_use_by_te(pin)) + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use(pin)); + NRFX_ASSERT(pin_in_use_by_te(pin)); - nrf_gpiote_task_enable(m_cb.pin_assignments[pin]); + nrf_gpiote_task_enable((uint32_t)m_cb.pin_assignments[pin]); } -void nrf_drv_gpiote_out_task_disable(nrf_drv_gpiote_pin_t pin) +void nrfx_gpiote_out_task_disable(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use(pin)); - ASSERT(pin_in_use_by_te(pin)) + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use(pin)); + NRFX_ASSERT(pin_in_use_by_te(pin)); - nrf_gpiote_task_disable(m_cb.pin_assignments[pin]); + nrf_gpiote_task_disable((uint32_t)m_cb.pin_assignments[pin]); } -uint32_t nrf_drv_gpiote_out_task_addr_get(nrf_drv_gpiote_pin_t pin) +uint32_t nrfx_gpiote_out_task_addr_get(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use_by_te(pin)); + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use_by_te(pin)); - nrf_gpiote_tasks_t task = TE_OUT_IDX_TO_TASK_ADDR(channel_port_get(pin)); + nrf_gpiote_tasks_t task = TE_OUT_IDX_TO_TASK_ADDR((uint32_t)channel_port_get(pin)); return nrf_gpiote_task_addr_get(task); } #if defined(GPIOTE_FEATURE_SET_PRESENT) -uint32_t nrf_drv_gpiote_set_task_addr_get(nrf_drv_gpiote_pin_t pin) +uint32_t nrfx_gpiote_set_task_addr_get(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use_by_te(pin)); + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use_by_te(pin)); - nrf_gpiote_tasks_t task = TE_SET_IDX_TO_TASK_ADDR(channel_port_get(pin)); + nrf_gpiote_tasks_t task = TE_SET_IDX_TO_TASK_ADDR((uint32_t)channel_port_get(pin)); return nrf_gpiote_task_addr_get(task); } @@ -433,49 +446,49 @@ uint32_t nrf_drv_gpiote_set_task_addr_get(nrf_drv_gpiote_pin_t pin) #endif // defined(GPIOTE_FEATURE_SET_PRESENT) #if defined(GPIOTE_FEATURE_CLR_PRESENT) -uint32_t nrf_drv_gpiote_clr_task_addr_get(nrf_drv_gpiote_pin_t pin) +uint32_t nrfx_gpiote_clr_task_addr_get(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use_by_te(pin)); + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use_by_te(pin)); - nrf_gpiote_tasks_t task = TE_CLR_IDX_TO_TASK_ADDR(channel_port_get(pin)); + nrf_gpiote_tasks_t task = TE_CLR_IDX_TO_TASK_ADDR((uint32_t)channel_port_get(pin)); return nrf_gpiote_task_addr_get(task); } #endif // defined(GPIOTE_FEATURE_CLR_PRESENT) -void nrf_drv_gpiote_out_task_force(nrf_drv_gpiote_pin_t pin, uint8_t state) +void nrfx_gpiote_out_task_force(nrfx_gpiote_pin_t pin, uint8_t state) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use(pin)); - ASSERT(pin_in_use_by_te(pin)); + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use(pin)); + NRFX_ASSERT(pin_in_use_by_te(pin)); nrf_gpiote_outinit_t init_val = state ? NRF_GPIOTE_INITIAL_VALUE_HIGH : NRF_GPIOTE_INITIAL_VALUE_LOW; - nrf_gpiote_task_force(m_cb.pin_assignments[pin], init_val); + nrf_gpiote_task_force((uint32_t)m_cb.pin_assignments[pin], init_val); } -void nrf_drv_gpiote_out_task_trigger(nrf_drv_gpiote_pin_t pin) +void nrfx_gpiote_out_task_trigger(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use(pin)); - ASSERT(pin_in_use_by_te(pin)); + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use(pin)); + NRFX_ASSERT(pin_in_use_by_te(pin)); - nrf_gpiote_tasks_t task = TE_OUT_IDX_TO_TASK_ADDR(channel_port_get(pin)); + nrf_gpiote_tasks_t task = TE_OUT_IDX_TO_TASK_ADDR((uint32_t)channel_port_get(pin)); nrf_gpiote_task_set(task); } #if defined(GPIOTE_FEATURE_SET_PRESENT) -void nrf_drv_gpiote_set_task_trigger(nrf_drv_gpiote_pin_t pin) +void nrfx_gpiote_set_task_trigger(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use(pin)); - ASSERT(pin_in_use_by_te(pin)); + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use(pin)); + NRFX_ASSERT(pin_in_use_by_te(pin)); - nrf_gpiote_tasks_t task = TE_SET_IDX_TO_TASK_ADDR(channel_port_get(pin)); + nrf_gpiote_tasks_t task = TE_SET_IDX_TO_TASK_ADDR((uint32_t)channel_port_get(pin)); nrf_gpiote_task_set(task); } @@ -483,48 +496,52 @@ void nrf_drv_gpiote_set_task_trigger(nrf_drv_gpiote_pin_t pin) #endif // defined(GPIOTE_FEATURE_SET_PRESENT) #if defined(GPIOTE_FEATURE_CLR_PRESENT) -void nrf_drv_gpiote_clr_task_trigger(nrf_drv_gpiote_pin_t pin) +void nrfx_gpiote_clr_task_trigger(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use(pin)); - ASSERT(pin_in_use_by_te(pin)); + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use(pin)); + NRFX_ASSERT(pin_in_use_by_te(pin)); - nrf_gpiote_tasks_t task = TE_CLR_IDX_TO_TASK_ADDR(channel_port_get(pin)); + nrf_gpiote_tasks_t task = TE_CLR_IDX_TO_TASK_ADDR((uint32_t)channel_port_get(pin)); nrf_gpiote_task_set(task); } #endif // defined(GPIOTE_FEATURE_CLR_PRESENT) -ret_code_t nrf_drv_gpiote_in_init(nrf_drv_gpiote_pin_t pin, - nrf_drv_gpiote_in_config_t const * p_config, - nrf_drv_gpiote_evt_handler_t evt_handler) +nrfx_err_t nrfx_gpiote_in_init(nrfx_gpiote_pin_t pin, + nrfx_gpiote_in_config_t const * p_config, + nrfx_gpiote_evt_handler_t evt_handler) { - ASSERT(pin < NUMBER_OF_PINS); - ret_code_t err_code = NRF_SUCCESS; + NRFX_ASSERT(pin < NUMBER_OF_PINS); + nrfx_err_t err_code = NRFX_SUCCESS; /* Only one GPIOTE channel can be assigned to one physical pin. */ if (pin_in_use_by_gpiote(pin)) { - err_code = NRF_ERROR_INVALID_STATE; + err_code = NRFX_ERROR_INVALID_STATE; } else { int8_t channel = channel_port_alloc(pin, evt_handler, p_config->hi_accuracy); if (channel != NO_CHANNELS) { - if (p_config->is_watcher) + if (!p_config->skip_gpio_setup) { - nrf_gpio_cfg_watcher(pin); - } - else - { - nrf_gpio_cfg_input(pin, p_config->pull); + if (p_config->is_watcher) + { + nrf_gpio_cfg_watcher(pin); + } + else + { + nrf_gpio_cfg_input(pin, p_config->pull); + } + pin_configured_set(pin); } if (p_config->hi_accuracy) { - nrf_gpiote_event_configure(channel, pin, p_config->sense); + nrf_gpiote_event_configure((uint32_t)channel, pin, p_config->sense); } else { @@ -534,23 +551,21 @@ ret_code_t nrf_drv_gpiote_in_init(nrf_drv_gpiote_pin_t pin, } else { - err_code = NRF_ERROR_NO_MEM; + err_code = NRFX_ERROR_NO_MEM; } } - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } - -void nrf_drv_gpiote_in_event_enable(nrf_drv_gpiote_pin_t pin, bool int_enable) +void nrfx_gpiote_in_event_enable(nrfx_gpiote_pin_t pin, bool int_enable) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use_by_gpiote(pin)); + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use_by_gpiote(pin)); if (pin_in_use_by_port(pin)) { - uint8_t pin_and_sense = + uint8_t pin_and_sense = (uint8_t) m_cb.port_handlers_pins[channel_port_get(pin) - GPIOTE_CH_NUM]; nrf_gpiote_polarity_t polarity = (nrf_gpiote_polarity_t)(pin_and_sense >> SENSE_FIELD_POS); @@ -571,14 +586,14 @@ void nrf_drv_gpiote_in_event_enable(nrf_drv_gpiote_pin_t pin, bool int_enable) else if (pin_in_use_by_te(pin)) { int32_t channel = (int32_t)channel_port_get(pin); - nrf_gpiote_events_t event = TE_IDX_TO_EVENT_ADDR(channel); + nrf_gpiote_events_t event = TE_IDX_TO_EVENT_ADDR((uint32_t)channel); - nrf_gpiote_event_enable(channel); + nrf_gpiote_event_enable((uint32_t)channel); nrf_gpiote_event_clear(event); if (int_enable) { - nrf_drv_gpiote_evt_handler_t handler = channel_handler_get(channel_port_get(pin)); + nrfx_gpiote_evt_handler_t handler = channel_handler_get((uint32_t)channel_port_get(pin)); // Enable the interrupt only if event handler was provided. if (handler) { @@ -589,10 +604,10 @@ void nrf_drv_gpiote_in_event_enable(nrf_drv_gpiote_pin_t pin, bool int_enable) } -void nrf_drv_gpiote_in_event_disable(nrf_drv_gpiote_pin_t pin) +void nrfx_gpiote_in_event_disable(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use_by_gpiote(pin)); + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use_by_gpiote(pin)); if (pin_in_use_by_port(pin)) { nrf_gpio_cfg_sense_set(pin, NRF_GPIO_PIN_NOSENSE); @@ -600,50 +615,54 @@ void nrf_drv_gpiote_in_event_disable(nrf_drv_gpiote_pin_t pin) else if (pin_in_use_by_te(pin)) { int32_t channel = (int32_t)channel_port_get(pin); - nrf_gpiote_event_disable(channel); + nrf_gpiote_event_disable((uint32_t)channel); nrf_gpiote_int_disable(1 << channel); } } -void nrf_drv_gpiote_in_uninit(nrf_drv_gpiote_pin_t pin) +void nrfx_gpiote_in_uninit(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use_by_gpiote(pin)); - nrf_drv_gpiote_in_event_disable(pin); + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use_by_gpiote(pin)); + nrfx_gpiote_in_event_disable(pin); if (pin_in_use_by_te(pin)) { - nrf_gpiote_te_default(channel_port_get(pin)); + nrf_gpiote_te_default((uint32_t)channel_port_get(pin)); + } + if (pin_configured_check(pin)) + { + nrf_gpio_cfg_default(pin); + pin_configured_clear(pin); } - nrf_gpio_cfg_default(pin); channel_free((uint8_t)channel_port_get(pin)); pin_in_use_clear(pin); } -bool nrf_drv_gpiote_in_is_set(nrf_drv_gpiote_pin_t pin) +bool nrfx_gpiote_in_is_set(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin < NUMBER_OF_PINS); return nrf_gpio_pin_read(pin) ? true : false; } -uint32_t nrf_drv_gpiote_in_event_addr_get(nrf_drv_gpiote_pin_t pin) +uint32_t nrfx_gpiote_in_event_addr_get(nrfx_gpiote_pin_t pin) { - ASSERT(pin < NUMBER_OF_PINS); - ASSERT(pin_in_use_by_port(pin) || pin_in_use_by_te(pin)); + NRFX_ASSERT(pin < NUMBER_OF_PINS); + NRFX_ASSERT(pin_in_use_by_port(pin) || pin_in_use_by_te(pin)); nrf_gpiote_events_t event = NRF_GPIOTE_EVENTS_PORT; if (pin_in_use_by_te(pin)) { - event = TE_IDX_TO_EVENT_ADDR(channel_port_get(pin)); + event = TE_IDX_TO_EVENT_ADDR((uint32_t)channel_port_get(pin)); } return nrf_gpiote_event_addr_get(event); } -void GPIOTE_IRQHandler(void) +void nrfx_gpiote_irq_handler(void) { uint32_t status = 0; uint32_t input[GPIO_COUNT] = {0}; @@ -684,11 +703,11 @@ void GPIOTE_IRQHandler(void) { if (mask & status) { - nrf_drv_gpiote_pin_t pin = nrf_gpiote_event_pin_get(i); - NRF_LOG_DEBUG("Event in number: %d.", i); + nrfx_gpiote_pin_t pin = nrf_gpiote_event_pin_get(i); + NRFX_LOG_DEBUG("Event in number: %d.", i); nrf_gpiote_polarity_t polarity = nrf_gpiote_event_polarity_get(i); - nrf_drv_gpiote_evt_handler_t handler = channel_handler_get(i); - NRF_LOG_DEBUG("Pin: %d, polarity: %d.", pin, polarity); + nrfx_gpiote_evt_handler_t handler = channel_handler_get(i); + NRFX_LOG_DEBUG("Pin: %d, polarity: %d.", pin, polarity); if (handler) { handler(pin, polarity); @@ -716,10 +735,10 @@ void GPIOTE_IRQHandler(void) { repeat = 0; - for (i = 0; i < GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS; i++) + for (i = 0; i < NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS; i++) { - uint8_t pin_and_sense = m_cb.port_handlers_pins[i]; - nrf_drv_gpiote_pin_t pin = (pin_and_sense & ~SENSE_FIELD_MASK); + uint8_t pin_and_sense = (uint8_t)m_cb.port_handlers_pins[i]; + nrfx_gpiote_pin_t pin = (pin_and_sense & ~SENSE_FIELD_MASK); if ((m_cb.port_handlers_pins[i] != PIN_NOT_USED) && nrf_bitmask_bit_is_set(pin, pins_to_check)) @@ -727,8 +746,8 @@ void GPIOTE_IRQHandler(void) nrf_gpiote_polarity_t polarity = (nrf_gpiote_polarity_t)((pin_and_sense & SENSE_FIELD_MASK) >> SENSE_FIELD_POS); - nrf_drv_gpiote_evt_handler_t handler = - channel_handler_get(channel_port_get(pin)); + nrfx_gpiote_evt_handler_t handler = + channel_handler_get((uint32_t)channel_port_get(pin)); if (handler || (polarity == NRF_GPIOTE_POLARITY_TOGGLE)) { if (polarity == NRF_GPIOTE_POLARITY_TOGGLE) @@ -740,8 +759,7 @@ void GPIOTE_IRQHandler(void) if ((pin_state && (sense == NRF_GPIO_PIN_SENSE_HIGH)) || (!pin_state && (sense == NRF_GPIO_PIN_SENSE_LOW)) ) { - NRF_LOG_DEBUG("PORT event for pin: %d, polarity: %d.", pin, - polarity); + NRFX_LOG_DEBUG("PORT event for pin: %d, polarity: %d.", pin, polarity); if (polarity == NRF_GPIOTE_POLARITY_TOGGLE) { nrf_gpio_pin_sense_t next_sense = @@ -805,4 +823,4 @@ void GPIOTE_IRQHandler(void) /*lint -restore*/ -#endif // NRF_MODULE_ENABLED(GPIOTE) +#endif // NRFX_CHECK(NRFX_GPIOTE_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_i2s.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_i2s.c new file mode 100644 index 0000000000..35beaab676 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_i2s.c @@ -0,0 +1,420 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_I2S_ENABLED) + +#include +#include + +#define NRFX_LOG_MODULE I2S +#include + +#define EVT_TO_STR(event) \ + (event == NRF_I2S_EVENT_RXPTRUPD ? "NRF_I2S_EVENT_RXPTRUPD" : \ + (event == NRF_I2S_EVENT_TXPTRUPD ? "NRF_I2S_EVENT_TXPTRUPD" : \ + (event == NRF_I2S_EVENT_STOPPED ? "NRF_I2S_EVENT_STOPPED" : \ + "UNKNOWN EVENT"))) + +// Control block - driver instance local data. +typedef struct +{ + nrfx_i2s_data_handler_t handler; + nrfx_drv_state_t state; + + bool use_rx : 1; + bool use_tx : 1; + bool rx_ready : 1; + bool tx_ready : 1; + bool buffers_needed : 1; + bool buffers_reused : 1; + + uint16_t buffer_size; + nrfx_i2s_buffers_t next_buffers; + nrfx_i2s_buffers_t current_buffers; +} i2s_control_block_t; +static i2s_control_block_t m_cb; + + +static void configure_pins(nrfx_i2s_config_t const * p_config) +{ + uint32_t mck_pin, sdout_pin, sdin_pin; + + // Configure pins used by the peripheral: + + // - SCK and LRCK (required) - depending on the mode of operation these + // pins are configured as outputs (in Master mode) or inputs (in Slave + // mode). + if (p_config->mode == NRF_I2S_MODE_MASTER) + { + nrf_gpio_cfg_output(p_config->sck_pin); + nrf_gpio_cfg_output(p_config->lrck_pin); + } + else + { + nrf_gpio_cfg_input(p_config->sck_pin, NRF_GPIO_PIN_NOPULL); + nrf_gpio_cfg_input(p_config->lrck_pin, NRF_GPIO_PIN_NOPULL); + } + + // - MCK (optional) - always output, + if (p_config->mck_pin != NRFX_I2S_PIN_NOT_USED) + { + mck_pin = p_config->mck_pin; + nrf_gpio_cfg_output(mck_pin); + } + else + { + mck_pin = NRF_I2S_PIN_NOT_CONNECTED; + } + + // - SDOUT (optional) - always output, + if (p_config->sdout_pin != NRFX_I2S_PIN_NOT_USED) + { + sdout_pin = p_config->sdout_pin; + nrf_gpio_cfg_output(sdout_pin); + } + else + { + sdout_pin = NRF_I2S_PIN_NOT_CONNECTED; + } + + // - SDIN (optional) - always input. + if (p_config->sdin_pin != NRFX_I2S_PIN_NOT_USED) + { + sdin_pin = p_config->sdin_pin; + nrf_gpio_cfg_input(sdin_pin, NRF_GPIO_PIN_NOPULL); + } + else + { + sdin_pin = NRF_I2S_PIN_NOT_CONNECTED; + } + + nrf_i2s_pins_set(NRF_I2S, + p_config->sck_pin, + p_config->lrck_pin, + mck_pin, + sdout_pin, + sdin_pin); +} + + +nrfx_err_t nrfx_i2s_init(nrfx_i2s_config_t const * p_config, + nrfx_i2s_data_handler_t handler) +{ + NRFX_ASSERT(p_config); + NRFX_ASSERT(handler); + + nrfx_err_t err_code; + + if (m_cb.state != NRFX_DRV_STATE_UNINITIALIZED) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + if (!nrf_i2s_configure(NRF_I2S, + p_config->mode, + p_config->format, + p_config->alignment, + p_config->sample_width, + p_config->channels, + p_config->mck_setup, + p_config->ratio)) + { + err_code = NRFX_ERROR_INVALID_PARAM; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + configure_pins(p_config); + + m_cb.handler = handler; + + NRFX_IRQ_PRIORITY_SET(I2S_IRQn, p_config->irq_priority); + NRFX_IRQ_ENABLE(I2S_IRQn); + + m_cb.state = NRFX_DRV_STATE_INITIALIZED; + + NRFX_LOG_INFO("Initialized."); + return NRFX_SUCCESS; +} + + +void nrfx_i2s_uninit(void) +{ + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); + + nrfx_i2s_stop(); + + NRFX_IRQ_DISABLE(I2S_IRQn); + + nrf_i2s_pins_set(NRF_I2S, + NRF_I2S_PIN_NOT_CONNECTED, + NRF_I2S_PIN_NOT_CONNECTED, + NRF_I2S_PIN_NOT_CONNECTED, + NRF_I2S_PIN_NOT_CONNECTED, + NRF_I2S_PIN_NOT_CONNECTED); + + m_cb.state = NRFX_DRV_STATE_UNINITIALIZED; + NRFX_LOG_INFO("Uninitialized."); +} + + +nrfx_err_t nrfx_i2s_start(nrfx_i2s_buffers_t const * p_initial_buffers, + uint16_t buffer_size, + uint8_t flags) +{ + NRFX_ASSERT(p_initial_buffers != NULL); + NRFX_ASSERT(p_initial_buffers->p_rx_buffer != NULL || + p_initial_buffers->p_tx_buffer != NULL); + NRFX_ASSERT(buffer_size != 0); + (void)(flags); + + nrfx_err_t err_code; + + if (m_cb.state != NRFX_DRV_STATE_INITIALIZED) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + if (((p_initial_buffers->p_rx_buffer != NULL) + && !nrfx_is_in_ram(p_initial_buffers->p_rx_buffer)) + || + ((p_initial_buffers->p_tx_buffer != NULL) + && !nrfx_is_in_ram(p_initial_buffers->p_tx_buffer))) + { + err_code = NRFX_ERROR_INVALID_ADDR; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + m_cb.use_rx = (p_initial_buffers->p_rx_buffer != NULL); + m_cb.use_tx = (p_initial_buffers->p_tx_buffer != NULL); + m_cb.rx_ready = false; + m_cb.tx_ready = false; + m_cb.buffers_needed = false; + m_cb.buffer_size = buffer_size; + + // Set the provided initial buffers as next, they will become the current + // ones after the IRQ handler is called for the first time, what will occur + // right after the START task is triggered. + m_cb.next_buffers = *p_initial_buffers; + m_cb.current_buffers.p_rx_buffer = NULL; + m_cb.current_buffers.p_tx_buffer = NULL; + + nrf_i2s_transfer_set(NRF_I2S, + m_cb.buffer_size, + m_cb.next_buffers.p_rx_buffer, + m_cb.next_buffers.p_tx_buffer); + + nrf_i2s_enable(NRF_I2S); + + m_cb.state = NRFX_DRV_STATE_POWERED_ON; + + nrf_i2s_event_clear(NRF_I2S, NRF_I2S_EVENT_RXPTRUPD); + nrf_i2s_event_clear(NRF_I2S, NRF_I2S_EVENT_TXPTRUPD); + nrf_i2s_event_clear(NRF_I2S, NRF_I2S_EVENT_STOPPED); + nrf_i2s_int_enable(NRF_I2S, (m_cb.use_rx ? NRF_I2S_INT_RXPTRUPD_MASK : 0) | + (m_cb.use_tx ? NRF_I2S_INT_TXPTRUPD_MASK : 0) | + NRF_I2S_INT_STOPPED_MASK); + nrf_i2s_task_trigger(NRF_I2S, NRF_I2S_TASK_START); + + NRFX_LOG_INFO("Started."); + return NRFX_SUCCESS; +} + + +nrfx_err_t nrfx_i2s_next_buffers_set(nrfx_i2s_buffers_t const * p_buffers) +{ + NRFX_ASSERT(m_cb.state == NRFX_DRV_STATE_POWERED_ON); + NRFX_ASSERT(p_buffers); + + nrfx_err_t err_code; + + if (!m_cb.buffers_needed) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + if (((p_buffers->p_rx_buffer != NULL) + && !nrfx_is_in_ram(p_buffers->p_rx_buffer)) + || + ((p_buffers->p_tx_buffer != NULL) + && !nrfx_is_in_ram(p_buffers->p_tx_buffer))) + { + err_code = NRFX_ERROR_INVALID_ADDR; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + if (m_cb.use_tx) + { + NRFX_ASSERT(p_buffers->p_tx_buffer != NULL); + nrf_i2s_tx_buffer_set(NRF_I2S, p_buffers->p_tx_buffer); + } + if (m_cb.use_rx) + { + NRFX_ASSERT(p_buffers->p_rx_buffer != NULL); + nrf_i2s_rx_buffer_set(NRF_I2S, p_buffers->p_rx_buffer); + } + + m_cb.next_buffers = *p_buffers; + m_cb.buffers_needed = false; + + return NRFX_SUCCESS; +} + + +void nrfx_i2s_stop(void) +{ + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); + + m_cb.buffers_needed = false; + + // First disable interrupts, then trigger the STOP task, so no spurious + // RXPTRUPD and TXPTRUPD events (see nRF52 anomaly 55) are processed. + nrf_i2s_int_disable(NRF_I2S, NRF_I2S_INT_RXPTRUPD_MASK | + NRF_I2S_INT_TXPTRUPD_MASK); + nrf_i2s_task_trigger(NRF_I2S, NRF_I2S_TASK_STOP); +} + + +void nrfx_i2s_irq_handler(void) +{ + if (nrf_i2s_event_check(NRF_I2S, NRF_I2S_EVENT_TXPTRUPD)) + { + nrf_i2s_event_clear(NRF_I2S, NRF_I2S_EVENT_TXPTRUPD); + m_cb.tx_ready = true; + if (m_cb.use_tx && m_cb.buffers_needed) + { + m_cb.buffers_reused = true; + } + } + if (nrf_i2s_event_check(NRF_I2S, NRF_I2S_EVENT_RXPTRUPD)) + { + nrf_i2s_event_clear(NRF_I2S, NRF_I2S_EVENT_RXPTRUPD); + m_cb.rx_ready = true; + if (m_cb.use_rx && m_cb.buffers_needed) + { + m_cb.buffers_reused = true; + } + } + + if (nrf_i2s_event_check(NRF_I2S, NRF_I2S_EVENT_STOPPED)) + { + nrf_i2s_event_clear(NRF_I2S, NRF_I2S_EVENT_STOPPED); + nrf_i2s_int_disable(NRF_I2S, NRF_I2S_INT_STOPPED_MASK); + nrf_i2s_disable(NRF_I2S); + + // When stopped, release all buffers, including these scheduled for + // the next transfer. + m_cb.handler(&m_cb.current_buffers, 0); + m_cb.handler(&m_cb.next_buffers, 0); + + m_cb.state = NRFX_DRV_STATE_INITIALIZED; + NRFX_LOG_INFO("Stopped."); + } + else + { + // Check if the requested transfer has been completed: + // - full-duplex mode + if ((m_cb.use_tx && m_cb.use_rx && m_cb.tx_ready && m_cb.rx_ready) || + // - TX only mode + (!m_cb.use_rx && m_cb.tx_ready) || + // - RX only mode + (!m_cb.use_tx && m_cb.rx_ready)) + { + m_cb.tx_ready = false; + m_cb.rx_ready = false; + + // If the application did not supply the buffers for the next + // part of the transfer until this moment, the current buffers + // cannot be released, since the I2S peripheral already started + // using them. Signal this situation to the application by + // passing NULL instead of the structure with released buffers. + if (m_cb.buffers_reused) + { + m_cb.buffers_reused = false; + // This will most likely be set at this point. However, there is + // a small time window between TXPTRUPD and RXPTRUPD events, + // and it is theoretically possible that next buffers will be + // set in this window, so to be sure this flag is set to true, + // set it explicitly. + m_cb.buffers_needed = true; + m_cb.handler(NULL, + NRFX_I2S_STATUS_NEXT_BUFFERS_NEEDED); + } + else + { + // Buffers that have been used by the I2S peripheral (current) + // are now released and will be returned to the application, + // and the ones scheduled to be used as next become the current + // ones. + nrfx_i2s_buffers_t released_buffers = m_cb.current_buffers; + m_cb.current_buffers = m_cb.next_buffers; + m_cb.next_buffers.p_rx_buffer = NULL; + m_cb.next_buffers.p_tx_buffer = NULL; + m_cb.buffers_needed = true; + m_cb.handler(&released_buffers, + NRFX_I2S_STATUS_NEXT_BUFFERS_NEEDED); + } + + } + } +} + +#endif // NRFX_CHECK(NRFX_I2S_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_lpcomp.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_lpcomp.c new file mode 100644 index 0000000000..024eda6614 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_lpcomp.c @@ -0,0 +1,174 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_LPCOMP_ENABLED) + +#include +#include "prs/nrfx_prs.h" + +#define NRFX_LOG_MODULE LPCOMP +#include + +#define EVT_TO_STR(event) \ + (event == NRF_LPCOMP_EVENT_READY ? "NRF_LPCOMP_EVENT_READY" : \ + (event == NRF_LPCOMP_EVENT_DOWN ? "NRF_LPCOMP_EVENT_DOWN" : \ + (event == NRF_LPCOMP_EVENT_UP ? "NRF_LPCOMP_EVENT_UP" : \ + (event == NRF_LPCOMP_EVENT_CROSS ? "NRF_LPCOMP_EVENT_CROSS" : \ + "UNKNOWN EVENT")))) + + +static nrfx_lpcomp_event_handler_t m_lpcomp_event_handler = NULL; +static nrfx_drv_state_t m_state = NRFX_DRV_STATE_UNINITIALIZED; + +static void lpcomp_execute_handler(nrf_lpcomp_event_t event, uint32_t event_mask) +{ + if (nrf_lpcomp_event_check(event) && nrf_lpcomp_int_enable_check(event_mask)) + { + nrf_lpcomp_event_clear(event); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(event)); + + m_lpcomp_event_handler(event); + } +} + +void nrfx_lpcomp_irq_handler(void) +{ + lpcomp_execute_handler(NRF_LPCOMP_EVENT_READY, LPCOMP_INTENSET_READY_Msk); + lpcomp_execute_handler(NRF_LPCOMP_EVENT_DOWN, LPCOMP_INTENSET_DOWN_Msk); + lpcomp_execute_handler(NRF_LPCOMP_EVENT_UP, LPCOMP_INTENSET_UP_Msk); + lpcomp_execute_handler(NRF_LPCOMP_EVENT_CROSS, LPCOMP_INTENSET_CROSS_Msk); +} + +nrfx_err_t nrfx_lpcomp_init(nrfx_lpcomp_config_t const * p_config, + nrfx_lpcomp_event_handler_t event_handler) +{ + NRFX_ASSERT(p_config); + NRFX_ASSERT(event_handler); + nrfx_err_t err_code; + + if (m_state != NRFX_DRV_STATE_UNINITIALIZED) + { // LPCOMP driver is already initialized + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + m_lpcomp_event_handler = event_handler; + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + if (nrfx_prs_acquire(NRF_LPCOMP, nrfx_lpcomp_irq_handler) != NRFX_SUCCESS) + { + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } +#endif + + nrf_lpcomp_configure(&(p_config->hal)); + + nrf_lpcomp_input_select(p_config->input); + + switch (p_config->hal.detection) + { + case NRF_LPCOMP_DETECT_UP: + nrf_lpcomp_int_enable(LPCOMP_INTENSET_UP_Msk); + break; + + case NRF_LPCOMP_DETECT_DOWN: + nrf_lpcomp_int_enable(LPCOMP_INTENSET_DOWN_Msk); + break; + + case NRF_LPCOMP_DETECT_CROSS: + nrf_lpcomp_int_enable(LPCOMP_INTENSET_CROSS_Msk); + break; + + default: + break; + } + nrf_lpcomp_shorts_enable(NRF_LPCOMP_SHORT_READY_SAMPLE_MASK); + + NRFX_IRQ_PRIORITY_SET(LPCOMP_IRQn, p_config->interrupt_priority); + NRFX_IRQ_ENABLE(LPCOMP_IRQn); + + m_state = NRFX_DRV_STATE_INITIALIZED; + + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +void nrfx_lpcomp_uninit(void) +{ + NRFX_ASSERT(m_state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_IRQ_DISABLE(LPCOMP_IRQn); + nrfx_lpcomp_disable(); +#if NRFX_CHECK(NRFX_PRS_ENABLED) + nrfx_prs_release(NRF_LPCOMP); +#endif + m_state = NRFX_DRV_STATE_UNINITIALIZED; + m_lpcomp_event_handler = NULL; + NRFX_LOG_INFO("Uninitialized."); +} + +void nrfx_lpcomp_enable(void) +{ + NRFX_ASSERT(m_state == NRFX_DRV_STATE_INITIALIZED); + nrf_lpcomp_enable(); + nrf_lpcomp_task_trigger(NRF_LPCOMP_TASK_START); + m_state = NRFX_DRV_STATE_POWERED_ON; + NRFX_LOG_INFO("Enabled."); +} + +void nrfx_lpcomp_disable(void) +{ + NRFX_ASSERT(m_state == NRFX_DRV_STATE_POWERED_ON); + nrf_lpcomp_disable(); + nrf_lpcomp_task_trigger(NRF_LPCOMP_TASK_STOP); + m_state = NRFX_DRV_STATE_INITIALIZED; + NRFX_LOG_INFO("Disabled."); +} + +#endif // NRFX_CHECK(NRFX_LPCOMP_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_pdm.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_pdm.c new file mode 100644 index 0000000000..db0945e7ca --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_pdm.c @@ -0,0 +1,370 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_PDM_ENABLED) + +#include +#include + +#define NRFX_LOG_MODULE PDM +#include + +#define EVT_TO_STR(event) \ + (event == NRF_PDM_EVENT_STARTED ? "NRF_PDM_EVENT_STARTED" : \ + (event == NRF_PDM_EVENT_STOPPED ? "NRF_PDM_EVENT_STOPPED" : \ + (event == NRF_PDM_EVENT_END ? "NRF_PDM_EVENT_END" : \ + "UNKNOWN EVENT"))) + + +/** @brief PDM interface status. */ +typedef enum +{ + NRFX_PDM_STATE_IDLE, + NRFX_PDM_STATE_RUNNING, + NRFX_PDM_STATE_STARTING, + NRFX_PDM_STATE_STOPPING +} nrfx_pdm_state_t; + +/** @brief PDM interface control block.*/ +typedef struct +{ + nrfx_pdm_event_handler_t event_handler; ///< Event handler function pointer. + int16_t * buff_address[2]; ///< Sample buffers. + uint16_t buff_length[2]; ///< Length of the sample buffers. + nrfx_drv_state_t drv_state; ///< Driver state. + volatile nrfx_pdm_state_t op_state; ///< PDM peripheral operation state. + uint8_t active_buffer; ///< Number of currently active buffer. + uint8_t error; ///< Driver error flag. + volatile uint8_t irq_buff_request; ///< Request the next buffer in the ISR. +} nrfx_pdm_cb_t; + +static nrfx_pdm_cb_t m_cb; + + +void nrfx_pdm_irq_handler(void) +{ + if (nrf_pdm_event_check(NRF_PDM_EVENT_STARTED)) + { + nrf_pdm_event_clear(NRF_PDM_EVENT_STARTED); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_PDM_EVENT_STARTED)); + + uint8_t finished_buffer = m_cb.active_buffer; + + // Check if the next buffer was set before. + uint8_t next_buffer = (~m_cb.active_buffer) & 0x01; + if (m_cb.buff_address[next_buffer] || + m_cb.op_state == NRFX_PDM_STATE_STARTING) + { + nrfx_pdm_evt_t evt; + evt.error = NRFX_PDM_NO_ERROR; + m_cb.error = 0; + + // Release the full buffer if ready and request the next one. + if (m_cb.op_state == NRFX_PDM_STATE_STARTING) + { + evt.buffer_released = 0; + m_cb.op_state = NRFX_PDM_STATE_RUNNING; + } + else + { + evt.buffer_released = m_cb.buff_address[finished_buffer]; + m_cb.buff_address[finished_buffer] = 0; + m_cb.active_buffer = next_buffer; + } + evt.buffer_requested = true; + m_cb.event_handler(&evt); + } + else + { + // No next buffer available. Report an error. + // Do not request the new buffer as it was already done. + if (m_cb.error == 0) + { + nrfx_pdm_evt_t const evt = { + .buffer_requested = false, + .buffer_released = NULL, + .error = NRFX_PDM_ERROR_OVERFLOW + }; + m_cb.error = 1; + m_cb.event_handler(&evt); + } + } + + if (m_cb.op_state == NRFX_PDM_STATE_STARTING) + { + m_cb.op_state = NRFX_PDM_STATE_RUNNING; + } + } + else if (nrf_pdm_event_check(NRF_PDM_EVENT_STOPPED)) + { + nrf_pdm_event_clear(NRF_PDM_EVENT_STOPPED); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_PDM_EVENT_STOPPED)); + nrf_pdm_disable(); + m_cb.op_state = NRFX_PDM_STATE_IDLE; + + // Release the buffers. + nrfx_pdm_evt_t evt; + evt.error = NRFX_PDM_NO_ERROR; + evt.buffer_requested = false; + if (m_cb.buff_address[m_cb.active_buffer]) + { + evt.buffer_released = m_cb.buff_address[m_cb.active_buffer]; + m_cb.buff_address[m_cb.active_buffer] = 0; + m_cb.event_handler(&evt); + } + + uint8_t second_buffer = (~m_cb.active_buffer) & 0x01; + if (m_cb.buff_address[second_buffer]) + { + evt.buffer_released = m_cb.buff_address[second_buffer]; + m_cb.buff_address[second_buffer] = 0; + m_cb.event_handler(&evt); + } + m_cb.active_buffer = 0; + } + + if (m_cb.irq_buff_request) + { + nrfx_pdm_evt_t const evt = + { + .buffer_requested = true, + .buffer_released = NULL, + .error = NRFX_PDM_NO_ERROR, + }; + m_cb.irq_buff_request = 0; + m_cb.event_handler(&evt); + } +} + + +nrfx_err_t nrfx_pdm_init(nrfx_pdm_config_t const * p_config, + nrfx_pdm_event_handler_t event_handler) +{ + NRFX_ASSERT(p_config); + NRFX_ASSERT(event_handler); + nrfx_err_t err_code; + + if (m_cb.drv_state != NRFX_DRV_STATE_UNINITIALIZED) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + if (p_config->gain_l > NRF_PDM_GAIN_MAXIMUM || + p_config->gain_r > NRF_PDM_GAIN_MAXIMUM) + { + err_code = NRFX_ERROR_INVALID_PARAM; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + m_cb.buff_address[0] = 0; + m_cb.buff_address[1] = 0; + m_cb.active_buffer = 0; + m_cb.error = 0; + m_cb.event_handler = event_handler; + m_cb.op_state = NRFX_PDM_STATE_IDLE; + + nrf_pdm_clock_set(p_config->clock_freq); + nrf_pdm_mode_set(p_config->mode, p_config->edge); + nrf_pdm_gain_set(p_config->gain_l, p_config->gain_r); + + nrf_gpio_cfg_output(p_config->pin_clk); + nrf_gpio_pin_clear(p_config->pin_clk); + nrf_gpio_cfg_input(p_config->pin_din, NRF_GPIO_PIN_NOPULL); + nrf_pdm_psel_connect(p_config->pin_clk, p_config->pin_din); + + nrf_pdm_event_clear(NRF_PDM_EVENT_STARTED); + nrf_pdm_event_clear(NRF_PDM_EVENT_END); + nrf_pdm_event_clear(NRF_PDM_EVENT_STOPPED); + nrf_pdm_int_enable(NRF_PDM_INT_STARTED | NRF_PDM_INT_STOPPED); + NRFX_IRQ_PRIORITY_SET(PDM_IRQn, p_config->interrupt_priority); + NRFX_IRQ_ENABLE(PDM_IRQn); + m_cb.drv_state = NRFX_DRV_STATE_INITIALIZED; + + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +void nrfx_pdm_uninit(void) +{ + nrf_pdm_disable(); + nrf_pdm_psel_disconnect(); + m_cb.drv_state = NRFX_DRV_STATE_UNINITIALIZED; + NRFX_LOG_INFO("Uninitialized."); +} + +static void pdm_start() +{ + m_cb.drv_state = NRFX_DRV_STATE_POWERED_ON; + nrf_pdm_enable(); + nrf_pdm_event_clear(NRF_PDM_EVENT_STARTED); + nrf_pdm_task_trigger(NRF_PDM_TASK_START); +} + +static void pdm_buf_request() +{ + m_cb.irq_buff_request = 1; + NRFX_IRQ_PENDING_SET(PDM_IRQn); +} + +nrfx_err_t nrfx_pdm_start(void) +{ + NRFX_ASSERT(m_cb.drv_state != NRFX_DRV_STATE_UNINITIALIZED); + nrfx_err_t err_code; + + if (m_cb.op_state != NRFX_PDM_STATE_IDLE) + { + if (m_cb.op_state == NRFX_PDM_STATE_RUNNING) + { + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + m_cb.op_state = NRFX_PDM_STATE_STARTING; + pdm_buf_request(); + + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +nrfx_err_t nrfx_pdm_buffer_set(int16_t * buffer, uint16_t buffer_length) +{ + if (m_cb.drv_state == NRFX_DRV_STATE_UNINITIALIZED) + { + return NRFX_ERROR_INVALID_STATE; + } + if (m_cb.op_state == NRFX_PDM_STATE_STOPPING) + { + return NRFX_ERROR_BUSY; + } + if ((buffer == NULL) || (buffer_length > NRFX_PDM_MAX_BUFFER_SIZE)) + { + return NRFX_ERROR_INVALID_PARAM; + } + + nrfx_err_t err_code = NRFX_SUCCESS; + + // Enter the PDM critical section. + NRFX_IRQ_DISABLE(PDM_IRQn); + + uint8_t next_buffer = (~m_cb.active_buffer) & 0x01; + if (m_cb.op_state == NRFX_PDM_STATE_STARTING) + { + next_buffer = 0; + } + + if (m_cb.buff_address[next_buffer]) + { + // Buffer already set. + err_code = NRFX_ERROR_BUSY; + } + else + { + m_cb.buff_address[next_buffer] = buffer; + m_cb.buff_length[next_buffer] = buffer_length; + nrf_pdm_buffer_set((uint32_t *)buffer, buffer_length); + + if (m_cb.drv_state != NRFX_DRV_STATE_POWERED_ON) + { + pdm_start(); + } + } + + NRFX_IRQ_ENABLE(PDM_IRQn); + return err_code; +} + +nrfx_err_t nrfx_pdm_stop(void) +{ + NRFX_ASSERT(m_cb.drv_state != NRFX_DRV_STATE_UNINITIALIZED); + nrfx_err_t err_code; + + if (m_cb.op_state != NRFX_PDM_STATE_RUNNING) + { + if (m_cb.op_state == NRFX_PDM_STATE_IDLE || + m_cb.op_state == NRFX_PDM_STATE_STARTING) + { + nrf_pdm_disable(); + m_cb.op_state = NRFX_PDM_STATE_IDLE; + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + m_cb.drv_state = NRFX_DRV_STATE_INITIALIZED; + m_cb.op_state = NRFX_PDM_STATE_STOPPING; + + nrf_pdm_task_trigger(NRF_PDM_TASK_STOP); + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +#endif // NRFX_CHECK(NRFX_PDM_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_power.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_power.c new file mode 100644 index 0000000000..d861951c51 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_power.c @@ -0,0 +1,306 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_POWER_ENABLED) + +#include + +#if NRFX_CHECK(NRFX_CLOCK_ENABLED) +extern bool nrfx_clock_irq_enabled; +#endif + +/** + * @internal + * @defgroup nrfx_power_internals POWER driver internals + * @ingroup nrfx_power + * + * Internal variables, auxiliary macros and functions of POWER driver. + * @{ + */ + +/** + * This variable is used to check whether common POWER_CLOCK common interrupt + * should be disabled or not if @ref nrfx_clock tries to disable the interrupt. + */ + +bool nrfx_power_irq_enabled; + +/** + * @brief The initialization flag + */ + +#define m_initialized nrfx_power_irq_enabled + +/** + * @brief The handler of power fail comparator warning event + */ +static nrfx_power_pofwarn_event_handler_t m_pofwarn_handler; + +#if NRF_POWER_HAS_SLEEPEVT || defined(__NRFX_DOXYGEN__) +/** + * @brief The handler of sleep event handler + */ +static nrfx_power_sleep_event_handler_t m_sleepevt_handler; +#endif + +#if NRF_POWER_HAS_USBREG || defined(__NRFX_DOXYGEN__) +/** + * @brief The handler of USB power events + */ +static nrfx_power_usb_event_handler_t m_usbevt_handler; +#endif + +/** @} */ + +nrfx_power_pofwarn_event_handler_t nrfx_power_pof_handler_get(void) +{ + return m_pofwarn_handler; +} + +#if NRF_POWER_HAS_USBREG +nrfx_power_usb_event_handler_t nrfx_power_usb_handler_get(void) +{ + return m_usbevt_handler; +} +#endif + +nrfx_err_t nrfx_power_init(nrfx_power_config_t const * p_config) +{ + NRFX_ASSERT(p_config); + if (m_initialized) + { + return NRFX_ERROR_ALREADY_INITIALIZED; + } + +#if NRF_POWER_HAS_VDDH + nrf_power_dcdcen_vddh_set(p_config->dcdcenhv); +#endif + nrf_power_dcdcen_set(p_config->dcdcen); + + nrfx_power_clock_irq_init(); + + m_initialized = true; + return NRFX_SUCCESS; +} + + +void nrfx_power_uninit(void) +{ + NRFX_ASSERT(m_initialized); + +#if NRFX_CHECK(NRFX_CLOCK_ENABLED) + if (!nrfx_clock_irq_enabled) +#endif + { + NRFX_IRQ_DISABLE(POWER_CLOCK_IRQn); + } + + nrfx_power_pof_uninit(); +#if NRF_POWER_HAS_SLEEPEVT || defined(__NRFX_DOXYGEN__) + nrfx_power_sleepevt_uninit(); +#endif +#if NRF_POWER_HAS_USBREG || defined(__NRFX_DOXYGEN__) + nrfx_power_usbevt_uninit(); +#endif + m_initialized = false; +} + +void nrfx_power_pof_init(nrfx_power_pofwarn_config_t const * p_config) +{ + NRFX_ASSERT(p_config != NULL); + + nrfx_power_pof_uninit(); + + if (p_config->handler != NULL) + { + m_pofwarn_handler = p_config->handler; + } +} + +void nrfx_power_pof_enable(nrfx_power_pofwarn_config_t const * p_config) +{ + nrf_power_pofcon_set(true, p_config->thr); +#if NRF_POWER_HAS_VDDH || defined(__NRFX_DOXYGEN__) + nrf_power_pofcon_vddh_set(p_config->thrvddh); +#endif + if (m_pofwarn_handler != NULL) + { + nrf_power_int_enable(NRF_POWER_INT_POFWARN_MASK); + } +} + +void nrfx_power_pof_disable(void) +{ + nrf_power_int_disable(NRF_POWER_INT_POFWARN_MASK); +} + +void nrfx_power_pof_uninit(void) +{ + m_pofwarn_handler = NULL; +} + +#if NRF_POWER_HAS_SLEEPEVT || defined(__NRFX_DOXYGEN__) +void nrfx_power_sleepevt_init(nrfx_power_sleepevt_config_t const * p_config) +{ + NRFX_ASSERT(p_config != NULL); + + nrfx_power_sleepevt_uninit(); + if (p_config->handler != NULL) + { + m_sleepevt_handler = p_config->handler; + } +} + +void nrfx_power_sleepevt_enable(nrfx_power_sleepevt_config_t const * p_config) +{ + uint32_t enmask = 0; + if (p_config->en_enter) + { + enmask |= NRF_POWER_INT_SLEEPENTER_MASK; + nrf_power_event_clear(NRF_POWER_EVENT_SLEEPENTER); + } + if (p_config->en_exit) + { + enmask |= NRF_POWER_INT_SLEEPEXIT_MASK; + nrf_power_event_clear(NRF_POWER_EVENT_SLEEPEXIT); + } + nrf_power_int_enable(enmask); +} + +void nrfx_power_sleepevt_disable(void) +{ + nrf_power_int_disable( + NRF_POWER_INT_SLEEPENTER_MASK | + NRF_POWER_INT_SLEEPEXIT_MASK); +} + +void nrfx_power_sleepevt_uninit(void) +{ + m_sleepevt_handler = NULL; +} +#endif /* NRF_POWER_HAS_SLEEPEVT */ + +#if NRF_POWER_HAS_USBREG || defined(__NRFX_DOXYGEN__) +void nrfx_power_usbevt_init(nrfx_power_usbevt_config_t const * p_config) +{ + nrfx_power_usbevt_uninit(); + if (p_config->handler != NULL) + { + m_usbevt_handler = p_config->handler; + } +} + +void nrfx_power_usbevt_enable(void) +{ + nrf_power_int_enable( + NRF_POWER_INT_USBDETECTED_MASK | + NRF_POWER_INT_USBREMOVED_MASK | + NRF_POWER_INT_USBPWRRDY_MASK); +} + +void nrfx_power_usbevt_disable(void) +{ + nrf_power_int_disable( + NRF_POWER_INT_USBDETECTED_MASK | + NRF_POWER_INT_USBREMOVED_MASK | + NRF_POWER_INT_USBPWRRDY_MASK); +} + +void nrfx_power_usbevt_uninit(void) +{ + m_usbevt_handler = NULL; +} +#endif /* NRF_POWER_HAS_USBREG */ + + +void nrfx_power_irq_handler(void) +{ + uint32_t enabled = nrf_power_int_enable_get(); + if ((0 != (enabled & NRF_POWER_INT_POFWARN_MASK)) && + nrf_power_event_get_and_clear(NRF_POWER_EVENT_POFWARN)) + { + /* Cannot be null if event is enabled */ + NRFX_ASSERT(m_pofwarn_handler != NULL); + m_pofwarn_handler(); + } +#if NRF_POWER_HAS_SLEEPEVT || defined(__NRFX_DOXYGEN__) + if ((0 != (enabled & NRF_POWER_INT_SLEEPENTER_MASK)) && + nrf_power_event_get_and_clear(NRF_POWER_EVENT_SLEEPENTER)) + { + /* Cannot be null if event is enabled */ + NRFX_ASSERT(m_sleepevt_handler != NULL); + m_sleepevt_handler(NRFX_POWER_SLEEP_EVT_ENTER); + } + if ((0 != (enabled & NRF_POWER_INT_SLEEPEXIT_MASK)) && + nrf_power_event_get_and_clear(NRF_POWER_EVENT_SLEEPEXIT)) + { + /* Cannot be null if event is enabled */ + NRFX_ASSERT(m_sleepevt_handler != NULL); + m_sleepevt_handler(NRFX_POWER_SLEEP_EVT_EXIT); + } +#endif +#if NRF_POWER_HAS_USBREG || defined(__NRFX_DOXYGEN__) + if ((0 != (enabled & NRF_POWER_INT_USBDETECTED_MASK)) && + nrf_power_event_get_and_clear(NRF_POWER_EVENT_USBDETECTED)) + { + /* Cannot be null if event is enabled */ + NRFX_ASSERT(m_usbevt_handler != NULL); + m_usbevt_handler(NRFX_POWER_USB_EVT_DETECTED); + } + if ((0 != (enabled & NRF_POWER_INT_USBREMOVED_MASK)) && + nrf_power_event_get_and_clear(NRF_POWER_EVENT_USBREMOVED)) + { + /* Cannot be null if event is enabled */ + NRFX_ASSERT(m_usbevt_handler != NULL); + m_usbevt_handler(NRFX_POWER_USB_EVT_REMOVED); + } + if ((0 != (enabled & NRF_POWER_INT_USBPWRRDY_MASK)) && + nrf_power_event_get_and_clear(NRF_POWER_EVENT_USBPWRRDY)) + { + /* Cannot be null if event is enabled */ + NRFX_ASSERT(m_usbevt_handler != NULL); + m_usbevt_handler(NRFX_POWER_USB_EVT_READY); + } +#endif +} + +#endif // NRFX_CHECK(NRFX_POWER_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_power_clock.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_power_clock.c new file mode 100644 index 0000000000..ff69bf7145 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_power_clock.c @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include +#include +#include + + +#if NRFX_CHECK(NRFX_POWER_ENABLED) && NRFX_CHECK(NRFX_CLOCK_ENABLED) +void nrfx_power_clock_irq_handler(void) +{ + nrfx_power_irq_handler(); + nrfx_clock_irq_handler(); +} +#endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_ppi.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_ppi.c new file mode 100644 index 0000000000..067ba18d6e --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_ppi.c @@ -0,0 +1,534 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_PPI_ENABLED) + +#include + +#define NRFX_LOG_MODULE_NAME PPI +#include + + +static uint32_t m_channels_allocated; /**< Bitmap representing channels availability. 1 when a channel is allocated, 0 otherwise. */ +static uint8_t m_groups_allocated; /**< Bitmap representing groups availability. 1 when a group is allocated, 0 otherwise.*/ + + +/** + * @brief Compute a group mask (needed for driver internals, not used for NRF_PPI registers). + * + * @param[in] group Group number to transform to a mask. + * + * @retval Group mask. + */ +__STATIC_INLINE uint32_t group_to_mask(nrf_ppi_channel_group_t group) +{ + return (1uL << (uint32_t) group); +} + + +/** + * @brief Check whether a channel is a programmable channel and can be used by an application. + * + * @param[in] channel Channel to check. + * + * @retval true The channel is a programmable application channel. + * @retval false The channel is used by a stack (for example SoftDevice) or is preprogrammed. + */ +__STATIC_INLINE bool is_programmable_app_channel(nrf_ppi_channel_t channel) +{ + return ((NRFX_PPI_PROG_APP_CHANNELS_MASK & nrfx_ppi_channel_to_mask(channel)) != 0); +} + + +/** + * @brief Check whether channels can be used by an application. + * + * @param[in] channel_mask Channel mask to check. + * + * @retval true All specified channels can be used by an application. + * @retval false At least one specified channel is used by a stack (for example SoftDevice). + */ +__STATIC_INLINE bool are_app_channels(uint32_t channel_mask) +{ + //lint -e(587) + return ((~(NRFX_PPI_ALL_APP_CHANNELS_MASK) & channel_mask) == 0); +} + + +/** + * @brief Check whether a channel can be used by an application. + * + * @param[in] channel Channel to check. + * + * @retval true The channel can be used by an application. + * @retval false The channel is used by a stack (for example SoftDevice). + */ +__STATIC_INLINE bool is_app_channel(nrf_ppi_channel_t channel) +{ + return are_app_channels(nrfx_ppi_channel_to_mask(channel)); +} + + +/** + * @brief Check whether a channel group can be used by an application. + * + * @param[in] group Group to check. + * + * @retval true The group is an application group. + * @retval false The group is not an application group (this group either does not exist or + * it is used by a stack (for example SoftDevice)). + */ +__STATIC_INLINE bool is_app_group(nrf_ppi_channel_group_t group) +{ + return ((NRFX_PPI_ALL_APP_GROUPS_MASK & group_to_mask(group)) != 0); +} + + +/** + * @brief Check whether a channel is allocated. + * + * @param[in] channel_num Channel number to check. + * + * @retval true The channel is allocated. + * @retval false The channel is not allocated. + */ +__STATIC_INLINE bool is_allocated_channel(nrf_ppi_channel_t channel) +{ + return ((m_channels_allocated & nrfx_ppi_channel_to_mask(channel)) != 0); +} + + +/** + * @brief Set channel allocated indication. + * + * @param[in] channel_num Specifies the channel to set the "allocated" indication. + */ +__STATIC_INLINE void channel_allocated_set(nrf_ppi_channel_t channel) +{ + m_channels_allocated |= nrfx_ppi_channel_to_mask(channel); +} + + +/** + * @brief Clear channel allocated indication. + * + * @param[in] channel_num Specifies the channel to clear the "allocated" indication. + */ +__STATIC_INLINE void channel_allocated_clr(nrf_ppi_channel_t channel) +{ + m_channels_allocated &= ~nrfx_ppi_channel_to_mask(channel); +} + + +/** + * @brief Clear all allocated channels. + */ +__STATIC_INLINE void channel_allocated_clr_all(void) +{ + m_channels_allocated &= ~NRFX_PPI_ALL_APP_CHANNELS_MASK; +} + + +/** + * @brief Check whether a group is allocated. + * + * @param[in] group_num Group number to check. + * + * @retval true The group is allocated. + * false The group is not allocated. + */ +__STATIC_INLINE bool is_allocated_group(nrf_ppi_channel_group_t group) +{ + return ((m_groups_allocated & group_to_mask(group)) != 0); +} + + +/** + * @brief Set group allocated indication. + * + * @param[in] group_num Specifies the group to set the "allocated" indication. + */ +__STATIC_INLINE void group_allocated_set(nrf_ppi_channel_group_t group) +{ + m_groups_allocated |= group_to_mask(group); +} + + +/** + * @brief Clear group allocated indication. + * + * @param[in] group_num Specifies the group to clear the "allocated" indication. + */ +__STATIC_INLINE void group_allocated_clr(nrf_ppi_channel_group_t group) +{ + m_groups_allocated &= ~group_to_mask(group); +} + + +/** + * @brief Clear all allocated groups. + */ +__STATIC_INLINE void group_allocated_clr_all() +{ + m_groups_allocated &= ~NRFX_PPI_ALL_APP_GROUPS_MASK; +} + + +void nrfx_ppi_free_all(void) +{ + uint32_t mask = NRFX_PPI_ALL_APP_GROUPS_MASK; + nrf_ppi_channel_group_t group; + + // Disable all channels and groups + nrf_ppi_channels_disable(NRFX_PPI_ALL_APP_CHANNELS_MASK); + + for (group = NRF_PPI_CHANNEL_GROUP0; mask != 0; mask &= ~group_to_mask(group), group++) + { + if (mask & group_to_mask(group)) + { + nrf_ppi_channel_group_clear(group); + } + } + channel_allocated_clr_all(); + group_allocated_clr_all(); +} + + +nrfx_err_t nrfx_ppi_channel_alloc(nrf_ppi_channel_t * p_channel) +{ + nrfx_err_t err_code = NRFX_SUCCESS; + nrf_ppi_channel_t channel; + uint32_t mask = 0; + err_code = NRFX_ERROR_NO_MEM; + + mask = NRFX_PPI_PROG_APP_CHANNELS_MASK; + for (channel = NRF_PPI_CHANNEL0; + mask != 0; + mask &= ~nrfx_ppi_channel_to_mask(channel), channel++) + { + NRFX_CRITICAL_SECTION_ENTER(); + if ((mask & nrfx_ppi_channel_to_mask(channel)) && (!is_allocated_channel(channel))) + { + channel_allocated_set(channel); + *p_channel = channel; + err_code = NRFX_SUCCESS; + } + NRFX_CRITICAL_SECTION_EXIT(); + if (err_code == NRFX_SUCCESS) + { + NRFX_LOG_INFO("Allocated channel: %d.", channel); + break; + } + } + + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + + +nrfx_err_t nrfx_ppi_channel_free(nrf_ppi_channel_t channel) +{ + nrfx_err_t err_code = NRFX_SUCCESS; + + if (!is_programmable_app_channel(channel)) + { + err_code = NRFX_ERROR_INVALID_PARAM; + } + else + { + // First disable this channel + nrf_ppi_channel_disable(channel); + NRFX_CRITICAL_SECTION_ENTER(); + channel_allocated_clr(channel); + NRFX_CRITICAL_SECTION_EXIT(); + } + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + + +nrfx_err_t nrfx_ppi_channel_assign(nrf_ppi_channel_t channel, uint32_t eep, uint32_t tep) +{ + if ((uint32_t *)eep == NULL || (uint32_t *)tep == NULL) + { + return NRFX_ERROR_NULL; + } + + nrfx_err_t err_code = NRFX_SUCCESS; + + if (!is_programmable_app_channel(channel)) + { + err_code = NRFX_ERROR_INVALID_PARAM; + } + else if (!is_allocated_channel(channel)) + { + err_code = NRFX_ERROR_INVALID_STATE; + } + else + { + nrf_ppi_channel_endpoint_setup(channel, eep, tep); + NRFX_LOG_INFO("Assigned channel: %d, event end point: %x, task end point: %x.", + channel, + eep, + tep); + } + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +nrfx_err_t nrfx_ppi_channel_fork_assign(nrf_ppi_channel_t channel, uint32_t fork_tep) +{ + nrfx_err_t err_code = NRFX_SUCCESS; +#ifdef PPI_FEATURE_FORKS_PRESENT + if (!is_programmable_app_channel(channel)) + { + err_code = NRFX_ERROR_INVALID_PARAM; + } + else if (!is_allocated_channel(channel)) + { + err_code = NRFX_ERROR_INVALID_STATE; + } + else + { + nrf_ppi_fork_endpoint_setup(channel, fork_tep); + NRFX_LOG_INFO("Fork assigned channel: %d, task end point: %d.", channel, fork_tep); + } + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +#else + err_code = NRFX_ERROR_NOT_SUPPORTED; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +#endif +} + +nrfx_err_t nrfx_ppi_channel_enable(nrf_ppi_channel_t channel) +{ + nrfx_err_t err_code = NRFX_SUCCESS; + + if (!is_app_channel(channel)) + { + err_code = NRFX_ERROR_INVALID_PARAM; + } + else if (is_programmable_app_channel(channel) && !is_allocated_channel(channel)) + { + err_code = NRFX_ERROR_INVALID_STATE; + } + else + { + nrf_ppi_channel_enable(channel); + } + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + + +nrfx_err_t nrfx_ppi_channel_disable(nrf_ppi_channel_t channel) +{ + nrfx_err_t err_code = NRFX_SUCCESS; + + if (!is_app_channel(channel)) + { + err_code = NRFX_ERROR_INVALID_PARAM; + } + else if (is_programmable_app_channel(channel) && !is_allocated_channel(channel)) + { + err_code = NRFX_ERROR_INVALID_STATE; + } + else + { + nrf_ppi_channel_disable(channel); + err_code = NRFX_SUCCESS; + } + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + + +nrfx_err_t nrfx_ppi_group_alloc(nrf_ppi_channel_group_t * p_group) +{ + nrfx_err_t err_code; + uint32_t mask = 0; + nrf_ppi_channel_group_t group; + + err_code = NRFX_ERROR_NO_MEM; + + mask = NRFX_PPI_ALL_APP_GROUPS_MASK; + for (group = NRF_PPI_CHANNEL_GROUP0; mask != 0; mask &= ~group_to_mask(group), group++) + { + NRFX_CRITICAL_SECTION_ENTER(); + if ((mask & group_to_mask(group)) && (!is_allocated_group(group))) + { + group_allocated_set(group); + *p_group = group; + err_code = NRFX_SUCCESS; + } + NRFX_CRITICAL_SECTION_EXIT(); + if (err_code == NRFX_SUCCESS) + { + NRFX_LOG_INFO("Allocated group: %d.", group); + break; + } + } + + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + + +nrfx_err_t nrfx_ppi_group_free(nrf_ppi_channel_group_t group) +{ + nrfx_err_t err_code = NRFX_SUCCESS; + + if (!is_app_group(group)) + { + err_code = NRFX_ERROR_INVALID_PARAM; + } + if (!is_allocated_group(group)) + { + err_code = NRFX_ERROR_INVALID_STATE; + } + else + { + nrf_ppi_group_disable(group); + NRFX_CRITICAL_SECTION_ENTER(); + group_allocated_clr(group); + NRFX_CRITICAL_SECTION_EXIT(); + } + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + + +nrfx_err_t nrfx_ppi_group_enable(nrf_ppi_channel_group_t group) +{ + nrfx_err_t err_code = NRFX_SUCCESS; + + if (!is_app_group(group)) + { + err_code = NRFX_ERROR_INVALID_PARAM; + } + else if (!is_allocated_group(group)) + { + err_code = NRFX_ERROR_INVALID_STATE; + } + else + { + nrf_ppi_group_enable(group); + } + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + + +nrfx_err_t nrfx_ppi_group_disable(nrf_ppi_channel_group_t group) +{ + nrfx_err_t err_code = NRFX_SUCCESS; + + if (!is_app_group(group)) + { + err_code = NRFX_ERROR_INVALID_PARAM; + } + else + { + nrf_ppi_group_disable(group); + } + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +nrfx_err_t nrfx_ppi_channels_remove_from_group(uint32_t channel_mask, + nrf_ppi_channel_group_t group) +{ + nrfx_err_t err_code = NRFX_SUCCESS; + + if (!is_app_group(group)) + { + err_code = NRFX_ERROR_INVALID_PARAM; + } + else if (!is_allocated_group(group)) + { + err_code = NRFX_ERROR_INVALID_STATE; + } + else if (!are_app_channels(channel_mask)) + { + err_code = NRFX_ERROR_INVALID_PARAM; + } + else + { + NRFX_CRITICAL_SECTION_ENTER(); + nrf_ppi_channels_remove_from_group(channel_mask, group); + NRFX_CRITICAL_SECTION_EXIT(); + } + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +nrfx_err_t nrfx_ppi_channels_include_in_group(uint32_t channel_mask, + nrf_ppi_channel_group_t group) +{ + nrfx_err_t err_code = NRFX_SUCCESS; + + if (!is_app_group(group)) + { + err_code = NRFX_ERROR_INVALID_PARAM; + } + else if (!is_allocated_group(group)) + { + err_code = NRFX_ERROR_INVALID_STATE; + } + else if (!are_app_channels(channel_mask)) + { + err_code = NRFX_ERROR_INVALID_PARAM; + } + else + { + NRFX_CRITICAL_SECTION_ENTER(); + nrf_ppi_channels_include_in_group(channel_mask, group); + NRFX_CRITICAL_SECTION_EXIT(); + } + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} +#endif // NRFX_CHECK(NRFX_PPI_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/pwm/nrf_drv_pwm.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_pwm.c similarity index 62% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/pwm/nrf_drv_pwm.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_pwm.c index 7be306d7e6..3a6581f573 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/pwm/nrf_drv_pwm.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_pwm.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,45 +37,39 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(PWM) -#define ENABLED_PWM_COUNT (PWM0_ENABLED+PWM1_ENABLED+PWM2_ENABLED) -#if ENABLED_PWM_COUNT -#include -#include "nrf_drv_pwm.h" -#include "nrf_drv_common.h" -#include "nrf_gpio.h" -#include "app_util_platform.h" -#define NRF_LOG_MODULE_NAME pwm +#include -#if PWM_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL PWM_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR PWM_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR PWM_CONFIG_DEBUG_COLOR -#else //PWM_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL 0 -#endif //PWM_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); +#if NRFX_CHECK(NRFX_PWM_ENABLED) -#if NRF_MODULE_ENABLED(PWM_NRF52_ANOMALY_109_WORKAROUND) +#if !(NRFX_CHECK(NRFX_PWM0_ENABLED) || NRFX_CHECK(NRFX_PWM1_ENABLED) || \ + NRFX_CHECK(NRFX_PWM2_ENABLED) || NRFX_CHECK(NRFX_PWM3_ENABLED)) +#error "No enabled PWM instances. Check ." +#endif + +#include +#include + +#define NRFX_LOG_MODULE PWM +#include + +#if NRFX_CHECK(NRFX_PWM_NRF52_ANOMALY_109_WORKAROUND_ENABLED) // The workaround uses interrupts to wake up the CPU and ensure it is active // when PWM is about to start a DMA transfer. For initial transfer, done when // a playback is started via PPI, a specific EGU instance is used to generate // an interrupt. During the playback, the PWM interrupt triggered on SEQEND // event of a preceding sequence is used to protect the transfer done for // the next sequence to be played. -#include "nrf_egu.h" +#include #define USE_DMA_ISSUE_WORKAROUND #endif #if defined(USE_DMA_ISSUE_WORKAROUND) #define EGU_IRQn(i) EGU_IRQn_(i) #define EGU_IRQn_(i) SWI##i##_EGU##i##_IRQn #define EGU_IRQHandler(i) EGU_IRQHandler_(i) -#define EGU_IRQHandler_(i) SWI##i##_EGU##i##_IRQHandler -#define DMA_ISSUE_EGU_IDX PWM_NRF52_ANOMALY_109_EGU_INSTANCE -#define DMA_ISSUE_EGU CONCAT_2(NRF_EGU, DMA_ISSUE_EGU_IDX) +#define EGU_IRQHandler_(i) nrfx_swi_##i##_irq_handler +#define DMA_ISSUE_EGU_IDX NRFX_PWM_NRF52_ANOMALY_109_EGU_INSTANCE +#define DMA_ISSUE_EGU NRFX_CONCAT_2(NRF_EGU, DMA_ISSUE_EGU_IDX) #define DMA_ISSUE_EGU_IRQn EGU_IRQn(DMA_ISSUE_EGU_IDX) #define DMA_ISSUE_EGU_IRQHandler EGU_IRQHandler(DMA_ISSUE_EGU_IDX) #endif @@ -84,16 +78,16 @@ NRF_LOG_MODULE_REGISTER(); typedef struct { #if defined(USE_DMA_ISSUE_WORKAROUND) - uint32_t starting_task_address; + uint32_t starting_task_address; #endif - nrf_drv_pwm_handler_t handler; - nrf_drv_state_t volatile state; - uint8_t flags; + nrfx_pwm_handler_t handler; + nrfx_drv_state_t volatile state; + uint8_t flags; } pwm_control_block_t; -static pwm_control_block_t m_cb[ENABLED_PWM_COUNT]; +static pwm_control_block_t m_cb[NRFX_PWM_ENABLED_COUNT]; -static void configure_pins(nrf_drv_pwm_t const * const p_instance, - nrf_drv_pwm_config_t const * p_config) +static void configure_pins(nrfx_pwm_t const * const p_instance, + nrfx_pwm_config_t const * p_config) { uint32_t out_pins[NRF_PWM_CHANNEL_COUNT]; uint8_t i; @@ -101,10 +95,10 @@ static void configure_pins(nrf_drv_pwm_t const * const p_instance, for (i = 0; i < NRF_PWM_CHANNEL_COUNT; ++i) { uint8_t output_pin = p_config->output_pins[i]; - if (output_pin != NRF_DRV_PWM_PIN_NOT_USED) + if (output_pin != NRFX_PWM_PIN_NOT_USED) { - bool inverted = output_pin & NRF_DRV_PWM_PIN_INVERTED; - out_pins[i] = output_pin & ~NRF_DRV_PWM_PIN_INVERTED; + bool inverted = output_pin & NRFX_PWM_PIN_INVERTED; + out_pins[i] = output_pin & ~NRFX_PWM_PIN_INVERTED; if (inverted) { @@ -127,21 +121,22 @@ static void configure_pins(nrf_drv_pwm_t const * const p_instance, } -ret_code_t nrf_drv_pwm_init(nrf_drv_pwm_t const * const p_instance, - nrf_drv_pwm_config_t const * p_config, - nrf_drv_pwm_handler_t handler) +nrfx_err_t nrfx_pwm_init(nrfx_pwm_t const * const p_instance, + nrfx_pwm_config_t const * p_config, + nrfx_pwm_handler_t handler) { - ASSERT(p_config); + NRFX_ASSERT(p_config); - ret_code_t err_code; + nrfx_err_t err_code; pwm_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - if (p_cb->state != NRF_DRV_STATE_UNINITIALIZED) + if (p_cb->state != NRFX_DRV_STATE_UNINITIALIZED) { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } @@ -168,46 +163,47 @@ ret_code_t nrf_drv_pwm_init(nrf_drv_pwm_t const * const p_instance, // is read). Therefore, the PWM interrupt must be enabled even if the event // handler is not used. #if defined(USE_DMA_ISSUE_WORKAROUND) - nrf_drv_common_irq_enable(DMA_ISSUE_EGU_IRQn, p_config->irq_priority); + NRFX_IRQ_PRIORITY_SET(DMA_ISSUE_EGU_IRQn, p_config->irq_priority); + NRFX_IRQ_ENABLE(DMA_ISSUE_EGU_IRQn); #else if (p_cb->handler) #endif { - nrf_drv_common_irq_enable(nrf_drv_get_IRQn(p_instance->p_registers), + NRFX_IRQ_PRIORITY_SET(nrfx_get_irq_number(p_instance->p_registers), p_config->irq_priority); + NRFX_IRQ_ENABLE(nrfx_get_irq_number(p_instance->p_registers)); } - p_cb->state = NRF_DRV_STATE_INITIALIZED; + p_cb->state = NRFX_DRV_STATE_INITIALIZED; - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } -void nrf_drv_pwm_uninit(nrf_drv_pwm_t const * const p_instance) +void nrfx_pwm_uninit(nrfx_pwm_t const * const p_instance) { pwm_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ASSERT(p_cb->state != NRF_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); - nrf_drv_common_irq_disable(nrf_drv_get_IRQn(p_instance->p_registers)); + NRFX_IRQ_DISABLE(nrfx_get_irq_number(p_instance->p_registers)); #if defined(USE_DMA_ISSUE_WORKAROUND) - nrf_drv_common_irq_disable(DMA_ISSUE_EGU_IRQn); + NRFX_IRQ_DISABLE(DMA_ISSUE_EGU_IRQn); #endif nrf_pwm_disable(p_instance->p_registers); - p_cb->state = NRF_DRV_STATE_UNINITIALIZED; + p_cb->state = NRFX_DRV_STATE_UNINITIALIZED; } -static uint32_t start_playback(nrf_drv_pwm_t const * const p_instance, +static uint32_t start_playback(nrfx_pwm_t const * const p_instance, pwm_control_block_t * p_cb, uint8_t flags, nrf_pwm_task_t starting_task) { - p_cb->state = NRF_DRV_STATE_POWERED_ON; + p_cb->state = NRFX_DRV_STATE_POWERED_ON; p_cb->flags = flags; if (p_cb->handler) @@ -220,23 +216,23 @@ static uint32_t start_playback(nrf_drv_pwm_t const * const p_instance, // The workaround for nRF52 Anomaly 109 "protects" DMA transfers by // handling interrupts generated on SEQEND0 and SEQEND1 events (see - // 'nrf_drv_pwm_init'), hence these events must be always enabled + // 'nrfx_pwm_init'), hence these events must be always enabled // to generate interrupts. // However, the user handler is called for them only when requested // (see 'irq_handler'). #if defined(USE_DMA_ISSUE_WORKAROUND) int_mask |= NRF_PWM_INT_SEQEND0_MASK | NRF_PWM_INT_SEQEND1_MASK; #else - if (flags & NRF_DRV_PWM_FLAG_SIGNAL_END_SEQ0) + if (flags & NRFX_PWM_FLAG_SIGNAL_END_SEQ0) { int_mask |= NRF_PWM_INT_SEQEND0_MASK; } - if (flags & NRF_DRV_PWM_FLAG_SIGNAL_END_SEQ1) + if (flags & NRFX_PWM_FLAG_SIGNAL_END_SEQ1) { int_mask |= NRF_PWM_INT_SEQEND1_MASK; } #endif - if (flags & NRF_DRV_PWM_FLAG_NO_EVT_FINISHED) + if (flags & NRFX_PWM_FLAG_NO_EVT_FINISHED) { int_mask &= ~NRF_PWM_INT_LOOPSDONE_MASK; } @@ -253,7 +249,7 @@ static uint32_t start_playback(nrf_drv_pwm_t const * const p_instance, nrf_pwm_event_clear(p_instance->p_registers, NRF_PWM_EVENT_STOPPED); - if (flags & NRF_DRV_PWM_FLAG_START_VIA_TASK) + if (flags & NRFX_PWM_FLAG_START_VIA_TASK) { uint32_t starting_task_address = nrf_pwm_task_address_get(p_instance->p_registers, starting_task); @@ -277,15 +273,15 @@ static uint32_t start_playback(nrf_drv_pwm_t const * const p_instance, } -uint32_t nrf_drv_pwm_simple_playback(nrf_drv_pwm_t const * const p_instance, - nrf_pwm_sequence_t const * p_sequence, - uint16_t playback_count, - uint32_t flags) +uint32_t nrfx_pwm_simple_playback(nrfx_pwm_t const * const p_instance, + nrf_pwm_sequence_t const * p_sequence, + uint16_t playback_count, + uint32_t flags) { pwm_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ASSERT(p_cb->state != NRF_DRV_STATE_UNINITIALIZED); - ASSERT(playback_count > 0); - ASSERT(nrf_drv_is_in_RAM(p_sequence->values.p_raw)); + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(playback_count > 0); + NRFX_ASSERT(nrfx_is_in_ram(p_sequence->values.p_raw)); // To take advantage of the looping mechanism, we need to use both sequences // (single sequence can be played back only once). @@ -296,11 +292,11 @@ uint32_t nrf_drv_pwm_simple_playback(nrf_drv_pwm_t const * const p_instance, (playback_count / 2) + (odd ? 1 : 0)); uint32_t shorts_mask; - if (flags & NRF_DRV_PWM_FLAG_STOP) + if (flags & NRFX_PWM_FLAG_STOP) { shorts_mask = NRF_PWM_SHORT_LOOPSDONE_STOP_MASK; } - else if (flags & NRF_DRV_PWM_FLAG_LOOP) + else if (flags & NRFX_PWM_FLAG_LOOP) { shorts_mask = odd ? NRF_PWM_SHORT_LOOPSDONE_SEQSTART1_MASK : NRF_PWM_SHORT_LOOPSDONE_SEQSTART0_MASK; @@ -311,39 +307,39 @@ uint32_t nrf_drv_pwm_simple_playback(nrf_drv_pwm_t const * const p_instance, } nrf_pwm_shorts_set(p_instance->p_registers, shorts_mask); - NRF_LOG_INFO("Function: %s, sequence length: %d.", - (uint32_t)__func__, - p_sequence->length); - NRF_LOG_DEBUG("Sequence data:"); - NRF_LOG_HEXDUMP_DEBUG((uint8_t *)p_sequence->values.p_raw, - p_sequence->length * sizeof(uint16_t)); + NRFX_LOG_INFO("Function: %s, sequence length: %d.", + __func__, + p_sequence->length); + NRFX_LOG_DEBUG("Sequence data:"); + NRFX_LOG_HEXDUMP_DEBUG((uint8_t *)p_sequence->values.p_raw, + p_sequence->length * sizeof(uint16_t)); return start_playback(p_instance, p_cb, flags, odd ? NRF_PWM_TASK_SEQSTART1 : NRF_PWM_TASK_SEQSTART0); } -uint32_t nrf_drv_pwm_complex_playback(nrf_drv_pwm_t const * const p_instance, - nrf_pwm_sequence_t const * p_sequence_0, - nrf_pwm_sequence_t const * p_sequence_1, - uint16_t playback_count, - uint32_t flags) +uint32_t nrfx_pwm_complex_playback(nrfx_pwm_t const * const p_instance, + nrf_pwm_sequence_t const * p_sequence_0, + nrf_pwm_sequence_t const * p_sequence_1, + uint16_t playback_count, + uint32_t flags) { pwm_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ASSERT(p_cb->state != NRF_DRV_STATE_UNINITIALIZED); - ASSERT(playback_count > 0); - ASSERT(nrf_drv_is_in_RAM(p_sequence_0->values.p_raw)); - ASSERT(nrf_drv_is_in_RAM(p_sequence_1->values.p_raw)); + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(playback_count > 0); + NRFX_ASSERT(nrfx_is_in_ram(p_sequence_0->values.p_raw)); + NRFX_ASSERT(nrfx_is_in_ram(p_sequence_1->values.p_raw)); nrf_pwm_sequence_set(p_instance->p_registers, 0, p_sequence_0); nrf_pwm_sequence_set(p_instance->p_registers, 1, p_sequence_1); nrf_pwm_loop_set(p_instance->p_registers, playback_count); uint32_t shorts_mask; - if (flags & NRF_DRV_PWM_FLAG_STOP) + if (flags & NRFX_PWM_FLAG_STOP) { shorts_mask = NRF_PWM_SHORT_LOOPSDONE_STOP_MASK; } - else if (flags & NRF_DRV_PWM_FLAG_LOOP) + else if (flags & NRFX_PWM_FLAG_LOOP) { shorts_mask = NRF_PWM_SHORT_LOOPSDONE_SEQSTART0_MASK; } @@ -353,30 +349,30 @@ uint32_t nrf_drv_pwm_complex_playback(nrf_drv_pwm_t const * const p_instance, } nrf_pwm_shorts_set(p_instance->p_registers, shorts_mask); - NRF_LOG_INFO("Function: %s, sequence 0 length: %d.", - (uint32_t)__func__, - p_sequence_0->length); - NRF_LOG_INFO("Function: %s, sequence 1 length: %d.", - (uint32_t)__func__, - p_sequence_1->length); - NRF_LOG_DEBUG("Sequence 0 data:"); - NRF_LOG_HEXDUMP_DEBUG((uint8_t *)p_sequence_0->values.p_raw, - p_sequence_0->length * sizeof(uint16_t)); - NRF_LOG_DEBUG("Sequence 1 data:"); - NRF_LOG_HEXDUMP_DEBUG((uint8_t *)p_sequence_1->values.p_raw, - p_sequence_1->length * sizeof(uint16_t)); + NRFX_LOG_INFO("Function: %s, sequence 0 length: %d.", + __func__, + p_sequence_0->length); + NRFX_LOG_INFO("Function: %s, sequence 1 length: %d.", + __func__, + p_sequence_1->length); + NRFX_LOG_DEBUG("Sequence 0 data:"); + NRFX_LOG_HEXDUMP_DEBUG(p_sequence_0->values.p_raw, + p_sequence_0->length * sizeof(uint16_t)); + NRFX_LOG_DEBUG("Sequence 1 data:"); + NRFX_LOG_HEXDUMP_DEBUG(p_sequence_1->values.p_raw, + p_sequence_1->length * sizeof(uint16_t)); return start_playback(p_instance, p_cb, flags, NRF_PWM_TASK_SEQSTART0); } -bool nrf_drv_pwm_stop(nrf_drv_pwm_t const * const p_instance, - bool wait_until_stopped) +bool nrfx_pwm_stop(nrfx_pwm_t const * const p_instance, + bool wait_until_stopped) { - ASSERT(m_cb[p_instance->drv_inst_idx].state != NRF_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(m_cb[p_instance->drv_inst_idx].state != NRFX_DRV_STATE_UNINITIALIZED); bool ret_val = false; - if (nrf_drv_pwm_is_stopped(p_instance)) + if (nrfx_pwm_is_stopped(p_instance)) { ret_val = true; } @@ -385,7 +381,7 @@ bool nrf_drv_pwm_stop(nrf_drv_pwm_t const * const p_instance, nrf_pwm_task_trigger(p_instance->p_registers, NRF_PWM_TASK_STOP); do { - if (nrf_drv_pwm_is_stopped(p_instance)) + if (nrfx_pwm_is_stopped(p_instance)) { ret_val = true; break; @@ -393,33 +389,33 @@ bool nrf_drv_pwm_stop(nrf_drv_pwm_t const * const p_instance, } while (wait_until_stopped); } - NRF_LOG_INFO("%s returned %d.", (uint32_t)__func__, ret_val); + NRFX_LOG_INFO("%s returned %d.", __func__, ret_val); return ret_val; } -bool nrf_drv_pwm_is_stopped(nrf_drv_pwm_t const * const p_instance) +bool nrfx_pwm_is_stopped(nrfx_pwm_t const * const p_instance) { pwm_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ASSERT(p_cb->state != NRF_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); bool ret_val = false; // If the event handler is used (interrupts are enabled), the state will // be changed in interrupt handler when the STOPPED event occurs. - if (p_cb->state != NRF_DRV_STATE_POWERED_ON) + if (p_cb->state != NRFX_DRV_STATE_POWERED_ON) { ret_val = true; } // If interrupts are disabled, we must check the STOPPED event here. if (nrf_pwm_event_check(p_instance->p_registers, NRF_PWM_EVENT_STOPPED)) { - p_cb->state = NRF_DRV_STATE_INITIALIZED; - NRF_LOG_INFO("Disabled."); + p_cb->state = NRFX_DRV_STATE_INITIALIZED; + NRFX_LOG_INFO("Disabled."); ret_val = true; } - NRF_LOG_INFO("%s returned %d.", (uint32_t)__func__, ret_val); + NRFX_LOG_INFO("%s returned %d.", __func__, ret_val); return ret_val; } @@ -431,17 +427,17 @@ static void irq_handler(NRF_PWM_Type * p_pwm, pwm_control_block_t * p_cb) if (nrf_pwm_event_check(p_pwm, NRF_PWM_EVENT_SEQEND0)) { nrf_pwm_event_clear(p_pwm, NRF_PWM_EVENT_SEQEND0); - if ((p_cb->flags & NRF_DRV_PWM_FLAG_SIGNAL_END_SEQ0) && p_cb->handler) + if ((p_cb->flags & NRFX_PWM_FLAG_SIGNAL_END_SEQ0) && p_cb->handler) { - p_cb->handler(NRF_DRV_PWM_EVT_END_SEQ0); + p_cb->handler(NRFX_PWM_EVT_END_SEQ0); } } if (nrf_pwm_event_check(p_pwm, NRF_PWM_EVENT_SEQEND1)) { nrf_pwm_event_clear(p_pwm, NRF_PWM_EVENT_SEQEND1); - if ((p_cb->flags & NRF_DRV_PWM_FLAG_SIGNAL_END_SEQ1) && p_cb->handler) + if ((p_cb->flags & NRFX_PWM_FLAG_SIGNAL_END_SEQ1) && p_cb->handler) { - p_cb->handler(NRF_DRV_PWM_EVT_END_SEQ1); + p_cb->handler(NRFX_PWM_EVT_END_SEQ1); } } // For LOOPSDONE the handler is called by default, but the user can disable @@ -449,9 +445,9 @@ static void irq_handler(NRF_PWM_Type * p_pwm, pwm_control_block_t * p_cb) if (nrf_pwm_event_check(p_pwm, NRF_PWM_EVENT_LOOPSDONE)) { nrf_pwm_event_clear(p_pwm, NRF_PWM_EVENT_LOOPSDONE); - if (!(p_cb->flags & NRF_DRV_PWM_FLAG_NO_EVT_FINISHED) && p_cb->handler) + if (!(p_cb->flags & NRFX_PWM_FLAG_NO_EVT_FINISHED) && p_cb->handler) { - p_cb->handler(NRF_DRV_PWM_EVT_FINISHED); + p_cb->handler(NRFX_PWM_EVT_FINISHED); } } @@ -460,10 +456,10 @@ static void irq_handler(NRF_PWM_Type * p_pwm, pwm_control_block_t * p_cb) { nrf_pwm_event_clear(p_pwm, NRF_PWM_EVENT_STOPPED); - p_cb->state = NRF_DRV_STATE_INITIALIZED; + p_cb->state = NRFX_DRV_STATE_INITIALIZED; if (p_cb->handler) { - p_cb->handler(NRF_DRV_PWM_EVT_STOPPED); + p_cb->handler(NRFX_PWM_EVT_STOPPED); } } } @@ -474,7 +470,7 @@ static void irq_handler(NRF_PWM_Type * p_pwm, pwm_control_block_t * p_cb) void DMA_ISSUE_EGU_IRQHandler(void) { int i; - for (i = 0; i < ENABLED_PWM_COUNT; ++i) + for (i = 0; i < NRFX_PWM_ENABLED_COUNT; ++i) { volatile uint32_t * p_event_reg = nrf_egu_event_triggered_address_get(DMA_ISSUE_EGU, i); @@ -487,33 +483,33 @@ void DMA_ISSUE_EGU_IRQHandler(void) } #endif -#if NRF_MODULE_ENABLED(PWM0) && defined (PWM0_CH_NUM) -void PWM0_IRQHandler(void) + +#if NRFX_CHECK(NRFX_PWM0_ENABLED) +void nrfx_pwm_0_irq_handler(void) { - irq_handler(NRF_PWM0, &m_cb[PWM0_INSTANCE_INDEX]); + irq_handler(NRF_PWM0, &m_cb[NRFX_PWM0_INST_IDX]); } #endif -#if NRF_MODULE_ENABLED(PWM1) && defined (PWM1_CH_NUM) -void PWM1_IRQHandler(void) +#if NRFX_CHECK(NRFX_PWM1_ENABLED) +void nrfx_pwm_1_irq_handler(void) { - irq_handler(NRF_PWM1, &m_cb[PWM1_INSTANCE_INDEX]); + irq_handler(NRF_PWM1, &m_cb[NRFX_PWM1_INST_IDX]); } #endif -#if NRF_MODULE_ENABLED(PWM2) && defined (PWM2_CH_NUM) -void PWM2_IRQHandler(void) +#if NRFX_CHECK(NRFX_PWM2_ENABLED) +void nrfx_pwm_2_irq_handler(void) { - irq_handler(NRF_PWM2, &m_cb[PWM2_INSTANCE_INDEX]); + irq_handler(NRF_PWM2, &m_cb[NRFX_PWM2_INST_IDX]); } #endif -#if PWM3_ENABLED && defined (PWM3_CH_NUM) -void PWM3_IRQHandler(void) +#if NRFX_CHECK(NRFX_PWM3_ENABLED) +void nrfx_pwm_3_irq_handler(void) { - irq_handler(NRF_PWM3, &m_cb[PWM3_INSTANCE_INDEX]); + irq_handler(NRF_PWM3, &m_cb[NRFX_PWM3_INST_IDX]); } #endif -#endif //ENABLED_PWM_COUNT -#endif //NRF_MODULE_ENABLED(PWM) +#endif // NRFX_CHECK(NRFX_PWM_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/qdec/nrf_drv_qdec.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_qdec.c similarity index 52% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/qdec/nrf_drv_qdec.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_qdec.c index 33fdfafc9d..c7994d13ec 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/qdec/nrf_drv_qdec.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_qdec.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,49 +37,35 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(QDEC) -#include -#include -#include "nrf.h" -#include "nrf_gpio.h" -#include "nrf_error.h" -#include "nrf_assert.h" -#include "nrf_drv_common.h" -#include "nrf_drv_qdec.h" -#include "app_util_platform.h" -#include "nrf_assert.h" +#include -#define NRF_LOG_MODULE_NAME qdec +#if NRFX_CHECK(NRFX_QDEC_ENABLED) -#if QDEC_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL QDEC_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR QDEC_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR QDEC_CONFIG_DEBUG_COLOR -#define EVT_TO_STR(event) (event == NRF_QDEC_EVENT_SAMPLERDY ? "NRF_QDEC_EVENT_SAMPLERDY" : \ - (event == NRF_QDEC_EVENT_REPORTRDY ? "NRF_QDEC_EVENT_REPORTRDY" : \ - (event == NRF_QDEC_EVENT_ACCOF ? "NRF_QDEC_EVENT_ACCOF" : "UNKNOWN EVENT"))) -#else //QDEC_CONFIG_LOG_ENABLED -#define EVT_TO_STR(event) "" -#define NRF_LOG_LEVEL 0 -#endif //QDEC_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); +#include +#include + +#define NRFX_LOG_MODULE QDEC +#include + +#define EVT_TO_STR(event) \ + (event == NRF_QDEC_EVENT_SAMPLERDY ? "NRF_QDEC_EVENT_SAMPLERDY" : \ + (event == NRF_QDEC_EVENT_REPORTRDY ? "NRF_QDEC_EVENT_REPORTRDY" : \ + (event == NRF_QDEC_EVENT_ACCOF ? "NRF_QDEC_EVENT_ACCOF" : \ + "UNKNOWN EVENT"))) -static qdec_event_handler_t m_qdec_event_handler = NULL; -static const nrf_drv_qdec_config_t m_default_config = NRF_DRV_QDEC_DEFAULT_CONFIG; -static nrf_drv_state_t m_state = NRF_DRV_STATE_UNINITIALIZED; +static nrfx_qdec_event_handler_t m_qdec_event_handler = NULL; +static nrfx_drv_state_t m_state = NRFX_DRV_STATE_UNINITIALIZED; -void QDEC_IRQHandler(void) +void nrfx_qdec_irq_handler(void) { - nrf_drv_qdec_event_t event; + nrfx_qdec_event_t event; if ( nrf_qdec_event_check(NRF_QDEC_EVENT_SAMPLERDY) && nrf_qdec_int_enable_check(NRF_QDEC_INT_SAMPLERDY_MASK) ) { nrf_qdec_event_clear(NRF_QDEC_EVENT_SAMPLERDY); - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(NRF_QDEC_EVENT_SAMPLERDY)); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_QDEC_EVENT_SAMPLERDY)); event.type = NRF_QDEC_EVENT_SAMPLERDY; event.data.sample.value = (int8_t)nrf_qdec_sample_get(); @@ -90,7 +76,7 @@ void QDEC_IRQHandler(void) nrf_qdec_int_enable_check(NRF_QDEC_INT_REPORTRDY_MASK) ) { nrf_qdec_event_clear(NRF_QDEC_EVENT_REPORTRDY); - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(NRF_QDEC_INT_REPORTRDY_MASK)); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_QDEC_EVENT_REPORTRDY)); event.type = NRF_QDEC_EVENT_REPORTRDY; @@ -103,7 +89,7 @@ void QDEC_IRQHandler(void) nrf_qdec_int_enable_check(NRF_QDEC_INT_ACCOF_MASK) ) { nrf_qdec_event_clear(NRF_QDEC_EVENT_ACCOF); - NRF_LOG_DEBUG("Event: %s.", (uint32_t)EVT_TO_STR(NRF_QDEC_EVENT_ACCOF)); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_QDEC_EVENT_ACCOF)); event.type = NRF_QDEC_EVENT_ACCOF; m_qdec_event_handler(event); @@ -111,39 +97,29 @@ void QDEC_IRQHandler(void) } -ret_code_t nrf_drv_qdec_init(const nrf_drv_qdec_config_t * p_config, - qdec_event_handler_t event_handler) +nrfx_err_t nrfx_qdec_init(nrfx_qdec_config_t const * p_config, + nrfx_qdec_event_handler_t event_handler) { - ret_code_t err_code; + NRFX_ASSERT(p_config); + NRFX_ASSERT(event_handler); + nrfx_err_t err_code; - if (m_state != NRF_DRV_STATE_UNINITIALIZED) + if (m_state != NRFX_DRV_STATE_UNINITIALIZED) { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } - if (p_config == NULL) - { - p_config = &m_default_config; - } - - if (event_handler) - { - m_qdec_event_handler = event_handler; - } - else - { - err_code = NRF_ERROR_INVALID_PARAM; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } + m_qdec_event_handler = event_handler; nrf_qdec_sampleper_set(p_config->sampleper); nrf_gpio_cfg_input(p_config->pselled, NRF_GPIO_PIN_NOPULL); nrf_gpio_cfg_input(p_config->psela, NRF_GPIO_PIN_NOPULL); nrf_gpio_cfg_input(p_config->pselb, NRF_GPIO_PIN_NOPULL); - nrf_qdec_pio_assign( p_config->psela, p_config->pselb, p_config->pselled); + nrf_qdec_pio_assign(p_config->psela, p_config->pselb, p_config->pselled); nrf_qdec_ledpre_set(p_config->ledpre); nrf_qdec_ledpol_set(p_config->ledpol); nrf_qdec_shorts_enable(NRF_QDEC_SHORT_REPORTRDY_READCLRACC_MASK); @@ -171,64 +147,55 @@ ret_code_t nrf_drv_qdec_init(const nrf_drv_qdec_config_t * p_config, } nrf_qdec_int_enable(int_mask); - nrf_drv_common_irq_enable(QDEC_IRQn, p_config->interrupt_priority); + NRFX_IRQ_PRIORITY_SET(QDEC_IRQn, p_config->interrupt_priority); + NRFX_IRQ_ENABLE(QDEC_IRQn); - m_state = NRF_DRV_STATE_INITIALIZED; + m_state = NRFX_DRV_STATE_INITIALIZED; - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } -void nrf_drv_qdec_uninit(void) +void nrfx_qdec_uninit(void) { - ASSERT(m_state != NRF_DRV_STATE_UNINITIALIZED); - nrf_drv_qdec_disable(); - nrf_drv_common_irq_disable(QDEC_IRQn); - m_state = NRF_DRV_STATE_UNINITIALIZED; - NRF_LOG_INFO("Uninitialized."); + NRFX_ASSERT(m_state != NRFX_DRV_STATE_UNINITIALIZED); + nrfx_qdec_disable(); + NRFX_IRQ_DISABLE(QDEC_IRQn); + m_state = NRFX_DRV_STATE_UNINITIALIZED; + NRFX_LOG_INFO("Uninitialized."); } -void nrf_drv_qdec_enable(void) +void nrfx_qdec_enable(void) { - ASSERT(m_state == NRF_DRV_STATE_INITIALIZED); + NRFX_ASSERT(m_state == NRFX_DRV_STATE_INITIALIZED); nrf_qdec_enable(); nrf_qdec_task_trigger(NRF_QDEC_TASK_START); - m_state = NRF_DRV_STATE_POWERED_ON; - NRF_LOG_INFO("Enabled."); + m_state = NRFX_DRV_STATE_POWERED_ON; + NRFX_LOG_INFO("Enabled."); } -void nrf_drv_qdec_disable(void) +void nrfx_qdec_disable(void) { - ASSERT(m_state == NRF_DRV_STATE_POWERED_ON); + NRFX_ASSERT(m_state == NRFX_DRV_STATE_POWERED_ON); nrf_qdec_task_trigger(NRF_QDEC_TASK_STOP); nrf_qdec_disable(); - m_state = NRF_DRV_STATE_INITIALIZED; - NRF_LOG_INFO("Disabled."); + m_state = NRFX_DRV_STATE_INITIALIZED; + NRFX_LOG_INFO("Disabled."); } -void nrf_drv_qdec_accumulators_read(int16_t * p_acc, int16_t * p_accdbl) +void nrfx_qdec_accumulators_read(int16_t * p_acc, int16_t * p_accdbl) { - ASSERT(m_state == NRF_DRV_STATE_POWERED_ON); + NRFX_ASSERT(m_state == NRFX_DRV_STATE_POWERED_ON); nrf_qdec_task_trigger(NRF_QDEC_TASK_READCLRACC); *p_acc = (int16_t)nrf_qdec_accread_get(); *p_accdbl = (int16_t)nrf_qdec_accdblread_get(); - NRF_LOG_DEBUG("Accumulators data, ACC register:"); - NRF_LOG_HEXDUMP_DEBUG((uint8_t *)p_acc, sizeof(p_acc[0])); - NRF_LOG_DEBUG("Accumulators data, ACCDBL register:"); - NRF_LOG_HEXDUMP_DEBUG((uint8_t *)p_accdbl, sizeof(p_accdbl[0])); + NRFX_LOG_DEBUG("Accumulators data, ACC register:"); + NRFX_LOG_HEXDUMP_DEBUG((uint8_t *)p_acc, sizeof(p_acc[0])); + NRFX_LOG_DEBUG("Accumulators data, ACCDBL register:"); + NRFX_LOG_HEXDUMP_DEBUG((uint8_t *)p_accdbl, sizeof(p_accdbl[0])); } -void nrf_drv_qdec_task_address_get(nrf_qdec_task_t task, uint32_t * p_task) -{ - *p_task = (uint32_t)nrf_qdec_task_address_get(task); -} - -void nrf_drv_qdec_event_address_get(nrf_qdec_event_t event, uint32_t * p_event) -{ - *p_event = (uint32_t)nrf_qdec_event_address_get(event); -} - -#endif //NRF_MODULE_ENABLED(QDEC) +#endif // NRFX_CHECK(NRFX_QDEC_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/qspi/nrf_drv_qspi.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_qspi.c similarity index 54% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/qspi/nrf_drv_qspi.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_qspi.c index 83287313a5..93ffeffa7a 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/qspi/nrf_drv_qspi.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_qspi.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,15 +37,13 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -#include "sdk_config.h" -#if QSPI_ENABLED +#include + +#if NRFX_CHECK(NRFX_QSPI_ENABLED) + +#include -#include "nrf_drv_qspi.h" -#include "nrf_drv_common.h" -#include "app_util.h" -#include "nrf_gpio.h" -#include "nrf_assert.h" /** * @brief Command byte used to read status register. @@ -59,30 +57,35 @@ */ #define QSPI_MEM_STATUSREG_WIP_Pos 0x01 -#define QSPI_WAIT_READY() do { \ - while (!nrf_qspi_event_check(NRF_QSPI, NRF_QSPI_EVENT_READY)); \ - } while (0) +/** + * @brief Default time used in timeout function. + */ +#define QSPI_DEF_WAIT_TIME_US 10 + +/** + * @brief Default number of tries in timeout function. + */ +#define QSPI_DEF_WAIT_ATTEMPTS 100 /** * @brief Control block - driver instance local data. - * */ typedef struct { - nrf_drv_qspi_handler_t handler; /**< Handler. */ - nrf_drv_state_t state; /**< Driver state. */ - volatile bool interrupt_driven; /**< Information if the current operation is performed and is interrupt-driven. */ - void * p_context; /**< Driver context used in interrupt. */ + nrfx_qspi_handler_t handler; /**< Handler. */ + nrfx_drv_state_t state; /**< Driver state. */ + volatile bool interrupt_driven; /**< Information if the current operation is performed and is interrupt-driven. */ + void * p_context; /**< Driver context used in interrupt. */ } qspi_control_block_t; static qspi_control_block_t m_cb; -static ret_code_t qspi_task_perform(nrf_qspi_task_t task) +static nrfx_err_t qspi_task_perform(nrf_qspi_task_t task) { // Wait for peripheral if (m_cb.interrupt_driven) { - return NRF_ERROR_BUSY; + return NRFX_ERROR_BUSY; } nrf_qspi_event_clear(NRF_QSPI, NRF_QSPI_EVENT_READY); @@ -97,9 +100,10 @@ static ret_code_t qspi_task_perform(nrf_qspi_task_t task) if (m_cb.handler == NULL) { - QSPI_WAIT_READY(); + while (!nrf_qspi_event_check(NRF_QSPI, NRF_QSPI_EVENT_READY)) + {}; } - return NRF_SUCCESS; + return NRFX_SUCCESS; } static bool qspi_pins_configure(nrf_qspi_pins_t const * p_config) @@ -118,20 +122,22 @@ static bool qspi_pins_configure(nrf_qspi_pins_t const * p_config) return true; } -ret_code_t nrf_drv_qspi_init(nrf_drv_qspi_config_t const * p_config, - nrf_drv_qspi_handler_t handler, - void * p_context) +nrfx_err_t nrfx_qspi_init(nrfx_qspi_config_t const * p_config, + nrfx_qspi_handler_t handler, + void * p_context) { - if (m_cb.state != NRF_DRV_STATE_UNINITIALIZED) + NRFX_ASSERT(p_config); + if (m_cb.state != NRFX_DRV_STATE_UNINITIALIZED) { - return NRF_ERROR_INVALID_STATE; + return NRFX_ERROR_INVALID_STATE; } if (!qspi_pins_configure(&p_config->pins)) { - return NRF_ERROR_INVALID_PARAM; + return NRFX_ERROR_INVALID_PARAM; } + nrf_qspi_xip_offset_set(NRF_QSPI, p_config->xip_offset); nrf_qspi_ifconfig0_set(NRF_QSPI, &p_config->prot_if); nrf_qspi_ifconfig1_set(NRF_QSPI, &p_config->phy_if); @@ -145,10 +151,11 @@ ret_code_t nrf_drv_qspi_init(nrf_drv_qspi_config_t const * p_config, if (handler) { - nrf_drv_common_irq_enable(QSPI_IRQn, p_config->irq_priority); + NRFX_IRQ_PRIORITY_SET(QSPI_IRQn, p_config->irq_priority); + NRFX_IRQ_ENABLE(QSPI_IRQn); } - m_cb.state = NRF_DRV_STATE_INITIALIZED; + m_cb.state = NRFX_DRV_STATE_INITIALIZED; nrf_qspi_enable(NRF_QSPI); @@ -156,20 +163,29 @@ ret_code_t nrf_drv_qspi_init(nrf_drv_qspi_config_t const * p_config, nrf_qspi_task_trigger(NRF_QSPI, NRF_QSPI_TASK_ACTIVATE); // Waiting for the peripheral to activate - QSPI_WAIT_READY(); + bool result; + NRFX_WAIT_FOR(nrf_qspi_event_check(NRF_QSPI, NRF_QSPI_EVENT_READY), + QSPI_DEF_WAIT_ATTEMPTS, + QSPI_DEF_WAIT_TIME_US, + result); - return NRF_SUCCESS; + if (!result) + { + return NRFX_ERROR_TIMEOUT; + } + + return NRFX_SUCCESS; } -ret_code_t nrf_drv_qspi_cinstr_xfer(nrf_qspi_cinstr_conf_t const * p_config, - void const * p_tx_buffer, - void * p_rx_buffer) +nrfx_err_t nrfx_qspi_cinstr_xfer(nrf_qspi_cinstr_conf_t const * p_config, + void const * p_tx_buffer, + void * p_rx_buffer) { - ASSERT(m_cb.state != NRF_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); if (m_cb.interrupt_driven) { - return NRF_ERROR_BUSY; + return NRFX_ERROR_BUSY; } nrf_qspi_event_clear(NRF_QSPI, NRF_QSPI_EVENT_READY); @@ -184,7 +200,21 @@ ret_code_t nrf_drv_qspi_cinstr_xfer(nrf_qspi_cinstr_conf_t const * p_config, nrf_qspi_cinstr_transfer_start(NRF_QSPI, p_config); - QSPI_WAIT_READY(); + bool result; + NRFX_WAIT_FOR(nrf_qspi_event_check(NRF_QSPI, NRF_QSPI_EVENT_READY), + QSPI_DEF_WAIT_ATTEMPTS, + QSPI_DEF_WAIT_TIME_US, + result); + + if (!result) + { + // This timeout should never occur when WIPWAIT is not active, since in this + // case the QSPI peripheral should send the command immediately, without any + // waiting for previous write to complete. + NRFX_ASSERT(p_config->wipwait); + + return NRFX_ERROR_TIMEOUT; + } nrf_qspi_event_clear(NRF_QSPI, NRF_QSPI_EVENT_READY); nrf_qspi_int_enable(NRF_QSPI, NRF_QSPI_INT_READY_MASK); @@ -193,67 +223,70 @@ ret_code_t nrf_drv_qspi_cinstr_xfer(nrf_qspi_cinstr_conf_t const * p_config, nrf_qspi_cinstrdata_get(NRF_QSPI, p_config->length, p_rx_buffer); } - return NRF_SUCCESS; + return NRFX_SUCCESS; } -ret_code_t nrf_drv_qspi_cinstr_quick_send(uint8_t opcode, - nrf_qspi_cinstr_len_t length, - void const * p_tx_buffer) +nrfx_err_t nrfx_qspi_cinstr_quick_send(uint8_t opcode, + nrf_qspi_cinstr_len_t length, + void const * p_tx_buffer) { - nrf_qspi_cinstr_conf_t config = NRF_DRV_QSPI_DEFAULT_CINSTR(opcode, length); - return nrf_drv_qspi_cinstr_xfer(&config, p_tx_buffer, NULL); + nrf_qspi_cinstr_conf_t config = NRFX_QSPI_DEFAULT_CINSTR(opcode, length); + return nrfx_qspi_cinstr_xfer(&config, p_tx_buffer, NULL); } -ret_code_t nrf_drv_qspi_mem_busy_check(void) +nrfx_err_t nrfx_qspi_mem_busy_check(void) { - ret_code_t ret_code; + nrfx_err_t ret_code; uint8_t status_value = 0; - nrf_qspi_cinstr_conf_t config = NRF_DRV_QSPI_DEFAULT_CINSTR(QSPI_STD_CMD_RDSR, - NRF_QSPI_CINSTR_LEN_2B); + nrf_qspi_cinstr_conf_t const config = + NRFX_QSPI_DEFAULT_CINSTR(QSPI_STD_CMD_RDSR, + NRF_QSPI_CINSTR_LEN_2B); + ret_code = nrfx_qspi_cinstr_xfer(&config, &status_value, &status_value); - ret_code = nrf_drv_qspi_cinstr_xfer(&config, &status_value, &status_value); - - if (ret_code != NRF_SUCCESS) + if (ret_code != NRFX_SUCCESS) { return ret_code; } if ((status_value & QSPI_MEM_STATUSREG_WIP_Pos) != 0x00) { - return NRF_ERROR_BUSY; + return NRFX_ERROR_BUSY; } - return NRF_SUCCESS; + return NRFX_SUCCESS; } -void nrf_drv_qspi_uninit(void) +void nrfx_qspi_uninit(void) { - ASSERT(m_cb.state != NRF_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); nrf_qspi_int_disable(NRF_QSPI, NRF_QSPI_INT_READY_MASK); nrf_qspi_disable(NRF_QSPI); - nrf_drv_common_irq_disable(QSPI_IRQn); + nrf_qspi_task_trigger(NRF_QSPI, NRF_QSPI_TASK_DEACTIVATE); + + // Workaround for nRF52840 anomaly 122: Current consumption is too high. + *(volatile uint32_t *)0x40029054ul = 1ul; + + NRFX_IRQ_DISABLE(QSPI_IRQn); nrf_qspi_event_clear(NRF_QSPI, NRF_QSPI_EVENT_READY); - m_cb.state = NRF_DRV_STATE_UNINITIALIZED; + m_cb.state = NRFX_DRV_STATE_UNINITIALIZED; } -ret_code_t nrf_drv_qspi_write(void const * p_tx_buffer, - size_t tx_buffer_length, - uint32_t dst_address) +nrfx_err_t nrfx_qspi_write(void const * p_tx_buffer, + size_t tx_buffer_length, + uint32_t dst_address) { - ASSERT(m_cb.state != NRF_DRV_STATE_UNINITIALIZED); - ASSERT(p_tx_buffer != NULL); - /* Checking word alignment. */ - ASSERT(is_word_aligned(p_tx_buffer)); + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(p_tx_buffer != NULL); - if (!nrf_drv_is_in_RAM(p_tx_buffer)) + if (!nrfx_is_in_ram(p_tx_buffer)) { - return NRF_ERROR_INVALID_ADDR; + return NRFX_ERROR_INVALID_ADDR; } nrf_qspi_write_buffer_set(NRF_QSPI, p_tx_buffer, tx_buffer_length, dst_address); @@ -261,48 +294,44 @@ ret_code_t nrf_drv_qspi_write(void const * p_tx_buffer, } -ret_code_t nrf_drv_qspi_read(void * p_rx_buffer, - size_t rx_buffer_length, - uint32_t src_address) +nrfx_err_t nrfx_qspi_read(void * p_rx_buffer, + size_t rx_buffer_length, + uint32_t src_address) { - ASSERT(m_cb.state != NRF_DRV_STATE_UNINITIALIZED); - ASSERT(p_rx_buffer != NULL); - /* Checking word alignment. */ - ASSERT(is_word_aligned(p_rx_buffer)); + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(p_rx_buffer != NULL); - if (!nrf_drv_is_in_RAM(p_rx_buffer)) + if (!nrfx_is_in_ram(p_rx_buffer)) { - return NRF_ERROR_INVALID_ADDR; + return NRFX_ERROR_INVALID_ADDR; } nrf_qspi_read_buffer_set(NRF_QSPI, p_rx_buffer, rx_buffer_length, src_address); return qspi_task_perform(NRF_QSPI_TASK_READSTART); } -ret_code_t nrf_drv_qspi_erase(nrf_qspi_erase_len_t length, - uint32_t start_address) +nrfx_err_t nrfx_qspi_erase(nrf_qspi_erase_len_t length, + uint32_t start_address) { - ASSERT(m_cb.state != NRF_DRV_STATE_UNINITIALIZED); - /* Checking word alignment. */ - ASSERT(is_word_aligned((void *)start_address)); + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); nrf_qspi_erase_ptr_set(NRF_QSPI, start_address, length); return qspi_task_perform(NRF_QSPI_TASK_ERASESTART); } -ret_code_t nrf_drv_qspi_chip_erase(void) +nrfx_err_t nrfx_qspi_chip_erase(void) { - return nrf_drv_qspi_erase(NRF_QSPI_ERASE_LEN_ALL, 0); + return nrfx_qspi_erase(NRF_QSPI_ERASE_LEN_ALL, 0); } -void QSPI_IRQHandler(void) +void nrfx_qspi_irq_handler(void) { // Catch Event ready interrupts if (nrf_qspi_event_check(NRF_QSPI, NRF_QSPI_EVENT_READY)) { m_cb.interrupt_driven = false; nrf_qspi_event_clear(NRF_QSPI, NRF_QSPI_EVENT_READY); - m_cb.handler(NRF_DRV_QSPI_EVENT_DONE, m_cb.p_context); + m_cb.handler(NRFX_QSPI_EVENT_DONE, m_cb.p_context); } } -#endif // QSPI_ENABLED +#endif // NRFX_CHECK(NRFX_QSPI_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_rng.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_rng.c new file mode 100644 index 0000000000..a179f7ca80 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_rng.c @@ -0,0 +1,122 @@ +/** + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_RNG_ENABLED) + +#include + +#define NRFX_LOG_MODULE RNG +#include + +/** + * @brief Internal state of RNG driver. + */ +static nrfx_drv_state_t m_rng_state; + +/** + * @brief Pointer to handler calling from interrupt routine. + */ +static nrfx_rng_evt_handler_t m_rng_hndl; + +nrfx_err_t nrfx_rng_init(nrfx_rng_config_t const * p_config, nrfx_rng_evt_handler_t handler) +{ + NRFX_ASSERT(p_config); + NRFX_ASSERT(handler); + if (m_rng_state != NRFX_DRV_STATE_UNINITIALIZED) + { + return NRFX_ERROR_ALREADY_INITIALIZED; + } + + m_rng_hndl = handler; + + if (p_config->error_correction) + { + nrf_rng_error_correction_enable(); + } + nrf_rng_shorts_disable(NRF_RNG_SHORT_VALRDY_STOP_MASK); + NRFX_IRQ_PRIORITY_SET(RNG_IRQn, p_config->interrupt_priority); + NRFX_IRQ_ENABLE(RNG_IRQn); + + m_rng_state = NRFX_DRV_STATE_INITIALIZED; + + return NRFX_SUCCESS; +} + +void nrfx_rng_start(void) +{ + NRFX_ASSERT(m_rng_state == NRFX_DRV_STATE_INITIALIZED); + nrf_rng_event_clear(NRF_RNG_EVENT_VALRDY); + nrf_rng_int_enable(NRF_RNG_INT_VALRDY_MASK); + nrf_rng_task_trigger(NRF_RNG_TASK_START); +} + +void nrfx_rng_stop(void) +{ + NRFX_ASSERT(m_rng_state == NRFX_DRV_STATE_INITIALIZED); + nrf_rng_int_disable(NRF_RNG_INT_VALRDY_MASK); + nrf_rng_task_trigger(NRF_RNG_TASK_STOP); +} + +void nrfx_rng_uninit(void) +{ + NRFX_ASSERT(m_rng_state == NRFX_DRV_STATE_INITIALIZED); + + nrf_rng_int_disable(NRF_RNG_INT_VALRDY_MASK); + nrf_rng_task_trigger(NRF_RNG_TASK_STOP); + NRFX_IRQ_DISABLE(RNG_IRQn); + + m_rng_state = NRFX_DRV_STATE_UNINITIALIZED; + NRFX_LOG_INFO("Uninitialized."); +} + +void nrfx_rng_irq_handler(void) +{ + nrf_rng_event_clear(NRF_RNG_EVENT_VALRDY); + + uint8_t rng_value = nrf_rng_random_value_get(); + + m_rng_hndl(rng_value); + + NRFX_LOG_DEBUG("Event: NRF_RNG_EVENT_VALRDY."); +} + +#endif // NRFX_CHECK(NRFX_RNG_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_rtc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_rtc.c new file mode 100644 index 0000000000..95e8605719 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_rtc.c @@ -0,0 +1,348 @@ +/** + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_RTC_ENABLED) + +#if !(NRFX_CHECK(NRFX_RTC0_ENABLED) || NRFX_CHECK(NRFX_RTC1_ENABLED) || \ + NRFX_CHECK(NRFX_RTC2_ENABLED)) +#error "No enabled RTC instances. Check ." +#endif + +#include + +#define NRFX_LOG_MODULE RTC +#include + +#define EVT_TO_STR(event) \ + (event == NRF_RTC_EVENT_TICK ? "NRF_RTC_EVENT_TICK" : \ + (event == NRF_RTC_EVENT_OVERFLOW ? "NRF_RTC_EVENT_OVERFLOW" : \ + (event == NRF_RTC_EVENT_COMPARE_0 ? "NRF_RTC_EVENT_COMPARE_0" : \ + (event == NRF_RTC_EVENT_COMPARE_1 ? "NRF_RTC_EVENT_COMPARE_1" : \ + (event == NRF_RTC_EVENT_COMPARE_2 ? "NRF_RTC_EVENT_COMPARE_2" : \ + (event == NRF_RTC_EVENT_COMPARE_3 ? "NRF_RTC_EVENT_COMPARE_3" : \ + "UNKNOWN EVENT")))))) + + +/**@brief RTC driver instance control block structure. */ +typedef struct +{ + nrfx_drv_state_t state; /**< Instance state. */ + bool reliable; /**< Reliable mode flag. */ + uint8_t tick_latency; /**< Maximum length of interrupt handler in ticks (max 7.7 ms). */ +} nrfx_rtc_cb_t; + +// User callbacks local storage. +static nrfx_rtc_handler_t m_handlers[NRFX_RTC_ENABLED_COUNT]; +static nrfx_rtc_cb_t m_cb[NRFX_RTC_ENABLED_COUNT]; + +nrfx_err_t nrfx_rtc_init(nrfx_rtc_t const * const p_instance, + nrfx_rtc_config_t const * p_config, + nrfx_rtc_handler_t handler) +{ + NRFX_ASSERT(p_config); + NRFX_ASSERT(handler); + nrfx_err_t err_code; + + m_handlers[p_instance->instance_id] = handler; + + if (m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + NRFX_IRQ_PRIORITY_SET(p_instance->irq, p_config->interrupt_priority); + NRFX_IRQ_ENABLE(p_instance->irq); + nrf_rtc_prescaler_set(p_instance->p_reg, p_config->prescaler); + m_cb[p_instance->instance_id].reliable = p_config->reliable; + m_cb[p_instance->instance_id].tick_latency = p_config->tick_latency; + m_cb[p_instance->instance_id].state = NRFX_DRV_STATE_INITIALIZED; + + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +void nrfx_rtc_uninit(nrfx_rtc_t const * const p_instance) +{ + uint32_t mask = NRF_RTC_INT_TICK_MASK | + NRF_RTC_INT_OVERFLOW_MASK | + NRF_RTC_INT_COMPARE0_MASK | + NRF_RTC_INT_COMPARE1_MASK | + NRF_RTC_INT_COMPARE2_MASK | + NRF_RTC_INT_COMPARE3_MASK; + NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); + + NRFX_IRQ_DISABLE(p_instance->irq); + + nrf_rtc_task_trigger(p_instance->p_reg, NRF_RTC_TASK_STOP); + nrf_rtc_event_disable(p_instance->p_reg, mask); + nrf_rtc_int_disable(p_instance->p_reg, mask); + + m_cb[p_instance->instance_id].state = NRFX_DRV_STATE_UNINITIALIZED; + NRFX_LOG_INFO("Uninitialized."); +} + +void nrfx_rtc_enable(nrfx_rtc_t const * const p_instance) +{ + NRFX_ASSERT(m_cb[p_instance->instance_id].state == NRFX_DRV_STATE_INITIALIZED); + + nrf_rtc_task_trigger(p_instance->p_reg, NRF_RTC_TASK_START); + m_cb[p_instance->instance_id].state = NRFX_DRV_STATE_POWERED_ON; + NRFX_LOG_INFO("Enabled."); +} + +void nrfx_rtc_disable(nrfx_rtc_t const * const p_instance) +{ + NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); + + nrf_rtc_task_trigger(p_instance->p_reg, NRF_RTC_TASK_STOP); + m_cb[p_instance->instance_id].state = NRFX_DRV_STATE_INITIALIZED; + NRFX_LOG_INFO("Disabled."); +} + +nrfx_err_t nrfx_rtc_cc_disable(nrfx_rtc_t const * const p_instance, uint32_t channel) +{ + NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(channelcc_channel_count); + + nrfx_err_t err_code; + uint32_t int_mask = RTC_CHANNEL_INT_MASK(channel); + nrf_rtc_event_t event = RTC_CHANNEL_EVENT_ADDR(channel); + + nrf_rtc_event_disable(p_instance->p_reg,int_mask); + if (nrf_rtc_int_is_enabled(p_instance->p_reg,int_mask)) + { + nrf_rtc_int_disable(p_instance->p_reg,int_mask); + if (nrf_rtc_event_pending(p_instance->p_reg,event)) + { + nrf_rtc_event_clear(p_instance->p_reg,event); + err_code = NRFX_ERROR_TIMEOUT; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + } + NRFX_LOG_INFO("RTC id: %d, channel disabled: %lu.", p_instance->instance_id, channel); + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +nrfx_err_t nrfx_rtc_cc_set(nrfx_rtc_t const * const p_instance, + uint32_t channel, + uint32_t val, + bool enable_irq) +{ + NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(channelcc_channel_count); + + nrfx_err_t err_code; + uint32_t int_mask = RTC_CHANNEL_INT_MASK(channel); + nrf_rtc_event_t event = RTC_CHANNEL_EVENT_ADDR(channel); + + nrf_rtc_event_disable(p_instance->p_reg, int_mask); + nrf_rtc_int_disable(p_instance->p_reg, int_mask); + + val = RTC_WRAP(val); + if (m_cb[p_instance->instance_id].reliable) + { + nrf_rtc_cc_set(p_instance->p_reg,channel,val); + uint32_t cnt = nrf_rtc_counter_get(p_instance->p_reg); + int32_t diff = cnt - val; + if (cnt < val) + { + diff += RTC_COUNTER_COUNTER_Msk; + } + if (diff < m_cb[p_instance->instance_id].tick_latency) + { + err_code = NRFX_ERROR_TIMEOUT; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + } + else + { + nrf_rtc_cc_set(p_instance->p_reg,channel,val); + } + + if (enable_irq) + { + nrf_rtc_event_clear(p_instance->p_reg,event); + nrf_rtc_int_enable(p_instance->p_reg, int_mask); + } + nrf_rtc_event_enable(p_instance->p_reg,int_mask); + + NRFX_LOG_INFO("RTC id: %d, channel enabled: %lu, compare value: %lu.", + p_instance->instance_id, + channel, + val); + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +void nrfx_rtc_tick_enable(nrfx_rtc_t const * const p_instance, bool enable_irq) +{ + nrf_rtc_event_t event = NRF_RTC_EVENT_TICK; + uint32_t mask = NRF_RTC_INT_TICK_MASK; + + nrf_rtc_event_clear(p_instance->p_reg, event); + nrf_rtc_event_enable(p_instance->p_reg, mask); + if (enable_irq) + { + nrf_rtc_int_enable(p_instance->p_reg, mask); + } + NRFX_LOG_INFO("Tick events enabled."); +} + +void nrfx_rtc_tick_disable(nrfx_rtc_t const * const p_instance) +{ + uint32_t mask = NRF_RTC_INT_TICK_MASK; + + nrf_rtc_event_disable(p_instance->p_reg, mask); + nrf_rtc_int_disable(p_instance->p_reg, mask); + NRFX_LOG_INFO("Tick events disabled."); +} + +void nrfx_rtc_overflow_enable(nrfx_rtc_t const * const p_instance, bool enable_irq) +{ + nrf_rtc_event_t event = NRF_RTC_EVENT_OVERFLOW; + uint32_t mask = NRF_RTC_INT_OVERFLOW_MASK; + + nrf_rtc_event_clear(p_instance->p_reg, event); + nrf_rtc_event_enable(p_instance->p_reg, mask); + if (enable_irq) + { + nrf_rtc_int_enable(p_instance->p_reg, mask); + } +} + +void nrfx_rtc_overflow_disable(nrfx_rtc_t const * const p_instance) +{ + uint32_t mask = NRF_RTC_INT_OVERFLOW_MASK; + nrf_rtc_event_disable(p_instance->p_reg, mask); + nrf_rtc_int_disable(p_instance->p_reg, mask); +} + +uint32_t nrfx_rtc_max_ticks_get(nrfx_rtc_t const * const p_instance) +{ + uint32_t ticks; + if (m_cb[p_instance->instance_id].reliable) + { + ticks = RTC_COUNTER_COUNTER_Msk - m_cb[p_instance->instance_id].tick_latency; + } + else + { + ticks = RTC_COUNTER_COUNTER_Msk; + } + return ticks; +} + +static void irq_handler(NRF_RTC_Type * p_reg, + uint32_t instance_id, + uint32_t channel_count) +{ + uint32_t i; + uint32_t int_mask = (uint32_t)NRF_RTC_INT_COMPARE0_MASK; + nrf_rtc_event_t event = NRF_RTC_EVENT_COMPARE_0; + + for (i = 0; i < channel_count; i++) + { + if (nrf_rtc_int_is_enabled(p_reg,int_mask) && nrf_rtc_event_pending(p_reg,event)) + { + nrf_rtc_event_disable(p_reg,int_mask); + nrf_rtc_int_disable(p_reg,int_mask); + nrf_rtc_event_clear(p_reg,event); + NRFX_LOG_DEBUG("Event: %s, instance id: %lu.", EVT_TO_STR(event), instance_id); + m_handlers[instance_id]((nrfx_rtc_int_type_t)i); + } + int_mask <<= 1; + event = (nrf_rtc_event_t)((uint32_t)event + sizeof(uint32_t)); + } + event = NRF_RTC_EVENT_TICK; + if (nrf_rtc_int_is_enabled(p_reg,NRF_RTC_INT_TICK_MASK) && + nrf_rtc_event_pending(p_reg, event)) + { + nrf_rtc_event_clear(p_reg, event); + NRFX_LOG_DEBUG("Event: %s, instance id: %lu.", EVT_TO_STR(event), instance_id); + m_handlers[instance_id](NRFX_RTC_INT_TICK); + } + + event = NRF_RTC_EVENT_OVERFLOW; + if (nrf_rtc_int_is_enabled(p_reg,NRF_RTC_INT_OVERFLOW_MASK) && + nrf_rtc_event_pending(p_reg, event)) + { + nrf_rtc_event_clear(p_reg,event); + NRFX_LOG_DEBUG("Event: %s, instance id: %lu.", EVT_TO_STR(event), instance_id); + m_handlers[instance_id](NRFX_RTC_INT_OVERFLOW); + } +} + +#if NRFX_CHECK(NRFX_RTC0_ENABLED) +void nrfx_rtc_0_irq_handler(void) +{ + irq_handler(NRF_RTC0, NRFX_RTC0_INST_IDX, NRF_RTC_CC_CHANNEL_COUNT(0)); +} +#endif + +#if NRFX_CHECK(NRFX_RTC1_ENABLED) +void nrfx_rtc_1_irq_handler(void) +{ + irq_handler(NRF_RTC1, NRFX_RTC1_INST_IDX, NRF_RTC_CC_CHANNEL_COUNT(1)); +} +#endif + +#if NRFX_CHECK(NRFX_RTC2_ENABLED) +void nrfx_rtc_2_irq_handler(void) +{ + irq_handler(NRF_RTC2, NRFX_RTC2_INST_IDX, NRF_RTC_CC_CHANNEL_COUNT(2)); +} +#endif + +#endif // NRFX_CHECK(NRFX_RTC_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/saadc/nrf_drv_saadc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_saadc.c similarity index 60% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/saadc/nrf_drv_saadc.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_saadc.c index 804f46ef30..4ab3409569 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/saadc/nrf_drv_saadc.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_saadc.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,31 +37,22 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(SAADC) -#include "nrf_drv_saadc.h" -#include "nrf_assert.h" -#include "nrf_drv_common.h" -#include "app_util_platform.h" +#include -#define NRF_LOG_MODULE_NAME saadc +#if NRFX_CHECK(NRFX_SAADC_ENABLED) +#include -#if SAADC_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL SAADC_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR SAADC_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR SAADC_CONFIG_DEBUG_COLOR -#define EVT_TO_STR(event) (event == NRF_SAADC_EVENT_STARTED ? "NRF_SAADC_EVENT_STARTED" : \ - (event == NRF_SAADC_EVENT_END ? "NRF_SAADC_EVENT_END" : \ - (event == NRF_SAADC_EVENT_DONE ? "NRF_SAADC_EVENT_DONE" : \ - (event == NRF_SAADC_EVENT_RESULTDONE ? "NRF_SAADC_EVENT_RESULTDONE" : \ - (event == NRF_SAADC_EVENT_CALIBRATEDONE ? "NRF_SAADC_EVENT_CALIBRATEDONE" : \ - (event == NRF_SAADC_EVENT_STOPPED ? "NRF_SAADC_EVENT_STOPPED" : "UNKNOWN EVENT")))))) -#else //SAADC_CONFIG_LOG_ENABLED -#define EVT_TO_STR(event) "" -#define NRF_LOG_LEVEL 0 -#endif //SAADC_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); +#define NRFX_LOG_MODULE SAADC +#include + +#define EVT_TO_STR(event) \ + (event == NRF_SAADC_EVENT_STARTED ? "NRF_SAADC_EVENT_STARTED" : \ + (event == NRF_SAADC_EVENT_END ? "NRF_SAADC_EVENT_END" : \ + (event == NRF_SAADC_EVENT_DONE ? "NRF_SAADC_EVENT_DONE" : \ + (event == NRF_SAADC_EVENT_RESULTDONE ? "NRF_SAADC_EVENT_RESULTDONE" : \ + (event == NRF_SAADC_EVENT_CALIBRATEDONE ? "NRF_SAADC_EVENT_CALIBRATEDONE" : \ + (event == NRF_SAADC_EVENT_STOPPED ? "NRF_SAADC_EVENT_STOPPED" : \ + "UNKNOWN EVENT")))))) typedef enum @@ -78,12 +69,10 @@ typedef struct nrf_saadc_input_t pseln; } nrf_saadc_psel_buffer; -static const nrf_drv_saadc_config_t m_default_config = NRF_DRV_SAADC_DEFAULT_CONFIG; - /** @brief SAADC control block.*/ typedef struct { - nrf_drv_saadc_event_handler_t event_handler; ///< Event handler function pointer. + nrfx_saadc_event_handler_t event_handler; ///< Event handler function pointer. volatile nrf_saadc_value_t * p_buffer; ///< Sample buffer. volatile uint16_t buffer_size; ///< Size of the sample buffer. volatile nrf_saadc_value_t * p_secondary_buffer; ///< Secondary sample buffer. @@ -92,13 +81,13 @@ typedef struct uint16_t secondary_buffer_size; ///< Size of the secondary buffer. uint16_t buffer_size_left; ///< When low power mode is active indicates how many samples left to convert on current buffer. nrf_saadc_psel_buffer psel[NRF_SAADC_CHANNEL_COUNT]; ///< Pin configurations of SAADC channels. - nrf_drv_state_t state; ///< Driver initialization state. + nrfx_drv_state_t state; ///< Driver initialization state. uint8_t active_channels; ///< Number of enabled SAADC channels. bool low_power_mode; ///< Indicates if low power mode is active. bool conversions_end; ///< When low power mode is active indicates end of conversions on current buffer. -} nrf_drv_saadc_cb_t; +} nrfx_saadc_cb_t; -static nrf_drv_saadc_cb_t m_cb; +static nrfx_saadc_cb_t m_cb; #define LOW_LIMIT_TO_FLAG(channel) ((2 * channel + 1)) #define HIGH_LIMIT_TO_FLAG(channel) ((2 * channel)) @@ -110,17 +99,17 @@ static nrf_drv_saadc_cb_t m_cb; ? NRF_SAADC_LIMIT_LOW : NRF_SAADC_LIMIT_HIGH) #define HW_TIMEOUT 10000 -void SAADC_IRQHandler(void) +void nrfx_saadc_irq_handler(void) { if (nrf_saadc_event_check(NRF_SAADC_EVENT_END)) { nrf_saadc_event_clear(NRF_SAADC_EVENT_END); - NRF_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_SAADC_EVENT_END)); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_SAADC_EVENT_END)); if (!m_cb.low_power_mode || m_cb.conversions_end) { - nrf_drv_saadc_evt_t evt; - evt.type = NRF_DRV_SAADC_EVT_DONE; + nrfx_saadc_evt_t evt; + evt.type = NRFX_SAADC_EVT_DONE; evt.data.done.p_buffer = (nrf_saadc_value_t *)m_cb.p_buffer; evt.data.done.size = m_cb.buffer_size; @@ -146,7 +135,7 @@ void SAADC_IRQHandler(void) if (m_cb.low_power_mode && nrf_saadc_event_check(NRF_SAADC_EVENT_STARTED)) { nrf_saadc_event_clear(NRF_SAADC_EVENT_STARTED); - NRF_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_SAADC_EVENT_STARTED)); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_SAADC_EVENT_STARTED)); if (m_cb.buffer_size_left > m_cb.active_channels) { @@ -178,17 +167,17 @@ void SAADC_IRQHandler(void) if (nrf_saadc_event_check(NRF_SAADC_EVENT_CALIBRATEDONE)) { nrf_saadc_event_clear(NRF_SAADC_EVENT_CALIBRATEDONE); - NRF_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_SAADC_EVENT_CALIBRATEDONE)); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_SAADC_EVENT_CALIBRATEDONE)); m_cb.adc_state = NRF_SAADC_STATE_IDLE; - nrf_drv_saadc_evt_t evt; - evt.type = NRF_DRV_SAADC_EVT_CALIBRATEDONE; + nrfx_saadc_evt_t evt; + evt.type = NRFX_SAADC_EVT_CALIBRATEDONE; m_cb.event_handler(&evt); } if (nrf_saadc_event_check(NRF_SAADC_EVENT_STOPPED)) { nrf_saadc_event_clear(NRF_SAADC_EVENT_STOPPED); - NRF_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_SAADC_EVENT_STOPPED)); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_SAADC_EVENT_STOPPED)); m_cb.adc_state = NRF_SAADC_STATE_IDLE; } else @@ -205,13 +194,13 @@ void SAADC_IRQHandler(void) if (nrf_saadc_event_check(event)) { nrf_saadc_event_clear(event); - nrf_drv_saadc_evt_t evt; - evt.type = NRF_DRV_SAADC_EVT_LIMIT; + nrfx_saadc_evt_t evt; + evt.type = NRFX_SAADC_EVT_LIMIT; evt.data.limit.channel = LIMIT_EVENT_TO_CHANNEL(event); evt.data.limit.limit_type = LIMIT_EVENT_TO_LIMIT_TYPE(event); - NRF_LOG_DEBUG("Event limit, channel: %d, limit type: %d.", - evt.data.limit.channel, - evt.data.limit.limit_type); + NRFX_LOG_DEBUG("Event limit, channel: %d, limit type: %d.", + evt.data.limit.channel, + evt.data.limit.limit_type); m_cb.event_handler(&evt); } } @@ -219,36 +208,27 @@ void SAADC_IRQHandler(void) } -ret_code_t nrf_drv_saadc_init(nrf_drv_saadc_config_t const * p_config, - nrf_drv_saadc_event_handler_t event_handler) +nrfx_err_t nrfx_saadc_init(nrfx_saadc_config_t const * p_config, + nrfx_saadc_event_handler_t event_handler) { - ret_code_t err_code; + NRFX_ASSERT(p_config); + NRFX_ASSERT(event_handler); + nrfx_err_t err_code; - if (m_cb.state != NRF_DRV_STATE_UNINITIALIZED) + if (m_cb.state != NRFX_DRV_STATE_UNINITIALIZED) { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } - if (event_handler == NULL) - { - err_code = NRF_ERROR_INVALID_PARAM; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } - - if (p_config == NULL) - { - p_config = &m_default_config; - } m_cb.event_handler = event_handler; nrf_saadc_resolution_set(p_config->resolution); nrf_saadc_oversample_set(p_config->oversample); m_cb.low_power_mode = p_config->low_power_mode; - m_cb.state = NRF_DRV_STATE_INITIALIZED; + m_cb.state = NRFX_DRV_STATE_INITIALIZED; m_cb.adc_state = NRF_SAADC_STATE_IDLE; m_cb.active_channels = 0; m_cb.limits_enabled_flags = 0; @@ -257,7 +237,8 @@ ret_code_t nrf_drv_saadc_init(nrf_drv_saadc_config_t const * p_config, nrf_saadc_int_disable(NRF_SAADC_INT_ALL); nrf_saadc_event_clear(NRF_SAADC_EVENT_END); nrf_saadc_event_clear(NRF_SAADC_EVENT_STARTED); - nrf_drv_common_irq_enable(SAADC_IRQn, p_config->interrupt_priority); + NRFX_IRQ_PRIORITY_SET(SAADC_IRQn, p_config->interrupt_priority); + NRFX_IRQ_ENABLE(SAADC_IRQn); nrf_saadc_int_enable(NRF_SAADC_INT_END); if (m_cb.low_power_mode) @@ -267,29 +248,25 @@ ret_code_t nrf_drv_saadc_init(nrf_drv_saadc_config_t const * p_config, nrf_saadc_enable(); - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } -void nrf_drv_saadc_uninit(void) +void nrfx_saadc_uninit(void) { - ASSERT(m_cb.state != NRF_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); nrf_saadc_int_disable(NRF_SAADC_INT_ALL); - nrf_drv_common_irq_disable(SAADC_IRQn); + NRFX_IRQ_DISABLE(SAADC_IRQn); nrf_saadc_task_trigger(NRF_SAADC_TASK_STOP); // Wait for ADC being stopped. - uint32_t timeout = HW_TIMEOUT; - - while (nrf_saadc_event_check(NRF_SAADC_EVENT_STOPPED) == 0 && timeout > 0) - { - --timeout; - } - ASSERT(timeout > 0); + bool result; + NRFX_WAIT_FOR(nrf_saadc_event_check(NRF_SAADC_EVENT_STOPPED), HW_TIMEOUT, 0, result); + NRFX_ASSERT(result); nrf_saadc_disable(); m_cb.adc_state = NRF_SAADC_STATE_IDLE; @@ -298,45 +275,48 @@ void nrf_drv_saadc_uninit(void) { if (m_cb.psel[channel].pselp != NRF_SAADC_INPUT_DISABLED) { - (void)nrf_drv_saadc_channel_uninit(channel); + nrfx_err_t err_code = nrfx_saadc_channel_uninit(channel); + NRFX_ASSERT(err_code == NRFX_SUCCESS); } } - m_cb.state = NRF_DRV_STATE_UNINITIALIZED; + m_cb.state = NRFX_DRV_STATE_UNINITIALIZED; } -ret_code_t nrf_drv_saadc_channel_init(uint8_t channel, - nrf_saadc_channel_config_t const * const p_config) +nrfx_err_t nrfx_saadc_channel_init(uint8_t channel, + nrf_saadc_channel_config_t const * const p_config) { - ASSERT(m_cb.state != NRF_DRV_STATE_UNINITIALIZED); - ASSERT(channel < NRF_SAADC_CHANNEL_COUNT); + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(channel < NRF_SAADC_CHANNEL_COUNT); // Oversampling can be used only with one channel. - ASSERT((nrf_saadc_oversample_get() == NRF_SAADC_OVERSAMPLE_DISABLED) || - (m_cb.active_channels == 0)); - ASSERT((p_config->pin_p <= NRF_SAADC_INPUT_VDD) && - (p_config->pin_p > NRF_SAADC_INPUT_DISABLED)); - ASSERT(p_config->pin_n <= NRF_SAADC_INPUT_VDD); + NRFX_ASSERT((nrf_saadc_oversample_get() == NRF_SAADC_OVERSAMPLE_DISABLED) || + (m_cb.active_channels == 0)); + NRFX_ASSERT((p_config->pin_p <= NRF_SAADC_INPUT_VDD) && + (p_config->pin_p > NRF_SAADC_INPUT_DISABLED)); + NRFX_ASSERT(p_config->pin_n <= NRF_SAADC_INPUT_VDD); - ret_code_t err_code; + nrfx_err_t err_code; // A channel can only be initialized if the driver is in the idle state. if (m_cb.adc_state != NRF_SAADC_STATE_IDLE) { - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } #ifdef NRF52_PAN_74 - if ((p_config->acq_time == NRF_SAADC_ACQTIME_3US) || (p_config->acq_time == NRF_SAADC_ACQTIME_5US)) + if ((p_config->acq_time == NRF_SAADC_ACQTIME_3US) || + (p_config->acq_time == NRF_SAADC_ACQTIME_5US)) { nrf_saadc_disable(); } #endif //NRF52_PAN_74 - if (!m_cb.psel[channel].pselp) + if (m_cb.psel[channel].pselp == NRF_SAADC_INPUT_DISABLED) { ++m_cb.active_channels; } @@ -346,67 +326,70 @@ ret_code_t nrf_drv_saadc_channel_init(uint8_t c nrf_saadc_channel_input_set(channel, p_config->pin_p, p_config->pin_n); #ifdef NRF52_PAN_74 - if ((p_config->acq_time == NRF_SAADC_ACQTIME_3US) || (p_config->acq_time == NRF_SAADC_ACQTIME_5US)) + if ((p_config->acq_time == NRF_SAADC_ACQTIME_3US) || + (p_config->acq_time == NRF_SAADC_ACQTIME_5US)) { nrf_saadc_enable(); } #endif //NRF52_PAN_74 - NRF_LOG_INFO("Channel initialized: %d.", channel); - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + NRFX_LOG_INFO("Channel initialized: %d.", channel); + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } -ret_code_t nrf_drv_saadc_channel_uninit(uint8_t channel) +nrfx_err_t nrfx_saadc_channel_uninit(uint8_t channel) { - ASSERT(channel < NRF_SAADC_CHANNEL_COUNT) - ASSERT(m_cb.state != NRF_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(channel < NRF_SAADC_CHANNEL_COUNT); + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); - ret_code_t err_code; + nrfx_err_t err_code; // A channel can only be uninitialized if the driver is in the idle state. if (m_cb.adc_state != NRF_SAADC_STATE_IDLE) { - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } - if (m_cb.psel[channel].pselp) + if (m_cb.psel[channel].pselp != NRF_SAADC_INPUT_DISABLED) { --m_cb.active_channels; } m_cb.psel[channel].pselp = NRF_SAADC_INPUT_DISABLED; m_cb.psel[channel].pseln = NRF_SAADC_INPUT_DISABLED; nrf_saadc_channel_input_set(channel, NRF_SAADC_INPUT_DISABLED, NRF_SAADC_INPUT_DISABLED); - nrf_drv_saadc_limits_set(channel, NRF_DRV_SAADC_LIMITL_DISABLED, NRF_DRV_SAADC_LIMITH_DISABLED); - NRF_LOG_INFO("Channel denitialized: %d.", channel); + nrfx_saadc_limits_set(channel, NRFX_SAADC_LIMITL_DISABLED, NRFX_SAADC_LIMITH_DISABLED); + NRFX_LOG_INFO("Channel denitialized: %d.", channel); - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", - (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } -uint32_t nrf_drv_saadc_sample_task_get(void) +uint32_t nrfx_saadc_sample_task_get(void) { return nrf_saadc_task_address_get( - m_cb.low_power_mode ? NRF_SAADC_TASK_START : NRF_SAADC_TASK_SAMPLE); + m_cb.low_power_mode ? NRF_SAADC_TASK_START : NRF_SAADC_TASK_SAMPLE); } -ret_code_t nrf_drv_saadc_sample_convert(uint8_t channel, nrf_saadc_value_t * p_value) +nrfx_err_t nrfx_saadc_sample_convert(uint8_t channel, nrf_saadc_value_t * p_value) { - ret_code_t err_code; + nrfx_err_t err_code; if (m_cb.adc_state != NRF_SAADC_STATE_IDLE) { - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } m_cb.adc_state = NRF_SAADC_STATE_BUSY; @@ -419,21 +402,18 @@ ret_code_t nrf_drv_saadc_sample_convert(uint8_t channel, nrf_saadc_value_t * p_v nrf_saadc_channel_input_set(i, NRF_SAADC_INPUT_DISABLED, NRF_SAADC_INPUT_DISABLED); } } - nrf_saadc_channel_input_set(channel, - m_cb.psel[channel].pselp, m_cb.psel[channel].pseln); + nrf_saadc_channel_input_set(channel, m_cb.psel[channel].pselp, m_cb.psel[channel].pseln); nrf_saadc_task_trigger(NRF_SAADC_TASK_START); nrf_saadc_task_trigger(NRF_SAADC_TASK_SAMPLE); - uint32_t timeout = HW_TIMEOUT; + bool result; + NRFX_WAIT_FOR(nrf_saadc_event_check(NRF_SAADC_EVENT_END), HW_TIMEOUT, 0, result); + NRFX_ASSERT(result); - while (0 == nrf_saadc_event_check(NRF_SAADC_EVENT_END) && timeout > 0) - { - timeout--; - } nrf_saadc_event_clear(NRF_SAADC_EVENT_STARTED); nrf_saadc_event_clear(NRF_SAADC_EVENT_END); - NRF_LOG_INFO("Conversion value: %d, channel: %d.", *p_value & 0x0000FFFF, channel); + NRFX_LOG_INFO("Conversion value: %d, channel %d.", *p_value, channel); if (m_cb.active_channels > 1) { @@ -454,25 +434,28 @@ ret_code_t nrf_drv_saadc_sample_convert(uint8_t channel, nrf_saadc_value_t * p_v m_cb.adc_state = NRF_SAADC_STATE_IDLE; - err_code = NRF_SUCCESS; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_SUCCESS; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } -ret_code_t nrf_drv_saadc_buffer_convert(nrf_saadc_value_t * p_buffer, uint16_t size) +nrfx_err_t nrfx_saadc_buffer_convert(nrf_saadc_value_t * p_buffer, uint16_t size) { - ASSERT(m_cb.state != NRF_DRV_STATE_UNINITIALIZED); - ASSERT((size % m_cb.active_channels) == 0); - ret_code_t err_code; - + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT((size % m_cb.active_channels) == 0); + nrfx_err_t err_code; nrf_saadc_int_disable(NRF_SAADC_INT_END | NRF_SAADC_INT_CALIBRATEDONE); if (m_cb.adc_state == NRF_SAADC_STATE_CALIBRATION) { nrf_saadc_int_enable(NRF_SAADC_INT_END | NRF_SAADC_INT_CALIBRATEDONE); - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } if (m_cb.adc_state == NRF_SAADC_STATE_BUSY) @@ -480,8 +463,10 @@ ret_code_t nrf_drv_saadc_buffer_convert(nrf_saadc_value_t * p_buffer, uint16_t s if ( m_cb.p_secondary_buffer) { nrf_saadc_int_enable(NRF_SAADC_INT_END); - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } else @@ -495,8 +480,10 @@ ret_code_t nrf_drv_saadc_buffer_convert(nrf_saadc_value_t * p_buffer, uint16_t s nrf_saadc_buffer_init(p_buffer, size); } nrf_saadc_int_enable(NRF_SAADC_INT_END); - err_code = NRF_SUCCESS; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_SUCCESS; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } } @@ -507,8 +494,10 @@ ret_code_t nrf_drv_saadc_buffer_convert(nrf_saadc_value_t * p_buffer, uint16_t s m_cb.buffer_size = size; m_cb.p_secondary_buffer = NULL; - NRF_LOG_INFO("Function: %d, buffer length: %d, active channels: %d.", - (uint32_t)__func__, size, m_cb.active_channels); + NRFX_LOG_INFO("Function: %s, buffer length: %d, active channels: %d.", + __func__, + size, + m_cb.active_channels); if (m_cb.low_power_mode) { @@ -522,20 +511,20 @@ ret_code_t nrf_drv_saadc_buffer_convert(nrf_saadc_value_t * p_buffer, uint16_t s nrf_saadc_task_trigger(NRF_SAADC_TASK_START); } - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } -ret_code_t nrf_drv_saadc_sample() +nrfx_err_t nrfx_saadc_sample() { - ASSERT(m_cb.state != NRF_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); - ret_code_t err_code = NRF_SUCCESS; + nrfx_err_t err_code = NRFX_SUCCESS; if (m_cb.adc_state != NRF_SAADC_STATE_BUSY) { - err_code = NRF_ERROR_INVALID_STATE; + err_code = NRFX_ERROR_INVALID_STATE; } else if (m_cb.low_power_mode) { @@ -546,21 +535,23 @@ ret_code_t nrf_drv_saadc_sample() nrf_saadc_task_trigger(NRF_SAADC_TASK_SAMPLE); } - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } -ret_code_t nrf_drv_saadc_calibrate_offset() +nrfx_err_t nrfx_saadc_calibrate_offset() { - ASSERT(m_cb.state != NRF_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); - ret_code_t err_code; + nrfx_err_t err_code; if (m_cb.adc_state != NRF_SAADC_STATE_IDLE) { - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } @@ -569,23 +560,26 @@ ret_code_t nrf_drv_saadc_calibrate_offset() nrf_saadc_event_clear(NRF_SAADC_EVENT_CALIBRATEDONE); nrf_saadc_int_enable(NRF_SAADC_INT_CALIBRATEDONE); nrf_saadc_task_trigger(NRF_SAADC_TASK_CALIBRATEOFFSET); - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } -bool nrf_drv_saadc_is_busy(void) +bool nrfx_saadc_is_busy(void) { return (m_cb.adc_state != NRF_SAADC_STATE_IDLE); } -void nrf_drv_saadc_abort(void) +void nrfx_saadc_abort(void) { - if (nrf_drv_saadc_is_busy()) + if (nrfx_saadc_is_busy()) { nrf_saadc_event_clear(NRF_SAADC_EVENT_STOPPED); + nrf_saadc_int_enable(NRF_SAADC_INT_STOPPED); nrf_saadc_task_trigger(NRF_SAADC_TASK_STOP); if (m_cb.adc_state == NRF_SAADC_STATE_CALIBRATION) @@ -595,33 +589,31 @@ void nrf_drv_saadc_abort(void) else { // Wait for ADC being stopped. - uint32_t timeout = HW_TIMEOUT; - - while ((m_cb.adc_state != NRF_SAADC_STATE_IDLE) && (timeout > 0)) - { - --timeout; - } - ASSERT(timeout > 0); + bool result; + NRFX_WAIT_FOR((m_cb.adc_state != NRF_SAADC_STATE_IDLE), HW_TIMEOUT, 0, result); + NRFX_ASSERT(result); } + nrf_saadc_int_disable(NRF_SAADC_INT_STOPPED); + m_cb.p_buffer = 0; m_cb.p_secondary_buffer = 0; - NRF_LOG_INFO("Conversion aborted."); + NRFX_LOG_INFO("Conversion aborted."); } } -void nrf_drv_saadc_limits_set(uint8_t channel, int16_t limit_low, int16_t limit_high) +void nrfx_saadc_limits_set(uint8_t channel, int16_t limit_low, int16_t limit_high) { - ASSERT(m_cb.state != NRF_DRV_STATE_UNINITIALIZED); - ASSERT(m_cb.event_handler); // only non blocking mode supported - ASSERT(limit_low >= NRF_DRV_SAADC_LIMITL_DISABLED); - ASSERT(limit_high <= NRF_DRV_SAADC_LIMITH_DISABLED); - ASSERT(limit_low < limit_high); + NRFX_ASSERT(m_cb.state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(m_cb.event_handler); // only non blocking mode supported + NRFX_ASSERT(limit_low >= NRFX_SAADC_LIMITL_DISABLED); + NRFX_ASSERT(limit_high <= NRFX_SAADC_LIMITH_DISABLED); + NRFX_ASSERT(limit_low < limit_high); nrf_saadc_channel_limits_set(channel, limit_low, limit_high); uint32_t int_mask = nrf_saadc_limit_int_get(channel, NRF_SAADC_LIMIT_LOW); - if (limit_low == NRF_DRV_SAADC_LIMITL_DISABLED) + if (limit_low == NRFX_SAADC_LIMITL_DISABLED) { m_cb.limits_enabled_flags &= ~(0x80000000 >> LOW_LIMIT_TO_FLAG(channel)); nrf_saadc_int_disable(int_mask); @@ -633,7 +625,7 @@ void nrf_drv_saadc_limits_set(uint8_t channel, int16_t limit_low, int16_t limit_ } int_mask = nrf_saadc_limit_int_get(channel, NRF_SAADC_LIMIT_HIGH); - if (limit_high == NRF_DRV_SAADC_LIMITH_DISABLED) + if (limit_high == NRFX_SAADC_LIMITH_DISABLED) { m_cb.limits_enabled_flags &= ~(0x80000000 >> HIGH_LIMIT_TO_FLAG(channel)); nrf_saadc_int_disable(int_mask); @@ -644,4 +636,4 @@ void nrf_drv_saadc_limits_set(uint8_t channel, int16_t limit_low, int16_t limit_ nrf_saadc_int_enable(int_mask); } } -#endif //NRF_MODULE_ENABLED(SAADC) +#endif // NRFX_CHECK(NRFX_SAADC_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_spi.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_spi.c new file mode 100644 index 0000000000..2c6bb44c2c --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_spi.c @@ -0,0 +1,441 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_SPI_ENABLED) + +#if !(NRFX_CHECK(NRFX_SPI0_ENABLED) || NRFX_CHECK(NRFX_SPI1_ENABLED) || \ + NRFX_CHECK(NRFX_SPI2_ENABLED)) +#error "No enabled SPI instances. Check ." +#endif + +#include +#include "prs/nrfx_prs.h" +#include + +#define NRFX_LOG_MODULE SPI +#include + +// Control block - driver instance local data. +typedef struct +{ + nrfx_spi_evt_handler_t handler; + void * p_context; + nrfx_spi_evt_t evt; // Keep the struct that is ready for event handler. Less memcpy. + nrfx_drv_state_t state; + volatile bool transfer_in_progress; + + // [no need for 'volatile' attribute for the following members, as they + // are not concurrently used in IRQ handlers and main line code] + uint8_t ss_pin; + uint8_t miso_pin; + uint8_t orc; + size_t bytes_transferred; + + bool abort; +} spi_control_block_t; +static spi_control_block_t m_cb[NRFX_SPI_ENABLED_COUNT]; + + +nrfx_err_t nrfx_spi_init(nrfx_spi_t const * const p_instance, + nrfx_spi_config_t const * p_config, + nrfx_spi_evt_handler_t handler, + void * p_context) +{ + NRFX_ASSERT(p_config); + spi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + nrfx_err_t err_code; + + if (p_cb->state != NRFX_DRV_STATE_UNINITIALIZED) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + static nrfx_irq_handler_t const irq_handlers[NRFX_SPI_ENABLED_COUNT] = { + #if NRFX_CHECK(NRFX_SPI0_ENABLED) + nrfx_spi_0_irq_handler, + #endif + #if NRFX_CHECK(NRFX_SPI1_ENABLED) + nrfx_spi_1_irq_handler, + #endif + #if NRFX_CHECK(NRFX_SPI2_ENABLED) + nrfx_spi_2_irq_handler, + #endif + }; + if (nrfx_prs_acquire(p_instance->p_reg, + irq_handlers[p_instance->drv_inst_idx]) != NRFX_SUCCESS) + { + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } +#endif // NRFX_CHECK(NRFX_PRS_ENABLED) + + p_cb->handler = handler; + p_cb->p_context = p_context; + + uint32_t mosi_pin; + uint32_t miso_pin; + // Configure pins used by the peripheral: + // - SCK - output with initial value corresponding with the SPI mode used: + // 0 - for modes 0 and 1 (CPOL = 0), 1 - for modes 2 and 3 (CPOL = 1); + // according to the reference manual guidelines this pin and its input + // buffer must always be connected for the SPI to work. + if (p_config->mode <= NRF_SPI_MODE_1) + { + nrf_gpio_pin_clear(p_config->sck_pin); + } + else + { + nrf_gpio_pin_set(p_config->sck_pin); + } + nrf_gpio_cfg(p_config->sck_pin, + NRF_GPIO_PIN_DIR_OUTPUT, + NRF_GPIO_PIN_INPUT_CONNECT, + NRF_GPIO_PIN_NOPULL, + NRF_GPIO_PIN_S0S1, + NRF_GPIO_PIN_NOSENSE); + // - MOSI (optional) - output with initial value 0, + if (p_config->mosi_pin != NRFX_SPI_PIN_NOT_USED) + { + mosi_pin = p_config->mosi_pin; + nrf_gpio_pin_clear(mosi_pin); + nrf_gpio_cfg_output(mosi_pin); + } + else + { + mosi_pin = NRF_SPI_PIN_NOT_CONNECTED; + } + // - MISO (optional) - input, + if (p_config->miso_pin != NRFX_SPI_PIN_NOT_USED) + { + miso_pin = p_config->miso_pin; + nrf_gpio_cfg_input(miso_pin, (nrf_gpio_pin_pull_t)NRFX_SPI_MISO_PULL_CFG); + } + else + { + miso_pin = NRF_SPI_PIN_NOT_CONNECTED; + } + m_cb[p_instance->drv_inst_idx].miso_pin = p_config->miso_pin; + // - Slave Select (optional) - output with initial value 1 (inactive). + if (p_config->ss_pin != NRFX_SPI_PIN_NOT_USED) + { + nrf_gpio_pin_set(p_config->ss_pin); + nrf_gpio_cfg_output(p_config->ss_pin); + } + m_cb[p_instance->drv_inst_idx].ss_pin = p_config->ss_pin; + + NRF_SPI_Type * p_spi = p_instance->p_reg; + nrf_spi_pins_set(p_spi, p_config->sck_pin, mosi_pin, miso_pin); + nrf_spi_frequency_set(p_spi, p_config->frequency); + nrf_spi_configure(p_spi, p_config->mode, p_config->bit_order); + + m_cb[p_instance->drv_inst_idx].orc = p_config->orc; + + if (p_cb->handler) + { + nrf_spi_int_enable(p_spi, NRF_SPI_INT_READY_MASK); + } + + nrf_spi_enable(p_spi); + + if (p_cb->handler) + { + NRFX_IRQ_PRIORITY_SET(nrfx_get_irq_number(p_instance->p_reg), + p_config->irq_priority); + NRFX_IRQ_ENABLE(nrfx_get_irq_number(p_instance->p_reg)); + } + + p_cb->transfer_in_progress = false; + p_cb->state = NRFX_DRV_STATE_INITIALIZED; + + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +void nrfx_spi_uninit(nrfx_spi_t const * const p_instance) +{ + spi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); + + if (p_cb->handler) + { + NRFX_IRQ_DISABLE(nrfx_get_irq_number(p_instance->p_reg)); + } + + NRF_SPI_Type * p_spi = p_instance->p_reg; + if (p_cb->handler) + { + nrf_spi_int_disable(p_spi, NRF_SPI_ALL_INTS_MASK); + } + + if (p_cb->miso_pin != NRFX_SPI_PIN_NOT_USED) + { + nrf_gpio_cfg_default(p_cb->miso_pin); + } + nrf_spi_disable(p_spi); + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + nrfx_prs_release(p_instance->p_reg); +#endif + + p_cb->state = NRFX_DRV_STATE_UNINITIALIZED; +} + +static void finish_transfer(spi_control_block_t * p_cb) +{ + // If Slave Select signal is used, this is the time to deactivate it. + if (p_cb->ss_pin != NRFX_SPI_PIN_NOT_USED) + { + nrf_gpio_pin_set(p_cb->ss_pin); + } + + // By clearing this flag before calling the handler we allow subsequent + // transfers to be started directly from the handler function. + p_cb->transfer_in_progress = false; + + p_cb->evt.type = NRFX_SPI_EVENT_DONE; + p_cb->handler(&p_cb->evt, p_cb->p_context); +} + +// This function is called from the IRQ handler or, in blocking mode, directly +// from the 'spi_xfer' function. +// It returns true as long as the transfer should be continued, otherwise (when +// there is nothing more to send/receive) it returns false. +static bool transfer_byte(NRF_SPI_Type * p_spi, spi_control_block_t * p_cb) +{ + // Read the data byte received in this transfer (always, because no further + // READY event can be generated until the current byte is read out from the + // RXD register), and store it in the RX buffer (only when needed). + volatile uint8_t rx_data = nrf_spi_rxd_get(p_spi); + if (p_cb->bytes_transferred < p_cb->evt.xfer_desc.rx_length) + { + p_cb->evt.xfer_desc.p_rx_buffer[p_cb->bytes_transferred] = rx_data; + } + + ++p_cb->bytes_transferred; + + // Check if there are more bytes to send or receive and write proper data + // byte (next one from TX buffer or over-run character) to the TXD register + // when needed. + // NOTE - we've already used 'p_cb->bytes_transferred + 1' bytes from our + // buffers, because we take advantage of double buffering of TXD + // register (so in effect one byte is still being transmitted now); + // see how the transfer is started in the 'spi_xfer' function. + size_t bytes_used = p_cb->bytes_transferred + 1; + + if (p_cb->abort) + { + if (bytes_used < p_cb->evt.xfer_desc.tx_length) + { + p_cb->evt.xfer_desc.tx_length = bytes_used; + } + if (bytes_used < p_cb->evt.xfer_desc.rx_length) + { + p_cb->evt.xfer_desc.rx_length = bytes_used; + } + } + + if (bytes_used < p_cb->evt.xfer_desc.tx_length) + { + nrf_spi_txd_set(p_spi, p_cb->evt.xfer_desc.p_tx_buffer[bytes_used]); + return true; + } + else if (bytes_used < p_cb->evt.xfer_desc.rx_length) + { + nrf_spi_txd_set(p_spi, p_cb->orc); + return true; + } + + return (p_cb->bytes_transferred < p_cb->evt.xfer_desc.tx_length || + p_cb->bytes_transferred < p_cb->evt.xfer_desc.rx_length); +} + +static void spi_xfer(NRF_SPI_Type * p_spi, + spi_control_block_t * p_cb, + nrfx_spi_xfer_desc_t const * p_xfer_desc) +{ + p_cb->bytes_transferred = 0; + nrf_spi_int_disable(p_spi, NRF_SPI_INT_READY_MASK); + + nrf_spi_event_clear(p_spi, NRF_SPI_EVENT_READY); + + // Start the transfer by writing some byte to the TXD register; + // if TX buffer is not empty, take the first byte from this buffer, + // otherwise - use over-run character. + nrf_spi_txd_set(p_spi, + (p_xfer_desc->tx_length > 0 ? p_xfer_desc->p_tx_buffer[0] : p_cb->orc)); + + // TXD register is double buffered, so next byte to be transmitted can + // be written immediately, if needed, i.e. if TX or RX transfer is to + // be more that 1 byte long. Again - if there is something more in TX + // buffer send it, otherwise use over-run character. + if (p_xfer_desc->tx_length > 1) + { + nrf_spi_txd_set(p_spi, p_xfer_desc->p_tx_buffer[1]); + } + else if (p_xfer_desc->rx_length > 1) + { + nrf_spi_txd_set(p_spi, p_cb->orc); + } + + // For blocking mode (user handler not provided) wait here for READY + // events (indicating that the byte from TXD register was transmitted + // and a new incoming byte was moved to the RXD register) and continue + // transaction until all requested bytes are transferred. + // In non-blocking mode - IRQ service routine will do this stuff. + if (p_cb->handler) + { + nrf_spi_int_enable(p_spi, NRF_SPI_INT_READY_MASK); + } + else + { + do { + while (!nrf_spi_event_check(p_spi, NRF_SPI_EVENT_READY)) {} + nrf_spi_event_clear(p_spi, NRF_SPI_EVENT_READY); + NRFX_LOG_DEBUG("SPI: Event: NRF_SPI_EVENT_READY."); + } while (transfer_byte(p_spi, p_cb)); + if (p_cb->ss_pin != NRFX_SPI_PIN_NOT_USED) + { + nrf_gpio_pin_set(p_cb->ss_pin); + } + } +} + +nrfx_err_t nrfx_spi_xfer(nrfx_spi_t const * const p_instance, + nrfx_spi_xfer_desc_t const * p_xfer_desc, + uint32_t flags) +{ + spi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(p_xfer_desc->p_tx_buffer != NULL || p_xfer_desc->tx_length == 0); + NRFX_ASSERT(p_xfer_desc->p_rx_buffer != NULL || p_xfer_desc->rx_length == 0); + + nrfx_err_t err_code = NRFX_SUCCESS; + + if (p_cb->transfer_in_progress) + { + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + else + { + if (p_cb->handler) + { + p_cb->transfer_in_progress = true; + } + } + + p_cb->evt.xfer_desc = *p_xfer_desc; + p_cb->abort = false; + + if (p_cb->ss_pin != NRFX_SPI_PIN_NOT_USED) + { + nrf_gpio_pin_clear(p_cb->ss_pin); + } + if (flags) + { + p_cb->transfer_in_progress = false; + err_code = NRFX_ERROR_NOT_SUPPORTED; + } + else + { + spi_xfer(p_instance->p_reg, p_cb, p_xfer_desc); + } + NRFX_LOG_INFO("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +void nrfx_spi_abort(nrfx_spi_t const * p_instance) +{ + spi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); + p_cb->abort = true; +} + +static void irq_handler(NRF_SPI_Type * p_spi, spi_control_block_t * p_cb) +{ + NRFX_ASSERT(p_cb->handler); + + nrf_spi_event_clear(p_spi, NRF_SPI_EVENT_READY); + NRFX_LOG_DEBUG("Event: NRF_SPI_EVENT_READY."); + + if (!transfer_byte(p_spi, p_cb)) + { + finish_transfer(p_cb); + } +} + +#if NRFX_CHECK(NRFX_SPI0_ENABLED) +void nrfx_spi_0_irq_handler(void) +{ + irq_handler(NRF_SPI0, &m_cb[NRFX_SPI0_INST_IDX]); +} +#endif + +#if NRFX_CHECK(NRFX_SPI1_ENABLED) +void nrfx_spi_1_irq_handler(void) +{ + irq_handler(NRF_SPI1, &m_cb[NRFX_SPI1_INST_IDX]); +} +#endif + +#if NRFX_CHECK(NRFX_SPI2_ENABLED) +void nrfx_spi_2_irq_handler(void) +{ + irq_handler(NRF_SPI2, &m_cb[NRFX_SPI2_INST_IDX]); +} +#endif + +#endif // NRFX_CHECK(NRFX_SPI_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_spim.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_spim.c new file mode 100644 index 0000000000..6e89e82098 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_spim.c @@ -0,0 +1,690 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_SPIM_ENABLED) + +#if !(NRFX_CHECK(NRFX_SPIM0_ENABLED) || NRFX_CHECK(NRFX_SPIM1_ENABLED) || \ + NRFX_CHECK(NRFX_SPIM2_ENABLED) || NRFX_CHECK(NRFX_SPIM3_ENABLED)) +#error "No enabled SPIM instances. Check ." +#endif + +#if NRFX_CHECK(NRFX_SPIM_EXTENDED_ENABLED) && !NRFX_CHECK(NRFX_SPIM3_ENABLED) +#error "Extended options are available only in SPIM3 on the nRF52840 SoC." +#endif + +#include +#include "prs/nrfx_prs.h" +#include + +#define NRFX_LOG_MODULE SPIM +#include + +#define SPIMX_LENGTH_VALIDATE(peripheral, drv_inst_idx, rx_len, tx_len) \ + (((drv_inst_idx) == NRFX_CONCAT_3(NRFX_, peripheral, _INST_IDX)) && \ + NRFX_EASYDMA_LENGTH_VALIDATE(peripheral, rx_len, tx_len)) + +#if NRFX_CHECK(NRFX_SPIM0_ENABLED) +#define SPIM0_LENGTH_VALIDATE(...) SPIMX_LENGTH_VALIDATE(SPIM0, __VA_ARGS__) +#else +#define SPIM0_LENGTH_VALIDATE(...) 0 +#endif + +#if NRFX_CHECK(NRFX_SPIM1_ENABLED) +#define SPIM1_LENGTH_VALIDATE(...) SPIMX_LENGTH_VALIDATE(SPIM1, __VA_ARGS__) +#else +#define SPIM1_LENGTH_VALIDATE(...) 0 +#endif + +#if NRFX_CHECK(NRFX_SPIM2_ENABLED) +#define SPIM2_LENGTH_VALIDATE(...) SPIMX_LENGTH_VALIDATE(SPIM2, __VA_ARGS__) +#else +#define SPIM2_LENGTH_VALIDATE(...) 0 +#endif + +#if NRFX_CHECK(NRFX_SPIM3_ENABLED) +#define SPIM3_LENGTH_VALIDATE(...) SPIMX_LENGTH_VALIDATE(SPIM3, __VA_ARGS__) +#else +#define SPIM3_LENGTH_VALIDATE(...) 0 +#endif + +#define SPIM_LENGTH_VALIDATE(drv_inst_idx, rx_len, tx_len) \ + (SPIM0_LENGTH_VALIDATE(drv_inst_idx, rx_len, tx_len) || \ + SPIM1_LENGTH_VALIDATE(drv_inst_idx, rx_len, tx_len) || \ + SPIM2_LENGTH_VALIDATE(drv_inst_idx, rx_len, tx_len) || \ + SPIM3_LENGTH_VALIDATE(drv_inst_idx, rx_len, tx_len)) + + +// Control block - driver instance local data. +typedef struct +{ + nrfx_spim_evt_handler_t handler; + void * p_context; + nrfx_spim_evt_t evt; // Keep the struct that is ready for event handler. Less memcpy. + nrfx_drv_state_t state; + volatile bool transfer_in_progress; + +#if NRFX_CHECK(NRFX_SPIM_EXTENDED_ENABLED) + bool use_hw_ss; +#endif + + // [no need for 'volatile' attribute for the following members, as they + // are not concurrently used in IRQ handlers and main line code] + bool ss_active_high; + uint8_t ss_pin; + uint8_t miso_pin; + uint8_t orc; + +#if NRFX_CHECK(NRFX_SPIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED) + size_t tx_length; + size_t rx_length; +#endif +} spim_control_block_t; +static spim_control_block_t m_cb[NRFX_SPIM_ENABLED_COUNT]; + +#if NRFX_CHECK(NRFX_SPIM3_NRF52840_ANOMALY_198_WORKAROUND_ENABLED) + +// Workaround for nRF52840 anomaly 198: SPIM3 transmit data might be corrupted. + +static uint32_t m_anomaly_198_preserved_value; + +static void anomaly_198_enable(uint8_t const * p_buffer, size_t buf_len) +{ + m_anomaly_198_preserved_value = *((volatile uint32_t *)0x40000E00); + + if (buf_len == 0) + { + return; + } + uint32_t buffer_end_addr = ((uint32_t)p_buffer) + buf_len; + uint32_t block_addr = ((uint32_t)p_buffer) & ~0x1FFF; + uint32_t block_flag = (1UL << ((block_addr >> 13) & 0xFFFF)); + uint32_t occupied_blocks = 0; + + if (block_addr >= 0x20010000) + { + occupied_blocks = (1UL << 8); + } + else + { + do { + occupied_blocks |= block_flag; + block_flag <<= 1; + block_addr += 0x2000; + } while ((block_addr < buffer_end_addr) && (block_addr < 0x20012000)); + } + + *((volatile uint32_t *)0x40000E00) = occupied_blocks; +} + +static void anomaly_198_disable(void) +{ + *((volatile uint32_t *)0x40000E00) = m_anomaly_198_preserved_value; +} +#endif // NRFX_CHECK(NRFX_SPIM3_NRF52840_ANOMALY_198_WORKAROUND_ENABLED) + +nrfx_err_t nrfx_spim_init(nrfx_spim_t const * const p_instance, + nrfx_spim_config_t const * p_config, + nrfx_spim_evt_handler_t handler, + void * p_context) +{ + NRFX_ASSERT(p_config); + spim_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + nrfx_err_t err_code; + + if (p_cb->state != NRFX_DRV_STATE_UNINITIALIZED) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + +#if NRFX_CHECK(NRFX_SPIM_EXTENDED_ENABLED) + + // Currently, only SPIM3 in nRF52840 supports the extended features. Other instances must be checked. + if ((p_instance->drv_inst_idx != NRFX_SPIM3_INST_IDX) && + ((p_config->dcx_pin != NRFX_SPIM_PIN_NOT_USED) || + (p_config->frequency == NRF_SPIM_FREQ_16M) || + (p_config->frequency == NRF_SPIM_FREQ_32M) || + (p_config->rx_delay != 0x00) || + (p_config->use_hw_ss))) + { + err_code = NRFX_ERROR_NOT_SUPPORTED; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } +#endif + + NRF_SPIM_Type * p_spim = (NRF_SPIM_Type *)p_instance->p_reg; + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + static nrfx_irq_handler_t const irq_handlers[NRFX_SPIM_ENABLED_COUNT] = { + #if NRFX_CHECK(NRFX_SPIM0_ENABLED) + nrfx_spim_0_irq_handler, + #endif + #if NRFX_CHECK(NRFX_SPIM1_ENABLED) + nrfx_spim_1_irq_handler, + #endif + #if NRFX_CHECK(NRFX_SPIM2_ENABLED) + nrfx_spim_2_irq_handler, + #endif + #if NRFX_CHECK(NRFX_SPIM3_ENABLED) + nrfx_spim_3_irq_handler, + #endif + }; + if (nrfx_prs_acquire(p_instance->p_reg, + irq_handlers[p_instance->drv_inst_idx]) != NRFX_SUCCESS) + { + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } +#endif // NRFX_CHECK(NRFX_PRS_ENABLED) + + p_cb->handler = handler; + p_cb->p_context = p_context; + + uint32_t mosi_pin; + uint32_t miso_pin; + // Configure pins used by the peripheral: + // - SCK - output with initial value corresponding with the SPI mode used: + // 0 - for modes 0 and 1 (CPOL = 0), 1 - for modes 2 and 3 (CPOL = 1); + // according to the reference manual guidelines this pin and its input + // buffer must always be connected for the SPI to work. + if (p_config->mode <= NRF_SPIM_MODE_1) + { + nrf_gpio_pin_clear(p_config->sck_pin); + } + else + { + nrf_gpio_pin_set(p_config->sck_pin); + } + nrf_gpio_cfg(p_config->sck_pin, + NRF_GPIO_PIN_DIR_OUTPUT, + NRF_GPIO_PIN_INPUT_CONNECT, + NRF_GPIO_PIN_NOPULL, + NRF_GPIO_PIN_S0S1, + NRF_GPIO_PIN_NOSENSE); + // - MOSI (optional) - output with initial value 0, + if (p_config->mosi_pin != NRFX_SPIM_PIN_NOT_USED) + { + mosi_pin = p_config->mosi_pin; + nrf_gpio_pin_clear(mosi_pin); + nrf_gpio_cfg_output(mosi_pin); + } + else + { + mosi_pin = NRF_SPIM_PIN_NOT_CONNECTED; + } + // - MISO (optional) - input, + if (p_config->miso_pin != NRFX_SPIM_PIN_NOT_USED) + { + miso_pin = p_config->miso_pin; + nrf_gpio_cfg_input(miso_pin, (nrf_gpio_pin_pull_t)NRFX_SPIM_MISO_PULL_CFG); + } + else + { + miso_pin = NRF_SPIM_PIN_NOT_CONNECTED; + } + m_cb[p_instance->drv_inst_idx].miso_pin = p_config->miso_pin; + // - Slave Select (optional) - output with initial value 1 (inactive). + if (p_config->ss_pin != NRFX_SPIM_PIN_NOT_USED) + { + if (p_config->ss_active_high) + { + nrf_gpio_pin_clear(p_config->ss_pin); + } + else + { + nrf_gpio_pin_set(p_config->ss_pin); + } + nrf_gpio_cfg_output(p_config->ss_pin); +#if NRFX_CHECK(NRFX_SPIM_EXTENDED_ENABLED) + if (p_config->use_hw_ss) + { + m_cb[p_instance->drv_inst_idx].use_hw_ss = p_config->use_hw_ss; + nrf_spim_csn_configure(p_spim, + p_config->ss_pin, + (p_config->ss_active_high == true ? + NRF_SPIM_CSN_POL_HIGH : NRF_SPIM_CSN_POL_LOW), + p_config->ss_duration); + } +#endif + m_cb[p_instance->drv_inst_idx].ss_pin = p_config->ss_pin; + m_cb[p_instance->drv_inst_idx].ss_active_high = p_config->ss_active_high; + } + +#if NRFX_CHECK(NRFX_SPIM_EXTENDED_ENABLED) + // - DCX (optional) - output. + if (p_config->dcx_pin != NRFX_SPIM_PIN_NOT_USED) + { + nrf_gpio_pin_set(p_config->dcx_pin); + nrf_gpio_cfg_output(p_config->dcx_pin); + nrf_spim_dcx_pin_set(p_spim, p_config->dcx_pin); + } + + // Change rx delay + nrf_spim_iftiming_set(p_spim, p_config->rx_delay); +#endif + + + nrf_spim_pins_set(p_spim, p_config->sck_pin, mosi_pin, miso_pin); + nrf_spim_frequency_set(p_spim, p_config->frequency); + nrf_spim_configure(p_spim, p_config->mode, p_config->bit_order); + + nrf_spim_orc_set(p_spim, p_config->orc); + + if (p_cb->handler) + { + nrf_spim_int_enable(p_spim, NRF_SPIM_INT_END_MASK); + } + + nrf_spim_enable(p_spim); + + if (p_cb->handler) + { + NRFX_IRQ_PRIORITY_SET(nrfx_get_irq_number(p_instance->p_reg), + p_config->irq_priority); + NRFX_IRQ_ENABLE(nrfx_get_irq_number(p_instance->p_reg)); + } + + p_cb->transfer_in_progress = false; + p_cb->state = NRFX_DRV_STATE_INITIALIZED; + + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +void nrfx_spim_uninit(nrfx_spim_t const * const p_instance) +{ + spim_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); + + if (p_cb->handler) + { + NRFX_IRQ_DISABLE(nrfx_get_irq_number(p_instance->p_reg)); + } + + NRF_SPIM_Type * p_spim = (NRF_SPIM_Type *)p_instance->p_reg; + if (p_cb->handler) + { + nrf_spim_int_disable(p_spim, NRF_SPIM_ALL_INTS_MASK); + if (p_cb->transfer_in_progress) + { + // Ensure that SPI is not performing any transfer. + nrf_spim_task_trigger(p_spim, NRF_SPIM_TASK_STOP); + while (!nrf_spim_event_check(p_spim, NRF_SPIM_EVENT_STOPPED)) + {} + p_cb->transfer_in_progress = false; + } + } + + if (p_cb->miso_pin != NRFX_SPIM_PIN_NOT_USED) + { + nrf_gpio_cfg_default(p_cb->miso_pin); + } + nrf_spim_disable(p_spim); + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + nrfx_prs_release(p_instance->p_reg); +#endif + + p_cb->state = NRFX_DRV_STATE_UNINITIALIZED; +} + +#if NRFX_CHECK(NRFX_SPIM_EXTENDED_ENABLED) +nrfx_err_t nrfx_spim_xfer_dcx(nrfx_spim_t const * const p_instance, + nrfx_spim_xfer_desc_t const * p_xfer_desc, + uint32_t flags, + uint8_t cmd_length) +{ + NRFX_ASSERT(cmd_length <= NRF_SPIM_DCX_CNT_ALL_CMD); + nrf_spim_dcx_cnt_set((NRF_SPIM_Type *)p_instance->p_reg, cmd_length); + return nrfx_spim_xfer(p_instance, p_xfer_desc, 0); +} +#endif + +static void finish_transfer(spim_control_block_t * p_cb) +{ + // If Slave Select signal is used, this is the time to deactivate it. + if (p_cb->ss_pin != NRFX_SPIM_PIN_NOT_USED) + { +#if NRFX_CHECK(NRFX_SPIM_EXTENDED_ENABLED) + if (!p_cb->use_hw_ss) +#endif + { + if (p_cb->ss_active_high) + { + nrf_gpio_pin_clear(p_cb->ss_pin); + } + else + { + nrf_gpio_pin_set(p_cb->ss_pin); + } + } + } + + // By clearing this flag before calling the handler we allow subsequent + // transfers to be started directly from the handler function. + p_cb->transfer_in_progress = false; + + p_cb->evt.type = NRFX_SPIM_EVENT_DONE; + p_cb->handler(&p_cb->evt, p_cb->p_context); +} + +__STATIC_INLINE void spim_int_enable(NRF_SPIM_Type * p_spim, bool enable) +{ + if (!enable) + { + nrf_spim_int_disable(p_spim, NRF_SPIM_INT_END_MASK); + } + else + { + nrf_spim_int_enable(p_spim, NRF_SPIM_INT_END_MASK); + } +} + +__STATIC_INLINE void spim_list_enable_handle(NRF_SPIM_Type * p_spim, uint32_t flags) +{ + if (NRFX_SPIM_FLAG_TX_POSTINC & flags) + { + nrf_spim_tx_list_enable(p_spim); + } + else + { + nrf_spim_tx_list_disable(p_spim); + } + + if (NRFX_SPIM_FLAG_RX_POSTINC & flags) + { + nrf_spim_rx_list_enable(p_spim); + } + else + { + nrf_spim_rx_list_disable(p_spim); + } +} + +static nrfx_err_t spim_xfer(NRF_SPIM_Type * p_spim, + spim_control_block_t * p_cb, + nrfx_spim_xfer_desc_t const * p_xfer_desc, + uint32_t flags) +{ + nrfx_err_t err_code; + // EasyDMA requires that transfer buffers are placed in Data RAM region; + // signal error if they are not. + if ((p_xfer_desc->p_tx_buffer != NULL && !nrfx_is_in_ram(p_xfer_desc->p_tx_buffer)) || + (p_xfer_desc->p_rx_buffer != NULL && !nrfx_is_in_ram(p_xfer_desc->p_rx_buffer))) + { + p_cb->transfer_in_progress = false; + err_code = NRFX_ERROR_INVALID_ADDR; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + +#if NRFX_CHECK(NRFX_SPIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED) + p_cb->tx_length = 0; + p_cb->rx_length = 0; +#endif + + nrf_spim_tx_buffer_set(p_spim, p_xfer_desc->p_tx_buffer, p_xfer_desc->tx_length); + nrf_spim_rx_buffer_set(p_spim, p_xfer_desc->p_rx_buffer, p_xfer_desc->rx_length); + +#if NRFX_CHECK(NRFX_SPIM3_NRF52840_ANOMALY_198_WORKAROUND_ENABLED) + if (p_spim == NRF_SPIM3) + { + anomaly_198_enable(p_xfer_desc->p_tx_buffer, p_xfer_desc->tx_length); + } +#endif + + nrf_spim_event_clear(p_spim, NRF_SPIM_EVENT_END); + + spim_list_enable_handle(p_spim, flags); + + if (!(flags & NRFX_SPIM_FLAG_HOLD_XFER)) + { + nrf_spim_task_trigger(p_spim, NRF_SPIM_TASK_START); + } +#if NRFX_CHECK(NRFX_SPIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED) + if (flags & NRFX_SPIM_FLAG_HOLD_XFER) + { + nrf_spim_event_clear(p_spim, NRF_SPIM_EVENT_STARTED); + p_cb->tx_length = p_xfer_desc->tx_length; + p_cb->rx_length = p_xfer_desc->rx_length; + nrf_spim_tx_buffer_set(p_spim, p_xfer_desc->p_tx_buffer, 0); + nrf_spim_rx_buffer_set(p_spim, p_xfer_desc->p_rx_buffer, 0); + nrf_spim_int_enable(p_spim, NRF_SPIM_INT_STARTED_MASK); + } +#endif + + if (!p_cb->handler) + { + while (!nrf_spim_event_check(p_spim, NRF_SPIM_EVENT_END)){} + +#if NRFX_CHECK(NRFX_SPIM3_NRF52840_ANOMALY_198_WORKAROUND_ENABLED) + if (p_spim == NRF_SPIM3) + { + anomaly_198_disable(); + } +#endif + if (p_cb->ss_pin != NRFX_SPIM_PIN_NOT_USED) + { +#if NRFX_CHECK(NRFX_SPIM_EXTENDED_ENABLED) + if (!p_cb->use_hw_ss) +#endif + { + if (p_cb->ss_active_high) + { + nrf_gpio_pin_clear(p_cb->ss_pin); + } + else + { + nrf_gpio_pin_set(p_cb->ss_pin); + } + } + } + } + else + { + spim_int_enable(p_spim, !(flags & NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER)); + } + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +nrfx_err_t nrfx_spim_xfer(nrfx_spim_t const * const p_instance, + nrfx_spim_xfer_desc_t const * p_xfer_desc, + uint32_t flags) +{ + spim_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(p_xfer_desc->p_tx_buffer != NULL || p_xfer_desc->tx_length == 0); + NRFX_ASSERT(p_xfer_desc->p_rx_buffer != NULL || p_xfer_desc->rx_length == 0); + NRFX_ASSERT(SPIM_LENGTH_VALIDATE(p_instance->drv_inst_idx, + p_xfer_desc->rx_length, + p_xfer_desc->tx_length)); + + nrfx_err_t err_code = NRFX_SUCCESS; + + if (p_cb->transfer_in_progress) + { + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + else + { + if (p_cb->handler && !(flags & (NRFX_SPIM_FLAG_REPEATED_XFER | + NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER))) + { + p_cb->transfer_in_progress = true; + } + } + + p_cb->evt.xfer_desc = *p_xfer_desc; + + if (p_cb->ss_pin != NRFX_SPIM_PIN_NOT_USED) + { +#if NRFX_CHECK(NRFX_SPIM_EXTENDED_ENABLED) + if (!p_cb->use_hw_ss) +#endif + { + if (p_cb->ss_active_high) + { + nrf_gpio_pin_set(p_cb->ss_pin); + } + else + { + nrf_gpio_pin_clear(p_cb->ss_pin); + } + } + } + + return spim_xfer(p_instance->p_reg, p_cb, p_xfer_desc, flags); +} + +void nrfx_spim_abort(nrfx_spim_t const * p_instance) +{ + spim_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); + + nrf_spim_task_trigger(p_instance->p_reg, NRF_SPIM_TASK_STOP); + while (!nrf_spim_event_check(p_instance->p_reg, NRF_SPIM_EVENT_STOPPED)) + {} + p_cb->transfer_in_progress = false; +} + +uint32_t nrfx_spim_start_task_get(nrfx_spim_t const * p_instance) +{ + NRF_SPIM_Type * p_spim = (NRF_SPIM_Type *)p_instance->p_reg; + return nrf_spim_task_address_get(p_spim, NRF_SPIM_TASK_START); +} + +uint32_t nrfx_spim_end_event_get(nrfx_spim_t const * p_instance) +{ + NRF_SPIM_Type * p_spim = (NRF_SPIM_Type *)p_instance->p_reg; + return nrf_spim_event_address_get(p_spim, NRF_SPIM_EVENT_END); +} + +static void irq_handler(NRF_SPIM_Type * p_spim, spim_control_block_t * p_cb) +{ + +#if NRFX_CHECK(NRFX_SPIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED) + if ((nrf_spim_int_enable_check(p_spim, NRF_SPIM_INT_STARTED_MASK)) && + (nrf_spim_event_check(p_spim, NRF_SPIM_EVENT_STARTED)) ) + { + /* Handle first, zero-length, auxiliary transmission. */ + nrf_spim_event_clear(p_spim, NRF_SPIM_EVENT_STARTED); + nrf_spim_event_clear(p_spim, NRF_SPIM_EVENT_END); + + NRFX_ASSERT(p_spim->TXD.MAXCNT == 0); + p_spim->TXD.MAXCNT = p_cb->tx_length; + + NRFX_ASSERT(p_spim->RXD.MAXCNT == 0); + p_spim->RXD.MAXCNT = p_cb->rx_length; + + /* Disable STARTED interrupt, used only in auxiliary transmission. */ + nrf_spim_int_disable(p_spim, NRF_SPIM_INT_STARTED_MASK); + + /* Start the actual, glitch-free transmission. */ + nrf_spim_task_trigger(p_spim, NRF_SPIM_TASK_START); + return; + } +#endif + + if (nrf_spim_event_check(p_spim, NRF_SPIM_EVENT_END)) + { +#if NRFX_CHECK(NRFX_SPIM3_NRF52840_ANOMALY_198_WORKAROUND_ENABLED) + if (p_spim == NRF_SPIM3) + { + anomaly_198_disable(); + } +#endif + nrf_spim_event_clear(p_spim, NRF_SPIM_EVENT_END); + NRFX_ASSERT(p_cb->handler); + NRFX_LOG_DEBUG("Event: NRF_SPIM_EVENT_END."); + finish_transfer(p_cb); + } +} + +#if NRFX_CHECK(NRFX_SPIM0_ENABLED) +void nrfx_spim_0_irq_handler(void) +{ + irq_handler(NRF_SPIM0, &m_cb[NRFX_SPIM0_INST_IDX]); +} +#endif + +#if 0 +#if NRFX_CHECK(NRFX_SPIM1_ENABLED) +void nrfx_spim_1_irq_handler(void) +{ + irq_handler(NRF_SPIM1, &m_cb[NRFX_SPIM1_INST_IDX]); +} +#endif +#endif + +#if NRFX_CHECK(NRFX_SPIM2_ENABLED) +void nrfx_spim_2_irq_handler(void) +{ + irq_handler(NRF_SPIM2, &m_cb[NRFX_SPIM2_INST_IDX]); +} +#endif + +#if NRFX_CHECK(NRFX_SPIM3_ENABLED) +void nrfx_spim_3_irq_handler(void) +{ + irq_handler(NRF_SPIM3, &m_cb[NRFX_SPIM3_INST_IDX]); +} +#endif + +#endif // NRFX_CHECK(NRFX_SPIM_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/spi_slave/nrf_drv_spis.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_spis.c similarity index 52% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/spi_slave/nrf_drv_spis.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_spis.c index 9470baf482..53075f07c7 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/spi_slave/nrf_drv_spis.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_spis.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2013 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,44 +37,62 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(SPIS) -#include "nrf_drv_spis.h" -#if ENABLED_SPIS_COUNT -#include -#include -#include "nrf.h" -#include "nrf_gpio.h" -#include "app_error.h" -#include "app_util_platform.h" -#include "nrf_drv_common.h" -#include "nrf_assert.h" -#define NRF_LOG_MODULE_NAME spis +#include -#if SPIS_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL SPIS_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR SPIS_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR SPIS_CONFIG_DEBUG_COLOR -#define EVT_TO_STR(event) \ +#if NRFX_CHECK(NRFX_SPIS_ENABLED) + +#if !(NRFX_CHECK(NRFX_SPIS0_ENABLED) || NRFX_CHECK(NRFX_SPIS1_ENABLED) || \ + NRFX_CHECK(NRFX_SPIS2_ENABLED)) +#error "No enabled SPIS instances. Check ." +#endif + +#include +#include "prs/nrfx_prs.h" + +#define NRFX_LOG_MODULE SPIS +#include + +#define EVT_TO_STR(event) \ (event == NRF_SPIS_EVENT_ACQUIRED ? "NRF_SPIS_EVENT_ACQUIRED" : \ - (event == NRF_SPIS_EVENT_END ? "NRF_SPIS_EVENT_END" : \ + (event == NRF_SPIS_EVENT_END ? "NRF_SPIS_EVENT_END" : \ "UNKNOWN ERROR")) -#else //SPIS_CONFIG_LOG_ENABLED -#define EVT_TO_STR(event) "" -#define NRF_LOG_LEVEL 0 -#endif //SPIS_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); +#define SPISX_LENGTH_VALIDATE(peripheral, drv_inst_idx, rx_len, tx_len) \ + (((drv_inst_idx) == NRFX_CONCAT_3(NRFX_, peripheral, _INST_IDX)) && \ + NRFX_EASYDMA_LENGTH_VALIDATE(peripheral, rx_len, tx_len)) -#if NRF_MODULE_ENABLED(SPIS_NRF52_ANOMALY_109_WORKAROUND) -#include "nrf_drv_gpiote.h" +#if NRFX_CHECK(NRFX_SPIS0_ENABLED) +#define SPIS0_LENGTH_VALIDATE(...) SPISX_LENGTH_VALIDATE(SPIS0, __VA_ARGS__) +#else +#define SPIS0_LENGTH_VALIDATE(...) 0 +#endif + +#if NRFX_CHECK(NRFX_SPIS1_ENABLED) +#define SPIS1_LENGTH_VALIDATE(...) SPISX_LENGTH_VALIDATE(SPIS1, __VA_ARGS__) +#else +#define SPIS1_LENGTH_VALIDATE(...) 0 +#endif + +#if NRFX_CHECK(NRFX_SPIS2_ENABLED) +#define SPIS2_LENGTH_VALIDATE(...) SPISX_LENGTH_VALIDATE(SPIS2, __VA_ARGS__) +#else +#define SPIS2_LENGTH_VALIDATE(...) 0 +#endif + +#define SPIS_LENGTH_VALIDATE(drv_inst_idx, rx_len, tx_len) \ + (SPIS0_LENGTH_VALIDATE(drv_inst_idx, rx_len, tx_len) || \ + SPIS1_LENGTH_VALIDATE(drv_inst_idx, rx_len, tx_len) || \ + SPIS2_LENGTH_VALIDATE(drv_inst_idx, rx_len, tx_len)) + + +#if NRFX_CHECK(NRFX_SPIS_NRF52_ANOMALY_109_WORKAROUND_ENABLED) +#include #define USE_DMA_ISSUE_WORKAROUND // This handler is called by the GPIOTE driver when a falling edge is detected // on the CSN line. There is no need to do anything here. The handling of the // interrupt itself provides a protection for DMA transfers. -static void csn_event_handler(nrf_drv_gpiote_pin_t pin, +static void csn_event_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) { } @@ -88,117 +106,87 @@ typedef enum SPIS_BUFFER_RESOURCE_REQUESTED, /**< State where the configuration of the memory buffers, which are to be used in SPI transaction, has started. */ SPIS_BUFFER_RESOURCE_CONFIGURED, /**< State where the configuration of the memory buffers, which are to be used in SPI transaction, has completed. */ SPIS_XFER_COMPLETED /**< State where SPI transaction has been completed. */ -} nrf_drv_spis_state_t; - - -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - #define IRQ_HANDLER_NAME(n) irq_handler_for_instance_##n - #define IRQ_HANDLER(n) static void IRQ_HANDLER_NAME(n)(void) - - #if NRF_MODULE_ENABLED(SPIS0) - IRQ_HANDLER(0); - #endif - #if NRF_MODULE_ENABLED(SPIS1) - IRQ_HANDLER(1); - #endif - #if NRF_MODULE_ENABLED(SPIS2) - IRQ_HANDLER(2); - #endif - static nrf_drv_irq_handler_t const m_irq_handlers[ENABLED_SPIS_COUNT] = { - #if NRF_MODULE_ENABLED(SPIS0) - IRQ_HANDLER_NAME(0), - #endif - #if NRF_MODULE_ENABLED(SPIS1) - IRQ_HANDLER_NAME(1), - #endif - #if NRF_MODULE_ENABLED(SPIS2) - IRQ_HANDLER_NAME(2), - #endif - }; -#else - #define IRQ_HANDLER(n) void SPIS##n##_IRQ_HANDLER(void) -#endif // PERIPHERAL_RESOURCE_SHARING_ENABLED - -#define SPIS_IRQHANDLER_TEMPLATE(NUM) \ - IRQ_HANDLER(NUM) \ - { \ - spis_irq_handler(NRF_SPIS##NUM, &m_cb[SPIS##NUM##_INSTANCE_INDEX]); \ - } - +} nrfx_spis_state_t; /**@brief SPIS control block - driver instance local data. */ typedef struct { - volatile uint32_t tx_buffer_size; //!< SPI slave TX buffer size in bytes. - volatile uint32_t rx_buffer_size; //!< SPI slave RX buffer size in bytes. - nrf_drv_spis_event_handler_t handler; //!< SPI event handler. - volatile const uint8_t * tx_buffer; //!< SPI slave TX buffer. - volatile uint8_t * rx_buffer; //!< SPI slave RX buffer. - nrf_drv_state_t state; //!< driver initialization state. - volatile nrf_drv_spis_state_t spi_state; //!< SPI slave state. + volatile uint32_t tx_buffer_size; //!< SPI slave TX buffer size in bytes. + volatile uint32_t rx_buffer_size; //!< SPI slave RX buffer size in bytes. + nrfx_spis_event_handler_t handler; //!< SPI event handler. + volatile const uint8_t * tx_buffer; //!< SPI slave TX buffer. + volatile uint8_t * rx_buffer; //!< SPI slave RX buffer. + nrfx_drv_state_t state; //!< driver initialization state. + volatile nrfx_spis_state_t spi_state; //!< SPI slave state. + void * p_context; //!< Context set on initialization. } spis_cb_t; -static spis_cb_t m_cb[ENABLED_SPIS_COUNT]; +static spis_cb_t m_cb[NRFX_SPIS_ENABLED_COUNT]; -ret_code_t nrf_drv_spis_init(nrf_drv_spis_t const * const p_instance, - nrf_drv_spis_config_t const * p_config, - nrf_drv_spis_event_handler_t event_handler) +nrfx_err_t nrfx_spis_init(nrfx_spis_t const * const p_instance, + nrfx_spis_config_t const * p_config, + nrfx_spis_event_handler_t event_handler, + void * p_context) { - ASSERT(p_config); - spis_cb_t * p_cb = &m_cb[p_instance->instance_id]; - ret_code_t err_code; + NRFX_ASSERT(p_config); + NRFX_ASSERT(event_handler); + spis_cb_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + nrfx_err_t err_code; NRF_SPIS_Type * p_spis = p_instance->p_reg; - if (p_cb->state != NRF_DRV_STATE_UNINITIALIZED) + if (p_cb->state != NRFX_DRV_STATE_UNINITIALIZED) { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } - if ((uint32_t)p_config->mode > (uint32_t)NRF_DRV_SPIS_MODE_3) + if ((uint32_t)p_config->mode > (uint32_t)NRF_SPIS_MODE_3) { - err_code = NRF_ERROR_INVALID_PARAM; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_INVALID_PARAM; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } - if (!event_handler) +#if NRFX_CHECK(NRFX_PRS_ENABLED) + static nrfx_irq_handler_t const irq_handlers[NRFX_SPIS_ENABLED_COUNT] = { + #if NRFX_CHECK(NRFX_SPIS0_ENABLED) + nrfx_spis_0_irq_handler, + #endif + #if NRFX_CHECK(NRFX_SPIS1_ENABLED) + nrfx_spis_1_irq_handler, + #endif + #if NRFX_CHECK(NRFX_SPIS2_ENABLED) + nrfx_spis_2_irq_handler, + #endif + }; + if (nrfx_prs_acquire(p_spis, + irq_handlers[p_instance->drv_inst_idx]) != NRFX_SUCCESS) { - err_code = NRF_ERROR_NULL; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - if (nrf_drv_common_per_res_acquire(p_spis, - m_irq_handlers[p_instance->instance_id]) != NRF_SUCCESS) - { - err_code = NRF_ERROR_BUSY; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; - } -#endif +#endif // NRFX_CHECK(NRFX_PRS_ENABLED) // Configure the SPI pins for input. uint32_t mosi_pin; uint32_t miso_pin; - if (p_config->miso_pin != NRF_DRV_SPIS_PIN_NOT_USED) + if (p_config->miso_pin != NRFX_SPIS_PIN_NOT_USED) { nrf_gpio_cfg(p_config->miso_pin, - NRF_GPIO_PIN_DIR_INPUT, - NRF_GPIO_PIN_INPUT_CONNECT, - NRF_GPIO_PIN_NOPULL, - p_config->miso_drive, - NRF_GPIO_PIN_NOSENSE); + NRF_GPIO_PIN_DIR_INPUT, + NRF_GPIO_PIN_INPUT_CONNECT, + NRF_GPIO_PIN_NOPULL, + p_config->miso_drive, + NRF_GPIO_PIN_NOSENSE); miso_pin = p_config->miso_pin; } else @@ -206,7 +194,7 @@ ret_code_t nrf_drv_spis_init(nrf_drv_spis_t const * const p_instance, miso_pin = NRF_SPIS_PIN_NOT_CONNECTED; } - if (p_config->mosi_pin != NRF_DRV_SPIS_PIN_NOT_USED) + if (p_config->mosi_pin != NRFX_SPIS_PIN_NOT_USED) { nrf_gpio_cfg(p_config->mosi_pin, NRF_GPIO_PIN_DIR_INPUT, @@ -241,8 +229,7 @@ ret_code_t nrf_drv_spis_init(nrf_drv_spis_t const * const p_instance, nrf_spis_tx_buffer_set(p_spis, NULL, 0); // Configure SPI mode. - nrf_spis_configure(p_spis, (nrf_spis_mode_t) p_config->mode, - (nrf_spis_bit_order_t) p_config->bit_order); + nrf_spis_configure(p_spis, p_config->mode, p_config->bit_order); // Configure DEF and ORC characters. nrf_spis_def_set(p_spis, p_config->def); @@ -255,8 +242,9 @@ ret_code_t nrf_drv_spis_init(nrf_drv_spis_t const * const p_instance, // Enable END_ACQUIRE shortcut. nrf_spis_shorts_enable(p_spis, NRF_SPIS_SHORT_END_ACQUIRE); - m_cb[p_instance->instance_id].spi_state = SPIS_STATE_INIT; - m_cb[p_instance->instance_id].handler = event_handler; + p_cb->spi_state = SPIS_STATE_INIT; + p_cb->handler = event_handler; + p_cb->p_context = p_context; #if defined(USE_DMA_ISSUE_WORKAROUND) // Configure a GPIOTE channel to generate interrupts on each falling edge @@ -266,66 +254,66 @@ ret_code_t nrf_drv_spis_init(nrf_drv_spis_t const * const p_instance, // [the GPIOTE driver may be already initialized at this point (by this // driver when another SPIS instance is used, or by an application code), // so just ignore the returned value] - (void)nrf_drv_gpiote_init(); - static nrf_drv_gpiote_in_config_t const csn_gpiote_config = - GPIOTE_CONFIG_IN_SENSE_HITOLO(true); - ret_code_t gpiote_err_code = nrf_drv_gpiote_in_init(p_config->csn_pin, + (void)nrfx_gpiote_init(); + static nrfx_gpiote_in_config_t const csn_gpiote_config = + NRFX_GPIOTE_CONFIG_IN_SENSE_HITOLO(true); + nrfx_err_t gpiote_err_code = nrfx_gpiote_in_init(p_config->csn_pin, &csn_gpiote_config, csn_event_handler); - if (gpiote_err_code != NRF_SUCCESS) + if (gpiote_err_code != NRFX_SUCCESS) { - err_code = NRF_ERROR_INTERNAL; - NRF_LOG_INFO("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_INTERNAL; + NRFX_LOG_INFO("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } - nrf_drv_gpiote_in_event_enable(p_config->csn_pin, true); + nrfx_gpiote_in_event_enable(p_config->csn_pin, true); #endif // Enable IRQ. - nrf_spis_int_enable(p_spis, NRF_SPIS_INT_ACQUIRED_MASK | NRF_SPIS_INT_END_MASK); - nrf_drv_common_irq_enable(p_instance->irq, p_config->irq_priority); + nrf_spis_int_enable(p_spis, NRF_SPIS_INT_ACQUIRED_MASK | + NRF_SPIS_INT_END_MASK); + NRFX_IRQ_PRIORITY_SET(nrfx_get_irq_number(p_instance->p_reg), + p_config->irq_priority); + NRFX_IRQ_ENABLE(nrfx_get_irq_number(p_instance->p_reg)); - p_cb->state = NRF_DRV_STATE_INITIALIZED; + p_cb->state = NRFX_DRV_STATE_INITIALIZED; // Enable SPI slave device. nrf_spis_enable(p_spis); - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); - return err_code; + NRFX_LOG_INFO("Initialized."); + return NRFX_SUCCESS; } -void nrf_drv_spis_uninit(nrf_drv_spis_t const * const p_instance) +void nrfx_spis_uninit(nrfx_spis_t const * const p_instance) { - spis_cb_t * p_cb = &m_cb[p_instance->instance_id]; - ASSERT(p_cb->state != NRF_DRV_STATE_UNINITIALIZED); + spis_cb_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); NRF_SPIS_Type * p_spis = p_instance->p_reg; #define DISABLE_ALL 0xFFFFFFFF nrf_spis_disable(p_spis); - nrf_drv_common_irq_disable(p_instance->irq); + NRFX_IRQ_DISABLE(nrfx_get_irq_number(p_instance->p_reg)); nrf_spis_int_disable(p_spis, DISABLE_ALL); #undef DISABLE_ALL -#if NRF_MODULE_ENABLED(PERIPHERAL_RESOURCE_SHARING) - nrf_drv_common_per_res_release(p_spis); +#if NRFX_CHECK(NRFX_PRS_ENABLED) + nrfx_prs_release(p_spis); #endif - p_cb->state = NRF_DRV_STATE_UNINITIALIZED; - NRF_LOG_INFO("Initialized."); + p_cb->state = NRFX_DRV_STATE_UNINITIALIZED; + NRFX_LOG_INFO("Uninitialized."); } /**@brief Function for executing the state entry action. */ static void spis_state_entry_action_execute(NRF_SPIS_Type * p_spis, - spis_cb_t * p_cb) + spis_cb_t * p_cb) { - nrf_drv_spis_event_t event; + nrfx_spis_evt_t event; switch (p_cb->spi_state) { @@ -334,24 +322,24 @@ static void spis_state_entry_action_execute(NRF_SPIS_Type * p_spis, break; case SPIS_BUFFER_RESOURCE_CONFIGURED: - event.evt_type = NRF_DRV_SPIS_BUFFERS_SET_DONE; + event.evt_type = NRFX_SPIS_BUFFERS_SET_DONE; event.rx_amount = 0; event.tx_amount = 0; - APP_ERROR_CHECK_BOOL(p_cb->handler != NULL); - p_cb->handler(event); + NRFX_ASSERT(p_cb->handler != NULL); + p_cb->handler(&event, p_cb->p_context); break; case SPIS_XFER_COMPLETED: - event.evt_type = NRF_DRV_SPIS_XFER_DONE; + event.evt_type = NRFX_SPIS_XFER_DONE; event.rx_amount = nrf_spis_rx_amount_get(p_spis); event.tx_amount = nrf_spis_tx_amount_get(p_spis); - NRF_LOG_INFO("Transfer rx_len:%d.", event.rx_amount); - NRF_LOG_DEBUG("Rx data:"); - NRF_LOG_HEXDUMP_DEBUG((uint8_t *)p_cb->rx_buffer, - event.rx_amount * sizeof(p_cb->rx_buffer[0])); - APP_ERROR_CHECK_BOOL(p_cb->handler != NULL); - p_cb->handler(event); + NRFX_LOG_INFO("Transfer rx_len:%d.", event.rx_amount); + NRFX_LOG_DEBUG("Rx data:"); + NRFX_LOG_HEXDUMP_DEBUG((uint8_t const *)p_cb->rx_buffer, + event.rx_amount * sizeof(p_cb->rx_buffer[0])); + NRFX_ASSERT(p_cb->handler != NULL); + p_cb->handler(&event, p_cb->p_context); break; default: @@ -366,35 +354,42 @@ static void spis_state_entry_action_execute(NRF_SPIS_Type * p_spis, * @param[in] p_cb SPIS instance control block. * @param[in] new_state State where the state machine transits to. */ -static void spis_state_change(NRF_SPIS_Type * p_spis, - spis_cb_t * p_cb, - nrf_drv_spis_state_t new_state) +static void spis_state_change(NRF_SPIS_Type * p_spis, + spis_cb_t * p_cb, + nrfx_spis_state_t new_state) { p_cb->spi_state = new_state; spis_state_entry_action_execute(p_spis, p_cb); } - -ret_code_t nrf_drv_spis_buffers_set(nrf_drv_spis_t const * const p_instance, - const uint8_t * p_tx_buffer, - uint8_t tx_buffer_length, - uint8_t * p_rx_buffer, - uint8_t rx_buffer_length) +nrfx_err_t nrfx_spis_buffers_set(nrfx_spis_t const * const p_instance, + uint8_t const * p_tx_buffer, + size_t tx_buffer_length, + uint8_t * p_rx_buffer, + size_t rx_buffer_length) { - spis_cb_t * p_cb = &m_cb[p_instance->instance_id]; - uint32_t err_code; + NRFX_ASSERT(p_tx_buffer != NULL || tx_buffer_length == 0); + NRFX_ASSERT(p_rx_buffer != NULL || rx_buffer_length == 0); - VERIFY_PARAM_NOT_NULL(p_rx_buffer); - VERIFY_PARAM_NOT_NULL(p_tx_buffer); + spis_cb_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + nrfx_err_t err_code; + + if (!SPIS_LENGTH_VALIDATE(p_instance->drv_inst_idx, + rx_buffer_length, + tx_buffer_length)) + { + return NRFX_ERROR_INVALID_LENGTH; + } // EasyDMA requires that transfer buffers are placed in Data RAM region; // signal error if they are not. - if (!nrf_drv_is_in_RAM(p_tx_buffer) || !nrf_drv_is_in_RAM(p_rx_buffer)) + if ((p_tx_buffer != NULL && !nrfx_is_in_ram(p_tx_buffer)) || + (p_rx_buffer != NULL && !nrfx_is_in_ram(p_rx_buffer))) { - err_code = NRF_ERROR_INVALID_ADDR; - NRF_LOG_WARNING("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_INVALID_ADDR; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } @@ -407,24 +402,22 @@ ret_code_t nrf_drv_spis_buffers_set(nrf_drv_spis_t const * const p_instance, p_cb->rx_buffer = p_rx_buffer; p_cb->tx_buffer_size = tx_buffer_length; p_cb->rx_buffer_size = rx_buffer_length; - err_code = NRF_SUCCESS; + err_code = NRFX_SUCCESS; spis_state_change(p_instance->p_reg, p_cb, SPIS_BUFFER_RESOURCE_REQUESTED); break; case SPIS_BUFFER_RESOURCE_REQUESTED: - err_code = NRF_ERROR_INVALID_STATE; + err_code = NRFX_ERROR_INVALID_STATE; break; default: // @note: execution of this code path would imply internal error in the design. - err_code = NRF_ERROR_INTERNAL; + err_code = NRFX_ERROR_INTERNAL; break; } - NRF_LOG_INFO("Function: %s, error code: %s.", - (uint32_t)__func__, - (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } @@ -439,7 +432,7 @@ static void spis_irq_handler(NRF_SPIS_Type * p_spis, spis_cb_t * p_cb) if (nrf_spis_event_check(p_spis, NRF_SPIS_EVENT_ACQUIRED)) { nrf_spis_event_clear(p_spis, NRF_SPIS_EVENT_ACQUIRED); - NRF_LOG_DEBUG("SPIS: Event: %s.", (uint32_t)EVT_TO_STR(NRF_SPIS_EVENT_ACQUIRED)); + NRFX_LOG_DEBUG("SPIS: Event: %s.", EVT_TO_STR(NRF_SPIS_EVENT_ACQUIRED)); switch (p_cb->spi_state) { @@ -462,7 +455,7 @@ static void spis_irq_handler(NRF_SPIS_Type * p_spis, spis_cb_t * p_cb) if (nrf_spis_event_check(p_spis, NRF_SPIS_EVENT_END)) { nrf_spis_event_clear(p_spis, NRF_SPIS_EVENT_END); - NRF_LOG_DEBUG("SPIS: Event: %s.", (uint32_t)EVT_TO_STR(NRF_SPIS_EVENT_END)); + NRFX_LOG_DEBUG("SPIS: Event: %s.", EVT_TO_STR(NRF_SPIS_EVENT_END)); switch (p_cb->spi_state) { @@ -477,17 +470,25 @@ static void spis_irq_handler(NRF_SPIS_Type * p_spis, spis_cb_t * p_cb) } } -#if NRF_MODULE_ENABLED(SPIS0) - SPIS_IRQHANDLER_TEMPLATE(0) +#if NRFX_CHECK(NRFX_SPIS0_ENABLED) +void nrfx_spis_0_irq_handler(void) +{ + spis_irq_handler(NRF_SPIS0, &m_cb[NRFX_SPIS0_INST_IDX]); +} #endif -#if NRF_MODULE_ENABLED(SPIS1) - SPIS_IRQHANDLER_TEMPLATE(1) +#if NRFX_CHECK(NRFX_SPIS1_ENABLED) +void nrfx_spis_1_irq_handler(void) +{ + spis_irq_handler(NRF_SPIS1, &m_cb[NRFX_SPIS1_INST_IDX]); +} #endif -#if NRF_MODULE_ENABLED(SPIS2) - SPIS_IRQHANDLER_TEMPLATE(2) +#if NRFX_CHECK(NRFX_SPIS2_ENABLED) +void nrfx_spis_2_irq_handler(void) +{ + spis_irq_handler(NRF_SPIS2, &m_cb[NRFX_SPIS2_INST_IDX]); +} #endif -#endif // SPI_COUNT > 0 -#endif // NRF_MODULE_ENABLED(SPIS) +#endif // NRFX_CHECK(NRFX_SPIS_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_swi.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_swi.c new file mode 100644 index 0000000000..4a6dcc4d4c --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_swi.c @@ -0,0 +1,412 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_SWI_ENABLED) + +#include + +#define NRFX_LOG_MODULE SWI +#include + + +// NRFX_SWI_RESERVED_MASK - SWIs reserved for use by external modules. +#if NRFX_CHECK(NRFX_PWM_NRF52_ANOMALY_109_WORKAROUND_ENABLED) +#define NRFX_SWI_RESERVED_MASK ((NRFX_SWI_USED) | \ + (1u << NRFX_PWM_NRF52_ANOMALY_109_EGU_INSTANCE)) +#else +#define NRFX_SWI_RESERVED_MASK (NRFX_SWI_USED) +#endif + +// NRFX_SWI_DISABLED_MASK - SWIs excluded from use in . +#if NRFX_CHECK(NRFX_SWI0_DISABLED) +#define NRFX_SWI0_DISABLED_MASK (1u << 0) +#else +#define NRFX_SWI0_DISABLED_MASK 0u +#endif +#if NRFX_CHECK(NRFX_SWI1_DISABLED) +#define NRFX_SWI1_DISABLED_MASK (1u << 1) +#else +#define NRFX_SWI1_DISABLED_MASK 0u +#endif +#if NRFX_CHECK(NRFX_SWI2_DISABLED) +#define NRFX_SWI2_DISABLED_MASK (1u << 2) +#else +#define NRFX_SWI2_DISABLED_MASK 0u +#endif +#if NRFX_CHECK(NRFX_SWI3_DISABLED) +#define NRFX_SWI3_DISABLED_MASK (1u << 3) +#else +#define NRFX_SWI3_DISABLED_MASK 0u +#endif +#if NRFX_CHECK(NRFX_SWI4_DISABLED) +#define NRFX_SWI4_DISABLED_MASK (1u << 4) +#else +#define NRFX_SWI4_DISABLED_MASK 0u +#endif +#if NRFX_CHECK(NRFX_SWI5_DISABLED) +#define NRFX_SWI5_DISABLED_MASK (1u << 5) +#else +#define NRFX_SWI5_DISABLED_MASK 0u +#endif +#define NRFX_SWI_DISABLED_MASK (NRFX_SWI0_DISABLED_MASK | \ + NRFX_SWI1_DISABLED_MASK | \ + NRFX_SWI2_DISABLED_MASK | \ + NRFX_SWI3_DISABLED_MASK | \ + NRFX_SWI4_DISABLED_MASK | \ + NRFX_SWI5_DISABLED_MASK) + +#if (NRFX_SWI_RESERVED_MASK & NRFX_SWI_DISABLED_MASK) +#error "A reserved SWI configured to be disabled. Check and NRFX_SWI_USED." +#endif + +// NRFX_SWI_AVAILABLE_MASK - SWIs available for this module, i.e. present +// in the hardware and neither reserved by external modules nor disabled +// in . +#define NRFX_SWI_PRESENT_MASK ((1u << (SWI_COUNT)) - 1u) +#define NRFX_SWI_AVAILABLE_MASK (NRFX_SWI_PRESENT_MASK & \ + ~(NRFX_SWI_RESERVED_MASK | \ + NRFX_SWI_DISABLED_MASK)) + +#if (NRFX_SWI_AVAILABLE_MASK == 0) +#error "No available SWI instances. Check and NRFX_SWI_USED." +#endif + +#define NRFX_SWI_IS_AVAILABLE(idx) ((NRFX_SWI_AVAILABLE_MASK >> (idx)) & 1u) + +#define NRFX_SWI_FIRST (NRFX_SWI_IS_AVAILABLE(0) ? 0u : \ + (NRFX_SWI_IS_AVAILABLE(1) ? 1u : \ + (NRFX_SWI_IS_AVAILABLE(2) ? 2u : \ + (NRFX_SWI_IS_AVAILABLE(3) ? 3u : \ + (NRFX_SWI_IS_AVAILABLE(4) ? 4u : \ + 5u))))) +#define NRFX_SWI_LAST (NRFX_SWI_IS_AVAILABLE(5) ? 5u : \ + (NRFX_SWI_IS_AVAILABLE(4) ? 4u : \ + (NRFX_SWI_IS_AVAILABLE(3) ? 3u : \ + (NRFX_SWI_IS_AVAILABLE(2) ? 2u : \ + (NRFX_SWI_IS_AVAILABLE(1) ? 1u : \ + 0u))))) + +// NRFX_SWI_EGU_COUNT - number of EGU instances to be used by this module +// (note - if EGU is not present, EGU_COUNT is not defined). +#if NRFX_CHECK(NRFX_EGU_ENABLED) +#define NRFX_SWI_EGU_COUNT EGU_COUNT +#else +#define NRFX_SWI_EGU_COUNT 0 +#endif + +// These flags are needed only for SWIs that have no corresponding EGU unit +// (in EGU such flags are available in hardware). +#if (NRFX_SWI_EGU_COUNT < SWI_COUNT) +static nrfx_swi_flags_t m_swi_flags[SWI_COUNT - NRFX_SWI_EGU_COUNT]; +#endif +static nrfx_swi_handler_t m_swi_handlers[SWI_COUNT]; +static uint8_t m_swi_allocated_mask; + + +static void swi_mark_allocated(nrfx_swi_t swi) +{ + m_swi_allocated_mask |= (1u << swi); +} + +static void swi_mark_unallocated(nrfx_swi_t swi) +{ + m_swi_allocated_mask &= ~(1u << swi); +} + +static bool swi_is_allocated(nrfx_swi_t swi) +{ + return (m_swi_allocated_mask & (1u << swi)); +} + +static bool swi_is_available(nrfx_swi_t swi) +{ + return NRFX_SWI_IS_AVAILABLE(swi); +} + +static IRQn_Type swi_irq_number_get(nrfx_swi_t swi) +{ + return (IRQn_Type)((uint32_t)SWI0_IRQn + (uint32_t)swi); +} + +static void swi_handler_setup(nrfx_swi_t swi, + nrfx_swi_handler_t event_handler, + uint32_t irq_priority) +{ + m_swi_handlers[swi] = event_handler; + +#if NRFX_SWI_EGU_COUNT + if (swi < NRFX_SWI_EGU_COUNT) + { + NRF_EGU_Type * p_egu = nrfx_swi_egu_instance_get(swi); + NRFX_ASSERT(p_egu != NULL); + nrf_egu_int_enable(p_egu, NRF_EGU_INT_ALL); + + if (event_handler == NULL) + { + return; + } + } +#endif + + NRFX_ASSERT(event_handler != NULL); + + NRFX_IRQ_PRIORITY_SET(swi_irq_number_get(swi), irq_priority); + NRFX_IRQ_ENABLE(swi_irq_number_get(swi)); +} + +nrfx_err_t nrfx_swi_alloc(nrfx_swi_t * p_swi, + nrfx_swi_handler_t event_handler, + uint32_t irq_priority) +{ + NRFX_ASSERT(p_swi != NULL); + + nrfx_err_t err_code; + + for (nrfx_swi_t swi = NRFX_SWI_FIRST; swi <= NRFX_SWI_LAST; ++swi) + { + if (swi_is_available(swi)) + { + bool allocated = false; + NRFX_CRITICAL_SECTION_ENTER(); + if (!swi_is_allocated(swi)) + { + swi_mark_allocated(swi); + allocated = true; + } + NRFX_CRITICAL_SECTION_EXIT(); + + if (allocated) + { + swi_handler_setup(swi, event_handler, irq_priority); + + *p_swi = swi; + NRFX_LOG_INFO("SWI channel allocated: %d.", (*p_swi)); + return NRFX_SUCCESS; + } + } + } + + err_code = NRFX_ERROR_NO_MEM; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +bool nrfx_swi_is_allocated(nrfx_swi_t swi) +{ + return swi_is_allocated(swi); +} + +void nrfx_swi_free(nrfx_swi_t * p_swi) +{ + NRFX_ASSERT(p_swi != NULL); + nrfx_swi_t swi = *p_swi; + + NRFX_ASSERT(swi_is_allocated(swi)); + NRFX_IRQ_DISABLE(swi_irq_number_get(swi)); + m_swi_handlers[swi] = NULL; + + swi_mark_unallocated(swi); + *p_swi = NRFX_SWI_UNALLOCATED; +} + +void nrfx_swi_all_free(void) +{ + for (nrfx_swi_t swi = NRFX_SWI_FIRST; swi <= NRFX_SWI_LAST; ++swi) + { + if (swi_is_allocated(swi)) + { + NRFX_IRQ_DISABLE(swi_irq_number_get(swi)); + m_swi_handlers[swi] = NULL; +#if NRFX_SWI_EGU_COUNT + if (swi < NRFX_SWI_EGU_COUNT) + { + nrf_egu_int_disable(nrfx_swi_egu_instance_get(swi), + NRF_EGU_INT_ALL); + } +#endif + } + } + + m_swi_allocated_mask = 0; +} + +void nrfx_swi_trigger(nrfx_swi_t swi, uint8_t flag_number) +{ + NRFX_ASSERT(swi_is_allocated(swi)); + +#if NRFX_SWI_EGU_COUNT + + NRF_EGU_Type * p_egu = nrfx_swi_egu_instance_get(swi); +#if (NRFX_SWI_EGU_COUNT < SWI_COUNT) + if (p_egu == NULL) + { + m_swi_flags[swi - NRFX_SWI_EGU_COUNT] |= (1 << flag_number); + NRFX_IRQ_PENDING_SET(swi_irq_number_get(swi)); + } + else +#endif // (NRFX_SWI_EGU_COUNT < SWI_COUNT) + { + nrf_egu_task_trigger(p_egu, + nrf_egu_task_trigger_get(p_egu, flag_number)); + } + +#else // -> #if !NRFX_SWI_EGU_COUNT + + m_swi_flags[swi - NRFX_SWI_EGU_COUNT] |= (1 << flag_number); + NRFX_IRQ_PENDING_SET(swi_irq_number_get(swi)); + +#endif +} + +#if NRFX_SWI_EGU_COUNT +static void egu_irq_handler(nrfx_swi_t swi, uint8_t egu_channel_count) +{ +#if (NRFX_SWI_FIRST > 0) + NRFX_ASSERT(swi >= NRFX_SWI_FIRST); +#endif + NRFX_ASSERT(swi <= NRFX_SWI_LAST); + nrfx_swi_handler_t handler = m_swi_handlers[swi]; + NRFX_ASSERT(handler != NULL); + + NRF_EGU_Type * p_egu = nrfx_swi_egu_instance_get(swi); + NRFX_ASSERT(p_egu != NULL); + + nrfx_swi_flags_t flags = 0; + for (uint8_t i = 0; i < egu_channel_count; ++i) + { + nrf_egu_event_t egu_event = nrf_egu_event_triggered_get(p_egu, i); + if (nrf_egu_event_check(p_egu, egu_event)) + { + flags |= (1u << i); + nrf_egu_event_clear(p_egu, egu_event); + } + } + + handler(swi, flags); +} +#endif // NRFX_SWI_EGU_COUNT + +#if (NRFX_SWI_EGU_COUNT < SWI_COUNT) +static void swi_irq_handler(nrfx_swi_t swi) +{ +#if (NRFX_SWI_FIRST > 0) + NRFX_ASSERT(swi >= NRFX_SWI_FIRST); +#endif + NRFX_ASSERT(swi <= NRFX_SWI_LAST); + nrfx_swi_handler_t handler = m_swi_handlers[swi]; + NRFX_ASSERT(handler != NULL); + + nrfx_swi_flags_t flags = m_swi_flags[swi - NRFX_SWI_EGU_COUNT]; + m_swi_flags[swi - NRFX_SWI_EGU_COUNT] &= ~flags; + + handler(swi, flags); +} +#endif // (NRFX_SWI_EGU_COUNT < SWI_COUNT) + + +#if NRFX_SWI_IS_AVAILABLE(0) +void nrfx_swi_0_irq_handler(void) +{ +#if (NRFX_SWI_EGU_COUNT > 0) + egu_irq_handler(0, EGU0_CH_NUM); +#else + swi_irq_handler(0); +#endif +} +#endif // NRFX_SWI_IS_AVAILABLE(0) + +#if NRFX_SWI_IS_AVAILABLE(1) +void nrfx_swi_1_irq_handler(void) +{ +#if (NRFX_SWI_EGU_COUNT > 1) + egu_irq_handler(1, EGU1_CH_NUM); +#else + swi_irq_handler(1); +#endif +} +#endif // NRFX_SWI_IS_AVAILABLE(1) + +#if NRFX_SWI_IS_AVAILABLE(2) +void nrfx_swi_2_irq_handler(void) +{ +#if (NRFX_SWI_EGU_COUNT > 2) + egu_irq_handler(2, EGU2_CH_NUM); +#else + swi_irq_handler(2); +#endif +} +#endif // NRFX_SWI_IS_AVAILABLE(2) + +#if NRFX_SWI_IS_AVAILABLE(3) +void nrfx_swi_3_irq_handler(void) +{ +#if (NRFX_SWI_EGU_COUNT > 3) + egu_irq_handler(3, EGU3_CH_NUM); +#else + swi_irq_handler(3); +#endif +} +#endif // NRFX_SWI_IS_AVAILABLE(3) + +#if NRFX_SWI_IS_AVAILABLE(4) +void nrfx_swi_4_irq_handler(void) +{ +#if (NRFX_SWI_EGU_COUNT > 4) + egu_irq_handler(4, EGU4_CH_NUM); +#else + swi_irq_handler(4); +#endif +} +#endif // NRFX_SWI_IS_AVAILABLE(4) + +#if NRFX_SWI_IS_AVAILABLE(5) +void nrfx_swi_5_irq_handler(void) +{ +#if (NRFX_SWI_EGU_COUNT > 5) + egu_irq_handler(5, EGU5_CH_NUM); +#else + swi_irq_handler(5); +#endif +} +#endif // NRFX_SWI_IS_AVAILABLE(5) + +#endif // NRFX_CHECK(NRFX_SWI_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/systick/nrf_drv_systick.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_systick.c similarity index 68% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/systick/nrf_drv_systick.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_systick.c index 041c41f1dc..ef38b0f8b9 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/systick/nrf_drv_systick.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_systick.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,12 +37,10 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(SYSTICK) -#include "nrf_drv_systick.h" -#include "nrf_systick.h" -#include "nrf.h" -#include "nrf_assert.h" +#include + +#if NRFX_CHECK(NRFX_SYSTICK_ENABLED) +#include /** * @brief Maximum number of ticks to delay @@ -52,17 +50,17 @@ * It is dictated by the fact that it would be impossible to detect delay * properly when the timer value warps around the starting point. */ -#define NRF_DRV_SYSTICK_TICKS_MAX (NRF_SYSTICK_VAL_MASK / 2UL) +#define NRFX_SYSTICK_TICKS_MAX (NRF_SYSTICK_VAL_MASK / 2UL) /** * @brief Number of milliseconds in a second */ -#define NRF_DRV_SYSTICK_MS (1000UL) +#define NRFX_SYSTICK_MS (1000UL) /** * @brief Number of microseconds in a second */ -#define NRF_DRV_SYSTICK_US (1000UL * NRF_DRV_SYSTICK_MS) +#define NRFX_SYSTICK_US (1000UL * NRFX_SYSTICK_MS) /** * @brief Number of milliseconds to wait in single loop @@ -72,9 +70,9 @@ * * It describes the number of milliseconds to wait in single loop. * - * See @ref nrf_drv_systick_delay_ms source code for details. + * See @ref nrfx_systick_delay_ms source code for details. */ -#define NRF_DRV_SYSTICK_MS_STEP (64U) +#define NRFX_SYSTICK_MS_STEP (64U) /** * @brief Checks if the given time is in correct range @@ -84,8 +82,8 @@ * * @param us Time in microseconds to check */ -#define NRF_DRV_SYSTICK_ASSERT_TIMEOUT(us) \ - ASSERT(us <= (NRF_DRV_SYSTICK_TICKS_MAX / ((SystemCoreClock) / NRF_DRV_SYSTICK_US))); +#define NRFX_SYSTICK_ASSERT_TIMEOUT(us) \ + NRFX_ASSERT(us <= (NRFX_SYSTICK_TICKS_MAX / ((SystemCoreClock) / NRFX_SYSTICK_US))); /** * @brief Function that converts microseconds to ticks @@ -96,11 +94,11 @@ * * @return Number of ticks * - * @sa nrf_drv_systick_ms_tick + * @sa nrfx_systick_ms_tick */ -static inline uint32_t nrf_drv_systick_us_tick(uint32_t us) +static inline uint32_t nrfx_systick_us_tick(uint32_t us) { - return us * ((SystemCoreClock) / NRF_DRV_SYSTICK_US); + return us * ((SystemCoreClock) / NRFX_SYSTICK_US); } /** @@ -112,14 +110,14 @@ static inline uint32_t nrf_drv_systick_us_tick(uint32_t us) * * @return Number of ticks * - * @sa nrf_drv_systick_us_tick + * @sa nrfx_systick_us_tick */ -static inline uint32_t nrf_drv_systick_ms_tick(uint32_t ms) +static inline uint32_t nrfx_systick_ms_tick(uint32_t ms) { - return ms * ((SystemCoreClock) / NRF_DRV_SYSTICK_MS); + return ms * ((SystemCoreClock) / NRFX_SYSTICK_MS); } -void nrf_drv_systick_init(void) +void nrfx_systick_init(void) { nrf_systick_load_set(NRF_SYSTICK_VAL_MASK); nrf_systick_csr_set( @@ -128,22 +126,22 @@ void nrf_drv_systick_init(void) NRF_SYSTICK_CSR_ENABLE); } -void nrf_drv_systick_get(nrf_drv_systick_state_t * p_state) +void nrfx_systick_get(nrfx_systick_state_t * p_state) { p_state->time = nrf_systick_val_get(); } -bool nrf_drv_systick_test(nrf_drv_systick_state_t const * p_state, uint32_t us) +bool nrfx_systick_test(nrfx_systick_state_t const * p_state, uint32_t us) { - NRF_DRV_SYSTICK_ASSERT_TIMEOUT(us); + NRFX_SYSTICK_ASSERT_TIMEOUT(us); const uint32_t diff = NRF_SYSTICK_VAL_MASK & ((p_state->time) - nrf_systick_val_get()); - return (diff >= nrf_drv_systick_us_tick(us)); + return (diff >= nrfx_systick_us_tick(us)); } -void nrf_drv_systick_delay_ticks(uint32_t ticks) +void nrfx_systick_delay_ticks(uint32_t ticks) { - ASSERT(ticks <= NRF_DRV_SYSTICK_TICKS_MAX) + NRFX_ASSERT(ticks <= NRFX_SYSTICK_TICKS_MAX); const uint32_t start = nrf_systick_val_get(); while ((NRF_SYSTICK_VAL_MASK & (start - nrf_systick_val_get())) < ticks) @@ -152,21 +150,21 @@ void nrf_drv_systick_delay_ticks(uint32_t ticks) } } -void nrf_drv_systick_delay_us(uint32_t us) +void nrfx_systick_delay_us(uint32_t us) { - NRF_DRV_SYSTICK_ASSERT_TIMEOUT(us); - nrf_drv_systick_delay_ticks(nrf_drv_systick_us_tick(us)); + NRFX_SYSTICK_ASSERT_TIMEOUT(us); + nrfx_systick_delay_ticks(nrfx_systick_us_tick(us)); } -void nrf_drv_systick_delay_ms(uint32_t ms) +void nrfx_systick_delay_ms(uint32_t ms) { - uint32_t n = ms / NRF_DRV_SYSTICK_MS_STEP; - uint32_t r = ms % NRF_DRV_SYSTICK_MS_STEP; + uint32_t n = ms / NRFX_SYSTICK_MS_STEP; + uint32_t r = ms % NRFX_SYSTICK_MS_STEP; while (0 != (n--)) { - nrf_drv_systick_delay_ticks(nrf_drv_systick_ms_tick(NRF_DRV_SYSTICK_MS_STEP)); + nrfx_systick_delay_ticks(nrfx_systick_ms_tick(NRFX_SYSTICK_MS_STEP)); } - nrf_drv_systick_delay_ticks(nrf_drv_systick_ms_tick(r)); + nrfx_systick_delay_ticks(nrfx_systick_ms_tick(r)); } -#endif // NRF_MODULE_ENABLED(SYSTICK) +#endif // NRFX_CHECK(NRFX_SYSTICK_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_timer.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_timer.c new file mode 100644 index 0000000000..024958efbd --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_timer.c @@ -0,0 +1,330 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_TIMER_ENABLED) + +#if !(NRFX_CHECK(NRFX_TIMER0_ENABLED) || NRFX_CHECK(NRFX_TIMER1_ENABLED) || \ + NRFX_CHECK(NRFX_TIMER2_ENABLED) || NRFX_CHECK(NRFX_TIMER3_ENABLED) || \ + NRFX_CHECK(NRFX_TIMER4_ENABLED)) +#error "No enabled TIMER instances. Check ." +#endif + +#include + +#define NRFX_LOG_MODULE TIMER +#include + +/**@brief Timer control block. */ +typedef struct +{ + nrfx_timer_event_handler_t handler; + void * context; + nrfx_drv_state_t state; +} timer_control_block_t; + +static timer_control_block_t m_cb[NRFX_TIMER_ENABLED_COUNT]; + +nrfx_err_t nrfx_timer_init(nrfx_timer_t const * const p_instance, + nrfx_timer_config_t const * p_config, + nrfx_timer_event_handler_t timer_event_handler) +{ + timer_control_block_t * p_cb = &m_cb[p_instance->instance_id]; +#ifdef SOFTDEVICE_PRESENT + NRFX_ASSERT(p_instance->p_reg != NRF_TIMER0); +#endif + NRFX_ASSERT(p_config); + NRFX_ASSERT(timer_event_handler); + + nrfx_err_t err_code; + + if (p_cb->state != NRFX_DRV_STATE_UNINITIALIZED) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + /* Warning 685: Relational operator '<=' always evaluates to 'true'" + * Warning in NRF_TIMER_IS_BIT_WIDTH_VALID macro. Macro validate timers resolution. + * Not necessary in nRF52 based systems. Obligatory in nRF51 based systems. + */ + + /*lint -save -e685 */ + + NRFX_ASSERT(NRF_TIMER_IS_BIT_WIDTH_VALID(p_instance->p_reg, p_config->bit_width)); + + //lint -restore + + p_cb->handler = timer_event_handler; + p_cb->context = p_config->p_context; + + uint8_t i; + for (i = 0; i < p_instance->cc_channel_count; ++i) + { + nrf_timer_event_clear(p_instance->p_reg, + nrf_timer_compare_event_get(i)); + } + + NRFX_IRQ_PRIORITY_SET(nrfx_get_irq_number(p_instance->p_reg), + p_config->interrupt_priority); + NRFX_IRQ_ENABLE(nrfx_get_irq_number(p_instance->p_reg)); + + nrf_timer_mode_set(p_instance->p_reg, p_config->mode); + nrf_timer_bit_width_set(p_instance->p_reg, p_config->bit_width); + nrf_timer_frequency_set(p_instance->p_reg, p_config->frequency); + + p_cb->state = NRFX_DRV_STATE_INITIALIZED; + + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +void nrfx_timer_uninit(nrfx_timer_t const * const p_instance) +{ + NRFX_IRQ_DISABLE(nrfx_get_irq_number(p_instance->p_reg)); + + #define DISABLE_ALL UINT32_MAX + nrf_timer_shorts_disable(p_instance->p_reg, DISABLE_ALL); + nrf_timer_int_disable(p_instance->p_reg, DISABLE_ALL); + #undef DISABLE_ALL + + nrfx_timer_disable(p_instance); + + m_cb[p_instance->instance_id].state = NRFX_DRV_STATE_UNINITIALIZED; + NRFX_LOG_INFO("Uninitialized instance: %d.", p_instance->instance_id); +} + +void nrfx_timer_enable(nrfx_timer_t const * const p_instance) +{ + NRFX_ASSERT(m_cb[p_instance->instance_id].state == NRFX_DRV_STATE_INITIALIZED); + nrf_timer_task_trigger(p_instance->p_reg, NRF_TIMER_TASK_START); + m_cb[p_instance->instance_id].state = NRFX_DRV_STATE_POWERED_ON; + NRFX_LOG_INFO("Enabled instance: %d.", p_instance->instance_id); +} + +void nrfx_timer_disable(nrfx_timer_t const * const p_instance) +{ + NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); + nrf_timer_task_trigger(p_instance->p_reg, NRF_TIMER_TASK_SHUTDOWN); + m_cb[p_instance->instance_id].state = NRFX_DRV_STATE_INITIALIZED; + NRFX_LOG_INFO("Disabled instance: %d.", p_instance->instance_id); +} + +bool nrfx_timer_is_enabled(nrfx_timer_t const * const p_instance) +{ + NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); + return (m_cb[p_instance->instance_id].state == NRFX_DRV_STATE_POWERED_ON); +} + +void nrfx_timer_resume(nrfx_timer_t const * const p_instance) +{ + NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); + nrf_timer_task_trigger(p_instance->p_reg, NRF_TIMER_TASK_START); + NRFX_LOG_INFO("Resumed instance: %d.", p_instance->instance_id); +} + +void nrfx_timer_pause(nrfx_timer_t const * const p_instance) +{ + NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); + nrf_timer_task_trigger(p_instance->p_reg, NRF_TIMER_TASK_STOP); + NRFX_LOG_INFO("Paused instance: %d.", p_instance->instance_id); +} + +void nrfx_timer_clear(nrfx_timer_t const * const p_instance) +{ + NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); + nrf_timer_task_trigger(p_instance->p_reg, NRF_TIMER_TASK_CLEAR); +} + +void nrfx_timer_increment(nrfx_timer_t const * const p_instance) +{ + NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(nrf_timer_mode_get(p_instance->p_reg) != NRF_TIMER_MODE_TIMER); + + nrf_timer_task_trigger(p_instance->p_reg, NRF_TIMER_TASK_COUNT); +} + +uint32_t nrfx_timer_capture(nrfx_timer_t const * const p_instance, + nrf_timer_cc_channel_t cc_channel) +{ + NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(cc_channel < p_instance->cc_channel_count); + + nrf_timer_task_trigger(p_instance->p_reg, + nrf_timer_capture_task_get(cc_channel)); + return nrf_timer_cc_read(p_instance->p_reg, cc_channel); +} + +void nrfx_timer_compare(nrfx_timer_t const * const p_instance, + nrf_timer_cc_channel_t cc_channel, + uint32_t cc_value, + bool enable_int) +{ + nrf_timer_int_mask_t timer_int = nrf_timer_compare_int_get(cc_channel); + + if (enable_int) + { + nrf_timer_event_clear(p_instance->p_reg, nrf_timer_compare_event_get(cc_channel)); + nrf_timer_int_enable(p_instance->p_reg, timer_int); + } + else + { + nrf_timer_int_disable(p_instance->p_reg, timer_int); + } + + nrf_timer_cc_write(p_instance->p_reg, cc_channel, cc_value); + NRFX_LOG_INFO("Timer id: %d, capture value set: %lu, channel: %d.", + p_instance->instance_id, + cc_value, + cc_channel); +} + +void nrfx_timer_extended_compare(nrfx_timer_t const * const p_instance, + nrf_timer_cc_channel_t cc_channel, + uint32_t cc_value, + nrf_timer_short_mask_t timer_short_mask, + bool enable_int) +{ + nrf_timer_shorts_disable(p_instance->p_reg, + (TIMER_SHORTS_COMPARE0_STOP_Msk << cc_channel) | + (TIMER_SHORTS_COMPARE0_CLEAR_Msk << cc_channel)); + + nrf_timer_shorts_enable(p_instance->p_reg, timer_short_mask); + + nrfx_timer_compare(p_instance, + cc_channel, + cc_value, + enable_int); + NRFX_LOG_INFO("Timer id: %d, capture value set: %lu, channel: %d.", + p_instance->instance_id, + cc_value, + cc_channel); +} + +void nrfx_timer_compare_int_enable(nrfx_timer_t const * const p_instance, + uint32_t channel) +{ + NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(channel < p_instance->cc_channel_count); + + nrf_timer_event_clear(p_instance->p_reg, + nrf_timer_compare_event_get(channel)); + nrf_timer_int_enable(p_instance->p_reg, + nrf_timer_compare_int_get(channel)); +} + +void nrfx_timer_compare_int_disable(nrfx_timer_t const * const p_instance, + uint32_t channel) +{ + NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); + NRFX_ASSERT(channel < p_instance->cc_channel_count); + + nrf_timer_int_disable(p_instance->p_reg, + nrf_timer_compare_int_get(channel)); +} + +static void irq_handler(NRF_TIMER_Type * p_reg, + timer_control_block_t * p_cb, + uint8_t channel_count) +{ + uint8_t i; + for (i = 0; i < channel_count; ++i) + { + nrf_timer_event_t event = nrf_timer_compare_event_get(i); + nrf_timer_int_mask_t int_mask = nrf_timer_compare_int_get(i); + + if (nrf_timer_event_check(p_reg, event) && + nrf_timer_int_enable_check(p_reg, int_mask)) + { + nrf_timer_event_clear(p_reg, event); + NRFX_LOG_DEBUG("Compare event, channel: %d.", i); + p_cb->handler(event, p_cb->context); + } + } +} + +#if NRFX_CHECK(NRFX_TIMER0_ENABLED) +void nrfx_timer_0_irq_handler(void) +{ + irq_handler(NRF_TIMER0, &m_cb[NRFX_TIMER0_INST_IDX], + NRF_TIMER_CC_CHANNEL_COUNT(0)); +} +#endif + +#if NRFX_CHECK(NRFX_TIMER1_ENABLED) +void nrfx_timer_1_irq_handler(void) +{ + irq_handler(NRF_TIMER1, &m_cb[NRFX_TIMER1_INST_IDX], + NRF_TIMER_CC_CHANNEL_COUNT(1)); +} +#endif + +#if NRFX_CHECK(NRFX_TIMER2_ENABLED) +void nrfx_timer_2_irq_handler(void) +{ + irq_handler(NRF_TIMER2, &m_cb[NRFX_TIMER2_INST_IDX], + NRF_TIMER_CC_CHANNEL_COUNT(2)); +} +#endif + +#if NRFX_CHECK(NRFX_TIMER3_ENABLED) +void nrfx_timer_3_irq_handler(void) +{ + irq_handler(NRF_TIMER3, &m_cb[NRFX_TIMER3_INST_IDX], + NRF_TIMER_CC_CHANNEL_COUNT(3)); +} +#endif + +#if NRFX_CHECK(NRFX_TIMER4_ENABLED) +void nrfx_timer_4_irq_handler(void) +{ + irq_handler(NRF_TIMER4, &m_cb[NRFX_TIMER4_INST_IDX], + NRF_TIMER_CC_CHANNEL_COUNT(4)); +} +#endif + +#endif // NRFX_CHECK(NRFX_TIMER_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_twi.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_twi.c new file mode 100644 index 0000000000..5860eb750c --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_twi.c @@ -0,0 +1,727 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_TWI_ENABLED) + +#if !(NRFX_CHECK(NRFX_TWI0_ENABLED) || NRFX_CHECK(NRFX_TWI1_ENABLED)) +#error "No enabled TWI instances. Check ." +#endif + +#include +#include +#include "prs/nrfx_prs.h" + +#define NRFX_LOG_MODULE TWI +#include + +#define EVT_TO_STR(event) \ + (event == NRFX_TWI_EVT_DONE ? "EVT_DONE" : \ + (event == NRFX_TWI_EVT_ADDRESS_NACK ? "EVT_ADDRESS_NACK" : \ + (event == NRFX_TWI_EVT_DATA_NACK ? "EVT_DATA_NACK" : \ + "UNKNOWN ERROR"))) + +#define EVT_TO_STR_TWI(event) \ + (event == NRF_TWI_EVENT_STOPPED ? "NRF_TWI_EVENT_STOPPED" : \ + (event == NRF_TWI_EVENT_RXDREADY ? "NRF_TWI_EVENT_RXDREADY" : \ + (event == NRF_TWI_EVENT_TXDSENT ? "NRF_TWI_EVENT_TXDSENT" : \ + (event == NRF_TWI_EVENT_ERROR ? "NRF_TWI_EVENT_ERROR" : \ + (event == NRF_TWI_EVENT_BB ? "NRF_TWI_EVENT_BB" : \ + (event == NRF_TWI_EVENT_SUSPENDED ? "NRF_TWI_EVENT_SUSPENDED" : \ + "UNKNOWN ERROR")))))) + +#define TRANSFER_TO_STR(type) \ + (type == NRFX_TWI_XFER_TX ? "XFER_TX" : \ + (type == NRFX_TWI_XFER_RX ? "XFER_RX" : \ + (type == NRFX_TWI_XFER_TXRX ? "XFER_TXRX" : \ + (type == NRFX_TWI_XFER_TXTX ? "XFER_TXTX" : \ + "UNKNOWN TRANSFER TYPE")))) + +#define TWI_PIN_INIT(_pin) nrf_gpio_cfg((_pin), \ + NRF_GPIO_PIN_DIR_INPUT, \ + NRF_GPIO_PIN_INPUT_CONNECT, \ + NRF_GPIO_PIN_PULLUP, \ + NRF_GPIO_PIN_S0D1, \ + NRF_GPIO_PIN_NOSENSE) + +#define HW_TIMEOUT 10000 + +// Control block - driver instance local data. +typedef struct +{ + nrfx_twi_evt_handler_t handler; + void * p_context; + volatile uint32_t int_mask; + nrfx_twi_xfer_desc_t xfer_desc; + uint32_t flags; + uint8_t * p_curr_buf; + uint8_t curr_length; + bool curr_no_stop; + nrfx_drv_state_t state; + bool error; + volatile bool busy; + bool repeated; + uint8_t bytes_transferred; + bool hold_bus_uninit; +} twi_control_block_t; + +static twi_control_block_t m_cb[NRFX_TWI_ENABLED_COUNT]; + +static nrfx_err_t twi_process_error(uint32_t errorsrc) +{ + nrfx_err_t ret = NRFX_ERROR_INTERNAL; + + if (errorsrc & NRF_TWI_ERROR_OVERRUN) + { + ret = NRFX_ERROR_DRV_TWI_ERR_OVERRUN; + } + + if (errorsrc & NRF_TWI_ERROR_ADDRESS_NACK) + { + ret = NRFX_ERROR_DRV_TWI_ERR_ANACK; + } + + if (errorsrc & NRF_TWI_ERROR_DATA_NACK) + { + ret = NRFX_ERROR_DRV_TWI_ERR_DNACK; + } + + return ret; +} + + + +nrfx_err_t nrfx_twi_init(nrfx_twi_t const * p_instance, + nrfx_twi_config_t const * p_config, + nrfx_twi_evt_handler_t event_handler, + void * p_context) +{ + NRFX_ASSERT(p_config); + NRFX_ASSERT(p_config->scl != p_config->sda); + twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + nrfx_err_t err_code; + + if (p_cb->state != NRFX_DRV_STATE_UNINITIALIZED) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + static nrfx_irq_handler_t const irq_handlers[NRFX_TWI_ENABLED_COUNT] = { + #if NRFX_CHECK(NRFX_TWI0_ENABLED) + nrfx_twi_0_irq_handler, + #endif + #if NRFX_CHECK(NRFX_TWI1_ENABLED) + nrfx_twi_1_irq_handler, + #endif + }; + if (nrfx_prs_acquire(p_instance->p_twi, + irq_handlers[p_instance->drv_inst_idx]) != NRFX_SUCCESS) + { + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } +#endif // NRFX_CHECK(NRFX_PRS_ENABLED) + + p_cb->handler = event_handler; + p_cb->p_context = p_context; + p_cb->int_mask = 0; + p_cb->repeated = false; + p_cb->busy = false; + p_cb->hold_bus_uninit = p_config->hold_bus_uninit; + + /* To secure correct signal levels on the pins used by the TWI + master when the system is in OFF mode, and when the TWI master is + disabled, these pins must be configured in the GPIO peripheral. + */ + TWI_PIN_INIT(p_config->scl); + TWI_PIN_INIT(p_config->sda); + + NRF_TWI_Type * p_twi = p_instance->p_twi; + nrf_twi_pins_set(p_twi, p_config->scl, p_config->sda); + nrf_twi_frequency_set(p_twi, + (nrf_twi_frequency_t)p_config->frequency); + + if (p_cb->handler) + { + NRFX_IRQ_PRIORITY_SET(nrfx_get_irq_number(p_instance->p_twi), + p_config->interrupt_priority); + NRFX_IRQ_ENABLE(nrfx_get_irq_number(p_instance->p_twi)); + } + + p_cb->state = NRFX_DRV_STATE_INITIALIZED; + + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +void nrfx_twi_uninit(nrfx_twi_t const * p_instance) +{ + twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); + + if (p_cb->handler) + { + NRFX_IRQ_DISABLE(nrfx_get_irq_number(p_instance->p_twi)); + } + nrfx_twi_disable(p_instance); + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + nrfx_prs_release(p_instance->p_twi); +#endif + + if (!p_cb->hold_bus_uninit) + { + nrf_gpio_cfg_default(p_instance->p_twi->PSELSCL); + nrf_gpio_cfg_default(p_instance->p_twi->PSELSDA); + } + + p_cb->state = NRFX_DRV_STATE_UNINITIALIZED; + NRFX_LOG_INFO("Instance uninitialized: %d.", p_instance->drv_inst_idx); +} + +void nrfx_twi_enable(nrfx_twi_t const * p_instance) +{ + twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state == NRFX_DRV_STATE_INITIALIZED); + + NRF_TWI_Type * p_twi = p_instance->p_twi; + nrf_twi_enable(p_twi); + + p_cb->state = NRFX_DRV_STATE_POWERED_ON; + NRFX_LOG_INFO("Instance enabled: %d.", p_instance->drv_inst_idx); +} + +void nrfx_twi_disable(nrfx_twi_t const * p_instance) +{ + twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); + + NRF_TWI_Type * p_twi = p_instance->p_twi; + nrf_twi_int_disable(p_twi, NRF_TWI_ALL_INTS_MASK); + nrf_twi_shorts_disable(p_twi, NRF_TWI_ALL_SHORTS_MASK); + nrf_twi_disable(p_twi); + + p_cb->state = NRFX_DRV_STATE_INITIALIZED; + NRFX_LOG_INFO("Instance disabled: %d.", p_instance->drv_inst_idx); +} + +static bool twi_send_byte(NRF_TWI_Type * p_twi, + uint8_t const * p_data, + uint8_t length, + uint8_t * p_bytes_transferred, + bool no_stop) +{ + if (*p_bytes_transferred < length) + { + nrf_twi_txd_set(p_twi, p_data[*p_bytes_transferred]); + ++(*p_bytes_transferred); + } + else + { + if (no_stop) + { + nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_SUSPEND); + return false; + } + else + { + nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STOP); + } + } + return true; +} + +static void twi_receive_byte(NRF_TWI_Type * p_twi, + uint8_t * p_data, + uint8_t length, + uint8_t * p_bytes_transferred) +{ + if (*p_bytes_transferred < length) + { + p_data[*p_bytes_transferred] = nrf_twi_rxd_get(p_twi); + + ++(*p_bytes_transferred); + + if (*p_bytes_transferred == length - 1) + { + nrf_twi_shorts_set(p_twi, NRF_TWI_SHORT_BB_STOP_MASK); + } + else if (*p_bytes_transferred == length) + { + return; + } + + nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_RESUME); + } +} + +static bool twi_transfer(NRF_TWI_Type * p_twi, + bool * p_error, + uint8_t * p_bytes_transferred, + uint8_t * p_data, + uint8_t length, + bool no_stop) +{ + bool do_stop_check = ((*p_error) || ((*p_bytes_transferred) == length)); + + if (*p_error) + { + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_TXDSENT); + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_RXDREADY); + } + else if (nrf_twi_event_check(p_twi, NRF_TWI_EVENT_ERROR)) + { + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); + NRFX_LOG_DEBUG("TWI: Event: %s.", EVT_TO_STR_TWI(NRF_TWI_EVENT_ERROR)); + nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STOP); + *p_error = true; + } + else + { + if (nrf_twi_event_check(p_twi, NRF_TWI_EVENT_TXDSENT)) + { + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_TXDSENT); + NRFX_LOG_DEBUG("TWI: Event: %s.", EVT_TO_STR_TWI(NRF_TWI_EVENT_TXDSENT)); + if (nrf_twi_event_check(p_twi, NRF_TWI_EVENT_ERROR)) + { + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); + NRFX_LOG_DEBUG("TWI: Event: %s.", EVT_TO_STR_TWI(NRF_TWI_EVENT_ERROR)); + nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STOP); + *p_error = true; + } + else + { + if (!twi_send_byte(p_twi, p_data, length, p_bytes_transferred, no_stop)) + { + return false; + } + } + } + else if (nrf_twi_event_check(p_twi, NRF_TWI_EVENT_RXDREADY)) + { + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_RXDREADY); + NRFX_LOG_DEBUG("TWI: Event: %s.", EVT_TO_STR_TWI(NRF_TWI_EVENT_RXDREADY)); + if (nrf_twi_event_check(p_twi, NRF_TWI_EVENT_ERROR)) + { + NRFX_LOG_DEBUG("TWI: Event: %s.", EVT_TO_STR_TWI(NRF_TWI_EVENT_ERROR)); + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); + nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STOP); + *p_error = true; + } + else + { + twi_receive_byte(p_twi, p_data, length, p_bytes_transferred); + } + } + } + + if (do_stop_check && nrf_twi_event_check(p_twi, NRF_TWI_EVENT_STOPPED)) + { + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_STOPPED); + NRFX_LOG_DEBUG("TWI: Event: %s.", EVT_TO_STR_TWI(NRF_TWI_EVENT_STOPPED)); + return false; + } + + return true; +} + +static nrfx_err_t twi_tx_start_transfer(twi_control_block_t * p_cb, + NRF_TWI_Type * p_twi, + uint8_t const * p_data, + uint8_t length, + bool no_stop) +{ + nrfx_err_t ret_code = NRFX_SUCCESS; + volatile int32_t hw_timeout; + + hw_timeout = HW_TIMEOUT; + + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_STOPPED); + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_TXDSENT); + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_RXDREADY); + nrf_twi_shorts_set(p_twi, 0); + + p_cb->bytes_transferred = 0; + p_cb->error = false; + + // In case TWI is suspended resume its operation. + nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_RESUME); + nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STARTTX); + + (void)twi_send_byte(p_twi, p_data, length, &p_cb->bytes_transferred, no_stop); + + if (p_cb->handler) + { + p_cb->int_mask = NRF_TWI_INT_STOPPED_MASK | + NRF_TWI_INT_ERROR_MASK | + NRF_TWI_INT_TXDSENT_MASK | + NRF_TWI_INT_RXDREADY_MASK; + nrf_twi_int_enable(p_twi, p_cb->int_mask); + } + else + { + while ((hw_timeout > 0) && + twi_transfer(p_twi, + &p_cb->error, + &p_cb->bytes_transferred, + (uint8_t *)p_data, + length, + no_stop)) + { + hw_timeout--; + } + + if (p_cb->error) + { + uint32_t errorsrc = nrf_twi_errorsrc_get_and_clear(p_twi); + + if (errorsrc) + { + ret_code = twi_process_error(errorsrc); + } + } + + if (hw_timeout <= 0) + { + nrf_twi_disable(p_twi); + nrf_twi_enable(p_twi); + ret_code = NRFX_ERROR_INTERNAL; + } + + } + return ret_code; +} + +static nrfx_err_t twi_rx_start_transfer(twi_control_block_t * p_cb, + NRF_TWI_Type * p_twi, + uint8_t const * p_data, + uint8_t length) +{ + nrfx_err_t ret_code = NRFX_SUCCESS; + volatile int32_t hw_timeout; + + hw_timeout = HW_TIMEOUT; + + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_STOPPED); + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_TXDSENT); + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_RXDREADY); + + p_cb->bytes_transferred = 0; + p_cb->error = false; + + if (length == 1) + { + nrf_twi_shorts_set(p_twi, NRF_TWI_SHORT_BB_STOP_MASK); + } + else + { + nrf_twi_shorts_set(p_twi, NRF_TWI_SHORT_BB_SUSPEND_MASK); + } + // In case TWI is suspended resume its operation. + nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_RESUME); + nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STARTRX); + + if (p_cb->handler) + { + p_cb->int_mask = NRF_TWI_INT_STOPPED_MASK | + NRF_TWI_INT_ERROR_MASK | + NRF_TWI_INT_TXDSENT_MASK | + NRF_TWI_INT_RXDREADY_MASK; + nrf_twi_int_enable(p_twi, p_cb->int_mask); + } + else + { + while ((hw_timeout > 0) && + twi_transfer(p_twi, + &p_cb->error, + &p_cb->bytes_transferred, + (uint8_t*)p_data, + length, + false)) + { + hw_timeout--; + } + + if (p_cb->error) + { + uint32_t errorsrc = nrf_twi_errorsrc_get_and_clear(p_twi); + + if (errorsrc) + { + ret_code = twi_process_error(errorsrc); + } + } + if (hw_timeout <= 0) + { + nrf_twi_disable(p_twi); + nrf_twi_enable(p_twi); + ret_code = NRFX_ERROR_INTERNAL; + } + } + return ret_code; +} + +__STATIC_INLINE nrfx_err_t twi_xfer(twi_control_block_t * p_cb, + NRF_TWI_Type * p_twi, + nrfx_twi_xfer_desc_t const * p_xfer_desc, + uint32_t flags) +{ + + nrfx_err_t err_code = NRFX_SUCCESS; + + /* Block TWI interrupts to ensure that function is not interrupted by TWI interrupt. */ + nrf_twi_int_disable(p_twi, NRF_TWI_ALL_INTS_MASK); + + if (p_cb->busy) + { + nrf_twi_int_enable(p_twi, p_cb->int_mask); + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + else + { + p_cb->busy = (NRFX_TWI_FLAG_NO_XFER_EVT_HANDLER & flags) ? false : true; + } + + p_cb->flags = flags; + p_cb->xfer_desc = *p_xfer_desc; + p_cb->curr_length = p_xfer_desc->primary_length; + p_cb->p_curr_buf = p_xfer_desc->p_primary_buf; + nrf_twi_address_set(p_twi, p_xfer_desc->address); + + if (p_xfer_desc->type != NRFX_TWI_XFER_RX) + { + p_cb->curr_no_stop = ((p_xfer_desc->type == NRFX_TWI_XFER_TX) && + !(flags & NRFX_TWI_FLAG_TX_NO_STOP)) ? false : true; + + err_code = twi_tx_start_transfer(p_cb, + p_twi, + p_xfer_desc->p_primary_buf, + p_xfer_desc->primary_length, + p_cb->curr_no_stop); + } + else + { + p_cb->curr_no_stop = false; + + err_code = twi_rx_start_transfer(p_cb, + p_twi, + p_xfer_desc->p_primary_buf, + p_xfer_desc->primary_length); + } + if (p_cb->handler == NULL) + { + p_cb->busy = false; + } + return err_code; +} + +bool nrfx_twi_is_busy(nrfx_twi_t const * p_instance) +{ + twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + return p_cb->busy; +} + +nrfx_err_t nrfx_twi_xfer(nrfx_twi_t const * p_instance, + nrfx_twi_xfer_desc_t const * p_xfer_desc, + uint32_t flags) +{ + + nrfx_err_t err_code = NRFX_SUCCESS; + twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + + // TXRX and TXTX transfers are supported only in non-blocking mode. + NRFX_ASSERT( !((p_cb->handler == NULL) && (p_xfer_desc->type == NRFX_TWI_XFER_TXRX))); + NRFX_ASSERT( !((p_cb->handler == NULL) && (p_xfer_desc->type == NRFX_TWI_XFER_TXTX))); + + NRFX_LOG_INFO("Transfer type: %s.", TRANSFER_TO_STR(p_xfer_desc->type)); + NRFX_LOG_INFO("Transfer buffers length: primary: %d, secondary: %d.", + p_xfer_desc->primary_length, + p_xfer_desc->secondary_length); + NRFX_LOG_DEBUG("Primary buffer data:"); + NRFX_LOG_HEXDUMP_DEBUG(p_xfer_desc->p_primary_buf, + p_xfer_desc->primary_length * sizeof(p_xfer_desc->p_primary_buf[0])); + NRFX_LOG_DEBUG("Secondary buffer data:"); + NRFX_LOG_HEXDUMP_DEBUG(p_xfer_desc->p_secondary_buf, + p_xfer_desc->secondary_length * sizeof(p_xfer_desc->p_secondary_buf[0])); + + err_code = twi_xfer(p_cb, (NRF_TWI_Type *)p_instance->p_twi, p_xfer_desc, flags); + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +nrfx_err_t nrfx_twi_tx(nrfx_twi_t const * p_instance, + uint8_t address, + uint8_t const * p_data, + size_t length, + bool no_stop) +{ + nrfx_twi_xfer_desc_t xfer = NRFX_TWI_XFER_DESC_TX(address, (uint8_t*)p_data, length); + + return nrfx_twi_xfer(p_instance, &xfer, no_stop ? NRFX_TWI_FLAG_TX_NO_STOP : 0); +} + +nrfx_err_t nrfx_twi_rx(nrfx_twi_t const * p_instance, + uint8_t address, + uint8_t * p_data, + size_t length) +{ + nrfx_twi_xfer_desc_t xfer = NRFX_TWI_XFER_DESC_RX(address, p_data, length); + return nrfx_twi_xfer(p_instance, &xfer, 0); +} + +size_t nrfx_twi_data_count_get(nrfx_twi_t const * const p_instance) +{ + return m_cb[p_instance->drv_inst_idx].bytes_transferred; +} + +uint32_t nrfx_twi_stopped_event_get(nrfx_twi_t const * p_instance) +{ + return (uint32_t)nrf_twi_event_address_get(p_instance->p_twi, NRF_TWI_EVENT_STOPPED); +} + +static void twi_irq_handler(NRF_TWI_Type * p_twi, twi_control_block_t * p_cb) +{ + NRFX_ASSERT(p_cb->handler); + + if (twi_transfer(p_twi, + &p_cb->error, + &p_cb->bytes_transferred, + p_cb->p_curr_buf, + p_cb->curr_length, + p_cb->curr_no_stop )) + { + return; + } + + if (!p_cb->error && + ((p_cb->xfer_desc.type == NRFX_TWI_XFER_TXRX) || + (p_cb->xfer_desc.type == NRFX_TWI_XFER_TXTX)) && + p_cb->p_curr_buf == p_cb->xfer_desc.p_primary_buf) + { + p_cb->p_curr_buf = p_cb->xfer_desc.p_secondary_buf; + p_cb->curr_length = p_cb->xfer_desc.secondary_length; + p_cb->curr_no_stop = (p_cb->flags & NRFX_TWI_FLAG_TX_NO_STOP); + + if (p_cb->xfer_desc.type == NRFX_TWI_XFER_TXTX) + { + (void)twi_tx_start_transfer(p_cb, + p_twi, + p_cb->p_curr_buf, + p_cb->curr_length, + p_cb->curr_no_stop); + } + else + { + (void)twi_rx_start_transfer(p_cb, p_twi, p_cb->p_curr_buf, p_cb->curr_length); + } + } + else + { + nrfx_twi_evt_t event; + event.xfer_desc = p_cb->xfer_desc; + + if (p_cb->error) + { + uint32_t errorsrc = nrf_twi_errorsrc_get_and_clear(p_twi); + if (errorsrc & NRF_TWI_ERROR_ADDRESS_NACK) + { + event.type = NRFX_TWI_EVT_ADDRESS_NACK; + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRFX_TWI_EVT_ADDRESS_NACK)); + } + else if (errorsrc & NRF_TWI_ERROR_DATA_NACK) + { + event.type = NRFX_TWI_EVT_DATA_NACK; + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRFX_TWI_EVT_DATA_NACK)); + } + } + else + { + event.type = NRFX_TWI_EVT_DONE; + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRFX_TWI_EVT_DONE)); + } + + p_cb->busy = false; + + if (!(NRFX_TWI_FLAG_NO_XFER_EVT_HANDLER & p_cb->flags)) + { + p_cb->handler(&event, p_cb->p_context); + } + } + +} + +#if 0 +#if NRFX_CHECK(NRFX_TWI0_ENABLED) +void nrfx_twi_0_irq_handler(void) +{ + twi_irq_handler(NRF_TWI0, &m_cb[NRFX_TWI0_INST_IDX]); +} +#endif +#endif + +#if 0 +#if NRFX_CHECK(NRFX_TWI1_ENABLED) +void nrfx_twi_1_irq_handler(void) +{ + twi_irq_handler(NRF_TWI1, &m_cb[NRFX_TWI1_INST_IDX]); +} +#endif +#endif + +#endif // NRFX_CHECK(NRFX_TWI_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_twim.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_twim.c new file mode 100644 index 0000000000..75b714fba4 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_twim.c @@ -0,0 +1,668 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_TWIM_ENABLED) + +#if !(NRFX_CHECK(NRFX_TWIM0_ENABLED) || NRFX_CHECK(NRFX_TWIM1_ENABLED)) +#error "No enabled TWIM instances. Check ." +#endif + +#include +#include +#include "prs/nrfx_prs.h" + +#define NRFX_LOG_MODULE TWIM +#include + +#define EVT_TO_STR(event) \ + (event == NRFX_TWIM_EVT_DONE ? "EVT_DONE" : \ + (event == NRFX_TWIM_EVT_ADDRESS_NACK ? "EVT_ADDRESS_NACK" : \ + (event == NRFX_TWIM_EVT_DATA_NACK ? "EVT_DATA_NACK" : \ + "UNKNOWN ERROR"))) + +#define EVT_TO_STR_TWIM(event) \ + (event == NRF_TWIM_EVENT_STOPPED ? "NRF_TWIM_EVENT_STOPPED" : \ + (event == NRF_TWIM_EVENT_ERROR ? "NRF_TWIM_EVENT_ERROR" : \ + (event == NRF_TWIM_EVENT_SUSPENDED ? "NRF_TWIM_EVENT_SUSPENDED" : \ + (event == NRF_TWIM_EVENT_RXSTARTED ? "NRF_TWIM_EVENT_RXSTARTED" : \ + (event == NRF_TWIM_EVENT_TXSTARTED ? "NRF_TWIM_EVENT_TXSTARTED" : \ + (event == NRF_TWIM_EVENT_LASTRX ? "NRF_TWIM_EVENT_LASTRX" : \ + (event == NRF_TWIM_EVENT_LASTTX ? "NRF_TWIM_EVENT_LASTTX" : \ + "UNKNOWN ERROR"))))))) + +#define TRANSFER_TO_STR(type) \ + (type == NRFX_TWIM_XFER_TX ? "XFER_TX" : \ + (type == NRFX_TWIM_XFER_RX ? "XFER_RX" : \ + (type == NRFX_TWIM_XFER_TXRX ? "XFER_TXRX" : \ + (type == NRFX_TWIM_XFER_TXTX ? "XFER_TXTX" : \ + "UNKNOWN TRANSFER TYPE")))) + +#define TWIM_PIN_INIT(_pin) nrf_gpio_cfg((_pin), \ + NRF_GPIO_PIN_DIR_INPUT, \ + NRF_GPIO_PIN_INPUT_CONNECT, \ + NRF_GPIO_PIN_PULLUP, \ + NRF_GPIO_PIN_S0D1, \ + NRF_GPIO_PIN_NOSENSE) + +#define TWIMX_LENGTH_VALIDATE(peripheral, drv_inst_idx, len1, len2) \ + (((drv_inst_idx) == NRFX_CONCAT_3(NRFX_, peripheral, _INST_IDX)) && \ + NRFX_EASYDMA_LENGTH_VALIDATE(peripheral, len1, len2)) + +#if NRFX_CHECK(NRFX_TWIM0_ENABLED) +#define TWIM0_LENGTH_VALIDATE(...) TWIMX_LENGTH_VALIDATE(TWIM0, __VA_ARGS__) +#else +#define TWIM0_LENGTH_VALIDATE(...) 0 +#endif + +#if NRFX_CHECK(NRFX_TWIM1_ENABLED) +#define TWIM1_LENGTH_VALIDATE(...) TWIMX_LENGTH_VALIDATE(TWIM1, __VA_ARGS__) +#else +#define TWIM1_LENGTH_VALIDATE(...) 0 +#endif + +#define TWIM_LENGTH_VALIDATE(drv_inst_idx, len1, len2) \ + (TWIM0_LENGTH_VALIDATE(drv_inst_idx, len1, len2) || \ + TWIM1_LENGTH_VALIDATE(drv_inst_idx, len1, len2)) + +// Control block - driver instance local data. +typedef struct +{ + nrfx_twim_evt_handler_t handler; + void * p_context; + volatile uint32_t int_mask; + nrfx_twim_xfer_desc_t xfer_desc; + uint32_t flags; + uint8_t * p_curr_buf; + size_t curr_length; + bool curr_no_stop; + nrfx_drv_state_t state; + bool error; + volatile bool busy; + bool repeated; + uint8_t bytes_transferred; + bool hold_bus_uninit; +#if NRFX_CHECK(NRFX_TWIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED) + nrf_twim_frequency_t bus_frequency; +#endif +} twim_control_block_t; + +static twim_control_block_t m_cb[NRFX_TWIM_ENABLED_COUNT]; + +static nrfx_err_t twi_process_error(uint32_t errorsrc) +{ + nrfx_err_t ret = NRFX_ERROR_INTERNAL; + + if (errorsrc & NRF_TWIM_ERROR_ADDRESS_NACK) + { + ret = NRFX_ERROR_DRV_TWI_ERR_ANACK; + } + + if (errorsrc & NRF_TWIM_ERROR_DATA_NACK) + { + ret = NRFX_ERROR_DRV_TWI_ERR_DNACK; + } + + return ret; +} + +nrfx_err_t nrfx_twim_init(nrfx_twim_t const * p_instance, + nrfx_twim_config_t const * p_config, + nrfx_twim_evt_handler_t event_handler, + void * p_context) +{ + NRFX_ASSERT(p_config); + NRFX_ASSERT(p_config->scl != p_config->sda); + twim_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + nrfx_err_t err_code; + + if (p_cb->state != NRFX_DRV_STATE_UNINITIALIZED) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + static nrfx_irq_handler_t const irq_handlers[NRFX_TWIM_ENABLED_COUNT] = { + #if NRFX_CHECK(NRFX_TWIM0_ENABLED) + nrfx_twim_0_irq_handler, + #endif + #if NRFX_CHECK(NRFX_TWIM1_ENABLED) + nrfx_twim_1_irq_handler, + #endif + }; + if (nrfx_prs_acquire(p_instance->p_twim, + irq_handlers[p_instance->drv_inst_idx]) != NRFX_SUCCESS) + { + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } +#endif // NRFX_CHECK(NRFX_PRS_ENABLED) + + p_cb->handler = event_handler; + p_cb->p_context = p_context; + p_cb->int_mask = 0; + p_cb->repeated = false; + p_cb->busy = false; + p_cb->hold_bus_uninit = p_config->hold_bus_uninit; +#if NRFX_CHECK(NRFX_TWIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED) + p_cb->bus_frequency = (nrf_twim_frequency_t)p_config->frequency; +#endif + + /* To secure correct signal levels on the pins used by the TWI + master when the system is in OFF mode, and when the TWI master is + disabled, these pins must be configured in the GPIO peripheral. + */ + TWIM_PIN_INIT(p_config->scl); + TWIM_PIN_INIT(p_config->sda); + + NRF_TWIM_Type * p_twim = p_instance->p_twim; + nrf_twim_pins_set(p_twim, p_config->scl, p_config->sda); + nrf_twim_frequency_set(p_twim, + (nrf_twim_frequency_t)p_config->frequency); + + if (p_cb->handler) + { + NRFX_IRQ_PRIORITY_SET(nrfx_get_irq_number(p_instance->p_twim), + p_config->interrupt_priority); + NRFX_IRQ_ENABLE(nrfx_get_irq_number(p_instance->p_twim)); + } + + p_cb->state = NRFX_DRV_STATE_INITIALIZED; + + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +void nrfx_twim_uninit(nrfx_twim_t const * p_instance) +{ + twim_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); + + if (p_cb->handler) + { + NRFX_IRQ_DISABLE(nrfx_get_irq_number(p_instance->p_twim)); + } + nrfx_twim_disable(p_instance); + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + nrfx_prs_release(p_instance->p_twim); +#endif + + if (!p_cb->hold_bus_uninit) + { + nrf_gpio_cfg_default(p_instance->p_twim->PSEL.SCL); + nrf_gpio_cfg_default(p_instance->p_twim->PSEL.SDA); + } + + p_cb->state = NRFX_DRV_STATE_UNINITIALIZED; + NRFX_LOG_INFO("Instance uninitialized: %d.", p_instance->drv_inst_idx); +} + +void nrfx_twim_enable(nrfx_twim_t const * p_instance) +{ + twim_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state == NRFX_DRV_STATE_INITIALIZED); + + nrf_twim_enable(p_instance->p_twim); + + p_cb->state = NRFX_DRV_STATE_POWERED_ON; + NRFX_LOG_INFO("Instance enabled: %d.", p_instance->drv_inst_idx); +} + +void nrfx_twim_disable(nrfx_twim_t const * p_instance) +{ + twim_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); + + NRF_TWIM_Type * p_twim = p_instance->p_twim; + p_cb->int_mask = 0; + nrf_twim_int_disable(p_twim, NRF_TWIM_ALL_INTS_MASK); + nrf_twim_shorts_disable(p_twim, NRF_TWIM_ALL_SHORTS_MASK); + nrf_twim_disable(p_twim); + + p_cb->state = NRFX_DRV_STATE_INITIALIZED; + NRFX_LOG_INFO("Instance disabled: %d.", p_instance->drv_inst_idx); +} + + +bool nrfx_twim_is_busy(nrfx_twim_t const * p_instance) +{ + twim_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + return p_cb->busy; +} + + +__STATIC_INLINE void twim_list_enable_handle(NRF_TWIM_Type * p_twim, uint32_t flags) +{ + if (NRFX_TWIM_FLAG_TX_POSTINC & flags) + { + nrf_twim_tx_list_enable(p_twim); + } + else + { + nrf_twim_tx_list_disable(p_twim); + } + + if (NRFX_TWIM_FLAG_RX_POSTINC & flags) + { + nrf_twim_rx_list_enable(p_twim); + } + else + { + nrf_twim_rx_list_disable(p_twim); + } +} +__STATIC_INLINE nrfx_err_t twim_xfer(twim_control_block_t * p_cb, + NRF_TWIM_Type * p_twim, + nrfx_twim_xfer_desc_t const * p_xfer_desc, + uint32_t flags) +{ + nrfx_err_t err_code = NRFX_SUCCESS; + nrf_twim_task_t start_task = NRF_TWIM_TASK_STARTTX; + nrf_twim_event_t evt_to_wait = NRF_TWIM_EVENT_STOPPED; + + if (!nrfx_is_in_ram(p_xfer_desc->p_primary_buf)) + { + err_code = NRFX_ERROR_INVALID_ADDR; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + /* Block TWI interrupts to ensure that function is not interrupted by TWI interrupt. */ + nrf_twim_int_disable(p_twim, NRF_TWIM_ALL_INTS_MASK); + if (p_cb->busy) + { + nrf_twim_int_enable(p_twim, p_cb->int_mask); + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + else + { + p_cb->busy = ((NRFX_TWIM_FLAG_NO_XFER_EVT_HANDLER & flags) || + (NRFX_TWIM_FLAG_REPEATED_XFER & flags)) ? false: true; + } + + p_cb->xfer_desc = *p_xfer_desc; + p_cb->repeated = (flags & NRFX_TWIM_FLAG_REPEATED_XFER) ? true : false; + nrf_twim_address_set(p_twim, p_xfer_desc->address); + + nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_STOPPED); + nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_ERROR); + + twim_list_enable_handle(p_twim, flags); + switch (p_xfer_desc->type) + { + case NRFX_TWIM_XFER_TXTX: + NRFX_ASSERT(!(flags & NRFX_TWIM_FLAG_REPEATED_XFER)); + NRFX_ASSERT(!(flags & NRFX_TWIM_FLAG_HOLD_XFER)); + NRFX_ASSERT(!(flags & NRFX_TWIM_FLAG_NO_XFER_EVT_HANDLER)); + if (!nrfx_is_in_ram(p_xfer_desc->p_secondary_buf)) + { + err_code = NRFX_ERROR_INVALID_ADDR; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTTX_SUSPEND_MASK); + nrf_twim_tx_buffer_set(p_twim, p_xfer_desc->p_primary_buf, p_xfer_desc->primary_length); + nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_TXSTARTED); + nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_LASTTX); + nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_SUSPENDED); + nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); + nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_STARTTX); + while (!nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_TXSTARTED)) + {} + NRFX_LOG_DEBUG("TWIM: Event: %s.", EVT_TO_STR_TWIM(NRF_TWIM_EVENT_TXSTARTED)); + nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_TXSTARTED); + nrf_twim_tx_buffer_set(p_twim, p_xfer_desc->p_secondary_buf, p_xfer_desc->secondary_length); + p_cb->int_mask = NRF_TWIM_INT_SUSPENDED_MASK | NRF_TWIM_INT_ERROR_MASK; + break; + case NRFX_TWIM_XFER_TXRX: + nrf_twim_tx_buffer_set(p_twim, p_xfer_desc->p_primary_buf, p_xfer_desc->primary_length); + if (!nrfx_is_in_ram(p_xfer_desc->p_secondary_buf)) + { + err_code = NRFX_ERROR_INVALID_ADDR; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + nrf_twim_rx_buffer_set(p_twim, p_xfer_desc->p_secondary_buf, p_xfer_desc->secondary_length); + nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTTX_STARTRX_MASK | + NRF_TWIM_SHORT_LASTRX_STOP_MASK); + p_cb->int_mask = NRF_TWIM_INT_STOPPED_MASK | NRF_TWIM_INT_ERROR_MASK; + break; + case NRFX_TWIM_XFER_TX: + nrf_twim_tx_buffer_set(p_twim, p_xfer_desc->p_primary_buf, p_xfer_desc->primary_length); + if (NRFX_TWIM_FLAG_TX_NO_STOP & flags) + { + nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTTX_SUSPEND_MASK); + p_cb->int_mask = NRF_TWIM_INT_SUSPENDED_MASK | NRF_TWIM_INT_ERROR_MASK; + nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_SUSPENDED); + evt_to_wait = NRF_TWIM_EVENT_SUSPENDED; + } + else + { + nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTTX_STOP_MASK); + p_cb->int_mask = NRF_TWIM_INT_STOPPED_MASK | NRF_TWIM_INT_ERROR_MASK; + } + nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); + break; + case NRFX_TWIM_XFER_RX: + nrf_twim_rx_buffer_set(p_twim, p_xfer_desc->p_primary_buf, p_xfer_desc->primary_length); + nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTRX_STOP_MASK); + p_cb->int_mask = NRF_TWIM_INT_STOPPED_MASK | NRF_TWIM_INT_ERROR_MASK; + start_task = NRF_TWIM_TASK_STARTRX; + nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); + break; + default: + err_code = NRFX_ERROR_INVALID_PARAM; + break; + } + + if (!(flags & NRFX_TWIM_FLAG_HOLD_XFER) && (p_xfer_desc->type != NRFX_TWIM_XFER_TXTX)) + { + nrf_twim_task_trigger(p_twim, start_task); + } + + if (p_cb->handler) + { + if (flags & NRFX_TWIM_FLAG_NO_XFER_EVT_HANDLER) + { + p_cb->int_mask = NRF_TWIM_INT_ERROR_MASK; + } + nrf_twim_int_enable(p_twim, p_cb->int_mask); + +#if NRFX_CHECK(NRFX_TWIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED) + if ((flags & NRFX_TWIM_FLAG_HOLD_XFER) && ((p_xfer_desc->type == NRFX_TWIM_XFER_TX) || + (p_xfer_desc->type == NRFX_TWIM_XFER_TXRX))) + { + p_cb->flags = flags; + twim_list_enable_handle(p_twim, 0); + p_twim->FREQUENCY = 0; + nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_TXSTARTED); + nrf_twim_int_enable(p_twim, NRF_TWIM_INT_TXSTARTED_MASK); + } +#endif + } + else + { + while (!nrf_twim_event_check(p_twim, evt_to_wait)) + { + if (nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_ERROR)) + { + NRFX_LOG_DEBUG("TWIM: Event: %s.", EVT_TO_STR_TWIM(NRF_TWIM_EVENT_ERROR)); + nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_ERROR); + nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); + nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_STOP); + evt_to_wait = NRF_TWIM_EVENT_STOPPED; + } + } + + uint32_t errorsrc = nrf_twim_errorsrc_get_and_clear(p_twim); + + p_cb->busy = false; + + if (errorsrc) + { + err_code = twi_process_error(errorsrc); + } + } + return err_code; +} + + +nrfx_err_t nrfx_twim_xfer(nrfx_twim_t const * p_instance, + nrfx_twim_xfer_desc_t const * p_xfer_desc, + uint32_t flags) +{ + NRFX_ASSERT(TWIM_LENGTH_VALIDATE(p_instance->drv_inst_idx, + p_xfer_desc->primary_length, + p_xfer_desc->secondary_length)); + + nrfx_err_t err_code = NRFX_SUCCESS; + twim_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + + // TXRX and TXTX transfers are supported only in non-blocking mode. + NRFX_ASSERT( !((p_cb->handler == NULL) && (p_xfer_desc->type == NRFX_TWIM_XFER_TXRX))); + NRFX_ASSERT( !((p_cb->handler == NULL) && (p_xfer_desc->type == NRFX_TWIM_XFER_TXTX))); + + NRFX_LOG_INFO("Transfer type: %s.", TRANSFER_TO_STR(p_xfer_desc->type)); + NRFX_LOG_INFO("Transfer buffers length: primary: %d, secondary: %d.", + p_xfer_desc->primary_length, + p_xfer_desc->secondary_length); + NRFX_LOG_DEBUG("Primary buffer data:"); + NRFX_LOG_HEXDUMP_DEBUG(p_xfer_desc->p_primary_buf, + p_xfer_desc->primary_length * sizeof(p_xfer_desc->p_primary_buf[0])); + NRFX_LOG_DEBUG("Secondary buffer data:"); + NRFX_LOG_HEXDUMP_DEBUG(p_xfer_desc->p_secondary_buf, + p_xfer_desc->secondary_length * sizeof(p_xfer_desc->p_secondary_buf[0])); + + err_code = twim_xfer(p_cb, (NRF_TWIM_Type *)p_instance->p_twim, p_xfer_desc, flags); + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +nrfx_err_t nrfx_twim_tx(nrfx_twim_t const * p_instance, + uint8_t address, + uint8_t const * p_data, + size_t length, + bool no_stop) +{ + nrfx_twim_xfer_desc_t xfer = NRFX_TWIM_XFER_DESC_TX(address, (uint8_t*)p_data, length); + + return nrfx_twim_xfer(p_instance, &xfer, no_stop ? NRFX_TWIM_FLAG_TX_NO_STOP : 0); +} + +nrfx_err_t nrfx_twim_rx(nrfx_twim_t const * p_instance, + uint8_t address, + uint8_t * p_data, + size_t length) +{ + nrfx_twim_xfer_desc_t xfer = NRFX_TWIM_XFER_DESC_RX(address, p_data, length); + return nrfx_twim_xfer(p_instance, &xfer, 0); +} + +uint32_t nrfx_twim_start_task_get(nrfx_twim_t const * p_instance, + nrfx_twim_xfer_type_t xfer_type) +{ + return (uint32_t)nrf_twim_task_address_get(p_instance->p_twim, + (xfer_type != NRFX_TWIM_XFER_RX) ? NRF_TWIM_TASK_STARTTX : NRF_TWIM_TASK_STARTRX); +} + +uint32_t nrfx_twim_stopped_event_get(nrfx_twim_t const * p_instance) +{ + return (uint32_t)nrf_twim_event_address_get(p_instance->p_twim, NRF_TWIM_EVENT_STOPPED); +} + +static void twim_irq_handler(NRF_TWIM_Type * p_twim, twim_control_block_t * p_cb) +{ + +#if NRFX_CHECK(NRFX_TWIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED) + /* Handle only workaround case. Can be used without TWIM handler in IRQs. */ + if (nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_TXSTARTED)) + { + nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_TXSTARTED); + nrf_twim_int_disable(p_twim, NRF_TWIM_INT_TXSTARTED_MASK); + if (p_twim->FREQUENCY == 0) + { + // Set enable to zero to reset TWIM internal state. + nrf_twim_disable(p_twim); + nrf_twim_enable(p_twim); + + // Set proper frequency. + nrf_twim_frequency_set(p_twim, p_cb->bus_frequency); + twim_list_enable_handle(p_twim, p_cb->flags); + + // Start proper transmission. + nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_STARTTX); + return; + } + } +#endif + + NRFX_ASSERT(p_cb->handler); + + if (nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_ERROR)) + { + nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_ERROR); + NRFX_LOG_DEBUG("TWIM: Event: %s.", EVT_TO_STR_TWIM(NRF_TWIM_EVENT_ERROR)); + if (!nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_STOPPED)) + { + nrf_twim_int_disable(p_twim, p_cb->int_mask); + p_cb->int_mask = NRF_TWIM_INT_STOPPED_MASK; + nrf_twim_int_enable(p_twim, p_cb->int_mask); + + nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); + nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_STOP); + return; + } + } + + nrfx_twim_evt_t event; + + if (nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_STOPPED)) + { + NRFX_LOG_DEBUG("TWIM: Event: %s.", EVT_TO_STR_TWIM(NRF_TWIM_EVENT_STOPPED)); + nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_STOPPED); + event.xfer_desc = p_cb->xfer_desc; + if (p_cb->error) + { + + event.xfer_desc.primary_length = (p_cb->xfer_desc.type == NRFX_TWIM_XFER_RX) ? + nrf_twim_rxd_amount_get(p_twim) : nrf_twim_txd_amount_get(p_twim); + event.xfer_desc.secondary_length = (p_cb->xfer_desc.type == NRFX_TWIM_XFER_TXRX) ? + nrf_twim_rxd_amount_get(p_twim) : nrf_twim_txd_amount_get(p_twim); + + } + nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_LASTTX); + nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_LASTRX); + if (!p_cb->repeated || p_cb->error) + { + nrf_twim_shorts_set(p_twim, 0); + p_cb->int_mask = 0; + nrf_twim_int_disable(p_twim, NRF_TWIM_ALL_INTS_MASK); + } + } + else + { + nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_SUSPENDED); + NRFX_LOG_DEBUG("TWIM: Event: %s.", EVT_TO_STR_TWIM(NRF_TWIM_EVENT_SUSPENDED)); + if (p_cb->xfer_desc.type == NRFX_TWIM_XFER_TX) + { + event.xfer_desc = p_cb->xfer_desc; + if (!p_cb->repeated) + { + nrf_twim_shorts_set(p_twim, 0); + p_cb->int_mask = 0; + nrf_twim_int_disable(p_twim, NRF_TWIM_ALL_INTS_MASK); + } + } + else + { + nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTTX_STOP_MASK); + p_cb->int_mask = NRF_TWIM_INT_STOPPED_MASK | NRF_TWIM_INT_ERROR_MASK; + nrf_twim_int_disable(p_twim, NRF_TWIM_ALL_INTS_MASK); + nrf_twim_int_enable(p_twim, p_cb->int_mask); + nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_STARTTX); + nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); + return; + } + } + + uint32_t errorsrc = nrf_twim_errorsrc_get_and_clear(p_twim); + if (errorsrc & NRF_TWIM_ERROR_ADDRESS_NACK) + { + event.type = NRFX_TWIM_EVT_ADDRESS_NACK; + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRFX_TWIM_EVT_ADDRESS_NACK)); + } + else if (errorsrc & NRF_TWIM_ERROR_DATA_NACK) + { + event.type = NRFX_TWIM_EVT_DATA_NACK; + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRFX_TWIM_EVT_DATA_NACK)); + } + else + { + event.type = NRFX_TWIM_EVT_DONE; + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRFX_TWIM_EVT_DONE)); + } + + if (!p_cb->repeated) + { + p_cb->busy = false; + } + p_cb->handler(&event, p_cb->p_context); +} + +#if 0 +#if NRFX_CHECK(NRFX_TWIM0_ENABLED) +void nrfx_twim_0_irq_handler(void) +{ + twim_irq_handler(NRF_TWIM0, &m_cb[NRFX_TWIM0_INST_IDX]); +} +#endif +#endif + +#if 0 +#if NRFX_CHECK(NRFX_TWIM1_ENABLED) +void nrfx_twim_1_irq_handler(void) +{ + twim_irq_handler(NRF_TWIM1, &m_cb[NRFX_TWIM1_INST_IDX]); +} +#endif +#endif + +#endif // NRFX_CHECK(NRFX_TWIM_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_twis.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_twis.c new file mode 100644 index 0000000000..9fb7a4947c --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_twis.c @@ -0,0 +1,834 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_TWIS_ENABLED) + +#if !(NRFX_CHECK(NRFX_TWIS0_ENABLED) || NRFX_CHECK(NRFX_TWIS1_ENABLED)) +#error "No enabled TWIS instances. Check ." +#endif + +#include +#include "prs/nrfx_prs.h" + +#define NRFX_LOG_MODULE TWIS +#include + +#define EVT_TO_STR(event) \ + (event == NRF_TWIS_EVENT_STOPPED ? "NRF_TWIS_EVENT_STOPPED" : \ + (event == NRF_TWIS_EVENT_ERROR ? "NRF_TWIS_EVENT_ERROR" : \ + (event == NRF_TWIS_EVENT_RXSTARTED ? "NRF_TWIS_EVENT_RXSTARTED" : \ + (event == NRF_TWIS_EVENT_TXSTARTED ? "NRF_TWIS_EVENT_TXSTARTED" : \ + (event == NRF_TWIS_EVENT_WRITE ? "NRF_TWIS_EVENT_WRITE" : \ + (event == NRF_TWIS_EVENT_READ ? "NRF_TWIS_EVENT_READ" : \ + "UNKNOWN EVENT")))))) + + +/** + * @brief Actual state of internal state machine + * + * Current substate of powered on state. + */ +typedef enum +{ + NRFX_TWIS_SUBSTATE_IDLE, ///< No ongoing transmission + NRFX_TWIS_SUBSTATE_READ_WAITING, ///< Read request received, waiting for data + NRFX_TWIS_SUBSTATE_READ_PENDING, ///< Reading is actually pending (data sending) + NRFX_TWIS_SUBSTATE_WRITE_WAITING, ///< Write request received, waiting for data buffer + NRFX_TWIS_SUBSTATE_WRITE_PENDING, ///< Writing is actually pending (data receiving) +} nrfx_twis_substate_t; + +// Control block - driver instance local data. +typedef struct +{ + nrfx_twis_event_handler_t ev_handler; + // Internal copy of hardware errors flags merged with specific internal + // driver errors flags. + // This value can be changed in the interrupt and cleared in the main program. + // Always use Atomic load-store when updating this value in main loop. + volatile uint32_t error; + nrfx_drv_state_t state; + volatile nrfx_twis_substate_t substate; + + volatile bool semaphore; +} twis_control_block_t; +static twis_control_block_t m_cb[NRFX_TWIS_ENABLED_COUNT]; + +/** + * @brief Used interrupts mask + * + * Mask for all interrupts used by this library + */ +static const uint32_t m_used_ints_mask = NRF_TWIS_INT_STOPPED_MASK | + NRF_TWIS_INT_ERROR_MASK | + NRF_TWIS_INT_RXSTARTED_MASK | + NRF_TWIS_INT_TXSTARTED_MASK | + NRF_TWIS_INT_WRITE_MASK | + NRF_TWIS_INT_READ_MASK; + +/** + * @brief Clear all events + * + * Function clears all actually pending events + */ +static void nrfx_twis_clear_all_events(NRF_TWIS_Type * const p_reg) +{ + /* Clear all events */ + nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_STOPPED); + nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_ERROR); + nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_RXSTARTED); + nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_TXSTARTED); + nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_WRITE); + nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_READ); +} + +/** + * @brief Reset all the registers to known state + * + * This function clears all registers that requires it to known state. + * TWIS is left disabled after this function. + * All events are cleared. + * @param[out] p_reg TWIS to reset register address + */ +static inline void nrfx_twis_swreset(NRF_TWIS_Type * p_reg) +{ + /* Disable TWIS */ + nrf_twis_disable(p_reg); + + /* Disconnect pins */ + nrf_twis_pins_set(p_reg, ~0U, ~0U); + + /* Disable interrupt global for the instance */ + NRFX_IRQ_DISABLE(nrfx_get_irq_number(p_reg)); + + /* Disable interrupts */ + nrf_twis_int_disable(p_reg, ~0U); +} + +/** + * @brief Configure pin + * + * Function configures selected for work as SDA or SCL. + * @param pin Pin number to configure + */ +static inline void nrfx_twis_config_pin(uint32_t pin, nrf_gpio_pin_pull_t pull) +{ + nrf_gpio_cfg(pin, + NRF_GPIO_PIN_DIR_INPUT, + NRF_GPIO_PIN_INPUT_DISCONNECT, + pull, + NRF_GPIO_PIN_S0D1, + NRF_GPIO_PIN_NOSENSE); +} + +/** + * @brief Auxiliary function for getting event state on right bit possition + * + * This function calls @ref nrf_twis_event_get function but the the result + * is shifted to match INTEN register scheme. + * + * @param[in,out] p_reg TWIS to read event from + * @param ev Event code + * + * @return Selected event state shifted by @ref nrfx_event_to_bitpos + * + * @sa nrf_twis_event_get + * @sa nrfx_event_to_bitpos + */ +static inline uint32_t nrfx_twis_event_bit_get(NRF_TWIS_Type * p_reg, + nrf_twis_event_t ev) +{ + return (uint32_t)nrf_twis_event_get_and_clear(p_reg, ev) << nrfx_event_to_bitpos(ev); +} + +/** + * @brief Auxiliary function for checking event bit inside given flags value + * + * Function used here to check presence of the event inside given flags value. + * It transforms given event to bit possition and then checks if in given variable it is cleared. + * + * @param flags Flags to test + * @param ev Event code + * + * @retval true Flag for selected event is set + * @retval false Flag for selected event is cleared + */ +static inline bool nrfx_twis_check_bit(uint32_t flags, + nrf_twis_event_t ev) +{ + return 0 != (flags & (1U << nrfx_event_to_bitpos(ev))); +} + +/** + * @brief Auxiliary function for clearing event bit in given flags value + * + * Function used to clear selected event bit. + * + * @param flags Flags to process + * @param ev Event code to clear + * + * @return Value @em flags with cleared event bit that matches given @em ev + */ +static inline uint32_t nrfx_twis_clear_bit(uint32_t flags, + nrf_twis_event_t ev) +{ + return flags & ~(1U << nrfx_event_to_bitpos(ev)); +} + +static void call_event_handler(twis_control_block_t const * p_cb, + nrfx_twis_evt_t const * p_evt) +{ + nrfx_twis_event_handler_t handler = p_cb->ev_handler; + if (handler != NULL) + { + handler(p_evt); + } +} + +/** + * @brief Auxiliary function for error processing + * + * Function called when in current substate the event apears and it cannot be processed. + * It should be called also on ERROR event. + * If given @em error parameter has zero value the @ref NRFX_TWIS_ERROR_UNEXPECTED_EVENT + * would be set. + * + * @param p_cb Pointer to the driver instance control block. + * @param evt What error event raport to event handler + * @param error Error flags + */ +static inline void nrfx_twis_process_error(twis_control_block_t * p_cb, + nrfx_twis_evt_type_t evt, + uint32_t error) +{ + if (0 == error) + { + error = NRFX_TWIS_ERROR_UNEXPECTED_EVENT; + } + nrfx_twis_evt_t evdata; + evdata.type = evt; + evdata.data.error = error; + + p_cb->error |= error; + + call_event_handler(p_cb, &evdata); +} + +static void nrfx_twis_state_machine(NRF_TWIS_Type * p_reg, + twis_control_block_t * p_cb) +{ + if (!NRFX_TWIS_NO_SYNC_MODE) + { + /* Exclude parallel processing of this function */ + if (p_cb->semaphore) + { + return; + } + p_cb->semaphore = 1; + } + + /* Event data structure to be passed into event handler */ + nrfx_twis_evt_t evdata; + /* Current substate copy */ + nrfx_twis_substate_t substate = p_cb->substate; + /* Event flags */ + uint32_t ev = 0; + + /* Get all events */ + ev |= nrfx_twis_event_bit_get(p_reg, NRF_TWIS_EVENT_STOPPED); + ev |= nrfx_twis_event_bit_get(p_reg, NRF_TWIS_EVENT_ERROR); + ev |= nrfx_twis_event_bit_get(p_reg, NRF_TWIS_EVENT_RXSTARTED); + ev |= nrfx_twis_event_bit_get(p_reg, NRF_TWIS_EVENT_TXSTARTED); + ev |= nrfx_twis_event_bit_get(p_reg, NRF_TWIS_EVENT_WRITE); + ev |= nrfx_twis_event_bit_get(p_reg, NRF_TWIS_EVENT_READ); + + /* State machine */ + while (0 != ev) + { + switch (substate) + { + case NRFX_TWIS_SUBSTATE_IDLE: + if (nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_STOPPED)) + { + /* Stopped event is always allowed in IDLE state - just ignore */ + ev = nrfx_twis_clear_bit(ev, NRF_TWIS_EVENT_STOPPED); + } + else if (nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_READ)) + { + evdata.type = NRFX_TWIS_EVT_READ_REQ; + if (nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_TXSTARTED)) + { + substate = NRFX_TWIS_SUBSTATE_READ_PENDING; + evdata.data.buf_req = false; + } + else + { + substate = NRFX_TWIS_SUBSTATE_READ_WAITING; + evdata.data.buf_req = true; + } + call_event_handler(p_cb, &evdata); + ev = nrfx_twis_clear_bit(ev, NRF_TWIS_EVENT_READ); + ev = nrfx_twis_clear_bit(ev, NRF_TWIS_EVENT_TXSTARTED); + ev = nrfx_twis_clear_bit(ev, NRF_TWIS_EVENT_WRITE); + ev = nrfx_twis_clear_bit(ev, NRF_TWIS_EVENT_RXSTARTED); + } + else if (nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_WRITE)) + { + evdata.type = NRFX_TWIS_EVT_WRITE_REQ; + if (nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_RXSTARTED)) + { + substate = NRFX_TWIS_SUBSTATE_WRITE_PENDING; + evdata.data.buf_req = false; + } + else + { + substate = NRFX_TWIS_SUBSTATE_WRITE_WAITING; + evdata.data.buf_req = true; + } + call_event_handler(p_cb, &evdata); + ev = nrfx_twis_clear_bit(ev, NRF_TWIS_EVENT_READ); + ev = nrfx_twis_clear_bit(ev, NRF_TWIS_EVENT_TXSTARTED); + ev = nrfx_twis_clear_bit(ev, NRF_TWIS_EVENT_WRITE); + ev = nrfx_twis_clear_bit(ev, NRF_TWIS_EVENT_RXSTARTED); + } + else + { + nrfx_twis_process_error(p_cb, + NRFX_TWIS_EVT_GENERAL_ERROR, + nrf_twis_error_source_get_and_clear(p_reg)); + ev = 0; + } + break; + case NRFX_TWIS_SUBSTATE_READ_WAITING: + if (nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_TXSTARTED) || + nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_WRITE) || + nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_READ) || + nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_STOPPED)) + { + substate = NRFX_TWIS_SUBSTATE_READ_PENDING; + /* Any other bits requires further processing in PENDING substate */ + ev = nrfx_twis_clear_bit(ev, NRF_TWIS_EVENT_TXSTARTED); + } + else + { + nrfx_twis_process_error(p_cb, + NRFX_TWIS_EVT_READ_ERROR, + nrf_twis_error_source_get_and_clear(p_reg)); + substate = NRFX_TWIS_SUBSTATE_IDLE; + ev = 0; + } + break; + case NRFX_TWIS_SUBSTATE_READ_PENDING: + if (nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_WRITE) || + nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_READ) || + nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_STOPPED)) + { + evdata.type = NRFX_TWIS_EVT_READ_DONE; + evdata.data.tx_amount = nrf_twis_tx_amount_get(p_reg); + NRFX_LOG_INFO("Transfer tx_len:%d", evdata.data.tx_amount); + NRFX_LOG_DEBUG("Tx data:"); + NRFX_LOG_HEXDUMP_DEBUG((uint8_t const *)p_reg->TXD.PTR, + evdata.data.tx_amount * sizeof(uint8_t)); + call_event_handler(p_cb, &evdata); + /* Go to idle and repeat the state machine if READ or WRITE events detected. + * This time READ or WRITE would be started */ + substate = NRFX_TWIS_SUBSTATE_IDLE; + ev = nrfx_twis_clear_bit(ev, NRF_TWIS_EVENT_STOPPED); + } + else + { + nrfx_twis_process_error(p_cb, + NRFX_TWIS_EVT_READ_ERROR, + nrf_twis_error_source_get_and_clear(p_reg)); + substate = NRFX_TWIS_SUBSTATE_IDLE; + ev = 0; + } + break; + case NRFX_TWIS_SUBSTATE_WRITE_WAITING: + if (nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_RXSTARTED) || + nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_WRITE) || + nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_READ) || + nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_STOPPED)) + { + substate = NRFX_TWIS_SUBSTATE_WRITE_PENDING; + /* Any other bits requires further processing in PENDING substate */ + ev = nrfx_twis_clear_bit(ev, NRF_TWIS_EVENT_RXSTARTED); + } + else + { + nrfx_twis_process_error(p_cb, + NRFX_TWIS_EVT_WRITE_ERROR, + nrf_twis_error_source_get_and_clear(p_reg)); + substate = NRFX_TWIS_SUBSTATE_IDLE; + ev = 0; + } + break; + case NRFX_TWIS_SUBSTATE_WRITE_PENDING: + if (nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_WRITE) || + nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_READ) || + nrfx_twis_check_bit(ev, NRF_TWIS_EVENT_STOPPED)) + { + evdata.type = NRFX_TWIS_EVT_WRITE_DONE; + evdata.data.rx_amount = nrf_twis_rx_amount_get(p_reg); + call_event_handler(p_cb, &evdata); + /* Go to idle and repeat the state machine if READ or WRITE events detected. + * This time READ or WRITE would be started */ + substate = NRFX_TWIS_SUBSTATE_IDLE; + ev = nrfx_twis_clear_bit(ev, NRF_TWIS_EVENT_STOPPED); + } + else + { + nrfx_twis_process_error(p_cb, + NRFX_TWIS_EVT_WRITE_ERROR, + nrf_twis_error_source_get_and_clear(p_reg)); + substate = NRFX_TWIS_SUBSTATE_IDLE; + ev = 0; + } + break; + default: + substate = NRFX_TWIS_SUBSTATE_IDLE; + /* Do not clear any events and repeat the machine */ + break; + } + } + + p_cb->substate = substate; + if (!NRFX_TWIS_NO_SYNC_MODE) + { + p_cb->semaphore = 0; + } +} + + +static inline void nrfx_twis_preprocess_status(nrfx_twis_t const * p_instance) +{ + if (!NRFX_TWIS_NO_SYNC_MODE) + { + NRF_TWIS_Type * p_reg = p_instance->p_reg; + twis_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + if (NULL == p_cb->ev_handler) + { + nrfx_twis_state_machine(p_reg, p_cb); + } + } +} + + +/* ------------------------------------------------------------------------- + * Implementation of interface functions + * + */ + + +nrfx_err_t nrfx_twis_init(nrfx_twis_t const * p_instance, + nrfx_twis_config_t const * p_config, + nrfx_twis_event_handler_t event_handler) +{ + NRFX_ASSERT(p_config); + NRFX_ASSERT(p_config->scl != p_config->sda); + nrfx_err_t err_code; + + NRF_TWIS_Type * p_reg = p_instance->p_reg; + twis_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + + if (p_cb->state != NRFX_DRV_STATE_UNINITIALIZED) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + static nrfx_irq_handler_t const irq_handlers[NRFX_TWIS_ENABLED_COUNT] = { + #if NRFX_CHECK(NRFX_TWIS0_ENABLED) + nrfx_twis_0_irq_handler, + #endif + #if NRFX_CHECK(NRFX_TWIS1_ENABLED) + nrfx_twis_1_irq_handler, + #endif + }; + if (nrfx_prs_acquire(p_reg, + irq_handlers[p_instance->drv_inst_idx]) != NRFX_SUCCESS) + { + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } +#endif // NRFX_CHECK(NRFX_PRS_ENABLED) + + if (!NRFX_TWIS_ASSUME_INIT_AFTER_RESET_ONLY) + { + nrfx_twis_swreset(p_reg); + } + + nrfx_twis_config_pin(p_config->scl, p_config->scl_pull); + nrfx_twis_config_pin(p_config->sda, p_config->sda_pull); + + nrf_twis_config_addr_mask_t addr_mask = (nrf_twis_config_addr_mask_t)0; + if (0 == (p_config->addr[0] | p_config->addr[1])) + { + addr_mask = NRF_TWIS_CONFIG_ADDRESS0_MASK; + } + else + { + if (0 != p_config->addr[0]) + { + addr_mask |= NRF_TWIS_CONFIG_ADDRESS0_MASK; + } + if (0 != p_config->addr[1]) + { + addr_mask |= NRF_TWIS_CONFIG_ADDRESS1_MASK; + } + } + + /* Peripheral interrupt configure + * (note - interrupts still needs to be configured in INTEN register. + * This is done in enable function) */ + NRFX_IRQ_PRIORITY_SET(nrfx_get_irq_number(p_reg), + p_config->interrupt_priority); + NRFX_IRQ_ENABLE(nrfx_get_irq_number(p_reg)); + + /* Configure */ + nrf_twis_pins_set (p_reg, p_config->scl, p_config->sda); + nrf_twis_address_set (p_reg, 0, p_config->addr[0]); + nrf_twis_address_set (p_reg, 1, p_config->addr[1]); + nrf_twis_config_address_set(p_reg, addr_mask); + + /* Clear semaphore */ + if (!NRFX_TWIS_NO_SYNC_MODE) + { + p_cb->semaphore = 0; + } + /* Set internal instance variables */ + p_cb->substate = NRFX_TWIS_SUBSTATE_IDLE; + p_cb->ev_handler = event_handler; + p_cb->state = NRFX_DRV_STATE_INITIALIZED; + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + + +void nrfx_twis_uninit(nrfx_twis_t const * p_instance) +{ + NRF_TWIS_Type * p_reg = p_instance->p_reg; + twis_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); + + TWIS_PSEL_Type psel = p_reg->PSEL; + + nrfx_twis_swreset(p_reg); + + /* Clear pins state if */ + if (!(TWIS_PSEL_SCL_CONNECT_Msk & psel.SCL)) + { + nrf_gpio_cfg_default(psel.SCL); + } + if (!(TWIS_PSEL_SDA_CONNECT_Msk & psel.SDA)) + { + nrf_gpio_cfg_default(psel.SDA); + } + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + nrfx_prs_release(p_reg); +#endif + + /* Clear variables */ + p_cb->ev_handler = NULL; + p_cb->state = NRFX_DRV_STATE_UNINITIALIZED; +} + + +void nrfx_twis_enable(nrfx_twis_t const * p_instance) +{ + NRF_TWIS_Type * p_reg = p_instance->p_reg; + twis_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state == NRFX_DRV_STATE_INITIALIZED); + + nrfx_twis_clear_all_events(p_reg); + + /* Enable interrupts */ + if (NULL != p_cb->ev_handler) + { + nrf_twis_int_enable(p_reg, m_used_ints_mask); + } + + nrf_twis_enable(p_reg); + p_cb->error = 0; + p_cb->state = NRFX_DRV_STATE_POWERED_ON; + p_cb->substate = NRFX_TWIS_SUBSTATE_IDLE; +} + + +void nrfx_twis_disable(nrfx_twis_t const * p_instance) +{ + NRF_TWIS_Type * p_reg = p_instance->p_reg; + twis_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state != NRFX_DRV_STATE_UNINITIALIZED); + + nrf_twis_int_disable(p_reg, m_used_ints_mask); + + nrf_twis_disable(p_reg); + p_cb->state = NRFX_DRV_STATE_INITIALIZED; +} + +/* ARM recommends not using the LDREX and STREX instructions in C code. + * This is because the compiler might generate loads and stores between + * LDREX and STREX, potentially clearing the exclusive monitor set by LDREX. + * This recommendation also applies to the byte, halfword, and doubleword + * variants LDREXB, STREXB, LDREXH, STREXH, LDREXD, and STREXD. + * + * This is the reason for the function below to be implemented in assembly. + */ +//lint -save -e578 +#if defined (__CC_ARM ) +static __ASM uint32_t nrfx_twis_error_get_and_clear_internal(uint32_t volatile * perror) +{ + mov r3, r0 + mov r1, #0 +nrfx_twis_error_get_and_clear_internal_try + ldrex r0, [r3] + strex r2, r1, [r3] + cmp r2, r1 /* did this succeed? */ + bne nrfx_twis_error_get_and_clear_internal_try /* no - try again */ + bx lr +} +#elif defined ( __GNUC__ ) +static uint32_t nrfx_twis_error_get_and_clear_internal(uint32_t volatile * perror) +{ + uint32_t ret; + uint32_t temp; + __ASM volatile( + " .syntax unified \n" + "nrfx_twis_error_get_and_clear_internal_try: \n" + " ldrex %[ret], [%[perror]] \n" + " strex %[temp], %[zero], [%[perror]] \n" + " cmp %[temp], %[zero] \n" + " bne nrfx_twis_error_get_and_clear_internal_try \n" + : /* Output */ + [ret]"=&l"(ret), + [temp]"=&l"(temp) + : /* Input */ + [zero]"l"(0), + [perror]"l"(perror) + ); + (void)temp; + return ret; +} +#elif defined ( __ICCARM__ ) +static uint32_t nrfx_twis_error_get_and_clear_internal(uint32_t volatile * perror) +{ + uint32_t ret; + uint32_t temp; + __ASM volatile( + "1: \n" + " ldrex %[ret], [%[perror]] \n" + " strex %[temp], %[zero], [%[perror]] \n" + " cmp %[temp], %[zero] \n" + " bne.n 1b \n" + : /* Output */ + [ret]"=&l"(ret), + [temp]"=&l"(temp) + : /* Input */ + [zero]"l"(0), + [perror]"l"(perror) + ); + (void)temp; + return ret; +} +#else + #error Unknown compiler +#endif +//lint -restore + +uint32_t nrfx_twis_error_get_and_clear(nrfx_twis_t const * p_instance) +{ + nrfx_twis_preprocess_status(p_instance); + /* Make sure that access to error member is atomic + * so there is no bit that is cleared if it is not copied to local variable already. */ + twis_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + return nrfx_twis_error_get_and_clear_internal(&p_cb->error); +} + + +nrfx_err_t nrfx_twis_tx_prepare(nrfx_twis_t const * p_instance, + void const * p_buf, + size_t size) +{ + nrfx_err_t err_code; + twis_control_block_t const * p_cb = &m_cb[p_instance->drv_inst_idx]; + + /* Check power state*/ + if (p_cb->state != NRFX_DRV_STATE_POWERED_ON) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + /* Check data address */ + if (!nrfx_is_in_ram(p_buf)) + { + err_code = NRFX_ERROR_INVALID_ADDR; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + /* Check data size */ + if ((size & TWIS_TXD_MAXCNT_MAXCNT_Msk) != size) + { + err_code = NRFX_ERROR_INVALID_LENGTH; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + nrf_twis_tx_prepare(p_instance->p_reg, + (uint8_t const *)p_buf, + (nrf_twis_amount_t)size); + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + + +nrfx_err_t nrfx_twis_rx_prepare(nrfx_twis_t const * p_instance, + void * p_buf, + size_t size) +{ + nrfx_err_t err_code; + twis_control_block_t const * p_cb = &m_cb[p_instance->drv_inst_idx]; + + /* Check power state*/ + if (p_cb->state != NRFX_DRV_STATE_POWERED_ON) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + /* Check data address */ + if (!nrfx_is_in_ram(p_buf)) + { + err_code = NRFX_ERROR_INVALID_ADDR; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + /* Check data size */ + if ((size & TWIS_RXD_MAXCNT_MAXCNT_Msk) != size) + { + err_code = NRFX_ERROR_INVALID_LENGTH; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + nrf_twis_rx_prepare(p_instance->p_reg, + (uint8_t *)p_buf, + (nrf_twis_amount_t)size); + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + + +bool nrfx_twis_is_busy(nrfx_twis_t const * p_instance) +{ + nrfx_twis_preprocess_status(p_instance); + twis_control_block_t const * p_cb = &m_cb[p_instance->drv_inst_idx]; + return NRFX_TWIS_SUBSTATE_IDLE != p_cb->substate; +} + +bool nrfx_twis_is_waiting_tx_buff(nrfx_twis_t const * p_instance) +{ + nrfx_twis_preprocess_status(p_instance); + twis_control_block_t const * p_cb = &m_cb[p_instance->drv_inst_idx]; + return NRFX_TWIS_SUBSTATE_READ_WAITING == p_cb->substate; +} + +bool nrfx_twis_is_waiting_rx_buff(nrfx_twis_t const * p_instance) +{ + nrfx_twis_preprocess_status(p_instance); + twis_control_block_t const * p_cb = &m_cb[p_instance->drv_inst_idx]; + return NRFX_TWIS_SUBSTATE_WRITE_WAITING == p_cb->substate; +} + +bool nrfx_twis_is_pending_tx(nrfx_twis_t const * p_instance) +{ + nrfx_twis_preprocess_status(p_instance); + twis_control_block_t const * p_cb = &m_cb[p_instance->drv_inst_idx]; + return NRFX_TWIS_SUBSTATE_READ_PENDING == p_cb->substate; +} + +bool nrfx_twis_is_pending_rx(nrfx_twis_t const * p_instance) +{ + nrfx_twis_preprocess_status(p_instance); + twis_control_block_t const * p_cb = &m_cb[p_instance->drv_inst_idx]; + return NRFX_TWIS_SUBSTATE_WRITE_PENDING == p_cb->substate; +} + + +#if NRFX_CHECK(NRFX_TWIS0_ENABLED) +void nrfx_twis_0_irq_handler(void) +{ + nrfx_twis_state_machine(NRF_TWIS0, &m_cb[NRFX_TWIS0_INST_IDX]); +} +#endif + +#if NRFX_CHECK(NRFX_TWIS1_ENABLED) +void nrfx_twis_1_irq_handler(void) +{ + nrfx_twis_state_machine(NRF_TWIS1, &m_cb[NRFX_TWIS1_INST_IDX]); +} +#endif + +#endif // NRFX_CHECK(NRFX_TWIS_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_uart.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_uart.c new file mode 100644 index 0000000000..8c5f487f89 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_uart.c @@ -0,0 +1,649 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_UART_ENABLED) + +#if !NRFX_CHECK(NRFX_UART0_ENABLED) +#error "No enabled UART instances. Check ." +#endif + +#include +#include "prs/nrfx_prs.h" +#include + +#define NRFX_LOG_MODULE UART +#include + +#define EVT_TO_STR(event) \ + (event == NRF_UART_EVENT_ERROR ? "NRF_UART_EVENT_ERROR" : \ + "UNKNOWN EVENT") + + +#define TX_COUNTER_ABORT_REQ_VALUE UINT32_MAX + +typedef struct +{ + void * p_context; + nrfx_uart_event_handler_t handler; + uint8_t const * p_tx_buffer; + uint8_t * p_rx_buffer; + uint8_t * p_rx_secondary_buffer; + size_t tx_buffer_length; + size_t rx_buffer_length; + size_t rx_secondary_buffer_length; + volatile size_t tx_counter; + volatile size_t rx_counter; + volatile bool tx_abort; + bool rx_enabled; + nrfx_drv_state_t state; +} uart_control_block_t; +static uart_control_block_t m_cb[NRFX_UART_ENABLED_COUNT]; + +static void apply_config(nrfx_uart_t const * p_instance, + nrfx_uart_config_t const * p_config) +{ + if (p_config->pseltxd != NRF_UART_PSEL_DISCONNECTED) + { + nrf_gpio_pin_set(p_config->pseltxd); + nrf_gpio_cfg_output(p_config->pseltxd); + } + if (p_config->pselrxd != NRF_UART_PSEL_DISCONNECTED) + { + nrf_gpio_cfg_input(p_config->pselrxd, NRF_GPIO_PIN_NOPULL); + } + + nrf_uart_baudrate_set(p_instance->p_reg, p_config->baudrate); + nrf_uart_configure(p_instance->p_reg, p_config->parity, p_config->hwfc); + nrf_uart_txrx_pins_set(p_instance->p_reg, p_config->pseltxd, p_config->pselrxd); + if (p_config->hwfc == NRF_UART_HWFC_ENABLED) + { + if (p_config->pselcts != NRF_UART_PSEL_DISCONNECTED) + { + nrf_gpio_cfg_input(p_config->pselcts, NRF_GPIO_PIN_NOPULL); + } + if (p_config->pselrts != NRF_UART_PSEL_DISCONNECTED) + { + nrf_gpio_pin_set(p_config->pselrts); + nrf_gpio_cfg_output(p_config->pselrts); + } + nrf_uart_hwfc_pins_set(p_instance->p_reg, p_config->pselrts, p_config->pselcts); + } +} + +static void interrupts_enable(nrfx_uart_t const * p_instance, + uint8_t interrupt_priority) +{ + nrf_uart_event_clear(p_instance->p_reg, NRF_UART_EVENT_TXDRDY); + nrf_uart_event_clear(p_instance->p_reg, NRF_UART_EVENT_RXTO); + nrf_uart_int_enable(p_instance->p_reg, NRF_UART_INT_MASK_TXDRDY | + NRF_UART_INT_MASK_RXTO); + NRFX_IRQ_PRIORITY_SET(nrfx_get_irq_number((void *)p_instance->p_reg), + interrupt_priority); + NRFX_IRQ_ENABLE(nrfx_get_irq_number((void *)p_instance->p_reg)); +} + +static void interrupts_disable(nrfx_uart_t const * p_instance) +{ + nrf_uart_int_disable(p_instance->p_reg, NRF_UART_INT_MASK_RXDRDY | + NRF_UART_INT_MASK_TXDRDY | + NRF_UART_INT_MASK_ERROR | + NRF_UART_INT_MASK_RXTO); + NRFX_IRQ_DISABLE(nrfx_get_irq_number((void *)p_instance->p_reg)); +} + +static void pins_to_default(nrfx_uart_t const * p_instance) +{ + /* Reset pins to default states */ + uint32_t txd; + uint32_t rxd; + uint32_t rts; + uint32_t cts; + + txd = nrf_uart_tx_pin_get(p_instance->p_reg); + rxd = nrf_uart_rx_pin_get(p_instance->p_reg); + rts = nrf_uart_rts_pin_get(p_instance->p_reg); + cts = nrf_uart_cts_pin_get(p_instance->p_reg); + nrf_uart_txrx_pins_disconnect(p_instance->p_reg); + nrf_uart_hwfc_pins_disconnect(p_instance->p_reg); + + if (txd != NRF_UART_PSEL_DISCONNECTED) + { + nrf_gpio_cfg_default(txd); + } + if (rxd != NRF_UART_PSEL_DISCONNECTED) + { + nrf_gpio_cfg_default(rxd); + } + if (cts != NRF_UART_PSEL_DISCONNECTED) + { + nrf_gpio_cfg_default(cts); + } + if (rts != NRF_UART_PSEL_DISCONNECTED) + { + nrf_gpio_cfg_default(rts); + } +} + +nrfx_err_t nrfx_uart_init(nrfx_uart_t const * p_instance, + nrfx_uart_config_t const * p_config, + nrfx_uart_event_handler_t event_handler) +{ + NRFX_ASSERT(p_config); + uart_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + nrfx_err_t err_code = NRFX_SUCCESS; + + if (p_cb->state != NRFX_DRV_STATE_UNINITIALIZED) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + static nrfx_irq_handler_t const irq_handlers[NRFX_UART_ENABLED_COUNT] = { + #if NRFX_CHECK(NRFX_UART0_ENABLED) + nrfx_uart_0_irq_handler, + #endif + }; + if (nrfx_prs_acquire(p_instance->p_reg, + irq_handlers[p_instance->drv_inst_idx]) != NRFX_SUCCESS) + { + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } +#endif // NRFX_CHECK(NRFX_PRS_ENABLED) + + apply_config(p_instance, p_config); + + p_cb->handler = event_handler; + p_cb->p_context = p_config->p_context; + + if (p_cb->handler) + { + interrupts_enable(p_instance, p_config->interrupt_priority); + } + + nrf_uart_enable(p_instance->p_reg); + p_cb->rx_buffer_length = 0; + p_cb->rx_secondary_buffer_length = 0; + p_cb->rx_enabled = false; + p_cb->tx_buffer_length = 0; + p_cb->state = NRFX_DRV_STATE_INITIALIZED; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +void nrfx_uart_uninit(nrfx_uart_t const * p_instance) +{ + uart_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + + nrf_uart_disable(p_instance->p_reg); + + if (p_cb->handler) + { + interrupts_disable(p_instance); + } + + pins_to_default(p_instance); + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + nrfx_prs_release(p_instance->p_reg); +#endif + + p_cb->state = NRFX_DRV_STATE_UNINITIALIZED; + p_cb->handler = NULL; + NRFX_LOG_INFO("Instance uninitialized: %d.", p_instance->drv_inst_idx); +} + +static void tx_byte(NRF_UART_Type * p_uart, uart_control_block_t * p_cb) +{ + nrf_uart_event_clear(p_uart, NRF_UART_EVENT_TXDRDY); + uint8_t txd = p_cb->p_tx_buffer[p_cb->tx_counter]; + p_cb->tx_counter++; + nrf_uart_txd_set(p_uart, txd); +} + +static bool tx_blocking(NRF_UART_Type * p_uart, uart_control_block_t * p_cb) +{ + while (p_cb->tx_counter < p_cb->tx_buffer_length) + { + // Wait until the transmitter is ready to accept a new byte. + // Exit immediately if the transfer has been aborted. + while (!nrf_uart_event_check(p_uart, NRF_UART_EVENT_TXDRDY)) + { + if (p_cb->tx_abort) + { + return false; + } + } + + tx_byte(p_uart, p_cb); + } + + return true; +} + +nrfx_err_t nrfx_uart_tx(nrfx_uart_t const * p_instance, + uint8_t const * p_data, + size_t length) +{ + uart_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state == NRFX_DRV_STATE_INITIALIZED); + NRFX_ASSERT(p_data); + NRFX_ASSERT(length > 0); + + nrfx_err_t err_code; + + if (nrfx_uart_tx_in_progress(p_instance)) + { + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + p_cb->tx_buffer_length = length; + p_cb->p_tx_buffer = p_data; + p_cb->tx_counter = 0; + p_cb->tx_abort = false; + + NRFX_LOG_INFO("Transfer tx_len: %d.", p_cb->tx_buffer_length); + NRFX_LOG_DEBUG("Tx data:"); + NRFX_LOG_HEXDUMP_DEBUG(p_cb->p_tx_buffer, + p_cb->tx_buffer_length * sizeof(p_cb->p_tx_buffer[0])); + + err_code = NRFX_SUCCESS; + + nrf_uart_event_clear(p_instance->p_reg, NRF_UART_EVENT_TXDRDY); + nrf_uart_task_trigger(p_instance->p_reg, NRF_UART_TASK_STARTTX); + + tx_byte(p_instance->p_reg, p_cb); + + if (p_cb->handler == NULL) + { + if (!tx_blocking(p_instance->p_reg, p_cb)) + { + // The transfer has been aborted. + err_code = NRFX_ERROR_FORBIDDEN; + } + else + { + // Wait until the last byte is completely transmitted. + while (!nrf_uart_event_check(p_instance->p_reg, NRF_UART_EVENT_TXDRDY)) + {} + nrf_uart_task_trigger(p_instance->p_reg, NRF_UART_TASK_STOPTX); + } + p_cb->tx_buffer_length = 0; + } + + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +bool nrfx_uart_tx_in_progress(nrfx_uart_t const * p_instance) +{ + return (m_cb[p_instance->drv_inst_idx].tx_buffer_length != 0); +} + +static void rx_enable(nrfx_uart_t const * p_instance) +{ + nrf_uart_event_clear(p_instance->p_reg, NRF_UART_EVENT_ERROR); + nrf_uart_event_clear(p_instance->p_reg, NRF_UART_EVENT_RXDRDY); + nrf_uart_task_trigger(p_instance->p_reg, NRF_UART_TASK_STARTRX); +} + +static void rx_byte(NRF_UART_Type * p_uart, uart_control_block_t * p_cb) +{ + if (!p_cb->rx_buffer_length) + { + nrf_uart_event_clear(p_uart, NRF_UART_EVENT_RXDRDY); + // Byte received when buffer is not set - data lost. + (void) nrf_uart_rxd_get(p_uart); + return; + } + nrf_uart_event_clear(p_uart, NRF_UART_EVENT_RXDRDY); + p_cb->p_rx_buffer[p_cb->rx_counter] = nrf_uart_rxd_get(p_uart); + p_cb->rx_counter++; +} + +nrfx_err_t nrfx_uart_rx(nrfx_uart_t const * p_instance, + uint8_t * p_data, + size_t length) +{ + uart_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + + NRFX_ASSERT(m_cb[p_instance->drv_inst_idx].state == NRFX_DRV_STATE_INITIALIZED); + NRFX_ASSERT(p_data); + NRFX_ASSERT(length > 0); + + nrfx_err_t err_code; + + bool second_buffer = false; + + if (p_cb->handler) + { + nrf_uart_int_disable(p_instance->p_reg, NRF_UART_INT_MASK_RXDRDY | + NRF_UART_INT_MASK_ERROR); + } + if (p_cb->rx_buffer_length != 0) + { + if (p_cb->rx_secondary_buffer_length != 0) + { + if (p_cb->handler) + { + nrf_uart_int_enable(p_instance->p_reg, NRF_UART_INT_MASK_RXDRDY | + NRF_UART_INT_MASK_ERROR); + } + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + second_buffer = true; + } + + if (!second_buffer) + { + p_cb->rx_buffer_length = length; + p_cb->p_rx_buffer = p_data; + p_cb->rx_counter = 0; + p_cb->rx_secondary_buffer_length = 0; + } + else + { + p_cb->p_rx_secondary_buffer = p_data; + p_cb->rx_secondary_buffer_length = length; + } + + NRFX_LOG_INFO("Transfer rx_len: %d.", length); + + if ((!p_cb->rx_enabled) && (!second_buffer)) + { + rx_enable(p_instance); + } + + if (p_cb->handler == NULL) + { + nrf_uart_event_clear(p_instance->p_reg, NRF_UART_EVENT_RXTO); + + bool rxrdy; + bool rxto; + bool error; + do + { + do + { + error = nrf_uart_event_check(p_instance->p_reg, NRF_UART_EVENT_ERROR); + rxrdy = nrf_uart_event_check(p_instance->p_reg, NRF_UART_EVENT_RXDRDY); + rxto = nrf_uart_event_check(p_instance->p_reg, NRF_UART_EVENT_RXTO); + } while ((!rxrdy) && (!rxto) && (!error)); + + if (error || rxto) + { + break; + } + rx_byte(p_instance->p_reg, p_cb); + } while (p_cb->rx_buffer_length > p_cb->rx_counter); + + p_cb->rx_buffer_length = 0; + if (error) + { + err_code = NRFX_ERROR_INTERNAL; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + if (rxto) + { + err_code = NRFX_ERROR_FORBIDDEN; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + if (p_cb->rx_enabled) + { + nrf_uart_task_trigger(p_instance->p_reg, NRF_UART_TASK_STARTRX); + } + else + { + // Skip stopping RX if driver is forced to be enabled. + nrf_uart_task_trigger(p_instance->p_reg, NRF_UART_TASK_STOPRX); + } + } + else + { + nrf_uart_int_enable(p_instance->p_reg, NRF_UART_INT_MASK_RXDRDY | + NRF_UART_INT_MASK_ERROR); + } + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +bool nrfx_uart_rx_ready(nrfx_uart_t const * p_instance) +{ + return nrf_uart_event_check(p_instance->p_reg, NRF_UART_EVENT_RXDRDY); +} + +void nrfx_uart_rx_enable(nrfx_uart_t const * p_instance) +{ + if (!m_cb[p_instance->drv_inst_idx].rx_enabled) + { + rx_enable(p_instance); + m_cb[p_instance->drv_inst_idx].rx_enabled = true; + } +} + +void nrfx_uart_rx_disable(nrfx_uart_t const * p_instance) +{ + nrf_uart_task_trigger(p_instance->p_reg, NRF_UART_TASK_STOPRX); + m_cb[p_instance->drv_inst_idx].rx_enabled = false; +} + +uint32_t nrfx_uart_errorsrc_get(nrfx_uart_t const * p_instance) +{ + nrf_uart_event_clear(p_instance->p_reg, NRF_UART_EVENT_ERROR); + return nrf_uart_errorsrc_get_and_clear(p_instance->p_reg); +} + +static void rx_done_event(uart_control_block_t * p_cb, + size_t bytes, + uint8_t * p_data) +{ + nrfx_uart_event_t event; + + event.type = NRFX_UART_EVT_RX_DONE; + event.data.rxtx.bytes = bytes; + event.data.rxtx.p_data = p_data; + + p_cb->handler(&event, p_cb->p_context); +} + +static void tx_done_event(uart_control_block_t * p_cb, + size_t bytes) +{ + nrfx_uart_event_t event; + + event.type = NRFX_UART_EVT_TX_DONE; + event.data.rxtx.bytes = bytes; + event.data.rxtx.p_data = (uint8_t *)p_cb->p_tx_buffer; + + p_cb->tx_buffer_length = 0; + + p_cb->handler(&event, p_cb->p_context); +} + +void nrfx_uart_tx_abort(nrfx_uart_t const * p_instance) +{ + uart_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + + p_cb->tx_abort = true; + nrf_uart_task_trigger(p_instance->p_reg, NRF_UART_TASK_STOPTX); + if (p_cb->handler) + { + tx_done_event(p_cb, p_cb->tx_counter); + } + + NRFX_LOG_INFO("TX transaction aborted."); +} + +void nrfx_uart_rx_abort(nrfx_uart_t const * p_instance) +{ + nrf_uart_int_disable(p_instance->p_reg, NRF_UART_INT_MASK_RXDRDY | + NRF_UART_INT_MASK_ERROR); + nrf_uart_task_trigger(p_instance->p_reg, NRF_UART_TASK_STOPRX); + + NRFX_LOG_INFO("RX transaction aborted."); +} + +static void uart_irq_handler(NRF_UART_Type * p_uart, + uart_control_block_t * p_cb) +{ + if (nrf_uart_int_enable_check(p_uart, NRF_UART_INT_MASK_ERROR) && + nrf_uart_event_check(p_uart, NRF_UART_EVENT_ERROR)) + { + nrfx_uart_event_t event; + nrf_uart_event_clear(p_uart, NRF_UART_EVENT_ERROR); + NRFX_LOG_DEBUG("Event: %s.", EVT_TO_STR(NRF_UART_EVENT_ERROR)); + nrf_uart_int_disable(p_uart, NRF_UART_INT_MASK_RXDRDY | + NRF_UART_INT_MASK_ERROR); + if (!p_cb->rx_enabled) + { + nrf_uart_task_trigger(p_uart, NRF_UART_TASK_STOPRX); + } + event.type = NRFX_UART_EVT_ERROR; + event.data.error.error_mask = nrf_uart_errorsrc_get_and_clear(p_uart); + event.data.error.rxtx.bytes = p_cb->rx_buffer_length; + event.data.error.rxtx.p_data = p_cb->p_rx_buffer; + + // Abort transfer. + p_cb->rx_buffer_length = 0; + p_cb->rx_secondary_buffer_length = 0; + + p_cb->handler(&event,p_cb->p_context); + } + else if (nrf_uart_int_enable_check(p_uart, NRF_UART_INT_MASK_RXDRDY) && + nrf_uart_event_check(p_uart, NRF_UART_EVENT_RXDRDY)) + { + rx_byte(p_uart, p_cb); + if (p_cb->rx_buffer_length == p_cb->rx_counter) + { + if (p_cb->rx_secondary_buffer_length) + { + uint8_t * p_data = p_cb->p_rx_buffer; + size_t rx_counter = p_cb->rx_counter; + + // Switch to secondary buffer. + p_cb->rx_buffer_length = p_cb->rx_secondary_buffer_length; + p_cb->p_rx_buffer = p_cb->p_rx_secondary_buffer; + p_cb->rx_secondary_buffer_length = 0; + p_cb->rx_counter = 0; + rx_done_event(p_cb, rx_counter, p_data); + } + else + { + if (!p_cb->rx_enabled) + { + nrf_uart_task_trigger(p_uart, NRF_UART_TASK_STOPRX); + } + nrf_uart_int_disable(p_uart, NRF_UART_INT_MASK_RXDRDY | + NRF_UART_INT_MASK_ERROR); + p_cb->rx_buffer_length = 0; + rx_done_event(p_cb, p_cb->rx_counter, p_cb->p_rx_buffer); + } + } + } + + if (nrf_uart_event_check(p_uart, NRF_UART_EVENT_TXDRDY)) + { + if (p_cb->tx_counter < p_cb->tx_buffer_length && + !p_cb->tx_abort) + { + tx_byte(p_uart, p_cb); + } + else + { + nrf_uart_event_clear(p_uart, NRF_UART_EVENT_TXDRDY); + if (p_cb->tx_buffer_length) + { + tx_done_event(p_cb, p_cb->tx_buffer_length); + } + } + } + + if (nrf_uart_event_check(p_uart, NRF_UART_EVENT_RXTO)) + { + nrf_uart_event_clear(p_uart, NRF_UART_EVENT_RXTO); + + // RXTO event may be triggered as a result of abort call. In th + if (p_cb->rx_enabled) + { + nrf_uart_task_trigger(p_uart, NRF_UART_TASK_STARTRX); + } + if (p_cb->rx_buffer_length) + { + p_cb->rx_buffer_length = 0; + rx_done_event(p_cb, p_cb->rx_counter, p_cb->p_rx_buffer); + } + } +} + +#if NRFX_CHECK(NRFX_UART0_ENABLED) +void nrfx_uart_0_irq_handler(void) +{ + uart_irq_handler(NRF_UART0, &m_cb[NRFX_UART0_INST_IDX]); +} +#endif + +#endif // NRFX_CHECK(NRFX_UART_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_uarte.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_uarte.c new file mode 100644 index 0000000000..cfe40ba5b0 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_uarte.c @@ -0,0 +1,583 @@ +/** + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_UARTE_ENABLED) + +#if !(NRFX_CHECK(NRFX_UARTE0_ENABLED) || NRFX_CHECK(NRFX_UARTE1_ENABLED)) +#error "No enabled UARTE instances. Check ." +#endif + +#include +#include "prs/nrfx_prs.h" +#include + +#define NRFX_LOG_MODULE UARTE +#include + +#define EVT_TO_STR(event) \ + (event == NRF_UARTE_EVENT_ERROR ? "NRF_UARTE_EVENT_ERROR" : \ + "UNKNOWN EVENT") + +#define UARTEX_LENGTH_VALIDATE(peripheral, drv_inst_idx, len1, len2) \ + (((drv_inst_idx) == NRFX_CONCAT_3(NRFX_, peripheral, _INST_IDX)) && \ + NRFX_EASYDMA_LENGTH_VALIDATE(peripheral, len1, len2)) + +#if NRFX_CHECK(NRFX_UARTE0_ENABLED) +#define UARTE0_LENGTH_VALIDATE(...) UARTEX_LENGTH_VALIDATE(UARTE0, __VA_ARGS__) +#else +#define UARTE0_LENGTH_VALIDATE(...) 0 +#endif + +#if NRFX_CHECK(NRFX_UARTE1_ENABLED) +#define UARTE1_LENGTH_VALIDATE(...) UARTEX_LENGTH_VALIDATE(UARTE1, __VA_ARGS__) +#else +#define UARTE1_LENGTH_VALIDATE(...) 0 +#endif + +#define UARTE_LENGTH_VALIDATE(drv_inst_idx, length) \ + (UARTE0_LENGTH_VALIDATE(drv_inst_idx, length, 0) || \ + UARTE1_LENGTH_VALIDATE(drv_inst_idx, length, 0)) + + +typedef struct +{ + void * p_context; + nrfx_uarte_event_handler_t handler; + uint8_t const * p_tx_buffer; + uint8_t * p_rx_buffer; + uint8_t * p_rx_secondary_buffer; + size_t tx_buffer_length; + size_t rx_buffer_length; + size_t rx_secondary_buffer_length; + nrfx_drv_state_t state; +} uarte_control_block_t; +static uarte_control_block_t m_cb[NRFX_UARTE_ENABLED_COUNT]; + +static void apply_config(nrfx_uarte_t const * p_instance, + nrfx_uarte_config_t const * p_config) +{ + if (p_config->pseltxd != NRF_UARTE_PSEL_DISCONNECTED) + { + nrf_gpio_pin_set(p_config->pseltxd); + nrf_gpio_cfg_output(p_config->pseltxd); + } + if (p_config->pselrxd != NRF_UARTE_PSEL_DISCONNECTED) + { + nrf_gpio_cfg_input(p_config->pselrxd, NRF_GPIO_PIN_NOPULL); + } + + nrf_uarte_baudrate_set(p_instance->p_reg, p_config->baudrate); + nrf_uarte_configure(p_instance->p_reg, p_config->parity, p_config->hwfc); + nrf_uarte_txrx_pins_set(p_instance->p_reg, p_config->pseltxd, p_config->pselrxd); + if (p_config->hwfc == NRF_UARTE_HWFC_ENABLED) + { + if (p_config->pselcts != NRF_UARTE_PSEL_DISCONNECTED) + { + nrf_gpio_cfg_input(p_config->pselcts, NRF_GPIO_PIN_NOPULL); + } + if (p_config->pselrts != NRF_UARTE_PSEL_DISCONNECTED) + { + nrf_gpio_pin_set(p_config->pselrts); + nrf_gpio_cfg_output(p_config->pselrts); + } + nrf_uarte_hwfc_pins_set(p_instance->p_reg, p_config->pselrts, p_config->pselcts); + } +} + +static void interrupts_enable(nrfx_uarte_t const * p_instance, + uint8_t interrupt_priority) +{ + nrf_uarte_event_clear(p_instance->p_reg, NRF_UARTE_EVENT_ENDRX); + nrf_uarte_event_clear(p_instance->p_reg, NRF_UARTE_EVENT_ENDTX); + nrf_uarte_event_clear(p_instance->p_reg, NRF_UARTE_EVENT_ERROR); + nrf_uarte_event_clear(p_instance->p_reg, NRF_UARTE_EVENT_RXTO); + nrf_uarte_int_enable(p_instance->p_reg, NRF_UARTE_INT_ENDRX_MASK | + NRF_UARTE_INT_ENDTX_MASK | + NRF_UARTE_INT_ERROR_MASK | + NRF_UARTE_INT_RXTO_MASK); + NRFX_IRQ_PRIORITY_SET(nrfx_get_irq_number((void *)p_instance->p_reg), + interrupt_priority); + NRFX_IRQ_ENABLE(nrfx_get_irq_number((void *)p_instance->p_reg)); +} + +static void interrupts_disable(nrfx_uarte_t const * p_instance) +{ + nrf_uarte_int_disable(p_instance->p_reg, NRF_UARTE_INT_ENDRX_MASK | + NRF_UARTE_INT_ENDTX_MASK | + NRF_UARTE_INT_ERROR_MASK | + NRF_UARTE_INT_RXTO_MASK); + NRFX_IRQ_DISABLE(nrfx_get_irq_number((void *)p_instance->p_reg)); +} + +static void pins_to_default(nrfx_uarte_t const * p_instance) +{ + /* Reset pins to default states */ + uint32_t txd; + uint32_t rxd; + uint32_t rts; + uint32_t cts; + + txd = nrf_uarte_tx_pin_get(p_instance->p_reg); + rxd = nrf_uarte_rx_pin_get(p_instance->p_reg); + rts = nrf_uarte_rts_pin_get(p_instance->p_reg); + cts = nrf_uarte_cts_pin_get(p_instance->p_reg); + nrf_uarte_txrx_pins_disconnect(p_instance->p_reg); + nrf_uarte_hwfc_pins_disconnect(p_instance->p_reg); + + if (txd != NRF_UARTE_PSEL_DISCONNECTED) + { + nrf_gpio_cfg_default(txd); + } + if (rxd != NRF_UARTE_PSEL_DISCONNECTED) + { + nrf_gpio_cfg_default(rxd); + } + if (cts != NRF_UARTE_PSEL_DISCONNECTED) + { + nrf_gpio_cfg_default(cts); + } + if (rts != NRF_UARTE_PSEL_DISCONNECTED) + { + nrf_gpio_cfg_default(rts); + } +} + +nrfx_err_t nrfx_uarte_init(nrfx_uarte_t const * p_instance, + nrfx_uarte_config_t const * p_config, + nrfx_uarte_event_handler_t event_handler) +{ + NRFX_ASSERT(p_config); + uarte_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + nrfx_err_t err_code = NRFX_SUCCESS; + + if (p_cb->state != NRFX_DRV_STATE_UNINITIALIZED) + { + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + static nrfx_irq_handler_t const irq_handlers[NRFX_UARTE_ENABLED_COUNT] = { + #if NRFX_CHECK(NRFX_UARTE0_ENABLED) + nrfx_uarte_0_irq_handler, + #endif + #if NRFX_CHECK(NRFX_UARTE1_ENABLED) + nrfx_uarte_1_irq_handler, + #endif + }; + if (nrfx_prs_acquire(p_instance->p_reg, + irq_handlers[p_instance->drv_inst_idx]) != NRFX_SUCCESS) + { + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } +#endif // NRFX_CHECK(NRFX_PRS_ENABLED) + + apply_config(p_instance, p_config); + + p_cb->handler = event_handler; + p_cb->p_context = p_config->p_context; + + if (p_cb->handler) + { + interrupts_enable(p_instance, p_config->interrupt_priority); + } + + nrf_uarte_enable(p_instance->p_reg); + p_cb->rx_buffer_length = 0; + p_cb->rx_secondary_buffer_length = 0; + p_cb->tx_buffer_length = 0; + p_cb->state = NRFX_DRV_STATE_INITIALIZED; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +void nrfx_uarte_uninit(nrfx_uarte_t const * p_instance) +{ + uarte_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + + nrf_uarte_disable(p_instance->p_reg); + + if (p_cb->handler) + { + interrupts_disable(p_instance); + } + + pins_to_default(p_instance); + +#if NRFX_CHECK(NRFX_PRS_ENABLED) + nrfx_prs_release(p_instance->p_reg); +#endif + + p_cb->state = NRFX_DRV_STATE_UNINITIALIZED; + p_cb->handler = NULL; + NRFX_LOG_INFO("Instance uninitialized: %d.", p_instance->drv_inst_idx); +} + +nrfx_err_t nrfx_uarte_tx(nrfx_uarte_t const * p_instance, + uint8_t const * p_data, + size_t length) +{ + uarte_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + NRFX_ASSERT(p_cb->state == NRFX_DRV_STATE_INITIALIZED); + NRFX_ASSERT(p_data); + NRFX_ASSERT(length > 0); + NRFX_ASSERT(UARTE_LENGTH_VALIDATE(p_instance->drv_inst_idx, length)); + + nrfx_err_t err_code; + + // EasyDMA requires that transfer buffers are placed in DataRAM, + // signal error if the are not. + if (!nrfx_is_in_ram(p_data)) + { + err_code = NRFX_ERROR_INVALID_ADDR; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + if (nrfx_uarte_tx_in_progress(p_instance)) + { + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + p_cb->tx_buffer_length = length; + p_cb->p_tx_buffer = p_data; + + NRFX_LOG_INFO("Transfer tx_len: %d.", p_cb->tx_buffer_length); + NRFX_LOG_DEBUG("Tx data:"); + NRFX_LOG_HEXDUMP_DEBUG(p_cb->p_tx_buffer, + p_cb->tx_buffer_length * sizeof(p_cb->p_tx_buffer[0])); + + err_code = NRFX_SUCCESS; + + nrf_uarte_event_clear(p_instance->p_reg, NRF_UARTE_EVENT_ENDTX); + nrf_uarte_event_clear(p_instance->p_reg, NRF_UARTE_EVENT_TXSTOPPED); + nrf_uarte_tx_buffer_set(p_instance->p_reg, p_cb->p_tx_buffer, p_cb->tx_buffer_length); + nrf_uarte_task_trigger(p_instance->p_reg, NRF_UARTE_TASK_STARTTX); + + if (p_cb->handler == NULL) + { + bool endtx; + bool txstopped; + do + { + endtx = nrf_uarte_event_check(p_instance->p_reg, NRF_UARTE_EVENT_ENDTX); + txstopped = nrf_uarte_event_check(p_instance->p_reg, NRF_UARTE_EVENT_TXSTOPPED); + } + while ((!endtx) && (!txstopped)); + + if (txstopped) + { + err_code = NRFX_ERROR_FORBIDDEN; + } + p_cb->tx_buffer_length = 0; + } + + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +bool nrfx_uarte_tx_in_progress(nrfx_uarte_t const * p_instance) +{ + return (m_cb[p_instance->drv_inst_idx].tx_buffer_length != 0); +} + +nrfx_err_t nrfx_uarte_rx(nrfx_uarte_t const * p_instance, + uint8_t * p_data, + size_t length) +{ + uarte_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + + NRFX_ASSERT(m_cb[p_instance->drv_inst_idx].state == NRFX_DRV_STATE_INITIALIZED); + NRFX_ASSERT(p_data); + NRFX_ASSERT(length > 0); + NRFX_ASSERT(UARTE_LENGTH_VALIDATE(p_instance->drv_inst_idx, length)); + + nrfx_err_t err_code; + + // EasyDMA requires that transfer buffers are placed in DataRAM, + // signal error if the are not. + if (!nrfx_is_in_ram(p_data)) + { + err_code = NRFX_ERROR_INVALID_ADDR; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + + bool second_buffer = false; + + if (p_cb->handler) + { + nrf_uarte_int_disable(p_instance->p_reg, NRF_UARTE_INT_ERROR_MASK | + NRF_UARTE_INT_ENDRX_MASK); + } + if (p_cb->rx_buffer_length != 0) + { + if (p_cb->rx_secondary_buffer_length != 0) + { + if (p_cb->handler) + { + nrf_uarte_int_enable(p_instance->p_reg, NRF_UARTE_INT_ERROR_MASK | + NRF_UARTE_INT_ENDRX_MASK); + } + err_code = NRFX_ERROR_BUSY; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; + } + second_buffer = true; + } + + if (!second_buffer) + { + p_cb->rx_buffer_length = length; + p_cb->p_rx_buffer = p_data; + p_cb->rx_secondary_buffer_length = 0; + } + else + { + p_cb->p_rx_secondary_buffer = p_data; + p_cb->rx_secondary_buffer_length = length; + } + + NRFX_LOG_INFO("Transfer rx_len: %d.", length); + + err_code = NRFX_SUCCESS; + + nrf_uarte_event_clear(p_instance->p_reg, NRF_UARTE_EVENT_ENDRX); + nrf_uarte_event_clear(p_instance->p_reg, NRF_UARTE_EVENT_RXTO); + nrf_uarte_rx_buffer_set(p_instance->p_reg, p_data, length); + if (!second_buffer) + { + nrf_uarte_task_trigger(p_instance->p_reg, NRF_UARTE_TASK_STARTRX); + } + else + { + nrf_uarte_shorts_enable(p_instance->p_reg, NRF_UARTE_SHORT_ENDRX_STARTRX); + } + + if (m_cb[p_instance->drv_inst_idx].handler == NULL) + { + bool endrx; + bool rxto; + bool error; + do { + endrx = nrf_uarte_event_check(p_instance->p_reg, NRF_UARTE_EVENT_ENDRX); + rxto = nrf_uarte_event_check(p_instance->p_reg, NRF_UARTE_EVENT_RXTO); + error = nrf_uarte_event_check(p_instance->p_reg, NRF_UARTE_EVENT_ERROR); + } while ((!endrx) && (!rxto) && (!error)); + + m_cb[p_instance->drv_inst_idx].rx_buffer_length = 0; + + if (error) + { + err_code = NRFX_ERROR_INTERNAL; + } + + if (rxto) + { + err_code = NRFX_ERROR_FORBIDDEN; + } + } + else + { + nrf_uarte_int_enable(p_instance->p_reg, NRF_UARTE_INT_ERROR_MASK | + NRF_UARTE_INT_ENDRX_MASK); + } + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); + return err_code; +} + +bool nrfx_uarte_rx_ready(nrfx_uarte_t const * p_instance) +{ + return nrf_uarte_event_check(p_instance->p_reg, NRF_UARTE_EVENT_ENDRX); +} + +uint32_t nrfx_uarte_errorsrc_get(nrfx_uarte_t const * p_instance) +{ + nrf_uarte_event_clear(p_instance->p_reg, NRF_UARTE_EVENT_ERROR); + return nrf_uarte_errorsrc_get_and_clear(p_instance->p_reg); +} + +static void rx_done_event(uarte_control_block_t * p_cb, + size_t bytes, + uint8_t * p_data) +{ + nrfx_uarte_event_t event; + + event.type = NRFX_UARTE_EVT_RX_DONE; + event.data.rxtx.bytes = bytes; + event.data.rxtx.p_data = p_data; + + p_cb->handler(&event, p_cb->p_context); +} + +static void tx_done_event(uarte_control_block_t * p_cb, + size_t bytes) +{ + nrfx_uarte_event_t event; + + event.type = NRFX_UARTE_EVT_TX_DONE; + event.data.rxtx.bytes = bytes; + event.data.rxtx.p_data = (uint8_t *)p_cb->p_tx_buffer; + + p_cb->tx_buffer_length = 0; + + p_cb->handler(&event, p_cb->p_context); +} + +void nrfx_uarte_tx_abort(nrfx_uarte_t const * p_instance) +{ + uarte_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; + + nrf_uarte_event_clear(p_instance->p_reg, NRF_UARTE_EVENT_TXSTOPPED); + nrf_uarte_task_trigger(p_instance->p_reg, NRF_UARTE_TASK_STOPTX); + if (p_cb->handler == NULL) + { + while (!nrf_uarte_event_check(p_instance->p_reg, NRF_UARTE_EVENT_TXSTOPPED)) + {} + } + NRFX_LOG_INFO("TX transaction aborted."); +} + +void nrfx_uarte_rx_abort(nrfx_uarte_t const * p_instance) +{ + nrf_uarte_task_trigger(p_instance->p_reg, NRF_UARTE_TASK_STOPRX); + NRFX_LOG_INFO("RX transaction aborted."); +} + +static void uarte_irq_handler(NRF_UARTE_Type * p_uarte, + uarte_control_block_t * p_cb) +{ + if (nrf_uarte_event_check(p_uarte, NRF_UARTE_EVENT_ERROR)) + { + nrfx_uarte_event_t event; + + nrf_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ERROR); + + event.type = NRFX_UARTE_EVT_ERROR; + event.data.error.error_mask = nrf_uarte_errorsrc_get_and_clear(p_uarte); + event.data.error.rxtx.bytes = nrf_uarte_rx_amount_get(p_uarte); + event.data.error.rxtx.p_data = p_cb->p_rx_buffer; + + // Abort transfer. + p_cb->rx_buffer_length = 0; + p_cb->rx_secondary_buffer_length = 0; + + p_cb->handler(&event, p_cb->p_context); + } + else if (nrf_uarte_event_check(p_uarte, NRF_UARTE_EVENT_ENDRX)) + { + nrf_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ENDRX); + size_t amount = nrf_uarte_rx_amount_get(p_uarte); + // If the transfer was stopped before completion, amount of transfered bytes + // will not be equal to the buffer length. Interrupted transfer is ignored. + if (amount == p_cb->rx_buffer_length) + { + if (p_cb->rx_secondary_buffer_length) + { + uint8_t * p_data = p_cb->p_rx_buffer; + nrf_uarte_shorts_disable(p_uarte, NRF_UARTE_SHORT_ENDRX_STARTRX); + p_cb->rx_buffer_length = p_cb->rx_secondary_buffer_length; + p_cb->p_rx_buffer = p_cb->p_rx_secondary_buffer; + p_cb->rx_secondary_buffer_length = 0; + rx_done_event(p_cb, amount, p_data); + } + else + { + p_cb->rx_buffer_length = 0; + rx_done_event(p_cb, amount, p_cb->p_rx_buffer); + } + } + } + + if (nrf_uarte_event_check(p_uarte, NRF_UARTE_EVENT_RXTO)) + { + nrf_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_RXTO); + if (p_cb->rx_buffer_length) + { + p_cb->rx_buffer_length = 0; + rx_done_event(p_cb, nrf_uarte_rx_amount_get(p_uarte), p_cb->p_rx_buffer); + } + } + + if (nrf_uarte_event_check(p_uarte, NRF_UARTE_EVENT_ENDTX)) + { + nrf_uarte_event_clear(p_uarte, NRF_UARTE_EVENT_ENDTX); + if (p_cb->tx_buffer_length) + { + tx_done_event(p_cb, nrf_uarte_tx_amount_get(p_uarte)); + } + } +} + +#if ( NRFX_CHECK(NRFX_UARTE0_ENABLED) && !(NRFX_CHECK(NRFX_UART0_ENABLED))) +void nrfx_uarte_0_irq_handler(void) +{ + uarte_irq_handler(NRF_UARTE0, &m_cb[NRFX_UARTE0_INST_IDX]); +} +#endif + +#if NRFX_CHECK(NRFX_UARTE1_ENABLED) +void nrfx_uarte_1_irq_handler(void) +{ + uarte_irq_handler(NRF_UARTE1, &m_cb[NRFX_UARTE1_INST_IDX]); +} +#endif + +#endif // NRFX_CHECK(NRFX_UARTE_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/wdt/nrf_drv_wdt.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_wdt.c similarity index 52% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/wdt/nrf_drv_wdt.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_wdt.c index 7a2f92d90d..d4d33b1faf 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/wdt/nrf_drv_wdt.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/nrfx_wdt.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,43 +37,27 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -#include "sdk_common.h" -#if NRF_MODULE_ENABLED(WDT) -#include "nrf_drv_wdt.h" -#include "nrf_drv_common.h" -#include "nrf_error.h" -#include "nrf_assert.h" -#include "nrf_wdt.h" -#include "app_util_platform.h" -#include -#include -#define NRF_LOG_MODULE_NAME wdt +#include -#if WDT_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL WDT_CONFIG_LOG_LEVEL -#define NRF_LOG_INFO_COLOR WDT_CONFIG_INFO_COLOR -#define NRF_LOG_DEBUG_COLOR WDT_CONFIG_DEBUG_COLOR -#else //WDT_CONFIG_LOG_ENABLED -#define NRF_LOG_LEVEL 0 -#endif //WDT_CONFIG_LOG_ENABLED -#include "nrf_log.h" -NRF_LOG_MODULE_REGISTER(); +#if NRFX_CHECK(NRFX_WDT_ENABLED) +#include + +#define NRFX_LOG_MODULE WDT +#include /**@brief WDT event handler. */ -static nrf_wdt_event_handler_t m_wdt_event_handler; +static nrfx_wdt_event_handler_t m_wdt_event_handler; /**@brief WDT state. */ -static nrf_drv_state_t m_state; +static nrfx_drv_state_t m_state; /**@brief WDT alloc table. */ static uint32_t m_alloc_index; -static const nrf_drv_wdt_config_t m_default_config = NRF_DRV_WDT_DEAFULT_CONFIG; - /**@brief WDT interrupt handler. */ -void WDT_IRQHandler(void) +void nrfx_wdt_irq_handler(void) { if (nrf_wdt_int_enable_check(NRF_WDT_INT_TIMEOUT_MASK) == true) { @@ -83,91 +67,87 @@ void WDT_IRQHandler(void) } -ret_code_t nrf_drv_wdt_init(nrf_drv_wdt_config_t const * p_config, - nrf_wdt_event_handler_t wdt_event_handler) +nrfx_err_t nrfx_wdt_init(nrfx_wdt_config_t const * p_config, + nrfx_wdt_event_handler_t wdt_event_handler) { - ASSERT(wdt_event_handler != NULL); - ret_code_t err_code; + NRFX_ASSERT(p_config); + NRFX_ASSERT(wdt_event_handler != NULL); + nrfx_err_t err_code; m_wdt_event_handler = wdt_event_handler; - if (m_state == NRF_DRV_STATE_UNINITIALIZED) + if (m_state == NRFX_DRV_STATE_UNINITIALIZED) { - m_state = NRF_DRV_STATE_INITIALIZED; + m_state = NRFX_DRV_STATE_INITIALIZED; } else { - err_code = NRF_ERROR_INVALID_STATE; - NRF_LOG_WARNING("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_ERROR_INVALID_STATE; + NRFX_LOG_WARNING("Function: %s, error code: %s.", + __func__, + NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } - if (p_config == NULL) - { - p_config = &m_default_config; - } - nrf_wdt_behaviour_set(p_config->behaviour); - if ((((uint64_t) p_config->reload_value * 32768) / 1000) > UINT32_MAX) // Check for overflow - { - return NRF_ERROR_INVALID_PARAM; - } - nrf_wdt_reload_value_set(((uint64_t) p_config->reload_value * 32768) / 1000); + nrf_wdt_reload_value_set((p_config->reload_value * 32768) / 1000); - nrf_drv_common_irq_enable(WDT_IRQn, p_config->interrupt_priority); + NRFX_IRQ_PRIORITY_SET(WDT_IRQn, p_config->interrupt_priority); + NRFX_IRQ_ENABLE(WDT_IRQn); - err_code = NRF_SUCCESS; - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(err_code)); + err_code = NRFX_SUCCESS; + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } -void nrf_drv_wdt_enable(void) +void nrfx_wdt_enable(void) { - ASSERT(m_alloc_index != 0); - ASSERT(m_state == NRF_DRV_STATE_INITIALIZED); + NRFX_ASSERT(m_alloc_index != 0); + NRFX_ASSERT(m_state == NRFX_DRV_STATE_INITIALIZED); nrf_wdt_int_enable(NRF_WDT_INT_TIMEOUT_MASK); nrf_wdt_task_trigger(NRF_WDT_TASK_START); - m_state = NRF_DRV_STATE_POWERED_ON; - NRF_LOG_INFO("Enabled."); + m_state = NRFX_DRV_STATE_POWERED_ON; + NRFX_LOG_INFO("Enabled."); } -void nrf_drv_wdt_feed(void) +void nrfx_wdt_feed(void) { - ASSERT(m_state == NRF_DRV_STATE_POWERED_ON); + NRFX_ASSERT(m_state == NRFX_DRV_STATE_POWERED_ON); for (uint32_t i = 0; i < m_alloc_index; i++) { nrf_wdt_reload_request_set((nrf_wdt_rr_register_t)(NRF_WDT_RR0 + i)); } } -ret_code_t nrf_drv_wdt_channel_alloc(nrf_drv_wdt_channel_id * p_channel_id) +nrfx_err_t nrfx_wdt_channel_alloc(nrfx_wdt_channel_id * p_channel_id) { - ret_code_t result; - ASSERT(p_channel_id); - ASSERT(m_state == NRF_DRV_STATE_INITIALIZED); + nrfx_err_t result; + NRFX_ASSERT(p_channel_id); + NRFX_ASSERT(m_state == NRFX_DRV_STATE_INITIALIZED); - CRITICAL_REGION_ENTER(); + NRFX_CRITICAL_SECTION_ENTER(); if (m_alloc_index < NRF_WDT_CHANNEL_NUMBER) { - *p_channel_id = (nrf_drv_wdt_channel_id)(NRF_WDT_RR0 + m_alloc_index); + *p_channel_id = (nrfx_wdt_channel_id)(NRF_WDT_RR0 + m_alloc_index); m_alloc_index++; nrf_wdt_reload_request_enable(*p_channel_id); - result = NRF_SUCCESS; + result = NRFX_SUCCESS; } else { - result = NRF_ERROR_NO_MEM; + result = NRFX_ERROR_NO_MEM; } - CRITICAL_REGION_EXIT(); - NRF_LOG_INFO("Function: %s, error code: %s.", (uint32_t)__func__, (uint32_t)NRF_LOG_ERROR_STRING_GET(result)); + NRFX_CRITICAL_SECTION_EXIT(); + NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(result)); return result; } -void nrf_drv_wdt_channel_feed(nrf_drv_wdt_channel_id channel_id) +void nrfx_wdt_channel_feed(nrfx_wdt_channel_id channel_id) { - ASSERT(m_state == NRF_DRV_STATE_POWERED_ON); + NRFX_ASSERT(m_state == NRFX_DRV_STATE_POWERED_ON); nrf_wdt_reload_request_set(channel_id); } -#endif //NRF_MODULE_ENABLED(WDT) + +#endif // NRFX_CHECK(NRFX_WDT_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/prs/nrfx_prs.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/prs/nrfx_prs.c new file mode 100644 index 0000000000..e7a105fe3e --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/prs/nrfx_prs.c @@ -0,0 +1,166 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include + +#if NRFX_CHECK(NRFX_PRS_ENABLED) +#include "nrfx_prs.h" + +#define NRFX_LOG_MODULE PRS +#include + +#define LOG_FUNCTION_EXIT(level, ret_code) \ + NRFX_LOG_##level("Function: %s, error code: %s.", \ + __func__, \ + NRFX_LOG_ERROR_STRING_GET(ret_code)) + + +typedef struct { + nrfx_irq_handler_t handler; + bool acquired; +} prs_box_t; + +#define PRS_BOX_DEFINE(n) \ + static prs_box_t m_prs_box_##n = { .handler = NULL, .acquired = false }; \ + void nrfx_prs_box_##n##_irq_handler(void) \ + { \ + NRFX_ASSERT(m_prs_box_##n.handler); \ + m_prs_box_##n.handler(); \ + } + +#if defined(NRFX_PRS_BOX_0_ADDR) && NRFX_CHECK(NRFX_PRS_BOX_0_ENABLED) +PRS_BOX_DEFINE(0) +#endif +#if defined(NRFX_PRS_BOX_1_ADDR) && NRFX_CHECK(NRFX_PRS_BOX_1_ENABLED) +PRS_BOX_DEFINE(1) +#endif +#if defined(NRFX_PRS_BOX_2_ADDR) && NRFX_CHECK(NRFX_PRS_BOX_2_ENABLED) +PRS_BOX_DEFINE(2) +#endif +#if defined(NRFX_PRS_BOX_3_ADDR) && NRFX_CHECK(NRFX_PRS_BOX_3_ENABLED) +PRS_BOX_DEFINE(3) +#endif +#if defined(NRFX_PRS_BOX_4_ADDR) && NRFX_CHECK(NRFX_PRS_BOX_4_ENABLED) +PRS_BOX_DEFINE(4) +#endif + + +static prs_box_t * prs_box_get(void const * p_base_addr) +{ +#if !defined(IS_PRS_BOX) +#define IS_PRS_BOX(n, p_base_addr) ((p_base_addr) == NRFX_PRS_BOX_##n##_ADDR) +#endif + +#if defined(NRFX_PRS_BOX_0_ADDR) && NRFX_CHECK(NRFX_PRS_BOX_0_ENABLED) + if (IS_PRS_BOX(0, p_base_addr)) { return &m_prs_box_0; } + else +#endif +#if defined(NRFX_PRS_BOX_1_ADDR) && NRFX_CHECK(NRFX_PRS_BOX_1_ENABLED) + if (IS_PRS_BOX(1, p_base_addr)) { return &m_prs_box_1; } + else +#endif +#if defined(NRFX_PRS_BOX_2_ADDR) && NRFX_CHECK(NRFX_PRS_BOX_2_ENABLED) + if (IS_PRS_BOX(2, p_base_addr)) { return &m_prs_box_2; } + else +#endif +#if defined(NRFX_PRS_BOX_3_ADDR) && NRFX_CHECK(NRFX_PRS_BOX_3_ENABLED) + if (IS_PRS_BOX(3, p_base_addr)) { return &m_prs_box_3; } + else +#endif +#if defined(NRFX_PRS_BOX_4_ADDR) && NRFX_CHECK(NRFX_PRS_BOX_4_ENABLED) + if (IS_PRS_BOX(4, p_base_addr)) { return &m_prs_box_4; } + else +#endif + { + return NULL; + } +} + +nrfx_err_t nrfx_prs_acquire(void const * p_base_addr, + nrfx_irq_handler_t irq_handler) +{ + NRFX_ASSERT(p_base_addr); + + nrfx_err_t ret_code; + + prs_box_t * p_box = prs_box_get(p_base_addr); + if (p_box != NULL) + { + bool busy = false; + + NRFX_CRITICAL_SECTION_ENTER(); + if (p_box->acquired) + { + busy = true; + } + else + { + p_box->handler = irq_handler; + p_box->acquired = true; + } + NRFX_CRITICAL_SECTION_EXIT(); + + if (busy) + { + ret_code = NRFX_ERROR_BUSY; + LOG_FUNCTION_EXIT(WARNING, ret_code); + return ret_code; + } + } + + ret_code = NRFX_SUCCESS; + LOG_FUNCTION_EXIT(INFO, ret_code); + return ret_code; +} + +void nrfx_prs_release(void const * p_base_addr) +{ + NRFX_ASSERT(p_base_addr); + + prs_box_t * p_box = prs_box_get(p_base_addr); + if (p_box != NULL) + { + p_box->handler = NULL; + p_box->acquired = false; + } +} + + +#endif // NRFX_CHECK(NRFX_PRS_ENABLED) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/prs/nrfx_prs.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/prs/nrfx_prs.h new file mode 100644 index 0000000000..f585fa1310 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/drivers/src/prs/nrfx_prs.h @@ -0,0 +1,140 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_PRS_H__ +#define NRFX_PRS_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrfx_prs Peripheral Resource Sharing (PRS) + * @{ + * @ingroup nrfx + * + * @brief Peripheral Resource Sharing interface (PRS). + */ + +#if defined(NRF51) + // SPI0, TWI0 + #define NRFX_PRS_BOX_0_ADDR NRF_SPI0 + // SPI1, SPIS1, TWI1 + #define NRFX_PRS_BOX_1_ADDR NRF_SPI1 +#elif defined(NRF52810_XXAA) + // TWIM0, TWIS0 + #define NRFX_PRS_BOX_0_ADDR NRF_TWIM0 + // SPIM0, SPIS0 + #define NRFX_PRS_BOX_1_ADDR NRF_SPIM0 +#elif defined(NRF52832_XXAA) || defined (NRF52832_XXAB) + // SPIM0, SPIS0, TWIM0, TWIS0, SPI0, TWI0 + #define NRFX_PRS_BOX_0_ADDR NRF_SPIM0 + // SPIM1, SPIS1, TWIM1, TWIS1, SPI1, TWI1 + #define NRFX_PRS_BOX_1_ADDR NRF_SPIM1 + // SPIM2, SPIS2, SPI2 + #define NRFX_PRS_BOX_2_ADDR NRF_SPIM2 + // COMP, LPCOMP + #define NRFX_PRS_BOX_3_ADDR NRF_COMP + // UARTE0, UART0 + #define NRFX_PRS_BOX_4_ADDR NRF_UARTE0 +#elif defined(NRF52840_XXAA) + // SPIM0, SPIS0, TWIM0, TWIS0, SPI0, TWI0 + #define NRFX_PRS_BOX_0_ADDR NRF_SPIM0 + // SPIM1, SPIS1, TWIM1, TWIS1, SPI1, TWI1 + #define NRFX_PRS_BOX_1_ADDR NRF_SPIM1 + // SPIM2, SPIS2, SPI2 + #define NRFX_PRS_BOX_2_ADDR NRF_SPIM2 + // COMP, LPCOMP + #define NRFX_PRS_BOX_3_ADDR NRF_COMP + // UARTE0, UART0 + #define NRFX_PRS_BOX_4_ADDR NRF_UARTE0 +#else + #error "Unknown device." +#endif + +/** + * @brief Function for acquiring shared peripheral resources associated with + * the specified peripheral. + * + * Certain resources and registers are shared among peripherals that have + * the same ID (for example: SPI0, SPIM0, SPIS0, TWI0, TWIM0, and TWIS0 in + * nRF52832). Only one of them can be utilized at a given time. This function + * reserves proper resources to be used by the specified peripheral. + * If NRFX_PRS_ENABLED is set to a non-zero value, IRQ handlers for peripherals + * that are sharing resources with others are implemented by the @ref nrfx_prs + * module instead of individual drivers. The drivers must then specify their + * interrupt handling routines and register them by using this function. + * + * @param[in] p_base_addr Requested peripheral base pointer. + * @param[in] irq_handler Interrupt handler to register. + * + * @retval NRFX_SUCCESS If resources were acquired successfully or the + * specified peripheral is not handled by the PRS + * subsystem and there is no need to acquire resources + * for it. + * @retval NRFX_ERROR_BUSY If resources were already acquired. + */ +nrfx_err_t nrfx_prs_acquire(void const * p_base_addr, + nrfx_irq_handler_t irq_handler); + +/** + * @brief Function for releasing shared resources reserved previously by + * @ref nrfx_prs_acquire() for the specified peripheral. + * + * @param[in] p_base_addr Released peripheral base pointer. + */ +void nrfx_prs_release(void const * p_base_addr); + + +void nrfx_prs_box_0_irq_handler(void); +void nrfx_prs_box_1_irq_handler(void); +void nrfx_prs_box_2_irq_handler(void); +void nrfx_prs_box_3_irq_handler(void); +void nrfx_prs_box_4_irq_handler(void); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_PRS_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_adc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_adc.h new file mode 100644 index 0000000000..862e6f1e5c --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_adc.h @@ -0,0 +1,348 @@ +/** + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRF_ADC_H_ +#define NRF_ADC_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup nrf_adc_hal ADC HAL + * @{ + * @ingroup nrf_adc + * @brief Hardware access layer for managing the Analog-to-Digital Converter (ADC) + * peripheral. + */ + +/** @brief ADC interrupts. */ +typedef enum +{ + NRF_ADC_INT_END_MASK = ADC_INTENSET_END_Msk, /**< ADC interrupt on END event. */ +} nrf_adc_int_mask_t; + +/** @brief Resolution of the analog-to-digital converter. */ +typedef enum +{ + NRF_ADC_CONFIG_RES_8BIT = ADC_CONFIG_RES_8bit, /**< 8-bit resolution. */ + NRF_ADC_CONFIG_RES_9BIT = ADC_CONFIG_RES_9bit, /**< 9-bit resolution. */ + NRF_ADC_CONFIG_RES_10BIT = ADC_CONFIG_RES_10bit, /**< 10-bit resolution. */ +} nrf_adc_config_resolution_t; + + +/** @brief Scaling factor of the analog-to-digital conversion. */ +typedef enum +{ + NRF_ADC_CONFIG_SCALING_INPUT_FULL_SCALE = ADC_CONFIG_INPSEL_AnalogInputNoPrescaling, /**< Full scale input. */ + NRF_ADC_CONFIG_SCALING_INPUT_TWO_THIRDS = ADC_CONFIG_INPSEL_AnalogInputTwoThirdsPrescaling, /**< 2/3 scale input. */ + NRF_ADC_CONFIG_SCALING_INPUT_ONE_THIRD = ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling, /**< 1/3 scale input. */ + NRF_ADC_CONFIG_SCALING_SUPPLY_TWO_THIRDS = ADC_CONFIG_INPSEL_SupplyTwoThirdsPrescaling, /**< 2/3 of supply. */ + NRF_ADC_CONFIG_SCALING_SUPPLY_ONE_THIRD = ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling /**< 1/3 of supply. */ +} nrf_adc_config_scaling_t; + + +/** + * @brief External reference selection of the analog-to-digital converter. + */ +typedef enum +{ + NRF_ADC_CONFIG_EXTREFSEL_NONE = ADC_CONFIG_EXTREFSEL_None, /**< Analog reference inputs disabled. */ + NRF_ADC_CONFIG_EXTREFSEL_AREF0 = ADC_CONFIG_EXTREFSEL_AnalogReference0, /**< AREF0 as analog reference. */ + NRF_ADC_CONFIG_EXTREFSEL_AREF1 = ADC_CONFIG_EXTREFSEL_AnalogReference1 /**< AREF1 as analog reference. */ +} nrf_adc_config_extref_t; + +/** + * @brief Reference selection of the analog-to-digital converter. + */ +typedef enum +{ + NRF_ADC_CONFIG_REF_VBG = ADC_CONFIG_REFSEL_VBG, /**< 1.2 V reference. */ + NRF_ADC_CONFIG_REF_SUPPLY_ONE_HALF = ADC_CONFIG_REFSEL_SupplyOneHalfPrescaling, /**< 1/2 of power supply. */ + NRF_ADC_CONFIG_REF_SUPPLY_ONE_THIRD = ADC_CONFIG_REFSEL_SupplyOneThirdPrescaling, /**< 1/3 of power supply. */ + NRF_ADC_CONFIG_REF_EXT = ADC_CONFIG_REFSEL_External /**< External reference. See @ref nrf_adc_config_extref_t for further configuration.*/ +} nrf_adc_config_reference_t; + +/** @brief Input selection of the analog-to-digital converter. */ +typedef enum +{ + NRF_ADC_CONFIG_INPUT_DISABLED = ADC_CONFIG_PSEL_Disabled, /**< No input selected. */ + NRF_ADC_CONFIG_INPUT_0 = ADC_CONFIG_PSEL_AnalogInput0, /**< Input 0. */ + NRF_ADC_CONFIG_INPUT_1 = ADC_CONFIG_PSEL_AnalogInput1, /**< Input 1. */ + NRF_ADC_CONFIG_INPUT_2 = ADC_CONFIG_PSEL_AnalogInput2, /**< Input 2. */ + NRF_ADC_CONFIG_INPUT_3 = ADC_CONFIG_PSEL_AnalogInput3, /**< Input 3. */ + NRF_ADC_CONFIG_INPUT_4 = ADC_CONFIG_PSEL_AnalogInput4, /**< Input 4. */ + NRF_ADC_CONFIG_INPUT_5 = ADC_CONFIG_PSEL_AnalogInput5, /**< Input 5. */ + NRF_ADC_CONFIG_INPUT_6 = ADC_CONFIG_PSEL_AnalogInput6, /**< Input 6. */ + NRF_ADC_CONFIG_INPUT_7 = ADC_CONFIG_PSEL_AnalogInput7, /**< Input 7. */ +} nrf_adc_config_input_t; + +/** @brief Analog-to-digital converter tasks. */ +typedef enum +{ + /*lint -save -e30*/ + NRF_ADC_TASK_START = offsetof(NRF_ADC_Type, TASKS_START), /**< ADC start sampling task. */ + NRF_ADC_TASK_STOP = offsetof(NRF_ADC_Type, TASKS_STOP) /**< ADC stop sampling task. */ + /*lint -restore*/ +} nrf_adc_task_t; + +/** @brief Analog-to-digital converter events. */ +typedef enum /*lint -save -e30 -esym(628,__INTADDR__) */ +{ + /*lint -save -e30*/ + NRF_ADC_EVENT_END = offsetof(NRF_ADC_Type, EVENTS_END) /**< End of a conversion event. */ + /*lint -restore*/ +} nrf_adc_event_t; + +/**@brief Analog-to-digital converter configuration. */ +typedef struct +{ + nrf_adc_config_resolution_t resolution; /**< ADC resolution. */ + nrf_adc_config_scaling_t scaling; /**< ADC scaling factor. */ + nrf_adc_config_reference_t reference; /**< ADC reference. */ + nrf_adc_config_input_t input; /**< ADC input selection. */ + nrf_adc_config_extref_t extref; /**< ADC external reference selection. */ +} nrf_adc_config_t; + +/**@brief Analog-to-digital value type. */ +typedef uint16_t nrf_adc_value_t; + +/** + * @brief Function for activating a specific ADC task. + * + * @param[in] task Task to activate. + */ +__STATIC_INLINE void nrf_adc_task_trigger(nrf_adc_task_t task); + +/** + * @brief Function for getting the address of an ADC task register. + * + * @param[in] task ADC task. + * + * @return Address of the specified ADC task. + */ +__STATIC_INLINE uint32_t nrf_adc_task_address_get(nrf_adc_task_t task); + +/** + * @brief Function for checking the state of an ADC event. + * + * @param[in] event Event to check. + * + * @retval true If the event is set. + * @retval false If the event is not set. + */ +__STATIC_INLINE bool nrf_adc_event_check(nrf_adc_event_t event); + +/** + * @brief Function for clearing an ADC event. + * + * @param[in] event Event to clear. + */ +__STATIC_INLINE void nrf_adc_event_clear(nrf_adc_event_t event); + +/** + * @brief Function for getting the address of a specific ADC event register. + * + * @param[in] adc_event ADC event. + * + * @return Address of the specified ADC event. + */ +__STATIC_INLINE uint32_t nrf_adc_event_address_get(nrf_adc_event_t adc_event); + +/** + * @brief Function for enabling the specified interrupts. + * + * @param[in] int_mask Interrupts to enable. + */ +__STATIC_INLINE void nrf_adc_int_enable(uint32_t int_mask); + +/** + * @brief Function for disabling the specified interrupts. + * + * @param[in] int_mask Interrupts to disable. + */ +__STATIC_INLINE void nrf_adc_int_disable(uint32_t int_mask); + +/** + * @brief Function for retrieving the state of the specified ADC interrupts. + * + * @param[in] int_mask Interrupts to check. + * + * @retval true If all specified interrupts are enabled. + * @retval false If at least one of the given interrupts is not enabled. + */ +__STATIC_INLINE bool nrf_adc_int_enable_check(uint32_t int_mask); + +/** + * @brief Function for checking whether the ADC is busy. + * + * This function checks whether the ADC converter is busy with a conversion. + * + * @retval true If the ADC is busy. + * @retval false If the ADC is not busy. + */ +__STATIC_INLINE bool nrf_adc_busy_check(void); + +/** + * @brief Function for enabling the ADC. + * + */ +__STATIC_INLINE void nrf_adc_enable(void); + +/** + * @brief Function for disabling the ADC. + * + */ +__STATIC_INLINE void nrf_adc_disable(void); + +/** + * @brief Function for checking if the ADC is enabled. + * + * @retval true If the ADC is enabled. + * @retval false If the ADC is not enabled. + */ +__STATIC_INLINE bool nrf_adc_enable_check(void); + +/** + * @brief Function for retrieving the ADC conversion result. + * + * This function retrieves and returns the last analog-to-digital conversion result. + * + * @return Last conversion result. + */ +__STATIC_INLINE nrf_adc_value_t nrf_adc_result_get(void); + +/** + * @brief Function for initializing the ADC. + * + * This function writes data to ADC's CONFIG register. After the configuration, + * the ADC is in DISABLE state and must be enabled before using it. + * + * @param[in] p_config Configuration parameters. + */ +__STATIC_INLINE void nrf_adc_init(nrf_adc_config_t const * p_config); + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION + +__STATIC_INLINE void nrf_adc_task_trigger(nrf_adc_task_t task) +{ + *((volatile uint32_t *)((uint8_t *)NRF_ADC + (uint32_t)task)) = 0x1UL; +} + +__STATIC_INLINE uint32_t nrf_adc_task_address_get(nrf_adc_task_t adc_task) +{ + return (uint32_t)((uint8_t *)NRF_ADC + (uint32_t)adc_task); +} + +__STATIC_INLINE bool nrf_adc_event_check(nrf_adc_event_t event) +{ + return (bool)*(volatile uint32_t *)((uint8_t *)NRF_ADC + (uint32_t)event); +} + +__STATIC_INLINE void nrf_adc_event_clear(nrf_adc_event_t event) +{ + *((volatile uint32_t *)((uint8_t *)NRF_ADC + (uint32_t)event)) = 0x0UL; +} + +__STATIC_INLINE uint32_t nrf_adc_event_address_get(nrf_adc_event_t adc_event) +{ + return (uint32_t)((uint8_t *)NRF_ADC + (uint32_t)adc_event); +} + +__STATIC_INLINE void nrf_adc_int_enable(uint32_t int_mask) +{ + NRF_ADC->INTENSET = int_mask; +} + +__STATIC_INLINE void nrf_adc_int_disable(uint32_t int_mask) +{ + NRF_ADC->INTENCLR = int_mask; +} + +__STATIC_INLINE bool nrf_adc_int_enable_check(uint32_t int_mask) +{ + return (bool)(NRF_ADC->INTENSET & int_mask); +} + +__STATIC_INLINE bool nrf_adc_busy_check(void) +{ + return ((NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) == (ADC_BUSY_BUSY_Busy << ADC_BUSY_BUSY_Pos)); +} + +__STATIC_INLINE void nrf_adc_enable(void) +{ + NRF_ADC->ENABLE = (ADC_ENABLE_ENABLE_Enabled << ADC_ENABLE_ENABLE_Pos); +} + +__STATIC_INLINE void nrf_adc_disable(void) +{ + NRF_ADC->ENABLE = (ADC_ENABLE_ENABLE_Disabled << ADC_ENABLE_ENABLE_Pos); +} + +__STATIC_INLINE bool nrf_adc_enable_check(void) +{ + return (NRF_ADC->ENABLE == (ADC_ENABLE_ENABLE_Enabled << ADC_ENABLE_ENABLE_Pos)); +} + +__STATIC_INLINE nrf_adc_value_t nrf_adc_result_get(void) +{ + return (nrf_adc_value_t)NRF_ADC->RESULT; +} + +__STATIC_INLINE void nrf_adc_init(nrf_adc_config_t const * p_config) +{ + NRF_ADC->CONFIG = + ((p_config->resolution << ADC_CONFIG_RES_Pos) & ADC_CONFIG_RES_Msk) + |((p_config->scaling << ADC_CONFIG_INPSEL_Pos) & ADC_CONFIG_INPSEL_Msk) + |((p_config->reference << ADC_CONFIG_REFSEL_Pos) & ADC_CONFIG_REFSEL_Msk) + |((p_config->input << ADC_CONFIG_PSEL_Pos) & ADC_CONFIG_PSEL_Msk) + |((p_config->extref << ADC_CONFIG_EXTREFSEL_Pos) & ADC_CONFIG_EXTREFSEL_Msk); +} + +#endif // SUPPRESS_INLINE_IMPLEMENTATION +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* NRF_ADC_H_ */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_clock.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_clock.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_clock.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_clock.h index 50a7271a9d..31cfc7a2e8 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_clock.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_clock.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,13 +37,11 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ + #ifndef NRF_CLOCK_H__ #define NRF_CLOCK_H__ -#include -#include - -#include "nrf.h" +#include #ifdef __cplusplus extern "C" { @@ -53,7 +51,10 @@ extern "C" { * @defgroup nrf_clock_hal Clock HAL * @{ * @ingroup nrf_clock - * @brief Hardware access layer for managing the low-frequency clock (LFCLK) and the high-frequency clock (HFCLK). + * @brief Hardware access layer for managing the CLOCK peripheral. + * + * This code can be used to managing low-frequency clock (LFCLK) and the high-frequency clock + * (HFCLK) settings. */ #define NRF_CLOCK_TASK_TRIGGER (1UL) @@ -390,9 +391,7 @@ __STATIC_INLINE void nrf_clock_cal_timer_timeout_set(uint32_t interval) #endif // SUPPRESS_INLINE_IMPLEMENTATION -/** - *@} - **/ +/** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_comp.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_comp.h similarity index 96% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_comp.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_comp.h index 31e2ff3cd5..0f8b108164 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_comp.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_comp.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,31 +37,23 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @file - * @brief COMP HAL API. - */ #ifndef NRF_COMP_H_ #define NRF_COMP_H_ +#include + +#ifdef __cplusplus +extern "C" { +#endif + /** * @defgroup nrf_comp_hal COMP HAL * @{ * @ingroup nrf_comp - * @brief @tagAPI52 Hardware access layer for managing the Comparator (COMP). + * @brief Hardware access layer for managing the Comparator (COMP) peripheral. */ -#include "nrf.h" - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - /** * @enum nrf_comp_input_t * @brief COMP analog pin selection. @@ -75,10 +67,10 @@ typedef enum NRF_COMP_INPUT_4 = COMP_PSEL_PSEL_AnalogInput4, /*!< AIN4 selected as analog input. */ NRF_COMP_INPUT_5 = COMP_PSEL_PSEL_AnalogInput5, /*!< AIN5 selected as analog input. */ NRF_COMP_INPUT_6 = COMP_PSEL_PSEL_AnalogInput6, /*!< AIN6 selected as analog input. */ -#if defined (COMP_PSEL_PSEL_AnalogInput7) || defined (__SDK_DOXYGEN__) +#if defined (COMP_PSEL_PSEL_AnalogInput7) || defined (__NRFX_DOXYGEN__) NRF_COMP_INPUT_7 = COMP_PSEL_PSEL_AnalogInput7, /*!< AIN7 selected as analog input. */ #endif -#if defined (COMP_PSEL_PSEL_VddDiv2) || defined (__SDK_DOXYGEN__) +#if defined (COMP_PSEL_PSEL_VddDiv2) || defined (__NRFX_DOXYGEN__) NRF_COMP_VDD_DIV2 = COMP_PSEL_PSEL_VddDiv2, /*!< VDD/2 selected as analog input. */ #endif }nrf_comp_input_t; @@ -146,7 +138,7 @@ typedef enum NRF_COMP_HYST_50mV = COMP_HYST_HYST_Hyst50mV /*!< Comparator hysteresis enabled. */ }nrf_comp_hyst_t; -#if defined (COMP_ISOURCE_ISOURCE_Msk) +#if defined (COMP_ISOURCE_ISOURCE_Msk) || defined (__NRFX_DOXYGEN__) /** * @brief COMP current source selection on analog input. */ @@ -263,7 +255,8 @@ __STATIC_INLINE void nrf_comp_speed_mode_set(nrf_comp_sp_mode_t speed_mode); */ __STATIC_INLINE void nrf_comp_hysteresis_set(nrf_comp_hyst_t hyst); -#if defined (COMP_ISOURCE_ISOURCE_Msk) + +#if defined (COMP_ISOURCE_ISOURCE_Msk) || defined (__NRFX_DOXYGEN__) /** * @brief Function for setting the current source on the analog input. * @@ -272,6 +265,7 @@ __STATIC_INLINE void nrf_comp_hysteresis_set(nrf_comp_hyst_t hyst); __STATIC_INLINE void nrf_comp_isource_set(nrf_isource_t isource); #endif + /** * @brief Function for selecting the active input of the COMP. * @@ -506,10 +500,7 @@ __STATIC_INLINE bool nrf_comp_event_check(nrf_comp_event_t comp_event) #endif // SUPPRESS_INLINE_IMPLEMENTATION -/** - *@} - **/ - +/** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_ecb.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_ecb.c similarity index 94% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_ecb.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_ecb.c index d8c96d4ce8..e794a0838e 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_ecb.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_ecb.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,19 +37,12 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @file - * @brief Implementation of AES ECB driver - */ - //lint -e438 -#include -#include -#include -#include "nrf.h" +#include #include "nrf_ecb.h" +#include static uint8_t ecb_data[48]; ///< ECB data structure for RNG peripheral to access. static uint8_t* ecb_key; ///< Key: Starts at ecb_data diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_ecb.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_ecb.h similarity index 92% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_ecb.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_ecb.h index b9bf4fb0a8..15830b7d90 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_ecb.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_ecb.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,30 +37,26 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @file - * @brief ECB driver API. - */ #ifndef NRF_ECB_H__ #define NRF_ECB_H__ -/** - * @defgroup nrf_ecb AES ECB encryption - * @{ - * @ingroup nrf_drivers - * @brief Driver for the AES Electronic Code Book (ECB) peripheral. - * - * To encrypt data, the peripheral must first be powered on - * using @ref nrf_ecb_init. Next, the key must be set using @ref nrf_ecb_set_key. - */ - -#include +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_ecb_hal AES ECB encryption HAL + * @{ + * @ingroup nrf_ecb + * @brief Driver for the AES Electronic Code Book (ECB) peripheral. + * + * To encrypt data, the peripheral must first be powered on + * using @ref nrf_ecb_init. Next, the key must be set using @ref nrf_ecb_set_key. + */ + /** * @brief Function for initializing and powering on the ECB peripheral. * @@ -91,6 +87,7 @@ bool nrf_ecb_crypt(uint8_t * dst, const uint8_t * src); */ void nrf_ecb_set_key(const uint8_t * key); +/** @} */ #ifdef __cplusplus } @@ -98,4 +95,3 @@ void nrf_ecb_set_key(const uint8_t * key); #endif // NRF_ECB_H__ -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_egu.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_egu.h similarity index 83% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_egu.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_egu.h index 7610516149..083dce279a 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_egu.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_egu.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,28 +37,23 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ + #ifndef NRF_EGU_H__ #define NRF_EGU_H__ -/** -* @defgroup nrf_egu EGU (Event Generator Unit) abstraction -* @{ -* @ingroup nrf_drivers -* @brief @tagAPI52 EGU (Event Generator Unit) module functions. -* -*/ - -#include -#include -#include -#include "nrf_assert.h" -#include "nrf.h" -#include "nrf_peripherals.h" +#include #ifdef __cplusplus extern "C" { #endif +/** +* @defgroup nrf_egu_hal EGU HAL +* @{ +* @ingroup nrf_swi_egu +* @brief Hardware access layer for managing the Event Generator Unit (EGU) peripheral. +*/ + /** * @enum nrf_egu_task_t * @brief EGU tasks. @@ -144,6 +139,126 @@ typedef enum * * @returns number of available channels. */ +__STATIC_INLINE uint32_t nrf_egu_channel_count(NRF_EGU_Type * NRF_EGUx); + +/** + * @brief Function for triggering a specific EGU task. + * + * @param NRF_EGUx EGU instance. + * @param egu_task EGU task. + */ +__STATIC_INLINE void nrf_egu_task_trigger(NRF_EGU_Type * NRF_EGUx, nrf_egu_task_t egu_task); + +/** + * @brief Function for returning the address of a specific EGU task register. + * + * @param NRF_EGUx EGU instance. + * @param egu_task EGU task. + */ +__STATIC_INLINE uint32_t * nrf_egu_task_address_get(NRF_EGU_Type * NRF_EGUx, + nrf_egu_task_t egu_task); + +/** + * @brief Function for returning the address of a specific EGU TRIGGER task register. + * + * @param NRF_EGUx EGU instance. + * @param channel Channel number. + */ +__STATIC_INLINE uint32_t * nrf_egu_task_trigger_address_get(NRF_EGU_Type * NRF_EGUx, + uint8_t channel); + +/** + * @brief Function for returning the specific EGU TRIGGER task. + * + * @param NRF_EGUx EGU instance. + * @param channel Channel number. + */ +__STATIC_INLINE nrf_egu_task_t nrf_egu_task_trigger_get(NRF_EGU_Type * NRF_EGUx, uint8_t channel); + +/** + * @brief Function for returning the state of a specific EGU event. + * + * @param NRF_EGUx EGU instance. + * @param egu_event EGU event to check. + */ +__STATIC_INLINE bool nrf_egu_event_check(NRF_EGU_Type * NRF_EGUx, + nrf_egu_event_t egu_event); + +/** + * @brief Function for clearing a specific EGU event. + * + * @param NRF_EGUx EGU instance. + * @param egu_event EGU event to clear. + */ +__STATIC_INLINE void nrf_egu_event_clear(NRF_EGU_Type * NRF_EGUx, + nrf_egu_event_t egu_event); + +/** + * @brief Function for returning the address of a specific EGU event register. + * + * @param NRF_EGUx EGU instance. + * @param egu_event EGU event. + */ +__STATIC_INLINE uint32_t * nrf_egu_event_address_get(NRF_EGU_Type * NRF_EGUx, + nrf_egu_event_t egu_event); + +/** + * @brief Function for returning the address of a specific EGU TRIGGERED event register. + * + * @param NRF_EGUx EGU instance. + * @param channel Channel number. + */ +__STATIC_INLINE uint32_t * nrf_egu_event_triggered_address_get(NRF_EGU_Type * NRF_EGUx, + uint8_t channel); + +/** + * @brief Function for returning the specific EGU TRIGGERED event. + * + * @param NRF_EGUx EGU instance. + * @param channel Channel number. + */ +__STATIC_INLINE nrf_egu_event_t nrf_egu_event_triggered_get(NRF_EGU_Type * NRF_EGUx, + uint8_t channel); + +/** + * @brief Function for enabling one or more specific EGU interrupts. + * + * @param NRF_EGUx EGU instance. + * @param egu_int_mask Interrupts to enable. + */ +__STATIC_INLINE void nrf_egu_int_enable(NRF_EGU_Type * NRF_EGUx, uint32_t egu_int_mask); + +/** + * @brief Function for retrieving the state of one or more EGU interrupts. + * + * @param NRF_EGUx EGU instance. + * @param egu_int_mask Interrupts to check. + * + * @retval true If all of the specified interrupts are enabled. + * @retval false If at least one of the specified interrupts is disabled. + */ +__STATIC_INLINE bool nrf_egu_int_enable_check(NRF_EGU_Type * NRF_EGUx, uint32_t egu_int_mask); + +/** + * @brief Function for disabling one or more specific EGU interrupts. + * + * @param NRF_EGUx EGU instance. + * @param egu_int_mask Interrupts to disable. + */ +__STATIC_INLINE void nrf_egu_int_disable(NRF_EGU_Type * NRF_EGUx, uint32_t egu_int_mask); + +/** + * @brief Function for retrieving one or more specific EGU interrupts. + * + * @param NRF_EGUx EGU instance. + * @param channel Channel number. + * + * @returns EGU interrupt mask. + */ +__STATIC_INLINE nrf_egu_int_mask_t nrf_egu_int_get(NRF_EGU_Type * NRF_EGUx, uint8_t channel); + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION + __STATIC_INLINE uint32_t nrf_egu_channel_count(NRF_EGU_Type * NRF_EGUx) { if (NRF_EGUx == NRF_EGU0){ @@ -169,86 +284,45 @@ __STATIC_INLINE uint32_t nrf_egu_channel_count(NRF_EGU_Type * NRF_EGUx) return 0; } -/** - * @brief Function for triggering a specific EGU task. - * - * @param NRF_EGUx EGU instance. - * @param egu_task EGU task. - */ __STATIC_INLINE void nrf_egu_task_trigger(NRF_EGU_Type * NRF_EGUx, nrf_egu_task_t egu_task) { - ASSERT(NRF_EGUx); + NRFX_ASSERT(NRF_EGUx); *((volatile uint32_t *)((uint8_t *)NRF_EGUx + (uint32_t)egu_task)) = 0x1UL; } - -/** - * @brief Function for returning the address of a specific EGU task register. - * - * @param NRF_EGUx EGU instance. - * @param egu_task EGU task. - */ __STATIC_INLINE uint32_t * nrf_egu_task_address_get(NRF_EGU_Type * NRF_EGUx, nrf_egu_task_t egu_task) { - ASSERT(NRF_EGUx); + NRFX_ASSERT(NRF_EGUx); return (uint32_t *)((uint8_t *)NRF_EGUx + (uint32_t)egu_task); } - -/** - * @brief Function for returning the address of a specific EGU TRIGGER task register. - * - * @param NRF_EGUx EGU instance. - * @param channel Channel number. - */ __STATIC_INLINE uint32_t * nrf_egu_task_trigger_address_get(NRF_EGU_Type * NRF_EGUx, - uint8_t channel) + uint8_t channel) { - ASSERT(NRF_EGUx); - ASSERT(channel < nrf_egu_channel_count(NRF_EGUx)); + NRFX_ASSERT(NRF_EGUx); + NRFX_ASSERT(channel < nrf_egu_channel_count(NRF_EGUx)); return (uint32_t*)&NRF_EGUx->TASKS_TRIGGER[channel]; } - -/** - * @brief Function for returning the specific EGU TRIGGER task. - * - * @param NRF_EGUx EGU instance. - * @param channel Channel number. - */ __STATIC_INLINE nrf_egu_task_t nrf_egu_task_trigger_get(NRF_EGU_Type * NRF_EGUx, uint8_t channel) { - ASSERT(NRF_EGUx); - ASSERT(channel < nrf_egu_channel_count(NRF_EGUx)); + NRFX_ASSERT(NRF_EGUx); + NRFX_ASSERT(channel < nrf_egu_channel_count(NRF_EGUx)); return (nrf_egu_task_t)((uint32_t) NRF_EGU_TASK_TRIGGER0 + (channel * sizeof(uint32_t))); } - -/** - * @brief Function for returning the state of a specific EGU event. - * - * @param NRF_EGUx EGU instance. - * @param egu_event EGU event to check. - */ __STATIC_INLINE bool nrf_egu_event_check(NRF_EGU_Type * NRF_EGUx, nrf_egu_event_t egu_event) { - ASSERT(NRF_EGUx); + NRFX_ASSERT(NRF_EGUx); return (bool)*(volatile uint32_t *)((uint8_t *)NRF_EGUx + (uint32_t)egu_event); } - -/** - * @brief Function for clearing a specific EGU event. - * - * @param NRF_EGUx EGU instance. - * @param egu_event EGU event to clear. - */ __STATIC_INLINE void nrf_egu_event_clear(NRF_EGU_Type * NRF_EGUx, nrf_egu_event_t egu_event) { - ASSERT(NRF_EGUx); + NRFX_ASSERT(NRF_EGUx); *((volatile uint32_t *)((uint8_t *)NRF_EGUx + (uint32_t)egu_event)) = 0x0UL; #if __CORTEX_M == 0x04 volatile uint32_t dummy = *((volatile uint32_t *)((uint8_t *)NRF_EGUx + (uint32_t)egu_event)); @@ -256,109 +330,57 @@ __STATIC_INLINE void nrf_egu_event_clear(NRF_EGU_Type * NRF_EGUx, #endif } - -/** - * @brief Function for returning the address of a specific EGU event register. - * - * @param NRF_EGUx EGU instance. - * @param egu_event EGU event. - */ __STATIC_INLINE uint32_t * nrf_egu_event_address_get(NRF_EGU_Type * NRF_EGUx, nrf_egu_event_t egu_event) { - ASSERT(NRF_EGUx); + NRFX_ASSERT(NRF_EGUx); return (uint32_t *)((uint8_t *)NRF_EGUx + (uint32_t)egu_event); } - -/** - * @brief Function for returning the address of a specific EGU TRIGGERED event register. - * - * @param NRF_EGUx EGU instance. - * @param channel Channel number. - */ __STATIC_INLINE uint32_t * nrf_egu_event_triggered_address_get(NRF_EGU_Type * NRF_EGUx, - uint8_t channel) + uint8_t channel) { - ASSERT(NRF_EGUx); - ASSERT(channel < nrf_egu_channel_count(NRF_EGUx)); + NRFX_ASSERT(NRF_EGUx); + NRFX_ASSERT(channel < nrf_egu_channel_count(NRF_EGUx)); return (uint32_t*)&NRF_EGUx->EVENTS_TRIGGERED[channel]; } - -/** - * @brief Function for returning the specific EGU TRIGGERED event. - * - * @param NRF_EGUx EGU instance. - * @param channel Channel number. - */ __STATIC_INLINE nrf_egu_event_t nrf_egu_event_triggered_get(NRF_EGU_Type * NRF_EGUx, uint8_t channel) { - ASSERT(NRF_EGUx); - ASSERT(channel < nrf_egu_channel_count(NRF_EGUx)); + NRFX_ASSERT(NRF_EGUx); + NRFX_ASSERT(channel < nrf_egu_channel_count(NRF_EGUx)); return (nrf_egu_event_t)((uint32_t) NRF_EGU_EVENT_TRIGGERED0 + (channel * sizeof(uint32_t))); } - -/** - * @brief Function for enabling one or more specific EGU interrupts. - * - * @param NRF_EGUx EGU instance. - * @param egu_int_mask Interrupts to enable. - */ __STATIC_INLINE void nrf_egu_int_enable(NRF_EGU_Type * NRF_EGUx, uint32_t egu_int_mask) { - ASSERT(NRF_EGUx); + NRFX_ASSERT(NRF_EGUx); NRF_EGUx->INTENSET = egu_int_mask; } - -/** - * @brief Function for retrieving the state of one or more EGU interrupts. - * - * @param NRF_EGUx EGU instance. - * @param egu_int_mask Interrupts to check. - * - * @retval true If all of the specified interrupts are enabled. - * @retval false If at least one of the specified interrupts is disabled. - */ __STATIC_INLINE bool nrf_egu_int_enable_check(NRF_EGU_Type * NRF_EGUx, uint32_t egu_int_mask) { - ASSERT(NRF_EGUx); + NRFX_ASSERT(NRF_EGUx); return (bool)(NRF_EGUx->INTENSET & egu_int_mask); } - -/** - * @brief Function for disabling one or more specific EGU interrupts. - * - * @param NRF_EGUx EGU instance. - * @param egu_int_mask Interrupts to disable. - */ __STATIC_INLINE void nrf_egu_int_disable(NRF_EGU_Type * NRF_EGUx, uint32_t egu_int_mask) { - ASSERT(NRF_EGUx); + NRFX_ASSERT(NRF_EGUx); NRF_EGUx->INTENCLR = egu_int_mask; } -/** - * @brief Function for retrieving one or more specific EGU interrupts. - * - * @param NRF_EGUx EGU instance. - * @param channel Channel number. - * - * @returns EGU interrupt mask. - */ __STATIC_INLINE nrf_egu_int_mask_t nrf_egu_int_get(NRF_EGU_Type * NRF_EGUx, uint8_t channel) { - ASSERT(NRF_EGUx); - ASSERT(channel < nrf_egu_channel_count(NRF_EGUx)); + NRFX_ASSERT(NRF_EGUx); + NRFX_ASSERT(channel < nrf_egu_channel_count(NRF_EGUx)); return (nrf_egu_int_mask_t)((uint32_t) (EGU_INTENSET_TRIGGERED0_Msk << channel)); } -/** @} */ +#endif // SUPPRESS_INLINE_IMPLEMENTATION +/** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_gpio.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_gpio.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_gpio.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_gpio.h index ccd408c0ad..09113205fe 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_gpio.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_gpio.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,24 +37,21 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ + #ifndef NRF_GPIO_H__ #define NRF_GPIO_H__ -#include "nrf.h" -#include "nrf_peripherals.h" -#include "nrf_assert.h" -#include -#include +#include #ifdef __cplusplus extern "C" { #endif /** - * @defgroup nrf_gpio GPIO abstraction + * @defgroup nrf_gpio_hal GPIO HAL * @{ - * @ingroup nrf_drivers - * @brief GPIO pin abstraction and port abstraction for reading and writing byte-wise to GPIO ports. + * @ingroup nrf_gpio + * @brief Hardware access layer for managing the GPIO peripheral. */ #if (GPIO_COUNT == 1) @@ -71,7 +68,7 @@ extern "C" { /** * @brief Macro for mapping port and pin numbers to values understandable for nrf_gpio functions. */ -#define NRF_GPIO_PIN_MAP(port, pin) ((port << 5) | (pin & 0x1F)) +#define NRF_GPIO_PIN_MAP(port, pin) (((port) << 5) | ((pin) & 0x1F)) /** * @brief Pin direction definitions. @@ -126,9 +123,6 @@ typedef enum NRF_GPIO_PIN_SENSE_HIGH = GPIO_PIN_CNF_SENSE_High, ///< Pin sense high level. } nrf_gpio_pin_sense_t; - -#if (__LINT__ != 1) - /** * @brief Function for configuring the GPIO pin range as output pins with normal drive strength. * This function can be used to configure pin range as simple output with gate driving GPIO_PIN_CNF_DRIVE_S0S1 (normal cases). @@ -417,7 +411,7 @@ __STATIC_INLINE void nrf_gpio_port_out_clear(NRF_GPIO_Type * p_reg, uint32_t clr */ __STATIC_INLINE void nrf_gpio_ports_read(uint32_t start_port, uint32_t length, uint32_t * p_masks); -#ifdef GPIO_DETECTMODE_DETECTMODE_LDETECT +#if defined(GPIO_DETECTMODE_DETECTMODE_LDETECT) || defined(__NRF_DOXYGEN__) /** * @brief Function for reading latch state of multiple consecutive ports. * @@ -446,9 +440,6 @@ __STATIC_INLINE uint32_t nrf_gpio_pin_latch_get(uint32_t pin_number); __STATIC_INLINE void nrf_gpio_pin_latch_clear(uint32_t pin_number); #endif - -#endif // #ifndef (__LINT__ != 1) - #ifndef SUPPRESS_INLINE_IMPLEMENTATION /** @@ -461,7 +452,7 @@ __STATIC_INLINE void nrf_gpio_pin_latch_clear(uint32_t pin_number); */ __STATIC_INLINE NRF_GPIO_Type * nrf_gpio_pin_port_decode(uint32_t * p_pin) { - ASSERT(*p_pin < NUMBER_OF_PINS); + NRFX_ASSERT(*p_pin < NUMBER_OF_PINS); #if (GPIO_COUNT == 1) // The oldest definition case return NRF_GPIO; @@ -741,7 +732,7 @@ __STATIC_INLINE void nrf_gpio_ports_read(uint32_t start_port, uint32_t length, u { NRF_GPIO_Type * gpio_regs[GPIO_COUNT] = GPIO_REG_LIST; - ASSERT(start_port + length <= GPIO_COUNT); + NRFX_ASSERT(start_port + length <= GPIO_COUNT); uint32_t i; for (i = start_port; i < (start_port + length); i++) @@ -787,9 +778,8 @@ __STATIC_INLINE void nrf_gpio_pin_latch_clear(uint32_t pin_number) /** @} */ - #ifdef __cplusplus } #endif -#endif +#endif // NRF_GPIO_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_gpiote.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_gpiote.h similarity index 96% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_gpiote.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_gpiote.h index df9bd35ce6..91faf9fcc2 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_gpiote.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_gpiote.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,30 +37,28 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ + #ifndef NRF_GPIOTE_H__ #define NRF_GPIOTE_H__ -#include "nrf_peripherals.h" -#include "nrf.h" -#include -#include -#include +#include #ifdef __cplusplus extern "C" { #endif +/** +* @defgroup nrf_gpiote_hal GPIOTE HAL +* @{ +* @ingroup nrf_gpiote +* @brief Hardware access layer for managing the GPIOTE peripheral. +*/ + #ifdef GPIOTE_CONFIG_PORT_Msk #define GPIOTE_CONFIG_PORT_PIN_Msk (GPIOTE_CONFIG_PORT_Msk | GPIOTE_CONFIG_PSEL_Msk) #else #define GPIOTE_CONFIG_PORT_PIN_Msk GPIOTE_CONFIG_PSEL_Msk #endif -/** -* @defgroup nrf_gpiote_abs GPIOTE abstraction -* @{ -* @ingroup nrf_gpiote -* @brief GPIOTE abstraction for configuration of channels. -*/ /** * @enum nrf_gpiote_polarity_t @@ -93,13 +91,13 @@ typedef enum /*lint -save -e30 -esym(628,__INTADDR__) */ NRF_GPIOTE_TASKS_OUT_1 = offsetof(NRF_GPIOTE_Type, TASKS_OUT[1]), /**< Out task 1.*/ NRF_GPIOTE_TASKS_OUT_2 = offsetof(NRF_GPIOTE_Type, TASKS_OUT[2]), /**< Out task 2.*/ NRF_GPIOTE_TASKS_OUT_3 = offsetof(NRF_GPIOTE_Type, TASKS_OUT[3]), /**< Out task 3.*/ -#if (GPIOTE_CH_NUM > 4) || defined(__SDK_DOXYGEN__) +#if (GPIOTE_CH_NUM > 4) || defined(__NRFX_DOXYGEN__) NRF_GPIOTE_TASKS_OUT_4 = offsetof(NRF_GPIOTE_Type, TASKS_OUT[4]), /**< Out task 4.*/ NRF_GPIOTE_TASKS_OUT_5 = offsetof(NRF_GPIOTE_Type, TASKS_OUT[5]), /**< Out task 5.*/ NRF_GPIOTE_TASKS_OUT_6 = offsetof(NRF_GPIOTE_Type, TASKS_OUT[6]), /**< Out task 6.*/ NRF_GPIOTE_TASKS_OUT_7 = offsetof(NRF_GPIOTE_Type, TASKS_OUT[7]), /**< Out task 7.*/ #endif -#if defined(GPIOTE_FEATURE_SET_PRESENT) || defined(__SDK_DOXYGEN__) +#if defined(GPIOTE_FEATURE_SET_PRESENT) || defined(__NRFX_DOXYGEN__) NRF_GPIOTE_TASKS_SET_0 = offsetof(NRF_GPIOTE_Type, TASKS_SET[0]), /**< Set task 0.*/ NRF_GPIOTE_TASKS_SET_1 = offsetof(NRF_GPIOTE_Type, TASKS_SET[1]), /**< Set task 1.*/ NRF_GPIOTE_TASKS_SET_2 = offsetof(NRF_GPIOTE_Type, TASKS_SET[2]), /**< Set task 2.*/ @@ -109,7 +107,7 @@ typedef enum /*lint -save -e30 -esym(628,__INTADDR__) */ NRF_GPIOTE_TASKS_SET_6 = offsetof(NRF_GPIOTE_Type, TASKS_SET[6]), /**< Set task 6.*/ NRF_GPIOTE_TASKS_SET_7 = offsetof(NRF_GPIOTE_Type, TASKS_SET[7]), /**< Set task 7.*/ #endif -#if defined(GPIOTE_FEATURE_CLR_PRESENT) || defined(__SDK_DOXYGEN__) +#if defined(GPIOTE_FEATURE_CLR_PRESENT) || defined(__NRFX_DOXYGEN__) NRF_GPIOTE_TASKS_CLR_0 = offsetof(NRF_GPIOTE_Type, TASKS_CLR[0]), /**< Clear task 0.*/ NRF_GPIOTE_TASKS_CLR_1 = offsetof(NRF_GPIOTE_Type, TASKS_CLR[1]), /**< Clear task 1.*/ NRF_GPIOTE_TASKS_CLR_2 = offsetof(NRF_GPIOTE_Type, TASKS_CLR[2]), /**< Clear task 2.*/ @@ -131,7 +129,7 @@ typedef enum /*lint -save -e30 -esym(628,__INTADDR__) */ NRF_GPIOTE_EVENTS_IN_1 = offsetof(NRF_GPIOTE_Type, EVENTS_IN[1]), /**< In event 1.*/ NRF_GPIOTE_EVENTS_IN_2 = offsetof(NRF_GPIOTE_Type, EVENTS_IN[2]), /**< In event 2.*/ NRF_GPIOTE_EVENTS_IN_3 = offsetof(NRF_GPIOTE_Type, EVENTS_IN[3]), /**< In event 3.*/ -#if (GPIOTE_CH_NUM > 4) || defined(__SDK_DOXYGEN__) +#if (GPIOTE_CH_NUM > 4) || defined(__NRFX_DOXYGEN__) NRF_GPIOTE_EVENTS_IN_4 = offsetof(NRF_GPIOTE_Type, EVENTS_IN[4]), /**< In event 4.*/ NRF_GPIOTE_EVENTS_IN_5 = offsetof(NRF_GPIOTE_Type, EVENTS_IN[5]), /**< In event 5.*/ NRF_GPIOTE_EVENTS_IN_6 = offsetof(NRF_GPIOTE_Type, EVENTS_IN[6]), /**< In event 6.*/ @@ -151,7 +149,7 @@ typedef enum NRF_GPIOTE_INT_IN1_MASK = GPIOTE_INTENSET_IN1_Msk, /**< GPIOTE interrupt from IN1. */ NRF_GPIOTE_INT_IN2_MASK = GPIOTE_INTENSET_IN2_Msk, /**< GPIOTE interrupt from IN2. */ NRF_GPIOTE_INT_IN3_MASK = GPIOTE_INTENSET_IN3_Msk, /**< GPIOTE interrupt from IN3. */ -#if (GPIOTE_CH_NUM > 4) || defined(__SDK_DOXYGEN__) +#if (GPIOTE_CH_NUM > 4) || defined(__NRFX_DOXYGEN__) NRF_GPIOTE_INT_IN4_MASK = GPIOTE_INTENSET_IN4_Msk, /**< GPIOTE interrupt from IN4. */ NRF_GPIOTE_INT_IN5_MASK = GPIOTE_INTENSET_IN5_Msk, /**< GPIOTE interrupt from IN5. */ NRF_GPIOTE_INT_IN6_MASK = GPIOTE_INTENSET_IN6_Msk, /**< GPIOTE interrupt from IN6. */ @@ -420,8 +418,8 @@ __STATIC_INLINE void nrf_gpiote_te_default(uint32_t idx) NRF_GPIOTE->CONFIG[idx] = 0; } #endif //SUPPRESS_INLINE_IMPLEMENTATION -/** @} */ +/** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_i2s.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_i2s.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_i2s.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_i2s.h index d5485572b5..ab698e5921 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_i2s.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_i2s.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,27 +37,22 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @defgroup nrf_i2s_hal I2S HAL - * @{ - * @ingroup nrf_i2s - * - * @brief @tagAPI52 Hardware access layer for managing the Inter-IC Sound (I2S) peripheral. - */ #ifndef NRF_I2S_H__ #define NRF_I2S_H__ -#include -#include -#include - -#include "nrf.h" +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_i2s_hal I2S HAL + * @{ + * @ingroup nrf_i2s + * @brief Hardware access layer for managing the Inter-IC Sound (I2S) peripheral. + */ /** * @brief This value can be provided as a parameter for the @ref nrf_i2s_pins_set @@ -553,11 +548,10 @@ __STATIC_INLINE uint32_t * nrf_i2s_tx_buffer_get(NRF_I2S_Type const * p_i2s) #endif // SUPPRESS_INLINE_IMPLEMENTATION +/** @} */ #ifdef __cplusplus } #endif #endif // NRF_I2S_H__ - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_lpcomp.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_lpcomp.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_lpcomp.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_lpcomp.h index 4e241a9779..c10a909a02 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_lpcomp.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_lpcomp.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,39 +37,30 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @file - * @brief LPCOMP HAL API. - */ #ifndef NRF_LPCOMP_H_ #define NRF_LPCOMP_H_ +#include + +#ifdef __cplusplus +extern "C" { +#endif + /** * @defgroup nrf_lpcomp_hal LPCOMP HAL * @{ * @ingroup nrf_lpcomp - * @brief Hardware access layer for managing the Low Power Comparator (LPCOMP). + * @brief Hardware access layer for managing the Low Power Comparator (LPCOMP) peripheral. */ -#include "nrf.h" -#include "nrf_peripherals.h" - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - /** * @enum nrf_lpcomp_ref_t * @brief LPCOMP reference selection. */ typedef enum { -#if (LPCOMP_REFSEL_RESOLUTION == 8) || defined(__SDK_DOXYGEN__) +#if (LPCOMP_REFSEL_RESOLUTION == 8) || defined(__NRFX_DOXYGEN__) NRF_LPCOMP_REF_SUPPLY_1_8 = LPCOMP_REFSEL_REFSEL_SupplyOneEighthPrescaling, /**< Use supply with a 1/8 prescaler as reference. */ NRF_LPCOMP_REF_SUPPLY_2_8 = LPCOMP_REFSEL_REFSEL_SupplyTwoEighthsPrescaling, /**< Use supply with a 2/8 prescaler as reference. */ NRF_LPCOMP_REF_SUPPLY_3_8 = LPCOMP_REFSEL_REFSEL_SupplyThreeEighthsPrescaling, /**< Use supply with a 3/8 prescaler as reference. */ @@ -77,7 +68,7 @@ typedef enum NRF_LPCOMP_REF_SUPPLY_5_8 = LPCOMP_REFSEL_REFSEL_SupplyFiveEighthsPrescaling, /**< Use supply with a 5/8 prescaler as reference. */ NRF_LPCOMP_REF_SUPPLY_6_8 = LPCOMP_REFSEL_REFSEL_SupplySixEighthsPrescaling, /**< Use supply with a 6/8 prescaler as reference. */ NRF_LPCOMP_REF_SUPPLY_7_8 = LPCOMP_REFSEL_REFSEL_SupplySevenEighthsPrescaling, /**< Use supply with a 7/8 prescaler as reference. */ -#elif (LPCOMP_REFSEL_RESOLUTION == 16) || defined(__SDK_DOXYGEN__) +#elif (LPCOMP_REFSEL_RESOLUTION == 16) || defined(__NRFX_DOXYGEN__) NRF_LPCOMP_REF_SUPPLY_1_8 = LPCOMP_REFSEL_REFSEL_Ref1_8Vdd, /**< Use supply with a 1/8 prescaler as reference. */ NRF_LPCOMP_REF_SUPPLY_2_8 = LPCOMP_REFSEL_REFSEL_Ref2_8Vdd, /**< Use supply with a 2/8 prescaler as reference. */ NRF_LPCOMP_REF_SUPPLY_3_8 = LPCOMP_REFSEL_REFSEL_Ref3_8Vdd, /**< Use supply with a 3/8 prescaler as reference. */ @@ -412,11 +403,7 @@ __STATIC_INLINE bool nrf_lpcomp_event_check(nrf_lpcomp_event_t lpcomp_event) return (bool) (*(volatile uint32_t *)( (uint8_t *)NRF_LPCOMP + lpcomp_event)); } - -/** - *@} - **/ - +/** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_nvmc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_nvmc.c similarity index 91% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_nvmc.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_nvmc.c index ccae784b64..99fc64f85e 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_nvmc.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_nvmc.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -42,17 +42,14 @@ *@brief NMVC driver implementation */ -#include -#include "nrf.h" +#include #include "nrf_nvmc.h" - static inline void wait_for_flash_ready(void) { while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {;} } - void nrf_nvmc_page_erase(uint32_t address) { // Enable erase. @@ -78,19 +75,18 @@ void nrf_nvmc_write_byte(uint32_t address, uint8_t value) value32 = value32 + ((uint32_t)value << (byte_shift << 3)); // Enable write. - NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen; + NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos); __ISB(); __DSB(); *(uint32_t*)address32 = value32; wait_for_flash_ready(); - NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren; + NRF_NVMC->CONFIG = (NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos); __ISB(); __DSB(); } - void nrf_nvmc_write_word(uint32_t address, uint32_t value) { // Enable write. @@ -106,24 +102,25 @@ void nrf_nvmc_write_word(uint32_t address, uint32_t value) __DSB(); } - void nrf_nvmc_write_bytes(uint32_t address, const uint8_t * src, uint32_t num_bytes) { - for (uint32_t i = 0; i < num_bytes; i++) + uint32_t i; + for (i = 0; i < num_bytes; i++) { - nrf_nvmc_write_byte(address + i, src[i]); + nrf_nvmc_write_byte(address + i,src[i]); } } - void nrf_nvmc_write_words(uint32_t address, const uint32_t * src, uint32_t num_words) { + uint32_t i; + // Enable write. NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen; __ISB(); __DSB(); - for (uint32_t i = 0; i < num_words; i++) + for (i = 0; i < num_words; i++) { ((uint32_t*)address)[i] = src[i]; wait_for_flash_ready(); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_nvmc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_nvmc.h similarity index 93% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_nvmc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_nvmc.h index b31c5b1b32..a0d8de8efd 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_nvmc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_nvmc.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,15 +37,11 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @file - * @brief NMVC driver API. - */ #ifndef NRF_NVMC_H__ #define NRF_NVMC_H__ -#include +#include #ifdef __cplusplus extern "C" { @@ -53,10 +49,10 @@ extern "C" { /** - * @defgroup nrf_nvmc Non-volatile memory controller + * @defgroup nrf_nvmc_hal NVMC HAL * @{ - * @ingroup nrf_drivers - * @brief Driver for the NVMC peripheral. + * @ingroup nrf_nvmc + * @brief Hardware access layer for managing the Non-Volatile Memory Controller (NVMC) peripheral. * * This driver allows writing to the non-volatile memory (NVM) regions * of the chip. In order to write to NVM the controller must be powered @@ -114,12 +110,10 @@ void nrf_nvmc_write_bytes(uint32_t address, const uint8_t * src, uint32_t num_b void nrf_nvmc_write_words(uint32_t address, const uint32_t * src, uint32_t num_words); +/** @} */ #ifdef __cplusplus } #endif #endif // NRF_NVMC_H__ -/** @} */ - - diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_pdm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_pdm.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_pdm.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_pdm.h index 7937d75687..5f183140e4 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_pdm.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_pdm.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -40,23 +40,18 @@ #ifndef NRF_PDM_H_ #define NRF_PDM_H_ -/** - * @defgroup nrf_pdm_hal PDM HAL - * @{ - * @ingroup nrf_pdm - * - * @brief @tagAPI52 Hardware abstraction layer for accessing the pulse density modulation (PDM) peripheral. - */ - -#include -#include -#include "nrf.h" -#include "nrf_assert.h" +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_pdm_hal PDM HAL + * @{ + * @ingroup nrf_pdm + * @brief Hardware access layer for managing the Pulse Density Modulation (PDM) peripheral. + */ #define NRF_PDM_GAIN_MINIMUM 0x00 #define NRF_PDM_GAIN_DEFAULT 0x28 @@ -383,11 +378,7 @@ __STATIC_INLINE uint32_t * nrf_pdm_buffer_get() return (uint32_t *)NRF_PDM->SAMPLE.PTR; } - -/** - *@} - **/ - +/** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_power.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_power.h similarity index 96% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_power.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_power.h index 13116cfee7..9082d82ce0 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_power.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_power.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -41,25 +41,19 @@ #ifndef NRF_POWER_H__ #define NRF_POWER_H__ -/** - * @ingroup nrf_power - * @defgroup nrf_power_hal POWER HAL - * @{ - * - * Hardware access layer for (POWER) peripheral. - */ -#include "nrf.h" -#include "sdk_config.h" -#include "nordic_common.h" -#include "nrf_assert.h" -#include -#include -#include +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_power_hal POWER HAL + * @{ + * @ingroup nrf_power + * @brief Hardware access layer for managing the POWER peripheral. + */ + #if defined(POWER_RAMSTATUS_RAMBLOCK0_Msk) #define NRF_POWER_HAS_RAMSTATUS 1 #else @@ -72,7 +66,7 @@ extern "C" { * * Macros that defines functionality that is implemented into POWER peripheral. */ -#if defined(POWER_INTENSET_SLEEPENTER_Msk) || defined(__SDK_DOXYGEN__) +#if defined(POWER_INTENSET_SLEEPENTER_Msk) || defined(__NRFX_DOXYGEN__) /** * @brief The fact that sleep events are present * @@ -84,7 +78,7 @@ extern "C" { #define NRF_POWER_HAS_SLEEPEVT 0 #endif -#if defined(POWER_RAM_POWER_S0POWER_Msk) || defined(__SDK_DOXYGEN__) +#if defined(POWER_RAM_POWER_S0POWER_Msk) || defined(__NRFX_DOXYGEN__) /** * @brief The fact that RAMPOWER registers are present * @@ -98,7 +92,7 @@ extern "C" { #define NRF_POWER_HAS_RAMPOWER_REGS 0 #endif -#if defined(POWER_POFCON_THRESHOLDVDDH_Msk) || defined(__SDK_DOXYGEN__) +#if defined(POWER_POFCON_THRESHOLDVDDH_Msk) || defined(__NRFX_DOXYGEN__) /** * @brief Auxiliary definition to mark the fact that VDDH is present * @@ -110,7 +104,7 @@ extern "C" { #define NRF_POWER_HAS_VDDH 0 #endif -#if defined(POWER_USBREGSTATUS_VBUSDETECT_Msk) || defined(__SDK_DOXYGEN__) +#if defined(POWER_USBREGSTATUS_VBUSDETECT_Msk) || defined(__NRFX_DOXYGEN__) /** * @brief The fact that power module manages USB regulator * @@ -377,14 +371,14 @@ typedef enum NRF_POWER_RESETREAS_SREQ_MASK = POWER_RESETREAS_SREQ_Msk , /*!< Bit mask of SREQ field. */ //!< NRF_POWER_RESETREAS_SREQ_MASK NRF_POWER_RESETREAS_LOCKUP_MASK = POWER_RESETREAS_LOCKUP_Msk , /*!< Bit mask of LOCKUP field. */ //!< NRF_POWER_RESETREAS_LOCKUP_MASK NRF_POWER_RESETREAS_OFF_MASK = POWER_RESETREAS_OFF_Msk , /*!< Bit mask of OFF field. */ //!< NRF_POWER_RESETREAS_OFF_MASK -#if defined(POWER_RESETREAS_LPCOMP_Msk) || defined(__SDK_DOXYGEN__) +#if defined(POWER_RESETREAS_LPCOMP_Msk) || defined(__NRFX_DOXYGEN__) NRF_POWER_RESETREAS_LPCOMP_MASK = POWER_RESETREAS_LPCOMP_Msk , /*!< Bit mask of LPCOMP field. */ //!< NRF_POWER_RESETREAS_LPCOMP_MASK #endif NRF_POWER_RESETREAS_DIF_MASK = POWER_RESETREAS_DIF_Msk , /*!< Bit mask of DIF field. */ //!< NRF_POWER_RESETREAS_DIF_MASK -#if defined(POWER_RESETREAS_NFC_Msk) || defined(__SDK_DOXYGEN__) +#if defined(POWER_RESETREAS_NFC_Msk) || defined(__NRFX_DOXYGEN__) NRF_POWER_RESETREAS_NFC_MASK = POWER_RESETREAS_NFC_Msk , /*!< Bit mask of NFC field. */ #endif -#if defined(POWER_RESETREAS_VBUS_Msk) || defined(__SDK_DOXYGEN__) +#if defined(POWER_RESETREAS_VBUS_Msk) || defined(__NRFX_DOXYGEN__) NRF_POWER_RESETREAS_VBUS_MASK = POWER_RESETREAS_VBUS_Msk , /*!< Bit mask of VBUS field. */ #endif }nrf_power_resetreas_mask_t; @@ -427,7 +421,6 @@ typedef enum * * @sa nrf_power_ramblock_t */ - typedef enum { NRF_POWER_RAMBLOCK0_MASK = POWER_RAMSTATUS_RAMBLOCK0_Msk, @@ -480,7 +473,7 @@ typedef enum NRF_POWER_POFTHR_V23 = POWER_POFCON_THRESHOLD_V23, /**< Set threshold to 2.3 V */ NRF_POWER_POFTHR_V25 = POWER_POFCON_THRESHOLD_V25, /**< Set threshold to 2.5 V */ NRF_POWER_POFTHR_V27 = POWER_POFCON_THRESHOLD_V27, /**< Set threshold to 2.7 V */ -#if defined(POWER_POFCON_THRESHOLD_V17) || defined(__SDK_DOXYGEN__) +#if defined(POWER_POFCON_THRESHOLD_V17) || defined(__NRFX_DOXYGEN__) NRF_POWER_POFTHR_V17 = POWER_POFCON_THRESHOLD_V17, /**< Set threshold to 1.7 V */ NRF_POWER_POFTHR_V18 = POWER_POFCON_THRESHOLD_V18, /**< Set threshold to 1.8 V */ NRF_POWER_POFTHR_V19 = POWER_POFCON_THRESHOLD_V19, /**< Set threshold to 1.9 V */ @@ -723,7 +716,7 @@ __STATIC_INLINE void nrf_power_gpregret_set(uint8_t val); */ __STATIC_INLINE uint8_t nrf_power_gpregret_get(void); -#if defined(POWER_GPREGRET2_GPREGRET_Msk) || defined(__SDK_DOXYGEN__) +#if defined(POWER_GPREGRET2_GPREGRET_Msk) || defined(__NRFX_DOXYGEN__) /** * @brief Set general purpose retention register 2 * @@ -863,8 +856,6 @@ __STATIC_INLINE bool nrf_power_usbregstatus_vbusdet_get(void); __STATIC_INLINE bool nrf_power_usbregstatus_outrdy_get(void); #endif /* NRF_POWER_HAS_USBREG */ -/** @} */ - #ifndef SUPPRESS_INLINE_IMPLEMENTATION __STATIC_INLINE uint32_t nrf_power_resetreas_get(void) @@ -898,7 +889,7 @@ __STATIC_INLINE void nrf_power_system_off(void) __STATIC_INLINE void nrf_power_pofcon_set(bool enabled, nrf_power_pof_thr_t thr) { - ASSERT(thr == (thr & (POWER_POFCON_THRESHOLD_Msk >> POWER_POFCON_THRESHOLD_Pos))); + NRFX_ASSERT(thr == (thr & (POWER_POFCON_THRESHOLD_Msk >> POWER_POFCON_THRESHOLD_Pos))); #if NRF_POWER_HAS_VDDH uint32_t pofcon = NRF_POWER->POFCON; pofcon &= ~(POWER_POFCON_THRESHOLD_Msk | POWER_POFCON_POF_Msk); @@ -931,7 +922,7 @@ __STATIC_INLINE nrf_power_pof_thr_t nrf_power_pofcon_get(bool * p_enabled) #if NRF_POWER_HAS_VDDH __STATIC_INLINE void nrf_power_pofcon_vddh_set(nrf_power_pof_thrvddh_t thr) { - ASSERT(thr == (thr & (POWER_POFCON_THRESHOLDVDDH_Msk >> POWER_POFCON_THRESHOLDVDDH_Pos))); + NRFX_ASSERT(thr == (thr & (POWER_POFCON_THRESHOLDVDDH_Msk >> POWER_POFCON_THRESHOLDVDDH_Pos))); uint32_t pofcon = NRF_POWER->POFCON; pofcon &= ~POWER_POFCON_THRESHOLDVDDH_Msk; pofcon |= (((uint32_t)thr) << POWER_POFCON_THRESHOLDVDDH_Pos); @@ -955,7 +946,7 @@ __STATIC_INLINE uint8_t nrf_power_gpregret_get(void) return NRF_POWER->GPREGRET; } -#if defined(POWER_GPREGRET2_GPREGRET_Msk) || defined(__SDK_DOXYGEN__) +#if defined(POWER_GPREGRET2_GPREGRET_Msk) || defined(__NRFX_DOXYGEN__) void nrf_power_gpregret2_set(uint8_t val) { NRF_POWER->GPREGRET2 = val; @@ -996,19 +987,19 @@ __STATIC_INLINE bool nrf_power_dcdcen_get(void) #if NRF_POWER_HAS_RAMPOWER_REGS __STATIC_INLINE void nrf_power_rampower_mask_on(uint8_t block, uint32_t section_mask) { - ASSERT(block < ARRAY_SIZE(NRF_POWER->RAM)); + NRFX_ASSERT(block < ARRAY_SIZE(NRF_POWER->RAM)); NRF_POWER->RAM[block].POWERSET = section_mask; } __STATIC_INLINE void nrf_power_rampower_mask_off(uint8_t block, uint32_t section_mask) { - ASSERT(block < ARRAY_SIZE(NRF_POWER->RAM)); + NRFX_ASSERT(block < ARRAY_SIZE(NRF_POWER->RAM)); NRF_POWER->RAM[block].POWERCLR = section_mask; } __STATIC_INLINE uint32_t nrf_power_rampower_mask_get(uint8_t block) { - ASSERT(block < ARRAY_SIZE(NRF_POWER->RAM)); + NRFX_ASSERT(block < ARRAY_SIZE(NRF_POWER->RAM)); return NRF_POWER->RAM[block].POWER; } #endif /* NRF_POWER_HAS_RAMPOWER_REGS */ @@ -1057,6 +1048,7 @@ __STATIC_INLINE bool nrf_power_usbregstatus_outrdy_get(void) #endif /* SUPPRESS_INLINE_IMPLEMENTATION */ +/** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_ppi.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_ppi.h similarity index 83% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_ppi.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_ppi.h index 945fedc2d8..cdface55e0 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_ppi.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_ppi.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,12 +37,11 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ + #ifndef NRF_PPI_H__ #define NRF_PPI_H__ -#include -#include "nrf.h" -#include "nrf_peripherals.h" +#include #ifdef __cplusplus extern "C" { @@ -52,7 +51,8 @@ extern "C" { * @defgroup nrf_ppi_hal PPI HAL * @{ * @ingroup nrf_ppi - * @brief Hardware access layer for setting up Programmable Peripheral Interconnect (PPI) channels. + * @brief Hardware access layer for managing the Programmable Peripheral Interconnect (PPI) + * channels. */ #define NRF_PPI_TASK_SET (1UL) @@ -79,7 +79,7 @@ typedef enum NRF_PPI_CHANNEL13 = PPI_CHEN_CH13_Pos, /**< Channel 13. */ NRF_PPI_CHANNEL14 = PPI_CHEN_CH14_Pos, /**< Channel 14. */ NRF_PPI_CHANNEL15 = PPI_CHEN_CH15_Pos, /**< Channel 15. */ -#if (PPI_CH_NUM > 16) || defined(__SDK_DOXYGEN__) +#if (PPI_CH_NUM > 16) || defined(__NRFX_DOXYGEN__) NRF_PPI_CHANNEL16 = PPI_CHEN_CH16_Pos, /**< Channel 16. */ NRF_PPI_CHANNEL17 = PPI_CHEN_CH17_Pos, /**< Channel 17. */ NRF_PPI_CHANNEL18 = PPI_CHEN_CH18_Pos, /**< Channel 18. */ @@ -109,7 +109,7 @@ typedef enum NRF_PPI_CHANNEL_GROUP1 = 1, /**< Channel group 1. */ NRF_PPI_CHANNEL_GROUP2 = 2, /**< Channel group 2. */ NRF_PPI_CHANNEL_GROUP3 = 3, /**< Channel group 3. */ -#if (PPI_GROUP_NUM > 4) || defined(__SDK_DOXYGEN__) +#if (PPI_GROUP_NUM > 4) || defined(__NRFX_DOXYGEN__) NRF_PPI_CHANNEL_GROUP4 = 4, /**< Channel group 4. */ NRF_PPI_CHANNEL_GROUP5 = 5 /**< Channel group 5. */ #endif @@ -150,7 +150,7 @@ typedef enum NRF_PPI_TASK_CHG2_DIS = offsetof(NRF_PPI_Type, TASKS_CHG[2].DIS), /**< Task for disabling channel group 2 */ NRF_PPI_TASK_CHG3_EN = offsetof(NRF_PPI_Type, TASKS_CHG[3].EN), /**< Task for enabling channel group 3 */ NRF_PPI_TASK_CHG3_DIS = offsetof(NRF_PPI_Type, TASKS_CHG[3].DIS), /**< Task for disabling channel group 3 */ -#if (PPI_GROUP_NUM > 4) || defined(__SDK_DOXYGEN__) +#if (PPI_GROUP_NUM > 4) || defined(__NRFX_DOXYGEN__) NRF_PPI_TASK_CHG4_EN = offsetof(NRF_PPI_Type, TASKS_CHG[4].EN), /**< Task for enabling channel group 4 */ NRF_PPI_TASK_CHG4_DIS = offsetof(NRF_PPI_Type, TASKS_CHG[4].DIS), /**< Task for disabling channel group 4 */ NRF_PPI_TASK_CHG5_EN = offsetof(NRF_PPI_Type, TASKS_CHG[5].EN), /**< Task for enabling channel group 5 */ @@ -167,11 +167,7 @@ typedef enum * @param[in] channel Channel to enable. * * */ -__STATIC_INLINE void nrf_ppi_channel_enable(nrf_ppi_channel_t channel) -{ - NRF_PPI->CHENSET = PPI_CHENSET_CH0_Set << ((uint32_t) channel); -} - +__STATIC_INLINE void nrf_ppi_channel_enable(nrf_ppi_channel_t channel); /** * @brief Function for disabling a given PPI channel. @@ -180,11 +176,7 @@ __STATIC_INLINE void nrf_ppi_channel_enable(nrf_ppi_channel_t channel) * * @param[in] channel Channel to disable. */ -__STATIC_INLINE void nrf_ppi_channel_disable(nrf_ppi_channel_t channel) -{ - NRF_PPI->CHENCLR = PPI_CHENCLR_CH0_Clear << ((uint32_t) channel); -} - +__STATIC_INLINE void nrf_ppi_channel_disable(nrf_ppi_channel_t channel); /** * @brief Function for checking if a given PPI channel is enabled. @@ -197,36 +189,19 @@ __STATIC_INLINE void nrf_ppi_channel_disable(nrf_ppi_channel_t channel) * @retval NRF_PPI_CHANNEL_DISABLED If the channel is not enabled. * */ -__STATIC_INLINE nrf_ppi_channel_enable_t nrf_ppi_channel_enable_get(nrf_ppi_channel_t channel) -{ - if (NRF_PPI->CHEN & (PPI_CHEN_CH0_Msk << ((uint32_t) channel))) - { - return NRF_PPI_CHANNEL_ENABLED; - } - else - { - return NRF_PPI_CHANNEL_DISABLED; - } -} - +__STATIC_INLINE nrf_ppi_channel_enable_t nrf_ppi_channel_enable_get(nrf_ppi_channel_t channel); /** * @brief Function for disabling all PPI channels. */ -__STATIC_INLINE void nrf_ppi_channel_disable_all(void) -{ - NRF_PPI->CHENCLR = ((uint32_t)0xFFFFFFFFuL); -} +__STATIC_INLINE void nrf_ppi_channel_disable_all(void); /** * @brief Function for disabling multiple PPI channels. * * @param[in] mask Channel mask. */ -__STATIC_INLINE void nrf_ppi_channels_disable(uint32_t mask) -{ - NRF_PPI->CHENCLR = mask; -} +__STATIC_INLINE void nrf_ppi_channels_disable(uint32_t mask); /** * @brief Function for setting up event and task endpoints for a given PPI channel. @@ -239,13 +214,9 @@ __STATIC_INLINE void nrf_ppi_channels_disable(uint32_t mask) */ __STATIC_INLINE void nrf_ppi_channel_endpoint_setup(nrf_ppi_channel_t channel, uint32_t eep, - uint32_t tep) -{ - NRF_PPI->CH[(uint32_t) channel].EEP = eep; - NRF_PPI->CH[(uint32_t) channel].TEP = tep; -} + uint32_t tep); -#if defined(PPI_FEATURE_FORKS_PRESENT) || defined(__SDK_DOXYGEN__) +#if defined(PPI_FEATURE_FORKS_PRESENT) || defined(__NRFX_DOXYGEN__) /** * @brief Function for setting up task endpoint for a given PPI fork. * @@ -254,10 +225,7 @@ __STATIC_INLINE void nrf_ppi_channel_endpoint_setup(nrf_ppi_channel_t channel, * @param[in] channel Channel to which the given fork endpoint is assigned. */ __STATIC_INLINE void nrf_ppi_fork_endpoint_setup(nrf_ppi_channel_t channel, - uint32_t fork_tep) -{ - NRF_PPI->FORK[(uint32_t) channel].TEP = fork_tep; -} + uint32_t fork_tep); /** * @brief Function for setting up event and task endpoints for a given PPI channel and fork. @@ -273,11 +241,7 @@ __STATIC_INLINE void nrf_ppi_fork_endpoint_setup(nrf_ppi_channel_t channel, __STATIC_INLINE void nrf_ppi_channel_and_fork_endpoint_setup(nrf_ppi_channel_t channel, uint32_t eep, uint32_t tep, - uint32_t fork_tep) -{ - nrf_ppi_channel_endpoint_setup(channel, eep, tep); - nrf_ppi_fork_endpoint_setup(channel, fork_tep); -} + uint32_t fork_tep); #endif /** @@ -291,11 +255,7 @@ __STATIC_INLINE void nrf_ppi_channel_and_fork_endpoint_setup(nrf_ppi_channel_t c * */ __STATIC_INLINE void nrf_ppi_channel_include_in_group(nrf_ppi_channel_t channel, - nrf_ppi_channel_group_t channel_group) -{ - NRF_PPI->CHG[(uint32_t) channel_group] = - NRF_PPI->CHG[(uint32_t) channel_group] | (PPI_CHG_CH0_Included << ((uint32_t) channel)); -} + nrf_ppi_channel_group_t channel_group); /** * @brief Function for including multiple PPI channels in a channel group. @@ -308,12 +268,7 @@ __STATIC_INLINE void nrf_ppi_channel_include_in_group(nrf_ppi_channel_t ch * */ __STATIC_INLINE void nrf_ppi_channels_include_in_group(uint32_t channel_mask, - nrf_ppi_channel_group_t channel_group) -{ - NRF_PPI->CHG[(uint32_t) channel_group] = - NRF_PPI->CHG[(uint32_t) channel_group] | (channel_mask); -} - + nrf_ppi_channel_group_t channel_group); /** * @brief Function for removing a PPI channel from a channel group. @@ -325,11 +280,7 @@ __STATIC_INLINE void nrf_ppi_channels_include_in_group(uint32_t c * @param[in] channel_group Channel group. */ __STATIC_INLINE void nrf_ppi_channel_remove_from_group(nrf_ppi_channel_t channel, - nrf_ppi_channel_group_t channel_group) -{ - NRF_PPI->CHG[(uint32_t) channel_group] = - NRF_PPI->CHG[(uint32_t) channel_group] & ~(PPI_CHG_CH0_Included << ((uint32_t) channel)); -} + nrf_ppi_channel_group_t channel_group); /** * @brief Function for removing multiple PPI channels from a channel group. @@ -341,12 +292,7 @@ __STATIC_INLINE void nrf_ppi_channel_remove_from_group(nrf_ppi_channel_t c * @param[in] channel_group Channel group. */ __STATIC_INLINE void nrf_ppi_channels_remove_from_group(uint32_t channel_mask, - nrf_ppi_channel_group_t channel_group) -{ - NRF_PPI->CHG[(uint32_t) channel_group] = - NRF_PPI->CHG[(uint32_t) channel_group] & ~(channel_mask); -} - + nrf_ppi_channel_group_t channel_group); /** * @brief Function for removing all PPI channels from a channel group. @@ -354,11 +300,7 @@ __STATIC_INLINE void nrf_ppi_channels_remove_from_group(uint32_t * @param[in] group Channel group. * */ -__STATIC_INLINE void nrf_ppi_channel_group_clear(nrf_ppi_channel_group_t group) -{ - NRF_PPI->CHG[(uint32_t) group] = 0; -} - +__STATIC_INLINE void nrf_ppi_channel_group_clear(nrf_ppi_channel_group_t group); /** * @brief Function for enabling a channel group. @@ -366,11 +308,7 @@ __STATIC_INLINE void nrf_ppi_channel_group_clear(nrf_ppi_channel_group_t group) * @param[in] group Channel group. * */ -__STATIC_INLINE void nrf_ppi_group_enable(nrf_ppi_channel_group_t group) -{ - NRF_PPI->TASKS_CHG[(uint32_t) group].EN = NRF_PPI_TASK_SET; -} - +__STATIC_INLINE void nrf_ppi_group_enable(nrf_ppi_channel_group_t group); /** * @brief Function for disabling a channel group. @@ -378,59 +316,163 @@ __STATIC_INLINE void nrf_ppi_group_enable(nrf_ppi_channel_group_t group) * @param[in] group Channel group. * */ -__STATIC_INLINE void nrf_ppi_group_disable(nrf_ppi_channel_group_t group) -{ - NRF_PPI->TASKS_CHG[(uint32_t) group].DIS = NRF_PPI_TASK_SET; -} - +__STATIC_INLINE void nrf_ppi_group_disable(nrf_ppi_channel_group_t group); /** * @brief Function for setting a PPI task. * * @param[in] ppi_task PPI task to set. */ -__STATIC_INLINE void nrf_ppi_task_trigger(nrf_ppi_task_t ppi_task) -{ - *((volatile uint32_t *) ((uint8_t *) NRF_PPI_BASE + (uint32_t) ppi_task)) = NRF_PPI_TASK_SET; -} - +__STATIC_INLINE void nrf_ppi_task_trigger(nrf_ppi_task_t ppi_task); /** * @brief Function for returning the address of a specific PPI task register. * * @param[in] ppi_task PPI task. */ -__STATIC_INLINE uint32_t * nrf_ppi_task_address_get(nrf_ppi_task_t ppi_task) -{ - return (uint32_t *) ((uint8_t *) NRF_PPI_BASE + (uint32_t) ppi_task); -} +__STATIC_INLINE uint32_t * nrf_ppi_task_address_get(nrf_ppi_task_t ppi_task); /** * @brief Function for returning the PPI enable task address of a specific group. * * @param[in] group PPI group. */ -__STATIC_INLINE uint32_t * nrf_ppi_task_group_enable_address_get(nrf_ppi_channel_group_t group) -{ - return (uint32_t *) &NRF_PPI->TASKS_CHG[(uint32_t) group].EN; -} +__STATIC_INLINE uint32_t * nrf_ppi_task_group_enable_address_get(nrf_ppi_channel_group_t group); /** * @brief Function for returning the PPI disable task address of a specific group. * * @param[in] group PPI group. */ +__STATIC_INLINE uint32_t * nrf_ppi_task_group_disable_address_get(nrf_ppi_channel_group_t group); + + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION + +__STATIC_INLINE void nrf_ppi_channel_enable(nrf_ppi_channel_t channel) +{ + NRF_PPI->CHENSET = PPI_CHENSET_CH0_Set << ((uint32_t) channel); +} + +__STATIC_INLINE void nrf_ppi_channel_disable(nrf_ppi_channel_t channel) +{ + NRF_PPI->CHENCLR = PPI_CHENCLR_CH0_Clear << ((uint32_t) channel); +} + +__STATIC_INLINE nrf_ppi_channel_enable_t nrf_ppi_channel_enable_get(nrf_ppi_channel_t channel) +{ + if (NRF_PPI->CHEN & (PPI_CHEN_CH0_Msk << ((uint32_t) channel))) + { + return NRF_PPI_CHANNEL_ENABLED; + } + else + { + return NRF_PPI_CHANNEL_DISABLED; + } +} + +__STATIC_INLINE void nrf_ppi_channel_disable_all(void) +{ + NRF_PPI->CHENCLR = ((uint32_t)0xFFFFFFFFuL); +} + +__STATIC_INLINE void nrf_ppi_channels_disable(uint32_t mask) +{ + NRF_PPI->CHENCLR = mask; +} + +__STATIC_INLINE void nrf_ppi_channel_endpoint_setup(nrf_ppi_channel_t channel, + uint32_t eep, + uint32_t tep) +{ + NRF_PPI->CH[(uint32_t) channel].EEP = eep; + NRF_PPI->CH[(uint32_t) channel].TEP = tep; +} + +#if defined(PPI_FEATURE_FORKS_PRESENT) + +__STATIC_INLINE void nrf_ppi_fork_endpoint_setup(nrf_ppi_channel_t channel, + uint32_t fork_tep) +{ + NRF_PPI->FORK[(uint32_t) channel].TEP = fork_tep; +} + +__STATIC_INLINE void nrf_ppi_channel_and_fork_endpoint_setup(nrf_ppi_channel_t channel, + uint32_t eep, + uint32_t tep, + uint32_t fork_tep) +{ + nrf_ppi_channel_endpoint_setup(channel, eep, tep); + nrf_ppi_fork_endpoint_setup(channel, fork_tep); +} +#endif + +__STATIC_INLINE void nrf_ppi_channel_include_in_group(nrf_ppi_channel_t channel, + nrf_ppi_channel_group_t channel_group) +{ + NRF_PPI->CHG[(uint32_t) channel_group] = + NRF_PPI->CHG[(uint32_t) channel_group] | (PPI_CHG_CH0_Included << ((uint32_t) channel)); +} + +__STATIC_INLINE void nrf_ppi_channels_include_in_group(uint32_t channel_mask, + nrf_ppi_channel_group_t channel_group) +{ + NRF_PPI->CHG[(uint32_t) channel_group] = + NRF_PPI->CHG[(uint32_t) channel_group] | (channel_mask); +} + +__STATIC_INLINE void nrf_ppi_channel_remove_from_group(nrf_ppi_channel_t channel, + nrf_ppi_channel_group_t channel_group) +{ + NRF_PPI->CHG[(uint32_t) channel_group] = + NRF_PPI->CHG[(uint32_t) channel_group] & ~(PPI_CHG_CH0_Included << ((uint32_t) channel)); +} + +__STATIC_INLINE void nrf_ppi_channels_remove_from_group(uint32_t channel_mask, + nrf_ppi_channel_group_t channel_group) +{ + NRF_PPI->CHG[(uint32_t) channel_group] = + NRF_PPI->CHG[(uint32_t) channel_group] & ~(channel_mask); +} + +__STATIC_INLINE void nrf_ppi_channel_group_clear(nrf_ppi_channel_group_t group) +{ + NRF_PPI->CHG[(uint32_t) group] = 0; +} + +__STATIC_INLINE void nrf_ppi_group_enable(nrf_ppi_channel_group_t group) +{ + NRF_PPI->TASKS_CHG[(uint32_t) group].EN = NRF_PPI_TASK_SET; +} + +__STATIC_INLINE void nrf_ppi_group_disable(nrf_ppi_channel_group_t group) +{ + NRF_PPI->TASKS_CHG[(uint32_t) group].DIS = NRF_PPI_TASK_SET; +} + +__STATIC_INLINE void nrf_ppi_task_trigger(nrf_ppi_task_t ppi_task) +{ + *((volatile uint32_t *) ((uint8_t *) NRF_PPI_BASE + (uint32_t) ppi_task)) = NRF_PPI_TASK_SET; +} + +__STATIC_INLINE uint32_t * nrf_ppi_task_address_get(nrf_ppi_task_t ppi_task) +{ + return (uint32_t *) ((uint8_t *) NRF_PPI_BASE + (uint32_t) ppi_task); +} + +__STATIC_INLINE uint32_t * nrf_ppi_task_group_enable_address_get(nrf_ppi_channel_group_t group) +{ + return (uint32_t *) &NRF_PPI->TASKS_CHG[(uint32_t) group].EN; +} + __STATIC_INLINE uint32_t * nrf_ppi_task_group_disable_address_get(nrf_ppi_channel_group_t group) { return (uint32_t *) &NRF_PPI->TASKS_CHG[(uint32_t) group].DIS; } +#endif // SUPPRESS_INLINE_IMPLEMENTATION -/** - *@} - **/ - -/*lint --flb "Leave library region" */ +/** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_pwm.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_pwm.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_pwm.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_pwm.h index 710f307e27..6c576126b3 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_pwm.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_pwm.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,29 +37,22 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @defgroup nrf_pwm_hal PWM HAL - * @{ - * @ingroup nrf_pwm - * - * @brief @tagAPI52 Hardware access layer for managing the Pulse Width Modulation (PWM) - * peripheral. - */ #ifndef NRF_PWM_H__ #define NRF_PWM_H__ -#include -#include -#include - -#include "nrf.h" -#include "nrf_assert.h" +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_pwm_hal PWM HAL + * @{ + * @ingroup nrf_pwm + * @brief Hardware access layer for managing the Pulse Width Modulation (PWM) peripheral. + */ /** * @brief This value can be provided as a parameter for the @ref nrf_pwm_pins_set @@ -619,7 +612,7 @@ __STATIC_INLINE void nrf_pwm_configure(NRF_PWM_Type * p_reg, nrf_pwm_mode_t mode, uint16_t top_value) { - ASSERT(top_value <= PWM_COUNTERTOP_COUNTERTOP_Msk); + NRFX_ASSERT(top_value <= PWM_COUNTERTOP_COUNTERTOP_Msk); p_reg->PRESCALER = base_clock; p_reg->MODE = mode; @@ -630,7 +623,7 @@ __STATIC_INLINE void nrf_pwm_sequence_set(NRF_PWM_Type * p_reg, uint8_t seq_id, nrf_pwm_sequence_t const * p_seq) { - ASSERT(p_seq != NULL); + NRFX_ASSERT(p_seq != NULL); nrf_pwm_seq_ptr_set( p_reg, seq_id, p_seq->values.p_raw); nrf_pwm_seq_cnt_set( p_reg, seq_id, p_seq->length); @@ -642,8 +635,8 @@ __STATIC_INLINE void nrf_pwm_seq_ptr_set(NRF_PWM_Type * p_reg, uint8_t seq_id, uint16_t const * p_values) { - ASSERT(seq_id <= 1); - ASSERT(p_values != NULL); + NRFX_ASSERT(seq_id <= 1); + NRFX_ASSERT(p_values != NULL); p_reg->SEQ[seq_id].PTR = (uint32_t)p_values; } @@ -651,9 +644,9 @@ __STATIC_INLINE void nrf_pwm_seq_cnt_set(NRF_PWM_Type * p_reg, uint8_t seq_id, uint16_t length) { - ASSERT(seq_id <= 1); - ASSERT(length != 0); - ASSERT(length <= PWM_SEQ_CNT_CNT_Msk); + NRFX_ASSERT(seq_id <= 1); + NRFX_ASSERT(length != 0); + NRFX_ASSERT(length <= PWM_SEQ_CNT_CNT_Msk); p_reg->SEQ[seq_id].CNT = length; } @@ -661,8 +654,8 @@ __STATIC_INLINE void nrf_pwm_seq_refresh_set(NRF_PWM_Type * p_reg, uint8_t seq_id, uint32_t refresh) { - ASSERT(seq_id <= 1); - ASSERT(refresh <= PWM_SEQ_REFRESH_CNT_Msk); + NRFX_ASSERT(seq_id <= 1); + NRFX_ASSERT(refresh <= PWM_SEQ_REFRESH_CNT_Msk); p_reg->SEQ[seq_id].REFRESH = refresh; } @@ -670,8 +663,8 @@ __STATIC_INLINE void nrf_pwm_seq_end_delay_set(NRF_PWM_Type * p_reg, uint8_t seq_id, uint32_t end_delay) { - ASSERT(seq_id <= 1); - ASSERT(end_delay <= PWM_SEQ_ENDDELAY_CNT_Msk); + NRFX_ASSERT(seq_id <= 1); + NRFX_ASSERT(end_delay <= PWM_SEQ_ENDDELAY_CNT_Msk); p_reg->SEQ[seq_id].ENDDELAY = end_delay; } @@ -691,6 +684,7 @@ __STATIC_INLINE void nrf_pwm_loop_set(NRF_PWM_Type * p_reg, #endif // SUPPRESS_INLINE_IMPLEMENTATION +/** @} */ #ifdef __cplusplus } @@ -698,4 +692,3 @@ __STATIC_INLINE void nrf_pwm_loop_set(NRF_PWM_Type * p_reg, #endif // NRF_PWM_H__ -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_qdec.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_qdec.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_qdec.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_qdec.h index e6a0fccbfe..537bf78efb 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_qdec.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_qdec.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -40,21 +40,17 @@ #ifndef NRF_QDEC_H__ #define NRF_QDEC_H__ -#include -#include "nrf_error.h" -#include "nrf.h" +#include #ifdef __cplusplus extern "C" { #endif -/*lint ++flb "Enter library region" */ - /** * @defgroup nrf_qdec_hal QDEC HAL * @{ * @ingroup nrf_qdec - * @brief Hardware access layer for accessing the quadrature decoder (QDEC) peripheral. + * @brief Hardware access layer for managing the Quadrature Decoder (QDEC) peripheral. */ /** @@ -490,12 +486,7 @@ __STATIC_INLINE uint32_t nrf_qdec_ledpol_get(void) return NRF_QDEC->LEDPOL; } - -/** - *@} - **/ - -/*lint --flb "Leave library region" */ +/** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_qspi.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_qspi.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_qspi.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_qspi.h index 4c0d6df45f..a5c39d1b2c 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_qspi.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_qspi.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,26 +37,23 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @defgroup nrf_qspi_hal QSPI HAL - * @{ - * @ingroup nrf_qspi - * - * @brief Hardware access layer for accessing the QSPI peripheral. - */ #ifndef NRF_QSPI_H__ #define NRF_QSPI_H__ -#include -#include -#include "boards.h" -#include "nrf.h" +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_qspi_hal QSPI HAL + * @{ + * @ingroup nrf_qspi + * @brief Hardware access layer for managing the QSPI peripheral. + */ + /** * @brief This value can be used as a parameter for the @ref nrf_qspi_pins_set * function to specify that a given QSPI signal (SCK, CSN, IO0, IO1, IO2, or IO3) @@ -80,6 +77,7 @@ typedef enum NRF_QSPI_TASK_READSTART = offsetof(NRF_QSPI_Type, TASKS_READSTART), /**< Start transfer from external flash memory to internal RAM. */ NRF_QSPI_TASK_WRITESTART = offsetof(NRF_QSPI_Type, TASKS_WRITESTART), /**< Start transfer from internal RAM to external flash memory. */ NRF_QSPI_TASK_ERASESTART = offsetof(NRF_QSPI_Type, TASKS_ERASESTART), /**< Start external flash memory erase operation. */ + NRF_QSPI_TASK_DEACTIVATE = offsetof(NRF_QSPI_Type, TASKS_DEACTIVATE), /**< Deactivate the QSPI interface. */ /*lint -restore*/ } nrf_qspi_task_t; @@ -372,6 +370,15 @@ __STATIC_INLINE void nrf_qspi_disable(NRF_QSPI_Type * p_reg); __STATIC_INLINE void nrf_qspi_pins_set(NRF_QSPI_Type * p_reg, const nrf_qspi_pins_t * p_pins); +/** + * @brief Function for setting the QSPI XIPOFFSET register. + * + * @param[in] p_reg Pointer to the peripheral register structure. + * @param[in] xip_offset Address offset in the external memory for Execute in Place operation. + */ +__STATIC_INLINE void nrf_qspi_xip_offset_set(NRF_QSPI_Type * p_reg, + uint32_t xip_offset); + /** * @brief Function for setting the QSPI IFCONFIG0 register. * @@ -571,6 +578,12 @@ __STATIC_INLINE void nrf_qspi_pins_set(NRF_QSPI_Type * p_reg, const nrf_qspi_pin p_reg->PSEL.IO3 = NRF_QSPI_PIN_VAL(p_pins->io3_pin); } +__STATIC_INLINE void nrf_qspi_xip_offset_set(NRF_QSPI_Type * p_reg, + uint32_t xip_offset) +{ + p_reg->XIPOFFSET = xip_offset; +} + __STATIC_INLINE void nrf_qspi_ifconfig0_set(NRF_QSPI_Type * p_reg, const nrf_qspi_prot_conf_t * p_config) { @@ -760,10 +773,10 @@ __STATIC_INLINE void nrf_qspi_cinstr_transfer_start(NRF_QSPI_Type * #endif // SUPPRESS_INLINE_IMPLEMENTATION +/** @} */ + #ifdef __cplusplus } #endif #endif // NRF_QSPI_H__ - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_rng.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_rng.h similarity index 96% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_rng.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_rng.h index 9ebf81748a..62f60c02b9 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_rng.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_rng.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,29 +37,23 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @file - * @brief RNG HAL API. - */ #ifndef NRF_RNG_H__ #define NRF_RNG_H__ -/** - * @defgroup nrf_rng_hal RNG HAL - * @{ - * @ingroup nrf_rng - * @brief Hardware access layer for managing the random number generator (RNG). - */ -#include -#include -#include -#include "nrf.h" +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_rng_hal RNG HAL + * @{ + * @ingroup nrf_rng + * @brief Hardware access layer for managing the Random Number Generator (RNG) peripheral. + */ + #define NRF_RNG_TASK_SET (1UL) #define NRF_RNG_EVENT_CLEAR (0UL) /** @@ -198,10 +192,6 @@ __STATIC_INLINE void nrf_rng_error_correction_enable(void); */ __STATIC_INLINE void nrf_rng_error_correction_disable(void); -/** - *@} - **/ - #ifndef SUPPRESS_INLINE_IMPLEMENTATION __STATIC_INLINE void nrf_rng_int_enable(uint32_t rng_int_mask) @@ -275,6 +265,8 @@ __STATIC_INLINE void nrf_rng_error_correction_disable(void) #endif +/** @} */ + #ifdef __cplusplus } #endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_rtc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_rtc.h similarity index 96% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_rtc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_rtc.h index 1b1f83988e..d4770d5e48 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_rtc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_rtc.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,38 +37,29 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @file - * @brief RTC HAL API. - */ #ifndef NRF_RTC_H #define NRF_RTC_H -/** - * @defgroup nrf_rtc_hal RTC HAL - * @{ - * @ingroup nrf_rtc - * @brief Hardware access layer for managing the real time counter (RTC). - */ - -#include -#include -#include -#include "nrf.h" -#include "nrf_assert.h" -#include "nrf_peripherals.h" +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_rtc_hal RTC HAL + * @{ + * @ingroup nrf_rtc + * @brief Hardware access layer for managing the Real Time Counter (RTC) peripheral. + */ + /** * @brief Macro for getting the number of compare channels available * in a given RTC instance. */ -#define NRF_RTC_CC_CHANNEL_COUNT(id) CONCAT_3(RTC, id, _CC_NUM) +#define NRF_RTC_CC_CHANNEL_COUNT(id) NRFX_CONCAT_3(RTC, id, _CC_NUM) #define RTC_INPUT_FREQ 32768 /**< Input frequency of the RTC instance. */ @@ -244,11 +235,6 @@ __STATIC_INLINE void nrf_rtc_event_enable(NRF_RTC_Type * p_rtc, uint32_t mask); */ __STATIC_INLINE void nrf_rtc_event_disable(NRF_RTC_Type * p_rtc, uint32_t event); -/** - *@} - **/ - - #ifndef SUPPRESS_INLINE_IMPLEMENTATION __STATIC_INLINE void nrf_rtc_cc_set(NRF_RTC_Type * p_rtc, uint32_t ch, uint32_t cc_val) @@ -302,7 +288,7 @@ __STATIC_INLINE uint32_t nrf_rtc_counter_get(NRF_RTC_Type * p_rtc) __STATIC_INLINE void nrf_rtc_prescaler_set(NRF_RTC_Type * p_rtc, uint32_t val) { - ASSERT(val <= (RTC_PRESCALER_PRESCALER_Msk >> RTC_PRESCALER_PRESCALER_Pos)); + NRFX_ASSERT(val <= (RTC_PRESCALER_PRESCALER_Msk >> RTC_PRESCALER_PRESCALER_Pos)); p_rtc->PRESCALER = val; } __STATIC_INLINE uint32_t rtc_prescaler_get(NRF_RTC_Type * p_rtc) @@ -335,6 +321,7 @@ __STATIC_INLINE void nrf_rtc_event_disable(NRF_RTC_Type * p_rtc, uint32_t mask) } #endif +/** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_saadc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_saadc.h similarity index 94% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_saadc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_saadc.h index 73eb8128b1..fe8835683f 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_saadc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_saadc.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,26 +37,23 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ + #ifndef NRF_SAADC_H_ #define NRF_SAADC_H_ +#include + +#ifdef __cplusplus +extern "C" { +#endif + /** * @defgroup nrf_saadc_hal SAADC HAL * @{ * @ingroup nrf_saadc - * - * @brief @tagAPI52 Hardware access layer for accessing the SAADC peripheral. + * @brief Hardware access layer for managing the SAADC peripheral. */ -#include -#include -#include "nrf.h" -#include "nrf_assert.h" - -#ifdef __cplusplus -extern "C" { -#endif - #define NRF_SAADC_CHANNEL_COUNT 8 /** @@ -368,7 +365,7 @@ __STATIC_INLINE uint32_t nrf_saadc_event_address_get(nrf_saadc_event_t saadc_ev */ __STATIC_INLINE volatile uint32_t * nrf_saadc_event_limit_address_get(uint8_t channel, nrf_saadc_limit_t limit_type) { - ASSERT(channel < NRF_SAADC_CHANNEL_COUNT); + NRFX_ASSERT(channel < NRF_SAADC_CHANNEL_COUNT); if (limit_type == NRF_SAADC_LIMIT_HIGH) { return &NRF_SAADC->EVENTS_CH[channel].LIMITH; @@ -480,7 +477,7 @@ __STATIC_INLINE void nrf_saadc_int_disable(uint32_t saadc_int_mask) */ __STATIC_INLINE uint32_t nrf_saadc_limit_int_get(uint8_t channel, nrf_saadc_limit_t limit_type) { - ASSERT(channel < NRF_SAADC_CHANNEL_COUNT); + NRFX_ASSERT(channel < NRF_SAADC_CHANNEL_COUNT); uint32_t mask = (limit_type == NRF_SAADC_LIMIT_LOW) ? NRF_SAADC_INT_CH0LIMITL : NRF_SAADC_INT_CH0LIMITH; return mask << (channel * 2); } @@ -595,12 +592,21 @@ __STATIC_INLINE nrf_saadc_oversample_t nrf_saadc_oversample_get(void) * @param[in] channel Channel number. * @param[in] config Pointer to the channel configuration structure. */ -void nrf_saadc_channel_init(uint8_t channel, nrf_saadc_channel_config_t const * const config); - -/** - *@} - **/ +__STATIC_INLINE void nrf_saadc_channel_init(uint8_t channel, + nrf_saadc_channel_config_t const * const config) +{ + NRF_SAADC->CH[channel].CONFIG = + ((config->resistor_p << SAADC_CH_CONFIG_RESP_Pos) & SAADC_CH_CONFIG_RESP_Msk) + | ((config->resistor_n << SAADC_CH_CONFIG_RESN_Pos) & SAADC_CH_CONFIG_RESN_Msk) + | ((config->gain << SAADC_CH_CONFIG_GAIN_Pos) & SAADC_CH_CONFIG_GAIN_Msk) + | ((config->reference << SAADC_CH_CONFIG_REFSEL_Pos) & SAADC_CH_CONFIG_REFSEL_Msk) + | ((config->acq_time << SAADC_CH_CONFIG_TACQ_Pos) & SAADC_CH_CONFIG_TACQ_Msk) + | ((config->mode << SAADC_CH_CONFIG_MODE_Pos) & SAADC_CH_CONFIG_MODE_Msk) + | ((config->burst << SAADC_CH_CONFIG_BURST_Pos) & SAADC_CH_CONFIG_BURST_Msk); + nrf_saadc_channel_input_set(channel, config->pin_p, config->pin_n); +} +/** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_spi.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_spi.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_spi.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_spi.h index 3f7215e73f..28b8c8026b 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_spi.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_spi.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,28 +37,22 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @defgroup nrf_spi_hal SPI HAL - * @{ - * @ingroup nrf_spi - * - * @brief Hardware access layer for accessing the SPI peripheral. - */ #ifndef NRF_SPI_H__ #define NRF_SPI_H__ -#include -#include -#include - -#include "nrf.h" -#include "nrf_peripherals.h" +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_spi_hal SPI HAL + * @{ + * @ingroup nrf_spi + * @brief Hardware access layer for managing the SPI peripheral. + */ /** * @brief This value can be used as a parameter for the @ref nrf_spi_pins_set @@ -83,7 +77,8 @@ typedef enum */ typedef enum { - NRF_SPI_INT_READY_MASK = SPI_INTENSET_READY_Msk ///< Interrupt on READY event. + NRF_SPI_INT_READY_MASK = SPI_INTENSET_READY_Msk, ///< Interrupt on READY event. + NRF_SPI_ALL_INTS_MASK = SPI_INTENSET_READY_Msk ///< All SPI interrupts. } nrf_spi_int_mask_t; /** @@ -365,11 +360,10 @@ __STATIC_INLINE void nrf_spi_configure(NRF_SPI_Type * p_reg, #endif // SUPPRESS_INLINE_IMPLEMENTATION +/** @} */ #ifdef __cplusplus } #endif #endif // NRF_SPI_H__ - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_spim.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_spim.h similarity index 64% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_spim.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_spim.h index d20eaa44ab..ede94f3c20 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_spim.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_spim.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,28 +37,22 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @defgroup nrf_spim_hal SPIM HAL - * @{ - * @ingroup nrf_spi - * - * @brief Hardware access layer for accessing the SPIM peripheral. - */ #ifndef NRF_SPIM_H__ #define NRF_SPIM_H__ -#include -#include -#include - -#include "nrf.h" -#include "nrf_peripherals.h" +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_spim_hal SPIM HAL + * @{ + * @ingroup nrf_spim + * @brief Hardware access layer for managing the SPIM peripheral. + */ /** * @brief This value can be used as a parameter for the @ref nrf_spim_pins_set @@ -67,6 +61,22 @@ extern "C" { */ #define NRF_SPIM_PIN_NOT_CONNECTED 0xFFFFFFFF +#if defined(SPIM_DCXCNT_DCXCNT_Msk) || defined(__NRFX_DOXYGEN__) +/** + * @brief This value specified in the DCX line configuration causes this line + * to be set low during whole transmission (all transmitted bytes are + * marked as command bytes). Any lower value causes the DCX line to be + * switched from low to high after this number of bytes is transmitted + * (all remaining bytes are marked as data bytes). + */ +#define NRF_SPIM_DCX_CNT_ALL_CMD 0xF +#endif + +#define NRF_SPIM_HW_CSN_PRESENT \ + (NRFX_CHECK(SPIM0_FEATURE_HARDWARE_CSN_PRESENT) || \ + NRFX_CHECK(SPIM1_FEATURE_HARDWARE_CSN_PRESENT) || \ + NRFX_CHECK(SPIM2_FEATURE_HARDWARE_CSN_PRESENT) || \ + NRFX_CHECK(SPIM3_FEATURE_HARDWARE_CSN_PRESENT)) /** * @brief SPIM tasks. @@ -100,7 +110,8 @@ typedef enum */ typedef enum { - NRF_SPIM_SHORT_END_START_MASK = SPIM_SHORTS_END_START_Msk ///< Shortcut between END event and START task. + NRF_SPIM_SHORT_END_START_MASK = SPIM_SHORTS_END_START_Msk, ///< Shortcut between END event and START task. + NRF_SPIM_ALL_SHORTS_MASK = SPIM_SHORTS_END_START_Msk ///< All SPIM shortcuts. } nrf_spim_short_mask_t; /** @@ -108,11 +119,16 @@ typedef enum */ typedef enum { - NRF_SPIM_INT_STOPPED_MASK = SPIM_INTENSET_STOPPED_Msk, ///< Interrupt on STOPPED event. - NRF_SPIM_INT_ENDRX_MASK = SPIM_INTENSET_ENDRX_Msk, ///< Interrupt on ENDRX event. - NRF_SPIM_INT_END_MASK = SPIM_INTENSET_END_Msk, ///< Interrupt on END event. - NRF_SPIM_INT_ENDTX_MASK = SPIM_INTENSET_ENDTX_Msk, ///< Interrupt on ENDTX event. - NRF_SPIM_INT_STARTED_MASK = SPIM_INTENSET_STARTED_Msk ///< Interrupt on STARTED event. + NRF_SPIM_INT_STOPPED_MASK = SPIM_INTENSET_STOPPED_Msk, ///< Interrupt on STOPPED event. + NRF_SPIM_INT_ENDRX_MASK = SPIM_INTENSET_ENDRX_Msk, ///< Interrupt on ENDRX event. + NRF_SPIM_INT_END_MASK = SPIM_INTENSET_END_Msk, ///< Interrupt on END event. + NRF_SPIM_INT_ENDTX_MASK = SPIM_INTENSET_ENDTX_Msk, ///< Interrupt on ENDTX event. + NRF_SPIM_INT_STARTED_MASK = SPIM_INTENSET_STARTED_Msk, ///< Interrupt on STARTED event. + NRF_SPIM_ALL_INTS_MASK = SPIM_INTENSET_STOPPED_Msk | + SPIM_INTENSET_ENDRX_Msk | + SPIM_INTENSET_END_Msk | + SPIM_INTENSET_ENDTX_Msk | + SPIM_INTENSET_STARTED_Msk ///< All SPIM interrupts. } nrf_spim_int_mask_t; /** @@ -120,23 +136,20 @@ typedef enum */ typedef enum { - NRF_SPIM_FREQ_125K = SPIM_FREQUENCY_FREQUENCY_K125, ///< 125 kbps. - NRF_SPIM_FREQ_250K = SPIM_FREQUENCY_FREQUENCY_K250, ///< 250 kbps. - NRF_SPIM_FREQ_500K = SPIM_FREQUENCY_FREQUENCY_K500, ///< 500 kbps. - NRF_SPIM_FREQ_1M = SPIM_FREQUENCY_FREQUENCY_M1, ///< 1 Mbps. - NRF_SPIM_FREQ_2M = SPIM_FREQUENCY_FREQUENCY_M2, ///< 2 Mbps. - NRF_SPIM_FREQ_4M = SPIM_FREQUENCY_FREQUENCY_M4, ///< 4 Mbps. + NRF_SPIM_FREQ_125K = SPIM_FREQUENCY_FREQUENCY_K125, ///< 125 kbps. + NRF_SPIM_FREQ_250K = SPIM_FREQUENCY_FREQUENCY_K250, ///< 250 kbps. + NRF_SPIM_FREQ_500K = SPIM_FREQUENCY_FREQUENCY_K500, ///< 500 kbps. + NRF_SPIM_FREQ_1M = SPIM_FREQUENCY_FREQUENCY_M1, ///< 1 Mbps. + NRF_SPIM_FREQ_2M = SPIM_FREQUENCY_FREQUENCY_M2, ///< 2 Mbps. + NRF_SPIM_FREQ_4M = SPIM_FREQUENCY_FREQUENCY_M4, ///< 4 Mbps. // [conversion to 'int' needed to prevent compilers from complaining // that the provided value (0x80000000UL) is out of range of "int"] - NRF_SPIM_FREQ_8M = (int)SPIM_FREQUENCY_FREQUENCY_M8,///< 8 Mbps. -#ifndef SPI_PRESENT - NRF_SPI_FREQ_125K = NRF_SPIM_FREQ_125K, - NRF_SPI_FREQ_250K = NRF_SPIM_FREQ_250K, - NRF_SPI_FREQ_500K = NRF_SPIM_FREQ_500K, - NRF_SPI_FREQ_1M = NRF_SPIM_FREQ_1M, - NRF_SPI_FREQ_2M = NRF_SPIM_FREQ_2M, - NRF_SPI_FREQ_4M = NRF_SPIM_FREQ_4M, - NRF_SPI_FREQ_8M = NRF_SPIM_FREQ_8M, + NRF_SPIM_FREQ_8M = (int)SPIM_FREQUENCY_FREQUENCY_M8, ///< 8 Mbps. +#if defined(SPIM_FREQUENCY_FREQUENCY_M16) || defined(__NRFX_DOXYGEN__) + NRF_SPIM_FREQ_16M = SPIM_FREQUENCY_FREQUENCY_M16, ///< 16 Mbps. +#endif +#if defined(SPIM_FREQUENCY_FREQUENCY_M32) || defined(__NRFX_DOXYGEN__) + NRF_SPIM_FREQ_32M = SPIM_FREQUENCY_FREQUENCY_M32 ///< 32 Mbps. #endif } nrf_spim_frequency_t; @@ -148,13 +161,7 @@ typedef enum NRF_SPIM_MODE_0, ///< SCK active high, sample on leading edge of clock. NRF_SPIM_MODE_1, ///< SCK active high, sample on trailing edge of clock. NRF_SPIM_MODE_2, ///< SCK active low, sample on leading edge of clock. - NRF_SPIM_MODE_3, ///< SCK active low, sample on trailing edge of clock. -#ifndef SPI_PRESENT - NRF_SPI_MODE_0 = NRF_SPIM_MODE_0, - NRF_SPI_MODE_1 = NRF_SPIM_MODE_1, - NRF_SPI_MODE_2 = NRF_SPIM_MODE_2, - NRF_SPI_MODE_3 = NRF_SPIM_MODE_3, -#endif + NRF_SPIM_MODE_3 ///< SCK active low, sample on trailing edge of clock. } nrf_spim_mode_t; /** @@ -163,13 +170,19 @@ typedef enum typedef enum { NRF_SPIM_BIT_ORDER_MSB_FIRST = SPIM_CONFIG_ORDER_MsbFirst, ///< Most significant bit shifted out first. - NRF_SPIM_BIT_ORDER_LSB_FIRST = SPIM_CONFIG_ORDER_LsbFirst, ///< Least significant bit shifted out first. -#ifndef SPI_PRESENT - NRF_SPI_BIT_ORDER_MSB_FIRST = NRF_SPIM_BIT_ORDER_MSB_FIRST, - NRF_SPI_BIT_ORDER_LSB_FIRST = NRF_SPIM_BIT_ORDER_LSB_FIRST, -#endif + NRF_SPIM_BIT_ORDER_LSB_FIRST = SPIM_CONFIG_ORDER_LsbFirst ///< Least significant bit shifted out first. } nrf_spim_bit_order_t; +#if (NRF_SPIM_HW_CSN_PRESENT) || defined(__NRFX_DOXYGEN__) +/** + * @brief SPI CSN pin polarity. + */ +typedef enum +{ + NRF_SPIM_CSN_POL_LOW = SPIM_CSNPOL_CSNPOL_LOW, ///< Active low (idle state high). + NRF_SPIM_CSN_POL_HIGH = SPIM_CSNPOL_CSNPOL_HIGH ///< Active high (idle state low). +} nrf_spim_csn_pol_t; +#endif // (NRF_SPIM_HW_CSN_PRESENT) || defined(__NRFX_DOXYGEN__) /** * @brief Function for activating a specific SPIM task. @@ -298,19 +311,114 @@ __STATIC_INLINE void nrf_spim_disable(NRF_SPIM_Type * p_reg); * value instead of its pin number. * * @param[in] p_reg Pointer to the peripheral registers structure. - * @param[in] sck_pin SCK pin number. - * @param[in] mosi_pin MOSI pin number. - * @param[in] miso_pin MISO pin number. + * @param[in] sck_pin SCK pin number. + * @param[in] mosi_pin MOSI pin number. + * @param[in] miso_pin MISO pin number. */ __STATIC_INLINE void nrf_spim_pins_set(NRF_SPIM_Type * p_reg, uint32_t sck_pin, uint32_t mosi_pin, uint32_t miso_pin); +#if (NRF_SPIM_HW_CSN_PRESENT) || defined(__NRFX_DOXYGEN__) +/** + * @brief Function for configuring the SPIM hardware CSN pin. + * + * If this signal is not needed, pass the @ref NRF_SPIM_PIN_NOT_CONNECTED + * value instead of its pin number. + * + * @param[in] p_reg Pointer to the peripheral registers structure. + * @param[in] pin CSN pin number. + * @param[in] polarity CSN pin polarity. + * @param[in] duration Minimum duration between the edge of CSN and the edge of SCK + * and minimum duration of CSN must stay unselected between transactions. + * The value is specified in number of 64 MHz clock cycles (15.625 ns). + */ +__STATIC_INLINE void nrf_spim_csn_configure(NRF_SPIM_Type * p_reg, + uint32_t pin, + nrf_spim_csn_pol_t polarity, + uint32_t duration); +#endif // (NRF_SPIM_HW_CSN_PRESENT) || defined(__NRFX_DOXYGEN__) + +#if defined(SPIM_PSELDCX_CONNECT_Msk) || defined(__NRFX_DOXYGEN__) +/** + * @brief Function for configuring the SPIM DCX pin. + * + * If this signal is not needed, pass the @ref NRF_SPIM_PIN_NOT_CONNECTED + * value instead of its pin number. + * + * @param[in] p_reg Pointer to the peripheral registers structure. + * @param[in] dcx_pin DCX pin number. + */ +__STATIC_INLINE void nrf_spim_dcx_pin_set(NRF_SPIM_Type * p_reg, + uint32_t dcx_pin); + +/** + * @brief Function for configuring the number of command bytes. + * + * Maximum value available for dividing the transmitted bytes into command + * bytes and data bytes is @ref NRF_SPIM_DCX_CNT_ALL_CMD - 1. + * The @ref NRF_SPIM_DCX_CNT_ALL_CMD value passed as the @c count parameter + * causes all transmitted bytes to be marked as command bytes. + * + * @param[in] p_reg Pointer to the peripheral registers structure. + * @param[in] count Number of command bytes preceding the data bytes. + */ +__STATIC_INLINE void nrf_spim_dcx_cnt_set(NRF_SPIM_Type * p_reg, + uint32_t count); +#endif // defined(SPIM_PSELDCX_CONNECT_Msk) || defined(__NRFX_DOXYGEN__) + +#if defined(SPIM_IFTIMING_RXDELAY_RXDELAY_Msk) || defined(__NRFX_DOXYGEN__) +/** + * @brief Function for configuring the extended SPIM interface. + * @param p_reg Pointer to the peripheral registers structure. + * @param rxdelay Sample delay for input serial data on MISO, + * specified in 64 MHz clock cycles (15.625 ns) from the sampling edge of SCK. + */ +__STATIC_INLINE void nrf_spim_iftiming_set(NRF_SPIM_Type * p_reg, + uint32_t rxdelay); +#endif // defined(SPIM_IFTIMING_RXDELAY_RXDELAY_Msk) || defined(__NRFX_DOXYGEN__) + +#if defined(SPIM_STALLSTAT_RX_Msk) || defined(__NRFX_DOXYGEN__) +/** + * @brief Function for clearing stall status for RX EasyDMA RAM accesses. + * + * @param p_reg Pointer to the peripheral registers structure. + */ +__STATIC_INLINE void nrf_spim_stallstat_rx_clear(NRF_SPIM_Type * p_reg); + +/** + * @brief Function for getting stall status for RX EasyDMA RAM accesses. + * + * @param p_reg Pointer to the peripheral registers structure. + * + * @return Stall status of RX EasyDMA RAM accesses. + */ +__STATIC_INLINE bool nrf_spim_stallstat_rx_get(NRF_SPIM_Type * p_reg); +#endif // defined(SPIM_STALLSTAT_RX_Msk) || defined(__NRFX_DOXYGEN__) + +#if defined(SPIM_STALLSTAT_TX_Msk) || defined(__NRFX_DOXYGEN__) +/** + * @brief Function for clearing stall status for TX EasyDMA RAM accesses. + * + * @param p_reg Pointer to the peripheral registers structure. + */ +__STATIC_INLINE void nrf_spim_stallstat_tx_clear(NRF_SPIM_Type * p_reg); + +/** + * @brief Function for getting stall status for TX EasyDMA RAM accesses. + * + * @param p_reg Pointer to the peripheral registers structure. + * + * @return Stall status of TX EasyDMA RAM accesses. + */ +__STATIC_INLINE bool nrf_spim_stallstat_tx_get(NRF_SPIM_Type * p_reg); +#endif // defined(SPIM_STALLSTAT_TX_Msk) || defined(__NRFX_DOXYGEN__) + /** * @brief Function for setting the SPI master data rate. * - * @param[in] p_reg Pointer to the peripheral registers structure. + * @param[in] p_reg Pointer to the peripheral registers structure. * @param[in] frequency SPI frequency. */ __STATIC_INLINE void nrf_spim_frequency_set(NRF_SPIM_Type * p_reg, @@ -325,7 +433,7 @@ __STATIC_INLINE void nrf_spim_frequency_set(NRF_SPIM_Type * p_reg, */ __STATIC_INLINE void nrf_spim_tx_buffer_set(NRF_SPIM_Type * p_reg, uint8_t const * p_buffer, - uint8_t length); + size_t length); /** * @brief Function for setting the receive buffer. @@ -336,7 +444,7 @@ __STATIC_INLINE void nrf_spim_tx_buffer_set(NRF_SPIM_Type * p_reg, */ __STATIC_INLINE void nrf_spim_rx_buffer_set(NRF_SPIM_Type * p_reg, uint8_t * p_buffer, - uint8_t length); + size_t length); /** * @brief Function for setting the SPI configuration. @@ -478,6 +586,64 @@ __STATIC_INLINE void nrf_spim_pins_set(NRF_SPIM_Type * p_reg, p_reg->PSEL.MISO = miso_pin; } +#if (NRF_SPIM_HW_CSN_PRESENT) +__STATIC_INLINE void nrf_spim_csn_configure(NRF_SPIM_Type * p_reg, + uint32_t pin, + nrf_spim_csn_pol_t polarity, + uint32_t duration) +{ + p_reg->PSEL.CSN = pin; + p_reg->CSNPOL = polarity; + p_reg->IFTIMING.CSNDUR = duration; +} +#endif // defined(NRF_SPIM_HW_CSN_PRESENT) + +#if defined(SPIM_PSELDCX_CONNECT_Msk) +__STATIC_INLINE void nrf_spim_dcx_pin_set(NRF_SPIM_Type * p_reg, + uint32_t dcx_pin) +{ + p_reg->PSELDCX = dcx_pin; +} + +__STATIC_INLINE void nrf_spim_dcx_cnt_set(NRF_SPIM_Type * p_reg, + uint32_t dcx_cnt) +{ + p_reg->DCXCNT = dcx_cnt; +} +#endif // defined(SPIM_PSELDCX_CONNECT_Msk) + +#if defined(SPIM_IFTIMING_RXDELAY_RXDELAY_Msk) +__STATIC_INLINE void nrf_spim_iftiming_set(NRF_SPIM_Type * p_reg, + uint32_t rxdelay) +{ + p_reg->IFTIMING.RXDELAY = rxdelay; +} +#endif // defined(SPIM_IFTIMING_RXDELAY_RXDELAY_Msk) + +#if defined(SPIM_STALLSTAT_RX_Msk) +__STATIC_INLINE void nrf_spim_stallstat_rx_clear(NRF_SPIM_Type * p_reg) +{ + p_reg->STALLSTAT &= ~(SPIM_STALLSTAT_RX_Msk); +} + +__STATIC_INLINE bool nrf_spim_stallstat_rx_get(NRF_SPIM_Type * p_reg) +{ + return (p_reg->STALLSTAT & SPIM_STALLSTAT_RX_Msk) != 0; +} +#endif // defined(SPIM_STALLSTAT_RX_Msk) + +#if defined(SPIM_STALLSTAT_TX_Msk) +__STATIC_INLINE void nrf_spim_stallstat_tx_clear(NRF_SPIM_Type * p_reg) +{ + p_reg->STALLSTAT &= ~(SPIM_STALLSTAT_TX_Msk); +} + +__STATIC_INLINE bool nrf_spim_stallstat_tx_get(NRF_SPIM_Type * p_reg) +{ + return (p_reg->STALLSTAT & SPIM_STALLSTAT_TX_Msk) != 0; +} +#endif // defined(SPIM_STALLSTAT_TX_Msk) + __STATIC_INLINE void nrf_spim_frequency_set(NRF_SPIM_Type * p_reg, nrf_spim_frequency_t frequency) { @@ -486,7 +652,7 @@ __STATIC_INLINE void nrf_spim_frequency_set(NRF_SPIM_Type * p_reg, __STATIC_INLINE void nrf_spim_tx_buffer_set(NRF_SPIM_Type * p_reg, uint8_t const * p_buffer, - uint8_t length) + size_t length) { p_reg->TXD.PTR = (uint32_t)p_buffer; p_reg->TXD.MAXCNT = length; @@ -494,7 +660,7 @@ __STATIC_INLINE void nrf_spim_tx_buffer_set(NRF_SPIM_Type * p_reg, __STATIC_INLINE void nrf_spim_rx_buffer_set(NRF_SPIM_Type * p_reg, uint8_t * p_buffer, - uint8_t length) + size_t length) { p_reg->RXD.PTR = (uint32_t)p_buffer; p_reg->RXD.MAXCNT = length; @@ -561,11 +727,10 @@ __STATIC_INLINE void nrf_spim_rx_list_disable(NRF_SPIM_Type * p_reg) #endif // SUPPRESS_INLINE_IMPLEMENTATION +/** @} */ #ifdef __cplusplus } #endif #endif // NRF_SPIM_H__ - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_spis.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_spis.h similarity index 93% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_spis.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_spis.h index 68746ad382..d2d56c665d 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_spis.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_spis.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,28 +37,22 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @defgroup nrf_spis_hal SPIS HAL - * @{ - * @ingroup nrf_spis - * - * @brief Hardware access layer for accessing the SPIS peripheral. - */ #ifndef NRF_SPIS_H__ #define NRF_SPIS_H__ -#include -#include -#include - -#include "nrf.h" -#include "nrf_peripherals.h" +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_spis_hal SPIS HAL + * @{ + * @ingroup nrf_spis + * @brief Hardware access layer for managing the SPIS peripheral. + */ /** * @brief This value can be used as a parameter for the @ref nrf_spis_pins_set @@ -306,7 +300,7 @@ __STATIC_INLINE void nrf_spis_pins_set(NRF_SPIS_Type * p_reg, */ __STATIC_INLINE void nrf_spis_tx_buffer_set(NRF_SPIS_Type * p_reg, uint8_t const * p_buffer, - uint8_t length); + size_t length); /** * @brief Function for setting the receive buffer. @@ -317,7 +311,7 @@ __STATIC_INLINE void nrf_spis_tx_buffer_set(NRF_SPIS_Type * p_reg, */ __STATIC_INLINE void nrf_spis_rx_buffer_set(NRF_SPIS_Type * p_reg, uint8_t * p_buffer, - uint8_t length); + size_t length); /** * @brief Function for getting the number of bytes transmitted @@ -327,7 +321,7 @@ __STATIC_INLINE void nrf_spis_rx_buffer_set(NRF_SPIS_Type * p_reg, * * @returns Number of bytes transmitted. */ -__STATIC_INLINE uint8_t nrf_spis_tx_amount_get(NRF_SPIS_Type const * p_reg); +__STATIC_INLINE size_t nrf_spis_tx_amount_get(NRF_SPIS_Type const * p_reg); /** * @brief Function for getting the number of bytes received @@ -337,7 +331,7 @@ __STATIC_INLINE uint8_t nrf_spis_tx_amount_get(NRF_SPIS_Type const * p_reg); * * @returns Number of bytes received. */ -__STATIC_INLINE uint8_t nrf_spis_rx_amount_get(NRF_SPIS_Type const * p_reg); +__STATIC_INLINE size_t nrf_spis_rx_amount_get(NRF_SPIS_Type const * p_reg); /** * @brief Function for setting the SPI configuration. @@ -464,36 +458,61 @@ __STATIC_INLINE void nrf_spis_pins_set(NRF_SPIS_Type * p_reg, uint32_t miso_pin, uint32_t csn_pin) { +#if defined (NRF51) p_reg->PSELSCK = sck_pin; p_reg->PSELMOSI = mosi_pin; p_reg->PSELMISO = miso_pin; p_reg->PSELCSN = csn_pin; +#else + p_reg->PSEL.SCK = sck_pin; + p_reg->PSEL.MOSI = mosi_pin; + p_reg->PSEL.MISO = miso_pin; + p_reg->PSEL.CSN = csn_pin; +#endif } __STATIC_INLINE void nrf_spis_tx_buffer_set(NRF_SPIS_Type * p_reg, uint8_t const * p_buffer, - uint8_t length) + size_t length) { +#if defined (NRF51) p_reg->TXDPTR = (uint32_t)p_buffer; p_reg->MAXTX = length; +#else + p_reg->TXD.PTR = (uint32_t)p_buffer; + p_reg->TXD.MAXCNT = length; +#endif } __STATIC_INLINE void nrf_spis_rx_buffer_set(NRF_SPIS_Type * p_reg, uint8_t * p_buffer, - uint8_t length) + size_t length) { +#if defined (NRF51) p_reg->RXDPTR = (uint32_t)p_buffer; p_reg->MAXRX = length; +#else + p_reg->RXD.PTR = (uint32_t)p_buffer; + p_reg->RXD.MAXCNT = length; +#endif } -__STATIC_INLINE uint8_t nrf_spis_tx_amount_get(NRF_SPIS_Type const * p_reg) +__STATIC_INLINE size_t nrf_spis_tx_amount_get(NRF_SPIS_Type const * p_reg) { - return (uint8_t) p_reg->AMOUNTTX; +#if defined (NRF51) + return p_reg->AMOUNTTX; +#else + return p_reg->TXD.AMOUNT; +#endif } -__STATIC_INLINE uint8_t nrf_spis_rx_amount_get(NRF_SPIS_Type const * p_reg) +__STATIC_INLINE size_t nrf_spis_rx_amount_get(NRF_SPIS_Type const * p_reg) { - return (uint8_t) p_reg->AMOUNTRX; +#if defined (NRF51) + return p_reg->AMOUNTRX; +#else + return p_reg->RXD.AMOUNT; +#endif } __STATIC_INLINE void nrf_spis_configure(NRF_SPIS_Type * p_reg, @@ -543,11 +562,10 @@ __STATIC_INLINE void nrf_spis_def_set(NRF_SPIS_Type * p_reg, #endif // SUPPRESS_INLINE_IMPLEMENTATION +/** @} */ #ifdef __cplusplus } #endif #endif // NRF_SPIS_H__ - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_systick.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_systick.h similarity index 96% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_systick.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_systick.h index 26fbf37e33..4842fb4235 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_systick.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_systick.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,20 +37,21 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ + #ifndef NRF_SYSTICK_H__ #define NRF_SYSTICK_H__ -#include "nrf.h" -#include -#include -#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /** * @defgroup nrf_systick_hal SYSTICK HAL * @{ * @ingroup nrf_systick - * - * @brief Hardware access layer for accessing the SYSTICK peripheral. + * @brief Hardware access layer for managing the SYSTICK peripheral. * * SYSTICK is ARM peripheral, not Nordic design. * It means that it has no Nordic-typical interface with Tasks and Events. @@ -181,4 +182,9 @@ __STATIC_INLINE uint32_t nrf_systick_calib_get(void) #endif /* SUPPRESS_INLINE_IMPLEMENTATION */ /** @} */ + +#ifdef __cplusplus +} +#endif + #endif /* NRF_SYSTICK_H__ */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_temp.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_temp.h similarity index 88% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_temp.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_temp.h index 415a3e74e2..04772a9f4d 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_temp.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_temp.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,24 +37,23 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ + #ifndef NRF_TEMP_H__ #define NRF_TEMP_H__ -#include "nrf.h" +#include #ifdef __cplusplus extern "C" { #endif /** -* @defgroup nrf_temperature TEMP (temperature) abstraction +* @defgroup nrf_temp_hal TEMP HAL * @{ -* @ingroup nrf_drivers temperature_example -* @brief Temperature module init and read functions. -* +* @ingroup nrf_temp temperature_example +* @brief Temperature module init and read functions. */ -/**@cond NO_DOXYGEN */ #define MASK_SIGN (0x00000200UL) #define MASK_SIGN_EXTENSION (0xFFFFFC00UL) @@ -77,13 +76,11 @@ static __INLINE void nrf_temp_init(void) static __INLINE int32_t nrf_temp_read(void) { /**@note Workaround for PAN_028 rev2.0A anomaly 28 - TEMP: Negative measured values are not represented correctly */ - return ((NRF_TEMP->TEMP & MASK_SIGN) != 0) ? (NRF_TEMP->TEMP | MASK_SIGN_EXTENSION) : (NRF_TEMP->TEMP); + return ((NRF_TEMP->TEMP & MASK_SIGN) != 0) ? (int32_t)(NRF_TEMP->TEMP | MASK_SIGN_EXTENSION) : (NRF_TEMP->TEMP); } -/**@endcond */ /** @} */ - #ifdef __cplusplus } #endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_timer.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_timer.h similarity index 94% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_timer.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_timer.h index d089d01b35..2303478d01 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_timer.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_timer.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,35 +37,28 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @defgroup nrf_timer_hal Timer HAL - * @{ - * @ingroup nrf_timer - * - * @brief Hardware access layer for accessing the timer peripheral. - */ #ifndef NRF_TIMER_H__ #define NRF_TIMER_H__ -#include -#include -#include - -#include "nrf_peripherals.h" -#include "nrf.h" -#include "nrf_assert.h" +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_timer_hal TIMER HAL + * @{ + * @ingroup nrf_timer + * @brief Hardware access layer for managing the TIMER peripheral. + */ /** * @brief Macro for validating the correctness of the BIT_WIDTH setting. */ -#define TIMER_MAX_SIZE(id) CONCAT_3(TIMER, id, _MAX_SIZE) +#define TIMER_MAX_SIZE(id) NRFX_CONCAT_3(TIMER, id, _MAX_SIZE) #define TIMER_BIT_WIDTH_MAX(id, bit_width) \ (TIMER_MAX_SIZE(id) == 8 ? (bit_width == NRF_TIMER_BIT_WIDTH_8) : \ @@ -100,7 +93,7 @@ extern "C" { * @brief Macro for getting the number of capture/compare channels available * in a given timer instance. */ -#define NRF_TIMER_CC_CHANNEL_COUNT(id) CONCAT_3(TIMER, id, _CC_NUM) +#define NRF_TIMER_CC_CHANNEL_COUNT(id) NRFX_CONCAT_3(TIMER, id, _CC_NUM) /** * @brief Timer tasks. @@ -117,8 +110,10 @@ typedef enum NRF_TIMER_TASK_CAPTURE1 = offsetof(NRF_TIMER_Type, TASKS_CAPTURE[1]), ///< Task for capturing the timer value on channel 1. NRF_TIMER_TASK_CAPTURE2 = offsetof(NRF_TIMER_Type, TASKS_CAPTURE[2]), ///< Task for capturing the timer value on channel 2. NRF_TIMER_TASK_CAPTURE3 = offsetof(NRF_TIMER_Type, TASKS_CAPTURE[3]), ///< Task for capturing the timer value on channel 3. -#if (TIMER_COUNT > 3) || defined(__SDK_DOXYGEN__) +#if defined(TIMER_INTENSET_COMPARE4_Msk) || defined(__NRFX_DOXYGEN__) NRF_TIMER_TASK_CAPTURE4 = offsetof(NRF_TIMER_Type, TASKS_CAPTURE[4]), ///< Task for capturing the timer value on channel 4. +#endif +#if defined(TIMER_INTENSET_COMPARE5_Msk) || defined(__NRFX_DOXYGEN__) NRF_TIMER_TASK_CAPTURE5 = offsetof(NRF_TIMER_Type, TASKS_CAPTURE[5]), ///< Task for capturing the timer value on channel 5. #endif /*lint -restore*/ @@ -134,8 +129,10 @@ typedef enum NRF_TIMER_EVENT_COMPARE1 = offsetof(NRF_TIMER_Type, EVENTS_COMPARE[1]), ///< Event from compare channel 1. NRF_TIMER_EVENT_COMPARE2 = offsetof(NRF_TIMER_Type, EVENTS_COMPARE[2]), ///< Event from compare channel 2. NRF_TIMER_EVENT_COMPARE3 = offsetof(NRF_TIMER_Type, EVENTS_COMPARE[3]), ///< Event from compare channel 3. -#if (TIMER_COUNT > 3) || defined(__SDK_DOXYGEN__) +#if defined(TIMER_INTENSET_COMPARE4_Msk) || defined(__NRFX_DOXYGEN__) NRF_TIMER_EVENT_COMPARE4 = offsetof(NRF_TIMER_Type, EVENTS_COMPARE[4]), ///< Event from compare channel 4. +#endif +#if defined(TIMER_INTENSET_COMPARE5_Msk) || defined(__NRFX_DOXYGEN__) NRF_TIMER_EVENT_COMPARE5 = offsetof(NRF_TIMER_Type, EVENTS_COMPARE[5]), ///< Event from compare channel 5. #endif /*lint -restore*/ @@ -150,16 +147,20 @@ typedef enum NRF_TIMER_SHORT_COMPARE1_STOP_MASK = TIMER_SHORTS_COMPARE1_STOP_Msk, ///< Shortcut for stopping the timer based on compare 1. NRF_TIMER_SHORT_COMPARE2_STOP_MASK = TIMER_SHORTS_COMPARE2_STOP_Msk, ///< Shortcut for stopping the timer based on compare 2. NRF_TIMER_SHORT_COMPARE3_STOP_MASK = TIMER_SHORTS_COMPARE3_STOP_Msk, ///< Shortcut for stopping the timer based on compare 3. -#if (TIMER_COUNT > 3) || defined(__SDK_DOXYGEN__) +#if defined(TIMER_INTENSET_COMPARE4_Msk) || defined(__NRFX_DOXYGEN__) NRF_TIMER_SHORT_COMPARE4_STOP_MASK = TIMER_SHORTS_COMPARE4_STOP_Msk, ///< Shortcut for stopping the timer based on compare 4. +#endif +#if defined(TIMER_INTENSET_COMPARE5_Msk) || defined(__NRFX_DOXYGEN__) NRF_TIMER_SHORT_COMPARE5_STOP_MASK = TIMER_SHORTS_COMPARE5_STOP_Msk, ///< Shortcut for stopping the timer based on compare 5. #endif NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK = TIMER_SHORTS_COMPARE0_CLEAR_Msk, ///< Shortcut for clearing the timer based on compare 0. NRF_TIMER_SHORT_COMPARE1_CLEAR_MASK = TIMER_SHORTS_COMPARE1_CLEAR_Msk, ///< Shortcut for clearing the timer based on compare 1. NRF_TIMER_SHORT_COMPARE2_CLEAR_MASK = TIMER_SHORTS_COMPARE2_CLEAR_Msk, ///< Shortcut for clearing the timer based on compare 2. NRF_TIMER_SHORT_COMPARE3_CLEAR_MASK = TIMER_SHORTS_COMPARE3_CLEAR_Msk, ///< Shortcut for clearing the timer based on compare 3. -#if (TIMER_COUNT > 3) || defined(__SDK_DOXYGEN__) +#if defined(TIMER_INTENSET_COMPARE4_Msk) || defined(__NRFX_DOXYGEN__) NRF_TIMER_SHORT_COMPARE4_CLEAR_MASK = TIMER_SHORTS_COMPARE4_CLEAR_Msk, ///< Shortcut for clearing the timer based on compare 4. +#endif +#if defined(TIMER_INTENSET_COMPARE5_Msk) || defined(__NRFX_DOXYGEN__) NRF_TIMER_SHORT_COMPARE5_CLEAR_MASK = TIMER_SHORTS_COMPARE5_CLEAR_Msk, ///< Shortcut for clearing the timer based on compare 5. #endif } nrf_timer_short_mask_t; @@ -171,7 +172,7 @@ typedef enum { NRF_TIMER_MODE_TIMER = TIMER_MODE_MODE_Timer, ///< Timer mode: timer. NRF_TIMER_MODE_COUNTER = TIMER_MODE_MODE_Counter, ///< Timer mode: counter. -#if defined(TIMER_MODE_MODE_LowPowerCounter) || defined(__SDK_DOXYGEN__) +#if defined(TIMER_MODE_MODE_LowPowerCounter) || defined(__NRFX_DOXYGEN__) NRF_TIMER_MODE_LOW_POWER_COUNTER = TIMER_MODE_MODE_LowPowerCounter, ///< Timer mode: low-power counter. #endif } nrf_timer_mode_t; @@ -213,8 +214,10 @@ typedef enum NRF_TIMER_CC_CHANNEL1, ///< Timer capture/compare channel 1. NRF_TIMER_CC_CHANNEL2, ///< Timer capture/compare channel 2. NRF_TIMER_CC_CHANNEL3, ///< Timer capture/compare channel 3. -#if (TIMER_COUNT > 3) || defined(__SDK_DOXYGEN__) +#if defined(TIMER_INTENSET_COMPARE4_Msk) || defined(__NRFX_DOXYGEN__) NRF_TIMER_CC_CHANNEL4, ///< Timer capture/compare channel 4. +#endif +#if defined(TIMER_INTENSET_COMPARE5_Msk) || defined(__NRFX_DOXYGEN__) NRF_TIMER_CC_CHANNEL5, ///< Timer capture/compare channel 5. #endif } nrf_timer_cc_channel_t; @@ -228,8 +231,10 @@ typedef enum NRF_TIMER_INT_COMPARE1_MASK = TIMER_INTENSET_COMPARE1_Msk, ///< Timer interrupt from compare event on channel 1. NRF_TIMER_INT_COMPARE2_MASK = TIMER_INTENSET_COMPARE2_Msk, ///< Timer interrupt from compare event on channel 2. NRF_TIMER_INT_COMPARE3_MASK = TIMER_INTENSET_COMPARE3_Msk, ///< Timer interrupt from compare event on channel 3. -#if (TIMER_COUNT > 3) || defined(__SDK_DOXYGEN__) +#if defined(TIMER_INTENSET_COMPARE4_Msk) || defined(__NRFX_DOXYGEN__) NRF_TIMER_INT_COMPARE4_MASK = TIMER_INTENSET_COMPARE4_Msk, ///< Timer interrupt from compare event on channel 4. +#endif +#if defined(TIMER_INTENSET_COMPARE5_Msk) || defined(__NRFX_DOXYGEN__) NRF_TIMER_INT_COMPARE5_MASK = TIMER_INTENSET_COMPARE5_Msk, ///< Timer interrupt from compare event on channel 5. #endif } nrf_timer_int_mask_t; @@ -604,7 +609,7 @@ __STATIC_INLINE uint32_t nrf_timer_us_to_ticks(uint32_t time_us, // The "frequency" parameter here is actually the prescaler value, and the // timer runs at the following frequency: f = 16 MHz / 2^prescaler. uint32_t prescaler = (uint32_t)frequency; - ASSERT(time_us <= (UINT32_MAX / 16UL)); + NRFX_ASSERT(time_us <= (UINT32_MAX / 16UL)); return ((time_us * 16UL) >> prescaler); } @@ -614,17 +619,16 @@ __STATIC_INLINE uint32_t nrf_timer_ms_to_ticks(uint32_t time_ms, // The "frequency" parameter here is actually the prescaler value, and the // timer runs at the following frequency: f = 16000 kHz / 2^prescaler. uint32_t prescaler = (uint32_t)frequency; - ASSERT(time_ms <= (UINT32_MAX / 16000UL)); + NRFX_ASSERT(time_ms <= (UINT32_MAX / 16000UL)); return ((time_ms * 16000UL) >> prescaler); } #endif // SUPPRESS_INLINE_IMPLEMENTATION +/** @} */ #ifdef __cplusplus } #endif #endif // NRF_TIMER_H__ - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_twi.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_twi.h similarity index 90% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_twi.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_twi.h index 5e80272bec..e17b7933cd 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_twi.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_twi.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,28 +37,23 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ + #ifndef NRF_TWI_H__ #define NRF_TWI_H__ +#include + +#ifdef __cplusplus +extern "C" { +#endif + /** * @defgroup nrf_twi_hal TWI HAL * @{ * @ingroup nrf_twi - * - * @brief Hardware access layer for managing the TWI peripheral. + * @brief Hardware access layer for managing the TWI peripheral. */ -#include -#include -#include - -#include "nrf_peripherals.h" -#include "nrf.h" - -#ifdef __cplusplus -extern "C" { -#endif - /** * @brief TWI tasks. */ @@ -93,8 +88,10 @@ typedef enum */ typedef enum { - NRF_TWI_SHORT_BB_SUSPEND_MASK = TWI_SHORTS_BB_SUSPEND_Msk, ///< Shortcut between BB event and SUSPEND task. - NRF_TWI_SHORT_BB_STOP_MASK = TWI_SHORTS_BB_STOP_Msk, ///< Shortcut between BB event and STOP task. + NRF_TWI_SHORT_BB_SUSPEND_MASK = TWI_SHORTS_BB_SUSPEND_Msk, ///< Shortcut between BB event and SUSPEND task. + NRF_TWI_SHORT_BB_STOP_MASK = TWI_SHORTS_BB_STOP_Msk, ///< Shortcut between BB event and STOP task. + NRF_TWI_ALL_SHORTS_MASK = TWI_SHORTS_BB_SUSPEND_Msk | + TWI_SHORTS_BB_STOP_Msk ///< All TWI shortcuts. } nrf_twi_short_mask_t; /** @@ -102,12 +99,18 @@ typedef enum */ typedef enum { - NRF_TWI_INT_STOPPED_MASK = TWI_INTENSET_STOPPED_Msk, ///< Interrupt on STOPPED event. - NRF_TWI_INT_RXDREADY_MASK = TWI_INTENSET_RXDREADY_Msk, ///< Interrupt on RXDREADY event. - NRF_TWI_INT_TXDSENT_MASK = TWI_INTENSET_TXDSENT_Msk, ///< Interrupt on TXDSENT event. - NRF_TWI_INT_ERROR_MASK = TWI_INTENSET_ERROR_Msk, ///< Interrupt on ERROR event. - NRF_TWI_INT_BB_MASK = TWI_INTENSET_BB_Msk, ///< Interrupt on BB event. - NRF_TWI_INT_SUSPENDED_MASK = TWI_INTENSET_SUSPENDED_Msk ///< Interrupt on SUSPENDED event. + NRF_TWI_INT_STOPPED_MASK = TWI_INTENSET_STOPPED_Msk, ///< Interrupt on STOPPED event. + NRF_TWI_INT_RXDREADY_MASK = TWI_INTENSET_RXDREADY_Msk, ///< Interrupt on RXDREADY event. + NRF_TWI_INT_TXDSENT_MASK = TWI_INTENSET_TXDSENT_Msk, ///< Interrupt on TXDSENT event. + NRF_TWI_INT_ERROR_MASK = TWI_INTENSET_ERROR_Msk, ///< Interrupt on ERROR event. + NRF_TWI_INT_BB_MASK = TWI_INTENSET_BB_Msk, ///< Interrupt on BB event. + NRF_TWI_INT_SUSPENDED_MASK = TWI_INTENSET_SUSPENDED_Msk, ///< Interrupt on SUSPENDED event. + NRF_TWI_ALL_INTS_MASK = TWI_INTENSET_STOPPED_Msk | + TWI_INTENSET_RXDREADY_Msk | + TWI_INTENSET_TXDSENT_Msk | + TWI_INTENSET_ERROR_Msk | + TWI_INTENSET_BB_Msk | + TWI_INTENSET_SUSPENDED_Msk ///< All TWI interrupts. } nrf_twi_int_mask_t; /** @@ -307,11 +310,6 @@ __STATIC_INLINE void nrf_twi_txd_set(NRF_TWI_Type * p_reg, uint8_t data); __STATIC_INLINE void nrf_twi_shorts_set(NRF_TWI_Type * p_reg, uint32_t shorts_mask); -/** - * @} - */ - - #ifndef SUPPRESS_INLINE_IMPLEMENTATION __STATIC_INLINE void nrf_twi_task_trigger(NRF_TWI_Type * p_reg, @@ -444,6 +442,7 @@ __STATIC_INLINE void nrf_twi_shorts_set(NRF_TWI_Type * p_reg, #endif // SUPPRESS_INLINE_IMPLEMENTATION +/** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_twim.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_twim.h similarity index 88% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_twim.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_twim.h index 73d790efbf..a5a8e37a82 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_twim.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_twim.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,27 +37,23 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ + #ifndef NRF_TWIM_H__ #define NRF_TWIM_H__ -/** - * @defgroup nrf_twim_hal TWIM HAL - * @{ - * @ingroup nrf_twi - * - * @brief Hardware access layer for managing the TWIM peripheral. - */ - -#include -#include -#include - -#include "nrf.h" +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_twim_hal TWIM HAL + * @{ + * @ingroup nrf_twim + * @brief Hardware access layer for managing the TWIM peripheral. + */ + /** * @brief TWIM tasks. */ @@ -93,11 +89,16 @@ typedef enum */ typedef enum { - NRF_TWIM_SHORT_LASTTX_STARTRX_MASK = TWIM_SHORTS_LASTTX_STARTRX_Msk, ///< Shortcut between LASTTX event and STARTRX task. - NRF_TWIM_SHORT_LASTTX_SUSPEND_MASK = TWIM_SHORTS_LASTTX_SUSPEND_Msk, ///< Shortcut between LASTTX event and SUSPEND task. - NRF_TWIM_SHORT_LASTTX_STOP_MASK = TWIM_SHORTS_LASTTX_STOP_Msk, ///< Shortcut between LASTTX event and STOP task. - NRF_TWIM_SHORT_LASTRX_STARTTX_MASK = TWIM_SHORTS_LASTRX_STARTTX_Msk, ///< Shortcut between LASTRX event and STARTTX task. - NRF_TWIM_SHORT_LASTRX_STOP_MASK = TWIM_SHORTS_LASTRX_STOP_Msk ///< Shortcut between LASTRX event and STOP task. + NRF_TWIM_SHORT_LASTTX_STARTRX_MASK = TWIM_SHORTS_LASTTX_STARTRX_Msk, ///< Shortcut between LASTTX event and STARTRX task. + NRF_TWIM_SHORT_LASTTX_SUSPEND_MASK = TWIM_SHORTS_LASTTX_SUSPEND_Msk, ///< Shortcut between LASTTX event and SUSPEND task. + NRF_TWIM_SHORT_LASTTX_STOP_MASK = TWIM_SHORTS_LASTTX_STOP_Msk, ///< Shortcut between LASTTX event and STOP task. + NRF_TWIM_SHORT_LASTRX_STARTTX_MASK = TWIM_SHORTS_LASTRX_STARTTX_Msk, ///< Shortcut between LASTRX event and STARTTX task. + NRF_TWIM_SHORT_LASTRX_STOP_MASK = TWIM_SHORTS_LASTRX_STOP_Msk, ///< Shortcut between LASTRX event and STOP task. + NRF_TWIM_ALL_SHORTS_MASK = TWIM_SHORTS_LASTTX_STARTRX_Msk | + TWIM_SHORTS_LASTTX_SUSPEND_Msk | + TWIM_SHORTS_LASTTX_STOP_Msk | + TWIM_SHORTS_LASTRX_STARTTX_Msk | + TWIM_SHORTS_LASTRX_STOP_Msk ///< All TWIM shortcuts. } nrf_twim_short_mask_t; /** @@ -107,11 +108,18 @@ typedef enum { NRF_TWIM_INT_STOPPED_MASK = TWIM_INTENSET_STOPPED_Msk, ///< Interrupt on STOPPED event. NRF_TWIM_INT_ERROR_MASK = TWIM_INTENSET_ERROR_Msk, ///< Interrupt on ERROR event. - NRF_TWIM_INT_SUSPENDED_MASK = (1 << 18), ///< Interrupt on SUSPENDED event. + NRF_TWIM_INT_SUSPENDED_MASK = TWIM_INTENSET_SUSPENDED_Msk, ///< Interrupt on SUSPENDED event. NRF_TWIM_INT_RXSTARTED_MASK = TWIM_INTENSET_RXSTARTED_Msk, ///< Interrupt on RXSTARTED event. NRF_TWIM_INT_TXSTARTED_MASK = TWIM_INTENSET_TXSTARTED_Msk, ///< Interrupt on TXSTARTED event. NRF_TWIM_INT_LASTRX_MASK = TWIM_INTENSET_LASTRX_Msk, ///< Interrupt on LASTRX event. - NRF_TWIM_INT_LASTTX_MASK = TWIM_INTENSET_LASTTX_Msk ///< Interrupt on LASTTX event. + NRF_TWIM_INT_LASTTX_MASK = TWIM_INTENSET_LASTTX_Msk, ///< Interrupt on LASTTX event. + NRF_TWIM_ALL_INTS_MASK = TWIM_INTENSET_STOPPED_Msk | + TWIM_INTENSET_ERROR_Msk | + TWIM_INTENSET_SUSPENDED_Msk | + TWIM_INTENSET_RXSTARTED_Msk | + TWIM_INTENSET_TXSTARTED_Msk | + TWIM_INTENSET_LASTRX_Msk | + TWIM_INTENSET_LASTTX_Msk ///< Interrupt on LASTTX event. } nrf_twim_int_mask_t; /** @@ -121,12 +129,7 @@ typedef enum { NRF_TWIM_FREQ_100K = TWIM_FREQUENCY_FREQUENCY_K100, ///< 100 kbps. NRF_TWIM_FREQ_250K = TWIM_FREQUENCY_FREQUENCY_K250, ///< 250 kbps. - NRF_TWIM_FREQ_400K = TWIM_FREQUENCY_FREQUENCY_K400, ///< 400 kbps. -#ifndef TWI_PRESENT - NRF_TWI_FREQ_100K = NRF_TWIM_FREQ_100K, - NRF_TWI_FREQ_250K = NRF_TWIM_FREQ_250K, - NRF_TWI_FREQ_400K = NRF_TWIM_FREQ_400K, -#endif + NRF_TWIM_FREQ_400K = TWIM_FREQUENCY_FREQUENCY_K400 ///< 400 kbps. } nrf_twim_frequency_t; /** @@ -135,11 +138,7 @@ typedef enum typedef enum { NRF_TWIM_ERROR_ADDRESS_NACK = TWIM_ERRORSRC_ANACK_Msk, ///< NACK received after sending the address. - NRF_TWIM_ERROR_DATA_NACK = TWIM_ERRORSRC_DNACK_Msk, ///< NACK received after sending a data byte. -#ifndef TWI_PRESENT - NRF_TWI_ERROR_ADDRESS_NACK = NRF_TWIM_ERROR_ADDRESS_NACK, - NRF_TWI_ERROR_DATA_NACK = NRF_TWIM_ERROR_DATA_NACK, -#endif + NRF_TWIM_ERROR_DATA_NACK = TWIM_ERRORSRC_DNACK_Msk ///< NACK received after sending a data byte. } nrf_twim_error_t; @@ -307,7 +306,7 @@ __STATIC_INLINE void nrf_twim_address_set(NRF_TWIM_Type * p_reg, */ __STATIC_INLINE void nrf_twim_tx_buffer_set(NRF_TWIM_Type * p_reg, uint8_t const * p_buffer, - uint8_t length); + size_t length); /** * @brief Function for setting the receive buffer. @@ -318,14 +317,14 @@ __STATIC_INLINE void nrf_twim_tx_buffer_set(NRF_TWIM_Type * p_reg, */ __STATIC_INLINE void nrf_twim_rx_buffer_set(NRF_TWIM_Type * p_reg, uint8_t * p_buffer, - uint8_t length); + size_t length); __STATIC_INLINE void nrf_twim_shorts_set(NRF_TWIM_Type * p_reg, uint32_t shorts_mask); -__STATIC_INLINE uint32_t nrf_twim_txd_amount_get(NRF_TWIM_Type * p_reg); +__STATIC_INLINE size_t nrf_twim_txd_amount_get(NRF_TWIM_Type * p_reg); -__STATIC_INLINE uint32_t nrf_twim_rxd_amount_get(NRF_TWIM_Type * p_reg); +__STATIC_INLINE size_t nrf_twim_rxd_amount_get(NRF_TWIM_Type * p_reg); /** * @brief Function for enabling the TX list feature. @@ -355,11 +354,6 @@ __STATIC_INLINE void nrf_twim_rx_list_enable(NRF_TWIM_Type * p_reg); */ __STATIC_INLINE void nrf_twim_rx_list_disable(NRF_TWIM_Type * p_reg); -/** - * @} - */ - - #ifndef SUPPRESS_INLINE_IMPLEMENTATION __STATIC_INLINE void nrf_twim_task_trigger(NRF_TWIM_Type * p_reg, @@ -468,7 +462,7 @@ __STATIC_INLINE void nrf_twim_address_set(NRF_TWIM_Type * p_reg, __STATIC_INLINE void nrf_twim_tx_buffer_set(NRF_TWIM_Type * p_reg, uint8_t const * p_buffer, - uint8_t length) + size_t length) { p_reg->TXD.PTR = (uint32_t)p_buffer; p_reg->TXD.MAXCNT = length; @@ -476,7 +470,7 @@ __STATIC_INLINE void nrf_twim_tx_buffer_set(NRF_TWIM_Type * p_reg, __STATIC_INLINE void nrf_twim_rx_buffer_set(NRF_TWIM_Type * p_reg, uint8_t * p_buffer, - uint8_t length) + size_t length) { p_reg->RXD.PTR = (uint32_t)p_buffer; p_reg->RXD.MAXCNT = length; @@ -488,12 +482,12 @@ __STATIC_INLINE void nrf_twim_shorts_set(NRF_TWIM_Type * p_reg, p_reg->SHORTS = shorts_mask; } -__STATIC_INLINE uint32_t nrf_twim_txd_amount_get(NRF_TWIM_Type * p_reg) +__STATIC_INLINE size_t nrf_twim_txd_amount_get(NRF_TWIM_Type * p_reg) { return p_reg->TXD.AMOUNT; } -__STATIC_INLINE uint32_t nrf_twim_rxd_amount_get(NRF_TWIM_Type * p_reg) +__STATIC_INLINE size_t nrf_twim_rxd_amount_get(NRF_TWIM_Type * p_reg) { return p_reg->RXD.AMOUNT; } @@ -519,6 +513,7 @@ __STATIC_INLINE void nrf_twim_rx_list_disable(NRF_TWIM_Type * p_reg) } #endif // SUPPRESS_INLINE_IMPLEMENTATION +/** @} */ #ifdef __cplusplus } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_twis.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_twis.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_twis.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_twis.h index 3cd56d6ce6..30d5018298 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_twis.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_twis.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,27 +37,24 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @ingroup nrf_twis - * @defgroup nrf_twis_hal TWIS HAL - * @{ - * - * @brief @tagAPI52 Hardware access layer for Two Wire Interface Slave with EasyDMA - * (TWIS) peripheral. - */ + #ifndef NRF_TWIS_H__ #define NRF_TWIS_H__ -#include "nrf.h" -#include "sdk_config.h" -#include -#include -#include +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_twis_hal TWIS HAL + * @{ + * @ingroup nrf_twis + * @brief Hardware access layer for managing the Two Wire Interface Slave with EasyDMA + * (TWIS) peripheral. + */ + /** * @brief TWIS tasks */ @@ -703,4 +700,3 @@ uint8_t nrf_twis_orc_get(NRF_TWIS_Type const * const p_reg) #endif #endif /* NRF_TWIS_H__ */ - diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_uart.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_uart.h similarity index 84% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_uart.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_uart.h index 5bb1dcd17c..71d7726510 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_uart.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_uart.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,28 +37,21 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ + #ifndef NRF_UART_H__ #define NRF_UART_H__ -#include "nrf.h" -#include "nrf_peripherals.h" -#include -#include -#include +#include #ifdef __cplusplus extern "C" { #endif -//Temporary defining legacy UART for instance 1 -#define NRF_UART1 (NRF_UART_Type *)NRF_UARTE1 - /** * @defgroup nrf_uart_hal UART HAL * @{ * @ingroup nrf_uart - * - * @brief Hardware access layer for accessing the UART peripheral. + * @brief Hardware access layer for managing the UART peripheral. */ #define NRF_UART_PSEL_DISCONNECTED 0xFFFFFFFF @@ -116,41 +109,24 @@ typedef enum */ typedef enum { -#ifdef UARTE_PRESENT - NRF_UART_BAUDRATE_1200 = UARTE_BAUDRATE_BAUDRATE_Baud1200, /**< 1200 baud. */ - NRF_UART_BAUDRATE_2400 = UARTE_BAUDRATE_BAUDRATE_Baud2400, /**< 2400 baud. */ - NRF_UART_BAUDRATE_4800 = UARTE_BAUDRATE_BAUDRATE_Baud4800, /**< 4800 baud. */ - NRF_UART_BAUDRATE_9600 = UARTE_BAUDRATE_BAUDRATE_Baud9600, /**< 9600 baud. */ - NRF_UART_BAUDRATE_14400 = UARTE_BAUDRATE_BAUDRATE_Baud14400, /**< 14400 baud. */ - NRF_UART_BAUDRATE_19200 = UARTE_BAUDRATE_BAUDRATE_Baud19200, /**< 19200 baud. */ - NRF_UART_BAUDRATE_28800 = UARTE_BAUDRATE_BAUDRATE_Baud28800, /**< 28800 baud. */ - NRF_UART_BAUDRATE_38400 = UARTE_BAUDRATE_BAUDRATE_Baud38400, /**< 38400 baud. */ - NRF_UART_BAUDRATE_57600 = UARTE_BAUDRATE_BAUDRATE_Baud57600, /**< 57600 baud. */ - NRF_UART_BAUDRATE_76800 = UARTE_BAUDRATE_BAUDRATE_Baud76800, /**< 76800 baud. */ - NRF_UART_BAUDRATE_115200 = UARTE_BAUDRATE_BAUDRATE_Baud115200, /**< 115200 baud. */ - NRF_UART_BAUDRATE_230400 = UARTE_BAUDRATE_BAUDRATE_Baud230400, /**< 230400 baud. */ - NRF_UART_BAUDRATE_250000 = UARTE_BAUDRATE_BAUDRATE_Baud250000, /**< 250000 baud. */ - NRF_UART_BAUDRATE_460800 = UARTE_BAUDRATE_BAUDRATE_Baud460800, /**< 460800 baud. */ - NRF_UART_BAUDRATE_921600 = UARTE_BAUDRATE_BAUDRATE_Baud921600, /**< 921600 baud. */ - NRF_UART_BAUDRATE_1000000 = UARTE_BAUDRATE_BAUDRATE_Baud1M, /**< 1000000 baud. */ -#else - NRF_UART_BAUDRATE_1200 = UART_BAUDRATE_BAUDRATE_Baud1200, /**< 1200 baud. */ - NRF_UART_BAUDRATE_2400 = UART_BAUDRATE_BAUDRATE_Baud2400, /**< 2400 baud. */ - NRF_UART_BAUDRATE_4800 = UART_BAUDRATE_BAUDRATE_Baud4800, /**< 4800 baud. */ - NRF_UART_BAUDRATE_9600 = UART_BAUDRATE_BAUDRATE_Baud9600, /**< 9600 baud. */ - NRF_UART_BAUDRATE_14400 = UART_BAUDRATE_BAUDRATE_Baud14400, /**< 14400 baud. */ - NRF_UART_BAUDRATE_19200 = UART_BAUDRATE_BAUDRATE_Baud19200, /**< 19200 baud. */ - NRF_UART_BAUDRATE_28800 = UART_BAUDRATE_BAUDRATE_Baud28800, /**< 28800 baud. */ - NRF_UART_BAUDRATE_38400 = UART_BAUDRATE_BAUDRATE_Baud38400, /**< 38400 baud. */ - NRF_UART_BAUDRATE_57600 = UART_BAUDRATE_BAUDRATE_Baud57600, /**< 57600 baud. */ - NRF_UART_BAUDRATE_76800 = UART_BAUDRATE_BAUDRATE_Baud76800, /**< 76800 baud. */ - NRF_UART_BAUDRATE_115200 = UART_BAUDRATE_BAUDRATE_Baud115200, /**< 115200 baud. */ - NRF_UART_BAUDRATE_230400 = UART_BAUDRATE_BAUDRATE_Baud230400, /**< 230400 baud. */ - NRF_UART_BAUDRATE_250000 = UART_BAUDRATE_BAUDRATE_Baud250000, /**< 250000 baud. */ - NRF_UART_BAUDRATE_460800 = UART_BAUDRATE_BAUDRATE_Baud460800, /**< 460800 baud. */ - NRF_UART_BAUDRATE_921600 = UART_BAUDRATE_BAUDRATE_Baud921600, /**< 921600 baud. */ - NRF_UART_BAUDRATE_1000000 = UART_BAUDRATE_BAUDRATE_Baud1M, /**< 1000000 baud. */ -#endif + NRF_UART_BAUDRATE_1200 = UART_BAUDRATE_BAUDRATE_Baud1200, /**< 1200 baud. */ + NRF_UART_BAUDRATE_2400 = UART_BAUDRATE_BAUDRATE_Baud2400, /**< 2400 baud. */ + NRF_UART_BAUDRATE_4800 = UART_BAUDRATE_BAUDRATE_Baud4800, /**< 4800 baud. */ + NRF_UART_BAUDRATE_9600 = UART_BAUDRATE_BAUDRATE_Baud9600, /**< 9600 baud. */ + NRF_UART_BAUDRATE_14400 = UART_BAUDRATE_BAUDRATE_Baud14400, /**< 14400 baud. */ + NRF_UART_BAUDRATE_19200 = UART_BAUDRATE_BAUDRATE_Baud19200, /**< 19200 baud. */ + NRF_UART_BAUDRATE_28800 = UART_BAUDRATE_BAUDRATE_Baud28800, /**< 28800 baud. */ + NRF_UART_BAUDRATE_31250 = UART_BAUDRATE_BAUDRATE_Baud31250, /**< 31250 baud. */ + NRF_UART_BAUDRATE_38400 = UART_BAUDRATE_BAUDRATE_Baud38400, /**< 38400 baud. */ + NRF_UART_BAUDRATE_56000 = UART_BAUDRATE_BAUDRATE_Baud56000, /**< 56000 baud. */ + NRF_UART_BAUDRATE_57600 = UART_BAUDRATE_BAUDRATE_Baud57600, /**< 57600 baud. */ + NRF_UART_BAUDRATE_76800 = UART_BAUDRATE_BAUDRATE_Baud76800, /**< 76800 baud. */ + NRF_UART_BAUDRATE_115200 = UART_BAUDRATE_BAUDRATE_Baud115200, /**< 115200 baud. */ + NRF_UART_BAUDRATE_230400 = UART_BAUDRATE_BAUDRATE_Baud230400, /**< 230400 baud. */ + NRF_UART_BAUDRATE_250000 = UART_BAUDRATE_BAUDRATE_Baud250000, /**< 250000 baud. */ + NRF_UART_BAUDRATE_460800 = UART_BAUDRATE_BAUDRATE_Baud460800, /**< 460800 baud. */ + NRF_UART_BAUDRATE_921600 = UART_BAUDRATE_BAUDRATE_Baud921600, /**< 921600 baud. */ + NRF_UART_BAUDRATE_1000000 = UART_BAUDRATE_BAUDRATE_Baud1M, /**< 1000000 baud. */ } nrf_uart_baudrate_t; /** @@ -540,6 +516,7 @@ __STATIC_INLINE void nrf_uart_baudrate_set(NRF_UART_Type * p_reg, nrf_uart_bau p_reg->BAUDRATE = baudrate; } #endif //SUPPRESS_INLINE_IMPLEMENTATION + /** @} */ #ifdef __cplusplus diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_uarte.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_uarte.h similarity index 75% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_uarte.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_uarte.h index 2576a7770c..b1e65dca12 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_uarte.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_uarte.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,14 +37,11 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ + #ifndef NRF_UARTE_H__ #define NRF_UARTE_H__ -#include "nrf.h" -#include "nrf_peripherals.h" -#include -#include -#include +#include #ifdef __cplusplus extern "C" { @@ -55,9 +52,8 @@ extern "C" { /** * @defgroup nrf_uarte_hal UARTE HAL * @{ - * @ingroup nrf_uart - * - * @brief Hardware access layer for accessing the UARTE peripheral. + * @ingroup nrf_uarte + * @brief Hardware access layer for managing the UARTE peripheral. */ /** @@ -67,11 +63,11 @@ extern "C" { typedef enum { /*lint -save -e30*/ - NRF_UARTE_TASK_STARTRX = offsetof(NRF_UARTE_Type, TASKS_STARTRX),///< Start UART receiver. - NRF_UARTE_TASK_STOPRX = offsetof(NRF_UARTE_Type, TASKS_STOPRX), ///< Stop UART receiver. - NRF_UARTE_TASK_STARTTX = offsetof(NRF_UARTE_Type, TASKS_STARTTX),///< Start UART transmitter. - NRF_UARTE_TASK_STOPTX = offsetof(NRF_UARTE_Type, TASKS_STOPTX), ///< Stop UART transmitter. - NRF_UARTE_TASK_FLUSHRX = offsetof(NRF_UARTE_Type, TASKS_FLUSHRX) ///< Flush RX FIFO in RX buffer. + NRF_UARTE_TASK_STARTRX = offsetof(NRF_UARTE_Type, TASKS_STARTRX), ///< Start UART receiver. + NRF_UARTE_TASK_STOPRX = offsetof(NRF_UARTE_Type, TASKS_STOPRX), ///< Stop UART receiver. + NRF_UARTE_TASK_STARTTX = offsetof(NRF_UARTE_Type, TASKS_STARTTX), ///< Start UART transmitter. + NRF_UARTE_TASK_STOPTX = offsetof(NRF_UARTE_Type, TASKS_STOPTX), ///< Stop UART transmitter. + NRF_UARTE_TASK_FLUSHRX = offsetof(NRF_UARTE_Type, TASKS_FLUSHRX) ///< Flush RX FIFO in RX buffer. /*lint -restore*/ } nrf_uarte_task_t; @@ -82,15 +78,17 @@ typedef enum typedef enum { /*lint -save -e30*/ - NRF_UARTE_EVENT_CTS = offsetof(NRF_UARTE_Type, EVENTS_CTS), ///< CTS is activated. - NRF_UARTE_EVENT_NCTS = offsetof(NRF_UARTE_Type, EVENTS_NCTS), ///< CTS is deactivated. - NRF_UARTE_EVENT_ENDRX = offsetof(NRF_UARTE_Type, EVENTS_ENDRX), ///< Receive buffer is filled up. - NRF_UARTE_EVENT_ENDTX = offsetof(NRF_UARTE_Type, EVENTS_ENDTX), ///< Last TX byte transmitted. - NRF_UARTE_EVENT_ERROR = offsetof(NRF_UARTE_Type, EVENTS_ERROR), ///< Error detected. - NRF_UARTE_EVENT_RXTO = offsetof(NRF_UARTE_Type, EVENTS_RXTO), ///< Receiver timeout. - NRF_UARTE_EVENT_RXSTARTED = offsetof(NRF_UARTE_Type, EVENTS_RXSTARTED),///< Receiver has started. - NRF_UARTE_EVENT_TXSTARTED = offsetof(NRF_UARTE_Type, EVENTS_TXSTARTED),///< Transmitter has started. - NRF_UARTE_EVENT_TXSTOPPED = offsetof(NRF_UARTE_Type, EVENTS_TXSTOPPED) ///< Transmitted stopped. + NRF_UARTE_EVENT_CTS = offsetof(NRF_UARTE_Type, EVENTS_CTS), ///< CTS is activated. + NRF_UARTE_EVENT_NCTS = offsetof(NRF_UARTE_Type, EVENTS_NCTS), ///< CTS is deactivated. + NRF_UARTE_EVENT_RXDRDY = offsetof(NRF_UARTE_Type, EVENTS_RXDRDY), ///< Data received in RXD (but potentially not yet transferred to Data RAM). + NRF_UARTE_EVENT_ENDRX = offsetof(NRF_UARTE_Type, EVENTS_ENDRX), ///< Receive buffer is filled up. + NRF_UARTE_EVENT_TXDDY = offsetof(NRF_UARTE_Type, EVENTS_TXDRDY), ///< Data sent from TXD. + NRF_UARTE_EVENT_ENDTX = offsetof(NRF_UARTE_Type, EVENTS_ENDTX), ///< Last TX byte transmitted. + NRF_UARTE_EVENT_ERROR = offsetof(NRF_UARTE_Type, EVENTS_ERROR), ///< Error detected. + NRF_UARTE_EVENT_RXTO = offsetof(NRF_UARTE_Type, EVENTS_RXTO), ///< Receiver timeout. + NRF_UARTE_EVENT_RXSTARTED = offsetof(NRF_UARTE_Type, EVENTS_RXSTARTED), ///< Receiver has started. + NRF_UARTE_EVENT_TXSTARTED = offsetof(NRF_UARTE_Type, EVENTS_TXSTARTED), ///< Transmitter has started. + NRF_UARTE_EVENT_TXSTOPPED = offsetof(NRF_UARTE_Type, EVENTS_TXSTOPPED) ///< Transmitted stopped. /*lint -restore*/ } nrf_uarte_event_t; @@ -99,8 +97,8 @@ typedef enum */ typedef enum { - NRF_UARTE_SHORT_ENDRX_STARTRX = UARTE_SHORTS_ENDRX_STARTRX_Msk,///< Shortcut between ENDRX event and STARTRX task. - NRF_UARTE_SHORT_ENDRX_STOPRX = UARTE_SHORTS_ENDRX_STOPRX_Msk, ///< Shortcut between ENDRX event and STOPRX task. + NRF_UARTE_SHORT_ENDRX_STARTRX = UARTE_SHORTS_ENDRX_STARTRX_Msk, ///< Shortcut between ENDRX event and STARTRX task. + NRF_UARTE_SHORT_ENDRX_STOPRX = UARTE_SHORTS_ENDRX_STOPRX_Msk ///< Shortcut between ENDRX event and STOPRX task. } nrf_uarte_short_t; @@ -110,15 +108,17 @@ typedef enum */ typedef enum { - NRF_UARTE_INT_CTS_MASK = UARTE_INTENSET_CTS_Msk, ///< Interrupt on CTS event. - NRF_UARTE_INT_NCTSRX_MASK = UARTE_INTENSET_NCTS_Msk, ///< Interrupt on NCTS event. - NRF_UARTE_INT_ENDRX_MASK = UARTE_INTENSET_ENDRX_Msk, ///< Interrupt on ENDRX event. - NRF_UARTE_INT_ENDTX_MASK = UARTE_INTENSET_ENDTX_Msk, ///< Interrupt on ENDTX event. - NRF_UARTE_INT_ERROR_MASK = UARTE_INTENSET_ERROR_Msk, ///< Interrupt on ERROR event. - NRF_UARTE_INT_RXTO_MASK = UARTE_INTENSET_RXTO_Msk, ///< Interrupt on RXTO event. - NRF_UARTE_INT_RXSTARTED_MASK = UARTE_INTENSET_RXSTARTED_Msk,///< Interrupt on RXSTARTED event. - NRF_UARTE_INT_TXSTARTED_MASK = UARTE_INTENSET_TXSTARTED_Msk,///< Interrupt on TXSTARTED event. - NRF_UARTE_INT_TXSTOPPED_MASK = UARTE_INTENSET_TXSTOPPED_Msk ///< Interrupt on TXSTOPPED event. + NRF_UARTE_INT_CTS_MASK = UARTE_INTENSET_CTS_Msk, ///< Interrupt on CTS event. + NRF_UARTE_INT_NCTS_MASK = UARTE_INTENSET_NCTS_Msk, ///< Interrupt on NCTS event. + NRF_UARTE_INT_RXDRDY_MASK = UARTE_INTENSET_RXDRDY_Msk, ///< Interrupt on RXDRDY event. + NRF_UARTE_INT_ENDRX_MASK = UARTE_INTENSET_ENDRX_Msk, ///< Interrupt on ENDRX event. + NRF_UARTE_INT_TXDRDY_MASK = UARTE_INTENSET_TXDRDY_Msk, ///< Interrupt on TXDRDY event. + NRF_UARTE_INT_ENDTX_MASK = UARTE_INTENSET_ENDTX_Msk, ///< Interrupt on ENDTX event. + NRF_UARTE_INT_ERROR_MASK = UARTE_INTENSET_ERROR_Msk, ///< Interrupt on ERROR event. + NRF_UARTE_INT_RXTO_MASK = UARTE_INTENSET_RXTO_Msk, ///< Interrupt on RXTO event. + NRF_UARTE_INT_RXSTARTED_MASK = UARTE_INTENSET_RXSTARTED_Msk, ///< Interrupt on RXSTARTED event. + NRF_UARTE_INT_TXSTARTED_MASK = UARTE_INTENSET_TXSTARTED_Msk, ///< Interrupt on TXSTARTED event. + NRF_UARTE_INT_TXSTOPPED_MASK = UARTE_INTENSET_TXSTOPPED_Msk ///< Interrupt on TXSTOPPED event. } nrf_uarte_int_mask_t; /** @@ -127,40 +127,24 @@ typedef enum */ typedef enum { - NRF_UARTE_BAUDRATE_1200 = UARTE_BAUDRATE_BAUDRATE_Baud1200, ///< 1200 baud. - NRF_UARTE_BAUDRATE_2400 = UARTE_BAUDRATE_BAUDRATE_Baud2400, ///< 2400 baud. - NRF_UARTE_BAUDRATE_4800 = UARTE_BAUDRATE_BAUDRATE_Baud4800, ///< 4800 baud. - NRF_UARTE_BAUDRATE_9600 = UARTE_BAUDRATE_BAUDRATE_Baud9600, ///< 9600 baud. - NRF_UARTE_BAUDRATE_14400 = UARTE_BAUDRATE_BAUDRATE_Baud14400, ///< 14400 baud. - NRF_UARTE_BAUDRATE_19200 = UARTE_BAUDRATE_BAUDRATE_Baud19200, ///< 19200 baud. - NRF_UARTE_BAUDRATE_28800 = UARTE_BAUDRATE_BAUDRATE_Baud28800, ///< 28800 baud. - NRF_UARTE_BAUDRATE_38400 = UARTE_BAUDRATE_BAUDRATE_Baud38400, ///< 38400 baud. - NRF_UARTE_BAUDRATE_57600 = UARTE_BAUDRATE_BAUDRATE_Baud57600, ///< 57600 baud. - NRF_UARTE_BAUDRATE_76800 = UARTE_BAUDRATE_BAUDRATE_Baud76800, ///< 76800 baud. - NRF_UARTE_BAUDRATE_115200 = UARTE_BAUDRATE_BAUDRATE_Baud115200, ///< 115200 baud. - NRF_UARTE_BAUDRATE_230400 = UARTE_BAUDRATE_BAUDRATE_Baud230400, ///< 230400 baud. - NRF_UARTE_BAUDRATE_250000 = UARTE_BAUDRATE_BAUDRATE_Baud250000, ///< 250000 baud. - NRF_UARTE_BAUDRATE_460800 = UARTE_BAUDRATE_BAUDRATE_Baud460800, ///< 460800 baud. - NRF_UARTE_BAUDRATE_921600 = UARTE_BAUDRATE_BAUDRATE_Baud921600, ///< 921600 baud. - NRF_UARTE_BAUDRATE_1000000 = UARTE_BAUDRATE_BAUDRATE_Baud1M, ///< 1000000 baud. -#ifndef UART_PRESENT - NRF_UART_BAUDRATE_1200 = NRF_UARTE_BAUDRATE_1200, - NRF_UART_BAUDRATE_2400 = NRF_UARTE_BAUDRATE_2400, - NRF_UART_BAUDRATE_4800 = NRF_UARTE_BAUDRATE_4800, - NRF_UART_BAUDRATE_9600 = NRF_UARTE_BAUDRATE_9600, - NRF_UART_BAUDRATE_14400 = NRF_UARTE_BAUDRATE_14400, - NRF_UART_BAUDRATE_19200 = NRF_UARTE_BAUDRATE_19200, - NRF_UART_BAUDRATE_28800 = NRF_UARTE_BAUDRATE_28800, - NRF_UART_BAUDRATE_38400 = NRF_UARTE_BAUDRATE_38400, - NRF_UART_BAUDRATE_57600 = NRF_UARTE_BAUDRATE_57600, - NRF_UART_BAUDRATE_76800 = NRF_UARTE_BAUDRATE_76800, - NRF_UART_BAUDRATE_115200 = NRF_UARTE_BAUDRATE_115200, - NRF_UART_BAUDRATE_230400 = NRF_UARTE_BAUDRATE_230400, - NRF_UART_BAUDRATE_250000 = NRF_UARTE_BAUDRATE_250000, - NRF_UART_BAUDRATE_460800 = NRF_UARTE_BAUDRATE_460800, - NRF_UART_BAUDRATE_921600 = NRF_UARTE_BAUDRATE_921600, - NRF_UART_BAUDRATE_1000000 = NRF_UARTE_BAUDRATE_1000000, -#endif + NRF_UARTE_BAUDRATE_1200 = UARTE_BAUDRATE_BAUDRATE_Baud1200, ///< 1200 baud. + NRF_UARTE_BAUDRATE_2400 = UARTE_BAUDRATE_BAUDRATE_Baud2400, ///< 2400 baud. + NRF_UARTE_BAUDRATE_4800 = UARTE_BAUDRATE_BAUDRATE_Baud4800, ///< 4800 baud. + NRF_UARTE_BAUDRATE_9600 = UARTE_BAUDRATE_BAUDRATE_Baud9600, ///< 9600 baud. + NRF_UARTE_BAUDRATE_14400 = UARTE_BAUDRATE_BAUDRATE_Baud14400, ///< 14400 baud. + NRF_UARTE_BAUDRATE_19200 = UARTE_BAUDRATE_BAUDRATE_Baud19200, ///< 19200 baud. + NRF_UARTE_BAUDRATE_28800 = UARTE_BAUDRATE_BAUDRATE_Baud28800, ///< 28800 baud. + NRF_UARTE_BAUDRATE_31250 = UARTE_BAUDRATE_BAUDRATE_Baud31250, ///< 31250 baud. + NRF_UARTE_BAUDRATE_38400 = UARTE_BAUDRATE_BAUDRATE_Baud38400, ///< 38400 baud. + NRF_UARTE_BAUDRATE_56000 = UARTE_BAUDRATE_BAUDRATE_Baud56000, ///< 56000 baud. + NRF_UARTE_BAUDRATE_57600 = UARTE_BAUDRATE_BAUDRATE_Baud57600, ///< 57600 baud. + NRF_UARTE_BAUDRATE_76800 = UARTE_BAUDRATE_BAUDRATE_Baud76800, ///< 76800 baud. + NRF_UARTE_BAUDRATE_115200 = UARTE_BAUDRATE_BAUDRATE_Baud115200, ///< 115200 baud. + NRF_UARTE_BAUDRATE_230400 = UARTE_BAUDRATE_BAUDRATE_Baud230400, ///< 230400 baud. + NRF_UARTE_BAUDRATE_250000 = UARTE_BAUDRATE_BAUDRATE_Baud250000, ///< 250000 baud. + NRF_UARTE_BAUDRATE_460800 = UARTE_BAUDRATE_BAUDRATE_Baud460800, ///< 460800 baud. + NRF_UARTE_BAUDRATE_921600 = UARTE_BAUDRATE_BAUDRATE_Baud921600, ///< 921600 baud. + NRF_UARTE_BAUDRATE_1000000 = UARTE_BAUDRATE_BAUDRATE_Baud1M ///< 1000000 baud. } nrf_uarte_baudrate_t; /** @@ -169,16 +153,10 @@ typedef enum */ typedef enum { - NRF_UARTE_ERROR_OVERRUN_MASK = UARTE_ERRORSRC_OVERRUN_Msk, ///< Overrun error. - NRF_UARTE_ERROR_PARITY_MASK = UARTE_ERRORSRC_PARITY_Msk, ///< Parity error. - NRF_UARTE_ERROR_FRAMING_MASK = UARTE_ERRORSRC_FRAMING_Msk, ///< Framing error. - NRF_UARTE_ERROR_BREAK_MASK = UARTE_ERRORSRC_BREAK_Msk, ///< Break error. -#ifndef UART_PRESENT - NRF_UART_ERROR_OVERRUN_MASK = NRF_UARTE_ERROR_OVERRUN_MASK, - NRF_UART_ERROR_PARITY_MASK = NRF_UARTE_ERROR_PARITY_MASK, - NRF_UART_ERROR_FRAMING_MASK = NRF_UARTE_ERROR_FRAMING_MASK, - NRF_UART_ERROR_BREAK_MASK = NRF_UARTE_ERROR_BREAK_MASK, -#endif + NRF_UARTE_ERROR_OVERRUN_MASK = UARTE_ERRORSRC_OVERRUN_Msk, ///< Overrun error. + NRF_UARTE_ERROR_PARITY_MASK = UARTE_ERRORSRC_PARITY_Msk, ///< Parity error. + NRF_UARTE_ERROR_FRAMING_MASK = UARTE_ERRORSRC_FRAMING_Msk, ///< Framing error. + NRF_UARTE_ERROR_BREAK_MASK = UARTE_ERRORSRC_BREAK_Msk ///< Break error. } nrf_uarte_error_mask_t; /** @@ -188,11 +166,7 @@ typedef enum typedef enum { NRF_UARTE_PARITY_EXCLUDED = UARTE_CONFIG_PARITY_Excluded << UARTE_CONFIG_PARITY_Pos, ///< Parity excluded. - NRF_UARTE_PARITY_INCLUDED = UARTE_CONFIG_PARITY_Included << UARTE_CONFIG_PARITY_Pos, ///< Parity included. -#ifndef UART_PRESENT - NRF_UART_PARITY_EXCLUDED = NRF_UARTE_PARITY_EXCLUDED, - NRF_UART_PARITY_INCLUDED = NRF_UARTE_PARITY_INCLUDED, -#endif + NRF_UARTE_PARITY_INCLUDED = UARTE_CONFIG_PARITY_Included << UARTE_CONFIG_PARITY_Pos ///< Parity included. } nrf_uarte_parity_t; /** @@ -202,11 +176,7 @@ typedef enum typedef enum { NRF_UARTE_HWFC_DISABLED = UARTE_CONFIG_HWFC_Disabled << UARTE_CONFIG_HWFC_Pos, ///< HW flow control disabled. - NRF_UARTE_HWFC_ENABLED = UARTE_CONFIG_HWFC_Enabled << UARTE_CONFIG_HWFC_Pos, ///< HW flow control enabled. -#ifndef UART_PRESENT - NRF_UART_HWFC_DISABLED = NRF_UARTE_HWFC_DISABLED, - NRF_UART_HWFC_ENABLED = NRF_UARTE_HWFC_ENABLED, -#endif + NRF_UARTE_HWFC_ENABLED = UARTE_CONFIG_HWFC_Enabled << UARTE_CONFIG_HWFC_Pos ///< HW flow control enabled. } nrf_uarte_hwfc_t; @@ -228,25 +198,6 @@ __STATIC_INLINE void nrf_uarte_event_clear(NRF_UARTE_Type * p_reg, nrf_uarte_eve */ __STATIC_INLINE bool nrf_uarte_event_check(NRF_UARTE_Type * p_reg, nrf_uarte_event_t event); -/** - * @brief Function for checking the state of a specific extra UARTE event. - * - * @param[in] p_reg Pointer to the peripheral registers structure. - * @param[in] event Event to check. - * - * @retval True if event is set, False otherwise. - */ -__STATIC_INLINE bool nrf_uarte_event_extra_check(NRF_UARTE_Type * p_reg, uint32_t event); - -/** - * @brief Function for clearing a specific extra UARTE event. - * - * @param[in] p_reg Pointer to the peripheral registers structure. - * @param[in] event Extra event to clear. - */ - -__STATIC_INLINE void nrf_uarte_event_extra_clear(NRF_UARTE_Type * p_reg, uint32_t event); - /** * @brief Function for returning the address of a specific UARTE event register. * @@ -433,7 +384,7 @@ __STATIC_INLINE void nrf_uarte_baudrate_set(NRF_UARTE_Type * p_reg, nrf_uarte_ */ __STATIC_INLINE void nrf_uarte_tx_buffer_set(NRF_UARTE_Type * p_reg, uint8_t const * p_buffer, - uint8_t length); + size_t length); /** * @brief Function for getting number of bytes transmitted in the last transaction. @@ -453,7 +404,7 @@ __STATIC_INLINE uint32_t nrf_uarte_tx_amount_get(NRF_UARTE_Type * p_reg); */ __STATIC_INLINE void nrf_uarte_rx_buffer_set(NRF_UARTE_Type * p_reg, uint8_t * p_buffer, - uint8_t length); + size_t length); /** * @brief Function for getting number of bytes received in the last transaction. @@ -475,25 +426,11 @@ __STATIC_INLINE void nrf_uarte_event_clear(NRF_UARTE_Type * p_reg, nrf_uarte_eve } -__STATIC_INLINE void nrf_uarte_event_extra_clear(NRF_UARTE_Type * p_reg, uint32_t event) -{ - *((volatile uint32_t *)((uint8_t *)p_reg + (uint32_t)event)) = 0x0UL; -#if __CORTEX_M == 0x04 - volatile uint32_t dummy = *((volatile uint32_t *)((uint8_t *)p_reg + (uint32_t)event)); - (void)dummy; -#endif - -} __STATIC_INLINE bool nrf_uarte_event_check(NRF_UARTE_Type * p_reg, nrf_uarte_event_t event) { return (bool)*(volatile uint32_t *)((uint8_t *)p_reg + (uint32_t)event); } -__STATIC_INLINE bool nrf_uarte_event_extra_check(NRF_UARTE_Type * p_reg, uint32_t event) -{ - return (bool)*(volatile uint32_t *)((uint8_t *)p_reg + (uint32_t)event); -} - __STATIC_INLINE uint32_t nrf_uarte_event_address_get(NRF_UARTE_Type * p_reg, nrf_uarte_event_t event) { @@ -608,7 +545,7 @@ __STATIC_INLINE void nrf_uarte_baudrate_set(NRF_UARTE_Type * p_reg, nrf_uarte_ __STATIC_INLINE void nrf_uarte_tx_buffer_set(NRF_UARTE_Type * p_reg, uint8_t const * p_buffer, - uint8_t length) + size_t length) { p_reg->TXD.PTR = (uint32_t)p_buffer; p_reg->TXD.MAXCNT = length; @@ -621,7 +558,7 @@ __STATIC_INLINE uint32_t nrf_uarte_tx_amount_get(NRF_UARTE_Type * p_reg) __STATIC_INLINE void nrf_uarte_rx_buffer_set(NRF_UARTE_Type * p_reg, uint8_t * p_buffer, - uint8_t length) + size_t length) { p_reg->RXD.PTR = (uint32_t)p_buffer; p_reg->RXD.MAXCNT = length; @@ -632,6 +569,7 @@ __STATIC_INLINE uint32_t nrf_uarte_rx_amount_get(NRF_UARTE_Type * p_reg) return p_reg->RXD.AMOUNT; } #endif //SUPPRESS_INLINE_IMPLEMENTATION + /** @} */ #ifdef __cplusplus @@ -639,4 +577,3 @@ __STATIC_INLINE uint32_t nrf_uarte_rx_amount_get(NRF_UARTE_Type * p_reg) #endif #endif //NRF_UARTE_H__ - diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_usbd.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_usbd.h similarity index 93% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_usbd.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_usbd.h index 8905788db0..c020fc8968 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_usbd.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_usbd.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -41,25 +41,20 @@ #ifndef NRF_USBD_H__ #define NRF_USBD_H__ -/** - * @ingroup nrf_drivers - * @defgroup nrf_usbd_hal USBD HAL - * @{ - * - * @brief @tagAPI52840 Hardware access layer for Universal Serial Bus Device (USBD) peripheral. - */ - -#include "nrf_peripherals.h" -#include "nrf.h" -#include "nrf_assert.h" -#include -#include -#include +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_usbd_hal USBD HAL + * @{ + * @ingroup nrf_usbd + * @brief Hardware access layer for managing the Universal Serial Bus Device (USBD) + * peripheral. + */ + /** * @brief USBD tasks */ @@ -123,7 +118,6 @@ typedef enum NRF_USBD_EVENT_USBEVENT = offsetof(NRF_USBD_Type, EVENTS_USBEVENT ), /**< An event or an error not covered by specific events has occurred, check EVENTCAUSE register to find the cause */ NRF_USBD_EVENT_EP0SETUP = offsetof(NRF_USBD_Type, EVENTS_EP0SETUP ), /**< A valid SETUP token has been received (and acknowledged) on the control endpoint */ NRF_USBD_EVENT_DATAEP = offsetof(NRF_USBD_Type, EVENTS_EPDATA ), /**< A data transfer has occurred on a data endpoint, indicated by the EPDATASTATUS register */ - NRF_USBD_EVENT_ACCESSFAULT = offsetof(NRF_USBD_Type, EVENTS_ACCESSFAULT), /**< >Access to an unavailable USB register has been attempted (software or EasyDMA) */ /*lint -restore*/ }nrf_usbd_event_t; @@ -169,7 +163,6 @@ typedef enum NRF_USBD_INT_USBEVENT_MASK = USBD_INTEN_USBEVENT_Msk , /**< Enable or disable interrupt for USBEVENT event */ NRF_USBD_INT_EP0SETUP_MASK = USBD_INTEN_EP0SETUP_Msk , /**< Enable or disable interrupt for EP0SETUP event */ NRF_USBD_INT_DATAEP_MASK = USBD_INTEN_EPDATA_Msk , /**< Enable or disable interrupt for EPDATA event */ - NRF_USBD_INT_ACCESSFAULT_MASK = USBD_INTEN_ACCESSFAULT_Msk, /**< Enable or disable interrupt for ACCESSFAULT event */ }nrf_usbd_int_mask_t; @@ -554,31 +547,6 @@ typedef enum NRF_USBD_EVENTCAUSE_WUREQ_MASK = (1U << 10) /**< The USBD peripheral has exited Low Power mode */ }nrf_usbd_eventcause_mask_t; -/** - * @brief BUSSTATE register bit masks - */ -typedef enum -{ - NRF_USBD_BUSSTATE_DM_MASK = USBD_BUSSTATE_DM_Msk, /**< Negative line mask */ - NRF_USBD_BUSSTATE_DP_MASK = USBD_BUSSTATE_DP_Msk, /**< Positive line mask */ - /** Both lines are low */ - NRF_USBD_BUSSTATE_DPDM_LL = (USBD_BUSSTATE_DM_Low << USBD_BUSSTATE_DM_Pos) | (USBD_BUSSTATE_DP_Low << USBD_BUSSTATE_DP_Pos), - /** Positive line is high, negative line is low */ - NRF_USBD_BUSSTATE_DPDM_HL = (USBD_BUSSTATE_DM_Low << USBD_BUSSTATE_DM_Pos) | (USBD_BUSSTATE_DP_High << USBD_BUSSTATE_DP_Pos), - /** Positive line is low, negative line is high */ - NRF_USBD_BUSSTATE_DPDM_LH = (USBD_BUSSTATE_DM_High << USBD_BUSSTATE_DM_Pos) | (USBD_BUSSTATE_DP_Low << USBD_BUSSTATE_DP_Pos), - /** Both lines are high */ - NRF_USBD_BUSSTATE_DPDM_HH = (USBD_BUSSTATE_DM_High << USBD_BUSSTATE_DM_Pos) | (USBD_BUSSTATE_DP_High << USBD_BUSSTATE_DP_Pos), - /** J state */ - NRF_USBD_BUSSTATE_J = NRF_USBD_BUSSTATE_DPDM_HL, - /** K state */ - NRF_USBD_BUSSTATE_K = NRF_USBD_BUSSTATE_DPDM_LH, - /** Single ended 0 */ - NRF_USBD_BUSSTATE_SE0 = NRF_USBD_BUSSTATE_DPDM_LL, - /** Single ended 1 */ - NRF_USBD_BUSSTATE_SE1 = NRF_USBD_BUSSTATE_DPDM_HH -}nrf_usbd_busstate_t; - /** * @brief DPDMVALUE register */ @@ -692,13 +660,6 @@ __STATIC_INLINE void nrf_usbd_eventcause_clear(uint32_t flags); */ __STATIC_INLINE uint32_t nrf_usbd_eventcause_get_and_clear(void); -/** - * @brief Function for getting BUSSTATE register value - * - * @return The value of BUSSTATE register - */ -__STATIC_INLINE nrf_usbd_busstate_t nrf_usbd_busstate_get(void); - /** * @brief Function for getting HALTEDEPIN register value * @@ -1066,22 +1027,17 @@ uint32_t nrf_usbd_eventcause_get_and_clear(void) return ret; } -nrf_usbd_busstate_t nrf_usbd_busstate_get(void) -{ - return (nrf_usbd_busstate_t)(NRF_USBD->BUSSTATE); -} - uint32_t nrf_usbd_haltedep(uint8_t ep) { uint8_t epnr = NRF_USBD_EP_NR_GET(ep); if (NRF_USBD_EPIN_CHECK(ep)) { - ASSERT(epnr < ARRAY_SIZE(NRF_USBD->HALTED.EPIN)); + NRFX_ASSERT(epnr < ARRAY_SIZE(NRF_USBD->HALTED.EPIN)); return NRF_USBD->HALTED.EPIN[epnr]; } else { - ASSERT(epnr < ARRAY_SIZE(NRF_USBD->HALTED.EPOUT)); + NRFX_ASSERT(epnr < ARRAY_SIZE(NRF_USBD->HALTED.EPOUT)); return NRF_USBD->HALTED.EPOUT[epnr]; } } @@ -1165,8 +1121,8 @@ uint16_t nrf_usbd_setup_wlength_get(void) size_t nrf_usbd_epout_size_get(uint8_t ep) { - ASSERT(NRF_USBD_EP_VALIDATE(ep)); - ASSERT(NRF_USBD_EPOUT_CHECK(ep)); + NRFX_ASSERT(NRF_USBD_EP_VALIDATE(ep)); + NRFX_ASSERT(NRF_USBD_EPOUT_CHECK(ep)); if (NRF_USBD_EPISO_CHECK(ep)) { size_t size_isoout = NRF_USBD->SIZE.ISOOUT; @@ -1177,15 +1133,15 @@ size_t nrf_usbd_epout_size_get(uint8_t ep) return size_isoout; } - ASSERT(NRF_USBD_EP_NR_GET(ep) < ARRAY_SIZE(NRF_USBD->SIZE.EPOUT)); + NRFX_ASSERT(NRF_USBD_EP_NR_GET(ep) < ARRAY_SIZE(NRF_USBD->SIZE.EPOUT)); return NRF_USBD->SIZE.EPOUT[NRF_USBD_EP_NR_GET(ep)]; } size_t nrf_usbd_episoout_size_get(uint8_t ep) { - ASSERT(NRF_USBD_EP_VALIDATE(ep)); - ASSERT(NRF_USBD_EPOUT_CHECK(ep)); - ASSERT(NRF_USBD_EPISO_CHECK(ep)); + NRFX_ASSERT(NRF_USBD_EP_VALIDATE(ep)); + NRFX_ASSERT(NRF_USBD_EPOUT_CHECK(ep)); + NRFX_ASSERT(NRF_USBD_EPISO_CHECK(ep)); size_t size_isoout = NRF_USBD->SIZE.ISOOUT; if (size_isoout == 0) @@ -1201,7 +1157,7 @@ size_t nrf_usbd_episoout_size_get(uint8_t ep) void nrf_usbd_epout_clear(uint8_t ep) { - ASSERT(NRF_USBD_EPOUT_CHECK(ep) && (NRF_USBD_EP_NR_GET(ep) < ARRAY_SIZE(NRF_USBD->SIZE.EPOUT))); + NRFX_ASSERT(NRF_USBD_EPOUT_CHECK(ep) && (NRF_USBD_EP_NR_GET(ep) < ARRAY_SIZE(NRF_USBD->SIZE.EPOUT))); NRF_USBD->SIZE.EPOUT[NRF_USBD_EP_NR_GET(ep)] = 0; __ISB(); __DSB(); @@ -1233,8 +1189,8 @@ void nrf_usbd_dpdmvalue_set(nrf_usbd_dpdmvalue_t val) void nrf_usbd_dtoggle_set(uint8_t ep, nrf_usbd_dtoggle_t op) { - ASSERT(NRF_USBD_EP_VALIDATE(ep)); - ASSERT(!NRF_USBD_EPISO_CHECK(ep)); + NRFX_ASSERT(NRF_USBD_EP_VALIDATE(ep)); + NRFX_ASSERT(!NRF_USBD_EPISO_CHECK(ep)); NRF_USBD->DTOGGLE = ep | (NRF_USBD_DTOGGLE_NOP << USBD_DTOGGLE_VALUE_Pos); __DSB(); NRF_USBD->DTOGGLE = ep | (op << USBD_DTOGGLE_VALUE_Pos); @@ -1253,7 +1209,7 @@ nrf_usbd_dtoggle_t nrf_usbd_dtoggle_get(uint8_t ep) bool nrf_usbd_ep_enable_check(uint8_t ep) { - ASSERT(NRF_USBD_EP_VALIDATE(ep)); + NRFX_ASSERT(NRF_USBD_EP_VALIDATE(ep)); uint8_t epnr = NRF_USBD_EP_NR_GET(ep); if (NRF_USBD_EPIN_CHECK(ep)) @@ -1268,7 +1224,7 @@ bool nrf_usbd_ep_enable_check(uint8_t ep) void nrf_usbd_ep_enable(uint8_t ep) { - ASSERT(NRF_USBD_EP_VALIDATE(ep)); + NRFX_ASSERT(NRF_USBD_EP_VALIDATE(ep)); uint8_t epnr = NRF_USBD_EP_NR_GET(ep); if (NRF_USBD_EPIN_CHECK(ep)) @@ -1285,7 +1241,7 @@ void nrf_usbd_ep_enable(uint8_t ep) void nrf_usbd_ep_disable(uint8_t ep) { - ASSERT(NRF_USBD_EP_VALIDATE(ep)); + NRFX_ASSERT(NRF_USBD_EP_VALIDATE(ep)); uint8_t epnr = NRF_USBD_EP_NR_GET(ep); if (NRF_USBD_EPIN_CHECK(ep)) @@ -1310,7 +1266,7 @@ void nrf_usbd_ep_all_disable(void) void nrf_usbd_ep_stall(uint8_t ep) { - ASSERT(!NRF_USBD_EPISO_CHECK(ep)); + NRFX_ASSERT(!NRF_USBD_EPISO_CHECK(ep)); NRF_USBD->EPSTALL = (USBD_EPSTALL_STALL_Stall << USBD_EPSTALL_STALL_Pos) | ep; __ISB(); __DSB(); @@ -1318,7 +1274,7 @@ void nrf_usbd_ep_stall(uint8_t ep) void nrf_usbd_ep_unstall(uint8_t ep) { - ASSERT(!NRF_USBD_EPISO_CHECK(ep)); + NRFX_ASSERT(!NRF_USBD_EPISO_CHECK(ep)); NRF_USBD->EPSTALL = (USBD_EPSTALL_STALL_UnStall << USBD_EPSTALL_STALL_Pos) | ep; __ISB(); __DSB(); @@ -1368,7 +1324,7 @@ void nrf_usbd_ep_easydma_set(uint8_t ep, uint32_t ptr, uint32_t maxcnt) else { uint8_t epnr = NRF_USBD_EP_NR_GET(ep); - ASSERT(epnr < ARRAY_SIZE(NRF_USBD->EPIN)); + NRFX_ASSERT(epnr < ARRAY_SIZE(NRF_USBD->EPIN)); NRF_USBD->EPIN[epnr].PTR = ptr; NRF_USBD->EPIN[epnr].MAXCNT = maxcnt; } @@ -1383,7 +1339,7 @@ void nrf_usbd_ep_easydma_set(uint8_t ep, uint32_t ptr, uint32_t maxcnt) else { uint8_t epnr = NRF_USBD_EP_NR_GET(ep); - ASSERT(epnr < ARRAY_SIZE(NRF_USBD->EPOUT)); + NRFX_ASSERT(epnr < ARRAY_SIZE(NRF_USBD->EPOUT)); NRF_USBD->EPOUT[epnr].PTR = ptr; NRF_USBD->EPOUT[epnr].MAXCNT = maxcnt; } @@ -1403,7 +1359,7 @@ uint32_t nrf_usbd_ep_amount_get(uint8_t ep) else { uint8_t epnr = NRF_USBD_EP_NR_GET(ep); - ASSERT(epnr < ARRAY_SIZE(NRF_USBD->EPOUT)); + NRFX_ASSERT(epnr < ARRAY_SIZE(NRF_USBD->EPOUT)); ret = NRF_USBD->EPIN[epnr].AMOUNT; } } @@ -1416,7 +1372,7 @@ uint32_t nrf_usbd_ep_amount_get(uint8_t ep) else { uint8_t epnr = NRF_USBD_EP_NR_GET(ep); - ASSERT(epnr < ARRAY_SIZE(NRF_USBD->EPOUT)); + NRFX_ASSERT(epnr < ARRAY_SIZE(NRF_USBD->EPOUT)); ret = NRF_USBD->EPOUT[epnr].AMOUNT; } } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_wdt.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_wdt.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_wdt.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_wdt.h index d497fc2464..44157b38d1 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_wdt.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/hal/nrf_wdt.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -37,27 +37,23 @@ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ -/** - * @defgroup nrf_wdt_hal WDT HAL - * @{ - * @ingroup nrf_wdt - * - * @brief Hardware access layer for accessing the watchdog timer (WDT) peripheral. - */ #ifndef NRF_WDT_H__ #define NRF_WDT_H__ -#include -#include -#include - -#include "nrf.h" +#include #ifdef __cplusplus extern "C" { #endif +/** + * @defgroup nrf_wdt_hal WDT HAL + * @{ + * @ingroup nrf_wdt + * @brief Hardware access layer for managing the Watchdog Timer (WDT) peripheral. + */ + #define NRF_WDT_CHANNEL_NUMBER 0x8UL #define NRF_WDT_RR_VALUE 0x6E524635UL /* Fixed value, shouldn't be modified.*/ @@ -328,12 +324,10 @@ __STATIC_INLINE void nrf_wdt_reload_request_set(nrf_wdt_rr_register_t rr_registe NRF_WDT->RR[rr_register] = NRF_WDT_RR_VALUE; } - +/** @} */ #ifdef __cplusplus } #endif #endif - -/** @} */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/compiler_abstraction.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/compiler_abstraction.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/compiler_abstraction.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/compiler_abstraction.h index 3da528ac93..73da016d8b 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/compiler_abstraction.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/compiler_abstraction.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nRFxxx.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nRFxxx.h new file mode 100644 index 0000000000..ba7205237f --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nRFxxx.h @@ -0,0 +1,21 @@ +/***************************************************************************** + * SEGGER Microcontroller GmbH & Co. KG * + * Solutions for real time microcontroller applications * + ***************************************************************************** + * * + * (c) 2017 SEGGER Microcontroller GmbH & Co. KG * + * * + * Internet: www.segger.com Support: support@segger.com * + * * + *****************************************************************************/ + +#ifndef __nRFxxx_h +#define __nRFxxx_h + +#if defined(NRF51) || defined(NRF51) || defined(NRF51) || defined(NRF51) || defined(NRF51) || defined(NRF51) || defined(NRF51) || defined(NRF51) || defined(NRF52) || defined(NRF52832_XXAB) || defined(NRF52840_XXAA) + +#include "nrf.h" + +#endif + +#endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf.h index bbba4d6c53..f0bfec3592 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. @@ -44,7 +44,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* MDK version */ #define MDK_MAJOR_VERSION 8 -#define MDK_MINOR_VERSION 15 +#define MDK_MINOR_VERSION 16 #define MDK_MICRO_VERSION 0 /* Redefine "old" too-generic name NRF52 to NRF52832_XXAA to keep backwards compatibility. */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51.h index 12facd4e02..b716765bef 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51.h @@ -6,12 +6,12 @@ * nrf51 from Nordic Semiconductor. * * @version V522 - * @date 3. October 2017 + * @date 8. March 2018 * * @note Generated with SVDConv V2.81d * from CMSIS SVD File 'nrf51.svd' Version 522, * - * @par Copyright (c) 2010 - 2017, Nordic Semiconductor ASA + * @par Copyright (c) 2010 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51422_peripherals.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51422_peripherals.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51422_peripherals.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51422_peripherals.h index 793bc65db1..b65a716943 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51422_peripherals.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51422_peripherals.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. @@ -39,6 +39,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* This file is deprecated */ #ifndef _NRF51422_PERIPHERALS_H #define _NRF51422_PERIPHERALS_H @@ -130,7 +131,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SPIS_PRESENT #define SPIS_COUNT 1 -#define SPIS0_EASYDMA_MAXCNT_SIZE 8 +#define SPIS1_EASYDMA_MAXCNT_SIZE 8 /* Two Wire Interface Master */ #define TWI_PRESENT diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51801_peripherals.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51801_peripherals.h new file mode 100644 index 0000000000..28de185b1b --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51801_peripherals.h @@ -0,0 +1,165 @@ +/* + +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form, except as embedded into a Nordic + Semiconductor ASA integrated circuit in a product or a software update for + such product, must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of Nordic Semiconductor ASA nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +4. This software, with or without modification, must only be used with a + Nordic Semiconductor ASA integrated circuit. + +5. Any software provided in binary form under this license must not be reverse + engineered, decompiled, modified and/or disassembled. + +THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +/* This file is deprecated */ +#ifndef _NRF51801_PERIPHERALS_H +#define _NRF51801_PERIPHERALS_H + + +/* Power Peripheral */ +#define POWER_PRESENT +#define POWER_COUNT 1 + +#define POWER_FEATURE_RAMON_REGISTERS_PRESENT + +/* Software Interrupts */ +#define SWI_PRESENT +#define SWI_COUNT 6 + +/* GPIO */ +#define GPIO_PRESENT +#define GPIO_COUNT 1 + +#define P0_PIN_NUM 32 + +/* MPU and BPROT */ +#define BPROT_PRESENT + +#define BPROT_REGIONS_SIZE 4096 +#define BPROT_REGIONS_NUM 64 + +/* Radio */ +#define RADIO_PRESENT +#define RADIO_COUNT 1 + +/* Accelerated Address Resolver */ +#define AAR_PRESENT +#define AAR_COUNT 1 + +#define AAR_MAX_IRK_NUM 8 + +/* AES Electronic CodeBook mode encryption */ +#define ECB_PRESENT +#define ECB_COUNT 1 + +/* AES CCM mode encryption */ +#define CCM_PRESENT +#define CCM_COUNT 1 + +/* Peripheral to Peripheral Interconnect */ +#define PPI_PRESENT +#define PPI_COUNT 1 + +#define PPI_CH_NUM 16 +#define PPI_FIXED_CH_NUM 12 +#define PPI_GROUP_NUM 4 + +/* Timer/Counter */ +#define TIMER_PRESENT +#define TIMER_COUNT 3 + +#define TIMER0_MAX_SIZE 32 +#define TIMER1_MAX_SIZE 16 +#define TIMER2_MAX_SIZE 16 + +#define TIMER0_CC_NUM 4 +#define TIMER1_CC_NUM 4 +#define TIMER2_CC_NUM 4 + +/* Real Time Counter */ +#define RTC_PRESENT +#define RTC_COUNT 2 + +#define RTC0_CC_NUM 3 +#define RTC1_CC_NUM 4 + +/* RNG */ +#define RNG_PRESENT +#define RNG_COUNT 1 + +/* Watchdog Timer */ +#define WDT_PRESENT +#define WDT_COUNT 1 + +/* Temperature Sensor */ +#define TEMP_PRESENT +#define TEMP_COUNT 1 + +/* Serial Peripheral Interface Master */ +#define SPI_PRESENT +#define SPI_COUNT 2 + +/* Serial Peripheral Interface Slave with DMA */ +#define SPIS_PRESENT +#define SPIS_COUNT 1 + +#define SPIS1_EASYDMA_MAXCNT_SIZE 8 + +/* Two Wire Interface Master */ +#define TWI_PRESENT +#define TWI_COUNT 2 + +/* Universal Asynchronous Receiver-Transmitter */ +#define UART_PRESENT +#define UART_COUNT 1 + +/* Quadrature Decoder */ +#define QDEC_PRESENT +#define QDEC_COUNT 1 + +/* Analog to Digital Converter */ +#define ADC_PRESENT +#define ADC_COUNT 1 + +/* GPIO Tasks and Events */ +#define GPIOTE_PRESENT +#define GPIOTE_COUNT 1 + +#define GPIOTE_CH_NUM 4 + +/* Low Power Comparator */ +#define LPCOMP_PRESENT +#define LPCOMP_COUNT 1 + +#define LPCOMP_REFSEL_RESOLUTION 8 + + +#endif // _NRF51801_PERIPHERALS_H diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51802_peripherals.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51802_peripherals.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51802_peripherals.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51802_peripherals.h index ca92539b13..06d77bc662 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51802_peripherals.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51802_peripherals.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. @@ -39,6 +39,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* This file is deprecated */ #ifndef _NRF51802_PERIPHERALS_H #define _NRF51802_PERIPHERALS_H @@ -130,7 +131,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SPIS_PRESENT #define SPIS_COUNT 1 -#define SPIS0_EASYDMA_MAXCNT_SIZE 8 +#define SPIS1_EASYDMA_MAXCNT_SIZE 8 /* Two Wire Interface Master */ #define TWI_PRESENT diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51822_peripherals.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51822_peripherals.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51822_peripherals.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51822_peripherals.h index 8e01f4e308..b9a890abb2 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51822_peripherals.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51822_peripherals.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. @@ -39,6 +39,8 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* This file is deprecated */ #ifndef _NRF51822_PERIPHERALS_H #define _NRF51822_PERIPHERALS_H @@ -130,7 +132,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SPIS_PRESENT #define SPIS_COUNT 1 -#define SPIS0_EASYDMA_MAXCNT_SIZE 8 +#define SPIS1_EASYDMA_MAXCNT_SIZE 8 /* Two Wire Interface Master */ #define TWI_PRESENT diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51824_peripherals.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51824_peripherals.h new file mode 100644 index 0000000000..36ff87da44 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51824_peripherals.h @@ -0,0 +1,166 @@ +/* + +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form, except as embedded into a Nordic + Semiconductor ASA integrated circuit in a product or a software update for + such product, must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of Nordic Semiconductor ASA nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +4. This software, with or without modification, must only be used with a + Nordic Semiconductor ASA integrated circuit. + +5. Any software provided in binary form under this license must not be reverse + engineered, decompiled, modified and/or disassembled. + +THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + + +/* This file is deprecated */ +#ifndef _NRF51824_PERIPHERALS_H +#define _NRF51824_PERIPHERALS_H + + +/* Power Peripheral */ +#define POWER_PRESENT +#define POWER_COUNT 1 + +#define POWER_FEATURE_RAMON_REGISTERS_PRESENT + +/* Software Interrupts */ +#define SWI_PRESENT +#define SWI_COUNT 6 + +/* GPIO */ +#define GPIO_PRESENT +#define GPIO_COUNT 1 + +#define P0_PIN_NUM 32 + +/* MPU and BPROT */ +#define BPROT_PRESENT + +#define BPROT_REGIONS_SIZE 4096 +#define BPROT_REGIONS_NUM 64 + +/* Radio */ +#define RADIO_PRESENT +#define RADIO_COUNT 1 + +/* Accelerated Address Resolver */ +#define AAR_PRESENT +#define AAR_COUNT 1 + +#define AAR_MAX_IRK_NUM 8 + +/* AES Electronic CodeBook mode encryption */ +#define ECB_PRESENT +#define ECB_COUNT 1 + +/* AES CCM mode encryption */ +#define CCM_PRESENT +#define CCM_COUNT 1 + +/* Peripheral to Peripheral Interconnect */ +#define PPI_PRESENT +#define PPI_COUNT 1 + +#define PPI_CH_NUM 16 +#define PPI_FIXED_CH_NUM 12 +#define PPI_GROUP_NUM 4 + +/* Timer/Counter */ +#define TIMER_PRESENT +#define TIMER_COUNT 3 + +#define TIMER0_MAX_SIZE 32 +#define TIMER1_MAX_SIZE 16 +#define TIMER2_MAX_SIZE 16 + +#define TIMER0_CC_NUM 4 +#define TIMER1_CC_NUM 4 +#define TIMER2_CC_NUM 4 + +/* Real Time Counter */ +#define RTC_PRESENT +#define RTC_COUNT 2 + +#define RTC0_CC_NUM 3 +#define RTC1_CC_NUM 4 + +/* RNG */ +#define RNG_PRESENT +#define RNG_COUNT 1 + +/* Watchdog Timer */ +#define WDT_PRESENT +#define WDT_COUNT 1 + +/* Temperature Sensor */ +#define TEMP_PRESENT +#define TEMP_COUNT 1 + +/* Serial Peripheral Interface Master */ +#define SPI_PRESENT +#define SPI_COUNT 2 + +/* Serial Peripheral Interface Slave with DMA */ +#define SPIS_PRESENT +#define SPIS_COUNT 1 + +#define SPIS1_EASYDMA_MAXCNT_SIZE 8 + +/* Two Wire Interface Master */ +#define TWI_PRESENT +#define TWI_COUNT 2 + +/* Universal Asynchronous Receiver-Transmitter */ +#define UART_PRESENT +#define UART_COUNT 1 + +/* Quadrature Decoder */ +#define QDEC_PRESENT +#define QDEC_COUNT 1 + +/* Analog to Digital Converter */ +#define ADC_PRESENT +#define ADC_COUNT 1 + +/* GPIO Tasks and Events */ +#define GPIOTE_PRESENT +#define GPIOTE_COUNT 1 + +#define GPIOTE_CH_NUM 4 + +/* Low Power Comparator */ +#define LPCOMP_PRESENT +#define LPCOMP_COUNT 1 + +#define LPCOMP_REFSEL_RESOLUTION 8 + + +#endif // _NRF51824_PERIPHERALS_H diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51_bitfields.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_bitfields.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51_bitfields.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_bitfields.h index ee55d02c6d..007b337968 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51_bitfields.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_bitfields.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51_deprecated.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_deprecated.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51_deprecated.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_deprecated.h index 189d649aee..3d2a262db2 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51_deprecated.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_deprecated.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. @@ -441,7 +441,11 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define PPI_CHG3_CH0_Pos PPI_CHG_CH0_Pos #define PPI_CHG3_CH0_Msk PPI_CHG_CH0_Msk #define PPI_CHG3_CH0_Excluded PPI_CHG_CH0_Excluded -#define PPI_CHG3_CH0_Included PPI_CHG_CH0_Included +#define PPI_CHG3_CH0_Included PPI_CHG_CH0_Included + +/* SPIS */ +/* nRF51 devices do not have an SPIS0, only SPIS1. SPIS0_EASYDMA_MAXCNT_SIZE was therefore renamed. */ +#define SPIS0_EASYDMA_MAXCNT_SIZE SPIS1_EASYDMA_MAXCNT_SIZE diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_peripherals.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_peripherals.h new file mode 100644 index 0000000000..e533ad521c --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_peripherals.h @@ -0,0 +1,164 @@ +/* + +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form, except as embedded into a Nordic + Semiconductor ASA integrated circuit in a product or a software update for + such product, must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of Nordic Semiconductor ASA nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +4. This software, with or without modification, must only be used with a + Nordic Semiconductor ASA integrated circuit. + +5. Any software provided in binary form under this license must not be reverse + engineered, decompiled, modified and/or disassembled. + +THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef _NRF51_PERIPHERALS_H +#define _NRF51_PERIPHERALS_H + + +/* Power Peripheral */ +#define POWER_PRESENT +#define POWER_COUNT 1 + +#define POWER_FEATURE_RAMON_REGISTERS_PRESENT + +/* Software Interrupts */ +#define SWI_PRESENT +#define SWI_COUNT 6 + +/* GPIO */ +#define GPIO_PRESENT +#define GPIO_COUNT 1 + +#define P0_PIN_NUM 32 + +/* MPU and BPROT */ +#define BPROT_PRESENT + +#define BPROT_REGIONS_SIZE 4096 +#define BPROT_REGIONS_NUM 64 + +/* Radio */ +#define RADIO_PRESENT +#define RADIO_COUNT 1 + +/* Accelerated Address Resolver */ +#define AAR_PRESENT +#define AAR_COUNT 1 + +#define AAR_MAX_IRK_NUM 8 + +/* AES Electronic CodeBook mode encryption */ +#define ECB_PRESENT +#define ECB_COUNT 1 + +/* AES CCM mode encryption */ +#define CCM_PRESENT +#define CCM_COUNT 1 + +/* Peripheral to Peripheral Interconnect */ +#define PPI_PRESENT +#define PPI_COUNT 1 + +#define PPI_CH_NUM 16 +#define PPI_FIXED_CH_NUM 12 +#define PPI_GROUP_NUM 4 + +/* Timer/Counter */ +#define TIMER_PRESENT +#define TIMER_COUNT 3 + +#define TIMER0_MAX_SIZE 32 +#define TIMER1_MAX_SIZE 16 +#define TIMER2_MAX_SIZE 16 + +#define TIMER0_CC_NUM 4 +#define TIMER1_CC_NUM 4 +#define TIMER2_CC_NUM 4 + +/* Real Time Counter */ +#define RTC_PRESENT +#define RTC_COUNT 2 + +#define RTC0_CC_NUM 3 +#define RTC1_CC_NUM 4 + +/* RNG */ +#define RNG_PRESENT +#define RNG_COUNT 1 + +/* Watchdog Timer */ +#define WDT_PRESENT +#define WDT_COUNT 1 + +/* Temperature Sensor */ +#define TEMP_PRESENT +#define TEMP_COUNT 1 + +/* Serial Peripheral Interface Master */ +#define SPI_PRESENT +#define SPI_COUNT 2 + +/* Serial Peripheral Interface Slave with DMA */ +#define SPIS_PRESENT +#define SPIS_COUNT 1 + +#define SPIS1_EASYDMA_MAXCNT_SIZE 8 + +/* Two Wire Interface Master */ +#define TWI_PRESENT +#define TWI_COUNT 2 + +/* Universal Asynchronous Receiver-Transmitter */ +#define UART_PRESENT +#define UART_COUNT 1 + +/* Quadrature Decoder */ +#define QDEC_PRESENT +#define QDEC_COUNT 1 + +/* Analog to Digital Converter */ +#define ADC_PRESENT +#define ADC_COUNT 1 + +/* GPIO Tasks and Events */ +#define GPIOTE_PRESENT +#define GPIOTE_COUNT 1 + +#define GPIOTE_CH_NUM 4 + +/* Low Power Comparator */ +#define LPCOMP_PRESENT +#define LPCOMP_COUNT 1 + +#define LPCOMP_REFSEL_RESOLUTION 8 + + +#endif // _NRF51_PERIPHERALS_H diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51_to_nrf52.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_to_nrf52.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51_to_nrf52.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_to_nrf52.h index 66685de4a1..6bbb7cc238 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51_to_nrf52.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_to_nrf52.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51_to_nrf52810.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_to_nrf52810.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51_to_nrf52810.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_to_nrf52810.h index 3f304f4584..4031ff481b 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51_to_nrf52810.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_to_nrf52810.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51_to_nrf52840.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_to_nrf52840.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51_to_nrf52840.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_to_nrf52840.h index fe8933787f..ce192414b2 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf51_to_nrf52840.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf51_to_nrf52840.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52.h index 9018fe6d53..81b0a47aae 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52.h @@ -6,12 +6,12 @@ * nrf52 from Nordic Semiconductor. * * @version V1 - * @date 3. October 2017 + * @date 8. March 2018 * * @note Generated with SVDConv V2.81d * from CMSIS SVD File 'nrf52.svd' Version 1, * - * @par Copyright (c) 2010 - 2017, Nordic Semiconductor ASA + * @par Copyright (c) 2010 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -1585,7 +1585,7 @@ typedef struct { /*!< COMP Structure __I uint32_t RESERVED4[63]; __IO uint32_t ENABLE; /*!< COMP enable */ __IO uint32_t PSEL; /*!< Pin select */ - __IO uint32_t REFSEL; /*!< Reference source select */ + __IO uint32_t REFSEL; /*!< Reference source select for single-ended mode */ __IO uint32_t EXTREFSEL; /*!< External reference select */ __I uint32_t RESERVED5[8]; __IO uint32_t TH; /*!< Threshold configuration for hysteresis unit */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52810.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52810.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52810.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52810.h index d3a32642fe..c206f6a045 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52810.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52810.h @@ -6,12 +6,12 @@ * nrf52810 from Nordic Semiconductor. * * @version V1 - * @date 3. October 2017 + * @date 8. March 2018 * * @note Generated with SVDConv V2.81d * from CMSIS SVD File 'nrf52810.svd' Version 1, * - * @par Copyright (c) 2010 - 2017, Nordic Semiconductor ASA + * @par Copyright (c) 2010 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -320,11 +320,10 @@ typedef struct { } QDEC_PSEL_Type; typedef struct { - __IO uint32_t PTR; /*!< Description cluster[0]: Beginning address in Data RAM of this + __IO uint32_t PTR; /*!< Description cluster[0]: Beginning address in RAM of this sequence */ + __IO uint32_t CNT; /*!< Description cluster[0]: Number of values (duty cycles) in this sequence */ - __IO uint32_t CNT; /*!< Description cluster[0]: Amount of values (duty cycles) in this - sequence */ - __IO uint32_t REFRESH; /*!< Description cluster[0]: Amount of additional PWM periods between + __IO uint32_t REFRESH; /*!< Description cluster[0]: Number of additional PWM periods between samples loaded into compare register */ __IO uint32_t ENDDELAY; /*!< Description cluster[0]: Time added after the sequence */ __I uint32_t RESERVED1[4]; @@ -1312,7 +1311,7 @@ typedef struct { /*!< EGU Structure /** - * @brief Pulse Width Modulation Unit (PWM) + * @brief Pulse width modulation unit (PWM) */ typedef struct { /*!< PWM Structure */ @@ -1322,10 +1321,10 @@ typedef struct { /*!< PWM Structure __O uint32_t TASKS_SEQSTART[2]; /*!< Description collection[0]: Loads the first PWM value on all enabled channels from sequence 0, and starts playing that sequence at the rate defined in SEQ[0]REFRESH and/or DECODER.MODE. Causes - PWM generation to start it was not running. */ + PWM generation to start if not running. */ __O uint32_t TASKS_NEXTSTEP; /*!< Steps by one value in the current sequence on all enabled channels if DECODER.MODE=NextStep. Does not cause PWM generation to start - it was not running. */ + if not running. */ __I uint32_t RESERVED1[60]; __IO uint32_t EVENTS_STOPPED; /*!< Response to STOP task, emitted when PWM pulses are no longer generated */ @@ -1348,7 +1347,7 @@ typedef struct { /*!< PWM Structure __IO uint32_t COUNTERTOP; /*!< Value up to which the pulse generator counter counts */ __IO uint32_t PRESCALER; /*!< Configuration for PWM_CLK */ __IO uint32_t DECODER; /*!< Configuration of the decoder */ - __IO uint32_t LOOP; /*!< Amount of playback of a loop */ + __IO uint32_t LOOP; /*!< Number of playbacks of a loop */ __I uint32_t RESERVED5[2]; PWM_SEQ_Type SEQ[2]; /*!< Unspecified */ PWM_PSEL_Type PSEL; /*!< Unspecified */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52810_bitfields.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52810_bitfields.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52810_bitfields.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52810_bitfields.h index fe4ba249e0..403654961b 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52810_bitfields.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52810_bitfields.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. @@ -1670,10 +1670,14 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Bits 31..0 : Part variant, hardware version and production configuration, encoded as ASCII */ #define FICR_INFO_VARIANT_VARIANT_Pos (0UL) /*!< Position of VARIANT field. */ #define FICR_INFO_VARIANT_VARIANT_Msk (0xFFFFFFFFUL << FICR_INFO_VARIANT_VARIANT_Pos) /*!< Bit mask of VARIANT field. */ +#define FICR_INFO_VARIANT_VARIANT_AAA0 (0x41414130UL) /*!< AAA0 */ #define FICR_INFO_VARIANT_VARIANT_AAAA (0x41414141UL) /*!< AAAA */ -#define FICR_INFO_VARIANT_VARIANT_AAAB (0x41414142UL) /*!< AAAB */ +#define FICR_INFO_VARIANT_VARIANT_AAB0 (0x41414230UL) /*!< AAB0 */ #define FICR_INFO_VARIANT_VARIANT_AABA (0x41414241UL) /*!< AABA */ #define FICR_INFO_VARIANT_VARIANT_AABB (0x41414242UL) /*!< AABB */ +#define FICR_INFO_VARIANT_VARIANT_AAC0 (0x41414330UL) /*!< AAC0 */ +#define FICR_INFO_VARIANT_VARIANT_AACA (0x41414341UL) /*!< AACA */ +#define FICR_INFO_VARIANT_VARIANT_AACB (0x41414342UL) /*!< AACB */ #define FICR_INFO_VARIANT_VARIANT_Unspecified (0xFFFFFFFFUL) /*!< Unspecified */ /* Register: FICR_INFO_PACKAGE */ @@ -5168,7 +5172,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: PWM */ -/* Description: Pulse Width Modulation Unit */ +/* Description: Pulse width modulation unit */ /* Register: PWM_TASKS_STOP */ /* Description: Stops PWM pulse generation on all channels at the end of current PWM period, and stops sequence playback */ @@ -5178,14 +5182,14 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define PWM_TASKS_STOP_TASKS_STOP_Msk (0x1UL << PWM_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ /* Register: PWM_TASKS_SEQSTART */ -/* Description: Description collection[0]: Loads the first PWM value on all enabled channels from sequence 0, and starts playing that sequence at the rate defined in SEQ[0]REFRESH and/or DECODER.MODE. Causes PWM generation to start it was not running. */ +/* Description: Description collection[0]: Loads the first PWM value on all enabled channels from sequence 0, and starts playing that sequence at the rate defined in SEQ[0]REFRESH and/or DECODER.MODE. Causes PWM generation to start if not running. */ /* Bit 0 : */ #define PWM_TASKS_SEQSTART_TASKS_SEQSTART_Pos (0UL) /*!< Position of TASKS_SEQSTART field. */ #define PWM_TASKS_SEQSTART_TASKS_SEQSTART_Msk (0x1UL << PWM_TASKS_SEQSTART_TASKS_SEQSTART_Pos) /*!< Bit mask of TASKS_SEQSTART field. */ /* Register: PWM_TASKS_NEXTSTEP */ -/* Description: Steps by one value in the current sequence on all enabled channels if DECODER.MODE=NextStep. Does not cause PWM generation to start it was not running. */ +/* Description: Steps by one value in the current sequence on all enabled channels if DECODER.MODE=NextStep. Does not cause PWM generation to start if not running. */ /* Bit 0 : */ #define PWM_TASKS_NEXTSTEP_TASKS_NEXTSTEP_Pos (0UL) /*!< Position of TASKS_NEXTSTEP field. */ @@ -5420,23 +5424,23 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: PWM_MODE */ /* Description: Selects operating mode of the wave counter */ -/* Bit 0 : Selects up or up and down as wave counter mode */ +/* Bit 0 : Selects up mode or up-and-down mode for the counter */ #define PWM_MODE_UPDOWN_Pos (0UL) /*!< Position of UPDOWN field. */ #define PWM_MODE_UPDOWN_Msk (0x1UL << PWM_MODE_UPDOWN_Pos) /*!< Bit mask of UPDOWN field. */ -#define PWM_MODE_UPDOWN_Up (0UL) /*!< Up counter - edge aligned PWM duty-cycle */ -#define PWM_MODE_UPDOWN_UpAndDown (1UL) /*!< Up and down counter - center aligned PWM duty cycle */ +#define PWM_MODE_UPDOWN_Up (0UL) /*!< Up counter, edge-aligned PWM duty cycle */ +#define PWM_MODE_UPDOWN_UpAndDown (1UL) /*!< Up and down counter, center-aligned PWM duty cycle */ /* Register: PWM_COUNTERTOP */ /* Description: Value up to which the pulse generator counter counts */ -/* Bits 14..0 : Value up to which the pulse generator counter counts. This register is ignored when DECODER.MODE=WaveForm and only values from RAM will be used. */ +/* Bits 14..0 : Value up to which the pulse generator counter counts. This register is ignored when DECODER.MODE=WaveForm and only values from RAM are used. */ #define PWM_COUNTERTOP_COUNTERTOP_Pos (0UL) /*!< Position of COUNTERTOP field. */ #define PWM_COUNTERTOP_COUNTERTOP_Msk (0x7FFFUL << PWM_COUNTERTOP_COUNTERTOP_Pos) /*!< Bit mask of COUNTERTOP field. */ /* Register: PWM_PRESCALER */ /* Description: Configuration for PWM_CLK */ -/* Bits 2..0 : Pre-scaler of PWM_CLK */ +/* Bits 2..0 : Prescaler of PWM_CLK */ #define PWM_PRESCALER_PRESCALER_Pos (0UL) /*!< Position of PRESCALER field. */ #define PWM_PRESCALER_PRESCALER_Msk (0x7UL << PWM_PRESCALER_PRESCALER_Pos) /*!< Bit mask of PRESCALER field. */ #define PWM_PRESCALER_PRESCALER_DIV_1 (0UL) /*!< Divide by 1 (16MHz) */ @@ -5466,32 +5470,32 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define PWM_DECODER_LOAD_WaveForm (3UL) /*!< 1st half word (16-bit) in ch.0; 2nd in ch.1; ...; 4th in COUNTERTOP */ /* Register: PWM_LOOP */ -/* Description: Amount of playback of a loop */ +/* Description: Number of playbacks of a loop */ -/* Bits 15..0 : Amount of playback of pattern cycles */ +/* Bits 15..0 : Number of playbacks of pattern cycles */ #define PWM_LOOP_CNT_Pos (0UL) /*!< Position of CNT field. */ #define PWM_LOOP_CNT_Msk (0xFFFFUL << PWM_LOOP_CNT_Pos) /*!< Bit mask of CNT field. */ #define PWM_LOOP_CNT_Disabled (0UL) /*!< Looping disabled (stop at the end of the sequence) */ /* Register: PWM_SEQ_PTR */ -/* Description: Description cluster[0]: Beginning address in Data RAM of this sequence */ +/* Description: Description cluster[0]: Beginning address in RAM of this sequence */ -/* Bits 31..0 : Beginning address in Data RAM of this sequence */ +/* Bits 31..0 : Beginning address in RAM of this sequence */ #define PWM_SEQ_PTR_PTR_Pos (0UL) /*!< Position of PTR field. */ #define PWM_SEQ_PTR_PTR_Msk (0xFFFFFFFFUL << PWM_SEQ_PTR_PTR_Pos) /*!< Bit mask of PTR field. */ /* Register: PWM_SEQ_CNT */ -/* Description: Description cluster[0]: Amount of values (duty cycles) in this sequence */ +/* Description: Description cluster[0]: Number of values (duty cycles) in this sequence */ -/* Bits 14..0 : Amount of values (duty cycles) in this sequence */ +/* Bits 14..0 : Number of values (duty cycles) in this sequence */ #define PWM_SEQ_CNT_CNT_Pos (0UL) /*!< Position of CNT field. */ #define PWM_SEQ_CNT_CNT_Msk (0x7FFFUL << PWM_SEQ_CNT_CNT_Pos) /*!< Bit mask of CNT field. */ #define PWM_SEQ_CNT_CNT_Disabled (0UL) /*!< Sequence is disabled, and shall not be started as it is empty */ /* Register: PWM_SEQ_REFRESH */ -/* Description: Description cluster[0]: Amount of additional PWM periods between samples loaded into compare register */ +/* Description: Description cluster[0]: Number of additional PWM periods between samples loaded into compare register */ -/* Bits 23..0 : Amount of additional PWM periods between samples loaded into compare register (load every REFRESH.CNT+1 PWM periods) */ +/* Bits 23..0 : Number of additional PWM periods between samples loaded into compare register (load every REFRESH.CNT+1 PWM periods) */ #define PWM_SEQ_REFRESH_CNT_Pos (0UL) /*!< Position of CNT field. */ #define PWM_SEQ_REFRESH_CNT_Msk (0xFFFFFFUL << PWM_SEQ_REFRESH_CNT_Pos) /*!< Bit mask of CNT field. */ #define PWM_SEQ_REFRESH_CNT_Continuous (0UL) /*!< Update every PWM period */ @@ -7954,16 +7958,16 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: SPIM_RXD_MAXCNT */ /* Description: Maximum number of bytes in receive buffer */ -/* Bits 7..0 : Maximum number of bytes in receive buffer */ +/* Bits 9..0 : Maximum number of bytes in receive buffer */ #define SPIM_RXD_MAXCNT_MAXCNT_Pos (0UL) /*!< Position of MAXCNT field. */ -#define SPIM_RXD_MAXCNT_MAXCNT_Msk (0xFFUL << SPIM_RXD_MAXCNT_MAXCNT_Pos) /*!< Bit mask of MAXCNT field. */ +#define SPIM_RXD_MAXCNT_MAXCNT_Msk (0x3FFUL << SPIM_RXD_MAXCNT_MAXCNT_Pos) /*!< Bit mask of MAXCNT field. */ /* Register: SPIM_RXD_AMOUNT */ /* Description: Number of bytes transferred in the last transaction */ -/* Bits 7..0 : Number of bytes transferred in the last transaction */ +/* Bits 9..0 : Number of bytes transferred in the last transaction */ #define SPIM_RXD_AMOUNT_AMOUNT_Pos (0UL) /*!< Position of AMOUNT field. */ -#define SPIM_RXD_AMOUNT_AMOUNT_Msk (0xFFUL << SPIM_RXD_AMOUNT_AMOUNT_Pos) /*!< Bit mask of AMOUNT field. */ +#define SPIM_RXD_AMOUNT_AMOUNT_Msk (0x3FFUL << SPIM_RXD_AMOUNT_AMOUNT_Pos) /*!< Bit mask of AMOUNT field. */ /* Register: SPIM_RXD_LIST */ /* Description: EasyDMA list type */ @@ -7984,16 +7988,16 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: SPIM_TXD_MAXCNT */ /* Description: Maximum number of bytes in transmit buffer */ -/* Bits 7..0 : Maximum number of bytes in transmit buffer */ +/* Bits 9..0 : Maximum number of bytes in transmit buffer */ #define SPIM_TXD_MAXCNT_MAXCNT_Pos (0UL) /*!< Position of MAXCNT field. */ -#define SPIM_TXD_MAXCNT_MAXCNT_Msk (0xFFUL << SPIM_TXD_MAXCNT_MAXCNT_Pos) /*!< Bit mask of MAXCNT field. */ +#define SPIM_TXD_MAXCNT_MAXCNT_Msk (0x3FFUL << SPIM_TXD_MAXCNT_MAXCNT_Pos) /*!< Bit mask of MAXCNT field. */ /* Register: SPIM_TXD_AMOUNT */ /* Description: Number of bytes transferred in the last transaction */ -/* Bits 7..0 : Number of bytes transferred in the last transaction */ +/* Bits 9..0 : Number of bytes transferred in the last transaction */ #define SPIM_TXD_AMOUNT_AMOUNT_Pos (0UL) /*!< Position of AMOUNT field. */ -#define SPIM_TXD_AMOUNT_AMOUNT_Msk (0xFFUL << SPIM_TXD_AMOUNT_AMOUNT_Pos) /*!< Bit mask of AMOUNT field. */ +#define SPIM_TXD_AMOUNT_AMOUNT_Msk (0x3FFUL << SPIM_TXD_AMOUNT_AMOUNT_Pos) /*!< Bit mask of AMOUNT field. */ /* Register: SPIM_TXD_LIST */ /* Description: EasyDMA list type */ @@ -8815,6 +8819,12 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define TWIM_SHORTS_LASTRX_STOP_Disabled (0UL) /*!< Disable shortcut */ #define TWIM_SHORTS_LASTRX_STOP_Enabled (1UL) /*!< Enable shortcut */ +/* Bit 11 : Shortcut between LASTRX event and SUSPEND task */ +#define TWIM_SHORTS_LASTRX_SUSPEND_Pos (11UL) /*!< Position of LASTRX_SUSPEND field. */ +#define TWIM_SHORTS_LASTRX_SUSPEND_Msk (0x1UL << TWIM_SHORTS_LASTRX_SUSPEND_Pos) /*!< Bit mask of LASTRX_SUSPEND field. */ +#define TWIM_SHORTS_LASTRX_SUSPEND_Disabled (0UL) /*!< Disable shortcut */ +#define TWIM_SHORTS_LASTRX_SUSPEND_Enabled (1UL) /*!< Enable shortcut */ + /* Bit 10 : Shortcut between LASTRX event and STARTTX task */ #define TWIM_SHORTS_LASTRX_STARTTX_Pos (10UL) /*!< Position of LASTRX_STARTTX field. */ #define TWIM_SHORTS_LASTRX_STARTTX_Msk (0x1UL << TWIM_SHORTS_LASTRX_STARTTX_Pos) /*!< Bit mask of LASTRX_STARTTX field. */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52810_peripherals.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52810_peripherals.h similarity index 96% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52810_peripherals.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52810_peripherals.h index ea6d7beb51..597a95d2ca 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52810_peripherals.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52810_peripherals.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. @@ -145,6 +145,10 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SPIM0_FEATURE_HARDWARE_CSN_PRESENT 0 +#define SPIM0_FEATURE_DCX_PRESENT 0 + +#define SPIM0_FEATURE_RXDELAY_PRESENT 0 + #define SPIM0_EASYDMA_MAXCNT_SIZE 10 /* Serial Peripheral Interface Slave with DMA*/ @@ -181,6 +185,8 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SAADC_EASYDMA_MAXCNT_SIZE 15 +#define SAADC_CH_NUM 8 + /* GPIO Tasks and Events */ #define GPIOTE_PRESENT #define GPIOTE_COUNT 1 diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52832_peripherals.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52832_peripherals.h similarity index 95% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52832_peripherals.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52832_peripherals.h index d1366072a0..b945de4cc4 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52832_peripherals.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52832_peripherals.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. @@ -176,6 +176,14 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SPIM1_FEATURE_HARDWARE_CSN_PRESENT 0 #define SPIM2_FEATURE_HARDWARE_CSN_PRESENT 0 +#define SPIM0_FEATURE_DCX_PRESENT 0 +#define SPIM1_FEATURE_DCX_PRESENT 0 +#define SPIM2_FEATURE_DCX_PRESENT 0 + +#define SPIM0_FEATURE_RXDELAY_PRESENT 0 +#define SPIM1_FEATURE_RXDELAY_PRESENT 0 +#define SPIM2_FEATURE_RXDELAY_PRESENT 0 + #define SPIM0_EASYDMA_MAXCNT_SIZE 8 #define SPIM1_EASYDMA_MAXCNT_SIZE 8 #define SPIM2_EASYDMA_MAXCNT_SIZE 8 @@ -226,6 +234,8 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SAADC_EASYDMA_MAXCNT_SIZE 15 +#define SAADC_CH_NUM 8 + /* GPIO Tasks and Events */ #define GPIOTE_PRESENT #define GPIOTE_COUNT 1 diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52840.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52840.h similarity index 90% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52840.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52840.h index bff4c489b0..6cc29410b2 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52840.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52840.h @@ -1,4 +1,3 @@ - /****************************************************************************************************//** * @file nrf52840.h * @@ -6,12 +5,12 @@ * nrf52840 from Nordic Semiconductor. * * @version V1 - * @date 3. October 2017 + * @date 8. March 2018 * * @note Generated with SVDConv V2.81d * from CMSIS SVD File 'nrf52840.svd' Version 1, * - * @par Copyright (c) 2010 - 2017, Nordic Semiconductor ASA + * @par Copyright (c) 2010 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -182,11 +181,11 @@ typedef enum { typedef struct { __I uint32_t PART; /*!< Part code */ - __I uint32_t VARIANT; /*!< Part variant (hardware version and production configuration) */ + __I uint32_t VARIANT; /*!< Build code (hardware version and production configuration) */ __I uint32_t PACKAGE; /*!< Package option */ __I uint32_t RAM; /*!< RAM variant */ __I uint32_t FLASH; /*!< Flash variant */ - __IO uint32_t UNUSED0[3]; /*!< Description collection[0]: Unspecified */ + __IO uint32_t UNUSED8[3]; /*!< Unspecified */ } FICR_INFO_Type; typedef struct { @@ -221,12 +220,30 @@ typedef struct { } FICR_NFC_Type; typedef struct { - __IO uint32_t POWER; /*!< Description cluster[0]: RAM0 power control register */ - __O uint32_t POWERSET; /*!< Description cluster[0]: RAM0 power control set register */ - __O uint32_t POWERCLR; /*!< Description cluster[0]: RAM0 power control clear register */ + __I uint32_t BYTES; /*!< Amount of bytes for the required entropy bits */ + __I uint32_t RCCUTOFF; /*!< Repetition counter cutoff */ + __I uint32_t APCUTOFF; /*!< Adaptive proportion cutoff */ + __I uint32_t STARTUP; /*!< Amount of bytes for the startup tests */ + __I uint32_t ROSC1; /*!< Sample count for ring oscillator 1 */ + __I uint32_t ROSC2; /*!< Sample count for ring oscillator 2 */ + __I uint32_t ROSC3; /*!< Sample count for ring oscillator 3 */ + __I uint32_t ROSC4; /*!< Sample count for ring oscillator 4 */ +} FICR_TRNG90B_Type; + +typedef struct { + __IO uint32_t POWER; /*!< Description cluster[n]: RAMn power control register */ + __O uint32_t POWERSET; /*!< Description cluster[n]: RAMn power control set register */ + __O uint32_t POWERCLR; /*!< Description cluster[n]: RAMn power control clear register */ __I uint32_t RESERVED0; } POWER_RAM_Type; +typedef struct { + __IO uint32_t RTS; /*!< Pin select for RTS */ + __IO uint32_t TXD; /*!< Pin select for TXD */ + __IO uint32_t CTS; /*!< Pin select for CTS */ + __IO uint32_t RXD; /*!< Pin select for RXD */ +} UART_PSEL_Type; + typedef struct { __IO uint32_t RTS; /*!< Pin select for RTS signal */ __IO uint32_t TXD; /*!< Pin select for TXD signal */ @@ -247,11 +264,10 @@ typedef struct { } UARTE_TXD_Type; typedef struct { - __IO uint32_t RTS; /*!< Pin select for RTS */ - __IO uint32_t TXD; /*!< Pin select for TXD */ - __IO uint32_t CTS; /*!< Pin select for CTS */ - __IO uint32_t RXD; /*!< Pin select for RXD */ -} UART_PSEL_Type; + __IO uint32_t SCK; /*!< Pin select for SCK */ + __IO uint32_t MOSI; /*!< Pin select for MOSI signal */ + __IO uint32_t MISO; /*!< Pin select for MISO signal */ +} SPI_PSEL_Type; typedef struct { __IO uint32_t SCK; /*!< Pin select for SCK */ @@ -299,6 +315,11 @@ typedef struct { __I uint32_t AMOUNT; /*!< Number of bytes transmitted in last granted transaction */ } SPIS_TXD_Type; +typedef struct { + __IO uint32_t SCL; /*!< Pin select for SCL */ + __IO uint32_t SDA; /*!< Pin select for SDA */ +} TWI_PSEL_Type; + typedef struct { __IO uint32_t SCL; /*!< Pin select for SCL signal */ __IO uint32_t SDA; /*!< Pin select for SDA signal */ @@ -335,17 +356,6 @@ typedef struct { __I uint32_t AMOUNT; /*!< Number of bytes transferred in the last TXD transaction */ } TWIS_TXD_Type; -typedef struct { - __IO uint32_t SCK; /*!< Pin select for SCK */ - __IO uint32_t MOSI; /*!< Pin select for MOSI signal */ - __IO uint32_t MISO; /*!< Pin select for MISO signal */ -} SPI_PSEL_Type; - -typedef struct { - __IO uint32_t SCL; /*!< Pin select for SCL */ - __IO uint32_t SDA; /*!< Pin select for SDA */ -} TWI_PSEL_Type; - typedef struct { __IO uint32_t RX; /*!< Result of last incoming frame */ } NFCT_FRAMESTATUS_Type; @@ -361,22 +371,24 @@ typedef struct { } NFCT_RXD_Type; typedef struct { - __IO uint32_t LIMITH; /*!< Description cluster[0]: Last results is equal or above CH[0].LIMIT.HIGH */ - __IO uint32_t LIMITL; /*!< Description cluster[0]: Last results is equal or below CH[0].LIMIT.LOW */ + __IO uint32_t LIMITH; /*!< Description cluster[n]: Last result is equal or above CH[n].LIMIT.HIGH */ + __IO uint32_t LIMITL; /*!< Description cluster[n]: Last result is equal or below CH[n].LIMIT.LOW */ } SAADC_EVENTS_CH_Type; typedef struct { - __IO uint32_t PSELP; /*!< Description cluster[0]: Input positive pin selection for CH[0] */ - __IO uint32_t PSELN; /*!< Description cluster[0]: Input negative pin selection for CH[0] */ - __IO uint32_t CONFIG; /*!< Description cluster[0]: Input configuration for CH[0] */ - __IO uint32_t LIMIT; /*!< Description cluster[0]: High/low limits for event monitoring - a channel */ + __IO uint32_t PSELP; /*!< Description cluster[n]: Input positive pin selection for CH[n] */ + __IO uint32_t PSELN; /*!< Description cluster[n]: Input negative pin selection for CH[n] */ + __IO uint32_t CONFIG; /*!< Description cluster[n]: Input configuration for CH[n] */ + __IO uint32_t LIMIT; /*!< Description cluster[n]: High/low limits for event monitoring + of a channel */ } SAADC_CH_Type; typedef struct { __IO uint32_t PTR; /*!< Data pointer */ - __IO uint32_t MAXCNT; /*!< Maximum number of buffer words to transfer */ - __I uint32_t AMOUNT; /*!< Number of buffer words transferred since last START */ + __IO uint32_t MAXCNT; /*!< Maximum number of 16-bit samples to be written to output RAM + buffer */ + __I uint32_t AMOUNT; /*!< Number of 16-bit samples written to output RAM buffer since + the previous START task */ } SAADC_RESULT_Type; typedef struct { @@ -386,19 +398,18 @@ typedef struct { } QDEC_PSEL_Type; typedef struct { - __IO uint32_t PTR; /*!< Description cluster[0]: Beginning address in Data RAM of this + __IO uint32_t PTR; /*!< Description cluster[n]: Beginning address in RAM of this sequence */ + __IO uint32_t CNT; /*!< Description cluster[n]: Number of values (duty cycles) in this sequence */ - __IO uint32_t CNT; /*!< Description cluster[0]: Amount of values (duty cycles) in this - sequence */ - __IO uint32_t REFRESH; /*!< Description cluster[0]: Amount of additional PWM periods between + __IO uint32_t REFRESH; /*!< Description cluster[n]: Number of additional PWM periods between samples loaded into compare register */ - __IO uint32_t ENDDELAY; /*!< Description cluster[0]: Time added after the sequence */ + __IO uint32_t ENDDELAY; /*!< Description cluster[n]: Time added after the sequence */ __I uint32_t RESERVED1[4]; } PWM_SEQ_Type; typedef struct { - __IO uint32_t OUT[4]; /*!< Description collection[0]: Output pin select for PWM channel - 0 */ + __IO uint32_t OUT[4]; /*!< Description collection[n]: Output pin select for PWM channel + n */ } PWM_PSEL_Type; typedef struct { @@ -412,59 +423,59 @@ typedef struct { } PDM_SAMPLE_Type; typedef struct { - __IO uint32_t ADDR; /*!< Description cluster[0]: Configure the word-aligned start address - of region 0 to protect */ - __IO uint32_t SIZE; /*!< Description cluster[0]: Size of region to protect counting from - address ACL[0].ADDR. Write '0' as no effect. */ - __IO uint32_t PERM; /*!< Description cluster[0]: Access permissions for region 0 as defined - by start address ACL[0].ADDR and size ACL[0].SIZE */ + __IO uint32_t ADDR; /*!< Description cluster[n]: Configure the word-aligned start address + of region n to protect */ + __IO uint32_t SIZE; /*!< Description cluster[n]: Size of region to protect counting from + address ACL[n].ADDR. Write '0' as no effect. */ + __IO uint32_t PERM; /*!< Description cluster[n]: Access permissions for region n as defined + by start address ACL[n].ADDR and size ACL[n].SIZE */ __IO uint32_t UNUSED0; /*!< Unspecified */ } ACL_ACL_Type; typedef struct { - __O uint32_t EN; /*!< Description cluster[0]: Enable channel group 0 */ - __O uint32_t DIS; /*!< Description cluster[0]: Disable channel group 0 */ + __O uint32_t EN; /*!< Description cluster[n]: Enable channel group n */ + __O uint32_t DIS; /*!< Description cluster[n]: Disable channel group n */ } PPI_TASKS_CHG_Type; typedef struct { - __IO uint32_t EEP; /*!< Description cluster[0]: Channel 0 event end-point */ - __IO uint32_t TEP; /*!< Description cluster[0]: Channel 0 task end-point */ + __IO uint32_t EEP; /*!< Description cluster[n]: Channel n event end-point */ + __IO uint32_t TEP; /*!< Description cluster[n]: Channel n task end-point */ } PPI_CH_Type; typedef struct { - __IO uint32_t TEP; /*!< Description cluster[0]: Channel 0 task end-point */ + __IO uint32_t TEP; /*!< Description cluster[n]: Channel n task end-point */ } PPI_FORK_Type; typedef struct { - __IO uint32_t WA; /*!< Description cluster[0]: Write access to region 0 detected */ - __IO uint32_t RA; /*!< Description cluster[0]: Read access to region 0 detected */ + __IO uint32_t WA; /*!< Description cluster[n]: Write access to region n detected */ + __IO uint32_t RA; /*!< Description cluster[n]: Read access to region n detected */ } MWU_EVENTS_REGION_Type; typedef struct { - __IO uint32_t WA; /*!< Description cluster[0]: Write access to peripheral region 0 + __IO uint32_t WA; /*!< Description cluster[n]: Write access to peripheral region n detected */ - __IO uint32_t RA; /*!< Description cluster[0]: Read access to peripheral region 0 detected */ + __IO uint32_t RA; /*!< Description cluster[n]: Read access to peripheral region n detected */ } MWU_EVENTS_PREGION_Type; typedef struct { - __IO uint32_t SUBSTATWA; /*!< Description cluster[0]: Source of event/interrupt in region - 0, write access detected while corresponding subregion was enabled + __IO uint32_t SUBSTATWA; /*!< Description cluster[n]: Source of event/interrupt in region + n, write access detected while corresponding subregion was enabled for watching */ - __IO uint32_t SUBSTATRA; /*!< Description cluster[0]: Source of event/interrupt in region - 0, read access detected while corresponding subregion was enabled + __IO uint32_t SUBSTATRA; /*!< Description cluster[n]: Source of event/interrupt in region + n, read access detected while corresponding subregion was enabled for watching */ } MWU_PERREGION_Type; typedef struct { - __IO uint32_t START; /*!< Description cluster[0]: Start address for region 0 */ - __IO uint32_t END; /*!< Description cluster[0]: End address of region 0 */ + __IO uint32_t START; /*!< Description cluster[n]: Start address for region n */ + __IO uint32_t END; /*!< Description cluster[n]: End address of region n */ __I uint32_t RESERVED2[2]; } MWU_REGION_Type; typedef struct { - __I uint32_t START; /*!< Description cluster[0]: Reserved for future use */ - __I uint32_t END; /*!< Description cluster[0]: Reserved for future use */ - __IO uint32_t SUBS; /*!< Description cluster[0]: Subregions of region 0 */ + __I uint32_t START; /*!< Description cluster[n]: Reserved for future use */ + __I uint32_t END; /*!< Description cluster[n]: Reserved for future use */ + __IO uint32_t SUBS; /*!< Description cluster[n]: Subregions of region n */ __I uint32_t RESERVED3; } MWU_PREGION_Type; @@ -502,23 +513,23 @@ typedef struct { } I2S_PSEL_Type; typedef struct { - __I uint32_t EPIN[8]; /*!< Description collection[0]: IN endpoint halted status. Can be + __I uint32_t EPIN[8]; /*!< Description collection[n]: IN endpoint halted status. Can be used as is as response to a GetStatus() request to endpoint. */ __I uint32_t RESERVED4; - __I uint32_t EPOUT[8]; /*!< Description collection[0]: OUT endpoint halted status. Can be + __I uint32_t EPOUT[8]; /*!< Description collection[n]: OUT endpoint halted status. Can be used as is as response to a GetStatus() request to endpoint. */ } USBD_HALTED_Type; typedef struct { - __IO uint32_t EPOUT[8]; /*!< Description collection[0]: Amount of bytes received last in + __IO uint32_t EPOUT[8]; /*!< Description collection[n]: Number of bytes received last in the data stage of this OUT endpoint */ - __I uint32_t ISOOUT; /*!< Amount of bytes received last on this iso OUT data endpoint */ + __I uint32_t ISOOUT; /*!< Number of bytes received last on this ISO OUT data endpoint */ } USBD_SIZE_Type; typedef struct { - __IO uint32_t PTR; /*!< Description cluster[0]: Data pointer */ - __IO uint32_t MAXCNT; /*!< Description cluster[0]: Maximum number of bytes to transfer */ - __I uint32_t AMOUNT; /*!< Description cluster[0]: Number of bytes transferred in the last + __IO uint32_t PTR; /*!< Description cluster[n]: Data pointer */ + __IO uint32_t MAXCNT; /*!< Description cluster[n]: Maximum number of bytes to transfer */ + __I uint32_t AMOUNT; /*!< Description cluster[n]: Number of bytes transferred in the last transaction */ __I uint32_t RESERVED5[2]; } USBD_EPIN_Type; @@ -530,9 +541,9 @@ typedef struct { } USBD_ISOIN_Type; typedef struct { - __IO uint32_t PTR; /*!< Description cluster[0]: Data pointer */ - __IO uint32_t MAXCNT; /*!< Description cluster[0]: Maximum number of bytes to transfer */ - __I uint32_t AMOUNT; /*!< Description cluster[0]: Number of bytes transferred in the last + __IO uint32_t PTR; /*!< Description cluster[n]: Data pointer */ + __IO uint32_t MAXCNT; /*!< Description cluster[n]: Maximum number of bytes to transfer */ + __I uint32_t AMOUNT; /*!< Description cluster[n]: Number of bytes transferred in the last transaction */ __I uint32_t RESERVED6[2]; } USBD_EPOUT_Type; @@ -585,18 +596,22 @@ typedef struct { /*!< FICR Structure __I uint32_t CODEPAGESIZE; /*!< Code memory page size */ __I uint32_t CODESIZE; /*!< Code memory size */ __I uint32_t RESERVED1[18]; - __I uint32_t DEVICEID[2]; /*!< Description collection[0]: Device identifier */ + __I uint32_t DEVICEID[2]; /*!< Description collection[n]: Device identifier */ __I uint32_t RESERVED2[6]; - __I uint32_t ER[4]; /*!< Description collection[0]: Encryption root, word 0 */ - __I uint32_t IR[4]; /*!< Description collection[0]: Identity Root, word 0 */ + __I uint32_t ER[4]; /*!< Description collection[n]: Encryption root, word n */ + __I uint32_t IR[4]; /*!< Description collection[n]: Identity Root, word n */ __I uint32_t DEVICEADDRTYPE; /*!< Device address type */ - __I uint32_t DEVICEADDR[2]; /*!< Description collection[0]: Device address 0 */ + __I uint32_t DEVICEADDR[2]; /*!< Description collection[n]: Device address n */ __I uint32_t RESERVED3[21]; FICR_INFO_Type INFO; /*!< Device info */ - __I uint32_t RESERVED4[185]; + __I uint32_t RESERVED4[140]; + __I uint32_t PRODTEST[3]; /*!< Description collection[n]: Production test signature n */ + __I uint32_t RESERVED5[42]; FICR_TEMP_Type TEMP; /*!< Registers storing factory TEMP module linearization coefficients */ - __I uint32_t RESERVED5[2]; + __I uint32_t RESERVED6[2]; FICR_NFC_Type NFC; /*!< Unspecified */ + __I uint32_t RESERVED7[488]; + FICR_TRNG90B_Type TRNG90B; /*!< NIST800-90B RNG calibration data */ } NRF_FICR_Type; @@ -615,23 +630,73 @@ typedef struct { /*!< UICR Structure __IO uint32_t UNUSED2; /*!< Unspecified */ __I uint32_t RESERVED0; __IO uint32_t UNUSED3; /*!< Unspecified */ - __IO uint32_t NRFFW[15]; /*!< Description collection[0]: Reserved for Nordic firmware design */ - __IO uint32_t NRFHW[12]; /*!< Description collection[0]: Reserved for Nordic hardware design */ - __IO uint32_t CUSTOMER[32]; /*!< Description collection[0]: Reserved for customer */ + __IO uint32_t NRFFW[15]; /*!< Description collection[n]: Reserved for Nordic firmware design */ + __IO uint32_t NRFHW[12]; /*!< Description collection[n]: Reserved for Nordic hardware design */ + __IO uint32_t CUSTOMER[32]; /*!< Description collection[n]: Reserved for customer */ __I uint32_t RESERVED1[64]; - __IO uint32_t PSELRESET[2]; /*!< Description collection[0]: Mapping of the nRESET function */ + __IO uint32_t PSELRESET[2]; /*!< Description collection[n]: Mapping of the nRESET function */ __IO uint32_t APPROTECT; /*!< Access port protection */ __IO uint32_t NFCPINS; /*!< Setting of pins dedicated to NFC functionality: NFC antenna or GPIO */ __IO uint32_t DEBUGCTRL; /*!< Processor debug control */ - __I uint32_t RESERVED2[59]; - __IO uint32_t DCDCDRIVE0; /*!< Set drive level for REG0 DCDC mode. Using high drive will slightly - reduce DCDC efficiency. */ + __I uint32_t RESERVED2[60]; __IO uint32_t REGOUT0; /*!< GPIO reference voltage / external output supply voltage in high voltage mode */ } NRF_UICR_Type; +/* ================================================================================ */ +/* ================ CLOCK ================ */ +/* ================================================================================ */ + + +/** + * @brief Clock control (CLOCK) + */ + +typedef struct { /*!< CLOCK Structure */ + __O uint32_t TASKS_HFCLKSTART; /*!< Start HFXO crystal oscillator */ + __O uint32_t TASKS_HFCLKSTOP; /*!< Stop HFXO crystal oscillator */ + __O uint32_t TASKS_LFCLKSTART; /*!< Start LFCLK */ + __O uint32_t TASKS_LFCLKSTOP; /*!< Stop LFCLK */ + __O uint32_t TASKS_CAL; /*!< Start calibration of LFRC */ + __O uint32_t TASKS_CTSTART; /*!< Start calibration timer */ + __O uint32_t TASKS_CTSTOP; /*!< Stop calibration timer */ + __I uint32_t RESERVED0[57]; + __IO uint32_t EVENTS_HFCLKSTARTED; /*!< HFXO crystal oscillator started */ + __IO uint32_t EVENTS_LFCLKSTARTED; /*!< LFCLK started */ + __I uint32_t RESERVED1; + __IO uint32_t EVENTS_DONE; /*!< Calibration of LFRC completed */ + __IO uint32_t EVENTS_CTTO; /*!< Calibration timer timeout */ + __I uint32_t RESERVED2[5]; + __IO uint32_t EVENTS_CTSTARTED; /*!< Calibration timer has been started and is ready to process new + tasks */ + __IO uint32_t EVENTS_CTSTOPPED; /*!< Calibration timer has been stopped and is ready to process new + tasks */ + __I uint32_t RESERVED3[117]; + __IO uint32_t INTENSET; /*!< Enable interrupt */ + __IO uint32_t INTENCLR; /*!< Disable interrupt */ + __I uint32_t RESERVED4[63]; + __I uint32_t HFCLKRUN; /*!< Status indicating that HFCLKSTART task has been triggered */ + __I uint32_t HFCLKSTAT; /*!< HFCLK status */ + __I uint32_t RESERVED5; + __I uint32_t LFCLKRUN; /*!< Status indicating that LFCLKSTART task has been triggered */ + __I uint32_t LFCLKSTAT; /*!< LFCLK status */ + __I uint32_t LFCLKSRCCOPY; /*!< Copy of LFCLKSRC register, set when LFCLKSTART task was triggered */ + __I uint32_t RESERVED6[62]; + __IO uint32_t LFCLKSRC; /*!< Clock source for the LFCLK */ + __I uint32_t RESERVED7[3]; + __IO uint32_t HFXODEBOUNCE; /*!< HFXO debounce time. The HFXO is started by triggering the TASKS_HFCLKSTART + task. */ + __I uint32_t RESERVED8[3]; + __IO uint32_t CTIV; /*!< Calibration timer interval */ + __I uint32_t RESERVED9[8]; + __IO uint32_t TRACECONFIG; /*!< Clocking options for the trace port debug interface */ + __I uint32_t RESERVED10[21]; + __IO uint32_t LFRCMODE; /*!< LFRC mode configuration */ +} NRF_CLOCK_Type; + + /* ================================================================================ */ /* ================ POWER ================ */ /* ================================================================================ */ @@ -665,7 +730,7 @@ typedef struct { /*!< POWER Structure __I uint32_t RESERVED7[49]; __O uint32_t SYSTEMOFF; /*!< System OFF register */ __I uint32_t RESERVED8[3]; - __IO uint32_t POFCON; /*!< Power failure comparator configuration */ + __IO uint32_t POFCON; /*!< Power-fail comparator configuration */ __I uint32_t RESERVED9[2]; __IO uint32_t GPREGRET; /*!< General purpose retention register */ __IO uint32_t GPREGRET2; /*!< General purpose retention register */ @@ -680,65 +745,13 @@ typedef struct { /*!< POWER Structure } NRF_POWER_Type; -/* ================================================================================ */ -/* ================ CLOCK ================ */ -/* ================================================================================ */ - - -/** - * @brief Clock control (CLOCK) - */ - -typedef struct { /*!< CLOCK Structure */ - __O uint32_t TASKS_HFCLKSTART; /*!< Start HFCLK crystal oscillator */ - __O uint32_t TASKS_HFCLKSTOP; /*!< Stop HFCLK crystal oscillator */ - __O uint32_t TASKS_LFCLKSTART; /*!< Start LFCLK source */ - __O uint32_t TASKS_LFCLKSTOP; /*!< Stop LFCLK source */ - __O uint32_t TASKS_CAL; /*!< Start calibration of LFRC or LFULP oscillator */ - __O uint32_t TASKS_CTSTART; /*!< Start calibration timer */ - __O uint32_t TASKS_CTSTOP; /*!< Stop calibration timer */ - __I uint32_t RESERVED0[57]; - __IO uint32_t EVENTS_HFCLKSTARTED; /*!< HFCLK oscillator started */ - __IO uint32_t EVENTS_LFCLKSTARTED; /*!< LFCLK started */ - __I uint32_t RESERVED1; - __IO uint32_t EVENTS_DONE; /*!< Calibration of LFCLK RC oscillator complete event */ - __IO uint32_t EVENTS_CTTO; /*!< Calibration timer timeout */ - __I uint32_t RESERVED2[5]; - __IO uint32_t EVENTS_CTSTARTED; /*!< Calibration timer has been started and is ready to process new - tasks */ - __IO uint32_t EVENTS_CTSTOPPED; /*!< Calibration timer has been stopped and is ready to process new - tasks */ - __I uint32_t RESERVED3[117]; - __IO uint32_t INTENSET; /*!< Enable interrupt */ - __IO uint32_t INTENCLR; /*!< Disable interrupt */ - __I uint32_t RESERVED4[63]; - __I uint32_t HFCLKRUN; /*!< Status indicating that HFCLKSTART task has been triggered */ - __I uint32_t HFCLKSTAT; /*!< HFCLK status */ - __I uint32_t RESERVED5; - __I uint32_t LFCLKRUN; /*!< Status indicating that LFCLKSTART task has been triggered */ - __I uint32_t LFCLKSTAT; /*!< LFCLK status */ - __I uint32_t LFCLKSRCCOPY; /*!< Copy of LFCLKSRC register, set when LFCLKSTART task was triggered */ - __I uint32_t RESERVED6[62]; - __IO uint32_t LFCLKSRC; /*!< Clock source for the LFCLK */ - __I uint32_t RESERVED7[3]; - __IO uint32_t HFXODEBOUNCE; /*!< HFXO debounce time. The HFXO is started by triggering the TASKS_HFCLKSTART - task. */ - __I uint32_t RESERVED8[3]; - __IO uint32_t CTIV; /*!< Calibration timer interval */ - __I uint32_t RESERVED9[8]; - __IO uint32_t TRACECONFIG; /*!< Clocking options for the Trace Port debug interface */ - __I uint32_t RESERVED10[21]; - __IO uint32_t LFRCMODE; /*!< LFRC mode configuration */ -} NRF_CLOCK_Type; - - /* ================================================================================ */ /* ================ RADIO ================ */ /* ================================================================================ */ /** - * @brief 2.4 GHz Radio (RADIO) + * @brief 2.4 GHz radio (RADIO) */ typedef struct { /*!< RADIO Structure */ @@ -748,14 +761,14 @@ typedef struct { /*!< RADIO Structure __O uint32_t TASKS_STOP; /*!< Stop RADIO */ __O uint32_t TASKS_DISABLE; /*!< Disable RADIO */ __O uint32_t TASKS_RSSISTART; /*!< Start the RSSI and take one single sample of the receive signal - strength. */ + strength */ __O uint32_t TASKS_RSSISTOP; /*!< Stop the RSSI measurement */ __O uint32_t TASKS_BCSTART; /*!< Start the bit counter */ __O uint32_t TASKS_BCSTOP; /*!< Stop the bit counter */ - __O uint32_t TASKS_EDSTART; /*!< Start the Energy Detect measurement used in IEEE 802.15.4 mode */ - __O uint32_t TASKS_EDSTOP; /*!< Stop the Energy Detect measurement */ - __O uint32_t TASKS_CCASTART; /*!< Start the Clear Channel Assessment used in IEEE 802.15.4 mode */ - __O uint32_t TASKS_CCASTOP; /*!< Stop the Clear Channel Assessment */ + __O uint32_t TASKS_EDSTART; /*!< Start the energy detect measurement used in IEEE 802.15.4 mode */ + __O uint32_t TASKS_EDSTOP; /*!< Stop the energy detect measurement */ + __O uint32_t TASKS_CCASTART; /*!< Start the clear channel assessment used in IEEE 802.15.4 mode */ + __O uint32_t TASKS_CCASTOP; /*!< Stop the clear channel assessment */ __I uint32_t RESERVED0[51]; __IO uint32_t EVENTS_READY; /*!< RADIO has ramped up and is ready to be started */ __IO uint32_t EVENTS_ADDRESS; /*!< Address sent or received */ @@ -764,16 +777,16 @@ typedef struct { /*!< RADIO Structure __IO uint32_t EVENTS_DISABLED; /*!< RADIO has been disabled */ __IO uint32_t EVENTS_DEVMATCH; /*!< A device address match occurred on the last received packet */ __IO uint32_t EVENTS_DEVMISS; /*!< No device address match occurred on the last received packet */ - __IO uint32_t EVENTS_RSSIEND; /*!< Sampling of receive signal strength complete. */ + __IO uint32_t EVENTS_RSSIEND; /*!< Sampling of receive signal strength complete */ __I uint32_t RESERVED1[2]; - __IO uint32_t EVENTS_BCMATCH; /*!< Bit counter reached bit count value. */ + __IO uint32_t EVENTS_BCMATCH; /*!< Bit counter reached bit count value */ __I uint32_t RESERVED2; __IO uint32_t EVENTS_CRCOK; /*!< Packet received with CRC ok */ __IO uint32_t EVENTS_CRCERROR; /*!< Packet received with CRC error */ __IO uint32_t EVENTS_FRAMESTART; /*!< IEEE 802.15.4 length field received */ - __IO uint32_t EVENTS_EDEND; /*!< Sampling of Energy Detection complete. A new ED sample is ready - for readout from the RADIO.EDSAMPLE register */ - __IO uint32_t EVENTS_EDSTOPPED; /*!< The sampling of Energy Detection has stopped */ + __IO uint32_t EVENTS_EDEND; /*!< Sampling of energy detection complete. A new ED sample is ready + for readout from the RADIO.EDSAMPLE register. */ + __IO uint32_t EVENTS_EDSTOPPED; /*!< The sampling of energy detection has stopped */ __IO uint32_t EVENTS_CCAIDLE; /*!< Wireless medium in idle - clear to send */ __IO uint32_t EVENTS_CCABUSY; /*!< Wireless medium busy - do not send */ __IO uint32_t EVENTS_CCASTOPPED; /*!< The CCA has stopped */ @@ -781,7 +794,7 @@ typedef struct { /*!< RADIO Structure to Ble_LR500Kbit. */ __IO uint32_t EVENTS_TXREADY; /*!< RADIO has ramped up and is ready to be started TX path */ __IO uint32_t EVENTS_RXREADY; /*!< RADIO has ramped up and is ready to be started RX path */ - __IO uint32_t EVENTS_MHRMATCH; /*!< MAC Header match found. */ + __IO uint32_t EVENTS_MHRMATCH; /*!< MAC header match found */ __I uint32_t RESERVED3[3]; __IO uint32_t EVENTS_PHYEND; /*!< Generated in Ble_LR125Kbit, Ble_LR500Kbit and BleIeee802154_250Kbit modes when last bit is sent on air. */ @@ -814,7 +827,7 @@ typedef struct { /*!< RADIO Structure __IO uint32_t CRCPOLY; /*!< CRC polynomial */ __IO uint32_t CRCINIT; /*!< CRC initial value */ __I uint32_t RESERVED9; - __IO uint32_t TIFS; /*!< Inter Frame Spacing in us */ + __IO uint32_t TIFS; /*!< Interframe spacing in us */ __I uint32_t RSSISAMPLE; /*!< RSSI sample */ __I uint32_t RESERVED10; __I uint32_t STATE; /*!< Current radio state */ @@ -822,23 +835,69 @@ typedef struct { /*!< RADIO Structure __I uint32_t RESERVED11[2]; __IO uint32_t BCC; /*!< Bit counter compare */ __I uint32_t RESERVED12[39]; - __IO uint32_t DAB[8]; /*!< Description collection[0]: Device address base segment 0 */ - __IO uint32_t DAP[8]; /*!< Description collection[0]: Device address prefix 0 */ + __IO uint32_t DAB[8]; /*!< Description collection[n]: Device address base segment n */ + __IO uint32_t DAP[8]; /*!< Description collection[n]: Device address prefix n */ __IO uint32_t DACNF; /*!< Device address match configuration */ - __IO uint32_t MHRMATCHCONF; /*!< Search Pattern Configuration */ + __IO uint32_t MHRMATCHCONF; /*!< Search pattern configuration */ __IO uint32_t MHRMATCHMAS; /*!< Pattern mask */ __I uint32_t RESERVED13; __IO uint32_t MODECNF0; /*!< Radio mode configuration register 0 */ __I uint32_t RESERVED14[3]; - __IO uint32_t SFD; /*!< IEEE 802.15.4 Start of Frame Delimiter */ - __IO uint32_t EDCNT; /*!< IEEE 802.15.4 Energy Detect Loop Count */ - __IO uint32_t EDSAMPLE; /*!< IEEE 802.15.4 Energy Detect Level */ - __IO uint32_t CCACTRL; /*!< IEEE 802.15.4 Clear Channel Assessment Control */ + __IO uint32_t SFD; /*!< IEEE 802.15.4 start of frame delimiter */ + __IO uint32_t EDCNT; /*!< IEEE 802.15.4 energy detect loop count */ + __IO uint32_t EDSAMPLE; /*!< IEEE 802.15.4 energy detect level */ + __IO uint32_t CCACTRL; /*!< IEEE 802.15.4 clear channel assessment control */ __I uint32_t RESERVED15[611]; __IO uint32_t POWER; /*!< Peripheral power control */ } NRF_RADIO_Type; +/* ================================================================================ */ +/* ================ UART ================ */ +/* ================================================================================ */ + + +/** + * @brief Universal Asynchronous Receiver/Transmitter (UART) + */ + +typedef struct { /*!< UART Structure */ + __O uint32_t TASKS_STARTRX; /*!< Start UART receiver */ + __O uint32_t TASKS_STOPRX; /*!< Stop UART receiver */ + __O uint32_t TASKS_STARTTX; /*!< Start UART transmitter */ + __O uint32_t TASKS_STOPTX; /*!< Stop UART transmitter */ + __I uint32_t RESERVED0[3]; + __O uint32_t TASKS_SUSPEND; /*!< Suspend UART */ + __I uint32_t RESERVED1[56]; + __IO uint32_t EVENTS_CTS; /*!< CTS is activated (set low). Clear To Send. */ + __IO uint32_t EVENTS_NCTS; /*!< CTS is deactivated (set high). Not Clear To Send. */ + __IO uint32_t EVENTS_RXDRDY; /*!< Data received in RXD */ + __I uint32_t RESERVED2[4]; + __IO uint32_t EVENTS_TXDRDY; /*!< Data sent from TXD */ + __I uint32_t RESERVED3; + __IO uint32_t EVENTS_ERROR; /*!< Error detected */ + __I uint32_t RESERVED4[7]; + __IO uint32_t EVENTS_RXTO; /*!< Receiver timeout */ + __I uint32_t RESERVED5[46]; + __IO uint32_t SHORTS; /*!< Shortcut register */ + __I uint32_t RESERVED6[64]; + __IO uint32_t INTENSET; /*!< Enable interrupt */ + __IO uint32_t INTENCLR; /*!< Disable interrupt */ + __I uint32_t RESERVED7[93]; + __IO uint32_t ERRORSRC; /*!< Error source */ + __I uint32_t RESERVED8[31]; + __IO uint32_t ENABLE; /*!< Enable UART */ + __I uint32_t RESERVED9; + UART_PSEL_Type PSEL; /*!< Unspecified */ + __I uint32_t RXD; /*!< RXD register */ + __O uint32_t TXD; /*!< TXD register */ + __I uint32_t RESERVED10; + __IO uint32_t BAUDRATE; /*!< Baud rate. Accuracy depends on the HFCLK source selected. */ + __I uint32_t RESERVED11[17]; + __IO uint32_t CONFIG; /*!< Configuration of parity and hardware flow control */ +} NRF_UART_Type; + + /* ================================================================================ */ /* ================ UARTE ================ */ /* ================================================================================ */ @@ -897,49 +956,32 @@ typedef struct { /*!< UARTE Structure /* ================================================================================ */ -/* ================ UART ================ */ +/* ================ SPI ================ */ /* ================================================================================ */ /** - * @brief Universal Asynchronous Receiver/Transmitter (UART) + * @brief Serial Peripheral Interface 0 (SPI) */ -typedef struct { /*!< UART Structure */ - __O uint32_t TASKS_STARTRX; /*!< Start UART receiver */ - __O uint32_t TASKS_STOPRX; /*!< Stop UART receiver */ - __O uint32_t TASKS_STARTTX; /*!< Start UART transmitter */ - __O uint32_t TASKS_STOPTX; /*!< Stop UART transmitter */ - __I uint32_t RESERVED0[3]; - __O uint32_t TASKS_SUSPEND; /*!< Suspend UART */ - __I uint32_t RESERVED1[56]; - __IO uint32_t EVENTS_CTS; /*!< CTS is activated (set low). Clear To Send. */ - __IO uint32_t EVENTS_NCTS; /*!< CTS is deactivated (set high). Not Clear To Send. */ - __IO uint32_t EVENTS_RXDRDY; /*!< Data received in RXD */ - __I uint32_t RESERVED2[4]; - __IO uint32_t EVENTS_TXDRDY; /*!< Data sent from TXD */ - __I uint32_t RESERVED3; - __IO uint32_t EVENTS_ERROR; /*!< Error detected */ - __I uint32_t RESERVED4[7]; - __IO uint32_t EVENTS_RXTO; /*!< Receiver timeout */ - __I uint32_t RESERVED5[46]; - __IO uint32_t SHORTS; /*!< Shortcut register */ - __I uint32_t RESERVED6[64]; +typedef struct { /*!< SPI Structure */ + __I uint32_t RESERVED0[66]; + __IO uint32_t EVENTS_READY; /*!< TXD byte sent and RXD byte received */ + __I uint32_t RESERVED1[126]; __IO uint32_t INTENSET; /*!< Enable interrupt */ __IO uint32_t INTENCLR; /*!< Disable interrupt */ - __I uint32_t RESERVED7[93]; - __IO uint32_t ERRORSRC; /*!< Error source */ - __I uint32_t RESERVED8[31]; - __IO uint32_t ENABLE; /*!< Enable UART */ - __I uint32_t RESERVED9; - UART_PSEL_Type PSEL; /*!< Unspecified */ + __I uint32_t RESERVED2[125]; + __IO uint32_t ENABLE; /*!< Enable SPI */ + __I uint32_t RESERVED3; + SPI_PSEL_Type PSEL; /*!< Unspecified */ + __I uint32_t RESERVED4; __I uint32_t RXD; /*!< RXD register */ - __O uint32_t TXD; /*!< TXD register */ - __I uint32_t RESERVED10; - __IO uint32_t BAUDRATE; /*!< Baud rate. Accuracy depends on the HFCLK source selected. */ - __I uint32_t RESERVED11[17]; - __IO uint32_t CONFIG; /*!< Configuration of parity and hardware flow control */ -} NRF_UART_Type; + __IO uint32_t TXD; /*!< TXD register */ + __I uint32_t RESERVED5; + __IO uint32_t FREQUENCY; /*!< SPI frequency. Accuracy depends on the HFCLK source selected. */ + __I uint32_t RESERVED6[11]; + __IO uint32_t CONFIG; /*!< Configuration register */ +} NRF_SPI_Type; /* ================================================================================ */ @@ -1044,6 +1086,57 @@ typedef struct { /*!< SPIS Structure } NRF_SPIS_Type; +/* ================================================================================ */ +/* ================ TWI ================ */ +/* ================================================================================ */ + + +/** + * @brief I2C compatible Two-Wire Interface 0 (TWI) + */ + +typedef struct { /*!< TWI Structure */ + __O uint32_t TASKS_STARTRX; /*!< Start TWI receive sequence */ + __I uint32_t RESERVED0; + __O uint32_t TASKS_STARTTX; /*!< Start TWI transmit sequence */ + __I uint32_t RESERVED1[2]; + __O uint32_t TASKS_STOP; /*!< Stop TWI transaction */ + __I uint32_t RESERVED2; + __O uint32_t TASKS_SUSPEND; /*!< Suspend TWI transaction */ + __O uint32_t TASKS_RESUME; /*!< Resume TWI transaction */ + __I uint32_t RESERVED3[56]; + __IO uint32_t EVENTS_STOPPED; /*!< TWI stopped */ + __IO uint32_t EVENTS_RXDREADY; /*!< TWI RXD byte received */ + __I uint32_t RESERVED4[4]; + __IO uint32_t EVENTS_TXDSENT; /*!< TWI TXD byte sent */ + __I uint32_t RESERVED5; + __IO uint32_t EVENTS_ERROR; /*!< TWI error */ + __I uint32_t RESERVED6[4]; + __IO uint32_t EVENTS_BB; /*!< TWI byte boundary, generated before each byte that is sent or + received */ + __I uint32_t RESERVED7[3]; + __IO uint32_t EVENTS_SUSPENDED; /*!< TWI entered the suspended state */ + __I uint32_t RESERVED8[45]; + __IO uint32_t SHORTS; /*!< Shortcut register */ + __I uint32_t RESERVED9[64]; + __IO uint32_t INTENSET; /*!< Enable interrupt */ + __IO uint32_t INTENCLR; /*!< Disable interrupt */ + __I uint32_t RESERVED10[110]; + __IO uint32_t ERRORSRC; /*!< Error source */ + __I uint32_t RESERVED11[14]; + __IO uint32_t ENABLE; /*!< Enable TWI */ + __I uint32_t RESERVED12; + TWI_PSEL_Type PSEL; /*!< Unspecified */ + __I uint32_t RESERVED13[2]; + __I uint32_t RXD; /*!< RXD register */ + __IO uint32_t TXD; /*!< TXD register */ + __I uint32_t RESERVED14; + __IO uint32_t FREQUENCY; /*!< TWI frequency. Accuracy depends on the HFCLK source selected. */ + __I uint32_t RESERVED15[24]; + __IO uint32_t ADDRESS; /*!< Address used in the TWI transfer */ +} NRF_TWI_Type; + + /* ================================================================================ */ /* ================ TWIM ================ */ /* ================================================================================ */ @@ -1143,7 +1236,7 @@ typedef struct { /*!< TWIS Structure __I uint32_t RESERVED13; TWIS_TXD_Type TXD; /*!< TXD EasyDMA channel */ __I uint32_t RESERVED14[14]; - __IO uint32_t ADDRESS[2]; /*!< Description collection[0]: TWI slave address 0 */ + __IO uint32_t ADDRESS[2]; /*!< Description collection[n]: TWI slave address n */ __I uint32_t RESERVED15; __IO uint32_t CONFIG; /*!< Configuration register for the address match mechanism */ __I uint32_t RESERVED16[10]; @@ -1152,86 +1245,6 @@ typedef struct { /*!< TWIS Structure } NRF_TWIS_Type; -/* ================================================================================ */ -/* ================ SPI ================ */ -/* ================================================================================ */ - - -/** - * @brief Serial Peripheral Interface 0 (SPI) - */ - -typedef struct { /*!< SPI Structure */ - __I uint32_t RESERVED0[66]; - __IO uint32_t EVENTS_READY; /*!< TXD byte sent and RXD byte received */ - __I uint32_t RESERVED1[126]; - __IO uint32_t INTENSET; /*!< Enable interrupt */ - __IO uint32_t INTENCLR; /*!< Disable interrupt */ - __I uint32_t RESERVED2[125]; - __IO uint32_t ENABLE; /*!< Enable SPI */ - __I uint32_t RESERVED3; - SPI_PSEL_Type PSEL; /*!< Unspecified */ - __I uint32_t RESERVED4; - __I uint32_t RXD; /*!< RXD register */ - __IO uint32_t TXD; /*!< TXD register */ - __I uint32_t RESERVED5; - __IO uint32_t FREQUENCY; /*!< SPI frequency. Accuracy depends on the HFCLK source selected. */ - __I uint32_t RESERVED6[11]; - __IO uint32_t CONFIG; /*!< Configuration register */ -} NRF_SPI_Type; - - -/* ================================================================================ */ -/* ================ TWI ================ */ -/* ================================================================================ */ - - -/** - * @brief I2C compatible Two-Wire Interface 0 (TWI) - */ - -typedef struct { /*!< TWI Structure */ - __O uint32_t TASKS_STARTRX; /*!< Start TWI receive sequence */ - __I uint32_t RESERVED0; - __O uint32_t TASKS_STARTTX; /*!< Start TWI transmit sequence */ - __I uint32_t RESERVED1[2]; - __O uint32_t TASKS_STOP; /*!< Stop TWI transaction */ - __I uint32_t RESERVED2; - __O uint32_t TASKS_SUSPEND; /*!< Suspend TWI transaction */ - __O uint32_t TASKS_RESUME; /*!< Resume TWI transaction */ - __I uint32_t RESERVED3[56]; - __IO uint32_t EVENTS_STOPPED; /*!< TWI stopped */ - __IO uint32_t EVENTS_RXDREADY; /*!< TWI RXD byte received */ - __I uint32_t RESERVED4[4]; - __IO uint32_t EVENTS_TXDSENT; /*!< TWI TXD byte sent */ - __I uint32_t RESERVED5; - __IO uint32_t EVENTS_ERROR; /*!< TWI error */ - __I uint32_t RESERVED6[4]; - __IO uint32_t EVENTS_BB; /*!< TWI byte boundary, generated before each byte that is sent or - received */ - __I uint32_t RESERVED7[3]; - __IO uint32_t EVENTS_SUSPENDED; /*!< TWI entered the suspended state */ - __I uint32_t RESERVED8[45]; - __IO uint32_t SHORTS; /*!< Shortcut register */ - __I uint32_t RESERVED9[64]; - __IO uint32_t INTENSET; /*!< Enable interrupt */ - __IO uint32_t INTENCLR; /*!< Disable interrupt */ - __I uint32_t RESERVED10[110]; - __IO uint32_t ERRORSRC; /*!< Error source */ - __I uint32_t RESERVED11[14]; - __IO uint32_t ENABLE; /*!< Enable TWI */ - __I uint32_t RESERVED12; - TWI_PSEL_Type PSEL; /*!< Unspecified */ - __I uint32_t RESERVED13[2]; - __I uint32_t RXD; /*!< RXD register */ - __IO uint32_t TXD; /*!< TXD register */ - __I uint32_t RESERVED14; - __IO uint32_t FREQUENCY; /*!< TWI frequency. Accuracy depends on the HFCLK source selected. */ - __I uint32_t RESERVED15[24]; - __IO uint32_t ADDRESS; /*!< Address used in the TWI transfer */ -} NRF_TWI_Type; - - /* ================================================================================ */ /* ================ NFCT ================ */ /* ================================================================================ */ @@ -1286,9 +1299,11 @@ typedef struct { /*!< NFCT Structure __I uint32_t RESERVED9; NFCT_FRAMESTATUS_Type FRAMESTATUS; /*!< Unspecified */ __I uint32_t NFCTAGSTATE; /*!< NfcTag state register */ - __I uint32_t RESERVED10[10]; + __I uint32_t RESERVED10[3]; + __I uint32_t SLEEPSTATE; /*!< Sleep state during automatic collision resolution */ + __I uint32_t RESERVED11[6]; __I uint32_t FIELDPRESENT; /*!< Indicates the presence or not of a valid field */ - __I uint32_t RESERVED11[49]; + __I uint32_t RESERVED12[49]; __IO uint32_t FRAMEDELAYMIN; /*!< Minimum frame delay */ __IO uint32_t FRAMEDELAYMAX; /*!< Maximum frame delay */ __IO uint32_t FRAMEDELAYMODE; /*!< Configuration register for the Frame Delay Timer */ @@ -1297,7 +1312,7 @@ typedef struct { /*!< NFCT Structure each */ NFCT_TXD_Type TXD; /*!< Unspecified */ NFCT_RXD_Type RXD; /*!< Unspecified */ - __I uint32_t RESERVED12[26]; + __I uint32_t RESERVED13[26]; __IO uint32_t NFCID1_LAST; /*!< Last NFCID1 part (4, 7 or 10 bytes ID) */ __IO uint32_t NFCID1_2ND_LAST; /*!< Second last NFCID1 part (7 or 10 bytes ID) */ __IO uint32_t NFCID1_3RD_LAST; /*!< Third last NFCID1 part (10 bytes ID) */ @@ -1318,17 +1333,17 @@ typedef struct { /*!< NFCT Structure */ typedef struct { /*!< GPIOTE Structure */ - __O uint32_t TASKS_OUT[8]; /*!< Description collection[0]: Task for writing to pin specified - in CONFIG[0].PSEL. Action on pin is configured in CONFIG[0].POLARITY. */ + __O uint32_t TASKS_OUT[8]; /*!< Description collection[n]: Task for writing to pin specified + in CONFIG[n].PSEL. Action on pin is configured in CONFIG[n].POLARITY. */ __I uint32_t RESERVED0[4]; - __O uint32_t TASKS_SET[8]; /*!< Description collection[0]: Task for writing to pin specified - in CONFIG[0].PSEL. Action on pin is to set it high. */ + __O uint32_t TASKS_SET[8]; /*!< Description collection[n]: Task for writing to pin specified + in CONFIG[n].PSEL. Action on pin is to set it high. */ __I uint32_t RESERVED1[4]; - __O uint32_t TASKS_CLR[8]; /*!< Description collection[0]: Task for writing to pin specified - in CONFIG[0].PSEL. Action on pin is to set it low. */ + __O uint32_t TASKS_CLR[8]; /*!< Description collection[n]: Task for writing to pin specified + in CONFIG[n].PSEL. Action on pin is to set it low. */ __I uint32_t RESERVED2[32]; - __IO uint32_t EVENTS_IN[8]; /*!< Description collection[0]: Event generated from pin specified - in CONFIG[0].PSEL */ + __IO uint32_t EVENTS_IN[8]; /*!< Description collection[n]: Event generated from pin specified + in CONFIG[n].PSEL */ __I uint32_t RESERVED3[23]; __IO uint32_t EVENTS_PORT; /*!< Event generated from multiple input GPIO pins with SENSE mechanism enabled */ @@ -1336,7 +1351,7 @@ typedef struct { /*!< GPIOTE Structure __IO uint32_t INTENSET; /*!< Enable interrupt */ __IO uint32_t INTENCLR; /*!< Disable interrupt */ __I uint32_t RESERVED5[129]; - __IO uint32_t CONFIG[8]; /*!< Description collection[0]: Configuration for OUT[n], SET[n] + __IO uint32_t CONFIG[8]; /*!< Description collection[n]: Configuration for OUT[n], SET[n] and CLR[n] tasks and IN[n] event */ } NRF_GPIOTE_Type; @@ -1347,23 +1362,23 @@ typedef struct { /*!< GPIOTE Structure /** - * @brief Analog to Digital Converter (SAADC) + * @brief Successive approximation register (SAR) analog-to-digital converter (SAADC) */ typedef struct { /*!< SAADC Structure */ - __O uint32_t TASKS_START; /*!< Start the ADC and prepare the result buffer in RAM */ - __O uint32_t TASKS_SAMPLE; /*!< Take one ADC sample, if scan is enabled all channels are sampled */ - __O uint32_t TASKS_STOP; /*!< Stop the ADC and terminate any on-going conversion */ + __O uint32_t TASKS_START; /*!< Starts the SAADC and prepares the result buffer in RAM */ + __O uint32_t TASKS_SAMPLE; /*!< Takes one SAADC sample */ + __O uint32_t TASKS_STOP; /*!< Stops the SAADC and terminates all on-going conversions */ __O uint32_t TASKS_CALIBRATEOFFSET; /*!< Starts offset auto-calibration */ __I uint32_t RESERVED0[60]; - __IO uint32_t EVENTS_STARTED; /*!< The ADC has started */ - __IO uint32_t EVENTS_END; /*!< The ADC has filled up the Result buffer */ - __IO uint32_t EVENTS_DONE; /*!< A conversion task has been completed. Depending on the mode, + __IO uint32_t EVENTS_STARTED; /*!< The SAADC has started */ + __IO uint32_t EVENTS_END; /*!< The SAADC has filled up the result buffer */ + __IO uint32_t EVENTS_DONE; /*!< A conversion task has been completed. Depending on the configuration, multiple conversions might be needed for a result to be transferred to RAM. */ - __IO uint32_t EVENTS_RESULTDONE; /*!< A result is ready to get transferred to RAM. */ + __IO uint32_t EVENTS_RESULTDONE; /*!< Result ready for transfer to RAM */ __IO uint32_t EVENTS_CALIBRATEDONE; /*!< Calibration is complete */ - __IO uint32_t EVENTS_STOPPED; /*!< The ADC has stopped */ + __IO uint32_t EVENTS_STOPPED; /*!< The SAADC has stopped */ SAADC_EVENTS_CH_Type EVENTS_CH[8]; /*!< Unspecified */ __I uint32_t RESERVED1[106]; __IO uint32_t INTEN; /*!< Enable or disable interrupt */ @@ -1372,14 +1387,14 @@ typedef struct { /*!< SAADC Structure __I uint32_t RESERVED2[61]; __I uint32_t STATUS; /*!< Status */ __I uint32_t RESERVED3[63]; - __IO uint32_t ENABLE; /*!< Enable or disable ADC */ + __IO uint32_t ENABLE; /*!< Enable or disable SAADC */ __I uint32_t RESERVED4[3]; SAADC_CH_Type CH[8]; /*!< Unspecified */ __I uint32_t RESERVED5[24]; __IO uint32_t RESOLUTION; /*!< Resolution configuration */ - __IO uint32_t OVERSAMPLE; /*!< Oversampling configuration. OVERSAMPLE should not be combined - with SCAN. The RESOLUTION is applied before averaging, thus - for high OVERSAMPLE a higher RESOLUTION should be used. */ + __IO uint32_t OVERSAMPLE; /*!< Oversampling configuration. The RESOLUTION is applied before + averaging, thus for high OVERSAMPLE a higher RESOLUTION should + be used. */ __IO uint32_t SAMPLERATE; /*!< Controls normal or continuous sample rate */ __I uint32_t RESERVED6[12]; SAADC_RESULT_Type RESULT; /*!< RESULT EasyDMA channel */ @@ -1402,9 +1417,9 @@ typedef struct { /*!< TIMER Structure __O uint32_t TASKS_CLEAR; /*!< Clear time */ __O uint32_t TASKS_SHUTDOWN; /*!< Deprecated register - Shut down timer */ __I uint32_t RESERVED0[11]; - __O uint32_t TASKS_CAPTURE[6]; /*!< Description collection[0]: Capture Timer value to CC[0] register */ + __O uint32_t TASKS_CAPTURE[6]; /*!< Description collection[n]: Capture Timer value to CC[n] register */ __I uint32_t RESERVED1[58]; - __IO uint32_t EVENTS_COMPARE[6]; /*!< Description collection[0]: Compare event on CC[0] match */ + __IO uint32_t EVENTS_COMPARE[6]; /*!< Description collection[n]: Compare event on CC[n] match */ __I uint32_t RESERVED2[42]; __IO uint32_t SHORTS; /*!< Shortcut register */ __I uint32_t RESERVED3[64]; @@ -1416,7 +1431,7 @@ typedef struct { /*!< TIMER Structure __I uint32_t RESERVED5; __IO uint32_t PRESCALER; /*!< Timer prescaler register */ __I uint32_t RESERVED6[11]; - __IO uint32_t CC[6]; /*!< Description collection[0]: Capture/Compare register 0 */ + __IO uint32_t CC[6]; /*!< Description collection[n]: Capture/Compare register n */ } NRF_TIMER_Type; @@ -1438,7 +1453,7 @@ typedef struct { /*!< RTC Structure __IO uint32_t EVENTS_TICK; /*!< Event on COUNTER increment */ __IO uint32_t EVENTS_OVRFLW; /*!< Event on COUNTER overflow */ __I uint32_t RESERVED1[14]; - __IO uint32_t EVENTS_COMPARE[4]; /*!< Description collection[0]: Compare event on CC[0] match */ + __IO uint32_t EVENTS_COMPARE[4]; /*!< Description collection[n]: Compare event on CC[n] match */ __I uint32_t RESERVED2[109]; __IO uint32_t INTENSET; /*!< Enable interrupt */ __IO uint32_t INTENCLR; /*!< Disable interrupt */ @@ -1451,7 +1466,7 @@ typedef struct { /*!< RTC Structure __IO uint32_t PRESCALER; /*!< 12 bit prescaler for COUNTER frequency (32768/(PRESCALER+1)).Must be written when RTC is stopped */ __I uint32_t RESERVED5[13]; - __IO uint32_t CC[4]; /*!< Description collection[0]: Compare register 0 */ + __IO uint32_t CC[4]; /*!< Description collection[n]: Compare register n */ } NRF_RTC_Type; @@ -1547,6 +1562,39 @@ typedef struct { /*!< ECB Structure } NRF_ECB_Type; +/* ================================================================================ */ +/* ================ AAR ================ */ +/* ================================================================================ */ + + +/** + * @brief Accelerated Address Resolver (AAR) + */ + +typedef struct { /*!< AAR Structure */ + __O uint32_t TASKS_START; /*!< Start resolving addresses based on IRKs specified in the IRK + data structure */ + __I uint32_t RESERVED0; + __O uint32_t TASKS_STOP; /*!< Stop resolving addresses */ + __I uint32_t RESERVED1[61]; + __IO uint32_t EVENTS_END; /*!< Address resolution procedure complete */ + __IO uint32_t EVENTS_RESOLVED; /*!< Address resolved */ + __IO uint32_t EVENTS_NOTRESOLVED; /*!< Address not resolved */ + __I uint32_t RESERVED2[126]; + __IO uint32_t INTENSET; /*!< Enable interrupt */ + __IO uint32_t INTENCLR; /*!< Disable interrupt */ + __I uint32_t RESERVED3[61]; + __I uint32_t STATUS; /*!< Resolution status */ + __I uint32_t RESERVED4[63]; + __IO uint32_t ENABLE; /*!< Enable AAR */ + __IO uint32_t NIRK; /*!< Number of IRKs */ + __IO uint32_t IRKPTR; /*!< Pointer to IRK data structure */ + __I uint32_t RESERVED5; + __IO uint32_t ADDRPTR; /*!< Pointer to the resolvable address */ + __IO uint32_t SCRATCHPTR; /*!< Pointer to data area used for temporary storage */ +} NRF_AAR_Type; + + /* ================================================================================ */ /* ================ CCM ================ */ /* ================================================================================ */ @@ -1587,39 +1635,6 @@ typedef struct { /*!< CCM Structure } NRF_CCM_Type; -/* ================================================================================ */ -/* ================ AAR ================ */ -/* ================================================================================ */ - - -/** - * @brief Accelerated Address Resolver (AAR) - */ - -typedef struct { /*!< AAR Structure */ - __O uint32_t TASKS_START; /*!< Start resolving addresses based on IRKs specified in the IRK - data structure */ - __I uint32_t RESERVED0; - __O uint32_t TASKS_STOP; /*!< Stop resolving addresses */ - __I uint32_t RESERVED1[61]; - __IO uint32_t EVENTS_END; /*!< Address resolution procedure complete */ - __IO uint32_t EVENTS_RESOLVED; /*!< Address resolved */ - __IO uint32_t EVENTS_NOTRESOLVED; /*!< Address not resolved */ - __I uint32_t RESERVED2[126]; - __IO uint32_t INTENSET; /*!< Enable interrupt */ - __IO uint32_t INTENCLR; /*!< Disable interrupt */ - __I uint32_t RESERVED3[61]; - __I uint32_t STATUS; /*!< Resolution status */ - __I uint32_t RESERVED4[63]; - __IO uint32_t ENABLE; /*!< Enable AAR */ - __IO uint32_t NIRK; /*!< Number of IRKs */ - __IO uint32_t IRKPTR; /*!< Pointer to IRK data structure */ - __I uint32_t RESERVED5; - __IO uint32_t ADDRPTR; /*!< Pointer to the resolvable address */ - __IO uint32_t SCRATCHPTR; /*!< Pointer to data area used for temporary storage */ -} NRF_AAR_Type; - - /* ================================================================================ */ /* ================ WDT ================ */ /* ================================================================================ */ @@ -1644,7 +1659,7 @@ typedef struct { /*!< WDT Structure __IO uint32_t RREN; /*!< Enable register for reload request registers */ __IO uint32_t CONFIG; /*!< Configuration register */ __I uint32_t RESERVED4[60]; - __O uint32_t RR[8]; /*!< Description collection[0]: Reload request 0 */ + __O uint32_t RR[8]; /*!< Description collection[n]: Reload request n */ } NRF_WDT_Type; @@ -1770,6 +1785,28 @@ typedef struct { /*!< LPCOMP Structure } NRF_LPCOMP_Type; +/* ================================================================================ */ +/* ================ EGU ================ */ +/* ================================================================================ */ + + +/** + * @brief Event Generator Unit 0 (EGU) + */ + +typedef struct { /*!< EGU Structure */ + __O uint32_t TASKS_TRIGGER[16]; /*!< Description collection[n]: Trigger n for triggering the corresponding + TRIGGERED[n] event */ + __I uint32_t RESERVED0[48]; + __IO uint32_t EVENTS_TRIGGERED[16]; /*!< Description collection[n]: Event number n generated by triggering + the corresponding TRIGGER[n] task */ + __I uint32_t RESERVED1[112]; + __IO uint32_t INTEN; /*!< Enable or disable interrupt */ + __IO uint32_t INTENSET; /*!< Enable interrupt */ + __IO uint32_t INTENCLR; /*!< Disable interrupt */ +} NRF_EGU_Type; + + /* ================================================================================ */ /* ================ SWI ================ */ /* ================================================================================ */ @@ -1784,55 +1821,33 @@ typedef struct { /*!< SWI Structure } NRF_SWI_Type; -/* ================================================================================ */ -/* ================ EGU ================ */ -/* ================================================================================ */ - - -/** - * @brief Event Generator Unit 0 (EGU) - */ - -typedef struct { /*!< EGU Structure */ - __O uint32_t TASKS_TRIGGER[16]; /*!< Description collection[0]: Trigger 0 for triggering the corresponding - TRIGGERED[0] event */ - __I uint32_t RESERVED0[48]; - __IO uint32_t EVENTS_TRIGGERED[16]; /*!< Description collection[0]: Event number 0 generated by triggering - the corresponding TRIGGER[0] task */ - __I uint32_t RESERVED1[112]; - __IO uint32_t INTEN; /*!< Enable or disable interrupt */ - __IO uint32_t INTENSET; /*!< Enable interrupt */ - __IO uint32_t INTENCLR; /*!< Disable interrupt */ -} NRF_EGU_Type; - - /* ================================================================================ */ /* ================ PWM ================ */ /* ================================================================================ */ /** - * @brief Pulse Width Modulation Unit 0 (PWM) + * @brief Pulse width modulation unit 0 (PWM) */ typedef struct { /*!< PWM Structure */ __I uint32_t RESERVED0; __O uint32_t TASKS_STOP; /*!< Stops PWM pulse generation on all channels at the end of current PWM period, and stops sequence playback */ - __O uint32_t TASKS_SEQSTART[2]; /*!< Description collection[0]: Loads the first PWM value on all - enabled channels from sequence 0, and starts playing that sequence - at the rate defined in SEQ[0]REFRESH and/or DECODER.MODE. Causes - PWM generation to start it was not running. */ + __O uint32_t TASKS_SEQSTART[2]; /*!< Description collection[n]: Loads the first PWM value on all + enabled channels from sequence n, and starts playing that sequence + at the rate defined in SEQ[n]REFRESH and/or DECODER.MODE. Causes + PWM generation to start if not running. */ __O uint32_t TASKS_NEXTSTEP; /*!< Steps by one value in the current sequence on all enabled channels if DECODER.MODE=NextStep. Does not cause PWM generation to start - it was not running. */ + if not running. */ __I uint32_t RESERVED1[60]; __IO uint32_t EVENTS_STOPPED; /*!< Response to STOP task, emitted when PWM pulses are no longer generated */ - __IO uint32_t EVENTS_SEQSTARTED[2]; /*!< Description collection[0]: First PWM period started on sequence - 0 */ - __IO uint32_t EVENTS_SEQEND[2]; /*!< Description collection[0]: Emitted at end of every sequence - 0, when last value from RAM has been applied to wave counter */ + __IO uint32_t EVENTS_SEQSTARTED[2]; /*!< Description collection[n]: First PWM period started on sequence + n */ + __IO uint32_t EVENTS_SEQEND[2]; /*!< Description collection[n]: Emitted at end of every sequence + n, when last value from RAM has been applied to wave counter */ __IO uint32_t EVENTS_PWMPERIODEND; /*!< Emitted at the end of each PWM period */ __IO uint32_t EVENTS_LOOPSDONE; /*!< Concatenated sequences have been played the amount of times defined in LOOP.CNT */ @@ -1848,7 +1863,7 @@ typedef struct { /*!< PWM Structure __IO uint32_t COUNTERTOP; /*!< Value up to which the pulse generator counter counts */ __IO uint32_t PRESCALER; /*!< Configuration for PWM_CLK */ __IO uint32_t DECODER; /*!< Configuration of the decoder */ - __IO uint32_t LOOP; /*!< Amount of playback of a loop */ + __IO uint32_t LOOP; /*!< Number of playbacks of a loop */ __I uint32_t RESERVED5[2]; PWM_SEQ_Type SEQ[2]; /*!< Unspecified */ PWM_PSEL_Type PSEL; /*!< Unspecified */ @@ -1893,6 +1908,21 @@ typedef struct { /*!< PDM Structure } NRF_PDM_Type; +/* ================================================================================ */ +/* ================ ACL ================ */ +/* ================================================================================ */ + + +/** + * @brief Access control lists (ACL) + */ + +typedef struct { /*!< ACL Structure */ + __I uint32_t RESERVED0[512]; + ACL_ACL_Type ACL[8]; /*!< Unspecified */ +} NRF_ACL_Type; + + /* ================================================================================ */ /* ================ NVMC ================ */ /* ================================================================================ */ @@ -1911,15 +1941,17 @@ typedef struct { /*!< NVMC Structure __IO uint32_t CONFIG; /*!< Configuration register */ union { - __IO uint32_t ERASEPAGE; /*!< Register for erasing a page in code area */ __IO uint32_t ERASEPCR1; /*!< Deprecated register - Register for erasing a page in code area. Equivalent to ERASEPAGE. */ + __IO uint32_t ERASEPAGE; /*!< Register for erasing a page in code area */ }; __IO uint32_t ERASEALL; /*!< Register for erasing all non-volatile user memory */ __IO uint32_t ERASEPCR0; /*!< Deprecated register - Register for erasing a page in code area. Equivalent to ERASEPAGE. */ __IO uint32_t ERASEUICR; /*!< Register for erasing user information configuration registers */ - __I uint32_t RESERVED3[10]; + __IO uint32_t ERASEPAGEPARTIAL; /*!< Register for partial erase of a page in code area */ + __IO uint32_t ERASEPAGEPARTIALCFG; /*!< Register for partial erase configuration */ + __I uint32_t RESERVED3[8]; __IO uint32_t ICACHECNF; /*!< I-code cache configuration register. */ __I uint32_t RESERVED4; __IO uint32_t IHIT; /*!< I-code cache hit counter. */ @@ -1927,21 +1959,6 @@ typedef struct { /*!< NVMC Structure } NRF_NVMC_Type; -/* ================================================================================ */ -/* ================ ACL ================ */ -/* ================================================================================ */ - - -/** - * @brief Access control lists (ACL) - */ - -typedef struct { /*!< ACL Structure */ - __I uint32_t RESERVED0[512]; - ACL_ACL_Type ACL[8]; /*!< Unspecified */ -} NRF_ACL_Type; - - /* ================================================================================ */ /* ================ PPI ================ */ /* ================================================================================ */ @@ -1960,7 +1977,7 @@ typedef struct { /*!< PPI Structure __I uint32_t RESERVED1; PPI_CH_Type CH[20]; /*!< PPI Channel */ __I uint32_t RESERVED2[148]; - __IO uint32_t CHG[6]; /*!< Description collection[0]: Channel group 0 */ + __IO uint32_t CHG[6]; /*!< Description collection[n]: Channel group n */ __I uint32_t RESERVED3[62]; PPI_FORK_Type FORK[32]; /*!< Fork */ } NRF_PPI_Type; @@ -2064,66 +2081,61 @@ typedef struct { /*!< FPU Structure /** - * @brief Universal Serial Bus device (USBD) + * @brief Universal serial bus device (USBD) */ typedef struct { /*!< USBD Structure */ __I uint32_t RESERVED0; - __O uint32_t TASKS_STARTEPIN[8]; /*!< Description collection[0]: Captures the EPIN[0].PTR, EPIN[0].MAXCNT - and EPIN[0].CONFIG registers values, and enables endpoint IN - 0 to respond to traffic from host */ - __O uint32_t TASKS_STARTISOIN; /*!< Captures the ISOIN.PTR, ISOIN.MAXCNT and ISOIN.CONFIG registers - values, and enables sending data on iso endpoint */ - __O uint32_t TASKS_STARTEPOUT[8]; /*!< Description collection[0]: Captures the EPOUT[0].PTR, EPOUT[0].MAXCNT - and EPOUT[0].CONFIG registers values, and enables endpoint 0 - to respond to traffic from host */ - __O uint32_t TASKS_STARTISOOUT; /*!< Captures the ISOOUT.PTR, ISOOUT.MAXCNT and ISOOUT.CONFIG registers - values, and enables receiving of data on iso endpoint */ + __O uint32_t TASKS_STARTEPIN[8]; /*!< Description collection[n]: Captures the EPIN[n].PTR and EPIN[n].MAXCNT + registers values, and enables endpoint IN n to respond to traffic + from host */ + __O uint32_t TASKS_STARTISOIN; /*!< Captures the ISOIN.PTR and ISOIN.MAXCNT registers values, and + enables sending data on ISO endpoint */ + __O uint32_t TASKS_STARTEPOUT[8]; /*!< Description collection[n]: Captures the EPOUT[n].PTR and EPOUT[n].MAXCNT + registers values, and enables endpoint n to respond to traffic + from host */ + __O uint32_t TASKS_STARTISOOUT; /*!< Captures the ISOOUT.PTR and ISOOUT.MAXCNT registers values, + and enables receiving of data on ISO endpoint */ __O uint32_t TASKS_EP0RCVOUT; /*!< Allows OUT data stage on control endpoint 0 */ __O uint32_t TASKS_EP0STATUS; /*!< Allows status stage on control endpoint 0 */ - __O uint32_t TASKS_EP0STALL; /*!< STALLs data and status stage on control endpoint 0 */ - __O uint32_t TASKS_DPDMDRIVE; /*!< Forces D+ and D-lines to the state defined in the DPDMVALUE + __O uint32_t TASKS_EP0STALL; /*!< Stalls data and status stage on control endpoint 0 */ + __O uint32_t TASKS_DPDMDRIVE; /*!< Forces D+ and D- lines into the state defined in the DPDMVALUE register */ - __O uint32_t TASKS_DPDMNODRIVE; /*!< Stops forcing D+ and D- lines to any state (USB engine takes + __O uint32_t TASKS_DPDMNODRIVE; /*!< Stops forcing D+ and D- lines into any state (USB engine takes control) */ __I uint32_t RESERVED1[40]; - __IO uint32_t EVENTS_USBRESET; /*!< Signals that a USB reset condition has been detected on the - USB lines */ - __IO uint32_t EVENTS_STARTED; /*!< Confirms that the EPIN[n].PTR, EPIN[n].MAXCNT, EPIN[n].CONFIG, - or EPOUT[n].PTR, EPOUT[n].MAXCNT and EPOUT[n].CONFIG registers - have been captured on all endpoints reported in the EPSTATUS - register */ - __IO uint32_t EVENTS_ENDEPIN[8]; /*!< Description collection[0]: The whole EPIN[0] buffer has been + __IO uint32_t EVENTS_USBRESET; /*!< Signals that a USB reset condition has been detected on USB + lines */ + __IO uint32_t EVENTS_STARTED; /*!< Confirms that the EPIN[n].PTR and EPIN[n].MAXCNT, or EPOUT[n].PTR + and EPOUT[n].MAXCNT registers have been captured on all endpoints + reported in the EPSTATUS register */ + __IO uint32_t EVENTS_ENDEPIN[8]; /*!< Description collection[n]: The whole EPIN[n] buffer has been consumed. The RAM buffer can be accessed safely by software. */ __IO uint32_t EVENTS_EP0DATADONE; /*!< An acknowledged data transfer has taken place on the control endpoint */ __IO uint32_t EVENTS_ENDISOIN; /*!< The whole ISOIN buffer has been consumed. The RAM buffer can be accessed safely by software. */ - __IO uint32_t EVENTS_ENDEPOUT[8]; /*!< Description collection[0]: The whole EPOUT[0] buffer has been + __IO uint32_t EVENTS_ENDEPOUT[8]; /*!< Description collection[n]: The whole EPOUT[n] buffer has been consumed. The RAM buffer can be accessed safely by software. */ __IO uint32_t EVENTS_ENDISOOUT; /*!< The whole ISOOUT buffer has been consumed. The RAM buffer can be accessed safely by software. */ __IO uint32_t EVENTS_SOF; /*!< Signals that a SOF (start of frame) condition has been detected - on the USB lines */ - __IO uint32_t EVENTS_USBEVENT; /*!< An event or an error not covered by specific events has occurred, - check EVENTCAUSE register to find the cause */ + on USB lines */ + __IO uint32_t EVENTS_USBEVENT; /*!< An event or an error not covered by specific events has occurred. + Check EVENTCAUSE register to find the cause. */ __IO uint32_t EVENTS_EP0SETUP; /*!< A valid SETUP token has been received (and acknowledged) on the control endpoint */ __IO uint32_t EVENTS_EPDATA; /*!< A data transfer has occurred on a data endpoint, indicated by the EPDATASTATUS register */ - __IO uint32_t EVENTS_ACCESSFAULT; /*!< Access to an unavailable USB register has been attempted (software - or EasyDMA). This event can get fired even when USBD is not - ENABLEd. */ - __I uint32_t RESERVED2[38]; + __I uint32_t RESERVED2[39]; __IO uint32_t SHORTS; /*!< Shortcut register */ __I uint32_t RESERVED3[63]; __IO uint32_t INTEN; /*!< Enable or disable interrupt */ __IO uint32_t INTENSET; /*!< Enable interrupt */ __IO uint32_t INTENCLR; /*!< Disable interrupt */ __I uint32_t RESERVED4[61]; - __IO uint32_t EVENTCAUSE; /*!< Details on event that caused the USBEVENT event */ - __I uint32_t BUSSTATE; /*!< Provides the logic state of the D+ and D- lines */ - __I uint32_t RESERVED5[6]; + __IO uint32_t EVENTCAUSE; /*!< Details on what caused the USBEVENT event */ + __I uint32_t RESERVED5[7]; USBD_HALTED_Type HALTED; /*!< Unspecified */ __I uint32_t RESERVED6; __IO uint32_t EPSTATUS; /*!< Provides information on which endpoint's EasyDMA registers have @@ -2144,17 +2156,17 @@ typedef struct { /*!< USBD Structure __I uint32_t RESERVED8[15]; __IO uint32_t ENABLE; /*!< Enable USB */ __IO uint32_t USBPULLUP; /*!< Control of the USB pull-up */ - __IO uint32_t DPDMVALUE; /*!< State at which the DPDMDRIVE task will force D+ and D-. The - DPDMNODRIVE task reverts the control of the lines to MAC IP - (no forcing). */ - __IO uint32_t DTOGGLE; /*!< Data toggle control and status. */ + __IO uint32_t DPDMVALUE; /*!< State D+ and D- lines will be forced into by the DPDMDRIVE task. + The DPDMNODRIVE task reverts the control of the lines to MAC + IP (no forcing). */ + __IO uint32_t DTOGGLE; /*!< Data toggle control and status */ __IO uint32_t EPINEN; /*!< Endpoint IN enable */ __IO uint32_t EPOUTEN; /*!< Endpoint OUT enable */ __O uint32_t EPSTALL; /*!< STALL endpoints */ __IO uint32_t ISOSPLIT; /*!< Controls the split of ISO buffers */ __I uint32_t FRAMECNTR; /*!< Returns the current value of the start of frame counter */ __I uint32_t RESERVED9[2]; - __IO uint32_t LOWPOWER; /*!< Controls USBD peripheral low-power mode during USB suspend */ + __IO uint32_t LOWPOWER; /*!< Controls USBD peripheral low power mode during USB suspend */ __IO uint32_t ISOINCONFIG; /*!< Controls the response of the ISO IN endpoint to an IN token when no data is ready to be sent */ __I uint32_t RESERVED10[51]; @@ -2236,10 +2248,41 @@ typedef struct { /*!< GPIO Structure set in the PIN_CNF[n].SENSE registers */ __IO uint32_t DETECTMODE; /*!< Select between default DETECT signal behaviour and LDETECT mode */ __I uint32_t RESERVED1[118]; - __IO uint32_t PIN_CNF[32]; /*!< Description collection[0]: Configuration of GPIO pins */ + __IO uint32_t PIN_CNF[32]; /*!< Description collection[n]: Configuration of GPIO pins */ } NRF_GPIO_Type; +/* ================================================================================ */ +/* ================ CC_HOST_RGF ================ */ +/* ================================================================================ */ + + +/** + * @brief CRYPTOCELL HOST_RGF interface (CC_HOST_RGF) + */ + +typedef struct { /*!< CC_HOST_RGF Structure */ + __I uint32_t RESERVED0[1678]; + __IO uint32_t HOST_CRYPTOKEY_SEL; /*!< AES hardware key select */ + __I uint32_t RESERVED1[4]; + __IO uint32_t HOST_IOT_KPRTL_LOCK; /*!< This write-once register is the K_PRTL lock register. When this + register is set, K_PRTL can not be used and a zeroed key will + be used instead. The value of this register is saved in the + CRYPTOCELL AO power domain. */ + __IO uint32_t HOST_IOT_KDR0; /*!< This register holds bits 31:0 of K_DR. The value of this register + is saved in the CRYPTOCELL AO power domain. Reading from this + address returns the K_DR valid status indicating if K_DR is + successfully retained. */ + __O uint32_t HOST_IOT_KDR1; /*!< This register holds bits 63:32 of K_DR. The value of this register + is saved in the CRYPTOCELL AO power domain. */ + __O uint32_t HOST_IOT_KDR2; /*!< This register holds bits 95:64 of K_DR. The value of this register + is saved in the CRYPTOCELL AO power domain. */ + __O uint32_t HOST_IOT_KDR3; /*!< This register holds bits 127:96 of K_DR. The value of this register + is saved in the CRYPTOCELL AO power domain. */ + __IO uint32_t HOST_IOT_LCS; /*!< Controls lifecycle state (LCS) for CRYPTOCELL subsystem */ +} NRF_CC_HOST_RGF_Type; + + /* ================================================================================ */ /* ================ CRYPTOCELL ================ */ /* ================================================================================ */ @@ -2251,7 +2294,7 @@ typedef struct { /*!< GPIO Structure typedef struct { /*!< CRYPTOCELL Structure */ __I uint32_t RESERVED0[320]; - __IO uint32_t ENABLE; /*!< Control power and clock for CRYPTOCELL subsystem */ + __IO uint32_t ENABLE; /*!< Enable CRYPTOCELL subsystem */ } NRF_CRYPTOCELL_Type; @@ -2279,23 +2322,23 @@ typedef struct { /*!< CRYPTOCELL Structure #define NRF_FICR_BASE 0x10000000UL #define NRF_UICR_BASE 0x10001000UL -#define NRF_POWER_BASE 0x40000000UL #define NRF_CLOCK_BASE 0x40000000UL +#define NRF_POWER_BASE 0x40000000UL #define NRF_RADIO_BASE 0x40001000UL -#define NRF_UARTE0_BASE 0x40002000UL #define NRF_UART0_BASE 0x40002000UL +#define NRF_UARTE0_BASE 0x40002000UL +#define NRF_SPI0_BASE 0x40003000UL #define NRF_SPIM0_BASE 0x40003000UL #define NRF_SPIS0_BASE 0x40003000UL +#define NRF_TWI0_BASE 0x40003000UL #define NRF_TWIM0_BASE 0x40003000UL #define NRF_TWIS0_BASE 0x40003000UL -#define NRF_SPI0_BASE 0x40003000UL -#define NRF_TWI0_BASE 0x40003000UL +#define NRF_SPI1_BASE 0x40004000UL #define NRF_SPIM1_BASE 0x40004000UL #define NRF_SPIS1_BASE 0x40004000UL +#define NRF_TWI1_BASE 0x40004000UL #define NRF_TWIM1_BASE 0x40004000UL #define NRF_TWIS1_BASE 0x40004000UL -#define NRF_SPI1_BASE 0x40004000UL -#define NRF_TWI1_BASE 0x40004000UL #define NRF_NFCT_BASE 0x40005000UL #define NRF_GPIOTE_BASE 0x40006000UL #define NRF_SAADC_BASE 0x40007000UL @@ -2306,38 +2349,38 @@ typedef struct { /*!< CRYPTOCELL Structure #define NRF_TEMP_BASE 0x4000C000UL #define NRF_RNG_BASE 0x4000D000UL #define NRF_ECB_BASE 0x4000E000UL -#define NRF_CCM_BASE 0x4000F000UL #define NRF_AAR_BASE 0x4000F000UL +#define NRF_CCM_BASE 0x4000F000UL #define NRF_WDT_BASE 0x40010000UL #define NRF_RTC1_BASE 0x40011000UL #define NRF_QDEC_BASE 0x40012000UL #define NRF_COMP_BASE 0x40013000UL #define NRF_LPCOMP_BASE 0x40013000UL -#define NRF_SWI0_BASE 0x40014000UL #define NRF_EGU0_BASE 0x40014000UL -#define NRF_SWI1_BASE 0x40015000UL +#define NRF_SWI0_BASE 0x40014000UL #define NRF_EGU1_BASE 0x40015000UL -#define NRF_SWI2_BASE 0x40016000UL +#define NRF_SWI1_BASE 0x40015000UL #define NRF_EGU2_BASE 0x40016000UL -#define NRF_SWI3_BASE 0x40017000UL +#define NRF_SWI2_BASE 0x40016000UL #define NRF_EGU3_BASE 0x40017000UL -#define NRF_SWI4_BASE 0x40018000UL +#define NRF_SWI3_BASE 0x40017000UL #define NRF_EGU4_BASE 0x40018000UL -#define NRF_SWI5_BASE 0x40019000UL +#define NRF_SWI4_BASE 0x40018000UL #define NRF_EGU5_BASE 0x40019000UL +#define NRF_SWI5_BASE 0x40019000UL #define NRF_TIMER3_BASE 0x4001A000UL #define NRF_TIMER4_BASE 0x4001B000UL #define NRF_PWM0_BASE 0x4001C000UL #define NRF_PDM_BASE 0x4001D000UL -#define NRF_NVMC_BASE 0x4001E000UL #define NRF_ACL_BASE 0x4001E000UL +#define NRF_NVMC_BASE 0x4001E000UL #define NRF_PPI_BASE 0x4001F000UL #define NRF_MWU_BASE 0x40020000UL #define NRF_PWM1_BASE 0x40021000UL #define NRF_PWM2_BASE 0x40022000UL +#define NRF_SPI2_BASE 0x40023000UL #define NRF_SPIM2_BASE 0x40023000UL #define NRF_SPIS2_BASE 0x40023000UL -#define NRF_SPI2_BASE 0x40023000UL #define NRF_RTC2_BASE 0x40024000UL #define NRF_I2S_BASE 0x40025000UL #define NRF_FPU_BASE 0x40026000UL @@ -2348,6 +2391,7 @@ typedef struct { /*!< CRYPTOCELL Structure #define NRF_SPIM3_BASE 0x4002F000UL #define NRF_P0_BASE 0x50000000UL #define NRF_P1_BASE 0x50000300UL +#define NRF_CC_HOST_RGF_BASE 0x5002A000UL #define NRF_CRYPTOCELL_BASE 0x5002A000UL @@ -2357,23 +2401,23 @@ typedef struct { /*!< CRYPTOCELL Structure #define NRF_FICR ((NRF_FICR_Type *) NRF_FICR_BASE) #define NRF_UICR ((NRF_UICR_Type *) NRF_UICR_BASE) -#define NRF_POWER ((NRF_POWER_Type *) NRF_POWER_BASE) #define NRF_CLOCK ((NRF_CLOCK_Type *) NRF_CLOCK_BASE) +#define NRF_POWER ((NRF_POWER_Type *) NRF_POWER_BASE) #define NRF_RADIO ((NRF_RADIO_Type *) NRF_RADIO_BASE) -#define NRF_UARTE0 ((NRF_UARTE_Type *) NRF_UARTE0_BASE) #define NRF_UART0 ((NRF_UART_Type *) NRF_UART0_BASE) +#define NRF_UARTE0 ((NRF_UARTE_Type *) NRF_UARTE0_BASE) +#define NRF_SPI0 ((NRF_SPI_Type *) NRF_SPI0_BASE) #define NRF_SPIM0 ((NRF_SPIM_Type *) NRF_SPIM0_BASE) #define NRF_SPIS0 ((NRF_SPIS_Type *) NRF_SPIS0_BASE) +#define NRF_TWI0 ((NRF_TWI_Type *) NRF_TWI0_BASE) #define NRF_TWIM0 ((NRF_TWIM_Type *) NRF_TWIM0_BASE) #define NRF_TWIS0 ((NRF_TWIS_Type *) NRF_TWIS0_BASE) -#define NRF_SPI0 ((NRF_SPI_Type *) NRF_SPI0_BASE) -#define NRF_TWI0 ((NRF_TWI_Type *) NRF_TWI0_BASE) +#define NRF_SPI1 ((NRF_SPI_Type *) NRF_SPI1_BASE) #define NRF_SPIM1 ((NRF_SPIM_Type *) NRF_SPIM1_BASE) #define NRF_SPIS1 ((NRF_SPIS_Type *) NRF_SPIS1_BASE) +#define NRF_TWI1 ((NRF_TWI_Type *) NRF_TWI1_BASE) #define NRF_TWIM1 ((NRF_TWIM_Type *) NRF_TWIM1_BASE) #define NRF_TWIS1 ((NRF_TWIS_Type *) NRF_TWIS1_BASE) -#define NRF_SPI1 ((NRF_SPI_Type *) NRF_SPI1_BASE) -#define NRF_TWI1 ((NRF_TWI_Type *) NRF_TWI1_BASE) #define NRF_NFCT ((NRF_NFCT_Type *) NRF_NFCT_BASE) #define NRF_GPIOTE ((NRF_GPIOTE_Type *) NRF_GPIOTE_BASE) #define NRF_SAADC ((NRF_SAADC_Type *) NRF_SAADC_BASE) @@ -2384,38 +2428,38 @@ typedef struct { /*!< CRYPTOCELL Structure #define NRF_TEMP ((NRF_TEMP_Type *) NRF_TEMP_BASE) #define NRF_RNG ((NRF_RNG_Type *) NRF_RNG_BASE) #define NRF_ECB ((NRF_ECB_Type *) NRF_ECB_BASE) -#define NRF_CCM ((NRF_CCM_Type *) NRF_CCM_BASE) #define NRF_AAR ((NRF_AAR_Type *) NRF_AAR_BASE) +#define NRF_CCM ((NRF_CCM_Type *) NRF_CCM_BASE) #define NRF_WDT ((NRF_WDT_Type *) NRF_WDT_BASE) #define NRF_RTC1 ((NRF_RTC_Type *) NRF_RTC1_BASE) #define NRF_QDEC ((NRF_QDEC_Type *) NRF_QDEC_BASE) #define NRF_COMP ((NRF_COMP_Type *) NRF_COMP_BASE) #define NRF_LPCOMP ((NRF_LPCOMP_Type *) NRF_LPCOMP_BASE) -#define NRF_SWI0 ((NRF_SWI_Type *) NRF_SWI0_BASE) #define NRF_EGU0 ((NRF_EGU_Type *) NRF_EGU0_BASE) -#define NRF_SWI1 ((NRF_SWI_Type *) NRF_SWI1_BASE) +#define NRF_SWI0 ((NRF_SWI_Type *) NRF_SWI0_BASE) #define NRF_EGU1 ((NRF_EGU_Type *) NRF_EGU1_BASE) -#define NRF_SWI2 ((NRF_SWI_Type *) NRF_SWI2_BASE) +#define NRF_SWI1 ((NRF_SWI_Type *) NRF_SWI1_BASE) #define NRF_EGU2 ((NRF_EGU_Type *) NRF_EGU2_BASE) -#define NRF_SWI3 ((NRF_SWI_Type *) NRF_SWI3_BASE) +#define NRF_SWI2 ((NRF_SWI_Type *) NRF_SWI2_BASE) #define NRF_EGU3 ((NRF_EGU_Type *) NRF_EGU3_BASE) -#define NRF_SWI4 ((NRF_SWI_Type *) NRF_SWI4_BASE) +#define NRF_SWI3 ((NRF_SWI_Type *) NRF_SWI3_BASE) #define NRF_EGU4 ((NRF_EGU_Type *) NRF_EGU4_BASE) -#define NRF_SWI5 ((NRF_SWI_Type *) NRF_SWI5_BASE) +#define NRF_SWI4 ((NRF_SWI_Type *) NRF_SWI4_BASE) #define NRF_EGU5 ((NRF_EGU_Type *) NRF_EGU5_BASE) +#define NRF_SWI5 ((NRF_SWI_Type *) NRF_SWI5_BASE) #define NRF_TIMER3 ((NRF_TIMER_Type *) NRF_TIMER3_BASE) #define NRF_TIMER4 ((NRF_TIMER_Type *) NRF_TIMER4_BASE) #define NRF_PWM0 ((NRF_PWM_Type *) NRF_PWM0_BASE) #define NRF_PDM ((NRF_PDM_Type *) NRF_PDM_BASE) -#define NRF_NVMC ((NRF_NVMC_Type *) NRF_NVMC_BASE) #define NRF_ACL ((NRF_ACL_Type *) NRF_ACL_BASE) +#define NRF_NVMC ((NRF_NVMC_Type *) NRF_NVMC_BASE) #define NRF_PPI ((NRF_PPI_Type *) NRF_PPI_BASE) #define NRF_MWU ((NRF_MWU_Type *) NRF_MWU_BASE) #define NRF_PWM1 ((NRF_PWM_Type *) NRF_PWM1_BASE) #define NRF_PWM2 ((NRF_PWM_Type *) NRF_PWM2_BASE) +#define NRF_SPI2 ((NRF_SPI_Type *) NRF_SPI2_BASE) #define NRF_SPIM2 ((NRF_SPIM_Type *) NRF_SPIM2_BASE) #define NRF_SPIS2 ((NRF_SPIS_Type *) NRF_SPIS2_BASE) -#define NRF_SPI2 ((NRF_SPI_Type *) NRF_SPI2_BASE) #define NRF_RTC2 ((NRF_RTC_Type *) NRF_RTC2_BASE) #define NRF_I2S ((NRF_I2S_Type *) NRF_I2S_BASE) #define NRF_FPU ((NRF_FPU_Type *) NRF_FPU_BASE) @@ -2426,6 +2470,7 @@ typedef struct { /*!< CRYPTOCELL Structure #define NRF_SPIM3 ((NRF_SPIM_Type *) NRF_SPIM3_BASE) #define NRF_P0 ((NRF_GPIO_Type *) NRF_P0_BASE) #define NRF_P1 ((NRF_GPIO_Type *) NRF_P1_BASE) +#define NRF_CC_HOST_RGF ((NRF_CC_HOST_RGF_Type *) NRF_CC_HOST_RGF_BASE) #define NRF_CRYPTOCELL ((NRF_CRYPTOCELL_Type *) NRF_CRYPTOCELL_BASE) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52840_bitfields.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52840_bitfields.h similarity index 83% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52840_bitfields.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52840_bitfields.h index c259ad094c..64cd8b96c1 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52840_bitfields.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52840_bitfields.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. @@ -47,24 +47,59 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: AAR */ /* Description: Accelerated Address Resolver */ +/* Register: AAR_TASKS_START */ +/* Description: Start resolving addresses based on IRKs specified in the IRK data structure */ + +/* Bit 0 : */ +#define AAR_TASKS_START_TASKS_START_Pos (0UL) /*!< Position of TASKS_START field. */ +#define AAR_TASKS_START_TASKS_START_Msk (0x1UL << AAR_TASKS_START_TASKS_START_Pos) /*!< Bit mask of TASKS_START field. */ + +/* Register: AAR_TASKS_STOP */ +/* Description: Stop resolving addresses */ + +/* Bit 0 : */ +#define AAR_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define AAR_TASKS_STOP_TASKS_STOP_Msk (0x1UL << AAR_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: AAR_EVENTS_END */ +/* Description: Address resolution procedure complete */ + +/* Bit 0 : */ +#define AAR_EVENTS_END_EVENTS_END_Pos (0UL) /*!< Position of EVENTS_END field. */ +#define AAR_EVENTS_END_EVENTS_END_Msk (0x1UL << AAR_EVENTS_END_EVENTS_END_Pos) /*!< Bit mask of EVENTS_END field. */ + +/* Register: AAR_EVENTS_RESOLVED */ +/* Description: Address resolved */ + +/* Bit 0 : */ +#define AAR_EVENTS_RESOLVED_EVENTS_RESOLVED_Pos (0UL) /*!< Position of EVENTS_RESOLVED field. */ +#define AAR_EVENTS_RESOLVED_EVENTS_RESOLVED_Msk (0x1UL << AAR_EVENTS_RESOLVED_EVENTS_RESOLVED_Pos) /*!< Bit mask of EVENTS_RESOLVED field. */ + +/* Register: AAR_EVENTS_NOTRESOLVED */ +/* Description: Address not resolved */ + +/* Bit 0 : */ +#define AAR_EVENTS_NOTRESOLVED_EVENTS_NOTRESOLVED_Pos (0UL) /*!< Position of EVENTS_NOTRESOLVED field. */ +#define AAR_EVENTS_NOTRESOLVED_EVENTS_NOTRESOLVED_Msk (0x1UL << AAR_EVENTS_NOTRESOLVED_EVENTS_NOTRESOLVED_Pos) /*!< Bit mask of EVENTS_NOTRESOLVED field. */ + /* Register: AAR_INTENSET */ /* Description: Enable interrupt */ -/* Bit 2 : Write '1' to Enable interrupt for NOTRESOLVED event */ +/* Bit 2 : Write '1' to enable interrupt for NOTRESOLVED event */ #define AAR_INTENSET_NOTRESOLVED_Pos (2UL) /*!< Position of NOTRESOLVED field. */ #define AAR_INTENSET_NOTRESOLVED_Msk (0x1UL << AAR_INTENSET_NOTRESOLVED_Pos) /*!< Bit mask of NOTRESOLVED field. */ #define AAR_INTENSET_NOTRESOLVED_Disabled (0UL) /*!< Read: Disabled */ #define AAR_INTENSET_NOTRESOLVED_Enabled (1UL) /*!< Read: Enabled */ #define AAR_INTENSET_NOTRESOLVED_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for RESOLVED event */ +/* Bit 1 : Write '1' to enable interrupt for RESOLVED event */ #define AAR_INTENSET_RESOLVED_Pos (1UL) /*!< Position of RESOLVED field. */ #define AAR_INTENSET_RESOLVED_Msk (0x1UL << AAR_INTENSET_RESOLVED_Pos) /*!< Bit mask of RESOLVED field. */ #define AAR_INTENSET_RESOLVED_Disabled (0UL) /*!< Read: Disabled */ #define AAR_INTENSET_RESOLVED_Enabled (1UL) /*!< Read: Enabled */ #define AAR_INTENSET_RESOLVED_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for END event */ +/* Bit 0 : Write '1' to enable interrupt for END event */ #define AAR_INTENSET_END_Pos (0UL) /*!< Position of END field. */ #define AAR_INTENSET_END_Msk (0x1UL << AAR_INTENSET_END_Pos) /*!< Bit mask of END field. */ #define AAR_INTENSET_END_Disabled (0UL) /*!< Read: Disabled */ @@ -74,21 +109,21 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: AAR_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 2 : Write '1' to Disable interrupt for NOTRESOLVED event */ +/* Bit 2 : Write '1' to disable interrupt for NOTRESOLVED event */ #define AAR_INTENCLR_NOTRESOLVED_Pos (2UL) /*!< Position of NOTRESOLVED field. */ #define AAR_INTENCLR_NOTRESOLVED_Msk (0x1UL << AAR_INTENCLR_NOTRESOLVED_Pos) /*!< Bit mask of NOTRESOLVED field. */ #define AAR_INTENCLR_NOTRESOLVED_Disabled (0UL) /*!< Read: Disabled */ #define AAR_INTENCLR_NOTRESOLVED_Enabled (1UL) /*!< Read: Enabled */ #define AAR_INTENCLR_NOTRESOLVED_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for RESOLVED event */ +/* Bit 1 : Write '1' to disable interrupt for RESOLVED event */ #define AAR_INTENCLR_RESOLVED_Pos (1UL) /*!< Position of RESOLVED field. */ #define AAR_INTENCLR_RESOLVED_Msk (0x1UL << AAR_INTENCLR_RESOLVED_Pos) /*!< Bit mask of RESOLVED field. */ #define AAR_INTENCLR_RESOLVED_Disabled (0UL) /*!< Read: Disabled */ #define AAR_INTENCLR_RESOLVED_Enabled (1UL) /*!< Read: Enabled */ #define AAR_INTENCLR_RESOLVED_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for END event */ +/* Bit 0 : Write '1' to disable interrupt for END event */ #define AAR_INTENCLR_END_Pos (0UL) /*!< Position of END field. */ #define AAR_INTENCLR_END_Msk (0x1UL << AAR_INTENCLR_END_Pos) /*!< Bit mask of END field. */ #define AAR_INTENCLR_END_Disabled (0UL) /*!< Read: Disabled */ @@ -144,38 +179,87 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Description: Access control lists */ /* Register: ACL_ACL_ADDR */ -/* Description: Description cluster[0]: Configure the word-aligned start address of region 0 to protect */ +/* Description: Description cluster[n]: Configure the word-aligned start address of region n to protect */ -/* Bits 31..0 : Valid word-aligned start address of region 0 to protect. Address must point to a flash page boundary. */ +/* Bits 31..0 : Valid word-aligned start address of region n to protect. Address must point to a flash page boundary. */ #define ACL_ACL_ADDR_ADDR_Pos (0UL) /*!< Position of ADDR field. */ #define ACL_ACL_ADDR_ADDR_Msk (0xFFFFFFFFUL << ACL_ACL_ADDR_ADDR_Pos) /*!< Bit mask of ADDR field. */ /* Register: ACL_ACL_SIZE */ -/* Description: Description cluster[0]: Size of region to protect counting from address ACL[0].ADDR. Write '0' as no effect. */ +/* Description: Description cluster[n]: Size of region to protect counting from address ACL[n].ADDR. Write '0' as no effect. */ -/* Bits 31..0 : Size of flash region 0 in bytes. Must be a multiple of the flash page size. */ +/* Bits 31..0 : Size of flash region n in bytes. Must be a multiple of the flash page size, and the maximum region size is limited to 512kB. */ #define ACL_ACL_SIZE_SIZE_Pos (0UL) /*!< Position of SIZE field. */ #define ACL_ACL_SIZE_SIZE_Msk (0xFFFFFFFFUL << ACL_ACL_SIZE_SIZE_Pos) /*!< Bit mask of SIZE field. */ /* Register: ACL_ACL_PERM */ -/* Description: Description cluster[0]: Access permissions for region 0 as defined by start address ACL[0].ADDR and size ACL[0].SIZE */ +/* Description: Description cluster[n]: Access permissions for region n as defined by start address ACL[n].ADDR and size ACL[n].SIZE */ -/* Bit 2 : Configure read permissions for region 0. Write '0' has no effect. */ +/* Bit 2 : Configure read permissions for region n. Write '0' has no effect. */ #define ACL_ACL_PERM_READ_Pos (2UL) /*!< Position of READ field. */ #define ACL_ACL_PERM_READ_Msk (0x1UL << ACL_ACL_PERM_READ_Pos) /*!< Bit mask of READ field. */ -#define ACL_ACL_PERM_READ_Enable (0UL) /*!< Allow read instructions to region 0 */ -#define ACL_ACL_PERM_READ_Disable (1UL) /*!< Block read instructions to region 0 */ +#define ACL_ACL_PERM_READ_Enable (0UL) /*!< Allow read instructions to region n */ +#define ACL_ACL_PERM_READ_Disable (1UL) /*!< Block read instructions to region n */ -/* Bit 1 : Configure write and erase permissions for region 0. Write '0' has no effect. */ +/* Bit 1 : Configure write and erase permissions for region n. Write '0' has no effect. */ #define ACL_ACL_PERM_WRITE_Pos (1UL) /*!< Position of WRITE field. */ #define ACL_ACL_PERM_WRITE_Msk (0x1UL << ACL_ACL_PERM_WRITE_Pos) /*!< Bit mask of WRITE field. */ -#define ACL_ACL_PERM_WRITE_Enable (0UL) /*!< Allow write and erase instructions to region 0 */ -#define ACL_ACL_PERM_WRITE_Disable (1UL) /*!< Block write and erase instructions to region 0 */ +#define ACL_ACL_PERM_WRITE_Enable (0UL) /*!< Allow write and erase instructions to region n */ +#define ACL_ACL_PERM_WRITE_Disable (1UL) /*!< Block write and erase instructions to region n */ /* Peripheral: CCM */ /* Description: AES CCM Mode Encryption */ +/* Register: CCM_TASKS_KSGEN */ +/* Description: Start generation of key-stream. This operation will stop by itself when completed. */ + +/* Bit 0 : */ +#define CCM_TASKS_KSGEN_TASKS_KSGEN_Pos (0UL) /*!< Position of TASKS_KSGEN field. */ +#define CCM_TASKS_KSGEN_TASKS_KSGEN_Msk (0x1UL << CCM_TASKS_KSGEN_TASKS_KSGEN_Pos) /*!< Bit mask of TASKS_KSGEN field. */ + +/* Register: CCM_TASKS_CRYPT */ +/* Description: Start encryption/decryption. This operation will stop by itself when completed. */ + +/* Bit 0 : */ +#define CCM_TASKS_CRYPT_TASKS_CRYPT_Pos (0UL) /*!< Position of TASKS_CRYPT field. */ +#define CCM_TASKS_CRYPT_TASKS_CRYPT_Msk (0x1UL << CCM_TASKS_CRYPT_TASKS_CRYPT_Pos) /*!< Bit mask of TASKS_CRYPT field. */ + +/* Register: CCM_TASKS_STOP */ +/* Description: Stop encryption/decryption */ + +/* Bit 0 : */ +#define CCM_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define CCM_TASKS_STOP_TASKS_STOP_Msk (0x1UL << CCM_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: CCM_TASKS_RATEOVERRIDE */ +/* Description: Override DATARATE setting in MODE register with the contents of the RATEOVERRIDE register for any ongoing encryption/decryption */ + +/* Bit 0 : */ +#define CCM_TASKS_RATEOVERRIDE_TASKS_RATEOVERRIDE_Pos (0UL) /*!< Position of TASKS_RATEOVERRIDE field. */ +#define CCM_TASKS_RATEOVERRIDE_TASKS_RATEOVERRIDE_Msk (0x1UL << CCM_TASKS_RATEOVERRIDE_TASKS_RATEOVERRIDE_Pos) /*!< Bit mask of TASKS_RATEOVERRIDE field. */ + +/* Register: CCM_EVENTS_ENDKSGEN */ +/* Description: Key-stream generation complete */ + +/* Bit 0 : */ +#define CCM_EVENTS_ENDKSGEN_EVENTS_ENDKSGEN_Pos (0UL) /*!< Position of EVENTS_ENDKSGEN field. */ +#define CCM_EVENTS_ENDKSGEN_EVENTS_ENDKSGEN_Msk (0x1UL << CCM_EVENTS_ENDKSGEN_EVENTS_ENDKSGEN_Pos) /*!< Bit mask of EVENTS_ENDKSGEN field. */ + +/* Register: CCM_EVENTS_ENDCRYPT */ +/* Description: Encrypt/decrypt complete */ + +/* Bit 0 : */ +#define CCM_EVENTS_ENDCRYPT_EVENTS_ENDCRYPT_Pos (0UL) /*!< Position of EVENTS_ENDCRYPT field. */ +#define CCM_EVENTS_ENDCRYPT_EVENTS_ENDCRYPT_Msk (0x1UL << CCM_EVENTS_ENDCRYPT_EVENTS_ENDCRYPT_Pos) /*!< Bit mask of EVENTS_ENDCRYPT field. */ + +/* Register: CCM_EVENTS_ERROR */ +/* Description: Deprecated register - CCM error event */ + +/* Bit 0 : */ +#define CCM_EVENTS_ERROR_EVENTS_ERROR_Pos (0UL) /*!< Position of EVENTS_ERROR field. */ +#define CCM_EVENTS_ERROR_EVENTS_ERROR_Msk (0x1UL << CCM_EVENTS_ERROR_EVENTS_ERROR_Pos) /*!< Bit mask of EVENTS_ERROR field. */ + /* Register: CCM_SHORTS */ /* Description: Shortcut register */ @@ -188,21 +272,21 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: CCM_INTENSET */ /* Description: Enable interrupt */ -/* Bit 2 : Write '1' to Enable interrupt for ERROR event */ +/* Bit 2 : Write '1' to enable interrupt for ERROR event */ #define CCM_INTENSET_ERROR_Pos (2UL) /*!< Position of ERROR field. */ #define CCM_INTENSET_ERROR_Msk (0x1UL << CCM_INTENSET_ERROR_Pos) /*!< Bit mask of ERROR field. */ #define CCM_INTENSET_ERROR_Disabled (0UL) /*!< Read: Disabled */ #define CCM_INTENSET_ERROR_Enabled (1UL) /*!< Read: Enabled */ #define CCM_INTENSET_ERROR_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for ENDCRYPT event */ +/* Bit 1 : Write '1' to enable interrupt for ENDCRYPT event */ #define CCM_INTENSET_ENDCRYPT_Pos (1UL) /*!< Position of ENDCRYPT field. */ #define CCM_INTENSET_ENDCRYPT_Msk (0x1UL << CCM_INTENSET_ENDCRYPT_Pos) /*!< Bit mask of ENDCRYPT field. */ #define CCM_INTENSET_ENDCRYPT_Disabled (0UL) /*!< Read: Disabled */ #define CCM_INTENSET_ENDCRYPT_Enabled (1UL) /*!< Read: Enabled */ #define CCM_INTENSET_ENDCRYPT_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for ENDKSGEN event */ +/* Bit 0 : Write '1' to enable interrupt for ENDKSGEN event */ #define CCM_INTENSET_ENDKSGEN_Pos (0UL) /*!< Position of ENDKSGEN field. */ #define CCM_INTENSET_ENDKSGEN_Msk (0x1UL << CCM_INTENSET_ENDKSGEN_Pos) /*!< Bit mask of ENDKSGEN field. */ #define CCM_INTENSET_ENDKSGEN_Disabled (0UL) /*!< Read: Disabled */ @@ -212,21 +296,21 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: CCM_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 2 : Write '1' to Disable interrupt for ERROR event */ +/* Bit 2 : Write '1' to disable interrupt for ERROR event */ #define CCM_INTENCLR_ERROR_Pos (2UL) /*!< Position of ERROR field. */ #define CCM_INTENCLR_ERROR_Msk (0x1UL << CCM_INTENCLR_ERROR_Pos) /*!< Bit mask of ERROR field. */ #define CCM_INTENCLR_ERROR_Disabled (0UL) /*!< Read: Disabled */ #define CCM_INTENCLR_ERROR_Enabled (1UL) /*!< Read: Enabled */ #define CCM_INTENCLR_ERROR_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for ENDCRYPT event */ +/* Bit 1 : Write '1' to disable interrupt for ENDCRYPT event */ #define CCM_INTENCLR_ENDCRYPT_Pos (1UL) /*!< Position of ENDCRYPT field. */ #define CCM_INTENCLR_ENDCRYPT_Msk (0x1UL << CCM_INTENCLR_ENDCRYPT_Pos) /*!< Bit mask of ENDCRYPT field. */ #define CCM_INTENCLR_ENDCRYPT_Disabled (0UL) /*!< Read: Disabled */ #define CCM_INTENCLR_ENDCRYPT_Enabled (1UL) /*!< Read: Enabled */ #define CCM_INTENCLR_ENDCRYPT_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for ENDKSGEN event */ +/* Bit 0 : Write '1' to disable interrupt for ENDKSGEN event */ #define CCM_INTENCLR_ENDKSGEN_Pos (0UL) /*!< Position of ENDKSGEN field. */ #define CCM_INTENCLR_ENDKSGEN_Msk (0x1UL << CCM_INTENCLR_ENDKSGEN_Pos) /*!< Bit mask of ENDKSGEN field. */ #define CCM_INTENCLR_ENDKSGEN_Disabled (0UL) /*!< Read: Disabled */ @@ -298,7 +382,8 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: CCM_SCRATCHPTR */ /* Description: Pointer to data area used for temporary storage */ -/* Bits 31..0 : Pointer to a scratch data area used for temporary storage during key-stream generation, MIC generation and encryption/decryption. */ +/* Bits 31..0 : Pointer to a scratch data area used for temporary storage during key-stream generation, + MIC generation and encryption/decryption. */ #define CCM_SCRATCHPTR_SCRATCHPTR_Pos (0UL) /*!< Position of SCRATCHPTR field. */ #define CCM_SCRATCHPTR_SCRATCHPTR_Msk (0xFFFFFFFFUL << CCM_SCRATCHPTR_SCRATCHPTR_Pos) /*!< Bit mask of SCRATCHPTR field. */ @@ -321,48 +406,205 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define CCM_RATEOVERRIDE_RATEOVERRIDE_500Kbps (3UL) /*!< 500 Kbps */ +/* Peripheral: CC_HOST_RGF */ +/* Description: CRYPTOCELL HOST_RGF interface */ + +/* Register: CC_HOST_RGF_HOST_CRYPTOKEY_SEL */ +/* Description: AES hardware key select */ + +/* Bits 1..0 : Select the source of the HW key that is used by the AES engine */ +#define CC_HOST_RGF_HOST_CRYPTOKEY_SEL_HOST_CRYPTOKEY_SEL_Pos (0UL) /*!< Position of HOST_CRYPTOKEY_SEL field. */ +#define CC_HOST_RGF_HOST_CRYPTOKEY_SEL_HOST_CRYPTOKEY_SEL_Msk (0x3UL << CC_HOST_RGF_HOST_CRYPTOKEY_SEL_HOST_CRYPTOKEY_SEL_Pos) /*!< Bit mask of HOST_CRYPTOKEY_SEL field. */ +#define CC_HOST_RGF_HOST_CRYPTOKEY_SEL_HOST_CRYPTOKEY_SEL_K_DR (0UL) /*!< Use device root key K_DR from CRYPTOCELL AO power domain */ +#define CC_HOST_RGF_HOST_CRYPTOKEY_SEL_HOST_CRYPTOKEY_SEL_K_PRTL (1UL) /*!< Use hard-coded RTL key K_PRTL */ +#define CC_HOST_RGF_HOST_CRYPTOKEY_SEL_HOST_CRYPTOKEY_SEL_Session (2UL) /*!< Use provided session key */ + +/* Register: CC_HOST_RGF_HOST_IOT_KPRTL_LOCK */ +/* Description: This write-once register is the K_PRTL lock register. When this register is set, K_PRTL can not be used and a zeroed key will be used instead. The value of this register is saved in the CRYPTOCELL AO power domain. */ + +/* Bit 0 : This register is the K_PRTL lock register. When this register is set, K_PRTL can not be used and a zeroed key will be used instead. The value of this register is saved in the CRYPTOCELL AO power domain. */ +#define CC_HOST_RGF_HOST_IOT_KPRTL_LOCK_HOST_IOT_KPRTL_LOCK_Pos (0UL) /*!< Position of HOST_IOT_KPRTL_LOCK field. */ +#define CC_HOST_RGF_HOST_IOT_KPRTL_LOCK_HOST_IOT_KPRTL_LOCK_Msk (0x1UL << CC_HOST_RGF_HOST_IOT_KPRTL_LOCK_HOST_IOT_KPRTL_LOCK_Pos) /*!< Bit mask of HOST_IOT_KPRTL_LOCK field. */ +#define CC_HOST_RGF_HOST_IOT_KPRTL_LOCK_HOST_IOT_KPRTL_LOCK_Disabled (0UL) /*!< K_PRTL can be selected for use from register HOST_CRYPTOKEY_SEL */ +#define CC_HOST_RGF_HOST_IOT_KPRTL_LOCK_HOST_IOT_KPRTL_LOCK_Enabled (1UL) /*!< K_PRTL has been locked until next power-on reset (POR). If K_PRTL is selected anyway, a zeroed key will be used instead. */ + +/* Register: CC_HOST_RGF_HOST_IOT_KDR0 */ +/* Description: This register holds bits 31:0 of K_DR. The value of this register is saved in the CRYPTOCELL AO power domain. Reading from this address returns the K_DR valid status indicating if K_DR is successfully retained. */ + +/* Bits 31..0 : Write: K_DR bits 31:0 Read: 0x00000000 when 128-bit K_DR key value is not yet retained in the CRYPTOCELL AO power domain Read: 0x00000001 when 128-bit K_DR key value is successfully retained in the CRYPTOCELL AO power domain */ +#define CC_HOST_RGF_HOST_IOT_KDR0_HOST_IOT_KDR0_Pos (0UL) /*!< Position of HOST_IOT_KDR0 field. */ +#define CC_HOST_RGF_HOST_IOT_KDR0_HOST_IOT_KDR0_Msk (0xFFFFFFFFUL << CC_HOST_RGF_HOST_IOT_KDR0_HOST_IOT_KDR0_Pos) /*!< Bit mask of HOST_IOT_KDR0 field. */ + +/* Register: CC_HOST_RGF_HOST_IOT_KDR1 */ +/* Description: This register holds bits 63:32 of K_DR. The value of this register is saved in the CRYPTOCELL AO power domain. */ + +/* Bits 31..0 : K_DR bits 63:32 */ +#define CC_HOST_RGF_HOST_IOT_KDR1_HOST_IOT_KDR1_Pos (0UL) /*!< Position of HOST_IOT_KDR1 field. */ +#define CC_HOST_RGF_HOST_IOT_KDR1_HOST_IOT_KDR1_Msk (0xFFFFFFFFUL << CC_HOST_RGF_HOST_IOT_KDR1_HOST_IOT_KDR1_Pos) /*!< Bit mask of HOST_IOT_KDR1 field. */ + +/* Register: CC_HOST_RGF_HOST_IOT_KDR2 */ +/* Description: This register holds bits 95:64 of K_DR. The value of this register is saved in the CRYPTOCELL AO power domain. */ + +/* Bits 31..0 : K_DR bits 95:64 */ +#define CC_HOST_RGF_HOST_IOT_KDR2_HOST_IOT_KDR2_Pos (0UL) /*!< Position of HOST_IOT_KDR2 field. */ +#define CC_HOST_RGF_HOST_IOT_KDR2_HOST_IOT_KDR2_Msk (0xFFFFFFFFUL << CC_HOST_RGF_HOST_IOT_KDR2_HOST_IOT_KDR2_Pos) /*!< Bit mask of HOST_IOT_KDR2 field. */ + +/* Register: CC_HOST_RGF_HOST_IOT_KDR3 */ +/* Description: This register holds bits 127:96 of K_DR. The value of this register is saved in the CRYPTOCELL AO power domain. */ + +/* Bits 31..0 : K_DR bits 127:96 */ +#define CC_HOST_RGF_HOST_IOT_KDR3_HOST_IOT_KDR3_Pos (0UL) /*!< Position of HOST_IOT_KDR3 field. */ +#define CC_HOST_RGF_HOST_IOT_KDR3_HOST_IOT_KDR3_Msk (0xFFFFFFFFUL << CC_HOST_RGF_HOST_IOT_KDR3_HOST_IOT_KDR3_Pos) /*!< Bit mask of HOST_IOT_KDR3 field. */ + +/* Register: CC_HOST_RGF_HOST_IOT_LCS */ +/* Description: Controls lifecycle state (LCS) for CRYPTOCELL subsystem */ + +/* Bit 8 : This field is read-only and indicates if CRYPTOCELL LCS has been successfully configured since last reset */ +#define CC_HOST_RGF_HOST_IOT_LCS_LCS_IS_VALID_Pos (8UL) /*!< Position of LCS_IS_VALID field. */ +#define CC_HOST_RGF_HOST_IOT_LCS_LCS_IS_VALID_Msk (0x1UL << CC_HOST_RGF_HOST_IOT_LCS_LCS_IS_VALID_Pos) /*!< Bit mask of LCS_IS_VALID field. */ +#define CC_HOST_RGF_HOST_IOT_LCS_LCS_IS_VALID_Invalid (0UL) /*!< A valid LCS is not yet retained in the CRYPTOCELL AO power domain */ +#define CC_HOST_RGF_HOST_IOT_LCS_LCS_IS_VALID_Valid (1UL) /*!< A valid LCS is successfully retained in the CRYPTOCELL AO power domain */ + +/* Bits 2..0 : Lifecycle state value. This field is write-once per reset. */ +#define CC_HOST_RGF_HOST_IOT_LCS_LCS_Pos (0UL) /*!< Position of LCS field. */ +#define CC_HOST_RGF_HOST_IOT_LCS_LCS_Msk (0x7UL << CC_HOST_RGF_HOST_IOT_LCS_LCS_Pos) /*!< Bit mask of LCS field. */ +#define CC_HOST_RGF_HOST_IOT_LCS_LCS_Debug (0UL) /*!< CC310 operates in debug mode */ +#define CC_HOST_RGF_HOST_IOT_LCS_LCS_Secure (2UL) /*!< CC310 operates in secure mode */ + + /* Peripheral: CLOCK */ /* Description: Clock control */ +/* Register: CLOCK_TASKS_HFCLKSTART */ +/* Description: Start HFXO crystal oscillator */ + +/* Bit 0 : */ +#define CLOCK_TASKS_HFCLKSTART_TASKS_HFCLKSTART_Pos (0UL) /*!< Position of TASKS_HFCLKSTART field. */ +#define CLOCK_TASKS_HFCLKSTART_TASKS_HFCLKSTART_Msk (0x1UL << CLOCK_TASKS_HFCLKSTART_TASKS_HFCLKSTART_Pos) /*!< Bit mask of TASKS_HFCLKSTART field. */ + +/* Register: CLOCK_TASKS_HFCLKSTOP */ +/* Description: Stop HFXO crystal oscillator */ + +/* Bit 0 : */ +#define CLOCK_TASKS_HFCLKSTOP_TASKS_HFCLKSTOP_Pos (0UL) /*!< Position of TASKS_HFCLKSTOP field. */ +#define CLOCK_TASKS_HFCLKSTOP_TASKS_HFCLKSTOP_Msk (0x1UL << CLOCK_TASKS_HFCLKSTOP_TASKS_HFCLKSTOP_Pos) /*!< Bit mask of TASKS_HFCLKSTOP field. */ + +/* Register: CLOCK_TASKS_LFCLKSTART */ +/* Description: Start LFCLK */ + +/* Bit 0 : */ +#define CLOCK_TASKS_LFCLKSTART_TASKS_LFCLKSTART_Pos (0UL) /*!< Position of TASKS_LFCLKSTART field. */ +#define CLOCK_TASKS_LFCLKSTART_TASKS_LFCLKSTART_Msk (0x1UL << CLOCK_TASKS_LFCLKSTART_TASKS_LFCLKSTART_Pos) /*!< Bit mask of TASKS_LFCLKSTART field. */ + +/* Register: CLOCK_TASKS_LFCLKSTOP */ +/* Description: Stop LFCLK */ + +/* Bit 0 : */ +#define CLOCK_TASKS_LFCLKSTOP_TASKS_LFCLKSTOP_Pos (0UL) /*!< Position of TASKS_LFCLKSTOP field. */ +#define CLOCK_TASKS_LFCLKSTOP_TASKS_LFCLKSTOP_Msk (0x1UL << CLOCK_TASKS_LFCLKSTOP_TASKS_LFCLKSTOP_Pos) /*!< Bit mask of TASKS_LFCLKSTOP field. */ + +/* Register: CLOCK_TASKS_CAL */ +/* Description: Start calibration of LFRC */ + +/* Bit 0 : */ +#define CLOCK_TASKS_CAL_TASKS_CAL_Pos (0UL) /*!< Position of TASKS_CAL field. */ +#define CLOCK_TASKS_CAL_TASKS_CAL_Msk (0x1UL << CLOCK_TASKS_CAL_TASKS_CAL_Pos) /*!< Bit mask of TASKS_CAL field. */ + +/* Register: CLOCK_TASKS_CTSTART */ +/* Description: Start calibration timer */ + +/* Bit 0 : */ +#define CLOCK_TASKS_CTSTART_TASKS_CTSTART_Pos (0UL) /*!< Position of TASKS_CTSTART field. */ +#define CLOCK_TASKS_CTSTART_TASKS_CTSTART_Msk (0x1UL << CLOCK_TASKS_CTSTART_TASKS_CTSTART_Pos) /*!< Bit mask of TASKS_CTSTART field. */ + +/* Register: CLOCK_TASKS_CTSTOP */ +/* Description: Stop calibration timer */ + +/* Bit 0 : */ +#define CLOCK_TASKS_CTSTOP_TASKS_CTSTOP_Pos (0UL) /*!< Position of TASKS_CTSTOP field. */ +#define CLOCK_TASKS_CTSTOP_TASKS_CTSTOP_Msk (0x1UL << CLOCK_TASKS_CTSTOP_TASKS_CTSTOP_Pos) /*!< Bit mask of TASKS_CTSTOP field. */ + +/* Register: CLOCK_EVENTS_HFCLKSTARTED */ +/* Description: HFXO crystal oscillator started */ + +/* Bit 0 : */ +#define CLOCK_EVENTS_HFCLKSTARTED_EVENTS_HFCLKSTARTED_Pos (0UL) /*!< Position of EVENTS_HFCLKSTARTED field. */ +#define CLOCK_EVENTS_HFCLKSTARTED_EVENTS_HFCLKSTARTED_Msk (0x1UL << CLOCK_EVENTS_HFCLKSTARTED_EVENTS_HFCLKSTARTED_Pos) /*!< Bit mask of EVENTS_HFCLKSTARTED field. */ + +/* Register: CLOCK_EVENTS_LFCLKSTARTED */ +/* Description: LFCLK started */ + +/* Bit 0 : */ +#define CLOCK_EVENTS_LFCLKSTARTED_EVENTS_LFCLKSTARTED_Pos (0UL) /*!< Position of EVENTS_LFCLKSTARTED field. */ +#define CLOCK_EVENTS_LFCLKSTARTED_EVENTS_LFCLKSTARTED_Msk (0x1UL << CLOCK_EVENTS_LFCLKSTARTED_EVENTS_LFCLKSTARTED_Pos) /*!< Bit mask of EVENTS_LFCLKSTARTED field. */ + +/* Register: CLOCK_EVENTS_DONE */ +/* Description: Calibration of LFRC completed */ + +/* Bit 0 : */ +#define CLOCK_EVENTS_DONE_EVENTS_DONE_Pos (0UL) /*!< Position of EVENTS_DONE field. */ +#define CLOCK_EVENTS_DONE_EVENTS_DONE_Msk (0x1UL << CLOCK_EVENTS_DONE_EVENTS_DONE_Pos) /*!< Bit mask of EVENTS_DONE field. */ + +/* Register: CLOCK_EVENTS_CTTO */ +/* Description: Calibration timer timeout */ + +/* Bit 0 : */ +#define CLOCK_EVENTS_CTTO_EVENTS_CTTO_Pos (0UL) /*!< Position of EVENTS_CTTO field. */ +#define CLOCK_EVENTS_CTTO_EVENTS_CTTO_Msk (0x1UL << CLOCK_EVENTS_CTTO_EVENTS_CTTO_Pos) /*!< Bit mask of EVENTS_CTTO field. */ + +/* Register: CLOCK_EVENTS_CTSTARTED */ +/* Description: Calibration timer has been started and is ready to process new tasks */ + +/* Bit 0 : */ +#define CLOCK_EVENTS_CTSTARTED_EVENTS_CTSTARTED_Pos (0UL) /*!< Position of EVENTS_CTSTARTED field. */ +#define CLOCK_EVENTS_CTSTARTED_EVENTS_CTSTARTED_Msk (0x1UL << CLOCK_EVENTS_CTSTARTED_EVENTS_CTSTARTED_Pos) /*!< Bit mask of EVENTS_CTSTARTED field. */ + +/* Register: CLOCK_EVENTS_CTSTOPPED */ +/* Description: Calibration timer has been stopped and is ready to process new tasks */ + +/* Bit 0 : */ +#define CLOCK_EVENTS_CTSTOPPED_EVENTS_CTSTOPPED_Pos (0UL) /*!< Position of EVENTS_CTSTOPPED field. */ +#define CLOCK_EVENTS_CTSTOPPED_EVENTS_CTSTOPPED_Msk (0x1UL << CLOCK_EVENTS_CTSTOPPED_EVENTS_CTSTOPPED_Pos) /*!< Bit mask of EVENTS_CTSTOPPED field. */ + /* Register: CLOCK_INTENSET */ /* Description: Enable interrupt */ -/* Bit 11 : Write '1' to Enable interrupt for CTSTOPPED event */ +/* Bit 11 : Write '1' to enable interrupt for CTSTOPPED event */ #define CLOCK_INTENSET_CTSTOPPED_Pos (11UL) /*!< Position of CTSTOPPED field. */ #define CLOCK_INTENSET_CTSTOPPED_Msk (0x1UL << CLOCK_INTENSET_CTSTOPPED_Pos) /*!< Bit mask of CTSTOPPED field. */ #define CLOCK_INTENSET_CTSTOPPED_Disabled (0UL) /*!< Read: Disabled */ #define CLOCK_INTENSET_CTSTOPPED_Enabled (1UL) /*!< Read: Enabled */ #define CLOCK_INTENSET_CTSTOPPED_Set (1UL) /*!< Enable */ -/* Bit 10 : Write '1' to Enable interrupt for CTSTARTED event */ +/* Bit 10 : Write '1' to enable interrupt for CTSTARTED event */ #define CLOCK_INTENSET_CTSTARTED_Pos (10UL) /*!< Position of CTSTARTED field. */ #define CLOCK_INTENSET_CTSTARTED_Msk (0x1UL << CLOCK_INTENSET_CTSTARTED_Pos) /*!< Bit mask of CTSTARTED field. */ #define CLOCK_INTENSET_CTSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define CLOCK_INTENSET_CTSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define CLOCK_INTENSET_CTSTARTED_Set (1UL) /*!< Enable */ -/* Bit 4 : Write '1' to Enable interrupt for CTTO event */ +/* Bit 4 : Write '1' to enable interrupt for CTTO event */ #define CLOCK_INTENSET_CTTO_Pos (4UL) /*!< Position of CTTO field. */ #define CLOCK_INTENSET_CTTO_Msk (0x1UL << CLOCK_INTENSET_CTTO_Pos) /*!< Bit mask of CTTO field. */ #define CLOCK_INTENSET_CTTO_Disabled (0UL) /*!< Read: Disabled */ #define CLOCK_INTENSET_CTTO_Enabled (1UL) /*!< Read: Enabled */ #define CLOCK_INTENSET_CTTO_Set (1UL) /*!< Enable */ -/* Bit 3 : Write '1' to Enable interrupt for DONE event */ +/* Bit 3 : Write '1' to enable interrupt for DONE event */ #define CLOCK_INTENSET_DONE_Pos (3UL) /*!< Position of DONE field. */ #define CLOCK_INTENSET_DONE_Msk (0x1UL << CLOCK_INTENSET_DONE_Pos) /*!< Bit mask of DONE field. */ #define CLOCK_INTENSET_DONE_Disabled (0UL) /*!< Read: Disabled */ #define CLOCK_INTENSET_DONE_Enabled (1UL) /*!< Read: Enabled */ #define CLOCK_INTENSET_DONE_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for LFCLKSTARTED event */ +/* Bit 1 : Write '1' to enable interrupt for LFCLKSTARTED event */ #define CLOCK_INTENSET_LFCLKSTARTED_Pos (1UL) /*!< Position of LFCLKSTARTED field. */ #define CLOCK_INTENSET_LFCLKSTARTED_Msk (0x1UL << CLOCK_INTENSET_LFCLKSTARTED_Pos) /*!< Bit mask of LFCLKSTARTED field. */ #define CLOCK_INTENSET_LFCLKSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define CLOCK_INTENSET_LFCLKSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define CLOCK_INTENSET_LFCLKSTARTED_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for HFCLKSTARTED event */ +/* Bit 0 : Write '1' to enable interrupt for HFCLKSTARTED event */ #define CLOCK_INTENSET_HFCLKSTARTED_Pos (0UL) /*!< Position of HFCLKSTARTED field. */ #define CLOCK_INTENSET_HFCLKSTARTED_Msk (0x1UL << CLOCK_INTENSET_HFCLKSTARTED_Pos) /*!< Bit mask of HFCLKSTARTED field. */ #define CLOCK_INTENSET_HFCLKSTARTED_Disabled (0UL) /*!< Read: Disabled */ @@ -372,42 +614,42 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: CLOCK_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 11 : Write '1' to Disable interrupt for CTSTOPPED event */ +/* Bit 11 : Write '1' to disable interrupt for CTSTOPPED event */ #define CLOCK_INTENCLR_CTSTOPPED_Pos (11UL) /*!< Position of CTSTOPPED field. */ #define CLOCK_INTENCLR_CTSTOPPED_Msk (0x1UL << CLOCK_INTENCLR_CTSTOPPED_Pos) /*!< Bit mask of CTSTOPPED field. */ #define CLOCK_INTENCLR_CTSTOPPED_Disabled (0UL) /*!< Read: Disabled */ #define CLOCK_INTENCLR_CTSTOPPED_Enabled (1UL) /*!< Read: Enabled */ #define CLOCK_INTENCLR_CTSTOPPED_Clear (1UL) /*!< Disable */ -/* Bit 10 : Write '1' to Disable interrupt for CTSTARTED event */ +/* Bit 10 : Write '1' to disable interrupt for CTSTARTED event */ #define CLOCK_INTENCLR_CTSTARTED_Pos (10UL) /*!< Position of CTSTARTED field. */ #define CLOCK_INTENCLR_CTSTARTED_Msk (0x1UL << CLOCK_INTENCLR_CTSTARTED_Pos) /*!< Bit mask of CTSTARTED field. */ #define CLOCK_INTENCLR_CTSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define CLOCK_INTENCLR_CTSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define CLOCK_INTENCLR_CTSTARTED_Clear (1UL) /*!< Disable */ -/* Bit 4 : Write '1' to Disable interrupt for CTTO event */ +/* Bit 4 : Write '1' to disable interrupt for CTTO event */ #define CLOCK_INTENCLR_CTTO_Pos (4UL) /*!< Position of CTTO field. */ #define CLOCK_INTENCLR_CTTO_Msk (0x1UL << CLOCK_INTENCLR_CTTO_Pos) /*!< Bit mask of CTTO field. */ #define CLOCK_INTENCLR_CTTO_Disabled (0UL) /*!< Read: Disabled */ #define CLOCK_INTENCLR_CTTO_Enabled (1UL) /*!< Read: Enabled */ #define CLOCK_INTENCLR_CTTO_Clear (1UL) /*!< Disable */ -/* Bit 3 : Write '1' to Disable interrupt for DONE event */ +/* Bit 3 : Write '1' to disable interrupt for DONE event */ #define CLOCK_INTENCLR_DONE_Pos (3UL) /*!< Position of DONE field. */ #define CLOCK_INTENCLR_DONE_Msk (0x1UL << CLOCK_INTENCLR_DONE_Pos) /*!< Bit mask of DONE field. */ #define CLOCK_INTENCLR_DONE_Disabled (0UL) /*!< Read: Disabled */ #define CLOCK_INTENCLR_DONE_Enabled (1UL) /*!< Read: Enabled */ #define CLOCK_INTENCLR_DONE_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for LFCLKSTARTED event */ +/* Bit 1 : Write '1' to disable interrupt for LFCLKSTARTED event */ #define CLOCK_INTENCLR_LFCLKSTARTED_Pos (1UL) /*!< Position of LFCLKSTARTED field. */ #define CLOCK_INTENCLR_LFCLKSTARTED_Msk (0x1UL << CLOCK_INTENCLR_LFCLKSTARTED_Pos) /*!< Bit mask of LFCLKSTARTED field. */ #define CLOCK_INTENCLR_LFCLKSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define CLOCK_INTENCLR_LFCLKSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define CLOCK_INTENCLR_LFCLKSTARTED_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for HFCLKSTARTED event */ +/* Bit 0 : Write '1' to disable interrupt for HFCLKSTARTED event */ #define CLOCK_INTENCLR_HFCLKSTARTED_Pos (0UL) /*!< Position of HFCLKSTARTED field. */ #define CLOCK_INTENCLR_HFCLKSTARTED_Msk (0x1UL << CLOCK_INTENCLR_HFCLKSTARTED_Pos) /*!< Bit mask of HFCLKSTARTED field. */ #define CLOCK_INTENCLR_HFCLKSTARTED_Disabled (0UL) /*!< Read: Disabled */ @@ -459,9 +701,9 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Bits 1..0 : Source of LFCLK */ #define CLOCK_LFCLKSTAT_SRC_Pos (0UL) /*!< Position of SRC field. */ #define CLOCK_LFCLKSTAT_SRC_Msk (0x3UL << CLOCK_LFCLKSTAT_SRC_Pos) /*!< Bit mask of SRC field. */ -#define CLOCK_LFCLKSTAT_SRC_RC (0UL) /*!< 32.768 kHz RC oscillator */ -#define CLOCK_LFCLKSTAT_SRC_Xtal (1UL) /*!< 32.768 kHz crystal oscillator */ -#define CLOCK_LFCLKSTAT_SRC_Synth (2UL) /*!< 32.768 kHz synthesized from HFCLK */ +#define CLOCK_LFCLKSTAT_SRC_RC (0UL) /*!< 32.768 kHz RC oscillator (LFRC) */ +#define CLOCK_LFCLKSTAT_SRC_Xtal (1UL) /*!< 32.768 kHz crystal oscillator (LFXO) */ +#define CLOCK_LFCLKSTAT_SRC_Synth (2UL) /*!< 32.768 kHz synthesized from HFCLK (LFSYNT) */ /* Register: CLOCK_LFCLKSRCCOPY */ /* Description: Copy of LFCLKSRC register, set when LFCLKSTART task was triggered */ @@ -469,9 +711,9 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Bits 1..0 : Clock source */ #define CLOCK_LFCLKSRCCOPY_SRC_Pos (0UL) /*!< Position of SRC field. */ #define CLOCK_LFCLKSRCCOPY_SRC_Msk (0x3UL << CLOCK_LFCLKSRCCOPY_SRC_Pos) /*!< Bit mask of SRC field. */ -#define CLOCK_LFCLKSRCCOPY_SRC_RC (0UL) /*!< 32.768 kHz RC oscillator */ -#define CLOCK_LFCLKSRCCOPY_SRC_Xtal (1UL) /*!< 32.768 kHz crystal oscillator */ -#define CLOCK_LFCLKSRCCOPY_SRC_Synth (2UL) /*!< 32.768 kHz synthesized from HFCLK */ +#define CLOCK_LFCLKSRCCOPY_SRC_RC (0UL) /*!< 32.768 kHz RC oscillator (LFRC) */ +#define CLOCK_LFCLKSRCCOPY_SRC_Xtal (1UL) /*!< 32.768 kHz crystal oscillator (LFXO) */ +#define CLOCK_LFCLKSRCCOPY_SRC_Synth (2UL) /*!< 32.768 kHz synthesized from HFCLK (LFSYNT) */ /* Register: CLOCK_LFCLKSRC */ /* Description: Clock source for the LFCLK */ @@ -491,9 +733,9 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Bits 1..0 : Clock source */ #define CLOCK_LFCLKSRC_SRC_Pos (0UL) /*!< Position of SRC field. */ #define CLOCK_LFCLKSRC_SRC_Msk (0x3UL << CLOCK_LFCLKSRC_SRC_Pos) /*!< Bit mask of SRC field. */ -#define CLOCK_LFCLKSRC_SRC_RC (0UL) /*!< 32.768 kHz RC oscillator */ -#define CLOCK_LFCLKSRC_SRC_Xtal (1UL) /*!< 32.768 kHz crystal oscillator */ -#define CLOCK_LFCLKSRC_SRC_Synth (2UL) /*!< 32.768 kHz synthesized from HFCLK */ +#define CLOCK_LFCLKSRC_SRC_RC (0UL) /*!< 32.768 kHz RC oscillator (LFRC) */ +#define CLOCK_LFCLKSRC_SRC_Xtal (1UL) /*!< 32.768 kHz crystal oscillator (LFXO) */ +#define CLOCK_LFCLKSRC_SRC_Synth (2UL) /*!< 32.768 kHz synthesized from HFCLK (LFSYNT) */ /* Register: CLOCK_HFXODEBOUNCE */ /* Description: HFXO debounce time. The HFXO is started by triggering the TASKS_HFCLKSTART task. */ @@ -501,6 +743,8 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Bits 7..0 : HFXO debounce time. Debounce time = HFXODEBOUNCE * 16 us. */ #define CLOCK_HFXODEBOUNCE_HFXODEBOUNCE_Pos (0UL) /*!< Position of HFXODEBOUNCE field. */ #define CLOCK_HFXODEBOUNCE_HFXODEBOUNCE_Msk (0xFFUL << CLOCK_HFXODEBOUNCE_HFXODEBOUNCE_Pos) /*!< Bit mask of HFXODEBOUNCE field. */ +#define CLOCK_HFXODEBOUNCE_HFXODEBOUNCE_Db256us (0x10UL) /*!< 256 us debounce time. Recommended for TSX-3225, FA-20H and FA-128 crystals. */ +#define CLOCK_HFXODEBOUNCE_HFXODEBOUNCE_Db1024us (0x40UL) /*!< 1024 us debounce time. Recommended for NX1612AA and NX1210AB crystals. */ /* Register: CLOCK_CTIV */ /* Description: Calibration timer interval */ @@ -510,7 +754,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define CLOCK_CTIV_CTIV_Msk (0x7FUL << CLOCK_CTIV_CTIV_Pos) /*!< Bit mask of CTIV field. */ /* Register: CLOCK_TRACECONFIG */ -/* Description: Clocking options for the Trace Port debug interface */ +/* Description: Clocking options for the trace port debug interface */ /* Bits 17..16 : Pin multiplexing of trace signals. See pin assignment chapter for more details. */ #define CLOCK_TRACECONFIG_TRACEMUX_Pos (16UL) /*!< Position of TRACEMUX field. */ @@ -519,13 +763,13 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define CLOCK_TRACECONFIG_TRACEMUX_Serial (1UL) /*!< SWO trace signal routed to pin. Remaining pins can be used as regular GPIOs. */ #define CLOCK_TRACECONFIG_TRACEMUX_Parallel (2UL) /*!< All trace signals (TRACECLK and TRACEDATA[n]) routed to pins. */ -/* Bits 1..0 : Speed of Trace Port clock. Note that the TRACECLK pin will output this clock divided by two. */ +/* Bits 1..0 : Speed of trace port clock. Note that the TRACECLK pin will output this clock divided by two. */ #define CLOCK_TRACECONFIG_TRACEPORTSPEED_Pos (0UL) /*!< Position of TRACEPORTSPEED field. */ #define CLOCK_TRACECONFIG_TRACEPORTSPEED_Msk (0x3UL << CLOCK_TRACECONFIG_TRACEPORTSPEED_Pos) /*!< Bit mask of TRACEPORTSPEED field. */ -#define CLOCK_TRACECONFIG_TRACEPORTSPEED_32MHz (0UL) /*!< 32 MHz Trace Port clock (TRACECLK = 16 MHz) */ -#define CLOCK_TRACECONFIG_TRACEPORTSPEED_16MHz (1UL) /*!< 16 MHz Trace Port clock (TRACECLK = 8 MHz) */ -#define CLOCK_TRACECONFIG_TRACEPORTSPEED_8MHz (2UL) /*!< 8 MHz Trace Port clock (TRACECLK = 4 MHz) */ -#define CLOCK_TRACECONFIG_TRACEPORTSPEED_4MHz (3UL) /*!< 4 MHz Trace Port clock (TRACECLK = 2 MHz) */ +#define CLOCK_TRACECONFIG_TRACEPORTSPEED_32MHz (0UL) /*!< 32 MHz trace port clock (TRACECLK = 16 MHz) */ +#define CLOCK_TRACECONFIG_TRACEPORTSPEED_16MHz (1UL) /*!< 16 MHz trace port clock (TRACECLK = 8 MHz) */ +#define CLOCK_TRACECONFIG_TRACEPORTSPEED_8MHz (2UL) /*!< 8 MHz trace port clock (TRACECLK = 4 MHz) */ +#define CLOCK_TRACECONFIG_TRACEPORTSPEED_4MHz (3UL) /*!< 4 MHz trace port clock (TRACECLK = 2 MHz) */ /* Register: CLOCK_LFRCMODE */ /* Description: LFRC mode configuration */ @@ -546,6 +790,55 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: COMP */ /* Description: Comparator */ +/* Register: COMP_TASKS_START */ +/* Description: Start comparator */ + +/* Bit 0 : */ +#define COMP_TASKS_START_TASKS_START_Pos (0UL) /*!< Position of TASKS_START field. */ +#define COMP_TASKS_START_TASKS_START_Msk (0x1UL << COMP_TASKS_START_TASKS_START_Pos) /*!< Bit mask of TASKS_START field. */ + +/* Register: COMP_TASKS_STOP */ +/* Description: Stop comparator */ + +/* Bit 0 : */ +#define COMP_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define COMP_TASKS_STOP_TASKS_STOP_Msk (0x1UL << COMP_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: COMP_TASKS_SAMPLE */ +/* Description: Sample comparator value */ + +/* Bit 0 : */ +#define COMP_TASKS_SAMPLE_TASKS_SAMPLE_Pos (0UL) /*!< Position of TASKS_SAMPLE field. */ +#define COMP_TASKS_SAMPLE_TASKS_SAMPLE_Msk (0x1UL << COMP_TASKS_SAMPLE_TASKS_SAMPLE_Pos) /*!< Bit mask of TASKS_SAMPLE field. */ + +/* Register: COMP_EVENTS_READY */ +/* Description: COMP is ready and output is valid */ + +/* Bit 0 : */ +#define COMP_EVENTS_READY_EVENTS_READY_Pos (0UL) /*!< Position of EVENTS_READY field. */ +#define COMP_EVENTS_READY_EVENTS_READY_Msk (0x1UL << COMP_EVENTS_READY_EVENTS_READY_Pos) /*!< Bit mask of EVENTS_READY field. */ + +/* Register: COMP_EVENTS_DOWN */ +/* Description: Downward crossing */ + +/* Bit 0 : */ +#define COMP_EVENTS_DOWN_EVENTS_DOWN_Pos (0UL) /*!< Position of EVENTS_DOWN field. */ +#define COMP_EVENTS_DOWN_EVENTS_DOWN_Msk (0x1UL << COMP_EVENTS_DOWN_EVENTS_DOWN_Pos) /*!< Bit mask of EVENTS_DOWN field. */ + +/* Register: COMP_EVENTS_UP */ +/* Description: Upward crossing */ + +/* Bit 0 : */ +#define COMP_EVENTS_UP_EVENTS_UP_Pos (0UL) /*!< Position of EVENTS_UP field. */ +#define COMP_EVENTS_UP_EVENTS_UP_Msk (0x1UL << COMP_EVENTS_UP_EVENTS_UP_Pos) /*!< Bit mask of EVENTS_UP field. */ + +/* Register: COMP_EVENTS_CROSS */ +/* Description: Downward or upward crossing */ + +/* Bit 0 : */ +#define COMP_EVENTS_CROSS_EVENTS_CROSS_Pos (0UL) /*!< Position of EVENTS_CROSS field. */ +#define COMP_EVENTS_CROSS_EVENTS_CROSS_Msk (0x1UL << COMP_EVENTS_CROSS_EVENTS_CROSS_Pos) /*!< Bit mask of EVENTS_CROSS field. */ + /* Register: COMP_SHORTS */ /* Description: Shortcut register */ @@ -609,28 +902,28 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: COMP_INTENSET */ /* Description: Enable interrupt */ -/* Bit 3 : Write '1' to Enable interrupt for CROSS event */ +/* Bit 3 : Write '1' to enable interrupt for CROSS event */ #define COMP_INTENSET_CROSS_Pos (3UL) /*!< Position of CROSS field. */ #define COMP_INTENSET_CROSS_Msk (0x1UL << COMP_INTENSET_CROSS_Pos) /*!< Bit mask of CROSS field. */ #define COMP_INTENSET_CROSS_Disabled (0UL) /*!< Read: Disabled */ #define COMP_INTENSET_CROSS_Enabled (1UL) /*!< Read: Enabled */ #define COMP_INTENSET_CROSS_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for UP event */ +/* Bit 2 : Write '1' to enable interrupt for UP event */ #define COMP_INTENSET_UP_Pos (2UL) /*!< Position of UP field. */ #define COMP_INTENSET_UP_Msk (0x1UL << COMP_INTENSET_UP_Pos) /*!< Bit mask of UP field. */ #define COMP_INTENSET_UP_Disabled (0UL) /*!< Read: Disabled */ #define COMP_INTENSET_UP_Enabled (1UL) /*!< Read: Enabled */ #define COMP_INTENSET_UP_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for DOWN event */ +/* Bit 1 : Write '1' to enable interrupt for DOWN event */ #define COMP_INTENSET_DOWN_Pos (1UL) /*!< Position of DOWN field. */ #define COMP_INTENSET_DOWN_Msk (0x1UL << COMP_INTENSET_DOWN_Pos) /*!< Bit mask of DOWN field. */ #define COMP_INTENSET_DOWN_Disabled (0UL) /*!< Read: Disabled */ #define COMP_INTENSET_DOWN_Enabled (1UL) /*!< Read: Enabled */ #define COMP_INTENSET_DOWN_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for READY event */ +/* Bit 0 : Write '1' to enable interrupt for READY event */ #define COMP_INTENSET_READY_Pos (0UL) /*!< Position of READY field. */ #define COMP_INTENSET_READY_Msk (0x1UL << COMP_INTENSET_READY_Pos) /*!< Bit mask of READY field. */ #define COMP_INTENSET_READY_Disabled (0UL) /*!< Read: Disabled */ @@ -640,28 +933,28 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: COMP_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 3 : Write '1' to Disable interrupt for CROSS event */ +/* Bit 3 : Write '1' to disable interrupt for CROSS event */ #define COMP_INTENCLR_CROSS_Pos (3UL) /*!< Position of CROSS field. */ #define COMP_INTENCLR_CROSS_Msk (0x1UL << COMP_INTENCLR_CROSS_Pos) /*!< Bit mask of CROSS field. */ #define COMP_INTENCLR_CROSS_Disabled (0UL) /*!< Read: Disabled */ #define COMP_INTENCLR_CROSS_Enabled (1UL) /*!< Read: Enabled */ #define COMP_INTENCLR_CROSS_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for UP event */ +/* Bit 2 : Write '1' to disable interrupt for UP event */ #define COMP_INTENCLR_UP_Pos (2UL) /*!< Position of UP field. */ #define COMP_INTENCLR_UP_Msk (0x1UL << COMP_INTENCLR_UP_Pos) /*!< Bit mask of UP field. */ #define COMP_INTENCLR_UP_Disabled (0UL) /*!< Read: Disabled */ #define COMP_INTENCLR_UP_Enabled (1UL) /*!< Read: Enabled */ #define COMP_INTENCLR_UP_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for DOWN event */ +/* Bit 1 : Write '1' to disable interrupt for DOWN event */ #define COMP_INTENCLR_DOWN_Pos (1UL) /*!< Position of DOWN field. */ #define COMP_INTENCLR_DOWN_Msk (0x1UL << COMP_INTENCLR_DOWN_Pos) /*!< Bit mask of DOWN field. */ #define COMP_INTENCLR_DOWN_Disabled (0UL) /*!< Read: Disabled */ #define COMP_INTENCLR_DOWN_Enabled (1UL) /*!< Read: Enabled */ #define COMP_INTENCLR_DOWN_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for READY event */ +/* Bit 0 : Write '1' to disable interrupt for READY event */ #define COMP_INTENCLR_READY_Pos (0UL) /*!< Position of READY field. */ #define COMP_INTENCLR_READY_Msk (0x1UL << COMP_INTENCLR_READY_Pos) /*!< Bit mask of READY field. */ #define COMP_INTENCLR_READY_Disabled (0UL) /*!< Read: Disabled */ @@ -769,7 +1062,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Description: ARM TrustZone CryptoCell register interface */ /* Register: CRYPTOCELL_ENABLE */ -/* Description: Control power and clock for CRYPTOCELL subsystem */ +/* Description: Enable CRYPTOCELL subsystem */ /* Bit 0 : Enable or disable the CRYPTOCELL subsystem */ #define CRYPTOCELL_ENABLE_ENABLE_Pos (0UL) /*!< Position of ENABLE field. */ @@ -781,17 +1074,45 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: ECB */ /* Description: AES ECB Mode Encryption */ +/* Register: ECB_TASKS_STARTECB */ +/* Description: Start ECB block encrypt */ + +/* Bit 0 : */ +#define ECB_TASKS_STARTECB_TASKS_STARTECB_Pos (0UL) /*!< Position of TASKS_STARTECB field. */ +#define ECB_TASKS_STARTECB_TASKS_STARTECB_Msk (0x1UL << ECB_TASKS_STARTECB_TASKS_STARTECB_Pos) /*!< Bit mask of TASKS_STARTECB field. */ + +/* Register: ECB_TASKS_STOPECB */ +/* Description: Abort a possible executing ECB operation */ + +/* Bit 0 : */ +#define ECB_TASKS_STOPECB_TASKS_STOPECB_Pos (0UL) /*!< Position of TASKS_STOPECB field. */ +#define ECB_TASKS_STOPECB_TASKS_STOPECB_Msk (0x1UL << ECB_TASKS_STOPECB_TASKS_STOPECB_Pos) /*!< Bit mask of TASKS_STOPECB field. */ + +/* Register: ECB_EVENTS_ENDECB */ +/* Description: ECB block encrypt complete */ + +/* Bit 0 : */ +#define ECB_EVENTS_ENDECB_EVENTS_ENDECB_Pos (0UL) /*!< Position of EVENTS_ENDECB field. */ +#define ECB_EVENTS_ENDECB_EVENTS_ENDECB_Msk (0x1UL << ECB_EVENTS_ENDECB_EVENTS_ENDECB_Pos) /*!< Bit mask of EVENTS_ENDECB field. */ + +/* Register: ECB_EVENTS_ERRORECB */ +/* Description: ECB block encrypt aborted because of a STOPECB task or due to an error */ + +/* Bit 0 : */ +#define ECB_EVENTS_ERRORECB_EVENTS_ERRORECB_Pos (0UL) /*!< Position of EVENTS_ERRORECB field. */ +#define ECB_EVENTS_ERRORECB_EVENTS_ERRORECB_Msk (0x1UL << ECB_EVENTS_ERRORECB_EVENTS_ERRORECB_Pos) /*!< Bit mask of EVENTS_ERRORECB field. */ + /* Register: ECB_INTENSET */ /* Description: Enable interrupt */ -/* Bit 1 : Write '1' to Enable interrupt for ERRORECB event */ +/* Bit 1 : Write '1' to enable interrupt for ERRORECB event */ #define ECB_INTENSET_ERRORECB_Pos (1UL) /*!< Position of ERRORECB field. */ #define ECB_INTENSET_ERRORECB_Msk (0x1UL << ECB_INTENSET_ERRORECB_Pos) /*!< Bit mask of ERRORECB field. */ #define ECB_INTENSET_ERRORECB_Disabled (0UL) /*!< Read: Disabled */ #define ECB_INTENSET_ERRORECB_Enabled (1UL) /*!< Read: Enabled */ #define ECB_INTENSET_ERRORECB_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for ENDECB event */ +/* Bit 0 : Write '1' to enable interrupt for ENDECB event */ #define ECB_INTENSET_ENDECB_Pos (0UL) /*!< Position of ENDECB field. */ #define ECB_INTENSET_ENDECB_Msk (0x1UL << ECB_INTENSET_ENDECB_Pos) /*!< Bit mask of ENDECB field. */ #define ECB_INTENSET_ENDECB_Disabled (0UL) /*!< Read: Disabled */ @@ -801,14 +1122,14 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: ECB_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 1 : Write '1' to Disable interrupt for ERRORECB event */ +/* Bit 1 : Write '1' to disable interrupt for ERRORECB event */ #define ECB_INTENCLR_ERRORECB_Pos (1UL) /*!< Position of ERRORECB field. */ #define ECB_INTENCLR_ERRORECB_Msk (0x1UL << ECB_INTENCLR_ERRORECB_Pos) /*!< Bit mask of ERRORECB field. */ #define ECB_INTENCLR_ERRORECB_Disabled (0UL) /*!< Read: Disabled */ #define ECB_INTENCLR_ERRORECB_Enabled (1UL) /*!< Read: Enabled */ #define ECB_INTENCLR_ERRORECB_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for ENDECB event */ +/* Bit 0 : Write '1' to disable interrupt for ENDECB event */ #define ECB_INTENCLR_ENDECB_Pos (0UL) /*!< Position of ENDECB field. */ #define ECB_INTENCLR_ENDECB_Msk (0x1UL << ECB_INTENCLR_ENDECB_Pos) /*!< Bit mask of ENDECB field. */ #define ECB_INTENCLR_ENDECB_Disabled (0UL) /*!< Read: Disabled */ @@ -826,6 +1147,20 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: EGU */ /* Description: Event Generator Unit 0 */ +/* Register: EGU_TASKS_TRIGGER */ +/* Description: Description collection[n]: Trigger n for triggering the corresponding TRIGGERED[n] event */ + +/* Bit 0 : */ +#define EGU_TASKS_TRIGGER_TASKS_TRIGGER_Pos (0UL) /*!< Position of TASKS_TRIGGER field. */ +#define EGU_TASKS_TRIGGER_TASKS_TRIGGER_Msk (0x1UL << EGU_TASKS_TRIGGER_TASKS_TRIGGER_Pos) /*!< Bit mask of TASKS_TRIGGER field. */ + +/* Register: EGU_EVENTS_TRIGGERED */ +/* Description: Description collection[n]: Event number n generated by triggering the corresponding TRIGGER[n] task */ + +/* Bit 0 : */ +#define EGU_EVENTS_TRIGGERED_EVENTS_TRIGGERED_Pos (0UL) /*!< Position of EVENTS_TRIGGERED field. */ +#define EGU_EVENTS_TRIGGERED_EVENTS_TRIGGERED_Msk (0x1UL << EGU_EVENTS_TRIGGERED_EVENTS_TRIGGERED_Pos) /*!< Bit mask of EVENTS_TRIGGERED field. */ + /* Register: EGU_INTEN */ /* Description: Enable or disable interrupt */ @@ -928,112 +1263,112 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: EGU_INTENSET */ /* Description: Enable interrupt */ -/* Bit 15 : Write '1' to Enable interrupt for TRIGGERED[15] event */ +/* Bit 15 : Write '1' to enable interrupt for TRIGGERED[15] event */ #define EGU_INTENSET_TRIGGERED15_Pos (15UL) /*!< Position of TRIGGERED15 field. */ #define EGU_INTENSET_TRIGGERED15_Msk (0x1UL << EGU_INTENSET_TRIGGERED15_Pos) /*!< Bit mask of TRIGGERED15 field. */ #define EGU_INTENSET_TRIGGERED15_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENSET_TRIGGERED15_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENSET_TRIGGERED15_Set (1UL) /*!< Enable */ -/* Bit 14 : Write '1' to Enable interrupt for TRIGGERED[14] event */ +/* Bit 14 : Write '1' to enable interrupt for TRIGGERED[14] event */ #define EGU_INTENSET_TRIGGERED14_Pos (14UL) /*!< Position of TRIGGERED14 field. */ #define EGU_INTENSET_TRIGGERED14_Msk (0x1UL << EGU_INTENSET_TRIGGERED14_Pos) /*!< Bit mask of TRIGGERED14 field. */ #define EGU_INTENSET_TRIGGERED14_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENSET_TRIGGERED14_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENSET_TRIGGERED14_Set (1UL) /*!< Enable */ -/* Bit 13 : Write '1' to Enable interrupt for TRIGGERED[13] event */ +/* Bit 13 : Write '1' to enable interrupt for TRIGGERED[13] event */ #define EGU_INTENSET_TRIGGERED13_Pos (13UL) /*!< Position of TRIGGERED13 field. */ #define EGU_INTENSET_TRIGGERED13_Msk (0x1UL << EGU_INTENSET_TRIGGERED13_Pos) /*!< Bit mask of TRIGGERED13 field. */ #define EGU_INTENSET_TRIGGERED13_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENSET_TRIGGERED13_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENSET_TRIGGERED13_Set (1UL) /*!< Enable */ -/* Bit 12 : Write '1' to Enable interrupt for TRIGGERED[12] event */ +/* Bit 12 : Write '1' to enable interrupt for TRIGGERED[12] event */ #define EGU_INTENSET_TRIGGERED12_Pos (12UL) /*!< Position of TRIGGERED12 field. */ #define EGU_INTENSET_TRIGGERED12_Msk (0x1UL << EGU_INTENSET_TRIGGERED12_Pos) /*!< Bit mask of TRIGGERED12 field. */ #define EGU_INTENSET_TRIGGERED12_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENSET_TRIGGERED12_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENSET_TRIGGERED12_Set (1UL) /*!< Enable */ -/* Bit 11 : Write '1' to Enable interrupt for TRIGGERED[11] event */ +/* Bit 11 : Write '1' to enable interrupt for TRIGGERED[11] event */ #define EGU_INTENSET_TRIGGERED11_Pos (11UL) /*!< Position of TRIGGERED11 field. */ #define EGU_INTENSET_TRIGGERED11_Msk (0x1UL << EGU_INTENSET_TRIGGERED11_Pos) /*!< Bit mask of TRIGGERED11 field. */ #define EGU_INTENSET_TRIGGERED11_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENSET_TRIGGERED11_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENSET_TRIGGERED11_Set (1UL) /*!< Enable */ -/* Bit 10 : Write '1' to Enable interrupt for TRIGGERED[10] event */ +/* Bit 10 : Write '1' to enable interrupt for TRIGGERED[10] event */ #define EGU_INTENSET_TRIGGERED10_Pos (10UL) /*!< Position of TRIGGERED10 field. */ #define EGU_INTENSET_TRIGGERED10_Msk (0x1UL << EGU_INTENSET_TRIGGERED10_Pos) /*!< Bit mask of TRIGGERED10 field. */ #define EGU_INTENSET_TRIGGERED10_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENSET_TRIGGERED10_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENSET_TRIGGERED10_Set (1UL) /*!< Enable */ -/* Bit 9 : Write '1' to Enable interrupt for TRIGGERED[9] event */ +/* Bit 9 : Write '1' to enable interrupt for TRIGGERED[9] event */ #define EGU_INTENSET_TRIGGERED9_Pos (9UL) /*!< Position of TRIGGERED9 field. */ #define EGU_INTENSET_TRIGGERED9_Msk (0x1UL << EGU_INTENSET_TRIGGERED9_Pos) /*!< Bit mask of TRIGGERED9 field. */ #define EGU_INTENSET_TRIGGERED9_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENSET_TRIGGERED9_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENSET_TRIGGERED9_Set (1UL) /*!< Enable */ -/* Bit 8 : Write '1' to Enable interrupt for TRIGGERED[8] event */ +/* Bit 8 : Write '1' to enable interrupt for TRIGGERED[8] event */ #define EGU_INTENSET_TRIGGERED8_Pos (8UL) /*!< Position of TRIGGERED8 field. */ #define EGU_INTENSET_TRIGGERED8_Msk (0x1UL << EGU_INTENSET_TRIGGERED8_Pos) /*!< Bit mask of TRIGGERED8 field. */ #define EGU_INTENSET_TRIGGERED8_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENSET_TRIGGERED8_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENSET_TRIGGERED8_Set (1UL) /*!< Enable */ -/* Bit 7 : Write '1' to Enable interrupt for TRIGGERED[7] event */ +/* Bit 7 : Write '1' to enable interrupt for TRIGGERED[7] event */ #define EGU_INTENSET_TRIGGERED7_Pos (7UL) /*!< Position of TRIGGERED7 field. */ #define EGU_INTENSET_TRIGGERED7_Msk (0x1UL << EGU_INTENSET_TRIGGERED7_Pos) /*!< Bit mask of TRIGGERED7 field. */ #define EGU_INTENSET_TRIGGERED7_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENSET_TRIGGERED7_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENSET_TRIGGERED7_Set (1UL) /*!< Enable */ -/* Bit 6 : Write '1' to Enable interrupt for TRIGGERED[6] event */ +/* Bit 6 : Write '1' to enable interrupt for TRIGGERED[6] event */ #define EGU_INTENSET_TRIGGERED6_Pos (6UL) /*!< Position of TRIGGERED6 field. */ #define EGU_INTENSET_TRIGGERED6_Msk (0x1UL << EGU_INTENSET_TRIGGERED6_Pos) /*!< Bit mask of TRIGGERED6 field. */ #define EGU_INTENSET_TRIGGERED6_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENSET_TRIGGERED6_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENSET_TRIGGERED6_Set (1UL) /*!< Enable */ -/* Bit 5 : Write '1' to Enable interrupt for TRIGGERED[5] event */ +/* Bit 5 : Write '1' to enable interrupt for TRIGGERED[5] event */ #define EGU_INTENSET_TRIGGERED5_Pos (5UL) /*!< Position of TRIGGERED5 field. */ #define EGU_INTENSET_TRIGGERED5_Msk (0x1UL << EGU_INTENSET_TRIGGERED5_Pos) /*!< Bit mask of TRIGGERED5 field. */ #define EGU_INTENSET_TRIGGERED5_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENSET_TRIGGERED5_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENSET_TRIGGERED5_Set (1UL) /*!< Enable */ -/* Bit 4 : Write '1' to Enable interrupt for TRIGGERED[4] event */ +/* Bit 4 : Write '1' to enable interrupt for TRIGGERED[4] event */ #define EGU_INTENSET_TRIGGERED4_Pos (4UL) /*!< Position of TRIGGERED4 field. */ #define EGU_INTENSET_TRIGGERED4_Msk (0x1UL << EGU_INTENSET_TRIGGERED4_Pos) /*!< Bit mask of TRIGGERED4 field. */ #define EGU_INTENSET_TRIGGERED4_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENSET_TRIGGERED4_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENSET_TRIGGERED4_Set (1UL) /*!< Enable */ -/* Bit 3 : Write '1' to Enable interrupt for TRIGGERED[3] event */ +/* Bit 3 : Write '1' to enable interrupt for TRIGGERED[3] event */ #define EGU_INTENSET_TRIGGERED3_Pos (3UL) /*!< Position of TRIGGERED3 field. */ #define EGU_INTENSET_TRIGGERED3_Msk (0x1UL << EGU_INTENSET_TRIGGERED3_Pos) /*!< Bit mask of TRIGGERED3 field. */ #define EGU_INTENSET_TRIGGERED3_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENSET_TRIGGERED3_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENSET_TRIGGERED3_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for TRIGGERED[2] event */ +/* Bit 2 : Write '1' to enable interrupt for TRIGGERED[2] event */ #define EGU_INTENSET_TRIGGERED2_Pos (2UL) /*!< Position of TRIGGERED2 field. */ #define EGU_INTENSET_TRIGGERED2_Msk (0x1UL << EGU_INTENSET_TRIGGERED2_Pos) /*!< Bit mask of TRIGGERED2 field. */ #define EGU_INTENSET_TRIGGERED2_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENSET_TRIGGERED2_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENSET_TRIGGERED2_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for TRIGGERED[1] event */ +/* Bit 1 : Write '1' to enable interrupt for TRIGGERED[1] event */ #define EGU_INTENSET_TRIGGERED1_Pos (1UL) /*!< Position of TRIGGERED1 field. */ #define EGU_INTENSET_TRIGGERED1_Msk (0x1UL << EGU_INTENSET_TRIGGERED1_Pos) /*!< Bit mask of TRIGGERED1 field. */ #define EGU_INTENSET_TRIGGERED1_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENSET_TRIGGERED1_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENSET_TRIGGERED1_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for TRIGGERED[0] event */ +/* Bit 0 : Write '1' to enable interrupt for TRIGGERED[0] event */ #define EGU_INTENSET_TRIGGERED0_Pos (0UL) /*!< Position of TRIGGERED0 field. */ #define EGU_INTENSET_TRIGGERED0_Msk (0x1UL << EGU_INTENSET_TRIGGERED0_Pos) /*!< Bit mask of TRIGGERED0 field. */ #define EGU_INTENSET_TRIGGERED0_Disabled (0UL) /*!< Read: Disabled */ @@ -1043,112 +1378,112 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: EGU_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 15 : Write '1' to Disable interrupt for TRIGGERED[15] event */ +/* Bit 15 : Write '1' to disable interrupt for TRIGGERED[15] event */ #define EGU_INTENCLR_TRIGGERED15_Pos (15UL) /*!< Position of TRIGGERED15 field. */ #define EGU_INTENCLR_TRIGGERED15_Msk (0x1UL << EGU_INTENCLR_TRIGGERED15_Pos) /*!< Bit mask of TRIGGERED15 field. */ #define EGU_INTENCLR_TRIGGERED15_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENCLR_TRIGGERED15_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENCLR_TRIGGERED15_Clear (1UL) /*!< Disable */ -/* Bit 14 : Write '1' to Disable interrupt for TRIGGERED[14] event */ +/* Bit 14 : Write '1' to disable interrupt for TRIGGERED[14] event */ #define EGU_INTENCLR_TRIGGERED14_Pos (14UL) /*!< Position of TRIGGERED14 field. */ #define EGU_INTENCLR_TRIGGERED14_Msk (0x1UL << EGU_INTENCLR_TRIGGERED14_Pos) /*!< Bit mask of TRIGGERED14 field. */ #define EGU_INTENCLR_TRIGGERED14_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENCLR_TRIGGERED14_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENCLR_TRIGGERED14_Clear (1UL) /*!< Disable */ -/* Bit 13 : Write '1' to Disable interrupt for TRIGGERED[13] event */ +/* Bit 13 : Write '1' to disable interrupt for TRIGGERED[13] event */ #define EGU_INTENCLR_TRIGGERED13_Pos (13UL) /*!< Position of TRIGGERED13 field. */ #define EGU_INTENCLR_TRIGGERED13_Msk (0x1UL << EGU_INTENCLR_TRIGGERED13_Pos) /*!< Bit mask of TRIGGERED13 field. */ #define EGU_INTENCLR_TRIGGERED13_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENCLR_TRIGGERED13_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENCLR_TRIGGERED13_Clear (1UL) /*!< Disable */ -/* Bit 12 : Write '1' to Disable interrupt for TRIGGERED[12] event */ +/* Bit 12 : Write '1' to disable interrupt for TRIGGERED[12] event */ #define EGU_INTENCLR_TRIGGERED12_Pos (12UL) /*!< Position of TRIGGERED12 field. */ #define EGU_INTENCLR_TRIGGERED12_Msk (0x1UL << EGU_INTENCLR_TRIGGERED12_Pos) /*!< Bit mask of TRIGGERED12 field. */ #define EGU_INTENCLR_TRIGGERED12_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENCLR_TRIGGERED12_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENCLR_TRIGGERED12_Clear (1UL) /*!< Disable */ -/* Bit 11 : Write '1' to Disable interrupt for TRIGGERED[11] event */ +/* Bit 11 : Write '1' to disable interrupt for TRIGGERED[11] event */ #define EGU_INTENCLR_TRIGGERED11_Pos (11UL) /*!< Position of TRIGGERED11 field. */ #define EGU_INTENCLR_TRIGGERED11_Msk (0x1UL << EGU_INTENCLR_TRIGGERED11_Pos) /*!< Bit mask of TRIGGERED11 field. */ #define EGU_INTENCLR_TRIGGERED11_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENCLR_TRIGGERED11_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENCLR_TRIGGERED11_Clear (1UL) /*!< Disable */ -/* Bit 10 : Write '1' to Disable interrupt for TRIGGERED[10] event */ +/* Bit 10 : Write '1' to disable interrupt for TRIGGERED[10] event */ #define EGU_INTENCLR_TRIGGERED10_Pos (10UL) /*!< Position of TRIGGERED10 field. */ #define EGU_INTENCLR_TRIGGERED10_Msk (0x1UL << EGU_INTENCLR_TRIGGERED10_Pos) /*!< Bit mask of TRIGGERED10 field. */ #define EGU_INTENCLR_TRIGGERED10_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENCLR_TRIGGERED10_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENCLR_TRIGGERED10_Clear (1UL) /*!< Disable */ -/* Bit 9 : Write '1' to Disable interrupt for TRIGGERED[9] event */ +/* Bit 9 : Write '1' to disable interrupt for TRIGGERED[9] event */ #define EGU_INTENCLR_TRIGGERED9_Pos (9UL) /*!< Position of TRIGGERED9 field. */ #define EGU_INTENCLR_TRIGGERED9_Msk (0x1UL << EGU_INTENCLR_TRIGGERED9_Pos) /*!< Bit mask of TRIGGERED9 field. */ #define EGU_INTENCLR_TRIGGERED9_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENCLR_TRIGGERED9_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENCLR_TRIGGERED9_Clear (1UL) /*!< Disable */ -/* Bit 8 : Write '1' to Disable interrupt for TRIGGERED[8] event */ +/* Bit 8 : Write '1' to disable interrupt for TRIGGERED[8] event */ #define EGU_INTENCLR_TRIGGERED8_Pos (8UL) /*!< Position of TRIGGERED8 field. */ #define EGU_INTENCLR_TRIGGERED8_Msk (0x1UL << EGU_INTENCLR_TRIGGERED8_Pos) /*!< Bit mask of TRIGGERED8 field. */ #define EGU_INTENCLR_TRIGGERED8_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENCLR_TRIGGERED8_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENCLR_TRIGGERED8_Clear (1UL) /*!< Disable */ -/* Bit 7 : Write '1' to Disable interrupt for TRIGGERED[7] event */ +/* Bit 7 : Write '1' to disable interrupt for TRIGGERED[7] event */ #define EGU_INTENCLR_TRIGGERED7_Pos (7UL) /*!< Position of TRIGGERED7 field. */ #define EGU_INTENCLR_TRIGGERED7_Msk (0x1UL << EGU_INTENCLR_TRIGGERED7_Pos) /*!< Bit mask of TRIGGERED7 field. */ #define EGU_INTENCLR_TRIGGERED7_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENCLR_TRIGGERED7_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENCLR_TRIGGERED7_Clear (1UL) /*!< Disable */ -/* Bit 6 : Write '1' to Disable interrupt for TRIGGERED[6] event */ +/* Bit 6 : Write '1' to disable interrupt for TRIGGERED[6] event */ #define EGU_INTENCLR_TRIGGERED6_Pos (6UL) /*!< Position of TRIGGERED6 field. */ #define EGU_INTENCLR_TRIGGERED6_Msk (0x1UL << EGU_INTENCLR_TRIGGERED6_Pos) /*!< Bit mask of TRIGGERED6 field. */ #define EGU_INTENCLR_TRIGGERED6_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENCLR_TRIGGERED6_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENCLR_TRIGGERED6_Clear (1UL) /*!< Disable */ -/* Bit 5 : Write '1' to Disable interrupt for TRIGGERED[5] event */ +/* Bit 5 : Write '1' to disable interrupt for TRIGGERED[5] event */ #define EGU_INTENCLR_TRIGGERED5_Pos (5UL) /*!< Position of TRIGGERED5 field. */ #define EGU_INTENCLR_TRIGGERED5_Msk (0x1UL << EGU_INTENCLR_TRIGGERED5_Pos) /*!< Bit mask of TRIGGERED5 field. */ #define EGU_INTENCLR_TRIGGERED5_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENCLR_TRIGGERED5_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENCLR_TRIGGERED5_Clear (1UL) /*!< Disable */ -/* Bit 4 : Write '1' to Disable interrupt for TRIGGERED[4] event */ +/* Bit 4 : Write '1' to disable interrupt for TRIGGERED[4] event */ #define EGU_INTENCLR_TRIGGERED4_Pos (4UL) /*!< Position of TRIGGERED4 field. */ #define EGU_INTENCLR_TRIGGERED4_Msk (0x1UL << EGU_INTENCLR_TRIGGERED4_Pos) /*!< Bit mask of TRIGGERED4 field. */ #define EGU_INTENCLR_TRIGGERED4_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENCLR_TRIGGERED4_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENCLR_TRIGGERED4_Clear (1UL) /*!< Disable */ -/* Bit 3 : Write '1' to Disable interrupt for TRIGGERED[3] event */ +/* Bit 3 : Write '1' to disable interrupt for TRIGGERED[3] event */ #define EGU_INTENCLR_TRIGGERED3_Pos (3UL) /*!< Position of TRIGGERED3 field. */ #define EGU_INTENCLR_TRIGGERED3_Msk (0x1UL << EGU_INTENCLR_TRIGGERED3_Pos) /*!< Bit mask of TRIGGERED3 field. */ #define EGU_INTENCLR_TRIGGERED3_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENCLR_TRIGGERED3_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENCLR_TRIGGERED3_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for TRIGGERED[2] event */ +/* Bit 2 : Write '1' to disable interrupt for TRIGGERED[2] event */ #define EGU_INTENCLR_TRIGGERED2_Pos (2UL) /*!< Position of TRIGGERED2 field. */ #define EGU_INTENCLR_TRIGGERED2_Msk (0x1UL << EGU_INTENCLR_TRIGGERED2_Pos) /*!< Bit mask of TRIGGERED2 field. */ #define EGU_INTENCLR_TRIGGERED2_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENCLR_TRIGGERED2_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENCLR_TRIGGERED2_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for TRIGGERED[1] event */ +/* Bit 1 : Write '1' to disable interrupt for TRIGGERED[1] event */ #define EGU_INTENCLR_TRIGGERED1_Pos (1UL) /*!< Position of TRIGGERED1 field. */ #define EGU_INTENCLR_TRIGGERED1_Msk (0x1UL << EGU_INTENCLR_TRIGGERED1_Pos) /*!< Bit mask of TRIGGERED1 field. */ #define EGU_INTENCLR_TRIGGERED1_Disabled (0UL) /*!< Read: Disabled */ #define EGU_INTENCLR_TRIGGERED1_Enabled (1UL) /*!< Read: Enabled */ #define EGU_INTENCLR_TRIGGERED1_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for TRIGGERED[0] event */ +/* Bit 0 : Write '1' to disable interrupt for TRIGGERED[0] event */ #define EGU_INTENCLR_TRIGGERED0_Pos (0UL) /*!< Position of TRIGGERED0 field. */ #define EGU_INTENCLR_TRIGGERED0_Msk (0x1UL << EGU_INTENCLR_TRIGGERED0_Pos) /*!< Bit mask of TRIGGERED0 field. */ #define EGU_INTENCLR_TRIGGERED0_Disabled (0UL) /*!< Read: Disabled */ @@ -1174,23 +1509,23 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define FICR_CODESIZE_CODESIZE_Msk (0xFFFFFFFFUL << FICR_CODESIZE_CODESIZE_Pos) /*!< Bit mask of CODESIZE field. */ /* Register: FICR_DEVICEID */ -/* Description: Description collection[0]: Device identifier */ +/* Description: Description collection[n]: Device identifier */ /* Bits 31..0 : 64 bit unique device identifier */ #define FICR_DEVICEID_DEVICEID_Pos (0UL) /*!< Position of DEVICEID field. */ #define FICR_DEVICEID_DEVICEID_Msk (0xFFFFFFFFUL << FICR_DEVICEID_DEVICEID_Pos) /*!< Bit mask of DEVICEID field. */ /* Register: FICR_ER */ -/* Description: Description collection[0]: Encryption root, word 0 */ +/* Description: Description collection[n]: Encryption root, word n */ -/* Bits 31..0 : Encryption root, word 0 */ +/* Bits 31..0 : Encryption root, word n */ #define FICR_ER_ER_Pos (0UL) /*!< Position of ER field. */ #define FICR_ER_ER_Msk (0xFFFFFFFFUL << FICR_ER_ER_Pos) /*!< Bit mask of ER field. */ /* Register: FICR_IR */ -/* Description: Description collection[0]: Identity Root, word 0 */ +/* Description: Description collection[n]: Identity Root, word n */ -/* Bits 31..0 : Identity Root, word 0 */ +/* Bits 31..0 : Identity Root, word n */ #define FICR_IR_IR_Pos (0UL) /*!< Position of IR field. */ #define FICR_IR_IR_Msk (0xFFFFFFFFUL << FICR_IR_IR_Pos) /*!< Bit mask of IR field. */ @@ -1204,7 +1539,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define FICR_DEVICEADDRTYPE_DEVICEADDRTYPE_Random (1UL) /*!< Random address */ /* Register: FICR_DEVICEADDR */ -/* Description: Description collection[0]: Device address 0 */ +/* Description: Description collection[n]: Device address n */ /* Bits 31..0 : 48 bit device address */ #define FICR_DEVICEADDR_DEVICEADDR_Pos (0UL) /*!< Position of DEVICEADDR field. */ @@ -1220,17 +1555,18 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define FICR_INFO_PART_PART_Unspecified (0xFFFFFFFFUL) /*!< Unspecified */ /* Register: FICR_INFO_VARIANT */ -/* Description: Part variant (hardware version and production configuration) */ +/* Description: Build code (hardware version and production configuration) */ -/* Bits 31..0 : Part variant (hardware version and production configuration). Encoded as ASCII. */ +/* Bits 31..0 : Build code (hardware version and production configuration). Encoded as ASCII. */ #define FICR_INFO_VARIANT_VARIANT_Pos (0UL) /*!< Position of VARIANT field. */ #define FICR_INFO_VARIANT_VARIANT_Msk (0xFFFFFFFFUL << FICR_INFO_VARIANT_VARIANT_Pos) /*!< Bit mask of VARIANT field. */ #define FICR_INFO_VARIANT_VARIANT_AAAA (0x41414141UL) /*!< AAAA */ #define FICR_INFO_VARIANT_VARIANT_AAAB (0x41414142UL) /*!< AAAB */ -#define FICR_INFO_VARIANT_VARIANT_AAB0 (0x41414230UL) /*!< AAB0 */ #define FICR_INFO_VARIANT_VARIANT_AABA (0x41414241UL) /*!< AABA */ #define FICR_INFO_VARIANT_VARIANT_AABB (0x41414242UL) /*!< AABB */ -#define FICR_INFO_VARIANT_VARIANT_ABBA (0x41424241UL) /*!< ABBA */ +#define FICR_INFO_VARIANT_VARIANT_AACA (0x41414341UL) /*!< AACA */ +#define FICR_INFO_VARIANT_VARIANT_BAAA (0x42414141UL) /*!< BAAA */ +#define FICR_INFO_VARIANT_VARIANT_CAAA (0x43414141UL) /*!< CAAA */ #define FICR_INFO_VARIANT_VARIANT_Unspecified (0xFFFFFFFFUL) /*!< Unspecified */ /* Register: FICR_INFO_PACKAGE */ @@ -1268,6 +1604,15 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define FICR_INFO_FLASH_FLASH_K2048 (0x800UL) /*!< 2 MByte FLASH */ #define FICR_INFO_FLASH_FLASH_Unspecified (0xFFFFFFFFUL) /*!< Unspecified */ +/* Register: FICR_PRODTEST */ +/* Description: Description collection[n]: Production test signature n */ + +/* Bits 31..0 : Production test signature n */ +#define FICR_PRODTEST_PRODTEST_Pos (0UL) /*!< Position of PRODTEST field. */ +#define FICR_PRODTEST_PRODTEST_Msk (0xFFFFFFFFUL << FICR_PRODTEST_PRODTEST_Pos) /*!< Bit mask of PRODTEST field. */ +#define FICR_PRODTEST_PRODTEST_Done (0xBB42319FUL) /*!< Production tests done */ +#define FICR_PRODTEST_PRODTEST_NotDone (0xFFFFFFFFUL) /*!< Production tests not done */ + /* Register: FICR_TEMP_A0 */ /* Description: Slope definition A0 */ @@ -1463,70 +1808,161 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define FICR_NFC_TAGHEADER3_UD12_Pos (0UL) /*!< Position of UD12 field. */ #define FICR_NFC_TAGHEADER3_UD12_Msk (0xFFUL << FICR_NFC_TAGHEADER3_UD12_Pos) /*!< Bit mask of UD12 field. */ +/* Register: FICR_TRNG90B_BYTES */ +/* Description: Amount of bytes for the required entropy bits */ + +/* Bits 31..0 : Amount of bytes for the required entropy bits */ +#define FICR_TRNG90B_BYTES_BYTES_Pos (0UL) /*!< Position of BYTES field. */ +#define FICR_TRNG90B_BYTES_BYTES_Msk (0xFFFFFFFFUL << FICR_TRNG90B_BYTES_BYTES_Pos) /*!< Bit mask of BYTES field. */ + +/* Register: FICR_TRNG90B_RCCUTOFF */ +/* Description: Repetition counter cutoff */ + +/* Bits 31..0 : Repetition counter cutoff */ +#define FICR_TRNG90B_RCCUTOFF_RCCUTOFF_Pos (0UL) /*!< Position of RCCUTOFF field. */ +#define FICR_TRNG90B_RCCUTOFF_RCCUTOFF_Msk (0xFFFFFFFFUL << FICR_TRNG90B_RCCUTOFF_RCCUTOFF_Pos) /*!< Bit mask of RCCUTOFF field. */ + +/* Register: FICR_TRNG90B_APCUTOFF */ +/* Description: Adaptive proportion cutoff */ + +/* Bits 31..0 : Adaptive proportion cutoff */ +#define FICR_TRNG90B_APCUTOFF_APCUTOFF_Pos (0UL) /*!< Position of APCUTOFF field. */ +#define FICR_TRNG90B_APCUTOFF_APCUTOFF_Msk (0xFFFFFFFFUL << FICR_TRNG90B_APCUTOFF_APCUTOFF_Pos) /*!< Bit mask of APCUTOFF field. */ + +/* Register: FICR_TRNG90B_STARTUP */ +/* Description: Amount of bytes for the startup tests */ + +/* Bits 31..0 : Amount of bytes for the startup tests */ +#define FICR_TRNG90B_STARTUP_STARTUP_Pos (0UL) /*!< Position of STARTUP field. */ +#define FICR_TRNG90B_STARTUP_STARTUP_Msk (0xFFFFFFFFUL << FICR_TRNG90B_STARTUP_STARTUP_Pos) /*!< Bit mask of STARTUP field. */ + +/* Register: FICR_TRNG90B_ROSC1 */ +/* Description: Sample count for ring oscillator 1 */ + +/* Bits 31..0 : Sample count for ring oscillator 1 */ +#define FICR_TRNG90B_ROSC1_ROSC1_Pos (0UL) /*!< Position of ROSC1 field. */ +#define FICR_TRNG90B_ROSC1_ROSC1_Msk (0xFFFFFFFFUL << FICR_TRNG90B_ROSC1_ROSC1_Pos) /*!< Bit mask of ROSC1 field. */ + +/* Register: FICR_TRNG90B_ROSC2 */ +/* Description: Sample count for ring oscillator 2 */ + +/* Bits 31..0 : Sample count for ring oscillator 2 */ +#define FICR_TRNG90B_ROSC2_ROSC2_Pos (0UL) /*!< Position of ROSC2 field. */ +#define FICR_TRNG90B_ROSC2_ROSC2_Msk (0xFFFFFFFFUL << FICR_TRNG90B_ROSC2_ROSC2_Pos) /*!< Bit mask of ROSC2 field. */ + +/* Register: FICR_TRNG90B_ROSC3 */ +/* Description: Sample count for ring oscillator 3 */ + +/* Bits 31..0 : Sample count for ring oscillator 3 */ +#define FICR_TRNG90B_ROSC3_ROSC3_Pos (0UL) /*!< Position of ROSC3 field. */ +#define FICR_TRNG90B_ROSC3_ROSC3_Msk (0xFFFFFFFFUL << FICR_TRNG90B_ROSC3_ROSC3_Pos) /*!< Bit mask of ROSC3 field. */ + +/* Register: FICR_TRNG90B_ROSC4 */ +/* Description: Sample count for ring oscillator 4 */ + +/* Bits 31..0 : Sample count for ring oscillator 4 */ +#define FICR_TRNG90B_ROSC4_ROSC4_Pos (0UL) /*!< Position of ROSC4 field. */ +#define FICR_TRNG90B_ROSC4_ROSC4_Msk (0xFFFFFFFFUL << FICR_TRNG90B_ROSC4_ROSC4_Pos) /*!< Bit mask of ROSC4 field. */ + /* Peripheral: GPIOTE */ /* Description: GPIO Tasks and Events */ +/* Register: GPIOTE_TASKS_OUT */ +/* Description: Description collection[n]: Task for writing to pin specified in CONFIG[n].PSEL. Action on pin is configured in CONFIG[n].POLARITY. */ + +/* Bit 0 : */ +#define GPIOTE_TASKS_OUT_TASKS_OUT_Pos (0UL) /*!< Position of TASKS_OUT field. */ +#define GPIOTE_TASKS_OUT_TASKS_OUT_Msk (0x1UL << GPIOTE_TASKS_OUT_TASKS_OUT_Pos) /*!< Bit mask of TASKS_OUT field. */ + +/* Register: GPIOTE_TASKS_SET */ +/* Description: Description collection[n]: Task for writing to pin specified in CONFIG[n].PSEL. Action on pin is to set it high. */ + +/* Bit 0 : */ +#define GPIOTE_TASKS_SET_TASKS_SET_Pos (0UL) /*!< Position of TASKS_SET field. */ +#define GPIOTE_TASKS_SET_TASKS_SET_Msk (0x1UL << GPIOTE_TASKS_SET_TASKS_SET_Pos) /*!< Bit mask of TASKS_SET field. */ + +/* Register: GPIOTE_TASKS_CLR */ +/* Description: Description collection[n]: Task for writing to pin specified in CONFIG[n].PSEL. Action on pin is to set it low. */ + +/* Bit 0 : */ +#define GPIOTE_TASKS_CLR_TASKS_CLR_Pos (0UL) /*!< Position of TASKS_CLR field. */ +#define GPIOTE_TASKS_CLR_TASKS_CLR_Msk (0x1UL << GPIOTE_TASKS_CLR_TASKS_CLR_Pos) /*!< Bit mask of TASKS_CLR field. */ + +/* Register: GPIOTE_EVENTS_IN */ +/* Description: Description collection[n]: Event generated from pin specified in CONFIG[n].PSEL */ + +/* Bit 0 : */ +#define GPIOTE_EVENTS_IN_EVENTS_IN_Pos (0UL) /*!< Position of EVENTS_IN field. */ +#define GPIOTE_EVENTS_IN_EVENTS_IN_Msk (0x1UL << GPIOTE_EVENTS_IN_EVENTS_IN_Pos) /*!< Bit mask of EVENTS_IN field. */ + +/* Register: GPIOTE_EVENTS_PORT */ +/* Description: Event generated from multiple input GPIO pins with SENSE mechanism enabled */ + +/* Bit 0 : */ +#define GPIOTE_EVENTS_PORT_EVENTS_PORT_Pos (0UL) /*!< Position of EVENTS_PORT field. */ +#define GPIOTE_EVENTS_PORT_EVENTS_PORT_Msk (0x1UL << GPIOTE_EVENTS_PORT_EVENTS_PORT_Pos) /*!< Bit mask of EVENTS_PORT field. */ + /* Register: GPIOTE_INTENSET */ /* Description: Enable interrupt */ -/* Bit 31 : Write '1' to Enable interrupt for PORT event */ +/* Bit 31 : Write '1' to enable interrupt for PORT event */ #define GPIOTE_INTENSET_PORT_Pos (31UL) /*!< Position of PORT field. */ #define GPIOTE_INTENSET_PORT_Msk (0x1UL << GPIOTE_INTENSET_PORT_Pos) /*!< Bit mask of PORT field. */ #define GPIOTE_INTENSET_PORT_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENSET_PORT_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENSET_PORT_Set (1UL) /*!< Enable */ -/* Bit 7 : Write '1' to Enable interrupt for IN[7] event */ +/* Bit 7 : Write '1' to enable interrupt for IN[7] event */ #define GPIOTE_INTENSET_IN7_Pos (7UL) /*!< Position of IN7 field. */ #define GPIOTE_INTENSET_IN7_Msk (0x1UL << GPIOTE_INTENSET_IN7_Pos) /*!< Bit mask of IN7 field. */ #define GPIOTE_INTENSET_IN7_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENSET_IN7_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENSET_IN7_Set (1UL) /*!< Enable */ -/* Bit 6 : Write '1' to Enable interrupt for IN[6] event */ +/* Bit 6 : Write '1' to enable interrupt for IN[6] event */ #define GPIOTE_INTENSET_IN6_Pos (6UL) /*!< Position of IN6 field. */ #define GPIOTE_INTENSET_IN6_Msk (0x1UL << GPIOTE_INTENSET_IN6_Pos) /*!< Bit mask of IN6 field. */ #define GPIOTE_INTENSET_IN6_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENSET_IN6_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENSET_IN6_Set (1UL) /*!< Enable */ -/* Bit 5 : Write '1' to Enable interrupt for IN[5] event */ +/* Bit 5 : Write '1' to enable interrupt for IN[5] event */ #define GPIOTE_INTENSET_IN5_Pos (5UL) /*!< Position of IN5 field. */ #define GPIOTE_INTENSET_IN5_Msk (0x1UL << GPIOTE_INTENSET_IN5_Pos) /*!< Bit mask of IN5 field. */ #define GPIOTE_INTENSET_IN5_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENSET_IN5_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENSET_IN5_Set (1UL) /*!< Enable */ -/* Bit 4 : Write '1' to Enable interrupt for IN[4] event */ +/* Bit 4 : Write '1' to enable interrupt for IN[4] event */ #define GPIOTE_INTENSET_IN4_Pos (4UL) /*!< Position of IN4 field. */ #define GPIOTE_INTENSET_IN4_Msk (0x1UL << GPIOTE_INTENSET_IN4_Pos) /*!< Bit mask of IN4 field. */ #define GPIOTE_INTENSET_IN4_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENSET_IN4_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENSET_IN4_Set (1UL) /*!< Enable */ -/* Bit 3 : Write '1' to Enable interrupt for IN[3] event */ +/* Bit 3 : Write '1' to enable interrupt for IN[3] event */ #define GPIOTE_INTENSET_IN3_Pos (3UL) /*!< Position of IN3 field. */ #define GPIOTE_INTENSET_IN3_Msk (0x1UL << GPIOTE_INTENSET_IN3_Pos) /*!< Bit mask of IN3 field. */ #define GPIOTE_INTENSET_IN3_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENSET_IN3_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENSET_IN3_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for IN[2] event */ +/* Bit 2 : Write '1' to enable interrupt for IN[2] event */ #define GPIOTE_INTENSET_IN2_Pos (2UL) /*!< Position of IN2 field. */ #define GPIOTE_INTENSET_IN2_Msk (0x1UL << GPIOTE_INTENSET_IN2_Pos) /*!< Bit mask of IN2 field. */ #define GPIOTE_INTENSET_IN2_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENSET_IN2_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENSET_IN2_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for IN[1] event */ +/* Bit 1 : Write '1' to enable interrupt for IN[1] event */ #define GPIOTE_INTENSET_IN1_Pos (1UL) /*!< Position of IN1 field. */ #define GPIOTE_INTENSET_IN1_Msk (0x1UL << GPIOTE_INTENSET_IN1_Pos) /*!< Bit mask of IN1 field. */ #define GPIOTE_INTENSET_IN1_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENSET_IN1_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENSET_IN1_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for IN[0] event */ +/* Bit 0 : Write '1' to enable interrupt for IN[0] event */ #define GPIOTE_INTENSET_IN0_Pos (0UL) /*!< Position of IN0 field. */ #define GPIOTE_INTENSET_IN0_Msk (0x1UL << GPIOTE_INTENSET_IN0_Pos) /*!< Bit mask of IN0 field. */ #define GPIOTE_INTENSET_IN0_Disabled (0UL) /*!< Read: Disabled */ @@ -1536,63 +1972,63 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: GPIOTE_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 31 : Write '1' to Disable interrupt for PORT event */ +/* Bit 31 : Write '1' to disable interrupt for PORT event */ #define GPIOTE_INTENCLR_PORT_Pos (31UL) /*!< Position of PORT field. */ #define GPIOTE_INTENCLR_PORT_Msk (0x1UL << GPIOTE_INTENCLR_PORT_Pos) /*!< Bit mask of PORT field. */ #define GPIOTE_INTENCLR_PORT_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENCLR_PORT_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENCLR_PORT_Clear (1UL) /*!< Disable */ -/* Bit 7 : Write '1' to Disable interrupt for IN[7] event */ +/* Bit 7 : Write '1' to disable interrupt for IN[7] event */ #define GPIOTE_INTENCLR_IN7_Pos (7UL) /*!< Position of IN7 field. */ #define GPIOTE_INTENCLR_IN7_Msk (0x1UL << GPIOTE_INTENCLR_IN7_Pos) /*!< Bit mask of IN7 field. */ #define GPIOTE_INTENCLR_IN7_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENCLR_IN7_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENCLR_IN7_Clear (1UL) /*!< Disable */ -/* Bit 6 : Write '1' to Disable interrupt for IN[6] event */ +/* Bit 6 : Write '1' to disable interrupt for IN[6] event */ #define GPIOTE_INTENCLR_IN6_Pos (6UL) /*!< Position of IN6 field. */ #define GPIOTE_INTENCLR_IN6_Msk (0x1UL << GPIOTE_INTENCLR_IN6_Pos) /*!< Bit mask of IN6 field. */ #define GPIOTE_INTENCLR_IN6_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENCLR_IN6_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENCLR_IN6_Clear (1UL) /*!< Disable */ -/* Bit 5 : Write '1' to Disable interrupt for IN[5] event */ +/* Bit 5 : Write '1' to disable interrupt for IN[5] event */ #define GPIOTE_INTENCLR_IN5_Pos (5UL) /*!< Position of IN5 field. */ #define GPIOTE_INTENCLR_IN5_Msk (0x1UL << GPIOTE_INTENCLR_IN5_Pos) /*!< Bit mask of IN5 field. */ #define GPIOTE_INTENCLR_IN5_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENCLR_IN5_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENCLR_IN5_Clear (1UL) /*!< Disable */ -/* Bit 4 : Write '1' to Disable interrupt for IN[4] event */ +/* Bit 4 : Write '1' to disable interrupt for IN[4] event */ #define GPIOTE_INTENCLR_IN4_Pos (4UL) /*!< Position of IN4 field. */ #define GPIOTE_INTENCLR_IN4_Msk (0x1UL << GPIOTE_INTENCLR_IN4_Pos) /*!< Bit mask of IN4 field. */ #define GPIOTE_INTENCLR_IN4_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENCLR_IN4_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENCLR_IN4_Clear (1UL) /*!< Disable */ -/* Bit 3 : Write '1' to Disable interrupt for IN[3] event */ +/* Bit 3 : Write '1' to disable interrupt for IN[3] event */ #define GPIOTE_INTENCLR_IN3_Pos (3UL) /*!< Position of IN3 field. */ #define GPIOTE_INTENCLR_IN3_Msk (0x1UL << GPIOTE_INTENCLR_IN3_Pos) /*!< Bit mask of IN3 field. */ #define GPIOTE_INTENCLR_IN3_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENCLR_IN3_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENCLR_IN3_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for IN[2] event */ +/* Bit 2 : Write '1' to disable interrupt for IN[2] event */ #define GPIOTE_INTENCLR_IN2_Pos (2UL) /*!< Position of IN2 field. */ #define GPIOTE_INTENCLR_IN2_Msk (0x1UL << GPIOTE_INTENCLR_IN2_Pos) /*!< Bit mask of IN2 field. */ #define GPIOTE_INTENCLR_IN2_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENCLR_IN2_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENCLR_IN2_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for IN[1] event */ +/* Bit 1 : Write '1' to disable interrupt for IN[1] event */ #define GPIOTE_INTENCLR_IN1_Pos (1UL) /*!< Position of IN1 field. */ #define GPIOTE_INTENCLR_IN1_Msk (0x1UL << GPIOTE_INTENCLR_IN1_Pos) /*!< Bit mask of IN1 field. */ #define GPIOTE_INTENCLR_IN1_Disabled (0UL) /*!< Read: Disabled */ #define GPIOTE_INTENCLR_IN1_Enabled (1UL) /*!< Read: Enabled */ #define GPIOTE_INTENCLR_IN1_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for IN[0] event */ +/* Bit 0 : Write '1' to disable interrupt for IN[0] event */ #define GPIOTE_INTENCLR_IN0_Pos (0UL) /*!< Position of IN0 field. */ #define GPIOTE_INTENCLR_IN0_Msk (0x1UL << GPIOTE_INTENCLR_IN0_Pos) /*!< Bit mask of IN0 field. */ #define GPIOTE_INTENCLR_IN0_Disabled (0UL) /*!< Read: Disabled */ @@ -1600,7 +2036,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define GPIOTE_INTENCLR_IN0_Clear (1UL) /*!< Disable */ /* Register: GPIOTE_CONFIG */ -/* Description: Description collection[0]: Configuration for OUT[n], SET[n] and CLR[n] tasks and IN[n] event */ +/* Description: Description collection[n]: Configuration for OUT[n], SET[n] and CLR[n] tasks and IN[n] event */ /* Bit 20 : When in task mode: Initial value of the output when the GPIOTE channel is configured. When in event mode: No effect. */ #define GPIOTE_CONFIG_OUTINIT_Pos (20UL) /*!< Position of OUTINIT field. */ @@ -1635,6 +2071,43 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: I2S */ /* Description: Inter-IC Sound */ +/* Register: I2S_TASKS_START */ +/* Description: Starts continuous I2S transfer. Also starts MCK generator when this is enabled. */ + +/* Bit 0 : */ +#define I2S_TASKS_START_TASKS_START_Pos (0UL) /*!< Position of TASKS_START field. */ +#define I2S_TASKS_START_TASKS_START_Msk (0x1UL << I2S_TASKS_START_TASKS_START_Pos) /*!< Bit mask of TASKS_START field. */ + +/* Register: I2S_TASKS_STOP */ +/* Description: Stops I2S transfer. Also stops MCK generator. Triggering this task will cause the {event:STOPPED} event to be generated. */ + +/* Bit 0 : */ +#define I2S_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define I2S_TASKS_STOP_TASKS_STOP_Msk (0x1UL << I2S_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: I2S_EVENTS_RXPTRUPD */ +/* Description: The RXD.PTR register has been copied to internal double-buffers. + When the I2S module is started and RX is enabled, this event will be generated for every RXTXD.MAXCNT words that are received on the SDIN pin. */ + +/* Bit 0 : */ +#define I2S_EVENTS_RXPTRUPD_EVENTS_RXPTRUPD_Pos (0UL) /*!< Position of EVENTS_RXPTRUPD field. */ +#define I2S_EVENTS_RXPTRUPD_EVENTS_RXPTRUPD_Msk (0x1UL << I2S_EVENTS_RXPTRUPD_EVENTS_RXPTRUPD_Pos) /*!< Bit mask of EVENTS_RXPTRUPD field. */ + +/* Register: I2S_EVENTS_STOPPED */ +/* Description: I2S transfer stopped. */ + +/* Bit 0 : */ +#define I2S_EVENTS_STOPPED_EVENTS_STOPPED_Pos (0UL) /*!< Position of EVENTS_STOPPED field. */ +#define I2S_EVENTS_STOPPED_EVENTS_STOPPED_Msk (0x1UL << I2S_EVENTS_STOPPED_EVENTS_STOPPED_Pos) /*!< Bit mask of EVENTS_STOPPED field. */ + +/* Register: I2S_EVENTS_TXPTRUPD */ +/* Description: The TDX.PTR register has been copied to internal double-buffers. + When the I2S module is started and TX is enabled, this event will be generated for every RXTXD.MAXCNT words that are sent on the SDOUT pin. */ + +/* Bit 0 : */ +#define I2S_EVENTS_TXPTRUPD_EVENTS_TXPTRUPD_Pos (0UL) /*!< Position of EVENTS_TXPTRUPD field. */ +#define I2S_EVENTS_TXPTRUPD_EVENTS_TXPTRUPD_Msk (0x1UL << I2S_EVENTS_TXPTRUPD_EVENTS_TXPTRUPD_Pos) /*!< Bit mask of EVENTS_TXPTRUPD field. */ + /* Register: I2S_INTEN */ /* Description: Enable or disable interrupt */ @@ -1659,21 +2132,21 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: I2S_INTENSET */ /* Description: Enable interrupt */ -/* Bit 5 : Write '1' to Enable interrupt for TXPTRUPD event */ +/* Bit 5 : Write '1' to enable interrupt for TXPTRUPD event */ #define I2S_INTENSET_TXPTRUPD_Pos (5UL) /*!< Position of TXPTRUPD field. */ #define I2S_INTENSET_TXPTRUPD_Msk (0x1UL << I2S_INTENSET_TXPTRUPD_Pos) /*!< Bit mask of TXPTRUPD field. */ #define I2S_INTENSET_TXPTRUPD_Disabled (0UL) /*!< Read: Disabled */ #define I2S_INTENSET_TXPTRUPD_Enabled (1UL) /*!< Read: Enabled */ #define I2S_INTENSET_TXPTRUPD_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for STOPPED event */ +/* Bit 2 : Write '1' to enable interrupt for STOPPED event */ #define I2S_INTENSET_STOPPED_Pos (2UL) /*!< Position of STOPPED field. */ #define I2S_INTENSET_STOPPED_Msk (0x1UL << I2S_INTENSET_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define I2S_INTENSET_STOPPED_Disabled (0UL) /*!< Read: Disabled */ #define I2S_INTENSET_STOPPED_Enabled (1UL) /*!< Read: Enabled */ #define I2S_INTENSET_STOPPED_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for RXPTRUPD event */ +/* Bit 1 : Write '1' to enable interrupt for RXPTRUPD event */ #define I2S_INTENSET_RXPTRUPD_Pos (1UL) /*!< Position of RXPTRUPD field. */ #define I2S_INTENSET_RXPTRUPD_Msk (0x1UL << I2S_INTENSET_RXPTRUPD_Pos) /*!< Bit mask of RXPTRUPD field. */ #define I2S_INTENSET_RXPTRUPD_Disabled (0UL) /*!< Read: Disabled */ @@ -1683,21 +2156,21 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: I2S_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 5 : Write '1' to Disable interrupt for TXPTRUPD event */ +/* Bit 5 : Write '1' to disable interrupt for TXPTRUPD event */ #define I2S_INTENCLR_TXPTRUPD_Pos (5UL) /*!< Position of TXPTRUPD field. */ #define I2S_INTENCLR_TXPTRUPD_Msk (0x1UL << I2S_INTENCLR_TXPTRUPD_Pos) /*!< Bit mask of TXPTRUPD field. */ #define I2S_INTENCLR_TXPTRUPD_Disabled (0UL) /*!< Read: Disabled */ #define I2S_INTENCLR_TXPTRUPD_Enabled (1UL) /*!< Read: Enabled */ #define I2S_INTENCLR_TXPTRUPD_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for STOPPED event */ +/* Bit 2 : Write '1' to disable interrupt for STOPPED event */ #define I2S_INTENCLR_STOPPED_Pos (2UL) /*!< Position of STOPPED field. */ #define I2S_INTENCLR_STOPPED_Msk (0x1UL << I2S_INTENCLR_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define I2S_INTENCLR_STOPPED_Disabled (0UL) /*!< Read: Disabled */ #define I2S_INTENCLR_STOPPED_Enabled (1UL) /*!< Read: Enabled */ #define I2S_INTENCLR_STOPPED_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for RXPTRUPD event */ +/* Bit 1 : Write '1' to disable interrupt for RXPTRUPD event */ #define I2S_INTENCLR_RXPTRUPD_Pos (1UL) /*!< Position of RXPTRUPD field. */ #define I2S_INTENCLR_RXPTRUPD_Msk (0x1UL << I2S_INTENCLR_RXPTRUPD_Pos) /*!< Bit mask of RXPTRUPD field. */ #define I2S_INTENCLR_RXPTRUPD_Disabled (0UL) /*!< Read: Disabled */ @@ -1858,8 +2331,8 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define I2S_PSEL_MCK_CONNECT_Connected (0UL) /*!< Connect */ #define I2S_PSEL_MCK_CONNECT_Disconnected (1UL) /*!< Disconnect */ -/* Bit 8 : Port number */ -#define I2S_PSEL_MCK_PORT_Pos (8UL) /*!< Position of PORT field. */ +/* Bit 5 : Port number */ +#define I2S_PSEL_MCK_PORT_Pos (5UL) /*!< Position of PORT field. */ #define I2S_PSEL_MCK_PORT_Msk (0x1UL << I2S_PSEL_MCK_PORT_Pos) /*!< Bit mask of PORT field. */ /* Bits 4..0 : Pin number */ @@ -1875,8 +2348,8 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define I2S_PSEL_SCK_CONNECT_Connected (0UL) /*!< Connect */ #define I2S_PSEL_SCK_CONNECT_Disconnected (1UL) /*!< Disconnect */ -/* Bit 8 : Port number */ -#define I2S_PSEL_SCK_PORT_Pos (8UL) /*!< Position of PORT field. */ +/* Bit 5 : Port number */ +#define I2S_PSEL_SCK_PORT_Pos (5UL) /*!< Position of PORT field. */ #define I2S_PSEL_SCK_PORT_Msk (0x1UL << I2S_PSEL_SCK_PORT_Pos) /*!< Bit mask of PORT field. */ /* Bits 4..0 : Pin number */ @@ -1892,8 +2365,8 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define I2S_PSEL_LRCK_CONNECT_Connected (0UL) /*!< Connect */ #define I2S_PSEL_LRCK_CONNECT_Disconnected (1UL) /*!< Disconnect */ -/* Bit 8 : Port number */ -#define I2S_PSEL_LRCK_PORT_Pos (8UL) /*!< Position of PORT field. */ +/* Bit 5 : Port number */ +#define I2S_PSEL_LRCK_PORT_Pos (5UL) /*!< Position of PORT field. */ #define I2S_PSEL_LRCK_PORT_Msk (0x1UL << I2S_PSEL_LRCK_PORT_Pos) /*!< Bit mask of PORT field. */ /* Bits 4..0 : Pin number */ @@ -1909,8 +2382,8 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define I2S_PSEL_SDIN_CONNECT_Connected (0UL) /*!< Connect */ #define I2S_PSEL_SDIN_CONNECT_Disconnected (1UL) /*!< Disconnect */ -/* Bit 8 : Port number */ -#define I2S_PSEL_SDIN_PORT_Pos (8UL) /*!< Position of PORT field. */ +/* Bit 5 : Port number */ +#define I2S_PSEL_SDIN_PORT_Pos (5UL) /*!< Position of PORT field. */ #define I2S_PSEL_SDIN_PORT_Msk (0x1UL << I2S_PSEL_SDIN_PORT_Pos) /*!< Bit mask of PORT field. */ /* Bits 4..0 : Pin number */ @@ -1926,8 +2399,8 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define I2S_PSEL_SDOUT_CONNECT_Connected (0UL) /*!< Connect */ #define I2S_PSEL_SDOUT_CONNECT_Disconnected (1UL) /*!< Disconnect */ -/* Bit 8 : Port number */ -#define I2S_PSEL_SDOUT_PORT_Pos (8UL) /*!< Position of PORT field. */ +/* Bit 5 : Port number */ +#define I2S_PSEL_SDOUT_PORT_Pos (5UL) /*!< Position of PORT field. */ #define I2S_PSEL_SDOUT_PORT_Msk (0x1UL << I2S_PSEL_SDOUT_PORT_Pos) /*!< Bit mask of PORT field. */ /* Bits 4..0 : Pin number */ @@ -1938,6 +2411,55 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: LPCOMP */ /* Description: Low Power Comparator */ +/* Register: LPCOMP_TASKS_START */ +/* Description: Start comparator */ + +/* Bit 0 : */ +#define LPCOMP_TASKS_START_TASKS_START_Pos (0UL) /*!< Position of TASKS_START field. */ +#define LPCOMP_TASKS_START_TASKS_START_Msk (0x1UL << LPCOMP_TASKS_START_TASKS_START_Pos) /*!< Bit mask of TASKS_START field. */ + +/* Register: LPCOMP_TASKS_STOP */ +/* Description: Stop comparator */ + +/* Bit 0 : */ +#define LPCOMP_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define LPCOMP_TASKS_STOP_TASKS_STOP_Msk (0x1UL << LPCOMP_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: LPCOMP_TASKS_SAMPLE */ +/* Description: Sample comparator value */ + +/* Bit 0 : */ +#define LPCOMP_TASKS_SAMPLE_TASKS_SAMPLE_Pos (0UL) /*!< Position of TASKS_SAMPLE field. */ +#define LPCOMP_TASKS_SAMPLE_TASKS_SAMPLE_Msk (0x1UL << LPCOMP_TASKS_SAMPLE_TASKS_SAMPLE_Pos) /*!< Bit mask of TASKS_SAMPLE field. */ + +/* Register: LPCOMP_EVENTS_READY */ +/* Description: LPCOMP is ready and output is valid */ + +/* Bit 0 : */ +#define LPCOMP_EVENTS_READY_EVENTS_READY_Pos (0UL) /*!< Position of EVENTS_READY field. */ +#define LPCOMP_EVENTS_READY_EVENTS_READY_Msk (0x1UL << LPCOMP_EVENTS_READY_EVENTS_READY_Pos) /*!< Bit mask of EVENTS_READY field. */ + +/* Register: LPCOMP_EVENTS_DOWN */ +/* Description: Downward crossing */ + +/* Bit 0 : */ +#define LPCOMP_EVENTS_DOWN_EVENTS_DOWN_Pos (0UL) /*!< Position of EVENTS_DOWN field. */ +#define LPCOMP_EVENTS_DOWN_EVENTS_DOWN_Msk (0x1UL << LPCOMP_EVENTS_DOWN_EVENTS_DOWN_Pos) /*!< Bit mask of EVENTS_DOWN field. */ + +/* Register: LPCOMP_EVENTS_UP */ +/* Description: Upward crossing */ + +/* Bit 0 : */ +#define LPCOMP_EVENTS_UP_EVENTS_UP_Pos (0UL) /*!< Position of EVENTS_UP field. */ +#define LPCOMP_EVENTS_UP_EVENTS_UP_Msk (0x1UL << LPCOMP_EVENTS_UP_EVENTS_UP_Pos) /*!< Bit mask of EVENTS_UP field. */ + +/* Register: LPCOMP_EVENTS_CROSS */ +/* Description: Downward or upward crossing */ + +/* Bit 0 : */ +#define LPCOMP_EVENTS_CROSS_EVENTS_CROSS_Pos (0UL) /*!< Position of EVENTS_CROSS field. */ +#define LPCOMP_EVENTS_CROSS_EVENTS_CROSS_Msk (0x1UL << LPCOMP_EVENTS_CROSS_EVENTS_CROSS_Pos) /*!< Bit mask of EVENTS_CROSS field. */ + /* Register: LPCOMP_SHORTS */ /* Description: Shortcut register */ @@ -1974,28 +2496,28 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: LPCOMP_INTENSET */ /* Description: Enable interrupt */ -/* Bit 3 : Write '1' to Enable interrupt for CROSS event */ +/* Bit 3 : Write '1' to enable interrupt for CROSS event */ #define LPCOMP_INTENSET_CROSS_Pos (3UL) /*!< Position of CROSS field. */ #define LPCOMP_INTENSET_CROSS_Msk (0x1UL << LPCOMP_INTENSET_CROSS_Pos) /*!< Bit mask of CROSS field. */ #define LPCOMP_INTENSET_CROSS_Disabled (0UL) /*!< Read: Disabled */ #define LPCOMP_INTENSET_CROSS_Enabled (1UL) /*!< Read: Enabled */ #define LPCOMP_INTENSET_CROSS_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for UP event */ +/* Bit 2 : Write '1' to enable interrupt for UP event */ #define LPCOMP_INTENSET_UP_Pos (2UL) /*!< Position of UP field. */ #define LPCOMP_INTENSET_UP_Msk (0x1UL << LPCOMP_INTENSET_UP_Pos) /*!< Bit mask of UP field. */ #define LPCOMP_INTENSET_UP_Disabled (0UL) /*!< Read: Disabled */ #define LPCOMP_INTENSET_UP_Enabled (1UL) /*!< Read: Enabled */ #define LPCOMP_INTENSET_UP_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for DOWN event */ +/* Bit 1 : Write '1' to enable interrupt for DOWN event */ #define LPCOMP_INTENSET_DOWN_Pos (1UL) /*!< Position of DOWN field. */ #define LPCOMP_INTENSET_DOWN_Msk (0x1UL << LPCOMP_INTENSET_DOWN_Pos) /*!< Bit mask of DOWN field. */ #define LPCOMP_INTENSET_DOWN_Disabled (0UL) /*!< Read: Disabled */ #define LPCOMP_INTENSET_DOWN_Enabled (1UL) /*!< Read: Enabled */ #define LPCOMP_INTENSET_DOWN_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for READY event */ +/* Bit 0 : Write '1' to enable interrupt for READY event */ #define LPCOMP_INTENSET_READY_Pos (0UL) /*!< Position of READY field. */ #define LPCOMP_INTENSET_READY_Msk (0x1UL << LPCOMP_INTENSET_READY_Pos) /*!< Bit mask of READY field. */ #define LPCOMP_INTENSET_READY_Disabled (0UL) /*!< Read: Disabled */ @@ -2005,28 +2527,28 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: LPCOMP_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 3 : Write '1' to Disable interrupt for CROSS event */ +/* Bit 3 : Write '1' to disable interrupt for CROSS event */ #define LPCOMP_INTENCLR_CROSS_Pos (3UL) /*!< Position of CROSS field. */ #define LPCOMP_INTENCLR_CROSS_Msk (0x1UL << LPCOMP_INTENCLR_CROSS_Pos) /*!< Bit mask of CROSS field. */ #define LPCOMP_INTENCLR_CROSS_Disabled (0UL) /*!< Read: Disabled */ #define LPCOMP_INTENCLR_CROSS_Enabled (1UL) /*!< Read: Enabled */ #define LPCOMP_INTENCLR_CROSS_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for UP event */ +/* Bit 2 : Write '1' to disable interrupt for UP event */ #define LPCOMP_INTENCLR_UP_Pos (2UL) /*!< Position of UP field. */ #define LPCOMP_INTENCLR_UP_Msk (0x1UL << LPCOMP_INTENCLR_UP_Pos) /*!< Bit mask of UP field. */ #define LPCOMP_INTENCLR_UP_Disabled (0UL) /*!< Read: Disabled */ #define LPCOMP_INTENCLR_UP_Enabled (1UL) /*!< Read: Enabled */ #define LPCOMP_INTENCLR_UP_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for DOWN event */ +/* Bit 1 : Write '1' to disable interrupt for DOWN event */ #define LPCOMP_INTENCLR_DOWN_Pos (1UL) /*!< Position of DOWN field. */ #define LPCOMP_INTENCLR_DOWN_Msk (0x1UL << LPCOMP_INTENCLR_DOWN_Pos) /*!< Bit mask of DOWN field. */ #define LPCOMP_INTENCLR_DOWN_Disabled (0UL) /*!< Read: Disabled */ #define LPCOMP_INTENCLR_DOWN_Enabled (1UL) /*!< Read: Enabled */ #define LPCOMP_INTENCLR_DOWN_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for READY event */ +/* Bit 0 : Write '1' to disable interrupt for READY event */ #define LPCOMP_INTENCLR_READY_Pos (0UL) /*!< Position of READY field. */ #define LPCOMP_INTENCLR_READY_Msk (0x1UL << LPCOMP_INTENCLR_READY_Pos) /*!< Bit mask of READY field. */ #define LPCOMP_INTENCLR_READY_Disabled (0UL) /*!< Read: Disabled */ @@ -2121,6 +2643,34 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: MWU */ /* Description: Memory Watch Unit */ +/* Register: MWU_EVENTS_REGION_WA */ +/* Description: Description cluster[n]: Write access to region n detected */ + +/* Bit 0 : */ +#define MWU_EVENTS_REGION_WA_WA_Pos (0UL) /*!< Position of WA field. */ +#define MWU_EVENTS_REGION_WA_WA_Msk (0x1UL << MWU_EVENTS_REGION_WA_WA_Pos) /*!< Bit mask of WA field. */ + +/* Register: MWU_EVENTS_REGION_RA */ +/* Description: Description cluster[n]: Read access to region n detected */ + +/* Bit 0 : */ +#define MWU_EVENTS_REGION_RA_RA_Pos (0UL) /*!< Position of RA field. */ +#define MWU_EVENTS_REGION_RA_RA_Msk (0x1UL << MWU_EVENTS_REGION_RA_RA_Pos) /*!< Bit mask of RA field. */ + +/* Register: MWU_EVENTS_PREGION_WA */ +/* Description: Description cluster[n]: Write access to peripheral region n detected */ + +/* Bit 0 : */ +#define MWU_EVENTS_PREGION_WA_WA_Pos (0UL) /*!< Position of WA field. */ +#define MWU_EVENTS_PREGION_WA_WA_Msk (0x1UL << MWU_EVENTS_PREGION_WA_WA_Pos) /*!< Bit mask of WA field. */ + +/* Register: MWU_EVENTS_PREGION_RA */ +/* Description: Description cluster[n]: Read access to peripheral region n detected */ + +/* Bit 0 : */ +#define MWU_EVENTS_PREGION_RA_RA_Pos (0UL) /*!< Position of RA field. */ +#define MWU_EVENTS_PREGION_RA_RA_Msk (0x1UL << MWU_EVENTS_PREGION_RA_RA_Pos) /*!< Bit mask of RA field. */ + /* Register: MWU_INTEN */ /* Description: Enable or disable interrupt */ @@ -2199,84 +2749,84 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: MWU_INTENSET */ /* Description: Enable interrupt */ -/* Bit 27 : Write '1' to Enable interrupt for PREGION[1].RA event */ +/* Bit 27 : Write '1' to enable interrupt for PREGION[1].RA event */ #define MWU_INTENSET_PREGION1RA_Pos (27UL) /*!< Position of PREGION1RA field. */ #define MWU_INTENSET_PREGION1RA_Msk (0x1UL << MWU_INTENSET_PREGION1RA_Pos) /*!< Bit mask of PREGION1RA field. */ #define MWU_INTENSET_PREGION1RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENSET_PREGION1RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENSET_PREGION1RA_Set (1UL) /*!< Enable */ -/* Bit 26 : Write '1' to Enable interrupt for PREGION[1].WA event */ +/* Bit 26 : Write '1' to enable interrupt for PREGION[1].WA event */ #define MWU_INTENSET_PREGION1WA_Pos (26UL) /*!< Position of PREGION1WA field. */ #define MWU_INTENSET_PREGION1WA_Msk (0x1UL << MWU_INTENSET_PREGION1WA_Pos) /*!< Bit mask of PREGION1WA field. */ #define MWU_INTENSET_PREGION1WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENSET_PREGION1WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENSET_PREGION1WA_Set (1UL) /*!< Enable */ -/* Bit 25 : Write '1' to Enable interrupt for PREGION[0].RA event */ +/* Bit 25 : Write '1' to enable interrupt for PREGION[0].RA event */ #define MWU_INTENSET_PREGION0RA_Pos (25UL) /*!< Position of PREGION0RA field. */ #define MWU_INTENSET_PREGION0RA_Msk (0x1UL << MWU_INTENSET_PREGION0RA_Pos) /*!< Bit mask of PREGION0RA field. */ #define MWU_INTENSET_PREGION0RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENSET_PREGION0RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENSET_PREGION0RA_Set (1UL) /*!< Enable */ -/* Bit 24 : Write '1' to Enable interrupt for PREGION[0].WA event */ +/* Bit 24 : Write '1' to enable interrupt for PREGION[0].WA event */ #define MWU_INTENSET_PREGION0WA_Pos (24UL) /*!< Position of PREGION0WA field. */ #define MWU_INTENSET_PREGION0WA_Msk (0x1UL << MWU_INTENSET_PREGION0WA_Pos) /*!< Bit mask of PREGION0WA field. */ #define MWU_INTENSET_PREGION0WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENSET_PREGION0WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENSET_PREGION0WA_Set (1UL) /*!< Enable */ -/* Bit 7 : Write '1' to Enable interrupt for REGION[3].RA event */ +/* Bit 7 : Write '1' to enable interrupt for REGION[3].RA event */ #define MWU_INTENSET_REGION3RA_Pos (7UL) /*!< Position of REGION3RA field. */ #define MWU_INTENSET_REGION3RA_Msk (0x1UL << MWU_INTENSET_REGION3RA_Pos) /*!< Bit mask of REGION3RA field. */ #define MWU_INTENSET_REGION3RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENSET_REGION3RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENSET_REGION3RA_Set (1UL) /*!< Enable */ -/* Bit 6 : Write '1' to Enable interrupt for REGION[3].WA event */ +/* Bit 6 : Write '1' to enable interrupt for REGION[3].WA event */ #define MWU_INTENSET_REGION3WA_Pos (6UL) /*!< Position of REGION3WA field. */ #define MWU_INTENSET_REGION3WA_Msk (0x1UL << MWU_INTENSET_REGION3WA_Pos) /*!< Bit mask of REGION3WA field. */ #define MWU_INTENSET_REGION3WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENSET_REGION3WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENSET_REGION3WA_Set (1UL) /*!< Enable */ -/* Bit 5 : Write '1' to Enable interrupt for REGION[2].RA event */ +/* Bit 5 : Write '1' to enable interrupt for REGION[2].RA event */ #define MWU_INTENSET_REGION2RA_Pos (5UL) /*!< Position of REGION2RA field. */ #define MWU_INTENSET_REGION2RA_Msk (0x1UL << MWU_INTENSET_REGION2RA_Pos) /*!< Bit mask of REGION2RA field. */ #define MWU_INTENSET_REGION2RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENSET_REGION2RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENSET_REGION2RA_Set (1UL) /*!< Enable */ -/* Bit 4 : Write '1' to Enable interrupt for REGION[2].WA event */ +/* Bit 4 : Write '1' to enable interrupt for REGION[2].WA event */ #define MWU_INTENSET_REGION2WA_Pos (4UL) /*!< Position of REGION2WA field. */ #define MWU_INTENSET_REGION2WA_Msk (0x1UL << MWU_INTENSET_REGION2WA_Pos) /*!< Bit mask of REGION2WA field. */ #define MWU_INTENSET_REGION2WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENSET_REGION2WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENSET_REGION2WA_Set (1UL) /*!< Enable */ -/* Bit 3 : Write '1' to Enable interrupt for REGION[1].RA event */ +/* Bit 3 : Write '1' to enable interrupt for REGION[1].RA event */ #define MWU_INTENSET_REGION1RA_Pos (3UL) /*!< Position of REGION1RA field. */ #define MWU_INTENSET_REGION1RA_Msk (0x1UL << MWU_INTENSET_REGION1RA_Pos) /*!< Bit mask of REGION1RA field. */ #define MWU_INTENSET_REGION1RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENSET_REGION1RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENSET_REGION1RA_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for REGION[1].WA event */ +/* Bit 2 : Write '1' to enable interrupt for REGION[1].WA event */ #define MWU_INTENSET_REGION1WA_Pos (2UL) /*!< Position of REGION1WA field. */ #define MWU_INTENSET_REGION1WA_Msk (0x1UL << MWU_INTENSET_REGION1WA_Pos) /*!< Bit mask of REGION1WA field. */ #define MWU_INTENSET_REGION1WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENSET_REGION1WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENSET_REGION1WA_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for REGION[0].RA event */ +/* Bit 1 : Write '1' to enable interrupt for REGION[0].RA event */ #define MWU_INTENSET_REGION0RA_Pos (1UL) /*!< Position of REGION0RA field. */ #define MWU_INTENSET_REGION0RA_Msk (0x1UL << MWU_INTENSET_REGION0RA_Pos) /*!< Bit mask of REGION0RA field. */ #define MWU_INTENSET_REGION0RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENSET_REGION0RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENSET_REGION0RA_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for REGION[0].WA event */ +/* Bit 0 : Write '1' to enable interrupt for REGION[0].WA event */ #define MWU_INTENSET_REGION0WA_Pos (0UL) /*!< Position of REGION0WA field. */ #define MWU_INTENSET_REGION0WA_Msk (0x1UL << MWU_INTENSET_REGION0WA_Pos) /*!< Bit mask of REGION0WA field. */ #define MWU_INTENSET_REGION0WA_Disabled (0UL) /*!< Read: Disabled */ @@ -2286,84 +2836,84 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: MWU_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 27 : Write '1' to Disable interrupt for PREGION[1].RA event */ +/* Bit 27 : Write '1' to disable interrupt for PREGION[1].RA event */ #define MWU_INTENCLR_PREGION1RA_Pos (27UL) /*!< Position of PREGION1RA field. */ #define MWU_INTENCLR_PREGION1RA_Msk (0x1UL << MWU_INTENCLR_PREGION1RA_Pos) /*!< Bit mask of PREGION1RA field. */ #define MWU_INTENCLR_PREGION1RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENCLR_PREGION1RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENCLR_PREGION1RA_Clear (1UL) /*!< Disable */ -/* Bit 26 : Write '1' to Disable interrupt for PREGION[1].WA event */ +/* Bit 26 : Write '1' to disable interrupt for PREGION[1].WA event */ #define MWU_INTENCLR_PREGION1WA_Pos (26UL) /*!< Position of PREGION1WA field. */ #define MWU_INTENCLR_PREGION1WA_Msk (0x1UL << MWU_INTENCLR_PREGION1WA_Pos) /*!< Bit mask of PREGION1WA field. */ #define MWU_INTENCLR_PREGION1WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENCLR_PREGION1WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENCLR_PREGION1WA_Clear (1UL) /*!< Disable */ -/* Bit 25 : Write '1' to Disable interrupt for PREGION[0].RA event */ +/* Bit 25 : Write '1' to disable interrupt for PREGION[0].RA event */ #define MWU_INTENCLR_PREGION0RA_Pos (25UL) /*!< Position of PREGION0RA field. */ #define MWU_INTENCLR_PREGION0RA_Msk (0x1UL << MWU_INTENCLR_PREGION0RA_Pos) /*!< Bit mask of PREGION0RA field. */ #define MWU_INTENCLR_PREGION0RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENCLR_PREGION0RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENCLR_PREGION0RA_Clear (1UL) /*!< Disable */ -/* Bit 24 : Write '1' to Disable interrupt for PREGION[0].WA event */ +/* Bit 24 : Write '1' to disable interrupt for PREGION[0].WA event */ #define MWU_INTENCLR_PREGION0WA_Pos (24UL) /*!< Position of PREGION0WA field. */ #define MWU_INTENCLR_PREGION0WA_Msk (0x1UL << MWU_INTENCLR_PREGION0WA_Pos) /*!< Bit mask of PREGION0WA field. */ #define MWU_INTENCLR_PREGION0WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENCLR_PREGION0WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENCLR_PREGION0WA_Clear (1UL) /*!< Disable */ -/* Bit 7 : Write '1' to Disable interrupt for REGION[3].RA event */ +/* Bit 7 : Write '1' to disable interrupt for REGION[3].RA event */ #define MWU_INTENCLR_REGION3RA_Pos (7UL) /*!< Position of REGION3RA field. */ #define MWU_INTENCLR_REGION3RA_Msk (0x1UL << MWU_INTENCLR_REGION3RA_Pos) /*!< Bit mask of REGION3RA field. */ #define MWU_INTENCLR_REGION3RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENCLR_REGION3RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENCLR_REGION3RA_Clear (1UL) /*!< Disable */ -/* Bit 6 : Write '1' to Disable interrupt for REGION[3].WA event */ +/* Bit 6 : Write '1' to disable interrupt for REGION[3].WA event */ #define MWU_INTENCLR_REGION3WA_Pos (6UL) /*!< Position of REGION3WA field. */ #define MWU_INTENCLR_REGION3WA_Msk (0x1UL << MWU_INTENCLR_REGION3WA_Pos) /*!< Bit mask of REGION3WA field. */ #define MWU_INTENCLR_REGION3WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENCLR_REGION3WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENCLR_REGION3WA_Clear (1UL) /*!< Disable */ -/* Bit 5 : Write '1' to Disable interrupt for REGION[2].RA event */ +/* Bit 5 : Write '1' to disable interrupt for REGION[2].RA event */ #define MWU_INTENCLR_REGION2RA_Pos (5UL) /*!< Position of REGION2RA field. */ #define MWU_INTENCLR_REGION2RA_Msk (0x1UL << MWU_INTENCLR_REGION2RA_Pos) /*!< Bit mask of REGION2RA field. */ #define MWU_INTENCLR_REGION2RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENCLR_REGION2RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENCLR_REGION2RA_Clear (1UL) /*!< Disable */ -/* Bit 4 : Write '1' to Disable interrupt for REGION[2].WA event */ +/* Bit 4 : Write '1' to disable interrupt for REGION[2].WA event */ #define MWU_INTENCLR_REGION2WA_Pos (4UL) /*!< Position of REGION2WA field. */ #define MWU_INTENCLR_REGION2WA_Msk (0x1UL << MWU_INTENCLR_REGION2WA_Pos) /*!< Bit mask of REGION2WA field. */ #define MWU_INTENCLR_REGION2WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENCLR_REGION2WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENCLR_REGION2WA_Clear (1UL) /*!< Disable */ -/* Bit 3 : Write '1' to Disable interrupt for REGION[1].RA event */ +/* Bit 3 : Write '1' to disable interrupt for REGION[1].RA event */ #define MWU_INTENCLR_REGION1RA_Pos (3UL) /*!< Position of REGION1RA field. */ #define MWU_INTENCLR_REGION1RA_Msk (0x1UL << MWU_INTENCLR_REGION1RA_Pos) /*!< Bit mask of REGION1RA field. */ #define MWU_INTENCLR_REGION1RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENCLR_REGION1RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENCLR_REGION1RA_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for REGION[1].WA event */ +/* Bit 2 : Write '1' to disable interrupt for REGION[1].WA event */ #define MWU_INTENCLR_REGION1WA_Pos (2UL) /*!< Position of REGION1WA field. */ #define MWU_INTENCLR_REGION1WA_Msk (0x1UL << MWU_INTENCLR_REGION1WA_Pos) /*!< Bit mask of REGION1WA field. */ #define MWU_INTENCLR_REGION1WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENCLR_REGION1WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENCLR_REGION1WA_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for REGION[0].RA event */ +/* Bit 1 : Write '1' to disable interrupt for REGION[0].RA event */ #define MWU_INTENCLR_REGION0RA_Pos (1UL) /*!< Position of REGION0RA field. */ #define MWU_INTENCLR_REGION0RA_Msk (0x1UL << MWU_INTENCLR_REGION0RA_Pos) /*!< Bit mask of REGION0RA field. */ #define MWU_INTENCLR_REGION0RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_INTENCLR_REGION0RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_INTENCLR_REGION0RA_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for REGION[0].WA event */ +/* Bit 0 : Write '1' to disable interrupt for REGION[0].WA event */ #define MWU_INTENCLR_REGION0WA_Pos (0UL) /*!< Position of REGION0WA field. */ #define MWU_INTENCLR_REGION0WA_Msk (0x1UL << MWU_INTENCLR_REGION0WA_Pos) /*!< Bit mask of REGION0WA field. */ #define MWU_INTENCLR_REGION0WA_Disabled (0UL) /*!< Read: Disabled */ @@ -2448,84 +2998,84 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: MWU_NMIENSET */ /* Description: Enable non-maskable interrupt */ -/* Bit 27 : Write '1' to Enable non-maskable interrupt for PREGION[1].RA event */ +/* Bit 27 : Write '1' to enable non-maskable interrupt for PREGION[1].RA event */ #define MWU_NMIENSET_PREGION1RA_Pos (27UL) /*!< Position of PREGION1RA field. */ #define MWU_NMIENSET_PREGION1RA_Msk (0x1UL << MWU_NMIENSET_PREGION1RA_Pos) /*!< Bit mask of PREGION1RA field. */ #define MWU_NMIENSET_PREGION1RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENSET_PREGION1RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENSET_PREGION1RA_Set (1UL) /*!< Enable */ -/* Bit 26 : Write '1' to Enable non-maskable interrupt for PREGION[1].WA event */ +/* Bit 26 : Write '1' to enable non-maskable interrupt for PREGION[1].WA event */ #define MWU_NMIENSET_PREGION1WA_Pos (26UL) /*!< Position of PREGION1WA field. */ #define MWU_NMIENSET_PREGION1WA_Msk (0x1UL << MWU_NMIENSET_PREGION1WA_Pos) /*!< Bit mask of PREGION1WA field. */ #define MWU_NMIENSET_PREGION1WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENSET_PREGION1WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENSET_PREGION1WA_Set (1UL) /*!< Enable */ -/* Bit 25 : Write '1' to Enable non-maskable interrupt for PREGION[0].RA event */ +/* Bit 25 : Write '1' to enable non-maskable interrupt for PREGION[0].RA event */ #define MWU_NMIENSET_PREGION0RA_Pos (25UL) /*!< Position of PREGION0RA field. */ #define MWU_NMIENSET_PREGION0RA_Msk (0x1UL << MWU_NMIENSET_PREGION0RA_Pos) /*!< Bit mask of PREGION0RA field. */ #define MWU_NMIENSET_PREGION0RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENSET_PREGION0RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENSET_PREGION0RA_Set (1UL) /*!< Enable */ -/* Bit 24 : Write '1' to Enable non-maskable interrupt for PREGION[0].WA event */ +/* Bit 24 : Write '1' to enable non-maskable interrupt for PREGION[0].WA event */ #define MWU_NMIENSET_PREGION0WA_Pos (24UL) /*!< Position of PREGION0WA field. */ #define MWU_NMIENSET_PREGION0WA_Msk (0x1UL << MWU_NMIENSET_PREGION0WA_Pos) /*!< Bit mask of PREGION0WA field. */ #define MWU_NMIENSET_PREGION0WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENSET_PREGION0WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENSET_PREGION0WA_Set (1UL) /*!< Enable */ -/* Bit 7 : Write '1' to Enable non-maskable interrupt for REGION[3].RA event */ +/* Bit 7 : Write '1' to enable non-maskable interrupt for REGION[3].RA event */ #define MWU_NMIENSET_REGION3RA_Pos (7UL) /*!< Position of REGION3RA field. */ #define MWU_NMIENSET_REGION3RA_Msk (0x1UL << MWU_NMIENSET_REGION3RA_Pos) /*!< Bit mask of REGION3RA field. */ #define MWU_NMIENSET_REGION3RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENSET_REGION3RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENSET_REGION3RA_Set (1UL) /*!< Enable */ -/* Bit 6 : Write '1' to Enable non-maskable interrupt for REGION[3].WA event */ +/* Bit 6 : Write '1' to enable non-maskable interrupt for REGION[3].WA event */ #define MWU_NMIENSET_REGION3WA_Pos (6UL) /*!< Position of REGION3WA field. */ #define MWU_NMIENSET_REGION3WA_Msk (0x1UL << MWU_NMIENSET_REGION3WA_Pos) /*!< Bit mask of REGION3WA field. */ #define MWU_NMIENSET_REGION3WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENSET_REGION3WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENSET_REGION3WA_Set (1UL) /*!< Enable */ -/* Bit 5 : Write '1' to Enable non-maskable interrupt for REGION[2].RA event */ +/* Bit 5 : Write '1' to enable non-maskable interrupt for REGION[2].RA event */ #define MWU_NMIENSET_REGION2RA_Pos (5UL) /*!< Position of REGION2RA field. */ #define MWU_NMIENSET_REGION2RA_Msk (0x1UL << MWU_NMIENSET_REGION2RA_Pos) /*!< Bit mask of REGION2RA field. */ #define MWU_NMIENSET_REGION2RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENSET_REGION2RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENSET_REGION2RA_Set (1UL) /*!< Enable */ -/* Bit 4 : Write '1' to Enable non-maskable interrupt for REGION[2].WA event */ +/* Bit 4 : Write '1' to enable non-maskable interrupt for REGION[2].WA event */ #define MWU_NMIENSET_REGION2WA_Pos (4UL) /*!< Position of REGION2WA field. */ #define MWU_NMIENSET_REGION2WA_Msk (0x1UL << MWU_NMIENSET_REGION2WA_Pos) /*!< Bit mask of REGION2WA field. */ #define MWU_NMIENSET_REGION2WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENSET_REGION2WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENSET_REGION2WA_Set (1UL) /*!< Enable */ -/* Bit 3 : Write '1' to Enable non-maskable interrupt for REGION[1].RA event */ +/* Bit 3 : Write '1' to enable non-maskable interrupt for REGION[1].RA event */ #define MWU_NMIENSET_REGION1RA_Pos (3UL) /*!< Position of REGION1RA field. */ #define MWU_NMIENSET_REGION1RA_Msk (0x1UL << MWU_NMIENSET_REGION1RA_Pos) /*!< Bit mask of REGION1RA field. */ #define MWU_NMIENSET_REGION1RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENSET_REGION1RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENSET_REGION1RA_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable non-maskable interrupt for REGION[1].WA event */ +/* Bit 2 : Write '1' to enable non-maskable interrupt for REGION[1].WA event */ #define MWU_NMIENSET_REGION1WA_Pos (2UL) /*!< Position of REGION1WA field. */ #define MWU_NMIENSET_REGION1WA_Msk (0x1UL << MWU_NMIENSET_REGION1WA_Pos) /*!< Bit mask of REGION1WA field. */ #define MWU_NMIENSET_REGION1WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENSET_REGION1WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENSET_REGION1WA_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable non-maskable interrupt for REGION[0].RA event */ +/* Bit 1 : Write '1' to enable non-maskable interrupt for REGION[0].RA event */ #define MWU_NMIENSET_REGION0RA_Pos (1UL) /*!< Position of REGION0RA field. */ #define MWU_NMIENSET_REGION0RA_Msk (0x1UL << MWU_NMIENSET_REGION0RA_Pos) /*!< Bit mask of REGION0RA field. */ #define MWU_NMIENSET_REGION0RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENSET_REGION0RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENSET_REGION0RA_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable non-maskable interrupt for REGION[0].WA event */ +/* Bit 0 : Write '1' to enable non-maskable interrupt for REGION[0].WA event */ #define MWU_NMIENSET_REGION0WA_Pos (0UL) /*!< Position of REGION0WA field. */ #define MWU_NMIENSET_REGION0WA_Msk (0x1UL << MWU_NMIENSET_REGION0WA_Pos) /*!< Bit mask of REGION0WA field. */ #define MWU_NMIENSET_REGION0WA_Disabled (0UL) /*!< Read: Disabled */ @@ -2535,84 +3085,84 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: MWU_NMIENCLR */ /* Description: Disable non-maskable interrupt */ -/* Bit 27 : Write '1' to Disable non-maskable interrupt for PREGION[1].RA event */ +/* Bit 27 : Write '1' to disable non-maskable interrupt for PREGION[1].RA event */ #define MWU_NMIENCLR_PREGION1RA_Pos (27UL) /*!< Position of PREGION1RA field. */ #define MWU_NMIENCLR_PREGION1RA_Msk (0x1UL << MWU_NMIENCLR_PREGION1RA_Pos) /*!< Bit mask of PREGION1RA field. */ #define MWU_NMIENCLR_PREGION1RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENCLR_PREGION1RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENCLR_PREGION1RA_Clear (1UL) /*!< Disable */ -/* Bit 26 : Write '1' to Disable non-maskable interrupt for PREGION[1].WA event */ +/* Bit 26 : Write '1' to disable non-maskable interrupt for PREGION[1].WA event */ #define MWU_NMIENCLR_PREGION1WA_Pos (26UL) /*!< Position of PREGION1WA field. */ #define MWU_NMIENCLR_PREGION1WA_Msk (0x1UL << MWU_NMIENCLR_PREGION1WA_Pos) /*!< Bit mask of PREGION1WA field. */ #define MWU_NMIENCLR_PREGION1WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENCLR_PREGION1WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENCLR_PREGION1WA_Clear (1UL) /*!< Disable */ -/* Bit 25 : Write '1' to Disable non-maskable interrupt for PREGION[0].RA event */ +/* Bit 25 : Write '1' to disable non-maskable interrupt for PREGION[0].RA event */ #define MWU_NMIENCLR_PREGION0RA_Pos (25UL) /*!< Position of PREGION0RA field. */ #define MWU_NMIENCLR_PREGION0RA_Msk (0x1UL << MWU_NMIENCLR_PREGION0RA_Pos) /*!< Bit mask of PREGION0RA field. */ #define MWU_NMIENCLR_PREGION0RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENCLR_PREGION0RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENCLR_PREGION0RA_Clear (1UL) /*!< Disable */ -/* Bit 24 : Write '1' to Disable non-maskable interrupt for PREGION[0].WA event */ +/* Bit 24 : Write '1' to disable non-maskable interrupt for PREGION[0].WA event */ #define MWU_NMIENCLR_PREGION0WA_Pos (24UL) /*!< Position of PREGION0WA field. */ #define MWU_NMIENCLR_PREGION0WA_Msk (0x1UL << MWU_NMIENCLR_PREGION0WA_Pos) /*!< Bit mask of PREGION0WA field. */ #define MWU_NMIENCLR_PREGION0WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENCLR_PREGION0WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENCLR_PREGION0WA_Clear (1UL) /*!< Disable */ -/* Bit 7 : Write '1' to Disable non-maskable interrupt for REGION[3].RA event */ +/* Bit 7 : Write '1' to disable non-maskable interrupt for REGION[3].RA event */ #define MWU_NMIENCLR_REGION3RA_Pos (7UL) /*!< Position of REGION3RA field. */ #define MWU_NMIENCLR_REGION3RA_Msk (0x1UL << MWU_NMIENCLR_REGION3RA_Pos) /*!< Bit mask of REGION3RA field. */ #define MWU_NMIENCLR_REGION3RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENCLR_REGION3RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENCLR_REGION3RA_Clear (1UL) /*!< Disable */ -/* Bit 6 : Write '1' to Disable non-maskable interrupt for REGION[3].WA event */ +/* Bit 6 : Write '1' to disable non-maskable interrupt for REGION[3].WA event */ #define MWU_NMIENCLR_REGION3WA_Pos (6UL) /*!< Position of REGION3WA field. */ #define MWU_NMIENCLR_REGION3WA_Msk (0x1UL << MWU_NMIENCLR_REGION3WA_Pos) /*!< Bit mask of REGION3WA field. */ #define MWU_NMIENCLR_REGION3WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENCLR_REGION3WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENCLR_REGION3WA_Clear (1UL) /*!< Disable */ -/* Bit 5 : Write '1' to Disable non-maskable interrupt for REGION[2].RA event */ +/* Bit 5 : Write '1' to disable non-maskable interrupt for REGION[2].RA event */ #define MWU_NMIENCLR_REGION2RA_Pos (5UL) /*!< Position of REGION2RA field. */ #define MWU_NMIENCLR_REGION2RA_Msk (0x1UL << MWU_NMIENCLR_REGION2RA_Pos) /*!< Bit mask of REGION2RA field. */ #define MWU_NMIENCLR_REGION2RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENCLR_REGION2RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENCLR_REGION2RA_Clear (1UL) /*!< Disable */ -/* Bit 4 : Write '1' to Disable non-maskable interrupt for REGION[2].WA event */ +/* Bit 4 : Write '1' to disable non-maskable interrupt for REGION[2].WA event */ #define MWU_NMIENCLR_REGION2WA_Pos (4UL) /*!< Position of REGION2WA field. */ #define MWU_NMIENCLR_REGION2WA_Msk (0x1UL << MWU_NMIENCLR_REGION2WA_Pos) /*!< Bit mask of REGION2WA field. */ #define MWU_NMIENCLR_REGION2WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENCLR_REGION2WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENCLR_REGION2WA_Clear (1UL) /*!< Disable */ -/* Bit 3 : Write '1' to Disable non-maskable interrupt for REGION[1].RA event */ +/* Bit 3 : Write '1' to disable non-maskable interrupt for REGION[1].RA event */ #define MWU_NMIENCLR_REGION1RA_Pos (3UL) /*!< Position of REGION1RA field. */ #define MWU_NMIENCLR_REGION1RA_Msk (0x1UL << MWU_NMIENCLR_REGION1RA_Pos) /*!< Bit mask of REGION1RA field. */ #define MWU_NMIENCLR_REGION1RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENCLR_REGION1RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENCLR_REGION1RA_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable non-maskable interrupt for REGION[1].WA event */ +/* Bit 2 : Write '1' to disable non-maskable interrupt for REGION[1].WA event */ #define MWU_NMIENCLR_REGION1WA_Pos (2UL) /*!< Position of REGION1WA field. */ #define MWU_NMIENCLR_REGION1WA_Msk (0x1UL << MWU_NMIENCLR_REGION1WA_Pos) /*!< Bit mask of REGION1WA field. */ #define MWU_NMIENCLR_REGION1WA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENCLR_REGION1WA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENCLR_REGION1WA_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable non-maskable interrupt for REGION[0].RA event */ +/* Bit 1 : Write '1' to disable non-maskable interrupt for REGION[0].RA event */ #define MWU_NMIENCLR_REGION0RA_Pos (1UL) /*!< Position of REGION0RA field. */ #define MWU_NMIENCLR_REGION0RA_Msk (0x1UL << MWU_NMIENCLR_REGION0RA_Pos) /*!< Bit mask of REGION0RA field. */ #define MWU_NMIENCLR_REGION0RA_Disabled (0UL) /*!< Read: Disabled */ #define MWU_NMIENCLR_REGION0RA_Enabled (1UL) /*!< Read: Enabled */ #define MWU_NMIENCLR_REGION0RA_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable non-maskable interrupt for REGION[0].WA event */ +/* Bit 0 : Write '1' to disable non-maskable interrupt for REGION[0].WA event */ #define MWU_NMIENCLR_REGION0WA_Pos (0UL) /*!< Position of REGION0WA field. */ #define MWU_NMIENCLR_REGION0WA_Msk (0x1UL << MWU_NMIENCLR_REGION0WA_Pos) /*!< Bit mask of REGION0WA field. */ #define MWU_NMIENCLR_REGION0WA_Disabled (0UL) /*!< Read: Disabled */ @@ -2620,390 +3170,390 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define MWU_NMIENCLR_REGION0WA_Clear (1UL) /*!< Disable */ /* Register: MWU_PERREGION_SUBSTATWA */ -/* Description: Description cluster[0]: Source of event/interrupt in region 0, write access detected while corresponding subregion was enabled for watching */ +/* Description: Description cluster[n]: Source of event/interrupt in region n, write access detected while corresponding subregion was enabled for watching */ -/* Bit 31 : Subregion 31 in region 0 (write '1' to clear) */ +/* Bit 31 : Subregion 31 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR31_Pos (31UL) /*!< Position of SR31 field. */ #define MWU_PERREGION_SUBSTATWA_SR31_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR31_Pos) /*!< Bit mask of SR31 field. */ #define MWU_PERREGION_SUBSTATWA_SR31_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR31_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 30 : Subregion 30 in region 0 (write '1' to clear) */ +/* Bit 30 : Subregion 30 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR30_Pos (30UL) /*!< Position of SR30 field. */ #define MWU_PERREGION_SUBSTATWA_SR30_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR30_Pos) /*!< Bit mask of SR30 field. */ #define MWU_PERREGION_SUBSTATWA_SR30_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR30_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 29 : Subregion 29 in region 0 (write '1' to clear) */ +/* Bit 29 : Subregion 29 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR29_Pos (29UL) /*!< Position of SR29 field. */ #define MWU_PERREGION_SUBSTATWA_SR29_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR29_Pos) /*!< Bit mask of SR29 field. */ #define MWU_PERREGION_SUBSTATWA_SR29_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR29_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 28 : Subregion 28 in region 0 (write '1' to clear) */ +/* Bit 28 : Subregion 28 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR28_Pos (28UL) /*!< Position of SR28 field. */ #define MWU_PERREGION_SUBSTATWA_SR28_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR28_Pos) /*!< Bit mask of SR28 field. */ #define MWU_PERREGION_SUBSTATWA_SR28_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR28_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 27 : Subregion 27 in region 0 (write '1' to clear) */ +/* Bit 27 : Subregion 27 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR27_Pos (27UL) /*!< Position of SR27 field. */ #define MWU_PERREGION_SUBSTATWA_SR27_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR27_Pos) /*!< Bit mask of SR27 field. */ #define MWU_PERREGION_SUBSTATWA_SR27_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR27_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 26 : Subregion 26 in region 0 (write '1' to clear) */ +/* Bit 26 : Subregion 26 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR26_Pos (26UL) /*!< Position of SR26 field. */ #define MWU_PERREGION_SUBSTATWA_SR26_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR26_Pos) /*!< Bit mask of SR26 field. */ #define MWU_PERREGION_SUBSTATWA_SR26_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR26_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 25 : Subregion 25 in region 0 (write '1' to clear) */ +/* Bit 25 : Subregion 25 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR25_Pos (25UL) /*!< Position of SR25 field. */ #define MWU_PERREGION_SUBSTATWA_SR25_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR25_Pos) /*!< Bit mask of SR25 field. */ #define MWU_PERREGION_SUBSTATWA_SR25_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR25_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 24 : Subregion 24 in region 0 (write '1' to clear) */ +/* Bit 24 : Subregion 24 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR24_Pos (24UL) /*!< Position of SR24 field. */ #define MWU_PERREGION_SUBSTATWA_SR24_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR24_Pos) /*!< Bit mask of SR24 field. */ #define MWU_PERREGION_SUBSTATWA_SR24_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR24_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 23 : Subregion 23 in region 0 (write '1' to clear) */ +/* Bit 23 : Subregion 23 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR23_Pos (23UL) /*!< Position of SR23 field. */ #define MWU_PERREGION_SUBSTATWA_SR23_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR23_Pos) /*!< Bit mask of SR23 field. */ #define MWU_PERREGION_SUBSTATWA_SR23_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR23_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 22 : Subregion 22 in region 0 (write '1' to clear) */ +/* Bit 22 : Subregion 22 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR22_Pos (22UL) /*!< Position of SR22 field. */ #define MWU_PERREGION_SUBSTATWA_SR22_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR22_Pos) /*!< Bit mask of SR22 field. */ #define MWU_PERREGION_SUBSTATWA_SR22_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR22_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 21 : Subregion 21 in region 0 (write '1' to clear) */ +/* Bit 21 : Subregion 21 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR21_Pos (21UL) /*!< Position of SR21 field. */ #define MWU_PERREGION_SUBSTATWA_SR21_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR21_Pos) /*!< Bit mask of SR21 field. */ #define MWU_PERREGION_SUBSTATWA_SR21_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR21_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 20 : Subregion 20 in region 0 (write '1' to clear) */ +/* Bit 20 : Subregion 20 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR20_Pos (20UL) /*!< Position of SR20 field. */ #define MWU_PERREGION_SUBSTATWA_SR20_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR20_Pos) /*!< Bit mask of SR20 field. */ #define MWU_PERREGION_SUBSTATWA_SR20_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR20_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 19 : Subregion 19 in region 0 (write '1' to clear) */ +/* Bit 19 : Subregion 19 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR19_Pos (19UL) /*!< Position of SR19 field. */ #define MWU_PERREGION_SUBSTATWA_SR19_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR19_Pos) /*!< Bit mask of SR19 field. */ #define MWU_PERREGION_SUBSTATWA_SR19_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR19_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 18 : Subregion 18 in region 0 (write '1' to clear) */ +/* Bit 18 : Subregion 18 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR18_Pos (18UL) /*!< Position of SR18 field. */ #define MWU_PERREGION_SUBSTATWA_SR18_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR18_Pos) /*!< Bit mask of SR18 field. */ #define MWU_PERREGION_SUBSTATWA_SR18_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR18_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 17 : Subregion 17 in region 0 (write '1' to clear) */ +/* Bit 17 : Subregion 17 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR17_Pos (17UL) /*!< Position of SR17 field. */ #define MWU_PERREGION_SUBSTATWA_SR17_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR17_Pos) /*!< Bit mask of SR17 field. */ #define MWU_PERREGION_SUBSTATWA_SR17_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR17_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 16 : Subregion 16 in region 0 (write '1' to clear) */ +/* Bit 16 : Subregion 16 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR16_Pos (16UL) /*!< Position of SR16 field. */ #define MWU_PERREGION_SUBSTATWA_SR16_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR16_Pos) /*!< Bit mask of SR16 field. */ #define MWU_PERREGION_SUBSTATWA_SR16_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR16_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 15 : Subregion 15 in region 0 (write '1' to clear) */ +/* Bit 15 : Subregion 15 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR15_Pos (15UL) /*!< Position of SR15 field. */ #define MWU_PERREGION_SUBSTATWA_SR15_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR15_Pos) /*!< Bit mask of SR15 field. */ #define MWU_PERREGION_SUBSTATWA_SR15_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR15_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 14 : Subregion 14 in region 0 (write '1' to clear) */ +/* Bit 14 : Subregion 14 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR14_Pos (14UL) /*!< Position of SR14 field. */ #define MWU_PERREGION_SUBSTATWA_SR14_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR14_Pos) /*!< Bit mask of SR14 field. */ #define MWU_PERREGION_SUBSTATWA_SR14_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR14_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 13 : Subregion 13 in region 0 (write '1' to clear) */ +/* Bit 13 : Subregion 13 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR13_Pos (13UL) /*!< Position of SR13 field. */ #define MWU_PERREGION_SUBSTATWA_SR13_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR13_Pos) /*!< Bit mask of SR13 field. */ #define MWU_PERREGION_SUBSTATWA_SR13_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR13_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 12 : Subregion 12 in region 0 (write '1' to clear) */ +/* Bit 12 : Subregion 12 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR12_Pos (12UL) /*!< Position of SR12 field. */ #define MWU_PERREGION_SUBSTATWA_SR12_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR12_Pos) /*!< Bit mask of SR12 field. */ #define MWU_PERREGION_SUBSTATWA_SR12_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR12_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 11 : Subregion 11 in region 0 (write '1' to clear) */ +/* Bit 11 : Subregion 11 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR11_Pos (11UL) /*!< Position of SR11 field. */ #define MWU_PERREGION_SUBSTATWA_SR11_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR11_Pos) /*!< Bit mask of SR11 field. */ #define MWU_PERREGION_SUBSTATWA_SR11_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR11_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 10 : Subregion 10 in region 0 (write '1' to clear) */ +/* Bit 10 : Subregion 10 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR10_Pos (10UL) /*!< Position of SR10 field. */ #define MWU_PERREGION_SUBSTATWA_SR10_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR10_Pos) /*!< Bit mask of SR10 field. */ #define MWU_PERREGION_SUBSTATWA_SR10_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR10_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 9 : Subregion 9 in region 0 (write '1' to clear) */ +/* Bit 9 : Subregion 9 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR9_Pos (9UL) /*!< Position of SR9 field. */ #define MWU_PERREGION_SUBSTATWA_SR9_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR9_Pos) /*!< Bit mask of SR9 field. */ #define MWU_PERREGION_SUBSTATWA_SR9_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR9_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 8 : Subregion 8 in region 0 (write '1' to clear) */ +/* Bit 8 : Subregion 8 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR8_Pos (8UL) /*!< Position of SR8 field. */ #define MWU_PERREGION_SUBSTATWA_SR8_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR8_Pos) /*!< Bit mask of SR8 field. */ #define MWU_PERREGION_SUBSTATWA_SR8_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR8_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 7 : Subregion 7 in region 0 (write '1' to clear) */ +/* Bit 7 : Subregion 7 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR7_Pos (7UL) /*!< Position of SR7 field. */ #define MWU_PERREGION_SUBSTATWA_SR7_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR7_Pos) /*!< Bit mask of SR7 field. */ #define MWU_PERREGION_SUBSTATWA_SR7_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR7_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 6 : Subregion 6 in region 0 (write '1' to clear) */ +/* Bit 6 : Subregion 6 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR6_Pos (6UL) /*!< Position of SR6 field. */ #define MWU_PERREGION_SUBSTATWA_SR6_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR6_Pos) /*!< Bit mask of SR6 field. */ #define MWU_PERREGION_SUBSTATWA_SR6_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR6_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 5 : Subregion 5 in region 0 (write '1' to clear) */ +/* Bit 5 : Subregion 5 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR5_Pos (5UL) /*!< Position of SR5 field. */ #define MWU_PERREGION_SUBSTATWA_SR5_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR5_Pos) /*!< Bit mask of SR5 field. */ #define MWU_PERREGION_SUBSTATWA_SR5_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR5_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 4 : Subregion 4 in region 0 (write '1' to clear) */ +/* Bit 4 : Subregion 4 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR4_Pos (4UL) /*!< Position of SR4 field. */ #define MWU_PERREGION_SUBSTATWA_SR4_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR4_Pos) /*!< Bit mask of SR4 field. */ #define MWU_PERREGION_SUBSTATWA_SR4_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR4_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 3 : Subregion 3 in region 0 (write '1' to clear) */ +/* Bit 3 : Subregion 3 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR3_Pos (3UL) /*!< Position of SR3 field. */ #define MWU_PERREGION_SUBSTATWA_SR3_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR3_Pos) /*!< Bit mask of SR3 field. */ #define MWU_PERREGION_SUBSTATWA_SR3_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR3_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 2 : Subregion 2 in region 0 (write '1' to clear) */ +/* Bit 2 : Subregion 2 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR2_Pos (2UL) /*!< Position of SR2 field. */ #define MWU_PERREGION_SUBSTATWA_SR2_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR2_Pos) /*!< Bit mask of SR2 field. */ #define MWU_PERREGION_SUBSTATWA_SR2_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR2_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 1 : Subregion 1 in region 0 (write '1' to clear) */ +/* Bit 1 : Subregion 1 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR1_Pos (1UL) /*!< Position of SR1 field. */ #define MWU_PERREGION_SUBSTATWA_SR1_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR1_Pos) /*!< Bit mask of SR1 field. */ #define MWU_PERREGION_SUBSTATWA_SR1_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR1_Access (1UL) /*!< Write access(es) occurred in this subregion */ -/* Bit 0 : Subregion 0 in region 0 (write '1' to clear) */ +/* Bit 0 : Subregion 0 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATWA_SR0_Pos (0UL) /*!< Position of SR0 field. */ #define MWU_PERREGION_SUBSTATWA_SR0_Msk (0x1UL << MWU_PERREGION_SUBSTATWA_SR0_Pos) /*!< Bit mask of SR0 field. */ #define MWU_PERREGION_SUBSTATWA_SR0_NoAccess (0UL) /*!< No write access occurred in this subregion */ #define MWU_PERREGION_SUBSTATWA_SR0_Access (1UL) /*!< Write access(es) occurred in this subregion */ /* Register: MWU_PERREGION_SUBSTATRA */ -/* Description: Description cluster[0]: Source of event/interrupt in region 0, read access detected while corresponding subregion was enabled for watching */ +/* Description: Description cluster[n]: Source of event/interrupt in region n, read access detected while corresponding subregion was enabled for watching */ -/* Bit 31 : Subregion 31 in region 0 (write '1' to clear) */ +/* Bit 31 : Subregion 31 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR31_Pos (31UL) /*!< Position of SR31 field. */ #define MWU_PERREGION_SUBSTATRA_SR31_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR31_Pos) /*!< Bit mask of SR31 field. */ #define MWU_PERREGION_SUBSTATRA_SR31_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR31_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 30 : Subregion 30 in region 0 (write '1' to clear) */ +/* Bit 30 : Subregion 30 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR30_Pos (30UL) /*!< Position of SR30 field. */ #define MWU_PERREGION_SUBSTATRA_SR30_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR30_Pos) /*!< Bit mask of SR30 field. */ #define MWU_PERREGION_SUBSTATRA_SR30_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR30_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 29 : Subregion 29 in region 0 (write '1' to clear) */ +/* Bit 29 : Subregion 29 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR29_Pos (29UL) /*!< Position of SR29 field. */ #define MWU_PERREGION_SUBSTATRA_SR29_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR29_Pos) /*!< Bit mask of SR29 field. */ #define MWU_PERREGION_SUBSTATRA_SR29_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR29_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 28 : Subregion 28 in region 0 (write '1' to clear) */ +/* Bit 28 : Subregion 28 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR28_Pos (28UL) /*!< Position of SR28 field. */ #define MWU_PERREGION_SUBSTATRA_SR28_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR28_Pos) /*!< Bit mask of SR28 field. */ #define MWU_PERREGION_SUBSTATRA_SR28_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR28_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 27 : Subregion 27 in region 0 (write '1' to clear) */ +/* Bit 27 : Subregion 27 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR27_Pos (27UL) /*!< Position of SR27 field. */ #define MWU_PERREGION_SUBSTATRA_SR27_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR27_Pos) /*!< Bit mask of SR27 field. */ #define MWU_PERREGION_SUBSTATRA_SR27_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR27_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 26 : Subregion 26 in region 0 (write '1' to clear) */ +/* Bit 26 : Subregion 26 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR26_Pos (26UL) /*!< Position of SR26 field. */ #define MWU_PERREGION_SUBSTATRA_SR26_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR26_Pos) /*!< Bit mask of SR26 field. */ #define MWU_PERREGION_SUBSTATRA_SR26_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR26_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 25 : Subregion 25 in region 0 (write '1' to clear) */ +/* Bit 25 : Subregion 25 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR25_Pos (25UL) /*!< Position of SR25 field. */ #define MWU_PERREGION_SUBSTATRA_SR25_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR25_Pos) /*!< Bit mask of SR25 field. */ #define MWU_PERREGION_SUBSTATRA_SR25_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR25_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 24 : Subregion 24 in region 0 (write '1' to clear) */ +/* Bit 24 : Subregion 24 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR24_Pos (24UL) /*!< Position of SR24 field. */ #define MWU_PERREGION_SUBSTATRA_SR24_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR24_Pos) /*!< Bit mask of SR24 field. */ #define MWU_PERREGION_SUBSTATRA_SR24_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR24_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 23 : Subregion 23 in region 0 (write '1' to clear) */ +/* Bit 23 : Subregion 23 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR23_Pos (23UL) /*!< Position of SR23 field. */ #define MWU_PERREGION_SUBSTATRA_SR23_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR23_Pos) /*!< Bit mask of SR23 field. */ #define MWU_PERREGION_SUBSTATRA_SR23_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR23_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 22 : Subregion 22 in region 0 (write '1' to clear) */ +/* Bit 22 : Subregion 22 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR22_Pos (22UL) /*!< Position of SR22 field. */ #define MWU_PERREGION_SUBSTATRA_SR22_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR22_Pos) /*!< Bit mask of SR22 field. */ #define MWU_PERREGION_SUBSTATRA_SR22_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR22_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 21 : Subregion 21 in region 0 (write '1' to clear) */ +/* Bit 21 : Subregion 21 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR21_Pos (21UL) /*!< Position of SR21 field. */ #define MWU_PERREGION_SUBSTATRA_SR21_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR21_Pos) /*!< Bit mask of SR21 field. */ #define MWU_PERREGION_SUBSTATRA_SR21_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR21_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 20 : Subregion 20 in region 0 (write '1' to clear) */ +/* Bit 20 : Subregion 20 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR20_Pos (20UL) /*!< Position of SR20 field. */ #define MWU_PERREGION_SUBSTATRA_SR20_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR20_Pos) /*!< Bit mask of SR20 field. */ #define MWU_PERREGION_SUBSTATRA_SR20_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR20_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 19 : Subregion 19 in region 0 (write '1' to clear) */ +/* Bit 19 : Subregion 19 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR19_Pos (19UL) /*!< Position of SR19 field. */ #define MWU_PERREGION_SUBSTATRA_SR19_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR19_Pos) /*!< Bit mask of SR19 field. */ #define MWU_PERREGION_SUBSTATRA_SR19_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR19_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 18 : Subregion 18 in region 0 (write '1' to clear) */ +/* Bit 18 : Subregion 18 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR18_Pos (18UL) /*!< Position of SR18 field. */ #define MWU_PERREGION_SUBSTATRA_SR18_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR18_Pos) /*!< Bit mask of SR18 field. */ #define MWU_PERREGION_SUBSTATRA_SR18_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR18_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 17 : Subregion 17 in region 0 (write '1' to clear) */ +/* Bit 17 : Subregion 17 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR17_Pos (17UL) /*!< Position of SR17 field. */ #define MWU_PERREGION_SUBSTATRA_SR17_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR17_Pos) /*!< Bit mask of SR17 field. */ #define MWU_PERREGION_SUBSTATRA_SR17_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR17_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 16 : Subregion 16 in region 0 (write '1' to clear) */ +/* Bit 16 : Subregion 16 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR16_Pos (16UL) /*!< Position of SR16 field. */ #define MWU_PERREGION_SUBSTATRA_SR16_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR16_Pos) /*!< Bit mask of SR16 field. */ #define MWU_PERREGION_SUBSTATRA_SR16_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR16_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 15 : Subregion 15 in region 0 (write '1' to clear) */ +/* Bit 15 : Subregion 15 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR15_Pos (15UL) /*!< Position of SR15 field. */ #define MWU_PERREGION_SUBSTATRA_SR15_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR15_Pos) /*!< Bit mask of SR15 field. */ #define MWU_PERREGION_SUBSTATRA_SR15_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR15_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 14 : Subregion 14 in region 0 (write '1' to clear) */ +/* Bit 14 : Subregion 14 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR14_Pos (14UL) /*!< Position of SR14 field. */ #define MWU_PERREGION_SUBSTATRA_SR14_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR14_Pos) /*!< Bit mask of SR14 field. */ #define MWU_PERREGION_SUBSTATRA_SR14_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR14_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 13 : Subregion 13 in region 0 (write '1' to clear) */ +/* Bit 13 : Subregion 13 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR13_Pos (13UL) /*!< Position of SR13 field. */ #define MWU_PERREGION_SUBSTATRA_SR13_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR13_Pos) /*!< Bit mask of SR13 field. */ #define MWU_PERREGION_SUBSTATRA_SR13_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR13_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 12 : Subregion 12 in region 0 (write '1' to clear) */ +/* Bit 12 : Subregion 12 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR12_Pos (12UL) /*!< Position of SR12 field. */ #define MWU_PERREGION_SUBSTATRA_SR12_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR12_Pos) /*!< Bit mask of SR12 field. */ #define MWU_PERREGION_SUBSTATRA_SR12_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR12_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 11 : Subregion 11 in region 0 (write '1' to clear) */ +/* Bit 11 : Subregion 11 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR11_Pos (11UL) /*!< Position of SR11 field. */ #define MWU_PERREGION_SUBSTATRA_SR11_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR11_Pos) /*!< Bit mask of SR11 field. */ #define MWU_PERREGION_SUBSTATRA_SR11_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR11_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 10 : Subregion 10 in region 0 (write '1' to clear) */ +/* Bit 10 : Subregion 10 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR10_Pos (10UL) /*!< Position of SR10 field. */ #define MWU_PERREGION_SUBSTATRA_SR10_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR10_Pos) /*!< Bit mask of SR10 field. */ #define MWU_PERREGION_SUBSTATRA_SR10_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR10_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 9 : Subregion 9 in region 0 (write '1' to clear) */ +/* Bit 9 : Subregion 9 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR9_Pos (9UL) /*!< Position of SR9 field. */ #define MWU_PERREGION_SUBSTATRA_SR9_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR9_Pos) /*!< Bit mask of SR9 field. */ #define MWU_PERREGION_SUBSTATRA_SR9_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR9_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 8 : Subregion 8 in region 0 (write '1' to clear) */ +/* Bit 8 : Subregion 8 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR8_Pos (8UL) /*!< Position of SR8 field. */ #define MWU_PERREGION_SUBSTATRA_SR8_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR8_Pos) /*!< Bit mask of SR8 field. */ #define MWU_PERREGION_SUBSTATRA_SR8_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR8_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 7 : Subregion 7 in region 0 (write '1' to clear) */ +/* Bit 7 : Subregion 7 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR7_Pos (7UL) /*!< Position of SR7 field. */ #define MWU_PERREGION_SUBSTATRA_SR7_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR7_Pos) /*!< Bit mask of SR7 field. */ #define MWU_PERREGION_SUBSTATRA_SR7_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR7_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 6 : Subregion 6 in region 0 (write '1' to clear) */ +/* Bit 6 : Subregion 6 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR6_Pos (6UL) /*!< Position of SR6 field. */ #define MWU_PERREGION_SUBSTATRA_SR6_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR6_Pos) /*!< Bit mask of SR6 field. */ #define MWU_PERREGION_SUBSTATRA_SR6_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR6_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 5 : Subregion 5 in region 0 (write '1' to clear) */ +/* Bit 5 : Subregion 5 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR5_Pos (5UL) /*!< Position of SR5 field. */ #define MWU_PERREGION_SUBSTATRA_SR5_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR5_Pos) /*!< Bit mask of SR5 field. */ #define MWU_PERREGION_SUBSTATRA_SR5_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR5_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 4 : Subregion 4 in region 0 (write '1' to clear) */ +/* Bit 4 : Subregion 4 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR4_Pos (4UL) /*!< Position of SR4 field. */ #define MWU_PERREGION_SUBSTATRA_SR4_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR4_Pos) /*!< Bit mask of SR4 field. */ #define MWU_PERREGION_SUBSTATRA_SR4_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR4_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 3 : Subregion 3 in region 0 (write '1' to clear) */ +/* Bit 3 : Subregion 3 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR3_Pos (3UL) /*!< Position of SR3 field. */ #define MWU_PERREGION_SUBSTATRA_SR3_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR3_Pos) /*!< Bit mask of SR3 field. */ #define MWU_PERREGION_SUBSTATRA_SR3_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR3_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 2 : Subregion 2 in region 0 (write '1' to clear) */ +/* Bit 2 : Subregion 2 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR2_Pos (2UL) /*!< Position of SR2 field. */ #define MWU_PERREGION_SUBSTATRA_SR2_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR2_Pos) /*!< Bit mask of SR2 field. */ #define MWU_PERREGION_SUBSTATRA_SR2_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR2_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 1 : Subregion 1 in region 0 (write '1' to clear) */ +/* Bit 1 : Subregion 1 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR1_Pos (1UL) /*!< Position of SR1 field. */ #define MWU_PERREGION_SUBSTATRA_SR1_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR1_Pos) /*!< Bit mask of SR1 field. */ #define MWU_PERREGION_SUBSTATRA_SR1_NoAccess (0UL) /*!< No read access occurred in this subregion */ #define MWU_PERREGION_SUBSTATRA_SR1_Access (1UL) /*!< Read access(es) occurred in this subregion */ -/* Bit 0 : Subregion 0 in region 0 (write '1' to clear) */ +/* Bit 0 : Subregion 0 in region n (write '1' to clear) */ #define MWU_PERREGION_SUBSTATRA_SR0_Pos (0UL) /*!< Position of SR0 field. */ #define MWU_PERREGION_SUBSTATRA_SR0_Msk (0x1UL << MWU_PERREGION_SUBSTATRA_SR0_Pos) /*!< Bit mask of SR0 field. */ #define MWU_PERREGION_SUBSTATRA_SR0_NoAccess (0UL) /*!< No read access occurred in this subregion */ @@ -3259,35 +3809,35 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define MWU_REGIONENCLR_RGN0WA_Clear (1UL) /*!< Disable write access watch in this region */ /* Register: MWU_REGION_START */ -/* Description: Description cluster[0]: Start address for region 0 */ +/* Description: Description cluster[n]: Start address for region n */ /* Bits 31..0 : Start address for region */ #define MWU_REGION_START_START_Pos (0UL) /*!< Position of START field. */ #define MWU_REGION_START_START_Msk (0xFFFFFFFFUL << MWU_REGION_START_START_Pos) /*!< Bit mask of START field. */ /* Register: MWU_REGION_END */ -/* Description: Description cluster[0]: End address of region 0 */ +/* Description: Description cluster[n]: End address of region n */ /* Bits 31..0 : End address of region. */ #define MWU_REGION_END_END_Pos (0UL) /*!< Position of END field. */ #define MWU_REGION_END_END_Msk (0xFFFFFFFFUL << MWU_REGION_END_END_Pos) /*!< Bit mask of END field. */ /* Register: MWU_PREGION_START */ -/* Description: Description cluster[0]: Reserved for future use */ +/* Description: Description cluster[n]: Reserved for future use */ /* Bits 31..0 : Reserved for future use */ #define MWU_PREGION_START_START_Pos (0UL) /*!< Position of START field. */ #define MWU_PREGION_START_START_Msk (0xFFFFFFFFUL << MWU_PREGION_START_START_Pos) /*!< Bit mask of START field. */ /* Register: MWU_PREGION_END */ -/* Description: Description cluster[0]: Reserved for future use */ +/* Description: Description cluster[n]: Reserved for future use */ /* Bits 31..0 : Reserved for future use */ #define MWU_PREGION_END_END_Pos (0UL) /*!< Position of END field. */ #define MWU_PREGION_END_END_Msk (0xFFFFFFFFUL << MWU_PREGION_END_END_Pos) /*!< Bit mask of END field. */ /* Register: MWU_PREGION_SUBS */ -/* Description: Description cluster[0]: Subregions of region 0 */ +/* Description: Description cluster[n]: Subregions of region n */ /* Bit 31 : Include or exclude subregion 31 in region */ #define MWU_PREGION_SUBS_SR31_Pos (31UL) /*!< Position of SR31 field. */ @@ -3485,6 +4035,160 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: NFCT */ /* Description: NFC-A compatible radio */ +/* Register: NFCT_TASKS_ACTIVATE */ +/* Description: Activate NFCT peripheral for incoming and outgoing frames, change state to activated */ + +/* Bit 0 : */ +#define NFCT_TASKS_ACTIVATE_TASKS_ACTIVATE_Pos (0UL) /*!< Position of TASKS_ACTIVATE field. */ +#define NFCT_TASKS_ACTIVATE_TASKS_ACTIVATE_Msk (0x1UL << NFCT_TASKS_ACTIVATE_TASKS_ACTIVATE_Pos) /*!< Bit mask of TASKS_ACTIVATE field. */ + +/* Register: NFCT_TASKS_DISABLE */ +/* Description: Disable NFCT peripheral */ + +/* Bit 0 : */ +#define NFCT_TASKS_DISABLE_TASKS_DISABLE_Pos (0UL) /*!< Position of TASKS_DISABLE field. */ +#define NFCT_TASKS_DISABLE_TASKS_DISABLE_Msk (0x1UL << NFCT_TASKS_DISABLE_TASKS_DISABLE_Pos) /*!< Bit mask of TASKS_DISABLE field. */ + +/* Register: NFCT_TASKS_SENSE */ +/* Description: Enable NFC sense field mode, change state to sense mode */ + +/* Bit 0 : */ +#define NFCT_TASKS_SENSE_TASKS_SENSE_Pos (0UL) /*!< Position of TASKS_SENSE field. */ +#define NFCT_TASKS_SENSE_TASKS_SENSE_Msk (0x1UL << NFCT_TASKS_SENSE_TASKS_SENSE_Pos) /*!< Bit mask of TASKS_SENSE field. */ + +/* Register: NFCT_TASKS_STARTTX */ +/* Description: Start transmission of an outgoing frame, change state to transmit */ + +/* Bit 0 : */ +#define NFCT_TASKS_STARTTX_TASKS_STARTTX_Pos (0UL) /*!< Position of TASKS_STARTTX field. */ +#define NFCT_TASKS_STARTTX_TASKS_STARTTX_Msk (0x1UL << NFCT_TASKS_STARTTX_TASKS_STARTTX_Pos) /*!< Bit mask of TASKS_STARTTX field. */ + +/* Register: NFCT_TASKS_ENABLERXDATA */ +/* Description: Initializes the EasyDMA for receive. */ + +/* Bit 0 : */ +#define NFCT_TASKS_ENABLERXDATA_TASKS_ENABLERXDATA_Pos (0UL) /*!< Position of TASKS_ENABLERXDATA field. */ +#define NFCT_TASKS_ENABLERXDATA_TASKS_ENABLERXDATA_Msk (0x1UL << NFCT_TASKS_ENABLERXDATA_TASKS_ENABLERXDATA_Pos) /*!< Bit mask of TASKS_ENABLERXDATA field. */ + +/* Register: NFCT_TASKS_GOIDLE */ +/* Description: Force state machine to IDLE state */ + +/* Bit 0 : */ +#define NFCT_TASKS_GOIDLE_TASKS_GOIDLE_Pos (0UL) /*!< Position of TASKS_GOIDLE field. */ +#define NFCT_TASKS_GOIDLE_TASKS_GOIDLE_Msk (0x1UL << NFCT_TASKS_GOIDLE_TASKS_GOIDLE_Pos) /*!< Bit mask of TASKS_GOIDLE field. */ + +/* Register: NFCT_TASKS_GOSLEEP */ +/* Description: Force state machine to SLEEP_A state */ + +/* Bit 0 : */ +#define NFCT_TASKS_GOSLEEP_TASKS_GOSLEEP_Pos (0UL) /*!< Position of TASKS_GOSLEEP field. */ +#define NFCT_TASKS_GOSLEEP_TASKS_GOSLEEP_Msk (0x1UL << NFCT_TASKS_GOSLEEP_TASKS_GOSLEEP_Pos) /*!< Bit mask of TASKS_GOSLEEP field. */ + +/* Register: NFCT_EVENTS_READY */ +/* Description: The NFCT peripheral is ready to receive and send frames */ + +/* Bit 0 : */ +#define NFCT_EVENTS_READY_EVENTS_READY_Pos (0UL) /*!< Position of EVENTS_READY field. */ +#define NFCT_EVENTS_READY_EVENTS_READY_Msk (0x1UL << NFCT_EVENTS_READY_EVENTS_READY_Pos) /*!< Bit mask of EVENTS_READY field. */ + +/* Register: NFCT_EVENTS_FIELDDETECTED */ +/* Description: Remote NFC field detected */ + +/* Bit 0 : */ +#define NFCT_EVENTS_FIELDDETECTED_EVENTS_FIELDDETECTED_Pos (0UL) /*!< Position of EVENTS_FIELDDETECTED field. */ +#define NFCT_EVENTS_FIELDDETECTED_EVENTS_FIELDDETECTED_Msk (0x1UL << NFCT_EVENTS_FIELDDETECTED_EVENTS_FIELDDETECTED_Pos) /*!< Bit mask of EVENTS_FIELDDETECTED field. */ + +/* Register: NFCT_EVENTS_FIELDLOST */ +/* Description: Remote NFC field lost */ + +/* Bit 0 : */ +#define NFCT_EVENTS_FIELDLOST_EVENTS_FIELDLOST_Pos (0UL) /*!< Position of EVENTS_FIELDLOST field. */ +#define NFCT_EVENTS_FIELDLOST_EVENTS_FIELDLOST_Msk (0x1UL << NFCT_EVENTS_FIELDLOST_EVENTS_FIELDLOST_Pos) /*!< Bit mask of EVENTS_FIELDLOST field. */ + +/* Register: NFCT_EVENTS_TXFRAMESTART */ +/* Description: Marks the start of the first symbol of a transmitted frame */ + +/* Bit 0 : */ +#define NFCT_EVENTS_TXFRAMESTART_EVENTS_TXFRAMESTART_Pos (0UL) /*!< Position of EVENTS_TXFRAMESTART field. */ +#define NFCT_EVENTS_TXFRAMESTART_EVENTS_TXFRAMESTART_Msk (0x1UL << NFCT_EVENTS_TXFRAMESTART_EVENTS_TXFRAMESTART_Pos) /*!< Bit mask of EVENTS_TXFRAMESTART field. */ + +/* Register: NFCT_EVENTS_TXFRAMEEND */ +/* Description: Marks the end of the last transmitted on-air symbol of a frame */ + +/* Bit 0 : */ +#define NFCT_EVENTS_TXFRAMEEND_EVENTS_TXFRAMEEND_Pos (0UL) /*!< Position of EVENTS_TXFRAMEEND field. */ +#define NFCT_EVENTS_TXFRAMEEND_EVENTS_TXFRAMEEND_Msk (0x1UL << NFCT_EVENTS_TXFRAMEEND_EVENTS_TXFRAMEEND_Pos) /*!< Bit mask of EVENTS_TXFRAMEEND field. */ + +/* Register: NFCT_EVENTS_RXFRAMESTART */ +/* Description: Marks the end of the first symbol of a received frame */ + +/* Bit 0 : */ +#define NFCT_EVENTS_RXFRAMESTART_EVENTS_RXFRAMESTART_Pos (0UL) /*!< Position of EVENTS_RXFRAMESTART field. */ +#define NFCT_EVENTS_RXFRAMESTART_EVENTS_RXFRAMESTART_Msk (0x1UL << NFCT_EVENTS_RXFRAMESTART_EVENTS_RXFRAMESTART_Pos) /*!< Bit mask of EVENTS_RXFRAMESTART field. */ + +/* Register: NFCT_EVENTS_RXFRAMEEND */ +/* Description: Received data has been checked (CRC, parity) and transferred to RAM, and EasyDMA has ended accessing the RX buffer */ + +/* Bit 0 : */ +#define NFCT_EVENTS_RXFRAMEEND_EVENTS_RXFRAMEEND_Pos (0UL) /*!< Position of EVENTS_RXFRAMEEND field. */ +#define NFCT_EVENTS_RXFRAMEEND_EVENTS_RXFRAMEEND_Msk (0x1UL << NFCT_EVENTS_RXFRAMEEND_EVENTS_RXFRAMEEND_Pos) /*!< Bit mask of EVENTS_RXFRAMEEND field. */ + +/* Register: NFCT_EVENTS_ERROR */ +/* Description: NFC error reported. The ERRORSTATUS register contains details on the source of the error. */ + +/* Bit 0 : */ +#define NFCT_EVENTS_ERROR_EVENTS_ERROR_Pos (0UL) /*!< Position of EVENTS_ERROR field. */ +#define NFCT_EVENTS_ERROR_EVENTS_ERROR_Msk (0x1UL << NFCT_EVENTS_ERROR_EVENTS_ERROR_Pos) /*!< Bit mask of EVENTS_ERROR field. */ + +/* Register: NFCT_EVENTS_RXERROR */ +/* Description: NFC RX frame error reported. The FRAMESTATUS.RX register contains details on the source of the error. */ + +/* Bit 0 : */ +#define NFCT_EVENTS_RXERROR_EVENTS_RXERROR_Pos (0UL) /*!< Position of EVENTS_RXERROR field. */ +#define NFCT_EVENTS_RXERROR_EVENTS_RXERROR_Msk (0x1UL << NFCT_EVENTS_RXERROR_EVENTS_RXERROR_Pos) /*!< Bit mask of EVENTS_RXERROR field. */ + +/* Register: NFCT_EVENTS_ENDRX */ +/* Description: RX buffer (as defined by PACKETPTR and MAXLEN) in Data RAM full. */ + +/* Bit 0 : */ +#define NFCT_EVENTS_ENDRX_EVENTS_ENDRX_Pos (0UL) /*!< Position of EVENTS_ENDRX field. */ +#define NFCT_EVENTS_ENDRX_EVENTS_ENDRX_Msk (0x1UL << NFCT_EVENTS_ENDRX_EVENTS_ENDRX_Pos) /*!< Bit mask of EVENTS_ENDRX field. */ + +/* Register: NFCT_EVENTS_ENDTX */ +/* Description: Transmission of data in RAM has ended, and EasyDMA has ended accessing the TX buffer */ + +/* Bit 0 : */ +#define NFCT_EVENTS_ENDTX_EVENTS_ENDTX_Pos (0UL) /*!< Position of EVENTS_ENDTX field. */ +#define NFCT_EVENTS_ENDTX_EVENTS_ENDTX_Msk (0x1UL << NFCT_EVENTS_ENDTX_EVENTS_ENDTX_Pos) /*!< Bit mask of EVENTS_ENDTX field. */ + +/* Register: NFCT_EVENTS_AUTOCOLRESSTARTED */ +/* Description: Auto collision resolution process has started */ + +/* Bit 0 : */ +#define NFCT_EVENTS_AUTOCOLRESSTARTED_EVENTS_AUTOCOLRESSTARTED_Pos (0UL) /*!< Position of EVENTS_AUTOCOLRESSTARTED field. */ +#define NFCT_EVENTS_AUTOCOLRESSTARTED_EVENTS_AUTOCOLRESSTARTED_Msk (0x1UL << NFCT_EVENTS_AUTOCOLRESSTARTED_EVENTS_AUTOCOLRESSTARTED_Pos) /*!< Bit mask of EVENTS_AUTOCOLRESSTARTED field. */ + +/* Register: NFCT_EVENTS_COLLISION */ +/* Description: NFC auto collision resolution error reported. */ + +/* Bit 0 : */ +#define NFCT_EVENTS_COLLISION_EVENTS_COLLISION_Pos (0UL) /*!< Position of EVENTS_COLLISION field. */ +#define NFCT_EVENTS_COLLISION_EVENTS_COLLISION_Msk (0x1UL << NFCT_EVENTS_COLLISION_EVENTS_COLLISION_Pos) /*!< Bit mask of EVENTS_COLLISION field. */ + +/* Register: NFCT_EVENTS_SELECTED */ +/* Description: NFC auto collision resolution successfully completed */ + +/* Bit 0 : */ +#define NFCT_EVENTS_SELECTED_EVENTS_SELECTED_Pos (0UL) /*!< Position of EVENTS_SELECTED field. */ +#define NFCT_EVENTS_SELECTED_EVENTS_SELECTED_Msk (0x1UL << NFCT_EVENTS_SELECTED_EVENTS_SELECTED_Pos) /*!< Bit mask of EVENTS_SELECTED field. */ + +/* Register: NFCT_EVENTS_STARTED */ +/* Description: EasyDMA is ready to receive or send frames. */ + +/* Bit 0 : */ +#define NFCT_EVENTS_STARTED_EVENTS_STARTED_Pos (0UL) /*!< Position of EVENTS_STARTED field. */ +#define NFCT_EVENTS_STARTED_EVENTS_STARTED_Msk (0x1UL << NFCT_EVENTS_STARTED_EVENTS_STARTED_Pos) /*!< Bit mask of EVENTS_STARTED field. */ + /* Register: NFCT_SHORTS */ /* Description: Shortcut register */ @@ -3602,105 +4306,105 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: NFCT_INTENSET */ /* Description: Enable interrupt */ -/* Bit 20 : Write '1' to Enable interrupt for STARTED event */ +/* Bit 20 : Write '1' to enable interrupt for STARTED event */ #define NFCT_INTENSET_STARTED_Pos (20UL) /*!< Position of STARTED field. */ #define NFCT_INTENSET_STARTED_Msk (0x1UL << NFCT_INTENSET_STARTED_Pos) /*!< Bit mask of STARTED field. */ #define NFCT_INTENSET_STARTED_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENSET_STARTED_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENSET_STARTED_Set (1UL) /*!< Enable */ -/* Bit 19 : Write '1' to Enable interrupt for SELECTED event */ +/* Bit 19 : Write '1' to enable interrupt for SELECTED event */ #define NFCT_INTENSET_SELECTED_Pos (19UL) /*!< Position of SELECTED field. */ #define NFCT_INTENSET_SELECTED_Msk (0x1UL << NFCT_INTENSET_SELECTED_Pos) /*!< Bit mask of SELECTED field. */ #define NFCT_INTENSET_SELECTED_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENSET_SELECTED_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENSET_SELECTED_Set (1UL) /*!< Enable */ -/* Bit 18 : Write '1' to Enable interrupt for COLLISION event */ +/* Bit 18 : Write '1' to enable interrupt for COLLISION event */ #define NFCT_INTENSET_COLLISION_Pos (18UL) /*!< Position of COLLISION field. */ #define NFCT_INTENSET_COLLISION_Msk (0x1UL << NFCT_INTENSET_COLLISION_Pos) /*!< Bit mask of COLLISION field. */ #define NFCT_INTENSET_COLLISION_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENSET_COLLISION_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENSET_COLLISION_Set (1UL) /*!< Enable */ -/* Bit 14 : Write '1' to Enable interrupt for AUTOCOLRESSTARTED event */ +/* Bit 14 : Write '1' to enable interrupt for AUTOCOLRESSTARTED event */ #define NFCT_INTENSET_AUTOCOLRESSTARTED_Pos (14UL) /*!< Position of AUTOCOLRESSTARTED field. */ #define NFCT_INTENSET_AUTOCOLRESSTARTED_Msk (0x1UL << NFCT_INTENSET_AUTOCOLRESSTARTED_Pos) /*!< Bit mask of AUTOCOLRESSTARTED field. */ #define NFCT_INTENSET_AUTOCOLRESSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENSET_AUTOCOLRESSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENSET_AUTOCOLRESSTARTED_Set (1UL) /*!< Enable */ -/* Bit 12 : Write '1' to Enable interrupt for ENDTX event */ +/* Bit 12 : Write '1' to enable interrupt for ENDTX event */ #define NFCT_INTENSET_ENDTX_Pos (12UL) /*!< Position of ENDTX field. */ #define NFCT_INTENSET_ENDTX_Msk (0x1UL << NFCT_INTENSET_ENDTX_Pos) /*!< Bit mask of ENDTX field. */ #define NFCT_INTENSET_ENDTX_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENSET_ENDTX_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENSET_ENDTX_Set (1UL) /*!< Enable */ -/* Bit 11 : Write '1' to Enable interrupt for ENDRX event */ +/* Bit 11 : Write '1' to enable interrupt for ENDRX event */ #define NFCT_INTENSET_ENDRX_Pos (11UL) /*!< Position of ENDRX field. */ #define NFCT_INTENSET_ENDRX_Msk (0x1UL << NFCT_INTENSET_ENDRX_Pos) /*!< Bit mask of ENDRX field. */ #define NFCT_INTENSET_ENDRX_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENSET_ENDRX_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENSET_ENDRX_Set (1UL) /*!< Enable */ -/* Bit 10 : Write '1' to Enable interrupt for RXERROR event */ +/* Bit 10 : Write '1' to enable interrupt for RXERROR event */ #define NFCT_INTENSET_RXERROR_Pos (10UL) /*!< Position of RXERROR field. */ #define NFCT_INTENSET_RXERROR_Msk (0x1UL << NFCT_INTENSET_RXERROR_Pos) /*!< Bit mask of RXERROR field. */ #define NFCT_INTENSET_RXERROR_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENSET_RXERROR_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENSET_RXERROR_Set (1UL) /*!< Enable */ -/* Bit 7 : Write '1' to Enable interrupt for ERROR event */ +/* Bit 7 : Write '1' to enable interrupt for ERROR event */ #define NFCT_INTENSET_ERROR_Pos (7UL) /*!< Position of ERROR field. */ #define NFCT_INTENSET_ERROR_Msk (0x1UL << NFCT_INTENSET_ERROR_Pos) /*!< Bit mask of ERROR field. */ #define NFCT_INTENSET_ERROR_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENSET_ERROR_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENSET_ERROR_Set (1UL) /*!< Enable */ -/* Bit 6 : Write '1' to Enable interrupt for RXFRAMEEND event */ +/* Bit 6 : Write '1' to enable interrupt for RXFRAMEEND event */ #define NFCT_INTENSET_RXFRAMEEND_Pos (6UL) /*!< Position of RXFRAMEEND field. */ #define NFCT_INTENSET_RXFRAMEEND_Msk (0x1UL << NFCT_INTENSET_RXFRAMEEND_Pos) /*!< Bit mask of RXFRAMEEND field. */ #define NFCT_INTENSET_RXFRAMEEND_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENSET_RXFRAMEEND_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENSET_RXFRAMEEND_Set (1UL) /*!< Enable */ -/* Bit 5 : Write '1' to Enable interrupt for RXFRAMESTART event */ +/* Bit 5 : Write '1' to enable interrupt for RXFRAMESTART event */ #define NFCT_INTENSET_RXFRAMESTART_Pos (5UL) /*!< Position of RXFRAMESTART field. */ #define NFCT_INTENSET_RXFRAMESTART_Msk (0x1UL << NFCT_INTENSET_RXFRAMESTART_Pos) /*!< Bit mask of RXFRAMESTART field. */ #define NFCT_INTENSET_RXFRAMESTART_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENSET_RXFRAMESTART_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENSET_RXFRAMESTART_Set (1UL) /*!< Enable */ -/* Bit 4 : Write '1' to Enable interrupt for TXFRAMEEND event */ +/* Bit 4 : Write '1' to enable interrupt for TXFRAMEEND event */ #define NFCT_INTENSET_TXFRAMEEND_Pos (4UL) /*!< Position of TXFRAMEEND field. */ #define NFCT_INTENSET_TXFRAMEEND_Msk (0x1UL << NFCT_INTENSET_TXFRAMEEND_Pos) /*!< Bit mask of TXFRAMEEND field. */ #define NFCT_INTENSET_TXFRAMEEND_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENSET_TXFRAMEEND_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENSET_TXFRAMEEND_Set (1UL) /*!< Enable */ -/* Bit 3 : Write '1' to Enable interrupt for TXFRAMESTART event */ +/* Bit 3 : Write '1' to enable interrupt for TXFRAMESTART event */ #define NFCT_INTENSET_TXFRAMESTART_Pos (3UL) /*!< Position of TXFRAMESTART field. */ #define NFCT_INTENSET_TXFRAMESTART_Msk (0x1UL << NFCT_INTENSET_TXFRAMESTART_Pos) /*!< Bit mask of TXFRAMESTART field. */ #define NFCT_INTENSET_TXFRAMESTART_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENSET_TXFRAMESTART_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENSET_TXFRAMESTART_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for FIELDLOST event */ +/* Bit 2 : Write '1' to enable interrupt for FIELDLOST event */ #define NFCT_INTENSET_FIELDLOST_Pos (2UL) /*!< Position of FIELDLOST field. */ #define NFCT_INTENSET_FIELDLOST_Msk (0x1UL << NFCT_INTENSET_FIELDLOST_Pos) /*!< Bit mask of FIELDLOST field. */ #define NFCT_INTENSET_FIELDLOST_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENSET_FIELDLOST_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENSET_FIELDLOST_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for FIELDDETECTED event */ +/* Bit 1 : Write '1' to enable interrupt for FIELDDETECTED event */ #define NFCT_INTENSET_FIELDDETECTED_Pos (1UL) /*!< Position of FIELDDETECTED field. */ #define NFCT_INTENSET_FIELDDETECTED_Msk (0x1UL << NFCT_INTENSET_FIELDDETECTED_Pos) /*!< Bit mask of FIELDDETECTED field. */ #define NFCT_INTENSET_FIELDDETECTED_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENSET_FIELDDETECTED_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENSET_FIELDDETECTED_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for READY event */ +/* Bit 0 : Write '1' to enable interrupt for READY event */ #define NFCT_INTENSET_READY_Pos (0UL) /*!< Position of READY field. */ #define NFCT_INTENSET_READY_Msk (0x1UL << NFCT_INTENSET_READY_Pos) /*!< Bit mask of READY field. */ #define NFCT_INTENSET_READY_Disabled (0UL) /*!< Read: Disabled */ @@ -3710,105 +4414,105 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: NFCT_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 20 : Write '1' to Disable interrupt for STARTED event */ +/* Bit 20 : Write '1' to disable interrupt for STARTED event */ #define NFCT_INTENCLR_STARTED_Pos (20UL) /*!< Position of STARTED field. */ #define NFCT_INTENCLR_STARTED_Msk (0x1UL << NFCT_INTENCLR_STARTED_Pos) /*!< Bit mask of STARTED field. */ #define NFCT_INTENCLR_STARTED_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENCLR_STARTED_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENCLR_STARTED_Clear (1UL) /*!< Disable */ -/* Bit 19 : Write '1' to Disable interrupt for SELECTED event */ +/* Bit 19 : Write '1' to disable interrupt for SELECTED event */ #define NFCT_INTENCLR_SELECTED_Pos (19UL) /*!< Position of SELECTED field. */ #define NFCT_INTENCLR_SELECTED_Msk (0x1UL << NFCT_INTENCLR_SELECTED_Pos) /*!< Bit mask of SELECTED field. */ #define NFCT_INTENCLR_SELECTED_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENCLR_SELECTED_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENCLR_SELECTED_Clear (1UL) /*!< Disable */ -/* Bit 18 : Write '1' to Disable interrupt for COLLISION event */ +/* Bit 18 : Write '1' to disable interrupt for COLLISION event */ #define NFCT_INTENCLR_COLLISION_Pos (18UL) /*!< Position of COLLISION field. */ #define NFCT_INTENCLR_COLLISION_Msk (0x1UL << NFCT_INTENCLR_COLLISION_Pos) /*!< Bit mask of COLLISION field. */ #define NFCT_INTENCLR_COLLISION_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENCLR_COLLISION_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENCLR_COLLISION_Clear (1UL) /*!< Disable */ -/* Bit 14 : Write '1' to Disable interrupt for AUTOCOLRESSTARTED event */ +/* Bit 14 : Write '1' to disable interrupt for AUTOCOLRESSTARTED event */ #define NFCT_INTENCLR_AUTOCOLRESSTARTED_Pos (14UL) /*!< Position of AUTOCOLRESSTARTED field. */ #define NFCT_INTENCLR_AUTOCOLRESSTARTED_Msk (0x1UL << NFCT_INTENCLR_AUTOCOLRESSTARTED_Pos) /*!< Bit mask of AUTOCOLRESSTARTED field. */ #define NFCT_INTENCLR_AUTOCOLRESSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENCLR_AUTOCOLRESSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENCLR_AUTOCOLRESSTARTED_Clear (1UL) /*!< Disable */ -/* Bit 12 : Write '1' to Disable interrupt for ENDTX event */ +/* Bit 12 : Write '1' to disable interrupt for ENDTX event */ #define NFCT_INTENCLR_ENDTX_Pos (12UL) /*!< Position of ENDTX field. */ #define NFCT_INTENCLR_ENDTX_Msk (0x1UL << NFCT_INTENCLR_ENDTX_Pos) /*!< Bit mask of ENDTX field. */ #define NFCT_INTENCLR_ENDTX_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENCLR_ENDTX_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENCLR_ENDTX_Clear (1UL) /*!< Disable */ -/* Bit 11 : Write '1' to Disable interrupt for ENDRX event */ +/* Bit 11 : Write '1' to disable interrupt for ENDRX event */ #define NFCT_INTENCLR_ENDRX_Pos (11UL) /*!< Position of ENDRX field. */ #define NFCT_INTENCLR_ENDRX_Msk (0x1UL << NFCT_INTENCLR_ENDRX_Pos) /*!< Bit mask of ENDRX field. */ #define NFCT_INTENCLR_ENDRX_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENCLR_ENDRX_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENCLR_ENDRX_Clear (1UL) /*!< Disable */ -/* Bit 10 : Write '1' to Disable interrupt for RXERROR event */ +/* Bit 10 : Write '1' to disable interrupt for RXERROR event */ #define NFCT_INTENCLR_RXERROR_Pos (10UL) /*!< Position of RXERROR field. */ #define NFCT_INTENCLR_RXERROR_Msk (0x1UL << NFCT_INTENCLR_RXERROR_Pos) /*!< Bit mask of RXERROR field. */ #define NFCT_INTENCLR_RXERROR_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENCLR_RXERROR_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENCLR_RXERROR_Clear (1UL) /*!< Disable */ -/* Bit 7 : Write '1' to Disable interrupt for ERROR event */ +/* Bit 7 : Write '1' to disable interrupt for ERROR event */ #define NFCT_INTENCLR_ERROR_Pos (7UL) /*!< Position of ERROR field. */ #define NFCT_INTENCLR_ERROR_Msk (0x1UL << NFCT_INTENCLR_ERROR_Pos) /*!< Bit mask of ERROR field. */ #define NFCT_INTENCLR_ERROR_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENCLR_ERROR_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENCLR_ERROR_Clear (1UL) /*!< Disable */ -/* Bit 6 : Write '1' to Disable interrupt for RXFRAMEEND event */ +/* Bit 6 : Write '1' to disable interrupt for RXFRAMEEND event */ #define NFCT_INTENCLR_RXFRAMEEND_Pos (6UL) /*!< Position of RXFRAMEEND field. */ #define NFCT_INTENCLR_RXFRAMEEND_Msk (0x1UL << NFCT_INTENCLR_RXFRAMEEND_Pos) /*!< Bit mask of RXFRAMEEND field. */ #define NFCT_INTENCLR_RXFRAMEEND_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENCLR_RXFRAMEEND_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENCLR_RXFRAMEEND_Clear (1UL) /*!< Disable */ -/* Bit 5 : Write '1' to Disable interrupt for RXFRAMESTART event */ +/* Bit 5 : Write '1' to disable interrupt for RXFRAMESTART event */ #define NFCT_INTENCLR_RXFRAMESTART_Pos (5UL) /*!< Position of RXFRAMESTART field. */ #define NFCT_INTENCLR_RXFRAMESTART_Msk (0x1UL << NFCT_INTENCLR_RXFRAMESTART_Pos) /*!< Bit mask of RXFRAMESTART field. */ #define NFCT_INTENCLR_RXFRAMESTART_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENCLR_RXFRAMESTART_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENCLR_RXFRAMESTART_Clear (1UL) /*!< Disable */ -/* Bit 4 : Write '1' to Disable interrupt for TXFRAMEEND event */ +/* Bit 4 : Write '1' to disable interrupt for TXFRAMEEND event */ #define NFCT_INTENCLR_TXFRAMEEND_Pos (4UL) /*!< Position of TXFRAMEEND field. */ #define NFCT_INTENCLR_TXFRAMEEND_Msk (0x1UL << NFCT_INTENCLR_TXFRAMEEND_Pos) /*!< Bit mask of TXFRAMEEND field. */ #define NFCT_INTENCLR_TXFRAMEEND_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENCLR_TXFRAMEEND_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENCLR_TXFRAMEEND_Clear (1UL) /*!< Disable */ -/* Bit 3 : Write '1' to Disable interrupt for TXFRAMESTART event */ +/* Bit 3 : Write '1' to disable interrupt for TXFRAMESTART event */ #define NFCT_INTENCLR_TXFRAMESTART_Pos (3UL) /*!< Position of TXFRAMESTART field. */ #define NFCT_INTENCLR_TXFRAMESTART_Msk (0x1UL << NFCT_INTENCLR_TXFRAMESTART_Pos) /*!< Bit mask of TXFRAMESTART field. */ #define NFCT_INTENCLR_TXFRAMESTART_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENCLR_TXFRAMESTART_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENCLR_TXFRAMESTART_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for FIELDLOST event */ +/* Bit 2 : Write '1' to disable interrupt for FIELDLOST event */ #define NFCT_INTENCLR_FIELDLOST_Pos (2UL) /*!< Position of FIELDLOST field. */ #define NFCT_INTENCLR_FIELDLOST_Msk (0x1UL << NFCT_INTENCLR_FIELDLOST_Pos) /*!< Bit mask of FIELDLOST field. */ #define NFCT_INTENCLR_FIELDLOST_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENCLR_FIELDLOST_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENCLR_FIELDLOST_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for FIELDDETECTED event */ +/* Bit 1 : Write '1' to disable interrupt for FIELDDETECTED event */ #define NFCT_INTENCLR_FIELDDETECTED_Pos (1UL) /*!< Position of FIELDDETECTED field. */ #define NFCT_INTENCLR_FIELDDETECTED_Msk (0x1UL << NFCT_INTENCLR_FIELDDETECTED_Pos) /*!< Bit mask of FIELDDETECTED field. */ #define NFCT_INTENCLR_FIELDDETECTED_Disabled (0UL) /*!< Read: Disabled */ #define NFCT_INTENCLR_FIELDDETECTED_Enabled (1UL) /*!< Read: Enabled */ #define NFCT_INTENCLR_FIELDDETECTED_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for READY event */ +/* Bit 0 : Write '1' to disable interrupt for READY event */ #define NFCT_INTENCLR_READY_Pos (0UL) /*!< Position of READY field. */ #define NFCT_INTENCLR_READY_Msk (0x1UL << NFCT_INTENCLR_READY_Pos) /*!< Bit mask of READY field. */ #define NFCT_INTENCLR_READY_Disabled (0UL) /*!< Read: Disabled */ @@ -3856,6 +4560,17 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define NFCT_NFCTAGSTATE_NFCTAGSTATE_FrameDelay (5UL) /*!< FrameDelay */ #define NFCT_NFCTAGSTATE_NFCTAGSTATE_Transmit (6UL) /*!< Transmit */ +/* Register: NFCT_SLEEPSTATE */ +/* Description: Sleep state during automatic collision resolution */ + +/* Bit 0 : Reflects the sleep state during automatic collision resolution. Set to IDLE + by a GOIDLE task. Set to SLEEP_A when a valid SLEEP_REQ frame is received or by a + GOSLEEP task. */ +#define NFCT_SLEEPSTATE_SLEEPSTATE_Pos (0UL) /*!< Position of SLEEPSTATE field. */ +#define NFCT_SLEEPSTATE_SLEEPSTATE_Msk (0x1UL << NFCT_SLEEPSTATE_SLEEPSTATE_Pos) /*!< Bit mask of SLEEPSTATE field. */ +#define NFCT_SLEEPSTATE_SLEEPSTATE_Idle (0UL) /*!< State is IDLE. */ +#define NFCT_SLEEPSTATE_SLEEPSTATE_SleepA (1UL) /*!< State is SLEEP_A. */ + /* Register: NFCT_FIELDPRESENT */ /* Description: Indicates the presence or not of a valid field */ @@ -4125,13 +4840,6 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define NVMC_CONFIG_WEN_Wen (1UL) /*!< Write enabled */ #define NVMC_CONFIG_WEN_Een (2UL) /*!< Erase enabled */ -/* Register: NVMC_ERASEPCR1 */ -/* Description: Deprecated register - Register for erasing a page in code area. Equivalent to ERASEPAGE. */ - -/* Bits 31..0 : Register for erasing a page in code area. Equivalent to ERASEPAGE. */ -#define NVMC_ERASEPCR1_ERASEPCR1_Pos (0UL) /*!< Position of ERASEPCR1 field. */ -#define NVMC_ERASEPCR1_ERASEPCR1_Msk (0xFFFFFFFFUL << NVMC_ERASEPCR1_ERASEPCR1_Pos) /*!< Bit mask of ERASEPCR1 field. */ - /* Register: NVMC_ERASEPAGE */ /* Description: Register for erasing a page in code area */ @@ -4139,6 +4847,13 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define NVMC_ERASEPAGE_ERASEPAGE_Pos (0UL) /*!< Position of ERASEPAGE field. */ #define NVMC_ERASEPAGE_ERASEPAGE_Msk (0xFFFFFFFFUL << NVMC_ERASEPAGE_ERASEPAGE_Pos) /*!< Bit mask of ERASEPAGE field. */ +/* Register: NVMC_ERASEPCR1 */ +/* Description: Deprecated register - Register for erasing a page in code area. Equivalent to ERASEPAGE. */ + +/* Bits 31..0 : Register for erasing a page in code area. Equivalent to ERASEPAGE. */ +#define NVMC_ERASEPCR1_ERASEPCR1_Pos (0UL) /*!< Position of ERASEPCR1 field. */ +#define NVMC_ERASEPCR1_ERASEPCR1_Msk (0xFFFFFFFFUL << NVMC_ERASEPCR1_ERASEPCR1_Pos) /*!< Bit mask of ERASEPCR1 field. */ + /* Register: NVMC_ERASEALL */ /* Description: Register for erasing all non-volatile user memory */ @@ -4149,7 +4864,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define NVMC_ERASEALL_ERASEALL_Erase (1UL) /*!< Start chip erase */ /* Register: NVMC_ERASEPCR0 */ -/* Description: Deprecated register - Register for erasing a page in code area. Equivalent to ERASEPAGE. */ +/* Description: Deprecated register - Register for erasing a page in code area. Equivalent to ERASEPAGE. */ /* Bits 31..0 : Register for starting erase of a page in code area. Equivalent to ERASEPAGE. */ #define NVMC_ERASEPCR0_ERASEPCR0_Pos (0UL) /*!< Position of ERASEPCR0 field. */ @@ -4164,6 +4879,20 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define NVMC_ERASEUICR_ERASEUICR_NoOperation (0UL) /*!< No operation */ #define NVMC_ERASEUICR_ERASEUICR_Erase (1UL) /*!< Start erase of UICR */ +/* Register: NVMC_ERASEPAGEPARTIAL */ +/* Description: Register for partial erase of a page in code area */ + +/* Bits 31..0 : Register for starting partial erase of a page in code area */ +#define NVMC_ERASEPAGEPARTIAL_ERASEPAGEPARTIAL_Pos (0UL) /*!< Position of ERASEPAGEPARTIAL field. */ +#define NVMC_ERASEPAGEPARTIAL_ERASEPAGEPARTIAL_Msk (0xFFFFFFFFUL << NVMC_ERASEPAGEPARTIAL_ERASEPAGEPARTIAL_Pos) /*!< Bit mask of ERASEPAGEPARTIAL field. */ + +/* Register: NVMC_ERASEPAGEPARTIALCFG */ +/* Description: Register for partial erase configuration */ + +/* Bits 6..0 : Duration of the partial erase in milliseconds */ +#define NVMC_ERASEPAGEPARTIALCFG_DURATION_Pos (0UL) /*!< Position of DURATION field. */ +#define NVMC_ERASEPAGEPARTIALCFG_DURATION_Msk (0x7FUL << NVMC_ERASEPAGEPARTIALCFG_DURATION_Pos) /*!< Bit mask of DURATION field. */ + /* Register: NVMC_ICACHECNF */ /* Description: I-code cache configuration register. */ @@ -5895,7 +6624,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define GPIO_DETECTMODE_DETECTMODE_LDETECT (1UL) /*!< Use the latched LDETECT behaviour */ /* Register: GPIO_PIN_CNF */ -/* Description: Description collection[0]: Configuration of GPIO pins */ +/* Description: Description collection[n]: Configuration of GPIO pins */ /* Bits 17..16 : Pin sensing mechanism */ #define GPIO_PIN_CNF_SENSE_Pos (16UL) /*!< Position of SENSE field. */ @@ -5939,6 +6668,41 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: PDM */ /* Description: Pulse Density Modulation (Digital Microphone) Interface */ +/* Register: PDM_TASKS_START */ +/* Description: Starts continuous PDM transfer */ + +/* Bit 0 : */ +#define PDM_TASKS_START_TASKS_START_Pos (0UL) /*!< Position of TASKS_START field. */ +#define PDM_TASKS_START_TASKS_START_Msk (0x1UL << PDM_TASKS_START_TASKS_START_Pos) /*!< Bit mask of TASKS_START field. */ + +/* Register: PDM_TASKS_STOP */ +/* Description: Stops PDM transfer */ + +/* Bit 0 : */ +#define PDM_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define PDM_TASKS_STOP_TASKS_STOP_Msk (0x1UL << PDM_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: PDM_EVENTS_STARTED */ +/* Description: PDM transfer has started */ + +/* Bit 0 : */ +#define PDM_EVENTS_STARTED_EVENTS_STARTED_Pos (0UL) /*!< Position of EVENTS_STARTED field. */ +#define PDM_EVENTS_STARTED_EVENTS_STARTED_Msk (0x1UL << PDM_EVENTS_STARTED_EVENTS_STARTED_Pos) /*!< Bit mask of EVENTS_STARTED field. */ + +/* Register: PDM_EVENTS_STOPPED */ +/* Description: PDM transfer has finished */ + +/* Bit 0 : */ +#define PDM_EVENTS_STOPPED_EVENTS_STOPPED_Pos (0UL) /*!< Position of EVENTS_STOPPED field. */ +#define PDM_EVENTS_STOPPED_EVENTS_STOPPED_Msk (0x1UL << PDM_EVENTS_STOPPED_EVENTS_STOPPED_Pos) /*!< Bit mask of EVENTS_STOPPED field. */ + +/* Register: PDM_EVENTS_END */ +/* Description: The PDM has written the last sample specified by SAMPLE.MAXCNT (or the last sample after a STOP task has been received) to Data RAM */ + +/* Bit 0 : */ +#define PDM_EVENTS_END_EVENTS_END_Pos (0UL) /*!< Position of EVENTS_END field. */ +#define PDM_EVENTS_END_EVENTS_END_Msk (0x1UL << PDM_EVENTS_END_EVENTS_END_Pos) /*!< Bit mask of EVENTS_END field. */ + /* Register: PDM_INTEN */ /* Description: Enable or disable interrupt */ @@ -5963,21 +6727,21 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: PDM_INTENSET */ /* Description: Enable interrupt */ -/* Bit 2 : Write '1' to Enable interrupt for END event */ +/* Bit 2 : Write '1' to enable interrupt for END event */ #define PDM_INTENSET_END_Pos (2UL) /*!< Position of END field. */ #define PDM_INTENSET_END_Msk (0x1UL << PDM_INTENSET_END_Pos) /*!< Bit mask of END field. */ #define PDM_INTENSET_END_Disabled (0UL) /*!< Read: Disabled */ #define PDM_INTENSET_END_Enabled (1UL) /*!< Read: Enabled */ #define PDM_INTENSET_END_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for STOPPED event */ +/* Bit 1 : Write '1' to enable interrupt for STOPPED event */ #define PDM_INTENSET_STOPPED_Pos (1UL) /*!< Position of STOPPED field. */ #define PDM_INTENSET_STOPPED_Msk (0x1UL << PDM_INTENSET_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define PDM_INTENSET_STOPPED_Disabled (0UL) /*!< Read: Disabled */ #define PDM_INTENSET_STOPPED_Enabled (1UL) /*!< Read: Enabled */ #define PDM_INTENSET_STOPPED_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for STARTED event */ +/* Bit 0 : Write '1' to enable interrupt for STARTED event */ #define PDM_INTENSET_STARTED_Pos (0UL) /*!< Position of STARTED field. */ #define PDM_INTENSET_STARTED_Msk (0x1UL << PDM_INTENSET_STARTED_Pos) /*!< Bit mask of STARTED field. */ #define PDM_INTENSET_STARTED_Disabled (0UL) /*!< Read: Disabled */ @@ -5987,21 +6751,21 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: PDM_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 2 : Write '1' to Disable interrupt for END event */ +/* Bit 2 : Write '1' to disable interrupt for END event */ #define PDM_INTENCLR_END_Pos (2UL) /*!< Position of END field. */ #define PDM_INTENCLR_END_Msk (0x1UL << PDM_INTENCLR_END_Pos) /*!< Bit mask of END field. */ #define PDM_INTENCLR_END_Disabled (0UL) /*!< Read: Disabled */ #define PDM_INTENCLR_END_Enabled (1UL) /*!< Read: Enabled */ #define PDM_INTENCLR_END_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for STOPPED event */ +/* Bit 1 : Write '1' to disable interrupt for STOPPED event */ #define PDM_INTENCLR_STOPPED_Pos (1UL) /*!< Position of STOPPED field. */ #define PDM_INTENCLR_STOPPED_Msk (0x1UL << PDM_INTENCLR_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define PDM_INTENCLR_STOPPED_Disabled (0UL) /*!< Read: Disabled */ #define PDM_INTENCLR_STOPPED_Enabled (1UL) /*!< Read: Enabled */ #define PDM_INTENCLR_STOPPED_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for STARTED event */ +/* Bit 0 : Write '1' to disable interrupt for STARTED event */ #define PDM_INTENCLR_STARTED_Pos (0UL) /*!< Position of STARTED field. */ #define PDM_INTENCLR_STARTED_Msk (0x1UL << PDM_INTENCLR_STARTED_Pos) /*!< Bit mask of STARTED field. */ #define PDM_INTENCLR_STARTED_Disabled (0UL) /*!< Read: Disabled */ @@ -6052,17 +6816,17 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define PDM_GAINL_GAINL_Pos (0UL) /*!< Position of GAINL field. */ #define PDM_GAINL_GAINL_Msk (0x7FUL << PDM_GAINL_GAINL_Pos) /*!< Bit mask of GAINL field. */ #define PDM_GAINL_GAINL_MinGain (0x00UL) /*!< -20dB gain adjustment (minimum) */ -#define PDM_GAINL_GAINL_DefaultGain (0x28UL) /*!< 0dB gain adjustment ('2500 RMS' requirement) */ +#define PDM_GAINL_GAINL_DefaultGain (0x28UL) /*!< 0dB gain adjustment */ #define PDM_GAINL_GAINL_MaxGain (0x50UL) /*!< +20dB gain adjustment (maximum) */ /* Register: PDM_GAINR */ /* Description: Right output gain adjustment */ -/* Bits 7..0 : Right output gain adjustment, in 0.5 dB steps, around the default module gain (see electrical parameters) */ +/* Bits 6..0 : Right output gain adjustment, in 0.5 dB steps, around the default module gain (see electrical parameters) */ #define PDM_GAINR_GAINR_Pos (0UL) /*!< Position of GAINR field. */ -#define PDM_GAINR_GAINR_Msk (0xFFUL << PDM_GAINR_GAINR_Pos) /*!< Bit mask of GAINR field. */ +#define PDM_GAINR_GAINR_Msk (0x7FUL << PDM_GAINR_GAINR_Pos) /*!< Bit mask of GAINR field. */ #define PDM_GAINR_GAINR_MinGain (0x00UL) /*!< -20dB gain adjustment (minimum) */ -#define PDM_GAINR_GAINR_DefaultGain (0x28UL) /*!< 0dB gain adjustment ('2500 RMS' requirement) */ +#define PDM_GAINR_GAINR_DefaultGain (0x28UL) /*!< 0dB gain adjustment */ #define PDM_GAINR_GAINR_MaxGain (0x50UL) /*!< +20dB gain adjustment (maximum) */ /* Register: PDM_RATIO */ @@ -6126,45 +6890,101 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: POWER */ /* Description: Power control */ +/* Register: POWER_TASKS_CONSTLAT */ +/* Description: Enable constant latency mode */ + +/* Bit 0 : */ +#define POWER_TASKS_CONSTLAT_TASKS_CONSTLAT_Pos (0UL) /*!< Position of TASKS_CONSTLAT field. */ +#define POWER_TASKS_CONSTLAT_TASKS_CONSTLAT_Msk (0x1UL << POWER_TASKS_CONSTLAT_TASKS_CONSTLAT_Pos) /*!< Bit mask of TASKS_CONSTLAT field. */ + +/* Register: POWER_TASKS_LOWPWR */ +/* Description: Enable low power mode (variable latency) */ + +/* Bit 0 : */ +#define POWER_TASKS_LOWPWR_TASKS_LOWPWR_Pos (0UL) /*!< Position of TASKS_LOWPWR field. */ +#define POWER_TASKS_LOWPWR_TASKS_LOWPWR_Msk (0x1UL << POWER_TASKS_LOWPWR_TASKS_LOWPWR_Pos) /*!< Bit mask of TASKS_LOWPWR field. */ + +/* Register: POWER_EVENTS_POFWARN */ +/* Description: Power failure warning */ + +/* Bit 0 : */ +#define POWER_EVENTS_POFWARN_EVENTS_POFWARN_Pos (0UL) /*!< Position of EVENTS_POFWARN field. */ +#define POWER_EVENTS_POFWARN_EVENTS_POFWARN_Msk (0x1UL << POWER_EVENTS_POFWARN_EVENTS_POFWARN_Pos) /*!< Bit mask of EVENTS_POFWARN field. */ + +/* Register: POWER_EVENTS_SLEEPENTER */ +/* Description: CPU entered WFI/WFE sleep */ + +/* Bit 0 : */ +#define POWER_EVENTS_SLEEPENTER_EVENTS_SLEEPENTER_Pos (0UL) /*!< Position of EVENTS_SLEEPENTER field. */ +#define POWER_EVENTS_SLEEPENTER_EVENTS_SLEEPENTER_Msk (0x1UL << POWER_EVENTS_SLEEPENTER_EVENTS_SLEEPENTER_Pos) /*!< Bit mask of EVENTS_SLEEPENTER field. */ + +/* Register: POWER_EVENTS_SLEEPEXIT */ +/* Description: CPU exited WFI/WFE sleep */ + +/* Bit 0 : */ +#define POWER_EVENTS_SLEEPEXIT_EVENTS_SLEEPEXIT_Pos (0UL) /*!< Position of EVENTS_SLEEPEXIT field. */ +#define POWER_EVENTS_SLEEPEXIT_EVENTS_SLEEPEXIT_Msk (0x1UL << POWER_EVENTS_SLEEPEXIT_EVENTS_SLEEPEXIT_Pos) /*!< Bit mask of EVENTS_SLEEPEXIT field. */ + +/* Register: POWER_EVENTS_USBDETECTED */ +/* Description: Voltage supply detected on VBUS */ + +/* Bit 0 : */ +#define POWER_EVENTS_USBDETECTED_EVENTS_USBDETECTED_Pos (0UL) /*!< Position of EVENTS_USBDETECTED field. */ +#define POWER_EVENTS_USBDETECTED_EVENTS_USBDETECTED_Msk (0x1UL << POWER_EVENTS_USBDETECTED_EVENTS_USBDETECTED_Pos) /*!< Bit mask of EVENTS_USBDETECTED field. */ + +/* Register: POWER_EVENTS_USBREMOVED */ +/* Description: Voltage supply removed from VBUS */ + +/* Bit 0 : */ +#define POWER_EVENTS_USBREMOVED_EVENTS_USBREMOVED_Pos (0UL) /*!< Position of EVENTS_USBREMOVED field. */ +#define POWER_EVENTS_USBREMOVED_EVENTS_USBREMOVED_Msk (0x1UL << POWER_EVENTS_USBREMOVED_EVENTS_USBREMOVED_Pos) /*!< Bit mask of EVENTS_USBREMOVED field. */ + +/* Register: POWER_EVENTS_USBPWRRDY */ +/* Description: USB 3.3 V supply ready */ + +/* Bit 0 : */ +#define POWER_EVENTS_USBPWRRDY_EVENTS_USBPWRRDY_Pos (0UL) /*!< Position of EVENTS_USBPWRRDY field. */ +#define POWER_EVENTS_USBPWRRDY_EVENTS_USBPWRRDY_Msk (0x1UL << POWER_EVENTS_USBPWRRDY_EVENTS_USBPWRRDY_Pos) /*!< Bit mask of EVENTS_USBPWRRDY field. */ + /* Register: POWER_INTENSET */ /* Description: Enable interrupt */ -/* Bit 9 : Write '1' to Enable interrupt for USBPWRRDY event */ +/* Bit 9 : Write '1' to enable interrupt for USBPWRRDY event */ #define POWER_INTENSET_USBPWRRDY_Pos (9UL) /*!< Position of USBPWRRDY field. */ #define POWER_INTENSET_USBPWRRDY_Msk (0x1UL << POWER_INTENSET_USBPWRRDY_Pos) /*!< Bit mask of USBPWRRDY field. */ #define POWER_INTENSET_USBPWRRDY_Disabled (0UL) /*!< Read: Disabled */ #define POWER_INTENSET_USBPWRRDY_Enabled (1UL) /*!< Read: Enabled */ #define POWER_INTENSET_USBPWRRDY_Set (1UL) /*!< Enable */ -/* Bit 8 : Write '1' to Enable interrupt for USBREMOVED event */ +/* Bit 8 : Write '1' to enable interrupt for USBREMOVED event */ #define POWER_INTENSET_USBREMOVED_Pos (8UL) /*!< Position of USBREMOVED field. */ #define POWER_INTENSET_USBREMOVED_Msk (0x1UL << POWER_INTENSET_USBREMOVED_Pos) /*!< Bit mask of USBREMOVED field. */ #define POWER_INTENSET_USBREMOVED_Disabled (0UL) /*!< Read: Disabled */ #define POWER_INTENSET_USBREMOVED_Enabled (1UL) /*!< Read: Enabled */ #define POWER_INTENSET_USBREMOVED_Set (1UL) /*!< Enable */ -/* Bit 7 : Write '1' to Enable interrupt for USBDETECTED event */ +/* Bit 7 : Write '1' to enable interrupt for USBDETECTED event */ #define POWER_INTENSET_USBDETECTED_Pos (7UL) /*!< Position of USBDETECTED field. */ #define POWER_INTENSET_USBDETECTED_Msk (0x1UL << POWER_INTENSET_USBDETECTED_Pos) /*!< Bit mask of USBDETECTED field. */ #define POWER_INTENSET_USBDETECTED_Disabled (0UL) /*!< Read: Disabled */ #define POWER_INTENSET_USBDETECTED_Enabled (1UL) /*!< Read: Enabled */ #define POWER_INTENSET_USBDETECTED_Set (1UL) /*!< Enable */ -/* Bit 6 : Write '1' to Enable interrupt for SLEEPEXIT event */ +/* Bit 6 : Write '1' to enable interrupt for SLEEPEXIT event */ #define POWER_INTENSET_SLEEPEXIT_Pos (6UL) /*!< Position of SLEEPEXIT field. */ #define POWER_INTENSET_SLEEPEXIT_Msk (0x1UL << POWER_INTENSET_SLEEPEXIT_Pos) /*!< Bit mask of SLEEPEXIT field. */ #define POWER_INTENSET_SLEEPEXIT_Disabled (0UL) /*!< Read: Disabled */ #define POWER_INTENSET_SLEEPEXIT_Enabled (1UL) /*!< Read: Enabled */ #define POWER_INTENSET_SLEEPEXIT_Set (1UL) /*!< Enable */ -/* Bit 5 : Write '1' to Enable interrupt for SLEEPENTER event */ +/* Bit 5 : Write '1' to enable interrupt for SLEEPENTER event */ #define POWER_INTENSET_SLEEPENTER_Pos (5UL) /*!< Position of SLEEPENTER field. */ #define POWER_INTENSET_SLEEPENTER_Msk (0x1UL << POWER_INTENSET_SLEEPENTER_Pos) /*!< Bit mask of SLEEPENTER field. */ #define POWER_INTENSET_SLEEPENTER_Disabled (0UL) /*!< Read: Disabled */ #define POWER_INTENSET_SLEEPENTER_Enabled (1UL) /*!< Read: Enabled */ #define POWER_INTENSET_SLEEPENTER_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for POFWARN event */ +/* Bit 2 : Write '1' to enable interrupt for POFWARN event */ #define POWER_INTENSET_POFWARN_Pos (2UL) /*!< Position of POFWARN field. */ #define POWER_INTENSET_POFWARN_Msk (0x1UL << POWER_INTENSET_POFWARN_Pos) /*!< Bit mask of POFWARN field. */ #define POWER_INTENSET_POFWARN_Disabled (0UL) /*!< Read: Disabled */ @@ -6174,42 +6994,42 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: POWER_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 9 : Write '1' to Disable interrupt for USBPWRRDY event */ +/* Bit 9 : Write '1' to disable interrupt for USBPWRRDY event */ #define POWER_INTENCLR_USBPWRRDY_Pos (9UL) /*!< Position of USBPWRRDY field. */ #define POWER_INTENCLR_USBPWRRDY_Msk (0x1UL << POWER_INTENCLR_USBPWRRDY_Pos) /*!< Bit mask of USBPWRRDY field. */ #define POWER_INTENCLR_USBPWRRDY_Disabled (0UL) /*!< Read: Disabled */ #define POWER_INTENCLR_USBPWRRDY_Enabled (1UL) /*!< Read: Enabled */ #define POWER_INTENCLR_USBPWRRDY_Clear (1UL) /*!< Disable */ -/* Bit 8 : Write '1' to Disable interrupt for USBREMOVED event */ +/* Bit 8 : Write '1' to disable interrupt for USBREMOVED event */ #define POWER_INTENCLR_USBREMOVED_Pos (8UL) /*!< Position of USBREMOVED field. */ #define POWER_INTENCLR_USBREMOVED_Msk (0x1UL << POWER_INTENCLR_USBREMOVED_Pos) /*!< Bit mask of USBREMOVED field. */ #define POWER_INTENCLR_USBREMOVED_Disabled (0UL) /*!< Read: Disabled */ #define POWER_INTENCLR_USBREMOVED_Enabled (1UL) /*!< Read: Enabled */ #define POWER_INTENCLR_USBREMOVED_Clear (1UL) /*!< Disable */ -/* Bit 7 : Write '1' to Disable interrupt for USBDETECTED event */ +/* Bit 7 : Write '1' to disable interrupt for USBDETECTED event */ #define POWER_INTENCLR_USBDETECTED_Pos (7UL) /*!< Position of USBDETECTED field. */ #define POWER_INTENCLR_USBDETECTED_Msk (0x1UL << POWER_INTENCLR_USBDETECTED_Pos) /*!< Bit mask of USBDETECTED field. */ #define POWER_INTENCLR_USBDETECTED_Disabled (0UL) /*!< Read: Disabled */ #define POWER_INTENCLR_USBDETECTED_Enabled (1UL) /*!< Read: Enabled */ #define POWER_INTENCLR_USBDETECTED_Clear (1UL) /*!< Disable */ -/* Bit 6 : Write '1' to Disable interrupt for SLEEPEXIT event */ +/* Bit 6 : Write '1' to disable interrupt for SLEEPEXIT event */ #define POWER_INTENCLR_SLEEPEXIT_Pos (6UL) /*!< Position of SLEEPEXIT field. */ #define POWER_INTENCLR_SLEEPEXIT_Msk (0x1UL << POWER_INTENCLR_SLEEPEXIT_Pos) /*!< Bit mask of SLEEPEXIT field. */ #define POWER_INTENCLR_SLEEPEXIT_Disabled (0UL) /*!< Read: Disabled */ #define POWER_INTENCLR_SLEEPEXIT_Enabled (1UL) /*!< Read: Enabled */ #define POWER_INTENCLR_SLEEPEXIT_Clear (1UL) /*!< Disable */ -/* Bit 5 : Write '1' to Disable interrupt for SLEEPENTER event */ +/* Bit 5 : Write '1' to disable interrupt for SLEEPENTER event */ #define POWER_INTENCLR_SLEEPENTER_Pos (5UL) /*!< Position of SLEEPENTER field. */ #define POWER_INTENCLR_SLEEPENTER_Msk (0x1UL << POWER_INTENCLR_SLEEPENTER_Pos) /*!< Bit mask of SLEEPENTER field. */ #define POWER_INTENCLR_SLEEPENTER_Disabled (0UL) /*!< Read: Disabled */ #define POWER_INTENCLR_SLEEPENTER_Enabled (1UL) /*!< Read: Enabled */ #define POWER_INTENCLR_SLEEPENTER_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for POFWARN event */ +/* Bit 2 : Write '1' to disable interrupt for POFWARN event */ #define POWER_INTENCLR_POFWARN_Pos (2UL) /*!< Position of POFWARN field. */ #define POWER_INTENCLR_POFWARN_Msk (0x1UL << POWER_INTENCLR_POFWARN_Pos) /*!< Bit mask of POFWARN field. */ #define POWER_INTENCLR_POFWARN_Disabled (0UL) /*!< Read: Disabled */ @@ -6219,7 +7039,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: POWER_RESETREAS */ /* Description: Reset reason */ -/* Bit 20 : Reset due to wake up from System OFF mode by Vbus rising into valid range */ +/* Bit 20 : Reset due to wake up from System OFF mode by VBUS rising into valid range */ #define POWER_RESETREAS_VBUS_Pos (20UL) /*!< Position of VBUS field. */ #define POWER_RESETREAS_VBUS_Msk (0x1UL << POWER_RESETREAS_VBUS_Pos) /*!< Bit mask of VBUS field. */ #define POWER_RESETREAS_VBUS_NotDetected (0UL) /*!< Not detected */ @@ -6274,7 +7094,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define POWER_RESETREAS_RESETPIN_Detected (1UL) /*!< Detected */ /* Register: POWER_RAMSTATUS */ -/* Description: Deprecated register - RAM status register */ +/* Description: Deprecated register - RAM status register */ /* Bit 3 : RAM block 3 is on or off/powering up */ #define POWER_RAMSTATUS_RAMBLOCK3_Pos (3UL) /*!< Position of RAMBLOCK3 field. */ @@ -6324,9 +7144,9 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define POWER_SYSTEMOFF_SYSTEMOFF_Enter (1UL) /*!< Enable System OFF mode */ /* Register: POWER_POFCON */ -/* Description: Power failure comparator configuration */ +/* Description: Power-fail comparator configuration */ -/* Bits 11..8 : Power failure comparator threshold setting for high voltage mode (supply connected to VDDH only). This setting does not apply for normal voltage mode (supply connected to both VDD and VDDH). */ +/* Bits 11..8 : Power-fail comparator threshold setting for high voltage mode (supply connected to VDDH only). This setting does not apply for normal voltage mode (supply connected to both VDD and VDDH). */ #define POWER_POFCON_THRESHOLDVDDH_Pos (8UL) /*!< Position of THRESHOLDVDDH field. */ #define POWER_POFCON_THRESHOLDVDDH_Msk (0xFUL << POWER_POFCON_THRESHOLDVDDH_Pos) /*!< Bit mask of THRESHOLDVDDH field. */ #define POWER_POFCON_THRESHOLDVDDH_V27 (0UL) /*!< Set threshold to 2.7 V */ @@ -6346,7 +7166,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define POWER_POFCON_THRESHOLDVDDH_V41 (14UL) /*!< Set threshold to 4.1 V */ #define POWER_POFCON_THRESHOLDVDDH_V42 (15UL) /*!< Set threshold to 4.2 V */ -/* Bits 4..1 : Power failure comparator threshold setting. This setting applies both for normal voltage mode (supply connected to both VDD and VDDH) and high voltage mode (supply connected to VDDH only). */ +/* Bits 4..1 : Power-fail comparator threshold setting. This setting applies both for normal voltage mode (supply connected to both VDD and VDDH) and high voltage mode (supply connected to VDDH only). Values 0-3 set threshold below 1.7 V and should not be used as brown out detection will be activated before power failure warning on such low voltages. */ #define POWER_POFCON_THRESHOLD_Pos (1UL) /*!< Position of THRESHOLD field. */ #define POWER_POFCON_THRESHOLD_Msk (0xFUL << POWER_POFCON_THRESHOLD_Pos) /*!< Bit mask of THRESHOLD field. */ #define POWER_POFCON_THRESHOLD_V17 (4UL) /*!< Set threshold to 1.7 V */ @@ -6362,7 +7182,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define POWER_POFCON_THRESHOLD_V27 (14UL) /*!< Set threshold to 2.7 V */ #define POWER_POFCON_THRESHOLD_V28 (15UL) /*!< Set threshold to 2.8 V */ -/* Bit 0 : Enable or disable power failure comparator */ +/* Bit 0 : Enable or disable power failure warning */ #define POWER_POFCON_POF_Pos (0UL) /*!< Position of POF field. */ #define POWER_POFCON_POF_Msk (0x1UL << POWER_POFCON_POF_Pos) /*!< Bit mask of POF field. */ #define POWER_POFCON_POF_Disabled (0UL) /*!< Disable */ @@ -6410,202 +7230,202 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define POWER_MAINREGSTATUS_MAINREGSTATUS_High (1UL) /*!< High voltage mode. Voltage supplied on VDDH. */ /* Register: POWER_RAM_POWER */ -/* Description: Description cluster[0]: RAM0 power control register */ +/* Description: Description cluster[n]: RAMn power control register */ -/* Bit 31 : Keep retention on RAM section S15 when RAM section is in OFF */ +/* Bit 31 : Keep retention on RAM section S15 when RAM section is off */ #define POWER_RAM_POWER_S15RETENTION_Pos (31UL) /*!< Position of S15RETENTION field. */ #define POWER_RAM_POWER_S15RETENTION_Msk (0x1UL << POWER_RAM_POWER_S15RETENTION_Pos) /*!< Bit mask of S15RETENTION field. */ #define POWER_RAM_POWER_S15RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S15RETENTION_On (1UL) /*!< On */ -/* Bit 30 : Keep retention on RAM section S14 when RAM section is in OFF */ +/* Bit 30 : Keep retention on RAM section S14 when RAM section is off */ #define POWER_RAM_POWER_S14RETENTION_Pos (30UL) /*!< Position of S14RETENTION field. */ #define POWER_RAM_POWER_S14RETENTION_Msk (0x1UL << POWER_RAM_POWER_S14RETENTION_Pos) /*!< Bit mask of S14RETENTION field. */ #define POWER_RAM_POWER_S14RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S14RETENTION_On (1UL) /*!< On */ -/* Bit 29 : Keep retention on RAM section S13 when RAM section is in OFF */ +/* Bit 29 : Keep retention on RAM section S13 when RAM section is off */ #define POWER_RAM_POWER_S13RETENTION_Pos (29UL) /*!< Position of S13RETENTION field. */ #define POWER_RAM_POWER_S13RETENTION_Msk (0x1UL << POWER_RAM_POWER_S13RETENTION_Pos) /*!< Bit mask of S13RETENTION field. */ #define POWER_RAM_POWER_S13RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S13RETENTION_On (1UL) /*!< On */ -/* Bit 28 : Keep retention on RAM section S12 when RAM section is in OFF */ +/* Bit 28 : Keep retention on RAM section S12 when RAM section is off */ #define POWER_RAM_POWER_S12RETENTION_Pos (28UL) /*!< Position of S12RETENTION field. */ #define POWER_RAM_POWER_S12RETENTION_Msk (0x1UL << POWER_RAM_POWER_S12RETENTION_Pos) /*!< Bit mask of S12RETENTION field. */ #define POWER_RAM_POWER_S12RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S12RETENTION_On (1UL) /*!< On */ -/* Bit 27 : Keep retention on RAM section S11 when RAM section is in OFF */ +/* Bit 27 : Keep retention on RAM section S11 when RAM section is off */ #define POWER_RAM_POWER_S11RETENTION_Pos (27UL) /*!< Position of S11RETENTION field. */ #define POWER_RAM_POWER_S11RETENTION_Msk (0x1UL << POWER_RAM_POWER_S11RETENTION_Pos) /*!< Bit mask of S11RETENTION field. */ #define POWER_RAM_POWER_S11RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S11RETENTION_On (1UL) /*!< On */ -/* Bit 26 : Keep retention on RAM section S10 when RAM section is in OFF */ +/* Bit 26 : Keep retention on RAM section S10 when RAM section is off */ #define POWER_RAM_POWER_S10RETENTION_Pos (26UL) /*!< Position of S10RETENTION field. */ #define POWER_RAM_POWER_S10RETENTION_Msk (0x1UL << POWER_RAM_POWER_S10RETENTION_Pos) /*!< Bit mask of S10RETENTION field. */ #define POWER_RAM_POWER_S10RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S10RETENTION_On (1UL) /*!< On */ -/* Bit 25 : Keep retention on RAM section S9 when RAM section is in OFF */ +/* Bit 25 : Keep retention on RAM section S9 when RAM section is off */ #define POWER_RAM_POWER_S9RETENTION_Pos (25UL) /*!< Position of S9RETENTION field. */ #define POWER_RAM_POWER_S9RETENTION_Msk (0x1UL << POWER_RAM_POWER_S9RETENTION_Pos) /*!< Bit mask of S9RETENTION field. */ #define POWER_RAM_POWER_S9RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S9RETENTION_On (1UL) /*!< On */ -/* Bit 24 : Keep retention on RAM section S8 when RAM section is in OFF */ +/* Bit 24 : Keep retention on RAM section S8 when RAM section is off */ #define POWER_RAM_POWER_S8RETENTION_Pos (24UL) /*!< Position of S8RETENTION field. */ #define POWER_RAM_POWER_S8RETENTION_Msk (0x1UL << POWER_RAM_POWER_S8RETENTION_Pos) /*!< Bit mask of S8RETENTION field. */ #define POWER_RAM_POWER_S8RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S8RETENTION_On (1UL) /*!< On */ -/* Bit 23 : Keep retention on RAM section S7 when RAM section is in OFF */ +/* Bit 23 : Keep retention on RAM section S7 when RAM section is off */ #define POWER_RAM_POWER_S7RETENTION_Pos (23UL) /*!< Position of S7RETENTION field. */ #define POWER_RAM_POWER_S7RETENTION_Msk (0x1UL << POWER_RAM_POWER_S7RETENTION_Pos) /*!< Bit mask of S7RETENTION field. */ #define POWER_RAM_POWER_S7RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S7RETENTION_On (1UL) /*!< On */ -/* Bit 22 : Keep retention on RAM section S6 when RAM section is in OFF */ +/* Bit 22 : Keep retention on RAM section S6 when RAM section is off */ #define POWER_RAM_POWER_S6RETENTION_Pos (22UL) /*!< Position of S6RETENTION field. */ #define POWER_RAM_POWER_S6RETENTION_Msk (0x1UL << POWER_RAM_POWER_S6RETENTION_Pos) /*!< Bit mask of S6RETENTION field. */ #define POWER_RAM_POWER_S6RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S6RETENTION_On (1UL) /*!< On */ -/* Bit 21 : Keep retention on RAM section S5 when RAM section is in OFF */ +/* Bit 21 : Keep retention on RAM section S5 when RAM section is off */ #define POWER_RAM_POWER_S5RETENTION_Pos (21UL) /*!< Position of S5RETENTION field. */ #define POWER_RAM_POWER_S5RETENTION_Msk (0x1UL << POWER_RAM_POWER_S5RETENTION_Pos) /*!< Bit mask of S5RETENTION field. */ #define POWER_RAM_POWER_S5RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S5RETENTION_On (1UL) /*!< On */ -/* Bit 20 : Keep retention on RAM section S4 when RAM section is in OFF */ +/* Bit 20 : Keep retention on RAM section S4 when RAM section is off */ #define POWER_RAM_POWER_S4RETENTION_Pos (20UL) /*!< Position of S4RETENTION field. */ #define POWER_RAM_POWER_S4RETENTION_Msk (0x1UL << POWER_RAM_POWER_S4RETENTION_Pos) /*!< Bit mask of S4RETENTION field. */ #define POWER_RAM_POWER_S4RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S4RETENTION_On (1UL) /*!< On */ -/* Bit 19 : Keep retention on RAM section S3 when RAM section is in OFF */ +/* Bit 19 : Keep retention on RAM section S3 when RAM section is off */ #define POWER_RAM_POWER_S3RETENTION_Pos (19UL) /*!< Position of S3RETENTION field. */ #define POWER_RAM_POWER_S3RETENTION_Msk (0x1UL << POWER_RAM_POWER_S3RETENTION_Pos) /*!< Bit mask of S3RETENTION field. */ #define POWER_RAM_POWER_S3RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S3RETENTION_On (1UL) /*!< On */ -/* Bit 18 : Keep retention on RAM section S2 when RAM section is in OFF */ +/* Bit 18 : Keep retention on RAM section S2 when RAM section is off */ #define POWER_RAM_POWER_S2RETENTION_Pos (18UL) /*!< Position of S2RETENTION field. */ #define POWER_RAM_POWER_S2RETENTION_Msk (0x1UL << POWER_RAM_POWER_S2RETENTION_Pos) /*!< Bit mask of S2RETENTION field. */ #define POWER_RAM_POWER_S2RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S2RETENTION_On (1UL) /*!< On */ -/* Bit 17 : Keep retention on RAM section S1 when RAM section is in OFF */ +/* Bit 17 : Keep retention on RAM section S1 when RAM section is off */ #define POWER_RAM_POWER_S1RETENTION_Pos (17UL) /*!< Position of S1RETENTION field. */ #define POWER_RAM_POWER_S1RETENTION_Msk (0x1UL << POWER_RAM_POWER_S1RETENTION_Pos) /*!< Bit mask of S1RETENTION field. */ #define POWER_RAM_POWER_S1RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S1RETENTION_On (1UL) /*!< On */ -/* Bit 16 : Keep retention on RAM section S0 when RAM section is in OFF */ +/* Bit 16 : Keep retention on RAM section S0 when RAM section is off */ #define POWER_RAM_POWER_S0RETENTION_Pos (16UL) /*!< Position of S0RETENTION field. */ #define POWER_RAM_POWER_S0RETENTION_Msk (0x1UL << POWER_RAM_POWER_S0RETENTION_Pos) /*!< Bit mask of S0RETENTION field. */ #define POWER_RAM_POWER_S0RETENTION_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S0RETENTION_On (1UL) /*!< On */ -/* Bit 15 : Keep RAM section S15 ON or OFF in System ON mode. */ +/* Bit 15 : Keep RAM section S15 on or off in System ON mode. */ #define POWER_RAM_POWER_S15POWER_Pos (15UL) /*!< Position of S15POWER field. */ #define POWER_RAM_POWER_S15POWER_Msk (0x1UL << POWER_RAM_POWER_S15POWER_Pos) /*!< Bit mask of S15POWER field. */ #define POWER_RAM_POWER_S15POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S15POWER_On (1UL) /*!< On */ -/* Bit 14 : Keep RAM section S14 ON or OFF in System ON mode. */ +/* Bit 14 : Keep RAM section S14 on or off in System ON mode. */ #define POWER_RAM_POWER_S14POWER_Pos (14UL) /*!< Position of S14POWER field. */ #define POWER_RAM_POWER_S14POWER_Msk (0x1UL << POWER_RAM_POWER_S14POWER_Pos) /*!< Bit mask of S14POWER field. */ #define POWER_RAM_POWER_S14POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S14POWER_On (1UL) /*!< On */ -/* Bit 13 : Keep RAM section S13 ON or OFF in System ON mode. */ +/* Bit 13 : Keep RAM section S13 on or off in System ON mode. */ #define POWER_RAM_POWER_S13POWER_Pos (13UL) /*!< Position of S13POWER field. */ #define POWER_RAM_POWER_S13POWER_Msk (0x1UL << POWER_RAM_POWER_S13POWER_Pos) /*!< Bit mask of S13POWER field. */ #define POWER_RAM_POWER_S13POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S13POWER_On (1UL) /*!< On */ -/* Bit 12 : Keep RAM section S12 ON or OFF in System ON mode. */ +/* Bit 12 : Keep RAM section S12 on or off in System ON mode. */ #define POWER_RAM_POWER_S12POWER_Pos (12UL) /*!< Position of S12POWER field. */ #define POWER_RAM_POWER_S12POWER_Msk (0x1UL << POWER_RAM_POWER_S12POWER_Pos) /*!< Bit mask of S12POWER field. */ #define POWER_RAM_POWER_S12POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S12POWER_On (1UL) /*!< On */ -/* Bit 11 : Keep RAM section S11 ON or OFF in System ON mode. */ +/* Bit 11 : Keep RAM section S11 on or off in System ON mode. */ #define POWER_RAM_POWER_S11POWER_Pos (11UL) /*!< Position of S11POWER field. */ #define POWER_RAM_POWER_S11POWER_Msk (0x1UL << POWER_RAM_POWER_S11POWER_Pos) /*!< Bit mask of S11POWER field. */ #define POWER_RAM_POWER_S11POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S11POWER_On (1UL) /*!< On */ -/* Bit 10 : Keep RAM section S10 ON or OFF in System ON mode. */ +/* Bit 10 : Keep RAM section S10 on or off in System ON mode. */ #define POWER_RAM_POWER_S10POWER_Pos (10UL) /*!< Position of S10POWER field. */ #define POWER_RAM_POWER_S10POWER_Msk (0x1UL << POWER_RAM_POWER_S10POWER_Pos) /*!< Bit mask of S10POWER field. */ #define POWER_RAM_POWER_S10POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S10POWER_On (1UL) /*!< On */ -/* Bit 9 : Keep RAM section S9 ON or OFF in System ON mode. */ +/* Bit 9 : Keep RAM section S9 on or off in System ON mode. */ #define POWER_RAM_POWER_S9POWER_Pos (9UL) /*!< Position of S9POWER field. */ #define POWER_RAM_POWER_S9POWER_Msk (0x1UL << POWER_RAM_POWER_S9POWER_Pos) /*!< Bit mask of S9POWER field. */ #define POWER_RAM_POWER_S9POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S9POWER_On (1UL) /*!< On */ -/* Bit 8 : Keep RAM section S8 ON or OFF in System ON mode. */ +/* Bit 8 : Keep RAM section S8 on or off in System ON mode. */ #define POWER_RAM_POWER_S8POWER_Pos (8UL) /*!< Position of S8POWER field. */ #define POWER_RAM_POWER_S8POWER_Msk (0x1UL << POWER_RAM_POWER_S8POWER_Pos) /*!< Bit mask of S8POWER field. */ #define POWER_RAM_POWER_S8POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S8POWER_On (1UL) /*!< On */ -/* Bit 7 : Keep RAM section S7 ON or OFF in System ON mode. */ +/* Bit 7 : Keep RAM section S7 on or off in System ON mode. */ #define POWER_RAM_POWER_S7POWER_Pos (7UL) /*!< Position of S7POWER field. */ #define POWER_RAM_POWER_S7POWER_Msk (0x1UL << POWER_RAM_POWER_S7POWER_Pos) /*!< Bit mask of S7POWER field. */ #define POWER_RAM_POWER_S7POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S7POWER_On (1UL) /*!< On */ -/* Bit 6 : Keep RAM section S6 ON or OFF in System ON mode. */ +/* Bit 6 : Keep RAM section S6 on or off in System ON mode. */ #define POWER_RAM_POWER_S6POWER_Pos (6UL) /*!< Position of S6POWER field. */ #define POWER_RAM_POWER_S6POWER_Msk (0x1UL << POWER_RAM_POWER_S6POWER_Pos) /*!< Bit mask of S6POWER field. */ #define POWER_RAM_POWER_S6POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S6POWER_On (1UL) /*!< On */ -/* Bit 5 : Keep RAM section S5 ON or OFF in System ON mode. */ +/* Bit 5 : Keep RAM section S5 on or off in System ON mode. */ #define POWER_RAM_POWER_S5POWER_Pos (5UL) /*!< Position of S5POWER field. */ #define POWER_RAM_POWER_S5POWER_Msk (0x1UL << POWER_RAM_POWER_S5POWER_Pos) /*!< Bit mask of S5POWER field. */ #define POWER_RAM_POWER_S5POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S5POWER_On (1UL) /*!< On */ -/* Bit 4 : Keep RAM section S4 ON or OFF in System ON mode. */ +/* Bit 4 : Keep RAM section S4 on or off in System ON mode. */ #define POWER_RAM_POWER_S4POWER_Pos (4UL) /*!< Position of S4POWER field. */ #define POWER_RAM_POWER_S4POWER_Msk (0x1UL << POWER_RAM_POWER_S4POWER_Pos) /*!< Bit mask of S4POWER field. */ #define POWER_RAM_POWER_S4POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S4POWER_On (1UL) /*!< On */ -/* Bit 3 : Keep RAM section S3 ON or OFF in System ON mode. */ +/* Bit 3 : Keep RAM section S3 on or off in System ON mode. */ #define POWER_RAM_POWER_S3POWER_Pos (3UL) /*!< Position of S3POWER field. */ #define POWER_RAM_POWER_S3POWER_Msk (0x1UL << POWER_RAM_POWER_S3POWER_Pos) /*!< Bit mask of S3POWER field. */ #define POWER_RAM_POWER_S3POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S3POWER_On (1UL) /*!< On */ -/* Bit 2 : Keep RAM section S2 ON or OFF in System ON mode. */ +/* Bit 2 : Keep RAM section S2 on or off in System ON mode. */ #define POWER_RAM_POWER_S2POWER_Pos (2UL) /*!< Position of S2POWER field. */ #define POWER_RAM_POWER_S2POWER_Msk (0x1UL << POWER_RAM_POWER_S2POWER_Pos) /*!< Bit mask of S2POWER field. */ #define POWER_RAM_POWER_S2POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S2POWER_On (1UL) /*!< On */ -/* Bit 1 : Keep RAM section S1 ON or OFF in System ON mode. */ +/* Bit 1 : Keep RAM section S1 on or off in System ON mode. */ #define POWER_RAM_POWER_S1POWER_Pos (1UL) /*!< Position of S1POWER field. */ #define POWER_RAM_POWER_S1POWER_Msk (0x1UL << POWER_RAM_POWER_S1POWER_Pos) /*!< Bit mask of S1POWER field. */ #define POWER_RAM_POWER_S1POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S1POWER_On (1UL) /*!< On */ -/* Bit 0 : Keep RAM section S0 ON or OFF in System ON mode. */ +/* Bit 0 : Keep RAM section S0 on or off in System ON mode. */ #define POWER_RAM_POWER_S0POWER_Pos (0UL) /*!< Position of S0POWER field. */ #define POWER_RAM_POWER_S0POWER_Msk (0x1UL << POWER_RAM_POWER_S0POWER_Pos) /*!< Bit mask of S0POWER field. */ #define POWER_RAM_POWER_S0POWER_Off (0UL) /*!< Off */ #define POWER_RAM_POWER_S0POWER_On (1UL) /*!< On */ /* Register: POWER_RAM_POWERSET */ -/* Description: Description cluster[0]: RAM0 power control set register */ +/* Description: Description cluster[n]: RAMn power control set register */ /* Bit 31 : Keep retention on RAM section S15 when RAM section is switched off */ #define POWER_RAM_POWERSET_S15RETENTION_Pos (31UL) /*!< Position of S15RETENTION field. */ @@ -6687,88 +7507,88 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define POWER_RAM_POWERSET_S0RETENTION_Msk (0x1UL << POWER_RAM_POWERSET_S0RETENTION_Pos) /*!< Bit mask of S0RETENTION field. */ #define POWER_RAM_POWERSET_S0RETENTION_On (1UL) /*!< On */ -/* Bit 15 : Keep RAM section S15 of RAM0 on or off in System ON mode */ +/* Bit 15 : Keep RAM section S15 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S15POWER_Pos (15UL) /*!< Position of S15POWER field. */ #define POWER_RAM_POWERSET_S15POWER_Msk (0x1UL << POWER_RAM_POWERSET_S15POWER_Pos) /*!< Bit mask of S15POWER field. */ #define POWER_RAM_POWERSET_S15POWER_On (1UL) /*!< On */ -/* Bit 14 : Keep RAM section S14 of RAM0 on or off in System ON mode */ +/* Bit 14 : Keep RAM section S14 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S14POWER_Pos (14UL) /*!< Position of S14POWER field. */ #define POWER_RAM_POWERSET_S14POWER_Msk (0x1UL << POWER_RAM_POWERSET_S14POWER_Pos) /*!< Bit mask of S14POWER field. */ #define POWER_RAM_POWERSET_S14POWER_On (1UL) /*!< On */ -/* Bit 13 : Keep RAM section S13 of RAM0 on or off in System ON mode */ +/* Bit 13 : Keep RAM section S13 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S13POWER_Pos (13UL) /*!< Position of S13POWER field. */ #define POWER_RAM_POWERSET_S13POWER_Msk (0x1UL << POWER_RAM_POWERSET_S13POWER_Pos) /*!< Bit mask of S13POWER field. */ #define POWER_RAM_POWERSET_S13POWER_On (1UL) /*!< On */ -/* Bit 12 : Keep RAM section S12 of RAM0 on or off in System ON mode */ +/* Bit 12 : Keep RAM section S12 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S12POWER_Pos (12UL) /*!< Position of S12POWER field. */ #define POWER_RAM_POWERSET_S12POWER_Msk (0x1UL << POWER_RAM_POWERSET_S12POWER_Pos) /*!< Bit mask of S12POWER field. */ #define POWER_RAM_POWERSET_S12POWER_On (1UL) /*!< On */ -/* Bit 11 : Keep RAM section S11 of RAM0 on or off in System ON mode */ +/* Bit 11 : Keep RAM section S11 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S11POWER_Pos (11UL) /*!< Position of S11POWER field. */ #define POWER_RAM_POWERSET_S11POWER_Msk (0x1UL << POWER_RAM_POWERSET_S11POWER_Pos) /*!< Bit mask of S11POWER field. */ #define POWER_RAM_POWERSET_S11POWER_On (1UL) /*!< On */ -/* Bit 10 : Keep RAM section S10 of RAM0 on or off in System ON mode */ +/* Bit 10 : Keep RAM section S10 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S10POWER_Pos (10UL) /*!< Position of S10POWER field. */ #define POWER_RAM_POWERSET_S10POWER_Msk (0x1UL << POWER_RAM_POWERSET_S10POWER_Pos) /*!< Bit mask of S10POWER field. */ #define POWER_RAM_POWERSET_S10POWER_On (1UL) /*!< On */ -/* Bit 9 : Keep RAM section S9 of RAM0 on or off in System ON mode */ +/* Bit 9 : Keep RAM section S9 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S9POWER_Pos (9UL) /*!< Position of S9POWER field. */ #define POWER_RAM_POWERSET_S9POWER_Msk (0x1UL << POWER_RAM_POWERSET_S9POWER_Pos) /*!< Bit mask of S9POWER field. */ #define POWER_RAM_POWERSET_S9POWER_On (1UL) /*!< On */ -/* Bit 8 : Keep RAM section S8 of RAM0 on or off in System ON mode */ +/* Bit 8 : Keep RAM section S8 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S8POWER_Pos (8UL) /*!< Position of S8POWER field. */ #define POWER_RAM_POWERSET_S8POWER_Msk (0x1UL << POWER_RAM_POWERSET_S8POWER_Pos) /*!< Bit mask of S8POWER field. */ #define POWER_RAM_POWERSET_S8POWER_On (1UL) /*!< On */ -/* Bit 7 : Keep RAM section S7 of RAM0 on or off in System ON mode */ +/* Bit 7 : Keep RAM section S7 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S7POWER_Pos (7UL) /*!< Position of S7POWER field. */ #define POWER_RAM_POWERSET_S7POWER_Msk (0x1UL << POWER_RAM_POWERSET_S7POWER_Pos) /*!< Bit mask of S7POWER field. */ #define POWER_RAM_POWERSET_S7POWER_On (1UL) /*!< On */ -/* Bit 6 : Keep RAM section S6 of RAM0 on or off in System ON mode */ +/* Bit 6 : Keep RAM section S6 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S6POWER_Pos (6UL) /*!< Position of S6POWER field. */ #define POWER_RAM_POWERSET_S6POWER_Msk (0x1UL << POWER_RAM_POWERSET_S6POWER_Pos) /*!< Bit mask of S6POWER field. */ #define POWER_RAM_POWERSET_S6POWER_On (1UL) /*!< On */ -/* Bit 5 : Keep RAM section S5 of RAM0 on or off in System ON mode */ +/* Bit 5 : Keep RAM section S5 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S5POWER_Pos (5UL) /*!< Position of S5POWER field. */ #define POWER_RAM_POWERSET_S5POWER_Msk (0x1UL << POWER_RAM_POWERSET_S5POWER_Pos) /*!< Bit mask of S5POWER field. */ #define POWER_RAM_POWERSET_S5POWER_On (1UL) /*!< On */ -/* Bit 4 : Keep RAM section S4 of RAM0 on or off in System ON mode */ +/* Bit 4 : Keep RAM section S4 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S4POWER_Pos (4UL) /*!< Position of S4POWER field. */ #define POWER_RAM_POWERSET_S4POWER_Msk (0x1UL << POWER_RAM_POWERSET_S4POWER_Pos) /*!< Bit mask of S4POWER field. */ #define POWER_RAM_POWERSET_S4POWER_On (1UL) /*!< On */ -/* Bit 3 : Keep RAM section S3 of RAM0 on or off in System ON mode */ +/* Bit 3 : Keep RAM section S3 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S3POWER_Pos (3UL) /*!< Position of S3POWER field. */ #define POWER_RAM_POWERSET_S3POWER_Msk (0x1UL << POWER_RAM_POWERSET_S3POWER_Pos) /*!< Bit mask of S3POWER field. */ #define POWER_RAM_POWERSET_S3POWER_On (1UL) /*!< On */ -/* Bit 2 : Keep RAM section S2 of RAM0 on or off in System ON mode */ +/* Bit 2 : Keep RAM section S2 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S2POWER_Pos (2UL) /*!< Position of S2POWER field. */ #define POWER_RAM_POWERSET_S2POWER_Msk (0x1UL << POWER_RAM_POWERSET_S2POWER_Pos) /*!< Bit mask of S2POWER field. */ #define POWER_RAM_POWERSET_S2POWER_On (1UL) /*!< On */ -/* Bit 1 : Keep RAM section S1 of RAM0 on or off in System ON mode */ +/* Bit 1 : Keep RAM section S1 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S1POWER_Pos (1UL) /*!< Position of S1POWER field. */ #define POWER_RAM_POWERSET_S1POWER_Msk (0x1UL << POWER_RAM_POWERSET_S1POWER_Pos) /*!< Bit mask of S1POWER field. */ #define POWER_RAM_POWERSET_S1POWER_On (1UL) /*!< On */ -/* Bit 0 : Keep RAM section S0 of RAM0 on or off in System ON mode */ +/* Bit 0 : Keep RAM section S0 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERSET_S0POWER_Pos (0UL) /*!< Position of S0POWER field. */ #define POWER_RAM_POWERSET_S0POWER_Msk (0x1UL << POWER_RAM_POWERSET_S0POWER_Pos) /*!< Bit mask of S0POWER field. */ #define POWER_RAM_POWERSET_S0POWER_On (1UL) /*!< On */ /* Register: POWER_RAM_POWERCLR */ -/* Description: Description cluster[0]: RAM0 power control clear register */ +/* Description: Description cluster[n]: RAMn power control clear register */ /* Bit 31 : Keep retention on RAM section S15 when RAM section is switched off */ #define POWER_RAM_POWERCLR_S15RETENTION_Pos (31UL) /*!< Position of S15RETENTION field. */ @@ -6850,82 +7670,82 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define POWER_RAM_POWERCLR_S0RETENTION_Msk (0x1UL << POWER_RAM_POWERCLR_S0RETENTION_Pos) /*!< Bit mask of S0RETENTION field. */ #define POWER_RAM_POWERCLR_S0RETENTION_Off (1UL) /*!< Off */ -/* Bit 15 : Keep RAM section S15 of RAM0 on or off in System ON mode */ +/* Bit 15 : Keep RAM section S15 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S15POWER_Pos (15UL) /*!< Position of S15POWER field. */ #define POWER_RAM_POWERCLR_S15POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S15POWER_Pos) /*!< Bit mask of S15POWER field. */ #define POWER_RAM_POWERCLR_S15POWER_Off (1UL) /*!< Off */ -/* Bit 14 : Keep RAM section S14 of RAM0 on or off in System ON mode */ +/* Bit 14 : Keep RAM section S14 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S14POWER_Pos (14UL) /*!< Position of S14POWER field. */ #define POWER_RAM_POWERCLR_S14POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S14POWER_Pos) /*!< Bit mask of S14POWER field. */ #define POWER_RAM_POWERCLR_S14POWER_Off (1UL) /*!< Off */ -/* Bit 13 : Keep RAM section S13 of RAM0 on or off in System ON mode */ +/* Bit 13 : Keep RAM section S13 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S13POWER_Pos (13UL) /*!< Position of S13POWER field. */ #define POWER_RAM_POWERCLR_S13POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S13POWER_Pos) /*!< Bit mask of S13POWER field. */ #define POWER_RAM_POWERCLR_S13POWER_Off (1UL) /*!< Off */ -/* Bit 12 : Keep RAM section S12 of RAM0 on or off in System ON mode */ +/* Bit 12 : Keep RAM section S12 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S12POWER_Pos (12UL) /*!< Position of S12POWER field. */ #define POWER_RAM_POWERCLR_S12POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S12POWER_Pos) /*!< Bit mask of S12POWER field. */ #define POWER_RAM_POWERCLR_S12POWER_Off (1UL) /*!< Off */ -/* Bit 11 : Keep RAM section S11 of RAM0 on or off in System ON mode */ +/* Bit 11 : Keep RAM section S11 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S11POWER_Pos (11UL) /*!< Position of S11POWER field. */ #define POWER_RAM_POWERCLR_S11POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S11POWER_Pos) /*!< Bit mask of S11POWER field. */ #define POWER_RAM_POWERCLR_S11POWER_Off (1UL) /*!< Off */ -/* Bit 10 : Keep RAM section S10 of RAM0 on or off in System ON mode */ +/* Bit 10 : Keep RAM section S10 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S10POWER_Pos (10UL) /*!< Position of S10POWER field. */ #define POWER_RAM_POWERCLR_S10POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S10POWER_Pos) /*!< Bit mask of S10POWER field. */ #define POWER_RAM_POWERCLR_S10POWER_Off (1UL) /*!< Off */ -/* Bit 9 : Keep RAM section S9 of RAM0 on or off in System ON mode */ +/* Bit 9 : Keep RAM section S9 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S9POWER_Pos (9UL) /*!< Position of S9POWER field. */ #define POWER_RAM_POWERCLR_S9POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S9POWER_Pos) /*!< Bit mask of S9POWER field. */ #define POWER_RAM_POWERCLR_S9POWER_Off (1UL) /*!< Off */ -/* Bit 8 : Keep RAM section S8 of RAM0 on or off in System ON mode */ +/* Bit 8 : Keep RAM section S8 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S8POWER_Pos (8UL) /*!< Position of S8POWER field. */ #define POWER_RAM_POWERCLR_S8POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S8POWER_Pos) /*!< Bit mask of S8POWER field. */ #define POWER_RAM_POWERCLR_S8POWER_Off (1UL) /*!< Off */ -/* Bit 7 : Keep RAM section S7 of RAM0 on or off in System ON mode */ +/* Bit 7 : Keep RAM section S7 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S7POWER_Pos (7UL) /*!< Position of S7POWER field. */ #define POWER_RAM_POWERCLR_S7POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S7POWER_Pos) /*!< Bit mask of S7POWER field. */ #define POWER_RAM_POWERCLR_S7POWER_Off (1UL) /*!< Off */ -/* Bit 6 : Keep RAM section S6 of RAM0 on or off in System ON mode */ +/* Bit 6 : Keep RAM section S6 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S6POWER_Pos (6UL) /*!< Position of S6POWER field. */ #define POWER_RAM_POWERCLR_S6POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S6POWER_Pos) /*!< Bit mask of S6POWER field. */ #define POWER_RAM_POWERCLR_S6POWER_Off (1UL) /*!< Off */ -/* Bit 5 : Keep RAM section S5 of RAM0 on or off in System ON mode */ +/* Bit 5 : Keep RAM section S5 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S5POWER_Pos (5UL) /*!< Position of S5POWER field. */ #define POWER_RAM_POWERCLR_S5POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S5POWER_Pos) /*!< Bit mask of S5POWER field. */ #define POWER_RAM_POWERCLR_S5POWER_Off (1UL) /*!< Off */ -/* Bit 4 : Keep RAM section S4 of RAM0 on or off in System ON mode */ +/* Bit 4 : Keep RAM section S4 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S4POWER_Pos (4UL) /*!< Position of S4POWER field. */ #define POWER_RAM_POWERCLR_S4POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S4POWER_Pos) /*!< Bit mask of S4POWER field. */ #define POWER_RAM_POWERCLR_S4POWER_Off (1UL) /*!< Off */ -/* Bit 3 : Keep RAM section S3 of RAM0 on or off in System ON mode */ +/* Bit 3 : Keep RAM section S3 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S3POWER_Pos (3UL) /*!< Position of S3POWER field. */ #define POWER_RAM_POWERCLR_S3POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S3POWER_Pos) /*!< Bit mask of S3POWER field. */ #define POWER_RAM_POWERCLR_S3POWER_Off (1UL) /*!< Off */ -/* Bit 2 : Keep RAM section S2 of RAM0 on or off in System ON mode */ +/* Bit 2 : Keep RAM section S2 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S2POWER_Pos (2UL) /*!< Position of S2POWER field. */ #define POWER_RAM_POWERCLR_S2POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S2POWER_Pos) /*!< Bit mask of S2POWER field. */ #define POWER_RAM_POWERCLR_S2POWER_Off (1UL) /*!< Off */ -/* Bit 1 : Keep RAM section S1 of RAM0 on or off in System ON mode */ +/* Bit 1 : Keep RAM section S1 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S1POWER_Pos (1UL) /*!< Position of S1POWER field. */ #define POWER_RAM_POWERCLR_S1POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S1POWER_Pos) /*!< Bit mask of S1POWER field. */ #define POWER_RAM_POWERCLR_S1POWER_Off (1UL) /*!< Off */ -/* Bit 0 : Keep RAM section S0 of RAM0 on or off in System ON mode */ +/* Bit 0 : Keep RAM section S0 of RAMn on or off in System ON mode */ #define POWER_RAM_POWERCLR_S0POWER_Pos (0UL) /*!< Position of S0POWER field. */ #define POWER_RAM_POWERCLR_S0POWER_Msk (0x1UL << POWER_RAM_POWERCLR_S0POWER_Pos) /*!< Bit mask of S0POWER field. */ #define POWER_RAM_POWERCLR_S0POWER_Off (1UL) /*!< Off */ @@ -6934,6 +7754,20 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: PPI */ /* Description: Programmable Peripheral Interconnect */ +/* Register: PPI_TASKS_CHG_EN */ +/* Description: Description cluster[n]: Enable channel group n */ + +/* Bit 0 : */ +#define PPI_TASKS_CHG_EN_EN_Pos (0UL) /*!< Position of EN field. */ +#define PPI_TASKS_CHG_EN_EN_Msk (0x1UL << PPI_TASKS_CHG_EN_EN_Pos) /*!< Bit mask of EN field. */ + +/* Register: PPI_TASKS_CHG_DIS */ +/* Description: Description cluster[n]: Disable channel group n */ + +/* Bit 0 : */ +#define PPI_TASKS_CHG_DIS_DIS_Pos (0UL) /*!< Position of DIS field. */ +#define PPI_TASKS_CHG_DIS_DIS_Msk (0x1UL << PPI_TASKS_CHG_DIS_DIS_Pos) /*!< Bit mask of DIS field. */ + /* Register: PPI_CHEN */ /* Description: Channel enable register */ @@ -7584,21 +8418,21 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define PPI_CHENCLR_CH0_Clear (1UL) /*!< Write: disable channel */ /* Register: PPI_CH_EEP */ -/* Description: Description cluster[0]: Channel 0 event end-point */ +/* Description: Description cluster[n]: Channel n event end-point */ /* Bits 31..0 : Pointer to event register. Accepts only addresses to registers from the Event group. */ #define PPI_CH_EEP_EEP_Pos (0UL) /*!< Position of EEP field. */ #define PPI_CH_EEP_EEP_Msk (0xFFFFFFFFUL << PPI_CH_EEP_EEP_Pos) /*!< Bit mask of EEP field. */ /* Register: PPI_CH_TEP */ -/* Description: Description cluster[0]: Channel 0 task end-point */ +/* Description: Description cluster[n]: Channel n task end-point */ /* Bits 31..0 : Pointer to task register. Accepts only addresses to registers from the Task group. */ #define PPI_CH_TEP_TEP_Pos (0UL) /*!< Position of TEP field. */ #define PPI_CH_TEP_TEP_Msk (0xFFFFFFFFUL << PPI_CH_TEP_TEP_Pos) /*!< Bit mask of TEP field. */ /* Register: PPI_CHG */ -/* Description: Description collection[0]: Channel group 0 */ +/* Description: Description collection[n]: Channel group n */ /* Bit 31 : Include or exclude channel 31 */ #define PPI_CHG_CH31_Pos (31UL) /*!< Position of CH31 field. */ @@ -7793,7 +8627,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define PPI_CHG_CH0_Included (1UL) /*!< Include */ /* Register: PPI_FORK_TEP */ -/* Description: Description cluster[0]: Channel 0 task end-point */ +/* Description: Description cluster[n]: Channel n task end-point */ /* Bits 31..0 : Pointer to task register */ #define PPI_FORK_TEP_TEP_Pos (0UL) /*!< Position of TEP field. */ @@ -7801,7 +8635,63 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: PWM */ -/* Description: Pulse Width Modulation Unit 0 */ +/* Description: Pulse width modulation unit 0 */ + +/* Register: PWM_TASKS_STOP */ +/* Description: Stops PWM pulse generation on all channels at the end of current PWM period, and stops sequence playback */ + +/* Bit 0 : */ +#define PWM_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define PWM_TASKS_STOP_TASKS_STOP_Msk (0x1UL << PWM_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: PWM_TASKS_SEQSTART */ +/* Description: Description collection[n]: Loads the first PWM value on all enabled channels from sequence n, and starts playing that sequence at the rate defined in SEQ[n]REFRESH and/or DECODER.MODE. Causes PWM generation to start if not running. */ + +/* Bit 0 : */ +#define PWM_TASKS_SEQSTART_TASKS_SEQSTART_Pos (0UL) /*!< Position of TASKS_SEQSTART field. */ +#define PWM_TASKS_SEQSTART_TASKS_SEQSTART_Msk (0x1UL << PWM_TASKS_SEQSTART_TASKS_SEQSTART_Pos) /*!< Bit mask of TASKS_SEQSTART field. */ + +/* Register: PWM_TASKS_NEXTSTEP */ +/* Description: Steps by one value in the current sequence on all enabled channels if DECODER.MODE=NextStep. Does not cause PWM generation to start if not running. */ + +/* Bit 0 : */ +#define PWM_TASKS_NEXTSTEP_TASKS_NEXTSTEP_Pos (0UL) /*!< Position of TASKS_NEXTSTEP field. */ +#define PWM_TASKS_NEXTSTEP_TASKS_NEXTSTEP_Msk (0x1UL << PWM_TASKS_NEXTSTEP_TASKS_NEXTSTEP_Pos) /*!< Bit mask of TASKS_NEXTSTEP field. */ + +/* Register: PWM_EVENTS_STOPPED */ +/* Description: Response to STOP task, emitted when PWM pulses are no longer generated */ + +/* Bit 0 : */ +#define PWM_EVENTS_STOPPED_EVENTS_STOPPED_Pos (0UL) /*!< Position of EVENTS_STOPPED field. */ +#define PWM_EVENTS_STOPPED_EVENTS_STOPPED_Msk (0x1UL << PWM_EVENTS_STOPPED_EVENTS_STOPPED_Pos) /*!< Bit mask of EVENTS_STOPPED field. */ + +/* Register: PWM_EVENTS_SEQSTARTED */ +/* Description: Description collection[n]: First PWM period started on sequence n */ + +/* Bit 0 : */ +#define PWM_EVENTS_SEQSTARTED_EVENTS_SEQSTARTED_Pos (0UL) /*!< Position of EVENTS_SEQSTARTED field. */ +#define PWM_EVENTS_SEQSTARTED_EVENTS_SEQSTARTED_Msk (0x1UL << PWM_EVENTS_SEQSTARTED_EVENTS_SEQSTARTED_Pos) /*!< Bit mask of EVENTS_SEQSTARTED field. */ + +/* Register: PWM_EVENTS_SEQEND */ +/* Description: Description collection[n]: Emitted at end of every sequence n, when last value from RAM has been applied to wave counter */ + +/* Bit 0 : */ +#define PWM_EVENTS_SEQEND_EVENTS_SEQEND_Pos (0UL) /*!< Position of EVENTS_SEQEND field. */ +#define PWM_EVENTS_SEQEND_EVENTS_SEQEND_Msk (0x1UL << PWM_EVENTS_SEQEND_EVENTS_SEQEND_Pos) /*!< Bit mask of EVENTS_SEQEND field. */ + +/* Register: PWM_EVENTS_PWMPERIODEND */ +/* Description: Emitted at the end of each PWM period */ + +/* Bit 0 : */ +#define PWM_EVENTS_PWMPERIODEND_EVENTS_PWMPERIODEND_Pos (0UL) /*!< Position of EVENTS_PWMPERIODEND field. */ +#define PWM_EVENTS_PWMPERIODEND_EVENTS_PWMPERIODEND_Msk (0x1UL << PWM_EVENTS_PWMPERIODEND_EVENTS_PWMPERIODEND_Pos) /*!< Bit mask of EVENTS_PWMPERIODEND field. */ + +/* Register: PWM_EVENTS_LOOPSDONE */ +/* Description: Concatenated sequences have been played the amount of times defined in LOOP.CNT */ + +/* Bit 0 : */ +#define PWM_EVENTS_LOOPSDONE_EVENTS_LOOPSDONE_Pos (0UL) /*!< Position of EVENTS_LOOPSDONE field. */ +#define PWM_EVENTS_LOOPSDONE_EVENTS_LOOPSDONE_Msk (0x1UL << PWM_EVENTS_LOOPSDONE_EVENTS_LOOPSDONE_Pos) /*!< Bit mask of EVENTS_LOOPSDONE field. */ /* Register: PWM_SHORTS */ /* Description: Shortcut register */ @@ -7884,49 +8774,49 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: PWM_INTENSET */ /* Description: Enable interrupt */ -/* Bit 7 : Write '1' to Enable interrupt for LOOPSDONE event */ +/* Bit 7 : Write '1' to enable interrupt for LOOPSDONE event */ #define PWM_INTENSET_LOOPSDONE_Pos (7UL) /*!< Position of LOOPSDONE field. */ #define PWM_INTENSET_LOOPSDONE_Msk (0x1UL << PWM_INTENSET_LOOPSDONE_Pos) /*!< Bit mask of LOOPSDONE field. */ #define PWM_INTENSET_LOOPSDONE_Disabled (0UL) /*!< Read: Disabled */ #define PWM_INTENSET_LOOPSDONE_Enabled (1UL) /*!< Read: Enabled */ #define PWM_INTENSET_LOOPSDONE_Set (1UL) /*!< Enable */ -/* Bit 6 : Write '1' to Enable interrupt for PWMPERIODEND event */ +/* Bit 6 : Write '1' to enable interrupt for PWMPERIODEND event */ #define PWM_INTENSET_PWMPERIODEND_Pos (6UL) /*!< Position of PWMPERIODEND field. */ #define PWM_INTENSET_PWMPERIODEND_Msk (0x1UL << PWM_INTENSET_PWMPERIODEND_Pos) /*!< Bit mask of PWMPERIODEND field. */ #define PWM_INTENSET_PWMPERIODEND_Disabled (0UL) /*!< Read: Disabled */ #define PWM_INTENSET_PWMPERIODEND_Enabled (1UL) /*!< Read: Enabled */ #define PWM_INTENSET_PWMPERIODEND_Set (1UL) /*!< Enable */ -/* Bit 5 : Write '1' to Enable interrupt for SEQEND[1] event */ +/* Bit 5 : Write '1' to enable interrupt for SEQEND[1] event */ #define PWM_INTENSET_SEQEND1_Pos (5UL) /*!< Position of SEQEND1 field. */ #define PWM_INTENSET_SEQEND1_Msk (0x1UL << PWM_INTENSET_SEQEND1_Pos) /*!< Bit mask of SEQEND1 field. */ #define PWM_INTENSET_SEQEND1_Disabled (0UL) /*!< Read: Disabled */ #define PWM_INTENSET_SEQEND1_Enabled (1UL) /*!< Read: Enabled */ #define PWM_INTENSET_SEQEND1_Set (1UL) /*!< Enable */ -/* Bit 4 : Write '1' to Enable interrupt for SEQEND[0] event */ +/* Bit 4 : Write '1' to enable interrupt for SEQEND[0] event */ #define PWM_INTENSET_SEQEND0_Pos (4UL) /*!< Position of SEQEND0 field. */ #define PWM_INTENSET_SEQEND0_Msk (0x1UL << PWM_INTENSET_SEQEND0_Pos) /*!< Bit mask of SEQEND0 field. */ #define PWM_INTENSET_SEQEND0_Disabled (0UL) /*!< Read: Disabled */ #define PWM_INTENSET_SEQEND0_Enabled (1UL) /*!< Read: Enabled */ #define PWM_INTENSET_SEQEND0_Set (1UL) /*!< Enable */ -/* Bit 3 : Write '1' to Enable interrupt for SEQSTARTED[1] event */ +/* Bit 3 : Write '1' to enable interrupt for SEQSTARTED[1] event */ #define PWM_INTENSET_SEQSTARTED1_Pos (3UL) /*!< Position of SEQSTARTED1 field. */ #define PWM_INTENSET_SEQSTARTED1_Msk (0x1UL << PWM_INTENSET_SEQSTARTED1_Pos) /*!< Bit mask of SEQSTARTED1 field. */ #define PWM_INTENSET_SEQSTARTED1_Disabled (0UL) /*!< Read: Disabled */ #define PWM_INTENSET_SEQSTARTED1_Enabled (1UL) /*!< Read: Enabled */ #define PWM_INTENSET_SEQSTARTED1_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for SEQSTARTED[0] event */ +/* Bit 2 : Write '1' to enable interrupt for SEQSTARTED[0] event */ #define PWM_INTENSET_SEQSTARTED0_Pos (2UL) /*!< Position of SEQSTARTED0 field. */ #define PWM_INTENSET_SEQSTARTED0_Msk (0x1UL << PWM_INTENSET_SEQSTARTED0_Pos) /*!< Bit mask of SEQSTARTED0 field. */ #define PWM_INTENSET_SEQSTARTED0_Disabled (0UL) /*!< Read: Disabled */ #define PWM_INTENSET_SEQSTARTED0_Enabled (1UL) /*!< Read: Enabled */ #define PWM_INTENSET_SEQSTARTED0_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for STOPPED event */ +/* Bit 1 : Write '1' to enable interrupt for STOPPED event */ #define PWM_INTENSET_STOPPED_Pos (1UL) /*!< Position of STOPPED field. */ #define PWM_INTENSET_STOPPED_Msk (0x1UL << PWM_INTENSET_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define PWM_INTENSET_STOPPED_Disabled (0UL) /*!< Read: Disabled */ @@ -7936,49 +8826,49 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: PWM_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 7 : Write '1' to Disable interrupt for LOOPSDONE event */ +/* Bit 7 : Write '1' to disable interrupt for LOOPSDONE event */ #define PWM_INTENCLR_LOOPSDONE_Pos (7UL) /*!< Position of LOOPSDONE field. */ #define PWM_INTENCLR_LOOPSDONE_Msk (0x1UL << PWM_INTENCLR_LOOPSDONE_Pos) /*!< Bit mask of LOOPSDONE field. */ #define PWM_INTENCLR_LOOPSDONE_Disabled (0UL) /*!< Read: Disabled */ #define PWM_INTENCLR_LOOPSDONE_Enabled (1UL) /*!< Read: Enabled */ #define PWM_INTENCLR_LOOPSDONE_Clear (1UL) /*!< Disable */ -/* Bit 6 : Write '1' to Disable interrupt for PWMPERIODEND event */ +/* Bit 6 : Write '1' to disable interrupt for PWMPERIODEND event */ #define PWM_INTENCLR_PWMPERIODEND_Pos (6UL) /*!< Position of PWMPERIODEND field. */ #define PWM_INTENCLR_PWMPERIODEND_Msk (0x1UL << PWM_INTENCLR_PWMPERIODEND_Pos) /*!< Bit mask of PWMPERIODEND field. */ #define PWM_INTENCLR_PWMPERIODEND_Disabled (0UL) /*!< Read: Disabled */ #define PWM_INTENCLR_PWMPERIODEND_Enabled (1UL) /*!< Read: Enabled */ #define PWM_INTENCLR_PWMPERIODEND_Clear (1UL) /*!< Disable */ -/* Bit 5 : Write '1' to Disable interrupt for SEQEND[1] event */ +/* Bit 5 : Write '1' to disable interrupt for SEQEND[1] event */ #define PWM_INTENCLR_SEQEND1_Pos (5UL) /*!< Position of SEQEND1 field. */ #define PWM_INTENCLR_SEQEND1_Msk (0x1UL << PWM_INTENCLR_SEQEND1_Pos) /*!< Bit mask of SEQEND1 field. */ #define PWM_INTENCLR_SEQEND1_Disabled (0UL) /*!< Read: Disabled */ #define PWM_INTENCLR_SEQEND1_Enabled (1UL) /*!< Read: Enabled */ #define PWM_INTENCLR_SEQEND1_Clear (1UL) /*!< Disable */ -/* Bit 4 : Write '1' to Disable interrupt for SEQEND[0] event */ +/* Bit 4 : Write '1' to disable interrupt for SEQEND[0] event */ #define PWM_INTENCLR_SEQEND0_Pos (4UL) /*!< Position of SEQEND0 field. */ #define PWM_INTENCLR_SEQEND0_Msk (0x1UL << PWM_INTENCLR_SEQEND0_Pos) /*!< Bit mask of SEQEND0 field. */ #define PWM_INTENCLR_SEQEND0_Disabled (0UL) /*!< Read: Disabled */ #define PWM_INTENCLR_SEQEND0_Enabled (1UL) /*!< Read: Enabled */ #define PWM_INTENCLR_SEQEND0_Clear (1UL) /*!< Disable */ -/* Bit 3 : Write '1' to Disable interrupt for SEQSTARTED[1] event */ +/* Bit 3 : Write '1' to disable interrupt for SEQSTARTED[1] event */ #define PWM_INTENCLR_SEQSTARTED1_Pos (3UL) /*!< Position of SEQSTARTED1 field. */ #define PWM_INTENCLR_SEQSTARTED1_Msk (0x1UL << PWM_INTENCLR_SEQSTARTED1_Pos) /*!< Bit mask of SEQSTARTED1 field. */ #define PWM_INTENCLR_SEQSTARTED1_Disabled (0UL) /*!< Read: Disabled */ #define PWM_INTENCLR_SEQSTARTED1_Enabled (1UL) /*!< Read: Enabled */ #define PWM_INTENCLR_SEQSTARTED1_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for SEQSTARTED[0] event */ +/* Bit 2 : Write '1' to disable interrupt for SEQSTARTED[0] event */ #define PWM_INTENCLR_SEQSTARTED0_Pos (2UL) /*!< Position of SEQSTARTED0 field. */ #define PWM_INTENCLR_SEQSTARTED0_Msk (0x1UL << PWM_INTENCLR_SEQSTARTED0_Pos) /*!< Bit mask of SEQSTARTED0 field. */ #define PWM_INTENCLR_SEQSTARTED0_Disabled (0UL) /*!< Read: Disabled */ #define PWM_INTENCLR_SEQSTARTED0_Enabled (1UL) /*!< Read: Enabled */ #define PWM_INTENCLR_SEQSTARTED0_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for STOPPED event */ +/* Bit 1 : Write '1' to disable interrupt for STOPPED event */ #define PWM_INTENCLR_STOPPED_Pos (1UL) /*!< Position of STOPPED field. */ #define PWM_INTENCLR_STOPPED_Msk (0x1UL << PWM_INTENCLR_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define PWM_INTENCLR_STOPPED_Disabled (0UL) /*!< Read: Disabled */ @@ -7997,33 +8887,33 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: PWM_MODE */ /* Description: Selects operating mode of the wave counter */ -/* Bit 0 : Selects up or up and down as wave counter mode */ +/* Bit 0 : Selects up mode or up-and-down mode for the counter */ #define PWM_MODE_UPDOWN_Pos (0UL) /*!< Position of UPDOWN field. */ #define PWM_MODE_UPDOWN_Msk (0x1UL << PWM_MODE_UPDOWN_Pos) /*!< Bit mask of UPDOWN field. */ -#define PWM_MODE_UPDOWN_Up (0UL) /*!< Up counter - edge aligned PWM duty-cycle */ -#define PWM_MODE_UPDOWN_UpAndDown (1UL) /*!< Up and down counter - center aligned PWM duty cycle */ +#define PWM_MODE_UPDOWN_Up (0UL) /*!< Up counter, edge-aligned PWM duty cycle */ +#define PWM_MODE_UPDOWN_UpAndDown (1UL) /*!< Up and down counter, center-aligned PWM duty cycle */ /* Register: PWM_COUNTERTOP */ /* Description: Value up to which the pulse generator counter counts */ -/* Bits 14..0 : Value up to which the pulse generator counter counts. This register is ignored when DECODER.MODE=WaveForm and only values from RAM will be used. */ +/* Bits 14..0 : Value up to which the pulse generator counter counts. This register is ignored when DECODER.MODE=WaveForm and only values from RAM are used. */ #define PWM_COUNTERTOP_COUNTERTOP_Pos (0UL) /*!< Position of COUNTERTOP field. */ #define PWM_COUNTERTOP_COUNTERTOP_Msk (0x7FFFUL << PWM_COUNTERTOP_COUNTERTOP_Pos) /*!< Bit mask of COUNTERTOP field. */ /* Register: PWM_PRESCALER */ /* Description: Configuration for PWM_CLK */ -/* Bits 2..0 : Pre-scaler of PWM_CLK */ +/* Bits 2..0 : Prescaler of PWM_CLK */ #define PWM_PRESCALER_PRESCALER_Pos (0UL) /*!< Position of PRESCALER field. */ #define PWM_PRESCALER_PRESCALER_Msk (0x7UL << PWM_PRESCALER_PRESCALER_Pos) /*!< Bit mask of PRESCALER field. */ -#define PWM_PRESCALER_PRESCALER_DIV_1 (0UL) /*!< Divide by 1 (16MHz) */ -#define PWM_PRESCALER_PRESCALER_DIV_2 (1UL) /*!< Divide by 2 ( 8MHz) */ -#define PWM_PRESCALER_PRESCALER_DIV_4 (2UL) /*!< Divide by 4 ( 4MHz) */ -#define PWM_PRESCALER_PRESCALER_DIV_8 (3UL) /*!< Divide by 8 ( 2MHz) */ -#define PWM_PRESCALER_PRESCALER_DIV_16 (4UL) /*!< Divide by 16 ( 1MHz) */ -#define PWM_PRESCALER_PRESCALER_DIV_32 (5UL) /*!< Divide by 32 ( 500kHz) */ -#define PWM_PRESCALER_PRESCALER_DIV_64 (6UL) /*!< Divide by 64 ( 250kHz) */ -#define PWM_PRESCALER_PRESCALER_DIV_128 (7UL) /*!< Divide by 128 ( 125kHz) */ +#define PWM_PRESCALER_PRESCALER_DIV_1 (0UL) /*!< Divide by 1 (16 MHz) */ +#define PWM_PRESCALER_PRESCALER_DIV_2 (1UL) /*!< Divide by 2 (8 MHz) */ +#define PWM_PRESCALER_PRESCALER_DIV_4 (2UL) /*!< Divide by 4 (4 MHz) */ +#define PWM_PRESCALER_PRESCALER_DIV_8 (3UL) /*!< Divide by 8 (2 MHz) */ +#define PWM_PRESCALER_PRESCALER_DIV_16 (4UL) /*!< Divide by 16 (1 MHz) */ +#define PWM_PRESCALER_PRESCALER_DIV_32 (5UL) /*!< Divide by 32 (500 kHz) */ +#define PWM_PRESCALER_PRESCALER_DIV_64 (6UL) /*!< Divide by 64 (250 kHz) */ +#define PWM_PRESCALER_PRESCALER_DIV_128 (7UL) /*!< Divide by 128 (125 kHz) */ /* Register: PWM_DECODER */ /* Description: Configuration of the decoder */ @@ -8043,45 +8933,45 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define PWM_DECODER_LOAD_WaveForm (3UL) /*!< 1st half word (16-bit) in ch.0; 2nd in ch.1; ...; 4th in COUNTERTOP */ /* Register: PWM_LOOP */ -/* Description: Amount of playback of a loop */ +/* Description: Number of playbacks of a loop */ -/* Bits 15..0 : Amount of playback of pattern cycles */ +/* Bits 15..0 : Number of playbacks of pattern cycles */ #define PWM_LOOP_CNT_Pos (0UL) /*!< Position of CNT field. */ #define PWM_LOOP_CNT_Msk (0xFFFFUL << PWM_LOOP_CNT_Pos) /*!< Bit mask of CNT field. */ #define PWM_LOOP_CNT_Disabled (0UL) /*!< Looping disabled (stop at the end of the sequence) */ /* Register: PWM_SEQ_PTR */ -/* Description: Description cluster[0]: Beginning address in Data RAM of this sequence */ +/* Description: Description cluster[n]: Beginning address in RAM of this sequence */ -/* Bits 31..0 : Beginning address in Data RAM of this sequence */ +/* Bits 31..0 : Beginning address in RAM of this sequence */ #define PWM_SEQ_PTR_PTR_Pos (0UL) /*!< Position of PTR field. */ #define PWM_SEQ_PTR_PTR_Msk (0xFFFFFFFFUL << PWM_SEQ_PTR_PTR_Pos) /*!< Bit mask of PTR field. */ /* Register: PWM_SEQ_CNT */ -/* Description: Description cluster[0]: Amount of values (duty cycles) in this sequence */ +/* Description: Description cluster[n]: Number of values (duty cycles) in this sequence */ -/* Bits 14..0 : Amount of values (duty cycles) in this sequence */ +/* Bits 14..0 : Number of values (duty cycles) in this sequence */ #define PWM_SEQ_CNT_CNT_Pos (0UL) /*!< Position of CNT field. */ #define PWM_SEQ_CNT_CNT_Msk (0x7FFFUL << PWM_SEQ_CNT_CNT_Pos) /*!< Bit mask of CNT field. */ #define PWM_SEQ_CNT_CNT_Disabled (0UL) /*!< Sequence is disabled, and shall not be started as it is empty */ /* Register: PWM_SEQ_REFRESH */ -/* Description: Description cluster[0]: Amount of additional PWM periods between samples loaded into compare register */ +/* Description: Description cluster[n]: Number of additional PWM periods between samples loaded into compare register */ -/* Bits 23..0 : Amount of additional PWM periods between samples loaded into compare register (load every REFRESH.CNT+1 PWM periods) */ +/* Bits 23..0 : Number of additional PWM periods between samples loaded into compare register (load every REFRESH.CNT+1 PWM periods) */ #define PWM_SEQ_REFRESH_CNT_Pos (0UL) /*!< Position of CNT field. */ #define PWM_SEQ_REFRESH_CNT_Msk (0xFFFFFFUL << PWM_SEQ_REFRESH_CNT_Pos) /*!< Bit mask of CNT field. */ #define PWM_SEQ_REFRESH_CNT_Continuous (0UL) /*!< Update every PWM period */ /* Register: PWM_SEQ_ENDDELAY */ -/* Description: Description cluster[0]: Time added after the sequence */ +/* Description: Description cluster[n]: Time added after the sequence */ /* Bits 23..0 : Time added after the sequence in PWM periods */ #define PWM_SEQ_ENDDELAY_CNT_Pos (0UL) /*!< Position of CNT field. */ #define PWM_SEQ_ENDDELAY_CNT_Msk (0xFFFFFFUL << PWM_SEQ_ENDDELAY_CNT_Pos) /*!< Bit mask of CNT field. */ /* Register: PWM_PSEL_OUT */ -/* Description: Description collection[0]: Output pin select for PWM channel 0 */ +/* Description: Description collection[n]: Output pin select for PWM channel n */ /* Bit 31 : Connection */ #define PWM_PSEL_OUT_CONNECT_Pos (31UL) /*!< Position of CONNECT field. */ @@ -8101,6 +8991,76 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: QDEC */ /* Description: Quadrature Decoder */ +/* Register: QDEC_TASKS_START */ +/* Description: Task starting the quadrature decoder */ + +/* Bit 0 : */ +#define QDEC_TASKS_START_TASKS_START_Pos (0UL) /*!< Position of TASKS_START field. */ +#define QDEC_TASKS_START_TASKS_START_Msk (0x1UL << QDEC_TASKS_START_TASKS_START_Pos) /*!< Bit mask of TASKS_START field. */ + +/* Register: QDEC_TASKS_STOP */ +/* Description: Task stopping the quadrature decoder */ + +/* Bit 0 : */ +#define QDEC_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define QDEC_TASKS_STOP_TASKS_STOP_Msk (0x1UL << QDEC_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: QDEC_TASKS_READCLRACC */ +/* Description: Read and clear ACC and ACCDBL */ + +/* Bit 0 : */ +#define QDEC_TASKS_READCLRACC_TASKS_READCLRACC_Pos (0UL) /*!< Position of TASKS_READCLRACC field. */ +#define QDEC_TASKS_READCLRACC_TASKS_READCLRACC_Msk (0x1UL << QDEC_TASKS_READCLRACC_TASKS_READCLRACC_Pos) /*!< Bit mask of TASKS_READCLRACC field. */ + +/* Register: QDEC_TASKS_RDCLRACC */ +/* Description: Read and clear ACC */ + +/* Bit 0 : */ +#define QDEC_TASKS_RDCLRACC_TASKS_RDCLRACC_Pos (0UL) /*!< Position of TASKS_RDCLRACC field. */ +#define QDEC_TASKS_RDCLRACC_TASKS_RDCLRACC_Msk (0x1UL << QDEC_TASKS_RDCLRACC_TASKS_RDCLRACC_Pos) /*!< Bit mask of TASKS_RDCLRACC field. */ + +/* Register: QDEC_TASKS_RDCLRDBL */ +/* Description: Read and clear ACCDBL */ + +/* Bit 0 : */ +#define QDEC_TASKS_RDCLRDBL_TASKS_RDCLRDBL_Pos (0UL) /*!< Position of TASKS_RDCLRDBL field. */ +#define QDEC_TASKS_RDCLRDBL_TASKS_RDCLRDBL_Msk (0x1UL << QDEC_TASKS_RDCLRDBL_TASKS_RDCLRDBL_Pos) /*!< Bit mask of TASKS_RDCLRDBL field. */ + +/* Register: QDEC_EVENTS_SAMPLERDY */ +/* Description: Event being generated for every new sample value written to the SAMPLE register */ + +/* Bit 0 : */ +#define QDEC_EVENTS_SAMPLERDY_EVENTS_SAMPLERDY_Pos (0UL) /*!< Position of EVENTS_SAMPLERDY field. */ +#define QDEC_EVENTS_SAMPLERDY_EVENTS_SAMPLERDY_Msk (0x1UL << QDEC_EVENTS_SAMPLERDY_EVENTS_SAMPLERDY_Pos) /*!< Bit mask of EVENTS_SAMPLERDY field. */ + +/* Register: QDEC_EVENTS_REPORTRDY */ +/* Description: Non-null report ready */ + +/* Bit 0 : */ +#define QDEC_EVENTS_REPORTRDY_EVENTS_REPORTRDY_Pos (0UL) /*!< Position of EVENTS_REPORTRDY field. */ +#define QDEC_EVENTS_REPORTRDY_EVENTS_REPORTRDY_Msk (0x1UL << QDEC_EVENTS_REPORTRDY_EVENTS_REPORTRDY_Pos) /*!< Bit mask of EVENTS_REPORTRDY field. */ + +/* Register: QDEC_EVENTS_ACCOF */ +/* Description: ACC or ACCDBL register overflow */ + +/* Bit 0 : */ +#define QDEC_EVENTS_ACCOF_EVENTS_ACCOF_Pos (0UL) /*!< Position of EVENTS_ACCOF field. */ +#define QDEC_EVENTS_ACCOF_EVENTS_ACCOF_Msk (0x1UL << QDEC_EVENTS_ACCOF_EVENTS_ACCOF_Pos) /*!< Bit mask of EVENTS_ACCOF field. */ + +/* Register: QDEC_EVENTS_DBLRDY */ +/* Description: Double displacement(s) detected */ + +/* Bit 0 : */ +#define QDEC_EVENTS_DBLRDY_EVENTS_DBLRDY_Pos (0UL) /*!< Position of EVENTS_DBLRDY field. */ +#define QDEC_EVENTS_DBLRDY_EVENTS_DBLRDY_Msk (0x1UL << QDEC_EVENTS_DBLRDY_EVENTS_DBLRDY_Pos) /*!< Bit mask of EVENTS_DBLRDY field. */ + +/* Register: QDEC_EVENTS_STOPPED */ +/* Description: QDEC has been stopped */ + +/* Bit 0 : */ +#define QDEC_EVENTS_STOPPED_EVENTS_STOPPED_Pos (0UL) /*!< Position of EVENTS_STOPPED field. */ +#define QDEC_EVENTS_STOPPED_EVENTS_STOPPED_Msk (0x1UL << QDEC_EVENTS_STOPPED_EVENTS_STOPPED_Pos) /*!< Bit mask of EVENTS_STOPPED field. */ + /* Register: QDEC_SHORTS */ /* Description: Shortcut register */ @@ -8149,35 +9109,35 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: QDEC_INTENSET */ /* Description: Enable interrupt */ -/* Bit 4 : Write '1' to Enable interrupt for STOPPED event */ +/* Bit 4 : Write '1' to enable interrupt for STOPPED event */ #define QDEC_INTENSET_STOPPED_Pos (4UL) /*!< Position of STOPPED field. */ #define QDEC_INTENSET_STOPPED_Msk (0x1UL << QDEC_INTENSET_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define QDEC_INTENSET_STOPPED_Disabled (0UL) /*!< Read: Disabled */ #define QDEC_INTENSET_STOPPED_Enabled (1UL) /*!< Read: Enabled */ #define QDEC_INTENSET_STOPPED_Set (1UL) /*!< Enable */ -/* Bit 3 : Write '1' to Enable interrupt for DBLRDY event */ +/* Bit 3 : Write '1' to enable interrupt for DBLRDY event */ #define QDEC_INTENSET_DBLRDY_Pos (3UL) /*!< Position of DBLRDY field. */ #define QDEC_INTENSET_DBLRDY_Msk (0x1UL << QDEC_INTENSET_DBLRDY_Pos) /*!< Bit mask of DBLRDY field. */ #define QDEC_INTENSET_DBLRDY_Disabled (0UL) /*!< Read: Disabled */ #define QDEC_INTENSET_DBLRDY_Enabled (1UL) /*!< Read: Enabled */ #define QDEC_INTENSET_DBLRDY_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for ACCOF event */ +/* Bit 2 : Write '1' to enable interrupt for ACCOF event */ #define QDEC_INTENSET_ACCOF_Pos (2UL) /*!< Position of ACCOF field. */ #define QDEC_INTENSET_ACCOF_Msk (0x1UL << QDEC_INTENSET_ACCOF_Pos) /*!< Bit mask of ACCOF field. */ #define QDEC_INTENSET_ACCOF_Disabled (0UL) /*!< Read: Disabled */ #define QDEC_INTENSET_ACCOF_Enabled (1UL) /*!< Read: Enabled */ #define QDEC_INTENSET_ACCOF_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for REPORTRDY event */ +/* Bit 1 : Write '1' to enable interrupt for REPORTRDY event */ #define QDEC_INTENSET_REPORTRDY_Pos (1UL) /*!< Position of REPORTRDY field. */ #define QDEC_INTENSET_REPORTRDY_Msk (0x1UL << QDEC_INTENSET_REPORTRDY_Pos) /*!< Bit mask of REPORTRDY field. */ #define QDEC_INTENSET_REPORTRDY_Disabled (0UL) /*!< Read: Disabled */ #define QDEC_INTENSET_REPORTRDY_Enabled (1UL) /*!< Read: Enabled */ #define QDEC_INTENSET_REPORTRDY_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for SAMPLERDY event */ +/* Bit 0 : Write '1' to enable interrupt for SAMPLERDY event */ #define QDEC_INTENSET_SAMPLERDY_Pos (0UL) /*!< Position of SAMPLERDY field. */ #define QDEC_INTENSET_SAMPLERDY_Msk (0x1UL << QDEC_INTENSET_SAMPLERDY_Pos) /*!< Bit mask of SAMPLERDY field. */ #define QDEC_INTENSET_SAMPLERDY_Disabled (0UL) /*!< Read: Disabled */ @@ -8187,35 +9147,35 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: QDEC_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 4 : Write '1' to Disable interrupt for STOPPED event */ +/* Bit 4 : Write '1' to disable interrupt for STOPPED event */ #define QDEC_INTENCLR_STOPPED_Pos (4UL) /*!< Position of STOPPED field. */ #define QDEC_INTENCLR_STOPPED_Msk (0x1UL << QDEC_INTENCLR_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define QDEC_INTENCLR_STOPPED_Disabled (0UL) /*!< Read: Disabled */ #define QDEC_INTENCLR_STOPPED_Enabled (1UL) /*!< Read: Enabled */ #define QDEC_INTENCLR_STOPPED_Clear (1UL) /*!< Disable */ -/* Bit 3 : Write '1' to Disable interrupt for DBLRDY event */ +/* Bit 3 : Write '1' to disable interrupt for DBLRDY event */ #define QDEC_INTENCLR_DBLRDY_Pos (3UL) /*!< Position of DBLRDY field. */ #define QDEC_INTENCLR_DBLRDY_Msk (0x1UL << QDEC_INTENCLR_DBLRDY_Pos) /*!< Bit mask of DBLRDY field. */ #define QDEC_INTENCLR_DBLRDY_Disabled (0UL) /*!< Read: Disabled */ #define QDEC_INTENCLR_DBLRDY_Enabled (1UL) /*!< Read: Enabled */ #define QDEC_INTENCLR_DBLRDY_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for ACCOF event */ +/* Bit 2 : Write '1' to disable interrupt for ACCOF event */ #define QDEC_INTENCLR_ACCOF_Pos (2UL) /*!< Position of ACCOF field. */ #define QDEC_INTENCLR_ACCOF_Msk (0x1UL << QDEC_INTENCLR_ACCOF_Pos) /*!< Bit mask of ACCOF field. */ #define QDEC_INTENCLR_ACCOF_Disabled (0UL) /*!< Read: Disabled */ #define QDEC_INTENCLR_ACCOF_Enabled (1UL) /*!< Read: Enabled */ #define QDEC_INTENCLR_ACCOF_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for REPORTRDY event */ +/* Bit 1 : Write '1' to disable interrupt for REPORTRDY event */ #define QDEC_INTENCLR_REPORTRDY_Pos (1UL) /*!< Position of REPORTRDY field. */ #define QDEC_INTENCLR_REPORTRDY_Msk (0x1UL << QDEC_INTENCLR_REPORTRDY_Pos) /*!< Bit mask of REPORTRDY field. */ #define QDEC_INTENCLR_REPORTRDY_Disabled (0UL) /*!< Read: Disabled */ #define QDEC_INTENCLR_REPORTRDY_Enabled (1UL) /*!< Read: Enabled */ #define QDEC_INTENCLR_REPORTRDY_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for SAMPLERDY event */ +/* Bit 0 : Write '1' to disable interrupt for SAMPLERDY event */ #define QDEC_INTENCLR_SAMPLERDY_Pos (0UL) /*!< Position of SAMPLERDY field. */ #define QDEC_INTENCLR_SAMPLERDY_Msk (0x1UL << QDEC_INTENCLR_SAMPLERDY_Pos) /*!< Bit mask of SAMPLERDY field. */ #define QDEC_INTENCLR_SAMPLERDY_Disabled (0UL) /*!< Read: Disabled */ @@ -8380,6 +9340,48 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: QSPI */ /* Description: External flash interface */ +/* Register: QSPI_TASKS_ACTIVATE */ +/* Description: Activate QSPI interface */ + +/* Bit 0 : */ +#define QSPI_TASKS_ACTIVATE_TASKS_ACTIVATE_Pos (0UL) /*!< Position of TASKS_ACTIVATE field. */ +#define QSPI_TASKS_ACTIVATE_TASKS_ACTIVATE_Msk (0x1UL << QSPI_TASKS_ACTIVATE_TASKS_ACTIVATE_Pos) /*!< Bit mask of TASKS_ACTIVATE field. */ + +/* Register: QSPI_TASKS_READSTART */ +/* Description: Start transfer from external flash memory to internal RAM */ + +/* Bit 0 : */ +#define QSPI_TASKS_READSTART_TASKS_READSTART_Pos (0UL) /*!< Position of TASKS_READSTART field. */ +#define QSPI_TASKS_READSTART_TASKS_READSTART_Msk (0x1UL << QSPI_TASKS_READSTART_TASKS_READSTART_Pos) /*!< Bit mask of TASKS_READSTART field. */ + +/* Register: QSPI_TASKS_WRITESTART */ +/* Description: Start transfer from internal RAM to external flash memory */ + +/* Bit 0 : */ +#define QSPI_TASKS_WRITESTART_TASKS_WRITESTART_Pos (0UL) /*!< Position of TASKS_WRITESTART field. */ +#define QSPI_TASKS_WRITESTART_TASKS_WRITESTART_Msk (0x1UL << QSPI_TASKS_WRITESTART_TASKS_WRITESTART_Pos) /*!< Bit mask of TASKS_WRITESTART field. */ + +/* Register: QSPI_TASKS_ERASESTART */ +/* Description: Start external flash memory erase operation */ + +/* Bit 0 : */ +#define QSPI_TASKS_ERASESTART_TASKS_ERASESTART_Pos (0UL) /*!< Position of TASKS_ERASESTART field. */ +#define QSPI_TASKS_ERASESTART_TASKS_ERASESTART_Msk (0x1UL << QSPI_TASKS_ERASESTART_TASKS_ERASESTART_Pos) /*!< Bit mask of TASKS_ERASESTART field. */ + +/* Register: QSPI_TASKS_DEACTIVATE */ +/* Description: Deactivate QSPI interface */ + +/* Bit 0 : */ +#define QSPI_TASKS_DEACTIVATE_TASKS_DEACTIVATE_Pos (0UL) /*!< Position of TASKS_DEACTIVATE field. */ +#define QSPI_TASKS_DEACTIVATE_TASKS_DEACTIVATE_Msk (0x1UL << QSPI_TASKS_DEACTIVATE_TASKS_DEACTIVATE_Pos) /*!< Bit mask of TASKS_DEACTIVATE field. */ + +/* Register: QSPI_EVENTS_READY */ +/* Description: QSPI peripheral is ready. This event will be generated as a response to any QSPI task. */ + +/* Bit 0 : */ +#define QSPI_EVENTS_READY_EVENTS_READY_Pos (0UL) /*!< Position of EVENTS_READY field. */ +#define QSPI_EVENTS_READY_EVENTS_READY_Msk (0x1UL << QSPI_EVENTS_READY_EVENTS_READY_Pos) /*!< Bit mask of EVENTS_READY field. */ + /* Register: QSPI_INTEN */ /* Description: Enable or disable interrupt */ @@ -8392,7 +9394,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: QSPI_INTENSET */ /* Description: Enable interrupt */ -/* Bit 0 : Write '1' to Enable interrupt for READY event */ +/* Bit 0 : Write '1' to enable interrupt for READY event */ #define QSPI_INTENSET_READY_Pos (0UL) /*!< Position of READY field. */ #define QSPI_INTENSET_READY_Msk (0x1UL << QSPI_INTENSET_READY_Pos) /*!< Bit mask of READY field. */ #define QSPI_INTENSET_READY_Disabled (0UL) /*!< Read: Disabled */ @@ -8402,7 +9404,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: QSPI_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 0 : Write '1' to Disable interrupt for READY event */ +/* Bit 0 : Write '1' to disable interrupt for READY event */ #define QSPI_INTENCLR_READY_Pos (0UL) /*!< Position of READY field. */ #define QSPI_INTENCLR_READY_Msk (0x1UL << QSPI_INTENCLR_READY_Pos) /*!< Bit mask of READY field. */ #define QSPI_INTENCLR_READY_Disabled (0UL) /*!< Read: Disabled */ @@ -8810,7 +9812,252 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: RADIO */ -/* Description: 2.4 GHz Radio */ +/* Description: 2.4 GHz radio */ + +/* Register: RADIO_TASKS_TXEN */ +/* Description: Enable RADIO in TX mode */ + +/* Bit 0 : */ +#define RADIO_TASKS_TXEN_TASKS_TXEN_Pos (0UL) /*!< Position of TASKS_TXEN field. */ +#define RADIO_TASKS_TXEN_TASKS_TXEN_Msk (0x1UL << RADIO_TASKS_TXEN_TASKS_TXEN_Pos) /*!< Bit mask of TASKS_TXEN field. */ + +/* Register: RADIO_TASKS_RXEN */ +/* Description: Enable RADIO in RX mode */ + +/* Bit 0 : */ +#define RADIO_TASKS_RXEN_TASKS_RXEN_Pos (0UL) /*!< Position of TASKS_RXEN field. */ +#define RADIO_TASKS_RXEN_TASKS_RXEN_Msk (0x1UL << RADIO_TASKS_RXEN_TASKS_RXEN_Pos) /*!< Bit mask of TASKS_RXEN field. */ + +/* Register: RADIO_TASKS_START */ +/* Description: Start RADIO */ + +/* Bit 0 : */ +#define RADIO_TASKS_START_TASKS_START_Pos (0UL) /*!< Position of TASKS_START field. */ +#define RADIO_TASKS_START_TASKS_START_Msk (0x1UL << RADIO_TASKS_START_TASKS_START_Pos) /*!< Bit mask of TASKS_START field. */ + +/* Register: RADIO_TASKS_STOP */ +/* Description: Stop RADIO */ + +/* Bit 0 : */ +#define RADIO_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define RADIO_TASKS_STOP_TASKS_STOP_Msk (0x1UL << RADIO_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: RADIO_TASKS_DISABLE */ +/* Description: Disable RADIO */ + +/* Bit 0 : */ +#define RADIO_TASKS_DISABLE_TASKS_DISABLE_Pos (0UL) /*!< Position of TASKS_DISABLE field. */ +#define RADIO_TASKS_DISABLE_TASKS_DISABLE_Msk (0x1UL << RADIO_TASKS_DISABLE_TASKS_DISABLE_Pos) /*!< Bit mask of TASKS_DISABLE field. */ + +/* Register: RADIO_TASKS_RSSISTART */ +/* Description: Start the RSSI and take one single sample of the receive signal strength */ + +/* Bit 0 : */ +#define RADIO_TASKS_RSSISTART_TASKS_RSSISTART_Pos (0UL) /*!< Position of TASKS_RSSISTART field. */ +#define RADIO_TASKS_RSSISTART_TASKS_RSSISTART_Msk (0x1UL << RADIO_TASKS_RSSISTART_TASKS_RSSISTART_Pos) /*!< Bit mask of TASKS_RSSISTART field. */ + +/* Register: RADIO_TASKS_RSSISTOP */ +/* Description: Stop the RSSI measurement */ + +/* Bit 0 : */ +#define RADIO_TASKS_RSSISTOP_TASKS_RSSISTOP_Pos (0UL) /*!< Position of TASKS_RSSISTOP field. */ +#define RADIO_TASKS_RSSISTOP_TASKS_RSSISTOP_Msk (0x1UL << RADIO_TASKS_RSSISTOP_TASKS_RSSISTOP_Pos) /*!< Bit mask of TASKS_RSSISTOP field. */ + +/* Register: RADIO_TASKS_BCSTART */ +/* Description: Start the bit counter */ + +/* Bit 0 : */ +#define RADIO_TASKS_BCSTART_TASKS_BCSTART_Pos (0UL) /*!< Position of TASKS_BCSTART field. */ +#define RADIO_TASKS_BCSTART_TASKS_BCSTART_Msk (0x1UL << RADIO_TASKS_BCSTART_TASKS_BCSTART_Pos) /*!< Bit mask of TASKS_BCSTART field. */ + +/* Register: RADIO_TASKS_BCSTOP */ +/* Description: Stop the bit counter */ + +/* Bit 0 : */ +#define RADIO_TASKS_BCSTOP_TASKS_BCSTOP_Pos (0UL) /*!< Position of TASKS_BCSTOP field. */ +#define RADIO_TASKS_BCSTOP_TASKS_BCSTOP_Msk (0x1UL << RADIO_TASKS_BCSTOP_TASKS_BCSTOP_Pos) /*!< Bit mask of TASKS_BCSTOP field. */ + +/* Register: RADIO_TASKS_EDSTART */ +/* Description: Start the energy detect measurement used in IEEE 802.15.4 mode */ + +/* Bit 0 : */ +#define RADIO_TASKS_EDSTART_TASKS_EDSTART_Pos (0UL) /*!< Position of TASKS_EDSTART field. */ +#define RADIO_TASKS_EDSTART_TASKS_EDSTART_Msk (0x1UL << RADIO_TASKS_EDSTART_TASKS_EDSTART_Pos) /*!< Bit mask of TASKS_EDSTART field. */ + +/* Register: RADIO_TASKS_EDSTOP */ +/* Description: Stop the energy detect measurement */ + +/* Bit 0 : */ +#define RADIO_TASKS_EDSTOP_TASKS_EDSTOP_Pos (0UL) /*!< Position of TASKS_EDSTOP field. */ +#define RADIO_TASKS_EDSTOP_TASKS_EDSTOP_Msk (0x1UL << RADIO_TASKS_EDSTOP_TASKS_EDSTOP_Pos) /*!< Bit mask of TASKS_EDSTOP field. */ + +/* Register: RADIO_TASKS_CCASTART */ +/* Description: Start the clear channel assessment used in IEEE 802.15.4 mode */ + +/* Bit 0 : */ +#define RADIO_TASKS_CCASTART_TASKS_CCASTART_Pos (0UL) /*!< Position of TASKS_CCASTART field. */ +#define RADIO_TASKS_CCASTART_TASKS_CCASTART_Msk (0x1UL << RADIO_TASKS_CCASTART_TASKS_CCASTART_Pos) /*!< Bit mask of TASKS_CCASTART field. */ + +/* Register: RADIO_TASKS_CCASTOP */ +/* Description: Stop the clear channel assessment */ + +/* Bit 0 : */ +#define RADIO_TASKS_CCASTOP_TASKS_CCASTOP_Pos (0UL) /*!< Position of TASKS_CCASTOP field. */ +#define RADIO_TASKS_CCASTOP_TASKS_CCASTOP_Msk (0x1UL << RADIO_TASKS_CCASTOP_TASKS_CCASTOP_Pos) /*!< Bit mask of TASKS_CCASTOP field. */ + +/* Register: RADIO_EVENTS_READY */ +/* Description: RADIO has ramped up and is ready to be started */ + +/* Bit 0 : */ +#define RADIO_EVENTS_READY_EVENTS_READY_Pos (0UL) /*!< Position of EVENTS_READY field. */ +#define RADIO_EVENTS_READY_EVENTS_READY_Msk (0x1UL << RADIO_EVENTS_READY_EVENTS_READY_Pos) /*!< Bit mask of EVENTS_READY field. */ + +/* Register: RADIO_EVENTS_ADDRESS */ +/* Description: Address sent or received */ + +/* Bit 0 : */ +#define RADIO_EVENTS_ADDRESS_EVENTS_ADDRESS_Pos (0UL) /*!< Position of EVENTS_ADDRESS field. */ +#define RADIO_EVENTS_ADDRESS_EVENTS_ADDRESS_Msk (0x1UL << RADIO_EVENTS_ADDRESS_EVENTS_ADDRESS_Pos) /*!< Bit mask of EVENTS_ADDRESS field. */ + +/* Register: RADIO_EVENTS_PAYLOAD */ +/* Description: Packet payload sent or received */ + +/* Bit 0 : */ +#define RADIO_EVENTS_PAYLOAD_EVENTS_PAYLOAD_Pos (0UL) /*!< Position of EVENTS_PAYLOAD field. */ +#define RADIO_EVENTS_PAYLOAD_EVENTS_PAYLOAD_Msk (0x1UL << RADIO_EVENTS_PAYLOAD_EVENTS_PAYLOAD_Pos) /*!< Bit mask of EVENTS_PAYLOAD field. */ + +/* Register: RADIO_EVENTS_END */ +/* Description: Packet sent or received */ + +/* Bit 0 : */ +#define RADIO_EVENTS_END_EVENTS_END_Pos (0UL) /*!< Position of EVENTS_END field. */ +#define RADIO_EVENTS_END_EVENTS_END_Msk (0x1UL << RADIO_EVENTS_END_EVENTS_END_Pos) /*!< Bit mask of EVENTS_END field. */ + +/* Register: RADIO_EVENTS_DISABLED */ +/* Description: RADIO has been disabled */ + +/* Bit 0 : */ +#define RADIO_EVENTS_DISABLED_EVENTS_DISABLED_Pos (0UL) /*!< Position of EVENTS_DISABLED field. */ +#define RADIO_EVENTS_DISABLED_EVENTS_DISABLED_Msk (0x1UL << RADIO_EVENTS_DISABLED_EVENTS_DISABLED_Pos) /*!< Bit mask of EVENTS_DISABLED field. */ + +/* Register: RADIO_EVENTS_DEVMATCH */ +/* Description: A device address match occurred on the last received packet */ + +/* Bit 0 : */ +#define RADIO_EVENTS_DEVMATCH_EVENTS_DEVMATCH_Pos (0UL) /*!< Position of EVENTS_DEVMATCH field. */ +#define RADIO_EVENTS_DEVMATCH_EVENTS_DEVMATCH_Msk (0x1UL << RADIO_EVENTS_DEVMATCH_EVENTS_DEVMATCH_Pos) /*!< Bit mask of EVENTS_DEVMATCH field. */ + +/* Register: RADIO_EVENTS_DEVMISS */ +/* Description: No device address match occurred on the last received packet */ + +/* Bit 0 : */ +#define RADIO_EVENTS_DEVMISS_EVENTS_DEVMISS_Pos (0UL) /*!< Position of EVENTS_DEVMISS field. */ +#define RADIO_EVENTS_DEVMISS_EVENTS_DEVMISS_Msk (0x1UL << RADIO_EVENTS_DEVMISS_EVENTS_DEVMISS_Pos) /*!< Bit mask of EVENTS_DEVMISS field. */ + +/* Register: RADIO_EVENTS_RSSIEND */ +/* Description: Sampling of receive signal strength complete */ + +/* Bit 0 : */ +#define RADIO_EVENTS_RSSIEND_EVENTS_RSSIEND_Pos (0UL) /*!< Position of EVENTS_RSSIEND field. */ +#define RADIO_EVENTS_RSSIEND_EVENTS_RSSIEND_Msk (0x1UL << RADIO_EVENTS_RSSIEND_EVENTS_RSSIEND_Pos) /*!< Bit mask of EVENTS_RSSIEND field. */ + +/* Register: RADIO_EVENTS_BCMATCH */ +/* Description: Bit counter reached bit count value */ + +/* Bit 0 : */ +#define RADIO_EVENTS_BCMATCH_EVENTS_BCMATCH_Pos (0UL) /*!< Position of EVENTS_BCMATCH field. */ +#define RADIO_EVENTS_BCMATCH_EVENTS_BCMATCH_Msk (0x1UL << RADIO_EVENTS_BCMATCH_EVENTS_BCMATCH_Pos) /*!< Bit mask of EVENTS_BCMATCH field. */ + +/* Register: RADIO_EVENTS_CRCOK */ +/* Description: Packet received with CRC ok */ + +/* Bit 0 : */ +#define RADIO_EVENTS_CRCOK_EVENTS_CRCOK_Pos (0UL) /*!< Position of EVENTS_CRCOK field. */ +#define RADIO_EVENTS_CRCOK_EVENTS_CRCOK_Msk (0x1UL << RADIO_EVENTS_CRCOK_EVENTS_CRCOK_Pos) /*!< Bit mask of EVENTS_CRCOK field. */ + +/* Register: RADIO_EVENTS_CRCERROR */ +/* Description: Packet received with CRC error */ + +/* Bit 0 : */ +#define RADIO_EVENTS_CRCERROR_EVENTS_CRCERROR_Pos (0UL) /*!< Position of EVENTS_CRCERROR field. */ +#define RADIO_EVENTS_CRCERROR_EVENTS_CRCERROR_Msk (0x1UL << RADIO_EVENTS_CRCERROR_EVENTS_CRCERROR_Pos) /*!< Bit mask of EVENTS_CRCERROR field. */ + +/* Register: RADIO_EVENTS_FRAMESTART */ +/* Description: IEEE 802.15.4 length field received */ + +/* Bit 0 : */ +#define RADIO_EVENTS_FRAMESTART_EVENTS_FRAMESTART_Pos (0UL) /*!< Position of EVENTS_FRAMESTART field. */ +#define RADIO_EVENTS_FRAMESTART_EVENTS_FRAMESTART_Msk (0x1UL << RADIO_EVENTS_FRAMESTART_EVENTS_FRAMESTART_Pos) /*!< Bit mask of EVENTS_FRAMESTART field. */ + +/* Register: RADIO_EVENTS_EDEND */ +/* Description: Sampling of energy detection complete. A new ED sample is ready for readout from the RADIO.EDSAMPLE register. */ + +/* Bit 0 : */ +#define RADIO_EVENTS_EDEND_EVENTS_EDEND_Pos (0UL) /*!< Position of EVENTS_EDEND field. */ +#define RADIO_EVENTS_EDEND_EVENTS_EDEND_Msk (0x1UL << RADIO_EVENTS_EDEND_EVENTS_EDEND_Pos) /*!< Bit mask of EVENTS_EDEND field. */ + +/* Register: RADIO_EVENTS_EDSTOPPED */ +/* Description: The sampling of energy detection has stopped */ + +/* Bit 0 : */ +#define RADIO_EVENTS_EDSTOPPED_EVENTS_EDSTOPPED_Pos (0UL) /*!< Position of EVENTS_EDSTOPPED field. */ +#define RADIO_EVENTS_EDSTOPPED_EVENTS_EDSTOPPED_Msk (0x1UL << RADIO_EVENTS_EDSTOPPED_EVENTS_EDSTOPPED_Pos) /*!< Bit mask of EVENTS_EDSTOPPED field. */ + +/* Register: RADIO_EVENTS_CCAIDLE */ +/* Description: Wireless medium in idle - clear to send */ + +/* Bit 0 : */ +#define RADIO_EVENTS_CCAIDLE_EVENTS_CCAIDLE_Pos (0UL) /*!< Position of EVENTS_CCAIDLE field. */ +#define RADIO_EVENTS_CCAIDLE_EVENTS_CCAIDLE_Msk (0x1UL << RADIO_EVENTS_CCAIDLE_EVENTS_CCAIDLE_Pos) /*!< Bit mask of EVENTS_CCAIDLE field. */ + +/* Register: RADIO_EVENTS_CCABUSY */ +/* Description: Wireless medium busy - do not send */ + +/* Bit 0 : */ +#define RADIO_EVENTS_CCABUSY_EVENTS_CCABUSY_Pos (0UL) /*!< Position of EVENTS_CCABUSY field. */ +#define RADIO_EVENTS_CCABUSY_EVENTS_CCABUSY_Msk (0x1UL << RADIO_EVENTS_CCABUSY_EVENTS_CCABUSY_Pos) /*!< Bit mask of EVENTS_CCABUSY field. */ + +/* Register: RADIO_EVENTS_CCASTOPPED */ +/* Description: The CCA has stopped */ + +/* Bit 0 : */ +#define RADIO_EVENTS_CCASTOPPED_EVENTS_CCASTOPPED_Pos (0UL) /*!< Position of EVENTS_CCASTOPPED field. */ +#define RADIO_EVENTS_CCASTOPPED_EVENTS_CCASTOPPED_Msk (0x1UL << RADIO_EVENTS_CCASTOPPED_EVENTS_CCASTOPPED_Pos) /*!< Bit mask of EVENTS_CCASTOPPED field. */ + +/* Register: RADIO_EVENTS_RATEBOOST */ +/* Description: Ble_LR CI field received, receive mode is changed from Ble_LR125Kbit to Ble_LR500Kbit. */ + +/* Bit 0 : */ +#define RADIO_EVENTS_RATEBOOST_EVENTS_RATEBOOST_Pos (0UL) /*!< Position of EVENTS_RATEBOOST field. */ +#define RADIO_EVENTS_RATEBOOST_EVENTS_RATEBOOST_Msk (0x1UL << RADIO_EVENTS_RATEBOOST_EVENTS_RATEBOOST_Pos) /*!< Bit mask of EVENTS_RATEBOOST field. */ + +/* Register: RADIO_EVENTS_TXREADY */ +/* Description: RADIO has ramped up and is ready to be started TX path */ + +/* Bit 0 : */ +#define RADIO_EVENTS_TXREADY_EVENTS_TXREADY_Pos (0UL) /*!< Position of EVENTS_TXREADY field. */ +#define RADIO_EVENTS_TXREADY_EVENTS_TXREADY_Msk (0x1UL << RADIO_EVENTS_TXREADY_EVENTS_TXREADY_Pos) /*!< Bit mask of EVENTS_TXREADY field. */ + +/* Register: RADIO_EVENTS_RXREADY */ +/* Description: RADIO has ramped up and is ready to be started RX path */ + +/* Bit 0 : */ +#define RADIO_EVENTS_RXREADY_EVENTS_RXREADY_Pos (0UL) /*!< Position of EVENTS_RXREADY field. */ +#define RADIO_EVENTS_RXREADY_EVENTS_RXREADY_Msk (0x1UL << RADIO_EVENTS_RXREADY_EVENTS_RXREADY_Pos) /*!< Bit mask of EVENTS_RXREADY field. */ + +/* Register: RADIO_EVENTS_MHRMATCH */ +/* Description: MAC header match found */ + +/* Bit 0 : */ +#define RADIO_EVENTS_MHRMATCH_EVENTS_MHRMATCH_Pos (0UL) /*!< Position of EVENTS_MHRMATCH field. */ +#define RADIO_EVENTS_MHRMATCH_EVENTS_MHRMATCH_Msk (0x1UL << RADIO_EVENTS_MHRMATCH_EVENTS_MHRMATCH_Pos) /*!< Bit mask of EVENTS_MHRMATCH field. */ + +/* Register: RADIO_EVENTS_PHYEND */ +/* Description: Generated in Ble_LR125Kbit, Ble_LR500Kbit and BleIeee802154_250Kbit modes when last bit is sent on air. */ + +/* Bit 0 : */ +#define RADIO_EVENTS_PHYEND_EVENTS_PHYEND_Pos (0UL) /*!< Position of EVENTS_PHYEND field. */ +#define RADIO_EVENTS_PHYEND_EVENTS_PHYEND_Msk (0x1UL << RADIO_EVENTS_PHYEND_EVENTS_PHYEND_Pos) /*!< Bit mask of EVENTS_PHYEND field. */ /* Register: RADIO_SHORTS */ /* Description: Shortcut register */ @@ -8932,154 +10179,154 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: RADIO_INTENSET */ /* Description: Enable interrupt */ -/* Bit 27 : Write '1' to Enable interrupt for PHYEND event */ +/* Bit 27 : Write '1' to enable interrupt for PHYEND event */ #define RADIO_INTENSET_PHYEND_Pos (27UL) /*!< Position of PHYEND field. */ #define RADIO_INTENSET_PHYEND_Msk (0x1UL << RADIO_INTENSET_PHYEND_Pos) /*!< Bit mask of PHYEND field. */ #define RADIO_INTENSET_PHYEND_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_PHYEND_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_PHYEND_Set (1UL) /*!< Enable */ -/* Bit 23 : Write '1' to Enable interrupt for MHRMATCH event */ +/* Bit 23 : Write '1' to enable interrupt for MHRMATCH event */ #define RADIO_INTENSET_MHRMATCH_Pos (23UL) /*!< Position of MHRMATCH field. */ #define RADIO_INTENSET_MHRMATCH_Msk (0x1UL << RADIO_INTENSET_MHRMATCH_Pos) /*!< Bit mask of MHRMATCH field. */ #define RADIO_INTENSET_MHRMATCH_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_MHRMATCH_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_MHRMATCH_Set (1UL) /*!< Enable */ -/* Bit 22 : Write '1' to Enable interrupt for RXREADY event */ +/* Bit 22 : Write '1' to enable interrupt for RXREADY event */ #define RADIO_INTENSET_RXREADY_Pos (22UL) /*!< Position of RXREADY field. */ #define RADIO_INTENSET_RXREADY_Msk (0x1UL << RADIO_INTENSET_RXREADY_Pos) /*!< Bit mask of RXREADY field. */ #define RADIO_INTENSET_RXREADY_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_RXREADY_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_RXREADY_Set (1UL) /*!< Enable */ -/* Bit 21 : Write '1' to Enable interrupt for TXREADY event */ +/* Bit 21 : Write '1' to enable interrupt for TXREADY event */ #define RADIO_INTENSET_TXREADY_Pos (21UL) /*!< Position of TXREADY field. */ #define RADIO_INTENSET_TXREADY_Msk (0x1UL << RADIO_INTENSET_TXREADY_Pos) /*!< Bit mask of TXREADY field. */ #define RADIO_INTENSET_TXREADY_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_TXREADY_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_TXREADY_Set (1UL) /*!< Enable */ -/* Bit 20 : Write '1' to Enable interrupt for RATEBOOST event */ +/* Bit 20 : Write '1' to enable interrupt for RATEBOOST event */ #define RADIO_INTENSET_RATEBOOST_Pos (20UL) /*!< Position of RATEBOOST field. */ #define RADIO_INTENSET_RATEBOOST_Msk (0x1UL << RADIO_INTENSET_RATEBOOST_Pos) /*!< Bit mask of RATEBOOST field. */ #define RADIO_INTENSET_RATEBOOST_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_RATEBOOST_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_RATEBOOST_Set (1UL) /*!< Enable */ -/* Bit 19 : Write '1' to Enable interrupt for CCASTOPPED event */ +/* Bit 19 : Write '1' to enable interrupt for CCASTOPPED event */ #define RADIO_INTENSET_CCASTOPPED_Pos (19UL) /*!< Position of CCASTOPPED field. */ #define RADIO_INTENSET_CCASTOPPED_Msk (0x1UL << RADIO_INTENSET_CCASTOPPED_Pos) /*!< Bit mask of CCASTOPPED field. */ #define RADIO_INTENSET_CCASTOPPED_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_CCASTOPPED_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_CCASTOPPED_Set (1UL) /*!< Enable */ -/* Bit 18 : Write '1' to Enable interrupt for CCABUSY event */ +/* Bit 18 : Write '1' to enable interrupt for CCABUSY event */ #define RADIO_INTENSET_CCABUSY_Pos (18UL) /*!< Position of CCABUSY field. */ #define RADIO_INTENSET_CCABUSY_Msk (0x1UL << RADIO_INTENSET_CCABUSY_Pos) /*!< Bit mask of CCABUSY field. */ #define RADIO_INTENSET_CCABUSY_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_CCABUSY_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_CCABUSY_Set (1UL) /*!< Enable */ -/* Bit 17 : Write '1' to Enable interrupt for CCAIDLE event */ +/* Bit 17 : Write '1' to enable interrupt for CCAIDLE event */ #define RADIO_INTENSET_CCAIDLE_Pos (17UL) /*!< Position of CCAIDLE field. */ #define RADIO_INTENSET_CCAIDLE_Msk (0x1UL << RADIO_INTENSET_CCAIDLE_Pos) /*!< Bit mask of CCAIDLE field. */ #define RADIO_INTENSET_CCAIDLE_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_CCAIDLE_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_CCAIDLE_Set (1UL) /*!< Enable */ -/* Bit 16 : Write '1' to Enable interrupt for EDSTOPPED event */ +/* Bit 16 : Write '1' to enable interrupt for EDSTOPPED event */ #define RADIO_INTENSET_EDSTOPPED_Pos (16UL) /*!< Position of EDSTOPPED field. */ #define RADIO_INTENSET_EDSTOPPED_Msk (0x1UL << RADIO_INTENSET_EDSTOPPED_Pos) /*!< Bit mask of EDSTOPPED field. */ #define RADIO_INTENSET_EDSTOPPED_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_EDSTOPPED_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_EDSTOPPED_Set (1UL) /*!< Enable */ -/* Bit 15 : Write '1' to Enable interrupt for EDEND event */ +/* Bit 15 : Write '1' to enable interrupt for EDEND event */ #define RADIO_INTENSET_EDEND_Pos (15UL) /*!< Position of EDEND field. */ #define RADIO_INTENSET_EDEND_Msk (0x1UL << RADIO_INTENSET_EDEND_Pos) /*!< Bit mask of EDEND field. */ #define RADIO_INTENSET_EDEND_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_EDEND_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_EDEND_Set (1UL) /*!< Enable */ -/* Bit 14 : Write '1' to Enable interrupt for FRAMESTART event */ +/* Bit 14 : Write '1' to enable interrupt for FRAMESTART event */ #define RADIO_INTENSET_FRAMESTART_Pos (14UL) /*!< Position of FRAMESTART field. */ #define RADIO_INTENSET_FRAMESTART_Msk (0x1UL << RADIO_INTENSET_FRAMESTART_Pos) /*!< Bit mask of FRAMESTART field. */ #define RADIO_INTENSET_FRAMESTART_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_FRAMESTART_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_FRAMESTART_Set (1UL) /*!< Enable */ -/* Bit 13 : Write '1' to Enable interrupt for CRCERROR event */ +/* Bit 13 : Write '1' to enable interrupt for CRCERROR event */ #define RADIO_INTENSET_CRCERROR_Pos (13UL) /*!< Position of CRCERROR field. */ #define RADIO_INTENSET_CRCERROR_Msk (0x1UL << RADIO_INTENSET_CRCERROR_Pos) /*!< Bit mask of CRCERROR field. */ #define RADIO_INTENSET_CRCERROR_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_CRCERROR_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_CRCERROR_Set (1UL) /*!< Enable */ -/* Bit 12 : Write '1' to Enable interrupt for CRCOK event */ +/* Bit 12 : Write '1' to enable interrupt for CRCOK event */ #define RADIO_INTENSET_CRCOK_Pos (12UL) /*!< Position of CRCOK field. */ #define RADIO_INTENSET_CRCOK_Msk (0x1UL << RADIO_INTENSET_CRCOK_Pos) /*!< Bit mask of CRCOK field. */ #define RADIO_INTENSET_CRCOK_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_CRCOK_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_CRCOK_Set (1UL) /*!< Enable */ -/* Bit 10 : Write '1' to Enable interrupt for BCMATCH event */ +/* Bit 10 : Write '1' to enable interrupt for BCMATCH event */ #define RADIO_INTENSET_BCMATCH_Pos (10UL) /*!< Position of BCMATCH field. */ #define RADIO_INTENSET_BCMATCH_Msk (0x1UL << RADIO_INTENSET_BCMATCH_Pos) /*!< Bit mask of BCMATCH field. */ #define RADIO_INTENSET_BCMATCH_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_BCMATCH_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_BCMATCH_Set (1UL) /*!< Enable */ -/* Bit 7 : Write '1' to Enable interrupt for RSSIEND event */ +/* Bit 7 : Write '1' to enable interrupt for RSSIEND event */ #define RADIO_INTENSET_RSSIEND_Pos (7UL) /*!< Position of RSSIEND field. */ #define RADIO_INTENSET_RSSIEND_Msk (0x1UL << RADIO_INTENSET_RSSIEND_Pos) /*!< Bit mask of RSSIEND field. */ #define RADIO_INTENSET_RSSIEND_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_RSSIEND_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_RSSIEND_Set (1UL) /*!< Enable */ -/* Bit 6 : Write '1' to Enable interrupt for DEVMISS event */ +/* Bit 6 : Write '1' to enable interrupt for DEVMISS event */ #define RADIO_INTENSET_DEVMISS_Pos (6UL) /*!< Position of DEVMISS field. */ #define RADIO_INTENSET_DEVMISS_Msk (0x1UL << RADIO_INTENSET_DEVMISS_Pos) /*!< Bit mask of DEVMISS field. */ #define RADIO_INTENSET_DEVMISS_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_DEVMISS_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_DEVMISS_Set (1UL) /*!< Enable */ -/* Bit 5 : Write '1' to Enable interrupt for DEVMATCH event */ +/* Bit 5 : Write '1' to enable interrupt for DEVMATCH event */ #define RADIO_INTENSET_DEVMATCH_Pos (5UL) /*!< Position of DEVMATCH field. */ #define RADIO_INTENSET_DEVMATCH_Msk (0x1UL << RADIO_INTENSET_DEVMATCH_Pos) /*!< Bit mask of DEVMATCH field. */ #define RADIO_INTENSET_DEVMATCH_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_DEVMATCH_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_DEVMATCH_Set (1UL) /*!< Enable */ -/* Bit 4 : Write '1' to Enable interrupt for DISABLED event */ +/* Bit 4 : Write '1' to enable interrupt for DISABLED event */ #define RADIO_INTENSET_DISABLED_Pos (4UL) /*!< Position of DISABLED field. */ #define RADIO_INTENSET_DISABLED_Msk (0x1UL << RADIO_INTENSET_DISABLED_Pos) /*!< Bit mask of DISABLED field. */ #define RADIO_INTENSET_DISABLED_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_DISABLED_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_DISABLED_Set (1UL) /*!< Enable */ -/* Bit 3 : Write '1' to Enable interrupt for END event */ +/* Bit 3 : Write '1' to enable interrupt for END event */ #define RADIO_INTENSET_END_Pos (3UL) /*!< Position of END field. */ #define RADIO_INTENSET_END_Msk (0x1UL << RADIO_INTENSET_END_Pos) /*!< Bit mask of END field. */ #define RADIO_INTENSET_END_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_END_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_END_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for PAYLOAD event */ +/* Bit 2 : Write '1' to enable interrupt for PAYLOAD event */ #define RADIO_INTENSET_PAYLOAD_Pos (2UL) /*!< Position of PAYLOAD field. */ #define RADIO_INTENSET_PAYLOAD_Msk (0x1UL << RADIO_INTENSET_PAYLOAD_Pos) /*!< Bit mask of PAYLOAD field. */ #define RADIO_INTENSET_PAYLOAD_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_PAYLOAD_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_PAYLOAD_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for ADDRESS event */ +/* Bit 1 : Write '1' to enable interrupt for ADDRESS event */ #define RADIO_INTENSET_ADDRESS_Pos (1UL) /*!< Position of ADDRESS field. */ #define RADIO_INTENSET_ADDRESS_Msk (0x1UL << RADIO_INTENSET_ADDRESS_Pos) /*!< Bit mask of ADDRESS field. */ #define RADIO_INTENSET_ADDRESS_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENSET_ADDRESS_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENSET_ADDRESS_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for READY event */ +/* Bit 0 : Write '1' to enable interrupt for READY event */ #define RADIO_INTENSET_READY_Pos (0UL) /*!< Position of READY field. */ #define RADIO_INTENSET_READY_Msk (0x1UL << RADIO_INTENSET_READY_Pos) /*!< Bit mask of READY field. */ #define RADIO_INTENSET_READY_Disabled (0UL) /*!< Read: Disabled */ @@ -9089,154 +10336,154 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: RADIO_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 27 : Write '1' to Disable interrupt for PHYEND event */ +/* Bit 27 : Write '1' to disable interrupt for PHYEND event */ #define RADIO_INTENCLR_PHYEND_Pos (27UL) /*!< Position of PHYEND field. */ #define RADIO_INTENCLR_PHYEND_Msk (0x1UL << RADIO_INTENCLR_PHYEND_Pos) /*!< Bit mask of PHYEND field. */ #define RADIO_INTENCLR_PHYEND_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_PHYEND_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_PHYEND_Clear (1UL) /*!< Disable */ -/* Bit 23 : Write '1' to Disable interrupt for MHRMATCH event */ +/* Bit 23 : Write '1' to disable interrupt for MHRMATCH event */ #define RADIO_INTENCLR_MHRMATCH_Pos (23UL) /*!< Position of MHRMATCH field. */ #define RADIO_INTENCLR_MHRMATCH_Msk (0x1UL << RADIO_INTENCLR_MHRMATCH_Pos) /*!< Bit mask of MHRMATCH field. */ #define RADIO_INTENCLR_MHRMATCH_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_MHRMATCH_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_MHRMATCH_Clear (1UL) /*!< Disable */ -/* Bit 22 : Write '1' to Disable interrupt for RXREADY event */ +/* Bit 22 : Write '1' to disable interrupt for RXREADY event */ #define RADIO_INTENCLR_RXREADY_Pos (22UL) /*!< Position of RXREADY field. */ #define RADIO_INTENCLR_RXREADY_Msk (0x1UL << RADIO_INTENCLR_RXREADY_Pos) /*!< Bit mask of RXREADY field. */ #define RADIO_INTENCLR_RXREADY_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_RXREADY_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_RXREADY_Clear (1UL) /*!< Disable */ -/* Bit 21 : Write '1' to Disable interrupt for TXREADY event */ +/* Bit 21 : Write '1' to disable interrupt for TXREADY event */ #define RADIO_INTENCLR_TXREADY_Pos (21UL) /*!< Position of TXREADY field. */ #define RADIO_INTENCLR_TXREADY_Msk (0x1UL << RADIO_INTENCLR_TXREADY_Pos) /*!< Bit mask of TXREADY field. */ #define RADIO_INTENCLR_TXREADY_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_TXREADY_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_TXREADY_Clear (1UL) /*!< Disable */ -/* Bit 20 : Write '1' to Disable interrupt for RATEBOOST event */ +/* Bit 20 : Write '1' to disable interrupt for RATEBOOST event */ #define RADIO_INTENCLR_RATEBOOST_Pos (20UL) /*!< Position of RATEBOOST field. */ #define RADIO_INTENCLR_RATEBOOST_Msk (0x1UL << RADIO_INTENCLR_RATEBOOST_Pos) /*!< Bit mask of RATEBOOST field. */ #define RADIO_INTENCLR_RATEBOOST_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_RATEBOOST_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_RATEBOOST_Clear (1UL) /*!< Disable */ -/* Bit 19 : Write '1' to Disable interrupt for CCASTOPPED event */ +/* Bit 19 : Write '1' to disable interrupt for CCASTOPPED event */ #define RADIO_INTENCLR_CCASTOPPED_Pos (19UL) /*!< Position of CCASTOPPED field. */ #define RADIO_INTENCLR_CCASTOPPED_Msk (0x1UL << RADIO_INTENCLR_CCASTOPPED_Pos) /*!< Bit mask of CCASTOPPED field. */ #define RADIO_INTENCLR_CCASTOPPED_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_CCASTOPPED_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_CCASTOPPED_Clear (1UL) /*!< Disable */ -/* Bit 18 : Write '1' to Disable interrupt for CCABUSY event */ +/* Bit 18 : Write '1' to disable interrupt for CCABUSY event */ #define RADIO_INTENCLR_CCABUSY_Pos (18UL) /*!< Position of CCABUSY field. */ #define RADIO_INTENCLR_CCABUSY_Msk (0x1UL << RADIO_INTENCLR_CCABUSY_Pos) /*!< Bit mask of CCABUSY field. */ #define RADIO_INTENCLR_CCABUSY_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_CCABUSY_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_CCABUSY_Clear (1UL) /*!< Disable */ -/* Bit 17 : Write '1' to Disable interrupt for CCAIDLE event */ +/* Bit 17 : Write '1' to disable interrupt for CCAIDLE event */ #define RADIO_INTENCLR_CCAIDLE_Pos (17UL) /*!< Position of CCAIDLE field. */ #define RADIO_INTENCLR_CCAIDLE_Msk (0x1UL << RADIO_INTENCLR_CCAIDLE_Pos) /*!< Bit mask of CCAIDLE field. */ #define RADIO_INTENCLR_CCAIDLE_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_CCAIDLE_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_CCAIDLE_Clear (1UL) /*!< Disable */ -/* Bit 16 : Write '1' to Disable interrupt for EDSTOPPED event */ +/* Bit 16 : Write '1' to disable interrupt for EDSTOPPED event */ #define RADIO_INTENCLR_EDSTOPPED_Pos (16UL) /*!< Position of EDSTOPPED field. */ #define RADIO_INTENCLR_EDSTOPPED_Msk (0x1UL << RADIO_INTENCLR_EDSTOPPED_Pos) /*!< Bit mask of EDSTOPPED field. */ #define RADIO_INTENCLR_EDSTOPPED_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_EDSTOPPED_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_EDSTOPPED_Clear (1UL) /*!< Disable */ -/* Bit 15 : Write '1' to Disable interrupt for EDEND event */ +/* Bit 15 : Write '1' to disable interrupt for EDEND event */ #define RADIO_INTENCLR_EDEND_Pos (15UL) /*!< Position of EDEND field. */ #define RADIO_INTENCLR_EDEND_Msk (0x1UL << RADIO_INTENCLR_EDEND_Pos) /*!< Bit mask of EDEND field. */ #define RADIO_INTENCLR_EDEND_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_EDEND_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_EDEND_Clear (1UL) /*!< Disable */ -/* Bit 14 : Write '1' to Disable interrupt for FRAMESTART event */ +/* Bit 14 : Write '1' to disable interrupt for FRAMESTART event */ #define RADIO_INTENCLR_FRAMESTART_Pos (14UL) /*!< Position of FRAMESTART field. */ #define RADIO_INTENCLR_FRAMESTART_Msk (0x1UL << RADIO_INTENCLR_FRAMESTART_Pos) /*!< Bit mask of FRAMESTART field. */ #define RADIO_INTENCLR_FRAMESTART_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_FRAMESTART_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_FRAMESTART_Clear (1UL) /*!< Disable */ -/* Bit 13 : Write '1' to Disable interrupt for CRCERROR event */ +/* Bit 13 : Write '1' to disable interrupt for CRCERROR event */ #define RADIO_INTENCLR_CRCERROR_Pos (13UL) /*!< Position of CRCERROR field. */ #define RADIO_INTENCLR_CRCERROR_Msk (0x1UL << RADIO_INTENCLR_CRCERROR_Pos) /*!< Bit mask of CRCERROR field. */ #define RADIO_INTENCLR_CRCERROR_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_CRCERROR_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_CRCERROR_Clear (1UL) /*!< Disable */ -/* Bit 12 : Write '1' to Disable interrupt for CRCOK event */ +/* Bit 12 : Write '1' to disable interrupt for CRCOK event */ #define RADIO_INTENCLR_CRCOK_Pos (12UL) /*!< Position of CRCOK field. */ #define RADIO_INTENCLR_CRCOK_Msk (0x1UL << RADIO_INTENCLR_CRCOK_Pos) /*!< Bit mask of CRCOK field. */ #define RADIO_INTENCLR_CRCOK_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_CRCOK_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_CRCOK_Clear (1UL) /*!< Disable */ -/* Bit 10 : Write '1' to Disable interrupt for BCMATCH event */ +/* Bit 10 : Write '1' to disable interrupt for BCMATCH event */ #define RADIO_INTENCLR_BCMATCH_Pos (10UL) /*!< Position of BCMATCH field. */ #define RADIO_INTENCLR_BCMATCH_Msk (0x1UL << RADIO_INTENCLR_BCMATCH_Pos) /*!< Bit mask of BCMATCH field. */ #define RADIO_INTENCLR_BCMATCH_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_BCMATCH_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_BCMATCH_Clear (1UL) /*!< Disable */ -/* Bit 7 : Write '1' to Disable interrupt for RSSIEND event */ +/* Bit 7 : Write '1' to disable interrupt for RSSIEND event */ #define RADIO_INTENCLR_RSSIEND_Pos (7UL) /*!< Position of RSSIEND field. */ #define RADIO_INTENCLR_RSSIEND_Msk (0x1UL << RADIO_INTENCLR_RSSIEND_Pos) /*!< Bit mask of RSSIEND field. */ #define RADIO_INTENCLR_RSSIEND_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_RSSIEND_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_RSSIEND_Clear (1UL) /*!< Disable */ -/* Bit 6 : Write '1' to Disable interrupt for DEVMISS event */ +/* Bit 6 : Write '1' to disable interrupt for DEVMISS event */ #define RADIO_INTENCLR_DEVMISS_Pos (6UL) /*!< Position of DEVMISS field. */ #define RADIO_INTENCLR_DEVMISS_Msk (0x1UL << RADIO_INTENCLR_DEVMISS_Pos) /*!< Bit mask of DEVMISS field. */ #define RADIO_INTENCLR_DEVMISS_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_DEVMISS_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_DEVMISS_Clear (1UL) /*!< Disable */ -/* Bit 5 : Write '1' to Disable interrupt for DEVMATCH event */ +/* Bit 5 : Write '1' to disable interrupt for DEVMATCH event */ #define RADIO_INTENCLR_DEVMATCH_Pos (5UL) /*!< Position of DEVMATCH field. */ #define RADIO_INTENCLR_DEVMATCH_Msk (0x1UL << RADIO_INTENCLR_DEVMATCH_Pos) /*!< Bit mask of DEVMATCH field. */ #define RADIO_INTENCLR_DEVMATCH_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_DEVMATCH_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_DEVMATCH_Clear (1UL) /*!< Disable */ -/* Bit 4 : Write '1' to Disable interrupt for DISABLED event */ +/* Bit 4 : Write '1' to disable interrupt for DISABLED event */ #define RADIO_INTENCLR_DISABLED_Pos (4UL) /*!< Position of DISABLED field. */ #define RADIO_INTENCLR_DISABLED_Msk (0x1UL << RADIO_INTENCLR_DISABLED_Pos) /*!< Bit mask of DISABLED field. */ #define RADIO_INTENCLR_DISABLED_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_DISABLED_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_DISABLED_Clear (1UL) /*!< Disable */ -/* Bit 3 : Write '1' to Disable interrupt for END event */ +/* Bit 3 : Write '1' to disable interrupt for END event */ #define RADIO_INTENCLR_END_Pos (3UL) /*!< Position of END field. */ #define RADIO_INTENCLR_END_Msk (0x1UL << RADIO_INTENCLR_END_Pos) /*!< Bit mask of END field. */ #define RADIO_INTENCLR_END_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_END_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_END_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for PAYLOAD event */ +/* Bit 2 : Write '1' to disable interrupt for PAYLOAD event */ #define RADIO_INTENCLR_PAYLOAD_Pos (2UL) /*!< Position of PAYLOAD field. */ #define RADIO_INTENCLR_PAYLOAD_Msk (0x1UL << RADIO_INTENCLR_PAYLOAD_Pos) /*!< Bit mask of PAYLOAD field. */ #define RADIO_INTENCLR_PAYLOAD_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_PAYLOAD_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_PAYLOAD_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for ADDRESS event */ +/* Bit 1 : Write '1' to disable interrupt for ADDRESS event */ #define RADIO_INTENCLR_ADDRESS_Pos (1UL) /*!< Position of ADDRESS field. */ #define RADIO_INTENCLR_ADDRESS_Msk (0x1UL << RADIO_INTENCLR_ADDRESS_Pos) /*!< Bit mask of ADDRESS field. */ #define RADIO_INTENCLR_ADDRESS_Disabled (0UL) /*!< Read: Disabled */ #define RADIO_INTENCLR_ADDRESS_Enabled (1UL) /*!< Read: Enabled */ #define RADIO_INTENCLR_ADDRESS_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for READY event */ +/* Bit 0 : Write '1' to disable interrupt for READY event */ #define RADIO_INTENCLR_READY_Pos (0UL) /*!< Position of READY field. */ #define RADIO_INTENCLR_READY_Msk (0x1UL << RADIO_INTENCLR_READY_Pos) /*!< Bit mask of READY field. */ #define RADIO_INTENCLR_READY_Disabled (0UL) /*!< Read: Disabled */ @@ -9311,7 +10558,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: RADIO_TXPOWER */ /* Description: Output power */ -/* Bits 7..0 : RADIO output power. */ +/* Bits 7..0 : RADIO output power */ #define RADIO_TXPOWER_TXPOWER_Pos (0UL) /*!< Position of TXPOWER field. */ #define RADIO_TXPOWER_TXPOWER_Msk (0xFFUL << RADIO_TXPOWER_TXPOWER_Pos) /*!< Bit mask of TXPOWER field. */ #define RADIO_TXPOWER_TXPOWER_0dBm (0x0UL) /*!< 0 dBm */ @@ -9322,26 +10569,26 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define RADIO_TXPOWER_TXPOWER_Pos6dBm (0x6UL) /*!< +6 dBm */ #define RADIO_TXPOWER_TXPOWER_Pos7dBm (0x7UL) /*!< +7 dBm */ #define RADIO_TXPOWER_TXPOWER_Pos8dBm (0x8UL) /*!< +8 dBm */ -#define RADIO_TXPOWER_TXPOWER_Neg30dBm (0xD8UL) /*!< Deprecated enumerator - -40 dBm */ #define RADIO_TXPOWER_TXPOWER_Neg40dBm (0xD8UL) /*!< -40 dBm */ #define RADIO_TXPOWER_TXPOWER_Neg20dBm (0xECUL) /*!< -20 dBm */ #define RADIO_TXPOWER_TXPOWER_Neg16dBm (0xF0UL) /*!< -16 dBm */ #define RADIO_TXPOWER_TXPOWER_Neg12dBm (0xF4UL) /*!< -12 dBm */ #define RADIO_TXPOWER_TXPOWER_Neg8dBm (0xF8UL) /*!< -8 dBm */ #define RADIO_TXPOWER_TXPOWER_Neg4dBm (0xFCUL) /*!< -4 dBm */ +#define RADIO_TXPOWER_TXPOWER_Neg30dBm (0xFFUL) /*!< Deprecated enumerator - -40 dBm */ /* Register: RADIO_MODE */ /* Description: Data rate and modulation */ -/* Bits 3..0 : Radio data rate and modulation setting. The radio supports Frequency-shift Keying (FSK) modulation. */ +/* Bits 3..0 : Radio data rate and modulation setting. The radio supports frequency-shift keying (FSK) modulation. */ #define RADIO_MODE_MODE_Pos (0UL) /*!< Position of MODE field. */ #define RADIO_MODE_MODE_Msk (0xFUL << RADIO_MODE_MODE_Pos) /*!< Bit mask of MODE field. */ #define RADIO_MODE_MODE_Nrf_1Mbit (0UL) /*!< 1 Mbit/s Nordic proprietary radio mode */ #define RADIO_MODE_MODE_Nrf_2Mbit (1UL) /*!< 2 Mbit/s Nordic proprietary radio mode */ -#define RADIO_MODE_MODE_Ble_1Mbit (3UL) /*!< 1 Mbit/s Bluetooth Low Energy */ -#define RADIO_MODE_MODE_Ble_2Mbit (4UL) /*!< 2 Mbit/s Bluetooth Low Energy */ -#define RADIO_MODE_MODE_Ble_LR125Kbit (5UL) /*!< Long range 125 kbit/s (TX Only - RX supports both) */ -#define RADIO_MODE_MODE_Ble_LR500Kbit (6UL) /*!< Long range 500 kbit/s (TX Only - RX supports both) */ +#define RADIO_MODE_MODE_Ble_1Mbit (3UL) /*!< 1 Mbit/s BLE */ +#define RADIO_MODE_MODE_Ble_2Mbit (4UL) /*!< 2 Mbit/s BLE */ +#define RADIO_MODE_MODE_Ble_LR125Kbit (5UL) /*!< Long range 125 kbit/s TX, 125 kbit/s and 500 kbit/s RX */ +#define RADIO_MODE_MODE_Ble_LR500Kbit (6UL) /*!< Long range 500 kbit/s TX, 125 kbit/s and 500 kbit/s RX */ #define RADIO_MODE_MODE_Ieee802154_250Kbit (15UL) /*!< IEEE 802.15.4-2006 250 kbit/s */ /* Register: RADIO_PCNF0 */ @@ -9363,9 +10610,9 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define RADIO_PCNF0_PLEN_8bit (0UL) /*!< 8-bit preamble */ #define RADIO_PCNF0_PLEN_16bit (1UL) /*!< 16-bit preamble */ #define RADIO_PCNF0_PLEN_32bitZero (2UL) /*!< 32-bit zero preamble - used for IEEE 802.15.4 */ -#define RADIO_PCNF0_PLEN_LongRange (3UL) /*!< Preamble - used for BTLE Long Range */ +#define RADIO_PCNF0_PLEN_LongRange (3UL) /*!< Preamble - used for BLE long range */ -/* Bits 23..22 : Length of Code Indicator - Long Range */ +/* Bits 23..22 : Length of code indicator - long range */ #define RADIO_PCNF0_CILEN_Pos (22UL) /*!< Position of CILEN field. */ #define RADIO_PCNF0_CILEN_Msk (0x3UL << RADIO_PCNF0_CILEN_Pos) /*!< Bit mask of CILEN field. */ @@ -9399,7 +10646,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Bit 24 : On air endianness of packet, this applies to the S0, LENGTH, S1 and the PAYLOAD fields. */ #define RADIO_PCNF1_ENDIAN_Pos (24UL) /*!< Position of ENDIAN field. */ #define RADIO_PCNF1_ENDIAN_Msk (0x1UL << RADIO_PCNF1_ENDIAN_Pos) /*!< Bit mask of ENDIAN field. */ -#define RADIO_PCNF1_ENDIAN_Little (0UL) /*!< Least Significant bit on air first */ +#define RADIO_PCNF1_ENDIAN_Little (0UL) /*!< Least significant bit on air first */ #define RADIO_PCNF1_ENDIAN_Big (1UL) /*!< Most significant bit on air first */ /* Bits 18..16 : Base address length in number of bytes */ @@ -9557,9 +10804,9 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define RADIO_CRCINIT_CRCINIT_Msk (0xFFFFFFUL << RADIO_CRCINIT_CRCINIT_Pos) /*!< Bit mask of CRCINIT field. */ /* Register: RADIO_TIFS */ -/* Description: Inter Frame Spacing in us */ +/* Description: Interframe spacing in us */ -/* Bits 9..0 : Inter Frame Spacing in us */ +/* Bits 9..0 : Interframe spacing in us */ #define RADIO_TIFS_TIFS_Pos (0UL) /*!< Position of TIFS field. */ #define RADIO_TIFS_TIFS_Msk (0x3FFUL << RADIO_TIFS_TIFS_Pos) /*!< Bit mask of TIFS field. */ @@ -9601,16 +10848,16 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define RADIO_BCC_BCC_Msk (0xFFFFFFFFUL << RADIO_BCC_BCC_Pos) /*!< Bit mask of BCC field. */ /* Register: RADIO_DAB */ -/* Description: Description collection[0]: Device address base segment 0 */ +/* Description: Description collection[n]: Device address base segment n */ -/* Bits 31..0 : Device address base segment 0 */ +/* Bits 31..0 : Device address base segment n */ #define RADIO_DAB_DAB_Pos (0UL) /*!< Position of DAB field. */ #define RADIO_DAB_DAB_Msk (0xFFFFFFFFUL << RADIO_DAB_DAB_Pos) /*!< Bit mask of DAB field. */ /* Register: RADIO_DAP */ -/* Description: Description collection[0]: Device address prefix 0 */ +/* Description: Description collection[n]: Device address prefix n */ -/* Bits 15..0 : Device address prefix 0 */ +/* Bits 15..0 : Device address prefix n */ #define RADIO_DAP_DAP_Pos (0UL) /*!< Position of DAP field. */ #define RADIO_DAP_DAP_Msk (0xFFFFUL << RADIO_DAP_DAP_Pos) /*!< Bit mask of DAP field. */ @@ -9714,49 +10961,49 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define RADIO_MODECNF0_RU_Fast (1UL) /*!< Fast ramp-up (tRXEN,FAST), see electrical specification for more information */ /* Register: RADIO_SFD */ -/* Description: IEEE 802.15.4 Start of Frame Delimiter */ +/* Description: IEEE 802.15.4 start of frame delimiter */ -/* Bits 7..0 : IEEE 802.15.4 Start of Frame Delimiter. Note, the least significant 4-bits of the SFD cannot all be zeros. */ +/* Bits 7..0 : IEEE 802.15.4 start of frame delimiter */ #define RADIO_SFD_SFD_Pos (0UL) /*!< Position of SFD field. */ #define RADIO_SFD_SFD_Msk (0xFFUL << RADIO_SFD_SFD_Pos) /*!< Bit mask of SFD field. */ /* Register: RADIO_EDCNT */ -/* Description: IEEE 802.15.4 Energy Detect Loop Count */ +/* Description: IEEE 802.15.4 energy detect loop count */ -/* Bits 20..0 : IEEE 802.15.4 Energy Detect Loop Count */ +/* Bits 20..0 : IEEE 802.15.4 energy detect loop count */ #define RADIO_EDCNT_EDCNT_Pos (0UL) /*!< Position of EDCNT field. */ #define RADIO_EDCNT_EDCNT_Msk (0x1FFFFFUL << RADIO_EDCNT_EDCNT_Pos) /*!< Bit mask of EDCNT field. */ /* Register: RADIO_EDSAMPLE */ -/* Description: IEEE 802.15.4 Energy Detect Level */ +/* Description: IEEE 802.15.4 energy detect level */ -/* Bits 7..0 : IEEE 802.15.4 Energy Detect Level */ +/* Bits 7..0 : IEEE 802.15.4 energy detect level */ #define RADIO_EDSAMPLE_EDLVL_Pos (0UL) /*!< Position of EDLVL field. */ #define RADIO_EDSAMPLE_EDLVL_Msk (0xFFUL << RADIO_EDSAMPLE_EDLVL_Pos) /*!< Bit mask of EDLVL field. */ /* Register: RADIO_CCACTRL */ -/* Description: IEEE 802.15.4 Clear Channel Assessment Control */ +/* Description: IEEE 802.15.4 clear channel assessment control */ /* Bits 31..24 : Limit for occurances above CCACORRTHRES. When not equal to zero the corrolator based signal detect is enabled. */ #define RADIO_CCACTRL_CCACORRCNT_Pos (24UL) /*!< Position of CCACORRCNT field. */ #define RADIO_CCACTRL_CCACORRCNT_Msk (0xFFUL << RADIO_CCACTRL_CCACORRCNT_Pos) /*!< Bit mask of CCACORRCNT field. */ -/* Bits 23..16 : CCA Correlator Busy Threshold. Only relevant to CarrierMode, CarrierAndEdMode and CarrierOrEdMode. */ +/* Bits 23..16 : CCA correlator busy threshold. Only relevant to CarrierMode, CarrierAndEdMode and CarrierOrEdMode. */ #define RADIO_CCACTRL_CCACORRTHRES_Pos (16UL) /*!< Position of CCACORRTHRES field. */ #define RADIO_CCACTRL_CCACORRTHRES_Msk (0xFFUL << RADIO_CCACTRL_CCACORRTHRES_Pos) /*!< Bit mask of CCACORRTHRES field. */ -/* Bits 15..8 : CCA Energy Busy Threshold. Used in all the CCA modes except CarrierMode. */ +/* Bits 15..8 : CCA energy busy threshold. Used in all the CCA modes except CarrierMode. */ #define RADIO_CCACTRL_CCAEDTHRES_Pos (8UL) /*!< Position of CCAEDTHRES field. */ #define RADIO_CCACTRL_CCAEDTHRES_Msk (0xFFUL << RADIO_CCACTRL_CCAEDTHRES_Pos) /*!< Bit mask of CCAEDTHRES field. */ -/* Bits 2..0 : CCA Mode Of Operation */ +/* Bits 2..0 : CCA mode of operation */ #define RADIO_CCACTRL_CCAMODE_Pos (0UL) /*!< Position of CCAMODE field. */ #define RADIO_CCACTRL_CCAMODE_Msk (0x7UL << RADIO_CCACTRL_CCAMODE_Pos) /*!< Bit mask of CCAMODE field. */ -#define RADIO_CCACTRL_CCAMODE_EdMode (0UL) /*!< Energy Above Threshold */ -#define RADIO_CCACTRL_CCAMODE_CarrierMode (1UL) /*!< Carrier Seen */ -#define RADIO_CCACTRL_CCAMODE_CarrierAndEdMode (2UL) /*!< Energy Above Threshold AND Carrier Seen */ -#define RADIO_CCACTRL_CCAMODE_CarrierOrEdMode (3UL) /*!< Energy Above Threshold OR Carrier Seen */ -#define RADIO_CCACTRL_CCAMODE_EdModeTest1 (4UL) /*!< Energy Above Threshold test mode that will abort when first ED measurement over threshold is seen. No averaging. */ +#define RADIO_CCACTRL_CCAMODE_EdMode (0UL) /*!< Energy above threshold */ +#define RADIO_CCACTRL_CCAMODE_CarrierMode (1UL) /*!< Carrier seen */ +#define RADIO_CCACTRL_CCAMODE_CarrierAndEdMode (2UL) /*!< Energy above threshold AND carrier seen */ +#define RADIO_CCACTRL_CCAMODE_CarrierOrEdMode (3UL) /*!< Energy above threshold OR carrier seen */ +#define RADIO_CCACTRL_CCAMODE_EdModeTest1 (4UL) /*!< Energy above threshold test mode that will abort when first ED measurement over threshold is seen. No averaging. */ /* Register: RADIO_POWER */ /* Description: Peripheral power control */ @@ -9771,6 +11018,27 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: RNG */ /* Description: Random Number Generator */ +/* Register: RNG_TASKS_START */ +/* Description: Task starting the random number generator */ + +/* Bit 0 : */ +#define RNG_TASKS_START_TASKS_START_Pos (0UL) /*!< Position of TASKS_START field. */ +#define RNG_TASKS_START_TASKS_START_Msk (0x1UL << RNG_TASKS_START_TASKS_START_Pos) /*!< Bit mask of TASKS_START field. */ + +/* Register: RNG_TASKS_STOP */ +/* Description: Task stopping the random number generator */ + +/* Bit 0 : */ +#define RNG_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define RNG_TASKS_STOP_TASKS_STOP_Msk (0x1UL << RNG_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: RNG_EVENTS_VALRDY */ +/* Description: Event being generated for every new random number written to the VALUE register */ + +/* Bit 0 : */ +#define RNG_EVENTS_VALRDY_EVENTS_VALRDY_Pos (0UL) /*!< Position of EVENTS_VALRDY field. */ +#define RNG_EVENTS_VALRDY_EVENTS_VALRDY_Msk (0x1UL << RNG_EVENTS_VALRDY_EVENTS_VALRDY_Pos) /*!< Bit mask of EVENTS_VALRDY field. */ + /* Register: RNG_SHORTS */ /* Description: Shortcut register */ @@ -9783,7 +11051,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: RNG_INTENSET */ /* Description: Enable interrupt */ -/* Bit 0 : Write '1' to Enable interrupt for VALRDY event */ +/* Bit 0 : Write '1' to enable interrupt for VALRDY event */ #define RNG_INTENSET_VALRDY_Pos (0UL) /*!< Position of VALRDY field. */ #define RNG_INTENSET_VALRDY_Msk (0x1UL << RNG_INTENSET_VALRDY_Pos) /*!< Bit mask of VALRDY field. */ #define RNG_INTENSET_VALRDY_Disabled (0UL) /*!< Read: Disabled */ @@ -9793,7 +11061,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: RNG_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 0 : Write '1' to Disable interrupt for VALRDY event */ +/* Bit 0 : Write '1' to disable interrupt for VALRDY event */ #define RNG_INTENCLR_VALRDY_Pos (0UL) /*!< Position of VALRDY field. */ #define RNG_INTENCLR_VALRDY_Msk (0x1UL << RNG_INTENCLR_VALRDY_Pos) /*!< Bit mask of VALRDY field. */ #define RNG_INTENCLR_VALRDY_Disabled (0UL) /*!< Read: Disabled */ @@ -9820,45 +11088,94 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: RTC */ /* Description: Real time counter 0 */ +/* Register: RTC_TASKS_START */ +/* Description: Start RTC COUNTER */ + +/* Bit 0 : */ +#define RTC_TASKS_START_TASKS_START_Pos (0UL) /*!< Position of TASKS_START field. */ +#define RTC_TASKS_START_TASKS_START_Msk (0x1UL << RTC_TASKS_START_TASKS_START_Pos) /*!< Bit mask of TASKS_START field. */ + +/* Register: RTC_TASKS_STOP */ +/* Description: Stop RTC COUNTER */ + +/* Bit 0 : */ +#define RTC_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define RTC_TASKS_STOP_TASKS_STOP_Msk (0x1UL << RTC_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: RTC_TASKS_CLEAR */ +/* Description: Clear RTC COUNTER */ + +/* Bit 0 : */ +#define RTC_TASKS_CLEAR_TASKS_CLEAR_Pos (0UL) /*!< Position of TASKS_CLEAR field. */ +#define RTC_TASKS_CLEAR_TASKS_CLEAR_Msk (0x1UL << RTC_TASKS_CLEAR_TASKS_CLEAR_Pos) /*!< Bit mask of TASKS_CLEAR field. */ + +/* Register: RTC_TASKS_TRIGOVRFLW */ +/* Description: Set COUNTER to 0xFFFFF0 */ + +/* Bit 0 : */ +#define RTC_TASKS_TRIGOVRFLW_TASKS_TRIGOVRFLW_Pos (0UL) /*!< Position of TASKS_TRIGOVRFLW field. */ +#define RTC_TASKS_TRIGOVRFLW_TASKS_TRIGOVRFLW_Msk (0x1UL << RTC_TASKS_TRIGOVRFLW_TASKS_TRIGOVRFLW_Pos) /*!< Bit mask of TASKS_TRIGOVRFLW field. */ + +/* Register: RTC_EVENTS_TICK */ +/* Description: Event on COUNTER increment */ + +/* Bit 0 : */ +#define RTC_EVENTS_TICK_EVENTS_TICK_Pos (0UL) /*!< Position of EVENTS_TICK field. */ +#define RTC_EVENTS_TICK_EVENTS_TICK_Msk (0x1UL << RTC_EVENTS_TICK_EVENTS_TICK_Pos) /*!< Bit mask of EVENTS_TICK field. */ + +/* Register: RTC_EVENTS_OVRFLW */ +/* Description: Event on COUNTER overflow */ + +/* Bit 0 : */ +#define RTC_EVENTS_OVRFLW_EVENTS_OVRFLW_Pos (0UL) /*!< Position of EVENTS_OVRFLW field. */ +#define RTC_EVENTS_OVRFLW_EVENTS_OVRFLW_Msk (0x1UL << RTC_EVENTS_OVRFLW_EVENTS_OVRFLW_Pos) /*!< Bit mask of EVENTS_OVRFLW field. */ + +/* Register: RTC_EVENTS_COMPARE */ +/* Description: Description collection[n]: Compare event on CC[n] match */ + +/* Bit 0 : */ +#define RTC_EVENTS_COMPARE_EVENTS_COMPARE_Pos (0UL) /*!< Position of EVENTS_COMPARE field. */ +#define RTC_EVENTS_COMPARE_EVENTS_COMPARE_Msk (0x1UL << RTC_EVENTS_COMPARE_EVENTS_COMPARE_Pos) /*!< Bit mask of EVENTS_COMPARE field. */ + /* Register: RTC_INTENSET */ /* Description: Enable interrupt */ -/* Bit 19 : Write '1' to Enable interrupt for COMPARE[3] event */ +/* Bit 19 : Write '1' to enable interrupt for COMPARE[3] event */ #define RTC_INTENSET_COMPARE3_Pos (19UL) /*!< Position of COMPARE3 field. */ #define RTC_INTENSET_COMPARE3_Msk (0x1UL << RTC_INTENSET_COMPARE3_Pos) /*!< Bit mask of COMPARE3 field. */ #define RTC_INTENSET_COMPARE3_Disabled (0UL) /*!< Read: Disabled */ #define RTC_INTENSET_COMPARE3_Enabled (1UL) /*!< Read: Enabled */ #define RTC_INTENSET_COMPARE3_Set (1UL) /*!< Enable */ -/* Bit 18 : Write '1' to Enable interrupt for COMPARE[2] event */ +/* Bit 18 : Write '1' to enable interrupt for COMPARE[2] event */ #define RTC_INTENSET_COMPARE2_Pos (18UL) /*!< Position of COMPARE2 field. */ #define RTC_INTENSET_COMPARE2_Msk (0x1UL << RTC_INTENSET_COMPARE2_Pos) /*!< Bit mask of COMPARE2 field. */ #define RTC_INTENSET_COMPARE2_Disabled (0UL) /*!< Read: Disabled */ #define RTC_INTENSET_COMPARE2_Enabled (1UL) /*!< Read: Enabled */ #define RTC_INTENSET_COMPARE2_Set (1UL) /*!< Enable */ -/* Bit 17 : Write '1' to Enable interrupt for COMPARE[1] event */ +/* Bit 17 : Write '1' to enable interrupt for COMPARE[1] event */ #define RTC_INTENSET_COMPARE1_Pos (17UL) /*!< Position of COMPARE1 field. */ #define RTC_INTENSET_COMPARE1_Msk (0x1UL << RTC_INTENSET_COMPARE1_Pos) /*!< Bit mask of COMPARE1 field. */ #define RTC_INTENSET_COMPARE1_Disabled (0UL) /*!< Read: Disabled */ #define RTC_INTENSET_COMPARE1_Enabled (1UL) /*!< Read: Enabled */ #define RTC_INTENSET_COMPARE1_Set (1UL) /*!< Enable */ -/* Bit 16 : Write '1' to Enable interrupt for COMPARE[0] event */ +/* Bit 16 : Write '1' to enable interrupt for COMPARE[0] event */ #define RTC_INTENSET_COMPARE0_Pos (16UL) /*!< Position of COMPARE0 field. */ #define RTC_INTENSET_COMPARE0_Msk (0x1UL << RTC_INTENSET_COMPARE0_Pos) /*!< Bit mask of COMPARE0 field. */ #define RTC_INTENSET_COMPARE0_Disabled (0UL) /*!< Read: Disabled */ #define RTC_INTENSET_COMPARE0_Enabled (1UL) /*!< Read: Enabled */ #define RTC_INTENSET_COMPARE0_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for OVRFLW event */ +/* Bit 1 : Write '1' to enable interrupt for OVRFLW event */ #define RTC_INTENSET_OVRFLW_Pos (1UL) /*!< Position of OVRFLW field. */ #define RTC_INTENSET_OVRFLW_Msk (0x1UL << RTC_INTENSET_OVRFLW_Pos) /*!< Bit mask of OVRFLW field. */ #define RTC_INTENSET_OVRFLW_Disabled (0UL) /*!< Read: Disabled */ #define RTC_INTENSET_OVRFLW_Enabled (1UL) /*!< Read: Enabled */ #define RTC_INTENSET_OVRFLW_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for TICK event */ +/* Bit 0 : Write '1' to enable interrupt for TICK event */ #define RTC_INTENSET_TICK_Pos (0UL) /*!< Position of TICK field. */ #define RTC_INTENSET_TICK_Msk (0x1UL << RTC_INTENSET_TICK_Pos) /*!< Bit mask of TICK field. */ #define RTC_INTENSET_TICK_Disabled (0UL) /*!< Read: Disabled */ @@ -9868,42 +11185,42 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: RTC_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 19 : Write '1' to Disable interrupt for COMPARE[3] event */ +/* Bit 19 : Write '1' to disable interrupt for COMPARE[3] event */ #define RTC_INTENCLR_COMPARE3_Pos (19UL) /*!< Position of COMPARE3 field. */ #define RTC_INTENCLR_COMPARE3_Msk (0x1UL << RTC_INTENCLR_COMPARE3_Pos) /*!< Bit mask of COMPARE3 field. */ #define RTC_INTENCLR_COMPARE3_Disabled (0UL) /*!< Read: Disabled */ #define RTC_INTENCLR_COMPARE3_Enabled (1UL) /*!< Read: Enabled */ #define RTC_INTENCLR_COMPARE3_Clear (1UL) /*!< Disable */ -/* Bit 18 : Write '1' to Disable interrupt for COMPARE[2] event */ +/* Bit 18 : Write '1' to disable interrupt for COMPARE[2] event */ #define RTC_INTENCLR_COMPARE2_Pos (18UL) /*!< Position of COMPARE2 field. */ #define RTC_INTENCLR_COMPARE2_Msk (0x1UL << RTC_INTENCLR_COMPARE2_Pos) /*!< Bit mask of COMPARE2 field. */ #define RTC_INTENCLR_COMPARE2_Disabled (0UL) /*!< Read: Disabled */ #define RTC_INTENCLR_COMPARE2_Enabled (1UL) /*!< Read: Enabled */ #define RTC_INTENCLR_COMPARE2_Clear (1UL) /*!< Disable */ -/* Bit 17 : Write '1' to Disable interrupt for COMPARE[1] event */ +/* Bit 17 : Write '1' to disable interrupt for COMPARE[1] event */ #define RTC_INTENCLR_COMPARE1_Pos (17UL) /*!< Position of COMPARE1 field. */ #define RTC_INTENCLR_COMPARE1_Msk (0x1UL << RTC_INTENCLR_COMPARE1_Pos) /*!< Bit mask of COMPARE1 field. */ #define RTC_INTENCLR_COMPARE1_Disabled (0UL) /*!< Read: Disabled */ #define RTC_INTENCLR_COMPARE1_Enabled (1UL) /*!< Read: Enabled */ #define RTC_INTENCLR_COMPARE1_Clear (1UL) /*!< Disable */ -/* Bit 16 : Write '1' to Disable interrupt for COMPARE[0] event */ +/* Bit 16 : Write '1' to disable interrupt for COMPARE[0] event */ #define RTC_INTENCLR_COMPARE0_Pos (16UL) /*!< Position of COMPARE0 field. */ #define RTC_INTENCLR_COMPARE0_Msk (0x1UL << RTC_INTENCLR_COMPARE0_Pos) /*!< Bit mask of COMPARE0 field. */ #define RTC_INTENCLR_COMPARE0_Disabled (0UL) /*!< Read: Disabled */ #define RTC_INTENCLR_COMPARE0_Enabled (1UL) /*!< Read: Enabled */ #define RTC_INTENCLR_COMPARE0_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for OVRFLW event */ +/* Bit 1 : Write '1' to disable interrupt for OVRFLW event */ #define RTC_INTENCLR_OVRFLW_Pos (1UL) /*!< Position of OVRFLW field. */ #define RTC_INTENCLR_OVRFLW_Msk (0x1UL << RTC_INTENCLR_OVRFLW_Pos) /*!< Bit mask of OVRFLW field. */ #define RTC_INTENCLR_OVRFLW_Disabled (0UL) /*!< Read: Disabled */ #define RTC_INTENCLR_OVRFLW_Enabled (1UL) /*!< Read: Enabled */ #define RTC_INTENCLR_OVRFLW_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for TICK event */ +/* Bit 0 : Write '1' to disable interrupt for TICK event */ #define RTC_INTENCLR_TICK_Pos (0UL) /*!< Position of TICK field. */ #define RTC_INTENCLR_TICK_Msk (0x1UL << RTC_INTENCLR_TICK_Pos) /*!< Bit mask of TICK field. */ #define RTC_INTENCLR_TICK_Disabled (0UL) /*!< Read: Disabled */ @@ -9952,42 +11269,42 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: RTC_EVTENSET */ /* Description: Enable event routing */ -/* Bit 19 : Write '1' to Enable event routing for COMPARE[3] event */ +/* Bit 19 : Write '1' to enable event routing for COMPARE[3] event */ #define RTC_EVTENSET_COMPARE3_Pos (19UL) /*!< Position of COMPARE3 field. */ #define RTC_EVTENSET_COMPARE3_Msk (0x1UL << RTC_EVTENSET_COMPARE3_Pos) /*!< Bit mask of COMPARE3 field. */ #define RTC_EVTENSET_COMPARE3_Disabled (0UL) /*!< Read: Disabled */ #define RTC_EVTENSET_COMPARE3_Enabled (1UL) /*!< Read: Enabled */ #define RTC_EVTENSET_COMPARE3_Set (1UL) /*!< Enable */ -/* Bit 18 : Write '1' to Enable event routing for COMPARE[2] event */ +/* Bit 18 : Write '1' to enable event routing for COMPARE[2] event */ #define RTC_EVTENSET_COMPARE2_Pos (18UL) /*!< Position of COMPARE2 field. */ #define RTC_EVTENSET_COMPARE2_Msk (0x1UL << RTC_EVTENSET_COMPARE2_Pos) /*!< Bit mask of COMPARE2 field. */ #define RTC_EVTENSET_COMPARE2_Disabled (0UL) /*!< Read: Disabled */ #define RTC_EVTENSET_COMPARE2_Enabled (1UL) /*!< Read: Enabled */ #define RTC_EVTENSET_COMPARE2_Set (1UL) /*!< Enable */ -/* Bit 17 : Write '1' to Enable event routing for COMPARE[1] event */ +/* Bit 17 : Write '1' to enable event routing for COMPARE[1] event */ #define RTC_EVTENSET_COMPARE1_Pos (17UL) /*!< Position of COMPARE1 field. */ #define RTC_EVTENSET_COMPARE1_Msk (0x1UL << RTC_EVTENSET_COMPARE1_Pos) /*!< Bit mask of COMPARE1 field. */ #define RTC_EVTENSET_COMPARE1_Disabled (0UL) /*!< Read: Disabled */ #define RTC_EVTENSET_COMPARE1_Enabled (1UL) /*!< Read: Enabled */ #define RTC_EVTENSET_COMPARE1_Set (1UL) /*!< Enable */ -/* Bit 16 : Write '1' to Enable event routing for COMPARE[0] event */ +/* Bit 16 : Write '1' to enable event routing for COMPARE[0] event */ #define RTC_EVTENSET_COMPARE0_Pos (16UL) /*!< Position of COMPARE0 field. */ #define RTC_EVTENSET_COMPARE0_Msk (0x1UL << RTC_EVTENSET_COMPARE0_Pos) /*!< Bit mask of COMPARE0 field. */ #define RTC_EVTENSET_COMPARE0_Disabled (0UL) /*!< Read: Disabled */ #define RTC_EVTENSET_COMPARE0_Enabled (1UL) /*!< Read: Enabled */ #define RTC_EVTENSET_COMPARE0_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable event routing for OVRFLW event */ +/* Bit 1 : Write '1' to enable event routing for OVRFLW event */ #define RTC_EVTENSET_OVRFLW_Pos (1UL) /*!< Position of OVRFLW field. */ #define RTC_EVTENSET_OVRFLW_Msk (0x1UL << RTC_EVTENSET_OVRFLW_Pos) /*!< Bit mask of OVRFLW field. */ #define RTC_EVTENSET_OVRFLW_Disabled (0UL) /*!< Read: Disabled */ #define RTC_EVTENSET_OVRFLW_Enabled (1UL) /*!< Read: Enabled */ #define RTC_EVTENSET_OVRFLW_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable event routing for TICK event */ +/* Bit 0 : Write '1' to enable event routing for TICK event */ #define RTC_EVTENSET_TICK_Pos (0UL) /*!< Position of TICK field. */ #define RTC_EVTENSET_TICK_Msk (0x1UL << RTC_EVTENSET_TICK_Pos) /*!< Bit mask of TICK field. */ #define RTC_EVTENSET_TICK_Disabled (0UL) /*!< Read: Disabled */ @@ -9997,42 +11314,42 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: RTC_EVTENCLR */ /* Description: Disable event routing */ -/* Bit 19 : Write '1' to Disable event routing for COMPARE[3] event */ +/* Bit 19 : Write '1' to disable event routing for COMPARE[3] event */ #define RTC_EVTENCLR_COMPARE3_Pos (19UL) /*!< Position of COMPARE3 field. */ #define RTC_EVTENCLR_COMPARE3_Msk (0x1UL << RTC_EVTENCLR_COMPARE3_Pos) /*!< Bit mask of COMPARE3 field. */ #define RTC_EVTENCLR_COMPARE3_Disabled (0UL) /*!< Read: Disabled */ #define RTC_EVTENCLR_COMPARE3_Enabled (1UL) /*!< Read: Enabled */ #define RTC_EVTENCLR_COMPARE3_Clear (1UL) /*!< Disable */ -/* Bit 18 : Write '1' to Disable event routing for COMPARE[2] event */ +/* Bit 18 : Write '1' to disable event routing for COMPARE[2] event */ #define RTC_EVTENCLR_COMPARE2_Pos (18UL) /*!< Position of COMPARE2 field. */ #define RTC_EVTENCLR_COMPARE2_Msk (0x1UL << RTC_EVTENCLR_COMPARE2_Pos) /*!< Bit mask of COMPARE2 field. */ #define RTC_EVTENCLR_COMPARE2_Disabled (0UL) /*!< Read: Disabled */ #define RTC_EVTENCLR_COMPARE2_Enabled (1UL) /*!< Read: Enabled */ #define RTC_EVTENCLR_COMPARE2_Clear (1UL) /*!< Disable */ -/* Bit 17 : Write '1' to Disable event routing for COMPARE[1] event */ +/* Bit 17 : Write '1' to disable event routing for COMPARE[1] event */ #define RTC_EVTENCLR_COMPARE1_Pos (17UL) /*!< Position of COMPARE1 field. */ #define RTC_EVTENCLR_COMPARE1_Msk (0x1UL << RTC_EVTENCLR_COMPARE1_Pos) /*!< Bit mask of COMPARE1 field. */ #define RTC_EVTENCLR_COMPARE1_Disabled (0UL) /*!< Read: Disabled */ #define RTC_EVTENCLR_COMPARE1_Enabled (1UL) /*!< Read: Enabled */ #define RTC_EVTENCLR_COMPARE1_Clear (1UL) /*!< Disable */ -/* Bit 16 : Write '1' to Disable event routing for COMPARE[0] event */ +/* Bit 16 : Write '1' to disable event routing for COMPARE[0] event */ #define RTC_EVTENCLR_COMPARE0_Pos (16UL) /*!< Position of COMPARE0 field. */ #define RTC_EVTENCLR_COMPARE0_Msk (0x1UL << RTC_EVTENCLR_COMPARE0_Pos) /*!< Bit mask of COMPARE0 field. */ #define RTC_EVTENCLR_COMPARE0_Disabled (0UL) /*!< Read: Disabled */ #define RTC_EVTENCLR_COMPARE0_Enabled (1UL) /*!< Read: Enabled */ #define RTC_EVTENCLR_COMPARE0_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable event routing for OVRFLW event */ +/* Bit 1 : Write '1' to disable event routing for OVRFLW event */ #define RTC_EVTENCLR_OVRFLW_Pos (1UL) /*!< Position of OVRFLW field. */ #define RTC_EVTENCLR_OVRFLW_Msk (0x1UL << RTC_EVTENCLR_OVRFLW_Pos) /*!< Bit mask of OVRFLW field. */ #define RTC_EVTENCLR_OVRFLW_Disabled (0UL) /*!< Read: Disabled */ #define RTC_EVTENCLR_OVRFLW_Enabled (1UL) /*!< Read: Enabled */ #define RTC_EVTENCLR_OVRFLW_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable event routing for TICK event */ +/* Bit 0 : Write '1' to disable event routing for TICK event */ #define RTC_EVTENCLR_TICK_Pos (0UL) /*!< Position of TICK field. */ #define RTC_EVTENCLR_TICK_Msk (0x1UL << RTC_EVTENCLR_TICK_Pos) /*!< Bit mask of TICK field. */ #define RTC_EVTENCLR_TICK_Disabled (0UL) /*!< Read: Disabled */ @@ -10054,7 +11371,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define RTC_PRESCALER_PRESCALER_Msk (0xFFFUL << RTC_PRESCALER_PRESCALER_Pos) /*!< Bit mask of PRESCALER field. */ /* Register: RTC_CC */ -/* Description: Description collection[0]: Compare register 0 */ +/* Description: Description collection[n]: Compare register n */ /* Bits 23..0 : Compare value */ #define RTC_CC_COMPARE_Pos (0UL) /*!< Position of COMPARE field. */ @@ -10062,7 +11379,91 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: SAADC */ -/* Description: Analog to Digital Converter */ +/* Description: Successive approximation register (SAR) analog-to-digital converter */ + +/* Register: SAADC_TASKS_START */ +/* Description: Starts the SAADC and prepares the result buffer in RAM */ + +/* Bit 0 : */ +#define SAADC_TASKS_START_TASKS_START_Pos (0UL) /*!< Position of TASKS_START field. */ +#define SAADC_TASKS_START_TASKS_START_Msk (0x1UL << SAADC_TASKS_START_TASKS_START_Pos) /*!< Bit mask of TASKS_START field. */ + +/* Register: SAADC_TASKS_SAMPLE */ +/* Description: Takes one SAADC sample */ + +/* Bit 0 : */ +#define SAADC_TASKS_SAMPLE_TASKS_SAMPLE_Pos (0UL) /*!< Position of TASKS_SAMPLE field. */ +#define SAADC_TASKS_SAMPLE_TASKS_SAMPLE_Msk (0x1UL << SAADC_TASKS_SAMPLE_TASKS_SAMPLE_Pos) /*!< Bit mask of TASKS_SAMPLE field. */ + +/* Register: SAADC_TASKS_STOP */ +/* Description: Stops the SAADC and terminates all on-going conversions */ + +/* Bit 0 : */ +#define SAADC_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define SAADC_TASKS_STOP_TASKS_STOP_Msk (0x1UL << SAADC_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: SAADC_TASKS_CALIBRATEOFFSET */ +/* Description: Starts offset auto-calibration */ + +/* Bit 0 : */ +#define SAADC_TASKS_CALIBRATEOFFSET_TASKS_CALIBRATEOFFSET_Pos (0UL) /*!< Position of TASKS_CALIBRATEOFFSET field. */ +#define SAADC_TASKS_CALIBRATEOFFSET_TASKS_CALIBRATEOFFSET_Msk (0x1UL << SAADC_TASKS_CALIBRATEOFFSET_TASKS_CALIBRATEOFFSET_Pos) /*!< Bit mask of TASKS_CALIBRATEOFFSET field. */ + +/* Register: SAADC_EVENTS_STARTED */ +/* Description: The SAADC has started */ + +/* Bit 0 : */ +#define SAADC_EVENTS_STARTED_EVENTS_STARTED_Pos (0UL) /*!< Position of EVENTS_STARTED field. */ +#define SAADC_EVENTS_STARTED_EVENTS_STARTED_Msk (0x1UL << SAADC_EVENTS_STARTED_EVENTS_STARTED_Pos) /*!< Bit mask of EVENTS_STARTED field. */ + +/* Register: SAADC_EVENTS_END */ +/* Description: The SAADC has filled up the result buffer */ + +/* Bit 0 : */ +#define SAADC_EVENTS_END_EVENTS_END_Pos (0UL) /*!< Position of EVENTS_END field. */ +#define SAADC_EVENTS_END_EVENTS_END_Msk (0x1UL << SAADC_EVENTS_END_EVENTS_END_Pos) /*!< Bit mask of EVENTS_END field. */ + +/* Register: SAADC_EVENTS_DONE */ +/* Description: A conversion task has been completed. Depending on the configuration, multiple conversions might be needed for a result to be transferred to RAM. */ + +/* Bit 0 : */ +#define SAADC_EVENTS_DONE_EVENTS_DONE_Pos (0UL) /*!< Position of EVENTS_DONE field. */ +#define SAADC_EVENTS_DONE_EVENTS_DONE_Msk (0x1UL << SAADC_EVENTS_DONE_EVENTS_DONE_Pos) /*!< Bit mask of EVENTS_DONE field. */ + +/* Register: SAADC_EVENTS_RESULTDONE */ +/* Description: Result ready for transfer to RAM */ + +/* Bit 0 : */ +#define SAADC_EVENTS_RESULTDONE_EVENTS_RESULTDONE_Pos (0UL) /*!< Position of EVENTS_RESULTDONE field. */ +#define SAADC_EVENTS_RESULTDONE_EVENTS_RESULTDONE_Msk (0x1UL << SAADC_EVENTS_RESULTDONE_EVENTS_RESULTDONE_Pos) /*!< Bit mask of EVENTS_RESULTDONE field. */ + +/* Register: SAADC_EVENTS_CALIBRATEDONE */ +/* Description: Calibration is complete */ + +/* Bit 0 : */ +#define SAADC_EVENTS_CALIBRATEDONE_EVENTS_CALIBRATEDONE_Pos (0UL) /*!< Position of EVENTS_CALIBRATEDONE field. */ +#define SAADC_EVENTS_CALIBRATEDONE_EVENTS_CALIBRATEDONE_Msk (0x1UL << SAADC_EVENTS_CALIBRATEDONE_EVENTS_CALIBRATEDONE_Pos) /*!< Bit mask of EVENTS_CALIBRATEDONE field. */ + +/* Register: SAADC_EVENTS_STOPPED */ +/* Description: The SAADC has stopped */ + +/* Bit 0 : */ +#define SAADC_EVENTS_STOPPED_EVENTS_STOPPED_Pos (0UL) /*!< Position of EVENTS_STOPPED field. */ +#define SAADC_EVENTS_STOPPED_EVENTS_STOPPED_Msk (0x1UL << SAADC_EVENTS_STOPPED_EVENTS_STOPPED_Pos) /*!< Bit mask of EVENTS_STOPPED field. */ + +/* Register: SAADC_EVENTS_CH_LIMITH */ +/* Description: Description cluster[n]: Last result is equal or above CH[n].LIMIT.HIGH */ + +/* Bit 0 : */ +#define SAADC_EVENTS_CH_LIMITH_LIMITH_Pos (0UL) /*!< Position of LIMITH field. */ +#define SAADC_EVENTS_CH_LIMITH_LIMITH_Msk (0x1UL << SAADC_EVENTS_CH_LIMITH_LIMITH_Pos) /*!< Bit mask of LIMITH field. */ + +/* Register: SAADC_EVENTS_CH_LIMITL */ +/* Description: Description cluster[n]: Last result is equal or below CH[n].LIMIT.LOW */ + +/* Bit 0 : */ +#define SAADC_EVENTS_CH_LIMITL_LIMITL_Pos (0UL) /*!< Position of LIMITL field. */ +#define SAADC_EVENTS_CH_LIMITL_LIMITL_Msk (0x1UL << SAADC_EVENTS_CH_LIMITL_LIMITL_Pos) /*!< Bit mask of LIMITL field. */ /* Register: SAADC_INTEN */ /* Description: Enable or disable interrupt */ @@ -10202,154 +11603,154 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: SAADC_INTENSET */ /* Description: Enable interrupt */ -/* Bit 21 : Write '1' to Enable interrupt for CH[7].LIMITL event */ +/* Bit 21 : Write '1' to enable interrupt for CH[7].LIMITL event */ #define SAADC_INTENSET_CH7LIMITL_Pos (21UL) /*!< Position of CH7LIMITL field. */ #define SAADC_INTENSET_CH7LIMITL_Msk (0x1UL << SAADC_INTENSET_CH7LIMITL_Pos) /*!< Bit mask of CH7LIMITL field. */ #define SAADC_INTENSET_CH7LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH7LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH7LIMITL_Set (1UL) /*!< Enable */ -/* Bit 20 : Write '1' to Enable interrupt for CH[7].LIMITH event */ +/* Bit 20 : Write '1' to enable interrupt for CH[7].LIMITH event */ #define SAADC_INTENSET_CH7LIMITH_Pos (20UL) /*!< Position of CH7LIMITH field. */ #define SAADC_INTENSET_CH7LIMITH_Msk (0x1UL << SAADC_INTENSET_CH7LIMITH_Pos) /*!< Bit mask of CH7LIMITH field. */ #define SAADC_INTENSET_CH7LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH7LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH7LIMITH_Set (1UL) /*!< Enable */ -/* Bit 19 : Write '1' to Enable interrupt for CH[6].LIMITL event */ +/* Bit 19 : Write '1' to enable interrupt for CH[6].LIMITL event */ #define SAADC_INTENSET_CH6LIMITL_Pos (19UL) /*!< Position of CH6LIMITL field. */ #define SAADC_INTENSET_CH6LIMITL_Msk (0x1UL << SAADC_INTENSET_CH6LIMITL_Pos) /*!< Bit mask of CH6LIMITL field. */ #define SAADC_INTENSET_CH6LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH6LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH6LIMITL_Set (1UL) /*!< Enable */ -/* Bit 18 : Write '1' to Enable interrupt for CH[6].LIMITH event */ +/* Bit 18 : Write '1' to enable interrupt for CH[6].LIMITH event */ #define SAADC_INTENSET_CH6LIMITH_Pos (18UL) /*!< Position of CH6LIMITH field. */ #define SAADC_INTENSET_CH6LIMITH_Msk (0x1UL << SAADC_INTENSET_CH6LIMITH_Pos) /*!< Bit mask of CH6LIMITH field. */ #define SAADC_INTENSET_CH6LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH6LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH6LIMITH_Set (1UL) /*!< Enable */ -/* Bit 17 : Write '1' to Enable interrupt for CH[5].LIMITL event */ +/* Bit 17 : Write '1' to enable interrupt for CH[5].LIMITL event */ #define SAADC_INTENSET_CH5LIMITL_Pos (17UL) /*!< Position of CH5LIMITL field. */ #define SAADC_INTENSET_CH5LIMITL_Msk (0x1UL << SAADC_INTENSET_CH5LIMITL_Pos) /*!< Bit mask of CH5LIMITL field. */ #define SAADC_INTENSET_CH5LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH5LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH5LIMITL_Set (1UL) /*!< Enable */ -/* Bit 16 : Write '1' to Enable interrupt for CH[5].LIMITH event */ +/* Bit 16 : Write '1' to enable interrupt for CH[5].LIMITH event */ #define SAADC_INTENSET_CH5LIMITH_Pos (16UL) /*!< Position of CH5LIMITH field. */ #define SAADC_INTENSET_CH5LIMITH_Msk (0x1UL << SAADC_INTENSET_CH5LIMITH_Pos) /*!< Bit mask of CH5LIMITH field. */ #define SAADC_INTENSET_CH5LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH5LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH5LIMITH_Set (1UL) /*!< Enable */ -/* Bit 15 : Write '1' to Enable interrupt for CH[4].LIMITL event */ +/* Bit 15 : Write '1' to enable interrupt for CH[4].LIMITL event */ #define SAADC_INTENSET_CH4LIMITL_Pos (15UL) /*!< Position of CH4LIMITL field. */ #define SAADC_INTENSET_CH4LIMITL_Msk (0x1UL << SAADC_INTENSET_CH4LIMITL_Pos) /*!< Bit mask of CH4LIMITL field. */ #define SAADC_INTENSET_CH4LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH4LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH4LIMITL_Set (1UL) /*!< Enable */ -/* Bit 14 : Write '1' to Enable interrupt for CH[4].LIMITH event */ +/* Bit 14 : Write '1' to enable interrupt for CH[4].LIMITH event */ #define SAADC_INTENSET_CH4LIMITH_Pos (14UL) /*!< Position of CH4LIMITH field. */ #define SAADC_INTENSET_CH4LIMITH_Msk (0x1UL << SAADC_INTENSET_CH4LIMITH_Pos) /*!< Bit mask of CH4LIMITH field. */ #define SAADC_INTENSET_CH4LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH4LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH4LIMITH_Set (1UL) /*!< Enable */ -/* Bit 13 : Write '1' to Enable interrupt for CH[3].LIMITL event */ +/* Bit 13 : Write '1' to enable interrupt for CH[3].LIMITL event */ #define SAADC_INTENSET_CH3LIMITL_Pos (13UL) /*!< Position of CH3LIMITL field. */ #define SAADC_INTENSET_CH3LIMITL_Msk (0x1UL << SAADC_INTENSET_CH3LIMITL_Pos) /*!< Bit mask of CH3LIMITL field. */ #define SAADC_INTENSET_CH3LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH3LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH3LIMITL_Set (1UL) /*!< Enable */ -/* Bit 12 : Write '1' to Enable interrupt for CH[3].LIMITH event */ +/* Bit 12 : Write '1' to enable interrupt for CH[3].LIMITH event */ #define SAADC_INTENSET_CH3LIMITH_Pos (12UL) /*!< Position of CH3LIMITH field. */ #define SAADC_INTENSET_CH3LIMITH_Msk (0x1UL << SAADC_INTENSET_CH3LIMITH_Pos) /*!< Bit mask of CH3LIMITH field. */ #define SAADC_INTENSET_CH3LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH3LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH3LIMITH_Set (1UL) /*!< Enable */ -/* Bit 11 : Write '1' to Enable interrupt for CH[2].LIMITL event */ +/* Bit 11 : Write '1' to enable interrupt for CH[2].LIMITL event */ #define SAADC_INTENSET_CH2LIMITL_Pos (11UL) /*!< Position of CH2LIMITL field. */ #define SAADC_INTENSET_CH2LIMITL_Msk (0x1UL << SAADC_INTENSET_CH2LIMITL_Pos) /*!< Bit mask of CH2LIMITL field. */ #define SAADC_INTENSET_CH2LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH2LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH2LIMITL_Set (1UL) /*!< Enable */ -/* Bit 10 : Write '1' to Enable interrupt for CH[2].LIMITH event */ +/* Bit 10 : Write '1' to enable interrupt for CH[2].LIMITH event */ #define SAADC_INTENSET_CH2LIMITH_Pos (10UL) /*!< Position of CH2LIMITH field. */ #define SAADC_INTENSET_CH2LIMITH_Msk (0x1UL << SAADC_INTENSET_CH2LIMITH_Pos) /*!< Bit mask of CH2LIMITH field. */ #define SAADC_INTENSET_CH2LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH2LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH2LIMITH_Set (1UL) /*!< Enable */ -/* Bit 9 : Write '1' to Enable interrupt for CH[1].LIMITL event */ +/* Bit 9 : Write '1' to enable interrupt for CH[1].LIMITL event */ #define SAADC_INTENSET_CH1LIMITL_Pos (9UL) /*!< Position of CH1LIMITL field. */ #define SAADC_INTENSET_CH1LIMITL_Msk (0x1UL << SAADC_INTENSET_CH1LIMITL_Pos) /*!< Bit mask of CH1LIMITL field. */ #define SAADC_INTENSET_CH1LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH1LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH1LIMITL_Set (1UL) /*!< Enable */ -/* Bit 8 : Write '1' to Enable interrupt for CH[1].LIMITH event */ +/* Bit 8 : Write '1' to enable interrupt for CH[1].LIMITH event */ #define SAADC_INTENSET_CH1LIMITH_Pos (8UL) /*!< Position of CH1LIMITH field. */ #define SAADC_INTENSET_CH1LIMITH_Msk (0x1UL << SAADC_INTENSET_CH1LIMITH_Pos) /*!< Bit mask of CH1LIMITH field. */ #define SAADC_INTENSET_CH1LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH1LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH1LIMITH_Set (1UL) /*!< Enable */ -/* Bit 7 : Write '1' to Enable interrupt for CH[0].LIMITL event */ +/* Bit 7 : Write '1' to enable interrupt for CH[0].LIMITL event */ #define SAADC_INTENSET_CH0LIMITL_Pos (7UL) /*!< Position of CH0LIMITL field. */ #define SAADC_INTENSET_CH0LIMITL_Msk (0x1UL << SAADC_INTENSET_CH0LIMITL_Pos) /*!< Bit mask of CH0LIMITL field. */ #define SAADC_INTENSET_CH0LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH0LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH0LIMITL_Set (1UL) /*!< Enable */ -/* Bit 6 : Write '1' to Enable interrupt for CH[0].LIMITH event */ +/* Bit 6 : Write '1' to enable interrupt for CH[0].LIMITH event */ #define SAADC_INTENSET_CH0LIMITH_Pos (6UL) /*!< Position of CH0LIMITH field. */ #define SAADC_INTENSET_CH0LIMITH_Msk (0x1UL << SAADC_INTENSET_CH0LIMITH_Pos) /*!< Bit mask of CH0LIMITH field. */ #define SAADC_INTENSET_CH0LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CH0LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CH0LIMITH_Set (1UL) /*!< Enable */ -/* Bit 5 : Write '1' to Enable interrupt for STOPPED event */ +/* Bit 5 : Write '1' to enable interrupt for STOPPED event */ #define SAADC_INTENSET_STOPPED_Pos (5UL) /*!< Position of STOPPED field. */ #define SAADC_INTENSET_STOPPED_Msk (0x1UL << SAADC_INTENSET_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define SAADC_INTENSET_STOPPED_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_STOPPED_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_STOPPED_Set (1UL) /*!< Enable */ -/* Bit 4 : Write '1' to Enable interrupt for CALIBRATEDONE event */ +/* Bit 4 : Write '1' to enable interrupt for CALIBRATEDONE event */ #define SAADC_INTENSET_CALIBRATEDONE_Pos (4UL) /*!< Position of CALIBRATEDONE field. */ #define SAADC_INTENSET_CALIBRATEDONE_Msk (0x1UL << SAADC_INTENSET_CALIBRATEDONE_Pos) /*!< Bit mask of CALIBRATEDONE field. */ #define SAADC_INTENSET_CALIBRATEDONE_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_CALIBRATEDONE_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_CALIBRATEDONE_Set (1UL) /*!< Enable */ -/* Bit 3 : Write '1' to Enable interrupt for RESULTDONE event */ +/* Bit 3 : Write '1' to enable interrupt for RESULTDONE event */ #define SAADC_INTENSET_RESULTDONE_Pos (3UL) /*!< Position of RESULTDONE field. */ #define SAADC_INTENSET_RESULTDONE_Msk (0x1UL << SAADC_INTENSET_RESULTDONE_Pos) /*!< Bit mask of RESULTDONE field. */ #define SAADC_INTENSET_RESULTDONE_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_RESULTDONE_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_RESULTDONE_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for DONE event */ +/* Bit 2 : Write '1' to enable interrupt for DONE event */ #define SAADC_INTENSET_DONE_Pos (2UL) /*!< Position of DONE field. */ #define SAADC_INTENSET_DONE_Msk (0x1UL << SAADC_INTENSET_DONE_Pos) /*!< Bit mask of DONE field. */ #define SAADC_INTENSET_DONE_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_DONE_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_DONE_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for END event */ +/* Bit 1 : Write '1' to enable interrupt for END event */ #define SAADC_INTENSET_END_Pos (1UL) /*!< Position of END field. */ #define SAADC_INTENSET_END_Msk (0x1UL << SAADC_INTENSET_END_Pos) /*!< Bit mask of END field. */ #define SAADC_INTENSET_END_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENSET_END_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENSET_END_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for STARTED event */ +/* Bit 0 : Write '1' to enable interrupt for STARTED event */ #define SAADC_INTENSET_STARTED_Pos (0UL) /*!< Position of STARTED field. */ #define SAADC_INTENSET_STARTED_Msk (0x1UL << SAADC_INTENSET_STARTED_Pos) /*!< Bit mask of STARTED field. */ #define SAADC_INTENSET_STARTED_Disabled (0UL) /*!< Read: Disabled */ @@ -10359,154 +11760,154 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: SAADC_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 21 : Write '1' to Disable interrupt for CH[7].LIMITL event */ +/* Bit 21 : Write '1' to disable interrupt for CH[7].LIMITL event */ #define SAADC_INTENCLR_CH7LIMITL_Pos (21UL) /*!< Position of CH7LIMITL field. */ #define SAADC_INTENCLR_CH7LIMITL_Msk (0x1UL << SAADC_INTENCLR_CH7LIMITL_Pos) /*!< Bit mask of CH7LIMITL field. */ #define SAADC_INTENCLR_CH7LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH7LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH7LIMITL_Clear (1UL) /*!< Disable */ -/* Bit 20 : Write '1' to Disable interrupt for CH[7].LIMITH event */ +/* Bit 20 : Write '1' to disable interrupt for CH[7].LIMITH event */ #define SAADC_INTENCLR_CH7LIMITH_Pos (20UL) /*!< Position of CH7LIMITH field. */ #define SAADC_INTENCLR_CH7LIMITH_Msk (0x1UL << SAADC_INTENCLR_CH7LIMITH_Pos) /*!< Bit mask of CH7LIMITH field. */ #define SAADC_INTENCLR_CH7LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH7LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH7LIMITH_Clear (1UL) /*!< Disable */ -/* Bit 19 : Write '1' to Disable interrupt for CH[6].LIMITL event */ +/* Bit 19 : Write '1' to disable interrupt for CH[6].LIMITL event */ #define SAADC_INTENCLR_CH6LIMITL_Pos (19UL) /*!< Position of CH6LIMITL field. */ #define SAADC_INTENCLR_CH6LIMITL_Msk (0x1UL << SAADC_INTENCLR_CH6LIMITL_Pos) /*!< Bit mask of CH6LIMITL field. */ #define SAADC_INTENCLR_CH6LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH6LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH6LIMITL_Clear (1UL) /*!< Disable */ -/* Bit 18 : Write '1' to Disable interrupt for CH[6].LIMITH event */ +/* Bit 18 : Write '1' to disable interrupt for CH[6].LIMITH event */ #define SAADC_INTENCLR_CH6LIMITH_Pos (18UL) /*!< Position of CH6LIMITH field. */ #define SAADC_INTENCLR_CH6LIMITH_Msk (0x1UL << SAADC_INTENCLR_CH6LIMITH_Pos) /*!< Bit mask of CH6LIMITH field. */ #define SAADC_INTENCLR_CH6LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH6LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH6LIMITH_Clear (1UL) /*!< Disable */ -/* Bit 17 : Write '1' to Disable interrupt for CH[5].LIMITL event */ +/* Bit 17 : Write '1' to disable interrupt for CH[5].LIMITL event */ #define SAADC_INTENCLR_CH5LIMITL_Pos (17UL) /*!< Position of CH5LIMITL field. */ #define SAADC_INTENCLR_CH5LIMITL_Msk (0x1UL << SAADC_INTENCLR_CH5LIMITL_Pos) /*!< Bit mask of CH5LIMITL field. */ #define SAADC_INTENCLR_CH5LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH5LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH5LIMITL_Clear (1UL) /*!< Disable */ -/* Bit 16 : Write '1' to Disable interrupt for CH[5].LIMITH event */ +/* Bit 16 : Write '1' to disable interrupt for CH[5].LIMITH event */ #define SAADC_INTENCLR_CH5LIMITH_Pos (16UL) /*!< Position of CH5LIMITH field. */ #define SAADC_INTENCLR_CH5LIMITH_Msk (0x1UL << SAADC_INTENCLR_CH5LIMITH_Pos) /*!< Bit mask of CH5LIMITH field. */ #define SAADC_INTENCLR_CH5LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH5LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH5LIMITH_Clear (1UL) /*!< Disable */ -/* Bit 15 : Write '1' to Disable interrupt for CH[4].LIMITL event */ +/* Bit 15 : Write '1' to disable interrupt for CH[4].LIMITL event */ #define SAADC_INTENCLR_CH4LIMITL_Pos (15UL) /*!< Position of CH4LIMITL field. */ #define SAADC_INTENCLR_CH4LIMITL_Msk (0x1UL << SAADC_INTENCLR_CH4LIMITL_Pos) /*!< Bit mask of CH4LIMITL field. */ #define SAADC_INTENCLR_CH4LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH4LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH4LIMITL_Clear (1UL) /*!< Disable */ -/* Bit 14 : Write '1' to Disable interrupt for CH[4].LIMITH event */ +/* Bit 14 : Write '1' to disable interrupt for CH[4].LIMITH event */ #define SAADC_INTENCLR_CH4LIMITH_Pos (14UL) /*!< Position of CH4LIMITH field. */ #define SAADC_INTENCLR_CH4LIMITH_Msk (0x1UL << SAADC_INTENCLR_CH4LIMITH_Pos) /*!< Bit mask of CH4LIMITH field. */ #define SAADC_INTENCLR_CH4LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH4LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH4LIMITH_Clear (1UL) /*!< Disable */ -/* Bit 13 : Write '1' to Disable interrupt for CH[3].LIMITL event */ +/* Bit 13 : Write '1' to disable interrupt for CH[3].LIMITL event */ #define SAADC_INTENCLR_CH3LIMITL_Pos (13UL) /*!< Position of CH3LIMITL field. */ #define SAADC_INTENCLR_CH3LIMITL_Msk (0x1UL << SAADC_INTENCLR_CH3LIMITL_Pos) /*!< Bit mask of CH3LIMITL field. */ #define SAADC_INTENCLR_CH3LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH3LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH3LIMITL_Clear (1UL) /*!< Disable */ -/* Bit 12 : Write '1' to Disable interrupt for CH[3].LIMITH event */ +/* Bit 12 : Write '1' to disable interrupt for CH[3].LIMITH event */ #define SAADC_INTENCLR_CH3LIMITH_Pos (12UL) /*!< Position of CH3LIMITH field. */ #define SAADC_INTENCLR_CH3LIMITH_Msk (0x1UL << SAADC_INTENCLR_CH3LIMITH_Pos) /*!< Bit mask of CH3LIMITH field. */ #define SAADC_INTENCLR_CH3LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH3LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH3LIMITH_Clear (1UL) /*!< Disable */ -/* Bit 11 : Write '1' to Disable interrupt for CH[2].LIMITL event */ +/* Bit 11 : Write '1' to disable interrupt for CH[2].LIMITL event */ #define SAADC_INTENCLR_CH2LIMITL_Pos (11UL) /*!< Position of CH2LIMITL field. */ #define SAADC_INTENCLR_CH2LIMITL_Msk (0x1UL << SAADC_INTENCLR_CH2LIMITL_Pos) /*!< Bit mask of CH2LIMITL field. */ #define SAADC_INTENCLR_CH2LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH2LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH2LIMITL_Clear (1UL) /*!< Disable */ -/* Bit 10 : Write '1' to Disable interrupt for CH[2].LIMITH event */ +/* Bit 10 : Write '1' to disable interrupt for CH[2].LIMITH event */ #define SAADC_INTENCLR_CH2LIMITH_Pos (10UL) /*!< Position of CH2LIMITH field. */ #define SAADC_INTENCLR_CH2LIMITH_Msk (0x1UL << SAADC_INTENCLR_CH2LIMITH_Pos) /*!< Bit mask of CH2LIMITH field. */ #define SAADC_INTENCLR_CH2LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH2LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH2LIMITH_Clear (1UL) /*!< Disable */ -/* Bit 9 : Write '1' to Disable interrupt for CH[1].LIMITL event */ +/* Bit 9 : Write '1' to disable interrupt for CH[1].LIMITL event */ #define SAADC_INTENCLR_CH1LIMITL_Pos (9UL) /*!< Position of CH1LIMITL field. */ #define SAADC_INTENCLR_CH1LIMITL_Msk (0x1UL << SAADC_INTENCLR_CH1LIMITL_Pos) /*!< Bit mask of CH1LIMITL field. */ #define SAADC_INTENCLR_CH1LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH1LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH1LIMITL_Clear (1UL) /*!< Disable */ -/* Bit 8 : Write '1' to Disable interrupt for CH[1].LIMITH event */ +/* Bit 8 : Write '1' to disable interrupt for CH[1].LIMITH event */ #define SAADC_INTENCLR_CH1LIMITH_Pos (8UL) /*!< Position of CH1LIMITH field. */ #define SAADC_INTENCLR_CH1LIMITH_Msk (0x1UL << SAADC_INTENCLR_CH1LIMITH_Pos) /*!< Bit mask of CH1LIMITH field. */ #define SAADC_INTENCLR_CH1LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH1LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH1LIMITH_Clear (1UL) /*!< Disable */ -/* Bit 7 : Write '1' to Disable interrupt for CH[0].LIMITL event */ +/* Bit 7 : Write '1' to disable interrupt for CH[0].LIMITL event */ #define SAADC_INTENCLR_CH0LIMITL_Pos (7UL) /*!< Position of CH0LIMITL field. */ #define SAADC_INTENCLR_CH0LIMITL_Msk (0x1UL << SAADC_INTENCLR_CH0LIMITL_Pos) /*!< Bit mask of CH0LIMITL field. */ #define SAADC_INTENCLR_CH0LIMITL_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH0LIMITL_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH0LIMITL_Clear (1UL) /*!< Disable */ -/* Bit 6 : Write '1' to Disable interrupt for CH[0].LIMITH event */ +/* Bit 6 : Write '1' to disable interrupt for CH[0].LIMITH event */ #define SAADC_INTENCLR_CH0LIMITH_Pos (6UL) /*!< Position of CH0LIMITH field. */ #define SAADC_INTENCLR_CH0LIMITH_Msk (0x1UL << SAADC_INTENCLR_CH0LIMITH_Pos) /*!< Bit mask of CH0LIMITH field. */ #define SAADC_INTENCLR_CH0LIMITH_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CH0LIMITH_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CH0LIMITH_Clear (1UL) /*!< Disable */ -/* Bit 5 : Write '1' to Disable interrupt for STOPPED event */ +/* Bit 5 : Write '1' to disable interrupt for STOPPED event */ #define SAADC_INTENCLR_STOPPED_Pos (5UL) /*!< Position of STOPPED field. */ #define SAADC_INTENCLR_STOPPED_Msk (0x1UL << SAADC_INTENCLR_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define SAADC_INTENCLR_STOPPED_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_STOPPED_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_STOPPED_Clear (1UL) /*!< Disable */ -/* Bit 4 : Write '1' to Disable interrupt for CALIBRATEDONE event */ +/* Bit 4 : Write '1' to disable interrupt for CALIBRATEDONE event */ #define SAADC_INTENCLR_CALIBRATEDONE_Pos (4UL) /*!< Position of CALIBRATEDONE field. */ #define SAADC_INTENCLR_CALIBRATEDONE_Msk (0x1UL << SAADC_INTENCLR_CALIBRATEDONE_Pos) /*!< Bit mask of CALIBRATEDONE field. */ #define SAADC_INTENCLR_CALIBRATEDONE_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_CALIBRATEDONE_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_CALIBRATEDONE_Clear (1UL) /*!< Disable */ -/* Bit 3 : Write '1' to Disable interrupt for RESULTDONE event */ +/* Bit 3 : Write '1' to disable interrupt for RESULTDONE event */ #define SAADC_INTENCLR_RESULTDONE_Pos (3UL) /*!< Position of RESULTDONE field. */ #define SAADC_INTENCLR_RESULTDONE_Msk (0x1UL << SAADC_INTENCLR_RESULTDONE_Pos) /*!< Bit mask of RESULTDONE field. */ #define SAADC_INTENCLR_RESULTDONE_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_RESULTDONE_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_RESULTDONE_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for DONE event */ +/* Bit 2 : Write '1' to disable interrupt for DONE event */ #define SAADC_INTENCLR_DONE_Pos (2UL) /*!< Position of DONE field. */ #define SAADC_INTENCLR_DONE_Msk (0x1UL << SAADC_INTENCLR_DONE_Pos) /*!< Bit mask of DONE field. */ #define SAADC_INTENCLR_DONE_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_DONE_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_DONE_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for END event */ +/* Bit 1 : Write '1' to disable interrupt for END event */ #define SAADC_INTENCLR_END_Pos (1UL) /*!< Position of END field. */ #define SAADC_INTENCLR_END_Msk (0x1UL << SAADC_INTENCLR_END_Pos) /*!< Bit mask of END field. */ #define SAADC_INTENCLR_END_Disabled (0UL) /*!< Read: Disabled */ #define SAADC_INTENCLR_END_Enabled (1UL) /*!< Read: Enabled */ #define SAADC_INTENCLR_END_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for STARTED event */ +/* Bit 0 : Write '1' to disable interrupt for STARTED event */ #define SAADC_INTENCLR_STARTED_Pos (0UL) /*!< Position of STARTED field. */ #define SAADC_INTENCLR_STARTED_Msk (0x1UL << SAADC_INTENCLR_STARTED_Pos) /*!< Bit mask of STARTED field. */ #define SAADC_INTENCLR_STARTED_Disabled (0UL) /*!< Read: Disabled */ @@ -10519,20 +11920,20 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Bit 0 : Status */ #define SAADC_STATUS_STATUS_Pos (0UL) /*!< Position of STATUS field. */ #define SAADC_STATUS_STATUS_Msk (0x1UL << SAADC_STATUS_STATUS_Pos) /*!< Bit mask of STATUS field. */ -#define SAADC_STATUS_STATUS_Ready (0UL) /*!< ADC is ready. No on-going conversion. */ -#define SAADC_STATUS_STATUS_Busy (1UL) /*!< ADC is busy. Conversion in progress. */ +#define SAADC_STATUS_STATUS_Ready (0UL) /*!< SAADC is ready. No on-going conversions. */ +#define SAADC_STATUS_STATUS_Busy (1UL) /*!< SAADC is busy. Conversion in progress. */ /* Register: SAADC_ENABLE */ -/* Description: Enable or disable ADC */ +/* Description: Enable or disable SAADC */ -/* Bit 0 : Enable or disable ADC */ +/* Bit 0 : Enable or disable SAADC */ #define SAADC_ENABLE_ENABLE_Pos (0UL) /*!< Position of ENABLE field. */ #define SAADC_ENABLE_ENABLE_Msk (0x1UL << SAADC_ENABLE_ENABLE_Pos) /*!< Bit mask of ENABLE field. */ -#define SAADC_ENABLE_ENABLE_Disabled (0UL) /*!< Disable ADC */ -#define SAADC_ENABLE_ENABLE_Enabled (1UL) /*!< Enable ADC */ +#define SAADC_ENABLE_ENABLE_Disabled (0UL) /*!< Disable SAADC */ +#define SAADC_ENABLE_ENABLE_Enabled (1UL) /*!< Enable SAADC */ /* Register: SAADC_CH_PSELP */ -/* Description: Description cluster[0]: Input positive pin selection for CH[0] */ +/* Description: Description cluster[n]: Input positive pin selection for CH[n] */ /* Bits 4..0 : Analog positive input channel */ #define SAADC_CH_PSELP_PSELP_Pos (0UL) /*!< Position of PSELP field. */ @@ -10550,7 +11951,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SAADC_CH_PSELP_PSELP_VDDHDIV5 (0x0DUL) /*!< VDDH/5 */ /* Register: SAADC_CH_PSELN */ -/* Description: Description cluster[0]: Input negative pin selection for CH[0] */ +/* Description: Description cluster[n]: Input negative pin selection for CH[n] */ /* Bits 4..0 : Analog negative input, enables differential channel */ #define SAADC_CH_PSELN_PSELN_Pos (0UL) /*!< Position of PSELN field. */ @@ -10568,7 +11969,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SAADC_CH_PSELN_PSELN_VDDHDIV5 (0x0DUL) /*!< VDDH/5 */ /* Register: SAADC_CH_CONFIG */ -/* Description: Description cluster[0]: Input configuration for CH[0] */ +/* Description: Description cluster[n]: Input configuration for CH[n] */ /* Bit 24 : Enable burst mode */ #define SAADC_CH_CONFIG_BURST_Pos (24UL) /*!< Position of BURST field. */ @@ -10579,10 +11980,10 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Bit 20 : Enable differential mode */ #define SAADC_CH_CONFIG_MODE_Pos (20UL) /*!< Position of MODE field. */ #define SAADC_CH_CONFIG_MODE_Msk (0x1UL << SAADC_CH_CONFIG_MODE_Pos) /*!< Bit mask of MODE field. */ -#define SAADC_CH_CONFIG_MODE_SE (0UL) /*!< Single ended, PSELN will be ignored, negative input to ADC shorted to GND */ +#define SAADC_CH_CONFIG_MODE_SE (0UL) /*!< Single-ended, PSELN will be ignored, negative input to SAADC shorted to GND */ #define SAADC_CH_CONFIG_MODE_Diff (1UL) /*!< Differential */ -/* Bits 18..16 : Acquisition time, the time the ADC uses to sample the input voltage */ +/* Bits 18..16 : Acquisition time, the time the SAADC uses to sample the input voltage */ #define SAADC_CH_CONFIG_TACQ_Pos (16UL) /*!< Position of TACQ field. */ #define SAADC_CH_CONFIG_TACQ_Msk (0x7UL << SAADC_CH_CONFIG_TACQ_Pos) /*!< Bit mask of TACQ field. */ #define SAADC_CH_CONFIG_TACQ_3us (0UL) /*!< 3 us */ @@ -10627,7 +12028,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SAADC_CH_CONFIG_RESP_VDD1_2 (3UL) /*!< Set input at VDD/2 */ /* Register: SAADC_CH_LIMIT */ -/* Description: Description cluster[0]: High/low limits for event monitoring a channel */ +/* Description: Description cluster[n]: High/low limits for event monitoring of a channel */ /* Bits 31..16 : High level limit */ #define SAADC_CH_LIMIT_HIGH_Pos (16UL) /*!< Position of HIGH field. */ @@ -10643,13 +12044,13 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Bits 2..0 : Set the resolution */ #define SAADC_RESOLUTION_VAL_Pos (0UL) /*!< Position of VAL field. */ #define SAADC_RESOLUTION_VAL_Msk (0x7UL << SAADC_RESOLUTION_VAL_Pos) /*!< Bit mask of VAL field. */ -#define SAADC_RESOLUTION_VAL_8bit (0UL) /*!< 8 bit */ -#define SAADC_RESOLUTION_VAL_10bit (1UL) /*!< 10 bit */ -#define SAADC_RESOLUTION_VAL_12bit (2UL) /*!< 12 bit */ -#define SAADC_RESOLUTION_VAL_14bit (3UL) /*!< 14 bit */ +#define SAADC_RESOLUTION_VAL_8bit (0UL) /*!< 8 bits */ +#define SAADC_RESOLUTION_VAL_10bit (1UL) /*!< 10 bits */ +#define SAADC_RESOLUTION_VAL_12bit (2UL) /*!< 12 bits */ +#define SAADC_RESOLUTION_VAL_14bit (3UL) /*!< 14 bits */ /* Register: SAADC_OVERSAMPLE */ -/* Description: Oversampling configuration. OVERSAMPLE should not be combined with SCAN. The RESOLUTION is applied before averaging, thus for high OVERSAMPLE a higher RESOLUTION should be used. */ +/* Description: Oversampling configuration. The RESOLUTION is applied before averaging, thus for high OVERSAMPLE a higher RESOLUTION should be used. */ /* Bits 3..0 : Oversample control */ #define SAADC_OVERSAMPLE_OVERSAMPLE_Pos (0UL) /*!< Position of OVERSAMPLE field. */ @@ -10685,16 +12086,16 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SAADC_RESULT_PTR_PTR_Msk (0xFFFFFFFFUL << SAADC_RESULT_PTR_PTR_Pos) /*!< Bit mask of PTR field. */ /* Register: SAADC_RESULT_MAXCNT */ -/* Description: Maximum number of buffer words to transfer */ +/* Description: Maximum number of 16-bit samples to be written to output RAM buffer */ -/* Bits 14..0 : Maximum number of buffer words to transfer */ +/* Bits 14..0 : Maximum number of 16-bit samples to be written to output RAM buffer */ #define SAADC_RESULT_MAXCNT_MAXCNT_Pos (0UL) /*!< Position of MAXCNT field. */ #define SAADC_RESULT_MAXCNT_MAXCNT_Msk (0x7FFFUL << SAADC_RESULT_MAXCNT_MAXCNT_Pos) /*!< Bit mask of MAXCNT field. */ /* Register: SAADC_RESULT_AMOUNT */ -/* Description: Number of buffer words transferred since last START */ +/* Description: Number of 16-bit samples written to output RAM buffer since the previous START task */ -/* Bits 14..0 : Number of buffer words transferred since last START. This register can be read after an END or STOPPED event. */ +/* Bits 14..0 : Number of 16-bit samples written to output RAM buffer since the previous START task. This register can be read after an END or STOPPED event. */ #define SAADC_RESULT_AMOUNT_AMOUNT_Pos (0UL) /*!< Position of AMOUNT field. */ #define SAADC_RESULT_AMOUNT_AMOUNT_Msk (0x7FFFUL << SAADC_RESULT_AMOUNT_AMOUNT_Pos) /*!< Bit mask of AMOUNT field. */ @@ -10702,10 +12103,17 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: SPI */ /* Description: Serial Peripheral Interface 0 */ +/* Register: SPI_EVENTS_READY */ +/* Description: TXD byte sent and RXD byte received */ + +/* Bit 0 : */ +#define SPI_EVENTS_READY_EVENTS_READY_Pos (0UL) /*!< Position of EVENTS_READY field. */ +#define SPI_EVENTS_READY_EVENTS_READY_Msk (0x1UL << SPI_EVENTS_READY_EVENTS_READY_Pos) /*!< Bit mask of EVENTS_READY field. */ + /* Register: SPI_INTENSET */ /* Description: Enable interrupt */ -/* Bit 2 : Write '1' to Enable interrupt for READY event */ +/* Bit 2 : Write '1' to enable interrupt for READY event */ #define SPI_INTENSET_READY_Pos (2UL) /*!< Position of READY field. */ #define SPI_INTENSET_READY_Msk (0x1UL << SPI_INTENSET_READY_Pos) /*!< Bit mask of READY field. */ #define SPI_INTENSET_READY_Disabled (0UL) /*!< Read: Disabled */ @@ -10715,7 +12123,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: SPI_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 2 : Write '1' to Disable interrupt for READY event */ +/* Bit 2 : Write '1' to disable interrupt for READY event */ #define SPI_INTENCLR_READY_Pos (2UL) /*!< Position of READY field. */ #define SPI_INTENCLR_READY_Msk (0x1UL << SPI_INTENCLR_READY_Pos) /*!< Bit mask of READY field. */ #define SPI_INTENCLR_READY_Disabled (0UL) /*!< Read: Disabled */ @@ -10835,6 +12243,69 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: SPIM */ /* Description: Serial Peripheral Interface Master with EasyDMA 0 */ +/* Register: SPIM_TASKS_START */ +/* Description: Start SPI transaction */ + +/* Bit 0 : */ +#define SPIM_TASKS_START_TASKS_START_Pos (0UL) /*!< Position of TASKS_START field. */ +#define SPIM_TASKS_START_TASKS_START_Msk (0x1UL << SPIM_TASKS_START_TASKS_START_Pos) /*!< Bit mask of TASKS_START field. */ + +/* Register: SPIM_TASKS_STOP */ +/* Description: Stop SPI transaction */ + +/* Bit 0 : */ +#define SPIM_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define SPIM_TASKS_STOP_TASKS_STOP_Msk (0x1UL << SPIM_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: SPIM_TASKS_SUSPEND */ +/* Description: Suspend SPI transaction */ + +/* Bit 0 : */ +#define SPIM_TASKS_SUSPEND_TASKS_SUSPEND_Pos (0UL) /*!< Position of TASKS_SUSPEND field. */ +#define SPIM_TASKS_SUSPEND_TASKS_SUSPEND_Msk (0x1UL << SPIM_TASKS_SUSPEND_TASKS_SUSPEND_Pos) /*!< Bit mask of TASKS_SUSPEND field. */ + +/* Register: SPIM_TASKS_RESUME */ +/* Description: Resume SPI transaction */ + +/* Bit 0 : */ +#define SPIM_TASKS_RESUME_TASKS_RESUME_Pos (0UL) /*!< Position of TASKS_RESUME field. */ +#define SPIM_TASKS_RESUME_TASKS_RESUME_Msk (0x1UL << SPIM_TASKS_RESUME_TASKS_RESUME_Pos) /*!< Bit mask of TASKS_RESUME field. */ + +/* Register: SPIM_EVENTS_STOPPED */ +/* Description: SPI transaction has stopped */ + +/* Bit 0 : */ +#define SPIM_EVENTS_STOPPED_EVENTS_STOPPED_Pos (0UL) /*!< Position of EVENTS_STOPPED field. */ +#define SPIM_EVENTS_STOPPED_EVENTS_STOPPED_Msk (0x1UL << SPIM_EVENTS_STOPPED_EVENTS_STOPPED_Pos) /*!< Bit mask of EVENTS_STOPPED field. */ + +/* Register: SPIM_EVENTS_ENDRX */ +/* Description: End of RXD buffer reached */ + +/* Bit 0 : */ +#define SPIM_EVENTS_ENDRX_EVENTS_ENDRX_Pos (0UL) /*!< Position of EVENTS_ENDRX field. */ +#define SPIM_EVENTS_ENDRX_EVENTS_ENDRX_Msk (0x1UL << SPIM_EVENTS_ENDRX_EVENTS_ENDRX_Pos) /*!< Bit mask of EVENTS_ENDRX field. */ + +/* Register: SPIM_EVENTS_END */ +/* Description: End of RXD buffer and TXD buffer reached */ + +/* Bit 0 : */ +#define SPIM_EVENTS_END_EVENTS_END_Pos (0UL) /*!< Position of EVENTS_END field. */ +#define SPIM_EVENTS_END_EVENTS_END_Msk (0x1UL << SPIM_EVENTS_END_EVENTS_END_Pos) /*!< Bit mask of EVENTS_END field. */ + +/* Register: SPIM_EVENTS_ENDTX */ +/* Description: End of TXD buffer reached */ + +/* Bit 0 : */ +#define SPIM_EVENTS_ENDTX_EVENTS_ENDTX_Pos (0UL) /*!< Position of EVENTS_ENDTX field. */ +#define SPIM_EVENTS_ENDTX_EVENTS_ENDTX_Msk (0x1UL << SPIM_EVENTS_ENDTX_EVENTS_ENDTX_Pos) /*!< Bit mask of EVENTS_ENDTX field. */ + +/* Register: SPIM_EVENTS_STARTED */ +/* Description: Transaction started */ + +/* Bit 0 : */ +#define SPIM_EVENTS_STARTED_EVENTS_STARTED_Pos (0UL) /*!< Position of EVENTS_STARTED field. */ +#define SPIM_EVENTS_STARTED_EVENTS_STARTED_Msk (0x1UL << SPIM_EVENTS_STARTED_EVENTS_STARTED_Pos) /*!< Bit mask of EVENTS_STARTED field. */ + /* Register: SPIM_SHORTS */ /* Description: Shortcut register */ @@ -10847,35 +12318,35 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: SPIM_INTENSET */ /* Description: Enable interrupt */ -/* Bit 19 : Write '1' to Enable interrupt for STARTED event */ +/* Bit 19 : Write '1' to enable interrupt for STARTED event */ #define SPIM_INTENSET_STARTED_Pos (19UL) /*!< Position of STARTED field. */ #define SPIM_INTENSET_STARTED_Msk (0x1UL << SPIM_INTENSET_STARTED_Pos) /*!< Bit mask of STARTED field. */ #define SPIM_INTENSET_STARTED_Disabled (0UL) /*!< Read: Disabled */ #define SPIM_INTENSET_STARTED_Enabled (1UL) /*!< Read: Enabled */ #define SPIM_INTENSET_STARTED_Set (1UL) /*!< Enable */ -/* Bit 8 : Write '1' to Enable interrupt for ENDTX event */ +/* Bit 8 : Write '1' to enable interrupt for ENDTX event */ #define SPIM_INTENSET_ENDTX_Pos (8UL) /*!< Position of ENDTX field. */ #define SPIM_INTENSET_ENDTX_Msk (0x1UL << SPIM_INTENSET_ENDTX_Pos) /*!< Bit mask of ENDTX field. */ #define SPIM_INTENSET_ENDTX_Disabled (0UL) /*!< Read: Disabled */ #define SPIM_INTENSET_ENDTX_Enabled (1UL) /*!< Read: Enabled */ #define SPIM_INTENSET_ENDTX_Set (1UL) /*!< Enable */ -/* Bit 6 : Write '1' to Enable interrupt for END event */ +/* Bit 6 : Write '1' to enable interrupt for END event */ #define SPIM_INTENSET_END_Pos (6UL) /*!< Position of END field. */ #define SPIM_INTENSET_END_Msk (0x1UL << SPIM_INTENSET_END_Pos) /*!< Bit mask of END field. */ #define SPIM_INTENSET_END_Disabled (0UL) /*!< Read: Disabled */ #define SPIM_INTENSET_END_Enabled (1UL) /*!< Read: Enabled */ #define SPIM_INTENSET_END_Set (1UL) /*!< Enable */ -/* Bit 4 : Write '1' to Enable interrupt for ENDRX event */ +/* Bit 4 : Write '1' to enable interrupt for ENDRX event */ #define SPIM_INTENSET_ENDRX_Pos (4UL) /*!< Position of ENDRX field. */ #define SPIM_INTENSET_ENDRX_Msk (0x1UL << SPIM_INTENSET_ENDRX_Pos) /*!< Bit mask of ENDRX field. */ #define SPIM_INTENSET_ENDRX_Disabled (0UL) /*!< Read: Disabled */ #define SPIM_INTENSET_ENDRX_Enabled (1UL) /*!< Read: Enabled */ #define SPIM_INTENSET_ENDRX_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for STOPPED event */ +/* Bit 1 : Write '1' to enable interrupt for STOPPED event */ #define SPIM_INTENSET_STOPPED_Pos (1UL) /*!< Position of STOPPED field. */ #define SPIM_INTENSET_STOPPED_Msk (0x1UL << SPIM_INTENSET_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define SPIM_INTENSET_STOPPED_Disabled (0UL) /*!< Read: Disabled */ @@ -10885,35 +12356,35 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: SPIM_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 19 : Write '1' to Disable interrupt for STARTED event */ +/* Bit 19 : Write '1' to disable interrupt for STARTED event */ #define SPIM_INTENCLR_STARTED_Pos (19UL) /*!< Position of STARTED field. */ #define SPIM_INTENCLR_STARTED_Msk (0x1UL << SPIM_INTENCLR_STARTED_Pos) /*!< Bit mask of STARTED field. */ #define SPIM_INTENCLR_STARTED_Disabled (0UL) /*!< Read: Disabled */ #define SPIM_INTENCLR_STARTED_Enabled (1UL) /*!< Read: Enabled */ #define SPIM_INTENCLR_STARTED_Clear (1UL) /*!< Disable */ -/* Bit 8 : Write '1' to Disable interrupt for ENDTX event */ +/* Bit 8 : Write '1' to disable interrupt for ENDTX event */ #define SPIM_INTENCLR_ENDTX_Pos (8UL) /*!< Position of ENDTX field. */ #define SPIM_INTENCLR_ENDTX_Msk (0x1UL << SPIM_INTENCLR_ENDTX_Pos) /*!< Bit mask of ENDTX field. */ #define SPIM_INTENCLR_ENDTX_Disabled (0UL) /*!< Read: Disabled */ #define SPIM_INTENCLR_ENDTX_Enabled (1UL) /*!< Read: Enabled */ #define SPIM_INTENCLR_ENDTX_Clear (1UL) /*!< Disable */ -/* Bit 6 : Write '1' to Disable interrupt for END event */ +/* Bit 6 : Write '1' to disable interrupt for END event */ #define SPIM_INTENCLR_END_Pos (6UL) /*!< Position of END field. */ #define SPIM_INTENCLR_END_Msk (0x1UL << SPIM_INTENCLR_END_Pos) /*!< Bit mask of END field. */ #define SPIM_INTENCLR_END_Disabled (0UL) /*!< Read: Disabled */ #define SPIM_INTENCLR_END_Enabled (1UL) /*!< Read: Enabled */ #define SPIM_INTENCLR_END_Clear (1UL) /*!< Disable */ -/* Bit 4 : Write '1' to Disable interrupt for ENDRX event */ +/* Bit 4 : Write '1' to disable interrupt for ENDRX event */ #define SPIM_INTENCLR_ENDRX_Pos (4UL) /*!< Position of ENDRX field. */ #define SPIM_INTENCLR_ENDRX_Msk (0x1UL << SPIM_INTENCLR_ENDRX_Pos) /*!< Bit mask of ENDRX field. */ #define SPIM_INTENCLR_ENDRX_Disabled (0UL) /*!< Read: Disabled */ #define SPIM_INTENCLR_ENDRX_Enabled (1UL) /*!< Read: Enabled */ #define SPIM_INTENCLR_ENDRX_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for STOPPED event */ +/* Bit 1 : Write '1' to disable interrupt for STOPPED event */ #define SPIM_INTENCLR_STOPPED_Pos (1UL) /*!< Position of STOPPED field. */ #define SPIM_INTENCLR_STOPPED_Msk (0x1UL << SPIM_INTENCLR_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define SPIM_INTENCLR_STOPPED_Disabled (0UL) /*!< Read: Disabled */ @@ -11167,6 +12638,41 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: SPIS */ /* Description: SPI Slave 0 */ +/* Register: SPIS_TASKS_ACQUIRE */ +/* Description: Acquire SPI semaphore */ + +/* Bit 0 : */ +#define SPIS_TASKS_ACQUIRE_TASKS_ACQUIRE_Pos (0UL) /*!< Position of TASKS_ACQUIRE field. */ +#define SPIS_TASKS_ACQUIRE_TASKS_ACQUIRE_Msk (0x1UL << SPIS_TASKS_ACQUIRE_TASKS_ACQUIRE_Pos) /*!< Bit mask of TASKS_ACQUIRE field. */ + +/* Register: SPIS_TASKS_RELEASE */ +/* Description: Release SPI semaphore, enabling the SPI slave to acquire it */ + +/* Bit 0 : */ +#define SPIS_TASKS_RELEASE_TASKS_RELEASE_Pos (0UL) /*!< Position of TASKS_RELEASE field. */ +#define SPIS_TASKS_RELEASE_TASKS_RELEASE_Msk (0x1UL << SPIS_TASKS_RELEASE_TASKS_RELEASE_Pos) /*!< Bit mask of TASKS_RELEASE field. */ + +/* Register: SPIS_EVENTS_END */ +/* Description: Granted transaction completed */ + +/* Bit 0 : */ +#define SPIS_EVENTS_END_EVENTS_END_Pos (0UL) /*!< Position of EVENTS_END field. */ +#define SPIS_EVENTS_END_EVENTS_END_Msk (0x1UL << SPIS_EVENTS_END_EVENTS_END_Pos) /*!< Bit mask of EVENTS_END field. */ + +/* Register: SPIS_EVENTS_ENDRX */ +/* Description: End of RXD buffer reached */ + +/* Bit 0 : */ +#define SPIS_EVENTS_ENDRX_EVENTS_ENDRX_Pos (0UL) /*!< Position of EVENTS_ENDRX field. */ +#define SPIS_EVENTS_ENDRX_EVENTS_ENDRX_Msk (0x1UL << SPIS_EVENTS_ENDRX_EVENTS_ENDRX_Pos) /*!< Bit mask of EVENTS_ENDRX field. */ + +/* Register: SPIS_EVENTS_ACQUIRED */ +/* Description: Semaphore acquired */ + +/* Bit 0 : */ +#define SPIS_EVENTS_ACQUIRED_EVENTS_ACQUIRED_Pos (0UL) /*!< Position of EVENTS_ACQUIRED field. */ +#define SPIS_EVENTS_ACQUIRED_EVENTS_ACQUIRED_Msk (0x1UL << SPIS_EVENTS_ACQUIRED_EVENTS_ACQUIRED_Pos) /*!< Bit mask of EVENTS_ACQUIRED field. */ + /* Register: SPIS_SHORTS */ /* Description: Shortcut register */ @@ -11179,21 +12685,21 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: SPIS_INTENSET */ /* Description: Enable interrupt */ -/* Bit 10 : Write '1' to Enable interrupt for ACQUIRED event */ +/* Bit 10 : Write '1' to enable interrupt for ACQUIRED event */ #define SPIS_INTENSET_ACQUIRED_Pos (10UL) /*!< Position of ACQUIRED field. */ #define SPIS_INTENSET_ACQUIRED_Msk (0x1UL << SPIS_INTENSET_ACQUIRED_Pos) /*!< Bit mask of ACQUIRED field. */ #define SPIS_INTENSET_ACQUIRED_Disabled (0UL) /*!< Read: Disabled */ #define SPIS_INTENSET_ACQUIRED_Enabled (1UL) /*!< Read: Enabled */ #define SPIS_INTENSET_ACQUIRED_Set (1UL) /*!< Enable */ -/* Bit 4 : Write '1' to Enable interrupt for ENDRX event */ +/* Bit 4 : Write '1' to enable interrupt for ENDRX event */ #define SPIS_INTENSET_ENDRX_Pos (4UL) /*!< Position of ENDRX field. */ #define SPIS_INTENSET_ENDRX_Msk (0x1UL << SPIS_INTENSET_ENDRX_Pos) /*!< Bit mask of ENDRX field. */ #define SPIS_INTENSET_ENDRX_Disabled (0UL) /*!< Read: Disabled */ #define SPIS_INTENSET_ENDRX_Enabled (1UL) /*!< Read: Enabled */ #define SPIS_INTENSET_ENDRX_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for END event */ +/* Bit 1 : Write '1' to enable interrupt for END event */ #define SPIS_INTENSET_END_Pos (1UL) /*!< Position of END field. */ #define SPIS_INTENSET_END_Msk (0x1UL << SPIS_INTENSET_END_Pos) /*!< Bit mask of END field. */ #define SPIS_INTENSET_END_Disabled (0UL) /*!< Read: Disabled */ @@ -11203,21 +12709,21 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: SPIS_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 10 : Write '1' to Disable interrupt for ACQUIRED event */ +/* Bit 10 : Write '1' to disable interrupt for ACQUIRED event */ #define SPIS_INTENCLR_ACQUIRED_Pos (10UL) /*!< Position of ACQUIRED field. */ #define SPIS_INTENCLR_ACQUIRED_Msk (0x1UL << SPIS_INTENCLR_ACQUIRED_Pos) /*!< Bit mask of ACQUIRED field. */ #define SPIS_INTENCLR_ACQUIRED_Disabled (0UL) /*!< Read: Disabled */ #define SPIS_INTENCLR_ACQUIRED_Enabled (1UL) /*!< Read: Enabled */ #define SPIS_INTENCLR_ACQUIRED_Clear (1UL) /*!< Disable */ -/* Bit 4 : Write '1' to Disable interrupt for ENDRX event */ +/* Bit 4 : Write '1' to disable interrupt for ENDRX event */ #define SPIS_INTENCLR_ENDRX_Pos (4UL) /*!< Position of ENDRX field. */ #define SPIS_INTENCLR_ENDRX_Msk (0x1UL << SPIS_INTENCLR_ENDRX_Pos) /*!< Bit mask of ENDRX field. */ #define SPIS_INTENCLR_ENDRX_Disabled (0UL) /*!< Read: Disabled */ #define SPIS_INTENCLR_ENDRX_Enabled (1UL) /*!< Read: Enabled */ #define SPIS_INTENCLR_ENDRX_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for END event */ +/* Bit 1 : Write '1' to disable interrupt for END event */ #define SPIS_INTENCLR_END_Pos (1UL) /*!< Position of END field. */ #define SPIS_INTENCLR_END_Msk (0x1UL << SPIS_INTENCLR_END_Pos) /*!< Bit mask of END field. */ #define SPIS_INTENCLR_END_Disabled (0UL) /*!< Read: Disabled */ @@ -11410,10 +12916,31 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: TEMP */ /* Description: Temperature Sensor */ +/* Register: TEMP_TASKS_START */ +/* Description: Start temperature measurement */ + +/* Bit 0 : */ +#define TEMP_TASKS_START_TASKS_START_Pos (0UL) /*!< Position of TASKS_START field. */ +#define TEMP_TASKS_START_TASKS_START_Msk (0x1UL << TEMP_TASKS_START_TASKS_START_Pos) /*!< Bit mask of TASKS_START field. */ + +/* Register: TEMP_TASKS_STOP */ +/* Description: Stop temperature measurement */ + +/* Bit 0 : */ +#define TEMP_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define TEMP_TASKS_STOP_TASKS_STOP_Msk (0x1UL << TEMP_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: TEMP_EVENTS_DATARDY */ +/* Description: Temperature measurement complete, data ready */ + +/* Bit 0 : */ +#define TEMP_EVENTS_DATARDY_EVENTS_DATARDY_Pos (0UL) /*!< Position of EVENTS_DATARDY field. */ +#define TEMP_EVENTS_DATARDY_EVENTS_DATARDY_Msk (0x1UL << TEMP_EVENTS_DATARDY_EVENTS_DATARDY_Pos) /*!< Bit mask of EVENTS_DATARDY field. */ + /* Register: TEMP_INTENSET */ /* Description: Enable interrupt */ -/* Bit 0 : Write '1' to Enable interrupt for DATARDY event */ +/* Bit 0 : Write '1' to enable interrupt for DATARDY event */ #define TEMP_INTENSET_DATARDY_Pos (0UL) /*!< Position of DATARDY field. */ #define TEMP_INTENSET_DATARDY_Msk (0x1UL << TEMP_INTENSET_DATARDY_Pos) /*!< Bit mask of DATARDY field. */ #define TEMP_INTENSET_DATARDY_Disabled (0UL) /*!< Read: Disabled */ @@ -11423,7 +12950,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: TEMP_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 0 : Write '1' to Disable interrupt for DATARDY event */ +/* Bit 0 : Write '1' to disable interrupt for DATARDY event */ #define TEMP_INTENCLR_DATARDY_Pos (0UL) /*!< Position of DATARDY field. */ #define TEMP_INTENCLR_DATARDY_Msk (0x1UL << TEMP_INTENCLR_DATARDY_Pos) /*!< Bit mask of DATARDY field. */ #define TEMP_INTENCLR_DATARDY_Disabled (0UL) /*!< Read: Disabled */ @@ -11560,6 +13087,55 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: TIMER */ /* Description: Timer/Counter 0 */ +/* Register: TIMER_TASKS_START */ +/* Description: Start Timer */ + +/* Bit 0 : */ +#define TIMER_TASKS_START_TASKS_START_Pos (0UL) /*!< Position of TASKS_START field. */ +#define TIMER_TASKS_START_TASKS_START_Msk (0x1UL << TIMER_TASKS_START_TASKS_START_Pos) /*!< Bit mask of TASKS_START field. */ + +/* Register: TIMER_TASKS_STOP */ +/* Description: Stop Timer */ + +/* Bit 0 : */ +#define TIMER_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define TIMER_TASKS_STOP_TASKS_STOP_Msk (0x1UL << TIMER_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: TIMER_TASKS_COUNT */ +/* Description: Increment Timer (Counter mode only) */ + +/* Bit 0 : */ +#define TIMER_TASKS_COUNT_TASKS_COUNT_Pos (0UL) /*!< Position of TASKS_COUNT field. */ +#define TIMER_TASKS_COUNT_TASKS_COUNT_Msk (0x1UL << TIMER_TASKS_COUNT_TASKS_COUNT_Pos) /*!< Bit mask of TASKS_COUNT field. */ + +/* Register: TIMER_TASKS_CLEAR */ +/* Description: Clear time */ + +/* Bit 0 : */ +#define TIMER_TASKS_CLEAR_TASKS_CLEAR_Pos (0UL) /*!< Position of TASKS_CLEAR field. */ +#define TIMER_TASKS_CLEAR_TASKS_CLEAR_Msk (0x1UL << TIMER_TASKS_CLEAR_TASKS_CLEAR_Pos) /*!< Bit mask of TASKS_CLEAR field. */ + +/* Register: TIMER_TASKS_SHUTDOWN */ +/* Description: Deprecated register - Shut down timer */ + +/* Bit 0 : */ +#define TIMER_TASKS_SHUTDOWN_TASKS_SHUTDOWN_Pos (0UL) /*!< Position of TASKS_SHUTDOWN field. */ +#define TIMER_TASKS_SHUTDOWN_TASKS_SHUTDOWN_Msk (0x1UL << TIMER_TASKS_SHUTDOWN_TASKS_SHUTDOWN_Pos) /*!< Bit mask of TASKS_SHUTDOWN field. */ + +/* Register: TIMER_TASKS_CAPTURE */ +/* Description: Description collection[n]: Capture Timer value to CC[n] register */ + +/* Bit 0 : */ +#define TIMER_TASKS_CAPTURE_TASKS_CAPTURE_Pos (0UL) /*!< Position of TASKS_CAPTURE field. */ +#define TIMER_TASKS_CAPTURE_TASKS_CAPTURE_Msk (0x1UL << TIMER_TASKS_CAPTURE_TASKS_CAPTURE_Pos) /*!< Bit mask of TASKS_CAPTURE field. */ + +/* Register: TIMER_EVENTS_COMPARE */ +/* Description: Description collection[n]: Compare event on CC[n] match */ + +/* Bit 0 : */ +#define TIMER_EVENTS_COMPARE_EVENTS_COMPARE_Pos (0UL) /*!< Position of EVENTS_COMPARE field. */ +#define TIMER_EVENTS_COMPARE_EVENTS_COMPARE_Msk (0x1UL << TIMER_EVENTS_COMPARE_EVENTS_COMPARE_Pos) /*!< Bit mask of EVENTS_COMPARE field. */ + /* Register: TIMER_SHORTS */ /* Description: Shortcut register */ @@ -11638,42 +13214,42 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: TIMER_INTENSET */ /* Description: Enable interrupt */ -/* Bit 21 : Write '1' to Enable interrupt for COMPARE[5] event */ +/* Bit 21 : Write '1' to enable interrupt for COMPARE[5] event */ #define TIMER_INTENSET_COMPARE5_Pos (21UL) /*!< Position of COMPARE5 field. */ #define TIMER_INTENSET_COMPARE5_Msk (0x1UL << TIMER_INTENSET_COMPARE5_Pos) /*!< Bit mask of COMPARE5 field. */ #define TIMER_INTENSET_COMPARE5_Disabled (0UL) /*!< Read: Disabled */ #define TIMER_INTENSET_COMPARE5_Enabled (1UL) /*!< Read: Enabled */ #define TIMER_INTENSET_COMPARE5_Set (1UL) /*!< Enable */ -/* Bit 20 : Write '1' to Enable interrupt for COMPARE[4] event */ +/* Bit 20 : Write '1' to enable interrupt for COMPARE[4] event */ #define TIMER_INTENSET_COMPARE4_Pos (20UL) /*!< Position of COMPARE4 field. */ #define TIMER_INTENSET_COMPARE4_Msk (0x1UL << TIMER_INTENSET_COMPARE4_Pos) /*!< Bit mask of COMPARE4 field. */ #define TIMER_INTENSET_COMPARE4_Disabled (0UL) /*!< Read: Disabled */ #define TIMER_INTENSET_COMPARE4_Enabled (1UL) /*!< Read: Enabled */ #define TIMER_INTENSET_COMPARE4_Set (1UL) /*!< Enable */ -/* Bit 19 : Write '1' to Enable interrupt for COMPARE[3] event */ +/* Bit 19 : Write '1' to enable interrupt for COMPARE[3] event */ #define TIMER_INTENSET_COMPARE3_Pos (19UL) /*!< Position of COMPARE3 field. */ #define TIMER_INTENSET_COMPARE3_Msk (0x1UL << TIMER_INTENSET_COMPARE3_Pos) /*!< Bit mask of COMPARE3 field. */ #define TIMER_INTENSET_COMPARE3_Disabled (0UL) /*!< Read: Disabled */ #define TIMER_INTENSET_COMPARE3_Enabled (1UL) /*!< Read: Enabled */ #define TIMER_INTENSET_COMPARE3_Set (1UL) /*!< Enable */ -/* Bit 18 : Write '1' to Enable interrupt for COMPARE[2] event */ +/* Bit 18 : Write '1' to enable interrupt for COMPARE[2] event */ #define TIMER_INTENSET_COMPARE2_Pos (18UL) /*!< Position of COMPARE2 field. */ #define TIMER_INTENSET_COMPARE2_Msk (0x1UL << TIMER_INTENSET_COMPARE2_Pos) /*!< Bit mask of COMPARE2 field. */ #define TIMER_INTENSET_COMPARE2_Disabled (0UL) /*!< Read: Disabled */ #define TIMER_INTENSET_COMPARE2_Enabled (1UL) /*!< Read: Enabled */ #define TIMER_INTENSET_COMPARE2_Set (1UL) /*!< Enable */ -/* Bit 17 : Write '1' to Enable interrupt for COMPARE[1] event */ +/* Bit 17 : Write '1' to enable interrupt for COMPARE[1] event */ #define TIMER_INTENSET_COMPARE1_Pos (17UL) /*!< Position of COMPARE1 field. */ #define TIMER_INTENSET_COMPARE1_Msk (0x1UL << TIMER_INTENSET_COMPARE1_Pos) /*!< Bit mask of COMPARE1 field. */ #define TIMER_INTENSET_COMPARE1_Disabled (0UL) /*!< Read: Disabled */ #define TIMER_INTENSET_COMPARE1_Enabled (1UL) /*!< Read: Enabled */ #define TIMER_INTENSET_COMPARE1_Set (1UL) /*!< Enable */ -/* Bit 16 : Write '1' to Enable interrupt for COMPARE[0] event */ +/* Bit 16 : Write '1' to enable interrupt for COMPARE[0] event */ #define TIMER_INTENSET_COMPARE0_Pos (16UL) /*!< Position of COMPARE0 field. */ #define TIMER_INTENSET_COMPARE0_Msk (0x1UL << TIMER_INTENSET_COMPARE0_Pos) /*!< Bit mask of COMPARE0 field. */ #define TIMER_INTENSET_COMPARE0_Disabled (0UL) /*!< Read: Disabled */ @@ -11683,42 +13259,42 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: TIMER_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 21 : Write '1' to Disable interrupt for COMPARE[5] event */ +/* Bit 21 : Write '1' to disable interrupt for COMPARE[5] event */ #define TIMER_INTENCLR_COMPARE5_Pos (21UL) /*!< Position of COMPARE5 field. */ #define TIMER_INTENCLR_COMPARE5_Msk (0x1UL << TIMER_INTENCLR_COMPARE5_Pos) /*!< Bit mask of COMPARE5 field. */ #define TIMER_INTENCLR_COMPARE5_Disabled (0UL) /*!< Read: Disabled */ #define TIMER_INTENCLR_COMPARE5_Enabled (1UL) /*!< Read: Enabled */ #define TIMER_INTENCLR_COMPARE5_Clear (1UL) /*!< Disable */ -/* Bit 20 : Write '1' to Disable interrupt for COMPARE[4] event */ +/* Bit 20 : Write '1' to disable interrupt for COMPARE[4] event */ #define TIMER_INTENCLR_COMPARE4_Pos (20UL) /*!< Position of COMPARE4 field. */ #define TIMER_INTENCLR_COMPARE4_Msk (0x1UL << TIMER_INTENCLR_COMPARE4_Pos) /*!< Bit mask of COMPARE4 field. */ #define TIMER_INTENCLR_COMPARE4_Disabled (0UL) /*!< Read: Disabled */ #define TIMER_INTENCLR_COMPARE4_Enabled (1UL) /*!< Read: Enabled */ #define TIMER_INTENCLR_COMPARE4_Clear (1UL) /*!< Disable */ -/* Bit 19 : Write '1' to Disable interrupt for COMPARE[3] event */ +/* Bit 19 : Write '1' to disable interrupt for COMPARE[3] event */ #define TIMER_INTENCLR_COMPARE3_Pos (19UL) /*!< Position of COMPARE3 field. */ #define TIMER_INTENCLR_COMPARE3_Msk (0x1UL << TIMER_INTENCLR_COMPARE3_Pos) /*!< Bit mask of COMPARE3 field. */ #define TIMER_INTENCLR_COMPARE3_Disabled (0UL) /*!< Read: Disabled */ #define TIMER_INTENCLR_COMPARE3_Enabled (1UL) /*!< Read: Enabled */ #define TIMER_INTENCLR_COMPARE3_Clear (1UL) /*!< Disable */ -/* Bit 18 : Write '1' to Disable interrupt for COMPARE[2] event */ +/* Bit 18 : Write '1' to disable interrupt for COMPARE[2] event */ #define TIMER_INTENCLR_COMPARE2_Pos (18UL) /*!< Position of COMPARE2 field. */ #define TIMER_INTENCLR_COMPARE2_Msk (0x1UL << TIMER_INTENCLR_COMPARE2_Pos) /*!< Bit mask of COMPARE2 field. */ #define TIMER_INTENCLR_COMPARE2_Disabled (0UL) /*!< Read: Disabled */ #define TIMER_INTENCLR_COMPARE2_Enabled (1UL) /*!< Read: Enabled */ #define TIMER_INTENCLR_COMPARE2_Clear (1UL) /*!< Disable */ -/* Bit 17 : Write '1' to Disable interrupt for COMPARE[1] event */ +/* Bit 17 : Write '1' to disable interrupt for COMPARE[1] event */ #define TIMER_INTENCLR_COMPARE1_Pos (17UL) /*!< Position of COMPARE1 field. */ #define TIMER_INTENCLR_COMPARE1_Msk (0x1UL << TIMER_INTENCLR_COMPARE1_Pos) /*!< Bit mask of COMPARE1 field. */ #define TIMER_INTENCLR_COMPARE1_Disabled (0UL) /*!< Read: Disabled */ #define TIMER_INTENCLR_COMPARE1_Enabled (1UL) /*!< Read: Enabled */ #define TIMER_INTENCLR_COMPARE1_Clear (1UL) /*!< Disable */ -/* Bit 16 : Write '1' to Disable interrupt for COMPARE[0] event */ +/* Bit 16 : Write '1' to disable interrupt for COMPARE[0] event */ #define TIMER_INTENCLR_COMPARE0_Pos (16UL) /*!< Position of COMPARE0 field. */ #define TIMER_INTENCLR_COMPARE0_Msk (0x1UL << TIMER_INTENCLR_COMPARE0_Pos) /*!< Bit mask of COMPARE0 field. */ #define TIMER_INTENCLR_COMPARE0_Disabled (0UL) /*!< Read: Disabled */ @@ -11754,7 +13330,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define TIMER_PRESCALER_PRESCALER_Msk (0xFUL << TIMER_PRESCALER_PRESCALER_Pos) /*!< Bit mask of PRESCALER field. */ /* Register: TIMER_CC */ -/* Description: Description collection[0]: Capture/Compare register 0 */ +/* Description: Description collection[n]: Capture/Compare register n */ /* Bits 31..0 : Capture/Compare value */ #define TIMER_CC_CC_Pos (0UL) /*!< Position of CC field. */ @@ -11764,6 +13340,83 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: TWI */ /* Description: I2C compatible Two-Wire Interface 0 */ +/* Register: TWI_TASKS_STARTRX */ +/* Description: Start TWI receive sequence */ + +/* Bit 0 : */ +#define TWI_TASKS_STARTRX_TASKS_STARTRX_Pos (0UL) /*!< Position of TASKS_STARTRX field. */ +#define TWI_TASKS_STARTRX_TASKS_STARTRX_Msk (0x1UL << TWI_TASKS_STARTRX_TASKS_STARTRX_Pos) /*!< Bit mask of TASKS_STARTRX field. */ + +/* Register: TWI_TASKS_STARTTX */ +/* Description: Start TWI transmit sequence */ + +/* Bit 0 : */ +#define TWI_TASKS_STARTTX_TASKS_STARTTX_Pos (0UL) /*!< Position of TASKS_STARTTX field. */ +#define TWI_TASKS_STARTTX_TASKS_STARTTX_Msk (0x1UL << TWI_TASKS_STARTTX_TASKS_STARTTX_Pos) /*!< Bit mask of TASKS_STARTTX field. */ + +/* Register: TWI_TASKS_STOP */ +/* Description: Stop TWI transaction */ + +/* Bit 0 : */ +#define TWI_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define TWI_TASKS_STOP_TASKS_STOP_Msk (0x1UL << TWI_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: TWI_TASKS_SUSPEND */ +/* Description: Suspend TWI transaction */ + +/* Bit 0 : */ +#define TWI_TASKS_SUSPEND_TASKS_SUSPEND_Pos (0UL) /*!< Position of TASKS_SUSPEND field. */ +#define TWI_TASKS_SUSPEND_TASKS_SUSPEND_Msk (0x1UL << TWI_TASKS_SUSPEND_TASKS_SUSPEND_Pos) /*!< Bit mask of TASKS_SUSPEND field. */ + +/* Register: TWI_TASKS_RESUME */ +/* Description: Resume TWI transaction */ + +/* Bit 0 : */ +#define TWI_TASKS_RESUME_TASKS_RESUME_Pos (0UL) /*!< Position of TASKS_RESUME field. */ +#define TWI_TASKS_RESUME_TASKS_RESUME_Msk (0x1UL << TWI_TASKS_RESUME_TASKS_RESUME_Pos) /*!< Bit mask of TASKS_RESUME field. */ + +/* Register: TWI_EVENTS_STOPPED */ +/* Description: TWI stopped */ + +/* Bit 0 : */ +#define TWI_EVENTS_STOPPED_EVENTS_STOPPED_Pos (0UL) /*!< Position of EVENTS_STOPPED field. */ +#define TWI_EVENTS_STOPPED_EVENTS_STOPPED_Msk (0x1UL << TWI_EVENTS_STOPPED_EVENTS_STOPPED_Pos) /*!< Bit mask of EVENTS_STOPPED field. */ + +/* Register: TWI_EVENTS_RXDREADY */ +/* Description: TWI RXD byte received */ + +/* Bit 0 : */ +#define TWI_EVENTS_RXDREADY_EVENTS_RXDREADY_Pos (0UL) /*!< Position of EVENTS_RXDREADY field. */ +#define TWI_EVENTS_RXDREADY_EVENTS_RXDREADY_Msk (0x1UL << TWI_EVENTS_RXDREADY_EVENTS_RXDREADY_Pos) /*!< Bit mask of EVENTS_RXDREADY field. */ + +/* Register: TWI_EVENTS_TXDSENT */ +/* Description: TWI TXD byte sent */ + +/* Bit 0 : */ +#define TWI_EVENTS_TXDSENT_EVENTS_TXDSENT_Pos (0UL) /*!< Position of EVENTS_TXDSENT field. */ +#define TWI_EVENTS_TXDSENT_EVENTS_TXDSENT_Msk (0x1UL << TWI_EVENTS_TXDSENT_EVENTS_TXDSENT_Pos) /*!< Bit mask of EVENTS_TXDSENT field. */ + +/* Register: TWI_EVENTS_ERROR */ +/* Description: TWI error */ + +/* Bit 0 : */ +#define TWI_EVENTS_ERROR_EVENTS_ERROR_Pos (0UL) /*!< Position of EVENTS_ERROR field. */ +#define TWI_EVENTS_ERROR_EVENTS_ERROR_Msk (0x1UL << TWI_EVENTS_ERROR_EVENTS_ERROR_Pos) /*!< Bit mask of EVENTS_ERROR field. */ + +/* Register: TWI_EVENTS_BB */ +/* Description: TWI byte boundary, generated before each byte that is sent or received */ + +/* Bit 0 : */ +#define TWI_EVENTS_BB_EVENTS_BB_Pos (0UL) /*!< Position of EVENTS_BB field. */ +#define TWI_EVENTS_BB_EVENTS_BB_Msk (0x1UL << TWI_EVENTS_BB_EVENTS_BB_Pos) /*!< Bit mask of EVENTS_BB field. */ + +/* Register: TWI_EVENTS_SUSPENDED */ +/* Description: TWI entered the suspended state */ + +/* Bit 0 : */ +#define TWI_EVENTS_SUSPENDED_EVENTS_SUSPENDED_Pos (0UL) /*!< Position of EVENTS_SUSPENDED field. */ +#define TWI_EVENTS_SUSPENDED_EVENTS_SUSPENDED_Msk (0x1UL << TWI_EVENTS_SUSPENDED_EVENTS_SUSPENDED_Pos) /*!< Bit mask of EVENTS_SUSPENDED field. */ + /* Register: TWI_SHORTS */ /* Description: Shortcut register */ @@ -11782,42 +13435,42 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: TWI_INTENSET */ /* Description: Enable interrupt */ -/* Bit 18 : Write '1' to Enable interrupt for SUSPENDED event */ +/* Bit 18 : Write '1' to enable interrupt for SUSPENDED event */ #define TWI_INTENSET_SUSPENDED_Pos (18UL) /*!< Position of SUSPENDED field. */ #define TWI_INTENSET_SUSPENDED_Msk (0x1UL << TWI_INTENSET_SUSPENDED_Pos) /*!< Bit mask of SUSPENDED field. */ #define TWI_INTENSET_SUSPENDED_Disabled (0UL) /*!< Read: Disabled */ #define TWI_INTENSET_SUSPENDED_Enabled (1UL) /*!< Read: Enabled */ #define TWI_INTENSET_SUSPENDED_Set (1UL) /*!< Enable */ -/* Bit 14 : Write '1' to Enable interrupt for BB event */ +/* Bit 14 : Write '1' to enable interrupt for BB event */ #define TWI_INTENSET_BB_Pos (14UL) /*!< Position of BB field. */ #define TWI_INTENSET_BB_Msk (0x1UL << TWI_INTENSET_BB_Pos) /*!< Bit mask of BB field. */ #define TWI_INTENSET_BB_Disabled (0UL) /*!< Read: Disabled */ #define TWI_INTENSET_BB_Enabled (1UL) /*!< Read: Enabled */ #define TWI_INTENSET_BB_Set (1UL) /*!< Enable */ -/* Bit 9 : Write '1' to Enable interrupt for ERROR event */ +/* Bit 9 : Write '1' to enable interrupt for ERROR event */ #define TWI_INTENSET_ERROR_Pos (9UL) /*!< Position of ERROR field. */ #define TWI_INTENSET_ERROR_Msk (0x1UL << TWI_INTENSET_ERROR_Pos) /*!< Bit mask of ERROR field. */ #define TWI_INTENSET_ERROR_Disabled (0UL) /*!< Read: Disabled */ #define TWI_INTENSET_ERROR_Enabled (1UL) /*!< Read: Enabled */ #define TWI_INTENSET_ERROR_Set (1UL) /*!< Enable */ -/* Bit 7 : Write '1' to Enable interrupt for TXDSENT event */ +/* Bit 7 : Write '1' to enable interrupt for TXDSENT event */ #define TWI_INTENSET_TXDSENT_Pos (7UL) /*!< Position of TXDSENT field. */ #define TWI_INTENSET_TXDSENT_Msk (0x1UL << TWI_INTENSET_TXDSENT_Pos) /*!< Bit mask of TXDSENT field. */ #define TWI_INTENSET_TXDSENT_Disabled (0UL) /*!< Read: Disabled */ #define TWI_INTENSET_TXDSENT_Enabled (1UL) /*!< Read: Enabled */ #define TWI_INTENSET_TXDSENT_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for RXDREADY event */ +/* Bit 2 : Write '1' to enable interrupt for RXDREADY event */ #define TWI_INTENSET_RXDREADY_Pos (2UL) /*!< Position of RXDREADY field. */ #define TWI_INTENSET_RXDREADY_Msk (0x1UL << TWI_INTENSET_RXDREADY_Pos) /*!< Bit mask of RXDREADY field. */ #define TWI_INTENSET_RXDREADY_Disabled (0UL) /*!< Read: Disabled */ #define TWI_INTENSET_RXDREADY_Enabled (1UL) /*!< Read: Enabled */ #define TWI_INTENSET_RXDREADY_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for STOPPED event */ +/* Bit 1 : Write '1' to enable interrupt for STOPPED event */ #define TWI_INTENSET_STOPPED_Pos (1UL) /*!< Position of STOPPED field. */ #define TWI_INTENSET_STOPPED_Msk (0x1UL << TWI_INTENSET_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define TWI_INTENSET_STOPPED_Disabled (0UL) /*!< Read: Disabled */ @@ -11827,42 +13480,42 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: TWI_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 18 : Write '1' to Disable interrupt for SUSPENDED event */ +/* Bit 18 : Write '1' to disable interrupt for SUSPENDED event */ #define TWI_INTENCLR_SUSPENDED_Pos (18UL) /*!< Position of SUSPENDED field. */ #define TWI_INTENCLR_SUSPENDED_Msk (0x1UL << TWI_INTENCLR_SUSPENDED_Pos) /*!< Bit mask of SUSPENDED field. */ #define TWI_INTENCLR_SUSPENDED_Disabled (0UL) /*!< Read: Disabled */ #define TWI_INTENCLR_SUSPENDED_Enabled (1UL) /*!< Read: Enabled */ #define TWI_INTENCLR_SUSPENDED_Clear (1UL) /*!< Disable */ -/* Bit 14 : Write '1' to Disable interrupt for BB event */ +/* Bit 14 : Write '1' to disable interrupt for BB event */ #define TWI_INTENCLR_BB_Pos (14UL) /*!< Position of BB field. */ #define TWI_INTENCLR_BB_Msk (0x1UL << TWI_INTENCLR_BB_Pos) /*!< Bit mask of BB field. */ #define TWI_INTENCLR_BB_Disabled (0UL) /*!< Read: Disabled */ #define TWI_INTENCLR_BB_Enabled (1UL) /*!< Read: Enabled */ #define TWI_INTENCLR_BB_Clear (1UL) /*!< Disable */ -/* Bit 9 : Write '1' to Disable interrupt for ERROR event */ +/* Bit 9 : Write '1' to disable interrupt for ERROR event */ #define TWI_INTENCLR_ERROR_Pos (9UL) /*!< Position of ERROR field. */ #define TWI_INTENCLR_ERROR_Msk (0x1UL << TWI_INTENCLR_ERROR_Pos) /*!< Bit mask of ERROR field. */ #define TWI_INTENCLR_ERROR_Disabled (0UL) /*!< Read: Disabled */ #define TWI_INTENCLR_ERROR_Enabled (1UL) /*!< Read: Enabled */ #define TWI_INTENCLR_ERROR_Clear (1UL) /*!< Disable */ -/* Bit 7 : Write '1' to Disable interrupt for TXDSENT event */ +/* Bit 7 : Write '1' to disable interrupt for TXDSENT event */ #define TWI_INTENCLR_TXDSENT_Pos (7UL) /*!< Position of TXDSENT field. */ #define TWI_INTENCLR_TXDSENT_Msk (0x1UL << TWI_INTENCLR_TXDSENT_Pos) /*!< Bit mask of TXDSENT field. */ #define TWI_INTENCLR_TXDSENT_Disabled (0UL) /*!< Read: Disabled */ #define TWI_INTENCLR_TXDSENT_Enabled (1UL) /*!< Read: Enabled */ #define TWI_INTENCLR_TXDSENT_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for RXDREADY event */ +/* Bit 2 : Write '1' to disable interrupt for RXDREADY event */ #define TWI_INTENCLR_RXDREADY_Pos (2UL) /*!< Position of RXDREADY field. */ #define TWI_INTENCLR_RXDREADY_Msk (0x1UL << TWI_INTENCLR_RXDREADY_Pos) /*!< Bit mask of RXDREADY field. */ #define TWI_INTENCLR_RXDREADY_Disabled (0UL) /*!< Read: Disabled */ #define TWI_INTENCLR_RXDREADY_Enabled (1UL) /*!< Read: Enabled */ #define TWI_INTENCLR_RXDREADY_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for STOPPED event */ +/* Bit 1 : Write '1' to disable interrupt for STOPPED event */ #define TWI_INTENCLR_STOPPED_Pos (1UL) /*!< Position of STOPPED field. */ #define TWI_INTENCLR_STOPPED_Msk (0x1UL << TWI_INTENCLR_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define TWI_INTENCLR_STOPPED_Disabled (0UL) /*!< Read: Disabled */ @@ -11968,6 +13621,90 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: TWIM */ /* Description: I2C compatible Two-Wire Master Interface with EasyDMA 0 */ +/* Register: TWIM_TASKS_STARTRX */ +/* Description: Start TWI receive sequence */ + +/* Bit 0 : */ +#define TWIM_TASKS_STARTRX_TASKS_STARTRX_Pos (0UL) /*!< Position of TASKS_STARTRX field. */ +#define TWIM_TASKS_STARTRX_TASKS_STARTRX_Msk (0x1UL << TWIM_TASKS_STARTRX_TASKS_STARTRX_Pos) /*!< Bit mask of TASKS_STARTRX field. */ + +/* Register: TWIM_TASKS_STARTTX */ +/* Description: Start TWI transmit sequence */ + +/* Bit 0 : */ +#define TWIM_TASKS_STARTTX_TASKS_STARTTX_Pos (0UL) /*!< Position of TASKS_STARTTX field. */ +#define TWIM_TASKS_STARTTX_TASKS_STARTTX_Msk (0x1UL << TWIM_TASKS_STARTTX_TASKS_STARTTX_Pos) /*!< Bit mask of TASKS_STARTTX field. */ + +/* Register: TWIM_TASKS_STOP */ +/* Description: Stop TWI transaction. Must be issued while the TWI master is not suspended. */ + +/* Bit 0 : */ +#define TWIM_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define TWIM_TASKS_STOP_TASKS_STOP_Msk (0x1UL << TWIM_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: TWIM_TASKS_SUSPEND */ +/* Description: Suspend TWI transaction */ + +/* Bit 0 : */ +#define TWIM_TASKS_SUSPEND_TASKS_SUSPEND_Pos (0UL) /*!< Position of TASKS_SUSPEND field. */ +#define TWIM_TASKS_SUSPEND_TASKS_SUSPEND_Msk (0x1UL << TWIM_TASKS_SUSPEND_TASKS_SUSPEND_Pos) /*!< Bit mask of TASKS_SUSPEND field. */ + +/* Register: TWIM_TASKS_RESUME */ +/* Description: Resume TWI transaction */ + +/* Bit 0 : */ +#define TWIM_TASKS_RESUME_TASKS_RESUME_Pos (0UL) /*!< Position of TASKS_RESUME field. */ +#define TWIM_TASKS_RESUME_TASKS_RESUME_Msk (0x1UL << TWIM_TASKS_RESUME_TASKS_RESUME_Pos) /*!< Bit mask of TASKS_RESUME field. */ + +/* Register: TWIM_EVENTS_STOPPED */ +/* Description: TWI stopped */ + +/* Bit 0 : */ +#define TWIM_EVENTS_STOPPED_EVENTS_STOPPED_Pos (0UL) /*!< Position of EVENTS_STOPPED field. */ +#define TWIM_EVENTS_STOPPED_EVENTS_STOPPED_Msk (0x1UL << TWIM_EVENTS_STOPPED_EVENTS_STOPPED_Pos) /*!< Bit mask of EVENTS_STOPPED field. */ + +/* Register: TWIM_EVENTS_ERROR */ +/* Description: TWI error */ + +/* Bit 0 : */ +#define TWIM_EVENTS_ERROR_EVENTS_ERROR_Pos (0UL) /*!< Position of EVENTS_ERROR field. */ +#define TWIM_EVENTS_ERROR_EVENTS_ERROR_Msk (0x1UL << TWIM_EVENTS_ERROR_EVENTS_ERROR_Pos) /*!< Bit mask of EVENTS_ERROR field. */ + +/* Register: TWIM_EVENTS_SUSPENDED */ +/* Description: Last byte has been sent out after the SUSPEND task has been issued, TWI traffic is now suspended. */ + +/* Bit 0 : */ +#define TWIM_EVENTS_SUSPENDED_EVENTS_SUSPENDED_Pos (0UL) /*!< Position of EVENTS_SUSPENDED field. */ +#define TWIM_EVENTS_SUSPENDED_EVENTS_SUSPENDED_Msk (0x1UL << TWIM_EVENTS_SUSPENDED_EVENTS_SUSPENDED_Pos) /*!< Bit mask of EVENTS_SUSPENDED field. */ + +/* Register: TWIM_EVENTS_RXSTARTED */ +/* Description: Receive sequence started */ + +/* Bit 0 : */ +#define TWIM_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Pos (0UL) /*!< Position of EVENTS_RXSTARTED field. */ +#define TWIM_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Msk (0x1UL << TWIM_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Pos) /*!< Bit mask of EVENTS_RXSTARTED field. */ + +/* Register: TWIM_EVENTS_TXSTARTED */ +/* Description: Transmit sequence started */ + +/* Bit 0 : */ +#define TWIM_EVENTS_TXSTARTED_EVENTS_TXSTARTED_Pos (0UL) /*!< Position of EVENTS_TXSTARTED field. */ +#define TWIM_EVENTS_TXSTARTED_EVENTS_TXSTARTED_Msk (0x1UL << TWIM_EVENTS_TXSTARTED_EVENTS_TXSTARTED_Pos) /*!< Bit mask of EVENTS_TXSTARTED field. */ + +/* Register: TWIM_EVENTS_LASTRX */ +/* Description: Byte boundary, starting to receive the last byte */ + +/* Bit 0 : */ +#define TWIM_EVENTS_LASTRX_EVENTS_LASTRX_Pos (0UL) /*!< Position of EVENTS_LASTRX field. */ +#define TWIM_EVENTS_LASTRX_EVENTS_LASTRX_Msk (0x1UL << TWIM_EVENTS_LASTRX_EVENTS_LASTRX_Pos) /*!< Bit mask of EVENTS_LASTRX field. */ + +/* Register: TWIM_EVENTS_LASTTX */ +/* Description: Byte boundary, starting to transmit the last byte */ + +/* Bit 0 : */ +#define TWIM_EVENTS_LASTTX_EVENTS_LASTTX_Pos (0UL) /*!< Position of EVENTS_LASTTX field. */ +#define TWIM_EVENTS_LASTTX_EVENTS_LASTTX_Msk (0x1UL << TWIM_EVENTS_LASTTX_EVENTS_LASTTX_Pos) /*!< Bit mask of EVENTS_LASTTX field. */ + /* Register: TWIM_SHORTS */ /* Description: Shortcut register */ @@ -11977,6 +13714,12 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define TWIM_SHORTS_LASTRX_STOP_Disabled (0UL) /*!< Disable shortcut */ #define TWIM_SHORTS_LASTRX_STOP_Enabled (1UL) /*!< Enable shortcut */ +/* Bit 11 : Shortcut between LASTRX event and SUSPEND task */ +#define TWIM_SHORTS_LASTRX_SUSPEND_Pos (11UL) /*!< Position of LASTRX_SUSPEND field. */ +#define TWIM_SHORTS_LASTRX_SUSPEND_Msk (0x1UL << TWIM_SHORTS_LASTRX_SUSPEND_Pos) /*!< Bit mask of LASTRX_SUSPEND field. */ +#define TWIM_SHORTS_LASTRX_SUSPEND_Disabled (0UL) /*!< Disable shortcut */ +#define TWIM_SHORTS_LASTRX_SUSPEND_Enabled (1UL) /*!< Enable shortcut */ + /* Bit 10 : Shortcut between LASTRX event and STARTTX task */ #define TWIM_SHORTS_LASTRX_STARTTX_Pos (10UL) /*!< Position of LASTRX_STARTTX field. */ #define TWIM_SHORTS_LASTRX_STARTTX_Msk (0x1UL << TWIM_SHORTS_LASTRX_STARTTX_Pos) /*!< Bit mask of LASTRX_STARTTX field. */ @@ -12049,49 +13792,49 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: TWIM_INTENSET */ /* Description: Enable interrupt */ -/* Bit 24 : Write '1' to Enable interrupt for LASTTX event */ +/* Bit 24 : Write '1' to enable interrupt for LASTTX event */ #define TWIM_INTENSET_LASTTX_Pos (24UL) /*!< Position of LASTTX field. */ #define TWIM_INTENSET_LASTTX_Msk (0x1UL << TWIM_INTENSET_LASTTX_Pos) /*!< Bit mask of LASTTX field. */ #define TWIM_INTENSET_LASTTX_Disabled (0UL) /*!< Read: Disabled */ #define TWIM_INTENSET_LASTTX_Enabled (1UL) /*!< Read: Enabled */ #define TWIM_INTENSET_LASTTX_Set (1UL) /*!< Enable */ -/* Bit 23 : Write '1' to Enable interrupt for LASTRX event */ +/* Bit 23 : Write '1' to enable interrupt for LASTRX event */ #define TWIM_INTENSET_LASTRX_Pos (23UL) /*!< Position of LASTRX field. */ #define TWIM_INTENSET_LASTRX_Msk (0x1UL << TWIM_INTENSET_LASTRX_Pos) /*!< Bit mask of LASTRX field. */ #define TWIM_INTENSET_LASTRX_Disabled (0UL) /*!< Read: Disabled */ #define TWIM_INTENSET_LASTRX_Enabled (1UL) /*!< Read: Enabled */ #define TWIM_INTENSET_LASTRX_Set (1UL) /*!< Enable */ -/* Bit 20 : Write '1' to Enable interrupt for TXSTARTED event */ +/* Bit 20 : Write '1' to enable interrupt for TXSTARTED event */ #define TWIM_INTENSET_TXSTARTED_Pos (20UL) /*!< Position of TXSTARTED field. */ #define TWIM_INTENSET_TXSTARTED_Msk (0x1UL << TWIM_INTENSET_TXSTARTED_Pos) /*!< Bit mask of TXSTARTED field. */ #define TWIM_INTENSET_TXSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define TWIM_INTENSET_TXSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define TWIM_INTENSET_TXSTARTED_Set (1UL) /*!< Enable */ -/* Bit 19 : Write '1' to Enable interrupt for RXSTARTED event */ +/* Bit 19 : Write '1' to enable interrupt for RXSTARTED event */ #define TWIM_INTENSET_RXSTARTED_Pos (19UL) /*!< Position of RXSTARTED field. */ #define TWIM_INTENSET_RXSTARTED_Msk (0x1UL << TWIM_INTENSET_RXSTARTED_Pos) /*!< Bit mask of RXSTARTED field. */ #define TWIM_INTENSET_RXSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define TWIM_INTENSET_RXSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define TWIM_INTENSET_RXSTARTED_Set (1UL) /*!< Enable */ -/* Bit 18 : Write '1' to Enable interrupt for SUSPENDED event */ +/* Bit 18 : Write '1' to enable interrupt for SUSPENDED event */ #define TWIM_INTENSET_SUSPENDED_Pos (18UL) /*!< Position of SUSPENDED field. */ #define TWIM_INTENSET_SUSPENDED_Msk (0x1UL << TWIM_INTENSET_SUSPENDED_Pos) /*!< Bit mask of SUSPENDED field. */ #define TWIM_INTENSET_SUSPENDED_Disabled (0UL) /*!< Read: Disabled */ #define TWIM_INTENSET_SUSPENDED_Enabled (1UL) /*!< Read: Enabled */ #define TWIM_INTENSET_SUSPENDED_Set (1UL) /*!< Enable */ -/* Bit 9 : Write '1' to Enable interrupt for ERROR event */ +/* Bit 9 : Write '1' to enable interrupt for ERROR event */ #define TWIM_INTENSET_ERROR_Pos (9UL) /*!< Position of ERROR field. */ #define TWIM_INTENSET_ERROR_Msk (0x1UL << TWIM_INTENSET_ERROR_Pos) /*!< Bit mask of ERROR field. */ #define TWIM_INTENSET_ERROR_Disabled (0UL) /*!< Read: Disabled */ #define TWIM_INTENSET_ERROR_Enabled (1UL) /*!< Read: Enabled */ #define TWIM_INTENSET_ERROR_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for STOPPED event */ +/* Bit 1 : Write '1' to enable interrupt for STOPPED event */ #define TWIM_INTENSET_STOPPED_Pos (1UL) /*!< Position of STOPPED field. */ #define TWIM_INTENSET_STOPPED_Msk (0x1UL << TWIM_INTENSET_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define TWIM_INTENSET_STOPPED_Disabled (0UL) /*!< Read: Disabled */ @@ -12101,49 +13844,49 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: TWIM_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 24 : Write '1' to Disable interrupt for LASTTX event */ +/* Bit 24 : Write '1' to disable interrupt for LASTTX event */ #define TWIM_INTENCLR_LASTTX_Pos (24UL) /*!< Position of LASTTX field. */ #define TWIM_INTENCLR_LASTTX_Msk (0x1UL << TWIM_INTENCLR_LASTTX_Pos) /*!< Bit mask of LASTTX field. */ #define TWIM_INTENCLR_LASTTX_Disabled (0UL) /*!< Read: Disabled */ #define TWIM_INTENCLR_LASTTX_Enabled (1UL) /*!< Read: Enabled */ #define TWIM_INTENCLR_LASTTX_Clear (1UL) /*!< Disable */ -/* Bit 23 : Write '1' to Disable interrupt for LASTRX event */ +/* Bit 23 : Write '1' to disable interrupt for LASTRX event */ #define TWIM_INTENCLR_LASTRX_Pos (23UL) /*!< Position of LASTRX field. */ #define TWIM_INTENCLR_LASTRX_Msk (0x1UL << TWIM_INTENCLR_LASTRX_Pos) /*!< Bit mask of LASTRX field. */ #define TWIM_INTENCLR_LASTRX_Disabled (0UL) /*!< Read: Disabled */ #define TWIM_INTENCLR_LASTRX_Enabled (1UL) /*!< Read: Enabled */ #define TWIM_INTENCLR_LASTRX_Clear (1UL) /*!< Disable */ -/* Bit 20 : Write '1' to Disable interrupt for TXSTARTED event */ +/* Bit 20 : Write '1' to disable interrupt for TXSTARTED event */ #define TWIM_INTENCLR_TXSTARTED_Pos (20UL) /*!< Position of TXSTARTED field. */ #define TWIM_INTENCLR_TXSTARTED_Msk (0x1UL << TWIM_INTENCLR_TXSTARTED_Pos) /*!< Bit mask of TXSTARTED field. */ #define TWIM_INTENCLR_TXSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define TWIM_INTENCLR_TXSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define TWIM_INTENCLR_TXSTARTED_Clear (1UL) /*!< Disable */ -/* Bit 19 : Write '1' to Disable interrupt for RXSTARTED event */ +/* Bit 19 : Write '1' to disable interrupt for RXSTARTED event */ #define TWIM_INTENCLR_RXSTARTED_Pos (19UL) /*!< Position of RXSTARTED field. */ #define TWIM_INTENCLR_RXSTARTED_Msk (0x1UL << TWIM_INTENCLR_RXSTARTED_Pos) /*!< Bit mask of RXSTARTED field. */ #define TWIM_INTENCLR_RXSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define TWIM_INTENCLR_RXSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define TWIM_INTENCLR_RXSTARTED_Clear (1UL) /*!< Disable */ -/* Bit 18 : Write '1' to Disable interrupt for SUSPENDED event */ +/* Bit 18 : Write '1' to disable interrupt for SUSPENDED event */ #define TWIM_INTENCLR_SUSPENDED_Pos (18UL) /*!< Position of SUSPENDED field. */ #define TWIM_INTENCLR_SUSPENDED_Msk (0x1UL << TWIM_INTENCLR_SUSPENDED_Pos) /*!< Bit mask of SUSPENDED field. */ #define TWIM_INTENCLR_SUSPENDED_Disabled (0UL) /*!< Read: Disabled */ #define TWIM_INTENCLR_SUSPENDED_Enabled (1UL) /*!< Read: Enabled */ #define TWIM_INTENCLR_SUSPENDED_Clear (1UL) /*!< Disable */ -/* Bit 9 : Write '1' to Disable interrupt for ERROR event */ +/* Bit 9 : Write '1' to disable interrupt for ERROR event */ #define TWIM_INTENCLR_ERROR_Pos (9UL) /*!< Position of ERROR field. */ #define TWIM_INTENCLR_ERROR_Msk (0x1UL << TWIM_INTENCLR_ERROR_Pos) /*!< Bit mask of ERROR field. */ #define TWIM_INTENCLR_ERROR_Disabled (0UL) /*!< Read: Disabled */ #define TWIM_INTENCLR_ERROR_Enabled (1UL) /*!< Read: Enabled */ #define TWIM_INTENCLR_ERROR_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for STOPPED event */ +/* Bit 1 : Write '1' to disable interrupt for STOPPED event */ #define TWIM_INTENCLR_STOPPED_Pos (1UL) /*!< Position of STOPPED field. */ #define TWIM_INTENCLR_STOPPED_Msk (0x1UL << TWIM_INTENCLR_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define TWIM_INTENCLR_STOPPED_Disabled (0UL) /*!< Read: Disabled */ @@ -12295,6 +14038,83 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: TWIS */ /* Description: I2C compatible Two-Wire Slave Interface with EasyDMA 0 */ +/* Register: TWIS_TASKS_STOP */ +/* Description: Stop TWI transaction */ + +/* Bit 0 : */ +#define TWIS_TASKS_STOP_TASKS_STOP_Pos (0UL) /*!< Position of TASKS_STOP field. */ +#define TWIS_TASKS_STOP_TASKS_STOP_Msk (0x1UL << TWIS_TASKS_STOP_TASKS_STOP_Pos) /*!< Bit mask of TASKS_STOP field. */ + +/* Register: TWIS_TASKS_SUSPEND */ +/* Description: Suspend TWI transaction */ + +/* Bit 0 : */ +#define TWIS_TASKS_SUSPEND_TASKS_SUSPEND_Pos (0UL) /*!< Position of TASKS_SUSPEND field. */ +#define TWIS_TASKS_SUSPEND_TASKS_SUSPEND_Msk (0x1UL << TWIS_TASKS_SUSPEND_TASKS_SUSPEND_Pos) /*!< Bit mask of TASKS_SUSPEND field. */ + +/* Register: TWIS_TASKS_RESUME */ +/* Description: Resume TWI transaction */ + +/* Bit 0 : */ +#define TWIS_TASKS_RESUME_TASKS_RESUME_Pos (0UL) /*!< Position of TASKS_RESUME field. */ +#define TWIS_TASKS_RESUME_TASKS_RESUME_Msk (0x1UL << TWIS_TASKS_RESUME_TASKS_RESUME_Pos) /*!< Bit mask of TASKS_RESUME field. */ + +/* Register: TWIS_TASKS_PREPARERX */ +/* Description: Prepare the TWI slave to respond to a write command */ + +/* Bit 0 : */ +#define TWIS_TASKS_PREPARERX_TASKS_PREPARERX_Pos (0UL) /*!< Position of TASKS_PREPARERX field. */ +#define TWIS_TASKS_PREPARERX_TASKS_PREPARERX_Msk (0x1UL << TWIS_TASKS_PREPARERX_TASKS_PREPARERX_Pos) /*!< Bit mask of TASKS_PREPARERX field. */ + +/* Register: TWIS_TASKS_PREPARETX */ +/* Description: Prepare the TWI slave to respond to a read command */ + +/* Bit 0 : */ +#define TWIS_TASKS_PREPARETX_TASKS_PREPARETX_Pos (0UL) /*!< Position of TASKS_PREPARETX field. */ +#define TWIS_TASKS_PREPARETX_TASKS_PREPARETX_Msk (0x1UL << TWIS_TASKS_PREPARETX_TASKS_PREPARETX_Pos) /*!< Bit mask of TASKS_PREPARETX field. */ + +/* Register: TWIS_EVENTS_STOPPED */ +/* Description: TWI stopped */ + +/* Bit 0 : */ +#define TWIS_EVENTS_STOPPED_EVENTS_STOPPED_Pos (0UL) /*!< Position of EVENTS_STOPPED field. */ +#define TWIS_EVENTS_STOPPED_EVENTS_STOPPED_Msk (0x1UL << TWIS_EVENTS_STOPPED_EVENTS_STOPPED_Pos) /*!< Bit mask of EVENTS_STOPPED field. */ + +/* Register: TWIS_EVENTS_ERROR */ +/* Description: TWI error */ + +/* Bit 0 : */ +#define TWIS_EVENTS_ERROR_EVENTS_ERROR_Pos (0UL) /*!< Position of EVENTS_ERROR field. */ +#define TWIS_EVENTS_ERROR_EVENTS_ERROR_Msk (0x1UL << TWIS_EVENTS_ERROR_EVENTS_ERROR_Pos) /*!< Bit mask of EVENTS_ERROR field. */ + +/* Register: TWIS_EVENTS_RXSTARTED */ +/* Description: Receive sequence started */ + +/* Bit 0 : */ +#define TWIS_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Pos (0UL) /*!< Position of EVENTS_RXSTARTED field. */ +#define TWIS_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Msk (0x1UL << TWIS_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Pos) /*!< Bit mask of EVENTS_RXSTARTED field. */ + +/* Register: TWIS_EVENTS_TXSTARTED */ +/* Description: Transmit sequence started */ + +/* Bit 0 : */ +#define TWIS_EVENTS_TXSTARTED_EVENTS_TXSTARTED_Pos (0UL) /*!< Position of EVENTS_TXSTARTED field. */ +#define TWIS_EVENTS_TXSTARTED_EVENTS_TXSTARTED_Msk (0x1UL << TWIS_EVENTS_TXSTARTED_EVENTS_TXSTARTED_Pos) /*!< Bit mask of EVENTS_TXSTARTED field. */ + +/* Register: TWIS_EVENTS_WRITE */ +/* Description: Write command received */ + +/* Bit 0 : */ +#define TWIS_EVENTS_WRITE_EVENTS_WRITE_Pos (0UL) /*!< Position of EVENTS_WRITE field. */ +#define TWIS_EVENTS_WRITE_EVENTS_WRITE_Msk (0x1UL << TWIS_EVENTS_WRITE_EVENTS_WRITE_Pos) /*!< Bit mask of EVENTS_WRITE field. */ + +/* Register: TWIS_EVENTS_READ */ +/* Description: Read command received */ + +/* Bit 0 : */ +#define TWIS_EVENTS_READ_EVENTS_READ_Pos (0UL) /*!< Position of EVENTS_READ field. */ +#define TWIS_EVENTS_READ_EVENTS_READ_Msk (0x1UL << TWIS_EVENTS_READ_EVENTS_READ_Pos) /*!< Bit mask of EVENTS_READ field. */ + /* Register: TWIS_SHORTS */ /* Description: Shortcut register */ @@ -12352,42 +14172,42 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: TWIS_INTENSET */ /* Description: Enable interrupt */ -/* Bit 26 : Write '1' to Enable interrupt for READ event */ +/* Bit 26 : Write '1' to enable interrupt for READ event */ #define TWIS_INTENSET_READ_Pos (26UL) /*!< Position of READ field. */ #define TWIS_INTENSET_READ_Msk (0x1UL << TWIS_INTENSET_READ_Pos) /*!< Bit mask of READ field. */ #define TWIS_INTENSET_READ_Disabled (0UL) /*!< Read: Disabled */ #define TWIS_INTENSET_READ_Enabled (1UL) /*!< Read: Enabled */ #define TWIS_INTENSET_READ_Set (1UL) /*!< Enable */ -/* Bit 25 : Write '1' to Enable interrupt for WRITE event */ +/* Bit 25 : Write '1' to enable interrupt for WRITE event */ #define TWIS_INTENSET_WRITE_Pos (25UL) /*!< Position of WRITE field. */ #define TWIS_INTENSET_WRITE_Msk (0x1UL << TWIS_INTENSET_WRITE_Pos) /*!< Bit mask of WRITE field. */ #define TWIS_INTENSET_WRITE_Disabled (0UL) /*!< Read: Disabled */ #define TWIS_INTENSET_WRITE_Enabled (1UL) /*!< Read: Enabled */ #define TWIS_INTENSET_WRITE_Set (1UL) /*!< Enable */ -/* Bit 20 : Write '1' to Enable interrupt for TXSTARTED event */ +/* Bit 20 : Write '1' to enable interrupt for TXSTARTED event */ #define TWIS_INTENSET_TXSTARTED_Pos (20UL) /*!< Position of TXSTARTED field. */ #define TWIS_INTENSET_TXSTARTED_Msk (0x1UL << TWIS_INTENSET_TXSTARTED_Pos) /*!< Bit mask of TXSTARTED field. */ #define TWIS_INTENSET_TXSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define TWIS_INTENSET_TXSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define TWIS_INTENSET_TXSTARTED_Set (1UL) /*!< Enable */ -/* Bit 19 : Write '1' to Enable interrupt for RXSTARTED event */ +/* Bit 19 : Write '1' to enable interrupt for RXSTARTED event */ #define TWIS_INTENSET_RXSTARTED_Pos (19UL) /*!< Position of RXSTARTED field. */ #define TWIS_INTENSET_RXSTARTED_Msk (0x1UL << TWIS_INTENSET_RXSTARTED_Pos) /*!< Bit mask of RXSTARTED field. */ #define TWIS_INTENSET_RXSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define TWIS_INTENSET_RXSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define TWIS_INTENSET_RXSTARTED_Set (1UL) /*!< Enable */ -/* Bit 9 : Write '1' to Enable interrupt for ERROR event */ +/* Bit 9 : Write '1' to enable interrupt for ERROR event */ #define TWIS_INTENSET_ERROR_Pos (9UL) /*!< Position of ERROR field. */ #define TWIS_INTENSET_ERROR_Msk (0x1UL << TWIS_INTENSET_ERROR_Pos) /*!< Bit mask of ERROR field. */ #define TWIS_INTENSET_ERROR_Disabled (0UL) /*!< Read: Disabled */ #define TWIS_INTENSET_ERROR_Enabled (1UL) /*!< Read: Enabled */ #define TWIS_INTENSET_ERROR_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for STOPPED event */ +/* Bit 1 : Write '1' to enable interrupt for STOPPED event */ #define TWIS_INTENSET_STOPPED_Pos (1UL) /*!< Position of STOPPED field. */ #define TWIS_INTENSET_STOPPED_Msk (0x1UL << TWIS_INTENSET_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define TWIS_INTENSET_STOPPED_Disabled (0UL) /*!< Read: Disabled */ @@ -12397,42 +14217,42 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: TWIS_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 26 : Write '1' to Disable interrupt for READ event */ +/* Bit 26 : Write '1' to disable interrupt for READ event */ #define TWIS_INTENCLR_READ_Pos (26UL) /*!< Position of READ field. */ #define TWIS_INTENCLR_READ_Msk (0x1UL << TWIS_INTENCLR_READ_Pos) /*!< Bit mask of READ field. */ #define TWIS_INTENCLR_READ_Disabled (0UL) /*!< Read: Disabled */ #define TWIS_INTENCLR_READ_Enabled (1UL) /*!< Read: Enabled */ #define TWIS_INTENCLR_READ_Clear (1UL) /*!< Disable */ -/* Bit 25 : Write '1' to Disable interrupt for WRITE event */ +/* Bit 25 : Write '1' to disable interrupt for WRITE event */ #define TWIS_INTENCLR_WRITE_Pos (25UL) /*!< Position of WRITE field. */ #define TWIS_INTENCLR_WRITE_Msk (0x1UL << TWIS_INTENCLR_WRITE_Pos) /*!< Bit mask of WRITE field. */ #define TWIS_INTENCLR_WRITE_Disabled (0UL) /*!< Read: Disabled */ #define TWIS_INTENCLR_WRITE_Enabled (1UL) /*!< Read: Enabled */ #define TWIS_INTENCLR_WRITE_Clear (1UL) /*!< Disable */ -/* Bit 20 : Write '1' to Disable interrupt for TXSTARTED event */ +/* Bit 20 : Write '1' to disable interrupt for TXSTARTED event */ #define TWIS_INTENCLR_TXSTARTED_Pos (20UL) /*!< Position of TXSTARTED field. */ #define TWIS_INTENCLR_TXSTARTED_Msk (0x1UL << TWIS_INTENCLR_TXSTARTED_Pos) /*!< Bit mask of TXSTARTED field. */ #define TWIS_INTENCLR_TXSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define TWIS_INTENCLR_TXSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define TWIS_INTENCLR_TXSTARTED_Clear (1UL) /*!< Disable */ -/* Bit 19 : Write '1' to Disable interrupt for RXSTARTED event */ +/* Bit 19 : Write '1' to disable interrupt for RXSTARTED event */ #define TWIS_INTENCLR_RXSTARTED_Pos (19UL) /*!< Position of RXSTARTED field. */ #define TWIS_INTENCLR_RXSTARTED_Msk (0x1UL << TWIS_INTENCLR_RXSTARTED_Pos) /*!< Bit mask of RXSTARTED field. */ #define TWIS_INTENCLR_RXSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define TWIS_INTENCLR_RXSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define TWIS_INTENCLR_RXSTARTED_Clear (1UL) /*!< Disable */ -/* Bit 9 : Write '1' to Disable interrupt for ERROR event */ +/* Bit 9 : Write '1' to disable interrupt for ERROR event */ #define TWIS_INTENCLR_ERROR_Pos (9UL) /*!< Position of ERROR field. */ #define TWIS_INTENCLR_ERROR_Msk (0x1UL << TWIS_INTENCLR_ERROR_Pos) /*!< Bit mask of ERROR field. */ #define TWIS_INTENCLR_ERROR_Disabled (0UL) /*!< Read: Disabled */ #define TWIS_INTENCLR_ERROR_Enabled (1UL) /*!< Read: Enabled */ #define TWIS_INTENCLR_ERROR_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for STOPPED event */ +/* Bit 1 : Write '1' to disable interrupt for STOPPED event */ #define TWIS_INTENCLR_STOPPED_Pos (1UL) /*!< Position of STOPPED field. */ #define TWIS_INTENCLR_STOPPED_Msk (0x1UL << TWIS_INTENCLR_STOPPED_Pos) /*!< Bit mask of STOPPED field. */ #define TWIS_INTENCLR_STOPPED_Disabled (0UL) /*!< Read: Disabled */ @@ -12553,7 +14373,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define TWIS_TXD_AMOUNT_AMOUNT_Msk (0xFFFFUL << TWIS_TXD_AMOUNT_AMOUNT_Pos) /*!< Bit mask of AMOUNT field. */ /* Register: TWIS_ADDRESS */ -/* Description: Description collection[0]: TWI slave address 0 */ +/* Description: Description collection[n]: TWI slave address n */ /* Bits 6..0 : TWI slave address */ #define TWIS_ADDRESS_ADDRESS_Pos (0UL) /*!< Position of ADDRESS field. */ @@ -12585,6 +14405,83 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: UART */ /* Description: Universal Asynchronous Receiver/Transmitter */ +/* Register: UART_TASKS_STARTRX */ +/* Description: Start UART receiver */ + +/* Bit 0 : */ +#define UART_TASKS_STARTRX_TASKS_STARTRX_Pos (0UL) /*!< Position of TASKS_STARTRX field. */ +#define UART_TASKS_STARTRX_TASKS_STARTRX_Msk (0x1UL << UART_TASKS_STARTRX_TASKS_STARTRX_Pos) /*!< Bit mask of TASKS_STARTRX field. */ + +/* Register: UART_TASKS_STOPRX */ +/* Description: Stop UART receiver */ + +/* Bit 0 : */ +#define UART_TASKS_STOPRX_TASKS_STOPRX_Pos (0UL) /*!< Position of TASKS_STOPRX field. */ +#define UART_TASKS_STOPRX_TASKS_STOPRX_Msk (0x1UL << UART_TASKS_STOPRX_TASKS_STOPRX_Pos) /*!< Bit mask of TASKS_STOPRX field. */ + +/* Register: UART_TASKS_STARTTX */ +/* Description: Start UART transmitter */ + +/* Bit 0 : */ +#define UART_TASKS_STARTTX_TASKS_STARTTX_Pos (0UL) /*!< Position of TASKS_STARTTX field. */ +#define UART_TASKS_STARTTX_TASKS_STARTTX_Msk (0x1UL << UART_TASKS_STARTTX_TASKS_STARTTX_Pos) /*!< Bit mask of TASKS_STARTTX field. */ + +/* Register: UART_TASKS_STOPTX */ +/* Description: Stop UART transmitter */ + +/* Bit 0 : */ +#define UART_TASKS_STOPTX_TASKS_STOPTX_Pos (0UL) /*!< Position of TASKS_STOPTX field. */ +#define UART_TASKS_STOPTX_TASKS_STOPTX_Msk (0x1UL << UART_TASKS_STOPTX_TASKS_STOPTX_Pos) /*!< Bit mask of TASKS_STOPTX field. */ + +/* Register: UART_TASKS_SUSPEND */ +/* Description: Suspend UART */ + +/* Bit 0 : */ +#define UART_TASKS_SUSPEND_TASKS_SUSPEND_Pos (0UL) /*!< Position of TASKS_SUSPEND field. */ +#define UART_TASKS_SUSPEND_TASKS_SUSPEND_Msk (0x1UL << UART_TASKS_SUSPEND_TASKS_SUSPEND_Pos) /*!< Bit mask of TASKS_SUSPEND field. */ + +/* Register: UART_EVENTS_CTS */ +/* Description: CTS is activated (set low). Clear To Send. */ + +/* Bit 0 : */ +#define UART_EVENTS_CTS_EVENTS_CTS_Pos (0UL) /*!< Position of EVENTS_CTS field. */ +#define UART_EVENTS_CTS_EVENTS_CTS_Msk (0x1UL << UART_EVENTS_CTS_EVENTS_CTS_Pos) /*!< Bit mask of EVENTS_CTS field. */ + +/* Register: UART_EVENTS_NCTS */ +/* Description: CTS is deactivated (set high). Not Clear To Send. */ + +/* Bit 0 : */ +#define UART_EVENTS_NCTS_EVENTS_NCTS_Pos (0UL) /*!< Position of EVENTS_NCTS field. */ +#define UART_EVENTS_NCTS_EVENTS_NCTS_Msk (0x1UL << UART_EVENTS_NCTS_EVENTS_NCTS_Pos) /*!< Bit mask of EVENTS_NCTS field. */ + +/* Register: UART_EVENTS_RXDRDY */ +/* Description: Data received in RXD */ + +/* Bit 0 : */ +#define UART_EVENTS_RXDRDY_EVENTS_RXDRDY_Pos (0UL) /*!< Position of EVENTS_RXDRDY field. */ +#define UART_EVENTS_RXDRDY_EVENTS_RXDRDY_Msk (0x1UL << UART_EVENTS_RXDRDY_EVENTS_RXDRDY_Pos) /*!< Bit mask of EVENTS_RXDRDY field. */ + +/* Register: UART_EVENTS_TXDRDY */ +/* Description: Data sent from TXD */ + +/* Bit 0 : */ +#define UART_EVENTS_TXDRDY_EVENTS_TXDRDY_Pos (0UL) /*!< Position of EVENTS_TXDRDY field. */ +#define UART_EVENTS_TXDRDY_EVENTS_TXDRDY_Msk (0x1UL << UART_EVENTS_TXDRDY_EVENTS_TXDRDY_Pos) /*!< Bit mask of EVENTS_TXDRDY field. */ + +/* Register: UART_EVENTS_ERROR */ +/* Description: Error detected */ + +/* Bit 0 : */ +#define UART_EVENTS_ERROR_EVENTS_ERROR_Pos (0UL) /*!< Position of EVENTS_ERROR field. */ +#define UART_EVENTS_ERROR_EVENTS_ERROR_Msk (0x1UL << UART_EVENTS_ERROR_EVENTS_ERROR_Pos) /*!< Bit mask of EVENTS_ERROR field. */ + +/* Register: UART_EVENTS_RXTO */ +/* Description: Receiver timeout */ + +/* Bit 0 : */ +#define UART_EVENTS_RXTO_EVENTS_RXTO_Pos (0UL) /*!< Position of EVENTS_RXTO field. */ +#define UART_EVENTS_RXTO_EVENTS_RXTO_Msk (0x1UL << UART_EVENTS_RXTO_EVENTS_RXTO_Pos) /*!< Bit mask of EVENTS_RXTO field. */ + /* Register: UART_SHORTS */ /* Description: Shortcut register */ @@ -12603,42 +14500,42 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: UART_INTENSET */ /* Description: Enable interrupt */ -/* Bit 17 : Write '1' to Enable interrupt for RXTO event */ +/* Bit 17 : Write '1' to enable interrupt for RXTO event */ #define UART_INTENSET_RXTO_Pos (17UL) /*!< Position of RXTO field. */ #define UART_INTENSET_RXTO_Msk (0x1UL << UART_INTENSET_RXTO_Pos) /*!< Bit mask of RXTO field. */ #define UART_INTENSET_RXTO_Disabled (0UL) /*!< Read: Disabled */ #define UART_INTENSET_RXTO_Enabled (1UL) /*!< Read: Enabled */ #define UART_INTENSET_RXTO_Set (1UL) /*!< Enable */ -/* Bit 9 : Write '1' to Enable interrupt for ERROR event */ +/* Bit 9 : Write '1' to enable interrupt for ERROR event */ #define UART_INTENSET_ERROR_Pos (9UL) /*!< Position of ERROR field. */ #define UART_INTENSET_ERROR_Msk (0x1UL << UART_INTENSET_ERROR_Pos) /*!< Bit mask of ERROR field. */ #define UART_INTENSET_ERROR_Disabled (0UL) /*!< Read: Disabled */ #define UART_INTENSET_ERROR_Enabled (1UL) /*!< Read: Enabled */ #define UART_INTENSET_ERROR_Set (1UL) /*!< Enable */ -/* Bit 7 : Write '1' to Enable interrupt for TXDRDY event */ +/* Bit 7 : Write '1' to enable interrupt for TXDRDY event */ #define UART_INTENSET_TXDRDY_Pos (7UL) /*!< Position of TXDRDY field. */ #define UART_INTENSET_TXDRDY_Msk (0x1UL << UART_INTENSET_TXDRDY_Pos) /*!< Bit mask of TXDRDY field. */ #define UART_INTENSET_TXDRDY_Disabled (0UL) /*!< Read: Disabled */ #define UART_INTENSET_TXDRDY_Enabled (1UL) /*!< Read: Enabled */ #define UART_INTENSET_TXDRDY_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for RXDRDY event */ +/* Bit 2 : Write '1' to enable interrupt for RXDRDY event */ #define UART_INTENSET_RXDRDY_Pos (2UL) /*!< Position of RXDRDY field. */ #define UART_INTENSET_RXDRDY_Msk (0x1UL << UART_INTENSET_RXDRDY_Pos) /*!< Bit mask of RXDRDY field. */ #define UART_INTENSET_RXDRDY_Disabled (0UL) /*!< Read: Disabled */ #define UART_INTENSET_RXDRDY_Enabled (1UL) /*!< Read: Enabled */ #define UART_INTENSET_RXDRDY_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for NCTS event */ +/* Bit 1 : Write '1' to enable interrupt for NCTS event */ #define UART_INTENSET_NCTS_Pos (1UL) /*!< Position of NCTS field. */ #define UART_INTENSET_NCTS_Msk (0x1UL << UART_INTENSET_NCTS_Pos) /*!< Bit mask of NCTS field. */ #define UART_INTENSET_NCTS_Disabled (0UL) /*!< Read: Disabled */ #define UART_INTENSET_NCTS_Enabled (1UL) /*!< Read: Enabled */ #define UART_INTENSET_NCTS_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for CTS event */ +/* Bit 0 : Write '1' to enable interrupt for CTS event */ #define UART_INTENSET_CTS_Pos (0UL) /*!< Position of CTS field. */ #define UART_INTENSET_CTS_Msk (0x1UL << UART_INTENSET_CTS_Pos) /*!< Bit mask of CTS field. */ #define UART_INTENSET_CTS_Disabled (0UL) /*!< Read: Disabled */ @@ -12648,42 +14545,42 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: UART_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 17 : Write '1' to Disable interrupt for RXTO event */ +/* Bit 17 : Write '1' to disable interrupt for RXTO event */ #define UART_INTENCLR_RXTO_Pos (17UL) /*!< Position of RXTO field. */ #define UART_INTENCLR_RXTO_Msk (0x1UL << UART_INTENCLR_RXTO_Pos) /*!< Bit mask of RXTO field. */ #define UART_INTENCLR_RXTO_Disabled (0UL) /*!< Read: Disabled */ #define UART_INTENCLR_RXTO_Enabled (1UL) /*!< Read: Enabled */ #define UART_INTENCLR_RXTO_Clear (1UL) /*!< Disable */ -/* Bit 9 : Write '1' to Disable interrupt for ERROR event */ +/* Bit 9 : Write '1' to disable interrupt for ERROR event */ #define UART_INTENCLR_ERROR_Pos (9UL) /*!< Position of ERROR field. */ #define UART_INTENCLR_ERROR_Msk (0x1UL << UART_INTENCLR_ERROR_Pos) /*!< Bit mask of ERROR field. */ #define UART_INTENCLR_ERROR_Disabled (0UL) /*!< Read: Disabled */ #define UART_INTENCLR_ERROR_Enabled (1UL) /*!< Read: Enabled */ #define UART_INTENCLR_ERROR_Clear (1UL) /*!< Disable */ -/* Bit 7 : Write '1' to Disable interrupt for TXDRDY event */ +/* Bit 7 : Write '1' to disable interrupt for TXDRDY event */ #define UART_INTENCLR_TXDRDY_Pos (7UL) /*!< Position of TXDRDY field. */ #define UART_INTENCLR_TXDRDY_Msk (0x1UL << UART_INTENCLR_TXDRDY_Pos) /*!< Bit mask of TXDRDY field. */ #define UART_INTENCLR_TXDRDY_Disabled (0UL) /*!< Read: Disabled */ #define UART_INTENCLR_TXDRDY_Enabled (1UL) /*!< Read: Enabled */ #define UART_INTENCLR_TXDRDY_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for RXDRDY event */ +/* Bit 2 : Write '1' to disable interrupt for RXDRDY event */ #define UART_INTENCLR_RXDRDY_Pos (2UL) /*!< Position of RXDRDY field. */ #define UART_INTENCLR_RXDRDY_Msk (0x1UL << UART_INTENCLR_RXDRDY_Pos) /*!< Bit mask of RXDRDY field. */ #define UART_INTENCLR_RXDRDY_Disabled (0UL) /*!< Read: Disabled */ #define UART_INTENCLR_RXDRDY_Enabled (1UL) /*!< Read: Enabled */ #define UART_INTENCLR_RXDRDY_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for NCTS event */ +/* Bit 1 : Write '1' to disable interrupt for NCTS event */ #define UART_INTENCLR_NCTS_Pos (1UL) /*!< Position of NCTS field. */ #define UART_INTENCLR_NCTS_Msk (0x1UL << UART_INTENCLR_NCTS_Pos) /*!< Bit mask of NCTS field. */ #define UART_INTENCLR_NCTS_Disabled (0UL) /*!< Read: Disabled */ #define UART_INTENCLR_NCTS_Enabled (1UL) /*!< Read: Enabled */ #define UART_INTENCLR_NCTS_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for CTS event */ +/* Bit 0 : Write '1' to disable interrupt for CTS event */ #define UART_INTENCLR_CTS_Pos (0UL) /*!< Position of CTS field. */ #define UART_INTENCLR_CTS_Msk (0x1UL << UART_INTENCLR_CTS_Pos) /*!< Bit mask of CTS field. */ #define UART_INTENCLR_CTS_Disabled (0UL) /*!< Read: Disabled */ @@ -12852,6 +14749,118 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: UARTE */ /* Description: UART with EasyDMA 0 */ +/* Register: UARTE_TASKS_STARTRX */ +/* Description: Start UART receiver */ + +/* Bit 0 : */ +#define UARTE_TASKS_STARTRX_TASKS_STARTRX_Pos (0UL) /*!< Position of TASKS_STARTRX field. */ +#define UARTE_TASKS_STARTRX_TASKS_STARTRX_Msk (0x1UL << UARTE_TASKS_STARTRX_TASKS_STARTRX_Pos) /*!< Bit mask of TASKS_STARTRX field. */ + +/* Register: UARTE_TASKS_STOPRX */ +/* Description: Stop UART receiver */ + +/* Bit 0 : */ +#define UARTE_TASKS_STOPRX_TASKS_STOPRX_Pos (0UL) /*!< Position of TASKS_STOPRX field. */ +#define UARTE_TASKS_STOPRX_TASKS_STOPRX_Msk (0x1UL << UARTE_TASKS_STOPRX_TASKS_STOPRX_Pos) /*!< Bit mask of TASKS_STOPRX field. */ + +/* Register: UARTE_TASKS_STARTTX */ +/* Description: Start UART transmitter */ + +/* Bit 0 : */ +#define UARTE_TASKS_STARTTX_TASKS_STARTTX_Pos (0UL) /*!< Position of TASKS_STARTTX field. */ +#define UARTE_TASKS_STARTTX_TASKS_STARTTX_Msk (0x1UL << UARTE_TASKS_STARTTX_TASKS_STARTTX_Pos) /*!< Bit mask of TASKS_STARTTX field. */ + +/* Register: UARTE_TASKS_STOPTX */ +/* Description: Stop UART transmitter */ + +/* Bit 0 : */ +#define UARTE_TASKS_STOPTX_TASKS_STOPTX_Pos (0UL) /*!< Position of TASKS_STOPTX field. */ +#define UARTE_TASKS_STOPTX_TASKS_STOPTX_Msk (0x1UL << UARTE_TASKS_STOPTX_TASKS_STOPTX_Pos) /*!< Bit mask of TASKS_STOPTX field. */ + +/* Register: UARTE_TASKS_FLUSHRX */ +/* Description: Flush RX FIFO into RX buffer */ + +/* Bit 0 : */ +#define UARTE_TASKS_FLUSHRX_TASKS_FLUSHRX_Pos (0UL) /*!< Position of TASKS_FLUSHRX field. */ +#define UARTE_TASKS_FLUSHRX_TASKS_FLUSHRX_Msk (0x1UL << UARTE_TASKS_FLUSHRX_TASKS_FLUSHRX_Pos) /*!< Bit mask of TASKS_FLUSHRX field. */ + +/* Register: UARTE_EVENTS_CTS */ +/* Description: CTS is activated (set low). Clear To Send. */ + +/* Bit 0 : */ +#define UARTE_EVENTS_CTS_EVENTS_CTS_Pos (0UL) /*!< Position of EVENTS_CTS field. */ +#define UARTE_EVENTS_CTS_EVENTS_CTS_Msk (0x1UL << UARTE_EVENTS_CTS_EVENTS_CTS_Pos) /*!< Bit mask of EVENTS_CTS field. */ + +/* Register: UARTE_EVENTS_NCTS */ +/* Description: CTS is deactivated (set high). Not Clear To Send. */ + +/* Bit 0 : */ +#define UARTE_EVENTS_NCTS_EVENTS_NCTS_Pos (0UL) /*!< Position of EVENTS_NCTS field. */ +#define UARTE_EVENTS_NCTS_EVENTS_NCTS_Msk (0x1UL << UARTE_EVENTS_NCTS_EVENTS_NCTS_Pos) /*!< Bit mask of EVENTS_NCTS field. */ + +/* Register: UARTE_EVENTS_RXDRDY */ +/* Description: Data received in RXD (but potentially not yet transferred to Data RAM) */ + +/* Bit 0 : */ +#define UARTE_EVENTS_RXDRDY_EVENTS_RXDRDY_Pos (0UL) /*!< Position of EVENTS_RXDRDY field. */ +#define UARTE_EVENTS_RXDRDY_EVENTS_RXDRDY_Msk (0x1UL << UARTE_EVENTS_RXDRDY_EVENTS_RXDRDY_Pos) /*!< Bit mask of EVENTS_RXDRDY field. */ + +/* Register: UARTE_EVENTS_ENDRX */ +/* Description: Receive buffer is filled up */ + +/* Bit 0 : */ +#define UARTE_EVENTS_ENDRX_EVENTS_ENDRX_Pos (0UL) /*!< Position of EVENTS_ENDRX field. */ +#define UARTE_EVENTS_ENDRX_EVENTS_ENDRX_Msk (0x1UL << UARTE_EVENTS_ENDRX_EVENTS_ENDRX_Pos) /*!< Bit mask of EVENTS_ENDRX field. */ + +/* Register: UARTE_EVENTS_TXDRDY */ +/* Description: Data sent from TXD */ + +/* Bit 0 : */ +#define UARTE_EVENTS_TXDRDY_EVENTS_TXDRDY_Pos (0UL) /*!< Position of EVENTS_TXDRDY field. */ +#define UARTE_EVENTS_TXDRDY_EVENTS_TXDRDY_Msk (0x1UL << UARTE_EVENTS_TXDRDY_EVENTS_TXDRDY_Pos) /*!< Bit mask of EVENTS_TXDRDY field. */ + +/* Register: UARTE_EVENTS_ENDTX */ +/* Description: Last TX byte transmitted */ + +/* Bit 0 : */ +#define UARTE_EVENTS_ENDTX_EVENTS_ENDTX_Pos (0UL) /*!< Position of EVENTS_ENDTX field. */ +#define UARTE_EVENTS_ENDTX_EVENTS_ENDTX_Msk (0x1UL << UARTE_EVENTS_ENDTX_EVENTS_ENDTX_Pos) /*!< Bit mask of EVENTS_ENDTX field. */ + +/* Register: UARTE_EVENTS_ERROR */ +/* Description: Error detected */ + +/* Bit 0 : */ +#define UARTE_EVENTS_ERROR_EVENTS_ERROR_Pos (0UL) /*!< Position of EVENTS_ERROR field. */ +#define UARTE_EVENTS_ERROR_EVENTS_ERROR_Msk (0x1UL << UARTE_EVENTS_ERROR_EVENTS_ERROR_Pos) /*!< Bit mask of EVENTS_ERROR field. */ + +/* Register: UARTE_EVENTS_RXTO */ +/* Description: Receiver timeout */ + +/* Bit 0 : */ +#define UARTE_EVENTS_RXTO_EVENTS_RXTO_Pos (0UL) /*!< Position of EVENTS_RXTO field. */ +#define UARTE_EVENTS_RXTO_EVENTS_RXTO_Msk (0x1UL << UARTE_EVENTS_RXTO_EVENTS_RXTO_Pos) /*!< Bit mask of EVENTS_RXTO field. */ + +/* Register: UARTE_EVENTS_RXSTARTED */ +/* Description: UART receiver has started */ + +/* Bit 0 : */ +#define UARTE_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Pos (0UL) /*!< Position of EVENTS_RXSTARTED field. */ +#define UARTE_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Msk (0x1UL << UARTE_EVENTS_RXSTARTED_EVENTS_RXSTARTED_Pos) /*!< Bit mask of EVENTS_RXSTARTED field. */ + +/* Register: UARTE_EVENTS_TXSTARTED */ +/* Description: UART transmitter has started */ + +/* Bit 0 : */ +#define UARTE_EVENTS_TXSTARTED_EVENTS_TXSTARTED_Pos (0UL) /*!< Position of EVENTS_TXSTARTED field. */ +#define UARTE_EVENTS_TXSTARTED_EVENTS_TXSTARTED_Msk (0x1UL << UARTE_EVENTS_TXSTARTED_EVENTS_TXSTARTED_Pos) /*!< Bit mask of EVENTS_TXSTARTED field. */ + +/* Register: UARTE_EVENTS_TXSTOPPED */ +/* Description: Transmitter stopped */ + +/* Bit 0 : */ +#define UARTE_EVENTS_TXSTOPPED_EVENTS_TXSTOPPED_Pos (0UL) /*!< Position of EVENTS_TXSTOPPED field. */ +#define UARTE_EVENTS_TXSTOPPED_EVENTS_TXSTOPPED_Msk (0x1UL << UARTE_EVENTS_TXSTOPPED_EVENTS_TXSTOPPED_Pos) /*!< Bit mask of EVENTS_TXSTOPPED field. */ + /* Register: UARTE_SHORTS */ /* Description: Shortcut register */ @@ -12939,77 +14948,77 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: UARTE_INTENSET */ /* Description: Enable interrupt */ -/* Bit 22 : Write '1' to Enable interrupt for TXSTOPPED event */ +/* Bit 22 : Write '1' to enable interrupt for TXSTOPPED event */ #define UARTE_INTENSET_TXSTOPPED_Pos (22UL) /*!< Position of TXSTOPPED field. */ #define UARTE_INTENSET_TXSTOPPED_Msk (0x1UL << UARTE_INTENSET_TXSTOPPED_Pos) /*!< Bit mask of TXSTOPPED field. */ #define UARTE_INTENSET_TXSTOPPED_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENSET_TXSTOPPED_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENSET_TXSTOPPED_Set (1UL) /*!< Enable */ -/* Bit 20 : Write '1' to Enable interrupt for TXSTARTED event */ +/* Bit 20 : Write '1' to enable interrupt for TXSTARTED event */ #define UARTE_INTENSET_TXSTARTED_Pos (20UL) /*!< Position of TXSTARTED field. */ #define UARTE_INTENSET_TXSTARTED_Msk (0x1UL << UARTE_INTENSET_TXSTARTED_Pos) /*!< Bit mask of TXSTARTED field. */ #define UARTE_INTENSET_TXSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENSET_TXSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENSET_TXSTARTED_Set (1UL) /*!< Enable */ -/* Bit 19 : Write '1' to Enable interrupt for RXSTARTED event */ +/* Bit 19 : Write '1' to enable interrupt for RXSTARTED event */ #define UARTE_INTENSET_RXSTARTED_Pos (19UL) /*!< Position of RXSTARTED field. */ #define UARTE_INTENSET_RXSTARTED_Msk (0x1UL << UARTE_INTENSET_RXSTARTED_Pos) /*!< Bit mask of RXSTARTED field. */ #define UARTE_INTENSET_RXSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENSET_RXSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENSET_RXSTARTED_Set (1UL) /*!< Enable */ -/* Bit 17 : Write '1' to Enable interrupt for RXTO event */ +/* Bit 17 : Write '1' to enable interrupt for RXTO event */ #define UARTE_INTENSET_RXTO_Pos (17UL) /*!< Position of RXTO field. */ #define UARTE_INTENSET_RXTO_Msk (0x1UL << UARTE_INTENSET_RXTO_Pos) /*!< Bit mask of RXTO field. */ #define UARTE_INTENSET_RXTO_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENSET_RXTO_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENSET_RXTO_Set (1UL) /*!< Enable */ -/* Bit 9 : Write '1' to Enable interrupt for ERROR event */ +/* Bit 9 : Write '1' to enable interrupt for ERROR event */ #define UARTE_INTENSET_ERROR_Pos (9UL) /*!< Position of ERROR field. */ #define UARTE_INTENSET_ERROR_Msk (0x1UL << UARTE_INTENSET_ERROR_Pos) /*!< Bit mask of ERROR field. */ #define UARTE_INTENSET_ERROR_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENSET_ERROR_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENSET_ERROR_Set (1UL) /*!< Enable */ -/* Bit 8 : Write '1' to Enable interrupt for ENDTX event */ +/* Bit 8 : Write '1' to enable interrupt for ENDTX event */ #define UARTE_INTENSET_ENDTX_Pos (8UL) /*!< Position of ENDTX field. */ #define UARTE_INTENSET_ENDTX_Msk (0x1UL << UARTE_INTENSET_ENDTX_Pos) /*!< Bit mask of ENDTX field. */ #define UARTE_INTENSET_ENDTX_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENSET_ENDTX_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENSET_ENDTX_Set (1UL) /*!< Enable */ -/* Bit 7 : Write '1' to Enable interrupt for TXDRDY event */ +/* Bit 7 : Write '1' to enable interrupt for TXDRDY event */ #define UARTE_INTENSET_TXDRDY_Pos (7UL) /*!< Position of TXDRDY field. */ #define UARTE_INTENSET_TXDRDY_Msk (0x1UL << UARTE_INTENSET_TXDRDY_Pos) /*!< Bit mask of TXDRDY field. */ #define UARTE_INTENSET_TXDRDY_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENSET_TXDRDY_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENSET_TXDRDY_Set (1UL) /*!< Enable */ -/* Bit 4 : Write '1' to Enable interrupt for ENDRX event */ +/* Bit 4 : Write '1' to enable interrupt for ENDRX event */ #define UARTE_INTENSET_ENDRX_Pos (4UL) /*!< Position of ENDRX field. */ #define UARTE_INTENSET_ENDRX_Msk (0x1UL << UARTE_INTENSET_ENDRX_Pos) /*!< Bit mask of ENDRX field. */ #define UARTE_INTENSET_ENDRX_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENSET_ENDRX_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENSET_ENDRX_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for RXDRDY event */ +/* Bit 2 : Write '1' to enable interrupt for RXDRDY event */ #define UARTE_INTENSET_RXDRDY_Pos (2UL) /*!< Position of RXDRDY field. */ #define UARTE_INTENSET_RXDRDY_Msk (0x1UL << UARTE_INTENSET_RXDRDY_Pos) /*!< Bit mask of RXDRDY field. */ #define UARTE_INTENSET_RXDRDY_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENSET_RXDRDY_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENSET_RXDRDY_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for NCTS event */ +/* Bit 1 : Write '1' to enable interrupt for NCTS event */ #define UARTE_INTENSET_NCTS_Pos (1UL) /*!< Position of NCTS field. */ #define UARTE_INTENSET_NCTS_Msk (0x1UL << UARTE_INTENSET_NCTS_Pos) /*!< Bit mask of NCTS field. */ #define UARTE_INTENSET_NCTS_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENSET_NCTS_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENSET_NCTS_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for CTS event */ +/* Bit 0 : Write '1' to enable interrupt for CTS event */ #define UARTE_INTENSET_CTS_Pos (0UL) /*!< Position of CTS field. */ #define UARTE_INTENSET_CTS_Msk (0x1UL << UARTE_INTENSET_CTS_Pos) /*!< Bit mask of CTS field. */ #define UARTE_INTENSET_CTS_Disabled (0UL) /*!< Read: Disabled */ @@ -13019,77 +15028,77 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: UARTE_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 22 : Write '1' to Disable interrupt for TXSTOPPED event */ +/* Bit 22 : Write '1' to disable interrupt for TXSTOPPED event */ #define UARTE_INTENCLR_TXSTOPPED_Pos (22UL) /*!< Position of TXSTOPPED field. */ #define UARTE_INTENCLR_TXSTOPPED_Msk (0x1UL << UARTE_INTENCLR_TXSTOPPED_Pos) /*!< Bit mask of TXSTOPPED field. */ #define UARTE_INTENCLR_TXSTOPPED_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENCLR_TXSTOPPED_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENCLR_TXSTOPPED_Clear (1UL) /*!< Disable */ -/* Bit 20 : Write '1' to Disable interrupt for TXSTARTED event */ +/* Bit 20 : Write '1' to disable interrupt for TXSTARTED event */ #define UARTE_INTENCLR_TXSTARTED_Pos (20UL) /*!< Position of TXSTARTED field. */ #define UARTE_INTENCLR_TXSTARTED_Msk (0x1UL << UARTE_INTENCLR_TXSTARTED_Pos) /*!< Bit mask of TXSTARTED field. */ #define UARTE_INTENCLR_TXSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENCLR_TXSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENCLR_TXSTARTED_Clear (1UL) /*!< Disable */ -/* Bit 19 : Write '1' to Disable interrupt for RXSTARTED event */ +/* Bit 19 : Write '1' to disable interrupt for RXSTARTED event */ #define UARTE_INTENCLR_RXSTARTED_Pos (19UL) /*!< Position of RXSTARTED field. */ #define UARTE_INTENCLR_RXSTARTED_Msk (0x1UL << UARTE_INTENCLR_RXSTARTED_Pos) /*!< Bit mask of RXSTARTED field. */ #define UARTE_INTENCLR_RXSTARTED_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENCLR_RXSTARTED_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENCLR_RXSTARTED_Clear (1UL) /*!< Disable */ -/* Bit 17 : Write '1' to Disable interrupt for RXTO event */ +/* Bit 17 : Write '1' to disable interrupt for RXTO event */ #define UARTE_INTENCLR_RXTO_Pos (17UL) /*!< Position of RXTO field. */ #define UARTE_INTENCLR_RXTO_Msk (0x1UL << UARTE_INTENCLR_RXTO_Pos) /*!< Bit mask of RXTO field. */ #define UARTE_INTENCLR_RXTO_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENCLR_RXTO_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENCLR_RXTO_Clear (1UL) /*!< Disable */ -/* Bit 9 : Write '1' to Disable interrupt for ERROR event */ +/* Bit 9 : Write '1' to disable interrupt for ERROR event */ #define UARTE_INTENCLR_ERROR_Pos (9UL) /*!< Position of ERROR field. */ #define UARTE_INTENCLR_ERROR_Msk (0x1UL << UARTE_INTENCLR_ERROR_Pos) /*!< Bit mask of ERROR field. */ #define UARTE_INTENCLR_ERROR_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENCLR_ERROR_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENCLR_ERROR_Clear (1UL) /*!< Disable */ -/* Bit 8 : Write '1' to Disable interrupt for ENDTX event */ +/* Bit 8 : Write '1' to disable interrupt for ENDTX event */ #define UARTE_INTENCLR_ENDTX_Pos (8UL) /*!< Position of ENDTX field. */ #define UARTE_INTENCLR_ENDTX_Msk (0x1UL << UARTE_INTENCLR_ENDTX_Pos) /*!< Bit mask of ENDTX field. */ #define UARTE_INTENCLR_ENDTX_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENCLR_ENDTX_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENCLR_ENDTX_Clear (1UL) /*!< Disable */ -/* Bit 7 : Write '1' to Disable interrupt for TXDRDY event */ +/* Bit 7 : Write '1' to disable interrupt for TXDRDY event */ #define UARTE_INTENCLR_TXDRDY_Pos (7UL) /*!< Position of TXDRDY field. */ #define UARTE_INTENCLR_TXDRDY_Msk (0x1UL << UARTE_INTENCLR_TXDRDY_Pos) /*!< Bit mask of TXDRDY field. */ #define UARTE_INTENCLR_TXDRDY_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENCLR_TXDRDY_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENCLR_TXDRDY_Clear (1UL) /*!< Disable */ -/* Bit 4 : Write '1' to Disable interrupt for ENDRX event */ +/* Bit 4 : Write '1' to disable interrupt for ENDRX event */ #define UARTE_INTENCLR_ENDRX_Pos (4UL) /*!< Position of ENDRX field. */ #define UARTE_INTENCLR_ENDRX_Msk (0x1UL << UARTE_INTENCLR_ENDRX_Pos) /*!< Bit mask of ENDRX field. */ #define UARTE_INTENCLR_ENDRX_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENCLR_ENDRX_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENCLR_ENDRX_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for RXDRDY event */ +/* Bit 2 : Write '1' to disable interrupt for RXDRDY event */ #define UARTE_INTENCLR_RXDRDY_Pos (2UL) /*!< Position of RXDRDY field. */ #define UARTE_INTENCLR_RXDRDY_Msk (0x1UL << UARTE_INTENCLR_RXDRDY_Pos) /*!< Bit mask of RXDRDY field. */ #define UARTE_INTENCLR_RXDRDY_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENCLR_RXDRDY_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENCLR_RXDRDY_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for NCTS event */ +/* Bit 1 : Write '1' to disable interrupt for NCTS event */ #define UARTE_INTENCLR_NCTS_Pos (1UL) /*!< Position of NCTS field. */ #define UARTE_INTENCLR_NCTS_Msk (0x1UL << UARTE_INTENCLR_NCTS_Pos) /*!< Bit mask of NCTS field. */ #define UARTE_INTENCLR_NCTS_Disabled (0UL) /*!< Read: Disabled */ #define UARTE_INTENCLR_NCTS_Enabled (1UL) /*!< Read: Enabled */ #define UARTE_INTENCLR_NCTS_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for CTS event */ +/* Bit 0 : Write '1' to disable interrupt for CTS event */ #define UARTE_INTENCLR_CTS_Pos (0UL) /*!< Position of CTS field. */ #define UARTE_INTENCLR_CTS_Msk (0x1UL << UARTE_INTENCLR_CTS_Pos) /*!< Bit mask of CTS field. */ #define UARTE_INTENCLR_CTS_Disabled (0UL) /*!< Read: Disabled */ @@ -13293,28 +15302,28 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Description: User information configuration registers */ /* Register: UICR_NRFFW */ -/* Description: Description collection[0]: Reserved for Nordic firmware design */ +/* Description: Description collection[n]: Reserved for Nordic firmware design */ /* Bits 31..0 : Reserved for Nordic firmware design */ #define UICR_NRFFW_NRFFW_Pos (0UL) /*!< Position of NRFFW field. */ #define UICR_NRFFW_NRFFW_Msk (0xFFFFFFFFUL << UICR_NRFFW_NRFFW_Pos) /*!< Bit mask of NRFFW field. */ /* Register: UICR_NRFHW */ -/* Description: Description collection[0]: Reserved for Nordic hardware design */ +/* Description: Description collection[n]: Reserved for Nordic hardware design */ /* Bits 31..0 : Reserved for Nordic hardware design */ #define UICR_NRFHW_NRFHW_Pos (0UL) /*!< Position of NRFHW field. */ #define UICR_NRFHW_NRFHW_Msk (0xFFFFFFFFUL << UICR_NRFHW_NRFHW_Pos) /*!< Bit mask of NRFHW field. */ /* Register: UICR_CUSTOMER */ -/* Description: Description collection[0]: Reserved for customer */ +/* Description: Description collection[n]: Reserved for customer */ /* Bits 31..0 : Reserved for customer */ #define UICR_CUSTOMER_CUSTOMER_Pos (0UL) /*!< Position of CUSTOMER field. */ #define UICR_CUSTOMER_CUSTOMER_Msk (0xFFFFFFFFUL << UICR_CUSTOMER_CUSTOMER_Pos) /*!< Bit mask of CUSTOMER field. */ /* Register: UICR_PSELRESET */ -/* Description: Description collection[0]: Mapping of the nRESET function */ +/* Description: Description collection[n]: Mapping of the nRESET function */ /* Bit 31 : Connection */ #define UICR_PSELRESET_CONNECT_Pos (31UL) /*!< Position of CONNECT field. */ @@ -13363,15 +15372,6 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define UICR_DEBUGCTRL_CPUNIDEN_Disabled (0x00UL) /*!< Disable CPU ITM and ETM functionality */ #define UICR_DEBUGCTRL_CPUNIDEN_Enabled (0xFFUL) /*!< Enable CPU ITM and ETM functionality (default behavior) */ -/* Register: UICR_DCDCDRIVE0 */ -/* Description: Set drive level for REG0 DCDC mode. Using high drive will slightly reduce DCDC efficiency. */ - -/* Bit 0 : Set drive level for REG0 DCDC mode. */ -#define UICR_DCDCDRIVE0_DCDCDRIVE0_Pos (0UL) /*!< Position of DCDCDRIVE0 field. */ -#define UICR_DCDCDRIVE0_DCDCDRIVE0_Msk (0x1UL << UICR_DCDCDRIVE0_DCDCDRIVE0_Pos) /*!< Bit mask of DCDCDRIVE0 field. */ -#define UICR_DCDCDRIVE0_DCDCDRIVE0_Low (0UL) /*!< Low drive */ -#define UICR_DCDCDRIVE0_DCDCDRIVE0_High (1UL) /*!< High drive */ - /* Register: UICR_REGOUT0 */ /* Description: GPIO reference voltage / external output supply voltage in high voltage mode */ @@ -13388,7 +15388,147 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: USBD */ -/* Description: Universal Serial Bus device */ +/* Description: Universal serial bus device */ + +/* Register: USBD_TASKS_STARTEPIN */ +/* Description: Description collection[n]: Captures the EPIN[n].PTR and EPIN[n].MAXCNT registers values, and enables endpoint IN n to respond to traffic from host */ + +/* Bit 0 : */ +#define USBD_TASKS_STARTEPIN_TASKS_STARTEPIN_Pos (0UL) /*!< Position of TASKS_STARTEPIN field. */ +#define USBD_TASKS_STARTEPIN_TASKS_STARTEPIN_Msk (0x1UL << USBD_TASKS_STARTEPIN_TASKS_STARTEPIN_Pos) /*!< Bit mask of TASKS_STARTEPIN field. */ + +/* Register: USBD_TASKS_STARTISOIN */ +/* Description: Captures the ISOIN.PTR and ISOIN.MAXCNT registers values, and enables sending data on ISO endpoint */ + +/* Bit 0 : */ +#define USBD_TASKS_STARTISOIN_TASKS_STARTISOIN_Pos (0UL) /*!< Position of TASKS_STARTISOIN field. */ +#define USBD_TASKS_STARTISOIN_TASKS_STARTISOIN_Msk (0x1UL << USBD_TASKS_STARTISOIN_TASKS_STARTISOIN_Pos) /*!< Bit mask of TASKS_STARTISOIN field. */ + +/* Register: USBD_TASKS_STARTEPOUT */ +/* Description: Description collection[n]: Captures the EPOUT[n].PTR and EPOUT[n].MAXCNT registers values, and enables endpoint n to respond to traffic from host */ + +/* Bit 0 : */ +#define USBD_TASKS_STARTEPOUT_TASKS_STARTEPOUT_Pos (0UL) /*!< Position of TASKS_STARTEPOUT field. */ +#define USBD_TASKS_STARTEPOUT_TASKS_STARTEPOUT_Msk (0x1UL << USBD_TASKS_STARTEPOUT_TASKS_STARTEPOUT_Pos) /*!< Bit mask of TASKS_STARTEPOUT field. */ + +/* Register: USBD_TASKS_STARTISOOUT */ +/* Description: Captures the ISOOUT.PTR and ISOOUT.MAXCNT registers values, and enables receiving of data on ISO endpoint */ + +/* Bit 0 : */ +#define USBD_TASKS_STARTISOOUT_TASKS_STARTISOOUT_Pos (0UL) /*!< Position of TASKS_STARTISOOUT field. */ +#define USBD_TASKS_STARTISOOUT_TASKS_STARTISOOUT_Msk (0x1UL << USBD_TASKS_STARTISOOUT_TASKS_STARTISOOUT_Pos) /*!< Bit mask of TASKS_STARTISOOUT field. */ + +/* Register: USBD_TASKS_EP0RCVOUT */ +/* Description: Allows OUT data stage on control endpoint 0 */ + +/* Bit 0 : */ +#define USBD_TASKS_EP0RCVOUT_TASKS_EP0RCVOUT_Pos (0UL) /*!< Position of TASKS_EP0RCVOUT field. */ +#define USBD_TASKS_EP0RCVOUT_TASKS_EP0RCVOUT_Msk (0x1UL << USBD_TASKS_EP0RCVOUT_TASKS_EP0RCVOUT_Pos) /*!< Bit mask of TASKS_EP0RCVOUT field. */ + +/* Register: USBD_TASKS_EP0STATUS */ +/* Description: Allows status stage on control endpoint 0 */ + +/* Bit 0 : */ +#define USBD_TASKS_EP0STATUS_TASKS_EP0STATUS_Pos (0UL) /*!< Position of TASKS_EP0STATUS field. */ +#define USBD_TASKS_EP0STATUS_TASKS_EP0STATUS_Msk (0x1UL << USBD_TASKS_EP0STATUS_TASKS_EP0STATUS_Pos) /*!< Bit mask of TASKS_EP0STATUS field. */ + +/* Register: USBD_TASKS_EP0STALL */ +/* Description: Stalls data and status stage on control endpoint 0 */ + +/* Bit 0 : */ +#define USBD_TASKS_EP0STALL_TASKS_EP0STALL_Pos (0UL) /*!< Position of TASKS_EP0STALL field. */ +#define USBD_TASKS_EP0STALL_TASKS_EP0STALL_Msk (0x1UL << USBD_TASKS_EP0STALL_TASKS_EP0STALL_Pos) /*!< Bit mask of TASKS_EP0STALL field. */ + +/* Register: USBD_TASKS_DPDMDRIVE */ +/* Description: Forces D+ and D- lines into the state defined in the DPDMVALUE register */ + +/* Bit 0 : */ +#define USBD_TASKS_DPDMDRIVE_TASKS_DPDMDRIVE_Pos (0UL) /*!< Position of TASKS_DPDMDRIVE field. */ +#define USBD_TASKS_DPDMDRIVE_TASKS_DPDMDRIVE_Msk (0x1UL << USBD_TASKS_DPDMDRIVE_TASKS_DPDMDRIVE_Pos) /*!< Bit mask of TASKS_DPDMDRIVE field. */ + +/* Register: USBD_TASKS_DPDMNODRIVE */ +/* Description: Stops forcing D+ and D- lines into any state (USB engine takes control) */ + +/* Bit 0 : */ +#define USBD_TASKS_DPDMNODRIVE_TASKS_DPDMNODRIVE_Pos (0UL) /*!< Position of TASKS_DPDMNODRIVE field. */ +#define USBD_TASKS_DPDMNODRIVE_TASKS_DPDMNODRIVE_Msk (0x1UL << USBD_TASKS_DPDMNODRIVE_TASKS_DPDMNODRIVE_Pos) /*!< Bit mask of TASKS_DPDMNODRIVE field. */ + +/* Register: USBD_EVENTS_USBRESET */ +/* Description: Signals that a USB reset condition has been detected on USB lines */ + +/* Bit 0 : */ +#define USBD_EVENTS_USBRESET_EVENTS_USBRESET_Pos (0UL) /*!< Position of EVENTS_USBRESET field. */ +#define USBD_EVENTS_USBRESET_EVENTS_USBRESET_Msk (0x1UL << USBD_EVENTS_USBRESET_EVENTS_USBRESET_Pos) /*!< Bit mask of EVENTS_USBRESET field. */ + +/* Register: USBD_EVENTS_STARTED */ +/* Description: Confirms that the EPIN[n].PTR and EPIN[n].MAXCNT, or EPOUT[n].PTR and EPOUT[n].MAXCNT registers have been captured on all endpoints reported in the EPSTATUS register */ + +/* Bit 0 : */ +#define USBD_EVENTS_STARTED_EVENTS_STARTED_Pos (0UL) /*!< Position of EVENTS_STARTED field. */ +#define USBD_EVENTS_STARTED_EVENTS_STARTED_Msk (0x1UL << USBD_EVENTS_STARTED_EVENTS_STARTED_Pos) /*!< Bit mask of EVENTS_STARTED field. */ + +/* Register: USBD_EVENTS_ENDEPIN */ +/* Description: Description collection[n]: The whole EPIN[n] buffer has been consumed. The RAM buffer can be accessed safely by software. */ + +/* Bit 0 : */ +#define USBD_EVENTS_ENDEPIN_EVENTS_ENDEPIN_Pos (0UL) /*!< Position of EVENTS_ENDEPIN field. */ +#define USBD_EVENTS_ENDEPIN_EVENTS_ENDEPIN_Msk (0x1UL << USBD_EVENTS_ENDEPIN_EVENTS_ENDEPIN_Pos) /*!< Bit mask of EVENTS_ENDEPIN field. */ + +/* Register: USBD_EVENTS_EP0DATADONE */ +/* Description: An acknowledged data transfer has taken place on the control endpoint */ + +/* Bit 0 : */ +#define USBD_EVENTS_EP0DATADONE_EVENTS_EP0DATADONE_Pos (0UL) /*!< Position of EVENTS_EP0DATADONE field. */ +#define USBD_EVENTS_EP0DATADONE_EVENTS_EP0DATADONE_Msk (0x1UL << USBD_EVENTS_EP0DATADONE_EVENTS_EP0DATADONE_Pos) /*!< Bit mask of EVENTS_EP0DATADONE field. */ + +/* Register: USBD_EVENTS_ENDISOIN */ +/* Description: The whole ISOIN buffer has been consumed. The RAM buffer can be accessed safely by software. */ + +/* Bit 0 : */ +#define USBD_EVENTS_ENDISOIN_EVENTS_ENDISOIN_Pos (0UL) /*!< Position of EVENTS_ENDISOIN field. */ +#define USBD_EVENTS_ENDISOIN_EVENTS_ENDISOIN_Msk (0x1UL << USBD_EVENTS_ENDISOIN_EVENTS_ENDISOIN_Pos) /*!< Bit mask of EVENTS_ENDISOIN field. */ + +/* Register: USBD_EVENTS_ENDEPOUT */ +/* Description: Description collection[n]: The whole EPOUT[n] buffer has been consumed. The RAM buffer can be accessed safely by software. */ + +/* Bit 0 : */ +#define USBD_EVENTS_ENDEPOUT_EVENTS_ENDEPOUT_Pos (0UL) /*!< Position of EVENTS_ENDEPOUT field. */ +#define USBD_EVENTS_ENDEPOUT_EVENTS_ENDEPOUT_Msk (0x1UL << USBD_EVENTS_ENDEPOUT_EVENTS_ENDEPOUT_Pos) /*!< Bit mask of EVENTS_ENDEPOUT field. */ + +/* Register: USBD_EVENTS_ENDISOOUT */ +/* Description: The whole ISOOUT buffer has been consumed. The RAM buffer can be accessed safely by software. */ + +/* Bit 0 : */ +#define USBD_EVENTS_ENDISOOUT_EVENTS_ENDISOOUT_Pos (0UL) /*!< Position of EVENTS_ENDISOOUT field. */ +#define USBD_EVENTS_ENDISOOUT_EVENTS_ENDISOOUT_Msk (0x1UL << USBD_EVENTS_ENDISOOUT_EVENTS_ENDISOOUT_Pos) /*!< Bit mask of EVENTS_ENDISOOUT field. */ + +/* Register: USBD_EVENTS_SOF */ +/* Description: Signals that a SOF (start of frame) condition has been detected on USB lines */ + +/* Bit 0 : */ +#define USBD_EVENTS_SOF_EVENTS_SOF_Pos (0UL) /*!< Position of EVENTS_SOF field. */ +#define USBD_EVENTS_SOF_EVENTS_SOF_Msk (0x1UL << USBD_EVENTS_SOF_EVENTS_SOF_Pos) /*!< Bit mask of EVENTS_SOF field. */ + +/* Register: USBD_EVENTS_USBEVENT */ +/* Description: An event or an error not covered by specific events has occurred. Check EVENTCAUSE register to find the cause. */ + +/* Bit 0 : */ +#define USBD_EVENTS_USBEVENT_EVENTS_USBEVENT_Pos (0UL) /*!< Position of EVENTS_USBEVENT field. */ +#define USBD_EVENTS_USBEVENT_EVENTS_USBEVENT_Msk (0x1UL << USBD_EVENTS_USBEVENT_EVENTS_USBEVENT_Pos) /*!< Bit mask of EVENTS_USBEVENT field. */ + +/* Register: USBD_EVENTS_EP0SETUP */ +/* Description: A valid SETUP token has been received (and acknowledged) on the control endpoint */ + +/* Bit 0 : */ +#define USBD_EVENTS_EP0SETUP_EVENTS_EP0SETUP_Pos (0UL) /*!< Position of EVENTS_EP0SETUP field. */ +#define USBD_EVENTS_EP0SETUP_EVENTS_EP0SETUP_Msk (0x1UL << USBD_EVENTS_EP0SETUP_EVENTS_EP0SETUP_Pos) /*!< Bit mask of EVENTS_EP0SETUP field. */ + +/* Register: USBD_EVENTS_EPDATA */ +/* Description: A data transfer has occurred on a data endpoint, indicated by the EPDATASTATUS register */ + +/* Bit 0 : */ +#define USBD_EVENTS_EPDATA_EVENTS_EPDATA_Pos (0UL) /*!< Position of EVENTS_EPDATA field. */ +#define USBD_EVENTS_EPDATA_EVENTS_EPDATA_Msk (0x1UL << USBD_EVENTS_EPDATA_EVENTS_EPDATA_Pos) /*!< Bit mask of EVENTS_EPDATA field. */ /* Register: USBD_SHORTS */ /* Description: Shortcut register */ @@ -13426,12 +15566,6 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: USBD_INTEN */ /* Description: Enable or disable interrupt */ -/* Bit 25 : Enable or disable interrupt for ACCESSFAULT event */ -#define USBD_INTEN_ACCESSFAULT_Pos (25UL) /*!< Position of ACCESSFAULT field. */ -#define USBD_INTEN_ACCESSFAULT_Msk (0x1UL << USBD_INTEN_ACCESSFAULT_Pos) /*!< Bit mask of ACCESSFAULT field. */ -#define USBD_INTEN_ACCESSFAULT_Disabled (0UL) /*!< Disable */ -#define USBD_INTEN_ACCESSFAULT_Enabled (1UL) /*!< Enable */ - /* Bit 24 : Enable or disable interrupt for EPDATA event */ #define USBD_INTEN_EPDATA_Pos (24UL) /*!< Position of EPDATA field. */ #define USBD_INTEN_EPDATA_Msk (0x1UL << USBD_INTEN_EPDATA_Pos) /*!< Bit mask of EPDATA field. */ @@ -13585,182 +15719,175 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: USBD_INTENSET */ /* Description: Enable interrupt */ -/* Bit 25 : Write '1' to Enable interrupt for ACCESSFAULT event */ -#define USBD_INTENSET_ACCESSFAULT_Pos (25UL) /*!< Position of ACCESSFAULT field. */ -#define USBD_INTENSET_ACCESSFAULT_Msk (0x1UL << USBD_INTENSET_ACCESSFAULT_Pos) /*!< Bit mask of ACCESSFAULT field. */ -#define USBD_INTENSET_ACCESSFAULT_Disabled (0UL) /*!< Read: Disabled */ -#define USBD_INTENSET_ACCESSFAULT_Enabled (1UL) /*!< Read: Enabled */ -#define USBD_INTENSET_ACCESSFAULT_Set (1UL) /*!< Enable */ - -/* Bit 24 : Write '1' to Enable interrupt for EPDATA event */ +/* Bit 24 : Write '1' to enable interrupt for EPDATA event */ #define USBD_INTENSET_EPDATA_Pos (24UL) /*!< Position of EPDATA field. */ #define USBD_INTENSET_EPDATA_Msk (0x1UL << USBD_INTENSET_EPDATA_Pos) /*!< Bit mask of EPDATA field. */ #define USBD_INTENSET_EPDATA_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_EPDATA_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_EPDATA_Set (1UL) /*!< Enable */ -/* Bit 23 : Write '1' to Enable interrupt for EP0SETUP event */ +/* Bit 23 : Write '1' to enable interrupt for EP0SETUP event */ #define USBD_INTENSET_EP0SETUP_Pos (23UL) /*!< Position of EP0SETUP field. */ #define USBD_INTENSET_EP0SETUP_Msk (0x1UL << USBD_INTENSET_EP0SETUP_Pos) /*!< Bit mask of EP0SETUP field. */ #define USBD_INTENSET_EP0SETUP_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_EP0SETUP_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_EP0SETUP_Set (1UL) /*!< Enable */ -/* Bit 22 : Write '1' to Enable interrupt for USBEVENT event */ +/* Bit 22 : Write '1' to enable interrupt for USBEVENT event */ #define USBD_INTENSET_USBEVENT_Pos (22UL) /*!< Position of USBEVENT field. */ #define USBD_INTENSET_USBEVENT_Msk (0x1UL << USBD_INTENSET_USBEVENT_Pos) /*!< Bit mask of USBEVENT field. */ #define USBD_INTENSET_USBEVENT_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_USBEVENT_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_USBEVENT_Set (1UL) /*!< Enable */ -/* Bit 21 : Write '1' to Enable interrupt for SOF event */ +/* Bit 21 : Write '1' to enable interrupt for SOF event */ #define USBD_INTENSET_SOF_Pos (21UL) /*!< Position of SOF field. */ #define USBD_INTENSET_SOF_Msk (0x1UL << USBD_INTENSET_SOF_Pos) /*!< Bit mask of SOF field. */ #define USBD_INTENSET_SOF_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_SOF_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_SOF_Set (1UL) /*!< Enable */ -/* Bit 20 : Write '1' to Enable interrupt for ENDISOOUT event */ +/* Bit 20 : Write '1' to enable interrupt for ENDISOOUT event */ #define USBD_INTENSET_ENDISOOUT_Pos (20UL) /*!< Position of ENDISOOUT field. */ #define USBD_INTENSET_ENDISOOUT_Msk (0x1UL << USBD_INTENSET_ENDISOOUT_Pos) /*!< Bit mask of ENDISOOUT field. */ #define USBD_INTENSET_ENDISOOUT_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDISOOUT_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDISOOUT_Set (1UL) /*!< Enable */ -/* Bit 19 : Write '1' to Enable interrupt for ENDEPOUT[7] event */ +/* Bit 19 : Write '1' to enable interrupt for ENDEPOUT[7] event */ #define USBD_INTENSET_ENDEPOUT7_Pos (19UL) /*!< Position of ENDEPOUT7 field. */ #define USBD_INTENSET_ENDEPOUT7_Msk (0x1UL << USBD_INTENSET_ENDEPOUT7_Pos) /*!< Bit mask of ENDEPOUT7 field. */ #define USBD_INTENSET_ENDEPOUT7_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPOUT7_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPOUT7_Set (1UL) /*!< Enable */ -/* Bit 18 : Write '1' to Enable interrupt for ENDEPOUT[6] event */ +/* Bit 18 : Write '1' to enable interrupt for ENDEPOUT[6] event */ #define USBD_INTENSET_ENDEPOUT6_Pos (18UL) /*!< Position of ENDEPOUT6 field. */ #define USBD_INTENSET_ENDEPOUT6_Msk (0x1UL << USBD_INTENSET_ENDEPOUT6_Pos) /*!< Bit mask of ENDEPOUT6 field. */ #define USBD_INTENSET_ENDEPOUT6_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPOUT6_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPOUT6_Set (1UL) /*!< Enable */ -/* Bit 17 : Write '1' to Enable interrupt for ENDEPOUT[5] event */ +/* Bit 17 : Write '1' to enable interrupt for ENDEPOUT[5] event */ #define USBD_INTENSET_ENDEPOUT5_Pos (17UL) /*!< Position of ENDEPOUT5 field. */ #define USBD_INTENSET_ENDEPOUT5_Msk (0x1UL << USBD_INTENSET_ENDEPOUT5_Pos) /*!< Bit mask of ENDEPOUT5 field. */ #define USBD_INTENSET_ENDEPOUT5_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPOUT5_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPOUT5_Set (1UL) /*!< Enable */ -/* Bit 16 : Write '1' to Enable interrupt for ENDEPOUT[4] event */ +/* Bit 16 : Write '1' to enable interrupt for ENDEPOUT[4] event */ #define USBD_INTENSET_ENDEPOUT4_Pos (16UL) /*!< Position of ENDEPOUT4 field. */ #define USBD_INTENSET_ENDEPOUT4_Msk (0x1UL << USBD_INTENSET_ENDEPOUT4_Pos) /*!< Bit mask of ENDEPOUT4 field. */ #define USBD_INTENSET_ENDEPOUT4_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPOUT4_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPOUT4_Set (1UL) /*!< Enable */ -/* Bit 15 : Write '1' to Enable interrupt for ENDEPOUT[3] event */ +/* Bit 15 : Write '1' to enable interrupt for ENDEPOUT[3] event */ #define USBD_INTENSET_ENDEPOUT3_Pos (15UL) /*!< Position of ENDEPOUT3 field. */ #define USBD_INTENSET_ENDEPOUT3_Msk (0x1UL << USBD_INTENSET_ENDEPOUT3_Pos) /*!< Bit mask of ENDEPOUT3 field. */ #define USBD_INTENSET_ENDEPOUT3_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPOUT3_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPOUT3_Set (1UL) /*!< Enable */ -/* Bit 14 : Write '1' to Enable interrupt for ENDEPOUT[2] event */ +/* Bit 14 : Write '1' to enable interrupt for ENDEPOUT[2] event */ #define USBD_INTENSET_ENDEPOUT2_Pos (14UL) /*!< Position of ENDEPOUT2 field. */ #define USBD_INTENSET_ENDEPOUT2_Msk (0x1UL << USBD_INTENSET_ENDEPOUT2_Pos) /*!< Bit mask of ENDEPOUT2 field. */ #define USBD_INTENSET_ENDEPOUT2_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPOUT2_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPOUT2_Set (1UL) /*!< Enable */ -/* Bit 13 : Write '1' to Enable interrupt for ENDEPOUT[1] event */ +/* Bit 13 : Write '1' to enable interrupt for ENDEPOUT[1] event */ #define USBD_INTENSET_ENDEPOUT1_Pos (13UL) /*!< Position of ENDEPOUT1 field. */ #define USBD_INTENSET_ENDEPOUT1_Msk (0x1UL << USBD_INTENSET_ENDEPOUT1_Pos) /*!< Bit mask of ENDEPOUT1 field. */ #define USBD_INTENSET_ENDEPOUT1_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPOUT1_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPOUT1_Set (1UL) /*!< Enable */ -/* Bit 12 : Write '1' to Enable interrupt for ENDEPOUT[0] event */ +/* Bit 12 : Write '1' to enable interrupt for ENDEPOUT[0] event */ #define USBD_INTENSET_ENDEPOUT0_Pos (12UL) /*!< Position of ENDEPOUT0 field. */ #define USBD_INTENSET_ENDEPOUT0_Msk (0x1UL << USBD_INTENSET_ENDEPOUT0_Pos) /*!< Bit mask of ENDEPOUT0 field. */ #define USBD_INTENSET_ENDEPOUT0_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPOUT0_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPOUT0_Set (1UL) /*!< Enable */ -/* Bit 11 : Write '1' to Enable interrupt for ENDISOIN event */ +/* Bit 11 : Write '1' to enable interrupt for ENDISOIN event */ #define USBD_INTENSET_ENDISOIN_Pos (11UL) /*!< Position of ENDISOIN field. */ #define USBD_INTENSET_ENDISOIN_Msk (0x1UL << USBD_INTENSET_ENDISOIN_Pos) /*!< Bit mask of ENDISOIN field. */ #define USBD_INTENSET_ENDISOIN_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDISOIN_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDISOIN_Set (1UL) /*!< Enable */ -/* Bit 10 : Write '1' to Enable interrupt for EP0DATADONE event */ +/* Bit 10 : Write '1' to enable interrupt for EP0DATADONE event */ #define USBD_INTENSET_EP0DATADONE_Pos (10UL) /*!< Position of EP0DATADONE field. */ #define USBD_INTENSET_EP0DATADONE_Msk (0x1UL << USBD_INTENSET_EP0DATADONE_Pos) /*!< Bit mask of EP0DATADONE field. */ #define USBD_INTENSET_EP0DATADONE_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_EP0DATADONE_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_EP0DATADONE_Set (1UL) /*!< Enable */ -/* Bit 9 : Write '1' to Enable interrupt for ENDEPIN[7] event */ +/* Bit 9 : Write '1' to enable interrupt for ENDEPIN[7] event */ #define USBD_INTENSET_ENDEPIN7_Pos (9UL) /*!< Position of ENDEPIN7 field. */ #define USBD_INTENSET_ENDEPIN7_Msk (0x1UL << USBD_INTENSET_ENDEPIN7_Pos) /*!< Bit mask of ENDEPIN7 field. */ #define USBD_INTENSET_ENDEPIN7_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPIN7_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPIN7_Set (1UL) /*!< Enable */ -/* Bit 8 : Write '1' to Enable interrupt for ENDEPIN[6] event */ +/* Bit 8 : Write '1' to enable interrupt for ENDEPIN[6] event */ #define USBD_INTENSET_ENDEPIN6_Pos (8UL) /*!< Position of ENDEPIN6 field. */ #define USBD_INTENSET_ENDEPIN6_Msk (0x1UL << USBD_INTENSET_ENDEPIN6_Pos) /*!< Bit mask of ENDEPIN6 field. */ #define USBD_INTENSET_ENDEPIN6_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPIN6_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPIN6_Set (1UL) /*!< Enable */ -/* Bit 7 : Write '1' to Enable interrupt for ENDEPIN[5] event */ +/* Bit 7 : Write '1' to enable interrupt for ENDEPIN[5] event */ #define USBD_INTENSET_ENDEPIN5_Pos (7UL) /*!< Position of ENDEPIN5 field. */ #define USBD_INTENSET_ENDEPIN5_Msk (0x1UL << USBD_INTENSET_ENDEPIN5_Pos) /*!< Bit mask of ENDEPIN5 field. */ #define USBD_INTENSET_ENDEPIN5_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPIN5_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPIN5_Set (1UL) /*!< Enable */ -/* Bit 6 : Write '1' to Enable interrupt for ENDEPIN[4] event */ +/* Bit 6 : Write '1' to enable interrupt for ENDEPIN[4] event */ #define USBD_INTENSET_ENDEPIN4_Pos (6UL) /*!< Position of ENDEPIN4 field. */ #define USBD_INTENSET_ENDEPIN4_Msk (0x1UL << USBD_INTENSET_ENDEPIN4_Pos) /*!< Bit mask of ENDEPIN4 field. */ #define USBD_INTENSET_ENDEPIN4_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPIN4_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPIN4_Set (1UL) /*!< Enable */ -/* Bit 5 : Write '1' to Enable interrupt for ENDEPIN[3] event */ +/* Bit 5 : Write '1' to enable interrupt for ENDEPIN[3] event */ #define USBD_INTENSET_ENDEPIN3_Pos (5UL) /*!< Position of ENDEPIN3 field. */ #define USBD_INTENSET_ENDEPIN3_Msk (0x1UL << USBD_INTENSET_ENDEPIN3_Pos) /*!< Bit mask of ENDEPIN3 field. */ #define USBD_INTENSET_ENDEPIN3_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPIN3_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPIN3_Set (1UL) /*!< Enable */ -/* Bit 4 : Write '1' to Enable interrupt for ENDEPIN[2] event */ +/* Bit 4 : Write '1' to enable interrupt for ENDEPIN[2] event */ #define USBD_INTENSET_ENDEPIN2_Pos (4UL) /*!< Position of ENDEPIN2 field. */ #define USBD_INTENSET_ENDEPIN2_Msk (0x1UL << USBD_INTENSET_ENDEPIN2_Pos) /*!< Bit mask of ENDEPIN2 field. */ #define USBD_INTENSET_ENDEPIN2_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPIN2_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPIN2_Set (1UL) /*!< Enable */ -/* Bit 3 : Write '1' to Enable interrupt for ENDEPIN[1] event */ +/* Bit 3 : Write '1' to enable interrupt for ENDEPIN[1] event */ #define USBD_INTENSET_ENDEPIN1_Pos (3UL) /*!< Position of ENDEPIN1 field. */ #define USBD_INTENSET_ENDEPIN1_Msk (0x1UL << USBD_INTENSET_ENDEPIN1_Pos) /*!< Bit mask of ENDEPIN1 field. */ #define USBD_INTENSET_ENDEPIN1_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPIN1_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPIN1_Set (1UL) /*!< Enable */ -/* Bit 2 : Write '1' to Enable interrupt for ENDEPIN[0] event */ +/* Bit 2 : Write '1' to enable interrupt for ENDEPIN[0] event */ #define USBD_INTENSET_ENDEPIN0_Pos (2UL) /*!< Position of ENDEPIN0 field. */ #define USBD_INTENSET_ENDEPIN0_Msk (0x1UL << USBD_INTENSET_ENDEPIN0_Pos) /*!< Bit mask of ENDEPIN0 field. */ #define USBD_INTENSET_ENDEPIN0_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_ENDEPIN0_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_ENDEPIN0_Set (1UL) /*!< Enable */ -/* Bit 1 : Write '1' to Enable interrupt for STARTED event */ +/* Bit 1 : Write '1' to enable interrupt for STARTED event */ #define USBD_INTENSET_STARTED_Pos (1UL) /*!< Position of STARTED field. */ #define USBD_INTENSET_STARTED_Msk (0x1UL << USBD_INTENSET_STARTED_Pos) /*!< Bit mask of STARTED field. */ #define USBD_INTENSET_STARTED_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENSET_STARTED_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENSET_STARTED_Set (1UL) /*!< Enable */ -/* Bit 0 : Write '1' to Enable interrupt for USBRESET event */ +/* Bit 0 : Write '1' to enable interrupt for USBRESET event */ #define USBD_INTENSET_USBRESET_Pos (0UL) /*!< Position of USBRESET field. */ #define USBD_INTENSET_USBRESET_Msk (0x1UL << USBD_INTENSET_USBRESET_Pos) /*!< Bit mask of USBRESET field. */ #define USBD_INTENSET_USBRESET_Disabled (0UL) /*!< Read: Disabled */ @@ -13770,182 +15897,175 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: USBD_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 25 : Write '1' to Disable interrupt for ACCESSFAULT event */ -#define USBD_INTENCLR_ACCESSFAULT_Pos (25UL) /*!< Position of ACCESSFAULT field. */ -#define USBD_INTENCLR_ACCESSFAULT_Msk (0x1UL << USBD_INTENCLR_ACCESSFAULT_Pos) /*!< Bit mask of ACCESSFAULT field. */ -#define USBD_INTENCLR_ACCESSFAULT_Disabled (0UL) /*!< Read: Disabled */ -#define USBD_INTENCLR_ACCESSFAULT_Enabled (1UL) /*!< Read: Enabled */ -#define USBD_INTENCLR_ACCESSFAULT_Clear (1UL) /*!< Disable */ - -/* Bit 24 : Write '1' to Disable interrupt for EPDATA event */ +/* Bit 24 : Write '1' to disable interrupt for EPDATA event */ #define USBD_INTENCLR_EPDATA_Pos (24UL) /*!< Position of EPDATA field. */ #define USBD_INTENCLR_EPDATA_Msk (0x1UL << USBD_INTENCLR_EPDATA_Pos) /*!< Bit mask of EPDATA field. */ #define USBD_INTENCLR_EPDATA_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_EPDATA_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_EPDATA_Clear (1UL) /*!< Disable */ -/* Bit 23 : Write '1' to Disable interrupt for EP0SETUP event */ +/* Bit 23 : Write '1' to disable interrupt for EP0SETUP event */ #define USBD_INTENCLR_EP0SETUP_Pos (23UL) /*!< Position of EP0SETUP field. */ #define USBD_INTENCLR_EP0SETUP_Msk (0x1UL << USBD_INTENCLR_EP0SETUP_Pos) /*!< Bit mask of EP0SETUP field. */ #define USBD_INTENCLR_EP0SETUP_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_EP0SETUP_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_EP0SETUP_Clear (1UL) /*!< Disable */ -/* Bit 22 : Write '1' to Disable interrupt for USBEVENT event */ +/* Bit 22 : Write '1' to disable interrupt for USBEVENT event */ #define USBD_INTENCLR_USBEVENT_Pos (22UL) /*!< Position of USBEVENT field. */ #define USBD_INTENCLR_USBEVENT_Msk (0x1UL << USBD_INTENCLR_USBEVENT_Pos) /*!< Bit mask of USBEVENT field. */ #define USBD_INTENCLR_USBEVENT_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_USBEVENT_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_USBEVENT_Clear (1UL) /*!< Disable */ -/* Bit 21 : Write '1' to Disable interrupt for SOF event */ +/* Bit 21 : Write '1' to disable interrupt for SOF event */ #define USBD_INTENCLR_SOF_Pos (21UL) /*!< Position of SOF field. */ #define USBD_INTENCLR_SOF_Msk (0x1UL << USBD_INTENCLR_SOF_Pos) /*!< Bit mask of SOF field. */ #define USBD_INTENCLR_SOF_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_SOF_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_SOF_Clear (1UL) /*!< Disable */ -/* Bit 20 : Write '1' to Disable interrupt for ENDISOOUT event */ +/* Bit 20 : Write '1' to disable interrupt for ENDISOOUT event */ #define USBD_INTENCLR_ENDISOOUT_Pos (20UL) /*!< Position of ENDISOOUT field. */ #define USBD_INTENCLR_ENDISOOUT_Msk (0x1UL << USBD_INTENCLR_ENDISOOUT_Pos) /*!< Bit mask of ENDISOOUT field. */ #define USBD_INTENCLR_ENDISOOUT_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDISOOUT_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDISOOUT_Clear (1UL) /*!< Disable */ -/* Bit 19 : Write '1' to Disable interrupt for ENDEPOUT[7] event */ +/* Bit 19 : Write '1' to disable interrupt for ENDEPOUT[7] event */ #define USBD_INTENCLR_ENDEPOUT7_Pos (19UL) /*!< Position of ENDEPOUT7 field. */ #define USBD_INTENCLR_ENDEPOUT7_Msk (0x1UL << USBD_INTENCLR_ENDEPOUT7_Pos) /*!< Bit mask of ENDEPOUT7 field. */ #define USBD_INTENCLR_ENDEPOUT7_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPOUT7_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPOUT7_Clear (1UL) /*!< Disable */ -/* Bit 18 : Write '1' to Disable interrupt for ENDEPOUT[6] event */ +/* Bit 18 : Write '1' to disable interrupt for ENDEPOUT[6] event */ #define USBD_INTENCLR_ENDEPOUT6_Pos (18UL) /*!< Position of ENDEPOUT6 field. */ #define USBD_INTENCLR_ENDEPOUT6_Msk (0x1UL << USBD_INTENCLR_ENDEPOUT6_Pos) /*!< Bit mask of ENDEPOUT6 field. */ #define USBD_INTENCLR_ENDEPOUT6_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPOUT6_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPOUT6_Clear (1UL) /*!< Disable */ -/* Bit 17 : Write '1' to Disable interrupt for ENDEPOUT[5] event */ +/* Bit 17 : Write '1' to disable interrupt for ENDEPOUT[5] event */ #define USBD_INTENCLR_ENDEPOUT5_Pos (17UL) /*!< Position of ENDEPOUT5 field. */ #define USBD_INTENCLR_ENDEPOUT5_Msk (0x1UL << USBD_INTENCLR_ENDEPOUT5_Pos) /*!< Bit mask of ENDEPOUT5 field. */ #define USBD_INTENCLR_ENDEPOUT5_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPOUT5_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPOUT5_Clear (1UL) /*!< Disable */ -/* Bit 16 : Write '1' to Disable interrupt for ENDEPOUT[4] event */ +/* Bit 16 : Write '1' to disable interrupt for ENDEPOUT[4] event */ #define USBD_INTENCLR_ENDEPOUT4_Pos (16UL) /*!< Position of ENDEPOUT4 field. */ #define USBD_INTENCLR_ENDEPOUT4_Msk (0x1UL << USBD_INTENCLR_ENDEPOUT4_Pos) /*!< Bit mask of ENDEPOUT4 field. */ #define USBD_INTENCLR_ENDEPOUT4_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPOUT4_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPOUT4_Clear (1UL) /*!< Disable */ -/* Bit 15 : Write '1' to Disable interrupt for ENDEPOUT[3] event */ +/* Bit 15 : Write '1' to disable interrupt for ENDEPOUT[3] event */ #define USBD_INTENCLR_ENDEPOUT3_Pos (15UL) /*!< Position of ENDEPOUT3 field. */ #define USBD_INTENCLR_ENDEPOUT3_Msk (0x1UL << USBD_INTENCLR_ENDEPOUT3_Pos) /*!< Bit mask of ENDEPOUT3 field. */ #define USBD_INTENCLR_ENDEPOUT3_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPOUT3_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPOUT3_Clear (1UL) /*!< Disable */ -/* Bit 14 : Write '1' to Disable interrupt for ENDEPOUT[2] event */ +/* Bit 14 : Write '1' to disable interrupt for ENDEPOUT[2] event */ #define USBD_INTENCLR_ENDEPOUT2_Pos (14UL) /*!< Position of ENDEPOUT2 field. */ #define USBD_INTENCLR_ENDEPOUT2_Msk (0x1UL << USBD_INTENCLR_ENDEPOUT2_Pos) /*!< Bit mask of ENDEPOUT2 field. */ #define USBD_INTENCLR_ENDEPOUT2_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPOUT2_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPOUT2_Clear (1UL) /*!< Disable */ -/* Bit 13 : Write '1' to Disable interrupt for ENDEPOUT[1] event */ +/* Bit 13 : Write '1' to disable interrupt for ENDEPOUT[1] event */ #define USBD_INTENCLR_ENDEPOUT1_Pos (13UL) /*!< Position of ENDEPOUT1 field. */ #define USBD_INTENCLR_ENDEPOUT1_Msk (0x1UL << USBD_INTENCLR_ENDEPOUT1_Pos) /*!< Bit mask of ENDEPOUT1 field. */ #define USBD_INTENCLR_ENDEPOUT1_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPOUT1_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPOUT1_Clear (1UL) /*!< Disable */ -/* Bit 12 : Write '1' to Disable interrupt for ENDEPOUT[0] event */ +/* Bit 12 : Write '1' to disable interrupt for ENDEPOUT[0] event */ #define USBD_INTENCLR_ENDEPOUT0_Pos (12UL) /*!< Position of ENDEPOUT0 field. */ #define USBD_INTENCLR_ENDEPOUT0_Msk (0x1UL << USBD_INTENCLR_ENDEPOUT0_Pos) /*!< Bit mask of ENDEPOUT0 field. */ #define USBD_INTENCLR_ENDEPOUT0_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPOUT0_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPOUT0_Clear (1UL) /*!< Disable */ -/* Bit 11 : Write '1' to Disable interrupt for ENDISOIN event */ +/* Bit 11 : Write '1' to disable interrupt for ENDISOIN event */ #define USBD_INTENCLR_ENDISOIN_Pos (11UL) /*!< Position of ENDISOIN field. */ #define USBD_INTENCLR_ENDISOIN_Msk (0x1UL << USBD_INTENCLR_ENDISOIN_Pos) /*!< Bit mask of ENDISOIN field. */ #define USBD_INTENCLR_ENDISOIN_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDISOIN_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDISOIN_Clear (1UL) /*!< Disable */ -/* Bit 10 : Write '1' to Disable interrupt for EP0DATADONE event */ +/* Bit 10 : Write '1' to disable interrupt for EP0DATADONE event */ #define USBD_INTENCLR_EP0DATADONE_Pos (10UL) /*!< Position of EP0DATADONE field. */ #define USBD_INTENCLR_EP0DATADONE_Msk (0x1UL << USBD_INTENCLR_EP0DATADONE_Pos) /*!< Bit mask of EP0DATADONE field. */ #define USBD_INTENCLR_EP0DATADONE_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_EP0DATADONE_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_EP0DATADONE_Clear (1UL) /*!< Disable */ -/* Bit 9 : Write '1' to Disable interrupt for ENDEPIN[7] event */ +/* Bit 9 : Write '1' to disable interrupt for ENDEPIN[7] event */ #define USBD_INTENCLR_ENDEPIN7_Pos (9UL) /*!< Position of ENDEPIN7 field. */ #define USBD_INTENCLR_ENDEPIN7_Msk (0x1UL << USBD_INTENCLR_ENDEPIN7_Pos) /*!< Bit mask of ENDEPIN7 field. */ #define USBD_INTENCLR_ENDEPIN7_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPIN7_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPIN7_Clear (1UL) /*!< Disable */ -/* Bit 8 : Write '1' to Disable interrupt for ENDEPIN[6] event */ +/* Bit 8 : Write '1' to disable interrupt for ENDEPIN[6] event */ #define USBD_INTENCLR_ENDEPIN6_Pos (8UL) /*!< Position of ENDEPIN6 field. */ #define USBD_INTENCLR_ENDEPIN6_Msk (0x1UL << USBD_INTENCLR_ENDEPIN6_Pos) /*!< Bit mask of ENDEPIN6 field. */ #define USBD_INTENCLR_ENDEPIN6_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPIN6_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPIN6_Clear (1UL) /*!< Disable */ -/* Bit 7 : Write '1' to Disable interrupt for ENDEPIN[5] event */ +/* Bit 7 : Write '1' to disable interrupt for ENDEPIN[5] event */ #define USBD_INTENCLR_ENDEPIN5_Pos (7UL) /*!< Position of ENDEPIN5 field. */ #define USBD_INTENCLR_ENDEPIN5_Msk (0x1UL << USBD_INTENCLR_ENDEPIN5_Pos) /*!< Bit mask of ENDEPIN5 field. */ #define USBD_INTENCLR_ENDEPIN5_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPIN5_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPIN5_Clear (1UL) /*!< Disable */ -/* Bit 6 : Write '1' to Disable interrupt for ENDEPIN[4] event */ +/* Bit 6 : Write '1' to disable interrupt for ENDEPIN[4] event */ #define USBD_INTENCLR_ENDEPIN4_Pos (6UL) /*!< Position of ENDEPIN4 field. */ #define USBD_INTENCLR_ENDEPIN4_Msk (0x1UL << USBD_INTENCLR_ENDEPIN4_Pos) /*!< Bit mask of ENDEPIN4 field. */ #define USBD_INTENCLR_ENDEPIN4_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPIN4_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPIN4_Clear (1UL) /*!< Disable */ -/* Bit 5 : Write '1' to Disable interrupt for ENDEPIN[3] event */ +/* Bit 5 : Write '1' to disable interrupt for ENDEPIN[3] event */ #define USBD_INTENCLR_ENDEPIN3_Pos (5UL) /*!< Position of ENDEPIN3 field. */ #define USBD_INTENCLR_ENDEPIN3_Msk (0x1UL << USBD_INTENCLR_ENDEPIN3_Pos) /*!< Bit mask of ENDEPIN3 field. */ #define USBD_INTENCLR_ENDEPIN3_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPIN3_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPIN3_Clear (1UL) /*!< Disable */ -/* Bit 4 : Write '1' to Disable interrupt for ENDEPIN[2] event */ +/* Bit 4 : Write '1' to disable interrupt for ENDEPIN[2] event */ #define USBD_INTENCLR_ENDEPIN2_Pos (4UL) /*!< Position of ENDEPIN2 field. */ #define USBD_INTENCLR_ENDEPIN2_Msk (0x1UL << USBD_INTENCLR_ENDEPIN2_Pos) /*!< Bit mask of ENDEPIN2 field. */ #define USBD_INTENCLR_ENDEPIN2_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPIN2_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPIN2_Clear (1UL) /*!< Disable */ -/* Bit 3 : Write '1' to Disable interrupt for ENDEPIN[1] event */ +/* Bit 3 : Write '1' to disable interrupt for ENDEPIN[1] event */ #define USBD_INTENCLR_ENDEPIN1_Pos (3UL) /*!< Position of ENDEPIN1 field. */ #define USBD_INTENCLR_ENDEPIN1_Msk (0x1UL << USBD_INTENCLR_ENDEPIN1_Pos) /*!< Bit mask of ENDEPIN1 field. */ #define USBD_INTENCLR_ENDEPIN1_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPIN1_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPIN1_Clear (1UL) /*!< Disable */ -/* Bit 2 : Write '1' to Disable interrupt for ENDEPIN[0] event */ +/* Bit 2 : Write '1' to disable interrupt for ENDEPIN[0] event */ #define USBD_INTENCLR_ENDEPIN0_Pos (2UL) /*!< Position of ENDEPIN0 field. */ #define USBD_INTENCLR_ENDEPIN0_Msk (0x1UL << USBD_INTENCLR_ENDEPIN0_Pos) /*!< Bit mask of ENDEPIN0 field. */ #define USBD_INTENCLR_ENDEPIN0_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_ENDEPIN0_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_ENDEPIN0_Clear (1UL) /*!< Disable */ -/* Bit 1 : Write '1' to Disable interrupt for STARTED event */ +/* Bit 1 : Write '1' to disable interrupt for STARTED event */ #define USBD_INTENCLR_STARTED_Pos (1UL) /*!< Position of STARTED field. */ #define USBD_INTENCLR_STARTED_Msk (0x1UL << USBD_INTENCLR_STARTED_Pos) /*!< Bit mask of STARTED field. */ #define USBD_INTENCLR_STARTED_Disabled (0UL) /*!< Read: Disabled */ #define USBD_INTENCLR_STARTED_Enabled (1UL) /*!< Read: Enabled */ #define USBD_INTENCLR_STARTED_Clear (1UL) /*!< Disable */ -/* Bit 0 : Write '1' to Disable interrupt for USBRESET event */ +/* Bit 0 : Write '1' to disable interrupt for USBRESET event */ #define USBD_INTENCLR_USBRESET_Pos (0UL) /*!< Position of USBRESET field. */ #define USBD_INTENCLR_USBRESET_Msk (0x1UL << USBD_INTENCLR_USBRESET_Pos) /*!< Bit mask of USBRESET field. */ #define USBD_INTENCLR_USBRESET_Disabled (0UL) /*!< Read: Disabled */ @@ -13953,21 +16073,27 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define USBD_INTENCLR_USBRESET_Clear (1UL) /*!< Disable */ /* Register: USBD_EVENTCAUSE */ -/* Description: Details on event that caused the USBEVENT event */ +/* Description: Details on what caused the USBEVENT event */ -/* Bit 11 : Wrapper has re-initialized SFRs to the proper values. MAC is ready for normal operation. Write '1' to clear. */ +/* Bit 11 : USB device is ready for normal operation. Write '1' to clear. */ #define USBD_EVENTCAUSE_READY_Pos (11UL) /*!< Position of READY field. */ #define USBD_EVENTCAUSE_READY_Msk (0x1UL << USBD_EVENTCAUSE_READY_Pos) /*!< Bit mask of READY field. */ #define USBD_EVENTCAUSE_READY_NotDetected (0UL) /*!< USBEVENT was not issued due to USBD peripheral ready */ #define USBD_EVENTCAUSE_READY_Ready (1UL) /*!< USBD peripheral is ready */ -/* Bit 9 : Signals that a RESUME condition (K state or activity restart) has been detected on the USB lines. Write '1' to clear. */ +/* Bit 10 : USB MAC has been woken up and operational. Write '1' to clear. */ +#define USBD_EVENTCAUSE_USBWUALLOWED_Pos (10UL) /*!< Position of USBWUALLOWED field. */ +#define USBD_EVENTCAUSE_USBWUALLOWED_Msk (0x1UL << USBD_EVENTCAUSE_USBWUALLOWED_Pos) /*!< Bit mask of USBWUALLOWED field. */ +#define USBD_EVENTCAUSE_USBWUALLOWED_NotAllowed (0UL) /*!< Wake up not allowed */ +#define USBD_EVENTCAUSE_USBWUALLOWED_Allowed (1UL) /*!< Wake up allowed */ + +/* Bit 9 : Signals that a RESUME condition (K state or activity restart) has been detected on USB lines. Write '1' to clear. */ #define USBD_EVENTCAUSE_RESUME_Pos (9UL) /*!< Position of RESUME field. */ #define USBD_EVENTCAUSE_RESUME_Msk (0x1UL << USBD_EVENTCAUSE_RESUME_Pos) /*!< Bit mask of RESUME field. */ #define USBD_EVENTCAUSE_RESUME_NotDetected (0UL) /*!< Resume not detected */ #define USBD_EVENTCAUSE_RESUME_Detected (1UL) /*!< Resume detected */ -/* Bit 8 : Signals that the USB lines have been seen idle long enough for the device to enter suspend. Write '1' to clear. */ +/* Bit 8 : Signals that USB lines have been idle long enough for the device to enter suspend. Write '1' to clear. */ #define USBD_EVENTCAUSE_SUSPEND_Pos (8UL) /*!< Position of SUSPEND field. */ #define USBD_EVENTCAUSE_SUSPEND_Msk (0x1UL << USBD_EVENTCAUSE_SUSPEND_Pos) /*!< Bit mask of SUSPEND field. */ #define USBD_EVENTCAUSE_SUSPEND_NotDetected (0UL) /*!< Suspend not detected */ @@ -13979,23 +16105,8 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define USBD_EVENTCAUSE_ISOOUTCRC_NotDetected (0UL) /*!< No error detected */ #define USBD_EVENTCAUSE_ISOOUTCRC_Detected (1UL) /*!< Error detected */ -/* Register: USBD_BUSSTATE */ -/* Description: Provides the logic state of the D+ and D- lines */ - -/* Bit 1 : State of the D+ line */ -#define USBD_BUSSTATE_DP_Pos (1UL) /*!< Position of DP field. */ -#define USBD_BUSSTATE_DP_Msk (0x1UL << USBD_BUSSTATE_DP_Pos) /*!< Bit mask of DP field. */ -#define USBD_BUSSTATE_DP_Low (0UL) /*!< Low */ -#define USBD_BUSSTATE_DP_High (1UL) /*!< High */ - -/* Bit 0 : State of the D- line */ -#define USBD_BUSSTATE_DM_Pos (0UL) /*!< Position of DM field. */ -#define USBD_BUSSTATE_DM_Msk (0x1UL << USBD_BUSSTATE_DM_Pos) /*!< Bit mask of DM field. */ -#define USBD_BUSSTATE_DM_Low (0UL) /*!< Low */ -#define USBD_BUSSTATE_DM_High (1UL) /*!< High */ - /* Register: USBD_HALTED_EPIN */ -/* Description: Description collection[0]: IN endpoint halted status. Can be used as is as response to a GetStatus() request to endpoint. */ +/* Description: Description collection[n]: IN endpoint halted status. Can be used as is as response to a GetStatus() request to endpoint. */ /* Bits 15..0 : IN endpoint halted status. Can be used as is as response to a GetStatus() request to endpoint. */ #define USBD_HALTED_EPIN_GETSTATUS_Pos (0UL) /*!< Position of GETSTATUS field. */ @@ -14004,7 +16115,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define USBD_HALTED_EPIN_GETSTATUS_Halted (1UL) /*!< Endpoint is halted */ /* Register: USBD_HALTED_EPOUT */ -/* Description: Description collection[0]: OUT endpoint halted status. Can be used as is as response to a GetStatus() request to endpoint. */ +/* Description: Description collection[n]: OUT endpoint halted status. Can be used as is as response to a GetStatus() request to endpoint. */ /* Bits 15..0 : OUT endpoint halted status. Can be used as is as response to a GetStatus() request to endpoint. */ #define USBD_HALTED_EPOUT_GETSTATUS_Pos (0UL) /*!< Position of GETSTATUS field. */ @@ -14015,109 +16126,109 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: USBD_EPSTATUS */ /* Description: Provides information on which endpoint's EasyDMA registers have been captured */ -/* Bit 24 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 24 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPOUT8_Pos (24UL) /*!< Position of EPOUT8 field. */ #define USBD_EPSTATUS_EPOUT8_Msk (0x1UL << USBD_EPSTATUS_EPOUT8_Pos) /*!< Bit mask of EPOUT8 field. */ #define USBD_EPSTATUS_EPOUT8_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPOUT8_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 23 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 23 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPOUT7_Pos (23UL) /*!< Position of EPOUT7 field. */ #define USBD_EPSTATUS_EPOUT7_Msk (0x1UL << USBD_EPSTATUS_EPOUT7_Pos) /*!< Bit mask of EPOUT7 field. */ #define USBD_EPSTATUS_EPOUT7_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPOUT7_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 22 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 22 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPOUT6_Pos (22UL) /*!< Position of EPOUT6 field. */ #define USBD_EPSTATUS_EPOUT6_Msk (0x1UL << USBD_EPSTATUS_EPOUT6_Pos) /*!< Bit mask of EPOUT6 field. */ #define USBD_EPSTATUS_EPOUT6_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPOUT6_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 21 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 21 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPOUT5_Pos (21UL) /*!< Position of EPOUT5 field. */ #define USBD_EPSTATUS_EPOUT5_Msk (0x1UL << USBD_EPSTATUS_EPOUT5_Pos) /*!< Bit mask of EPOUT5 field. */ #define USBD_EPSTATUS_EPOUT5_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPOUT5_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 20 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 20 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPOUT4_Pos (20UL) /*!< Position of EPOUT4 field. */ #define USBD_EPSTATUS_EPOUT4_Msk (0x1UL << USBD_EPSTATUS_EPOUT4_Pos) /*!< Bit mask of EPOUT4 field. */ #define USBD_EPSTATUS_EPOUT4_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPOUT4_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 19 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 19 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPOUT3_Pos (19UL) /*!< Position of EPOUT3 field. */ #define USBD_EPSTATUS_EPOUT3_Msk (0x1UL << USBD_EPSTATUS_EPOUT3_Pos) /*!< Bit mask of EPOUT3 field. */ #define USBD_EPSTATUS_EPOUT3_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPOUT3_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 18 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 18 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPOUT2_Pos (18UL) /*!< Position of EPOUT2 field. */ #define USBD_EPSTATUS_EPOUT2_Msk (0x1UL << USBD_EPSTATUS_EPOUT2_Pos) /*!< Bit mask of EPOUT2 field. */ #define USBD_EPSTATUS_EPOUT2_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPOUT2_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 17 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 17 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPOUT1_Pos (17UL) /*!< Position of EPOUT1 field. */ #define USBD_EPSTATUS_EPOUT1_Msk (0x1UL << USBD_EPSTATUS_EPOUT1_Pos) /*!< Bit mask of EPOUT1 field. */ #define USBD_EPSTATUS_EPOUT1_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPOUT1_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 16 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 16 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPOUT0_Pos (16UL) /*!< Position of EPOUT0 field. */ #define USBD_EPSTATUS_EPOUT0_Msk (0x1UL << USBD_EPSTATUS_EPOUT0_Pos) /*!< Bit mask of EPOUT0 field. */ #define USBD_EPSTATUS_EPOUT0_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPOUT0_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 8 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 8 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPIN8_Pos (8UL) /*!< Position of EPIN8 field. */ #define USBD_EPSTATUS_EPIN8_Msk (0x1UL << USBD_EPSTATUS_EPIN8_Pos) /*!< Bit mask of EPIN8 field. */ #define USBD_EPSTATUS_EPIN8_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPIN8_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 7 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 7 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPIN7_Pos (7UL) /*!< Position of EPIN7 field. */ #define USBD_EPSTATUS_EPIN7_Msk (0x1UL << USBD_EPSTATUS_EPIN7_Pos) /*!< Bit mask of EPIN7 field. */ #define USBD_EPSTATUS_EPIN7_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPIN7_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 6 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 6 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPIN6_Pos (6UL) /*!< Position of EPIN6 field. */ #define USBD_EPSTATUS_EPIN6_Msk (0x1UL << USBD_EPSTATUS_EPIN6_Pos) /*!< Bit mask of EPIN6 field. */ #define USBD_EPSTATUS_EPIN6_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPIN6_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 5 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 5 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPIN5_Pos (5UL) /*!< Position of EPIN5 field. */ #define USBD_EPSTATUS_EPIN5_Msk (0x1UL << USBD_EPSTATUS_EPIN5_Pos) /*!< Bit mask of EPIN5 field. */ #define USBD_EPSTATUS_EPIN5_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPIN5_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 4 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 4 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPIN4_Pos (4UL) /*!< Position of EPIN4 field. */ #define USBD_EPSTATUS_EPIN4_Msk (0x1UL << USBD_EPSTATUS_EPIN4_Pos) /*!< Bit mask of EPIN4 field. */ #define USBD_EPSTATUS_EPIN4_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPIN4_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 3 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 3 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPIN3_Pos (3UL) /*!< Position of EPIN3 field. */ #define USBD_EPSTATUS_EPIN3_Msk (0x1UL << USBD_EPSTATUS_EPIN3_Pos) /*!< Bit mask of EPIN3 field. */ #define USBD_EPSTATUS_EPIN3_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPIN3_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 2 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 2 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPIN2_Pos (2UL) /*!< Position of EPIN2 field. */ #define USBD_EPSTATUS_EPIN2_Msk (0x1UL << USBD_EPSTATUS_EPIN2_Pos) /*!< Bit mask of EPIN2 field. */ #define USBD_EPSTATUS_EPIN2_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPIN2_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 1 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 1 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPIN1_Pos (1UL) /*!< Position of EPIN1 field. */ #define USBD_EPSTATUS_EPIN1_Msk (0x1UL << USBD_EPSTATUS_EPIN1_Pos) /*!< Bit mask of EPIN1 field. */ #define USBD_EPSTATUS_EPIN1_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ #define USBD_EPSTATUS_EPIN1_DataDone (1UL) /*!< EasyDMA registers have been captured for this endpoint */ -/* Bit 0 : Endpoint's EasyDMA registers captured state. Write '1' to clear. */ +/* Bit 0 : Captured state of endpoint's EasyDMA registers. Write '1' to clear. */ #define USBD_EPSTATUS_EPIN0_Pos (0UL) /*!< Position of EPIN0 field. */ #define USBD_EPSTATUS_EPIN0_Msk (0x1UL << USBD_EPSTATUS_EPIN0_Pos) /*!< Bit mask of EPIN0 field. */ #define USBD_EPSTATUS_EPIN0_NoData (0UL) /*!< EasyDMA registers have not been captured for this endpoint */ @@ -14244,7 +16355,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: USBD_BREQUEST */ /* Description: SETUP data, byte 1, bRequest */ -/* Bits 7..0 : SETUP data, byte 1, bRequest. Values provides for standard requests only, user must implement Class and Vendor values. */ +/* Bits 7..0 : SETUP data, byte 1, bRequest. Values provided for standard requests only, user must implement class and vendor values. */ #define USBD_BREQUEST_BREQUEST_Pos (0UL) /*!< Position of BREQUEST field. */ #define USBD_BREQUEST_BREQUEST_Msk (0xFFUL << USBD_BREQUEST_BREQUEST_Pos) /*!< Bit mask of BREQUEST field. */ #define USBD_BREQUEST_BREQUEST_STD_GET_STATUS (0UL) /*!< Standard request GET_STATUS */ @@ -14302,14 +16413,14 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define USBD_WLENGTHH_WLENGTHH_Msk (0xFFUL << USBD_WLENGTHH_WLENGTHH_Pos) /*!< Bit mask of WLENGTHH field. */ /* Register: USBD_SIZE_EPOUT */ -/* Description: Description collection[0]: Amount of bytes received last in the data stage of this OUT endpoint */ +/* Description: Description collection[n]: Number of bytes received last in the data stage of this OUT endpoint */ -/* Bits 6..0 : Amount of bytes received last in the data stage of this OUT endpoint */ +/* Bits 6..0 : Number of bytes received last in the data stage of this OUT endpoint */ #define USBD_SIZE_EPOUT_SIZE_Pos (0UL) /*!< Position of SIZE field. */ #define USBD_SIZE_EPOUT_SIZE_Msk (0x7FUL << USBD_SIZE_EPOUT_SIZE_Pos) /*!< Bit mask of SIZE field. */ /* Register: USBD_SIZE_ISOOUT */ -/* Description: Amount of bytes received last on this iso OUT data endpoint */ +/* Description: Number of bytes received last on this ISO OUT data endpoint */ /* Bit 16 : Zero-length data packet received */ #define USBD_SIZE_ISOOUT_ZERO_Pos (16UL) /*!< Position of ZERO field. */ @@ -14317,7 +16428,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define USBD_SIZE_ISOOUT_ZERO_Normal (0UL) /*!< No zero-length data received, use value in SIZE */ #define USBD_SIZE_ISOOUT_ZERO_ZeroData (1UL) /*!< Zero-length data received, ignore value in SIZE */ -/* Bits 9..0 : Amount of bytes received last on this iso OUT data endpoint */ +/* Bits 9..0 : Number of bytes received last on this ISO OUT data endpoint */ #define USBD_SIZE_ISOOUT_SIZE_Pos (0UL) /*!< Position of SIZE field. */ #define USBD_SIZE_ISOOUT_SIZE_Msk (0x3FFUL << USBD_SIZE_ISOOUT_SIZE_Pos) /*!< Bit mask of SIZE field. */ @@ -14340,17 +16451,17 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define USBD_USBPULLUP_CONNECT_Enabled (1UL) /*!< Pull-up is connected to D+ */ /* Register: USBD_DPDMVALUE */ -/* Description: State at which the DPDMDRIVE task will force D+ and D-. The DPDMNODRIVE task reverts the control of the lines to MAC IP (no forcing). */ +/* Description: State D+ and D- lines will be forced into by the DPDMDRIVE task. The DPDMNODRIVE task reverts the control of the lines to MAC IP (no forcing). */ -/* Bits 4..0 : State at which the DPDMDRIVE task will force D+ and D- */ +/* Bits 4..0 : State D+ and D- lines will be forced into by the DPDMDRIVE task */ #define USBD_DPDMVALUE_STATE_Pos (0UL) /*!< Position of STATE field. */ #define USBD_DPDMVALUE_STATE_Msk (0x1FUL << USBD_DPDMVALUE_STATE_Pos) /*!< Bit mask of STATE field. */ -#define USBD_DPDMVALUE_STATE_Resume (1UL) /*!< D+ forced low, D- forced high (K state) for a timing pre-set in hardware (50 us or 5 ms, depending on bus state) */ +#define USBD_DPDMVALUE_STATE_Resume (1UL) /*!< D+ forced low, D- forced high (K state) for a timing preset in hardware (50 us or 5 ms, depending on bus state) */ #define USBD_DPDMVALUE_STATE_J (2UL) /*!< D+ forced high, D- forced low (J state) */ #define USBD_DPDMVALUE_STATE_K (4UL) /*!< D+ forced low, D- forced high (K state) */ /* Register: USBD_DTOGGLE */ -/* Description: Data toggle control and status. */ +/* Description: Data toggle control and status */ /* Bits 9..8 : Data toggle value */ #define USBD_DTOGGLE_VALUE_Pos (8UL) /*!< Position of VALUE field. */ @@ -14372,11 +16483,11 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: USBD_EPINEN */ /* Description: Endpoint IN enable */ -/* Bit 8 : Enable iso IN endpoint */ +/* Bit 8 : Enable ISO IN endpoint */ #define USBD_EPINEN_ISOIN_Pos (8UL) /*!< Position of ISOIN field. */ #define USBD_EPINEN_ISOIN_Msk (0x1UL << USBD_EPINEN_ISOIN_Pos) /*!< Bit mask of ISOIN field. */ -#define USBD_EPINEN_ISOIN_Disable (0UL) /*!< Disable iso IN endpoint 8 */ -#define USBD_EPINEN_ISOIN_Enable (1UL) /*!< Enable iso IN endpoint 8 */ +#define USBD_EPINEN_ISOIN_Disable (0UL) /*!< Disable ISO IN endpoint 8 */ +#define USBD_EPINEN_ISOIN_Enable (1UL) /*!< Enable ISO IN endpoint 8 */ /* Bit 7 : Enable IN endpoint 7 */ #define USBD_EPINEN_IN7_Pos (7UL) /*!< Position of IN7 field. */ @@ -14429,11 +16540,11 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: USBD_EPOUTEN */ /* Description: Endpoint OUT enable */ -/* Bit 8 : Enable iso OUT endpoint 8 */ +/* Bit 8 : Enable ISO OUT endpoint 8 */ #define USBD_EPOUTEN_ISOOUT_Pos (8UL) /*!< Position of ISOOUT field. */ #define USBD_EPOUTEN_ISOOUT_Msk (0x1UL << USBD_EPOUTEN_ISOOUT_Pos) /*!< Bit mask of ISOOUT field. */ -#define USBD_EPOUTEN_ISOOUT_Disable (0UL) /*!< Disable iso OUT endpoint 8 */ -#define USBD_EPOUTEN_ISOOUT_Enable (1UL) /*!< Enable iso OUT endpoint 8 */ +#define USBD_EPOUTEN_ISOOUT_Disable (0UL) /*!< Disable ISO OUT endpoint 8 */ +#define USBD_EPOUTEN_ISOOUT_Enable (1UL) /*!< Enable ISO OUT endpoint 8 */ /* Bit 7 : Enable OUT endpoint 7 */ #define USBD_EPOUTEN_OUT7_Pos (7UL) /*!< Position of OUT7 field. */ @@ -14519,7 +16630,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define USBD_FRAMECNTR_FRAMECNTR_Msk (0x7FFUL << USBD_FRAMECNTR_FRAMECNTR_Pos) /*!< Bit mask of FRAMECNTR field. */ /* Register: USBD_LOWPOWER */ -/* Description: Controls USBD peripheral low-power mode during USB suspend */ +/* Description: Controls USBD peripheral low power mode during USB suspend */ /* Bit 0 : Controls USBD peripheral low-power mode during USB suspend */ #define USBD_LOWPOWER_LOWPOWER_Pos (0UL) /*!< Position of LOWPOWER field. */ @@ -14537,21 +16648,21 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define USBD_ISOINCONFIG_RESPONSE_ZeroData (1UL) /*!< Endpoint responds with a zero-length data packet in that case */ /* Register: USBD_EPIN_PTR */ -/* Description: Description cluster[0]: Data pointer */ +/* Description: Description cluster[n]: Data pointer */ /* Bits 31..0 : Data pointer. Accepts any address in Data RAM. */ #define USBD_EPIN_PTR_PTR_Pos (0UL) /*!< Position of PTR field. */ #define USBD_EPIN_PTR_PTR_Msk (0xFFFFFFFFUL << USBD_EPIN_PTR_PTR_Pos) /*!< Bit mask of PTR field. */ /* Register: USBD_EPIN_MAXCNT */ -/* Description: Description cluster[0]: Maximum number of bytes to transfer */ +/* Description: Description cluster[n]: Maximum number of bytes to transfer */ /* Bits 6..0 : Maximum number of bytes to transfer */ #define USBD_EPIN_MAXCNT_MAXCNT_Pos (0UL) /*!< Position of MAXCNT field. */ #define USBD_EPIN_MAXCNT_MAXCNT_Msk (0x7FUL << USBD_EPIN_MAXCNT_MAXCNT_Pos) /*!< Bit mask of MAXCNT field. */ /* Register: USBD_EPIN_AMOUNT */ -/* Description: Description cluster[0]: Number of bytes transferred in the last transaction */ +/* Description: Description cluster[n]: Number of bytes transferred in the last transaction */ /* Bits 6..0 : Number of bytes transferred in the last transaction */ #define USBD_EPIN_AMOUNT_AMOUNT_Pos (0UL) /*!< Position of AMOUNT field. */ @@ -14579,21 +16690,21 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define USBD_ISOIN_AMOUNT_AMOUNT_Msk (0x3FFUL << USBD_ISOIN_AMOUNT_AMOUNT_Pos) /*!< Bit mask of AMOUNT field. */ /* Register: USBD_EPOUT_PTR */ -/* Description: Description cluster[0]: Data pointer */ +/* Description: Description cluster[n]: Data pointer */ /* Bits 31..0 : Data pointer. Accepts any address in Data RAM. */ #define USBD_EPOUT_PTR_PTR_Pos (0UL) /*!< Position of PTR field. */ #define USBD_EPOUT_PTR_PTR_Msk (0xFFFFFFFFUL << USBD_EPOUT_PTR_PTR_Pos) /*!< Bit mask of PTR field. */ /* Register: USBD_EPOUT_MAXCNT */ -/* Description: Description cluster[0]: Maximum number of bytes to transfer */ +/* Description: Description cluster[n]: Maximum number of bytes to transfer */ /* Bits 6..0 : Maximum number of bytes to transfer */ #define USBD_EPOUT_MAXCNT_MAXCNT_Pos (0UL) /*!< Position of MAXCNT field. */ #define USBD_EPOUT_MAXCNT_MAXCNT_Msk (0x7FUL << USBD_EPOUT_MAXCNT_MAXCNT_Pos) /*!< Bit mask of MAXCNT field. */ /* Register: USBD_EPOUT_AMOUNT */ -/* Description: Description cluster[0]: Number of bytes transferred in the last transaction */ +/* Description: Description cluster[n]: Number of bytes transferred in the last transaction */ /* Bits 6..0 : Number of bytes transferred in the last transaction */ #define USBD_EPOUT_AMOUNT_AMOUNT_Pos (0UL) /*!< Position of AMOUNT field. */ @@ -14624,10 +16735,24 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Peripheral: WDT */ /* Description: Watchdog Timer */ +/* Register: WDT_TASKS_START */ +/* Description: Start the watchdog */ + +/* Bit 0 : */ +#define WDT_TASKS_START_TASKS_START_Pos (0UL) /*!< Position of TASKS_START field. */ +#define WDT_TASKS_START_TASKS_START_Msk (0x1UL << WDT_TASKS_START_TASKS_START_Pos) /*!< Bit mask of TASKS_START field. */ + +/* Register: WDT_EVENTS_TIMEOUT */ +/* Description: Watchdog timeout */ + +/* Bit 0 : */ +#define WDT_EVENTS_TIMEOUT_EVENTS_TIMEOUT_Pos (0UL) /*!< Position of EVENTS_TIMEOUT field. */ +#define WDT_EVENTS_TIMEOUT_EVENTS_TIMEOUT_Msk (0x1UL << WDT_EVENTS_TIMEOUT_EVENTS_TIMEOUT_Pos) /*!< Bit mask of EVENTS_TIMEOUT field. */ + /* Register: WDT_INTENSET */ /* Description: Enable interrupt */ -/* Bit 0 : Write '1' to Enable interrupt for TIMEOUT event */ +/* Bit 0 : Write '1' to enable interrupt for TIMEOUT event */ #define WDT_INTENSET_TIMEOUT_Pos (0UL) /*!< Position of TIMEOUT field. */ #define WDT_INTENSET_TIMEOUT_Msk (0x1UL << WDT_INTENSET_TIMEOUT_Pos) /*!< Bit mask of TIMEOUT field. */ #define WDT_INTENSET_TIMEOUT_Disabled (0UL) /*!< Read: Disabled */ @@ -14637,7 +16762,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: WDT_INTENCLR */ /* Description: Disable interrupt */ -/* Bit 0 : Write '1' to Disable interrupt for TIMEOUT event */ +/* Bit 0 : Write '1' to disable interrupt for TIMEOUT event */ #define WDT_INTENCLR_TIMEOUT_Pos (0UL) /*!< Position of TIMEOUT field. */ #define WDT_INTENCLR_TIMEOUT_Msk (0x1UL << WDT_INTENCLR_TIMEOUT_Pos) /*!< Bit mask of TIMEOUT field. */ #define WDT_INTENCLR_TIMEOUT_Disabled (0UL) /*!< Read: Disabled */ @@ -14778,7 +16903,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define WDT_CONFIG_SLEEP_Run (1UL) /*!< Keep the watchdog running while the CPU is sleeping */ /* Register: WDT_RR */ -/* Description: Description collection[0]: Reload request 0 */ +/* Description: Description collection[n]: Reload request n */ /* Bits 31..0 : Reload request register */ #define WDT_RR_RR_Pos (0UL) /*!< Position of RR field. */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52840_peripherals.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52840_peripherals.h similarity index 94% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52840_peripherals.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52840_peripherals.h index d2c0364ee8..5f18f58f9a 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52840_peripherals.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52840_peripherals.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. @@ -180,6 +180,16 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SPIM2_FEATURE_HARDWARE_CSN_PRESENT 0 #define SPIM3_FEATURE_HARDWARE_CSN_PRESENT 1 +#define SPIM0_FEATURE_DCX_PRESENT 0 +#define SPIM1_FEATURE_DCX_PRESENT 0 +#define SPIM2_FEATURE_DCX_PRESENT 0 +#define SPIM3_FEATURE_DCX_PRESENT 1 + +#define SPIM0_FEATURE_RXDELAY_PRESENT 0 +#define SPIM1_FEATURE_RXDELAY_PRESENT 0 +#define SPIM2_FEATURE_RXDELAY_PRESENT 0 +#define SPIM3_FEATURE_RXDELAY_PRESENT 1 + #define SPIM0_EASYDMA_MAXCNT_SIZE 16 #define SPIM1_EASYDMA_MAXCNT_SIZE 16 #define SPIM2_EASYDMA_MAXCNT_SIZE 16 @@ -232,6 +242,8 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define SAADC_EASYDMA_MAXCNT_SIZE 15 +#define SAADC_CH_NUM 8 + /* GPIO Tasks and Events */ #define GPIOTE_PRESENT #define GPIOTE_COUNT 1 diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52_bitfields.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52_bitfields.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52_bitfields.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52_bitfields.h index 5b542573d2..21753cc93a 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52_bitfields.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52_bitfields.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. @@ -1392,7 +1392,7 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define COMP_PSEL_PSEL_AnalogInput7 (7UL) /*!< AIN7 selected as analog input */ /* Register: COMP_REFSEL */ -/* Description: Reference source select */ +/* Description: Reference source select for single-ended mode */ /* Bits 2..0 : Reference select */ #define COMP_REFSEL_REFSEL_Pos (0UL) /*!< Position of REFSEL field. */ @@ -1406,11 +1406,17 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: COMP_EXTREFSEL */ /* Description: External reference select */ -/* Bit 0 : External analog reference select */ +/* Bits 2..0 : External analog reference select */ #define COMP_EXTREFSEL_EXTREFSEL_Pos (0UL) /*!< Position of EXTREFSEL field. */ -#define COMP_EXTREFSEL_EXTREFSEL_Msk (0x1UL << COMP_EXTREFSEL_EXTREFSEL_Pos) /*!< Bit mask of EXTREFSEL field. */ +#define COMP_EXTREFSEL_EXTREFSEL_Msk (0x7UL << COMP_EXTREFSEL_EXTREFSEL_Pos) /*!< Bit mask of EXTREFSEL field. */ #define COMP_EXTREFSEL_EXTREFSEL_AnalogReference0 (0UL) /*!< Use AIN0 as external analog reference */ #define COMP_EXTREFSEL_EXTREFSEL_AnalogReference1 (1UL) /*!< Use AIN1 as external analog reference */ +#define COMP_EXTREFSEL_EXTREFSEL_AnalogReference2 (2UL) /*!< Use AIN2 as external analog reference */ +#define COMP_EXTREFSEL_EXTREFSEL_AnalogReference3 (3UL) /*!< Use AIN3 as external analog reference */ +#define COMP_EXTREFSEL_EXTREFSEL_AnalogReference4 (4UL) /*!< Use AIN4 as external analog reference */ +#define COMP_EXTREFSEL_EXTREFSEL_AnalogReference5 (5UL) /*!< Use AIN5 as external analog reference */ +#define COMP_EXTREFSEL_EXTREFSEL_AnalogReference6 (6UL) /*!< Use AIN6 as external analog reference */ +#define COMP_EXTREFSEL_EXTREFSEL_AnalogReference7 (7UL) /*!< Use AIN7 as external analog reference */ /* Register: COMP_TH */ /* Description: Threshold configuration for hysteresis unit */ @@ -1426,18 +1432,18 @@ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Register: COMP_MODE */ /* Description: Mode configuration */ -/* Bit 8 : Main operation mode */ +/* Bit 8 : Main operation modes */ #define COMP_MODE_MAIN_Pos (8UL) /*!< Position of MAIN field. */ #define COMP_MODE_MAIN_Msk (0x1UL << COMP_MODE_MAIN_Pos) /*!< Bit mask of MAIN field. */ -#define COMP_MODE_MAIN_SE (0UL) /*!< Single ended mode */ +#define COMP_MODE_MAIN_SE (0UL) /*!< Single-ended mode */ #define COMP_MODE_MAIN_Diff (1UL) /*!< Differential mode */ -/* Bits 1..0 : Speed and power mode */ +/* Bits 1..0 : Speed and power modes */ #define COMP_MODE_SP_Pos (0UL) /*!< Position of SP field. */ #define COMP_MODE_SP_Msk (0x3UL << COMP_MODE_SP_Pos) /*!< Bit mask of SP field. */ -#define COMP_MODE_SP_Low (0UL) /*!< Low power mode */ +#define COMP_MODE_SP_Low (0UL) /*!< Low-power mode */ #define COMP_MODE_SP_Normal (1UL) /*!< Normal mode */ -#define COMP_MODE_SP_High (2UL) /*!< High speed mode */ +#define COMP_MODE_SP_High (2UL) /*!< High-speed mode */ /* Register: COMP_HYST */ /* Description: Comparator hysteresis enable */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52_name_change.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52_name_change.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52_name_change.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52_name_change.h index 92106dbf87..3d44efc155 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52_name_change.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52_name_change.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52_to_nrf52810.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52_to_nrf52810.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52_to_nrf52810.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52_to_nrf52810.h index a441496bdd..4a248df9d4 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52_to_nrf52810.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52_to_nrf52810.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52_to_nrf52840.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52_to_nrf52840.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52_to_nrf52840.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52_to_nrf52840.h index 03d13f1cb7..bb87d6fc5b 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/device/nrf52_to_nrf52840.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf52_to_nrf52840.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2010 - 2017, Nordic Semiconductor ASA +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA All rights reserved. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf_peripherals.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf_peripherals.h new file mode 100644 index 0000000000..3b98c5c00a --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/nrf_peripherals.h @@ -0,0 +1,72 @@ +/* + +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form, except as embedded into a Nordic + Semiconductor ASA integrated circuit in a product or a software update for + such product, must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of Nordic Semiconductor ASA nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +4. This software, with or without modification, must only be used with a + Nordic Semiconductor ASA integrated circuit. + +5. Any software provided in binary form under this license must not be reverse + engineered, decompiled, modified and/or disassembled. + +THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef NRF_PERIPHERALS_H__ +#define NRF_PERIPHERALS_H__ + +/*lint ++flb "Enter library region */ + +#if defined(_WIN32) + /* Do not include nrf specific files when building for PC host */ +#elif defined(__unix) + /* Do not include nrf specific files when building for PC host */ +#elif defined(__APPLE__) + /* Do not include nrf specific files when building for PC host */ +#else + + #if defined(NRF51) + #include "nrf51_peripherals.h" + + #elif defined(NRF52810_XXAA) + #include "nrf52810_peripherals.h" + #elif defined(NRF52832_XXAA) || defined(NRF52832_XXAB) + #include "nrf52832_peripherals.h" + #elif defined(NRF52840_XXAA) + #include "nrf52840_peripherals.h" + + #else + #error "Device must be defined. See nrf.h." + #endif +#endif + +/*lint --flb "Leave library region" */ + +#endif // NRF_PERIPHERALS_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/startup_config.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/startup_config.h new file mode 100644 index 0000000000..7dd3b42acd --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/startup_config.h @@ -0,0 +1,60 @@ +/* + +Copyright (c) 2010 - 2018, Nordic Semiconductor ASA + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form, except as embedded into a Nordic + Semiconductor ASA integrated circuit in a product or a software update for + such product, must reproduce the above copyright notice, this list of + conditions and the following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. Neither the name of Nordic Semiconductor ASA nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +4. This software, with or without modification, must only be used with a + Nordic Semiconductor ASA integrated circuit. + +5. Any software provided in binary form under this license must not be reverse + engineered, decompiled, modified and/or disassembled. + +THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +/* Configure stack size, stack alignement and heap size with a header file instead of project settings or modification of Nordic provided assembler files. Modify this file as needed. */ + +/* In order to make use this file, + 1. For Keil uVision IDE, in the Options for Target -> Asm tab, define symbol __STARTUP_CONFIG and use the additional assembler option --cpreproc in Misc Control text box. + 2. For GCC compiling, add extra assembly option -D__STARTUP_CONFIG. + 3. For IAR Embedded Workbench define symbol __STARTUP_CONFIG in the Assembler options and define symbol __STARTUP_CONFIG=1 in the linker options. +*/ + +/* This file is a template and should be copied to the project directory. */ + +/* Define size of stack. Size must be multiple of 4. */ +#define __STARTUP_CONFIG_STACK_SIZE 0x1000 + +/* Define alignement of stack. Alignment will be 2 to the power of __STARTUP_CONFIG_STACK_ALIGNEMENT. Since calling convention requires that the stack is aligned to 8-bytes when a function is called, the minimum __STARTUP_CONFIG_STACK_ALIGNEMENT is therefore 3. */ +#define __STARTUP_CONFIG_STACK_ALIGNEMENT 3 + +/* Define size of heap. Size must be multiple of 4. */ +#define __STARTUP_CONFIG_HEAP_SIZE 0x1000 + diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/system_nrf51.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/system_nrf51.h new file mode 100644 index 0000000000..3227cafc8c --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/system_nrf51.h @@ -0,0 +1,61 @@ +/* + +Copyright (c) 2009-2018 ARM Limited. All rights reserved. + + SPDX-License-Identifier: Apache-2.0 + +Licensed under the Apache License, Version 2.0 (the License); you may +not use this file except in compliance with the License. +You may obtain a copy of the License at + + www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an AS IS BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +NOTICE: This file has been modified by Nordic Semiconductor ASA. + +*/ + +#ifndef SYSTEM_NRF51_H +#define SYSTEM_NRF51_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + + +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System and update the SystemCoreClock variable. + */ +extern void SystemInit (void); + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +extern void SystemCoreClockUpdate (void); + +#ifdef __cplusplus +} +#endif + +#endif /* SYSTEM_NRF51_H */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/system_nrf52.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/system_nrf52.h new file mode 100644 index 0000000000..d05316c1d1 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/system_nrf52.h @@ -0,0 +1,61 @@ +/* + +Copyright (c) 2009-2018 ARM Limited. All rights reserved. + + SPDX-License-Identifier: Apache-2.0 + +Licensed under the Apache License, Version 2.0 (the License); you may +not use this file except in compliance with the License. +You may obtain a copy of the License at + + www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an AS IS BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +NOTICE: This file has been modified by Nordic Semiconductor ASA. + +*/ + +#ifndef SYSTEM_NRF52_H +#define SYSTEM_NRF52_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + + +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System and update the SystemCoreClock variable. + */ +extern void SystemInit (void); + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +extern void SystemCoreClockUpdate (void); + +#ifdef __cplusplus +} +#endif + +#endif /* SYSTEM_NRF52_H */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/system_nrf52810.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/system_nrf52810.h new file mode 100644 index 0000000000..e395ee996d --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/system_nrf52810.h @@ -0,0 +1,61 @@ +/* + +Copyright (c) 2009-2018 ARM Limited. All rights reserved. + + SPDX-License-Identifier: Apache-2.0 + +Licensed under the Apache License, Version 2.0 (the License); you may +not use this file except in compliance with the License. +You may obtain a copy of the License at + + www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an AS IS BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +NOTICE: This file has been modified by Nordic Semiconductor ASA. + +*/ + +#ifndef SYSTEM_NRF52810_H +#define SYSTEM_NRF52810_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + + +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System and update the SystemCoreClock variable. + */ +extern void SystemInit (void); + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +extern void SystemCoreClockUpdate (void); + +#ifdef __cplusplus +} +#endif + +#endif /* SYSTEM_NRF52810_H */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/system_nrf52840.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/system_nrf52840.h new file mode 100644 index 0000000000..28b3151bfb --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/mdk/system_nrf52840.h @@ -0,0 +1,61 @@ +/* + +Copyright (c) 2009-2018 ARM Limited. All rights reserved. + + SPDX-License-Identifier: Apache-2.0 + +Licensed under the Apache License, Version 2.0 (the License); you may +not use this file except in compliance with the License. +You may obtain a copy of the License at + + www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an AS IS BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +NOTICE: This file has been modified by Nordic Semiconductor ASA. + +*/ + +#ifndef SYSTEM_NRF52840_H +#define SYSTEM_NRF52840_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + + +extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */ + +/** + * Initialize the system + * + * @param none + * @return none + * + * @brief Setup the microcontroller system. + * Initialize the System and update the SystemCoreClock variable. + */ +extern void SystemInit (void); + +/** + * Update SystemCoreClock variable + * + * @param none + * @return none + * + * @brief Updates the SystemCoreClock with current core Clock + * retrieved from cpu registers. + */ +extern void SystemCoreClockUpdate (void); + +#ifdef __cplusplus +} +#endif + +#endif /* SYSTEM_NRF52840_H */ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/nrfx.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/nrfx.h new file mode 100644 index 0000000000..37e3c8de5b --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/nrfx.h @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_H__ +#define NRFX_H__ + +#include +#include +#include +#include + +#endif // NRFX_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_coredep.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_coredep.h new file mode 100644 index 0000000000..fddf052682 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_coredep.h @@ -0,0 +1,171 @@ +/** + * Copyright (c) 2018 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_COREDEP_H__ +#define NRFX_COREDEP_H__ + +/** + * @defgroup nrfx_coredep Core-dependent functionality + * @{ + * @ingroup nrfx + * @brief Module containing functions with core-dependent implementation, like delay. + */ + +#if defined(__NRFX_DOXYGEN__) + +/** @brief Core frequency (in MHz). */ +#define NRFX_DELAY_CPU_FREQ_MHZ +/** @brief Availability of DWT unit in the given SoC. */ +#define NRFX_DELAY_DWT_PRESENT + +#elif defined(NRF51) + #define NRFX_DELAY_CPU_FREQ_MHZ 16 + #define NRFX_DELAY_DWT_PRESENT 0 +#elif defined(NRF52810_XXAA) + #define NRFX_DELAY_CPU_FREQ_MHZ 64 + #define NRFX_DELAY_DWT_PRESENT 0 +#elif defined(NRF52832_XXAA) || defined (NRF52832_XXAB) + #define NRFX_DELAY_CPU_FREQ_MHZ 64 + #define NRFX_DELAY_DWT_PRESENT 1 +#elif defined(NRF52840_XXAA) + #define NRFX_DELAY_CPU_FREQ_MHZ 64 + #define NRFX_DELAY_DWT_PRESENT 1 +#else + #error "Unknown device." +#endif + +/** + * @brief Function for delaying execution for a number of microseconds. + * + * The value of @p time_us is multiplied by the frequency in MHz. Therefore, the delay is limited to + * maximum uint32_t capacity divided by frequency. For example: + * - For SoCs working at 64MHz: 0xFFFFFFFF/64 = 0x03FFFFFF (67108863 microseconds) + * - For SoCs working at 16MHz: 0xFFFFFFFF/16 = 0x0FFFFFFF (268435455 microseconds) + * + * @param time_us Number of microseconds to wait. + */ +__STATIC_INLINE void nrfx_coredep_delay_us(uint32_t time_us); + +/** @} */ + +#ifndef SUPPRESS_INLINE_IMPLEMENTATION + +#if NRFX_CHECK(NRFX_DELAY_DWT_BASED) + +#if !NRFX_DELAY_DWT_PRESENT +#error "DWT unit not present in the SoC that is used." +#endif + +__STATIC_INLINE void nrfx_coredep_delay_us(uint32_t time_us) +{ + if (time_us == 0) + { + return; + } + uint32_t time_cycles = time_us * NRFX_DELAY_CPU_FREQ_MHZ; + + // Save the current state of the DEMCR register to be able to restore it before exiting + // this function. Enable the trace and debug blocks (DWT is one of them). + uint32_t core_debug = CoreDebug->DEMCR; + CoreDebug->DEMCR = core_debug | CoreDebug_DEMCR_TRCENA_Msk; + + // Save the current state of the CTRL register in DWT block. Make sure + // that cycle counter is enabled. + uint32_t dwt_ctrl = DWT->CTRL; + DWT->CTRL = dwt_ctrl | DWT_CTRL_CYCCNTENA_Msk; + + // Store start value of cycle counter. + uint32_t cyccnt_initial = DWT->CYCCNT; + + // Delay required time. + while ((DWT->CYCCNT - cyccnt_initial) < time_cycles) + {} + + // Restore preserved registers. + DWT->CTRL = dwt_ctrl; + CoreDebug->DEMCR = core_debug; +} +#else // NRFX_CHECK(NRFX_DELAY_DWT_BASED) + + +__STATIC_INLINE void nrfx_coredep_delay_us(uint32_t time_us) +{ + if (time_us == 0) + { + return; + } + + #if defined(NRF51) + // The loop takes 4 cycles: 1 for SUBS and 3 for BHI. + static const uint16_t delay_bytecode[] = { + 0x3804, // SUBS r0, #4 + 0xd8fd, // BHI .-2 + 0x4770 // BX LR + }; + #elif defined(NRF52810_XXAA) + // The loop takes 7 cycles: 1 for SUBS and 2 for BHI and 2 for flash wait states. + static const uint16_t delay_bytecode[] = { + 0x3807, // SUBS r0, #7 + 0xd8fd, // BHI .-2 + 0x4770 // BX LR + }; + #elif defined(NRF52832_XXAA) || defined (NRF52832_XXAB) || defined(NRF52840_XXAA) + // The loop takes 3 cycles: 1 for SUBS and 2 for BHI. + // Make sure that code will be cached properly, so that no extra wait states appear. + __ALIGN(16) + static const uint16_t delay_bytecode[] = { + 0x3803, // SUBS r0, #3 + 0xd8fd, // BHI .-2 + 0x4770 // BX LR + }; + #endif + + typedef void (* delay_func_t)(uint32_t); + // Set LSB to 1 to execute code in Thumb mode. + const delay_func_t delay_cycles = (delay_func_t)((((uint32_t)delay_bytecode) | 1)); + uint32_t cycles = time_us * NRFX_DELAY_CPU_FREQ_MHZ; + delay_cycles(cycles); +} + +#endif // !NRFX_CHECK(NRFX_DELAY_DWT_BASED_DELAY) + +#endif // SUPPRESS_INLINE_IMPLEMENTATION + +#endif // NRFX_COREDEP_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_irqs.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_irqs.h new file mode 100644 index 0000000000..60fd4a25c5 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_irqs.h @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_IRQS_H__ +#define NRFX_IRQS_H__ + +#if defined(NRF51) + #include +#elif defined(NRF52810_XXAA) + #include +#elif defined(NRF52832_XXAA) || defined (NRF52832_XXAB) + #include +#elif defined(NRF52840_XXAA) + #include +#else + #error "Unknown device." +#endif + +#endif // NRFX_IRQS_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_irqs_nrf51.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_irqs_nrf51.h new file mode 100644 index 0000000000..0a204533e3 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_irqs_nrf51.h @@ -0,0 +1,136 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_IRQS_NRF51_H__ +#define NRFX_IRQS_NRF51_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +// POWER_CLOCK_IRQn +#define nrfx_power_clock_irq_handler POWER_CLOCK_IRQHandler + +// RADIO_IRQn + +// UART0_IRQn +#define nrfx_uart_0_irq_handler UART0_IRQHandler + +// SPI0_TWI0_IRQn +#if NRFX_CHECK(NRFX_PRS_ENABLED) && NRFX_CHECK(NRFX_PRS_BOX_0_ENABLED) +#define nrfx_prs_box_0_irq_handler SPI0_TWI0_IRQHandler +#else +#define nrfx_spi_0_irq_handler SPI0_TWI0_IRQHandler +#define nrfx_twi_0_irq_handler SPI0_TWI0_IRQHandler +#endif + +// SPI1_TWI1_IRQn +#if NRFX_CHECK(NRFX_PRS_ENABLED) && NRFX_CHECK(NRFX_PRS_BOX_1_ENABLED) +#define nrfx_prs_box_1_irq_handler SPI1_TWI1_IRQHandler +#else +#define nrfx_spi_1_irq_handler SPI1_TWI1_IRQHandler +#define nrfx_spis_1_irq_handler SPI1_TWI1_IRQHandler +#define nrfx_twi_1_irq_handler SPI1_TWI1_IRQHandler +#endif + +// GPIOTE_IRQn +#define nrfx_gpiote_irq_handler GPIOTE_IRQHandler + +// ADC_IRQn +#define nrfx_adc_irq_handler ADC_IRQHandler + +// TIMER0_IRQn +#define nrfx_timer_0_irq_handler TIMER0_IRQHandler + +// TIMER1_IRQn +#define nrfx_timer_1_irq_handler TIMER1_IRQHandler + +// TIMER2_IRQn +#define nrfx_timer_2_irq_handler TIMER2_IRQHandler + +// RTC0_IRQn +#define nrfx_rtc_0_irq_handler RTC0_IRQHandler + +// TEMP_IRQn + +// RNG_IRQn +#define nrfx_rng_irq_handler RNG_IRQHandler + +// ECB_IRQn + +// CCM_AAR_IRQn + +// WDT_IRQn +#define nrfx_wdt_irq_handler WDT_IRQHandler + +// RTC1_IRQn +#define nrfx_rtc_1_irq_handler RTC1_IRQHandler + +// QDEC_IRQn +#define nrfx_qdec_irq_handler QDEC_IRQHandler + +// LPCOMP_IRQn +#define nrfx_lpcomp_irq_handler LPCOMP_IRQHandler + +// SWI0_IRQn +#define nrfx_swi_0_irq_handler SWI0_IRQHandler + +// SWI1_IRQn +#define nrfx_swi_1_irq_handler SWI1_IRQHandler + +// SWI2_IRQn +#define nrfx_swi_2_irq_handler SWI2_IRQHandler + +// SWI3_IRQn +#define nrfx_swi_3_irq_handler SWI3_IRQHandler + +// SWI4_IRQn +#define nrfx_swi_4_irq_handler SWI4_IRQHandler + +// SWI5_IRQn +#define nrfx_swi_5_irq_handler SWI5_IRQHandler + + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_IRQS_NRF51_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_irqs_nrf52810.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_irqs_nrf52810.h new file mode 100644 index 0000000000..7934854b7e --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_irqs_nrf52810.h @@ -0,0 +1,141 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_IRQS_NRF52832_H__ +#define NRFX_IRQS_NRF52832_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +// POWER_CLOCK_IRQn +#define nrfx_power_clock_irq_handler POWER_CLOCK_IRQHandler + +// RADIO_IRQn + +// UARTE0_IRQn +#define nrfx_uarte_0_irq_handler UARTE0_IRQHandler + +// TWIM0_TWIS0_IRQn +#if NRFX_CHECK(NRFX_PRS_BOX_0_ENABLED) +#define nrfx_prs_box_0_irq_handler TWIM0_TWIS0_IRQHandler +#else +#define nrfx_twim_0_irq_handler TWIM0_TWIS0_IRQHandler +#define nrfx_twis_0_irq_handler TWIM0_TWIS0_IRQHandler +#endif + +// SPIM1_SPIS1_IRQn +#if NRFX_CHECK(NRFX_PRS_BOX_1_ENABLED) +#define nrfx_prs_box_1_irq_handler SPIM1_SPIS1_IRQHandler +#else +#define nrfx_spim_1_irq_handler SPIM1_SPIS1_IRQHandler +#define nrfx_spis_1_irq_handler SPIM1_SPIS1_IRQHandler +#endif + +// GPIOTE_IRQn +#define nrfx_gpiote_irq_handler GPIOTE_IRQHandler + +// SAADC_IRQn +#define nrfx_saadc_irq_handler SAADC_IRQHandler + +// TIMER0_IRQn +#define nrfx_timer_0_irq_handler TIMER0_IRQHandler + +// TIMER1_IRQn +#define nrfx_timer_1_irq_handler TIMER1_IRQHandler + +// TIMER2_IRQn +#define nrfx_timer_2_irq_handler TIMER2_IRQHandler + +// RTC0_IRQn +#define nrfx_rtc_0_irq_handler RTC0_IRQHandler + +// TEMP_IRQn + +// RNG_IRQn +#define nrfx_rng_irq_handler RNG_IRQHandler + +// ECB_IRQn + +// CCM_AAR_IRQn + +// WDT_IRQn +#define nrfx_wdt_irq_handler WDT_IRQHandler + +// RTC1_IRQn +#define nrfx_rtc_1_irq_handler RTC1_IRQHandler + +// QDEC_IRQn +#define nrfx_qdec_irq_handler QDEC_IRQHandler + +// COMP_IRQn +#define nrfx_comp_irq_handler COMP_IRQHandler + +// SWI0_EGU0_IRQn +#define nrfx_swi_0_irq_handler SWI0_EGU0_IRQHandler + +// SWI1_EGU1_IRQn +#define nrfx_swi_1_irq_handler SWI1_EGU1_IRQHandler + +// SWI2_IRQn +#define nrfx_swi_2_irq_handler SWI2_IRQHandler + +// SWI3_IRQn +#define nrfx_swi_3_irq_handler SWI3_IRQHandler + +// SWI4_IRQn +#define nrfx_swi_4_irq_handler SWI4_IRQHandler + +// SWI5_IRQn +#define nrfx_swi_5_irq_handler SWI5_IRQHandler + +// PWM0_IRQn +#define nrfx_pwm_0_irq_handler PWM0_IRQHandler + +// PDM_IRQn +#define nrfx_pdm_irq_handler PDM_IRQHandler + + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_IRQS_NRF52832_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_irqs_nrf52832.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_irqs_nrf52832.h new file mode 100644 index 0000000000..b947bdc2bf --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_irqs_nrf52832.h @@ -0,0 +1,192 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_IRQS_NRF52832_H__ +#define NRFX_IRQS_NRF52832_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +// POWER_CLOCK_IRQn +#define nrfx_power_clock_irq_handler POWER_CLOCK_IRQHandler + +// RADIO_IRQn + +// UARTE0_UART0_IRQn +#if NRFX_CHECK(NRFX_PRS_ENABLED) && NRFX_CHECK(NRFX_PRS_BOX_4_ENABLED) +#define nrfx_prs_box_4_irq_handler UARTE0_UART0_IRQHandler +#else +#define nrfx_uarte_0_irq_handler UARTE0_UART0_IRQHandler +#define nrfx_uart_0_irq_handler UARTE0_UART0_IRQHandler +#endif + +// SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn +#if NRFX_CHECK(NRFX_PRS_ENABLED) && NRFX_CHECK(NRFX_PRS_BOX_0_ENABLED) +#define nrfx_prs_box_0_irq_handler SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler +#else +#define nrfx_spim_0_irq_handler SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler +#define nrfx_spis_0_irq_handler SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler +#define nrfx_twim_0_irq_handler SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler +#define nrfx_twis_0_irq_handler SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler +#define nrfx_spi_0_irq_handler SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler +#define nrfx_twi_0_irq_handler SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler +#endif + +// SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQn +#if NRFX_CHECK(NRFX_PRS_ENABLED) && NRFX_CHECK(NRFX_PRS_BOX_1_ENABLED) +#define nrfx_prs_box_1_irq_handler SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler +#else +#define nrfx_spim_1_irq_handler SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler +#define nrfx_spis_1_irq_handler SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler +#define nrfx_twim_1_irq_handler SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler +#define nrfx_twis_1_irq_handler SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler +#define nrfx_spi_1_irq_handler SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler +#define nrfx_twi_1_irq_handler SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler +#endif + +// NFCT_IRQn + +// GPIOTE_IRQn +#define nrfx_gpiote_irq_handler GPIOTE_IRQHandler + +// SAADC_IRQn +#define nrfx_saadc_irq_handler SAADC_IRQHandler + +// TIMER0_IRQn +#define nrfx_timer_0_irq_handler TIMER0_IRQHandler + +// TIMER1_IRQn +#define nrfx_timer_1_irq_handler TIMER1_IRQHandler + +// TIMER2_IRQn +#define nrfx_timer_2_irq_handler TIMER2_IRQHandler + +// RTC0_IRQn +#define nrfx_rtc_0_irq_handler RTC0_IRQHandler + +// TEMP_IRQn + +// RNG_IRQn +#define nrfx_rng_irq_handler RNG_IRQHandler + +// ECB_IRQn + +// CCM_AAR_IRQn + +// WDT_IRQn +#define nrfx_wdt_irq_handler WDT_IRQHandler + +// RTC1_IRQn +#define nrfx_rtc_1_irq_handler RTC1_IRQHandler + +// QDEC_IRQn +#define nrfx_qdec_irq_handler QDEC_IRQHandler + +// COMP_LPCOMP_IRQn +#if NRFX_CHECK(NRFX_PRS_ENABLED) && NRFX_CHECK(NRFX_PRS_BOX_3_ENABLED) +#define nrfx_prs_box_3_irq_handler COMP_LPCOMP_IRQHandler +#else +#define nrfx_comp_irq_handler COMP_LPCOMP_IRQHandler +#define nrfx_lpcomp_irq_handler COMP_LPCOMP_IRQHandler +#endif + +// SWI0_EGU0_IRQn +#define nrfx_swi_0_irq_handler SWI0_EGU0_IRQHandler + +// SWI1_EGU1_IRQn +#define nrfx_swi_1_irq_handler SWI1_EGU1_IRQHandler + +// SWI2_EGU2_IRQn +#define nrfx_swi_2_irq_handler SWI2_EGU2_IRQHandler + +// SWI3_EGU3_IRQn +#define nrfx_swi_3_irq_handler SWI3_EGU3_IRQHandler + +// SWI4_EGU4_IRQn +#define nrfx_swi_4_irq_handler SWI4_EGU4_IRQHandler + +// SWI5_EGU5_IRQn +#define nrfx_swi_5_irq_handler SWI5_EGU5_IRQHandler + +// TIMER3_IRQn +#define nrfx_timer_3_irq_handler TIMER3_IRQHandler + +// TIMER4_IRQn +#define nrfx_timer_4_irq_handler TIMER4_IRQHandler + +// PWM0_IRQn +#define nrfx_pwm_0_irq_handler PWM0_IRQHandler + +// PDM_IRQn +#define nrfx_pdm_irq_handler PDM_IRQHandler + +// MWU_IRQn + +// PWM1_IRQn +#define nrfx_pwm_1_irq_handler PWM1_IRQHandler + +// PWM2_IRQn +#define nrfx_pwm_2_irq_handler PWM2_IRQHandler + +// SPIM2_SPIS2_SPI2_IRQn +#if NRFX_CHECK(NRFX_PRS_ENABLED) && NRFX_CHECK(NRFX_PRS_BOX_2_ENABLED) +#define nrfx_prs_box_2_irq_handler SPIM2_SPIS2_SPI2_IRQHandler +#else +#define nrfx_spim_2_irq_handler SPIM2_SPIS2_SPI2_IRQHandler +#define nrfx_spis_2_irq_handler SPIM2_SPIS2_SPI2_IRQHandler +#define nrfx_spi_2_irq_handler SPIM2_SPIS2_SPI2_IRQHandler +#endif + +// RTC2_IRQn +#define nrfx_rtc_2_irq_handler RTC2_IRQHandler + +// I2S_IRQn +#define nrfx_i2s_irq_handler I2S_IRQHandler + +// FPU_IRQn + + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_IRQS_NRF52832_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_irqs_nrf52840.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_irqs_nrf52840.h new file mode 100644 index 0000000000..ecb7e1dc34 --- /dev/null +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/nrfx/soc/nrfx_irqs_nrf52840.h @@ -0,0 +1,208 @@ +/** + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form, except as embedded into a Nordic + * Semiconductor ASA integrated circuit in a product or a software update for + * such product, must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of Nordic Semiconductor ASA nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * 4. This software, with or without modification, must only be used with a + * Nordic Semiconductor ASA integrated circuit. + * + * 5. Any software provided in binary form under this license must not be reverse + * engineered, decompiled, modified and/or disassembled. + * + * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef NRFX_IRQS_NRF52840_H__ +#define NRFX_IRQS_NRF52840_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +// POWER_CLOCK_IRQn +#define nrfx_power_clock_irq_handler POWER_CLOCK_IRQHandler + +// RADIO_IRQn + +// UARTE0_UART0_IRQn +#if NRFX_CHECK(NRFX_PRS_ENABLED) && NRFX_CHECK(NRFX_PRS_BOX_4_ENABLED) +#define nrfx_prs_box_4_irq_handler UARTE0_UART0_IRQHandler +#else +#define nrfx_uarte_0_irq_handler UARTE0_UART0_IRQHandler +#define nrfx_uart_0_irq_handler UARTE0_UART0_IRQHandler +#endif + +// SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn +#if NRFX_CHECK(NRFX_PRS_ENABLED) && NRFX_CHECK(NRFX_PRS_BOX_0_ENABLED) +#define nrfx_prs_box_0_irq_handler SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler +#else +#define nrfx_spim_0_irq_handler SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler +#define nrfx_spis_0_irq_handler SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler +#define nrfx_twim_0_irq_handler SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler +#define nrfx_twis_0_irq_handler SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler +#define nrfx_spi_0_irq_handler SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler +#define nrfx_twi_0_irq_handler SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler +#endif + +// SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQn +#if NRFX_CHECK(NRFX_PRS_ENABLED) && NRFX_CHECK(NRFX_PRS_BOX_1_ENABLED) +#define nrfx_prs_box_1_irq_handler SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler +#else +#define nrfx_spim_1_irq_handler SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler +#define nrfx_spis_1_irq_handler SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler +#define nrfx_twim_1_irq_handler SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler +#define nrfx_twis_1_irq_handler SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler +#define nrfx_spi_1_irq_handler SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler +#define nrfx_twi_1_irq_handler SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler +#endif + +// NFCT_IRQn + +// GPIOTE_IRQn +#define nrfx_gpiote_irq_handler GPIOTE_IRQHandler + +// SAADC_IRQn +#define nrfx_saadc_irq_handler SAADC_IRQHandler + +// TIMER0_IRQn +#define nrfx_timer_0_irq_handler TIMER0_IRQHandler + +// TIMER1_IRQn +#define nrfx_timer_1_irq_handler TIMER1_IRQHandler + +// TIMER2_IRQn +#define nrfx_timer_2_irq_handler TIMER2_IRQHandler + +// RTC0_IRQn +#define nrfx_rtc_0_irq_handler RTC0_IRQHandler + +// TEMP_IRQn + +// RNG_IRQn +#define nrfx_rng_irq_handler RNG_IRQHandler + +// ECB_IRQn + +// CCM_AAR_IRQn + +// WDT_IRQn +#define nrfx_wdt_irq_handler WDT_IRQHandler + +// RTC1_IRQn +#define nrfx_rtc_1_irq_handler RTC1_IRQHandler + +// QDEC_IRQn +#define nrfx_qdec_irq_handler QDEC_IRQHandler + +// COMP_LPCOMP_IRQn +#if NRFX_CHECK(NRFX_PRS_ENABLED) && NRFX_CHECK(NRFX_PRS_BOX_3_ENABLED) +#define nrfx_prs_box_3_irq_handler COMP_LPCOMP_IRQHandler +#else +#define nrfx_comp_irq_handler COMP_LPCOMP_IRQHandler +#define nrfx_lpcomp_irq_handler COMP_LPCOMP_IRQHandler +#endif + +// SWI0_EGU0_IRQn +#define nrfx_swi_0_irq_handler SWI0_EGU0_IRQHandler + +// SWI1_EGU1_IRQn +#define nrfx_swi_1_irq_handler SWI1_EGU1_IRQHandler + +// SWI2_EGU2_IRQn +#define nrfx_swi_2_irq_handler SWI2_EGU2_IRQHandler + +// SWI3_EGU3_IRQn +#define nrfx_swi_3_irq_handler SWI3_EGU3_IRQHandler + +// SWI4_EGU4_IRQn +#define nrfx_swi_4_irq_handler SWI4_EGU4_IRQHandler + +// SWI5_EGU5_IRQn +#define nrfx_swi_5_irq_handler SWI5_EGU5_IRQHandler + +// TIMER3_IRQn +#define nrfx_timer_3_irq_handler TIMER3_IRQHandler + +// TIMER4_IRQn +#define nrfx_timer_4_irq_handler TIMER4_IRQHandler + +// PWM0_IRQn +#define nrfx_pwm_0_irq_handler PWM0_IRQHandler + +// PDM_IRQn +#define nrfx_pdm_irq_handler PDM_IRQHandler + +// MWU_IRQn + +// PWM1_IRQn +#define nrfx_pwm_1_irq_handler PWM1_IRQHandler + +// PWM2_IRQn +#define nrfx_pwm_2_irq_handler PWM2_IRQHandler + +// SPIM2_SPIS2_SPI2_IRQn +#if NRFX_CHECK(NRFX_PRS_ENABLED) && NRFX_CHECK(NRFX_PRS_BOX_2_ENABLED) +#define nrfx_prs_box_2_irq_handler SPIM2_SPIS2_SPI2_IRQHandler +#else +#define nrfx_spim_2_irq_handler SPIM2_SPIS2_SPI2_IRQHandler +#define nrfx_spis_2_irq_handler SPIM2_SPIS2_SPI2_IRQHandler +#define nrfx_spi_2_irq_handler SPIM2_SPIS2_SPI2_IRQHandler +#endif + +// RTC2_IRQn +#define nrfx_rtc_2_irq_handler RTC2_IRQHandler + +// I2S_IRQn +#define nrfx_i2s_irq_handler I2S_IRQHandler + +// FPU_IRQn + +// USBD_IRQn + +// UARTE1_IRQn +#define nrfx_uarte_1_irq_handler UARTE1_IRQHandler + +// QSPI_IRQn +#define nrfx_qspi_irq_handler QSPI_IRQHandler + +// CRYPTOCELL_IRQn + +// PWM3_IRQn +#define nrfx_pwm_3_irq_handler PWM3_IRQHandler + +// SPIM3_IRQn +#define nrfx_spim_3_irq_handler SPIM3_IRQHandler + + +#ifdef __cplusplus +} +#endif + +#endif // NRFX_IRQS_NRF52840_H__ diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh.c similarity index 88% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh.c index ae7ebb3e39..39a861f8e0 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -63,12 +63,20 @@ #include "nrf_log.h" NRF_LOG_MODULE_REGISTER(); + +// Validate configuration options. + #if (NRF_SDH_DISPATCH_MODEL == NRF_SDH_DISPATCH_MODEL_APPSH) - #if !APP_SCHEDULER_ENABLED - #error "APP_SCHEDULER is required." + #if (!APP_SCHEDULER_ENABLED) + #error app_scheduler is required when NRF_SDH_DISPATCH_MODEL is set to NRF_SDH_DISPATCH_MODEL_APPSH #endif #include "app_scheduler.h" -#endif // (NRF_SDH_DISPATCH_MODEL == NRF_SDH_DISPATCH_MODEL_APPSH) +#endif + +#if ( (NRF_SDH_CLOCK_LF_SRC == NRF_CLOCK_LF_SRC_RC) \ + && (NRF_SDH_CLOCK_LF_ACCURACY != NRF_CLOCK_LF_ACCURACY_500_PPM)) + #warning Please select NRF_CLOCK_LF_ACCURACY_500_PPM when using NRF_CLOCK_LF_SRC_RC +#endif // Create section "sdh_req_observers". @@ -173,10 +181,9 @@ static void softdevice_evt_irq_disable(void) #ifndef S140 static void swi_interrupt_priority_workaround(void) { - // The priorities of SoftDevice SWI SD_EVT_IRQn and RADIO_NOTIFICATION_IRQn - // in version S132 v5.0.0, S112 v5.0.0, S212 v5.0.0 and S332 v5.0.0 are set to 6. - // Set their priority to APP_IRQ_PRIORITY_LOWEST (7) so that they don't preempt - // peripheral interrupts and vice-versa. + // The priority of SoftDevice SWI SD_EVT_IRQn and RADIO_NOTIFICATION_IRQn in + // S132 v5.0.0, S112 v5.0.0, S212 v5.0.0 and S332 v5.0.0 is set to 6. + // Change it to APP_IRQ_PRIORITY_LOWEST (7) so that they do not preempt peripherals' interrupts. #ifdef SOFTDEVICE_PRESENT ret_code_t ret_code; @@ -216,28 +223,26 @@ ret_code_t nrf_sdh_enable_request(void) nrf_clock_lf_cfg_t const clock_lf_cfg = { - .source = NRF_SDH_CLOCK_LF_SRC, - .rc_ctiv = NRF_SDH_CLOCK_LF_RC_CTIV, - .rc_temp_ctiv = NRF_SDH_CLOCK_LF_RC_TEMP_CTIV, - #ifdef S140 - .xtal_accuracy = NRF_SDH_CLOCK_LF_XTAL_ACCURACY - #else - .accuracy = NRF_SDH_CLOCK_LF_XTAL_ACCURACY - #endif + .source = NRF_SDH_CLOCK_LF_SRC, + .rc_ctiv = NRF_SDH_CLOCK_LF_RC_CTIV, + .rc_temp_ctiv = NRF_SDH_CLOCK_LF_RC_TEMP_CTIV, + .accuracy = NRF_SDH_CLOCK_LF_ACCURACY }; - #ifdef ANT_LICENSE_KEY - ret_code = sd_softdevice_enable(&clock_lf_cfg, app_error_fault_handler, ANT_LICENSE_KEY); - #else - ret_code = sd_softdevice_enable(&clock_lf_cfg, app_error_fault_handler); - #endif + CRITICAL_REGION_ENTER(); +#ifdef ANT_LICENSE_KEY + ret_code = sd_softdevice_enable(&clock_lf_cfg, app_error_fault_handler, ANT_LICENSE_KEY); +#else + ret_code = sd_softdevice_enable(&clock_lf_cfg, app_error_fault_handler); +#endif + m_nrf_sdh_enabled = (ret_code == NRF_SUCCESS); + CRITICAL_REGION_EXIT(); if (ret_code != NRF_SUCCESS) { return ret_code; } - m_nrf_sdh_enabled = true; m_nrf_sdh_continue = false; m_nrf_sdh_suspended = false; @@ -279,13 +284,16 @@ ret_code_t nrf_sdh_disable_request(void) // Notify observers about starting SoftDevice disable process. sdh_state_observer_notify(NRF_SDH_EVT_STATE_DISABLE_PREPARE); - ret_code = sd_softdevice_disable(); + CRITICAL_REGION_ENTER(); + ret_code = sd_softdevice_disable(); + m_nrf_sdh_enabled = false; + CRITICAL_REGION_EXIT(); + if (ret_code != NRF_SUCCESS) { return ret_code; } - m_nrf_sdh_enabled = false; m_nrf_sdh_continue = false; softdevice_evt_irq_disable(); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh.h index 2fbd0dd638..a63e4cb7b3 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -49,6 +49,7 @@ #ifndef NRF_SDH_H__ #define NRF_SDH_H__ +#include #include "sdk_config.h" #include "sdk_errors.h" #include "nrf_section_iter.h" diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_ant.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_ant.c similarity index 91% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_ant.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_ant.c index 1aa6a19609..27d1ed5ec6 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_ant.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_ant.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -45,6 +45,7 @@ #include "nrf_sdh.h" #include "app_error.h" +#include "nrf_strerror.h" #include "ant_interface.h" @@ -70,6 +71,9 @@ NRF_SECTION_SET_DEF(sdh_ant_observers, nrf_sdh_ant_evt_observer_t, NRF_SDH_ANT_O __ALIGN(4) static uint8_t m_ant_stack_buffer[NRF_SDH_ANT_BUF_SIZE]; +static bool m_stack_is_enabled; + + ret_code_t nrf_sdh_ant_enable(void) { ANT_ENABLE ant_enable_cfg = @@ -82,6 +86,15 @@ ret_code_t nrf_sdh_ant_enable(void) }; ret_code_t ret_code = sd_ant_enable(&ant_enable_cfg); + if (ret_code == NRF_SUCCESS) + { + m_stack_is_enabled = true; + } + else + { + NRF_LOG_ERROR("sd_ant_enable() returned %s.", nrf_strerror_get(ret_code)); + } + return ret_code; } @@ -92,9 +105,18 @@ ret_code_t nrf_sdh_ant_enable(void) */ static void nrf_sdh_ant_evts_poll(void * p_context) { + UNUSED_VARIABLE(p_context); + ret_code_t ret_code; - UNUSED_VARIABLE(p_context); +#ifndef SER_CONNECTIVITY + if (!m_stack_is_enabled) + { + return; + } +#else + UNUSED_VARIABLE(m_stack_is_enabled); +#endif // SER_CONNECTIVITY while (true) { diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_ant.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_ant.h similarity index 99% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_ant.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_ant.h index da3bd7d6b6..10811d49a5 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_ant.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_ant.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_ble.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_ble.c similarity index 89% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_ble.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_ble.c index 4ebf46e551..bf036bda80 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_ble.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_ble.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -84,6 +84,9 @@ NRF_SECTION_SET_DEF(sdh_ble_observers, nrf_sdh_ble_evt_observer_t, NRF_SDH_BLE_O #define APP_RAM_START (uint32_t)m_ram_start +static bool m_stack_is_enabled; + + ret_code_t nrf_sdh_ble_app_ram_start_get(uint32_t * p_app_ram_start) { if (p_app_ram_start == NULL) @@ -136,8 +139,8 @@ ret_code_t nrf_sdh_ble_default_cfg_set(uint8_t conn_cfg_tag, uint32_t * p_ram_st ble_cfg.gap_cfg.role_count_cfg.periph_role_count = NRF_SDH_BLE_PERIPHERAL_LINK_COUNT; #ifndef S112 ble_cfg.gap_cfg.role_count_cfg.central_role_count = NRF_SDH_BLE_CENTRAL_LINK_COUNT; - ble_cfg.gap_cfg.role_count_cfg.central_sec_count = NRF_SDH_BLE_CENTRAL_LINK_COUNT ? - BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT : 0; + ble_cfg.gap_cfg.role_count_cfg.central_sec_count = MIN(NRF_SDH_BLE_CENTRAL_LINK_COUNT, + BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT); #endif ret_code = sd_ble_cfg_set(BLE_GAP_CFG_ROLE_COUNT, &ble_cfg, *p_ram_start); @@ -159,7 +162,7 @@ ret_code_t nrf_sdh_ble_default_cfg_set(uint8_t conn_cfg_tag, uint32_t * p_ram_st NRF_LOG_ERROR("sd_ble_cfg_set() returned %s when attempting to set BLE_CONN_CFG_GATT.", nrf_strerror_get(ret_code)); } -#endif +#endif // NRF_SDH_BLE_GATT_MAX_MTU_SIZE != 23 #endif // NRF_SDH_BLE_TOTAL_LINK_COUNT != 0 // Configure number of custom UUIDS. @@ -220,19 +223,33 @@ ret_code_t nrf_sdh_ble_enable(uint32_t * const p_app_ram_start) // Start of RAM, obtained from linker symbol. uint32_t const app_ram_start_link = *p_app_ram_start; - NRF_LOG_DEBUG("RAM starts at 0x%x", app_ram_start_link); - ret_code_t ret_code = sd_ble_enable(p_app_ram_start); - if (*p_app_ram_start != app_ram_start_link) + if (*p_app_ram_start > app_ram_start_link) { - NRF_LOG_WARNING("RAM starts at 0x%x, can be adjusted to 0x%x.", - app_ram_start_link, *p_app_ram_start); + NRF_LOG_WARNING("Insufficient RAM allocated for the SoftDevice."); - NRF_LOG_WARNING("RAM size can be adjusted to 0x%x.", + NRF_LOG_WARNING("Change the RAM start location from 0x%x to 0x%x.", + app_ram_start_link, *p_app_ram_start); + NRF_LOG_WARNING("Maximum RAM size for application is 0x%x.", ram_end_address_get() - (*p_app_ram_start)); } + else + { + NRF_LOG_DEBUG("RAM starts at 0x%x", app_ram_start_link); + if (*p_app_ram_start != app_ram_start_link) + { + NRF_LOG_DEBUG("RAM start location can be adjusted to 0x%x.", *p_app_ram_start); - if (ret_code != NRF_SUCCESS) + NRF_LOG_DEBUG("RAM size for application can be adjusted to 0x%x.", + ram_end_address_get() - (*p_app_ram_start)); + } + } + + if (ret_code == NRF_SUCCESS) + { + m_stack_is_enabled = true; + } + else { NRF_LOG_ERROR("sd_ble_enable() returned %s.", nrf_strerror_get(ret_code)); } @@ -247,13 +264,20 @@ ret_code_t nrf_sdh_ble_enable(uint32_t * const p_app_ram_start) */ static void nrf_sdh_ble_evts_poll(void * p_context) { + UNUSED_VARIABLE(p_context); + ret_code_t ret_code; - UNUSED_VARIABLE(p_context); + if (!m_stack_is_enabled) + { + return; + } while (true) { + /*lint -save -e(587) */ __ALIGN(4) uint8_t evt_buffer[NRF_SDH_BLE_EVT_BUF_SIZE]; + /*lint -restore */ ble_evt_t * p_ble_evt; uint16_t evt_len = (uint16_t)sizeof(evt_buffer); diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_ble.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_ble.h similarity index 97% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_ble.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_ble.h index 844fd960c7..3693367f2f 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_ble.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_ble.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -63,11 +63,8 @@ extern "C" { #endif /** @brief Size of the buffer for a BLE event. */ -#if (defined(NRF_SD_BLE_API_VERSION) && (NRF_SD_BLE_API_VERSION < 3)) -#define NRF_SDH_BLE_EVT_BUF_SIZE (sizeof(ble_evt_t) + (NRF_SDH_BLE_GATT_MAX_MTU_SIZE)) -#else #define NRF_SDH_BLE_EVT_BUF_SIZE BLE_EVT_LEN_MAX(NRF_SDH_BLE_GATT_MAX_MTU_SIZE) -#endif + #if !(defined(__LINT__)) /**@brief Macro for registering @ref nrf_sdh_soc_evt_observer_t. Modules that want to be diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_soc.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_soc.c similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_soc.c rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_soc.c index cf037022ca..496e731274 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_soc.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_soc.c @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_soc.h b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_soc.h similarity index 98% rename from targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_soc.h rename to targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_soc.h index 42eb541ac0..295ce09366 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/TARGET_SOFTDEVICE_COMMON/softdevice/common/nrf_sdh_soc.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_15_0/modules/softdevice/common/nrf_sdh_soc.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2017 - 2017, Nordic Semiconductor ASA + * Copyright (c) 2017 - 2018, Nordic Semiconductor ASA * * All rights reserved. * @@ -50,7 +50,7 @@ #ifndef NRF_SDH_SOC_H__ #define NRF_SDH_SOC_H__ -#include "app_util.h" +#include "sdk_common.h" #include "nrf_section_iter.h" #include "nrf_soc.h" diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/qspi_api.c b/targets/TARGET_NORDIC/TARGET_NRF5x/qspi_api.c index 2cf6847859..4b784afdba 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/qspi_api.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/qspi_api.c @@ -40,9 +40,9 @@ #if DEVICE_QSPI -#include "nrf_drv_common.h" -#include "nrf_drv_qspi.h" +#include #include "PeripheralPins.h" +#include "nrfx_qspi.h" /* TODO @@ -80,7 +80,7 @@ TODO #define SFDP_READ_LEN 8 // 8 SFDP bytes can be read at a time #define SFDP_READ_MAX (SFDP_DATA_LEN / SFDP_READ_LEN) -static nrf_drv_qspi_config_t config; +static nrfx_qspi_config_t config; // Private helper function to track initialization static ret_code_t _qspi_drv_init(void); @@ -195,8 +195,8 @@ qspi_status_t qspi_prepare_command(qspi_t *obj, const qspi_command_t *command, b //Configure QSPI with new command format ret_code_t ret_status = _qspi_drv_init(); - if (ret_status != NRF_SUCCESS ) { - if (ret_status == NRF_ERROR_INVALID_PARAM) { + if (ret_status != NRFX_SUCCESS ) { + if (ret_status == NRFX_ERROR_INVALID_PARAM) { return QSPI_STATUS_INVALID_PARAMETER; } else { return QSPI_STATUS_ERROR; @@ -252,7 +252,7 @@ qspi_status_t qspi_frequency(qspi_t *obj, int hz) // use sync version, no handler ret_code_t ret = _qspi_drv_init(); - if (ret == NRF_SUCCESS ) { + if (ret == NRFX_SUCCESS ) { return QSPI_STATUS_OK; } else if (ret == NRF_ERROR_INVALID_PARAM) { return QSPI_STATUS_INVALID_PARAMETER; @@ -268,16 +268,16 @@ qspi_status_t qspi_write(qspi_t *obj, const qspi_command_t *command, const void (command->address.value & WORD_MASK) > 0) { return QSPI_STATUS_INVALID_PARAMETER; } - + qspi_status_t status = qspi_prepare_command(obj, command, true); if (status != QSPI_STATUS_OK) { return status; } if (is_word_aligned(data) && - nrf_drv_is_in_RAM(data)) { + nrfx_is_in_ram(data)) { // write here does not return how much it transfered, we return transfered all - ret_code_t ret = nrf_drv_qspi_write(data, *length, command->address.value); + ret_code_t ret = nrfx_qspi_write(data, *length, command->address.value); if (ret == NRF_SUCCESS ) { return QSPI_STATUS_OK; } else { @@ -285,7 +285,7 @@ qspi_status_t qspi_write(qspi_t *obj, const qspi_command_t *command, const void } } else { - // if the data buffer is not WORD/4-byte aligned or in RAM, use an aligned buffer on the stack + // if the data buffer is not WORD/4-byte aligned, use an aligned buffer on the stack uint32_t aligned_buffer[WORD_COUNT]; uint32_t pos = 0; size_t bytes_to_write = *length; @@ -296,11 +296,10 @@ qspi_status_t qspi_write(qspi_t *obj, const qspi_command_t *command, const void memcpy(aligned_buffer, &((const uint8_t *)data)[pos], diff); // write one buffer over QSPI - ret_code_t ret = nrf_drv_qspi_write(aligned_buffer, diff, command->address.value+pos); + ret_code_t ret = nrfx_qspi_write(aligned_buffer, diff, command->address.value+pos); if (ret != NRF_SUCCESS ) { return QSPI_STATUS_ERROR; } - pos += diff; bytes_to_write -= diff; } @@ -328,8 +327,8 @@ qspi_status_t qspi_read(qspi_t *obj, const qspi_command_t *command, void *data, } if (is_word_aligned(data) && - nrf_drv_is_in_RAM(data)) { - ret_code_t ret = nrf_drv_qspi_read(data, *length, command->address.value); + nrfx_is_in_ram(data)) { + ret_code_t ret = nrfx_qspi_read(data, *length, command->address.value); if (ret == NRF_SUCCESS ) { return QSPI_STATUS_OK; } else { @@ -347,7 +346,7 @@ qspi_status_t qspi_read(qspi_t *obj, const qspi_command_t *command, void *data, size_t diff = bytes_to_read <= sizeof(aligned_buffer) ? bytes_to_read : sizeof(aligned_buffer); // read one buffer over QSPI - ret_code_t ret = nrf_drv_qspi_read(aligned_buffer, diff, command->address.value+pos); + ret_code_t ret = nrfx_qspi_read(aligned_buffer, diff, command->address.value+pos); if (ret != NRF_SUCCESS ) { return QSPI_STATUS_ERROR; } @@ -399,7 +398,7 @@ qspi_status_t qspi_command_transfer(qspi_t *obj, const qspi_command_t *command, return QSPI_STATUS_ERROR; } - ret_code = nrf_drv_qspi_cinstr_xfer(&qspi_cinstr_config, data, data); + ret_code = nrfx_qspi_cinstr_xfer(&qspi_cinstr_config, data, data); if (ret_code != NRF_SUCCESS) { return QSPI_STATUS_ERROR; } @@ -422,9 +421,9 @@ static ret_code_t _qspi_drv_init(void) if(_initialized) { //NRF implementation prevents calling init again. But we need to call init again to program the new command settings in the IFCONFIG registers. //So, we have to uninit qspi first and call init again. - nrf_drv_qspi_uninit(); + nrfx_qspi_uninit(); } - ret = nrf_drv_qspi_init(&config, NULL , NULL); + ret = nrfx_qspi_init(&config, NULL , NULL); if( ret == NRF_SUCCESS ) _initialized = true; return ret; @@ -503,7 +502,7 @@ qspi_status_t sfdp_read(qspi_t *obj, const qspi_command_t *command, void *data, qspi_cinstr_config.lfstop = true; } - ret_code = nrf_drv_qspi_cinstr_xfer(&qspi_cinstr_config, sfdp_data, sfdp_data); + ret_code = nrfx_qspi_cinstr_xfer(&qspi_cinstr_config, sfdp_data, sfdp_data); if (ret_code != NRF_SUCCESS) { return QSPI_STATUS_ERROR; } @@ -521,7 +520,7 @@ qspi_status_t sfdp_read(qspi_t *obj, const qspi_command_t *command, void *data, qspi_cinstr_config.lfstop = false; qspi_cinstr_config.length = NRF_QSPI_CINSTR_LEN_5B; - ret_code = nrf_drv_qspi_cinstr_xfer(&qspi_cinstr_config, sfdp_cmd, sfdp_cmd); + ret_code = nrfx_qspi_cinstr_xfer(&qspi_cinstr_config, sfdp_cmd, sfdp_cmd); if (ret_code != NRF_SUCCESS) { return QSPI_STATUS_ERROR; } @@ -537,7 +536,7 @@ qspi_status_t sfdp_read(qspi_t *obj, const qspi_command_t *command, void *data, qspi_cinstr_config.lfstop = true; } - ret_code = nrf_drv_qspi_cinstr_xfer(&qspi_cinstr_config, sfdp_data, sfdp_data); + ret_code = nrfx_qspi_cinstr_xfer(&qspi_cinstr_config, sfdp_data, sfdp_data); if (ret_code != NRF_SUCCESS) { return QSPI_STATUS_ERROR; } diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/rtc_api.c b/targets/TARGET_NORDIC/TARGET_NRF5x/rtc_api.c index cc4d0f118f..104eebb13b 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/rtc_api.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/rtc_api.c @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2013 Nordic Semiconductor ASA * All rights reserved. * @@ -21,7 +21,7 @@ * Nordic Semiconductor ASA integrated circuit. * * 5. Any software provided in binary or object form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. + * engineered, decompiled, modified and/or disassembled. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED @@ -41,7 +41,7 @@ #if DEVICE_RTC #include "common_rtc.h" -#include "nrf_drv_clock.h" +#include "nrf_rtc.h" #include "app_util_platform.h" static time_t m_time_base; diff --git a/targets/targets.json b/targets/targets.json index d6a30da7b2..8a525f8fd4 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -7114,7 +7114,7 @@ "NORDIC", "NRF5x", "NRF52", - "SDK_14_2", + "SDK_15_0", "NORDIC_SOFTDEVICE", "SOFTDEVICE_COMMON", "SOFTDEVICE_S132_FULL" @@ -7241,7 +7241,7 @@ "NORDIC", "NRF5x", "NRF52", - "SDK_14_2", + "SDK_15_0", "NORDIC_SOFTDEVICE", "SOFTDEVICE_COMMON", "SOFTDEVICE_S140_FULL" @@ -7285,6 +7285,7 @@ "detect_code": ["0465"], "features_remove": ["CRYPTOCELL310"], "macros_remove": ["MBEDTLS_CONFIG_HW_SUPPORT"], + "macros_add": ["NRFX_RNG_ENABLED=1", "RNG_ENABLED=1", "NRF_QUEUE_ENABLED=1"], "overrides": { "lf_clock_src": "NRF_LF_SRC_RC" }